LyoKICogRnVuY3Rpb25zIHRvIGFjY2VzcyB0aGUgVFNDMjAwMCBjb250cm9sbGVyIG9uIFRSQUIgYm9hcmQgKHVzZWQgZm9yIHNjYW5uaW5nCiAqIHRoZXJtbyBzZW5zb3JzKQogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDMgTWFydGluIEtyYXVzZSwgVFEtU3lzdGVtcyBHbWJILCBtYXJ0aW4ua3JhdXNlQHRxcy5kZQogKgogKiBDb3B5cmlnaHQgKEMpIDIwMDIgREVOWCBTb2Z0d2FyZSBFbmdpbmVlcmluZywgV29sZmdhbmcgRGVuaywgd2RAZGVueC5kZQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGFzbS9hcmNoL3MzYzI0eDBfY3B1Lmg+CiNpbmNsdWRlIDxhc20vaW8uaD4KI2luY2x1ZGUgPGRpdjY0Lmg+CiNpbmNsdWRlICJ0c2MyMDAwLmgiCgojaW5jbHVkZSAiUHQxMDAwX3RlbXBfZGF0YS5oIgoKLyogaGVscGVyIGZ1bmN0aW9uICovCiNkZWZpbmUgYWJzKHZhbHVlKSAoKCh2YWx1ZSkgPCAwKSA/ICgodmFsdWUpKi0xKSA6ICh2YWx1ZSkpCgovKgogKiBNYXhpbWFsIGFsbG93ZWQgZGV2aWF0aW9uIGJldHdlZW4gdHdvIGltbWVkaWF0ZSBtZWFzc3VybWVudHMgb2YgYW4gYW5hbG9nCiAqIHRoZXJtbyBjaGFubmVsLiAxIERJR0lUID0gMC4wMjc2ILBDLiBUaGlzIGlzIHVzZWQgdG8gZmlsdGVyIHNwb3JhZGljCiAqICJqdW1wcyIgaW4gbWVhc3VybWVudC4KICovCiNkZWZpbmUgTUFYX0RFVklBVElPTgkxOAkvKiB1bml0OiBESUdJVHMgb2YgYWRjOyAxOCBESUdJVCA9IDAuNSCwQyAqLwoKdm9pZCB0c2MyMDAwX3NwaV9pbml0KHZvaWQpCnsKCXN0cnVjdCBzM2MyNHgwX2dwaW8gKiBjb25zdCBncGlvID0gczNjMjR4MF9nZXRfYmFzZV9ncGlvKCk7CglzdHJ1Y3QgczNjMjR4MF9zcGkgKiBjb25zdCBzcGkgPSBzM2MyNHgwX2dldF9iYXNlX3NwaSgpOwoJaW50IGk7CgoJLyogQ29uZmlndXJlIEkvTyBwb3J0cy4gKi8KCWdwaW8tPlBEQ09OID0gKGdwaW8tPlBEQ09OICYgMHhGM0ZGRkYpIHwgMHgwNDAwMDA7CglncGlvLT5QR0NPTiA9IChncGlvLT5QR0NPTiAmIDB4MEYzRkZGKSB8IDB4MDA4MDAwOwoJZ3Bpby0+UEdDT04gPSAoZ3Bpby0+UEdDT04gJiAweDBDRkZGRikgfCAweDAyMDAwMDsKCWdwaW8tPlBHQ09OID0gKGdwaW8tPlBHQ09OICYgMHgwM0ZGRkYpIHwgMHgwODAwMDA7CgoJQ0xSX0NTX1RPVUNIKCk7CgoJc3BpLT5jaFswXS5TUFBSRSA9IDB4MUY7IC8qIEJhdWQtcmF0ZSBjYS4gNTE0a0h6ICovCglzcGktPmNoWzBdLlNQUElOID0gMHgwMTsgLyogU1BJLU1PU0kgaG9sZHMgTGV2ZWwgYWZ0ZXIgbGFzdCBiaXQgKi8KCXNwaS0+Y2hbMF0uU1BDT04gPSAweDFBOyAvKiBQb2xsaW5nLCBQcmVzY2FsZXIsIE1hc3RlciwgQ1BPTD0wLAoJCQkJICAgIENQSEE9MSAqLwoKCS8qIER1bW15IGJ5dGUgZW5zdXJlcyBjbG9jayB0byBiZSBsb3cuICovCglmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykgewoJCXNwaS0+Y2hbMF0uU1BUREFUID0gMHhGRjsKCX0KCXNwaV93YWl0X3RyYW5zbWl0X2RvbmUoKTsKfQoKCnZvaWQgc3BpX3dhaXRfdHJhbnNtaXRfZG9uZSh2b2lkKQp7CglzdHJ1Y3QgczNjMjR4MF9zcGkgKiBjb25zdCBzcGkgPSBzM2MyNHgwX2dldF9iYXNlX3NwaSgpOwoKCXdoaWxlICghKHNwaS0+Y2hbMF0uU1BTVEEgJiAweDAxKSk7IC8qIHdhaXQgdW50aWwgdHJhbnNmZXIgaXMgZG9uZSAqLwp9CgoKdm9pZCB0c2MyMDAwX3dyaXRlKHVuc2lnbmVkIHNob3J0IHJlZywgdW5zaWduZWQgc2hvcnQgZGF0YSkKewoJc3RydWN0IHMzYzI0eDBfc3BpICogY29uc3Qgc3BpID0gczNjMjR4MF9nZXRfYmFzZV9zcGkoKTsKCXVuc2lnbmVkIGludCBjb21tYW5kOwoKCVNFVF9DU19UT1VDSCgpOwoJY29tbWFuZCA9IHJlZzsKCXNwaS0+Y2hbMF0uU1BUREFUID0gKGNvbW1hbmQgJiAweEZGMDApID4+IDg7CglzcGlfd2FpdF90cmFuc21pdF9kb25lKCk7CglzcGktPmNoWzBdLlNQVERBVCA9IChjb21tYW5kICYgMHgwMEZGKTsKCXNwaV93YWl0X3RyYW5zbWl0X2RvbmUoKTsKCXNwaS0+Y2hbMF0uU1BUREFUID0gKGRhdGEgJiAweEZGMDApID4+IDg7CglzcGlfd2FpdF90cmFuc21pdF9kb25lKCk7CglzcGktPmNoWzBdLlNQVERBVCA9IChkYXRhICYgMHgwMEZGKTsKCXNwaV93YWl0X3RyYW5zbWl0X2RvbmUoKTsKCglDTFJfQ1NfVE9VQ0goKTsKfQoKCnVuc2lnbmVkIHNob3J0IHRzYzIwMDBfcmVhZCAodW5zaWduZWQgc2hvcnQgcmVnKQp7Cgl1bnNpZ25lZCBzaG9ydCBjb21tYW5kLCBkYXRhOwoJc3RydWN0IHMzYzI0eDBfc3BpICogY29uc3Qgc3BpID0gczNjMjR4MF9nZXRfYmFzZV9zcGkoKTsKCglTRVRfQ1NfVE9VQ0goKTsKCWNvbW1hbmQgPSAweDgwMDAgfCByZWc7CgoJc3BpLT5jaFswXS5TUFREQVQgPSAoY29tbWFuZCAmIDB4RkYwMCkgPj4gODsKCXNwaV93YWl0X3RyYW5zbWl0X2RvbmUoKTsKCXNwaS0+Y2hbMF0uU1BUREFUID0gKGNvbW1hbmQgJiAweDAwRkYpOwoJc3BpX3dhaXRfdHJhbnNtaXRfZG9uZSgpOwoKCXNwaS0+Y2hbMF0uU1BUREFUID0gMHhGRjsKCXNwaV93YWl0X3RyYW5zbWl0X2RvbmUoKTsKCWRhdGEgPSBzcGktPmNoWzBdLlNQUkRBVDsKCXNwaS0+Y2hbMF0uU1BUREFUID0gMHhGRjsKCXNwaV93YWl0X3RyYW5zbWl0X2RvbmUoKTsKCglDTFJfQ1NfVE9VQ0goKTsKCXJldHVybiAoc3BpLT5jaFswXS5TUFJEQVQgJiAweDBGRikgfCAoZGF0YSA8PCA4KTsKfQoKCnZvaWQgdHNjMjAwMF9zZXRfbXV4ICh1bnNpZ25lZCBpbnQgY2hhbm5lbCkKewoJc3RydWN0IHMzYzI0eDBfZ3BpbyAqIGNvbnN0IGdwaW8gPSBzM2MyNHgwX2dldF9iYXNlX2dwaW8oKTsKCglDTFJfTVVYMV9FTkFCTEU7IENMUl9NVVgyX0VOQUJMRTsKCUNMUl9NVVgzX0VOQUJMRTsgQ0xSX01VWDRfRU5BQkxFOwoJc3dpdGNoIChjaGFubmVsKSB7CgljYXNlIDA6CgkJQ0xSX01VWDA7IENMUl9NVVgxOwoJCVNFVF9NVVgxX0VOQUJMRTsKCQlicmVhazsKCWNhc2UgMToKCQlTRVRfTVVYMDsgQ0xSX01VWDE7CgkJU0VUX01VWDFfRU5BQkxFOwoJCWJyZWFrOwoJY2FzZSAyOgoJCUNMUl9NVVgwOyBTRVRfTVVYMTsKCQlTRVRfTVVYMV9FTkFCTEU7CgkJYnJlYWs7CgljYXNlIDM6CgkJU0VUX01VWDA7IFNFVF9NVVgxOwoJCVNFVF9NVVgxX0VOQUJMRTsKCQlicmVhazsKCWNhc2UgNDoKCQlDTFJfTVVYMDsgQ0xSX01VWDE7CgkJU0VUX01VWDJfRU5BQkxFOwoJCWJyZWFrOwoJY2FzZSA1OgoJCVNFVF9NVVgwOyBDTFJfTVVYMTsKCQlTRVRfTVVYMl9FTkFCTEU7CgkJYnJlYWs7CgljYXNlIDY6CgkJQ0xSX01VWDA7IFNFVF9NVVgxOwoJCVNFVF9NVVgyX0VOQUJMRTsKCQlicmVhazsKCWNhc2UgNzoKCQlTRVRfTVVYMDsgU0VUX01VWDE7CgkJU0VUX01VWDJfRU5BQkxFOwoJCWJyZWFrOwoJY2FzZSA4OgoJCUNMUl9NVVgwOyBDTFJfTVVYMTsKCQlTRVRfTVVYM19FTkFCTEU7CgkJYnJlYWs7CgljYXNlIDk6CgkJU0VUX01VWDA7IENMUl9NVVgxOwoJCVNFVF9NVVgzX0VOQUJMRTsKCQlicmVhazsKCWNhc2UgMTA6CgkJQ0xSX01VWDA7IFNFVF9NVVgxOwoJCVNFVF9NVVgzX0VOQUJMRTsKCQlicmVhazsKCWNhc2UgMTE6CgkJU0VUX01VWDA7IFNFVF9NVVgxOwoJCVNFVF9NVVgzX0VOQUJMRTsKCQlicmVhazsKCWNhc2UgMTI6CgkJQ0xSX01VWDA7IENMUl9NVVgxOwoJCVNFVF9NVVg0X0VOQUJMRTsKCQlicmVhazsKCWNhc2UgMTM6CgkJU0VUX01VWDA7IENMUl9NVVgxOwoJCVNFVF9NVVg0X0VOQUJMRTsKCQlicmVhazsKCWNhc2UgMTQ6CgkJQ0xSX01VWDA7IFNFVF9NVVgxOwoJCVNFVF9NVVg0X0VOQUJMRTsKCQlicmVhazsKCWNhc2UgMTU6CgkJU0VUX01VWDA7IFNFVF9NVVgxOwoJCVNFVF9NVVg0X0VOQUJMRTsKCQlicmVhazsKCWRlZmF1bHQ6CgkJQ0xSX01VWDA7IENMUl9NVVgxOwoJfQp9CgoKdm9pZCB0c2MyMDAwX3NldF9yYW5nZSAodW5zaWduZWQgaW50IHJhbmdlKQp7CglzdHJ1Y3QgczNjMjR4MF9ncGlvICogY29uc3QgZ3BpbyA9IHMzYzI0eDBfZ2V0X2Jhc2VfZ3BpbygpOwoKCXN3aXRjaCAocmFuZ2UpIHsKCWNhc2UgMToKCQlDTFJfU0VMX1RFTVBfVl8wOyBTRVRfU0VMX1RFTVBfVl8xOwoJCUNMUl9TRUxfVEVNUF9WXzI7IENMUl9TRUxfVEVNUF9WXzM7CgkJYnJlYWs7CgljYXNlIDI6CgkJQ0xSX1NFTF9URU1QX1ZfMDsgQ0xSX1NFTF9URU1QX1ZfMTsKCQlDTFJfU0VMX1RFTVBfVl8yOyBTRVRfU0VMX1RFTVBfVl8zOwoJCWJyZWFrOwoJY2FzZSAzOgoJCVNFVF9TRUxfVEVNUF9WXzA7IENMUl9TRUxfVEVNUF9WXzE7CgkJU0VUX1NFTF9URU1QX1ZfMjsgQ0xSX1NFTF9URU1QX1ZfMzsKCQlicmVhazsKCX0KfQoKCnUxNiB0c2MyMDAwX3JlYWRfY2hhbm5lbCAodW5zaWduZWQgaW50IGNoYW5uZWwpCnsKCXUxNiByZXM7CgoJdHNjMjAwMF9zZXRfbXV4KGNoYW5uZWwpOwoJdWRlbGF5KDIwICogVFNDMjAwMF9ERUxBWV9CQVNFKTsKCgl0c2MyMDAwX3dyaXRlKFRTQzIwMDBfUkVHX0FEQywgMHgyMDM2KTsKCWFkY193YWl0X2NvbnZlcnNpb25fZG9uZSAoKTsKCXJlcyA9IHRzYzIwMDBfcmVhZChUU0MyMDAwX1JFR19BVVgxKTsKCXJldHVybiByZXM7Cn0KCgpzMzIgdHNjMjAwMF9jb250YWN0X3RlbXAgKHZvaWQpCnsKCWxvbmcgYWRjX3B0MTAwMCwgb2Zmc2V0OwoJbG9uZyB1X3B0MTAwMDsKCWxvbmcgY29udGFjdF90ZW1wOwoJbG9uZyB0ZW1wMSwgdGVtcDI7CgoJdHNjMjAwMF9yZWdfaW5pdCAoKTsKCXRzYzIwMDBfc2V0X3JhbmdlICgzKTsKCgkvKgoJICogQmVjYXVzZSBvZiBzcG9yYWRpYyAianVtcHMiIGluIHRoZSBtZWFzdXJlZCBhZGMgdmFsdWVzIGV2ZXJ5CgkgKiBjaGFubmVsIGlzIHJlYWQgdHdvIHRpbWVzLiBJZiB0aGVyZSBpcyBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UKCSAqIGJldHdlZW4gdGhlIHR3byBtZWFzdXJlbWVudHMsIHRoZW4gcHJpbnQgYW4gZXJyb3IgYW5kIGRvIGEgdGhpcmQKCSAqIG1lYXN1cmVtZW50LCBiZWNhdXNlIGl0IGlzIHZlcnkgdW5saWtlbHkgdGhhdCBhIHN1Y2Nlc3NpdmUgdGhpcmQKCSAqIG1lYXN1cmVtZW50IGdvZXMgYWxzbyB3cm9uZy4KCSAqLwoJdGVtcDEgPSB0c2MyMDAwX3JlYWRfY2hhbm5lbCAoMTQpOwoJdGVtcDIgPSB0c2MyMDAwX3JlYWRfY2hhbm5lbCAoMTQpOwoJaWYgKGFicyh0ZW1wMiAtIHRlbXAxKSA8IE1BWF9ERVZJQVRJT04pCgkJYWRjX3B0MTAwMCA9IHRlbXAyOwoJZWxzZSB7CgkJcHJpbnRmICgiJXM6IHJlYWQgYWRjIHZhbHVlIChjaGFubmVsIDE0KSBleGNlZWRlZCBtYXggYWxsb3dlZCAiCgkJCSJkZXZpYXRpb246ICVkICogMC4wMjc2ILBDXG4iLAoJCQlfX0ZVTkNUSU9OX18sIE1BWF9ERVZJQVRJT04pOwoJCXByaW50ZiAoImFkYyB2YWx1ZSAxOiAlbGQgRElHSVRzXG5hZGMgdmFsdWUgMjogJWxkIERJR0lUc1xuIiwKCQkJdGVtcDEsIHRlbXAyKTsKCQlhZGNfcHQxMDAwID0gdHNjMjAwMF9yZWFkX2NoYW5uZWwgKDE0KTsKCQlwcmludGYgKCJ1c2UgKHRoaXJkIHJlYWQpIGFkYyB2YWx1ZTogYWRjX3B0MTAwMCA9ICIKCQkJIiVsZCBESUdJVHNcbiIsCWFkY19wdDEwMDApOwoJfQoJZGVidWcgKCJyZWFkIGNoYW5uZWwgMTQgKHB0MTAwMCBhZGMgdmFsdWUpOiAlbGRcbiIsIGFkY19wdDEwMDApOwoKCXRlbXAxID0gdHNjMjAwMF9yZWFkX2NoYW5uZWwgKDE1KTsKCXRlbXAyID0gdHNjMjAwMF9yZWFkX2NoYW5uZWwgKDE1KTsKCWlmIChhYnModGVtcDIgLSB0ZW1wMSkgPCBNQVhfREVWSUFUSU9OKQoJCW9mZnNldCA9IHRlbXAyOwoJZWxzZSB7CgkJcHJpbnRmICgiJXM6IHJlYWQgYWRjIHZhbHVlIChjaGFubmVsIDE1KSBleGNlZWRlZCBtYXggYWxsb3dlZCAiCgkJCSJkZXZpYXRpb246ICVkICogMC4wMjc2ILBDXG4iLAoJCQlfX0ZVTkNUSU9OX18sIE1BWF9ERVZJQVRJT04pOwoJCXByaW50ZiAoImFkYyB2YWx1ZSAxOiAlbGQgRElHSVRzXG5hZGMgdmFsdWUgMjogJWxkIERJR0lUc1xuIiwKCQkJdGVtcDEsIHRlbXAyKTsKCQlvZmZzZXQgPSB0c2MyMDAwX3JlYWRfY2hhbm5lbCAoMTUpOwoJCXByaW50ZiAoInVzZSAodGhpcmQgcmVhZCkgYWRjIHZhbHVlOiBvZmZzZXQgPSAlbGQgRElHSVRzXG4iLAoJCQlvZmZzZXQpOwoJfQoJZGVidWcgKCJyZWFkIGNoYW5uZWwgMTUgKG9mZnNldCk6ICVsZFxuIiwgb2Zmc2V0KTsKCgkvKgoJICogRm9ybXVsYSBmb3IgY2FsY3VsYXRpbmcgdm9sdGFnZSBkcm9wIG9uIFBUMTAwMCByZXNpc3RvcjogdV9wdDEwMDAgPQoJICogeF9yYW5nZTMgKiAoYWRjX3JhdyAtIG9mZnNldCkgLyAxMC4gRm9ybXVsYSB0byBjYWxjdWxhdGUgeF9yYW5nZTM6CgkgKiB4X3JhbmdlMyA9ICgyNTAwICogKDEwMDAwMDAgKyBlcnJfdnJlZiArIGVycl9hbXAzKSkgLyAoNDA5NSo2KS4gVGhlCgkgKiBlcnJvciBjb3JyZWN0aW9uIFZhbHVlcyBlcnJfdnJlZiBhbmQgZXJyX2FtcDMgYXJlIGFzc3VtZWQgYXMgMCBpbgoJICogdS1ib290LCBiZWNhdXNlIHRoaXMgY291bGQgY2F1c2Ugb25seSBhIHZlcnkgc21hbGwgZXJyb3IgKDwgMSUpLgoJICovCgl1X3B0MTAwMCA9ICgxMDE3NTAgKiAoYWRjX3B0MTAwMCAtIG9mZnNldCkpIC8gMTA7CglkZWJ1ZyAoInVfcHQxMDAwOiAlbGRcbiIsIHVfcHQxMDAwKTsKCglpZiAodHNjMjAwMF9pbnRlcnBvbGF0ZSh1X3B0MTAwMCwgUHQxMDAwX3RlbXBfdGFibGUsCgkJCQkmY29udGFjdF90ZW1wKSA9PSAtMSkgewoJCXByaW50ZiAoIiVzOiBlcnJvciBpbnRlcnBvbGF0aW5nIFBUMTAwMCB2bGF1ZVxuIiwKCQkJIF9fRlVOQ1RJT05fXyk7CgkJcmV0dXJuICgtMTAwMCk7Cgl9CglkZWJ1ZyAoImNvbnRhY3RfdGVtcDogJWxkXG4iLCBjb250YWN0X3RlbXApOwoKCXJldHVybiBjb250YWN0X3RlbXA7Cn0KCgp2b2lkIHRzYzIwMDBfcmVnX2luaXQgKHZvaWQpCnsKCXN0cnVjdCBzM2MyNHgwX2dwaW8gKiBjb25zdCBncGlvID0gczNjMjR4MF9nZXRfYmFzZV9ncGlvKCk7CgoJdHNjMjAwMF93cml0ZShUU0MyMDAwX1JFR19BREMsIDB4MjAzNik7Cgl0c2MyMDAwX3dyaXRlKFRTQzIwMDBfUkVHX1JFRiwgMHgwMDExKTsKCXRzYzIwMDBfd3JpdGUoVFNDMjAwMF9SRUdfREFDQ1RMLCAweDAwMDApOwoKCUNPTl9NVVgwOwoJQ09OX01VWDE7CgoJQ09OX01VWDFfRU5BQkxFOwoJQ09OX01VWDJfRU5BQkxFOwoJQ09OX01VWDNfRU5BQkxFOwoJQ09OX01VWDRfRU5BQkxFOwoKCUNPTl9TRUxfVEVNUF9WXzA7CglDT05fU0VMX1RFTVBfVl8xOwoJQ09OX1NFTF9URU1QX1ZfMjsKCUNPTl9TRUxfVEVNUF9WXzM7CgoJdHNjMjAwMF9zZXRfbXV4KDApOwoJdHNjMjAwMF9zZXRfcmFuZ2UoMCk7Cn0KCgppbnQgdHNjMjAwMF9pbnRlcnBvbGF0ZShsb25nIHZhbHVlLCBsb25nIGRhdGFbXVsyXSwgbG9uZyAqcmVzdWx0KQp7CglpbnQgaTsKCXVuc2lnbmVkIGxvbmcgbG9uZyB2YWw7CgoJLyogdGhlIGRhdGEgaXMgc29ydGVkIGFuZCB0aGUgZmlyc3QgZWxlbWVudCBpcyB1cHBlcgoJICogbGltaXQgc28gd2UgY2FuIGVhc2lseSBjaGVjayBmb3Igb3V0LW9mLWJhbmQgdmFsdWVzCgkgKi8KCWlmIChkYXRhWzBdWzBdIDwgdmFsdWUgfHwgZGF0YVsxXVswXSA+IHZhbHVlKQoJCXJldHVybiAtMTsKCglpID0gMTsKCXdoaWxlIChkYXRhW2ldWzBdIDwgdmFsdWUpCgkJaSsrOwoKCS8qIFRvIHByZXZlbnQgb3ZlcmZsb3cgd2UgaGF2ZSB0byBzdG9yZSB0aGUgaW50ZXJtZWRpYXRlCgkgICByZXN1bHQgaW4gJ2xvbmcgbG9uZycuCgkqLwoKCXZhbCA9ICgodW5zaWduZWQgbG9uZyBsb25nKShkYXRhW2ldWzFdIC0gZGF0YVtpLTFdWzFdKQoJCSAgICogKHVuc2lnbmVkIGxvbmcgbG9uZykodmFsdWUgLSBkYXRhW2ktMV1bMF0pKTsKCWRvX2Rpdih2YWwsIChkYXRhW2ldWzBdIC0gZGF0YVtpLTFdWzBdKSk7CgkqcmVzdWx0ID0gZGF0YVtpLTFdWzFdICsgdmFsOwoKCXJldHVybiAwOwp9CgoKdm9pZCBhZGNfd2FpdF9jb252ZXJzaW9uX2RvbmUodm9pZCkKewoJd2hpbGUgKCEodHNjMjAwMF9yZWFkKFRTQzIwMDBfUkVHX0FEQykgJiAoMSA8PCAxNCkpKTsKfQo=