LyoKICogQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQgVGhlIFJlZ2VudHMgb2YgVGhlIFVuaXZlcnNpdHkgb2YgTWljaGlnYW4KICogQ29weXJpZ2h0IChjKSAxOTkzIFRoZSBIZXdsZXR0LVBhY2thcmQgRGV2ZWxvcG1lbnQgQ29tcGFueQogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQogKiBtZXQ6IHJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcjsKICogcmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogKiBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uOwogKiBuZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cwogKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQogKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCiAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCiAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgogKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAogKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAogKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCiAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAqLwoKLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIE01IENvbnNvbGUKICogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CgojZGVmaW5lIENPTlNPTEUKI2luY2x1ZGUgImFjY2Vzcy5oIgojaW5jbHVkZSAiY3NlcnZlLmgiCiNpbmNsdWRlICJycGIuaCIKCiNkZWZpbmUgQ09OU19JTlRfVFggICAweDAxICAvKiBpbnRlcnJ1cHQgZW5hYmxlIC8gc3RhdGUgYml0cyAqLwojZGVmaW5lIENPTlNfSU5UX1JYICAgMHgwMgoKI2RlZmluZSBQQUdFX1NJWkUgKDgxOTIpCgojZGVmaW5lIEtTVEFDS19SRUdJT05fVkEgMHgyMDA0MDAwMAoKI2RlZmluZSBLU0VHICAgMHhmZmZmZmMwMDAwMDAwMDAwCiNkZWZpbmUgSzFCQVNFIDB4ZmZmZmZjODAwMDAwMDAwMAojZGVmaW5lIEtTRUdfVE9fUEhZUyh4KSAoKCh1bG9uZyl4KSAmIH5LU0VHKQoKI2RlZmluZSBST1VORFVQOCh4KSAoKHVsb25nKSgoKHVsb25nKXgpKzcpICYgfjcpCiNkZWZpbmUgUk9VTkRVUDEyOCh4KSAoKHVsb25nKSgoKHVsb25nKXgpICsgMTI3KSAmIH4xMjcpCiNkZWZpbmUgUk9VTkRVUDhLKHgpICgodWxvbmcpKCgodWxvbmcpKHgpKSArIDgxOTEpICYgfjgxOTEpCgojZGVmaW5lIEZJUlNUKHgpICAoKCgodWxvbmcpKHgpKSA+PiAzMykgJiAweDNmZikKI2RlZmluZSBTRUNPTkQoeCkgKCgoKHVsb25nKSh4KSkgPj4gMjMpICYgMHgzZmYpCiNkZWZpbmUgVEhJUkQoeCkgKCgoKHVsb25nKSh4KSkgPj4gMTMpICYgMHgzZmYpCiNkZWZpbmUgVEhJUkRfWFhYKHgpICAoKCgodWxvbmcpKHgpKSA+PiAxMykgJiAweGZmZikKI2RlZmluZSBQRk4oeCkgICgoKCh1bG9uZykoeCkgJiB+S1NFRykgPj4gMTMpKQoKLyogS2VybmVsIHdyaXRlIHwga2VybmVsIHJlYWQgfCB2YWxpZCAqLwojZGVmaW5lIEtQVEUoeCkgKCh1bG9uZykoKCgodWxvbmcpKHgpKSA8PCAzMikgfCAweDExMDEpKQoKI2RlZmluZSBIV1JQQl9QQUdFUyAxNgoKI2RlZmluZSBOVU1fS0VSTkVMX1RISVJEICg0KQoKI2RlZmluZSBwcmludGZfbG9jayhhcmdzLi4uKQkJXAogICAgZG8gewkJCQlcCiAgICAgICAgU3BpbkxvY2soJnRoZUxvY2spOwkJXAogICAgICAgIHByaW50ZihhcmdzKTsJCQlcCiAgICAgICAgU3BpblVubG9jaygmdGhlTG9jayk7CQlcCiAgICB9IHdoaWxlICgwKQoKCnZvaWQgdW5peEJvb3QoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKdm9pZCBKVG9LZXJuKGNoYXIgKmJvb3RhZHIsIHVsb25nIHJwYl9wZXJjcHUsIHVsb25nIGZyZWVfcGZuLCB1bG9uZyBrX2FyZ2MsCiAgICAgICAgICAgICBjaGFyICoqa19hcmd2LCBjaGFyICoqZW52cCk7CnZvaWQgSlRvUGFsKHVsb25nIGJvb3RhZHIpOwp2b2lkIFNsYXZlTG9vcChpbnQgY3B1KTsKCnZvbGF0aWxlIHN0cnVjdCBBbHBoYUFjY2VzcyAqbTVBbHBoYUFjY2VzczsKc3RydWN0IEFscGhhQWNjZXNzIG01Q29uZjsKCnVsb25nIHRoZUxvY2s7CgpleHRlcm4gdm9pZCBTcGluTG9jayh1bG9uZyAqbG9jayk7CiNkZWZpbmUgU3BpblVubG9jayhfeCkgKihfeCkgPSAwOwoKc3RydWN0IF9rZXJuZWxfcGFyYW1zIHsKICAgIGNoYXIgKmJvb3RhZHI7CiAgICB1bG9uZyBycGJfcGVyY3B1OwogICAgdWxvbmcgZnJlZV9wZm47CiAgICB1bG9uZyBhcmdjOwogICAgdWxvbmcgYXJndjsKICAgIHVsb25nIGVudnA7IC8qIE5VTEwgKi8KfTsKCmV4dGVybiBjb25zb2xlQ2FsbGJhY2tbXTsKZXh0ZXJuIGNvbnNvbGVGaXh1cFtdOwpsb25nIENhbGxCYWNrRGlzcGF0Y2hlcigpOwpsb25nIENhbGxCYWNrRml4dXAoKTsKCi8qCiAqIG01IGNvbnNvbGUgb3V0cHV0CiAqLwoKdm9pZApJbml0Q29uc29sZSgpCnsKfQoKY2hhcgpHZXRDaGFyKCkKewogICAgcmV0dXJuIG01QWxwaGFBY2Nlc3MtPmlucHV0Q2hhcjsKfQoKdm9pZApQdXRDaGFyKGNoYXIgYykKewogICAgbTVBbHBoYUFjY2Vzcy0+b3V0cHV0Q2hhciA9IGM7Cn0KCmludApwYXNzQXJncyhpbnQgYXJnYykKewogICAgcmV0dXJuIDA7Cn0KCmludAptYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewogICAgaW50IHgsIGk7CiAgICB1aW50ICprMXB0ciwgKmtzZWdwdHI7CgogICAgSW5pdENvbnNvbGUoKTsKICAgIHByaW50Zl9sb2NrKCJNNSBjb25zb2xlOiBtNUFscGhhQWNjZXNzIEAgMHgleFxuIiwgbTVBbHBoYUFjY2Vzcyk7CgogICAgLyoKICAgICAqIGdldCBjb25maWd1cmF0aW9uIGZyb20gYmFja2Rvb3IKICAgICAqLwogICAgbTVDb25mLmxhc3Rfb2Zmc2V0ID0gbTVBbHBoYUFjY2Vzcy0+bGFzdF9vZmZzZXQ7CiAgICBwcmludGZfbG9jaygiR290IENvbmZpZ3VyYXRpb24gJWRcbiIsIG01Q29uZi5sYXN0X29mZnNldCk7CgogICAgbTVDb25mLmxhc3Rfb2Zmc2V0ID0gbTVBbHBoYUFjY2Vzcy0+bGFzdF9vZmZzZXQ7CiAgICBtNUNvbmYudmVyc2lvbiA9IG01QWxwaGFBY2Nlc3MtPnZlcnNpb247CiAgICBtNUNvbmYubnVtQ1BVcyA9IG01QWxwaGFBY2Nlc3MtPm51bUNQVXM7CiAgICBtNUNvbmYuaW50ckNsb2NrRnJlcXVlbmN5ID0gbTVBbHBoYUFjY2Vzcy0+aW50ckNsb2NrRnJlcXVlbmN5OwogICAgbTVDb25mLmNwdUNsb2NrID0gbTVBbHBoYUFjY2Vzcy0+Y3B1Q2xvY2s7CiAgICBtNUNvbmYubWVtX3NpemUgPSBtNUFscGhhQWNjZXNzLT5tZW1fc2l6ZTsKICAgIG01Q29uZi5rZXJuU3RhcnQgPSBtNUFscGhhQWNjZXNzLT5rZXJuU3RhcnQ7CiAgICBtNUNvbmYua2VybkVuZCA9IG01QWxwaGFBY2Nlc3MtPmtlcm5FbmQ7CiAgICBtNUNvbmYuZW50cnlQb2ludCA9IG01QWxwaGFBY2Nlc3MtPmVudHJ5UG9pbnQ7CiAgICBtNUNvbmYuZGlza1VuaXQgPSBtNUFscGhhQWNjZXNzLT5kaXNrVW5pdDsKICAgIG01Q29uZi5kaXNrQ291bnQgPSBtNUFscGhhQWNjZXNzLT5kaXNrQ291bnQ7CiAgICBtNUNvbmYuZGlza1BBZGRyID0gbTVBbHBoYUFjY2Vzcy0+ZGlza1BBZGRyOwogICAgbTVDb25mLmRpc2tCbG9jayA9IG01QWxwaGFBY2Nlc3MtPmRpc2tCbG9jazsKICAgIG01Q29uZi5kaXNrT3BlcmF0aW9uID0gbTVBbHBoYUFjY2Vzcy0+ZGlza09wZXJhdGlvbjsKICAgIG01Q29uZi5vdXRwdXRDaGFyID0gbTVBbHBoYUFjY2Vzcy0+b3V0cHV0Q2hhcjsKICAgIG01Q29uZi5pbnB1dENoYXIgPSBtNUFscGhhQWNjZXNzLT5pbnB1dENoYXI7CgogICAgaWYgKG01Q29uZi52ZXJzaW9uICE9IEFMUEhBX0FDQ0VTU19WRVJTSU9OKSAgewogICAgICAgIHBhbmljKCJDb25zb2xlIHZlcnNpb24gbWlzbWF0Y2guIENvbnNvbGUgZXhwZWN0cyAlZC4gaGFzICVkIFxuIiwKICAgICAgICAgICAgICBBTFBIQV9BQ0NFU1NfVkVSU0lPTiwgbTVDb25mLnZlcnNpb24pOwogICAgfQoKICAgIC8qCiAgICAgKiBzZXR1cCBhcmd1bWVudHMgdG8ga2VybmVsCiAgICAgKi8KICAgIHVuaXhCb290KGFyZ2MsIGFyZ3YpOwoKICAgIHBhbmljKCJ1bml4IGZhaWxlZCB0byBib290XG4iKTsKICAgIHJldHVybiAxOwp9CgovKgogKiBCT09USU5HCiAqLwpzdHJ1Y3QgcnBiIG01X3JwYiA9IHsKICAgIE5VTEwsCQkvKiAwMDA6IHBoeXNpY2FsIHNlbGYtcmVmZXJlbmNlICovCiAgICAoKGxvbmcpJ0gnKSB8ICgoKGxvbmcpJ1cnKSA8PCA4KSB8ICgoKGxvbmcpJ1InKSA8PCAxNikgfAogICAgKChsb25nKSdQJyA8PCAyNCkgfCAoKChsb25nKSdCJykgPDwgMzIpLCAgLyogMDA4OiBjb250YWlucyAiSFdSUEIiICovCiAgICA2LAkJCS8qIDAxMDogSFdSUEIgdmVyc2lvbiBudW1iZXIgKi8KICAgIC8qIHRoZSBieXRlIGNvdW50IGlzIHdyb25nLCBidXQgd2hvIG5lZWRzIGl0PyAtIGxhbmNlICovCiAgICAwLAkJCS8qIDAxODogYnl0ZXMgaW4gUlBCIHBlckNQVSBDVEIgQ1JCIE1FRFNDICovCiAgICAwLAkJCS8qIDAyMDogcHJpbWFyeSBjcHUgaWQgKi8KICAgIFBBR0VfU0laRSwJCS8qIDAyODogcGFnZSBzaXplIGluIGJ5dGVzICovCiAgICA0MywJCQkvKiAwMzA6IG51bWJlciBvZiBwaHlzIGFkZHIgYml0cyAqLwogICAgMTI3LAkJLyogMDM4OiBtYXggdmFsaWQgQVNOICovCiAgICB7JzAnLCcwJywnMCcsJzAnLCcwJywnMCcsJzAnLCcwJywnMCcsJzAnLCcwJywnMCcsJzAnLCcwJywnMCcsJzEnfSwKICAgICAgICAgICAgICAgICAgICAgICAgLyogMDQwOiBzeXN0ZW0gc2VyaWFsIG51bTogMTAgYXNjaWkgY2hhcnMgKi8KICAgIDAsIC8qIE9WRVJSSURERU4gKi8KICAgICgxPDwxMCksCQkvKiAwNTg6IHN5c3RlbSB2YXJpYXRpb24gKi8KICAgICdjJ3woJ28nPDw4KXwoJ28nPDwxNil8KCdsJzw8IDI0KSwJLyogMDYwOiBzeXN0ZW0gcmV2aXNpb24gKi8KICAgIDEwMjQqNDA5NiwJCS8qIDA2ODogc2NhbGVkIGludGVydmFsIGNsb2NrIGludHIgZnJlcSAqLwogICAgMCwJCQkvKiAwNzA6IGN5Y2xlIGNvdW50ZXIgZnJlcXVlbmN5ICovCiAgICAweDIwMDAwMDAwMCwJLyogMDc4OiB2aXJ0dWFsIHBhZ2UgdGFibGUgYmFzZSAqLwogICAgMCwJCQkvKiAwODA6IHJlc2VydmVkICovCiAgICAwLAkJCS8qIDA4ODogb2Zmc2V0IHRvIHRyYW5zbGF0aW9uIGJ1ZmZlciBoaW50ICovCiAgICAxLAkJCS8qIDA5MDogbnVtYmVyIG9mIHByb2Nlc3NvciBzbG90cyBPVkVSUklEREVOKi8KICAgIHNpemVvZihzdHJ1Y3QgcnBiX3BlcmNwdSksCS8qIDA5ODogcGVyLWNwdSBzbG90IHNpemUuIE9WRVJSSURERU4gKi8KICAgIDAsCQkJLyogMEEwOiBvZmZzZXQgdG8gcGVyX2NwdSBzbG90cyAqLwogICAgMSwJCQkvKiAwQTg6IG51bWJlciBvZiBDVEJzICovCiAgICBzaXplb2Yoc3RydWN0IGN0Yl90dCksCiAgICAwLAkJCS8qIDBCODogb2Zmc2V0IHRvIENUQiAoY29ucyB0ZXJtIGJsb2NrKSAqLwogICAgMCwJCQkvKiAwQzA6IG9mZnNldCB0byBDUkIgKGNvbnMgcm91dGluZSBibG9jaykgKi8KICAgIDAsCQkJLyogMEM4OiBvZmZzZXQgdG8gbWVtb3J5IGRlc2NyaXB0b3IgdGFibGUgKi8KICAgIDAsCQkJLyogMEQwOiBvZmZzZXQgdG8gY29uZmlnIGRhdGEgYmxvY2sgKi8KICAgIDAsCQkJLyogMEQ4OiBvZmZzZXQgdG8gRlJVIHRhYmxlICovCiAgICAwLAkJCS8qIDBFMDogdmlydCBhZGRyIG9mIHNhdmUgdGVybSByb3V0aW5lICovCiAgICAwLAkJCS8qIDBFODogcHJvYyB2YWx1ZSBmb3Igc2F2ZSB0ZXJtIHJvdXRpbmUgKi8KICAgIDAsCQkJLyogMEYwOiB2aXJ0IGFkZHIgb2YgcmVzdG9yZSB0ZXJtIHJvdXRpbmUgKi8KICAgIDAsCQkJLyogMEY4OiBwcm9jIHZhbHVlIGZvciByZXN0b3JlIHRlcm0gcm91dGluZSAqLwogICAgMCwJCQkvKiAxMDA6IHZpcnQgYWRkciBvZiBDUFUgcmVzdGFydCByb3V0aW5lICovCiAgICAwLAkJCS8qIDEwODogcHJvYyB2YWx1ZSBmb3IgQ1BVIHJlc3RhcnQgcm91dGluZSAqLwogICAgMCwJCQkvKiAxMTA6IHVzZWQgdG8gZGV0ZXJtaW5lIHByZXNlbmNlIG9mIGtkZWJ1ZyAqLwogICAgMCwJCQkvKiAxMTg6IHJlc2VydmVkIGZvciBoYXJkd2FyZSAqLwovKiB0aGUgY2hlY2tzdW0gaXMgd3JvbmcsIGJ1dCB3aG8gbmVlZHMgaXQ/IC0gbGFuY2UgKi8KICAgIDAsCQkJLyogMTIwOiBjaGVja3N1bSBvZiBwcmlvciBlbnRyaWVzIGluIHJwYiAqLwogICAgMCwJCQkvKiAxMjg6IHJlY2VpdmUgcmVhZHkgYml0bWFzayAqLwogICAgMCwJCQkvKiAxMzA6IHRyYW5zbWl0IHJlYWR5IGJpdG1hc2sgKi8KICAgIDAsCQkJLyogMTM4OiBEeW5hbWljIFN5c3RlbSBSZWNvZy4gb2Zmc2V0ICovCn07Cgp1bG9uZyBtNV90YmJbXSA9IHsgMHgxZTFlMWUxZTFlMWUxZTFlLCAweDFlMWUxZTFlMWUxZTFlMWUsCiAgICAgICAgICAgICAgICAgICAweDFlMWUxZTFlMWUxZTFlMWUsIDB4MWUxZTFlMWUxZTFlMWUxZSwKICAgICAgICAgICAgICAgICAgIDB4MWUxZTFlMWUxZTFlMWUxZSwgMHgxZTFlMWUxZTFlMWUxZTFlLAogICAgICAgICAgICAgICAgICAgMHgxZTFlMWUxZTFlMWUxZTFlLCAweDFlMWUxZTFlMWUxZTFlMWUgfTsKCnN0cnVjdCBycGJfcGVyY3B1IG01X3JwYl9wZXJjcHUgPSB7CiAgICB7MCwwLDAsMCwwLDAsMSx7MCwwfSx7MCwwLDAsMCwwLDAsMCwwfX0sIC8qIDAwMDogYm9vdC9yZXN0YXJ0IEhXUENCICovCiAgICAoU1RBVEVfUEEgfCBTVEFURV9QUCB8IFNUQVRFX0NWIHwKICAgICBTVEFURV9QViB8IFNUQVRFX1BNViB8IFNUQVRFX1BMKSwgCS8qIDA4MDogcGVyLWNwdSBzdGF0ZSBiaXRzICovCiAgICAweGMwMDAsCQkJCS8qIDA4ODogcGFsY29kZSBtZW1vcnkgbGVuZ3RoICovCiAgICAweDIwMDAsCQkJCS8qIDA5MDogcGFsY29kZSBzY3JhdGNoIGxlbmd0aCAqLwogICAgMHg0MDAwLAkJCQkvKiAwOTg6IHBhZGRyIG9mIHBhbCBtZW0gc3BhY2UgKi8KICAgIDB4MjAwMCwJCQkJLyogMEEwOiBwYWRkciBvZiBwYWwgc2NyYXRjaCBzcGFjZSAqLwogICAgKDIgPDwgMTYpIHwgKDUgPDwgOCkgfCAxLAkJLyogMEE4OiBQQUxjb2RlIHJldiByZXF1aXJlZCAqLwogICAgMTEgfCAoMkwgIDw8IDMyKSwJCQkvKiAwQjA6IHByb2Nlc3NvciB0eXBlICovCiAgICA3LAkJCQkJLyogMEI4OiBwcm9jZXNzb3IgdmFyaWF0aW9uICovCiAgICAnTSd8KCc1Jzw8OCl8KCdBJzw8MTYpfCgnMCc8PDI0KSwJLyogMEMwOiBwcm9jZXNzb3IgcmV2aXNpb24gKi8KICAgIHsnTScsJzUnLCcvJywnQScsJ2wnLCdwJywnaCcsJ2EnLCcwJywnMCcsJzAnLCcwJywnMCcsJzAnLCcwJywnMCd9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMEM4OiBwcm9jIHNlcmlhbCBudW06IDEwIGNoYXJzICovCiAgICAwLAkJCQkJLyogMEQ4OiBwaHlzIGFkZHIgb2YgbG9nb3V0IGFyZWEgKi8KICAgIDAsCQkJCQkvKiAwRTA6IGxlbiBpbiBieXRlcyBvZiBsb2dvdXQgYXJlYSAqLwogICAgMCwJCQkJCS8qIDBFODogaGFsdCBwY2IgYmFzZSAqLwogICAgMCwJCQkJCS8qIDBGMDogaGFsdCBwYyAqLwogICAgMCwJCQkJCS8qIDBGODogaGFsdCBwcyAqLwogICAgMCwJCQkJCS8qIDEwMDogaGFsdCBhcmcgbGlzdCAoUjI1KSAqLwogICAgMCwJCQkJCS8qIDEwODogaGFsdCByZXR1cm4gYWRkcmVzcyAoUjI2KSAqLwogICAgMCwJCQkJCS8qIDExMDogaGFsdCBwcm9jZWR1cmUgdmFsdWUgKFIyNykgKi8KICAgIDAsCQkgICAgICAgCQkJLyogMTE4OiByZWFzb24gZm9yIGhhbHQgKi8KICAgIDAsCQkgICAgICAgCQkJLyogMTIwOiBmb3Igc29mdHdhcmUgKi8KICAgIHswfSwJCQkJLyogMTI4OiBpbnRlci1jb25zb2xlIGNvbW0gYnVmZmVyICovCiAgICB7MSwwLDUsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0sCS8qIDFEMDogUEFMY29kZSByZXZzIGF2YWlsYWJsZSAqLwogICAgMAkJCQkJLyogMjUwOiByZXNlcnZlZCBmb3IgYXJjaCB1c2UgKi8KLyogdGhlIGR1bXAgc3RhY2sgZ3Jvd3MgZnJvbSB0aGUgZW5kIG9mIHRoZSBycGIgcGFnZSBub3QgdG8gcmVhY2ggaGVyZSAqLwp9OwoKc3RydWN0IF9tNV9ycGJfbWR0IHsKICAgIGxvbmcgICBycGJfY2hlY2tzdW07CS8qIDAwMDogY2hlY2tzdW0gb2YgZW50aXJlIG1lbSBkZXNjIHRhYmxlICovCiAgICBsb25nICAgcnBiX2ltcGFkZHI7CQkvKiAwMDg6IFBBIG9mIGltcGxlbWVudGF0aW9uIGRlcCBpbmZvICovCiAgICBsb25nICAgcnBiX251bWNsOwkJLyogMDEwOiBudW1iZXIgb2YgY2x1c3RlcnMgKi8KICAgIHN0cnVjdCBycGJfY2x1c3RlciBycGJfY2x1c3RlclszXTsJLyogZmlyc3QgaW5zdGFuY2Ugb2YgYSBjbHVzdGVyICovCn07CgpzdHJ1Y3QgX201X3JwYl9tZHQgbTVfcnBiX21kdCA9IHsKICAgIDAsCQkJLyogMDAwOiBjaGVja3N1bSBvZiBlbnRpcmUgbWVtIGRlc2MgdGFibGUgKi8KICAgIDAsCQkJLyogMDA4OiBQQSBvZiBpbXBsZW1lbnRhdGlvbiBkZXAgaW5mbyAqLwogICAgMCwJCQkvKiAwMTA6IG51bWJlciBvZiBjbHVzdGVycyAqLwogICAge3sJMCwJCS8qIDAwMDogc3RhcnRpbmcgUEZOIG9mIHRoaXMgY2x1c3RlciAqLwogICAgICAgIDAsCQkvKiAwMDg6IGNvdW50IG9mIFBGTnMgaW4gdGhpcyBjbHVzdGVyICovCiAgICAgICAgMCwJCS8qIDAxMDogY291bnQgb2YgdGVzdGVkIFBGTnMgaW4gY2x1c3RlciAqLwogICAgICAgIDAsCQkvKiAwMTg6IHZhIG9mIGJpdG1hcCAqLwogICAgICAgIDAsCQkvKiAwMjA6IHBhIG9mIGJpdG1hcCAqLwogICAgICAgIDAsCQkvKiAwMjg6IGNoZWNrc3VtIG9mIGJpdG1hcCAqLwogICAgICAgIDEJCS8qIDAzMDogdXNhZ2Ugb2YgY2x1c3RlciAqLwogICAgIH0sCiAgICAgeyAgIDAsCQkvKiAwMDA6IHN0YXJ0aW5nIFBGTiBvZiB0aGlzIGNsdXN0ZXIgKi8KICAgICAgICAgMCwJCS8qIDAwODogY291bnQgb2YgUEZOcyBpbiB0aGlzIGNsdXN0ZXIgKi8KICAgICAgICAgMCwJCS8qIDAxMDogY291bnQgb2YgdGVzdGVkIFBGTnMgaW4gY2x1c3RlciAqLwogICAgICAgICAwLAkJLyogMDE4OiB2YSBvZiBiaXRtYXAgKi8KICAgICAgICAgMCwJCS8qIDAyMDogcGEgb2YgYml0bWFwICovCiAgICAgICAgIDAsCQkvKiAwMjg6IGNoZWNrc3VtIG9mIGJpdG1hcCAqLwogICAgICAgICAwCQkvKiAwMzA6IHVzYWdlIG9mIGNsdXN0ZXIgKi8KICAgICB9LAogICAgIHsgICAwLAkJLyogMDAwOiBzdGFydGluZyBQRk4gb2YgdGhpcyBjbHVzdGVyICovCiAgICAgICAgIDAsCQkvKiAwMDg6IGNvdW50IG9mIFBGTnMgaW4gdGhpcyBjbHVzdGVyICovCiAgICAgICAgIDAsCQkvKiAwMTA6IGNvdW50IG9mIHRlc3RlZCBQRk5zIGluIGNsdXN0ZXIgKi8KICAgICAgICAgMCwJCS8qIDAxODogdmEgb2YgYml0bWFwICovCiAgICAgICAgIDAsCQkvKiAwMjA6IHBhIG9mIGJpdG1hcCAqLwogICAgICAgICAwLAkJLyogMDI4OiBjaGVja3N1bSBvZiBiaXRtYXAgKi8KICAgICAgICAgMAkJLyogMDMwOiB1c2FnZSBvZiBjbHVzdGVyICovCiAgICAgfX0KfTsKCi8qIGNvbnN0YW50cyBmb3Igc2xvdGluZm8gYnVzX3R5cGUgc3ViZmllbGQgKi8KI2RlZmluZSBTTE9USU5GT19UQwkwCiNkZWZpbmUgU0xPVElORk9fSVNBCTEKI2RlZmluZSBTTE9USU5GT19FSVNBCTIKI2RlZmluZSBTTE9USU5GT19QQ0kJMwoKc3RydWN0IHJwYl9jdGIgbTVfcnBiX2N0YiA9IHsKICAgIENPTlNfRFosCS8qIDAwMDogY29uc29sZSB0eXBlICovCiAgICAwLAkJLyogMDA4OiBjb25zb2xlIHVuaXQgKi8KICAgIDAsCQkvKiAwMTA6IHJlc2VydmVkICovCiAgICAwCQkvKiAwMTg6IGJ5dGUgbGVuZ3RoIG9mIGRldmljZSBkZXAgcG9ydGlvbiAqLwp9OwoKLyogd2UgZG9uJ3QgZG8gYW55IGZpeHVwIChha2EgcmVsb2NhdGUgdGhlIGNvbnNvbGUpIC0gd2UgaG9wZSAqLwpzdHJ1Y3QgcnBiX2NyYiBtNV9ycGJfY3JiID0gewogICAgMCwJCS8qIHZhIG9mIGNhbGwtYmFjayBkaXNwYXRjaCBydG4gKi8KICAgIDAsCQkvKiBwYSBvZiBjYWxsLWJhY2sgZGlzcGF0Y2ggcnRuICovCiAgICAwLAkJLyogdmEgb2YgY2FsbC1iYWNrIGZpeHVwIHJ0biAqLwogICAgMCwJCS8qIHBhIG9mIGNhbGwtYmFjayBmaXh1cCBydG4gKi8KICAgIDAsCQkvKiBudW1iZXIgb2YgZW50cmllcyBpbiBwaHlzL3ZpcnQgbWFwICovCiAgICAwCQkvKiBOdW1iZXIgb2YgcGFnZXMgdG8gYmUgbWFwcGVkICovCn07CgpzdHJ1Y3QgX3JwYl9uYW1lIHsKICAgIHVsb25nIGxlbmd0aDsKICAgIGNoYXIgbmFtZVsxNl07Cn07CgpleHRlcm4gc3RydWN0IF9ycGJfbmFtZSBtNV9uYW1lOwoKc3RydWN0IHJwYl9kc3IgbTVfcnBiX2RzciA9IHsKICAgIDAsCiAgICAwLAogICAgMCwKfTsKCnN0cnVjdCBfcnBiX25hbWUgbTVfbmFtZSA9IHsKICAgIDE2LAogICAgeydVJywnTScsJ0knLCdDJywnSCcsJyAnLCdNJywnNScsJy8nLCdBJywnTCcsJ1AnLCdIJywnQScsJyAnLDB9LAp9OwoKLyoKICogTTUgaGFzIG9uZSBMVVJUIGVudHJ5OgogKiAgIDEwNTAgaXMgZm9yIHdvcmtzdGF0aW9ucwogKiAgIDExMDAgaXMgc2VydmVycyAoYW5kIGlzIG5lZWRlZCBmb3IgQ1hYKQogKi8KbG9uZyBtNV9sdXJ0WzEwXSA9IHsgOSwgMTIsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDExMDAsIDExMDAgfTsKCnVsb25nIHVuaXhfYm9vdF9tZW07CnVsb25nIGJvb3RhZHI7CgpjaGFyICoqa2FyZ3Y7CmludCBrYXJnYzsKdWxvbmcgZnJlZV9wZm47CnN0cnVjdCBycGJfcGVyY3B1ICpycGJfcGVyY3B1OwoKY2hhciAqCnVuaXhfYm9vdF9hbGxvYyhpbnQgcGFnZXMpCnsKICAgIGNoYXIgKnJldCA9IChjaGFyICopdW5peF9ib290X21lbTsKICAgIHVuaXhfYm9vdF9tZW0gKz0gKHBhZ2VzICogUEFHRV9TSVpFKTsKICAgIHJldHVybiByZXQ7Cn0KCnVsb25nICpmaXJzdCA9IDA7CnVsb25nICp0aGlyZF9ycGIgPSAwOwp1bG9uZyAqcmVzZXJ2ZWRGaXh1cCA9IDA7CgppbnQgc3RyY3B5KGNoYXIgKmRzdCwgY2hhciAqc3JjKTsKCnN0cnVjdCBycGIgKnJwYjsKZXh0ZXJuIHVsb25nIF9lbmQ7Cgp2b2lkCnVuaXhCb290KGludCBhcmdjLCBjaGFyICoqYXJndikKewogICAgdWxvbmcgKnNlY29uZCwgICp0aGlyZF9rZXJuZWwsIHB0ciwgKnRiYiwgc2l6ZSwgKnBlcmNwdV9sb2dvdXQ7CiAgICB1bnNpZ25lZCBjaGFyICptZHRfYml0bWFwOwogICAgbG9uZyAqbHAxLCAqbHAyLCBzdW07CiAgICBpbnQgaSwgY2w7CiAgICB1bG9uZyBrZXJuX2ZpcnN0X3BhZ2U7CiAgICB1bG9uZyBtZW1fc2l6ZSA9IG01Q29uZi5tZW1fc2l6ZTsKCiAgICB1bG9uZyBtZW1fcGFnZXMgPSBtZW1fc2l6ZSAvIFBBR0VfU0laRSwgY29uc19wYWdlczsKICAgIHVsb25nIG1kdF9iaXRtYXBfcGFnZXMgPSBtZW1fcGFnZXMgLyAoUEFHRV9TSVpFKjgpOwoKICAgIHVsb25nIGtlcm5lbF9ieXRlcywga3NwLCBrZXJuZWxfZW5kLCAqdW5peF9rZXJuZWxfc3RhY2ssIGJzcywKICAgICAgICBrc3BfYm90dG9tLCBrc3BfdG9wOwogICAgc3RydWN0IHJwYl9jdGIgKnJwYl9jdGI7CiAgICBzdHJ1Y3QgY3RiX3R0ICpjdGJfdHQ7CiAgICBzdHJ1Y3QgcnBiX2RzciAqcnBiX2RzcjsKICAgIHN0cnVjdCBycGJfY3JiICpycGJfY3JiOwogICAgc3RydWN0IF9tNV9ycGJfbWR0ICpycGJfbWR0OwogICAgaW50ICpycGJfbHVydDsKICAgIGNoYXIgKnJwYl9uYW1lOwogICAgdWxvbmcgbmV4dFB0cjsKCiAgICBwcmludGZfbG9jaygibWVtc2l6ZSAleCBwYWdlcyAleCBcbiIsIG1lbV9zaXplLCBtZW1fcGFnZXMpOwoKICAgIC8qIEFsbG9jYXRlOgogICAgICogICB0d28gcGFnZXMgZm9yIHRoZSBIV1JQQgogICAgICogICBmaXZlIHBhZ2UgdGFibGUgcGFnZXM6CiAgICAgKiAgICAgMTogRmlyc3QgbGV2ZWwgcGFnZSB0YWJsZQogICAgICogICAgIDE6IFNlY29uZCBsZXZlbCBwYWdlIHRhYmxlCiAgICAgKiAgICAgMTogVGhpcmQgbGV2ZWwgcGFnZSB0YWJsZSBmb3IgSFdSUEIKICAgICAqICAgICAyOiBUaGlyZCBsZXZlbCBwYWdlIHRhYmxlIGZvciBrZXJuZWwgKGZvciB1cCB0byAxNk1CKQogICAgICogc2V0IHVwIHRoZSBwYWdlIHRhYmxlcwogICAgICogbG9hZCB0aGUga2VybmVsIGF0IHRoZSBwaHlzaWNhbCBhZGRyZXNzIDB4MjMwMDAwCiAgICAgKiBidWlsZCB0aGUgSFdSUEIKICAgICAqICAgc2V0IHVwIG1lbW9yeSBkZXNjcmlwdG9yIHRhYmxlIHRvIGdpdmUgdXAgdGhlCiAgICAgKiAgIHBoeXNpY2FsIG1lbW9yeSBiZXR3ZWVuIHRoZSBlbmQgb2YgdGhlIHBhZ2UKICAgICAqICAgdGFibGVzIGFuZCB0aGUgc3RhcnQgb2YgdGhlIGtlcm5lbAogICAgICogZW5hYmxlIGtzZWcgYWRkcmVzc2luZwogICAgICoganVtcCB0byB0aGUga2VybmVsCiAgICAgKi8KCiAgICB1bml4X2Jvb3RfbWVtID0gUk9VTkRVUDhLKCZfZW5kKTsKCiAgICBwcmludGZfbG9jaygiRmlyc3QgZnJlZSBwYWdlIGFmdGVyIFJPTSAweCV4XG4iLCB1bml4X2Jvb3RfbWVtKTsKCiAgICBycGIgPSAoc3RydWN0IHJwYiAqKXVuaXhfYm9vdF9hbGxvYyhIV1JQQl9QQUdFUyk7CgogICAgbWR0X2JpdG1hcCA9ICh1bnNpZ25lZCBjaGFyICopdW5peF9ib290X2FsbG9jKG1kdF9iaXRtYXBfcGFnZXMpOwogICAgZmlyc3QgPSAodWxvbmcgKil1bml4X2Jvb3RfYWxsb2MoMSk7CiAgICBzZWNvbmQgPSAodWxvbmcgKil1bml4X2Jvb3RfYWxsb2MoMSk7CiAgICB0aGlyZF9ycGIgPSAodWxvbmcgKil1bml4X2Jvb3RfYWxsb2MoMSk7CiAgICByZXNlcnZlZEZpeHVwID0gKHVsb25nKikgdW5peF9ib290X2FsbG9jKDEpOwogICAgdGhpcmRfa2VybmVsID0gKHVsb25nICopdW5peF9ib290X2FsbG9jKE5VTV9LRVJORUxfVEhJUkQpOwogICAgcGVyY3B1X2xvZ291dCA9ICh1bG9uZyopdW5peF9ib290X2FsbG9jKDEpOwoKICAgIGNvbnNfcGFnZXMgPSBLU0VHX1RPX1BIWVModW5peF9ib290X21lbSkgLyBQQUdFX1NJWkU7CgogICAgLyogU2V0IHVwIHRoZSBwYWdlIHRhYmxlcyAqLwogICAgYnplcm8oKGNoYXIgKilmaXJzdCwgUEFHRV9TSVpFKTsKICAgIGJ6ZXJvKChjaGFyICopc2Vjb25kLCBQQUdFX1NJWkUpOwogICAgYnplcm8oKGNoYXIgKilyZXNlcnZlZEZpeHVwLCBQQUdFX1NJWkUpOwogICAgYnplcm8oKGNoYXIgKil0aGlyZF9ycGIsIEhXUlBCX1BBR0VTICogUEFHRV9TSVpFKTsKICAgIGJ6ZXJvKChjaGFyICopdGhpcmRfa2VybmVsLCBQQUdFX1NJWkUgKiBOVU1fS0VSTkVMX1RISVJEKTsKCiAgICBmaXJzdFswXSA9IEtQVEUoUEZOKHNlY29uZCkpOwogICAgZmlyc3RbMV0gPSBLUFRFKFBGTihmaXJzdCkpOyAvKiBSZWdpb24gMyAqLwoKICAgIC8qIFJlZ2lvbiAwICovCiAgICBzZWNvbmRbU0VDT05EKDB4MTAwMDAwMDApXSA9IEtQVEUoUEZOKHRoaXJkX3JwYikpOwoKICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fS0VSTkVMX1RISVJEOyBpKyspIHsKICAgICAgICAvKiBSZWdpb24gMSAqLwogICAgICAgIHNlY29uZFtTRUNPTkQoMHgyMDAwMDAwMCkgKyBpXSA9IEtQVEUoUEZOKHRoaXJkX2tlcm5lbCkgKyBpKTsKICAgIH0KCiAgICAvKiBSZWdpb24gMiAqLwogICAgc2Vjb25kW1NFQ09ORCgweDQwMDAwMDAwKV0gPSBLUFRFKFBGTihzZWNvbmQpKTsKCgogICAgLyogRm9yIHNvbWUgb2JzY3VyZSByZWFzb24sIERlYyBVbml4J3MgZGF0YWJhc2UgcmVhZAogICAgICogZnJvbSAvZXRjL3N5c2NvbmZpZ3RhYiBpcyB3cml0dGVuIHRvIHRoaXMgZml4ZWQKICAgICAqIG1hcHBlZCBtZW1vcnkgbG9jYXRpb24uIEdvIGZpZ3VyZSwgc2luY2UgaXQgaXMKICAgICAqIG5vdCBpbml0aWFsaXplZCBieSB0aGUgY29uc29sZS4gTWF5YmUgaXQgaXMKICAgICAqIHRvIGxvb2sgYXQgdGhlIGRhdGFiYXNlIGZyb20gdGhlIGNvbnNvbGUKICAgICAqIGFmdGVyIGEgYm9vdC9jcmFzaC4KICAgICAqCiAgICAgKiBCbGFjayBtYWdpYyB0byBlc3RpbWF0ZSB0aGUgbWF4IHNpemUuIFNFR1ZzIG9uIG92ZXJmbG93CiAgICAgKiBidWduaW9uCiAgICAgKi8KCiNkZWZpbmUgREFUQUJBU0VfQkFTRSAgICAgICAgICAgMHgyMDAwMDAwMAojZGVmaW5lIERBVEFCQVNFX0VORCAgICAgICAgICAgIDB4MjAwMjAwMDAKCiAgICB1bG9uZyAqZGJQYWdlID0gKHVsb25nKil1bml4X2Jvb3RfYWxsb2MoMSk7CiAgICBiemVybyhkYlBhZ2UsIFBBR0VfU0laRSk7CiAgICBzZWNvbmRbU0VDT05EKERBVEFCQVNFX0JBU0UpXSA9IEtQVEUoUEZOKGRiUGFnZSkpOwogICAgZm9yIChpID0gREFUQUJBU0VfQkFTRTsgaSA8IERBVEFCQVNFX0VORCA7IGkgKz0gUEFHRV9TSVpFKSB7CiAgICAgICAgdWxvbmcgKmRiID0gKHVsb25nKil1bml4X2Jvb3RfYWxsb2MoMSk7CiAgICAgICAgZGJQYWdlW1RISVJEKGkpXSA9IEtQVEUoUEZOKGRiKSk7CiAgICB9CgogICAgLyogUmVnaW9uIDAgKi8KICAgIC8qIE1hcCB0aGUgSFdSUEIgKi8KICAgIGZvciAoaSA9IDA7IGkgPCBIV1JQQl9QQUdFUzsgaSsrKQogICAgICAgIHRoaXJkX3JwYltpXSA9IEtQVEUoUEZOKHJwYikgKyBpKTsKCiAgICAvKiBNYXAgdGhlIE1EVCBiaXRtYXAgdGFibGUgKi8KICAgIGZvciAoaSA9IDA7IGkgPCBtZHRfYml0bWFwX3BhZ2VzOyBpKyspIHsKICAgICAgICB0aGlyZF9ycGJbSFdSUEJfUEFHRVMgKyBpXSA9IEtQVEUoUEZOKG1kdF9iaXRtYXApICsgaSk7CiAgICB9CgogICAgLyogUHJvdGVjdCB0aGUgUEFMIHBhZ2VzICovCiAgICBmb3IgKGkgPSAxOyBpIDwgUEZOKGZpcnN0KTsgaSsrKQogICAgICAgIHRoaXJkX3JwYltIV1JQQl9QQUdFUyArIG1kdF9iaXRtYXBfcGFnZXMgKyBpXSA9IEtQVEUoaSk7CgogICAvKiBTZXQgdXAgdGhpcmRfa2VybmVsIGFmdGVyIGl0J3MgbG9hZGVkLCB3aGVuIHdlIGtub3cgd2hlcmUgaXQgaXMgKi8KICAgIGtlcm5fZmlyc3RfcGFnZSA9IChLU0VHX1RPX1BIWVMobTVDb25mLmtlcm5TdGFydCkvUEFHRV9TSVpFKTsKICAgIGtlcm5lbF9lbmQgPSBST1VORFVQOEsobTVDb25mLmtlcm5FbmQpOwogICAgYm9vdGFkciA9IG01Q29uZi5lbnRyeVBvaW50OwoKICAgIHByaW50Zl9sb2NrKCJIV1JQQiAweCV4IGwxcHQgMHgleCBsMnB0IDB4JXggbDNwdF9ycGIgMHgleCBsM3B0X2tlcm5lbCAweCV4IgogICAgICAgICAgICAgICAgIiBsMnJlc2VydiAweCV4XG4iLAogICAgICAgICAgICAgICAgcnBiLCBmaXJzdCwgc2Vjb25kLCB0aGlyZF9ycGIsIHRoaXJkX2tlcm5lbCwgcmVzZXJ2ZWRGaXh1cCk7CiAgICBpZiAoa2VybmVsX2VuZCAtIG01Q29uZi5rZXJuU3RhcnQgPiAoMHg4MDAwMDAqTlVNX0tFUk5FTF9USElSRCkpIHsKICAgICAgICBwcmludGZfbG9jaygiS2VybmVsIGlzIG1vcmUgdGhhbiA4TUIgMHgleCAtIDB4JXggPSAweCV4XG4iLAogICAgICAgICAgICAgICAgICAgIGtlcm5lbF9lbmQsIG01Q29uZi5rZXJuU3RhcnQsCiAgICAgICAgICAgICAgICAgICAga2VybmVsX2VuZCAtIG01Q29uZi5rZXJuU3RhcnQgKTsKICAgICAgICBwYW5pYygia2VybmVsIHRvbyBiaWdcbiIpOwogICAgfQogICAgcHJpbnRmX2xvY2soImtzdGFydCA9IDB4JXgsIGtlbmQgPSAweCV4LCBrZW50cnkgPSAweCV4LCBudW1DUFVzID0gMHgleFxuIiwgbTVDb25mLmtlcm5TdGFydCwgbTVDb25mLmtlcm5FbmQsIG01Q29uZi5lbnRyeVBvaW50LCBtNUNvbmYubnVtQ1BVcyk7CiAgICBrc3BfYm90dG9tID0gKHVsb25nKXVuaXhfYm9vdF9hbGxvYygxKTsKICAgIGtzcF90b3AgPSBrc3BfYm90dG9tICsgUEFHRV9TSVpFOwogICAgcHRyID0gKHVsb25nKSBrc3BfYm90dG9tOwogICAgYnplcm8oKGNoYXIgKilwdHIsIFBBR0VfU0laRSk7CiAgICBkYlBhZ2VbVEhJUkQoS1NUQUNLX1JFR0lPTl9WQSldID0gMDsJCSAgICAgICAgICAvKiBTdGFjayBHdWFyZCBQYWdlICovCiAgICBkYlBhZ2VbVEhJUkQoS1NUQUNLX1JFR0lPTl9WQSArIFBBR0VfU0laRSldID0gS1BURShQRk4ocHRyKSk7IC8qIEtlcm5lbCBTdGFjayBQYWdlICovCiAgICBkYlBhZ2VbVEhJUkQoS1NUQUNLX1JFR0lPTl9WQSArIDIqUEFHRV9TSVpFKV0gPSAwOwkJICAvKiBTdGFjayBHdWFyZCBQYWdlICovCgogICAgLyogcHV0IGFyZ3YgaW50byB0aGUgYm90dG9tIG9mIHRoZSBzdGFjayAtIGFyZ3Ygc3RhcnRzIGF0IDEgYmVjYXVzZQogICAgICogdGhlIGNvbW1hbmQgdGhhdHIgZ290IHVzIGhlcmUgKGkuZS4gInVuaXhib290KSBpcyBpbiBhcmd2WzBdLgogICAgICovCiAgICBrc3AgPSBrc3BfdG9wIC0gODsJCQkvKiBCYWNrIHVwIG9uZSBsb25nd29yZCAqLwogICAga3NwIC09IGFyZ2MgKiBzaXplb2YoY2hhciAqKTsJLyogTWFrZSByb29tIGZvciBhcmd2ICovCiAgICBrYXJndiA9IChjaGFyICoqKSBrc3A7CiAgICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CS8qIENvcHkgYXJndW1lbnRzIHRvIHN0YWNrICovCiAgICAgICAga3NwIC09ICgoc3RybGVuKGFyZ3ZbaV0pICsgMSkgKyA3KSAmIH4weDc7CiAgICAgICAga2FyZ3ZbaS0xXSA9IChjaGFyICopIGtzcDsKICAgICAgICBzdHJjcHkoa2FyZ3ZbaSAtIDFdLCBhcmd2W2ldKTsKICAgIH0KICAgIGthcmdjID0gaSAtIDE7CiAgICBrYXJndltrYXJnY10gPSBOVUxMOwkvKiBqdXN0IHRvIGJlIHN1cmU7IGRvZXNuJ3Qgc2VlbSB0byBiZSB1c2VkICovCiAgICBrc3AgLT0gc2l6ZW9mKGNoYXIgKik7CS8qIHBvaW50IGFib3ZlIGxhc3QgYXJnIGZvciBubyByZWFsIHJlYXNvbiAqLwoKICAgIGZyZWVfcGZuID0gUEZOKGtlcm5lbF9lbmQpOwoKICAgIGJjb3B5KChjaGFyICopJm01X3JwYiwgKGNoYXIgKilycGIsIHNpemVvZihzdHJ1Y3QgcnBiKSk7CgogICAgcnBiLT5ycGJfc2VsZnJlZiA9IChzdHJ1Y3QgcnBiICopIEtTRUdfVE9fUEhZUyhycGIpOwogICAgcnBiLT5ycGJfc3RyaW5nID0gMHgwMDAwMDA0MjUwNTI1NzQ4OwoKICAgIHRiYiA9ICh1bG9uZyAqKSAoKChjaGFyICopIHJwYikgKyBST1VORFVQOChzaXplb2Yoc3RydWN0IHJwYikpKTsKICAgIHJwYi0+cnBiX3RyYW5zX29mZiA9ICh1bG9uZyl0YmIgLSAodWxvbmcpcnBiOwogICAgYmNvcHkoKGNoYXIgKiltNV90YmIsIChjaGFyICopdGJiLCBzaXplb2YobTVfdGJiKSk7CgogICAgLyoKICAgICAqIHJwYl9jb3VudGVyLiBVc2UgdG8gZGV0ZXJtaW5lIHRpbWVvdXRzIGluIE9TLgogICAgICogWFhYIG11c3QgYmUgcGF0Y2hlZCBhZnRlciBhIGNoZWNrcG9pbnQgcmVzdG9yZSAoSSBndWVzcykKICAgICAqLwoKICAgIHByaW50Zl9sb2NrKCJDUFUgQ2xvY2sgYXQgJWQgTUh6IEludHJDbG9ja0ZyZXF1ZW5jeT0lZCBcbiIsCiAgICAgICAgICAgICAgICBtNUNvbmYuY3B1Q2xvY2ssIG01Q29uZi5pbnRyQ2xvY2tGcmVxdWVuY3kpOwogICAgcnBiLT5ycGJfY291bnRlciA9IG01Q29uZi5jcHVDbG9jayAqIDEwMDAgKiAxMDAwOwoKICAgIC8qCiAgICAgKiBCeSBkZWZpbml0aW9uLCB0aGUgcnBiX2Nsb2NrIGlzIHNjYWxlZCBieSA0MDk2IChpbiBoeikKICAgICAqLwogICAgcnBiLT5ycGJfY2xvY2sgPSBtNUNvbmYuaW50ckNsb2NrRnJlcXVlbmN5ICogNDA5NjsKCiAgICAvKgogICAgICogUGVyIENQVSBTbG90cy4gTXVsdGlwcm9jZXNzb3Igc3VwcG9ydC4KICAgICAqLwogICAgaW50IHBlcmNwdV9zaXplID0gUk9VTkRVUDEyOChzaXplb2Yoc3RydWN0IHJwYl9wZXJjcHUpKTsKCiAgICBwcmludGZfbG9jaygiQm9vdGluZyB3aXRoICVkIHByb2Nlc3NvcihzKSBcbiIsIG01Q29uZi5udW1DUFVzKTsKCiAgICBycGItPnJwYl9udW1wcm9jcyA9IG01Q29uZi5udW1DUFVzOwogICAgcnBiLT5ycGJfc2xvdHNpemUgPSBwZXJjcHVfc2l6ZTsKICAgIHJwYl9wZXJjcHUgPSAoc3RydWN0IHJwYl9wZXJjcHUgKikKICAgICAgICBST1VORFVQMTI4KCgodWxvbmcpdGJiKSArIChzaXplb2YobTVfdGJiKSkpOwoKICAgIHJwYi0+cnBiX3BlcmNwdV9vZmYgPSAodWxvbmcpcnBiX3BlcmNwdSAtICh1bG9uZylycGI7CgogICAgZm9yIChpID0gMDsgaSA8IG01Q29uZi5udW1DUFVzOyBpKyspIHsKICAgICAgICBzdHJ1Y3QgcnBiX3BlcmNwdSAqdGhpc0NQVSA9IChzdHJ1Y3QgcnBiX3BlcmNwdSopCiAgICAgICAgICAgICgodWxvbmcpcnBiX3BlcmNwdSArIHBlcmNwdV9zaXplICogaSk7CgogICAgICAgIGJ6ZXJvKChjaGFyICopdGhpc0NQVSwgcGVyY3B1X3NpemUpOwogICAgICAgIGJjb3B5KChjaGFyICopJm01X3JwYl9wZXJjcHUsIChjaGFyICopdGhpc0NQVSwKICAgICAgICAgICAgICBzaXplb2Yoc3RydWN0IHJwYl9wZXJjcHUpKTsKCiAgICAgICAgdGhpc0NQVS0+cnBiX3BjYi5ycGJfa3NwID0gKEtTVEFDS19SRUdJT05fVkEgKyAyKlBBR0VfU0laRSAtIChrc3BfdG9wIC0ga3NwKSk7CiAgICAgICAgdGhpc0NQVS0+cnBiX3BjYi5ycGJfcHRiciA9IFBGTihmaXJzdCk7CgogICAgICAgIHRoaXNDUFUtPnJwYl9sb2dvdXQgPSBLU0VHX1RPX1BIWVMocGVyY3B1X2xvZ291dCk7CiAgICAgICAgdGhpc0NQVS0+cnBiX2xvZ291dF9sZW4gPSBQQUdFX1NJWkU7CgogICAgICAgIHByaW50Zl9sb2NrKCJLU1A6IDB4JXggUFRCUiAweCV4XG4iLAogICAgICAgICAgICAgICAgICAgIHRoaXNDUFUtPnJwYl9wY2IucnBiX2tzcCwgdGhpc0NQVS0+cnBiX3BjYi5ycGJfcHRicik7CiAgICB9CgogICAgbmV4dFB0ciA9ICh1bG9uZylycGJfcGVyY3B1ICsgcGVyY3B1X3NpemUgKiBtNUNvbmYubnVtQ1BVczsKCiAgICAvKgogICAgICogQ29uc29sZSBUZXJtaW5hbCBCbG9jawogICAgICovCiAgICBycGJfY3RiID0gKHN0cnVjdCBycGJfY3RiICopIG5leHRQdHI7CiAgICBjdGJfdHQgPSAoc3RydWN0IGN0Yl90dCopIHJwYl9jdGI7CgogICAgcnBiLT5ycGJfY3RiX29mZiA9ICgodWxvbmcpcnBiX2N0YikgLSAodWxvbmcpcnBiOwogICAgcnBiLT5ycGJfY3RiX3NpemUgID0gc2l6ZW9mKHN0cnVjdCBycGJfY3RiKTsKCiAgICBiemVybygoY2hhciAqKXJwYl9jdGIsIHNpemVvZihzdHJ1Y3QgY3RiX3R0KSk7CgogICAgcnBiX2N0Yi0+cnBiX3R5cGUgPSBDT05TX0RaOwogICAgcnBiX2N0Yi0+cnBiX2xlbmd0aCA9IHNpemVvZihjdGJfdHQpIC0gc2l6ZW9mKHJwYl9jdGIpOwoKICAgIC8qCiAgICAgKiB1YXJ0IGluaXRpemxpYXRpb24KICAgICAqLwogICAgY3RiX3R0LT5jdGJfdGludHJfdmVjID0gMHg2YzA7ICAvKiBtYXRjaGVzIHRsYXNlciBwYWwgY29kZSAqLwogICAgY3RiX3R0LT5jdGJfcmludHJfdmVjID0gMHg2ODA7ICAvKiBtYXRjaGVzIHRsYXNlciBwYWwgY29kZSAqLwogICAgY3RiX3R0LT5jdGJfdGVybV90eXBlID0gQ1RCX0dSQVBISUNTOwoKICAgIHJwYl9jcmIgPSAoc3RydWN0IHJwYl9jcmIgKikgKCgodWxvbmcpcnBiX2N0YikgKyBzaXplb2Yoc3RydWN0IGN0Yl90dCkpOwogICAgcnBiLT5ycGJfY3JiX29mZiA9ICgodWxvbmcpcnBiX2NyYikgLSAodWxvbmcpcnBiOwoKICAgIGJ6ZXJvKChjaGFyICopcnBiX2NyYiwgc2l6ZW9mKHN0cnVjdCBycGJfY3JiKSk7CgogICAgLyoKICAgICAqIGNvbnNvbGUgY2FsbGJhY2sgc3R1ZmYgKG01KQogICAgICovCiAgICBycGJfY3JiLT5ycGJfbnVtID0gMTsKICAgIHJwYl9jcmItPnJwYl9tYXBwZWRfcGFnZXMgPSBIV1JQQl9QQUdFUzsKICAgIHJwYl9jcmItPnJwYl9tYXBbMF0ucnBiX3ZpcnQgPSAweDEwMDAwMDAwOwogICAgcnBiX2NyYi0+cnBiX21hcFswXS5ycGJfcGh5cyA9IEtTRUdfVE9fUEhZUygoKHVsb25nKXJwYikgJiB+MHgxZmZmKTsKICAgIHJwYl9jcmItPnJwYl9tYXBbMF0ucnBiX3BnY291bnQgPSBIV1JQQl9QQUdFUzsKCiAgICBwcmludGZfbG9jaygiQ29uc29sZSBDYWxsYmFjayBhdCAweCV4LCBmaXh1cCBhdCAweCV4LCBjcmIgb2Zmc2V0OiAweCV4XG4iLAogICAgICAgICAgICAgICAgcnBiX2NyYi0+cnBiX3ZhX2Rpc3AsIHJwYl9jcmItPnJwYl92YV9maXh1cCwgcnBiLT5ycGJfY3JiX29mZik7CgogICAgcnBiX21kdCA9IChzdHJ1Y3QgX201X3JwYl9tZHQgKikoKHVsb25nKXJwYl9jcmIgKyBzaXplb2Yoc3RydWN0IHJwYl9jcmIpKTsKICAgIHJwYi0+cnBiX21kdF9vZmYgPSAodWxvbmcpcnBiX21kdCAtICh1bG9uZylycGI7CiAgICBiY29weSgoY2hhciAqKSZtNV9ycGJfbWR0LCAoY2hhciAqKXJwYl9tZHQsIHNpemVvZihzdHJ1Y3QgX201X3JwYl9tZHQpKTsKCgogICAgY2wgPSAwOwogICAgcnBiX21kdC0+cnBiX2NsdXN0ZXJbY2xdLnJwYl9wZm5jb3VudCA9IGtlcm5fZmlyc3RfcGFnZTsKICAgIGNsKys7CgogICAgcnBiX21kdC0+cnBiX2NsdXN0ZXJbY2xdLnJwYl9wZm4gPSBrZXJuX2ZpcnN0X3BhZ2U7CiAgICBycGJfbWR0LT5ycGJfY2x1c3RlcltjbF0ucnBiX3BmbmNvdW50ID0gbWVtX3BhZ2VzIC0ga2Vybl9maXJzdF9wYWdlOwogICAgcnBiX21kdC0+cnBiX2NsdXN0ZXJbY2xdLnJwYl9wZm50ZXN0ZWQgPQogICAgICAgIHJwYl9tZHQtPnJwYl9jbHVzdGVyW2NsXS5ycGJfcGZuY291bnQ7CiAgICBycGJfbWR0LT5ycGJfY2x1c3RlcltjbF0ucnBiX3BhID0gS1NFR19UT19QSFlTKG1kdF9iaXRtYXApOwogICAgcnBiX21kdC0+cnBiX2NsdXN0ZXJbY2xdLnJwYl92YSA9IDB4MTAwMDAwMDAgKyBIV1JQQl9QQUdFUyAqIFBBR0VfU0laRTsKICAgIGNsKys7CgogICAgcnBiX21kdC0+cnBiX251bWNsID0gY2w7CgogICAgZm9yIChpID0gMDsgaSA8IGNsOyBpKyspCiAgICAgICAgcHJpbnRmX2xvY2soIk1lbW9yeSBjbHVzdGVyICVkIFslZCAtICVkXVxuIiwgaSwKICAgICAgICAgICAgICAgICAgICBycGJfbWR0LT5ycGJfY2x1c3RlcltpXS5ycGJfcGZuLAogICAgICAgICAgICAgICAgICAgIHJwYl9tZHQtPnJwYl9jbHVzdGVyW2ldLnJwYl9wZm5jb3VudCk7CgogICAgLyogQ2hlY2tzdW0gdGhlIHJwYiBmb3IgZ29vZCBsdWNrICovCiAgICBzdW0gPSAwOwogICAgbHAxID0gKGxvbmcgKikmcnBiX21kdC0+cnBiX2ltcGFkZHI7CiAgICBscDIgPSAobG9uZyAqKSZycGJfbWR0LT5ycGJfY2x1c3RlcltjbF07CiAgICB3aGlsZSAobHAxIDwgbHAyKSBzdW0gKz0gKmxwMSsrOwogICAgcnBiX21kdC0+cnBiX2NoZWNrc3VtID0gc3VtOwoKICAgIC8qIFhYWCBzaG91bGQgY2hlY2tzdW0gdGhlIGNsdXN0ZXIgZGVzY3JpcHRvcnMgKi8KICAgIGJ6ZXJvKChjaGFyICopbWR0X2JpdG1hcCwgbWR0X2JpdG1hcF9wYWdlcyAqIFBBR0VfU0laRSk7CiAgICBmb3IgKGkgPSAwOyBpIDwgbWVtX3BhZ2VzLzg7IGkrKykKICAgICAgICAoKHVuc2lnbmVkIGNoYXIgKiltZHRfYml0bWFwKVtpXSA9IDB4ZmY7CgogICAgcHJpbnRmX2xvY2soIkluaXRhbGl6aW5nIG1kdF9iaXRtYXAgYWRkciAweCV4IG1lbV9wYWdlcyAleCBcbiIsCiAgICAgICAgICAgICAgICAobG9uZyltZHRfYml0bWFwLChsb25nKW1lbV9wYWdlcyk7CgogICAgbTVfcnBiLnJwYl9jb25maWdfb2ZmID0gMDsKICAgIG01X3JwYi5ycGJfZnJ1X29mZiA9IDA7CgogICAgcnBiX2RzciA9IChzdHJ1Y3QgcnBiX2RzciAqKSgodWxvbmcpcnBiX21kdCArIHNpemVvZihzdHJ1Y3QgX201X3JwYl9tZHQpKTsKICAgIHJwYi0+cnBiX2Rzcl9vZmYgPSAodWxvbmcpcnBiX2RzciAtICh1bG9uZylycGI7CiAgICBiemVybygoY2hhciAqKXJwYl9kc3IsIHNpemVvZihzdHJ1Y3QgcnBiX2RzcikpOwogICAgcnBiX2Rzci0+cnBiX3NtbSA9IDE1Nzg7IC8qIE9mZmljaWFsIFhYTSBTTU0gbnVtYmVyIGFzIHBlciBTUk0gKi8KICAgIHJwYl9kc3ItPnJwYl9zbW0gPSAxMDg5OyAvKiBPZmZpY2lhbCBBbGNvciBTTU0gbnVtYmVyIGFzIHBlciBTUk0gKi8KCiAgICBycGJfbHVydCA9IChpbnQgKikgUk9VTkRVUDgoKHVsb25nKXJwYl9kc3IgKyBzaXplb2Yoc3RydWN0IHJwYl9kc3IpKTsKICAgIHJwYl9kc3ItPnJwYl9sdXJ0X29mZiA9ICgodWxvbmcpIHJwYl9sdXJ0KSAtICh1bG9uZykgcnBiX2RzcjsKICAgIGJjb3B5KChjaGFyICopbTVfbHVydCwgKGNoYXIgKilycGJfbHVydCwgc2l6ZW9mKG01X2x1cnQpKTsKCiAgICBycGJfbmFtZSA9IChjaGFyICopIFJPVU5EVVA4KCgodWxvbmcpcnBiX2x1cnQpICsgc2l6ZW9mKG01X2x1cnQpKTsKICAgIHJwYl9kc3ItPnJwYl9zeXNuYW1lX29mZiA9ICgodWxvbmcpIHJwYl9uYW1lKSAtICh1bG9uZykgcnBiX2RzcjsKI2RlZmluZSBUSEVOQU1FICIgICAgICAgICAgICAgTTUvQWxwaGEgICAgICAgIgogICAgc3VtID0gc2l6ZW9mKFRIRU5BTUUpOwogICAgYmNvcHkoVEhFTkFNRSwgcnBiX25hbWUsIHN1bSk7CiAgICAqKHVsb25nICopcnBiX25hbWUgPSBzaXplb2YoVEhFTkFNRSk7IC8qIHB1dCBpbiBsZW5ndGggZmllbGQgKi8KCiAgICAvKiBjYWxjdWxhdGUgc2l6ZSBvZiBycGIgKi8KICAgIHJwYi0+cnBiX3NpemUgPSAoKHVsb25nKSAmcnBiX25hbWVbc3VtXSkgLSAodWxvbmcpcnBiOwoKICAgIGlmIChycGItPnJwYl9zaXplID4gUEFHRV9TSVpFICogSFdSUEJfUEFHRVMpIHsKICAgICAgICBwYW5pYygiSFdSUEJfUEFHRVM9JWQgdG9vIHNtYWxsIGZvciBIV1JQQiAhISEgXG4iKTsKICAgIH0KCiAgICB1bG9uZyAqcnBicHRyID0gKHVsb25nKikoKGNoYXIqKXJwYl9kc3IgKyBzaXplb2Yoc3RydWN0IHJwYl9kc3IpKTsKICAgIHJwYl9jcmItPnJwYl9wYV9kaXNwID0gS1NFR19UT19QSFlTKHJwYnB0cik7CiAgICBycGJfY3JiLT5ycGJfdmFfZGlzcCA9IDB4MTAwMDAwMDAgKwogICAgICAgICgoKHVsb25nKXJwYnB0ciAtICh1bG9uZylycGIpICYgKDB4MjAwMCAqIEhXUlBCX1BBR0VTIC0gMSkpOwogICAgcHJpbnRmX2xvY2soIkNvbnNvbGVEaXNwYXRjaCBhdCB2aXJ0ICV4IHBoeXMgJXggdmFsICV4XG4iLAogICAgICAgICAgICAgICAgcnBiX2NyYi0+cnBiX3ZhX2Rpc3AsIHJwYl9jcmItPnJwYl9wYV9kaXNwLCBjb25zb2xlQ2FsbGJhY2spOwogICAgKnJwYnB0cisrID0gMDsKICAgICpycGJwdHIrKyA9ICh1bG9uZykgY29uc29sZUNhbGxiYWNrOwogICAgcnBiX2NyYi0+cnBiX3BhX2ZpeHVwID0gS1NFR19UT19QSFlTKHJwYnB0cik7CiAgICBycGJfY3JiLT5ycGJfdmFfZml4dXAgPSAweDEwMDAwMDAwICsKICAgICAgICAoKCh1bG9uZylycGJwdHIgLSAodWxvbmcpcnBiKSAmICgweDIwMDAgKiBIV1JQQl9QQUdFUyAtIDEpKTsKICAgICpycGJwdHIrKyA9IDA7CgogICAgKnJwYnB0cisrID0gKHVsb25nKSBjb25zb2xlRml4dXA7CgogICAgLyogQ2hlY2tzdW0gdGhlIHJwYiBmb3IgZ29vZCBsdWNrICovCiAgICBzdW0gPSAwOwogICAgbHAxID0gKGxvbmcgKilycGI7CiAgICBscDIgPSAmcnBiLT5ycGJfY2hlY2tzdW07CiAgICB3aGlsZSAobHAxIDwgbHAyKQogICAgICAgIHN1bSArPSAqbHAxKys7CiAgICAqbHAyID0gc3VtOwoKICAvKgogICAqIE1QIGJvb3RzdHJhcAogICAqLwogICAgZm9yIChpID0gMTsgaSA8IG01Q29uZi5udW1DUFVzOyBpKyspIHsKICAgICAgICB1bG9uZyBzdGFjayA9ICh1bG9uZyl1bml4X2Jvb3RfYWxsb2MoMSk7CiAgICAgICAgcHJpbnRmX2xvY2soIkJvb3RzdHJhcGluZyBDUFUgJWQgd2l0aCBzcD0weCV4XG4iLCBpLCBzdGFjayk7CiAgICAgICAgbTVBbHBoYUFjY2Vzcy0+Y3B1U3RhY2tbaV0gPSBzdGFjazsKICAgIH0KCiAgICAvKgogICAgICogTWFrZSBzdXJlIHRoYXQgd2UgYXJlIG5vdCBzdGVwcGluZyBvbiB0aGUga2VybmVsCiAgICAgKi8KICAgIGlmICgodWxvbmcpdW5peF9ib290X21lbSA+PSAodWxvbmcpbTVDb25mLmtlcm5TdGFydCkgewogICAgICAgIHBhbmljKCJDT05TT0xFOiB0b28gbXVjaCBtZW1vcnkuIFNtYXNoaW5nIGtlcm5lbFxuIik7CiAgICB9IGVsc2UgewogICAgICAgIHByaW50Zl9sb2NrKCJ1bml4X2Jvb3RfbWVtIGVuZHMgYXQgJXggXG4iLCB1bml4X2Jvb3RfbWVtKTsKICAgIH0KCiAgICBKVG9LZXJuKChjaGFyICopYm9vdGFkciwgKHVsb25nKXJwYl9wZXJjcHUsIGZyZWVfcGZuLCBrYXJnYywga2FyZ3YsIE5VTEwpOwp9CgoKdm9pZApKVG9LZXJuKGNoYXIgKmJvb3RhZHIsIHVsb25nIHJwYl9wZXJjcHUsIHVsb25nIGZyZWVfcGZuLCB1bG9uZyBrX2FyZ2MsCiAgICAgICAgY2hhciAqKmtfYXJndiwgY2hhciAqKmVudnApCnsKICAgIGV4dGVybiB1bG9uZyBwYWxKVG9LZXJuW107CgogICAgc3RydWN0IF9rZXJuZWxfcGFyYW1zICprZXJuZWxfcGFyYW1zID0gKHN0cnVjdCBfa2VybmVsX3BhcmFtcyAqKSBLU0VHOwogICAgaW50IGk7CgogICAgcHJpbnRmX2xvY2soImtfYXJnYyA9ICVkICIsIGtfYXJnYyk7CiAgICBmb3IgKGkgPSAwOyBpIDwga19hcmdjOyBpKyspIHsKICAgICAgICBwcmludGZfbG9jaygiJyVzJyAiLCBrX2FyZ3ZbaV0pOwogICAgfQogICAgcHJpbnRmX2xvY2soIlxuIik7CgogICAga2VybmVsX3BhcmFtcy0+Ym9vdGFkciA9IGJvb3RhZHI7CiAgICBrZXJuZWxfcGFyYW1zLT5ycGJfcGVyY3B1ID0gS1NFR19UT19QSFlTKHJwYl9wZXJjcHUpOwogICAga2VybmVsX3BhcmFtcy0+ZnJlZV9wZm4gPSBmcmVlX3BmbjsKICAgIGtlcm5lbF9wYXJhbXMtPmFyZ2MgPSBrX2FyZ2M7CiAgICBrZXJuZWxfcGFyYW1zLT5hcmd2ID0gKHVsb25nKWtfYXJndjsKICAgIGtlcm5lbF9wYXJhbXMtPmVudnAgPSAodWxvbmcpZW52cDsKICAgIHByaW50Zl9sb2NrKCJqdW1waW5nIHRvIGtlcm5lbCBhdCAweCV4LCAoUENCQiAweCV4IHBmbiAlZClcbiIsCiAgICAgICAgICAgICAgICBib290YWRyLCBycGJfcGVyY3B1LCBmcmVlX3Bmbik7CiAgICBKVG9QYWwoS1NFR19UT19QSFlTKHBhbEpUb0tlcm4pKTsKICAgIHByaW50Zl9sb2NrKCJyZXR1cm5lZCBmcm9tIEpUb1BhbC4gTG9vcGluZ1xuIik7CiAgICB3aGlsZSAoMSkKICAgICAgICBjb250aW51ZTsKfQoKdm9pZApKVG9QYWwodWxvbmcgYm9vdGFkcikKewogICAgY1NlcnZlKGJvb3RhZHIsIDAsIENTRVJWRV9LX0pUT1BBTCk7CgogICAgLyoKICAgICAqIE1ha2Ugc3VyZSB0aGF0IGZsb2F0aW5nIHBvaW50IGlzIGVuYWJsZWQgaW5jYXNlCiAgICAgKiBpdCB3YXMgZGlzYWJsZWQgYnkgdGhlIHVzZXIgcHJvZ3JhbS4KICAgICAqLwogICAgd3JmZW4oMSk7Cn0KCmludApzdHJjcHkoY2hhciAqZHN0LCBjaGFyICpzcmMpCnsKICAgIGludCBpID0gMDsKICAgIHdoaWxlICgqc3JjKSB7CiAgICAgICAgKmRzdCsrID0gKnNyYysrOwogICAgICAgIGkrKzsKICAgIH0KICAgIHJldHVybiBpOwp9CgovKgogKiBDb25zb2xlIEkvTwogKgogKi8KCmludCBudW1PcGVuRGV2aWNlcyA9IDExOwpzdHJ1Y3QgewogICAgY2hhciBuYW1lWzEyOF07Cn0gZGV2aWNlU3RhdGVbMzJdOwoKI2RlZmluZSBCT09UREVWSUNFX05BTUUgIlNDU0kgMSAwIDAgMSAxMDAgMCIKCnZvaWQKRGV2aWNlT3BlcmF0aW9uKGxvbmcgb3AsIGxvbmcgY2hhbm5lbCwgbG9uZyBjb3VudCwgbG9uZyBhZGRyZXNzLCBsb25nIGJsb2NrKQp7CiAgICBsb25nIHBBZGRyOwoKICAgIGlmIChzdHJjbXAoZGV2aWNlU3RhdGVbY2hhbm5lbF0ubmFtZSwgQk9PVERFVklDRV9OQU1FICkpIHsKICAgICAgICBwYW5pYygiRGV2aWNlUmVhZDogb25seSBpbXBsZW1lbnRlZCBmb3Igcm9vdCBkaXNrIFxuIik7CiAgICB9CiAgICBwQWRkciA9IEtTRUdfVE9fUEhZUyhhZGRyZXNzKTsKICAgIGlmIChwQWRkciArIGNvdW50ID4gbTVDb25mLm1lbV9zaXplKSB7CiAgICAgICAgcGFuaWMoIkRldmljZVJlYWQ6IHJlcXVlc3Qgb3V0IG9mIHJhbmdlIFxuIik7CiAgICB9CgogICAgbTVBbHBoYUFjY2Vzcy0+ZGlza0NvdW50ID0gY291bnQ7CiAgICBtNUFscGhhQWNjZXNzLT5kaXNrUEFkZHIgPSBwQWRkcjsKICAgIG01QWxwaGFBY2Nlc3MtPmRpc2tCbG9jayA9IGJsb2NrOwogICAgbTVBbHBoYUFjY2Vzcy0+ZGlza09wZXJhdGlvbiA9IG9wOyAvKiBsYXVuY2ggKi8KfQoKLyoKICogTTUgQ29uc29sZSBjYWxsYmFja3MKICoKICovCgovKiBBWFAgbWFudWFsIDItMzEgKi8KI2RlZmluZSBDT05TQ0JfR0VUQyAweDEKI2RlZmluZSBDT05TQ0JfUFVUUyAweDIKI2RlZmluZSBDT05TQ0JfUkVTRVRfVEVSTSAweDMKI2RlZmluZSBDT05TQ0JfU0VUX1RFUk1fSU5UIDB4NAojZGVmaW5lIENPTlNDQl9TRVRfVEVSTV9DVEwgMHg1CiNkZWZpbmUgQ09OU0NCX1BST0NFU1NfS0VZIDB4NgojZGVmaW5lIENPTlNDQl9PUEVOX0NPTlNPTEUgMHg3CiNkZWZpbmUgQ09OU0NCX0NMT1NFX0NPTlNPTEUgMHg4CgojZGVmaW5lIENPTlNDQl9PUEVOIDB4MTAKI2RlZmluZSBDT05TQ0JfQ0xPU0UgMHgxMQojZGVmaW5lIENPTlNDQl9SRUFEIDB4MTMKCiNkZWZpbmUgQ09OU0NCX0dFVEVOViAweDIyCgovKiBBWFAgbWFudWFsIDItMjYgKi8KI2RlZmluZQlFTlZfQVVUT19BQ1RJT04JCTBYMDEKI2RlZmluZQlFTlZfQk9PVF9ERVYJCTBYMDIKI2RlZmluZQlFTlZfQk9PVERFRl9ERVYJCTBYMDMKI2RlZmluZQlFTlZfQk9PVEVEX0RFVgkJMFgwNAojZGVmaW5lCUVOVl9CT09UX0ZJTEUJCTBYMDUKI2RlZmluZQlFTlZfQk9PVEVEX0ZJTEUJCTBYMDYKI2RlZmluZQlFTlZfQk9PVF9PU0ZMQUdTCTBYMDcKI2RlZmluZQlFTlZfQk9PVEVEX09TRkxBR1MJMFgwOAojZGVmaW5lCUVOVl9CT09UX1JFU0VUCQkwWDA5CiNkZWZpbmUJRU5WX0RVTVBfREVWCQkwWDBBCiNkZWZpbmUJRU5WX0VOQUJMRV9BVURJVAkwWDBCCiNkZWZpbmUJRU5WX0xJQ0VOU0UJCTBYMEMKI2RlZmluZQlFTlZfQ0hBUl9TRVQJCTBYMEQKI2RlZmluZQlFTlZfTEFOR1VBR0UJCTBYMEUKI2RlZmluZQlFTlZfVFRZX0RFVgkJMFgwRgojZGVmaW5lCUVOVl9TQ1NJSUQJCTBYNDIKI2RlZmluZQlFTlZfU0NTSUZBU1QJCTBYNDMKI2RlZmluZQlFTlZfQ09NMV9CQVVECQkwWDQ0CiNkZWZpbmUJRU5WX0NPTTFfTU9ERU0JCTBYNDUKI2RlZmluZQlFTlZfQ09NMV9GTE9XCQkwWDQ2CiNkZWZpbmUJRU5WX0NPTTFfTUlTQwkJMFg0NwojZGVmaW5lCUVOVl9DT00yX0JBVUQJCTBYNDgKI2RlZmluZQlFTlZfQ09NMl9NT0RFTQkJMFg0OQojZGVmaW5lCUVOVl9DT00yX0ZMT1cJCTBYNEEKI2RlZmluZQlFTlZfQ09NMl9NSVNDCQkwWDRCCiNkZWZpbmUJRU5WX1BBU1NXT1JECQkwWDRDCiNkZWZpbmUJRU5WX1NFQ1VSRQkJMFg0RAojZGVmaW5lCUVOVl9MT0dGQUlMCQkwWDRFCiNkZWZpbmUJRU5WX1NSTTJERVZfSUQJCTBYNEYKCiNkZWZpbmUgTUFYX0VOVkxFTiAzMgoKY2hhciBlbnZfYXV0b19hY3Rpb25bTUFYX0VOVkxFTl0JPSAiQk9PVCI7CmNoYXIgZW52X2Jvb3RfZGV2W01BWF9FTlZMRU5dCQk9ICIiOwpjaGFyIGVudl9ib290ZGVmX2RldltNQVhfRU5WTEVOXQk9ICIiOwpjaGFyIGVudl9ib290ZWRfZGV2W01BWF9FTlZMRU5dCQk9IEJPT1RERVZJQ0VfTkFNRTsKY2hhciBlbnZfYm9vdF9maWxlW01BWF9FTlZMRU5dCQk9ICIiOwpjaGFyIGVudl9ib290ZWRfZmlsZVtNQVhfRU5WTEVOXQk9ICIiOwpjaGFyIGVudl9ib290X29zZmxhZ3NbTUFYX0VOVkxFTl0JPSAiIjsKY2hhciBlbnZfYm9vdGVkX29zZmxhZ3NbTUFYX0VOVkxFTl0JPSAiIjsKY2hhciBlbnZfYm9vdF9yZXNldFtNQVhfRU5WTEVOXQkJPSAiIjsKY2hhciBlbnZfZHVtcF9kZXZbTUFYX0VOVkxFTl0JCT0gIiI7CmNoYXIgZW52X2VuYWJsZV9hdWRpdFtNQVhfRU5WTEVOXQk9ICIiOwpjaGFyIGVudl9saWNlbnNlW01BWF9FTlZMRU5dCQk9ICIiOwpjaGFyIGVudl9jaGFyX3NldFtNQVhfRU5WTEVOXQkJPSAiIjsKY2hhciBlbnZfbGFuZ3VhZ2VbTUFYX0VOVkxFTl0JCT0gIiI7CmNoYXIgZW52X3R0eV9kZXZbTUFYX0VOVkxFTl0JCT0gIjAiOwpjaGFyIGVudl9zY3NpaWRbTUFYX0VOVkxFTl0JCT0gIiI7CmNoYXIgZW52X3Njc2lmYXN0W01BWF9FTlZMRU5dCQk9ICIiOwpjaGFyIGVudl9jb20xX2JhdWRbTUFYX0VOVkxFTl0JCT0gIiI7CmNoYXIgZW52X2NvbTFfbW9kZW1bTUFYX0VOVkxFTl0JCT0gIiI7CmNoYXIgZW52X2NvbTFfZmxvd1tNQVhfRU5WTEVOXQkJPSAiIjsKY2hhciBlbnZfY29tMV9taXNjW01BWF9FTlZMRU5dCQk9ICIiOwpjaGFyIGVudl9jb20yX2JhdWRbTUFYX0VOVkxFTl0JCT0gIiI7CmNoYXIgZW52X2NvbTJfbW9kZW1bTUFYX0VOVkxFTl0JCT0gIiI7CmNoYXIgZW52X2NvbTJfZmxvd1tNQVhfRU5WTEVOXQkJPSAiIjsKY2hhciBlbnZfY29tMl9taXNjW01BWF9FTlZMRU5dCQk9ICIiOwpjaGFyIGVudl9wYXNzd29yZFtNQVhfRU5WTEVOXQkJPSAiIjsKY2hhciBlbnZfc2VjdXJlW01BWF9FTlZMRU5dCQk9ICIiOwpjaGFyIGVudl9sb2dmYWlsW01BWF9FTlZMRU5dCQk9ICIiOwpjaGFyIGVudl9zcm0yZGV2X2lkW01BWF9FTlZMRU5dCQk9ICIiOwoKI2RlZmluZSBNQVhfRU5WX0lOREVYIDEwMApjaGFyICplbnZwdHJbTUFYX0VOVl9JTkRFWF0gPSB7CiAgICAwLAkJCQkJLyogMHgwMCAqLwogICAgZW52X2F1dG9fYWN0aW9uLAkJCS8qIDB4MDEgKi8KICAgIGVudl9ib290X2RldiwJCQkvKiAweDAyICovCiAgICBlbnZfYm9vdGRlZl9kZXYsCQkJLyogMHgwMyAqLwogICAgZW52X2Jvb3RlZF9kZXYsCQkJLyogMHgwNCAqLwogICAgZW52X2Jvb3RfZmlsZSwJCQkvKiAweDA1ICovCiAgICBlbnZfYm9vdGVkX2ZpbGUsCQkJLyogMHgwNiAqLwogICAgZW52X2Jvb3Rfb3NmbGFncywJCQkvKiAweDA3ICovCiAgICBlbnZfYm9vdGVkX29zZmxhZ3MsCQkJLyogMHgwOCAqLwogICAgZW52X2Jvb3RfcmVzZXQsCQkJLyogMHgwOSAqLwogICAgZW52X2R1bXBfZGV2LAkJCS8qIDB4MEEgKi8KICAgIGVudl9lbmFibGVfYXVkaXQsCQkJLyogMHgwQiAqLwogICAgZW52X2xpY2Vuc2UsCQkJLyogMHgwQyAqLwogICAgZW52X2NoYXJfc2V0LAkJCS8qIDB4MEQgKi8KICAgIChjaGFyICopJmVudl9sYW5ndWFnZSwJCS8qIDB4MEUgKi8KICAgIGVudl90dHlfZGV2LAkJCS8qIDB4MEYgKi8KICAgIDAsMCwwLDAsIDAsMCwwLDAsIDAsMCwwLDAsIDAsMCwwLDAsCS8qIDB4MTAgLSAweDFGICovCiAgICAwLDAsMCwwLCAwLDAsMCwwLCAwLDAsMCwwLCAwLDAsMCwwLAkvKiAweDIwIC0gMHgyRiAqLwogICAgMCwwLDAsMCwgMCwwLDAsMCwgMCwwLDAsMCwgMCwwLDAsMCwJLyogMHgzMCAtIDB4M0YgKi8KICAgIDAsCQkJCQkvKiAweDQwICovCiAgICAwLAkJCQkJLyogMHg0MSAqLwogICAgZW52X3Njc2lpZCwJCQkJLyogMHg0MiAqLwogICAgZW52X3Njc2lmYXN0LAkJCS8qIDB4NDMgKi8KICAgIGVudl9jb20xX2JhdWQsCQkJLyogMHg0NCAqLwogICAgZW52X2NvbTFfbW9kZW0sCQkJLyogMHg0NSAqLwogICAgZW52X2NvbTFfZmxvdywJCQkvKiAweDQ2ICovCiAgICBlbnZfY29tMV9taXNjLAkJCS8qIDB4NDcgKi8KICAgIGVudl9jb20yX2JhdWQsCQkJLyogMHg0OCAqLwogICAgZW52X2NvbTJfbW9kZW0sCQkJLyogMHg0OSAqLwogICAgZW52X2NvbTJfZmxvdywJCQkvKiAweDRBICovCiAgICBlbnZfY29tMl9taXNjLAkJCS8qIDB4NEIgKi8KICAgIGVudl9wYXNzd29yZCwJCQkvKiAweDRDICovCiAgICBlbnZfc2VjdXJlLAkJCQkvKiAweDREICovCiAgICBlbnZfbG9nZmFpbCwJCQkvKiAweDRFICovCiAgICBlbnZfc3JtMmRldl9pZCwJCQkvKiAweDRGICovCiAgICAwLDAsMCwwLCAwLDAsMCwwLCAwLDAsMCwwLCAwLDAsMCwwLAkvKiAweDUwIC0gMHg1RiAqLwogICAgMCwJCQkJCS8qIDB4NjAgKi8KICAgIDAsCQkJCQkvKiAweDYxICovCiAgICAwLAkJCQkJLyogMHg2MiAqLwogICAgMCwJCQkJCS8qIDB4NjMgKi8KfTsKCmxvbmcKQ2FsbEJhY2tEaXNwYXRjaGVyKGxvbmcgYTAsIGxvbmcgYTEsIGxvbmcgYTIsIGxvbmcgYTMsIGxvbmcgYTQpCnsKICAgIGxvbmcgaTsKICAgIHN3aXRjaCAoYTApIHsKICAgICAgY2FzZSBDT05TQ0JfR0VUQzoKICAgICAgICByZXR1cm4gR2V0Q2hhcigpOwoKICAgICAgY2FzZSBDT05TQ0JfUFVUUzoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYTM7IGkrKykKICAgICAgICAgICAgUHV0Q2hhcigqKChjaGFyICopYTIgKyBpKSk7CiAgICAgICAgcmV0dXJuIGEzOwoKICAgICAgY2FzZSBDT05TQ0JfR0VURU5WOgogICAgICAgIGlmIChhMSA+PSAwICYmIGExIDwgTUFYX0VOVl9JTkRFWCAmJiBlbnZwdHJbYTFdICE9IDAgJiYgKmVudnB0clthMV0pIHsKICAgICAgICAgICAgaSA9IHN0cmNweSgoY2hhciopYTIsIGVudnB0clthMV0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0cmNweSgoY2hhciopYTIsICIiKTsKICAgICAgICAgICAgaSA9IChsb25nKTB4YzAwMDAwMDAwMDAwMDAwMDsKICAgICAgICAgICAgaWYgKGExID49IDAgJiYgYTEgPCBNQVhfRU5WX0lOREVYKQogICAgICAgICAgICAgICAgcHJpbnRmX2xvY2soIkdFVEVOViB1bnN1cHBvcnRlZCBvcHRpb24gJWQgKDB4JXgpXG4iLCBhMSwgYTEpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBwcmludGZfbG9jaygiR0VURU5WIHVuc3VwcG9ydGVkIG9wdGlvbiAlc1xuIiwgYTEpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGkgPiBhMykKICAgICAgICAgICAgcGFuaWMoIkNPTlNDQl9HRVRFTlYgb3Zlcndyb3RlIGJ1ZmZlclxuIik7CiAgICAgICAgcmV0dXJuIGk7CgogICAgICBjYXNlIENPTlNDQl9PUEVOOgogICAgICAgIGJjb3B5KChjaGFyKilhMSwgZGV2aWNlU3RhdGVbbnVtT3BlbkRldmljZXNdLm5hbWUsIGEyKTsKICAgICAgICBkZXZpY2VTdGF0ZVtudW1PcGVuRGV2aWNlc10ubmFtZVthMl0gPSAnXDAnOwogICAgICAgIHByaW50Zl9sb2NrKCJDT05TT0xFIE9QRU4gOiAlcyAtLT4gc3VjY2VzcyBcbiIsCiAgICAgICAgICAgICAgICAgICAgZGV2aWNlU3RhdGVbbnVtT3BlbkRldmljZXNdLm5hbWUpOwogICAgICAgIHJldHVybiBudW1PcGVuRGV2aWNlcysrOwoKICAgICAgY2FzZSBDT05TQ0JfUkVBRDoKICAgICAgICBEZXZpY2VPcGVyYXRpb24oYTAsIGExLCBhMiwgYTMsIGE0KTsKICAgICAgICBicmVhazsKCiAgICAgIGNhc2UgQ09OU0NCX0NMT1NFOgogICAgICAgIGJyZWFrOwoKICAgICAgY2FzZSBDT05TQ0JfT1BFTl9DT05TT0xFOgogICAgICAgIHByaW50Zl9sb2NrKCJDT05TT0xFIE9QRU5cbiIpOwogICAgICAgIHJldHVybiAwOyAvKiBzdWNjZXNzICovCiAgICAgICAgYnJlYWs7IC8qIG5vdCByZWFjaGVkICovCgogICAgICBjYXNlIENPTlNDQl9DTE9TRV9DT05TT0xFOgogICAgICAgIHByaW50Zl9sb2NrKCJDT05TT0xFIENMT1NFXG4iKTsKICAgICAgICByZXR1cm4gMDsgLyogc3VjY2VzcyAqLwogICAgICAgIGJyZWFrOyAvKiBub3QgcmVhY2hlZCAqLwoKICAgICAgZGVmYXVsdDoKICAgICAgICBwYW5pYygiQ2FsbEJhY2tEaXNwYXRjaGVyKCV4LCV4LCV4LCV4LCV4KVxuIiwgYTAsIGExLCBhMiwgYTMsIGE0KTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKbG9uZwpDYWxsQmFja0ZpeHVwKGludCBhMCwgaW50IGExLCBpbnQgYTIpCnsKICAgIGxvbmcgdGVtcDsKICAgIC8qCiAgICAgKiBMaW51eCB1c2VzIHI4IGZvciB0aGUgY3VycmVudCBwb2ludGVyIChwb2ludGVyIHRvIGRhdGEKICAgICAqIHN0cnVjdHVyZSBjb250YXRpbmcgaW5mbyBhYm91dCBjdXJyZW50bHkgcnVubmluZyBwcm9jZXNzKS4gSXQKICAgICAqIGlzIHNldCB3aGVuIHRoZSBrZXJuZWwgc3RhcnRzIGFuZCBpcyBleHBlY3RlZCB0byByZW1haW4KICAgICAqIHRoZXJlLi4uIFByb2JsZW0gaXMgdGhhdCB0aGUgdW5saWtlIHRoZSBrZXJuZWwsIHRoZSBjb25zb2xlCiAgICAgKiBkb2VzIG5vdCBwcmV2ZW50IHRoZSBhc3NlbWJsZXIgZnJvbSB1c2luZyByOC4gU28gaGVyZSBpcyBhIHdvcmsKICAgICAqIGFyb3VuZC4gU28gZmFyIHRoaXMgaGFzIG9ubHkgYmVlbiBhIHByb2JsZW0gaW4gQ2FsbEJhY2tGaXh1cCgpCiAgICAgKiBidXQgYW55IG90aGVyIGNhbGwgYmFjayBmdW5jdGlvbnMgY291bGRkIGNhdXNlIGEgcHJvYmxlbSBhdAogICAgICogc29tZSBwb2ludAogICAgICovCgogICAgLyogc2F2ZSBvZmYgdGhlIGN1cnJlbnQgcG9pbnRlciB0byBhIHRlbXAgdmFyaWFibGUgKi8KICAgIGFzbSgiYmlzICQ4LCAkMzEsICUwIiA6ICI9ciIgKHRlbXApKTsKCiAgICAvKiBjYWxsIG9yaWdpbmFsIGNvZGUgKi8KICAgIHByaW50Zl9sb2NrKCJDYWxsYmFja0ZpeHVwICV4ICV4LCB0Nz0leFxuIiwgYTAsIGExLCB0ZW1wKTsKCiAgICAvKiByZXN0b3JlIHRoZSBjdXJyZW50IHBvaW50ZXIgKi8KICAgIGFzbSgiYmlzICUwLCAkMzEsICQ4IiA6IDogInIiICh0ZW1wKSA6ICIkOCIpOwoKICAgIHJldHVybiAwOwp9Cgp2b2lkClNsYXZlQ21kKGludCBjcHUsIHN0cnVjdCBycGJfcGVyY3B1ICpteV9ycGIpCnsKICAgIGV4dGVybiB1bG9uZyBwYWxKVG9TbGF2ZVtdOwoKICAgIHByaW50Zl9sb2NrKCJTbGF2ZSBDUFUgJWQgY29uc29sZSBjb21tYW5kICVzIiwgY3B1LAogICAgICAgICAgICAgICAgbXlfcnBiLT5ycGJfaWNjYi5pY2NiX3J4YnVmKTsKCiAgICBteV9ycGItPnJwYl9zdGF0ZSB8PSBTVEFURV9CSVA7CiAgICBteV9ycGItPnJwYl9zdGF0ZSAmPSB+U1RBVEVfUkM7CgogICAgcHJpbnRmX2xvY2soIlNsYXZlQ21kOiByZXN0YXJ0ICV4ICV4IHZwdGIgJXggbXlfcnBiICV4IG15X3JwYl9waHlzICV4XG4iLAogICAgICAgICAgICAgICAgcnBiLT5ycGJfcmVzdGFydCwgcnBiLT5ycGJfcmVzdGFydF9wdiwgcnBiLT5ycGJfdnB0YiwgbXlfcnBiLAogICAgICAgICAgICAgICAgS1NFR19UT19QSFlTKG15X3JwYikpOwoKICAgIGNTZXJ2ZShLU0VHX1RPX1BIWVMocGFsSlRvU2xhdmUpLCAodWxvbmcpcnBiLT5ycGJfcmVzdGFydCwKICAgICAgICAgICBDU0VSVkVfS19KVE9QQUwsIHJwYi0+cnBiX3Jlc3RhcnRfcHYsIHJwYi0+cnBiX3ZwdGIsCiAgICAgICAgICAgS1NFR19UT19QSFlTKG15X3JwYikpOwoKICAgIHBhbmljKCJTbGF2ZUNtZCByZXR1cm5lZCBcbiIpOwp9Cgp2b2lkClNsYXZlTG9vcChpbnQgY3B1KQp7CiAgICBpbnQgc2l6ZSA9IFJPVU5EVVAxMjgoc2l6ZW9mKHN0cnVjdCBycGJfcGVyY3B1KSk7CiAgICBzdHJ1Y3QgcnBiX3BlcmNwdSAqbXlfcnBiID0gKHN0cnVjdCBycGJfcGVyY3B1KikKICAgICAgICAoKHVsb25nKXJwYl9wZXJjcHUgKyBzaXplICogY3B1KTsKCiAgICBpZiAoY3B1ID09IDApIHsKICAgICAgICBwYW5pYygiQ1BVoDAgZW50ZXJpbmcgc2xhdmVMb29wLiBSZWVuZXRlcmluZyB0aGUgY29uc29sZS4gSE9TRURcbiIpOwogICAgfSBlbHNlIHsKICAgICAgICBwcmludGZfbG9jaygiRW50ZXJpbmcgc2xhdmVsb29wIGZvciBjcHUgJWQgbXlfcnBiPSV4XG4iLCBjcHUsIG15X3JwYik7CiAgICB9CgogICAgLy8gc3dhcCB0aGUgcHJvY2Vzc29ycyBjb250ZXh0IHRvIHRoZSBvbmUgaW4gdGhlCiAgICAvLyBycGJfcGVyY3B1IHN0cnVjdCB2ZXJ5IGNhcmVmdWxseSAoaS5lLiBubyBzdGFjayB1c2FnZSkKICAgIC8vIHNvIHRoYXQgbGludXgga25vd3Mgd2hpY2ggcHJvY2Vzc29yIGVuZHMgdXAgaW4gX19zbXBfY2FsbGluCiAgICAvLyBhbmQgd2UgZG9uJ3QgdHJhc2ggYW55IGRhdGEgaXMgdGhlIHByb2Nlc3MKICAgIFNsYXZlU3BpbihjcHUsIG15X3JwYiwgJm15X3JwYi0+cnBiX2ljY2IuaWNjYl9yeGxlbik7Cn0K