LyoKICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQgVGhlIFJlZ2VudHMgb2YgVGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4KICogQ29weXJpZ2h0IChjKSAxOTkzIFRoZSBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueQogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQogKiBtZXQ6IHJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcjsKICogcmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uOwogKiBuZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cwogKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQogKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCiAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgogKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAogKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAogKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCiAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAqLwoKLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE01IENvbnNvbGUKICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CgojZGVmaW5lIENPTlNPTEUKI2luY2x1ZGUgImFjY2Vzcy5oIgojaW5jbHVkZSAiY3NlcnZlLmgiCiNpbmNsdWRlICJycGIuaCIKCiNkZWZpbmUgQ09OU19JTlRfVFggICAweDAxICAvKiBpbnRlcnJ1cHQgZW5hYmxlIC8gc3RhdGUgYml0cyAqLwojZGVmaW5lIENPTlNfSU5UX1JYICAgMHgwMgoKI2RlZmluZSBQQUdFX1NJWkUgKDgxOTIpCgojZGVmaW5lIEtTVEFDS19SRUdJT05fVkEgMHgyMDA0MDAwMAoKI2RlZmluZSBLU0VHICAgMHhmZmZmZmMwMDAwMDAwMDAwCiNkZWZpbmUgSzFCQVNFIDB4ZmZmZmZjODAwMDAwMDAwMAojZGVmaW5lIEtTRUdfVE9fUEhZUyh4KSAoKCh1bG9uZyl4KSAmIH5LU0VHKQoKI2RlZmluZSBST1VORFVQOCh4KSAoKHVsb25nKSgoKHVsb25nKXgpKzcpICYgfjcpCiNkZWZpbmUgUk9VTkRVUDEyOCh4KSAoKHVsb25nKSgoKHVsb25nKXgpICsgMTI3KSAmIH4xMjcpCiNkZWZpbmUgUk9VTkRVUDhLKHgpICgodWxvbmcpKCgodWxvbmcpKHgpKSArIDgxOTEpICYgfjgxOTEpCgojZGVmaW5lIEZJUlNUKHgpICAoKCgodWxvbmcpKHgpKSA+PiAzMykgJiAweDNmZikKI2RlZmluZSBTRUNPTkQoeCkgKCgoKHVsb25nKSh4KSkgPj4gMjMpICYgMHgzZmYpCiNkZWZpbmUgVEhJUkQoeCkgKCgoKHVsb25nKSh4KSkgPj4gMTMpICYgMHgzZmYpCiNkZWZpbmUgVEhJUkRfWFhYKHgpICAoKCgodWxvbmcpKHgpKSA+PiAxMykgJiAweGZmZikKI2RlZmluZSBQRk4oeCkgICgoKCh1bG9uZykoeCkgJiB+S1NFRykgPj4gMTMpKQoKLyogS2VybmVsIHdyaXRlIHwga2VybmVsIHJlYWQgfCB2YWxpZCAqLwojZGVmaW5lIEtQVEUoeCkgKCh1bG9uZykoKCgodWxvbmcpKHgpKSA8PCAzMikgfCAweDExMDEpKQoKI2RlZmluZSBIV1JQQl9QQUdFUyAxNgoKI2RlZmluZSBOVU1fS0VSTkVMX1RISVJEICg0KQoKI2RlZmluZSBwcmludGZfbG9jayhhcmdzLi4uKQkJXAogICAgZG8gewkJCQlcCiAgICAgICAgU3BpbkxvY2soJnRoZUxvY2spOwkJXAogICAgICAgIHByaW50ZihhcmdzKTsJCQlcCiAgICAgICAgU3BpblVubG9jaygmdGhlTG9jayk7CQlcCiAgICB9IHdoaWxlICgwKQoKCnZvaWQgdW5peEJvb3QoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKdm9pZCBKVG9LZXJuKGNoYXIgKmJvb3RhZHIsIHVsb25nIHJwYl9wZXJjcHUsIHVsb25nIGZyZWVfcGZuLCB1bG9uZyBrX2FyZ2MsCiAgICAgICAgICAgICBjaGFyICoqa19hcmd2LCBjaGFyICoqZW52cCk7CnZvaWQgSlRvUGFsKHVsb25nIGJvb3RhZHIpOwp2b2lkIFNsYXZlTG9vcChpbnQgY3B1KTsKCnZvbGF0aWxlIHN0cnVjdCBBbHBoYUFjY2VzcyAqbTVBbHBoYUFjY2VzczsKc3RydWN0IEFscGhhQWNjZXNzIG01Q29uZjsKCnVsb25nIHRoZUxvY2s7CgpleHRlcm4gdm9pZCBTcGluTG9jayh1bG9uZyAqbG9jayk7CiNkZWZpbmUgU3BpblVubG9jayhfeCkgKihfeCkgPSAwOwoKc3RydWN0IF9rZXJuZWxfcGFyYW1zIHsKICAgIGNoYXIgKmJvb3RhZHI7CiAgICB1bG9uZyBycGJfcGVyY3B1OwogICAgdWxvbmcgZnJlZV9wZm47CiAgICB1bG9uZyBhcmdjOwogICAgdWxvbmcgYXJndjsKICAgIHVsb25nIGVudnA7IC8qIE5VTEwgKi8KfTsKCmV4dGVybiBjb25zb2xlQ2FsbGJhY2tbXTsKZXh0ZXJuIGNvbnNvbGVGaXh1cFtdOwpsb25nIENhbGxCYWNrRGlzcGF0Y2hlcigpOwpsb25nIENhbGxCYWNrRml4dXAoKTsKCi8qCiAqIG01IGNvbnNvbGUgb3V0cHV0CiAqLwoKdm9pZApJbml0Q29uc29sZSgpCnsKfQoKY2hhcgpHZXRDaGFyKCkKewogICAgcmV0dXJuIG01QWxwaGFBY2Nlc3MtPmlucHV0Q2hhcjsKfQoKdm9pZApQdXRDaGFyKGNoYXIgYykKewogICAgbTVBbHBoYUFjY2Vzcy0+b3V0cHV0Q2hhciA9IGM7Cn0KCmludApwYXNzQXJncyhpbnQgYXJnYykKewogICAgcmV0dXJuIDA7Cn0KCmludAptYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewogICAgaW50IHgsIGk7CiAgICB1aW50ICprMXB0ciwgKmtzZWdwdHI7CgogICAgSW5pdENvbnNvbGUoKTsKICAgIHByaW50Zl9sb2NrKCJNNSBjb25zb2xlOiBtNUFscGhhQWNjZXNzIEAgMHgleFxuIiwgbTVBbHBoYUFjY2Vzcyk7CgogICAgLyoKICAgICAqIGdldCBjb25maWd1cmF0aW9uIGZyb20gYmFja2Rvb3IKICAgICAqLwogICAgbTVDb25mLmxhc3Rfb2Zmc2V0ID0gbTVBbHBoYUFjY2Vzcy0+bGFzdF9vZmZzZXQ7CiAgICBwcmludGZfbG9jaygiR290IENvbmZpZ3VyYXRpb24gJWRcbiIsIG01Q29uZi5sYXN0X29mZnNldCk7CgogICAgbTVDb25mLmxhc3Rfb2Zmc2V0ID0gbTVBbHBoYUFjY2Vzcy0+bGFzdF9vZmZzZXQ7CiAgICBtNUNvbmYudmVyc2lvbiA9IG01QWxwaGFBY2Nlc3MtPnZlcnNpb247CiAgICBtNUNvbmYubnVtQ1BVcyA9IG01QWxwaGFBY2Nlc3MtPm51bUNQVXM7CiAgICBtNUNvbmYuaW50ckNsb2NrRnJlcXVlbmN5ID0gbTVBbHBoYUFjY2Vzcy0+aW50ckNsb2NrRnJlcXVlbmN5OwogICAgbTVDb25mLmNwdUNsb2NrID0gbTVBbHBoYUFjY2Vzcy0+Y3B1Q2xvY2s7CiAgICBtNUNvbmYubWVtX3NpemUgPSBtNUFscGhhQWNjZXNzLT5tZW1fc2l6ZTsKICAgIG01Q29uZi5rZXJuU3RhcnQgPSBtNUFscGhhQWNjZXNzLT5rZXJuU3RhcnQ7CiAgICBtNUNvbmYua2VybkVuZCA9IG01QWxwaGFBY2Nlc3MtPmtlcm5FbmQ7CiAgICBtNUNvbmYuZW50cnlQb2ludCA9IG01QWxwaGFBY2Nlc3MtPmVudHJ5UG9pbnQ7CiAgICBtNUNvbmYuZGlza1VuaXQgPSBtNUFscGhhQWNjZXNzLT5kaXNrVW5pdDsKICAgIG01Q29uZi5kaXNrQ291bnQgPSBtNUFscGhhQWNjZXNzLT5kaXNrQ291bnQ7CiAgICBtNUNvbmYuZGlza1BBZGRyID0gbTVBbHBoYUFjY2Vzcy0+ZGlza1BBZGRyOwogICAgbTVDb25mLmRpc2tCbG9jayA9IG01QWxwaGFBY2Nlc3MtPmRpc2tCbG9jazsKICAgIG01Q29uZi5kaXNrT3BlcmF0aW9uID0gbTVBbHBoYUFjY2Vzcy0+ZGlza09wZXJhdGlvbjsKICAgIG01Q29uZi5vdXRwdXRDaGFyID0gbTVBbHBoYUFjY2Vzcy0+b3V0cHV0Q2hhcjsKICAgIG01Q29uZi5pbnB1dENoYXIgPSBtNUFscGhhQWNjZXNzLT5pbnB1dENoYXI7CgogICAgaWYgKG01Q29uZi52ZXJzaW9uICE9IEFMUEhBX0FDQ0VTU19WRVJTSU9OKSAgewogICAgICAgIHBhbmljKCJDb25zb2xlIHZlcnNpb24gbWlzbWF0Y2guIENvbnNvbGUgZXhwZWN0cyAlZC4gaGFzICVkIFxuIiwKICAgICAgICAgICAgICBBTFBIQV9BQ0NFU1NfVkVSU0lPTiwgbTVDb25mLnZlcnNpb24pOwogICAgfQoKICAgIC8qCiAgICAgKiBzZXR1cCBhcmd1bWVudHMgdG8ga2VybmVsCiAgICAgKi8KICAgIHVuaXhCb290KGFyZ2MsIGFyZ3YpOwoKICAgIHBhbmljKCJ1bml4IGZhaWxlZCB0byBib290XG4iKTsKICAgIHJldHVybiAxOwp9CgovKgogKiBCT09USU5HCiAqLwpzdHJ1Y3QgcnBiIG01X3JwYiA9IHsKICAgIE5VTEwsCQkvKiAwMDA6IHBoeXNpY2FsIHNlbGYtcmVmZXJlbmNlICovCiAgICAoKGxvbmcpJ0gnKSB8ICgoKGxvbmcpJ1cnKSA8PCA4KSB8ICgoKGxvbmcpJ1InKSA8PCAxNikgfAogICAgKChsb25nKSdQJyA8PCAyNCkgfCAoKChsb25nKSdCJykgPDwgMzIpLCAgLyogMDA4OiBjb250YWlucyAiSFdSUEIiICovCiAgICA2LAkJCS8qIDAxMDogSFdSUEIgdmVyc2lvbiBudW1iZXIgKi8KICAgIC8qIHRoZSBieXRlIGNvdW50IGlzIHdyb25nLCBidXQgd2hvIG5lZWRzIGl0PyAtIGxhbmNlICovCiAgICAwLAkJCS8qIDAxODogYnl0ZXMgaW4gUlBCIHBlckNQVSBDVEIgQ1JCIE1FRFNDICovCiAgICAwLAkJCS8qIDAyMDogcHJpbWFyeSBjcHUgaWQgKi8KICAgIFBBR0VfU0laRSwJCS8qIDAyODogcGFnZSBzaXplIGluIGJ5dGVzICovCiAgICA0MywJCQkvKiAwMzA6IG51bWJlciBvZiBwaHlzIGFkZHIgYml0cyAqLwogICAgMTI3LAkJLyogMDM4OiBtYXggdmFsaWQgQVNOICovCiAgICB7JzAnLCcwJywnMCcsJzAnLCcwJywnMCcsJzAnLCcwJywnMCcsJzAnLCcwJywnMCcsJzAnLCcwJywnMCcsJzEnfSwKICAgICAgICAgICAgICAgICAgICAgICAgLyogMDQwOiBzeXN0ZW0gc2VyaWFsIG51bTogMTAgYXNjaWkgY2hhcnMgKi8KICAgIDAsIC8qIE9WRVJSSURERU4gKi8KICAgICgxPDwxMCksCQkvKiAwNTg6IHN5c3RlbSB2YXJpYXRpb24gKi8KICAgICdjJ3woJ28nPDw4KXwoJ28nPDwxNil8KCdsJzw8IDI0KSwJLyogMDYwOiBzeXN0ZW0gcmV2aXNpb24gKi8KICAgIDEwMjQqNDA5NiwJCS8qIDA2ODogc2NhbGVkIGludGVydmFsIGNsb2NrIGludHIgZnJlcSAqLwogICAgMCwJCQkvKiAwNzA6IGN5Y2xlIGNvdW50ZXIgZnJlcXVlbmN5ICovCiAgICAweDIwMDAwMDAwMCwJLyogMDc4OiB2aXJ0dWFsIHBhZ2UgdGFibGUgYmFzZSAqLwogICAgMCwJCQkvKiAwODA6IHJlc2VydmVkICovCiAgICAwLAkJCS8qIDA4ODogb2Zmc2V0IHRvIHRyYW5zbGF0aW9uIGJ1ZmZlciBoaW50ICovCiAgICAxLAkJCS8qIDA5MDogbnVtYmVyIG9mIHByb2Nlc3NvciBzbG90cyBPVkVSUklEREVOKi8KICAgIHNpemVvZihzdHJ1Y3QgcnBiX3BlcmNwdSksCS8qIDA5ODogcGVyLWNwdSBzbG90IHNpemUuIE9WRVJSSURERU4gKi8KICAgIDAsCQkJLyogMEEwOiBvZmZzZXQgdG8gcGVyX2NwdSBzbG90cyAqLwogICAgMSwJCQkvKiAwQTg6IG51bWJlciBvZiBDVEJzICovCiAgICBzaXplb2Yoc3RydWN0IGN0Yl90dCksCiAgICAwLAkJCS8qIDBCODogb2Zmc2V0IHRvIENUQiAoY29ucyB0ZXJtIGJsb2NrKSAqLwogICAgMCwJCQkvKiAwQzA6IG9mZnNldCB0byBDUkIgKGNvbnMgcm91dGluZSBibG9jaykgKi8KICAgIDAsCQkJLyogMEM4OiBvZmZzZXQgdG8gbWVtb3J5IGRlc2NyaXB0b3IgdGFibGUgKi8KICAgIDAsCQkJLyogMEQwOiBvZmZzZXQgdG8gY29uZmlnIGRhdGEgYmxvY2sgKi8KICAgIDAsCQkJLyogMEQ4OiBvZmZzZXQgdG8gRlJVIHRhYmxlICovCiAgICAwLAkJCS8qIDBFMDogdmlydCBhZGRyIG9mIHNhdmUgdGVybSByb3V0aW5lICovCiAgICAwLAkJCS8qIDBFODogcHJvYyB2YWx1ZSBmb3Igc2F2ZSB0ZXJtIHJvdXRpbmUgKi8KICAgIDAsCQkJLyogMEYwOiB2aXJ0IGFkZHIgb2YgcmVzdG9yZSB0ZXJtIHJvdXRpbmUgKi8KICAgIDAsCQkJLyogMEY4OiBwcm9jIHZhbHVlIGZvciByZXN0b3JlIHRlcm0gcm91dGluZSAqLwogICAgMCwJCQkvKiAxMDA6IHZpcnQgYWRkciBvZiBDUFUgcmVzdGFydCByb3V0aW5lICovCiAgICAwLAkJCS8qIDEwODogcHJvYyB2YWx1ZSBmb3IgQ1BVIHJlc3RhcnQgcm91dGluZSAqLwogICAgMCwJCQkvKiAxMTA6IHVzZWQgdG8gZGV0ZXJtaW5lIHByZXNlbmNlIG9mIGtkZWJ1ZyAqLwogICAgMCwJCQkvKiAxMTg6IHJlc2VydmVkIGZvciBoYXJkd2FyZSAqLwovKiB0aGUgY2hlY2tzdW0gaXMgd3JvbmcsIGJ1dCB3aG8gbmVlZHMgaXQ/IC0gbGFuY2UgKi8KICAgIDAsCQkJLyogMTIwOiBjaGVja3N1bSBvZiBwcmlvciBlbnRyaWVzIGluIHJwYiAqLwogICAgMCwJCQkvKiAxMjg6IHJlY2VpdmUgcmVhZHkgYml0bWFzayAqLwogICAgMCwJCQkvKiAxMzA6IHRyYW5zbWl0IHJlYWR5IGJpdG1hc2sgKi8KICAgIDAsCQkJLyogMTM4OiBEeW5hbWljIFN5c3RlbSBSZWNvZy4gb2Zmc2V0ICovCn07Cgp1bG9uZyBtNV90YmJbXSA9IHsgMHgxZTFlMWUxZTFlMWUxZTFlLCAweDFlMWUxZTFlMWUxZTFlMWUsCiAgICAgICAgICAgICAgICAgICAweDFlMWUxZTFlMWUxZTFlMWUsIDB4MWUxZTFlMWUxZTFlMWUxZSwKICAgICAgICAgICAgICAgICAgIDB4MWUxZTFlMWUxZTFlMWUxZSwgMHgxZTFlMWUxZTFlMWUxZTFlLAogICAgICAgICAgICAgICAgICAgMHgxZTFlMWUxZTFlMWUxZTFlLCAweDFlMWUxZTFlMWUxZTFlMWUgfTsKCnN0cnVjdCBycGJfcGVyY3B1IG01X3JwYl9wZXJjcHUgPSB7CiAgICB7MCwwLDAsMCwwLDAsMSx7MCwwfSx7MCwwLDAsMCwwLDAsMCwwfX0sIC8qIDAwMDogYm9vdC9yZXN0YXJ0IEhXUENCICovCiAgICAoU1RBVEVfUEEgfCBTVEFURV9QUCB8IFNUQVRFX0NWIHwKICAgICBTVEFURV9QViB8IFNUQVRFX1BNViB8IFNUQVRFX1BMKSwgCS8qIDA4MDogcGVyLWNwdSBzdGF0ZSBiaXRzICovCiAgICAweGMwMDAsCQkJCS8qIDA4ODogcGFsY29kZSBtZW1vcnkgbGVuZ3RoICovCiAgICAweDIwMDAsCQkJCS8qIDA5MDogcGFsY29kZSBzY3JhdGNoIGxlbmd0aCAqLwogICAgMHg0MDAwLAkJCQkvKiAwOTg6IHBhZGRyIG9mIHBhbCBtZW0gc3BhY2UgKi8KICAgIDB4MjAwMCwJCQkJLyogMEEwOiBwYWRkciBvZiBwYWwgc2NyYXRjaCBzcGFjZSAqLwogICAgKDIgPDwgMTYpIHwgKDUgPDwgOCkgfCAxLAkJLyogMEE4OiBQQUxjb2RlIHJldiByZXF1aXJlZCAqLwogICAgMTEgfCAoMkwgIDw8IDMyKSwJCQkvKiAwQjA6IHByb2Nlc3NvciB0eXBlICovCiAgICA3LAkJCQkJLyogMEI4OiBwcm9jZXNzb3IgdmFyaWF0aW9uICovCiAgICAnTSd8KCc1Jzw8OCl8KCdBJzw8MTYpfCgnMCc8PDI0KSwJLyogMEMwOiBwcm9jZXNzb3IgcmV2aXNpb24gKi8KICAgIHsnTScsJzUnLCcvJywnQScsJ2wnLCdwJywnaCcsJ2EnLCcwJywnMCcsJzAnLCcwJywnMCcsJzAnLCcwJywnMCd9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMEM4OiBwcm9jIHNlcmlhbCBudW06IDEwIGNoYXJzICovCiAgICAwLAkJCQkJLyogMEQ4OiBwaHlzIGFkZHIgb2YgbG9nb3V0IGFyZWEgKi8KICAgIDAsCQkJCQkvKiAwRTA6IGxlbiBpbiBieXRlcyBvZiBsb2dvdXQgYXJlYSAqLwogICAgMCwJCQkJCS8qIDBFODogaGFsdCBwY2IgYmFzZSAqLwogICAgMCwJCQkJCS8qIDBGMDogaGFsdCBwYyAqLwogICAgMCwJCQkJCS8qIDBGODogaGFsdCBwcyAqLwogICAgMCwJCQkJCS8qIDEwMDogaGFsdCBhcmcgbGlzdCAoUjI1KSAqLwogICAgMCwJCQkJCS8qIDEwODogaGFsdCByZXR1cm4gYWRkcmVzcyAoUjI2KSAqLwogICAgMCwJCQkJCS8qIDExMDogaGFsdCBwcm9jZWR1cmUgdmFsdWUgKFIyNykgKi8KICAgIDAsCQkgICAgICAgCQkJLyogMTE4OiByZWFzb24gZm9yIGhhbHQgKi8KICAgIDAsCQkgICAgICAgCQkJLyogMTIwOiBmb3Igc29mdHdhcmUgKi8KICAgIHswfSwJCQkJLyogMTI4OiBpbnRlci1jb25zb2xlIGNvbW0gYnVmZmVyICovCiAgICB7MSwwLDUsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sCS8qIDFEMDogUEFMY29kZSByZXZzIGF2YWlsYWJsZSAqLwogICAgMAkJCQkJLyogMjUwOiByZXNlcnZlZCBmb3IgYXJjaCB1c2UgKi8KLyogdGhlIGR1bXAgc3RhY2sgZ3Jvd3MgZnJvbSB0aGUgZW5kIG9mIHRoZSBycGIgcGFnZSBub3QgdG8gcmVhY2ggaGVyZSAqLwp9OwoKc3RydWN0IF9tNV9ycGJfbWR0IHsKICAgIGxvbmcgICBycGJfY2hlY2tzdW07CS8qIDAwMDogY2hlY2tzdW0gb2YgZW50aXJlIG1lbSBkZXNjIHRhYmxlICovCiAgICBsb25nICAgcnBiX2ltcGFkZHI7CQkvKiAwMDg6IFBBIG9mIGltcGxlbWVudGF0aW9uIGRlcCBpbmZvICovCiAgICBsb25nICAgcnBiX251bWNsOwkJLyogMDEwOiBudW1iZXIgb2YgY2x1c3RlcnMgKi8KICAgIHN0cnVjdCBycGJfY2x1c3RlciBycGJfY2x1c3RlclszXTsJLyogZmlyc3QgaW5zdGFuY2Ugb2YgYSBjbHVzdGVyICovCn07CgpzdHJ1Y3QgX201X3JwYl9tZHQgbTVfcnBiX21kdCA9IHsKICAgIDAsCQkJLyogMDAwOiBjaGVja3N1bSBvZiBlbnRpcmUgbWVtIGRlc2MgdGFibGUgKi8KICAgIDAsCQkJLyogMDA4OiBQQSBvZiBpbXBsZW1lbnRhdGlvbiBkZXAgaW5mbyAqLwogICAgMCwJCQkvKiAwMTA6IG51bWJlciBvZiBjbHVzdGVycyAqLwogICAge3sJMCwJCS8qIDAwMDogc3RhcnRpbmcgUEZOIG9mIHRoaXMgY2x1c3RlciAqLwogICAgICAgIDAsCQkvKiAwMDg6IGNvdW50IG9mIFBGTnMgaW4gdGhpcyBjbHVzdGVyICovCiAgICAgICAgMCwJCS8qIDAxMDogY291bnQgb2YgdGVzdGVkIFBGTnMgaW4gY2x1c3RlciAqLwogICAgICAgIDAsCQkvKiAwMTg6IHZhIG9mIGJpdG1hcCAqLwogICAgICAgIDAsCQkvKiAwMjA6IHBhIG9mIGJpdG1hcCAqLwogICAgICAgIDAsCQkvKiAwMjg6IGNoZWNrc3VtIG9mIGJpdG1hcCAqLwogICAgICAgIDEJCS8qIDAzMDogdXNhZ2Ugb2YgY2x1c3RlciAqLwogICAgIH0sCiAgICAgeyAgIDAsCQkvKiAwMDA6IHN0YXJ0aW5nIFBGTiBvZiB0aGlzIGNsdXN0ZXIgKi8KICAgICAgICAgMCwJCS8qIDAwODogY291bnQgb2YgUEZOcyBpbiB0aGlzIGNsdXN0ZXIgKi8KICAgICAgICAgMCwJCS8qIDAxMDogY291bnQgb2YgdGVzdGVkIFBGTnMgaW4gY2x1c3RlciAqLwogICAgICAgICAwLAkJLyogMDE4OiB2YSBvZiBiaXRtYXAgKi8KICAgICAgICAgMCwJCS8qIDAyMDogcGEgb2YgYml0bWFwICovCiAgICAgICAgIDAsCQkvKiAwMjg6IGNoZWNrc3VtIG9mIGJpdG1hcCAqLwogICAgICAgICAwCQkvKiAwMzA6IHVzYWdlIG9mIGNsdXN0ZXIgKi8KICAgICB9LAogICAgIHsgICAwLAkJLyogMDAwOiBzdGFydGluZyBQRk4gb2YgdGhpcyBjbHVzdGVyICovCiAgICAgICAgIDAsCQkvKiAwMDg6IGNvdW50IG9mIFBGTnMgaW4gdGhpcyBjbHVzdGVyICovCiAgICAgICAgIDAsCQkvKiAwMTA6IGNvdW50IG9mIHRlc3RlZCBQRk5zIGluIGNsdXN0ZXIgKi8KICAgICAgICAgMCwJCS8qIDAxODogdmEgb2YgYml0bWFwICovCiAgICAgICAgIDAsCQkvKiAwMjA6IHBhIG9mIGJpdG1hcCAqLwogICAgICAgICAwLAkJLyogMDI4OiBjaGVja3N1bSBvZiBiaXRtYXAgKi8KICAgICAgICAgMAkJLyogMDMwOiB1c2FnZSBvZiBjbHVzdGVyICovCiAgICAgfX0KfTsKCi8qIGNvbnN0YW50cyBmb3Igc2xvdGluZm8gYnVzX3R5cGUgc3ViZmllbGQgKi8KI2RlZmluZSBTTE9USU5GT19UQwkwCiNkZWZpbmUgU0xPVElORk9fSVNBCTEKI2RlZmluZSBTTE9USU5GT19FSVNBCTIKI2RlZmluZSBTTE9USU5GT19QQ0kJMwoKc3RydWN0IHJwYl9jdGIgbTVfcnBiX2N0YiA9IHsKICAgIENPTlNfRFosCS8qIDAwMDogY29uc29sZSB0eXBlICovCiAgICAwLAkJLyogMDA4OiBjb25zb2xlIHVuaXQgKi8KICAgIDAsCQkvKiAwMTA6IHJlc2VydmVkICovCiAgICAwCQkvKiAwMTg6IGJ5dGUgbGVuZ3RoIG9mIGRldmljZSBkZXAgcG9ydGlvbiAqLwp9OwoKLyogd2UgZG9uJ3QgZG8gYW55IGZpeHVwIChha2EgcmVsb2NhdGUgdGhlIGNvbnNvbGUpIC0gd2UgaG9wZSAqLwpzdHJ1Y3QgcnBiX2NyYiBtNV9ycGJfY3JiID0gewogICAgMCwJCS8qIHZhIG9mIGNhbGwtYmFjayBkaXNwYXRjaCBydG4gKi8KICAgIDAsCQkvKiBwYSBvZiBjYWxsLWJhY2sgZGlzcGF0Y2ggcnRuICovCiAgICAwLAkJLyogdmEgb2YgY2FsbC1iYWNrIGZpeHVwIHJ0biAqLwogICAgMCwJCS8qIHBhIG9mIGNhbGwtYmFjayBmaXh1cCBydG4gKi8KICAgIDAsCQkvKiBudW1iZXIgb2YgZW50cmllcyBpbiBwaHlzL3ZpcnQgbWFwICovCiAgICAwCQkvKiBOdW1iZXIgb2YgcGFnZXMgdG8gYmUgbWFwcGVkICovCn07CgpzdHJ1Y3QgX3JwYl9uYW1lIHsKICAgIHVsb25nIGxlbmd0aDsKICAgIGNoYXIgbmFtZVsxNl07Cn07CgpleHRlcm4gc3RydWN0IF9ycGJfbmFtZSBtNV9uYW1lOwoKc3RydWN0IHJwYl9kc3IgbTVfcnBiX2RzciA9IHsKICAgIDAsCiAgICAwLAogICAgMCwKfTsKCnN0cnVjdCBfcnBiX25hbWUgbTVfbmFtZSA9IHsKICAgIDE2LAogICAgeydVJywnTScsJ0knLCdDJywnSCcsJyAnLCdNJywnNScsJy8nLCdBJywnTCcsJ1AnLCdIJywnQScsJyAnLDB9LAp9OwoKLyoKICogTTUgaGFzIG9uZSBMVVJUIGVudHJ5OgogKiAgIDEwNTAgaXMgZm9yIHdvcmtzdGF0aW9ucwogKiAgIDExMDAgaXMgc2VydmVycyAoYW5kIGlzIG5lZWRlZCBmb3IgQ1hYKQogKi8KbG9uZyBtNV9sdXJ0WzEwXSA9IHsgOSwgMTIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDExMDAsIDExMDAgfTsKCnVsb25nIHVuaXhfYm9vdF9tZW07CnVsb25nIGJvb3RhZHI7CgpjaGFyICoqa2FyZ3Y7CmludCBrYXJnYzsKdWxvbmcgZnJlZV9wZm47CnN0cnVjdCBycGJfcGVyY3B1ICpycGJfcGVyY3B1OwoKY2hhciAqCnVuaXhfYm9vdF9hbGxvYyhpbnQgcGFnZXMpCnsKICAgIGNoYXIgKnJldCA9IChjaGFyICopdW5peF9ib290X21lbTsKICAgIHVuaXhfYm9vdF9tZW0gKz0gKHBhZ2VzICogUEFHRV9TSVpFKTsKICAgIHJldHVybiByZXQ7Cn0KCnVsb25nICpmaXJzdCA9IDA7CnVsb25nICp0aGlyZF9ycGIgPSAwOwp1bG9uZyAqcmVzZXJ2ZWRGaXh1cCA9IDA7CgppbnQgc3RyY3B5KGNoYXIgKmRzdCwgY2hhciAqc3JjKTsKCnN0cnVjdCBycGIgKnJwYjsKZXh0ZXJuIHVsb25nIF9lbmQ7Cgp2b2lkCnVuaXhCb290KGludCBhcmdjLCBjaGFyICoqYXJndikKewogICAgdWxvbmcgKnNlY29uZCwgICp0aGlyZF9rZXJuZWwsIHB0ciwgKnRiYiwgc2l6ZSwgKnBlcmNwdV9sb2dvdXQ7CiAgICB1bnNpZ25lZCBjaGFyICptZHRfYml0bWFwOwogICAgbG9uZyAqbHAxLCAqbHAyLCBzdW07CiAgICBpbnQgaSwgY2w7CiAgICB1bG9uZyBrZXJuX2ZpcnN0X3BhZ2U7CiAgICB1bG9uZyBtZW1fc2l6ZSA9IG01Q29uZi5tZW1fc2l6ZTsKCiAgICB1bG9uZyBtZW1fcGFnZXMgPSBtZW1fc2l6ZSAvIFBBR0VfU0laRSwgY29uc19wYWdlczsKICAgIHVsb25nIG1kdF9iaXRtYXBfcGFnZXMgPSBtZW1fcGFnZXMgLyAoUEFHRV9TSVpFKjgpOwoKICAgIHVsb25nIGtlcm5lbF9ieXRlcywga3NwLCBrZXJuZWxfZW5kLCAqdW5peF9rZXJuZWxfc3RhY2ssIGJzcywKICAgICAgICBrc3BfYm90dG9tLCBrc3BfdG9wOwogICAgc3RydWN0IHJwYl9jdGIgKnJwYl9jdGI7CiAgICBzdHJ1Y3QgY3RiX3R0ICpjdGJfdHQ7CiAgICBzdHJ1Y3QgcnBiX2RzciAqcnBiX2RzcjsKICAgIHN0cnVjdCBycGJfY3JiICpycGJfY3JiOwogICAgc3RydWN0IF9tNV9ycGJfbWR0ICpycGJfbWR0OwogICAgaW50ICpycGJfbHVydDsKICAgIGNoYXIgKnJwYl9uYW1lOwogICAgdWxvbmcgbmV4dFB0cjsKCiAgICBwcmludGZfbG9jaygibWVtc2l6ZSAleCBwYWdlcyAleCBcbiIsIG1lbV9zaXplLCBtZW1fcGFnZXMpOwoKICAgIC8qIEFsbG9jYXRlOgogICAgICogICB0d28gcGFnZXMgZm9yIHRoZSBIV1JQQgogICAgICogICBmaXZlIHBhZ2UgdGFibGUgcGFnZXM6CiAgICAgKiAgICAgMTogRmlyc3QgbGV2ZWwgcGFnZSB0YWJsZQogICAgICogICAgIDE6IFNlY29uZCBsZXZlbCBwYWdlIHRhYmxlCiAgICAgKiAgICAgMTogVGhpcmQgbGV2ZWwgcGFnZSB0YWJsZSBmb3IgSFdSUEIKICAgICAqICAgICAyOiBUaGlyZCBsZXZlbCBwYWdlIHRhYmxlIGZvciBrZXJuZWwgKGZvciB1cCB0byAxNk1CKQogICAgICogc2V0IHVwIHRoZSBwYWdlIHRhYmxlcwogICAgICogbG9hZCB0aGUga2VybmVsIGF0IHRoZSBwaHlzaWNhbCBhZGRyZXNzIDB4MjMwMDAwCiAgICAgKiBidWlsZCB0aGUgSFdSUEIKICAgICAqICAgc2V0IHVwIG1lbW9yeSBkZXNjcmlwdG9yIHRhYmxlIHRvIGdpdmUgdXAgdGhlCiAgICAgKiAgIHBoeXNpY2FsIG1lbW9yeSBiZXR3ZWVuIHRoZSBlbmQgb2YgdGhlIHBhZ2UKICAgICAqICAgdGFibGVzIGFuZCB0aGUgc3RhcnQgb2YgdGhlIGtlcm5lbAogICAgICogZW5hYmxlIGtzZWcgYWRkcmVzc2luZwogICAgICoganVtcCB0byB0aGUga2VybmVsCiAgICAgKi8KCiAgICB1bml4X2Jvb3RfbWVtID0gUk9VTkRVUDhLKCZfZW5kKTsKCiAgICBwcmludGZfbG9jaygiRmlyc3QgZnJlZSBwYWdlIGFmdGVyIFJPTSAweCV4XG4iLCB1bml4X2Jvb3RfbWVtKTsKCiAgICBycGIgPSAoc3RydWN0IHJwYiAqKXVuaXhfYm9vdF9hbGxvYyhIV1JQQl9QQUdFUyk7CgogICAgbWR0X2JpdG1hcCA9ICh1bnNpZ25lZCBjaGFyICopdW5peF9ib290X2FsbG9jKG1kdF9iaXRtYXBfcGFnZXMpOyAKICAgIGZpcnN0ID0gKHVsb25nICopdW5peF9ib290X2FsbG9jKDEpOwogICAgc2Vjb25kID0gKHVsb25nICopdW5peF9ib290X2FsbG9jKDEpOwogICAgdGhpcmRfcnBiID0gKHVsb25nICopdW5peF9ib290X2FsbG9jKDEpOwogICAgcmVzZXJ2ZWRGaXh1cCA9ICh1bG9uZyopIHVuaXhfYm9vdF9hbGxvYygxKTsKICAgIHRoaXJkX2tlcm5lbCA9ICh1bG9uZyAqKXVuaXhfYm9vdF9hbGxvYyhOVU1fS0VSTkVMX1RISVJEKTsKICAgIHBlcmNwdV9sb2dvdXQgPSAodWxvbmcqKXVuaXhfYm9vdF9hbGxvYygxKTsKCiAgICBjb25zX3BhZ2VzID0gS1NFR19UT19QSFlTKHVuaXhfYm9vdF9tZW0pIC8gUEFHRV9TSVpFOwoKICAgIC8qIFNldCB1cCB0aGUgcGFnZSB0YWJsZXMgKi8KICAgIGJ6ZXJvKChjaGFyICopZmlyc3QsIFBBR0VfU0laRSk7CiAgICBiemVybygoY2hhciAqKXNlY29uZCwgUEFHRV9TSVpFKTsKICAgIGJ6ZXJvKChjaGFyICopcmVzZXJ2ZWRGaXh1cCwgUEFHRV9TSVpFKTsKICAgIGJ6ZXJvKChjaGFyICopdGhpcmRfcnBiLCBIV1JQQl9QQUdFUyAqIFBBR0VfU0laRSk7CiAgICBiemVybygoY2hhciAqKXRoaXJkX2tlcm5lbCwgUEFHRV9TSVpFICogTlVNX0tFUk5FTF9USElSRCk7CgogICAgZmlyc3RbMF0gPSBLUFRFKFBGTihzZWNvbmQpKTsKICAgIGZpcnN0WzFdID0gS1BURShQRk4oZmlyc3QpKTsgLyogUmVnaW9uIDMgKi8KCiAgICAvKiBSZWdpb24gMCAqLwogICAgc2Vjb25kW1NFQ09ORCgweDEwMDAwMDAwKV0gPSBLUFRFKFBGTih0aGlyZF9ycGIpKTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX0tFUk5FTF9USElSRDsgaSsrKSB7CiAgICAgICAgLyogUmVnaW9uIDEgKi8KICAgICAgICBzZWNvbmRbU0VDT05EKDB4MjAwMDAwMDApICsgaV0gPSBLUFRFKFBGTih0aGlyZF9rZXJuZWwpICsgaSk7CiAgICB9CgogICAgLyogUmVnaW9uIDIgKi8KICAgIHNlY29uZFtTRUNPTkQoMHg0MDAwMDAwMCldID0gS1BURShQRk4oc2Vjb25kKSk7CgoKICAgIC8qIEZvciBzb21lIG9ic2N1cmUgcmVhc29uLCBEZWMgVW5peCdzIGRhdGFiYXNlIHJlYWQKICAgICAqIGZyb20gL2V0Yy9zeXNjb25maWd0YWIgaXMgd3JpdHRlbiB0byB0aGlzIGZpeGVkCiAgICAgKiBtYXBwZWQgbWVtb3J5IGxvY2F0aW9uLiBHbyBmaWd1cmUsIHNpbmNlIGl0IGlzCiAgICAgKiBub3QgaW5pdGlhbGl6ZWQgYnkgdGhlIGNvbnNvbGUuIE1heWJlIGl0IGlzCiAgICAgKiB0byBsb29rIGF0IHRoZSBkYXRhYmFzZSBmcm9tIHRoZSBjb25zb2xlCiAgICAgKiBhZnRlciBhIGJvb3QvY3Jhc2guCiAgICAgKgogICAgICogQmxhY2sgbWFnaWMgdG8gZXN0aW1hdGUgdGhlIG1heCBzaXplLiBTRUdWcyBvbiBvdmVyZmxvdwogICAgICogYnVnbmlvbgogICAgICovCgojZGVmaW5lIERBVEFCQVNFX0JBU0UgICAgICAgICAgIDB4MjAwMDAwMDAKI2RlZmluZSBEQVRBQkFTRV9FTkQgICAgICAgICAgICAweDIwMDIwMDAwCgogICAgdWxvbmcgKmRiUGFnZSA9ICh1bG9uZyopdW5peF9ib290X2FsbG9jKDEpOwogICAgYnplcm8oZGJQYWdlLCBQQUdFX1NJWkUpOwogICAgc2Vjb25kW1NFQ09ORChEQVRBQkFTRV9CQVNFKV0gPSBLUFRFKFBGTihkYlBhZ2UpKTsKICAgIGZvciAoaSA9IERBVEFCQVNFX0JBU0U7IGkgPCBEQVRBQkFTRV9FTkQgOyBpICs9IFBBR0VfU0laRSkgewogICAgICAgIHVsb25nICpkYiA9ICh1bG9uZyopdW5peF9ib290X2FsbG9jKDEpOwogICAgICAgIGRiUGFnZVtUSElSRChpKV0gPSBLUFRFKFBGTihkYikpOwogICAgfQoKICAgIC8qIFJlZ2lvbiAwICovCiAgICAvKiBNYXAgdGhlIEhXUlBCICovCiAgICBmb3IgKGkgPSAwOyBpIDwgSFdSUEJfUEFHRVM7IGkrKykKICAgICAgICB0aGlyZF9ycGJbaV0gPSBLUFRFKFBGTihycGIpICsgaSk7CgogICAgLyogTWFwIHRoZSBNRFQgYml0bWFwIHRhYmxlICovCiAgICBmb3IgKGkgPSAwOyBpIDwgbWR0X2JpdG1hcF9wYWdlczsgaSsrKSB7CiAgICAgICAgdGhpcmRfcnBiW0hXUlBCX1BBR0VTICsgaV0gPSBLUFRFKFBGTihtZHRfYml0bWFwKSArIGkpOwogICAgfQoKICAgIC8qIFByb3RlY3QgdGhlIFBBTCBwYWdlcyAqLwogICAgZm9yIChpID0gMTsgaSA8IFBGTihmaXJzdCk7IGkrKykKICAgICAgICB0aGlyZF9ycGJbSFdSUEJfUEFHRVMgKyBtZHRfYml0bWFwX3BhZ2VzICsgaV0gPSBLUFRFKGkpOwoKICAgLyogU2V0IHVwIHRoaXJkX2tlcm5lbCBhZnRlciBpdCdzIGxvYWRlZCwgd2hlbiB3ZSBrbm93IHdoZXJlIGl0IGlzICovCiAgICBrZXJuX2ZpcnN0X3BhZ2UgPSAoS1NFR19UT19QSFlTKG01Q29uZi5rZXJuU3RhcnQpL1BBR0VfU0laRSk7CiAgICBrZXJuZWxfZW5kID0gUk9VTkRVUDhLKG01Q29uZi5rZXJuRW5kKTsKICAgIGJvb3RhZHIgPSBtNUNvbmYuZW50cnlQb2ludDsKCiAgICBwcmludGZfbG9jaygiSFdSUEIgMHgleCBsMXB0IDB4JXggbDJwdCAweCV4IGwzcHRfcnBiIDB4JXggbDNwdF9rZXJuZWwgMHgleCIKICAgICAgICAgICAgICAgICIgbDJyZXNlcnYgMHgleFxuIiwKICAgICAgICAgICAgICAgIHJwYiwgZmlyc3QsIHNlY29uZCwgdGhpcmRfcnBiLCB0aGlyZF9rZXJuZWwsIHJlc2VydmVkRml4dXApOwogICAgaWYgKGtlcm5lbF9lbmQgLSBtNUNvbmYua2VyblN0YXJ0ID4gKDB4ODAwMDAwKk5VTV9LRVJORUxfVEhJUkQpKSB7CiAgICAgICAgcHJpbnRmX2xvY2soIktlcm5lbCBpcyBtb3JlIHRoYW4gOE1CIDB4JXggLSAweCV4ID0gMHgleFxuIiwKICAgICAgICAgICAgICAgICAgICBrZXJuZWxfZW5kLCBtNUNvbmYua2VyblN0YXJ0LAogICAgICAgICAgICAgICAgICAgIGtlcm5lbF9lbmQgLSBtNUNvbmYua2VyblN0YXJ0ICk7CiAgICAgICAgcGFuaWMoImtlcm5lbCB0b28gYmlnXG4iKTsKICAgIH0KICAgIHByaW50Zl9sb2NrKCJrc3RhcnQgPSAweCV4LCBrZW5kID0gMHgleCwga2VudHJ5ID0gMHgleCwgbnVtQ1BVcyA9IDB4JXhcbiIsIG01Q29uZi5rZXJuU3RhcnQsIG01Q29uZi5rZXJuRW5kLCBtNUNvbmYuZW50cnlQb2ludCwgbTVDb25mLm51bUNQVXMpOwogICAga3NwX2JvdHRvbSA9ICh1bG9uZyl1bml4X2Jvb3RfYWxsb2MoMSk7CiAgICBrc3BfdG9wID0ga3NwX2JvdHRvbSArIFBBR0VfU0laRTsKICAgIHB0ciA9ICh1bG9uZykga3NwX2JvdHRvbTsKICAgIGJ6ZXJvKChjaGFyICopcHRyLCBQQUdFX1NJWkUpOwogICAgZGJQYWdlW1RISVJEKEtTVEFDS19SRUdJT05fVkEpXSA9IDA7CQkgICAgICAgICAgLyogU3RhY2sgR3VhcmQgUGFnZSAqLwogICAgZGJQYWdlW1RISVJEKEtTVEFDS19SRUdJT05fVkEgKyBQQUdFX1NJWkUpXSA9IEtQVEUoUEZOKHB0cikpOyAvKiBLZXJuZWwgU3RhY2sgUGFnZSAqLwogICAgZGJQYWdlW1RISVJEKEtTVEFDS19SRUdJT05fVkEgKyAyKlBBR0VfU0laRSldID0gMDsJCSAgLyogU3RhY2sgR3VhcmQgUGFnZSAqLwoKICAgIC8qIHB1dCBhcmd2IGludG8gdGhlIGJvdHRvbSBvZiB0aGUgc3RhY2sgLSBhcmd2IHN0YXJ0cyBhdCAxIGJlY2F1c2UKICAgICAqIHRoZSBjb21tYW5kIHRoYXRyIGdvdCB1cyBoZXJlIChpLmUuICJ1bml4Ym9vdCkgaXMgaW4gYXJndlswXS4KICAgICAqLwogICAga3NwID0ga3NwX3RvcCAtIDg7CQkJLyogQmFjayB1cCBvbmUgbG9uZ3dvcmQgKi8KICAgIGtzcCAtPSBhcmdjICogc2l6ZW9mKGNoYXIgKik7CS8qIE1ha2Ugcm9vbSBmb3IgYXJndiAqLwogICAga2FyZ3YgPSAoY2hhciAqKikga3NwOwogICAgZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkrKykgewkvKiBDb3B5IGFyZ3VtZW50cyB0byBzdGFjayAqLwogICAgICAgIGtzcCAtPSAoKHN0cmxlbihhcmd2W2ldKSArIDEpICsgNykgJiB+MHg3OwogICAgICAgIGthcmd2W2ktMV0gPSAoY2hhciAqKSBrc3A7CiAgICAgICAgc3RyY3B5KGthcmd2W2kgLSAxXSwgYXJndltpXSk7CiAgICB9CiAgICBrYXJnYyA9IGkgLSAxOwogICAga2FyZ3Zba2FyZ2NdID0gTlVMTDsJLyoganVzdCB0byBiZSBzdXJlOyBkb2Vzbid0IHNlZW0gdG8gYmUgdXNlZCAqLwogICAga3NwIC09IHNpemVvZihjaGFyICopOwkvKiBwb2ludCBhYm92ZSBsYXN0IGFyZyBmb3Igbm8gcmVhbCByZWFzb24gKi8KCiAgICBmcmVlX3BmbiA9IFBGTihrZXJuZWxfZW5kKTsKCiAgICBiY29weSgoY2hhciAqKSZtNV9ycGIsIChjaGFyICopcnBiLCBzaXplb2Yoc3RydWN0IHJwYikpOwoKICAgIHJwYi0+cnBiX3NlbGZyZWYgPSAoc3RydWN0IHJwYiAqKSBLU0VHX1RPX1BIWVMocnBiKTsKICAgIHJwYi0+cnBiX3N0cmluZyA9IDB4MDAwMDAwNDI1MDUyNTc0ODsKCiAgICB0YmIgPSAodWxvbmcgKikgKCgoY2hhciAqKSBycGIpICsgUk9VTkRVUDgoc2l6ZW9mKHN0cnVjdCBycGIpKSk7CiAgICBycGItPnJwYl90cmFuc19vZmYgPSAodWxvbmcpdGJiIC0gKHVsb25nKXJwYjsKICAgIGJjb3B5KChjaGFyICopbTVfdGJiLCAoY2hhciAqKXRiYiwgc2l6ZW9mKG01X3RiYikpOwoKICAgIC8qCiAgICAgKiBycGJfY291bnRlci4gVXNlIHRvIGRldGVybWluZSB0aW1lb3V0cyBpbiBPUy4KICAgICAqIFhYWCBtdXN0IGJlIHBhdGNoZWQgYWZ0ZXIgYSBjaGVja3BvaW50IHJlc3RvcmUgKEkgZ3Vlc3MpCiAgICAgKi8KCiAgICBwcmludGZfbG9jaygiQ1BVIENsb2NrIGF0ICVkIE1IeiBJbnRyQ2xvY2tGcmVxdWVuY3k9JWQgXG4iLAogICAgICAgICAgICAgICAgbTVDb25mLmNwdUNsb2NrLCBtNUNvbmYuaW50ckNsb2NrRnJlcXVlbmN5KTsKICAgIHJwYi0+cnBiX2NvdW50ZXIgPSBtNUNvbmYuY3B1Q2xvY2sgKiAxMDAwICogMTAwMDsKCiAgICAvKgogICAgICogQnkgZGVmaW5pdGlvbiwgdGhlIHJwYl9jbG9jayBpcyBzY2FsZWQgYnkgNDA5NiAoaW4gaHopCiAgICAgKi8KICAgIHJwYi0+cnBiX2Nsb2NrID0gbTVDb25mLmludHJDbG9ja0ZyZXF1ZW5jeSAqIDQwOTY7CgogICAgLyoKICAgICAqIFBlciBDUFUgU2xvdHMuIE11bHRpcHJvY2Vzc29yIHN1cHBvcnQuCiAgICAgKi8KICAgIGludCBwZXJjcHVfc2l6ZSA9IFJPVU5EVVAxMjgoc2l6ZW9mKHN0cnVjdCBycGJfcGVyY3B1KSk7CgogICAgcHJpbnRmX2xvY2soIkJvb3Rpbmcgd2l0aCAlZCBwcm9jZXNzb3IocykgXG4iLCBtNUNvbmYubnVtQ1BVcyk7CgogICAgcnBiLT5ycGJfbnVtcHJvY3MgPSBtNUNvbmYubnVtQ1BVczsKICAgIHJwYi0+cnBiX3Nsb3RzaXplID0gcGVyY3B1X3NpemU7CiAgICBycGJfcGVyY3B1ID0gKHN0cnVjdCBycGJfcGVyY3B1ICopCiAgICAgICAgUk9VTkRVUDEyOCgoKHVsb25nKXRiYikgKyAoc2l6ZW9mKG01X3RiYikpKTsKCiAgICBycGItPnJwYl9wZXJjcHVfb2ZmID0gKHVsb25nKXJwYl9wZXJjcHUgLSAodWxvbmcpcnBiOwoKICAgIGZvciAoaSA9IDA7IGkgPCBtNUNvbmYubnVtQ1BVczsgaSsrKSB7CiAgICAgICAgc3RydWN0IHJwYl9wZXJjcHUgKnRoaXNDUFUgPSAoc3RydWN0IHJwYl9wZXJjcHUqKQogICAgICAgICAgICAoKHVsb25nKXJwYl9wZXJjcHUgKyBwZXJjcHVfc2l6ZSAqIGkpOwoKICAgICAgICBiemVybygoY2hhciAqKXRoaXNDUFUsIHBlcmNwdV9zaXplKTsKICAgICAgICBiY29weSgoY2hhciAqKSZtNV9ycGJfcGVyY3B1LCAoY2hhciAqKXRoaXNDUFUsCiAgICAgICAgICAgICAgc2l6ZW9mKHN0cnVjdCBycGJfcGVyY3B1KSk7CgogICAgICAgIHRoaXNDUFUtPnJwYl9wY2IucnBiX2tzcCA9IChLU1RBQ0tfUkVHSU9OX1ZBICsgMipQQUdFX1NJWkUgLSAoa3NwX3RvcCAtIGtzcCkpOwogICAgICAgIHRoaXNDUFUtPnJwYl9wY2IucnBiX3B0YnIgPSBQRk4oZmlyc3QpOwoKICAgICAgICB0aGlzQ1BVLT5ycGJfbG9nb3V0ID0gS1NFR19UT19QSFlTKHBlcmNwdV9sb2dvdXQpOwogICAgICAgIHRoaXNDUFUtPnJwYl9sb2dvdXRfbGVuID0gUEFHRV9TSVpFOwoKICAgICAgICBwcmludGZfbG9jaygiS1NQOiAweCV4IFBUQlIgMHgleFxuIiwKICAgICAgICAgICAgICAgICAgICB0aGlzQ1BVLT5ycGJfcGNiLnJwYl9rc3AsIHRoaXNDUFUtPnJwYl9wY2IucnBiX3B0YnIpOwogICAgfQoKICAgIG5leHRQdHIgPSAodWxvbmcpcnBiX3BlcmNwdSArIHBlcmNwdV9zaXplICogbTVDb25mLm51bUNQVXM7CgogICAgLyoKICAgICAqIENvbnNvbGUgVGVybWluYWwgQmxvY2sKICAgICAqLwogICAgcnBiX2N0YiA9IChzdHJ1Y3QgcnBiX2N0YiAqKSBuZXh0UHRyOwogICAgY3RiX3R0ID0gKHN0cnVjdCBjdGJfdHQqKSBycGJfY3RiOwoKICAgIHJwYi0+cnBiX2N0Yl9vZmYgPSAoKHVsb25nKXJwYl9jdGIpIC0gKHVsb25nKXJwYjsKICAgIHJwYi0+cnBiX2N0Yl9zaXplICA9IHNpemVvZihzdHJ1Y3QgcnBiX2N0Yik7CgogICAgYnplcm8oKGNoYXIgKilycGJfY3RiLCBzaXplb2Yoc3RydWN0IGN0Yl90dCkpOwoKICAgIHJwYl9jdGItPnJwYl90eXBlID0gQ09OU19EWjsKICAgIHJwYl9jdGItPnJwYl9sZW5ndGggPSBzaXplb2YoY3RiX3R0KSAtIHNpemVvZihycGJfY3RiKTsKCiAgICAvKgogICAgICogdWFydCBpbml0aXpsaWF0aW9uCiAgICAgKi8KICAgIGN0Yl90dC0+Y3RiX3RpbnRyX3ZlYyA9IDB4NmMwOyAgLyogbWF0Y2hlcyB0bGFzZXIgcGFsIGNvZGUgKi8KICAgIGN0Yl90dC0+Y3RiX3JpbnRyX3ZlYyA9IDB4NjgwOyAgLyogbWF0Y2hlcyB0bGFzZXIgcGFsIGNvZGUgKi8KICAgIGN0Yl90dC0+Y3RiX3Rlcm1fdHlwZSA9IENUQl9HUkFQSElDUzsKCiAgICBycGJfY3JiID0gKHN0cnVjdCBycGJfY3JiICopICgoKHVsb25nKXJwYl9jdGIpICsgc2l6ZW9mKHN0cnVjdCBjdGJfdHQpKTsKICAgIHJwYi0+cnBiX2NyYl9vZmYgPSAoKHVsb25nKXJwYl9jcmIpIC0gKHVsb25nKXJwYjsKCiAgICBiemVybygoY2hhciAqKXJwYl9jcmIsIHNpemVvZihzdHJ1Y3QgcnBiX2NyYikpOwoKICAgIC8qCiAgICAgKiBjb25zb2xlIGNhbGxiYWNrIHN0dWZmIChtNSkKICAgICAqLwogICAgcnBiX2NyYi0+cnBiX251bSA9IDE7CiAgICBycGJfY3JiLT5ycGJfbWFwcGVkX3BhZ2VzID0gSFdSUEJfUEFHRVM7CiAgICBycGJfY3JiLT5ycGJfbWFwWzBdLnJwYl92aXJ0ID0gMHgxMDAwMDAwMDsKICAgIHJwYl9jcmItPnJwYl9tYXBbMF0ucnBiX3BoeXMgPSBLU0VHX1RPX1BIWVMoKCh1bG9uZylycGIpICYgfjB4MWZmZik7CiAgICBycGJfY3JiLT5ycGJfbWFwWzBdLnJwYl9wZ2NvdW50ID0gSFdSUEJfUEFHRVM7CgogICAgcHJpbnRmX2xvY2soIkNvbnNvbGUgQ2FsbGJhY2sgYXQgMHgleCwgZml4dXAgYXQgMHgleCwgY3JiIG9mZnNldDogMHgleFxuIiwKICAgICAgICAgICAgICAgIHJwYl9jcmItPnJwYl92YV9kaXNwLCBycGJfY3JiLT5ycGJfdmFfZml4dXAsIHJwYi0+cnBiX2NyYl9vZmYpOwoKICAgIHJwYl9tZHQgPSAoc3RydWN0IF9tNV9ycGJfbWR0ICopKCh1bG9uZylycGJfY3JiICsgc2l6ZW9mKHN0cnVjdCBycGJfY3JiKSk7CiAgICBycGItPnJwYl9tZHRfb2ZmID0gKHVsb25nKXJwYl9tZHQgLSAodWxvbmcpcnBiOwogICAgYmNvcHkoKGNoYXIgKikmbTVfcnBiX21kdCwgKGNoYXIgKilycGJfbWR0LCBzaXplb2Yoc3RydWN0IF9tNV9ycGJfbWR0KSk7CgoKICAgIGNsID0gMDsKICAgIHJwYl9tZHQtPnJwYl9jbHVzdGVyW2NsXS5ycGJfcGZuY291bnQgPSBrZXJuX2ZpcnN0X3BhZ2U7CiAgICBjbCsrOwoKICAgIHJwYl9tZHQtPnJwYl9jbHVzdGVyW2NsXS5ycGJfcGZuID0ga2Vybl9maXJzdF9wYWdlOwogICAgcnBiX21kdC0+cnBiX2NsdXN0ZXJbY2xdLnJwYl9wZm5jb3VudCA9IG1lbV9wYWdlcyAtIGtlcm5fZmlyc3RfcGFnZTsKICAgIHJwYl9tZHQtPnJwYl9jbHVzdGVyW2NsXS5ycGJfcGZudGVzdGVkID0KICAgICAgICBycGJfbWR0LT5ycGJfY2x1c3RlcltjbF0ucnBiX3BmbmNvdW50OwogICAgcnBiX21kdC0+cnBiX2NsdXN0ZXJbY2xdLnJwYl9wYSA9IEtTRUdfVE9fUEhZUyhtZHRfYml0bWFwKTsKICAgIHJwYl9tZHQtPnJwYl9jbHVzdGVyW2NsXS5ycGJfdmEgPSAweDEwMDAwMDAwICsgSFdSUEJfUEFHRVMgKiBQQUdFX1NJWkU7CiAgICBjbCsrOwoKICAgIHJwYl9tZHQtPnJwYl9udW1jbCA9IGNsOwoKICAgIGZvciAoaSA9IDA7IGkgPCBjbDsgaSsrKQogICAgICAgIHByaW50Zl9sb2NrKCJNZW1vcnkgY2x1c3RlciAlZCBbJWQgLSAlZF1cbiIsIGksCiAgICAgICAgICAgICAgICAgICAgcnBiX21kdC0+cnBiX2NsdXN0ZXJbaV0ucnBiX3BmbiwKICAgICAgICAgICAgICAgICAgICBycGJfbWR0LT5ycGJfY2x1c3RlcltpXS5ycGJfcGZuY291bnQpOwoKICAgIC8qIENoZWNrc3VtIHRoZSBycGIgZm9yIGdvb2QgbHVjayAqLwogICAgc3VtID0gMDsKICAgIGxwMSA9IChsb25nICopJnJwYl9tZHQtPnJwYl9pbXBhZGRyOwogICAgbHAyID0gKGxvbmcgKikmcnBiX21kdC0+cnBiX2NsdXN0ZXJbY2xdOwogICAgd2hpbGUgKGxwMSA8IGxwMikgc3VtICs9ICpscDErKzsKICAgIHJwYl9tZHQtPnJwYl9jaGVja3N1bSA9IHN1bTsKCiAgICAvKiBYWFggc2hvdWxkIGNoZWNrc3VtIHRoZSBjbHVzdGVyIGRlc2NyaXB0b3JzICovCiAgICBiemVybygoY2hhciAqKW1kdF9iaXRtYXAsIG1kdF9iaXRtYXBfcGFnZXMgKiBQQUdFX1NJWkUpOwogICAgZm9yIChpID0gMDsgaSA8IG1lbV9wYWdlcy84OyBpKyspCiAgICAgICAgKCh1bnNpZ25lZCBjaGFyICopbWR0X2JpdG1hcClbaV0gPSAweGZmOwoKICAgIHByaW50Zl9sb2NrKCJJbml0YWxpemluZyBtZHRfYml0bWFwIGFkZHIgMHgleCBtZW1fcGFnZXMgJXggXG4iLAogICAgICAgICAgICAgICAgKGxvbmcpbWR0X2JpdG1hcCwobG9uZyltZW1fcGFnZXMpOwoKICAgIG01X3JwYi5ycGJfY29uZmlnX29mZiA9IDA7CiAgICBtNV9ycGIucnBiX2ZydV9vZmYgPSAwOwoKICAgIHJwYl9kc3IgPSAoc3RydWN0IHJwYl9kc3IgKikoKHVsb25nKXJwYl9tZHQgKyBzaXplb2Yoc3RydWN0IF9tNV9ycGJfbWR0KSk7CiAgICBycGItPnJwYl9kc3Jfb2ZmID0gKHVsb25nKXJwYl9kc3IgLSAodWxvbmcpcnBiOwogICAgYnplcm8oKGNoYXIgKilycGJfZHNyLCBzaXplb2Yoc3RydWN0IHJwYl9kc3IpKTsKICAgIHJwYl9kc3ItPnJwYl9zbW0gPSAxNTc4OyAvKiBPZmZpY2lhbCBYWE0gU01NIG51bWJlciBhcyBwZXIgU1JNICovCiAgICBycGJfZHNyLT5ycGJfc21tID0gMTA4OTsgLyogT2ZmaWNpYWwgQWxjb3IgU01NIG51bWJlciBhcyBwZXIgU1JNICovCgogICAgcnBiX2x1cnQgPSAoaW50ICopIFJPVU5EVVA4KCh1bG9uZylycGJfZHNyICsgc2l6ZW9mKHN0cnVjdCBycGJfZHNyKSk7CiAgICBycGJfZHNyLT5ycGJfbHVydF9vZmYgPSAoKHVsb25nKSBycGJfbHVydCkgLSAodWxvbmcpIHJwYl9kc3I7CiAgICBiY29weSgoY2hhciAqKW01X2x1cnQsIChjaGFyICopcnBiX2x1cnQsIHNpemVvZihtNV9sdXJ0KSk7CgogICAgcnBiX25hbWUgPSAoY2hhciAqKSBST1VORFVQOCgoKHVsb25nKXJwYl9sdXJ0KSArIHNpemVvZihtNV9sdXJ0KSk7CiAgICBycGJfZHNyLT5ycGJfc3lzbmFtZV9vZmYgPSAoKHVsb25nKSBycGJfbmFtZSkgLSAodWxvbmcpIHJwYl9kc3I7CiNkZWZpbmUgVEhFTkFNRSAiICAgICAgICAgICAgIE01L0FscGhhICAgICAgICIKICAgIHN1bSA9IHNpemVvZihUSEVOQU1FKTsKICAgIGJjb3B5KFRIRU5BTUUsIHJwYl9uYW1lLCBzdW0pOwogICAgKih1bG9uZyAqKXJwYl9uYW1lID0gc2l6ZW9mKFRIRU5BTUUpOyAvKiBwdXQgaW4gbGVuZ3RoIGZpZWxkICovCgogICAgLyogY2FsY3VsYXRlIHNpemUgb2YgcnBiICovCiAgICBycGItPnJwYl9zaXplID0gKCh1bG9uZykgJnJwYl9uYW1lW3N1bV0pIC0gKHVsb25nKXJwYjsKCiAgICBpZiAocnBiLT5ycGJfc2l6ZSA+IFBBR0VfU0laRSAqIEhXUlBCX1BBR0VTKSB7CiAgICAgICAgcGFuaWMoIkhXUlBCX1BBR0VTPSVkIHRvbyBzbWFsbCBmb3IgSFdSUEIgISEhIFxuIik7CiAgICB9CgogICAgdWxvbmcgKnJwYnB0ciA9ICh1bG9uZyopKChjaGFyKilycGJfZHNyICsgc2l6ZW9mKHN0cnVjdCBycGJfZHNyKSk7CiAgICBycGJfY3JiLT5ycGJfcGFfZGlzcCA9IEtTRUdfVE9fUEhZUyhycGJwdHIpOwogICAgcnBiX2NyYi0+cnBiX3ZhX2Rpc3AgPSAweDEwMDAwMDAwICsKICAgICAgICAoKCh1bG9uZylycGJwdHIgLSAodWxvbmcpcnBiKSAmICgweDIwMDAgKiBIV1JQQl9QQUdFUyAtIDEpKTsKICAgIHByaW50Zl9sb2NrKCJDb25zb2xlRGlzcGF0Y2ggYXQgdmlydCAleCBwaHlzICV4IHZhbCAleFxuIiwKICAgICAgICAgICAgICAgIHJwYl9jcmItPnJwYl92YV9kaXNwLCBycGJfY3JiLT5ycGJfcGFfZGlzcCwgY29uc29sZUNhbGxiYWNrKTsKICAgICpycGJwdHIrKyA9IDA7CiAgICAqcnBicHRyKysgPSAodWxvbmcpIGNvbnNvbGVDYWxsYmFjazsKICAgIHJwYl9jcmItPnJwYl9wYV9maXh1cCA9IEtTRUdfVE9fUEhZUyhycGJwdHIpOwogICAgcnBiX2NyYi0+cnBiX3ZhX2ZpeHVwID0gMHgxMDAwMDAwMCArCiAgICAgICAgKCgodWxvbmcpcnBicHRyIC0gKHVsb25nKXJwYikgJiAoMHgyMDAwICogSFdSUEJfUEFHRVMgLSAxKSk7CiAgICAqcnBicHRyKysgPSAwOwoKICAgICpycGJwdHIrKyA9ICh1bG9uZykgY29uc29sZUZpeHVwOwoKICAgIC8qIENoZWNrc3VtIHRoZSBycGIgZm9yIGdvb2QgbHVjayAqLwogICAgc3VtID0gMDsKICAgIGxwMSA9IChsb25nICopcnBiOwogICAgbHAyID0gJnJwYi0+cnBiX2NoZWNrc3VtOwogICAgd2hpbGUgKGxwMSA8IGxwMikKICAgICAgICBzdW0gKz0gKmxwMSsrOwogICAgKmxwMiA9IHN1bTsKCiAgLyoKICAgKiBNUCBib290c3RyYXAKICAgKi8KICAgIGZvciAoaSA9IDE7IGkgPCBtNUNvbmYubnVtQ1BVczsgaSsrKSB7CiAgICAgICAgdWxvbmcgc3RhY2sgPSAodWxvbmcpdW5peF9ib290X2FsbG9jKDEpOwogICAgICAgIHByaW50Zl9sb2NrKCJCb290c3RyYXBpbmcgQ1BVICVkIHdpdGggc3A9MHgleFxuIiwgaSwgc3RhY2spOwogICAgICAgIG01QWxwaGFBY2Nlc3MtPmNwdVN0YWNrW2ldID0gc3RhY2s7CiAgICB9CgogICAgLyoKICAgICAqIE1ha2Ugc3VyZSB0aGF0IHdlIGFyZSBub3Qgc3RlcHBpbmcgb24gdGhlIGtlcm5lbAogICAgICovCiAgICBpZiAoKHVsb25nKXVuaXhfYm9vdF9tZW0gPj0gKHVsb25nKW01Q29uZi5rZXJuU3RhcnQpIHsKICAgICAgICBwYW5pYygiQ09OU09MRTogdG9vIG11Y2ggbWVtb3J5LiBTbWFzaGluZyBrZXJuZWxcbiIpOwogICAgfSBlbHNlIHsKICAgICAgICBwcmludGZfbG9jaygidW5peF9ib290X21lbSBlbmRzIGF0ICV4IFxuIiwgdW5peF9ib290X21lbSk7CiAgICB9CgogICAgSlRvS2VybigoY2hhciAqKWJvb3RhZHIsICh1bG9uZylycGJfcGVyY3B1LCBmcmVlX3Bmbiwga2FyZ2MsIGthcmd2LCBOVUxMKTsKfQoKCnZvaWQKSlRvS2VybihjaGFyICpib290YWRyLCB1bG9uZyBycGJfcGVyY3B1LCB1bG9uZyBmcmVlX3BmbiwgdWxvbmcga19hcmdjLAogICAgICAgIGNoYXIgKiprX2FyZ3YsIGNoYXIgKiplbnZwKQp7CiAgICBleHRlcm4gdWxvbmcgcGFsSlRvS2VybltdOwoKICAgIHN0cnVjdCBfa2VybmVsX3BhcmFtcyAqa2VybmVsX3BhcmFtcyA9IChzdHJ1Y3QgX2tlcm5lbF9wYXJhbXMgKikgS1NFRzsKICAgIGludCBpOwoKICAgIHByaW50Zl9sb2NrKCJrX2FyZ2MgPSAlZCAiLCBrX2FyZ2MpOwogICAgZm9yIChpID0gMDsgaSA8IGtfYXJnYzsgaSsrKSB7CiAgICAgICAgcHJpbnRmX2xvY2soIiclcycgIiwga19hcmd2W2ldKTsKICAgIH0KICAgIHByaW50Zl9sb2NrKCJcbiIpOwoKICAgIGtlcm5lbF9wYXJhbXMtPmJvb3RhZHIgPSBib290YWRyOwogICAga2VybmVsX3BhcmFtcy0+cnBiX3BlcmNwdSA9IEtTRUdfVE9fUEhZUyhycGJfcGVyY3B1KTsKICAgIGtlcm5lbF9wYXJhbXMtPmZyZWVfcGZuID0gZnJlZV9wZm47CiAgICBrZXJuZWxfcGFyYW1zLT5hcmdjID0ga19hcmdjOwogICAga2VybmVsX3BhcmFtcy0+YXJndiA9ICh1bG9uZylrX2FyZ3Y7CiAgICBrZXJuZWxfcGFyYW1zLT5lbnZwID0gKHVsb25nKWVudnA7CiAgICBwcmludGZfbG9jaygianVtcGluZyB0byBrZXJuZWwgYXQgMHgleCwgKFBDQkIgMHgleCBwZm4gJWQpXG4iLAogICAgICAgICAgICAgICAgYm9vdGFkciwgcnBiX3BlcmNwdSwgZnJlZV9wZm4pOwogICAgSlRvUGFsKEtTRUdfVE9fUEhZUyhwYWxKVG9LZXJuKSk7CiAgICBwcmludGZfbG9jaygicmV0dXJuZWQgZnJvbSBKVG9QYWwuIExvb3BpbmdcbiIpOwogICAgd2hpbGUgKDEpCiAgICAgICAgY29udGludWU7Cn0KCnZvaWQKSlRvUGFsKHVsb25nIGJvb3RhZHIpCnsKICAgIGNTZXJ2ZShib290YWRyLCAwLCBDU0VSVkVfS19KVE9QQUwpOwoKICAgIC8qCiAgICAgKiBNYWtlIHN1cmUgdGhhdCBmbG9hdGluZyBwb2ludCBpcyBlbmFibGVkIGluY2FzZQogICAgICogaXQgd2FzIGRpc2FibGVkIGJ5IHRoZSB1c2VyIHByb2dyYW0uCiAgICAgKi8KICAgIHdyZmVuKDEpOwp9CgppbnQKc3RyY3B5KGNoYXIgKmRzdCwgY2hhciAqc3JjKQp7CiAgICBpbnQgaSA9IDA7CiAgICB3aGlsZSAoKnNyYykgewogICAgICAgICpkc3QrKyA9ICpzcmMrKzsKICAgICAgICBpKys7CiAgICB9CiAgICByZXR1cm4gaTsKfQoKLyoKICogQ29uc29sZSBJL08KICoKICovCgppbnQgbnVtT3BlbkRldmljZXMgPSAxMTsKc3RydWN0IHsKICAgIGNoYXIgbmFtZVsxMjhdOwp9IGRldmljZVN0YXRlWzMyXTsKCiNkZWZpbmUgQk9PVERFVklDRV9OQU1FICJTQ1NJIDEgMCAwIDEgMTAwIDAiCgp2b2lkCkRldmljZU9wZXJhdGlvbihsb25nIG9wLCBsb25nIGNoYW5uZWwsIGxvbmcgY291bnQsIGxvbmcgYWRkcmVzcywgbG9uZyBibG9jaykKewogICAgbG9uZyBwQWRkcjsKCiAgICBpZiAoc3RyY21wKGRldmljZVN0YXRlW2NoYW5uZWxdLm5hbWUsIEJPT1RERVZJQ0VfTkFNRSApKSB7CiAgICAgICAgcGFuaWMoIkRldmljZVJlYWQ6IG9ubHkgaW1wbGVtZW50ZWQgZm9yIHJvb3QgZGlzayBcbiIpOwogICAgfQogICAgcEFkZHIgPSBLU0VHX1RPX1BIWVMoYWRkcmVzcyk7CiAgICBpZiAocEFkZHIgKyBjb3VudCA+IG01Q29uZi5tZW1fc2l6ZSkgewogICAgICAgIHBhbmljKCJEZXZpY2VSZWFkOiByZXF1ZXN0IG91dCBvZiByYW5nZSBcbiIpOwogICAgfQoKICAgIG01QWxwaGFBY2Nlc3MtPmRpc2tDb3VudCA9IGNvdW50OwogICAgbTVBbHBoYUFjY2Vzcy0+ZGlza1BBZGRyID0gcEFkZHI7CiAgICBtNUFscGhhQWNjZXNzLT5kaXNrQmxvY2sgPSBibG9jazsKICAgIG01QWxwaGFBY2Nlc3MtPmRpc2tPcGVyYXRpb24gPSBvcDsgLyogbGF1bmNoICovCn0KCi8qCiAqIE01IENvbnNvbGUgY2FsbGJhY2tzCiAqCiAqLwoKLyogQVhQIG1hbnVhbCAyLTMxICovCiNkZWZpbmUgQ09OU0NCX0dFVEMgMHgxCiNkZWZpbmUgQ09OU0NCX1BVVFMgMHgyCiNkZWZpbmUgQ09OU0NCX1JFU0VUX1RFUk0gMHgzCiNkZWZpbmUgQ09OU0NCX1NFVF9URVJNX0lOVCAweDQKI2RlZmluZSBDT05TQ0JfU0VUX1RFUk1fQ1RMIDB4NQojZGVmaW5lIENPTlNDQl9QUk9DRVNTX0tFWSAweDYKI2RlZmluZSBDT05TQ0JfT1BFTl9DT05TT0xFIDB4NwojZGVmaW5lIENPTlNDQl9DTE9TRV9DT05TT0xFIDB4OAoKI2RlZmluZSBDT05TQ0JfT1BFTiAweDEwCiNkZWZpbmUgQ09OU0NCX0NMT1NFIDB4MTEKI2RlZmluZSBDT05TQ0JfUkVBRCAweDEzCgojZGVmaW5lIENPTlNDQl9HRVRFTlYgMHgyMgoKLyogQVhQIG1hbnVhbCAyLTI2ICovCiNkZWZpbmUJRU5WX0FVVE9fQUNUSU9OCQkwWDAxCiNkZWZpbmUJRU5WX0JPT1RfREVWCQkwWDAyCiNkZWZpbmUJRU5WX0JPT1RERUZfREVWCQkwWDAzCiNkZWZpbmUJRU5WX0JPT1RFRF9ERVYJCTBYMDQKI2RlZmluZQlFTlZfQk9PVF9GSUxFCQkwWDA1CiNkZWZpbmUJRU5WX0JPT1RFRF9GSUxFCQkwWDA2CiNkZWZpbmUJRU5WX0JPT1RfT1NGTEFHUwkwWDA3CiNkZWZpbmUJRU5WX0JPT1RFRF9PU0ZMQUdTCTBYMDgKI2RlZmluZQlFTlZfQk9PVF9SRVNFVAkJMFgwOQojZGVmaW5lCUVOVl9EVU1QX0RFVgkJMFgwQQojZGVmaW5lCUVOVl9FTkFCTEVfQVVESVQJMFgwQgojZGVmaW5lCUVOVl9MSUNFTlNFCQkwWDBDCiNkZWZpbmUJRU5WX0NIQVJfU0VUCQkwWDBECiNkZWZpbmUJRU5WX0xBTkdVQUdFCQkwWDBFCiNkZWZpbmUJRU5WX1RUWV9ERVYJCTBYMEYKI2RlZmluZQlFTlZfU0NTSUlECQkwWDQyCiNkZWZpbmUJRU5WX1NDU0lGQVNUCQkwWDQzCiNkZWZpbmUJRU5WX0NPTTFfQkFVRAkJMFg0NAojZGVmaW5lCUVOVl9DT00xX01PREVNCQkwWDQ1CiNkZWZpbmUJRU5WX0NPTTFfRkxPVwkJMFg0NgojZGVmaW5lCUVOVl9DT00xX01JU0MJCTBYNDcKI2RlZmluZQlFTlZfQ09NMl9CQVVECQkwWDQ4CiNkZWZpbmUJRU5WX0NPTTJfTU9ERU0JCTBYNDkKI2RlZmluZQlFTlZfQ09NMl9GTE9XCQkwWDRBCiNkZWZpbmUJRU5WX0NPTTJfTUlTQwkJMFg0QgojZGVmaW5lCUVOVl9QQVNTV09SRAkJMFg0QwojZGVmaW5lCUVOVl9TRUNVUkUJCTBYNEQKI2RlZmluZQlFTlZfTE9HRkFJTAkJMFg0RQojZGVmaW5lCUVOVl9TUk0yREVWX0lECQkwWDRGCgojZGVmaW5lIE1BWF9FTlZMRU4gMzIKCmNoYXIgZW52X2F1dG9fYWN0aW9uW01BWF9FTlZMRU5dCT0gIkJPT1QiOwpjaGFyIGVudl9ib290X2RldltNQVhfRU5WTEVOXQkJPSAiIjsKY2hhciBlbnZfYm9vdGRlZl9kZXZbTUFYX0VOVkxFTl0JPSAiIjsKY2hhciBlbnZfYm9vdGVkX2RldltNQVhfRU5WTEVOXQkJPSBCT09UREVWSUNFX05BTUU7CmNoYXIgZW52X2Jvb3RfZmlsZVtNQVhfRU5WTEVOXQkJPSAiIjsKY2hhciBlbnZfYm9vdGVkX2ZpbGVbTUFYX0VOVkxFTl0JPSAiIjsKY2hhciBlbnZfYm9vdF9vc2ZsYWdzW01BWF9FTlZMRU5dCT0gIiI7CmNoYXIgZW52X2Jvb3RlZF9vc2ZsYWdzW01BWF9FTlZMRU5dCT0gIiI7CmNoYXIgZW52X2Jvb3RfcmVzZXRbTUFYX0VOVkxFTl0JCT0gIiI7CmNoYXIgZW52X2R1bXBfZGV2W01BWF9FTlZMRU5dCQk9ICIiOwpjaGFyIGVudl9lbmFibGVfYXVkaXRbTUFYX0VOVkxFTl0JPSAiIjsKY2hhciBlbnZfbGljZW5zZVtNQVhfRU5WTEVOXQkJPSAiIjsKY2hhciBlbnZfY2hhcl9zZXRbTUFYX0VOVkxFTl0JCT0gIiI7CmNoYXIgZW52X2xhbmd1YWdlW01BWF9FTlZMRU5dCQk9ICIiOwpjaGFyIGVudl90dHlfZGV2W01BWF9FTlZMRU5dCQk9ICIwIjsKY2hhciBlbnZfc2NzaWlkW01BWF9FTlZMRU5dCQk9ICIiOwpjaGFyIGVudl9zY3NpZmFzdFtNQVhfRU5WTEVOXQkJPSAiIjsKY2hhciBlbnZfY29tMV9iYXVkW01BWF9FTlZMRU5dCQk9ICIiOwpjaGFyIGVudl9jb20xX21vZGVtW01BWF9FTlZMRU5dCQk9ICIiOwpjaGFyIGVudl9jb20xX2Zsb3dbTUFYX0VOVkxFTl0JCT0gIiI7CmNoYXIgZW52X2NvbTFfbWlzY1tNQVhfRU5WTEVOXQkJPSAiIjsKY2hhciBlbnZfY29tMl9iYXVkW01BWF9FTlZMRU5dCQk9ICIiOwpjaGFyIGVudl9jb20yX21vZGVtW01BWF9FTlZMRU5dCQk9ICIiOwpjaGFyIGVudl9jb20yX2Zsb3dbTUFYX0VOVkxFTl0JCT0gIiI7CmNoYXIgZW52X2NvbTJfbWlzY1tNQVhfRU5WTEVOXQkJPSAiIjsKY2hhciBlbnZfcGFzc3dvcmRbTUFYX0VOVkxFTl0JCT0gIiI7CmNoYXIgZW52X3NlY3VyZVtNQVhfRU5WTEVOXQkJPSAiIjsKY2hhciBlbnZfbG9nZmFpbFtNQVhfRU5WTEVOXQkJPSAiIjsKY2hhciBlbnZfc3JtMmRldl9pZFtNQVhfRU5WTEVOXQkJPSAiIjsKCiNkZWZpbmUgTUFYX0VOVl9JTkRFWCAxMDAKY2hhciAqZW52cHRyW01BWF9FTlZfSU5ERVhdID0gewogICAgMCwJCQkJCS8qIDB4MDAgKi8KICAgIGVudl9hdXRvX2FjdGlvbiwJCQkvKiAweDAxICovCiAgICBlbnZfYm9vdF9kZXYsCQkJLyogMHgwMiAqLwogICAgZW52X2Jvb3RkZWZfZGV2LAkJCS8qIDB4MDMgKi8KICAgIGVudl9ib290ZWRfZGV2LAkJCS8qIDB4MDQgKi8KICAgIGVudl9ib290X2ZpbGUsCQkJLyogMHgwNSAqLwogICAgZW52X2Jvb3RlZF9maWxlLAkJCS8qIDB4MDYgKi8KICAgIGVudl9ib290X29zZmxhZ3MsCQkJLyogMHgwNyAqLwogICAgZW52X2Jvb3RlZF9vc2ZsYWdzLAkJCS8qIDB4MDggKi8KICAgIGVudl9ib290X3Jlc2V0LAkJCS8qIDB4MDkgKi8KICAgIGVudl9kdW1wX2RldiwJCQkvKiAweDBBICovCiAgICBlbnZfZW5hYmxlX2F1ZGl0LAkJCS8qIDB4MEIgKi8KICAgIGVudl9saWNlbnNlLAkJCS8qIDB4MEMgKi8KICAgIGVudl9jaGFyX3NldCwJCQkvKiAweDBEICovCiAgICAoY2hhciAqKSZlbnZfbGFuZ3VhZ2UsCQkvKiAweDBFICovCiAgICBlbnZfdHR5X2RldiwJCQkvKiAweDBGICovCiAgICAwLDAsMCwwLCAwLDAsMCwwLCAwLDAsMCwwLCAwLDAsMCwwLAkvKiAweDEwIC0gMHgxRiAqLwogICAgMCwwLDAsMCwgMCwwLDAsMCwgMCwwLDAsMCwgMCwwLDAsMCwJLyogMHgyMCAtIDB4MkYgKi8KICAgIDAsMCwwLDAsIDAsMCwwLDAsIDAsMCwwLDAsIDAsMCwwLDAsCS8qIDB4MzAgLSAweDNGICovCiAgICAwLAkJCQkJLyogMHg0MCAqLwogICAgMCwJCQkJCS8qIDB4NDEgKi8KICAgIGVudl9zY3NpaWQsCQkJCS8qIDB4NDIgKi8KICAgIGVudl9zY3NpZmFzdCwJCQkvKiAweDQzICovCiAgICBlbnZfY29tMV9iYXVkLAkJCS8qIDB4NDQgKi8KICAgIGVudl9jb20xX21vZGVtLAkJCS8qIDB4NDUgKi8KICAgIGVudl9jb20xX2Zsb3csCQkJLyogMHg0NiAqLwogICAgZW52X2NvbTFfbWlzYywJCQkvKiAweDQ3ICovCiAgICBlbnZfY29tMl9iYXVkLAkJCS8qIDB4NDggKi8KICAgIGVudl9jb20yX21vZGVtLAkJCS8qIDB4NDkgKi8KICAgIGVudl9jb20yX2Zsb3csCQkJLyogMHg0QSAqLwogICAgZW52X2NvbTJfbWlzYywJCQkvKiAweDRCICovCiAgICBlbnZfcGFzc3dvcmQsCQkJLyogMHg0QyAqLwogICAgZW52X3NlY3VyZSwJCQkJLyogMHg0RCAqLwogICAgZW52X2xvZ2ZhaWwsCQkJLyogMHg0RSAqLwogICAgZW52X3NybTJkZXZfaWQsCQkJLyogMHg0RiAqLwogICAgMCwwLDAsMCwgMCwwLDAsMCwgMCwwLDAsMCwgMCwwLDAsMCwJLyogMHg1MCAtIDB4NUYgKi8KICAgIDAsCQkJCQkvKiAweDYwICovCiAgICAwLAkJCQkJLyogMHg2MSAqLwogICAgMCwJCQkJCS8qIDB4NjIgKi8KICAgIDAsCQkJCQkvKiAweDYzICovCn07Cgpsb25nCkNhbGxCYWNrRGlzcGF0Y2hlcihsb25nIGEwLCBsb25nIGExLCBsb25nIGEyLCBsb25nIGEzLCBsb25nIGE0KQp7CiAgICBsb25nIGk7CiAgICBzd2l0Y2ggKGEwKSB7CiAgICAgIGNhc2UgQ09OU0NCX0dFVEM6CiAgICAgICAgcmV0dXJuIEdldENoYXIoKTsKCiAgICAgIGNhc2UgQ09OU0NCX1BVVFM6CiAgICAgICAgZm9yIChpID0gMDsgaSA8IGEzOyBpKyspCiAgICAgICAgICAgIFB1dENoYXIoKigoY2hhciAqKWEyICsgaSkpOwogICAgICAgIHJldHVybiBhMzsKCiAgICAgIGNhc2UgQ09OU0NCX0dFVEVOVjoKICAgICAgICBpZiAoYTEgPj0gMCAmJiBhMSA8IE1BWF9FTlZfSU5ERVggJiYgZW52cHRyW2ExXSAhPSAwICYmICplbnZwdHJbYTFdKSB7CiAgICAgICAgICAgIGkgPSBzdHJjcHkoKGNoYXIqKWEyLCBlbnZwdHJbYTFdKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHJjcHkoKGNoYXIqKWEyLCAiIik7CiAgICAgICAgICAgIGkgPSAobG9uZykweGMwMDAwMDAwMDAwMDAwMDA7CiAgICAgICAgICAgIGlmIChhMSA+PSAwICYmIGExIDwgTUFYX0VOVl9JTkRFWCkKICAgICAgICAgICAgICAgIHByaW50Zl9sb2NrKCJHRVRFTlYgdW5zdXBwb3J0ZWQgb3B0aW9uICVkICgweCV4KVxuIiwgYTEsIGExKTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgcHJpbnRmX2xvY2soIkdFVEVOViB1bnN1cHBvcnRlZCBvcHRpb24gJXNcbiIsIGExKTsKICAgICAgICB9CgogICAgICAgIGlmIChpID4gYTMpCiAgICAgICAgICAgIHBhbmljKCJDT05TQ0JfR0VURU5WIG92ZXJ3cm90ZSBidWZmZXJcbiIpOwogICAgICAgIHJldHVybiBpOwoKICAgICAgY2FzZSBDT05TQ0JfT1BFTjoKICAgICAgICBiY29weSgoY2hhciopYTEsIGRldmljZVN0YXRlW251bU9wZW5EZXZpY2VzXS5uYW1lLCBhMik7CiAgICAgICAgZGV2aWNlU3RhdGVbbnVtT3BlbkRldmljZXNdLm5hbWVbYTJdID0gJ1wwJzsKICAgICAgICBwcmludGZfbG9jaygiQ09OU09MRSBPUEVOIDogJXMgLS0+IHN1Y2Nlc3MgXG4iLAogICAgICAgICAgICAgICAgICAgIGRldmljZVN0YXRlW251bU9wZW5EZXZpY2VzXS5uYW1lKTsKICAgICAgICByZXR1cm4gbnVtT3BlbkRldmljZXMrKzsKCiAgICAgIGNhc2UgQ09OU0NCX1JFQUQ6CiAgICAgICAgRGV2aWNlT3BlcmF0aW9uKGEwLCBhMSwgYTIsIGEzLCBhNCk7CiAgICAgICAgYnJlYWs7CgogICAgICBjYXNlIENPTlNDQl9DTE9TRToKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgQ09OU0NCX09QRU5fQ09OU09MRToKICAgICAgICBwcmludGZfbG9jaygiQ09OU09MRSBPUEVOXG4iKTsKICAgICAgICByZXR1cm4gMDsgLyogc3VjY2VzcyAqLwogICAgICAgIGJyZWFrOyAvKiBub3QgcmVhY2hlZCAqLwoKICAgICAgY2FzZSBDT05TQ0JfQ0xPU0VfQ09OU09MRToKICAgICAgICBwcmludGZfbG9jaygiQ09OU09MRSBDTE9TRVxuIik7CiAgICAgICAgcmV0dXJuIDA7IC8qIHN1Y2Nlc3MgKi8KICAgICAgICBicmVhazsgLyogbm90IHJlYWNoZWQgKi8KCiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcGFuaWMoIkNhbGxCYWNrRGlzcGF0Y2hlcigleCwleCwleCwleCwleClcbiIsIGEwLCBhMSwgYTIsIGEzLCBhNCk7CiAgICB9CgogICAgcmV0dXJuIDA7Cn0KCmxvbmcKQ2FsbEJhY2tGaXh1cChpbnQgYTAsIGludCBhMSwgaW50IGEyKQp7CiAgICBsb25nIHRlbXA7CiAgICAvKgogICAgICogTGludXggdXNlcyByOCBmb3IgdGhlIGN1cnJlbnQgcG9pbnRlciAocG9pbnRlciB0byBkYXRhCiAgICAgKiBzdHJ1Y3R1cmUgY29udGF0aW5nIGluZm8gYWJvdXQgY3VycmVudGx5IHJ1bm5pbmcgcHJvY2VzcykuIEl0CiAgICAgKiBpcyBzZXQgd2hlbiB0aGUga2VybmVsIHN0YXJ0cyBhbmQgaXMgZXhwZWN0ZWQgdG8gcmVtYWluCiAgICAgKiB0aGVyZS4uLiBQcm9ibGVtIGlzIHRoYXQgdGhlIHVubGlrZSB0aGUga2VybmVsLCB0aGUgY29uc29sZQogICAgICogZG9lcyBub3QgcHJldmVudCB0aGUgYXNzZW1ibGVyIGZyb20gdXNpbmcgcjguIFNvIGhlcmUgaXMgYSB3b3JrCiAgICAgKiBhcm91bmQuIFNvIGZhciB0aGlzIGhhcyBvbmx5IGJlZW4gYSBwcm9ibGVtIGluIENhbGxCYWNrRml4dXAoKQogICAgICogYnV0IGFueSBvdGhlciBjYWxsIGJhY2sgZnVuY3Rpb25zIGNvdWxkZCBjYXVzZSBhIHByb2JsZW0gYXQKICAgICAqIHNvbWUgcG9pbnQKICAgICAqLwoKICAgIC8qIHNhdmUgb2ZmIHRoZSBjdXJyZW50IHBvaW50ZXIgdG8gYSB0ZW1wIHZhcmlhYmxlICovCiAgICBhc20oImJpcyAkOCwgJDMxLCAlMCIgOiAiPXIiICh0ZW1wKSk7CgogICAgLyogY2FsbCBvcmlnaW5hbCBjb2RlICovCiAgICBwcmludGZfbG9jaygiQ2FsbGJhY2tGaXh1cCAleCAleCwgdDc9JXhcbiIsIGEwLCBhMSwgdGVtcCk7CgogICAgLyogcmVzdG9yZSB0aGUgY3VycmVudCBwb2ludGVyICovCiAgICBhc20oImJpcyAlMCwgJDMxLCAkOCIgOiA6ICJyIiAodGVtcCkgOiAiJDgiKTsKCiAgICByZXR1cm4gMDsKfQoKdm9pZApTbGF2ZUNtZChpbnQgY3B1LCBzdHJ1Y3QgcnBiX3BlcmNwdSAqbXlfcnBiKQp7CiAgICBleHRlcm4gdWxvbmcgcGFsSlRvU2xhdmVbXTsKCiAgICBwcmludGZfbG9jaygiU2xhdmUgQ1BVICVkIGNvbnNvbGUgY29tbWFuZCAlcyIsIGNwdSwKICAgICAgICAgICAgICAgIG15X3JwYi0+cnBiX2ljY2IuaWNjYl9yeGJ1Zik7CgogICAgbXlfcnBiLT5ycGJfc3RhdGUgfD0gU1RBVEVfQklQOwogICAgbXlfcnBiLT5ycGJfc3RhdGUgJj0gflNUQVRFX1JDOwoKICAgIHByaW50Zl9sb2NrKCJTbGF2ZUNtZDogcmVzdGFydCAleCAleCB2cHRiICV4IG15X3JwYiAleCBteV9ycGJfcGh5cyAleFxuIiwKICAgICAgICAgICAgICAgIHJwYi0+cnBiX3Jlc3RhcnQsIHJwYi0+cnBiX3Jlc3RhcnRfcHYsIHJwYi0+cnBiX3ZwdGIsIG15X3JwYiwKICAgICAgICAgICAgICAgIEtTRUdfVE9fUEhZUyhteV9ycGIpKTsKCiAgICBjU2VydmUoS1NFR19UT19QSFlTKHBhbEpUb1NsYXZlKSwgKHVsb25nKXJwYi0+cnBiX3Jlc3RhcnQsCiAgICAgICAgICAgQ1NFUlZFX0tfSlRPUEFMLCBycGItPnJwYl9yZXN0YXJ0X3B2LCBycGItPnJwYl92cHRiLAogICAgICAgICAgIEtTRUdfVE9fUEhZUyhteV9ycGIpKTsKCiAgICBwYW5pYygiU2xhdmVDbWQgcmV0dXJuZWQgXG4iKTsKfQoKdm9pZApTbGF2ZUxvb3AoaW50IGNwdSkKewogICAgaW50IHNpemUgPSBST1VORFVQMTI4KHNpemVvZihzdHJ1Y3QgcnBiX3BlcmNwdSkpOwogICAgc3RydWN0IHJwYl9wZXJjcHUgKm15X3JwYiA9IChzdHJ1Y3QgcnBiX3BlcmNwdSopCiAgICAgICAgKCh1bG9uZylycGJfcGVyY3B1ICsgc2l6ZSAqIGNwdSk7CgogICAgaWYgKGNwdSA9PSAwKSB7CiAgICAgICAgcGFuaWMoIkNQVaAwIGVudGVyaW5nIHNsYXZlTG9vcC4gUmVlbmV0ZXJpbmcgdGhlIGNvbnNvbGUuIEhPU0VEXG4iKTsKICAgIH0gZWxzZSB7CiAgICAgICAgcHJpbnRmX2xvY2soIkVudGVyaW5nIHNsYXZlbG9vcCBmb3IgY3B1ICVkIG15X3JwYj0leFxuIiwgY3B1LCBteV9ycGIpOwogICAgfQoKICAgIC8vIHN3YXAgdGhlIHByb2Nlc3NvcnMgY29udGV4dCB0byB0aGUgb25lIGluIHRoZQogICAgLy8gcnBiX3BlcmNwdSBzdHJ1Y3QgdmVyeSBjYXJlZnVsbHkgKGkuZS4gbm8gc3RhY2sgdXNhZ2UpCiAgICAvLyBzbyB0aGF0IGxpbnV4IGtub3dzIHdoaWNoIHByb2Nlc3NvciBlbmRzIHVwIGluIF9fc21wX2NhbGxpbgogICAgLy8gYW5kIHdlIGRvbid0IHRyYXNoIGFueSBkYXRhIGlzIHRoZSBwcm9jZXNzCiAgICBTbGF2ZVNwaW4oY3B1LCBteV9ycGIsICZteV9ycGItPnJwYl9pY2NiLmljY2JfcnhsZW4pOwp9Cg==