ZGlmZiAtLWdpdCBhL2Jvb3QvY29tbW9uL3NyYy9sb2FkZXIvZHJpdmVycy9zZGlvLmMgYi9ib290L2NvbW1vbi9zcmMvbG9hZGVyL2RyaXZlcnMvc2Rpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYjRhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9ib290L2NvbW1vbi9zcmMvbG9hZGVyL2RyaXZlcnMvc2Rpby5jCkBAIC0wLDAgKzEsNTQ0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKiCw5sioy/nT0CAoQykyMDEwLCDJ7tvaytDW0NDLzajRtrnJt93T0M/euavLvqGjCisqCisqIM7EvP7D+7PGo7ogc2Rpby5jCisqIMTayN3VqtKqo7oKKyogxuTL/Mu1w/ejugorKiC1scewsOaxvqO6IDEuMAorKiDX96GhoaHV36O6Y2FpZGFvZmFuZworKiDN6rPJyNXG2qO6IAorKgorKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxjb21tb24uaD4KKyNpbmNsdWRlIDxsaW51eC9ieXRlb3JkZXIvZ2VuZXJpYy5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPHNkaW8uaD4KKyNpbmNsdWRlIDxpbWFnZS5oPgorCisKKyNkZWZpbmUgU1lTX1NURF9DUk1fQkFTRSAgICAgICAgICAgICAgICAgICAweDEzMDcwMDAKKyNkZWZpbmUgRE1BX0JVRkZFUl9TSVpFXzE2SyAgICAgICAgICAgICAgICgweDI8PDEpIAorCisjZGVmaW5lIERNQV9CVUZGRVJfU0laRV8zMksgICAgICAgICAgICAgICAoMHgzPDwxKSAKKyNkZWZpbmUgRE1BX0JVRkZFUl9TSVpFXzY0SyAgICAgICAgICAgICAgICgweDQ8PDEpIAorCisjZGVmaW5lIERNQV9CVUZGRVJfU0laRV8yNTZLICAgICAgICAgICAgICAoMHg2PDwxKSAgCisjZGVmaW5lIERNQV9CVUZGRVJfU0laRV81MTJLICAgICAgICAgICAgICAoMHg3PDwxKSAgICAKKyNkZWZpbmUgU0RJT19FUlIgICAgICAgICAgICAgICAgICAgICAgICAgICAtMQorI2RlZmluZSBTRElPX0lOUFJPR1JFU1MgICAgICAgICAgICAgICAgICAgIC0yCisKK3VpbnQzMl90IHVib290X2VudHJ5X3BvaW50ID0gMDsKKworc3RhdGljIHZvaWQgc2Rpb19jbGtfcmVzZXQodm9pZCkKK3sKKy8vIGVuYWJsZSBzZGlvIGNsayAgMTYsMTcgaGNsayAgCisgICBSRUczMihTWVNfU1REX0NSTV9CQVNFKzB4NDQpIHw9ICgweDM8PDE2KTsKKyAgIHVzZGVsYXkoODApOworLy8gcmVsZWFzZSByZXNldCBzZGlvIGNsayAxNiBhaGIgY2xrCisgICBSRUczMihTWVNfU1REX0NSTV9CQVNFKzB4NDgpIHw9ICgweDE8PDE2KTsKKyAgIHVzZGVsYXkoODApOworfQorCisvKrLJ08NDUFW2wcihRklGT6OsvfvWudbQts8qLworc3RhdGljIHZvaWQgc2Rpb19pbml0aWFsX3NldHVwKHZvaWQpCit7CisgICAgdTMyIHZhbCA9IDA7CisgICAgUkVHMzIoU0RJT19TTEFWRV9JT1JFQURZKSAgICAgICAgICB8PSAweDNlOy8vxeTWwzEtNWJpdCAKKworICAgIFJFRzMyKFNESU9fU0xBVkVfSU5UU1RBVFVTX0VOKSAgICAgID0gMDsgIC8vbWFzayBzZGlvIGludAorICAgIFJFRzMyKFNESU9fU0xBVkVfSU5UU1RBVFVTKSAgICAgICAgID0gMHhmZmZmZmZmZjsvL2NsZWFyIGludAorICAgIAorICAgIFJFRzMyKFNESU9fU0xBVkVfSU5UU1RBVFVTX0VOKSAgICAgID0gMHhmZmZmZmZmZjsgLy9lbmFibGUgc3RhdHVzIGludAorCisgICAgLy9SRUczMihTRElPX1NMQVZFX0lOVFNUQVRVU19FTikgICAgICA9IDB4MzNDMDE4MUI7IC8vZW5hYmxlIHN0YXR1cyBpbnQKKyAgICBSRUczMihTRElPX1NMQVZFX0lOVFNJR05BTF9FTikgICAgICA9IDA7IC8vbWFza2Vk1tC2z9DFusUxo6yyu8nPsai4+NbQts+/2NbGxvcKKyAgICBSRUczMihTRElPX1NMQVZFX0lOVF9TSUdOQUxfRU4yKSAgICA9IDA7IC8vbWFza2Vk1tC2z9DFusUyo6yyu8nPsai4+NbQts+/2NbGxvcKKyAgICB2YWwgPSBSRUczMihTRElPX1NMQVZFX1NESU9fQ0NDUl9DVFJMKTsKKyAgICBSRUczMihTRElPX1NMQVZFX1NESU9fQ0NDUl9DVFJMKSAgICA9IHZhbDsvLzB4M0ZGM0UzNDM7IAorCisgICAgUkVHMzIoMHgxMzA3MDgwKT0gMHg3ZmZlMDsKKworICAgIG1lbXNldCgodTgqKTB4MjAwMDAwMDAsMCwxMDI0KjE4MCk7CisKKyAgICB2YWwgPSBSRUczMihTRElPX1NMQVZFX0NBUkRfT0NSKTsKKworICAgIFJFRzMyKFNESU9fU0xBVkVfQ0FSRF9PQ1IpID0gdmFsfDB4MDEwMDAwMDA7IAorICAgIAorLypkbWEqLyAgICAKKyAgICAvKmRtYTEgYWRkcmVzcyByZWdpc3RlciBjb25maWcqLworICAvLyAgUkVHMzIoU0RJT19TTEFWRV9ETUExQUREUikgICAgICAgICAgPSBDRkdfU0RJT19MT0FEX0JBU0U7IC8vc2V0IGRtYSBhZGRyZXNzCisgICAgLyphZG1hL2RtYTEgYWRkcmVzcyByZWdpc3RlciBhbmQgYnVmZmVyIHNpemUgaXMgMDpub3QgdmFsaWQgMTp2YWxpZCxidWZmZXIgc2l6ZSBpcyA0SyhkZWZhdWx0KSovCisgICAvLyBSRUczMihTRElPX1NMQVZFX0RNQTFDVFJMKSAgICAgICAgIHw9MHgxfERNQV9CVUZGRVJfU0laRV8yNTZLOyAgLy9lbmFibGUgZG1hIGFkZHJlc3MKKyAgICAvKmRpc2FibGUgYWRtYaOsZW5hYmxlIGRtYSAsc2VsIG9uZSovCisgICAgUkVHMzIoU0RJT19TTEFWRV9DVFJMMikgICAgICAgICAgICAmPSh+MHg0KTsgCisgICAKKy8qc2RpbyBzbGF2ZSBjb25maWcgcmVhZHkgb3BlcmF0ZSovCisgICAgUkVHMzIoU0RJT19TTEFWRV9DVFJMKSAgICAgICAgICAgICB8PTB4NDsgLy/F5NbDtdoyYml0o6yx7cq+17yxuLLZ1/cKKworCisgICAgCit9CisKK2ludCBTZGlvX1NsYXZlX1JlYWRfNEsoY29uc3QgdTMyIGxvYWRfYWRkcix1MzIgbGVuKQoreworICAgIHUzMiBzdGF0dXMgPTAgOworICAgIGludCByZXQgPSAwOworCisgICAgdTMyIGRtYV9hZGRyID0gKHUzMilDRkdfU0RJT19MT0FEX0JBU0U7CisgICAgCisgICAgUkVHMzIoU0RJT19TTEFWRV9ETUExQUREUikgID0gQ0ZHX1NESU9fTE9BRF9CQVNFOyAgLy9DRkdfU0RJT19MT0FEX0JBU0U7IAorICAgIFJFRzMyKFNESU9fU0xBVkVfRE1BMUNUUkwpIHw9IDB4MTsgICAgLy98RE1BX0JVRkZFUl9TSVpFXzUxMks7ICAgIC8vMjU2SworICAgIAorICAgIHdoaWxlKDEpCisgICAgeworICAgICAgICBzdGF0dXMgPSBSRUczMihTRElPX1NMQVZFX0lOVFNUQVRVUyk7CisKKyAgICAgICAgaWYoKHN0YXR1cyAmU0RJT19TVFNfRE1BMSkhPTApCisgICAgICAgIHsKKworICAgICAgICAgICAgZG1hX2FkZHIgKz0gMHgxMDAwOworICAgICAgICAgICAgLyoxLG1hc2sqLworICAgICAgICAgICAgUkVHMzIoU0RJT19TTEFWRV9JTlRTVEFUVVNfRU4pJj0oflNESU9fU1RTX0RNQTEpOworICAgICAgICAgICAgLyoyLGNsZWFyKi8KKyAgICAgICAgICAgIAorICAgICAgICAgICAgUkVHMzIoU0RJT19TTEFWRV9JTlRTVEFUVVMpIHw9IFNESU9fU1RTX0RNQTE7CisgICAgICAgICAgICAvKjMsZW5hbGJlKi8KKyAgICAgICAgICAgIFJFRzMyKFNESU9fU0xBVkVfSU5UU1RBVFVTX0VOKSB8PSBTRElPX1NUU19ETUExOworCisgICAgICAgICAgICBSRUczMihTRElPX1NMQVZFX0RNQTFBRERSKSAgPSBkbWFfYWRkciA7Ly9DRkdfU0RJT19MT0FEX0JBU0U7IAorICAgICAgICAgICAgUkVHMzIoU0RJT19TTEFWRV9ETUExQ1RSTCkgfD0gMHgxOworICAgICAgICAgICAgICAgICAgICAgCisgICAgICAgIH0KKyAgICAgICAgCisKKyAgICAgICAgaWYoKHN0YXR1cyAmU0RJT19TVFNfVEMpIT0wKQorICAgICAgICB7CisgICAgICAgICAgIC8vIHByaW50ZigiU0RJTyB4ZmVyIE9LIVxuIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgaWYoKHN0YXR1cyAmU0RJT19TVFNfRl9DUkNfRSkhPTApCisgICAgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50ZigiU0RJTyBDUkMgRXJyb3IhXG4iKTsgIAorCisgICAgICAgICAgIC8qMSxtYXNrKi8KKyAgICAgICAgICAgIFJFRzMyKFNESU9fU0xBVkVfSU5UU1RBVFVTX0VOKSY9KH5TRElPX1NUU19GX0NSQ19FKTsKKyAgICAgICAgICAgIC8qMixjbGVhciovCisgICAgICAgICAgICBSRUczMihTRElPX1NMQVZFX0lOVFNUQVRVUykgfD0gU0RJT19TVFNfRl9DUkNfRTsKKyAgICAgICAgICAgIC8qMyxlbmFsYmUqLworICAgICAgICAgICAgUkVHMzIoU0RJT19TTEFWRV9JTlRTVEFUVVNfRU4pIHw9IFNESU9fU1RTX0ZfQ1JDX0U7CisgICAgICAKKyAgICAgICAgICAgIHJldCA9IFNESU9fRVJSOworICAgICAgICB9CisKKyAgICAgICAgaWYoKHN0YXR1cyAmU0RJT19TVFNfRl9BKSE9MCkKKyAgICAgICAgICAgeworCisgICAgICAgICAgICAvKjEsbWFzayovCisgICAgICAgICAgICBSRUczMihTRElPX1NMQVZFX0lOVFNUQVRVU19FTikmPSh+U0RJT19TVFNfRl9BKTsKKyAgICAgICAgICAgIC8qMixjbGVhciovCisgICAgICAgICAgICAvL3N0YXR1cyA9IFJFRzMyKFNESU9fU0xBVkVfSU5UU1RBVFVTKTsKKyAgICAgICAgICAgIFJFRzMyKFNESU9fU0xBVkVfSU5UU1RBVFVTKSB8PSBTRElPX1NUU19GX0E7CisgICAgICAgICAgICAvKjMsZW5hbGJlKi8KKyAgICAgICAgICAgIFJFRzMyKFNESU9fU0xBVkVfSU5UU1RBVFVTX0VOKSB8PSBTRElPX1NUU19GX0E7CisKKyAgICAgICAgICAgIAorICAgICAgICAgICAgcHJpbnRmKCJTRElPIEFCT1JUIFhmZXIhXG4iKTsKKworICAgICAgICB9CisgICAgICAgICAgIAorICAgICAgICAKKyAgICB9CisvKnRoYW5zZmVyIGNvbXBsZXRlLHdyaXRlIHByb2dyYW0gZG9uZSovCisgICAgUkVHMzIoU0RJT19TTEFWRV9DVFJMKSAgICAgfD0gMHgxOworLypjbGVhciBpbnQgc3RhdHVzKi8KKyAgICAvKjEsbWFzayovCisgICAvLyBSRUczMihTRElPX1NMQVZFX0lOVFNUQVRVU19FTikmPSh+KFNESU9fU1RTX1RDfFNESU9fU1RTX1dTfFNESU9fU1RTX0RNQTF8U0RJT19TVFNfRl9BfFNESU9fU1RTX0ZfQ1JDX0UpKTsKKworICAgIFJFRzMyKFNESU9fU0xBVkVfSU5UU1RBVFVTX0VOKSA9IDA7CisgICAgLyoyLGNsZWFyKi8KKyAgICBzdGF0dXMgPSBSRUczMihTRElPX1NMQVZFX0lOVFNUQVRVUyk7CisgICAgUkVHMzIoU0RJT19TTEFWRV9JTlRTVEFUVVMpID0gc3RhdHVzOworICAgIC8qMyxlbmFsYmUqLworICAgIFJFRzMyKFNESU9fU0xBVkVfSU5UU1RBVFVTX0VOKSA9IDB4ZmZmZmZmZmY7CisKKyAgICAgLyp0aGFuc2ZlciBjb21wbGV0ZSx3cml0ZSBwcm9ncmFtIGRvbmUqLworICAgLy8gUkVHMzIoU0RJT19TTEFWRV9DVFJMKSAgICAgfD0gMHgxOworICAgICAgIAorICAgLy8gUkVHMzIoU0RJT19TTEFWRV9JTlRTVEFUVVNfRU4pICAgICAgPSAweDMzQzAxODFCOyAvL2VuYWJsZSBzdGF0dXMgaW50OworICAgIG1lbWNweShsb2FkX2FkZHIsKHUzMilDRkdfU0RJT19MT0FEX0JBU0UsbGVuKTsKKworCisgICAgcmV0dXJuIHJldDsKK30KKworCitpbnQgU2Rpb19TbGF2ZV9Xcml0ZV9BY2sodm9pZCkKK3sKKworCisgICAgdTMyIHN0YXR1cyA9IDA7CisgICAgaW50IHJldCA9IDA7CisKKyAgICAvL3UzMiBhY2tbMl0gPSB7MHgxMTIyMzM0NCwweEFBQkJDQ0REfTsKKyAgICBjaGFyICphY2sgPSAicnhvayI7CisKKyAgICBtZW1jcHkoKHUzMilDRkdfU0RJT19MT0FEX0JBU0UsYWNrLDQpOworCisgICAgcHJpbnRmKCJTRElPIHdyaXRlIGFja1xuIik7CisgICAgIAorICAgIFJFRzMyKFNESU9fU0xBVkVfRE1BMUFERFIpICA9IENGR19TRElPX0xPQURfQkFTRTsgIAorICAgIFJFRzMyKFNESU9fU0xBVkVfRE1BMUNUUkwpIHw9IDB4MTsgICAgCisgICAgCisgICAgd2hpbGUoMSkKKyAgICB7CisgICAgICAgIHN0YXR1cyA9IFJFRzMyKFNESU9fU0xBVkVfSU5UU1RBVFVTKTsKKworICAgICAgCisgICAgICAgIGlmKChzdGF0dXMgJlNESU9fU1RTX1RDKSE9MCkKKyAgICAgICAgeworICAgICAgICAgICAvLyBwcmludGYoIlNESU8geGZlciBPSyFcbiIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmKChzdGF0dXMgJlNESU9fU1RTX0ZfQ1JDX0UpIT0wKQorICAgICAgICAgICB7CisgICAgICAgICAgICBwcmludGYoIlNESU8gQ1JDIEVycm9yIVxuIik7ICAKKworICAgICAgICAgICAvKjEsbWFzayovCisgICAgICAgICAgICBSRUczMihTRElPX1NMQVZFX0lOVFNUQVRVU19FTikmPSh+U0RJT19TVFNfRl9DUkNfRSk7CisgICAgICAgICAgICAvKjIsY2xlYXIqLworICAgICAgICAgICAgUkVHMzIoU0RJT19TTEFWRV9JTlRTVEFUVVMpIHw9IFNESU9fU1RTX0ZfQ1JDX0U7CisgICAgICAgICAgICAvKjMsZW5hbGJlKi8KKyAgICAgICAgICAgIFJFRzMyKFNESU9fU0xBVkVfSU5UU1RBVFVTX0VOKSB8PSBTRElPX1NUU19GX0NSQ19FOworICAgICAgCisgICAgICAgICAgICByZXQgPSBTRElPX0VSUjsKKyAgICAgICAgfQorCisgICAgICAgIGlmKChzdGF0dXMgJlNESU9fU1RTX0ZfQSkhPTApCisgICAgICAgICAgIHsKKworICAgICAgICAgICAgLyoxLG1hc2sqLworICAgICAgICAgICAgUkVHMzIoU0RJT19TTEFWRV9JTlRTVEFUVVNfRU4pJj0oflNESU9fU1RTX0ZfQSk7CisgICAgICAgICAgICAvKjIsY2xlYXIqLworICAgICAgICAgICAgLy9zdGF0dXMgPSBSRUczMihTRElPX1NMQVZFX0lOVFNUQVRVUyk7CisgICAgICAgICAgICBSRUczMihTRElPX1NMQVZFX0lOVFNUQVRVUykgfD0gU0RJT19TVFNfRl9BOworICAgICAgICAgICAgLyozLGVuYWxiZSovCisgICAgICAgICAgICBSRUczMihTRElPX1NMQVZFX0lOVFNUQVRVU19FTikgfD0gU0RJT19TVFNfRl9BOworCisgICAgICAgICAgICAKKyAgICAgICAgICAgIHByaW50ZigiU0RJTyBBQk9SVCBYZmVyIVxuIik7CisKKyAgICAgICAgfQorICAgICAgICAgICAKKyAgICAgICAgCisgICAgfQorLyp0aGFuc2ZlciBjb21wbGV0ZSx3cml0ZSBwcm9ncmFtIGRvbmUqLworICAgLy8gUkVHMzIoU0RJT19TTEFWRV9DVFJMKSAgICAgfD0gMHgxOworLypjbGVhciBpbnQgc3RhdHVzKi8KKyAgICAvKjEsbWFzayovCisKKyAgICBSRUczMihTRElPX1NMQVZFX0lOVFNUQVRVU19FTikgPSAwOworICAgIC8qMixjbGVhciovCisgICAgc3RhdHVzID0gUkVHMzIoU0RJT19TTEFWRV9JTlRTVEFUVVMpOworICAgIFJFRzMyKFNESU9fU0xBVkVfSU5UU1RBVFVTKSA9IHN0YXR1czsKKyAgICAvKjMsZW5hbGJlKi8KKyAgICBSRUczMihTRElPX1NMQVZFX0lOVFNUQVRVU19FTikgPSAweGZmZmZmZmZmOworCisgICAgcmV0dXJuIHJldDsKKyAgICAKK30KKworCitzdGF0aWMgaW50IHNkaW9fc2xhdmVfaW5pdCh2b2lkKQoreworCisgICAgLy8gU0RJT8no1sNDUFJNxKO/6bXEtPrC6worICAgIC8vc2Rpb19jbGtfcmVzZXQoKTsKKworCS8vIEluaXRpYWxpemUgY29udHJvbGxlcgorCXNkaW9faW5pdGlhbF9zZXR1cCgpOworCisKKyAgICAKK30KKworc3RhdGljIGludCBzbGF2ZV9zaXplID0gMDsgCisKKy8qKioqKioqKioqKioqKiAgIHN1Y2Nlc3MgOnJldHVybiBib290IHNpemUgICoqKioqKioqKioqLworaW50IHNkaW9fc2xhdmVfcmVhZChjb25zdCB1MzIgbG9hZF9hZGRyKQoreworICAgIHUzMiBkd0ludF9zdGF0dXMgPSAwOworICAgIHUzMiBkd0N1cnJlbnRfQ21kID0gMDsKKyAgICB1MzIgY21kcmVnID0wOworICAgIHUzMiBhcmdyZWcgPSAwOworICAgIHUzMiBjbWQgPSAwOworICAgIHUzMiBibGtzaXplID0gMDsKKyAgICB1MzIgYmxrY250ID0gMDsKKyAgICB1MzIgYm9vdF9zaXplID0gMDsKKyAgICAKKyAgICBpbnQgcmV0ID0gU0RJT19JTlBST0dSRVNTOworCisgICAgd2hpbGUoMSkKKyAgICB7CisgICAgICAgIC8vIGR3Q3VycmVudF9DbWTOqjUzyrGjrL340NDK/b7d0LRvcrbBstnX9worCisgICAgICAgIGR3Q3VycmVudF9DbWQgPSAoKFJFRzMyKFNESU9fU0xBVkVfQ01EKT4+MTMpICYgMHgzRik7CisKKyAgICAgICAgc3dpdGNoKGR3Q3VycmVudF9DbWQpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgU0RJT19DTUQ1MzoKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgZHdJbnRfc3RhdHVzID0gUkVHMzIoU0RJT19TTEFWRV9JTlRTVEFUVVMpOworCisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmKChkd0ludF9zdGF0dXMgJiBTRElPX1NUU19XUykgPT0gU0RJT19TVFNfV1MpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY21kcmVnID0gUkVHMzIoU0RJT19TTEFWRV9DTUQpOyAKKyAgICAgICAgICAgICAgICBhcmdyZWcgPSBSRUczMihTRElPX1NMQVZFX0FSR1UpOworCisgICAgICAgICAgICAgICAgYmxrc2l6ZSA9IChjbWRyZWcgPj4xKSAmMHhGRkY7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgYmxrY250ID0gYXJncmVnICYgMHgxRkY7CisKKyAgICAgICAgICAgICAgICBpZighKGFyZ3JlZyAmIDB4MDgwMDAwMDApKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICBib290X3NpemUgPWJsa3NpemU7ICAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICBib290X3NpemUgPWJsa2NudCAqIGJsa3NpemU7ICAKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzbGF2ZV9zaXplID0gYm9vdF9zaXplOworCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgcmV0ID0gU2Rpb19TbGF2ZV9SZWFkXzRLKGxvYWRfYWRkcixib290X3NpemUpOworCisgICAgICAgICAgICAgaWYoIXJldCkKKyAgICAgICAgICAgICAgICAgcmV0dXJuIGJvb3Rfc2l6ZTsKKyAgICAgICAgICAgICBlbHNlIGlmKHJldCA9PSBTRElPX0VSUikKKyAgICAgICAgICAgICAgICByZXR1cm4gU0RJT19FUlI7CisgICAgICAgICAgICAgICAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIAorICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IAorCisgICAgfQorCisgICAgcmV0dXJuIGJvb3Rfc2l6ZTsKK30KKworaW50IHNkaW9fc2xhdmVfd3JpdGUodm9pZCkKK3sKKworCisgICB1MzIgZHdJbnRfc3RhdHVzID0gMDsKKyAgIHUzMiBkd0N1cnJlbnRfQ21kID0gMDsKKyAgIHUzMiBjbWRyZWcgPTA7CisgICB1MzIgYXJncmVnID0gMDsKKyAgIHUzMiBjbWQgPSAwOworICAgdTMyIGJsa3NpemUgPSAwOworICAgdTMyIGJsa2NudCA9IDA7CisgICB1MzIgYm9vdF9zaXplID0gMDsKKworICAgaW50IHJldCA9IFNESU9fSU5QUk9HUkVTUzsKKworICAgICBwcmludGYoIlNESU8gc2xhdmUgd3JpdGUgXG4iKTsKKyAKKyAgICBSRUczMihTRElPX1NMQVZFX0ZVTjFDVFJMKSB8PSAoMHg0ICYgMHhGRkZGKTsKKyAgCisgICAgIHdoaWxlKDEpCisgICAgeworICAgICAgICBkd0N1cnJlbnRfQ21kID0gKChSRUczMihTRElPX1NMQVZFX0NNRCk+PjEzKSAmIDB4M0YpOworCisgICAgICAgIHN3aXRjaChkd0N1cnJlbnRfQ21kKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIFNESU9fQ01ENTM6CisgICAgICAgICAgICB7CisKKyAgICAgICAgICAgIGR3SW50X3N0YXR1cyA9IFJFRzMyKFNESU9fU0xBVkVfSU5UU1RBVFVTKTsKKworICAgICAgICAgICAgCisgICAgICAgICAgICBpZigoZHdJbnRfc3RhdHVzICYgU0RJT19TVFNfUlMpID09IFNESU9fU1RTX1JTKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNtZHJlZyA9IFJFRzMyKFNESU9fU0xBVkVfQ01EKTsgCisgICAgICAgICAgICAgICAgYXJncmVnID0gUkVHMzIoU0RJT19TTEFWRV9BUkdVKTsKKworICAgICAgICAgICAgICAgIGJsa3NpemUgPSAoY21kcmVnID4+MSkgJjB4RkZGOworICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgIGJsa2NudCA9IGFyZ3JlZyAmIDB4MUZGOworCisgICAgICAgICAgICAgICAgaWYoIShhcmdyZWcgJiAweDA4MDAwMDAwKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgICAgYm9vdF9zaXplID1ibGtzaXplOyAgCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgYm9vdF9zaXplID1ibGtjbnQgKiBibGtzaXplOyAgCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgcmV0ID0gU2Rpb19TbGF2ZV9Xcml0ZV9BY2soKTsKKworICAgICAgICAgICAgIGlmKCFyZXQpCisgICAgICAgICAgICAgICAgIHJldHVybiBib290X3NpemU7CisgICAgICAgICAgICAgZWxzZSBpZihyZXQgPT0gU0RJT19FUlIpCisgICAgICAgICAgICAgICAgcmV0dXJuIFNESU9fRVJSOworICAgICAgICAgICAgICAgCisgICAgICAgICAgICB9CisgICAgICAgICAgICAKKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSAKKworICAgIAorICAgfQorCisgICByZXR1cm4gYm9vdF9zaXplOworICAgIAorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBGdW5jdGlvbjogICAgIAorICogRGVzY3JpcHRpb246IAorICogUGFyYW1ldGVyczoKKyAqCSBJbnB1dDoKKyAqCisgKgkgT3V0cHV0OgorICoKKyAqIFJldHVybnM6CisgKgorICoKKyAqIE90aGVyczoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludCBzZGlvX3NsYXZlX3JlYWRfYmluKCkKK3sKKyAgICBpbnQzMl90IGxlbiA9IDA7CisgICAgdWludDMyX3QgaSA9MDsKKyAgICAKKyAgLyoxLrXa0ru0zr3TytUgKi8KKyAgICBsZW4gPSBzZGlvX3NsYXZlX3JlYWQoKHUzMilDRkdfVEVNUF9BRERSKTsKKyAgICBpZiggbGVuIDwgMCApCisgICAgeworICAgICAgICBwcmludGYoInNkaW9fc2xhdmU6IHJlYWQgZmlyc3QgZXJyb3JcbiIpOworICAgICAgICBnb3RvIHNkaW9fZXJyb3IxOworICAgIH0KKworICAvKjIuu/HIobDmsb7Qxc+iICovCisgICAgaW1hZ2VfaGVhZGVyX3QgKmhlYWRlciA9IE5VTEw7CisgICAgaGVhZGVyID0gKGltYWdlX2hlYWRlcl90ICopQ0ZHX1RFTVBfQUREUjsKKyAgICB1aW50MzJfdCBoZWFkZXJfc2l6ZSA9IHNpemVvZihpbWFnZV9oZWFkZXJfdCk7CisgICAgdWludDMyX3Qgc2l6ZSA9IF9fX2h0b25sKGhlYWRlci0+aWhfc2l6ZSk7IAorICAgIHVpbnQzMl90IGxvYWRfYWRkciA9IF9fX2h0b25sKGhlYWRlci0+aWhfbG9hZCk7CisgICAgdWJvb3RfZW50cnlfcG9pbnQgPSBfX19odG9ubChoZWFkZXItPmloX2VwKTsKKworICAvKjMuv72xtLXa0ru0zsr9vt0gKi8KKyAgICBtZW1jcHkobG9hZF9hZGRyLCBDRkdfVEVNUF9BRERSK3NpemVvZihpbWFnZV9oZWFkZXJfdCksIGxlbik7CisgICAgbG9hZF9hZGRyID0gbG9hZF9hZGRyICsgbGVuIC0gaGVhZGVyX3NpemU7CisgICAgCisgIC8qNC68xsvjtKvK5LTOyv0gKi8KKyAgICAvKiDI57n7tdrSu7TOtKvK5LXE19a92rTz09q78rXI09qw5rG+tcS089Cho6zU8rSryuTN6rPJ1rG907e1u9ggKi8KKyAgICBpZiggKGxlbiA+IHNpemUpIHx8IChsZW4gPT0gc2l6ZSkgKQorICAgIHsgICAKKyAgICAgICAgcHJpbnRmKCJzZGlvX3NsYXZlOiBmaXJzdCBmaW5zaCBhbmQgcmV0dXJuXG4iKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdWludDMyX3QgbGVmdF90aW1lcyA9IHNpemUvQ0ZHX1NESU9fU0xBVkVfUEFDS0FHRV9MRU47CisgICAgdWludDMyX3QgbW9kID0gc2l6ZSVDRkdfU0RJT19TTEFWRV9QQUNLQUdFX0xFTjsKKyAgICBpZiggbW9kID09IDAgKQorICAgIHsKKyAgICAgICAgbGVmdF90aW1lcy0tOworICAgIH0KKworICAgIAorICAgIC8qIGRlYnVnICovCisgICAgcHJpbnRmKCJzZGlvX3NsYXZlOiBkaXNwbGF5IHRoZSB0cmFuc2ZlciB0aW1lc1xuIik7CisgICAgZm9yKCBpPTA7IGk8bGVmdF90aW1lcysxOyBpKysgKQorICAgICAgICBwcmludGYoIiArICIpOworICAgIHByaW50ZigiXG4iKTsKKworICAvKjUuvdPK1cbk0+C1xMr9vt0gKi8gCisgICAgZm9yKCBpPTA7IGk8bGVmdF90aW1lczsgaSsrICkKKyAgICB7CisgICAgICAgIGxlbiA9IHNkaW9fc2xhdmVfcmVhZChsb2FkX2FkZHIpOworICAgICAgICBpZiggbGVuIDwgMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIHByaW50Zigic2Rpb19zbGF2ZTogcmVhZCBvdGhlcnMgZXJyb3JcbiIpOworICAgICAgICAgICAgZ290byBzZGlvX2Vycm9yMTsgICAgICAgIAorICAgICAgICB9CisgICAgICAgIGxvYWRfYWRkciArPSBsZW47CisgICAgfQorCisgICAgcmV0dXJuIDA7Cisgc2Rpb19lcnJvcjE6CisgICAgcmV0dXJuIC0xOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogRnVuY3Rpb246ICAgICAKKyAqIERlc2NyaXB0aW9uOiAKKyAqIFBhcmFtZXRlcnM6CisgKgkgSW5wdXQ6CisgKgorICoJIE91dHB1dDoKKyAqCisgKiBSZXR1cm5zOgorICoKKyAqCisgKiBPdGhlcnM6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIHNkaW9fc2xhdmVfcHJvY2Vzcyh2b2lkKQoreworICAgIGludCByZXQgPSAwOworCisgICAgLy9zZGlvX3NsYXZlX2luaXQoKTsKKyAgICBwcmludGYoInJ1biBpbnRvIHNkaW9fc2xhdmVfcHJvY2Vzc1xuIik7CisvKiAxLiC908rVdWJvb3QgICovCisgICAgcmV0ID0gc2Rpb19zbGF2ZV9yZWFkX2JpbigpOworICAgIGlmKCByZXQgIT0gMCApCisgICAgeworICAgICAgIHByaW50Zigic2Rpb19zbGF2ZTogcmVhZCB1Ym9vdCBlcnJvclxuIik7CisgICAgICAgZ290byB3YWl0X2Vycm9yOworICAgIH0KKyAgICBwcmludGYoInNkaW9fc2xhdmU6IHJlYWQgdWJvb3QgT0tcbiIpOworCisKKyAgICAKKyAgIHJldCA9IHNkaW9fc2xhdmVfd3JpdGUoKTsKKyAgIGlmKHJldCA+IDApCisgICB7CisKKyAgICAgIHByaW50Zigic2Rpb19zbGF2ZTogd3JpdGUgYWNrIHN1Y2Nlc3NcbiIpOyAKKyAgIH0KKworICAgIAorCisgICAgLyogIHI3IMz416rG9LavtPrC6yAqLyAKKyAgICB3cml0ZWwoMHhFNTlmZjAwMCwgMHgxMDAwMDApOyAgICAgICAgICAgICAKKyAgICB3cml0ZWwodWJvb3RfZW50cnlfcG9pbnQsIDB4MTAwMDAwICsgOCk7ICAgCisKKyAgICBwcmludGYoIlN0YXJ0IHRoZSB1Ym9vdC4uLi5cbiIpOworCisgICAgCisgICAgd3JpdGVsKDB4ZiwgMHgxMzA3MDJjKTsgCisgICAgICAKKyAgICB3aGlsZSgxKTsKKyAgICAKK3dhaXRfZXJyb3I6CisgICAgcHJpbnRmKCJzZGlvX3NsYXZlOiBlcnJvciB3YWl0XG4iKTsKKyAgICB3aGlsZSgxKTsKK30KKwo=