I2lmZGVmIEFMTE1VTFRJCiNlcnJvciBtdWx0aWNhc3Qgc3VwcG9ydCBpcyBub3QgeWV0IGltcGxlbWVudGVkCiNlbmRpZgogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogc21jOTAwMC5jCiAqIFRoaXMgaXMgYSBFdGhlcmJvb3QgZHJpdmVyIGZvciBTTUMncyA5MDAwIHNlcmllcyBvZiBFdGhlcm5ldCBjYXJkcy4KICoKICogQ29weXJpZ2h0IChDKSAxOTk4IERhbmllbCBFbmdzdHL2bSA8ZGFuaWVsLmVuZ3N0cm9tQHJpa3NuZXR0Lm5vPgogKiBCYXNlZCBvbiB0aGUgTGludXggU01DOTAwMCBkcml2ZXIsIHNtYzkxOTQuYyBieSBFcmljIFN0YWhsbWFuCiAqIENvcHlyaWdodCAoQykgMTk5NiBieSBFcmlrIFN0YWhsbWFuIDxlcmljQHZ0LmVkdT4KICoKICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcwogKiBvZiB0aGUgR05VIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KICoKICogIkZlYXR1cmVzIiBvZiB0aGUgU01DIGNoaXA6CiAqICAgNDYwOCBieXRlIHBhY2tldCBtZW1vcnkuICggZm9yIHRoZSA5MUM5Mi80LiAgT3RoZXJzIGhhdmUgbW9yZSApCiAqICAgRUVQUk9NIGZvciBjb25maWd1cmF0aW9uCiAqICAgQVVJL1RQIHNlbGVjdGlvbgogKgogKiBBdXRob3JzCiAqCUVyaWsgU3RhaGxtYW4JCQkJPGVyaWtAdnQuZWR1PgogKiAgICAgIERhbmllbCBFbmdzdHL2bSAgICAgICAgICAgICAgICAgICAgICAgICA8ZGFuaWVsLmVuZ3N0cm9tQHJpa3NuZXR0Lm5vPgogKgogKiBIaXN0b3J5CiAqIDk4LTA5LTI1ICAgICAgICAgICAgICBEYW5pZWwgRW5nc3Ry9m0gRXRoZXJib290IGRyaXZlciBjcmF0ZWQgZnJvbSBFcmljJ3MKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW51eCBkcml2ZXIuCiAqCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCkZJTEVfTElDRU5DRSAoIEdQTF9BTlkgKTsKCiNkZWZpbmUgTElOVVhfT1VUX01BQ1JPUyAxCiNkZWZpbmUgU01DOTAwMF9ERUJVRyAgICAwCgojaWYgU01DOTAwMF9ERUJVRyA+IDEKI2RlZmluZSBQUklOVEsyIHByaW50ZgojZWxzZQojZGVmaW5lIFBSSU5USzIoYXJncy4uLikKI2VuZGlmCgojaW5jbHVkZSA8Z3B4ZS9ldGhlcm5ldC5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgImV0aGVyYm9vdC5oIgojaW5jbHVkZSAibmljLmgiCiNpbmNsdWRlIDxncHhlL2lzYS5oPgojaW5jbHVkZSAic21jOTAwMC5oIgoKIyBkZWZpbmUgX291dGIgb3V0YgojIGRlZmluZSBfb3V0dyBvdXR3CgpzdGF0aWMgY29uc3QgY2hhciAgICAgICBzbWM5MDAwX3ZlcnNpb25bXSA9ICJWZXJzaW9uIDAuOTkgOTgtMDktMzAiOwpzdGF0aWMgY29uc3QgY2hhciAgICAgICAqaW50ZXJmYWNlc1sgMiBdID0geyAiVFAiLCAiQVVJIiB9OwpzdGF0aWMgY29uc3QgY2hhciAgICAgICAqY2hpcF9pZHNbIDE1IF0gPSAgewogICBOVUxMLCBOVUxMLCBOVUxMLAogICAvKiAzICovICJTTUM5MUM5MC85MUM5MiIsCiAgIC8qIDQgKi8gIlNNQzkxQzk0IiwKICAgLyogNSAqLyAiU01DOTFDOTUiLAogICBOVUxMLAogICAvKiA3ICovICJTTUM5MUMxMDAiLAogICAvKiA4ICovICJTTUM5MUMxMDBGRCIsCiAgIC8qIDkgKi8gIlNNQzkxQzExeEZEIiwKICAgTlVMTCwgTlVMTCwKICAgTlVMTCwgTlVMTCwgTlVMTAp9OwpzdGF0aWMgY29uc3QgY2hhciAgICAgIHNtYzkxYzk2X2lkW10gPSAiU01DOTFDOTYiOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC4gUmVhZHMgYSByZWdpc3RlciBmcm9tIHRoZSBNSUkgTWFuYWdlbWVudCBzZXJpYWwgaW50ZXJmYWNlCiAuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyB3b3JkIHNtY19yZWFkX3BoeV9yZWdpc3RlcihpbnQgaW9hZGRyLCBieXRlIHBoeWFkZHIsIGJ5dGUgcGh5cmVnKQp7CiAgICBpbnQgb2xkQmFuazsKICAgIHVuc2lnbmVkIGludCBpOwogICAgYnl0ZSBtYXNrOwogICAgd29yZCBtaWlfcmVnOwogICAgYnl0ZSBiaXRzWzY0XTsKICAgIGludCBjbGtfaWR4ID0gMDsKICAgIGludCBpbnB1dF9pZHg7CiAgICB3b3JkIHBoeWRhdGE7CgogICAgLy8gMzIgY29uc2VjdXRpdmUgb25lcyBvbiBNRE8gdG8gZXN0YWJsaXNoIHN5bmMKICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgKytpKQogICAgICAgIGJpdHNbY2xrX2lkeCsrXSA9IE1JSV9NRE9FIHwgTUlJX01ETzsKCiAgICAvLyBTdGFydCBjb2RlIDwwMT4KICAgIGJpdHNbY2xrX2lkeCsrXSA9IE1JSV9NRE9FOwogICAgYml0c1tjbGtfaWR4KytdID0gTUlJX01ET0UgfCBNSUlfTURPOwoKICAgIC8vIFJlYWQgY29tbWFuZCA8MTA+CiAgICBiaXRzW2Nsa19pZHgrK10gPSBNSUlfTURPRSB8IE1JSV9NRE87CiAgICBiaXRzW2Nsa19pZHgrK10gPSBNSUlfTURPRTsKCiAgICAvLyBPdXRwdXQgdGhlIFBIWSBhZGRyZXNzLCBtc2IgZmlyc3QKICAgIG1hc2sgPSAoYnl0ZSkweDEwOwogICAgZm9yIChpID0gMDsgaSA8IDU7ICsraSkKICAgIHsKICAgICAgICBpZiAocGh5YWRkciAmIG1hc2spCiAgICAgICAgICAgIGJpdHNbY2xrX2lkeCsrXSA9IE1JSV9NRE9FIHwgTUlJX01ETzsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGJpdHNbY2xrX2lkeCsrXSA9IE1JSV9NRE9FOwoKICAgICAgICAvLyBTaGlmdCB0byBuZXh0IGxvd2VzdCBiaXQKICAgICAgICBtYXNrID4+PSAxOwogICAgfQoKICAgIC8vIE91dHB1dCB0aGUgcGh5IHJlZ2lzdGVyIG51bWJlciwgbXNiIGZpcnN0CiAgICBtYXNrID0gKGJ5dGUpMHgxMDsKICAgIGZvciAoaSA9IDA7IGkgPCA1OyArK2kpCiAgICB7CiAgICAgICAgaWYgKHBoeXJlZyAmIG1hc2spCiAgICAgICAgICAgIGJpdHNbY2xrX2lkeCsrXSA9IE1JSV9NRE9FIHwgTUlJX01ETzsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGJpdHNbY2xrX2lkeCsrXSA9IE1JSV9NRE9FOwoKICAgICAgICAvLyBTaGlmdCB0byBuZXh0IGxvd2VzdCBiaXQKICAgICAgICBtYXNrID4+PSAxOwogICAgfQoKICAgIC8vIFRyaXN0YXRlIGFuZCB0dXJuYXJvdW5kICgyIGJpdCB0aW1lcykKICAgIGJpdHNbY2xrX2lkeCsrXSA9IDA7CiAgICAvL2JpdHNbY2xrX2lkeCsrXSA9IDA7CgogICAgLy8gSW5wdXQgc3RhcnRzIGF0IHRoaXMgYml0IHRpbWUKICAgIGlucHV0X2lkeCA9IGNsa19pZHg7CgogICAgLy8gV2lsbCBpbnB1dCAxNiBiaXRzCiAgICBmb3IgKGkgPSAwOyBpIDwgMTY7ICsraSkKICAgICAgICBiaXRzW2Nsa19pZHgrK10gPSAwOwoKICAgIC8vIEZpbmFsIGNsb2NrIGJpdAogICAgYml0c1tjbGtfaWR4KytdID0gMDsKCiAgICAvLyBTYXZlIHRoZSBjdXJyZW50IGJhbmsKICAgIG9sZEJhbmsgPSBpbncoIGlvYWRkcitCQU5LX1NFTEVDVCApOwoKICAgIC8vIFNlbGVjdCBiYW5rIDMKICAgIFNNQ19TRUxFQ1RfQkFOSyhpb2FkZHIsIDMpOwoKICAgIC8vIEdldCB0aGUgY3VycmVudCBNSUkgcmVnaXN0ZXIgdmFsdWUKICAgIG1paV9yZWcgPSBpbncoIGlvYWRkcitNSUlfUkVHICk7CgogICAgLy8gVHVybiBvZmYgYWxsIE1JSSBJbnRlcmZhY2UgYml0cwogICAgbWlpX3JlZyAmPSB+KE1JSV9NRE9FfE1JSV9NQ0xLfE1JSV9NREl8TUlJX01ETyk7CgogICAgLy8gQ2xvY2sgYWxsIDY0IGN5Y2xlcwogICAgZm9yIChpID0gMDsgaSA8IHNpemVvZihiaXRzKTsgKytpKQogICAgewogICAgICAgIC8vIENsb2NrIExvdyAtIG91dHB1dCBkYXRhCiAgICAgICAgb3V0dyggbWlpX3JlZyB8IGJpdHNbaV0sIGlvYWRkcitNSUlfUkVHICk7CiAgICAgICAgdWRlbGF5KDUwKTsKCgogICAgICAgIC8vIENsb2NrIEhpIC0gaW5wdXQgZGF0YQogICAgICAgIG91dHcoIG1paV9yZWcgfCBiaXRzW2ldIHwgTUlJX01DTEssIGlvYWRkcitNSUlfUkVHICk7CiAgICAgICAgdWRlbGF5KDUwKTsKICAgICAgICBiaXRzW2ldIHw9IGludyggaW9hZGRyK01JSV9SRUcgKSAmIE1JSV9NREk7CiAgICB9CgogICAgLy8gUmV0dXJuIHRvIGlkbGUgc3RhdGUKICAgIC8vIFNldCBjbG9jayB0byBsb3csIGRhdGEgdG8gbG93LCBhbmQgb3V0cHV0IHRyaXN0YXRlZAogICAgb3V0dyggbWlpX3JlZywgaW9hZGRyK01JSV9SRUcgKTsKICAgIHVkZWxheSg1MCk7CgogICAgLy8gUmVzdG9yZSBvcmlnaW5hbCBiYW5rIHNlbGVjdAogICAgU01DX1NFTEVDVF9CQU5LKGlvYWRkciwgb2xkQmFuayk7CgogICAgLy8gUmVjb3ZlciBpbnB1dCBkYXRhCiAgICBwaHlkYXRhID0gMDsKICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKQogICAgewogICAgICAgIHBoeWRhdGEgPDw9IDE7CgogICAgICAgIGlmIChiaXRzW2lucHV0X2lkeCsrXSAmIE1JSV9NREkpCiAgICAgICAgICAgIHBoeWRhdGEgfD0gMHgwMDAxOwogICAgfQoKI2lmIChTTUNfREVCVUcgPiAyICkKICAgICAgICBwcmludGYoInNtY19yZWFkX3BoeV9yZWdpc3RlcigpOiBwaHlhZGRyPSV4LHBoeXJlZz0leCxwaHlkYXRhPSV4XG4iLAogICAgICAgICAgICAgICBwaHlhZGRyLCBwaHlyZWcsIHBoeWRhdGEpOwojZW5kaWYKCiAgICAgICAgcmV0dXJuKHBoeWRhdGEpOwp9CgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC4gV3JpdGVzIGEgcmVnaXN0ZXIgdG8gdGhlIE1JSSBNYW5hZ2VtZW50IHNlcmlhbCBpbnRlcmZhY2UKIC4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kc3RhdGljIHZvaWQgc21jX3dyaXRlX3BoeV9yZWdpc3RlcihpbnQgaW9hZGRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGUgcGh5YWRkciwgYnl0ZSBwaHlyZWcsIHdvcmQgcGh5ZGF0YSkKewogICAgaW50IG9sZEJhbms7CiAgICB1bnNpZ25lZCBpbnQgaTsKICAgIHdvcmQgbWFzazsKICAgIHdvcmQgbWlpX3JlZzsKICAgIGJ5dGUgYml0c1s2NV07CiAgICBpbnQgY2xrX2lkeCA9IDA7CgogICAgLy8gMzIgY29uc2VjdXRpdmUgb25lcyBvbiBNRE8gdG8gZXN0YWJsaXNoIHN5bmMKICAgIGZvciAoaSA9IDA7IGkgPCAzMjsgKytpKQogICAgICAgIGJpdHNbY2xrX2lkeCsrXSA9IE1JSV9NRE9FIHwgTUlJX01ETzsKCiAgICAvLyBTdGFydCBjb2RlIDwwMT4KICAgIGJpdHNbY2xrX2lkeCsrXSA9IE1JSV9NRE9FOwogICAgYml0c1tjbGtfaWR4KytdID0gTUlJX01ET0UgfCBNSUlfTURPOwoKICAgIC8vIFdyaXRlIGNvbW1hbmQgPDAxPgogICAgYml0c1tjbGtfaWR4KytdID0gTUlJX01ET0U7CiAgICBiaXRzW2Nsa19pZHgrK10gPSBNSUlfTURPRSB8IE1JSV9NRE87CgogICAgLy8gT3V0cHV0IHRoZSBQSFkgYWRkcmVzcywgbXNiIGZpcnN0CiAgICBtYXNrID0gKGJ5dGUpMHgxMDsKICAgIGZvciAoaSA9IDA7IGkgPCA1OyArK2kpCiAgICB7CiAgICAgICAgaWYgKHBoeWFkZHIgJiBtYXNrKQogICAgICAgICAgICBiaXRzW2Nsa19pZHgrK10gPSBNSUlfTURPRSB8IE1JSV9NRE87CiAgICAgICAgZWxzZQogICAgICAgICAgICBiaXRzW2Nsa19pZHgrK10gPSBNSUlfTURPRTsKCiAgICAgICAgICAgICAgICAvLyBTaGlmdCB0byBuZXh0IGxvd2VzdCBiaXQKICAgICAgICBtYXNrID4+PSAxOwogICAgfQoKICAgIC8vIE91dHB1dCB0aGUgcGh5IHJlZ2lzdGVyIG51bWJlciwgbXNiIGZpcnN0CiAgICBtYXNrID0gKGJ5dGUpMHgxMDsKICAgIGZvciAoaSA9IDA7IGkgPCA1OyArK2kpCiAgICB7CiAgICAgICAgaWYgKHBoeXJlZyAmIG1hc2spCiAgICAgICAgICAgIGJpdHNbY2xrX2lkeCsrXSA9IE1JSV9NRE9FIHwgTUlJX01ETzsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGJpdHNbY2xrX2lkeCsrXSA9IE1JSV9NRE9FOwoKICAgICAgICAvLyBTaGlmdCB0byBuZXh0IGxvd2VzdCBiaXQKICAgICAgICBtYXNrID4+PSAxOwogICAgfQoKICAgIC8vIFRyaXN0YXRlIGFuZCB0dXJuYXJvdW5kICgyIGJpdCB0aW1lcykKICAgIGJpdHNbY2xrX2lkeCsrXSA9IDA7CiAgICBiaXRzW2Nsa19pZHgrK10gPSAwOwoKICAgIC8vIFdyaXRlIG91dCAxNiBiaXRzIG9mIGRhdGEsIG1zYiBmaXJzdAogICAgbWFzayA9IDB4ODAwMDsKICAgIGZvciAoaSA9IDA7IGkgPCAxNjsgKytpKQogICAgewogICAgICAgIGlmIChwaHlkYXRhICYgbWFzaykKICAgICAgICAgICAgYml0c1tjbGtfaWR4KytdID0gTUlJX01ET0UgfCBNSUlfTURPOwogICAgICAgIGVsc2UKICAgICAgICAgICAgYml0c1tjbGtfaWR4KytdID0gTUlJX01ET0U7CgogICAgICAgIC8vIFNoaWZ0IHRvIG5leHQgbG93ZXN0IGJpdAogICAgICAgIG1hc2sgPj49IDE7CiAgICB9CgogICAgLy8gRmluYWwgY2xvY2sgYml0ICh0cmlzdGF0ZSkKICAgIGJpdHNbY2xrX2lkeCsrXSA9IDA7CgogICAgLy8gU2F2ZSB0aGUgY3VycmVudCBiYW5rCiAgICBvbGRCYW5rID0gaW53KCBpb2FkZHIrQkFOS19TRUxFQ1QgKTsKCiAgICAvLyBTZWxlY3QgYmFuayAzCiAgICBTTUNfU0VMRUNUX0JBTksoaW9hZGRyLCAzKTsKCiAgICAvLyBHZXQgdGhlIGN1cnJlbnQgTUlJIHJlZ2lzdGVyIHZhbHVlCiAgICBtaWlfcmVnID0gaW53KCBpb2FkZHIrTUlJX1JFRyApOwoKICAgIC8vIFR1cm4gb2ZmIGFsbCBNSUkgSW50ZXJmYWNlIGJpdHMKICAgIG1paV9yZWcgJj0gfihNSUlfTURPRXxNSUlfTUNMS3xNSUlfTURJfE1JSV9NRE8pOwoKICAgIC8vIENsb2NrIGFsbCBjeWNsZXMKICAgIGZvciAoaSA9IDA7IGkgPCBzaXplb2YoYml0cyk7ICsraSkKICAgIHsKICAgICAgICAvLyBDbG9jayBMb3cgLSBvdXRwdXQgZGF0YQogICAgICAgIG91dHcoIG1paV9yZWcgfCBiaXRzW2ldLCBpb2FkZHIrTUlJX1JFRyApOwogICAgICAgIHVkZWxheSg1MCk7CgoKICAgICAgICAvLyBDbG9jayBIaSAtIGlucHV0IGRhdGEKICAgICAgICBvdXR3KCBtaWlfcmVnIHwgYml0c1tpXSB8IE1JSV9NQ0xLLCBpb2FkZHIrTUlJX1JFRyApOwogICAgICAgIHVkZWxheSg1MCk7CiAgICAgICAgYml0c1tpXSB8PSBpbncoIGlvYWRkcitNSUlfUkVHICkgJiBNSUlfTURJOwogICAgfQoKICAgIC8vIFJldHVybiB0byBpZGxlIHN0YXRlCiAgICAvLyBTZXQgY2xvY2sgdG8gbG93LCBkYXRhIHRvIGxvdywgYW5kIG91dHB1dCB0cmlzdGF0ZWQKICAgIG91dHcoIG1paV9yZWcsIGlvYWRkcitNSUlfUkVHICk7CiAgICB1ZGVsYXkoNTApOwoKICAgIC8vIFJlc3RvcmUgb3JpZ2luYWwgYmFuayBzZWxlY3QKICAgIFNNQ19TRUxFQ1RfQkFOSyhpb2FkZHIsIG9sZEJhbmspOwoKI2lmIChTTUNfREVCVUcgPiAyICkKICAgICAgICBwcmludGYoInNtY193cml0ZV9waHlfcmVnaXN0ZXIoKTogcGh5YWRkcj0leCxwaHlyZWc9JXgscGh5ZGF0YT0leFxuIiwKICAgICAgICAgICAgICAgcGh5YWRkciwgcGh5cmVnLCBwaHlkYXRhKTsKI2VuZGlmCn0KCgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLiBGaW5kcyBhbmQgcmVwb3J0cyB0aGUgUEhZIGFkZHJlc3MKIC4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8Kc3RhdGljIGludCBzbWNfZGV0ZWN0X3BoeShpbnQgaW9hZGRyLCBieXRlICpwcGh5YWRkcikKewogICAgd29yZCBwaHlfaWQxOwogICAgd29yZCBwaHlfaWQyOwogICAgaW50IHBoeWFkZHI7CiAgICBpbnQgZm91bmQgPSAwOwoKICAgIC8vIFNjYW4gYWxsIDMyIFBIWSBhZGRyZXNzZXMgaWYgbmVjZXNzYXJ5CiAgICBmb3IgKHBoeWFkZHIgPSAwOyBwaHlhZGRyIDwgMzI7ICsrcGh5YWRkcikKICAgIHsKICAgICAgICAvLyBSZWFkIHRoZSBQSFkgaWRlbnRpZmllcnMKICAgICAgICBwaHlfaWQxICA9IHNtY19yZWFkX3BoeV9yZWdpc3Rlcihpb2FkZHIsIHBoeWFkZHIsIFBIWV9JRDFfUkVHKTsKICAgICAgICBwaHlfaWQyICA9IHNtY19yZWFkX3BoeV9yZWdpc3Rlcihpb2FkZHIsIHBoeWFkZHIsIFBIWV9JRDJfUkVHKTsKCiAgICAgICAgLy8gTWFrZSBzdXJlIGl0IGlzIGEgdmFsaWQgaWRlbnRpZmllcgogICAgICAgIGlmICgocGh5X2lkMiA+IDB4MDAwMCkgJiYgKHBoeV9pZDIgPCAweGZmZmYpICYmCiAgICAgICAgICAgICAocGh5X2lkMSA+IDB4MDAwMCkgJiYgKHBoeV9pZDEgPCAweGZmZmYpKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKChwaHlfaWQxICE9IDB4ODAwMCkgJiYgKHBoeV9pZDIgIT0gMHg4MDAwKSkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGUgUEhZJ3MgYWRkcmVzcwogICAgICAgICAgICAgICAgKnBwaHlhZGRyID0gcGh5YWRkcjsKICAgICAgICAgICAgICAgIGZvdW5kID0gMTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGlmICghZm91bmQpCiAgICB7CiAgICAgICAgcHJpbnRmKCJObyBQSFkgZm91bmRcbiIpOwogICAgICAgIHJldHVybigwKTsKICAgIH0KCiAgICAvLyBTZXQgdGhlIFBIWSB0eXBlCiAgICBpZiAoIChwaHlfaWQxID09IDB4MDAxNikgJiYgKChwaHlfaWQyICYgMHhGRkYwKSA9PSAweEY4NDAgKSApCiAgICB7CiAgICAgICAgcHJpbnRmKCJQSFk9TEFOODNDMTgzIChMQU45MUMxMTEgSW50ZXJuYWwpXG4iKTsKICAgIH0KCiAgICBpZiAoIChwaHlfaWQxID09IDB4MDI4MikgJiYgKChwaHlfaWQyICYgMHhGRkYwKSA9PSAweDFDNTApICkKICAgIHsKICAgICAgICBwcmludGYoIlBIWT1MQU44M0MxODBcbiIpOwogICAgfQoKICAgIHJldHVybigxKTsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC4gQ29uZmlndXJlcyB0aGUgc3BlY2lmaWVkIFBIWSB1c2luZyBBdXRvbmVnb3RpYXRpb24uIENhbGxzCiAuIHNtY19waHlfZml4ZWQoKSBpZiB0aGUgdXNlciBoYXMgcmVxdWVzdGVkIGEgY2VydGFpbiBjb25maWcuCiAuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCnN0YXRpYyB2b2lkIHNtY19waHlfY29uZmlndXJlKGludCBpb2FkZHIpCnsKICAgIGludCB0aW1lb3V0OwogICAgYnl0ZSBwaHlhZGRyOwogICAgd29yZCBteV9waHlfY2FwczsgLy8gTXkgUEhZIGNhcGFiaWxpdGllcwogICAgd29yZCBteV9hZF9jYXBzOyAvLyBNeSBBZHZlcnRpc2VkIGNhcGFiaWxpdGllcwogICAgd29yZCBzdGF0dXM7CiAgICBpbnQgZmFpbGVkID0gMDsKICAgIGludCBycGNfY3VyX21vZGUgPSBSUENfREVGQVVMVDsKICAgIGludCBsYXN0UGh5MTg7CgogICAgLy8gRmluZCB0aGUgYWRkcmVzcyBhbmQgdHlwZSBvZiBvdXIgcGh5CiAgICBpZiAoIXNtY19kZXRlY3RfcGh5KGlvYWRkciwgJnBoeWFkZHIpKQogICAgewogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBSZXNldCB0aGUgUEhZLCBzZXR0aW5nIGFsbCBvdGhlciBiaXRzIHRvIHplcm8KICAgIHNtY193cml0ZV9waHlfcmVnaXN0ZXIoaW9hZGRyLCBwaHlhZGRyLCBQSFlfQ05UTF9SRUcsIFBIWV9DTlRMX1JTVCk7CgogICAgLy8gV2FpdCBmb3IgdGhlIHJlc2V0IHRvIGNvbXBsZXRlLCBvciB0aW1lIG91dAogICAgdGltZW91dCA9IDY7IC8vIFdhaXQgdXAgdG8gMyBzZWNvbmRzCiAgICB3aGlsZSAodGltZW91dC0tKQogICAgewogICAgICAgIGlmICghKHNtY19yZWFkX3BoeV9yZWdpc3Rlcihpb2FkZHIsIHBoeWFkZHIsIFBIWV9DTlRMX1JFRykKICAgICAgICAgICAgICAmIFBIWV9DTlRMX1JTVCkpCiAgICAgICAgewogICAgICAgICAgICAvLyByZXNldCBjb21wbGV0ZQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIG1kZWxheSg1MDApOyAvLyB3YWl0IDUwMCBtaWxsaXNlY3MKICAgIH0KCiAgICBpZiAodGltZW91dCA8IDEpCiAgICB7CiAgICAgICAgUFJJTlRLMigiUEhZIHJlc2V0IHRpbWVkIG91dFxuIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIC8vIFJlYWQgUEhZIFJlZ2lzdGVyIDE4LCBTdGF0dXMgT3V0cHV0CiAgICBsYXN0UGh5MTggPSBzbWNfcmVhZF9waHlfcmVnaXN0ZXIoaW9hZGRyLCBwaHlhZGRyLCBQSFlfSU5UX1JFRyk7CgogICAgLy8gRW5hYmxlIFBIWSBJbnRlcnJ1cHRzIChmb3IgcmVnaXN0ZXIgMTgpCiAgICAvLyBJbnRlcnJ1cHRzIGxpc3RlZCBoZXJlIGFyZSBkaXNhYmxlZAogICAgc21jX3dyaXRlX3BoeV9yZWdpc3Rlcihpb2FkZHIsIHBoeWFkZHIsIFBIWV9NQVNLX1JFRywKICAgICAgICAgICAgICAgICAgICAgICAgICAgUEhZX0lOVF9MT1NTU1lOQyB8IFBIWV9JTlRfQ1dSRCB8IFBIWV9JTlRfU1NEIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSFlfSU5UX0VTRCB8IFBIWV9JTlRfUlBPTCB8IFBIWV9JTlRfSkFCIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQSFlfSU5UX1NQRERFVCB8IFBIWV9JTlRfRFBMWERFVCk7CgogICAgLyogQ29uZmlndXJlIHRoZSBSZWNlaXZlL1BoeSBDb250cm9sIHJlZ2lzdGVyICovCiAgICBTTUNfU0VMRUNUX0JBTksoaW9hZGRyLCAwKTsKICAgIG91dHcoIHJwY19jdXJfbW9kZSwgaW9hZGRyICsgUlBDX1JFRyApOwoKICAgIC8vIENvcHkgb3VyIGNhcGFiaWxpdGllcyBmcm9tIFBIWV9TVEFUX1JFRyB0byBQSFlfQURfUkVHCiAgICBteV9waHlfY2FwcyA9IHNtY19yZWFkX3BoeV9yZWdpc3Rlcihpb2FkZHIsIHBoeWFkZHIsIFBIWV9TVEFUX1JFRyk7CiAgICBteV9hZF9jYXBzICA9IFBIWV9BRF9DU01BOyAvLyBJIGFtIENTTUEgY2FwYWJsZQoKICAgIGlmIChteV9waHlfY2FwcyAmIFBIWV9TVEFUX0NBUF9UNCkKICAgICAgICBteV9hZF9jYXBzIHw9IFBIWV9BRF9UNDsKCiAgICBpZiAobXlfcGh5X2NhcHMgJiBQSFlfU1RBVF9DQVBfVFhGKQogICAgICAgIG15X2FkX2NhcHMgfD0gUEhZX0FEX1RYX0ZEWDsKCiAgICBpZiAobXlfcGh5X2NhcHMgJiBQSFlfU1RBVF9DQVBfVFhIKQogICAgICAgIG15X2FkX2NhcHMgfD0gUEhZX0FEX1RYX0hEWDsKCiAgICBpZiAobXlfcGh5X2NhcHMgJiBQSFlfU1RBVF9DQVBfVEYpCiAgICAgICAgbXlfYWRfY2FwcyB8PSBQSFlfQURfMTBfRkRYOwoKICAgIGlmIChteV9waHlfY2FwcyAmIFBIWV9TVEFUX0NBUF9USCkKICAgICAgICBteV9hZF9jYXBzIHw9IFBIWV9BRF8xMF9IRFg7CgogICAgLy8gVXBkYXRlIG91ciBBdXRvLU5lZyBBZHZlcnRpc2VtZW50IFJlZ2lzdGVyCiAgICBzbWNfd3JpdGVfcGh5X3JlZ2lzdGVyKGlvYWRkciwgcGh5YWRkciwgUEhZX0FEX1JFRywgbXlfYWRfY2Fwcyk7CgogICAgUFJJTlRLMigicGh5IGNhcHM9JXhcbiIsIG15X3BoeV9jYXBzKTsKICAgIFBSSU5USzIoInBoeSBhZHZlcnRpc2VkIGNhcHM9JXhcbiIsIG15X2FkX2NhcHMpOwoKICAgIC8vIFJlc3RhcnQgYXV0by1uZWdvdGlhdGlvbiBwcm9jZXNzIGluIG9yZGVyIHRvIGFkdmVydGlzZSBteSBjYXBzCiAgICBzbWNfd3JpdGVfcGh5X3JlZ2lzdGVyKCBpb2FkZHIsIHBoeWFkZHIsIFBIWV9DTlRMX1JFRywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBIWV9DTlRMX0FORUdfRU4gfCBQSFlfQ05UTF9BTkVHX1JTVCApOwoKICAgIC8vIFdhaXQgZm9yIHRoZSBhdXRvLW5lZ290aWF0aW9uIHRvIGNvbXBsZXRlLiAgVGhpcyBtYXkgdGFrZSBmcm9tCiAgICAvLyAyIHRvIDMgc2Vjb25kcy4KICAgIC8vIFdhaXQgZm9yIHRoZSByZXNldCB0byBjb21wbGV0ZSwgb3IgdGltZSBvdXQKICAgIHRpbWVvdXQgPSAyMDsgLy8gV2FpdCB1cCB0byAxMCBzZWNvbmRzCiAgICB3aGlsZSAodGltZW91dC0tKQogICAgewogICAgICAgIHN0YXR1cyA9IHNtY19yZWFkX3BoeV9yZWdpc3Rlcihpb2FkZHIsIHBoeWFkZHIsIFBIWV9TVEFUX1JFRyk7CiAgICAgICAgaWYgKHN0YXR1cyAmIFBIWV9TVEFUX0FORUdfQUNLKQogICAgICAgIHsKICAgICAgICAgICAgLy8gYXV0by1uZWdvdGlhdGUgY29tcGxldGUKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBtZGVsYXkoNTAwKTsgLy8gd2FpdCA1MDAgbWlsbGlzZWNzCgogICAgICAgIC8vIFJlc3RhcnQgYXV0by1uZWdvdGlhdGlvbiBpZiByZW1vdGUgZmF1bHQKICAgICAgICBpZiAoc3RhdHVzICYgUEhZX1NUQVRfUkVNX0ZMVCkKICAgICAgICB7CiAgICAgICAgICAgIFBSSU5USzIoIlBIWSByZW1vdGUgZmF1bHQgZGV0ZWN0ZWRcbiIpOwoKICAgICAgICAgICAgLy8gUmVzdGFydCBhdXRvLW5lZ290aWF0aW9uCiAgICAgICAgICAgIFBSSU5USzIoIlBIWSByZXN0YXJ0aW5nIGF1dG8tbmVnb3RpYXRpb25cbiIpOwogICAgICAgICAgICBzbWNfd3JpdGVfcGh5X3JlZ2lzdGVyKCBpb2FkZHIsIHBoeWFkZHIsIFBIWV9DTlRMX1JFRywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEhZX0NOVExfQU5FR19FTiB8IFBIWV9DTlRMX0FORUdfUlNUIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEhZX0NOVExfU1BFRUQgfCBQSFlfQ05UTF9EUExYKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKHRpbWVvdXQgPCAxKQogICAgewogICAgICAgIFBSSU5USzIoIlBIWSBhdXRvLW5lZ290aWF0ZSB0aW1lZCBvdXRcbiIpOwogICAgICAgIGZhaWxlZCA9IDE7CiAgICB9CgogICAgLy8gRmFpbCBpZiB3ZSBkZXRlY3RlZCBhbiBhdXRvLW5lZ290aWF0ZSByZW1vdGUgZmF1bHQKICAgIGlmIChzdGF0dXMgJiBQSFlfU1RBVF9SRU1fRkxUKQogICAgewogICAgICAgIFBSSU5USzIoIlBIWSByZW1vdGUgZmF1bHQgZGV0ZWN0ZWRcbiIpOwogICAgICAgIGZhaWxlZCA9IDE7CiAgICB9CgogICAgLy8gU2V0IG91ciBzeXNjdGwgcGFyYW1ldGVycyB0byBtYXRjaCBhdXRvLW5lZ290aWF0aW9uIHJlc3VsdHMKICAgIGlmICggbGFzdFBoeTE4ICYgUEhZX0lOVF9TUERERVQgKQogICAgewogICAgICAgIFBSSU5USzIoIlBIWSAxMDBCYXNlVFxuIik7CiAgICAgICAgcnBjX2N1cl9tb2RlIHw9IFJQQ19TUEVFRDsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBQUklOVEsyKCJQSFkgMTBCYXNlVFxuIik7CiAgICAgICAgcnBjX2N1cl9tb2RlICY9IH5SUENfU1BFRUQ7CiAgICB9CgogICAgaWYgKCBsYXN0UGh5MTggJiBQSFlfSU5UX0RQTFhERVQgKQogICAgewogICAgICAgIFBSSU5USzIoIlBIWSBGdWxsIER1cGxleFxuIik7CiAgICAgICAgcnBjX2N1cl9tb2RlIHw9IFJQQ19EUExYOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIFBSSU5USzIoIlBIWSBIYWxmIER1cGxleFxuIik7CiAgICAgICAgcnBjX2N1cl9tb2RlICY9IH5SUENfRFBMWDsKICAgIH0KCiAgICAvLyBSZS1Db25maWd1cmUgdGhlIFJlY2VpdmUvUGh5IENvbnRyb2wgcmVnaXN0ZXIKICAgIG91dHcoIHJwY19jdXJfbW9kZSwgaW9hZGRyICsgUlBDX1JFRyApOwp9CgovKgogKiBGdW5jdGlvbjogc21jX3Jlc2V0KCBpbnQgaW9hZGRyICkKICogUHVycG9zZToKICoJVGhpcyBzZXRzIHRoZSBTTUM5MXh4IGNoaXAgdG8gaXRzIG5vcm1hbCBzdGF0ZSwgaG9wZWZ1bGx5IGZyb20gd2hhdGV2ZXIKICoJbWVzcyB0aGF0IGFueSBvdGhlciBET1MgZHJpdmVyIGhhcyBwdXQgaXQgaW4uCiAqCiAqIE1heWJlIEkgc2hvdWxkIHJlc2V0IG1vcmUgcmVnaXN0ZXJzIHRvIGRlZmF1bHRzIGluIGhlcmU/ICBTT0ZUUkVTRVQgIHNob3VsZAogKiBkbyB0aGF0IGZvciBtZS4KICoKICogTWV0aG9kOgogKgkxLiAgc2VuZCBhIFNPRlQgUkVTRVQKICoJMi4gIHdhaXQgZm9yIGl0IHRvIGZpbmlzaAogKgkzLiAgcmVzZXQgdGhlIG1lbW9yeSBtYW5hZ2VtZW50IHVuaXQKICogICAgICA0LiAgY2xlYXIgYWxsIGludGVycnVwdHMKICoKKi8Kc3RhdGljIHZvaWQgc21jX3Jlc2V0KGludCBpb2FkZHIpCnsKICAgLyogVGhpcyByZXNldHMgdGhlIHJlZ2lzdGVycyBtb3N0bHkgdG8gZGVmYXVsdHMsIGJ1dCBkb2Vzbid0CiAgICAqIGFmZmVjdCBFRVBST00uICBUaGF0IHNlZW1zIHVubmVjZXNzYXJ5ICovCiAgIFNNQ19TRUxFQ1RfQkFOSyhpb2FkZHIsIDApOwogICBfb3V0dyggUkNSX1NPRlRSRVNFVCwgaW9hZGRyICsgUkNSICk7CgogICAvKiB0aGlzIHNob3VsZCBwYXVzZSBlbm91Z2ggZm9yIHRoZSBjaGlwIHRvIGJlIGhhcHB5ICovCiAgIFNNQ19ERUxBWShpb2FkZHIpOwoKICAgLyogU2V0IHRoZSB0cmFuc21pdCBhbmQgcmVjZWl2ZSBjb25maWd1cmF0aW9uIHJlZ2lzdGVycyB0bwogICAgKiBkZWZhdWx0IHZhbHVlcyAqLwogICBfb3V0dyhSQ1JfQ0xFQVIsIGlvYWRkciArIFJDUik7CiAgIF9vdXR3KFRDUl9DTEVBUiwgaW9hZGRyICsgVENSKTsKCiAgIC8qIFJlc2V0IHRoZSBNTVUgKi8KICAgU01DX1NFTEVDVF9CQU5LKGlvYWRkciwgMik7CiAgIF9vdXR3KCBNQ19SRVNFVCwgaW9hZGRyICsgTU1VX0NNRCApOwoKICAgLyogTm90ZTogIEl0IGRvZXNuJ3Qgc2VlbSB0aGF0IHdhaXRpbmcgZm9yIHRoZSBNTVUgYnVzeSBpcyBuZWVkZWQgaGVyZSwKICAgICogYnV0IHRoaXMgaXMgYSBwbGFjZSB3aGVyZSBmdXR1cmUgY2hpcHNldHMgX0NPVUxEXyBicmVhay4gIEJlIHdhcnkKICAgICogb2YgaXNzdWluZyBhbm90aGVyIE1NVSBjb21tYW5kIHJpZ2h0IGFmdGVyIHRoaXMgKi8KICAgX291dGIoMCwgaW9hZGRyICsgSU5UX01BU0spOwp9CgoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIEZ1bmN0aW9uOiBzbWM5MDAwX3Byb2JlX2FkZHIoIGludCBpb2FkZHIgKQogKgogKiBQdXJwb3NlOgogKglUZXN0cyB0byBzZWUgaWYgYSBnaXZlbiBpb2FkZHIgcG9pbnRzIHRvIGFuIFNNQzl4eHggY2hpcC4KICoJUmV0dXJucyBhIDEgb24gc3VjY2VzcwogKgogKiBBbGdvcml0aG06CiAqCSgxKSBzZWUgaWYgdGhlIGhpZ2ggYnl0ZSBvZiBCQU5LX1NFTEVDVCBpcyAweDMzCiAqCSgyKSBjb21wYXJlIHRoZSBpb2FkZHIgd2l0aCB0aGUgYmFzZSByZWdpc3RlcidzIGFkZHJlc3MKICoJKDMpIHNlZSBpZiBJIHJlY29nbml6ZSB0aGUgY2hpcCBJRCBpbiB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXIKICoKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwpzdGF0aWMgaW50IHNtYzkwMDBfcHJvYmVfYWRkciggaXNhX3Byb2JlX2FkZHJfdCBpb2FkZHIgKQp7CiAgIHdvcmQgYmFuazsKICAgd29yZAlyZXZpc2lvbl9yZWdpc3RlcjsKICAgd29yZCBiYXNlX2FkZHJlc3NfcmVnaXN0ZXI7CgogICAvKiBGaXJzdCwgc2VlIGlmIHRoZSBoaWdoIGJ5dGUgaXMgMHgzMyAqLwogICBiYW5rID0gaW53KGlvYWRkciArIEJBTktfU0VMRUNUKTsKICAgaWYgKChiYW5rICYgMHhGRjAwKSAhPSAweDMzMDApIHsKICAgICAgcmV0dXJuIDA7CiAgIH0KICAgLyogVGhlIGFib3ZlIE1JR0hUIGluZGljYXRlIGEgZGV2aWNlLCBidXQgSSBuZWVkIHRvIHdyaXRlIHRvIGZ1cnRoZXIKICAgICoJdGVzdCB0aGlzLiAgKi8KICAgX291dHcoMHgwLCBpb2FkZHIgKyBCQU5LX1NFTEVDVCk7CiAgIGJhbmsgPSBpbncoaW9hZGRyICsgQkFOS19TRUxFQ1QpOwogICBpZiAoKGJhbmsgJiAweEZGMDApICE9IDB4MzMwMCkgewogICAgICByZXR1cm4gMDsKICAgfQoKICAgLyogd2VsbCwgd2UndmUgYWxyZWFkeSB3cml0dGVuIG9uY2UsIHNvIGhvcGVmdWxseSBhbm90aGVyIHRpbWUgd29uJ3QKICAgICogIGh1cnQuICBUaGlzIHRpbWUsIEkgbmVlZCB0byBzd2l0Y2ggdGhlIGJhbmsgcmVnaXN0ZXIgdG8gYmFuayAxLAogICAgKiAgc28gSSBjYW4gYWNjZXNzIHRoZSBiYXNlIGFkZHJlc3MgcmVnaXN0ZXIgKi8KICAgU01DX1NFTEVDVF9CQU5LKGlvYWRkciwgMSk7CiAgIGJhc2VfYWRkcmVzc19yZWdpc3RlciA9IGludyhpb2FkZHIgKyBCQVNFKTsKCiAgIGlmIChpb2FkZHIgIT0gKGJhc2VfYWRkcmVzc19yZWdpc3RlciA+PiAzICYgMHgzRTApKSAgewogICAgICBEQkcoIlNNQzkwMDA6IElPQUREUiAlaFggZG9lc24ndCBtYXRjaCBjb25maWd1cmF0aW9uICglaFgpLiIKCSAgIlByb2JhYmx5IG5vdCBhIFNNQyBjaGlwXG4iLAoJICBpb2FkZHIsIGJhc2VfYWRkcmVzc19yZWdpc3RlciA+PiAzICYgMHgzRTApOwogICAgICAvKiB3ZWxsLCB0aGUgYmFzZSBhZGRyZXNzIHJlZ2lzdGVyIGRpZG4ndCBtYXRjaC4gIE11c3Qgbm90IGhhdmUKICAgICAgICogYmVlbiBhIFNNQyBjaGlwIGFmdGVyIGFsbC4gKi8KICAgICAgcmV0dXJuIDA7CiAgIH0KCgogICAvKiBjaGVjayBpZiB0aGUgcmV2aXNpb24gcmVnaXN0ZXIgaXMgc29tZXRoaW5nIHRoYXQgSSByZWNvZ25pemUuCiAgICAqIFRoZXNlIG1pZ2h0IG5lZWQgdG8gYmUgYWRkZWQgdG8gbGF0ZXIsIGFzIGZ1dHVyZSByZXZpc2lvbnMKICAgICogY291bGQgYmUgYWRkZWQuICAqLwogICBTTUNfU0VMRUNUX0JBTksoaW9hZGRyLCAzKTsKICAgcmV2aXNpb25fcmVnaXN0ZXIgID0gaW53KGlvYWRkciArIFJFVklTSU9OKTsKICAgaWYgKCFjaGlwX2lkc1socmV2aXNpb25fcmVnaXN0ZXIgPj4gNCkgJiAweEZdKSB7CiAgICAgIC8qIEkgZG9uJ3QgcmVjb2duaXplIHRoaXMgY2hpcCwgc28uLi4gKi8KICAgICAgREJHKCAiU01DOTAwMDogSU8gJWhYOiBVbnJlY29nbml6ZWQgcmV2aXNpb24gcmVnaXN0ZXI6IgoJICAgIiAlaFgsIENvbnRhY3QgYXV0aG9yLlxuIiwgaW9hZGRyLCByZXZpc2lvbl9yZWdpc3RlciApOwogICAgICByZXR1cm4gMDsKICAgfQoKICAgLyogYXQgdGhpcyBwb2ludCBJJ2xsIGFzc3VtZSB0aGF0IHRoZSBjaGlwIGlzIGFuIFNNQzl4eHguCiAgICAqIEl0IG1pZ2h0IGJlIHBydWRlbnQgdG8gY2hlY2sgYSBsaXN0aW5nIG9mIE1BQyBhZGRyZXNzZXMKICAgICogYWdhaW5zdCB0aGUgaGFyZHdhcmUgYWRkcmVzcywgb3IgZG8gc29tZSBvdGhlciB0ZXN0cy4gKi8KICAgcmV0dXJuIDE7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogRVRIX1RSQU5TTUlUIC0gVHJhbnNtaXQgYSBmcmFtZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgdm9pZCBzbWM5MDAwX3RyYW5zbWl0KAoJc3RydWN0IG5pYyAqbmljLAoJY29uc3QgY2hhciAqZCwJCQkvKiBEZXN0aW5hdGlvbiAqLwoJdW5zaWduZWQgaW50IHQsCQkJLyogVHlwZSAqLwoJdW5zaWduZWQgaW50IHMsCQkJLyogc2l6ZSAqLwoJY29uc3QgY2hhciAqcCkJCQkvKiBQYWNrZXQgKi8KewogICB3b3JkIGxlbmd0aDsgLyogcmVhbCwgbGVuZ3RoIGluY2wuIGhlYWRlciAqLwogICB3b3JkIG51bVBhZ2VzOwogICB1bnNpZ25lZCBsb25nIHRpbWVfb3V0OwogICBieXRlCXBhY2tldF9ubzsKICAgd29yZCBzdGF0dXM7CiAgIGludCBpOwoKICAgLyogV2UgZG9udCBwYWQgaGVyZSBzaW5jZSB3ZSBjYW4gaGF2ZSB0aGUgaGFyZHdhcmUgZG9pbmcgaXQgZm9yIHVzICovCiAgIGxlbmd0aCA9IChzICsgRVRIX0hMRU4gKyAxKSZ+MTsKCiAgIC8qIGNvbnZlcnQgdG8gTU1VIHBhZ2VzICovCiAgIG51bVBhZ2VzID0gbGVuZ3RoIC8gMjU2OwoKICAgaWYgKG51bVBhZ2VzID4gNyApIHsKICAgICAgREJHKCJTTUM5MDAwOiBGYXIgdG9vIGJpZyBwYWNrZXQgZXJyb3IuIFxuIik7CiAgICAgIHJldHVybjsKICAgfQoKICAgLyogZG9udCB0cnkgbW9yZSB0aGFuLCBzYXkgMzAgdGltZXMgKi8KICAgZm9yIChpPTA7aTwzMDtpKyspIHsKICAgICAgLyogbm93LCB0cnkgdG8gYWxsb2NhdGUgdGhlIG1lbW9yeSAqLwogICAgICBTTUNfU0VMRUNUX0JBTksobmljLT5pb2FkZHIsIDIpOwogICAgICBfb3V0dyhNQ19BTExPQyB8IG51bVBhZ2VzLCBuaWMtPmlvYWRkciArIE1NVV9DTUQpOwoKICAgICAgc3RhdHVzID0gMDsKICAgICAgLyogd2FpdCBmb3IgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIHRvIGZpbm5pc2ggKi8KICAgICAgZm9yICh0aW1lX291dCA9IGN1cnJ0aWNrcygpICsgNSpUSUNLU19QRVJfU0VDOyBjdXJydGlja3MoKSA8IHRpbWVfb3V0OyApIHsKCSBzdGF0dXMgPSBpbmIobmljLT5pb2FkZHIgKyBJTlRFUlJVUFQpOwoJIGlmICggc3RhdHVzICYgSU1fQUxMT0NfSU5UICkgewoJICAgIC8qIGFja25vd2xlZGdlIHRoZSBpbnRlcnJ1cHQgKi8KCSAgICBfb3V0YihJTV9BTExPQ19JTlQsIG5pYy0+aW9hZGRyICsgSU5URVJSVVBUKTsKCSAgICBicmVhazsKCSB9CiAgICAgIH0KCiAgICAgIGlmICgoc3RhdHVzICYgSU1fQUxMT0NfSU5UKSAhPSAwICkgewoJIC8qIFdlJ3ZlIGdvdCB0aGUgbWVtb3J5ICovCgkgYnJlYWs7CiAgICAgIH0gZWxzZSB7CgkgcHJpbnRmKCJTTUM5MDAwOiBNZW1vcnkgYWxsb2NhdGlvbiB0aW1lZCBvdXQsIHJlc2V0dGluZyBNTVUuXG4iKTsKCSBfb3V0dyhNQ19SRVNFVCwgbmljLT5pb2FkZHIgKyBNTVVfQ01EKTsKICAgICAgfQogICB9CgogICAvKiBJZiBJIGdldCBoZXJlLCBJIF9rbm93XyB0aGVyZSBpcyBhIHBhY2tldCBzbG90IHdhaXRpbmcgZm9yIG1lICovCiAgIHBhY2tldF9ubyA9IGluYihuaWMtPmlvYWRkciArIFBOUl9BUlIgKyAxKTsKICAgaWYgKHBhY2tldF9ubyAmIDB4ODApIHsKICAgICAgLyogb3IgaXNuJ3QgdGhlcmU/ICBCQUQgQ0hJUCEgKi8KICAgICAgcHJpbnRmKCJTTUM5MDAwOiBNZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuIFxuIik7CiAgICAgIHJldHVybjsKICAgfQoKICAgLyogd2UgaGF2ZSBhIHBhY2tldCBhZGRyZXNzLCBzbyB0ZWxsIHRoZSBjYXJkIHRvIHVzZSBpdCAqLwogICBfb3V0YihwYWNrZXRfbm8sIG5pYy0+aW9hZGRyICsgUE5SX0FSUik7CgogICAvKiBwb2ludCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwYWNrZXQgKi8KICAgX291dHcoUFRSX0FVVE9JTkMsIG5pYy0+aW9hZGRyICsgUE9JTlRFUik7CgojaWYJU01DOTAwMF9ERUJVRyA+IDIKICAgcHJpbnRmKCJUcnlpbmcgdG8geG1pdCBwYWNrZXQgb2YgbGVuZ3RoICVoWFxuIiwgbGVuZ3RoICk7CiNlbmRpZgoKICAgLyogc2VuZCB0aGUgcGFja2V0IGxlbmd0aCAoICs2IGZvciBzdGF0dXMsIGxlbmd0aCBhbmQgY3RsIGJ5dGUgKQogICAgKiBhbmQgdGhlIHN0YXR1cyB3b3JkICggc2V0IHRvIHplcm9zICkgKi8KICAgX291dHcoMCwgbmljLT5pb2FkZHIgKyBEQVRBXzEgKTsKCiAgIC8qIHNlbmQgdGhlIHBhY2tldCBsZW5ndGggKCArNiBmb3Igc3RhdHVzIHdvcmRzLCBsZW5ndGgsIGFuZCBjdGwpICovCiAgIF9vdXRiKChsZW5ndGgrNikgJiAweEZGLCAgbmljLT5pb2FkZHIgKyBEQVRBXzEpOwogICBfb3V0YigobGVuZ3RoKzYpID4+IDggLCAgIG5pYy0+aW9hZGRyICsgREFUQV8xKTsKCiAgIC8qIFdyaXRlIHRoZSBjb250ZW50cyBvZiB0aGUgcGFja2V0ICovCgogICAvKiBUaGUgZXRoZXJuZXQgaGVhZGVyIGZpcnN0Li4uICovCiAgIG91dHN3KG5pYy0+aW9hZGRyICsgREFUQV8xLCBkLCBFVEhfQUxFTiA+PiAxKTsKICAgb3V0c3cobmljLT5pb2FkZHIgKyBEQVRBXzEsIG5pYy0+bm9kZV9hZGRyLCBFVEhfQUxFTiA+PiAxKTsKICAgX291dHcoaHRvbnModCksIG5pYy0+aW9hZGRyICsgREFUQV8xKTsKCiAgIC8qIC4uLiB0aGUgZGF0YSAuLi4gKi8KICAgb3V0c3cobmljLT5pb2FkZHIgKyBEQVRBXzEgLCBwLCBzID4+IDEpOwoKICAgLyogLi4uIGFuZCB0aGUgbGFzdCBieXRlLCBpZiB0aGVyZSBpcyBvbmUuICAgKi8KICAgaWYgKChzICYgMSkgPT0gMCkgewogICAgICBfb3V0dygwLCBuaWMtPmlvYWRkciArIERBVEFfMSk7CiAgIH0gZWxzZSB7CiAgICAgIF9vdXRiKHBbcy0xXSwgbmljLT5pb2FkZHIgKyBEQVRBXzEpOwogICAgICBfb3V0YigweDIwLCBuaWMtPmlvYWRkciArIERBVEFfMSk7CiAgIH0KCiAgIC8qIGFuZCBsZXQgdGhlIGNoaXBzZXQgZGVhbCB3aXRoIGl0ICovCiAgIF9vdXR3KE1DX0VOUVVFVUUgLCBuaWMtPmlvYWRkciArIE1NVV9DTUQpOwoKICAgc3RhdHVzID0gMDsgdGltZV9vdXQgPSBjdXJydGlja3MoKSArIDUqVElDS1NfUEVSX1NFQzsKICAgZG8gewogICAgICBzdGF0dXMgPSBpbmIobmljLT5pb2FkZHIgKyBJTlRFUlJVUFQpOwoKICAgICAgaWYgKChzdGF0dXMgJiBJTV9UWF9JTlQgKSAhPSAwKSB7Cgkgd29yZCB0eF9zdGF0dXM7CgoJIC8qIGFjayBpbnRlcnJ1cHQgKi8KCSBfb3V0YihJTV9UWF9JTlQsIG5pYy0+aW9hZGRyICsgSU5URVJSVVBUKTsKCgkgcGFja2V0X25vID0gaW53KG5pYy0+aW9hZGRyICsgRklGT19QT1JUUyk7CgkgcGFja2V0X25vICY9IDB4N0Y7CgoJIC8qIHNlbGVjdCB0aGlzIGFzIHRoZSBwYWNrZXQgdG8gcmVhZCBmcm9tICovCgkgX291dGIoIHBhY2tldF9ubywgbmljLT5pb2FkZHIgKyBQTlJfQVJSICk7CgoJIC8qIHJlYWQgdGhlIGZpcnN0IHdvcmQgZnJvbSB0aGlzIHBhY2tldCAqLwoJIF9vdXR3KCBQVFJfQVVUT0lOQyB8IFBUUl9SRUFELCBuaWMtPmlvYWRkciArIFBPSU5URVIgKTsKCgkgdHhfc3RhdHVzID0gaW53KCBuaWMtPmlvYWRkciArIERBVEFfMSApOwoKCSBpZiAoMCA9PSAodHhfc3RhdHVzICYgVFNfU1VDQ0VTUykpIHsKCSAgICBEQkcoIlNNQzkwMDA6IFRYIEZBSUwgU1RBVFVTOiAlaFggXG4iLCB0eF9zdGF0dXMpOwoJICAgIC8qIHJlLWVuYWJsZSB0cmFuc21pdCAqLwoJICAgIFNNQ19TRUxFQ1RfQkFOSyhuaWMtPmlvYWRkciwgMCk7CgkgICAgX291dHcoaW53KG5pYy0+aW9hZGRyICsgVENSICkgfCBUQ1JfRU5BQkxFLCBuaWMtPmlvYWRkciArIFRDUiApOwoJIH0KCgkgLyoga2lsbCB0aGUgcGFja2V0ICovCgkgU01DX1NFTEVDVF9CQU5LKG5pYy0+aW9hZGRyLCAyKTsKCSBfb3V0dyhNQ19GUkVFUEtULCBuaWMtPmlvYWRkciArIE1NVV9DTUQpOwoKCSByZXR1cm47CiAgICAgIH0KICAgfXdoaWxlKGN1cnJ0aWNrcygpIDwgdGltZV9vdXQpOwoKICAgcHJpbnRmKCJTTUM5MDAwOiBUWCB0aW1lZCBvdXQsIHJlc2V0dGluZyBib2FyZFxuIik7CiAgIHNtY19yZXNldChuaWMtPmlvYWRkcik7CiAgIHJldHVybjsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEVUSF9QT0xMIC0gV2FpdCBmb3IgYSBmcmFtZQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpzdGF0aWMgaW50IHNtYzkwMDBfcG9sbChzdHJ1Y3QgbmljICpuaWMsIGludCByZXRyaWV2ZSkKewogICBTTUNfU0VMRUNUX0JBTksobmljLT5pb2FkZHIsIDIpOwogICBpZiAoaW53KG5pYy0+aW9hZGRyICsgRklGT19QT1JUUykgJiBGUF9SWEVNUFRZKQogICAgIHJldHVybiAwOwogICAKICAgaWYgKCAhIHJldHJpZXZlICkgcmV0dXJuIDE7CgogICAvKiAgc3RhcnQgcmVhZGluZyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgcGFja2V0ICovCiAgIF9vdXR3KFBUUl9SRUFEIHwgUFRSX1JDViB8IFBUUl9BVVRPSU5DLCBuaWMtPmlvYWRkciArIFBPSU5URVIpOwoKICAgLyogRmlyc3QgcmVhZCB0aGUgc3RhdHVzIGFuZCBjaGVjayB0aGF0IHdlJ3JlIG9rICovCiAgIGlmICghKGludyhuaWMtPmlvYWRkciArIERBVEFfMSkgJiBSU19FUlJPUlMpKSB7CiAgICAgIC8qIE5leHQ6IHJlYWQgdGhlIHBhY2tldCBsZW5ndGggYW5kIG1hc2sgb2ZmIHRoZSB0b3AgYml0cyAqLwogICAgICBuaWMtPnBhY2tldGxlbiA9IChpbncobmljLT5pb2FkZHIgKyBEQVRBXzEpICYgMHgwN2ZmKTsKCiAgICAgIC8qIHRoZSBwYWNrZXQgbGVuZ3RoIGluY2x1ZGVzIHRoZSAzIGV4dHJhIHdvcmRzICovCiAgICAgIG5pYy0+cGFja2V0bGVuIC09IDY7CiNpZglTTUM5MDAwX0RFQlVHID4gMgogICAgICBwcmludGYoIiBSZWFkaW5nICVkIHdvcmRzIChhbmQgJWQgYnl0ZShzKSlcbiIsCgkgICAgICAgKG5pYy0+cGFja2V0bGVuID4+IDEpLCBuaWMtPnBhY2tldGxlbiAmIDEpOwojZW5kaWYKICAgICAgLyogcmVhZCB0aGUgcGFja2V0IChhbmQgdGhlIGxhc3QgImV4dHJhIiB3b3JkKSAqLwogICAgICBpbnN3KG5pYy0+aW9hZGRyICsgREFUQV8xLCBuaWMtPnBhY2tldCwgKG5pYy0+cGFja2V0bGVuKzIpID4+IDEpOwogICAgICAvKiBpcyB0aGVyZSBhbiBvZGQgbGFzdCBieXRlID8gKi8KICAgICAgaWYgKG5pYy0+cGFja2V0W25pYy0+cGFja2V0bGVuKzFdICYgMHgyMCkKCSBuaWMtPnBhY2tldGxlbisrOwoKICAgICAgLyogIGVycm9yIG9yIGdvb2QsIHRlbGwgdGhlIGNhcmQgdG8gZ2V0IHJpZCBvZiB0aGlzIHBhY2tldCAqLwogICAgICBfb3V0dyhNQ19SRUxFQVNFLCBuaWMtPmlvYWRkciArIE1NVV9DTUQpOwogICAgICByZXR1cm4gMTsKICAgfQoKICAgcHJpbnRmKCJTTUM5MDAwOiBSWCBlcnJvclxuIik7CiAgIC8qICBlcnJvciBvciBnb29kLCB0ZWxsIHRoZSBjYXJkIHRvIGdldCByaWQgb2YgdGhpcyBwYWNrZXQgKi8KICAgX291dHcoTUNfUkVMRUFTRSwgbmljLT5pb2FkZHIgKyBNTVVfQ01EKTsKICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIHNtYzkwMDBfZGlzYWJsZSAoIHN0cnVjdCBuaWMgKm5pYywgc3RydWN0IGlzYV9kZXZpY2UgKmlzYSBfX3VudXNlZCApIHsKCiAgIHNtY19yZXNldChuaWMtPmlvYWRkcik7CgogICAvKiBubyBtb3JlIGludGVycnVwdHMgZm9yIG1lICovCiAgIFNNQ19TRUxFQ1RfQkFOSyhuaWMtPmlvYWRkciwgMik7CiAgIF9vdXRiKCAwLCBuaWMtPmlvYWRkciArIElOVF9NQVNLKTsKCiAgIC8qIGFuZCB0ZWxsIHRoZSBjYXJkIHRvIHN0YXkgYXdheSBmcm9tIHRoYXQgbmFzdHkgb3V0c2lkZSB3b3JsZCAqLwogICBTTUNfU0VMRUNUX0JBTksobmljLT5pb2FkZHIsIDApOwogICBfb3V0YiggUkNSX0NMRUFSLCBuaWMtPmlvYWRkciArIFJDUiApOwogICBfb3V0YiggVENSX0NMRUFSLCBuaWMtPmlvYWRkciArIFRDUiApOwp9CgpzdGF0aWMgdm9pZCBzbWM5MDAwX2lycShzdHJ1Y3QgbmljICpuaWMgX191bnVzZWQsIGlycV9hY3Rpb25fdCBhY3Rpb24gX191bnVzZWQpCnsKICBzd2l0Y2ggKCBhY3Rpb24gKSB7CiAgY2FzZSBESVNBQkxFIDoKICAgIGJyZWFrOwogIGNhc2UgRU5BQkxFIDoKICAgIGJyZWFrOwogIGNhc2UgRk9SQ0UgOgogICAgYnJlYWs7CiAgfQp9CgpzdGF0aWMgc3RydWN0IG5pY19vcGVyYXRpb25zIHNtYzkwMDBfb3BlcmF0aW9ucyA9IHsKCS5jb25uZWN0CT0gZHVtbXlfY29ubmVjdCwKCS5wb2xsCQk9IHNtYzkwMDBfcG9sbCwKCS50cmFuc21pdAk9IHNtYzkwMDBfdHJhbnNtaXQsCgkuaXJxCQk9IHNtYzkwMDBfaXJxLAoKfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBFVEhfUFJPQkUgLSBMb29rIGZvciBhbiBhZGFwdGVyCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgaW50IHNtYzkwMDBfcHJvYmUgKCBzdHJ1Y3QgbmljICpuaWMsIHN0cnVjdCBpc2FfZGV2aWNlICppc2EgKSB7CgogICB1bnNpZ25lZCBzaG9ydCAgIHJldmlzaW9uOwogICBpbnQJICAgICAgICAgICAgbWVtb3J5OwogICBpbnQgICAgICAgICAgICAgIG1lZGlhOwogICBjb25zdCBjaGFyICoJICAgIHZlcnNpb25fc3RyaW5nOwogICBjb25zdCBjaGFyICoJICAgIGlmX3N0cmluZzsKICAgaW50ICAgICAgICAgICAgICBpOwoKICAgbmljLT5pcnFubyAgPSAwOwogICBuaWMtPmlvYWRkciA9IGlzYS0+aW9hZGRyOwoKICAgLyoKICAgICogR2V0IHRoZSBNQUMgYWRkcmVzcyAoIGJhbmsgMSwgcmVncyA0IC0gOSApCiAgICAqLwogICBTTUNfU0VMRUNUX0JBTksobmljLT5pb2FkZHIsIDEpOwogICBmb3IgKCBpID0gMDsgaSA8IDY7IGkgKz0gMiApIHsKICAgICAgd29yZCBhZGRyZXNzOwoKICAgICAgYWRkcmVzcyA9IGludyhuaWMtPmlvYWRkciArIEFERFIwICsgaSk7CiAgICAgIG5pYy0+bm9kZV9hZGRyW2krMV0gPSBhZGRyZXNzID4+IDg7CiAgICAgIG5pYy0+bm9kZV9hZGRyW2ldID0gYWRkcmVzcyAmIDB4RkY7CiAgIH0KCiAgIC8qIGdldCB0aGUgbWVtb3J5IGluZm9ybWF0aW9uICovCiAgIFNNQ19TRUxFQ1RfQkFOSyhuaWMtPmlvYWRkciwgMCk7CiAgIG1lbW9yeSA9ICggaW53KG5pYy0+aW9hZGRyICsgTUNSKSA+PiA5ICkgICYgMHg3OyAgLyogbXVsdGlwbGllciAqLwogICBtZW1vcnkgKj0gMjU2ICogKGludyhuaWMtPmlvYWRkciArIE1JUikgJiAweEZGKTsKCiAgIC8qCiAgICAqIE5vdywgSSB3YW50IHRvIGZpbmQgb3V0IG1vcmUgYWJvdXQgdGhlIGNoaXAuICBUaGlzIGlzIHNvcnQgb2YKICAgICogcmVkdW5kYW50LCBidXQgaXQncyBjbGVhbmVyIHRvIGhhdmUgaXQgaW4gYm90aCwgcmF0aGVyIHRoYW4gaGF2aW5nCiAgICAqIG9uZSBWRVJZIGxvbmcgcHJvYmUgcHJvY2VkdXJlLgogICAgKi8KICAgU01DX1NFTEVDVF9CQU5LKG5pYy0+aW9hZGRyLCAzKTsKICAgcmV2aXNpb24gID0gaW53KG5pYy0+aW9hZGRyICsgUkVWSVNJT04pOwogICB2ZXJzaW9uX3N0cmluZyA9IGNoaXBfaWRzWyhyZXZpc2lvbiA+PiA0KSAmIDB4Rl07CgogICBpZiAoKChyZXZpc2lvbiAmIDB4RjApID4+IDQgPT0gQ0hJUF85MTk2KSAmJgogICAgICAgKChyZXZpc2lvbiAmIDB4MEYpID49IFJFVl85MTk2KSkgewogICAgICAvKiBUaGlzIGlzIGEgOTFjOTYuICdjOTYgaGFzIHRoZSBzYW1lIGNoaXAgaWQgYXMgJ2M5NCAoNCkgYnV0CiAgICAgICAqIGEgcmV2aXNpb24gc3RhcnRpbmcgYXQgNiAqLwogICAgICB2ZXJzaW9uX3N0cmluZyA9IHNtYzkxYzk2X2lkOwogICB9CgogICBpZiAoICF2ZXJzaW9uX3N0cmluZyApIHsKICAgICAgLyogSSBzaG91bGRuJ3QgZ2V0IGhlcmUgYmVjYXVzZSB0aGlzIGNhbGwgd2FzIGRvbmUgYmVmb3JlLi4uLiAqLwogICAgICByZXR1cm4gMDsKICAgfQoKICAgLyogaXMgaXQgdXNpbmcgQVVJIG9yIDEwQmFzZVQgPyAqLwogICBTTUNfU0VMRUNUX0JBTksobmljLT5pb2FkZHIsIDEpOwogICBpZiAoaW53KG5pYy0+aW9hZGRyICsgQ09ORklHKSAmIENGR19BVUlfU0VMRUNUKQogICAgIG1lZGlhID0gMjsKICAgZWxzZQogICAgIG1lZGlhID0gMTsKCiAgIGlmX3N0cmluZyA9IGludGVyZmFjZXNbbWVkaWEgLSAxXTsKCiAgIC8qIG5vdywgcmVzZXQgdGhlIGNoaXAsIGFuZCBwdXQgaXQgaW50byBhIGtub3duIHN0YXRlICovCiAgIHNtY19yZXNldChuaWMtPmlvYWRkcik7CgogICBwcmludGYoIlNNQzkwMDAgJXNcbiIsIHNtYzkwMDBfdmVyc2lvbik7CiAgIERCRygiQ29weXJpZ2h0IChDKSAxOTk4IERhbmllbCBFbmdzdHJceDk0bVxuIik7CiAgIERCRygiQ29weXJpZ2h0IChDKSAxOTk2IEVyaWMgU3RhaGxtYW5cbiIpOwoKICAgcHJpbnRmKCIlcyByZXY6JWQgSS9PIHBvcnQ6JWhYIEludGVyZmFjZTolcyBSQU06JWQgYnl0ZXMgXG4iLAoJICB2ZXJzaW9uX3N0cmluZywgcmV2aXNpb24gJiAweEYsCgkgIG5pYy0+aW9hZGRyLCBpZl9zdHJpbmcsIG1lbW9yeSApOwoKICAgREJHICggIkV0aGVybmV0IE1BQyBhZGRyZXNzOiAlc1xuIiwgZXRoX250b2EgKCBuaWMtPm5vZGVfYWRkciApICk7CgogICBTTUNfU0VMRUNUX0JBTksobmljLT5pb2FkZHIsIDApOwoKICAgLyogc2VlIHRoZSBoZWFkZXIgZmlsZSBmb3Igb3B0aW9ucyBpbiBUQ1IvUkNSIE5PUk1BTCovCiAgIF9vdXR3KFRDUl9OT1JNQUwsIG5pYy0+aW9hZGRyICsgVENSKTsKICAgX291dHcoUkNSX05PUk1BTCwgbmljLT5pb2FkZHIgKyBSQ1IpOwoKICAgLyogU2VsZWN0IHdoaWNoIGludGVyZmFjZSB0byB1c2UgKi8KICAgU01DX1NFTEVDVF9CQU5LKG5pYy0+aW9hZGRyLCAxKTsKICAgaWYgKCBtZWRpYSA9PSAxICkgewogICAgICBfb3V0dyggaW53KCBuaWMtPmlvYWRkciArIENPTkZJRyApICYgfkNGR19BVUlfU0VMRUNULAoJICAgbmljLT5pb2FkZHIgKyBDT05GSUcgKTsKICAgfQogICBlbHNlIGlmICggbWVkaWEgPT0gMiApIHsKICAgICAgX291dHcoIGludyggbmljLT5pb2FkZHIgKyBDT05GSUcgKSB8IENGR19BVUlfU0VMRUNULAoJICAgbmljLT5pb2FkZHIgKyBDT05GSUcgKTsKICAgfQoKICAgc21jX3BoeV9jb25maWd1cmUobmljLT5pb2FkZHIpOwogCiAgIG5pYy0+bmljX29wCT0gJnNtYzkwMDBfb3BlcmF0aW9uczsKICAgcmV0dXJuIDE7Cn0KCi8qCiAqIFRoZSBTTUM5MDAwIGNhbiBiZSBhdCBhbnkgb2YgdGhlIGZvbGxvd2luZyBwb3J0IGFkZHJlc3Nlcy4gIFRvCiAqIGNoYW5nZSBmb3IgYSBzbGlnaHRseSBkaWZmZXJlbnQgY2FyZCwgeW91IGNhbiBhZGQgaXQgdG8gdGhlIGFycmF5LgogKgogKi8Kc3RhdGljIGlzYV9wcm9iZV9hZGRyX3Qgc21jOTAwMF9wcm9iZV9hZGRyc1tdID0gewogICAweDIwMCwgMHgyMjAsIDB4MjQwLCAweDI2MCwgMHgyODAsIDB4MkEwLCAweDJDMCwgMHgyRTAsCiAgIDB4MzAwLCAweDMyMCwgMHgzNDAsIDB4MzYwLCAweDM4MCwgMHgzQTAsIDB4M0MwLCAweDNFMCwKfTsKCklTQV9EUklWRVIgKCBzbWM5MDAwX2RyaXZlciwgc21jOTAwMF9wcm9iZV9hZGRycywgc21jOTAwMF9wcm9iZV9hZGRyLAoJCSAgICAgR0VORVJJQ19JU0FQTlBfVkVORE9SLCAweDgyMjggKTsKCkRSSVZFUiAoICJTTUM5MDAwIiwgbmljX2RyaXZlciwgaXNhX2RyaXZlciwgc21jOTAwMF9kcml2ZXIsCgkgc21jOTAwMF9wcm9iZSwgc21jOTAwMF9kaXNhYmxlICk7CgpJU0FfUk9NICggInNtYzkwMDAiLCAiU01DOTAwMCIgKTsKCi8qCiAqIExvY2FsIHZhcmlhYmxlczoKICogIGMtYmFzaWMtb2Zmc2V0OiA4CiAqICBjLWluZGVudC1sZXZlbDogOAogKiAgdGFiLXdpZHRoOiA4CiAqIEVuZDoKICovCg==