ZGlmZiAtLWdpdCBhL01FVEFEQVRBIGIvTUVUQURBVEEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk3OTc1YwotLS0gL2Rldi9udWxsCisrKyBiL01FVEFEQVRBCkBAIC0wLDAgKzEsMyBAQAordGhpcmRfcGFydHkgeworICBsaWNlbnNlX3R5cGU6IE5PVElDRQorfQpkaWZmIC0tZ2l0IGEvYXBleC9BbmRyb2lkLmJwIGIvYXBleC9BbmRyb2lkLmJwCmluZGV4IGMxZWYzZDguLmVmMjk2ZDYgMTAwNjQ0Ci0tLSBhL2FwZXgvQW5kcm9pZC5icAorKysgYi9hcGV4L0FuZHJvaWQuYnAKQEAgLTU5LDYgKzU5LDE2IEBACiAgICAgbmFtZTogImNvbS5hbmRyb2lkLm1lZGlhIiwKICAgICBtYW5pZmVzdDogIm1hbmlmZXN0Lmpzb24iLAogICAgIGRlZmF1bHRzOiBbImNvbS5hbmRyb2lkLm1lZGlhLWRlZmF1bHRzIl0sCisgICAgcHJlYnVpbHRzOiBbCisgICAgICAgICJtZWRpYS1saW5rZXItY29uZmlnIiwKKyAgICBdLAorfQorCitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJtZWRpYS1saW5rZXItY29uZmlnIiwKKyAgICBzcmM6ICJsaW5rZXIuY29uZmlnLnR4dCIsCisgICAgZmlsZW5hbWU6ICJsaW5rZXIuY29uZmlnLnR4dCIsCisgICAgaW5zdGFsbGFibGU6IGZhbHNlLAogfQogCiBmaWxlZ3JvdXAgewpkaWZmIC0tZ2l0IGEvYXBleC9saW5rZXIuY29uZmlnLnR4dCBiL2FwZXgvbGlua2VyLmNvbmZpZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFjODE1YgotLS0gL2Rldi9udWxsCisrKyBiL2FwZXgvbGlua2VyLmNvbmZpZy50eHQKQEAgLTAsMCArMSw3IEBACisjIEV4dHJhIGxpbmtlciBjb25maWd1cmF0aW9ucyBmb3IgbWVkaWEgQVBFWAorIyBTZWUgaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vc3lzdGVtL2xpbmtlcmNvbmZpZy8rL21hc3Rlci9SRUFETUUubWQjYXBleF9ldGNfbGlua2VyX2NvbmZpZ190eHQKKworW3Byb3BlcnRpZXNdCisKKyMgU2V0IG1lZGlhIEFQRVggYXMgZm9yY2UgdmlzaWJsZSBzbyBtZWRpYSBBUEVYIG5hbWVzcGFjZSBpcyBhY2Nlc3NpYmxlIHZpYSBhbmRyb2lkX2dldF9leHBvcnRlZF9uYW1lc3BhY2UKK3Zpc2libGUgPSB0cnVlCmRpZmYgLS1naXQgYS9hcGV4L21hbmlmZXN0X2NvZGVjLmpzb24gYi9hcGV4L21hbmlmZXN0X2NvZGVjLmpzb24KaW5kZXggMjMyMGZkNy4uMWYwNWQyZSAxMDA2NDQKLS0tIGEvYXBleC9tYW5pZmVzdF9jb2RlYy5qc29uCisrKyBiL2FwZXgvbWFuaWZlc3RfY29kZWMuanNvbgpAQCAtMSw0ICsxLDcgQEAKIHsKICAgIm5hbWUiOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCi0gICJ2ZXJzaW9uIjogMzAwMDAwMDAwCisgICJ2ZXJzaW9uIjogMzAwMDAwMDAwLAorICAicmVxdWlyZU5hdGl2ZUxpYnMiOiBbCisgICAgIjpzcGhhbCIKKyAgXQogfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuY3BwIGIvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuY3BwCmluZGV4IDY4OTY5Y2YuLmU5NWM5MWMgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmNwcAorKysgYi9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CiAKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzMi5jcHAgYi9jYW1lcmEvQ2FtZXJhUGFyYW1ldGVyczIuY3BwCmluZGV4IGMyOTIzM2MuLmExY2YzNTUgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYW1lcmFQYXJhbWV0ZXJzMi5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMyLmNwcApAQCAtMjEsNiArMjEsNyBAQAogCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5icCBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5icAppbmRleCBkYzdmODhhLi4wOWEzMzNiIDEwMDY0NAotLS0gYS9jYW1lcmEvY2FtZXJhc2VydmVyL0FuZHJvaWQuYnAKKysrIGIvY2FtZXJhL2NhbWVyYXNlcnZlci9BbmRyb2lkLmJwCkBAIC0zNyw3ICszNyw3IEBACiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4yIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjQiLAogICAgIF0sCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKKyAgICBjb21waWxlX211bHRpbGliOiAicHJlZmVyMzIiLAogICAgIGNmbGFnczogWwogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdleHRyYSIsCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcAppbmRleCBiNThlYmUyLi40MTkyNTBjIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAKQEAgLTc0Myw3ICs3NDMsNyBAQAogICAgIC8vIE5vIHdheSB0byBnZXQgcGFja2FnZSBuYW1lIGZyb20gbmF0aXZlLgogICAgIC8vIFNlbmQgYSB6ZXJvIGxlbmd0aCBwYWNrYWdlIG5hbWUgYW5kIGxldCBjYW1lcmEgc2VydmljZSBmaWd1cmUgaXQgb3V0IGZyb20gVUlECiAgICAgYmluZGVyOjpTdGF0dXMgc2VydmljZVJldCA9IGNzLT5jb25uZWN0RGV2aWNlKAotICAgICAgICAgICAgY2FsbGJhY2tzLCBTdHJpbmcxNihjYW1lcmFJZCksIFN0cmluZzE2KCIiKSwgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PigpLAorICAgICAgICAgICAgY2FsbGJhY2tzLCBTdHJpbmcxNihjYW1lcmFJZCksIFN0cmluZzE2KCIiKSwge30sCiAgICAgICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OlVTRV9DQUxMSU5HX1VJRCwgLypvdXQqLyZkZXZpY2VSZW1vdGUpOwogCiAgICAgaWYgKCFzZXJ2aWNlUmV0LmlzT2soKSkgewpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YS5oIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YS5oCmluZGV4IDA3MmJiMDIuLmE4NDBiZDEgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGEuaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhLmgKQEAgLTM2LDYgKzM2LDcgQEAKICNpZm5kZWYgX05ES19DQU1FUkFfTUVUQURBVEFfSAogI2RlZmluZSBfTkRLX0NBTUVSQV9NRVRBREFUQV9ICiAKKyNpbmNsdWRlIDxzdGRib29sLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CiAKZGlmZiAtLWdpdCBhL2NhbWVyYS90ZXN0cy9DYW1lcmFCaW5kZXJUZXN0cy5jcHAgYi9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwCmluZGV4IDhjY2RlZDIuLmVlZTA1ZmYgMTAwNjQ0Ci0tLSBhL2NhbWVyYS90ZXN0cy9DYW1lcmFCaW5kZXJUZXN0cy5jcHAKKysrIGIvY2FtZXJhL3Rlc3RzL0NhbWVyYUJpbmRlclRlc3RzLmNwcApAQCAtMzc4LDcgKzM3OCw3IEBACiAgICAgICAgIHNwPFRlc3RDYW1lcmFEZXZpY2VDYWxsYmFja3M+IGNhbGxiYWNrcyhuZXcgVGVzdENhbWVyYURldmljZUNhbGxiYWNrcygpKTsKICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyPiBkZXZpY2U7CiAgICAgICAgIHJlcyA9IHNlcnZpY2UtPmNvbm5lY3REZXZpY2UoY2FsbGJhY2tzLCBjYW1lcmFJZCwgU3RyaW5nMTYoIm1lZWVlZWVlZWUhIiksCi0gICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PigpLCBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OlVTRV9DQUxMSU5HX1VJRCwKKyAgICAgICAgICAgICAgICB7fSwgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpVU0VfQ0FMTElOR19VSUQsCiAgICAgICAgICAgICAgICAgLypvdXQqLyZkZXZpY2UpOwogICAgICAgICBFWFBFQ1RfVFJVRShyZXMuaXNPaygpKSA8PCByZXM7CiAgICAgICAgIEFTU0VSVF9ORShudWxscHRyLCBkZXZpY2UuZ2V0KCkpOwpAQCAtNDIxLDcgKzQyMSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIFNDT1BFRF9UUkFDRSgib3Blbk5ld0RldmljZSIpOwogICAgICAgICAgICAgYmluZGVyOjpTdGF0dXMgcmVzID0gc2VydmljZS0+Y29ubmVjdERldmljZShjYWxsYmFja3MsIGRldmljZUlkLCBTdHJpbmcxNigibWVlZWVlZWVlZSEiKSwKLSAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PigpLCBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OlVTRV9DQUxMSU5HX1VJRCwKKyAgICAgICAgICAgICAgICAgICAge30sIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6VVNFX0NBTExJTkdfVUlELAogICAgICAgICAgICAgICAgICAgICAvKm91dCovJmRldmljZSk7CiAgICAgICAgICAgICBFWFBFQ1RfVFJVRShyZXMuaXNPaygpKSA8PCByZXM7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL2RybS9jb21tb24vaW5jbHVkZS9Ecm1FbmdpbmVCYXNlLmggYi9kcm0vY29tbW9uL2luY2x1ZGUvRHJtRW5naW5lQmFzZS5oCmluZGV4IDczZjExYTQuLmMwYTVlM2IgMTAwNjQ0Ci0tLSBhL2RybS9jb21tb24vaW5jbHVkZS9Ecm1FbmdpbmVCYXNlLmgKKysrIGIvZHJtL2NvbW1vbi9pbmNsdWRlL0RybUVuZ2luZUJhc2UuaApAQCAtMzA5LDcgKzMwOSw3IEBACiAKICAgICAvKioKICAgICAgKiBSZW1vdmVzIGFsbCB0aGUgcmlnaHRzIGluZm9ybWF0aW9uIG9mIGVhY2ggcGx1Zy1pbiBhc3NvY2lhdGVkIHdpdGgKLSAgICAgKiBEUk0gZnJhbWV3b3JrLiBXaWxsIGJlIHVzZWQgaW4gbWFzdGVyIHJlc2V0CisgICAgICogRFJNIGZyYW1ld29yay4KICAgICAgKgogICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKZGlmZiAtLWdpdCBhL2RybS9jb21tb24vaW5jbHVkZS9JRHJtRW5naW5lLmggYi9kcm0vY29tbW9uL2luY2x1ZGUvSURybUVuZ2luZS5oCmluZGV4IDE4MzdhMTEuLmE1NDU5NDEgMTAwNjQ0Ci0tLSBhL2RybS9jb21tb24vaW5jbHVkZS9JRHJtRW5naW5lLmgKKysrIGIvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1FbmdpbmUuaApAQCAtMjUwLDcgKzI1MCw3IEBACiAKICAgICAvKioKICAgICAgKiBSZW1vdmVzIGFsbCB0aGUgcmlnaHRzIGluZm9ybWF0aW9uIG9mIGVhY2ggcGx1Zy1pbiBhc3NvY2lhdGVkIHdpdGgKLSAgICAgKiBEUk0gZnJhbWV3b3JrLiBXaWxsIGJlIHVzZWQgaW4gbWFzdGVyIHJlc2V0CisgICAgICogRFJNIGZyYW1ld29yay4KICAgICAgKgogICAgICAqIEBwYXJhbVtpbl0gdW5pcXVlSWQgVW5pcXVlIGlkZW50aWZpZXIgZm9yIGEgc2Vzc2lvbgogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKZGlmZiAtLWdpdCBhL2RybS9kcm1zZXJ2ZXIvQW5kcm9pZC5icCBiL2RybS9kcm1zZXJ2ZXIvQW5kcm9pZC5icAppbmRleCBiNjhlNmMyLi5mY2QyOTFmIDEwMDY0NAotLS0gYS9kcm0vZHJtc2VydmVyL0FuZHJvaWQuYnAKKysrIGIvZHJtL2RybXNlcnZlci9BbmRyb2lkLmJwCkBAIC00Myw3ICs0Myw3IEBACiAgICAgICAgICItV2Vycm9yIiwKICAgICBdLAogCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKKyAgICBjb21waWxlX211bHRpbGliOiAicHJlZmVyMzIiLAogCiAgICAgaW5pdF9yYzogWyJkcm1zZXJ2ZXIucmMiXSwKIH0KZGlmZiAtLWdpdCBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwCmluZGV4IDlhMzJjYzUuLjc0ZTMyMjMgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAKKysrIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcApAQCAtOTksMTMgKzk5LDEzIEBACiAgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgewotICAgICAgICAgICAgQUxPR1coIlVucmVjb2duaXplZCBtZXNzYWdlIHR5cGU6ICV6ZCIsIG1zZy0+d2hhdCgpKTsKKyAgICAgICAgICAgIEFMT0dXKCJVbnJlY29nbml6ZWQgbWVzc2FnZSB0eXBlOiAldSIsIG1zZy0+d2hhdCgpKTsKICAgICAgICAgfQogICAgIH0KIH0KIAogaW50NjRfdCBEcm1NYW5hZ2VyOjpnZXRNZXRyaWNzRmx1c2hQZXJpb2RVcygpIHsKLSAgICByZXR1cm4gMTAwMCAqIDEwMDAgKiBzdGQ6Om1heCgxbGwsIHByb3BlcnR5X2dldF9pbnQ2NCgiZHJtbWFuYWdlci5tZXRyaWNzLnBlcmlvZCIsIDg2NDAwKSk7CisgICAgcmV0dXJuIDEwMDAgKiAxMDAwICogc3RkOjptYXgoMWxsLCAobG9uZyBsb25nKXByb3BlcnR5X2dldF9pbnQ2NCgiZHJtbWFuYWdlci5tZXRyaWNzLnBlcmlvZCIsIDg2NDAwKSk7CiB9CiAKIHZvaWQgRHJtTWFuYWdlcjo6cmVjb3JkRW5naW5lTWV0cmljcygKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvaW5jbHVkZS9Ecm1NYW5hZ2VyQ2xpZW50SW1wbC5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0RybU1hbmFnZXJDbGllbnRJbXBsLmgKaW5kZXggMzg1ODY3NS4uOGM4NzgzYiAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0RybU1hbmFnZXJDbGllbnRJbXBsLmgKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9pbmNsdWRlL0RybU1hbmFnZXJDbGllbnRJbXBsLmgKQEAgLTIzMCw3ICsyMzAsNyBAQAogCiAgICAgLyoqCiAgICAgICogUmVtb3ZlcyBhbGwgdGhlIHJpZ2h0cyBpbmZvcm1hdGlvbiBvZiBlYWNoIHBsdWctaW4gYXNzb2NpYXRlZCB3aXRoCi0gICAgICogRFJNIGZyYW1ld29yay4gV2lsbCBiZSB1c2VkIGluIG1hc3RlciByZXNldAorICAgICAqIERSTSBmcmFtZXdvcmsuCiAgICAgICoKICAgICAgKiBAcGFyYW1baW5dIHVuaXF1ZUlkIFVuaXF1ZSBpZGVudGlmaWVyIGZvciBhIHNlc3Npb24KICAgICAgKiBAcmV0dXJuIHN0YXR1c190CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lLmgKaW5kZXggYjYyZGRiOS4uZWI1YjBmNiAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL2luY2x1ZGUvRndkTG9ja0VuZ2luZS5oCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9pbmNsdWRlL0Z3ZExvY2tFbmdpbmUuaApAQCAtMjUyLDggKzI1Miw3IEBACiAKIC8qKgogICogUmVtb3ZlcyBhbGwgdGhlIHJpZ2h0cyBpbmZvcm1hdGlvbiBvZiBlYWNoIHBsdWctaW4gYXNzb2NpYXRlZCB3aXRoCi0gKiBEUk0gZnJhbWV3b3JrLiBXaWxsIGJlIHVzZWQgaW4gbWFzdGVyIHJlc2V0IGJ1dCBkb2VzIG5vdGhpbmcgZm9yCi0gKiBGb3J3YXJkIExvY2sgRW5naW5lLgorICogRFJNIGZyYW1ld29yay4gRG9lcyBub3RoaW5nIGZvciBGb3J3YXJkIExvY2sgRW5naW5lLgogICoKICAqIEBwYXJhbSB1bmlxdWVJZCBVbmlxdWUgaWRlbnRpZmllciBmb3IgYSBzZXNzaW9uCiAgKiBAcmV0dXJuIHN0YXR1c190CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvRndkTG9jay5odG1sIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvZG9jL0Z3ZExvY2suaHRtbAppbmRleCA4Zjk1Y2QyLi5jMWQ1YjNkIDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9kb2MvRndkTG9jay5odG1sCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L2RvYy9Gd2RMb2NrLmh0bWwKQEAgLTQ4OCw3ICs0ODgsNyBAQAogPHAgY2xhc3M9TXNvQm9keVRleHQ+PGI+Tm90ZTo8L2I+IFRoZSBrZXktZW5jcnlwdGlvbiBrZXkgbXVzdCBiZSB1bmlxdWUgdG8gZWFjaAogZGV2aWNlOyB0aGlzIGlzIHdoYXQgbWFrZXMgdGhlIGZpbGVzIGZvcndhcmQgbG9ja5Zwcm90ZWN0ZWQuIElkZWFsbHksIGl0IHNob3VsZAogYmUgZGVyaXZlZCBmcm9tIHNlY3JldCBoYXJkd2FyZSBwYXJhbWV0ZXJzLCBidXQgYXQgdGhlIHZlcnkgbGVhc3QgaXQgc2hvdWxkIGJlCi1wZXJzaXN0ZW50IGZyb20gb25lIG1hc3RlciByZXNldCB0byB0aGUgbmV4dC48L3A+CitwZXJzaXN0ZW50IGZyb20gb25lIGZhY3RvcnkgcmVzZXQgdG8gdGhlIG5leHQuPC9wPgogCiA8ZGl2IHN0eWxlPSdtYXJnaW4tYm90dG9tOjI0LjBwdDtib3JkZXI6c29saWQgd2luZG93dGV4dCAxLjBwdDtwYWRkaW5nOjEuMHB0IDQuMHB0IDEuMHB0IDQuMHB0OwogYmFja2dyb3VuZDojRjJGMkYyJz4KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9Ecm1TZXNzaW9uTWFuYWdlci5jcHAgYi9kcm0vbGlibWVkaWFkcm0vRHJtU2Vzc2lvbk1hbmFnZXIuY3BwCmluZGV4IDUyOTI3MDUuLmUzMTM5NWQgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9Ecm1TZXNzaW9uTWFuYWdlci5jcHAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmNwcApAQCAtNjYsNyArNjYsNyBAQAogICAgIHN0ZDo6dmVjdG9yPE1lZGlhUmVzb3VyY2VQYXJjZWw+IHJlc291cmNlczsKICAgICBNZWRpYVJlc291cmNlUGFyY2VsIHJlc291cmNlewogICAgICAgICAgICAgVHlwZTo6a0RybVNlc3Npb24sIFN1YlR5cGU6OmtVbnNwZWNpZmllZFN1YlR5cGUsCi0gICAgICAgICAgICB0b1N0ZFZlYzxpbnQ4X3Q+KHNlc3Npb25JZCksIHZhbHVlfTsKKyAgICAgICAgICAgIHRvU3RkVmVjPD4oc2Vzc2lvbklkKSwgdmFsdWV9OwogICAgIHJlc291cmNlcy5wdXNoX2JhY2socmVzb3VyY2UpOwogICAgIHJldHVybiByZXNvdXJjZXM7CiB9CmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9Ecm1TZXNzaW9uTWFuYWdlci5oIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vRHJtU2Vzc2lvbk1hbmFnZXIuaAppbmRleCA5ZTQzNTA0Li5jNTZiZjAxIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9Ecm1TZXNzaW9uTWFuYWdlci5oCisrKyBiL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmgKQEAgLTYyLDcgKzYyLDcgQEAKICAgICB2b2lkIHJlbW92ZVNlc3Npb24oY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpOwogICAgIGJvb2wgcmVjbGFpbVNlc3Npb24oaW50IGNhbGxpbmdQaWQpOwogCi0gICAgLy8gc2FuaXR5IGNoZWNrIEFQSXMKKyAgICAvLyBpbnNwZWN0aW9uIEFQSXMKICAgICBzaXplX3QgZ2V0U2Vzc2lvbkNvdW50KCkgY29uc3Q7CiAgICAgYm9vbCBjb250YWluc1Nlc3Npb24oY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIGNvbnN0OwogCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUZldGNoZXIuY3BwIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlGZXRjaGVyLmNwcAppbmRleCBjYjY5ZjkxLi40NjZlNTcxIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUZldGNoZXIuY3BwCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5RmV0Y2hlci5jcHAKQEAgLTYyLDggKzYyLDggQEAKICAgICB9CiAgICAgQUxPR1YoImRlc2NyaXB0b3Jfc2l6ZT0lenUiLCBjb250YWluZXIuZGVzY3JpcHRvcl9zaXplKCkpOwogCi0gICAgLy8gU2FuaXR5IGNoZWNrIHRvIHZlcmlmeSB0aGF0IHRoZSBCcm9hZGNhc3RFbmNyeXB0b3IgaXMgc2VuZGluZyBhIHByb3Blcmx5Ci0gICAgLy8gZm9ybWVkIEVjbUNvbnRhaW5lci4gSWYgaXQgY29udGFpbnMgdHdvIEVjbXMsIHRoZSBpZHMgc2hvdWxkIGhhdmUgZGlmZmVyZW50CisgICAgLy8gVmFsaWRhdGUgdGhhdCB0aGUgQnJvYWRjYXN0RW5jcnlwdG9yIGlzIHNlbmRpbmcgYSBwcm9wZXJseSBmb3JtZWQKKyAgICAvLyBFY21Db250YWluZXIuIElmIGl0IGNvbnRhaW5zIHR3byBFY21zLCB0aGUgaWRzIHNob3VsZCBoYXZlIGRpZmZlcmVudAogICAgIC8vIHBhcml0eSAob25lIG9kZCwgb25lIGV2ZW4pLiBUaGlzIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGFmZmVjdCBkZWNyeXB0aW9uCiAgICAgLy8gYnV0IGluZGljYXRlcyBhIHByb2JsZW0gd2l0aCBFY20gZ2VuZXJhdGlvbi4KICAgICBpZiAoY29udGFpbmVyLmRlc2NyaXB0b3Jfc2l6ZSgpID09IDIpIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL0RybU1hbmFnZXJDbGllbnQuaCBiL2luY2x1ZGUvZHJtL0RybU1hbmFnZXJDbGllbnQuaAppbmRleCA4NjZlZGFjLi5hMzhhYTliIDEwMDY0NAotLS0gYS9pbmNsdWRlL2RybS9Ecm1NYW5hZ2VyQ2xpZW50LmgKKysrIGIvaW5jbHVkZS9kcm0vRHJtTWFuYWdlckNsaWVudC5oCkBAIC0zMTgsNyArMzE4LDcgQEAKIAogICAgIC8qKgogICAgICAqIFJlbW92ZXMgYWxsIHRoZSByaWdodHMgaW5mb3JtYXRpb24gb2YgZWFjaCBwbHVnLWluIGFzc29jaWF0ZWQgd2l0aAotICAgICAqIERSTSBmcmFtZXdvcmsuIFdpbGwgYmUgdXNlZCBpbiBtYXN0ZXIgcmVzZXQKKyAgICAgKiBEUk0gZnJhbWV3b3JrLgogICAgICAqCiAgICAgICogQHJldHVybiBzdGF0dXNfdAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKZGlmZiAtLWdpdCBhL21lZGlhL09XTkVSUyBiL21lZGlhL09XTkVSUwppbmRleCAxYWZjMjUzLi5iZDgzYWQ5IDEwMDY0NAotLS0gYS9tZWRpYS9PV05FUlMKKysrIGIvbWVkaWEvT1dORVJTCkBAIC04LDcgKzgsNiBAQAogaHVuZ2FAZ29vZ2xlLmNvbQogamlhYmluQGdvb2dsZS5jb20KIGptdHJpdmlAZ29vZ2xlLmNvbQota3JvY2FyZEBnb29nbGUuY29tCiBsYWpvc0Bnb29nbGUuY29tCiBtYXJjb25lQGdvb2dsZS5jb20KIG1uYWdhbm92QGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2F1ZGlvc2VydmVyL21haW5fYXVkaW9zZXJ2ZXIuY3BwIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAKaW5kZXggZjlmNGYzMS4uMTczMDlkZCAxMDA2NDQKLS0tIGEvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAKKysrIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvbWFpbl9hdWRpb3NlcnZlci5jcHAKQEAgLTQ5LDcgKzQ5LDEyIEBACiAKICAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CiAKKyNpZiAxCisgICAgLy8gRklYTUUgU2VlIGJ1ZyAxNjU3MDIzOTQgYW5kIGJ1ZyAxNjg1MTE0ODUKKyAgICBjb25zdCBib29sIGRvTG9nID0gZmFsc2U7CisjZWxzZQogICAgIGJvb2wgZG9Mb2cgPSAoYm9vbCkgcHJvcGVydHlfZ2V0X2Jvb2woInJvLnRlc3RfaGFybmVzcyIsIDApOworI2VuZGlmCiAKICAgICBwaWRfdCBjaGlsZFBpZDsKICAgICAvLyBGSVhNRSBUaGUgYWR2YW50YWdlIG9mIG1ha2luZyB0aGUgcHJvY2VzcyBjb250YWluaW5nIG1lZGlhLmxvZyBzZXJ2aWNlIHRoZSBwYXJlbnQgcHJvY2VzcyBvZgpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL211bHRpLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9tdWx0aS5jcHAKaW5kZXggMTc5NjgxOS4uZDhjYzI4NSAxMDA2NDQKLS0tIGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL211bHRpLmNwcAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvbXVsdGkuY3BwCkBAIC0yMTUsNyArMjE1LDcgQEAKIH0gIC8vIGFub255bW91cyBuYW1lc3BhY2UKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7Ci0gIHNldGVudigiVFJFQkxFX1RFU1RJTkdfT1ZFUlJJREUiLCAidHJ1ZSIsIHRydWUpOworICBhbmRyb2lkOjpoYXJkd2FyZTo6ZGV0YWlsczo6c2V0VHJlYmxlVGVzdGluZ092ZXJyaWRlKHRydWUpOwogICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKICAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKICAgTE9HKElORk8pIDw8ICJUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvbXVsdGkuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvbXVsdGkuY3BwCmluZGV4IDY4YjY5OTIuLmI0MDgzOGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL211bHRpLmNwcAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9tdWx0aS5jcHAKQEAgLTIxNSw3ICsyMTUsNyBAQAogfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgc2V0ZW52KCJUUkVCTEVfVEVTVElOR19PVkVSUklERSIsICJ0cnVlIiwgdHJ1ZSk7CisgIGFuZHJvaWQ6OmhhcmR3YXJlOjpkZXRhaWxzOjpzZXRUcmVibGVUZXN0aW5nT3ZlcnJpZGUodHJ1ZSk7CiAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwogICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOwogICBMT0coSU5GTykgPDwgIlRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuY3BwCmluZGV4IGM3MDQ2Y2IuLjliYTNiNjk3IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmNwcApAQCAtNTA2LDMwICs1MDYsMjggQEAKIH0KIAogc3RhdGljIHZvaWQgY29weU91dHB1dEJ1ZmZlclRvWXV2UGxhbmFyRnJhbWUoCi0gICAgICAgIHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDhfdCAqc3JjWSwgY29uc3QgdWludDhfdCAqc3JjVSwgY29uc3QgdWludDhfdCAqc3JjViwKKyAgICAgICAgdWludDhfdCAqZHN0WSwgdWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSwgY29uc3QgdWludDhfdCAqc3JjVSwgY29uc3QgdWludDhfdCAqc3JjViwKICAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKICAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwKICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgewotICAgIHVpbnQ4X3QqIGRzdFN0YXJ0ID0gZHN0OwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgewotICAgICAgICBtZW1jcHkoZHN0LCBzcmNZLCB3aWR0aCk7CisgICAgICAgIG1lbWNweShkc3RZLCBzcmNZLCB3aWR0aCk7CiAgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKLSAgICAgICAgZHN0ICs9IGRzdFlTdHJpZGU7CisgICAgICAgIGRzdFkgKz0gZHN0WVN0cmlkZTsKICAgICB9CiAKLSAgICBkc3QgPSBkc3RTdGFydCArIGRzdFlTdHJpZGUgKiBoZWlnaHQ7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKLSAgICAgICAgIG1lbWNweShkc3QsIHNyY1YsIHdpZHRoIC8gMik7CisgICAgICAgIG1lbWNweShkc3RWLCBzcmNWLCB3aWR0aCAvIDIpOwogICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7Ci0gICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICAgICAgZHN0ViArPSBkc3RVVlN0cmlkZTsKICAgICB9CiAKLSAgICBkc3QgPSBkc3RTdGFydCArIChkc3RZU3RyaWRlICogaGVpZ2h0KSArIChkc3RVVlN0cmlkZSAqIGhlaWdodCAvIDIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7Ci0gICAgICAgICBtZW1jcHkoZHN0LCBzcmNVLCB3aWR0aCAvIDIpOworICAgICAgICBtZW1jcHkoZHN0VSwgc3JjVSwgd2lkdGggLyAyKTsKICAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOwotICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgICAgIGRzdFUgKz0gZHN0VVZTdHJpZGU7CiAgICAgfQogfQogCkBAIC01OTYsMTYgKzU5NCwxMiBAQAogICAgIHJldHVybjsKIH0KIAotc3RhdGljIHZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIodWludDhfdCAqZHN0LAorc3RhdGljIHZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIoCisgICAgICAgIHVpbnQ4X3QgKmRzdFksIHVpbnQ4X3QgKmRzdFUsIHVpbnQ4X3QgKmRzdFYsCiAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNZLCBjb25zdCB1aW50MTZfdCAqc3JjVSwgY29uc3QgdWludDE2X3QgKnNyY1YsCiAgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCi0gICAgICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgewotCi0gICAgdWludDhfdCAqZHN0WSA9ICh1aW50OF90ICopZHN0OwotICAgIHNpemVfdCBkc3RZU2l6ZSA9IGRzdFlTdHJpZGUgKiBoZWlnaHQ7Ci0gICAgc2l6ZV90IGRzdFVWU2l6ZSA9IGRzdFVWU3RyaWRlICogaGVpZ2h0IC8gMjsKLSAgICB1aW50OF90ICpkc3RWID0gZHN0WSArIGRzdFlTaXplOwotICAgIHVpbnQ4X3QgKmRzdFUgPSBkc3RWICsgZHN0VVZTaXplOworICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLAorICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKIAogICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgaGVpZ2h0OyArK3kpIHsKICAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CkBAIC02OTYsNyArNjkwLDkgQEAKICAgICAgICAgICBibG9jay0+d2lkdGgoKSwgYmxvY2stPmhlaWdodCgpLCBtV2lkdGgsIG1IZWlnaHQsCiAgICAgICAgICAgKGludCkqKGludDY0X3QqKWltZy0+dXNlcl9wcml2KTsKIAotICAgIHVpbnQ4X3QqIGRzdCA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICAgIHVpbnQ4X3QqIGRzdFkgPSBjb25zdF9jYXN0PHVpbnQ4X3QqPih3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldKTsKKyAgICB1aW50OF90KiBkc3RVID0gY29uc3RfY2FzdDx1aW50OF90Kj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSk7CisgICAgdWludDhfdCogZHN0ViA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl0pOwogICAgIHNpemVfdCBzcmNZU3RyaWRlID0gaW1nLT5zdHJpZGVbQU9NX1BMQU5FX1ldOwogICAgIHNpemVfdCBzcmNVU3RyaWRlID0gaW1nLT5zdHJpZGVbQU9NX1BMQU5FX1VdOwogICAgIHNpemVfdCBzcmNWU3RyaWRlID0gaW1nLT5zdHJpZGVbQU9NX1BMQU5FX1ZdOwpAQCAtNzEwLDEzICs3MDYsMTQgQEAKICAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1YgPSAoY29uc3QgdWludDE2X3QgKilpbWctPnBsYW5lc1tBT01fUExBTkVfVl07CiAKICAgICAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMikgewotICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKCh1aW50MzJfdCAqKWRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCisgICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTAoKHVpbnQzMl90ICopZHN0WSwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RZU3RyaWRlIC8gc2l6ZW9mKHVpbnQzMl90KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcihkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLAorICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIoZHN0WSwgZHN0VSwgZHN0ViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1ksIHNyY1UsIHNyY1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNZU3RyaWRlIC8gMiwgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOwogICAgICAgICB9CkBAIC03MjUsNyArNzIyLDcgQEAKICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjVSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbQU9NX1BMQU5FX1VdOwogICAgICAgICBjb25zdCB1aW50OF90ICpzcmNWID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tBT01fUExBTkVfVl07CiAgICAgICAgIGNvcHlPdXRwdXRCdWZmZXJUb1l1dlBsYW5hckZyYW1lKAotICAgICAgICAgICAgICAgIGRzdCwgc3JjWSwgc3JjVSwgc3JjViwKKyAgICAgICAgICAgICAgICBkc3RZLCBkc3RVLCBkc3RWLCBzcmNZLCBzcmNVLCBzcmNWLAogICAgICAgICAgICAgICAgIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsIHNyY1ZTdHJpZGUsCiAgICAgICAgICAgICAgICAgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCiAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5jcHAKaW5kZXggZDdiOWUxMi4uM2FmZDY3MCAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5jcHAKQEAgLTM0LDcgKzM0LDExIEBACiBjb25zdGV4cHIgc2l6ZV90IGtNaW5JbnB1dEJ1ZmZlclNpemUgPSAyICogMTAyNCAqIDEwMjQ7CiBjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuYXZjLmRlY29kZXIiOwogY29uc3RleHByIHVpbnQzMl90IGtEZWZhdWx0T3V0cHV0RGVsYXkgPSA4OwotY29uc3RleHByIHVpbnQzMl90IGtNYXhPdXRwdXREZWxheSA9IDE2OworLyogYXZjIHNwZWNpZmljYXRpb24gYWxsb3dzIGZvciBhIG1heGltdW0gZGVsYXkgb2YgMTYgZnJhbWVzLgorICAgQXMgc29mdCBhdmMgZGVjb2RlciBzdXBwb3J0cyBpbnRlcmxhY2VkLCB0aGlzIGRlbGF5IHdvdWxkIGJlIDMyIGZpZWxkcy4KKyAgIEFuZCBhdmMgZGVjb2RlciBpbXBsZW1lbnRhdGlvbiBoYXMgYW4gYWRkaXRpb25hbCBkZWxheSBvZiAyIGRlY29kZSBjYWxscy4KKyAgIFNvIHRvdGFsIG1heGltdW0gb3V0cHV0IGRlbGF5IGlzIDM0ICovCitjb25zdGV4cHIgdWludDMyX3Qga01heE91dHB1dERlbGF5ID0gMzQ7CiBjb25zdGV4cHIgdWludDMyX3Qga01pbklucHV0Qnl0ZXMgPSA0OwogfSAgLy8gbmFtZXNwYWNlCiAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvY29kZWMyLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvY29kZWMyLmNwcAppbmRleCBkNjAyNWRlLi5hMTdiMDRlIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9jbWRzL2NvZGVjMi5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9jb2RlYzIuY3BwCkBAIC0xMzgsNyArMTM4LDcgQEAKIAogU2ltcGxlUGxheWVyOjpTaW1wbGVQbGF5ZXIoKQogICAgIDogbUxpc3RlbmVyKG5ldyBMaXN0ZW5lcih0aGlzKSksCi0gICAgICBtUHJvZHVjZXJMaXN0ZW5lcihuZXcgRHVtbXlQcm9kdWNlckxpc3RlbmVyKSwKKyAgICAgIG1Qcm9kdWNlckxpc3RlbmVyKG5ldyBTdHViUHJvZHVjZXJMaXN0ZW5lciksCiAgICAgICBtTGluZWFyUG9vbElkKEMyQmxvY2tQb29sOjpQTEFURk9STV9TVEFSVCksCiAgICAgICBtQ29tcG9zZXJDbGllbnQobmV3IFN1cmZhY2VDb21wb3NlckNsaWVudCkgewogICAgIENIRUNLX0VRKG1Db21wb3NlckNsaWVudC0+aW5pdENoZWNrKCksIChzdGF0dXNfdClPSyk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0FuZHJvaWQuYnAKaW5kZXggM2VkZTY4Yy4uMDEwMWIxYSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQW5kcm9pZC5icApAQCAtNyw2ICs3LDggQEAKIAogICAgIHNyY3M6IFsiQzJTb2Z0RzcxMURlYy5jcHAiXSwKIAorICAgIHN0YXRpY19saWJzOiBbImNvZGVjc19nNzExZGVjIl0sCisKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1EQUxBVyIsCiAgICAgXSwKQEAgLTIwLDQgKzIyLDYgQEAKICAgICBdLAogCiAgICAgc3JjczogWyJDMlNvZnRHNzExRGVjLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsiY29kZWNzX2c3MTFkZWMiXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuY3BwCmluZGV4IDRmZjA3OTMuLjdmOWMzNGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5jcHAKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmNwcApAQCAtMjIsNyArMjIsNyBAQAogCiAjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KICNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgotCisjaW5jbHVkZSA8ZzcxMURlYy5oPgogI2luY2x1ZGUgIkMyU29mdEc3MTFEZWMuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMjI0LDUzICsyMjQsNiBAQAogICAgIHJldHVybiBDMl9PSzsKIH0KIAotI2lmZGVmIEFMQVcKLXZvaWQgQzJTb2Z0RzcxMURlYzo6RGVjb2RlQUxhdygKLSAgICAgICAgaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSkgewotICAgIHdoaWxlIChpblNpemUgPiAwKSB7Ci0gICAgICAgIGluU2l6ZS0tOwotICAgICAgICBpbnQzMl90IHggPSAqaW4rKzsKLQotICAgICAgICBpbnQzMl90IGl4ID0geCBeIDB4NTU7Ci0gICAgICAgIGl4ICY9IDB4N2Y7Ci0KLSAgICAgICAgaW50MzJfdCBpZXhwID0gaXggPj4gNDsKLSAgICAgICAgaW50MzJfdCBtYW50ID0gaXggJiAweDBmOwotCi0gICAgICAgIGlmIChpZXhwID4gMCkgewotICAgICAgICAgICAgbWFudCArPSAxNjsKLSAgICAgICAgfQotCi0gICAgICAgIG1hbnQgPSAobWFudCA8PCA0KSArIDg7Ci0KLSAgICAgICAgaWYgKGlleHAgPiAxKSB7Ci0gICAgICAgICAgICBtYW50ID0gbWFudCA8PCAoaWV4cCAtIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgKm91dCsrID0gKHggPiAxMjcpID8gbWFudCA6IC1tYW50OwotICAgIH0KLX0KLSNlbHNlCi12b2lkIEMyU29mdEc3MTFEZWM6OkRlY29kZU1MYXcoCi0gICAgICAgIGludDE2X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpblNpemUpIHsKLSAgICB3aGlsZSAoaW5TaXplID4gMCkgewotICAgICAgICBpblNpemUtLTsKLSAgICAgICAgaW50MzJfdCB4ID0gKmluKys7Ci0KLSAgICAgICAgaW50MzJfdCBtYW50aXNzYSA9IH54OwotICAgICAgICBpbnQzMl90IGV4cG9uZW50ID0gKG1hbnRpc3NhID4+IDQpICYgNzsKLSAgICAgICAgaW50MzJfdCBzZWdtZW50ID0gZXhwb25lbnQgKyAxOwotICAgICAgICBtYW50aXNzYSAmPSAweDBmOwotCi0gICAgICAgIGludDMyX3Qgc3RlcCA9IDQgPDwgc2VnbWVudDsKLQotICAgICAgICBpbnQzMl90IGFicyA9ICgweDgwbCA8PCBleHBvbmVudCkgKyBzdGVwICogbWFudGlzc2EgKyBzdGVwIC8gMiAtIDQgKiAzMzsKLQotICAgICAgICAqb3V0KysgPSAoeCA8IDB4ODApID8gLWFicyA6IGFiczsKLSAgICB9Ci19Ci0jZW5kaWYKLQogY2xhc3MgQzJTb2Z0RzcxMURlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKIHB1YmxpYzoKICAgICBDMlNvZnRHNzExRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuaAppbmRleCAyM2U4ZmZjLi5mOTM4NDBiIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuaAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuaApAQCAtNDUsMTIgKzQ1LDYgQEAKICAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOwogICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKIAotI2lmZGVmIEFMQVcKLSAgICB2b2lkIERlY29kZUFMYXcoaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSk7Ci0jZWxzZQotICAgIHZvaWQgRGVjb2RlTUxhdyhpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKTsKLSNlbmRpZgotCiAgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0RzcxMURlYyk7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nYXYxL0MyU29mdEdhdjFEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ2F2MS9DMlNvZnRHYXYxRGVjLmNwcAppbmRleCAxMjBiYTdhLi5hMTkyOWU3IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nYXYxL0MyU29mdEdhdjFEZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQzJTb2Z0R2F2MURlYy5jcHAKQEAgLTQ1OCwzMiArNDU4LDI4IEBACiAgIH0KIH0KIAotc3RhdGljIHZvaWQgY29weU91dHB1dEJ1ZmZlclRvWXV2UGxhbmFyRnJhbWUodWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjVSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YsIHNpemVfdCBzcmNZU3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKLSAgdWludDhfdCAqY29uc3QgZHN0U3RhcnQgPSBkc3Q7CitzdGF0aWMgdm9pZCBjb3B5T3V0cHV0QnVmZmVyVG9ZVjEyRnJhbWUodWludDhfdCAqZHN0WSwgdWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNZLCBjb25zdCB1aW50OF90ICpzcmNVLCBjb25zdCB1aW50OF90ICpzcmNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7CiAKICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgewotICAgIG1lbWNweShkc3QsIHNyY1ksIHdpZHRoKTsKKyAgICBtZW1jcHkoZHN0WSwgc3JjWSwgd2lkdGgpOwogICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKLSAgICBkc3QgKz0gZHN0WVN0cmlkZTsKKyAgICBkc3RZICs9IGRzdFlTdHJpZGU7CiAgIH0KIAotICBkc3QgPSBkc3RTdGFydCArIGRzdFlTdHJpZGUgKiBoZWlnaHQ7CiAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7Ci0gICAgbWVtY3B5KGRzdCwgc3JjViwgd2lkdGggLyAyKTsKKyAgICBtZW1jcHkoZHN0Viwgc3JjViwgd2lkdGggLyAyKTsKICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7Ci0gICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgIGRzdFYgKz0gZHN0VVZTdHJpZGU7CiAgIH0KIAotICBkc3QgPSBkc3RTdGFydCArIChkc3RZU3RyaWRlICogaGVpZ2h0KSArIChkc3RVVlN0cmlkZSAqIGhlaWdodCAvIDIpOwogICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgewotICAgIG1lbWNweShkc3QsIHNyY1UsIHdpZHRoIC8gMik7CisgICAgbWVtY3B5KGRzdFUsIHNyY1UsIHdpZHRoIC8gMik7CiAgICAgc3JjVSArPSBzcmNVU3RyaWRlOwotICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICBkc3RVICs9IGRzdFVWU3RyaWRlOwogICB9CiB9CiAKQEAgLTU1NSwxNSArNTUxLDExIEBACiB9CiAKIHN0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKAotICAgIHVpbnQ4X3QgKmRzdCwgY29uc3QgdWludDE2X3QgKnNyY1ksIGNvbnN0IHVpbnQxNl90ICpzcmNVLAotICAgIGNvbnN0IHVpbnQxNl90ICpzcmNWLCBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsCi0gICAgc2l6ZV90IHNyY1ZTdHJpZGUsIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsCisgICAgdWludDhfdCAqZHN0WSwgdWludDhfdCAqZHN0VSwgdWludDhfdCAqZHN0ViwKKyAgICBjb25zdCB1aW50MTZfdCAqc3JjWSwgY29uc3QgdWludDE2X3QgKnNyY1UsIGNvbnN0IHVpbnQxNl90ICpzcmNWLAorICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCisgICAgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwKICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKLSAgdWludDhfdCAqZHN0WSA9ICh1aW50OF90ICopZHN0OwotICBzaXplX3QgZHN0WVNpemUgPSBkc3RZU3RyaWRlICogaGVpZ2h0OwotICBzaXplX3QgZHN0VVZTaXplID0gZHN0VVZTdHJpZGUgKiBoZWlnaHQgLyAyOwotICB1aW50OF90ICpkc3RWID0gZHN0WSArIGRzdFlTaXplOwotICB1aW50OF90ICpkc3RVID0gZHN0ViArIGRzdFVWU2l6ZTsKIAogICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CiAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCB3aWR0aDsgKyt4KSB7CkBAIC02NjcsMTAgKzY1OSwxMyBAQAogICBBTE9HVigicHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJWR4JWQpLCBvdXQgZnJhbWVpbmRleCAlZCIsIGJsb2NrLT53aWR0aCgpLAogICAgICAgICBibG9jay0+aGVpZ2h0KCksIG1XaWR0aCwgbUhlaWdodCwgKGludClidWZmZXItPnVzZXJfcHJpdmF0ZV9kYXRhKTsKIAotICB1aW50OF90ICpkc3QgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgIHVpbnQ4X3QgKmRzdFkgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgIHVpbnQ4X3QgKmRzdFUgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSk7CisgIHVpbnQ4X3QgKmRzdFYgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSk7CiAgIHNpemVfdCBzcmNZU3RyaWRlID0gYnVmZmVyLT5zdHJpZGVbMF07CiAgIHNpemVfdCBzcmNVU3RyaWRlID0gYnVmZmVyLT5zdHJpZGVbMV07CiAgIHNpemVfdCBzcmNWU3RyaWRlID0gYnVmZmVyLT5zdHJpZGVbMl07CisKICAgQzJQbGFuYXJMYXlvdXQgbGF5b3V0ID0gd1ZpZXcubGF5b3V0KCk7CiAgIHNpemVfdCBkc3RZU3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV0ucm93SW5jOwogICBzaXplX3QgZHN0VVZTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXS5yb3dJbmM7CkBAIC02ODIsMjAgKzY3NywyNCBAQAogCiAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMikgewogICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKAotICAgICAgICAgICh1aW50MzJfdCAqKWRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsIHNyY1VTdHJpZGUgLyAyLAorICAgICAgICAgICh1aW50MzJfdCAqKWRzdFksIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLCBzcmNVU3RyaWRlIC8gMiwKICAgICAgICAgICBzcmNWU3RyaWRlIC8gMiwgZHN0WVN0cmlkZSAvIHNpemVvZih1aW50MzJfdCksIG1XaWR0aCwgbUhlaWdodCk7CiAgICAgfSBlbHNlIHsKLSAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKGRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKGRzdFksIGRzdFUsIGRzdFYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNZLCBzcmNVLCBzcmNWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWVN0cmlkZSAvIDIsIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKICAgICB9CiAgIH0gZWxzZSB7CiAgICAgY29uc3QgdWludDhfdCAqc3JjWSA9IChjb25zdCB1aW50OF90ICopYnVmZmVyLT5wbGFuZVswXTsKICAgICBjb25zdCB1aW50OF90ICpzcmNVID0gKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPnBsYW5lWzFdOwogICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPSAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+cGxhbmVbMl07Ci0gICAgY29weU91dHB1dEJ1ZmZlclRvWXV2UGxhbmFyRnJhbWUoZHN0LCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1ZTdHJpZGUsIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CisgICAgY29weU91dHB1dEJ1ZmZlclRvWVYxMkZyYW1lKGRzdFksIGRzdFUsIGRzdFYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1ksIHNyY1UsIHNyY1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsIHNyY1ZTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOwogICB9CiAgIGZpbmlzaFdvcmsoYnVmZmVyLT51c2VyX3ByaXZhdGVfZGF0YSwgd29yaywgc3RkOjptb3ZlKGJsb2NrKSk7CiAgIGJsb2NrID0gbnVsbHB0cjsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuaAppbmRleCAyYjIwOWZlLi5lZGQyNzNiIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQzJTb2Z0R3NtRGVjLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0MyU29mdEdzbURlYy5oCkBAIC0xOSwxMCArMTksNyBAQAogCiAjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KIAotCi1leHRlcm4gIkMiIHsKLSAgICAjaW5jbHVkZSAiZ3NtLmgiCi19CisjaW5jbHVkZSAiZ3NtLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNERlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmNwcAppbmRleCA2MWIyODZjLi4xM2NjMGVjIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmNwcAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmNwcApAQCAtNDY0LDM0ICs0NjQsMzQgQEAKIC8qIFRPRE86IGNhbiByZW1vdmUgdGVtcG9yYXJ5IGNvcHkgYWZ0ZXIgbGlicmFyeSBzdXBwb3J0cyB3cml0aW5nIHRvIGRpc3BsYXkKICAqIGJ1ZmZlciBZLCBVIGFuZCBWIHBsYW5lIHBvaW50ZXJzIHVzaW5nIHN0cmlkZSBpbmZvLiAqLwogc3RhdGljIHZvaWQgY29weU91dHB1dEJ1ZmZlclRvWXV2UGxhbmFyRnJhbWUoCi0gICAgICAgIHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLAorICAgICAgICB1aW50OF90ICpkc3RZLCB1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLCB1aW50OF90ICpzcmMsCiAgICAgICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsCiAgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCB1aW50MzJfdCB3aWR0aCwKICAgICAgICAgdWludDMyX3QgaGVpZ2h0KSB7CiAgICAgc2l6ZV90IHNyY1VWU3RyaWRlID0gc3JjWVN0cmlkZSAvIDI7CiAgICAgdWludDhfdCAqc3JjU3RhcnQgPSBzcmM7Ci0gICAgdWludDhfdCAqZHN0U3RhcnQgPSBkc3Q7CisKICAgICBzaXplX3QgdlN0cmlkZSA9IGFsaWduKGhlaWdodCwgMTYpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0OyArK2kpIHsKLSAgICAgICAgIG1lbWNweShkc3QsIHNyYywgd2lkdGgpOworICAgICAgICAgbWVtY3B5KGRzdFksIHNyYywgd2lkdGgpOwogICAgICAgICAgc3JjICs9IHNyY1lTdHJpZGU7Ci0gICAgICAgICBkc3QgKz0gZHN0WVN0cmlkZTsKKyAgICAgICAgIGRzdFkgKz0gZHN0WVN0cmlkZTsKICAgICB9CisKICAgICAvKiBVIGJ1ZmZlciAqLwogICAgIHNyYyA9IHNyY1N0YXJ0ICsgdlN0cmlkZSAqIHNyY1lTdHJpZGU7Ci0gICAgZHN0ID0gZHN0U3RhcnQgKyAoZHN0WVN0cmlkZSAqIGhlaWdodCkgKyAoZHN0VVZTdHJpZGUgKiBoZWlnaHQgLyAyKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgewotICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCB3aWR0aCAvIDIpOworICAgICAgICAgbWVtY3B5KGRzdFUsIHNyYywgd2lkdGggLyAyKTsKICAgICAgICAgIHNyYyArPSBzcmNVVlN0cmlkZTsKLSAgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICAgICAgIGRzdFUgKz0gZHN0VVZTdHJpZGU7CiAgICAgfQorCiAgICAgLyogViBidWZmZXIgKi8KICAgICBzcmMgPSBzcmNTdGFydCArIHZTdHJpZGUgKiBzcmNZU3RyaWRlICogNSAvIDQ7Ci0gICAgZHN0ID0gZHN0U3RhcnQgKyAoZHN0WVN0cmlkZSAqIGhlaWdodCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKLSAgICAgICAgIG1lbWNweShkc3QsIHNyYywgd2lkdGggLyAyKTsKKyAgICAgICAgIG1lbWNweShkc3RWLCBzcmMsIHdpZHRoIC8gMik7CiAgICAgICAgICBzcmMgKz0gc3JjVVZTdHJpZGU7Ci0gICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgICAgICBkc3RWICs9IGRzdFVWU3RyaWRlOwogICAgIH0KIH0KIApAQCAtNjcyLDExICs2NzIsMTQgQEAKICAgICAgICAgfQogCiAgICAgICAgIHVpbnQ4X3QgKm91dHB1dEJ1ZmZlclkgPSB3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgICAgICB1aW50OF90ICpvdXRwdXRCdWZmZXJVID0gd1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICAgICAgdWludDhfdCAqb3V0cHV0QnVmZmVyViA9IHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisKICAgICAgICAgQzJQbGFuYXJMYXlvdXQgbGF5b3V0ID0gd1ZpZXcubGF5b3V0KCk7CiAgICAgICAgIHNpemVfdCBkc3RZU3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV0ucm93SW5jOwogICAgICAgICBzaXplX3QgZHN0VVZTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXS5yb3dJbmM7CiAgICAgICAgICh2b2lkKWNvcHlPdXRwdXRCdWZmZXJUb1l1dlBsYW5hckZyYW1lKAotICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlclksCisgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyWSwgb3V0cHV0QnVmZmVyVSwgb3V0cHV0QnVmZmVyViwKICAgICAgICAgICAgICAgICBtT3V0cHV0QnVmZmVyW21OdW1TYW1wbGVzT3V0cHV0ICYgMV0sCiAgICAgICAgICAgICAgICAgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCiAgICAgICAgICAgICAgICAgYWxpZ24obVdpZHRoLCAxNiksIG1XaWR0aCwgbUhlaWdodCk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuY3BwCmluZGV4IDNlZWYxZTMuLjkxMjM4ZTggMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuY3BwCkBAIC02MzEsMzEgKzYzMSwzMCBAQAogfQogCiBzdGF0aWMgdm9pZCBjb3B5T3V0cHV0QnVmZmVyVG9ZdXZQbGFuYXJGcmFtZSgKLSAgICAgICAgdWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNZLCBjb25zdCB1aW50OF90ICpzcmNVLCBjb25zdCB1aW50OF90ICpzcmNWLAorICAgICAgICB1aW50OF90ICpkc3RZLCB1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLAorICAgICAgICBjb25zdCB1aW50OF90ICpzcmNZLCBjb25zdCB1aW50OF90ICpzcmNVLCBjb25zdCB1aW50OF90ICpzcmNWLAogICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAogICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLAogICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7Ci0gICAgdWludDhfdCAqZHN0U3RhcnQgPSBkc3Q7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7Ci0gICAgICAgICBtZW1jcHkoZHN0LCBzcmNZLCB3aWR0aCk7CisgICAgICAgICBtZW1jcHkoZHN0WSwgc3JjWSwgd2lkdGgpOwogICAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlOwotICAgICAgICAgZHN0ICs9IGRzdFlTdHJpZGU7CisgICAgICAgICBkc3RZICs9IGRzdFlTdHJpZGU7CiAgICAgfQogCi0gICAgZHN0ID0gZHN0U3RhcnQgKyBkc3RZU3RyaWRlICogaGVpZ2h0OwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7Ci0gICAgICAgICBtZW1jcHkoZHN0LCBzcmNWLCB3aWR0aCAvIDIpOworICAgICAgICAgbWVtY3B5KGRzdFYsIHNyY1YsIHdpZHRoIC8gMik7CiAgICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7Ci0gICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgICAgICBkc3RWICs9IGRzdFVWU3RyaWRlOwogICAgIH0KIAotICAgIGRzdCA9IGRzdFN0YXJ0ICsgKGRzdFlTdHJpZGUgKiBoZWlnaHQpICsgKGRzdFVWU3RyaWRlICogaGVpZ2h0IC8gMik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKLSAgICAgICAgIG1lbWNweShkc3QsIHNyY1UsIHdpZHRoIC8gMik7CisgICAgICAgICBtZW1jcHkoZHN0VSwgc3JjVSwgd2lkdGggLyAyKTsKICAgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKLSAgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICAgICAgIGRzdFUgKz0gZHN0VVZTdHJpZGU7CiAgICAgfQorCiB9CiAKIHN0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMCh1aW50MzJfdCAqZHN0LApAQCAtNzIxLDE2ICs3MjAsMTIgQEAKICAgICByZXR1cm47CiB9CiAKLXN0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKHVpbnQ4X3QgKmRzdCwKK3N0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKAorICAgICAgICB1aW50OF90ICpkc3RZLCB1aW50OF90ICpkc3RVLCB1aW50OF90ICpkc3RWLAogICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjWSwgY29uc3QgdWludDE2X3QgKnNyY1UsIGNvbnN0IHVpbnQxNl90ICpzcmNWLAogICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAotICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKLQotICAgIHVpbnQ4X3QgKmRzdFkgPSAodWludDhfdCAqKWRzdDsKLSAgICBzaXplX3QgZHN0WVNpemUgPSBkc3RZU3RyaWRlICogaGVpZ2h0OwotICAgIHNpemVfdCBkc3RVVlNpemUgPSBkc3RVVlN0cmlkZSAqIGhlaWdodCAvIDI7Ci0gICAgdWludDhfdCAqZHN0ViA9IGRzdFkgKyBkc3RZU2l6ZTsKLSAgICB1aW50OF90ICpkc3RVID0gZHN0ViArIGRzdFVWU2l6ZTsKKyAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwKKyAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSB7CiAKICAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CiAgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgd2lkdGg7ICsreCkgewpAQCAtODIzLDcgKzgxOCwxMCBAQAogICAgICAgICAgICBibG9jay0+d2lkdGgoKSwgYmxvY2stPmhlaWdodCgpLCBtV2lkdGgsIG1IZWlnaHQsCiAgICAgICAgICAgICgoYzJfY250cjY0X3QgKilpbWctPnVzZXJfcHJpdiktPnBlZWtsbCgpKTsKIAotICAgIHVpbnQ4X3QgKmRzdCA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPih3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldKTsKKyAgICB1aW50OF90ICpkc3RZID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICAgIHVpbnQ4X3QgKmRzdFUgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSk7CisgICAgdWludDhfdCAqZHN0ViA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPih3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdKTsKKwogICAgIHNpemVfdCBzcmNZU3RyaWRlID0gaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ldOwogICAgIHNpemVfdCBzcmNVU3RyaWRlID0gaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1VdOwogICAgIHNpemVfdCBzcmNWU3RyaWRlID0gaW1nLT5zdHJpZGVbVlBYX1BMQU5FX1ZdOwpAQCAtODQyLDE4ICs4NDAsMTggQEAKICAgICAgICAgICAgIGNvbnN0ZXhwciBzaXplX3Qga0hlaWdodCA9IDY0OwogICAgICAgICAgICAgZm9yICg7IGkgPCBtSGVpZ2h0OyBpICs9IGtIZWlnaHQpIHsKICAgICAgICAgICAgICAgICBxdWV1ZS0+ZW50cmllcy5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAgICAgICAgICBbZHN0LCBzcmNZLCBzcmNVLCBzcmNWLAorICAgICAgICAgICAgICAgICAgICAgICAgW2RzdFksIHNyY1ksIHNyY1UsIHNyY1YsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwgc3JjVlN0cmlkZSwgZHN0WVN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IG1XaWR0aCwgaGVpZ2h0ID0gc3RkOjptaW4obUhlaWdodCAtIGksIGtIZWlnaHQpXSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90ICopZHN0LCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCAqKWRzdFksIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLCBkc3RZU3RyaWRlIC8gc2l6ZW9mKHVpbnQzMl90KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlIC8gMiAqIGtIZWlnaHQ7CiAgICAgICAgICAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlIC8gMiAqIChrSGVpZ2h0IC8gMik7CiAgICAgICAgICAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlIC8gMiAqIChrSGVpZ2h0IC8gMik7Ci0gICAgICAgICAgICAgICAgZHN0ICs9IGRzdFlTdHJpZGUgKiBrSGVpZ2h0OworICAgICAgICAgICAgICAgIGRzdFkgKz0gZHN0WVN0cmlkZSAqIGtIZWlnaHQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBDSEVDS19FUSgwdSwgcXVldWUtPm51bVBlbmRpbmcpOwogICAgICAgICAgICAgcXVldWUtPm51bVBlbmRpbmcgPSBxdWV1ZS0+ZW50cmllcy5zaXplKCk7CkBAIC04NjIsOCArODYwLDkgQEAKICAgICAgICAgICAgICAgICBxdWV1ZS53YWl0Rm9yQ29uZGl0aW9uKHF1ZXVlLT5jb25kKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKGRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCisgICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcihkc3RZLCBkc3RVLCBkc3RWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWSwgc3JjVSwgc3JjViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1lTdHJpZGUgLyAyLCBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CiAgICAgICAgIH0KQEAgLTg3MSw4ICs4NzAsMTAgQEAKICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjWSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1ldOwogICAgICAgICBjb25zdCB1aW50OF90ICpzcmNVID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tWUFhfUExBTkVfVV07CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW1ZQWF9QTEFORV9WXTsKKwogICAgICAgICBjb3B5T3V0cHV0QnVmZmVyVG9ZdXZQbGFuYXJGcmFtZSgKLSAgICAgICAgICAgICAgICBkc3QsIHNyY1ksIHNyY1UsIHNyY1YsCisgICAgICAgICAgICAgICAgZHN0WSwgZHN0VSwgZHN0ViwKKyAgICAgICAgICAgICAgICBzcmNZLCBzcmNVLCBzcmNWLAogICAgICAgICAgICAgICAgIHNyY1lTdHJpZGUsIHNyY1VTdHJpZGUsIHNyY1ZTdHJpZGUsCiAgICAgICAgICAgICAgICAgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCiAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29yZS9BbmRyb2lkLmJwCmluZGV4IGNlMWM5YWMuLjMzZmFmYTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb3JlL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvQW5kcm9pZC5icApAQCAtMjEsNiArMjEsMTAgQEAKICAgICAgICAgIi1XZXJyb3IiLAogICAgIF0sCiAKKyAgICBoZWFkZXJfYWJpX2NoZWNrZXI6IHsKKyAgICAgICAgY2hlY2tfYWxsX2FwaXM6IHRydWUsCisgICAgfSwKKwogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJjb2RlYzJfaGVhZGVycyIsCiAgICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJFbnVtLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyRW51bS5oCmluZGV4IGIwZmFkOGYuLmRhMWY0M2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJFbnVtLmgKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkVudW0uaApAQCAtNTQsNyArNTQsNyBAQAogLy8vIFxub3RlIHRoaXMgd2lsbCBjb250YWluIGFueSBpbml0aWFsaXphdGlvbiwgd2hpY2ggd2Ugd2lsbCByZW1vdmUgd2hlbiBjb252ZXJ0aW5nIHRvIGxvd2VyLWNhc2UKICNkZWZpbmUgX0MyX0dFVF9FTlVNX05BTUUoeCwgeSkgI3gKIC8vLyBtYXBwZXIgdG8gZ2V0IHZhbHVlIG9mIGVudW0KLSNkZWZpbmUgX0MyX0dFVF9FTlVNX1ZBTFVFKHgsIHR5cGUpIChfQzJFbnVtQ29uc3Q8dHlwZT4peAorI2RlZmluZSBfQzJfR0VUX0VOVU1fVkFMVUUoeCwgdHlwZV8pIChfQzJFbnVtQ29uc3Q8dHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8dHlwZV8+Ojp0eXBlPil0eXBlXzo6eAogCiAvLy8gXGVuZGNvbmQKIApAQCAtMTA2LDcgKzEwNiw3IEBACiB0ZW1wbGF0ZTw+IFwKIEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkVmFsdWVzRm9yKGNvbnN0IG5hbWUgJnIgX191bnVzZWQpIHsgXAogICAgIHJldHVybiBfQzJFbnVtVXRpbHM6OnNhbml0aXplRW51bVZhbHVlcyggXAotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiB7IF9DMl9NQVAoX0MyX0dFVF9FTlVNX1ZBTFVFLCB0eXBlLCBfX1ZBX0FSR1NfXykgfSwgXAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiB7IF9DMl9NQVAoX0MyX0dFVF9FTlVNX1ZBTFVFLCBuYW1lLCBfX1ZBX0FSR1NfXykgfSwgXAogICAgICAgICAgICAgeyBfQzJfTUFQKF9DMl9HRVRfRU5VTV9OQU1FLCB0eXBlLCBfX1ZBX0FSR1NfXykgfSwgXAogICAgICAgICAgICAgcHJlZml4KTsgXAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMlBhcmFtLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyUGFyYW0uaAppbmRleCA1MWQ0MTdhLi40MzYyNjlhIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyUGFyYW0uaAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyUGFyYW0uaApAQCAtNTA4LDYgKzUwOCwxNCBAQAogICAgICAgICByZXR1cm4gX21JbmRleC5zZXRQb3J0KG91dHB1dCk7CiAgICAgfQogCisgICAgLy8vIHNldHMgdGhlIHNpemUgb2YgdGhpcyBwYXJhbWV0ZXIuCisgICAgaW5saW5lIHZvaWQgc2V0U2l6ZShzaXplX3Qgc2l6ZSkgeworICAgICAgICBpZiAoc2l6ZSA8IHNpemVvZihDMlBhcmFtKSkgeworICAgICAgICAgICAgc2l6ZSA9IDA7CisgICAgICAgIH0KKyAgICAgICAgX21TaXplID0gYzJfbWluKHNpemUsIF9tU2l6ZSk7CisgICAgfQorCiBwdWJsaWM6CiAgICAgLy8vIGludmFsaWRhdGUgdGhpcyBwYXJhbWV0ZXIuIFRoZXJlIGlzIG5vIHJlY292ZXJ5IGZyb20gdGhpcyBjYWxsOyBlLmcuIHBhcmFtZXRlcgogICAgIC8vLyBjYW5ub3QgYmUgJ2NvcnJlY3RlZCcgdG8gYmUgdmFsaWQuCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyUGFyYW1EZWYuaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJQYXJhbURlZi5oCmluZGV4IDBhMzMyODMuLmQ1Nzg4MjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJQYXJhbURlZi5oCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJQYXJhbURlZi5oCkBAIC05Nyw2ICs5Nyw5IEBACiAgICAgICAgIFBBUkFNX1RZUEUgPSBDb3JlSW5kZXggfCBUeXBlRmxhZ3MKICAgICB9OwogCisgICAgLy8gdGhlIHVuZGVybHlpbmcgcGFyYW0gc3RydWN0IHR5cGUKKyAgICB0eXBlZGVmIFMgU3RydWN0OworCiBwcm90ZWN0ZWQ6CiAgICAgZW51bSA6IHVpbnQzMl90IHsKICAgICAgICAgRkxFWF9TSVpFID0gMCwKQEAgLTI3MCw2ICsyNzMsMTEgQEAKICAgICAgICAgfSBcCiAgICAgICAgIHJldHVybiAwOyBcCiAgICAgfSBcCisgICAgaW5saW5lIHZvaWQgc2V0RmxleENvdW50KHNpemVfdCBjb3VudCkgeyBcCisgICAgICAgIGlmIChjb3VudCA8IGZsZXhDb3VudCgpKSB7IFwKKyAgICAgICAgICAgIHRoaXMtPnNldFNpemUoc2l6ZW9mKF9UeXBlKSArIF9UeXBlOjpGTEVYX1NJWkUgKiBjb3VudCk7IFwKKyAgICAgICAgfSBcCisgICAgfSBcCiAKIC8vLyBNYXJrIGZsZXhpYmxlIG1lbWJlciB2YXJpYWJsZSBhbmQgbWFrZSBzdHJ1Y3R1cmUgZmxleGlibGUuCiAjZGVmaW5lIEZMRVgoY2xzLCBtKSBcCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5icAppbmRleCBhMTZiMTA2Li4zNzgwYTVhIDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQuYnAKQEAgLTUyLDYgKzUyLDkgQEAKICAgICAvLyBkaXJlY3RseSBpbiB0aGUgbWFpbiBkZXZpY2UgbWFuaWZlc3QueG1sIGZpbGUgb3IgdmlhIHZpbnRmX2ZyYWdtZW50cy4KICAgICAvLyAoUmVtb3ZlIHRoZSBsaW5lIGJlbG93IGlmIHRoZSBlbnRyeSBpcyBhbHJlYWR5IGluIHRoZSBtYWluIG1hbmlmZXN0LikKICAgICB2aW50Zl9mcmFnbWVudHM6IFsibWFuaWZlc3RfbWVkaWFfYzJfVjFfMV9kZWZhdWx0LnhtbCJdLAorCisgICAgLy8gUmVtb3ZlIHRoaXMgbGluZSB0byBlbmFibGUgdGhpcyBtb2R1bGUuCisgICAgZW5hYmxlZDogZmFsc2UsCiB9CiAKIC8vIHNlY2NvbXAgcG9saWN5IGZpbGUuCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWMuY3BwCmluZGV4IDU0MTA3YmQuLjE0MDViOTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWMuY3BwCkBAIC0xODEzLDE1ICsxODEzLDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIGFsbCBpbmZvIGludG8gb3V0cHV0LXN0cmVhbSAjMCBkb21haW4KICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZXMuZW1wbGFjZV9iYWNrKEMyUGFyYW06OkNvcHlBc1N0cmVhbSgqaW5mbywgdHJ1ZSAvKiBvdXRwdXQgKi8sIHN0cmVhbSkpOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayAmYmxvY2sgOiBidWYtPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkpIHsKKworICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiBibG9ja3MgPSBidWYtPmRhdGEoKS5ncmFwaGljQmxvY2tzKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIGZvciBub3cgb25seSBkbyB0aGUgZmlyc3QgYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFibG9ja3MuZW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQUxPR1YoImdvdCBvdXRwdXQgYnVmZmVyIHdpdGggY3JvcCAldSwldSsldSwldSBhbmQgc2l6ZSAldSwldSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIGJsb2NrLmNyb3AoKS5sZWZ0LCBibG9jay5jcm9wKCkudG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBibG9jay5jcm9wKCkud2lkdGgsIGJsb2NrLmNyb3AoKS5oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIGJsb2NrLndpZHRoKCksIGJsb2NrLmhlaWdodCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2sgJmJsb2NrID0gYmxvY2tzWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlcy5lbXBsYWNlX2JhY2sobmV3IEMyU3RyZWFtQ3JvcFJlY3RJbmZvOjpvdXRwdXQoc3RyZWFtLCBibG9jay5jcm9wKCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZXMuZW1wbGFjZV9iYWNrKG5ldyBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIGJsb2NrLmNyb3AoKS53aWR0aCwgYmxvY2suY3JvcCgpLmhlaWdodCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIGZvciBub3cgb25seSBkbyB0aGUgZmlyc3QgYmxvY2sKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICArK3N0cmVhbTsKICAgICAgICAgICAgICAgICB9CkBAIC0xODMzLDcgKzE4MzYsNyBAQAogICAgICAgICAgICAgICAgIC8vIGNvcHkgc3RhbmRhcmQgaW5mb3MgdG8gZ3JhcGhpYyBidWZmZXJzIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQgKG90aGVyd2lzZSwgd2UKICAgICAgICAgICAgICAgICAvLyBtYXkgb3ZlcndyaXRlIHRoZSBhY3R1YWwgaW50ZXJtZWRpYXRlIHZhbHVlIHdpdGggYSBmaW5hbCB2YWx1ZSkKICAgICAgICAgICAgICAgICBzdHJlYW0gPSAwOwotICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gc3RkR2Z4SW5mb3MgPSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RhdGljIEMyUGFyYW06OkluZGV4IHN0ZEdmeEluZm9zW10gPSB7CiAgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtUm90YXRpb25JbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCiAgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAogICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbURhdGFTcGFjZUluZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmNwcAppbmRleCAwNjI2YzhkLi5iYTE5NTY1IDEwMDY0NAotLS0gYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuY3BwCkBAIC02MTgsNyArNjE4LDcgQEAKIH0KIAogdm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZUludGVybmFsKCkgewotICAgIGlmIChtSW5wdXRNZXRFb3MgfHwgbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPnBpcGVsaW5lRnVsbCgpKSB7CisgICAgaWYgKG1JbnB1dE1ldEVvcykgewogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIHsKQEAgLTYzMSw2ICs2MzEsOSBAQAogICAgIH0KICAgICBzaXplX3QgbnVtSW5wdXRTbG90cyA9IG1JbnB1dC5sb2NrKCktPm51bVNsb3RzOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtSW5wdXRTbG90czsgKytpKSB7CisgICAgICAgIGlmIChtUGlwZWxpbmVXYXRjaGVyLmxvY2soKS0+cGlwZWxpbmVGdWxsKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBpbkJ1ZmZlcjsKICAgICAgICAgc2l6ZV90IGluZGV4OwogICAgICAgICB7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVycy5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVycy5jcHAKaW5kZXggYzQ5YTE2Yy4uM2M5OWJmNiAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlcnMuY3BwCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJzLmNwcApAQCAtOTEsNyArOTEsOSBAQAogICAgICAgICAgICAgbmV3Rm9ybWF0LT5zZXRJbnQzMihLRVlfU1RSSURFLCBzdHJpZGUpOwogICAgICAgICAgICAgQUxPR0QoIlslc10gdXBkYXRpbmcgc3RyaWRlID0gJWQiLCBtTmFtZSwgc3RyaWRlKTsKICAgICAgICAgICAgIGlmIChpbWctPm1OdW1QbGFuZXMgPiAxICYmIHN0cmlkZSA+IDApIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IHZzdHJpZGUgPSAoaW1nLT5tUGxhbmVbMV0ubU9mZnNldCAtIGltZy0+bVBsYW5lWzBdLm1PZmZzZXQpIC8gc3RyaWRlOworICAgICAgICAgICAgICAgIGludDY0X3Qgb2Zmc2V0RGVsdGEgPQorICAgICAgICAgICAgICAgICAgICAoaW50NjRfdClpbWctPm1QbGFuZVsxXS5tT2Zmc2V0IC0gKGludDY0X3QpaW1nLT5tUGxhbmVbMF0ubU9mZnNldDsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHZzdHJpZGUgPSBpbnQzMl90KG9mZnNldERlbHRhIC8gc3RyaWRlKTsKICAgICAgICAgICAgICAgICBuZXdGb3JtYXQtPnNldEludDMyKEtFWV9TTElDRV9IRUlHSFQsIHZzdHJpZGUpOwogICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIHVwZGF0aW5nIHZzdHJpZGUgPSAlZCIsIG1OYW1lLCB2c3RyaWRlKTsKICAgICAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi90ZXN0cy9DMlBhcmFtX3Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0MyUGFyYW1fdGVzdC5jcHAKaW5kZXggNTY0ZDRkMi4uYzM5NjA1YSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3Rlc3RzL0MyUGFyYW1fdGVzdC5jcHAKKysrIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0MyUGFyYW1fdGVzdC5jcHAKQEAgLTIzMjgsNiArMjMyOCwxNyBAQAogICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShibG9iVmFsdWUtPm0udmFsdWUpLCB1aW50OF90W10+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50OF90W10iKTsKICAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChibG9iVmFsdWUtPm0udmFsdWUsICJBQkNEXDAiLCA2KSk7CiAgICAgICAgIEVYUEVDVF9FUSg2dSwgYmxvYlZhbHVlLT5mbGV4Q291bnQoKSk7CisgICAgICAgIGJsb2JWYWx1ZS0+c2V0RmxleENvdW50KDd1KTsgLy8gaW5jcmVhc2luZyB0aGUgY291bnQgZG9lcyBub3QgY2hhbmdlIGl0CisgICAgICAgIEVYUEVDVF9FUSg2dSwgYmxvYlZhbHVlLT5mbGV4Q291bnQoKSk7CisgICAgICAgIGJsb2JWYWx1ZS0+c2V0RmxleENvdW50KDJ1KTsgLy8gZGVjcmVhc2luZyB0aGUgY291bnQgY2hhbmdlcyBpdCB0byBpdAorICAgICAgICBFWFBFQ1RfRVEoMnUsIGJsb2JWYWx1ZS0+ZmxleENvdW50KCkpOworICAgICAgICBibG9iVmFsdWUtPnNldEZsZXhDb3VudCgwdSk7IC8vIGNhbiBkZWNyZWFzZSB0byAwIGFuZCBibG9iIHJlbWFpbnMgdmFsaWQKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBibG9iVmFsdWUtPmZsZXhDb3VudCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmJsb2JWYWx1ZSk7CisgICAgICAgIGJsb2JWYWx1ZS0+aW52YWxpZGF0ZSgpOyAvLyBmbGV4IHBhcmFtcyBjYW4gYmUgaW52YWxpZGF0ZWQgPT4gcmVzdWx0cyBpbiAwIHNpemUKKyAgICAgICAgRVhQRUNUX0ZBTFNFKCpibG9iVmFsdWUpOworICAgICAgICBFWFBFQ1RfRVEoMHUsIGJsb2JWYWx1ZS0+c2l6ZSgpKTsKKwogICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gYmxvYlZhbHVlLT5GaWVsZExpc3QoKTsKICAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuc2l6ZSgpKTsKICAgICAgICAgRVhQRUNUX0VRKEZEOjpCTE9CLCBmaWVsZHMuY2JlZ2luKCktPnR5cGUoKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdGVzdHMvQzJVdGlsVGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJVdGlsVGVzdC5jcHAKaW5kZXggNTljZDMxMy4uMmQ2NmRmMSAxMDA2NDQKLS0tIGEvbWVkaWEvY29kZWMyL3Rlc3RzL0MyVXRpbFRlc3QuY3BwCisrKyBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMlV0aWxUZXN0LmNwcApAQCAtNzgsNyArNzgsNyBAQAogICAgICAgeyAidmFsdWUyIiwgRW51bTNWYWx1ZTIgfSwKICAgICAgIHsgInZhbHVlNCIsIEVudW0zVmFsdWU0IH0sCiAgICAgICB7ICJpbnZhbGlkIiwgSW52YWxpZCB9IH0pOwotICAgIEVudW0zIGUzOworICAgIEVudW0zIGUzKEludmFsaWQpOwogICAgIEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0ZvcihlMyk7CiAKICAgICAvLyB1cHBlciBjYXNlCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvZzcxMS9kZWNvZGVyL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlY3MvZzcxMS9kZWNvZGVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZmZjYwYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9nNzExL2RlY29kZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJjb2RlY3NfZzcxMWRlYyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgImc3MTFEZWNBbGF3LmNwcCIsCisgICAgICAgICJnNzExRGVjTWxhdy5jcHAiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKKworICAgIGNmbGFnczogWyItV2Vycm9yIl0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCisgICAgYXBleF9hdmFpbGFibGU6IFsiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyJdLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKworICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvZzcxMS9kZWNvZGVyL2c3MTFEZWMuaCBiL21lZGlhL2NvZGVjcy9nNzExL2RlY29kZXIvZzcxMURlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMzU3YTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvZzcxMS9kZWNvZGVyL2c3MTFEZWMuaApAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBHNzExX0RFQ19IXworI2RlZmluZSBHNzExX0RFQ19IXworCisvKioKKyAqIEBmaWxlIGc3MTFEZWMuaAorICogQGJyaWVmIGc3MTEgRGVjb2RlciBBUEk6IERlY29kZUFMYXcgYW5kIERlY29kZU1MYXcKKyAqLworCisvKiogRGVjb2RlcyBpbnB1dCBieXRlcyBvZiBzaXplIGluU2l6ZSBhY2NvcmRpbmcgdG8gQUxBVworICoKKyAqIEBwYXJhbSBbaW5dIG91dCA8dHQ+aW50MTZfdCo8L3R0Pjogb3V0cHV0IGJ1ZmZlciB0byBiZSBmaWxsZWQgd2l0aCBkZWNvZGVkIGJ5dGVzLgorICogQHBhcmFtIFtpbl0gaW4gPHR0PmNvbnN0IHVpbnQ4X3QqPC90dD46IGlucHV0IGJ1ZmZlciBjb250YWluaW5nIGJ5dGVzIHRvIGJlIGRlY29kZWQuCisgKiBAcGFyYW0gW2luXSBpblNpemUgPHR0PnNpemVfdDwvdHQ+OiBzaXplIG9mIHRoZSBpbnB1dCBidWZmZXIuCisgKi8KK3ZvaWQgRGVjb2RlQUxhdyhpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKTsKKworLyoqIERlY29kZXMgaW5wdXQgYnl0ZXMgb2Ygc2l6ZSBpblNpemUgYWNjb3JkaW5nIHRvIE1MQVcKKyAqCisgKiBAcGFyYW0gW2luXSBvdXQgPHR0PmludDE2X3QqPC90dD46IG91dHB1dCBidWZmZXIgdG8gYmUgZmlsbGVkIHdpdGggZGVjb2RlZCBieXRlcy4KKyAqIEBwYXJhbSBbaW5dIGluIDx0dD5jb25zdCB1aW50OF90KjwvdHQ+OiBpbnB1dCBidWZmZXIgY29udGFpbmluZyBieXRlcyB0byBiZSBkZWNvZGVkLgorICogQHBhcmFtIFtpbl0gaW5TaXplIDx0dD5zaXplX3Q8L3R0Pjogc2l6ZSBvZiB0aGUgaW5wdXQgYnVmZmVyLgorICovCit2b2lkIERlY29kZU1MYXcoaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSk7CisKKyNlbmRpZiAgLy8gRzcxMV9ERUNPREVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvZzcxMS9kZWNvZGVyL2c3MTFEZWNBbGF3LmNwcCBiL21lZGlhL2NvZGVjcy9nNzExL2RlY29kZXIvZzcxMURlY0FsYXcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0MWE3YjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvZzcxMS9kZWNvZGVyL2c3MTFEZWNBbGF3LmNwcApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCit2b2lkIERlY29kZUFMYXcoaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSkgeworICBpZiAob3V0ICE9IG51bGxwdHIgJiYgaW4gIT0gbnVsbHB0cikgeworICAgIHdoaWxlIChpblNpemUgPiAwKSB7CisgICAgICBpblNpemUtLTsKKyAgICAgIGludDMyX3QgeCA9ICppbisrOworCisgICAgICBpbnQzMl90IGl4ID0geCBeIDB4NTU7CisgICAgICBpeCAmPSAweDdmOworCisgICAgICBpbnQzMl90IGlleHAgPSBpeCA+PiA0OworICAgICAgaW50MzJfdCBtYW50ID0gaXggJiAweDBmOworCisgICAgICBpZiAoaWV4cCA+IDApIHsKKyAgICAgICAgbWFudCArPSAxNjsKKyAgICAgIH0KKworICAgICAgbWFudCA9IChtYW50IDw8IDQpICsgODsKKworICAgICAgaWYgKGlleHAgPiAxKSB7CisgICAgICAgIG1hbnQgPSBtYW50IDw8IChpZXhwIC0gMSk7CisgICAgICB9CisKKyAgICAgICpvdXQrKyA9ICh4ID4gMTI3KSA/IG1hbnQgOiAtbWFudDsKKyAgICB9CisgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9nNzExL2RlY29kZXIvZzcxMURlY01sYXcuY3BwIGIvbWVkaWEvY29kZWNzL2c3MTEvZGVjb2Rlci9nNzExRGVjTWxhdy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIyY2FlYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjcy9nNzExL2RlY29kZXIvZzcxMURlY01sYXcuY3BwCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3ZvaWQgRGVjb2RlTUxhdyhpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKSB7CisgIGlmIChvdXQgIT0gbnVsbHB0ciAmJiBpbiAhPSBudWxscHRyKSB7CisgICAgd2hpbGUgKGluU2l6ZSA+IDApIHsKKyAgICAgIGluU2l6ZS0tOworICAgICAgaW50MzJfdCB4ID0gKmluKys7CisKKyAgICAgIGludDMyX3QgbWFudGlzc2EgPSB+eDsKKyAgICAgIGludDMyX3QgZXhwb25lbnQgPSAobWFudGlzc2EgPj4gNCkgJiA3OworICAgICAgaW50MzJfdCBzZWdtZW50ID0gZXhwb25lbnQgKyAxOworICAgICAgbWFudGlzc2EgJj0gMHgwZjsKKworICAgICAgaW50MzJfdCBzdGVwID0gNCA8PCBzZWdtZW50OworCisgICAgICBpbnQzMl90IGFicyA9ICgweDgwbCA8PCBleHBvbmVudCkgKyBzdGVwICogbWFudGlzc2EgKyBzdGVwIC8gMiAtIDQgKiAzMzsKKworICAgICAgKm91dCsrID0gKHggPCAweDgwKSA/IC1hYnMgOiBhYnM7CisgICAgfQorICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvZzcxMS9mdXp6ZXIvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjcy9nNzExL2Z1enplci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNWVmYTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvZzcxMS9mdXp6ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDU2IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworY2NfZnV6eiB7CisgICAgbmFtZTogImc3MTFhbGF3X2RlY19mdXp6ZXIiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHNyY3M6IFsKKyAgICAgICAgImc3MTFfZGVjX2Z1enplci5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImNvZGVjc19nNzExZGVjIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLURBTEFXIiwKKyAgICBdLAorICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogImc3MTFtbGF3X2RlY19mdXp6ZXIiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHNyY3M6IFsKKyAgICAgICAgImc3MTFfZGVjX2Z1enplci5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImNvZGVjc19nNzExZGVjIiwKKyAgICBdLAorICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjcy9nNzExL2Z1enplci9SRUFETUUubWQgYi9tZWRpYS9jb2RlY3MvZzcxMS9mdXp6ZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMWMzNmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvZzcxMS9mdXp6ZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNDkgQEAKKyMgRnV6emVyIGZvciBsaWJzdGFnZWZyaWdodF9nNzExZGVjIGRlY29kZXIKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIEc3MTEgaXMgZGVzaWduZWQgYmFzZWQgb24gdGhlIHVuZGVyc3RhbmRpbmcgb2YgdGhlCitjb2RlYyBhbmQgdHJpZXMgdG8gYWNoaWV2ZSB0aGUgZm9sbG93aW5nOgorCisjIyMjIyBNYXhpbWl6ZSBjb2RlIGNvdmVyYWdlCitHNzExIHN1cHBvcnRzIHR3byB0eXBlcyBvZiBkZWNvZGluZzoKKzEuIERlY29kZUFMYXcKKzIuIERlY29kZU1MYXcKKworVGhlc2UgdHdvIGRlY29kZXIgQVBJJ3MgYXJlIGZ1enplZCBzZXBhcmF0ZWx5IHVzaW5nIGc3MTFhbGF3X2RlY19mdXp6ZXIgYW5kCitnNzExbWxhd19kZWNfZnV6emVyIHJlc3BlY3RpdmVseS4KKworIyMjIyMgTWF4aW1pemUgdXRpbGl6YXRpb24gb2YgaW5wdXQgZGF0YQorVGhlIHBsdWdpbiBmZWVkcyB0aGUgZW50aXJlIGlucHV0IGRhdGEgdG8gdGhlIGNvZGVjIGFzIGV4cGVjdGVkIGJ5IGRlY29kZXIgQVBJLgorCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBnNzExYWxhd19kZWNfZnV6emVyIGFuZCBnNzExbWxhd19kZWNfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBnNzExYWxhd19kZWNfZnV6emVyCisgICQgbW0gLWokKG5wcm9jKSBnNzExbWxhd19kZWNfZnV6emVyCitgYGAKKworIyMjIyBTdGVwcyB0byBydW4KK0NyZWF0ZSBhIGRpcmVjdG9yeSBDT1JQVVNfRElSIGFuZCBjb3B5IHNvbWUgZzcxMSBmaWxlcyB0byB0aGF0IGZvbGRlcgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9nNzExYWxhd19kZWNfZnV6emVyL2c3MTFhbGF3X2RlY19mdXp6ZXIgQ09SUFVTX0RJUgorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L2c3MTFtbGF3X2RlY19mdXp6ZXIvZzcxMW1sYXdfZGVjX2Z1enplciBDT1JQVVNfRElSCitgYGAKK1RvIHJ1biBvbiBob3N0CitgYGAKKyAgJCAkQU5EUk9JRF9IT1NUX09VVC9mdXp6L3g4Nl82NC9nNzExYWxhd19kZWNfZnV6emVyL2c3MTFhbGF3X2RlY19mdXp6ZXIgQ09SUFVTX0RJUgorICAkICRBTkRST0lEX0hPU1RfT1VUL2Z1enoveDg2XzY0L2c3MTFtbGF3X2RlY19mdXp6ZXIvZzcxMW1sYXdfZGVjX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyMgUmVmZXJlbmNlczoKKyAqIGh0dHA6Ly9sbHZtLm9yZy9kb2NzL0xpYkZ1enplci5odG1sCisgKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL29zcy1mdXp6CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlY3MvZzcxMS9mdXp6ZXIvZzcxMV9kZWNfZnV6emVyLmNwcCBiL21lZGlhL2NvZGVjcy9nNzExL2Z1enplci9nNzExX2RlY19mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZmJjZjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlY3MvZzcxMS9mdXp6ZXIvZzcxMV9kZWNfZnV6emVyLmNwcApAQCAtMCwwICsxLDU4IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgImc3MTFEZWMuaCIKKworY2xhc3MgQ29kZWMgeworIHB1YmxpYzoKKyAgQ29kZWMoKSA9IGRlZmF1bHQ7CisgIH5Db2RlYygpID0gZGVmYXVsdDsKKyAgdm9pZCBkZWNvZGVGcmFtZXMoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworfTsKKwordm9pZCBDb2RlYzo6ZGVjb2RlRnJhbWVzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIHNpemVfdCBvdXRwdXRCdWZmZXJTaXplID0gc2l6ZW9mKGludDE2X3QpICogc2l6ZTsKKyAgaW50MTZfdCAqb3V0ID0gbmV3IGludDE2X3Rbb3V0cHV0QnVmZmVyU2l6ZV07CisgIGlmICghb3V0KSB7CisgICAgcmV0dXJuOworICB9CisjaWZkZWYgQUxBVworICBEZWNvZGVBTGF3KG91dCwgZGF0YSwgc2l6ZSk7CisjZWxzZQorICBEZWNvZGVNTGF3KG91dCwgZGF0YSwgc2l6ZSk7CisjZW5kaWYKKyAgZGVsZXRlW10gb3V0OworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmIChzaXplIDwgMSkgeworICAgIHJldHVybiAwOworICB9CisgIENvZGVjICpjb2RlYyA9IG5ldyBDb2RlYygpOworICBpZiAoIWNvZGVjKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgY29kZWMtPmRlY29kZUZyYW1lcyhkYXRhLCBzaXplKTsKKyAgZGVsZXRlIGNvZGVjOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvQW5kcm9pZC5icAppbmRleCA3YzRlNjJmLi5mOWFiZmUzIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9BbmRyb2lkLmJwCkBAIC0yMSw3ICsyMSw2IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhbmRrIzI5IiwKICAgICBdLAogCiAgICAgLy8gZXh0cmFjdG9ycyBhcmUgc3VwcG9zZWQgdG8gd29yayBvbiBRKDI5KQpAQCAtMzksNiArMzgsMjEgQEAKIAogICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAogCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGFuZHJvaWQ6IHsKKyAgICAgICAgICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICAgICAgICAgImxpYm1lZGlhbmRrIzI5IiwKKyAgICAgICAgICAgIF0sCisgICAgICAgIH0sCisgICAgICAgIGhvc3Q6IHsKKyAgICAgICAgICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgICAgICAgICAibGlibWVkaWFuZGtfZm9ybWF0IiwKKyAgICAgICAgICAgICAgICAibGlibWVkaWFfbmRrZm9ybWF0cHJpdiIsCisgICAgICAgICAgICBdLAorICAgICAgICB9LAorICAgIH0sCisKICAgICBzYW5pdGl6ZTogewogICAgICAgICBjZmk6IHRydWUsCiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQW5kcm9pZC5icAppbmRleCA2MGQzYWUxLi5jMDM2YmI1IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FuZHJvaWQuYnAKQEAgLTEwLDQgKzEwLDExIEBACiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BbmRyb2lkLmJwCmluZGV4IDQ5Yzk1NjcuLjQ0MDA2NWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQW5kcm9pZC5icApAQCAtOCw0ICs4LDEwIEBACiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICBdLAogCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvQW5kcm9pZC5icAppbmRleCA4MjZjMWEwLi4yNTkzMDAwIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvQW5kcm9pZC5icApAQCAtMjEsNCArMjEsMTIgQEAKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxZDZmODMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvQW5kcm9pZC5icApAQCAtMCwwICsxLDMxMiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImV4dHJhY3Rvci1mdXp6ZXJiYXNlLWRlZmF1bHRzIiwKKworICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlibWVkaWFuZGtfZm9ybWF0IiwKKyAgICAgICAgImxpYm1lZGlhX25ka2Zvcm1hdHByaXYiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICBdLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJleHRyYWN0b3ItZnV6emVyLWRlZmF1bHRzIiwKKyAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZnV6emVyYmFzZS1kZWZhdWx0cyJdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmV4dHJhY3RvcmZ1enplcmJhc2UiLAorICAgIF0sCisKKyAgICBmdXp6X2NvbmZpZzogeworICAgICAgICBjYzogWworICAgICAgICAgICAgImFuZHJvaWQtbWVkaWEtZnV6emluZy1yZXBvcnRzQGdvb2dsZS5jb20iLAorICAgICAgICBdLAorICAgICAgICBjb21wb25lbnRpZDogMTU1Mjc2LAorICAgIH0sCit9CisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibXBlZzItZXh0cmFjdG9yLWZ1enplci1kZWZhdWx0cyIsCisgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWZ1enplci1kZWZhdWx0cyJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvbXBlZzIiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX3dpdGhvdXRfaW1lbW9yeSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJleHRyYWN0b3IiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZXNkcyIsCisgICAgICAgICJsaWJtcGVnMmV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXNAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzLm5hdGl2ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCisgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJleHRyYWN0b3JmdXp6ZXJiYXNlIiwKKyAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZnV6emVyYmFzZS1kZWZhdWx0cyJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiRXh0cmFjdG9yRnV6emVyQmFzZS5jcHAiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJtcDRfZXh0cmFjdG9yX2Z1enplciIsCisgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWZ1enplci1kZWZhdWx0cyJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAibXA0X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvbXA0IiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50X2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfaWQzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAorICAgICAgICAibGlibXA0ZXh0cmFjdG9yIiwKKyAgICBdLAorCisgICAgZGljdGlvbmFyeTogIm1wNF9leHRyYWN0b3JfZnV6emVyLmRpY3QiLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAid2F2X2V4dHJhY3Rvcl9mdXp6ZXIiLAorICAgIGRlZmF1bHRzOiBbImV4dHJhY3Rvci1mdXp6ZXItZGVmYXVsdHMiXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIndhdl9leHRyYWN0b3JfZnV6emVyLmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzL3dhdiIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJmaWZvIiwKKyAgICAgICAgImxpYndhdmV4dHJhY3RvciIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiYW1yX2V4dHJhY3Rvcl9mdXp6ZXIiLAorICAgIGRlZmF1bHRzOiBbImV4dHJhY3Rvci1mdXp6ZXItZGVmYXVsdHMiXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgImFtcl9leHRyYWN0b3JfZnV6emVyLmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzL2FtciIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhbXJleHRyYWN0b3IiLAorICAgIF0sCisKKyAgICBkaWN0aW9uYXJ5OiAiYW1yX2V4dHJhY3Rvcl9mdXp6ZXIuZGljdCIsCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJta3ZfZXh0cmFjdG9yX2Z1enplciIsCisgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWZ1enplci1kZWZhdWx0cyJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAibWt2X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvbWt2IiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYndlYm0iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZmxhY2RlYyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKKyAgICAgICAgImxpYm1rdmV4dHJhY3RvciIsCisgICAgICAgICJsaWJGTEFDIiwKKyAgICBdLAorCisgICAgZGljdGlvbmFyeTogIm1rdl9leHRyYWN0b3JfZnV6emVyLmRpY3QiLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAib2dnX2V4dHJhY3Rvcl9mdXp6ZXIiLAorICAgIGRlZmF1bHRzOiBbImV4dHJhY3Rvci1mdXp6ZXItZGVmYXVsdHMiXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIm9nZ19leHRyYWN0b3JfZnV6emVyLmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzL29nZyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKKyAgICAgICAgImxpYnZvcmJpc2lkZWMiLAorICAgICAgICAibGlib2dnZXh0cmFjdG9yIiwKKyAgICBdLAorCisgICAgZGljdGlvbmFyeTogIm9nZ19leHRyYWN0b3JfZnV6emVyLmRpY3QiLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibXBlZzJwc19leHRyYWN0b3JfZnV6emVyIiwKKyAgICBkZWZhdWx0czogWyJtcGVnMi1leHRyYWN0b3ItZnV6emVyLWRlZmF1bHRzIl0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJtcGVnMl9leHRyYWN0b3JfZnV6emVyLmNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURNUEVHMlBTIiwKKyAgICBdLAorCisgICAgZGljdGlvbmFyeTogIm1wZWcycHNfZXh0cmFjdG9yX2Z1enplci5kaWN0IiwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogIm1wZWcydHNfZXh0cmFjdG9yX2Z1enplciIsCisgICAgZGVmYXVsdHM6IFsibXBlZzItZXh0cmFjdG9yLWZ1enplci1kZWZhdWx0cyJdLAorCisgICAgc3JjczogWworICAgICAgICAibXBlZzJfZXh0cmFjdG9yX2Z1enplci5jcHAiLAorICAgIF0sCisKKyAgICBkaWN0aW9uYXJ5OiAibXBlZzJ0c19leHRyYWN0b3JfZnV6emVyLmRpY3QiLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibXAzX2V4dHJhY3Rvcl9mdXp6ZXIiLAorICAgIGRlZmF1bHRzOiBbImV4dHJhY3Rvci1mdXp6ZXItZGVmYXVsdHMiXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIm1wM19leHRyYWN0b3JfZnV6emVyLmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzL21wMyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJmaWZvIiwKKyAgICAgICAgImxpYm1wM2V4dHJhY3RvciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9pZDMiLAorICAgIF0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJhYWNfZXh0cmFjdG9yX2Z1enplciIsCisgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWZ1enplci1kZWZhdWx0cyJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiYWFjX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvYWFjIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmFhY2V4dHJhY3RvciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiZmxhY19leHRyYWN0b3JfZnV6emVyIiwKKyAgICBkZWZhdWx0czogWyJleHRyYWN0b3ItZnV6emVyLWRlZmF1bHRzIl0sCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJmbGFjX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvZmxhYyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKKyAgICAgICAgImxpYkZMQUMiLAorICAgICAgICAibGliZmxhY2V4dHJhY3RvciIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKKyAgICBdLAorCisgICAgZGljdGlvbmFyeTogImZsYWNfZXh0cmFjdG9yX2Z1enplci5kaWN0IiwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9FeHRyYWN0b3JGdXp6ZXJCYXNlLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9FeHRyYWN0b3JGdXp6ZXJCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmU4NDY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL0V4dHJhY3RvckZ1enplckJhc2UuY3BwCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJFeHRyYWN0b3JGdXp6ZXJCYXNlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRXh0cmFjdG9yRnV6emVyQmFzZS5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworYm9vbCBFeHRyYWN0b3JGdXp6ZXJCYXNlOjpzZXREYXRhU291cmNlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmICgoIWRhdGEpIHx8IChzaXplID09IDApKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1CdWZmZXJTb3VyY2UgPSBuZXcgQnVmZmVyU291cmNlKGRhdGEsIHNpemUpOworICBtRGF0YVNvdXJjZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8RGF0YVNvdXJjZSo+KG1CdWZmZXJTb3VyY2UuZ2V0KCkpOworICBpZiAoIW1EYXRhU291cmNlKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIEV4dHJhY3RvckZ1enplckJhc2U6OmdldEV4dHJhY3RvckRlZigpIHsKKyAgZmxvYXQgY29uZmlkZW5jZTsKKyAgdm9pZCogbWV0YSA9IG51bGxwdHI7CisgIEZyZWVNZXRhRnVuYyBmcmVlTWV0YSA9IG51bGxwdHI7CisKKyAgRXh0cmFjdG9yRGVmIGV4dHJhY3RvckRlZiA9IEdFVEVYVFJBQ1RPUkRFRigpOworICBpZiAoZXh0cmFjdG9yRGVmLmRlZl92ZXJzaW9uID09IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMSkgeworICAgIGV4dHJhY3RvckRlZi51LnYyLnNuaWZmKG1EYXRhU291cmNlLT53cmFwKCksICZjb25maWRlbmNlLCAmbWV0YSwgJmZyZWVNZXRhKTsKKyAgfSBlbHNlIGlmIChleHRyYWN0b3JEZWYuZGVmX3ZlcnNpb24gPT0gRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YyKSB7CisgICAgZXh0cmFjdG9yRGVmLnUudjMuc25pZmYobURhdGFTb3VyY2UtPndyYXAoKSwgJmNvbmZpZGVuY2UsICZtZXRhLCAmZnJlZU1ldGEpOworICB9CisKKyAgaWYgKG1ldGEgIT0gbnVsbHB0ciAmJiBmcmVlTWV0YSAhPSBudWxscHRyKSB7CisgICAgZnJlZU1ldGEobWV0YSk7CisgIH0KK30KKwordm9pZCBFeHRyYWN0b3JGdXp6ZXJCYXNlOjpleHRyYWN0VHJhY2tzKCkgeworICBNZWRpYUJ1ZmZlckdyb3VwKiBidWZmZXJHcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwKCk7CisgIGlmICghYnVmZmVyR3JvdXApIHsKKyAgICByZXR1cm47CisgIH0KKyAgc2l6ZV90IHRyYWNrQ291bnQgPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOworICBmb3IgKHNpemVfdCB0cmFja0luZGV4ID0gMDsgdHJhY2tJbmRleCA8IHRyYWNrQ291bnQ7ICsrdHJhY2tJbmRleCkgeworICAgIE1lZGlhVHJhY2tIZWxwZXIqIHRyYWNrID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2sodHJhY2tJbmRleCk7CisgICAgaWYgKCF0cmFjaykgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGV4dHJhY3RUcmFjayh0cmFjaywgYnVmZmVyR3JvdXApOworICAgIGRlbGV0ZSB0cmFjazsKKyAgfQorICBkZWxldGUgYnVmZmVyR3JvdXA7Cit9CisKK3ZvaWQgRXh0cmFjdG9yRnV6emVyQmFzZTo6ZXh0cmFjdFRyYWNrKE1lZGlhVHJhY2tIZWxwZXIqIHRyYWNrLCBNZWRpYUJ1ZmZlckdyb3VwKiBidWZmZXJHcm91cCkgeworICBDTWVkaWFUcmFjayogY1RyYWNrID0gd3JhcCh0cmFjayk7CisgIGlmICghY1RyYWNrKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gY1RyYWNrLT5zdGFydCh0cmFjaywgYnVmZmVyR3JvdXAtPndyYXAoKSk7CisgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgZnJlZShjVHJhY2spOworICAgIHJldHVybjsKKyAgfQorCisgIGRvIHsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciogYnVmZmVyID0gbnVsbHB0cjsKKyAgICBzdGF0dXMgPSB0cmFjay0+cmVhZCgmYnVmZmVyKTsKKyAgICBpZiAoYnVmZmVyKSB7CisgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICB9CisgIH0gd2hpbGUgKHN0YXR1cyA9PSBBTUVESUFfT0spOworCisgIGNUcmFjay0+c3RvcCh0cmFjayk7CisgIGZyZWUoY1RyYWNrKTsKK30KKwordm9pZCBFeHRyYWN0b3JGdXp6ZXJCYXNlOjpnZXRUcmFja3NNZXRhZGF0YSgpIHsKKyAgQU1lZGlhRm9ybWF0KiBmb3JtYXQgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgIHVpbnQzMl90IGZsYWdzID0gTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXI6OmtJbmNsdWRlRXh0ZW5zaXZlTWV0YURhdGE7CisKKyAgc2l6ZV90IHRyYWNrQ291bnQgPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOworICBmb3IgKHNpemVfdCB0cmFja0luZGV4ID0gMDsgdHJhY2tJbmRleCA8IHRyYWNrQ291bnQ7ICsrdHJhY2tJbmRleCkgeworICAgIG1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoZm9ybWF0LCB0cmFja0luZGV4LCBmbGFncyk7CisgIH0KKworICBBTWVkaWFGb3JtYXRfZGVsZXRlKGZvcm1hdCk7Cit9CisKK3ZvaWQgRXh0cmFjdG9yRnV6emVyQmFzZTo6Z2V0TWV0YWRhdGEoKSB7CisgIEFNZWRpYUZvcm1hdCogZm9ybWF0ID0gQU1lZGlhRm9ybWF0X25ldygpOworICBtRXh0cmFjdG9yLT5nZXRNZXRhRGF0YShmb3JtYXQpOworICBBTWVkaWFGb3JtYXRfZGVsZXRlKGZvcm1hdCk7Cit9CisKK3ZvaWQgRXh0cmFjdG9yRnV6emVyQmFzZTo6c2V0RGF0YVNvdXJjZUZsYWdzKHVpbnQzMl90IGZsYWdzKSB7CisgIG1CdWZmZXJTb3VyY2UtPnNldEZsYWdzKGZsYWdzKTsKK30KKwordm9pZCBFeHRyYWN0b3JGdXp6ZXJCYXNlOjpzZWVrQW5kRXh0cmFjdFRyYWNrcygpIHsKKyAgTWVkaWFCdWZmZXJHcm91cCogYnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cCgpOworICBpZiAoIWJ1ZmZlckdyb3VwKSB7CisgICAgcmV0dXJuOworICB9CisgIHNpemVfdCB0cmFja0NvdW50ID0gbUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKKyAgZm9yIChzaXplX3QgdHJhY2tJbmRleCA9IDA7IHRyYWNrSW5kZXggPCB0cmFja0NvdW50OyArK3RyYWNrSW5kZXgpIHsKKyAgICBNZWRpYVRyYWNrSGVscGVyKiB0cmFjayA9IG1FeHRyYWN0b3ItPmdldFRyYWNrKHRyYWNrSW5kZXgpOworICAgIGlmICghdHJhY2spIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIEFNZWRpYUZvcm1hdCogdHJhY2tNZXRhRGF0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBpbnQ2NF90IHRyYWNrRHVyYXRpb24gPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXI6OmtJbmNsdWRlRXh0ZW5zaXZlTWV0YURhdGE7CisgICAgbUV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YSh0cmFja01ldGFEYXRhLCB0cmFja0luZGV4LCBmbGFncyk7CisgICAgQU1lZGlhRm9ybWF0X2dldEludDY0KHRyYWNrTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICZ0cmFja0R1cmF0aW9uKTsKKworICAgIHNlZWtBbmRFeHRyYWN0VHJhY2sodHJhY2ssIGJ1ZmZlckdyb3VwLCB0cmFja0R1cmF0aW9uKTsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKHRyYWNrTWV0YURhdGEpOworICAgIGRlbGV0ZSB0cmFjazsKKyAgfQorICBkZWxldGUgYnVmZmVyR3JvdXA7Cit9CisKK3ZvaWQgRXh0cmFjdG9yRnV6emVyQmFzZTo6c2Vla0FuZEV4dHJhY3RUcmFjayhNZWRpYVRyYWNrSGVscGVyKiB0cmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlckdyb3VwKiBidWZmZXJHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRyYWNrRHVyYXRpb24pIHsKKyAgQ01lZGlhVHJhY2sqIGNUcmFjayA9IHdyYXAodHJhY2spOworICBpZiAoIWNUcmFjaykgeworICAgIHJldHVybjsKKyAgfQorCisgIG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IGNUcmFjay0+c3RhcnQodHJhY2ssIGJ1ZmZlckdyb3VwLT53cmFwKCkpOworICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgeworICAgIGZyZWUoY1RyYWNrKTsKKyAgICByZXR1cm47CisgIH0KKworICBpbnQzMl90IHNlZWtDb3VudCA9IDA7CisgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IHNlZWtUb1RpbWVTdGFtcDsKKyAgd2hpbGUgKHNlZWtDb3VudCA8PSBrRnV6emVyTWF4U2Vla1BvaW50c0NvdW50KSB7CisgICAgLyogVGhpcyBlbnN1cmVzIGtGdXp6ZXJNYXhTZWVrUG9pbnRzQ291bnQgc2VlayBwb2ludHMgYXJlIHdpdGhpbiB0aGUgY2xpcER1cmF0aW9uIGFuZCAxIHNlZWsKKyAgICAgKiBwb2ludCBpcyBvdXRzaWRlIG9mIHRoZSBjbGlwRHVyYXRpb24uCisgICAgICovCisgICAgaW50NjRfdCB0aW1lU3RhbXAgPSAoc2Vla0NvdW50ICogdHJhY2tEdXJhdGlvbikgLyAoa0Z1enplck1heFNlZWtQb2ludHNDb3VudCAtIDEpOworICAgIHNlZWtUb1RpbWVTdGFtcC5wdXNoX2JhY2sodGltZVN0YW1wKTsKKyAgICBzZWVrQ291bnQrKzsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBzZWVrT3B0aW9uczsKKyAgc2Vla09wdGlvbnMucHVzaF9iYWNrKENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUsgfCBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QpOworICBzZWVrT3B0aW9ucy5wdXNoX2JhY2soQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFSyB8IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DKTsKKyAgc2Vla09wdGlvbnMucHVzaF9iYWNrKENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUsgfCBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMpOworICBzZWVrT3B0aW9ucy5wdXNoX2JhY2soQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFSyB8IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUtfTkVYVF9TWU5DKTsKKyAgc2Vla09wdGlvbnMucHVzaF9iYWNrKENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUsgfCBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX0ZSQU1FX0lOREVYKTsKKworICBmb3IgKHVpbnQzMl90IHNlZWtPcHRpb24gOiBzZWVrT3B0aW9ucykgeworICAgIGZvciAoaW50NjRfdCBzZWVrUHRzIDogc2Vla1RvVGltZVN0YW1wKSB7CisgICAgICBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9ucyogb3B0aW9ucyA9CisgICAgICAgICAgbmV3IE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zKHNlZWtPcHRpb24sIHNlZWtQdHMpOworICAgICAgTWVkaWFCdWZmZXJIZWxwZXIqIGJ1ZmZlciA9IG51bGxwdHI7CisgICAgICB0cmFjay0+cmVhZCgmYnVmZmVyLCBvcHRpb25zKTsKKyAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICB9CisgICAgICBkZWxldGUgb3B0aW9uczsKKyAgICB9CisgIH0KKworICBjVHJhY2stPnN0b3AodHJhY2spOworICBmcmVlKGNUcmFjayk7Cit9CisKK3ZvaWQgRXh0cmFjdG9yRnV6emVyQmFzZTo6cHJvY2Vzc0RhdGEoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKHNldERhdGFTb3VyY2UoZGF0YSwgc2l6ZSkpIHsKKyAgICBpZiAoY3JlYXRlRXh0cmFjdG9yKCkpIHsKKyAgICAgIGdldEV4dHJhY3RvckRlZigpOworICAgICAgZ2V0TWV0YWRhdGEoKTsKKyAgICAgIGV4dHJhY3RUcmFja3MoKTsKKyAgICAgIGdldFRyYWNrc01ldGFkYXRhKCk7CisgICAgICBzZWVrQW5kRXh0cmFjdFRyYWNrcygpOworICAgIH0KKyAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL1JFQURNRS5tZCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIyM2I1ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9SRUFETUUubWQKQEAgLTAsMCArMSwzMjYgQEAKKyMgRnV6emVyIGZvciBleHRyYWN0b3JzCisKKyMjIFRhYmxlIG9mIGNvbnRlbnRzCisrIFtsaWJleHRyYWN0b3JmdXp6ZXJiYXNlXSgjRXh0cmFjdG9yRnV6emVyQmFzZSkKKysgW2xpYm1wNGV4dHJhY3Rvcl0oI21wNEV4dHJhY3RvckZ1enplcikKKysgW2xpYndhdmV4dHJhY3Rvcl0oI3dhdkV4dHJhY3RvckZ1enplcikKKysgW2xpYmFtcmV4dHJhY3Rvcl0oI2FtckV4dHJhY3RvckZ1enplcikKKysgW2xpYm1rdmV4dHJhY3Rvcl0oI21rdkV4dHJhY3RvckZ1enplcikKKysgW2xpYm9nZ2V4dHJhY3Rvcl0oI29nZ0V4dHJhY3RvckZ1enplcikKKysgW2xpYm1wZWcyZXh0cmFjdG9yXSgjbXBlZzJFeHRyYWN0b3JGdXp6ZXIpCisrIFtsaWJtcDNleHRyYWN0b3JdKCNtcDNFeHRyYWN0b3JGdXp6ZXIpCisrIFtsaWJhYWNleHRyYWN0b3JdKCNhYWNFeHRyYWN0b3JGdXp6ZXIpCisrIFtsaWJmbGFjZXh0cmFjdG9yXSgjZmxhY0V4dHJhY3RvcikKKworIyA8YSBuYW1lPSJFeHRyYWN0b3JGdXp6ZXJCYXNlIj48L2E+IEZ1enplciBmb3IgbGliZXh0cmFjdG9yZnV6emVyYmFzZQorQWxsIHRoZSBleHRyYWN0b3JzIGhhdmUgYSBjb21tb24gQVBJIC0gY3JlYXRpbmcgYSBkYXRhIHNvdXJjZSwgZXh0cmFjdGlvbgorb2YgYWxsIHRoZSB0cmFja3MsIGV0Yy4gVGhlc2UgY29tbW9uIEFQSXMgaGF2ZSBiZWVuIGFic3RyYWN0ZWQgaW4gYSBiYXNlIGNsYXNzCitjYWxsZWQgYEV4dHJhY3RvckZ1enplckJhc2VgIHRvIGVuc3VyZSBjb2RlIGlzIHJldXNlZCBiZXR3ZWVuIGZ1enplciBwbHVnaW5zLgorCitBZGRpdGlvbmFsbHksIGBFeHRyYWN0b3JGdXp6ZXJCYXNlYCBhbHNvIGhhcyBzdXBwb3J0IGZvciBtZW1vcnkgYmFzZWQgYnVmZmVyCitgQnVmZmVyU291cmNlYCBzaW5jZSB0aGUgZnV6emluZyBlbmdpbmUgZmVlZHMgZGF0YSB1c2luZyBtZW1vcnkgYnVmZmVycyBhbmQKK3VzYWdlIG9mIHN0YW5kYXJkIGRhdGEgc291cmNlIG9iamVjdHMgbGlrZSBGaWxlU291cmNlLCBIVFRQU291cmNlLCBldGMuIGlzCitub3QgZmVhc2libGUuCisKKyMgPGEgbmFtZT0ibXA0RXh0cmFjdG9yRnV6emVyIj48L2E+IEZ1enplciBmb3IgbGlibXA0ZXh0cmFjdG9yCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBNUDQgZXh0cmFjdG9yIHVzZXMgdGhlIGBFeHRyYWN0b3JGdXp6ZXJCYXNlYCBjbGFzcyBhbmQKK2ltcGxlbWVudHMgb25seSB0aGUgYGNyZWF0ZUV4dHJhY3RvcmAgdG8gY3JlYXRlIHRoZSBNUDQgZXh0cmFjdG9yIGNsYXNzLgorCisjIyMjIyBNYXhpbWl6ZSBjb2RlIGNvdmVyYWdlCitEaWN0IGZpbGUgKGRpY3Rpb25hcnkgZmlsZSkgaXMgY3JlYXRlZCBmb3IgTVA0IHRvIGVuc3VyZSB0aGF0IHRoZSByZXF1aXJlZCBNUDQKK2F0b21zIGFyZSBwcmVzZW50IGluIGV2ZXJ5IGlucHV0IGZpbGUgdGhhdCBnb2VzIHRvIHRoZSBmdXp6ZXIuCitUaGlzIGVuc3VyZXMgdGhhdCBsYXJnZXIgY29kZSBnZXRzIGNvdmVyZWQgYXMgYSByYW5nZSBvZiBNUDQgYXRvbXMgd2lsbCBiZQorcHJlc2VudCBpbiB0aGUgaW5wdXQgZGF0YS4KKworCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBtcDRfZXh0cmFjdG9yX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgbXA0X2V4dHJhY3Rvcl9mdXp6ZXIKK2BgYAorCisjIyMjIFN0ZXBzIHRvIHJ1bgorQ3JlYXRlIGEgZGlyZWN0b3J5IENPUlBVU19ESVIgYW5kIGNvcHkgc29tZSBNUDQgZmlsZXMgdG8gdGhhdCBmb2xkZXIKK1B1c2ggdGhpcyBkaXJlY3RvcnkgdG8gZGV2aWNlLgorCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvbXA0X2V4dHJhY3Rvcl9mdXp6ZXIvbXA0X2V4dHJhY3Rvcl9mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCisKKyMgPGEgbmFtZT0id2F2RXh0cmFjdG9yRnV6emVyIj48L2E+IEZ1enplciBmb3IgbGlid2F2ZXh0cmFjdG9yCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBXQVYgZXh0cmFjdG9yIHVzZXMgdGhlIGBFeHRyYWN0b3JGdXp6ZXJCYXNlYCBjbGFzcyBhbmQKK2ltcGxlbWVudHMgb25seSB0aGUgYGNyZWF0ZUV4dHJhY3RvcmAgdG8gY3JlYXRlIHRoZSBXQVYgZXh0cmFjdG9yIGNsYXNzLgorCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIHdhdl9leHRyYWN0b3JfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSB3YXZfZXh0cmFjdG9yX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIHdhdiBmaWxlcyB0byB0aGF0IGZvbGRlcgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC93YXZfZXh0cmFjdG9yX2Z1enplci93YXZfZXh0cmFjdG9yX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyA8YSBuYW1lPSJhbXJFeHRyYWN0b3JGdXp6ZXIiPjwvYT4gRnV6emVyIGZvciBsaWJhbXJleHRyYWN0b3IKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIEFNUiBleHRyYWN0b3IgdXNlcyB0aGUgYEV4dHJhY3RvckZ1enplckJhc2VgIGNsYXNzIGFuZAoraW1wbGVtZW50cyBvbmx5IHRoZSBgY3JlYXRlRXh0cmFjdG9yYCB0byBjcmVhdGUgdGhlIEFNUiBleHRyYWN0b3IgY2xhc3MuCisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK0RpY3QgZmlsZSAoZGljdGlvbmFyeSBmaWxlKSBpcyBjcmVhdGVkIGZvciBBTVIgdG8gZW5zdXJlIHRoYXQgdGhlIHJlcXVpcmVkIHN0YXJ0CitieXRlcyBhcmUgcHJlc2VudCBpbiBldmVyeSBpbnB1dCBmaWxlIHRoYXQgZ29lcyB0byB0aGUgZnV6emVyLgorVGhpcyBlbnN1cmVzIHRoYXQgbGFyZ2VyIGNvZGUgZ2V0cyBjb3ZlcmVkLgorCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIGFtcl9leHRyYWN0b3JfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBhbXJfZXh0cmFjdG9yX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIEFNUiBmaWxlcyB0byB0aGF0IGZvbGRlcgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9hbXJfZXh0cmFjdG9yX2Z1enplci9hbXJfZXh0cmFjdG9yX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyA8YSBuYW1lPSJta3ZFeHRyYWN0b3JGdXp6ZXIiPjwvYT4gRnV6emVyIGZvciBsaWJta3ZleHRyYWN0b3IKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIE1LViBleHRyYWN0b3IgdXNlcyB0aGUgYEV4dHJhY3RvckZ1enplckJhc2VgIGNsYXNzIGFuZAoraW1wbGVtZW50cyBvbmx5IHRoZSBgY3JlYXRlRXh0cmFjdG9yYCB0byBjcmVhdGUgdGhlIE1LViBleHRyYWN0b3IgY2xhc3MuCisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK0RpY3QgZmlsZSAoZGljdGlvbmFyeSBmaWxlKSBpcyBjcmVhdGVkIGZvciBNS1YgdG8gZW5zdXJlIHRoYXQgdGhlIHJlcXVpcmVkIGVsZW1lbnQKK0lEJ3MgYXJlIHByZXNlbnQgaW4gZXZlcnkgaW5wdXQgZmlsZSB0aGF0IGdvZXMgdG8gdGhlIGZ1enplci4KK1RoaXMgZW5zdXJlcyB0aGF0IGxhcmdlciBjb2RlIGdldHMgY292ZXJlZC4KKworCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBta3ZfZXh0cmFjdG9yX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgbWt2X2V4dHJhY3Rvcl9mdXp6ZXIKK2BgYAorCisjIyMjIFN0ZXBzIHRvIHJ1bgorQ3JlYXRlIGEgZGlyZWN0b3J5IENPUlBVU19ESVIgYW5kIGNvcHkgc29tZSBta3YgZmlsZXMgdG8gdGhhdCBmb2xkZXIuCitQdXNoIHRoaXMgZGlyZWN0b3J5IHRvIGRldmljZS4KKworVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L21rdl9leHRyYWN0b3JfZnV6emVyL21rdl9leHRyYWN0b3JfZnV6emVyIENPUlBVU19ESVIKK2BgYAorCisjIDxhIG5hbWU9Im9nZ0V4dHJhY3RvckZ1enplciI+PC9hPiBGdXp6ZXIgZm9yIGxpYm9nZ2V4dHJhY3RvcgorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3IgT0dHIGV4dHJhY3RvciB1c2VzIHRoZSBgRXh0cmFjdG9yRnV6emVyQmFzZWAgY2xhc3MgYW5kCitpbXBsZW1lbnRzIG9ubHkgdGhlIGBjcmVhdGVFeHRyYWN0b3JgIHRvIGNyZWF0ZSB0aGUgT0dHIGV4dHJhY3RvciBvYmplY3QuCisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK0RpY3QgZmlsZSAoZGljdGlvbmFyeSBmaWxlKSBpcyBjcmVhdGVkIGZvciBPR0cgdG8gZW5zdXJlIHRoYXQgdGhlIHJlcXVpcmVkIHN0YXJ0CitieXRlcyBhcmUgcHJlc2VudCBpbiBldmVyeSBpbnB1dCBmaWxlIHRoYXQgZ29lcyB0byB0aGUgZnV6emVyLgorVGhpcyBlbnN1cmVzIHRoYXQgbGFyZ2VyIGNvZGUgZ2V0cyBjb3ZlcmVkLgorCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIG9nZ19leHRyYWN0b3JfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBvZ2dfZXh0cmFjdG9yX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIG9nZyBmaWxlcyB0byB0aGF0IGZvbGRlci4KK1B1c2ggdGhpcyBkaXJlY3RvcnkgdG8gZGV2aWNlLgorCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvb2dnX2V4dHJhY3Rvcl9mdXp6ZXIvb2dnX2V4dHJhY3Rvcl9mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCisKKyMgPGEgbmFtZT0ibXBlZzJFeHRyYWN0b3JGdXp6ZXIiPjwvYT4gRnV6emVyIGZvciBsaWJtcGVnMmV4dHJhY3RvcgorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbnMgZm9yIE1QRUcyLVBTIGFuZCBNUEVHMi1UUyBleHRyYWN0b3IgdXNlIHRoZSBgRXh0cmFjdG9yRnV6emVyQmFzZWAgY2xhc3MgYW5kCitpbXBsZW1lbnQgb25seSB0aGUgYGNyZWF0ZUV4dHJhY3RvcmAgdG8gY3JlYXRlIHRoZSBNUEVHMi1QUyBvciBNUEVHMi1UUyBleHRyYWN0b3IKK29iamVjdCByZXNwZWN0aXZlbHkuCisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK0RpY3QgZmlsZXMgKGRpY3Rpb25hcnkgZmlsZXMpIGFyZSBjcmVhdGVkIGZvciBNUEVHMi1QUyBhbmQgTVBFRzItVFMgdG8gZW5zdXJlIHRoYXQgdGhlCityZXF1aXJlZCBzdGFydCBieXRlcyBhcmUgcHJlc2VudCBpbiBldmVyeSBpbnB1dCBmaWxlIHRoYXQgZ29lcyB0byB0aGUgZnV6emVyLgorVGhpcyBlbnN1cmVzIHRoYXQgbGFyZ2VyIGNvZGUgZ2V0cyBjb3ZlcmVkLgorCisjIyMjIyBPdGhlciBjb25zaWRlcmF0aW9ucworVHdvIGZ1enplciBiaW5hcmllcyAtIG1wZWcycHNfZXh0cmFjdG9yX2Z1enplciBhbmQgbXBlZzJ0c19leHRyYWN0b3JfZnV6emVyIGFyZQorZ2VuZXJhdGVkIGJhc2VkIG9uIHRoZSBwcmVzZW5jZSBvZiBhIGZsYWcgLSBgTVBFRzJQU2AKKworCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBtcGVnMnBzX2V4dHJhY3Rvcl9mdXp6ZXIgYW5kIG1wZWcydHNfZXh0cmFjdG9yX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgbXBlZzJwc19leHRyYWN0b3JfZnV6emVyCisgICQgbW0gLWokKG5wcm9jKSBtcGVnMnRzX2V4dHJhY3Rvcl9mdXp6ZXIKK2BgYAorCisjIyMjIFN0ZXBzIHRvIHJ1bgorQ3JlYXRlIGEgZGlyZWN0b3J5IENPUlBVU19ESVIgYW5kIGNvcHkgc29tZSBtcGVnMiBmaWxlcyB0byB0aGF0IGZvbGRlcgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9tcGVnMnBzX2V4dHJhY3Rvcl9mdXp6ZXIvbXBlZzJwc19leHRyYWN0b3JfZnV6emVyIENPUlBVU19ESVIKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9tcGVnMnRzX2V4dHJhY3Rvcl9mdXp6ZXIvbXBlZzJ0c19leHRyYWN0b3JfZnV6emVyIENPUlBVU19ESVIKK2BgYAorCisjIDxhIG5hbWU9Im1wM0V4dHJhY3RvckZ1enplciI+PC9hPiBGdXp6ZXIgZm9yIGxpYm1wM2V4dHJhY3RvcgorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3IgTVAzIGV4dHJhY3RvciB1c2VzIHRoZSBgRXh0cmFjdG9yRnV6emVyQmFzZWAgY2xhc3MgYW5kCitpbXBsZW1lbnRzIG9ubHkgdGhlIGBjcmVhdGVFeHRyYWN0b3JgIHRvIGNyZWF0ZSB0aGUgTVAzIGV4dHJhY3RvciBjbGFzcy4KKworCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBtcDNfZXh0cmFjdG9yX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgbXAzX2V4dHJhY3Rvcl9mdXp6ZXIKK2BgYAorCisjIyMjIFN0ZXBzIHRvIHJ1bgorQ3JlYXRlIGEgZGlyZWN0b3J5IENPUlBVU19ESVIgYW5kIGNvcHkgc29tZSBtcDMgZmlsZXMgdG8gdGhhdCBmb2xkZXIKK1B1c2ggdGhpcyBkaXJlY3RvcnkgdG8gZGV2aWNlLgorCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvbXAzX2V4dHJhY3Rvcl9mdXp6ZXIvbXAzX2V4dHJhY3Rvcl9mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCisKKyMgPGEgbmFtZT0iYWFjRXh0cmFjdG9yRnV6emVyIj48L2E+IEZ1enplciBmb3IgbGliYWFjZXh0cmFjdG9yCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBBQUMgZXh0cmFjdG9yIHVzZXMgdGhlIGBFeHRyYWN0b3JGdXp6ZXJCYXNlYCBjbGFzcyBhbmQKK2ltcGxlbWVudHMgb25seSB0aGUgYGNyZWF0ZUV4dHJhY3RvcmAgdG8gY3JlYXRlIHRoZSBBQUMgZXh0cmFjdG9yIGNsYXNzLgorCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIGFhY19leHRyYWN0b3JfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBhYWNfZXh0cmFjdG9yX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIGFhYyBmaWxlcyB0byB0aGF0IGZvbGRlcgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9hYWNfZXh0cmFjdG9yX2Z1enplci9hYWNfZXh0cmFjdG9yX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyA8YSBuYW1lPSJmbGFjRXh0cmFjdG9yIj48L2E+IEZ1enplciBmb3IgbGliZmxhY2V4dHJhY3RvcgorCisjIyBQbHVnaW4gRGVzaWduIENvbnNpZGVyYXRpb25zCitUaGUgZnV6emVyIHBsdWdpbiBmb3IgRkxBQyBleHRyYWN0b3IgdXNlcyB0aGUgYEV4dHJhY3RvckZ1enplckJhc2VgIGNsYXNzIGFuZAoraW1wbGVtZW50cyBvbmx5IHRoZSBgY3JlYXRlRXh0cmFjdG9yYCB0byBjcmVhdGUgdGhlIEZMQUMgZXh0cmFjdG9yIG9iamVjdC4KKworIyMjIyMgTWF4aW1pemUgY29kZSBjb3ZlcmFnZQorRGljdCBmaWxlIChkaWN0aW9uYXJ5IGZpbGUpIGlzIGNyZWF0ZWQgZm9yIEZMQUMgdG8gZW5zdXJlIHRoYXQgdGhlIHJlcXVpcmVkIHN0YXJ0CitieXRlcyBhcmUgcHJlc2VudCBpbiBldmVyeSBpbnB1dCBmaWxlIHRoYXQgZ29lcyB0byB0aGUgZnV6emVyLgorVGhpcyBlbnN1cmVzIHRoYXQgbGFyZ2VyIGNvZGUgZ2V0cyBjb3ZlcmVkLgorCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIGZsYWNfZXh0cmFjdG9yX2Z1enplciBiaW5hcnkuCisKKyMjIyBBbmRyb2lkCisKKyMjIyMgU3RlcHMgdG8gYnVpbGQKK0J1aWxkIHRoZSBmdXp6ZXIKK2BgYAorICAkIG1tIC1qJChucHJvYykgZmxhY19leHRyYWN0b3JfZnV6emVyCitgYGAKKworIyMjIyBTdGVwcyB0byBydW4KK0NyZWF0ZSBhIGRpcmVjdG9yeSBDT1JQVVNfRElSIGFuZCBjb3B5IHNvbWUgZmxhYyBmaWxlcyB0byB0aGF0IGZvbGRlcgorUHVzaCB0aGlzIGRpcmVjdG9yeSB0byBkZXZpY2UuCisKK1RvIHJ1biBvbiBkZXZpY2UKK2BgYAorICAkIGFkYiBzeW5jIGRhdGEKKyAgJCBhZGIgc2hlbGwgL2RhdGEvZnV6ei9hcm02NC9mbGFjX2V4dHJhY3Rvcl9mdXp6ZXIvZmxhY19leHRyYWN0b3JfZnV6emVyIENPUlBVU19ESVIKK2BgYAorCisjIyBSZWZlcmVuY2VzOgorICogaHR0cDovL2xsdm0ub3JnL2RvY3MvTGliRnV6emVyLmh0bWwKKyAqIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvb3NzLWZ1enoKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9hYWNfZXh0cmFjdG9yX2Z1enplci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvYWFjX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YTZjYzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvYWFjX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSAiQUFDRXh0cmFjdG9yLmgiCisKKyNpbmNsdWRlICJFeHRyYWN0b3JGdXp6ZXJCYXNlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyBBYWNFeHRyYWN0b3IgOiBwdWJsaWMgRXh0cmFjdG9yRnV6emVyQmFzZSB7CisgcHVibGljOgorICBBYWNFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisgIH5BYWNFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBjcmVhdGVFeHRyYWN0b3IoKTsKK307CisKK2Jvb2wgQWFjRXh0cmFjdG9yOjpjcmVhdGVFeHRyYWN0b3IoKSB7CisgIG1FeHRyYWN0b3IgPSBuZXcgQUFDRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKG1EYXRhU291cmNlLT53cmFwKCkpLCAwKTsKKyAgaWYgKCFtRXh0cmFjdG9yKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1FeHRyYWN0b3ItPm5hbWUoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCghZGF0YSkgfHwgKHNpemUgPT0gMCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBBYWNFeHRyYWN0b3IqIGV4dHJhY3RvciA9IG5ldyBBYWNFeHRyYWN0b3IoKTsKKyAgaWYgKGV4dHJhY3RvcikgeworICAgIGV4dHJhY3Rvci0+cHJvY2Vzc0RhdGEoZGF0YSwgc2l6ZSk7CisgICAgZGVsZXRlIGV4dHJhY3RvcjsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9hbXJfZXh0cmFjdG9yX2Z1enplci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvYW1yX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjOWUxYTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvYW1yX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSAiRXh0cmFjdG9yRnV6emVyQmFzZS5oIgorCisjaW5jbHVkZSAiQU1SRXh0cmFjdG9yLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyBBbXJFeHRyYWN0b3IgOiBwdWJsaWMgRXh0cmFjdG9yRnV6emVyQmFzZSB7CisgcHVibGljOgorICBBbXJFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisgIH5BbXJFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBjcmVhdGVFeHRyYWN0b3IoKTsKK307CisKK2Jvb2wgQW1yRXh0cmFjdG9yOjpjcmVhdGVFeHRyYWN0b3IoKSB7CisgIG1FeHRyYWN0b3IgPSBuZXcgQU1SRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKG1EYXRhU291cmNlLT53cmFwKCkpKTsKKyAgaWYgKCFtRXh0cmFjdG9yKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1FeHRyYWN0b3ItPm5hbWUoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCghZGF0YSkgfHwgKHNpemUgPT0gMCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBBbXJFeHRyYWN0b3IqIGV4dHJhY3RvciA9IG5ldyBBbXJFeHRyYWN0b3IoKTsKKyAgaWYgKGV4dHJhY3RvcikgeworICAgIGV4dHJhY3Rvci0+cHJvY2Vzc0RhdGEoZGF0YSwgc2l6ZSk7CisgICAgZGVsZXRlIGV4dHJhY3RvcjsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9hbXJfZXh0cmFjdG9yX2Z1enplci5kaWN0IGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL2Ftcl9leHRyYWN0b3JfZnV6emVyLmRpY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM1NzI2YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9hbXJfZXh0cmFjdG9yX2Z1enplci5kaWN0CkBAIC0wLDAgKzEsMiBAQAorIyBTdGFydCBjb2RlCitrdzE9IiMhQU1SIgpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL2ZsYWNfZXh0cmFjdG9yX2Z1enplci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvZmxhY19leHRyYWN0b3JfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzM0ZDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL2ZsYWNfZXh0cmFjdG9yX2Z1enplci5jcHAKQEAgLTAsMCArMSw1NCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKKyNpbmNsdWRlICJFeHRyYWN0b3JGdXp6ZXJCYXNlLmgiCisKKyNpbmNsdWRlICJGTEFDRXh0cmFjdG9yLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyBGbGFjRXh0cmFjdG9yIDogcHVibGljIEV4dHJhY3RvckZ1enplckJhc2UgeworIHB1YmxpYzoKKyAgRmxhY0V4dHJhY3RvcigpID0gZGVmYXVsdDsKKyAgfkZsYWNFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBjcmVhdGVFeHRyYWN0b3IoKTsKK307CisKK2Jvb2wgRmxhY0V4dHJhY3Rvcjo6Y3JlYXRlRXh0cmFjdG9yKCkgeworICBtRXh0cmFjdG9yID0gbmV3IEZMQUNFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIobURhdGFTb3VyY2UtPndyYXAoKSkpOworICBpZiAoIW1FeHRyYWN0b3IpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgbUV4dHJhY3Rvci0+bmFtZSgpOworICByZXR1cm4gdHJ1ZTsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoKCFkYXRhKSB8fCAoc2l6ZSA9PSAwKSkgeworICAgIHJldHVybiAwOworICB9CisgIEZsYWNFeHRyYWN0b3IqIGV4dHJhY3RvciA9IG5ldyBGbGFjRXh0cmFjdG9yKCk7CisgIGlmIChleHRyYWN0b3IpIHsKKyAgICBleHRyYWN0b3ItPnByb2Nlc3NEYXRhKGRhdGEsIHNpemUpOworICAgIGRlbGV0ZSBleHRyYWN0b3I7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvZmxhY19leHRyYWN0b3JfZnV6emVyLmRpY3QgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvZmxhY19leHRyYWN0b3JfZnV6emVyLmRpY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNhZDQ0ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9mbGFjX2V4dHJhY3Rvcl9mdXp6ZXIuZGljdApAQCAtMCwwICsxLDMgQEAKKyMgU3RhcnQgY29kZSAoYnl0ZXMgMC0zKQorIyBUaGUgYmVsb3cgNCBieXRlcyBjb3JyZXNwb25kIHRvICJmTGFDIiBpbiBBU0NJSQora3cxPSJceDY2XHg0Q1x4NjFceDQzIgpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL2luY2x1ZGUvRXh0cmFjdG9yRnV6emVyQmFzZS5oIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL2luY2x1ZGUvRXh0cmFjdG9yRnV6emVyQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMmExYzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvaW5jbHVkZS9FeHRyYWN0b3JGdXp6ZXJCYXNlLmgKQEAgLTAsMCArMSwxMzkgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaWZuZGVmIF9fRVhUUkFDVE9SX0ZVWlpFUl9CQVNFX0hfXworI2RlZmluZSBfX0VYVFJBQ1RPUl9GVVpaRVJfQkFTRV9IX18KKworI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK2V4dGVybiAiQyIgeworYW5kcm9pZDo6RXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpOworfQorCitjb25zdGV4cHIgaW50MzJfdCBrRnV6emVyTWF4U2Vla1BvaW50c0NvdW50ID0gNTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBFeHRyYWN0b3JGdXp6ZXJCYXNlIHsKKyBwdWJsaWM6CisgIEV4dHJhY3RvckZ1enplckJhc2UoKSA9IGRlZmF1bHQ7CisgIHZpcnR1YWwgfkV4dHJhY3RvckZ1enplckJhc2UoKSB7CisgICAgaWYgKG1FeHRyYWN0b3IpIHsKKyAgICAgIGRlbGV0ZSBtRXh0cmFjdG9yOworICAgICAgbUV4dHJhY3RvciA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtQnVmZmVyU291cmNlKSB7CisgICAgICBtQnVmZmVyU291cmNlLmNsZWFyKCk7CisgICAgICBtQnVmZmVyU291cmNlID0gbnVsbHB0cjsKKyAgICB9CisgIH0KKworICAvKiogRnVuY3Rpb24gdG8gY3JlYXRlIHRoZSBtZWRpYSBleHRyYWN0b3IgY29tcG9uZW50LgorICAgICogVG8gYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGRlcml2ZWQgY2xhc3MuCisgICAgKi8KKyAgdmlydHVhbCBib29sIGNyZWF0ZUV4dHJhY3RvcigpID0gMDsKKworICAvKiogUGFyZW50IGNsYXNzIGZ1bmN0aW9ucyB0byBiZSByZXVzZWQgYnkgZGVyaXZlZCBjbGFzcy4KKyAgICAqIFRoZXNlIGFyZSBjb21tb24gZm9yIGFsbCBtZWRpYSBleHRyYWN0b3IgY29tcG9uZW50cy4KKyAgICAqLworICBib29sIHNldERhdGFTb3VyY2UoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpOworCisgIHZvaWQgZ2V0RXh0cmFjdG9yRGVmKCk7CisKKyAgdm9pZCBleHRyYWN0VHJhY2tzKCk7CisKKyAgdm9pZCBnZXRNZXRhZGF0YSgpOworCisgIHZvaWQgZ2V0VHJhY2tzTWV0YWRhdGEoKTsKKworICB2b2lkIHNldERhdGFTb3VyY2VGbGFncyh1aW50MzJfdCBmbGFncyk7CisKKyAgdm9pZCBzZWVrQW5kRXh0cmFjdFRyYWNrcygpOworCisgIHZvaWQgcHJvY2Vzc0RhdGEoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpOworCisgcHJvdGVjdGVkOgorICBjbGFzcyBCdWZmZXJTb3VyY2UgOiBwdWJsaWMgRGF0YVNvdXJjZSB7CisgICBwdWJsaWM6CisgICAgQnVmZmVyU291cmNlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBsZW5ndGgpIDogbURhdGEoZGF0YSksIG1MZW5ndGgobGVuZ3RoKSB7fQorICAgIHZpcnR1YWwgfkJ1ZmZlclNvdXJjZSgpIHsgbURhdGEgPSBudWxscHRyOyB9CisKKyAgICB2b2lkIHNldEZsYWdzKHVpbnQzMl90IGZsYWdzKSB7IG1GbGFncyA9IGZsYWdzOyB9CisKKyAgICB1aW50MzJfdCBmbGFncygpIHsgcmV0dXJuIG1GbGFnczsgfQorCisgICAgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3QgeyByZXR1cm4gbURhdGEgIT0gbnVsbHB0ciA/IE9LIDogTk9fSU5JVDsgfQorCisgICAgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgICBpZiAoIW1EYXRhKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgfQorCisgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgaWYgKChvZmZzZXQgPj0gc3RhdGljX2Nhc3Q8b2ZmNjRfdD4obUxlbmd0aCkpIHx8IChvZmZzZXQgPCAwKSkgeworICAgICAgICByZXR1cm4gMDsgIC8vIHJlYWQgYmV5b25kIGJvdW5kcy4KKyAgICAgIH0KKyAgICAgIHNpemVfdCBudW1BdmFpbGFibGUgPSBtTGVuZ3RoIC0gc3RhdGljX2Nhc3Q8c2l6ZV90PihvZmZzZXQpOworICAgICAgaWYgKHNpemUgPiBudW1BdmFpbGFibGUpIHsKKyAgICAgICAgc2l6ZSA9IG51bUF2YWlsYWJsZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiByZWFkQXRfbChvZmZzZXQsIGRhdGEsIHNpemUpOworICAgIH0KKworICAgIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCogc2l6ZSkgeworICAgICAgaWYgKCFtRGF0YSkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgIH0KKworICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICpzaXplID0gc3RhdGljX2Nhc3Q8b2ZmNjRfdD4obUxlbmd0aCk7CisgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICBwcm90ZWN0ZWQ6CisgICAgc3NpemVfdCByZWFkQXRfbChvZmY2NF90IG9mZnNldCwgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICAgIHZvaWQqIHJlc3VsdCA9IG1lbWNweShkYXRhLCBtRGF0YSArIG9mZnNldCwgc2l6ZSk7CisgICAgICByZXR1cm4gcmVzdWx0ICE9IG51bGxwdHIgPyBzaXplIDogMDsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90KiBtRGF0YSA9IG51bGxwdHI7CisgICAgc2l6ZV90IG1MZW5ndGggPSAwOworICAgIE11dGV4IG1Mb2NrOworICAgIHVpbnQzMl90IG1GbGFncyA9IDA7CisKKyAgIHByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQnVmZmVyU291cmNlKTsKKyAgfTsKKworICBzcDxCdWZmZXJTb3VyY2U+IG1CdWZmZXJTb3VyY2U7CisgIERhdGFTb3VyY2UqIG1EYXRhU291cmNlID0gbnVsbHB0cjsKKyAgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIqIG1FeHRyYWN0b3IgPSBudWxscHRyOworCisgIHZpcnR1YWwgdm9pZCBleHRyYWN0VHJhY2soTWVkaWFUcmFja0hlbHBlciogdHJhY2ssIE1lZGlhQnVmZmVyR3JvdXAqIGJ1ZmZlckdyb3VwKTsKKyAgdmlydHVhbCB2b2lkIHNlZWtBbmRFeHRyYWN0VHJhY2soTWVkaWFUcmFja0hlbHBlciogdHJhY2ssIE1lZGlhQnVmZmVyR3JvdXAqIGJ1ZmZlckdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRyYWNrRHVyYXRpb24pOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBfX0VYVFJBQ1RPUl9GVVpaRVJfQkFTRV9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9ta3ZfZXh0cmFjdG9yX2Z1enplci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbWt2X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZWI5M2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbWt2X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSAiRXh0cmFjdG9yRnV6emVyQmFzZS5oIgorCisjaW5jbHVkZSAiTWF0cm9za2FFeHRyYWN0b3IuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIE1LVkV4dHJhY3RvciA6IHB1YmxpYyBFeHRyYWN0b3JGdXp6ZXJCYXNlIHsKKyBwdWJsaWM6CisgIE1LVkV4dHJhY3RvcigpID0gZGVmYXVsdDsKKyAgfk1LVkV4dHJhY3RvcigpID0gZGVmYXVsdDsKKworICBib29sIGNyZWF0ZUV4dHJhY3RvcigpOworfTsKKworYm9vbCBNS1ZFeHRyYWN0b3I6OmNyZWF0ZUV4dHJhY3RvcigpIHsKKyAgbUV4dHJhY3RvciA9IG5ldyBNYXRyb3NrYUV4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihtRGF0YVNvdXJjZS0+d3JhcCgpKSk7CisgIGlmICghbUV4dHJhY3RvcikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBtRXh0cmFjdG9yLT5uYW1lKCk7CisgIHJldHVybiB0cnVlOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmICgoIWRhdGEpIHx8IChzaXplID09IDApKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgTUtWRXh0cmFjdG9yKiBleHRyYWN0b3IgPSBuZXcgTUtWRXh0cmFjdG9yKCk7CisgIGlmIChleHRyYWN0b3IpIHsKKyAgICBleHRyYWN0b3ItPnByb2Nlc3NEYXRhKGRhdGEsIHNpemUpOworICAgIGRlbGV0ZSBleHRyYWN0b3I7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbWt2X2V4dHJhY3Rvcl9mdXp6ZXIuZGljdCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9ta3ZfZXh0cmFjdG9yX2Z1enplci5kaWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzODE1ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbWt2X2V4dHJhY3Rvcl9mdXp6ZXIuZGljdApAQCAtMCwwICsxLDI0NCBAQAorIyBFbGVtZW50cyBJRCdzCitrdzE9Ilx4NDJceDg2Igora3cyPSJceDQyXHhGNyIKK2t3Mz0iXHg0Mlx4RjIiCitrdzQ9Ilx4NDJceEYzIgora3c1PSJceDQyXHg4NyIKK2t3Nj0iXHg0Mlx4ODUiCitrdzc9Ilx4MThceDUzXHg4MFx4NjciCitrdzg9Ilx4MTFceDREXHg5Qlx4NzQiCitrdzk9Ilx4NERceEJCIgora3cxMD0iXHg1M1x4QUIiCitrdzExPSJceDUzXHhBQyIKK2t3MTI9Ilx4MTVceDQ5XHhBOVx4NjYiCitrdzEzPSJceDczXHhBNCIKK2t3MTQ9Ilx4NzNceDg0Igora3cxNT0iXHgzQ1x4QjlceDIzIgora3cxNj0iXHgzQ1x4ODNceEFCIgora3cxNz0iXHgzQ1x4QjlceDIzIgora3cxOD0iXHgzRVx4ODNceEJCIgora3cxOT0iXHg0NFx4NDQiCitrdzIwPSJceDY5XHgyNCIKK2t3MjE9Ilx4NjlceEZDIgora3cyMj0iXHg2OVx4QkYiCitrdzIzPSJceDY5XHhBNSIKK2t3MjQ9Ilx4MkFceEQ3XHhCMSIKK2t3MjU9Ilx4NDRceDg5Igora3cyNj0iXHg0NFx4NjEiCitrdzI3PSJceDdCXHhBOSIKK2t3Mjg9Ilx4NERceDgwIgora3cyOT0iXHg1N1x4NDEiCitrdzMwPSJceDFGXHg0M1x4QjZceDc1Igora3czMT0iXHhFNyIKK2t3MzI9Ilx4NThceDU0Igora3czMz0iXHg1OFx4RDciCitrdzM0PSJceEE3Igora3czNT0iXHhBQiIKK2t3MzY9Ilx4QTMiCitrdzM3PSJceEEwIgora3czOD0iXHhBMSIKK2t3Mzk9Ilx4QTIiCitrdzQwPSJceDc1XHhBMSIKK2t3NDE9Ilx4MkFceEQ3XHhCMSIKK2t3NDI9Ilx4QTYiCitrdzQzPSJceEVFIgora3c0ND0iXHhBNSIKK2t3NDU9Ilx4OUEiCitrdzQ2PSJceEZBIgora3c0Nz0iXHhGQiIKK2t3NDg9Ilx4RkQiCitrdzQ5PSJceEE0Igora3c1MD0iXHg3NVx4QTIiCitrdzUxPSJceDhFIgora3c1Mj0iXHhFOCIKK2t3NTM9Ilx4Q0MiCitrdzU0PSJceENEIgora3c1NT0iXHhDQiIKK2t3NTY9Ilx4Q0UiCitrdzU3PSJceENGIgora3c1OD0iXHhDOCIKK2t3NTk9Ilx4QzkiCitrdzYwPSJceENBIgora3c2MT0iXHhBRiIKK2t3NjI9Ilx4MTZceDU0XHhBRVx4NkIiCitrdzYzPSJceEFFIgora3c2ND0iXHhENyIKK2t3NjU9Ilx4NzNceEM1Igora3c2Nj0iXHg4MyIKK2t3Njc9Ilx4QjkiCitrdzY4PSJceDg4Igora3c2OT0iXHg1NVx4QUEiCitrdzcwPSJceDlDIgora3c3MT0iXHg2RFx4RTciCitrdzcyPSJceDZEXHhGOCIKK2t3NzM9Ilx4MjNceEUzXHg4MyIKK2t3NzQ9Ilx4MjNceDRFXHg3QSIKK2t3NzU9Ilx4MjNceDMxXHg0RiIKK2t3NzY9Ilx4NTNceDdGIgora3c3Nz0iXHg1NVx4RUUiCitrdzc4PSJceDUzXHg2RSIKK2t3Nzk9Ilx4MjJceEI1XHg5QyIKK2t3ODA9Ilx4MjJceEI1XHg5RCIKK2t3ODE9Ilx4ODYiCitrdzgyPSJceDYzXHhBMiIKK2t3ODM9Ilx4MjVceDg2XHg4OCIKK2t3ODQ9Ilx4MjZceEIyXHg0MCIKK2t3ODU9Ilx4QUEiCitrdzg2PSJceDZGXHhBQiIKK2t3ODc9Ilx4NTZceEFBIgora3c4OD0iXHg1Nlx4QkIiCitrdzg5PSJceDY2XHgyNCIKK2t3OTA9Ilx4NjZceEZDIgora3c5MT0iXHg2Nlx4QkYiCitrdzkyPSJceEUwIgora3c5Mz0iXHg5QSIKK2t3OTQ9Ilx4OUQiCitrdzk1PSJceDUzXHhCOCIKK2t3OTY9Ilx4NTNceEMwIgora3c5Nz0iXHg1M1x4QjkiCitrdzk4PSJceEIwIgora3c5OT0iXHhCQSIKK2t3MTAwPSJceDU0XHhBQSIKK2t3MTAxPSJceDU0XHhCQiIKK2t3MTAyPSJceDU0XHhDQyIKK2t3MTAzPSJceDU0XHhERCIKK2t3MTA0PSJceDU0XHhCMCIKK2t3MTA1PSJceDU0XHhCQSIKK2t3MTA2PSJceDU0XHhCMiIKK2t3MTA3PSJceDU0XHhCMyIKK2t3MTA4PSJceDJFXHhCNVx4MjQiCitrdzEwOT0iXHgyRlx4QjVceDIzIgora3cxMTA9Ilx4MjNceDgzXHhFMyIKK2t3MTExPSJceDU1XHhCMCIKK2t3MTEyPSJceDU1XHhCMSIKK2t3MTEzPSJceDU1XHhCMiIKK2t3MTE0PSJceDU1XHhCMyIKK2t3MTE1PSJceDU1XHhCNCIKK2t3MTE2PSJceDU1XHhCNSIKK2t3MTE3PSJceDU1XHhCNiIKK2t3MTE4PSJceDU1XHhCNyIKK2t3MTE5PSJceDU1XHhCOCIKK2t3MTIwPSJceDU1XHhCOSIKK2t3MTIxPSJceDU1XHhCQSIKK2t3MTIyPSJceDU1XHhCQiIKK2t3MTIzPSJceDU1XHhCQyIKK2t3MTI0PSJceDU1XHhCRCIKK2t3MTI1PSJceDU1XHhEMCIKK2t3MTI2PSJceDU1XHhEMSIKK2t3MTI3PSJceDU1XHhEMiIKK2t3MTI4PSJceDU1XHhEMyIKK2t3MTI5PSJceDU1XHhENCIKK2t3MTMwPSJceDU1XHhENSIKK2t3MTMxPSJceDU1XHhENiIKK2t3MTMyPSJceDU1XHhENyIKK2t3MTMzPSJceDU1XHhEOCIKK2t3MTM0PSJceDU1XHhEOSIKK2t3MTM1PSJceDU1XHhEQSIKK2t3MTM2PSJceDc2XHg3MCIKK2t3MTM3PSJceDc2XHg3MSIKK2t3MTM4PSJceDc2XHg3MiIKK2t3MTM5PSJceDc2XHg3MyIKK2t3MTQwPSJceDc2XHg3NCIKK2t3MTQxPSJceDc2XHg3NSIKK2t3MTQyPSJceEUxIgora3cxNDM9Ilx4QjUiCitrdzE0ND0iXHg3OFx4QjUiCitrdzE0NT0iXHg5RiIKK2t3MTQ2PSJceDdEXHg3QiIKK2t3MTQ3PSJceDYyXHg2NCIKK2t3MTQ4PSJceEUyIgora3cxNDk9Ilx4RTMiCitrdzE1MD0iXHhFNCIKK2t3MTUxPSJceEU1Igora3cxNTI9Ilx4RTYiCitrdzE1Mz0iXHhFOSIKK2t3MTU0PSJceEVEIgora3cxNTU9Ilx4QzAiCitrdzE1Nj0iXHhDMSIKK2t3MTU3PSJceEM2Igora3cxNTg9Ilx4QzciCitrdzE1OT0iXHhDNCIKK2t3MTYwPSJceDZEXHg4MCIKK2t3MTYxPSJceDYyXHg0MCIKK2t3MTYyPSJceDUwXHgzMSIKK2t3MTYzPSJceDUwXHgzMiIKK2t3MTY0PSJceDUwXHgzMyIKK2t3MTY1PSJceDUwXHgzNCIKK2t3MTY2PSJceDUwXHgzNSIKK2t3MTY3PSJceDQyXHg1NCIKK2t3MTY4PSJceDQyXHg1NSIKK2t3MTY5PSJceDQ3XHhFMSIKK2t3MTcwPSJceDQ3XHhFMiIKK2t3MTcxPSJceDQ3XHhFNyIKK2t3MTcyPSJceDQ3XHhFOCIKK2t3MTczPSJceDQ3XHhFMyIKK2t3MTc0PSJceDQ3XHhFNCIKK2t3MTc1PSJceDQ3XHhFNSIKK2t3MTc2PSJceDQ3XHhFNiIKK2t3MTc3PSJceDFDXHg1M1x4QkJceDZCIgora3cxNzg9Ilx4QkIiCitrdzE3OT0iXHhCMyIKK2t3MTgwPSJceEI3Igora3cxODE9Ilx4RjciCitrdzE4Mj0iXHhGMSIKK2t3MTgzPSJceEYwIgora3cxODQ9Ilx4QjIiCitrdzE4NT0iXHg1M1x4NzgiCitrdzE4Nj0iXHhFQSIKK2t3MTg3PSJceERCIgora3cxODg9Ilx4OTYiCitrdzE4OT0iXHg5NyIKK2t3MTkwPSJceDUzXHg1RiIKK2t3MTkxPSJceEVCIgora3cxOTI9Ilx4MTlceDQxXHhBNFx4NjkiCitrdzE5Mz0iXHg0Nlx4N0UiCitrdzE5ND0iXHg0Nlx4NkUiCitrdzE5NT0iXHg0Nlx4NjAiCitrdzE5Nj0iXHg0Nlx4NUMiCitrdzE5Nz0iXHg0Nlx4QUUiCitrdzE5OD0iXHg0Nlx4NzUiCitrdzE5OT0iXHg0Nlx4NjEiCitrdzIwMD0iXHg0Nlx4NjIiCitrdzIwMT0iXHgxMFx4NDNceEE3XHg3MCIKK2t3MjAyPSJceDQ1XHhCOSIKK2t3MjAzPSJceDQ1XHhCQyIKK2t3MjA0PSJceDQ1XHhCRCIKK2t3MjA1PSJceDQ1XHhEQiIKK2t3MjA2PSJceDQ1XHhERCIKK2t3MjA3PSJceEI2Igora3cyMDg9Ilx4NzNceEM0Igora3cyMDk9Ilx4NTZceDU0Igora3cyMTA9Ilx4OTEiCitrdzIxMT0iXHg5MiIKK2t3MjEyPSJceDk4Igora3cyMTM9Ilx4NDVceDk4Igora3cyMTQ9Ilx4NkVceDY3Igora3cyMTU9Ilx4NkVceEJDIgora3cyMTY9Ilx4NjNceEMzIgora3cyMTc9Ilx4OEYiCitrdzIxOD0iXHg4OSIKK2t3MjE5PSJceDgwIgora3cyMjA9Ilx4ODUiCitrdzIyMT0iXHg0M1x4N0MiCitrdzIyMj0iXHg0M1x4N0QiCitrdzIyMz0iXHg0M1x4N0UiCitrdzIyND0iXHg2OVx4NDQiCitrdzIyNT0iXHg2OVx4NTUiCitrdzIyNj0iXHg0NVx4MEQiCitrdzIyNz0iXHg2OVx4MTEiCitrdzIyOD0iXHg2OVx4MjIiCitrdzIyOT0iXHg2OVx4MzMiCitrdzIzMD0iXHgxMlx4NTRceEMzXHg2NyIKK2t3MjMxPSJceDczXHg3MyIKK2t3MjMyPSJceDYzXHhDMCIKK2t3MjMzPSJceDY4XHhDQSIKK2t3MjM0PSJceDYzXHhDQSIKK2t3MjM1PSJceDYzXHhDNSIKK2t3MjM2PSJceDYzXHhDOSIKK2t3MjM3PSJceDY3XHhDOCIKK2t3MjM4PSJceDQ1XHhBMyIKK2t3MjM5PSJceDQ0XHg3QSIKK2t3MjQwPSJceDQ0XHg3QiIKK2t3MjQxPSJceDQ0XHg4NCIKK2t3MjQyPSJceDQ0XHg4NyIKK2t3MjQzPSJceDQ0XHg4NSIKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9tcDNfZXh0cmFjdG9yX2Z1enplci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXAzX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNDdjMTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXAzX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSAiRXh0cmFjdG9yRnV6emVyQmFzZS5oIgorCisjaW5jbHVkZSAiTVAzRXh0cmFjdG9yLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyBNcDNFeHRyYWN0b3IgOiBwdWJsaWMgRXh0cmFjdG9yRnV6emVyQmFzZSB7CisgcHVibGljOgorICBNcDNFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisgIH5NcDNFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBjcmVhdGVFeHRyYWN0b3IoKTsKK307CisKK2Jvb2wgTXAzRXh0cmFjdG9yOjpjcmVhdGVFeHRyYWN0b3IoKSB7CisgIG1FeHRyYWN0b3IgPSBuZXcgTVAzRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKG1EYXRhU291cmNlLT53cmFwKCkpLCBudWxscHRyKTsKKyAgaWYgKCFtRXh0cmFjdG9yKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1FeHRyYWN0b3ItPm5hbWUoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCghZGF0YSkgfHwgKHNpemUgPT0gMCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBNcDNFeHRyYWN0b3IqIGV4dHJhY3RvciA9IG5ldyBNcDNFeHRyYWN0b3IoKTsKKyAgaWYgKGV4dHJhY3RvcikgeworICAgIGV4dHJhY3Rvci0+cHJvY2Vzc0RhdGEoZGF0YSwgc2l6ZSk7CisgICAgZGVsZXRlIGV4dHJhY3RvcjsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9tcDRfZXh0cmFjdG9yX2Z1enplci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXA0X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MDM1MTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXA0X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNTYgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSAiRXh0cmFjdG9yRnV6emVyQmFzZS5oIgorCisjaW5jbHVkZSAiTVBFRzRFeHRyYWN0b3IuaCIKKyNpbmNsdWRlICJTYW1wbGVUYWJsZS5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY2xhc3MgTVA0RXh0cmFjdG9yIDogcHVibGljIEV4dHJhY3RvckZ1enplckJhc2UgeworIHB1YmxpYzoKKyAgTVA0RXh0cmFjdG9yKCkgPSBkZWZhdWx0OworICB+TVA0RXh0cmFjdG9yKCkgPSBkZWZhdWx0OworCisgIGJvb2wgY3JlYXRlRXh0cmFjdG9yKCk7Cit9OworCitib29sIE1QNEV4dHJhY3Rvcjo6Y3JlYXRlRXh0cmFjdG9yKCkgeworICBtRXh0cmFjdG9yID0gbmV3IE1QRUc0RXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKG1EYXRhU291cmNlLT53cmFwKCkpKTsKKyAgaWYgKCFtRXh0cmFjdG9yKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1FeHRyYWN0b3ItPm5hbWUoKTsKKyAgc2V0RGF0YVNvdXJjZUZsYWdzKERhdGFTb3VyY2VCYXNlOjprV2FudHNQcmVmZXRjaGluZyB8IERhdGFTb3VyY2VCYXNlOjprSXNDYWNoaW5nRGF0YVNvdXJjZSk7CisgIHJldHVybiB0cnVlOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmICgoIWRhdGEpIHx8IChzaXplID09IDApKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgTVA0RXh0cmFjdG9yKiBleHRyYWN0b3IgPSBuZXcgTVA0RXh0cmFjdG9yKCk7CisgIGlmIChleHRyYWN0b3IpIHsKKyAgICBleHRyYWN0b3ItPnByb2Nlc3NEYXRhKGRhdGEsIHNpemUpOworICAgIGRlbGV0ZSBleHRyYWN0b3I7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXA0X2V4dHJhY3Rvcl9mdXp6ZXIuZGljdCBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9tcDRfZXh0cmFjdG9yX2Z1enplci5kaWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ODM2NDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXA0X2V4dHJhY3Rvcl9mdXp6ZXIuZGljdApAQCAtMCwwICsxLDI0OCBAQAorIyBNUDQgQXRvbXMvQm94ZXMKK2t3MT0iZnR5cCIKK2t3Mj0iZnJlZSIKK2t3Mz0ibWRhdCIKK2t3ND0ibW9vdiIKK2t3NT0ibXZoZCIKK2t3Nj0idHJhayIKK2t3Nz0idGtoZCIKK2t3OD0iZWR0cyIKK2t3OT0iZWxzdCIKK2t3MTA9Im1kaWEiCitrdzExPSJtZGhkIgora3cxMj0iaGRsciIKK2t3MTM9Im1pbmYiCitrdzE0PSJ2bWhkIgora3cxNT0iZGluZiIKK2t3MTY9ImRyZWYiCitrdzE3PSJ1cmwgIgora3cxOD0ic3RibCIKK2t3MTk9InN0c2QiCitrdzIwPSJhdmMxIgora3cyMT0iYXZjQyIKK2t3MjI9InN0dHMiCitrdzIzPSJzdHNzIgora3cyND0iY3R0cyIKK2t3MjU9InN0c2MiCitrdzI2PSJzdHN6Igora3cyNz0ic3RjbyIKK2t3Mjg9Im1wNGEiCitrdzI5PSJlc2RzIgora3czMD0idWR0YSIKK2t3MzE9Im1ldGEiCitrdzMyPSJpbHN0Igora3czMz0ic2FtciIKK2t3MzQ9InNhd2IiCitrdzM1PSJlYy0zIgora3czNj0ibXA0diIKK2t3Mzc9InMyNjMiCitrdzM4PSJoMjYzIgora3czOT0iSDI2MyIKK2t3NDA9ImF2YzEiCitrdzQxPSJodmMxIgora3c0Mj0iaGV2MSIKK2t3NDM9ImFjLTQiCitrdzQ0PSJPcHVzIgora3c0NT0idHdvcyIKK2t3NDY9InNvd3QiCitrdzQ3PSJhbGFjIgora3c0OD0iZkxhQyIKK2t3NDk9ImF2MDEiCitrdzUwPSIubXAzIgora3c1MT0ia2V5cyIKK2t3NTI9ImNwcnQiCitrdzUzPSJjb3ZyIgora3c1ND0ibXZleCIKK2t3NTU9Im1vb2YiCitrdzU2PSJ0cmFmIgora3c1Nz0ibWZyYSIKK2t3NTg9InNpbmYiCitrdzU5PSJzY2hpIgora3c2MD0id2F2ZSIKK2t3NjE9InNjaG0iCitrdzYyPSJjYmMxIgora3c2Mz0iY2JjcyIKK2t3NjQ9ImNlbmMiCitrdzY1PSJjZW5zIgora3c2Nj0iZnJtYSIKK2t3Njc9InRlbmMiCitrdzY4PSJ0cmVmIgora3c2OT0idGhtYiIKK2t3NzA9InBzc2giCitrdzcxPSJtZXR0Igora3c3Mj0iZW5jYSIKK2t3NzM9ImVuY3YiCitrdzc0PSJjbzY0Igora3c3NT0ic3R6MiIKK2t3NzY9Ilx4QTl4eXoiCitrdzc3PSJidHJ0Igora3c3OD0iaHZjQyIKK2t3Nzk9ImF2MUMiCitrdzgwPSJkMjYzIgora3c4MT0iaWxvYyIKK2t3ODI9ImlpbmYiCitrdzgzPSJpcHJwIgora3c4ND0icGl0bSIKK2t3ODU9ImlkYXQiCitrdzg2PSJpcmVmIgora3c4Nz0iaXBybyIKK2t3ODg9Im1lYW4iCitrdzg5PSJuYW1lIgora3c5MD0iZGF0YSIKK2t3OTE9Im1laGQiCitrdzkyPSJ0ZXh0Igora3c5Mz0ic2J0bCIKK2t3OTQ9InRyZXgiCitrdzk1PSJ0eDNnIgora3c5Nj0iY29sciIKK2t3OTc9InRpdGwiCitrdzk4PSJwZXJmIgora3c5OT0iYXV0aCIKK2t3MTAwPSJnbnJlIgora3cxMDE9ImFsYm0iCitrdzEwMj0ieXJyYyIKK2t3MTAzPSJJRDMyIgora3cxMDQ9Ii0tLS0iCitrdzEwNT0ic2lkeCIKK2t3MTA2PSJhYy0zIgora3cxMDc9InF0ICAiCitrdzEwOD0ibWlmMSIKK2t3MTA5PSJoZWljIgora3cxMTA9ImRhYzQiCitrdzExMT0iZGVjMyIKK2t3MTEyPSJkYWMzIgora3cxMTM9Ilx4QTlhbGIiCitrdzExND0iXHhBOUFSVCIKK2t3MTE1PSJhQVJUIgora3cxMTY9Ilx4QTlkYXkiCitrdzExNz0iXHhBOW5hbSIKK2t3MTE4PSJceEE5d3J0Igora3cxMTk9Ilx4QTlnZW4iCitrdzEyMD0iY3BpbCIKK2t3MTIxPSJ0cmtuIgora3cxMjI9ImRpc2siCitrdzEyMz0ibmNseCIKK2t3MTI0PSJuY2xjIgora3cxMjU9InRmaGQiCitrdzEyNj0idHJ1biIKK2t3MTI3PSJzYWl6Igora3cxMjg9InNhaW8iCitrdzEyOT0ic2VuYyIKK2t3MTMwPSJpc29tIgora3cxMzE9ImlzbzIiCitrdzEzMj0iM2dwNCIKK2t3MTMzPSJtcDQxIgora3cxMzQ9Im1wNDIiCitrdzEzNT0iZGFzaCIKK2t3MTM2PSJudnIxIgora3cxMzc9Ik1TTlYiCitrdzEzOD0id21mICIKK2t3MTM5PSIzZzJhIgora3cxNDA9IjNnMmIiCitrdzE0MT0ibXNmMSIKK2t3MTQyPSJoZXZjIgora3cxNDM9InBkaW4iCitrdzE0ND0idHJnciIKK2t3MTQ1PSJzbWhkIgora3cxNDY9ImhtaGQiCitrdzE0Nz0ibm1oZCIKK2t3MTQ4PSJjc2xnIgora3cxNDk9InN0c2giCitrdzE1MD0icGFkYiIKK2t3MTUxPSJzdGRwIgora3cxNTI9InNkdHAiCitrdzE1Mz0ic2JncCIKK2t3MTU0PSJzZ3BkIgora3cxNTU9InN1YnMiCitrdzE1Nj0ibGV2YSIKK2t3MTU3PSJtZmhkIgora3cxNTg9InRmZHQiCitrdzE1OT0idGZyYSIKK2t3MTYwPSJtZnJvIgora3cxNjE9InNraXAiCitrdzE2Mj0idHNlbCIKK2t3MTYzPSJzdHJrIgora3cxNjQ9InN0cmkiCitrdzE2NT0ic3RyZCIKK2t3MTY2PSJ4bWwgIgora3cxNjc9ImJ4bWwiCitrdzE2OD0iZmlpbiIKK2t3MTY5PSJwYWVuIgora3cxNzA9ImZpcmUiCitrdzE3MT0iZnBhciIKK2t3MTcyPSJmZWNyIgora3cxNzM9InNlZ3IiCitrdzE3ND0iZ2l0biIKK2t3MTc1PSJtZWNvIgora3cxNzY9Im1lcmUiCitrdzE3Nz0ic3R5cCIKK2t3MTc4PSJzc2l4Igora3cxNzk9InByZnQiCitrdzE4MD0iaGludCIKK2t3MTgxPSJjZHNjIgora3cxODI9ImhpbmQiCitrdzE4Mz0idmRlcCIKK2t3MTg0PSJ2cGx4Igora3cxODU9Im1zcmMiCitrdzE4Nj0idXJuICIKK2t3MTg3PSJlbmN0Igora3cxODg9ImVuY3MiCitrdzE4OT0icmluZiIKK2t3MTkwPSJzcnBwIgora3cxOTE9InN0c2ciCitrdzE5Mj0ic3R2aSIKK2t3MTkzPSJ0aW1zIgora3cxOTQ9InRzcm8iCitrdzE5NT0ic25ybyIKK2t3MTk2PSJydHAgIgora3cxOTc9InNydHAiCitrdzE5OD0icnRwbyIKK2t3MTk5PSJobnRpIgora3cyMDA9InNkcCAiCitrdzIwMT0idHJweSIKK2t3MjAyPSJudW1wIgora3cyMDM9InRweWwiCitrdzIwND0idG90bCIKK2t3MjA1PSJucGNrIgora3cyMDY9InRwYXkiCitrdzIwNz0ibWF4ciIKK2t3MjA4PSJkbWVkIgora3cyMDk9ImRpbW0iCitrdzIxMD0iZHJlcCIKK2t3MjExPSJ0bWluIgora3cyMTI9InRtYXgiCitrdzIxMz0icG1heCIKK2t3MjE0PSJkbWF4Igora3cyMTU9InBheXQiCitrdzIxNj0iZmRwICIKK2t3MjE3PSJmZHNhIgora3cyMTg9ImZkcGEiCitrdzIxOT0iZXh0ciIKK2t3MjIwPSJmZWNpIgora3cyMjE9InJtMnQiCitrdzIyMj0ic20ydCIKK2t3MjIzPSJ0UEFUIgora3cyMjQ9InRQTVQiCitrdzIyNT0idE9EICIKK2t3MjI2PSJ0c3RpIgora3cyMjc9ImlzdG0iCitrdzIyOD0icG0ydCIKK2t3MjI5PSJycnRwIgora3cyMzA9InJzc3IiCitrdzIzMT0icnNjciIKK2t3MjMyPSJyc3JwIgora3cyMzM9InJzc3IiCitrdzIzND0iY2NpZCIKK2t3MjM1PSJzcm9jIgora3cyMzY9InBydHAiCitrdzIzNz0icm9sbCIKK2t3MjM4PSJyYXNoIgora3cyMzk9ImFsc3QiCitrdzI0MD0icmFwICIKK2t3MjQxPSJ0ZWxlIgora3cyNDI9Im1wNzEiCitrdzI0Mz0iaXNvMyIKK2t3MjQ0PSJpc280Igora3cyNDU9ImlzbzUiCitrdzI0Nj0icmVzdiIKK2t3MjQ3PSJpc282IgpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21wZWcyX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21wZWcyX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MGVmNjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXBlZzJfZXh0cmFjdG9yX2Z1enplci5jcHAKQEAgLTAsMCArMSw2MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKKyNpbmNsdWRlICJFeHRyYWN0b3JGdXp6ZXJCYXNlLmgiCisKKyNpZmRlZiBNUEVHMlBTCisjaW5jbHVkZSAiTVBFRzJQU0V4dHJhY3Rvci5oIgorI2Vsc2UKKyNpbmNsdWRlICJNUEVHMlRTRXh0cmFjdG9yLmgiCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIE1QRUcyRXh0cmFjdG9yIDogcHVibGljIEV4dHJhY3RvckZ1enplckJhc2UgeworIHB1YmxpYzoKKyAgTVBFRzJFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisgIH5NUEVHMkV4dHJhY3RvcigpID0gZGVmYXVsdDsKKworICBib29sIGNyZWF0ZUV4dHJhY3RvcigpOworfTsKKworYm9vbCBNUEVHMkV4dHJhY3Rvcjo6Y3JlYXRlRXh0cmFjdG9yKCkgeworI2lmZGVmIE1QRUcyUFMKKyAgbUV4dHJhY3RvciA9IG5ldyBNUEVHMlBTRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKG1EYXRhU291cmNlLT53cmFwKCkpKTsKKyNlbHNlCisgIG1FeHRyYWN0b3IgPSBuZXcgTVBFRzJUU0V4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihtRGF0YVNvdXJjZS0+d3JhcCgpKSk7CisjZW5kaWYKKyAgaWYgKCFtRXh0cmFjdG9yKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1FeHRyYWN0b3ItPm5hbWUoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCghZGF0YSkgfHwgKHNpemUgPT0gMCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBNUEVHMkV4dHJhY3RvciogZXh0cmFjdG9yID0gbmV3IE1QRUcyRXh0cmFjdG9yKCk7CisgIGlmIChleHRyYWN0b3IpIHsKKyAgICBleHRyYWN0b3ItPnByb2Nlc3NEYXRhKGRhdGEsIHNpemUpOworICAgIGRlbGV0ZSBleHRyYWN0b3I7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXBlZzJwc19leHRyYWN0b3JfZnV6emVyLmRpY3QgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXBlZzJwc19leHRyYWN0b3JfZnV6emVyLmRpY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlkMzkwYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9tcGVnMnBzX2V4dHJhY3Rvcl9mdXp6ZXIuZGljdApAQCAtMCwwICsxLDIgQEAKKyMgU3RhcnQgY29kZSAoYnl0ZXMgMC0zKQora3cxPSJceDAwXHgwMFx4MDFceEJBIgpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21wZWcydHNfZXh0cmFjdG9yX2Z1enplci5kaWN0IGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL21wZWcydHNfZXh0cmFjdG9yX2Z1enplci5kaWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNmExZWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvbXBlZzJ0c19leHRyYWN0b3JfZnV6emVyLmRpY3QKQEAgLTAsMCArMSwyIEBACisjIFN0YXJ0IGJ5dGUKK2t3MT0iXHg0NyIKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9vZ2dfZXh0cmFjdG9yX2Z1enplci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvb2dnX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMmZjYzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvb2dnX2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSAiRXh0cmFjdG9yRnV6emVyQmFzZS5oIgorCisjaW5jbHVkZSAiT2dnRXh0cmFjdG9yLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyBPR0dFeHRyYWN0b3IgOiBwdWJsaWMgRXh0cmFjdG9yRnV6emVyQmFzZSB7CisgcHVibGljOgorICBPR0dFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisgIH5PR0dFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBjcmVhdGVFeHRyYWN0b3IoKTsKK307CisKK2Jvb2wgT0dHRXh0cmFjdG9yOjpjcmVhdGVFeHRyYWN0b3IoKSB7CisgIG1FeHRyYWN0b3IgPSBuZXcgT2dnRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKG1EYXRhU291cmNlLT53cmFwKCkpKTsKKyAgaWYgKCFtRXh0cmFjdG9yKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1FeHRyYWN0b3ItPm5hbWUoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCghZGF0YSkgfHwgKHNpemUgPT0gMCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBPR0dFeHRyYWN0b3IqIGV4dHJhY3RvciA9IG5ldyBPR0dFeHRyYWN0b3IoKTsKKyAgaWYgKGV4dHJhY3RvcikgeworICAgIGV4dHJhY3Rvci0+cHJvY2Vzc0RhdGEoZGF0YSwgc2l6ZSk7CisgICAgZGVsZXRlIGV4dHJhY3RvcjsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9vZ2dfZXh0cmFjdG9yX2Z1enplci5kaWN0IGIvbWVkaWEvZXh0cmFjdG9ycy9mdXp6ZXJzL29nZ19leHRyYWN0b3JfZnV6emVyLmRpY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYyZmMzOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy9vZ2dfZXh0cmFjdG9yX2Z1enplci5kaWN0CkBAIC0wLDAgKzEsMyBAQAorIyBTdGFydCBjb2RlKGJ5dGVzIDAtMykKKyMgVGhlIGJlbG93IDQgYnl0ZXMgY29ycmVzcG9uZCB0byAiT2dnUyIgaW4gQVNDSUkKK2t3MT0iXHg0Rlx4NjdceDY3XHg1MyIKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZnV6emVycy93YXZfZXh0cmFjdG9yX2Z1enplci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvd2F2X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMTFlYmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2Z1enplcnMvd2F2X2V4dHJhY3Rvcl9mdXp6ZXIuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSAiRXh0cmFjdG9yRnV6emVyQmFzZS5oIgorCisjaW5jbHVkZSAiV0FWRXh0cmFjdG9yLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyB3YXZFeHRyYWN0b3IgOiBwdWJsaWMgRXh0cmFjdG9yRnV6emVyQmFzZSB7CisgcHVibGljOgorICB3YXZFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisgIH53YXZFeHRyYWN0b3IoKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBjcmVhdGVFeHRyYWN0b3IoKTsKK307CisKK2Jvb2wgd2F2RXh0cmFjdG9yOjpjcmVhdGVFeHRyYWN0b3IoKSB7CisgIG1FeHRyYWN0b3IgPSBuZXcgV0FWRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKG1EYXRhU291cmNlLT53cmFwKCkpKTsKKyAgaWYgKCFtRXh0cmFjdG9yKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG1FeHRyYWN0b3ItPm5hbWUoKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgaWYgKCghZGF0YSkgfHwgKHNpemUgPT0gMCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICB3YXZFeHRyYWN0b3IqIGV4dHJhY3RvciA9IG5ldyB3YXZFeHRyYWN0b3IoKTsKKyAgaWYgKGV4dHJhY3RvcikgeworICAgIGV4dHJhY3Rvci0+cHJvY2Vzc0RhdGEoZGF0YSwgc2l6ZSk7CisgICAgZGVsZXRlIGV4dHJhY3RvcjsKKyAgfQorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbWt2L0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9BbmRyb2lkLmJwCmluZGV4IDdhZDhjYzEuLjMzMGQ0ZmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbWt2L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvQW5kcm9pZC5icApAQCAtMjEsNCArMjEsMTIgQEAKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKaW5kZXggYjg4ZTRlOC4uZmQ2YThjNiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmNwcApAQCAtMTg4OCwxMyArMTg4OCwxMiBAQAogCiAgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHRyYWNrLT5HZXRDb250ZW50RW5jb2RpbmdDb3VudCgpOyBpKyspIHsKICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpDb250ZW50RW5jb2RpbmcgKmVuY29kaW5nID0gdHJhY2stPkdldENvbnRlbnRFbmNvZGluZ0J5SW5kZXgoaSk7Ci0gICAgICAgIGZvcihzaXplX3QgaiA9IDA7IGogPCBlbmNvZGluZy0+R2V0RW5jcnlwdGlvbkNvdW50KCk7IGorKykgeworICAgICAgICBpZiAoZW5jb2RpbmctPkdldEVuY3J5cHRpb25Db3VudCgpID4gMCkgewogICAgICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpDb250ZW50RW5jb2Rpbmc6OkNvbnRlbnRFbmNyeXB0aW9uICplbmNyeXB0aW9uOwotICAgICAgICAgICAgZW5jcnlwdGlvbiA9IGVuY29kaW5nLT5HZXRFbmNyeXB0aW9uQnlJbmRleChqKTsKKyAgICAgICAgICAgIGVuY3J5cHRpb24gPSBlbmNvZGluZy0+R2V0RW5jcnlwdGlvbkJ5SW5kZXgoMCk7CiAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKHRyYWNrSW5mby0+bU1ldGEsCiAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSwgZW5jcnlwdGlvbi0+a2V5X2lkLCBlbmNyeXB0aW9uLT5rZXlfaWRfbGVuKTsKICAgICAgICAgICAgIHRyYWNrSW5mby0+bUVuY3J5cHRlZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGZvcihzaXplX3QgaiA9IDA7IGogPCBlbmNvZGluZy0+R2V0Q29tcHJlc3Npb25Db3VudCgpOyBqKyspIHsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9BbmRyb2lkLmJwCmluZGV4IDEwMmFjODEuLjdkNzA1NDggMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvQW5kcm9pZC5icApAQCAtMTMsNCArMTMsMTEgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgIF0sCiAKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQW5kcm9pZC5icAppbmRleCBlNDhlMWI3Li5hZmEwNTVmIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FuZHJvaWQuYnAKQEAgLTE2LDQgKzE2LDEyIEBACiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9pZDMiLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCisKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKworICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmNwcAppbmRleCAwNzczMzg3Li4yNTk5YzJjIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5jcHAKQEAgLTU0NiwxMSArNTQ2LDExIEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigiSW1hZ2UgaXRlbSBpZCAlZCB1c2VzIHRodW1ibmFpbCBpdGVtIGlkICVkIiwgbVJlZnNbaV0sIG1JdGVtSWQpOwotICAgICAgICAgICAgSW1hZ2VJdGVtICZtYXN0ZXJJbWFnZSA9IGl0ZW1JZFRvSXRlbU1hcC5lZGl0VmFsdWVBdChpdGVtSW5kZXgpOwotICAgICAgICAgICAgaWYgKCFtYXN0ZXJJbWFnZS50aHVtYm5haWxzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEltYWdlSXRlbSAmaW1hZ2VJdGVtID0gaXRlbUlkVG9JdGVtTWFwLmVkaXRWYWx1ZUF0KGl0ZW1JbmRleCk7CisgICAgICAgICAgICBpZiAoIWltYWdlSXRlbS50aHVtYm5haWxzLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiYWxyZWFkeSBoYXMgdGh1bWJuYWlscyEiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1hc3RlckltYWdlLnRodW1ibmFpbHMucHVzaF9iYWNrKG1JdGVtSWQpOworICAgICAgICAgICAgaW1hZ2VJdGVtLnRodW1ibmFpbHMucHVzaF9iYWNrKG1JdGVtSWQpOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTkyOSw3ICs5MjksNyBAQAogCiBzdGF0dXNfdCBJcGNvQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKICAgICBBTE9HVigiJXM6IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIF9fRlVOQ1RJT05fXywgKGxvbmcgbG9uZylvZmZzZXQsIHNpemUpOwotICAgIC8vIHB1c2ggZHVtbXkgYXMgdGhlIGluZGV4IGlzIDEtYmFzZWQKKyAgICAvLyBwdXNoIGEgcGxhY2Vob2xkZXIgYXMgdGhlIGluZGV4IGlzIDEtYmFzZWQKICAgICBtSXRlbVByb3BlcnRpZXMtPnB1c2hfYmFjayhuZXcgSXRlbVByb3BlcnR5KCkpOwogICAgIHJldHVybiBwYXJzZUNodW5rcyhvZmZzZXQsIHNpemUpOwogfQpAQCAtMTYxNCwxNyArMTYxNCwxNyBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHVpbnQzMl90IG1hc3Rlckl0ZW1JbmRleCA9IG1EaXNwbGF5YWJsZXNbaW1hZ2VJbmRleF07CisgICAgdWludDMyX3QgaW1hZ2VJdGVtSW5kZXggPSBtRGlzcGxheWFibGVzW2ltYWdlSW5kZXhdOwogCi0gICAgY29uc3QgSW1hZ2VJdGVtICZtYXN0ZXJJbWFnZSA9IG1JdGVtSWRUb0l0ZW1NYXBbbWFzdGVySXRlbUluZGV4XTsKLSAgICBpZiAobWFzdGVySW1hZ2UudGh1bWJuYWlscy5lbXB0eSgpKSB7Ci0gICAgICAgICppdGVtSW5kZXggPSBtYXN0ZXJJdGVtSW5kZXg7CisgICAgY29uc3QgSW1hZ2VJdGVtICZpbWFnZUl0ZW0gPSBtSXRlbUlkVG9JdGVtTWFwW2ltYWdlSXRlbUluZGV4XTsKKyAgICBpZiAoaW1hZ2VJdGVtLnRodW1ibmFpbHMuZW1wdHkoKSkgeworICAgICAgICAqaXRlbUluZGV4ID0gaW1hZ2VJdGVtSW5kZXg7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICBzc2l6ZV90IHRodW1iSXRlbUluZGV4ID0gbUl0ZW1JZFRvSXRlbU1hcC5pbmRleE9mS2V5KG1hc3RlckltYWdlLnRodW1ibmFpbHNbMF0pOworICAgIHNzaXplX3QgdGh1bWJJdGVtSW5kZXggPSBtSXRlbUlkVG9JdGVtTWFwLmluZGV4T2ZLZXkoaW1hZ2VJdGVtLnRodW1ibmFpbHNbMF0pOwogICAgIGlmICh0aHVtYkl0ZW1JbmRleCA8IDApIHsKLSAgICAgICAgLy8gRG8gbm90IHJldHVybiB0aGUgbWFzdGVyIGltYWdlIGluIHRoaXMgY2FzZSwgZmFpbCBpdCBzbyB0aGF0IHRoZQorICAgICAgICAvLyBEbyBub3QgcmV0dXJuIHRoZSBpbWFnZSBpdGVtIGluIHRoaXMgY2FzZSwgZmFpbCBpdCBzbyB0aGF0IHRoZQogICAgICAgICAvLyB0aHVtYm5haWwgZXh0cmFjdGlvbiBjb2RlIGtub3dzIHdlIHJlYWxseSBkb24ndCBoYXZlIGl0LgogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggYTk3NmEyYi4uNjViYTM4MgotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwCkBAIC0zNzIsNiArMzcyLDggQEAKICAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDOwogICAgICAgICBjYXNlIEZPVVJDQygiYXYwMSIpOgogICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMTsKKyAgICAgICAgY2FzZSBGT1VSQ0MoInZwMDkiKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19WUDk7CiAgICAgICAgIGNhc2UgRk9VUkNDKCIubXAzIik6CiAgICAgICAgIGNhc2UgMHg2RDczMDA1NTogLy8gIm1zIFUiIG1wMyBhdWRpbwogICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUc7CkBAIC0xMTQ5LDcgKzExNTEsNyBAQAogICAgICAgICAgICAgfSBlbHNlIGlmIChjaHVua190eXBlID09IEZPVVJDQygibW9vdiIpKSB7CiAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IE9LOwogCi0gICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7ICAvLyBSZXR1cm4gYSBkdW1teSBlcnJvci4KKyAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsgIC8vIFJldHVybiBhIGdlbmVyaWMgZXJyb3IuCiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTc4Nyw3ICsxNzg5LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHVpbnQxNl90IGRhdGFfcmVmX2luZGV4IF9fdW51c2VkID0gVTE2X0FUKCZidWZmZXJbNl0pOworICAgICAgICAgICAgLy8gd2UgY2FuIGdldCBkYXRhX3JlZl9pbmRleCB2YWx1ZSBmcm9tIFUxNl9BVCgmYnVmZmVyWzZdKQogICAgICAgICAgICAgdWludDE2X3QgdmVyc2lvbiA9IFUxNl9BVCgmYnVmZmVyWzhdKTsKICAgICAgICAgICAgIHVpbnQzMl90IG51bV9jaGFubmVscyA9IFUxNl9BVCgmYnVmZmVyWzE2XSk7CiAKQEAgLTE5NzIsNiArMTk3NCw3IEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCJkdmgxIik6CiAgICAgICAgIGNhc2UgRk9VUkNDKCJkYXYxIik6CiAgICAgICAgIGNhc2UgRk9VUkNDKCJhdjAxIik6CisgICAgICAgIGNhc2UgRk9VUkNDKCJ2cDA5Iik6CiAgICAgICAgIHsKICAgICAgICAgICAgIHVpbnQ4X3QgYnVmZmVyWzc4XTsKICAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPCAoc3NpemVfdClzaXplb2YoYnVmZmVyKSkgewpAQCAtMTk4NCw3ICsxOTg3LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHVpbnQxNl90IGRhdGFfcmVmX2luZGV4IF9fdW51c2VkID0gVTE2X0FUKCZidWZmZXJbNl0pOworICAgICAgICAgICAgLy8gd2UgY2FuIGdldCBkYXRhX3JlZl9pbmRleCB2YWx1ZSBmcm9tIFUxNl9BVCgmYnVmZmVyWzZdKQogICAgICAgICAgICAgdWludDE2X3Qgd2lkdGggPSBVMTZfQVQoJmJ1ZmZlcls2ICsgMThdKTsKICAgICAgICAgICAgIHVpbnQxNl90IGhlaWdodCA9IFUxNl9BVCgmYnVmZmVyWzYgKyAyMF0pOwogCkBAIC0yNDM0LDYgKzI0MzcsOCBAQAogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KKworICAgICAgICBjYXNlIEZPVVJDQygidnBjQyIpOgogICAgICAgICBjYXNlIEZPVVJDQygiYXYxQyIpOgogICAgICAgICB7CiAgICAgICAgICAgICBhdXRvIGJ1ZmZlciA9IGhlYXBidWZmZXI8dWludDhfdD4oY2h1bmtfZGF0YV9zaXplKTsKQEAgLTM0MDcsNyArMzQxMiw3IEBACiAgICAgfQogCiAgICAgLy8gc2tpcAotICAgIHVuc2lnbmVkIGJzbW9kIF9fdW51c2VkID0gYnIuZ2V0Qml0cygzKTsKKyAgICBici5za2lwQml0cygzKTsgLy8gYnNtb2QKIAogICAgIHVuc2lnbmVkIGFjbW9kID0gYnIuZ2V0Qml0cygzKTsKICAgICB1bnNpZ25lZCBsZmVvbiA9IGJyLmdldEJpdHMoMSk7CkBAIC0zNzE4LDE5ICszNzIzLDE4IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICB9CiAKLSAgICB1aW50NjRfdCBjdGltZSBfX3VudXNlZCwgbXRpbWUgX191bnVzZWQsIGR1cmF0aW9uIF9fdW51c2VkOwogICAgIGludDMyX3QgaWQ7CiAKICAgICBpZiAodmVyc2lvbiA9PSAxKSB7Ci0gICAgICAgIGN0aW1lID0gVTY0X0FUKCZidWZmZXJbNF0pOwotICAgICAgICBtdGltZSA9IFU2NF9BVCgmYnVmZmVyWzEyXSk7CisgICAgICAgIC8vIHdlIGNhbiBnZXQgY3RpbWUgdmFsdWUgZnJvbSBVNjRfQVQoJmJ1ZmZlcls0XSkKKyAgICAgICAgLy8gd2UgY2FuIGdldCBtdGltZSB2YWx1ZSBmcm9tIFU2NF9BVCgmYnVmZmVyWzEyXSkKICAgICAgICAgaWQgPSBVMzJfQVQoJmJ1ZmZlclsyMF0pOwotICAgICAgICBkdXJhdGlvbiA9IFU2NF9BVCgmYnVmZmVyWzI4XSk7CisgICAgICAgIC8vIHdlIGNhbiBnZXQgZHVyYXRpb24gdmFsdWUgZnJvbSBVNjRfQVQoJmJ1ZmZlclsyOF0pCiAgICAgfSBlbHNlIGlmICh2ZXJzaW9uID09IDApIHsKLSAgICAgICAgY3RpbWUgPSBVMzJfQVQoJmJ1ZmZlcls0XSk7Ci0gICAgICAgIG10aW1lID0gVTMyX0FUKCZidWZmZXJbOF0pOworICAgICAgICAvLyB3ZSBjYW4gZ2V0IGN0aW1lIHZhbHVlIGZyb20gVTMyX0FUKCZidWZmZXJbNF0pCisgICAgICAgIC8vIHdlIGNhbiBnZXQgbXRpbWUgdmFsdWUgZnJvbSBVMzJfQVQoJmJ1ZmZlcls4XSkKICAgICAgICAgaWQgPSBVMzJfQVQoJmJ1ZmZlclsxMl0pOwotICAgICAgICBkdXJhdGlvbiA9IFUzMl9BVCgmYnVmZmVyWzIwXSk7CisgICAgICAgIC8vIHdlIGNhbiBnZXQgZHVyYXRpb24gdmFsdWUgZnJvbSBVMzJfQVQoJmJ1ZmZlclsyMF0pCiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KQEAgLTQzMzcsNiArNDM0MSwxOCBAQAogICAgICAgICBpZiAoc2l6ZSA8IDUgfHwgcHRyWzBdICE9IDB4ODEpIHsgIC8vIGNvbmZpZ3VyYXRpb25WZXJzaW9uID09IDEKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19WUDkpKSB7CisgICAgICAgIHZvaWQgKmRhdGE7CisgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqcHRyID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOworCisgICAgICAgIGlmIChzaXplIDwgNSB8fCBwdHJbMF0gIT0gMHgwMSkgeyAgLy8gY29uZmlndXJhdGlvblZlcnNpb24gPT0gMQorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KICAgICB9CiAKICAgICBBTE9HVigidHJhY2stPmVsc3Rfc2hpZnRfc3RhcnRfdGlja3MgOiUiIFBSSXU2NCwgdHJhY2stPmVsc3Rfc2hpZnRfc3RhcnRfdGlja3MpOwpAQCAtNDM5MSw2ICs0NDA3LDEwIEBACiAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgJmRhdGEsICZzaXplKSkgewogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fVlA5KSkgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KQogICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpCiAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpKSB7CkBAIC00NjM4LDE4ICs0NjU4LDE3IEBACiAgICAgaWYgKG9iamVjdFR5cGUgPT0gQU9UX1NCUiB8fCBvYmplY3RUeXBlID09IEFPVF9QUykgey8vU0JSIHNwZWNpZmljIGNvbmZpZyBwZXIgMTQ0OTYtMyB0YmwgMS4xMwogICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDQpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIHVpbnQzMl90IGV4dEZyZXFJbmRleCA9IGJyLmdldEJpdHMoNCk7Ci0gICAgICAgIGludDMyX3QgZXh0U2FtcGxlUmF0ZSBfX3VudXNlZDsKICAgICAgICAgaWYgKGV4dEZyZXFJbmRleCA9PSAxNSkgewogICAgICAgICAgICAgaWYgKGNzZF9zaXplIDwgOCkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDI0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgZXh0U2FtcGxlUmF0ZSA9IGJyLmdldEJpdHMoMjQpOworICAgICAgICAgICAgYnIuc2tpcEJpdHMoMjQpOyAvLyBleHRTYW1wbGVSYXRlCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoZXh0RnJlcUluZGV4ID09IDEzIHx8IGV4dEZyZXFJbmRleCA9PSAxNCkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBleHRTYW1wbGVSYXRlID0ga1NhbXBsaW5nUmF0ZVtleHRGcmVxSW5kZXhdOworICAgICAgICAgICAgLy9leHRTYW1wbGVSYXRlID0ga1NhbXBsaW5nUmF0ZVtleHRGcmVxSW5kZXhdOwogICAgICAgICB9CiAgICAgICAgIC8vVE9ETzogc2F2ZSB0aGUgZXh0ZW5zaW9uIHNhbXBsaW5nIHJhdGUgdmFsdWUgaW4gbWV0YSBkYXRhID0+CiAgICAgICAgIC8vICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIGtLZXlFeHRTYW1wbGVSYXRlLCBleHRTYW1wbGVSYXRlKTsKQEAgLTQ2OTIsMTMgKzQ3MTEsMTMgQEAKICAgICAgICAgICAgICAgICBvYmplY3RUeXBlID09IEFPVF9FUl9BQUNfTEQgfHwgb2JqZWN0VHlwZSA9PSBBT1RfRVJfQUFDX1NDQUwgfHwKICAgICAgICAgICAgICAgICBvYmplY3RUeXBlID09IEFPVF9FUl9CU0FDKSB7CiAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDIpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICBjb25zdCBpbnQzMl90IGZyYW1lTGVuZ3RoRmxhZyBfX3VudXNlZCA9IGJyLmdldEJpdHMoMSk7CisgICAgICAgICAgICBici5za2lwQml0cygxKTsgLy8gZnJhbWVMZW5ndGhGbGFnCiAKICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZGVwZW5kc09uQ29yZUNvZGVyID0gYnIuZ2V0Qml0cygxKTsKIAogICAgICAgICAgICAgaWYgKGRlcGVuZHNPbkNvcmVDb2RlciApIHsKICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDE0KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgY29yZUNvZGVyRGVsYXkgX191bnVzZWQgPSBici5nZXRCaXRzKDE0KTsKKyAgICAgICAgICAgICAgICBici5za2lwQml0cygxNCk7IC8vIGNvcmVDb2RlckRlbGF5CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludDMyX3QgZXh0ZW5zaW9uRmxhZyA9IC0xOwpAQCAtNDczMCw2NCArNDc0OSw2NCBAQAogICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMzIpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBFbGVtZW50SW5zdGFuY2VUYWcgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOwotICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgUHJvZmlsZSBfX3VudXNlZCA9IGJyLmdldEJpdHMoMik7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBTYW1wbGluZ0ZyZXF1ZW5jeUluZGV4IF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICBici5za2lwQml0cyg0KTsgLy8gRWxlbWVudEluc3RhbmNlVGFnCisgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoMik7IC8vIFByb2ZpbGUKKyAgICAgICAgICAgICAgICBici5za2lwQml0cyg0KTsgLy8gU2FtcGxpbmdGcmVxdWVuY3lJbmRleAogICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtRnJvbnRDaGFubmVsRWxlbWVudHMgPSBici5nZXRCaXRzKDQpOwogICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTnVtU2lkZUNoYW5uZWxFbGVtZW50cyA9IGJyLmdldEJpdHMoNCk7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1CYWNrQ2hhbm5lbEVsZW1lbnRzID0gYnIuZ2V0Qml0cyg0KTsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IE51bUxmZUNoYW5uZWxFbGVtZW50cyA9IGJyLmdldEJpdHMoMik7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1Bc3NvY0RhdGFFbGVtZW50cyBfX3VudXNlZCA9IGJyLmdldEJpdHMoMyk7Ci0gICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBOdW1WYWxpZENjRWxlbWVudHMgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDMpOyAvLyBOdW1Bc3NvY0RhdGFFbGVtZW50cworICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDQpOyAvLyBOdW1WYWxpZENjRWxlbWVudHMKIAogICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTW9ub01peGRvd25QcmVzZW50ID0gYnIuZ2V0Qml0cygxKTsKIAogICAgICAgICAgICAgICAgIGlmIChNb25vTWl4ZG93blByZXNlbnQgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDQpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTW9ub01peGRvd25FbGVtZW50TnVtYmVyIF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoNCk7IC8vIE1vbm9NaXhkb3duRWxlbWVudE51bWJlcgogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMSkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFN0ZXJlb01peGRvd25QcmVzZW50ID0gYnIuZ2V0Qml0cygxKTsKICAgICAgICAgICAgICAgICBpZiAoU3RlcmVvTWl4ZG93blByZXNlbnQgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDQpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgU3RlcmVvTWl4ZG93bkVsZW1lbnROdW1iZXIgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgICAgICBici5za2lwQml0cyg0KTsgLy8gU3RlcmVvTWl4ZG93bkVsZW1lbnROdW1iZXIKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDEpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNYXRyaXhNaXhkb3duSW5kZXhQcmVzZW50ID0gYnIuZ2V0Qml0cygxKTsKICAgICAgICAgICAgICAgICBpZiAoTWF0cml4TWl4ZG93bkluZGV4UHJlc2VudCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgMykgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBNYXRyaXhNaXhkb3duSW5kZXggX191bnVzZWQgPSBici5nZXRCaXRzKDIpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFBzZXVkb1N1cnJvdW5kRW5hYmxlIF9fdW51c2VkID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoMik7IC8vIE1hdHJpeE1peGRvd25JbmRleAorICAgICAgICAgICAgICAgICAgICBici5za2lwQml0cygxKTsgLy8gUHNldWRvU3Vycm91bmRFbmFibGUKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpbnQgaTsKICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bUZyb250Q2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA1KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IEZyb250RWxlbWVudElzQ3BlID0gYnIuZ2V0Qml0cygxKTsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBGcm9udEVsZW1lbnRUYWdTZWxlY3QgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgICAgICBici5za2lwQml0cyg0KTsgLy8gRnJvbnRFbGVtZW50VGFnU2VsZWN0CiAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzTnVtICs9IEZyb250RWxlbWVudElzQ3BlID8gMiA6IDE7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBOdW1TaWRlQ2hhbm5lbEVsZW1lbnRzOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA1KSByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFNpZGVFbGVtZW50SXNDcGUgPSBici5nZXRCaXRzKDEpOwotICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IFNpZGVFbGVtZW50VGFnU2VsZWN0IF9fdW51c2VkID0gYnIuZ2V0Qml0cyg0KTsKKyAgICAgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoNCk7IC8vIFNpZGVFbGVtZW50VGFnU2VsZWN0CiAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzTnVtICs9IFNpZGVFbGVtZW50SXNDcGUgPyAyIDogMTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBmb3IgKGk9MDsgaSA8IE51bUJhY2tDaGFubmVsRWxlbWVudHM7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDUpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgQmFja0VsZW1lbnRJc0NwZSA9IGJyLmdldEJpdHMoMSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgQmFja0VsZW1lbnRUYWdTZWxlY3QgX191bnVzZWQgPSBici5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgICAgICBici5za2lwQml0cyg0KTsgLy8gQmFja0VsZW1lbnRUYWdTZWxlY3QKICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHNOdW0gKz0gQmFja0VsZW1lbnRJc0NwZSA/IDIgOiAxOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBjaGFubmVsc0VmZmVjdGl2ZU51bSA9IGNoYW5uZWxzTnVtOwogCiAgICAgICAgICAgICAgICAgZm9yIChpPTA7IGkgPCBOdW1MZmVDaGFubmVsRWxlbWVudHM7IGkrKykgewogICAgICAgICAgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDQpIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgTGZlRWxlbWVudFRhZ1NlbGVjdCBfX3VudXNlZCA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDQpOyAvLyBMZmVFbGVtZW50VGFnU2VsZWN0CiAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzTnVtICs9IDE7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEFMT0dWKCJtcGVnNCBhdWRpbyBjaGFubmVsc051bSA9ICVkIiwgY2hhbm5lbHNOdW0pOwpAQCAtNTc2Niw3ICs1Nzg1LDcgQEAKICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICB9CiAKLSAgICAgICAgLy8gYXBwbHkgc29tZSBzYW5pdHkgKHZzIHN0cmljdCBsZWdhbGl0eSkgY2hlY2tzCisgICAgICAgIC8vIGFwcGx5IHNvbWUgcXVpY2sgKHZzIHN0cmljdCBsZWdhbGl0eSkgY2hlY2tzCiAgICAgICAgIC8vCiAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga01heFRydW5TYW1wbGVDb3VudCA9IDEwMDAwOwogICAgICAgICBpZiAoc2FtcGxlQ291bnQgPiBrTWF4VHJ1blNhbXBsZUNvdW50KSB7CkBAIC02NzEzLDYgKzY3MzIsNyBAQAogICAgICAgICBGT1VSQ0MoImh2YzEiKSwKICAgICAgICAgRk9VUkNDKCJoZXYxIiksCiAgICAgICAgIEZPVVJDQygiYXYwMSIpLAorICAgICAgICBGT1VSQ0MoInZwMDkiKSwKICAgICAgICAgRk9VUkNDKCIzZ3A0IiksCiAgICAgICAgIEZPVVJDQygibXA0MSIpLAogICAgICAgICBGT1VSQ0MoIm1wNDIiKSwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvQW5kcm9pZC5icAppbmRleCBiYzg2MzJjLi40YzI1MzE0IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9BbmRyb2lkLmJwCkBAIC0xLDYgKzEsMTYgQEAKIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJtcGVnMmV4dHJhY3RvciIsCiAKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICAgICAgYW5kcm9pZDogeworICAgICAgICAgICAgc2hhcmVkX2xpYnM6IFsibGlidm5ka3N1cHBvcnQjMjkiXSwKKyAgICAgICAgfSwKKyAgICB9LAorCiAgICAgZGVmYXVsdHM6IFsiZXh0cmFjdG9yLWRlZmF1bHRzIl0sCiAKICAgICBzcmNzOiBbCkBAIC0xMiwxNCArMjIsMTMgQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJjZ3JvdXByYyMyOSIsCi0gICAgICAgICJsaWJ2bmRrc3VwcG9ydCMyOSIsCiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIiwKICAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKLSAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgICAgICAibGlibWVkaWFfZGF0YXNvdXJjZV9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKQEAgLTM3LDcgKzQ2LDcgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl93aXRob3V0X2ltZW1vcnkiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJleHRyYWN0b3IiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydF9ub2NyeXB0byIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL0FuZHJvaWQuYnAKaW5kZXggN2FlZDY4My4uNTc5MDY1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL29nZy9BbmRyb2lkLmJwCkBAIC0yMCw0ICsyMCwxMSBAQAogICAgICAgICAibGlidm9yYmlzaWRlYyIsCiAgICAgXSwKIAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9BbmRyb2lkVGVzdC54bWwKaW5kZXggNmJiMmM4YS4uZmM4MTUyYyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9BbmRyb2lkVGVzdC54bWwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9BbmRyb2lkVGVzdC54bWwKQEAgLTE5LDcgKzE5LDcgQEAKICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iRXh0cmFjdG9yVW5pdFRlc3QtPi9kYXRhL2xvY2FsL3RtcC9FeHRyYWN0b3JVbml0VGVzdCIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiCi0gICAgICAgICAgICBrZXk9Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9leHRyYWN0b3IuemlwP3VuemlwPXRydWUiCisgICAgICAgICAgICBrZXk9Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9leHRyYWN0b3ItMS40LnppcD91bnppcD10cnVlIgogICAgICAgICAgICAgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcC9FeHRyYWN0b3JVbml0VGVzdFJlcy8iIC8+CiAgICAgPC90YXJnZXRfcHJlcGFyZXI+CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvRXh0cmFjdG9yVW5pdFRlc3QuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9FeHRyYWN0b3JVbml0VGVzdC5jcHAKaW5kZXggNTE4MTY2ZS4uZDkxZmZmYSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9FeHRyYWN0b3JVbml0VGVzdC5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9FeHRyYWN0b3JVbml0VGVzdC5jcHAKQEAgLTIwLDggKzIwLDEwIEBACiAKICNpbmNsdWRlIDxkYXRhc291cmNlL0ZpbGVTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL09wdXNIZWFkZXIuaD4KIAogI2luY2x1ZGUgImFhYy9BQUNFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJhbXIvQU1SRXh0cmFjdG9yLmgiCkBAIC00MywxMSArNDUsNzYgQEAKICNkZWZpbmUgT1VUUFVUX0RVTVBfRklMRSAiL2RhdGEvbG9jYWwvdG1wL2V4dHJhY3Rvck91dHB1dCIKIAogY29uc3RleHByIGludDMyX3Qga01heENvdW50ID0gMTA7Ci1jb25zdGV4cHIgaW50MzJfdCBrT3B1c1NlZWtQcmVSb2xsVXMgPSA4MDAwMDsgIC8vIDgwIG1zOworY29uc3RleHByIGludDMyX3Qga0F1ZGlvRGVmYXVsdFNhbXBsZUR1cmF0aW9uID0gMjAwMDA7ICAgICAgICAgICAgICAgICAgICAgICAvLyAyMG1zCitjb25zdGV4cHIgaW50MzJfdCBrUmFuZG9tU2Vla1RvbGVyYW5jZVVzID0gMiAqIGtBdWRpb0RlZmF1bHRTYW1wbGVEdXJhdGlvbjsgIC8vIDQwIG1zOworY29uc3RleHByIGludDMyX3Qga1JhbmRvbVNlZWQgPSA3MDA7Citjb25zdGV4cHIgaW50MzJfdCBrVW5kZWZpbmVkID0gLTE7CisKK2VudW0gaW5wdXRJRCB7CisgICAgLy8gYXVkaW8gc3RyZWFtcworICAgIEFBQ18xLAorICAgIEFNUl9OQl8xLAorICAgIEFNUl9XQl8xLAorICAgIEZMQUNfMSwKKyAgICBHU01fMSwKKyAgICBNSURJXzEsCisgICAgTVAzXzEsCisgICAgT1BVU18xLAorICAgIFZPUkJJU18xLAorICAgIC8vIHZpZGVvIHN0cmVhbXMKKyAgICBIRVZDXzEsCisgICAgSEVWQ18yLAorICAgIE1QRUcyX1BTXzEsCisgICAgTVBFRzJfVFNfMSwKKyAgICBNUEVHNF8xLAorICAgIFZQOV8xLAorICAgIFVOS05PV05fSUQsCit9OworCisvLyBMb29rVXBUYWJsZSBvZiBjbGlwcyBhbmQgbWV0YWRhdGEgZm9yIGNvbXBvbmVudCB0ZXN0aW5nCitzdGF0aWMgY29uc3Qgc3RydWN0IElucHV0RGF0YSB7CisgICAgaW5wdXRJRCBpbnBJZDsKKyAgICBzdHJpbmcgbWltZTsKKyAgICBzdHJpbmcgaW5wdXRGaWxlOworICAgIGludDMyX3QgZmlyc3RQYXJhbTsKKyAgICBpbnQzMl90IHNlY29uZFBhcmFtOworICAgIGludDMyX3QgcHJvZmlsZTsKKyAgICBpbnQzMl90IGZyYW1lUmF0ZTsKK30ga0lucHV0RGF0YVtdID0geworICAgICAgICB7QUFDXzEsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywgInRlc3RfbW9ub180NDEwMEh6X2FhYy5hYWMiLCA0NDEwMCwgMSwgQUFDT2JqZWN0TEMsCisgICAgICAgICBrVW5kZWZpbmVkfSwKKyAgICAgICAge0FNUl9OQl8xLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsICJiYmJfbW9ub184a0h6X2Ftcm5iLmFtciIsIDgwMDAsIDEsIGtVbmRlZmluZWQsCisgICAgICAgICBrVW5kZWZpbmVkfSwKKyAgICAgICAge0FNUl9XQl8xLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsICJiYmJfbW9ub18xNmtIel9hbXJ3Yi5hbXIiLCAxNjAwMCwgMSwga1VuZGVmaW5lZCwKKyAgICAgICAgIGtVbmRlZmluZWR9LAorICAgICAgICB7RkxBQ18xLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcsICJiYmJfc3RlcmVvXzQ4a0h6X2ZsYWMuZmxhYyIsIDQ4MDAwLCAyLCBrVW5kZWZpbmVkLAorICAgICAgICAga1VuZGVmaW5lZH0sCisgICAgICAgIHtHU01fMSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVNHU00sICJ0ZXN0X21vbm9fOGtIel9nc20ud2F2IiwgODAwMCwgMSwga1VuZGVmaW5lZCwKKyAgICAgICAgIGtVbmRlZmluZWR9LAorICAgICAgICB7TUlESV8xLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcsICJtaWRpX2EubWlkIiwgMjIwNTAsIDIsIGtVbmRlZmluZWQsIGtVbmRlZmluZWR9LAorICAgICAgICB7TVAzXzEsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcsICJiYmJfc3RlcmVvXzQ4a0h6X21wMy5tcDMiLCA0ODAwMCwgMiwga1VuZGVmaW5lZCwKKyAgICAgICAgIGtVbmRlZmluZWR9LAorICAgICAgICB7T1BVU18xLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTLCAidGVzdF9zdGVyZW9fNDhrSHpfb3B1cy5vcHVzIiwgNDgwMDAsIDIsIGtVbmRlZmluZWQsCisgICAgICAgICBrVW5kZWZpbmVkfSwKKyAgICAgICAge1ZPUkJJU18xLCBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMsICJiYmJfc3RlcmVvXzQ4a0h6X3ZvcmJpcy5vZ2ciLCA0ODAwMCwgMiwga1VuZGVmaW5lZCwKKyAgICAgICAgIGtVbmRlZmluZWR9LAorCisgICAgICAgIC8vIFRlc3QgKGIvMTUxNjc3MjY0KSBmb3IgTVA0IGV4dHJhY3RvcgorICAgICAgICB7SEVWQ18xLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDLCAiY3Jvd2RfNTA4eDI0MF8yNWZwc19oZXZjLm1wNCIsIDUwOCwgMjQwLAorICAgICAgICAgSEVWQ1Byb2ZpbGVNYWluLCAyNX0sCisgICAgICAgIHtIRVZDXzIsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQywgInRlc3QzLmhlaWMiLCA4MjAsIDQ2MCwga1VuZGVmaW5lZCwga1VuZGVmaW5lZH0sCisgICAgICAgIHtNUEVHMl9QU18xLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMiwgInN3aXJsXzE0NHgxMzZfbXBlZzIubXBnIiwgMTQ0LCAxMzYsCisgICAgICAgICBNUEVHMlByb2ZpbGVNYWluLCAxMn0sCisgICAgICAgIHtNUEVHMl9UU18xLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMiwgImJiYl9jaWZfNzY4a2Jwc18zMGZwc19tcGVnMi50cyIsIDM1MiwgMjg4LAorICAgICAgICAgTVBFRzJQcm9maWxlTWFpbiwgMzB9LAorICAgICAgICB7TVBFRzRfMSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJiYmJfY2lmXzc2OGticHNfMzBmcHNfbXBlZzQubWt2IiwgMzUyLCAyODgsCisgICAgICAgICBNUEVHNFByb2ZpbGVTaW1wbGUsIDMwfSwKKyAgICAgICAge1ZQOV8xLCBNRURJQV9NSU1FVFlQRV9WSURFT19WUDksICJiYmJfMzQweDI4MF8zMGZwc192cDkud2VibSIsIDM0MCwgMjgwLCBWUDlQcm9maWxlMCwgMzB9LAorfTsKIAogc3RhdGljIEV4dHJhY3RvclVuaXRUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOwogCi1jbGFzcyBFeHRyYWN0b3JVbml0VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08cGFpcjxzdHJpbmcsIHN0cmluZz4+IHsKK2NsYXNzIEV4dHJhY3RvclVuaXRUZXN0IHsKICAgcHVibGljOgogICAgIEV4dHJhY3RvclVuaXRUZXN0KCkgOiBtSW5wdXRGcChudWxscHRyKSwgbURhdGFTb3VyY2UobnVsbHB0ciksIG1FeHRyYWN0b3IobnVsbHB0cikge30KIApAQCAtNjYsMTYgKzEzMywyOSBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIHZvaWQgc2V0dXBFeHRyYWN0b3Ioc3RyaW5nIHdyaXRlckZvcm1hdCkgewogICAgICAgICBtRXh0cmFjdG9yTmFtZSA9IHVua25vd25fY29tcDsKICAgICAgICAgbURpc2FibGVUZXN0ID0gZmFsc2U7CiAKICAgICAgICAgc3RhdGljIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGFuZGFyZEV4dHJhY3RvcnM+IG1hcEV4dHJhY3RvciA9IHsKLSAgICAgICAgICAgICAgICB7ImFhYyIsIEFBQ30sICAgICB7ImFtciIsIEFNUn0sICAgICAgICAgeyJtcDMiLCBNUDN9LCAgICAgICAgeyJvZ2ciLCBPR0d9LAotICAgICAgICAgICAgICAgIHsid2F2IiwgV0FWfSwgICAgIHsibWt2IiwgTUtWfSwgICAgICAgICB7ImZsYWMiLCBGTEFDfSwgICAgICB7Im1pZGkiLCBNSURJfSwKLSAgICAgICAgICAgICAgICB7Im1wZWc0IiwgTVBFRzR9LCB7Im1wZWcydHMiLCBNUEVHMlRTfSwgeyJtcGVnMnBzIiwgTVBFRzJQU319OworICAgICAgICAgICAgICAgIHsiYWFjIiwgQUFDfSwKKyAgICAgICAgICAgICAgICB7ImFtciIsIEFNUn0sCisgICAgICAgICAgICAgICAgeyJmbGFjIiwgRkxBQ30sCisgICAgICAgICAgICAgICAgeyJtaWQiLCBNSURJfSwKKyAgICAgICAgICAgICAgICB7Im1pZGkiLCBNSURJfSwKKyAgICAgICAgICAgICAgICB7Im1rdiIsIE1LVn0sCisgICAgICAgICAgICAgICAgeyJtcDMiLCBNUDN9LAorICAgICAgICAgICAgICAgIHsibXA0IiwgTVBFRzR9LAorICAgICAgICAgICAgICAgIHsibXBlZzJwcyIsIE1QRUcyUFN9LAorICAgICAgICAgICAgICAgIHsibXBlZzJ0cyIsIE1QRUcyVFN9LAorICAgICAgICAgICAgICAgIHsibXBlZzQiLCBNUEVHNH0sCisgICAgICAgICAgICAgICAgeyJtcGciLCBNUEVHMlBTfSwKKyAgICAgICAgICAgICAgICB7Im9nZyIsIE9HR30sCisgICAgICAgICAgICAgICAgeyJvcHVzIiwgT0dHfSwKKyAgICAgICAgICAgICAgICB7InRzIiwgTVBFRzJUU30sCisgICAgICAgICAgICAgICAgeyJ3YXYiLCBXQVZ9LAorICAgICAgICAgICAgICAgIHsid2VibSIsIE1LVn19OwogICAgICAgICAvLyBGaW5kIHRoZSBjb21wb25lbnQgdHlwZQotICAgICAgICBzdHJpbmcgd3JpdGVyRm9ybWF0ID0gR2V0UGFyYW0oKS5maXJzdDsKICAgICAgICAgaWYgKG1hcEV4dHJhY3Rvci5maW5kKHdyaXRlckZvcm1hdCkgIT0gbWFwRXh0cmFjdG9yLmVuZCgpKSB7CiAgICAgICAgICAgICBtRXh0cmFjdG9yTmFtZSA9IG1hcEV4dHJhY3Rvci5hdCh3cml0ZXJGb3JtYXQpOwogICAgICAgICB9CkBAIC0xMTIsNiArMTkyLDM5IEBACiAgICAgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgKm1FeHRyYWN0b3I7CiB9OwogCitjbGFzcyBFeHRyYWN0b3JGdW5jdGlvbmFsaXR5VGVzdAorICAgIDogcHVibGljIEV4dHJhY3RvclVuaXRUZXN0LAorICAgICAgcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0dXBsZTxzdHJpbmcgLyogY29udGFpbmVyICovLCBzdHJpbmcgLyogSW5wdXRGaWxlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IC8qIG51bVRyYWNrcyAqLywgYm9vbCAvKiBzZWVrU3VwcG9ydGVkICovPj4geworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICB0dXBsZTxzdHJpbmcsIHN0cmluZywgaW50MzJfdCwgYm9vbD4gcGFyYW1zID0gR2V0UGFyYW0oKTsKKyAgICAgICAgbUNvbnRhaW5lciA9IGdldDwwPihwYXJhbXMpOworICAgICAgICBtTnVtVHJhY2tzID0gZ2V0PDI+KHBhcmFtcyk7CisgICAgICAgIHNldHVwRXh0cmFjdG9yKG1Db250YWluZXIpOworICAgIH0KKyAgICBzdHJpbmcgbUNvbnRhaW5lcjsKKyAgICBpbnQzMl90IG1OdW1UcmFja3M7Cit9OworCitjbGFzcyBDb25maWdQYXJhbVRlc3QgOiBwdWJsaWMgRXh0cmFjdG9yVW5pdFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHBhaXI8c3RyaW5nLCBpbnB1dElEPj4geworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBzZXR1cEV4dHJhY3RvcihHZXRQYXJhbSgpLmZpcnN0KTsgfQorCisgICAgc3RydWN0IGNvbmZpZ0Zvcm1hdCB7CisgICAgICAgIHN0cmluZyBtaW1lOworICAgICAgICBpbnQzMl90IHdpZHRoOworICAgICAgICBpbnQzMl90IGhlaWdodDsKKyAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlOworICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudDsKKyAgICAgICAgaW50MzJfdCBwcm9maWxlOworICAgICAgICBpbnQzMl90IGZyYW1lUmF0ZTsKKyAgICB9OworCisgICAgdm9pZCBnZXRGaWxlUHJvcGVydGllcyhpbnB1dElEIGlucHV0SWQsIHN0cmluZyAmaW5wdXRGaWxlLCBjb25maWdGb3JtYXQgJmNvbmZpZ1BhcmFtKTsKK307CisKIGludDMyX3QgRXh0cmFjdG9yVW5pdFRlc3Q6OnNldERhdGFTb3VyY2Uoc3RyaW5nIGlucHV0RmlsZU5hbWUpIHsKICAgICBtSW5wdXRGcCA9IGZvcGVuKGlucHV0RmlsZU5hbWUuY19zdHIoKSwgInJiIik7CiAgICAgaWYgKCFtSW5wdXRGcCkgewpAQCAtMTY4LDYgKzI4MSw3NSBAQAogICAgIHJldHVybiAwOwogfQogCit2b2lkIENvbmZpZ1BhcmFtVGVzdDo6Z2V0RmlsZVByb3BlcnRpZXMoaW5wdXRJRCBpbnB1dElkLCBzdHJpbmcgJmlucHV0RmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdGb3JtYXQgJmNvbmZpZ1BhcmFtKSB7CisgICAgaW50MzJfdCBpbnB1dERhdGFTaXplID0gc2l6ZW9mKGtJbnB1dERhdGEpIC8gc2l6ZW9mKGtJbnB1dERhdGFbMF0pOworICAgIGludDMyX3QgaW5wdXRJZHggPSAwOworICAgIGZvciAoOyBpbnB1dElkeCA8IGlucHV0RGF0YVNpemU7IGlucHV0SWR4KyspIHsKKyAgICAgICAgaWYgKGlucHV0SWQgPT0ga0lucHV0RGF0YVtpbnB1dElkeF0uaW5wSWQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpbnB1dElkeCA9PSBpbnB1dERhdGFTaXplKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW5wdXRGaWxlICs9IGtJbnB1dERhdGFbaW5wdXRJZHhdLmlucHV0RmlsZTsKKyAgICBjb25maWdQYXJhbS5taW1lID0ga0lucHV0RGF0YVtpbnB1dElkeF0ubWltZTsKKyAgICBzaXplX3QgZm91bmQgPSBjb25maWdQYXJhbS5taW1lLmZpbmQoImF1ZGlvLyIpOworICAgIC8vIENoZWNrIGlmICdhdWRpby8nIGlzIHByZXNlbnQgaW4gdGhlIGJlZ2luaW5pZyBvZiB0aGUgbWltZSB0eXBlCisgICAgaWYgKGZvdW5kID09IDApIHsKKyAgICAgICAgY29uZmlnUGFyYW0uc2FtcGxlUmF0ZSA9IGtJbnB1dERhdGFbaW5wdXRJZHhdLmZpcnN0UGFyYW07CisgICAgICAgIGNvbmZpZ1BhcmFtLmNoYW5uZWxDb3VudCA9IGtJbnB1dERhdGFbaW5wdXRJZHhdLnNlY29uZFBhcmFtOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbmZpZ1BhcmFtLndpZHRoID0ga0lucHV0RGF0YVtpbnB1dElkeF0uZmlyc3RQYXJhbTsKKyAgICAgICAgY29uZmlnUGFyYW0uaGVpZ2h0ID0ga0lucHV0RGF0YVtpbnB1dElkeF0uc2Vjb25kUGFyYW07CisgICAgfQorICAgIGNvbmZpZ1BhcmFtLnByb2ZpbGUgPSBrSW5wdXREYXRhW2lucHV0SWR4XS5wcm9maWxlOworICAgIGNvbmZpZ1BhcmFtLmZyYW1lUmF0ZSA9IGtJbnB1dERhdGFbaW5wdXRJZHhdLmZyYW1lUmF0ZTsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgcmFuZG9tU2Vla1Rlc3QoTWVkaWFUcmFja0hlbHBlciAqdHJhY2ssIGludDY0X3QgY2xpcER1cmF0aW9uKSB7CisgICAgaW50MzJfdCBzdGF0dXMgPSAwOworICAgIGludDMyX3Qgc2Vla0NvdW50ID0gMDsKKyAgICBib29sIGhhc1RpbWVzdGFtcCA9IGZhbHNlOworICAgIHZlY3RvcjxpbnQ2NF90PiBzZWVrVG9UaW1lU3RhbXA7CisgICAgc3RyaW5nIHNlZWtQdHNTdHJpbmc7CisKKyAgICBzcmFuZChrUmFuZG9tU2VlZCk7CisgICAgd2hpbGUgKHNlZWtDb3VudCA8IGtNYXhDb3VudCkgeworICAgICAgICBpbnQ2NF90IHRpbWVTdGFtcCA9ICgoZG91YmxlKXJhbmQoKSAvIFJBTkRfTUFYKSAqIGNsaXBEdXJhdGlvbjsKKyAgICAgICAgc2Vla1RvVGltZVN0YW1wLnB1c2hfYmFjayh0aW1lU3RhbXApOworICAgICAgICBzZWVrUHRzU3RyaW5nLmFwcGVuZCh0b19zdHJpbmcodGltZVN0YW1wKSk7CisgICAgICAgIHNlZWtQdHNTdHJpbmcuYXBwZW5kKCIsICIpOworICAgICAgICBzZWVrQ291bnQrKzsKKyAgICB9CisKKyAgICBmb3IgKGludDY0X3Qgc2Vla1B0cyA6IHNlZWtUb1RpbWVTdGFtcCkgeworICAgICAgICBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IG5ldyBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9ucygKKyAgICAgICAgICAgICAgICBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QgfCBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLLCBzZWVrUHRzKTsKKyAgICAgICAgQVNTRVJUX05FKG9wdGlvbnMsIG51bGxwdHIpIDw8ICJDYW5ub3QgY3JlYXRlIHJlYWQgb3B0aW9uIjsKKworICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgc3RhdHVzID0gdHJhY2stPnJlYWQoJmJ1ZmZlciwgb3B0aW9ucyk7CisgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YURhdGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgaW50NjRfdCB0aW1lU3RhbXAgPSAwOworICAgICAgICAgICAgaGFzVGltZXN0YW1wID0gQU1lZGlhRm9ybWF0X2dldEludDY0KG1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsICZ0aW1lU3RhbXApOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoaGFzVGltZXN0YW1wKSA8PCAiRXh0cmFjdG9yIGRpZG4ndCBzZXQgdGltZXN0YW1wIGZvciB0aGUgZ2l2ZW4gc2FtcGxlIjsKKworICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBFWFBFQ1RfTEUoYWJzKHRpbWVTdGFtcCAtIHNlZWtQdHMpLCBrUmFuZG9tU2Vla1RvbGVyYW5jZVVzKQorICAgICAgICAgICAgICAgICAgICA8PCAiU2VlayB1bnN1Y2Nlc3NmdWwuIEV4cGVjdGVkIHRpbWVzdGFtcCByYW5nZSBbIgorICAgICAgICAgICAgICAgICAgICA8PCBzZWVrUHRzIC0ga1JhbmRvbVNlZWtUb2xlcmFuY2VVcyA8PCAiLCAiIDw8IHNlZWtQdHMgKyBrUmFuZG9tU2Vla1RvbGVyYW5jZVVzCisgICAgICAgICAgICAgICAgICAgIDw8ICJdICIKKyAgICAgICAgICAgICAgICAgICAgPDwgInJlY2VpdmVkICIgPDwgdGltZVN0YW1wIDw8ICIsIGxpc3Qgb2YgaW5wdXQgc2VlayB0aW1lc3RhbXBzIFsiCisgICAgICAgICAgICAgICAgICAgIDw8IHNlZWtQdHNTdHJpbmcgPDwgIl0iOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBvcHRpb25zOworICAgIH0KK30KKwogdm9pZCBnZXRTZWVrYWJsZVBvaW50cyh2ZWN0b3I8aW50NjRfdD4gJnNlZWthYmxlUG9pbnRzLCBNZWRpYVRyYWNrSGVscGVyICp0cmFjaykgewogICAgIGludDMyX3Qgc3RhdHVzID0gMDsKICAgICBpZiAoIXNlZWthYmxlUG9pbnRzLmVtcHR5KCkpIHsKQEAgLTE5MCwyMCArMzcyLDIxIEBACiAgICAgfQogfQogCi1URVNUX1AoRXh0cmFjdG9yVW5pdFRlc3QsIENyZWF0ZUV4dHJhY3RvclRlc3QpIHsKK1RFU1RfUChFeHRyYWN0b3JGdW5jdGlvbmFsaXR5VGVzdCwgQ3JlYXRlRXh0cmFjdG9yVGVzdCkgewogICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKIAogICAgIEFMT0dWKCJDaGVja3MgaWYgYSB2YWxpZCBleHRyYWN0b3IgaXMgY3JlYXRlZCBmb3IgYSBnaXZlbiBpbnB1dCBmaWxlIik7Ci0gICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIEdldFBhcmFtKCkuc2Vjb25kOworICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MT4oR2V0UGFyYW0oKSk7CiAKLSAgICBBU1NFUlRfRVEoc2V0RGF0YVNvdXJjZShpbnB1dEZpbGVOYW1lKSwgMCkKLSAgICAgICAgICAgIDw8ICJTZXREYXRhU291cmNlIGZhaWxlZCBmb3IiIDw8IEdldFBhcmFtKCkuZmlyc3QgPDwgImV4dHJhY3RvciI7CisgICAgaW50MzJfdCBzdGF0dXMgPSBzZXREYXRhU291cmNlKGlucHV0RmlsZU5hbWUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJTZXREYXRhU291cmNlIGZhaWxlZCBmb3IiIDw8IG1Db250YWluZXIgPDwgImV4dHJhY3RvciI7CiAKLSAgICBBU1NFUlRfRVEoY3JlYXRlRXh0cmFjdG9yKCksIDApCi0gICAgICAgICAgICA8PCAiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCBmb3IiIDw8IEdldFBhcmFtKCkuZmlyc3QgPDwgImV4dHJhY3RvciI7CisgICAgc3RhdHVzID0gY3JlYXRlRXh0cmFjdG9yKCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkV4dHJhY3RvciBjcmVhdGlvbiBmYWlsZWQgZm9yIiA8PCBtQ29udGFpbmVyIDw8ICJleHRyYWN0b3IiOwogCi0gICAgLy8gQSB2YWxpZCBleHRyYWN0b3IgaW5zdGFjZSBzaG91bGQgcmV0dXJuIHN1Y2Nlc3MgZm9yIGZvbGxvd2luZyBjYWxscwotICAgIEFTU0VSVF9HVChtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpLCAwKTsKKyAgICBpbnQzMl90IG51bVRyYWNrcyA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CisgICAgQVNTRVJUX0VRKG51bVRyYWNrcywgbU51bVRyYWNrcykKKyAgICAgICAgICAgIDw8ICJFeHRyYWN0b3IgcmVwb3J0ZWQgd3JvbmcgbnVtYmVyIG9mIHRyYWNrIGZvciB0aGUgZ2l2ZW4gY2xpcCI7CiAKICAgICBBTWVkaWFGb3JtYXQgKmZvcm1hdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKICAgICBBU1NFUlRfTkUoZm9ybWF0LCBudWxscHRyKSA8PCAiQU1lZGlhRm9ybWF0X25ldyByZXR1cm5lZCBudWxsIEFNZWRpYWZvcm1hdCI7CkBAIC0yMTIsMjAgKzM5NSwyMSBAQAogICAgIEFNZWRpYUZvcm1hdF9kZWxldGUoZm9ybWF0KTsKIH0KIAotVEVTVF9QKEV4dHJhY3RvclVuaXRUZXN0LCBFeHRyYWN0b3JUZXN0KSB7CitURVNUX1AoRXh0cmFjdG9yRnVuY3Rpb25hbGl0eVRlc3QsIEV4dHJhY3RvclRlc3QpIHsKICAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CiAKLSAgICBBTE9HVigiVmFsaWRhdGVzICVzIEV4dHJhY3RvciBmb3IgYSBnaXZlbiBpbnB1dCBmaWxlIiwgR2V0UGFyYW0oKS5maXJzdC5jX3N0cigpKTsKLSAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgR2V0UGFyYW0oKS5zZWNvbmQ7CisgICAgQUxPR1YoIlZhbGlkYXRlcyAlcyBFeHRyYWN0b3IgZm9yIGEgZ2l2ZW4gaW5wdXQgZmlsZSIsIG1Db250YWluZXIuY19zdHIoKSk7CisgICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIGdldDwxPihHZXRQYXJhbSgpKTsKIAogICAgIGludDMyX3Qgc3RhdHVzID0gc2V0RGF0YVNvdXJjZShpbnB1dEZpbGVOYW1lKTsKLSAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiU2V0RGF0YVNvdXJjZSBmYWlsZWQgZm9yIiA8PCBHZXRQYXJhbSgpLmZpcnN0IDw8ICJleHRyYWN0b3IiOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJTZXREYXRhU291cmNlIGZhaWxlZCBmb3IiIDw8IG1Db250YWluZXIgPDwgImV4dHJhY3RvciI7CiAKICAgICBzdGF0dXMgPSBjcmVhdGVFeHRyYWN0b3IoKTsKLSAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCBmb3IiIDw8IEdldFBhcmFtKCkuZmlyc3QgPDwgImV4dHJhY3RvciI7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkV4dHJhY3RvciBjcmVhdGlvbiBmYWlsZWQgZm9yIiA8PCBtQ29udGFpbmVyIDw8ICJleHRyYWN0b3IiOwogCiAgICAgaW50MzJfdCBudW1UcmFja3MgPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOwotICAgIEFTU0VSVF9HVChudW1UcmFja3MsIDApIDw8ICJFeHRyYWN0b3IgZGlkbid0IGZpbmQgYW55IHRyYWNrIGZvciB0aGUgZ2l2ZW4gY2xpcCI7CisgICAgQVNTRVJUX0VRKG51bVRyYWNrcywgbU51bVRyYWNrcykKKyAgICAgICAgICAgIDw8ICJFeHRyYWN0b3IgcmVwb3J0ZWQgd3JvbmcgbnVtYmVyIG9mIHRyYWNrIGZvciB0aGUgZ2l2ZW4gY2xpcCI7CiAKICAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwgbnVtVHJhY2tzOyBpZHgrKykgewogICAgICAgICBNZWRpYVRyYWNrSGVscGVyICp0cmFjayA9IG1FeHRyYWN0b3ItPmdldFRyYWNrKGlkeCk7CkBAIC0yNjIsMjAgKzQ0NiwyMSBAQAogICAgIH0KIH0KIAotVEVTVF9QKEV4dHJhY3RvclVuaXRUZXN0LCBNZXRhRGF0YUNvbXBhcmlzb25UZXN0KSB7CitURVNUX1AoRXh0cmFjdG9yRnVuY3Rpb25hbGl0eVRlc3QsIE1ldGFEYXRhQ29tcGFyaXNvblRlc3QpIHsKICAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CiAKICAgICBBTE9HVigiVmFsaWRhdGVzIEV4dHJhY3RvcidzIG1ldGEgZGF0YSBmb3IgYSBnaXZlbiBpbnB1dCBmaWxlIik7Ci0gICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIEdldFBhcmFtKCkuc2Vjb25kOworICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MT4oR2V0UGFyYW0oKSk7CiAKICAgICBpbnQzMl90IHN0YXR1cyA9IHNldERhdGFTb3VyY2UoaW5wdXRGaWxlTmFtZSk7Ci0gICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIlNldERhdGFTb3VyY2UgZmFpbGVkIGZvciIgPDwgR2V0UGFyYW0oKS5maXJzdCA8PCAiZXh0cmFjdG9yIjsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiU2V0RGF0YVNvdXJjZSBmYWlsZWQgZm9yIiA8PCBtQ29udGFpbmVyIDw8ICJleHRyYWN0b3IiOwogCiAgICAgc3RhdHVzID0gY3JlYXRlRXh0cmFjdG9yKCk7Ci0gICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkV4dHJhY3RvciBjcmVhdGlvbiBmYWlsZWQgZm9yIiA8PCBHZXRQYXJhbSgpLmZpcnN0IDw8ICJleHRyYWN0b3IiOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJFeHRyYWN0b3IgY3JlYXRpb24gZmFpbGVkIGZvciIgPDwgbUNvbnRhaW5lciA8PCAiZXh0cmFjdG9yIjsKIAogICAgIGludDMyX3QgbnVtVHJhY2tzID0gbUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKLSAgICBBU1NFUlRfR1QobnVtVHJhY2tzLCAwKSA8PCAiRXh0cmFjdG9yIGRpZG4ndCBmaW5kIGFueSB0cmFjayBmb3IgdGhlIGdpdmVuIGNsaXAiOworICAgIEFTU0VSVF9FUShudW1UcmFja3MsIG1OdW1UcmFja3MpCisgICAgICAgICAgICA8PCAiRXh0cmFjdG9yIHJlcG9ydGVkIHdyb25nIG51bWJlciBvZiB0cmFjayBmb3IgdGhlIGdpdmVuIGNsaXAiOwogCiAgICAgQU1lZGlhRm9ybWF0ICpleHRyYWN0b3JGb3JtYXQgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CiAgICAgQVNTRVJUX05FKGV4dHJhY3RvckZvcm1hdCwgbnVsbHB0cikgPDwgIkFNZWRpYUZvcm1hdF9uZXcgcmV0dXJuZWQgbnVsbCBBTWVkaWFmb3JtYXQiOwpAQCAtMzM3LDIwICs1MjIsMjEgQEAKICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGV4dHJhY3RvckZvcm1hdCk7CiB9CiAKLVRFU1RfUChFeHRyYWN0b3JVbml0VGVzdCwgTXVsdGlwbGVTdGFydFN0b3BUZXN0KSB7CitURVNUX1AoRXh0cmFjdG9yRnVuY3Rpb25hbGl0eVRlc3QsIE11bHRpcGxlU3RhcnRTdG9wVGVzdCkgewogICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKIAotICAgIEFMT0dWKCJUZXN0ICVzIGV4dHJhY3RvciBmb3IgbXVsdGlwbGUgc3RhcnQgYW5kIHN0b3AgY2FsbHMiLCBHZXRQYXJhbSgpLmZpcnN0LmNfc3RyKCkpOwotICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBHZXRQYXJhbSgpLnNlY29uZDsKKyAgICBBTE9HVigiVGVzdCAlcyBleHRyYWN0b3IgZm9yIG11bHRpcGxlIHN0YXJ0IGFuZCBzdG9wIGNhbGxzIiwgbUNvbnRhaW5lci5jX3N0cigpKTsKKyAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDE+KEdldFBhcmFtKCkpOwogCiAgICAgaW50MzJfdCBzdGF0dXMgPSBzZXREYXRhU291cmNlKGlucHV0RmlsZU5hbWUpOwotICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJTZXREYXRhU291cmNlIGZhaWxlZCBmb3IiIDw8IEdldFBhcmFtKCkuZmlyc3QgPDwgImV4dHJhY3RvciI7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIlNldERhdGFTb3VyY2UgZmFpbGVkIGZvciIgPDwgbUNvbnRhaW5lciA8PCAiZXh0cmFjdG9yIjsKIAogICAgIHN0YXR1cyA9IGNyZWF0ZUV4dHJhY3RvcigpOwotICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJFeHRyYWN0b3IgY3JlYXRpb24gZmFpbGVkIGZvciIgPDwgR2V0UGFyYW0oKS5maXJzdCA8PCAiZXh0cmFjdG9yIjsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCBmb3IiIDw8IG1Db250YWluZXIgPDwgImV4dHJhY3RvciI7CiAKICAgICBpbnQzMl90IG51bVRyYWNrcyA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7Ci0gICAgQVNTRVJUX0dUKG51bVRyYWNrcywgMCkgPDwgIkV4dHJhY3RvciBkaWRuJ3QgZmluZCBhbnkgdHJhY2sgZm9yIHRoZSBnaXZlbiBjbGlwIjsKKyAgICBBU1NFUlRfRVEobnVtVHJhY2tzLCBtTnVtVHJhY2tzKQorICAgICAgICAgICAgPDwgIkV4dHJhY3RvciByZXBvcnRlZCB3cm9uZyBudW1iZXIgb2YgdHJhY2sgZm9yIHRoZSBnaXZlbiBjbGlwIjsKIAogICAgIC8vIHN0YXJ0L3N0b3AgdGhlIHRyYWNrcyBtdWx0aXBsZSB0aW1lcwogICAgIGZvciAoaW50MzJfdCBjb3VudCA9IDA7IGNvdW50IDwga01heENvdW50OyBjb3VudCsrKSB7CkBAIC0zNzksMjcgKzU2NSwyOCBAQAogICAgIH0KIH0KIAotVEVTVF9QKEV4dHJhY3RvclVuaXRUZXN0LCBTZWVrVGVzdCkgewotICAgIC8vIEJvdGggRmxhYyBhbmQgV2F2IGV4dHJhY3RvciBjYW4gZ2l2ZSBzYW1wbGVzIGZyb20gYW55IHB0cyBhbmQgbWFyayB0aGUgZ2l2ZW4gc2FtcGxlIGFzCi0gICAgLy8gc3luYyBmcmFtZS4gU28sIHRoaXMgc2VlayB0ZXN0IGlzIG5vdCBhcHBsaWNhYmxlIHRvIEZMQUMgYW5kIFdBViBleHRyYWN0b3JzCi0gICAgaWYgKG1EaXNhYmxlVGVzdCB8fCBtRXh0cmFjdG9yTmFtZSA9PSBGTEFDIHx8IG1FeHRyYWN0b3JOYW1lID09IFdBVikgcmV0dXJuOworVEVTVF9QKEV4dHJhY3RvckZ1bmN0aW9uYWxpdHlUZXN0LCBTZWVrVGVzdCkgeworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKIAotICAgIEFMT0dWKCJWYWxpZGF0ZXMgJXMgRXh0cmFjdG9yIGJlaGF2aW91ciBmb3IgZGlmZmVyZW50IHNlZWsgbW9kZXMiLCBHZXRQYXJhbSgpLmZpcnN0LmNfc3RyKCkpOwotICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBHZXRQYXJhbSgpLnNlY29uZDsKKyAgICBBTE9HVigiVmFsaWRhdGVzICVzIEV4dHJhY3RvciBiZWhhdmlvdXIgZm9yIGRpZmZlcmVudCBzZWVrIG1vZGVzIiwgbUNvbnRhaW5lci5jX3N0cigpKTsKKyAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDE+KEdldFBhcmFtKCkpOwogCiAgICAgaW50MzJfdCBzdGF0dXMgPSBzZXREYXRhU291cmNlKGlucHV0RmlsZU5hbWUpOwotICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJTZXREYXRhU291cmNlIGZhaWxlZCBmb3IiIDw8IEdldFBhcmFtKCkuZmlyc3QgPDwgImV4dHJhY3RvciI7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIlNldERhdGFTb3VyY2UgZmFpbGVkIGZvciIgPDwgbUNvbnRhaW5lciA8PCAiZXh0cmFjdG9yIjsKIAogICAgIHN0YXR1cyA9IGNyZWF0ZUV4dHJhY3RvcigpOwotICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJFeHRyYWN0b3IgY3JlYXRpb24gZmFpbGVkIGZvciIgPDwgR2V0UGFyYW0oKS5maXJzdCA8PCAiZXh0cmFjdG9yIjsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCBmb3IiIDw8IG1Db250YWluZXIgPDwgImV4dHJhY3RvciI7CiAKICAgICBpbnQzMl90IG51bVRyYWNrcyA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7Ci0gICAgQVNTRVJUX0dUKG51bVRyYWNrcywgMCkgPDwgIkV4dHJhY3RvciBkaWRuJ3QgZmluZCBhbnkgdHJhY2sgZm9yIHRoZSBnaXZlbiBjbGlwIjsKKyAgICBBU1NFUlRfRVEobnVtVHJhY2tzLCBtTnVtVHJhY2tzKQorICAgICAgICAgICAgPDwgIkV4dHJhY3RvciByZXBvcnRlZCB3cm9uZyBudW1iZXIgb2YgdHJhY2sgZm9yIHRoZSBnaXZlbiBjbGlwIjsKIAogICAgIHVpbnQzMl90IHNlZWtGbGFnID0gbUV4dHJhY3Rvci0+ZmxhZ3MoKTsKLSAgICBpZiAoIShzZWVrRmxhZyAmIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyOjpDQU5fU0VFSykpIHsKLSAgICAgICAgY291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZC4gIiA8PCBHZXRQYXJhbSgpLmZpcnN0Ci0gICAgICAgICAgICAgPDwgIiBFeHRyYWN0b3IgZG9lc24ndCBzdXBwb3J0IHNlZWtcbiI7CisgICAgYm9vbCBzZWVrU3VwcG9ydGVkID0gZ2V0PDM+KEdldFBhcmFtKCkpOworICAgIGJvb2wgc2Vla2FibGUgPSBzZWVrRmxhZyAmIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyOjpDQU5fU0VFSzsKKyAgICBpZiAoIXNlZWthYmxlKSB7CisgICAgICAgIEFTU0VSVF9GQUxTRShzZWVrU3VwcG9ydGVkKSA8PCBtQ29udGFpbmVyIDw8ICJFeHRyYWN0b3IgaXMgZXhwZWN0ZWQgdG8gc3VwcG9ydCBzZWVrICI7CisgICAgICAgIGNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQuICIgPDwgbUNvbnRhaW5lciA8PCAiIEV4dHJhY3RvciBkb2Vzbid0IHN1cHBvcnQgc2Vla1xuIjsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtNDE1LDE5ICs2MDIsNzMgQEAKICAgICAgICAgTWVkaWFCdWZmZXJHcm91cCAqYnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cCgpOwogICAgICAgICBzdGF0dXMgPSBjVHJhY2stPnN0YXJ0KHRyYWNrLCBidWZmZXJHcm91cC0+d3JhcCgpKTsKICAgICAgICAgQVNTRVJUX0VRKE9LLCAobWVkaWFfc3RhdHVzX3Qpc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0YXJ0IHRoZSB0cmFjayI7Ci0gICAgICAgIGdldFNlZWthYmxlUG9pbnRzKHNlZWthYmxlUG9pbnRzLCB0cmFjayk7Ci0gICAgICAgIEFTU0VSVF9HVChzZWVrYWJsZVBvaW50cy5zaXplKCksIDApCi0gICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBnZXQgc2Vla2FibGUgcG9pbnRzIGZvciAiIDw8IEdldFBhcmFtKCkuZmlyc3QgPDwgIiBleHRyYWN0b3IiOworCisgICAgICAgIC8vIEZvciBGbGFjLCBXYXYgYW5kIE1pZGkgZXh0cmFjdG9yLCBhbGwgc2FtcGxlcyBhcmUgc2VlayBwb2ludHMuCisgICAgICAgIC8vIFdlIGNhbm5vdCBjcmVhdGUgbGlzdCBvZiBhbGwgc2Vla2FibGUgcG9pbnRzIGZvciB0aGVzZS4KKyAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IGlmIHdlIHBhc3MgYSBzZWVrVG9UaW1lU3RhbXAgYmV0d2VlbiB0d28gc2VlayBwb2ludHMsIHdlIG1heQorICAgICAgICAvLyBlbmQgdXAgZ2V0dGluZyB0aGUgdGltZXN0YW1wIG9mIG5leHQgc2FtcGxlIGFzIGEgc2Vla2FibGUgdGltZXN0YW1wLgorICAgICAgICAvLyBUaGlzIHRpbWVzdGFtcCBtYXkvbWF5IG5vdCBiZSBhIHBhcnQgb2YgdGhlIHNlZWthYmxlIHBvaW50IHZlY3RvciB0aGVyZWJ5IGZhaWxpbmcgdGhlCisgICAgICAgIC8vIHRlc3QuIFNvIHdlIHRlc3QgdGhlc2UgZXh0cmFjdG9ycyB1c2luZyByYW5kb20gc2VlayB0ZXN0LgorICAgICAgICBpZiAobUV4dHJhY3Rvck5hbWUgPT0gRkxBQyB8fCBtRXh0cmFjdG9yTmFtZSA9PSBXQVYgfHwgbUV4dHJhY3Rvck5hbWUgPT0gTUlESSkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICp0cmFja01ldGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgICAgICAgICBBU1NFUlRfTkUodHJhY2tNZXRhLCBudWxscHRyKSA8PCAiQU1lZGlhRm9ybWF0X25ldyByZXR1cm5lZCBudWxsIEFNZWRpYWZvcm1hdCI7CisKKyAgICAgICAgICAgIHN0YXR1cyA9IG1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEodHJhY2tNZXRhLCBpZHgsIDEpOworICAgICAgICAgICAgQVNTRVJUX0VRKE9LLCAobWVkaWFfc3RhdHVzX3Qpc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCB0cmFja01ldGFEYXRhIjsKKworICAgICAgICAgICAgaW50NjRfdCBjbGlwRHVyYXRpb24gPSAwOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDY0KHRyYWNrTWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgJmNsaXBEdXJhdGlvbik7CisgICAgICAgICAgICBBU1NFUlRfR1QoY2xpcER1cmF0aW9uLCAwKSA8PCAiSW52YWxpZCBjbGlwIGR1cmF0aW9uICI7CisgICAgICAgICAgICByYW5kb21TZWVrVGVzdCh0cmFjaywgY2xpcER1cmF0aW9uKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUodHJhY2tNZXRhKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKICAgICAgICAgQU1lZGlhRm9ybWF0ICp0cmFja0Zvcm1hdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKICAgICAgICAgQVNTRVJUX05FKHRyYWNrRm9ybWF0LCBudWxscHRyKSA8PCAiQU1lZGlhRm9ybWF0X25ldyByZXR1cm5lZCBudWxsIGZvcm1hdCI7CiAgICAgICAgIHN0YXR1cyA9IHRyYWNrLT5nZXRGb3JtYXQodHJhY2tGb3JtYXQpOwogICAgICAgICBBU1NFUlRfRVEoT0ssIChtZWRpYV9zdGF0dXNfdClzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHRyYWNrIG1ldGEgZGF0YSI7CiAKLSAgICAgICAgYm9vbCBpc09wdXMgPSBmYWxzZTsKICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyh0cmFja0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSk7Ci0gICAgICAgIGlmICghc3RyY21wKG1pbWUsICJhdWRpby9vcHVzIikpIGlzT3B1cyA9IHRydWU7CisgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2tGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKQorICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gZ2V0IG1pbWUiOworCisgICAgICAgIC8vIEltYWdlIGZvcm1hdHMgYXJlIG5vdCBleHBlY3RlZCB0byBiZSBzZWVrYWJsZQorICAgICAgICBpZiAoIXN0cm5jbXAobWltZSwgImltYWdlLyIsIDYpKSBjb250aW51ZTsKKworICAgICAgICAvLyBSZXF1ZXN0IHNlZWthYmxlIHBvaW50cyBmb3IgcmVtYWluaW5nIGV4dHJhY3RvcnMgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHZhbGlkYXRlIHRoZSBzZWVrCisgICAgICAgIC8vIGFjY3VyYWN5IGZvciB0aGUgZXh0cmFjdG9ycy4gRGVwZW5kaW5nIG9uIFNFRUsgTW9kZSwgd2UgZXhwZWN0IHRoZSBleHRyYWN0b3JzIHRvIHJldHVybgorICAgICAgICAvLyB0aGUgZXhwZWN0ZWQgc3luYyBmcmFtZS4gV2UgZG9uJ3QgcHJlZmVyIHJhbmRvbSBzZWVrIHRlc3QgZm9yIHRoZXNlIGV4dHJhY3RvcnMgYmVjYXVzZQorICAgICAgICAvLyB0aGV5IGFyZW4ndCBleHBlY3RlZCB0byBzZWVrIHRvIHJhbmRvbSBzYW1wbGVzLiBNUDQgZm9yIGluc3RhbmNlIGNhbiBzZWVrIHRvCisgICAgICAgIC8vIG5leHQvcHJldmlvdXMgc3luYyBmcmFtZXMgYnV0IG5vdCB0byBzYW1wbGVzIGJldHdlZW4gdHdvIHN5bmMgZnJhbWVzLgorICAgICAgICBnZXRTZWVrYWJsZVBvaW50cyhzZWVrYWJsZVBvaW50cywgdHJhY2spOworICAgICAgICBBU1NFUlRfR1Qoc2Vla2FibGVQb2ludHMuc2l6ZSgpLCAwKQorICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gZ2V0IHNlZWthYmxlIHBvaW50cyBmb3IgIiA8PCBtQ29udGFpbmVyIDw8ICIgZXh0cmFjdG9yIjsKKworICAgICAgICBib29sIGlzT3B1cyA9IGZhbHNlOworICAgICAgICBpbnQ2NF90IG9wdXNTZWVrUHJlUm9sbFVzID0gMDsKKyAgICAgICAgaWYgKCFzdHJjbXAobWltZSwgImF1ZGlvL29wdXMiKSkgeworICAgICAgICAgICAgaXNPcHVzID0gdHJ1ZTsKKyAgICAgICAgICAgIHZvaWQgKnNlZWtQcmVSb2xsQnVmID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHNpemVfdCBzaXplID0gMDsKKyAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFja0Zvcm1hdCwgImNzZC0yIiwgJnNlZWtQcmVSb2xsQnVmLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICBzaXplX3Qgb3B1c0hlYWRTaXplID0gMDsKKyAgICAgICAgICAgICAgICBzaXplX3QgY29kZWNEZWxheUJ1ZlNpemUgPSAwOworICAgICAgICAgICAgICAgIHNpemVfdCBzZWVrUHJlUm9sbEJ1ZlNpemUgPSAwOworICAgICAgICAgICAgICAgIHZvaWQgKmNzZEJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgdm9pZCAqb3B1c0hlYWRCdWYgPSBudWxscHRyOworICAgICAgICAgICAgICAgIHZvaWQgKmNvZGVjRGVsYXlCdWYgPSBudWxscHRyOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2tGb3JtYXQsICJjc2QtMCIsICZjc2RCdWZmZXIsICZzaXplKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfTkUoY3NkQnVmZmVyLCBudWxscHRyKTsKKworICAgICAgICAgICAgICAgIEdldE9wdXNIZWFkZXJCdWZmZXJzKCh1aW50OF90ICopY3NkQnVmZmVyLCBzaXplLCAmb3B1c0hlYWRCdWYsICZvcHVzSGVhZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjRGVsYXlCdWYsICZjb2RlY0RlbGF5QnVmU2l6ZSwgJnNlZWtQcmVSb2xsQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWVrUHJlUm9sbEJ1ZlNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQVNTRVJUX05FKHNlZWtQcmVSb2xsQnVmLCBudWxscHRyKQorICAgICAgICAgICAgICAgICAgICA8PCAiSW52YWxpZCB0cmFjayBmb3JtYXQuIFNlZWtQcmVSb2xsIGluZm8gbWlzc2luZyBmb3IgT3B1cyBmaWxlIjsKKyAgICAgICAgICAgIG9wdXNTZWVrUHJlUm9sbFVzID0gKigoaW50NjRfdCAqKXNlZWtQcmVSb2xsQnVmKTsKKyAgICAgICAgfQogICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKHRyYWNrRm9ybWF0KTsKIAogICAgICAgICBpbnQzMl90IHNlZWtJZHggPSAwOwpAQCAtNDQ4LDcgKzY4OSw3IEBACiAgICAgICAgICAgICAgICAgLy8gZXh0cmFjdG9yIGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gKHNlZWtQdHMgLSBzZWVrUHJlUm9sbFVzKS4KICAgICAgICAgICAgICAgICAvLyBTbyB3ZSBhZGQgdGhlIHByZVJvbGwgdmFsdWUgdG8gdGhlIHRpbWVTdGFtcCB3ZSB3YW50IHRvIHNlZWsgdG8uCiAgICAgICAgICAgICAgICAgaWYgKGlzT3B1cykgewotICAgICAgICAgICAgICAgICAgICBzZWVrVG9UaW1lU3RhbXAgKz0ga09wdXNTZWVrUHJlUm9sbFVzOworICAgICAgICAgICAgICAgICAgICBzZWVrVG9UaW1lU3RhbXAgKz0gb3B1c1NlZWtQcmVSb2xsVXM7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgTWVkaWFUcmFja0hlbHBlcjo6UmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBuZXcgTWVkaWFUcmFja0hlbHBlcjo6UmVhZE9wdGlvbnMoCkBAIC00OTYsMjQgKzczNyw1MTcgQEAKICAgICBzZWVrYWJsZVBvaW50cy5jbGVhcigpOwogfQogCi0vLyBUT0RPOiAoYi8xNDUzMzIxODUpCi0vLyBBZGQgTUlESSBpbnB1dHMKLUlOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChFeHRyYWN0b3JVbml0VGVzdEFsbCwgRXh0cmFjdG9yVW5pdFRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV9wYWlyKCJhYWMiLCAibG91ZHNvZnRhYWMuYWFjIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJhbXIiLCAidGVzdGFtci5hbXIiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImFtciIsICJhbXJ3Yi53YXYiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm9nZyIsICJqb2huX2NhZ2Uub2dnIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJ3YXYiLCAibW9ub3Rlc3Rnc20ud2F2IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJtcGVnMnRzIiwgInNlZ21lbnQwMDAwMDEudHMiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImZsYWMiLCAic2luZXN3ZWVwZmxhYy5mbGFjIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJvZ2ciLCAidGVzdG9wdXMub3B1cyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibWt2IiwgInNpbmVzd2VlcHZvcmJpcy5ta3YiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1wZWc0IiwgInNpbmVzd2VlcG9nZ21wNC5tcDQiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1wMyIsICJzaW5lc3dlZXBtcDNsYW1lLm1wMyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibWt2IiwgInN3aXJsXzE0NHgxMzZfdnA5LndlYm0iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1rdiIsICJzd2lybF8xNDR4MTM2X3ZwOC53ZWJtIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJtcGVnMnBzIiwgInN3aXJsXzE0NHgxMzZfbXBlZzIubXBnIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJtcGVnNCIsICJzd2lybF8xMzJ4MTMwX21wZWc0Lm1wNCIpKSk7CisvLyBUZXN0cyB0aGUgZXh0cmFjdG9ycyBmb3Igc2VlayBiZXlvbmQgcmFuZ2UgOiAoMCwgQ2xpcER1cmF0aW9uKQorVEVTVF9QKEV4dHJhY3RvckZ1bmN0aW9uYWxpdHlUZXN0LCBNb25rZXlTZWVrVGVzdCkgeworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICAvLyBUT0RPKGIvMTU1NjMwNzc4KTogRW5hYmxlIHRlc3QgZm9yIHdhdiBleHRyYWN0b3JzCisgICAgaWYgKG1FeHRyYWN0b3JOYW1lID09IFdBVikgcmV0dXJuOworCisgICAgQUxPR1YoIlZhbGlkYXRlcyAlcyBFeHRyYWN0b3IgYmVoYXZpb3VyIGZvciBpbnZhbGlkIHNlZWsgcG9pbnRzIiwgbUNvbnRhaW5lci5jX3N0cigpKTsKKyAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDE+KEdldFBhcmFtKCkpOworCisgICAgaW50MzJfdCBzdGF0dXMgPSBzZXREYXRhU291cmNlKGlucHV0RmlsZU5hbWUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJTZXREYXRhU291cmNlIGZhaWxlZCBmb3IiIDw8IG1Db250YWluZXIgPDwgImV4dHJhY3RvciI7CisKKyAgICBzdGF0dXMgPSBjcmVhdGVFeHRyYWN0b3IoKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCBmb3IiIDw8IG1Db250YWluZXIgPDwgImV4dHJhY3RvciI7CisKKyAgICBpbnQzMl90IG51bVRyYWNrcyA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CisgICAgQVNTRVJUX0VRKG51bVRyYWNrcywgbU51bVRyYWNrcykKKyAgICAgICAgICAgIDw8ICJFeHRyYWN0b3IgcmVwb3J0ZWQgd3JvbmcgbnVtYmVyIG9mIHRyYWNrIGZvciB0aGUgZ2l2ZW4gY2xpcCI7CisKKyAgICB1aW50MzJfdCBzZWVrRmxhZyA9IG1FeHRyYWN0b3ItPmZsYWdzKCk7CisgICAgYm9vbCBzZWVrU3VwcG9ydGVkID0gZ2V0PDM+KEdldFBhcmFtKCkpOworICAgIGJvb2wgc2Vla2FibGUgPSBzZWVrRmxhZyAmIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyOjpDQU5fU0VFSzsKKyAgICBpZiAoIXNlZWthYmxlKSB7CisgICAgICAgIEFTU0VSVF9GQUxTRShzZWVrU3VwcG9ydGVkKSA8PCBtQ29udGFpbmVyIDw8ICJFeHRyYWN0b3IgaXMgZXhwZWN0ZWQgdG8gc3VwcG9ydCBzZWVrICI7CisgICAgICAgIGNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQuICIgPDwgbUNvbnRhaW5lciA8PCAiIEV4dHJhY3RvciBkb2Vzbid0IHN1cHBvcnQgc2Vla1xuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoaW50MzJfdCBpZHggPSAwOyBpZHggPCBudW1UcmFja3M7IGlkeCsrKSB7CisgICAgICAgIE1lZGlhVHJhY2tIZWxwZXIgKnRyYWNrID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2soaWR4KTsKKyAgICAgICAgQVNTRVJUX05FKHRyYWNrLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGdldCB0cmFjayBmb3IgaW5kZXggIiA8PCBpZHg7CisKKyAgICAgICAgQ01lZGlhVHJhY2sgKmNUcmFjayA9IHdyYXAodHJhY2spOworICAgICAgICBBU1NFUlRfTkUoY1RyYWNrLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGdldCB0cmFjayB3cmFwcGVyIGZvciBpbmRleCAiIDw8IGlkeDsKKworICAgICAgICBNZWRpYUJ1ZmZlckdyb3VwICpidWZmZXJHcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwKCk7CisgICAgICAgIHN0YXR1cyA9IGNUcmFjay0+c3RhcnQodHJhY2ssIGJ1ZmZlckdyb3VwLT53cmFwKCkpOworICAgICAgICBBU1NFUlRfRVEoT0ssIChtZWRpYV9zdGF0dXNfdClzdGF0dXMpIDw8ICJGYWlsZWQgdG8gc3RhcnQgdGhlIHRyYWNrIjsKKworICAgICAgICBBTWVkaWFGb3JtYXQgKnRyYWNrTWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICAgICAgQVNTRVJUX05FKHRyYWNrTWV0YSwgbnVsbHB0cikgPDwgIkFNZWRpYUZvcm1hdF9uZXcgcmV0dXJuZWQgbnVsbCBBTWVkaWFmb3JtYXQiOworCisgICAgICAgIHN0YXR1cyA9IG1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgICAgICAgICAgdHJhY2tNZXRhLCBpZHgsIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyOjprSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhKTsKKyAgICAgICAgQVNTRVJUX0VRKE9LLCAobWVkaWFfc3RhdHVzX3Qpc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCB0cmFja01ldGFEYXRhIjsKKworICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKHRyYWNrTWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpCisgICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBnZXQgbWltZSI7CisKKyAgICAgICAgaW50NjRfdCBjbGlwRHVyYXRpb24gPSAwOworICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50NjQodHJhY2tNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAmY2xpcER1cmF0aW9uKTsKKyAgICAgICAgLy8gSW1hZ2UgZm9ybWF0cyBhcmUgbm90IGV4cGVjdGVkIHRvIGhhdmUgZHVyYXRpb24gaW5mb3JtYXRpb24KKyAgICAgICAgQVNTRVJUX1RSVUUoY2xpcER1cmF0aW9uID4gMCB8fCAhc3RybmNtcChtaW1lLCAiaW1hZ2UvIiwgNikpIDw8ICJJbnZhbGlkIGNsaXAgZHVyYXRpb24gIjsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZSh0cmFja01ldGEpOworCisgICAgICAgIGludDY0X3Qgc2Vla1RvVGltZVN0YW1wVXNbXSA9IHstY2xpcER1cmF0aW9uLCBjbGlwRHVyYXRpb24gLyAyLCBjbGlwRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwRHVyYXRpb24gKiAyfTsKKyAgICAgICAgZm9yIChpbnQzMl90IG1vZGUgPSBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM7CisgICAgICAgICAgICAgbW9kZSA8PSBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1Q7IG1vZGUrKykgeworICAgICAgICAgICAgZm9yIChpbnQ2NF90IHNlZWtUaW1lVXMgOiBzZWVrVG9UaW1lU3RhbXBVcykgeworICAgICAgICAgICAgICAgIE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zICpvcHRpb25zID0gbmV3IE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zKAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSB8IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUssIHNlZWtUaW1lVXMpOworICAgICAgICAgICAgICAgIEFTU0VSVF9ORShvcHRpb25zLCBudWxscHRyKSA8PCAiQ2Fubm90IGNyZWF0ZSByZWFkIG9wdGlvbiI7CisKKyAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB0cmFjay0+cmVhZCgmYnVmZmVyLCBvcHRpb25zKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGFEYXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lU3RhbXA7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQ2NChtZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCAmdGltZVN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlNlZWtlZCB0byB0aW1lc3RhbXAgOiAlbGxkLCByZXF1ZXN0ZWQgOiAlbGxkIiwgKGxvbmcgbG9uZyl0aW1lU3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpc2Vla1RpbWVVcyk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZWxldGUgb3B0aW9uczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBjVHJhY2stPnN0b3AodHJhY2spOworICAgICAgICBBU1NFUlRfRVEoT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBzdG9wIHRoZSB0cmFjayI7CisgICAgICAgIGRlbGV0ZSBidWZmZXJHcm91cDsKKyAgICAgICAgZGVsZXRlIHRyYWNrOworICAgIH0KK30KKworLy8gVGVzdHMgZXh0cmFjdG9ycyBmb3IgaW52YWxpZCB0cmFja3MKK1RFU1RfUChFeHRyYWN0b3JGdW5jdGlvbmFsaXR5VGVzdCwgU2FuaXR5VGVzdCkgeworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICAvLyBUT0RPKGIvMTU1NjI2OTQ2KTogRW5hYmxlIHRlc3QgZm9yIE1QRUcyIFRTL1BTIGV4dHJhY3RvcnMKKyAgICBpZiAobUV4dHJhY3Rvck5hbWUgPT0gTVBFRzJUUyB8fCBtRXh0cmFjdG9yTmFtZSA9PSBNUEVHMlBTKSByZXR1cm47CisKKyAgICBBTE9HVigiVmFsaWRhdGVzICVzIEV4dHJhY3RvciBiZWhhdmlvdXIgZm9yIGludmFsaWQgdHJhY2tzIiwgbUNvbnRhaW5lci5jX3N0cigpKTsKKyAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDE+KEdldFBhcmFtKCkpOworCisgICAgaW50MzJfdCBzdGF0dXMgPSBzZXREYXRhU291cmNlKGlucHV0RmlsZU5hbWUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJTZXREYXRhU291cmNlIGZhaWxlZCBmb3IiIDw8IG1Db250YWluZXIgPDwgImV4dHJhY3RvciI7CisKKyAgICBzdGF0dXMgPSBjcmVhdGVFeHRyYWN0b3IoKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCBmb3IiIDw8IG1Db250YWluZXIgPDwgImV4dHJhY3RvciI7CisKKyAgICBpbnQzMl90IG51bVRyYWNrcyA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CisgICAgQVNTRVJUX0VRKG51bVRyYWNrcywgbU51bVRyYWNrcykKKyAgICAgICAgICAgIDw8ICJFeHRyYWN0b3IgcmVwb3J0ZWQgd3JvbmcgbnVtYmVyIG9mIHRyYWNrIGZvciB0aGUgZ2l2ZW4gY2xpcCI7CisKKyAgICBpbnQzMl90IHRyYWNrSWR4W10gPSB7LTEsIG51bVRyYWNrc307CisgICAgZm9yIChpbnQzMl90IGlkeCA6IHRyYWNrSWR4KSB7CisgICAgICAgIE1lZGlhVHJhY2tIZWxwZXIgKnRyYWNrID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2soaWR4KTsKKyAgICAgICAgQVNTRVJUX0VRKHRyYWNrLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGdldCB0cmFjayBmb3IgaW5kZXggIiA8PCBpZHggPDwgIlxuIjsKKworICAgICAgICBBTWVkaWFGb3JtYXQgKmV4dHJhY3RvckZvcm1hdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICAgICAgQVNTRVJUX05FKGV4dHJhY3RvckZvcm1hdCwgbnVsbHB0cikgPDwgIkFNZWRpYUZvcm1hdF9uZXcgcmV0dXJuZWQgbnVsbCBBTWVkaWFmb3JtYXQiOworCisgICAgICAgIHN0YXR1cyA9IG1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgICAgICAgICAgZXh0cmFjdG9yRm9ybWF0LCBpZHgsIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyOjprSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhKTsKKyAgICAgICAgQVNTRVJUX05FKE9LLCBzdGF0dXMpIDw8ICJnZXRUcmFja01ldGFEYXRhIHNob3VsZCByZXR1cm4gZXJyb3IgZm9yIGludmFsaWQgaW5kZXggIiA8PCBpZHg7CisgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUoZXh0cmFjdG9yRm9ybWF0KTsKKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZSBFeHRyYWN0b3IncyBnZXRUcmFja01ldGFEYXRhIGZvciBudWxsIGZvcm1hdAorICAgIEFNZWRpYUZvcm1hdCAqbWVkaWFGb3JtYXQgPSBudWxscHRyOworICAgIHN0YXR1cyA9IG1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEobWVkaWFGb3JtYXQsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlcjo6a0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YSk7CisgICAgQVNTRVJUX05FKE9LLCBzdGF0dXMpIDw8ICJnZXRUcmFja01ldGFEYXRhIHNob3VsZCByZXR1cm4gZXJyb3IgZm9yIG51bGwgTWVkaWEgZm9ybWF0IjsKK30KKworLy8gVGhpcyB0ZXN0IHZhbGlkYXRlcyBjb25maWcgcGFyYW1zIGZvciBhIGdpdmVuIGlucHV0IGZpbGUuCisvLyBGb3IgdGhpcyB0ZXN0IHdlIG9ubHkgdGFrZSBzaW5nbGUgdHJhY2sgZmlsZXMgc2luY2UgdGhlIGZvY3VzIG9mIHRoaXMgdGVzdCBpcworLy8gdG8gdmFsaWRhdGUgdGhlIGZpbGUgcHJvcGVydGllcyByZXBvcnRlZCBieSBFeHRyYWN0b3IgYW5kIG5vdCBtdWx0aS10cmFjayBiZWhhdmlvcgorVEVTVF9QKENvbmZpZ1BhcmFtVGVzdCwgQ29uZmlnUGFyYW1WYWxpZGF0aW9uKSB7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgc3RyaW5nIGNvbnRhaW5lciA9IEdldFBhcmFtKCkuZmlyc3Q7CisgICAgQUxPR1YoIlZhbGlkYXRlcyAlcyBFeHRyYWN0b3IgZm9yIGlucHV0J3MgZmlsZSBwcm9wZXJ0aWVzIiwgY29udGFpbmVyLmNfc3RyKCkpOworICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCk7CisgICAgaW5wdXRJRCBpbnB1dEZpbGVJZCA9IEdldFBhcmFtKCkuc2Vjb25kOworICAgIGNvbmZpZ0Zvcm1hdCBjb25maWdQYXJhbTsKKyAgICBnZXRGaWxlUHJvcGVydGllcyhpbnB1dEZpbGVJZCwgaW5wdXRGaWxlTmFtZSwgY29uZmlnUGFyYW0pOworCisgICAgaW50MzJfdCBzdGF0dXMgPSBzZXREYXRhU291cmNlKGlucHV0RmlsZU5hbWUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJTZXREYXRhU291cmNlIGZhaWxlZCBmb3IgIiA8PCBjb250YWluZXIgPDwgImV4dHJhY3RvciI7CisKKyAgICBzdGF0dXMgPSBjcmVhdGVFeHRyYWN0b3IoKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCBmb3IgIiA8PCBjb250YWluZXIgPDwgImV4dHJhY3RvciI7CisKKyAgICBpbnQzMl90IG51bVRyYWNrcyA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CisgICAgQVNTRVJUX0dUKG51bVRyYWNrcywgMCkgPDwgIkV4dHJhY3RvciBkaWRuJ3QgZmluZCBhbnkgdHJhY2sgZm9yIHRoZSBnaXZlbiBjbGlwIjsKKworICAgIE1lZGlhVHJhY2tIZWxwZXIgKnRyYWNrID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2soMCk7CisgICAgQVNTRVJUX05FKHRyYWNrLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGdldCB0cmFjayBmb3IgaW5kZXggMCI7CisKKyAgICBBTWVkaWFGb3JtYXQgKnRyYWNrRm9ybWF0ID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIEFTU0VSVF9ORSh0cmFja0Zvcm1hdCwgbnVsbHB0cikgPDwgIkFNZWRpYUZvcm1hdF9uZXcgcmV0dXJuZWQgbnVsbCBmb3JtYXQiOworCisgICAgc3RhdHVzID0gdHJhY2stPmdldEZvcm1hdCh0cmFja0Zvcm1hdCk7CisgICAgQVNTRVJUX0VRKE9LLCAobWVkaWFfc3RhdHVzX3Qpc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCB0cmFjayBtZXRhIGRhdGEiOworCisgICAgY29uc3QgY2hhciAqdHJhY2tNaW1lOworICAgIGJvb2wgdmFsdWVGb3VuZCA9IEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2tGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJnRyYWNrTWltZSk7CisgICAgQVNTRVJUX1RSVUUodmFsdWVGb3VuZCkgPDwgIk1pbWUgdHlwZSBub3Qgc2V0IGJ5IGV4dHJhY3RvciI7CisgICAgQVNTRVJUX1NUUkVRKGNvbmZpZ1BhcmFtLm1pbWUuY19zdHIoKSwgdHJhY2tNaW1lKSA8PCAiSW52YWxpZCB0cmFjayBmb3JtYXQiOworCisgICAgaWYgKCFzdHJuY21wKHRyYWNrTWltZSwgImF1ZGlvLyIsIDYpKSB7CisgICAgICAgIGludDMyX3QgdHJhY2tTYW1wbGVSYXRlLCB0cmFja0NoYW5uZWxDb3VudDsKKyAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKHRyYWNrRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2tDaGFubmVsQ291bnQpKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoCisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKHRyYWNrRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCAmdHJhY2tTYW1wbGVSYXRlKSk7CisgICAgICAgIEFTU0VSVF9FUShjb25maWdQYXJhbS5zYW1wbGVSYXRlLCB0cmFja1NhbXBsZVJhdGUpIDw8ICJTYW1wbGVSYXRlIG5vdCBhcyBleHBlY3RlZCI7CisgICAgICAgIEFTU0VSVF9FUShjb25maWdQYXJhbS5jaGFubmVsQ291bnQsIHRyYWNrQ2hhbm5lbENvdW50KSA8PCAiQ2hhbm5lbENvdW50IG5vdCBhcyBleHBlY3RlZCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50MzJfdCB0cmFja1dpZHRoLCB0cmFja0hlaWdodDsKKyAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKHRyYWNrRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCAmdHJhY2tXaWR0aCkpOworICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIodHJhY2tGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULCAmdHJhY2tIZWlnaHQpKTsKKyAgICAgICAgQVNTRVJUX0VRKGNvbmZpZ1BhcmFtLndpZHRoLCB0cmFja1dpZHRoKSA8PCAiV2lkdGggbm90IGFzIGV4cGVjdGVkIjsKKyAgICAgICAgQVNTRVJUX0VRKGNvbmZpZ1BhcmFtLmhlaWdodCwgdHJhY2tIZWlnaHQpIDw8ICJIZWlnaHQgbm90IGFzIGV4cGVjdGVkIjsKKworICAgICAgICBpZiAoY29uZmlnUGFyYW0uZnJhbWVSYXRlICE9IGtVbmRlZmluZWQpIHsKKyAgICAgICAgICAgIGludDMyX3QgZnJhbWVSYXRlOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoCisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMih0cmFja0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFLCAmZnJhbWVSYXRlKSk7CisgICAgICAgICAgICBBU1NFUlRfRVEoY29uZmlnUGFyYW0uZnJhbWVSYXRlLCBmcmFtZVJhdGUpIDw8ICJmcmFtZVJhdGUgbm90IGFzIGV4cGVjdGVkIjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyB2YWxpZGF0ZSB0aGUgcHJvZmlsZSBmb3IgdGhlIGlucHV0IGNsaXAKKyAgICBpbnQzMl90IHByb2ZpbGU7CisgICAgaWYgKGNvbmZpZ1BhcmFtLnByb2ZpbGUgIT0ga1VuZGVmaW5lZCkgeworICAgICAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDMyKHRyYWNrRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1BST0ZJTEUsICZwcm9maWxlKSkgeworICAgICAgICAgICAgQVNTRVJUX0VRKGNvbmZpZ1BhcmFtLnByb2ZpbGUsIHByb2ZpbGUpIDw8ICJwcm9maWxlIG5vdCBhcyBleHBlY3RlZCI7CisgICAgICAgIH0gZWxzZSBpZiAobUV4dHJhY3Rvck5hbWUgPT0gQUFDICYmCisgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKHRyYWNrRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0FBQ19QUk9GSUxFLCAmcHJvZmlsZSkpIHsKKyAgICAgICAgICAgIEFTU0VSVF9FUShjb25maWdQYXJhbS5wcm9maWxlLCBwcm9maWxlKSA8PCAicHJvZmlsZSBub3QgYXMgZXhwZWN0ZWQiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJwcm9maWxlIG5vdCByZXR1cm5lZCBpbiBleHRyYWN0b3IiOworICAgICAgICB9CisgICAgfQorCisgICAgZGVsZXRlIHRyYWNrOworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUodHJhY2tGb3JtYXQpOworfQorCitjbGFzcyBFeHRyYWN0b3JDb21wYXJpc29uCisgICAgOiBwdWJsaWMgRXh0cmFjdG9yVW5pdFRlc3QsCisgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHBhaXI8c3RyaW5nIC8qIElucHV0RmlsZTAgKi8sIHN0cmluZyAvKiBJbnB1dEZpbGUxICovPj4geworICBwdWJsaWM6CisgICAgfkV4dHJhY3RvckNvbXBhcmlzb24oKSB7CisgICAgICAgIGZvciAoaW50OF90ICpleHRyYWN0b3JPcCA6IG1FeHRyYWN0b3JPdXRwdXQpIHsKKyAgICAgICAgICAgIGlmIChleHRyYWN0b3JPcCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgZnJlZShleHRyYWN0b3JPcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQ4X3QgKm1FeHRyYWN0b3JPdXRwdXRbMl17fTsKKyAgICBzaXplX3QgbUV4dHJhY3Rvck91cHV0U2l6ZVsyXXt9OworfTsKKworc2l6ZV90IGFsbG9jYXRlT3V0cHV0QnVmZmVycyhzdHJpbmcgaW5wdXRGaWxlTmFtZSwgQU1lZGlhRm9ybWF0ICpleHRyYWN0b3JGb3JtYXQpIHsKKyAgICBzaXplX3QgYnVmZmVyU2l6ZSA9IDB1OworICAgIC8vIGFsbG9jYXRpbmcgdGhlIGJ1ZmZlciBzaXplIGFzIHNhbXBsZVJhdGUgKiBjaGFubmVsQ291bnQgKiBjbGlwRHVyYXRpb24gc2luY2UKKyAgICAvLyBzb21lIGV4dHJhY3RvcnMgbGlrZSBmbGFjLCBtaWRpIGFuZCB3YXYgZGVjb2RlcyB0aGUgZmlsZS4gVGhlc2UgZXh0cmFjdG9ycworICAgIC8vIGFkdmVydGlzZSB0aGUgbWltZSB0eXBlIGFzIHJhdy4KKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcoZXh0cmFjdG9yRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKTsKKyAgICBpZiAoIXN0cmNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKSB7CisgICAgICAgIGludDY0X3QgY2xpcER1cmF0aW9uVXMgPSAtMTsKKyAgICAgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSAtMTsKKyAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlID0gLTE7CisgICAgICAgIGludDMyX3QgYml0c1BlclNhbXBwbGUgPSAtMTsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZXh0cmFjdG9yRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFubmVsQ291bnQpIHx8IGNoYW5uZWxDb3VudCA8PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBjaGFubmVsQ291bnQgZm9yIGlucHV0IGZpbGUgOiAlcyIsIGlucHV0RmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihleHRyYWN0b3JGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsICZzYW1wbGVSYXRlKSB8fAorICAgICAgICAgICAgc2FtcGxlUmF0ZSA8PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBzYW1wbGVSYXRlIGZvciBpbnB1dCBmaWxlIDogJXMiLCBpbnB1dEZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50NjQoZXh0cmFjdG9yRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAmY2xpcER1cmF0aW9uVXMpIHx8CisgICAgICAgICAgICBjbGlwRHVyYXRpb25VcyA8PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBjbGlwIGR1cmF0aW9uIGZvciBpbnB1dCBmaWxlIDogJXMiLCBpbnB1dEZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZXh0cmFjdG9yRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1BDTV9FTkNPRElORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJpdHNQZXJTYW1wcGxlKSB8fCBiaXRzUGVyU2FtcHBsZSA8PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBiaXRzIHBlciBzYW1wbGUgZm9yIGlucHV0IGZpbGUgOiAlcyIsIGlucHV0RmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBidWZmZXJTaXplID0gYml0c1BlclNhbXBwbGUgKiBjaGFubmVsQ291bnQgKiBzYW1wbGVSYXRlICogKGNsaXBEdXJhdGlvblVzIC8gMTAwMDAwMCArIDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICAgICAgaW50MzJfdCBzdGF0dXMgPSBzdGF0KGlucHV0RmlsZU5hbWUuY19zdHIoKSwgJmJ1Zik7CisgICAgICAgIGlmIChzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBnZXQgZmlsZSBwcm9wZXJ0aWVzIGZvcjogJXMiLCBpbnB1dEZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgYnVmZmVyU2l6ZSA9IGJ1Zi5zdF9zaXplOworICAgIH0KKyAgICByZXR1cm4gYnVmZmVyU2l6ZTsKK30KKworLy8gQ29tcGFyZSBvdXRwdXQgb2YgdHdvIGV4dHJhY3RvcnMgZm9yIGlkZW50aWNhbCBjb250ZW50CitURVNUX1AoRXh0cmFjdG9yQ29tcGFyaXNvbiwgRXh0cmFjdG9yQ29tcGFyaXNvblRlc3QpIHsKKyAgICB2ZWN0b3I8c3RyaW5nPiBpbnB1dEZpbGVOYW1lcyA9IHtHZXRQYXJhbSgpLmZpcnN0LCBHZXRQYXJhbSgpLnNlY29uZH07CisgICAgc2l6ZV90IGV4dHJhY3RlZE91dHB1dFNpemVbMl17fTsKKyAgICBBTWVkaWFGb3JtYXQgKmV4dHJhY3RvckZvcm1hdFsyXXt9OworICAgIGludDMyX3Qgc3RhdHVzID0gT0s7CisKKyAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwgaW5wdXRGaWxlTmFtZXMuc2l6ZSgpOyBpZHgrKykgeworICAgICAgICBzdHJpbmcgY29udGFpbmVyRm9ybWF0ID0gaW5wdXRGaWxlTmFtZXNbaWR4XS5zdWJzdHIoaW5wdXRGaWxlTmFtZXNbaWR4XS5maW5kKCIuIikgKyAxKTsKKyAgICAgICAgc2V0dXBFeHRyYWN0b3IoY29udGFpbmVyRm9ybWF0KTsKKyAgICAgICAgaWYgKG1EaXNhYmxlVGVzdCkgeworICAgICAgICAgICAgQUxPR1YoIlVua25vd24gZXh0cmFjdG9yICVzLiBTa2lwcGluZyB0aGUgdGVzdCIsIGNvbnRhaW5lckZvcm1hdC5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJWYWxpZGF0ZXMgJXMgRXh0cmFjdG9yIGZvciAlcyIsIGNvbnRhaW5lckZvcm1hdC5jX3N0cigpLAorICAgICAgICAgICAgICBpbnB1dEZpbGVOYW1lc1tpZHhdLmNfc3RyKCkpOworICAgICAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgaW5wdXRGaWxlTmFtZXNbaWR4XTsKKworICAgICAgICBzdGF0dXMgPSBzZXREYXRhU291cmNlKGlucHV0RmlsZU5hbWUpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiU2V0RGF0YVNvdXJjZSBmYWlsZWQgZm9yIiA8PCBjb250YWluZXJGb3JtYXQgPDwgImV4dHJhY3RvciI7CisKKyAgICAgICAgc3RhdHVzID0gY3JlYXRlRXh0cmFjdG9yKCk7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJFeHRyYWN0b3IgY3JlYXRpb24gZmFpbGVkIGZvciAiIDw8IGNvbnRhaW5lckZvcm1hdCA8PCAiIGV4dHJhY3RvciI7CisKKyAgICAgICAgaW50MzJfdCBudW1UcmFja3MgPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOworICAgICAgICBBU1NFUlRfRVEobnVtVHJhY2tzLCAxKSA8PCAiVGhpcyB0ZXN0IGV4cGVjdHMgaW5wdXRzIHdpdGggb25lIHRyYWNrIG9ubHkiOworCisgICAgICAgIGludDMyX3QgdHJhY2tJZHggPSAwOworICAgICAgICBNZWRpYVRyYWNrSGVscGVyICp0cmFjayA9IG1FeHRyYWN0b3ItPmdldFRyYWNrKHRyYWNrSWR4KTsKKyAgICAgICAgQVNTRVJUX05FKHRyYWNrLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGdldCB0cmFjayBmb3IgaW5kZXggIiA8PCB0cmFja0lkeDsKKworICAgICAgICBleHRyYWN0b3JGb3JtYXRbaWR4XSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICAgICAgQVNTRVJUX05FKGV4dHJhY3RvckZvcm1hdFtpZHhdLCBudWxscHRyKSA8PCAiQU1lZGlhRm9ybWF0X25ldyByZXR1cm5lZCBudWxsIEFNZWRpYWZvcm1hdCI7CisKKyAgICAgICAgc3RhdHVzID0gdHJhY2stPmdldEZvcm1hdChleHRyYWN0b3JGb3JtYXRbaWR4XSk7CisgICAgICAgIEFTU0VSVF9FUShPSywgKG1lZGlhX3N0YXR1c190KXN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgdHJhY2sgbWV0YSBkYXRhIjsKKworICAgICAgICBDTWVkaWFUcmFjayAqY1RyYWNrID0gd3JhcCh0cmFjayk7CisgICAgICAgIEFTU0VSVF9ORShjVHJhY2ssIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gZ2V0IHRyYWNrIHdyYXBwZXIgZm9yIGluZGV4ICIgPDwgdHJhY2tJZHg7CisKKyAgICAgICAgbUV4dHJhY3Rvck91cHV0U2l6ZVtpZHhdID0gYWxsb2NhdGVPdXRwdXRCdWZmZXJzKGlucHV0RmlsZU5hbWUsIGV4dHJhY3RvckZvcm1hdFtpZHhdKTsKKyAgICAgICAgQVNTRVJUX0dUKG1FeHRyYWN0b3JPdXB1dFNpemVbaWR4XSwgMHUpIDw8ICIgSW52YWxpZCBzaXplIGZvciBvdXRwdXQgYnVmZmVycyI7CisKKyAgICAgICAgbUV4dHJhY3Rvck91dHB1dFtpZHhdID0gKGludDhfdCAqKWNhbGxvYygxLCBtRXh0cmFjdG9yT3VwdXRTaXplW2lkeF0pOworICAgICAgICBBU1NFUlRfTkUobUV4dHJhY3Rvck91dHB1dFtpZHhdLCBudWxscHRyKQorICAgICAgICAgICAgICAgIDw8ICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciB3cml0aW5nIGV4dHJhY3RvcidzIG91dHB1dCI7CisKKyAgICAgICAgTWVkaWFCdWZmZXJHcm91cCAqYnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cCgpOworICAgICAgICBzdGF0dXMgPSBjVHJhY2stPnN0YXJ0KHRyYWNrLCBidWZmZXJHcm91cC0+d3JhcCgpKTsKKyAgICAgICAgQVNTRVJUX0VRKE9LLCAobWVkaWFfc3RhdHVzX3Qpc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0YXJ0IHRoZSB0cmFjayI7CisKKyAgICAgICAgaW50MzJfdCBvZmZzZXQgPSAwOworICAgICAgICB3aGlsZSAoc3RhdHVzICE9IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHN0YXR1cyA9IHRyYWNrLT5yZWFkKCZidWZmZXIpOworICAgICAgICAgICAgQUxPR1YoInRyYWNrLT5yZWFkIFN0YXR1cyA9ICVkIGJ1ZmZlciAlcCIsIHN0YXR1cywgYnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgICAgICBBU1NFUlRfTEUob2Zmc2V0ICsgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSwgbUV4dHJhY3Rvck91cHV0U2l6ZVtpZHhdKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIk1lbW9yeSBvdmVyZmxvdy4gRXh0cmFjdGVkIG91dHB1dCBzaXplIG1vcmUgdGhhbiBleHBlY3RlZCI7CisKKyAgICAgICAgICAgICAgICBtZW1jcHkobUV4dHJhY3Rvck91dHB1dFtpZHhdICsgb2Zmc2V0LCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgZXh0cmFjdGVkT3V0cHV0U2l6ZVtpZHhdICs9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gY1RyYWNrLT5zdG9wKHRyYWNrKTsKKyAgICAgICAgQVNTRVJUX0VRKE9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gc3RvcCB0aGUgdHJhY2siOworCisgICAgICAgIGZjbG9zZShtSW5wdXRGcCk7CisgICAgICAgIGRlbGV0ZSBidWZmZXJHcm91cDsKKyAgICAgICAgZGVsZXRlIHRyYWNrOworICAgICAgICBtRGF0YVNvdXJjZS5jbGVhcigpOworICAgICAgICBkZWxldGUgbUV4dHJhY3RvcjsKKyAgICAgICAgbUlucHV0RnAgPSBudWxscHRyOworICAgICAgICBtRXh0cmFjdG9yID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICAvLyBDb21wYXJlIHRoZSBtZXRhIGRhdGEgZnJvbSBib3RoIHRoZSBleHRyYWN0b3JzCisgICAgY29uc3QgY2hhciAqbWltZVsyXTsKKyAgICBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKGV4dHJhY3RvckZvcm1hdFswXSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZVswXSk7CisgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyhleHRyYWN0b3JGb3JtYXRbMV0sIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWVbMV0pOworICAgIEFTU0VSVF9TVFJFUShtaW1lWzBdLCBtaW1lWzFdKSA8PCAiTWlzbWF0Y2ggYmV0d2VlbiBleHRyYWN0b3IncyBmb3JtYXQiOworCisgICAgaWYgKCFzdHJuY21wKG1pbWVbMF0sICJhdWRpby8iLCA2KSkgeworICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudDAsIGNoYW5uZWxDb3VudDE7CisgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZTAsIHNhbXBsZVJhdGUxOworICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZXh0cmFjdG9yRm9ybWF0WzBdLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2hhbm5lbENvdW50MCkpOworICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZXh0cmFjdG9yRm9ybWF0WzBdLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVJhdGUwKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihleHRyYWN0b3JGb3JtYXRbMV0sIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGFubmVsQ291bnQxKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihleHRyYWN0b3JGb3JtYXRbMV0sIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlUmF0ZTEpKTsKKyAgICAgICAgQVNTRVJUX0VRKGNoYW5uZWxDb3VudDAsIGNoYW5uZWxDb3VudDEpIDw8ICJNaXNtYXRjaCBiZXR3ZWVuIGV4dHJhY3RvcidzIGNoYW5uZWxDb3VudCI7CisgICAgICAgIEFTU0VSVF9FUShzYW1wbGVSYXRlMCwgc2FtcGxlUmF0ZTEpIDw8ICJNaXNtYXRjaCBiZXR3ZWVuIGV4dHJhY3RvcidzIHNhbXBsZVJhdGUiOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAobWltZVswXSwgInZpZGVvLyIsIDYpKSB7CisgICAgICAgIGludDMyX3Qgd2lkdGgwLCBoZWlnaHQwOworICAgICAgICBpbnQzMl90IHdpZHRoMSwgaGVpZ2h0MTsKKyAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKGV4dHJhY3RvckZvcm1hdFswXSwgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgJndpZHRoMCkpOworICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZXh0cmFjdG9yRm9ybWF0WzBdLCBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwgJmhlaWdodDApKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKGV4dHJhY3RvckZvcm1hdFsxXSwgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgJndpZHRoMSkpOworICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZXh0cmFjdG9yRm9ybWF0WzFdLCBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwgJmhlaWdodDEpKTsKKyAgICAgICAgQVNTRVJUX0VRKHdpZHRoMCwgd2lkdGgxKSA8PCAiTWlzbWF0Y2ggYmV0d2VlbiBleHRyYWN0b3IncyB3aWR0aCI7CisgICAgICAgIEFTU0VSVF9FUShoZWlnaHQwLCBoZWlnaHQxKSA8PCAiTWlzbWF0Y2ggYmV0d2VlbiBleHRyYWN0b3IncyBoZWlnaHQiOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAiSW52YWxpZCBtaW1lIHR5cGUgIiA8PCBtaW1lWzBdOworICAgIH0KKworICAgIGZvciAoQU1lZGlhRm9ybWF0ICpleEZvcm1hdCA6IGV4dHJhY3RvckZvcm1hdCkgeworICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGV4Rm9ybWF0KTsKKyAgICB9CisKKyAgICAvLyBDb21wYXJlIHRoZSBleHRyYWN0ZWQgb3V0cHV0cyBvZiBib3RoIGV4dHJhY3RvcgorICAgIEFTU0VSVF9FUShleHRyYWN0ZWRPdXRwdXRTaXplWzBdLCBleHRyYWN0ZWRPdXRwdXRTaXplWzFdKQorICAgICAgICAgICAgPDwgIkV4dHJhY3RvcidzIG91dHB1dCBzaXplIGRvZXNuJ3QgbWF0Y2ggYmV0d2VlbiAiIDw8IGlucHV0RmlsZU5hbWVzWzBdIDw8ICJhbmQgIgorICAgICAgICAgICAgPDwgaW5wdXRGaWxlTmFtZXNbMV0gPDwgIiBleHRyYWN0b3JzIjsKKyAgICBzdGF0dXMgPSBtZW1jbXAobUV4dHJhY3Rvck91dHB1dFswXSwgbUV4dHJhY3Rvck91dHB1dFsxXSwgZXh0cmFjdGVkT3V0cHV0U2l6ZVswXSk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkV4dHJhY3RlZCBjb250ZW50IG1pc21hdGNoIGJldHdlZW4gIiA8PCBpbnB1dEZpbGVOYW1lc1swXSA8PCAiYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbnB1dEZpbGVOYW1lc1sxXSA8PCAiIGV4dHJhY3RvcnMiOworfQorCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIEV4dHJhY3RvckNvbXBhcmlzb25BbGwsIEV4dHJhY3RvckNvbXBhcmlzb24sCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfcGFpcigic3dpcmxfMTQ0eDEzNl92cDkubXA0IiwgInN3aXJsXzE0NHgxMzZfdnA5LndlYm0iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJ2aWRlb180ODB4MzYwX21wNF92cDlfMzMza2Jwc18yNWZwcy5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvXzQ4MHgzNjBfd2VibV92cDlfMzMza2Jwc18yNWZwcy53ZWJtIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigidmlkZW9fMTI4MHg3MjBfYXYxX2hkcl9zdGF0aWNfM21icHMubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlb18xMjgweDcyMF9hdjFfaGRyX3N0YXRpY18zbWJwcy53ZWJtIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic3dpcmxfMTMyeDEzMF9tcGVnNC4zZ3AiLCAic3dpcmxfMTMyeDEzMF9tcGVnNC5ta3YiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzd2lybF8xNDR4MTM2X2F2Yy5ta3YiLCAic3dpcmxfMTQ0eDEzNl9hdmMubXA0IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic3dpcmxfMTMyeDEzMF9tcGVnNC5tcDQiLCAic3dpcmxfMTMyeDEzMF9tcGVnNC5ta3YiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJjcm93ZF81MDh4MjQwXzI1ZnBzX2hldmMubXA0IiwiY3Jvd2RfNTA4eDI0MF8yNWZwc19oZXZjLm1rdiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl9jaWZfNzY4a2Jwc18zMGZwc19tcGVnMi5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJiYl9jaWZfNzY4a2Jwc18zMGZwc19tcGVnMi50cyIpLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibG91ZHNvZnRhYWMuYWFjIiwgImxvdWRzb2Z0YWFjLm1rdiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInNpbmVzd2VlcGZsYWNta3YubWt2IiwgInNpbmVzd2VlcGZsYWNtcDQubXA0IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic2luZXN3ZWVwbXAzbGFtZS5tcDMiLCAic2luZXN3ZWVwbXAzbGFtZS5ta3YiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzaW5lc3dlZXBvZ2dtcDQubXA0IiwgInNpbmVzd2VlcG9nZy5vZ2ciKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzaW5lc3dlZXB2b3JiaXMubXA0IiwgInNpbmVzd2VlcHZvcmJpcy5vZ2ciKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzaW5lc3dlZXB2b3JiaXMubWt2IiwgInNpbmVzd2VlcHZvcmJpcy5vZ2ciKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJ0ZXN0b3B1cy5ta3YiLCAidGVzdG9wdXMubXA0IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigidGVzdG9wdXMubXA0IiwgInRlc3RvcHVzLm9wdXMiKSwKKworICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImxvdWRzb2Z0YWFjLmFhYyIsICJsb3Vkc29mdGFhYy5hYWMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJ0ZXN0YW1yLmFtciIsICJ0ZXN0YW1yLmFtciIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInNpbmVzd2VlcGZsYWMuZmxhYyIsICJzaW5lc3dlZXBmbGFjLmZsYWMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJtaWRpX2EubWlkIiwgIm1pZGlfYS5taWQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzaW5lc3dlZXB2b3JiaXMubWt2IiwgInNpbmVzd2VlcHZvcmJpcy5ta3YiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzaW5lc3dlZXBtcDNsYW1lLm1wMyIsICJzaW5lc3dlZXBtcDNsYW1lLm1wMyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInNpbmVzd2VlcG9nZ21wNC5tcDQiLCAic2luZXN3ZWVwb2dnbXA0Lm1wNCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInRlc3RvcHVzLm9wdXMiLCAidGVzdG9wdXMub3B1cyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImpvaG5fY2FnZS5vZ2ciLCAiam9obl9jYWdlLm9nZyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1vbm90ZXN0Z3NtLndhdiIsICJtb25vdGVzdGdzbS53YXYiKSwKKworICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInN3aXJsXzE0NHgxMzZfbXBlZzIubXBnIiwgInN3aXJsXzE0NHgxMzZfbXBlZzIubXBnIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic3dpcmxfMTMyeDEzMF9tcGVnNC5tcDQiLCAic3dpcmxfMTMyeDEzMF9tcGVnNC5tcDQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzd2lybF8xNDR4MTM2X3ZwOS53ZWJtIiwgInN3aXJsXzE0NHgxMzZfdnA5LndlYm0iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzd2lybF8xNDR4MTM2X3ZwOC53ZWJtIiwgInN3aXJsXzE0NHgxMzZfdnA4LndlYm0iKSkpOworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoQ29uZmlnUGFyYW1UZXN0QWxsLCBDb25maWdQYXJhbVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV9wYWlyKCJhYWMiLCBBQUNfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJhbXIiLCBBTVJfTkJfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJhbXIiLCBBTVJfV0JfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJmbGFjIiwgRkxBQ18xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIndhdiIsIEdTTV8xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1pZGkiLCBNSURJXzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibXAzIiwgTVAzXzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigib2dnIiwgT1BVU18xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm9nZyIsIFZPUkJJU18xKSwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibXBlZzQiLCBIRVZDXzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibXBlZzQiLCBIRVZDXzIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibXBlZzJwcyIsIE1QRUcyX1BTXzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibXBlZzJ0cyIsIE1QRUcyX1RTXzEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibWt2IiwgTVBFRzRfMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJta3YiLCBWUDlfMSkpKTsKKworLy8gVmFsaWRhdGUgZXh0cmFjdG9ycyBmb3IgY29udGFpbmVyIGZvcm1hdCwgaW5wdXQgZmlsZSwgbm8uIG9mIHRyYWNrcyBhbmQgc3VwcG9ydHMgc2VlayBmbGFnCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIEV4dHJhY3RvclVuaXRUZXN0QWxsLCBFeHRyYWN0b3JGdW5jdGlvbmFsaXR5VGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYWFjIiwgImxvdWRzb2Z0YWFjLmFhYyIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImFtciIsICJ0ZXN0YW1yLmFtciIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImFtciIsICJhbXJ3Yi53YXYiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJmbGFjIiwgInNpbmVzd2VlcGZsYWMuZmxhYyIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1pZGkiLCAibWlkaV9hLm1pZCIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1rdiIsICJzaW5lc3dlZXB2b3JiaXMubWt2IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibWt2IiwgInNpbmVzd2VlcG1wM2xhbWUubWt2IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibWt2IiwgImxvdWRzb2Z0YWFjLm1rdiIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wMyIsICJzaW5lc3dlZXBtcDNsYW1lLm1wMyIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wMyIsICJpZDN0ZXN0MTAubXAzIiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzJ0cyIsICJzZWdtZW50MDAwMDAxLnRzIiwgMiwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWcydHMiLCAidGVzdGFjM3RzLnRzIiwgMSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWcydHMiLCAidGVzdGFjNHRzLnRzIiwgMSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWcydHMiLCAidGVzdGVhYzN0cy50cyIsIDEsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsICJhdWRpb19hYWNfbW9ub183MGtic180NDEwMGh6Lm1wNCIsIDIsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgIm11bHRpMF9hYzQubXA0IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCAibm9pc2VfNmNoXzQ0a2h6X2FvdDVfZHJfc2JyX3NpZzJfbXA0Lm00YSIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgInNpbmVzd2VlcGFsYWMubW92IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCAic2luZXN3ZWVwZmxhY21wNC5tcDQiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsICJzaW5lc3dlZXBtNGEubTRhIiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCAic2luZXN3ZWVwb2dnbXA0Lm1wNCIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgInNpbmVzd2VlcG9wdXNtcDQubXA0IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCAidGVzdGFjM21wNC5tcDQiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsICJ0ZXN0ZWFjM21wNC5tcDQiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJvZ2ciLCAiam9obl9jYWdlLm9nZyIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm9nZyIsICJ0ZXN0b3B1cy5vcHVzIiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgib2dnIiwgInNpbmVzd2VlcG9nZ2FsYnVtYXJ0Lm9nZyIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIndhdiIsICJsb3Vkc29mdHdhdi53YXYiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ3YXYiLCAibW9ub3Rlc3Rnc20ud2F2IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgid2F2IiwgIm5vaXNlXzVjaF80NGtoel9hb3QyX3dhdmUud2F2IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgid2F2IiwgInNpbmUxa2h6bTQwZGJfYWxhdy53YXYiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ3YXYiLCAic2luZTFraHptNDBkYl9mMzJsZS53YXYiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ3YXYiLCAic2luZTFraHptNDBkYl9tdWxhdy53YXYiLCAxLCB0cnVlKSwKKworICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1rdiIsICJzd2lybF8xNDR4MTM2X2F2Yy5ta3YiLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJta3YiLCAid2l0aG91dGN1ZXMubWt2IiwgMiwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibWt2IiwgInN3aXJsXzE0NHgxMzZfdnA5LndlYm0iLCAxLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJta3YiLCAic3dpcmxfMTQ0eDEzNl92cDgud2VibSIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWcycHMiLCAic3dpcmxfMTQ0eDEzNl9tcGVnMi5tcGciLCAxLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzJwcyIsICJwcm9ncmFtc3RyZWFtLm1wZWciLCAyLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCAiY29sb3JfMTc2eDE0NF9idDYwMV81MjVfbHJfc2RyX2gyNjQubXA0IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCAiaGVpZndyaXRlcl9pbnB1dC5oZWljIiwgNCwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgInBzc2h0ZXN0Lm1wNCIsIDEsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgInN3aXJsXzEzMngxMzBfbXBlZzQubXA0IiwgMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCAidGVzdHZpZGVvLjNncCIsIDQsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgInRlc3R2aWRlb193aXRoXzJfdGltZWR0ZXh0X3RyYWNrcy4zZ3AiLCA0LCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW9fMTc2eDE0NF8zZ3BfaDI2M18zMDBrYnBzXzI1ZnBzX2FhY19zdGVyZW9fMTI4a2Jwc18xMTAyNWh6XyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXRhZGF0YV9neXJvX2NvbXBsaWFudC4zZ3AiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICJtcGVnNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAidmlkZW9fMTkyMHgxMDgwX21wNF9tcGVnMl8xMjAwMGticHNfMzBmcHNfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDIsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2aWRlb180ODB4MzYwX21wNF9oZXZjXzY1MGticHNfMzBmcHNfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoubXA0IiwgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoCisgICAgICAgICAgICAgICAgICAgICAgICAibXBlZzQiLAorICAgICAgICAgICAgICAgICAgICAgICAgInZpZGVvXzQ4MHgzNjBfbXA0X2gyNjRfMTM1MGticHNfMzBmcHNfYWFjX3N0ZXJlb18xMjhrYnBzXzQ0MTAwaHpfZGFzaC5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMiwgdHJ1ZSkpKTsKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CiAgICAgZ0VudiA9IG5ldyBFeHRyYWN0b3JVbml0VGVzdEVudmlyb25tZW50KCk7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL1JFQURNRS5tZCBiL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvUkVBRE1FLm1kCmluZGV4IDY5NTM4YjYuLmNmZjA5Y2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvUkVBRE1FLm1kCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvUkVBRE1FLm1kCkBAIC0yMiw3ICsyMiw3IEBACiBhZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0L0V4dHJhY3RvclVuaXRUZXN0L0V4dHJhY3RvclVuaXRUZXN0IC9kYXRhL2xvY2FsL3RtcC8KIGBgYAogCi1UaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9leHRyYWN0b3IuemlwKS4gRG93bmxvYWQsIHVuemlwIGFuZCBwdXNoIHRoZXNlIGZpbGVzIGludG8gZGV2aWNlIGZvciB0ZXN0aW5nLgorVGhlIHJlc291cmNlIGZpbGUgZm9yIHRoZSB0ZXN0cyBpcyB0YWtlbiBmcm9tIFtoZXJlXShodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvZXh0cmFjdG9yLTEuNC56aXApLiBEb3dubG9hZCwgdW56aXAgYW5kIHB1c2ggdGhlc2UgZmlsZXMgaW50byBkZXZpY2UgZm9yIHRlc3RpbmcuCiAKIGBgYAogYWRiIHB1c2ggZXh0cmFjdG9yIC9kYXRhL2xvY2FsL3RtcC8KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvd2F2L0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9BbmRyb2lkLmJwCmluZGV4IDVkMzhhODEuLjg1ZDRjY2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvd2F2L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy93YXYvQW5kcm9pZC5icApAQCAtMTksNCArMTksMTEgQEAKICAgICAgICAgImxpYmZpZm8iLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgXSwKKworICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9qYW5pdG9ycy9PV05FUlMtY29kZWNzIGIvbWVkaWEvamFuaXRvcnMvT1dORVJTLWNvZGVjcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjAxMzk5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamFuaXRvcnMvT1dORVJTLWNvZGVjcwpAQCAtMCwwICsxLDUgQEAKKyMgZ2Vycml0IG93bmVyL2FwcHJvdmVycyBmb3IgdGhlIGFjdHVhbCBzb2Z0d2FyZSBjb2RlYyBsaWJyYXJpZXMKKyMgZGlmZmVyZW50aWF0ZWQgZnJvbSBwbHVnaW5zIGNvbm5lY3RpbmcgdGhvc2UgY29kZWNzIHRvIGVpdGhlciBvbXggb3IgY29kZWMyIGluZnJhc3RydWN0dXJlCitlc3NpY2tAZ29vZ2xlLmNvbQorbGFqb3NAZ29vZ2xlLmNvbQorbWFyY29uZUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9qYW5pdG9ycy9SRUFETUUgYi9tZWRpYS9qYW5pdG9ycy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRiOGUwZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2phbml0b3JzL1JFQURNRQpAQCAtMCwwICsxLDQgQEAKK0EgY29sbGVjdGlvbiBvZiBPV05FUlMgZmlsZXMgdGhhdCB3ZSByZWZlcmVuY2UgZnJvbSBvdGhlciBwcm9qZWN0cywKK3N1Y2ggYXMgdGhlIHNvZnR3YXJlIGNvZGVjcyBpbiBkaXJlY3RvcmllcyBsaWtlIGV4dGVybmFsL2xpYmF2Yy4KK1RoaXMgaXMgdG8gc2ltcGxpZnkgb3VyIG93bmVyL2FwcHJvdmVyIG1hbmFnZW1lbnQgYWNyb3NzIHRoZSBtdWx0aXBsZQorcHJvamVjdHMgcmVsYXRlZCB0byBtZWRpYS4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9kdW1teS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvZHVtbXkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWY3ZTM2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9kdW1teS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLS8qKgotICogRHVtbXkgZmlsZSBuZWVkZWQgdG8gZ2V0IEFuZHJvaWQgU3R1ZGlvIHRvIHNjYW4gdGhpcyBmb2xkZXIuCi0gKi8KLQotaW50IGdfRG9Ob3RVc2VUaGlzVmFyaWFibGUgPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL3VudXNlZC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvdW51c2VkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTUyMDVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL3VudXNlZC5jcHAKQEAgLTAsMCArMSw1IEBACisvKioKKyAqIFVudXNlZCBmaWxlIHJlcXVpcmVkIHRvIGdldCBBbmRyb2lkIFN0dWRpbyB0byBzY2FuIHRoaXMgZm9sZGVyLgorICovCisKK2ludCBnX0RvTm90VXNlVGhpc1ZhcmlhYmxlID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaCBiL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaAppbmRleCBjYWI4OTI5Li5lMGFjN2U1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oCkBAIC0yOSw2ICsyOSw4IEBACiAjaWZuZGVmIEFBVURJT19BQVVESU9fSAogI2RlZmluZSBBQVVESU9fQUFVRElPX0gKIAorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDx0aW1lLmg+CiAKICNpZmRlZiBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmgKaW5kZXggNGVjMzhjNS4uMzkyN2Y1OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5oCkBAIC0yNiw3ICsyNiw3IEBACiAKIG5hbWVzcGFjZSBhYXVkaW8gewogCi0vLyBBcmJpdHJhcnkgbGltaXRzIGZvciBzYW5pdHkgY2hlY2tzLiBUT0RPIHJlbW92ZSBhZnRlciBkZWJ1Z2dpbmcuCisvLyBBcmJpdHJhcnkgbGltaXRzIGZvciByYW5nZSBjaGVja3MuCiAjZGVmaW5lIE1BWF9TSEFSRURfTUVNT1JJRVMgKDMyKQogI2RlZmluZSBNQVhfTU1BUF9PRkZTRVRfQllURVMgKDMyICogMTAyNCAqIDgpCiAjZGVmaW5lIE1BWF9NTUFQX1NJWkVfQllURVMgKDMyICogMTAyNCAqIDgpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5oCmluZGV4IGVkYTQ2YWUuLjk3MjkzMmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5oCkBAIC0yNjcsNyArMjY3LDcgQEAKICAgICBBdWRpb0Zsb2F0SW5wdXRQb3J0IGlucHV0OwogCiAgICAgLyoqCi0gICAgICogRHVtbXkgcHJvY2Vzc29yLiBUaGUgd29yayBoYXBwZW5zIGluIHRoZSByZWFkKCkgbWV0aG9kLgorICAgICAqIERvIG5vdGhpbmcuIFRoZSB3b3JrIGhhcHBlbnMgaW4gdGhlIHJlYWQoKSBtZXRob2QuCiAgICAgICoKICAgICAgKiBAcGFyYW0gZnJhbWVQb3NpdGlvbiBpbmRleCBvZiBmaXJzdCBmcmFtZSB0byBiZSBwcm9jZXNzZWQKICAgICAgKiBAcGFyYW0gbnVtRnJhbWVzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgKaW5kZXggZDJlNDgwNS4uODJlYjc3ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BbmRyb2lkLmJwCmluZGV4IDBjNDBjYmIuLmU4ZTFhMDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQW5kcm9pZC5icApAQCAtMTIsNiArMTIsMTIgQEAKICAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCiAgICAgICAgICJsaWJhdWRpb2ZvdW5kYXRpb25faGVhZGVycyIsCiAgICAgXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAogfQogCiBjY19saWJyYXJ5X3NoYXJlZCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0F0dHJpYnV0ZXMuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9BdHRyaWJ1dGVzLmNwcAppbmRleCAxZWU2OTMwLi5mZjRiYTA2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0F0dHJpYnV0ZXMuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvQXR0cmlidXRlcy5jcHAKQEAgLTU3LDcgKzU3LDcgQEAKICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKDApOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMigxKTsKLSAgICAgICAgcGFyY2VsLT53cml0ZVV0ZjhBc1V0ZjE2KG1BdHRyaWJ1dGVzLnRhZ3MpOworICAgICAgICBwYXJjZWwtPndyaXRlVXRmOEFzVXRmMTYoc3RkOjpzdHJpbmcobUF0dHJpYnV0ZXMudGFncykpOwogICAgIH0KICAgICBwYXJjZWwtPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obVN0cmVhbVR5cGUpKTsKICAgICBwYXJjZWwtPndyaXRlVWludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90PihtR3JvdXBJZCkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9FZmZlY3QuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9FZmZlY3QuY3BwCmluZGV4IDNlYWQ2Y2IuLjczYjk2YWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvRWZmZWN0LmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0VmZmVjdC5jcHAKQEAgLTM2LDY0ICszNiwxMCBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEF1ZGlvRWZmZWN0OjpBdWRpb0VmZmVjdChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSkKLSAgICA6IG1TdGF0dXMoTk9fSU5JVCksIG1Qcm9iZShmYWxzZSksIG1PcFBhY2thZ2VOYW1lKG9wUGFja2FnZU5hbWUpCisgICAgOiBtT3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKQogewogfQogCi0KLUF1ZGlvRWZmZWN0OjpBdWRpb0VmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAotICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKLSAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYsCi0gICAgICAgICAgICAgICAgdm9pZCogdXNlciwKLSAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAotICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSwKLSAgICAgICAgICAgICAgICBib29sIHByb2JlCi0gICAgICAgICAgICAgICAgKQotICAgIDogbVN0YXR1cyhOT19JTklUKSwgbVByb2JlKGZhbHNlKSwgbU9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSkKLXsKLSAgICBBdXRvTXV0ZXggbG9jayhtQ29uc3RydWN0TG9jayk7Ci0gICAgbVN0YXR1cyA9IHNldCh0eXBlLCB1dWlkLCBwcmlvcml0eSwgY2JmLCB1c2VyLCBzZXNzaW9uSWQsIGlvLCBkZXZpY2UsIHByb2JlKTsKLX0KLQotQXVkaW9FZmZlY3Q6OkF1ZGlvRWZmZWN0KGNvbnN0IGNoYXIgKnR5cGVTdHIsCi0gICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXVpZFN0ciwKLSAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAotICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiwKLSAgICAgICAgICAgICAgICB2b2lkKiB1c2VyLAotICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCi0gICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgZGV2aWNlLAotICAgICAgICAgICAgICAgIGJvb2wgcHJvYmUKLSAgICAgICAgICAgICAgICApCi0gICAgOiBtU3RhdHVzKE5PX0lOSVQpLCBtUHJvYmUoZmFsc2UpLCBtT3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKQotewotICAgIGVmZmVjdF91dWlkX3QgdHlwZTsKLSAgICBlZmZlY3RfdXVpZF90ICpwVHlwZSA9IE5VTEw7Ci0gICAgZWZmZWN0X3V1aWRfdCB1dWlkOwotICAgIGVmZmVjdF91dWlkX3QgKnBVdWlkID0gTlVMTDsKLQotICAgIEFMT0dWKCJDb25zdHJ1Y3RvciBzdHJpbmdcbiAtIHR5cGU6ICVzXG4gLSB1dWlkOiAlcyIsIHR5cGVTdHIsIHV1aWRTdHIpOwotCi0gICAgaWYgKHR5cGVTdHIgIT0gTlVMTCkgewotICAgICAgICBpZiAoc3RyaW5nVG9HdWlkKHR5cGVTdHIsICZ0eXBlKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgcFR5cGUgPSAmdHlwZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICh1dWlkU3RyICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKHN0cmluZ1RvR3VpZCh1dWlkU3RyLCAmdXVpZCkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHBVdWlkID0gJnV1aWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBBdXRvTXV0ZXggbG9jayhtQ29uc3RydWN0TG9jayk7Ci0gICAgbVN0YXR1cyA9IHNldChwVHlwZSwgcFV1aWQsIHByaW9yaXR5LCBjYmYsIHVzZXIsIHNlc3Npb25JZCwgaW8sIGRldmljZSwgcHJvYmUpOwotfQotCiBzdGF0dXNfdCBBdWRpb0VmZmVjdDo6c2V0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCiAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LApAQCAtMTk0LDYgKzE0MCwzNCBAQAogICAgIHJldHVybiBtU3RhdHVzOwogfQogCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6c2V0KGNvbnN0IGNoYXIgKnR5cGVTdHIsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXVpZFN0ciwKKyAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiwKKyAgICAgICAgICAgICAgICB2b2lkKiB1c2VyLAorICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCisgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgZGV2aWNlLAorICAgICAgICAgICAgICAgIGJvb2wgcHJvYmUpCit7CisgICAgZWZmZWN0X3V1aWRfdCB0eXBlOworICAgIGVmZmVjdF91dWlkX3QgKnBUeXBlID0gbnVsbHB0cjsKKyAgICBlZmZlY3RfdXVpZF90IHV1aWQ7CisgICAgZWZmZWN0X3V1aWRfdCAqcFV1aWQgPSBudWxscHRyOworCisgICAgQUxPR1YoIkF1ZGlvRWZmZWN0OjpzZXQgc3RyaW5nXG4gLSB0eXBlOiAlc1xuIC0gdXVpZDogJXMiLAorICAgICAgICAgICAgdHlwZVN0ciA/IHR5cGVTdHIgOiAibnVsbHB0ciIsIHV1aWRTdHIgPyB1dWlkU3RyIDogIm51bGxwdHIiKTsKKworICAgIGlmIChzdHJpbmdUb0d1aWQodHlwZVN0ciwgJnR5cGUpID09IE5PX0VSUk9SKSB7CisgICAgICAgIHBUeXBlID0gJnR5cGU7CisgICAgfQorICAgIGlmIChzdHJpbmdUb0d1aWQodXVpZFN0ciwgJnV1aWQpID09IE5PX0VSUk9SKSB7CisgICAgICAgIHBVdWlkID0gJnV1aWQ7CisgICAgfQorCisgICAgcmV0dXJuIHNldChwVHlwZSwgcFV1aWQsIHByaW9yaXR5LCBjYmYsIHVzZXIsIHNlc3Npb25JZCwgaW8sIGRldmljZSwgcHJvYmUpOworfQorCiAKIEF1ZGlvRWZmZWN0Ojp+QXVkaW9FZmZlY3QoKQogewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwCmluZGV4IDk1NjhlODMuLmQ2NjcxZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUmVjb3JkLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAKQEAgLTExMDMsNyArMTEwMyw3IEBACiAgICAgfQogCiAgICAgaWYgKHNzaXplX3QodXNlclNpemUpIDwgMCB8fCAoYnVmZmVyID09IE5VTEwgJiYgdXNlclNpemUgIT0gMCkpIHsKLSAgICAgICAgLy8gc2FuaXR5LWNoZWNrLiB1c2VyIGlzIG1vc3QtbGlrZWx5IHBhc3NpbmcgYW4gZXJyb3IgY29kZSwgYW5kIGl0IHdvdWxkCisgICAgICAgIC8vIFZhbGlkYXRpb24uIHVzZXIgaXMgbW9zdC1saWtlbHkgcGFzc2luZyBhbiBlcnJvciBjb2RlLCBhbmQgaXQgd291bGQKICAgICAgICAgLy8gbWFrZSB0aGUgcmV0dXJuIHZhbHVlIGFtYmlndW91cyAoYWN0dWFsU2l6ZSB2cyBlcnJvcikuCiAgICAgICAgIEFMT0dFKCIlcyglZCkgKGJ1ZmZlcj0lcCwgc2l6ZT0lenUgKCV6dSkiLAogICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBidWZmZXIsIHVzZXJTaXplLCB1c2VyU2l6ZSk7CkBAIC0xMzMwLDcgKzEzMzAsNyBAQAogICAgICAgICBtQ2JmKEVWRU5UX01PUkVfREFUQSwgbVVzZXJEYXRhLCAmYXVkaW9CdWZmZXIpOwogICAgICAgICBzaXplX3QgcmVhZFNpemUgPSBhdWRpb0J1ZmZlci5zaXplOwogCi0gICAgICAgIC8vIFNhbml0eSBjaGVjayBvbiByZXR1cm5lZCBzaXplCisgICAgICAgIC8vIFZhbGlkYXRlIG9uIHJldHVybmVkIHNpemUKICAgICAgICAgaWYgKHNzaXplX3QocmVhZFNpemUpIDwgMCB8fCByZWFkU2l6ZSA+IHJlcVNpemUpIHsKICAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6ICBFVkVOVF9NT1JFX0RBVEEgcmVxdWVzdGVkICV6dSBieXRlcyBidXQgY2FsbGJhY2sgcmV0dXJuZWQgJXpkIGJ5dGVzIiwKICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHJlcVNpemUsIHNzaXplX3QocmVhZFNpemUpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcAppbmRleCBlMjZhODMxLi4zYWE2MGRhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwCkBAIC01ODIsNyArNTgyLDggQEAKICAgICAgICAgY2FzZSBBVURJT19JTlBVVF9DT05GSUdfQ0hBTkdFRDogewogICAgICAgICAgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IG9sZERlc2MgPSBnZXRJb0Rlc2NyaXB0b3JfbChpb0Rlc2MtPm1Jb0hhbmRsZSk7CiAgICAgICAgICAgICBpZiAob2xkRGVzYyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImlvQ29uZmlnQ2hhbmdlZCgpIG1vZGlmeWluZyB1bmtub3duIG91dHB1dCEgJWQiLCBpb0Rlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgQUxPR1coImlvQ29uZmlnQ2hhbmdlZCgpIG1vZGlmeWluZyB1bmtub3duICVzISAlZCIsCisgICAgICAgICAgICAgICAgICAgIGV2ZW50ID09IEFVRElPX09VVFBVVF9DT05GSUdfQ0hBTkdFRCA/ICJvdXRwdXQiIDogImlucHV0IiwgaW9EZXNjLT5tSW9IYW5kbGUpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCmluZGV4IDY4ZDExZDQuLjQxYWY3OGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCkBAIC0xOTQ2LDcgKzE5NDYsNyBAQAogICAgIH0KIAogICAgIGlmIChzc2l6ZV90KHVzZXJTaXplKSA8IDAgfHwgKGJ1ZmZlciA9PSBOVUxMICYmIHVzZXJTaXplICE9IDApKSB7Ci0gICAgICAgIC8vIFNhbml0eS1jaGVjazogdXNlciBpcyBtb3N0LWxpa2VseSBwYXNzaW5nIGFuIGVycm9yIGNvZGUsIGFuZCBpdCB3b3VsZAorICAgICAgICAvLyBWYWxpZGF0aW9uOiB1c2VyIGlzIG1vc3QtbGlrZWx5IHBhc3NpbmcgYW4gZXJyb3IgY29kZSwgYW5kIGl0IHdvdWxkCiAgICAgICAgIC8vIG1ha2UgdGhlIHJldHVybiB2YWx1ZSBhbWJpZ3VvdXMgKGFjdHVhbFNpemUgdnMgZXJyb3IpLgogICAgICAgICBBTE9HRSgiJXMoJWQpOiBBdWRpb1RyYWNrOjp3cml0ZShidWZmZXI9JXAsIHNpemU9JXp1ICglemQpIiwKICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgYnVmZmVyLCB1c2VyU2l6ZSwgdXNlclNpemUpOwpAQCAtMjMzNiw3ICsyMzM2LDcgQEAKICAgICAgICAgICAgICAgICBtVXNlckRhdGEsICZhdWRpb0J1ZmZlcik7CiAgICAgICAgIHNpemVfdCB3cml0dGVuU2l6ZSA9IGF1ZGlvQnVmZmVyLnNpemU7CiAKLSAgICAgICAgLy8gU2FuaXR5IGNoZWNrIG9uIHJldHVybmVkIHNpemUKKyAgICAgICAgLy8gVmFsaWRhdGUgb24gcmV0dXJuZWQgc2l6ZQogICAgICAgICBpZiAoc3NpemVfdCh3cml0dGVuU2l6ZSkgPCAwIHx8IHdyaXR0ZW5TaXplID4gcmVxU2l6ZSkgewogICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogRVZFTlRfTU9SRV9EQVRBIHJlcXVlc3RlZCAlenUgYnl0ZXMgYnV0IGNhbGxiYWNrIHJldHVybmVkICV6ZCBieXRlcyIsCiAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCByZXFTaXplLCBzc2l6ZV90KHdyaXR0ZW5TaXplKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9GbGluZ2VyLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwCmluZGV4IDE2ZDIyMzIuLjZkNzlhYmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwCkBAIC0xMDAxLDcgKzEwMDEsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgLy8gV2hpdGVsaXN0IG9mIHJlbGV2YW50IGV2ZW50cyB0byB0cmlnZ2VyIGxvZyBtZXJnaW5nLgorICAgIC8vIExpc3Qgb2YgcmVsZXZhbnQgZXZlbnRzIHRoYXQgdHJpZ2dlciBsb2cgbWVyZ2luZy4KICAgICAvLyBMb2cgbWVyZ2luZyBzaG91bGQgYWN0aXZhdGUgZHVyaW5nIGF1ZGlvIGFjdGl2aXR5IG9mIGFueSBraW5kLiBUaGlzIGFyZSBjb25zaWRlcmVkIHRoZQogICAgIC8vIG1vc3QgcmVsZXZhbnQgZXZlbnRzLgogICAgIC8vIFRPRE8gc2hvdWxkIHNlbGVjdCBtb3JlIHdpc2VseSB0aGUgaXRlbXMgZnJvbSB0aGUgbGlzdApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvT1dORVJTIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvT1dORVJTCmluZGV4IDQ4MmI5ZmIuLjAzNGQxNjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L09XTkVSUworKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9PV05FUlMKQEAgLTEsMyArMSw0IEBACiBna2FzdGVuQGdvb2dsZS5jb20KK2h1bmdhQGdvb2dsZS5jb20KIGptdHJpdmlAZ29vZ2xlLmNvbQogbW5hZ2Fub3ZAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oCmluZGV4IGNiNzYyNTIuLjNkNGJiNGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmgKQEAgLTMzOSwxNiArMzM5LDIxIEBACiAgICAgICoKICAgICAgKiBvcFBhY2thZ2VOYW1lOiAgICAgIFRoZSBwYWNrYWdlIG5hbWUgdXNlZCBmb3IgYXBwIG9wIGNoZWNrcy4KICAgICAgKi8KLSAgICBBdWRpb0VmZmVjdChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSk7CisgICAgZXhwbGljaXQgQXVkaW9FZmZlY3QoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpOwogCisgICAgLyogVGVybWluYXRlcyB0aGUgQXVkaW9FZmZlY3QgYW5kIHVucmVnaXN0ZXJzIGl0IGZyb20gQXVkaW9GbGluZ2VyLgorICAgICAqIFRoZSBlZmZlY3QgZW5naW5lIGlzIGFsc28gZGVzdHJveWVkIGlmIHRoaXMgQXVkaW9FZmZlY3Qgd2FzIHRoZSBsYXN0IGNvbnRyb2xsaW5nCisgICAgICogdGhlIGVuZ2luZS4KKyAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIH5BdWRpb0VmZmVjdCgpOwogCi0gICAgLyogQ29uc3RydWN0b3IuCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBhbiB1bmluaXRpYWxpemVkIEF1ZGlvRWZmZWN0LgogICAgICAqCiAgICAgICogUGFyYW1ldGVyczoKICAgICAgKgogICAgICAqIHR5cGU6ICB0eXBlIG9mIGVmZmVjdCBjcmVhdGVkOiBjYW4gYmUgbnVsbCBpZiB1dWlkIGlzIHNwZWNpZmllZC4gVGhpcyBjb3JyZXNwb25kcyB0bwogICAgICAqICAgICAgICB0aGUgT3BlblNMIEVTIGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSB0aGlzIGVmZmVjdC4KLSAgICAgKiBvcFBhY2thZ2VOYW1lOiAgVGhlIHBhY2thZ2UgbmFtZSB1c2VkIGZvciBhcHAgb3AgY2hlY2tzLgogICAgICAqIHV1aWQ6ICBVdWlkIG9mIGVmZmVjdCBjcmVhdGVkOiBjYW4gYmUgbnVsbCBpZiB0eXBlIGlzIHNwZWNpZmllZC4gVGhpcyB1dWlkIGNvcnJlc3BvbmRzIHRvCiAgICAgICogICAgICAgIGEgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbiBvZiBhbiBlZmZlY3QgdHlwZS4KICAgICAgKiBwcmlvcml0eTogICAgcmVxdWVzdGVkIHByaW9yaXR5IGZvciBlZmZlY3QgY29udHJvbDogdGhlIHByaW9yaXR5IGxldmVsIGNvcnJlc3BvbmRzIHRvIHRoZQpAQCAtMzU2LDcgKzM2MSw3IEBACiAgICAgICogICAgICBoaWdoZXIgcHJpb3JpdGllcywgMCBiZWluZyB0aGUgbm9ybWFsIHByaW9yaXR5LgogICAgICAqIGNiZjogICAgICAgICBvcHRpb25hbCBjYWxsYmFjayBmdW5jdGlvbiAoc2VlIGVmZmVjdF9jYWxsYmFja190KQogICAgICAqIHVzZXI6ICAgICAgICBwb2ludGVyIHRvIGNvbnRleHQgZm9yIHVzZSBieSB0aGUgY2FsbGJhY2sgcmVjZWl2ZXIuCi0gICAgICogc2Vzc2lvbklEOiAgIGF1ZGlvIHNlc3Npb24gdGhpcyBlZmZlY3QgaXMgYXNzb2NpYXRlZCB0by4KKyAgICAgKiBzZXNzaW9uSWQ6ICAgYXVkaW8gc2Vzc2lvbiB0aGlzIGVmZmVjdCBpcyBhc3NvY2lhdGVkIHRvLgogICAgICAqICAgICAgSWYgZXF1YWwgdG8gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLCB0aGUgZWZmZWN0IHdpbGwgYmUgZ2xvYmFsIHRvCiAgICAgICogICAgICB0aGUgb3V0cHV0IG1peC4gIE90aGVyd2lzZSwgdGhlIGVmZmVjdCB3aWxsIGJlIGFwcGxpZWQgdG8gYWxsIHBsYXllcnMKICAgICAgKiAgICAgIChBdWRpb1RyYWNrIG9yIE1lZGlhUExheWVyKSB3aXRoaW4gdGhlIHNhbWUgYXVkaW8gc2Vzc2lvbi4KQEAgLTM2OSw0NiArMzc0LDEzIEBACiAgICAgICogICAgICAgIEluIHRoaXMgbW9kZSwgbm8gSUVmZmVjdCBpbnRlcmZhY2UgdG8gQXVkaW9GbGluZ2VyIGlzIGNyZWF0ZWQgYW5kIGFsbCBhY3Rpb25zCiAgICAgICogICAgICAgIGJlc2lkZXMgZ2V0dGVycyBpbXBsZW1lbnRlZCBpbiBjbGllbnQgQXVkaW9FZmZlY3Qgb2JqZWN0IGFyZSBubyBvcHMKICAgICAgKiAgICAgICAgYWZ0ZXIgZWZmZWN0IGNyZWF0aW9uLgorICAgICAqCisgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CisgICAgICogIC0gTk9fRVJST1Igb3IgQUxSRUFEWV9FWElTVFM6IHN1Y2Nlc3NmdWwgaW5pdGlhbGl6YXRpb24KKyAgICAgKiAgLSBJTlZBTElEX09QRVJBVElPTjogQXVkaW9FZmZlY3QgaXMgYWxyZWFkeSBpbml0aWFsaXplZAorICAgICAqICAtIEJBRF9WQUxVRTogaW52YWxpZCBwYXJhbWV0ZXIKKyAgICAgKiAgLSBOT19JTklUOiBhdWRpbyBmbGluZ2VyIG9yIGF1ZGlvIGhhcmR3YXJlIG5vdCBpbml0aWFsaXplZAogICAgICAqLwotCi0gICAgQXVkaW9FZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKLSAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkID0gTlVMTCwKLSAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gMCwKLSAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYgPSBOVUxMLAotICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgPSBOVUxMLAotICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsCi0gICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSBBVURJT19JT19IQU5ETEVfTk9ORSwKLSAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBkZXZpY2UgPSB7fSwKLSAgICAgICAgICAgICAgICBib29sIHByb2JlID0gZmFsc2UpOwotCi0gICAgLyogQ29uc3RydWN0b3IuCi0gICAgICogICAgICBTYW1lIGFzIGFib3ZlIGJ1dCB3aXRoIHR5cGUgYW5kIHV1aWQgc3BlY2lmaWVkIGJ5IGNoYXJhY3RlciBzdHJpbmdzCi0gICAgICovCi0gICAgQXVkaW9FZmZlY3QoY29uc3QgY2hhciAqdHlwZVN0ciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnV1aWRTdHIgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gMCwKLSAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2NhbGxiYWNrX3QgY2JmID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvID0gQVVESU9fSU9fSEFORExFX05PTkUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSA9IHt9LAotICAgICAgICAgICAgICAgICAgICBib29sIHByb2JlID0gZmFsc2UpOwotCi0gICAgLyogVGVybWluYXRlcyB0aGUgQXVkaW9FZmZlY3QgYW5kIHVucmVnaXN0ZXJzIGl0IGZyb20gQXVkaW9GbGluZ2VyLgotICAgICAqIFRoZSBlZmZlY3QgZW5naW5lIGlzIGFsc28gZGVzdHJveWVkIGlmIHRoaXMgQXVkaW9FZmZlY3Qgd2FzIHRoZSBsYXN0IGNvbnRyb2xsaW5nCi0gICAgICogdGhlIGVuZ2luZS4KLSAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH5BdWRpb0VmZmVjdCgpOwotCi0gICAgLyogSW5pdGlhbGl6ZSBhbiB1bmluaXRpYWxpemVkIEF1ZGlvRWZmZWN0LgotICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6Ci0gICAgKiAgLSBOT19FUlJPUiBvciBBTFJFQURZX0VYSVNUUzogc3VjY2Vzc2Z1bCBpbml0aWFsaXphdGlvbgotICAgICogIC0gSU5WQUxJRF9PUEVSQVRJT046IEF1ZGlvRWZmZWN0IGlzIGFscmVhZHkgaW5pdGlhbGl6ZWQKLSAgICAqICAtIEJBRF9WQUxVRTogaW52YWxpZCBwYXJhbWV0ZXIKLSAgICAqICAtIE5PX0lOSVQ6IGF1ZGlvIGZsaW5nZXIgb3IgYXVkaW8gaGFyZHdhcmUgbm90IGluaXRpYWxpemVkCi0gICAgKiAqLwogICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCA9IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSA9IDAsCkBAIC00MTgsNiArMzkwLDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSBBVURJT19JT19IQU5ETEVfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBkZXZpY2UgPSB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByb2JlID0gZmFsc2UpOworICAgIC8qCisgICAgICogU2FtZSBhcyBhYm92ZSBidXQgd2l0aCB0eXBlIGFuZCB1dWlkIHNwZWNpZmllZCBieSBjaGFyYWN0ZXIgc3RyaW5ncy4KKyAgICAgKi8KKyAgICAgICAgICAgIHN0YXR1c190ICAgIHNldChjb25zdCBjaGFyICp0eXBlU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnV1aWRTdHIgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IEFVRElPX0lPX0hBTkRMRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSA9IHt9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJvYmUgPSBmYWxzZSk7CiAKICAgICAvKiBSZXN1bHQgb2YgY29uc3RydWN0aW5nIHRoZSBBdWRpb0VmZmVjdC4gVGhpcyBtdXN0IGJlIGNoZWNrZWQKICAgICAgKiBiZWZvcmUgdXNpbmcgYW55IEF1ZGlvRWZmZWN0IEFQSS4KQEAgLTU0NywyMSArNTMxLDIwIEBACiAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWF4UHJlUHJvY2Vzc2luZyA9IDEwOwogCiBwcm90ZWN0ZWQ6Ci0gICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1FbmFibGVkOyAgICAgICAgICAgLy8gZW5hYmxlIHN0YXRlCi0gICAgIGF1ZGlvX3Nlc3Npb25fdCAgICAgICAgIG1TZXNzaW9uSWQ7ICAgICAgICAgLy8gYXVkaW8gc2Vzc2lvbiBJRAotICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtUHJpb3JpdHk7ICAgICAgICAgIC8vIHByaW9yaXR5IGZvciBlZmZlY3QgY29udHJvbAotICAgICBzdGF0dXNfdCAgICAgICAgICAgICAgICBtU3RhdHVzOyAgICAgICAgICAgIC8vIGVmZmVjdCBzdGF0dXMKLSAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVByb2JlOyAgICAgICAgICAgICAvLyBlZmZlY3QgY3JlYXRlZCBpbiBwcm9iZSBtb2RlOiBhbGwgY29tbWFuZHMKKyAgICAgY29uc3QgU3RyaW5nMTYgICAgICAgICAgbU9wUGFja2FnZU5hbWU7ICAgICAvLyBUaGUgcGFja2FnZSBuYW1lIHVzZWQgZm9yIGFwcCBvcCBjaGVja3MuCisgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1FbmFibGVkID0gZmFsc2U7ICAgLy8gZW5hYmxlIHN0YXRlCisgICAgIGF1ZGlvX3Nlc3Npb25fdCAgICAgICAgIG1TZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVg7IC8vIGF1ZGlvIHNlc3Npb24gSUQKKyAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgbVByaW9yaXR5ID0gMDsgICAgICAvLyBwcmlvcml0eSBmb3IgZWZmZWN0IGNvbnRyb2wKKyAgICAgc3RhdHVzX3QgICAgICAgICAgICAgICAgbVN0YXR1cyA9IE5PX0lOSVQ7ICAvLyBlZmZlY3Qgc3RhdHVzCisgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1Qcm9iZSA9IGZhbHNlOyAgICAgLy8gZWZmZWN0IGNyZWF0ZWQgaW4gcHJvYmUgbW9kZTogYWxsIGNvbW1hbmRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJlIG5vIG9wcyBiZWNhdXNlIG1JRWZmZWN0IGlzIE5VTEwKLSAgICAgZWZmZWN0X2NhbGxiYWNrX3QgICAgICAgbUNiZjsgICAgICAgICAgICAgICAvLyBjYWxsYmFjayBmdW5jdGlvbiBmb3Igc3RhdHVzLCBjb250cm9sIGFuZAorICAgICBlZmZlY3RfY2FsbGJhY2tfdCAgICAgICBtQ2JmID0gbnVsbHB0cjsgICAgIC8vIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBzdGF0dXMsIGNvbnRyb2wgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyYW1ldGVyIGNoYW5nZXMgbm90aWZpY2F0aW9ucwotICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICBtVXNlckRhdGE7ICAgICAgICAgIC8vIGNsaWVudCBjb250ZXh0IGZvciBjYWxsYmFjayBmdW5jdGlvbgotICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICAgICBtRGVzY3JpcHRvcjsgICAgICAgIC8vIGVmZmVjdCBkZXNjcmlwdG9yCi0gICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1JZDsgICAgICAgICAgICAgICAgLy8gc3lzdGVtIHdpZGUgdW5pcXVlIGVmZmVjdCBlbmdpbmUgaW5zdGFuY2UgSUQKKyAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgbVVzZXJEYXRhID0gbnVsbHB0cjsvLyBjbGllbnQgY29udGV4dCBmb3IgY2FsbGJhY2sgZnVuY3Rpb24KKyAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAgICAgbURlc2NyaXB0b3IgPSB7fTsgICAvLyBlZmZlY3QgZGVzY3JpcHRvcgorICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtSWQgPSAtMTsgICAgICAgICAgIC8vIHN5c3RlbSB3aWRlIHVuaXF1ZSBlZmZlY3QgZW5naW5lIGluc3RhbmNlIElECiAgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgIG1Mb2NrOyAgICAgICAgICAgICAgLy8gTXV0ZXggZm9yIG1FbmFibGVkIGFjY2VzcwotICAgICBNdXRleCAgICAgICAgICAgICAgICAgICBtQ29uc3RydWN0TG9jazsgICAgIC8vIE11dGV4IGZvciBpbnRlZ3JhbGl0eSBjb25zdHJ1Y3Rpb24KIAotICAgICBTdHJpbmcxNiAgICAgICAgICAgICAgICBtT3BQYWNrYWdlTmFtZTsgICAgIC8vIFRoZSBwYWNrYWdlIG5hbWUgdXNlZCBmb3IgYXBwIG9wIGNoZWNrcy4KIAogICAgICAvLyBJRWZmZWN0Q2xpZW50CiAgICAgIHZpcnR1YWwgdm9pZCBjb250cm9sU3RhdHVzQ2hhbmdlZChib29sIGNvbnRyb2xHcmFudGVkKTsKQEAgLTU4NiwyMiArNTY5LDEyIEBACiAgICAgICAgIHZpcnR1YWwgdm9pZCBjb250cm9sU3RhdHVzQ2hhbmdlZChib29sIGNvbnRyb2xHcmFudGVkKSB7CiAgICAgICAgICAgICBzcDxBdWRpb0VmZmVjdD4gZWZmZWN0ID0gbUVmZmVjdC5wcm9tb3RlKCk7CiAgICAgICAgICAgICBpZiAoZWZmZWN0ICE9IDApIHsKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEdvdCB0aGUgbUNvbnN0cnVjdExvY2sgbWVhbnMgdGhlIGNvbnN0cnVjdGlvbiBvZiBBdWRpb0VmZmVjdAotICAgICAgICAgICAgICAgICAgICAvLyBoYXMgZmluaXNoZWQsIHdlIHNob3VsZCByZWxlYXNlIHRoZSBtQ29uc3RydWN0TG9jayBpbW1lZGlhdGVseS4KLSAgICAgICAgICAgICAgICAgICAgQXV0b011dGV4IGxvY2soZWZmZWN0LT5tQ29uc3RydWN0TG9jayk7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVmZmVjdC0+Y29udHJvbFN0YXR1c0NoYW5nZWQoY29udHJvbEdyYW50ZWQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHZpcnR1YWwgdm9pZCBlbmFibGVTdGF0dXNDaGFuZ2VkKGJvb2wgZW5hYmxlZCkgewogICAgICAgICAgICAgc3A8QXVkaW9FZmZlY3Q+IGVmZmVjdCA9IG1FZmZlY3QucHJvbW90ZSgpOwogICAgICAgICAgICAgaWYgKGVmZmVjdCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBHb3QgdGhlIG1Db25zdHJ1Y3RMb2NrIG1lYW5zIHRoZSBjb25zdHJ1Y3Rpb24gb2YgQXVkaW9FZmZlY3QKLSAgICAgICAgICAgICAgICAgICAgLy8gaGFzIGZpbmlzaGVkLCB3ZSBzaG91bGQgcmVsZWFzZSB0aGUgbUNvbnN0cnVjdExvY2sgaW1tZWRpYXRlbHkuCi0gICAgICAgICAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKGVmZmVjdC0+bUNvbnN0cnVjdExvY2spOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlZmZlY3QtPmVuYWJsZVN0YXR1c0NoYW5nZWQoZW5hYmxlZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTYxMiwxMSArNTg1LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwUmVwbHlEYXRhKSB7CiAgICAgICAgICAgICBzcDxBdWRpb0VmZmVjdD4gZWZmZWN0ID0gbUVmZmVjdC5wcm9tb3RlKCk7CiAgICAgICAgICAgICBpZiAoZWZmZWN0ICE9IDApIHsKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEdvdCB0aGUgbUNvbnN0cnVjdExvY2sgbWVhbnMgdGhlIGNvbnN0cnVjdGlvbiBvZiBBdWRpb0VmZmVjdAotICAgICAgICAgICAgICAgICAgICAvLyBoYXMgZmluaXNoZWQsIHdlIHNob3VsZCByZWxlYXNlIHRoZSBtQ29uc3RydWN0TG9jayBpbW1lZGlhdGVseS4KLSAgICAgICAgICAgICAgICAgICAgQXV0b011dGV4IGxvY2soZWZmZWN0LT5tQ29uc3RydWN0TG9jayk7Ci0gICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVmZmVjdC0+Y29tbWFuZEV4ZWN1dGVkKAogICAgICAgICAgICAgICAgICAgICBjbWRDb2RlLCBjbWRTaXplLCBwQ21kRGF0YSwgcmVwbHlTaXplLCBwUmVwbHlEYXRhKTsKICAgICAgICAgICAgIH0KQEAgLTYyNiwxMSArNTk0LDYgQEAKICAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIC8qd2hvKi8pIHsKICAgICAgICAgICAgIHNwPEF1ZGlvRWZmZWN0PiBlZmZlY3QgPSBtRWZmZWN0LnByb21vdGUoKTsKICAgICAgICAgICAgIGlmIChlZmZlY3QgIT0gMCkgewotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gR290IHRoZSBtQ29uc3RydWN0TG9jayBtZWFucyB0aGUgY29uc3RydWN0aW9uIG9mIEF1ZGlvRWZmZWN0Ci0gICAgICAgICAgICAgICAgICAgIC8vIGhhcyBmaW5pc2hlZCwgd2Ugc2hvdWxkIHJlbGVhc2UgdGhlIG1Db25zdHJ1Y3RMb2NrIGltbWVkaWF0ZWx5LgotICAgICAgICAgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhlZmZlY3QtPm1Db25zdHJ1Y3RMb2NrKTsKLSAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWZmZWN0LT5iaW5kZXJEaWVkKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTY0NCw3ICs2MDcsNyBAQAogICAgIHNwPElFZmZlY3Q+ICAgICAgICAgICAgIG1JRWZmZWN0OyAgICAgICAgICAgLy8gSUVmZmVjdCBiaW5kZXIgaW50ZXJmYWNlCiAgICAgc3A8RWZmZWN0Q2xpZW50PiAgICAgICAgbUlFZmZlY3RDbGllbnQ7ICAgICAvLyBJRWZmZWN0Q2xpZW50IGltcGxlbWVudGF0aW9uCiAgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbUNibGtNZW1vcnk7ICAgICAgICAvLyBzaGFyZWQgbWVtb3J5IGZvciBkZWZlcnJlZCBwYXJhbWV0ZXIgc2V0dGluZwotICAgIGVmZmVjdF9wYXJhbV9jYmxrX3QqICAgIG1DYmxrOyAgICAgICAgICAgICAgLy8gY29udHJvbCBibG9jayBmb3IgZGVmZXJyZWQgcGFyYW1ldGVyIHNldHRpbmcKKyAgICBlZmZlY3RfcGFyYW1fY2Jsa190KiAgICBtQ2JsayA9IG51bGxwdHI7ICAgIC8vIGNvbnRyb2wgYmxvY2sgZm9yIGRlZmVycmVkIHBhcmFtZXRlciBzZXR0aW5nCiAgICAgcGlkX3QgICAgICAgICAgICAgICAgICAgbUNsaWVudFBpZCA9IChwaWRfdCktMTsKICAgICB1aWRfdCAgICAgICAgICAgICAgICAgICBtQ2xpZW50VWlkID0gKHVpZF90KS0xOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKaW5kZXggNTQ4YjA4MC4uYThlNmMzMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKQEAgLTEyLDYgKzEyLDEyIEBACiAgICAgICAgICJsaWJhdWRpb19zeXN0ZW1faGVhZGVycyIsCiAgICAgICAgICJsaWJtZWRpYV9oZWxwZXJfaGVhZGVycyIsCiAgICAgXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAogfQogCiBjY19saWJyYXJ5IHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9EZXZpY2VEZXNjcmlwdG9yQmFzZS5jcHAgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vRGV2aWNlRGVzY3JpcHRvckJhc2UuY3BwCmluZGV4IDNkYmUzN2QuLmU5YjU4OWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9EZXZpY2VEZXNjcmlwdG9yQmFzZS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0RldmljZURlc2NyaXB0b3JCYXNlLmNwcApAQCAtMjIsNiArMjIsOSBAQAogI2luY2x1ZGUgPG1lZGlhL0RldmljZURlc2NyaXB0b3JCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgogCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8cmVnZXg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogRGV2aWNlRGVzY3JpcHRvckJhc2U6OkRldmljZURlc2NyaXB0b3JCYXNlKGF1ZGlvX2RldmljZXNfdCB0eXBlKSA6CkBAIC0zNCw2ICszNywzMSBAQAogewogfQogCituYW1lc3BhY2UgeworCitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgU1VQUFJFU1NFRCA9ICJTVVBQUkVTU0VEIjsKK3N0YXRpYyBjb25zdCBzdGQ6OnJlZ2V4IE1BQ19BRERSRVNTX1JFR0VYKCIoWzAtOWEtZkEtRl17Mn06KXs1fVswLTlhLWZBLUZdezJ9Iik7CisKK2Jvb2wgaXNBZGRyZXNzU2Vuc2l0aXZlKGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzKSB7CisgICAgaWYgKHN0ZDo6cmVnZXhfbWF0Y2goYWRkcmVzcywgTUFDX0FERFJFU1NfUkVHRVgpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHNvY2thZGRyX3N0b3JhZ2Ugc3M0OworICAgIGlmIChpbmV0X3B0b24oQUZfSU5FVCwgYWRkcmVzcy5jX3N0cigpLCAmc3M0KSA+IDApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgc29ja2FkZHJfc3RvcmFnZSBzczY7CisgICAgaWYgKGluZXRfcHRvbihBRl9JTkVUNiwgYWRkcmVzcy5jX3N0cigpLCAmc3M2KSA+IDApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCit9IC8vIG5hbWVzcGFjZQorCiBEZXZpY2VEZXNjcmlwdG9yQmFzZTo6RGV2aWNlRGVzY3JpcHRvckJhc2UoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlVHlwZUFkZHIpIDoKICAgICAgICAgQXVkaW9Qb3J0KCIiLCBBVURJT19QT1JUX1RZUEVfREVWSUNFLAogICAgICAgICAgICAgICAgICAgYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2VUeXBlQWRkci5tVHlwZSkgPyBBVURJT19QT1JUX1JPTEVfU0lOSyA6CkBAIC00Myw2ICs3MSwxMiBAQAogICAgIGlmIChtRGV2aWNlVHlwZUFkZHIubUFkZHJlc3MuZW1wdHkoKSAmJiBhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShtRGV2aWNlVHlwZUFkZHIubVR5cGUpKSB7CiAgICAgICAgIG1EZXZpY2VUeXBlQWRkci5tQWRkcmVzcyA9ICIwIjsKICAgICB9CisgICAgbUlzQWRkcmVzc1NlbnNpdGl2ZSA9IGlzQWRkcmVzc1NlbnNpdGl2ZShtRGV2aWNlVHlwZUFkZHIubUFkZHJlc3MpOworfQorCit2b2lkIERldmljZURlc2NyaXB0b3JCYXNlOjpzZXRBZGRyZXNzKGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzKSB7CisgICAgbURldmljZVR5cGVBZGRyLm1BZGRyZXNzID0gYWRkcmVzczsKKyAgICBtSXNBZGRyZXNzU2Vuc2l0aXZlID0gaXNBZGRyZXNzU2Vuc2l0aXZlKGFkZHJlc3MpOwogfQogCiB2b2lkIERldmljZURlc2NyaXB0b3JCYXNlOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKQEAgLTEzMCwxMCArMTY0LDE1IEBACiAgICAgQXVkaW9Qb3J0OjpkdW1wKGRzdCwgc3BhY2VzLCB2ZXJib3NlKTsKIH0KIAotc3RkOjpzdHJpbmcgRGV2aWNlRGVzY3JpcHRvckJhc2U6OnRvU3RyaW5nKCkgY29uc3QKK3N0ZDo6c3RyaW5nIERldmljZURlc2NyaXB0b3JCYXNlOjp0b1N0cmluZyhib29sIGluY2x1ZGVTZW5zaXRpdmVJbmZvKSBjb25zdAogewogICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzdHJlYW07Ci0gICAgc3N0cmVhbSA8PCAidHlwZToweCIgPDwgc3RkOjpoZXggPDwgdHlwZSgpIDw8ICIsQDoiIDw8IG1EZXZpY2VUeXBlQWRkci5tQWRkcmVzczsKKyAgICBzc3RyZWFtIDw8ICJ0eXBlOjB4IiA8PCBzdGQ6OmhleCA8PCB0eXBlKCk7CisgICAgLy8gSVAgYW5kIE1BQyBhZGRyZXNzIGFyZSBzZW5zaXRpdmUgaW5mb3JtYXRpb24uIFRoZSBzZW5zaXRpdmUgaW5mb3JtYXRpb24gd2lsbCBiZSBzdXBwcmVzc2VkCisgICAgLy8gaXMgYGluY2x1ZGVTZW5zaXRpdmVJbmZvYCBpcyBmYWxzZS4KKyAgICBzc3RyZWFtIDw8ICIsQDoiCisgICAgICAgICAgICA8PCAoIWluY2x1ZGVTZW5zaXRpdmVJbmZvICYmIG1Jc0FkZHJlc3NTZW5zaXRpdmUgPyBTVVBQUkVTU0VECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtRGV2aWNlVHlwZUFkZHIubUFkZHJlc3MpOwogICAgIHJldHVybiBzc3RyZWFtLnN0cigpOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9EZXZpY2VEZXNjcmlwdG9yQmFzZS5oIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvRGV2aWNlRGVzY3JpcHRvckJhc2UuaAppbmRleCBhZjA0NzIxLi5jMTQzYzdlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9EZXZpY2VEZXNjcmlwdG9yQmFzZS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0RldmljZURlc2NyaXB0b3JCYXNlLmgKQEAgLTQyLDcgKzQyLDcgQEAKIAogICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gbURldmljZVR5cGVBZGRyLm1UeXBlOyB9CiAgICAgc3RkOjpzdHJpbmcgYWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VUeXBlQWRkci5tQWRkcmVzczsgfQotICAgIHZvaWQgc2V0QWRkcmVzcyhjb25zdCBzdGQ6OnN0cmluZyAmYWRkcmVzcykgeyBtRGV2aWNlVHlwZUFkZHIubUFkZHJlc3MgPSBhZGRyZXNzOyB9CisgICAgdm9pZCBzZXRBZGRyZXNzKGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzKTsKICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBnZXREZXZpY2VUeXBlQWRkcigpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VUeXBlQWRkcjsgfQogCiAgICAgLy8gQXVkaW9Qb3J0Q29uZmlnCkBAIC02MSw3ICs2MSwxNCBAQAogICAgIHZvaWQgZHVtcChzdGQ6OnN0cmluZyAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgsCiAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4dHJhSW5mbyA9IG51bGxwdHIsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OwogICAgIHZvaWQgbG9nKCkgY29uc3Q7Ci0gICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHN0cmluZyB0byBkZXNjcmliZSB0aGUgRGV2aWNlRGVzY3JpcHRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmNsdWRlU2Vuc2l0aXZlSW5mbyBzZW5zaXRpdmUgaW5mb3JtYXRpb24gd2lsbCBiZSBhZGRlZCB3aGVuIGl0IGlzIHRydWUuCisgICAgICogQHJldHVybiBhIHN0cmluZyB0aGF0IGNhbiBiZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBEZXZpY2VEZXNjcmlwdG9yLgorICAgICAqLworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGJvb2wgaW5jbHVkZVNlbnNpdGl2ZUluZm8gPSBmYWxzZSkgY29uc3Q7CiAKICAgICBib29sIGVxdWFscyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yQmFzZT4mIG90aGVyKSBjb25zdDsKIApAQCAtNzAsNiArNzcsNyBAQAogCiBwcm90ZWN0ZWQ6CiAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciBtRGV2aWNlVHlwZUFkZHI7CisgICAgYm9vbCBtSXNBZGRyZXNzU2Vuc2l0aXZlOwogICAgIHVpbnQzMl90IG1FbmNhcHN1bGF0aW9uTW9kZXMgPSAwOwogICAgIHVpbnQzMl90IG1FbmNhcHN1bGF0aW9uTWV0YWRhdGFUeXBlcyA9IDA7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvT1dORVJTIGIvbWVkaWEvbGliYXVkaW9oYWwvT1dORVJTCmluZGV4IDE0NTZhYjYuLjcxYjE3ZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL09XTkVSUworKysgYi9tZWRpYS9saWJhdWRpb2hhbC9PV05FUlMKQEAgLTEsMiArMSBAQAota3JvY2FyZEBnb29nbGUuY29tCiBtbmFnYW5vdkBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbVBvd2VyTG9nLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbVBvd2VyTG9nLmgKaW5kZXggNWZkMzkxMi4uZjZhNTU0YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1Qb3dlckxvZy5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtUG93ZXJMb2cuaApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9Qb3dlckxvZy5oPgorI2luY2x1ZGUgPGN1dGlscy9iaXRvcHMuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmNwcAppbmRleCBlYzU2YjAwLi4xYWFjZmQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckR5bi5jcHAKQEAgLTI1LDcgKzI1LDYgQEAKIAogI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRGVidWcuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAKQEAgLTYzNiw3ICs2MzUsNyBAQAogICAgIGNvbnN0IHVpbnQzMl90IHBoYXNlV3JhcExpbWl0ID0gYy5tTCA8PCBjLm1TaGlmdDsKICAgICBzaXplX3QgaW5GcmFtZUNvdW50ID0gKHBoYXNlSW5jcmVtZW50ICogKHVpbnQ2NF90KW91dEZyYW1lQ291bnQgKyBwaGFzZUZyYWN0aW9uKQogICAgICAgICAgICAgLyBwaGFzZVdyYXBMaW1pdDsKLSAgICAvLyBzYW5pdHkgY2hlY2sgdGhhdCBpbkZyYW1lQ291bnQgaXMgaW4gc2lnbmVkIDMyIGJpdCBpbnRlZ2VyIHJhbmdlLgorICAgIC8vIHZhbGlkYXRlIHRoYXQgaW5GcmFtZUNvdW50IGlzIGluIHNpZ25lZCAzMiBiaXQgaW50ZWdlciByYW5nZS4KICAgICBBTE9HX0FTU0VSVCgwIDw9IGluRnJhbWVDb3VudCAmJiBpbkZyYW1lQ291bnQgPCAoMVUgPDwgMzEpKTsKIAogICAgIC8vQUxPR1YoImluRnJhbWVDb3VudDolZCAgb3V0RnJhbWVDb3VudDolZCIKQEAgLTY0Niw3ICs2NDUsNyBAQAogICAgIC8vIE5PVEU6IGJlIHZlcnkgY2FyZWZ1bCB3aGVuIG1vZGlmeWluZyB0aGUgY29kZSBoZXJlLiByZWdpc3RlcgogICAgIC8vIHByZXNzdXJlIGlzIHZlcnkgaGlnaCBhbmQgYSBzbWFsbCBjaGFuZ2UgbWlnaHQgY2F1c2UgdGhlIGNvbXBpbGVyCiAgICAgLy8gdG8gZ2VuZXJhdGUgZmFyIGxlc3MgZWZmaWNpZW50IGNvZGUuCi0gICAgLy8gQWx3YXlzIHNhbml0eSBjaGVjayB0aGUgcmVzdWx0IHdpdGggb2JqZHVtcCBvciB0ZXN0LXJlc2FtcGxlLgorICAgIC8vIEFsd2F5cyB2YWxpZGF0ZSB0aGUgcmVzdWx0IHdpdGggb2JqZHVtcCBvciB0ZXN0LXJlc2FtcGxlLgogCiAgICAgLy8gdGhlIGZvbGxvd2luZyBsb2dpYyBpcyBhIGJpdCBjb252b2x1dGVkIHRvIGtlZXAgdGhlIG1haW4gcHJvY2Vzc2luZyBsb29wCiAgICAgLy8gYXMgdGlnaHQgYXMgcG9zc2libGUgd2l0aCByZWdpc3RlciBhbGxvY2F0aW9uLgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oCmluZGV4IDliNzBhMWMuLjFmY2ZmY2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzLmgKQEAgLTM4MSw3ICszODEsNyBAQAogICAgIC8vIE5PVEU6IGJlIHZlcnkgY2FyZWZ1bCB3aGVuIG1vZGlmeWluZyB0aGUgY29kZSBoZXJlLiByZWdpc3RlcgogICAgIC8vIHByZXNzdXJlIGlzIHZlcnkgaGlnaCBhbmQgYSBzbWFsbCBjaGFuZ2UgbWlnaHQgY2F1c2UgdGhlIGNvbXBpbGVyCiAgICAgLy8gdG8gZ2VuZXJhdGUgZmFyIGxlc3MgZWZmaWNpZW50IGNvZGUuCi0gICAgLy8gQWx3YXlzIHNhbml0eSBjaGVjayB0aGUgcmVzdWx0IHdpdGggb2JqZHVtcCBvciB0ZXN0LXJlc2FtcGxlLgorICAgIC8vIEFsd2F5cyB2YWxpZGF0ZSB0aGUgcmVzdWx0IHdpdGggb2JqZHVtcCBvciB0ZXN0LXJlc2FtcGxlLgogCiAgICAgaWYgKExPQ0tFRCkgewogICAgICAgICAvLyBsb2NrZWQgcG9seXBoYXNlIChubyBpbnRlcnBvbGF0aW9uKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcAppbmRleCA1YTAzYTBkLi5mMmMzODZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcApAQCAtNDA0LDcgKzQwNCw3IEBACiAgICAgLy8gTk9URTogYmUgdmVyeSBjYXJlZnVsIHdoZW4gbW9kaWZ5aW5nIHRoZSBjb2RlIGhlcmUuIHJlZ2lzdGVyCiAgICAgLy8gcHJlc3N1cmUgaXMgdmVyeSBoaWdoIGFuZCBhIHNtYWxsIGNoYW5nZSBtaWdodCBjYXVzZSB0aGUgY29tcGlsZXIKICAgICAvLyB0byBnZW5lcmF0ZSBmYXIgbGVzcyBlZmZpY2llbnQgY29kZS4KLSAgICAvLyBBbHdheXMgc2FuaXR5IGNoZWNrIHRoZSByZXN1bHQgd2l0aCBvYmpkdW1wIG9yIHRlc3QtcmVzYW1wbGUuCisgICAgLy8gQWx3YXlzIHZhbGlkYXRlIHRoZSByZXN1bHQgd2l0aCBvYmpkdW1wIG9yIHRlc3QtcmVzYW1wbGUuCiAKICAgICAvLyBjb21wdXRlIHRoZSBpbmRleCBvZiB0aGUgY29lZmZpY2llbnQgb24gdGhlIHBvc2l0aXZlIHNpZGUgYW5kCiAgICAgLy8gbmVnYXRpdmUgc2lkZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliY3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuY3BwIGIvbWVkaWEvbGliY3B1c3RhdHMvVGhyZWFkQ3B1VXNhZ2UuY3BwCmluZGV4IDRiNzU0OWYuLmU3MWE3ZGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmNwcAorKysgYi9tZWRpYS9saWJjcHVzdGF0cy9UaHJlYWRDcHVVc2FnZS5jcHAKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9PV05FUlMgYi9tZWRpYS9saWJlZmZlY3RzL09XTkVSUwppbmRleCA3ZjlhZTgxLi5iNzgzMmVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL09XTkVSUworKysgYi9tZWRpYS9saWJlZmZlY3RzL09XTkVSUwpAQCAtMSw0ICsxLDMgQEAKIGh1bmdhQGdvb2dsZS5jb20KLWtyb2NhcmRAZ29vZ2xlLmNvbQogbW5hZ2Fub3ZAZ29vZ2xlLmNvbQogcmFnb0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0NvbmZpZ0xvYWRlci5jIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNDb25maWdMb2FkZXIuYwppbmRleCBmY2VmMzZmLi5lMjM1MzBlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0NvbmZpZ0xvYWRlci5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzQ29uZmlnTG9hZGVyLmMKQEAgLTM5NCw3ICszOTQsNyBAQAogICAgICAgIH0KICAgICAgICBzdWJfZWZmZWN0X2VudHJ5X3QgKnN1YkVudHJ5ID0gKHN1Yl9lZmZlY3RfZW50cnlfdCopZ1N1YkVmZmVjdExpc3QtPnN1Yl9lbGVtLT5vYmplY3Q7CiAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqc3ViRWZmZWN0RGVzYyA9IChlZmZlY3RfZGVzY3JpcHRvcl90Kikoc3ViRW50cnktPm9iamVjdCk7Ci0gICAgICAgLy8gU2luY2Ugd2UgcmV0dXJuIGEgZHVtbXkgZGVzY3JpcHRvciBmb3IgdGhlIHByb3h5IGR1cmluZworICAgICAgIC8vIFNpbmNlIHdlIHJldHVybiBhIHN0dWIgZGVzY3JpcHRvciBmb3IgdGhlIHByb3h5IGR1cmluZwogICAgICAgIC8vIGdldF9kZXNjcmlwdG9yIGNhbGwsd2UgcmVwbGFjZSBpdCB3aXRoIHRoZSBjb3JyZXNwb2RpbmcKICAgICAgICAvLyBzdyBlZmZlY3QgZGVzY3JpcHRvciwgYnV0IHdpdGggUHJveHkgVVVJRAogICAgICAgIC8vIGNoZWNrIGZvciBTdyBkZXNjCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c1htbENvbmZpZ0xvYWRlci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c1htbENvbmZpZ0xvYWRlci5jcHAKaW5kZXggNTA1YmU3Yy4uMzBhOTAwNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNYbWxDb25maWdMb2FkZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzWG1sQ29uZmlnTG9hZGVyLmNwcApAQCAtMjgzLDcgKzI4Myw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBsaXN0UHVzaChlZmZlY3RMb2FkUmVzdWx0LmVmZmVjdERlc2MuZ2V0KCksIHN1YkVmZmVjdExpc3QpOwogCi0gICAgICAgICAgICAvLyBTaW5jZSB3ZSByZXR1cm4gYSBkdW1teSBkZXNjcmlwdG9yIGZvciB0aGUgcHJveHkgZHVyaW5nCisgICAgICAgICAgICAvLyBTaW5jZSB3ZSByZXR1cm4gYSBzdHViIGRlc2NyaXB0b3IgZm9yIHRoZSBwcm94eSBkdXJpbmcKICAgICAgICAgICAgIC8vIGdldF9kZXNjcmlwdG9yIGNhbGwsIHdlIHJlcGxhY2UgaXQgd2l0aCB0aGUgY29ycmVzcG9uZGluZwogICAgICAgICAgICAgLy8gc3cgZWZmZWN0IGRlc2NyaXB0b3IsIGJ1dCBrZWVwIHRoZSBQcm94eSBVVUlECiAgICAgICAgICAgICAqZWZmZWN0TG9hZFJlc3VsdC5lZmZlY3REZXNjID0gKnN3RWZmZWN0TG9hZFJlc3VsdC5lZmZlY3REZXNjOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5icAppbmRleCAxZjJhNWUxLi5lZTY5Y2ZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5icApAQCAtMzAsNyArMzAsNiBAQAogICAgICAgICAiQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jcHAiLAogICAgICAgICAiU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfQ29udHJvbC5jcHAiLAogICAgICAgICAiU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfSW5pdC5jcHAiLAotICAgICAgICAiU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfTWVtb3J5LmNwcCIsCiAgICAgICAgICJTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcm9jZXNzLmNwcCIsCiAgICAgICAgICJTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jcHAiLAogICAgICAgICAiU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX1Byb2Nlc3MuY3BwIiwKQEAgLTEzNyw3ICsxMzYsNiBAQAogICAgIF0sCiAgICAgY3BwZmxhZ3M6IFsKICAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAotICAgICAgICAiLURTVVBQT1JUX01DIiwKIAogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdlcnJvciIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIvTFZEQkUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oCmluZGV4IDk0OGQ3OWMuLmNiNjljODggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oCkBAIC02OSw5ICs2OSw2IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKiBNZW1vcnkgdGFibGUqLwotI2RlZmluZSBMVkRCRV9OUl9NRU1PUllfUkVHSU9OUyAgICAgICAgNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgbWVtb3J5IHJlZ2lvbnMgKi8KLQogLyogQmFzcyBFbmhhbmNlbWVudCBlZmZlY3QgbGV2ZWwgKi8KICNkZWZpbmUgTFZEQkVfRUZGRUNUXzAzREIgICAgICAgICAgICAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRWZmZWN0IGRlZmluZXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCiAjZGVmaW5lIExWREJFX0VGRkVDVF8wNkRCICAgICAgICAgICAgNgpAQCAtMTEyLDI1ICsxMDksMTIgQEAKICAgICBMVkRCRV9WT0xVTUVfTUFYID0gTFZNX01BWElOVF8zMgogfSBMVkRCRV9Wb2x1bWVfZW47CiAKLS8qIE1lbW9yeSBUeXBlcyAqLwotdHlwZWRlZiBlbnVtCi17Ci0gICAgTFZEQkVfUEVSU0lTVEVOVCAgICAgID0gMCwKLSAgICBMVkRCRV9QRVJTSVNURU5UX0RBVEEgPSAxLAotICAgIExWREJFX1BFUlNJU1RFTlRfQ09FRiA9IDIsCi0gICAgTFZEQkVfU0NSQVRDSCAgICAgICAgID0gMywKLSAgICBMVkRCRV9NRU1PUllfTUFYICAgICAgPSBMVk1fTUFYSU5UXzMyCi0KLX0gTFZEQkVfTWVtb3J5VHlwZXNfZW47Ci0KIC8qIEZ1bmN0aW9uIHJldHVybiBzdGF0dXMgKi8KIHR5cGVkZWYgZW51bQogewogICAgIExWREJFX1NVQ0NFU1MgICAgICAgID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdWNjZXNzZnVsIHJldHVybiBmcm9tIGEgcm91dGluZSAqLwotICAgIExWREJFX0FMSUdOTUVOVEVSUk9SID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgYWxpZ25tZW50IGVycm9yICovCi0gICAgTFZEQkVfTlVMTEFERFJFU1MgICAgPSAyLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5VTEwgYWxsb2NhdGlvbiBhZGRyZXNzICovCi0gICAgTFZEQkVfVE9PTUFOWVNBTVBMRVMgPSAzLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1heGltdW0gYmxvY2sgc2l6ZSBleGNlZWRlZCAqLwotICAgIExWREJFX1NJWkVFUlJPUiAgICAgID0gNCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNvcnJlY3Qgc3RydWN0dXJlIHNpemUgKi8KKyAgICBMVkRCRV9OVUxMQUREUkVTUyAgICA9IDEsICAgICAgICAgICAgICAgICAgICAgICAgLyogTlVMTCBhbGxvY2F0aW9uIGFkZHJlc3MgKi8KKyAgICBMVkRCRV9UT09NQU5ZU0FNUExFUyA9IDIsICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBibG9jayBzaXplIGV4Y2VlZGVkICovCiAgICAgTFZEQkVfU1RBVFVTX01BWCAgICAgPSBMVk1fTUFYSU5UXzMyCiB9IExWREJFX1JldHVyblN0YXR1c19lbjsKIApAQCAtMjEzLDIxICsxOTcsNiBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyogTWVtb3J5IHJlZ2lvbiBkZWZpbml0aW9uICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgU2l6ZTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gc2l6ZSBpbiBieXRlcyAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgQWxpZ25tZW50OyAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiBhbGlnbm1lbnQgaW4gYnl0ZXMgKi8KLSAgICBMVkRCRV9NZW1vcnlUeXBlc19lbiAgICAgIFR5cGU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gdHlwZSAqLwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKnBCYXNlQWRkcmVzczsgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHJlZ2lvbiBiYXNlIGFkZHJlc3MgKi8KLX0gTFZEQkVfTWVtb3J5UmVnaW9uX3Q7Ci0KLS8qIE1lbW9yeSB0YWJsZSBjb250YWluaW5nIHRoZSByZWdpb24gZGVmaW5pdGlvbnMgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZEQkVfTWVtb3J5UmVnaW9uX3QgICAgUmVnaW9uW0xWREJFX05SX01FTU9SWV9SRUdJT05TXTsgIC8qIE9uZSBkZWZpbml0aW9uIGZvciBlYWNoIHJlZ2lvbiAqLwotfSBMVkRCRV9NZW1UYWJfdDsKLQogLyogUGFyYW1ldGVyIHN0cnVjdHVyZSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKQEAgLTIzOSw5ICsyMDgsNyBAQAogICAgIExWREJFX1ZvbHVtZV9lbiAgICAgICAgIFZvbHVtZUNvbnRyb2w7CiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVm9sdW1lZEI7CiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgSGVhZHJvb21kQjsKLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJDaGFubmVsczsKLSNlbmRpZgogCiB9IExWREJFX1BhcmFtc190OwogCkBAIC0yNjEsNzUgKzIyOCw0MCBAQAogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVkRCRV9NZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gSXQgY2FuIGJlIGNhbGxlZCBpbiAgICAgICAgICovCi0vKiAgICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIHRoZSBtZW1vcnkgICAgKi8KLS8qICBiYXNlIGFkZHJlc3MgcG9pbnRlcnMgYXJlIE5VTEwgb24gcmV0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlIG1lbW9yeSAgICAgKi8KLS8qICB0YWJsZSByZXR1cm5zIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBiYXNlIGFkZHJlc3NlcyB1c2VkIGR1cmluZyBpbml0aWFsaXNhdGlvbi4gICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICovCi0vKiAgICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgZGVmYXVsdCBjYXBhYmlsaXRlcyAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZEQkVfU1VDQ0VTUyAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAxLiAgICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZEQkVfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUxWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9NZW1vcnkoTFZEQkVfSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfTWVtVGFiX3QgICAgICAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NhcGFiaWxpdGllc190ICAgICAqcENhcGFiaWxpdGllcyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWREJFX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBDcmVhdGUgYW5kIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgQmFzcyBFbmhhbmNlbWVudCBtb2R1bGUgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW4gYWxnb3JpdGhtIGluc3RhbmNlIGJ5IGNhbGxpbmcgd2l0aCAgICAgICAgICovCi0vKiAgICBoSW5zdGFuY2Ugc2V0IHRvIE5VTEwuIEluIHRoaXMgY2FzZSB0aGUgYWxnb3JpdGhtIHJldHVybnMgdGhlIG5ldyBpbnN0YW5jZSAgICAgICAgKi8KLS8qICAgIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGZvcmNlIGEgZnVsbCByZS1pbml0aWFsaXNhdGlvbiBvZiB0aGUgYWxnb3JpdGhtICAgICAgKi8KLS8qICAgIGJ5IGNhbGxpbmcgd2l0aCBoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUuIEluIHRoaXMgY2FzZSB0aGUgbWVtb3J5IHRhYmxlICAgICAgICAqLwotLyogICAgc2hvdWxkIGJlIGNvcnJlY3QgZm9yIHRoZSBpbnN0YW5jZSwgdGhpcyBjYW4gYmUgZW5zdXJlZCBieSBjYWxsaW5nIHRoZSBmdW5jdGlvbiAgICovCi0vKiAgICBMVkRCRV9NZW1vcnkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgICBQb2ludGVyIHRvIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgKi8KKy8qICBwU2NyYXRjaCAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgYnVuZGxlIHNjcmF0Y2ggYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVkRCRV9TVUNDRVNTICAgICAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWREJFX0FMSUdOTUVOVEVSUk9SICAgICAgICBJbnN0YW5jZSBvciBzY3JhdGNoIG1lbW9yeSBvbiBpbmNvcnJlY3QgYWxpZ25tZW50ICAgICAgICovCi0vKiAgICBMVkRCRV9OVUxMQUREUkVTUyAgICAgICAgICAgIE9uZSBvciBtb3JlIG1lbW9yeSBoYXMgYSBOVUxMIHBvaW50ZXIgICAgICAgICAgICAgICAgKi8KKy8qICBMVkRCRV9TVUNDRVNTICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gc3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWREJFX05VTExBRERSRVNTICAgICAgICBPbmUgb3IgbW9yZSBtZW1vcnkgaGFzIGEgTlVMTCBwb2ludGVyIC0gbWFsbG9jIGZhaWx1cmUgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuICAgICBUaGUgaW5zdGFuY2UgaGFuZGxlIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IG1lbW9yeSAgICovCi0vKiAgICAgICAgcmVnaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIDIuICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWREJFX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAqLworLyogIDEuICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWREJFX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX0luaXQoTFZEQkVfSGFuZGxlX3QgICAgICAgICAgICpwaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ2FwYWJpbGl0aWVzX3QgICAgICpwQ2FwYWJpbGl0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICpwU2NyYXRjaCk7CiAKLUxWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9Jbml0KExWREJFX0hhbmRsZV90ICAgICAgICAgICAgICpwaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9NZW1UYWJfdCAgICAgICAgICAgKnBNZW1vcnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ2FwYWJpbGl0aWVzX3QgICAgICpwQ2FwYWJpbGl0aWVzKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWREJFX0RlSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGcmVlIHRoZSBtZW1vcmllcyBjcmVhdGVkIGR1cmluZyBMVkRCRV9Jbml0IGluY2x1ZGluZyBpbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIExWREJFX0RlSW5pdChMVkRCRV9IYW5kbGVfdCAgICAgICAgICpwaEluc3RhbmNlKTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmNwcAppbmRleCBhZDc3Njk2Li5iZDAzZGQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuY3BwCkBAIC0yMCwxNzYgKzIwLDYwIEBACiAvKiAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSA8c3RkbGliLmg+CiAKICNpbmNsdWRlICJMVkRCRS5oIgogI2luY2x1ZGUgIkxWREJFX1ByaXZhdGUuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZEQkVfTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuIEl0IGNhbiBiZSBjYWxsZWQgaW4gICAgICAgICAqLwotLyogICAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICBoSW5zdGFuY2UgPSBOVUxMICAgICAgICAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAqLwotLyogICAgICAgIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYmFzZSBhZGRyZXNzZXMgZm9yIHRoZSBpbnN0YW5jZSAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSB0aGUgbWVtb3J5ICAgICovCi0vKiAgYmFzZSBhZGRyZXNzIHBvaW50ZXJzIGFyZSBOVUxMIG9uIHJldHVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlIChoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUpIHRoZSBtZW1vcnkgICAgICovCi0vKiAgdGFibGUgcmV0dXJucyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhbmQgYmFzZSBhZGRyZXNzZXMgdXNlZCBkdXJpbmcgaW5pdGlhbGlzYXRpb24uICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAqLwotLyogICAgcENhcGFiaWxpdGllcyAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWREJFX1NVQ0NFU1MgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgMS4gICAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWREJFX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1MVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfTWVtb3J5KExWREJFX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9NZW1UYWJfdCAgICAgICAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NhcGFiaWxpdGllc190ICAgICAgKnBDYXBhYmlsaXRpZXMpCi17Ci0KLSAgICBMVk1fVUlOVDMyICAgICAgICAgIFNjcmF0Y2hTaXplOwotICAgIExWREJFX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9IChMVkRCRV9JbnN0YW5jZV90ICopaEluc3RhbmNlOwotCi0gICAgLyoKLSAgICAgKiBGaWxsIGluIHRoZSBtZW1vcnkgdGFibGUKLSAgICAgKi8KLSAgICBpZiAoaEluc3RhbmNlID09IExWTV9OVUxMKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogSW5zdGFuY2UgbWVtb3J5Ci0gICAgICAgICAqLwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fSU5TVEFOQ0VdLlNpemUgICAgICAgICA9IHNpemVvZihMVkRCRV9JbnN0YW5jZV90KTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX0lOU1RBTkNFXS5BbGlnbm1lbnQgICAgPSBMVkRCRV9JTlNUQU5DRV9BTElHTjsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX0lOU1RBTkNFXS5UeXBlICAgICAgICAgPSBMVkRCRV9QRVJTSVNURU5UOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fSU5TVEFOQ0VdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIERhdGEgbWVtb3J5Ci0gICAgICAgICAqLwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5TaXplICAgPSBzaXplb2YoTFZEQkVfRGF0YV9GTE9BVF90KTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uQWxpZ25tZW50ICAgID0gTFZEQkVfUEVSU0lTVEVOVF9EQVRBX0FMSUdOOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVkRCRV9QRVJTSVNURU5UX0RBVEE7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIENvZWYgbWVtb3J5Ci0gICAgICAgICAqLwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5TaXplICAgPSBzaXplb2YoTFZEQkVfQ29lZl9GTE9BVF90KTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uQWxpZ25tZW50ICAgID0gTFZEQkVfUEVSU0lTVEVOVF9DT0VGX0FMSUdOOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5UeXBlICAgICAgICAgPSBMVkRCRV9QRVJTSVNURU5UX0NPRUY7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFNjcmF0Y2ggbWVtb3J5Ci0gICAgICAgICAqLwotICAgICAgICBTY3JhdGNoU2l6ZSA9IChMVk1fVUlOVDMyKShMVkRCRV9TQ1JBVENIQlVGRkVSU19JTlBMQUNFKnNpemVvZihMVk1fRkxPQVQpICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMtPk1heEJsb2NrU2l6ZSk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9TQ1JBVENIXS5TaXplICAgICAgICAgPSBTY3JhdGNoU2l6ZTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLkFsaWdubWVudCAgICA9IExWREJFX1NDUkFUQ0hfQUxJR047Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9TQ1JBVENIXS5UeXBlICAgICAgICAgPSBMVkRCRV9TQ1JBVENIOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFJlYWQgYmFjayBtZW1vcnkgYWxsb2NhdGlvbiB0YWJsZSAqLwotICAgICAgICAqcE1lbW9yeVRhYmxlID0gcEluc3RhbmNlLT5NZW1vcnlUYWJsZTsKLSAgICB9Ci0KLSAgICByZXR1cm4oTFZEQkVfU1VDQ0VTUyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWREJFX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBDcmVhdGUgYW5kIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IG1vZHVsZSAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW4gYWxnb3JpdGhtIGluc3RhbmNlIGJ5IGNhbGxpbmcgd2l0aCAgICAgICAgICovCi0vKiAgICBoSW5zdGFuY2Ugc2V0IHRvIE5VTEwuIEluIHRoaXMgY2FzZSB0aGUgYWxnb3JpdGhtIHJldHVybnMgdGhlIG5ldyBpbnN0YW5jZSAgICAgICAgKi8KLS8qICAgIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGZvcmNlIGEgZnVsbCByZS1pbml0aWFsaXNhdGlvbiBvZiB0aGUgYWxnb3JpdGhtICAgICAgKi8KLS8qICAgIGJ5IGNhbGxpbmcgd2l0aCBoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUuIEluIHRoaXMgY2FzZSB0aGUgbWVtb3J5IHRhYmxlICAgICAgICAqLwotLyogICAgc2hvdWxkIGJlIGNvcnJlY3QgZm9yIHRoZSBpbnN0YW5jZSwgdGhpcyBjYW4gYmUgZW5zdXJlZCBieSBjYWxsaW5nIHRoZSBmdW5jdGlvbiAgICovCi0vKiAgICBEQkVfTWVtb3J5IGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIENyZWF0ZSBhbmQgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBCYXNzIEVuaGFuY2VtZW50IG1vZHVsZSAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwaEluc3RhbmNlICAgICAgICAgICAgICAgUG9pbnRlciB0byBpbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbml0aWFsaXNhdGlvbiBjYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICovCisvKiAgcFNjcmF0Y2ggICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGJ1bmRsZSBzY3JhdGNoIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgTFZEQkVfU1VDQ0VTUyAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVkRCRV9BTElHTk1FTlRFUlJPUiAgICBJbnN0YW5jZSBvciBzY3JhdGNoIG1lbW9yeSBvbiBpbmNvcnJlY3QgYWxpZ25tZW50ICAgICAgICAgICAqLwotLyogICAgTFZEQkVfTlVMTEFERFJFU1MgICAgICAgIEluc3RhbmNlIG9yIHNjcmF0Y2ggbWVtb3J5IGhhcyBhIE5VTEwgcG9pbnRlciAgICAgICAgICAgICovCisvKiAgTFZEQkVfTlVMTEFERFJFU1MgICAgICAgIE9uZSBvciBtb3JlIG1lbW9yeSBoYXMgYSBOVUxMIHBvaW50ZXIgLSBtYWxsb2MgZmFpbHVyZSAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gICAgIFRoZSBpbnN0YW5jZSBoYW5kbGUgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgZmlyc3QgbWVtb3J5ICAgKi8KLS8qICAgICAgICByZWdpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgMi4gICAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZEQkVfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICovCisvKiAgMS4gICAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZEQkVfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUxWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9Jbml0KExWREJFX0hhbmRsZV90ICAgICAgICAgKnBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX01lbVRhYl90ICAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NhcGFiaWxpdGllc190ICpwQ2FwYWJpbGl0aWVzKQorTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX0luaXQoTFZEQkVfSGFuZGxlX3QgICAgICAgKnBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAqcENhcGFiaWxpdGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICpwU2NyYXRjaCkKIHsKIAogICAgIExWREJFX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlOwotICAgIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAgICAgICAqcE1peGVyX0luc3RhbmNlOwotICAgIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgICAgICAqcEJ5cGFzc01peGVyX0luc3RhbmNlOworICAgIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcE1peGVyX0luc3RhbmNlOworICAgIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcEJ5cGFzc01peGVyX0luc3RhbmNlOwogICAgIExWTV9GTE9BVCAgICAgICAgICAgICBNaXhHYWluOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICBpOwogCiAgICAgLyoKLSAgICAgKiBTZXQgdGhlIGluc3RhbmNlIGhhbmRsZSBpZiBub3QgYWxyZWFkeSBpbml0aWFsaXNlZAorICAgICAqIENyZWF0ZSB0aGUgaW5zdGFuY2UgaGFuZGxlIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpc2VkCiAgICAgICovCiAgICAgaWYgKCpwaEluc3RhbmNlID09IExWTV9OVUxMKQogICAgIHsKLSAgICAgICAgKnBoSW5zdGFuY2UgPSAoTFZEQkVfSGFuZGxlX3QpcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX0lOU1RBTkNFXS5wQmFzZUFkZHJlc3M7CisgICAgICAgICpwaEluc3RhbmNlID0gY2FsbG9jKDEsIHNpemVvZigqcEluc3RhbmNlKSk7CisgICAgfQorICAgIGlmICgqcGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBMVkRCRV9OVUxMQUREUkVTUzsKICAgICB9CiAgICAgcEluc3RhbmNlID0oTFZEQkVfSW5zdGFuY2VfdCAgKikqcGhJbnN0YW5jZTsKIAogICAgIC8qCi0gICAgICogQ2hlY2sgdGhlIG1lbW9yeSB0YWJsZSBmb3IgTlVMTCBwb2ludGVycyBhbmQgaW5jb3JyZWN0bHkgYWxpZ25lZCBkYXRhCi0gICAgICovCi0gICAgZm9yIChpPTA7IGk8TFZEQkVfTlJfTUVNT1JZX1JFR0lPTlM7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5TaXplIT0wKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocE1lbW9yeVRhYmxlLT5SZWdpb25baV0ucEJhc2VBZGRyZXNzPT1MVk1fTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4oTFZEQkVfTlVMTEFERFJFU1MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCgodWludHB0cl90KXBNZW1vcnlUYWJsZS0+UmVnaW9uW2ldLnBCYXNlQWRkcmVzcyAlIHBNZW1vcnlUYWJsZS0+UmVnaW9uW2ldLkFsaWdubWVudCkhPTApewotICAgICAgICAgICAgICAgIHJldHVybihMVkRCRV9BTElHTk1FTlRFUlJPUik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgogICAgICAqIFNhdmUgdGhlIG1lbW9yeSB0YWJsZSBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlCiAgICAgICovCiAgICAgcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMgPSAqcENhcGFiaWxpdGllczsKIAotICAgIC8qCi0gICAgICogU2F2ZSB0aGUgbWVtb3J5IHRhYmxlIGluIHRoZSBpbnN0YW5jZSBzdHJ1Y3R1cmUKLSAgICAgKi8KLSAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlID0gKnBNZW1vcnlUYWJsZTsKKyAgICBwSW5zdGFuY2UtPnBTY3JhdGNoID0gcFNjcmF0Y2g7CiAKICAgICAvKgogICAgICAqIFNldCB0aGUgZGVmYXVsdCBpbnN0YW5jZSBwYXJhbWV0ZXJzCkBAIC0yMDQsMTIgKzg4LDE4IEBACiAgICAgcEluc3RhbmNlLT5QYXJhbXMuVm9sdW1lZEIgICAgICAgICAgPSAgICAwOwogCiAgICAgLyoKLSAgICAgKiBTZXQgcG9pbnRlciB0byBkYXRhIGFuZCBjb2VmIG1lbW9yeQorICAgICAqIENyZWF0ZSBwb2ludGVyIHRvIGRhdGEgYW5kIGNvZWYgbWVtb3J5CiAgICAgICovCi0gICAgcEluc3RhbmNlLT5wRGF0YSA9Ci0gICAgICAgICAoTFZEQkVfRGF0YV9GTE9BVF90ICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0ucEJhc2VBZGRyZXNzOwotICAgIHBJbnN0YW5jZS0+cENvZWYgPQotICAgICAgICAgKExWREJFX0NvZWZfRkxPQVRfdCAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLnBCYXNlQWRkcmVzczsKKyAgICBwSW5zdGFuY2UtPnBEYXRhID0gKExWREJFX0RhdGFfRkxPQVRfdCAqKWNhbGxvYygxLCBzaXplb2YoKihwSW5zdGFuY2UtPnBEYXRhKSkpOworICAgIGlmIChwSW5zdGFuY2UtPnBEYXRhID09IE5VTEwpCisgICAgeworICAgICAgICByZXR1cm4gTFZEQkVfTlVMTEFERFJFU1M7CisgICAgfQorICAgIHBJbnN0YW5jZS0+cENvZWYgPSAoTFZEQkVfQ29lZl9GTE9BVF90ICopY2FsbG9jKDEsIHNpemVvZigqKHBJbnN0YW5jZS0+cENvZWYpKSk7CisgICAgaWYgKHBJbnN0YW5jZS0+cENvZWYgPT0gTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBMVkRCRV9OVUxMQUREUkVTUzsKKyAgICB9CiAKICAgICAvKgogICAgICAqIEluaXRpYWxpc2UgdGhlIGZpbHRlcnMKQEAgLTI3OCwzICsxNjgsMzIgQEAKIAogICAgIHJldHVybihMVkRCRV9TVUNDRVNTKTsKIH0KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZEQkVfRGVJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZyZWUgdGhlIG1lbW9yaWVzIGNyZWF0ZWQgZHVyaW5nIExWREJFX0luaXQgaW5jbHVkaW5nIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwaEluc3RhbmNlICAgICAgICAgICAgICAgUG9pbnRlciB0byBpbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZEQkVfRGVJbml0KExWREJFX0hhbmRsZV90ICpwaEluc3RhbmNlKQoreworICAgIExWREJFX0luc3RhbmNlX3QgKnBJbnN0YW5jZSA9IChMVkRCRV9JbnN0YW5jZV90ICopKnBoSW5zdGFuY2U7CisgICAgaWYgKHBJbnN0YW5jZSA9PSBMVk1fTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChwSW5zdGFuY2UtPnBEYXRhICE9IExWTV9OVUxMKSB7CisgICAgICAgIGZyZWUocEluc3RhbmNlLT5wRGF0YSk7CisgICAgICAgIHBJbnN0YW5jZS0+cERhdGEgPSBMVk1fTlVMTDsKKyAgICB9CisgICAgaWYgKHBJbnN0YW5jZS0+cENvZWYgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgZnJlZShwSW5zdGFuY2UtPnBDb2VmKTsKKyAgICAgICAgcEluc3RhbmNlLT5wQ29lZiA9IExWTV9OVUxMOworICAgIH0KKyAgICBmcmVlKHBJbnN0YW5jZSk7CisgICAgKnBoSW5zdGFuY2UgPSBMVk1fTlVMTDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oCmluZGV4IGYzZmFhZWQuLjM3N2QyMGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1ByaXZhdGUuaApAQCAtNDcsMjQgKzQ3LDYgQEAKIC8qIEdlbmVyYWwgKi8KICNkZWZpbmUgICAgTFZEQkVfSU5WQUxJRCAgICAgICAgICAgIDB4RkZGRiAgICAgICAgLyogSW52YWxpZCBpbml0IHBhcmFtZXRlciAqLwogCi0vKiBNZW1vcnkgKi8KLSNkZWZpbmUgTFZEQkVfTUVNUkVHSU9OX0lOU1RBTkNFICAgICAgICAgMCAgICAgICAvKiBPZmZzZXQgdG8gdGhlIGluc3RhbmNlIG1lbW9yeSByZWdpb24gKi8KLSNkZWZpbmUgTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQSAgMSAgICAgICAvKiBPZmZzZXQgdG8gcGVyc2lzdGVudCBkYXRhIG1lbW9yeSByZWdpb24gKi8KLSNkZWZpbmUgTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRiAgMiAgICAgICAvKiBPZmZzZXQgdG8gcGVyc2lzdGVudCBjb2VmZmljaWVudCByZWdpb24gKi8KLSNkZWZpbmUgTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0ggICAgICAgICAgMyAgICAgICAvKiBPZmZzZXQgdG8gZGF0YSBzY3JhdGNoIG1lbW9yeSByZWdpb24gKi8KLQotI2RlZmluZSBMVkRCRV9JTlNUQU5DRV9BTElHTiAgICAgICAgICAgICA0ICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIHN0cnVjdHVyZXMgKi8KLSNkZWZpbmUgTFZEQkVfUEVSU0lTVEVOVF9EQVRBX0FMSUdOICAgICAgNCAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBkYXRhICovCi0jZGVmaW5lIExWREJFX1BFUlNJU1RFTlRfQ09FRl9BTElHTiAgICAgIDQgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgY29lZiAqLwotI2RlZmluZSBMVkRCRV9TQ1JBVENIX0FMSUdOICAgICAgICAgICAgICA0ICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGxvbmcgZGF0YSAqLwotCi0jaWZkZWYgU1VQUE9SVF9NQwotLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLwotI2RlZmluZSBMVkRCRV9TQ1JBVENIQlVGRkVSU19JTlBMQUNFICAgICAoTFZNX01BWF9DSEFOTkVMUyAqIDMpCi0jZWxzZQotI2RlZmluZSBMVkRCRV9TQ1JBVENIQlVGRkVSU19JTlBMQUNFICAgICA2ICAgICAgIC8qIE51bWJlciBvZiBidWZmZXJzIHJlcXVpcmVkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KLSNlbmRpZgotCiAjZGVmaW5lIExWREJFX01JWEVSX1RDICAgICAgICAgICAgICAgICAgIDUgICAgICAgLyogTWl4ZXIgdGltZSAgKi8KICNkZWZpbmUgTFZEQkVfQllQQVNTX01JWEVSX1RDICAgICAgICAgICAgMTAwICAgICAvKiBCeXBhc3MgbWl4ZXIgdGltZSAqLwogCkBAIC0xMDAsMTMgKzgyLDEzIEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIC8qIFB1YmxpYyBwYXJhbWV0ZXJzICovCi0gICAgTFZEQkVfTWVtVGFiX3QgICAgICAgICAgICAgICAgTWVtb3J5VGFibGU7ICAgICAgICAvKiBJbnN0YW5jZSBtZW1vcnkgYWxsb2NhdGlvbiB0YWJsZSAqLwogICAgIExWREJFX1BhcmFtc190ICAgICAgICAgICAgICAgIFBhcmFtczsgICAgICAgICAgICAgLyogSW5zdGFuY2UgcGFyYW1ldGVycyAqLwogICAgIExWREJFX0NhcGFiaWxpdGllc190ICAgICAgICBDYXBhYmlsaXRpZXM7ICAgICAgICAgLyogSW5zdGFuY2UgY2FwYWJpbGl0aWVzICovCiAKICAgICAvKiBEYXRhIGFuZCBjb2VmZmljaWVudCBwb2ludGVycyAqLwogICAgIExWREJFX0RhdGFfRkxPQVRfdCAgICAgICAgICAgICAgICAqcERhdGE7ICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGRhdGEgKi8KICAgICBMVkRCRV9Db2VmX0ZMT0FUX3QgICAgICAgICAgICAgICAgKnBDb2VmOyAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBjb2VmZmljaWVudHMgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnBTY3JhdGNoOyAgICAgICAgICAgICAvKiBzY3JhdGNoIHBvaW50ZXIgKi8KIH0gTFZEQkVfSW5zdGFuY2VfdDsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jcHAKaW5kZXggYjRhNzFjNy4uMDg4ZGU5ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1Byb2Nlc3MuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmNwcApAQCAtODEsMTggKzgxLDEzIEBACiAgIExWREJFX0luc3RhbmNlX3QgKnBJbnN0YW5jZSA9KExWREJFX0luc3RhbmNlX3QgKiloSW5zdGFuY2U7CiAKICAgLypFeHRyYWN0IG51bWJlciBvZiBDaGFubmVscyBpbmZvKi8KLSNpZmRlZiBTVVBQT1JUX01DCiAgIC8vIE1vbm8gcGFzc2VkIGluIGFzIHN0ZXJlbwogICBjb25zdCBMVk1fSU5UMzIgTnJDaGFubmVscyA9IHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHMgPT0gMQogICAgICAgPyAyIDogcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVsczsKLSNlbHNlCi0gIGNvbnN0IExWTV9JTlQzMiBOckNoYW5uZWxzID0gMjsgLy8gRkNDXzIKLSNlbmRpZgogICBjb25zdCBMVk1fSU5UMzIgTnJTYW1wbGVzID0gTnJDaGFubmVscyAqIE5yRnJhbWVzOwogCiAgIC8qIFNwYWNlIHRvIHN0b3JlIERCRSBwYXRoIGNvbXB1dGF0aW9uICovCi0gIExWTV9GTE9BVCAqIGNvbnN0IHBTY3JhdGNoID0KLSAgICAgICAgICAoTFZNX0ZMT0FUICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzczsKKyAgTFZNX0ZMT0FUICogY29uc3QgcFNjcmF0Y2ggPSAoTFZNX0ZMT0FUICopcEluc3RhbmNlLT5wU2NyYXRjaDsKIAogICAvKgogICAgKiBTY3JhdGNoIGZvciBNb25vIHBhdGggc3RhcnRzIGF0IG9mZnNldCBvZgpAQCAtMTM2LDMzICsxMzEsMjAgQEAKICAgICAgKi8KICAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuSFBGU2VsZWN0ID09IExWREJFX0hQRl9PTikKICAgICB7Ci0jaWZkZWYgU1VQUE9SVF9NQwogICAgICAgQlFfTUNfRDMyRjMyQzMwX1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cENvZWYtPkhQRkluc3RhbmNlLCAvKiBGaWx0ZXIgaW5zdGFuY2UgICAgICAqLwogICAgICAgICAgIHBTY3JhdGNoLCAvKiBTb3VyY2UgICAgICAgICAgICAgICAqLwogICAgICAgICAgIHBTY3JhdGNoLCAvKiBEZXN0aW5hdGlvbiAgICAgICAgICAqLwogICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCiAgICAgICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKLSNlbHNlCi0gICAgICBCUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5wQ29lZi0+SFBGSW5zdGFuY2UsLyogRmlsdGVyIGluc3RhbmNlICAgICAgKi8KLSAgICAgICAgICBwU2NyYXRjaCwgLyogU291cmNlICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICBwU2NyYXRjaCwgLyogRGVzdGluYXRpb24gICAgICAgICAgKi8KLSAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzKTsKLSNlbmRpZgogICAgIH0KIAogICAgIC8qCiAgICAgICogQ3JlYXRlIHRoZSBtb25vIHN0cmVhbQogICAgICAqLwotI2lmZGVmIFNVUFBPUlRfTUMKICAgICBGcm9tTWNUb01vbm9fRmxvYXQocFNjcmF0Y2gsIC8qIFNvdXJjZSAqLwogICAgICAgICBwTW9ubywgLyogTW9ubyBkZXN0aW5hdGlvbiAqLwogICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLCAgLyogTnVtYmVyIG9mIGZyYW1lcyAqLwogICAgICAgICAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOwotI2Vsc2UKLSAgICBGcm9tMmlUb01vbm9fRmxvYXQocFNjcmF0Y2gsIC8qIFN0ZXJlbyBzb3VyY2UgICAgICAgICAqLwotICAgICAgICBwTW9ubywgLyogTW9ubyBkZXN0aW5hdGlvbiAgICAgICovCi0gICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMpOwotI2VuZGlmCiAKICAgICAvKgogICAgICAqIEFwcGx5IHRoZSBiYW5kIHBhc3MgZmlsdGVyCkBAIC0xNzUsMjAgKzE1NywxMiBAQAogICAgIC8qCiAgICAgICogQXBwbHkgdGhlIEFHQyBhbmQgbWl4CiAgICAgICovCi0jaWZkZWYgU1VQUE9SVF9NQwogICAgIEFHQ19NSVhfVk9MX01jMU1vbl9EMzJfV1JBKCZwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZSwgLyogSW5zdGFuY2UgcG9pbnRlciAgICAgICovCiAgICAgICAgIHBTY3JhdGNoLCAvKiBTb3VyY2UgICAgICAgICAqLwogICAgICAgICBwTW9ubywgLyogTW9ubyBiYW5kIHBhc3Mgc291cmNlICovCiAgICAgICAgIHBTY3JhdGNoLCAvKiBEZXN0aW5hdGlvbiAgICAqLwogICAgICAgICBOckZyYW1lcywgLyogTnVtYmVyIG9mIGZyYW1lcyAgICAgKi8KICAgICAgICAgTnJDaGFubmVscyk7IC8qIE51bWJlciBvZiBjaGFubmVscyAgICAgKi8KLSNlbHNlCi0gICAgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKCZwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZSwgLyogSW5zdGFuY2UgcG9pbnRlciAgICAgICovCi0gICAgICAgIHBTY3JhdGNoLCAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KLSAgICAgICAgcE1vbm8sIC8qIE1vbm8gYmFuZCBwYXNzIHNvdXJjZSAqLwotICAgICAgICBwU2NyYXRjaCwgLyogU3RlcmVvIGRlc3RpbmF0aW9uICAgICovCi0gICAgICAgIE5yRnJhbWVzKTsKLSNlbmRpZgogCiAgICAgZm9yIChMVk1fSU5UMzIgaWkgPSAwOyBpaSA8IE5yU2FtcGxlczsgKytpaSkgewogICAgICAgLy9UT0RPOiByZXBsYWNlIHdpdGggZXhpc3RpbmcgY2xhbXBpbmcgZnVuY3Rpb24KQEAgLTIxMywxOCArMTg3LDExIEBACiAgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBidXQgdm9sdW1lIG1hbmFnZW1lbnQgaXMgcmVxdWlyZWQgdG8gY29tcGVuc2F0ZSBmb3IKICAgICAgKiBoZWFkcm9vbSBhbmQgdm9sdW1lIChpZiBlbmFibGVkKQogICAgICAqLwotI2lmZGVmIFNVUFBPUlRfTUMKICAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUsCiAgICAgICAgIHBJbkRhdGEsCiAgICAgICAgIHBTY3JhdGNoVm9sLAogICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAogICAgICAgICAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOwotI2Vsc2UKLSAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLAotICAgICAgICBwSW5EYXRhLAotICAgICAgICBwU2NyYXRjaFZvbCwKLSAgICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOyAvKiBMZWZ0IGFuZCByaWdodCwgcmVhbGx5ICMgc2FtcGxlcyAqLwotI2VuZGlmCiAgIH0gZWxzZSB7CiAgICAgLy8gY2xlYXIgYnlwYXNzIHZvbHVtZSBwYXRoCiAgICAgbWVtc2V0KHBTY3JhdGNoVm9sLCAwLCBzaXplb2YoKnBTY3JhdGNoVm9sKSAqIE5yU2FtcGxlcyk7CkBAIC0yMzMsMTkgKzIwMCwxMSBAQAogICAvKgogICAgKiBNaXggREJFIHByb2Nlc3NlZCBwYXRoIGFuZCBieXBhc3Mgdm9sdW1lIHBhdGgKICAgICovCi0jaWZkZWYgU1VQUE9SVF9NQwogICBMVkNfTWl4U29mdF8yTWNfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIsCiAgICAgICBwU2NyYXRjaCwKICAgICAgIHBTY3JhdGNoVm9sLAogICAgICAgcE91dERhdGEsCiAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAogICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKLSNlbHNlCi0gIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlciwKLSAgICAgIHBTY3JhdGNoLAotICAgICAgcFNjcmF0Y2hWb2wsCi0gICAgICBwT3V0RGF0YSwKLSAgICAgIChMVk1fSU5UMTYpTnJTYW1wbGVzKTsKLSNlbmRpZgogICByZXR1cm4gTFZEQkVfU1VDQ0VTUzsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9saWIvTFZNLmgKaW5kZXggZTRlODQ1MC4uNzgzYzNhMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9saWIvTFZNLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9saWIvTFZNLmgKQEAgLTY3LDkgKzY3LDYgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLS8qIE1lbW9yeSB0YWJsZSovCi0jZGVmaW5lIExWTV9OUl9NRU1PUllfUkVHSU9OUyAgICAgICAgICAgICAgICAgNCAgICAgLyogTnVtYmVyIG9mIG1lbW9yeSByZWdpb25zICovCi0KIC8qIENvbmNlcnQgU291bmQgZWZmZWN0IGxldmVsIHByZXNldHMgKi8KICNkZWZpbmUgTFZNX0NTX0VGRkVDVF9OT05FICAgICAgICAgICAgICAgICAgICAwICAgICAvKiAwJSBlZmZlY3QsIG1pbmltdW0gdmFsdWUgKi8KICNkZWZpbmUgTFZNX0NTX0VGRkVDVF9MT1cgICAgICAgICAgICAgICAgIDE2Mzg0ICAgICAvKiA1MCUgZWZmZWN0ICovCkBAIC0yMjUsMTIgKzIyMiw2IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKiBNZW1vcnkgdGFibGUgY29udGFpbmluZyB0aGUgcmVnaW9uIGRlZmluaXRpb25zICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9NZW1vcnlSZWdpb25fc3QgICAgICAgICBSZWdpb25bTFZNX05SX01FTU9SWV9SRUdJT05TXTsgIC8qIE9uZSBkZWZpbml0aW9uIGZvciBlYWNoIHJlZ2lvbiAqLwotfSBMVk1fTWVtVGFiX3Q7Ci0KIC8qIE4tQmFuZCBlcXVhbGlzZXIgYmFuZCBkZWZpbml0aW9uICovCiB0eXBlZGVmIHN0cnVjdAogewpAQCAtMjg1LDEwICsyNzYsOCBAQAogICAgIC8qIFNwZWN0cnVtIEFuYWx5emVyIHBhcmFtZXRlcnMgQ29udHJvbCAqLwogICAgIExWTV9QU0FfTW9kZV9lbiAgICAgICAgICAgICBQU0FfRW5hYmxlOwogICAgIExWTV9QU0FfRGVjYXlTcGVlZF9lbiAgICAgICBQU0FfUGVha0RlY2F5UmF0ZTsgICAgICAvKiBQZWFrIHZhbHVlIGRlY2F5IHJhdGUqLwotI2lmZGVmIFNVUFBPUlRfTUMKICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgTnJDaGFubmVsczsKICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgQ2hNYXNrOwotI2VuZGlmCiAKIH0gTFZNX0NvbnRyb2xQYXJhbXNfdDsKIApAQCAtMzQzLDUxICszMzIsMTQgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fR2V0TWVtb3J5VGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlLiBJdCBjYW4gYmUgY2FsbGVkIGluICAgICAgICAgICAqLwotLyogIHR3byB3YXlzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgaEluc3RhbmNlID0gTlVMTCAgICAgICAgICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzICAgICAgICAgICAgICAgICAqLwotLyogICAgICBoSW5zdGFuY2UgPSBJbnN0YW5jZSBoYW5kbGUgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGJhc2UgYWRkcmVzc2VzIGZvciB0aGUgaW5zdGFuY2UgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIChoSW5zdGFuY2U9TlVMTCkgdGhlIG1lbW9yeSAgICAgICovCi0vKiAgYmFzZSBhZGRyZXNzIHBvaW50ZXJzIGFyZSBOVUxMIG9uIHJldHVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZnJlZSAoaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlKSB0aGUgbWVtb3J5ICAgICAgICovCi0vKiAgdGFibGUgcmV0dXJucyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhbmQgYmFzZSBhZGRyZXNzZXMgdXNlZCBkdXJpbmcgaW5pdGlhbGlzYXRpb24uICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAqLwotLyogIHBJbnN0UGFyYW1zICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWTV9TVUNDRVNTICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZNX05VTExBRERSRVNTICAgICAgICAgV2hlbiBvbmUgb2YgcE1lbW9yeVRhYmxlIG9yIHBJbnN0UGFyYW1zIGlzIE5VTEwgICAgICAgICAgICAgKi8KLS8qICBMVk1fT1VUT0ZSQU5HRSAgICAgICAgICBXaGVuIGFueSBvZiB0aGUgSW5zdGFuY2UgcGFyYW1ldGVycyBhcmUgb3V0IG9mIHJhbmdlICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0dldE1lbW9yeVRhYmxlKExWTV9IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9NZW1UYWJfdCAgICAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSW5zdFBhcmFtc190ICAgICAqcEluc3RQYXJhbXMpOwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9HZXRJbnN0YW5jZUhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjcmVhdGUgYSBidW5kbGUgaW5zdGFuY2UuIEl0IHJldHVybnMgdGhlIGNyZWF0ZWQgaW5zdGFuY2UgICovCi0vKiAgaGFuZGxlIHRocm91Z2ggcGhJbnN0YW5jZS4gQWxsIHBhcmFtZXRlcnMgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0LCBpbmFjdGl2ZSBzdGF0ZS4gKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY3JlYXRlIGEgYnVuZGxlIGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFsbCBwYXJhbWV0ZXJzIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCwgaW5hY3RpdmUgc3RhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwaEluc3RhbmNlICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIHBJbnN0UGFyYW1zICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDAwLDExICszNTIsMjcgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRJbnN0YW5jZUhhbmRsZShMVk1fSGFuZGxlX3QgICAgICAgICpwaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX01lbVRhYl90ICAgICAgICAqcE1lbW9yeVRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0luc3RQYXJhbXNfdCAgICAqcEluc3RQYXJhbXMpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9EZWxJbnN0YW5jZUhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjcmVhdGUgYSBidW5kbGUgaW5zdGFuY2UuIEl0IHJldHVybnMgdGhlIGNyZWF0ZWQgaW5zdGFuY2UgICovCisvKiAgaGFuZGxlIHRocm91Z2ggcGhJbnN0YW5jZS4gQWxsIHBhcmFtZXRlcnMgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0LCBpbmFjdGl2ZSBzdGF0ZS4gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIExWTV9EZWxJbnN0YW5jZUhhbmRsZShMVk1fSGFuZGxlX3QgICAgICAgICpwaEluc3RhbmNlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fQ2xlYXJBdWRpb0J1ZmZlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmNwcAppbmRleCAzYWVkZGJiLi40YzI1Y2UwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQnVmZmVycy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuY3BwCkBAIC02MiwxMSArNjIsNyBAQAogICAgIExWTV9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CiAgICAgTFZNX0J1ZmZlcl90ICAgICAqcEJ1ZmZlcjsKICAgICBMVk1fRkxPQVQgICAgICAgICpwRGVzdDsKLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgTFZNX0lOVDE2ICAgICAgICBOdW1DaGFubmVscyA9IHBJbnN0YW5jZS0+TnJDaGFubmVsczsKLSNlbHNlCi0gICAgTFZNX0lOVDE2ICAgICAgICBOdW1DaGFubmVscyA9IDI7Ci0jZW5kaWYKIAogICAgIC8qCiAgICAgICogU2V0IHRoZSBwcm9jZXNzaW5nIGFkZHJlc3MgcG9pbnRlcnMKQEAgLTM4OCwxMSArMzg0LDkgQEAKICAgICBMVk1fSU5UMTYgICAgICAgTnVtU2FtcGxlczsKICAgICBMVk1fRkxPQVQgICAgICAgKnBTdGFydDsKICAgICBMVk1fRkxPQVQgICAgICAgKnBEZXN0OwotI2lmZGVmIFNVUFBPUlRfTUMKICAgICBMVk1fSU5UMzIgICAgICAgTnJDaGFubmVscyA9IHBJbnN0YW5jZS0+TnJDaGFubmVsczsKICNkZWZpbmUgTnJGcmFtZXMgTnVtU2FtcGxlcyAgLy8gYWxpYXMgZm9yIGNsYXJpdHkKICNkZWZpbmUgRnJhbWVDb3VudCBTYW1wbGVDb3VudAotI2VuZGlmCiAKICAgICAvKgogICAgICAqIFNldCB0aGUgcG9pbnRlcnMKQEAgLTQyNiwyNSArNDIwLDE1IEBACiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQ29weSBhbGwgb3V0cHV0IGRlbGF5IHNhbXBsZXMgdG8gdGhlIG91dHB1dAogICAgICAgICAgICAgICovCi0jaWZkZWYgU1VQUE9SVF9NQwogICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwogICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yQ2hhbm5lbHMgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpKTsKLSNlbHNlCi0gICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcykpOyAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLwotI2VuZGlmCiAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIHBvaW50ZXIgYW5kIHNhbXBsZSBjb3VudHMKICAgICAgICAgICAgICAqLwotI2lmZGVmIFNVUFBPUlRfTUMKICAgICAgICAgICAgIHBEZXN0ICs9IE5yQ2hhbm5lbHMgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXM7IC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLwotI2Vsc2UKLSAgICAgICAgICAgIHBEZXN0ICs9IDIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXM7IC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLwotI2VuZGlmCiAgICAgICAgICAgICBOdW1TYW1wbGVzID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyAtIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyk7IC8qIFNhbXBsZXMgbGVmdCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHNlbmQgKi8KICAgICAgICAgICAgIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA9IDA7IC8qIE5vIHNhbXBsZXMgbGVmdCBpbiB0aGUgYnVmZmVyICovCkBAIC00NTQsNDAgKzQzOCwyNCBAQAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIENvcHkgb25seSBzb21lIG9mIHRoZSBvdXB1dCBkZWxheSBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKICAgICAgICAgICAgICAqLwotI2lmZGVmIFNVUFBPUlRfTUMKICAgICAgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCiAgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yQ2hhbm5lbHMgKiBOckZyYW1lcykpOyAgICAgICAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLwotI2Vsc2UKLSAgICAgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgIC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCi0jZW5kaWYKIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50cwogICAgICAgICAgICAgICovCi0jaWZkZWYgU1VQUE9SVF9NQwogICAgICAgICAgICAgcERlc3QgKz0gTnJDaGFubmVscyAqIE5yRnJhbWVzOyAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KLSNlbHNlCi0gICAgICAgICAgICBwRGVzdCArPSAyICogTnVtU2FtcGxlczsgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCi0jZW5kaWYKICAgICAgICAgICAgIC8qIE5vIHNhbXBsZXMgbGVmdCBpbiB0aGUgYnVmZmVyICovCiAgICAgICAgICAgICBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgPSAoTFZNX0lOVDE2KShwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgLSBOdW1TYW1wbGVzKTsKIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFJlYWxpZ24gdGhlIGRlbGF5IGJ1ZmZlciBkYXRhIHRvIGF2b2lkIHVzaW5nIGNpcmN1bGFyIGJ1ZmZlciBtYW5hZ2VtZW50CiAgICAgICAgICAgICAgKi8KLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlcltOckNoYW5uZWxzICogTnJGcmFtZXNdLCAgICAgICAgIC8qIFNvdXJjZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBtb3ZlICovCiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yQ2hhbm5lbHMgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpKTsKLSNlbHNlCi0gICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclsyICogTnVtU2FtcGxlc10sICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMpKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gbW92ZSAqLwotI2VuZGlmCiAgICAgICAgICAgICBOdW1TYW1wbGVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZXMgbGVmdCB0byBzZW5kICovCiAgICAgICAgIH0KICAgICB9CkBAIC01MDMsMjMgKzQ3MSwxMyBAQAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIENvcHkgYWxsIHByb2Nlc3NlZCBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKICAgICAgICAgICAgICAqLwotI2lmZGVmIFNVUFBPUlRfTUMKICAgICAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCiAgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yQ2hhbm5lbHMgKiBGcmFtZUNvdW50KSk7IC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLwotI2Vsc2UKLSAgICAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBTYW1wbGVDb3VudCkpOyAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KLSNlbmRpZgogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50cwogICAgICAgICAgICAgICovCi0jaWZkZWYgU1VQUE9SVF9NQwogICAgICAgICAgICAgcERlc3QgICAgICArPSBOckNoYW5uZWxzICogRnJhbWVDb3VudDsgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLwotI2Vsc2UKLSAgICAgICAgICAgIHBEZXN0ICAgICAgKz0gMiAqIFNhbXBsZUNvdW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCi0jZW5kaWYKICAgICAgICAgICAgIE51bVNhbXBsZXMgID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyAtIFNhbXBsZUNvdW50KTsgICAgLyogU2FtcGxlcyBsZWZ0IHRvIHNlbmQgKi8KICAgICAgICAgICAgIFNhbXBsZUNvdW50ID0gMDsgLyogTm8gc2FtcGxlcyBsZWZ0IGluIHRoZSBidWZmZXIgKi8KICAgICAgICAgfQpAQCAtNTI4LDI1ICs0ODYsMTQgQEAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBDb3B5IG9ubHkgc29tZSBwcm9jZXNzZWQgc2FtcGxlcyB0byB0aGUgb3V0cHV0CiAgICAgICAgICAgICAgKi8KLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwogICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogTnJGcmFtZXMpKTsgIC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLwotI2Vsc2UKLSAgICAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KLSNlbmRpZgogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlcnMgYW5kIHNhbXBsZSBjb3VudHMKICAgICAgICAgICAgICAgICovCi0jaWZkZWYgU1VQUE9SVF9NQwogICAgICAgICAgICAgcFN0YXJ0ICAgICAgKz0gTnJDaGFubmVscyAqIE5yRnJhbWVzOyAgICAgICAgICAgICAgIC8qIFByb2Nlc3NlZCBzYW1wbGUgcG9pbnRlciAqLwogICAgICAgICAgICAgcERlc3QgICAgICAgKz0gTnJDaGFubmVscyAqIE5yRnJhbWVzOyAgICAgICAgICAgICAgIC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLwotI2Vsc2UKLSAgICAgICAgICAgIHBTdGFydCAgICAgICs9IDIgKiBOdW1TYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByb2Nlc3NlZCBzYW1wbGUgcG9pbnRlciAqLwotICAgICAgICAgICAgcERlc3QgICAgICAgKz0gMiAqIE51bVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCi0jZW5kaWYKICAgICAgICAgICAgIFNhbXBsZUNvdW50ICA9IChMVk1fSU5UMTYpKFNhbXBsZUNvdW50IC0gTnVtU2FtcGxlcyk7IC8qIFByb2Nlc3NlZCBzYW1wbGVzIGxlZnQgKi8KICAgICAgICAgICAgIE51bVNhbXBsZXMgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBzYW1wbGUgY291bnQgKi8KICAgICAgICAgfQpAQCAtNTU3LDE2ICs1MDQsMTAgQEAKICAgICAgKi8KICAgICBpZiAoU2FtcGxlQ291bnQgIT0gMCkKICAgICB7Ci0jaWZkZWYgU1VQUE9SVF9NQwogICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCiAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbTnJDaGFubmVscyAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlc10sCiAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJDaGFubmVscyAqIEZyYW1lQ291bnQpKTsgICAgICAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KLSNlbHNlCi0gICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlc10sIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIFNhbXBsZUNvdW50KSk7ICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCi0jZW5kaWYKICAgICAgICAgLyogVXBkYXRlIHRoZSBidWZmZXIgY291bnQgKi8KICAgICAgICAgcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzID0gKExWTV9JTlQxNikocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzICsgU2FtcGxlQ291bnQpOwogICAgIH0KQEAgLTYwNiw3ICs1NDcsNiBAQAogewogCiAgICAgTFZNX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlICA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0jaWZkZWYgU1VQUE9SVF9NQwogICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHM7CiAgICAgaWYgKE51bUNoYW5uZWxzID09IDEpCiAgICAgewpAQCAtNjE1LDE5ICs1NTUsMTIgQEAKICAgICB9CiAjdW5kZWYgTnJGcmFtZXMKICNkZWZpbmUgTnJGcmFtZXMgKCpwTnVtU2FtcGxlcykgLy8gYWxpYXMgZm9yIGNsYXJpdHkKLSNlbHNlCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscyA9IDI7Ci0jZW5kaWYKIAogICAgIC8qCiAgICAgICogVXBkYXRlIHNhbXBsZSBjb3VudHMKICAgICAgKi8KICAgICBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMgICAgKz0gKExWTV9JTlQxNikoKnBOdW1TYW1wbGVzICogTnVtQ2hhbm5lbHMpOyAvKiBVcGRhdGUgdGhlIEkvTyBwb2ludGVycyAqLwotI2lmZGVmIFNVUFBPUlRfTUMKICAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzICAgKz0gKExWTV9JTlQxNikoTnJGcmFtZXMgKiBOdW1DaGFubmVscyk7Ci0jZWxzZQotICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgICArPSAoTFZNX0lOVDE2KSgqcE51bVNhbXBsZXMgKiAyKTsKLSNlbmRpZgogICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyAgPSAoTFZNX0lOVDE2KShwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgLSAqcE51bVNhbXBsZXMpOyAvKiBVcGRhdGUgdGhlIHNhbXBsZSBjb3VudCAqLwogCiAgICAgLyoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db250cm9sLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db250cm9sLmNwcAppbmRleCBmZjJjOTBhLi5iYjM2NTJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuY3BwCkBAIC03MCwyMyArNzAsMTcgQEAKICAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkgICAgICAmJgogICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODgyMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU185NjAwMCkgJiYKICAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE3NjQwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE5MjAwMCkpICAgICAgfHwKLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgICAgICgocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9TVEVSRU8pICYmCiAgICAgICAgICAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PSU5TVEVSRU8pICYmCiAgICAgICAgICAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PKSAmJgogICAgICAgICAgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTVVMVElDSEFOTkVMKSkgfHwKLSNlbHNlCi0gICAgICAgICgocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9TVEVSRU8pICYmIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk9JTlNURVJFTykgJiYgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykpIHx8Ci0jZW5kaWYKICAgICAgICAgKHBQYXJhbXMtPlNwZWFrZXJUeXBlID4gTFZNX0VYX0hFQURQSE9ORVMpKQogICAgIHsKICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CiAgICAgfQogCi0jaWZkZWYgU1VQUE9SVF9NQwogICAgIHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHMgPSBwUGFyYW1zLT5OckNoYW5uZWxzOwogICAgIHBJbnN0YW5jZS0+UGFyYW1zLkNoTWFzayAgICAgPSBwUGFyYW1zLT5DaE1hc2s7Ci0jZW5kaWYKICAgICAvKgogICAgICAqIENpbmVtYSBTb3VuZCBwYXJhbWV0ZXJzCiAgICAgICovCkBAIC01MjgsMTAgKzUyMiw4IEBACiAgICAgfSB3aGlsZSAoKHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgIT0gTFZNX0ZBTFNFKSAmJgogICAgICAgICAgICAgIChDb3VudCA+IDApKTsKIAotI2lmZGVmIFNVUFBPUlRfTUMKICAgICBwSW5zdGFuY2UtPk5yQ2hhbm5lbHMgPSBMb2NhbFBhcmFtcy5OckNoYW5uZWxzOwogICAgIHBJbnN0YW5jZS0+Q2hNYXNrID0gTG9jYWxQYXJhbXMuQ2hNYXNrOwotI2VuZGlmCiAKICAgICAvKiBDbGVhciBhbGwgaW50ZXJuYWwgZGF0YSBpZiBmb3JtYXQgY2hhbmdlKi8KICAgICBpZihMb2NhbFBhcmFtcy5Tb3VyY2VGb3JtYXQgIT0gcEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0KQpAQCAtNjM4LDkgKzYzMCw3IEBACiAgICAgICAgIERCRV9QYXJhbXMuSGVhZHJvb21kQiAgICAgICA9IDA7CiAgICAgICAgIERCRV9QYXJhbXMuVm9sdW1lQ29udHJvbCAgICA9IExWREJFX1ZPTFVNRV9PRkY7CiAgICAgICAgIERCRV9QYXJhbXMuVm9sdW1lZEIgICAgICAgICA9IDA7Ci0jaWZkZWYgU1VQUE9SVF9NQwogICAgICAgICBEQkVfUGFyYW1zLk5yQ2hhbm5lbHMgICAgICAgICA9IExvY2FsUGFyYW1zLk5yQ2hhbm5lbHM7Ci0jZW5kaWYKIAogICAgICAgICAvKgogICAgICAgICAgKiBNYWtlIHRoZSBjaGFuZ2VzCkBAIC02OTAsNyArNjgwLDYgQEAKICAgICAgICAgewogICAgICAgICAgICAgRVFOQl9QYXJhbXMuU291cmNlRm9ybWF0ID0gTFZFUU5CX1NURVJFTzsKICAgICAgICAgfQotI2lmZGVmIFNVUFBPUlRfTUMKICAgICAgICAgLyogTm90ZTogQ3VycmVudGx5IFNvdXJjZUZvcm1hdCBmaWVsZCBvZiBFUU5CIGlzIG5vdCBiZWVuCiAgICAgICAgICAqICAgICAgIHVzZWQgYnkgdGhlIG1vZHVsZS4KICAgICAgICAgICovCkBAIC02OTgsMTQgKzY4NywxMSBAQAogICAgICAgICB7CiAgICAgICAgICAgICBFUU5CX1BhcmFtcy5Tb3VyY2VGb3JtYXQgPSBMVkVRTkJfTVVMVElDSEFOTkVMOwogICAgICAgICB9Ci0jZW5kaWYKICAgICAgICAgZWxzZQogICAgICAgICB7CiAgICAgICAgICAgICBFUU5CX1BhcmFtcy5Tb3VyY2VGb3JtYXQgPSBMVkVRTkJfTU9OT0lOU1RFUkVPOyAgICAgLyogRm9yY2UgdG8gTW9uby1pbi1TdGVyZW8gbW9kZSAqLwogICAgICAgICB9Ci0jaWZkZWYgU1VQUE9SVF9NQwogICAgICAgICBFUU5CX1BhcmFtcy5OckNoYW5uZWxzICAgICAgICAgPSBMb2NhbFBhcmFtcy5OckNoYW5uZWxzOwotI2VuZGlmCiAKICAgICAgICAgLyoKICAgICAgICAgICogU2V0IHRoZSBjb250cm9sIGZsYWcKQEAgLTc2NiwxNiArNzUyLDEyIEBACiAgICAgICAgICAgICBDU19QYXJhbXMuU3BlYWtlclR5cGUgID0gTFZDU19IRUFEUEhPTkVTOwogICAgICAgICB9CiAKLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgICAgIC8qIENvbmNlcnQgc291bmQgbW9kdWxlIHByb2Nlc3NlcyBvbmx5IHRoZSBsZWZ0IGFuZCByaWdodCBjaGFubmVscwogICAgICAgICAgKiBkYXRhLiBTbyB0aGUgU291cmNlIEZvcm1hdCBpcyBzZXQgdG8gTFZDU19TVEVSRU8gZm9yIG11bHRpY2hhbm5lbAogICAgICAgICAgKiBpbnB1dCBhbHNvLgogICAgICAgICAgKi8KICAgICAgICAgaWYgKExvY2FsUGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fU1RFUkVPIHx8CiAgICAgICAgICAgICBMb2NhbFBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX01VTFRJQ0hBTk5FTCkKLSNlbHNlCi0gICAgICAgIGlmIChMb2NhbFBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX1NURVJFTykgICAgLyogTW9ubyBmb3JtYXQgbm90IHN1cHBvcnRlZCAqLwotI2VuZGlmCiAgICAgICAgIHsKICAgICAgICAgICAgIENTX1BhcmFtcy5Tb3VyY2VGb3JtYXQgPSBMVkNTX1NURVJFTzsKICAgICAgICAgfQpAQCAtNzg2LDkgKzc2OCw3IEBACiAgICAgICAgIENTX1BhcmFtcy5TYW1wbGVSYXRlICA9IExvY2FsUGFyYW1zLlNhbXBsZVJhdGU7CiAgICAgICAgIENTX1BhcmFtcy5SZXZlcmJMZXZlbCA9IExvY2FsUGFyYW1zLlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWw7CiAgICAgICAgIENTX1BhcmFtcy5FZmZlY3RMZXZlbCA9IExvY2FsUGFyYW1zLkNTX0VmZmVjdExldmVsOwotI2lmZGVmIFNVUFBPUlRfTUMKICAgICAgICAgQ1NfUGFyYW1zLk5yQ2hhbm5lbHMgID0gTG9jYWxQYXJhbXMuTnJDaGFubmVsczsKLSNlbmRpZgogCiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldCB0aGUgY29udHJvbCBmbGFnCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fSW5pdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fSW5pdC5jcHAKaW5kZXggNTYyMDUyOS4uNThjMThkZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0luaXQuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Jbml0LmNwcApAQCAtMjAsNiArMjAsNyBAQAogLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgogCiAjaW5jbHVkZSAiTFZNX1ByaXZhdGUuaCIKICNpbmNsdWRlICJMVk1fVGFibGVzLmgiCkBAIC0yOCw0NzkgKzI5LDMxIEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX0dldE1lbW9yeVRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gSXQgY2FuIGJlIGNhbGxlZCBpbiAgICAgICAgICAgKi8KLS8qICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIHRoZSBtZW1vcnkgICAgICAqLwotLyogIGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlIG1lbW9yeSAgICAgICAqLwotLyogIHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgKi8KLS8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBkZWZhdWx0IGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIFdoZW4gb25lIG9mIHBNZW1vcnlUYWJsZSBvciBwSW5zdFBhcmFtcyBpcyBOVUxMICAgICAgICAgICAgICovCi0vKiAgTFZNX09VVE9GUkFOR0UgICAgICAgICAgV2hlbiBhbnkgb2YgdGhlIEluc3RhbmNlIHBhcmFtZXRlcnMgYXJlIG91dCBvZiByYW5nZSAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAyLiAgVGhlIHNjcmF0Y2ggbWVtb3J5IGlzIHRoZSBsYXJnZXN0IHJlcXVpcmVkIGJ5IGFueSBvZiB0aGUgc3ViLW1vZHVsZXMgcGx1cyBhbnkgICAqLwotLyogICAgICBhZGRpdGlvbmFsIHNjcmF0Y2ggcmVxdWlyZW1lbnRzIG9mIHRoZSBidW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogNCBUeXBlcyBvZiBNZW1vcnkgUmVnaW9ucyBvZiBMVk0KLSAqIFRPRE86IEFsbG9jYXRlIG9uIHRoZSBmbHkuCi0gKiBpKSAgIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEEgLSBGb3IgSW5zdGFuY2UgSGFuZGxlcwotICogaWkpICBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBIC0gUGVyc2lzdGVudCBCdWZmZXJzCi0gKiBpaWkpIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUYgLSBGb3IgSG9sZGluZyBTdHJ1Y3R1cmUgdmFsdWVzCi0gKiBpdikgIExWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1QgICAgICAgLSBGb3IgSG9sZGluZyBTdHJ1Y3R1cmUgdmFsdWVzCi0gKgotICogTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQToKLSAqICAgVG90YWwgTWVtb3J5IHNpemU6Ci0gKiAgICAgc2l6ZW9mKExWTV9JbnN0YW5jZV90KSArIFwKLSAqICAgICBzaXplb2YoTFZNX0J1ZmZlcl90KSArIFwKLSAqICAgICBzaXplb2YoTFZQU0FfSW5zdGFuY2VQcl90KSArIFwKLSAqICAgICBzaXplb2YoTFZNX0J1ZmZlcl90KSAtIG5lZWRlZCBpZiBidWZmZXIgbW9kZSBpcyBMVk1fTUFOQUdFRF9CVUZGRVIKLSAqCi0gKiBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBOgotICogICBUb3RhbCBNZW1vcnkgc2l6ZToKLSAqICAgICBzaXplb2YoTFZNX1RFX0RhdGFfdCkgKyBcCi0gKiAgICAgMiAqIHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWTV9FUU5CX0JhbmREZWZfdCkgKyBcCi0gKiAgICAgc2l6ZW9mKExWQ1NfRGF0YV90KSArIFwKLSAqICAgICBzaXplb2YoTFZEQkVfRGF0YV9GTE9BVF90KSArIFwKLSAqICAgICBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QpICsgXAotICogICAgIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkgKyBcCi0gKiAgICAgcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QpICsgXAotICogICAgIHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWRVFOQl9CYW5kRGVmX3QpICsgXAotICogICAgIHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWRVFOQl9CaXF1YWRUeXBlX2VuKSArIFwKLSAqICAgICAyICogTFZNX0hFQURST09NX01BWF9OQkFORFMgKiBzaXplb2YoTFZNX0hlYWRyb29tQmFuZERlZl90KSArIFwKLSAqICAgICBQU0FfSW5pdFBhcmFtcy5uQmFuZHMgKiBzaXplb2YoQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QpICsgXAotICogICAgIFBTQV9Jbml0UGFyYW1zLm5CYW5kcyAqIHNpemVvZihRUERfVGFwc190KQotICoKLSAqIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUY6Ci0gKiAgIFRvdGFsIE1lbW9yeSBzaXplOgotICogICAgIHNpemVvZihMVk1fVEVfQ29lZnNfdCkgKyBcCi0gKiAgICAgc2l6ZW9mKExWQ1NfQ29lZmZpY2llbnRfdCkgKyBcCi0gKiAgICAgc2l6ZW9mKExWREJFX0NvZWZfRkxPQVRfdCkgKyBcCi0gKiAgICAgc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSArIFwKLSAqICAgICBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpICsgXAotICogICAgIHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSArIFwKLSAqICAgICBQU0FfSW5pdFBhcmFtcy5uQmFuZHMgKiBzaXplb2YoQmlxdWFkX0luc3RhbmNlX3QpICsgXAotICogICAgIFBTQV9Jbml0UGFyYW1zLm5CYW5kcyAqIHNpemVvZihRUERfU3RhdGVfdCkKLSAqCi0gKiBMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUIChTY3JhdGNoKToKLSAqICAgVG90YWwgTWVtb3J5IFNpemU6Ci0gKiAgICAgQnVuZGxlU2NyYXRjaFNpemUgKyBcCi0gKiAgICAgTUFYX0lOVEVSTkFMX0JMT0NLU0laRSAqIHNpemVvZihMVk1fRkxPQVQpICsgXAotICogICAgIE1heFNjcmF0Y2hPZiAoQ1MsIEVRTkIsIERCRSwgUFNBKQotICoKLSAqICAgICBhKUJ1bmRsZVNjcmF0Y2hTaXplOgotICogICAgICAgICAzICogTFZNX01BWF9DSEFOTkVMUyBcCi0gKiAgICAgICAgICogKE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUgKyBJbnRlcm5hbEJsb2NrU2l6ZSkgKiBzaXplb2YoTFZNX0ZMT0FUKQotICogICAgICAgVGhpcyBNZW1vcnkgaXMgYWxsb2NhdGVkIG9ubHkgd2hlbiBCdWZmZXIgbW9kZSBpcyBMVk1fTUFOQUdFRF9CVUZGRVIuCi0gKiAgICAgYilNYXhTY3JhdGNoT2YgKENTLCBFUU5CLCBEQkUsIFBTQSkKLSAqICAgICAgIFRoaXMgTWVtb3J5IGlzIG5lZWRlZCBmb3Igc2NyYXRjaCB1c2FnZSBmb3IgQ1MsIEVRTkIsIERCRSwgUFNBLgotICogICAgICAgQ1MgICA9IChMVkNTX1NDUkFUQ0hCVUZGRVJTICogc2l6ZW9mKExWTV9GTE9BVCkKLSAqICAgICAgICAgICAgICAgKiBwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpCi0gKiAgICAgICBFUU5CID0gKExWRVFOQl9TQ1JBVENIQlVGRkVSUyAqIHNpemVvZihMVk1fRkxPQVQpCi0gKiAgICAgICAgICAgICAgICogcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKQotICogICAgICAgREJFICA9IChMVkRCRV9TQ1JBVENIQlVGRkVSU19JTlBMQUNFKnNpemVvZihMVk1fRkxPQVQpCi0gKiAgICAgICAgICAgICAgICogcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKQotICogICAgICAgUFNBICA9ICgyICogcEluaXRQYXJhbXMtPk1heElucHV0QmxvY2tTaXplICogc2l6ZW9mKExWTV9GTE9BVCkpCi0gKiAgICAgICAgICAgICAgb25lIE1heElucHV0QmxvY2tTaXplIGZvciBpbnB1dCBhbmQgYW5vdGhlciBmb3IgZmlsdGVyIG91dHB1dAotICogICAgIGMpTUFYX0lOVEVSTkFMX0JMT0NLU0laRQotICogICAgICAgVGhpcyBNZW1vcnkgaXMgbmVlZGVkIGZvciBQU0FJbnB1dCAtIFRlbXAgbWVtb3J5IHRvIHN0b3JlIG91dHB1dAotICogICAgICAgZnJvbSBNY1RvTW9ubyBibG9jayBhbmQgZ2l2ZW4gYXMgaW5wdXQgdG8gUFNBIGJsb2NrCi0gKi8KLQotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0TWVtb3J5VGFibGUoTFZNX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX01lbVRhYl90ICAgICAgICAgKnBNZW1vcnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JbnN0UGFyYW1zX3QgICAgICpwSW5zdFBhcmFtcykKLXsKLQotICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAqKWhJbnN0YW5jZTsKLSAgICBMVk1fVUlOVDMyICAgICAgICAgIEFsZ1NjcmF0Y2hTaXplOwotICAgIExWTV9VSU5UMzIgICAgICAgICAgQnVuZGxlU2NyYXRjaFNpemU7Ci0gICAgTFZNX1VJTlQxNiAgICAgICAgICBJbnRlcm5hbEJsb2NrU2l6ZTsKLSAgICBJTlNUX0FMTE9DICAgICAgICAgIEFsbG9jTWVtW0xWTV9OUl9NRU1PUllfUkVHSU9OU107Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICBpOwotCi0gICAgLyoKLSAgICAgKiBDaGVjayBwYXJhbWV0ZXJzCi0gICAgICovCi0gICAgaWYocE1lbW9yeVRhYmxlID09IExWTV9OVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIExWTV9OVUxMQUREUkVTUzsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJldHVybiBtZW1vcnkgdGFibGUgaWYgdGhlIGluc3RhbmNlIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZAotICAgICAqLwotICAgIGlmIChoSW5zdGFuY2UgIT0gTFZNX05VTEwpCi0gICAgewotICAgICAgIC8qIFJlYWQgYmFjayBtZW1vcnkgYWxsb2NhdGlvbiB0YWJsZSAqLwotICAgICAgICAqcE1lbW9yeVRhYmxlID0gcEluc3RhbmNlLT5NZW1vcnlUYWJsZTsKLSAgICAgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKLSAgICB9Ci0KLSAgICBpZihwSW5zdFBhcmFtcyA9PSBMVk1fTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBMVk1fTlVMTEFERFJFU1M7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgUG93ZXIgU3BlY3RydW0gQW5hbHlzZXIKLSAgICAgKi8KLSAgICBpZihwSW5zdFBhcmFtcy0+UFNBX0luY2x1ZGVkID4gTFZNX1BTQV9PTikKLSAgICB7Ci0gICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ2hlY2sgdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMKLSAgICAgKi8KLSAgICBpZiggKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlICE9IExWTV9NQU5BR0VEX0JVRkZFUlMpICYmIChwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSAhPSBMVk1fVU5NQU5BR0VEX0JVRkZFUlMpICkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwotICAgIH0KLQotICAgIC8qIE4tQmFuZCBFcXVhbGl6ZXIgKi8KLSAgICBpZiggcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgPiAzMiApCi0gICAgewotICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKLSAgICB9Ci0KLSAgICBpZihwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQotICAgIHsKLSAgICAgICAgaWYoIChwSW5zdFBhcmFtcy0+TWF4QmxvY2tTaXplIDwgTFZNX01JTl9NQVhCTE9DS1NJWkUgKSB8fCAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSA+IExWTV9NQU5BR0VEX01BWF9NQVhCTE9DS1NJWkUgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmKCAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSA8IExWTV9NSU5fTUFYQkxPQ0tTSVpFICkgfHwgKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUgPiBMVk1fVU5NQU5BR0VEX01BWF9NQVhCTE9DS1NJWkUpICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICogSW5pdGlhbGlzZSB0aGUgQWxsb2NNZW0gc3RydWN0dXJlcwotICAgICovCi0gICAgZm9yIChpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspCi0gICAgewotICAgICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW1baV0sIExWTV9OVUxMKTsKLSAgICB9Ci0gICAgSW50ZXJuYWxCbG9ja1NpemUgPSAoTFZNX1VJTlQxNikoKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUpICYgTUlOX0lOVEVSTkFMX0JMT0NLTUFTSyk7IC8qIEZvcmNlIHRvIGEgbXVsdGlwbGUgb2YgTUlOX0lOVEVSTkFMX0JMT0NLU0laRSAqLwotCi0gICAgaWYgKEludGVybmFsQmxvY2tTaXplIDwgTUlOX0lOVEVSTkFMX0JMT0NLU0laRSkKLSAgICB7Ci0gICAgICAgIEludGVybmFsQmxvY2tTaXplID0gTUlOX0lOVEVSTkFMX0JMT0NLU0laRTsKLSAgICB9Ci0KLSAgICAvKiBNYXhpbXVtIEludGVybmFsIEJsYWNrIFNpemUgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYW4gTUFYX0lOVEVSTkFMX0JMT0NLU0laRSovCi0gICAgaWYoSW50ZXJuYWxCbG9ja1NpemUgPiBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFKQotICAgIHsKLSAgICAgICAgSW50ZXJuYWxCbG9ja1NpemUgPSBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFOwotICAgIH0KLQotICAgIC8qCi0gICAgKiBCdW5kbGUgcmVxdWlyZW1lbnRzCi0gICAgKi8KLSAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKLSAgICAgICAgc2l6ZW9mKExWTV9JbnN0YW5jZV90KSk7Ci0KLSAgICAvKgotICAgICAqIFNldCB0aGUgYWxnb3JpdGhtIGFuZCBidW5kbGUgc2NyYXRjaCByZXF1aXJlbWVudHMKLSAgICAgKi8KLSAgICBBbGdTY3JhdGNoU2l6ZSAgICA9IDA7Ci0gICAgaWYgKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlID09IExWTV9NQU5BR0VEX0JVRkZFUlMpCi0gICAgewotICAgICAgICBCdW5kbGVTY3JhdGNoU2l6ZSA9IDMgKiBMVk1fTUFYX0NIQU5ORUxTIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChNSU5fSU5URVJOQUxfQkxPQ0tTSVpFICsgSW50ZXJuYWxCbG9ja1NpemUpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihMVk1fRkxPQVQpOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXSwgICAgICAgIC8qIFNjcmF0Y2ggYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVuZGxlU2NyYXRjaFNpemUpOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0J1ZmZlcl90KSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUcmVibGUgRW5oYW5jZW1lbnQgcmVxdWlyZW1lbnRzCi0gICAgICovCi0gICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX1RFX0RhdGFfdCkpOwotICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9URV9Db2Vmc190KSk7Ci0KLSAgICAvKgotICAgICAqIE4tQmFuZCBFcXVhbGl6ZXIgcmVxdWlyZW1lbnRzCi0gICAgICovCi0gICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sICAgICAgLyogTG9jYWwgc3RvcmFnZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWTV9FUU5CX0JhbmREZWZfdCkpKTsKLSAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwgICAgICAvKiBVc2VyIHN0b3JhZ2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kcyAqIHNpemVvZihMVk1fRVFOQl9CYW5kRGVmX3QpKSk7Ci0KLSAgICAvKgotICAgICAqIENvbmNlcnQgU291bmQgcmVxdWlyZW1lbnRzCi0gICAgICovCi0gICAgewotICAgICAgICBMVkNTX01lbVRhYl90ICAgICAgICAgICBDU19NZW1UYWI7Ci0gICAgICAgIExWQ1NfQ2FwYWJpbGl0aWVzX3QgICAgIENTX0NhcGFiaWxpdGllczsKLQotICAgICAgICAvKgotICAgICAgICAgKiBTZXQgdGhlIGNhcGFiaWxpdGllcwotICAgICAgICAgKi8KLSAgICAgICAgQ1NfQ2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSAgICAgPSBJbnRlcm5hbEJsb2NrU2l6ZTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMKLSAgICAgICAgICovCi0gICAgICAgIExWQ1NfTWVtb3J5KExWTV9OVUxMLAotICAgICAgICAgICAgICAgICAgICAmQ1NfTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAmQ1NfQ2FwYWJpbGl0aWVzKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBVcGRhdGUgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIHN0cnVjdHVyZXMKLSAgICAgICAgICovCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSk7Ci0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSk7Ci0gICAgICAgIGlmIChDU19NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemUgPiBBbGdTY3JhdGNoU2l6ZSkgQWxnU2NyYXRjaFNpemUgPSBDU19NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemU7Ci0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCByZXF1aXJlbWVudHMKLSAgICAgKi8KLSAgICB7Ci0gICAgICAgIExWREJFX01lbVRhYl90ICAgICAgICAgIERCRV9NZW1UYWI7Ci0gICAgICAgIExWREJFX0NhcGFiaWxpdGllc190ICAgIERCRV9DYXBhYmlsaXRpZXM7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2V0IHRoZSBjYXBhYmlsaXRpZXMKLSAgICAgICAgICovCi0gICAgICAgIERCRV9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZEQkVfQ0FQX0ZTXzgwMDAgfCBMVkRCRV9DQVBfRlNfMTEwMjUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMzIwMDAgfCBMVkRCRV9DQVBfRlNfNDQxMDAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU180ODAwMCB8IExWREJFX0NBUF9GU184ODIwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzk2MDAwIHwgTFZEQkVfQ0FQX0ZTXzE3NjQwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzE5MjAwMDsKLSAgICAgICAgREJFX0NhcGFiaWxpdGllcy5DZW50cmVGcmVxdWVuY3kgPSBMVkRCRV9DQVBfQ0VOVFJFXzU1SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzU1SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzY2SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzc4SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzkwSHo7Ci0gICAgICAgIERCRV9DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplICAgID0gSW50ZXJuYWxCbG9ja1NpemU7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogR2V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzCi0gICAgICAgICAqLwotICAgICAgICBMVkRCRV9NZW1vcnkoTFZNX05VTEwsCi0gICAgICAgICAgICAgICAgICAgICZEQkVfTWVtVGFiLAotCi0gICAgICAgICAgICAgICAgICAgICZEQkVfQ2FwYWJpbGl0aWVzKTsKLSAgICAgICAgLyoKLSAgICAgICAgICogVXBkYXRlIHRoZSBidW5kbGUgdGFibGUKLSAgICAgICAgICovCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCRV9NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUpOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkVfTWVtVGFiLlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKLSAgICAgICAgaWYgKERCRV9NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemUgPiBBbGdTY3JhdGNoU2l6ZSkgQWxnU2NyYXRjaFNpemUgPSBEQkVfTWVtVGFiLlJlZ2lvbltMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5TaXplOwotCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBOLUJhbmQgZXF1YWxpc2VyIHJlcXVpcmVtZW50cwotICAgICAqLwotICAgIHsKLSAgICAgICAgTFZFUU5CX01lbVRhYl90ICAgICAgICAgRVFOQl9NZW1UYWI7ICAgICAgICAgICAgLyogRm9yIE4tQmFuZCBFcXVhbGlzZXIgKi8KLSAgICAgICAgTFZFUU5CX0NhcGFiaWxpdGllc190ICAgRVFOQl9DYXBhYmlsaXRpZXM7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2V0IHRoZSBjYXBhYmlsaXRpZXMKLSAgICAgICAgICovCi0gICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzQ4MDAwIHwgTFZFUU5CX0NBUF9GU184ODIwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfOTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE3NjQwMCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMTkyMDAwOwotICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5Tb3VyY2VGb3JtYXQgPSBMVkVRTkJfQ0FQX1NURVJFTyB8IExWRVFOQl9DQVBfTU9OT0lOU1RFUkVPOwotICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgPSBJbnRlcm5hbEJsb2NrU2l6ZTsKLSAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuTWF4QmFuZHMgICAgID0gcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHM7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogR2V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzCi0gICAgICAgICAqLwotICAgICAgICBMVkVRTkJfTWVtb3J5KExWTV9OVUxMLAotICAgICAgICAgICAgICAgICAgICAgICZFUU5CX01lbVRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAmRVFOQl9DYXBhYmlsaXRpZXMpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFVwZGF0ZSB0aGUgYnVuZGxlIHRhYmxlCi0gICAgICAgICAqLwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSk7Ci0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVRTkJfTWVtVGFiLlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKLSAgICAgICAgaWYgKEVRTkJfTWVtVGFiLlJlZ2lvbltMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5TaXplID4gQWxnU2NyYXRjaFNpemUpIEFsZ1NjcmF0Y2hTaXplID0gRVFOQl9NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemU7Ci0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEhlYWRyb29tIG1hbmFnZW1lbnQgbWVtb3J5IGFsbG9jYXRpb24KLSAgICAgKi8KLSAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTICogc2l6ZW9mKExWTV9IZWFkcm9vbUJhbmREZWZfdCkpKTsKLSAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTICogc2l6ZW9mKExWTV9IZWFkcm9vbUJhbmREZWZfdCkpKTsKLQotICAgIC8qCi0gICAgICogU3BlY3RydW0gQW5hbHl6ZXIgbWVtb3J5IHJlcXVpcmVtZW50cwotICAgICAqLwotICAgIHsKLSAgICAgICAgcExWUFNBX0hhbmRsZV90ICAgICBoUFNBSW5zdCA9IExWTV9OVUxMOwotICAgICAgICBMVlBTQV9NZW1UYWJfdCAgICAgIFBTQV9NZW1UYWI7Ci0gICAgICAgIExWUFNBX0luaXRQYXJhbXNfdCAgUFNBX0luaXRQYXJhbXM7Ci0gICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgRmlsdGVyc1BhcmFtc1s5XTsKLSAgICAgICAgTFZQU0FfUkVUVVJOICAgICAgICBQU0FfU3RhdHVzOwotCi0gICAgICAgIGlmKHBJbnN0UGFyYW1zLT5QU0FfSW5jbHVkZWQgPT0gTFZNX1BTQV9PTikKLSAgICAgICAgewotICAgICAgICAgICAgUFNBX0luaXRQYXJhbXMuU3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24gICA9IChMVk1fVUlOVDE2KSA1MDA7Ci0gICAgICAgICAgICBQU0FfSW5pdFBhcmFtcy5NYXhJbnB1dEJsb2NrU2l6ZSAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDEwMDA7Ci0gICAgICAgICAgICBQU0FfSW5pdFBhcmFtcy5uQmFuZHMgICAgICAgICAgICAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDk7Ci0KLSAgICAgICAgICAgIFBTQV9Jbml0UGFyYW1zLnBGaWx0ZXJzUGFyYW1zID0gJkZpbHRlcnNQYXJhbXNbMF07Ci0gICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBQU0FfSW5pdFBhcmFtcy5uQmFuZHM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWx0ZXJzUGFyYW1zW2ldLkNlbnRlckZyZXF1ZW5jeSAgICA9IChMVk1fVUlOVDE2KSAxMDAwOwotICAgICAgICAgICAgICAgIEZpbHRlcnNQYXJhbXNbaV0uUUZhY3RvciAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDI1OwotICAgICAgICAgICAgICAgIEZpbHRlcnNQYXJhbXNbaV0uUG9zdEdhaW4gICAgICAgICAgID0gKExWTV9JTlQxNikgIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAqIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cwotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFBTQV9TdGF0dXMgPSBMVlBTQV9NZW1vcnkgKGhQU0FJbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQU0FfTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQU0FfSW5pdFBhcmFtcyk7Ci0KLSAgICAgICAgICAgIGlmIChQU0FfU3RhdHVzICE9IExWUFNBX09LKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybigoTFZNX1JldHVyblN0YXR1c19lbikgTFZNX0FMR09SSVRITVBTQSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAqIFVwZGF0ZSB0aGUgYnVuZGxlIHRhYmxlCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgLyogU2xvdyBEYXRhICovCi0gICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKLSAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUpOwotCi0gICAgICAgICAgICAvKiBGYXN0IERhdGEgKi8KLSAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAotICAgICAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSk7Ci0KLSAgICAgICAgICAgIC8qIEZhc3QgQ29lZiAqLwotICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCi0gICAgICAgICAgICAgICAgUFNBX01lbVRhYi5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKLQotICAgICAgICAgICAgLyogRmFzdCBUZW1wb3JhcnkgKi8KLSAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9URU1QT1JBUllfRkFTVF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUgKiBzaXplb2YoTFZNX0ZMT0FUKSk7Ci0KLSAgICAgICAgICAgIGlmIChQU0FfTWVtVGFiLlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLlNpemUgPiBBbGdTY3JhdGNoU2l6ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBbGdTY3JhdGNoU2l6ZSA9IFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uU2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogUmV0dXJuIHRoZSBtZW1vcnkgdGFibGUKLSAgICAgKi8KLSAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdKTsKLSAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEE7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0KLSAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdKTsKLSAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEE7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0gICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUgPCA0KQotICAgIHsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSA9IDA7Ci0gICAgfQotCi0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSk7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uVHlwZSAgICAgICAgID0gTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGOwotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplIDwgNCkKLSAgICB7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUgPSAwOwotICAgIH0KLQotICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLAotICAgICAgICAgICAgICAgICAgICAgICAgQWxnU2NyYXRjaFNpemUpOwotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemUgICAgICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdKTsKLSAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5UeXBlICAgICAgICAgICAgID0gTFZNX1RFTVBPUkFSWV9GQVNUOwotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyAgICAgPSBMVk1fTlVMTDsKLSAgICBpZiAocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uU2l6ZSA8IDQpCi0gICAgewotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5TaXplID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4oTFZNX1NVQ0NFU1MpOwotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX0dldEluc3RhbmNlSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNyZWF0ZSBhIGJ1bmRsZSBpbnN0YW5jZS4gSXQgcmV0dXJucyB0aGUgY3JlYXRlZCBpbnN0YW5jZSAgKi8KLS8qICBoYW5kbGUgdGhyb3VnaCBwaEluc3RhbmNlLiBBbGwgcGFyYW1ldGVycyBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHQsIGluYWN0aXZlIHN0YXRlLiAqLworLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjcmVhdGUgYSBidW5kbGUgaW5zdGFuY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQWxsIHBhcmFtZXRlcnMgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0LCBpbmFjdGl2ZSBzdGF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBJbnN0UGFyYW1zICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICovCisvKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdFBhcmFtcyAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIE9uZSBvciBtb3JlIG1lbW9yeSBoYXMgYSBOVUxMIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgTFZNX09VVE9GUkFOR0UgICAgICAgICAgV2hlbiBhbnkgb2YgdGhlIEluc3RhbmNlIHBhcmFtZXRlcnMgYXJlIG91dCBvZiByYW5nZSAgICAgICAgKi8KLS8qICBMVk1fTlVMTEFERFJFU1MgICAgICAgICBXaGVuIG9uZSBvZiBwaEluc3RhbmNlLCBwTWVtb3J5VGFibGUgb3IgcEluc3RQYXJhbXMgYXJlIE5VTEwqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAxLiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0SW5zdGFuY2VIYW5kbGUoTFZNX0hhbmRsZV90ICAgICAgICAgICAqcGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9NZW1UYWJfdCAgICAgICAgICAgKnBNZW1vcnlUYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JbnN0UGFyYW1zX3QgICAgICAgKnBJbnN0UGFyYW1zKQogewogCiAgICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgU3RhdHVzID0gTFZNX1NVQ0NFU1M7CiAgICAgTFZNX0luc3RhbmNlX3QgICAgICAgICAgKnBJbnN0YW5jZTsKLSAgICBJTlNUX0FMTE9DICAgICAgICAgICAgICBBbGxvY01lbVtMVk1fTlJfTUVNT1JZX1JFR0lPTlNdOwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIGk7CiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgSW50ZXJuYWxCbG9ja1NpemU7CiAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQnVuZGxlU2NyYXRjaFNpemU7CkBAIC01MDgsMjQgKzYxLDEyIEBACiAgICAgLyoKICAgICAgKiBDaGVjayB2YWxpZCBwb2ludHMgaGF2ZSBiZWVuIGdpdmVuCiAgICAgICovCi0gICAgaWYgKChwaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocE1lbW9yeVRhYmxlID09IExWTV9OVUxMKSB8fCAocEluc3RQYXJhbXMgPT0gTFZNX05VTEwpKQorICAgIGlmICgocGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBJbnN0UGFyYW1zID09IExWTV9OVUxMKSkKICAgICB7CiAgICAgICAgIHJldHVybiAoTFZNX05VTExBRERSRVNTKTsKICAgICB9CiAKICAgICAvKgotICAgICAqIENoZWNrIHRoZSBtZW1vcnkgdGFibGUgZm9yIE5VTEwgcG9pbnRlcnMKLSAgICAgKi8KLSAgICBmb3IgKGk9MDsgaTxMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmICgocE1lbW9yeVRhYmxlLT5SZWdpb25baV0uU2l6ZSAhPSAwKSAmJgotICAgICAgICAgICAgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW2ldLnBCYXNlQWRkcmVzcz09TFZNX05VTEwpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4oTFZNX05VTExBRERSRVNTKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCiAgICAgICogQ2hlY2sgdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMKICAgICAgKi8KICAgICBpZiggKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlICE9IExWTV9NQU5BR0VEX0JVRkZFUlMpICYmIChwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSAhPSBMVk1fVU5NQU5BR0VEX0JVRkZFUlMpICkKQEAgLTU1OSwyOSArMTAwLDE5IEBACiAgICAgfQogCiAgICAgLyoKLSAgICAgKiBJbml0aWFsaXNlIHRoZSBBbGxvY01lbSBzdHJ1Y3R1cmVzCisgICAgICogQ3JlYXRlIHRoZSBpbnN0YW5jZSBoYW5kbGUKICAgICAgKi8KLSAgICBmb3IgKGk9MDsgaTxMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKykKKyAgICAqcGhJbnN0YW5jZSAgPSAoTFZNX0hhbmRsZV90KWNhbGxvYygxLCBzaXplb2YoKnBJbnN0YW5jZSkpOworICAgIGlmICgqcGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkKICAgICB7Ci0gICAgICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbVtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKKyAgICAgICAgcmV0dXJuIExWTV9OVUxMQUREUkVTUzsKICAgICB9CisgICAgcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90ICAqKSpwaEluc3RhbmNlOworCisgICAgcEluc3RhbmNlLT5JbnN0UGFyYW1zID0gKnBJbnN0UGFyYW1zOwogCiAgICAgLyoKLSAgICAgKiBTZXQgdGhlIGluc3RhbmNlIGhhbmRsZQotICAgICAqLwotICAgICpwaEluc3RhbmNlICA9IChMVk1fSGFuZGxlX3QpSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fSW5zdGFuY2VfdCkpOwotICAgIHBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICAqKSpwaEluc3RhbmNlOwotCi0gICAgLyoKLSAgICAgKiBTYXZlIHRoZSBtZW1vcnkgdGFibGUsIHBhcmFtZXRlcnMgYW5kIGNhcGFiaWxpdGllcwotICAgICAqLwotICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUgICAgPSAqcE1lbW9yeVRhYmxlOwotICAgIHBJbnN0YW5jZS0+SW5zdFBhcmFtcyAgICAgPSAqcEluc3RQYXJhbXM7Ci0KLSAgICAvKgotICAgICAqIFNldCB0aGUgYnVuZGxlIHNjcmF0Y2ggbWVtb3J5IGFuZCBpbml0aWFsc2UgdGhlIGJ1ZmZlciBtYW5hZ2VtZW50CisgICAgICogQ3JlYXRlIHRoZSBidW5kbGUgc2NyYXRjaCBtZW1vcnkgYW5kIGluaXRpYWxzZSB0aGUgYnVmZmVyIG1hbmFnZW1lbnQKICAgICAgKi8KICAgICBJbnRlcm5hbEJsb2NrU2l6ZSA9IChMVk1fVUlOVDE2KSgocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSkgJiBNSU5fSU5URVJOQUxfQkxPQ0tNQVNLKTsgLyogRm9yY2UgdG8gYSBtdWx0aXBsZSBvZiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFICovCiAgICAgaWYgKEludGVybmFsQmxvY2tTaXplIDwgTUlOX0lOVEVSTkFMX0JMT0NLU0laRSkKQEAgLTYwMCwyMyArMTMxLDMxIEBACiAgICAgICogQ29tbW9uIHNldHRpbmdzIGZvciBtYW5hZ2VkIGFuZCB1bm1hbmFnZWQgYnVmZmVycwogICAgICAqLwogICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IDA7ICAgICAgICAgICAgICAgIC8qIE5vIHNhbXBsZXMgbGVmdCB0byBwcm9jZXNzICovCisgICAgQnVuZGxlU2NyYXRjaFNpemUgPSAoTFZNX0lOVDMyKQorICAgICAgICAgICAgICAgICAgICAgICAgKDMgKiBMVk1fTUFYX0NIQU5ORUxTIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIChNSU5fSU5URVJOQUxfQkxPQ0tTSVpFICsgSW50ZXJuYWxCbG9ja1NpemUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICBwSW5zdGFuY2UtPnBTY3JhdGNoID0gY2FsbG9jKDEsIEJ1bmRsZVNjcmF0Y2hTaXplKTsKKyAgICBpZiAocEluc3RhbmNlLT5wU2NyYXRjaCA9PSBMVk1fTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBMVk1fTlVMTEFERFJFU1M7CisgICAgfQorCiAgICAgaWYgKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlID09IExWTV9NQU5BR0VEX0JVRkZFUlMpCiAgICAgewogICAgICAgICAvKgogICAgICAgICAgKiBNYW5hZ2VkIGJ1ZmZlcnMgcmVxdWlyZWQKICAgICAgICAgICovCiAgICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQgPSAoTFZNX0J1ZmZlcl90ICopCi0gICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9CdWZmZXJfdCkpOwotICAgICAgICBCdW5kbGVTY3JhdGNoU2l6ZSA9IChMVk1fSU5UMzIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMgKiBMVk1fTUFYX0NIQU5ORUxTIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoTUlOX0lOVEVSTkFMX0JMT0NLU0laRSArIEludGVybmFsQmxvY2tTaXplKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKExWTV9GTE9BVCkpOwotICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5wU2NyYXRjaCA9IChMVk1fRkxPQVQgKikKLSAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLCAvKiBTY3JhdGNoIDEgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDMyKUJ1bmRsZVNjcmF0Y2hTaXplKTsKLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaW5wdXQgZGVsYXkgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgIGNhbGxvYygxLCBzaXplb2YoKihwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50KSkpOworICAgICAgICBpZiAocEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudCA9PSBMVk1fTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIExWTV9OVUxMQUREUkVTUzsKKyAgICAgICAgfQorCisgICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPnBTY3JhdGNoID0gKExWTV9GTE9BVCAqKXBJbnN0YW5jZS0+cFNjcmF0Y2g7CisKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIC8qIENsZWFyIHRoZSBpbnB1dCBkZWxheSBidWZmZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikmcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+SW5EZWxheUJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKExWTV9NQVhfQ0hBTk5FTFMgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFKSk7CiAgICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPkluRGVsYXlTYW1wbGVzID0gTUlOX0lOVEVSTkFMX0JMT0NLU0laRTsgLyogU2V0IHRoZSBudW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLwpAQCAtNjQyLDIwICsxODEsMjEgQEAKICAgICAvKgogICAgICAqIERDIHJlbW92YWwgZmlsdGVyCiAgICAgICovCi0jaWZkZWYgU1VQUE9SVF9NQwogICAgIERDX01jX0QxNl9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlKTsKLSNlbHNlCi0gICAgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UpOwotI2VuZGlmCiAKICAgICAvKgogICAgICAqIFRyZWJsZSBFbmhhbmNlbWVudAogICAgICAqLwotICAgIHBJbnN0YW5jZS0+cFRFX1RhcHMgID0gKExWTV9URV9EYXRhX3QgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX1RFX0RhdGFfdCkpOwotCi0gICAgcEluc3RhbmNlLT5wVEVfU3RhdGUgPSAoTFZNX1RFX0NvZWZzX3QgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9URV9Db2Vmc190KSk7CisgICAgcEluc3RhbmNlLT5wVEVfVGFwcyAgPSAoTFZNX1RFX0RhdGFfdCAqKWNhbGxvYygxLCBzaXplb2YoKihwSW5zdGFuY2UtPnBURV9UYXBzKSkpOworICAgIGlmIChwSW5zdGFuY2UtPnBURV9UYXBzID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWTV9OVUxMQUREUkVTUzsKKyAgICB9CisgICAgcEluc3RhbmNlLT5wVEVfU3RhdGUgPSAoTFZNX1RFX0NvZWZzX3QgKiljYWxsb2MoMSwgc2l6ZW9mKCoocEluc3RhbmNlLT5wVEVfU3RhdGUpKSk7CisgICAgaWYgKHBJbnN0YW5jZS0+cFRFX1N0YXRlID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWTV9OVUxMQUREUkVTUzsKKyAgICB9CiAgICAgcEluc3RhbmNlLT5QYXJhbXMuVEVfT3BlcmF0aW5nTW9kZSA9IExWTV9URV9PRkY7CiAgICAgcEluc3RhbmNlLT5QYXJhbXMuVEVfRWZmZWN0TGV2ZWwgICA9IDA7CiAgICAgcEluc3RhbmNlLT5URV9BY3RpdmUgICAgICAgICAgICAgICA9IExWTV9GQUxTRTsKQEAgLTY5OSwyMSArMjM5LDI2IEBACiAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLExWTV9WQ19NSVhFUl9USU1FLExWTV9GU184MDAwLDIpOwogCiAgICAgLyoKLSAgICAgKiBTZXQgdGhlIGRlZmF1bHQgRVFOQiBwcmUtZ2FpbiBhbmQgcG9pbnRlciB0byB0aGUgYmFuZCBkZWZpbml0aW9ucworICAgICAqIENyZWF0ZSB0aGUgZGVmYXVsdCBFUU5CIHByZS1nYWluIGFuZCBwb2ludGVyIHRvIHRoZSBiYW5kIGRlZmluaXRpb25zCiAgICAgICovCi0gICAgcEluc3RhbmNlLT5wRVFOQl9CYW5kRGVmcyA9Ci0gICAgICAgIChMVk1fRVFOQl9CYW5kRGVmX3QgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWTV9FUU5CX0JhbmREZWZfdCkpKTsKLSAgICBwSW5zdGFuY2UtPnBFUU5CX1VzZXJEZWZzID0KLSAgICAgICAgKExWTV9FUU5CX0JhbmREZWZfdCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoTFZNX0VRTkJfQmFuZERlZl90KSkpOworICAgIHBJbnN0YW5jZS0+cEVRTkJfQmFuZERlZnMgPSAoTFZNX0VRTkJfQmFuZERlZl90ICopCisgICAgICAgIGNhbGxvYyhwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kcywgc2l6ZW9mKCoocEluc3RhbmNlLT5wRVFOQl9CYW5kRGVmcykpKTsKKyAgICBpZiAocEluc3RhbmNlLT5wRVFOQl9CYW5kRGVmcyA9PSBMVk1fTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBMVk1fTlVMTEFERFJFU1M7CisgICAgfQorICAgIHBJbnN0YW5jZS0+cEVRTkJfVXNlckRlZnMgPSAoTFZNX0VRTkJfQmFuZERlZl90ICopCisgICAgICAgICBjYWxsb2MocEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMsIHNpemVvZigqKHBJbnN0YW5jZS0+cEVRTkJfVXNlckRlZnMpKSk7CisgICAgaWYgKHBJbnN0YW5jZS0+cEVRTkJfVXNlckRlZnMgPT0gTFZNX05VTEwpCisgICAgeworICAgICAgICByZXR1cm4gTFZNX05VTExBRERSRVNTOworICAgIH0KIAogICAgIC8qCiAgICAgICogSW5pdGlhbGlzZSB0aGUgQ29uY2VydCBTb3VuZCBtb2R1bGUKICAgICAgKi8KICAgICB7CiAgICAgICAgIExWQ1NfSGFuZGxlX3QgICAgICAgICAgIGhDU0luc3RhbmNlOyAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KLSAgICAgICAgTFZDU19NZW1UYWJfdCAgICAgICAgICAgQ1NfTWVtVGFiOyAgICAgICAgICAgICAgICAgIC8qIE1lbW9yeSB0YWJsZSAqLwogICAgICAgICBMVkNTX0NhcGFiaWxpdGllc190ICAgICBDU19DYXBhYmlsaXRpZXM7ICAgICAgICAgICAgLyogSW5pdGlhbCBjYXBhYmlsaXRpZXMgKi8KICAgICAgICAgTFZDU19SZXR1cm5TdGF0dXNfZW4gICAgTFZDU19TdGF0dXM7ICAgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAKQEAgLTczMywyNiArMjc4LDEyIEBACiAgICAgICAgIENTX0NhcGFiaWxpdGllcy5wQnVuZGxlSW5zdGFuY2UgPSAodm9pZCopcEluc3RhbmNlOwogCiAgICAgICAgIC8qCi0gICAgICAgICAqIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgdGhlbiBzZXQgdGhlIGFkZHJlc3MgcG9pbnRlcnMsIGZvcmNpbmcgYWxpZ25tZW50Ci0gICAgICAgICAqLwotICAgICAgICBMVkNTX1N0YXR1cyA9IExWQ1NfTWVtb3J5KExWTV9OVUxMLCAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ1NfTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDU19DYXBhYmlsaXRpZXMpOwotICAgICAgICBDU19NZW1UYWIuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5wQmFzZUFkZHJlc3MgPSAmcEluc3RhbmNlLT5DU19JbnN0YW5jZTsKLSAgICAgICAgQ1NfTWVtVGFiLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTX01lbVRhYi5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUpOwotICAgICAgICBDU19NZW1UYWIuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NfTWVtVGFiLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSk7Ci0gICAgICAgIENTX01lbVRhYi5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyAgICAgICA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLQotICAgICAgICAvKgogICAgICAgICAgKiBJbml0aWFsaXNlIHRoZSBDb25jZXJ0IFNvdW5kIGluc3RhbmNlIGFuZCBzYXZlIHRoZSBpbnN0YW5jZSBoYW5kbGUKICAgICAgICAgICovCiAgICAgICAgIGhDU0luc3RhbmNlID0gTFZNX05VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0byBOVUxMIHRvIHJldHVybiBoYW5kbGUgKi8KLSAgICAgICAgTFZDU19TdGF0dXMgPSBMVkNTX0luaXQoJmhDU0luc3RhbmNlLCAgICAgICAgICAgICAgLyogSW5pdGlhaWxzZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ1NfTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ1NfQ2FwYWJpbGl0aWVzKTsKKyAgICAgICAgTFZDU19TdGF0dXMgPSBMVkNTX0luaXQoJmhDU0luc3RhbmNlLCAgICAgICAgICAgICAgLyogQ3JlYXRlIGFuZCBpbml0aWFpbHNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDU19DYXBhYmlsaXRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFNjcmF0Y2gpOwogICAgICAgICBpZiAoTFZDU19TdGF0dXMgIT0gTFZDU19TVUNDRVNTKSByZXR1cm4oKExWTV9SZXR1cm5TdGF0dXNfZW4pTFZDU19TdGF0dXMpOwogICAgICAgICBwSW5zdGFuY2UtPmhDU0luc3RhbmNlID0gaENTSW5zdGFuY2U7ICAgICAgICAgICAgICAvKiBTYXZlIHRoZSBpbnN0YW5jZSBoYW5kbGUgKi8KIApAQCAtNzYzLDcgKzI5NCw2IEBACiAgICAgICovCiAgICAgewogICAgICAgICBMVkRCRV9IYW5kbGVfdCAgICAgICAgICBoREJFSW5zdGFuY2U7ICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCi0gICAgICAgIExWREJFX01lbVRhYl90ICAgICAgICAgIERCRV9NZW1UYWI7ICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgdGFibGUgKi8KICAgICAgICAgTFZEQkVfQ2FwYWJpbGl0aWVzX3QgICAgREJFX0NhcGFiaWxpdGllczsgICAgICAgICAgIC8qIEluaXRpYWwgY2FwYWJpbGl0aWVzICovCiAgICAgICAgIExWREJFX1JldHVyblN0YXR1c19lbiAgIExWREJFX1N0YXR1czsgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwogCkBAIC03ODcsMzAgKzMxNywxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU180ODAwMCB8IExWREJFX0NBUF9GU184ODIwMCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzk2MDAwIHwgTFZEQkVfQ0FQX0ZTXzE3NjQwMCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzE5MjAwMDsKLSAgICAgICAgREJFX0NhcGFiaWxpdGllcy5DZW50cmVGcmVxdWVuY3kgPSBMVkRCRV9DQVBfQ0VOVFJFXzU1SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzU1SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzY2SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzc4SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzkwSHo7Ci0gICAgICAgIERCRV9DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplICAgID0gKExWTV9VSU5UMTYpSW50ZXJuYWxCbG9ja1NpemU7CiAKLSAgICAgICAgLyoKLSAgICAgICAgICogR2V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCB0aGVuIHNldCB0aGUgYWRkcmVzcyBwb2ludGVycwotICAgICAgICAgKi8KLSAgICAgICAgTFZEQkVfU3RhdHVzID0gTFZEQkVfTWVtb3J5KExWTV9OVUxMLCAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRCRV9NZW1UYWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmREJFX0NhcGFiaWxpdGllcyk7Ci0gICAgICAgIERCRV9NZW1UYWIuUmVnaW9uW0xWREJFX01FTVJFR0lPTl9JTlNUQU5DRV0ucEJhc2VBZGRyZXNzICAgICAgICA9ICZwSW5zdGFuY2UtPkRCRV9JbnN0YW5jZTsKLSAgICAgICAgREJFX01lbVRhYi5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCRV9NZW1UYWIuUmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlNpemUpOwotICAgICAgICBEQkVfTWVtVGFiLlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJFX01lbVRhYi5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSk7Ci0gICAgICAgIERCRV9NZW1UYWIuUmVnaW9uW0xWREJFX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3MgICAgICAgICA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICAgICAgREJFX0NhcGFiaWxpdGllcy5DZW50cmVGcmVxdWVuY3kgPSBMVkRCRV9DQVBfQ0VOVFJFXzU1SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzU1SHogfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfQ0VOVFJFXzY2SHogfCBMVkRCRV9DQVBfQ0VOVFJFXzc4SHogfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfQ0VOVFJFXzkwSHo7CisgICAgICAgIERCRV9DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplICAgID0gKExWTV9VSU5UMTYpSW50ZXJuYWxCbG9ja1NpemU7CiAKICAgICAgICAgLyoKICAgICAgICAgICogSW5pdGlhbGlzZSB0aGUgRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IGluc3RhbmNlIGFuZCBzYXZlIHRoZSBpbnN0YW5jZSBoYW5kbGUKICAgICAgICAgICovCiAgICAgICAgIGhEQkVJbnN0YW5jZSA9IExWTV9OVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdG8gTlVMTCB0byByZXR1cm4gaGFuZGxlICovCi0gICAgICAgIExWREJFX1N0YXR1cyA9IExWREJFX0luaXQoJmhEQkVJbnN0YW5jZSwgICAgICAgICAgICAvKiBJbml0aWFpbHNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRCRV9NZW1UYWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRCRV9DYXBhYmlsaXRpZXMpOworICAgICAgICBMVkRCRV9TdGF0dXMgPSBMVkRCRV9Jbml0KCZoREJFSW5zdGFuY2UsICAgICAgICAgICAgLyogQ3JlYXRlIGFuZCBpbml0aWFpbHNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRCRV9DYXBhYmlsaXRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wU2NyYXRjaCk7CiAgICAgICAgIGlmIChMVkRCRV9TdGF0dXMgIT0gTFZEQkVfU1VDQ0VTUykgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKUxWREJFX1N0YXR1cyk7CiAgICAgICAgIHBJbnN0YW5jZS0+aERCRUluc3RhbmNlID0gaERCRUluc3RhbmNlOyAgICAgICAgICAgICAvKiBTYXZlIHRoZSBpbnN0YW5jZSBoYW5kbGUgKi8KICAgICB9CkBAIC04MjAsNyArMzM5LDYgQEAKICAgICAgKi8KICAgICB7CiAgICAgICAgIExWRVFOQl9IYW5kbGVfdCAgICAgICAgICBoRVFOQkluc3RhbmNlOyAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KLSAgICAgICAgTFZFUU5CX01lbVRhYl90ICAgICAgICAgIEVRTkJfTWVtVGFiOyAgICAgICAgICAgICAgIC8qIE1lbW9yeSB0YWJsZSAqLwogICAgICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgRVFOQl9DYXBhYmlsaXRpZXM7ICAgICAgICAgLyogSW5pdGlhbCBjYXBhYmlsaXRpZXMgKi8KICAgICAgICAgTFZFUU5CX1JldHVyblN0YXR1c19lbiAgIExWRVFOQl9TdGF0dXM7ICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAKQEAgLTg0Miw2ICszNjAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzQ4MDAwIHwgTFZFUU5CX0NBUF9GU184ODIwMCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfOTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE3NjQwMCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMTkyMDAwOworCiAgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSAgICA9IChMVk1fVUlOVDE2KUludGVybmFsQmxvY2tTaXplOwogICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5NYXhCYW5kcyAgICAgICAgPSBwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kczsKICAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU291cmNlRm9ybWF0ICAgID0gTFZFUU5CX0NBUF9TVEVSRU8gfCBMVkVRTkJfQ0FQX01PTk9JTlNURVJFTzsKQEAgLTg0OSwyNiArMzY4LDEyIEBACiAgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLnBCdW5kbGVJbnN0YW5jZSAgPSAodm9pZCopcEluc3RhbmNlOwogCiAgICAgICAgIC8qCi0gICAgICAgICAqIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgdGhlbiBzZXQgdGhlIGFkZHJlc3MgcG9pbnRlcnMsIGZvcmNpbmcgYWxpZ25tZW50Ci0gICAgICAgICAqLwotICAgICAgICBMVkVRTkJfU3RhdHVzID0gTFZFUU5CX01lbW9yeShMVk1fTlVMTCwgICAgICAgICAgICAgLyogR2V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFUU5CX01lbVRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkVRTkJfQ2FwYWJpbGl0aWVzKTsKLSAgICAgICAgRVFOQl9NZW1UYWIuUmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fSU5TVEFOQ0VdLnBCYXNlQWRkcmVzcyAgICAgICAgPSAmcEluc3RhbmNlLT5FUU5CX0luc3RhbmNlOwotICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLnBCYXNlQWRkcmVzcyA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVRTkJfTWVtVGFiLlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uU2l6ZSk7Ci0gICAgICAgIEVRTkJfTWVtVGFiLlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVFOQl9NZW1UYWIuUmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5TaXplKTsKLSAgICAgICAgRVFOQl9NZW1UYWIuUmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzICAgICAgICAgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLQotICAgICAgICAvKgogICAgICAgICAgKiBJbml0aWFsaXNlIHRoZSBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQgaW5zdGFuY2UgYW5kIHNhdmUgdGhlIGluc3RhbmNlIGhhbmRsZQogICAgICAgICAgKi8KICAgICAgICAgaEVRTkJJbnN0YW5jZSA9IExWTV9OVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0byBOVUxMIHRvIHJldHVybiBoYW5kbGUgKi8KLSAgICAgICAgTFZFUU5CX1N0YXR1cyA9IExWRVFOQl9Jbml0KCZoRVFOQkluc3RhbmNlLCAgICAgICAgIC8qIEluaXRpYWlsc2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFUU5CX01lbVRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFUU5CX0NhcGFiaWxpdGllcyk7CisgICAgICAgIExWRVFOQl9TdGF0dXMgPSBMVkVRTkJfSW5pdCgmaEVRTkJJbnN0YW5jZSwgICAgICAgICAvKiBDcmVhdGUgYW5kIGluaXRpYWlsc2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFUU5CX0NhcGFiaWxpdGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFNjcmF0Y2gpOwogICAgICAgICBpZiAoTFZFUU5CX1N0YXR1cyAhPSBMVkVRTkJfU1VDQ0VTUykgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKUxWRVFOQl9TdGF0dXMpOwogICAgICAgICBwSW5zdGFuY2UtPmhFUU5CSW5zdGFuY2UgPSBoRVFOQkluc3RhbmNlOyAgICAgICAgICAgLyogU2F2ZSB0aGUgaW5zdGFuY2UgaGFuZGxlICovCiAgICAgfQpAQCAtODc4LDExICszODMsMTcgQEAKICAgICAgKi8KICAgICB7CiAgICAgICAgIHBJbnN0YW5jZS0+cEhlYWRyb29tX0JhbmREZWZzID0gKExWTV9IZWFkcm9vbUJhbmREZWZfdCAqKQotICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSEVBRFJPT01fTUFYX05CQU5EUyAqIHNpemVvZihMVk1fSGVhZHJvb21CYW5kRGVmX3QpKSk7CisgICAgICAgICAgICBjYWxsb2MoTFZNX0hFQURST09NX01BWF9OQkFORFMsIHNpemVvZigqKHBJbnN0YW5jZS0+cEhlYWRyb29tX0JhbmREZWZzKSkpOworICAgICAgICBpZiAocEluc3RhbmNlLT5wSGVhZHJvb21fQmFuZERlZnMgPT0gTFZNX05VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBMVk1fTlVMTEFERFJFU1M7CisgICAgICAgIH0KICAgICAgICAgcEluc3RhbmNlLT5wSGVhZHJvb21fVXNlckRlZnMgPSAoTFZNX0hlYWRyb29tQmFuZERlZl90ICopCi0gICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTICogc2l6ZW9mKExWTV9IZWFkcm9vbUJhbmREZWZfdCkpKTsKKyAgICAgICAgICAgIGNhbGxvYyhMVk1fSEVBRFJPT01fTUFYX05CQU5EUywgc2l6ZW9mKCoocEluc3RhbmNlLT5wSGVhZHJvb21fVXNlckRlZnMpKSk7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPnBIZWFkcm9vbV9Vc2VyRGVmcyA9PSBMVk1fTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIExWTV9OVUxMQUREUkVTUzsKKyAgICAgICAgfQogCiAgICAgICAgIC8qIEhlYWRyb29tIG1hbmFnZW1lbnQgcGFyYW1ldGVycyBpbml0aWFsaXNhdGlvbiAqLwogICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLk5IZWFkcm9vbUJhbmRzID0gMjsKQEAgLTkwMyw3ICs0MTQsNiBAQAogICAgICAqLwogICAgIHsKICAgICAgICAgcExWUFNBX0hhbmRsZV90ICAgICBoUFNBSW5zdGFuY2UgPSBMVk1fTlVMTDsgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KLSAgICAgICAgTFZQU0FfTWVtVGFiX3QgICAgICBQU0FfTWVtVGFiOwogICAgICAgICBMVlBTQV9SRVRVUk4gICAgICAgIFBTQV9TdGF0dXM7ICAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwogICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90IEZpbHRlcnNQYXJhbXNbOV07CiAKQEAgLTkyMCw0MSArNDMwLDE4IEBACiAgICAgICAgICAgICAgICAgRmlsdGVyc1BhcmFtc1tpXS5Qb3N0R2FpbiAgICAgICAgICAgPSAoTFZNX0lOVDE2KSAgMDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLypHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kIHRoZW4gc2V0IHRoZSBhZGRyZXNzIHBvaW50ZXJzKi8KLSAgICAgICAgICAgIFBTQV9TdGF0dXMgPSBMVlBTQV9NZW1vcnkgKGhQU0FJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQU0FfTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+UFNBX0luaXRQYXJhbXMpOwotCi0gICAgICAgICAgICBpZiAoUFNBX1N0YXR1cyAhPSBMVlBTQV9PSykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4oKExWTV9SZXR1cm5TdGF0dXNfZW4pIExWTV9BTEdPUklUSE1QU0EpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBTbG93IERhdGEgKi8KLSAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKLSAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUpOwotCi0gICAgICAgICAgICAvKiBGYXN0IERhdGEgKi8KLSAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUpOwotCi0gICAgICAgICAgICAvKiBGYXN0IENvZWYgKi8KLSAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSwKLSAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUpOwotCi0gICAgICAgICAgICAvKiBGYXN0IFRlbXBvcmFyeSAqLwotICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQgPSAoTFZNX0ZMT0FUICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX1RFTVBPUkFSWV9GQVNUXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQzMikgTUFYX0lOVEVSTkFMX0JMT0NLU0laRSAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7Ci0gICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyAgICAgICA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sMCk7Ci0KICAgICAgICAgICAgIC8qSW5pdGlhbGlzZSBQU0EgaW5zdGFuY2UgYW5kIHNhdmUgdGhlIGluc3RhbmNlIGhhbmRsZSovCiAgICAgICAgICAgICBwSW5zdGFuY2UtPlBTQV9Db250cm9sUGFyYW1zLkZzID0gTFZNX0ZTXzQ4MDAwOwogICAgICAgICAgICAgcEluc3RhbmNlLT5QU0FfQ29udHJvbFBhcmFtcy5MZXZlbERldGVjdGlvblNwZWVkICA9IExWUFNBX1NQRUVEX01FRElVTTsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0ID0gKExWTV9GTE9BVCAqKWNhbGxvYyhNQVhfSU5URVJOQUxfQkxPQ0tTSVpFLCBzaXplb2YoTFZNX0ZMT0FUKSk7CisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5wUFNBSW5wdXQgPT0gTFZNX05VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIExWTV9OVUxMQUREUkVTUzsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIFBTQV9TdGF0dXMgPSBMVlBTQV9Jbml0ICgmaFBTQUluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+UFNBX0luaXRQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5QU0FfQ29udHJvbFBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQU0FfTWVtVGFiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFNjcmF0Y2gpOwogCiAgICAgICAgICAgICBpZiAoUFNBX1N0YXR1cyAhPSBMVlBTQV9PSykKICAgICAgICAgICAgIHsKQEAgLTEwMDcsNiArNDk0LDExMSBAQAogCiAgICAgcmV0dXJuKFN0YXR1cyk7CiB9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9EZWxJbnN0YW5jZUhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjcmVhdGUgYSBidW5kbGUgaW5zdGFuY2UuIEl0IHJldHVybnMgdGhlIGNyZWF0ZWQgaW5zdGFuY2UgICovCisvKiAgaGFuZGxlIHRocm91Z2ggcGhJbnN0YW5jZS4gQWxsIHBhcmFtZXRlcnMgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0LCBpbmFjdGl2ZSBzdGF0ZS4gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIExWTV9EZWxJbnN0YW5jZUhhbmRsZShMVk1fSGFuZGxlX3QgKnBoSW5zdGFuY2UpCit7CisgICAgTFZNX0luc3RhbmNlX3QgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAqKSpwaEluc3RhbmNlOworCisgICAgaWYgKHBJbnN0YW5jZS0+cFNjcmF0Y2ggIT0gTFZNX05VTEwpIHsKKyAgICAgICAgZnJlZShwSW5zdGFuY2UtPnBTY3JhdGNoKTsKKyAgICAgICAgcEluc3RhbmNlLT5wU2NyYXRjaCA9IExWTV9OVUxMOworICAgIH0KKworICAgIGlmIChwSW5zdGFuY2UtPkluc3RQYXJhbXMuQnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKSB7CisgICAgICAgIC8qCisgICAgICAgICAqIE1hbmFnZWQgYnVmZmVycyByZXF1aXJlZAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgICAgIGZyZWUocEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudCk7CisgICAgICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50ID0gTFZNX05VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFRyZWJsZSBFbmhhbmNlbWVudAorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPnBURV9UYXBzICE9IExWTV9OVUxMKSB7CisgICAgICAgIGZyZWUocEluc3RhbmNlLT5wVEVfVGFwcyk7CisgICAgICAgIHBJbnN0YW5jZS0+cFRFX1RhcHMgPSBMVk1fTlVMTDsKKyAgICB9CisgICAgaWYgKHBJbnN0YW5jZS0+cFRFX1N0YXRlICE9IExWTV9OVUxMKSB7CisgICAgICAgIGZyZWUocEluc3RhbmNlLT5wVEVfU3RhdGUpOworICAgICAgICBwSW5zdGFuY2UtPnBURV9TdGF0ZSA9IExWTV9OVUxMOworICAgIH0KKworICAgIC8qCisgICAgICogRnJlZSB0aGUgZGVmYXVsdCBFUU5CIHByZS1nYWluIGFuZCBwb2ludGVyIHRvIHRoZSBiYW5kIGRlZmluaXRpb25zCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+cEVRTkJfQmFuZERlZnMgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgZnJlZShwSW5zdGFuY2UtPnBFUU5CX0JhbmREZWZzKTsKKyAgICAgICAgcEluc3RhbmNlLT5wRVFOQl9CYW5kRGVmcyA9IExWTV9OVUxMOworICAgIH0KKyAgICBpZiAocEluc3RhbmNlLT5wRVFOQl9Vc2VyRGVmcyAhPSBMVk1fTlVMTCkgeworICAgICAgICBmcmVlKHBJbnN0YW5jZS0+cEVRTkJfVXNlckRlZnMpOworICAgICAgICBwSW5zdGFuY2UtPnBFUU5CX1VzZXJEZWZzID0gTFZNX05VTEw7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBEZS1pbml0aWFsaXNlIHRoZSBDb25jZXJ0IFNvdW5kIG1vZHVsZQorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPmhDU0luc3RhbmNlICE9IExWTV9OVUxMKSB7CisgICAgICAgIExWQ1NfRGVJbml0KCZwSW5zdGFuY2UtPmhDU0luc3RhbmNlKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIERlLWluaXRpYWxpc2UgdGhlIEJhc3MgRW5oYW5jZW1lbnQgbW9kdWxlCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+aERCRUluc3RhbmNlICE9IExWTV9OVUxMKSB7CisgICAgICAgIExWREJFX0RlSW5pdCgmcEluc3RhbmNlLT5oREJFSW5zdGFuY2UpOworICAgIH0KKworICAgIC8qCisgICAgICogRGUtaW5pdGlhbGlzZSB0aGUgTi1CYW5kIEVxdWFsaXNlciBtb2R1bGUKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlLT5oRVFOQkluc3RhbmNlICE9IExWTV9OVUxMKSB7CisgICAgICAgIExWRVFOQl9EZUluaXQoJnBJbnN0YW5jZS0+aEVRTkJJbnN0YW5jZSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBGcmVlIEhlYWRyb29tIG1hbmFnZW1lbnQgbWVtb3J5LgorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPnBIZWFkcm9vbV9CYW5kRGVmcyAhPSBMVk1fTlVMTCkgeworICAgICAgICBmcmVlKHBJbnN0YW5jZS0+cEhlYWRyb29tX0JhbmREZWZzKTsKKyAgICAgICAgcEluc3RhbmNlLT5wSGVhZHJvb21fQmFuZERlZnMgPSBMVk1fTlVMTDsKKyAgICB9CisgICAgaWYgKHBJbnN0YW5jZS0+cEhlYWRyb29tX1VzZXJEZWZzICE9IExWTV9OVUxMKSB7CisgICAgICAgIGZyZWUocEluc3RhbmNlLT5wSGVhZHJvb21fVXNlckRlZnMpOworICAgICAgICBwSW5zdGFuY2UtPnBIZWFkcm9vbV9Vc2VyRGVmcyA9IExWTV9OVUxMOworICAgIH0KKworICAgIC8qCisgICAgICogRGUtaW5pdGlhbGlzZSB0aGUgUFNBIG1vZHVsZQorICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZSAhPSBMVk1fTlVMTCkgeworICAgICAgICBMVlBTQV9EZUluaXQoJnBJbnN0YW5jZS0+aFBTQUluc3RhbmNlKTsKKyAgICB9CisgICAgaWYgKHBJbnN0YW5jZS0+cFBTQUlucHV0ICE9IExWTV9OVUxMKSB7CisgICAgICAgIGZyZWUocEluc3RhbmNlLT5wUFNBSW5wdXQpOworICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCA9IExWTV9OVUxMOworICAgIH0KKworICAgIGZyZWUoKnBoSW5zdGFuY2UpOworICAgIHJldHVybjsKK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTEwMjksNyArNjIxLDYgQEAKIAogTFZNX1JldHVyblN0YXR1c19lbiBMVk1fQ2xlYXJBdWRpb0J1ZmZlcnMoTFZNX0hhbmRsZV90ICBoSW5zdGFuY2UpCiB7Ci0gICAgTFZNX01lbVRhYl90ICAgICAgICAgICAgTWVtVGFiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgdGFibGUgKi8KICAgICBMVk1fSW5zdFBhcmFtc190ICAgICAgICBJbnN0UGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnRyb2wgUGFyYW1ldGVycyAqLwogICAgIExWTV9JbnN0YW5jZV90ICAgICAgICAgICpwSW5zdGFuY2UgID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsgLyogUG9pbnRlciB0byBJbnN0YW5jZSAqLwpAQCAtMTA0NSwxNyArNjM2LDExIEBACiAgICAgLypTYXZlIHRoZSBoZWFkcm9vbSBwYXJhbWV0ZXJzKi8KICAgICBMVk1fR2V0SGVhZHJvb21QYXJhbXMoaEluc3RhbmNlLCAmSGVhZHJvb21QYXJhbXMpOwogCi0gICAgLyogIFJldHJpZXZlIGFsbG9jYXRlZCBidWZmZXJzIGluIG1lbXRhYiAqLwotICAgIExWTV9HZXRNZW1vcnlUYWJsZShoSW5zdGFuY2UsICZNZW1UYWIsICBMVk1fTlVMTCk7CiAKICAgICAvKiAgU2F2ZSB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycyAqLwogICAgIEluc3RQYXJhbXMgPSBwSW5zdGFuY2UtPkluc3RQYXJhbXM7CiAKICAgICAvKiAgQ2FsbCAgTFZNX0dldEluc3RhbmNlSGFuZGxlIHRvIHJlLWluaXRpYWxpc2UgdGhlIGJ1bmRsZSAqLwotICAgIExWTV9HZXRJbnN0YW5jZUhhbmRsZSggJmhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZNZW1UYWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmSW5zdFBhcmFtcyk7Ci0KICAgICAvKiBSZXN0b3JlIGNvbnRyb2wgcGFyYW1ldGVycyAqLyAvKiBjb3Zlcml0eVt1bmNoZWNrZWRfdmFsdWVdICovIC8qIERvIG5vdCBjaGVjayByZXR1cm4gdmFsdWUgaW50ZXJuYWwgZnVuY3Rpb24gY2FsbHMgKi8KICAgICBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMoaEluc3RhbmNlLCAmUGFyYW1zKTsKIApAQCAtMTA2MywxMSArNjQ4LDcgQEAKICAgICBMVk1fU2V0SGVhZHJvb21QYXJhbXMoaEluc3RhbmNlLCAmSGVhZHJvb21QYXJhbXMpOwogCiAgICAgLyogREMgcmVtb3ZhbCBmaWx0ZXIgKi8KLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgRENfTWNfRDE2X1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UpOwotI2Vsc2UKLSAgICBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSk7Ci0jZW5kaWYKIAogICAgIHJldHVybiBMVk1fU1VDQ0VTUzsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJpdmF0ZS5oCmluZGV4IGRkYWFjOTkuLmE5NDkyYTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1ByaXZhdGUuaApAQCAtMTEzLDQwICsxMTMsMTUgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKiBNZW1vcnkgcmVnaW9uIGRlZmluaXRpb24gKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgU2l6ZTsgICAgICAgICAgICAgICAvKiBSZWdpb24gc2l6ZSBpbiBieXRlcyAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIEFsaWdubWVudDsgICAgICAgICAgLyogQnl0ZSBhbGlnbm1lbnQgKi8KLSAgICBMVk1fTWVtb3J5VHlwZXNfZW4gICAgICBUeXBlOyAgICAgICAgICAgICAgIC8qIFJlZ2lvbiB0eXBlICovCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKnBCYXNlQWRkcmVzczsgICAgICAvKiBQb2ludGVyIHRvIHRoZSByZWdpb24gYmFzZSBhZGRyZXNzICovCi19IExWTV9JbnRNZW1vcnlSZWdpb25fdDsKLQotLyogTWVtb3J5IHRhYmxlIGNvbnRhaW5pbmcgdGhlIHJlZ2lvbiBkZWZpbml0aW9ucyAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fSW50TWVtb3J5UmVnaW9uX3QgICBSZWdpb25bTFZNX05SX01FTU9SWV9SRUdJT05TXTsgIC8qIE9uZSBkZWZpbml0aW9uIGZvciBlYWNoIHJlZ2lvbiAqLwotfSBMVk1fSW50TWVtVGFiX3Q7Ci0KIC8qIEJ1ZmZlciBNYW5hZ2VtZW50ICovCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwU2NyYXRjaDsgICAgICAgICAgLyogQnVuZGxlIHNjcmF0Y2ggYnVmZmVyICovCiAKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBCdWZmZXJTdGF0ZTsgICAgICAgIC8qIEJ1ZmZlciBzdGF0dXMgKi8KLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgSW5EZWxheUJ1ZmZlclszICogTFZNX01BWF9DSEFOTkVMUyAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkVdOwotI2Vsc2UKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBJbkRlbGF5QnVmZmVyWzYgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFXTsgLyogSW5wdXQgYnVmZmVyIGRlbGF5IGxpbmUsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgYW5kIHJpZ2h0ICovCi0jZW5kaWYKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBJbkRlbGF5U2FtcGxlczsgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBpbnB1dCBkZWxheSBidWZmZXIgKi8KLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgT3V0RGVsYXlCdWZmZXJbTFZNX01BWF9DSEFOTkVMUyAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkVdOwotI2Vsc2UKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBPdXREZWxheUJ1ZmZlclsyICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRV07IC8qIE91dHB1dCBidWZmZXIgZGVsYXkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lICovCi0jZW5kaWYKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBPdXREZWxheVNhbXBsZXM7ICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBvdXRwdXQgZGVsYXkgYnVmZmVyLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgYW5kIHJpZ2h0ICovCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgU2FtcGxlc1RvT3V0cHV0OyAgICAvKiBTYW1wbGVzIHRvIHdyaXRlIHRvIHRoZSBvdXRwdXQgKi8KQEAgLTE2Nyw3ICsxNDIsNiBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICAvKiBQdWJsaWMgcGFyYW1ldGVycyAqLwotICAgIExWTV9NZW1UYWJfdCAgICAgICAgICAgIE1lbW9yeVRhYmxlOyAgICAgICAgLyogSW5zdGFuY2UgbWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBQYXJhbXM7ICAgICAgICAgICAgIC8qIENvbnRyb2wgcGFyYW1ldGVycyAqLwogICAgIExWTV9JbnN0UGFyYW1zX3QgICAgICAgIEluc3RQYXJhbXM7ICAgICAgICAgLyogSW5zdGFuY2UgcGFyYW1ldGVycyAqLwogCkBAIC0yMzYsMTAgKzIxMCw5IEBACiAKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgIE5vU21vb3RoVm9sdW1lOyAgICAgIC8qIEVuYWJsZSBvciBkaXNhYmxlIHNtb290aCB2b2x1bWUgY2hhbmdlcyovCiAKLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICBOckNoYW5uZWxzOwogICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgQ2hNYXNrOwotI2VuZGlmCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAqcFNjcmF0Y2g7ICAgICAgICAgICAvKiBQb2ludGVyIHRvIGJ1bmRsZSBzY3JhdGNoIGJ1ZmZlciovCiAKIH0gTFZNX0luc3RhbmNlX3Q7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmNwcAppbmRleCBkYzg2Y2ZkLi4zYWYyMzI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJvY2Vzcy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuY3BwCkBAIC02NCwxMSArNjQsOSBAQAogICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBUb1Byb2Nlc3MgPSAoTFZNX0ZMT0FUICopcEluRGF0YTsKICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwUHJvY2Vzc2VkID0gcE91dERhdGE7CiAgICAgTFZNX1JldHVyblN0YXR1c19lbiAgU3RhdHVzOwotI2lmZGVmIFNVUFBPUlRfTUMKICAgICBMVk1fSU5UMzIgICAgICAgICAgIE5yQ2hhbm5lbHMgID0gcEluc3RhbmNlLT5OckNoYW5uZWxzOwogICAgIExWTV9JTlQzMiAgICAgICAgICAgQ2hNYXNrICAgICAgPSBwSW5zdGFuY2UtPkNoTWFzazsKICNkZWZpbmUgTnJGcmFtZXMgU2FtcGxlQ291bnQgIC8vIGFsaWFzIGZvciBjbGFyaXR5Ci0jZW5kaWYKIAogICAgIC8qCiAgICAgICogQ2hlY2sgaWYgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIHplcm8KQEAgLTExNCwxMSArMTEyLDkgQEAKICAgICBpZiAocEluc3RhbmNlLT5Db250cm9sUGVuZGluZyA9PSBMVk1fVFJVRSkKICAgICB7CiAgICAgICAgIFN0YXR1cyA9IExWTV9BcHBseU5ld1NldHRpbmdzKGhJbnN0YW5jZSk7Ci0jaWZkZWYgU1VQUE9SVF9NQwogICAgICAgICAvKiBVcGRhdGUgdGhlIGxvY2FsIHZhcmlhYmxlIE5yQ2hhbm5lbHMgZnJvbSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHMgdmFsdWUgKi8KICAgICAgICAgTnJDaGFubmVscyA9IHBJbnN0YW5jZS0+TnJDaGFubmVsczsKICAgICAgICAgQ2hNYXNrICAgICA9IHBJbnN0YW5jZS0+Q2hNYXNrOwotI2VuZGlmCiAKICAgICAgICAgaWYoU3RhdHVzICE9IExWTV9TVUNDRVNTKQogICAgICAgICB7CkBAIC0xMzYsMTAgKzEzMiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgaW5wdXQgc2FtcGxlcyAqLwogICAgICAgICBwSW5wdXQgICAgID0gcE91dERhdGE7CiAgICAgICAgIHBUb1Byb2Nlc3MgPSBwT3V0RGF0YTsKLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgICAgIE5yQ2hhbm5lbHMgPSAyOwogICAgICAgICBDaE1hc2sgICAgID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotI2VuZGlmCiAgICAgfQogCiAgICAgLyoKQEAgLTE3OSwxOCArMTczLDExIEBACiAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPlZDX0FjdGl2ZSE9MCkKICAgICAgICAgICAgIHsKLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgICAgICAgICAgICAgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yRnJhbWVzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOwotI2Vsc2UKLSAgICAgICAgICAgICAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBTYW1wbGVDb3VudCkpOyAgICAgLyogTGVmdCBhbmQgcmlnaHQqLwotI2VuZGlmCiAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcyA9IHBQcm9jZXNzZWQ7CiAgICAgICAgICAgICB9CiAKQEAgLTIyNCwxNSArMjExLDkgQEAKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgaWYgKHBUb1Byb2Nlc3MgIT0gcFByb2Nlc3NlZCkKICAgICAgICAgICAgIHsKLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgICAgICAgICAgICAgQ29weV9GbG9hdChwVG9Qcm9jZXNzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yQ2hhbm5lbHMgKiBOckZyYW1lcykpOyAgICAvKiBDb3B5IGFsbCBzYW1wbGVzICovCi0jZWxzZQotICAgICAgICAgICAgICAgIENvcHlfRmxvYXQocFRvUHJvY2VzcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogU2FtcGxlQ291bnQpKTsgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgKi8KLSNlbmRpZgogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKgpAQCAtMjQzLDIxICsyMjQsMTMgQEAKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIEFwcGx5IHRoZSBmaWx0ZXIKICAgICAgICAgICAgICAgICAgKi8KLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgICAgICAgICAgICAgRk9fTWNfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5wVEVfU3RhdGUtPlRyZWJsZUJvb3N0X1N0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7Ci0jZWxzZQotICAgICAgICAgICAgICAgIEZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cFRFX1N0YXRlLT5UcmVibGVCb29zdF9TdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilTYW1wbGVDb3VudCk7Ci0jZW5kaWYKIAogICAgICAgICAgICAgfQotI2lmZGVmIFNVUFBPUlRfTUMKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBWb2x1bWUgYmFsYW5jZQogICAgICAgICAgICAgICovCkBAIC0yNjcsMTUgKzI0MCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaE1hc2spOwotI2Vsc2UKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBWb2x1bWUgYmFsYW5jZQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVDb3VudCk7Ci0jZW5kaWYKIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFBlcmZvcm0gUGFyYW1ldHJpYyBTcGVjdHVtIEFuYWx5c2lzCkBAIC0yODMsMTYgKzI0NywxMCBAQAogICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5QU0FfRW5hYmxlID09IExWTV9QU0FfT04pICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPkluc3RQYXJhbXMuUFNBX0luY2x1ZGVkID09IExWTV9QU0FfT04pKQogICAgICAgICAgICAgewotI2lmZGVmIFNVUFBPUlRfTUMKICAgICAgICAgICAgICAgICBGcm9tTWNUb01vbm9fRmxvYXQocFByb2Nlc3NlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yRnJhbWVzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7Ci0jZWxzZQotICAgICAgICAgICAgICAgIEZyb20yaVRvTW9ub19GbG9hdChwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoU2FtcGxlQ291bnQpKTsKLSNlbmRpZgogCiAgICAgICAgICAgICAgICAgTFZQU0FfUHJvY2VzcyhwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0LApAQCAtMzAzLDE4ICsyNjEsMTEgQEAKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBEQyByZW1vdmFsCiAgICAgICAgICAgICAgKi8KLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgICAgICAgICBEQ19NY19EMTZfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKLSNlbHNlCi0gICAgICAgICAgICBEQ18ySV9EMTZfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpU2FtcGxlQ291bnQpOwotI2VuZGlmCiAgICAgICAgIH0KICAgICAgICAgLyoKICAgICAgICAgICogTWFuYWdlIHRoZSBvdXRwdXQgYnVmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9BR0MuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oCmluZGV4IGJlZjdmYTEuLjYxNjA0NTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oCkBAIC01NCwxNCArNTQsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwTW9ub1NyYywgICAgICAvKiBNb25vIHNvdXJjZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBEc3QsICAgICAgICAgIC8qIFN0ZXJlbyBkZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgbik7ICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICovCi0jaWZkZWYgU1VQUE9SVF9NQwogdm9pZCBBR0NfTUlYX1ZPTF9NYzFNb25fRDMyX1dSQShBR0NfTUlYX1ZPTF8yU3QxTW9uX0ZMT0FUX3QgICpwSW5zdGFuY2UsICAvKiBJbnN0YW5jZSBwb2ludGVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcFN0U3JjLCAgICAgIC8qIFNvdXJjZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBNb25vU3JjLCAgICAvKiBNb25vIHNvdXJjZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBEc3QsICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgTnJGcmFtZXMsICAgICAvKiBOdW1iZXIgb2YgZnJhbWVzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsgIC8qIE51bWJlciBvZiBjaGFubmVscyAqLwotI2VuZGlmCiAKICNlbmRpZiAgLyogX19BR0NfSF9fICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQklRVUFELmgKaW5kZXggYzA1MGNkMC4uYjFlZWZiMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQklRVUFELmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQklRVUFELmgKQEAgLTI0LDcgKzI0LDYgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgLyogVGhlIG1lbW9yeSByZWdpb24gY3JlYXRlZCBieSB0aGlzIHN0cnVjdHVyZSBpbnN0YW5jZSBpcyB0eXBlY2FzdAogICAgICAqIGludG8gYW5vdGhlciBzdHJ1Y3R1cmUgY29udGFpbmluZyBhIHBvaW50ZXIgYW5kIGFuIGFycmF5IG9mIGZpbHRlcgogICAgICAqIGNvZWZmaWNpZW50cy4gSW4gb25lIGNhc2UgdGhpcyBtZW1vcnkgcmVnaW9uIGlzIHVzZWQgZm9yIHN0b3JpbmcKQEAgLTMyLDkgKzMxLDYgQEAKICAgICAgKi8KICAgICBMVk1fRkxPQVQgKnBTdG9yYWdlOwogICAgIExWTV9GTE9BVCBTdG9yYWdlW0xWTV9NQVhfQ0hBTk5FTFNdOwotI2Vsc2UKLSAgICBMVk1fRkxPQVQgU3RvcmFnZVs2XTsKLSNlbmRpZgogfSBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdDsKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBDT0VGRklDSUVOVCBUWVBFIERFRklOSVRJT05TCkBAIC05NCwxMiArOTAsOCBAQAogCiB0eXBlZGVmIHN0cnVjdAogewotI2lmZGVmIFNVUFBPUlRfTUMKICAgICAvKiBMVk1fTUFYX0NIQU5ORUxTIGNoYW5uZWxzLCB0d28gdGFwcyBvZiBzaXplIExWTV9GTE9BVCAqLwogICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoTFZNX01BWF9DSEFOTkVMUyAqIDIpIF07Ci0jZWxzZQotICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoMiAqIDIpIF07ICAvKiBUd28gY2hhbm5lbHMsIHR3byB0YXBzIG9mIHNpemUgTFZNX0ZMT0FUICovCi0jZW5kaWYKIH0gQmlxdWFkXzJJX09yZGVyMV9GTE9BVF9UYXBzX3Q7CiAKIC8qKiogVHlwZXMgdXNlZCBmb3IgYmlxdWFkLCBiYW5kIHBhc3MgYW5kIHBlYWtpbmcgZmlsdGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMTEwLDEyICsxMDIsOCBAQAogCiB0eXBlZGVmIHN0cnVjdAogewotI2lmZGVmIFNVUFBPUlRfTUMKICAgICAvKiBMVk1fTUFYX0NIQU5ORUxTLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fRkxPQVQgKi8KICAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKExWTV9NQVhfQ0hBTk5FTFMgKiA0KSBdOwotI2Vsc2UKLSAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDIgKiA0KSBdOyAgLyogVHdvIGNoYW5uZWxzLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fRkxPQVQgKi8KLSNlbmRpZgogfSBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdDsKIC8qIFRoZSBuYW1lcyBvZiB0aGUgZnVuY3Rpb25zIGFyZSBjaGFuZ2VkIHRvIHNhdGlzZnkgUUFDIHJ1bGVzOiBOYW1lIHNob3VsZCBiZSBVbmlxdWUgd2l0aGluZyAxNiBjaGFyYWN0ZXJzKi8KICNkZWZpbmUgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAgSW5pdF9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMQpAQCAtMTg1LDEzICsxNzMsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLSNpZmRlZiBTVVBQT1JUX01DCiB2b2lkIEJRX01DX0QzMkYzMkMzMF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7Ci0jZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OIFBST1RPVFlQRVM6IEZJUlNUIE9SREVSIEZJTFRFUlMKQEAgLTIyMywxMyArMjA5LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0jaWZkZWYgU1VQUE9SVF9NQwogdm9pZCBGT19NY19EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICBOckZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7Ci0jZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBQUk9UT1RZUEVTOiBCQU5EIFBBU1MgRklMVEVSUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0yNjYsMjAgKzI1MCwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotI2lmZGVmIFNVUFBPUlRfTUMKIHZvaWQgUEtfTWNfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJGcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOwotI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBQUk9UT1RZUEVTOiBEQyBSRU1PVkFMIEZJTFRFUlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioqIDE2IGJpdCBkYXRhIHBhdGggU1RFUkVPICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBTVVBQT1JUX01DCiB2b2lkIERDX01jX0QxNl9UUkNfV1JBXzAxX0luaXQgICAgICggICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UpOwogCiB2b2lkIERDX01jX0QxNl9UUkNfV1JBXzAxICAgICAgICAgICggICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCkBAIC0yODcsMTQgKzI2OCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJGcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOwotI2Vsc2UKLXZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdCAgICAgKCAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSk7Ci0KLXZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDEgICAgICAgICAgKCAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLSNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1R5cGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaAppbmRleCA4YjY4N2Y2Li4wMDhkMTkyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaApAQCAtNTQsMjYgKzU0LDYgQEAKIAogI2RlZmluZSBMVk1fTlJfTUVNT1JZX1JFR0lPTlMgICAgICAgICAgICAgICAgICAgNCAgIC8qIE51bWJlciBvZiBtZW1vcnkgcmVnaW9ucyAqLwogCi0vKiBNZW1vcnkgcGFydGl0aW9uIHR5cGUgKi8KLSNkZWZpbmUgTFZNX01FTV9QQVJUSVRJT04wICAgICAgMCAgICAgICAgICAgICAgICAgICAvKiAxc3QgbWVtb3J5IHBhcnRpdGlvbiAqLwotI2RlZmluZSBMVk1fTUVNX1BBUlRJVElPTjEgICAgICAxICAgICAgICAgICAgICAgICAgIC8qIDJuZCBtZW1vcnkgcGFydGl0aW9uICovCi0jZGVmaW5lIExWTV9NRU1fUEFSVElUSU9OMiAgICAgIDIgICAgICAgICAgICAgICAgICAgLyogM3JkIG1lbW9yeSBwYXJ0aXRpb24gKi8KLSNkZWZpbmUgTFZNX01FTV9QQVJUSVRJT04zICAgICAgMyAgICAgICAgICAgICAgICAgICAvKiA0dGggbWVtb3J5IHBhcnRpdGlvbiAqLwotCi0vKiBVc2UgdHlwZSAqLwotI2RlZmluZSBMVk1fTUVNX1BFUlNJU1RFTlQgICAgICAwICAgICAgICAgICAgICAgICAgIC8qIFBlcnNpc3RlbnQgbWVtb3J5IHR5cGUgKi8KLSNkZWZpbmUgTFZNX01FTV9TQ1JBVENIICAgICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiBTY3JhdGNoICBtZW1vcnkgdHlwZSAqLwotCi0vKiBBY2Nlc3MgdHlwZSAqLwotI2RlZmluZSBMVk1fTUVNX0lOVEVSTkFMICAgICAgICAwICAgICAgICAgICAgICAgICAgIC8qIEludGVybmFsIChmYXN0KSBhY2Nlc3MgbWVtb3J5ICovCi0jZGVmaW5lIExWTV9NRU1fRVhURVJOQUwgICAgICAgIDggICAgICAgICAgICAgICAgICAgLyogRXh0ZXJuYWwgKHNsb3cpIGFjY2VzcyBtZW1vcnkgKi8KLQotLyogUGxhdGZvcm0gc3BlY2lmaWMgKi8KLSNkZWZpbmUgTFZNX1BFUlNJU1RFTlQgICAgICAgICAgKExWTV9NRU1fUEFSVElUSU9OMCtMVk1fTUVNX1BFUlNJU1RFTlQrTFZNX01FTV9JTlRFUk5BTCkKLSNkZWZpbmUgTFZNX1BFUlNJU1RFTlRfREFUQSAgICAgKExWTV9NRU1fUEFSVElUSU9OMStMVk1fTUVNX1BFUlNJU1RFTlQrTFZNX01FTV9JTlRFUk5BTCkKLSNkZWZpbmUgTFZNX1BFUlNJU1RFTlRfQ09FRiAgICAgKExWTV9NRU1fUEFSVElUSU9OMitMVk1fTUVNX1BFUlNJU1RFTlQrTFZNX01FTV9JTlRFUk5BTCkKLSNkZWZpbmUgTFZNX1NDUkFUQ0ggICAgICAgICAgICAgKExWTV9NRU1fUEFSVElUSU9OMytMVk1fTUVNX1NDUkFUQ0grTFZNX01FTV9JTlRFUk5BTCkKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBCYXNpYyB0eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTAyLDExICs4Miw3IEBACiB0eXBlZGVmICAgICBmbG9hdCAgICAgICAgICAgICAgIGVmZmVjdF9idWZmZXJfdDsKIAogCi0jaWZkZWYgU1VQUE9SVF9NQwogI2RlZmluZSBMVk1fTUFYX0NIQU5ORUxTIDggLy8gRkNDXzgKLSNlbHNlCi0jZGVmaW5lIExWTV9NQVhfQ0hBTk5FTFMgMiAvLyBGQ0NfMgotI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xMjgsOSArMTA0LDcgQEAKICAgICBMVk1fU1RFUkVPICAgICAgICAgID0gMCwKICAgICBMVk1fTU9OT0lOU1RFUkVPICAgID0gMSwKICAgICBMVk1fTU9OTyAgICAgICAgICAgID0gMiwKLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgTFZNX01VTFRJQ0hBTk5FTCAgICA9IDMsCi0jZW5kaWYKICAgICBMVk1fU09VUkNFX0RVTU1ZICAgID0gTFZNX01BWEVOVU0KIH0gTFZNX0Zvcm1hdF9lbjsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oCmluZGV4IGIyN2JhYzUuLmNiZGU5MWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1ZlY3RvckFyaXRobWV0aWMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9WZWN0b3JBcml0aG1ldGljLmgKQEAgLTMxLDcgKzMxLDYgQEAKIHZvaWQgQ29weV9GbG9hdCggICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOwotI2lmZGVmIFNVUFBPUlRfTUMKIHZvaWQgQ29weV9GbG9hdF9NY19TdGVyZW8oICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJGcmFtZXMsCkBAIC00MSw3ICs0MCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiBOckNoYW5uZWxzKTsKLSNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBub3RlOiBJbiBNdWx0M3NfMTZ4MTYoKSBzYXR1cmF0aW9uIG9mIHJlc3VsdCBpcyBub3QgdGFrZW4gY2FyZSB3aGVuICAgICAgICAgICAqCkBAIC0xMTAsMTIgKzEwOCwxMCBAQAogdm9pZCBGcm9tMmlUb01vbm9fRmxvYXQoICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwotI2lmZGVmIFNVUFBPUlRfTUMKIHZvaWQgRnJvbU1jVG9Nb25vX0Zsb2F0KGNvbnN0IExWTV9GTE9BVCAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJGcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJDaGFubmVscyk7Ci0jZW5kaWYKIHZvaWQgTVNUbzJpX1NhdF9GbG9hdCggICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjTSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQS5jcHAKaW5kZXggZTE4YWE3OC4uMDdmYzBkMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEuY3BwCkBAIC0xNzIsNyArMTcyLDYgQEAKIAogICAgIHJldHVybjsKIH0KLSNpZmRlZiBTVVBQT1JUX01DCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgQUdDX01JWF9WT0xfTWMxTW9uX0QzMl9XUkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zMTQsNCArMzEzLDMgQEAKIAogICAgIHJldHVybjsKIH0KLSNlbmRpZiAvKlNVUFBPUlRfTUMqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEuY3BwCmluZGV4IDc4ZDFiYTEuLjE4OWZiOWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jcHAKQEAgLTEyMCw3ICsxMjAsNiBAQAogCiAgICAgfQogCi0jaWZkZWYgU1VQUE9SVF9NQwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgQVNTVU1QVElPTlM6CiAgQ09FRlMtCkBAIC0xOTcsNSArMTk2LDQgQEAKICAgICAgICAgfQogCiAgICAgfQotI2VuZGlmIC8qU1VQUE9SVF9NQyovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcHlfMTYuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29weV8xNi5jcHAKaW5kZXggM2E1MDU1NC4uNGI0NGYyOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29weV8xNi5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29weV8xNi5jcHAKQEAgLTgzLDcgKzgzLDYgQEAKIAogICAgIHJldHVybjsKIH0KLSNpZmRlZiBTVVBQT1JUX01DCiAvLyBFeHRyYWN0IG91dCB0aGUgc3RlcmVvIGNoYW5uZWwgcGFpciBmcm9tIG11bHRpY2hhbm5lbCBzb3VyY2UuCiB2b2lkIENvcHlfRmxvYXRfTWNfU3RlcmVvKGNvbnN0IExWTV9GTE9BVCAqc3JjLAogICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKQEAgLTE0Myw1ICsxNDIsNCBAQAogICAgICAgICBTdGVyZW9PdXQgLT0gMjsKICAgICB9CiB9Ci0jZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuY3BwCmluZGV4IGE3Y2U0ZDMuLmYyYjU4MTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jcHAKQEAgLTYxLDcgKzYxLDYgQEAKICAgICAgICAgcEJpcXVhZFN0YXRlLT5SaWdodERDID0gUmlnaHREQzsKIAogICAgIH0KLSNpZmRlZiBTVVBQT1JUX01DCiAvKgogICogRlVOQ1RJT046ICAgICAgIERDX01jX0QxNl9UUkNfV1JBXzAxCiAgKgpAQCAtMTEyLDQgKzExMSwzIEBACiAgICAgICAgIH0KIAogICAgIH0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmNwcAppbmRleCBiZWVlMTEyLi40MmQ5OGYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmNwcApAQCAtMjMsNyArMjMsNiBAQAogICAgIHBCaXF1YWRTdGF0ZS0+TGVmdERDICAgICAgICA9IDAuMGY7CiAgICAgcEJpcXVhZFN0YXRlLT5SaWdodERDICAgICAgID0gMC4wZjsKIH0KLSNpZmRlZiBTVVBQT1JUX01DCiB2b2lkICBEQ19NY19EMTZfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSkKIHsKICAgICBQRmlsdGVyX0ZMT0FUX1N0YXRlX01jIHBCaXF1YWRTdGF0ZSAgPSAoUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYykgcEluc3RhbmNlOwpAQCAtMzMsNCArMzIsMyBAQAogICAgICAgICBwQmlxdWFkU3RhdGUtPkNoRENbaV0gPSAwLjBmOwogICAgIH0KIH0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IDY1MDhiNzMuLjk5OWFiZWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTE4LDcgKzE4LDcgQEAKICNpZm5kZWYgX0RDXzJJX0QxNl9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KICNkZWZpbmUgX0RDXzJJX0QxNl9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KIAotI2RlZmluZSBEQ19GTE9BVF9TVEVQICAgMC4wMDAwMDAyMzg0ZjsKKyNkZWZpbmUgRENfRkxPQVRfU1RFUCAgIDAuMDAwMDAwMjM4NGYKIAogLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLwogLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuKi8KQEAgLTI4LDExICsyOCw5IEBACiAgICAgTFZNX0ZMT0FUICBSaWdodERDOyAgICAvKiBSaWdodERDICAqLwogfUZpbHRlcl9GTE9BVF9TdGF0ZTsKIHR5cGVkZWYgRmlsdGVyX0ZMT0FUX1N0YXRlICogUEZpbHRlcl9GTE9BVF9TdGF0ZSA7Ci0jaWZkZWYgU1VQUE9SVF9NQwogdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9GTE9BVF9TdGF0ZV9NY18KIHsKICAgICBMVk1fRkxPQVQgIENoRENbTFZNX01BWF9DSEFOTkVMU107ICAgICAvKiBDaGFubmVsREMgICovCiB9IEZpbHRlcl9GTE9BVF9TdGF0ZV9NYzsKIHR5cGVkZWYgRmlsdGVyX0ZMT0FUX1N0YXRlX01jICogUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYyA7Ci0jZW5kaWYKICNlbmRpZiAvKiBfRENfMklfRDE2X1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxLmNwcAppbmRleCA2Y2E4MTlhLi42MDU5MzJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxLmNwcApAQCAtMTEzLDcgKzExMyw2IEBACiAgICAgICAgIH0KIAogICAgIH0KLSNpZmRlZiBTVVBQT1JUX01DCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIEFTU1VNUFRJT05TOgogQ09FRlMtCkBAIC0xOTUsNCArMTk0LDMgQEAKICAgICAgICAgICAgIHBEZWxheXMgLT0gTnJDaGFubmVscyAqIDI7CiAgICAgICAgIH0KICAgICB9Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuY3BwCmluZGV4IGE4Njg4YjQuLjZiNTJmZWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmNwcApAQCAtNjcsNyArNjcsNiBAQAogCiAgICAgcmV0dXJuOwogfQotI2lmZGVmIFNVUFBPUlRfTUMKIC8qCiAgKiBGVU5DVElPTjogICAgICAgRnJvbU1jVG9Nb25vX0Zsb2F0CiAgKgpAQCAtMTA3LDYgKzEwNiw1IEBACiAKICAgICByZXR1cm47CiB9Ci0jZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FULmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQuY3BwCmluZGV4IDE0ZDYxYmQuLmQ0ZjQyZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQuY3BwCkBAIC01Niw3ICs1Niw2IEBACiAgICAgfQogCiB9Ci0jaWZkZWYgU1VQUE9SVF9NQwogdm9pZCBMVkNfQ29yZV9NaXhIYXJkXzFTdF9NQ19mbG9hdF9TQVQgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICoqcHRySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICpkc3QsCkBAIC04MCw1ICs3OSw0IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0jZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuY3BwCmluZGV4IDMxODEzOGQuLjdkMTNkNWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FULmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVC5jcHAKQEAgLTExMyw3ICsxMTMsNiBAQAogICAgIH0KICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBDdXJyZW50OwogfQotI2lmZGVmIFNVUFBPUlRfTUMKIC8qCiAgKiBGVU5DVElPTjogICAgICAgTFZDX0NvcmVfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQKICAqCkBAIC0yNDUsNSArMjQ0LDQgQEAKICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBDdXJyZW50OwogfQogCi0jZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBLmNwcAppbmRleCAxZjRiMDhhLi43ODRmMzM5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBLmNwcApAQCAtMTQ1LDcgKzE0NSw2IEBACiAgICAgcEluc3RhbmNlUi0+Q3VycmVudCA9IEN1cnJlbnRSOwogCiB9Ci0jaWZkZWYgU1VQUE9SVF9NQwogdm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9NQ19mbG9hdF9XUkEgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICoqcHRySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICpkc3QsCkBAIC0xODksNSArMTg4LDQgQEAKICAgICAgICAgcHRySW5zdGFuY2VbY2hdLT5DdXJyZW50ID0gdGVtcEN1cnJlbnRbY2hdOwogICAgIH0KIH0KLSNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuY3BwCmluZGV4IDVkOGFhZGMuLjU3ZjAzN2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuY3BwCkBAIC0xMDUsNyArMTA1LDYgQEAKICAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudDsKIH0KIAotI2lmZGVmIFNVUFBPUlRfTUMKIC8qCiAgKiBGVU5DVElPTjogICAgICAgTFZDX0NvcmVfTWl4U29mdF9NY19EMTZDMzFfV1JBCiAgKgpAQCAtMjE0LDYgKzIxMyw1IEBACiAgICAgfQogICAgIHBJbnN0YW5jZS0+Q3VycmVudD1DdXJyZW50OwogfQotI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhJblNvZnRfRDE2QzMxX1NBVC5jcHAKaW5kZXggMmJlYzNiZS4uZWRlNmRlZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuY3BwCkBAIC0xMDUsNyArMTA1LDYgQEAKIAogfQogCi0jaWZkZWYgU1VQUE9SVF9NQwogLyoKICAqIEZVTkNUSU9OOiAgICAgICBMVkNfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQKICAqCkBAIC0yMDIsNiArMjAxLDUgQEAKICAgICB9CiAKIH0KLSNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FULmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FULmNwcAppbmRleCAzMTUzYWRhLi44ZmNlZDYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVC5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQuY3BwCkBAIC0zNyw3ICszNyw2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIFNVUFBPUlRfTUMKIC8qIFRoaXMgdGhyZXNob2xkIGlzIHVzZWQgdG8gZGVjaWRlIG9uIHRoZSBwcm9jZXNzaW5nIHRvIGJlIGFwcGxpZWQgb24KICAqIGZyb250IGNlbnRlciBhbmQgYmFjayBjZW50ZXIgY2hhbm5lbHMKICAqLwpAQCAtMjMxLDcgKzIzMCw2IEBACiAgICAgICAgIH0KICAgICB9CiB9Ci0jZW5kaWYKIHZvaWQgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQuY3BwCmluZGV4IDRkMjI5ZGEuLmY4OTM5MTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jcHAKQEAgLTEwMiw3ICsxMDIsNiBAQAogICAgICAgICB9CiAgICAgfQogfQotI2lmZGVmIFNVUFBPUlRfTUMKIC8qCiAgKiBGVU5DVElPTjogICAgICAgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVAogICoKQEAgLTE5NSw2ICsxOTQsNSBAQAogICAgIH0KIH0KIAotI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuY3BwCmluZGV4IDU0YWI3OWQuLjI5NTg2MzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jcHAKQEAgLTY3LDcgKzY3LDYgQEAKICAgICB9CiB9CiAKLSNpZmRlZiBTVVBQT1JUX01DCiAvKgogICogRlVOQ1RJT046ICAgICAgIExWQ19NaXhTb2Z0XzJNY19EMTZDMzFfU0FUCiAgKgpAQCAtMTI4LDYgKzEyNyw1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSwgc3JjMiwgZHN0LCBOckZyYW1lcyAqIE5yQ2hhbm5lbHMpOwogICAgIH0KIH0KLSNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKaW5kZXggY2U0MmQyZS4uNjIwNjI3MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmgKQEAgLTg4LDUzICs4OCw0NSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBuKTsKLSNpZmRlZiBTVVBQT1JUX01DCiB2b2lkIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBOckNoYW5uZWxzKTsKLSNlbmRpZgogCiB2b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgbik7Ci0jaWZkZWYgU1VQUE9SVF9NQwogdm9pZCBMVkNfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yQ2hhbm5lbHMpOwotI2VuZGlmCiAKIHZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwgIC8qIGRzdCBjYW5ub3QgYmUgZXF1YWwgdG8gc3JjMiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbik7Ci0jaWZkZWYgU1VQUE9SVF9NQwogdm9pZCBMVkNfTWl4U29mdF8yTWNfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LCAgLyogZHN0IGNhbm5vdCBiZSBlcXVhbCB0byBzcmMyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBOckZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOwotI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEZvciBhcHBseWluZyBkaWZmZXJlbnQgZ2FpbnMgdG8gTGVmdCBhbmQgcmlnaHQgY2hlbm5hbHMgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogTWl4ZXJTdHJlYW1bMF0gYXBwbGllcyB0byBMZWZ0IGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBNaXhlclN0cmVhbVsxXSBhcHBsaWVzIHRvIFJpZ2h0IGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEdhaW4gdmFsdWVzIHNob3VsZCBub3QgYmUgbW9yZSB0aGF0IDEuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgU1VQUE9SVF9NQwogdm9pZCBMVkNfTWl4U29mdF8xU3RfTUNfZmxvYXRfU0FUKExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9GTE9BVCAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpkc3QsICAgLyogZHN0IGNhbiBiZSBlcXVhbCB0byBzcmMgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIE5yRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgTnJDaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgIENoTWFzayk7Ci0jZW5kaWYKIHZvaWQgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0ZMT0FUICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwgICAvKiBkc3QgY2FuIGJlIGVxdWFsIHRvIHNyYyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Qcml2YXRlLmgKaW5kZXggMTIzZDIyYi4uN2NiYTY3MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfUHJpdmF0ZS5oCkBAIC01MCwyNCArNTAsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7Ci0jaWZkZWYgU1VQUE9SVF9NQwogdm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIE5yRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBOckNoYW5uZWxzKTsKLSNlbmRpZgogdm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKCBMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOwotI2lmZGVmIFNVUFBPUlRfTUMKIHZvaWQgTFZDX0NvcmVfTWl4U29mdF9NY19EMTZDMzFfV1JBKExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgTnJGcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIE5yQ2hhbm5lbHMpOwotI2VuZGlmCiB2b2lkIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwSW5zdGFuY2UxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgICpwSW5zdGFuY2UyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMxLApAQCAtODEsMTMgKzc3LDExIEBACiAvKiBwdHJJbnN0YW5jZTIgYXBwbGllcyB0byBSaWdodCBjaGFubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEdhaW4gdmFsdWVzIHNob3VsZCBub3QgYmUgbW9yZSB0aGF0IDEuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgU1VQUE9SVF9NQwogdm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9NQ19mbG9hdF9XUkEoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKipwdHJJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgTnJGcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgIE5yQ2hhbm5lbHMpOwotI2VuZGlmCiB2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEoIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICpzcmMsCkBAIC0xMDAsMTMgKzk0LDExIEBACiAvKiBwdHJJbnN0YW5jZTIgYXBwbGllcyB0byBSaWdodCBjaGFubmVsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEdhaW4gdmFsdWVzIHNob3VsZCBub3QgYmUgbW9yZSB0aGF0IDEuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgU1VQUE9SVF9NQwogdm9pZCBMVkNfQ29yZV9NaXhIYXJkXzFTdF9NQ19mbG9hdF9TQVQoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKipwdHJJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgTnJGcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgIE5yQ2hhbm5lbHMpOwotI2VuZGlmCiB2b2lkIExWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICpzcmMsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMS5jcHAKaW5kZXggM2Y2MmY5OS4uMjNiNGZhZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmNwcApAQCAtMTE3LDcgKzExNyw2IEBACiAKICAgICB9CiAKLSNpZmRlZiBTVVBQT1JUX01DCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIERFTEFZUy0KIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSB0bwpAQCAtMTg5LDQgKzE4OCwzIEBACiAgICAgICAgIH0KIAogICAgIH0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYi9MVkVRTkIuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9saWIvTFZFUU5CLmgKaW5kZXggYzVkZGY3Ny4uNDFlMmJiNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYi9MVkVRTkIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvbGliL0xWRVFOQi5oCkBAIC04NiwxMyArODYsNiBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyogTWVtb3J5IHRhYmxlICovCi0jZGVmaW5lIExWRVFOQl9NRU1SRUdJT05fSU5TVEFOQ0UgICAgICAgICAgMCAgIC8qIE9mZnNldCB0byB0aGUgaW5zdGFuY2UgbWVtb3J5IHJlZ2lvbiAqLwotI2RlZmluZSBMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQSAgIDEgICAvKiBPZmZzZXQgdG8gcGVyc2lzdGVudCBkYXRhIG1lbW9yeSByZWdpb24gKi8KLSNkZWZpbmUgTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUYgICAyICAgLyogT2Zmc2V0IHRvIHBlcnNpc3RlbnQgY29lZmZpY2llbnQgcmVnaW9uICovCi0jZGVmaW5lIExWRVFOQl9NRU1SRUdJT05fU0NSQVRDSCAgICAgICAgICAgMyAgIC8qIE9mZnNldCB0byBkYXRhIHNjcmF0Y2ggbWVtb3J5IHJlZ2lvbiAqLwotI2RlZmluZSBMVkVRTkJfTlJfTUVNT1JZX1JFR0lPTlMgICAgICAgICAgIDQgICAvKiBOdW1iZXIgb2YgbWVtb3J5IHJlZ2lvbnMgKi8KLQogLyogQ2FsbGJhY2sgZXZlbnRzICovCiAjZGVmaW5lIExWRVFOQl9FVkVOVF9OT05FICAgICAgICAgICAgICAgICAgIDB4MDAwMCAgICAvKiBOb3QgYSB2YWxpZCBldmVudCAqLwogI2RlZmluZSBMVkVRTkJfRVZFTlRfQUxHT0ZGICAgICAgICAgICAgICAgICAweDAwMDEgICAgLyogRVFOQiBoYXMgY29tcGxldGVkIHN3aXRjaCBvZmYgKi8KQEAgLTEyMiwxNiArMTE1LDYgQEAKICAgICBMVkVRTkJfRklMVEVSX0RVTU1ZID0gTFZNX01BWElOVF8zMgogfSBMVkVRTkJfRmlsdGVyTW9kZV9lbjsKIAotLyogTWVtb3J5IFR5cGVzICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVkVRTkJfUEVSU0lTVEVOVCAgICAgID0gMCwKLSAgICBMVkVRTkJfUEVSU0lTVEVOVF9EQVRBID0gMSwKLSAgICBMVkVRTkJfUEVSU0lTVEVOVF9DT0VGID0gMiwKLSAgICBMVkVRTkJfU0NSQVRDSCAgICAgICAgID0gMywKLSAgICBMVkVRTkJfTUVNT1JZX01BWCAgICAgID0gTFZNX01BWElOVF8zMgotfSBMVkVRTkJfTWVtb3J5VHlwZXNfZW47Ci0KIC8qIEZ1bmN0aW9uIHJldHVybiBzdGF0dXMgKi8KIHR5cGVkZWYgZW51bQogewpAQCAtMTczLDkgKzE1Niw3IEBACiB7CiAgICAgTFZFUU5CX1NURVJFTyAgICAgICA9IDAsCiAgICAgTFZFUU5CX01PTk9JTlNURVJFTyA9IDEsCi0jaWZkZWYgU1VQUE9SVF9NQwogICAgIExWRVFOQl9NVUxUSUNIQU5ORUwgPSAyLAotI2VuZGlmCiAgICAgTFZFUU5CX1NPVVJDRV9NQVggICA9IExWTV9NQVhJTlRfMzIKIH0gTFZFUU5CX1NvdXJjZUZvcm1hdF9lbjsKIApAQCAtMjIwLDIxICsyMDEsNiBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyogTWVtb3J5IHJlZ2lvbiBkZWZpbml0aW9uICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBTaXplOyAgICAgICAgICAgICAgICAgICAvKiBSZWdpb24gc2l6ZSBpbiBieXRlcyAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBBbGlnbm1lbnQ7ICAgICAgICAgICAgICAvKiBSZWdpb24gYWxpZ25tZW50IGluIGJ5dGVzICovCi0gICAgTFZFUU5CX01lbW9yeVR5cGVzX2VuICAgICAgIFR5cGU7ICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiB0eXBlICovCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICpwQmFzZUFkZHJlc3M7ICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHJlZ2lvbiBiYXNlIGFkZHJlc3MgKi8KLX0gTFZFUU5CX01lbW9yeVJlZ2lvbl90OwotCi0vKiBNZW1vcnkgdGFibGUgY29udGFpbmluZyB0aGUgcmVnaW9uIGRlZmluaXRpb25zICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWRVFOQl9NZW1vcnlSZWdpb25fdCAgICAgICBSZWdpb25bTFZFUU5CX05SX01FTU9SWV9SRUdJT05TXTsgIC8qIE9uZSBkZWZpbml0aW9uIGZvciBlYWNoIHJlZ2lvbiAqLwotfSBMVkVRTkJfTWVtVGFiX3Q7Ci0KIC8qIEVxdWFsaXNlciBiYW5kIGRlZmluaXRpb24gKi8KIHR5cGVkZWYgc3RydWN0CiB7CkBAIC0yNTQsOSArMjIwLDcgQEAKICAgICAvKiBFcXVhbGlzZXIgcGFyYW1ldGVycyAqLwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBOQmFuZHM7ICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYmFuZHMgKi8KICAgICBMVkVRTkJfQmFuZERlZl90ICAgICAgICAgICAgKnBCYW5kRGVmaW5pdGlvbjsgICAgICAgLyogUG9pbnRlciB0byBlcXVhbGlzZXIgZGVmaW5pdGlvbnMgKi8KLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHM7Ci0jZW5kaWYKIH0gTFZFUU5CX1BhcmFtc190OwogCiAvKiBDYXBhYmlsaXR5IHN0cnVjdHVyZSAqLwpAQCAtMjgzLDc4ICsyNDcsNDQgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkVRTkJfTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlLiBJdCBjYW4gYmUgY2FsbGVkIGluICAgICAgICAgICAqLwotLyogIHR3byB3YXlzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgaEluc3RhbmNlID0gTlVMTCAgICAgICAgICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzICAgICAgICAgICAgICAgICAqLwotLyogICAgICBoSW5zdGFuY2UgPSBJbnN0YW5jZSBoYW5kbGUgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGJhc2UgYWRkcmVzc2VzIGZvciB0aGUgaW5zdGFuY2UgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIChoSW5zdGFuY2U9TlVMTCkgdGhlIG1lbW9yeSAgICAgICovCi0vKiAgYmFzZSBhZGRyZXNzIHBvaW50ZXJzIGFyZSBOVUxMIG9uIHJldHVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZnJlZSAoaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlKSB0aGUgbWVtb3J5ICAgICAgICovCi0vKiAgdGFibGUgcmV0dXJucyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhbmQgYmFzZSBhZGRyZXNzZXMgdXNlZCBkdXJpbmcgaW5pdGlhbGlzYXRpb24uICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAqLwotLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGRlZmF1bHQgY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWRVFOQl9TVUNDRVNTICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgV2hlbiBhbnkgb2YgcE1lbW9yeVRhYmxlIGFuZCBwQ2FwYWJpbGl0aWVzIGlzIE5VTEwgYWRkcmVzcyAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkVRTkJfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUxWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX01lbW9yeShMVkVRTkJfSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX01lbVRhYl90ICAgICAgICAgICAgKnBNZW1vcnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgICAqcENhcGFiaWxpdGllcyk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZFUU5CX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ3JlYXRlIGFuZCBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIE4tQmFuZCBlcXVhbGxpc2VyIG1vZHVsZSAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuIGFsZ29yaXRobSBpbnN0YW5jZSBieSBjYWxsaW5nIHdpdGggICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlIHNldCB0byBOVUxMLiBJbiB0aGlzIGNhc2UgdGhlIGFsZ29yaXRobSByZXR1cm5zIHRoZSBuZXcgaW5zdGFuY2UgICAgICAgICAgKi8KLS8qICBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBmb3JjZSBhIGZ1bGwgcmUtaW5pdGlhbGlzYXRpb24gb2YgdGhlIGFsZ29yaXRobSAgICAgICAgKi8KLS8qICBieSBjYWxsaW5nIHdpdGggaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlLiBJbiB0aGlzIGNhc2UgdGhlIG1lbW9yeSB0YWJsZSAgICAgICAgICAqLwotLyogIHNob3VsZCBiZSBjb3JyZWN0IGZvciB0aGUgaW5zdGFuY2UsIHRoaXMgY2FuIGJlIGVuc3VyZWQgYnkgY2FsbGluZyB0aGUgZnVuY3Rpb24gICAgICovCi0vKiAgTFZFUU5CX01lbW9yeSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDcmVhdGUgYW5kIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgTi1CYW5kIGVxdWFsaXNlciBtb2R1bGUuICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgUG9pbnRlciB0byBpbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbml0aWFsaXNhdGlvbiBjYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAqLworLyogIHBTY3JhdGNoICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYnVuZGxlIHNjcmF0Y2ggYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIExWRVFOQl9TVUNDRVNTICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgICBXaGVuIHBDYXBhYmlsaXRpZXMgb3IgcE1lbW9yeVRhYmxlaXMgb3IgcGhJbnN0YW5jZSBhcmUgTlVMTCAqLwotLyogIExWRVFOQl9OVUxMQUREUkVTUyAgICAgICAgT25lIG9yIG1vcmUgb2YgdGhlIG1lbW9yeSByZWdpb25zIGhhcyBhIE5VTEwgYmFzZSBhZGRyZXNzICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIGZvciBhIG1lbW9yeSByZWdpb24gd2l0aCBhIG5vbi16ZXJvIHNpemUuICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgV2hlbiBwQ2FwYWJpbGl0aWVzIG9yIHBoSW5zdGFuY2UgYXJlIE5VTEwgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICBXaGVuIGFsbG9jYXRlZCBtZW1vcnkgaGFzIGEgTlVMTCBiYXNlIGFkZHJlc3MgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAxLiAgVGhlIGluc3RhbmNlIGhhbmRsZSBpcyB0aGUgcG9pbnRlciB0byB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBtZW1vcnkgICAgICAqLwotLyogICAgICByZWdpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMi4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWRVFOQl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZFUU5CX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQogTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfSW5pdChMVkVRTkJfSGFuZGxlX3QgICAgICAgICAgKnBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9NZW1UYWJfdCAgICAgICAgICAqcE1lbW9yeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgKnBDYXBhYmlsaXRpZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgKnBDYXBhYmlsaXRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAqcFNjcmF0Y2gpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWRVFOQl9EZUluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRnJlZSB0aGUgbWVtb3JpZXMgY3JlYXRlZCBkdXJpbmcgTFZFUU5CX0luaXQgaW5jbHVkaW5nIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgIFBvaW50ZXIgdG8gaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkVRTkJfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVkVRTkJfRGVJbml0KExWRVFOQl9IYW5kbGVfdCAgICAgICAgKnBoSW5zdGFuY2UpOwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfSW5pdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Jbml0LmNwcAppbmRleCAyNzFhOTE0Li45MzJhZjcxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Jbml0LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Jbml0LmNwcApAQCAtMjEsNiArMjEsNyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgIkxWRVFOQi5oIgogI2luY2x1ZGUgIkxWRVFOQl9Qcml2YXRlLmgiCiAjaW5jbHVkZSAiSW5zdEFsbG9jLmgiCkBAIC0yOCwyNTUgKzI5LDc1IEBACiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZFUU5CX01lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gSXQgY2FuIGJlIGNhbGxlZCBpbiAgICAgICAgICAgKi8KLS8qICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIHRoZSBtZW1vcnkgICAgICAqLwotLyogIGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlIG1lbW9yeSAgICAgICAqLwotLyogIHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgKi8KLS8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBjYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVkVRTkJfU1VDQ0VTUyAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWRVFOQl9OVUxMQUREUkVTUyAgICAgIFdoZW4gYW55IG9mIHBNZW1vcnlUYWJsZSBhbmQgcENhcGFiaWxpdGllcyBpcyBOVUxMIGFkZHJlc3MgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZFUU5CX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1MVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9NZW1vcnkoTFZFUU5CX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9NZW1UYWJfdCAgICAgICAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NhcGFiaWxpdGllc190ICAgICAgKnBDYXBhYmlsaXRpZXMpCi17Ci0KLSAgICBJTlNUX0FMTE9DICAgICAgICAgIEFsbG9jTWVtOwotICAgIExWRVFOQl9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSA9IChMVkVRTkJfSW5zdGFuY2VfdCAqKWhJbnN0YW5jZTsKLQotICAgIGlmKChwTWVtb3J5VGFibGUgPT0gTFZNX05VTEwpfHwgKHBDYXBhYmlsaXRpZXMgPT0gTFZNX05VTEwpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEZpbGwgaW4gdGhlIG1lbW9yeSB0YWJsZQotICAgICAqLwotICAgIGlmIChoSW5zdGFuY2UgPT0gTFZNX05VTEwpCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBJbnN0YW5jZSBtZW1vcnkKLSAgICAgICAgICovCi0gICAgICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgTFZNX05VTEwpOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZFUU5CX0luc3RhbmNlX3QpKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9JTlNUQU5DRV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZBbGxvY01lbSk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fSU5TVEFOQ0VdLkFsaWdubWVudCAgICA9IExWRVFOQl9JTlNUQU5DRV9BTElHTjsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9JTlNUQU5DRV0uVHlwZSAgICAgICAgID0gTFZFUU5CX1BFUlNJU1RFTlQ7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fSU5TVEFOQ0VdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFBlcnNpc3RhbnQgZGF0YSBtZW1vcnkKLSAgICAgICAgICovCi0gICAgICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgTFZNX05VTEwpOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QpKTsKLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkpOwotICAgICAgICAvKiBFcXVhbGlzZXIgQmlxdWFkIFRhcHMgKi8KLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190KSkpOwotICAgICAgICAvKiBGaWx0ZXIgZGVmaW5pdGlvbnMgKi8KLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKExWRVFOQl9CYW5kRGVmX3QpKSk7Ci0gICAgICAgIC8qIEJpcXVhZCB0eXBlcyAqLwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoTFZFUU5CX0JpcXVhZFR5cGVfZW4pKSk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLkFsaWdubWVudCAgICA9IExWRVFOQl9EQVRBX0FMSUdOOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uVHlwZSAgICAgICAgID0gTFZFUU5CX1BFUlNJU1RFTlRfREFUQTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFBlcnNpc3RhbnQgY29lZmZpY2llbnQgbWVtb3J5Ci0gICAgICAgICAqLwotICAgICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCi0gICAgICAgICAgICAgICAgICAgICAgIExWTV9OVUxMKTsKLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSk7Ci0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpKTsKLSAgICAgICAgLyogRXF1YWxpc2VyIEJpcXVhZCBJbnN0YW5jZSAqLwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCkpOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZBbGxvY01lbSk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5BbGlnbm1lbnQgICAgPSBMVkVRTkJfQ09FRl9BTElHTjsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlR5cGUgICAgICAgICA9IExWRVFOQl9QRVJTSVNURU5UX0NPRUY7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBTY3JhdGNoIG1lbW9yeQotICAgICAgICAgKi8KLSAgICAgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAotICAgICAgICAgICAgICAgICAgICAgICBMVk1fTlVMTCk7Ci0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9TQ1JBVENIQlVGRkVSUyAqIHNpemVvZihMVk1fRkxPQVQpICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIXS5TaXplICAgICAgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmQWxsb2NNZW0pOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1NDUkFUQ0hdLkFsaWdubWVudCAgICAgICAgID0gTFZFUU5CX1NDUkFUQ0hfQUxJR047Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fU0NSQVRDSF0uVHlwZSAgICAgICAgICAgICAgPSBMVkVRTkJfU0NSQVRDSDsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3MgICAgICA9IExWTV9OVUxMOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBSZWFkIGJhY2sgbWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KLSAgICAgICAgKnBNZW1vcnlUYWJsZSA9IHBJbnN0YW5jZS0+TWVtb3J5VGFibGU7Ci0gICAgfQotCi0gICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkVRTkJfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDcmVhdGUgYW5kIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgTi1CYW5kIGVxdWFsaXNlciBtb2R1bGUgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW4gYWxnb3JpdGhtIGluc3RhbmNlIGJ5IGNhbGxpbmcgd2l0aCAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2Ugc2V0IHRvIE5VTEwuIEluIHRoaXMgY2FzZSB0aGUgYWxnb3JpdGhtIHJldHVybnMgdGhlIG5ldyBpbnN0YW5jZSAgICAgICAgICAqLwotLyogIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGZvcmNlIGEgZnVsbCByZS1pbml0aWFsaXNhdGlvbiBvZiB0aGUgYWxnb3JpdGhtICAgICAgICAqLwotLyogIGJ5IGNhbGxpbmcgd2l0aCBoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUuIEluIHRoaXMgY2FzZSB0aGUgbWVtb3J5IHRhYmxlICAgICAgICAgICovCi0vKiAgc2hvdWxkIGJlIGNvcnJlY3QgZm9yIHRoZSBpbnN0YW5jZSwgdGhpcyBjYW4gYmUgZW5zdXJlZCBieSBjYWxsaW5nIHRoZSBmdW5jdGlvbiAgICAgKi8KLS8qICBEQkVfTWVtb3J5IGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENyZWF0ZSBhbmQgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBOLUJhbmQgZXF1YWxpc2VyIG1vZHVsZS4gICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBjYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgIFBvaW50ZXIgdG8gaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgKi8KKy8qICBwU2NyYXRjaCAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGJ1bmRsZSBzY3JhdGNoIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBMVkVRTkJfU1VDQ0VTUyAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWRVFOQl9OVUxMQUREUkVTUyAgICAgICAgV2hlbiBwQ2FwYWJpbGl0aWVzIG9yIHBNZW1vcnlUYWJsZWlzIG9yIHBoSW5zdGFuY2UgYXJlIE5VTEwgKi8KLS8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICAgIE9uZSBvciBtb3JlIG9mIHRoZSBtZW1vcnkgcmVnaW9ucyBoYXMgYSBOVUxMIGJhc2UgYWRkcmVzcyAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciBmb3IgYSBtZW1vcnkgcmVnaW9uIHdpdGggYSBub24temVybyBzaXplLiAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICBPbmUgb3IgbW9yZSBtZW1vcnkgaGFzIGEgTlVMTCBwb2ludGVyIC0gbWFsbG9jIGZhaWx1cmUgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAxLiAgVGhlIGluc3RhbmNlIGhhbmRsZSBpcyB0aGUgcG9pbnRlciB0byB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBtZW1vcnkgICAgICAqLwotLyogICAgICByZWdpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMi4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWRVFOQl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZFUU5CX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfSW5pdChMVkVRTkJfSGFuZGxlX3QgICAgICAgICAgKnBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9NZW1UYWJfdCAgICAgICAgICAqcE1lbW9yeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgKnBDYXBhYmlsaXRpZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCAgICAqcENhcGFiaWxpdGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICpwU2NyYXRjaCkKIHsKIAogICAgIExWRVFOQl9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZTsKLSAgICBMVk1fVUlOVDMyICAgICAgICAgIE1lbVNpemU7Ci0gICAgSU5TVF9BTExPQyAgICAgICAgICBBbGxvY01lbTsKLSAgICBMVk1fSU5UMzIgICAgICAgICAgIGk7CiAKLSAgICAvKgotICAgICAqIENoZWNrIGZvciBOVUxMIHBvaW50ZXJzCi0gICAgICovCi0gICAgaWYoKHBoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwTWVtb3J5VGFibGUgPT0gTFZNX05VTEwpIHx8IChwQ2FwYWJpbGl0aWVzID09IExWTV9OVUxMKSkKKyAgICAqcGhJbnN0YW5jZSA9IGNhbGxvYygxLCBzaXplb2YoKnBJbnN0YW5jZSkpOworICAgIGlmIChwaEluc3RhbmNlID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKKyAgICB9CisgICAgcEluc3RhbmNlID0oTFZFUU5CX0luc3RhbmNlX3QgICopKnBoSW5zdGFuY2U7CisKKyAgICBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcyA9ICpwQ2FwYWJpbGl0aWVzOworICAgIHBJbnN0YW5jZS0+cFNjcmF0Y2ggPSBwU2NyYXRjaDsKKworICAgIC8qIEVxdWFsaXNlciBCaXF1YWQgSW5zdGFuY2UgKi8KKyAgICBMVk1fVUlOVDMyIE1lbVNpemUgPSBwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZigqKHBJbnN0YW5jZS0+cEVRTkJfRmlsdGVyU3RhdGVfRmxvYXQpKTsKKyAgICBwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlX0Zsb2F0ID0gKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICopY2FsbG9jKDEsIE1lbVNpemUpOworICAgIGlmIChwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlX0Zsb2F0ID09IExWTV9OVUxMKQogICAgIHsKICAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKICAgICB9CiAKLSAgICAvKgotICAgICAqIENoZWNrIHRoZSBtZW1vcnkgdGFibGUgZm9yIE5VTEwgcG9pbnRlcnMKLSAgICAgKi8KLSAgICBmb3IgKGkgPSAwOyBpIDwgTFZFUU5CX05SX01FTU9SWV9SRUdJT05TOyBpKyspCisgICAgTWVtU2l6ZSA9IChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZigqKHBJbnN0YW5jZS0+cEVRTkJfVGFwc19GbG9hdCkpKTsKKyAgICBwSW5zdGFuY2UtPnBFUU5CX1RhcHNfRmxvYXQgPSAoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgKiljYWxsb2MoMSwgTWVtU2l6ZSk7CisgICAgaWYgKHBJbnN0YW5jZS0+cEVRTkJfVGFwc19GbG9hdCA9PSBMVk1fTlVMTCkKICAgICB7Ci0gICAgICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5TaXplIT0wKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocE1lbW9yeVRhYmxlLT5SZWdpb25baV0ucEJhc2VBZGRyZXNzPT1MVk1fTlVMTCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4oTFZFUU5CX05VTExBRERSRVNTKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICByZXR1cm4gTFZFUU5CX05VTExBRERSRVNTOwogICAgIH0KIAotICAgIC8qCi0gICAgICogU2V0IHRoZSBpbnN0YW5jZSBoYW5kbGUgaWYgbm90IGFscmVhZHkgaW5pdGlhbGlzZWQKLSAgICAgKi8KLQotICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fSU5TVEFOQ0VdLnBCYXNlQWRkcmVzcyk7Ci0KLSAgICBpZiAoKnBoSW5zdGFuY2UgPT0gTFZNX05VTEwpCisgICAgTWVtU2l6ZSA9IChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZigqKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9ucykpKTsKKyAgICBwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnMgID0gKExWRVFOQl9CYW5kRGVmX3QgKiljYWxsb2MoMSwgTWVtU2l6ZSk7CisgICAgaWYgKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9ucyA9PSBMVk1fTlVMTCkKICAgICB7Ci0gICAgICAgICpwaEluc3RhbmNlID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sIHNpemVvZihMVkVRTkJfSW5zdGFuY2VfdCkpOworICAgICAgICByZXR1cm4gTFZFUU5CX05VTExBRERSRVNTOwogICAgIH0KLSAgICBwSW5zdGFuY2UgPShMVkVRTkJfSW5zdGFuY2VfdCAgKikqcGhJbnN0YW5jZTsKLQotICAgIC8qCi0gICAgICogU2F2ZSB0aGUgbWVtb3J5IHRhYmxlIGluIHRoZSBpbnN0YW5jZSBzdHJ1Y3R1cmUKLSAgICAgKi8KLSAgICBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcyA9ICpwQ2FwYWJpbGl0aWVzOwotCi0gICAgLyoKLSAgICAgKiBTYXZlIHRoZSBtZW1vcnkgdGFibGUgaW4gdGhlIGluc3RhbmNlIHN0cnVjdHVyZSBhbmQKLSAgICAgKiBzZXQgdGhlIHN0cnVjdHVyZSBwb2ludGVycwotICAgICAqLwotICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUgICAgICAgPSAqcE1lbW9yeVRhYmxlOwotCi0gICAgLyoKLSAgICAgKiBBbGxvY2F0ZSBjb2VmZmljaWVudCBtZW1vcnkKLSAgICAgKi8KLSAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCi0gICAgICAgICAgICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLnBCYXNlQWRkcmVzcyk7Ci0KLSAgICAvKiBFcXVhbGlzZXIgQmlxdWFkIEluc3RhbmNlICovCi0gICAgcEluc3RhbmNlLT5wRVFOQl9GaWx0ZXJTdGF0ZV9GbG9hdCA9IChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAqKQotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgcENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSk7Ci0KLSAgICAvKgotICAgICAqIEFsbG9jYXRlIGRhdGEgbWVtb3J5Ci0gICAgICovCi0gICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAotICAgICAgICAgICAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MpOwotCi0gICAgTWVtU2l6ZSA9IChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkpOwotICAgIHBJbnN0YW5jZS0+cEVRTkJfVGFwc19GbG9hdCA9IChCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtU2l6ZSk7Ci0gICAgTWVtU2l6ZSA9IChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihMVkVRTkJfQmFuZERlZl90KSk7Ci0gICAgcEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zICA9IChMVkVRTkJfQmFuZERlZl90ICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1TaXplKTsKICAgICAvLyBjbGVhciBhbGwgdGhlIGJhbmRzLCBzZXR0aW5nIHRoZWlyIGdhaW4gdG8gMCwgb3RoZXJ3aXNlIHdoZW4gYXBwbHlpbmcgbmV3IHBhcmFtcywKICAgICAvLyBpdCB3aWxsIGNvbXBhcmUgYWdhaW5zdCB1bmluaXRpYWxpemVkIHZhbHVlcwogICAgIG1lbXNldChwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnMsIDAsIE1lbVNpemUpOwotICAgIE1lbVNpemUgPSAocENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoTFZFUU5CX0JpcXVhZFR5cGVfZW4pKTsKLSAgICBwSW5zdGFuY2UtPnBCaXF1YWRUeXBlID0gKExWRVFOQl9CaXF1YWRUeXBlX2VuICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtU2l6ZSk7CiAKLSAgICAvKgotICAgICAqIEludGVybmFsbHkgbWFwLCBzdHJ1Y3R1cmUgYW5kIGFsbGlnbiBzY3JhdGNoIG1lbW9yeQotICAgICAqLwotICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKLSAgICAgICAgICAgICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzcyk7CisgICAgTWVtU2l6ZSA9IChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZigqKHBJbnN0YW5jZS0+cEJpcXVhZFR5cGUpKSk7CisgICAgcEluc3RhbmNlLT5wQmlxdWFkVHlwZSA9IChMVkVRTkJfQmlxdWFkVHlwZV9lbiAqKWNhbGxvYygxLCBNZW1TaXplKTsKKyAgICBpZiAocEluc3RhbmNlLT5wQmlxdWFkVHlwZSA9PSBMVk1fTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBMVkVRTkJfTlVMTEFERFJFU1M7CisgICAgfQogCi0gICAgcEluc3RhbmNlLT5wRmFzdFRlbXBvcmFyeSA9IChMVk1fRkxPQVQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpOworICAgIHBJbnN0YW5jZS0+cEZhc3RUZW1wb3JhcnkgPSAoTFZNX0ZMT0FUICopcFNjcmF0Y2g7CiAKICAgICAvKgogICAgICAqIFVwZGF0ZSB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycwpAQCAtMzE5LDQgKzE0MCw0OCBAQAogCiAgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKIH0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZFUU5CX0RlSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGcmVlIHRoZSBtZW1vcmllcyBjcmVhdGVkIGR1cmluZyBMVkVRTkJfSW5pdCBpbmNsdWRpbmcgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgUG9pbnRlciB0byBpbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWRVFOQl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZFUU5CX0RlSW5pdChMVkVRTkJfSGFuZGxlX3QgICAgICAgICAgKnBoSW5zdGFuY2UpCit7CisKKyAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2U7CisgICAgaWYgKHBoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBwSW5zdGFuY2UgPShMVkVRTkJfSW5zdGFuY2VfdCAgKikqcGhJbnN0YW5jZTsKKworICAgIC8qIEVxdWFsaXNlciBCaXF1YWQgSW5zdGFuY2UgKi8KKyAgICBpZiAocEluc3RhbmNlLT5wRVFOQl9GaWx0ZXJTdGF0ZV9GbG9hdCAhPSBMVk1fTlVMTCkgeworICAgICAgICBmcmVlKHBJbnN0YW5jZS0+cEVRTkJfRmlsdGVyU3RhdGVfRmxvYXQpOworICAgICAgICBwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlX0Zsb2F0ID0gTFZNX05VTEw7CisgICAgfQorICAgIGlmIChwSW5zdGFuY2UtPnBFUU5CX1RhcHNfRmxvYXQgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgZnJlZShwSW5zdGFuY2UtPnBFUU5CX1RhcHNfRmxvYXQpOworICAgICAgICBwSW5zdGFuY2UtPnBFUU5CX1RhcHNfRmxvYXQgPSBMVk1fTlVMTDsKKyAgICB9CisgICAgaWYgKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9ucyAhPSBMVk1fTlVMTCkgeworICAgICAgICBmcmVlKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9ucyk7CisgICAgICAgIHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9ucyA9IExWTV9OVUxMOworICAgIH0KKyAgICBpZiAocEluc3RhbmNlLT5wQmlxdWFkVHlwZSAhPSBMVk1fTlVMTCkgeworICAgICAgICBmcmVlKHBJbnN0YW5jZS0+cEJpcXVhZFR5cGUpOworICAgICAgICBwSW5zdGFuY2UtPnBCaXF1YWRUeXBlID0gTFZNX05VTEw7CisgICAgfQorICAgIGZyZWUocEluc3RhbmNlKTsKKyAgICAqcGhJbnN0YW5jZSA9IExWTV9OVUxMOworfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcml2YXRlLmgKaW5kZXggNDBmYWNmYi4uOTU2OWQ4NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1ByaXZhdGUuaApAQCAtMzYsMTkgKzM2LDYgQEAKIAogLyogR2VuZXJhbCAqLwogI2RlZmluZSBMVkVRTkJfSU5WQUxJRCAgICAgICAgICAgICAgMHhGRkZGICAgICAgICAgICAgICAvKiBJbnZhbGlkIGluaXQgcGFyYW1ldGVyICovCi0KLS8qIE1lbW9yeSAqLwotI2RlZmluZSBMVkVRTkJfSU5TVEFOQ0VfQUxJR04gICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBpbnN0YW5jZSBzdHJ1Y3R1cmVzICovCi0jZGVmaW5lIExWRVFOQl9EQVRBX0FMSUdOICAgICAgICAgICA0ICAgICAgICAgICAgICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIHN0cnVjdHVyZXMgKi8KLSNkZWZpbmUgTFZFUU5CX0NPRUZfQUxJR04gICAgICAgICAgIDQgICAgICAgICAgICAgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgbG9uZyB3b3JkcyAqLwotI2lmZGVmIFNVUFBPUlRfTUMKLS8qIE51bWJlciBvZiBidWZmZXJzIHJlcXVpcmVkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KLSNkZWZpbmUgTFZFUU5CX1NDUkFUQ0hCVUZGRVJTICAgICAgIChMVk1fTUFYX0NIQU5ORUxTICogMikKLSNlbHNlCi0jZGVmaW5lIExWRVFOQl9TQ1JBVENIQlVGRkVSUyAgICAgICA0ICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBidWZmZXJzIHJlcXVpcmVkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KLSNlbmRpZgotI2RlZmluZSBMVkVRTkJfU0NSQVRDSF9BTElHTiAgICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBsb25nIGRhdGEgKi8KLQogI2RlZmluZSBMVkVRTkJfQllQQVNTX01JWEVSX1RDICAgICAgMTAwICAgICAgICAgICAgICAgICAvKiBCeXBhc3MgTWl4ZXIgVEMgKi8KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC03Nyw3ICs2NCw3IEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIC8qIFB1YmxpYyBwYXJhbWV0ZXJzICovCi0gICAgTFZFUU5CX01lbVRhYl90ICAgICAgICAgICAgICAgICBNZW1vcnlUYWJsZTsgICAgICAgIC8qIEluc3RhbmNlIG1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcFNjcmF0Y2g7ICAgICAgICAgIC8qIFBvaW50ZXIgdG8gYnVuZGxlIHNjcmF0Y2ggYnVmZmVyICovCiAgICAgTFZFUU5CX1BhcmFtc190ICAgICAgICAgICAgICAgICBQYXJhbXM7ICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgICAgICAgIENhcGFiaWxpdGllczsgICAgICAgLyogSW5zdGFuY2UgY2FwYWJpbGl0aWVzICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1Byb2Nlc3MuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jcHAKaW5kZXggNjVlZmY1My4uOGRkNTU4NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jcHAKQEAgLTY1LDEzICs2NSw5IEBACiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZWQgdG8gdXNlIHNhbXBsZXMgPSBmcmFtZXMgKiBjaGFubmVscy4KICAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UgPSAoTFZFUU5CX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwogCi0jaWZkZWYgU1VQUE9SVF9NQwogICAgIC8vIE1vbm8gcGFzc2VkIGluIGFzIHN0ZXJlbwogICAgIGNvbnN0IExWTV9JTlQzMiBOckNoYW5uZWxzID0gcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVscyA9PSAxCiAgICAgICAgID8gMiA6IHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHM7Ci0jZWxzZQotICAgIGNvbnN0IExWTV9JTlQzMiBOckNoYW5uZWxzID0gMjsgLy8gRkNDXzIKLSNlbmRpZgogICAgIGNvbnN0IExWTV9JTlQzMiBOclNhbXBsZXMgPSBOckNoYW5uZWxzICogTnJGcmFtZXM7CiAKICAgICAgLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgKi8KQEAgLTEyOSwxOCArMTI1LDExIEBACiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTFZFUU5CX1NpbmdsZVByZWNpc2lvbl9GbG9hdDoKICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfTWNfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEocEJpcXVhZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxKHBCaXF1YWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcyk7Ci0jZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CkBAIC0xNTEsMjAgKzE0MCwxMiBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9PSBMVk1fVFJVRSl7Ci0jaWZkZWYgU1VQUE9SVF9NQwogICAgICAgICAgICAgTFZDX01peFNvZnRfMk1jX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOwotI2Vsc2UKLSAgICAgICAgICAgIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7Ci0jZW5kaWYKICAgICAgICAgICAgIC8vIGR1cGxpY2F0ZSB3aXRoIGVsc2UgY2xhdXNlKHMpCiAgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jcHAKaW5kZXggMmE3NTU1OS4uN2E2OGMyMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzLmNwcApAQCAtNjksMTQgKzY5LDEwIEBACiAgICAgICAgICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU184ODIwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzk2MDAwKQogICAgICAgICAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTc2NDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTkyMDAwKQogICAgICAgICApCi0jaWZkZWYgU1VQUE9SVF9NQwogICAgICAgICB8fCAoKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fU1RFUkVPKSAgICAgICAmJgogICAgICAgICAgICAgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OT0lOU1RFUkVPKSAmJgogICAgICAgICAgICAgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykgICAgICAgICAmJgogICAgICAgICAgICAgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTVVMVElDSEFOTkVMKSkpCi0jZWxzZQotICAgICAgICB8fCAoKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fU1RFUkVPKSAmJiAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PSU5TVEVSRU8pICYmIChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk8pKSApCi0jZW5kaWYKICAgICB7CiAgICAgICAgIHJldHVybiAoTFZSRVZfT1VUT0ZSQU5HRSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvbGliL0xWUFNBLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9saWIvTFZQU0EuaAppbmRleCBjOWZhN2FkLi4wYmE2NjJhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9saWIvTFZQU0EuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9saWIvTFZQU0EuaApAQCAtMjIsMjggKzIyLDkgQEAKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDT05TVEFOVFMgREVGSU5JVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogTWVtb3J5IHRhYmxlKi8KLSNkZWZpbmUgICAgIExWUFNBX05SX01FTU9SWV9SRUdJT05TICAgICAgICAgICAgICAgICAgNCAgICAgIC8qIE51bWJlciBvZiBtZW1vcnkgcmVnaW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVFlQRVMgREVGSU5JVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBNZW1vcnkgVHlwZXMgKi8KLXR5cGVkZWYgZW51bQotewotICAgIExWUFNBX1BFUlNJU1RFTlQgICAgICA9IExWTV9QRVJTSVNURU5ULAotICAgIExWUFNBX1BFUlNJU1RFTlRfREFUQSA9IExWTV9QRVJTSVNURU5UX0RBVEEsCi0gICAgTFZQU0FfUEVSU0lTVEVOVF9DT0VGID0gTFZNX1BFUlNJU1RFTlRfQ09FRiwKLSAgICBMVlBTQV9TQ1JBVENIICAgICAgICAgPSBMVk1fU0NSQVRDSCwKLSAgICBMVlBTQV9NRU1PUllfRFVNTVkgPSBMVk1fTUFYSU5UXzMyICAgICAgICAgICAgICAgICAgICAgIC8qIEZvcmNlIDMyIGJpdHMgZW51bSwgZG9uJ3QgdXNlIGl0ISAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi19IExWUFNBX01lbW9yeVR5cGVzX2VuOwotCiAvKiBMZXZlbCBkZXRlY3Rpb24gc3BlZWQgY29udHJvbCBwYXJhbWV0ZXJzICovCiB0eXBlZGVmIGVudW0KIHsKQEAgLTgwLDIwICs2MSw2IEBACiAKIH0gTFZQU0FfQ29udHJvbFBhcmFtc190LCAqcExWUFNBX0NvbnRyb2xQYXJhbXNfdDsKIAotLyogTWVtb3J5IHJlZ2lvbiBkZWZpbml0aW9uICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgIFNpemU7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVnaW9uIHNpemUgaW4gYnl0ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBMVlBTQV9NZW1vcnlUeXBlc19lbiAgICAgICBUeXBlOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiB0eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKnBCYXNlQWRkcmVzczsgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSByZWdpb24gYmFzZSBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotfSBMVlBTQV9NZW1vcnlSZWdpb25fdDsKLQotLyogTWVtb3J5IHRhYmxlIGNvbnRhaW5pbmcgdGhlIHJlZ2lvbiBkZWZpbml0aW9ucyAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVlBTQV9NZW1vcnlSZWdpb25fdCAgICAgICBSZWdpb25bTFZQU0FfTlJfTUVNT1JZX1JFR0lPTlNdOy8qIE9uZSBkZWZpbml0aW9uIGZvciBlYWNoIHJlZ2lvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi19IExWUFNBX01lbVRhYl90OwotCiAvKiBBdWRpbyB0aW1lIHR5cGUgKi8KIHR5cGVkZWYgTFZNX0lOVDMyIExWUFNBX1RpbWU7CiAKQEAgLTExMyw2MiArODAsNDMgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEZVTkNUSU9OUyBQUk9UT1RZUEUKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX01lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuIEl0IGNhbiBiZSBjYWxsZWQgaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICBoSW5zdGFuY2UgPSBOVUxMICAgICAgICAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGJhc2UgYWRkcmVzc2VzIGZvciB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIHRoZSBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgYmFzZSBhZGRyZXNzIHBvaW50ZXJzIGFyZSBOVUxMIG9uIHJldHVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdGFibGUgcmV0dXJucyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhbmQgYmFzZSBhZGRyZXNzZXMgdXNlZCBkdXJpbmcgaW5pdGlhbGlzYXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNZW1vcnlUYWJsZSAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwSW5pdFBhcmFtcyAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGluaXQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVlBTQV9SRVRVUk4gTFZQU0FfTWVtb3J5ICAgICAgICAgICAgKCBwTFZQU0FfSGFuZGxlX3QgICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfTWVtVGFiX3QgICAgICAgICAgICAgKnBNZW1vcnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0luaXRQYXJhbXNfdCAgICAgICAgICpwSW5pdFBhcmFtcyAgICApOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ3JlYXRlIGFuZCBJbml0aWFsaXplIHRoZSBMVlBTQSBtb2R1bGUgaW5jbHVkaW5nIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbml0UGFyYW1zICAgICAgICAgIEluaXQgcGFyYW1ldGVycyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29udHJvbFBhcmFtcyAgICAgICBDb250cm9sIHBhcmFtZXRlcnMgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBTY3JhdGNoICAgICAgICAgICAgUG9pbnRlciB0byBidW5kbGUgc2NyYXRjaCBtZW1vcnkgYXJlYSAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlBTQV9SRVRVUk4gTFZQU0FfSW5pdChwTFZQU0FfSGFuZGxlX3QgICAgICAgICAgICAgKnBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Jbml0UGFyYW1zX3QgICAgICAgICAgKnBJbml0UGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgICpwQ29udHJvbFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqcFNjcmF0Y2gpOwogCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbml0aWFsaXplcyB0aGUgTFZQU0EgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcGhJbnN0YW5jZSAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBJbml0UGFyYW1zICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgaW5pdCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwQ29udHJvbFBhcmFtcyAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGNvbnRyb2wgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICBQb2ludGVyIHRvIHRoZSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWUFNBX09LICAgICAgICAgICAgU3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUFNBX1JFVFVSTiBMVlBTQV9Jbml0ICAgICAgICAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgICAgICAgICAqcGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0luaXRQYXJhbXNfdCAgICAgICAgICAqcEluaXRQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAgKnBDb250cm9sUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfTWVtVGFiX3QgICAgICAgICAgICAgICpwTWVtb3J5VGFibGUgICk7CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0RlSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZyZWUgdGhlIG1lbW9yaWVzIGNyZWF0ZWQgaW4gTFZQU0FfSW5pdCBjYWxsIGluY2x1ZGluZyBpbnN0YW5jZSBoYW5kbGUgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwaEluc3RhbmNlICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZQU0FfRGVJbml0KHBMVlBTQV9IYW5kbGVfdCAgICAgICAgICAgICAqcGhJbnN0YW5jZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0luaXQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0luaXQuY3BwCmluZGV4IDlmY2Q4MmYuLmJlM2M2OGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Jbml0LmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfSW5pdC5jcHAKQEAgLTE1LDYgKzE1LDcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlICAgIDxzdGRsaWIuaD4KICNpbmNsdWRlICAgICJMVlBTQS5oIgogI2luY2x1ZGUgICAgIkxWUFNBX1ByaXZhdGUuaCIKICNpbmNsdWRlICAgICJJbnN0QWxsb2MuaCIKQEAgLTI0LDE0ICsyNSwxNCBAQAogLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluaXRpYWxpemUgdGhlIExWUFNBIG1vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDcmVhdGUgYW5kIEluaXRpYWxpemUgdGhlIExWUFNBIG1vZHVsZSBpbmNsdWRpbmcgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcGhJbnN0YW5jZSAgICAgICAgICBQb2ludGVyIHRvIHBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBJbml0UGFyYW1zICAgICAgICAgIEluaXQgcGFyYW1ldGVycyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgQ29udHJvbFBhcmFtcyAgICAgICBDb250cm9sIHBhcmFtZXRlcnMgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNZW1vcnlUYWJsZSAgICAgICAgTWVtb3J5IHRhYmxlIHRoYXQgY29udGFpbnMgbWVtb3J5IGFyZWFzIGRlZmluaXRpb24gICAgICAgICAgKi8KKy8qICBwU2NyYXRjaCAgICAgICAgICAgIFBvaW50ZXIgdG8gYnVuZGxlIHNjcmF0Y2ggbWVtb3J5IGFyZWEgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zOSwxMCArNDAsMTAgQEAKIC8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUFNBX1JFVFVSTiBMVlBTQV9Jbml0ICAgICAgICAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgICAgICAgICAqcGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0luaXRQYXJhbXNfdCAgICAgICAgICAqcEluaXRQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAgKnBDb250cm9sUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfTWVtVGFiX3QgICAgICAgICAgICAgICpwTWVtb3J5VGFibGUgKQorTFZQU0FfUkVUVVJOIExWUFNBX0luaXQocExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgICpwaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfSW5pdFBhcmFtc190ICAgICAgICAgICpwSW5pdFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICAqcENvbnRyb2xQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnBTY3JhdGNoKQogewogICAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgICAqcExWUFNBX0luc3Q7CiAgICAgTFZQU0FfUkVUVVJOICAgICAgICAgICAgICAgIGVycm9yQ29kZSAgICAgICA9IExWUFNBX09LOwpAQCAtNTAsNjQgKzUxLDE1IEBACiAgICAgZXh0ZXJuIExWTV9GTE9BVCAgICAgICAgICAgIExWUFNBX0Zsb2F0X0dhaW5UYWJsZVtdOwogICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBCdWZmZXJMZW5ndGggPSAwOwogCi0gICAgLyogSW50c19BbGxvYyBpbnN0YW5jZXMsIG5lZWRlZCBmb3IgbWVtb3J5IGFsaWdubWVudCBtYW5hZ2VtZW50ICovCi0gICAgSU5TVF9BTExPQyAgICAgICAgICBJbnN0YW5jZTsKLSAgICBJTlNUX0FMTE9DICAgICAgICAgIFNjcmF0Y2g7Ci0gICAgSU5TVF9BTExPQyAgICAgICAgICBEYXRhOwotICAgIElOU1RfQUxMT0MgICAgICAgICAgQ29lZjsKLQotICAgIC8qIENoZWNrIHBhcmFtZXRlcnMgKi8KLSAgICBpZigocGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBJbml0UGFyYW1zID09IExWTV9OVUxMKSB8fCAocENvbnRyb2xQYXJhbXMgPT0gTFZNX05VTEwpIHx8IChwTWVtb3J5VGFibGUgPT0gTFZNX05VTEwpKQotICAgIHsKLSAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKLSAgICB9Ci0gICAgaWYoIChwSW5pdFBhcmFtcy0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24gPiBMVlBTQV9NQVhCVUZGRVJEVVJBVElPTikgICB8fAotICAgICAgICAocEluaXRQYXJhbXMtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uID09IDApICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgKHBJbml0UGFyYW1zLT5NYXhJbnB1dEJsb2NrU2l6ZSA+IExWUFNBX01BWElOUFVUQkxPQ0tTSVpFKSAgICAgIHx8Ci0gICAgICAgIChwSW5pdFBhcmFtcy0+TWF4SW5wdXRCbG9ja1NpemUgPT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAocEluaXRQYXJhbXMtPm5CYW5kcyA8IExWUFNBX05CQU5EU01JTikgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgKHBJbml0UGFyYW1zLT5uQmFuZHMgPiBMVlBTQV9OQkFORFNNQVgpICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgIChwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXMgPT0gMCkpCi0gICAgewotICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfSU5WQUxJRFBBUkFNKTsKLSAgICB9Ci0gICAgZm9yKGlpID0gMDsgaWkgPCBwSW5pdFBhcmFtcy0+bkJhbmRzOyBpaSsrKQotICAgIHsKLSAgICAgICAgaWYoKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uQ2VudGVyRnJlcXVlbmN5ID4gTFZQU0FfTUFYQ0VOVEVSRlJFUSkgfHwKLSAgICAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uUG9zdEdhaW4gICAgICAgID4gTFZQU0FfTUFYUE9TVEdBSU4pICAgfHwKLSAgICAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uUG9zdEdhaW4gICAgICAgIDwgTFZQU0FfTUlOUE9TVEdBSU4pICAgfHwKLSAgICAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uUUZhY3RvciA8IExWUFNBX01JTlFGQUNUT1IpICAgICAgICAgICAgfHwKLSAgICAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uUUZhY3RvciA+IExWUFNBX01BWFFGQUNUT1IpKQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX0lOVkFMSURQQVJBTSk7Ci0gICAgICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKkluc3RfQWxsb2MgaW5zdGFuY2VzIGluaXRpYWxpemF0aW9uICovCi0gICAgSW5zdEFsbG9jX0luaXQoICZJbnN0YW5jZSAgICwgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX0lOU1RBTkNFXS5wQmFzZUFkZHJlc3MpOwotICAgIEluc3RBbGxvY19Jbml0KCAmU2NyYXRjaCAgICAsIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3MpOwotICAgIEluc3RBbGxvY19Jbml0KCAmRGF0YSAgICAgICAsIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLnBCYXNlQWRkcmVzcyk7Ci0gICAgSW5zdEFsbG9jX0luaXQoICZDb2VmICAgICAgICwgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0ucEJhc2VBZGRyZXNzKTsKLQogICAgIC8qIFNldCB0aGUgaW5zdGFuY2UgaGFuZGxlIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpc2VkICovCisgICAgKnBoSW5zdGFuY2UgPSBjYWxsb2MoMSwgc2l6ZW9mKCpwTFZQU0FfSW5zdCkpOwogICAgIGlmICgqcGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkKICAgICB7Ci0gICAgICAgICpwaEluc3RhbmNlID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBzaXplb2YoTFZQU0FfSW5zdGFuY2VQcl90KSApOworICAgICAgICByZXR1cm4gTFZQU0FfRVJST1JfTlVMTEFERFJFU1M7CiAgICAgfQogICAgIHBMVlBTQV9JbnN0ID0oTFZQU0FfSW5zdGFuY2VQcl90KikqcGhJbnN0YW5jZTsKIAotICAgIC8qIENoZWNrIHRoZSBtZW1vcnkgdGFibGUgZm9yIE5VTEwgcG9pbnRlcnMgKi8KLSAgICBmb3IgKGlpID0gMDsgaWkgPCBMVlBTQV9OUl9NRU1PUllfUkVHSU9OUzsgaWkrKykKLSAgICB7Ci0gICAgICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltpaV0uU2l6ZSE9MCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW2lpXS5wQmFzZUFkZHJlc3M9PUxWTV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9OVUxMQUREUkVTUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwTFZQU0FfSW5zdC0+TWVtb3J5VGFibGUuUmVnaW9uW2lpXSA9IHBNZW1vcnlUYWJsZS0+UmVnaW9uW2lpXTsKLSAgICAgICAgfQotICAgIH0KKyAgICBwTFZQU0FfSW5zdC0+cFNjcmF0Y2ggPSBwU2NyYXRjaDsKIAogICAgIC8qIEluaXRpYWxpemUgbW9kdWxlJ3MgaW50ZXJuYWwgcGFyYW1ldGVycyAqLwogICAgIHBMVlBTQV9JbnN0LT5iQ29udHJvbFBlbmRpbmcgPSBMVk1fRkFMU0U7CkBAIC0xMzcsMzEgKzg5LDYxIEBACiAgICAgfQogCiAgICAgLyogQXNzaWduIHRoZSBwb2ludGVycyAqLwotICAgIHBMVlBTQV9JbnN0LT5wUG9zdEdhaW5zICAgICAgICAgICAgID0KLSAgICAgICAgKExWTV9GTE9BVCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWTV9GTE9BVCkpOwotICAgIHBMVlBTQV9JbnN0LT5wRmlsdGVyc1BhcmFtcyAgICAgICAgICAgICA9IChMVlBTQV9GaWx0ZXJQYXJhbV90ICopCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWUFNBX0ZpbHRlclBhcmFtX3QpKTsKLSAgICBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0ICAgPSAoTFZNX1VJTlQ4ICopCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyTGVuZ3RoICogc2l6ZW9mKExWTV9VSU5UOCkpOwotICAgIHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrcyAgICAgICAgICAgICA9IChMVk1fVUlOVDggKikKLSAgICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWTV9VSU5UOCkpOwotICAgIHBMVlBTQV9JbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uICAgICAgICA9IChMVlBTQV9CUEZpbHRlclByZWNpc2lvbl9lbiAqKQotICAgICAgICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWUFNBX0JQRmlsdGVyUHJlY2lzaW9uX2VuKSk7Ci0gICAgcExWUFNBX0luc3QtPnBCUF9JbnN0YW5jZXMgICAgICAgICAgPSAoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgKikKLSAgICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkNvZWYsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSk7Ci0gICAgcExWUFNBX0luc3QtPnBRUERfU3RhdGVzICAgICAgICAgICAgPSAoUVBEX0ZMT0FUX1N0YXRlX3QgKikKLSAgICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkNvZWYsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFFQRF9GTE9BVF9TdGF0ZV90KSk7Ci0KLSAgICBwTFZQU0FfSW5zdC0+cEJQX1RhcHMgICAgICAgICAgICAgICA9IChCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAqKQotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZEYXRhLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QpKTsKLSAgICBwTFZQU0FfSW5zdC0+cFFQRF9UYXBzICAgICAgICAgICAgICA9IChRUERfRkxPQVRfVGFwc190ICopCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkRhdGEsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFFQRF9GTE9BVF9UYXBzX3QpKTsKKyAgICBwTFZQU0FfSW5zdC0+cFBvc3RHYWlucyA9IChMVk1fRkxPQVQgKikKKyAgICAgICAgICAgICAgICAgICAgY2FsbG9jKHBJbml0UGFyYW1zLT5uQmFuZHMsIHNpemVvZigqKHBMVlBTQV9JbnN0LT5wUG9zdEdhaW5zKSkpOworICAgIGlmIChwTFZQU0FfSW5zdC0+cFBvc3RHYWlucyA9PSBMVk1fTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBMVlBTQV9FUlJPUl9OVUxMQUREUkVTUzsKKyAgICB9CisgICAgcExWUFNBX0luc3QtPnBGaWx0ZXJzUGFyYW1zID0gKExWUFNBX0ZpbHRlclBhcmFtX3QgKikKKyAgICAgICAgICAgICAgICAgICAgY2FsbG9jKHBJbml0UGFyYW1zLT5uQmFuZHMsIHNpemVvZigqKHBMVlBTQV9JbnN0LT5wRmlsdGVyc1BhcmFtcykpKTsKKyAgICBpZiAocExWUFNBX0luc3QtPnBGaWx0ZXJzUGFyYW1zID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWUFNBX0VSUk9SX05VTExBRERSRVNTOworICAgIH0KKyAgICBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0ID0gKExWTV9VSU5UOCAqKQorICAgICAgICAgICAgICAgICAgICBjYWxsb2MocEluaXRQYXJhbXMtPm5CYW5kcywgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoKihwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0KSkpOworICAgIGlmIChwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0ID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWUFNBX0VSUk9SX05VTExBRERSRVNTOworICAgIH0KKyAgICBwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3MgPSAoTFZNX1VJTlQ4ICopCisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsb2MocEluaXRQYXJhbXMtPm5CYW5kcywgc2l6ZW9mKCoocExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzKSkpOworICAgIGlmIChwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3MgPT0gTFZNX05VTEwpCisgICAgeworICAgICAgICByZXR1cm4gTFZQU0FfRVJST1JfTlVMTEFERFJFU1M7CisgICAgfQorICAgIHBMVlBTQV9JbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uID0gKExWUFNBX0JQRmlsdGVyUHJlY2lzaW9uX2VuICopCisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsb2MocEluaXRQYXJhbXMtPm5CYW5kcywgc2l6ZW9mKCoocExWUFNBX0luc3QtPnBCUEZpbHRlcnNQcmVjaXNpb24pKSk7CisgICAgaWYgKHBMVlBTQV9JbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWUFNBX0VSUk9SX05VTExBRERSRVNTOworICAgIH0KKyAgICBwTFZQU0FfSW5zdC0+cEJQX0luc3RhbmNlcyA9IChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAqKQorICAgICAgICAgICAgICAgICAgICAgICAgY2FsbG9jKHBJbml0UGFyYW1zLT5uQmFuZHMsIHNpemVvZigqKHBMVlBTQV9JbnN0LT5wQlBfSW5zdGFuY2VzKSkpOworICAgIGlmIChwTFZQU0FfSW5zdC0+cEJQX0luc3RhbmNlcyA9PSBMVk1fTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBMVlBTQV9FUlJPUl9OVUxMQUREUkVTUzsKKyAgICB9CisgICAgcExWUFNBX0luc3QtPnBRUERfU3RhdGVzID0gKFFQRF9GTE9BVF9TdGF0ZV90ICopCisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsb2MocEluaXRQYXJhbXMtPm5CYW5kcywgc2l6ZW9mKCoocExWUFNBX0luc3QtPnBRUERfU3RhdGVzKSkpOworICAgIGlmIChwTFZQU0FfSW5zdC0+cFFQRF9TdGF0ZXMgPT0gTFZNX05VTEwpCisgICAgeworICAgICAgICByZXR1cm4gTFZQU0FfRVJST1JfTlVMTEFERFJFU1M7CisgICAgfQorICAgIHBMVlBTQV9JbnN0LT5wQlBfVGFwcyA9IChCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAqKQorICAgICAgICAgICAgICAgICAgICAgICAgY2FsbG9jKHBJbml0UGFyYW1zLT5uQmFuZHMsIHNpemVvZigqKHBMVlBTQV9JbnN0LT5wQlBfVGFwcykpKTsKKyAgICBpZiAocExWUFNBX0luc3QtPnBCUF9UYXBzID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWUFNBX0VSUk9SX05VTExBRERSRVNTOworICAgIH0KKyAgICBwTFZQU0FfSW5zdC0+cFFQRF9UYXBzID0gKFFQRF9GTE9BVF9UYXBzX3QgKikKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxvYyhwSW5pdFBhcmFtcy0+bkJhbmRzLCBzaXplb2YoKihwTFZQU0FfSW5zdC0+cFFQRF9UYXBzKSkpOworICAgIGlmIChwTFZQU0FfSW5zdC0+cFFQRF9UYXBzID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWUFNBX0VSUk9SX05VTExBRERSRVNTOworICAgIH0KIAogICAgIC8qIENvcHkgZmlsdGVycyBwYXJhbWV0ZXJzIGluIHRoZSBwcml2YXRlIGluc3RhbmNlICovCiAgICAgZm9yKGlpID0gMDsgaWkgPCBwTFZQU0FfSW5zdC0+bkJhbmRzOyBpaSsrKQpAQCAtMTk1LDMgKzE3Nyw2MCBAQAogICAgIHJldHVybihlcnJvckNvZGUpOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0RlSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZyZWUgdGhlIG1lbW9yaWVzIGNyZWF0ZWQgaW4gTFZQU0FfSW5pdCBjYWxsIGluY2x1ZGluZyBpbnN0YW5jZSBoYW5kbGUgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwaEluc3RhbmNlICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZQU0FfRGVJbml0KHBMVlBTQV9IYW5kbGVfdCAqcGhJbnN0YW5jZSkKK3sKKyAgICBMVlBTQV9JbnN0YW5jZVByX3QgKnBMVlBTQV9JbnN0ID0gKExWUFNBX0luc3RhbmNlUHJfdCAqKSpwaEluc3RhbmNlOworICAgIGlmIChwTFZQU0FfSW5zdCA9PSBMVk1fTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChwTFZQU0FfSW5zdC0+cFBvc3RHYWlucyAhPSBMVk1fTlVMTCkgeworICAgICAgICBmcmVlKHBMVlBTQV9JbnN0LT5wUG9zdEdhaW5zKTsKKyAgICAgICAgcExWUFNBX0luc3QtPnBQb3N0R2FpbnMgPSBMVk1fTlVMTDsKKyAgICB9CisgICAgaWYgKHBMVlBTQV9JbnN0LT5wRmlsdGVyc1BhcmFtcyAhPSBMVk1fTlVMTCkgeworICAgICAgICBmcmVlKHBMVlBTQV9JbnN0LT5wRmlsdGVyc1BhcmFtcyk7CisgICAgICAgIHBMVlBTQV9JbnN0LT5wRmlsdGVyc1BhcmFtcyA9IExWTV9OVUxMOworICAgIH0KKyAgICBpZiAocExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydCAhPSBMVk1fTlVMTCkgeworICAgICAgICBmcmVlKHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQpOworICAgICAgICBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0ID0gTFZNX05VTEw7CisgICAgfQorICAgIGlmIChwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3MgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgZnJlZShwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3MpOworICAgICAgICBwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3MgPSBMVk1fTlVMTDsKKyAgICB9CisgICAgaWYgKHBMVlBTQV9JbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uICE9IExWTV9OVUxMKSB7CisgICAgICAgIGZyZWUocExWUFNBX0luc3QtPnBCUEZpbHRlcnNQcmVjaXNpb24pOworICAgICAgICBwTFZQU0FfSW5zdC0+cEJQRmlsdGVyc1ByZWNpc2lvbiA9IExWTV9OVUxMOworICAgIH0KKyAgICBpZiAocExWUFNBX0luc3QtPnBCUF9JbnN0YW5jZXMgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgZnJlZShwTFZQU0FfSW5zdC0+cEJQX0luc3RhbmNlcyk7CisgICAgICAgIHBMVlBTQV9JbnN0LT5wQlBfSW5zdGFuY2VzID0gTFZNX05VTEw7CisgICAgfQorICAgIGlmIChwTFZQU0FfSW5zdC0+cFFQRF9TdGF0ZXMgIT0gTFZNX05VTEwpIHsKKyAgICAgICAgZnJlZShwTFZQU0FfSW5zdC0+cFFQRF9TdGF0ZXMpOworICAgICAgICBwTFZQU0FfSW5zdC0+cFFQRF9TdGF0ZXMgPSBMVk1fTlVMTDsKKyAgICB9CisgICAgaWYgKHBMVlBTQV9JbnN0LT5wQlBfVGFwcyAhPSBMVk1fTlVMTCkgeworICAgICAgICBmcmVlKHBMVlBTQV9JbnN0LT5wQlBfVGFwcyk7CisgICAgICAgIHBMVlBTQV9JbnN0LT5wQlBfVGFwcyA9IExWTV9OVUxMOworICAgIH0KKyAgICBpZiAocExWUFNBX0luc3QtPnBRUERfVGFwcyAhPSBMVk1fTlVMTCkgeworICAgICAgICBmcmVlKHBMVlBTQV9JbnN0LT5wUVBEX1RhcHMpOworICAgICAgICBwTFZQU0FfSW5zdC0+cFFQRF9UYXBzID0gTFZNX05VTEw7CisgICAgfQorICAgIGZyZWUocExWUFNBX0luc3QpOworICAgICpwaEluc3RhbmNlID0gTFZNX05VTEw7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9NZW1vcnkuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX01lbW9yeS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhZmNiZTYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX01lbW9yeS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgICAgIkxWUFNBLmgiCi0jaW5jbHVkZSAgICAiTFZQU0FfUHJpdmF0ZS5oIgotI2luY2x1ZGUgICAgIkluc3RBbGxvYy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWRVFOQl9NZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuIEl0IGNhbiBiZSBjYWxsZWQgaW4gICAgICAgICAgICovCi0vKiAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICBoSW5zdGFuY2UgPSBOVUxMICAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYmFzZSBhZGRyZXNzZXMgZm9yIHRoZSBpbnN0YW5jZSAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSB0aGUgbWVtb3J5ICAgICAgKi8KLS8qICBiYXNlIGFkZHJlc3MgcG9pbnRlcnMgYXJlIE5VTEwgb24gcmV0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlIChoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUpIHRoZSBtZW1vcnkgICAgICAgKi8KLS8qICB0YWJsZSByZXR1cm5zIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBiYXNlIGFkZHJlc3NlcyB1c2VkIGR1cmluZyBpbml0aWFsaXNhdGlvbi4gICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICovCi0vKiAgSW5pdFBhcmFtcyAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgaW5pdCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUFNBX1JFVFVSTiBMVlBTQV9NZW1vcnkgICAgICAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9NZW1UYWJfdCAgICAgICAgICAgICAqcE1lbW9yeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfSW5pdFBhcmFtc190ICAgICAgICAgKnBJbml0UGFyYW1zICAgICkKLXsKLSAgICBMVk1fVUlOVDMyICAgICAgICAgIGlpOwotICAgIExWTV9VSU5UMzIgICAgICAgICAgQnVmZmVyTGVuZ3RoOwotICAgIElOU1RfQUxMT0MgICAgICAgICAgSW5zdGFuY2U7Ci0gICAgSU5TVF9BTExPQyAgICAgICAgICBTY3JhdGNoOwotICAgIElOU1RfQUxMT0MgICAgICAgICAgRGF0YTsKLSAgICBJTlNUX0FMTE9DICAgICAgICAgIENvZWY7Ci0gICAgTFZQU0FfSW5zdGFuY2VQcl90ICpwTFZQU0FfSW5zdCA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKLQotICAgIEluc3RBbGxvY19Jbml0KCAmSW5zdGFuY2UgICAsIExWTV9OVUxMKTsKLSAgICBJbnN0QWxsb2NfSW5pdCggJlNjcmF0Y2ggICAgLCBMVk1fTlVMTCk7Ci0gICAgSW5zdEFsbG9jX0luaXQoICZEYXRhICAgICAgICwgTFZNX05VTEwpOwotICAgIEluc3RBbGxvY19Jbml0KCAmQ29lZiAgICAgICAsIExWTV9OVUxMKTsKLQotICAgIGlmKChwTWVtb3J5VGFibGUgPT0gTFZNX05VTEwpIHx8IChwSW5pdFBhcmFtcyA9PSBMVk1fTlVMTCkpCi0gICAgewotICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogRmlsbCBpbiB0aGUgbWVtb3J5IHRhYmxlCi0gICAgICovCi0gICAgaWYgKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkKLSAgICB7Ci0KLSAgICAgICAgLyogQ2hlY2sgaW5pdCBwYXJhbWV0ZXIgKi8KLSAgICAgICAgaWYoIChwSW5pdFBhcmFtcy0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24gPiBMVlBTQV9NQVhCVUZGRVJEVVJBVElPTikgICB8fAotICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbiA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAocEluaXRQYXJhbXMtPk1heElucHV0QmxvY2tTaXplID4gTFZQU0FfTUFYSU5QVVRCTE9DS1NJWkUpICAgICAgfHwKLSAgICAgICAgICAgIChwSW5pdFBhcmFtcy0+TWF4SW5wdXRCbG9ja1NpemUgPT0gMCkgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5uQmFuZHMgPCBMVlBTQV9OQkFORFNNSU4pICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAocEluaXRQYXJhbXMtPm5CYW5kcyA+IExWUFNBX05CQU5EU01BWCkgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgIChwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXMgPT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9JTlZBTElEUEFSQU0pOwotICAgICAgICB9Ci0gICAgICAgIGZvcihpaSA9IDA7IGlpIDwgcEluaXRQYXJhbXMtPm5CYW5kczsgaWkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYoKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uQ2VudGVyRnJlcXVlbmN5ID4gTFZQU0FfTUFYQ0VOVEVSRlJFUSkgfHwKLSAgICAgICAgICAgICAgIChwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldLlBvc3RHYWluICAgICAgICA+IExWUFNBX01BWFBPU1RHQUlOKSAgIHx8Ci0gICAgICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5Qb3N0R2FpbiAgICAgICAgPCBMVlBTQV9NSU5QT1NUR0FJTikgICB8fAotICAgICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uUUZhY3RvciA8IExWUFNBX01JTlFGQUNUT1IpICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgIChwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldLlFGYWN0b3IgPiBMVlBTQV9NQVhRRkFDVE9SKSkKLSAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX0lOVkFMSURQQVJBTSk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBJbnN0YW5jZSBtZW1vcnkKLSAgICAgICAgICovCi0KLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBzaXplb2YoTFZQU0FfSW5zdGFuY2VQcl90KSApOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZNX0ZMT0FUKSApOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoTFZQU0FfRmlsdGVyUGFyYW1fdCkgKTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBmb3IgYXZvaWRpbmcgUUFDIHdhcm5pbmdzIGFzIE1VTDMyeDMySU5UTzMyIHdvcmtzIG9uIExWTV9JTlQzMiBvbmx5Ki8KLSAgICAgICAgICAgIExWTV9JTlQzMiBTREJEPShMVk1fSU5UMzIpcEluaXRQYXJhbXMtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uOwotICAgICAgICAgICAgTFZNX0lOVDMyIElSVEk9KExWTV9JTlQzMilMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lSW52OwotICAgICAgICAgICAgTFZNX0lOVDMyIEJMOwotCi0gICAgICAgICAgICBNVUwzMngzMklOVE8zMihTREJELElSVEksQkwsTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZVNoaWZ0KQotICAgICAgICAgICAgQnVmZmVyTGVuZ3RoPShMVk1fVUlOVDMyKUJMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoKEJ1ZmZlckxlbmd0aCAqIExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWUpICE9IHBJbml0UGFyYW1zLT5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgQnVmZmVyTGVuZ3RoKys7Ci0gICAgICAgIH0KLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogQnVmZmVyTGVuZ3RoICogc2l6ZW9mKExWTV9VSU5UOCkgKTsKLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWTV9VSU5UOCkgKTsKLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWUFNBX0JQRmlsdGVyUHJlY2lzaW9uX2VuKSApOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fSU5TVEFOQ0VdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmSW5zdGFuY2UpOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fSU5TVEFOQ0VdLlR5cGUgICAgICAgICA9IExWUFNBX1BFUlNJU1RFTlQ7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9JTlNUQU5DRV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2NyYXRjaCBtZW1vcnkKLSAgICAgICAgICovCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZTY3JhdGNoLCAyICogcEluaXRQYXJhbXMtPk1heElucHV0QmxvY2tTaXplICogc2l6ZW9mKExWTV9GTE9BVCkgKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1NDUkFUQ0hdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmU2NyYXRjaCk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9TQ1JBVENIXS5UeXBlICAgICAgICAgPSBMVlBTQV9TQ1JBVENIOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogUGVyc2lzdGVudCBjb2VmZmljaWVudHMgbWVtb3J5Ci0gICAgICAgICAqLwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmQ29lZiwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCkgKTsKLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkNvZWYsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoUVBEX0ZMT0FUX1N0YXRlX3QpICk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmQ29lZik7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlR5cGUgICAgICAgICA9IExWUFNBX1BFUlNJU1RFTlRfQ09FRjsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogUGVyc2lzdGVudCBkYXRhIG1lbW9yeQotICAgICAgICAgKi8KLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkRhdGEsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QpICk7Ci0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZEYXRhLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKFFQRF9GTE9BVF9UYXBzX3QpICk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmRGF0YSk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlR5cGUgICAgICAgICA9IExWUFNBX1BFUlNJU1RFTlRfREFUQTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogUmVhZCBiYWNrIG1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCi0gICAgICAgICpwTWVtb3J5VGFibGUgPSBwTFZQU0FfSW5zdC0+TWVtb3J5VGFibGU7Ci0gICAgfQotCi0gICAgcmV0dXJuKExWUFNBX09LKTsKLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcml2YXRlLmgKaW5kZXggNjE5ODdiNS4uZmM2N2E3NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJpdmF0ZS5oCkBAIC0yNywxNiArMjcsNiBAQAogICAgQ09OU1RBTlQgREVGSU5JVElPTlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0vKiBNZW1vcnkgKi8KLSNkZWZpbmUgTFZQU0FfSU5TVEFOQ0VfQUxJR04gICAgICAgICAgICAgNCAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIHN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTFZQU0FfU0NSQVRDSF9BTElHTiAgICAgICAgICAgICAgNCAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGxvbmcgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTFZQU0FfQ09FRl9BTElHTiAgICAgICAgICAgICAgICAgNCAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGxvbmcgd29yZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSNkZWZpbmUgTFZQU0FfREFUQV9BTElHTiAgICAgICAgICAgICAgICAgNCAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGxvbmcgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQotI2RlZmluZSBMVlBTQV9NRU1SRUdJT05fSU5TVEFOQ0UgICAgICAgICAwICAgICAgLyogT2Zmc2V0IHRvIGluc3RhbmNlIG1lbW9yeSByZWdpb24gaW4gbWVtb3J5IHRhYmxlICAgICAgICAgICAgICAgICAqLwotI2RlZmluZSBMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGICAxICAgICAgLyogT2Zmc2V0IHRvIHBlcnNpc3RlbnQgY29lZmZpY2llbnRzICBtZW1vcnkgcmVnaW9uIGluIG1lbW9yeSB0YWJsZSAqLwotI2RlZmluZSBMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBICAyICAgICAgLyogT2Zmc2V0IHRvIHBlcnNpc3RlbnQgdGFwcyAgbWVtb3J5IHJlZ2lvbiBpbiBtZW1vcnkgdGFibGUgICAgICAgICAqLwotI2RlZmluZSBMVlBTQV9NRU1SRUdJT05fU0NSQVRDSCAgICAgICAgICAzICAgICAgLyogT2Zmc2V0IHRvIHNjcmF0Y2ggIG1lbW9yeSByZWdpb24gaW4gbWVtb3J5IHRhYmxlICAgICAgICAgICAgICAgICAqLwogI2RlZmluZSBMVlBTQV9OUl9TVVBQT1JURURfUkFURSAgICAgICAgICAxMyAgICAgIC8qIEZyb20gODAwMEh6IHRvIDE5MjAwMEh6Ki8KICNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1NQRUVEICAgICAgICAgMyAgICAgIC8qIExPVywgTUVESVVNLCBISUdIICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIApAQCAtODIsNyArNzIsOCBAQAogCiAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgIEN1cnJlbnRQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBwYXJhbWV0ZXJzIG9mIHRoZSBtb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgIE5ld1BhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5ldyBjb250cm9sIHBhcmFtZXRlcnMgZ2l2ZW4gYnkgdGhlIHVzZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgTFZQU0FfTWVtVGFiX3QgICAgICAgICAgICAgIE1lbW9yeVRhYmxlOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAqcFNjcmF0Y2g7CisgICAgLyogUG9pbnRlciB0byBidW5kbGUgc2NyYXRjaCBidWZmZXIgKi8KIAogICAgIExWUFNBX0JQRmlsdGVyUHJlY2lzaW9uX2VuICpwQlBGaWx0ZXJzUHJlY2lzaW9uOyAgICAgICAgICAgICAgICAvKiBQb2ludHMgYSBuQmFuZHMgZWxlbWVudHMgYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZmlsdGVyIHByZWNpc2lvbiBmb3IgZWFjaCBiYW5kICAgICAgICAgICAgICAqLwogICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgICpwQlBfSW5zdGFuY2VzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1Byb2Nlc3MuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1Byb2Nlc3MuY3BwCmluZGV4IDgxYTg4YzUuLmI0ZDExMWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcm9jZXNzLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJvY2Vzcy5jcHAKQEAgLTc5LDggKzc5LDcgQEAKICAgICB7CiAgICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9JTlZBTElEUEFSQU0pOwogICAgIH0KLQotICAgIHBTY3JhdGNoID0gKExWTV9GTE9BVCopcExWUFNBX0luc3QtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzOworICAgIHBTY3JhdGNoID0gKExWTV9GTE9BVCopcExWUFNBX0luc3QtPnBTY3JhdGNoOwogICAgIHBXcml0ZV9TYXZlID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXI7CiAKICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliL0xWQ1MuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9saWIvTFZDUy5oCmluZGV4IDBhZGZkMWIuLjU4YmE4YWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9saWIvTFZDUy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9saWIvTFZDUy5oCkBAIC03MSwxMyArNzEsNiBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyogTWVtb3J5IHRhYmxlICovCi0jZGVmaW5lIExWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBICAgIDAgICAgLyogT2Zmc2V0IHRvIHRoZSBpbnN0YW5jZSBtZW1vcnkgcmVnaW9uICovCi0jZGVmaW5lIExWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBICAgIDEgICAgLyogT2Zmc2V0IHRvIHRoZSBwZXJzaXN0ZW50IGRhdGEgbWVtb3J5IHJlZ2lvbiAqLwotI2RlZmluZSBMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRiAgICAyICAgIC8qIE9mZnNldCB0byB0aGUgcGVyc2lzdGVudCBjb2VmZmljaWVudCBtZW1vcnkgcmVnaW9uICovCi0jZGVmaW5lIExWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUICAgICAgICAgIDMgICAgLyogT2Zmc2V0IHRvIHRlbXBvcmFyeSBtZW1vcnkgcmVnaW9uICovCi0jZGVmaW5lIExWQ1NfTlJfTUVNT1JZX1JFR0lPTlMgICAgICAgICAgICAgICAgIDQgICAgLyogTnVtYmVyIG9mIG1lbW9yeSByZWdpb25zICovCi0KIC8qIEVmZmVjdCBMZXZlbCAqLwogI2RlZmluZSBMVkNTX0VGRkVDVF9MT1cgICAgICAgICAgICAgICAgICAgIDE2Mzg0ICAgIC8qIEVmZmVjdCBzY2FsaW5nIDUwJSAqLwogI2RlZmluZSBMVkNTX0VGRkVDVF9NRURJVU0gICAgICAgICAgICAgICAgIDI0NTc2ICAgIC8qIEVmZmVjdCBzY2FsaW5nIDc1JSAqLwpAQCAtMTA0LDI0ICs5NywxMiBAQAogICAgIExWQ1NfTUFYID0gTFZNX01BWEVOVU0KIH0gTFZDU19Nb2Rlc19lbjsKIAotLyogTWVtb3J5IFR5cGVzICovCi10eXBlZGVmIGVudW0KLXsKLSAgICBMVkNTX1NDUkFUQ0ggICAgICAgID0gMCwKLSAgICBMVkNTX0RBVEEgICAgICAgICAgID0gMSwKLSAgICBMVkNTX0NPRUZGSUNJRU5UICAgID0gMiwKLSAgICBMVkNTX1BFUlNJU1RFTlQgICAgID0gMywKLSAgICBMVkNTX01FTU9SWVRZUEVfTUFYID0gTFZNX01BWEVOVU0KLX0gTFZDU19NZW1vcnlUeXBlc19lbjsKLQogLyogRnVuY3Rpb24gcmV0dXJuIHN0YXR1cyAqLwogdHlwZWRlZiBlbnVtCiB7CiAgICAgTFZDU19TVUNDRVNTICAgICAgICA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgLyogU3VjY2Vzc2Z1bCByZXR1cm4gZnJvbSBhIHJvdXRpbmUgKi8KLSAgICBMVkNTX0FMSUdOTUVOVEVSUk9SID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgYWxpZ25tZW50IGVycm9yICovCi0gICAgTFZDU19OVUxMQUREUkVTUyAgICA9IDIsICAgICAgICAgICAgICAgICAgICAgICAgLyogTlVMTCBhbGxvY2F0aW9uIGFkZHJlc3MgKi8KLSAgICBMVkNTX1RPT01BTllTQU1QTEVTID0gMywgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIGJsb2NrIHNpemUgZXhjZWVkZWQgKi8KLSAgICBMVkNTX0lOVkFMSURCVUZGRVIgID0gNCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnZhbGlkIGJ1ZmZlciBwcm9jZXNzaW5nIHJlcXVlc3QgKi8KKyAgICBMVkNTX05VTExBRERSRVNTICAgID0gMSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBOVUxMIGFsbG9jYXRpb24gYWRkcmVzcyAqLworICAgIExWQ1NfVE9PTUFOWVNBTVBMRVMgPSAyLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1heGltdW0gYmxvY2sgc2l6ZSBleGNlZWRlZCAqLwogICAgIExWQ1NfU1RBVFVTTUFYICAgICAgPSBMVk1fTUFYRU5VTQogfSBMVkNTX1JldHVyblN0YXR1c19lbjsKIApAQCAtMTY2LDIwICsxNDcsNiBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyogTWVtb3J5IHJlZ2lvbiBkZWZpbml0aW9uICovCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgIFNpemU7ICAgICAgICAgICAgICAgICAgIC8qIFJlZ2lvbiBzaXplIGluIGJ5dGVzICovCi0gICAgTFZDU19NZW1vcnlUeXBlc19lbiAgICAgVHlwZTsgICAgICAgICAgICAgICAgICAgLyogUmVnaW9uIHR5cGUgKi8KLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqcEJhc2VBZGRyZXNzOyAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSByZWdpb24gYmFzZSBhZGRyZXNzICovCi19IExWQ1NfTWVtb3J5UmVnaW9uX3Q7Ci0KLS8qIE1lbW9yeSB0YWJsZSBjb250YWluaW5nIHRoZSByZWdpb24gZGVmaW5pdGlvbnMgKi8KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZDU19NZW1vcnlSZWdpb25fdCBSZWdpb25bTFZDU19OUl9NRU1PUllfUkVHSU9OU107IC8qIE9uZSBkZWZpbml0aW9uIGZvciBlYWNoIHJlZ2lvbiAqLwotfSBMVkNTX01lbVRhYl90OwotCiAvKiBDb25jZXJ0IFNvdW5kIHBhcmFtZXRlciBzdHJ1Y3R1cmUgKi8KIHR5cGVkZWYgc3RydWN0CiB7CkBAIC0xOTAsOSArMTU3LDcgQEAKICAgICBMVk1fRnNfZW4gICAgICAgICAgICAgICBTYW1wbGVSYXRlOyAgICAgICAgICAgICAvKiBTYW1wbGluZyByYXRlICovCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgRWZmZWN0TGV2ZWw7ICAgICAgICAgICAgLyogRWZmZWN0IGxldmVsICovCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgUmV2ZXJiTGV2ZWw7ICAgICAgICAgICAgLyogUmV2ZXJiIGxldmVsIGluICUgKi8KLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgTnJDaGFubmVsczsKLSNlbmRpZgogfSBMVkNTX1BhcmFtc190OwogCiAvKiBDb25jZXJ0IFNvdW5kIENhcGFiaWxpdHkgc3RydWN0dXJlICovCkBAIC0yMTMsODIgKzE3OCw0NSBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX01lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlLiBJdCBjYW4gYmUgY2FsbGVkIGluICAgICAgICAgICAqLwotLyogIHR3byB3YXlzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgaEluc3RhbmNlID0gTlVMTCAgICAgICAgICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzICAgICAgICAgICAgICAgICAqLwotLyogICAgICBoSW5zdGFuY2UgPSBJbnN0YW5jZSBoYW5kbGUgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGJhc2UgYWRkcmVzc2VzIGZvciB0aGUgaW5zdGFuY2UgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIChoSW5zdGFuY2U9TlVMTCkgaXQgaXMgICAgICAgICAgICovCi0vKiAgcGFzc2VkIHRoZSBkZWZhdWx0IGNhcGFiaWxpdGllcywgb2YgdGhlc2Ugb25seSB0aGUgYnVmZmVyIHByb2Nlc3Npbmcgc2V0dGluZyBpcyAgICAgKi8KLS8qICB1c2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2hlbiBjYWxsZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIHRoZSBtZW1vcnkgYmFzZSBhZGRyZXNzIHBvaW50ZXJzIGFyZSBOVUxMIG9uICAgICAgKi8KLS8qICByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlIChoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUpIHRoZSAgICAgICAgICAgICAgKi8KLS8qICBjYXBhYmlsaXRpZXMgYXJlIGlnbm9yZWQgYW5kIHRoZSBtZW1vcnkgdGFibGUgcmV0dXJucyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhbmQgICAgICAqLwotLyogIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgKi8KLS8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBkZWZhdWx0IGNhcGFiaWxpdGVzICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWQ1NfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19NZW1vcnkoTFZDU19IYW5kbGVfdCAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX01lbVRhYl90ICAgICAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0NhcGFiaWxpdGllc190ICAgICpwQ2FwYWJpbGl0aWVzKTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDcmVhdGUgYW5kIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgQ29uY2VydCBTb3VuZCBtb2R1bGUgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW4gYWxnb3JpdGhtIGluc3RhbmNlIGJ5IGNhbGxpbmcgd2l0aCAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2Ugc2V0IHRvIE5VTEwuIEluIHRoaXMgY2FzZSB0aGUgYWxnb3JpdGhtIHJldHVybnMgdGhlIG5ldyBpbnN0YW5jZSAgICAgICAgICAqLwotLyogIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGZvcmNlIGEgZnVsbCByZS1pbml0aWFsaXNhdGlvbiBvZiB0aGUgYWxnb3JpdGhtICAgICAgICAqLwotLyogIGJ5IGNhbGxpbmcgd2l0aCBoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUuIEluIHRoaXMgY2FzZSB0aGUgbWVtb3J5IHRhYmxlICAgICAgICAgICovCi0vKiAgc2hvdWxkIGJlIGNvcnJlY3QgZm9yIHRoZSBpbnN0YW5jZSwgdGhpcyBjYW4gYmUgZW5zdXJlZCBieSBjYWxsaW5nIHRoZSBmdW5jdGlvbiAgICAgKi8KLS8qICBMVkNTX01lbW9yeSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gc3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVkNTX0FsaWdubWVudEVycm9yICAgICBJbnN0YW5jZSBvciBzY3JhdGNoIG1lbW9yeSBvbiBpbmNvcnJlY3QgYWxpZ25tZW50ICAgICAgICAgICAqLwotLyogIExWQ1NfTnVsbEFkZHJlc3MgICAgICAgIEluc3RhbmNlIG9yIHNjcmF0Y2ggbWVtb3J5IGhhcyBhIE5VTEwgcG9pbnRlciAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuICBUaGUgaW5zdGFuY2UgaGFuZGxlIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IG1lbW9yeSAgICAgICovCi0vKiAgICAgIHJlZ2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAyLiAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZDU19Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ3JlYXRlIGFuZCBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIENvbmNlcnQgU291bmQgbW9kdWxlICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgUG9pbnRlciB0byBpbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGNhcGFiaWxpdGllcyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwU2NyYXRjaCAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBzY3JhdGNoIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZEQkVfTlVMTEFERFJFU1MgICAgICAgT25lIG9yIG1vcmUgbWVtb3J5IGhhcyBhIE5VTEwgcG9pbnRlciAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWQ1NfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0luaXQoTFZDU19IYW5kbGVfdCAgICAgICAgICAgICpwaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfTWVtVGFiX3QgICAgICAgICAgICAqcE1lbW9yeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfQ2FwYWJpbGl0aWVzX3QgICAgICAqcENhcGFiaWxpdGllcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19DYXBhYmlsaXRpZXNfdCAgICAgICpwQ2FwYWJpbGl0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAqcFNjcmF0Y2gpOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX0RlSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBGcmVlIG1lbW9yaWVzIGNyZWF0ZWQgZHVyaW5nIHRoZSBMVkNTX0luaXQgY2FsbCBpbmNsdWRpbmcgaW5zdGFuY2UgaGFuZGxlICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwaEluc3RhbmNlICAgICAgICAgICAgICBQb2ludGVyIHRvIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZDU19Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZDU19EZUluaXQoTFZDU19IYW5kbGVfdCAgICAgICAgICAqcGhJbnN0YW5jZSk7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuY3BwCmluZGV4IDQzMWI3ZTMuLmFiYWRhZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuY3BwCkBAIC02NSwxMSArNjUsOCBAQAogICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICBDb2VmZnM7CiAgICAgY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAqcEVxdWFsaXNlckNvZWZUYWJsZTsKIAotICAgIHBEYXRhID0gKExWQ1NfRGF0YV90ICopIFwKLSAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzOwotCi0gICAgcENvZWZmaWNpZW50cyA9IChMVkNTX0NvZWZmaWNpZW50X3QgKikgXAotICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7CisgICAgcERhdGEgICAgICAgICA9IChMVkNTX0RhdGFfdCAqKXBJbnN0YW5jZS0+cERhdGE7CisgICAgcENvZWZmaWNpZW50cyA9IChMVkNTX0NvZWZmaWNpZW50X3QgKilwSW5zdGFuY2UtPnBDb2VmZjsKICAgICAvKgogICAgICAqIElmIHRoZSBzYW1wbGUgcmF0ZSBjaGFuZ2VzIHJlLWluaXRpYWxpc2UgdGhlIGZpbHRlcnMKICAgICAgKi8KQEAgLTE0NCw4ICsxNDEsNyBAQAogICAgIExWQ1NfRXF1YWxpc2VyX3QgICAgKnBDb25maWcgICA9IChMVkNTX0VxdWFsaXNlcl90ICAqKSZwSW5zdGFuY2UtPkVxdWFsaXNlcjsKICAgICBMVkNTX0NvZWZmaWNpZW50X3QgICpwQ29lZmZpY2llbnRzOwogCi0gICAgcENvZWZmaWNpZW50cyA9IChMVkNTX0NvZWZmaWNpZW50X3QgKikgXAotICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKKyAgICBwQ29lZmZpY2llbnRzID0gKExWQ1NfQ29lZmZpY2llbnRfdCAqKXBJbnN0YW5jZS0+cENvZWZmOwogCiAgICAgLyoKICAgICAgKiBDaGVjayBpZiB0aGUgZXF1YWxpc2VyIGlzIHJlcXVpcmVkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSW5pdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSW5pdC5jcHAKaW5kZXggNjMwZWNmNy4uMzEyODg1YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0luaXQuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Jbml0LmNwcApAQCAtMjAsOTkgKzIwLDExIEBACiAvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlICJMVkNTLmgiCiAjaW5jbHVkZSAiTFZDU19Qcml2YXRlLmgiCiAjaW5jbHVkZSAiTFZDU19UYWJsZXMuaCIKIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX01lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlLiBJdCBjYW4gYmUgY2FsbGVkIGluICAgICAgICAgICAqLwotLyogIHR3byB3YXlzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgaEluc3RhbmNlID0gTlVMTCAgICAgICAgICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzICAgICAgICAgICAgICAgICAqLwotLyogICAgICBoSW5zdGFuY2UgPSBJbnN0YW5jZSBoYW5kbGUgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGJhc2UgYWRkcmVzc2VzIGZvciB0aGUgaW5zdGFuY2UgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIChoSW5zdGFuY2U9TlVMTCkgaXQgaXMgICAgICAgICAgICovCi0vKiAgcGFzc2VkIHRoZSBkZWZhdWx0IGNhcGFiaWxpdGllcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdoZW4gY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiB0aGUgbWVtb3J5IGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiAgICAgICovCi0vKiAgcmV0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZnJlZSAoaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlKSB0aGUgICAgICAgICAgICAgICovCi0vKiAgY2FwYWJpbGl0aWVzIGFyZSBpZ25vcmVkIGFuZCB0aGUgbWVtb3J5IHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kICAgICAgKi8KLS8qICBiYXNlIGFkZHJlc3NlcyB1c2VkIGR1cmluZyBpbml0aWFsaXNhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICovCi0vKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgUG9pbnRlciB0byB0aGUgZGVmYXVsdCBjYXBhYmlsaXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkNTX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfTWVtb3J5KExWQ1NfSGFuZGxlX3QgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19NZW1UYWJfdCAgICAgICAgICAqcE1lbW9yeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19DYXBhYmlsaXRpZXNfdCAgICAqcENhcGFiaWxpdGllcykKLXsKLQotICAgIExWTV9VSU5UMzIgICAgICAgICAgU2NyYXRjaFNpemU7Ci0gICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAqKWhJbnN0YW5jZTsKLQotICAgIC8qCi0gICAgICogRmlsbCBpbiB0aGUgbWVtb3J5IHRhYmxlCi0gICAgICovCi0gICAgaWYgKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkKLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIEluc3RhbmNlIG1lbW9yeQotICAgICAgICAgKi8KLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUgICAgICAgICA9IChMVk1fVUlOVDMyKXNpemVvZihMVkNTX0luc3RhbmNlX3QpOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0uVHlwZSAgICAgICAgID0gTFZDU19QRVJTSVNURU5UOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogRGF0YSBtZW1vcnkKLSAgICAgICAgICovCi0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplICAgICAgICAgPSAoTFZNX1VJTlQzMilzaXplb2YoTFZDU19EYXRhX3QpOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0uVHlwZSAgICAgICAgID0gTFZDU19EQVRBOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ29lZmZpY2llbnQgbWVtb3J5Ci0gICAgICAgICAqLwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSAgICAgICAgID0gKExWTV9VSU5UMzIpc2l6ZW9mKExWQ1NfQ29lZmZpY2llbnRfdCk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5UeXBlICAgICAgICAgPSBMVkNTX0NPRUZGSUNJRU5UOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2NyYXRjaCBtZW1vcnkKLSAgICAgICAgICovCi0gICAgICAgIC8qIElucGxhY2UgcHJvY2Vzc2luZyAqLwotICAgICAgICBTY3JhdGNoU2l6ZSA9IChMVk1fVUlOVDMyKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAoTFZDU19TQ1JBVENIQlVGRkVSUyAqIHNpemVvZihMVk1fRkxPQVQpICogcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemUgICAgICAgICA9IFNjcmF0Y2hTaXplOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uVHlwZSAgICAgICAgID0gTFZDU19TQ1JBVENIOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFJlYWQgYmFjayBtZW1vcnkgYWxsb2NhdGlvbiB0YWJsZSAqLwotICAgICAgICAqcE1lbW9yeVRhYmxlID0gcEluc3RhbmNlLT5NZW1vcnlUYWJsZTsKLSAgICB9Ci0KLSAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKLX0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTIwLDQ2ICszMiwzOCBAQAogLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBDcmVhdGUgYW5kIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgQ29uY2VydCBTb3VuZCBtb2R1bGUgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuIGFsZ29yaXRobSBpbnN0YW5jZSBieSBjYWxsaW5nIHdpdGggICAgICAgKi8KLS8qICBoSW5zdGFuY2Ugc2V0IHRvIExWTV9OVUxMLiBJbiB0aGlzIGNhc2UgdGhlIGFsZ29yaXRobSByZXR1cm5zIHRoZSBuZXcgaW5zdGFuY2UgICovCi0vKiAgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGZvcmNlIGEgZnVsbCByZS1pbml0aWFsaXNhdGlvbiBvZiB0aGUgYWxnb3JpdGhtICAgICovCi0vKiAgYnkgY2FsbGluZyB3aXRoIGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZS4gSW4gdGhpcyBjYXNlIHRoZSBtZW1vcnkgdGFibGUgICAgICAqLwotLyogIHNob3VsZCBiZSBjb3JyZWN0IGZvciB0aGUgaW5zdGFuY2UsIHRoaXMgY2FuIGJlIGVuc3VyZWQgYnkgY2FsbGluZyB0aGUgZnVuY3Rpb24gKi8KLS8qICBMVkNTX01lbW9yeSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgIFBvaW50ZXIgdG8gaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBjYXBhYmlsaXRpZXMgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICovCisvKiAgcFNjcmF0Y2ggICAgICAgICAgICAgICAgUG9pbnRlciB0byBzY3JhdGNoIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gc3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWREJFX05VTExBRERSRVNTICAgICAgIE9uZSBvciBtb3JlIG1lbW9yeSBoYXMgYSBOVUxMIHBvaW50ZXIgLSBtYWxsb2MgZmFpbHVyZSAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuICBUaGUgaW5zdGFuY2UgaGFuZGxlIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IG1lbW9yeSAgKi8KLS8qICAgICAgcmVnaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMi4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWQ1NfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAqLwotLyogIDMuICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIHNhbWUgY2FwYWJpbGl0aWVzIGFzIHVzZWQgZm9yIHRoZSAgICAgKi8KLS8qICAgICAgY2FsbCB0byB0aGUgbWVtb3J5IGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWQ1NfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfSW5pdChMVkNTX0hhbmRsZV90ICAgICAgICAgKnBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19NZW1UYWJfdCAgICAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19DYXBhYmlsaXRpZXNfdCAgICpwQ2FwYWJpbGl0aWVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfQ2FwYWJpbGl0aWVzX3QgICAqcENhcGFiaWxpdGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgKnBTY3JhdGNoKQogewogCi0gICAgTFZDU19JbnN0YW5jZV90ICAgICAgICAgICAgICAgICAqcEluc3RhbmNlOwotICAgIExWQ1NfVm9sQ29ycmVjdF90ICAgICAgICAgICAgICAgKnBMVkNTX1ZvbENvcnJlY3RUYWJsZTsKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZTsKKyAgICBMVkNTX1ZvbENvcnJlY3RfdCAgKnBMVkNTX1ZvbENvcnJlY3RUYWJsZTsKIAogICAgIC8qCi0gICAgICogU2V0IHRoZSBpbnN0YW5jZSBoYW5kbGUgaWYgbm90IGFscmVhZHkgaW5pdGlhbGlzZWQKKyAgICAgKiBDcmVhdGUgdGhlIGluc3RhbmNlIGhhbmRsZSBpZiBub3QgYWxyZWFkeSBpbml0aWFsaXNlZAogICAgICAqLwogICAgIGlmICgqcGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkKICAgICB7Ci0gICAgICAgICpwaEluc3RhbmNlID0gKExWQ1NfSGFuZGxlX3QpcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzczsKKyAgICAgICAgKnBoSW5zdGFuY2UgPSBjYWxsb2MoMSwgc2l6ZW9mKCpwSW5zdGFuY2UpKTsKKyAgICB9CisgICAgaWYgKCpwaEluc3RhbmNlID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWQ1NfTlVMTEFERFJFU1M7CiAgICAgfQogICAgIHBJbnN0YW5jZSA9KExWQ1NfSW5zdGFuY2VfdCAgKikqcGhJbnN0YW5jZTsKIApAQCAtMTY4LDEwICs3Miw3IEBACiAgICAgICovCiAgICAgcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMgPSAqcENhcGFiaWxpdGllczsKIAotICAgIC8qCi0gICAgICogU2F2ZSB0aGUgbWVtb3J5IHRhYmxlIGluIHRoZSBpbnN0YW5jZSBzdHJ1Y3R1cmUKLSAgICAgKi8KLSAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlID0gKnBNZW1vcnlUYWJsZTsKKyAgICBwSW5zdGFuY2UtPnBTY3JhdGNoICAgICA9IHBTY3JhdGNoOwogCiAgICAgLyoKICAgICAgKiBTZXQgYWxsIGluaXRpYWwgcGFyYW1ldGVycyB0byBpbnZhbGlkIHRvIGZvcmNlIGEgZnVsbCBpbml0aWFsaXNhdGlvbgpAQCAtMjA4LDMgKzEwOSwzNSBAQAogICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwogfQogCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX0RlSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBGcmVlIG1lbW9yaWVzIGNyZWF0ZWQgZHVyaW5nIHRoZSBMVkNTX0luaXQgY2FsbCBpbmNsdWRpbmcgaW5zdGFuY2UgaGFuZGxlICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwaEluc3RhbmNlICAgICAgICAgICAgICBQb2ludGVyIHRvIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZDU19Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZDU19EZUluaXQoTFZDU19IYW5kbGVfdCAqcGhJbnN0YW5jZSkKK3sKKyAgICBMVkNTX0luc3RhbmNlX3QgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgKikqcGhJbnN0YW5jZTsKKyAgICBpZiAocEluc3RhbmNlID09IExWTV9OVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHBJbnN0YW5jZS0+cENvZWZmICE9IExWTV9OVUxMKSB7CisgICAgICAgIGZyZWUocEluc3RhbmNlLT5wQ29lZmYpOworICAgICAgICBwSW5zdGFuY2UtPnBDb2VmZiA9IExWTV9OVUxMOworICAgIH0KKyAgICBpZiAocEluc3RhbmNlLT5wRGF0YSAhPSBMVk1fTlVMTCkgeworICAgICAgICBmcmVlKHBJbnN0YW5jZS0+cERhdGEpOworICAgICAgICBwSW5zdGFuY2UtPnBEYXRhID0gTFZNX05VTEw7CisgICAgfQorICAgIGZyZWUocEluc3RhbmNlKTsKKyAgICAqcGhJbnN0YW5jZSA9IExWTV9OVUxMOworICAgIHJldHVybjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJpdmF0ZS5oCmluZGV4IDE1NGVhNTUuLjdhZGZiNTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1ByaXZhdGUuaApAQCAtNTQsMTIgKzU0LDcgQEAKICNkZWZpbmUgTFZDU19DT01QR0FJTkZSQU1FICAgICAgICAgIDY0ICAgICAgICAgIC8qIENvbXByZXNzb3IgZ2FpbiB1cGRhdGUgaW50ZXJ2YWwgKi8KIAogLyogTWVtb3J5ICovCi0jaWZkZWYgU1VQUE9SVF9NQwogI2RlZmluZSBMVkNTX1NDUkFUQ0hCVUZGRVJTICAgICAgICAgICAgICA4ICAgICAgLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLwotI2Vsc2UKLSNkZWZpbmUgTFZDU19TQ1JBVENIQlVGRkVSUyAgICAgICAgICAgICAgNiAgICAgIC8qIE51bWJlciBvZiBidWZmZXJzIHJlcXVpcmVkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KLSNlbmRpZgotI2lmZGVmIFNVUFBPUlRfTUMKIC8qCiAgKiBUaGUgQ29uY2VydCBTdXJyb3VuZCBtb2R1bGUgYXBwbGllcyBwcm9jZXNzaW5nIG9ubHkgb24gdGhlIGZpcnN0IHR3bwogICogY2hhbm5lbHMgb2YgYSBtdWx0aWNoYW5uZWwgaW5wdXQuIFRoZSBkYXRhIG9mIGZpcnN0IHR3byBjaGFubmVscyBpcyBjb3BpZWQKQEAgLTY3LDcgKzYyLDYgQEAKICAqIGFyZSB1c2VkIGZvciB0aGlzIHB1cnBvc2UKICAqLwogI2RlZmluZSBMVkNTX01DX1NDUkFUQ0hCVUZGRVJTICAgICAgICAgICAyCi0jZW5kaWYKIAogLyogR2VuZXJhbCAqLwogI2RlZmluZSBMVkNTX0lOVkFMSUQgICAgICAgICAgICAgICAgMHhGRkZGICAgICAgLyogSW52YWxpZCBpbml0IHBhcmFtZXRlciAqLwpAQCAtMTEwLDcgKzEwNCw2IEBACiB0eXBlZGVmIHN0cnVjdAogewogICAgIC8qIFB1YmxpYyBwYXJhbWV0ZXJzICovCi0gICAgTFZDU19NZW1UYWJfdCAgICAgICAgICAgTWVtb3J5VGFibGU7ICAgICAgICAvKiBJbnN0YW5jZSBtZW1vcnkgYWxsb2NhdGlvbiB0YWJsZSAqLwogICAgIExWQ1NfUGFyYW1zX3QgICAgICAgICAgIFBhcmFtczsgICAgICAgICAgICAgLyogSW5zdGFuY2UgcGFyYW1ldGVycyAqLwogICAgIExWQ1NfQ2FwYWJpbGl0aWVzX3QgICAgIENhcGFiaWxpdGllczsgICAgICAgLyogSW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzICovCiAKQEAgLTEzMyw2ICsxMjYsOSBAQAogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIGJUaW1lckRvbmU7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRpbWVyIGNvbXBsZXRpb24gZmxhZyAqLwogICAgIExWTV9UaW1lcl9QYXJhbXNfdCAgICAgIFRpbWVyUGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRpbWVyIHBhcmFtZXRlcnMgKi8KICAgICBMVk1fVGltZXJfSW5zdGFuY2VfdCAgICBUaW1lckluc3RhbmNlOyAgICAgICAgICAgICAgICAgICAgICAvKiBUaW1lciBpbnN0YW5jZSAqLworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICpwQ29lZmY7ICAgICAgICAgICAvKiBwb2ludGVyIHRvIGJ1ZmZlciBmb3IgZXF1YWxpc2VyIGZpbHRlciBjb2VmZnMgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqcERhdGE7ICAgICAgICAgICAgLyogcG9pbnRlciB0byBidWZmZXIgZm9yIGVxdWFsaXNlciBmaWx0ZXIgc3RhdGVzICovCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKnBTY3JhdGNoOyAgICAgICAgIC8qIFBvaW50ZXIgdG8gYnVuZGxlIHNjcmF0Y2ggYnVmZmVyICovCiAKIH0gTFZDU19JbnN0YW5jZV90OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jcHAKaW5kZXggOGUwOWJlMi4uNzJiNGM4YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcm9jZXNzLmNwcApAQCAtNzQsNyArNzQsNiBAQAogICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwogICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBTY3JhdGNoOwogICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuIGVycjsKLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcFN0SW47CiAgICAgTFZNX0lOVDMyICAgICAgICAgICBjaGFubmVscyA9IHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHM7CiAjZGVmaW5lIE5yRnJhbWVzIE51bVNhbXBsZXMgIC8vIGFsaWFzIGZvciBjbGFyaXR5CkBAIC04OSwxNSArODgsMTIgQEAKICAgICB7CiAgICAgICAgIGNoYW5uZWxzID0gMjsKICAgICB9Ci0jZW5kaWYKIAotICAgIHBTY3JhdGNoICA9IChMVk1fRkxPQVQgKikgXAotICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzczsKKyAgICBwU2NyYXRjaCAgPSAoTFZNX0ZMT0FUICopcEluc3RhbmNlLT5wU2NyYXRjaDsKIAogICAgIC8qCiAgICAgICogQ2hlY2sgaWYgdGhlIHByb2Nlc3NpbmcgaXMgaW5wbGFjZQogICAgICAqLwotI2lmZGVmIFNVUFBPUlRfTUMKICAgICAvKgogICAgICAqIFRoZSBwSW5wdXQgYnVmZmVyIGhvbGRzIHRoZSBmaXJzdCAyIChMZWZ0LCBSaWdodCkgY2hhbm5lbHMgaW5mb3JtYXRpb24uCiAgICAgICogSGVuY2UgdGhlIG1lbW9yeSByZXF1aXJlZCBieSB0aGlzIGJ1ZmZlciBpcyAyICogTnVtRnJhbWVzLgpAQCAtMTE1LDM1ICsxMTEsMTMgQEAKICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQgKilwSW5wdXQsCiAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFN0SW4sCiAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnJGcmFtZXMpKTsKLSNlbHNlCi0gICAgaWYgKHBJbkRhdGEgPT0gcE91dERhdGEpCi0gICAgewotICAgICAgICAvKiBQcm9jZXNzaW5nIGlucGxhY2UgKi8KLSAgICAgICAgcElucHV0ID0gcFNjcmF0Y2ggKyAoMiAqIE51bVNhbXBsZXMpOwotICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQgKilwSW5EYXRhLCAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBJbnB1dCwgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBQcm9jZXNzaW5nIG91dHBsYWNlICovCi0gICAgICAgIHBJbnB1dCA9IHBJbkRhdGE7Ci0gICAgfQotI2VuZGlmCiAgICAgLyoKICAgICAgKiBDYWxsIHRoZSBzdGVyZW8gZW5oYW5jZXIKICAgICAgKi8KLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgZXJyID0gTFZDU19TdGVyZW9FbmhhbmNlcihoSW5zdGFuY2UsICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdEluLCAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcyk7ICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgZnJhbWVzIHRvIHByb2Nlc3MgKi8KLSNlbHNlCi0gICAgZXJyID0gTFZDU19TdGVyZW9FbmhhbmNlcihoSW5zdGFuY2UsICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCi0jZW5kaWYKIAogICAgIC8qCiAgICAgICogQ2FsbCB0aGUgcmV2ZXJiIGdlbmVyYXRvcgpAQCAtMjEwLDcgKzE4NCw2IEBACiAKICAgICBMVkNTX0luc3RhbmNlX3QgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwogICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuIGVycjsKLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgLypFeHRyYWN0IG51bWJlciBvZiBDaGFubmVscyBpbmZvKi8KICAgICBMVk1fSU5UMzIgY2hhbm5lbHMgPSBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzOwogI2RlZmluZSBOckZyYW1lcyBOdW1TYW1wbGVzICAvLyBhbGlhcyBmb3IgY2xhcml0eQpAQCAtMjE4LDcgKzE5MSw2IEBACiAgICAgewogICAgICAgICBjaGFubmVscyA9IDI7CiAgICAgfQotI2VuZGlmCiAgICAgLyoKICAgICAgKiBDaGVjayB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgbm90IHRvbyBsYXJnZQogICAgICAqLwpAQCAtMjMyLDcgKzIwNCw2IEBACiAgICAgICovCiAgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgIT0gTFZDU19PRkYpCiAgICAgewotI2lmZGVmIFNVUFBPUlRfTUMKICAgICAgICAgTFZNX0ZMT0FUICpwU3RlcmVvT3V0OwogICAgICAgICAvKgogICAgICAgICAgKiBMVkNTX1Byb2Nlc3NfQ1MgdXNlcyBvdXRwdXQgYnVmZmVyIHRvIHN0b3JlIGludGVybWVkaWF0ZSBvdXRwdXRzIG9mIFN0ZXJlb0VuaGFuY2VyLApAQCAtMjQ4LDEwICsyMTksOCBAQAogICAgICAgICAgICAqIHNlY29uZCBhbmQgZm91cnRoIGFyZSB1c2VkIGFzIGlucHV0IGJ1ZmZlcnMgYnkgcElucHV0IGFuZCBwU3RJbiBpbiBMVkNTX1Byb2Nlc3NfQ1MuCiAgICAgICAgICAgICogSGVuY2UsIHBTdGVyZW9PdXQgaXMgcG9pbnRlZCB0byB1c2UgdW51c2VkIHRoaXJkIHBvcnRpb24gb2Ygc2NyYXRjaCBtZW1vcnkuCiAgICAgICAgICAgICovCi0gICAgICAgICAgICBwU3RlcmVvT3V0ID0gKExWTV9GTE9BVCAqKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3MgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAoKExWQ1NfU0NSQVRDSEJVRkZFUlMgLSA0KSAqIE5yRnJhbWVzKTsKKyAgICAgICAgICAgIHBTdGVyZW9PdXQgPSAoTFZNX0ZMT0FUICopcEluc3RhbmNlLT5wU2NyYXRjaCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMVkNTX1NDUkFUQ0hCVUZGRVJTIC0gNCkgKiBOckZyYW1lcyk7CiAgICAgICAgIH0KICAgICAgICAgZWxzZQogICAgICAgICB7CkBAIC0yNjUsMTIgKzIzNCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RlcmVvT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzKTsKLSNlbHNlCi0gICAgICAgICAgICBlcnIgPSBMVkNTX1Byb2Nlc3NfQ1MoaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7Ci0jZW5kaWYKIAogICAgICAgICAvKgogICAgICAgICAgKiBDb21wcmVzcyB0byByZWR1Y2UgZXhwYW5zaW9uIGVmZmVjdCBvZiBDb25jZXJ0IFNvdW5kIGFuZCBjb3JyZWN0IHZvbHVtZQpAQCAtMjg5LDE3ICsyNTIsMTAgQEAKIAogICAgICAgICAgICAgaWYoTnVtU2FtcGxlcyA8IExWQ1NfQ09NUEdBSU5GUkFNRSkKICAgICAgICAgICAgIHsKLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgICAgICAgICAgICAgTm9uTGluQ29tcF9GbG9hdChHYWluLCAgICAgICAgICAgICAgICAgICAgLyogQ29tcHJlc3NvciBnYWluIHNldHRpbmcgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTdGVyZW9PdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RlcmVvT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikoMiAqIE5yRnJhbWVzKSk7Ci0jZWxzZQotICAgICAgICAgICAgICAgIE5vbkxpbkNvbXBfRmxvYXQoR2FpbiwgICAgICAgICAgICAgICAgICAgIC8qIENvbXByZXNzb3IgZ2FpbiBzZXR0aW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikoMiAqIE51bVNhbXBsZXMpKTsKLSNlbmRpZgogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewpAQCAtMzI4LDExICsyODQsNyBAQAogCiAgICAgICAgICAgICAgICAgRmluYWxHYWluID0gR2FpbjsKICAgICAgICAgICAgICAgICBHYWluID0gcEluc3RhbmNlLT5Db21wcmVzc0dhaW47Ci0jaWZkZWYgU1VQUE9SVF9NQwogICAgICAgICAgICAgICAgIHBPdXRQdHIgPSBwU3RlcmVvT3V0OwotI2Vsc2UKLSAgICAgICAgICAgICAgICBwT3V0UHRyID0gcE91dERhdGE7Ci0jZW5kaWYKIAogICAgICAgICAgICAgICAgIHdoaWxlKFNhbXBsZVRvUHJvY2VzcyA+IDApCiAgICAgICAgICAgICAgICAgewpAQCAtMzk2LDMzICszNDgsMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0jaWZkZWYgU1VQUE9SVF9NQwogICAgICAgICBDb3B5X0Zsb2F0X1N0ZXJlb19NYyhwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RlcmVvT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzKTsKLSNlbmRpZgogICAgIH0KICAgICBlbHNlCiAgICAgewogICAgICAgICBpZiAocEluRGF0YSAhPSBwT3V0RGF0YSkKICAgICAgICAgewotI2lmZGVmIFNVUFBPUlRfTUMKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBUaGUgYWxnb3JpdGhtIGlzIGRpc2FibGVkIHNvIGp1c3QgY29weSB0aGUgZGF0YQogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQgKilwSW5EYXRhLCAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcE91dERhdGEsICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoY2hhbm5lbHMgKiBOckZyYW1lcykpOyAgICAvKiBBbGwgQ2hhbm5lbHMqLwotI2Vsc2UKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBUaGUgYWxnb3JpdGhtIGlzIGRpc2FibGVkIHNvIGp1c3QgY29weSB0aGUgZGF0YQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQgKilwSW5EYXRhLCAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcE91dERhdGEsICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgKi8KLSNlbmRpZgogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuY3BwCmluZGV4IGQwZTZlMDkuLjQ0MWI2NjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuY3BwCkBAIC0yMCw3ICsyMCw3IEBACiAvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KKyNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlICJMVkNTLmgiCiAjaW5jbHVkZSAiTFZDU19Qcml2YXRlLmgiCiAjaW5jbHVkZSAiTFZDU19SZXZlcmJHZW5lcmF0b3IuaCIKQEAgLTcwLDExICs3MCwzMSBAQAogICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICBDb2VmZnM7CiAgICAgY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAgKnBSZXZlcmJDb2VmVGFibGU7CiAKLSAgICBwRGF0YSA9IChMVkNTX0RhdGFfdCAqKSBcCi0gICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3M7Ci0KLSAgICBwQ29lZmZpY2llbnRzID0gKExWQ1NfQ29lZmZpY2llbnRfdCAqKSBcCi0gICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7CisgICAgaWYgKHBJbnN0YW5jZS0+cERhdGEgPT0gTFZNX05VTEwpCisgICAgeworICAgICAgICBwSW5zdGFuY2UtPnBEYXRhID0gcERhdGEgPSAoTFZDU19EYXRhX3QgKiljYWxsb2MoMSwgc2l6ZW9mKCpwRGF0YSkpOworICAgICAgICBpZiAocERhdGEgPT0gTFZNX05VTEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBMVkNTX05VTExBRERSRVNTOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBEYXRhID0gKExWQ1NfRGF0YV90ICopcEluc3RhbmNlLT5wRGF0YTsKKyAgICB9CisgICAgaWYgKHBJbnN0YW5jZS0+cENvZWZmID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgcEluc3RhbmNlLT5wQ29lZmYgPSBwQ29lZmZpY2llbnRzID0gKExWQ1NfQ29lZmZpY2llbnRfdCAqKWNhbGxvYygxLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZigqcENvZWZmaWNpZW50cykpOworICAgICAgICBpZiAocENvZWZmaWNpZW50cyA9PSBMVk1fTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIExWQ1NfTlVMTEFERFJFU1M7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcENvZWZmaWNpZW50cyA9IChMVkNTX0NvZWZmaWNpZW50X3QgKilwSW5zdGFuY2UtPnBDb2VmZjsKKyAgICB9CiAKICAgICAvKgogICAgICAqIEluaXRpYWxpc2UgdGhlIGRlbGF5IGFuZCBmaWx0ZXJzIGlmOgpAQCAtMTkyLDExICsyMTIsOCBAQAogICAgIExWQ1NfQ29lZmZpY2llbnRfdCAgICAgICpwQ29lZmZpY2llbnRzOwogICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwU2NyYXRjaDsKIAotICAgIHBDb2VmZmljaWVudHMgPSAoTFZDU19Db2VmZmljaWVudF90ICopXAotICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7Ci0KLSAgICBwU2NyYXRjaCAgPSAoTFZNX0ZMT0FUICopXAotICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzOworICAgIHBDb2VmZmljaWVudHMgPSAoTFZDU19Db2VmZmljaWVudF90ICopcEluc3RhbmNlLT5wQ29lZmY7CisgICAgcFNjcmF0Y2ggICAgICA9IChMVk1fRkxPQVQgKilwSW5zdGFuY2UtPnBTY3JhdGNoOwogCiAgICAgLyoKICAgICAgKiBDb3B5IHRoZSBkYXRhIHRvIHRoZSBvdXRwdXQgaW4gb3V0cGxhY2UgcHJvY2Vzc2luZwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19TdGVyZW9FbmhhbmNlci5jcHAKaW5kZXggN2ZkODQ0NC4uNjkyOTAxNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuY3BwCkBAIC02MiwxMSArNjIsOCBAQAogICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgQ29lZmZzU2lkZTsKICAgICBjb25zdCBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICpwU0VTaWRlQ29lZnM7CiAKLSAgICBwRGF0YSAgICAgPSAoTFZDU19EYXRhX3QgKikgXAotICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzczsKLQotICAgIHBDb2VmZmljaWVudCA9IChMVkNTX0NvZWZmaWNpZW50X3QgKikgXAotICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKKyAgICBwRGF0YSAgICAgICAgPSAoTFZDU19EYXRhX3QgKilwSW5zdGFuY2UtPnBEYXRhOworICAgIHBDb2VmZmljaWVudCA9IChMVkNTX0NvZWZmaWNpZW50X3QgKilwSW5zdGFuY2UtPnBDb2VmZjsKIAogICAgIC8qCiAgICAgICogSWYgdGhlIHNhbXBsZSByYXRlIG9yIHNwZWFrZXIgdHlwZSBoYXMgY2hhbmdlZCB1cGRhdGUgdGhlIGZpbHRlcnMKQEAgLTE4OCwxMiArMTg1LDggQEAKICAgICBMVkNTX1N0ZXJlb0VuaGFuY2VyX3QgICAqcENvbmZpZyAgID0gKExWQ1NfU3RlcmVvRW5oYW5jZXJfdCAqKSZwSW5zdGFuY2UtPlN0ZXJlb0VuaGFuY2VyOwogICAgIExWQ1NfQ29lZmZpY2llbnRfdCAgICAgICpwQ29lZmZpY2llbnQ7CiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBTY3JhdGNoOwotCi0gICAgcENvZWZmaWNpZW50ID0gKExWQ1NfQ29lZmZpY2llbnRfdCAqKSBcCi0gICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKLQotICAgIHBTY3JhdGNoICA9IChMVk1fRkxPQVQgKikgXAotICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzOworICAgIHBDb2VmZmljaWVudCA9IChMVkNTX0NvZWZmaWNpZW50X3QgKilwSW5zdGFuY2UtPnBDb2VmZjsKKyAgICBwU2NyYXRjaCAgICAgPSAoTFZNX0ZMT0FUICopcEluc3RhbmNlLT5wU2NyYXRjaDsKICAgICAvKgogICAgICAqIENoZWNrIGlmIHRoZSBTdGVyZW8gRW5oYW5jZXIgaXMgZW5hYmxlZAogICAgICAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggNjc0YzI0Ni4uYWVhNzcwMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9BbmRyb2lkLmJwCkBAIC00NCw2ICs0NCwzNiBAQAogfQogCiBjY190ZXN0IHsKKyAgICBuYW1lOiAicmV2ZXJiX3Rlc3QiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiBmYWxzZSwKKyAgICBwcm9wcmlldGFyeTogdHJ1ZSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYiIKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJyZXZlcmJ3cmFwcGVyIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAicmV2ZXJiX3Rlc3QuY3BwIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgewogICAgIG5hbWU6ICJzbnIiLAogICAgIGhvc3Rfc3VwcG9ydGVkOiBmYWxzZSwKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0c19yZXZlcmIuc2ggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzX3JldmVyYi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYzNiMGI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0c19yZXZlcmIuc2gKQEAgLTAsMCArMSwxMDUgQEAKKyMhL2Jpbi9iYXNoCisjCisjIHJldmVyYiB0ZXN0CisjCisKK2lmIFsgLXogIiRBTkRST0lEX0JVSUxEX1RPUCIgXTsgdGhlbgorICAgIGVjaG8gIkFuZHJvaWQgYnVpbGQgZW52aXJvbm1lbnQgbm90IHNldCIKKyAgICBleGl0IC0xCitmaQorCisjIGVuc3VyZSB3ZSBoYXZlIG1tCisuICRBTkRST0lEX0JVSUxEX1RPUC9idWlsZC9lbnZzZXR1cC5zaAorCittbSAtagorCitlY2hvICJ3YWl0aW5nIGZvciBkZXZpY2UiCisKK2FkYiByb290ICYmIGFkYiB3YWl0LWZvci1kZXZpY2UgcmVtb3VudAorCisjIGxvY2F0aW9uIG9mIHRlc3QgZmlsZXMKK3Rlc3RkaXI9Ii9kYXRhL2xvY2FsL3RtcC9yZXZUZXN0IgorCitlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorZWNobyAidGVzdGluZyByZXZlcmIiCithZGIgc2hlbGwgbWtkaXIgLXAgJHRlc3RkaXIKK2FkYiBwdXNoICRBTkRST0lEX0JVSUxEX1RPUC9jdHMvdGVzdHMvdGVzdHMvbWVkaWEvcmVzL3Jhdy9zaW5lc3dlZXByYXcucmF3ICR0ZXN0ZGlyCisKK0VfVkFMPTEKK2NtZHM9ImFkYiBwdXNoICRPVVQvdGVzdGNhc2VzL3JldmVyYl90ZXN0L2FybS9yZXZlcmJfdGVzdCAkdGVzdGRpciIKKworZnNfYXJyPSgKKyAgICA4MDAwCisgICAgMTYwMDAKKyAgICAyMjA1MAorICAgIDMyMDAwCisgICAgNDQxMDAKKyAgICA0ODAwMAorICAgIDg4MjAwCisgICAgOTYwMDAKKyAgICAxNzY0MDAKKyAgICAxOTIwMDAKKykKKworZmxhZ3NfYXJyPSgKKyAgICAiLS1NIC0tZmNoIDEiCisgICAgIi0tZmNoIDIiCispCisKKyMgcnVuIHJldmVyYiBhdCBkaWZmZXJlbnQgY29uZmlncywgc2F2aW5nIG9ubHkgdGhlIHN0ZXJlbyBjaGFubmVsCisjIHBhaXIuCitlcnJvcl9jb3VudD0wCit0ZXN0Y2FzZV9jb3VudD0wCitmb3IgY21kIGluICIke2NtZHNbQF19IgorZG8KKyAgICAkY21kCisgICAgZm9yIGZsYWdzIGluICIke2ZsYWdzX2FycltAXX0iCisgICAgZG8KKyAgICAgICAgZm9yIHByZXNldF92YWwgaW4gezAuLjZ9CisgICAgICAgIGRvCisgICAgICAgICAgICBmb3IgZnMgaW4gJHtmc19hcnJbKl19CisgICAgICAgICAgICBkbworICAgICAgICAgICAgICAgIGZvciBjaE1hc2sgaW4gezAuLjIyfQorICAgICAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgICAgIGFkYiBzaGVsbCBMRF9MSUJSQVJZX1BBVEg9L3N5c3RlbS92ZW5kb3IvbGliL3NvdW5kZnggJHRlc3RkaXIvcmV2ZXJiX3Rlc3QgXAorICAgICAgICAgICAgICAgICAgICAgICAgLS1pbnB1dCAkdGVzdGRpci9zaW5lc3dlZXByYXcucmF3IFwKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tb3V0cHV0ICR0ZXN0ZGlyL3NpbmVzd2VlcF8kKChjaE1hc2spKV8kKChmcykpLnJhdyBcCisgICAgICAgICAgICAgICAgICAgICAgICAtLWNoTWFzayAkY2hNYXNrICRmbGFncyAtLWZzICRmcyAtLXByZXNldCAkcHJlc2V0X3ZhbAorCisgICAgICAgICAgICAgICAgICAgIHNoZWxsX3JldD0kPworICAgICAgICAgICAgICAgICAgICBpZiBbICRzaGVsbF9yZXQgLW5lIDAgXTsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiZXJyb3I6ICRzaGVsbF9yZXQiCisgICAgICAgICAgICAgICAgICAgICAgICAoKCsrZXJyb3JfY291bnQpKQorICAgICAgICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICAgICAgIGlmIFtbICIkY2hNYXNrIiAtZ3QgMCBdXSAmJiBbWyAkZmxhZ3MgIT0gKiItLWZjaCAyIiogXV0KKyAgICAgICAgICAgICAgICAgICAgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgIyBzaW5nbGUgY2hhbm5lbCBmaWxlcyBzaG91bGQgYmUgaWRlbnRpY2FsIHRvIGhpZ2hlciBjaGFubmVsCisgICAgICAgICAgICAgICAgICAgICAgICAjIGNvbXB1dGF0aW9uIChmaXJzdCBjaGFubmVsKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGFkYiBzaGVsbCBjbXAgJHRlc3RkaXIvc2luZXN3ZWVwXzBfJCgoZnMpKS5yYXcgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0ZXN0ZGlyL3NpbmVzd2VlcF8kKChjaE1hc2spKV8kKChmcykpLnJhdworICAgICAgICAgICAgICAgICAgICBlbGlmIFtbICIkY2hNYXNrIiAtZ3QgMSBdXQorICAgICAgICAgICAgICAgICAgICB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAjIHR3byBjaGFubmVsIGZpbGVzIHNob3VsZCBiZSBpZGVudGljYWwgdG8gaGlnaGVyIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAgICAgICAgICMgY29tcHV0YXRpb24gKGZpcnN0IDIgY2hhbm5lbHMpLgorICAgICAgICAgICAgICAgICAgICAgICAgYWRiIHNoZWxsIGNtcCAkdGVzdGRpci9zaW5lc3dlZXBfMV8kKChmcykpLnJhdyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHRlc3RkaXIvc2luZXN3ZWVwXyQoKGNoTWFzaykpXyQoKGZzKSkucmF3CisgICAgICAgICAgICAgICAgICAgIGZpCisKKyAgICAgICAgICAgICAgICAgICAgIyBjbXAgcmV0dXJucyBFWElUX0ZBSUxVUkUgb24gbWlzbWF0Y2guCisgICAgICAgICAgICAgICAgICAgIHNoZWxsX3JldD0kPworICAgICAgICAgICAgICAgICAgICBpZiBbICRzaGVsbF9yZXQgLW5lIDAgXTsgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAiZXJyb3I6ICRzaGVsbF9yZXQiCisgICAgICAgICAgICAgICAgICAgICAgICAoKCsrZXJyb3JfY291bnQpKQorICAgICAgICAgICAgICAgICAgICBmaQorICAgICAgICAgICAgICAgICAgICAoKCsrdGVzdGNhc2VfY291bnQpKQorICAgICAgICAgICAgICAgIGRvbmUKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgZG9uZQorICAgIGRvbmUKK2RvbmUKKworYWRiIHNoZWxsIHJtIC1yICR0ZXN0ZGlyCitlY2hvICIkdGVzdGNhc2VfY291bnQgdGVzdHMgcGVyZm9ybWVkIgorZWNobyAiJGVycm9yX2NvdW50IGVycm9ycyIKK2V4aXQgJGVycm9yX2NvdW50CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9sdm10ZXN0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2x2bXRlc3QuY3BwCmluZGV4IGE0YWNlNmMuLjU5YjI3YWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2x2bXRlc3QuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2x2bXRlc3QuY3BwCkBAIC0xODIsNDkgKzE4Miw2IEBACiAgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBFcXVhbGl6ZXIiKTsKIH0KIAotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBMdm1FZmZlY3RfZnJlZSgpCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFB1cnBvc2U6IEZyZWUgYWxsIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIEJ1bmRsZS4KLS8vCi0vLyBJbnB1dHM6Ci0vLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0Ci0vLwotLy8gT3V0cHV0czoKLS8vCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBMdm1FZmZlY3RfZnJlZShzdHJ1Y3QgRWZmZWN0Q29udGV4dCAqcENvbnRleHQpIHsKLSAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KLSAgTFZNX01lbVRhYl90IE1lbVRhYjsKLQotICAvKiBGcmVlIHRoZSBhbGdvcml0aG0gbWVtb3J5ICovCi0gIEx2bVN0YXR1cyA9IExWTV9HZXRNZW1vcnlUYWJsZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZNZW1UYWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTlVMTCk7Ci0KLSAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRNZW1vcnlUYWJsZSIsICJMdm1FZmZlY3RfZnJlZSIpCi0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKykgewotICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLlNpemUgIT0gMCkgewotICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoIlx0THZtRWZmZWN0X2ZyZWUgLSBTVEFSVCBmcmVlaW5nICUiIFBSSXUzMgotICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCi0gICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwotCi0gICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwotCi0gICAgICAgIEFMT0dWKCJcdEx2bUVmZmVjdF9mcmVlIC0gRU5EICAgZnJlZWluZyAlIiBQUkl1MzIKLSAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAotICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKAotICAgICAgICAgICAgIlx0TFZNX0VSUk9SIDogTHZtRWZmZWN0X2ZyZWUgLSB0cnlpbmcgdG8gZnJlZSB3aXRoIE5VTEwgcG9pbnRlciAiCi0gICAgICAgICAgICAiJSIgUFJJdTMyICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcCBFUlJPUlxuIiwKLSAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwotICAgICAgfQotICAgIH0KLSAgfQotfSAvKiBlbmQgTHZtRWZmZWN0X2ZyZWUgKi8KIAogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBMdm1CdW5kbGVfaW5pdCgpCkBAIC0yNjMsOCArMjIwLDcgQEAKICAgICBBTE9HVigKICAgICAgICAgIlx0THZtQnVuZGxlX2luaXQgcENvbnRleHQtPnBCYXNzQm9vc3QgIT0gTlVMTCAiCiAgICAgICAgICItPiBDYWxsaW5nIHBDb250ZXh0LT5wQmFzc0Jvb3N0LT5mcmVlKCkiKTsKLQotICAgIEx2bUVmZmVjdF9mcmVlKHBDb250ZXh0KTsKKyAgICBMVk1fRGVsSW5zdGFuY2VIYW5kbGUoJnBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSk7CiAKICAgICBBTE9HVigKICAgICAgICAgIlx0THZtQnVuZGxlX2luaXQgcENvbnRleHQtPnBCYXNzQm9vc3QgIT0gTlVMTCAiCkBAIC0yNzYsOCArMjMyLDYgQEAKICAgTFZNX0VRTkJfQmFuZERlZl90IEJhbmREZWZzW01BWF9OVU1fQkFORFNdOyAgLyogRXF1YWxpc2VyIGJhbmQgZGVmaW5pdGlvbnMgKi8KICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgSGVhZHJvb21QYXJhbXM7ICAgICAgICAgLyogSGVhZHJvb20gcGFyYW1ldGVycyAqLwogICBMVk1fSGVhZHJvb21CYW5kRGVmX3QgSGVhZHJvb21CYW5kRGVmW0xWTV9IRUFEUk9PTV9NQVhfTkJBTkRTXTsKLSAgTFZNX01lbVRhYl90IE1lbVRhYjsgLyogTWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KLSAgYm9vbCBiTWFsbG9jRmFpbHVyZSA9IExWTV9GQUxTRTsKIAogICAvKiBTZXQgdGhlIGNhcGFiaWxpdGllcyAqLwogICBJbnN0UGFyYW1zLkJ1ZmZlck1vZGUgPSBMVk1fVU5NQU5BR0VEX0JVRkZFUlM7CkBAIC0yODUsNjMgKzIzOSw4IEBACiAgIEluc3RQYXJhbXMuRVFOQl9OdW1CYW5kcyA9IE1BWF9OVU1fQkFORFM7CiAgIEluc3RQYXJhbXMuUFNBX0luY2x1ZGVkID0gTFZNX1BTQV9PTjsKIAotICAvKiBBbGxvY2F0ZSBtZW1vcnksIGZvcmNpbmcgYWxpZ25tZW50ICovCi0gIEx2bVN0YXR1cyA9IExWTV9HZXRNZW1vcnlUYWJsZShMVk1fTlVMTCwgJk1lbVRhYiwgJkluc3RQYXJhbXMpOwotCi0gIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0TWVtb3J5VGFibGUiLCAiTHZtQnVuZGxlX2luaXQiKTsKLSAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7Ci0KLSAgQUxPR1YoIlx0Q3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9HZXRNZW1vcnlUYWJsZVxuIik7Ci0KLSAgLyogQWxsb2NhdGUgbWVtb3J5ICovCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgTFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspIHsKLSAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5TaXplICE9IDApIHsKLSAgICAgIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID0gbWFsbG9jKE1lbVRhYi5SZWdpb25baV0uU2l6ZSk7Ci0KLSAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9PSBMVk1fTlVMTCkgewotICAgICAgICBBTE9HRSgKLSAgICAgICAgICAgICJcdExWTV9FUlJPUiA6THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkIHRvIGFsbG9jYXRlICIKLSAgICAgICAgICAgICIlIiBQUkl1MzIgIiBieXRlcyBmb3IgcmVnaW9uICV1XG4iLAotICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpKTsKLSAgICAgICAgYk1hbGxvY0ZhaWx1cmUgPSBMVk1fVFJVRTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBhbGxvY2F0ZWQgJSIgUFJJdTMyCi0gICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKLSAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogSWYgb25lIG9yIG1vcmUgb2YgdGhlIG1lbW9yeSByZWdpb25zIGZhaWxlZCB0byBhbGxvY2F0ZSwgZnJlZSB0aGUgcmVnaW9ucwotICAgKiB0aGF0IHdlcmUKLSAgICogc3VjY2VzZnVsbHkgYWxsb2NhdGVkIGFuZCByZXR1cm4gd2l0aCBhbiBlcnJvcgotICAgKi8KLSAgaWYgKGJNYWxsb2NGYWlsdXJlID09IExWTV9UUlVFKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKykgewotICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID09IExWTV9OVUxMKSB7Ci0gICAgICAgIEFMT0dFKAotICAgICAgICAgICAgIlx0TFZNX0VSUk9SIDpMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQgdG8gYWxsb2NhdGUgIgotICAgICAgICAgICAgIiUiIFBSSXUzMiAiIGJ5dGVzIGZvciByZWdpb24gJXUgTm90IGZyZWVpbmdcbiIsCi0gICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoCi0gICAgICAgICAgICAiXHRMVk1fRVJST1IgOkx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZDogYnV0IGFsbG9jYXRlZCAiCi0gICAgICAgICAgICAiJSIgUFJJdTMyICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcC0gZnJlZVxuIiwKLSAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwotICAgICAgICBmcmVlKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIC1FSU5WQUw7Ci0gIH0KLSAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgbWFsbG9jJ2QgbWVtb3J5XG4iKTsKLQotICAvKiBJbml0aWFsaXNlICovCi0gIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSA9IExWTV9OVUxMOwotCi0gIC8qIEluaXQgc2V0cyB0aGUgaW5zdGFuY2UgaGFuZGxlICovCiAgIEx2bVN0YXR1cyA9IExWTV9HZXRJbnN0YW5jZUhhbmRsZSgmcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1lbVRhYiwgJkluc3RQYXJhbXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkluc3RQYXJhbXMpOwogCiAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fR2V0SW5zdGFuY2VIYW5kbGUiLCAiTHZtQnVuZGxlX2luaXQiKTsKICAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CkBAIC04MTIsNyArNzExLDcgQEAKICAgLyogRnJlZSB0aGUgYWxsb2NhdGVkIGJ1ZmZlcnMgKi8KICAgaWYgKGNvbnRleHQucEJ1bmRsZWRDb250ZXh0ICE9IG51bGxwdHIpIHsKICAgICBpZiAoY29udGV4dC5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSAhPSBudWxscHRyKSB7Ci0gICAgICBMdm1FZmZlY3RfZnJlZSgmY29udGV4dCk7CisgICAgICBMVk1fRGVsSW5zdGFuY2VIYW5kbGUoJmNvbnRleHQucEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UpOwogICAgIH0KICAgICBmcmVlKGNvbnRleHQucEJ1bmRsZWRDb250ZXh0KTsKICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvcmV2ZXJiX3Rlc3QuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvcmV2ZXJiX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MDMyMjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9yZXZlcmJfdGVzdC5jcHAKQEAgLTAsMCArMSwzOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGdldG9wdC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2NoYW5uZWxzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworI2luY2x1ZGUgIkVmZmVjdFJldmVyYi5oIgorCisvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCitleHRlcm4gYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTTsKKworLy8gR2xvYmFsIFZhcmlhYmxlcworZW51bSBSZXZlcmJQYXJhbXMgeworICBBUkdfSEVMUCA9IDEsCisgIEFSR19JTlBVVCwKKyAgQVJHX09VVFBVVCwKKyAgQVJHX0ZTLAorICBBUkdfQ0hfTUFTSywKKyAgQVJHX1BSRVNFVCwKKyAgQVJHX0FVWCwKKyAgQVJHX01PTk9fTU9ERSwKKyAgQVJHX0ZJTEVfQ0gsCit9OworCitjb25zdCBlZmZlY3RfdXVpZF90IGtSZXZlcmJVdWlkc1tdID0geworICAgIHsweDE3MmNkZjAwLAorICAgICAweGEzYmMsCisgICAgIDB4MTFkZiwKKyAgICAgMHhhNzJmLAorICAgICB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAgLy8gcHJlc2V0LWluc2VydCBtb2RlCisgICAgezB4ZjI5YTE0MDAsCisgICAgIDB4YTNiYiwKKyAgICAgMHgxMWRmLAorICAgICAweDhkZGMsCisgICAgIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sICAvLyBwcmVzZXQtYXV4IG1vZGUKK307CisKKy8vIHN0cnVjdHVyZXMKK3N0cnVjdCByZXZlcmJDb25maWdQYXJhbXNfdCB7CisgIGludCBmQ2hhbm5lbHMgPSAyOworICBpbnQgbW9ub01vZGUgPSBmYWxzZTsKKyAgaW50IGZyYW1lTGVuZ3RoID0gMjU2OworICBpbnQgcHJlc2V0ID0gMDsKKyAgaW50IG5yQ2hhbm5lbHMgPSAyOworICBpbnQgc2FtcGxlUmF0ZSA9IDQ4MDAwOworICBpbnQgYXV4aWxpYXJ5ID0gMDsKKyAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hNYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworfTsKKworY29uc3RleHByIGF1ZGlvX2NoYW5uZWxfbWFza190IGtSZXZlcmJDb25maWdDaE1hc2tbXSA9IHsKKyAgICBBVURJT19DSEFOTkVMX09VVF9NT05PLAorICAgIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywKKyAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDBQT0lOVDIsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRCwKKyAgICBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0ssCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9TSURFLAorICAgIEFVRElPX0NIQU5ORUxfT1VUX1NVUlJPVU5ELAorICAgICgxIDw8IDQpIC0gMSwKKyAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxUE9JTlQyLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDBQT0lOVDIsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfUEVOVEEsCisgICAgKDEgPDwgNSkgLSAxLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDFQT0lOVDIsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwKKyAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX0JBQ0ssCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9TSURFLAorICAgICgxIDw8IDYpIC0gMSwKKyAgICBBVURJT19DSEFOTkVMX09VVF82UE9JTlQxLAorICAgICgxIDw8IDcpIC0gMSwKKyAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxUE9JTlQyLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEsCisgICAgKDEgPDwgOCkgLSAxLAorfTsKKworY29uc3RleHByIGludCBrUmV2ZXJiQ29uZmlnQ2hNYXNrQ291bnQgPSBzdGQ6OnNpemUoa1JldmVyYkNvbmZpZ0NoTWFzayk7CisKK2ludCByZXZlcmJDcmVhdGVFZmZlY3QoZWZmZWN0X2hhbmRsZV90ICpwRWZmZWN0SGFuZGxlLCBlZmZlY3RfY29uZmlnX3QgKnBDb25maWcsIGludCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBpb0lkLCBpbnQgYXV4RmxhZykgeworICBpZiAoaW50IHN0YXR1cyA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNLmNyZWF0ZV9lZmZlY3QoJmtSZXZlcmJVdWlkc1thdXhGbGFnXSwgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW9JZCwgcEVmZmVjdEhhbmRsZSk7CisgICAgICBzdGF0dXMgIT0gMCkgeworICAgIEFMT0dFKCJSZXZlcmIgY3JlYXRlIHJldHVybmVkIGFuIGVycm9yID0gJWRcbiIsIHN0YXR1cyk7CisgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgfQorICBpbnQgcmVwbHkgPSAwOworICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YocmVwbHkpOworICAoKipwRWZmZWN0SGFuZGxlKQorICAgICAgLT5jb21tYW5kKCpwRWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX1NFVF9DT05GSUcsIHNpemVvZihlZmZlY3RfY29uZmlnX3QpLCBwQ29uZmlnLAorICAgICAgICAgICAgICAgICZyZXBseVNpemUsICZyZXBseSk7CisgIHJldHVybiByZXBseTsKK30KKworaW50IHJldmVyYlNldENvbmZpZ1BhcmFtKHVpbnQzMl90IHBhcmFtVHlwZSwgdWludDMyX3QgcGFyYW1WYWx1ZSwgZWZmZWN0X2hhbmRsZV90IGVmZmVjdEhhbmRsZSkgeworICBpbnQgcmVwbHkgPSAwOworICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YocmVwbHkpOworICB1aW50MzJfdCBwYXJhbURhdGFbMl0gPSB7cGFyYW1UeXBlLCBwYXJhbVZhbHVlfTsKKyAgZWZmZWN0X3BhcmFtX3QgKmVmZmVjdFBhcmFtID0KKyAgICAgIChlZmZlY3RfcGFyYW1fdCAqKW1hbGxvYyhzaXplb2YoKmVmZmVjdFBhcmFtKSArIHNpemVvZihwYXJhbURhdGEpKTsKKyAgbWVtY3B5KCZlZmZlY3RQYXJhbS0+ZGF0YVswXSwgJnBhcmFtRGF0YVswXSwgc2l6ZW9mKHBhcmFtRGF0YSkpOworICBlZmZlY3RQYXJhbS0+cHNpemUgPSBzaXplb2YocGFyYW1EYXRhWzBdKTsKKyAgZWZmZWN0UGFyYW0tPnZzaXplID0gc2l6ZW9mKHBhcmFtRGF0YVsxXSk7CisgIGludCBzdGF0dXMgPQorICAgICAgKCplZmZlY3RIYW5kbGUpCisgICAgICAgICAgLT5jb21tYW5kKGVmZmVjdEhhbmRsZSwgRUZGRUNUX0NNRF9TRVRfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBzaXplb2YocGFyYW1EYXRhKSwgZWZmZWN0UGFyYW0sICZyZXBseVNpemUsICZyZXBseSk7CisgIGZyZWUoZWZmZWN0UGFyYW0pOworICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICBBTE9HRSgiUmV2ZXJiIHNldCBjb25maWcgcmV0dXJuZWQgYW4gZXJyb3IgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICByZXR1cm4gc3RhdHVzOworICB9CisgIHJldHVybiByZXBseTsKK30KKwordm9pZCBwcmludFVzYWdlKCkgeworICBwcmludGYoIlxuVXNhZ2U6ICIpOworICBwcmludGYoIlxuICAgICA8ZXhlY3V0YWJsZT4gW29wdGlvbnNdXG4iKTsKKyAgcHJpbnRmKCJcbndoZXJlIG9wdGlvbnMgYXJlLCAiKTsKKyAgcHJpbnRmKCJcbiAgICAgLS1pbnB1dCA8aW5wdXRmaWxlPiIpOworICBwcmludGYoIlxuICAgICAgICAgICBwYXRoIHRvIHRoZSBpbnB1dCBmaWxlIik7CisgIHByaW50ZigiXG4gICAgIC0tb3V0cHV0IDxvdXRwdXRmaWxlPiIpOworICBwcmludGYoIlxuICAgICAgICAgICBwYXRoIHRvIHRoZSBvdXRwdXQgZmlsZSIpOworICBwcmludGYoIlxuICAgICAtLWhlbHAiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgcHJpbnRzIHRoaXMgdXNhZ2UgaW5mb3JtYXRpb24iKTsKKyAgcHJpbnRmKCJcbiAgICAgLS1jaE1hc2sgPGNoYW5uZWxfbWFzaz5cbiIpOworICBwcmludGYoIlxuICAgICAgICAgICAwICAtIEFVRElPX0NIQU5ORUxfT1VUX01PTk8iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgMSAgLSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgMiAgLSBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDMgIC0gQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMFBPSU5UMiIpOworICBwcmludGYoIlxuICAgICAgICAgICA0ICAtIEFVRElPX0NIQU5ORUxfT1VUX1FVQUQiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgNSAgLSBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0siKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgNiAgLSBBVURJT19DSEFOTkVMX09VVF9RVUFEX1NJREUiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgNyAgLSBBVURJT19DSEFOTkVMX09VVF9TVVJST1VORCIpOworICBwcmludGYoIlxuICAgICAgICAgICA4ICAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDQgY2g6ICgxIDw8IDQpIC0gMSIpOworICBwcmludGYoIlxuICAgICAgICAgICA5ICAtIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDFQT0lOVDIiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgMTAgLSBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQwUE9JTlQyIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDExIC0gQVVESU9fQ0hBTk5FTF9PVVRfUEVOVEEiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgMTIgLSBjYW5vbmljYWwgY2hhbm5lbCBpbmRleCBtYXNrIGZvciA1IGNoOiAoMSA8PCA1KSAtIDEiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgMTMgLSBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxUE9JTlQyIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDE0IC0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSIpOworICBwcmludGYoIlxuICAgICAgICAgICAxNSAtIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfQkFDSyIpOworICBwcmludGYoIlxuICAgICAgICAgICAxNiAtIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfU0lERSIpOworICBwcmludGYoIlxuICAgICAgICAgICAxNyAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDYgY2g6ICgxIDw8IDYpIC0gMSIpOworICBwcmludGYoIlxuICAgICAgICAgICAxOCAtIEFVRElPX0NIQU5ORUxfT1VUXzZQT0lOVDEiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgMTkgLSBjYW5vbmljYWwgY2hhbm5lbCBpbmRleCBtYXNrIGZvciA3IGNoOiAoMSA8PCA3KSAtIDEiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgMjAgLSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxUE9JTlQyIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDIxIC0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSIpOworICBwcmludGYoIlxuICAgICAgICAgICAyMiAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDggY2g6ICgxIDw8IDgpIC0gMSIpOworICBwcmludGYoIlxuICAgICAgICAgICBkZWZhdWx0IDAiKTsKKyAgcHJpbnRmKCJcbiAgICAgLS1mcyA8c2FtcGxpbmdfZnJlcT4iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgU2FtcGxpbmcgZnJlcXVlbmN5IGluIEh6LCBkZWZhdWx0IDQ4MDAwLiIpOworICBwcmludGYoIlxuICAgICAtLXByZXNldCA8cHJlc2V0X3ZhbHVlPiIpOworICBwcmludGYoIlxuICAgICAgICAgICAwIC0gTm9uZSIpOworICBwcmludGYoIlxuICAgICAgICAgICAxIC0gU21hbGwgUm9vbSIpOworICBwcmludGYoIlxuICAgICAgICAgICAyIC0gTWVkaXVtIFJvb20iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgMyAtIExhcmdlIFJvb20iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgNCAtIE1lZGl1bSBIYWxsIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDUgLSBMYXJnZSBIYWxsIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDYgLSBQbGF0ZSIpOworICBwcmludGYoIlxuICAgICAgICAgICBkZWZhdWx0IDAiKTsKKyAgcHJpbnRmKCJcbiAgICAgLS1mY2ggPGZpbGVfY2hhbm5lbHM+Iik7CisgIHByaW50ZigiXG4gICAgICAgICAgIG51bWJlciBvZiBjaGFubmVscyBpbiBpbnB1dCBmaWxlICgxIHRocm91Z2ggOCksIGRlZmF1bHQgMSIpOworICBwcmludGYoIlxuICAgICAtLU0iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgTW9ubyBtb2RlIChmb3JjZSBhbGwgaW5wdXQgYXVkaW8gY2hhbm5lbHMgdG8gYmUgaWRlbnRpY2FsKSIpOworICBwcmludGYoIlxuICAgICAtLWF1eCA8YXV4aWxpYXJ5X2ZsYWc+ICIpOworICBwcmludGYoIlxuICAgICAgICAgICAwIC0gSW5zZXJ0IE1vZGUgb24iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgMSAtIGF1eGlsaWFyeSBNb2RlIG9uIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIGRlZmF1bHQgMCIpOworICBwcmludGYoIlxuIik7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pIHsKKyAgaWYgKGFyZ2MgPT0gMSkgeworICAgIHByaW50VXNhZ2UoKTsKKyAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICB9CisKKyAgcmV2ZXJiQ29uZmlnUGFyYW1zX3QgcmV2Q29uZmlnUGFyYW1ze307ICAvLyBkZWZhdWx0IGluaXRpYWxpemUKKyAgY29uc3QgY2hhciAqaW5wdXRGaWxlID0gbnVsbHB0cjsKKyAgY29uc3QgY2hhciAqb3V0cHV0RmlsZSA9IG51bGxwdHI7CisKKyAgY29uc3Qgb3B0aW9uIGxvbmdfb3B0c1tdID0geworICAgICAgeyJoZWxwIiwgbm9fYXJndW1lbnQsIG51bGxwdHIsIEFSR19IRUxQfSwKKyAgICAgIHsiaW5wdXQiLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX0lOUFVUfSwKKyAgICAgIHsib3V0cHV0IiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19PVVRQVVR9LAorICAgICAgeyJmcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfRlN9LAorICAgICAgeyJjaE1hc2siLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX0NIX01BU0t9LAorICAgICAgeyJwcmVzZXQiLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX1BSRVNFVH0sCisgICAgICB7ImF1eCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfQVVYfSwKKyAgICAgIHsiTSIsIG5vX2FyZ3VtZW50LCAmcmV2Q29uZmlnUGFyYW1zLm1vbm9Nb2RlLCB0cnVlfSwKKyAgICAgIHsiZmNoIiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19GSUxFX0NIfSwKKyAgICAgIHtudWxscHRyLCAwLCBudWxscHRyLCAwfSwKKyAgfTsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGNvbnN0IGludCBvcHQgPSBnZXRvcHRfbG9uZyhhcmdjLCAoY2hhciAqY29uc3QgKilhcmd2LCAiaTpvOiIsIGxvbmdfb3B0cywgbnVsbHB0cik7CisgICAgaWYgKG9wdCA9PSAtMSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIHN3aXRjaCAob3B0KSB7CisgICAgICBjYXNlIEFSR19IRUxQOgorICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgIHJldHVybiBFWElUX1NVQ0NFU1M7CisgICAgICBjYXNlIEFSR19JTlBVVDogeworICAgICAgICBpbnB1dEZpbGUgPSAoY2hhciAqKW9wdGFyZzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEFSR19PVVRQVVQ6IHsKKyAgICAgICAgb3V0cHV0RmlsZSA9IChjaGFyICopb3B0YXJnOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgQVJHX0ZTOiB7CisgICAgICAgIHJldkNvbmZpZ1BhcmFtcy5zYW1wbGVSYXRlID0gYXRvaShvcHRhcmcpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgQVJHX0NIX01BU0s6IHsKKyAgICAgICAgaW50IGNoTWFza0lkeCA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgaWYgKGNoTWFza0lkeCA8IDAgb3IgY2hNYXNrSWR4ID4ga1JldmVyYkNvbmZpZ0NoTWFza0NvdW50KSB7CisgICAgICAgICAgQUxPR0UoIkNoYW5uZWwgTWFzayBpbmRleCBub3QgaW4gY29ycmVjdCByYW5nZVxuIik7CisgICAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgIH0KKyAgICAgICAgcmV2Q29uZmlnUGFyYW1zLmNoTWFzayA9IGtSZXZlcmJDb25maWdDaE1hc2tbY2hNYXNrSWR4XTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEFSR19QUkVTRVQ6IHsKKyAgICAgICAgcmV2Q29uZmlnUGFyYW1zLnByZXNldCA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEFSR19BVVg6IHsKKyAgICAgICAgcmV2Q29uZmlnUGFyYW1zLmF1eGlsaWFyeSA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEFSR19NT05PX01PREU6IHsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEFSR19GSUxFX0NIOiB7CisgICAgICAgIHJldkNvbmZpZ1BhcmFtcy5mQ2hhbm5lbHMgPSBhdG9pKG9wdGFyZyk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgaWYgKGlucHV0RmlsZSA9PSBudWxscHRyKSB7CisgICAgQUxPR0UoIkVycm9yOiBtaXNzaW5nIGlucHV0IGZpbGVzXG4iKTsKKyAgICBwcmludFVzYWdlKCk7CisgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgfQorICBzdGQ6OnVuaXF1ZV9wdHI8RklMRSwgZGVjbHR5cGUoJmZjbG9zZSk+IGlucHV0RnAoZm9wZW4oaW5wdXRGaWxlLCAicmIiKSwgJmZjbG9zZSk7CisKKyAgaWYgKGlucHV0RnAgPT0gbnVsbHB0cikgeworICAgIEFMT0dFKCJDYW5ub3Qgb3BlbiBpbnB1dCBmaWxlICVzXG4iLCBpbnB1dEZpbGUpOworICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKworICBpZiAob3V0cHV0RmlsZSA9PSBudWxscHRyKSB7CisgICAgQUxPR0UoIkVycm9yOiBtaXNzaW5nIG91dHB1dCBmaWxlc1xuIik7CisgICAgcHJpbnRVc2FnZSgpOworICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKyAgc3RkOjp1bmlxdWVfcHRyPEZJTEUsIGRlY2x0eXBlKCZmY2xvc2UpPiBvdXRwdXRGcChmb3BlbihvdXRwdXRGaWxlLCAid2IiKSwgJmZjbG9zZSk7CisKKyAgaWYgKG91dHB1dEZwID09IG51bGxwdHIpIHsKKyAgICBBTE9HRSgiQ2Fubm90IG9wZW4gb3V0cHV0IGZpbGUgJXNcbiIsIG91dHB1dEZpbGUpOworICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKworICBpbnQzMl90IHNlc3Npb25JZCA9IDE7CisgIGludDMyX3QgaW9JZCA9IDE7CisgIGVmZmVjdF9oYW5kbGVfdCBlZmZlY3RIYW5kbGUgPSBudWxscHRyOworICBlZmZlY3RfY29uZmlnX3QgY29uZmlnOworICBjb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gY29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSByZXZDb25maWdQYXJhbXMuc2FtcGxlUmF0ZTsKKyAgY29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gY29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IHJldkNvbmZpZ1BhcmFtcy5jaE1hc2s7CisgIGNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBjb25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgIGlmIChBVURJT19DSEFOTkVMX09VVF9NT05PID09IHJldkNvbmZpZ1BhcmFtcy5jaE1hc2spIHsKKyAgICBjb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICB9CisgIGlmIChpbnQgc3RhdHVzID0KKyAgICAgICAgICByZXZlcmJDcmVhdGVFZmZlY3QoJmVmZmVjdEhhbmRsZSwgJmNvbmZpZywgc2Vzc2lvbklkLCBpb0lkLCByZXZDb25maWdQYXJhbXMuYXV4aWxpYXJ5KTsKKyAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgQUxPR0UoIkNyZWF0ZSBlZmZlY3QgY2FsbCByZXR1cm5lZCBlcnJvciAlaSIsIHN0YXR1cyk7CisgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgfQorCisgIGludCByZXBseSA9IDA7CisgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IHNpemVvZihyZXBseSk7CisgICgqZWZmZWN0SGFuZGxlKS0+Y29tbWFuZChlZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfRU5BQkxFLCAwLCBudWxscHRyLCAmcmVwbHlTaXplLCAmcmVwbHkpOworICBpZiAocmVwbHkgIT0gMCkgeworICAgIEFMT0dFKCJDb21tYW5kIGVuYWJsZSBjYWxsIHJldHVybmVkIGVycm9yICVkXG4iLCByZXBseSk7CisgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgfQorCisgIGlmIChpbnQgc3RhdHVzID0gcmV2ZXJiU2V0Q29uZmlnUGFyYW0oUkVWRVJCX1BBUkFNX1BSRVNFVCwgKHVpbnQzMl90KXJldkNvbmZpZ1BhcmFtcy5wcmVzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0SGFuZGxlKTsKKyAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgQUxPR0UoIkludmFsaWQgcmV2ZXJiIHByZXNldC4gRXJyb3IgJWRcbiIsIHN0YXR1cyk7CisgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgfQorCisgIHJldkNvbmZpZ1BhcmFtcy5uckNoYW5uZWxzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHJldkNvbmZpZ1BhcmFtcy5jaE1hc2spOworICBjb25zdCBpbnQgY2hhbm5lbENvdW50ID0gcmV2Q29uZmlnUGFyYW1zLm5yQ2hhbm5lbHM7CisgIGNvbnN0IGludCBmcmFtZUxlbmd0aCA9IHJldkNvbmZpZ1BhcmFtcy5mcmFtZUxlbmd0aDsKKyNpZmRlZiBCWVBBU1NfRVhFQworICBjb25zdCBpbnQgZnJhbWVTaXplID0gKGludCljaGFubmVsQ291bnQgKiBzaXplb2YoZmxvYXQpOworI2VuZGlmCisgIGNvbnN0IGludCBpb0NoYW5uZWxDb3VudCA9IHJldkNvbmZpZ1BhcmFtcy5mQ2hhbm5lbHM7CisgIGNvbnN0IGludCBpb0ZyYW1lU2l6ZSA9IGlvQ2hhbm5lbENvdW50ICogc2l6ZW9mKHNob3J0KTsKKyAgY29uc3QgaW50IG1heENoYW5uZWxDb3VudCA9IHN0ZDo6bWF4KGNoYW5uZWxDb3VudCwgaW9DaGFubmVsQ291bnQpOworICAvKgorICAgKiBNb25vIGlucHV0IHdpbGwgYmUgY29udmVydGVkIHRvIDIgY2hhbm5lbHMgaW50ZXJuYWxseSBpbiB0aGUgcHJvY2VzcyBjYWxsCisgICAqIGJ5IGNvcHlpbmcgdGhlIHNhbWUgZGF0YSBpbnRvIHRoZSBzZWNvbmQgY2hhbm5lbC4KKyAgICogSGVuY2Ugd2hlbiBjaGFubmVsQ291bnQgaXMgMSwgb3V0cHV0IGJ1ZmZlciBzaG91bGQgYmUgYWxsb2NhdGVkIGZvcgorICAgKiAyIGNoYW5uZWxzLiBUaGUgb3V0Q2hhbm5lbENvdW50IHRha2VzIGNhcmUgb2YgYWxsb2NhdGlvbiBvZiBzdWZmaWNpZW50CisgICAqIG1lbW9yeSBmb3IgdGhlIG91dHB1dCBidWZmZXIuCisgICAqLworICBjb25zdCBpbnQgb3V0Q2hhbm5lbENvdW50ID0gKGNoYW5uZWxDb3VudCA9PSAxID8gMiA6IGNoYW5uZWxDb3VudCk7CisKKyAgc3RkOjp2ZWN0b3I8c2hvcnQ+IGluKGZyYW1lTGVuZ3RoICogbWF4Q2hhbm5lbENvdW50KTsKKyAgc3RkOjp2ZWN0b3I8c2hvcnQ+IG91dChmcmFtZUxlbmd0aCAqIG1heENoYW5uZWxDb3VudCk7CisgIHN0ZDo6dmVjdG9yPGZsb2F0PiBmbG9hdEluKGZyYW1lTGVuZ3RoICogY2hhbm5lbENvdW50KTsKKyAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGZsb2F0T3V0KGZyYW1lTGVuZ3RoICogb3V0Q2hhbm5lbENvdW50KTsKKworICBpbnQgZnJhbWVDb3VudGVyID0gMDsKKworICB3aGlsZSAoZnJlYWQoaW4uZGF0YSgpLCBpb0ZyYW1lU2l6ZSwgZnJhbWVMZW5ndGgsIGlucHV0RnAuZ2V0KCkpID09IChzaXplX3QpZnJhbWVMZW5ndGgpIHsKKyAgICBpZiAoaW9DaGFubmVsQ291bnQgIT0gY2hhbm5lbENvdW50KSB7CisgICAgICBhZGp1c3RfY2hhbm5lbHMoaW4uZGF0YSgpLCBpb0NoYW5uZWxDb3VudCwgaW4uZGF0YSgpLCBjaGFubmVsQ291bnQsIHNpemVvZihzaG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGggKiBpb0ZyYW1lU2l6ZSk7CisgICAgfQorICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kxNihmbG9hdEluLmRhdGEoKSwgaW4uZGF0YSgpLCBmcmFtZUxlbmd0aCAqIGNoYW5uZWxDb3VudCk7CisKKyAgICAvLyBNb25vIG1vZGUgd2lsbCByZXBsaWNhdGUgdGhlIGZpcnN0IGNoYW5uZWwgdG8gYWxsIG90aGVyIGNoYW5uZWxzLgorICAgIC8vIFRoaXMgZW5zdXJlcyBhbGwgYXVkaW8gY2hhbm5lbHMgYXJlIGlkZW50aWNhbC4gVGhpcyBpcyB1c2VmdWwgZm9yIHRlc3RpbmcKKyAgICAvLyBCYXNzIEJvb3N0LCB3aGljaCBleHRyYWN0cyBhIG1vbm8gc2lnbmFsIGZvciBwcm9jZXNzaW5nLgorICAgIGlmIChyZXZDb25maWdQYXJhbXMubW9ub01vZGUgJiYgY2hhbm5lbENvdW50ID4gMSkgeworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUxlbmd0aDsgKytpKSB7CisgICAgICAgIGF1dG8gKmZwID0gJmZsb2F0SW5baSAqIGNoYW5uZWxDb3VudF07CisgICAgICAgIHN0ZDo6ZmlsbChmcCArIDEsIGZwICsgY2hhbm5lbENvdW50LCAqZnApOyAgLy8gcmVwbGljYXRlIGNoIDAKKyAgICAgIH0KKyAgICB9CisKKyAgICBhdWRpb19idWZmZXJfdCBpbnB1dEJ1ZmZlciwgb3V0cHV0QnVmZmVyOworICAgIGlucHV0QnVmZmVyLmZyYW1lQ291bnQgPSBvdXRwdXRCdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lTGVuZ3RoOworICAgIGlucHV0QnVmZmVyLmYzMiA9IGZsb2F0SW4uZGF0YSgpOworICAgIG91dHB1dEJ1ZmZlci5mMzIgPSBmbG9hdE91dC5kYXRhKCk7CisjaWZuZGVmIEJZUEFTU19FWEVDCisgICAgaWYgKGludCBzdGF0dXMgPSAoKmVmZmVjdEhhbmRsZSktPnByb2Nlc3MoZWZmZWN0SGFuZGxlLCAmaW5wdXRCdWZmZXIsICZvdXRwdXRCdWZmZXIpOworICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgQUxPR0UoIlxuRXJyb3I6IFByb2Nlc3MgcmV0dXJuZWQgd2l0aCBlcnJvciAlZFxuIiwgc3RhdHVzKTsKKyAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgfQorI2Vsc2UKKyAgICBtZW1jcHkoZmxvYXRPdXQuZGF0YSgpLCBmbG9hdEluLmRhdGEoKSwgZnJhbWVMZW5ndGggKiBmcmFtZVNpemUpOworI2VuZGlmCisgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KG91dC5kYXRhKCksIGZsb2F0T3V0LmRhdGEoKSwgZnJhbWVMZW5ndGggKiBvdXRDaGFubmVsQ291bnQpOworCisgICAgaWYgKGlvQ2hhbm5lbENvdW50ICE9IG91dENoYW5uZWxDb3VudCkgeworICAgICAgYWRqdXN0X2NoYW5uZWxzKG91dC5kYXRhKCksIG91dENoYW5uZWxDb3VudCwgb3V0LmRhdGEoKSwgaW9DaGFubmVsQ291bnQsIHNpemVvZihzaG9ydCksCisgICAgICAgICAgICAgICAgICAgICAgZnJhbWVMZW5ndGggKiBvdXRDaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpKTsKKyAgICB9CisgICAgKHZvaWQpZndyaXRlKG91dC5kYXRhKCksIGlvRnJhbWVTaXplLCBmcmFtZUxlbmd0aCwgb3V0cHV0RnAuZ2V0KCkpOworICAgIGZyYW1lQ291bnRlciArPSBmcmFtZUxlbmd0aDsKKyAgfQorCisgIGlmIChpbnQgc3RhdHVzID0gQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0ucmVsZWFzZV9lZmZlY3QoZWZmZWN0SGFuZGxlKTsKKyAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgQUxPR0UoIkF1ZGlvIFByZXByb2Nlc3NpbmcgcmVsZWFzZSByZXR1cm5lZCBhbiBlcnJvciA9ICVkXG4iLCBzdGF0dXMpOworICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKyAgcHJpbnRmKCJmcmFtZUNvdW50ZXI6IFslZF1cbiIsIGZyYW1lQ291bnRlcik7CisKKyAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5icAppbmRleCBhZmM0MjIwLi5mMDhjYWVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLmJwCkBAIC0xMyw3ICsxMyw2IEBACiAKICAgICBjcHBmbGFnczogWwogICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCi0gICAgICAgICItRFNVUFBPUlRfTUMiLAogCiAgICAgICAgICItV2FsbCIsCiAgICAgICAgICItV2Vycm9yIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCmluZGV4IDZmY2EwZTcuLmRhYzI4M2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcApAQCAtMTM2LDcgKzEzNiw2IEBACiBpbnQgIEx2bUJ1bmRsZV9pbml0ICAgICAgICAgICAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0KTsKIGludCAgTHZtRWZmZWN0X2VuYWJsZSAgICAgICAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQpOwogaW50ICBMdm1FZmZlY3RfZGlzYWJsZSAgICAgICAgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCk7Ci12b2lkIEx2bUVmZmVjdF9mcmVlICAgICAgICAgICAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0KTsKIGludCAgRWZmZWN0X3NldENvbmZpZyAgICAgICAgICAoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIGVmZmVjdF9jb25maWdfdCAqcENvbmZpZyk7CiB2b2lkIEVmZmVjdF9nZXRDb25maWcgICAgICAgICAgKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBlZmZlY3RfY29uZmlnX3QgKnBDb25maWcpOwogaW50ICBCYXNzQm9vc3Rfc2V0UGFyYW1ldGVyICAgIChFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKQEAgLTQzMyw3ICs0MzIsNyBAQAogICAgICAgICBwU2Vzc2lvbkNvbnRleHQtPmJCdW5kbGVkRWZmZWN0c0VuYWJsZWQgPSBMVk1fRkFMU0U7CiAgICAgICAgIHBTZXNzaW9uQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0ID0gTFZNX05VTEw7CiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdFJlbGVhc2U6IEZyZWVpbmcgTFZNIEJ1bmRsZSBtZW1vcnlcbiIpOwotICAgICAgICBMdm1FZmZlY3RfZnJlZShwQ29udGV4dCk7CisgICAgICAgIExWTV9EZWxJbnN0YW5jZUhhbmRsZSgmcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlKTsKICAgICAgICAgQUxPR1YoIlx0RWZmZWN0UmVsZWFzZTogRGVsZXRpbmcgTFZNIEJ1bmRsZSBjb250ZXh0ICVwXG4iLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0KTsKICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyKTsKQEAgLTUyOSw4ICs1MjgsNyBAQAogICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UgIT0gTlVMTCl7CiAgICAgICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IHBDb250ZXh0LT5wQmFzc0Jvb3N0ICE9IE5VTEwgIgogICAgICAgICAgICAgICAgICItPiBDYWxsaW5nIHBDb250ZXh0LT5wQmFzc0Jvb3N0LT5mcmVlKCkiKTsKLQotICAgICAgICBMdm1FZmZlY3RfZnJlZShwQ29udGV4dCk7CisgICAgICAgIExWTV9EZWxJbnN0YW5jZUhhbmRsZSgmcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlKTsKIAogICAgICAgICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBwQ29udGV4dC0+cEJhc3NCb29zdCAhPSBOVUxMICIKICAgICAgICAgICAgICAgICAiLT4gQ2FsbGVkIHBDb250ZXh0LT5wQmFzc0Jvb3N0LT5mcmVlKCkiKTsKQEAgLTU0Miw4ICs1NDAsNiBAQAogICAgIExWTV9FUU5CX0JhbmREZWZfdCAgICAgIEJhbmREZWZzW01BWF9OVU1fQkFORFNdOyAgICAgICAgLyogRXF1YWxpc2VyIGJhbmQgZGVmaW5pdGlvbnMgKi8KICAgICBMVk1fSGVhZHJvb21QYXJhbXNfdCAgICBIZWFkcm9vbVBhcmFtczsgICAgICAgICAgICAgICAgIC8qIEhlYWRyb29tIHBhcmFtZXRlcnMgKi8KICAgICBMVk1fSGVhZHJvb21CYW5kRGVmX3QgICBIZWFkcm9vbUJhbmREZWZbTFZNX0hFQURST09NX01BWF9OQkFORFNdOwotICAgIExWTV9NZW1UYWJfdCAgICAgICAgICAgIE1lbVRhYjsgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KLSAgICBib29sICAgICAgICAgICAgICAgICAgICBiTWFsbG9jRmFpbHVyZSA9IExWTV9GQUxTRTsKIAogICAgIC8qIFNldCB0aGUgY2FwYWJpbGl0aWVzICovCiAgICAgSW5zdFBhcmFtcy5CdWZmZXJNb2RlICAgICAgID0gTFZNX1VOTUFOQUdFRF9CVUZGRVJTOwpAQCAtNTUxLDU4ICs1NDcsNyBAQAogICAgIEluc3RQYXJhbXMuRVFOQl9OdW1CYW5kcyAgICA9IE1BWF9OVU1fQkFORFM7CiAgICAgSW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQgICAgID0gTFZNX1BTQV9PTjsKIAotICAgIC8qIEFsbG9jYXRlIG1lbW9yeSwgZm9yY2luZyBhbGlnbm1lbnQgKi8KLSAgICBMdm1TdGF0dXMgPSBMVk1fR2V0TWVtb3J5VGFibGUoTFZNX05VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1lbVRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSW5zdFBhcmFtcyk7Ci0KLSAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldE1lbW9yeVRhYmxlIiwgIkx2bUJ1bmRsZV9pbml0IikKLSAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwotCi0gICAgQUxPR1YoIlx0Q3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9HZXRNZW1vcnlUYWJsZVxuIik7Ci0KLSAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgKi8KLSAgICBmb3IgKGludCBpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspewotICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5TaXplICE9IDApewotICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPSBtYWxsb2MoTWVtVGFiLlJlZ2lvbltpXS5TaXplKTsKLQotICAgICAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID09IExWTV9OVUxMKXsKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOkx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAlIiBQUkl1MzIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldVxuIiwgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpICk7Ci0gICAgICAgICAgICAgICAgYk1hbGxvY0ZhaWx1cmUgPSBMVk1fVFJVRTsKLSAgICAgICAgICAgIH1lbHNlewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIGFsbG9jYXRlZCAlIiBQUkl1MzIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogSWYgb25lIG9yIG1vcmUgb2YgdGhlIG1lbW9yeSByZWdpb25zIGZhaWxlZCB0byBhbGxvY2F0ZSwgZnJlZSB0aGUgcmVnaW9ucyB0aGF0IHdlcmUKLSAgICAgKiBzdWNjZXNmdWxseSBhbGxvY2F0ZWQgYW5kIHJldHVybiB3aXRoIGFuIGVycm9yCi0gICAgICovCi0gICAgaWYoYk1hbGxvY0ZhaWx1cmUgPT0gTFZNX1RSVUUpewotICAgICAgICBmb3IgKGludCBpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspewotICAgICAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID09IExWTV9OVUxMKXsKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOkx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAlIiBQUkl1MzIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBOb3QgZnJlZWluZ1xuIiwgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpICk7Ci0gICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOkx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZDogYnV0IGFsbG9jYXRlZCAlIiBQUkl1MzIKLSAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcC0gZnJlZVxuIiwKLSAgICAgICAgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwotICAgICAgICAgICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLSAgICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBtYWxsb2MnZCBtZW1vcnlcbiIpOwotCi0gICAgLyogSW5pdGlhbGlzZSAqLwotICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSA9IExWTV9OVUxMOwotCi0gICAgLyogSW5pdCBzZXRzIHRoZSBpbnN0YW5jZSBoYW5kbGUgKi8KICAgICBMdm1TdGF0dXMgPSBMVk1fR2V0SW5zdGFuY2VIYW5kbGUoJnBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1lbVRhYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkluc3RQYXJhbXMpOwogCiAgICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRJbnN0YW5jZUhhbmRsZSIsICJMdm1CdW5kbGVfaW5pdCIpCkBAIC02MTgsOSArNTYzLDcgQEAKICAgICBwYXJhbXMuU3BlYWtlclR5cGUgICAgICAgICAgICA9IExWTV9IRUFEUEhPTkVTOwogCiAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlUmF0ZSA9IExWTV9GU180NDEwMDsKLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Q2hNYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotI2VuZGlmCiAKICAgICAvKiBDb25jZXJ0IFNvdW5kIHBhcmFtZXRlcnMgKi8KICAgICBwYXJhbXMuVmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlICAgPSBMVk1fTU9ERV9PRkY7CkBAIC02NjYsMTEgKzYwOSw5IEBACiAgICAgcGFyYW1zLlRFX09wZXJhdGluZ01vZGUgICAgICAgPSBMVk1fVEVfT0ZGOwogICAgIHBhcmFtcy5URV9FZmZlY3RMZXZlbCAgICAgICAgID0gMDsKIAotI2lmZGVmIFNVUFBPUlRfTUMKICAgICBwYXJhbXMuTnJDaGFubmVscyAgICAgICAgICAgICA9CiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOwogICAgIHBhcmFtcy5DaE1hc2sgICAgICAgICAgICAgICAgID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotI2VuZGlmCiAgICAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KICAgICBMdm1TdGF0dXMgPSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zKTsKQEAgLTEwMzAsNDEgKzk3MSw2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTHZtRWZmZWN0X2ZyZWUoKQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQdXJwb3NlOiBGcmVlIGFsbCBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBCdW5kbGUuCi0vLwotLy8gSW5wdXRzOgotLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAotLy8KLS8vIE91dHB1dHM6Ci0vLwotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgTHZtRWZmZWN0X2ZyZWUoRWZmZWN0Q29udGV4dCAqcENvbnRleHQpewotICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVk1fU1VDQ0VTUzsgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwotICAgIExWTV9NZW1UYWJfdCAgICAgICAgICAgIE1lbVRhYjsKLQotICAgIC8qIEZyZWUgdGhlIGFsZ29yaXRobSBtZW1vcnkgKi8KLSAgICBMdm1TdGF0dXMgPSBMVk1fR2V0TWVtb3J5VGFibGUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTlVMTCk7Ci0KLSAgICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldE1lbW9yeVRhYmxlIiwgIkx2bUVmZmVjdF9mcmVlIikKLQotICAgIGZvciAoaW50IGk9MDsgaTxMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKyl7Ci0gICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLlNpemUgIT0gMCl7Ci0gICAgICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgIT0gTlVMTCl7Ci0gICAgICAgICAgICAgICAgZnJlZShNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7Ci0gICAgICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBMdm1FZmZlY3RfZnJlZSAtIHRyeWluZyB0byBmcmVlIHdpdGggTlVMTCBwb2ludGVyICUiIFBSSXUzMgotICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwIEVSUk9SXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19ICAgIC8qIGVuZCBMdm1FZmZlY3RfZnJlZSAqLwogCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEVmZmVjdF9zZXRDb25maWcoKQpAQCAtMTA5MCwxMSArOTk2LDcgQEAKICAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlID09IHBDb25maWctPm91dHB1dENmZy5zYW1wbGluZ1JhdGUpOwogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9PSBwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMpOwogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gcENvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCk7Ci0jaWZkZWYgU1VQUE9SVF9NQwogICAgIENIRUNLX0FSRyhhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpIDw9IExWTV9NQVhfQ0hBTk5FTFMpOwotI2Vsc2UKLSAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKTsKLSNlbmRpZgogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURQogICAgICAgICAgICAgICB8fCBwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKTsKICAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID09IEVGRkVDVF9CVUZGRVJfRk9STUFUKTsKQEAgLTExNDcsMTIgKzEwNDksOCBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZVJhdGUgIT0gU2FtcGxlUmF0ZSB8fAogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5DaE1hc2sgIT0gcENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpIHsKLSNlbHNlCi0gICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlUmF0ZSAhPSBTYW1wbGVSYXRlKXsKLSNlbmRpZgogCiAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsKICAgICAgICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7CkBAIC0xMTY4LDE5ICsxMDY2LDE1IEBACiAKICAgICAgICAgQWN0aXZlUGFyYW1zLlNhbXBsZVJhdGUgPSBTYW1wbGVSYXRlOwogCi0jaWZkZWYgU1VQUE9SVF9NQwogICAgICAgICBBY3RpdmVQYXJhbXMuTnJDaGFubmVscyA9IE5yQ2hhbm5lbHM7CiAgICAgICAgIEFjdGl2ZVBhcmFtcy5DaE1hc2sgPSBwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVsczsKLSNlbmRpZgogCiAgICAgICAgIEx2bVN0YXR1cyA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogCiAgICAgICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiRWZmZWN0X3NldENvbmZpZyIpCiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdF9zZXRDb25maWcgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZVJhdGUgPSBTYW1wbGVSYXRlOwotI2lmZGVmIFNVUFBPUlRfTUMKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Q2hNYXNrID0gcENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHM7Ci0jZW5kaWYKIAogICAgICAgICBMdm1FZmZlY3RfbGltaXRMZXZlbChwQ29udGV4dCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKaW5kZXggNTI0ZTEwMy4uNjNiYzQ1YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKQEAgLTk0LDkgKzk0LDcgQEAKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQ7CiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kR2FpbmRCW0ZJVkVCQU5EX05VTUJBTkRTXTsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZTsKLSNpZmRlZiBTVVBQT1JUX01DCiAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAgICBDaE1hc2s7Ci0jZW5kaWYKIAogICAgIC8qIEJpdG1hc2sgd2hldGhlciBkcmFpbiBpcyBpbiBwcm9ncmVzcyBkdWUgdG8gZGlzYWJsaW5nIHRoZSBlZmZlY3QuCiAgICAgICAgVGhlIGNvcnJlc3BvbmRpbmcgYml0IHRvIGFuIGVmZmVjdCBpcyBzZXQgYnkgMSA8PCBsdm1fZWZmZWN0X2VuLiAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKaW5kZXggMzlmNWJiNi4uNDQxMWE3ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCkBAIC0yNTksNiArMjU5LDcgQEAKIAogICAgIGludCBjaGFubmVscyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzKTsKIAorICAgIGNoYW5uZWxzID0gKHBDb250ZXh0LT5hdXhpbGlhcnkgPT0gdHJ1ZSk/IGNoYW5uZWxzIDogRkNDXzI7CiAgICAgLy8gQWxsb2NhdGUgbWVtb3J5IGZvciByZXZlcmIgcHJvY2VzcyAoKjIgaXMgZm9yIFNURVJFTykKICAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZUluID0gTFZSRVZfTUFYX0ZSQU1FX1NJWkUgKiBzaXplb2YocHJvY2Vzc19idWZmZXJfdCkgKiBjaGFubmVsczsKICAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCA9IExWUkVWX01BWF9GUkFNRV9TSVpFICogc2l6ZW9mKHByb2Nlc3NfYnVmZmVyX3QpICogRkNDXzI7CkBAIC0zNDMsOSArMzQ0LDkgQEAKICAgICBpbnQgY2hhbm5lbHMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyk7CiAgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgTHZtU3RhdHVzID0gTFZSRVZfU1VDQ0VTUzsgICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAKLSAgICAvLyBDaGVjayB0aGF0IHRoZSBpbnB1dCBpcyBlaXRoZXIgbW9ubyBvciBzdGVyZW8KLSAgICBpZiAoIShjaGFubmVscyA9PSAxIHx8IGNoYW5uZWxzID09IEZDQ18yKSApIHsKLSAgICAgICAgQUxPR0UoIlx0TFZSRVZfRVJST1IgOiBwcm9jZXNzIGludmFsaWQgUENNIGZvcm1hdCIpOworICAgIC8vIFJldmVyYiBvbmx5IGVmZmVjdHMgdGhlIHN0ZXJlbyBjaGFubmVscyBpbiBtdWx0aWNoYW5uZWwgc291cmNlLgorICAgIGlmIChjaGFubmVscyA8IDEgfHwgY2hhbm5lbHMgPiBMVk1fTUFYX0NIQU5ORUxTKSB7CisgICAgICAgIEFMT0dFKCJcdExWUkVWX0VSUk9SIDogcHJvY2VzcyBpbnZhbGlkIFBDTSBjaGFubmVscyAlZCIsIGNoYW5uZWxzKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCkBAIC0zODAsMTEgKzM4MSwyMCBAQAogICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZSgqcEluKSwgZGVjbHR5cGUoKnBDb250ZXh0LT5JbkZyYW1lcyk+Ojp2YWx1ZSwKICAgICAgICAgICAgICAgICAicEluIGFuZCBJbkZyYW1lcyBtdXN0IGJlIHNhbWUgdHlwZSIpOwogICAgICAgICBtZW1jcHkocENvbnRleHQtPkluRnJhbWVzLCBwSW4sIGZyYW1lQ291bnQgKiBjaGFubmVscyAqIHNpemVvZigqcEluKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gbW9ubyBpbnB1dCBpcyBkdXBsaWNhdGVkCisgICAgICAgIGlmIChjaGFubmVscyA+PSBGQ0NfMikgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXNbRkNDXzIgKiBpXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2Nlc3NfYnVmZmVyX3QpcEluW2NoYW5uZWxzICogaV0gKiBSRVZFUkJfU0VORF9MRVZFTDsKKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXNbRkNDXzIgKiBpICsgMV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9jZXNzX2J1ZmZlcl90KXBJbltjaGFubmVscyAqIGkgKyAxXSAqIFJFVkVSQl9TRU5EX0xFVkVMOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAvLyBpbnNlcnQgcmV2ZXJiIGlucHV0IGlzIGFsd2F5cyBzdGVyZW8KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lc1syICogaV0gPSAocHJvY2Vzc19idWZmZXJfdClwSW5bMiAqIGldICogUkVWRVJCX1NFTkRfTEVWRUw7Ci0gICAgICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXNbMiAqIGkgKyAxXSA9IChwcm9jZXNzX2J1ZmZlcl90KXBJblsyICogaSArIDFdICogUkVWRVJCX1NFTkRfTEVWRUw7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lc1tGQ0NfMiAqIGldID0gcENvbnRleHQtPkluRnJhbWVzW0ZDQ18yICogaSArIDFdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJvY2Vzc19idWZmZXJfdClwSW5baV0gKiBSRVZFUkJfU0VORF9MRVZFTDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtNDEyLDkgKzQyMiwxOCBAQAogICAgIGlmIChwQ29udGV4dC0+YXV4aWxpYXJ5KSB7CiAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudCAqIEZDQ18yOyBpKyspIHsgLy8gYWx3YXlzIHN0ZXJlbyBoZXJlCi0gICAgICAgICAgICAvLyBNaXggd2l0aCBkcnkgaW5wdXQKLSAgICAgICAgICAgIHBDb250ZXh0LT5PdXRGcmFtZXNbaV0gKz0gcEluW2ldOworICAgICAgICBpZiAoY2hhbm5lbHMgPj0gRkNDXzIpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgLy8gTWl4IHdpdGggZHJ5IGlucHV0CisgICAgICAgICAgICAgICAgcENvbnRleHQtPk91dEZyYW1lc1tGQ0NfMiAqIGldICs9IHBJbltjaGFubmVscyAqIGldOworICAgICAgICAgICAgICAgIHBDb250ZXh0LT5PdXRGcmFtZXNbRkNDXzIgKiBpICsgMV0gKz0gcEluW2NoYW5uZWxzICogaSArIDFdOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICAvLyBNaXggd2l0aCBkcnkgaW5wdXQKKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+T3V0RnJhbWVzW0ZDQ18yICogaV0gKz0gcEluW2ldOworICAgICAgICAgICAgICAgIHBDb250ZXh0LT5PdXRGcmFtZXNbRkNDXzIgKiBpICsgMV0gKz0gcEluW2ldOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8vIGFwcGx5IHZvbHVtZSB3aXRoIHJhbXAgaWYgbmVlZGVkCiAgICAgICAgIGlmICgocENvbnRleHQtPmxlZnRWb2x1bWUgIT0gcENvbnRleHQtPnByZXZMZWZ0Vm9sdW1lIHx8CkBAIC00NTAsMTggKzQ2OSwzMyBAQAogICAgICAgICB9CiAgICAgfQogCi0KLSAgICAvLyBBY2N1bXVsYXRlIGlmIHJlcXVpcmVkCi0gICAgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSl7Ci0gICAgICAgIC8vQUxPR1YoIlx0QnVmZmVyIGFjY2VzcyBpcyBBQ0NVTVVMQVRFIik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudCAqIEZDQ18yOyBpKyspIHsgLy8gYWx3YXlzIHN0ZXJlbyBoZXJlCi0gICAgICAgICAgICBwT3V0W2ldICs9IHBDb250ZXh0LT5PdXRGcmFtZXNbaV07CisgICAgaWYgKGNoYW5uZWxzID4gMikgeworICAgICAgICAvL0FjY3VtdWxhdGUgaWYgcmVxdWlyZWQKKyAgICAgICAgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBwT3V0W2NoYW5uZWxzICogaV0gKz0gcENvbnRleHQtPk91dEZyYW1lc1tGQ0NfMiAqIGldOworICAgICAgICAgICAgICAgIHBPdXRbY2hhbm5lbHMgKiBpICsgMV0gKz0gcENvbnRleHQtPk91dEZyYW1lc1tGQ0NfMiAqIGkgKyAxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgcE91dFtjaGFubmVscyAqIGldID0gcENvbnRleHQtPk91dEZyYW1lc1tGQ0NfMiAqIGldOworICAgICAgICAgICAgICAgIHBPdXRbY2hhbm5lbHMgKiBpICsgMV0gPSBwQ29udGV4dC0+T3V0RnJhbWVzW0ZDQ18yICogaSArIDFdOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfWVsc2V7Ci0gICAgICAgIC8vQUxPR1YoIlx0QnVmZmVyIGFjY2VzcyBpcyBXUklURSIpOwotICAgICAgICBtZW1jcHkocE91dCwgcENvbnRleHQtPk91dEZyYW1lcywgZnJhbWVDb3VudCAqIHNpemVvZigqcE91dCkgKiBGQ0NfMik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICBmb3IgKGludCBqID0gRkNDXzI7IGogPCBjaGFubmVsczsgaisrKSB7CisgICAgICAgICAgICAgICAgcE91dFtjaGFubmVscyAqIGkgKyBqXSA9IHBJbltjaGFubmVscyAqIGkgKyBqXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudCAqIEZDQ18yOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwT3V0W2ldICs9IHBDb250ZXh0LT5PdXRGcmFtZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkocE91dCwgcENvbnRleHQtPk91dEZyYW1lcywgZnJhbWVDb3VudCAqIHNpemVvZigqcE91dCkgKiBGQ0NfMik7CisgICAgICAgIH0KICAgICB9Ci0KICAgICByZXR1cm4gMDsKIH0gICAgLyogZW5kIHByb2Nlc3MgKi8KIApAQCAtNTI1LDkgKzU1OSwxMiBAQAogCiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9PSBwQ29uZmlnLT5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlKTsKICAgICBDSEVDS19BUkcocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID09IHBDb25maWctPm91dHB1dENmZy5mb3JtYXQpOworICAgIGludCBpbnB1dENoYW5uZWxzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzKTsKICAgICBDSEVDS19BUkcoKHBDb250ZXh0LT5hdXhpbGlhcnkgJiYgcENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTykgfHwKLSAgICAgICAgICAgICAgKCghcENvbnRleHQtPmF1eGlsaWFyeSkgJiYgcENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSk7Ci0gICAgQ0hFQ0tfQVJHKHBDb25maWctPm91dHB1dENmZy5jaGFubmVscyA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOworICAgICAgICAgICAgICAoKCFwQ29udGV4dC0+YXV4aWxpYXJ5KSAmJgorICAgICAgICAgICAgICAoaW5wdXRDaGFubmVscyA8PSBMVk1fTUFYX0NIQU5ORUxTKSkpOworICAgIGludCBvdXRwdXRDaGFubmVscyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMpOworICAgIENIRUNLX0FSRyhvdXRwdXRDaGFubmVscyA+PSBGQ0NfMiAmJiBvdXRwdXRDaGFubmVscyA8PSBMVk1fTUFYX0NIQU5ORUxTKTsKICAgICBDSEVDS19BUkcocENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUKICAgICAgICAgICAgICAgfHwgcENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSk7CiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9PSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVCk7CkBAIC02OTEsNyArNzI4LDcgQEAKICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgKi8KICAgICBmb3IgKGludCBpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspewogICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5TaXplICE9IDApewotICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPSBtYWxsb2MoTWVtVGFiLlJlZ2lvbltpXS5TaXplKTsKKyAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID0gY2FsbG9jKDEsIE1lbVRhYi5SZWdpb25baV0uU2l6ZSk7CiAKICAgICAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9PSBMVk1fTlVMTCl7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0TFZSRVZfRVJST1IgOlJldmVyYl9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAlIiBQUkl1MzIKQEAgLTc0OSw2ICs3ODYsOSBAQAogICAgICAgICBwYXJhbXMuU291cmNlRm9ybWF0ICAgPSBMVk1fU1RFUkVPOwogICAgIH0KIAorICAgIGlmICgocENvbnRleHQtPmF1eGlsaWFyeSA9PSBmYWxzZSkgJiYgKHBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX01PTk8pKSB7CisgICAgICAgIHBhcmFtcy5Tb3VyY2VGb3JtYXQgICA9IExWTV9TVEVSRU87CisgICAgfQogICAgIC8qIFJldmVyYiBwYXJhbWV0ZXJzICovCiAgICAgcGFyYW1zLkxldmVsICAgICAgICAgID0gMDsKICAgICBwYXJhbXMuTFBGICAgICAgICAgICAgPSAyMzk5OTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL0FuZHJvaWQuYnAKaW5kZXggYzg3NjM1Zi4uMTZjZDBhZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL0FuZHJvaWQuYnAKQEAgLTgsMTIgKzgsNiBAQAogCiAgICAgc3JjczogWyJQcmVQcm9jZXNzaW5nLmNwcCJdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJleHRlcm5hbC93ZWJydGMiLAotICAgICAgICAiZXh0ZXJuYWwvd2VicnRjL3dlYnJ0Yy9tb2R1bGVzL2luY2x1ZGUiLAotICAgICAgICAiZXh0ZXJuYWwvd2VicnRjL3dlYnJ0Yy9tb2R1bGVzL2F1ZGlvX3Byb2Nlc3NpbmcvaW5jbHVkZSIsCi0gICAgXSwKLQogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJ3ZWJydGNfYXVkaW9fcHJlcHJvY2Vzc2luZyIsCiAgICAgICAgICJsaWJzcGVleHJlc2FtcGxlciIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvUHJlUHJvY2Vzc2luZy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvUHJlUHJvY2Vzc2luZy5jcHAKaW5kZXggNWZhYjViZS4uYzdhZmUyZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL1ByZVByb2Nlc3NpbmcuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9QcmVQcm9jZXNzaW5nLmNwcApAQCAtMTI0MCw5ICsxMjQwLDkgQEAKICAgICAgICAgICAgIG1lbWNweShvdXRCdWZmZXItPnMxNiwKICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPm91dEJ1ZiwKICAgICAgICAgICAgICAgICAgIGZyICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKLSAgICAgICAgICAgIG1lbWNweShzZXNzaW9uLT5vdXRCdWYsCi0gICAgICAgICAgICAgICAgICBzZXNzaW9uLT5vdXRCdWYgKyBmciAqIHNlc3Npb24tPm91dENoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgIChzZXNzaW9uLT5mcmFtZXNPdXQgLSBmcikgKiBzZXNzaW9uLT5vdXRDaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICAgICAgbWVtbW92ZShzZXNzaW9uLT5vdXRCdWYsCisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPm91dEJ1ZiArIGZyICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAoc2Vzc2lvbi0+ZnJhbWVzT3V0IC0gZnIpICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKICAgICAgICAgICAgIHNlc3Npb24tPmZyYW1lc091dCAtPSBmcjsKICAgICAgICAgICAgIGZyYW1lc1dyICs9IGZyOwogICAgICAgICB9CkBAIC0xMzAzLDkgKzEzMDMsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5wcm9jRnJhbWUtPmRhdGFfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJPdXQpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbWVtY3B5KHNlc3Npb24tPmluQnVmLAotICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmluQnVmICsgZnJJbiAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgIChzZXNzaW9uLT5mcmFtZXNJbiAtIGZySW4pICogc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICAgICAgbWVtbW92ZShzZXNzaW9uLT5pbkJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+aW5CdWYgKyBmckluICogc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgIChzZXNzaW9uLT5mcmFtZXNJbiAtIGZySW4pICogc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOwogICAgICAgICAgICAgc2Vzc2lvbi0+ZnJhbWVzSW4gLT0gZnJJbjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHNpemVfdCBmciA9IHNlc3Npb24tPmZyYW1lQ291bnQgLSBzZXNzaW9uLT5mcmFtZXNJbjsKQEAgLTEzODEsOSArMTM4MSw5IEBACiAgICAgICAgIG1lbWNweShvdXRCdWZmZXItPnMxNiArIGZyYW1lc1dyICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50LAogICAgICAgICAgICAgICBzZXNzaW9uLT5vdXRCdWYsCiAgICAgICAgICAgICAgIGZyICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKLSAgICAgICAgbWVtY3B5KHNlc3Npb24tPm91dEJ1ZiwKLSAgICAgICAgICAgICAgc2Vzc2lvbi0+b3V0QnVmICsgZnIgKiBzZXNzaW9uLT5vdXRDaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgIChzZXNzaW9uLT5mcmFtZXNPdXQgLSBmcikgKiBzZXNzaW9uLT5vdXRDaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCkpOworICAgICAgICBtZW1tb3ZlKHNlc3Npb24tPm91dEJ1ZiwKKyAgICAgICAgICAgICAgICBzZXNzaW9uLT5vdXRCdWYgKyBmciAqIHNlc3Npb24tPm91dENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAoc2Vzc2lvbi0+ZnJhbWVzT3V0IC0gZnIpICogc2Vzc2lvbi0+b3V0Q2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKICAgICAgICAgc2Vzc2lvbi0+ZnJhbWVzT3V0IC09IGZyOwogICAgICAgICBvdXRCdWZmZXItPmZyYW1lQ291bnQgKz0gZnI7CiAKQEAgLTE4MzcsOSArMTgzNyw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPnJldkZyYW1lLT5kYXRhXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZyT3V0KTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbWNweShzZXNzaW9uLT5yZXZCdWYsCi0gICAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+cmV2QnVmICsgZnJJbiAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgIChzZXNzaW9uLT5mcmFtZXNSZXYgLSBmckluKSAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgICAgIG1lbW1vdmUoc2Vzc2lvbi0+cmV2QnVmLAorICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5yZXZCdWYgKyBmckluICogc2Vzc2lvbi0+aW5DaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgIChzZXNzaW9uLT5mcmFtZXNSZXYgLSBmckluKSAqIHNlc3Npb24tPmluQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpKTsKICAgICAgICAgICAgIHNlc3Npb24tPmZyYW1lc1JldiAtPSBmckluOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgc2l6ZV90IGZyID0gc2Vzc2lvbi0+ZnJhbWVDb3VudCAtIHNlc3Npb24tPmZyYW1lc1JldjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFmNmU4ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIGF1ZGlvIHByZXByb2Nlc3NpbmcgdW5pdCB0ZXN0CitjY190ZXN0IHsKKyAgICBuYW1lOiAiQXVkaW9QcmVQcm9jZXNzaW5nVGVzdCIsCisKKyAgICB2ZW5kb3I6IHRydWUsCisKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJzb3VuZGZ4IiwKKworICAgIHNyY3M6IFsiUHJlUHJvY2Vzc2luZ1Rlc3QuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW9wcmVwcm9jZXNzaW5nIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYndlYnJ0Y19hdWRpb19wcmVwcm9jZXNzaW5nIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRFdFQlJUQ19QT1NJWCIsCisgICAgICAgICItZnZpc2liaWxpdHk9ZGVmYXVsdCIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCisgICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL3Rlc3RzL1ByZVByb2Nlc3NpbmdUZXN0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9QcmVQcm9jZXNzaW5nVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM4MWQ3OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy90ZXN0cy9QcmVQcm9jZXNzaW5nVGVzdC5jcHAKQEAgLTAsMCArMSw0MjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfYWVjLmg+CisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfYWdjLmg+CisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfbnMuaD4KKyNpbmNsdWRlIDxhdWRpb19wcm9jZXNzaW5nLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW9fZWZmZWN0Lmg+CisjaW5jbHVkZSA8bW9kdWxlX2NvbW1vbl90eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9jaGFubmVscy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKKy8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgaW1wb3J0ZWQKK2V4dGVybiBhdWRpb19lZmZlY3RfbGlicmFyeV90IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbG9jYWwgZGVmaW5pdGlvbnMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIHR5cGVzIG9mIHByZSBwcm9jZXNzaW5nIG1vZHVsZXMKK2VudW0gUHJlUHJvY0lkIHsKKyAgUFJFUFJPQ19BR0MsICAvLyBBdXRvbWF0aWMgR2FpbiBDb250cm9sCisgIFBSRVBST0NfQUVDLCAgLy8gQWNvdXN0aWMgRWNobyBDYW5jZWxlcgorICBQUkVQUk9DX05TLCAgIC8vIE5vaXNlIFN1cHByZXNzb3IKKyAgUFJFUFJPQ19OVU1fRUZGRUNUUworfTsKKworZW51bSBQcmVQcm9jUGFyYW1zIHsKKyAgQVJHX0hFTFAgPSAxLAorICBBUkdfSU5QVVQsCisgIEFSR19PVVRQVVQsCisgIEFSR19GQVIsCisgIEFSR19GUywKKyAgQVJHX0NIX01BU0ssCisgIEFSR19BR0NfVEdUX0xWTCwKKyAgQVJHX0FHQ19DT01QX0xWTCwKKyAgQVJHX0FFQ19ERUxBWSwKKyAgQVJHX05TX0xWTCwKK307CisKK3N0cnVjdCBwcmVQcm9jQ29uZmlnUGFyYW1zX3QgeworICBpbnQgc2FtcGxpbmdGcmVxID0gMTYwMDA7CisgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoTWFzayA9IEFVRElPX0NIQU5ORUxfSU5fTU9OTzsKKyAgaW50IG5zTGV2ZWwgPSAwOyAgICAgICAgIC8vIGEgdmFsdWUgYmV0d2VlbiAwLTMKKyAgaW50IGFnY1RhcmdldExldmVsID0gMzsgIC8vIGluIGRCCisgIGludCBhZ2NDb21wTGV2ZWwgPSA5OyAgICAvLyBpbiBkQgorICBpbnQgYWVjRGVsYXkgPSAwOyAgICAgICAgLy8gaW4gbXMKK307CisKK2NvbnN0IGVmZmVjdF91dWlkX3Qga1ByZVByb2NVdWlkc1tQUkVQUk9DX05VTV9FRkZFQ1RTXSA9IHsKKyAgICB7MHhhYTgxMzBlMCwgMHg2NmZjLCAweDExZTAsIDB4YmFkMCwgezB4MDAsIDB4MDIsIDB4YTUsIDB4ZDUsIDB4YzUsIDB4MWJ9fSwgIC8vIGFnYyB1dWlkCisgICAgezB4YmIzOTJlYzAsIDB4OGQ0ZCwgMHgxMWUwLCAweGE4OTYsIHsweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFifX0sICAvLyBhZWMgdXVpZAorICAgIHsweGMwNmM4NDAwLCAweDhlMDYsIDB4MTFlMCwgMHg5Y2I2LCB7MHgwMCwgMHgwMiwgMHhhNSwgMHhkNSwgMHhjNSwgMHgxYn19LCAgLy8gbnMgIHV1aWQKK307CisKK2NvbnN0ZXhwciBhdWRpb19jaGFubmVsX21hc2tfdCBrUHJlUHJvY0NvbmZpZ0NoTWFza1tdID0geworICAgIEFVRElPX0NIQU5ORUxfSU5fTU9OTywKKyAgICBBVURJT19DSEFOTkVMX0lOX1NURVJFTywKKyAgICBBVURJT19DSEFOTkVMX0lOX0ZST05UX0JBQ0ssCisgICAgQVVESU9fQ0hBTk5FTF9JTl82LAorICAgIEFVRElPX0NIQU5ORUxfSU5fMlBPSU5UMFBPSU5UMiwKKyAgICBBVURJT19DSEFOTkVMX0lOXzJQT0lOVDFQT0lOVDIsCisgICAgQVVESU9fQ0hBTk5FTF9JTl8zUE9JTlQwUE9JTlQyLAorICAgIEFVRElPX0NIQU5ORUxfSU5fM1BPSU5UMVBPSU5UMiwKKyAgICBBVURJT19DSEFOTkVMX0lOXzVQT0lOVDEsCisgICAgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTktfTU9OTywKKyAgICBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0ROTElOS19NT05PLAorICAgIEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfQ0FMTF9NT05PLAorfTsKKworY29uc3RleHByIGludCBrUHJlUHJvY0NvbmZpZ0NoTWFza0NvdW50ID0gc3RkOjpzaXplKGtQcmVQcm9jQ29uZmlnQ2hNYXNrKTsKKwordm9pZCBwcmludFVzYWdlKCkgeworICBwcmludGYoIlxuVXNhZ2U6ICIpOworICBwcmludGYoIlxuICAgICA8ZXhlY3V0YWJsZT4gW29wdGlvbnNdXG4iKTsKKyAgcHJpbnRmKCJcbndoZXJlIG9wdGlvbnMgYXJlLCAiKTsKKyAgcHJpbnRmKCJcbiAgICAgLS1pbnB1dCA8aW5wdXRmaWxlPiIpOworICBwcmludGYoIlxuICAgICAgICAgICBwYXRoIHRvIHRoZSBpbnB1dCBmaWxlIik7CisgIHByaW50ZigiXG4gICAgIC0tb3V0cHV0IDxvdXRwdXRmaWxlPiIpOworICBwcmludGYoIlxuICAgICAgICAgICBwYXRoIHRvIHRoZSBvdXRwdXQgZmlsZSIpOworICBwcmludGYoIlxuICAgICAtLWhlbHAiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgUHJpbnRzIHRoaXMgdXNhZ2UgaW5mb3JtYXRpb24iKTsKKyAgcHJpbnRmKCJcbiAgICAgLS1mcyA8c2FtcGxpbmdfZnJlcT4iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgU2FtcGxpbmcgZnJlcXVlbmN5IGluIEh6LCBkZWZhdWx0IDE2MDAwLiIpOworICBwcmludGYoIlxuICAgICAtY2hfbWFzayA8Y2hhbm5lbF9tYXNrPlxuIik7CisgIHByaW50ZigiXG4gICAgICAgICAwICAtIEFVRElPX0NIQU5ORUxfSU5fTU9OTyIpOworICBwcmludGYoIlxuICAgICAgICAgMSAgLSBBVURJT19DSEFOTkVMX0lOX1NURVJFTyIpOworICBwcmludGYoIlxuICAgICAgICAgMiAgLSBBVURJT19DSEFOTkVMX0lOX0ZST05UX0JBQ0siKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDMgIC0gQVVESU9fQ0hBTk5FTF9JTl82Iik7CisgIHByaW50ZigiXG4gICAgICAgICA0ICAtIEFVRElPX0NIQU5ORUxfSU5fMlBPSU5UMFBPSU5UMiIpOworICBwcmludGYoIlxuICAgICAgICAgNSAgLSBBVURJT19DSEFOTkVMX0lOXzJQT0lOVDFQT0lOVDIiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDYgIC0gQVVESU9fQ0hBTk5FTF9JTl8zUE9JTlQwUE9JTlQyIik7CisgIHByaW50ZigiXG4gICAgICAgICA3ICAtIEFVRElPX0NIQU5ORUxfSU5fM1BPSU5UMVBPSU5UMiIpOworICBwcmludGYoIlxuICAgICAgICAgOCAgLSBBVURJT19DSEFOTkVMX0lOXzVQT0lOVDEiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDkgIC0gQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTktfTU9OTyIpOworICBwcmludGYoIlxuICAgICAgICAgMTAgLSBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0ROTElOS19NT05PICIpOworICBwcmludGYoIlxuICAgICAgICAgMTEgLSBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0NBTExfTU9OTyAiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIGRlZmF1bHQgMCIpOworICBwcmludGYoIlxuICAgICAtLWZhciA8ZmFyZW5kX2ZpbGU+Iik7CisgIHByaW50ZigiXG4gICAgICAgICAgIFBhdGggdG8gZmFyLWVuZCBmaWxlIG5lZWRlZCBmb3IgZWNobyBjYW5jZWxsYXRpb24iKTsKKyAgcHJpbnRmKCJcbiAgICAgLS1hZWMiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgRW5hYmxlIEVjaG8gQ2FuY2VsbGF0aW9uLCBkZWZhdWx0IGRpc2FibGVkIik7CisgIHByaW50ZigiXG4gICAgIC0tbnMiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgRW5hYmxlIE5vaXNlIFN1cHByZXNzaW9uLCBkZWZhdWx0IGRpc2FibGVkIik7CisgIHByaW50ZigiXG4gICAgIC0tYWdjIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBHYWluIENvbnRyb2wsIGRlZmF1bHQgZGlzYWJsZWQiKTsKKyAgcHJpbnRmKCJcbiAgICAgLS1uc19sdmwgPG5zX2xldmVsPiIpOworICBwcmludGYoIlxuICAgICAgICAgICBOb2lzZSBTdXBwcmVzc2lvbiBsZXZlbCBpbiBkQiwgZGVmYXVsdCB2YWx1ZSAwZEIiKTsKKyAgcHJpbnRmKCJcbiAgICAgLS1hZ2NfdGd0X2x2bCA8dGFyZ2V0X2xldmVsPiIpOworICBwcmludGYoIlxuICAgICAgICAgICBBR0MgVGFyZ2V0IExldmVsIGluIGRCLCBkZWZhdWx0IHZhbHVlIDNkQiIpOworICBwcmludGYoIlxuICAgICAtLWFnY19jb21wX2x2bCA8Y29tcF9sZXZlbD4iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgQUdDIENvbXAgTGV2ZWwgaW4gZEIsIGRlZmF1bHQgdmFsdWUgOWRCIik7CisgIHByaW50ZigiXG4gICAgIC0tYWVjX2RlbGF5IDxkZWxheT4iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgQUVDIGRlbGF5IHZhbHVlIGluIG1zLCBkZWZhdWx0IHZhbHVlIDBtcyIpOworICBwcmludGYoIlxuIik7Cit9CisKK2NvbnN0ZXhwciBmbG9hdCBrVGVuTWlsbGlTZWNWYWwgPSAwLjAxOworCitpbnQgcHJlUHJvY0NyZWF0ZUVmZmVjdChlZmZlY3RfaGFuZGxlX3QgKnBFZmZlY3RIYW5kbGUsIHVpbnQzMl90IGVmZmVjdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfY29uZmlnX3QgKnBDb25maWcsIGludCBzZXNzaW9uSWQsIGludCBpb0lkKSB7CisgIGlmIChpbnQgc3RhdHVzID0gQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0uY3JlYXRlX2VmZmVjdCgma1ByZVByb2NVdWlkc1tlZmZlY3RUeXBlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgaW9JZCwgcEVmZmVjdEhhbmRsZSk7CisgICAgICBzdGF0dXMgIT0gMCkgeworICAgIEFMT0dFKCJBdWRpbyBQcmVwcm9jZXNzaW5nIGNyZWF0ZSByZXR1cm5lZCBhbiBlcnJvciA9ICVkXG4iLCBzdGF0dXMpOworICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKyAgaW50IHJlcGx5ID0gMDsKKyAgdWludDMyX3QgcmVwbHlTaXplID0gc2l6ZW9mKHJlcGx5KTsKKyAgaWYgKGVmZmVjdFR5cGUgPT0gUFJFUFJPQ19BRUMpIHsKKyAgICAoKipwRWZmZWN0SGFuZGxlKQorICAgICAgICAtPmNvbW1hbmQoKnBFZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfU0VUX0NPTkZJR19SRVZFUlNFLCBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSwgcENvbmZpZywKKyAgICAgICAgICAgICAgICAgICZyZXBseVNpemUsICZyZXBseSk7CisgIH0KKyAgKCoqcEVmZmVjdEhhbmRsZSkKKyAgICAgIC0+Y29tbWFuZCgqcEVmZmVjdEhhbmRsZSwgRUZGRUNUX0NNRF9TRVRfQ09ORklHLCBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSwgcENvbmZpZywKKyAgICAgICAgICAgICAgICAmcmVwbHlTaXplLCAmcmVwbHkpOworICByZXR1cm4gcmVwbHk7Cit9CisKK2ludCBwcmVQcm9jU2V0Q29uZmlnUGFyYW0odWludDMyX3QgcGFyYW1UeXBlLCB1aW50MzJfdCBwYXJhbVZhbHVlLCBlZmZlY3RfaGFuZGxlX3QgZWZmZWN0SGFuZGxlKSB7CisgIGludCByZXBseSA9IDA7CisgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IHNpemVvZihyZXBseSk7CisgIHVpbnQzMl90IHBhcmFtRGF0YVsyXSA9IHtwYXJhbVR5cGUsIHBhcmFtVmFsdWV9OworICBlZmZlY3RfcGFyYW1fdCAqZWZmZWN0UGFyYW0gPQorICAgICAgKGVmZmVjdF9wYXJhbV90ICopbWFsbG9jKHNpemVvZigqZWZmZWN0UGFyYW0pICsgc2l6ZW9mKHBhcmFtRGF0YSkpOworICBtZW1jcHkoJmVmZmVjdFBhcmFtLT5kYXRhWzBdLCAmcGFyYW1EYXRhWzBdLCBzaXplb2YocGFyYW1EYXRhKSk7CisgIGVmZmVjdFBhcmFtLT5wc2l6ZSA9IHNpemVvZihwYXJhbURhdGFbMF0pOworICAoKmVmZmVjdEhhbmRsZSkKKyAgICAgIC0+Y29tbWFuZChlZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfU0VUX1BBUkFNLCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpLCBlZmZlY3RQYXJhbSwKKyAgICAgICAgICAgICAgICAmcmVwbHlTaXplLCAmcmVwbHkpOworICBmcmVlKGVmZmVjdFBhcmFtKTsKKyAgcmV0dXJuIHJlcGx5OworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSB7CisgIGlmIChhcmdjID09IDEpIHsKKyAgICBwcmludFVzYWdlKCk7CisgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgfQorICBjb25zdCBjaGFyICppbnB1dEZpbGUgPSBudWxscHRyOworICBjb25zdCBjaGFyICpvdXRwdXRGaWxlID0gbnVsbHB0cjsKKyAgY29uc3QgY2hhciAqZmFyRmlsZSA9IG51bGxwdHI7CisgIGludCBlZmZlY3RFbltQUkVQUk9DX05VTV9FRkZFQ1RTXSA9IHswfTsKKworICBjb25zdCBvcHRpb24gbG9uZ19vcHRzW10gPSB7CisgICAgICB7ImhlbHAiLCBub19hcmd1bWVudCwgbnVsbHB0ciwgQVJHX0hFTFB9LAorICAgICAgeyJpbnB1dCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfSU5QVVR9LAorICAgICAgeyJvdXRwdXQiLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX09VVFBVVH0sCisgICAgICB7ImZhciIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfRkFSfSwKKyAgICAgIHsiZnMiLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX0ZTfSwKKyAgICAgIHsiY2hfbWFzayIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfQ0hfTUFTS30sCisgICAgICB7ImFnY190Z3RfbHZsIiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19BR0NfVEdUX0xWTH0sCisgICAgICB7ImFnY19jb21wX2x2bCIsIHJlcXVpcmVkX2FyZ3VtZW50LCBudWxscHRyLCBBUkdfQUdDX0NPTVBfTFZMfSwKKyAgICAgIHsiYWVjX2RlbGF5IiwgcmVxdWlyZWRfYXJndW1lbnQsIG51bGxwdHIsIEFSR19BRUNfREVMQVl9LAorICAgICAgeyJuc19sdmwiLCByZXF1aXJlZF9hcmd1bWVudCwgbnVsbHB0ciwgQVJHX05TX0xWTH0sCisgICAgICB7ImFlYyIsIG5vX2FyZ3VtZW50LCAmZWZmZWN0RW5bUFJFUFJPQ19BRUNdLCAxfSwKKyAgICAgIHsiYWdjIiwgbm9fYXJndW1lbnQsICZlZmZlY3RFbltQUkVQUk9DX0FHQ10sIDF9LAorICAgICAgeyJucyIsIG5vX2FyZ3VtZW50LCAmZWZmZWN0RW5bUFJFUFJPQ19OU10sIDF9LAorICAgICAge251bGxwdHIsIDAsIG51bGxwdHIsIDB9LAorICB9OworICBzdHJ1Y3QgcHJlUHJvY0NvbmZpZ1BhcmFtc190IHByZVByb2NDZmdQYXJhbXMge307CisKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBjb25zdCBpbnQgb3B0ID0gZ2V0b3B0X2xvbmcoYXJnYywgKGNoYXIgKmNvbnN0ICopYXJndiwgImk6bzoiLCBsb25nX29wdHMsIG51bGxwdHIpOworICAgIGlmIChvcHQgPT0gLTEpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBzd2l0Y2ggKG9wdCkgeworICAgICAgY2FzZSBBUkdfSEVMUDoKKyAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIGNhc2UgQVJHX0lOUFVUOiB7CisgICAgICAgIGlucHV0RmlsZSA9IChjaGFyICopb3B0YXJnOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGNhc2UgQVJHX09VVFBVVDogeworICAgICAgICBvdXRwdXRGaWxlID0gKGNoYXIgKilvcHRhcmc7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBBUkdfRkFSOiB7CisgICAgICAgIGZhckZpbGUgPSAoY2hhciAqKW9wdGFyZzsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEFSR19GUzogeworICAgICAgICBwcmVQcm9jQ2ZnUGFyYW1zLnNhbXBsaW5nRnJlcSA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEFSR19DSF9NQVNLOiB7CisgICAgICAgIGludCBjaE1hc2tJZHggPSBhdG9pKG9wdGFyZyk7CisgICAgICAgIGlmIChjaE1hc2tJZHggPCAwIG9yIGNoTWFza0lkeCA+IGtQcmVQcm9jQ29uZmlnQ2hNYXNrQ291bnQpIHsKKyAgICAgICAgICBBTE9HRSgiQ2hhbm5lbCBNYXNrIGluZGV4IG5vdCBpbiBjb3JyZWN0IHJhbmdlXG4iKTsKKyAgICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgfQorICAgICAgICBwcmVQcm9jQ2ZnUGFyYW1zLmNoTWFzayA9IGtQcmVQcm9jQ29uZmlnQ2hNYXNrW2NoTWFza0lkeF07CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBBUkdfQUdDX1RHVF9MVkw6IHsKKyAgICAgICAgcHJlUHJvY0NmZ1BhcmFtcy5hZ2NUYXJnZXRMZXZlbCA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBjYXNlIEFSR19BR0NfQ09NUF9MVkw6IHsKKyAgICAgICAgcHJlUHJvY0NmZ1BhcmFtcy5hZ2NDb21wTGV2ZWwgPSBhdG9pKG9wdGFyZyk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBBUkdfQUVDX0RFTEFZOiB7CisgICAgICAgIHByZVByb2NDZmdQYXJhbXMuYWVjRGVsYXkgPSBhdG9pKG9wdGFyZyk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgY2FzZSBBUkdfTlNfTFZMOiB7CisgICAgICAgIHByZVByb2NDZmdQYXJhbXMubnNMZXZlbCA9IGF0b2kob3B0YXJnKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoaW5wdXRGaWxlID09IG51bGxwdHIpIHsKKyAgICBBTE9HRSgiRXJyb3I6IG1pc3NpbmcgaW5wdXQgZmlsZVxuIik7CisgICAgcHJpbnRVc2FnZSgpOworICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8RklMRSwgZGVjbHR5cGUoJmZjbG9zZSk+IGlucHV0RnAoZm9wZW4oaW5wdXRGaWxlLCAicmIiKSwgJmZjbG9zZSk7CisgIGlmIChpbnB1dEZwID09IG51bGxwdHIpIHsKKyAgICBBTE9HRSgiQ2Fubm90IG9wZW4gaW5wdXQgZmlsZSAlc1xuIiwgaW5wdXRGaWxlKTsKKyAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPEZJTEUsIGRlY2x0eXBlKCZmY2xvc2UpPiBmYXJGcChmb3BlbihmYXJGaWxlLCAicmIiKSwgJmZjbG9zZSk7CisgIHN0ZDo6dW5pcXVlX3B0cjxGSUxFLCBkZWNsdHlwZSgmZmNsb3NlKT4gb3V0cHV0RnAoZm9wZW4ob3V0cHV0RmlsZSwgIndiIiksICZmY2xvc2UpOworICBpZiAoZWZmZWN0RW5bUFJFUFJPQ19BRUNdKSB7CisgICAgaWYgKGZhckZpbGUgPT0gbnVsbHB0cikgeworICAgICAgQUxPR0UoIkZhciBlbmQgc2lnbmFsIGZpbGUgcmVxdWlyZWQgZm9yIGVjaG8gY2FuY2VsbGF0aW9uIFxuIik7CisgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgICBpZiAoZmFyRnAgPT0gbnVsbHB0cikgeworICAgICAgQUxPR0UoIkNhbm5vdCBvcGVuIGZhciBlbmQgc3RyZWFtIGZpbGUgJXNcbiIsIGZhckZpbGUpOworICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisgICAgc3RydWN0IHN0YXQgc3RhdElucHV0LCBzdGF0RmFyOworICAgICh2b2lkKWZzdGF0KGZpbGVubyhpbnB1dEZwLmdldCgpKSwgJnN0YXRJbnB1dCk7CisgICAgKHZvaWQpZnN0YXQoZmlsZW5vKGZhckZwLmdldCgpKSwgJnN0YXRGYXIpOworICAgIGlmIChzdGF0SW5wdXQuc3Rfc2l6ZSAhPSBzdGF0RmFyLnN0X3NpemUpIHsKKyAgICAgIEFMT0dFKCJOZWFyIGFuZCBmYXIgZW5kIHNpZ25hbHMgYXJlIG9mIGRpZmZlcmVudCBzaXplcyIpOworICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisgIH0KKyAgaWYgKG91dHB1dEZpbGUgIT0gbnVsbHB0ciAmJiBvdXRwdXRGcCA9PSBudWxscHRyKSB7CisgICAgQUxPR0UoIkNhbm5vdCBvcGVuIG91dHB1dCBmaWxlICVzXG4iLCBvdXRwdXRGaWxlKTsKKyAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICB9CisKKyAgaW50MzJfdCBzZXNzaW9uSWQgPSAxOworICBpbnQzMl90IGlvSWQgPSAxOworICBlZmZlY3RfaGFuZGxlX3QgZWZmZWN0SGFuZGxlW1BSRVBST0NfTlVNX0VGRkVDVFNdID0ge251bGxwdHJ9OworICBlZmZlY3RfY29uZmlnX3QgY29uZmlnOworICBjb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gY29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSBwcmVQcm9jQ2ZnUGFyYW1zLnNhbXBsaW5nRnJlcTsKKyAgY29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gY29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IHByZVByb2NDZmdQYXJhbXMuY2hNYXNrOworICBjb25maWcuaW5wdXRDZmcuZm9ybWF0ID0gY29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKworICAvLyBDcmVhdGUgYWxsIHRoZSBlZmZlY3QgaGFuZGxlcworICBmb3IgKGludCBpID0gMDsgaSA8IFBSRVBST0NfTlVNX0VGRkVDVFM7IGkrKykgeworICAgIGlmIChpbnQgc3RhdHVzID0gcHJlUHJvY0NyZWF0ZUVmZmVjdCgmZWZmZWN0SGFuZGxlW2ldLCBpLCAmY29uZmlnLCBzZXNzaW9uSWQsIGlvSWQpOworICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgQUxPR0UoIkNyZWF0ZSBlZmZlY3QgY2FsbCByZXR1cm5lZCBlcnJvciAlaSIsIHN0YXR1cyk7CisgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgUFJFUFJPQ19OVU1fRUZGRUNUUzsgaSsrKSB7CisgICAgaWYgKGVmZmVjdEVuW2ldID09IDEpIHsKKyAgICAgIGludCByZXBseSA9IDA7CisgICAgICB1aW50MzJfdCByZXBseVNpemUgPSBzaXplb2YocmVwbHkpOworICAgICAgKCplZmZlY3RIYW5kbGVbaV0pCisgICAgICAgICAgLT5jb21tYW5kKGVmZmVjdEhhbmRsZVtpXSwgRUZGRUNUX0NNRF9FTkFCTEUsIDAsIG51bGxwdHIsICZyZXBseVNpemUsICZyZXBseSk7CisgICAgICBpZiAocmVwbHkgIT0gMCkgeworICAgICAgICBBTE9HRSgiQ29tbWFuZCBlbmFibGUgY2FsbCByZXR1cm5lZCBlcnJvciAlZFxuIiwgcmVwbHkpOworICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIFNldCBDb25maWcgUGFyYW1zIG9mIHRoZSBlZmZlY3RzCisgIGlmIChlZmZlY3RFbltQUkVQUk9DX0FHQ10pIHsKKyAgICBpZiAoaW50IHN0YXR1cyA9IHByZVByb2NTZXRDb25maWdQYXJhbShBR0NfUEFSQU1fVEFSR0VUX0xFVkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClwcmVQcm9jQ2ZnUGFyYW1zLmFnY1RhcmdldExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEhhbmRsZVtQUkVQUk9DX0FHQ10pOworICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgQUxPR0UoIkludmFsaWQgQUdDIFRhcmdldCBMZXZlbC4gRXJyb3IgJWRcbiIsIHN0YXR1cyk7CisgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgICBpZiAoaW50IHN0YXR1cyA9CisgICAgICAgICAgICBwcmVQcm9jU2V0Q29uZmlnUGFyYW0oQUdDX1BBUkFNX0NPTVBfR0FJTiwgKHVpbnQzMl90KXByZVByb2NDZmdQYXJhbXMuYWdjQ29tcExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEhhbmRsZVtQUkVQUk9DX0FHQ10pOworICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgQUxPR0UoIkludmFsaWQgQUdDIENvbXAgR2Fpbi4gRXJyb3IgJWRcbiIsIHN0YXR1cyk7CisgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgfQorICBpZiAoZWZmZWN0RW5bUFJFUFJPQ19OU10pIHsKKyAgICBpZiAoaW50IHN0YXR1cyA9IHByZVByb2NTZXRDb25maWdQYXJhbShOU19QQVJBTV9MRVZFTCwgKHVpbnQzMl90KXByZVByb2NDZmdQYXJhbXMubnNMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RIYW5kbGVbUFJFUFJPQ19OU10pOworICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgQUxPR0UoIkludmFsaWQgTm9pc2UgU3VwcHJlc3Npb24gbGV2ZWwgRXJyb3IgJWRcbiIsIHN0YXR1cyk7CisgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgIH0KKyAgfQorCisgIC8vIFByb2Nlc3MgQ2FsbAorICBjb25zdCBpbnQgZnJhbWVMZW5ndGggPSAoaW50KShwcmVQcm9jQ2ZnUGFyYW1zLnNhbXBsaW5nRnJlcSAqIGtUZW5NaWxsaVNlY1ZhbCk7CisgIGNvbnN0IGludCBpb0NoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKHByZVByb2NDZmdQYXJhbXMuY2hNYXNrKTsKKyAgY29uc3QgaW50IGlvRnJhbWVTaXplID0gaW9DaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpOworICBpbnQgZnJhbWVDb3VudGVyID0gMDsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBzdGQ6OnZlY3RvcjxzaG9ydD4gaW4oZnJhbWVMZW5ndGggKiBpb0NoYW5uZWxDb3VudCk7CisgICAgc3RkOjp2ZWN0b3I8c2hvcnQ+IG91dChmcmFtZUxlbmd0aCAqIGlvQ2hhbm5lbENvdW50KTsKKyAgICBzdGQ6OnZlY3RvcjxzaG9ydD4gZmFySW4oZnJhbWVMZW5ndGggKiBpb0NoYW5uZWxDb3VudCk7CisgICAgc2l6ZV90IHNhbXBsZXNSZWFkID0gZnJlYWQoaW4uZGF0YSgpLCBpb0ZyYW1lU2l6ZSwgZnJhbWVMZW5ndGgsIGlucHV0RnAuZ2V0KCkpOworICAgIGlmIChzYW1wbGVzUmVhZCA9PSAwKSB7CisgICAgICBicmVhazsKKyAgICB9CisgICAgYXVkaW9fYnVmZmVyX3QgaW5wdXRCdWZmZXIsIG91dHB1dEJ1ZmZlcjsKKyAgICBhdWRpb19idWZmZXJfdCBmYXJJbkJ1ZmZlcnt9OworICAgIGlucHV0QnVmZmVyLmZyYW1lQ291bnQgPSBzYW1wbGVzUmVhZDsKKyAgICBvdXRwdXRCdWZmZXIuZnJhbWVDb3VudCA9IHNhbXBsZXNSZWFkOworICAgIGlucHV0QnVmZmVyLnMxNiA9IGluLmRhdGEoKTsKKyAgICBvdXRwdXRCdWZmZXIuczE2ID0gb3V0LmRhdGEoKTsKKworICAgIGlmIChmYXJGcCAhPSBudWxscHRyKSB7CisgICAgICBzYW1wbGVzUmVhZCA9IGZyZWFkKGZhckluLmRhdGEoKSwgaW9GcmFtZVNpemUsIGZyYW1lTGVuZ3RoLCBmYXJGcC5nZXQoKSk7CisgICAgICBpZiAoc2FtcGxlc1JlYWQgPT0gMCkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGZhckluQnVmZmVyLmZyYW1lQ291bnQgPSBzYW1wbGVzUmVhZDsKKyAgICAgIGZhckluQnVmZmVyLnMxNiA9IGZhckluLmRhdGEoKTsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IFBSRVBST0NfTlVNX0VGRkVDVFM7IGkrKykgeworICAgICAgaWYgKGVmZmVjdEVuW2ldID09IDEpIHsKKyAgICAgICAgaWYgKGkgPT0gUFJFUFJPQ19BRUMpIHsKKyAgICAgICAgICBpZiAoaW50IHN0YXR1cyA9CisgICAgICAgICAgICAgICAgICBwcmVQcm9jU2V0Q29uZmlnUGFyYW0oQUVDX1BBUkFNX0VDSE9fREVMQVksICh1aW50MzJfdClwcmVQcm9jQ2ZnUGFyYW1zLmFlY0RlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdEhhbmRsZVtQUkVQUk9DX0FFQ10pOworICAgICAgICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgQUxPR0UoInByZVByb2NTZXRDb25maWdQYXJhbSByZXR1cm5lZCBFcnJvciAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpbnQgc3RhdHVzID0KKyAgICAgICAgICAgICAgICAoKmVmZmVjdEhhbmRsZVtpXSktPnByb2Nlc3MoZWZmZWN0SGFuZGxlW2ldLCAmaW5wdXRCdWZmZXIsICZvdXRwdXRCdWZmZXIpOworICAgICAgICAgICAgc3RhdHVzICE9IDApIHsKKyAgICAgICAgICBBTE9HRSgiXG5FcnJvcjogUHJvY2VzcyBpID0gJWQgcmV0dXJuZWQgd2l0aCBlcnJvciAlZFxuIiwgaSwgc3RhdHVzKTsKKyAgICAgICAgICByZXR1cm4gRVhJVF9GQUlMVVJFOworICAgICAgICB9CisgICAgICAgIGlmIChpID09IFBSRVBST0NfQUVDKSB7CisgICAgICAgICAgaWYgKGludCBzdGF0dXMgPSAoKmVmZmVjdEhhbmRsZVtpXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPnByb2Nlc3NfcmV2ZXJzZShlZmZlY3RIYW5kbGVbaV0sICZmYXJJbkJ1ZmZlciwgJm91dHB1dEJ1ZmZlcik7CisgICAgICAgICAgICAgIHN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiXG5FcnJvcjogUHJvY2VzcyByZXZlcnNlIGkgPSAlZCByZXR1cm5lZCB3aXRoIGVycm9yICVkXG4iLCBpLCBzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgaWYgKG91dHB1dEZwICE9IG51bGxwdHIpIHsKKyAgICAgIHNpemVfdCBzYW1wbGVzV3JpdHRlbiA9CisgICAgICAgICAgZndyaXRlKG91dC5kYXRhKCksIGlvRnJhbWVTaXplLCBvdXRwdXRCdWZmZXIuZnJhbWVDb3VudCwgb3V0cHV0RnAuZ2V0KCkpOworICAgICAgaWYgKHNhbXBsZXNXcml0dGVuICE9IG91dHB1dEJ1ZmZlci5mcmFtZUNvdW50KSB7CisgICAgICAgIEFMT0dFKCJcbkVycm9yOiBPdXRwdXQgZmlsZSB3cml0aW5nIGZhaWxlZCIpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgZnJhbWVDb3VudGVyICs9IGZyYW1lTGVuZ3RoOworICB9CisgIC8vIFJlbGVhc2UgYWxsIHRoZSBlZmZlY3QgaGFuZGxlcyBjcmVhdGVkCisgIGZvciAoaW50IGkgPSAwOyBpIDwgUFJFUFJPQ19OVU1fRUZGRUNUUzsgaSsrKSB7CisgICAgaWYgKGludCBzdGF0dXMgPSBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTS5yZWxlYXNlX2VmZmVjdChlZmZlY3RIYW5kbGVbaV0pOworICAgICAgICBzdGF0dXMgIT0gMCkgeworICAgICAgQUxPR0UoIkF1ZGlvIFByZXByb2Nlc3NpbmcgcmVsZWFzZSByZXR1cm5lZCBhbiBlcnJvciA9ICVkXG4iLCBzdGF0dXMpOworICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvcHJveHkvRWZmZWN0UHJveHkuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9wcm94eS9FZmZlY3RQcm94eS5jcHAKaW5kZXggNDJlNDRmMC4uYzAxMGQ2OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9wcm94eS9FZmZlY3RQcm94eS5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9wcm94eS9FZmZlY3RQcm94eS5jcHAKQEAgLTMwLDcgKzMwLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci0vLyBUaGlzIGlzIGEgZHVtbXkgcHJveHkgZGVzY3JpcHRvciBqdXN0IHRvIHJldHVybiB0byBGYWN0b3J5IGR1cmluZyB0aGUgaW5pdGlhbAorLy8gVGhpcyBpcyBhIHN0dWIgcHJveHkgZGVzY3JpcHRvciBqdXN0IHRvIHJldHVybiB0byBGYWN0b3J5IGR1cmluZyB0aGUgaW5pdGlhbAogLy8gR2V0RGVzY3JpcHRvciBjYWxsLiBMYXRlciBpbiB0aGUgZmFjdG9yeSwgaXQgaXMgcmVwbGFjZWQgd2l0aCB0aGUKIC8vIFNXIHN1YiBlZmZlY3QgZGVzY3JpcHRvcgogLy8gcHJveHkgVVVJRCBhZjhkYTdlMC0yY2ExLTExZTMtYjcxZC0wMDAyYTVkNWM1MWIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwCmluZGV4IDNmZDNmYzMuLjFjYWVlMDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icApAQCAtMTcsNiArMTcsMjIgQEAKICAgICBdLAogfQogCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJtZWRpYV9kYXRhc291cmNlX2hlYWRlcnMiLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEiLAorICAgIF0sCisgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorfQorCiBmaWxlZ3JvdXAgewogICAgIG5hbWU6ICJsaWJtZWRpYV9vbXhfYWlkbCIsCiAgICAgc3JjczogWwpAQCAtMjAzLDcgKzIxOSw3IEBACiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhX2RhdGFzb3VyY2VfaGVhZGVycyIsCiAgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgXSwKIApAQCAtMjIwLDYgKzIzNiwxNCBAQAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKKworICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKIH0KIAogY2NfbGlicmFyeV9zaGFyZWQgewpAQCAtMzA5LDExICszMzMsMTMgQEAKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCiAgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCisgICAgICAgICJqbmlfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAogICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgICAgICAiam5pX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwpAQCAtMzcyLDMgKzM5OCwzNiBAQAogICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKIH0KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJtZWRpYV9uZGtmb3JtYXRwcml2IiwKKworICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiTmRrTWVkaWFGb3JtYXRQcml2LmNwcCIsCisgICAgICAgICJOZGtNZWRpYUVycm9yUHJpdi5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1ERVhQT1JUPV9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoXCJkZWZhdWx0XCIpKSkiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKKworICAgIGFwZXhfYXZhaWxhYmxlOiBbImNvbS5hbmRyb2lkLm1lZGlhIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCmluZGV4IDYzNzMyMmYuLjhiZTk2MWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCkBAIC0yNDAsNyArMjQwLDEwIEBACiAKICAgICBjb25zdCBzaXplX3Qgbk1hcHBpbmdzID0gc2l6ZW9mKHNWaWRlb0VuY29kZXJOYW1lTWFwKS9zaXplb2Yoc1ZpZGVvRW5jb2Rlck5hbWVNYXBbMF0pOwogICAgIGNvbnN0IGludCBjb2RlYyA9IGZpbmRUYWdGb3JOYW1lKHNWaWRlb0VuY29kZXJOYW1lTWFwLCBuTWFwcGluZ3MsIGF0dHNbMV0pOwotICAgIENIRUNLKGNvZGVjICE9IC0xKTsKKyAgICBpZiAoY29kZWMgPT0gLTEpIHsKKyAgICAgIEFMT0dFKCJNZWRpYVByb2ZpbGVzOjpjcmVhdGVWaWRlb0NvZGVjIGZhaWxlZCB0byBsb2NhdGUgY29kZWMgJXMiLCBhdHRzWzFdKTsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KIAogICAgIE1lZGlhUHJvZmlsZXM6OlZpZGVvQ29kZWMgKnZpZGVvQ29kZWMgPQogICAgICAgICBuZXcgTWVkaWFQcm9maWxlczo6VmlkZW9Db2RlYyhzdGF0aWNfY2FzdDx2aWRlb19lbmNvZGVyPihjb2RlYyksCkBAIC0yNjIsNyArMjY1LDEwIEBACiAgICAgICAgICAgIXN0cmNtcCgiY2hhbm5lbHMiLCAgIGF0dHNbNl0pKTsKICAgICBjb25zdCBzaXplX3Qgbk1hcHBpbmdzID0gc2l6ZW9mKHNBdWRpb0VuY29kZXJOYW1lTWFwKS9zaXplb2Yoc0F1ZGlvRW5jb2Rlck5hbWVNYXBbMF0pOwogICAgIGNvbnN0IGludCBjb2RlYyA9IGZpbmRUYWdGb3JOYW1lKHNBdWRpb0VuY29kZXJOYW1lTWFwLCBuTWFwcGluZ3MsIGF0dHNbMV0pOwotICAgIENIRUNLKGNvZGVjICE9IC0xKTsKKyAgICBpZiAoY29kZWMgPT0gLTEpIHsKKyAgICAgIEFMT0dFKCJNZWRpYVByb2ZpbGVzOjpjcmVhdGVBdWRpb0NvZGVjIGZhaWxlZCB0byBsb2NhdGUgY29kZWMgJXMiLCBhdHRzWzFdKTsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KIAogICAgIE1lZGlhUHJvZmlsZXM6OkF1ZGlvQ29kZWMgKmF1ZGlvQ29kZWMgPQogICAgICAgICBuZXcgTWVkaWFQcm9maWxlczo6QXVkaW9Db2RlYyhzdGF0aWNfY2FzdDxhdWRpb19lbmNvZGVyPihjb2RlYyksCkBAIC0yODIsNyArMjg4LDEwIEBACiAKICAgICBjb25zdCBzaXplX3Qgbk1hcHBpbmdzID0gc2l6ZW9mKHNBdWRpb0RlY29kZXJOYW1lTWFwKS9zaXplb2Yoc0F1ZGlvRGVjb2Rlck5hbWVNYXBbMF0pOwogICAgIGNvbnN0IGludCBjb2RlYyA9IGZpbmRUYWdGb3JOYW1lKHNBdWRpb0RlY29kZXJOYW1lTWFwLCBuTWFwcGluZ3MsIGF0dHNbMV0pOwotICAgIENIRUNLKGNvZGVjICE9IC0xKTsKKyAgICBpZiAoY29kZWMgPT0gLTEpIHsKKyAgICAgIEFMT0dFKCJNZWRpYVByb2ZpbGVzOjpjcmVhdGVBdWRpb0RlY29kZXJDYXAgZmFpbGVkIHRvIGxvY2F0ZSBjb2RlYyAlcyIsIGF0dHNbMV0pOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQogCiAgICAgTWVkaWFQcm9maWxlczo6QXVkaW9EZWNvZGVyQ2FwICpjYXAgPQogICAgICAgICBuZXcgTWVkaWFQcm9maWxlczo6QXVkaW9EZWNvZGVyQ2FwKHN0YXRpY19jYXN0PGF1ZGlvX2RlY29kZXI+KGNvZGVjKSk7CkBAIC0yOTgsNyArMzA3LDEwIEBACiAKICAgICBjb25zdCBzaXplX3Qgbk1hcHBpbmdzID0gc2l6ZW9mKHNWaWRlb0RlY29kZXJOYW1lTWFwKS9zaXplb2Yoc1ZpZGVvRGVjb2Rlck5hbWVNYXBbMF0pOwogICAgIGNvbnN0IGludCBjb2RlYyA9IGZpbmRUYWdGb3JOYW1lKHNWaWRlb0RlY29kZXJOYW1lTWFwLCBuTWFwcGluZ3MsIGF0dHNbMV0pOwotICAgIENIRUNLKGNvZGVjICE9IC0xKTsKKyAgICBpZiAoY29kZWMgPT0gLTEpIHsKKyAgICAgIEFMT0dFKCJNZWRpYVByb2ZpbGVzOjpjcmVhdGVWaWRlb0RlY29kZXJDYXAgZmFpbGVkIHRvIGxvY2F0ZSBjb2RlYyAlcyIsIGF0dHNbMV0pOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQogCiAgICAgTWVkaWFQcm9maWxlczo6VmlkZW9EZWNvZGVyQ2FwICpjYXAgPQogICAgICAgICBuZXcgTWVkaWFQcm9maWxlczo6VmlkZW9EZWNvZGVyQ2FwKHN0YXRpY19jYXN0PHZpZGVvX2RlY29kZXI+KGNvZGVjKSk7CkBAIC0zMjIsNyArMzM0LDEwIEBACiAKICAgICBjb25zdCBzaXplX3Qgbk1hcHBpbmdzID0gc2l6ZW9mKHNWaWRlb0VuY29kZXJOYW1lTWFwKS9zaXplb2Yoc1ZpZGVvRW5jb2Rlck5hbWVNYXBbMF0pOwogICAgIGNvbnN0IGludCBjb2RlYyA9IGZpbmRUYWdGb3JOYW1lKHNWaWRlb0VuY29kZXJOYW1lTWFwLCBuTWFwcGluZ3MsIGF0dHNbMV0pOwotICAgIENIRUNLKGNvZGVjICE9IC0xKTsKKyAgICBpZiAoY29kZWMgPT0gLTEpIHsKKyAgICAgIEFMT0dFKCJNZWRpYVByb2ZpbGVzOjpjcmVhdGVWaWRlb0VuY29kZXJDYXAgZmFpbGVkIHRvIGxvY2F0ZSBjb2RlYyAlcyIsIGF0dHNbMV0pOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQogCiAgICAgTWVkaWFQcm9maWxlczo6VmlkZW9FbmNvZGVyQ2FwICpjYXAgPQogICAgICAgICBuZXcgTWVkaWFQcm9maWxlczo6VmlkZW9FbmNvZGVyQ2FwKHN0YXRpY19jYXN0PHZpZGVvX2VuY29kZXI+KGNvZGVjKSwKQEAgLTM0Niw3ICszNjEsMTAgQEAKIAogICAgIGNvbnN0IHNpemVfdCBuTWFwcGluZ3MgPSBzaXplb2Yoc0F1ZGlvRW5jb2Rlck5hbWVNYXApL3NpemVvZihzQXVkaW9FbmNvZGVyTmFtZU1hcFswXSk7CiAgICAgY29uc3QgaW50IGNvZGVjID0gZmluZFRhZ0Zvck5hbWUoc0F1ZGlvRW5jb2Rlck5hbWVNYXAsIG5NYXBwaW5ncywgYXR0c1sxXSk7Ci0gICAgQ0hFQ0soY29kZWMgIT0gLTEpOworICAgIGlmIChjb2RlYyA9PSAtMSkgeworICAgICAgQUxPR0UoIk1lZGlhUHJvZmlsZXM6OmNyZWF0ZUF1ZGlvRW5jb2RlckNhcCBmYWlsZWQgdG8gbG9jYXRlIGNvZGVjICVzIiwgYXR0c1sxXSk7CisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CiAKICAgICBNZWRpYVByb2ZpbGVzOjpBdWRpb0VuY29kZXJDYXAgKmNhcCA9CiAgICAgICAgIG5ldyBNZWRpYVByb2ZpbGVzOjpBdWRpb0VuY29kZXJDYXAoc3RhdGljX2Nhc3Q8YXVkaW9fZW5jb2Rlcj4oY29kZWMpLCBhdG9pKGF0dHNbNV0pLApAQCAtMzg2LDExICs0MDQsMTcgQEAKICAgICBjb25zdCBzaXplX3QgblByb2ZpbGVNYXBwaW5ncyA9IHNpemVvZihzQ2FtY29yZGVyUXVhbGl0eU5hbWVNYXApLwogICAgICAgICAgICAgc2l6ZW9mKHNDYW1jb3JkZXJRdWFsaXR5TmFtZU1hcFswXSk7CiAgICAgY29uc3QgaW50IHF1YWxpdHkgPSBmaW5kVGFnRm9yTmFtZShzQ2FtY29yZGVyUXVhbGl0eU5hbWVNYXAsIG5Qcm9maWxlTWFwcGluZ3MsIGF0dHNbMV0pOwotICAgIENIRUNLKHF1YWxpdHkgIT0gLTEpOworICAgIGlmIChxdWFsaXR5ID09IC0xKSB7CisgICAgICBBTE9HRSgiTWVkaWFQcm9maWxlczo6Y3JlYXRlQ2FtY29yZGVyUHJvZmlsZSBmYWlsZWQgdG8gbG9jYXRlIHF1YWxpdHkgJXMiLCBhdHRzWzFdKTsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KIAogICAgIGNvbnN0IHNpemVfdCBuRm9ybWF0TWFwcGluZ3MgPSBzaXplb2Yoc0ZpbGVGb3JtYXRNYXApL3NpemVvZihzRmlsZUZvcm1hdE1hcFswXSk7CiAgICAgY29uc3QgaW50IGZpbGVGb3JtYXQgPSBmaW5kVGFnRm9yTmFtZShzRmlsZUZvcm1hdE1hcCwgbkZvcm1hdE1hcHBpbmdzLCBhdHRzWzNdKTsKLSAgICBDSEVDSyhmaWxlRm9ybWF0ICE9IC0xKTsKKyAgICBpZiAoZmlsZUZvcm1hdCA9PSAtMSkgeworICAgICAgQUxPR0UoIk1lZGlhUHJvZmlsZXM6OmNyZWF0ZUNhbWNvcmRlclByb2ZpbGUgZmFpbGVkIHRvIGxvY2F0ZSBmaWxlIGZvcm1hdCAlcyIsIGF0dHNbMV0pOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQogCiAgICAgTWVkaWFQcm9maWxlczo6Q2FtY29yZGVyUHJvZmlsZSAqcHJvZmlsZSA9IG5ldyBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlOwogICAgIHByb2ZpbGUtPm1DYW1lcmFJZCA9IGNhbWVyYUlkOwpAQCAtNDYyLDI0ICs0ODYsMzkgQEAKICAgICAgICAgY3JlYXRlQXVkaW9Db2RlYyhhdHRzLCBwcm9maWxlcyk7CiAgICAgfSBlbHNlIGlmIChzdHJjbXAoIlZpZGVvRW5jb2RlckNhcCIsIG5hbWUpID09IDAgJiYKICAgICAgICAgICAgICAgIHN0cmNtcCgidHJ1ZSIsIGF0dHNbM10pID09IDApIHsKLSAgICAgICAgcHJvZmlsZXMtPm1WaWRlb0VuY29kZXJzLmFkZChjcmVhdGVWaWRlb0VuY29kZXJDYXAoYXR0cykpOworICAgICAgICBNZWRpYVByb2ZpbGVzOjpWaWRlb0VuY29kZXJDYXAqIGNhcCA9IGNyZWF0ZVZpZGVvRW5jb2RlckNhcChhdHRzKTsKKyAgICAgICAgaWYgKGNhcCAhPSBudWxscHRyKSB7CisgICAgICAgICAgcHJvZmlsZXMtPm1WaWRlb0VuY29kZXJzLmFkZChjYXApOworICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChzdHJjbXAoIkF1ZGlvRW5jb2RlckNhcCIsIG5hbWUpID09IDAgJiYKICAgICAgICAgICAgICAgIHN0cmNtcCgidHJ1ZSIsIGF0dHNbM10pID09IDApIHsKLSAgICAgICAgcHJvZmlsZXMtPm1BdWRpb0VuY29kZXJzLmFkZChjcmVhdGVBdWRpb0VuY29kZXJDYXAoYXR0cykpOworICAgICAgICBNZWRpYVByb2ZpbGVzOjpBdWRpb0VuY29kZXJDYXAqIGNhcCA9IGNyZWF0ZUF1ZGlvRW5jb2RlckNhcChhdHRzKTsKKyAgICAgICAgaWYgKGNhcCAhPSBudWxscHRyKSB7CisgICAgICAgICAgcHJvZmlsZXMtPm1BdWRpb0VuY29kZXJzLmFkZChjYXApOworICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChzdHJjbXAoIlZpZGVvRGVjb2RlckNhcCIsIG5hbWUpID09IDAgJiYKICAgICAgICAgICAgICAgIHN0cmNtcCgidHJ1ZSIsIGF0dHNbM10pID09IDApIHsKLSAgICAgICAgcHJvZmlsZXMtPm1WaWRlb0RlY29kZXJzLmFkZChjcmVhdGVWaWRlb0RlY29kZXJDYXAoYXR0cykpOworICAgICAgICBNZWRpYVByb2ZpbGVzOjpWaWRlb0RlY29kZXJDYXAqIGNhcCA9IGNyZWF0ZVZpZGVvRGVjb2RlckNhcChhdHRzKTsKKyAgICAgICAgaWYgKGNhcCAhPSBudWxscHRyKSB7CisgICAgICAgICAgcHJvZmlsZXMtPm1WaWRlb0RlY29kZXJzLmFkZChjYXApOworICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChzdHJjbXAoIkF1ZGlvRGVjb2RlckNhcCIsIG5hbWUpID09IDAgJiYKICAgICAgICAgICAgICAgIHN0cmNtcCgidHJ1ZSIsIGF0dHNbM10pID09IDApIHsKLSAgICAgICAgcHJvZmlsZXMtPm1BdWRpb0RlY29kZXJzLmFkZChjcmVhdGVBdWRpb0RlY29kZXJDYXAoYXR0cykpOworICAgICAgICBNZWRpYVByb2ZpbGVzOjpBdWRpb0RlY29kZXJDYXAqIGNhcCA9IGNyZWF0ZUF1ZGlvRGVjb2RlckNhcChhdHRzKTsKKyAgICAgICAgaWYgKGNhcCAhPSBudWxscHRyKSB7CisgICAgICAgICAgcHJvZmlsZXMtPm1BdWRpb0RlY29kZXJzLmFkZChjYXApOworICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChzdHJjbXAoIkVuY29kZXJPdXRwdXRGaWxlRm9ybWF0IiwgbmFtZSkgPT0gMCkgewogICAgICAgICBwcm9maWxlcy0+bUVuY29kZXJPdXRwdXRGaWxlRm9ybWF0cy5hZGQoY3JlYXRlRW5jb2Rlck91dHB1dEZpbGVGb3JtYXQoYXR0cykpOwogICAgIH0gZWxzZSBpZiAoc3RyY21wKCJDYW1jb3JkZXJQcm9maWxlcyIsIG5hbWUpID09IDApIHsKICAgICAgICAgcHJvZmlsZXMtPm1DdXJyZW50Q2FtZXJhSWQgPSBnZXRDYW1lcmFJZChhdHRzKTsKICAgICAgICAgcHJvZmlsZXMtPmFkZFN0YXJ0VGltZU9mZnNldChwcm9maWxlcy0+bUN1cnJlbnRDYW1lcmFJZCwgYXR0cyk7CiAgICAgfSBlbHNlIGlmIChzdHJjbXAoIkVuY29kZXJQcm9maWxlIiwgbmFtZSkgPT0gMCkgewotICAgICAgICBwcm9maWxlcy0+bUNhbWNvcmRlclByb2ZpbGVzLmFkZCgKLSAgICAgICAgICAgIGNyZWF0ZUNhbWNvcmRlclByb2ZpbGUocHJvZmlsZXMtPm1DdXJyZW50Q2FtZXJhSWQsIGF0dHMsIHByb2ZpbGVzLT5tQ2FtZXJhSWRzKSk7CisgICAgICBNZWRpYVByb2ZpbGVzOjpDYW1jb3JkZXJQcm9maWxlKiBwcm9maWxlID0gY3JlYXRlQ2FtY29yZGVyUHJvZmlsZSgKKyAgICAgICAgICBwcm9maWxlcy0+bUN1cnJlbnRDYW1lcmFJZCwgYXR0cywgcHJvZmlsZXMtPm1DYW1lcmFJZHMpOworICAgICAgaWYgKHByb2ZpbGUgIT0gbnVsbHB0cikgeworICAgICAgICBwcm9maWxlcy0+bUNhbWNvcmRlclByb2ZpbGVzLmFkZChwcm9maWxlKTsKKyAgICAgIH0KICAgICB9IGVsc2UgaWYgKHN0cmNtcCgiSW1hZ2VFbmNvZGluZyIsIG5hbWUpID09IDApIHsKICAgICAgICAgcHJvZmlsZXMtPmFkZEltYWdlRW5jb2RpbmdRdWFsaXR5TGV2ZWwocHJvZmlsZXMtPm1DdXJyZW50Q2FtZXJhSWQsIGF0dHMpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhUmVzb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFSZXNvdXJjZS5jcHAKaW5kZXggMDkzNmE5OS4uZmU4NmQyNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFSZXNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFSZXNvdXJjZS5jcHAKQEAgLTM1LDcgKzM1LDcgQEAKICAgICB0aGlzLT52YWx1ZSA9IHZhbHVlOwogfQogCi1NZWRpYVJlc291cmNlOjpNZWRpYVJlc291cmNlKFR5cGUgdHlwZSwgY29uc3Qgc3RkOjp2ZWN0b3I8aW50OF90PiAmaWQsIGludDY0X3QgdmFsdWUpIHsKK01lZGlhUmVzb3VyY2U6Ok1lZGlhUmVzb3VyY2UoVHlwZSB0eXBlLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmaWQsIGludDY0X3QgdmFsdWUpIHsKICAgICB0aGlzLT50eXBlID0gdHlwZTsKICAgICB0aGlzLT5zdWJUeXBlID0gU3ViVHlwZTo6a1Vuc3BlY2lmaWVkU3ViVHlwZTsKICAgICB0aGlzLT5pZCA9IGlkOwpAQCAtNjYsMTEgKzY2LDExIEBACiB9CiAKIC8vc3RhdGljCi1NZWRpYVJlc291cmNlIE1lZGlhUmVzb3VyY2U6OkRybVNlc3Npb25SZXNvdXJjZShjb25zdCBzdGQ6OnZlY3RvcjxpbnQ4X3Q+ICZpZCwgaW50NjRfdCB2YWx1ZSkgeworTWVkaWFSZXNvdXJjZSBNZWRpYVJlc291cmNlOjpEcm1TZXNzaW9uUmVzb3VyY2UoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmlkLCBpbnQ2NF90IHZhbHVlKSB7CiAgICAgcmV0dXJuIE1lZGlhUmVzb3VyY2UoVHlwZTo6a0RybVNlc3Npb24sIGlkLCB2YWx1ZSk7CiB9CiAKLXN0YXRpYyBTdHJpbmc4IGJ5dGVzVG9IZXhTdHJpbmcoY29uc3Qgc3RkOjp2ZWN0b3I8aW50OF90PiAmYnl0ZXMpIHsKK3N0YXRpYyBTdHJpbmc4IGJ5dGVzVG9IZXhTdHJpbmcoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmJ5dGVzKSB7CiAgICAgU3RyaW5nOCBzdHI7CiAgICAgZm9yIChhdXRvICZiIDogYnl0ZXMpIHsKICAgICAgICAgc3RyLmFwcGVuZEZvcm1hdCgiJTAyeCIsIGIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9NaWRpSW9XcmFwcGVyLmNwcAppbmRleCBlNzFlYTJjLi5kYTI3MmUzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NaWRpSW9XcmFwcGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NaWRpSW9XcmFwcGVyLmNwcApAQCAtMTgsOCArMTgsOSBAQAogI2RlZmluZSBMT0dfVEFHICJNaWRpSW9XcmFwcGVyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCi0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9NaWRpSW9XcmFwcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5jcHAgYi9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuY3BwCmluZGV4IDNhOWZiOGIuLjc5ODMxODQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2LmNwcApAQCAtMjQsOCArMjQsNiBAQAogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KIAotI2luY2x1ZGUgPGpuaS5oPgotCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlc291cmNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUmVzb3VyY2UuaAppbmRleCBlNzM2MmMxLi40OTI3ZDI4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUmVzb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUmVzb3VyY2UuaApAQCAtMzUsMTMgKzM1LDEzIEBACiAgICAgTWVkaWFSZXNvdXJjZSgpID0gZGVsZXRlOwogICAgIE1lZGlhUmVzb3VyY2UoVHlwZSB0eXBlLCBpbnQ2NF90IHZhbHVlKTsKICAgICBNZWRpYVJlc291cmNlKFR5cGUgdHlwZSwgU3ViVHlwZSBzdWJUeXBlLCBpbnQ2NF90IHZhbHVlKTsKLSAgICBNZWRpYVJlc291cmNlKFR5cGUgdHlwZSwgY29uc3Qgc3RkOjp2ZWN0b3I8aW50OF90PiAmaWQsIGludDY0X3QgdmFsdWUpOworICAgIE1lZGlhUmVzb3VyY2UoVHlwZSB0eXBlLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmaWQsIGludDY0X3QgdmFsdWUpOwogCiAgICAgc3RhdGljIE1lZGlhUmVzb3VyY2UgQ29kZWNSZXNvdXJjZShib29sIHNlY3VyZSwgYm9vbCB2aWRlbyk7CiAgICAgc3RhdGljIE1lZGlhUmVzb3VyY2UgR3JhcGhpY01lbW9yeVJlc291cmNlKGludDY0X3QgdmFsdWUpOwogICAgIHN0YXRpYyBNZWRpYVJlc291cmNlIENwdUJvb3N0UmVzb3VyY2UoKTsKICAgICBzdGF0aWMgTWVkaWFSZXNvdXJjZSBWaWRlb0JhdHRlcnlSZXNvdXJjZSgpOwotICAgIHN0YXRpYyBNZWRpYVJlc291cmNlIERybVNlc3Npb25SZXNvdXJjZShjb25zdCBzdGQ6OnZlY3RvcjxpbnQ4X3Q+ICZpZCwgaW50NjRfdCB2YWx1ZSk7CisgICAgc3RhdGljIE1lZGlhUmVzb3VyY2UgRHJtU2Vzc2lvblJlc291cmNlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZpZCwgaW50NjRfdCB2YWx1ZSk7CiB9OwogCiBpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nKE1lZGlhUmVzb3VyY2U6OlR5cGUgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFoZWxwZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhaGVscGVyL0FuZHJvaWQuYnAKaW5kZXggNmZjYmM3Yi4uYjQ2Yzk4YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFoZWxwZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYWhlbHBlci9BbmRyb2lkLmJwCkBAIC0zLDYgKzMsMTIgQEAKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAogfQogCiBjY19saWJyYXJ5IHsKQEAgLTI3LDQgKzMzLDEwIEBACiAgICAgICAgICJsaWJtZWRpYV9oZWxwZXJfaGVhZGVycyIsCiAgICAgXSwKICAgICBjbGFuZzogdHJ1ZSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFoZWxwZXIvVHlwZUNvbnZlcnRlci5jcHAgYi9tZWRpYS9saWJtZWRpYWhlbHBlci9UeXBlQ29udmVydGVyLmNwcAppbmRleCA2MzgyY2U0Li43MDU5NTlhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYWhlbHBlci9UeXBlQ29udmVydGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYWhlbHBlci9UeXBlQ29udmVydGVyLmNwcApAQCAtNTcsNiArNTcsOCBAQAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX1VTQl9IRUFEU0VUKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfRUNIT19DQU5DRUxMRVIpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMRV9IRUFEU0VUKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTEVfU1BFQUtFUiksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCksCiAgICAgLy8gU1RVQiBtdXN0IGJlIGFmdGVyIERFRkFVTFQsIHNvIHRoZSBsYXR0ZXIgaXMgcGlja2VkIHVwIGJ5IHRvU3RyaW5nIGZpcnN0LgogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX1NUVUIpLApAQCAtOTYsNiArOTgsNyBAQAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fVVNCX0hFQURTRVQpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0JMRSksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9FQ0hPX1JFRkVSRU5DRSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9CTEVfSEVBRFNFVCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9ERUZBVUxUKSwKICAgICAvLyBTVFVCIG11c3QgYmUgYWZ0ZXIgREVGQVVMVCwgc28gdGhlIGxhdHRlciBpcyBwaWNrZWQgdXAgYnkgdG9TdHJpbmcgZmlyc3QuCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9TVFVCKSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9zdGFnZWZyaWdodFJlY29yZGVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvc3RhZ2VmcmlnaHRSZWNvcmRlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNTJlYTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvc3RhZ2VmcmlnaHRSZWNvcmRlci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3QiLAorICAgIGd0ZXN0OiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3QuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJzeXN0ZW0vbWVkaWEvYXVkaW8vaW5jbHVkZSIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9jYW1lcmEvaW5jbHVkZSIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZSIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbmRrL2luY2x1ZGUiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJtZWRpYXBsYXllcnNlcnZpY2UiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlibWVkaWFuZGsiLAorICAgIF0sCisKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL3N0YWdlZnJpZ2h0UmVjb3JkZXIvU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3QuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL3N0YWdlZnJpZ2h0UmVjb3JkZXIvU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMTdlZjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvc3RhZ2VmcmlnaHRSZWNvcmRlci9TdGFnZWZyaWdodFJlY29yZGVyVGVzdC5jcHAKQEAgLTAsMCArMSwzMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTdGFnZWZyaWdodFJlY29yZGVyVGVzdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8Y3RpbWU+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgPE1lZGlhUGxheWVyU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby1iYXNlLmg+CisKKyNpbmNsdWRlICJTdGFnZWZyaWdodFJlY29yZGVyLmgiCisKKyNkZWZpbmUgT1VUUFVUX0lORk9fRklMRV9OQU1FICIvZGF0YS9sb2NhbC90bXAvc3RmcmVjb3JkZXJfYXVkaW8uaW5mbyIKKyNkZWZpbmUgT1VUUFVUX0ZJTEVfTkFNRV9BVURJTyAiL2RhdGEvbG9jYWwvdG1wL3N0ZnJlY29yZGVyX2F1ZGlvLnJhdyIKKworY29uc3QgYm9vbCBrRGVidWcgPSBmYWxzZTsKK2NvbnN0ZXhwciBpbnQzMl90IGtNYXhMb29wQ291bnQgPSAxMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtDbGlwRHVyYXRpb25JblNlYyA9IDQ7Citjb25zdGV4cHIgaW50MzJfdCBrUGF1c2VUaW1lSW5TZWMgPSAyOworLy8gVG9sZXJhbmNlIHZhbHVlIGZvciBleHRyYWN0ZWQgY2xpcGR1cmF0aW9uIGlzIG1heGltdW0gMTAlIG9mIHRvdGFsIGNsaXBkdXJhdGlvbgorY29uc3RleHByIGludDMyX3Qga1RvbGVyYW5jZVZhbHVlSW5VcyA9IGtDbGlwRHVyYXRpb25JblNlYyAqIDEwMDAwMDsKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK2NsYXNzIFN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0CisgICAgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHN0ZDo6cGFpcjxvdXRwdXRfZm9ybWF0LCBhdWRpb19lbmNvZGVyPj4geworICBwdWJsaWM6CisgICAgU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3QoKSA6IG1TdGZSZWNvcmRlcihudWxscHRyKSwgbU91dHB1dEF1ZGlvRnAobnVsbHB0cikgeworICAgICAgICBtRXhwZWN0ZWREdXJhdGlvbkluTXMgPSAwOworICAgICAgICBtRXhwZWN0ZWRQYXVzZUluTXMgPSAwOworICAgIH0KKworICAgIH5TdGFnZWZyaWdodFJlY29yZGVyVGVzdCgpIHsKKyAgICAgICAgaWYgKG1TdGZSZWNvcmRlcikgZnJlZShtU3RmUmVjb3JkZXIpOworICAgICAgICBpZiAobU91dHB1dEF1ZGlvRnApIGZjbG9zZShtT3V0cHV0QXVkaW9GcCk7CisgICAgfQorCisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgbVN0ZlJlY29yZGVyID0gbmV3IFN0YWdlZnJpZ2h0UmVjb3JkZXIoU3RyaW5nMTYoTE9HX1RBRykpOworICAgICAgICBBU1NFUlRfTkUobVN0ZlJlY29yZGVyLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSB0aGUgaW5zdGFuY2Ugb2YgcmVjb3JkZXIiOworCisgICAgICAgIG1PdXRwdXRBdWRpb0ZwID0gZm9wZW4oT1VUUFVUX0ZJTEVfTkFNRV9BVURJTywgIndiIik7CisgICAgICAgIEFTU0VSVF9ORShtT3V0cHV0QXVkaW9GcCwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBvcGVuIG91dHB1dCBmaWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBPVVRQVVRfRklMRV9OQU1FX0FVRElPIDw8ICIgZm9yIHN0YWdlZnJpZ2h0IHJlY29yZGVyIjsKKworICAgICAgICBpbnQzMl90IGZkID0gZmlsZW5vKG1PdXRwdXRBdWRpb0ZwKTsKKyAgICAgICAgQVNTRVJUX0dFKGZkLCAwKSA8PCAiRmFpbGVkIHRvIGdldCB0aGUgZmlsZSBkZXNjcmlwdG9yIG9mIHRoZSBvdXRwdXQgZmlsZSBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IE9VVFBVVF9GSUxFX05BTUVfQVVESU87CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5zZXRPdXRwdXRGaWxlKGZkKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJGYWlsZWQgdG8gc2V0IHRoZSBvdXRwdXQgZmlsZSAiIDw8IE9VVFBVVF9GSUxFX05BTUVfQVVESU8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZm9yIHN0YWdlZnJpZ2h0IHJlY29yZGVyIjsKKyAgICB9CisKKyAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAobU91dHB1dEF1ZGlvRnApIHsKKyAgICAgICAgICAgIGZjbG9zZShtT3V0cHV0QXVkaW9GcCk7CisgICAgICAgICAgICBtT3V0cHV0QXVkaW9GcCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFrRGVidWcpIHsKKyAgICAgICAgICAgIGludDMyX3Qgc3RhdHVzID0gcmVtb3ZlKE9VVFBVVF9GSUxFX05BTUVfQVVESU8pOworICAgICAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIlVuYWJsZSB0byBkZWxldGUgdGhlIG91dHB1dCBmaWxlICIgPDwgT1VUUFVUX0ZJTEVfTkFNRV9BVURJTzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc2V0QXVkaW9SZWNvcmRlckZvcm1hdChvdXRwdXRfZm9ybWF0IG91dHB1dEZvcm1hdCwgYXVkaW9fZW5jb2RlciBlbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBhdWRpb1NvdXJjZSA9IEFVRElPX1NPVVJDRV9ERUZBVUxUKTsKKyAgICB2b2lkIHJlY29yZE1lZGlhKGJvb2wgaXNQYXVzZWQgPSBmYWxzZSwgaW50MzJfdCBudW1TdGFydCA9IDAsIGludDMyX3QgbnVtUGF1c2UgPSAwKTsKKyAgICB2b2lkIGR1bXBJbmZvKCk7CisgICAgdm9pZCBzZXR1cEV4dHJhY3RvcihBTWVkaWFFeHRyYWN0b3IgKmV4dHJhY3RvciwgaW50MzJfdCAmdHJhY2tDb3VudCk7CisgICAgdm9pZCB2YWxpZGF0ZU91dHB1dCgpOworCisgICAgTWVkaWFSZWNvcmRlckJhc2UgKm1TdGZSZWNvcmRlcjsKKyAgICBGSUxFICptT3V0cHV0QXVkaW9GcDsKKyAgICBkb3VibGUgbUV4cGVjdGVkRHVyYXRpb25Jbk1zOworICAgIGRvdWJsZSBtRXhwZWN0ZWRQYXVzZUluTXM7Cit9OworCit2b2lkIFN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0OjpzZXRBdWRpb1JlY29yZGVyRm9ybWF0KG91dHB1dF9mb3JtYXQgb3V0cHV0Rm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19lbmNvZGVyIGVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGF1ZGlvU291cmNlKSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5zZXRBdWRpb1NvdXJjZShhdWRpb1NvdXJjZSk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJGYWlsZWQgdG8gc2V0IHRoZSBhdWRpbyBzb3VyY2U6ICIgPDwgYXVkaW9Tb3VyY2U7CisKKyAgICBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPnNldE91dHB1dEZvcm1hdChvdXRwdXRGb3JtYXQpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiRmFpbGVkIHRvIHNldCB0aGUgb3V0cHV0IGZvcm1hdDogIiA8PCBvdXRwdXRGb3JtYXQ7CisKKyAgICBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPnNldEF1ZGlvRW5jb2RlcihlbmNvZGVyKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIkZhaWxlZCB0byBzZXQgdGhlIGF1ZGlvIGVuY29kZXI6ICIgPDwgZW5jb2RlcjsKK30KKwordm9pZCBTdGFnZWZyaWdodFJlY29yZGVyVGVzdDo6cmVjb3JkTWVkaWEoYm9vbCBpc1BhdXNlLCBpbnQzMl90IG51bVN0YXJ0LCBpbnQzMl90IG51bVBhdXNlKSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5pbml0KCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBzdGFnZWZyaWdodCByZWNvcmRlciI7CisKKyAgICBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPnByZXBhcmUoKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIkZhaWxlZCB0byBwcmVhcHJlIHRoZSByZW9yZGVyIjsKKworICAgIC8vIGZpcnN0IHN0YXJ0IHNob3VsZCBzdWNjZWVkLgorICAgIHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+c3RhcnQoKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIkZhaWxlZCB0byBzdGFydCB0aGUgcmVjb3JkZXIiOworCisgICAgZm9yIChpbnQzMl90IGNvdW50ID0gMDsgY291bnQgPCBudW1TdGFydDsgY291bnQrKykgeworICAgICAgICBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPnN0YXJ0KCk7CisgICAgfQorCisgICAgYXV0byB0U3RhcnQgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKKyAgICAvLyBSZWNvcmRpbmcgbWVkaWEgZm9yIDQgc2VjcworICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2ZvcihzdGQ6OmNocm9ubzo6c2Vjb25kcyhrQ2xpcER1cmF0aW9uSW5TZWMpKTsKKyAgICBhdXRvIHRFbmQgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKKyAgICBtRXhwZWN0ZWREdXJhdGlvbkluTXMgPSBzdGQ6OmNocm9ubzo6ZHVyYXRpb248ZG91YmxlLCBzdGQ6Om1pbGxpPih0RW5kIC0gdFN0YXJ0KS5jb3VudCgpOworCisgICAgaWYgKGlzUGF1c2UpIHsKKyAgICAgICAgLy8gZmlyc3QgcGF1c2Ugc2hvdWxkIHN1Y2NlZWQuCisgICAgICAgIHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+cGF1c2UoKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJGYWlsZWQgdG8gcGF1c2UgdGhlIHJlY29yZGVyIjsKKworICAgICAgICB0U3RhcnQgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKKyAgICAgICAgLy8gUGF1c2VkIHJlY29yZGVyIGZvciAyIHNlY3MKKyAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKGtQYXVzZVRpbWVJblNlYykpOworCisgICAgICAgIGZvciAoaW50MzJfdCBjb3VudCA9IDA7IGNvdW50IDwgbnVtUGF1c2U7IGNvdW50KyspIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+cGF1c2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRFbmQgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKKyAgICAgICAgbUV4cGVjdGVkUGF1c2VJbk1zID0gc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZSwgc3RkOjptaWxsaT4odEVuZCAtIHRTdGFydCkuY291bnQoKTsKKworICAgICAgICBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPnJlc3VtZSgpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIkZhaWxlZCB0byByZXN1bWUgdGhlIHJlY29yZGVyIjsKKworICAgICAgICBhdXRvIHRTdGFydCA9IHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOworICAgICAgICAvLyBSZWNvcmRpbmcgbWVkaWEgZm9yIDQgc2VjcworICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86OnNlY29uZHMoa0NsaXBEdXJhdGlvbkluU2VjKSk7CisgICAgICAgIGF1dG8gdEVuZCA9IHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOworICAgICAgICBtRXhwZWN0ZWREdXJhdGlvbkluTXMgKz0gc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZSwgc3RkOjptaWxsaT4odEVuZCAtIHRTdGFydCkuY291bnQoKTsKKyAgICB9CisgICAgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5zdG9wKCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJGYWlsZWQgdG8gc3RvcCB0aGUgcmVjb3JkZXIiOworfQorCit2b2lkIFN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0OjpkdW1wSW5mbygpIHsKKyAgICBGSUxFICpkdW1wT3V0cHV0ID0gZm9wZW4oT1VUUFVUX0lORk9fRklMRV9OQU1FLCAid2IiKTsKKyAgICBpbnQzMl90IGR1bXBGZCA9IGZpbGVubyhkdW1wT3V0cHV0KTsKKyAgICBWZWN0b3I8U3RyaW5nMTY+IGFyZ3M7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5kdW1wKGR1bXBGZCwgYXJncyk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJGYWlsZWQgdG8gZHVtcCB0aGUgaW5mbyBmb3IgdGhlIHJlY29yZGVyIjsKKyAgICBmY2xvc2UoZHVtcE91dHB1dCk7Cit9CisKK3ZvaWQgU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3Q6OnNldHVwRXh0cmFjdG9yKEFNZWRpYUV4dHJhY3RvciAqZXh0cmFjdG9yLCBpbnQzMl90ICZ0cmFja0NvdW50KSB7CisgICAgaW50MzJfdCBmZCA9IG9wZW4oT1VUUFVUX0ZJTEVfTkFNRV9BVURJTywgT19SRE9OTFkpOworICAgIEFTU0VSVF9HRShmZCwgMCkgPDwgIkZhaWxlZCB0byBvcGVuIHJlY29yZGVyJ3Mgb3V0cHV0IGZpbGUgIiA8PCBPVVRQVVRfRklMRV9OQU1FX0FVRElPCisgICAgICAgICAgICAgICAgICAgICA8PCAiIHRvIHZhbGlkYXRlIjsKKworICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICBpbnQzMl90IHN0YXR1cyA9IGZzdGF0KGZkLCAmYnVmKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRmFpbGVkIHRvIGdldCBwcm9wZXJ0aWVzIG9mIGlucHV0IGZpbGUgIiA8PCBPVVRQVVRfRklMRV9OQU1FX0FVRElPCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBmb3IgZXh0cmFjdG9yIjsKKworICAgIHNpemVfdCBmaWxlU2l6ZSA9IGJ1Zi5zdF9zaXplOworICAgIEFTU0VSVF9HVChmaWxlU2l6ZSwgMCkgPDwgIlNpemUgb2YgaW5wdXQgZmlsZSAiIDw8IE9VVFBVVF9GSUxFX05BTUVfQVVESU8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgdG8gZXh0cmFjdG9yIGNhbm5vdCBiZSB6ZXJvIjsKKyAgICBBTE9HVigiU2l6ZSBvZiBpbnB1dCBmaWxlIHRvIGV4dHJhY3RvcjogJXp1IiwgZmlsZVNpemUpOworCisgICAgc3RhdHVzID0gQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VGZChleHRyYWN0b3IsIGZkLCAwLCBmaWxlU2l6ZSk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgQU1FRElBX09LKSA8PCAiRmFpbGVkIHRvIHNldCBkYXRhIHNvdXJjZSBmb3IgZXh0cmFjdG9yIjsKKworICAgIHRyYWNrQ291bnQgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0VHJhY2tDb3VudChleHRyYWN0b3IpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgdHJhY2tzIHJlcG9ydGVkIGJ5IGV4dHJhY3RvciA6ICVkIiwgdHJhY2tDb3VudCk7Cit9CisKKy8vIFZhbGlkYXRlIHJlY29kZXIncyBvdXRwdXQgdXNpbmcgZXh0cmFjdG9yCit2b2lkIFN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0Ojp2YWxpZGF0ZU91dHB1dCgpIHsKKyAgICBpbnQzMl90IHRyYWNrQ291bnQgPSAtMTsKKyAgICBBTWVkaWFFeHRyYWN0b3IgKmV4dHJhY3RvciA9IEFNZWRpYUV4dHJhY3Rvcl9uZXcoKTsKKyAgICBBU1NFUlRfTkUoZXh0cmFjdG9yLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBleHRyYWN0b3IiOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHNldHVwRXh0cmFjdG9yKGV4dHJhY3RvciwgdHJhY2tDb3VudCkpOworICAgIEFTU0VSVF9FUSh0cmFja0NvdW50LCAxKSA8PCAiRXhwZWN0ZWQgMSB0cmFjaywgc2F3ICIgPDwgdHJhY2tDb3VudDsKKworICAgIGZvciAoaW50MzJfdCBpZHggPSAwOyBpZHggPCB0cmFja0NvdW50OyBpZHgrKykgeworICAgICAgICBBTWVkaWFFeHRyYWN0b3Jfc2VsZWN0VHJhY2soZXh0cmFjdG9yLCBpZHgpOworICAgICAgICBBTWVkaWFGb3JtYXQgKmZvcm1hdCA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRUcmFja0Zvcm1hdChleHRyYWN0b3IsIGlkeCk7CisgICAgICAgIEFTU0VSVF9ORShmb3JtYXQsIG51bGxwdHIpIDw8ICJUcmFjayBmb3JtYXQgaXMgTlVMTCI7CisgICAgICAgIEFMT0dJKCJUcmFjayBmb3JtYXQgPSAlcyIsIEFNZWRpYUZvcm1hdF90b1N0cmluZyhmb3JtYXQpKTsKKworICAgICAgICBpbnQ2NF90IGNsaXBEdXJhdGlvblVzOworICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50NjQoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAmY2xpcER1cmF0aW9uVXMpOworICAgICAgICBpbnQzMl90IGRpZmYgPSBhYnMoKG1FeHBlY3RlZER1cmF0aW9uSW5NcyAqIDEwMDApIC0gY2xpcER1cmF0aW9uVXMpOworICAgICAgICBBU1NFUlRfTEUoZGlmZiwga1RvbGVyYW5jZVZhbHVlSW5VcykKKyAgICAgICAgICAgICAgICA8PCAiRXhwZWN0ZWQgZHVyYXRpb246ICIgPDwgKG1FeHBlY3RlZER1cmF0aW9uSW5NcyAqIDEwMDApCisgICAgICAgICAgICAgICAgPDwgIiBBY3R1YWwgZHVyYXRpb246ICIgPDwgY2xpcER1cmF0aW9uVXMgPDwgIiBEaWZmZXJlbmNlOiAiIDw8IGRpZmYKKyAgICAgICAgICAgICAgICA8PCAiIERpZmZlcmVuY2UgaXMgZXhwZWN0ZWQgdG8gYmUgbGVzcyB0aGFuIHRvbGVyYW5jZSB2YWx1ZTogIiA8PCBrVG9sZXJhbmNlVmFsdWVJblVzOworCisgICAgICAgIGNvbnN0IGNoYXIgKm1pbWUgPSBudWxscHRyOworICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSk7CisgICAgICAgIEFTU0VSVF9ORShtaW1lLCBudWxscHRyKSA8PCAiVHJhY2sgbWltZSBpcyBOVUxMIjsKKyAgICAgICAgQUxPR0koIlRyYWNrIG1pbWUgPSAlcyIsIG1pbWUpOworCisgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50LCBiaXRSYXRlOworICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsICZjaGFubmVsQ291bnQpOworICAgICAgICBBTE9HSSgiQ2hhbm5lbCBjb3VudCByZXBvcnRlZCBieSBleHRyYWN0b3I6ICVkIiwgY2hhbm5lbENvdW50KTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgJnNhbXBsZVJhdGUpOworICAgICAgICBBTE9HSSgiU2FtcGxlIFJhdGUgcmVwb3J0ZWQgYnkgZXh0cmFjdG9yOiAlZCIsIHNhbXBsZVJhdGUpOworICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFLCAmYml0UmF0ZSk7CisgICAgICAgIEFMT0dJKCJCaXQgUmF0ZSByZXBvcnRlZCBieSBleHRyYWN0b3I6ICVkIiwgYml0UmF0ZSk7CisgICAgfQorfQorCitURVNUX0YoU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3QsIFJlY29yZGluZ0F1ZGlvU2FuaXR5VGVzdCkgeworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHNldEF1ZGlvUmVjb3JkZXJGb3JtYXQoT1VUUFVUX0ZPUk1BVF9ERUZBVUxULCBBVURJT19FTkNPREVSX0RFRkFVTFQpKTsKKworICAgIGludDMyX3QgbWF4QW1wbGl0dWRlID0gLTE7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5nZXRNYXhBbXBsaXR1ZGUoJm1heEFtcGxpdHVkZSk7CisgICAgQVNTRVJUX0VRKG1heEFtcGxpdHVkZSwgMCkgPDwgIkludmFsaWQgdmFsdWUgb2YgbWF4IGFtcGxpdHVkZSI7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShyZWNvcmRNZWRpYSgpKTsKKworICAgIC8vIFZlcmlmeSBnZXRNZXRyaWNzKCkgYmVoYXZpb3IKKyAgICBQYXJjZWwgcGFyY2VsOworICAgIHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+Z2V0TWV0cmljcygmcGFyY2VsKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIkZhaWxlZCB0byBnZXQgdGhlIHBhcmNlbCBmcm9tIGdldE1ldHJpY3MiOworICAgIEFMT0dWKCJTaXplIG9mIHRoZSBQYXJjZWwgcmV0dXJuZWQgYnkgZ2V0TWV0cmljczogJXp1IiwgcGFyY2VsLmRhdGFTaXplKCkpOworICAgIEFTU0VSVF9HVChwYXJjZWwuZGF0YVNpemUoKSwgMCkgPDwgIlBhcmNlbCBzaXplIHJlcG9ydHMgZW1wdHkgcmVjb3JkIjsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSh2YWxpZGF0ZU91dHB1dCgpKTsKKyAgICBpZiAoa0RlYnVnKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGR1bXBJbmZvKCkpOworICAgIH0KK30KKworVEVTVF9QKFN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0LCBNdWx0aUZvcm1hdEF1ZGlvUmVjb3JkVGVzdCkgeworICAgIG91dHB1dF9mb3JtYXQgb3V0cHV0Rm9ybWF0ID0gR2V0UGFyYW0oKS5maXJzdDsKKyAgICBhdWRpb19lbmNvZGVyIGF1ZGlvRW5jb2RlciA9IEdldFBhcmFtKCkuc2Vjb25kOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHNldEF1ZGlvUmVjb3JkZXJGb3JtYXQob3V0cHV0Rm9ybWF0LCBhdWRpb0VuY29kZXIpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShyZWNvcmRNZWRpYSgpKTsKKyAgICAvLyBUT0RPKGIvMTYxNjg3NzYxKQorICAgIC8vIFNraXAgZm9yIEFNUi1OQi9XQiBvdXRwdXQgZm9ybWF0CisgICAgaWYgKCEob3V0cHV0Rm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfQU1SX05CIHx8IG91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX0FNUl9XQikpIHsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUodmFsaWRhdGVPdXRwdXQoKSk7CisgICAgfQorICAgIGlmIChrRGVidWcpIHsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZHVtcEluZm8oKSk7CisgICAgfQorfQorCitURVNUX0YoU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3QsIEdldEFjdGl2ZU1pY3JvcGhvbmVzVGVzdCkgeworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgc2V0QXVkaW9SZWNvcmRlckZvcm1hdChPVVRQVVRfRk9STUFUX0RFRkFVTFQsIEFVRElPX0VOQ09ERVJfREVGQVVMVCwgQVVESU9fU09VUkNFX01JQykpOworCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5pbml0KCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJJbml0IGZhaWxlZCBmb3Igc3RhZ2VmcmlnaHQgcmVjb3JkZXIiOworCisgICAgc3RhdHVzID0gbVN0ZlJlY29yZGVyLT5wcmVwYXJlKCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJGYWlsZWQgdG8gcHJlYXByZSB0aGUgcmVvcmRlciI7CisKKyAgICBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPnN0YXJ0KCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJGYWlsZWQgdG8gc3RhcnQgdGhlIHJlY29yZGVyIjsKKworICAgIC8vIFJlY29yZCBtZWRpYSBmb3IgNCBzZWNzCisgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKHN0ZDo6Y2hyb25vOjpzZWNvbmRzKGtDbGlwRHVyYXRpb25JblNlYykpOworCisgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiBhY3RpdmVNaWNyb3Bob25lc3t9OworICAgIHN0YXR1cyA9IG1TdGZSZWNvcmRlci0+Z2V0QWN0aXZlTWljcm9waG9uZXMoJmFjdGl2ZU1pY3JvcGhvbmVzKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIkZhaWxlZCB0byBnZXQgQWN0aXZlIE1pY3JvcGhvbmVzIjsKKyAgICBBU1NFUlRfR1QoYWN0aXZlTWljcm9waG9uZXMuc2l6ZSgpLCAwKSA8PCAiTm8gYWN0aXZlIG1pY3JvcGhvbmVzIGFyZSBmb3VuZCI7CisKKyAgICBzdGF0dXMgPSBtU3RmUmVjb3JkZXItPnN0b3AoKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIkZhaWxlZCB0byBzdG9wIHRoZSByZWNvcmRlciI7CisgICAgaWYgKGtEZWJ1ZykgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkdW1wSW5mbygpKTsKKyAgICB9Cit9CisKK1RFU1RfRihTdGFnZWZyaWdodFJlY29yZGVyVGVzdCwgTXVsdGlTdGFydFBhdXNlVGVzdCkgeworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHNldEF1ZGlvUmVjb3JkZXJGb3JtYXQoT1VUUFVUX0ZPUk1BVF9ERUZBVUxULCBBVURJT19FTkNPREVSX0RFRkFVTFQpKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShyZWNvcmRNZWRpYSh0cnVlLCBrTWF4TG9vcENvdW50LCBrTWF4TG9vcENvdW50KSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUodmFsaWRhdGVPdXRwdXQoKSk7CisgICAgaWYgKGtEZWJ1ZykgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkdW1wSW5mbygpKTsKKyAgICB9Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgU3RhZ2VmcmlnaHRSZWNvcmRlclRlc3RBbGwsIFN0YWdlZnJpZ2h0UmVjb3JkZXJUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhzdGQ6Om1ha2VfcGFpcihPVVRQVVRfRk9STUFUX0FNUl9OQiwgQVVESU9fRU5DT0RFUl9BTVJfTkIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihPVVRQVVRfRk9STUFUX0FNUl9XQiwgQVVESU9fRU5DT0RFUl9BTVJfV0IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihPVVRQVVRfRk9STUFUX0FBQ19BRFRTLCBBVURJT19FTkNPREVSX0FBQyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKE9VVFBVVF9GT1JNQVRfT0dHLCBBVURJT19FTkNPREVSX09QVVMpKSk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgQUxPR1YoIlRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlLmgKaW5kZXggMDQzMTk3Ni4uNTRkYzA4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlLmgKKysrIGIvbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlLmgKQEAgLTIzLDcgKzIzLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gUGlwZSBpcyBtdWx0aS10aHJlYWQgc2FmZSBmb3IgcmVhZGVycyAoc2VlIFBpcGVSZWFkZXIpLCBidXQgc2FmZSBmb3Igb25seSBhIHNpbmdsZSB3cml0ZXIgdGhyZWFkLgotLy8gSXQgY2Fubm90IFVOREVSUlVOIG9uIHdyaXRlLCB1bmxlc3Mgd2UgYWxsb3cgZGVzaWduYXRpb24gb2YgYSBtYXN0ZXIgcmVhZGVyIHRoYXQgcHJvdmlkZXMgdGhlCisvLyBJdCBjYW5ub3QgVU5ERVJSVU4gb24gd3JpdGUsIHVubGVzcyB3ZSBhbGxvdyBkZXNpZ25hdGlvbiBvZiBhIHByaW1hcnkgcmVhZGVyIHRoYXQgcHJvdmlkZXMgdGhlCiAvLyB0aW1lLWJhc2UuIFJlYWRlcnMgY2FuIGJlIGFkZGVkIGFuZCByZW1vdmVkIGR5bmFtaWNhbGx5LCBhbmQgaXQncyBPSyB0byBoYXZlIG5vIHJlYWRlcnMuCiBjbGFzcyBQaXBlIDogcHVibGljIE5CQUlPX1NpbmsgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAppbmRleCA2M2FiNjU0Li42ZTJkMjJmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKQEAgLTI3OSw2ICsyNzksMTMgQEAKIAogICAgIHZvaWQgcG9zdEZpbGxUaGlzQnVmZmVyKEJ1ZmZlckluZm8gKmluZm8pOwogCisgICAgdm9pZCBtYXliZVBvc3RFeHRyYU91dHB1dE1ldGFkYXRhQnVmZmVyUmVxdWVzdCgpIHsKKyAgICAgICAgaWYgKCFtUGVuZGluZ0V4dHJhT3V0cHV0TWV0YWRhdGFCdWZmZXJSZXF1ZXN0KSB7CisgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0U3VibWl0RXh0cmFPdXRwdXRNZXRhZGF0YUJ1ZmZlciwgbUNvZGVjKSktPnBvc3QoKTsKKyAgICAgICAgICAgIG1QZW5kaW5nRXh0cmFPdXRwdXRNZXRhZGF0YUJ1ZmZlclJlcXVlc3QgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCiBwcml2YXRlOgogICAgIC8vIEhhbmRsZXMgYW4gT01YIG1lc3NhZ2UuIFJldHVybnMgdHJ1ZSBpZmYgbWVzc2FnZSB3YXMgaGFuZGxlZC4KICAgICBib29sIG9uT01YTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CkBAIC0zMDIsNiArMzA5LDggQEAKIAogICAgIHZvaWQgZ2V0TW9yZUlucHV0RGF0YUlmUG9zc2libGUoKTsKIAorICAgIGJvb2wgbVBlbmRpbmdFeHRyYU91dHB1dE1ldGFkYXRhQnVmZmVyUmVxdWVzdDsKKwogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEJhc2VTdGF0ZSk7CiB9OwogCkBAIC01NTUsNiArNTY0LDcgQEAKICAgICAgIG1TaHV0ZG93bkluUHJvZ3Jlc3MoZmFsc2UpLAogICAgICAgbUV4cGxpY2l0U2h1dGRvd24oZmFsc2UpLAogICAgICAgbUlzTGVnYWN5VlA5RGVjb2RlcihmYWxzZSksCisgICAgICBtSXNMb3dMYXRlbmN5KGZhbHNlKSwKICAgICAgIG1FbmNvZGVyRGVsYXkoMCksCiAgICAgICBtRW5jb2RlclBhZGRpbmcoMCksCiAgICAgICBtUm90YXRpb25EZWdyZWVzKDApLApAQCAtODg3LDcgKzg5Nyw3IEBACiAKICAgICAgICAgICAgIHNwPERhdGFDb252ZXJ0ZXI+IGNvbnZlcnRlciA9IG1Db252ZXJ0ZXJbcG9ydEluZGV4XTsKICAgICAgICAgICAgIGlmIChjb252ZXJ0ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIC8vIGhlcmUgd2UgYXNzdW1lIHNhbmUgY29udmVyc2lvbnMgb2YgbWF4IDQ6MSwgc28gcmVzdWx0IGZpdHMgaW4gaW50MzIKKyAgICAgICAgICAgICAgICAvLyBoZXJlIHdlIGFzc3VtZSBjb252ZXJzaW9ucyBvZiBtYXggNDoxLCBzbyByZXN1bHQgZml0cyBpbiBpbnQzMgogICAgICAgICAgICAgICAgIGlmIChwb3J0SW5kZXggPT0ga1BvcnRJbmRleElucHV0KSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25CdWZmZXJTaXplID0gY29udmVydGVyLT5zb3VyY2VTaXplKGJ1ZlNpemUpOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0yMjM3LDYgKzIyNDcsMTIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGVyciA9IHNldHVwRzcxMUNvZGVjKGVuY29kZXIsIHNhbXBsZVJhdGUsIG51bUNoYW5uZWxzKTsKICAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUykpIHsKKyAgICAgICAgaW50MzJfdCBudW1DaGFubmVscyA9IDEsIHNhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJjaGFubmVsLWNvdW50IiwgJm51bUNoYW5uZWxzKSAmJgorICAgICAgICAgICAgbXNnLT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKSB7CisgICAgICAgICAgICBlcnIgPSBzZXR1cE9wdXNDb2RlYyhlbmNvZGVyLCBzYW1wbGVSYXRlLCBudW1DaGFubmVscyk7CisgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpKSB7CiAgICAgICAgIC8vIG51bUNoYW5uZWxzIG5lZWRzIHRvIGJlIHNldCB0byBwcm9wZXJseSBjb21tdW5pY2F0ZSBQQ00gdmFsdWVzLgogICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzID0gMiwgc2FtcGxlUmF0ZSA9IDQ0MTAwLCBjb21wcmVzc2lvbkxldmVsID0gLTE7CkBAIC0yNDA5LDYgKzI0MjUsNyBAQAogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgQUxPR0UoImRlY29kZXIgY2FuIG5vdCBzZXQgbG93LWxhdGVuY3kgdG8gJWQgKGVyciAlZCkiLCBsb3dMYXRlbmN5LCBlcnIpOwogICAgIH0KKyAgICBtSXNMb3dMYXRlbmN5ID0gKGxvd0xhdGVuY3kgJiYgZXJyID09IE9LKTsKICAgICByZXR1cm4gZXJyOwogfQogCkBAIC0yNjAyLDE1ICsyNjE5LDE1IEBACiAgICAgdW5zaWduZWQgaW50IG51bUxheWVycyA9IDA7CiAgICAgdW5zaWduZWQgaW50IG51bUJMYXllcnMgPSAwOwogICAgIGludCB0YWdzOwotICAgIGNoYXIgZHVtbXk7CisgICAgY2hhciB0bXA7CiAgICAgT01YX1ZJREVPX0FORFJPSURfVEVNUE9SQUxMQVlFUklOR1BBVFRFUk5UWVBFIHBhdHRlcm4gPQogICAgICAgICBPTVhfVklERU9fQW5kcm9pZFRlbXBvcmFsTGF5ZXJpbmdQYXR0ZXJuTm9uZTsKLSAgICBpZiAoc3NjYW5mKHRzU2NoZW1hLmNfc3RyKCksICJ3ZWJydGMudnA4LiV1LWxheWVyJWMiLCAmbnVtTGF5ZXJzLCAmZHVtbXkpID09IDEKKyAgICBpZiAoc3NjYW5mKHRzU2NoZW1hLmNfc3RyKCksICJ3ZWJydGMudnA4LiV1LWxheWVyJWMiLCAmbnVtTGF5ZXJzLCAmdG1wKSA9PSAxCiAgICAgICAgICAgICAmJiBudW1MYXllcnMgPiAwKSB7CiAgICAgICAgIHBhdHRlcm4gPSBPTVhfVklERU9fQW5kcm9pZFRlbXBvcmFsTGF5ZXJpbmdQYXR0ZXJuV2ViUlRDOwogICAgIH0gZWxzZSBpZiAoKHRhZ3MgPSBzc2NhbmYodHNTY2hlbWEuY19zdHIoKSwgImFuZHJvaWQuZ2VuZXJpYy4ldSVjJXUlYyIsCi0gICAgICAgICAgICAgICAgICAgICZudW1MYXllcnMsICZkdW1teSwgJm51bUJMYXllcnMsICZkdW1teSkpCi0gICAgICAgICAgICAmJiAodGFncyA9PSAxIHx8ICh0YWdzID09IDMgJiYgZHVtbXkgPT0gJysnKSkKKyAgICAgICAgICAgICAgICAgICAgJm51bUxheWVycywgJnRtcCwgJm51bUJMYXllcnMsICZ0bXApKQorICAgICAgICAgICAgJiYgKHRhZ3MgPT0gMSB8fCAodGFncyA9PSAzICYmIHRtcCA9PSAnKycpKQogICAgICAgICAgICAgJiYgbnVtTGF5ZXJzID4gMCAmJiBudW1MYXllcnMgPCBVSU5UMzJfTUFYIC0gbnVtQkxheWVycykgewogICAgICAgICBudW1MYXllcnMgKz0gbnVtQkxheWVyczsKICAgICAgICAgcGF0dGVybiA9IE9NWF9WSURFT19BbmRyb2lkVGVtcG9yYWxMYXllcmluZ1BhdHRlcm5BbmRyb2lkOwpAQCAtMzExMCw2ICszMTI3LDI2IEBACiAgICAgICAgICAgICBrUG9ydEluZGV4SW5wdXQsIHNhbXBsZVJhdGUsIG51bUNoYW5uZWxzKTsKIH0KIAorc3RhdHVzX3QgQUNvZGVjOjpzZXR1cE9wdXNDb2RlYyhib29sIGVuY29kZXIsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBudW1DaGFubmVscykgeworICAgIGlmIChlbmNvZGVyKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgT01YX0FVRElPX1BBUkFNX0FORFJPSURfT1BVU1RZUEUgZGVmOworICAgIEluaXRPTVhQYXJhbXMoJmRlZik7CisgICAgZGVmLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4SW5wdXQ7CisgICAgc3RhdHVzX3QgZXJyID0gbU9NWE5vZGUtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkT3B1cywgJmRlZiwgc2l6ZW9mKGRlZikpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoInNldHVwT3B1c0NvZGVjKCk6IEVycm9yICVkIGdldHRpbmcgT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRPcHVzIHBhcmFtZXRlciIsIGVycik7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGRlZi5uU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgZGVmLm5DaGFubmVscyA9IG51bUNoYW5uZWxzOworICAgIGVyciA9IG1PTVhOb2RlLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkT3B1cywgJmRlZiwgc2l6ZW9mKGRlZikpOworICAgIHJldHVybiBlcnI7Cit9CisKIHN0YXR1c190IEFDb2RlYzo6c2V0dXBGbGFjQ29kZWMoCiAgICAgICAgIGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IGNvbXByZXNzaW9uTGV2ZWwsCiAgICAgICAgIEF1ZGlvRW5jb2RpbmcgZW5jb2RpbmcpIHsKQEAgLTQ3NTcsMTUgKzQ3OTQsMTUgQEAKICAgICAgICAgdW5zaWduZWQgaW50IG51bUxheWVycyA9IDA7CiAgICAgICAgIHVuc2lnbmVkIGludCBudW1CTGF5ZXJzID0gMDsKICAgICAgICAgaW50IHRhZ3M7Ci0gICAgICAgIGNoYXIgZHVtbXk7Ci0gICAgICAgIGlmIChzc2NhbmYodHNTY2hlbWEuY19zdHIoKSwgIndlYnJ0Yy52cDguJXUtbGF5ZXIlYyIsICZudW1MYXllcnMsICZkdW1teSkgPT0gMQorICAgICAgICBjaGFyIHRtcDsKKyAgICAgICAgaWYgKHNzY2FuZih0c1NjaGVtYS5jX3N0cigpLCAid2VicnRjLnZwOC4ldS1sYXllciVjIiwgJm51bUxheWVycywgJnRtcCkgPT0gMQogICAgICAgICAgICAgICAgICYmIG51bUxheWVycyA+IDApIHsKICAgICAgICAgICAgIHBhdHRlcm4gPSBPTVhfVklERU9fVlBYVGVtcG9yYWxMYXllclBhdHRlcm5XZWJSVEM7CiAgICAgICAgICAgICB0c1R5cGUgPSBPTVhfVklERU9fQW5kcm9pZFRlbXBvcmFsTGF5ZXJpbmdQYXR0ZXJuV2ViUlRDOwogICAgICAgICAgICAgdHNMYXllcnMgPSBudW1MYXllcnM7CiAgICAgICAgIH0gZWxzZSBpZiAoKHRhZ3MgPSBzc2NhbmYodHNTY2hlbWEuY19zdHIoKSwgImFuZHJvaWQuZ2VuZXJpYy4ldSVjJXUlYyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAmbnVtTGF5ZXJzLCAmZHVtbXksICZudW1CTGF5ZXJzLCAmZHVtbXkpKQotICAgICAgICAgICAgICAgICYmICh0YWdzID09IDEgfHwgKHRhZ3MgPT0gMyAmJiBkdW1teSA9PSAnKycpKQorICAgICAgICAgICAgICAgICAgICAgICAgJm51bUxheWVycywgJnRtcCwgJm51bUJMYXllcnMsICZ0bXApKQorICAgICAgICAgICAgICAgICYmICh0YWdzID09IDEgfHwgKHRhZ3MgPT0gMyAmJiB0bXAgPT0gJysnKSkKICAgICAgICAgICAgICAgICAmJiBudW1MYXllcnMgPiAwICYmIG51bUxheWVycyA8IFVJTlQzMl9NQVggLSBudW1CTGF5ZXJzKSB7CiAgICAgICAgICAgICBwYXR0ZXJuID0gT01YX1ZJREVPX1ZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuV2ViUlRDOwogICAgICAgICAgICAgLy8gVlBYIGRvZXMgbm90IGhhdmUgYSBjb25jZXB0IG9mIEItZnJhbWVzLCBzbyBqdXN0IGNvdW50IGFsbCBsYXllcnMKQEAgLTU3MjIsNyArNTc1OSw4IEBACiAKIEFDb2RlYzo6QmFzZVN0YXRlOjpCYXNlU3RhdGUoQUNvZGVjICpjb2RlYywgY29uc3Qgc3A8QVN0YXRlPiAmcGFyZW50U3RhdGUpCiAgICAgOiBBU3RhdGUocGFyZW50U3RhdGUpLAotICAgICAgbUNvZGVjKGNvZGVjKSB7CisgICAgICBtQ29kZWMoY29kZWMpLAorICAgICAgbVBlbmRpbmdFeHRyYU91dHB1dE1ldGFkYXRhQnVmZmVyUmVxdWVzdChmYWxzZSkgewogfQogCiBBQ29kZWM6OkJhc2VTdGF0ZTo6UG9ydE1vZGUgQUNvZGVjOjpCYXNlU3RhdGU6OmdldFBvcnRNb2RlKApAQCAtNTgyMyw2ICs1ODYxLDIxIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXRTdWJtaXRFeHRyYU91dHB1dE1ldGFkYXRhQnVmZmVyOiB7CisgICAgICAgICAgICBtUGVuZGluZ0V4dHJhT3V0cHV0TWV0YWRhdGFCdWZmZXJSZXF1ZXN0ID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoZ2V0UG9ydE1vZGUoa1BvcnRJbmRleE91dHB1dCkgPT0gUkVTVUJNSVRfQlVGRkVSUyAmJiBtQ29kZWMtPm1Jc0xvd0xhdGVuY3kpIHsKKyAgICAgICAgICAgICAgICAvLyBEZWNvZGVycyBvZnRlbiBuZWVkIG1vcmUgdGhhbiBvbmUgb3V0cHV0IGJ1ZmZlciB0byBiZQorICAgICAgICAgICAgICAgIC8vIHN1Ym1pdHRlZCBiZWZvcmUgcHJvY2Vzc2luZyBhIHNpbmdsZSBpbnB1dCBidWZmZXIuCisgICAgICAgICAgICAgICAgLy8gRm9yIGxvdyBsYXRlbmN5IGNvZGVjcywgd2UgZG9uJ3Qgd2FudCB0byB3YWl0IGZvciBtb3JlIGlucHV0CisgICAgICAgICAgICAgICAgLy8gdG8gYmUgcXVldWVkIHRvIGdldCB0aG9zZSBvdXRwdXQgYnVmZmVycyBzdWJtaXR0ZWQuCisgICAgICAgICAgICAgICAgaWYgKG1Db2RlYy0+c3VibWl0T3V0cHV0TWV0YWRhdGFCdWZmZXIoKSA9PSBPSworICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUNvZGVjLT5tTWV0YWRhdGFCdWZmZXJzVG9TdWJtaXQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1heWJlUG9zdEV4dHJhT3V0cHV0TWV0YWRhdGFCdWZmZXJSZXF1ZXN0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTYxNzksNyArNjIzMiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdXRwdXRNb2RlID09IEZSRUVfQlVGRkVSUyA/ICJGUkVFIiA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dE1vZGUgPT0gS0VFUF9CVUZGRVJTID8gIktFRVAiIDogIlJFU1VCTUlUIikpOwogICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0TW9kZSA9PSBSRVNVQk1JVF9CVUZGRVJTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPnN1Ym1pdE91dHB1dE1ldGFkYXRhQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ29kZWMtPnN1Ym1pdE91dHB1dE1ldGFkYXRhQnVmZmVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNvZGVjLT5tSXNMb3dMYXRlbmN5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGVyciA9PSBPSworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtQ29kZWMtPm1NZXRhZGF0YUJ1ZmZlcnNUb1N1Ym1pdCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXliZVBvc3RFeHRyYU91dHB1dE1ldGFkYXRhQnVmZmVyUmVxdWVzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGluZm8tPmNoZWNrUmVhZEZlbmNlKCJvbklucHV0QnVmZmVyRmlsbGVkIik7CkBAIC03MzI1LDYgKzczODMsOSBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQorICAgIGlmIChtQ29kZWMtPm1Jc0xvd0xhdGVuY3kpIHsKKyAgICAgICAgbWF5YmVQb3N0RXh0cmFPdXRwdXRNZXRhZGF0YUJ1ZmZlclJlcXVlc3QoKTsKKyAgICB9CiAKICAgICAvLyAqKiogTk9URTogVEhFIEZPTExPV0lORyBXT1JLQVJPVU5EIFdJTEwgQkUgUkVNT1ZFRCAqKioKICAgICBtQ29kZWMtPnNpZ25hbFN1Ym1pdE91dHB1dE1ldGFkYXRhQnVmZmVySWZFT1Nfd29ya2Fyb3VuZCgpOwpAQCAtNzYzMSw4ICs3NjkyLDggQEAKICAgICAgICAgbUlucHV0Rm9ybWF0LT5zZXRJbnQ2NCgiYW5kcm9pZC5fc3RvcC10aW1lLW9mZnNldC11cyIsIHN0b3BUaW1lT2Zmc2V0VXMpOwogICAgIH0KIAotICAgIGludDMyX3QgZHVtbXk7Ci0gICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJyZXF1ZXN0LXN5bmMiLCAmZHVtbXkpKSB7CisgICAgaW50MzJfdCB0bXA7CisgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJyZXF1ZXN0LXN5bmMiLCAmdG1wKSkgewogICAgICAgICBzdGF0dXNfdCBlcnIgPSByZXF1ZXN0SURSRnJhbWUoKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icAppbmRleCAzYmNjYjdiLi5jMTgwZWRmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKQEAgLTgsNiArOCwxMiBAQAogICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCiAgICAgXSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKIH0KIAogY2NfbGlicmFyeV9zdGF0aWMgewpAQCAtMzQsNiArNDAsMTIgQEAKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiCiAgICAgXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAogfQogCiBjY19saWJyYXJ5X3N0YXRpYyB7CkBAIC01OCw5ICs3MCwxOCBAQAogICAgIH0sCiAKICAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9jbGllbnRfaGVhZGVycyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAogICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsibGlibWVkaWFuZGsiXSwKKworICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCisKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIH0KIApAQCAtMTMyLDggKzE1MywxMCBAQAogCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvY2xpZW50X2hlYWRlcnMiLAotICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAorICAgICAgICAibGlibWVkaWFfZGF0YXNvdXJjZV9oZWFkZXJzIiwKICAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCkBAIC0xNTAsNiArMTczLDE4IEBACiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgIH0sCisKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICAgICAgbGludXg6IHsKKyAgICAgICAgICAgIGNmbGFnczogWworICAgICAgICAgICAgICAgICItRERJU0FCTEVfQVVESU9fU1lTVEVNX09GRkxPQUQiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgfQorICAgIH0sCiB9CiAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hldmNVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IZXZjVXRpbHMuY3BwCmluZGV4IGIzNDc0NTMuLjBlNGVhZTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hldmNVdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSGV2Y1V0aWxzLmNwcApAQCAtMzAsNiArMzAsOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KIAorI2RlZmluZSBVTlVTRURfUEFSQU0gX19hdHRyaWJ1dGVfXygodW51c2VkKSkKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdGF0aWMgY29uc3QgdWludDhfdCBrSGV2Y05hbFVuaXRUeXBlc1s1XSA9IHsKQEAgLTM3Niw3ICszNzgsNyBAQAogfQogCiBzdGF0dXNfdCBIZXZjUGFyYW1ldGVyU2V0czo6cGFyc2VQcHMoCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEgX191bnVzZWQsIHNpemVfdCBzaXplIF9fdW51c2VkKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEgVU5VU0VEX1BBUkFNLCBzaXplX3Qgc2l6ZSBVTlVTRURfUEFSQU0pIHsKICAgICByZXR1cm4gT0s7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKaW5kZXggMzFjODAwZS4uMjk4YTNmOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5jcHAKQEAgLTYxNCw3ICs2MTQsMTAgQEAKICAgICByZXR1cm4gbmV3IFBlcnNpc3RlbnRTdXJmYWNlKGJ1ZmZlclByb2R1Y2VyLCBidWZmZXJTb3VyY2UpOwogfQogCi1NZWRpYUNvZGVjOjpNZWRpYUNvZGVjKGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIHBpZF90IHBpZCwgdWlkX3QgdWlkKQorTWVkaWFDb2RlYzo6TWVkaWFDb2RlYygKKyAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwgcGlkX3QgcGlkLCB1aWRfdCB1aWQsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3A8Q29kZWNCYXNlPihjb25zdCBBU3RyaW5nICYsIGNvbnN0IGNoYXIgKik+IGdldENvZGVjQmFzZSwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxzdGF0dXNfdChjb25zdCBBU3RyaW5nICYsIHNwPE1lZGlhQ29kZWNJbmZvPiAqKT4gZ2V0Q29kZWNJbmZvKQogICAgIDogbVN0YXRlKFVOSU5JVElBTElaRUQpLAogICAgICAgbVJlbGVhc2VkQnlSZXNvdXJjZU1hbmFnZXIoZmFsc2UpLAogICAgICAgbUxvb3Blcihsb29wZXIpLApAQCAtNjM5LDcgKzY0Miw5IEBACiAgICAgICBtTnVtTG93TGF0ZW5jeURpc2FibGVzKDApLAogICAgICAgbUlzTG93TGF0ZW5jeU1vZGVPbihmYWxzZSksCiAgICAgICBtSW5kZXhPZkZpcnN0RnJhbWVXaGVuTG93TGF0ZW5jeU9uKC0xKSwKLSAgICAgIG1JbnB1dEJ1ZmZlckNvdW50ZXIoMCkgeworICAgICAgbUlucHV0QnVmZmVyQ291bnRlcigwKSwKKyAgICAgIG1HZXRDb2RlY0Jhc2UoZ2V0Q29kZWNCYXNlKSwKKyAgICAgIG1HZXRDb2RlY0luZm8oZ2V0Q29kZWNJbmZvKSB7CiAgICAgaWYgKHVpZCA9PSBrTm9VaWQpIHsKICAgICAgICAgbVVpZCA9IEFJQmluZGVyX2dldENhbGxpbmdVaWQoKTsKICAgICB9IGVsc2UgewpAQCAtNjQ3LDYgKzY1MiwzMyBAQAogICAgIH0KICAgICBtUmVzb3VyY2VNYW5hZ2VyUHJveHkgPSBuZXcgUmVzb3VyY2VNYW5hZ2VyU2VydmljZVByb3h5KHBpZCwgbVVpZCwKICAgICAgICAgICAgIDo6bmRrOjpTaGFyZWRSZWZCYXNlOjptYWtlPFJlc291cmNlTWFuYWdlckNsaWVudD4odGhpcykpOworICAgIGlmICghbUdldENvZGVjQmFzZSkgeworICAgICAgICBtR2V0Q29kZWNCYXNlID0gW10oY29uc3QgQVN0cmluZyAmbmFtZSwgY29uc3QgY2hhciAqb3duZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBHZXRDb2RlY0Jhc2UobmFtZSwgb3duZXIpOworICAgICAgICB9OworICAgIH0KKyAgICBpZiAoIW1HZXRDb2RlY0luZm8pIHsKKyAgICAgICAgbUdldENvZGVjSW5mbyA9IFtdKGNvbnN0IEFTdHJpbmcgJm5hbWUsIHNwPE1lZGlhQ29kZWNJbmZvPiAqaW5mbykgLT4gc3RhdHVzX3QgeworICAgICAgICAgICAgKmluZm8gPSBudWxscHRyOworICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhQ29kZWNMaXN0PiBtY2wgPSBNZWRpYUNvZGVjTGlzdDo6Z2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGlmICghbWNsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7ICAvLyBpZiBjYWxsZWQgZnJvbSBKYXZhIHNob3VsZCByYWlzZSBJT0V4Y2VwdGlvbgorICAgICAgICAgICAgfQorICAgICAgICAgICAgQVN0cmluZyB0bXAgPSBuYW1lOworICAgICAgICAgICAgaWYgKHRtcC5lbmRzV2l0aCgiLnNlY3VyZSIpKSB7CisgICAgICAgICAgICAgICAgdG1wLmVyYXNlKHRtcC5zaXplKCkgLSA3LCA3KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoY29uc3QgQVN0cmluZyAmY29kZWNOYW1lIDogeyBuYW1lLCB0bXAgfSkgeworICAgICAgICAgICAgICAgIHNzaXplX3QgY29kZWNJZHggPSBtY2wtPmZpbmRDb2RlY0J5TmFtZShjb2RlY05hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgaWYgKGNvZGVjSWR4IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKmluZm8gPSBtY2wtPmdldENvZGVjSW5mbyhjb2RlY0lkeCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgICAgICB9OworICAgIH0KIAogICAgIGluaXRNZWRpYW1ldHJpY3MoKTsKIH0KQEAgLTEwMDgsNiArMTA0MCwxMiBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKK3ZvaWQgTWVkaWFDb2RlYzo6UG9zdFJlcGx5V2l0aEVycm9yKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBpbnQzMl90IGVycikgeworICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKyAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgZXJyKTsKK30KKwogdm9pZCBNZWRpYUNvZGVjOjpQb3N0UmVwbHlXaXRoRXJyb3IoY29uc3Qgc3A8QVJlcGx5VG9rZW4+ICZyZXBseUlELCBpbnQzMl90IGVycikgewogICAgIGludDMyX3QgZmluYWxFcnIgPSBlcnI7CiAgICAgaWYgKG1SZWxlYXNlZEJ5UmVzb3VyY2VNYW5hZ2VyKSB7CkBAIC0xMDg0LDQwICsxMTIyLDMwIEBACiAgICAgYm9vbCBzZWN1cmVDb2RlYyA9IGZhbHNlOwogICAgIGNvbnN0IGNoYXIgKm93bmVyID0gIiI7CiAgICAgaWYgKCFuYW1lLnN0YXJ0c1dpdGgoImFuZHJvaWQuZmlsdGVyLiIpKSB7Ci0gICAgICAgIEFTdHJpbmcgdG1wID0gbmFtZTsKLSAgICAgICAgaWYgKHRtcC5lbmRzV2l0aCgiLnNlY3VyZSIpKSB7Ci0gICAgICAgICAgICBzZWN1cmVDb2RlYyA9IHRydWU7Ci0gICAgICAgICAgICB0bXAuZXJhc2UodG1wLnNpemUoKSAtIDcsIDcpOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHNwPElNZWRpYUNvZGVjTGlzdD4gbWNsID0gTWVkaWFDb2RlY0xpc3Q6OmdldEluc3RhbmNlKCk7Ci0gICAgICAgIGlmIChtY2wgPT0gTlVMTCkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtR2V0Q29kZWNJbmZvKG5hbWUsICZtQ29kZWNJbmZvKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgbUNvZGVjID0gTlVMTDsgIC8vIHJlbW92ZSB0aGUgY29kZWMuCi0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsgLy8gaWYgY2FsbGVkIGZyb20gSmF2YSBzaG91bGQgcmFpc2UgSU9FeGNlcHRpb24KLSAgICAgICAgfQotICAgICAgICBmb3IgKGNvbnN0IEFTdHJpbmcgJmNvZGVjTmFtZSA6IHsgbmFtZSwgdG1wIH0pIHsKLSAgICAgICAgICAgIHNzaXplX3QgY29kZWNJZHggPSBtY2wtPmZpbmRDb2RlY0J5TmFtZShjb2RlY05hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICBpZiAoY29kZWNJZHggPCAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ29kZWNJbmZvID0gbWNsLT5nZXRDb2RlY0luZm8oY29kZWNJZHgpOwotICAgICAgICAgICAgVmVjdG9yPEFTdHJpbmc+IG1lZGlhVHlwZXM7Ci0gICAgICAgICAgICBtQ29kZWNJbmZvLT5nZXRTdXBwb3J0ZWRNZWRpYVR5cGVzKCZtZWRpYVR5cGVzKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWVkaWFUeXBlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtZWRpYVR5cGVzW2ldLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Jc1ZpZGVvID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgICAgIGlmIChtQ29kZWNJbmZvID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJHZXR0aW5nIGNvZGVjIGluZm8gd2l0aCBuYW1lICclcycgZmFpbGVkIiwgbmFtZS5jX3N0cigpKTsKICAgICAgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKICAgICAgICAgfQorICAgICAgICBzZWN1cmVDb2RlYyA9IG5hbWUuZW5kc1dpdGgoIi5zZWN1cmUiKTsKKyAgICAgICAgVmVjdG9yPEFTdHJpbmc+IG1lZGlhVHlwZXM7CisgICAgICAgIG1Db2RlY0luZm8tPmdldFN1cHBvcnRlZE1lZGlhVHlwZXMoJm1lZGlhVHlwZXMpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1lZGlhVHlwZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChtZWRpYVR5cGVzW2ldLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7CisgICAgICAgICAgICAgICAgbUlzVmlkZW8gPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIG93bmVyID0gbUNvZGVjSW5mby0+Z2V0T3duZXJOYW1lKCk7CiAgICAgfQogCi0gICAgbUNvZGVjID0gR2V0Q29kZWNCYXNlKG5hbWUsIG93bmVyKTsKKyAgICBtQ29kZWMgPSBtR2V0Q29kZWNCYXNlKG5hbWUsIG93bmVyKTsKICAgICBpZiAobUNvZGVjID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkdldHRpbmcgY29kZWMgYmFzZSB3aXRoIG5hbWUgJyVzJyAob3duZXI9JyVzJykgZmFpbGVkIiwgbmFtZS5jX3N0cigpLCBvd25lcik7CiAgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKICAgICB9CiAKQEAgLTE1MTEsNyArMTUzOSw2IEBACiAgICAgbVN0aWNreUVycm9yID0gT0s7CiAKICAgICAvLyByZXNldCBzdGF0ZSBub3QgcmVzZXQgYnkgc2V0U3RhdGUoVU5JTklUSUFMSVpFRCkKLSAgICBtUmVwbHlJRCA9IDA7CiAgICAgbURlcXVldWVJbnB1dFJlcGx5SUQgPSAwOwogICAgIG1EZXF1ZXVlT3V0cHV0UmVwbHlJRCA9IDA7CiAgICAgbURlcXVldWVJbnB1dFRpbWVvdXRHZW5lcmF0aW9uID0gMDsKQEAgLTIxNjQsNyArMjE5MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gUkVMRUFTSU5HKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UpLT5wb3N0UmVwbHkobVJlcGx5SUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0UGVuZGluZ1JlcGxpZXNBbmREZWZlcnJlZE1lc3NhZ2VzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRFcnJvclJlc3BvbnNlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjE5MCw3ICsyMjE3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRkxVU0hFRDoKICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU1RBUlRFRDoKICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kRXJyb3JSZXNwb25zZSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRFcnJvclJlc3BvbnNlID0gKG1SZXBseUlEICE9IG51bGxwdHIpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RpY2t5RXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0QWN0aXZpdHlOb3RpZmljYXRpb25JZlBvc3NpYmxlKCk7CkBAIC0yMjIwLDcgKzIyNDcsNyBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRFcnJvclJlc3BvbnNlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEVycm9yUmVzcG9uc2UgPSAobVJlcGx5SUQgIT0gbnVsbHB0cik7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGlja3lFcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RBY3Rpdml0eU5vdGlmaWNhdGlvbklmUG9zc2libGUoKTsKQEAgLTIyNDcsNyArMjI3NCwxNSBAQAogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKHNlbmRFcnJvclJlc3BvbnNlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IobVJlcGx5SUQsIGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUUklDS1k6IHJlcGxpY2F0ZSBQb3N0UmVwbHlXaXRoRXJyb3IgbG9naWMgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIGVyciBjb2RlIG92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZpbmFsRXJyID0gZXJyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1SZWxlYXNlZEJ5UmVzb3VyY2VNYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3ZlcnJpZGUgdGhlIGVyciBjb2RlIGlmIE1lZGlhQ29kZWMgaGFzIGJlZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxlYXNlZCBieSBSZXNvdXJjZU1hbmFnZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxFcnIgPSBERUFEX09CSkVDVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RQZW5kaW5nUmVwbGllc0FuZERlZmVycmVkTWVzc2FnZXMoZmluYWxFcnIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KQEAgLTIyOTUsNyArMjMzMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OkNvZGVjUmVzb3VyY2UobUZsYWdzICYga0ZsYWdJc1NlY3VyZSwgbUlzVmlkZW8pKTsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UpLT5wb3N0UmVwbHkobVJlcGx5SUQpOworICAgICAgICAgICAgICAgICAgICBwb3N0UGVuZGluZ1JlcGxpZXNBbmREZWZlcnJlZE1lc3NhZ2VzKCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIApAQCAtMjMzNCw3ICsyMzY5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ1VzZXNTb2Z0d2FyZVJlbmRlcmVyOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKENPTkZJR1VSRUQpOwotICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KG1SZXBseUlEKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zdFBlbmRpbmdSZXBsaWVzQW5kRGVmZXJyZWRNZXNzYWdlcygpOwogCiAgICAgICAgICAgICAgICAgICAgIC8vIGF1Z21lbnQgb3VyIG1lZGlhIG1ldHJpY3MgaW5mbywgbm93IHRoYXQgd2Uga25vdyBtb3JlIHRoaW5ncwogICAgICAgICAgICAgICAgICAgICAvLyBzdWNoIGFzIHdoYXQgdGhlIGNvZGVjIGV4dHJhY3RlZCBmcm9tIGFueSBDU0QgcGFzc2VkIGluLgpAQCAtMjM3OSw2ICsyNDE0LDEyIEBACiAKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0SW5wdXRTdXJmYWNlQ3JlYXRlZDoKICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gQ09ORklHVVJFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhdGUgdHJhbnNpdGlvbmVkIHVuZXhwZWN0ZWRseTsgd2Ugc2hvdWxkIGhhdmUgcmVwbGllZCBhbHJlYWR5LgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoInJlY2VpdmVkIGtXaGF0SW5wdXRTdXJmYWNlQ3JlYXRlZCBtZXNzYWdlIGluIHN0YXRlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVTdHJpbmcobVN0YXRlKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlIHRvIGluaXRpYXRlQ3JlYXRlSW5wdXRTdXJmYWNlKCkKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gTk9fRVJST1I7CiAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKQEAgLTIzOTcsMTIgKzI0MzgsMTggQEAKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KG1SZXBseUlEKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zdFBlbmRpbmdSZXBsaWVzQW5kRGVmZXJyZWRNZXNzYWdlcyhyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRJbnB1dFN1cmZhY2VBY2NlcHRlZDoKICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gQ09ORklHVVJFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhdGUgdHJhbnNpdGlvbmVkIHVuZXhwZWN0ZWRseTsgd2Ugc2hvdWxkIGhhdmUgcmVwbGllZCBhbHJlYWR5LgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoInJlY2VpdmVkIGtXaGF0SW5wdXRTdXJmYWNlQWNjZXB0ZWQgbWVzc2FnZSBpbiBzdGF0ZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlU3RyaW5nKG1TdGF0ZSkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAvLyByZXNwb25zZSB0byBpbml0aWF0ZVNldElucHV0U3VyZmFjZSgpCiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE5PX0VSUk9SOwogICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2UoKTsKQEAgLTI0MTMsMTkgKzI0NjAsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KG1SZXBseUlEKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zdFBlbmRpbmdSZXBsaWVzQW5kRGVmZXJyZWRNZXNzYWdlcyhyZXNwb25zZSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRTaWduYWxlZElucHV0RU9TOgogICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0V4ZWN1dGluZygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdGF0ZSB0cmFuc2l0aW9uZWQgdW5leHBlY3RlZGx5OyB3ZSBzaG91bGQgaGF2ZSByZXBsaWVkIGFscmVhZHkuCisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgicmVjZWl2ZWQga1doYXRTaWduYWxlZElucHV0RU9TIG1lc3NhZ2UgaW4gc3RhdGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVN0cmluZyhtU3RhdGUpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgLy8gcmVzcG9uc2UgdG8gc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpCiAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwogICAgICAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShtUmVwbHlJRCk7CisgICAgICAgICAgICAgICAgICAgIHBvc3RQZW5kaW5nUmVwbGllc0FuZERlZmVycmVkTWVzc2FnZXMocmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTI0NDQsNyArMjQ5Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OkdyYXBoaWNNZW1vcnlSZXNvdXJjZShnZXRHcmFwaGljQnVmZmVyU2l6ZSgpKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoU1RBUlRFRCk7Ci0gICAgICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UpLT5wb3N0UmVwbHkobVJlcGx5SUQpOworICAgICAgICAgICAgICAgICAgICBwb3N0UGVuZGluZ1JlcGxpZXNBbmREZWZlcnJlZE1lc3NhZ2VzKCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIApAQCAtMjU4MCw3ICsyNjMzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKElOSVRJQUxJWkVEKTsKLSAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShtUmVwbHlJRCk7CisgICAgICAgICAgICAgICAgICAgIHBvc3RQZW5kaW5nUmVwbGllc0FuZERlZmVycmVkTWVzc2FnZXMoKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCkBAIC0yNjA0LDcgKzI2NTcsNyBAQAogICAgICAgICAgICAgICAgICAgICBtUmVsZWFzZVN1cmZhY2UucmVzZXQoKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAobVJlcGx5SUQgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShtUmVwbHlJRCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3N0UGVuZGluZ1JlcGxpZXNBbmREZWZlcnJlZE1lc3NhZ2VzKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgaWYgKG1Bc3luY1JlbGVhc2VDb21wbGV0ZU5vdGlmaWNhdGlvbiAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaE1lZGlhbWV0cmljcygpOwpAQCAtMjYyOSw3ICsyNjgyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy0+c2lnbmFsUmVzdW1lKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KG1SZXBseUlEKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zdFBlbmRpbmdSZXBsaWVzQW5kRGVmZXJyZWRNZXNzYWdlcygpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTI2NDEsMTQgKzI2OTQsMTggQEAKIAogICAgICAgICBjYXNlIGtXaGF0SW5pdDoKICAgICAgICAgewotICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7Ci0KICAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gVU5JTklUSUFMSVpFRCkgewotICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKG1zZywgSU5WQUxJRF9PUEVSQVRJT04pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAobVJlcGx5SUQpIHsKKyAgICAgICAgICAgICAgICBtRGVmZXJyZWRNZXNzYWdlcy5wdXNoX2JhY2sobXNnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworCiAgICAgICAgICAgICBtUmVwbHlJRCA9IHJlcGx5SUQ7CiAgICAgICAgICAgICBzZXRTdGF0ZShJTklUSUFMSVpJTkcpOwogCkBAIC0yNzEwLDE0ICsyNzY3LDE4IEBACiAKICAgICAgICAgY2FzZSBrV2hhdENvbmZpZ3VyZToKICAgICAgICAgewotICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7Ci0KICAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gSU5JVElBTElaRUQpIHsKLSAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihtc2csIElOVkFMSURfT1BFUkFUSU9OKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKG1SZXBseUlEKSB7CisgICAgICAgICAgICAgICAgbURlZmVycmVkTWVzc2FnZXMucHVzaF9iYWNrKG1zZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKwogICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJzdXJmYWNlIiwgJm9iaikpOwogCkBAIC0yODU1LDE1ICsyOTE2LDE5IEBACiAgICAgICAgIGNhc2Uga1doYXRDcmVhdGVJbnB1dFN1cmZhY2U6CiAgICAgICAgIGNhc2Uga1doYXRTZXRJbnB1dFN1cmZhY2U6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotCiAgICAgICAgICAgICAvLyBNdXN0IGJlIGNvbmZpZ3VyZWQsIGJ1dCBjYW4ndCBoYXZlIGJlZW4gc3RhcnRlZCB5ZXQuCiAgICAgICAgICAgICBpZiAobVN0YXRlICE9IENPTkZJR1VSRUQpIHsKLSAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihtc2csIElOVkFMSURfT1BFUkFUSU9OKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKG1SZXBseUlEKSB7CisgICAgICAgICAgICAgICAgbURlZmVycmVkTWVzc2FnZXMucHVzaF9iYWNrKG1zZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKKwogICAgICAgICAgICAgbVJlcGx5SUQgPSByZXBseUlEOwogICAgICAgICAgICAgaWYgKG1zZy0+d2hhdCgpID09IGtXaGF0Q3JlYXRlSW5wdXRTdXJmYWNlKSB7CiAgICAgICAgICAgICAgICAgbUNvZGVjLT5pbml0aWF0ZUNyZWF0ZUlucHV0U3VyZmFjZSgpOwpAQCAtMjg3OCw5ICsyOTQzLDYgQEAKICAgICAgICAgfQogICAgICAgICBjYXNlIGtXaGF0U3RhcnQ6CiAgICAgICAgIHsKLSAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotCiAgICAgICAgICAgICBpZiAobVN0YXRlID09IEZMVVNIRUQpIHsKICAgICAgICAgICAgICAgICBzZXRTdGF0ZShTVEFSVEVEKTsKICAgICAgICAgICAgICAgICBpZiAobUhhdmVQZW5kaW5nSW5wdXRCdWZmZXJzKSB7CkBAIC0yODg4LDEzICsyOTUwLDIwIEBACiAgICAgICAgICAgICAgICAgICAgIG1IYXZlUGVuZGluZ0lucHV0QnVmZmVycyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbFJlc3VtZSgpOwotICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBPSyk7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKG1zZywgT0spOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfSBlbHNlIGlmIChtU3RhdGUgIT0gQ09ORklHVVJFRCkgewotICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKG1zZywgSU5WQUxJRF9PUEVSQVRJT04pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAobVJlcGx5SUQpIHsKKyAgICAgICAgICAgICAgICBtRGVmZXJyZWRNZXNzYWdlcy5wdXNoX2JhY2sobXNnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworCiAgICAgICAgICAgICBtUmVwbHlJRCA9IHJlcGx5SUQ7CiAgICAgICAgICAgICBzZXRTdGF0ZShTVEFSVElORyk7CiAKQEAgLTI5MDIsMTUgKzI5NzEsNDIgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBrV2hhdFN0b3A6CisgICAgICAgIGNhc2Uga1doYXRTdG9wOiB7CisgICAgICAgICAgICBpZiAobVJlcGx5SUQpIHsKKyAgICAgICAgICAgICAgICBtRGVmZXJyZWRNZXNzYWdlcy5wdXNoX2JhY2sobXNnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgfQogICAgICAgICBjYXNlIGtXaGF0UmVsZWFzZToKICAgICAgICAgewogICAgICAgICAgICAgU3RhdGUgdGFyZ2V0U3RhdGUgPQogICAgICAgICAgICAgICAgIChtc2ctPndoYXQoKSA9PSBrV2hhdFN0b3ApID8gSU5JVElBTElaRUQgOiBVTklOSVRJQUxJWkVEOwogCisgICAgICAgICAgICBpZiAoKG1TdGF0ZSA9PSBSRUxFQVNJTkcgJiYgdGFyZ2V0U3RhdGUgPT0gVU5JTklUSUFMSVpFRCkKKyAgICAgICAgICAgICAgICAgICAgfHwgKG1TdGF0ZSA9PSBTVE9QUElORyAmJiB0YXJnZXRTdGF0ZSA9PSBJTklUSUFMSVpFRCkpIHsKKyAgICAgICAgICAgICAgICBtRGVmZXJyZWRNZXNzYWdlcy5wdXNoX2JhY2sobXNnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7CiAgICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7CiAKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBhc3luY05vdGlmeTsKKyAgICAgICAgICAgICh2b2lkKW1zZy0+ZmluZE1lc3NhZ2UoImFzeW5jIiwgJmFzeW5jTm90aWZ5KTsKKyAgICAgICAgICAgIC8vIHBvc3QgYXN5bmNOb3RpZnkgaWYgZ29pbmcgb3V0IG9mIHNjb3BlLgorICAgICAgICAgICAgc3RydWN0IEFzeW5jTm90aWZ5UG9zdCB7CisgICAgICAgICAgICAgICAgQXN5bmNOb3RpZnlQb3N0KGNvbnN0IHNwPEFNZXNzYWdlPiAmYXN5bmNOb3RpZnkpIDogbUFzeW5jTm90aWZ5KGFzeW5jTm90aWZ5KSB7fQorICAgICAgICAgICAgICAgIH5Bc3luY05vdGlmeVBvc3QoKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQXN5bmNOb3RpZnkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Bc3luY05vdGlmeS0+cG9zdCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZvaWQgY2xlYXIoKSB7IG1Bc3luY05vdGlmeS5jbGVhcigpOyB9CisgICAgICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtQXN5bmNOb3RpZnk7CisgICAgICAgICAgICB9IGFzeW5jTm90aWZ5UG9zdHthc3luY05vdGlmeX07CisKICAgICAgICAgICAgIC8vIGFscmVhZHkgc3RvcHBlZC9yZWxlYXNlZAogICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBVTklOSVRJQUxJWkVEICYmIG1SZWxlYXNlZEJ5UmVzb3VyY2VNYW5hZ2VyKSB7CiAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwpAQCAtMjk3NCwxMiArMzA3MCwxNCBAQAogICAgICAgICAgICAgLy8gYWZ0ZXIgdGhpcywgYW5kIHdlJ2xsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHJlcGx5LgogICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBGTFVTSElORyB8fCBtU3RhdGUgPT0gU1RPUFBJTkcKICAgICAgICAgICAgICAgICAgICAgfHwgbVN0YXRlID09IENPTkZJR1VSSU5HIHx8IG1TdGF0ZSA9PSBTVEFSVElORykgewotICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UpLT5wb3N0UmVwbHkobVJlcGx5SUQpOworICAgICAgICAgICAgICAgIC8vIG1SZXBseSBpcyBhbHdheXMgc2V0IGlmIGluIHRoZXNlIHN0YXRlcy4KKyAgICAgICAgICAgICAgICBwb3N0UGVuZGluZ1JlcGxpZXNBbmREZWZlcnJlZE1lc3NhZ2VzKCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtRmxhZ3MgJiBrRmxhZ1Nhd01lZGlhU2VydmVyRGllKSB7CiAgICAgICAgICAgICAgICAgLy8gSXQncyBkZWFkLCBKaW0uIERvbid0IGV4cGVjdCBpbml0aWF0ZVNodXRkb3duIHRvIHlpZWxkCiAgICAgICAgICAgICAgICAgLy8gYW55IHVzZWZ1bCByZXN1bHRzIG5vdy4uLgorICAgICAgICAgICAgICAgIC8vIEFueSBwZW5kaW5nIHJlcGx5IHdvdWxkIGhhdmUgYmVlbiBoYW5kbGVkIGF0IGtXaGF0RXJyb3IuCiAgICAgICAgICAgICAgICAgc2V0U3RhdGUoVU5JTklUSUFMSVpFRCk7CiAgICAgICAgICAgICAgICAgaWYgKHRhcmdldFN0YXRlID09IFVOSU5JVElBTElaRUQpIHsKICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY2xlYXIoKTsKQEAgLTI5OTMsMTIgKzMwOTEsMTIgQEAKICAgICAgICAgICAgIC8vIHJlcGx5IG5vdyB3aXRoIGFuIGVycm9yIHRvIHVuYmxvY2sgdGhlIGNsaWVudCwgY2xpZW50IGNhbgogICAgICAgICAgICAgLy8gcmVsZWFzZSBhZnRlciB0aGUgZmFpbHVyZSAoaW5zdGVhZCBvZiBBTlIpLgogICAgICAgICAgICAgaWYgKG1zZy0+d2hhdCgpID09IGtXaGF0U3RvcCAmJiAobUZsYWdzICYga0ZsYWdTdGlja3lFcnJvcikpIHsKKyAgICAgICAgICAgICAgICAvLyBBbnkgcGVuZGluZyByZXBseSB3b3VsZCBoYXZlIGJlZW4gaGFuZGxlZCBhdCBrV2hhdEVycm9yLgogICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBnZXRTdGlja3lFcnJvcigpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGFzeW5jTm90aWZ5OwotICAgICAgICAgICAgaWYgKG1zZy0+ZmluZE1lc3NhZ2UoImFzeW5jIiwgJmFzeW5jTm90aWZ5KSAmJiBhc3luY05vdGlmeSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpZiAoYXN5bmNOb3RpZnkgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIGlmIChtU3VyZmFjZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmICghbVJlbGVhc2VTdXJmYWNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtUmVsZWFzZVN1cmZhY2UucmVzZXQobmV3IFJlbGVhc2VTdXJmYWNlKTsKQEAgLTMwMTgsNiArMzExNiwxMiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKG1SZXBseUlEKSB7CisgICAgICAgICAgICAgICAgLy8gU3RhdGUgdHJhbnNpdGlvbiByZXBsaWVzIGFyZSBoYW5kbGVkIGFib3ZlLCBzbyB0aGlzIHJlcGx5CisgICAgICAgICAgICAgICAgLy8gd291bGQgbm90IGJlIHJlbGF0ZWQgdG8gc3RhdGUgdHJhbnNpdGlvbi4gQXMgd2UgYXJlCisgICAgICAgICAgICAgICAgLy8gc2h1dHRpbmcgZG93biB0aGUgY29tcG9uZW50LCBqdXN0IGZhaWwgdGhlIG9wZXJhdGlvbi4KKyAgICAgICAgICAgICAgICBwb3N0UGVuZGluZ1JlcGxpZXNBbmREZWZlcnJlZE1lc3NhZ2VzKFVOS05PV05fRVJST1IpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbVJlcGx5SUQgPSByZXBseUlEOwogICAgICAgICAgICAgc2V0U3RhdGUobXNnLT53aGF0KCkgPT0ga1doYXRTdG9wID8gU1RPUFBJTkcgOiBSRUxFQVNJTkcpOwogCkBAIC0zMDMyLDggKzMxMzYsOCBAQAogCiAgICAgICAgICAgICBpZiAoYXN5bmNOb3RpZnkgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIG1SZXNvdXJjZU1hbmFnZXJQcm94eS0+bWFya0NsaWVudEZvclBlbmRpbmdSZW1vdmFsKCk7Ci0gICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShtUmVwbHlJRCk7Ci0gICAgICAgICAgICAgICAgbVJlcGx5SUQgPSAwOworICAgICAgICAgICAgICAgIHBvc3RQZW5kaW5nUmVwbGllc0FuZERlZmVycmVkTWVzc2FnZXMoKTsKKyAgICAgICAgICAgICAgICBhc3luY05vdGlmeVBvc3QuY2xlYXIoKTsKICAgICAgICAgICAgICAgICBtQXN5bmNSZWxlYXNlQ29tcGxldGVOb3RpZmljYXRpb24gPSBhc3luY05vdGlmeTsKICAgICAgICAgICAgIH0KIApAQCAtMzIwNCwxNyArMzMwOCwyMSBAQAogCiAgICAgICAgIGNhc2Uga1doYXRTaWduYWxFbmRPZklucHV0U3RyZWFtOgogICAgICAgICB7Ci0gICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKLQogICAgICAgICAgICAgaWYgKCFpc0V4ZWN1dGluZygpIHx8ICFtSGF2ZUlucHV0U3VyZmFjZSkgewotICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKG1zZywgSU5WQUxJRF9PUEVSQVRJT04pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKSB7Ci0gICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIGdldFN0aWNreUVycm9yKCkpOworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihtc2csIGdldFN0aWNreUVycm9yKCkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAobVJlcGx5SUQpIHsKKyAgICAgICAgICAgICAgICBtRGVmZXJyZWRNZXNzYWdlcy5wdXNoX2JhY2sobXNnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworCiAgICAgICAgICAgICBtUmVwbHlJRCA9IHJlcGx5SUQ7CiAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMzI1NiwxNyArMzM2NCwyMSBAQAogCiAgICAgICAgIGNhc2Uga1doYXRGbHVzaDoKICAgICAgICAgewotICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7Ci0KICAgICAgICAgICAgIGlmICghaXNFeGVjdXRpbmcoKSkgewotICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCBJTlZBTElEX09QRVJBVElPTik7CisgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKG1zZywgSU5WQUxJRF9PUEVSQVRJT04pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBrRmxhZ1N0aWNreUVycm9yKSB7Ci0gICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIGdldFN0aWNreUVycm9yKCkpOworICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihtc2csIGdldFN0aWNreUVycm9yKCkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAobVJlcGx5SUQpIHsKKyAgICAgICAgICAgICAgICBtRGVmZXJyZWRNZXNzYWdlcy5wdXNoX2JhY2sobXNnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOworCiAgICAgICAgICAgICBtUmVwbHlJRCA9IHJlcGx5SUQ7CiAgICAgICAgICAgICAvLyBUT0RPOiBza2lwIGZsdXNoaW5nIGlmIGFscmVhZHkgRkxVU0hFRAogICAgICAgICAgICAgc2V0U3RhdGUoRkxVU0hJTkcpOwpAQCAtNDIxMSw2ICs0MzIzLDI2IEBACiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIE1lZGlhQ29kZWM6OnBvc3RQZW5kaW5nUmVwbGllc0FuZERlZmVycmVkTWVzc2FnZXMoc3RhdHVzX3QgZXJyIC8qID0gT0sgKi8pIHsKKyAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2V7bmV3IEFNZXNzYWdlfTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKKyAgICB9CisgICAgcG9zdFBlbmRpbmdSZXBsaWVzQW5kRGVmZXJyZWRNZXNzYWdlcyhyZXNwb25zZSk7Cit9CisKK3ZvaWQgTWVkaWFDb2RlYzo6cG9zdFBlbmRpbmdSZXBsaWVzQW5kRGVmZXJyZWRNZXNzYWdlcyhjb25zdCBzcDxBTWVzc2FnZT4gJnJlc3BvbnNlKSB7CisgICAgQ0hFQ0sobVJlcGx5SUQpOworICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkobVJlcGx5SUQpOworICAgIG1SZXBseUlELmNsZWFyKCk7CisgICAgQUxPR1ZfSUYoIW1EZWZlcnJlZE1lc3NhZ2VzLmVtcHR5KCksCisgICAgICAgICAgICAicG9zdGluZyAlenUgZGVmZXJyZWQgbWVzc2FnZXMiLCBtRGVmZXJyZWRNZXNzYWdlcy5zaXplKCkpOworICAgIGZvciAoc3A8QU1lc3NhZ2U+IG1zZyA6IG1EZWZlcnJlZE1lc3NhZ2VzKSB7CisgICAgICAgIG1zZy0+cG9zdCgpOworICAgIH0KKyAgICBtRGVmZXJyZWRNZXNzYWdlcy5jbGVhcigpOworfQorCiBzdGQ6OnN0cmluZyBNZWRpYUNvZGVjOjpzdGF0ZVN0cmluZyhTdGF0ZSBzdGF0ZSkgewogICAgIGNvbnN0IGNoYXIgKnJ2YWwgPSBOVUxMOwogICAgIGNoYXIgcmF3YnVmZmVyWzE2XTsgLy8gcm9vbSBmb3IgIiVkIgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5jcHAKaW5kZXggYzZlNzUzZC4uN2M5ODFiMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwCkBAIC01OSw3ICs1OSw3IEBACiAgICAgICAgICAgICBzcDxJTWVkaWFFeHRyYWN0b3I+IGV4OwogICAgICAgICAgICAgbWVkaWFFeFNlcnZpY2UtPm1ha2VFeHRyYWN0b3IoCiAgICAgICAgICAgICAgICAgICAgIENyZWF0ZUlEYXRhU291cmNlRnJvbURhdGFTb3VyY2Uoc291cmNlKSwKLSAgICAgICAgICAgICAgICAgICAgbWltZSA/IHN0ZDo6bWFrZV91bmlxdWU8c3RkOjpzdHJpbmc+KG1pbWUpIDogbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgbWltZSA/IHN0ZDo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+KG1pbWUpIDogc3RkOjpudWxsb3B0LAogICAgICAgICAgICAgICAgICAgICAmZXgpOwogICAgICAgICAgICAgcmV0dXJuIGV4OwogICAgICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT1dORVJTIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxOTM4OWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9PV05FUlMKQEAgLTAsMCArMSw3IEBACitzZXQgbm9wYXJlbnQKK2NoekBnb29nbGUuY29tCitlc3NpY2tAZ29vZ2xlLmNvbQorbGFqb3NAZ29vZ2xlLmNvbQorbWFyY29uZUBnb29nbGUuY29tCit0YWtsZWVAZ29vZ2xlLmNvbQord29uc2lrQGdvb2dsZS5jb20KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9URVNUX01BUFBJTkcgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9URVNUX01BUFBJTkcKaW5kZXggOGIzNmVhNS4uNWU1MzdkZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVEVTVF9NQVBQSU5HCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RFU1RfTUFQUElORwpAQCAtMTcsNiArMTcsOSBAQAogICAgICAgICAgICJleGNsdWRlLWZpbHRlciI6ICJhbmRyb2lkLm1lZGlhLmN0cy5BdWRpb1JlY29yZFRlc3QiCiAgICAgICAgIH0KICAgICAgIF0KKyAgICB9LAorICAgIHsKKyAgICAgICJuYW1lIjogIm1lZGlhY29kZWNUZXN0IgogICAgIH0KICAgXSwKICAgInBvc3RzdWJtaXQiOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKaW5kZXggYTFlNGQ0My4uZDY3ODc0ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcApAQCAtMTEzNSw3ICsxMTM1LDcgQEAKICAgICAgICAgLy8gYXNzZXJ0aW9uLCBsZXQncyBiZSBsZW5pZW50IGZvciBub3cuLi4KICAgICAgICAgLy8gQ0hFQ0soKHB0cls0XSA+PiAyKSA9PSAweDNmKTsgIC8vIHJlc2VydmVkCiAKLSAgICAgICAgc2l6ZV90IGxlbmd0aFNpemUgX191bnVzZWQgPSAxICsgKHB0cls0XSAmIDMpOworICAgICAgICAvLyB3ZSBjYW4gZ2V0IGxlbmd0aFNpemUgdmFsdWUgZnJvbSAxICsgKHB0cls0XSAmIDMpCiAKICAgICAgICAgLy8gY29tbWVudGVkIG91dCBjaGVjayBiZWxvdyBhcyBIMjY0X1FWR0FfNTAwX05PX0FVRElPLjNncAogICAgICAgICAvLyB2aW9sYXRlcyBpdC4uLgpAQCAtMjE3OCw3ICsyMTc4LDExIEBACiAgICAgfQogICAgIC8vIENoZWNrIGlmIG9mZmxvYWQgaXMgcG9zc2libGUgZm9yIGdpdmVuIGZvcm1hdCwgc3RyZWFtIHR5cGUsIHNhbXBsZSByYXRlLAogICAgIC8vIGJpdCByYXRlLCBkdXJhdGlvbiwgdmlkZW8gYW5kIHN0cmVhbWluZworI2lmZGVmIERJU0FCTEVfQVVESU9fU1lTVEVNX09GRkxPQUQKKyAgICByZXR1cm4gZmFsc2U7CisjZWxzZQogICAgIHJldHVybiBBdWRpb1N5c3RlbTo6aXNPZmZsb2FkU3VwcG9ydGVkKGluZm8pOworI2VuZGlmCiB9CiAKIEhMU1RpbWU6OkhMU1RpbWUoY29uc3Qgc3A8QU1lc3NhZ2U+JiBtZXRhKSA6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0RyY1ByZXNNb2RlV3JhcC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0RyY1ByZXNNb2RlV3JhcC5jcHAKaW5kZXggMTY4ZDE0MC4uMTU3Y2FiNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9EcmNQcmVzTW9kZVdyYXAuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvRHJjUHJlc01vZGVXcmFwLmNwcApAQCAtMjE3LDcgKzIxNyw3IEBACiAgICAgICAgIH0KICAgICAgICAgZWxzZSB7IC8vIGhhbmRsZSBvdGhlciB1c2VkIGVuY29kZXIgdGFyZ2V0IGxldmVscwogCi0gICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2s6IERSQyBwcmVzZW50YXRpb24gbW9kZSBpcyBvbmx5IHNwZWNpZmllZCBmb3IgbWF4LiA1LjEgY2hhbm5lbHMKKyAgICAgICAgICAgIC8vIFZhbGlkYXRpb24gY2hlY2s6IERSQyBwcmVzZW50YXRpb24gbW9kZSBpcyBvbmx5IHNwZWNpZmllZCBmb3IgbWF4LiA1LjEgY2hhbm5lbHMKICAgICAgICAgICAgIGlmIChtU3RyZWFtTnJBQUNDaGFuID4gNikgewogICAgICAgICAgICAgICAgIGRyY1ByZXNNb2RlID0gMDsKICAgICAgICAgICAgIH0KQEAgLTMwOCw3ICszMDgsNyBAQAogICAgICAgICAgICAgfSAvLyBzd2l0Y2goKQogICAgICAgICB9IC8vIGlmIChtRW5jb2RlclRhcmdldCAgPT0gR1BNX0VOQ09ERVJfVEFSR0VUX0xFVkVMKQogCi0gICAgICAgIC8vIHNhbml0eSBhZ2FpbgorICAgICAgICAvLyB2YWxpZGF0aW9uIGNoZWNrIGFnYWluCiAgICAgICAgIGlmIChuZXdIZWF2eSA9PSAxKSB7CiAgICAgICAgICAgICBuZXdCb29zdEZhY3Rvcj0xMjc7IC8vIG5vdCByZWFsbHkgbmVlZGVkIGFzIHRoZSBzYW1lIHdvdWxkIGJlIGRvbmUgYnkgdGhlIGRlY29kZXIgYW55d2F5CiAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTllNjc4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgbW9kdWxlIGNvbmZpZyBmb3IgQW1yLW5iIERlY29kZXIgdW5pdCB0ZXN0Ij4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iQW1ybmJEZWNvZGVyVGVzdCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJBbXJuYkRlY29kZXJUZXN0LT4vZGF0YS9sb2NhbC90bXAvQW1ybmJEZWNvZGVyVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiCisgICAgICAgICAgICBrZXk9Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L0Ftcm5iRGVjb2RlclRlc3QuemlwP3VuemlwPXRydWUiCisgICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL0Ftcm5iRGVjb2RlclRlc3RSZXMvIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJBbXJuYkRlY29kZXJUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWZsYWciIHZhbHVlPSItUCAvZGF0YS9sb2NhbC90bXAvQW1ybmJEZWNvZGVyVGVzdFJlcy8iIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L1JFQURNRS5tZCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9SRUFETUUubWQKaW5kZXggNjJlMTNhZS4uZTkwNzNlNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L1JFQURNRS5tZAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvUkVBRE1FLm1kCkBAIC0yMiwxMyArMjIsMTggQEAKIGFkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvQW1ybmJEZWNvZGVyVGVzdC9BbXJuYkRlY29kZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KIGBgYAogCi1UaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vZHJpdmUuZ29vZ2xlLmNvbS9kcml2ZS9mb2xkZXJzLzEzY000dEFhVkZybXItekdGcWFBekZCYktzNzVwbm05YikuIFB1c2ggdGhlc2UgZmlsZXMgaW50byBkZXZpY2UgZm9yIHRlc3RpbmcuCi1Eb3dubG9hZCBhbXItbmIgZm9sZGVyIGFuZCBwdXNoIGFsbCB0aGUgZmlsZXMgaW4gdGhpcyBmb2xkZXIgdG8gL2RhdGEvbG9jYWwvdG1wLyBvbiB0aGUgZGV2aWNlLgorVGhlIHJlc291cmNlIGZpbGUgZm9yIHRoZSB0ZXN0cyBpcyB0YWtlbiBmcm9tIFtoZXJlXShodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9BbXJuYkRlY29kZXJUZXN0LnppcCkuIERvd25sb2FkLCB1bnppcCBhbmQgcHVzaCB0aGVzZSBmaWxlcyBpbnRvIGRldmljZSBmb3IgdGVzdGluZy4KKwogYGBgCi1hZGIgcHVzaCBhbXItbmIvLiAvZGF0YS9sb2NhbC90bXAvCithZGIgcHVzaCBBbXJuYkRlY29kZXJUZXN0UmVzLy4gL2RhdGEvbG9jYWwvdG1wLwogYGBgCiAKIHVzYWdlOiBBbXJuYkRlY29kZXJUZXN0IC1QIFw8cGF0aF90b19mb2xkZXJcPgogYGBgCi1hZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL0Ftcm5iRGVjb2RlclRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wLworYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9BbXJuYkRlY29kZXJUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC9BbXJuYkRlY29kZXJUZXN0UmVzLworYGBgCitBbHRlcm5hdGl2ZWx5LCB0aGUgdGVzdCBjYW4gYWxzbyBiZSBydW4gdXNpbmcgYXRlc3QgY29tbWFuZC4KKworYGBgCithdGVzdCBBbXJuYkRlY29kZXJUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKIGBgYApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcWdhaW40NzUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9zcmMvcWdhaW40NzUuY3BwCmluZGV4IGY4ZGE1ODkuLjA4YTVjMTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvc3JjL3FnYWluNDc1LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3NyYy9xZ2FpbjQ3NS5jcHAKQEAgLTExMDYsNyArMTEwNiw3IEBACiAgICAgLy8gdGhlIHJlYWwsIHF1YW50aXplZCBnYWlucykKICAgICBnY19wcmVkKHByZWRfc3QsIE1SNDc1LCBzZjFfY29kZV9ub3NoYXJwLAogICAgICAgICAgICAgJnNmMV9leHBfZ2NvZGUwLCAmc2YxX2ZyYWNfZ2NvZGUwLAotICAgICAgICAgICAgJnNmMF9leHBfZ2NvZGUwLCAmc2YwX2djb2RlMCk7IC8vIGxhc3QgdHdvIGFyZ3MgYXJlIGR1bW15CisgICAgICAgICAgICAmc2YwX2V4cF9nY29kZTAsICZzZjBfZ2NvZGUwKTsgLy8gbGFzdCB0d28gYXJncyBhcmUgdW51c2VkCiAgICAgc2YxX2djb2RlMCA9IGV4dHJhY3RfbChQb3cyKDE0LCBzZjFfZnJhY19nY29kZTApKTsKIAogICAgIHRtcCA9IGFkZCAodG1wLCAyKTsKQEAgLTE0MjYsNyArMTQyNiw3IEBACiAgICAgICAgdGhlIHJlYWwsIHF1YW50aXplZCBnYWlucykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgZ2NfcHJlZChwcmVkX3N0LCBNUjQ3NSwgc2YxX2NvZGVfbm9zaGFycCwKICAgICAgICAgICAgICZzZjFfZXhwX2djb2RlMCwgJnNmMV9mcmFjX2djb2RlMCwKLSAgICAgICAgICAgICZzZjBfZXhwX2djb2RlMCwgJnNmMF9nY29kZTAsIC8qIGR1bW15IGFyZ3MgKi8KKyAgICAgICAgICAgICZzZjBfZXhwX2djb2RlMCwgJnNmMF9nY29kZTAsIC8qIHVudXNlZCBhcmdzICovCiAgICAgICAgICAgICBwT3ZlcmZsb3cpOwogCiAgICAgc2YxX2djb2RlMCA9IChXb3JkMTYpKFBvdzIoMTQsIHNmMV9mcmFjX2djb2RlMCwgcE92ZXJmbG93KSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZnV6emVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZnV6emVyL0FuZHJvaWQuYnAKaW5kZXggNTRkZTFjYy4uYzFlYWE1MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2Z1enplci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9mdXp6ZXIvQW5kcm9pZC5icApAQCAtMzQsNCArMzQsMTAgQEAKICAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAogICAgICAgICB9LAogICAgIH0sCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLW1lZGlhLWZ1enppbmctcmVwb3J0c0Bnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICAgICAgY29tcG9uZW50aWQ6IDE1NTI3NiwKKyAgICB9LAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2Z1enplci9hbXJuYl9kZWNfZnV6emVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9mdXp6ZXIvYW1ybmJfZGVjX2Z1enplci5jcHAKaW5kZXggZDRlN2U1Yy4uYzdhNzM3OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2Z1enplci9hbXJuYl9kZWNfZnV6emVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZnV6emVyL2Ftcm5iX2RlY19mdXp6ZXIuY3BwCkBAIC0yNiw4ICsyNiwxMCBAQAogY29uc3RleHByIGludDMyX3Qga0JpdHNQZXJTYW1wbGUgPSAxNjsKIGNvbnN0ZXhwciBpbnQzMl90IGtPdXRwdXRCdWZmZXJTaXplID0ga1NhbXBsZXNQZXJGcmFtZSAqIGtCaXRzUGVyU2FtcGxlIC8gODsKIGNvbnN0IGJpdHN0cmVhbV9mb3JtYXQga0JpdFN0cmVhbUZvcm1hdHNbMl0gPSB7TUlNRV9JRVRGLCBJRjJ9OwotY29uc3QgaW50MzJfdCBrTG9jYWxXbWZEZWNCeXRlc1BlckZyYW1lWzhdID0gezEyLCAxMywgMTUsIDE3LCAxOSwgMjAsIDI2LCAzMX07Ci1jb25zdCBpbnQzMl90IGtMb2NhbElmMkRlY0J5dGVzUGVyRnJhbWVbOF0gPSB7MTMsIDE0LCAxNiwgMTgsIDE5LCAyMSwgMjYsIDMxfTsKK2NvbnN0IGludDMyX3Qga0xvY2FsV21mRGVjQnl0ZXNQZXJGcmFtZVsxNl0gPSB7MTIsIDEzLCAxNSwgMTcsIDE5LCAyMCwgMjYsIDMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LCAgNiwgIDUsICA1LCAgMCwgIDAsICAwLCAgMH07Citjb25zdCBpbnQzMl90IGtMb2NhbElmMkRlY0J5dGVzUGVyRnJhbWVbMTZdID0gezEzLCAxNCwgMTYsIDE4LCAxOSwgMjEsIDI2LCAzMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMsIDE0LCAxNiwgMTgsIDE5LCAyMSwgMjYsIDMxfTsKIAogY2xhc3MgQ29kZWMgewogIHB1YmxpYzoKQEAgLTUyLDcgKzU0LDcgQEAKICAgICBiaXRzdHJlYW1fZm9ybWF0IGJpdHNyZWFtRm9ybWF0ID0ga0JpdFN0cmVhbUZvcm1hdHNbYml0XTsKICAgICBpbnQzMl90IGZyYW1lU2l6ZSA9IDA7CiAgICAgLyogRmluZCBmcmFtZSB0eXBlICovCi0gICAgRnJhbWVfVHlwZV8zR1BQIGZyYW1lVHlwZSA9IHN0YXRpY19jYXN0PEZyYW1lX1R5cGVfM0dQUD4oKG1vZGUgPj4gMykgJiAweDA3KTsKKyAgICBGcmFtZV9UeXBlXzNHUFAgZnJhbWVUeXBlID0gc3RhdGljX2Nhc3Q8RnJhbWVfVHlwZV8zR1BQPigobW9kZSA+PiAzKSAmIDB4MGYpOwogICAgICsrZGF0YTsKICAgICAtLXNpemU7CiAgICAgaWYgKGJpdCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL2Z1enplci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL2Z1enplci9BbmRyb2lkLmJwCmluZGV4IDQ2Zjc3ZTMuLjcxMDZhMzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9mdXp6ZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvZnV6emVyL0FuZHJvaWQuYnAKQEAgLTMyLDQgKzMyLDEwIEBACiAgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKICAgICAgICAgfSwKICAgICB9LAorICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uaAppbmRleCBlZjg2OTE1Li5kNTg4NWE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5oCkBAIC0yMCw5ICsyMCw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oPgogCi1leHRlcm4gIkMiIHsKICNpbmNsdWRlICJnc20uaCIKLX0KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQuYnAKaW5kZXggNDMwMzU2NS4uN2EzM2M1NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5icApAQCAtNiwyMyArNiwxOCBAQAogICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCiAgICAgXSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiAgICAgc2hhcmVkX2xpYnM6IFsibGlibG9nIl0sCiAKICAgICBzcmNzOiBbCi0gICAgICAgICJzcmMvYWRhcHRpdmVfc21vb3RoX25vX21teC5jcHAiLAogICAgICAgICAic3JjL2JpdHN0cmVhbS5jcHAiLAogICAgICAgICAic3JjL2Jsb2NrX2lkY3QuY3BwIiwKICAgICAgICAgInNyYy9jYWxfZGNfc2NhbGVyLmNwcCIsCi0gICAgICAgICJzcmMvY2h2cl9maWx0ZXIuY3BwIiwKLSAgICAgICAgInNyYy9jaHZfZmlsdGVyLmNwcCIsCiAgICAgICAgICJzcmMvY29tYmluZWRfZGVjb2RlLmNwcCIsCiAgICAgICAgICJzcmMvY29uY2VhbC5jcHAiLAogICAgICAgICAic3JjL2RhdGFwYXJ0X2RlY29kZS5jcHAiLAogICAgICAgICAic3JjL2RjYWNfcHJlZGljdGlvbi5jcHAiLAogICAgICAgICAic3JjL2RlY19wcmVkX2ludHJhX2RjLmNwcCIsCi0gICAgICAgICJzcmMvZGVyaW5naW5nX2Nocm9tYS5jcHAiLAotICAgICAgICAic3JjL2RlcmluZ2luZ19sdW1hLmNwcCIsCi0gICAgICAgICJzcmMvZmluZF9taW5fbWF4LmNwcCIsCiAgICAgICAgICJzcmMvZ2V0X3ByZWRfYWR2X2JfYWRkLmNwcCIsCiAgICAgICAgICJzcmMvZ2V0X3ByZWRfb3V0c2lkZS5jcHAiLAogICAgICAgICAic3JjL2lkY3QuY3BwIiwKQEAgLTMxLDkgKzI2LDYgQEAKICAgICAgICAgInNyYy9tYl91dGlscy5jcHAiLAogICAgICAgICAic3JjL3BhY2tldF91dGlsLmNwcCIsCiAgICAgICAgICJzcmMvcG9zdF9maWx0ZXIuY3BwIiwKLSAgICAgICAgInNyYy9wb3N0X3Byb2Nfc2VtYXBob3JlLmNwcCIsCi0gICAgICAgICJzcmMvcHBfc2VtYXBob3JlX2Nocm9tYV9pbnRlci5jcHAiLAotICAgICAgICAic3JjL3BwX3NlbWFwaG9yZV9sdW1hLmNwcCIsCiAgICAgICAgICJzcmMvcHZkZWNfYXBpLmNwcCIsCiAgICAgICAgICJzcmMvc2NhbGluZ190YWIuY3BwIiwKICAgICAgICAgInNyYy92bGNfZGVjb2RlLmNwcCIsCkBAIC00MywxMSArMzUsNiBAQAogICAgICAgICAic3JjL3ppZ3phZ190YWIuY3BwIiwKICAgICBdLAogCi0gICAgaGVhZGVyX2xpYnM6IFsKLSAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiCi0gICAgXSwKLQogICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIApAQCAtNjMsNiArNTAsMTIgQEAKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAogICAgIH0sCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAogfQogCiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvaW5jbHVkZS9tcDRkZWNfYXBpLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL2luY2x1ZGUvbXA0ZGVjX2FwaS5oCmluZGV4IDFmNDA0Y2UuLjA2YWVlMDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvaW5jbHVkZS9tcDRkZWNfYXBpLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9pbmNsdWRlL21wNGRlY19hcGkuaApAQCAtNDIsMTMgKzQyLDYgQEAKICNkZWZpbmUgT1NDTF9FWFBPUlRfUkVGIC8qIGVtcHR5ICovCiAjZW5kaWYKIAotLyogZmxhZyBmb3IgcG9zdC1wcm9jZXNzaW5nICA0LzI1LzAwICovCi0KLSNpZmRlZiBERUNfTk9QT1NUUFJPQwotI3VuZGVmIFBWX1BPU1RQUk9DX09OICAgLyogZW5hYmxlIGNvbXBpbGF0aW9uIG9mIHBvc3QtcHJvY2Vzc2luZyBjb2RlICovCi0jZWxzZQotI2RlZmluZSBQVl9QT1NUUFJPQ19PTgotI2VuZGlmCiAKICNkZWZpbmUgUFZfTk9fUE9TVF9QUk9DIDAKICNkZWZpbmUgUFZfREVCTE9DSyAxCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9hZGFwdGl2ZV9zbW9vdGhfbm9fbW14LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2FkYXB0aXZlX3Ntb290aF9ub19tbXguY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjc2MWViLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2FkYXB0aXZlX3Ntb290aF9ub19tbXguY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDIxICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLSAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0vKgotCi0gRGVzY3JpcHRpb246IFNlcGFyYXRlZCBtb2R1bGVzIGludG8gb25lIGZ1bmN0aW9uIHBlciBmaWxlIGFuZCBwdXQgaW50bwotICAgIG5ldyB0ZW1wbGF0ZS4KLQotIERlc2NyaXB0aW9uOiBPcHRpbWl6aW5nIEMgY29kZSBhbmQgYWRkaW5nIGNvbW1lbnRzLiAgQWxzbyBjaGFuZ2luZyB2YXJpYWJsZQotICAgIG5hbWVzIHRvIG1ha2UgdGhlbSBtb3JlIG1lYW5pbmdmdWwuCi0KLSBXaG86ICAgICAgICAgICAgICAgICAgIERhdGU6Ci0gRGVzY3JpcHRpb246Ci0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIElOUFVUIEFORCBPVVRQVVQgREVGSU5JVElPTlMKLQotIElucHV0czoKLQotICAgIFJlY19ZID0gcG9pbnRlciB0byAwdGggcG9zaXRpb24gaW4gYnVmZmVyIGNvbnRhaW5pbmcgbHVtaW5hbmNlIHZhbHVlcwotICAgICAgICBvZiB0eXBlIHVpbnQ4LgotICAgIHlfc3RhcnQgPSB2YWx1ZSBvZiB5IGNvb3JkaW5hdGUgb2YgdHlwZSBpbnQgdGhhdCBzcGVjaWZpZXMgdGhlIGZpcnN0Ci0gICAgICAgIHJvdyBvZiBwaXhlbHMgdG8gYmUgdXNlZCBpbiB0aGUgZmlsdGVyIGFsZ29yaXRobS4KLSAgICB4X3N0YXJ0ID0gdmFsdWUgb2YgeCBjb29yZGluYXRlIG9mIHR5cGUgaW50IHRoYXQgc3BlY2lmaWVzIHRoZSBmaXJzdAotICAgICAgICBjb2x1bW4gb2YgcGl4ZWxzIHRvIGJlIHVzZWQgaW4gdGhlIGZpbHRlciBhbGdvcml0aG0uCi0gICAgeV9ibGtfc3RhcnQgPSB2YWx1ZSBvZiB0aGUgeSBjb29yZGluYXRlIG9mIHR5cGUgaW50IHRoYXQgc3BlY2lmaWVzIHRoZQotICAgICAgICByb3cgb2YgcGl4ZWxzIHdoaWNoIGNvbnRhaW5zIHRoZSBzdGFydCBvZiBhIGJsb2NrLiBUaGUgcm93Ci0gICAgICAgIHNwZWNpZmllZCBieSB5X2Jsa19zdGFydCtCTEtfU0laRSBpcyB0aGUgbGFzdCByb3cgb2YgcGl4ZWxzCi0gICAgICAgIHRoYXQgYXJlIHVzZWQgaW4gdGhlIGZpbHRlciBhbGdvcml0aG0uCi0gICAgeF9ibGtfc3RhcnQgPSB2YWx1ZSBvZiB0aGUgeCBjb29yZGluYXRlIG9mIHR5cGUgaW50IHRoYXQgc3BlY2lmaWVzIHRoZQotICAgICAgICBjb2x1bW4gb2YgcGl4ZWxzIHdoaWNoIGNvbnRhaW5zIHRoZSBzdGFydCBvZiBhIGJsb2NrLiAgVGhlCi0gICAgICAgIGNvbHVtbiBzcGVjaWZpZWQgYnkgeF9ibGtfc3RhcnQrQkxLX1NJWkUgaXMgdGhlIGxhc3QgY29sdW1uIG9mCi0gICAgICAgIHBpeGVscyB0aGF0IGFyZSB1c2VkIGluIHRoZSBmaWx0ZXIgYWxnb3JpdGhtLgotICAgIHRociA9IHZhbHVlIG9mIHR5cGUgaW50IHRoYXQgaXMgY29tcGFyZWQgdG8gdGhlIGVsZW1lbnRzIGluIFJlY19ZIHRvCi0gICAgICAgIGRldGVybWluZSBpZiBhIHBhcnRpY3VsYXIgdmFsdWUgaW4gUmVjX1kgd2lsbCBiZSBtb2RpZmllZCBieQotICAgICAgICB0aGUgZmlsdGVyIG9yIG5vdAotICAgIHdpZHRoID0gdmFsdWUgb2YgdHlwZSBpbnQgdGhhdCBzcGVjaWZpZXMgdGhlIHdpZHRoIG9mIHRoZSBkaXNwbGF5Ci0gICAgICAgIGluIHBpeGVscyAob3IgcGVscywgZXF1aXZhbGVudGx5KS4KLSAgICBtYXhfZGlmZiA9IHZhbHVlIG9mIHR5cGUgaW50IHRoYXQgc3BlY2lmaWVzIHRoZSB2YWx1ZSB0aGF0IG1heSBiZSBhZGRlZAotICAgICAgICBvciBzdWJ0cmFjdGVkIGZyb20gdGhlIHBpeGVsIGluIFJlY19ZIHRoYXQgaXMgYmVpbmcgZmlsdGVyZWQKLSAgICAgICAgaWYgdGhlIGZpbHRlciBhbGdvcml0aG0gZGVjaWRlcyB0byBjaGFuZ2UgdGhhdCBwYXJ0aWN1bGFyCi0gICAgICAgIHBpeGVsJ3MgbHVtaW5hbmNlIHZhbHVlLgotCi0KLSBMb2NhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6Ci0gICAgTm9uZQotCi0gR2xvYmFsIFN0b3Jlcy9CdWZmZXJzL1BvaW50ZXJzIE5lZWRlZDoKLSAgICBOb25lCi0KLSBPdXRwdXRzOgotICAgIE5vbmUKLQotIFBvaW50ZXJzIGFuZCBCdWZmZXJzIE1vZGlmaWVkOgotICAgIEJ1ZmZlciBwb2ludGVkIHRvIGJ5IFJlY19ZIGlzIG1vZGlmaWVkIHdpdGggdGhlIGZpbHRlcmVkCi0gICAgbHVtaW5hbmNlIHZhbHVlcy4KLQotIExvY2FsIFN0b3JlcyBNb2RpZmllZDoKLSAgICBOb25lCi0KLSBHbG9iYWwgU3RvcmVzIE1vZGlmaWVkOgotICAgIE5vbmUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gRlVOQ1RJT04gREVTQ1JJUFRJT04KLQotIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBhIG1vdGlvbiBjb21wZW5zYXRlZCBub2lzZSBmaWx0ZXIgdXNpbmcgYWRhcHRpdmUKLSB3ZWlnaHRlZCBhdmVyYWdpbmcgb2YgbHVtaW5hbmNlIHZhbHVlcy4gICpSZWNfWSBjb250YWlucyB0aGUgbHVtaW5hbmNlIHZhbHVlcwotIHRoYXQgYXJlIGJlaW5nIGZpbHRlcmVkLgotCi0gVGhlIHBpY3R1cmUgYmVsb3cgZGVwaWN0cyBhIDN4MyBncm91cCBvZiBwaXhlbCBsdW1pbmFuY2UgdmFsdWVzLiAgVGhlICJ1IiwgImMiLAotIGFuZCAibCIgc3RhbmQgZm9yICJ1cHBlciIsICJjZW50ZXIiIGFuZCAibG93ZXIiLCByZXNwZWN0aXZlbHkuICBUaGUgbG9jYXRpb24KLSBvZiBwZWxjMCBpcyBzcGVjaWZpZWQgYnkgeF9zdGFydCBhbmQgeV9zdGFydCBpbiB0aGUgMS1EIGFycmF5ICJSZWNfWSIgYXMKLSBmb2xsb3dzIChhc3N1bWluZyB4X3N0YXJ0PTApOgotCi0gbG9jYXRpb24gb2YgcGVsYzAgPSBbKHlfc3RhcnQrMSkgKiB3aWR0aF0gKyB4X3N0YXJ0Ci0KLSBNb3ZpbmcgdXAgb3IgZG93biAxIHJvdyAobW92aW5nIGZyb20gcGVsdTIgdG8gcGVsYzIsIGZvciBleGFtcGxlKSBpcyBkb25lIGJ5Ci0gaW5jcmVtZW50aW5nIG9yIGRlY3JlbWVudGluZyAid2lkdGgiIGVsZW1lbnRzIHdpdGhpbiBSZWNfWS4KLQotIFRoZSBjb29yZGluYXRlcyBvZiB0aGUgdXBwZXIgbGVmdCBoYW5kIGNvcm5lciBvZiBhIGJsb2NrIChub3QgdGhlIGdyb3VwIG9mCi0gOSBwaXhlbHMgZGVwaWN0ZWQgaW4gdGhlIGZpZ3VyZSBiZWxvdykgaXMgc3BlY2lmaWVkIGJ5Ci0gKHlfYmxrX3N0YXJ0LCB4X2Jsa19zdGFydCkuICBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgYmxvY2sgaXMgQkxLU0laRS4KLSAoeV9zdGFydCx4X3N0YXJ0KSBtYXkgYmUgc3BlY2lmaWVkIGluZGVwZW5kZW50bHkgb2YgKHlfYmxrX3N0YXJ0LCB4X2Jsa19zdGFydCkuCi0KLSAgICAoeV9zdGFydCx4X3N0YXJ0KQotIC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgfCAgIHwgICB8ICAgfCAgIHwKLSAgICB8ICAgWCAgIHwgcGVsdTEgfCBwZWx1MiB8Ci0gICAgfCBwZWx1MCB8ICAgfCAgIHwKLSAgICB8ICAgfCAgIHwgICB8Ci0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICB8ICAgfCAgIHwgICB8Ci0gICAgfCBwZWxjMCB8IHBlbGMxIHwgcGVsYzIgfAotICAgIHwgICB8ICAgfCAgIHwKLSAgICB8ICAgfCAgIHwgICB8Ci0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICB8ICAgfCAgIHwgICB8Ci0gICAgfCBwZWxsMCB8IHBlbGwxIHwgcGVsbDIgfAotICAgIHwgICB8ICAgfCAgIHwKLSAgICB8ICAgfCAgIHwgICB8Ci0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotIFRoZSBmaWx0ZXJpbmcgb2YgdGhlIGx1bWluYW5jZSB2YWx1ZXMgaXMgYWNoaWV2ZWQgYnkgY29tcGFyaW5nIHRoZSA5Ci0gbHVtaW5hbmNlIHZhbHVlcyB0byBhIHRocmVzaG9sZCB2YWx1ZSAoInRociIpIGFuZCB0aGVuIGNoYW5naW5nIHRoZQotIGx1bWluYW5jZSB2YWx1ZSBvZiBwZWxjMSBpZiBhbGwgb2YgdGhlIHZhbHVlcyBhcmUgYWJvdmUgb3IgYWxsIG9mIHRoZSB2YWx1ZXMKLSBhcmUgYmVsb3cgdGhlIHRocmVzaG9sZC4gIFRoZSBhbW91bnQgdGhhdCB0aGUgbHVtaW5hbmNlIHZhbHVlIGlzIGNoYW5nZWQKLSBkZXBlbmRzIG9uIGEgd2VpZ2h0ZWQgc3VtIG9mIHRoZSA5IGx1bWluYW5jZSB2YWx1ZXMuIFRoZSBwb3NpdGlvbiBvZiBQZWxjMQotIGlzIHRoZW4gYWR2YW5jZWQgdG8gdGhlIHJpZ2h0IGJ5IG9uZSAoYXMgd2VsbCBhcyBhbGwgb2YgdGhlIHN1cnJvdW5kaW5nIHBpeGVscykKLSBhbmQgdGhlIHNhbWUgY2FsY3VsYXRpb24gaXMgcGVyZm9ybWVkIGFnYWluIGZvciB0aGUgbHVtaW5hbmNlIHZhbHVlIG9mIHRoZSBuZXcKLSBQZWxjMS4gVGhpcyBjb250aW51ZXMgcm93LXdpc2UgdW50aWwgcGl4ZWxzIGluIHRoZSBsYXN0IHJvdyBvZiB0aGUgYmxvY2sgYXJlCi0gZmlsdGVyZWQuCi0KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUkVRVUlSRU1FTlRTCi0KLSBOb25lLgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRUZFUkVOQ0VTCi0KLSAuLlxjb3JlbGlic1xkZWNvZGVyXGNvbW1vblxzcmNccG9zdF9wcm9jLmMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUFNFVURPLUNPREUKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gUkVTT1VSQ0VTIFVTRUQKLSAgIFdoZW4gdGhlIGNvZGUgaXMgd3JpdHRlbiBmb3IgYSBzcGVjaWZpYyB0YXJnZXQgcHJvY2Vzc29yIHRoZQotICAgICB0aGUgcmVzb3VyY2VzIHVzZWQgc2hvdWxkIGJlIGRvY3VtZW50ZWQgYmVsb3cuCi0KLSBTVEFDSyBVU0FHRTogW3N0YWNrIGNvdW50IGZvciB0aGlzIG1vZHVsZV0gKyBbdmFyaWFibGUgdG8gcmVwcmVzZW50Ci0gICAgICAgICAgc3RhY2sgdXNhZ2UgZm9yIGVhY2ggc3Vicm91dGluZSBjYWxsZWRdCi0KLSAgICAgd2hlcmU6IFtzdGFjayB1c2FnZSB2YXJpYWJsZV0gPSBzdGFjayB1c2FnZSBmb3IgW3N1YnJvdXRpbmUKLSAgICAgICAgIG5hbWVdIChzZWUgW2ZpbGVuYW1lXS5leHQpCi0KLSBEQVRBIE1FTU9SWSBVU0VEOiB4IHdvcmRzCi0KLSBQUk9HUkFNIE1FTU9SWSBVU0VEOiB4IHdvcmRzCi0KLSBDTE9DSyBDWUNMRVM6IFtjeWNsZSBjb3VudCBlcXVhdGlvbiBmb3IgdGhpcyBtb2R1bGVdICsgW3ZhcmlhYmxlCi0gICAgICAgICAgIHVzZWQgdG8gcmVwcmVzZW50IGN5Y2xlIGNvdW50IGZvciBlYWNoIHN1YnJvdXRpbmUKLSAgICAgICAgICAgY2FsbGVkXQotCi0gICAgIHdoZXJlOiBbY3ljbGUgY291bnQgdmFyaWFibGVdID0gY3ljbGUgY291bnQgZm9yIFtzdWJyb3V0aW5lCi0gICAgICAgIG5hbWVdIChzZWUgW2ZpbGVuYW1lXS5leHQpCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSU5DTFVERVMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2luY2x1ZGUgICAgIm1wNGRlY19saWIuaCIKLSNpbmNsdWRlICAgICJwb3N0X3Byb2MuaCIKLSNpbmNsdWRlICAgICJtcDRkZWYuaCIKLQotI2RlZmluZSBPU0NMX0RJU0FCTEVfV0FSTklOR19DT05WX1BPU1NJQkxFX0xPU1NfT0ZfREFUQQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTUFDUk9TCi07IERlZmluZSBtb2R1bGUgc3BlY2lmaWMgbWFjcm9zIGhlcmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBERUZJTkVTCi07IEluY2x1ZGUgYWxsIHByZS1wcm9jZXNzb3Igc3RhdGVtZW50cyBoZXJlLiBJbmNsdWRlIGNvbmRpdGlvbmFsCi07IGNvbXBpbGUgdmFyaWFibGVzIGFsc28uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IExPQ0FMIEZVTkNUSU9OIERFRklOSVRJT05TCi07IEZ1bmN0aW9uIFByb3RvdHlwZSBkZWNsYXJhdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBMT0NBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBERUZJTklUSU9OUwotOyBWYXJpYWJsZSBkZWNsYXJhdGlvbiAtIGRlZmluZWQgaGVyZSBhbmQgdXNlZCBvdXRzaWRlIHRoaXMgbW9kdWxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEVYVEVSTkFMIEZVTkNUSU9OIFJFRkVSRU5DRVMKLTsgRGVjbGFyZSBmdW5jdGlvbnMgZGVmaW5lZCBlbHNld2hlcmUgYW5kIHJlZmVyZW5jZWQgaW4gdGhpcyBtb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRVhURVJOQUwgR0xPQkFMIFNUT1JFL0JVRkZFUi9QT0lOVEVSIFJFRkVSRU5DRVMKLTsgRGVjbGFyZSB2YXJpYWJsZXMgdXNlZCBpbiB0aGlzIG1vZHVsZSBidXQgZGVmaW5lZCBlbHNld2hlcmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRlVOQ1RJT04gQ09ERQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIEFkYXB0aXZlU21vb3RoX05vTU1YKAotICAgIHVpbnQ4ICpSZWNfWSwgICAgICAgLyogaS9vICAqLwotICAgIGludCB5X3N0YXJ0LCAgICAgICAgLyogaSAgICAqLwotICAgIGludCB4X3N0YXJ0LCAgICAgICAgLyogaSAgICAqLwotICAgIGludCB5X2Jsa19zdGFydCwgICAgLyogaSAgICAqLwotICAgIGludCB4X2Jsa19zdGFydCwgICAgLyogaSAgICAqLwotICAgIGludCB0aHIsICAgICAgICAvKiBpICAgICovCi0gICAgaW50IHdpZHRoLCAgICAgIC8qIGkgICAgKi8KLSAgICBpbnQgbWF4X2RpZmYgICAgICAgIC8qIGkgICAgKi8KLSkKLXsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRGVmaW5lIGFsbCBsb2NhbCB2YXJpYWJsZXMKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBpbnQgIHNpZ25fdlsxNV07Ci0gICAgaW50IHN1bV92WzE1XTsKLSAgICBpbnQgKnN1bV9WX3B0cjsKLSAgICBpbnQgKnNpZ25fVl9wdHI7Ci0gICAgdWludDggcGVsdTsKLSAgICB1aW50OCBwZWxjOwotICAgIHVpbnQ4IHBlbGw7Ci0gICAgdWludDggKnBlbHA7Ci0gICAgdWludDggb2xkcm93WzE1XTsKLSAgICBpbnQgIHN1bTsKLSAgICBpbnQgc3VtMTsKLSAgICB1aW50OCAqUmVjX1lfcHRyOwotICAgIGludDMyICBhZGRyX3Y7Ci0gICAgaW50IHJvd19jbnRyOwotICAgIGludCBjb2xfY250cjsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgLyogIGZpcnN0IHJvdwotICAgICovCi0gICAgYWRkcl92ID0gKGludDMyKSh5X3N0YXJ0ICsgMSkgKiB3aWR0aDsgIC8qIHkgY29vcmQgb2YgMXN0IGVsZW1lbnQgaW4gdGhlIHJvdyAgLwotICAgICAgICAgICAgICAgICAgICAgL2NvbnRhaW5pbmcgcGVsYyBwaXhlbCAvICAgICAqLwotICAgIFJlY19ZX3B0ciA9ICZSZWNfWVthZGRyX3YgKyB4X3N0YXJ0XTsgIC8qIGluaXRpYWxpemluZyBwb2ludGVyIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvICBwZWxjMCBwb3NpdGlvbiAgKi8KLSAgICBzdW1fVl9wdHIgPSAmc3VtX3ZbMF07ICAvKiBpbml0aWFsaXppbmcgcG9pbnRlciB0byAwdGggZWxlbWVudCBvZiBhcnJheQotICAgICAgICAgICAgICAgIC8gICB0aGF0IHdpbGwgY29udGFpbiB3ZWlnaHRlZCBzdW1zIG9mIHBpeGVsCi0gICAgICAgICAgICAgICAgLyAgIGx1bWluYW5jZSB2YWx1ZXMgKi8KLSAgICBzaWduX1ZfcHRyID0gJnNpZ25fdlswXTsgIC8qICBpbml0aWFsaXppbmcgcG9pbnRlciB0byAwdGggZWxlbWVudCBvZgotICAgICAgICAgICAgICAgICAgLyAgIGFycmF5IHRoYXQgd2lsbCBjb250YWluIHN1bXMgdGhhdCBpbmRpY2F0ZQotICAgICAgICAgICAgICAgICAgLyAgICBob3cgbWFueSBvZiB0aGUgOSBwaXhlbHMgYXJlIGFib3ZlIG9yIGJlbG93Ci0gICAgICAgICAgICAgICAgICAvICAgIHRoZSB0aHJlc2hvbGQgdmFsdWUgKHRocikgICAgKi8KLSAgICBwZWxwID0gJm9sZHJvd1swXTsgIC8qIGluaXRpYWxpemluZyBwb2ludGVyIHRvIHRoZSAwdGggZWxlbWVudCBvZiBhcnJheQotICAgICAgICAgICAgICAgIC8gICAgdGhhdCB3aWxsIGNvbnRhaW4gY3VycmVudCB2YWx1ZXMgb2YgcGVsYyB0aGF0Ci0gICAgICAgICAgICAgICAgLyAgIGFyZSBzYXZlZCBhbmQgdXNlZCBhcyB2YWx1ZXMgb2YgcGVsdSB3aGVuIHRoZQotICAgICAgICAgICAgICAgIC8gICBuZXh0IHJvdyBvZiBwaXhlbHMgYXJlIGZpbHRlcmVkICovCi0KLSAgICBwZWx1ID0gKihSZWNfWV9wdHIgLSB3aWR0aCk7ICAvKiBhc3NpZ25pbmcgdmFsdWUgb2YgcGVsdTAgdG8gcGVsdSAgKi8KLSAgICAqcGVscCsrID0gcGVsYyA9ICpSZWNfWV9wdHI7IC8qIGFzc2lnbmluZyB2YWx1ZSBvZiBwZWxjMCB0byBwZWxjIGFuZAotICAgICAgICAgICAgICAgICAgICAgLyAgc3RvcmluZyB0aGlzIHZhbHVlIGluIHBlbHAgd2hpY2gKLSAgICAgICAgICAgICAgICAgICAgIC8gICB3aWxsIGJlIHVzZWQgYXMgdmFsdWUgb2YgcGVsdTAgd2hlbgotICAgICAgICAgICAgICAgICAgICAgLyAgbmV4dCByb3cgaXMgZmlsdGVyZWQgKi8KLSAgICBwZWxsID0gKihSZWNfWV9wdHIgKyB3aWR0aCk7ICAvKiBhc3NpZ25pbmcgdmFsdWUgb2YgcGVsbDAgdG8gcGVsbCAqLwotICAgIFJlY19ZX3B0cisrOyAvKiBhZHZhbmNpbmcgcG9pbnRlciBmcm9tIHBlbGMwIHRvIHBlbGMxICovCi0gICAgKnN1bV9WX3B0cisrID0gcGVsdSArIChwZWxjIDw8IDEpICsgcGVsbDsgIC8qIHdlaWdodGVkIHN1bSBvZiBwZWx1MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAvICBwZWxjMCBhbmQgcGVsbDAgICovCi0gICAgLyogc3VtIG9mIDAncyBhbmQgMSdzICgwIGlmIHBpeGVsIHZhbHVlIGlzIGJlbG93IHRociwgMSBpZiB2YWx1ZQotICAgIC9pcyBhYm92ZSB0aHIpICAqLwotICAgICpzaWduX1ZfcHRyKysgPSBJTkRFWChwZWx1LCB0aHIpICsgSU5ERVgocGVsYywgdGhyKSArIElOREVYKHBlbGwsIHRocik7Ci0KLQotICAgIHBlbHUgPSAqKFJlY19ZX3B0ciAtIHdpZHRoKTsgIC8qIGFzc2lnbmluZyB2YWx1ZSBvZiBwZWx1MSB0byBwZWx1ICovCi0gICAgKnBlbHArKyA9IHBlbGMgPSAqUmVjX1lfcHRyOyAvKiBhc3NpZ25pbmcgdmFsdWUgb2YgcGVsYzEgdG8gcGVsYyBhbmQKLSAgICAgICAgICAgICAgICAgICAgIC8gIHN0b3JpbmcgdGhpcyB2YWx1ZSBpbiBwZWxwIHdoaWNoCi0gICAgICAgICAgICAgICAgICAgICAvICB3aWxsIGJlIHVzZWQgYXMgdGhlIHZhbHVlIG9mIHBlbHUxIHdoZW4KLSAgICAgICAgICAgICAgICAgICAgIC8gIG5leHQgcm93IGlzIGZpbHRlcmVkICovCi0gICAgcGVsbCA9ICooUmVjX1lfcHRyICsgd2lkdGgpOyAgLyogYXNzaWduaW5nIHZhbHVlIG9mIHBlbGwxIHRvIHBlbGwgKi8KLSAgICBSZWNfWV9wdHIrKzsgIC8qIGFkdmFuY2luZyBwb2ludGVyIGZyb20gcGVsYzEgdG8gcGVsYzIgKi8KLSAgICAqc3VtX1ZfcHRyKysgPSBwZWx1ICsgKHBlbGMgPDwgMSkgKyBwZWxsOyAvKiB3ZWlnaHRlZCBzdW0gb2YgcGVsdTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAvIHBlbGMxIGFuZCBwZWxsMSAgKi8KLSAgICAvKiBzdW0gb2YgMCdzIGFuZCAxJ3MgKDAgaWYgcGl4ZWwgdmFsdWUgaXMgYmVsb3cgdGhyLCAxIGlmIHZhbHVlCi0gICAgL2lzIGFib3ZlIHRocikgICovCi0gICAgKnNpZ25fVl9wdHIrKyA9IElOREVYKHBlbHUsIHRocikgKyBJTkRFWChwZWxjLCB0aHIpICsgSU5ERVgocGVsbCwgdGhyKTsKLQotICAgIC8qIFRoZSBsb29wIGJlbG93IHBlcmZvcm1zIHRoZSBmaWx0ZXJpbmcgZm9yIHRoZSBmaXJzdCByb3cgb2YKLSAgICAvICAgcGl4ZWxzIGluIHRoZSByZWdpb24uICBJdCBzdGVwcyBhY3Jvc3MgdGhlIHJlbWFpbmluZyBwaXhlbHMgaW4KLSAgICAvICAgdGhlIHJvdyBhbmQgYWx0ZXJzIHRoZSBsdW1pbmFuY2UgdmFsdWUgb2YgcGVsYzEgaWYgbmVjZXNzYXJ5LAotICAgIC8gICBkZXBlbmRpbmcgb24gdGhlIGx1bWluYW5jZSB2YWx1ZXMgb2YgdGhlIGFkamFjZW50IHBpeGVscyovCi0KLSAgICBmb3IgKGNvbF9jbnRyID0gKHhfYmxrX3N0YXJ0ICsgQkxLU0laRSAtIDEpIC0geF9zdGFydDsgY29sX2NudHIgPiAwOyBjb2xfY250ci0tKQotICAgIHsKLSAgICAgICAgcGVsdSA9ICooUmVjX1lfcHRyIC0gd2lkdGgpOyAgLyogYXNzaWduaW5nIHZhbHVlIG9mIHBlbHUyIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAvICAgcGVsdSAqLwotICAgICAgICAqcGVscCsrID0gcGVsYyA9ICpSZWNfWV9wdHI7IC8qIGFzc2lnbmluZyB2YWx1ZSBvZiBwZWxjMiB0byBwZWxjCi0gICAgICAgICAgICAgICAgICAgICAgICAgLyBhbmQgc3RvcmluZyB0aGlzIHZhbHVlIGluIHBlbHAKLSAgICAgICAgICAgICAgICAgICAgICAgICAvIHdoaWNoIHdpbGwgYmUgdXNlZCAgIGFzIHZhbHVlIG9mIHBlbHUyCi0gICAgICAgICAgICAgICAgICAgICAgICAgLyB3aGVuIG5leHQgcm93IGlzIGZpbHRlcmVkICovCi0gICAgICAgIHBlbGwgPSAqKFJlY19ZX3B0ciArIHdpZHRoKTsgLyogYXNzaWduaW5nIHZhbHVlIG9mIHBlbGwyIHRvIHBlbGwgKi8KLQotICAgICAgICAvKiB3ZWlnaHRlZCBzdW0gb2YgcGVsdTEsIHBlbGMxIGFuZCBwZWxsMSAgKi8KLSAgICAgICAgKnN1bV9WX3B0ciA9IHBlbHUgKyAocGVsYyA8PCAxKSArIHBlbGw7Ci0gICAgICAgIC8qIHN1bSBvZiAwJ3MgYW5kIDEncyAoMCBpZiBwaXhlbCB2YWx1ZSBpcyBiZWxvdyB0aHIsCi0gICAgICAgIC8xIGlmIHZhbHVlIGlzIGFib3ZlIHRocikgICovCi0gICAgICAgICpzaWduX1ZfcHRyID0gSU5ERVgocGVsdSwgdGhyKSArIElOREVYKHBlbGMsIHRocikgKwotICAgICAgICAgICAgICAgICAgICAgIElOREVYKHBlbGwsIHRocik7Ci0gICAgICAgIC8qIHRoZSB2YWx1ZSBvZiBzdW0xIGluZGljYXRlcyBob3cgbWFueSBvZiB0aGUgOSBwaXhlbHMnCi0gICAgICAgIC9sdW1pbmFuY2UgdmFsdWVzIGFyZSBhYm92ZSBvciBlcXVhbCB0byB0aHIgKi8KLSAgICAgICAgc3VtMSA9ICooc2lnbl9WX3B0ciAtIDIpICsgKihzaWduX1ZfcHRyIC0gMSkgKyAqc2lnbl9WX3B0cjsKLQotICAgICAgICAvKiBhbHRlciB0aGUgbHVtaW5hbmNlIHZhbHVlIG9mIHBlbGMxIGlmIGFsbCA5IGx1bWluYW5jZSB2YWx1ZXMKLSAgICAgICAgL2FyZSBhYm92ZSBvciBlcXVhbCB0byB0aHIgb3IgaWYgYWxsIDkgdmFsdWVzIGFyZSBiZWxvdyB0aHIgKi8KLSAgICAgICAgaWYgKHN1bTEgPT0gMCB8fCBzdW0xID09IDkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIHN1bSBpcyBhIHdlaWdodGVkIGF2ZXJhZ2Ugb2YgdGhlIDkgcGl4ZWwgbHVtaW5hbmNlCi0gICAgICAgICAgICAvdmFsdWVzICAgKi8KLSAgICAgICAgICAgIHN1bSA9ICgqKHN1bV9WX3B0ciAtIDIpICsgKCooc3VtX1ZfcHRyIC0gMSkgPDwgMSkgKwotICAgICAgICAgICAgICAgICAgICpzdW1fVl9wdHIgKyA4KSA+PiA0OwotCi0gICAgICAgICAgICBSZWNfWV9wdHItLTsgIC8qIG1vdmUgcG9pbnRlciBiYWNrIHRvIHBlbGMxICAqLwotICAgICAgICAgICAgLyogSWYgbHVtaW5hbmNlIHZhbHVlIG9mIHBlbGMxIGlzIGxhcmdlciB0aGFuCi0gICAgICAgICAgICAvIHN1bSBieSBtb3JlIHRoYW4gbWF4X2RpZmYsIHRoZW4gc3VicmFjdCBtYXhfZGlmZgotICAgICAgICAgICAgLyBmcm9tIGx1bWluYW5jZSB2YWx1ZSBvZiBwZWxjMSovCi0gICAgICAgICAgICBpZiAoKGludCkoKlJlY19ZX3B0ciAtIHN1bSkgPiBtYXhfZGlmZikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdW0gPSAqUmVjX1lfcHRyIC0gbWF4X2RpZmY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvKiBJZiBsdW1pbmFuY2UgdmFsdWUgb2YgcGVsYzEgaXMgc21hbGxlciB0aGFuCi0gICAgICAgICAgICAvIHN1bSBieSBtb3JlIHRoYW4gbWF4X2RpZmYsIHRoZW4gYWRkIG1heF9kaWZmCi0gICAgICAgICAgICAvIHRvIGx1bWluYW5jZSB2YWx1ZSBvZiBwZWxjMSovCi0gICAgICAgICAgICBlbHNlIGlmICgoaW50KSgqUmVjX1lfcHRyIC0gc3VtKSA8IC1tYXhfZGlmZikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzdW0gPSAqUmVjX1lfcHRyICsgbWF4X2RpZmY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAqUmVjX1lfcHRyKysgPSBzdW07IC8qIGFzc2lnbiB2YWx1ZSBvZiBzdW0gdG8gcGVsYzEKLSAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgYWR2YW5jZSBwb2ludGVyIHRvIHBlbGMyICovCi0gICAgICAgIH0KLSAgICAgICAgUmVjX1lfcHRyKys7IC8qIGFkdmFuY2UgcG9pbnRlciB0byBuZXcgdmFsdWUgb2YgcGVsYzIKLSAgICAgICAgICAgICAgICAgLyAgIG9sZCBwZWxjMiBpcyBub3cgdHJlYXRlZCBhcyBwZWxjMSovCi0gICAgICAgIHN1bV9WX3B0cisrOyAvKiBwb2ludGVyIGlzIGFkdmFuY2VkIHNvIG5leHQgd2VpZ2h0ZWQgc3VtIG1heQotICAgICAgICAgICAgICAgICAvICBiZSBzYXZlZCAqLwotICAgICAgICBzaWduX1ZfcHRyKys7IC8qIHBvaW50ZXIgaXMgYWR2YW5jZWQgc28gbmV4dCBzdW0gb2YgMCdzIGFuZAotICAgICAgICAgICAgICAgICAgLyAxJ3MgbWF5IGJlIHNhdmVkICAqLwotICAgIH0KLQotICAgIC8qIFRoZSBuZXN0ZWQgbG9vcHMgYmVsb3cgcGVyZm9ybSB0aGUgZmlsdGVyaW5nIGZvciB0aGUgcmVtYWluaW5nIHJvd3MgKi8KLQotICAgIGFkZHJfdiA9ICh5X3N0YXJ0ICsgMikgKiB3aWR0aDsgIC8qIGFkdmFuY2UgYWRkcl92IHRvIHRoZSBuZXh0IHJvdwotICAgICAgICAgICAgICAgICAgICAgLyAgIChjb3JyZXNwb25kaW5nIHRvIHBlbGwwKSovCi0gICAgLyogVGhlIG91dGVyIGxvb3Agc3RlcHMgdGhyb3VnaHQgdGhlIHJvd3MuICAgKi8KLSAgICBmb3IgKHJvd19jbnRyID0gKHlfYmxrX3N0YXJ0ICsgQkxLU0laRSkgLSAoeV9zdGFydCArIDIpOyByb3dfY250ciA+IDA7IHJvd19jbnRyLS0pCi0gICAgewotICAgICAgICBSZWNfWV9wdHIgPSAmUmVjX1lbYWRkcl92ICsgeF9zdGFydF07IC8qIGFkdmFuY2UgcG9pbnRlciB0bwotICAgICAgICAgICAgL3RoZSBvbGQgcGVsbDAsIHdoaWNoIGhhcyBiZWNvbWUgdGhlIG5ldyBwZWxjMCAqLwotICAgICAgICBhZGRyX3YgKz0gd2lkdGg7ICAvKiBtb3ZlIGFkZHJfdiBkb3duIDEgcm93ICovCi0gICAgICAgIHN1bV9WX3B0ciA9ICZzdW1fdlswXTsgIC8qIHJlLWluaXRpYWxpemluZyBwb2ludGVyICovCi0gICAgICAgIHNpZ25fVl9wdHIgPSAmc2lnbl92WzBdOyAgLyogcmUtaW5pdGlsYWl6aW5nIHBvaW50ZXIgKi8KLSAgICAgICAgcGVscCA9ICZvbGRyb3dbMF07IC8qIHJlLWluaXRpYWxpemluZyBwb2ludGVyICovCi0KLSAgICAgICAgcGVsdSA9ICpwZWxwOyAvKiBzZXR0aW5nIHBlbHUwIHRvIG9sZCB2YWx1ZSBvZiBwZWxjMCAqLwotICAgICAgICAqcGVscCsrID0gcGVsYyA9ICpSZWNfWV9wdHI7Ci0gICAgICAgIHBlbGwgPSAqKFJlY19ZX3B0ciArIHdpZHRoKTsKLSAgICAgICAgUmVjX1lfcHRyKys7Ci0gICAgICAgICpzdW1fVl9wdHIrKyA9IHBlbHUgKyAocGVsYyA8PCAxKSArIHBlbGw7Ci0gICAgICAgICpzaWduX1ZfcHRyKysgPSBJTkRFWChwZWx1LCB0aHIpICsgSU5ERVgocGVsYywgdGhyKSArCi0gICAgICAgICAgICAgICAgICAgICAgICBJTkRFWChwZWxsLCB0aHIpOwotCi0gICAgICAgIHBlbHUgPSAqcGVscDsgLyogc2V0dGluZyBwZWx1MSB0byBvbGQgdmFsdWUgb2YgcGVsYzEgKi8KLSAgICAgICAgKnBlbHArKyA9IHBlbGMgPSAqUmVjX1lfcHRyOwotICAgICAgICBwZWxsID0gKihSZWNfWV9wdHIgKyB3aWR0aCk7Ci0gICAgICAgIFJlY19ZX3B0cisrOwotICAgICAgICAqc3VtX1ZfcHRyKysgPSBwZWx1ICsgKHBlbGMgPDwgMSkgKyBwZWxsOwotICAgICAgICAqc2lnbl9WX3B0cisrID0gSU5ERVgocGVsdSwgdGhyKSArIElOREVYKHBlbGMsIHRocikgKwotICAgICAgICAgICAgICAgICAgICAgICAgSU5ERVgocGVsbCwgdGhyKTsKLSAgICAgICAgLyogVGhlIGlubmVyIGxvb3Agc3RlcHMgdGhyb3VnaCB0aGUgY29sdW1ucyAqLwotICAgICAgICBmb3IgKGNvbF9jbnRyID0gKHhfYmxrX3N0YXJ0ICsgQkxLU0laRSAtIDEpIC0geF9zdGFydDsgY29sX2NudHIgPiAwOyBjb2xfY250ci0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBwZWx1ID0gKnBlbHA7IC8qIHNldHRpbmcgcGVsdTIgdG8gb2xkIHZhbHVlIG9mIHBlbGMyICovCi0gICAgICAgICAgICAqcGVscCsrID0gcGVsYyA9ICpSZWNfWV9wdHI7Ci0gICAgICAgICAgICBwZWxsID0gKihSZWNfWV9wdHIgKyB3aWR0aCk7Ci0KLSAgICAgICAgICAgICpzdW1fVl9wdHIgPSBwZWx1ICsgKHBlbGMgPDwgMSkgKyBwZWxsOwotICAgICAgICAgICAgKnNpZ25fVl9wdHIgPSBJTkRFWChwZWx1LCB0aHIpICsgSU5ERVgocGVsYywgdGhyKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIElOREVYKHBlbGwsIHRocik7Ci0KLSAgICAgICAgICAgIHN1bTEgPSAqKHNpZ25fVl9wdHIgLSAyKSArICooc2lnbl9WX3B0ciAtIDEpICsgKnNpZ25fVl9wdHI7Ci0gICAgICAgICAgICAvKiB0aGUgImlmIiBzdGF0ZW1lbnQgYmVsb3cgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSBpbgotICAgICAgICAgICAgLyB0aGUgZmlyc3QgbG9vcCAqLwotICAgICAgICAgICAgaWYgKHN1bTEgPT0gMCB8fCBzdW0xID09IDkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3VtID0gKCooc3VtX1ZfcHRyIC0gMikgKyAoKihzdW1fVl9wdHIgLSAxKSA8PCAxKSArCi0gICAgICAgICAgICAgICAgICAgICAgICpzdW1fVl9wdHIgKyA4KSA+PiA0OwotCi0gICAgICAgICAgICAgICAgUmVjX1lfcHRyLS07Ci0gICAgICAgICAgICAgICAgaWYgKChpbnQpKCpSZWNfWV9wdHIgLSBzdW0pID4gbWF4X2RpZmYpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzdW0gPSAqUmVjX1lfcHRyIC0gbWF4X2RpZmY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKChpbnQpKCpSZWNfWV9wdHIgLSBzdW0pIDwgLW1heF9kaWZmKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3VtID0gKlJlY19ZX3B0ciArIG1heF9kaWZmOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAqUmVjX1lfcHRyKysgPSAodWludDgpIHN1bTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFJlY19ZX3B0cisrOwotICAgICAgICAgICAgc3VtX1ZfcHRyKys7Ci0gICAgICAgICAgICBzaWduX1ZfcHRyKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IFJldHVybiBub3RoaW5nIG9yIGRhdGEgb3IgZGF0YSBwb2ludGVyCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgcmV0dXJuOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9ibG9ja19pZGN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2Jsb2NrX2lkY3QuY3BwCmluZGV4IDNkMTAwODYuLmJjNzA4ZTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2Jsb2NrX2lkY3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2Jsb2NrX2lkY3QuY3BwCkBAIC01MDYsNiArNTA2LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogOyBGdW5jdGlvbiBDb2RlIEZPUiBpZGN0cm93CiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdHJvdygKICAgICBpbnQxNiAqYmxrLCB1aW50OCAqcHJlZCwgdWludDggKmRzdCwgaW50IHdpZHRoCiApCkBAIC04MjgsNiArODI5LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogOyBGdW5jdGlvbiBDb2RlIEZPUiBpZGN0Y29sCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdGNvbCgKICAgICBpbnQxNiAqYmxrCiApCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9jaHZfZmlsdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2Nodl9maWx0ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTkzYjQ4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2Nodl9maWx0ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjU0ICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLSAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0vKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gSU5QVVQgQU5EIE9VVFBVVCBERUZJTklUSU9OUwotCi0gSW5wdXRzOgotICAgIFtpbnB1dF92YXJpYWJsZV9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgaW5wdXQgdG8gbW9kdWxlLCBpdHMgdHlwZQotICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotCi0gTG9jYWwgU3RvcmVzL0J1ZmZlcnMvUG9pbnRlcnMgTmVlZGVkOgotICAgIFtsb2NhbF9zdG9yZV9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgbG9jYWwgc3RvcmUsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotICAgIFtsb2NhbF9idWZmZXJfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGxvY2FsIGJ1ZmZlciwgaXRzIHR5cGUKLSAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotICAgIFtsb2NhbF9wdHJfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGxvY2FsIHBvaW50ZXIsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KLQotIEdsb2JhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6Ci0gICAgW2dsb2JhbF9zdG9yZV9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgZ2xvYmFsIHN0b3JlLCBpdHMgdHlwZQotICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCi0gICAgW2dsb2JhbF9idWZmZXJfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgdGhlIGdsb2JhbCBidWZmZXIsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgZGVmaW5pdGlvbiwgYW5kIGxlbmd0aCAod2hlbiBhcHBsaWNhYmxlKV0KLSAgICBbZ2xvYmFsX3B0cl9uYW1lXSA9IFtkZXNjcmlwdGlvbiBvZiB0aGUgZ2xvYmFsIHBvaW50ZXIsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgIGRlZmluaXRpb24sIGFuZCBsZW5ndGggKHdoZW4gYXBwbGljYWJsZSldCi0KLSBPdXRwdXRzOgotICAgIFtyZXR1cm5fdmFyaWFibGVfbmFtZV0gPSBbZGVzY3JpcHRpb24gb2YgZGF0YS9wb2ludGVyIHJldHVybmVkCi0gICAgICAgICAgICAgICAgICBieSBtb2R1bGUsIGl0cyB0eXBlIGRlZmluaXRpb24sIGFuZCBsZW5ndGgKLSAgICAgICAgICAgICAgICAgICh3aGVuIGFwcGxpY2FibGUpXQotCi0gUG9pbnRlcnMgYW5kIEJ1ZmZlcnMgTW9kaWZpZWQ6Ci0gICAgW3ZhcmlhYmxlX2Jmcl9wdHJdIHBvaW50cyB0byB0aGUgW2Rlc2NyaWJlIHdoZXJlIHRoZQotICAgICAgdmFyaWFibGVfYmZyX3B0ciBwb2ludHMgdG8sIGl0cyB0eXBlIGRlZmluaXRpb24sIGFuZCBsZW5ndGgKLSAgICAgICh3aGVuIGFwcGxpY2FibGUpXQotICAgIFt2YXJpYWJsZV9iZnJdIGNvbnRlbnRzIGFyZSBbZGVzY3JpYmUgdGhlIG5ldyBjb250ZW50cyBvZgotICAgICAgdmFyaWFibGVfYmZyXQotCi0gTG9jYWwgU3RvcmVzIE1vZGlmaWVkOgotICAgIFtsb2NhbF9zdG9yZV9uYW1lXSA9IFtkZXNjcmliZSBuZXcgY29udGVudHMsIGl0cyB0eXBlCi0gICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotCi0gR2xvYmFsIFN0b3JlcyBNb2RpZmllZDoKLSAgICBbZ2xvYmFsX3N0b3JlX25hbWVdID0gW2Rlc2NyaWJlIG5ldyBjb250ZW50cywgaXRzIHR5cGUKLSAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9uLCBhbmQgbGVuZ3RoICh3aGVuIGFwcGxpY2FibGUpXQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGVU5DVElPTiBERVNDUklQVElPTgotCi0gICBGb3IgZmFzdCBEZWJsb2NrIGZpbHRlcmluZwotICAgTmV3ZXIgdmVyc2lvbiAobWFjcm9ibG9jayBiYXNlZCBwcm9jZXNzaW5nKQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRVFVSVJFTUVOVFMKLQotIFtMaXN0IHJlcXVpcmVtZW50cyB0byBiZSBzYXRpc2ZpZWQgYnkgdGhpcyBtb2R1bGUuXQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBSRUZFUkVOQ0VTCi0KLSBbTGlzdCBhbGwgcmVmZXJlbmNlcyB1c2VkIGluIGRlc2lnbmluZyB0aGlzIG1vZHVsZS5dCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFBTRVVETy1DT0RFCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIFJFU09VUkNFUyBVU0VECi0gICBXaGVuIHRoZSBjb2RlIGlzIHdyaXR0ZW4gZm9yIGEgc3BlY2lmaWMgdGFyZ2V0IHByb2Nlc3NvciB0aGUKLSAgICAgdGhlIHJlc291cmNlcyB1c2VkIHNob3VsZCBiZSBkb2N1bWVudGVkIGJlbG93LgotCi0gU1RBQ0sgVVNBR0U6IFtzdGFjayBjb3VudCBmb3IgdGhpcyBtb2R1bGVdICsgW3ZhcmlhYmxlIHRvIHJlcHJlc2VudAotICAgICAgICAgIHN0YWNrIHVzYWdlIGZvciBlYWNoIHN1YnJvdXRpbmUgY2FsbGVkXQotCi0gICAgIHdoZXJlOiBbc3RhY2sgdXNhZ2UgdmFyaWFibGVdID0gc3RhY2sgdXNhZ2UgZm9yIFtzdWJyb3V0aW5lCi0gICAgICAgICBuYW1lXSAoc2VlIFtmaWxlbmFtZV0uZXh0KQotCi0gREFUQSBNRU1PUlkgVVNFRDogeCB3b3JkcwotCi0gUFJPR1JBTSBNRU1PUlkgVVNFRDogeCB3b3JkcwotCi0gQ0xPQ0sgQ1lDTEVTOiBbY3ljbGUgY291bnQgZXF1YXRpb24gZm9yIHRoaXMgbW9kdWxlXSArIFt2YXJpYWJsZQotICAgICAgICAgICB1c2VkIHRvIHJlcHJlc2VudCBjeWNsZSBjb3VudCBmb3IgZWFjaCBzdWJyb3V0aW5lCi0gICAgICAgICAgIGNhbGxlZF0KLQotICAgICB3aGVyZTogW2N5Y2xlIGNvdW50IHZhcmlhYmxlXSA9IGN5Y2xlIGNvdW50IGZvciBbc3Vicm91dGluZQotICAgICAgICBuYW1lXSAoc2VlIFtmaWxlbmFtZV0uZXh0KQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IElOQ0xVREVTCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlICAgICJtcDRkZWNfbGliLmgiCi0jaW5jbHVkZSAgICAicG9zdF9wcm9jLmgiCi0KLSNkZWZpbmUgT1NDTF9ESVNBQkxFX1dBUk5JTkdfQ09OVl9QT1NTSUJMRV9MT1NTX09GX0RBVEEKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IE1BQ1JPUwotOyBEZWZpbmUgbW9kdWxlIHNwZWNpZmljIG1hY3JvcyBoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8vI2RlZmluZSBGSUxURVJfTEVOXzgKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERFRklORVMKLTsgSW5jbHVkZSBhbGwgcHJlLXByb2Nlc3NvciBzdGF0ZW1lbnRzIGhlcmUuIEluY2x1ZGUgY29uZGl0aW9uYWwKLTsgY29tcGlsZSB2YXJpYWJsZXMgYWxzby4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTE9DQUwgRlVOQ1RJT04gREVGSU5JVElPTlMKLTsgRnVuY3Rpb24gUHJvdG90eXBlIGRlY2xhcmF0aW9uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTE9DQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgREVGSU5JVElPTlMKLTsgVmFyaWFibGUgZGVjbGFyYXRpb24gLSBkZWZpbmVkIGhlcmUgYW5kIHVzZWQgb3V0c2lkZSB0aGlzIG1vZHVsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFWFRFUk5BTCBGVU5DVElPTiBSRUZFUkVOQ0VTCi07IERlY2xhcmUgZnVuY3Rpb25zIGRlZmluZWQgZWxzZXdoZXJlIGFuZCByZWZlcmVuY2VkIGluIHRoaXMgbW9kdWxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEVYVEVSTkFMIEdMT0JBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBSRUZFUkVOQ0VTCi07IERlY2xhcmUgdmFyaWFibGVzIHVzZWQgaW4gdGhpcyBtb2R1bGUgYnV0IGRlZmluZWQgZWxzZXdoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgIEZ1bmN0aW9uIHByb3RvdHlwZSA6IHZvaWQgQ29tYmluZWRIb3J6VmVydEZpbHRlciggICB1aW50OCAqcmVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqUVBfc3RvcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4ICpwcF9tb2QpCi0gICAgUGFyYW1ldGVycyAgOgotICAgICAgICByZWMgICAgIDogICBwb2ludGVyIHRvIHRoZSBkZWNvZGVkIGZyYW1lIGJ1ZmZlci4KLSAgICAgICAgd2lkdGggICA6ICAgd2lkdGggb2YgZGVjb2RlZCBmcmFtZS4KLSAgICAgICAgaGVpZ2h0ICA6ICAgaGVpZ2h0IG9mIGRlY29kZWQgZnJhbWUKLSAgICAgICAgUVBfc3RvcmU6ICAgcG9pbnRlciB0byB0aGUgYXJyYXkgb2YgUVAgY29ycmVzcG9uZGluZyB0byB0aGUgZGVjb2RlZCBmcmFtZS4KLSAgICAgICAgICAgICAgICAgICAgSXQgaGFkIG9ubHkgb25lIHZhbHVlIGZvciBlYWNoIE1CLgotICAgICAgICBjaHIgICAgIDogICBsdW1hIG9yIGNvbG9yIGluZGljYXRpb24KLSAgICAgICAgICAgICAgICAgICAgPT0gMCBsdW1hCi0gICAgICAgICAgICAgICAgICAgID09IDEgY29sb3IKLSAgICAgICAgcHBfbW9kICA6ICAgVGhlIHNlbXBob3JlIHVzZWQgZm9yIGRlYmxvY2tpbmcKLQotICAgIFJlbWFyayAgICAgIDogICBUaGUgZnVuY3Rpb24gZG8gdGhlIGRlYmxvY2tpbmcgb24gZGVjb2RlZCBmcmFtZXMuCi0gICAgICAgICAgICAgICAgICAgIEZpcnN0IGJhc2VkIG9uIHRoZSBzZW1hcGhvcmUgaW5mby4sIGl0IGlzIGRpdmlkZWQgaW50byBoYXJkIGFuZCBzb2Z0IGZpbHRlcmluZy4KLSAgICAgICAgICAgICAgICAgICAgVG8gZGlmZmVyZW50aWF0ZSByZWFsIGFuZCBmYWtlIGVkZ2UsIGl0IHRoZW4gY2hlY2sgdGhlIGRpZmZlcmVuY2Ugd2l0aCBRUCB0bwotICAgICAgICAgICAgICAgICAgICBkZWNpZGUgd2hldGhlciB0byBkbyB0aGUgZmlsdGVyaW5nIG9yIG5vdC4KLQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRlVOQ1RJT04gQ09ERQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkIENvbWJpbmVkSG9yelZlcnRGaWx0ZXIoCi0gICAgdWludDggKnJlYywKLSAgICBpbnQgd2lkdGgsCi0gICAgaW50IGhlaWdodCwKLSAgICBpbnQxNiAqUVBfc3RvcmUsCi0gICAgaW50IGNociwKLSAgICB1aW50OCAqcHBfbW9kKQotewotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIGludCBiciwgYmMsIG1iciwgbWJjOwotICAgIGludCBRUCA9IDE7Ci0gICAgdWludDggKnB0ciwgKnB0cl9lOwotICAgIGludCBwcF93LCBwcF9oOwotICAgIGludCBicndpZHRoOwotCi0gICAgaW50IGpWYWwwLCBqVmFsMSwgalZhbDI7Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBGdW5jdGlvbiBib2R5IGhlcmUKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBwcF93ID0gKHdpZHRoID4+IDMpOwotICAgIHBwX2ggPSAoaGVpZ2h0ID4+IDMpOwotCi0gICAgZm9yIChtYnIgPSAwOyBtYnIgPCBwcF9oOyBtYnIgKz0gMikgICAgICAgICAvKiByb3cgb2YgYmxvY2tzICovCi0gICAgewotICAgICAgICBicndpZHRoID0gbWJyICogcHBfdzsgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYmxvY2tzIGFib3ZlIGN1cnJlbnQgYmxvY2sgcm93ICovCi0gICAgICAgIGZvciAobWJjID0gMDsgbWJjIDwgcHBfdzsgbWJjICs9IDIpICAgICAvKiBjb2wgb2YgYmxvY2tzICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghY2hyKQotICAgICAgICAgICAgICAgIFFQID0gUVBfc3RvcmVbKGJyd2lkdGg+PjIpICsgKG1iYz4+MSldOyAvKiBRUCBpcyBwZXIgTUIgYmFzZWQgdmFsdWUgKi8KLQotICAgICAgICAgICAgLyoqKioqKioqKiBmb3IgZWFjaCBibG9jayAqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKiogSG9yaXouIEZpbHRlcmluZyAqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIGZvciAoYnIgPSBtYnIgKyAxOyBiciA8IG1iciArIDM7IGJyKyspICAvKiAyeDIgYmxvY2tzICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnJ3aWR0aCArPSBwcF93OyAgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJsb2NrcyBhYm92ZSAmIGxlZnQgY3VycmVudCBibG9jayByb3cgKi8KLSAgICAgICAgICAgICAgICAvKiB0aGUgcHJvZmlsZSBvbiBBUk05MjBUIHNob3dzIHNlcGFyYXRlIHRoZXNlIHR3byBib3VuZGFyeSBjaGVjayBpcyBmYXN0ZXIgdGhhbiBjb21iaW5lIHRoZW0gKi8KLSAgICAgICAgICAgICAgICBpZiAoYnIgPCBwcF9oKSAgICAgICAgICAgICAgICAgIC8qIGJvdW5kYXJ5IDogZG9uJ3QgZG8gaXQgb24gdGhlIGxvd2VzdCByb3cgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgZm9yIChiYyA9IG1iYzsgYmMgPCBtYmMgKyAyOyBiYysrKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKioqKioqIGNoZWNrIGJvdW5kYXJ5IGZvciBkZWJsb2NraW5nICoqKioqKioqKioqKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYyA8IHBwX3cpICAgICAgICAgICAgICAvKiBib3VuZGFyeSA6IGRvbid0IGRvIGl0IG9uIHRoZSBtb3N0IHJpZ2h0IGNvbCBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IHJlYyArIChicndpZHRoIDw8IDYpICsgKGJjIDw8IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gYnJ3aWR0aCArIGJjOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaHIpICAgIFFQID0gUVBfc3RvcmVbalZhbDBdOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2UgPSBwdHIgKyA4OyAgICAgICAgLyogcG9pbnRlciB0byB3aGVyZSB0aGUgbG9vcCBlbmRzICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChwcF9tb2RbalZhbDBdJjB4MDIpKSAmJiAoKHBwX21vZFtqVmFsMC1wcF93XSYweDAyKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIb3JpeiBIYXJkIGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICoocHRyIC0gd2lkdGgpOyAgICAgLyogQyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAqcHRyOyAgICAgICAgICAgICAgIC8qIEQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwyID0galZhbDEgLSBqVmFsMDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoalZhbDIgPiAwKSAmJiAoalZhbDIgPCAoUVAgPDwgMSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKGpWYWwyIDwgMCkgJiYgKGpWYWwyID4gLShRUCA8PCAxKSkpKSAvKiAoRC1DKSBjb21wYXJlZCB3aXRoIDJRUCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpZmZlcmVudGlhdGUgYmV0d2VlbiByZWFsIGFuZCBmYWtlIGVkZ2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICgoalZhbDAgKyBqVmFsMSkgPj4gMSk7ICAgICAvKiAoRCtDKS8yICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSB3aWR0aCkgPSAodWludDgpKGpWYWwwKTsgICAgLyogIEMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyID0gKHVpbnQ4KShqVmFsMCk7ICAgICAgICAgIC8qICBEICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICoocHRyIC0gKHdpZHRoIDw8IDEpKTsgICAgICAvKiBCICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAqKHB0ciArIHdpZHRoKTsgICAgICAgICAvKiBFICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDIgPSBqVmFsMSAtIGpWYWwwOyAgICAgIC8qIEUtQiAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpWYWwyID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwICs9ICgoalZhbDIgKyAzKSA+PiAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgLT0gKChqVmFsMiArIDMpID4+IDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtICh3aWR0aCA8PCAxKSkgPSAodWludDgpalZhbDA7ICAgICAgIC8qICBzdG9yZSBCICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyICsgd2lkdGgpID0gKHVpbnQ4KWpWYWwxOyAgICAgICAgICAvKiBzdG9yZSBFICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGpWYWwyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgLT0gKCgzIC0galZhbDIpID4+IDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSArPSAoKDMgLSBqVmFsMikgPj4gMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gKHdpZHRoIDw8IDEpKSA9ICh1aW50OClqVmFsMDsgICAgICAgLyogIHN0b3JlIEIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyB3aWR0aCkgPSAodWludDgpalZhbDE7ICAgICAgICAgIC8qIHN0b3JlIEUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICoocHRyIC0gKHdpZHRoIDw8IDEpIC0gd2lkdGgpOyAgLyogQSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxID0gKihwdHIgKyAod2lkdGggPDwgMSkpOyAgICAgIC8qIEYgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMiA9IGpWYWwxIC0galZhbDA7ICAgICAgICAgICAgICAvKiAoRi1BKSAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpWYWwyID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwICs9ICgoalZhbDIgKyA3KSA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgLT0gKChqVmFsMiArIDcpID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtICh3aWR0aCA8PCAxKSAtIHdpZHRoKSA9ICh1aW50OCkoalZhbDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciArICh3aWR0aCA8PCAxKSkgPSAodWludDgpKGpWYWwxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoalZhbDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCAtPSAoKDcgLSBqVmFsMikgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxICs9ICgoNyAtIGpWYWwyKSA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAod2lkdGggPDwgMSkgLSB3aWR0aCkgPSAodWludDgpKGpWYWwwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyAod2lkdGggPDwgMSkpID0gKHVpbnQ4KShqVmFsMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfS8qIGEzXzAgPiAyUVAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKytwdHIgPCBwdHJfZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgICAvKiBIb3JpeiBzb2Z0IGZpbHRlciovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICoocHRyIC0gd2lkdGgpOyAvKiBCICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9ICpwdHI7ICAgICAgICAgICAvKiBDICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMiA9IGpWYWwxIC0galZhbDA7ICAvKiBDLUIgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgoalZhbDIgPiAwKSAmJiAoalZhbDIgPCAoUVApKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChqVmFsMiA8IDApICYmIChqVmFsMiA+IC0oUVApKSkpIC8qIChDLUIpIGNvbXBhcmVkIHdpdGggUVAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKChqVmFsMCArIGpWYWwxKSA+PiAxKTsgICAgIC8qIChCK0MpLzIgY2Fubm90IG92ZXJmbG93OyBjZWlsKCkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIHdpZHRoKSA9ICh1aW50OCkoalZhbDApOyAgICAvKiBCID0gKEIrQykvMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdHIgPSAodWludDgpalZhbDA7ICAgICAgICAgICAgLyogQyA9IChCK0MpLzIgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKihwdHIgLSAod2lkdGggPDwgMSkpOyAgICAgIC8qIEEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9ICoocHRyICsgd2lkdGgpOyAgICAgICAgIC8qIEQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMiA9IGpWYWwxIC0galZhbDA7ICAgICAgICAgIC8qIEQtQSAqLwotCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoalZhbDIgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgLT0gKChqVmFsMiArIDcpID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCArPSAoKGpWYWwyICsgNykgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gKHdpZHRoIDw8IDEpKSA9ICh1aW50OClqVmFsMDsgICAgICAgLyogQSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciArIHdpZHRoKSA9ICh1aW50OClqVmFsMTsgICAgICAgICAgLyogRCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChqVmFsMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxICs9ICgoNyAtIGpWYWwyKSA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgLT0gKCg3IC0galZhbDIpID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtICh3aWR0aCA8PCAxKSkgPSAodWludDgpalZhbDA7ICAgICAgIC8qIEEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyB3aWR0aCkgPSAodWludDgpalZhbDE7ICAgICAgICAgIC8qIEQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCsrcHRyIDwgcHRyX2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLyogU29mdCBmaWx0ZXIqLwotICAgICAgICAgICAgICAgICAgICAgICAgfS8qIGJvdW5kYXJ5IGNoZWNraW5nKi8KLSAgICAgICAgICAgICAgICAgICAgfS8qYmMqLwotICAgICAgICAgICAgfS8qYnIqLwotICAgICAgICAgICAgYnJ3aWR0aCAtPSAocHBfdyA8PCAxKTsKLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKiogVmVydC4gRmlsdGVyaW5nICoqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgZm9yIChiciA9IG1icjsgYnIgPCBtYnIgKyAyOyBicisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChiciA8IHBwX2gpCi0gICAgICAgICAgICAgICAgICAgIGZvciAoYmMgPSBtYmMgKyAxOyBiYyA8IG1iYyArIDM7IGJjKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKiogY2hlY2sgYm91bmRhcnkgZm9yIGRlYmxvY2tpbmcgKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJjIDwgcHBfdykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSByZWMgKyAoYnJ3aWR0aCA8PCA2KSArIChiYyA8PCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9IGJyd2lkdGggKyBiYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hyKSAgICBRUCA9IFFQX3N0b3JlW2pWYWwwXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9lID0gcHRyICsgKHdpZHRoIDw8IDMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgocHBfbW9kW2pWYWwwLTFdJjB4MDEpKSAmJiAoKHBwX21vZFtqVmFsMF0mMHgwMSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVydCBIYXJkIGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9ICpwdHI7ICAgICAgIC8qIEQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKihwdHIgLSAxKTsgLyogQyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDIgPSBqVmFsMSAtIGpWYWwwOyAgLyogRC1DICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKGpWYWwyID4gMCkgJiYgKGpWYWwyIDwgKFFQIDw8IDEpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChqVmFsMiA8IDApICYmIChqVmFsMiA+IC0oUVAgPDwgMSkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9IChqVmFsMCArIGpWYWwxKSA+PiAxOyAgIC8qIChDK0QpLzIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyICAgICAgICA9ICAgalZhbDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAxKSAgPSAgIGpWYWwxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAqKHB0ciArIDEpOyAgICAgLyogRSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKihwdHIgLSAyKTsgICAgIC8qIEIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMiA9IGpWYWwxIC0galZhbDA7ICAgICAgLyogRS1CICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoalZhbDIgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgLT0gKChqVmFsMiArIDMpID4+IDIpOyAgICAgICAgLyogRSA9IEUgLShFLUIpLzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgKz0gKChqVmFsMiArIDMpID4+IDIpOyAgICAgICAgLyogQiA9IEIgKyhFLUIpLzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyAxKSA9IGpWYWwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIDIpID0galZhbDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGpWYWwyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgKz0gKCgzIC0galZhbDIpID4+IDIpOyAgICAgICAgLyogRSA9IEUgLShFLUIpLzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgLT0gKCgzIC0galZhbDIpID4+IDIpOyAgICAgICAgLyogQiA9IEIgKyhFLUIpLzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyAxKSA9IGpWYWwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIDIpID0galZhbDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAqKHB0ciArIDIpOyAgICAgLyogRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKihwdHIgLSAzKTsgICAgIC8qIEEgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwyID0galZhbDEgLSBqVmFsMDsgICAgICAgICAgLyogKEYtQSkgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqVmFsMiA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSAtPSAoKGpWYWwyICsgNykgPj4gMyk7ICAgIC8qIEYgLT0gKEYtQSkvOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCArPSAoKGpWYWwyICsgNykgPj4gMyk7ICAgIC8qIEEgKz0gKEYtQSkvOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciArIDIpID0galZhbDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gMykgPSBqVmFsMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoalZhbDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSAtPSAoKGpWYWwyIC0gNykgPj4gMyk7ICAgIC8qIEYgLT0gKEYtQSkvOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCArPSAoKGpWYWwyIC0gNykgPj4gMyk7ICAgIC8qIEEgKz0gKEYtQSkvOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciArIDIpID0galZhbDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gMykgPSBqVmFsMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgLyogZW5kIG9mIHZlciBoYXJkIGZpbGV0ZXJpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHB0ciArPSB3aWR0aCkgPCBwdHJfZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgICAvKiBWZXJ0IHNvZnQgZmlsdGVyKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxID0gKnB0cjsgICAgICAgICAgICAgICAvKiBDICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9ICoocHRyIC0gMSk7ICAgICAgICAgLyogQiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDIgPSBqVmFsMSAtIGpWYWwwOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChqVmFsMiA+IDApICYmIChqVmFsMiA8IChRUCkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoKGpWYWwyIDwgMCkgJiYgKGpWYWwyID4gLShRUCkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxID0gKGpWYWwwICsgalZhbDEgKyAxKSA+PiAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdHIgPSBqVmFsMTsgICAgICAgICAgIC8qIEMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIDEpID0galZhbDE7ICAgICAvKiBCICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9ICoocHRyICsgMSk7ICAgICAvKiBEICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSAqKHB0ciAtIDIpOyAgICAgLyogQSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwyID0gKGpWYWwxIC0galZhbDApOyAgICAgICAgLyogRC0gQSAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpWYWwyID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxIC09ICgoKGpWYWwyKSArIDcpID4+IDMpOyAgICAgIC8qIEQgLT0gKEQtQSkvOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCArPSAoKChqVmFsMikgKyA3KSA+PiAzKTsgICAgICAvKiBBICs9IChELUEpLzggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyAxKSA9IGpWYWwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIDIpID0galZhbDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoalZhbDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSArPSAoKDcgLSAoalZhbDIpKSA+PiAzKTsgICAgICAvKiBEIC09IChELUEpLzggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgLT0gKCg3IC0gKGpWYWwyKSkgPj4gMyk7ICAgICAgLyogQSArPSAoRC1BKS84ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyICsgMSkgPSBqVmFsMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAyKSA9IGpWYWwwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHB0ciArPSB3aWR0aCkgPCBwdHJfZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvKiBTb2Z0IGZpbHRlciovCi0gICAgICAgICAgICAgICAgICAgICAgICB9IC8qIGJvdW5kYXJ5Ki8KLSAgICAgICAgICAgICAgICAgICAgfSAvKmJjKi8KLSAgICAgICAgICAgICAgICBicndpZHRoICs9IHBwX3c7Ci0gICAgICAgICAgICB9LypiciovCi0gICAgICAgICAgICBicndpZHRoIC09IChwcF93IDw8IDEpOwotICAgICAgICB9LyptYmMqLwotICAgICAgICBicndpZHRoICs9IChwcF93IDw8IDEpOwotICAgIH0vKm1iciovCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHJldHVybjsKLX0KLXZvaWQgQ29tYmluZWRIb3J6VmVydEZpbHRlcl9Ob1NvZnREZWJsb2NraW5nKAotICAgIHVpbnQ4ICpyZWMsCi0gICAgaW50IHdpZHRoLAotICAgIGludCBoZWlnaHQsCi0gICAgaW50MTYgKlFQX3N0b3JlLAotICAgIGludCBjaHIsCi0gICAgdWludDggKnBwX21vZCkKLXsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRGVmaW5lIGFsbCBsb2NhbCB2YXJpYWJsZXMKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICBpbnQgYnIsIGJjLCBtYnIsIG1iYzsKLSAgICBpbnQgUVAgPSAxOwotICAgIHVpbnQ4ICpwdHIsICpwdHJfZTsKLSAgICBpbnQgcHBfdywgcHBfaDsKLSAgICBpbnQgYnJ3aWR0aDsKLQotICAgIGludCBqVmFsMCwgalZhbDEsIGpWYWwyOwotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgcHBfdyA9ICh3aWR0aCA+PiAzKTsKLSAgICBwcF9oID0gKGhlaWdodCA+PiAzKTsKLQotICAgIGZvciAobWJyID0gMDsgbWJyIDwgcHBfaDsgbWJyICs9IDIpICAgICAgICAgLyogcm93IG9mIGJsb2NrcyAqLwotICAgIHsKLSAgICAgICAgYnJ3aWR0aCA9IG1iciAqIHBwX3c7ICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJsb2NrcyBhYm92ZSBjdXJyZW50IGJsb2NrIHJvdyAqLwotICAgICAgICBmb3IgKG1iYyA9IDA7IG1iYyA8IHBwX3c7IG1iYyArPSAyKSAgICAgLyogY29sIG9mIGJsb2NrcyAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWNocikKLSAgICAgICAgICAgICAgICBRUCA9IFFQX3N0b3JlWyhicndpZHRoPj4yKSArIChtYmM+PjEpXTsgLyogUVAgaXMgcGVyIE1CIGJhc2VkIHZhbHVlICovCi0KLSAgICAgICAgICAgIC8qKioqKioqKiogZm9yIGVhY2ggYmxvY2sgKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqIEhvcml6LiBGaWx0ZXJpbmcgKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICBmb3IgKGJyID0gbWJyICsgMTsgYnIgPCBtYnIgKyAzOyBicisrKSAgLyogMngyIGJsb2NrcyAqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJyd2lkdGggKz0gcHBfdzsgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBibG9ja3MgYWJvdmUgJiBsZWZ0IGN1cnJlbnQgYmxvY2sgcm93ICovCi0gICAgICAgICAgICAgICAgLyogdGhlIHByb2ZpbGUgb24gQVJNOTIwVCBzaG93cyBzZXBhcmF0ZSB0aGVzZSB0d28gYm91bmRhcnkgY2hlY2sgaXMgZmFzdGVyIHRoYW4gY29tYmluZSB0aGVtICovCi0gICAgICAgICAgICAgICAgaWYgKGJyIDwgcHBfaCkgICAgICAgICAgICAgICAgICAvKiBib3VuZGFyeSA6IGRvbid0IGRvIGl0IG9uIHRoZSBsb3dlc3Qgcm93IGJsb2NrICovCi0gICAgICAgICAgICAgICAgICAgIGZvciAoYmMgPSBtYmM7IGJjIDwgbWJjICsgMjsgYmMrKykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyoqKioqKiBjaGVjayBib3VuZGFyeSBmb3IgZGVibG9ja2luZyAqKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmMgPCBwcF93KSAgICAgICAgICAgICAgLyogYm91bmRhcnkgOiBkb24ndCBkbyBpdCBvbiB0aGUgbW9zdCByaWdodCBjb2wgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSByZWMgKyAoYnJ3aWR0aCA8PCA2KSArIChiYyA8PCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9IGJyd2lkdGggKyBiYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hyKSAgICBRUCA9IFFQX3N0b3JlW2pWYWwwXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9lID0gcHRyICsgODsgICAgICAgIC8qIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGxvb3AgZW5kcyAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgocHBfbW9kW2pWYWwwXSYweDAyKSkgJiYgKChwcF9tb2RbalZhbDAtcHBfd10mMHgwMikpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSG9yaXogSGFyZCBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSAqKHB0ciAtIHdpZHRoKTsgICAgIC8qIEMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxID0gKnB0cjsgICAgICAgICAgICAgICAvKiBEICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMiA9IGpWYWwxIC0galZhbDA7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKGpWYWwyID4gMCkgJiYgKGpWYWwyIDwgKFFQIDw8IDEpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChqVmFsMiA8IDApICYmIChqVmFsMiA+IC0oUVAgPDwgMSkpKSkgLyogKEQtQykgY29tcGFyZWQgd2l0aCAyUVAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkaWZmZXJlbnRpYXRlIGJldHdlZW4gcmVhbCBhbmQgZmFrZSBlZGdlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSAoKGpWYWwwICsgalZhbDEpID4+IDEpOyAgICAgLyogKEQrQykvMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gd2lkdGgpID0gKHVpbnQ4KShqVmFsMCk7ICAgIC8qICBDICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0ciA9ICh1aW50OCkoalZhbDApOyAgICAgICAgICAvKiAgRCAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSAqKHB0ciAtICh3aWR0aCA8PCAxKSk7ICAgICAgLyogQiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxID0gKihwdHIgKyB3aWR0aCk7ICAgICAgICAgLyogRSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwyID0galZhbDEgLSBqVmFsMDsgICAgICAvKiBFLUIgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqVmFsMiA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCArPSAoKGpWYWwyICsgMykgPj4gMik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxIC09ICgoalZhbDIgKyAzKSA+PiAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAod2lkdGggPDwgMSkpID0gKHVpbnQ4KWpWYWwwOyAgICAgICAvKiAgc3RvcmUgQiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciArIHdpZHRoKSA9ICh1aW50OClqVmFsMTsgICAgICAgICAgLyogc3RvcmUgRSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChqVmFsMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwIC09ICgoMyAtIGpWYWwyKSA+PiAyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgKz0gKCgzIC0galZhbDIpID4+IDIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtICh3aWR0aCA8PCAxKSkgPSAodWludDgpalZhbDA7ICAgICAgIC8qICBzdG9yZSBCICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyICsgd2lkdGgpID0gKHVpbnQ4KWpWYWwxOyAgICAgICAgICAvKiBzdG9yZSBFICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgPSAqKHB0ciAtICh3aWR0aCA8PCAxKSAtIHdpZHRoKTsgIC8qIEEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9ICoocHRyICsgKHdpZHRoIDw8IDEpKTsgICAgICAvKiBGICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDIgPSBqVmFsMSAtIGpWYWwwOyAgICAgICAgICAgICAgLyogKEYtQSkgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqVmFsMiA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCArPSAoKGpWYWwyICsgNykgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwxIC09ICgoalZhbDIgKyA3KSA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAod2lkdGggPDwgMSkgLSB3aWR0aCkgPSAodWludDgpKGpWYWwwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyAod2lkdGggPDwgMSkpID0gKHVpbnQ4KShqVmFsMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGpWYWwyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgLT0gKCg3IC0galZhbDIpID4+IDMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSArPSAoKDcgLSBqVmFsMikgPj4gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gKHdpZHRoIDw8IDEpIC0gd2lkdGgpID0gKHVpbnQ4KShqVmFsMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyICsgKHdpZHRoIDw8IDEpKSA9ICh1aW50OCkoalZhbDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0vKiBhM18wID4gMlFQICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCsrcHRyIDwgcHRyX2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgfS8qIGJvdW5kYXJ5IGNoZWNraW5nKi8KLSAgICAgICAgICAgICAgICAgICAgfS8qYmMqLwotICAgICAgICAgICAgfS8qYnIqLwotICAgICAgICAgICAgYnJ3aWR0aCAtPSAocHBfdyA8PCAxKTsKLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKiogVmVydC4gRmlsdGVyaW5nICoqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgZm9yIChiciA9IG1icjsgYnIgPCBtYnIgKyAyOyBicisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChiciA8IHBwX2gpCi0gICAgICAgICAgICAgICAgICAgIGZvciAoYmMgPSBtYmMgKyAxOyBiYyA8IG1iYyArIDM7IGJjKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qKioqKiogY2hlY2sgYm91bmRhcnkgZm9yIGRlYmxvY2tpbmcgKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJjIDwgcHBfdykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSByZWMgKyAoYnJ3aWR0aCA8PCA2KSArIChiYyA8PCAzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCA9IGJyd2lkdGggKyBiYzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hyKSAgICBRUCA9IFFQX3N0b3JlW2pWYWwwXTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9lID0gcHRyICsgKHdpZHRoIDw8IDMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgocHBfbW9kW2pWYWwwLTFdJjB4MDEpKSAmJiAoKHBwX21vZFtqVmFsMF0mMHgwMSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmVydCBIYXJkIGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9ICpwdHI7ICAgICAgIC8qIEQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKihwdHIgLSAxKTsgLyogQyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDIgPSBqVmFsMSAtIGpWYWwwOyAgLyogRC1DICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKGpWYWwyID4gMCkgJiYgKGpWYWwyIDwgKFFQIDw8IDEpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKChqVmFsMiA8IDApICYmIChqVmFsMiA+IC0oUVAgPDwgMSkpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSA9IChqVmFsMCArIGpWYWwxKSA+PiAxOyAgIC8qIChDK0QpLzIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHRyICAgICAgICA9ICAgalZhbDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAxKSAgPSAgIGpWYWwxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAqKHB0ciArIDEpOyAgICAgLyogRSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKihwdHIgLSAyKTsgICAgIC8qIEIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMiA9IGpWYWwxIC0galZhbDA7ICAgICAgLyogRS1CICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoalZhbDIgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgLT0gKChqVmFsMiArIDMpID4+IDIpOyAgICAgICAgLyogRSA9IEUgLShFLUIpLzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgKz0gKChqVmFsMiArIDMpID4+IDIpOyAgICAgICAgLyogQiA9IEIgKyhFLUIpLzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyAxKSA9IGpWYWwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIDIpID0galZhbDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGpWYWwyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgKz0gKCgzIC0galZhbDIpID4+IDIpOyAgICAgICAgLyogRSA9IEUgLShFLUIpLzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDAgLT0gKCgzIC0galZhbDIpID4+IDIpOyAgICAgICAgLyogQiA9IEIgKyhFLUIpLzQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgKyAxKSA9IGpWYWwxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIDIpID0galZhbDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgalZhbDEgPSAqKHB0ciArIDIpOyAgICAgLyogRiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwwID0gKihwdHIgLSAzKTsgICAgIC8qIEEgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpWYWwyID0galZhbDEgLSBqVmFsMDsgICAgICAgICAgLyogKEYtQSkgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqVmFsMiA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSAtPSAoKGpWYWwyICsgNykgPj4gMyk7ICAgIC8qIEYgLT0gKEYtQSkvOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCArPSAoKGpWYWwyICsgNykgPj4gMyk7ICAgIC8qIEEgKz0gKEYtQSkvOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciArIDIpID0galZhbDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gMykgPSBqVmFsMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoalZhbDIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMSAtPSAoKGpWYWwyIC0gNykgPj4gMyk7ICAgIC8qIEYgLT0gKEYtQSkvOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqVmFsMCArPSAoKGpWYWwyIC0gNykgPj4gMyk7ICAgIC8qIEEgKz0gKEYtQSkvOCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciArIDIpID0galZhbDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyIC0gMykgPSBqVmFsMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9ICAgLyogZW5kIG9mIHZlciBoYXJkIGZpbGV0ZXJpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHB0ciArPSB3aWR0aCkgPCBwdHJfZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICB9IC8qIGJvdW5kYXJ5Ki8KLSAgICAgICAgICAgICAgICAgICAgfSAvKmJjKi8KLSAgICAgICAgICAgICAgICBicndpZHRoICs9IHBwX3c7Ci0gICAgICAgICAgICB9LypiciovCi0gICAgICAgICAgICBicndpZHRoIC09IChwcF93IDw8IDEpOwotICAgICAgICB9LyptYmMqLwotICAgICAgICBicndpZHRoICs9IChwcF93IDw8IDEpOwotICAgIH0vKm1iciovCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHJldHVybjsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvY2h2cl9maWx0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvY2h2cl9maWx0ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTVjZjcxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2NodnJfZmlsdGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDU2NSArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotI2luY2x1ZGUgICAgIm1wNGRlY19saWIuaCIKLSNpbmNsdWRlICAgICJwb3N0X3Byb2MuaCIKLQotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0KLXZvaWQgQ29tYmluZWRIb3J6VmVydFJpbmdGaWx0ZXIoCi0gICAgdWludDggKnJlYywKLSAgICBpbnQgd2lkdGgsCi0gICAgaW50IGhlaWdodCwKLSAgICBpbnQxNiAqUVBfc3RvcmUsCi0gICAgaW50IGNociwKLSAgICB1aW50OCAqcHBfbW9kKQotewotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIGludCBpbmRleCwgY291bnRlcjsKLSAgICBpbnQgYnIsIGJjLCBpbmNyLCBtYnIsIG1iYzsKLSAgICBpbnQgUVAgPSAxOwotICAgIGludCB2WzVdOwotICAgIHVpbnQ4ICpwdHIsICpwdHJfYywgKnB0cl9uOwotICAgIGludCB3MSwgdzIsIHczLCB3NDsKLSAgICBpbnQgcHBfdywgcHBfaCwgYnJ3aWR0aDsKLSAgICBpbnQgc3VtLCBkZWx0YTsKLSAgICBpbnQgYTNfMCwgYTNfMSwgYTNfMiwgQTNfMDsKLSAgICAvKiBmb3IgRGVyaW5naW5nIFRocmVzaG9sZCBhcHByb2FjaCAoTVBFRzQpKi8KLSAgICBpbnQgbWF4X2RpZmYsIHRocmVzLCB2MCwgaDAsIG1pbl9ibGssIG1heF9ibGs7Ci0gICAgaW50IGNudGhmbGFnOwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBGdW5jdGlvbiBib2R5IGhlcmUKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAvKiBDYWxjdWxhdGUgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGFyZWEgaW4gYmxvY2tzIChkaXZpZGUgYnkgOCkgKi8KLSAgICBwcF93ID0gKHdpZHRoID4+IDMpOwotICAgIHBwX2ggPSAoaGVpZ2h0ID4+IDMpOwotCi0gICAgLyogU2V0IHVwIHZhcmlvdXMgdmFsdWVzIG5lZWRlZCBmb3IgdXBkYXRpbmcgcG9pbnRlcnMgaW50byByZWMgKi8KLSAgICB3MSA9IHdpZHRoOyAgICAgICAgICAgICAvKiBPZmZzZXQgdG8gbmV4dCByb3cgaW4gcGl4ZWxzICovCi0gICAgdzIgPSB3aWR0aCA8PCAxOyAgICAgICAgLyogT2Zmc2V0IHRvIHR3byByb3dzIGluIHBpeGVscyAqLwotICAgIHczID0gdzEgKyB3MjsgICAgICAgICAgIC8qIE9mZnNldCB0byB0aHJlZSByb3dzIGluIHBpeGVscyAqLwotICAgIHc0ID0gdzIgPDwgMTsgICAgICAgICAgIC8qIE9mZnNldCB0byBmb3VyIHJvd3MgaW4gcGl4ZWxzICovCi0gICAgaW5jciA9IHdpZHRoIC0gQkxLU0laRTsgLyogT2Zmc2V0IHRvIG5leHQgcm93IGFmdGVyIHByb2Nlc3NpbmcgYmxvY2sgKi8KLQotICAgIC8qIFdvcmsgdGhyb3VnaCB0aGUgYXJlYSBob3J0aXpvbnRhbGx5IGJ5IHR3byByb3dzIHBlciBzdGVwICovCi0gICAgZm9yIChtYnIgPSAwOyBtYnIgPCBwcF9oOyBtYnIgKz0gMikKLSAgICB7Ci0gICAgICAgIC8qIGJyd2lkdGggY29udGFpbnMgdGhlIGJsb2NrIG51bWJlciBvZiB0aGUgbGVmdG1vc3QgYmxvY2sKLSAgICAgICAgICogb2YgdGhlIGN1cnJlbnQgcm93ICovCi0gICAgICAgIGJyd2lkdGggPSBtYnIgKiBwcF93OwotCi0gICAgICAgIC8qIFdvcmsgdGhyb3VnaCB0aGUgYXJlYSB2ZXJ0aWNhbGx5IGJ5IHR3byBjb2x1bW5zIHBlciBzdGVwICovCi0gICAgICAgIGZvciAobWJjID0gMDsgbWJjIDwgcHBfdzsgbWJjICs9IDIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGlmIHRoZSBkYXRhIGlzIGx1bWluYW5jZSBpbmZvLCBnZXQgdGhlIGNvcnJlY3QKLSAgICAgICAgICAgICAgICAgICAgKiBxdWFudGl6YXRpb24gcGFyYW1lbnRlci4gT25lIHBhcmFtZXRlciBwZXIgbWFjcm9ibG9jayAqLwotICAgICAgICAgICAgaWYgKCFjaHIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogYnJ3aWR0aC80IGlzIHRoZSBtYWNyb2Jsb2NrIG51bWJlciBhbmQgbWJjLzIgaXMgdGhlIG1hY3JvYmxvY2sgY29sIG51bWJlciovCi0gICAgICAgICAgICAgICAgUVAgPSBRUF9zdG9yZVsoYnJ3aWR0aD4+MikgKyAobWJjPj4xKV07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKiogSG9yaXouIEZpbHRlcmluZyAqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qIFByb2Nlc3MgZm91ciBibG9ja3MgZm9yIHRoZSBmaWx0ZXJpbmcgICAgICAgICovCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvKiBMb29wIG92ZXIgdHdvIHJvd3Mgb2YgYmxvY2tzICovCi0gICAgICAgICAgICBmb3IgKGJyID0gbWJyICsgMTsgYnIgPCBtYnIgKyAzOyBicisrKSAgICAvKiBiciBpcyB0aGUgcm93IGNvdW50ZXIgaW4gYmxvY2tzICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogU2V0IGJyd2lkdGggdG8gdGhlIGZpcnN0IChsZWZ0bW9zdCkgYmxvY2sgbnVtYmVyIG9mIHRoZSBuZXh0IHJvdyAqLwotICAgICAgICAgICAgICAgIC8qIGJyd2lkdGggaXMgdXNlZCBhcyBhbiBpbmRleCB3aGVuIGNvdW50aW5nIGJsb2NrcyAqLwotICAgICAgICAgICAgICAgIGJyd2lkdGggKz0gcHBfdzsKLQotICAgICAgICAgICAgICAgIC8qIExvb3Agb3ZlciB0d28gY29sdW1ucyBvZiBibG9ja3MgaW4gdGhlIHJvdyAqLwotICAgICAgICAgICAgICAgIGZvciAoYmMgPSBtYmM7IGJjIDwgbWJjICsgMjsgYmMrKykgICAgLyogYmMgaXMgdGhlIGNvbHVtbiBjb3VudGVyIGluIGJsb2NrcyAqLwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoqKioqKiBjaGVjayBib3VuZGFyeSBmb3IgZGVibG9ja2luZyAqKioqKioqKioqKiovCi0gICAgICAgICAgICAgICAgICAgIC8qIEV4ZWN1dGUgaWYgdGhlIHJvdyBhbmQgY29sdW1uIGNvdW50ZXJzIGFyZSB3aXRoaW4gdGhlIGFyZWEgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJyIDwgcHBfaCAmJiBiYyA8IHBwX3cpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgcHRyIHRvIHRoZSBmaXJzdCBwaXhlbCBvZiB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIHNlY29uZCByb3cKLSAgICAgICAgICAgICAgICAgICAgICAgICogYnJ3aWR0aCAqIDY0IGlzIHRoZSBwaXhlbCByb3cgb2Zmc2V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAqIGJjICogOCBpcyB0aGUgcGl4ZWwgY29sdW1uIG9mZnNldCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gcmVjICsgKGJyd2lkdGggPDwgNikgKyAoYmMgPDwgMyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgaW5kZXggdG8gdGhlIGN1cnJlbnQgYmxvY2sgb2YgdGhlIHNlY29uZCByb3cgY291bnRpbmcgaW4gYmxvY2tzICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGJyd2lkdGggKyBiYzsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgdGhlIGRhdGEgaXMgY2hyb21pbmFuY2UgaW5mbywgZ2V0IHRoZSBjb3JyZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKiBxdWFudGl6YXRpb24gcGFyYW1lbnRlci4gT25lIHBhcmFtZXRlciBwZXIgYmxvY2suICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hyKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFQID0gUVBfc3RvcmVbaW5kZXhdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBFeGVjdXRlIGhhcmQgaG9yaXpvbnRhbCBmaWx0ZXIgaWYgc2VtYXBob3JlIGZvciBob3Jpem9udGFsIGRlYmxvY2tpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpcyBzZXQgZm9yIHRoZSBjdXJyZW50IGJsb2NrIGFuZCBibG9jayBpbW1lZGlhdGVseSBhYm92ZSBpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCgocHBfbW9kW2luZGV4XSYweDAyKSAhPSAwKSAmJiAoKHBwX21vZFtpbmRleC1wcF93XSYweDAyKSAhPSAwKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgICAvKiBIYXJkIGZpbHRlciAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IEhvcnpIZmxhZyAoYml0IDQpIGluIHRoZSBwcF9tb2QgbG9jYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcF9tb2RbaW5kZXgtcHBfd10gfD0gMHgxMDsgLyogIDQvMjYvMDAgcmV1c2UgcHBfbW9kIGZvciBIb3J6SGZsYWcqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGFjcm9zcyB0aGUgOCBwaXhlbHMgb2YgdGhlIGJsb2NrICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbmRleCA9IEJMS1NJWkU7IGluZGV4ID4gMDsgaW5kZXgtLSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY3VycmVudCBwaXhlbCBhbmQgdGhlIHBpeGVsIGFib3ZlIGl0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEzXzAgPSAqcHRyIC0gKihwdHIgLSB3MSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgdGhlIG1hZ25pdHVkZSBvZiB0aGUgZGlmZmVyZW5jZSBpcyBncmVhdGVyIHRoYW4gdGhlIEtUaEggdGhyZXNob2xkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFuZCB3aXRoaW4gdGhlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIsIGFwcGx5IGhhcmQgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYTNfMCA+IEtUaEggfHwgYTNfMCA8IC1LVGhIKSAmJiBhM18wPFFQICYmIGEzXzA+IC1RUCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2MgPSBwdHIgLSB3MzsgICAvKiBQb2ludHMgdG8gcGl4ZWwgdGhyZWUgcm93cyBhYm92ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX24gPSBwdHIgKyB3MTsgICAvKiBQb2ludHMgdG8gcGl4ZWwgb25lIHJvdyBiZWxvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdlswXSA9IChpbnQpKCoocHRyX2MgLSB3MykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdlsxXSA9IChpbnQpKCoocHRyX2MgLSB3MikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdlsyXSA9IChpbnQpKCoocHRyX2MgLSB3MSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdlszXSA9IChpbnQpKCpwdHJfYyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2WzRdID0gKGludCkoKihwdHJfYyArIHcxKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9IHZbMF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdlsxXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2WzJdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICpwdHJfYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2WzRdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgqKHB0cl9jICsgdzIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKihwdHJfYyArIHczKSk7ICAvKiBDdXJyZW50IHBpeGVsICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gKHN1bSArICpwdHJfYyArIDQpID4+IDM7ICAgLyogQXZlcmFnZSBwaXhlbCB2YWx1ZXMgd2l0aCByb3VuZGluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHJfYykgPSAodWludDgpIGRlbHRhOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb3ZlIHBvaW50ZXIgZG93biBvbmUgcm93IG9mIHBpeGVscyAocG9pbnRzIHRvIHBpeGVsIHR3byByb3dzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhYm92ZSBjdXJyZW50IHBpeGVsKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2MgKz0gdzE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCA1OyBjb3VudGVyKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3VidHJhY3Qgb2ZmIGhpZ2hlc3QgcGl4ZWwgYW5kIGFkZCBpbiBwaXhlbCBiZWxvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9IHN1bSAtIHZbY291bnRlcl0gKyAqcHRyX247Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXZlcmFnZSB0aGUgcGl4ZWwgdmFsdWVzIHdpdGggcm91bmRpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IChzdW0gKyAqcHRyX2MgKyA0KSA+PiAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdHJfYyA9ICh1aW50OCkoZGVsdGEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jcmVtZW50IHBvaW50ZXJzIHRvIG5leHQgcGl4ZWwgcm93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2MgKz0gdzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX24gKz0gdzE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5jcmVtZW50IHBvaW50ZXIgdG8gbmV4dCBwaXhlbCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK3B0cjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8qIGluZGV4Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgLyogc29mdCBmaWx0ZXIqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgSG9yekhmbGFnIChiaXQgNCkgaW4gdGhlIHBwX21vZCBsb2NhdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwX21vZFtpbmRleC1wcF93XSAmPSAweGVmOyAvKiByZXNldCAxMTEwLDExMTEgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW5kZXggPSBCTEtTSVpFOyBpbmRleCA+IDA7IGluZGV4LS0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgcGl4ZWwgYW5kIHRoZSBwaXhlbCBhYm92ZSBpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhM18wID0gKihwdHIpIC0gKihwdHIgLSB3MSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaWYgdGhlIG1hZ25pdHVkZSBvZiB0aGUgZGlmZmVyZW5jZSBpcyBncmVhdGVyIHRoYW4gdGhlIEtUaCB0aHJlc2hvbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGFwcGx5IHNvZnQgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYTNfMCA+IEtUaCB8fCBhM18wIDwgLUtUaCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3VtIG9mIHdlaWdodGVkIGRpZmZlcmVuY2VzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhM18wICs9ICgoKihwdHIgLSB3MikgLSAqKHB0ciArIHcxKSkgPDwgMSkgKyAoYTNfMCA8PCAyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgc3VtIGlzIGxlc3MgdGhhbiB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFBWX0FCUyhhM18wKSA8IChRUCA8PCAzKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhM18xID0gKihwdHIgLSB3MikgLSAqKHB0ciAtIHczKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhM18xICs9ICgoKihwdHIgLSB3NCkgLSAqKHB0ciAtIHcxKSkgPDwgMSkgKyAoYTNfMSA8PCAyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEzXzIgID0gKihwdHIgKyB3MikgLSAqKHB0ciArIHcxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhM18yICs9ICgoKihwdHIpIC0gKihwdHIgKyB3MykpIDw8IDEpICsgKGEzXzIgPDwgMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBM18wID0gUFZfQUJTKGEzXzApIC0gUFZfTUlOKFBWX0FCUyhhM18xKSwgUFZfQUJTKGEzXzIpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBM18wID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEzXzAgKz0gQTNfMCA8PCAyOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBM18wID0gKEEzXzAgKyAzMikgPj4gNjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEzXzAgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBM18wID0gLUEzXzA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9ICgqKHB0ciAtIHcxKSAtICoocHRyKSkgPj4gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhID49IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YSA+PSBBM18wKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gUFZfTUFYKEEzXzAsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEEzXzAgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IFBWX01BWChBM18wLCBkZWx0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHB0ciAtIHcxKSA9ICh1aW50OCkoKihwdHIgLSB3MSkgLSBkZWx0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHRyKSA9ICh1aW50OCkoKihwdHIpICsgZGVsdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLyp0aHJlc2hvbGQqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluY3JlbWVudCBwb2ludGVyIHRvIG5leHQgcGl4ZWwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytwdHI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvKmluZGV4Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gLyogU29mdCBmaWx0ZXIqLwotICAgICAgICAgICAgICAgICAgICB9LyogYm91bmRhcnkgY2hlY2tpbmcqLwotICAgICAgICAgICAgICAgIH0vKmJjKi8KLSAgICAgICAgICAgIH0vKmJyKi8KLSAgICAgICAgICAgIGJyd2lkdGggLT0gKHBwX3cgPDwgMSk7Ci0KLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKiBWZXJ0LiBGaWx0ZXJpbmcgKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogUHJvY2VzcyBmb3VyIGJsb2NrcyBmb3IgdGhlIGZpbHRlcmluZyAgICAgICAgKi8KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qIExvb3Agb3ZlciB0d28gcm93cyBvZiBibG9ja3MgKi8KLSAgICAgICAgICAgIGZvciAoYnIgPSBtYnI7IGJyIDwgbWJyICsgMjsgYnIrKykgICAgICAvKiBiciBpcyB0aGUgcm93IGNvdW50ZXIgaW4gYmxvY2tzICovCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChiYyA9IG1iYyArIDE7IGJjIDwgbWJjICsgMzsgYmMrKykgIC8qIGJjIGlzIHRoZSBjb2x1bW4gY291bnRlciBpbiBibG9ja3MgKi8KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qKioqKiogY2hlY2sgYm91bmRhcnkgZm9yIGRlYmxvY2tpbmcgKioqKioqKioqKioqLwotICAgICAgICAgICAgICAgICAgICAvKiBFeGVjdXRlIGlmIHRoZSByb3cgYW5kIGNvbHVtbiBjb3VudGVycyBhcmUgd2l0aGluIHRoZSBhcmVhICovCi0gICAgICAgICAgICAgICAgICAgIGlmIChiciA8IHBwX2ggJiYgYmMgPCBwcF93KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIHB0ciB0byB0aGUgZmlyc3QgcGl4ZWwgb2YgdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBzZWNvbmQgcm93Ci0gICAgICAgICAgICAgICAgICAgICAgICAqIGJyd2lkdGggKiA2NCBpcyB0aGUgcGl4ZWwgcm93IG9mZnNldAotICAgICAgICAgICAgICAgICAgICAgICAgKiBiYyAqIDggaXMgdGhlIHBpeGVsIGNvbHVtbiBvZmZzZXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IHJlYyArIChicndpZHRoIDw8IDYpICsgKGJjIDw8IDMpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIGluZGV4IHRvIHRoZSBjdXJyZW50IGJsb2NrIG9mIHRoZSBzZWNvbmQgcm93IGNvdW50aW5nIGluIGJsb2NrcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBicndpZHRoICsgYmM7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHRoZSBkYXRhIGlzIGNocm9taW5hbmNlIGluZm8sIGdldCB0aGUgY29ycmVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICogcXVhbnRpemF0aW9uIHBhcmFtZW50ZXIuIE9uZSBwYXJhbWV0ZXIgcGVyIGJsb2NrLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNocikKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBRUCA9IFFQX3N0b3JlW2luZGV4XTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgLyogRXhlY3V0ZSBoYXJkIHZlcnRpY2FsIGZpbHRlciBpZiBzZW1hcGhvcmUgZm9yIHZlcnRpY2FsIGRlYmxvY2tpbmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpcyBzZXQgZm9yIHRoZSBjdXJyZW50IGJsb2NrIGFuZCBibG9jayBpbW1lZGlhdGVseSBsZWZ0IG9mIGl0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKChwcF9tb2RbaW5kZXgtMV0mMHgwMSkgIT0gMCkgJiYgKChwcF9tb2RbaW5kZXhdJjB4MDEpICE9IDApKQotICAgICAgICAgICAgICAgICAgICAgICAgeyAgIC8qIEhhcmQgZmlsdGVyICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgVmVydEhmbGFnIChiaXQgNSkgaW4gdGhlIHBwX21vZCBsb2NhdGlvbiBvZiBwcmV2aW91cyBibG9jayovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBfbW9kW2luZGV4LTFdIHw9IDB4MjA7IC8qICA0LzI2LzAwIHJldXNlIHBwX21vZCBmb3IgVmVydEhmbGFnKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBhY3Jvc3MgdGhlIDggcGl4ZWxzIG9mIHRoZSBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW5kZXggPSBCTEtTSVpFOyBpbmRleCA+IDA7IGluZGV4LS0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgcGl4ZWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgdGhlIHBpeGVsIHRvIGxlZnQgb2YgaXQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTNfMCA9ICpwdHIgLSAqKHB0ciAtIDEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHRoZSBtYWduaXR1ZGUgb2YgdGhlIGRpZmZlcmVuY2UgaXMgZ3JlYXRlciB0aGFuIHRoZSBLVGhIIHRocmVzaG9sZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBhbmQgd2l0aGluIHRoZSBxdWFudGl6YXRpb24gcGFyYW1ldGVyLCBhcHBseSBoYXJkIGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGEzXzAgPiBLVGhIIHx8IGEzXzAgPCAtS1RoSCkgJiYgYTNfMDxRUCAmJiBhM18wPiAtUVApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9jID0gcHRyIC0gMzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9uID0gcHRyICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZbMF0gPSAoaW50KSgqKHB0cl9jIC0gMykpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdlsxXSA9IChpbnQpKCoocHRyX2MgLSAyKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2WzJdID0gKGludCkoKihwdHJfYyAtIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZbM10gPSAoaW50KSgqcHRyX2MpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdls0XSA9IChpbnQpKCoocHRyX2MgKyAxKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9IHZbMF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdlsxXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2WzJdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICpwdHJfYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB2WzRdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgqKHB0cl9jICsgMikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgqKHB0cl9jICsgMykpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IChzdW0gKyAqcHRyX2MgKyA0KSA+PiAzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHJfYykgPSAodWludDgpIGRlbHRhOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb3ZlIHBvaW50ZXIgZG93biBvbmUgcGl4ZWwgdG8gdGhlIHJpZ2h0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfYyArPSAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IDU7IGNvdW50ZXIrKykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdWJ0cmFjdCBvZmYgaGlnaGVzdCBwaXhlbCBhbmQgYWRkIGluIHBpeGVsIGJlbG93ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VtID0gc3VtIC0gdltjb3VudGVyXSArICpwdHJfbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdmVyYWdlIHRoZSBwaXhlbCB2YWx1ZXMgd2l0aCByb3VuZGluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gKHN1bSArICpwdHJfYyArIDQpID4+IDM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB0cl9jID0gKHVpbnQ4KShkZWx0YSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgcG9pbnRlcnMgdG8gbmV4dCBwaXhlbCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9jICs9IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX24gKz0gMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgcG9pbnRlcnMgdG8gbmV4dCBwaXhlbCByb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyICs9IHcxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLyogaW5kZXgqLwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgeyAvKiBzb2Z0IGZpbHRlciovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciBWZXJ0SGZsYWcgKGJpdCA1KSBpbiB0aGUgcHBfbW9kIGxvY2F0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHBfbW9kW2luZGV4LTFdICY9IDB4ZGY7IC8qIHJlc2V0IDExMDEsMTExMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW5kZXggPSBCTEtTSVpFOyBpbmRleCA+IDA7IGluZGV4LS0pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQgcGl4ZWwgYW5kIHRoZSBwaXhlbCBhYm92ZSBpdCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhM18wID0gKihwdHIpIC0gKihwdHIgLSAxKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiB0aGUgbWFnbml0dWRlIG9mIHRoZSBkaWZmZXJlbmNlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgS1RoIHRocmVzaG9sZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYXBwbHkgc29mdCBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChhM18wID4gS1RoIHx8IGEzXzAgPCAtS1RoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdW0gb2Ygd2VpZ2h0ZWQgZGlmZmVyZW5jZXMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEzXzAgKz0gKCgqKHB0ciAtIDIpIC0gKihwdHIgKyAxKSkgPDwgMSkgKyAoYTNfMCA8PCAyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgc3VtIGlzIGxlc3MgdGhhbiB0aGUgcXVhbnRpemF0aW9uIHBhcmFtZXRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFBWX0FCUyhhM18wKSA8IChRUCA8PCAzKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhM18xID0gKihwdHIgLSAyKSAtICoocHRyIC0gMyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTNfMSArPSAoKCoocHRyIC0gNCkgLSAqKHB0ciAtIDEpKSA8PCAxKSArIChhM18xIDw8IDIpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTNfMiAgPSAqKHB0ciArIDIpIC0gKihwdHIgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhM18yICs9ICgoKihwdHIpIC0gKihwdHIgKyAzKSkgPDwgMSkgKyAoYTNfMiA8PCAyKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEzXzAgPSBQVl9BQlMoYTNfMCkgLSBQVl9NSU4oUFZfQUJTKGEzXzEpLCBQVl9BQlMoYTNfMikpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEEzXzAgPiAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQTNfMCArPSBBM18wIDw8IDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEzXzAgPSAoQTNfMCArIDMyKSA+PiA2OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYTNfMCA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEzXzAgPSAtQTNfMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gKCoocHRyIC0gMSkgLSAqKHB0cikpID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YSA+PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPj0gQTNfMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IFBWX01BWChBM18wLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBM18wID4gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IDA7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBQVl9NQVgoQTNfMCwgZGVsdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIgLSAxKSA9ICh1aW50OCkoKihwdHIgLSAxKSAtIGRlbHRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKihwdHIpID0gKHVpbnQ4KSgqKHB0cikgKyBkZWx0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvKnRocmVzaG9sZCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyICs9IHcxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLyppbmRleCovCi0gICAgICAgICAgICAgICAgICAgICAgICB9IC8qIFNvZnQgZmlsdGVyKi8KLSAgICAgICAgICAgICAgICAgICAgfSAvKiBib3VuZGFyeSovCi0gICAgICAgICAgICAgICAgfSAvKmJjKi8KLSAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgcG9pbnRlciB0byBuZXh0IHJvdyBvZiBwaXhlbHMgKi8KLSAgICAgICAgICAgICAgICBicndpZHRoICs9IHBwX3c7Ci0gICAgICAgICAgICB9LypiciovCi0gICAgICAgICAgICBicndpZHRoIC09IChwcF93IDw8IDEpOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqIERlcmluZ2luZyAqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvKiBQcm9jZXNzIGZvdXIgYmxvY2tzIGZvciB0aGUgZmlsdGVyaW5nICAgICAgICAqLwotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogTG9vcCBvdmVyIHR3byByb3dzIG9mIGJsb2NrcyAqLwotICAgICAgICAgICAgZm9yIChiciA9IG1icjsgYnIgPCBtYnIgKyAyOyBicisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIExvb3Agb3ZlciB0d28gY29sdW1ucyBvZiBibG9ja3MgaW4gdGhlIHJvdyAqLwotICAgICAgICAgICAgICAgIGZvciAoYmMgPSBtYmM7IGJjIDwgbWJjICsgMjsgYmMrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEV4ZWN1dGUgaWYgdGhlIHJvdyBhbmQgY29sdW1uIGNvdW50ZXJzIGFyZSB3aXRoaW4gdGhlIGFyZWEgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKGJyIDwgcHBfaCAmJiBiYyA8IHBwX3cpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgaW5kZXggdG8gdGhlIGN1cnJlbnQgYmxvY2sgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gYnJ3aWR0aCArIGJjOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBFeGVjdXRlIGRlcmluZ2luZyBpZiBzZW1hcGhvcmUgZm9yIGRlcmluZ2luZyAoYml0LTMgb2YgcHBfbW9kKQotICAgICAgICAgICAgICAgICAgICAgICAgICogaXMgc2V0IGZvciB0aGUgY3VycmVudCBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwcF9tb2RbaW5kZXhdJjB4MDQpICE9IDApCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRG9uJ3QgcHJvY2VzcyBkZXJpbmdpbmcgaWYgb24gYW4gZWRnZSBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiciA+IDAgJiYgYmMgPiAwICYmIGJyIDwgcHBfaCAtIDEgJiYgYmMgPCBwcF93IC0gMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNudGhmbGFnID0gd2VpZ2h0ZWQgYXZlcmFnZSBvZiBIb3J6SGZsYWcgb2YgY3VycmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb25lIGFib3ZlLCBwcmV2aW91cyBibG9ja3MqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbnRoZmxhZyA9ICgocHBfbW9kW2luZGV4XSAmIDB4MTApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBwX21vZFtpbmRleC1wcF93XSAmIDB4MTApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwcF9tb2RbaW5kZXgtMV0gPj4gMSkgJiAweDEwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocHBfbW9kW2luZGV4XSA+PiAxKSAmIDB4MTApKSA+PiA0OyAvKiA0LzI2LzAwKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEbyB0aGUgZGVyaW5naW5nIGlmIGRlY2lzaW9uIGZsYWdzIGluZGljYXRlIGl0J3MgbmVjZXNzYXJ5ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbnRoZmxhZyA8IDMpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlmIHRoZSBkYXRhIGlzIGNocm9taW5hbmNlIGluZm8sIGdldCB0aGUgY29ycmVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcXVhbnRpemF0aW9uIHBhcmFtZW50ZXIuIE9uZSBwYXJhbWV0ZXIgcGVyIGJsb2NrLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNocikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRUCA9IFFQX3N0b3JlW2luZGV4XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IGFtb3VudCB0byBjaGFuZ2UgbHVtaW5hbmNlIGlmIGl0IG5lZWRzIHRvIGJlIGNoYW5nZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJhc2VkIG9uIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9kaWZmID0gKFFQID4+IDIpICsgNDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHBvaW50ZXIgdG8gZmlyc3QgcGl4ZWwgb2YgY3VycmVudCBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gcmVjICsgKGJyd2lkdGggPDwgNikgKyAoYmMgPDwgMyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbmQgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZSBvZiBwaXhlbCBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmluZE1heE1pbihwdHIsICZtaW5fYmxrLCAmbWF4X2JsaywgaW5jcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRocmVzaG9sZCBkZXRlcm1pbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlcyA9IChtYXhfYmxrICsgbWluX2JsayArIDEpID4+IDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIHBpeGVsIHJhbmdlIGlzIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiBERVJJTkdfVEhSLCBzbW9vdGggdGhlIHJlZ2lvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtYXhfYmxrIC0gbWluX2JsaykgPj0gREVSSU5HX1RIUikgLypzbW9vdGggOHg4IHJlZ2lvbiovCi0jaWZuZGVmIE5vTU1YCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc21vb3RoIGFsbCBwaXhlbHMgaW4gdGhlIGJsb2NrKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXJpbmdBZGFwdGl2ZVNtb290aE1NWChwdHIsIHdpZHRoLCB0aHJlcywgbWF4X2RpZmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXR1cCB0aGUgc3RhcnRpbmcgcG9pbnQgb2YgdGhlIHJlZ2lvbiB0byBzbW9vdGggKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2MCA9IChiciA8PCAzKSAtIDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDAgPSAoYmMgPDwgMykgLSAxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypzbW9vdGggOHg4IHJlZ2lvbiovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRpdmVTbW9vdGhfTm9NTVgocmVjLCB2MCwgaDAsIHYwICsgMSwgaDAgKyAxLCB0aHJlcywgd2lkdGgsIG1heF9kaWZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LypjbnRoZmxhZyovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvKmRlcmluZyBicj09MSBvciBiYz09MSAoYm91bmRhcnkgYmxvY2spKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlICAgIC8qIFByb2Nlc3MgdGhlIGJvdW5kYXJ5IGJsb2NrcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVjaWRlIHRvIHBlcmZvcm0gZGVibG9ja2luZyBiYXNlZCBvbiB0aGUgc2VtYXBob3JlIGZsYWdzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogb2YgdGhlIG5laWdoYm9yaW5nIGJsb2NrcyBpbiBlYWNoIGNhc2UuIEEgY2VydGFpbiBudW1iZXIgb2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaGFyZCBmaWx0ZXJpbmcgZmxhZ3MgaGF2ZSB0byBiZSBzZXQgaW4gb3JkZXIgdG8gc2lnbmFsIG5lZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZm9yIHNtb290aGluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnIgPiAwICYmIGJyIDwgcHBfaCAtIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiYyA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY250aGZsYWcgPSAoKHBwX21vZFtpbmRleC1wcF93XSAmIDB4MTApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHBfbW9kW2luZGV4XSAmIDB4MTApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBwX21vZFtpbmRleC0xXSA+PiAxKSAmIDB4MTApKSA+PiA0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNudGhmbGFnID0gKChwcF9tb2RbaW5kZXhdICYgMHgxMCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcF9tb2RbaW5kZXgtcHBfd10gJiAweDEwKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwcF9tb2RbaW5kZXhdID4+IDEpICYgMHgxMCkpID4+IDQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoYmMgPiAwICYmIGJjIDwgcHBfdyAtIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiciA+IDApCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY250aGZsYWcgPSAoKHBwX21vZFtpbmRleC1wcF93XSAmIDB4MTApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBwX21vZFtpbmRleC0xXSA+PiAxKSAmIDB4MTApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBwX21vZFtpbmRleF0gPj4gMSkgJiAweDEwKSkgPj4gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbnRoZmxhZyA9ICgocHBfbW9kW2luZGV4XSAmIDB4MTApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBwX21vZFtpbmRleC0xXSA+PiAxKSAmIDB4MTApICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHBwX21vZFtpbmRleF0gPj4gMSkgJiAweDEwKSkgPj4gNDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIC8qIGF0IHRoZSBjb3JuZXIgZG8gZGVmYXVsdCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNudGhmbGFnID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERvIHRoZSBkZXJpbmdpbmcgaWYgZGVjaXNpb24gZmxhZ3MgaW5kaWNhdGUgaXQncyBuZWNlc3NhcnkgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNudGhmbGFnIDwgMikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiB0aGUgZGF0YSBpcyBjaHJvbWluYW5jZSBpbmZvLCBnZXQgdGhlIGNvcnJlY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcXVhbnRpemF0aW9uIHBhcmFtZW50ZXIuIE9uZSBwYXJhbWV0ZXIgcGVyIGJsb2NrLiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNocikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRUCA9IFFQX3N0b3JlW2luZGV4XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IGFtb3VudCB0byBjaGFuZ2UgbHVtaW5hbmNlIGlmIGl0IG5lZWRzIHRvIGJlIGNoYW5nZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGJhc2VkIG9uIHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9kaWZmID0gKFFQID4+IDIpICsgNDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHBvaW50ZXIgdG8gZmlyc3QgcGl4ZWwgb2YgY3VycmVudCBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gcmVjICsgKGJyd2lkdGggPDwgNikgKyAoYmMgPDwgMyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbmQgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZSBvZiBwaXhlbCBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmluZE1heE1pbihwdHIsICZtaW5fYmxrLCAmbWF4X2JsaywgaW5jcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRocmVzaG9sZCBkZXRlcm1pbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlcyA9IChtYXhfYmxrICsgbWluX2JsayArIDEpID4+IDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldHVwIHRoZSBzdGFydGluZyBwb2ludCBvZiB0aGUgcmVnaW9uIHRvIHNtb290aAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogVGhpcyBpcyBnb2luZyB0byBiZSBhIDR4NCByZWdpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYwID0gKGJyIDw8IDMpICsgMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGgwID0gKGJjIDw8IDMpICsgMTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSWYgcGl4ZWwgcmFuZ2UgaXMgZ3JlYXRlciBvciBlcXVhbCB0aGFuIERFUklOR19USFIsIHNtb290aCB0aGUgcmVnaW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1heF9ibGsgLSBtaW5fYmxrKSA+PSBERVJJTkdfVEhSKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNtb290aCA0eDQgcmVnaW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRhcHRpdmVTbW9vdGhfTm9NTVgocmVjLCB2MCwgaDAsIHYwIC0gMywgaDAgLSAzLCB0aHJlcywgd2lkdGgsIG1heF9kaWZmKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfS8qY250aGZsYWcqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLyogYnI9PTAsIGJjPT0wKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gIC8qIGRlcmluZyovCi0gICAgICAgICAgICAgICAgICAgIH0gLypib3VuZGFyeSBjb25kaXRpb24qLwotICAgICAgICAgICAgICAgIH0vKmJjKi8KLSAgICAgICAgICAgICAgICBicndpZHRoICs9IHBwX3c7Ci0gICAgICAgICAgICB9LypiciovCi0gICAgICAgICAgICBicndpZHRoIC09IChwcF93IDw8IDEpOwotICAgICAgICB9LyptYmMqLwotICAgICAgICBicndpZHRoICs9IChwcF93IDw8IDEpOwotICAgIH0vKm1iciovCi0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IFJldHVybiBub3RoaW5nIG9yIGRhdGEgb3IgZGF0YSBwb2ludGVyCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgcmV0dXJuIDsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvY29tYmluZWRfZGVjb2RlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2NvbWJpbmVkX2RlY29kZS5jcHAKaW5kZXggNjQ5OTIzMy4uNzJjYmU4MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvY29tYmluZWRfZGVjb2RlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9jb21iaW5lZF9kZWNvZGUuY3BwCkBAIC01NDQsMzAgKzU0NCwxMiBAQAogICAgIGludDE2IERDX2NvZWZmOwogICAgIFBWX1NUQVRVUyBzdGF0dXM7CiAKLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgIC8qIHBvc3QtcHJvY2Vzc2luZyAqLwotICAgIHVpbnQ4ICpwcF9tb2RbNl07Ci0gICAgaW50IFRvdGFsTUIgPSB2aWRlby0+blRvdGFsTUI7Ci0gICAgaW50IE1CX2luX3dpZHRoID0gdmlkZW8tPm5NQlBlclJvdzsKLSNlbmRpZgogICAgIGludCB5X3BvcyA9IHZpZGVvLT5tYm51bV9yb3c7CiAgICAgaW50IHhfcG9zID0gdmlkZW8tPm1ibnVtX2NvbDsKICAgICBpbnQzMiBvZmZzZXQgPSAoaW50MzIpKHlfcG9zIDw8IDQpICogd2lkdGggKyAoeF9wb3MgPDwgNCk7CiAKICAgICAvKiBEZWNvZGUgZWFjaCA4LWJ5LTggYmxvY2tzLiBjb21wIDAgfiAzIGFyZSBsdW1pbmFuY2UgYmxvY2tzLCA0IH4gNSAqLwogICAgIC8qICBhcmUgY2hyb21pbmFuY2UgYmxvY2tzLiAgIDA0LzAzLzIwMDAuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgewotICAgICAgICAvKiogcG9zdC1wcm9jZXNzaW5nICoqKi8KLSAgICAgICAgcHBfbW9kWzBdID0gdmlkZW8tPnBzdHByY1R5cEN1ciArICh5X3BvcyA8PCAxKSAqIChNQl9pbl93aWR0aCA8PCAxKSArICh4X3BvcyA8PCAxKTsKLSAgICAgICAgcHBfbW9kWzFdID0gcHBfbW9kWzBdICsgMTsKLSAgICAgICAgcHBfbW9kWzJdID0gcHBfbW9kWzBdICsgKE1CX2luX3dpZHRoIDw8IDEpOwotICAgICAgICBwcF9tb2RbM10gPSBwcF9tb2RbMl0gKyAxOwotICAgICAgICBwcF9tb2RbNF0gPSB2aWRlby0+cHN0cHJjVHlwQ3VyICsgKFRvdGFsTUIgPDwgMikgKyBtYm51bTsKLSAgICAgICAgcHBfbW9kWzVdID0gcHBfbW9kWzRdICsgVG90YWxNQjsKLSAgICB9Ci0jZW5kaWYKIAogICAgIC8qICBvc2NsX21lbXNldChtYmxvY2stPmJsb2NrLCAwLCBzaXplb2YodHlwZU1CU3RvcmUpKTsgICAgQXVnIDksMjAwNSAqLwogCkBAIC02NDUsMTAgKzYyNyw2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBub19jb2VmZltjb21wXSA9IG5jb2VmZnNbY29tcF07CiAKLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgICAgICAgICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgICAgICAgICAgICAgKnBwX21vZFtjb21wXSA9ICh1aW50OCkgUG9zdFByb2NTZW1hcGhvcmUoZGF0YUJsb2NrKTsKLSNlbmRpZgogICAgICAgICB9CiAgICAgICAgIE1CbG9ja0lEQ1QodmlkZW8pOwogICAgIH0KQEAgLTY3NywyMCArNjU1LDYgQEAKICAgICAgICAgICAgICAgICBCbG9ja0lEQ1QoY19jb21wICsgKGNvbXAmMikqKHdpZHRoIDw8IDIpICsgOCooY29tcCYxKSwgbWJsb2NrLT5wcmVkX2Jsb2NrICsgKGNvbXAmMikqNjQgKyA4Kihjb21wJjEpLCBtYmxvY2stPmJsb2NrW2NvbXBdLCB3aWR0aCwgbmNvZWZmc1tjb21wXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbWJsb2NrLT5iaXRtYXBjb2xbY29tcF0sIG1ibG9jay0+Yml0bWFwcm93W2NvbXBdKTsKIAotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgICAgICAgICAgLyogZm9yIGludGVyIGp1c3QgdGVzdCBmb3IgcmluZ2luZyAqLwotICAgICAgICAgICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgICAgICAgICAgICAgICAgICAqcHBfbW9kW2NvbXBdID0gKHVpbnQ4KSgobmNvZWZmc1tjb21wXSA+IDMpID8gNCA6IDApOwotI2VuZGlmCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogbm8gSURDVCBmb3IgYWxsIHplcm9zIGJsb2NrcyAgMDMvMjgvMjAwMiAqLwotICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgICBCbG9ja0lEQ1QoKTsgICAgICAgICAgICAgICAgKi8KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgICAgICAgICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgICAgICAgICAgICAgICAgICAqcHBfbW9kW2NvbXBdID0gMDsKLSNlbmRpZgogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTcwNywyMCArNjcxLDYgQEAKICAgICAgICAgICAgIEJsb2NrSURDVCh2aWRlby0+Y3VyclZvcC0+dUNoYW4gKyAob2Zmc2V0ID4+IDIpICsgKHhfcG9zIDw8IDIpLCBtYmxvY2stPnByZWRfYmxvY2sgKyAyNTYsIG1ibG9jay0+YmxvY2tbNF0sIHdpZHRoID4+IDEsIG5jb2VmZnNbNF0sCiAgICAgICAgICAgICAgICAgICAgICAgbWJsb2NrLT5iaXRtYXBjb2xbNF0sIG1ibG9jay0+Yml0bWFwcm93WzRdKTsKIAotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgICAgICAvKiBmb3IgaW50ZXIganVzdCB0ZXN0IGZvciByaW5naW5nICovCi0gICAgICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICAgICAgICAgICAgICAqcHBfbW9kWzRdID0gKHVpbnQ4KSgobmNvZWZmc1s0XSA+IDMpID8gNCA6IDApOwotI2VuZGlmCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBubyBJRENUIGZvciBhbGwgemVyb3MgYmxvY2tzICAwMy8yOC8yMDAyICovCi0gICAgICAgICAgICAvKiAgICAgICAgICAgICAgQmxvY2tJRENUKCk7ICAgICAgICAgICAgICAgICovCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICAgICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgICAgICAgICAgICAgICpwcF9tb2RbNF0gPSAwOwotI2VuZGlmCiAgICAgICAgIH0KICAgICAgICAgKCpEQylbNV0gPSBtaWRfZ3JheTsKICAgICAgICAgaWYgKENCUCAmIDEpCkBAIC03MzEsMjAgKzY4MSw2IEBACiAgICAgICAgICAgICBCbG9ja0lEQ1QodmlkZW8tPmN1cnJWb3AtPnZDaGFuICsgKG9mZnNldCA+PiAyKSArICh4X3BvcyA8PCAyKSwgbWJsb2NrLT5wcmVkX2Jsb2NrICsgMjY0LCBtYmxvY2stPmJsb2NrWzVdLCB3aWR0aCA+PiAxLCBuY29lZmZzWzVdLAogICAgICAgICAgICAgICAgICAgICAgIG1ibG9jay0+Yml0bWFwY29sWzVdLCBtYmxvY2stPmJpdG1hcHJvd1s1XSk7CiAKLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgICAgICAgICAgLyogZm9yIGludGVyIGp1c3QgdGVzdCBmb3IgcmluZ2luZyAqLwotICAgICAgICAgICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgICAgICAgICAgICAgKnBwX21vZFs1XSA9ICh1aW50OCkoKG5jb2VmZnNbNV0gPiAzKSA/IDQgOiAwKTsKLSNlbmRpZgotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogbm8gSURDVCBmb3IgYWxsIHplcm9zIGJsb2NrcyAgMDMvMjgvMjAwMiAqLwotICAgICAgICAgICAgLyogICAgICAgICAgICAgIEJsb2NrSURDVCgpOyAgICAgICAgICAgICAgICAqLwotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICAgICAgICAgICAgICAqcHBfbW9kWzVdID0gMDsKLSNlbmRpZgogICAgICAgICB9CiAgICAgICAgIHZpZGVvLT5RUE1CW21ibnVtXSA9IFFQOyAgLyogcmVzdG9yZSB0aGUgUVAgdmFsdWVzICBBTk5FWF9UKi8KICNlbHNlCkBAIC03NTksMjAgKzY5NSw2IEBACiAgICAgICAgICAgICAgICAgQmxvY2tJRENUKGNfY29tcCArIChjb21wJjIpKih3aWR0aCA8PCAyKSArIDgqKGNvbXAmMSksIG1ibG9jay0+cHJlZF9ibG9jayArIChjb21wJjIpKjY0ICsgOCooY29tcCYxKSwgbWJsb2NrLT5ibG9ja1tjb21wXSwgd2lkdGgsIG5jb2VmZnNbY29tcF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ibG9jay0+Yml0bWFwY29sW2NvbXBdLCBtYmxvY2stPmJpdG1hcHJvd1tjb21wXSk7CiAKLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgICAgICAgICAgICAgIC8qIGZvciBpbnRlciBqdXN0IHRlc3QgZm9yIHJpbmdpbmcgKi8KLSAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICAgICAgICAgICAgICAgICAgKnBwX21vZFtjb21wXSA9ICh1aW50OCkoKG5jb2VmZnNbY29tcF0gPiAzKSA/IDQgOiAwKTsKLSNlbmRpZgotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIG5vIElEQ1QgZm9yIGFsbCB6ZXJvcyBibG9ja3MgIDAzLzI4LzIwMDIgKi8KLSAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICAgQmxvY2tJRENUKCk7ICAgICAgICAgICAgICAgICovCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICAgICAgICAgICAgICAgICAgKnBwX21vZFtjb21wXSA9IDA7Ci0jZW5kaWYKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC03ODUsMjAgKzcwNywxMSBAQAogICAgICAgICAgICAgQmxvY2tJRENUKHZpZGVvLT5jdXJyVm9wLT51Q2hhbiArIChvZmZzZXQgPj4gMikgKyAoeF9wb3MgPDwgMiksIG1ibG9jay0+cHJlZF9ibG9jayArIDI1NiwgbWJsb2NrLT5ibG9ja1s0XSwgd2lkdGggPj4gMSwgbmNvZWZmc1s0XSwKICAgICAgICAgICAgICAgICAgICAgICBtYmxvY2stPmJpdG1hcGNvbFs0XSwgbWJsb2NrLT5iaXRtYXByb3dbNF0pOwogCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICAgICAgICAgIC8qIGZvciBpbnRlciBqdXN0IHRlc3QgZm9yIHJpbmdpbmcgKi8KLSAgICAgICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgICAgICAgICAgICAgICpwcF9tb2RbNF0gPSAodWludDgpKChuY29lZmZzWzRdID4gMykgPyA0IDogMCk7Ci0jZW5kaWYKICAgICAgICAgfQogICAgICAgICBlbHNlCiAgICAgICAgIHsKICAgICAgICAgICAgIC8qIG5vIElEQ1QgZm9yIGFsbCB6ZXJvcyBibG9ja3MgIDAzLzI4LzIwMDIgKi8KICAgICAgICAgICAgIC8qICAgICAgICAgICAgICBCbG9ja0lEQ1QoKTsgICAgICAgICAgICAgICAgKi8KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgICAgICAgICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgICAgICAgICAgICAgKnBwX21vZFs0XSA9IDA7Ci0jZW5kaWYKICAgICAgICAgfQogICAgICAgICAoKkRDKVs1XSA9IG1pZF9ncmF5OwogICAgICAgICBpZiAoQ0JQICYgMSkKQEAgLTgwOSwyMCArNzIyLDExIEBACiAgICAgICAgICAgICBCbG9ja0lEQ1QodmlkZW8tPmN1cnJWb3AtPnZDaGFuICsgKG9mZnNldCA+PiAyKSArICh4X3BvcyA8PCAyKSwgbWJsb2NrLT5wcmVkX2Jsb2NrICsgMjY0LCBtYmxvY2stPmJsb2NrWzVdLCB3aWR0aCA+PiAxLCBuY29lZmZzWzVdLAogICAgICAgICAgICAgICAgICAgICAgIG1ibG9jay0+Yml0bWFwY29sWzVdLCBtYmxvY2stPmJpdG1hcHJvd1s1XSk7CiAKLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgICAgICAgICAgLyogZm9yIGludGVyIGp1c3QgdGVzdCBmb3IgcmluZ2luZyAqLwotICAgICAgICAgICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgICAgICAgICAgICAgKnBwX21vZFs1XSA9ICh1aW50OCkoKG5jb2VmZnNbNV0gPiAzKSA/IDQgOiAwKTsKLSNlbmRpZgogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewogICAgICAgICAgICAgLyogbm8gSURDVCBmb3IgYWxsIHplcm9zIGJsb2NrcyAgMDMvMjgvMjAwMiAqLwogICAgICAgICAgICAgLyogICAgICAgICAgICAgIEJsb2NrSURDVCgpOyAgICAgICAgICAgICAgICAqLwotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICAgICAgICAgICAgICAqcHBfbW9kWzVdID0gMDsKLSNlbmRpZgogI2VuZGlmICAvLyBQVl9BTk5FWF9JSktUX1NVUFBPUlQKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9kYXRhcGFydF9kZWNvZGUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZGF0YXBhcnRfZGVjb2RlLmNwcAppbmRleCAwMGRiMDRiLi42MDcxZjQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9kYXRhcGFydF9kZWNvZGUuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2RhdGFwYXJ0X2RlY29kZS5jcHAKQEAgLTYzNSwyOSArNjM1LDkgQEAKICAgICBpbnQgUVBfdG1wID0gUVA7CiAKICAgICBpbnQgeV9wb3MgPSB2aWRlby0+bWJudW1fcm93OwotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgdWludDggKnBwX21vZFs2XTsKLSAgICBpbnQgVG90YWxNQiA9IHZpZGVvLT5uVG90YWxNQjsKLSAgICBpbnQgTUJfaW5fd2lkdGggPSB2aWRlby0+bk1CUGVyUm93OwotI2VuZGlmCiAKIAogCi0gICAgLyoqKioqCi0gICAgKiAgICAgRGVjb2Rpbmcgb2YgdGhlIDYgYmxvY2tzIChkZXBlbmRpbmcgb24gdHJhbnNwYXJlbnQgcGF0dGVybikKLSAgICAqKioqKi8KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgIHsKLSAgICAgICAgLyoqIHBvc3QtcHJvY2Vzc2luZyAqKiovCi0gICAgICAgIHBwX21vZFswXSA9IHZpZGVvLT5wc3RwcmNUeXBDdXIgKyAoeV9wb3MgPDwgMSkgKiAoTUJfaW5fd2lkdGggPDwgMSkgKyAoeF9wb3MgPDwgMSk7Ci0gICAgICAgIHBwX21vZFsxXSA9IHBwX21vZFswXSArIDE7Ci0gICAgICAgIHBwX21vZFsyXSA9IHBwX21vZFswXSArIChNQl9pbl93aWR0aCA8PCAxKTsKLSAgICAgICAgcHBfbW9kWzNdID0gcHBfbW9kWzJdICsgMTsKLSAgICAgICAgcHBfbW9kWzRdID0gdmlkZW8tPnBzdHByY1R5cEN1ciArIChUb3RhbE1CIDw8IDIpICsgbWJudW07Ci0gICAgICAgIHBwX21vZFs1XSA9IHBwX21vZFs0XSArIFRvdGFsTUI7Ci0gICAgfQotI2VuZGlmCiAKICAgICAvKiAgb3NjbF9tZW1zZXQobWJsb2NrLT5ibG9jaywgMCwgc2l6ZW9mKHR5cGVNQlN0b3JlKSk7ICAgIEF1ZyA5LDIwMDUgKi8KIApAQCAtNjk4LDEwICs2NzgsNiBAQAogICAgICAgICAgICAgLyogIG1vZGlmaWVkIHRvIG5ldyBzZW1hcGhvcmUgZm9yIHBvc3QtcHJvYyAqLwogICAgICAgICAgICAgLy8gRnV0dXJlIHdvcms6OiBjYW4gYmUgY29tYmluZWQgaW4gdGhlIGRlcXVhbnQgZnVuY3Rpb24KICAgICAgICAgICAgIC8vIEB0b2RvIERlYmxvY2tpbmcgU2VtYXBob3JlIGZvciBJTlRSQSBibG9jawotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICAgICAgICAgICAgICAqcHBfbW9kW2NvbXBdID0gKHVpbnQ4KSBQb3N0UHJvY1NlbWFwaG9yZShkYXRhQmxvY2spOwotI2VuZGlmCiAgICAgICAgIH0KICAgICAgICAgTUJsb2NrSURDVCh2aWRlbyk7CiAgICAgfQpAQCAtNzM4LDEwICs3MTQsNiBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvKiAgQHRvZG8gRGVibG9ja2luZyBTZW1hcGhvcmUgZm9yIElOVFJBIGJsb2NrLCBmb3IgaW50ZXIganVzdCB0ZXN0IGZvciByaW5naW5nICAqLwotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlICE9IFBWX05PX1BPU1RfUFJPQykKLSAgICAgICAgICAgICAgICAqcHBfbW9kW2NvbXBdID0gKHVpbnQ4KSgobmNvZWZmc1tjb21wXSA+IDMpID8gNCA6IDApOwotI2VuZGlmCiAgICAgICAgIH0KIAogICAgICAgICAoKkRDKVs0XSA9IG1pZF9ncmF5OwpAQCAtNzYwLDEwICs3MzIsNiBAQAogICAgICAgICB7CiAgICAgICAgICAgICBuY29lZmZzWzRdID0gMDsKICAgICAgICAgfQotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgICAgICAgICAgKnBwX21vZFs0XSA9ICh1aW50OCkoKG5jb2VmZnNbNF0gPiAzKSA/IDQgOiAwKTsKLSNlbmRpZgogICAgICAgICAoKkRDKVs1XSA9IG1pZF9ncmF5OwogICAgICAgICBpZiAoQ0JQICYgMSkKICAgICAgICAgewpAQCAtNzgwLDEwICs3NDgsNiBAQAogICAgICAgICB7CiAgICAgICAgICAgICBuY29lZmZzWzVdID0gMDsKICAgICAgICAgfQotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgICAgICAgICAgKnBwX21vZFs1XSA9ICh1aW50OCkoKG5jb2VmZnNbNV0gPiAzKSA/IDQgOiAwKTsKLSNlbmRpZgogCiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZGVyaW5naW5nX2Nocm9tYS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9kZXJpbmdpbmdfY2hyb21hLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U3NzliMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9kZXJpbmdpbmdfY2hyb21hLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIxNSArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotI2luY2x1ZGUgICAgIm1wNGRlY19saWIuaCIKLSNpbmNsdWRlICAgICJwb3N0X3Byb2MuaCIKLQotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0KLXZvaWQgRGVyaW5naW5nX0Nocm9tYSgKLSAgICB1aW50OCAqUmVjX0MsCi0gICAgaW50IHdpZHRoLAotICAgIGludCBoZWlnaHQsCi0gICAgaW50MTYgKlFQX3N0b3JlLAotICAgIGludCwKLSAgICB1aW50OCAqcHBfbW9kCi0pCi17Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIGludCB0aHJlczsKLSAgICBpbnQgdl9ibGssIGhfYmxrOwotICAgIGludCBtYXhfZGlmZjsKLSAgICBpbnQgdl9wZWwsIGhfcGVsOwotICAgIGludCBtYXhfYmxrLCBtaW5fYmxrOwotICAgIGludCB2MCwgaDA7Ci0gICAgdWludDggKnB0cjsKLSAgICBpbnQgc3VtLCBzdW0xLCBpbmNyOwotICAgIGludDMyIGFkZHJfdjsKLSAgICBpbnQgc2lnbl92WzEwXSwgc3VtX3ZbMTBdOwotICAgIGludCAqcHRyMiwgKnB0cjM7Ci0gICAgdWludDggcGVsdSwgcGVsYywgcGVsbDsKLSAgICBpbmNyID0gd2lkdGggLSBCTEtTSVpFOwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBGdW5jdGlvbiBib2R5IGhlcmUKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICAvKiBjaHJvbWluYW5jZSAqLwotICAgIC8qIERvIHRoZSBmaXJzdCBsaW5lICg3IHBpeGVscyBhdCBhIHRpbWUgPT4gRG9uJ3QgdXNlIE1NWCkqLwotICAgIGZvciAoaF9ibGsgPSAwOyBoX2JsayA8IHdpZHRoOyBoX2JsayArPSBCTEtTSVpFKQotICAgIHsKLSAgICAgICAgbWF4X2RpZmYgPSAoUVBfc3RvcmVbaF9ibGs+PjNdID4+IDIpICsgNDsKLSAgICAgICAgcHRyID0gJlJlY19DW2hfYmxrXTsKLSAgICAgICAgbWF4X2JsayA9IG1pbl9ibGsgPSAqcHRyOwotICAgICAgICBGaW5kTWF4TWluKHB0ciwgJm1pbl9ibGssICZtYXhfYmxrLCB3aWR0aCk7Ci0gICAgICAgIGgwID0gKChoX2JsayAtIDEpID49IDEpID8gKGhfYmxrIC0gMSkgOiAxOwotCi0gICAgICAgIGlmIChtYXhfYmxrIC0gbWluX2JsayA+PSA0KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJlcyA9IChtYXhfYmxrICsgbWluX2JsayArIDEpID4+IDE7Ci0KLQotICAgICAgICAgICAgZm9yICh2X3BlbCA9IDE7IHZfcGVsIDwgQkxLU0laRSAtIDE7IHZfcGVsKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWRkcl92ID0gKGludDMyKXZfcGVsICogd2lkdGg7Ci0gICAgICAgICAgICAgICAgcHRyID0gJlJlY19DW2FkZHJfdiArIGgwIC0gMV07Ci0gICAgICAgICAgICAgICAgcHRyMiA9ICZzdW1fdlswXTsKLSAgICAgICAgICAgICAgICBwdHIzID0gJnNpZ25fdlswXTsKLQotICAgICAgICAgICAgICAgIHBlbHUgPSAqKHB0ciAtIHdpZHRoKTsKLSAgICAgICAgICAgICAgICBwZWxjID0gKnB0cjsKLSAgICAgICAgICAgICAgICBwZWxsID0gKihwdHIgKyB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgcHRyKys7Ci0gICAgICAgICAgICAgICAgKnB0cjIrKyA9IHBlbHUgKyAocGVsYyA8PCAxKSArIHBlbGw7Ci0gICAgICAgICAgICAgICAgKnB0cjMrKyA9IElOREVYKHBlbHUsIHRocmVzKSArIElOREVYKHBlbGMsIHRocmVzKSArIElOREVYKHBlbGwsIHRocmVzKTsKLQotICAgICAgICAgICAgICAgIHBlbHUgPSAqKHB0ciAtIHdpZHRoKTsKLSAgICAgICAgICAgICAgICBwZWxjID0gKnB0cjsKLSAgICAgICAgICAgICAgICBwZWxsID0gKihwdHIgKyB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgcHRyKys7Ci0gICAgICAgICAgICAgICAgKnB0cjIrKyA9IHBlbHUgKyAocGVsYyA8PCAxKSArIHBlbGw7Ci0gICAgICAgICAgICAgICAgKnB0cjMrKyA9IElOREVYKHBlbHUsIHRocmVzKSArIElOREVYKHBlbGMsIHRocmVzKSArIElOREVYKHBlbGwsIHRocmVzKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaF9wZWwgPSBoMDsgaF9wZWwgPCBoX2JsayArIEJMS1NJWkUgLSAxOyBoX3BlbCsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcGVsdSA9ICoocHRyIC0gd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBwZWxjID0gKnB0cjsKLSAgICAgICAgICAgICAgICAgICAgcGVsbCA9ICoocHRyICsgd2lkdGgpOwotCi0gICAgICAgICAgICAgICAgICAgICpwdHIyID0gcGVsdSArIChwZWxjIDw8IDEpICsgcGVsbDsKLSAgICAgICAgICAgICAgICAgICAgKnB0cjMgPSBJTkRFWChwZWx1LCB0aHJlcykgKyBJTkRFWChwZWxjLCB0aHJlcykgKyBJTkRFWChwZWxsLCB0aHJlcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3VtMSA9ICoocHRyMyAtIDIpICsgKihwdHIzIC0gMSkgKyAqcHRyMzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN1bTEgPT0gMCB8fCBzdW0xID09IDkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9ICgqKHB0cjIgLSAyKSArICgqKHB0cjIgLSAxKSA8PCAxKSArICpwdHIyICsgOCkgPj4gNDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcHRyLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUFZfQUJTKCpwdHIgLSBzdW0pID4gbWF4X2RpZmYpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1bSA+ICpwdHIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9ICpwdHIgKyBtYXhfZGlmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9ICpwdHIgLSBtYXhfZGlmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICpwdHIrKyA9ICh1aW50OCkgc3VtOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHB0cisrOwotICAgICAgICAgICAgICAgICAgICBwdHIyKys7Ci0gICAgICAgICAgICAgICAgICAgIHB0cjMrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKHZfYmxrID0gQkxLU0laRTsgdl9ibGsgPCBoZWlnaHQ7IHZfYmxrICs9IEJMS1NJWkUpCi0gICAgewotICAgICAgICB2MCA9IHZfYmxrIC0gMTsKLSAgICAgICAgLyogRG8gdGhlIGZpcnN0IGJsb2NrIChwaXhlbHM9NyA9PiBObyBNTVgpICovCi0gICAgICAgIG1heF9kaWZmID0gKFFQX3N0b3JlWygoKChpbnQzMil2X2Jsayp3aWR0aCk+PjMpKT4+M10gPj4gMikgKyA0OwotICAgICAgICBwdHIgPSAmUmVjX0NbKGludDMyKXZfYmxrICogd2lkdGhdOwotICAgICAgICBtYXhfYmxrID0gbWluX2JsayA9ICpwdHI7Ci0gICAgICAgIEZpbmRNYXhNaW4ocHRyLCAmbWluX2JsaywgJm1heF9ibGssIGluY3IpOwotCi0gICAgICAgIGlmIChtYXhfYmxrIC0gbWluX2JsayA+PSA0KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJlcyA9IChtYXhfYmxrICsgbWluX2JsayArIDEpID4+IDE7Ci0KLSAgICAgICAgICAgIGZvciAodl9wZWwgPSB2MDsgdl9wZWwgPCB2X2JsayArIEJMS1NJWkUgLSAxOyB2X3BlbCsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkZHJfdiA9IHZfcGVsICogd2lkdGg7Ci0gICAgICAgICAgICAgICAgcHRyID0gJlJlY19DW2FkZHJfdl07Ci0gICAgICAgICAgICAgICAgcHRyMiA9ICZzdW1fdlswXTsKLSAgICAgICAgICAgICAgICBwdHIzID0gJnNpZ25fdlswXTsKLQotICAgICAgICAgICAgICAgIHBlbHUgPSAqKHB0ciAtIHdpZHRoKTsKLSAgICAgICAgICAgICAgICBwZWxjID0gKnB0cjsKLSAgICAgICAgICAgICAgICBwZWxsID0gKihwdHIgKyB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgcHRyKys7Ci0gICAgICAgICAgICAgICAgKnB0cjIrKyA9IHBlbHUgKyAocGVsYyA8PCAxKSArIHBlbGw7Ci0gICAgICAgICAgICAgICAgKnB0cjMrKyA9IElOREVYKHBlbHUsIHRocmVzKSArIElOREVYKHBlbGMsIHRocmVzKSArIElOREVYKHBlbGwsIHRocmVzKTsKLQotICAgICAgICAgICAgICAgIHBlbHUgPSAqKHB0ciAtIHdpZHRoKTsKLSAgICAgICAgICAgICAgICBwZWxjID0gKnB0cjsKLSAgICAgICAgICAgICAgICBwZWxsID0gKihwdHIgKyB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgcHRyKys7Ci0gICAgICAgICAgICAgICAgKnB0cjIrKyA9IHBlbHUgKyAocGVsYyA8PCAxKSArIHBlbGw7Ci0gICAgICAgICAgICAgICAgKnB0cjMrKyA9IElOREVYKHBlbHUsIHRocmVzKSArIElOREVYKHBlbGMsIHRocmVzKSArIElOREVYKHBlbGwsIHRocmVzKTsKLQotICAgICAgICAgICAgICAgIGZvciAoaF9wZWwgPSAxOyBoX3BlbCA8IEJMS1NJWkUgLSAxOyBoX3BlbCsrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcGVsdSA9ICoocHRyIC0gd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBwZWxjID0gKnB0cjsKLSAgICAgICAgICAgICAgICAgICAgcGVsbCA9ICoocHRyICsgd2lkdGgpOwotCi0gICAgICAgICAgICAgICAgICAgICpwdHIyID0gcGVsdSArIChwZWxjIDw8IDEpICsgcGVsbDsKLSAgICAgICAgICAgICAgICAgICAgKnB0cjMgPSBJTkRFWChwZWx1LCB0aHJlcykgKyBJTkRFWChwZWxjLCB0aHJlcykgKyBJTkRFWChwZWxsLCB0aHJlcyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3VtMSA9ICoocHRyMyAtIDIpICsgKihwdHIzIC0gMSkgKyAqcHRyMzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN1bTEgPT0gMCB8fCBzdW0xID09IDkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9ICgqKHB0cjIgLSAyKSArICgqKHB0cjIgLSAxKSA8PCAxKSArICpwdHIyICsgOCkgPj4gNDsKLQotICAgICAgICAgICAgICAgICAgICAgICAgcHRyLS07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoUFZfQUJTKCpwdHIgLSBzdW0pID4gbWF4X2RpZmYpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1bSA+ICpwdHIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9ICpwdHIgKyBtYXhfZGlmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bSA9ICpwdHIgLSBtYXhfZGlmZjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICpwdHIrKyA9ICh1aW50OCkgc3VtOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHB0cisrOwotICAgICAgICAgICAgICAgICAgICBwdHIyKys7Ci0gICAgICAgICAgICAgICAgICAgIHB0cjMrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qIERvIHRoZSByZXN0IGluIE1NWCAqLwotICAgICAgICBmb3IgKGhfYmxrID0gQkxLU0laRTsgaF9ibGsgPCB3aWR0aDsgaF9ibGsgKz0gQkxLU0laRSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKChwcF9tb2RbKHZfYmxrLzgpKih3aWR0aC84KStoX2Jsay84XSYweDQpICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWF4X2RpZmYgPSAoUVBfc3RvcmVbKCgoKGludDMyKXZfYmxrKndpZHRoKT4+MykraF9ibGspPj4zXSA+PiAyKSArIDQ7Ci0gICAgICAgICAgICAgICAgcHRyID0gJlJlY19DWyhpbnQzMil2X2JsayAqIHdpZHRoICsgaF9ibGtdOwotICAgICAgICAgICAgICAgIG1heF9ibGsgPSBtaW5fYmxrID0gKnB0cjsKLSAgICAgICAgICAgICAgICBGaW5kTWF4TWluKHB0ciwgJm1pbl9ibGssICZtYXhfYmxrLCBpbmNyKTsKLSAgICAgICAgICAgICAgICBoMCA9IGhfYmxrIC0gMTsKLQotICAgICAgICAgICAgICAgIGlmIChtYXhfYmxrIC0gbWluX2JsayA+PSA0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyZXMgPSAobWF4X2JsayArIG1pbl9ibGsgKyAxKSA+PiAxOwotI2lmZGVmIE5vTU1YCi0gICAgICAgICAgICAgICAgICAgIEFkYXB0aXZlU21vb3RoX05vTU1YKFJlY19DLCB2MCwgaDAsIHZfYmxrLCBoX2JsaywgdGhyZXMsIHdpZHRoLCBtYXhfZGlmZik7Ci0jZWxzZQotICAgICAgICAgICAgICAgICAgICBEZXJpbmdBZGFwdGl2ZVNtb290aE1NWCgmUmVjX0NbKGludDMyKXYwKndpZHRoK2gwXSwgd2lkdGgsIHRocmVzLCBtYXhfZGlmZik7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IC8qIG1hY3JvYmxvY2sgbGV2ZWwgKi8KLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgUmV0dXJuIG5vdGhpbmcgb3IgZGF0YSBvciBkYXRhIHBvaW50ZXIKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICByZXR1cm47Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2RlcmluZ2luZ19sdW1hLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2RlcmluZ2luZ19sdW1hLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU1NzRiNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9kZXJpbmdpbmdfbHVtYS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMzEgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLSNpbmNsdWRlICAgICJtcDRkZWNfbGliLmgiCi0jaW5jbHVkZSAgICAicG9zdF9wcm9jLmgiCi0KLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotCi12b2lkIERlcmluZ2luZ19MdW1hKAotICAgIHVpbnQ4ICpSZWNfWSwKLSAgICBpbnQgd2lkdGgsCi0gICAgaW50IGhlaWdodCwKLSAgICBpbnQxNiAqUVBfc3RvcmUsCi0gICAgaW50LAotICAgIHVpbnQ4ICpwcF9tb2QpCi17Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIGludCB0aHJlc1s0XSwgcmFuZ2VbNF0sIG1heF9yYW5nZV9ibGssIG1heF90aHJlc19ibGs7Ci0gICAgaW50IE1CX1YsIE1CX0gsIEJMS19WLCBCTEtfSDsKLSAgICBpbnQgdl9ibGssIGhfYmxrOwotICAgIGludCBtYXhfZGlmZjsKLSAgICBpbnQgbWF4X2JsaywgbWluX2JsazsKLSAgICBpbnQgdjAsIGgwOwotICAgIHVpbnQ4ICpwdHI7Ci0gICAgaW50IHRociwgYmxrcywgaW5jcjsKLSAgICBpbnQgbWJfaW5keCwgYmxrX2luZHg7Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IEZ1bmN0aW9uIGJvZHkgaGVyZQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIGluY3IgPSB3aWR0aCAtIEJMS1NJWkU7Ci0KLSAgICAvKiBEZXJpbmcgdGhlIGZpcnN0IGxpbmUgb2YgbWFjcm8gYmxvY2tzICovCi0gICAgZm9yIChNQl9IID0gMDsgTUJfSCA8IHdpZHRoOyBNQl9IICs9IE1CU0laRSkKLSAgICB7Ci0gICAgICAgIG1heF9kaWZmID0gKFFQX3N0b3JlWyhNQl9IKT4+NF0gPj4gMikgKyA0OwotCi0gICAgICAgIC8qIHRocmVzaG9sZCBkZXRlcm1pbmF0aW9uICovCi0gICAgICAgIG1heF9yYW5nZV9ibGsgPSBtYXhfdGhyZXNfYmxrID0gMDsKLSAgICAgICAgYmxrcyA9IDA7Ci0KLSAgICAgICAgZm9yIChCTEtfViA9IDA7IEJMS19WIDwgTUJTSVpFOyBCTEtfViArPSBCTEtTSVpFKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKEJMS19IID0gMDsgQkxLX0ggPCBNQlNJWkU7IEJMS19IICs9IEJMS1NJWkUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcHRyID0gJlJlY19ZWyhpbnQzMikoQkxLX1YpICogd2lkdGggKyBNQl9IICsgQkxLX0hdOwotICAgICAgICAgICAgICAgIEZpbmRNYXhNaW4ocHRyLCAmbWluX2JsaywgJm1heF9ibGssIGluY3IpOwotCi0gICAgICAgICAgICAgICAgdGhyZXNbYmxrc10gPSAobWF4X2JsayArIG1pbl9ibGsgKyAxKSA+PiAxOwotICAgICAgICAgICAgICAgIHJhbmdlW2Jsa3NdID0gbWF4X2JsayAtIG1pbl9ibGs7Ci0KLSAgICAgICAgICAgICAgICBpZiAocmFuZ2VbYmxrc10gPj0gbWF4X3JhbmdlX2JsaykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG1heF9yYW5nZV9ibGsgPSByYW5nZVtibGtzXTsKLSAgICAgICAgICAgICAgICAgICAgbWF4X3RocmVzX2JsayA9IHRocmVzW2Jsa3NdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBibGtzKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBibGtzID0gMDsKLSAgICAgICAgZm9yICh2X2JsayA9IDA7IHZfYmxrIDwgTUJTSVpFOyB2X2JsayArPSBCTEtTSVpFKQotICAgICAgICB7Ci0gICAgICAgICAgICB2MCA9ICgodl9ibGsgLSAxKSA+PSAxKSA/ICh2X2JsayAtIDEpIDogMTsKLSAgICAgICAgICAgIGZvciAoaF9ibGsgPSBNQl9IOyBoX2JsayA8IE1CX0ggKyBNQlNJWkU7IGhfYmxrICs9IEJMS1NJWkUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaDAgPSAoKGhfYmxrIC0gMSkgPj0gMSkgPyAoaF9ibGsgLSAxKSA6IDE7Ci0KLSAgICAgICAgICAgICAgICAvKiB0aHJlc2hvbGQgcmVhcnJhbmdlbWVudCBmb3IgZmxhdCByZWdpb24gYWRqYWNlbnQgdG8gbm9uLWZsYXQgcmVnaW9uICovCi0gICAgICAgICAgICAgICAgaWYgKHJhbmdlW2Jsa3NdPDMyICYmIG1heF9yYW5nZV9ibGsgPj0gNjQpCi0gICAgICAgICAgICAgICAgICAgIHRocmVzW2Jsa3NdID0gbWF4X3RocmVzX2JsazsKLQotICAgICAgICAgICAgICAgIC8qIHRocmVzaG9sZCByZWFycmFuZ2VtZW50IGZvciBkZWJsb2NraW5nCi0gICAgICAgICAgICAgICAgKGJsb2NraW5lc3MgYW5ub3lpbmcgYXQgREMgZG9taW5hbnQgcmVnaW9uKSAqLwotICAgICAgICAgICAgICAgIGlmIChtYXhfcmFuZ2VfYmxrID49IDE2KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyogYWRhcHRpdmUgc21vb3RoaW5nICovCi0gICAgICAgICAgICAgICAgICAgIHRociA9IHRocmVzW2Jsa3NdOwotCi0gICAgICAgICAgICAgICAgICAgIEFkYXB0aXZlU21vb3RoX05vTU1YKFJlY19ZLCB2MCwgaDAsIHZfYmxrLCBoX2JsaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyLCB3aWR0aCwgbWF4X2RpZmYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBibGtzKys7Ci0gICAgICAgICAgICB9IC8qIGJsb2NrIGxldmVsIChMdW1pbmFuY2UpICovCi0gICAgICAgIH0KLSAgICB9IC8qIG1hY3JvYmxvY2sgbGV2ZWwgKi8KLQotCi0gICAgLyogRG8gdGhlIHJlc3Qgb2YgdGhlIG1hY3JvLWJsb2NrLWxpbmVzICovCi0gICAgZm9yIChNQl9WID0gTUJTSVpFOyBNQl9WIDwgaGVpZ2h0OyBNQl9WICs9IE1CU0laRSkKLSAgICB7Ci0gICAgICAgIC8qIEZpcnN0IG1hY3JvLWJsb2NrICovCi0gICAgICAgIG1heF9kaWZmID0gKFFQX3N0b3JlWygoKChpbnQzMilNQl9WKndpZHRoKT4+NCkpPj40XSA+PiAyKSArIDQ7Ci0gICAgICAgIC8qIHRocmVzaG9sZCBkZXRlcm1pbmF0aW9uICovCi0gICAgICAgIG1heF9yYW5nZV9ibGsgPSBtYXhfdGhyZXNfYmxrID0gMDsKLSAgICAgICAgYmxrcyA9IDA7Ci0gICAgICAgIGZvciAoQkxLX1YgPSAwOyBCTEtfViA8IE1CU0laRTsgQkxLX1YgKz0gQkxLU0laRSkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChCTEtfSCA9IDA7IEJMS19IIDwgTUJTSVpFOyBCTEtfSCArPSBCTEtTSVpFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHB0ciA9ICZSZWNfWVsoaW50MzIpKE1CX1YgKyBCTEtfVikgKiB3aWR0aCArIEJMS19IXTsKLSAgICAgICAgICAgICAgICBGaW5kTWF4TWluKHB0ciwgJm1pbl9ibGssICZtYXhfYmxrLCBpbmNyKTsKLSAgICAgICAgICAgICAgICB0aHJlc1tibGtzXSA9IChtYXhfYmxrICsgbWluX2JsayArIDEpID4+IDE7Ci0gICAgICAgICAgICAgICAgcmFuZ2VbYmxrc10gPSBtYXhfYmxrIC0gbWluX2JsazsKLQotICAgICAgICAgICAgICAgIGlmIChyYW5nZVtibGtzXSA+PSBtYXhfcmFuZ2VfYmxrKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWF4X3JhbmdlX2JsayA9IHJhbmdlW2Jsa3NdOwotICAgICAgICAgICAgICAgICAgICBtYXhfdGhyZXNfYmxrID0gdGhyZXNbYmxrc107Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJsa3MrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJsa3MgPSAwOwotICAgICAgICBmb3IgKHZfYmxrID0gTUJfVjsgdl9ibGsgPCBNQl9WICsgTUJTSVpFOyB2X2JsayArPSBCTEtTSVpFKQotICAgICAgICB7Ci0gICAgICAgICAgICB2MCA9IHZfYmxrIC0gMTsKLSAgICAgICAgICAgIGZvciAoaF9ibGsgPSAwOyBoX2JsayA8IE1CU0laRTsgaF9ibGsgKz0gQkxLU0laRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBoMCA9ICgoaF9ibGsgLSAxKSA+PSAxKSA/IChoX2JsayAtIDEpIDogMTsKLQotICAgICAgICAgICAgICAgIC8qIHRocmVzaG9sZCByZWFycmFuZ2VtZW50IGZvciBmbGF0IHJlZ2lvbiBhZGphY2VudCB0byBub24tZmxhdCByZWdpb24gKi8KLSAgICAgICAgICAgICAgICBpZiAocmFuZ2VbYmxrc108MzIgJiYgbWF4X3JhbmdlX2JsayA+PSA2NCkKLSAgICAgICAgICAgICAgICAgICAgdGhyZXNbYmxrc10gPSBtYXhfdGhyZXNfYmxrOwotCi0gICAgICAgICAgICAgICAgLyogdGhyZXNob2xkIHJlYXJyYW5nZW1lbnQgZm9yIGRlYmxvY2tpbmcKLSAgICAgICAgICAgICAgICAoYmxvY2tpbmVzcyBhbm5veWluZyBhdCBEQyBkb21pbmFudCByZWdpb24pICovCi0gICAgICAgICAgICAgICAgaWYgKG1heF9yYW5nZV9ibGsgPj0gMTYpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKiBhZGFwdGl2ZSBzbW9vdGhpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgdGhyID0gdGhyZXNbYmxrc107Ci0KLSAgICAgICAgICAgICAgICAgICAgQWRhcHRpdmVTbW9vdGhfTm9NTVgoUmVjX1ksIHYwLCBoMCwgdl9ibGssIGhfYmxrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHIsIHdpZHRoLCBtYXhfZGlmZik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJsa3MrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSAvKiBibG9jayBsZXZlbCAoTHVtaW5hbmNlKSAqLwotCi0gICAgICAgIC8qIFJlc3Qgb2YgdGhlIG1hY3JvLWJsb2NrcyAqLwotICAgICAgICBmb3IgKE1CX0ggPSBNQlNJWkU7IE1CX0ggPCB3aWR0aDsgTUJfSCArPSBNQlNJWkUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1heF9kaWZmID0gKFFQX3N0b3JlWygoKChpbnQzMilNQl9WKndpZHRoKT4+NCkrTUJfSCk+PjRdID4+IDIpICsgNDsKLQotICAgICAgICAgICAgLyogdGhyZXNob2xkIGRldGVybWluYXRpb24gKi8KLSAgICAgICAgICAgIG1heF9yYW5nZV9ibGsgPSBtYXhfdGhyZXNfYmxrID0gMDsKLSAgICAgICAgICAgIGJsa3MgPSAwOwotCi0gICAgICAgICAgICBtYl9pbmR4ID0gKE1CX1YgLyA4KSAqICh3aWR0aCAvIDgpICsgTUJfSCAvIDg7Ci0gICAgICAgICAgICBmb3IgKEJMS19WID0gMDsgQkxLX1YgPCBNQlNJWkU7IEJMS19WICs9IEJMS1NJWkUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yIChCTEtfSCA9IDA7IEJMS19IIDwgTUJTSVpFOyBCTEtfSCArPSBCTEtTSVpFKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYmxrX2luZHggPSBtYl9pbmR4ICsgKEJMS19WIC8gOCkgKiB3aWR0aCAvIDggKyBCTEtfSCAvIDg7Ci0gICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBiYXNlZCBvbiBwcF9tb2Qgb25seSAqLwotICAgICAgICAgICAgICAgICAgICBpZiAoKHBwX21vZFtibGtfaW5keF0mMHg0KSAhPSAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSAmUmVjX1lbKGludDMyKShNQl9WICsgQkxLX1YpICogd2lkdGggKyBNQl9IICsgQkxLX0hdOwotICAgICAgICAgICAgICAgICAgICAgICAgRmluZE1heE1pbihwdHIsICZtaW5fYmxrLCAmbWF4X2JsaywgaW5jcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJlc1tibGtzXSA9IChtYXhfYmxrICsgbWluX2JsayArIDEpID4+IDE7Ci0gICAgICAgICAgICAgICAgICAgICAgICByYW5nZVtibGtzXSA9IG1heF9ibGsgLSBtaW5fYmxrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmFuZ2VbYmxrc10gPj0gbWF4X3JhbmdlX2JsaykKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfcmFuZ2VfYmxrID0gcmFuZ2VbYmxrc107Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X3RocmVzX2JsayA9IHRocmVzW2Jsa3NdOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJsa3MrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJsa3MgPSAwOwotICAgICAgICAgICAgZm9yICh2X2JsayA9IE1CX1Y7IHZfYmxrIDwgTUJfViArIE1CU0laRTsgdl9ibGsgKz0gQkxLU0laRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2MCA9IHZfYmxrIC0gMTsKLSAgICAgICAgICAgICAgICBtYl9pbmR4ID0gKHZfYmxrIC8gOCkgKiAod2lkdGggLyA4KTsKLSAgICAgICAgICAgICAgICBmb3IgKGhfYmxrID0gTUJfSDsgaF9ibGsgPCBNQl9IICsgTUJTSVpFOyBoX2JsayArPSBCTEtTSVpFKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaDAgPSBoX2JsayAtIDE7Ci0gICAgICAgICAgICAgICAgICAgIGJsa19pbmR4ID0gbWJfaW5keCArIGhfYmxrIC8gODsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChwcF9tb2RbYmxrX2luZHhdJjB4NCkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhyZXNob2xkIHJlYXJyYW5nZW1lbnQgZm9yIGZsYXQgcmVnaW9uIGFkamFjZW50IHRvIG5vbi1mbGF0IHJlZ2lvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhbmdlW2Jsa3NdPDMyICYmIG1heF9yYW5nZV9ibGsgPj0gNjQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNbYmxrc10gPSBtYXhfdGhyZXNfYmxrOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiB0aHJlc2hvbGQgcmVhcnJhbmdlbWVudCBmb3IgZGVibG9ja2luZwotICAgICAgICAgICAgICAgICAgICAgICAgKGJsb2NraW5lc3MgYW5ub3lpbmcgYXQgREMgZG9taW5hbnQgcmVnaW9uKSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1heF9yYW5nZV9ibGsgPj0gMTYpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYWRhcHRpdmUgc21vb3RoaW5nICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyID0gdGhyZXNbYmxrc107Ci0jaWZkZWYgTm9NTVgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGFwdGl2ZVNtb290aF9Ob01NWChSZWNfWSwgdjAsIGgwLCB2X2JsaywgaF9ibGssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyLCB3aWR0aCwgbWF4X2RpZmYpOwotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXJpbmdBZGFwdGl2ZVNtb290aE1NWCgmUmVjX1lbdjAqd2lkdGgraDBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCB0aHIsIG1heF9kaWZmKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJsa3MrKzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IC8qIGJsb2NrIGxldmVsIChMdW1pbmFuY2UpICovCi0gICAgICAgIH0gLyogbWFjcm9ibG9jayBsZXZlbCAqLwotICAgIH0gLyogbWFjcm9ibG9jayBsZXZlbCAqLwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHJldHVybjsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZmluZF9taW5fbWF4LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2ZpbmRfbWluX21heC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYzg4YTEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvZmluZF9taW5fbWF4LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3NiArMCwwIEBACi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIENvcHlyaWdodCAoQykgMTk5OC0yMDA5IFBhY2tldFZpZGVvCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCi0gKiBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKLSAqIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqLwotLyoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIElOUFVUIEFORCBPVVRQVVQgREVGSU5JVElPTlMKLQotIElucHV0czoKLSAgICBpbnB1dF9wdHIgPSBwb2ludGVyIHRvIHRoZSBidWZmZXIgY29udGFpbmluZyB2YWx1ZXMgb2YgdHlwZSBVQ2hhcgotICAgICAgICAgICAgaW4gYSAyRCBibG9jayBvZiBkYXRhLgotICAgIG1pbl9wdHIgPSBwb2ludGVyIHRvIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHR5cGUgSW50IHRvIGJlIGZvdW5kIGluIGEKLSAgICAgICAgICBzcXVhcmUgYmxvY2sgb2Ygc2l6ZSBCTEtTSVpFIGNvbnRhaW5lZCBpbiAyRCBibG9jayBvZiBkYXRhLgotICAgIG1heF9wdHIgPSBwb2ludGVyIHRvIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHR5cGUgSW50IHRvIGJlIGZvdW5kIGluIGEKLSAgICAgICAgICBzcXVhcmUgYmxvY2sgb2Ygc2l6ZSBCTEtTSVpFIGNvbnRhaW5lZCBpbiAyRCBibG9jayBvZiBkYXRhLgotICAgIGluY3IgPSB2YWx1ZSBvZiB0eXBlIEludCByZXByZXNlbnRpbmcgdGhlIHdpZHRoIG9mIDJEIGJsb2NrIG9mIGRhdGEuCi0KLSBMb2NhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6Ci0gICAgTm9uZQotCi0gR2xvYmFsIFN0b3Jlcy9CdWZmZXJzL1BvaW50ZXJzIE5lZWRlZDoKLSAgICBOb25lCi0KLSBPdXRwdXRzOgotICAgIE5vbmUKLQotIFBvaW50ZXJzIGFuZCBCdWZmZXJzIE1vZGlmaWVkOgotICAgIG1pbl9wdHIgcG9pbnRzIHRvIHRoZSBmb3VuZCBtaW5pbXVtIHZhbHVlIGluIHRoZSBzcXVhcmUgYmxvY2sgb2YKLSAgICBzaXplIEJMS1NJWkUgY29udGFpbmVkIGluIDJEIGJsb2NrIG9mIGRhdGEuCi0KLSAgICBtYXhfcHRyIHBvaW50cyB0byB0aGUgZm91bmQgbWF4aW11bSB2YWx1ZSBpbiB0aGUgc3F1YXJlIGJsb2NrIG9mCi0gICAgc2l6ZSBCTEtTSVpFIGNvbnRhaW5lZCBpbiAyRCBibG9jayBvZiBkYXRhLgotCi0gTG9jYWwgU3RvcmVzIE1vZGlmaWVkOgotICAgIE5vbmUKLQotIEdsb2JhbCBTdG9yZXMgTW9kaWZpZWQ6Ci0gICAgTm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGVU5DVElPTiBERVNDUklQVElPTgotCi0gVGhpcyBmdW5jdGlvbiBmaW5kcyB0aGUgbWF4aW11bSBhbmQgdGhlIG1pbmltdW0gdmFsdWVzIGluIGEgc3F1YXJlIGJsb2NrIG9mCi0gZGF0YSBvZiBzaXplIEJMS1NJWkUgKiBCTEtTSVpFLiBUaGUgZGF0YSBpcyBjb250YWluZWQgaW4gdGhlIGJ1ZmZlciB3aGljaAotIHJlcHJlc2VudHMgYSAyRCBibG9jayBvZiBkYXRhIHRoYXQgaXMgbGFyZ2VyIHRoYW4gQkxLU0laRSAqIEJMS1NJWkUuCi0gVGhpcyBpcyBpbGx1c3RyYXRlZCBiZWxvdy4KLQotICAgIG1lbSBsb2MgeCArIDAwaCAtPiBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvCi0gICAgbWVtIGxvYyB4ICsgMTBoIC0+IG8gbyBvIG8gbyBYIFggWCBYIFggWCBYIFggbyBvIG8KLSAgICBtZW0gbG9jIHggKyAyMGggLT4gbyBvIG8gbyBvIFggWCBYIFggWCBYIFggWCBvIG8gbwotICAgIG1lbSBsb2MgeCArIDMwaCAtPiBvIG8gbyBvIG8gWCBYIFggWCBYIFggWCBYIG8gbyBvCi0gICAgbWVtIGxvYyB4ICsgNDBoIC0+IG8gbyBvIG8gbyBYIFggWCBYIFggWCBYIFggbyBvIG8KLSAgICBtZW0gbG9jIHggKyA1MGggLT4gbyBvIG8gbyBvIFggWCBYIFggWCBYIFggWCBvIG8gbwotICAgIG1lbSBsb2MgeCArIDYwaCAtPiBvIG8gbyBvIG8gWCBYIFggWCBYIFggWCBYIG8gbyBvCi0gICAgbWVtIGxvYyB4ICsgNzBoIC0+IG8gbyBvIG8gbyBYIFggWCBYIFggWCBYIFggbyBvIG8KLSAgICBtZW0gbG9jIHggKyA4MGggLT4gbyBvIG8gbyBvIFggWCBYIFggWCBYIFggWCBvIG8gbwotICAgIG1lbSBsb2MgeCArIDkwaCAtPiBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvCi0gICAgbWVtIGxvYyB4ICsgQTBoIC0+IG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8KLSAgICBtZW0gbG9jIHggKyBCMGggLT4gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbyBvIG8gbwotCi1Gb3IgaWxsdXN0cmF0aW9uIHB1cnBvc2VzLCB0aGUgZGlhZ3JhbSBhc3N1bWVzIHRoYXQgQkxLU0laRSBpcyBlcXVhbCB0byA4Ci1idXQgdGhpcyBpcyBub3QgYSByZXF1aXJlbWVudC4gSW4gdGhpcyBkaWFncmFtLCB0aGUgYnVmZmVyIHN0YXJ0cyBhdAotbG9jYXRpb24geCBidXQgdGhlIGlucHV0IHBvaW50ZXIsIGlucHV0X3B0ciwgcGFzc2VkIGludG8gdGhpcyBmdW5jdGlvbgotd291bGQgYmUgdGhlIGZpcnN0IHJvdyBvZiBkYXRhIHRvIGJlIHNlYXJjaGVkIHdoaWNoIGlzIGF0IHggKyAxNWguIFRoZQotdmFsdWUgb2YgaW5jciBwYXNzZWQgb250byB0aGlzIGZ1bmN0aW9uIHJlcHJlc2VudHMgdGhlIGFtb3VudCB0aGUgaW5wdXRfcHRyCi1uZWVkcyB0byBiZSBpbmNyZW1lbnRlZCB0byBwb2ludCB0byB0aGUgbmV4dCByb3cgb2YgZGF0YS4KLQotVGhpcyBmdW5jdGlvbiBjb21wYXJlcyBlYWNoIHZhbHVlIGluIGEgcm93IHRvIHRoZSBjdXJyZW50IG1heGltdW0gYW5kCi1taW5pbXVtLiBBZnRlciBlYWNoIHJvdywgaW5wdXRfcHRyIGlzIGluY3JlbWVudGVkIHRvIHBvaW50IHRvIHRoZSBuZXh0IHJvdy4KLVRoaXMgaXMgcmVwZWF0ZWQgdW50aWwgYWxsIHJvd3MgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gV2hlbiB0aGUgc2VhcmNoIGlzCi1jb21wbGV0ZSB0aGUgbG9jYXRpb24gcG9pbnRlZCB0byBieSBtaW5fcHRyIGNvbnRhaW5zIHRoZSBtaW5pbXVtIHZhbHVlCi1mb3VuZCBhbmQgdGhlIGxvY2F0aW9uIHBvaW50ZWQgdG8gYnkgbWF4X3B0ciBjb250YWlucyB0aGUgbWF4aW11bSB2YWx1ZSBmb3VuZC4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0qLwotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBJTkNMVURFUwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaW5jbHVkZSAgICAibXA0ZGVjX2xpYi5oIgotI2luY2x1ZGUgICAgInBvc3RfcHJvYy5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTUFDUk9TCi07IERlZmluZSBtb2R1bGUgc3BlY2lmaWMgbWFjcm9zIGhlcmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgREVGSU5FUwotOyBJbmNsdWRlIGFsbCBwcmUtcHJvY2Vzc29yIHN0YXRlbWVudHMgaGVyZS4gSW5jbHVkZSBjb25kaXRpb25hbAotOyBjb21waWxlIHZhcmlhYmxlcyBhbHNvLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBMT0NBTCBGVU5DVElPTiBERUZJTklUSU9OUwotOyBGdW5jdGlvbiBQcm90b3R5cGUgZGVjbGFyYXRpb24KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTE9DQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgREVGSU5JVElPTlMKLTsgVmFyaWFibGUgZGVjbGFyYXRpb24gLSBkZWZpbmVkIGhlcmUgYW5kIHVzZWQgb3V0c2lkZSB0aGlzIG1vZHVsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFWFRFUk5BTCBGVU5DVElPTiBSRUZFUkVOQ0VTCi07IERlY2xhcmUgZnVuY3Rpb25zIGRlZmluZWQgZWxzZXdoZXJlIGFuZCByZWZlcmVuY2VkIGluIHRoaXMgbW9kdWxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEVYVEVSTkFMIEdMT0JBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBSRUZFUkVOQ0VTCi07IERlY2xhcmUgdmFyaWFibGVzIHVzZWQgaW4gdGhpcyBtb2R1bGUgYnV0IGRlZmluZWQgZWxzZXdoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRlVOQ1RJT04gQ09ERQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi12b2lkICBGaW5kTWF4TWluKAotICAgIHVpbnQ4ICppbnB1dF9wdHIsCi0gICAgaW50ICptaW5fcHRyLAotICAgIGludCAqbWF4X3B0ciwKLSAgICBpbnQgaW5jcikKLXsKLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IERlZmluZSBhbGwgbG9jYWwgdmFyaWFibGVzCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgdWludCAgICBpLCBqOwotICAgIGludCBtaW4sIG1heDsKLQotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgbWF4ID0gbWluID0gKmlucHV0X3B0cjsKLSAgICAvKiAgaW5jciA9IGluY3IgLSBCTEtTSVpFOyAqLyAgIC8qICAwOS8wNi8yMDAxLCBhbHJlYWR5IHBhc3NlZCBpbiBhcyB3aWR0aCAtIEJMS1NJWkUgKi8KLQotICAgIGZvciAoaSA9IEJMS1NJWkU7IGkgPiAwOyBpLS0pCi0gICAgewotICAgICAgICBmb3IgKGogPSBCTEtTSVpFOyBqID4gMDsgai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKmlucHV0X3B0ciA+IG1heCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtYXggPSAqaW5wdXRfcHRyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAoKmlucHV0X3B0ciA8IG1pbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtaW4gPSAqaW5wdXRfcHRyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5wdXRfcHRyICs9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBzZXQgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IHJvdyovCi0gICAgICAgIGlucHV0X3B0ciArPSBpbmNyOwotICAgIH0KLQotICAgICptYXhfcHRyID0gbWF4OwotICAgICptaW5fcHRyID0gbWluOwotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgUmV0dXJuIG5vdGhpbmcgb3IgZGF0YSBvciBkYXRhIHBvaW50ZXIKLSAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSAgICByZXR1cm47Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2lkY3RfdmNhLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2lkY3RfdmNhLmNwcAppbmRleCBmMzVjZTRmLi4wYmE0OTQ0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9pZGN0X3ZjYS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvaWRjdF92Y2EuY3BwCkBAIC05NCw2ICs5NCw3IEBACiAgICAgcmV0dXJuOwogfQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Ryb3cyKGludDE2ICpibGssIHVpbnQ4ICpwcmVkLCB1aW50OCAqZHN0LCBpbnQgd2lkdGgpCiB7CiAgICAgaW50MzIgeDAsIHgxLCB4MiwgeDQsIHg1OwpAQCAtMTgyLDYgKzE4Myw3IEBACiAgICAgcmV0dXJuIDsKIH0KIAorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogdm9pZCBpZGN0cm93MyhpbnQxNiAqYmxrLCB1aW50OCAqcHJlZCwgdWludDggKmRzdCwgaW50IHdpZHRoKQogewogICAgIGludDMyIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDg7CkBAIC0yOTEsNiArMjkzLDcgQEAKIH0KIAogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Ryb3c0KGludDE2ICpibGssIHVpbnQ4ICpwcmVkLCB1aW50OCAqZHN0LCBpbnQgd2lkdGgpCiB7CiAgICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4ODsKQEAgLTM2OCw2ICszNzEsNyBAQAogICAgIHJldHVybiA7CiB9CiAKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdGNvbDQoaW50MTYgKmJsaykKIHsKICAgICBpbnQzMiB4MCwgeDEsIHgyLCB4MywgeDQsIHg1LCB4NiwgeDcsIHg4OwpAQCAtNDQ1LDYgKzQ0OSw3IEBACiAgICAgcmV0dXJuOwogfQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Ryb3cyX2ludHJhKGludDE2ICpibGssIFBJWEVMICpjb21wLCBpbnQgd2lkdGgpCiB7CiAgICAgaW50MzIgeDAsIHgxLCB4MiwgeDQsIHg1LCB0ZW1wOwpAQCAtNTAyLDYgKzUwNyw3IEBACiAgICAgcmV0dXJuIDsKIH0KIAorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IikpKQogdm9pZCBpZGN0cm93M19pbnRyYShpbnQxNiAqYmxrLCBQSVhFTCAqY29tcCwgaW50IHdpZHRoKQogewogICAgIGludDMyIHgwLCB4MSwgeDIsIHgzLCB4NCwgeDUsIHg2LCB4NywgeDgsIHRlbXA7CkBAIC01NzUsNiArNTgxLDcgQEAKICAgICByZXR1cm4gOwogfQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Ryb3c0X2ludHJhKGludDE2ICpibGssIFBJWEVMICpjb21wLCBpbnQgd2lkdGgpCiB7CiAgICAgaW50MzIgeDAsIHgxLCB4MiwgeDMsIHg0LCB4NSwgeDYsIHg3LCB4OCwgdGVtcDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21iX21vdGlvbl9jb21wLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21iX21vdGlvbl9jb21wLmNwcAppbmRleCA4Nzc3MjNkLi43OTc2MGY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tYl9tb3Rpb25fY29tcC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbWJfbW90aW9uX2NvbXAuY3BwCkBAIC0xNTQsMTQgKzE1NCw2IEBACiAgICAgaW50IHhwcmVkLCB5cHJlZDsKICAgICBpbnQgeHN1bTsKICAgICBpbnQgcm91bmQxOwotI2lmZGVmIFBWX1BPU1RQUk9DX09OIC8vIDIvMTQvMjAwMSAgICAgIAotICAgIC8qIFRvdGFsIG51bWJlciBvZiBwaXhlbHMgaW4gdGhlIFZPTCAqLwotICAgIGludDMyIHNpemUgPSAoaW50MzIpIHZpZGVvLT5uVG90YWxNQiA8PCA4OwotICAgIHVpbnQ4ICpwcF9kZWNfeSwgKnBwX2RlY191OwotICAgIGludCBsbFs0XTsKLSAgICBpbnQgdG1wID0gMDsKLSAgICB1aW50OCBtc2tfZGVibG9jayA9IDA7Ci0jZW5kaWYKICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICA7IEZ1bmN0aW9uIGJvZHkgaGVyZQogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpAQCAtNDA0LDQzICszOTYsNiBAQAogICAgIC8qIENhbGwgZnVuY3Rpb24gdG8gc2V0IGRlLWJsb2NraW5nIGFuZCBkZS1yaW5naW5nICovCiAgICAgLyogICBzZW1hcGhvcmVzIGZvciBsdW1pbmFuY2UgICAgICAgICAgICAgICAgICAgICAgKi8KIAotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgaWYgKHZpZGVvLT5wb3N0RmlsdGVyVHlwZSAhPSBQVl9OT19QT1NUX1BST0MpCi0gICAgewotICAgICAgICBpZiAobW9kZSZJTlRFUl8xVk1BU0spCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBwX2RlY195ID0gdmlkZW8tPnBzdHByY1R5cEN1ciArIGltdjsKLSAgICAgICAgICAgIGxsWzBdID0gMTsKLSAgICAgICAgICAgIGxsWzFdID0gbXZ3aWR0aCAtIDE7Ci0gICAgICAgICAgICBsbFsyXSA9IDE7Ci0gICAgICAgICAgICBsbFszXSA9IC1tdndpZHRoIC0gMTsKLSAgICAgICAgICAgIG1za19kZWJsb2NrID0gcHBfc2VtYXBob3JlX2x1bWEoeHByZWQsIHlwcmVkLCBwcF9kZWNfeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnBzdHByY1R5cFBydiwgbGwsICZ0bXAsIHB4WzBdLCBweVswXSwgbXZ3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCk7Ci0KLSAgICAgICAgICAgIHBwX2RlY191ID0gdmlkZW8tPnBzdHByY1R5cEN1ciArIChzaXplID4+IDYpICsKLSAgICAgICAgICAgICAgICAgICAgICAgKChpbXYgKyAoeHBvcyA+PiAzKSkgPj4gMik7Ci0KLSAgICAgICAgICAgIHBwX3NlbWFwaG9yZV9jaHJvbWFfaW50ZXIoeHByZWQsIHlwcmVkLCBwcF9kZWNfdSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8tPnBzdHByY1R5cFBydiwgZHgsIGR5LCBtdndpZHRoLCBoZWlnaHQsIHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRtcCwgbXNrX2RlYmxvY2spOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogUG9zdC1wcm9jZXNzaW5nIG1vZGUgKE1CTV9JTlRFUjgpICovCi0gICAgICAgICAgICAvKiBkZWJsb2NraW5nIGFuZCBkZXJpbmdpbmcpICovCi0gICAgICAgICAgICBwcF9kZWNfeSA9IHZpZGVvLT5wc3RwcmNUeXBDdXIgKyBpbXY7Ci0gICAgICAgICAgICAqcHBfZGVjX3kgPSA0OwotICAgICAgICAgICAgKihwcF9kZWNfeSArIDEpID0gNDsKLSAgICAgICAgICAgICoocHBfZGVjX3kgKyBtdndpZHRoKSA9IDQ7Ci0gICAgICAgICAgICAqKHBwX2RlY195ICsgbXZ3aWR0aCArIDEpID0gNDsKLSAgICAgICAgICAgIHBwX2RlY191ID0gdmlkZW8tPnBzdHByY1R5cEN1ciArIChzaXplID4+IDYpICsKLSAgICAgICAgICAgICAgICAgICAgICAgKChpbXYgKyAoeHBvcyA+PiAzKSkgPj4gMik7Ci0gICAgICAgICAgICAqcHBfZGVjX3UgPSA0OwotICAgICAgICAgICAgcHBfZGVjX3Vbc2l6ZT4+OF0gPSA0OwotICAgICAgICB9Ci0gICAgfQotI2VuZGlmCiAKIAogICAgIC8qIHhwcmVkIGFuZCB5cHJlZCBjYWxjdWxhdGlvbiBmb3IgQ2hyb21pbmFuY2UgaXMgKi8KQEAgLTU2NiwxMyArNTIxLDYgQEAKICAgICBQSVhFTCAqY3ZfY29tcCwgKmN2X3ByZXY7CiAgICAgaW50IHdpZHRoLCB3aWR0aF91djsKICAgICBpbnQzMiBvZmZzZXQ7Ci0jaWZkZWYgUFZfUE9TVFBST0NfT04gLy8gMi8xNC8yMDAxICAgICAgCi0gICAgaW50IGltdjsKLSAgICBpbnQzMiBzaXplID0gKGludDMyKSB2aWRlby0+blRvdGFsTUIgPDwgODsKLSAgICB1aW50OCAqcHBfZGVjX3ksICpwcF9kZWNfdTsKLSAgICB1aW50OCAqcHBfcHJldjE7Ci0gICAgaW50IG12d2lkdGggPSB2aWRlby0+bk1CUGVyUm93IDw8IDE7Ci0jZW5kaWYKIAogICAgIHdpZHRoID0gdmlkZW8tPndpZHRoOwogICAgIHdpZHRoX3V2ICA9IHdpZHRoID4+IDE7CkBAIC02MDksMjggKzU1Nyw2IEBACiAgICAgUHV0U0tJUFBFRF9CKGN2X2NvbXAsIGN2X3ByZXYsIHdpZHRoX3V2KTsKIAogICAgIC8qICAxMC8yNC8yMDAwIHBvc3RfcHJvY2Vzc2luZyBzZW1hcGhvcmUgZ2VuZXJhdGlvbiAqLwotI2lmZGVmIFBWX1BPU1RQUk9DX09OIC8vIDIvMTQvMjAwMQotICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUgIT0gUFZfTk9fUE9TVF9QUk9DKQotICAgIHsKLSAgICAgICAgaW12ID0gKG9mZnNldCA+PiA2KSAtICh4cG9zID4+IDYpICsgKHhwb3MgPj4gMyk7Ci0gICAgICAgIC8qIFBvc3QtcHJvY2Vzc2luZyBtb2RlIChjb3B5IHByZXZpb3VzIE1CKSAqLwotICAgICAgICBwcF9wcmV2MSA9IHZpZGVvLT5wc3RwcmNUeXBQcnYgKyBpbXY7Ci0gICAgICAgIHBwX2RlY195ID0gdmlkZW8tPnBzdHByY1R5cEN1ciArIGltdjsKLSAgICAgICAgKnBwX2RlY195ID0gKnBwX3ByZXYxOwotICAgICAgICAqKHBwX2RlY195ICsgMSkgPSAqKHBwX3ByZXYxICsgMSk7Ci0gICAgICAgICoocHBfZGVjX3kgKyBtdndpZHRoKSA9ICoocHBfcHJldjEgKyBtdndpZHRoKTsKLSAgICAgICAgKihwcF9kZWNfeSArIG12d2lkdGggKyAxKSA9ICoocHBfcHJldjEgKyBtdndpZHRoICsgMSk7Ci0KLSAgICAgICAgLyogY2hyb21pbmFuY2UgKi8KLSAgICAgICAgLyo0Kk1CX2luX3dpZHRoKk1CX2luX2hlaWdodCovCi0gICAgICAgIHBwX3ByZXYxID0gdmlkZW8tPnBzdHByY1R5cFBydiArIChzaXplID4+IDYpICsKLSAgICAgICAgICAgICAgICAgICAoKGltdiArICh4cG9zID4+IDMpKSA+PiAyKTsKLSAgICAgICAgcHBfZGVjX3UgPSB2aWRlby0+cHN0cHJjVHlwQ3VyICsgKHNpemUgPj4gNikgKwotICAgICAgICAgICAgICAgICAgICgoaW12ICsgKHhwb3MgPj4gMykpID4+IDIpOwotICAgICAgICAqcHBfZGVjX3UgPSAqcHBfcHJldjE7Ci0gICAgICAgIHBwX2RlY191W3NpemU+PjhdID0gcHBfcHJldjFbc2l6ZT4+OF07Ci0gICAgfQotI2VuZGlmCiAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgogICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbXA0ZGVjX2xpYi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvbXA0ZGVjX2xpYi5oCmluZGV4IDljZDRlZGMuLmNlNmY5YzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL21wNGRlY19saWIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9tcDRkZWNfbGliLmgKQEAgLTE3MCwzNyArMTcwLDYgQEAKIAogICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwogICAgIC8qIGRlZmluZWQgaW4gcHBfc2VtYXBob3JlX2Nocm9tYV9pbnRlci5jICovCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICB2b2lkIHBwX3NlbWFwaG9yZV9jaHJvbWFfaW50ZXIoCi0gICAgICAgIGludCB4cHJlZCwgICAgICAvKiBpICovCi0gICAgICAgIGludCB5cHJlZCwgICAgICAvKiBpICovCi0gICAgICAgIHVpbnQ4ICAgKnBwX2RlY191LCAgLyogaS9vICovCi0gICAgICAgIHVpbnQ4ICAgKnBzdHByY1R5cFBydiwgIC8qIGkgKi8KLSAgICAgICAgaW50IGR4LCAgICAgLyogaSAqLwotICAgICAgICBpbnQgZHksICAgICAvKiBpICovCi0gICAgICAgIGludCBtdndpZHRoLCAgICAvKiBpICovCi0gICAgICAgIGludCBoZWlnaHQsICAgICAvKiBpICovCi0gICAgICAgIGludDMyICAgc2l6ZSwgICAgICAgLyogaSAqLwotICAgICAgICBpbnQgbXZfbG9jLCAgICAgLyogaSAqLwotICAgICAgICB1aW50OCAgIG1za19kZWJsb2NrIC8qIGkgKi8KLSAgICApOwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgLyogZGVmaW5lZCBpbiBwcF9zZW1hcGhvcmVfbHVtYS5jICovCi0gICAgdWludDggcHBfc2VtYXBob3JlX2x1bWEoCi0gICAgICAgIGludCB4cHJlZCwgICAgICAvKiBpICovCi0gICAgICAgIGludCB5cHJlZCwgICAgICAvKiBpICovCi0gICAgICAgIHVpbnQ4ICAgKnBwX2RlY195LCAgLyogaS9vICovCi0gICAgICAgIHVpbnQ4ICAgKnBzdHByY1R5cFBydiwgIC8qIGkgKi8KLSAgICAgICAgaW50ICpsbCwgICAgICAgIC8qIGkgKi8KLSAgICAgICAgaW50ICptdl9sb2MsICAgIC8qIGkvbyAqLwotICAgICAgICBpbnQgZHgsICAgICAvKiBpICovCi0gICAgICAgIGludCBkeSwgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IG12d2lkdGgsICAgIC8qIGkgKi8KLSAgICAgICAgaW50IHdpZHRoLCAgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IGhlaWdodCAgICAgIC8qIGkgKi8KLSAgICApOwotI2VuZGlmCiAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCiAgICAgLyogZGVmaW5lZCBpbiBnZXRfcHJlZF9hZHZfbWJfYWRkLmMgKi8KICAgICBpbnQgR2V0UHJlZEFkdmFuY2VkTUIoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wb3N0X2ZpbHRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wb3N0X2ZpbHRlci5jcHAKaW5kZXggYjM2MDUwYy4uMzdhMDNhMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcG9zdF9maWx0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3Bvc3RfZmlsdGVyLmNwcApAQCAtMjQsMTUyICsyNCw2IEBACiBjb25zdCBzdGF0aWMgaW50IFNUUkVOR1RIX3RhYltdID0gezAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDcsIDgsIDgsIDgsIDksIDksIDksIDEwLCAxMCwgMTAsIDExLCAxMSwgMTEsIDEyLCAxMiwgMTJ9OwogI2VuZGlmCiAKLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEZVTkNUSU9OIENPREUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotdm9pZCBQb3N0RmlsdGVyKAotICAgIFZpZGVvRGVjRGF0YSAqdmlkZW8sCi0gICAgaW50IGZpbHRlcl90eXBlLAotICAgIHVpbnQ4ICpvdXRwdXQpCi17Ci0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHVpbnQ4ICpwcF9tb2Q7Ci0gICAgaW50MTYgKlFQX3N0b3JlOwotICAgIGludCBjb21iaW5lZF93aXRoX2RlYmxvY2tfZmlsdGVyOwotICAgIGludCBuVG90YWxNQiA9IHZpZGVvLT5uVG90YWxNQjsKLSAgICBpbnQgd2lkdGgsIGhlaWdodDsKLSAgICBpbnQzMiBzaXplOwotICAgIGludCBzb2Z0RGVibG9ja2luZzsKLSAgICB1aW50OCAqZGVjb2RlZEZyYW1lID0gdmlkZW8tPnZpZGVvRGVjQ29udHJvbHMtPm91dHB1dEZyYW1lOwotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgd2lkdGggPSB2aWRlby0+d2lkdGg7Ci0gICAgaGVpZ2h0ID0gdmlkZW8tPmhlaWdodDsKLSAgICBzaXplID0gKGludDMyKXdpZHRoICogaGVpZ2h0OwotCi0gICAgb3NjbF9tZW1jcHkob3V0cHV0LCBkZWNvZGVkRnJhbWUsIHNpemUpOwotICAgIG9zY2xfbWVtY3B5KG91dHB1dCArIHNpemUsIGRlY29kZWRGcmFtZSArIHNpemUsIChzaXplID4+IDIpKTsKLSAgICBvc2NsX21lbWNweShvdXRwdXQgKyBzaXplICsgKHNpemUgPj4gMiksIGRlY29kZWRGcmFtZSArIHNpemUgKyAoc2l6ZSA+PiAyKSwgKHNpemUgPj4gMikpOwotCi0gICAgaWYgKGZpbHRlcl90eXBlID09IDApCi0gICAgICAgIHJldHVybjsKLQotICAgIC8qIFRoZSBzb2Z0RGVjb2RpbmcgY3V0b2ZmIGNvcnJlc3BvbmRzIHRvIH45MzAwMCBicHMgZm9yIFFDSUYgMTVmcHMgY2xpcCAgKi8KLSAgICBpZiAoUFZHZXREZWNCaXRyYXRlKHZpZGVvLT52aWRlb0RlY0NvbnRyb2xzKSA+ICgxMDAqdmlkZW8tPmZyYW1lUmF0ZSooc2l6ZSA+PiAxMikpKSAgLy8gTUNfc29mRGVibG9jawotICAgICAgICBzb2Z0RGVibG9ja2luZyA9IEZBTFNFOwotICAgIGVsc2UKLSAgICAgICAgc29mdERlYmxvY2tpbmcgPSBUUlVFOwotCi0gICAgY29tYmluZWRfd2l0aF9kZWJsb2NrX2ZpbHRlciA9IGZpbHRlcl90eXBlICYgUFZfREVCTE9DSzsKLSAgICBRUF9zdG9yZSA9IHZpZGVvLT5RUE1COwotCi0gICAgLyogTHVtYSAqLwotICAgIHBwX21vZCA9IHZpZGVvLT5wc3RwcmNUeXBDdXI7Ci0KLSAgICBpZiAoKGZpbHRlcl90eXBlICYgUFZfREVCTE9DSykgJiYgKGZpbHRlcl90eXBlICYgUFZfREVSSU5HKSkKLSAgICB7Ci0gICAgICAgIENvbWJpbmVkSG9yelZlcnRSaW5nRmlsdGVyKG91dHB1dCwgd2lkdGgsIGhlaWdodCwgUVBfc3RvcmUsIDAsIHBwX21vZCk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChmaWx0ZXJfdHlwZSAmIFBWX0RFQkxPQ0spCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzb2Z0RGVibG9ja2luZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb21iaW5lZEhvcnpWZXJ0RmlsdGVyKG91dHB1dCwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFQX3N0b3JlLCAwLCBwcF9tb2QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbWJpbmVkSG9yelZlcnRGaWx0ZXJfTm9Tb2Z0RGVibG9ja2luZyhvdXRwdXQsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFQX3N0b3JlLCAwLCBwcF9tb2QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChmaWx0ZXJfdHlwZSAmIFBWX0RFUklORykKLSAgICAgICAgewotICAgICAgICAgICAgRGVyaW5naW5nX0x1bWEob3V0cHV0LCB3aWR0aCwgaGVpZ2h0LCBRUF9zdG9yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkX3dpdGhfZGVibG9ja19maWx0ZXIsIHBwX21vZCk7Ci0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIENocm9tYSAqLwotCi0gICAgcHBfbW9kICs9IChuVG90YWxNQiA8PCAyKTsKLSAgICBvdXRwdXQgKz0gc2l6ZTsKLQotICAgIGlmICgoZmlsdGVyX3R5cGUgJiBQVl9ERUJMT0NLKSAmJiAoZmlsdGVyX3R5cGUgJiBQVl9ERVJJTkcpKQotICAgIHsKLSAgICAgICAgQ29tYmluZWRIb3J6VmVydFJpbmdGaWx0ZXIob3V0cHV0LCAoaW50KSh3aWR0aCA+PiAxKSwgKGludCkoaGVpZ2h0ID4+IDEpLCBRUF9zdG9yZSwgKGludCkgMSwgcHBfbW9kKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKGZpbHRlcl90eXBlICYgUFZfREVCTE9DSykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNvZnREZWJsb2NraW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbWJpbmVkSG9yelZlcnRGaWx0ZXIob3V0cHV0LCAoaW50KSh3aWR0aCA+PiAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGhlaWdodCA+PiAxKSwgUVBfc3RvcmUsIChpbnQpIDEsIHBwX21vZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29tYmluZWRIb3J6VmVydEZpbHRlcl9Ob1NvZnREZWJsb2NraW5nKG91dHB1dCwgKGludCkod2lkdGggPj4gMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGhlaWdodCA+PiAxKSwgUVBfc3RvcmUsIChpbnQpIDEsIHBwX21vZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGZpbHRlcl90eXBlICYgUFZfREVSSU5HKQotICAgICAgICB7Ci0gICAgICAgICAgICBEZXJpbmdpbmdfQ2hyb21hKG91dHB1dCwgKGludCkod2lkdGggPj4gMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKGhlaWdodCA+PiAxKSwgUVBfc3RvcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkX3dpdGhfZGVibG9ja19maWx0ZXIsIHBwX21vZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcF9tb2QgKz0gblRvdGFsTUI7Ci0gICAgb3V0cHV0ICs9IChzaXplID4+IDIpOwotCi0gICAgaWYgKChmaWx0ZXJfdHlwZSAmIFBWX0RFQkxPQ0spICYmIChmaWx0ZXJfdHlwZSAmIFBWX0RFUklORykpCi0gICAgewotICAgICAgICBDb21iaW5lZEhvcnpWZXJ0UmluZ0ZpbHRlcihvdXRwdXQsIChpbnQpKHdpZHRoID4+IDEpLCAoaW50KShoZWlnaHQgPj4gMSksIFFQX3N0b3JlLCAoaW50KSAxLCBwcF9tb2QpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAoZmlsdGVyX3R5cGUgJiBQVl9ERUJMT0NLKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc29mdERlYmxvY2tpbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29tYmluZWRIb3J6VmVydEZpbHRlcihvdXRwdXQsIChpbnQpKHdpZHRoID4+IDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoaGVpZ2h0ID4+IDEpLCBRUF9zdG9yZSwgKGludCkgMSwgcHBfbW9kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb21iaW5lZEhvcnpWZXJ0RmlsdGVyX05vU29mdERlYmxvY2tpbmcob3V0cHV0LCAoaW50KSh3aWR0aCA+PiAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoaGVpZ2h0ID4+IDEpLCBRUF9zdG9yZSwgKGludCkgMSwgcHBfbW9kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZmlsdGVyX3R5cGUgJiBQVl9ERVJJTkcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERlcmluZ2luZ19DaHJvbWEob3V0cHV0LCAoaW50KSh3aWR0aCA+PiAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkoaGVpZ2h0ID4+IDEpLCBRUF9zdG9yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluZWRfd2l0aF9kZWJsb2NrX2ZpbHRlciwgcHBfbW9kKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qICBzd2FwIGN1cnJlbnQgcHBfbW9kIHRvIHByZXZfZnJhbWUgcHBfbW9kICovCi0gICAgcHBfbW9kID0gdmlkZW8tPnBzdHByY1R5cEN1cjsKLSAgICB2aWRlby0+cHN0cHJjVHlwQ3VyID0gdmlkZW8tPnBzdHByY1R5cFBydjsKLSAgICB2aWRlby0+cHN0cHJjVHlwUHJ2ID0gcHBfbW9kOwotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHJldHVybjsKLX0KLSNlbmRpZgogCiAKICNpZmRlZiBQVl9BTk5FWF9JSktUX1NVUFBPUlQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3Bvc3RfcHJvY19zZW1hcGhvcmUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcG9zdF9wcm9jX3NlbWFwaG9yZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhYmM2YmUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcG9zdF9wcm9jX3NlbWFwaG9yZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNDcgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBJTlBVVCBBTkQgT1VUUFVUIERFRklOSVRJT05TCi0KLSBJbnB1dHM6Ci0gICAgcV9ibG9jayA9IHBvaW50ZXIgdG8gYnVmZmVyIG9mIGludmVyc2UgcXVhbnRpemVkIERDVCBjb2VmZmljaWVudHMgb2YgdHlwZQotICAgICAgICAgICAgICBpbnQgZm9yIGludHJhLVZPUCBtb2RlIG9yIGJ1ZmZlciBvZiByZXNpZHVhbCBkYXRhIG9mIHR5cGUgaW50Ci0gICAgICAgICAgICAgIGZvciBpbnRlci1WT1AgbW9kZQotCi0gTG9jYWwgU3RvcmVzL0J1ZmZlcnMvUG9pbnRlcnMgTmVlZGVkOgotICAgIE5vbmUKLQotIEdsb2JhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6Ci0gICAgTm9uZQotCi0gT3V0cHV0czoKLSAgICBwb3N0bW9kZSA9IHBvc3QgcHJvY2Vzc2luZyBzZW1hcGhvcmUgd2l0aCB0aGUgdmVydGljYWwgZGVibG9ja2luZywKLSAgICAgICAgICAgICAgIGhvcml6b250YWwgZGVibG9ja2luZywgYW5kIGRlcmluZ2luZyBiaXRzIHNldCB1cCBhY2NvcmRpbmdseQotCi0gUG9pbnRlcnMgYW5kIEJ1ZmZlcnMgTW9kaWZpZWQ6Ci0gICAgTm9uZQotCi0gTG9jYWwgU3RvcmVzIE1vZGlmaWVkOgotICAgIE5vbmUKLQotIEdsb2JhbCBTdG9yZXMgTW9kaWZpZWQ6Ci0gICAgTm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGVU5DVElPTiBERVNDUklQVElPTgotCi0gVGhpcyBmdW5jdGlvbiBzZXRzIHVwIHRoZSBwb3N0bW9kZSBzZW1hcGhvcmUgYmFzZWQgb24gdGhlIGNvbnRlbnRzIG9mIHRoZQotIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IHFfYmxvY2suIFRoZSBmdW5jdGlvbiBzdGFydHMgb3V0IHdpdGggdGhlIGFzc3VtcHRpb24KLSB0aGF0IGFsbCBlbnRyaWVzIG9mIHFfYmxvY2ssIGV4Y2VwdCBmb3IgdGhlIGZpcnN0IGVudHJ5IChxX2Jsb2NrWzBdKSwgYXJlCi0gemVyby4gVGhpcyBjYXNlIGNhbiBpbmR1Y2UgaG9yaXpvbnRhbCBhbmQgdmVydGljYWwgYmxvY2tpbmcgYXJ0aWZhY3RzLAotIHRoZXJlZm9yZSwgYm90aCBob3Jpem9udGFsIGFuZCB2ZXJ0aWNhbCBkZWJsb2NraW5nIGJpdHMgYXJlIGVuYWJsZWQuCi0KLSBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIHRlc3RlZCB3aGVuIHNldHRpbmcgdXAgdGhlIGhvcml6b250YWwvdmVydGljYWwKLSBkZWJsb2NraW5nIGFuZCBkZXJpbmdpbmcgYml0czoKLSAxLiBXaGVuIG9ubHkgdGhlIGVsZW1lbnRzIG9mIHRoZSB0b3Agcm93IG9mIHRoZSBCX1NJWkUgeCBCX1NJWkUgYmxvY2sKLSAgICAocV9ibG9ja1tuXSwgbiA9IDAsLi4uLCBCX1NJWkUtMSkgYXJlIG5vbi16ZXJvLCB2ZXJ0aWNhbCBibG9ja2luZyBhcnRpZmFjdHMKLSAgICBtYXkgcmVzdWx0LCB0aGVyZWZvcmUsIG9ubHkgdGhlIHZlcnRpY2FsIGRlYmxvY2tpbmcgYml0IGlzIGVuYWJsZWQuCi0gICAgT3RoZXJ3aXNlLCB0aGUgdmVydGljYWwgZGVibG9ja2luZyBiaXQgaXMgZGlzYWJsZWQuCi0gMi4gV2hlbiBvbmx5IHRoZSBlbGVtZW50cyBvZiB0aGUgZmFyIGxlZnQgY29sdW1uIG9mIHRoZSBCX1NJWkUgeCBCX1NJWkUgYmxvY2sKLSAgICAocV9ibG9ja1tuKkJfU0laRV0sIG4gPSAwLCAuLi4sIEJfU0laRS0xKSBhcmUgbm9uLXplcm8sIGhvcml6b250YWwgYmxvY2tpbmcKLSAgICBhcnRpZmFjdHMgbWF5IHJlc3VsdCwgdGhlcmVmb3JlLCBvbmx5IHRoZSBob3Jpem9udGFsIGRlYmxvY2tpbmcgYml0IGlzCi0gICAgZW5hYmxlZC4gT3RoZXJ3aXNlLCB0aGUgaG9yaXpvbnRhbCBkZWJsb2NraW5nIGJpdCBpcyBkaXNhYmxlZC4KLSAzLiBJZiBhbnkgbm9uLXplcm8gZWxlbWVudHMgZXhpc3QgaW4gcG9zaXRpb25zIG90aGVyIHRoYW4gcV9ibG9ja1swXSwKLSAgICBxX2Jsb2NrWzFdLCBvciBxX2Jsb2NrW0JfU0laRV0sIHRoZSBkZXJpbmdpbmcgYml0IGlzIGVuYWJsZWQuIE90aGVyd2lzZSwKLSAgICBpdCBpcyBkaXNhYmxlZC4KLQotIFRoZSAzIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgcG9zdG1vZGUgZGVmaW5lcyB2ZXJ0aWNhbCBvciBob3Jpem9udGFsCi0gZGVibG9ja2luZyBhbmQgZGVyaW5naW5nLgotCi0gVGhlIHZhbGlkIHZhbHVlcyBhcmUgc2hvd24gYmVsb3c6Ci0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIHwgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgIHwgRW5hYmxlZCB8IERpc2FibGVkIHwKLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gfCBWZXJ0aWNhbCBEZWJsb2NraW5nIChCaXQgIzApICAgfCAgICAxICAgIHwgICAgIDAgICAgfAotIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSB8IEhvcml6b250YWwgRGVibG9ja2luZyAoQml0ICMxKSB8ICAgIDEgICAgfCAgICAgMCAgICB8Ci0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIHwgRGVyaW5naW5nIChCaXQgIzIpICAgICAgICAgICAgIHwgICAgMSAgICB8ICAgICAwICAgIHwKLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IElOQ0xVREVTCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlICAgICJtcDRkZWNfbGliLmgiCi0jaW5jbHVkZSAgICAibXA0ZGVmLmgiCi0jaW5jbHVkZSAgICAicG9zdF9wcm9jLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBNQUNST1MKLTsgRGVmaW5lIG1vZHVsZSBzcGVjaWZpYyBtYWNyb3MgaGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERFRklORVMKLTsgSW5jbHVkZSBhbGwgcHJlLXByb2Nlc3NvciBzdGF0ZW1lbnRzIGhlcmUuIEluY2x1ZGUgY29uZGl0aW9uYWwKLTsgY29tcGlsZSB2YXJpYWJsZXMgYWxzby4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTE9DQUwgRlVOQ1RJT04gREVGSU5JVElPTlMKLTsgRnVuY3Rpb24gUHJvdG90eXBlIGRlY2xhcmF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IExPQ0FMIFNUT1JFL0JVRkZFUi9QT0lOVEVSIERFRklOSVRJT05TCi07IFZhcmlhYmxlIGRlY2xhcmF0aW9uIC0gZGVmaW5lZCBoZXJlIGFuZCB1c2VkIG91dHNpZGUgdGhpcyBtb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRVhURVJOQUwgRlVOQ1RJT04gUkVGRVJFTkNFUwotOyBEZWNsYXJlIGZ1bmN0aW9ucyBkZWZpbmVkIGVsc2V3aGVyZSBhbmQgcmVmZXJlbmNlZCBpbiB0aGlzIG1vZHVsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFWFRFUk5BTCBHTE9CQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgUkVGRVJFTkNFUwotOyBEZWNsYXJlIHZhcmlhYmxlcyB1c2VkIGluIHRoaXMgbW9kdWxlIGJ1dCBkZWZpbmVkIGVsc2V3aGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBGVU5DVElPTiBDT0RFCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLWludCBQb3N0UHJvY1NlbWFwaG9yZSgKLSAgICBpbnQxNiAqcV9ibG9jaykKLXsKLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IERlZmluZSBhbGwgbG9jYWwgdmFyaWFibGVzCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgaW50IGksIGo7Ci0KLSAgICAvKiBTZXQgZGVmYXVsdCB2YWx1ZSB0byB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBkZWJsb2NraW5nIGVuYWJsZWQgKi8KLSAgICAvKiBJbml0aWFsIGFzc3VtcHRpb24gaXMgdGhhdCBvbmx5IHFfYmxvY2tbMF0gZWxlbWVudCBpcyBub24temVybywgKi8KLSAgICAvKiB0aGVyZWZvcmUsIHZlcnRpY2FsIGFuZCBob3Jpem9udGFsIGRlYmxvY2tpbmcgYml0cyBhcmUgc2V0IHRvIDEgKi8KLSAgICBpbnQgcG9zdG1vZGUgPSAweDM7Ci0KLSAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICA7IEZ1bmN0aW9uIGJvZHkgaGVyZQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIC8qIFZlcnRpY2FsIGRlYmxvY2tpbmcgYml0IGlzIGVuYWJsZWQgd2hlbiBvbmx5IHRoZSBlbnRpcmUgdG9wIHJvdyBvZiAgICovCi0gICAgLyogdGhlIEJfU0laRSB4IEJfU0laRSBibG9jaywgaS5lLiwgcV9ibG9ja1tuXSwgbiA9IDAsLi4uLCBCX1NJWkUtMSwgICAgKi8KLSAgICAvKiBhcmUgbm9uLXplcm8uIFNpbmNlIGluaXRpYWwgYXNzdW1wdGlvbiBpcyB0aGF0IGFsbCBlbGVtZW50cywgZXhjZXB0ICAqLwotICAgIC8qIHFfYmxvY2tbMF0sIGlzIHplcm8sIHdlIG5lZWQgdG8gY2hlY2sgdGhlIHJlbWFpbmluZyBlbGVtZW50cyBpbiB0aGUgICovCi0gICAgLyogdG9wIHJvdyB0byAgZGV0ZXJtaW5lIGlmIGFsbCBvciBzb21lIGFyZSBub24temVyby4gICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAocV9ibG9ja1sxXSAhPSAwKQotICAgIHsKLSAgICAgICAgLyogQXQgdGhpcyBwb2ludCwgcV9ibG9ja1swXSBhbmQgcV9ibG9ja1sxXSBhcmUgbm9uLXplcm8sIHdoaWxlICovCi0gICAgICAgIC8qIHFfYmxvY2tbbl0sIG4gPSAyLC4uLiwgQl9TSVpFLTEsIGFyZSB6ZXJvLiBUaGVyZWZvcmUsIHdlICAgICAqLwotICAgICAgICAvKiBuZWVkIHRvIGRpc2FibGUgdmVydGljYWwgZGVibG9ja2luZyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgcG9zdG1vZGUgJj0gMHhFOwotICAgIH0KLQotICAgIGZvciAoaSA9IDI7IGkgPCBCX1NJWkU7IGkrKykKLSAgICB7Ci0gICAgICAgIGlmIChxX2Jsb2NrW2ldKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDaGVjayBpZiBxX2Jsb2NrW25dLCBuID0gMiwuLi4sIEJfU0laRS0xLCBhcmUgbm9uLXplcm8uKi8KLSAgICAgICAgICAgIC8qIElmIGFueSBvZiB0aGVtIHR1cm4gb3V0IHRvIGJlIG5vbi16ZXJvLCB3ZSBuZWVkIHRvICAgICAqLwotICAgICAgICAgICAgLyogZGlzYWJsZSB2ZXJ0aWNhbCBkZWJsb2NraW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwb3N0bW9kZSAmPSAweEU7Ci0KLSAgICAgICAgICAgIC8qIERlcmluZ2luZyBpcyBlbmFibGVkIGlmIGFueSBub256ZXJvIGVsZW1lbnRzIGV4aXN0IGluICovCi0gICAgICAgICAgICAvKiBwb3NpdGlvbnMgb3RoZXIgdGhhbiBxX2Jsb2NrWzBdLCBxX2Jsb2NrWzFdIG9yICAgICAgICAqLwotICAgICAgICAgICAgLyogcV9ibG9ja1tCX1NJWkVdLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHBvc3Rtb2RlIHw9IDB4NDsKLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBIb3Jpem9udGFsIGRlYmxvY2tpbmcgYml0IGlzIGVuYWJsZWQgd2hlbiBvbmx5IHRoZSBlbnRpcmUgZmFyICovCi0gICAgLyogbGVmdCBjb2x1bW4sIGkuZS4sIHFfYmxvY2tbbipCX1NJWkVdLCBuID0gMCwgLi4uLCBCX1NJWkUtMSwgICAqLwotICAgIC8qIGFyZSBub24temVyby4gU2luY2UgaW5pdGlhbCBhc3N1bXB0aW9uIGlzIHRoYXQgYWxsIGVsZW1lbnRzLCAgKi8KLSAgICAvKiBleGNlcHQgcV9ibG9ja1swXSwgaXMgemVybywgd2UgbmVlZCB0byBjaGVjayB0aGUgcmVtYWluaW5nICAgICovCi0gICAgLyogZWxlbWVudHMgaW4gdGhlIGZhciBsZWZ0IGNvbHVtbiB0byBkZXRlcm1pbmUgaWYgYWxsIG9yIHNvbWUgICAqLwotICAgIC8qIGFyZSBub24temVyby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICBpZiAocV9ibG9ja1tCX1NJWkVdKQotICAgIHsKLSAgICAgICAgLyogQXQgdGhpcyBwb2ludCwgb25seSBxX2Jsb2NrWzBdIGFuZCBxX2Jsb2NrW0JfU0laRV0gYXJlIG5vbi16ZXJvLCAqLwotICAgICAgICAvKiB3aGlsZSBxX2Jsb2NrW24qQl9TSVpFXSwgbiA9IDIsIDMsLi4uLCBCX1NJWkUtMSwgYXJlIHplcm8uICAgICAgICovCi0gICAgICAgIC8qIFRoZXJlZm9yZSwgd2UgbmVlZCB0byBkaXNhYmxlIGhvcml6b250YWwgZGVibG9ja2luZy4gICAgICAgICAgICAgKi8KLSAgICAgICAgcG9zdG1vZGUgJj0gMHhEOwotICAgIH0KLQotICAgIGZvciAoaSA9IDE2OyBpIDwgTkNPRUZGX0JMT0NLOyBpICs9IEJfU0laRSkKLSAgICB7Ci0gICAgICAgIGlmIChxX2Jsb2NrW2ldKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBDaGVjayBpZiBxX2Jsb2NrW25dLCBuID0gMipCX1NJWkUsLi4uLChCX1NJWkUtMSkqQl9TSVpFLCAgKi8KLSAgICAgICAgICAgIC8qIGFyZSBub24temVyby4gSWYgYW55IG9mIHRoZW0gdHVybiBvdXQgdG8gYmUgbm9uLXplcm8sICAgICAqLwotICAgICAgICAgICAgLyogd2UgbmVlZCB0byBkaXNhYmxlIGhvcml6b250YWwgZGVibG9ja2luZy4gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwb3N0bW9kZSAmPSAweEQ7Ci0KLSAgICAgICAgICAgIC8qIERlcmluZ2luZyBpcyBlbmFibGVkIGlmIGFueSBub256ZXJvIGVsZW1lbnRzIGV4aXN0IGluICovCi0gICAgICAgICAgICAvKiBwb3NpdGlvbnMgb3RoZXIgdGhhbiBxX2Jsb2NrWzBdLCBxX2Jsb2NrWzFdIG9yICAgICAgICAqLwotICAgICAgICAgICAgLyogcV9ibG9ja1tCX1NJWkVdLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHBvc3Rtb2RlIHw9IDB4NDsKLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBBdCB0aGlzIHBvaW50LCBvbmx5IHRoZSBmaXJzdCByb3cgYW5kIGZhciBsZWZ0IGNvbHVtbiBlbGVtZW50cyAqLwotICAgIC8qIGhhdmUgYmVlbiB0ZXN0ZWQuIElmIGRlcmluZ2luZyBiaXQgaXMgc3RpbGwgbm90IHNldCBhdCB0aGlzICAgICovCi0gICAgLyogcG9pbnQsIGNoZWNrIHRoZSByZXN0IG9mIHFfYmxvY2sgdG8gZGV0ZXJtaW5lIGlmIHRoZSBlbGVtZW50cyAgKi8KLSAgICAvKiBhcmUgbm9uLXplcm8uIElmIGFsbCBlbGVtZW50cywgYmVzaWRlcyBxX2Jsb2NrWzBdLCBxX2Jsb2NrWzFdLCAqLwotICAgIC8qIG9yIHFfYmxvY2tbQl9TSVpFXSBhcmUgbm9uLXplcm8sIGRlcmluZ2luZyBiaXQgbXVzdCBiZSBzZXQgICAgICovCi0gICAgaWYgKChwb3N0bW9kZSAmIDB4NCkgPT0gMCkKLSAgICB7Ci0gICAgICAgIGZvciAoaSA9IDE7IGkgPCBCX1NJWkU7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChqID0gMTsgaiA8IEJfU0laRTsgaisrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChxX2Jsb2NrWyhpPDwzKStqXSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qIEF0IHRoaXMgcG9pbnQsIHFfYmxvY2tbMF0gYW5kIGFub3RoZXIgcV9ibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAvKiBlbGVtZW50IGFyZSBub24temVybywgdGhlcmVmb3JlLCB3ZSBuZWVkIHRvICAgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogZGlzYWJsZSB2ZXJ0aWNhbCBhbmQgaG9yaXpvbnRhbCBkZWJsb2NraW5nICAgICovCi0gICAgICAgICAgICAgICAgICAgIHBvc3Rtb2RlICY9IDB4QzsKLQotICAgICAgICAgICAgICAgICAgICAvKiBEZXJpbmdpbmcgaXMgZW5hYmxlZCBpZiBhbnkgbm9uemVybyBlbGVtZW50cyBleGlzdCBpbiAqLwotICAgICAgICAgICAgICAgICAgICAvKiBwb3NpdGlvbnMgb3RoZXIgdGhhbiBxX2Jsb2NrWzBdLCBxX2Jsb2NrWzFdIG9yICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAvKiBxX2Jsb2NrW0JfU0laRV0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBwb3N0bW9kZSB8PSAweDQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogU2V0IG91dGVyIEZPUiBsb29wIGNvdW50IHRvIEJfU0laRSB0byBnZXQgb3V0IG9mICovCi0gICAgICAgICAgICAgICAgICAgIC8qIG91dGVyIEZPUiBsb29wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBpID0gQl9TSVpFOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIEdldCBvdXQgb2YgaW5uZXIgRk9SIGxvb3AgKi8KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBSZXR1cm4gbm90aGluZyBvciBkYXRhIG9yIGRhdGEgcG9pbnRlcgotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHJldHVybiAocG9zdG1vZGUpOwotfQotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3BwX3NlbWFwaG9yZV9jaHJvbWFfaW50ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHBfc2VtYXBob3JlX2Nocm9tYV9pbnRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjMjAyMjIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHBfc2VtYXBob3JlX2Nocm9tYV9pbnRlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyNjIgKzAsMCBAQAotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiBDb3B5cmlnaHQgKEMpIDE5OTgtMjAwOSBQYWNrZXRWaWRlbwotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlcgotICogZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zCi0gKiBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKi8KLS8qCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBJTlBVVCBBTkQgT1VUUFVUIERFRklOSVRJT05TCi0KLSBJbnB1dHM6Ci0gICAgeHByZWQgPSB4LWF4aXMgY29vcmRpbmF0ZSBvZiB0aGUgYmxvY2sgdXNlZCBmb3IgcHJlZGljdGlvbiAoaW50KQotICAgIHlwcmVkID0geS1heGlzIGNvb3JkaW5hdGUgb2YgdGhlIGJsb2NrIHVzZWQgZm9yIHByZWRpY3Rpb24gKGludCkKLSAgICBwcF9kZWNfdSA9IHBvaW50ZXIgdG8gdGhlIHBvc3QgcHJvY2Vzc2luZyBzZW1hcGhvcmUgZm9yIGNocm9taW5hbmNlCi0gICAgICAgICAgICAgICAodWludDgpCi0gICAgcHN0cHJjVHlwUHJ2ID0gcG9pbnRlciB0aGUgcHJldmlvdXMgZnJhbWUncyBwb3N0IHByb2Nlc3NpbmcgdHlwZQotICAgICAgICAgICAgICAgICAgICh1aW50OCkKLSAgICBkeCA9IGhvcml6b250YWwgY29tcG9uZW50IG9mIHRoZSBtb3Rpb24gdmVjdG9yIChpbnQpCi0gICAgZHkgPSB2ZXJ0aWNhbCBjb21wb25lbnQgb2YgdGhlIG1vdGlvbiB2ZWN0b3IgKGludCkKLSAgICBtdndpZHRoID0gbnVtYmVyIG9mIGJsb2NrcyBwZXIgcm93IGluIHRoZSBsdW1pbmFuY2UgVk9QIChpbnQpCi0gICAgaGVpZ2h0ID0gbHVtaW5hbmNlIFZPUCBoZWlnaHQgaW4gcGl4ZWxzIChpbnQpCi0gICAgc2l6ZSA9IHRvdGFsIG51bWJlciBvZiBwaXhlbCBpbiB0aGUgY3VycmVudCBsdW1pbmFuY2UgVk9QIChpbnQpCi0gICAgbXZfbG9jID0gZmxhZyBpbmRpY2F0aW5nIGxvY2F0aW9uIG9mIHRoZSBtb3Rpb24gY29tcGVuc2F0ZWQKLSAgICAgICAgICh4LHkpIHBvc2l0aW9uIHdpdGggcmVzcGVjdCB0byB0aGUgbHVtaW5hbmNlIE1CIChpbnQpOwotICAgICAgICAgMCAtPiBpbnNpZGUgTUIsIDEgLT4gb3V0c2lkZSBNQgotICAgIG1za19kZWJsb2NrID0gZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gcGVyZm9ybSBkZWJsb2NraW5nCi0gICAgICAgICAgICAgIChtc2tfZGVibG9jayA9IDApIG9yIG5vdCAobXNrX2RlYmxvY2sgPSAxKSAodWludDgpCi0KLSBMb2NhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6Ci0gICAgTm9uZQotCi0gR2xvYmFsIFN0b3Jlcy9CdWZmZXJzL1BvaW50ZXJzIE5lZWRlZDoKLSAgICBOb25lCi0KLSBPdXRwdXRzOgotICAgIE5vbmUKLQotIFBvaW50ZXJzIGFuZCBCdWZmZXJzIE1vZGlmaWVkOgotICAgIHBwX2RlY191IGNvbnRlbnRzIGFyZSB0aGUgdXBkYXRlZCBzZW1hcGhvcmUgcHJvcGFnYXRpb24gZGF0YQotCi0gTG9jYWwgU3RvcmVzIE1vZGlmaWVkOgotICAgIE5vbmUKLQotIEdsb2JhbCBTdG9yZXMgTW9kaWZpZWQ6Ci0gICAgTm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGVU5DVElPTiBERVNDUklQVElPTgotCi0gVGhpcyBmdW5jdGlvbnMgcGVyZm9ybXMgcG9zdCBwcm9jZXNzaW5nIHNlbWFwaG9yZSBwcm9wYWdhdGlvbiBwcm9jZXNzaW5nCi0gYWZ0ZXIgY2hyb21pbmFuY2UgcHJlZGljdGlvbiBpbiBpbnRlcmZyYW1lIHByb2Nlc3NpbmcgbW9kZS4KLQotKi8KLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgSU5DTFVERVMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2luY2x1ZGUgICAgIm1wNGRlY19hcGkuaCIKLSNpbmNsdWRlICAgICJtcDRkZWYuaCIKLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IE1BQ1JPUwotOyBEZWZpbmUgbW9kdWxlIHNwZWNpZmljIG1hY3JvcyBoZXJlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IERFRklORVMKLTsgSW5jbHVkZSBhbGwgcHJlLXByb2Nlc3NvciBzdGF0ZW1lbnRzIGhlcmUuIEluY2x1ZGUgY29uZGl0aW9uYWwKLTsgY29tcGlsZSB2YXJpYWJsZXMgYWxzby4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgTE9DQUwgRlVOQ1RJT04gREVGSU5JVElPTlMKLTsgRnVuY3Rpb24gUHJvdG90eXBlIGRlY2xhcmF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IExPQ0FMIFNUT1JFL0JVRkZFUi9QT0lOVEVSIERFRklOSVRJT05TCi07IFZhcmlhYmxlIGRlY2xhcmF0aW9uIC0gZGVmaW5lZCBoZXJlIGFuZCB1c2VkIG91dHNpZGUgdGhpcyBtb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRVhURVJOQUwgRlVOQ1RJT04gUkVGRVJFTkNFUwotOyBEZWNsYXJlIGZ1bmN0aW9ucyBkZWZpbmVkIGVsc2V3aGVyZSBhbmQgcmVmZXJlbmNlZCBpbiB0aGlzIG1vZHVsZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBFWFRFUk5BTCBHTE9CQUwgU1RPUkUvQlVGRkVSL1BPSU5URVIgUkVGRVJFTkNFUwotOyBEZWNsYXJlIHZhcmlhYmxlcyB1c2VkIGluIHRoaXMgbW9kdWxlIGJ1dCBkZWZpbmVkIGVsc2V3aGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIgotewotI2VuZGlmCi0gICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgOyBGVU5DVElPTiBDT0RFCi0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgdm9pZCBwcF9zZW1hcGhvcmVfY2hyb21hX2ludGVyKAotICAgICAgICBpbnQgeHByZWQsICAgICAgLyogaSAqLwotICAgICAgICBpbnQgeXByZWQsICAgICAgLyogaSAqLwotICAgICAgICB1aW50OCAgICpwcF9kZWNfdSwgIC8qIGkvbyAqLwotICAgICAgICB1aW50OCAgICpwc3RwcmNUeXBQcnYsICAvKiBpICovCi0gICAgICAgIGludCBkeCwgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IGR5LCAgICAgLyogaSAqLwotICAgICAgICBpbnQgbXZ3aWR0aCwgICAgLyogaSAqLwotICAgICAgICBpbnQgaGVpZ2h0LCAgICAgLyogaSAqLwotICAgICAgICBpbnQzMiAgIHNpemUsICAgICAgIC8qIGkgKi8KLSAgICAgICAgaW50IG12X2xvYywgICAgIC8qIGkgKi8KLSAgICAgICAgdWludDggICBtc2tfZGVibG9jayAvKiBpICovCi0gICAgKQotICAgIHsKLSAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsgRGVmaW5lIGFsbCBsb2NhbCB2YXJpYWJsZXMKLSAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICAgIGludCBtbXZ5LCBtbXZ4LCBubXZ5LCBubXZ4OwotICAgICAgICB1aW50OCAqcHBfcHJldjEsICpwcF9wcmV2MiwgKnBwX3ByZXYzLCAqcHBfcHJldjQ7Ci0KLSAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsgRnVuY3Rpb24gYm9keSBoZXJlCi0gICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0gICAgICAgIC8qIDA5LzI4LzIwMDAsIG1vZGlmeSBzZW1hcGhvcmUgcHJvcGFnYXRpb24gdG8gKi8KLSAgICAgICAgLyogYWNjb21tb2RhdGUgc21hcnQgaW5kZXhpbmcgKi8KLSAgICAgICAgbW12eCA9IHhwcmVkID4+IDQ7ICAvKiBibG9jayB4IGNvb3IgKi8KLSAgICAgICAgbm12eCA9IG1tdng7Ci0KLSAgICAgICAgbW12eSA9IHlwcmVkID4+IDQ7ICAvKiBibG9jayB5IGNvb3IgKi8KLSAgICAgICAgbm12eSA9IG1tdnk7Ci0KLSAgICAgICAgLyogQ2hlY2sgaWYgTVYgaXMgb3V0c2lkZSB0aGUgZnJhbWUgKi8KLSAgICAgICAgaWYgKG12X2xvYyA9PSAxKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBQZXJmb3JtIGJvdW5kYXJ5IGNoZWNrICovCi0gICAgICAgICAgICBpZiAobm12eCA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbm12eCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChubXZ4ID4gbXZ3aWR0aCAtIDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbm12eCA9IG12d2lkdGggLSAxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobm12eSA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbm12eSA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChubXZ5ID4gKGhlaWdodCA+PiA0KSAtIDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbm12eSA9IChoZWlnaHQgPj4gNCkgLSAxOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ2FsY3VsYXRlIHBvaW50ZXIgdG8gZmlyc3QgY2hyb21pbmFuY2UgYiBzZW1hcGhvcmVzIGluICAgICAgICovCi0gICAgICAgIC8qIHBzdHByY1R5cFBydiwgaS5lLiwgZmlyc3QgY2hyb21pbmFuY2UgYiBzZW1hcGhvcmUgaXMgaW4gICAgICAqLwotICAgICAgICAvKiAocHN0cHJjVHlwUHJ2ICsgKHNpemU+PjYpKS4gICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiBTaW5jZSB0b3RhbCBudW1iZXIgb2YgY2hyb21pbmFuY2UgYmxvY2tzIHBlciByb3cgaW4gYSBWT1AgICAgKi8KLSAgICAgICAgLyogaXMgaGFsZiBvZiB0aGUgdG90YWwgbnVtYmVyIG9mIGx1bWluYW5jZSBibG9ja3MgcGVyIHJvdyBpbiBhICovCi0gICAgICAgIC8qIFZPUCwgd2UgdXNlIChtdndpZHRoID4+IDEpIHdoZW4gY2FsY3VsYXRpbmcgdGhlIHJvdyBvZmZzZXQuICAqLwotICAgICAgICBwcF9wcmV2MSA9IHBzdHByY1R5cFBydiArIChzaXplID4+IDYpICsgbm12eCArIG5tdnkgKiAobXZ3aWR0aCA+PiAxKSA7Ci0KLSAgICAgICAgLyogQ2hlY2sgaWYgTVYgaXMgYSBtdWx0aXBsZSBvZiAxNiAqLwotICAgICAgICAvKiAgMS81LzAxLCBtYWtlIHN1cmUgaXQgZG9lc24ndCBnbyBvdXQgb2YgYm91bmQgKi8KLSAgICAgICAgaWYgKCgoZHkmMHhGKSAhPSAwKSAmJiAobW12eSArIDEgPCAoaGVpZ2h0ID4+IDQpIC0gMSkpCi0gICAgICAgIHsgICAvKiBkeSBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAqLwotCi0gICAgICAgICAgICAvKiBwcF9wcmV2MyBpcyB0aGUgYmxvY2sgYmVsb3cgcHBfcHJldjEgYmxvY2sgKi8KLSAgICAgICAgICAgIHBwX3ByZXYzID0gcHBfcHJldjEgKyAobXZ3aWR0aCA+PiAxKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsgICAvKiBkeSBpcyBhIG11bHRpcGxlIG9mIDE2ICovCi0gICAgICAgICAgICBwcF9wcmV2MyA9IHBwX3ByZXYxOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogIDEvNS8wMSwgbWFrZSBzdXJlIGl0IGRvZXNuJ3QgZ28gb3V0IG9mIGJvdW5kICovCi0gICAgICAgIGlmICgoKGR4JjB4RikgIT0gMCkgJiYgKG1tdnggKyAxIDwgKG12d2lkdGggPj4gMSkgLSAxKSkKLSAgICAgICAgeyAgIC8qIGR4IGlzIG5vdCBhIG11bHRpcGxlIG9mIDE2ICovCi0KLSAgICAgICAgICAgIC8qIHBwX3ByZXYyIGlzIHRoZSBibG9jayB0byB0aGUgcmlnaHQgb2YgcHBfcHJldjEgYmxvY2sgKi8KLSAgICAgICAgICAgIHBwX3ByZXYyID0gcHBfcHJldjEgKyAxOwotCi0gICAgICAgICAgICAvKiBwcF9wcmV2NCBpcyB0aGUgYmxvY2sgdG8gdGhlIHJpZ2h0IG9mIHRoZSBibG9jayAqLwotICAgICAgICAgICAgLyogYmVsb3cgcHBfcHJldjEgYmxvY2sgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHBwX3ByZXY0ID0gcHBfcHJldjMgKyAxOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgeyAgIC8qIGR4IGlzIGEgbXVsdGlwbGUgb2YgMTYgKi8KLQotICAgICAgICAgICAgcHBfcHJldjIgPSBwcF9wcmV2MTsKLSAgICAgICAgICAgIHBwX3ByZXY0ID0gcHBfcHJldjM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBBZHZhbmNlIG9mZnNldCB0byBsb2NhdGlvbiBvZiBmaXJzdCBDaHJvbWluYW5jZSBSIHNlbWFwaG9yZSBpbiAqLwotICAgICAgICAvKiBwc3RwcmNUeXBQcnYuIFNpbmNlIHRoZSBudW1iZXIgb2YgcGl4ZWxzIGluIGEgQ2hyb21pbmFuY2UgVk9QICAqLwotICAgICAgICAvKiBpcyAobnVtYmVyIG9mIHBpeGVscyBpbiBMdW1pbmFuY2UgVk9QLzQpLCBhbmQgdGhlcmUgYXJlIDY0ICAgICAqLwotICAgICAgICAvKiBwaXhlbHMgaW4gYW4gOHg4IENocm9taW5hbmNlIGJsb2NrLCB0aGUgb2Zmc2V0IGNhbiBiZSAgICAgICovCi0gICAgICAgIC8qIGNhbGN1bGF0ZWQgYXM6ICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICBtdl9sb2MgPSAobnVtYmVyIG9mIHBpeGVscyBpbiBMdW1pbmFuY2UgVk9QLyg0KjY0KSkgICAqLwotICAgICAgICAvKiAgICAgICAgID0gc2l6ZS8yNTYgPSBzaXplPj44ICAgICAgICAgICAgICAgKi8KLSAgICAgICAgbXZfbG9jID0gKHNpemUgPj4gOCk7Ci0KLSAgICAgICAgLyogIDExLzMvMDAsIGNoYW5nZSB0aGUgcHJvcGFnYXRpb24gZm9yIGRlYmxvY2tpbmcgKi8KLSAgICAgICAgaWYgKG1za19kZWJsb2NrID09IDApCi0gICAgICAgIHsKLQotICAgICAgICAgICAgLyogRGVibG9ja2luZyBzZW1hcGhvcmUgcHJvcGFnYXRpb24gZm9yIENocm9taW5hbmNlICovCi0gICAgICAgICAgICAvKiBiIHNlbWFwaG9yZXMgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgKihwcF9kZWNfdSkgPSAwOwotCi0gICAgICAgICAgICAvKiBBZHZhbmNlIG9mZnNldCB0byBwb2ludCB0byBDaHJvbWluYW5jZSByIHNlbWFwaG9yZXMgKi8KLSAgICAgICAgICAgIHBwX2RlY191ICs9IG12X2xvYzsKLQotICAgICAgICAgICAgLyogRGVibG9ja2luZyBzZW1hcGhvcmUgcHJvcGFnYXRpb24gZm9yIENocm9taW5hbmNlICovCi0gICAgICAgICAgICAvKiByIHNlbWFwaG9yZXMgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgKihwcF9kZWNfdSkgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogRGVyaW5naW5nIHNlbWFwaG9yZSBwcm9wYWdhdGlvbiBmb3IgQ2hyb21pbmFuY2UgQiBibG9jayAqLwotICAgICAgICAgICAgaWYgKCgqKHBwX2RlY191KSY0KSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICoocHBfZGVjX3UpIHw9ICgoKihwcF9wcmV2MSkgfCAqKHBwX3ByZXYyKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHBwX3ByZXYzKSB8ICoocHBfcHJldjQpKSAmIDB4NCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIEFkdmFuY2Ugb2Zmc2V0IHRvIHBvaW50IHRvIENocm9taW5hbmNlIHIgc2VtYXBob3JlcyAqLwotICAgICAgICAgICAgcHBfZGVjX3UgKz0gbXZfbG9jOwotICAgICAgICAgICAgcHBfcHJldjEgKz0gbXZfbG9jOwotICAgICAgICAgICAgcHBfcHJldjIgKz0gbXZfbG9jOwotICAgICAgICAgICAgcHBfcHJldjMgKz0gbXZfbG9jOwotICAgICAgICAgICAgcHBfcHJldjQgKz0gbXZfbG9jOwotCi0gICAgICAgICAgICAvKiBEZXJpbmdpbmcgc2VtYXBob3JlIHByb3BhZ2F0aW9uIGZvciBDaHJvbWluYW5jZSBSICovCi0gICAgICAgICAgICBpZiAoKCoocHBfZGVjX3UpJjQpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKihwcF9kZWNfdSkgfD0gKCgqKHBwX3ByZXYxKSB8ICoocHBfcHJldjIpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHBfcHJldjMpIHwgKihwcF9wcmV2NCkpICYgMHg0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICA7IFJldHVybiBub3RoaW5nIG9yIGRhdGEgb3IgZGF0YSBwb2ludGVyCi0gICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgICAgICByZXR1cm47Ci0gICAgfQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wcF9zZW1hcGhvcmVfbHVtYS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wcF9zZW1hcGhvcmVfbHVtYS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzYTFlYmQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHBfc2VtYXBob3JlX2x1bWEuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogQ29weXJpZ2h0IChDKSAxOTk4LTIwMDkgUGFja2V0VmlkZW8KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIKLSAqIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucwotICogYW5kIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICovCi0vKgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gSU5QVVQgQU5EIE9VVFBVVCBERUZJTklUSU9OUwotCi0gSW5wdXRzOgotICAgIHhwcmVkID0geC1heGlzIGNvb3JkaW5hdGUgb2YgdGhlIE1CIHVzZWQgZm9yIHByZWRpY3Rpb24gKGludCkKLSAgICB5cHJlZCA9IHktYXhpcyBjb29yZGluYXRlIG9mIHRoZSBNQiB1c2VkIGZvciBwcmVkaWN0aW9uIChpbnQpCi0gICAgcHBfZGVjX3kgPSBwb2ludGVyIHRvIHRoZSBwb3N0IHByb2Nlc3Npbmcgc2VtYXBob3JlIGZvciBjdXJyZW50Ci0gICAgICAgICAgIGx1bWluYW5jZSBmcmFtZSAodWludDgpCi0gICAgcHN0cHJjVHlwUHJ2ID0gcG9pbnRlciB0aGUgcHJldmlvdXMgZnJhbWUncyBwb3N0IHByb2Nlc3NpbmcgdHlwZQotICAgICAgICAgICAgICAgICAgICh1aW50OCkKLSAgICBsbCA9IHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciAoaW50KQotICAgIG12X2xvYyA9IGZsYWcgaW5kaWNhdGluZyBsb2NhdGlvbiBvZiB0aGUgbW90aW9uIGNvbXBlbnNhdGVkCi0gICAgICAgICAoeCx5KSBwb3NpdGlvbiB3aXRoIHJlc3BlY3QgdG8gdGhlIGx1bWluYW5jZSBNQiAoaW50KTsKLSAgICAgICAgIDAgLT4gaW5zaWRlIE1CLCAxIC0+IG91dHNpZGUgTUIKLSAgICBkeCA9IGhvcml6b250YWwgY29tcG9uZW50IG9mIHRoZSBtb3Rpb24gdmVjdG9yIChpbnQpCi0gICAgZHkgPSB2ZXJ0aWNhbCBjb21wb25lbnQgb2YgdGhlIG1vdGlvbiB2ZWN0b3IgKGludCkKLSAgICBtdndpZHRoID0gbnVtYmVyIG9mIGJsb2NrcyBwZXIgcm93IChpbnQpCi0gICAgd2lkdGggPSBsdW1pbmFuY2UgVk9QIHdpZHRoIGluIHBpeGVscyAoaW50KQotICAgIGhlaWdodCA9IGx1bWluYW5jZSBWT1AgaGVpZ2h0IGluIHBpeGVscyAoaW50KQotCi0gTG9jYWwgU3RvcmVzL0J1ZmZlcnMvUG9pbnRlcnMgTmVlZGVkOgotICAgIE5vbmUKLQotIEdsb2JhbCBTdG9yZXMvQnVmZmVycy9Qb2ludGVycyBOZWVkZWQ6Ci0gICAgTm9uZQotCi0gT3V0cHV0czoKLSAgICBtc2tfZGVibG9jayA9IGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBkZWJsb2NraW5nIGlzIHRvIGJlCi0gICAgICAgICAgICAgIHBlcmZvcm1lZCAobXNrX2RlYmxvY2sgPSAwKSBvciBub3QgKG1za19kZWJsb2NrID0KLSAgICAgICAgICAgICAgMSkgKHVpbnQ4KQotCi0gUG9pbnRlcnMgYW5kIEJ1ZmZlcnMgTW9kaWZpZWQ6Ci0gICAgcHBfZGVjX3kgY29udGVudHMgYXJlIHRoZSB1cGRhdGVkIHNlbWFwb2hvcmUgcHJvcGFnYXRpb24gZGF0YQotCi0gTG9jYWwgU3RvcmVzIE1vZGlmaWVkOgotICAgIE5vbmUKLQotIEdsb2JhbCBTdG9yZXMgTW9kaWZpZWQ6Ci0gICAgTm9uZQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSBGVU5DVElPTiBERVNDUklQVElPTgotCi0gVGhpcyBmdW5jdGlvbnMgcGVyZm9ybXMgcG9zdCBwcm9jZXNzaW5nIHNlbWFwaG9yZSBwcm9wYWdhdGlvbiBwcm9jZXNzaW5nCi0gYWZ0ZXIgbHVtaW5hbmNlIHByZWRpY3Rpb24uCi0KLSovCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IElOQ0xVREVTCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlICAgICJtcDRkZWNfYXBpLmgiCi0jaW5jbHVkZSAgICAibXA0ZGVmLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBNQUNST1MKLTsgRGVmaW5lIG1vZHVsZSBzcGVjaWZpYyBtYWNyb3MgaGVyZQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBERUZJTkVTCi07IEluY2x1ZGUgYWxsIHByZS1wcm9jZXNzb3Igc3RhdGVtZW50cyBoZXJlLiBJbmNsdWRlIGNvbmRpdGlvbmFsCi07IGNvbXBpbGUgdmFyaWFibGVzIGFsc28uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IExPQ0FMIEZVTkNUSU9OIERFRklOSVRJT05TCi07IEZ1bmN0aW9uIFByb3RvdHlwZSBkZWNsYXJhdGlvbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotOyBMT0NBTCBTVE9SRS9CVUZGRVIvUE9JTlRFUiBERUZJTklUSU9OUwotOyBWYXJpYWJsZSBkZWNsYXJhdGlvbiAtIGRlZmluZWQgaGVyZSBhbmQgdXNlZCBvdXRzaWRlIHRoaXMgbW9kdWxlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi07IEVYVEVSTkFMIEZVTkNUSU9OIFJFRkVSRU5DRVMKLTsgRGVjbGFyZSBmdW5jdGlvbnMgZGVmaW5lZCBlbHNld2hlcmUgYW5kIHJlZmVyZW5jZWQgaW4gdGhpcyBtb2R1bGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLTsgRVhURVJOQUwgR0xPQkFMIFNUT1JFL0JVRkZFUi9QT0lOVEVSIFJFRkVSRU5DRVMKLTsgRGVjbGFyZSB2YXJpYWJsZXMgdXNlZCBpbiB0aGlzIG1vZHVsZSBidXQgZGVmaW5lZCBlbHNld2hlcmUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIKLXsKLSNlbmRpZgotICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIDsgRlVOQ1RJT04gQ09ERQotICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotICAgIHVpbnQ4IHBwX3NlbWFwaG9yZV9sdW1hKAotICAgICAgICBpbnQgeHByZWQsICAgICAgLyogaSAqLwotICAgICAgICBpbnQgeXByZWQsICAgICAgLyogaSAqLwotICAgICAgICB1aW50OCAgICpwcF9kZWNfeSwgIC8qIGkvbyAqLwotICAgICAgICB1aW50OCAgICpwc3RwcmNUeXBQcnYsICAvKiBpICovCi0gICAgICAgIGludCAqbGwsICAgICAgICAvKiBpICovCi0gICAgICAgIGludCAqbXZfbG9jLCAgICAvKiBpL28gKi8KLSAgICAgICAgaW50IGR4LCAgICAgLyogaSAqLwotICAgICAgICBpbnQgZHksICAgICAvKiBpICovCi0gICAgICAgIGludCBtdndpZHRoLCAgICAvKiBpICovCi0gICAgICAgIGludCB3aWR0aCwgICAgICAvKiBpICovCi0gICAgICAgIGludCBoZWlnaHQgICAgICAvKiBpICovCi0gICAgKQotICAgIHsKLSAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsgRGVmaW5lIGFsbCBsb2NhbCB2YXJpYWJsZXMKLSAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICAgIGludCBraywgbW12eSwgbW12eCwgbm12eCwgbm12eTsKLSAgICAgICAgdWludDggICAqcHBfcHJldjEsICpwcF9wcmV2MiwgKnBwX3ByZXYzLCAqcHBfcHJldjQ7Ci0gICAgICAgIHVpbnQ4ICAgbXNrX2RlYmxvY2sgPSAwOyAgICAgICAgLyogIDExLzMvMDAgKi8KLQotICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICAgICAgOyBGdW5jdGlvbiBib2R5IGhlcmUKLSAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICAgIC8qIEludGVyZnJhbWUgUHJvY2Vzc2luZyAtIDEgTVYgcGVyIE1CICovCi0KLSAgICAgICAgLyogY2hlY2sgd2hldGhlciB0aGUgTVYgcG9pbnRzIG91dHNpZGUgdGhlIGZyYW1lICovCi0gICAgICAgIGlmICh4cHJlZCA+PSAwICYmIHhwcmVkIDw9ICgod2lkdGggPDwgMSkgLSAoMipNQl9TSVpFKSkgJiYgeXByZWQgPj0gMCAmJgotICAgICAgICAgICAgICAgIHlwcmVkIDw9ICgoaGVpZ2h0IDw8IDEpIC0gKDIqTUJfU0laRSkpKQotICAgICAgICB7ICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogKHgseSkgaXMgaW5zaWRlIHRoZSBmcmFtZSAqLwotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgICAgICAgICAvKiAgMTAvMjQvMjAwMCBwb3N0X3Byb2Nlc3Npbmcgc2VtYXBob3JlICovCi0gICAgICAgICAgICAvKiBnZW5lcmF0aW9uICovCi0KLSAgICAgICAgICAgIC8qICAxMC8yMy8yMDAwIG5vIGJvdW5kYXJ5IGNoZWNraW5nKi8KLSAgICAgICAgICAgICptdl9sb2MgPSAwOwotCi0gICAgICAgICAgICAvKiBDYWxjdWxhdGUgYmxvY2sgeCBjb29yZGluYXRlLiBEaXZpZGUgYnkgMTYgaXMgZm9yICAqLwotICAgICAgICAgICAgLyogY29udmVydGluZyBoYWxmLXBpeGVsIHJlc29sdXRpb24gdG8gYmxvY2sgICAgICAgICAgKi8KLSAgICAgICAgICAgIG1tdnggPSB4cHJlZCA+PiA0OwotCi0gICAgICAgICAgICAvKiBDYWxjdWxhdGUgYmxvY2sgeSBjb29yZGluYXRlLiBEaXZpZGUgYnkgMTYgaXMgZm9yICovCi0gICAgICAgICAgICAvKiBjb252ZXJ0aW5nIGhhbGYtcGl4ZWwgcmVzb2x1dGlvbiB0byBibG9jayAgICAgICAgICovCi0gICAgICAgICAgICBtbXZ5ID0geXByZWQgPj4gNDsKLQotICAgICAgICAgICAgLyogRmluZCBwb3N0IHByb2Nlc3Npbmcgc2VtYXBob3JlIGxvY2F0aW9uIGZvciBibG9jayAqLwotICAgICAgICAgICAgLyogdXNlZCBmb3IgcHJlZGljdGlvbiwgaS5lLiwgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIC8qIHBwX3ByZXYxID0gJnBzdHByY1R5cFBydlttbXZ5Km12d2lkdGhdW21tdnhdICAgICAgKi8KLSAgICAgICAgICAgIHBwX3ByZXYxID0gcHN0cHJjVHlwUHJ2ICsgbW12eCArIG1tdnkgKiBtdndpZHRoOwotCi0gICAgICAgICAgICAvKiBDaGVjayBpZiBNViBpcyBhIG11bHRpcGxlIG9mIDE2ICovCi0gICAgICAgICAgICBpZiAoKGR4JjB4RikgIT0gMCkKLSAgICAgICAgICAgIHsgICAvKiBkeCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAqLwotCi0gICAgICAgICAgICAgICAgLyogcHBfcHJldjIgaXMgdGhlIGJsb2NrIHRvIHRoZSByaWdodCBvZiAqLwotICAgICAgICAgICAgICAgIC8qIHBwX3ByZXYxIGJsb2NrICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBwcF9wcmV2MiA9IHBwX3ByZXYxICsgMTsKLQotICAgICAgICAgICAgICAgIGlmICgoZHkmMHhGKSAhPSAwKQotICAgICAgICAgICAgICAgIHsgICAvKiBkeSBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiAqLwotCi0gICAgICAgICAgICAgICAgICAgIC8qIHBwX3ByZXYzIGlzIHRoZSBibG9jayBiZWxvdyAqLwotICAgICAgICAgICAgICAgICAgICAvKiBwcF9wcmV2MSBibG9jayAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBwcF9wcmV2MyA9IHBwX3ByZXYxICsgbXZ3aWR0aDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsgICAvKiBkeSBpcyBhIG11bHRpcGxlIG9mIDE2ICovCi0KLSAgICAgICAgICAgICAgICAgICAgcHBfcHJldjMgPSBwcF9wcmV2MTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBwcF9wcmV2NCBpcyB0aGUgYmxvY2sgdG8gdGhlIHJpZ2h0IG9mICovCi0gICAgICAgICAgICAgICAgLyogcHBfcHJldjMgYmxvY2suICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIHBwX3ByZXY0ID0gcHBfcHJldjMgKyAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgeyAgIC8qIGR4IGlzIGEgbXVsdGlwbGUgb2YgMTYgKi8KLQotICAgICAgICAgICAgICAgIHBwX3ByZXYyID0gcHBfcHJldjE7Ci0KLSAgICAgICAgICAgICAgICBpZiAoKGR5JjB4RikgIT0gMCkKLSAgICAgICAgICAgICAgICB7ICAgLyogZHkgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgKi8KLQotICAgICAgICAgICAgICAgICAgICAvKiBwcF9wcmV2MyBpcyB0aGUgYmxvY2sgYmVsb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogcHBfcHJldjEgYmxvY2suICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgcHBfcHJldjMgPSBwcF9wcmV2MSArIG12d2lkdGg7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7ICAgLyogZHkgaXMgYSBtdWx0aXBsZSBvZiAxNiAqLwotCi0gICAgICAgICAgICAgICAgICAgIHBwX3ByZXYzID0gcHBfcHJldjE7Ci0gICAgICAgICAgICAgICAgICAgIG1za19kZWJsb2NrID0gMHgzOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHBwX3ByZXY0ID0gcHBfcHJldjM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIFBlcmZvcm0gcG9zdCBwcm9jZXNzaW5nIHNlbWFwaG9yZSBwcm9wYWdhdGlvbiBmb3IgZWFjaCAqLwotICAgICAgICAgICAgLyogb2YgdGhlIDQgYmxvY2tzIGluIGEgTUIuICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGZvciAoa2sgPSAwOyBrayA8IDQ7IGtrKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogRGVyaW5naW5nIHNlbWFwaG9yZSBwcm9wYWdhdGlvbiAqLwotICAgICAgICAgICAgICAgIGlmICgoKihwcF9kZWNfeSkgJiA0KSA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgKihwcF9kZWNfeSkgfD0gKCgqKHBwX3ByZXYxKSB8ICoocHBfcHJldjIpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHBwX3ByZXYzKSB8ICoocHBfcHJldjQpKSAmIDB4NCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIERlYmxvY2tpbmcgc2VtYXBob3JlIHByb3BhZ2F0aW9uICovCi0gICAgICAgICAgICAgICAgLyogIDExLzMvMDAsIGNoYW5nZSB0aGUgcHJvcGFnYXRpb24gZm9yIGRlYmxvY2tpbmcgKi8KLSAgICAgICAgICAgICAgICBpZiAobXNrX2RlYmxvY2sgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICoocHBfZGVjX3kpID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwcF9kZWNfeSArPSBsbFtra107Ci0gICAgICAgICAgICAgICAgcHBfcHJldjEgKz0gbGxba2tdOwotICAgICAgICAgICAgICAgIHBwX3ByZXYyICs9IGxsW2trXTsKLSAgICAgICAgICAgICAgICBwcF9wcmV2MyArPSBsbFtra107Ci0gICAgICAgICAgICAgICAgcHBfcHJldjQgKz0gbGxba2tdOwotICAgICAgICAgICAgfQotCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7ICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qICh4LHkpIGlzIG91dHNpZGUgdGhlIGZyYW1lICovCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgICAgICAgICAvKiAgMTAvMjQvMjAwMCBwb3N0X3Byb2Nlc3Npbmcgc2VtYXBob3JlICovCi0gICAgICAgICAgICAvKiBnZW5lcmF0aW9uICovCi0KLSAgICAgICAgICAgIC8qICAxMC8yMy8yMDAwIGJvdW5kYXJ5IGNoZWNraW5nKi8KLSAgICAgICAgICAgICptdl9sb2MgPSAxOwotCi0gICAgICAgICAgICAvKiBQZXJmb3JtIHBvc3QgcHJvY2Vzc2luZyBzZW1hcGhvcmUgcHJvcGFnYXRpb24gZm9yIGVhY2ggKi8KLSAgICAgICAgICAgIC8qIG9mIHRoZSA0IGJsb2NrcyBpbiBhIE1CLiAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBmb3IgKGtrID0gMDsga2sgPCA0OyBraysrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIENhbGN1bGF0ZSBibG9jayB4IGNvb3JkaW5hdGUgYW5kIHJvdW5kICg/KS4gICovCi0gICAgICAgICAgICAgICAgLyogRGl2aWRlIGJ5IDE2IGlzIGZvciBjb252ZXJ0aW5nIGhhbGYtcGl4ZWwgICAgKi8KLSAgICAgICAgICAgICAgICAvKiByZXNvbHV0aW9uIHRvIGJsb2NrLiAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIG1tdnggPSAoeHByZWQgKyAoKGtrICYgMSkgPDwgMykpID4+IDQ7Ci0gICAgICAgICAgICAgICAgbm12eCA9IG1tdng7Ci0KLSAgICAgICAgICAgICAgICAvKiBDYWxjdWxhdGUgYmxvY2sgeSBjb29yZGluYXRlIGFuZCByb3VuZCAoPykuICAqLwotICAgICAgICAgICAgICAgIC8qIERpdmlkZSBieSAxNiBpcyBmb3IgY29udmVydGluZyBoYWxmLXBpeGVsICAgICovCi0gICAgICAgICAgICAgICAgLyogcmVzb2x1dGlvbiB0byBibG9jay4gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBtbXZ5ID0gKHlwcmVkICsgKChrayAmIDIpIDw8IDIpKSA+PiA0OwotICAgICAgICAgICAgICAgIG5tdnkgPSBtbXZ5OwotCi0gICAgICAgICAgICAgICAgLyogUGVyZm9ybSBib3VuZGFyeSBjaGVja2luZyAqLwotICAgICAgICAgICAgICAgIGlmIChubXZ4IDwgMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5tdnggPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChubXZ4ID4gbXZ3aWR0aCAtIDEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBubXZ4ID0gbXZ3aWR0aCAtIDE7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG5tdnkgPCAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbm12eSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5tdnkgPiAoaGVpZ2h0ID4+IDMpIC0gMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5tdnkgPSAoaGVpZ2h0ID4+IDMpIC0gMTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvKiBGaW5kIHBvc3QgcHJvY2Vzc2luZyBzZW1hcGhvcmUgbG9jYXRpb24gZm9yIGJsb2NrICovCi0gICAgICAgICAgICAgICAgLyogdXNlZCBmb3IgcHJlZGljdGlvbiwgaS5lLiwgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAvKiBwcF9wcmV2MSA9ICZwc3RwcmNUeXBQcnZbbm12eSptdndpZHRoXVtubXZ4XSAgICAgICovCi0gICAgICAgICAgICAgICAgcHBfcHJldjEgPSBwc3RwcmNUeXBQcnYgKyBubXZ4ICsgbm12eSAqIG12d2lkdGg7Ci0KLSAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB4IGNvbXBvbmVudCBvZiBNViBpcyBhIG11bHRpcGxlIG9mIDE2ICAgICovCi0gICAgICAgICAgICAgICAgLyogYW5kIGNoZWNrIGlmIGJsb2NrIHggY29vcmRpbmF0ZSBpcyBvdXQgb2YgYm91bmRzICAqLwotICAgICAgICAgICAgICAgIGlmICgoKGR4JjB4RikgIT0gMCkgJiYgKG1tdnggKyAxIDwgbXZ3aWR0aCAtIDEpKQotICAgICAgICAgICAgICAgIHsgICAvKiBkeCBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiBhbmQgdGhlIGJsb2NrICovCi0gICAgICAgICAgICAgICAgICAgIC8qIHggY29vcmRpbmF0ZSBpcyB3aXRoaW4gdGhlIGJvdW5kcyAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAvKiBwcF9wcmV2MiBpcyB0aGUgYmxvY2sgdG8gdGhlIHJpZ2h0IG9mICovCi0gICAgICAgICAgICAgICAgICAgIC8qIHBwX3ByZXYxIGJsb2NrICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgcHBfcHJldjIgPSBwcF9wcmV2MSArIDE7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogQ2hlY2sgaWYgeSBjb21wb25lbnQgb2YgTVYgaXMgYSBtdWx0aXBsZSAqLwotICAgICAgICAgICAgICAgICAgICAvKiBvZiAxNiBhbmQgY2hlY2sgaWYgYmxvY2sgeSBjb29yZGluYXRlIGlzICovCi0gICAgICAgICAgICAgICAgICAgIC8qIG91dCBvZiBib3VuZHMgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgaWYgKCgoZHkmMHhGKSAhPSAwKSAmJiAobW12eSArIDEgPCAoaGVpZ2h0ID4+IDMpIC0gMSkpCi0gICAgICAgICAgICAgICAgICAgIHsgICAvKiBkeSBpcyBub3QgYSBtdWx0aXBsZSBvZiAxNiBhbmQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBibG9jayB5IGNvb3JkaW5hdGUgaXMgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogd2l0aGluIHRoZSBib3VuZHMgICAgICAgICAgICAgICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBwX3ByZXYzIGlzIHRoZSBibG9jayBiZWxvdyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogcHBfcHJldjEgYmxvY2sgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBwX3ByZXYzID0gcHBfcHJldjEgKyBtdndpZHRoOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBhbGwgcHJlZGljdGlvbiBhcmUgZnJvbSBkaWZmZXJlbnQgYmxvY2tzICovCi0gICAgICAgICAgICAgICAgICAgICAgICBtc2tfZGVibG9jayA9IDB4MzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsgICAvKiBkeSBpcyBhIG11bHRpcGxlIG9mIDE2IG9yIHRoZSBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogeSBjb29yZGluYXRlIGlzIG91dCBvZiBib3VuZHMgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgcHBfcHJldjMgPSBwcF9wcmV2MTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIC8qIHBwX3ByZXY0IGlzIHRoZSBibG9jayB0byB0aGUgcmlnaHQgb2YgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogcHBfcHJldjMgYmxvY2suICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBwcF9wcmV2NCA9IHBwX3ByZXYzICsgMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsgICAvKiBkeCBpcyBhIG11bHRpcGxlIG9mIDE2IG9yIHRoZSBibG9jayB4ICovCi0gICAgICAgICAgICAgICAgICAgIC8qIGNvb3JkaW5hdGUgaXMgb3V0IG9mIGJvdW5kcyAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICBwcF9wcmV2MiA9IHBwX3ByZXYxOwotCi0gICAgICAgICAgICAgICAgICAgIC8qIENoZWNrIGlmIHkgY29tcG9uZW50IG9mIE1WIGlzIGEgbXVsdGlwbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogb2YgMTYgYW5kIGNoZWNrIGlmIGJsb2NrIHkgY29vcmRpbmF0ZSBpcyAqLwotICAgICAgICAgICAgICAgICAgICAvKiBvdXQgb2YgYm91bmRzICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGlmICgoKGR5JjB4RikgIT0gMCkgJiYgKG1tdnkgKyAxIDwgKGhlaWdodCA+PiAzKSAtIDEpKQotICAgICAgICAgICAgICAgICAgICB7ICAgLyogZHkgaXMgbm90IGEgbXVsdGlwbGUgb2YgMTYgYW5kICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiB0aGUgYmxvY2sgeSBjb29yZGluYXRlIGlzICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdpdGhpbiB0aGUgYm91bmRzICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBwcF9wcmV2MyBpcyB0aGUgYmxvY2sgYmVsb3cgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBwX3ByZXYxIGJsb2NrLiAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwcF9wcmV2MyA9IHBwX3ByZXYxICsgbXZ3aWR0aDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsgICAvKiBkeSBpcyBhIG11bHRpcGxlIG9mIDE2IG9yIHRoZSBibG9jayAqLwotICAgICAgICAgICAgICAgICAgICAgICAgLyogeSBjb29yZGluYXRlIGlzIG91dCBvZiBib3VuZHMgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgcHBfcHJldjMgPSBwcF9wcmV2MTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHBwX3ByZXY0ID0gcHBfcHJldjM7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLyogRGVyaW5naW5nIHNlbWFwaG9yZSBwcm9wYWdhdGlvbiAqLwotICAgICAgICAgICAgICAgIGlmICgoKihwcF9kZWNfeSkmNCkgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICoocHBfZGVjX3kpIHw9ICgoKihwcF9wcmV2MSkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHBfcHJldjIpIHwgKihwcF9wcmV2MykgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoocHBfcHJldjQpKSAmIDB4NCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8qIERlYmxvY2tpbmcgc2VtYXBob3JlIHByb3BhZ2F0aW9uICovCi0gICAgICAgICAgICAgICAgLyogIDExLzMvMDAsIGNoYW5nZSB0aGUgcHJvcGFnYT0gKi8KLSAgICAgICAgICAgICAgICAvKiB0aW9uIGZvciBkZWJsb2NraW5nICovCi0gICAgICAgICAgICAgICAgaWYgKG1za19kZWJsb2NrID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAqKHBwX2RlY195KSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHBfZGVjX3kgKz0gbGxba2tdOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgICAgIDsgUmV0dXJuIG5vdGhpbmcgb3IgZGF0YSBvciBkYXRhIHBvaW50ZXIKLSAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0gICAgICAgIHJldHVybiAobXNrX2RlYmxvY2spOwotICAgIH0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3B2ZGVjX2FwaS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wdmRlY19hcGkuY3BwCmluZGV4IDljMGZjZmEuLmIwODI4ZTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3B2ZGVjX2FwaS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHZkZWNfYXBpLmNwcApAQCAtNTEyLDYwICs1MTIsNiBAQAogICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoc2l6ZW9mKE1PVCkgKiA4ICogblRvdGFsTUIpOwogI2VuZGlmCiAKLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgIC8qIEFsbG9jYXRpbmcgc3BhY2UgZm9yIHBvc3QtcHJvY2Vzc2luZyBNb2RlICovCi0jaWZkZWYgREVDX0lOVEVSTkFMX01FTU9SWV9PUFQKLSAgICB2aWRlby0+cHN0cHJjVHlwQ3VyID0gSU1FTV9wc3RwcmNUeXBDdXI7Ci0gICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChuVG90YWxNQiAqIDYpOwotICAgIGlmICh2aWRlby0+cHN0cHJjVHlwQ3VyID09IE5VTEwpCi0gICAgewotICAgICAgICBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgb3NjbF9tZW1zZXQodmlkZW8tPnBzdHByY1R5cEN1ciwgMCwgNCpuVG90YWxNQiArIDIqblRvdGFsTUIpOwotICAgIH0KLQotICAgIHZpZGVvLT5wc3RwcmNUeXBQcnYgPSBJTUVNX3BzdHByY1R5cFBydjsKLSAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKG5Ub3RhbE1CICogNik7Ci0gICAgaWYgKHZpZGVvLT5wc3RwcmNUeXBQcnYgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBvc2NsX21lbXNldCh2aWRlby0+cHN0cHJjVHlwUHJ2LCAwLCBuVG90YWxNQio2KTsKLSAgICB9Ci0KLSNlbHNlCi0gICAgaWYgKG5Ub3RhbE1CID4gSU5UMzJfTUFYIC8gNikgewotICAgICAgICByZXR1cm4gUFZfRkFMU0U7Ci0gICAgfQotICAgIHZpZGVvLT5wc3RwcmNUeXBDdXIgPSAodWludDggKikgb3NjbF9tYWxsb2MoblRvdGFsTUIgKiA2KTsKLSAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKG5Ub3RhbE1CICogNik7Ci0gICAgaWYgKHZpZGVvLT5wc3RwcmNUeXBDdXIgPT0gTlVMTCkKLSAgICB7Ci0gICAgICAgIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBvc2NsX21lbXNldCh2aWRlby0+cHN0cHJjVHlwQ3VyLCAwLCA0Km5Ub3RhbE1CICsgMipuVG90YWxNQik7Ci0gICAgfQotCi0gICAgdmlkZW8tPnBzdHByY1R5cFBydiA9ICh1aW50OCAqKSBvc2NsX21hbGxvYyhuVG90YWxNQiAqIDYpOwotICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoblRvdGFsTUIgKiA2KTsKLSAgICBpZiAodmlkZW8tPnBzdHByY1R5cFBydiA9PSBOVUxMKQotICAgIHsKLSAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIG9zY2xfbWVtc2V0KHZpZGVvLT5wc3RwcmNUeXBQcnYsIDAsIG5Ub3RhbE1CKjYpOwotICAgIH0KLQotI2VuZGlmCi0KLSNlbmRpZgogCiAgICAgLyogaW5pdGlhbGl6ZSB0aGUgZGVjb2RlciBsaWJyYXJ5ICovCiAgICAgdmlkZW8tPnByZXZWb3AtPnByZWRpY3Rpb25UeXBlID0gSV9WT1A7CkBAIC02MzEsMTAgKzU3Nyw2IEBACiAjaWZkZWYgREVDX0lOVEVSTkFMX01FTU9SWV9PUFQKICAgICBpZiAodmlkZW8pCiAgICAgewotI2lmZGVmIFBWX1BPU1RQUk9DX09OCi0gICAgICAgIHZpZGVvLT5wc3RwcmNUeXBDdXIgPSBOVUxMOwotICAgICAgICB2aWRlby0+cHN0cHJjVHlwUHJ2ID0gTlVMTDsKLSNlbmRpZgogCiAgICAgICAgIHZpZGVvLT5hY1ByZWRGbGFnICAgICAgID0gTlVMTDsKICAgICAgICAgdmlkZW8tPnNsaWNlTm8gICAgICAgICAgPSBOVUxMOwpAQCAtNjk5LDEwICs2NDEsNiBAQAogCiAgICAgaWYgKHZpZGVvKQogICAgIHsKLSNpZmRlZiBQVl9QT1NUUFJPQ19PTgotICAgICAgICBpZiAodmlkZW8tPnBzdHByY1R5cEN1cikgb3NjbF9mcmVlKHZpZGVvLT5wc3RwcmNUeXBDdXIpOwotICAgICAgICBpZiAodmlkZW8tPnBzdHByY1R5cFBydikgb3NjbF9mcmVlKHZpZGVvLT5wc3RwcmNUeXBQcnYpOwotI2VuZGlmCiAgICAgICAgIGlmICh2aWRlby0+cHJlZERDKSBvc2NsX2ZyZWUodmlkZW8tPnByZWREQyk7CiAgICAgICAgIHZpZGVvLT5wcmVkRENBQ19yb3cgPSBOVUxMOwogICAgICAgICBpZiAodmlkZW8tPnByZWREQ0FDX2NvbCkgb3NjbF9mcmVlKHZpZGVvLT5wcmVkRENBQ19jb2wpOwpAQCAtODMwLDcgKzc2OCwxMCBAQAogT1NDTF9FWFBPUlRfUkVGIHZvaWQgUFZTZXRQb3N0UHJvY1R5cGUoVmlkZW9EZWNDb250cm9scyAqZGVjQ3RybCwgaW50IG1vZGUpCiB7CiAgICAgVmlkZW9EZWNEYXRhICp2aWRlbyA9IChWaWRlb0RlY0RhdGEgKilkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOwotICAgIHZpZGVvLT5wb3N0RmlsdGVyVHlwZSA9IG1vZGU7CisgICAgaWYgKG1vZGUgIT0gMCkgeworICAgICAgICBBTE9HRSgiUG9zdCBwcm9jZXNzaW5nIGZpbHRlcnMgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICB9CisgICAgdmlkZW8tPnBvc3RGaWx0ZXJUeXBlID0gMDsKIH0KIAogCkBAIC0xNjIxLDQzICsxNTYyLDggQEAKIHZvaWQgUFZEZWNQb3N0UHJvY2VzcyhWaWRlb0RlY0NvbnRyb2xzICpkZWNDdHJsLCB1aW50OCAqb3V0cHV0WVVWKQogewogICAgIHVpbnQ4ICpvdXRwdXRCdWZmZXI7Ci0jaWZkZWYgUFZfUE9TVFBST0NfT04KLSAgICBWaWRlb0RlY0RhdGEgKnZpZGVvID0gKFZpZGVvRGVjRGF0YSAqKSBkZWNDdHJsLT52aWRlb0RlY29kZXJEYXRhOwotICAgIGludDMyIHRtcHZhcjsKLSAgICBpZiAob3V0cHV0WVVWKQotICAgIHsKLSAgICAgICAgb3V0cHV0QnVmZmVyID0gb3V0cHV0WVVWOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAodmlkZW8tPnBvc3RGaWx0ZXJUeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXRCdWZmZXIgPSB2aWRlby0+Y3VyclZvcC0+eUNoYW47Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXRCdWZmZXIgPSBkZWNDdHJsLT5vdXRwdXRGcmFtZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICh2aWRlby0+cG9zdEZpbHRlclR5cGUpCi0gICAgewotICAgICAgICAvKiBQb3N0LXByb2Nlc3NpbmcsICAqLwotICAgICAgICBQb3N0RmlsdGVyKHZpZGVvLCB2aWRlby0+cG9zdEZpbHRlclR5cGUsIG91dHB1dEJ1ZmZlcik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChvdXRwdXRZVVYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIENvcHkgZGVjb2RlZCBmcmFtZSB0byB0aGUgb3V0cHV0IGJ1ZmZlci4gKi8KLSAgICAgICAgICAgIHRtcHZhciA9IChpbnQzMil2aWRlby0+d2lkdGggKiB2aWRlby0+aGVpZ2h0OwotICAgICAgICAgICAgb3NjbF9tZW1jcHkob3V0cHV0QnVmZmVyLCBkZWNDdHJsLT5vdXRwdXRGcmFtZSwgdG1wdmFyKjMgLyAyKTsgICAgICAgICAgIC8qICAzLzMvMDEgKi8KLSAgICAgICAgfQotICAgIH0KLSNlbHNlCiAgICAgb3V0cHV0QnVmZmVyID0gZGVjQ3RybC0+b3V0cHV0RnJhbWU7CiAgICAgb3V0cHV0WVVWOwotI2VuZGlmCiAgICAgZGVjQ3RybC0+b3V0cHV0RnJhbWUgPSBvdXRwdXRCdWZmZXI7CiAgICAgcmV0dXJuOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2Z1enplci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2Z1enplci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZmM3ODIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw3MiBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKK2NjX2Z1enogeworICAgIG5hbWU6ICJtcGVnNF9kZWNfZnV6emVyIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJtcGVnNF9oMjYzX2RlY19mdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1ET1NDTF9JTVBPUlRfUkVGPSIsCisgICAgICAgICItRE1QRUc0IiwKKyAgICBdLAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLW1lZGlhLWZ1enppbmctcmVwb3J0c0Bnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICAgICAgY29tcG9uZW50aWQ6IDE1NTI3NiwKKyAgICB9LAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAiaDI2M19kZWNfZnV6emVyIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJtcGVnNF9oMjYzX2RlY19mdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1ET1NDTF9JTVBPUlRfUkVGPSIsCisgICAgXSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorICAgIGZ1enpfY29uZmlnOiB7CisgICAgICAgIGNjOiBbCisgICAgICAgICAgICAiYW5kcm9pZC1tZWRpYS1mdXp6aW5nLXJlcG9ydHNAZ29vZ2xlLmNvbSIsCisgICAgICAgIF0sCisgICAgICAgIGNvbXBvbmVudGlkOiAxNTUyNzYsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvUkVBRE1FLm1kIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2Z1enplci9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJhNGY2OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNTcgQEAKKyMgRnV6emVyIGZvciBsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIGRlY29kZXIKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIE1QRUc0L0gyNjMgaXMgZGVzaWduZWQgYmFzZWQgb24gdGhlIHVuZGVyc3RhbmRpbmcgb2YgdGhlCitjb2RlYyBhbmQgdHJpZXMgdG8gYWNoaWV2ZSB0aGUgZm9sbG93aW5nOgorCisjIyMjIyBNYXhpbWl6ZSBjb2RlIGNvdmVyYWdlCitEaWN0IGZpbGVzIChkaWN0aW9uYXJ5IGZpbGVzKSBhcmUgY3JlYXRlZCBmb3IgTVBFRzQgYW5kIEgyNjMgdG8gZW5zdXJlIHRoYXQgdGhlIHJlcXVpcmVkIHN0YXJ0CitieXRlcyBhcmUgcHJlc2VudCBpbiBldmVyeSBpbnB1dCBmaWxlIHRoYXQgZ29lcyB0byB0aGUgZnV6emVyLgorVGhpcyBlbnN1cmVzIHRoYXQgZGVjb2RlciBkb2VzIG5vdCByZWplY3QgYW55IGlucHV0IGZpbGUgaW4gdGhlIGZpcnN0IGNoZWNrCisKKyMjIyMjIE1heGltaXplIHV0aWxpemF0aW9uIG9mIGlucHV0IGRhdGEKK1RoZSBwbHVnaW4gZmVlZHMgdGhlIGVudGlyZSBpbnB1dCBkYXRhIHRvIHRoZSBjb2RlYyB1c2luZyBhIGxvb3AuCisgKiBJZiB0aGUgZGVjb2RlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgdGhlIGlucHV0IGlzIGFkdmFuY2VkIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQKKyAgIGluIHRoZSBkZWNvZGUgY2FsbC4KKyAqIElmIHRoZSBkZWNvZGUgb3BlcmF0aW9uIHdhcyB1bi1zdWNjZXNzZnVsLCB0aGUgaW5wdXQgaXMgYWR2YW5jZWQgYnkgMSBieXRlIHNvIHRoYXQgdGhlIGZ1enplcgorICAgY2FuIHByb2NlZWQgdG8gZmVlZCB0aGUgbmV4dCBmcmFtZS4KKworVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbiB0b2xlcmF0ZXMgYW55IGtpbmQgb2YgaW5wdXQgKGVtcHR5LCBodWdlLCBtYWxmb3JtZWQsIGV0YykKK2FuZCBkb2VzbnQgYGV4aXQoKWAgb24gYW55IGlucHV0IGFuZCB0aGVyZWJ5IGluY3JlYXNpbmcgdGhlIGNoYW5jZSBvZiBpZGVudGlmeWluZyB2dWxuZXJhYmlsaXRpZXMuCisKKyMjIyMjIE90aGVyIGNvbnNpZGVyYXRpb25zCisgKiBUd28gZnV6emVyIGJpbmFyaWVzIC0gbXBlZzRfZGVjX2Z1enplciBhbmQgaDI2M19kZWNfZnV6emVyIGFyZSBnZW5lcmF0ZWQgYmFzZWQgb24gdGhlIHByZXNlbmNlCisgICBvZiBhIGZsYWcgLSAnTVBFRzQnCisgKiBUaGUgbnVtYmVyIG9mIGRlY29kZSBjYWxscyBhcmUga2VwdCB0byBhIG1heGltdW0gb2YgMTAwIHNvIHRoYXQgdGhlIGZ1enplciBkb2VzIG5vdCB0aW1lb3V0LgorCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBtcGVnNF9kZWNfZnV6emVyIGFuZCBoMjYzX2RlY19mdXp6ZXIgYmluYXJ5LgorCisjIyMgQW5kcm9pZAorIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBtcGVnNF9kZWNfZnV6emVyCisgICQgbW0gLWokKG5wcm9jKSBoMjYzX2RlY19mdXp6ZXIKK2BgYAorCisjIyMjIFN0ZXBzIHRvIHJ1bgorQ3JlYXRlIGEgZGlyZWN0b3J5IENPUlBVU19ESVIgYW5kIGNvcHkgc29tZSBNUEVHNCBvciBIMjYzIGZpbGVzIHRvIHRoYXQgZm9sZGVyCitQdXNoIHRoaXMgZGlyZWN0b3J5IHRvIGRldmljZS4KKworVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L21wZWc0X2RlY19mdXp6ZXIvbXBlZzRfZGVjX2Z1enplciBDT1JQVVNfRElSCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvaDI2M19kZWNfZnV6emVyL2gyNjNfZGVjX2Z1enplciBDT1JQVVNfRElSCitgYGAKK1RvIHJ1biBvbiBob3N0CitgYGAKKyAgJCAkQU5EUk9JRF9IT1NUX09VVC9mdXp6L3g4Nl82NC9tcGVnNF9kZWNfZnV6emVyL21wZWc0X2RlY19mdXp6ZXIgQ09SUFVTX0RJUgorICAkICRBTkRST0lEX0hPU1RfT1VUL2Z1enoveDg2XzY0L2gyNjNfZGVjX2Z1enplci9oMjYzX2RlY19mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCisKKyMjIFJlZmVyZW5jZXM6CisgKiBodHRwOi8vbGx2bS5vcmcvZG9jcy9MaWJGdXp6ZXIuaHRtbAorICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9vc3MtZnV6egpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2Z1enplci9oMjYzX2RlY19mdXp6ZXIuZGljdCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvaDI2M19kZWNfZnV6emVyLmRpY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxZDM3ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvaDI2M19kZWNfZnV6emVyLmRpY3QKQEAgLTAsMCArMSwyIEBACisjIFN0YXJ0IGNvZGUgKGJ5dGVzIDAtMykKK2t3MT0iXHgwMFx4MDBceDgwXHgwMiIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvbXBlZzRfZGVjX2Z1enplci5kaWN0IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2Z1enplci9tcGVnNF9kZWNfZnV6emVyLmRpY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYyNDFhNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvbXBlZzRfZGVjX2Z1enplci5kaWN0CkBAIC0wLDAgKzEsMiBAQAorIyBTdGFydCBjb2RlIChieXRlcyAwLTMpCitrdzE9Ilx4MDBceDAwXHgwMVx4QjAiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL21wZWc0X2gyNjNfZGVjX2Z1enplci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL21wZWc0X2gyNjNfZGVjX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEyYzgyMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvbXBlZzRfaDI2M19kZWNfZnV6emVyLmNwcApAQCAtMCwwICsxLDIwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisjaW5jbHVkZSAibXA0ZGVjX2FwaS5oIgorI2RlZmluZSBNUEVHNF9NQVhfV0lEVEggMTkyMAorI2RlZmluZSBNUEVHNF9NQVhfSEVJR0hUIDEwODAKKyNkZWZpbmUgSDI2M19NQVhfV0lEVEggMzUyCisjZGVmaW5lIEgyNjNfTUFYX0hFSUdIVCAyODgKKyNkZWZpbmUgREVGQVVMVF9XSURUSCAzNTIKKyNkZWZpbmUgREVGQVVMVF9IRUlHSFQgMjg4CisKK2NvbnN0ZXhwciBzaXplX3Qga01heE51bURlY29kZUNhbGxzID0gMTAwOworY29uc3RleHByIHVpbnQ4X3Qga051bU91dHB1dEJ1ZmZlcnMgPSAyOworY29uc3RleHByIGludCBrTGF5ZXIgPSAxOworCitzdHJ1Y3QgdGFndmlkZW9EZWNDb250cm9sczsKKworLyogPT0gY2VpbChudW0gLyBkZW4pICogZGVuLiBUIG11c3QgYmUgaW50ZWdlciB0eXBlLCBhbGlnbm1lbnQgbXVzdCBiZSBwb3NpdGl2ZSBwb3dlciBvZiAyICovCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4KK2lubGluZSBzdGF0aWMgY29uc3QgVCBhbGlnbihjb25zdCBUICZudW0sIGNvbnN0IFUgJmRlbikgeworICByZXR1cm4gKG51bSArIChUKShkZW4gLSAxKSkgJiAoVCkgfihkZW4gLSAxKTsKK30KKworY2xhc3MgQ29kZWMgeworIHB1YmxpYzoKKyAgQ29kZWMoKSA9IGRlZmF1bHQ7CisgIH5Db2RlYygpIHsgZGVJbml0RGVjb2RlcigpOyB9CisgIGJvb2wgaW5pdERlY29kZXIoKTsKKyAgYm9vbCBhbGxvY091dHB1dEJ1ZmZlcihzaXplX3Qgb3V0cHV0QnVmZmVyU2l6ZSk7CisgIHZvaWQgZnJlZU91dHB1dEJ1ZmZlcigpOworICB2b2lkIGhhbmRsZVJlc29sdXRpb25DaGFuZ2UoKTsKKyAgdm9pZCBkZWNvZGVGcmFtZXMoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICB2b2lkIGRlSW5pdERlY29kZXIoKTsKKworIHByaXZhdGU6CisgIHRhZ3ZpZGVvRGVjQ29udHJvbHMgKm1EZWNIYW5kbGUgPSBudWxscHRyOworICB1aW50OF90ICptT3V0cHV0QnVmZmVyW2tOdW1PdXRwdXRCdWZmZXJzXTsKKyAgYm9vbCBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgYm9vbCBtRnJhbWVzQ29uZmlndXJlZCA9IGZhbHNlOworI2lmZGVmIE1QRUc0CisgIE1QNERlY29kaW5nTW9kZSBtSW5wdXRNb2RlID0gTVBFRzRfTU9ERTsKKyAgc2l6ZV90IG1NYXhXaWR0aCA9IE1QRUc0X01BWF9XSURUSDsKKyAgc2l6ZV90IG1NYXhIZWlnaHQgPSBNUEVHNF9NQVhfSEVJR0hUOworI2Vsc2UKKyAgTVA0RGVjb2RpbmdNb2RlIG1JbnB1dE1vZGUgPSBIMjYzX01PREU7CisgIHNpemVfdCBtTWF4V2lkdGggPSBIMjYzX01BWF9XSURUSDsKKyAgc2l6ZV90IG1NYXhIZWlnaHQgPSBIMjYzX01BWF9IRUlHSFQ7CisjZW5kaWYKKyAgdWludDMyX3QgbU51bVNhbXBsZXNPdXRwdXQgPSAwOworICB1aW50MzJfdCBtV2lkdGggPSBERUZBVUxUX1dJRFRIOworICB1aW50MzJfdCBtSGVpZ2h0ID0gREVGQVVMVF9IRUlHSFQ7Cit9OworCitib29sIENvZGVjOjppbml0RGVjb2RlcigpIHsKKyAgbURlY0hhbmRsZSA9IG5ldyB0YWd2aWRlb0RlY0NvbnRyb2xzOworICBpZiAoIW1EZWNIYW5kbGUpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgbWVtc2V0KG1EZWNIYW5kbGUsIDAsIHNpemVvZih0YWd2aWRlb0RlY0NvbnRyb2xzKSk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENvZGVjOjphbGxvY091dHB1dEJ1ZmZlcihzaXplX3Qgb3V0cHV0QnVmZmVyU2l6ZSkgeworICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBrTnVtT3V0cHV0QnVmZmVyczsgKytpKSB7CisgICAgaWYgKCFtT3V0cHV0QnVmZmVyW2ldKSB7CisgICAgICBtT3V0cHV0QnVmZmVyW2ldID0gc3RhdGljX2Nhc3Q8dWludDhfdCAqPihtYWxsb2Mob3V0cHV0QnVmZmVyU2l6ZSkpOworICAgICAgaWYgKCFtT3V0cHV0QnVmZmVyW2ldKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ29kZWM6OmZyZWVPdXRwdXRCdWZmZXIoKSB7CisgIGZvciAodWludDhfdCBpID0gMDsgaSA8IGtOdW1PdXRwdXRCdWZmZXJzOyArK2kpIHsKKyAgICBpZiAobU91dHB1dEJ1ZmZlcltpXSkgeworICAgICAgZnJlZShtT3V0cHV0QnVmZmVyW2ldKTsKKyAgICAgIG1PdXRwdXRCdWZmZXJbaV0gPSBudWxscHRyOworICAgIH0KKyAgfQorfQorCit2b2lkIENvZGVjOjpoYW5kbGVSZXNvbHV0aW9uQ2hhbmdlKCkgeworICBpbnQzMl90IGRpc3BXaWR0aCwgZGlzcEhlaWdodDsKKyAgUFZHZXRWaWRlb0RpbWVuc2lvbnMobURlY0hhbmRsZSwgJmRpc3BXaWR0aCwgJmRpc3BIZWlnaHQpOworCisgIGludDMyX3QgYnVmV2lkdGgsIGJ1ZkhlaWdodDsKKyAgUFZHZXRCdWZmZXJEaW1lbnNpb25zKG1EZWNIYW5kbGUsICZidWZXaWR0aCwgJmJ1ZkhlaWdodCk7CisKKyAgaWYgKGRpc3BXaWR0aCAhPSBtV2lkdGggfHwgZGlzcEhlaWdodCAhPSBtSGVpZ2h0KSB7CisgICAgbVdpZHRoID0gZGlzcFdpZHRoOworICAgIG1IZWlnaHQgPSBkaXNwSGVpZ2h0OworICB9Cit9CisKK3ZvaWQgQ29kZWM6OmRlY29kZUZyYW1lcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBzaXplX3Qgb3V0cHV0QnVmZmVyU2l6ZSA9IGFsaWduKG1NYXhXaWR0aCwgMTYpICogYWxpZ24obU1heEhlaWdodCwgMTYpICogMyAvIDI7CisgIHVpbnQ4X3QgKnN0YXJ0X2NvZGUgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oZGF0YSk7CisgIHN0YXRpYyBjb25zdCB1aW50OF90IHZvbEluZm9bXSA9IHsweDAwLCAweDAwLCAweDAxLCAweEIwfTsKKyAgYm9vbCB2b2xIZWFkZXIgPSBtZW1jbXAoc3RhcnRfY29kZSwgdm9sSW5mbywgNCkgPT0gMDsKKyAgaWYgKHZvbEhlYWRlcikgeworICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKKyAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgfQorCisgIGlmICghbUluaXRpYWxpemVkKSB7CisgICAgdWludDhfdCAqdm9sRGF0YVsxXXt9OworICAgIGludDMyX3Qgdm9sU2l6ZSA9IDA7CisKKyAgICBpZiAodm9sSGVhZGVyKSB7IC8qIHJlbW92ZWQgc29tZSBjb2RlYyBjb25maWcgcGFydCAqLworICAgICAgdm9sRGF0YVswXSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihkYXRhKTsKKyAgICAgIHZvbFNpemUgPSBzaXplOworICAgIH0KKworICAgIGlmICghUFZJbml0VmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUsIHZvbERhdGEsICZ2b2xTaXplLCBrTGF5ZXIsIG1NYXhXaWR0aCwgbU1heEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRNb2RlKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIE1QNERlY29kaW5nTW9kZSBhY3R1YWxNb2RlID0gUFZHZXREZWNCaXRzdHJlYW1Nb2RlKG1EZWNIYW5kbGUpOworICAgIGlmIChtSW5wdXRNb2RlICE9IGFjdHVhbE1vZGUpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQVlNldFBvc3RQcm9jVHlwZShtRGVjSGFuZGxlLCAwKTsKKyAgfQorICBzaXplX3QgeUZyYW1lU2l6ZSA9IHNpemVvZih1aW50OCkgKiBtRGVjSGFuZGxlLT5zaXplOworICBpZiAob3V0cHV0QnVmZmVyU2l6ZSA8IHlGcmFtZVNpemUgKiAzIC8gMikgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoIWFsbG9jT3V0cHV0QnVmZmVyKG91dHB1dEJ1ZmZlclNpemUpKSB7CisgICAgcmV0dXJuOworICB9CisgIHNpemVfdCBudW1EZWNvZGVDYWxscyA9IDA7CisgIHdoaWxlICgoc2l6ZSA+IDApICYmIChudW1EZWNvZGVDYWxscyA8IGtNYXhOdW1EZWNvZGVDYWxscykpIHsKKyAgICBpZiAoIW1GcmFtZXNDb25maWd1cmVkKSB7CisgICAgICBQVlNldFJlZmVyZW5jZVlVVihtRGVjSGFuZGxlLCBtT3V0cHV0QnVmZmVyWzFdKTsKKyAgICAgIG1GcmFtZXNDb25maWd1cmVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBOZWVkIHRvIGNoZWNrIGlmIGhlYWRlciBjb250YWlucyBuZXcgaW5mbywgZS5nLiwgd2lkdGgvaGVpZ2h0LCBldGMuCisgICAgVm9wSGVhZGVySW5mbyBoZWFkZXJfaW5mbzsKKyAgICB1aW50MzJfdCB1c2VFeHRUaW1lc3RhbXAgPSAobnVtRGVjb2RlQ2FsbHMgPT0gMCk7CisgICAgaW50MzJfdCB0ZW1wU2l6ZSA9IChpbnQzMl90KXNpemU7CisgICAgdWludDhfdCAqYml0c3RyZWFtVG1wID0gY29uc3RfY2FzdDx1aW50OF90ICo+KGRhdGEpOworICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CisgICAgaWYgKFBWRGVjb2RlVm9wSGVhZGVyKG1EZWNIYW5kbGUsICZiaXRzdHJlYW1UbXAsICZ0aW1lc3RhbXAsICZ0ZW1wU2l6ZSwgJmhlYWRlcl9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlRXh0VGltZXN0YW1wLCBtT3V0cHV0QnVmZmVyW21OdW1TYW1wbGVzT3V0cHV0ICYgMV0pICE9IFBWX1RSVUUpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBoYW5kbGVSZXNvbHV0aW9uQ2hhbmdlKCk7CisKKyAgICBQVkRlY29kZVZvcEJvZHkobURlY0hhbmRsZSwgJnRlbXBTaXplKTsKKyAgICB1aW50MzJfdCBieXRlc0NvbnN1bWVkID0gMTsKKyAgICBpZiAoc2l6ZSA+IHRlbXBTaXplKSB7CisgICAgICBieXRlc0NvbnN1bWVkID0gc2l6ZSAtIHRlbXBTaXplOworICAgIH0KKyAgICBkYXRhICs9IGJ5dGVzQ29uc3VtZWQ7CisgICAgc2l6ZSAtPSBieXRlc0NvbnN1bWVkOworICAgICsrbU51bVNhbXBsZXNPdXRwdXQ7CisgICAgKytudW1EZWNvZGVDYWxsczsKKyAgfQorICBmcmVlT3V0cHV0QnVmZmVyKCk7Cit9CisKK3ZvaWQgQ29kZWM6OmRlSW5pdERlY29kZXIoKSB7CisgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKKyAgZGVsZXRlIG1EZWNIYW5kbGU7CisgIG1EZWNIYW5kbGUgPSBudWxscHRyOworICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgZnJlZU91dHB1dEJ1ZmZlcigpOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmIChzaXplIDwgNCkgeworICAgIHJldHVybiAwOworICB9CisgIENvZGVjICpjb2RlYyA9IG5ldyBDb2RlYygpOworICBpZiAoIWNvZGVjKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGNvZGVjLT5pbml0RGVjb2RlcigpKSB7CisgICAgY29kZWMtPmRlY29kZUZyYW1lcyhkYXRhLCBzaXplKTsKKyAgfQorICBkZWxldGUgY29kZWM7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLmJwCmluZGV4IDk2MTA2ZjEuLjMxNmQ2M2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQuYnAKQEAgLTMsNiArMyw3IEBACiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCiAKKyAgICBob3N0X3N1cHBvcnRlZDp0cnVlLAogICAgIHNyY3M6IFsKICAgICAgICAgInNyYy9wdm1wM19ub3JtYWxpemUuY3BwIiwKICAgICAgICAgInNyYy9wdm1wM19hbGlhc19yZWR1Y3Rpb24uY3BwIiwKQEAgLTczLDYgKzc0LDEyIEBACiAgICAgICAgICItRE9TQ0xfVU5VU0VEX0FSRyh4KT0odm9pZCkoeCkiLAogICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKKworICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CiAKIC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9mdXp6ZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvZnV6emVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlmYTFlOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvZnV6emVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzOSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKK2NjX2Z1enogeworICAgIG5hbWU6ICJtcDNfZGVjX2Z1enplciIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXAzZGVjIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAibXAzX2RlY19mdXp6ZXIuY3BwIiwKKyAgICBdLAorCisgICAgZnV6el9jb25maWc6IHsKKyAgICAgICAgY2M6IFsKKyAgICAgICAgICAgICJhbmRyb2lkLW1lZGlhLWZ1enppbmctcmVwb3J0c0Bnb29nbGUuY29tIiwKKyAgICAgICAgXSwKKyAgICAgICAgY29tcG9uZW50aWQ6IDE1NTI3NiwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9mdXp6ZXIvUkVBRE1FLm1kIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9mdXp6ZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZGQ1YzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL2Z1enplci9SRUFETUUubWQKQEAgLTAsMCArMSw1NiBAQAorIyBGdXp6ZXIgZm9yIGxpYnN0YWdlZnJpZ2h0X21wM2RlYyBkZWNvZGVyCisKKyMjIFBsdWdpbiBEZXNpZ24gQ29uc2lkZXJhdGlvbnMKK1RoZSBmdXp6ZXIgcGx1Z2luIGZvciBtcDMgZGVjb2RlciBpcyBkZXNpZ25lZCBiYXNlZCBvbiB0aGUgdW5kZXJzdGFuZGluZyBvZiB0aGUKK2NvZGVjIGFuZCB0cmllcyB0byBhY2hpZXZlIHRoZSBmb2xsb3dpbmc6CisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKKworVGhpcyBmdXp6ZXIgbWFrZXMgdXNlIG9mIHRoZSBmb2xsb3dpbmcgY29uZmlnIHBhcmFtZXRlcnM6CisxLiBFcXVhbGl6ZXIgdHlwZSAocGFyYW1ldGVyIG5hbWU6IGBlcXVhbGl6ZXJUeXBlYCkKKworfCBQYXJhbWV0ZXJ8IFZhbGlkIFZhbHVlc3wgQ29uZmlndXJlZCBWYWx1ZXwKK3wtLS0tLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tfCAtLS0tLSB8Cit8IGBlcXVhbGl6ZXJUeXBlYCB8IDAuIGBmbGF0IGAgMS4gYGJhc3NfYm9vc3QgYCAyLiBgcm9jayBgIDMuIGBwb3AgYCA0LiBgamF6eiBgIDUuIGBjbGFzc2ljYWwgYCA2LiBgdGFsayBgIDcuIGBmbGF0XyBgIHwgQml0cyAwLCAxIGFuZCAyIG9mIGZpcnN0IGJ5dGUgb2YgaW5wdXQgc3RyZWFtIHwKK3wgYGNyY0VuYWJsZWRgIHwgMC4gYGZhbHNlIGAgMS4gYHRydWUgYHwgQml0IDAgb2Ygc2Vjb25kIGJ5dGUgb2YgaW5wdXQgc3RyZWFtIHwKKworIyMjIyMgTWF4aW1pemUgdXRpbGl6YXRpb24gb2YgaW5wdXQgZGF0YQorVGhlIHBsdWdpbiBmZWVkcyB0aGUgZW50aXJlIGlucHV0IGRhdGEgdG8gdGhlIGNvZGVjIHVzaW5nIGEgbG9vcC4KKyAqIElmIHRoZSBkZWNvZGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLCB0aGUgaW5wdXQgaXMgYWR2YW5jZWQgYnkgdGhlIG51bWJlcgorICAgb2YgYnl0ZXMgdXNlZCBieSB0aGUgZGVjb2Rlci4KKyAqIElmIHRoZSBkZWNvZGUgb3BlcmF0aW9uIHdhcyB1bi1zdWNjZXNzZnVsLCB0aGUgaW5wdXQgaXMgYWR2YW5jZWQgYnkgMSBieXRlCisgICB0aWxsIGl0IHJlYWNoZXMgYSB2YWxpZCBmcmFtZSBvciBlbmQgb2Ygc3RyZWFtLgorCitUaGlzIGVuc3VyZXMgdGhhdCB0aGUgcGx1Z2luIHRvbGVyYXRlcyBhbnkga2luZCBvZiBpbnB1dCAoZW1wdHksIGh1Z2UsCittYWxmb3JtZWQsIGV0YykgYW5kIGRvZXNudCBgZXhpdCgpYCBvbiBhbnkgaW5wdXQgYW5kIHRoZXJlYnkgaW5jcmVhc2luZyB0aGUKK2NoYW5jZSBvZiBpZGVudGlmeWluZyB2dWxuZXJhYmlsaXRpZXMuCisKKyMjIEJ1aWxkCisKK1RoaXMgZGVzY3JpYmVzIHN0ZXBzIHRvIGJ1aWxkIG1wM19kZWNfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBtcDNfZGVjX2Z1enplcgorYGBgCisKKyMjIyMgU3RlcHMgdG8gcnVuCitDcmVhdGUgYSBkaXJlY3RvcnkgQ09SUFVTX0RJUiBhbmQgY29weSBzb21lIG1wMyBmaWxlcyB0byB0aGF0IGZvbGRlci4KK1B1c2ggdGhpcyBkaXJlY3RvcnkgdG8gZGV2aWNlLgorCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvbXAzX2RlY19mdXp6ZXIvbXAzX2RlY19mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCitUbyBydW4gb24gaG9zdAorYGBgCisgICQgJEFORFJPSURfSE9TVF9PVVQvZnV6ei94ODZfNjQvbXAzX2RlY19mdXp6ZXIvbXAzX2RlY19mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCisKKyMjIFJlZmVyZW5jZXM6CisgKiBodHRwOi8vbGx2bS5vcmcvZG9jcy9MaWJGdXp6ZXIuaHRtbAorICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9vc3MtZnV6egpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9mdXp6ZXIvbXAzX2RlY19mdXp6ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9mdXp6ZXIvbXAzX2RlY19mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0N2M4YzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL2Z1enplci9tcDNfZGVjX2Z1enplci5jcHAKQEAgLTAsMCArMSwyMzcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0OgorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogT3JpZ2luYWxseSBkZXZlbG9wZWQgYW5kIGNvbnRyaWJ1dGVkIGJ5IEl0dGlhbSBTeXN0ZW1zIFB2dC4gTHRkLCBCYW5nYWxvcmUKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSA8cHZtcDNkZWNvZGVyX2FwaS5oPgorCitjb25zdGV4cHIgaW50IGtNYXhGcmFtZVNhbXBsZXMgPSA0NjA4OworY29uc3RleHByIGludCBrTWF4Q2hhbm5lbHMgPSAyOworY29uc3RleHByIGVfZXF1YWxpemF0aW9uIGtFcXVhbGl6ZXJUeXBlc1tdID0ge2ZsYXQsIGJhc3NfYm9vc3QsIHJvY2ssIHBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXp6LCBjbGFzc2ljYWwsICB0YWxrLCBmbGF0X307CisKK3N0YXRpYyBib29sIHBhcnNlTXAzSGVhZGVyKHVpbnQzMl90IGhlYWRlciwgc2l6ZV90ICpmcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9zYW1wbGluZ19yYXRlID0gbnVsbHB0ciwgdWludDMyX3QgKm91dF9jaGFubmVscyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqb3V0X2JpdHJhdGUgPSBudWxscHRyLCB1aW50MzJfdCAqb3V0X251bV9zYW1wbGVzID0gbnVsbHB0cikgeworICAqZnJhbWVfc2l6ZSA9IDA7CisgIGlmIChvdXRfc2FtcGxpbmdfcmF0ZSkgKm91dF9zYW1wbGluZ19yYXRlID0gMDsKKyAgaWYgKG91dF9jaGFubmVscykgKm91dF9jaGFubmVscyA9IDA7CisgIGlmIChvdXRfYml0cmF0ZSkgKm91dF9iaXRyYXRlID0gMDsKKyAgaWYgKG91dF9udW1fc2FtcGxlcykgKm91dF9udW1fc2FtcGxlcyA9IDA7CisKKyAgaWYgKChoZWFkZXIgJiAweGZmZTAwMDAwKSAhPSAweGZmZTAwMDAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHVuc2lnbmVkIHZlcnNpb24gPSAoaGVhZGVyID4+IDE5KSAmIDM7CisgIGlmICh2ZXJzaW9uID09IDB4MDEpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgdW5zaWduZWQgbGF5ZXIgPSAoaGVhZGVyID4+IDE3KSAmIDM7CisgIGlmIChsYXllciA9PSAweDAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHVuc2lnbmVkIGJpdHJhdGVfaW5kZXggPSAoaGVhZGVyID4+IDEyKSAmIDB4MGY7CisgIGlmIChiaXRyYXRlX2luZGV4ID09IDAgfHwgYml0cmF0ZV9pbmRleCA9PSAweDBmKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHVuc2lnbmVkIHNhbXBsaW5nX3JhdGVfaW5kZXggPSAoaGVhZGVyID4+IDEwKSAmIDM7CisgIGlmIChzYW1wbGluZ19yYXRlX2luZGV4ID09IDMpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgc3RhdGljIGNvbnN0IGludCBrU2FtcGxpbmdSYXRlVjFbXSA9IHs0NDEwMCwgNDgwMDAsIDMyMDAwfTsKKyAgaW50IHNhbXBsaW5nX3JhdGUgPSBrU2FtcGxpbmdSYXRlVjFbc2FtcGxpbmdfcmF0ZV9pbmRleF07CisgIGlmICh2ZXJzaW9uID09IDIgLyogVjIgKi8pIHsKKyAgICBzYW1wbGluZ19yYXRlIC89IDI7CisgIH0gZWxzZSBpZiAodmVyc2lvbiA9PSAwIC8qIFYyLjUgKi8pIHsKKyAgICBzYW1wbGluZ19yYXRlIC89IDQ7CisgIH0KKworICB1bnNpZ25lZCBwYWRkaW5nID0gKGhlYWRlciA+PiA5KSAmIDE7CisKKyAgaWYgKGxheWVyID09IDMpIHsgIC8vIGxheWVyIEkKKyAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjFbXSA9IHszMiwgIDY0LCAgOTYsICAxMjgsIDE2MCwgMTkyLCAyMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjU2LCAyODgsIDMyMCwgMzUyLCAzODQsIDQxNiwgNDQ4fTsKKyAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjJbXSA9IHszMiwgIDQ4LCAgNTYsICA2NCwgIDgwLCAgOTYsICAxMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI4LCAxNDQsIDE2MCwgMTc2LCAxOTIsIDIyNCwgMjU2fTsKKworICAgIGludCBiaXRyYXRlID0KKyAgICAgICAgKHZlcnNpb24gPT0gMyAvKiBWMSAqLykgPyBrQml0cmF0ZVYxW2JpdHJhdGVfaW5kZXggLSAxXSA6IGtCaXRyYXRlVjJbYml0cmF0ZV9pbmRleCAtIDFdOworCisgICAgaWYgKG91dF9iaXRyYXRlKSB7CisgICAgICAqb3V0X2JpdHJhdGUgPSBiaXRyYXRlOworICAgIH0KKyAgICAqZnJhbWVfc2l6ZSA9ICgxMjAwMCAqIGJpdHJhdGUgLyBzYW1wbGluZ19yYXRlICsgcGFkZGluZykgKiA0OworICAgIGlmIChvdXRfbnVtX3NhbXBsZXMpIHsKKyAgICAgICpvdXRfbnVtX3NhbXBsZXMgPSAzODQ7CisgICAgfQorICB9IGVsc2UgeyAgLy8gbGF5ZXIgSUkgb3IgSUlJCisgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYxTDJbXSA9IHszMiwgIDQ4LCAgNTYsICA2NCwgIDgwLCAgOTYsICAxMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMzIwLCAzODR9OworICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMUwzW10gPSB7MzIsICA0MCwgIDQ4LCAgNTYsICA2NCwgIDgwLCAgOTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTIsIDEyOCwgMTYwLCAxOTIsIDIyNCwgMjU2LCAzMjB9OworICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMltdID0gezgsIDE2LCAyNCwgMzIsIDQwLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNDQsIDE2MH07CisgICAgaW50IGJpdHJhdGU7CisgICAgaWYgKHZlcnNpb24gPT0gMyAvKiBWMSAqLykgeworICAgICAgYml0cmF0ZSA9CisgICAgICAgICAgKGxheWVyID09IDIgLyogTDIgKi8pID8ga0JpdHJhdGVWMUwyW2JpdHJhdGVfaW5kZXggLSAxXSA6IGtCaXRyYXRlVjFMM1tiaXRyYXRlX2luZGV4IC0gMV07CisKKyAgICAgIGlmIChvdXRfbnVtX3NhbXBsZXMpIHsKKyAgICAgICAgKm91dF9udW1fc2FtcGxlcyA9IDExNTI7CisgICAgICB9CisgICAgfSBlbHNlIHsgIC8vIFYyIChvciAyLjUpCisgICAgICBiaXRyYXRlID0ga0JpdHJhdGVWMltiaXRyYXRlX2luZGV4IC0gMV07CisgICAgICBpZiAob3V0X251bV9zYW1wbGVzKSB7CisgICAgICAgICpvdXRfbnVtX3NhbXBsZXMgPSAobGF5ZXIgPT0gMSAvKiBMMyAqLykgPyA1NzYgOiAxMTUyOworICAgICAgfQorICAgIH0KKworICAgIGlmIChvdXRfYml0cmF0ZSkgeworICAgICAgKm91dF9iaXRyYXRlID0gYml0cmF0ZTsKKyAgICB9CisKKyAgICBpZiAodmVyc2lvbiA9PSAzIC8qIFYxICovKSB7CisgICAgICAqZnJhbWVfc2l6ZSA9IDE0NDAwMCAqIGJpdHJhdGUgLyBzYW1wbGluZ19yYXRlICsgcGFkZGluZzsKKyAgICB9IGVsc2UgeyAgLy8gVjIgb3IgVjIuNQorICAgICAgc2l6ZV90IHRtcCA9IChsYXllciA9PSAxIC8qIEwzICovKSA/IDcyMDAwIDogMTQ0MDAwOworICAgICAgKmZyYW1lX3NpemUgPSB0bXAgKiBiaXRyYXRlIC8gc2FtcGxpbmdfcmF0ZSArIHBhZGRpbmc7CisgICAgfQorICB9CisKKyAgaWYgKG91dF9zYW1wbGluZ19yYXRlKSB7CisgICAgKm91dF9zYW1wbGluZ19yYXRlID0gc2FtcGxpbmdfcmF0ZTsKKyAgfQorCisgIGlmIChvdXRfY2hhbm5lbHMpIHsKKyAgICBpbnQgY2hhbm5lbF9tb2RlID0gKGhlYWRlciA+PiA2KSAmIDM7CisgICAgKm91dF9jaGFubmVscyA9IChjaGFubmVsX21vZGUgPT0gMykgPyAxIDogMjsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdWludDMyX3QgVTMyX0FUKGNvbnN0IHVpbnQ4X3QgKnB0cikgeworICByZXR1cm4gcHRyWzBdIDw8IDI0IHwgcHRyWzFdIDw8IDE2IHwgcHRyWzJdIDw8IDggfCBwdHJbM107Cit9CisKK3N0YXRpYyBib29sIGNoZWNrSGVhZGVyKHVpbnQ4ICpoZWFkZXIsIHNpemVfdCBpblNpemUpIHsKKyAgc2l6ZV90IGZyYW1lU2l6ZTsKKyAgc2l6ZV90IHRvdGFsSW5TaXplID0gMDsKKyAgYm9vbCBpc1ZhbGlkQnVmZmVyID0gZmFsc2U7CisKKyAgd2hpbGUgKHRvdGFsSW5TaXplICsgNCA8IGluU2l6ZSkgeworICAgIGlzVmFsaWRCdWZmZXIgPSB0cnVlOworICAgIHVpbnQzMl90IHZhbCA9IFUzMl9BVChoZWFkZXIgKyB0b3RhbEluU2l6ZSk7CisgICAgaWYgKCFwYXJzZU1wM0hlYWRlcih2YWwsICZmcmFtZVNpemUsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHRvdGFsSW5TaXplICs9IGZyYW1lU2l6ZTsKKyAgfQorCisgIHJldHVybiAoaXNWYWxpZEJ1ZmZlcik7Cit9CisKK2NsYXNzIENvZGVjIHsKKyBwdWJsaWM6CisgIENvZGVjKCkgPSBkZWZhdWx0OworICB+Q29kZWMoKSB7IGRlSW5pdERlY29kZXIoKTsgfQorCisgIGJvb2wgaW5pdERlY29kZXIoKTsKKyAgdm9pZCBkZWNvZGVGcmFtZXModWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICB2b2lkIGRlSW5pdERlY29kZXIoKTsKKworIHByaXZhdGU6CisgIHRQVk1QM0RlY29kZXJFeHRlcm5hbCAqbUNvbmZpZyA9IG51bGxwdHI7CisgIHZvaWQgKm1EZWNvZGVyQnVmID0gbnVsbHB0cjsKK307CisKK2Jvb2wgQ29kZWM6OmluaXREZWNvZGVyKCkgeworICBtQ29uZmlnID0gbmV3IHRQVk1QM0RlY29kZXJFeHRlcm5hbHt9OworICBpZiAoIW1Db25maWcpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgc2l6ZV90IGRlY29kZXJCdWZTaXplID0gcHZtcDNfZGVjb2Rlck1lbVJlcXVpcmVtZW50cygpOworICBtRGVjb2RlckJ1ZiA9IG1hbGxvYyhkZWNvZGVyQnVmU2l6ZSk7CisgIGlmICghbURlY29kZXJCdWYpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgbWVtc2V0KG1EZWNvZGVyQnVmLCAweDAsIGRlY29kZXJCdWZTaXplKTsKKyAgcHZtcDNfSW5pdERlY29kZXIobUNvbmZpZywgbURlY29kZXJCdWYpOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDb2RlYzo6ZGVjb2RlRnJhbWVzKHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIHVpbnQ4X3QgZXF1YWxpemVyVHlwZVZhbHVlID0gKGRhdGFbMF0gJiAweDcpOworICBtQ29uZmlnLT5lcXVhbGl6ZXJUeXBlID0ga0VxdWFsaXplclR5cGVzW2VxdWFsaXplclR5cGVWYWx1ZV07CisgIG1Db25maWctPmNyY0VuYWJsZWQgPSBkYXRhWzFdICYgMHgxOworCisgIHdoaWxlIChzaXplID4gMCkgeworICAgIGJvb2wgc3RhdHVzID0gY2hlY2tIZWFkZXIoZGF0YSwgc2l6ZSk7CisgICAgaWYgKCFzdGF0dXMpIHsKKyAgICAgIHNpemUtLTsKKyAgICAgIGRhdGErKzsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBzaXplX3Qgb3V0QnVmU2l6ZSA9IGtNYXhGcmFtZVNhbXBsZXMgKiBrTWF4Q2hhbm5lbHM7CisgICAgc2l6ZV90IHVzZWRCeXRlcyA9IDA7CisgICAgaW50MTZfdCBvdXRwdXRCdWZbb3V0QnVmU2l6ZV07CisgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJDdXJyZW50TGVuZ3RoID0gc2l6ZTsKKyAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGggPSAwOworICAgIG1Db25maWctPmlucHV0QnVmZmVyTWF4TGVuZ3RoID0gMDsKKyAgICBtQ29uZmlnLT5wSW5wdXRCdWZmZXIgPSBkYXRhOworICAgIG1Db25maWctPnBPdXRwdXRCdWZmZXIgPSBvdXRwdXRCdWY7CisgICAgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplID0gb3V0QnVmU2l6ZSAvIHNpemVvZihpbnQxNl90KTsKKworICAgIEVSUk9SX0NPREUgZGVjb2RlckVycjsKKyAgICBkZWNvZGVyRXJyID0gcHZtcDNfZnJhbWVkZWNvZGVyKG1Db25maWcsIG1EZWNvZGVyQnVmKTsKKyAgICBpZiAoZGVjb2RlckVyciAhPSBOT19ERUNPRElOR19FUlJPUikgeworICAgICAgc2l6ZS0tOworICAgICAgZGF0YSsrOworICAgIH0gZWxzZSB7CisgICAgICB1c2VkQnl0ZXMgPSBzdGQ6Om1pbigoaW50MzJfdClzaXplLCBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGgpOworICAgICAgc2l6ZSAtPSB1c2VkQnl0ZXM7CisgICAgICBkYXRhICs9IHVzZWRCeXRlczsKKyAgICB9CisgIH0KK30KKwordm9pZCBDb2RlYzo6ZGVJbml0RGVjb2RlcigpIHsKKyAgaWYgKG1EZWNvZGVyQnVmKSB7CisgICAgZnJlZShtRGVjb2RlckJ1Zik7CisgICAgbURlY29kZXJCdWYgPSBudWxscHRyOworICB9CisgIGRlbGV0ZSBtQ29uZmlnOworICBtQ29uZmlnID0gbnVsbHB0cjsKK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoc2l6ZSA8IDQpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBDb2RlYyAqY29kZWMgPSBuZXcgQ29kZWMoKTsKKyAgaWYgKCFjb2RlYykgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChjb2RlYy0+aW5pdERlY29kZXIoKSkgeworICAgIGNvZGVjLT5kZWNvZGVGcmFtZXMoY29uc3RfY2FzdDx1aW50OF90ICo+KGRhdGEpLCBzaXplKTsKKyAgfQorICBkZWxldGUgY29kZWM7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGN0XzYuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGN0XzYuY3BwCmluZGV4IDFmODAxOGEuLmMzMDY4NzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RjdF82LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kY3RfNi5jcHAKQEAgLTExMSw2ICsxMTEsNyBAQAogOyBGVU5DVElPTiBDT0RFCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoImludGVnZXIiKSkpCiB2b2lkIHB2bXAzX2RjdF82KGludDMyIHZlY1tdKQogewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tZGN0XzYuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbWRjdF82LmNwcAppbmRleCA4ZDgwZThmLi4xYmEwODBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19tZGN0XzYuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX21kY3RfNi5jcHAKQEAgLTExOCw3ICsxMTgsNyBAQAogOyBGVU5DVElPTiBDT0RFCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KIAotCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKIHZvaWQgcHZtcDNfbWRjdF82KGludDMyIHZlY1tdLCBpbnQzMiAqaGlzdG9yeSkKIHsKICAgICBpbnQzMiBpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvdGVzdC9BbmRyb2lkVGVzdC54bWwKaW5kZXggN2ZmOTczMi4uMjMzZjliYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sCkBAIC0xOSw3ICsxOSw3IEBACiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9Ik1wM0RlY29kZXJUZXN0LT4vZGF0YS9sb2NhbC90bXAvTXAzRGVjb2RlclRlc3QiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1maWxlIgotICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wM2RlYy90ZXN0L01wM0RlY29kZXJUZXN0LnppcD91bnppcD10cnVlIgorICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wM2RlYy90ZXN0L01wM0RlY29kZXJUZXN0LTEuMS56aXA/dW56aXA9dHJ1ZSIKICAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvTXAzRGVjb2RlclRlc3RSZXMvIiAvPgogICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvTXAzRGVjb2RlclRlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L01wM0RlY29kZXJUZXN0LmNwcAppbmRleCA5OTU1M2VjLi4wNzg0YzBjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvTXAzRGVjb2RlclRlc3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvdGVzdC9NcDNEZWNvZGVyVGVzdC5jcHAKQEAgLTE4NSw2ICsxODUsNyBAQAogSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKE1wM0RlY29kZXJUZXN0QWxsLCBNcDNEZWNvZGVyVGVzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM18zMHNlYy5tcDMiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWlucy5tcDMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImJ1Z18xMzYwNTM4ODUubXAzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJiYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHoubXAzIikpKTsKIAogaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcAppbmRleCA0ZjYxYWE4Li41YmIxODc5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAKQEAgLTU4LDYgKzU4LDggQEAKICAgICAgIG1JbnB1dEJ1ZmZlckNvdW50KDApLAogICAgICAgbURlY29kZXIoTlVMTCksCiAgICAgICBtSGVhZGVyKE5VTEwpLAorICAgICAgbU51bUNoYW5uZWxzKDEpLAorICAgICAgbVNhbXBsaW5nUmF0ZShrUmF0ZSksCiAgICAgICBtQ29kZWNEZWxheSgwKSwKICAgICAgIG1TZWVrUHJlUm9sbCgwKSwKICAgICAgIG1BbmNob3JUaW1lVXMoMCksCkBAIC0xNjksMTEgKzE3MSwxMSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBvcHVzUGFyYW1zLT5uQXVkaW9CYW5kV2lkdGggPSAwOwotICAgICAgICAgICAgb3B1c1BhcmFtcy0+blNhbXBsZVJhdGUgPSBrUmF0ZTsKKyAgICAgICAgICAgIG9wdXNQYXJhbXMtPm5TYW1wbGVSYXRlID0gbVNhbXBsaW5nUmF0ZTsKICAgICAgICAgICAgIG9wdXNQYXJhbXMtPm5CaXRSYXRlID0gMDsKIAogICAgICAgICAgICAgaWYgKCFpc0NvbmZpZ3VyZWQoKSkgewotICAgICAgICAgICAgICAgIG9wdXNQYXJhbXMtPm5DaGFubmVscyA9IDE7CisgICAgICAgICAgICAgICAgb3B1c1BhcmFtcy0+bkNoYW5uZWxzID0gbU51bUNoYW5uZWxzOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBvcHVzUGFyYW1zLT5uQ2hhbm5lbHMgPSBtSGVhZGVyLT5jaGFubmVsczsKICAgICAgICAgICAgIH0KQEAgLTI3NCw3ICsyNzYsOCBAQAogICAgICAgICAgICAgaWYgKG9wdXNQYXJhbXMtPm5Qb3J0SW5kZXggIT0gMCkgewogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9Ci0KKyAgICAgICAgICAgIG1OdW1DaGFubmVscyA9IG9wdXNQYXJhbXMtPm5DaGFubmVsczsKKyAgICAgICAgICAgIG1TYW1wbGluZ1JhdGUgPSBvcHVzUGFyYW1zLT5uU2FtcGxlUmF0ZTsKICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgICAgICB9CiAKQEAgLTQ5Niw2ICs0OTksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdCo+KGluSGVhZGVyLT5wQnVmZmVyICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+bk9mZnNldCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmF0ZSk7CisgICAgICAgICAgICAgICAgbVNhbXBsaW5nUmF0ZSA9IGtSYXRlOworICAgICAgICAgICAgICAgIG1OdW1DaGFubmVscyA9IG1IZWFkZXItPmNoYW5uZWxzOwogICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkLCAxLCAwLCBOVUxMKTsKICAgICAgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7CiAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5oCmluZGV4IDkxY2FmYTEuLjAwMDU4YzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5oCkBAIC03MCw2ICs3MCw4IEBACiAgICAgT3B1c01TRGVjb2RlciAqbURlY29kZXI7CiAgICAgT3B1c0hlYWRlciAqbUhlYWRlcjsKIAorICAgIGludDMyX3QgbU51bUNoYW5uZWxzOworICAgIGludDMyX3QgbVNhbXBsaW5nUmF0ZTsKICAgICBpbnQ2NF90IG1Db2RlY0RlbGF5OwogICAgIGludDY0X3QgbVNlZWtQcmVSb2xsOwogICAgIGludDY0X3QgbVNhbXBsZXNUb0Rpc2NhcmQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19zdy54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19zdy54bWwKaW5kZXggNjU3MTE2Mi4uZGQyZWVkMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3Nfc3cueG1sCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX3N3LnhtbApAQCAtMjk1LDEyICsyOTUsMTIgQEAKICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImJpdHJhdGUtbW9kZXMiIHZhbHVlPSJWQlIsQ0JSIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuaGV2Yy5lbmNvZGVyIiB0eXBlPSJ2aWRlby9oZXZjIiB2YXJpYW50PSIhc2xvdy1jcHUiPgotICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBNYWluVGllckxldmVsMyAtLT4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSI5NjB4NTQ0IiAvPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBNYWluVGllckxldmVsNTEgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iNTEyeDUxMiIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9Ijh4OCIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtODE2MCIgLz4gPCEtLSBtYXggOTYweDU0NCAtLT4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMjQ0ODgwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS00MDk2IiAvPiA8IS0tIG1heCA1MTJ4NTEyIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0xMjI4ODAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iZnJhbWUtcmF0ZSIgcmFuZ2U9IjEtMTIwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTEwMDAwMDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNvbXBsZXhpdHkiIHJhbmdlPSIwLTEwIiAgZGVmYXVsdD0iMCIgLz4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwCmluZGV4IDMyYjIwNzUuLmI2MzM1M2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvQW5kcm9pZC5icApAQCAtMiw2ICsyLDcgQEAKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfZmxhY2RlYyIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJGTEFDRGVjb2Rlci5jcHAiLApAQCAtMzMsNiArMzQsMTMgQEAKICAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKLSAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAogICAgIF0sCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuY3BwCmluZGV4IGNlZjBiYzYuLmY1ZTk1MzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9GTEFDRGVjb2Rlci5jcHAKQEAgLTQzMyw3ICs0MzMsNyBAQAogICAgICAgICAgICAgaWYgKG1CdWZmZXIgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIG1CdWZmZXJEYXRhU2l6ZSA9IDA7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlckxlbiA9IDA7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImRlY29kZU9uZUZyYW1lOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBpbnB1dCBidWZmZXIiKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYWRkRGF0YVRvQnVmZmVyOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBpbnB1dCBidWZmZXIiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUJ1ZmZlckxlbiA9IG1CdWZmZXJEYXRhU2l6ZSArIGluQnVmZmVyTGVuOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5jcHAKaW5kZXggOGE3YzNlYi4uMGE0ZTU5OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyUm9zdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuY3BwCkBAIC0xNjYsNyArMTY2LDcgQEAKICAgICAgICAgfQogICAgICAgICBzLmFwcGVuZCgiXG4iKTsKICAgICB9Ci0gICAgd3JpdGUoZmQsIHMuc3RyaW5nKCksIHMuc2l6ZSgpKTsKKyAgICAodm9pZCl3cml0ZShmZCwgcy5zdHJpbmcoKSwgcy5zaXplKCkpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5jcHAKaW5kZXggNGJkMTg2Yy4uODcyMmUxNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuY3BwCkBAIC0zODcsMTAgKzM4NywxNCBAQAogICAgIHZhX3N0YXJ0KGFwLCBmb3JtYXQpOwogCiAgICAgY2hhciAqYnVmZmVyOwotICAgIHZhc3ByaW50ZigmYnVmZmVyLCBmb3JtYXQsIGFwKTsKKyAgICBpbnQgYnVmZmVyU2l6ZSA9IHZhc3ByaW50ZigmYnVmZmVyLCBmb3JtYXQsIGFwKTsKIAogICAgIHZhX2VuZChhcCk7CiAKKyAgICBpZihidWZmZXJTaXplIDwgMCkgeworICAgICAgICByZXR1cm4gQVN0cmluZygpOworICAgIH0KKwogICAgIEFTdHJpbmcgcmVzdWx0KGJ1ZmZlcik7CiAKICAgICBmcmVlKGJ1ZmZlcik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKaW5kZXggZjQ0MGUwMC4uZWJmMTAzNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icApAQCAtMTIsNiArMTIsNyBAQAogICAgIHZuZGs6IHsKICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICB9LAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKICAgICBpbmNsdWRlX2RpcnM6IFsKICAgICAgICAgImZyYW1ld29ya3MvYXYvaW5jbHVkZSIsCkBAIC0yNSw3ICsyNiw2IEBACiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25faGVhZGVycyIsCiAgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCkBAIC04Niw2ICs4Niw5IEBACiAgICAgICAgICAgICAgICAgIi1ETk9fSU1FTU9SWSIsCiAgICAgICAgICAgICBdLAogICAgICAgICB9LAorICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAogICAgIH0sCiAKICAgICBjbGFuZzogdHJ1ZSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmNwcAppbmRleCBmNTNkMmM5Li45ZDY4ODdjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9hdmNfdXRpbHMuY3BwCkBAIC01NTksMTEgKzU1OSw5IEBACiAgICAgQ0hFQ0tfTkUodmlkZW9fb2JqZWN0X3R5cGVfaW5kaWNhdGlvbiwKICAgICAgICAgICAgICAweDIxdSAvKiBGaW5lIEdyYW51bGFyaXR5IFNjYWxhYmxlICovKTsKIAotICAgIHVuc2lnbmVkIHZpZGVvX29iamVjdF9sYXllcl92ZXJpZCBfX3VudXNlZDsKLSAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfbGF5ZXJfcHJpb3JpdHkgX191bnVzZWQ7CiAgICAgaWYgKGJyLmdldEJpdHMoMSkpIHsKLSAgICAgICAgdmlkZW9fb2JqZWN0X2xheWVyX3ZlcmlkID0gYnIuZ2V0Qml0cyg0KTsKLSAgICAgICAgdmlkZW9fb2JqZWN0X2xheWVyX3ByaW9yaXR5ID0gYnIuZ2V0Qml0cygzKTsKKyAgICAgICAgYnIuc2tpcEJpdHMoNCk7IC8vdmlkZW9fb2JqZWN0X2xheWVyX3ZlcmlkCisgICAgICAgIGJyLnNraXBCaXRzKDMpOyAvL3ZpZGVvX29iamVjdF9sYXllcl9wcmlvcml0eQogICAgIH0KICAgICB1bnNpZ25lZCBhc3BlY3RfcmF0aW9faW5mbyA9IGJyLmdldEJpdHMoNCk7CiAgICAgaWYgKGFzcGVjdF9yYXRpb19pbmZvID09IDB4MGYgLyogZXh0ZW5kZWQgUEFSICovKSB7CkBAIC02MjIsNyArNjIwLDcgQEAKICAgICB1bnNpZ25lZCB2aWRlb19vYmplY3RfbGF5ZXJfaGVpZ2h0ID0gYnIuZ2V0Qml0cygxMyk7CiAgICAgQ0hFQ0soYnIuZ2V0Qml0cygxKSk7ICAvLyBtYXJrZXJfYml0CiAKLSAgICB1bnNpZ25lZCBpbnRlcmxhY2VkIF9fdW51c2VkID0gYnIuZ2V0Qml0cygxKTsKKyAgICBici5za2lwQml0cygxKTsgLy8gaW50ZXJsYWNlZAogCiAgICAgKndpZHRoID0gdmlkZW9fb2JqZWN0X2xheWVyX3dpZHRoOwogICAgICpoZWlnaHQgPSB2aWRlb19vYmplY3RfbGF5ZXJfaGVpZ2h0OwpAQCAtNjY4LDcgKzY2Niw3IEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICB1bnNpZ25lZCBwcm90ZWN0aW9uIF9fdW51c2VkID0gKGhlYWRlciA+PiAxNikgJiAxOworICAgIC8vIHdlIGNhbiBnZXQgcHJvdGVjdGlvbiB2YWx1ZSBmcm9tIChoZWFkZXIgPj4gMTYpICYgMQogCiAgICAgdW5zaWduZWQgYml0cmF0ZV9pbmRleCA9IChoZWFkZXIgPj4gMTIpICYgMHgwZjsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaAppbmRleCBhYjE3YTAyLi5lNGI5OWJmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaApAQCAtMTQ4LDcgKzE0OCw4IEBACiAgICAgc3RhdGljIGNoYXIgKkdldERlYnVnTmFtZShjb25zdCBjaGFyICpuYW1lKTsKIAogICAgIGlubGluZSBzdGF0aWMgYm9vbCBpc0V4cGVyaW1lbnRFbmFibGVkKAotICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSBfX3VudXNlZCAvKiBub25udWxsICovLCBib29sIGFsbG93IF9fdW51c2VkID0gdHJ1ZSkgeworICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSAvKiBub25udWxsICovLAorICAgICAgICAgICAgYm9vbCBhbGxvdyBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKSA9IHRydWUpIHsKICNpZmRlZiBFTkFCTEVfU1RBR0VGUklHSFRfRVhQRVJJTUVOVFMKICAgICAgICAgaWYgKCFzdHJjbXAobmFtZSwgImxlZ2FjeS1hZGFwdGl2ZSIpKSB7CiAgICAgICAgICAgICByZXR1cm4gZ2V0RXhwZXJpbWVudEZsYWcoYWxsb3csIG5hbWUsIDIsIDEpOyAvLyBldmVyeSBvdGhlciBkYXkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmgKaW5kZXggYWY2YjM1Ny4uM2I2NDZkYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmgKQEAgLTYzLDcgKzYzLDcgQEAKIAogdGVtcGxhdGU8Y2xhc3MgVD4KIHZvaWQgRU5TVVJFX1VOU0lHTkVEX1RZUEUoKSB7Ci0gICAgVCBUWVBFX01VU1RfQkVfVU5TSUdORURbKFQpLTEgPCAwID8gLTEgOiAwXSBfX3VudXNlZDsKKyAgICBUIFRZUEVfTVVTVF9CRV9VTlNJR05FRFsoVCktMSA8IDAgPyAtMSA6IDBdIF9fYXR0cmlidXRlX18oKHVudXNlZCkpOwogfQogCiAvLyBuZWVkbGUgaXMgaW4gcmFuZ2UgW2hheVN0YXJ0LCBoYXlTdGFydCArIGhheVNpemUpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FWQ1V0aWxzVGVzdEVudmlyb25tZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FWQ1V0aWxzVGVzdEVudmlyb25tZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI4YTdiYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQVZDVXRpbHMvQVZDVXRpbHNUZXN0RW52aXJvbm1lbnQuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0FWQ19VVElMU19URVNUX0VOVklST05NRU5UX0hfXworI2RlZmluZSBfX0FWQ19VVElMU19URVNUX0VOVklST05NRU5UX0hfXworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGdldG9wdC5oPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitjbGFzcyBBVkNVdGlsc1Rlc3RFbnZpcm9ubWVudCA6IHB1YmxpYzo6dGVzdGluZzo6RW52aXJvbm1lbnQgeworICBwdWJsaWM6CisgICAgQVZDVXRpbHNUZXN0RW52aXJvbm1lbnQoKSA6IHJlcygiL2RhdGEvbG9jYWwvdG1wLyIpIHt9CisKKyAgICAvLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyAgICBpbnQgaW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndik7CisKKyAgICB2b2lkIHNldFJlcyhjb25zdCBjaGFyICpfcmVzKSB7IHJlcyA9IF9yZXM7IH0KKworICAgIGNvbnN0IHN0cmluZyBnZXRSZXMoKSBjb25zdCB7IHJldHVybiByZXM7IH0KKworICBwcml2YXRlOgorICAgIHN0cmluZyByZXM7Cit9OworCitpbnQgQVZDVXRpbHNUZXN0RW52aXJvbm1lbnQ6OmluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7eyJwYXRoIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdQJ30sIHswLCAwLCAwLCAwfX07CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICBpbnQgYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJQOiIsIG9wdGlvbnMsICZpbmRleCk7CisgICAgICAgIGlmIChjID09IC0xKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgY2FzZSAnUCc6IHsKKyAgICAgICAgICAgICAgICBzZXRSZXMob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3B0aW5kIDwgYXJnYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIG9wdGlvbjogJXNcblxuIgorICAgICAgICAgICAgICAgICJ1c2FnZTogJXMgPGd0ZXN0IG9wdGlvbnM+IDx0ZXN0IG9wdGlvbnM+XG5cbiIKKyAgICAgICAgICAgICAgICAidGVzdCBvcHRpb25zIGFyZTpcblxuIgorICAgICAgICAgICAgICAgICItUCwgLS1wYXRoOiBSZXNvdXJjZSBmaWxlcyBkaXJlY3RvcnkgbG9jYXRpb25cbiIsCisgICAgICAgICAgICAgICAgYXJndltvcHRpbmQgPzogMV0sIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAgLy8gX19BVkNfVVRJTFNfVEVTVF9FTlZJUk9OTUVOVF9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQVZDVXRpbHMvQVZDVXRpbHNVbml0VGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FWQ1V0aWxzVW5pdFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YTg1OTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FWQ1V0aWxzVW5pdFRlc3QuY3BwCkBAIC0wLDAgKzEsNDExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBVkNVdGlsc1VuaXRUZXN0IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKworI2luY2x1ZGUgIm1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oIgorI2luY2x1ZGUgIm1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmgiCisKKyNpbmNsdWRlICJBVkNVdGlsc1Rlc3RFbnZpcm9ubWVudC5oIgorCitjb25zdGV4cHIgc2l6ZV90IGtTbWFsbEJ1ZmZlclNpemUgPSAyOworY29uc3RleHByIHVpbnQ4X3Qga1NQU21hc2sgPSAweDFmOworY29uc3RleHByIHVpbnQ4X3Qga1NQU1N0YXJ0Q29kZSA9IDB4MDc7Citjb25zdGV4cHIgdWludDhfdCBrQ29uZmlnVmVyc2lvbiA9IDB4MDE7CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitzdGF0aWMgQVZDVXRpbHNUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOworCitjbGFzcyBNcGVnQXVkaW9Vbml0VGVzdAorICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTwKKyAgICAgICAgICAgICAgdHVwbGU8LyphdWRpb0hlYWRlciovIHVpbnQzMl90LCAvKmZyYW1lU2l6ZSovIGludDMyX3QsIC8qc2FtcGxlUmF0ZSovIGludDMyX3QsCisgICAgICAgICAgICAgICAgICAgIC8qbnVtQ2hhbm5lbHMqLyBpbnQzMl90LCAvKmJpdFJhdGUqLyBpbnQzMl90LCAvKm51bVNhbXBsZXMqLyBpbnQzMl90Pj4ge307CisKK2NsYXNzIFZPTERpbWVuc2lvblRlc3QKKyAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08CisgICAgICAgICAgICAgIHR1cGxlPC8qZmlsZU5hbWUqLyBzdHJpbmcsIC8qdm9sV2lkdGgqLyBpbnQzMl90LCAvKnZvbEhlaWdodCovIGludDMyX3Q+PiB7fTsKKworY2xhc3MgQVZDVXRpbHMgeworICBwdWJsaWM6CisgICAgYm9vbCBTZXRVcEFWQ1V0aWxzKHN0cmluZyBmaWxlTmFtZSwgc3RyaW5nIGluZm9GaWxlTmFtZSkgeworICAgICAgICBtSW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBmaWxlTmFtZTsKKyAgICAgICAgbUlucHV0RmlsZVN0cmVhbS5vcGVuKG1JbnB1dEZpbGUsIGlmc3RyZWFtOjppbik7CisgICAgICAgIGlmICghbUlucHV0RmlsZVN0cmVhbS5pc19vcGVuKCkpIHJldHVybiBmYWxzZTsKKworICAgICAgICBtSW5mb0ZpbGUgPSBnRW52LT5nZXRSZXMoKSArIGluZm9GaWxlTmFtZTsKKyAgICAgICAgbUluZm9GaWxlU3RyZWFtLm9wZW4obUluZm9GaWxlLCBpZnN0cmVhbTo6aW4pOworICAgICAgICBpZiAoIW1JbnB1dEZpbGVTdHJlYW0uaXNfb3BlbigpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIH5BVkNVdGlscygpIHsKKyAgICAgICAgaWYgKG1JbnB1dEZpbGVTdHJlYW0uaXNfb3BlbigpKSBtSW5wdXRGaWxlU3RyZWFtLmNsb3NlKCk7CisgICAgICAgIGlmIChtSW5mb0ZpbGVTdHJlYW0uaXNfb3BlbigpKSBtSW5mb0ZpbGVTdHJlYW0uY2xvc2UoKTsKKyAgICB9CisKKyAgICBzdHJpbmcgbUlucHV0RmlsZTsKKyAgICBzdHJpbmcgbUluZm9GaWxlOworCisgICAgaWZzdHJlYW0gbUlucHV0RmlsZVN0cmVhbTsKKyAgICBpZnN0cmVhbSBtSW5mb0ZpbGVTdHJlYW07Cit9OworCitjbGFzcyBBVkNEaW1lbnNpb25UZXN0CisgICAgOiBwdWJsaWMgQVZDVXRpbHMsCisgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPAorICAgICAgICAgICAgICB0dXBsZTwvKmZpbGVOYW1lKi8gc3RyaW5nLCAvKmluZm9GaWxlTmFtZSovIHN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgLyphdmNXaWR0aCovIHNpemVfdCwgLyphdmNIZWlnaHQqLyBzaXplX3QsIC8qbnVtYmVyT2ZOQUxVbml0cyovIGludDMyX3Q+PiB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIHR1cGxlPHN0cmluZywgc3RyaW5nLCBzaXplX3QsIHNpemVfdCwgc2l6ZV90PiBwYXJhbXMgPSBHZXRQYXJhbSgpOworICAgICAgICBzdHJpbmcgZmlsZU5hbWUgPSBnZXQ8MD4ocGFyYW1zKTsKKyAgICAgICAgc3RyaW5nIGluZm9GaWxlTmFtZSA9IGdldDwxPihwYXJhbXMpOworICAgICAgICBBVkNVdGlsczo6U2V0VXBBVkNVdGlscyhmaWxlTmFtZSwgaW5mb0ZpbGVOYW1lKTsKKworICAgICAgICBtRnJhbWVXaWR0aCA9IGdldDwyPihwYXJhbXMpOworICAgICAgICBtRnJhbWVIZWlnaHQgPSBnZXQ8Mz4ocGFyYW1zKTsKKyAgICAgICAgbU5hbFVuaXRzRXhwZWN0ZWQgPSBnZXQ8ND4ocGFyYW1zKTsKKyAgICB9CisKKyAgICBzaXplX3QgbUZyYW1lV2lkdGg7CisgICAgc2l6ZV90IG1GcmFtZUhlaWdodDsKKyAgICBpbnQzMl90IG1OYWxVbml0c0V4cGVjdGVkOworfTsKKworY2xhc3MgQXZjY0JveFRlc3QgOiBwdWJsaWMgQVZDRGltZW5zaW9uVGVzdCB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7IEFWQ0RpbWVuc2lvblRlc3Q6OlNldFVwKCk7IH0KK307CisKK2NsYXNzIEFWQ0ZyYW1lVGVzdAorICAgIDogcHVibGljIEFWQ1V0aWxzLAorICAgICAgcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxwYWlyPC8qZmlsZU5hbWUqLyBzdHJpbmcsIC8qaW5mb0ZpbGVOYW1lKi8gc3RyaW5nPj4geworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBzdHJpbmcgZmlsZU5hbWUgPSBHZXRQYXJhbSgpLmZpcnN0OworICAgICAgICBzdHJpbmcgaW5mb0ZpbGVOYW1lID0gR2V0UGFyYW0oKS5zZWNvbmQ7CisgICAgICAgIEFWQ1V0aWxzOjpTZXRVcEFWQ1V0aWxzKGZpbGVOYW1lLCBpbmZvRmlsZU5hbWUpOworICAgIH0KK307CisKK1RFU1RfUChNcGVnQXVkaW9Vbml0VGVzdCwgQXVkaW9Qcm9maWxlVGVzdCkgeworICAgIHR1cGxlPHVpbnQzMl90LCBzaXplX3QsIGludCwgaW50LCBpbnQsIGludD4gcGFyYW1zID0gR2V0UGFyYW0oKTsKKyAgICB1aW50MzJfdCBoZWFkZXIgPSBnZXQ8MD4ocGFyYW1zKTsKKworICAgIHNpemVfdCBhdWRpb0ZyYW1lU2l6ZSA9IGdldDwxPihwYXJhbXMpOworICAgIGludCBhdWRpb1NhbXBsZVJhdGUgPSBnZXQ8Mj4ocGFyYW1zKTsKKyAgICBpbnQgYXVkaW9OdW1DaGFubmVscyA9IGdldDwzPihwYXJhbXMpOworICAgIGludCBhdWRpb0JpdFJhdGUgPSBnZXQ8ND4ocGFyYW1zKTsKKyAgICBpbnQgYXVkaW9OdW1TYW1wbGVzID0gZ2V0PDU+KHBhcmFtcyk7CisKKyAgICBzaXplX3QgZnJhbWVTaXplID0gMDsKKyAgICBpbnQgc2FtcGxlUmF0ZSA9IDA7CisgICAgaW50IG51bUNoYW5uZWxzID0gMDsKKyAgICBpbnQgYml0UmF0ZSA9IDA7CisgICAgaW50IG51bVNhbXBsZXMgPSAwOworCisgICAgYm9vbCBzdGF0dXMgPSBHZXRNUEVHQXVkaW9GcmFtZVNpemUoaGVhZGVyLCAmZnJhbWVTaXplLCAmc2FtcGxlUmF0ZSwgJm51bUNoYW5uZWxzLCAmYml0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbnVtU2FtcGxlcyk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCBBdWRpbyBwcm9wZXJ0aWVzIjsKKworICAgIEFTU0VSVF9FUShmcmFtZVNpemUsIGF1ZGlvRnJhbWVTaXplKSA8PCAiV3JvbmcgZnJhbWUgc2l6ZSBmb3VuZCI7CisKKyAgICBBU1NFUlRfRVEoc2FtcGxlUmF0ZSwgYXVkaW9TYW1wbGVSYXRlKSA8PCAiV3Jvbmcgc2FtcGxlIHJhdGUgZm91bmQiOworCisgICAgQVNTRVJUX0VRKG51bUNoYW5uZWxzLCBhdWRpb051bUNoYW5uZWxzKSA8PCAiV3JvbmcgbnVtYmVyIG9mIGNoYW5uZWxzIGZvdW5kIjsKKworICAgIEFTU0VSVF9FUShiaXRSYXRlLCBhdWRpb0JpdFJhdGUpIDw8ICJXcm9uZyBiaXQgcmF0ZSBmb3VuZCI7CisKKyAgICBBU1NFUlRfRVEobnVtU2FtcGxlcywgYXVkaW9OdW1TYW1wbGVzKSA8PCAiV3JvbmcgbnVtYmVyIG9mIHNhbXBsZXMgZm91bmQiOworfQorCitURVNUX1AoVk9MRGltZW5zaW9uVGVzdCwgRGltZW5zaW9uVGVzdCkgeworICAgIHR1cGxlPHN0cmluZywgaW50MzJfdCwgaW50MzJfdD4gcGFyYW1zID0gR2V0UGFyYW0oKTsKKyAgICBzdHJpbmcgaW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MD4ocGFyYW1zKTsKKyAgICBpZnN0cmVhbSBpbnB1dEZpbGVTdHJlYW07CisgICAgaW5wdXRGaWxlU3RyZWFtLm9wZW4oaW5wdXRGaWxlLCBpZnN0cmVhbTo6aW4pOworICAgIEFTU0VSVF9UUlVFKGlucHV0RmlsZVN0cmVhbS5pc19vcGVuKCkpIDw8ICJGYWlsZWQgdG8gb3BlbjogIiA8PCBpbnB1dEZpbGU7CisKKyAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgaW50OF90IGVyciA9IHN0YXQoaW5wdXRGaWxlLmNfc3RyKCksICZidWYpOworICAgIEFTU0VSVF9FUShlcnIsIDApIDw8ICJGYWlsZWQgdG8gZ2V0IGluZm9ybWF0aW9uIGZvciBmaWxlOiAiIDw8IGlucHV0RmlsZTsKKworICAgIHNpemVfdCBmaWxlU2l6ZSA9IGJ1Zi5zdF9zaXplOworICAgIEFTU0VSVF9ORShmaWxlU2l6ZSwgMCkgPDwgIkludmFsaWQgZmlsZSBzaXplIGZvdW5kIjsKKworICAgIGNvbnN0IHVpbnQ4X3QgKnZvbEJ1ZmZlciA9IG5ldyB1aW50OF90W2ZpbGVTaXplXTsKKyAgICBBU1NFUlRfTkUodm9sQnVmZmVyLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIFZPTCBidWZmZXIgb2Ygc2l6ZTogIiA8PCBmaWxlU2l6ZTsKKworICAgIGlucHV0RmlsZVN0cmVhbS5yZWFkKChjaGFyICopKHZvbEJ1ZmZlciksIGZpbGVTaXplKTsKKyAgICBBU1NFUlRfRVEoaW5wdXRGaWxlU3RyZWFtLmdjb3VudCgpLCBmaWxlU2l6ZSkKKyAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gcmVhZCBjb21wbGV0ZSBmaWxlLCBieXRlcyByZWFkOiAiIDw8IGlucHV0RmlsZVN0cmVhbS5nY291bnQoKTsKKworICAgIGludDMyX3Qgd2lkdGggPSBnZXQ8MT4ocGFyYW1zKTsKKyAgICBpbnQzMl90IGhlaWdodCA9IGdldDwyPihwYXJhbXMpOworICAgIGludDMyX3Qgdm9sV2lkdGggPSAtMTsKKyAgICBpbnQzMl90IHZvbEhlaWdodCA9IC0xOworCisgICAgYm9vbCBzdGF0dXMgPSBFeHRyYWN0RGltZW5zaW9uc0Zyb21WT0xIZWFkZXIodm9sQnVmZmVyLCBmaWxlU2l6ZSwgJnZvbFdpZHRoLCAmdm9sSGVpZ2h0KTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpCisgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGdldCBWT0wgZGltZW5zaW9ucyBmcm9tIGZ1bmN0aW9uOiBFeHRyYWN0RGltZW5zaW9uc0Zyb21WT0xIZWFkZXIoKSI7CisKKyAgICBBU1NFUlRfRVEodm9sV2lkdGgsIHdpZHRoKSA8PCAiRXhwZWN0ZWQgd2lkdGg6ICIgPDwgd2lkdGggPDwgIkZvdW5kOiAiIDw8IHZvbFdpZHRoOworCisgICAgQVNTRVJUX0VRKHZvbEhlaWdodCwgaGVpZ2h0KSA8PCAiRXhwZWN0ZWQgaGVpZ2h0OiAiIDw8IGhlaWdodCA8PCAiRm91bmQ6ICIgPDwgdm9sSGVpZ2h0OworCisgICAgZGVsZXRlW10gdm9sQnVmZmVyOworfQorCitURVNUX1AoQVZDRGltZW5zaW9uVGVzdCwgRGltZW5zaW9uVGVzdCkgeworICAgIGludDMyX3QgbnVtTmFsVW5pdHMgPSAwOworICAgIGludDMyX3QgYXZjV2lkdGggPSAtMTsKKyAgICBpbnQzMl90IGF2Y0hlaWdodCA9IC0xOworICAgIHN0cmluZyBsaW5lOworICAgIHN0cmluZyB0eXBlOworICAgIHNpemVfdCBjaHVua0xlbmd0aDsKKyAgICB3aGlsZSAoZ2V0bGluZShtSW5mb0ZpbGVTdHJlYW0sIGxpbmUpKSB7CisgICAgICAgIGlzdHJpbmdzdHJlYW0gc3RyaW5nTGluZShsaW5lKTsKKyAgICAgICAgc3RyaW5nTGluZSA+PiB0eXBlID4+IGNodW5rTGVuZ3RoOworICAgICAgICBBU1NFUlRfR1QoY2h1bmtMZW5ndGgsIDApIDw8ICJMZW5ndGggb2YgdGhlIGRhdGEgY2h1bmsgbXVzdCBiZSBncmVhdGVyIHRoYW4gemVybyI7CisKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IG5ldyB1aW50OF90W2NodW5rTGVuZ3RoXTsKKyAgICAgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIGEgZGF0YSBidWZmZXIgb2Ygc2l6ZTogIiA8PCBjaHVua0xlbmd0aDsKKworICAgICAgICBjb25zdCB1aW50OF90ICpuYWxTdGFydDsKKyAgICAgICAgc2l6ZV90IG5hbFNpemU7CisKKyAgICAgICAgbUlucHV0RmlsZVN0cmVhbS5yZWFkKChjaGFyICopZGF0YSwgY2h1bmtMZW5ndGgpOworICAgICAgICBBU1NFUlRfRVEobUlucHV0RmlsZVN0cmVhbS5nY291bnQoKSwgY2h1bmtMZW5ndGgpCisgICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byByZWFkIGNvbXBsZXRlIGZpbGUsIGJ5dGVzIHJlYWQ6ICIgPDwgbUlucHV0RmlsZVN0cmVhbS5nY291bnQoKTsKKworICAgICAgICBzaXplX3Qgc21hbGxCdWZmZXJTaXplID0ga1NtYWxsQnVmZmVyU2l6ZTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc2FuaXR5RGF0YSA9IG5ldyB1aW50OF90W3NtYWxsQnVmZmVyU2l6ZV07CisgICAgICAgIG1lbWNweSgodm9pZCAqKXNhbml0eURhdGEsICh2b2lkICopZGF0YSwgc21hbGxCdWZmZXJTaXplKTsKKworICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBnZXROZXh0TkFMVW5pdCgmc2FuaXR5RGF0YSwgJnNtYWxsQnVmZmVyU2l6ZSwgJm5hbFN0YXJ0LCAmbmFsU2l6ZSwgdHJ1ZSk7CisgICAgICAgIEFTU0VSVF9FUShyZXN1bHQsIC1FQUdBSU4pIDw8ICJJbnZhbGlkIHJlc3VsdCBmb3VuZCB3aGVuIHdyb25nIE5BTCB1bml0IHBhc3NlZCI7CisKKyAgICAgICAgd2hpbGUgKCFnZXROZXh0TkFMVW5pdCgmZGF0YSwgJmNodW5rTGVuZ3RoLCAmbmFsU3RhcnQsICZuYWxTaXplLCB0cnVlKSkgeworICAgICAgICAgICAgbnVtTmFsVW5pdHMrKzsKKyAgICAgICAgICAgIC8vIENoZWNrIGlmIGl0J3MgYW4gU1BTCisgICAgICAgICAgICBpZiAoKG5hbFN0YXJ0WzBdICYga1NQU21hc2spICE9IGtTUFNTdGFydENvZGUpIGNvbnRpbnVlOworICAgICAgICAgICAgQVNTRVJUX1RSVUUobmFsU2l6ZSA+IDApIDw8ICJOQUwgdW5pdCBzaXplIG11c3QgYmUgZ3JlYXRlciB0aGFuIDAiOworCisgICAgICAgICAgICBzcDxBQnVmZmVyPiBzcHNCdWZmZXIgPSBuZXcgQUJ1ZmZlcihuYWxTaXplKTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShzcHNCdWZmZXIsIG51bGxwdHIpIDw8ICJBQnVmZmVyIHJldHVybmVkIG51bGwgZm9yIHNpemU6ICIgPDwgbmFsU2l6ZTsKKworICAgICAgICAgICAgbWVtY3B5KHNwc0J1ZmZlci0+ZGF0YSgpLCBuYWxTdGFydCwgbmFsU2l6ZSk7CisgICAgICAgICAgICBGaW5kQVZDRGltZW5zaW9ucyhzcHNCdWZmZXIsICZhdmNXaWR0aCwgJmF2Y0hlaWdodCk7CisgICAgICAgICAgICBzcHNCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShhdmNXaWR0aCwgbUZyYW1lV2lkdGgpCisgICAgICAgICAgICAgICAgICAgIDw8ICJFeHBlY3RlZCB3aWR0aDogIiA8PCBtRnJhbWVXaWR0aCA8PCAiRm91bmQ6ICIgPDwgYXZjV2lkdGg7CisKKyAgICAgICAgICAgIEFTU0VSVF9FUShhdmNIZWlnaHQsIG1GcmFtZUhlaWdodCkKKyAgICAgICAgICAgICAgICAgICAgPDwgIkV4cGVjdGVkIGhlaWdodDogIiA8PCBtRnJhbWVIZWlnaHQgPDwgIkZvdW5kOiAiIDw8IGF2Y0hlaWdodDsKKyAgICAgICAgfQorICAgICAgICBkZWxldGVbXSBkYXRhOworICAgIH0KKyAgICBpZiAobU5hbFVuaXRzRXhwZWN0ZWQgPCAwKSB7CisgICAgICAgIEFTU0VSVF9HVChudW1OYWxVbml0cywgMCkgPDwgIkZhaWxlZCB0byBmaW5kIGFuIE5BTCBVbml0IjsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfRVEobnVtTmFsVW5pdHMsIG1OYWxVbml0c0V4cGVjdGVkKQorICAgICAgICAgICAgICAgIDw8ICJFeHBlY3RlZCBudW1iZXIgb2YgTkFMIHVuaXRzOiAiIDw8IG1OYWxVbml0c0V4cGVjdGVkCisgICAgICAgICAgICAgICAgPDwgIiBmb3VuZDogIiA8PCBudW1OYWxVbml0czsKKyAgICB9Cit9CisKK1RFU1RfUChBdmNjQm94VGVzdCwgQXZjY0JveFZhbGlkYXRpb25UZXN0KSB7CisgICAgaW50MzJfdCBhdmNXaWR0aCA9IC0xOworICAgIGludDMyX3QgYXZjSGVpZ2h0ID0gLTE7CisgICAgaW50MzJfdCBhY2Nlc3NVbml0TGVuZ3RoID0gMDsKKyAgICBpbnQzMl90IHByb2ZpbGUgPSAtMTsKKyAgICBpbnQzMl90IGxldmVsID0gLTE7CisgICAgc3RyaW5nIGxpbmU7CisgICAgc3RyaW5nIHR5cGU7CisgICAgc2l6ZV90IGNodW5rTGVuZ3RoOworICAgIHdoaWxlIChnZXRsaW5lKG1JbmZvRmlsZVN0cmVhbSwgbGluZSkpIHsKKyAgICAgICAgaXN0cmluZ3N0cmVhbSBzdHJpbmdMaW5lKGxpbmUpOworICAgICAgICBzdHJpbmdMaW5lID4+IHR5cGUgPj4gY2h1bmtMZW5ndGg7CisKKyAgICAgICAgaWYgKHR5cGUuY29tcGFyZSgiU1BTIikgJiYgdHlwZS5jb21wYXJlKCJQUFMiKSkgY29udGludWU7CisgICAgICAgIEFTU0VSVF9HVChjaHVua0xlbmd0aCwgMCkgPDwgIkxlbmd0aCBvZiB0aGUgZGF0YSBjaHVuayBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIjsKKworICAgICAgICBhY2Nlc3NVbml0TGVuZ3RoICs9IGNodW5rTGVuZ3RoOworCisgICAgICAgIGlmICghdHlwZS5jb21wYXJlKCJTUFMiKSkgeworICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IG5ldyB1aW50OF90W2NodW5rTGVuZ3RoXTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShkYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBhIGRhdGEgYnVmZmVyIG9mIHNpemU6ICIgPDwgY2h1bmtMZW5ndGg7CisKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKm5hbFN0YXJ0OworICAgICAgICAgICAgc2l6ZV90IG5hbFNpemU7CisKKyAgICAgICAgICAgIG1JbnB1dEZpbGVTdHJlYW0ucmVhZCgoY2hhciAqKWRhdGEsICh1aW50MzJfdCljaHVua0xlbmd0aCk7CisgICAgICAgICAgICBBU1NFUlRfRVEobUlucHV0RmlsZVN0cmVhbS5nY291bnQoKSwgY2h1bmtMZW5ndGgpCisgICAgICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gcmVhZCBjb21wbGV0ZSBmaWxlLCBieXRlcyByZWFkOiAiIDw8IG1JbnB1dEZpbGVTdHJlYW0uZ2NvdW50KCk7CisKKyAgICAgICAgICAgIHdoaWxlICghZ2V0TmV4dE5BTFVuaXQoJmRhdGEsICZjaHVua0xlbmd0aCwgJm5hbFN0YXJ0LCAmbmFsU2l6ZSwgdHJ1ZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBpdCdzIGFuIFNQUworICAgICAgICAgICAgICAgIEFTU0VSVF9UUlVFKG5hbFNpemUgPiAwICYmIChuYWxTdGFydFswXSAmIGtTUFNtYXNrKSA9PSBrU1BTU3RhcnRDb2RlKQorICAgICAgICAgICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBnZXQgU1BTIjsKKworICAgICAgICAgICAgICAgIEFTU0VSVF9HRShuYWxTaXplLCA0KSA8PCAiU1BTIHNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gNCI7CisKKyAgICAgICAgICAgICAgICBwcm9maWxlID0gbmFsU3RhcnRbMV07CisgICAgICAgICAgICAgICAgbGV2ZWwgPSBuYWxTdGFydFszXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlbGV0ZVtdIGRhdGE7CisgICAgICAgIH0KKyAgICB9CisgICAgY29uc3QgdWludDhfdCAqYWNjZXNzVW5pdERhdGEgPSBuZXcgdWludDhfdFthY2Nlc3NVbml0TGVuZ3RoXTsKKyAgICBBU1NFUlRfTkUoYWNjZXNzVW5pdERhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIGEgYnVmZmVyIG9mIHNpemU6ICIgPDwgYWNjZXNzVW5pdExlbmd0aDsKKworICAgIG1JbnB1dEZpbGVTdHJlYW0uc2Vla2coMCwgaW9zOjpiZWcpOworICAgIG1JbnB1dEZpbGVTdHJlYW0ucmVhZCgoY2hhciAqKWFjY2Vzc1VuaXREYXRhLCBhY2Nlc3NVbml0TGVuZ3RoKTsKKyAgICBBU1NFUlRfRVEobUlucHV0RmlsZVN0cmVhbS5nY291bnQoKSwgYWNjZXNzVW5pdExlbmd0aCkKKyAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gcmVhZCBjb21wbGV0ZSBmaWxlLCBieXRlcyByZWFkOiAiIDw8IG1JbnB1dEZpbGVTdHJlYW0uZ2NvdW50KCk7CisKKyAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gbmV3IEFCdWZmZXIoYWNjZXNzVW5pdExlbmd0aCk7CisgICAgQVNTRVJUX05FKGFjY2Vzc1VuaXQsIG51bGxwdHIpCisgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBhbiBhbmRyb2lkIGRhdGEgYnVmZmVyIG9mIHNpemU6ICIgPDwgYWNjZXNzVW5pdExlbmd0aDsKKworICAgIG1lbWNweShhY2Nlc3NVbml0LT5kYXRhKCksIGFjY2Vzc1VuaXREYXRhLCBhY2Nlc3NVbml0TGVuZ3RoKTsKKyAgICBzcDxBQnVmZmVyPiBjc2REYXRhQnVmZmVyID0gTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKGFjY2Vzc1VuaXQsICZhdmNXaWR0aCwgJmF2Y0hlaWdodCk7CisgICAgQVNTRVJUX05FKGNzZERhdGFCdWZmZXIsIG51bGxwdHIpIDw8ICJObyBkYXRhIHJldHVybmVkIGZyb20gTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKCkiOworCisgICAgQVNTRVJUX0VRKGF2Y1dpZHRoLCBtRnJhbWVXaWR0aCkgPDwgIkV4cGVjdGVkIHdpZHRoOiAiIDw8IG1GcmFtZVdpZHRoIDw8ICJGb3VuZDogIiA8PCBhdmNXaWR0aDsKKworICAgIEFTU0VSVF9FUShhdmNIZWlnaHQsIG1GcmFtZUhlaWdodCkKKyAgICAgICAgICAgIDw8ICJFeHBlY3RlZCBoZWlnaHQ6ICIgPDwgbUZyYW1lSGVpZ2h0IDw8ICJGb3VuZDogIiA8PCBhdmNIZWlnaHQ7CisKKyAgICB1aW50OF90ICpjc2REYXRhID0gY3NkRGF0YUJ1ZmZlci0+ZGF0YSgpOworICAgIEFTU0VSVF9FUSgqY3NkRGF0YSwga0NvbmZpZ1ZlcnNpb24pIDw8ICJJbnZhbGlkIGNvbmZpZ3VyYXRpb24gdmVyc2lvbiI7CisKKyAgICBBU1NFUlRfR0UoY3NkRGF0YUJ1ZmZlci0+c2l6ZSgpLCA0KSA8PCAiQ1NEIGRhdGEgc2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byA0IjsKKworICAgIEFTU0VSVF9FUSgqKGNzZERhdGEgKyAxKSwgcHJvZmlsZSkKKyAgICAgICAgICAgIDw8ICJFeHBlY3RlZCBBVkMgcHJvZmlsZTogIiA8PCBwcm9maWxlIDw8ICIgZm91bmQ6ICIgPDwgKihjc2REYXRhICsgMSk7CisKKyAgICBBU1NFUlRfRVEoKihjc2REYXRhICsgMyksIGxldmVsKQorICAgICAgICAgICAgPDwgIkV4cGVjdGVkIEFWQyBsZXZlbDogIiA8PCBsZXZlbCA8PCAiIGZvdW5kOiAiIDw8ICooY3NkRGF0YSArIDMpOworICAgIGNzZERhdGFCdWZmZXIuY2xlYXIoKTsKKyAgICBkZWxldGVbXSBhY2Nlc3NVbml0RGF0YTsKKyAgICBhY2Nlc3NVbml0LmNsZWFyKCk7Cit9CisKK1RFU1RfUChBVkNGcmFtZVRlc3QsIEZyYW1lVGVzdCkgeworICAgIHN0cmluZyBsaW5lOworICAgIHN0cmluZyB0eXBlOworICAgIHNpemVfdCBjaHVua0xlbmd0aDsKKyAgICBpbnQzMl90IGZyYW1lTGF5ZXJJRDsKKyAgICB3aGlsZSAoZ2V0bGluZShtSW5mb0ZpbGVTdHJlYW0sIGxpbmUpKSB7CisgICAgICAgIHVpbnQzMl90IGxheWVySUQgPSAwOworICAgICAgICBpc3RyaW5nc3RyZWFtIHN0cmluZ0xpbmUobGluZSk7CisgICAgICAgIHN0cmluZ0xpbmUgPj4gdHlwZSA+PiBjaHVua0xlbmd0aCA+PiBmcmFtZUxheWVySUQ7CisgICAgICAgIEFTU0VSVF9HVChjaHVua0xlbmd0aCwgMCkgPDwgIkxlbmd0aCBvZiB0aGUgZGF0YSBjaHVuayBtdXN0IGJlIGdyZWF0ZXIgdGhhbiB6ZXJvIjsKKworICAgICAgICBjaGFyICpkYXRhID0gbmV3IGNoYXJbY2h1bmtMZW5ndGhdOworICAgICAgICBBU1NFUlRfTkUoZGF0YSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBhbGxvY2F0aW9uIGRhdGEgYnVmZmVyIG9mIHNpemU6ICIgPDwgY2h1bmtMZW5ndGg7CisKKyAgICAgICAgbUlucHV0RmlsZVN0cmVhbS5yZWFkKGRhdGEsIGNodW5rTGVuZ3RoKTsKKyAgICAgICAgQVNTRVJUX0VRKG1JbnB1dEZpbGVTdHJlYW0uZ2NvdW50KCksIGNodW5rTGVuZ3RoKQorICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gcmVhZCBjb21wbGV0ZSBmaWxlLCBieXRlcyByZWFkOiAiIDw8IG1JbnB1dEZpbGVTdHJlYW0uZ2NvdW50KCk7CisKKyAgICAgICAgaWYgKCF0eXBlLmNvbXBhcmUoIklEUiIpKSB7CisgICAgICAgICAgICBib29sIGlzSURSID0gSXNJRFIoKHVpbnQ4X3QgKilkYXRhLCBjaHVua0xlbmd0aCk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShpc0lEUik7CisKKyAgICAgICAgICAgIGxheWVySUQgPSBGaW5kQVZDTGF5ZXJJZCgodWludDhfdCAqKWRhdGEsIGNodW5rTGVuZ3RoKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShsYXllcklELCBmcmFtZUxheWVySUQpIDw8ICJXcm9uZyBsYXllciBJRCBmb3VuZCI7CisgICAgICAgIH0gZWxzZSBpZiAoIXR5cGUuY29tcGFyZSgiUCIpIHx8ICF0eXBlLmNvbXBhcmUoIkIiKSkgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdCA9IG5ldyBBQnVmZmVyKGNodW5rTGVuZ3RoKTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShhY2Nlc3NVbml0LCBudWxscHRyKSA8PCAiVW5hYmxlIHRvIGNyZWF0ZSBhY2Nlc3MgVW5pdCI7CisKKyAgICAgICAgICAgIG1lbWNweShhY2Nlc3NVbml0LT5kYXRhKCksIGRhdGEsIGNodW5rTGVuZ3RoKTsKKyAgICAgICAgICAgIGJvb2wgaXNSZWZlcmVuY2VGcmFtZSA9IElzQVZDUmVmZXJlbmNlRnJhbWUoYWNjZXNzVW5pdCk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShpc1JlZmVyZW5jZUZyYW1lKTsKKworICAgICAgICAgICAgYWNjZXNzVW5pdC5jbGVhcigpOworICAgICAgICAgICAgbGF5ZXJJRCA9IEZpbmRBVkNMYXllcklkKCh1aW50OF90ICopZGF0YSwgY2h1bmtMZW5ndGgpOworICAgICAgICAgICAgQVNTRVJUX0VRKGxheWVySUQsIGZyYW1lTGF5ZXJJRCkgPDwgIldyb25nIGxheWVyIElEIGZvdW5kIjsKKyAgICAgICAgfQorICAgICAgICBkZWxldGVbXSBkYXRhOworICAgIH0KK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKEFWQ1V0aWxzVGVzdEFsbCwgTXBlZ0F1ZGlvVW5pdFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV90dXBsZSgweEZGRkI5MjA0LCA0MTgsIDQ0MTAwLCAyLCAxMjgsIDExNTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoMHhGRkZCNzYwNCwgMjg5LCA0ODAwMCwgMiwgOTYsIDExNTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoMHhGRkZFNTYwNCwgMTY0LCA0ODAwMCwgMiwgMTYwLCAzODQpKSk7CisKKy8vIEluZm8gRmlsZSBjb250YWlucyB0aGUgdHlwZSBhbmQgbGVuZ3RoIGZvciBlYWNoIGNodW5rL2ZyYW1lCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIEFWQ1V0aWxzVGVzdEFsbCwgQVZDRGltZW5zaW9uVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV90dXBsZSgiY3Jvd2RfOHg4cDUwZjMyXzIwMGticHNfYnAuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzh4OHA1MGYzMl8yMDBrYnBzX2JwLmluZm8iLCA4LCA4LCAxMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzY0MHgzNjBwMjRmMzAwXzEwMDBrYnBzX2JwLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm93ZF82NDB4MzYwcDI0ZjMwMF8xMDAwa2Jwc19icC5pbmZvIiwgNjQwLCAzNjAsIDExKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMTI4MHg3MjBwMzBmMzAwXzUwMDBrYnBzX2JwLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm93ZF8xMjgweDcyMHAzMGYzMDBfNTAwMGticHNfYnAuaW5mbyIsIDEyODAsIDcyMCwgMTIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF8xOTIweDEwODBwNTBmMzAwXzEyMDAwa2Jwc19icC5oMjY0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvd2RfMTkyMHgxMDgwcDUwZjMwMF8xMjAwMGticHNfYnAuaW5mbyIsIDE5MjAsIDEwODAsIDE0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMzg0MHgyMTYwcDYwZjMwMF82ODAwMGticHNfYnAuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzM4NDB4MjE2MHA2MGYzMDBfNjgwMDBrYnBzX2JwLmluZm8iLCAzODQwLCAyMTYwLCAxNCkpKTsKKworLy8gSW5mbyBGaWxlIGNvbnRhaW5zIHRoZSB0eXBlIGFuZCBsZW5ndGggZm9yIGVhY2ggY2h1bmsvZnJhbWUKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgQVZDVXRpbHNUZXN0QWxsLCBBdmNjQm94VGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV90dXBsZSgiY3Jvd2RfOHg4cDUwZjMyXzIwMGticHNfYnAuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzh4OHA1MGYzMl8yMDBrYnBzX2JwLmluZm8iLCA4LCA4LCAxMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzEyODB4NzIwcDMwZjMwMF81MDAwa2Jwc19icC5oMjY0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvd2RfMTI4MHg3MjBwMzBmMzAwXzUwMDBrYnBzX2JwLmluZm8iLCAxMjgwLCA3MjAsIDEyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMTkyMHgxMDgwcDUwZjMwMF8xMjAwMGticHNfYnAuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzE5MjB4MTA4MHA1MGYzMDBfMTIwMDBrYnBzX2JwLmluZm8iLCAxOTIwLCAxMDgwLCAxNCkpKTsKKworLy8gSW5mbyBGaWxlIGNvbnRhaW5zIHRoZSB0eXBlIGFuZCBsZW5ndGggZm9yIGVhY2ggY2h1bmsvZnJhbWUKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChBVkNVdGlsc1Rlc3RBbGwsIFZPTERpbWVuc2lvblRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV90dXBsZSgidm9sRGF0YV83MjBfNDgwIiwgNzIwLCA0ODApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoInZvbERhdGFfMTI4MF83MjAiLCAxMjgwLCA3MjApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoInZvbERhdGFfMTkyMF8xMDgwIiwgMTkyMCwgMTA4MCkpKTsKKworLy8gSW5mbyBGaWxlIGNvbnRhaW5zIHRoZSB0eXBlLCBsZW5ndGggYW5kIGxheWVyIElEIGZvciBlYWNoIGNodW5rL2ZyYW1lCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoQVZDVXRpbHNUZXN0QWxsLCBBVkNGcmFtZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV90dXBsZSgiY3Jvd2RfOHg4cDUwZjMyXzIwMGticHNfYnAuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvd2RfOHg4cDUwZjMyXzIwMGticHNfYnAuaW5mbyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzY0MHgzNjBwMjRmMzAwXzEwMDBrYnBzX2JwLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzY0MHgzNjBwMjRmMzAwXzEwMDBrYnBzX2JwLmluZm8iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF8xMjgweDcyMHAzMGYzMDBfNTAwMGticHNfYnAuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvd2RfMTI4MHg3MjBwMzBmMzAwXzUwMDBrYnBzX2JwLmluZm8iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF8xOTIweDEwODBwNTBmMzAwXzEyMDAwa2Jwc19icC5oMjY0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm93ZF8xOTIweDEwODBwNTBmMzAwXzEyMDAwa2Jwc19icC5pbmZvIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMzg0MHgyMTYwcDYwZjMwMF82ODAwMGticHNfYnAuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvd2RfMzg0MHgyMTYwcDYwZjMwMF82ODAwMGticHNfYnAuaW5mbyIpKSk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIGdFbnYgPSBuZXcgQVZDVXRpbHNUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIEFMT0dWKCJUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BVkNVdGlscy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BVkNVdGlscy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMGU0ODEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJBVkNVdGlsc1VuaXRUZXN0IiwKKyAgICBndGVzdDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkFWQ1V0aWxzVW5pdFRlc3QuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24iLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQVZDVXRpbHMvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMDg4YTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FWQ1V0aWxzL0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgbW9kdWxlIGNvbmZpZyBmb3IgQVZDIFV0aWxzIHVuaXQgdGVzdHMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJBVkNVdGlsc1VuaXRUZXN0IiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUHVzaEZpbGVQcmVwYXJlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9ImZhbHNlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJBVkNVdGlsc1VuaXRUZXN0LT4vZGF0YS9sb2NhbC90bXAvQVZDVXRpbHNVbml0VGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiCisgICAgICAgICAgICBrZXk9Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BVkNVdGlscy9BVkNVdGlsc1VuaXRUZXN0LnppcD91bnppcD10cnVlIgorICAgICAgICAgICAgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcC9BVkNVdGlsc1VuaXRUZXN0LyIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKworICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5HVGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWRldmljZS1wYXRoIiB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im1vZHVsZS1uYW1lIiB2YWx1ZT0iQVZDVXRpbHNVbml0VGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1mbGFnIiB2YWx1ZT0iLVAgL2RhdGEvbG9jYWwvdG1wL0FWQ1V0aWxzVW5pdFRlc3QvIiAvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQVZDVXRpbHMvUkVBRE1FLm1kIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BVkNVdGlscy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA5ZDcyZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQVZDVXRpbHMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMzkgQEAKKyMjIE1lZGlhIFRlc3RpbmcgIyMKKy0tLQorIyMjIyBBVkNVdGlscyBUZXN0CitUaGUgQVZDIFV0aWxpdHkgVW5pdCBUZXN0IFN1aXRlIHZhbGlkYXRlcyB0aGUgYXZjX3V0aWxzIGxpYnJhcml5IGF2YWlsYWJsZSBpbiBsaWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uLgorCitSdW4gdGhlIGZvbGxvd2luZyBzdGVwcyB0byBidWlsZCB0aGUgdGVzdCBzdWl0ZToKK2BgYAorbSBBVkNVdGlsc1VuaXRUZXN0CitgYGAKKworVGhlIDMyLWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdC8KKworVGhlIDY0LWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0LworCitUbyB0ZXN0IDY0LWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3Q2NC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0L0FWQ1V0aWxzVW5pdFRlc3QvQVZDVXRpbHNVbml0VGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKworVG8gdGVzdCAzMi1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0LgorYGBgCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0L0FWQ1V0aWxzVW5pdFRlc3QvQVZDVXRpbHNVbml0VGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKworVGhlIHJlc291cmNlIGZpbGUgZm9yIHRoZSB0ZXN0cyBpcyB0YWtlbiBmcm9tIFtoZXJlXShodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQVZDVXRpbHMvQVZDVXRpbHNVbml0VGVzdC56aXApLiBEb3dubG9hZCwgdW56aXAgYW5kIHB1c2ggdGhlc2UgZmlsZXMgaW50byBkZXZpY2UgZm9yIHRlc3RpbmcuCisKK2BgYAorYWRiIHB1c2ggQVZDVXRpbHNVbml0VGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKwordXNhZ2U6IEFWQ1V0aWxzVW5pdFRlc3QgLVAgXDxwYXRoX3RvX2ZvbGRlclw+CitgYGAKK2FkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvQVZDVXRpbHNVbml0VGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvQVZDVXRpbHNVbml0VGVzdC8KK2BgYAorQWx0ZXJuYXRpdmVseSwgdGhlIHRlc3QgY2FuIGFsc28gYmUgcnVuIHVzaW5nIGF0ZXN0IGNvbW1hbmQuCisKK2BgYAorYXRlc3QgQVZDVXRpbHNVbml0VGVzdCAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCitgYGAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQW5kcm9pZC5icAppbmRleCBmMjE1N2M5Li40NWU4MWU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BbmRyb2lkLmJwCkBAIC0yNSwzICsyNSwzMSBAQAogICAgICAgICAiVXRpbHNfdGVzdC5jcHAiLAogICAgIF0sCiB9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJNZXRhRGF0YUJhc2VVbml0VGVzdCIsCisgICAgZ3Rlc3Q6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJNZXRhRGF0YUJhc2VVbml0VGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvTWV0YURhdGFCYXNlVW5pdFRlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9NZXRhRGF0YUJhc2VVbml0VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFlZDRkMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvTWV0YURhdGFCYXNlVW5pdFRlc3QuY3BwCkBAIC0wLDAgKzEsMjg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZzdHJlYW0+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKworY29uc3RleHByIGludDMyX3Qga1dpZHRoMSA9IDE5MjA7Citjb25zdGV4cHIgaW50MzJfdCBrSGVpZ2h0MSA9IDEwODA7Citjb25zdGV4cHIgaW50MzJfdCBrV2lkdGgyID0gMTI4MDsKK2NvbnN0ZXhwciBpbnQzMl90IGtIZWlnaHQyID0gOTIwOworY29uc3RleHByIGludDMyX3Qga1dpZHRoMyA9IDcyMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtIZWlnaHQzID0gNDgwOworY29uc3RleHByIGludDMyX3Qga1Byb2ZpbGUgPSAxOworY29uc3RleHByIGludDMyX3Qga0xldmVsID0gMTsKK2NvbnN0ZXhwciBpbnQzMl90IGtQbGF0Zm9ybVZhbHVlID0gMTsKKworLy8gUmVjdGFuZ2xlIG1hcmdpbnMKK2NvbnN0ZXhwciBpbnQzMl90IGtMZWZ0ID0gMTAwOworY29uc3RleHByIGludDMyX3Qga1RvcCA9IDEwMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtSaWdodCA9IDEwMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtCb3R0b20gPSAxMDA7CisKK2NvbnN0ZXhwciBpbnQ2NF90IGtEdXJhdGlvblVzID0gNjAwMDAwMDA7CisKK2NvbnN0ZXhwciBmbG9hdCBrQ2FwdHVyZVJhdGUgPSAzMC4wOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1ldGFEYXRhQmFzZVVuaXRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7fTsKKworVEVTVF9GKE1ldGFEYXRhQmFzZVVuaXRUZXN0LCBDcmVhdGVNZXRhRGF0YUJhc2VUZXN0KSB7CisgICAgTWV0YURhdGFCYXNlICptZXRhRGF0YSA9IG5ldyBNZXRhRGF0YUJhc2UoKTsKKyAgICBBU1NFUlRfTkUobWV0YURhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIG1ldGEgZGF0YSI7CisKKyAgICAvLyBUZXN0aW5nIGNvcHkgY29uc3RydWN0b3IKKyAgICBNZXRhRGF0YUJhc2UgKm1ldGFEYXRhQ29weSA9IG1ldGFEYXRhOworICAgIEFTU0VSVF9ORShtZXRhRGF0YUNvcHksIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIG1ldGEgZGF0YSBjb3B5IjsKKworICAgIGRlbGV0ZSBtZXRhRGF0YTsKK30KKworVEVTVF9GKE1ldGFEYXRhQmFzZVVuaXRUZXN0LCBTZXRBbmRGaW5kRGF0YVRlc3QpIHsKKyAgICBNZXRhRGF0YUJhc2UgKm1ldGFEYXRhID0gbmV3IE1ldGFEYXRhQmFzZSgpOworICAgIEFTU0VSVF9ORShtZXRhRGF0YSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBjcmVhdGUgbWV0YSBkYXRhIjsKKworICAgIC8vIFNldHRpbmcgdGhlIGRpZmZlcmVudCBrZXktdmFsdWUgcGFpciB0eXBlIGZvciBmaXJzdCB0aW1lLCBvdmVyd3JpdGUKKyAgICAvLyBleHBlY3RlZCB0byBiZSBmYWxzZQorICAgIGJvb2wgc3RhdHVzID0gbWV0YURhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleU1JTUVUeXBlLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworCisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlXaWR0aCwga1dpZHRoMSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5V2lkdGgsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGtIZWlnaHQxKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiSW5pdGlhbGl6aW5nIGtLZXlIZWlnaHQsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlWaWRlb1Byb2ZpbGUsIGtQcm9maWxlKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiSW5pdGlhbGl6aW5nIGtLZXlWaWRlb1Byb2ZpbGUsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlWaWRlb0xldmVsLCBrTGV2ZWwpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleVZpZGVvTGV2ZWwsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCBrRHVyYXRpb25Vcyk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5RHVyYXRpb24sIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0RmxvYXQoa0tleUNhcHR1cmVGcmFtZXJhdGUsIGtDYXB0dXJlUmF0ZSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5Q2FwdHVyZUZyYW1lcmF0ZSwgb3ZlcndyaXRlIGlzIGV4cGVjdGVkIHRvIGJlIGZhbHNlIjsKKworICAgIGNvbnN0IGludDMyX3QgKnBsYXRmb3JtID0gJmtQbGF0Zm9ybVZhbHVlOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRQb2ludGVyKGtLZXlQbGF0Zm9ybVByaXZhdGUsICh2b2lkICopcGxhdGZvcm0pOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleVBsYXRmb3JtUHJpdmF0ZSwgb3ZlcndyaXRlIGlzIGV4cGVjdGVkIHRvIGJlIGZhbHNlIjsKKworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRSZWN0KGtLZXlDcm9wUmVjdCwga0xlZnQsIGtUb3AsIGtSaWdodCwga0JvdHRvbSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5Q3JvcFJlY3QsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisKKyAgICAvLyBEdW1wIHRvIGxvZyBmb3IgcmVmZXJlbmNlCisgICAgbWV0YURhdGEtPmR1bXBUb0xvZygpOworCisgICAgLy8gRmluZCB0aGUgZGF0YSB3aGljaCB3YXMgc2V0CisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleU1JTUVUeXBlIGtleSBkb2VzIG5vdCBleGlzdHMgaW4gbWV0YWRhdGEiOworICAgIEFTU0VSVF9TVFJFUShtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpIDw8ICJJbmNvcnJlY3QgbWltZSB0eXBlIHJldHVybmVkIjsKKworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodCwgcHJvZmlsZSwgbGV2ZWw7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleVdpZHRoIGtleSBkb2VzIG5vdCBleGlzdHMgaW4gbWV0YWRhdGEiOworICAgIEFTU0VSVF9FUSh3aWR0aCwga1dpZHRoMSkgPDwgIkluY29ycmVjdCB2YWx1ZSBvZiB3aWR0aCByZXR1cm5lZCI7CisKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgImtLZXlIZWlnaHQga2V5IGRvZXMgbm90IGV4aXN0cyBpbiBtZXRhZGF0YSI7CisgICAgQVNTRVJUX0VRKGhlaWdodCwga0hlaWdodDEpIDw8ICJJbmNvcnJlY3QgdmFsdWUgb2YgaGVpZ2h0IHJldHVybmVkIjsKKworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kSW50MzIoa0tleVZpZGVvUHJvZmlsZSwgJnByb2ZpbGUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgImtLZXlWaWRlb1Byb2ZpbGUga2V5IGRvZXMgbm90IGV4aXN0cyBpbiBtZXRhZGF0YSI7CisgICAgQVNTRVJUX0VRKHByb2ZpbGUsIGtQcm9maWxlKSA8PCAiSW5jb3JyZWN0IHZhbHVlIG9mIHByb2ZpbGUgcmV0dXJuZWQiOworCisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5VmlkZW9MZXZlbCwgJmxldmVsKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJrS2V5VmlkZW9MZXZlbCBrZXkgZG9lcyBub3QgZXhpc3RzIGluIG1ldGFkYXRhIjsKKyAgICBBU1NFUlRfRVEobGV2ZWwsIGtMZXZlbCkgPDwgIkluY29ycmVjdCB2YWx1ZSBvZiBsZXZlbCByZXR1cm5lZCI7CisKKyAgICBpbnQ2NF90IGR1cmF0aW9uOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb24pOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgImtLZXlEdXJhdGlvbiBrZXkgZG9lcyBub3QgZXhpc3RzIGluIG1ldGFkYXRhIjsKKyAgICBBU1NFUlRfRVEoZHVyYXRpb24sIGtEdXJhdGlvblVzKSA8PCAiSW5jb3JyZWN0IHZhbHVlIG9mIGR1cmF0aW9uIHJldHVybmVkIjsKKworICAgIGZsb2F0IGZyYW1lUmF0ZTsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEZsb2F0KGtLZXlDYXB0dXJlRnJhbWVyYXRlLCAmZnJhbWVSYXRlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJrS2V5Q2FwdHVyZUZyYW1lcmF0ZSBrZXkgZG9lcyBub3QgZXhpc3RzIGluIG1ldGFkYXRhIjsKKyAgICBBU1NFUlRfRVEoZnJhbWVSYXRlLCBrQ2FwdHVyZVJhdGUpIDw8ICJJbmNvcnJlY3QgdmFsdWUgb2YgY2FwdHVyZUZyYW1lUmF0ZSByZXR1cm5lZCI7CisKKyAgICBpbnQzMl90IHRvcCwgYm90dG9tLCBsZWZ0LCByaWdodDsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZFJlY3Qoa0tleUNyb3BSZWN0LCAmbGVmdCwgJnRvcCwgJnJpZ2h0LCAmYm90dG9tKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJrS2V5Q3JvcFJlY3Qga2V5IGRvZXMgbm90IGV4aXN0cyBpbiBtZXRhZGF0YSI7CisgICAgQVNTRVJUX0VRKGxlZnQsIGtMZWZ0KSA8PCAiSW5jb3JyZWN0IHZhbHVlIG9mIGxlZnQgbWFyZ2luIHJldHVybmVkIjsKKyAgICBBU1NFUlRfRVEodG9wLCBrVG9wKSA8PCAiSW5jb3JyZWN0IHZhbHVlIG9mIHRvcCBtYXJnaW4gcmV0dXJuZWQiOworICAgIEFTU0VSVF9FUShyaWdodCwga1JpZ2h0KSA8PCAiSW5jb3JyZWN0IHZhbHVlIG9mIHJpZ2h0IG1hcmdpbiByZXR1cm5lZCI7CisgICAgQVNTRVJUX0VRKGJvdHRvbSwga0JvdHRvbSkgPDwgIkluY29ycmVjdCB2YWx1ZSBvZiBib3R0b20gbWFyZ2luIHJldHVybmVkIjsKKworICAgIHZvaWQgKnBsYXRmb3JtVmFsdWU7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRQb2ludGVyKGtLZXlQbGF0Zm9ybVByaXZhdGUsICZwbGF0Zm9ybVZhbHVlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJrS2V5UGxhdGZvcm1Qcml2YXRlIGtleSBkb2VzIG5vdCBleGlzdHMgaW4gbWV0YWRhdGEiOworICAgIEFTU0VSVF9FUShwbGF0Zm9ybVZhbHVlLCAma1BsYXRmb3JtVmFsdWUpIDw8ICJJbmNvcnJlY3QgdmFsdWUgb2YgcG9pbnRlciByZXR1cm5lZCI7CisKKyAgICAvLyBDaGVjayBmb3IgdGhlIGtleSB3aGljaCBpcyBub3QgYWRkZWQgdG8gbWV0YWRhdGEKKyAgICBpbnQzMl90IGFuZ2xlOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kSW50MzIoa0tleVJvdGF0aW9uLCAmYW5nbGUpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJWYWx1ZSBmb3IgYW4gaW52YWxpZCBrZXkgaXMgcmV0dXJuZWQgd2hlbiB0aGUga2V5IGlzIG5vdCBzZXQiOworCisgICAgZGVsZXRlIChtZXRhRGF0YSk7Cit9CisKK1RFU1RfRihNZXRhRGF0YUJhc2VVbml0VGVzdCwgT3ZlcldyaXRlRnVuY3Rpb25hbGl0eVRlc3QpIHsKKyAgICBNZXRhRGF0YUJhc2UgKm1ldGFEYXRhID0gbmV3IE1ldGFEYXRhQmFzZSgpOworICAgIEFTU0VSVF9ORShtZXRhRGF0YSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBjcmVhdGUgbWV0YSBkYXRhIjsKKworICAgIC8vIHNldC9zZXQvcmVhZCB0byBjaGVjayBmaXJzdCBvdmVyd3JpdGUgb3BlcmF0aW9uCisgICAgYm9vbCBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5TUlNRVR5cGUsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisgICAgLy8gT3ZlcndyaXRlIHRoZSB2YWx1ZQorICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQyk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiU2V0dGluZyBrS2V5TUlNRVR5cGUgYWdhaW4sIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSB0cnVlIjsKKyAgICAvLyBDaGVjayB0aGUgdmFsdWUKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJrS2V5TUlNRVR5cGUga2V5IGRvZXMgbm90IGV4aXN0cyBpbiBtZXRhZGF0YSI7CisgICAgQVNTRVJUX1NUUkVRKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpIDw8ICJNaW1lIHZhbHVlIGlzIG5vdCBvdmVyd3JpdHRlbiI7CisKKyAgICAvLyBzZXQvc2V0L3NldC9yZWFkIHRvIGNoZWNrIHNlY29uZCBvdmVyd3JpdGUgb3BlcmF0aW9uCisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlXaWR0aCwga1dpZHRoMSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5V2lkdGgsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGtIZWlnaHQxKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiSW5pdGlhbGl6aW5nIGtLZXlIZWlnaHQsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisgICAgLy8gT3ZlcndyaXRlIHRoZSB2YWx1ZQorICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIGtXaWR0aDIpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIlNldHRpbmcga0tleVdpZHRoIGFnYWluLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgdHJ1ZSI7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGtIZWlnaHQyKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJTZXR0aW5nIGtLZXlIZWlnaHQgYWdhaW4sIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSB0cnVlIjsKKyAgICAvLyBPdmVyd3JpdGUgdGhlIHZhbHVlIGFnYWluCisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlXaWR0aCwga1dpZHRoMyk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiU2V0dGluZyBrS2V5V2lkdGggYWdhaW4sIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSB0cnVlIjsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0SW50MzIoa0tleUhlaWdodCwga0hlaWdodDMpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIlNldHRpbmcga0tleUhlaWdodCBhZ2Fpbiwgb3ZlcndyaXRlIGlzIGV4cGVjdGVkIHRvIGJlIHRydWUiOworICAgIC8vIENoZWNrIHRoZSB2YWx1ZQorICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJrS2V5V2lkdGgga2V5IGRvZXMgbm90IGV4aXN0cyBpbiBtZXRhZGF0YSI7CisgICAgQVNTRVJUX0VRKHdpZHRoLCBrV2lkdGgzKSA8PCAiVmFsdWUgb2Ygd2lkdGggaXMgbm90IG92ZXJ3cml0dGVuIjsKKworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmhlaWdodCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleUhlaWdodCBrZXkgZG9lcyBub3QgZXhpc3RzIGluIG1ldGFkYXRhIjsKKyAgICBBU1NFUlRfRVEoaGVpZ2h0LCBrSGVpZ2h0MykgPDwgIlZhbHVlIG9mIGhlaWdodCBpcyBub3Qgb3ZlcndyaXR0ZW4iOworCisgICAgZGVsZXRlIChtZXRhRGF0YSk7Cit9CisKK1RFU1RfRihNZXRhRGF0YUJhc2VVbml0VGVzdCwgUmVtb3ZlS2V5VGVzdCkgeworICAgIE1ldGFEYXRhQmFzZSAqbWV0YURhdGEgPSBuZXcgTWV0YURhdGFCYXNlKCk7CisgICAgQVNTRVJUX05FKG1ldGFEYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBtZXRhIGRhdGEiOworCisgICAgYm9vbCBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5TUlNRVR5cGUsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisgICAgLy8gUXVlcnkgdGhlIGtleQorICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5oYXNEYXRhKGtLZXlNSU1FVHlwZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiTWV0YURhdGEgZG9lcyBub3QgaGF2ZSB0aGUgbWltZSBrZXkiOworCisgICAgc3RhdHVzID0gbWV0YURhdGEtPnJlbW92ZShrS2V5TUlNRVR5cGUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byByZW1vdmUgdGhlIGtLZXlNSU1FVHlwZSBrZXkiOworCisgICAgLy8gUXVlcnkgdGhlIGtleQorICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5oYXNEYXRhKGtLZXlNSU1FVHlwZSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIk1ldGFEYXRhIGhhcyBtaW1lIGtleSBhZnRlciByZW1vdmluZyBpdCwgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworCisgICAgLy8gUmVtb3ZlIHRoZSBub24gZXhpc3Rpbmcga2V5CisgICAgc3RhdHVzID0gbWV0YURhdGEtPnJlbW92ZShrS2V5TUlNRVR5cGUpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJSZW1vdmVkIHRoZSBub24gZXhpc3Rpbmcga2V5IjsKKworICAgIC8vIENoZWNrIG92ZXJ3cml0aW5nIHRoZSByZW1vdmVkIGtleQorICAgIG1ldGFEYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQyk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIk92ZXJ3cml0ZSBzaG91bGQgYmUgZmFsc2Ugc2luY2UgdGhlIGtleSB3YXMgcmVtb3ZlZCI7CisKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0SW50MzIoa0tleVdpZHRoLCBrV2lkdGgxKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiSW5pdGlhbGl6aW5nIGtLZXlXaWR0aCwgb3ZlcndyaXRlIGlzIGV4cGVjdGVkIHRvIGJlIGZhbHNlIjsKKworICAgIC8vIENsZWFyIHdob2xlIG1ldGFkYXRhCisgICAgbWV0YURhdGEtPmNsZWFyKCk7CisKKyAgICAvLyBDaGVjayBmaW5kaW5nIGtleSBhZnRlciBjbGVhcmluZyB0aGUgbWV0YWRhdGEKKyAgICBpbnQzMl90IHdpZHRoOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmd2lkdGgpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJNZXRhRGF0YSBmb3VuZCBrS2V5V2lkdGgga2V5IGFmdGVyIGNsZWFyaW5nIGFsbCB0aGUgaXRlbXMgaW4gaXQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworCisgICAgLy8gUXVlcnkgdGhlIGtleQorICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5oYXNEYXRhKGtLZXlXaWR0aCk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykKKyAgICAgICAgICAgIDw8ICJNZXRhRGF0YSBoYXMgd2lkdGgga2V5IGFmdGVyIGNsZWFyaW5nIGFsbCB0aGUgaXRlbXMgaW4gaXQsIGV4cGVjdGVkIHRvIGJlIGZhbHNlIjsKKworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5oYXNEYXRhKGtLZXlNSU1FVHlwZSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykKKyAgICAgICAgICAgIDw8ICJNZXRhRGF0YSBoYXMgbWltZSBrZXkgYWZ0ZXIgY2xlYXJpbmcgYWxsIHRoZSBpdGVtcyBpbiBpdCwgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworCisgICAgLy8gQ2hlY2sgcmVtb3Zpbmcga2V5IGFmdGVyIGNsZWFyaW5nIHRoZSBtZXRhZGF0YQorICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5yZW1vdmUoa0tleU1JTUVUeXBlKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiUmVtb3ZlZCB0aGUga2V5LCBhZnRlciBjbGVhcmluZyB0aGUgbWV0YWRhdGEiOworCisgICAgLy8gQ2hlY2tpbmcgc2V0IGFmdGVyIGNsZWFyaW5nIHRoZSBtZXRhZGF0YQorICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIGtXaWR0aDEpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJPdmVyd3JpdGUgc2hvdWxkIGJlIGZhbHNlIHNpbmNlIHRoZSBtZXRhZGF0YSB3YXMgY2xlYXJlZCI7CisKKyAgICBtZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJPdmVyd3JpdGUgc2hvdWxkIGJlIGZhbHNlIHNpbmNlIHRoZSBtZXRhZGF0YSB3YXMgY2xlYXJlZCI7CisKKyAgICBkZWxldGUgKG1ldGFEYXRhKTsKK30KKworVEVTVF9GKE1ldGFEYXRhQmFzZVVuaXRUZXN0LCBDb252ZXJ0VG9TdHJpbmdUZXN0KSB7CisgICAgTWV0YURhdGFCYXNlICptZXRhRGF0YSA9IG5ldyBNZXRhRGF0YUJhc2UoKTsKKyAgICBBU1NFUlRfTkUobWV0YURhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIG1ldGEgZGF0YSI7CisKKyAgICBTdHJpbmc4IGluZm8gPSBtZXRhRGF0YS0+dG9TdHJpbmcoKTsKKyAgICBBU1NFUlRfRVEoaW5mby5sZW5ndGgoKSwgMCkgPDwgIkVtcHR5IE1ldGFEYXRhIGxlbmd0aCBpcyBub24temVybzogIiA8PCBpbmZvLmxlbmd0aCgpOworCisgICAgYm9vbCBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5TUlNRVR5cGUsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0SW50MzIoa0tleVdpZHRoLCBrV2lkdGgxKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiSW5pdGlhbGl6aW5nIGtLZXlXaWR0aCwgb3ZlcndyaXRlIGlzIGV4cGVjdGVkIHRvIGJlIGZhbHNlIjsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0SW50MzIoa0tleUhlaWdodCwga0hlaWdodDEpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleUhlaWdodCwgb3ZlcndyaXRlIGlzIGV4cGVjdGVkIHRvIGJlIGZhbHNlIjsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0SW50MzIoa0tleVZpZGVvUHJvZmlsZSwga1Byb2ZpbGUpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleVZpZGVvUHJvZmlsZSwgb3ZlcndyaXRlIGlzIGV4cGVjdGVkIHRvIGJlIGZhbHNlIjsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0SW50MzIoa0tleVZpZGVvTGV2ZWwsIGtMZXZlbCk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5VmlkZW9MZXZlbCwgb3ZlcndyaXRlIGlzIGV4cGVjdGVkIHRvIGJlIGZhbHNlIjsKKworICAgIGluZm8gPSBtZXRhRGF0YS0+dG9TdHJpbmcoKTsKKyAgICBBU1NFUlRfR1QoaW5mby5sZW5ndGgoKSwgMCkgPDwgIk1ldGFEYXRhIGNvbnRhaW5zIG5vIGluZm9ybWF0aW9uIjsKKworICAgIC8vIER1bXAgdG8gbG9nIGZvciByZWZlcmVuY2UKKyAgICBtZXRhRGF0YS0+ZHVtcFRvTG9nKCk7CisKKyAgICAvLyBDbGVhciB3aG9sZSBtZXRhZGF0YQorICAgIG1ldGFEYXRhLT5jbGVhcigpOworCisgICAgaW5mbyA9IG1ldGFEYXRhLT50b1N0cmluZygpOworICAgIEFTU0VSVF9FUShpbmZvLmxlbmd0aCgpLCAwKSA8PCAiTWV0YURhdGEgbGVuZ3RoIGlzIG5vbi16ZXJvIGFmdGVyIGNsZWFyaW5nIGl0OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGluZm8ubGVuZ3RoKCk7CisKKyAgICBkZWxldGUgKG1ldGFEYXRhKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9PcHVzSGVhZGVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEyNTFhOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiT3B1c0hlYWRlclRlc3QiLAorICAgIGd0ZXN0OiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiT3B1c0hlYWRlclRlc3QuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9PcHVzSGVhZGVyL0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZlZTE2YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJUZXN0IG1vZHVsZSBjb25maWcgZm9yIG9wdXMgaGVhZGVyIHVuaXQgdGVzdHMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJPcHVzSGVhZGVyVGVzdCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJPcHVzSGVhZGVyVGVzdC0+L2RhdGEvbG9jYWwvdG1wL09wdXNIZWFkZXJUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKKyAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvT3B1c0hlYWRlci56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvT3B1c0hlYWRlclRlc3RSZXMvIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJPcHVzSGVhZGVyVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1mbGFnIiB2YWx1ZT0iLVAgL2RhdGEvbG9jYWwvdG1wL09wdXNIZWFkZXJUZXN0UmVzLyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9PcHVzSGVhZGVyL09wdXNIZWFkZXJUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9PcHVzSGVhZGVyVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM5YzkxNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9PcHVzSGVhZGVyVGVzdC5jcHAKQEAgLTAsMCArMSwzNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk9wdXNIZWFkZXJUZXN0IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmg+CisKKyNpbmNsdWRlICJPcHVzSGVhZGVyVGVzdEVudmlyb25tZW50LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisjZGVmaW5lIE9VVFBVVF9GSUxFX05BTUUgIi9kYXRhL2xvY2FsL3RtcC9PcHVzT3V0cHV0IgorCisvLyBPcHVzIGluIFdlYk0gaXMgYSB3ZWxsLWtub3duLCB5ZXQgdW5kZXItZG9jdW1lbnRlZCwgZm9ybWF0LiBUaGUgY29kZWMgcHJpdmF0ZSBkYXRhCisvLyBvZiB0aGUgdHJhY2sgaXMgYW4gT3B1cyBPZ2cgaGVhZGVyIChodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzg0NSNzZWN0aW9uLTUuMSkKKy8vIGNoYW5uZWwgbWFwcGluZyBvZmZzZXQgaW4gb3B1cyBoZWFkZXIKK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgPSAyMTsKK2NvbnN0ZXhwciBzaXplX3Qga01heE9wdXNIZWFkZXJTaXplID0gMTAwOworLy8gQU9QVVNIRFIgKyBBT1BVU0hEUkxlbmd0aCArCisvLyAoOCArIDggKSArCisvLyBIZWFkZXIoY3NkKSArIG51bV9zdHJlYW1zICsgbnVtX2NvdXBsZWQgKyAxCisvLyAoMTkgKyAxICsgMSArIDEpICsKKy8vIEFPUFVTRExZICsgQU9QVVNETFlMZW5ndGggKyBERUxBWSArIEFPUFVTUFJMICsgQU9QVVNQUkxMZW5ndGggKyBQUkwKKy8vICg4ICsgOCArIDggKyA4ICsgOCArIDgpCisvLyA9IDg2Citjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyQ2hhbm5lbE1hcE9mZnNldCA9IDg2OworY29uc3RleHByIHVpbnQzMl90IGtPcHVzU2FtcGxlUmF0ZSA9IDQ4MDAwOworY29uc3RleHByIHVpbnQ2NF90IGtPcHVzU2Vla1ByZXJvbGxOcyA9IDgwMDAwMDAwOworY29uc3RleHByIGludDY0X3Qga05zZWNQZXJTZWMgPSAxMDAwMDAwMDAwbGw7CisKKy8vIE9wdXMgdXNlcyBWb3JiaXMgY2hhbm5lbCBtYXBwaW5nLCBhbmQgVm9yYmlzIGNoYW5uZWwgbWFwcGluZyBzcGVjaWZpZXMKKy8vIG1hcHBpbmdzIGZvciB1cCB0byA4IGNoYW5uZWxzLiBUaGlzIGluZm9ybWF0aW9uIGlzIHBhcnQgb2YgdGhlIFZvcmJpcyBJCisvLyBTcGVjaWZpY2F0aW9uOgorLy8gaHR0cDovL3d3dy54aXBoLm9yZy92b3JiaXMvZG9jL1ZvcmJpc19JX3NwZWMuaHRtbAorY29uc3RleHByIGludCBrTWF4Q2hhbm5lbHMgPSA4OworY29uc3RleHByIHVpbnQ4X3Qga09wdXNDaGFubmVsTWFwW2tNYXhDaGFubmVsc11ba01heENoYW5uZWxzXSA9IHsKKyAgICAgICAgezB9LAorICAgICAgICB7MCwgMX0sCisgICAgICAgIHswLCAyLCAxfSwKKyAgICAgICAgezAsIDEsIDIsIDN9LAorICAgICAgICB7MCwgNCwgMSwgMiwgM30sCisgICAgICAgIHswLCA0LCAxLCAyLCAzLCA1fSwKKyAgICAgICAgezAsIDQsIDEsIDIsIDMsIDUsIDZ9LAorICAgICAgICB7MCwgNiwgMSwgMiwgMywgNCwgNSwgN30sCit9OworCitzdGF0aWMgT3B1c0hlYWRlclRlc3RFbnZpcm9ubWVudCAqZ0VudiA9IG51bGxwdHI7CisKK2NsYXNzIE9wdXNIZWFkZXJUZXN0IHsKKyAgcHVibGljOgorICAgIE9wdXNIZWFkZXJUZXN0KCkgOiBtSW5wdXRCdWZmZXIobnVsbHB0cikge30KKworICAgIH5PcHVzSGVhZGVyVGVzdCgpIHsKKyAgICAgICAgaWYgKG1FbGVTdHJlYW0uaXNfb3BlbigpKSBtRWxlU3RyZWFtLmNsb3NlKCk7CisgICAgICAgIGlmIChtSW5wdXRCdWZmZXIpIHsKKyAgICAgICAgICAgIGZyZWUobUlucHV0QnVmZmVyKTsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisgICAgaWZzdHJlYW0gbUVsZVN0cmVhbTsKKyAgICB1aW50OF90ICptSW5wdXRCdWZmZXI7Cit9OworCitjbGFzcyBPcHVzSGVhZGVyUGFyc2VUZXN0IDogcHVibGljIE9wdXNIZWFkZXJUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXBsZTxzdHJpbmcgLyogSW5wdXRGaWxlTmFtZSAqLywgaW50MzJfdCAvKiBDaGFubmVsQ291bnQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIC8qIGlzSGVhZGVyVmFsaWQgKi8sIGJvb2wgLyogaXNDb2RlY0RlbGF5VmFsaWQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIC8qIGlzU2Vla1ByZVJvbGxWYWxpZCAqLywgYm9vbCAvKiBpc0lucHV0VmFsaWQgKi8+PiB7Cit9OworCitjbGFzcyBPcHVzSGVhZGVyV3JpdGVUZXN0CisgICAgOiBwdWJsaWMgT3B1c0hlYWRlclRlc3QsCisgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHR1cGxlPGludDMyX3QgLyogQ2hhbm5lbENvdW50ICovLCBpbnQzMl90IC8qIHNraXBTYW1wbGVzICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgLyogcmVmZXJlbmNlRmlsZSAqLz4+IHt9OworCitURVNUX1AoT3B1c0hlYWRlcldyaXRlVGVzdCwgV3JpdGVUZXN0KSB7CisgICAgdHVwbGU8aW50MzJfdCwgaW50MzJfdCwgc3RyaW5nPiBwYXJhbXMgPSBHZXRQYXJhbSgpOworICAgIE9wdXNIZWFkZXIgd3JpdHRlbkhlYWRlcjsKKyAgICBtZW1zZXQoJndyaXR0ZW5IZWFkZXIsIDAsIHNpemVvZih3cml0dGVuSGVhZGVyKSk7CisgICAgaW50MzJfdCBjaGFubmVscyA9IGdldDwwPihwYXJhbXMpOworICAgIHdyaXR0ZW5IZWFkZXIuY2hhbm5lbHMgPSBjaGFubmVsczsKKyAgICB3cml0dGVuSGVhZGVyLm51bV9zdHJlYW1zID0gY2hhbm5lbHM7CisgICAgd3JpdHRlbkhlYWRlci5jaGFubmVsX21hcHBpbmcgPSAoKGNoYW5uZWxzID4gOCkgPyAyNTUgOiAoY2hhbm5lbHMgPiAyKSk7CisgICAgaW50MzJfdCBza2lwU2FtcGxlcyA9IGdldDwxPihwYXJhbXMpOworICAgIHN0cmluZyByZWZlcmVuY2VGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDI+KHBhcmFtcyk7CisgICAgd3JpdHRlbkhlYWRlci5za2lwX3NhbXBsZXMgPSBza2lwU2FtcGxlczsKKyAgICB1aW50NjRfdCBjb2RlY0RlbGF5TnMgPSBza2lwU2FtcGxlcyAqIGtOc2VjUGVyU2VjIC8ga09wdXNTYW1wbGVSYXRlOworICAgIHVpbnQ4X3QgaGVhZGVyRGF0YVtrTWF4T3B1c0hlYWRlclNpemVdOworICAgIGludDMyX3QgaGVhZGVyU2l6ZSA9IFdyaXRlT3B1c0hlYWRlcnMod3JpdHRlbkhlYWRlciwga09wdXNTYW1wbGVSYXRlLCBoZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhlYWRlckRhdGEpLCBjb2RlY0RlbGF5TnMsIGtPcHVzU2Vla1ByZXJvbGxOcyk7CisgICAgQVNTRVJUX0dUKGhlYWRlclNpemUsIDApIDw8ICJmYWlsZWQgdG8gZ2VuZXJhdGUgT3B1cyBoZWFkZXIiOworICAgIEFTU0VSVF9MRShoZWFkZXJTaXplLCBrTWF4T3B1c0hlYWRlclNpemUpCisgICAgICAgICAgICA8PCAiSW52YWxpZCBoZWFkZXIgd3JpdHRlbi4gSGVhZGVyIHNpemUgY2FuJ3QgZXhjZWVkIGtNYXhPcHVzSGVhZGVyU2l6ZSI7CisKKyAgICBvZnN0cmVhbSBvc3RybTsKKyAgICBvc3RybS5vcGVuKE9VVFBVVF9GSUxFX05BTUUsIG9mc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9UUlVFKG9zdHJtLmlzX29wZW4oKSkgPDwgIkZhaWxlZCB0byBvcGVuIG91dHB1dCBmaWxlICIgPDwgT1VUUFVUX0ZJTEVfTkFNRTsKKyAgICBvc3RybS53cml0ZShyZWludGVycHJldF9jYXN0PGNoYXIgKj4oaGVhZGVyRGF0YSksIGhlYWRlclNpemUpOworICAgIG9zdHJtLmNsb3NlKCk7CisKKyAgICBtRWxlU3RyZWFtLm9wZW4ocmVmZXJlbmNlRmlsZU5hbWUsIGlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShtRWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSkgPDwgIkZhaWxlZCB0byBvcGVuIHJlZmVyZW5jZUZpbGVOYW1lICIgPDwgZ2V0PDI+KHBhcmFtcyk7CisKKyAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgaW50MzJfdCBzdGF0U3RhdHVzID0gc3RhdChyZWZlcmVuY2VGaWxlTmFtZS5jX3N0cigpLCAmYnVmKTsKKyAgICBBU1NFUlRfRVEoc3RhdFN0YXR1cywgMCkgPDwgIlVuYWJsZSB0byBnZXQgZmlsZSBwcm9wZXJ0aWVzIjsKKworICAgIHNpemVfdCBmaWxlU2l6ZSA9IGJ1Zi5zdF9zaXplOworICAgIG1JbnB1dEJ1ZmZlciA9ICh1aW50OF90ICopbWFsbG9jKGZpbGVTaXplKTsKKyAgICBBU1NFUlRfTkUobUlucHV0QnVmZmVyLCBudWxscHRyKSA8PCAiSW5zdWZmaWNpZW50IG1lbW9yeS4gTWFsbG9jIGZhaWxlZCBmb3Igc2l6ZSAiIDw8IGZpbGVTaXplOworCisgICAgbUVsZVN0cmVhbS5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPihtSW5wdXRCdWZmZXIpLCBmaWxlU2l6ZSk7CisgICAgQVNTRVJUX0VRKG1FbGVTdHJlYW0uZ2NvdW50KCksIGZpbGVTaXplKSA8PCAibUVsZVN0cmVhbS5nY291bnQoKSAhPSBieXRlc0NvdW50IjsKKworICAgIEFTU0VSVF9FUShmaWxlU2l6ZSwgaGVhZGVyU2l6ZSkKKyAgICAgICAgICAgIDw8ICJNaXNtYXRjaCBpbiBzaXplIGJldHdlZW4gaGVhZGVyIGdlbmVyYXRlZCBhbmQgcmVmZXJlbmNlIGhlYWRlciI7CisgICAgaW50MzJfdCBtYXRjaCA9IG1lbWNtcChyZWludGVycHJldF9jYXN0PGNoYXIgKj4obUlucHV0QnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPihoZWFkZXJEYXRhKSwgZmlsZVNpemUpOworICAgIEFTU0VSVF9FUShtYXRjaCwgMCkgPDwgIk9wdXMgaGVhZGVyIGRvZXMgbm90IG1hdGNoIHJlZmVyZW5jZSBmaWxlOiAiIDw8IHJlZmVyZW5jZUZpbGVOYW1lOworCisgICAgc2l6ZV90IG9wdXNIZWFkU2l6ZSA9IDA7CisgICAgc2l6ZV90IGNvZGVjRGVsYXlCdWZTaXplID0gMDsKKyAgICBzaXplX3Qgc2Vla1ByZVJvbGxCdWZTaXplID0gMDsKKyAgICB2b2lkICpvcHVzSGVhZEJ1ZiA9IG51bGxwdHI7CisgICAgdm9pZCAqY29kZWNEZWxheUJ1ZiA9IG51bGxwdHI7CisgICAgdm9pZCAqc2Vla1ByZVJvbGxCdWYgPSBudWxscHRyOworICAgIGJvb2wgc3RhdHVzID0gR2V0T3B1c0hlYWRlckJ1ZmZlcnMoaGVhZGVyRGF0YSwgaGVhZGVyU2l6ZSwgJm9wdXNIZWFkQnVmLCAmb3B1c0hlYWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjRGVsYXlCdWYsICZjb2RlY0RlbGF5QnVmU2l6ZSwgJnNlZWtQcmVSb2xsQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlZWtQcmVSb2xsQnVmU2l6ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRW5jb3VudGVyZWQgZXJyb3IgaW4gR2V0T3B1c0hlYWRlckJ1ZmZlcnMiOworCisgICAgdWludDY0X3QgdmFsdWUgPSAqKCh1aW50NjRfdCAqKWNvZGVjRGVsYXlCdWYpOworICAgIEFTU0VSVF9FUSh2YWx1ZSwgY29kZWNEZWxheU5zKTsKKworICAgIHZhbHVlID0gKigodWludDY0X3QgKilzZWVrUHJlUm9sbEJ1Zik7CisgICAgQVNTRVJUX0VRKHZhbHVlLCBrT3B1c1NlZWtQcmVyb2xsTnMpOworCisgICAgT3B1c0hlYWRlciBwYXJzZWRIZWFkZXI7CisgICAgc3RhdHVzID0gUGFyc2VPcHVzSGVhZGVyKCh1aW50OF90ICopb3B1c0hlYWRCdWYsIG9wdXNIZWFkU2l6ZSwgJnBhcnNlZEhlYWRlcik7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRW5jb3VudGVyZWQgZXJyb3Igd2hpbGUgUGFyc2luZyBPcHVzIEhlYWRlci4iOworCisgICAgQVNTRVJUX0VRKHdyaXR0ZW5IZWFkZXIuY2hhbm5lbHMsIHBhcnNlZEhlYWRlci5jaGFubmVscykKKyAgICAgICAgICAgIDw8ICJJbnZhbGlkIGhlYWRlciBnZW5lcmF0ZWQuIE1pc21hdGNoIGJldHdlZW4gY2hhbm5lbCBjb3VudHMiOworCisgICAgQVNTRVJUX0VRKHdyaXR0ZW5IZWFkZXIuc2tpcF9zYW1wbGVzLCBwYXJzZWRIZWFkZXIuc2tpcF9zYW1wbGVzKQorICAgICAgICAgICAgPDwgIk1pc21hdGNoIGJldHdlZW4gbm8gb2Ygc2tpcFNhbXBsZXMgd3JpdHRlbiAiCisgICAgICAgICAgICAgICAiYW5kIG5vIG9mIHNraXBTYW1wbGVzIGdvdCBhZnRlciBwYXJzaW5nIjsKKworICAgIEFTU0VSVF9FUSh3cml0dGVuSGVhZGVyLmNoYW5uZWxfbWFwcGluZywgcGFyc2VkSGVhZGVyLmNoYW5uZWxfbWFwcGluZykKKyAgICAgICAgICAgIDw8ICJNaXNtYXRjaCBiZXR3ZWVuIGNoYW5uZWxNYXBwaW5nIHdyaXR0ZW4gIgorICAgICAgICAgICAgICAgImFuZCBjaGFubmVsTWFwcGluZyBnb3QgYWZ0ZXIgcGFyc2luZyI7CisKKyAgICBpZiAocGFyc2VkSGVhZGVyLmNoYW5uZWxfbWFwcGluZykgeworICAgICAgICBBU1NFUlRfR1QocGFyc2VkSGVhZGVyLmNoYW5uZWxzLCAyKTsKKyAgICAgICAgQVNTRVJUX0VRKHdyaXR0ZW5IZWFkZXIubnVtX3N0cmVhbXMsIHBhcnNlZEhlYWRlci5udW1fc3RyZWFtcykKKyAgICAgICAgICAgICAgICA8PCAiSW52YWxpZCBoZWFkZXIgZ2VuZXJhdGVkLiBNaXNtYXRjaCBiZXR3ZWVuIGNoYW5uZWwgY291bnRzIjsKKworICAgICAgICBBU1NFUlRfRVEod3JpdHRlbkhlYWRlci5udW1fY291cGxlZCwgcGFyc2VkSGVhZGVyLm51bV9jb3VwbGVkKQorICAgICAgICAgICAgICAgIDw8ICJJbnZhbGlkIGhlYWRlciBnZW5lcmF0ZWQuIE1pc21hdGNoIGJldHdlZW4gY2hhbm5lbCBjb3VudHMiOworCisgICAgICAgIEFTU0VSVF9FUShwYXJzZWRIZWFkZXIubnVtX2NvdXBsZWQgKyBwYXJzZWRIZWFkZXIubnVtX3N0cmVhbXMsIHBhcnNlZEhlYWRlci5jaGFubmVscyk7CisKKyAgICAgICAgQVNTRVJUX0xFKHBhcnNlZEhlYWRlci5udW1fY291cGxlZCwgcGFyc2VkSGVhZGVyLm51bV9zdHJlYW1zKQorICAgICAgICAgICAgICAgIDw8ICJJbnZhbGlkIGhlYWRlciBnZW5lcmF0ZWQuIE51bWJlciBvZiBjb3VwbGVkIHN0cmVhbXMgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiAiCisgICAgICAgICAgICAgICAgICAgIm51bWJlciAiCisgICAgICAgICAgICAgICAgICAgIm9mIHN0cmVhbXMuIjsKKworICAgICAgICBBU1NFUlRfRVEoaGVhZGVyU2l6ZSwga09wdXNIZWFkZXJDaGFubmVsTWFwT2Zmc2V0ICsgd3JpdHRlbkhlYWRlci5jaGFubmVscykKKyAgICAgICAgICAgICAgICA8PCAiSW52YWxpZCBoZWFkZXIgd3JpdHRlbi4gSGVhZGVyIHNpemUgc2hvdWxkIGJlIGVxdWFsIHRvIDg2ICsgIgorICAgICAgICAgICAgICAgICAgICJ3cml0dGVuSGVhZGVyLmNoYW5uZWxzIjsKKworICAgICAgICB1aW50OF90IG1hcHBlZENoYW5uZWxOdW1iZXI7CisgICAgICAgIGZvciAoaW50MzJfdCBjaGFubmVsTnVtYmVyID0gMDsgY2hhbm5lbE51bWJlciA8IGNoYW5uZWxzOyBjaGFubmVsTnVtYmVyKyspIHsKKyAgICAgICAgICAgIG1hcHBlZENoYW5uZWxOdW1iZXIgPSAqKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCAqPihvcHVzSGVhZEJ1ZikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgKyBjaGFubmVsTnVtYmVyKTsKKyAgICAgICAgICAgIEFTU0VSVF9MVChtYXBwZWRDaGFubmVsTnVtYmVyLCBjaGFubmVscykgPDwgIkludmFsaWQgaGVhZGVyIGdlbmVyYXRlZC4gQ2hhbm5lbCBtYXBwaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBiZSBncmVhdGVyIHRoYW4gY2hhbm5lbCBjb3VudC4iOworCisgICAgICAgICAgICBBU1NFUlRfRVEobWFwcGVkQ2hhbm5lbE51bWJlciwga09wdXNDaGFubmVsTWFwW2NoYW5uZWxzIC0gMV1bY2hhbm5lbE51bWJlcl0pCisgICAgICAgICAgICAgICAgICAgIDw8ICJJbnZhbGlkIGhlYWRlciBnZW5lcmF0ZWQuIENoYW5uZWwgbWFwcGluZyBpcyBub3QgYXMgcGVyIHNwZWNpZmljYXRpb24uIjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9MRShwYXJzZWRIZWFkZXIuY2hhbm5lbHMsIDIpOworICAgIH0KK30KKworVEVTVF9QKE9wdXNIZWFkZXJQYXJzZVRlc3QsIFBhcnNlVGVzdCkgeworICAgIHR1cGxlPHN0cmluZywgaW50MzJfdCwgYm9vbCwgYm9vbCwgYm9vbCwgYm9vbD4gcGFyYW1zID0gR2V0UGFyYW0oKTsKKyAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDA+KHBhcmFtcyk7CisgICAgbUVsZVN0cmVhbS5vcGVuKGlucHV0RmlsZU5hbWUsIGlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShtRWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSkgPDwgIkZhaWxlZCB0byBvcGVuIGlucHV0ZmlsZSAiIDw8IGdldDwwPihwYXJhbXMpOworICAgIGJvb2wgaXNIZWFkZXJWYWxpZCA9IGdldDwyPihwYXJhbXMpOworICAgIGJvb2wgaXNDb2RlY0RlbGF5VmFsaWQgPSBnZXQ8Mz4ocGFyYW1zKTsKKyAgICBib29sIGlzU2Vla1ByZVJvbGxWYWxpZCA9IGdldDw0PihwYXJhbXMpOworICAgIGJvb2wgaXNJbnB1dFZhbGlkID0gZ2V0PDU+KHBhcmFtcyk7CisKKyAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgc3RhdChpbnB1dEZpbGVOYW1lLmNfc3RyKCksICZidWYpOworICAgIHNpemVfdCBmaWxlU2l6ZSA9IGJ1Zi5zdF9zaXplOworICAgIG1JbnB1dEJ1ZmZlciA9ICh1aW50OF90ICopbWFsbG9jKGZpbGVTaXplKTsKKyAgICBBU1NFUlRfTkUobUlucHV0QnVmZmVyLCBudWxscHRyKSA8PCAiSW5zdWZmaWNpZW50IG1lbW9yeS4gTWFsbG9jIGZhaWxlZCBmb3Igc2l6ZSAiIDw8IGZpbGVTaXplOworCisgICAgbUVsZVN0cmVhbS5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPihtSW5wdXRCdWZmZXIpLCBmaWxlU2l6ZSk7CisgICAgQVNTRVJUX0VRKG1FbGVTdHJlYW0uZ2NvdW50KCksIGZpbGVTaXplKSA8PCAibUVsZVN0cmVhbS5nY291bnQoKSAhPSBieXRlc0NvdW50IjsKKworICAgIE9wdXNIZWFkZXIgaGVhZGVyOworICAgIHNpemVfdCBvcHVzSGVhZFNpemUgPSAwOworICAgIHNpemVfdCBjb2RlY0RlbGF5QnVmU2l6ZSA9IDA7CisgICAgc2l6ZV90IHNlZWtQcmVSb2xsQnVmU2l6ZSA9IDA7CisgICAgdm9pZCAqb3B1c0hlYWRCdWYgPSBudWxscHRyOworICAgIHZvaWQgKmNvZGVjRGVsYXlCdWYgPSBudWxscHRyOworICAgIHZvaWQgKnNlZWtQcmVSb2xsQnVmID0gbnVsbHB0cjsKKyAgICBib29sIHN0YXR1cyA9IEdldE9wdXNIZWFkZXJCdWZmZXJzKG1JbnB1dEJ1ZmZlciwgZmlsZVNpemUsICZvcHVzSGVhZEJ1ZiwgJm9wdXNIZWFkU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY0RlbGF5QnVmLCAmY29kZWNEZWxheUJ1ZlNpemUsICZzZWVrUHJlUm9sbEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWVrUHJlUm9sbEJ1ZlNpemUpOworICAgIGlmICghaXNIZWFkZXJWYWxpZCkgeworICAgICAgICBBU1NFUlRfRVEob3B1c0hlYWRCdWYsIG51bGxwdHIpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9ORShvcHVzSGVhZEJ1ZiwgbnVsbHB0cik7CisgICAgfQorICAgIGlmICghaXNDb2RlY0RlbGF5VmFsaWQpIHsKKyAgICAgICAgQVNTRVJUX0VRKGNvZGVjRGVsYXlCdWYsIG51bGxwdHIpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9ORShjb2RlY0RlbGF5QnVmLCBudWxscHRyKTsKKyAgICB9CisgICAgaWYgKCFpc1NlZWtQcmVSb2xsVmFsaWQpIHsKKyAgICAgICAgQVNTRVJUX0VRKHNlZWtQcmVSb2xsQnVmLCBudWxscHRyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfTkUoc2Vla1ByZVJvbGxCdWYsIG51bGxwdHIpOworICAgIH0KKyAgICBpZiAoIXN0YXR1cykgeworICAgICAgICBBU1NFUlRfRkFMU0UoaXNJbnB1dFZhbGlkKSA8PCAiR2V0T3B1c0hlYWRlckJ1ZmZlcnMgZmFpbGVkIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0YXR1cyA9IFBhcnNlT3B1c0hlYWRlcigodWludDhfdCAqKW9wdXNIZWFkQnVmLCBvcHVzSGVhZFNpemUsICZoZWFkZXIpOworCisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBBU1NFUlRfVFJVRShpc0lucHV0VmFsaWQpIDw8ICJQYXJzZSBvcHVzIGhlYWRlciBkaWRuJ3QgZmFpbCBmb3IgaW52YWxpZCBpbnB1dCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX0ZBTFNFKGlzSW5wdXRWYWxpZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQzMl90IGNoYW5uZWxzID0gZ2V0PDE+KHBhcmFtcyk7CisgICAgQVNTRVJUX0VRKGhlYWRlci5jaGFubmVscywgY2hhbm5lbHMpIDw8ICJQYXJzZXIgcmV0dXJuZWQgaW52YWxpZCBjaGFubmVsIGNvdW50IjsKKyAgICBBU1NFUlRfTEUoaGVhZGVyLmNoYW5uZWxzLCBrTWF4Q2hhbm5lbHMpOworCisgICAgQVNTRVJUX0xFKGhlYWRlci5udW1fY291cGxlZCwgaGVhZGVyLm51bV9zdHJlYW1zKQorICAgICAgICAgICAgPDwgIkludmFsaWQgaGVhZGVyIGdlbmVyYXRlZC4gTnVtYmVyIG9mIGNvdXBsZWQgc3RyZWFtcyBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIG51bWJlciAiCisgICAgICAgICAgICAgICAib2Ygc3RyZWFtcy4iOworCisgICAgQVNTRVJUX0VRKGhlYWRlci5udW1fY291cGxlZCArIGhlYWRlci5udW1fc3RyZWFtcywgaGVhZGVyLmNoYW5uZWxzKTsKKworICAgIGlmIChoZWFkZXIuY2hhbm5lbF9tYXBwaW5nKSB7CisgICAgICAgIHVpbnQ4X3QgbWFwcGVkQ2hhbm5lbE51bWJlcjsKKyAgICAgICAgZm9yIChpbnQzMl90IGNoYW5uZWxOdW1iZXIgPSAwOyBjaGFubmVsTnVtYmVyIDwgY2hhbm5lbHM7IGNoYW5uZWxOdW1iZXIrKykgeworICAgICAgICAgICAgbWFwcGVkQ2hhbm5lbE51bWJlciA9ICoocmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KG9wdXNIZWFkQnVmKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGNoYW5uZWxOdW1iZXIpOworICAgICAgICAgICAgQVNTRVJUX0xUKG1hcHBlZENoYW5uZWxOdW1iZXIsIGNoYW5uZWxzKQorICAgICAgICAgICAgICAgICAgICA8PCAiSW52YWxpZCBoZWFkZXIuIENoYW5uZWwgbWFwcGluZyBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIGNoYW5uZWwgY291bnQuIjsKKworICAgICAgICAgICAgQVNTRVJUX0VRKG1hcHBlZENoYW5uZWxOdW1iZXIsIGtPcHVzQ2hhbm5lbE1hcFtjaGFubmVscyAtIDFdW2NoYW5uZWxOdW1iZXJdKQorICAgICAgICAgICAgICAgICAgICA8PCAiSW52YWxpZCBoZWFkZXIgZ2VuZXJhdGVkLiBDaGFubmVsIG1hcHBpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAiaXMgbm90IGFzIHBlciBzcGVjaWZpY2F0aW9uLiI7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgT3B1c0hlYWRlclRlc3RBbGwsIE9wdXNIZWFkZXJXcml0ZVRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfdHVwbGUoMSwgMzEyLCAib3V0cHV0X2NoYW5uZWxzXzFza2lwU2FtcGxlc18zMTIub3B1cyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDIsIDMxMiwgIm91dHB1dF9jaGFubmVsc18yc2tpcFNhbXBsZXNfMzEyLm9wdXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSg1LCAzMTIsICJvdXRwdXRfY2hhbm5lbHNfNXNraXBTYW1wbGVzXzMxMi5vcHVzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoNiwgMzEyLCAib3V0cHV0X2NoYW5uZWxzXzZza2lwU2FtcGxlc18zMTIub3B1cyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDEsIDAsICJvdXRwdXRfY2hhbm5lbHNfMXNraXBTYW1wbGVzXzAub3B1cyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDIsIDAsICJvdXRwdXRfY2hhbm5lbHNfMnNraXBTYW1wbGVzXzAub3B1cyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDUsIDAsICJvdXRwdXRfY2hhbm5lbHNfNXNraXBTYW1wbGVzXzAub3B1cyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDYsIDAsICJvdXRwdXRfY2hhbm5lbHNfNnNraXBTYW1wbGVzXzAub3B1cyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDEsIDYyNCwgIm91dHB1dF9jaGFubmVsc18xc2tpcFNhbXBsZXNfNjI0Lm9wdXMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgyLCA2MjQsICJvdXRwdXRfY2hhbm5lbHNfMnNraXBTYW1wbGVzXzYyNC5vcHVzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoNSwgNjI0LCAib3V0cHV0X2NoYW5uZWxzXzVza2lwU2FtcGxlc182MjQub3B1cyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKDYsIDYyNCwgIm91dHB1dF9jaGFubmVsc182c2tpcFNhbXBsZXNfNjI0Lm9wdXMiKSkpOworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIE9wdXNIZWFkZXJUZXN0QWxsLCBPcHVzSGVhZGVyUGFyc2VUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCIyY2hfdmFsaWRfc2l6ZTgzQi5vcHVzIiwgMiwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiM2NoX3ZhbGlkX3NpemU4OEIub3B1cyIsIDMsIHRydWUsIHRydWUsIHRydWUsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjVjaF92YWxpZC5vcHVzIiwgNSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCI2Y2hfdmFsaWQub3B1cyIsIDYsIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiMWNoX3ZhbGlkLm9wdXMiLCAxLCB0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjJjaF92YWxpZC5vcHVzIiwgMiwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCIzY2hfaW52YWxpZF9zaXplLm9wdXMiLCAzLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiM2NoX2ludmFsaWRfc3RyZWFtcy5vcHVzIiwgMywgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjVjaF9pbnZhbGlkX2NoYW5uZWxtYXBwaW5nLm9wdXMiLCA1LCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCI1Y2hfaW52YWxpZF9jb3VwbGVkc3RyZWFtcy5vcHVzIiwgNSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiNmNoX2ludmFsaWRfY2hhbm5lbG1hcHBpbmcub3B1cyIsIDYsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjljaF9pbnZhbGlkX2NoYW5uZWxzLm9wdXMiLCA5LCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiMmNoX2ludmFsaWRfaGVhZGVyLm9wdXMiLCAyLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiMmNoX2ludmFsaWRfaGVhZGVybGVuZ3RoXzE2Lm9wdXMiLCAyLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiMmNoX2ludmFsaWRfaGVhZGVybGVuZ3RoXzI1Ni5vcHVzIiwgMiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjJjaF9pbnZhbGlkX3NpemUub3B1cyIsIDIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCIzY2hfaW52YWxpZF9jaGFubmVsbWFwcGluZ18wLm9wdXMiLCAzLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiM2NoX2ludmFsaWRfY291cGxlZHN0cmVhbXMub3B1cyIsIDMsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCIzY2hfaW52YWxpZF9oZWFkZXJsZW5ndGgub3B1cyIsIDMsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCIzY2hfaW52YWxpZF9oZWFkZXJTaXplMS5vcHVzIiwgMywgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjNjaF9pbnZhbGlkX2hlYWRlclNpemUyLm9wdXMiLCAzLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiM2NoX2ludmFsaWRfaGVhZGVyU2l6ZTMub3B1cyIsIDMsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCIzY2hfaW52YWxpZF9ub2RlbGF5Lm9wdXMiLCAzLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiM2NoX2ludmFsaWRfbm9wcmVyb2xsLm9wdXMiLCAzLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSkpKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgZ0VudiA9IG5ldyBPcHVzSGVhZGVyVGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBBTE9HRCgiT3B1cyBIZWFkZXIgVGVzdCBSZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9PcHVzSGVhZGVyVGVzdEVudmlyb25tZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvT3B1c0hlYWRlclRlc3RFbnZpcm9ubWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMTYzYzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvT3B1c0hlYWRlclRlc3RFbnZpcm9ubWVudC5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fT1BVU19IRUFERVJfVEVTVF9FTlZJUk9OTUVOVF9IX18KKyNkZWZpbmUgX19PUFVTX0hFQURFUl9URVNUX0VOVklST05NRU5UX0hfXworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGdldG9wdC5oPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitjbGFzcyBPcHVzSGVhZGVyVGVzdEVudmlyb25tZW50IDogcHVibGljIDo6dGVzdGluZzo6RW52aXJvbm1lbnQgeworICBwdWJsaWM6CisgICAgT3B1c0hlYWRlclRlc3RFbnZpcm9ubWVudCgpIDogcmVzKCIvZGF0YS9sb2NhbC90bXAvIikge30KKworICAgIC8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworICAgIGludCBpbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKKworICAgIHZvaWQgc2V0UmVzKGNvbnN0IGNoYXIgKl9yZXMpIHsgcmVzID0gX3JlczsgfQorCisgICAgY29uc3Qgc3RyaW5nIGdldFJlcygpIGNvbnN0IHsgcmV0dXJuIHJlczsgfQorCisgIHByaXZhdGU6CisgICAgc3RyaW5nIHJlczsKK307CisKK2ludCBPcHVzSGVhZGVyVGVzdEVudmlyb25tZW50Ojppbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0ge3sicGF0aCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnUCd9LCB7MCwgMCwgMCwgMH19OworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgaW50IGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiUDoiLCBvcHRpb25zLCAmaW5kZXgpOworICAgICAgICBpZiAoYyA9PSAtMSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ1AnOiB7CisgICAgICAgICAgICAgICAgc2V0UmVzKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG9wdGluZCA8IGFyZ2MpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBvcHRpb246ICVzXG5cbiIKKyAgICAgICAgICAgICAgICAidXNhZ2U6ICVzIDxndGVzdCBvcHRpb25zPiA8dGVzdCBvcHRpb25zPlxuXG4iCisgICAgICAgICAgICAgICAgInRlc3Qgb3B0aW9ucyBhcmU6XG5cbiIKKyAgICAgICAgICAgICAgICAiLVAsIC0tcGF0aDogUmVzb3VyY2UgZmlsZXMgZGlyZWN0b3J5IGxvY2F0aW9uXG4iLAorICAgICAgICAgICAgICAgIGFyZ3Zbb3B0aW5kID86IDFdLCBhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZW5kaWYgIC8vIF9fT1BVU19IRUFERVJfVEVTVF9FTlZJUk9OTUVOVF9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9SRUFETUUubWQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MGM4MjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMzkgQEAKKyMjIE1lZGlhIFRlc3RpbmcgIyMKKy0tLQorIyMjIyBPcHVzIEhlYWRlcgorVGhlIE9wdXNIZWFkZXIgVGVzdCBTdWl0ZSB2YWxpZGF0ZXMgdGhlIE9QVVMgaGVhZGVyIGF2YWlsYWJsZSBpbiBsaWJzdGFnZWZyaWdodC4KKworUnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQgdGhlIHRlc3Qgc3VpdGU6CitgYGAKK20gT3B1c0hlYWRlclRlc3QKK2BgYAorCitUaGUgMzItYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0LworCitUaGUgNjQtYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvCisKK1RvIHRlc3QgNjQtYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdDY0LgorYGBgCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvT3B1c0hlYWRlclRlc3QvT3B1c0hlYWRlclRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RvIHRlc3QgMzItYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdC9PcHVzSGVhZGVyVGVzdC9PcHVzSGVhZGVyVGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKworVGhlIHJlc291cmNlIGZpbGUgZm9yIHRoZSB0ZXN0cyBpcyB0YWtlbiBmcm9tIFtoZXJlXShodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9PcHVzSGVhZGVyLnppcCkuIERvd25sb2FkLCB1bnppcCBhbmQgcHVzaCB0aGVzZSBmaWxlcyBpbnRvIGRldmljZSBmb3IgdGVzdGluZy4KKworYGBgCithZGIgcHVzaCBPcHVzSGVhZGVyIC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCit1c2FnZTogT3B1c0hlYWRlclRlc3QgLVAgXDxwYXRoX3RvX2ZvbGRlclw+CitgYGAKK2FkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvT3B1c0hlYWRlclRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL09wdXNIZWFkZXIvCitgYGAKK0FsdGVybmF0aXZlbHksIHRoZSB0ZXN0IGNhbiBhbHNvIGJlIHJ1biB1c2luZyBhdGVzdCBjb21tYW5kLgorCitgYGAKK2F0ZXN0IE9wdXNIZWFkZXJUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKK2BgYApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9UeXBlVHJhaXRzX3Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9UeXBlVHJhaXRzX3Rlc3QuY3BwCmluZGV4IDFlMjA0OWQuLmQ1MzgzZDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvVHlwZVRyYWl0c190ZXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL1R5cGVUcmFpdHNfdGVzdC5jcHAKQEAgLTMwLDcgKzMwLDcgQEAKICAgICBlbnVtIElBIDogaW50MzJfdCB7IH07CiB9OwogCi0vLyA9PT09PT09PT09PSBiYXNpYyBzYW5pdHkgdGVzdHMgZm9yIHR5cGUtc3VwcG9ydCB0ZW1wbGF0ZXMKKy8vID09PT09PT09PT09IGJhc2ljIHRlc3RzIGZvciB0eXBlLXN1cHBvcnQgdGVtcGxhdGVzCiBURVNUX0YoVHlwZVRyYWl0c1Rlc3QsIFN0YXRpY1Rlc3RzKSB7CiAKICAgICAvLyA9PT09PT09PT09PT0gaXNfaW50ZWdyYWxfb3JfZW51bQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9jb2xvcnV0aWxzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL2NvbG9ydXRpbHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzdmNDA1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9jb2xvcnV0aWxzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJDb2xvclV0aWxzVGVzdCIsCisgICAgZ3Rlc3Q6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDb2xvclV0aWxzVGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL2NvbG9ydXRpbHMvQ29sb3JVdGlsc1Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9jb2xvcnV0aWxzL0NvbG9yVXRpbHNUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDgwMmI0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9jb2xvcnV0aWxzL0NvbG9yVXRpbHNUZXN0LmNwcApAQCAtMCwwICsxLDc3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29sb3JVdGlsc1Rlc3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgorCitjb25zdCBzaXplX3Qga0hEUkJ1ZmZlclNpemUgPSAyNTsKK2NvbnN0IHVpbnQxNl90IGtIRFJJbmZvVGVzdFZhbHVlMSA9IDQyMDsKK2NvbnN0IHVpbnQxNl90IGtIRFJJbmZvVGVzdFZhbHVlMiA9IDQyMDY5OworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKwordHlwZWRlZiBDb2xvckFzcGVjdHMgQ0E7CisKK2NsYXNzIENvbG9yUmFuZ2VUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTwvKiBDb2xvclJhbmdlICovIENBOjpSYW5nZT4geworICBwdWJsaWM6CisgICAgQ29sb3JSYW5nZVRlc3QoKSB7IG1SYW5nZSA9IEdldFBhcmFtKCk7IH07CisKKyAgICBDQTo6UmFuZ2UgbVJhbmdlOworfTsKKworY2xhc3MgQ29sb3JUcmFuc2ZlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPC8qIENvbG9yVHJhbnNmZXIgKi8gQ0E6OlRyYW5zZmVyPiB7CisgIHB1YmxpYzoKKyAgICBDb2xvclRyYW5zZmVyVGVzdCgpIHsgbVRyYW5zZmVyID0gR2V0UGFyYW0oKTsgfTsKKworICAgIENBOjpUcmFuc2ZlciBtVHJhbnNmZXI7Cit9OworCitjbGFzcyBDb2xvclN0YW5kYXJkVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08c3RkOjpwYWlyPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByaW1hcmllcyAqLyBDQTo6UHJpbWFyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hdHJpeENvZWZmcyAqLyBDQTo6TWF0cml4Q29lZmZzPj4geworICBwdWJsaWM6CisgICAgQ29sb3JTdGFuZGFyZFRlc3QoKSB7CisgICAgICAgIG1QcmltYXJpZXMgPSBHZXRQYXJhbSgpLmZpcnN0OworICAgICAgICBtTWF0cml4Q29lZmZzID0gR2V0UGFyYW0oKS5zZWNvbmQ7CisgICAgfTsKKworICAgIENBOjpQcmltYXJpZXMgbVByaW1hcmllczsKKyAgICBDQTo6TWF0cml4Q29lZmZzIG1NYXRyaXhDb2VmZnM7Cit9OworCitjbGFzcyBJc29Ub1BsYXRmb3JtQXNwZWN0c1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHN0ZDo6dHVwbGU8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByaW1hcmllcyAqLyBDQTo6UHJpbWFyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUcmFuc2ZlciAqLyBDQTo6VHJhbnNmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hdHJpeENvZWZmcyAqLyBDQTo6TWF0cml4Q29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGFuZGFyZCAqLyBpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUcmFuc2ZlciAqLyBpbnQzMl90Pj4geworICBwdWJsaWM6CisgICAgSXNvVG9QbGF0Zm9ybUFzcGVjdHNUZXN0KCkgeworICAgICAgICBtUHJpbWFyaWVzID0gc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1UcmFuc2ZlciA9IHN0ZDo6Z2V0PDE+KEdldFBhcmFtKCkpOworICAgICAgICBtTWF0cml4Q29lZmZzID0gc3RkOjpnZXQ8Mj4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1QbGF0Zm9ybVN0YW5kYXJkID0gc3RkOjpnZXQ8Mz4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1QbGF0Zm9ybVRyYW5zZmVyID0gc3RkOjpnZXQ8ND4oR2V0UGFyYW0oKSk7CisgICAgfTsKKworICAgIENBOjpQcmltYXJpZXMgbVByaW1hcmllczsKKyAgICBDQTo6VHJhbnNmZXIgbVRyYW5zZmVyOworICAgIENBOjpNYXRyaXhDb2VmZnMgbU1hdHJpeENvZWZmczsKKyAgICBpbnQzMl90IG1QbGF0Zm9ybVN0YW5kYXJkOworICAgIGludDMyX3QgbVBsYXRmb3JtVHJhbnNmZXI7Cit9OworCitjbGFzcyBDb2xvckFzcGVjdHNUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzdGQ6OnR1cGxlPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJpbWFyaWVzICovIENBOjpQcmltYXJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2xvclRyYW5zZmVyICovIENBOjpUcmFuc2ZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hdHJpeENvZWZmcyAqLyBDQTo6TWF0cml4Q29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29sb3JSYW5nZSAqLyBDQTo6UmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2xvclN0YW5kYXJkICovIENBOjpTdGFuZGFyZD4+IHsKKyAgcHVibGljOgorICAgIENvbG9yQXNwZWN0c1Rlc3QoKSB7CisgICAgICAgIG1QcmltYXJpZXMgPSBzdGQ6OmdldDwwPihHZXRQYXJhbSgpKTsKKyAgICAgICAgbVRyYW5zZmVyID0gc3RkOjpnZXQ8MT4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1NYXRyaXhDb2VmZnMgPSBzdGQ6OmdldDwyPihHZXRQYXJhbSgpKTsKKyAgICAgICAgbVJhbmdlID0gc3RkOjpnZXQ8Mz4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1TdGFuZGFyZCA9IHN0ZDo6Z2V0PDQ+KEdldFBhcmFtKCkpOworICAgIH07CisKKyAgICBDQTo6UHJpbWFyaWVzIG1QcmltYXJpZXM7CisgICAgQ0E6OlRyYW5zZmVyIG1UcmFuc2ZlcjsKKyAgICBDQTo6TWF0cml4Q29lZmZzIG1NYXRyaXhDb2VmZnM7CisgICAgQ0E6OlJhbmdlIG1SYW5nZTsKKyAgICBDQTo6U3RhbmRhcmQgbVN0YW5kYXJkOworfTsKKworY2xhc3MgRGVmYXVsdENvbG9yQXNwZWN0c1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHN0ZDo6dHVwbGU8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV2lkdGggKi8gaW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIZWlnaHQgKi8gaW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcmltYXJpZXMgKi8gQ0E6OlByaW1hcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNYXRyaXhDb2VmZnMgKi8gQ0E6Ok1hdHJpeENvZWZmcz4+IHsKKyAgcHVibGljOgorICAgIERlZmF1bHRDb2xvckFzcGVjdHNUZXN0KCkgeworICAgICAgICBtV2lkdGggPSBzdGQ6OmdldDwwPihHZXRQYXJhbSgpKTsKKyAgICAgICAgbUhlaWdodCA9IHN0ZDo6Z2V0PDE+KEdldFBhcmFtKCkpOworICAgICAgICBtUHJpbWFyaWVzID0gc3RkOjpnZXQ8Mj4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1NYXRyaXhDb2VmZnMgPSBzdGQ6OmdldDwzPihHZXRQYXJhbSgpKTsKKyAgICB9OworCisgICAgaW50MzJfdCBtV2lkdGg7CisgICAgaW50MzJfdCBtSGVpZ2h0OworICAgIENBOjpQcmltYXJpZXMgbVByaW1hcmllczsKKyAgICBDQTo6TWF0cml4Q29lZmZzIG1NYXRyaXhDb2VmZnM7Cit9OworCitjbGFzcyBEYXRhU3BhY2VUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxzdGQ6OnR1cGxlPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29sb3JSYW5nZSAqLyBDQTo6UmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcmltYXJpZXMgKi8gQ0E6OlByaW1hcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbG9yVHJhbnNmZXIgKi8gQ0E6OlRyYW5zZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWF0cml4Q29lZmZzICovIENBOjpNYXRyaXhDb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB2MF9hbmRyb2lkX2RhdGFzcGFjZSAqLyBhbmRyb2lkX2RhdGFzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZHJvaWRfZGF0YXNwYWNlICovIGFuZHJvaWRfZGF0YXNwYWNlPj4geworICBwdWJsaWM6CisgICAgRGF0YVNwYWNlVGVzdCgpIHsKKyAgICAgICAgbVJhbmdlID0gc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1QcmltYXJpZXMgPSBzdGQ6OmdldDwxPihHZXRQYXJhbSgpKTsKKyAgICAgICAgbVRyYW5zZmVyID0gc3RkOjpnZXQ8Mj4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1NYXRyaXhDb2VmZnMgPSBzdGQ6OmdldDwzPihHZXRQYXJhbSgpKTsKKyAgICAgICAgbURhdGFTcGFjZVYwID0gc3RkOjpnZXQ8ND4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1EYXRhU3BhY2UgPSBzdGQ6OmdldDw1PihHZXRQYXJhbSgpKTsKKyAgICB9OworCisgICAgQ0E6OlJhbmdlIG1SYW5nZTsKKyAgICBDQTo6UHJpbWFyaWVzIG1QcmltYXJpZXM7CisgICAgQ0E6OlRyYW5zZmVyIG1UcmFuc2ZlcjsKKyAgICBDQTo6TWF0cml4Q29lZmZzIG1NYXRyaXhDb2VmZnM7CisgICAgYW5kcm9pZF9kYXRhc3BhY2UgbURhdGFTcGFjZVYwOworICAgIGFuZHJvaWRfZGF0YXNwYWNlIG1EYXRhU3BhY2U7Cit9OworCitURVNUX1AoQ29sb3JSYW5nZVRlc3QsIFdyYXBDb2xvclJhbmdlVGVzdCkgeworICAgIGludDMyX3QgcmFuZ2UgPSBDb2xvclV0aWxzOjp3cmFwQ29sb3JBc3BlY3RzSW50b0NvbG9yUmFuZ2UobVJhbmdlKTsKKyAgICBDQTo6UmFuZ2UgdW53cmFwcGVkUmFuZ2U7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gQ29sb3JVdGlsczo6dW53cmFwQ29sb3JBc3BlY3RzRnJvbUNvbG9yUmFuZ2UocmFuZ2UsICZ1bndyYXBwZWRSYW5nZSk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJ1bndyYXBwaW5nIENvbG9yQXNwZWN0cyBmcm9tIENvbG9yUmFuZ2UgZmFpbGVkIjsKKyAgICBFWFBFQ1RfRVEodW53cmFwcGVkUmFuZ2UsIG1SYW5nZSkgPDwgIlJldHVybmVkIENvbG9yUmFuZ2UgZG9lc24ndCBtYXRjaCI7CisgICAgQUxPR1YoInRvU3RyaW5nIHRlc3Q6IFJhbmdlOiAlcyIsIGFzU3RyaW5nKG1SYW5nZSwgImRlZmF1bHQiKSk7Cit9CisKK1RFU1RfUChDb2xvclRyYW5zZmVyVGVzdCwgV3JhcENvbG9yVHJhbnNmZXJUZXN0KSB7CisgICAgaW50MzJfdCB0cmFuc2ZlciA9IENvbG9yVXRpbHM6OndyYXBDb2xvckFzcGVjdHNJbnRvQ29sb3JUcmFuc2ZlcihtVHJhbnNmZXIpOworICAgIENBOjpUcmFuc2ZlciB1bndyYXBwZWRUcmFuc2ZlcjsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBDb2xvclV0aWxzOjp1bndyYXBDb2xvckFzcGVjdHNGcm9tQ29sb3JUcmFuc2Zlcih0cmFuc2ZlciwgJnVud3JhcHBlZFRyYW5zZmVyKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgInVud3JhcHBpbmcgQ29sb3JBc3BlY3RzIGZyb20gQ29sb3JUcmFuc2ZlciBmYWlsZWQiOworICAgIEVYUEVDVF9FUSh1bndyYXBwZWRUcmFuc2ZlciwgbVRyYW5zZmVyKSA8PCAiUmV0dXJuZWQgQ29sb3JUcmFuc2ZlciBkb2Vzbid0IG1hdGNoIjsKKyAgICBBTE9HVigidG9TdHJpbmcgdGVzdDogVHJhbnNmZXI6ICVzIiwgYXNTdHJpbmcobVRyYW5zZmVyLCAiZGVmYXVsdCIpKTsKK30KKworVEVTVF9QKENvbG9yU3RhbmRhcmRUZXN0LCBXcmFwQ29sb3JTdGFuZGFyZFRlc3QpIHsKKyAgICBpbnQzMl90IHN0YW5kYXJkID0gQ29sb3JVdGlsczo6d3JhcENvbG9yQXNwZWN0c0ludG9Db2xvclN0YW5kYXJkKG1QcmltYXJpZXMsIG1NYXRyaXhDb2VmZnMpOworICAgIENBOjpQcmltYXJpZXMgdW53cmFwcGVkUHJpbWFyaWVzOworICAgIENBOjpNYXRyaXhDb2VmZnMgdW53cmFwcGVkTWF0cml4Q29lZmZzOworICAgIHN0YXR1c190IHN0YXR1cyA9IENvbG9yVXRpbHM6OnVud3JhcENvbG9yQXNwZWN0c0Zyb21Db2xvclN0YW5kYXJkKHN0YW5kYXJkLCAmdW53cmFwcGVkUHJpbWFyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1bndyYXBwZWRNYXRyaXhDb2VmZnMpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAidW53cmFwcGluZyBDb2xvckFzcGVjdHMgZnJvbSBDb2xvclN0YW5kYXJkIGZhaWxlZCI7CisgICAgRVhQRUNUX0VRKHVud3JhcHBlZFByaW1hcmllcywgbVByaW1hcmllcykgPDwgIlJldHVybmVkIHByaW1hcmllcyBkb2Vzbid0IG1hdGNoIjsKKyAgICBFWFBFQ1RfRVEodW53cmFwcGVkTWF0cml4Q29lZmZzLCBtTWF0cml4Q29lZmZzKSA8PCAiUmV0dXJuZWQgIG1hdHJpeENvZWZmcyBkb2Vzbid0IG1hdGNoIjsKK30KKworVEVTVF9QKENvbG9yQXNwZWN0c1Rlc3QsIFBsYXRmb3JtQXNwZWN0c1Rlc3QpIHsKKyAgICBDQSBhc3BlY3RzOworICAgIGFzcGVjdHMubVJhbmdlID0gbVJhbmdlOworICAgIGFzcGVjdHMubVByaW1hcmllcyA9IG1QcmltYXJpZXM7CisgICAgYXNwZWN0cy5tVHJhbnNmZXIgPSBtVHJhbnNmZXI7CisgICAgYXNwZWN0cy5tTWF0cml4Q29lZmZzID0gbU1hdHJpeENvZWZmczsKKworICAgIGludDMyX3QgcmFuZ2UgPSAtMTsKKyAgICBpbnQzMl90IHN0YW5kYXJkID0gLTE7CisgICAgaW50MzJfdCB0cmFuc2ZlciA9IC0xOworICAgIHN0YXR1c190IHN0YXR1cyA9IENvbG9yVXRpbHM6OmNvbnZlcnRDb2RlY0NvbG9yQXNwZWN0c1RvUGxhdGZvcm1Bc3BlY3RzKGFzcGVjdHMsICZyYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhbmRhcmQsICZ0cmFuc2Zlcik7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJDb252ZXJzaW9uIG9mIENvbG9yQXNwZWN0cyB0byBQbGF0Zm9ybUFzcGVjdHMgZmFpbGVkIjsKKworICAgIENBIHJldHVybmVkQXNwZWN0czsKKyAgICBzdGF0dXMgPSBDb2xvclV0aWxzOjpjb252ZXJ0UGxhdGZvcm1Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cyhyYW5nZSwgc3RhbmRhcmQsIHRyYW5zZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkQXNwZWN0cyk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJDb252ZXJzaW9uIG9mIFBsYXRmb3JtQXNwZWN0cyB0byBDb2xvckFzcGVjdHMgZmFpbGVkIjsKKyAgICBFWFBFQ1RfRVEocmV0dXJuZWRBc3BlY3RzLm1SYW5nZSwgYXNwZWN0cy5tUmFuZ2UpCisgICAgICAgICAgICA8PCAicmFuZ2UgbWlzbWF0Y2ggZm9yIGNvbnZlcnNpb24gYmV0d2VlbiBQbGF0Zm9ybUFzcGVjdHMiOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubVByaW1hcmllcywgYXNwZWN0cy5tUHJpbWFyaWVzKQorICAgICAgICAgICAgPDwgInByaW1hcmllcyBtaXNtYXRjaCBmb3IgY29udmVyc2lvbiBiZXR3ZWVuIFBsYXRmb3JtQXNwZWN0cyI7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tVHJhbnNmZXIsIGFzcGVjdHMubVRyYW5zZmVyKQorICAgICAgICAgICAgPDwgInRyYW5zZmVyIG1pc21hdGNoIGZvciBjb252ZXJzaW9uIGJldHdlZW4gUGxhdGZvcm1Bc3BlY3RzIjsKKyAgICBFWFBFQ1RfRVEocmV0dXJuZWRBc3BlY3RzLm1NYXRyaXhDb2VmZnMsIGFzcGVjdHMubU1hdHJpeENvZWZmcykKKyAgICAgICAgICAgIDw8ICJtYXRyaXhDb2VmZnMgbWlzbWF0Y2ggZm9yIGNvbnZlcnNpb24gYmV0d2VlbiBQbGF0Zm9ybUFzcGVjdHMiOworfQorCitURVNUX1AoQ29sb3JBc3BlY3RzVGVzdCwgSXNvQXNwZWN0c1Rlc3QpIHsKKyAgICBDQSBhc3BlY3RzOworICAgIGFzcGVjdHMubVJhbmdlID0gbVJhbmdlOworICAgIGFzcGVjdHMubVByaW1hcmllcyA9IG1QcmltYXJpZXM7CisgICAgYXNwZWN0cy5tVHJhbnNmZXIgPSBtVHJhbnNmZXI7CisgICAgYXNwZWN0cy5tTWF0cml4Q29lZmZzID0gbU1hdHJpeENvZWZmczsKKworICAgIGludDMyX3QgcHJpbWFyaWVzID0gLTE7CisgICAgaW50MzJfdCBjb2xvclRyYW5zZmVyID0gLTE7CisgICAgaW50MzJfdCBtYXRyaXhDb2VmZnMgPSAtMTsKKyAgICBib29sIGZ1bGxSYW5nZSA9IGZhbHNlOworICAgIENvbG9yVXRpbHM6OmNvbnZlcnRDb2RlY0NvbG9yQXNwZWN0c1RvSXNvQXNwZWN0cyhhc3BlY3RzLCAmcHJpbWFyaWVzLCAmY29sb3JUcmFuc2ZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1hdHJpeENvZWZmcywgJmZ1bGxSYW5nZSk7CisKKyAgICBDQSByZXR1cm5lZEFzcGVjdHM7CisgICAgQ29sb3JVdGlsczo6Y29udmVydElzb0NvbG9yQXNwZWN0c1RvQ29kZWNBc3BlY3RzKHByaW1hcmllcywgY29sb3JUcmFuc2ZlciwgbWF0cml4Q29lZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsUmFuZ2UsIHJldHVybmVkQXNwZWN0cyk7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tUmFuZ2UsIGFzcGVjdHMubVJhbmdlKQorICAgICAgICAgICAgPDwgInJhbmdlIG1pc21hdGNoIGZvciBjb252ZXJzaW9uIGJldHdlZW4gSXNvQXNwZWN0cyI7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tUHJpbWFyaWVzLCBhc3BlY3RzLm1QcmltYXJpZXMpCisgICAgICAgICAgICA8PCAicHJpbWFyaWVzIG1pc21hdGNoIGZvciBjb252ZXJzaW9uIGJldHdlZW4gSXNvQXNwZWN0cyI7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tVHJhbnNmZXIsIGFzcGVjdHMubVRyYW5zZmVyKQorICAgICAgICAgICAgPDwgInRyYW5zZmVyIG1pc21hdGNoIGZvciBjb252ZXJzaW9uIGJldHdlZW4gSXNvQXNwZWN0cyI7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tTWF0cml4Q29lZmZzLCBhc3BlY3RzLm1NYXRyaXhDb2VmZnMpCisgICAgICAgICAgICA8PCAibWF0cml4Q29lZmZzIG1pc21hdGNoIGZvciBjb252ZXJzaW9uIGJldHdlZW4gSXNvQXNwZWN0cyI7Cit9CisKK1RFU1RfUChJc29Ub1BsYXRmb3JtQXNwZWN0c1Rlc3QsIElzb0FzcGVjdHNUb1BsYXRmb3JtQXNwZWN0c1Rlc3QpIHsKKyAgICBDQSBhc3BlY3RzOworICAgIGFzcGVjdHMubVByaW1hcmllcyA9IG1QcmltYXJpZXM7CisgICAgYXNwZWN0cy5tVHJhbnNmZXIgPSBtVHJhbnNmZXI7CisgICAgYXNwZWN0cy5tTWF0cml4Q29lZmZzID0gbU1hdHJpeENvZWZmczsKKworICAgIGludDMyX3QgaXNvUHJpbWFyaWVzID0gLTE7CisgICAgaW50MzJfdCBpc29UcmFuc2ZlciA9IC0xOworICAgIGludDMyX3QgaXNvTWF0cml4Q29lZmZzID0gLTE7CisgICAgYm9vbCBmdWxscmFuZ2UgPSBmYWxzZTsKKyAgICBDb2xvclV0aWxzOjpjb252ZXJ0Q29kZWNDb2xvckFzcGVjdHNUb0lzb0FzcGVjdHMoYXNwZWN0cywgJmlzb1ByaW1hcmllcywgJmlzb1RyYW5zZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNvTWF0cml4Q29lZmZzLCAmZnVsbHJhbmdlKTsKKworICAgIGludDMyX3QgcmFuZ2UgPSAtMTsKKyAgICBpbnQzMl90IHN0YW5kYXJkID0gLTE7CisgICAgaW50MzJfdCB0cmFuc2ZlciA9IC0xOworICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb1BsYXRmb3JtQXNwZWN0cyhpc29QcmltYXJpZXMsIGlzb1RyYW5zZmVyLCBpc29NYXRyaXhDb2VmZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxyYW5nZSwgJnJhbmdlLCAmc3RhbmRhcmQsICZ0cmFuc2Zlcik7CisgICAgaWYgKGZ1bGxyYW5nZSkgeworICAgICAgICBFWFBFQ1RfRVEocmFuZ2UsIENvbG9yVXRpbHM6OmtDb2xvclJhbmdlRnVsbCkKKyAgICAgICAgICAgICAgICA8PCAicmFuZ2UgaW5jb3JyZWN0IGNvbnZlcnRpbmcgdG8gUGxhdGZvcm1Bc3BlY3RzIjsKKyAgICB9CisgICAgRVhQRUNUX0VRKHN0YW5kYXJkLCBtUGxhdGZvcm1TdGFuZGFyZCkgPDwgInN0YW5kYXJkIGluY29ycmVjdCBjb252ZXJ0aW5nIHRvIFBsYXRmb3JtQXNwZWN0cyI7CisgICAgRVhQRUNUX0VRKHRyYW5zZmVyLCBtUGxhdGZvcm1UcmFuc2ZlcikgPDwgInRyYW5zZmVyIGluY29ycmVjdCBjb252ZXJ0aW5nIHRvIFBsYXRmb3JtQXNwZWN0cyI7Cit9CisKK1RFU1RfUChDb2xvckFzcGVjdHNUZXN0LCBQYWNrQ29sb3JBc3BlY3RzVGVzdCkgeworICAgIENBIGFzcGVjdHM7CisgICAgYXNwZWN0cy5tUmFuZ2UgPSBtUmFuZ2U7CisgICAgYXNwZWN0cy5tUHJpbWFyaWVzID0gbVByaW1hcmllczsKKyAgICBhc3BlY3RzLm1UcmFuc2ZlciA9IG1UcmFuc2ZlcjsKKyAgICBhc3BlY3RzLm1NYXRyaXhDb2VmZnMgPSBtTWF0cml4Q29lZmZzOworICAgIHVpbnQzMl90IHBhY2tlZENvbG9yQXNwZWN0cyA9IENvbG9yVXRpbHM6OnBhY2tUb1UzMihhc3BlY3RzKTsKKworICAgIENBIHVucGFja2VkQXNwZWN0cyA9IENvbG9yVXRpbHM6OnVucGFja1RvQ29sb3JBc3BlY3RzKHBhY2tlZENvbG9yQXNwZWN0cyk7CisgICAgRVhQRUNUX0VRKHVucGFja2VkQXNwZWN0cy5tUmFuZ2UsIG1SYW5nZSkgPDwgInJhbmdlIG1pc21hdGNoIGFmdGVyIHVucGFja2luZyI7CisgICAgRVhQRUNUX0VRKHVucGFja2VkQXNwZWN0cy5tUHJpbWFyaWVzLCBtUHJpbWFyaWVzKSA8PCAicHJpbWFyaWVzIG1pc21hdGNoIGFmdGVyIHVucGFja2luZyI7CisgICAgRVhQRUNUX0VRKHVucGFja2VkQXNwZWN0cy5tVHJhbnNmZXIsIG1UcmFuc2ZlcikgPDwgInRyYW5zZmVyIG1pc21hdGNoIGFmdGVyIHVucGFja2luZyI7CisgICAgRVhQRUNUX0VRKHVucGFja2VkQXNwZWN0cy5tTWF0cml4Q29lZmZzLCBtTWF0cml4Q29lZmZzKQorICAgICAgICAgICAgPDwgIm1hdHJpeENvZWZmcyBtaXNtYXRjaCBhZnRlciB1bnBhY2tpbmciOworICAgIEFMT0dWKCJ0b1N0cmluZyB0ZXN0OiBTdGFuZGFyZDogJXMiLCBhc1N0cmluZyhtU3RhbmRhcmQsICJkZWZhdWx0IikpOworfQorCitURVNUX1AoRGVmYXVsdENvbG9yQXNwZWN0c1Rlc3QsIERlZmF1bHRDb2xvckFzcGVjdHNUZXN0KSB7CisgICAgQ0EgYXNwZWN0czsKKyAgICBhc3BlY3RzLm1SYW5nZSA9IENBOjpSYW5nZVVuc3BlY2lmaWVkOworICAgIGFzcGVjdHMubVByaW1hcmllcyA9IENBOjpQcmltYXJpZXNVbnNwZWNpZmllZDsKKyAgICBhc3BlY3RzLm1NYXRyaXhDb2VmZnMgPSBDQTo6TWF0cml4VW5zcGVjaWZpZWQ7CisgICAgYXNwZWN0cy5tVHJhbnNmZXIgPSBDQTo6VHJhbnNmZXJVbnNwZWNpZmllZDsKKworICAgIENvbG9yVXRpbHM6OnNldERlZmF1bHRDb2RlY0NvbG9yQXNwZWN0c0lmTmVlZGVkKGFzcGVjdHMsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgRVhQRUNUX0VRKGFzcGVjdHMubVJhbmdlLCBDQTo6UmFuZ2VMaW1pdGVkKSA8PCAicmFuZ2Ugbm90IHNldCB0byBkZWZhdWx0IjsKKyAgICBFWFBFQ1RfRVEoYXNwZWN0cy5tUHJpbWFyaWVzLCBtUHJpbWFyaWVzKSA8PCAicHJpbWFyaWVzIG5vdCBzZXQgdG8gZGVmYXVsdCI7CisgICAgRVhQRUNUX0VRKGFzcGVjdHMubU1hdHJpeENvZWZmcywgbU1hdHJpeENvZWZmcykgPDwgIm1hdHJpeENvZWZmcyBub3Qgc2V0IHRvIGRlZmF1bHQiOworICAgIEVYUEVDVF9FUShhc3BlY3RzLm1UcmFuc2ZlciwgQ0E6OlRyYW5zZmVyU01QVEUxNzBNKSA8PCAidHJhbnNmZXIgbm90IHNldCB0byBkZWZhdWx0IjsKK30KKworVEVTVF9QKERhdGFTcGFjZVRlc3QsIERhdGFTcGFjZVRlc3QpIHsKKyAgICBDQSBhc3BlY3RzOworICAgIGFzcGVjdHMubVJhbmdlID0gbVJhbmdlOworICAgIGFzcGVjdHMubVByaW1hcmllcyA9IG1QcmltYXJpZXM7CisgICAgYXNwZWN0cy5tVHJhbnNmZXIgPSBtVHJhbnNmZXI7CisgICAgYXNwZWN0cy5tTWF0cml4Q29lZmZzID0gbU1hdHJpeENvZWZmczsKKworICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSA9IENvbG9yVXRpbHM6OmdldERhdGFTcGFjZUZvckNvbG9yQXNwZWN0cyhhc3BlY3RzLCBmYWxzZSk7CisgICAgRVhQRUNUX0VRKGRhdGFTcGFjZSwgbURhdGFTcGFjZSkgPDwgIlJldHVybmVkIGluY29ycmVjdCBkYXRhc3BhY2UiOworCisgICAgYm9vbCBzdGF0dXMgPSBDb2xvclV0aWxzOjpjb252ZXJ0RGF0YVNwYWNlVG9WMChkYXRhU3BhY2UpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIlJldHVybmVkIHYwIGRhdGFzcGFjZSBpcyBub3QgYXNwZWN0LW9ubHkiOworICAgIEVYUEVDVF9FUShkYXRhU3BhY2UsIG1EYXRhU3BhY2VWMCkgPDwgIlJldHVybmVkIGluY29ycmVjdCB2MCBkYXRhc3BhY2UiOworfQorCitURVNUKENvbG9yVXRpbHNVbml0VGVzdCwgQXNwZWN0c0NoYW5nZWRUZXN0KSB7CisgICAgQ0Egb3JpZ0FzcGVjdHM7CisgICAgb3JpZ0FzcGVjdHMubVJhbmdlID0gQ0E6OlJhbmdlOjpSYW5nZUZ1bGw7CisgICAgb3JpZ0FzcGVjdHMubVByaW1hcmllcyA9IENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNzA5XzU7CisgICAgb3JpZ0FzcGVjdHMubVRyYW5zZmVyID0gQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckxpbmVhcjsKKyAgICBvcmlnQXNwZWN0cy5tTWF0cml4Q29lZmZzID0gQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ3MDlfNTsKKworICAgIENBIGFzcGVjdHM7CisgICAgYXNwZWN0cy5tUmFuZ2UgPSBDQTo6UmFuZ2U6OlJhbmdlRnVsbDsKKyAgICBhc3BlY3RzLm1QcmltYXJpZXMgPSBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDcwOV81OworICAgIGFzcGVjdHMubVRyYW5zZmVyID0gQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckxpbmVhcjsKKyAgICBhc3BlY3RzLm1NYXRyaXhDb2VmZnMgPSBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDcwOV81OworCisgICAgYm9vbCBzdGF0dXMgPSBDb2xvclV0aWxzOjpjaGVja0lmQXNwZWN0c0NoYW5nZWRBbmRVbnNwZWNpZnlUaGVtKGFzcGVjdHMsIG9yaWdBc3BlY3RzKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiQ29sb3JBc3BlY3RzIGNvbXBhcmlzb24gY2hlY2sgZmFpbGVkIjsKKworICAgIGFzcGVjdHMubVJhbmdlID0gQ0E6OlJhbmdlOjpSYW5nZUxpbWl0ZWQ7CisgICAgc3RhdHVzID0gQ29sb3JVdGlsczo6Y2hlY2tJZkFzcGVjdHNDaGFuZ2VkQW5kVW5zcGVjaWZ5VGhlbShhc3BlY3RzLCBvcmlnQXNwZWN0cyk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiQ29sb3JBc3BlY3RzIGNvbXBhcmlzb24gY2hlY2sgZmFpbGVkIjsKKyAgICBFWFBFQ1RfRVEoYXNwZWN0cy5tUmFuZ2UsIENBOjpSYW5nZTo6UmFuZ2VVbnNwZWNpZmllZCkgPDwgInJhbmdlIHNob3VsZCBoYXZlIGJlZW4gdW5zcGVjaWZpZWQiOworICAgIGFzcGVjdHMubVJhbmdlID0gQ0E6OlJhbmdlOjpSYW5nZUZ1bGw7CisKKyAgICBhc3BlY3RzLm1UcmFuc2ZlciA9IENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJTUkdCOworICAgIHN0YXR1cyA9IENvbG9yVXRpbHM6OmNoZWNrSWZBc3BlY3RzQ2hhbmdlZEFuZFVuc3BlY2lmeVRoZW0oYXNwZWN0cywgb3JpZ0FzcGVjdHMpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkNvbG9yQXNwZWN0cyBjb21wYXJpc29uIGNoZWNrIGZhaWxlZCI7CisgICAgRVhQRUNUX0VRKGFzcGVjdHMubVRyYW5zZmVyLCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyVW5zcGVjaWZpZWQpCisgICAgICAgICAgICA8PCAidHJhbnNmZXIgc2hvdWxkIGhhdmUgYmVlbiB1bnNwZWNpZmllZCI7CisgICAgYXNwZWN0cy5tVHJhbnNmZXIgPSBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyTGluZWFyOworCisgICAgYXNwZWN0cy5tUHJpbWFyaWVzID0gQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQyMDIwOworICAgIHN0YXR1cyA9IENvbG9yVXRpbHM6OmNoZWNrSWZBc3BlY3RzQ2hhbmdlZEFuZFVuc3BlY2lmeVRoZW0oYXNwZWN0cywgb3JpZ0FzcGVjdHMsIHRydWUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkNvbG9yQXNwZWN0cyBjb21wYXJpc29uIGNoZWNrIGZhaWxlZCI7CisgICAgRVhQRUNUX0VRKGFzcGVjdHMubVByaW1hcmllcywgQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzVW5zcGVjaWZpZWQpCisgICAgICAgICAgICA8PCAicHJpbWFyaWVzIHNob3VsZCBoYXZlIGJlZW4gdW5zcGVjaWZpZWQiOworICAgIEVYUEVDVF9FUShhc3BlY3RzLm1NYXRyaXhDb2VmZnMsIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeFVuc3BlY2lmaWVkKQorICAgICAgICAgICAgPDwgIm1hdHJpeENvZWZmcyBzaG91bGQgaGF2ZSBiZWVuIHVuc3BlY2lmaWVkIjsKKworICAgIGFzcGVjdHMubU1hdHJpeENvZWZmcyA9IENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeFNNUFRFMjQwTTsKKyAgICBzdGF0dXMgPSBDb2xvclV0aWxzOjpjaGVja0lmQXNwZWN0c0NoYW5nZWRBbmRVbnNwZWNpZnlUaGVtKGFzcGVjdHMsIG9yaWdBc3BlY3RzLCB0cnVlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJDb2xvckFzcGVjdHMgY29tcGFyaXNvbiBjaGVjayBmYWlsZWQiOworICAgIEVYUEVDVF9FUShhc3BlY3RzLm1QcmltYXJpZXMsIENBOjpQcmltYXJpZXM6OlByaW1hcmllc1Vuc3BlY2lmaWVkKQorICAgICAgICAgICAgPDwgInByaW1hcmllcyBzaG91bGQgaGF2ZSBiZWVuIHVuc3BlY2lmaWVkIjsKKyAgICBFWFBFQ1RfRVEoYXNwZWN0cy5tTWF0cml4Q29lZmZzLCBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhVbnNwZWNpZmllZCkKKyAgICAgICAgICAgIDw8ICJtYXRyaXhDb2VmZnMgc2hvdWxkIGhhdmUgYmVlbiB1bnNwZWNpZmllZCI7Cit9CisKK1RFU1QoQ29sb3JVdGlsc1VuaXRUZXN0LCBDb2xvckNvbmZpZ0Zyb21Gb3JtYXRUZXN0KSB7CisgICAgaW50IHJhbmdlID0gLTE7CisgICAgaW50IHN0YW5kYXJkID0gLTE7CisgICAgaW50IHRyYW5zZmVyID0gLTE7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOworICAgIEFTU0VSVF9ORShmb3JtYXQsIG51bGxwdHIpIDw8ICJmYWlsZWQgdG8gY3JlYXRlIEFNZXNzYWdlIjsKKyAgICBDb2xvclV0aWxzOjpnZXRDb2xvckNvbmZpZ0Zyb21Gb3JtYXQoZm9ybWF0LCAmcmFuZ2UsICZzdGFuZGFyZCwgJnRyYW5zZmVyKTsKKyAgICBFWFBFQ1RfRVEocmFuZ2UgfCBzdGFuZGFyZCB8IHRyYW5zZmVyLCAwKSA8PCAiY29sb3IgY29uZmlnIGRpZG4ndCBkZWZhdWx0IHRvIDAiOworCisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfUkFOR0UsIENBOjpSYW5nZTo6UmFuZ2VGdWxsKTsKKyAgICBmb3JtYXQtPnNldEludDMyKEtFWV9DT0xPUl9TVEFOREFSRCwgQ0E6OlN0YW5kYXJkOjpTdGFuZGFyZEJUNzA5KTsKKyAgICBmb3JtYXQtPnNldEludDMyKEtFWV9DT0xPUl9UUkFOU0ZFUiwgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckxpbmVhcik7CisgICAgQ29sb3JVdGlsczo6Z2V0Q29sb3JDb25maWdGcm9tRm9ybWF0KGZvcm1hdCwgJnJhbmdlLCAmc3RhbmRhcmQsICZ0cmFuc2Zlcik7CisgICAgRVhQRUNUX0VRKHJhbmdlLCBDQTo6UmFuZ2U6OlJhbmdlRnVsbCkgPDwgInJhbmdlIG1pc21hdGNoIjsKKyAgICBFWFBFQ1RfRVEoc3RhbmRhcmQsIENBOjpTdGFuZGFyZDo6U3RhbmRhcmRCVDcwOSkgPDwgInN0YW5kYXJkIG1pc21hdGNoIjsKKyAgICBFWFBFQ1RfRVEodHJhbnNmZXIsIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJMaW5lYXIpIDw8ICJ0cmFuc2ZlciBtaXNtYXRjaCI7CisKKyAgICByYW5nZSA9IHN0YW5kYXJkID0gdHJhbnNmZXIgPSAtMTsKKyAgICBzcDxBTWVzc2FnZT4gY29weUZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOworICAgIEFTU0VSVF9ORShjb3B5Rm9ybWF0LCBudWxscHRyKSA8PCAiZmFpbGVkIHRvIGNyZWF0ZSBBTWVzc2FnZSI7CisgICAgQ29sb3JVdGlsczo6Y29weUNvbG9yQ29uZmlnKGZvcm1hdCwgY29weUZvcm1hdCk7CisgICAgYm9vbCBzdGF0dXMgPSBjb3B5Rm9ybWF0LT5maW5kSW50MzIoS0VZX0NPTE9SX1JBTkdFLCAmcmFuZ2UpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkNvbG9yQ29uZmlnIHJhbmdlIGVudHJ5IG1pc3NpbmciOworICAgIHN0YXR1cyA9IGNvcHlGb3JtYXQtPmZpbmRJbnQzMihLRVlfQ09MT1JfU1RBTkRBUkQsICZzdGFuZGFyZCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiQ29sb3JDb25maWcgc3RhbmRhcmQgZW50cnkgbWlzc2luZyI7CisgICAgc3RhdHVzID0gY29weUZvcm1hdC0+ZmluZEludDMyKEtFWV9DT0xPUl9UUkFOU0ZFUiwgJnRyYW5zZmVyKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJDb2xvckNvbmZpZyB0cmFuc2ZlciBlbnRyeSBtaXNzaW5nIjsKKyAgICBFWFBFQ1RfRVEocmFuZ2UsIENBOjpSYW5nZTo6UmFuZ2VGdWxsKSA8PCAicmFuZ2UgbWlzbWF0Y2giOworICAgIEVYUEVDVF9FUShzdGFuZGFyZCwgQ0E6OlN0YW5kYXJkOjpTdGFuZGFyZEJUNzA5KSA8PCAic3RhbmRhcmQgbWlzbWF0Y2giOworICAgIEVYUEVDVF9FUSh0cmFuc2ZlciwgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckxpbmVhcikgPDwgInRyYW5zZmVyIG1pc21hdGNoZCI7CisKKyAgICByYW5nZSA9IHN0YW5kYXJkID0gdHJhbnNmZXIgPSAtMTsKKyAgICBDb2xvclV0aWxzOjpnZXRDb2xvckNvbmZpZ0Zyb21Gb3JtYXQoY29weUZvcm1hdCwgJnJhbmdlLCAmc3RhbmRhcmQsICZ0cmFuc2Zlcik7CisgICAgRVhQRUNUX0VRKHJhbmdlLCBDQTo6UmFuZ2U6OlJhbmdlRnVsbCkgPDwgInJhbmdlIG1pc21hdGNoIjsKKyAgICBFWFBFQ1RfRVEoc3RhbmRhcmQsIENBOjpTdGFuZGFyZDo6U3RhbmRhcmRCVDcwOSkgPDwgInN0YW5kYXJkIG1pc21hdGNoIjsKKyAgICBFWFBFQ1RfRVEodHJhbnNmZXIsIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJMaW5lYXIpIDw8ICJ0cmFuc2ZlciBtaXNtYXRjaCI7Cit9CisKK1RFU1RfUChDb2xvckFzcGVjdHNUZXN0LCBGb3JtYXRUZXN0KSB7CisgICAgQ0EgYXNwZWN0czsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlKCk7CisgICAgQVNTRVJUX05FKGZvcm1hdCwgbnVsbHB0cikgPDwgImZhaWxlZCB0byBjcmVhdGUgQU1lc3NhZ2UiOworICAgIENvbG9yVXRpbHM6OnNldENvbG9yQXNwZWN0c0ludG9Gb3JtYXQoYXNwZWN0cywgZm9ybWF0LCB0cnVlKTsKKworICAgIENBIHJldHVybmVkQXNwZWN0czsKKyAgICBDb2xvclV0aWxzOjpnZXRDb2xvckFzcGVjdHNGcm9tRm9ybWF0KGZvcm1hdCwgcmV0dXJuZWRBc3BlY3RzKTsKKyAgICBFWFBFQ1RfRVEocmV0dXJuZWRBc3BlY3RzLm1SYW5nZSwgYXNwZWN0cy5tUmFuZ2UpIDw8ICJyYW5nZSBtaXNtYXRjaCI7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tUHJpbWFyaWVzLCBhc3BlY3RzLm1QcmltYXJpZXMpIDw8ICJwcmltYXJpZXMgbWlzbWF0Y2giOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubVRyYW5zZmVyLCBhc3BlY3RzLm1UcmFuc2ZlcikgPDwgInRyYW5zZmVyIG1pc21hdGNoIjsKKyAgICBFWFBFQ1RfRVEocmV0dXJuZWRBc3BlY3RzLm1NYXRyaXhDb2VmZnMsIGFzcGVjdHMubU1hdHJpeENvZWZmcykgPDwgIm1hdHJpeENvZWZmcyBtaXNtYXRjaCI7CisKKyAgICBhc3BlY3RzLm1SYW5nZSA9IG1SYW5nZTsKKyAgICBhc3BlY3RzLm1QcmltYXJpZXMgPSBtUHJpbWFyaWVzOworICAgIGFzcGVjdHMubVRyYW5zZmVyID0gbVRyYW5zZmVyOworICAgIGFzcGVjdHMubU1hdHJpeENvZWZmcyA9IG1NYXRyaXhDb2VmZnM7CisgICAgQ29sb3JVdGlsczo6c2V0Q29sb3JBc3BlY3RzSW50b0Zvcm1hdChhc3BlY3RzLCBmb3JtYXQpOworCisgICAgbWVtc2V0KCZyZXR1cm5lZEFzcGVjdHMsIDAsIHNpemVvZihyZXR1cm5lZEFzcGVjdHMpKTsKKyAgICBDb2xvclV0aWxzOjpnZXRDb2xvckFzcGVjdHNGcm9tRm9ybWF0KGZvcm1hdCwgcmV0dXJuZWRBc3BlY3RzKTsKKyAgICBFWFBFQ1RfRVEocmV0dXJuZWRBc3BlY3RzLm1SYW5nZSwgYXNwZWN0cy5tUmFuZ2UpIDw8ICJyYW5nZSBtaXNtYXRjaCI7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tUHJpbWFyaWVzLCBhc3BlY3RzLm1QcmltYXJpZXMpIDw8ICJwcmltYXJpZXMgbWlzbWF0Y2giOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubVRyYW5zZmVyLCBhc3BlY3RzLm1UcmFuc2ZlcikgPDwgInRyYW5zZmVyIG1pc21hdGNoIjsKKyAgICBFWFBFQ1RfRVEocmV0dXJuZWRBc3BlY3RzLm1NYXRyaXhDb2VmZnMsIGFzcGVjdHMubU1hdHJpeENvZWZmcykgPDwgIm1hdHJpeENvZWZmcyBtaXNtYXRjaCI7Cit9CisKK1RFU1QoQ29sb3JVdGlsc1VuaXRUZXN0LCBIRFJTdGF0aWNJbmZvVGVzdCkgeworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICBBU1NFUlRfTkUoZm9ybWF0LCBudWxscHRyKSA8PCAiZmFpbGVkIHRvIGNyZWF0ZSBBTWVzc2FnZSI7CisKKyAgICBIRFJTdGF0aWNJbmZvIHJldHVybmVkSW5mb0hEUjsKKyAgICBib29sIHN0YXR1cyA9IENvbG9yVXRpbHM6OmdldEhEUlN0YXRpY0luZm9Gcm9tRm9ybWF0KGZvcm1hdCwgJnJldHVybmVkSW5mb0hEUik7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkhEUiBpbmZvIHNob3VsZCBiZSBhYnNlbnQgaW4gZW1wdHkgZm9ybWF0IjsKKworICAgIEhEUlN0YXRpY0luZm8gaW5mb0hEUjsKKyAgICBpbmZvSERSLnNUeXBlMS5tTWF4RGlzcGxheUx1bWluYW5jZSA9IGtIRFJJbmZvVGVzdFZhbHVlMjsKKyAgICBpbmZvSERSLnNUeXBlMS5tTWluRGlzcGxheUx1bWluYW5jZSA9IGtIRFJJbmZvVGVzdFZhbHVlMTsKKyAgICBpbmZvSERSLnNUeXBlMS5tTWF4Q29udGVudExpZ2h0TGV2ZWwgPSBrSERSSW5mb1Rlc3RWYWx1ZTI7CisgICAgaW5mb0hEUi5zVHlwZTEubU1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWwgPSBrSERSSW5mb1Rlc3RWYWx1ZTE7CisgICAgaW5mb0hEUi5zVHlwZTEubVIueCA9IGtIRFJJbmZvVGVzdFZhbHVlMTsKKyAgICBpbmZvSERSLnNUeXBlMS5tUi55ID0ga0hEUkluZm9UZXN0VmFsdWUyOworICAgIGluZm9IRFIuc1R5cGUxLm1HLnggPSBrSERSSW5mb1Rlc3RWYWx1ZTE7CisgICAgaW5mb0hEUi5zVHlwZTEubUcueSA9IGtIRFJJbmZvVGVzdFZhbHVlMjsKKyAgICBpbmZvSERSLnNUeXBlMS5tQi54ID0ga0hEUkluZm9UZXN0VmFsdWUxOworICAgIGluZm9IRFIuc1R5cGUxLm1CLnkgPSBrSERSSW5mb1Rlc3RWYWx1ZTI7CisgICAgaW5mb0hEUi5zVHlwZTEubVcueCA9IGtIRFJJbmZvVGVzdFZhbHVlMTsKKyAgICBpbmZvSERSLnNUeXBlMS5tVy55ID0ga0hEUkluZm9UZXN0VmFsdWUyOworICAgIENvbG9yVXRpbHM6OnNldEhEUlN0YXRpY0luZm9JbnRvRm9ybWF0KGluZm9IRFIsIGZvcm1hdCk7CisKKyAgICBzdGF0dXMgPSBDb2xvclV0aWxzOjpnZXRIRFJTdGF0aWNJbmZvRnJvbUZvcm1hdChmb3JtYXQsICZyZXR1cm5lZEluZm9IRFIpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgSERSIGluZm8gZnJvbSBmb3JtYXQiOworICAgIEFTU0VSVF9FUSgwLCBtZW1jbXAoJnJldHVybmVkSW5mb0hEUiwgJmluZm9IRFIsIHNpemVvZihpbmZvSERSKSkpIDw8ICIgSERSU3RhdGljSW5mbyBtaXNtYXRjaCI7CisKKyAgICBBTWVkaWFGb3JtYXQgKm1lZGlhRm9ybWF0ID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIEFTU0VSVF9ORShtZWRpYUZvcm1hdCwgbnVsbHB0cikgPDwgIlVuYWJsZSB0byBjcmVhdGUgQU1lZGlhRm9ybWF0IjsKKyAgICBDb2xvclV0aWxzOjpzZXRIRFJTdGF0aWNJbmZvSW50b0FNZWRpYUZvcm1hdChpbmZvSERSLCBtZWRpYUZvcm1hdCk7CisgICAgbWVtc2V0KCZyZXR1cm5lZEluZm9IRFIsIDAsIHNpemVvZihyZXR1cm5lZEluZm9IRFIpKTsKKyAgICBzdGF0dXMgPSBDb2xvclV0aWxzOjpnZXRIRFJTdGF0aWNJbmZvRnJvbUZvcm1hdChtZWRpYUZvcm1hdC0+bUZvcm1hdCwgJnJldHVybmVkSW5mb0hEUik7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtZWRpYUZvcm1hdCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCBIRFIgaW5mbyBmcm9tIG1lZGlhIGZvcm1hdCI7CisgICAgQVNTRVJUX0VRKDAsIG1lbWNtcCgmcmV0dXJuZWRJbmZvSERSLCAmaW5mb0hEUiwgc2l6ZW9mKGluZm9IRFIpKSkgPDwgIiBIRFJTdGF0aWNJbmZvIG1pc21hdGNoIjsKK30KKworVEVTVChDb2xvclV0aWxzVW5pdFRlc3QsIFNhbml0eVRlc3QpIHsKKyAgICBDQTo6UHJpbWFyaWVzIHVubWFwcGVkUHJpbWFyaWVzID0gKENBOjpQcmltYXJpZXMpKENBOjpQcmltYXJpZXM6OlByaW1hcmllc090aGVyICsgMSk7CisgICAgQ0E6Ok1hdHJpeENvZWZmcyB1bm1hcHBlZE1hdHJpeENvZWZmcyA9IChDQTo6TWF0cml4Q29lZmZzKShDQTo6TWF0cml4T3RoZXIgKyAxKTsKKyAgICBpbnQzMl90IGNvbG9yU3RhbmRhcmQgPQorICAgICAgICAgICAgQ29sb3JVdGlsczo6d3JhcENvbG9yQXNwZWN0c0ludG9Db2xvclN0YW5kYXJkKHVubWFwcGVkUHJpbWFyaWVzLCBDQTo6TWF0cml4VW5zcGVjaWZpZWQpOworICAgIEVYUEVDVF9FUShjb2xvclN0YW5kYXJkLCBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZFVuc3BlY2lmaWVkKQorICAgICAgICAgICAgPDwgIlN0YW5kYXJkIHVuc3BlY2lmaWVkIGV4cGVjdGVkIjsKKyAgICBjb2xvclN0YW5kYXJkID0KKyAgICAgICAgICAgIENvbG9yVXRpbHM6OndyYXBDb2xvckFzcGVjdHNJbnRvQ29sb3JTdGFuZGFyZChDQTo6UHJpbWFyaWVzT3RoZXIsIHVubWFwcGVkTWF0cml4Q29lZmZzKTsKKyAgICBFWFBFQ1RfRVEoY29sb3JTdGFuZGFyZCwgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRVbnNwZWNpZmllZCkKKyAgICAgICAgICAgIDw8ICJTdGFuZGFyZCB1bnNwZWNpZmllZCBleHBlY3RlZCI7CisgICAgY29sb3JTdGFuZGFyZCA9IENvbG9yVXRpbHM6OndyYXBDb2xvckFzcGVjdHNJbnRvQ29sb3JTdGFuZGFyZChDQTo6UHJpbWFyaWVzQlQ2MDFfNl81MjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4QlQyMDIwKTsKKyAgICBFWFBFQ1RfR0UoY29sb3JTdGFuZGFyZCwgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRFeHRlbmRlZFN0YXJ0KQorICAgICAgICAgICAgPDwgIlN0YW5kYXJkIGdyZWF0ZXIgdGhhbiBleHRlbmRlZCBzdGFydCBleHBlY3RlZCI7CisgICAgdW5tYXBwZWRQcmltYXJpZXMgPSAoQ0E6OlByaW1hcmllcykoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQyMDIwICsgMSk7CisgICAgdW5tYXBwZWRNYXRyaXhDb2VmZnMgPSAoQ0E6Ok1hdHJpeENvZWZmcykoQ0E6Ok1hdHJpeEJUMjAyMENvbnN0YW50ICsgMSk7CisgICAgY29sb3JTdGFuZGFyZCA9CisgICAgICAgICAgICBDb2xvclV0aWxzOjp3cmFwQ29sb3JBc3BlY3RzSW50b0NvbG9yU3RhbmRhcmQodW5tYXBwZWRQcmltYXJpZXMsIHVubWFwcGVkTWF0cml4Q29lZmZzKTsKKyAgICBFWFBFQ1RfR0UoY29sb3JTdGFuZGFyZCwgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRFeHRlbmRlZFN0YXJ0KQorICAgICAgICAgICAgPDwgIlN0YW5kYXJkIGdyZWF0ZXIgdGhhbiBleHRlbmRlZCBzdGFydCBleHBlY3RlZCI7CisKKyAgICBDQSBhc3BlY3RzOworICAgIGludDMyX3QgY29sb3JSYW5nZSA9IC0xOworICAgIGNvbG9yU3RhbmRhcmQgPSAtMTsKKyAgICBpbnQzMl90IGNvbG9yVHJhbnNmZXIgPSAtMTsKKyAgICBhc3BlY3RzLm1QcmltYXJpZXMgPSAoQ0E6OlByaW1hcmllcykoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzT3RoZXIgKyAxKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBDb2xvclV0aWxzOjpjb252ZXJ0Q29kZWNDb2xvckFzcGVjdHNUb1BsYXRmb3JtQXNwZWN0cygKKyAgICAgICAgICAgIGFzcGVjdHMsICZjb2xvclJhbmdlLCAmY29sb3JTdGFuZGFyZCwgJmNvbG9yVHJhbnNmZXIpOworICAgIEVYUEVDVF9ORShzdGF0dXMsIE9LKSA8PCAiaW52YWxpZCBjb2xvckFzcGVjdHMgdmFsdWUgYWNjZXB0ZWQiOworCisgICAgaW50MzJfdCBjb2xvclByaW1hcmllcyA9IC0xOworICAgIGNvbG9yVHJhbnNmZXIgPSAtMTsKKyAgICBpbnQzMl90IGNvbG9yTWF0cml4Q29lZmZzID0gLTE7CisgICAgYm9vbCBmdWxsUmFuZ2UgPSBmYWxzZTsKKyAgICBhc3BlY3RzLm1QcmltYXJpZXMgPSBDQTo6UHJpbWFyaWVzT3RoZXI7CisgICAgYXNwZWN0cy5tVHJhbnNmZXIgPSBDQTo6VHJhbnNmZXJPdGhlcjsKKyAgICBhc3BlY3RzLm1NYXRyaXhDb2VmZnMgPSBDQTo6TWF0cml4T3RoZXI7CisgICAgQ29sb3JVdGlsczo6Y29udmVydENvZGVjQ29sb3JBc3BlY3RzVG9Jc29Bc3BlY3RzKGFzcGVjdHMsICZjb2xvclByaW1hcmllcywgJmNvbG9yVHJhbnNmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2xvck1hdHJpeENvZWZmcywgJmZ1bGxSYW5nZSk7CisgICAgQ0EgcmV0dXJuZWRBc3BlY3RzOworICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cyhjb2xvclByaW1hcmllcywgY29sb3JUcmFuc2ZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JNYXRyaXhDb2VmZnMsIGZ1bGxSYW5nZSwgcmV0dXJuZWRBc3BlY3RzKTsKKyAgICBFWFBFQ1RfRVEocmV0dXJuZWRBc3BlY3RzLm1QcmltYXJpZXMsIENBOjpQcmltYXJpZXNVbnNwZWNpZmllZCkKKyAgICAgICAgICAgIDw8ICJleHBlY3RlZCB1bnNwZWNpZmllZCBQcmltYXJpZXMiOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubVRyYW5zZmVyLCBDQTo6VHJhbnNmZXJVbnNwZWNpZmllZCkKKyAgICAgICAgICAgIDw8ICJleHBlY3RlZCB1bnNwZWNpZmllZCBUcmFuc2ZlciI7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tTWF0cml4Q29lZmZzLCBDQTo6TWF0cml4VW5zcGVjaWZpZWQpCisgICAgICAgICAgICA8PCAiZXhwZWN0ZWQgdW5zcGVjaWZpZWQgTWF0cml4Q29lZmZzIjsKKworICAgIC8vIGludmFsaWQgdmFsdWVzLCBvdGhlciB2YWx1ZSBlcXVhbHMgMHhGRgorICAgIGNvbG9yUHJpbWFyaWVzID0gQ0E6OlByaW1hcmllc090aGVyOworICAgIGNvbG9yVHJhbnNmZXIgPSBDQTo6VHJhbnNmZXJPdGhlcjsKKyAgICBjb2xvck1hdHJpeENvZWZmcyA9IENBOjpNYXRyaXhPdGhlcjsKKyAgICBmdWxsUmFuZ2UgPSBmYWxzZTsKKyAgICBtZW1zZXQoJnJldHVybmVkQXNwZWN0cywgMCwgc2l6ZW9mKHJldHVybmVkQXNwZWN0cykpOworICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cyhjb2xvclByaW1hcmllcywgY29sb3JUcmFuc2ZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JNYXRyaXhDb2VmZnMsIGZ1bGxSYW5nZSwgcmV0dXJuZWRBc3BlY3RzKTsKKyAgICBFWFBFQ1RfRVEocmV0dXJuZWRBc3BlY3RzLm1QcmltYXJpZXMsIENBOjpQcmltYXJpZXNVbnNwZWNpZmllZCkKKyAgICAgICAgICAgIDw8ICJleHBlY3RlZCB1bnNwZWNpZmllZCBQcmltYXJpZXMiOworICAgIEVYUEVDVF9FUShyZXR1cm5lZEFzcGVjdHMubVRyYW5zZmVyLCBDQTo6VHJhbnNmZXJVbnNwZWNpZmllZCkKKyAgICAgICAgICAgIDw8ICJleHBlY3RlZCB1bnNwZWNpZmllZCBUcmFuc2ZlciI7CisgICAgRVhQRUNUX0VRKHJldHVybmVkQXNwZWN0cy5tTWF0cml4Q29lZmZzLCBDQTo6TWF0cml4VW5zcGVjaWZpZWQpCisgICAgICAgICAgICA8PCAiZXhwZWN0ZWQgdW5zcGVjaWZpZWQgTWF0cml4Q29lZmZzIjsKKworICAgIENBOjpQcmltYXJpZXMgcHJpbWFyaWVzID0gQ0E6OlByaW1hcmllc1Vuc3BlY2lmaWVkOworICAgIENBOjpNYXRyaXhDb2VmZnMgbWF0cml4Q29lZmZzID0gQ0E6Ok1hdHJpeFVuc3BlY2lmaWVkOworICAgIHN0YXR1cyA9IENvbG9yVXRpbHM6OnVud3JhcENvbG9yQXNwZWN0c0Zyb21Db2xvclN0YW5kYXJkKENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkVmVuZG9yU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnByaW1hcmllcywgJm1hdHJpeENvZWZmcyk7CisgICAgRVhQRUNUX0VRKHN0YXR1cywgT0spIDw8ICJ1bndyYXBwaW5nIGFzcGVjdHMgZnJvbSBjb2xvciBzdGFuZGFyZCBmYWlsZWQiOworCisgICAgcHJpbWFyaWVzID0gQ0E6OlByaW1hcmllc1Vuc3BlY2lmaWVkOworICAgIG1hdHJpeENvZWZmcyA9IENBOjpNYXRyaXhVbnNwZWNpZmllZDsKKyAgICBzdGF0dXMgPSBDb2xvclV0aWxzOjp1bndyYXBDb2xvckFzcGVjdHNGcm9tQ29sb3JTdGFuZGFyZCgKKyAgICAgICAgICAgIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkVmVuZG9yU3RhcnQgKiA0LCAmcHJpbWFyaWVzLCAmbWF0cml4Q29lZmZzKTsKKyAgICBFWFBFQ1RfTkUoc3RhdHVzLCBPSykgPDwgInVud3JhcHBpbmcgYXNwZWN0cyBmcm9tIGNvbG9yIHN0YW5kYXJkIGZhaWxlZCI7CisKKyAgICBjb2xvclJhbmdlID0gQ29sb3JVdGlsczo6d3JhcENvbG9yQXNwZWN0c0ludG9Db2xvclJhbmdlKChDQTo6UmFuZ2UpKENBOjpSYW5nZU90aGVyICsgMSkpOworICAgIEVYUEVDVF9FUShjb2xvclJhbmdlLCBDb2xvclV0aWxzOjprQ29sb3JSYW5nZVVuc3BlY2lmaWVkKSA8PCAiZXhwZWN0ZWQgdW5zcGVjaWZpZWQgY29sb3IgcmFuZ2UiOworCisgICAgQ0E6OlJhbmdlIHJhbmdlOworICAgIHN0YXR1cyA9IENvbG9yVXRpbHM6OnVud3JhcENvbG9yQXNwZWN0c0Zyb21Db2xvclJhbmdlKAorICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yUmFuZ2VWZW5kb3JTdGFydCArIENBOjpSYW5nZU90aGVyICsgMSwgJnJhbmdlKTsKKyAgICBFWFBFQ1RfTkUoc3RhdHVzLCBPSykgPDwgImludmFsaWQgcmFuZ2UgdmFsdWUgYWNjZXB0ZWQiOworICAgIEVYUEVDVF9FUShyYW5nZSwgQ0E6OlJhbmdlT3RoZXIpIDw8ICJyZXR1cm5lZCB1bmV4cGVjdGVkIHJhbmdlIHZhbHVlIjsKKworICAgIGNvbG9yVHJhbnNmZXIgPQorICAgICAgICAgICAgQ29sb3JVdGlsczo6d3JhcENvbG9yQXNwZWN0c0ludG9Db2xvclRyYW5zZmVyKChDQTo6VHJhbnNmZXIpKENBOjpUcmFuc2Zlck90aGVyICsgMSkpOworICAgIEVYUEVDVF9FUShjb2xvclRyYW5zZmVyLCBDb2xvclV0aWxzOjprQ29sb3JUcmFuc2ZlclVuc3BlY2lmaWVkKQorICAgICAgICAgICAgPDwgImV4cGVjdGVkIHVuc3BlY2lmaWVkIGNvbG9yIHRyYW5zZmVyIjsKKworICAgIENBOjpUcmFuc2ZlciB0cmFuc2ZlcjsKKyAgICBzdGF0dXMgPSBDb2xvclV0aWxzOjp1bndyYXBDb2xvckFzcGVjdHNGcm9tQ29sb3JUcmFuc2ZlcigKKyAgICAgICAgICAgIENvbG9yVXRpbHM6OmtDb2xvclRyYW5zZmVyVmVuZG9yU3RhcnQgKyBDQTo6VHJhbnNmZXJPdGhlciArIDEsICZ0cmFuc2Zlcik7CisgICAgRVhQRUNUX05FKHN0YXR1cywgT0spIDw8ICJpbnZhbGlkIHRyYW5zZmVyIHZhbHVlIGFjY2VwdGVkIjsKKyAgICBFWFBFQ1RfRVEodHJhbnNmZXIsIENBOjpUcmFuc2Zlck90aGVyKSA8PCAiZXhwZWN0ZWQgb3RoZXIgY29sb3IgdHJhbnNmZXIiOworfQorCitURVNUKENvbG9yVXRpbHNVbml0VGVzdCwgSERSSW5mb1Nhbml0eVRlc3QpIHsKKyAgICBIRFJTdGF0aWNJbmZvIGhkckluZm87CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOworICAgIEFTU0VSVF9ORShmb3JtYXQsIG51bGxwdHIpIDw8ICJmYWlsZWQgdG8gY3JlYXRlIEFNZXNzYWdlIjsKKworICAgIGJvb2wgYm9vbFN0YXR1cyA9IENvbG9yVXRpbHM6OmdldEhEUlN0YXRpY0luZm9Gcm9tRm9ybWF0KGZvcm1hdCwgJmhkckluZm8pOworICAgIEVYUEVDVF9GQUxTRShib29sU3RhdHVzKSA8PCAiSERSU3RhdGljSW5mbyBzaG91bGQgbm90IGJlIHByZXNlbnQiOworCisgICAgc3A8QUJ1ZmZlcj4gaW52YWxpZFNpemVIRFJJbmZvQnVmZmVyID0gbmV3IEFCdWZmZXIoa0hEUkJ1ZmZlclNpemUgLSAxKTsKKyAgICBBU1NFUlRfTkUoaW52YWxpZFNpemVIRFJJbmZvQnVmZmVyLCBudWxscHRyKSA8PCAiZmFpbGVkIHRvIGNyZWF0ZSBBQnVmZmVyIjsKKyAgICBmb3JtYXQtPnNldEJ1ZmZlcihLRVlfSERSX1NUQVRJQ19JTkZPLCBpbnZhbGlkU2l6ZUhEUkluZm9CdWZmZXIpOworICAgIG1lbXNldCgmaGRySW5mbywgMCwgc2l6ZW9mKGhkckluZm8pKTsKKyAgICBib29sU3RhdHVzID0gQ29sb3JVdGlsczo6Z2V0SERSU3RhdGljSW5mb0Zyb21Gb3JtYXQoZm9ybWF0LCAmaGRySW5mbyk7CisgICAgRVhQRUNUX0ZBTFNFKGJvb2xTdGF0dXMpIDw8ICJpbmNvcnJlY3QgSERSU3RhdGljSW5mbyBidWZmZXIgYWNjZXB0ZWQiOworCisgICAgc3A8QUJ1ZmZlcj4gaW52YWxpZEhEUkluZm9CdWZmZXIgPSBuZXcgQUJ1ZmZlcihrSERSQnVmZmVyU2l6ZSk7CisgICAgQVNTRVJUX05FKGludmFsaWRIRFJJbmZvQnVmZmVyLCBudWxscHRyKSA8PCAiZmFpbGVkIHRvIGNyZWF0ZSBBQnVmZmVyIjsKKyAgICB1aW50OF90ICpkYXRhID0gaW52YWxpZEhEUkluZm9CdWZmZXItPmRhdGEoKTsKKyAgICAqZGF0YSA9IEhEUlN0YXRpY0luZm86OmtUeXBlMSArIDE7CisgICAgZm9ybWF0LT5zZXRCdWZmZXIoS0VZX0hEUl9TVEFUSUNfSU5GTywgaW52YWxpZEhEUkluZm9CdWZmZXIpOworICAgIG1lbXNldCgmaGRySW5mbywgMCwgc2l6ZW9mKGhkckluZm8pKTsKKyAgICBib29sU3RhdHVzID0gQ29sb3JVdGlsczo6Z2V0SERSU3RhdGljSW5mb0Zyb21Gb3JtYXQoZm9ybWF0LCAmaGRySW5mbyk7CisgICAgRVhQRUNUX0ZBTFNFKGJvb2xTdGF0dXMpIDw8ICJpbmNvcnJlY3QgSERSU3RhdGljSW5mbyBidWZmZXIgYWNjZXB0ZWQiOworCisgICAgQ0EgYXNwZWN0czsKKyAgICBmb3JtYXQtPnNldEludDMyKEtFWV9DT0xPUl9SQU5HRSwgQ29sb3JVdGlsczo6a0NvbG9yUmFuZ2VWZW5kb3JTdGFydCArIENBOjpSYW5nZU90aGVyICsgMSk7CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfU1RBTkRBUkQsIENBOjpTdGFuZGFyZDo6U3RhbmRhcmRCVDcwOSk7CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfVFJBTlNGRVIsIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJMaW5lYXIpOworICAgIENvbG9yVXRpbHM6OmdldENvbG9yQXNwZWN0c0Zyb21Gb3JtYXQoZm9ybWF0LCBhc3BlY3RzKTsKKyAgICBFWFBFQ1RfRVEoYXNwZWN0cy5tUmFuZ2UsIENBOjpSYW5nZU90aGVyKSA8PCAidW5leHBlY3RlZCByYW5nZSI7Cit9CisKK1RFU1QoQ29sb3JVdGlsc1VuaXRUZXN0LCBEYXRhU3BhY2VTYW5pdHlUZXN0KSB7CisgICAgQ0EgYXNwZWN0czsKKyAgICBhc3BlY3RzLm1SYW5nZSA9IENBOjpSYW5nZVVuc3BlY2lmaWVkOworICAgIGFzcGVjdHMubVByaW1hcmllcyA9IENBOjpQcmltYXJpZXNVbnNwZWNpZmllZDsKKyAgICBhc3BlY3RzLm1NYXRyaXhDb2VmZnMgPSBDQTo6TWF0cml4VW5zcGVjaWZpZWQ7CisgICAgYXNwZWN0cy5tVHJhbnNmZXIgPSBDQTo6VHJhbnNmZXJVbnNwZWNpZmllZDsKKyAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UgPSBDb2xvclV0aWxzOjpnZXREYXRhU3BhY2VGb3JDb2xvckFzcGVjdHMoYXNwZWN0cywgdHJ1ZSk7CisgICAgRVhQRUNUX0VRKGRhdGFTcGFjZSwgMCkgPDwgImV4cGVjdGVkIGludmFsaWQgZGF0YXNwYWNlIjsKKyAgICBhc3BlY3RzLm1QcmltYXJpZXMgPSBDQTo6UHJpbWFyaWVzVW5zcGVjaWZpZWQ7CisgICAgYXNwZWN0cy5tTWF0cml4Q29lZmZzID0gQ0E6Ok1hdHJpeEJUMjAyMENvbnN0YW50OworICAgIGRhdGFTcGFjZSA9IENvbG9yVXRpbHM6OmdldERhdGFTcGFjZUZvckNvbG9yQXNwZWN0cyhhc3BlY3RzLCB0cnVlKTsKKyAgICBFWFBFQ1RfTkUoZGF0YVNwYWNlLCAwKSA8PCAidW5leHBlY3RlZCB2YWx1ZSI7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChDb2xvclV0aWxzVW5pdFRlc3QsIENvbG9yUmFuZ2VUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29sb3JSYW5nZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlJhbmdlOjpSYW5nZUxpbWl0ZWQsIENBOjpSYW5nZTo6UmFuZ2VGdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlJhbmdlOjpSYW5nZVVuc3BlY2lmaWVkLCBDQTo6UmFuZ2U6OlJhbmdlT3RoZXIpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKENvbG9yVXRpbHNVbml0VGVzdCwgQ29sb3JUcmFuc2ZlclRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb2xvclRyYW5zZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyVW5zcGVjaWZpZWQsIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJMaW5lYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU1JHQiwgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMTcwTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJHYW1tYTIyLCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyR2FtbWEyOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJTVDIwODQsIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJITEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU01QVEUyNDBNLCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyWHZZQ0MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyQlQxMzYxLCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU1Q0MjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyT3RoZXIpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBDb2xvclV0aWxzVW5pdFRlc3QsIENvbG9yU3RhbmRhcmRUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICAvLyBQcmltYXJpZXMsIE1hdHJpeENvZWZmcworICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKENBOjpQcmltYXJpZXM6OlByaW1hcmllc1Vuc3BlY2lmaWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeFVuc3BlY2lmaWVkKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDcwOV81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUNzA5XzUpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNjAxXzZfNjI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUNjAxXzYpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNjAxXzZfNjI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUNzA5XzUpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNjAxXzZfNTI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUNjAxXzYpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNjAxXzZfNTI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeFNNUFRFMjQwTSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQyMDIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUMjAyMCksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQyMDIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUMjAyMENvbnN0YW50KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDQ3MF82TSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDQ3MF82TSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzR2VuZXJpY0ZpbG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQyMDIwKSkpOworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIENvbG9yVXRpbHNVbml0VGVzdCwgQ29sb3JBc3BlY3RzVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgLy8gUHJpbWFyaWVzLCBDb2xvclRyYW5zZmVyLCBNYXRyaXhDb2VmZnMsIENvbG9yUmFuZ2UsIENvbG9yU3RhbmRhcmQKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzVW5zcGVjaWZpZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJVbnNwZWNpZmllZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4VW5zcGVjaWZpZWQsIENBOjpSYW5nZTo6UmFuZ2VGdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6U3RhbmRhcmQ6OlN0YW5kYXJkVW5zcGVjaWZpZWQpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDcwOV81LCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyTGluZWFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDcwOV81LCBDQTo6UmFuZ2U6OlJhbmdlRnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlN0YW5kYXJkOjpTdGFuZGFyZEJUNzA5KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ2MDFfNl82MjUsIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJTUkdCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDYwMV82LCBDQTo6UmFuZ2U6OlJhbmdlRnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlN0YW5kYXJkOjpTdGFuZGFyZFVuc3BlY2lmaWVkKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ2MDFfNl82MjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJTTVBURTE3ME0sIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUNzA5XzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpSYW5nZTo6UmFuZ2VGdWxsLCBDQTo6U3RhbmRhcmQ6OlN0YW5kYXJkVW5zcGVjaWZpZWQpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzUyNSwgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckdhbW1hMjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUNjAxXzYsIENBOjpSYW5nZTo6UmFuZ2VGdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6U3RhbmRhcmQ6OlN0YW5kYXJkVW5zcGVjaWZpZWQpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzUyNSwgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlckdhbW1hMjgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeFNNUFRFMjQwTSwgQ0E6OlJhbmdlOjpSYW5nZUZ1bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpTdGFuZGFyZDo6U3RhbmRhcmRCVDQ3ME0pLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDIwMjAsIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJTVDIwODQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUMjAyMCwgQ0E6OlJhbmdlOjpSYW5nZUZ1bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpTdGFuZGFyZDo6U3RhbmRhcmRCVDYwMV81MjUpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDIwMjAsIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJITEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUMjAyMENvbnN0YW50LCBDQTo6UmFuZ2U6OlJhbmdlRnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlN0YW5kYXJkOjpTdGFuZGFyZEJUNjAxXzUyNSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNDcwXzZNLCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyTGluZWFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDQ3MF82TSwgQ0E6OlJhbmdlOjpSYW5nZUZ1bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpTdGFuZGFyZDo6U3RhbmRhcmRVbnNwZWNpZmllZCksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpQcmltYXJpZXM6OlByaW1hcmllc0dlbmVyaWNGaWxtLCBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyTGluZWFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDIwMjAsIENBOjpSYW5nZTo6UmFuZ2VGdWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6U3RhbmRhcmQ6OlN0YW5kYXJkQlQ2MDFfNjI1KSkpOworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIENvbG9yVXRpbHNVbml0VGVzdCwgSXNvVG9QbGF0Zm9ybUFzcGVjdHNUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICAvLyBQcmltYXJpZXMsIFRyYW5zZmVyLCBNYXRyaXhDb2VmZnMsIFN0YW5kYXJkLCBUcmFuc2ZlcgorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzVW5zcGVjaWZpZWQsIENBOjpUcmFuc2ZlclVuc3BlY2lmaWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4VW5zcGVjaWZpZWQsIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkVW5zcGVjaWZpZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yVXRpbHM6OmtDb2xvclRyYW5zZmVyVW5zcGVjaWZpZWQpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzQlQ3MDlfNSwgQ0E6OlRyYW5zZmVyTGluZWFyLCBDQTo6TWF0cml4QlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDcwOSwgQ29sb3JVdGlsczo6a0NvbG9yVHJhbnNmZXJMaW5lYXIpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzQlQ2MDFfNl82MjUsIENBOjpUcmFuc2ZlclNSR0IsIENBOjpNYXRyaXhCVDYwMV82LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEJUNjAxXzYyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yVHJhbnNmZXJTUkdCKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllc0JUNjAxXzZfNjI1LCBDQTo6VHJhbnNmZXJTTVBURTE3ME0sIENBOjpNYXRyaXhCVDcwOV81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEJUNjAxXzYyNV9VbmFkanVzdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjprQ29sb3JUcmFuc2ZlclNNUFRFXzE3ME0pLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzQlQ2MDFfNl81MjUsIENBOjpUcmFuc2ZlckdhbW1hMjIsIENBOjpNYXRyaXhCVDYwMV82LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEJUNjAxXzUyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yVHJhbnNmZXJHYW1tYTIyKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlByaW1hcmllc0JUNjAxXzZfNTI1LCBDQTo6VHJhbnNmZXJHYW1tYTI4LCBDQTo6TWF0cml4U01QVEUyNDBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEJUNjAxXzUyNV9VbmFkanVzdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjprQ29sb3JUcmFuc2ZlckdhbW1hMjgpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzQlQyMDIwLCBDQTo6VHJhbnNmZXJTVDIwODQsIENBOjpNYXRyaXhCVDIwMjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQyMDIwLCBDb2xvclV0aWxzOjprQ29sb3JUcmFuc2ZlclNUMjA4NCksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpQcmltYXJpZXNCVDIwMjAsIENBOjpUcmFuc2ZlckhMRywgQ0E6Ok1hdHJpeEJUMjAyMENvbnN0YW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEJUMjAyMENvbnN0YW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjprQ29sb3JUcmFuc2ZlckhMRyksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpQcmltYXJpZXNCVDQ3MF82TSwgQ0E6OlRyYW5zZmVyVW5zcGVjaWZpZWQsIENBOjpNYXRyaXhCVDQ3MF82TSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDQ3ME0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbG9yVXRpbHM6OmtDb2xvclRyYW5zZmVyVW5zcGVjaWZpZWQpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UHJpbWFyaWVzR2VuZXJpY0ZpbG0sIENBOjpUcmFuc2ZlckxpbmVhciwgQ0E6Ok1hdHJpeEJUMjAyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRGaWxtLCBDb2xvclV0aWxzOjprQ29sb3JUcmFuc2ZlckxpbmVhcikpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBDb2xvclV0aWxzVW5pdFRlc3QsIERlZmF1bHRDb2xvckFzcGVjdHNUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICAvLyBXaWR0aCwgSGVpZ2h0LCBQcmltYXJpZXMsIE1hdHJpeENvZWZmcworICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZSgzODQwLCAzODQwLCBDQTo6UHJpbWFyaWVzQlQyMDIwLCBDQTo6TWF0cml4QlQyMDIwKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoNzIwLCA1NzYsIENBOjpQcmltYXJpZXNCVDYwMV82XzYyNSwgQ0E6Ok1hdHJpeEJUNjAxXzYpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZSg0ODAsIDM2MCwgQ0E6OlByaW1hcmllc0JUNjAxXzZfNTI1LCBDQTo6TWF0cml4QlQ2MDFfNiksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKDQ4MCwgMTkyMCwgQ0E6OlByaW1hcmllc0JUNzA5XzUsIENBOjpNYXRyaXhCVDcwOV81KSkpOworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIENvbG9yVXRpbHNVbml0VGVzdCwgRGF0YVNwYWNlVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgLy8gQ29sb3JSYW5nZSwgUHJpbWFyaWVzLCBDb2xvclRyYW5zZmVyLCBNYXRyaXhDb2VmZnMsIHYwX2FuZHJvaWRfZGF0YXNwYWNlLAorICAgICAgICAgICAgICAgIC8vIGFuZHJvaWRfZGF0YXNwYWNlCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpSYW5nZTo6UmFuZ2VGdWxsLCBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDcwOV81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU1JHQiwgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9WMF9TUkdCLCBIQUxfREFUQVNQQUNFX1NSR0IpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UmFuZ2U6OlJhbmdlTGltaXRlZCwgQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMTcwTSwgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9WMF9CVDcwOSwgSEFMX0RBVEFTUEFDRV9CVDcwOSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpSYW5nZTo6UmFuZ2VGdWxsLCBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDcwOV81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyTGluZWFyLCBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDcwOV81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfREFUQVNQQUNFX1YwX1NSR0JfTElORUFSLCBIQUxfREFUQVNQQUNFX1NSR0JfTElORUFSKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlJhbmdlOjpSYW5nZUxpbWl0ZWQsIENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNjAxXzZfNTI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU01QVEUxNzBNLCBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDYwMV82LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfREFUQVNQQUNFX1YwX0JUNjAxXzUyNSwgSEFMX0RBVEFTUEFDRV9CVDYwMV81MjUpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UmFuZ2U6OlJhbmdlTGltaXRlZCwgQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ2MDFfNl82MjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJTTVBURTE3ME0sIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUNjAxXzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVjBfQlQ2MDFfNjI1LCBIQUxfREFUQVNQQUNFX0JUNjAxXzYyNSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpSYW5nZTo6UmFuZ2VGdWxsLCBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDYwMV82XzYyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMTcwTSwgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ2MDFfNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9WMF9KRklGLCBIQUxfREFUQVNQQUNFX0pGSUYpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UmFuZ2U6OlJhbmdlTGltaXRlZCwgQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMTcwTSwgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4QlQ0NzBfNk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfVjBfQlQ2MDFfNjI1LCBIQUxfREFUQVNQQUNFX0JUNjAxXzYyNSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpSYW5nZTo6UmFuZ2VMaW1pdGVkLCBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDcwOV81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU01QVEUxNzBNLCBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDYwMV82LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfREFUQVNQQUNFX1YwX0JUNjAxXzYyNSwgSEFMX0RBVEFTUEFDRV9CVDYwMV82MjUpLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV90dXBsZShDQTo6UmFuZ2U6OlJhbmdlTGltaXRlZCwgQ0E6OlByaW1hcmllczo6UHJpbWFyaWVzQlQ3MDlfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0E6OlRyYW5zZmVyOjpUcmFuc2ZlclNNUFRFMTcwTSwgQ0E6Ok1hdHJpeENvZWZmczo6TWF0cml4U01QVEUyNDBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQUxfREFUQVNQQUNFX1YwX0JUNzA5LCBIQUxfREFUQVNQQUNFX0JUNzA5KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlJhbmdlOjpSYW5nZUxpbWl0ZWQsIENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNzA5XzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBOjpUcmFuc2Zlcjo6VHJhbnNmZXJTTVBURTE3ME0sIENBOjpNYXRyaXhDb2VmZnM6Ok1hdHJpeEJUMjAyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9WMF9CVDcwOSwgSEFMX0RBVEFTUEFDRV9CVDcwOSksCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3R1cGxlKENBOjpSYW5nZTo6UmFuZ2VMaW1pdGVkLCBDQTo6UHJpbWFyaWVzOjpQcmltYXJpZXNCVDcwOV81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU01QVEUxNzBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDIwMjBDb25zdGFudCwgSEFMX0RBVEFTUEFDRV9WMF9CVDYwMV81MjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfQlQ2MDFfNTI1KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlJhbmdlOjpSYW5nZUxpbWl0ZWQsIENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNjAxXzZfNjI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU01QVEUxNzBNLCBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDQ3MF82TSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9WMF9CVDYwMV82MjUsIEhBTF9EQVRBU1BBQ0VfQlQ2MDFfNjI1KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlJhbmdlOjpSYW5nZUxpbWl0ZWQsIENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNjAxXzZfNjI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU01QVEUxNzBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDIwMjBDb25zdGFudCwgSEFMX0RBVEFTUEFDRV9WMF9CVDYwMV81MjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfQlQ2MDFfNTI1KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlJhbmdlOjpSYW5nZUxpbWl0ZWQsIENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNjAxXzZfNTI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU01QVEUxNzBNLCBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDQ3MF82TSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9WMF9CVDYwMV81MjUsIEhBTF9EQVRBU1BBQ0VfQlQ2MDFfNTI1KSwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdHVwbGUoQ0E6OlJhbmdlOjpSYW5nZUxpbWl0ZWQsIENBOjpQcmltYXJpZXM6OlByaW1hcmllc0JUNjAxXzZfNTI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6VHJhbnNmZXI6OlRyYW5zZmVyU01QVEUxNzBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQTo6TWF0cml4Q29lZmZzOjpNYXRyaXhCVDIwMjBDb25zdGFudCwgSEFMX0RBVEFTUEFDRV9WMF9CVDYwMV81MjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTF9EQVRBU1BBQ0VfQlQ2MDFfNTI1KSkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5icAppbmRleCBkYjM3ZmU5Li5lMzQ1MDRkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5icApAQCAtNSw3ICs1LDkgQEAKICAgICBzcmNzOiBbIklEMy5jcHAiXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhX2RhdGFzb3VyY2VfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2hlYWRlcnMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCiAgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgXSwKIApAQCAtMTksNiArMjEsMTIgQEAKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAogICAgIH0sCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKIH0KIAogLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvdGVzdC9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvdGVzdC9BbmRyb2lkVGVzdC54bWwKaW5kZXggNmM2Njk3ZC4uZDZlYTQ3MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3QvQW5kcm9pZFRlc3QueG1sCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0L0FuZHJvaWRUZXN0LnhtbApAQCAtMTksNyArMTksNyBAQAogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJJRDNUZXN0LT4vZGF0YS9sb2NhbC90bXAvSUQzVGVzdCIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiCi0gICAgICAgICAgICBrZXk9Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3QvSUQzVGVzdC56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvdGVzdC9JRDNUZXN0LTEuMS56aXA/dW56aXA9dHJ1ZSIKICAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvSUQzVGVzdFJlcy8iIC8+CiAgICAgPC90YXJnZXRfcHJlcGFyZXI+CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0L0lEM1Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3QvSUQzVGVzdC5jcHAKaW5kZXggY2Q1Y2Q5ZS4uOGRiODNjYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3QvSUQzVGVzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3QvSUQzVGVzdC5jcHAKQEAgLTUxLDcgKzUxLDcgQEAKICAgICB3aGlsZSAoIWl0LmRvbmUoKSkgewogICAgICAgICBTdHJpbmc4IGlkOwogICAgICAgICBpdC5nZXRJRCgmaWQpOwotICAgICAgICBBU1NFUlRfR1QoaWQubGVuZ3RoKCksIDApIDw8ICJObyBJRCB0YWcgZm91bmQhIFxuIjsKKyAgICAgICAgQVNTRVJUX0dUKGlkLmxlbmd0aCgpLCAwKSA8PCAiRm91bmQgYW4gSUQzIHRhZyBvZiAwIHNpemUiOwogICAgICAgICBBTE9HVigiRm91bmQgSUQgdGFnOiAlc1xuIiwgU3RyaW5nOChpZCkuY19zdHIoKSk7CiAgICAgICAgIGl0Lm5leHQoKTsKICAgICB9CkBAIC02Niw4ICs2Niw4IEBACiAgICAgRGF0YVNvdXJjZUhlbHBlciBoZWxwZXIoZmlsZS0+d3JhcCgpKTsKICAgICBJRDMgdGFnKCZoZWxwZXIpOwogICAgIEFTU0VSVF9UUlVFKHRhZy5pc1ZhbGlkKCkpIDw8ICJObyB2YWxpZCBJRDMgdGFnIGZvdW5kIGZvciAiIDw8IHBhdGguY19zdHIoKSA8PCAiXG4iOwotICAgIEFTU0VSVF9UUlVFKHRhZy52ZXJzaW9uKCkgPj0gdmVyc2lvbk51bWJlcikKLSAgICAgICAgICAgIDw8ICJFeHBlY3RlZCB2ZXJzaW9uOiAiIDw8IHRhZy52ZXJzaW9uKCkgPDwgIiBGb3VuZCB2ZXJzaW9uOiAiIDw8IHZlcnNpb25OdW1iZXI7CisgICAgQVNTRVJUX0VRKHRhZy52ZXJzaW9uKCksIHZlcnNpb25OdW1iZXIpCisgICAgICAgICAgICA8PCAiRm91bmQgdmVyc2lvbjogIiA8PCB0YWcudmVyc2lvbigpIDw8ICIgRXhwZWN0ZWQgdmVyc2lvbjogIiA8PCB2ZXJzaW9uTnVtYmVyOwogfQogCiBURVNUX1AoSUQzdGV4dFRhZ1Rlc3QsIFRleHRUYWdUZXN0KSB7CkBAIC04MSwxNyArODEsMzQgQEAKICAgICBBU1NFUlRfVFJVRSh0YWcuaXNWYWxpZCgpKSA8PCAiTm8gdmFsaWQgSUQzIHRhZyBmb3VuZCBmb3IgIiA8PCBwYXRoLmNfc3RyKCkgPDwgIlxuIjsKICAgICBpbnQgY291bnRUZXh0RnJhbWVzID0gMDsKICAgICBJRDM6Okl0ZXJhdG9yIGl0KHRhZywgbnVsbHB0cik7Ci0gICAgd2hpbGUgKCFpdC5kb25lKCkpIHsKLSAgICAgICAgU3RyaW5nOCBpZDsKLSAgICAgICAgaXQuZ2V0SUQoJmlkKTsKLSAgICAgICAgQVNTRVJUX0dUKGlkLmxlbmd0aCgpLCAwKTsKLSAgICAgICAgaWYgKGlkWzBdID09ICdUJykgewotICAgICAgICAgICAgU3RyaW5nOCB0ZXh0OwotICAgICAgICAgICAgY291bnRUZXh0RnJhbWVzKys7Ci0gICAgICAgICAgICBpdC5nZXRTdHJpbmcoJnRleHQpOwotICAgICAgICAgICAgQUxPR1YoIkZvdW5kIHRleHQgZnJhbWUgJXMgOiAlcyBcbiIsIGlkLnN0cmluZygpLCB0ZXh0LnN0cmluZygpKTsKKyAgICBpZiAodGFnLnZlcnNpb24oKSAhPSBJRDM6OklEM19WMSAmJiB0YWcudmVyc2lvbigpICE9IElEMzo6SUQzX1YxXzEpIHsKKyAgICAgICAgd2hpbGUgKCFpdC5kb25lKCkpIHsKKyAgICAgICAgICAgIFN0cmluZzggaWQ7CisgICAgICAgICAgICBpdC5nZXRJRCgmaWQpOworICAgICAgICAgICAgQVNTRVJUX0dUKGlkLmxlbmd0aCgpLCAwKSA8PCAiRm91bmQgYW4gSUQzIHRhZyBvZiAwIHNpemUiOworICAgICAgICAgICAgaWYgKGlkWzBdID09ICdUJykgeworICAgICAgICAgICAgICAgIFN0cmluZzggdGV4dDsKKyAgICAgICAgICAgICAgICBjb3VudFRleHRGcmFtZXMrKzsKKyAgICAgICAgICAgICAgICBpdC5nZXRTdHJpbmcoJnRleHQpOworICAgICAgICAgICAgICAgIEFMT0dWKCJGb3VuZCB0ZXh0IGZyYW1lICVzIDogJXMgXG4iLCBpZC5zdHJpbmcoKSwgdGV4dC5zdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpdC5uZXh0KCk7CiAgICAgICAgIH0KLSAgICAgICAgaXQubmV4dCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIHdoaWxlICghaXQuZG9uZSgpKSB7CisgICAgICAgICAgICBTdHJpbmc4IGlkOworICAgICAgICAgICAgU3RyaW5nOCB0ZXh0OworICAgICAgICAgICAgaXQuZ2V0SUQoJmlkKTsKKyAgICAgICAgICAgIEFTU0VSVF9HVChpZC5sZW5ndGgoKSwgMCkgPDwgIkZvdW5kIGFuIElEMyB0YWcgb2YgMCBzaXplIjsKKyAgICAgICAgICAgIGl0LmdldFN0cmluZygmdGV4dCk7CisgICAgICAgICAgICAvLyBpZiB0aGUgdGFnIGhhcyBhIHZhbHVlCisgICAgICAgICAgICBpZiAoc3RyY21wKHRleHQuc3RyaW5nKCksICIiKSkgeworICAgICAgICAgICAgICAgIGNvdW50VGV4dEZyYW1lcysrOworICAgICAgICAgICAgICAgIEFMT0dWKCJJRDogJXNcbiIsIGlkLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIEFMT0dWKCJUZXh0IHN0cmluZzogJXNcbiIsIHRleHQuc3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaXQubmV4dCgpOworICAgICAgICB9CiAgICAgfQogICAgIEFTU0VSVF9FUShjb3VudFRleHRGcmFtZXMsIG51bVRleHRGcmFtZXMpCiAgICAgICAgICAgICA8PCAiRXhwZWN0ZWQgIiA8PCBudW1UZXh0RnJhbWVzIDw8ICIgdGV4dCBmcmFtZXMsIGZvdW5kICIgPDwgY291bnRUZXh0RnJhbWVzOwpAQCAtMTE0LDcgKzEzMSw3IEBACiAgICAgICAgIGlmIChkYXRhKSB7CiAgICAgICAgICAgICBBTE9HVigiRm91bmQgYWxidW0gYXJ0OiBzaXplID0gJXp1IG1pbWUgPSAlcyBcbiIsIGRhdGFTaXplLCBtaW1lLnN0cmluZygpKTsKICAgICAgICAgfQotICAgICAgICBBU1NFUlRfTkUoZGF0YSwgbnVsbHB0cikgPDwgIkV4cGVjdGVkIGFsYnVtIGFydCwgZm91bmQgbm9uZSEiIDw8IHBhdGg7CisgICAgICAgIEFTU0VSVF9ORShkYXRhLCBudWxscHRyKSA8PCAiRXhwZWN0ZWQgYWxidW0gYXJ0LCBmb3VuZCBub25lISAiIDw8IHBhdGg7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQVNTRVJUX0VRKGRhdGEsIG51bGxwdHIpIDw8ICJGb3VuZCBhbGJ1bSBhcnQgd2hlbiBleHBlY3RlZCBub25lISI7CiAgICAgfQpAQCAtMTM3LDcgKzE1NCw3IEBACiAgICAgd2hpbGUgKCFpdC5kb25lKCkpIHsKICAgICAgICAgU3RyaW5nOCBpZDsKICAgICAgICAgaXQuZ2V0SUQoJmlkKTsKLSAgICAgICAgQVNTRVJUX0dUKGlkLmxlbmd0aCgpLCAwKTsKKyAgICAgICAgQVNTRVJUX0dUKGlkLmxlbmd0aCgpLCAwKSA8PCAiRm91bmQgYW4gSUQzIHRhZyBvZiAwIHNpemUiOwogICAgICAgICAvLyBDaGVjayBpZiB0aGUgdGFnIGlzIGFuICJBUElDL1BJQyIgdGFnLgogICAgICAgICBpZiAoU3RyaW5nOChpZCkgPT0gIkFQSUMiIHx8IFN0cmluZzgoaWQpID09ICJQSUMiKSB7CiAgICAgICAgICAgICBjb3VudCsrOwpAQCAtMTUwLDcgKzE2Nyw3IEBACiAgICAgICAgICAgICAgICAgaGV4ZHVtcChkYXRhLCBkYXRhU2l6ZSA+IDEyOCA/IDEyOCA6IGRhdGFTaXplKTsKICNlbmRpZgogICAgICAgICAgICAgfQotICAgICAgICAgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpIDw8ICJFeHBlY3RlZCBhbGJ1bSBhcnQsIGZvdW5kIG5vbmUhIiA8PCBwYXRoOworICAgICAgICAgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpIDw8ICJFeHBlY3RlZCBhbGJ1bSBhcnQsIGZvdW5kIG5vbmUhICIgPDwgcGF0aDsKICAgICAgICAgfQogICAgICAgICBpdC5uZXh0KCk7CiAgICAgfQpAQCAtMTU5LDU2ICsxNzYsNjcgQEAKIH0KIAogSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKGlkM1Rlc3RBbGwsIElEM3RhZ1Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM18zMHNlYy5tcDMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWNfMV9pbWFnZS5tcDMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWNfMl9pbWFnZS5tcDMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfNW1pbnMubXAzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zXzFfaW1hZ2UubXAzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zXzJfaW1hZ2UubXAzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zX2xhcmdlU2l6ZS5tcDMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWNfbW9yZVRleHRGcmFtZXMubXAzIikpOworICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKCJiYmJfMXNlY192MjMubXAzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiXzFzZWNfMV9pbWFnZS5tcDMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYmJfMXNlY18yX2ltYWdlLm1wMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJiYl8yc2VjX3YyNC5tcDMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYmJfMnNlY18xX2ltYWdlLm1wMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJiYl8yc2VjXzJfaW1hZ2UubXAzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiXzJzZWNfbGFyZ2VTaXplLm1wMyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJiYl8xc2VjX3YyM18zdGFncy5tcDMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYmJfMXNlY192MV81dGFncy5tcDMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYmJfMnNlY192MjRfdW5zeW5jaHJvbml6ZWRPbmVGcmFtZS5tcDMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYmJfMnNlY192MjRfdW5zeW5jaHJvbml6ZWRBbGxGcmFtZXMubXAzIikpOwogCiBJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCiAgICAgICAgIGlkM1Rlc3RBbGwsIElEM3ZlcnNpb25UZXN0LAotICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM18zMHNlYy5tcDMiLCA0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWNfMV9pbWFnZS5tcDMiLCA0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWNfMl9pbWFnZS5tcDMiLCA0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfNW1pbnMubXAzIiwgNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zXzFfaW1hZ2UubXAzIiwgNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zXzJfaW1hZ2UubXAzIiwgNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zX2xhcmdlU2l6ZS5tcDMiLCA0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWNfbW9yZVRleHRGcmFtZXMubXAzIiwgNCkpKTsKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV9wYWlyKCJiYmJfMXNlY192MjMubXAzIiwgSUQzOjpJRDNfVjJfMyksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzFzZWNfMV9pbWFnZS5tcDMiLCBJRDM6OklEM19WMl8zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMXNlY18yX2ltYWdlLm1wMyIsIElEMzo6SUQzX1YyXzMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8yc2VjX3YyNC5tcDMiLCBJRDM6OklEM19WMl80KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMnNlY18xX2ltYWdlLm1wMyIsIElEMzo6SUQzX1YyXzQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8yc2VjXzJfaW1hZ2UubXAzIiwgSUQzOjpJRDNfVjJfNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzJzZWNfbGFyZ2VTaXplLm1wMyIsIElEMzo6SUQzX1YyXzQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8xc2VjX3YyM18zdGFncy5tcDMiLCBJRDM6OklEM19WMl8zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMXNlY192MV81dGFncy5tcDMiLCBJRDM6OklEM19WMV8xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMXNlY192MV8zdGFncy5tcDMiLCBJRDM6OklEM19WMV8xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMnNlY192MjRfdW5zeW5jaHJvbml6ZWRPbmVGcmFtZS5tcDMiLCBJRDM6OklEM19WMl80KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMnNlY192MjRfdW5zeW5jaHJvbml6ZWRBbGxGcmFtZXMubXAzIiwgSUQzOjpJRDNfVjJfNCkpKTsKIAogSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAogICAgICAgICBpZDNUZXN0QWxsLCBJRDN0ZXh0VGFnVGVzdCwKLSAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWMubXAzIiwgMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjXzFfaW1hZ2UubXAzIiwgMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjXzJfaW1hZ2UubXAzIiwgMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zLm1wMyIsIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc18xX2ltYWdlLm1wMyIsIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc18yX2ltYWdlLm1wMyIsIDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc19sYXJnZVNpemUubXAzIiwgMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjX21vcmVUZXh0RnJhbWVzLm1wMyIsIDUpKSk7CisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzFzZWNfdjIzLm1wMyIsIDEpLAorICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzFzZWNfMV9pbWFnZS5tcDMiLCAxKSwKKyAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8xc2VjXzJfaW1hZ2UubXAzIiwgMSksCisgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMnNlY192MjQubXAzIiwgMSksCisgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMnNlY18xX2ltYWdlLm1wMyIsIDEpLAorICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzJzZWNfMl9pbWFnZS5tcDMiLCAxKSwKKyAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8yc2VjX2xhcmdlU2l6ZS5tcDMiLCAxKSwKKyAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8xc2VjX3YyM18zdGFncy5tcDMiLCAzKSwKKyAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8xc2VjX3YxXzV0YWdzLm1wMyIsIDUpLAorICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzFzZWNfdjFfM3RhZ3MubXAzIiwgMyksCisgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMnNlY192MjRfdW5zeW5jaHJvbml6ZWRPbmVGcmFtZS5tcDMiLCAzKSwKKyAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8yc2VjX3YyNF91bnN5bmNocm9uaXplZEFsbEZyYW1lcy5tcDMiLCAzKSkpOwogCi1JTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCi0gICAgICAgIGlkM1Rlc3RBbGwsIElEM2FsYnVtQXJ0VGVzdCwKLSAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWMubXAzIiwgZmFsc2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM18zMHNlY18xX2ltYWdlLm1wMyIsIHRydWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM18zMHNlY18yX2ltYWdlLm1wMyIsIHRydWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWlucy5tcDMiLCBmYWxzZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zXzFfaW1hZ2UubXAzIiwgdHJ1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zXzJfaW1hZ2UubXAzIiwgdHJ1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zX2xhcmdlU2l6ZS5tcDMiLCB0cnVlKSkpOworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKGlkM1Rlc3RBbGwsIElEM2FsYnVtQXJ0VGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3BhaXIoImJiYl8xc2VjX3YyMy5tcDMiLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMXNlY18xX2ltYWdlLm1wMyIsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzFzZWNfMl9pbWFnZS5tcDMiLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8yc2VjX3YyNC5tcDMiLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMnNlY18xX2ltYWdlLm1wMyIsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzJzZWNfMl9pbWFnZS5tcDMiLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8yc2VjX2xhcmdlU2l6ZS5tcDMiLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8xc2VjX3YxXzV0YWdzLm1wMyIsIGZhbHNlKSkpOwogCi1JTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCi0gICAgICAgIGlkM1Rlc3RBbGwsIElEM211bHRpQWxidW1BcnRUZXN0LAotICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM18zMHNlYy5tcDMiLCAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfNW1pbnMubXAzIiwgMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjXzFfaW1hZ2UubXAzIiwgMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zXzFfaW1hZ2UubXAzIiwgMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjXzJfaW1hZ2UubXAzIiwgMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zXzJfaW1hZ2UubXAzIiwgMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zX2xhcmdlU2l6ZS5tcDMiLCAzKSkpOworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKGlkM1Rlc3RBbGwsIElEM211bHRpQWxidW1BcnRUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfcGFpcigiYmJiXzFzZWNfdjIzLm1wMyIsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzJzZWNfdjI0Lm1wMyIsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzFzZWNfMV9pbWFnZS5tcDMiLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8yc2VjXzFfaW1hZ2UubXAzIiwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMXNlY18yX2ltYWdlLm1wMyIsIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzJzZWNfMl9pbWFnZS5tcDMiLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8yc2VjX2xhcmdlU2l6ZS5tcDMiLCAzKSkpOwogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKICAgICBnRW52ID0gbmV3IElEM1Rlc3RFbnZpcm9ubWVudCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKaW5kZXggODNlOTJiOS4uOGVmOTI3OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCkBAIC0xNDcsNiArMTQ3LDcgQEAKICAgICAgICAga1doYXRSZWxlYXNlQ29kZWNJbnN0YW5jZSAgICA9ICdyZWxDJywKICAgICAgICAga1doYXRGb3JjZVN0YXRlVHJhbnNpdGlvbiAgICA9ICdmc3R0JywKICAgICAgICAga1doYXRDaGVja0lmU3R1Y2sgICAgICAgICAgICA9ICdDc3RrJywKKyAgICAgICAga1doYXRTdWJtaXRFeHRyYU91dHB1dE1ldGFkYXRhQnVmZmVyID0gJ3NieG8nLAogICAgIH07CiAKICAgICBlbnVtIHsKQEAgLTI3Miw2ICsyNzMsNyBAQAogICAgIGJvb2wgbVNodXRkb3duSW5Qcm9ncmVzczsKICAgICBib29sIG1FeHBsaWNpdFNodXRkb3duOwogICAgIGJvb2wgbUlzTGVnYWN5VlA5RGVjb2RlcjsKKyAgICBib29sIG1Jc0xvd0xhdGVuY3k7CiAKICAgICAvLyBJZiAibUtlZXBDb21wb25lbnRBbGxvY2F0ZWQiIHdlIG9ubHkgdHJhbnNpdGlvbiBiYWNrIHRvIExvYWRlZCBzdGF0ZQogICAgIC8vIGFuZCBkbyBub3QgcmVsZWFzZSB0aGUgY29tcG9uZW50IGluc3RhbmNlLgpAQCAtNDk5LDYgKzUwMSw3IEBACiAgICAgc3RhdHVzX3Qgc2V0dXBBTVJDb2RlYyhib29sIGVuY29kZXIsIGJvb2wgaXNXQU1SLCBpbnQzMl90IGJpdFJhdGUpOwogICAgIHN0YXR1c190IHNldHVwRzcxMUNvZGVjKGJvb2wgZW5jb2RlciwgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IG51bUNoYW5uZWxzKTsKIAorICAgIHN0YXR1c190IHNldHVwT3B1c0NvZGVjKGJvb2wgZW5jb2RlciwgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IG51bUNoYW5uZWxzKTsKICAgICBzdGF0dXNfdCBzZXR1cEZsYWNDb2RlYygKICAgICAgICAgICAgIGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IGNvbXByZXNzaW9uTGV2ZWwsCiAgICAgICAgICAgICBBdWRpb0VuY29kaW5nIGVuY29kaW5nKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmgKaW5kZXggODA1NzMxMi4uODIzNjc3YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmgKQEAgLTM2Niw2ICszNjYsNyBAQAogICAgIEFTdHJpbmcgbU93bmVyTmFtZTsKICAgICBzcDxNZWRpYUNvZGVjSW5mbz4gbUNvZGVjSW5mbzsKICAgICBzcDxBUmVwbHlUb2tlbj4gbVJlcGx5SUQ7CisgICAgc3RkOjp2ZWN0b3I8c3A8QU1lc3NhZ2U+PiBtRGVmZXJyZWRNZXNzYWdlczsKICAgICB1aW50MzJfdCBtRmxhZ3M7CiAgICAgc3RhdHVzX3QgbVN0aWNreUVycm9yOwogICAgIHNwPFN1cmZhY2U+IG1TdXJmYWNlOwpAQCAtNDI4LDEzICs0MjksMTcgQEAKIAogICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJDaGFubmVsQmFzZT4gbUJ1ZmZlckNoYW5uZWw7CiAKLSAgICBNZWRpYUNvZGVjKGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsIHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKKyAgICBNZWRpYUNvZGVjKAorICAgICAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwgcGlkX3QgcGlkLCB1aWRfdCB1aWQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjQmFzZT4oY29uc3QgQVN0cmluZyAmLCBjb25zdCBjaGFyICopPiBnZXRDb2RlY0Jhc2UgPSBudWxscHRyLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxzdGF0dXNfdChjb25zdCBBU3RyaW5nICYsIHNwPE1lZGlhQ29kZWNJbmZvPiAqKT4gZ2V0Q29kZWNJbmZvID0gbnVsbHB0cik7CiAKICAgICBzdGF0aWMgc3A8Q29kZWNCYXNlPiBHZXRDb2RlY0Jhc2UoY29uc3QgQVN0cmluZyAmbmFtZSwgY29uc3QgY2hhciAqb3duZXIgPSBudWxscHRyKTsKIAogICAgIHN0YXRpYyBzdGF0dXNfdCBQb3N0QW5kQXdhaXRSZXNwb25zZSgKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBzcDxBTWVzc2FnZT4gKnJlc3BvbnNlKTsKIAorICAgIHZvaWQgUG9zdFJlcGx5V2l0aEVycm9yKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBpbnQzMl90IGVycik7CiAgICAgdm9pZCBQb3N0UmVwbHlXaXRoRXJyb3IoY29uc3Qgc3A8QVJlcGx5VG9rZW4+ICZyZXBseUlELCBpbnQzMl90IGVycik7CiAKICAgICBzdGF0dXNfdCBpbml0KGNvbnN0IEFTdHJpbmcgJm5hbWUpOwpAQCAtNDg2LDYgKzQ5MSw5IEBACiAgICAgYm9vbCBoYXNQZW5kaW5nQnVmZmVyKGludCBwb3J0SW5kZXgpOwogICAgIGJvb2wgaGFzUGVuZGluZ0J1ZmZlcigpOwogCisgICAgdm9pZCBwb3N0UGVuZGluZ1JlcGxpZXNBbmREZWZlcnJlZE1lc3NhZ2VzKHN0YXR1c190IGVyciA9IE9LKTsKKyAgICB2b2lkIHBvc3RQZW5kaW5nUmVwbGllc0FuZERlZmVycmVkTWVzc2FnZXMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZyZXNwb25zZSk7CisKICAgICAvKiBjYWxsZWQgdG8gZ2V0IHRoZSBsYXN0IGNvZGVjIGVycm9yIHdoZW4gdGhlIHN0aWNreSBmbGFnIGlzIHNldC4KICAgICAgKiBpZiBubyBzdWNoIGNvZGVjIGVycm9yIGlzIGZvdW5kLCByZXR1cm5zIFVOS05PV05fRVJST1IuCiAgICAgICovCkBAIC01NzEsNiArNTc5LDEwIEBACiAKICAgICBIaXN0b2dyYW0gbUxhdGVuY3lIaXN0OwogCisgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlY0Jhc2U+KGNvbnN0IEFTdHJpbmcgJiwgY29uc3QgY2hhciAqKT4gbUdldENvZGVjQmFzZTsKKyAgICBzdGQ6OmZ1bmN0aW9uPHN0YXR1c190KGNvbnN0IEFTdHJpbmcgJiwgc3A8TWVkaWFDb2RlY0luZm8+ICopPiBtR2V0Q29kZWNJbmZvOworICAgIGZyaWVuZCBjbGFzcyBNZWRpYVRlc3RIZWxwZXI7CisKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZWRpYUNvZGVjKTsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuaAppbmRleCBmNTNiMjNlLi5iZjg1ZDdlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdFdyaXRlci5oCkBAIC0xOSw3ICsxOSw2IEBACiAjZGVmaW5lIE1FRElBX0NPREVDX0xJU1RfV1JJVEVSX0hfCiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjSW5mby5oPgogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CkBAIC02NSw2ICs2NCw3IEBACiAgICAgc3RkOjp2ZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+PiBtQ29kZWNJbmZvczsKIAogICAgIGZyaWVuZCBzdHJ1Y3QgTWVkaWFDb2RlY0xpc3Q7CisgICAgZnJpZW5kIGNsYXNzIE1lZGlhVGVzdEhlbHBlcjsKIH07CiAKIC8qKgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwCmluZGV4IGZiYjJkMGMuLjVkNjk3ZjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAKQEAgLTEsMTIgKzEsMTEgQEAKLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0IiwKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0X2RlZmF1bHRzIiwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIkFub3RoZXJQYWNrZXRTb3VyY2UuY3BwIiwKICAgICAgICAgIkFUU1BhcnNlci5jcHAiLAogICAgICAgICAiQ2FzTWFuYWdlci5jcHAiLAogICAgICAgICAiRVNRdWV1ZS5jcHAiLAotICAgICAgICAiSGxzU2FtcGxlRGVjcnlwdG9yLmNwcCIsCiAgICAgXSwKIAogICAgIGluY2x1ZGVfZGlyczogWwpAQCAtMjgsNyArMjcsNiBAQAogICAgIH0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliY3J5cHRvIiwKICAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXMubmF0aXZlQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwubWVtb3J5QDEuMCIsCkBAIC0zNiw5ICszNCwxMCBAQAogICAgIF0sCiAKICAgICBoZWFkZXJfbGliczogWwotICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgICAgICJsaWJtZWRpYV9kYXRhc291cmNlX2hlYWRlcnMiLAogICAgICAgICAibGliYXVkaW9jbGllbnRfaGVhZGVycyIsCiAgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKQEAgLTQ4LDQgKzQ3LDM5IEBACiAgICAgXSwKIAogICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKKworICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KKworCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydCIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wZWcyc3VwcG9ydF9kZWZhdWx0cyIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1ERU5BQkxFX0NSWVBUTyIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3J5cHRvIiwKKyAgICBdLAorICAgIHNyY3M6IFsKKyAgICAgICAgIkhsc1NhbXBsZURlY3J5cHRvci5jcHAiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0X25vY3J5cHRvIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0X2RlZmF1bHRzIiwKKyAgICBdLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICAgXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCmluZGV4IDRiYjIxZmEuLjgwMWRiYTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcApAQCAtMzYsNyArMzYsNyBAQAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgogCi0jaWZuZGVmIF9fQU5EUk9JRF9BUEVYX18KKyNpZmRlZiBFTkFCTEVfQ1JZUFRPCiAjaW5jbHVkZSAiSGxzU2FtcGxlRGVjcnlwdG9yLmgiCiAjZW5kaWYKIApAQCAtNTUsMTAgKzU1LDEwIEBACiAgICAgLy8gQ3JlYXRlIHRoZSBkZWNyeXB0b3IgYW55d2F5IHNpbmNlIHdlIGRvbid0IGtub3cgdGhlIHVzZS1jYXNlIHVubGVzcyBrZXkgaXMgcHJvdmlkZWQKICAgICAvLyBXb24ndCBkZWNyeXB0IGlmIGtleSBpbmZvIG5vdCBhdmFpbGFibGUgKGUuZy4sIHNjYW5uZXIvZXh0cmFjdG9yIGp1c3QgcGFyc2luZyB0cyBmaWxlcykKICAgICBtU2FtcGxlRGVjcnlwdG9yID0gaXNTYW1wbGVFbmNyeXB0ZWQoKSA/Ci0jaWZkZWYgX19BTkRST0lEX0FQRVhfXwotICAgICAgICBuZXcgU2FtcGxlRGVjcnlwdG9yCi0jZWxzZQorI2lmZGVmIEVOQUJMRV9DUllQVE8KICAgICAgICAgbmV3IEhsc1NhbXBsZURlY3J5cHRvcgorI2Vsc2UKKyAgICAgICAgbmV3IFNhbXBsZURlY3J5cHRvcgogI2VuZGlmCiAgICAgICAgIDogTlVMTDsKIH0KQEAgLTE3MiwyOSArMTcyLDI2IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAotICAgIHVuc2lnbmVkIGJzbW9kIF9fdW51c2VkID0gYml0cy5nZXRCaXRzKDMpOworICAgIGJpdHMuc2tpcEJpdHMoMyk7IC8vIGJzbW9kCiAgICAgdW5zaWduZWQgYWNtb2QgPSBiaXRzLmdldEJpdHMoMyk7Ci0gICAgdW5zaWduZWQgY21peGxldiBfX3VudXNlZCA9IDA7Ci0gICAgdW5zaWduZWQgc3VybWl4bGV2IF9fdW51c2VkID0gMDsKLSAgICB1bnNpZ25lZCBkc3VybW9kIF9fdW51c2VkID0gMDsKIAogICAgIGlmICgoYWNtb2QgJiAxKSA+IDAgJiYgYWNtb2QgIT0gMSkgewogICAgICAgICBpZiAoYml0cy5udW1CaXRzTGVmdCgpIDwgMikgewogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KLSAgICAgICAgY21peGxldiA9IGJpdHMuZ2V0Qml0cygyKTsKKyAgICAgICAgYml0cy5za2lwQml0cygyKTsgLy9jbWl4bGV2CiAgICAgfQogICAgIGlmICgoYWNtb2QgJiA0KSA+IDApIHsKICAgICAgICAgaWYgKGJpdHMubnVtQml0c0xlZnQoKSA8IDIpIHsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9Ci0gICAgICAgIHN1cm1peGxldiA9IGJpdHMuZ2V0Qml0cygyKTsKKyAgICAgICAgYml0cy5za2lwQml0cygyKTsgLy9zdXJtaXhsZXYKICAgICB9CiAgICAgaWYgKGFjbW9kID09IDIpIHsKICAgICAgICAgaWYgKGJpdHMubnVtQml0c0xlZnQoKSA8IDIpIHsKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9Ci0gICAgICAgIGRzdXJtb2QgPSBiaXRzLmdldEJpdHMoMik7CisgICAgICAgIGJpdHMuc2tpcEJpdHMoMik7IC8vZHN1cm1vZAogICAgIH0KIAogICAgIGlmIChiaXRzLm51bUJpdHNMZWZ0KCkgPCAxKSB7CkBAIC0yNjksNyArMjY2LDcgQEAKICAgICAgICAgc2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlVGFibGUyW2ZzY29kMl07CiAgICAgfSBlbHNlIHsKICAgICAgICAgc2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlVGFibGVbZnNjb2RdOwotICAgICAgICB1bnNpZ25lZCBudW1ibGtzY29kIF9fdW51c2VkID0gYml0cy5nZXRCaXRzKDIpOworICAgICAgICBiaXRzLnNraXBCaXRzKDIpOyAvLyBudW1ibGtzY29kCiAgICAgfQogCiAgICAgdW5zaWduZWQgYWNtb2QgPSBiaXRzLmdldEJpdHMoMyk7CkBAIC0xMDg3LDcgKzEwODQsNyBAQAogICAgIH0KICAgICB1bnNpZ25lZCBudW1BVXMgPSBiaXRzLmdldEJpdHMoOCk7CiAgICAgYml0cy5za2lwQml0cyg4KTsKLSAgICB1bnNpZ25lZCBxdWFudGl6YXRpb25fd29yZF9sZW5ndGggX191bnVzZWQgPSBiaXRzLmdldEJpdHMoMik7CisgICAgYml0cy5za2lwQml0cygyKTsgLy8gcXVhbnRpemF0aW9uX3dvcmRfbGVuZ3RoCiAgICAgdW5zaWduZWQgYXVkaW9fc2FtcGxpbmdfZnJlcXVlbmN5ID0gYml0cy5nZXRCaXRzKDMpOwogICAgIHVuc2lnbmVkIG51bV9jaGFubmVscyA9IGJpdHMuZ2V0Qml0cygzKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy90ZXN0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTQ4MzJhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy90ZXN0L0FuZHJvaWQuYnAKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3R7CisgICAgbmFtZTogIk1wZWcydHNVbml0VGVzdCIsCisgICAgZ3Rlc3Q6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJNcGVnMnRzVW5pdFRlc3QuY3BwIgorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXNAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzLm5hdGl2ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCisgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmJpbmRlcl9uZGsiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliZGF0YXNvdXJjZSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21ldGFkYXRhdXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0IiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgICAgICAibGliYXVkaW9jbGllbnRfaGVhZGVycyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMTI5NGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iVGVzdCBtb2R1bGUgY29uZmlnIGZvciBNcGVnMnRzIHVuaXQgdGVzdHMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJNcGVnMnRzVW5pdFRlc3QiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iTXBlZzJ0c1VuaXRUZXN0LT4vZGF0YS9sb2NhbC90bXAvTXBlZzJ0c1VuaXRUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKKyAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvTXBlZzJ0c1VuaXRUZXN0LnppcD91bnppcD10cnVlIgorICAgICAgICAgICAgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcC9NcGVnMnRzVW5pdFRlc3RSZXMvIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJNcGVnMnRzVW5pdFRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC9NcGVnMnRzVW5pdFRlc3RSZXMvIiAvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9NcGVnMnRzVW5pdFRlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy90ZXN0L01wZWcydHNVbml0VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzljMjMzYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9NcGVnMnRzVW5pdFRlc3QuY3BwCkBAIC0wLDAgKzEsMjM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNcGVnMnRzVW5pdFRlc3QiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlIDxkYXRhc291cmNlL0ZpbGVTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorCisjaW5jbHVkZSAibXBlZzJ0cy9BVFNQYXJzZXIuaCIKKyNpbmNsdWRlICJtcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuaCIKKworI2luY2x1ZGUgIk1wZWcydHNVbml0VGVzdEVudmlyb25tZW50LmgiCisKK2NvbnN0ZXhwciBzaXplX3Qga1RTUGFja2V0U2l6ZSA9IDE4ODsKK2NvbnN0ZXhwciB1aW50MTZfdCBrUElETWFzayA9IDB4MUZGRjsKKy8vIE1heCB2YWx1ZSBvZiBQSUQgd2hpY2ggaXMgYWxzbyB1c2VkIGZvciBOdWxsIHBhY2tldHMKK2NvbnN0ZXhwciB1aW50MTZfdCBrUElETWF4VmFsdWUgPSA4MTkxOworY29uc3RleHByIHVpbnQ4X3Qga1RTU3luY0J5dGUgPSAweDQ3OworY29uc3RleHByIHVpbnQ4X3Qga1ZpZGVvUHJlc2VudCA9IDB4MDE7Citjb25zdGV4cHIgdWludDhfdCBrQXVkaW9QcmVzZW50ID0gMHgwMjsKK2NvbnN0ZXhwciB1aW50OF90IGtNZXRhRGF0YVByZXNlbnQgPSAweDA0OworCitzdGF0aWMgTXBlZzJ0c1VuaXRUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY2xhc3MgTXBlZzJ0c1VuaXRUZXN0CisgICAgOiBwdWJsaWMgOjp0ZXN0aW5nIDo6VGVzdFdpdGhQYXJhbTwKKyAgICAgICAgICAgICAgdHVwbGU8LypmaWxlTmFtZSovIHN0cmluZywgLypzb3VyY2VUeXBlKi8gY2hhciwgLypudW1Tb3VyY2UqLyB1aW50MTZfdD4+IHsKKyAgcHVibGljOgorICAgIE1wZWcydHNVbml0VGVzdCgpCisgICAgICAgIDogbUlucHV0QnVmZmVyKG51bGxwdHIpLCBtU291cmNlKG51bGxwdHIpLCBtRnBJbnB1dChudWxscHRyKSwgbVBhcnNlcihudWxscHRyKSB7fQorCisgICAgfk1wZWcydHNVbml0VGVzdCgpIHsKKyAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlcikgZnJlZShtSW5wdXRCdWZmZXIpOworICAgICAgICBpZiAobUZwSW5wdXQpIGZjbG9zZShtRnBJbnB1dCk7CisgICAgICAgIG1Tb3VyY2UuY2xlYXIoKTsKKyAgICB9CisKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBtT2Zmc2V0ID0gMDsKKyAgICAgICAgbU51bURhdGFTb3VyY2UgPSAwOworICAgICAgICB0dXBsZTxzdHJpbmcsIGNoYXIsIHVpbnQxNl90PiBwYXJhbXMgPSBHZXRQYXJhbSgpOworICAgICAgICBjaGFyIHNvdXJjZVR5cGUgPSBnZXQ8MT4ocGFyYW1zKTsKKyAgICAgICAgLyogbVNvdXJjZVR5cGUgPSAwYiB4IHggeCB4IHggTSBBIFYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICB8ICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YURhdGEgIGF1ZGlvICB2aWRlbyAqLworICAgICAgICBtTWVkaWFUeXBlID0gKHNvdXJjZVR5cGUgJiAweDA3KTsKKyAgICAgICAgbU51bURhdGFTb3VyY2UgPSBnZXQ8Mj4ocGFyYW1zKTsKKyAgICAgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDA+KHBhcmFtcyk7CisgICAgICAgIG1GcElucHV0ID0gZm9wZW4oaW5wdXRGaWxlLmNfc3RyKCksICJyYiIpOworICAgICAgICBBU1NFUlRfTkUobUZwSW5wdXQsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gb3BlbiBmaWxlOiAiIDw8IGlucHV0RmlsZTsKKworICAgICAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgICAgIGludDhfdCBlcnIgPSBzdGF0KGlucHV0RmlsZS5jX3N0cigpLCAmYnVmKTsKKyAgICAgICAgQVNTRVJUX0VRKGVyciwgMCkgPDwgIkZhaWxlZCB0byBnZXQgaW5mb3JtYXRpb24gZm9yIGZpbGU6ICIgPDwgaW5wdXRGaWxlOworCisgICAgICAgIGxvbmcgZmlsZVNpemUgPSBidWYuc3Rfc2l6ZTsKKyAgICAgICAgbVRvdGFsUGFja2V0cyA9IGZpbGVTaXplIC8ga1RTUGFja2V0U2l6ZTsKKyAgICAgICAgaW50MzJfdCBmZCA9IGZpbGVubyhtRnBJbnB1dCk7CisgICAgICAgIEFTU0VSVF9HRShmZCwgMCkgPDwgIkZhaWxlZCB0byBnZXQgdGhlIGludGVnZXIgZmlsZSBkZXNjcmlwdG9yIjsKKworICAgICAgICBtU291cmNlID0gbmV3IEZpbGVTb3VyY2UoZHVwKGZkKSwgMCwgYnVmLnN0X3NpemUpOworICAgICAgICBBU1NFUlRfTkUobVNvdXJjZSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBnZXQgdGhlIGRhdGEgc291cmNlISI7CisKKyAgICAgICAgbVBhcnNlciA9IG5ldyBBVFNQYXJzZXIoKTsKKyAgICAgICAgQVNTRVJUX05FKG1QYXJzZXIsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gY3JlYXRlIEFUUyBwYXJzZXIhIjsKKyAgICAgICAgbUlucHV0QnVmZmVyID0gKHVpbnQ4X3QgKiltYWxsb2Moa1RTUGFja2V0U2l6ZSk7CisgICAgICAgIEFTU0VSVF9ORShtSW5wdXRCdWZmZXIsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciBUUyBwYWNrZXQhIjsKKyAgICB9CisKKyAgICB1aW50NjRfdCBtT2Zmc2V0OworICAgIHVpbnQ2NF90IG1Ub3RhbFBhY2tldHM7CisgICAgdWludDE2X3QgbU51bURhdGFTb3VyY2U7CisKKyAgICBpbnQ4X3QgbU1lZGlhVHlwZTsKKworICAgIHVpbnQ4X3QgKm1JbnB1dEJ1ZmZlcjsKKyAgICBzdHJpbmcgbUlucHV0RmlsZTsKKyAgICBzcDxEYXRhU291cmNlPiBtU291cmNlOworICAgIEZJTEUgKm1GcElucHV0OworICAgIEFUU1BhcnNlciAqbVBhcnNlcjsKK307CisKK1RFU1RfUChNcGVnMnRzVW5pdFRlc3QsIE1lZGlhSW5mb1Rlc3QpIHsKKyAgICBib29sIHZpZGVvRm91bmQgPSBmYWxzZTsKKyAgICBib29sIGF1ZGlvRm91bmQgPSBmYWxzZTsKKyAgICBib29sIG1ldGFEYXRhRm91bmQgPSBmYWxzZTsKKyAgICBib29sIHN5bmNQb2ludFByZXNlbnQgPSBmYWxzZTsKKworICAgIGludDE2X3QgdG90YWxEYXRhU291cmNlID0gMDsKKyAgICBpbnQzMl90IHZhbDMyID0gMDsKKyAgICB1aW50OF90IG51bURhdGFTb3VyY2UgPSAwOworICAgIHVpbnQ4X3QgcGFja2V0W2tUU1BhY2tldFNpemVdOworICAgIHNzaXplX3QgbnVtQnl0ZXNSZWFkID0gLTE7CisKKyAgICBBVFNQYXJzZXI6OlN5bmNFdmVudCBldmVudChtT2Zmc2V0KTsKKyAgICBzdGF0aWMgY29uc3QgQVRTUGFyc2VyOjpTb3VyY2VUeXBlIG1lZGlhVHlwZVtdID0ge0FUU1BhcnNlcjo6VklERU8sIEFUU1BhcnNlcjo6QVVESU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFNQYXJzZXI6Ok1FVEEsIEFUU1BhcnNlcjo6TlVNX1NPVVJDRV9UWVBFU307CisgICAgY29uc3QgdWludDMyX3Qgbk1lZGlhVHlwZXMgPSBzaXplb2YobWVkaWFUeXBlKSAvIHNpemVvZihtZWRpYVR5cGVbMF0pOworCisgICAgd2hpbGUgKChudW1CeXRlc1JlYWQgPSBtU291cmNlLT5yZWFkQXQobU9mZnNldCwgcGFja2V0LCBrVFNQYWNrZXRTaXplKSkgPT0ga1RTUGFja2V0U2l6ZSkgeworICAgICAgICBBU1NFUlRfVFJVRShwYWNrZXRbMF0gPT0ga1RTU3luY0J5dGUpIDw8ICJTeW5jIGJ5dGUgZXJyb3IhIjsKKworICAgICAgICAvLyBwaWQgaXMgMTMgYml0cworICAgICAgICB1aW50MTZfdCBwaWQgPSAocGFja2V0WzFdICsgKHBhY2tldFsyXSA8PCA4KSkgJiBrUElETWFzazsKKyAgICAgICAgQVNTRVJUX1RSVUUocGlkIDw9IGtQSURNYXhWYWx1ZSkgPDwgIkludmFsaWQgUElEOiAiIDw8IHBpZDsKKworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtUGFyc2VyLT5mZWVkVFNQYWNrZXQocGFja2V0LCBrVFNQYWNrZXRTaXplLCAmZXZlbnQpOworICAgICAgICBBU1NFUlRfRVEoZXJyLCAoc3RhdHVzX3QpT0spIDw8ICJVbmFibGUgdG8gZmVlZCBUUyBwYWNrZXQhIjsKKworICAgICAgICBtT2Zmc2V0ICs9IG51bUJ5dGVzUmVhZDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuTWVkaWFUeXBlczsgaSsrKSB7CisgICAgICAgICAgICBpZiAobVBhcnNlci0+aGFzU291cmNlKG1lZGlhVHlwZVtpXSkpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1lZGlhVHlwZVtpXSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEFUU1BhcnNlcjo6VklERU86CisgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb0ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEFUU1BhcnNlcjo6QVVESU86CisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0ZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEFUU1BhcnNlcjo6TUVUQToKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFEYXRhRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQVRTUGFyc2VyOjpOVU1fU09VUkNFX1RZUEVTOgorICAgICAgICAgICAgICAgICAgICAgICAgbnVtRGF0YVNvdXJjZSA9IDM7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAodmlkZW9Gb3VuZCAmJiBhdWRpb0ZvdW5kICYmIG1ldGFEYXRhRm91bmQgJiYgKG51bURhdGFTb3VyY2UgPT0gMykpIGJyZWFrOworICAgIH0KKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbk1lZGlhVHlwZXM7IGkrKykgeworICAgICAgICBBVFNQYXJzZXI6OlNvdXJjZVR5cGUgY3VycmVudE1lZGlhVHlwZSA9IG1lZGlhVHlwZVtpXTsKKyAgICAgICAgaWYgKG1QYXJzZXItPmhhc1NvdXJjZShjdXJyZW50TWVkaWFUeXBlKSkgeworICAgICAgICAgICAgaWYgKGV2ZW50Lmhhc1JldHVybmVkRGF0YSgpKSB7CisgICAgICAgICAgICAgICAgc3luY1BvaW50UHJlc2VudCA9IHRydWU7CisgICAgICAgICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc3luY1BhY2tldFNvdXJjZSA9IGV2ZW50LmdldE1lZGlhU291cmNlKCk7CisgICAgICAgICAgICAgICAgQVNTRVJUX05FKHN5bmNQYWNrZXRTb3VyY2UsIG51bGxwdHIpCisgICAgICAgICAgICAgICAgICAgICAgICA8PCAiQ2Fubm90IGdldCBzeW5jIHNvdXJjZSBmb3IgbWVkaWEgdHlwZTogIiA8PCBjdXJyZW50TWVkaWFUeXBlOworCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gc3luY1BhY2tldFNvdXJjZS0+c3RhcnQoKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoZXJyLCAoc3RhdHVzX3QpT0spIDw8ICJFcnJvciByZXR1cm5lZCB3aGlsZSBzdGFydGluZyEiOworCisgICAgICAgICAgICAgICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IHN5bmNQYWNrZXRTb3VyY2UtPmdldEZvcm1hdCgpOworICAgICAgICAgICAgICAgIEFTU0VSVF9ORShmb3JtYXQsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gZ2V0IHRoZSBmb3JtYXQgb2YgdGhlIHNvdXJjZSBwYWNrZXQhIjsKKworICAgICAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmOworICAgICAgICAgICAgICAgIHN5bmNQYWNrZXRTb3VyY2UtPnJlYWQoJmJ1ZiwgbnVsbHB0cik7CisgICAgICAgICAgICAgICAgQVNTRVJUX05FKGJ1ZiwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byByZWFkIHN5bmMgcGFja2V0IHNvdXJjZSBkYXRhIjsKKworICAgICAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmaW5NZXRhID0gYnVmLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgICAgICBib29sIHN0YXR1cyA9IGluTWV0YS5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLCAmdmFsMzIpOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIHRydWUpIDw8ICJTeW5jIGZyYW1lIGtleSBpcyBub3Qgc2V0IjsKKworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGluTWV0YS5maW5kSW50MzIoa0tleUNyeXB0b01vZGUsICZ2YWwzMik7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgZmFsc2UpIDw8ICJJbnZhbGlkIHBhY2tldCwgZm91bmQgc2NyYW1ibGVkIHBhY2tldHMhIjsKKworICAgICAgICAgICAgICAgIGVyciA9IHN5bmNQYWNrZXRTb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoZXJyLCAoc3RhdHVzX3QpT0spIDw8ICJFcnJvciByZXR1cm5lZCB3aGlsZSBzdG9wcGluZyEiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gcGFja2V0U291cmNlID0gbVBhcnNlci0+Z2V0U291cmNlKGN1cnJlbnRNZWRpYVR5cGUpOworICAgICAgICAgICAgQVNTRVJUX05FKHBhY2tldFNvdXJjZSwgbnVsbHB0cikKKyAgICAgICAgICAgICAgICAgICAgPDwgIkNhbm5vdCBnZXQgc291cmNlIGZvciBtZWRpYSB0eXBlOiAiIDw8IGN1cnJlbnRNZWRpYVR5cGU7CisKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhY2tldFNvdXJjZS0+c3RhcnQoKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShlcnIsIChzdGF0dXNfdClPSykgPDwgIkVycm9yIHJldHVybmVkIHdoaWxlIHN0YXJ0aW5nISI7CisgICAgICAgICAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ID0gcGFja2V0U291cmNlLT5nZXRGb3JtYXQoKTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShmb3JtYXQsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gZ2V0IHRoZSBmb3JtYXQgb2YgdGhlIHBhY2tldCEiOworCisgICAgICAgICAgICBlcnIgPSBwYWNrZXRTb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShlcnIsIChzdGF0dXNfdClPSykgPDwgIkVycm9yIHJldHVybmVkIHdoaWxlIHN0b3BwaW5nISI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBU1NFUlRfRVEodmlkZW9Gb3VuZCwgYm9vbChtTWVkaWFUeXBlICYga1ZpZGVvUHJlc2VudCkpIDw8ICJObyBWaWRlbyBwYWNrZXRzIGZvdW5kISI7CisgICAgQVNTRVJUX0VRKGF1ZGlvRm91bmQsIGJvb2wobU1lZGlhVHlwZSAmIGtBdWRpb1ByZXNlbnQpKSA8PCAiTm8gQXVkaW8gcGFja2V0cyBmb3VuZCEiOworICAgIEFTU0VSVF9FUShtZXRhRGF0YUZvdW5kLCBib29sKG1NZWRpYVR5cGUgJiBrTWV0YURhdGFQcmVzZW50KSkgPDwgIk5vIG1ldGEgZGF0YSBmb3VuZCEiOworCisgICAgaWYgKHZpZGVvRm91bmQgfHwgYXVkaW9Gb3VuZCkgeworICAgICAgICBBU1NFUlRfVFJVRShzeW5jUG9pbnRQcmVzZW50KSA8PCAiTm8gc3luYyBwb2ludHMgZm91bmQgZm9yIGF1ZGlvL3ZpZGVvIjsKKyAgICB9CisKKyAgICBpZiAodmlkZW9Gb3VuZCkgdG90YWxEYXRhU291cmNlICs9IDE7CisgICAgaWYgKGF1ZGlvRm91bmQpIHRvdGFsRGF0YVNvdXJjZSArPSAxOworICAgIGlmIChtZXRhRGF0YUZvdW5kKSB0b3RhbERhdGFTb3VyY2UgKz0gMTsKKworICAgIEFTU0VSVF9UUlVFKHRvdGFsRGF0YVNvdXJjZSA9PSBtTnVtRGF0YVNvdXJjZSkKKyAgICAgICAgICAgIDw8ICJFeHBlY3RlZCAiIDw8IG1OdW1EYXRhU291cmNlIDw8ICIgZGF0YSBzb3VyY2VzLCBmb3VuZCAiIDw8IHRvdGFsRGF0YVNvdXJjZTsKKyAgICBpZiAobnVtRGF0YVNvdXJjZSA9PSAzKSB7CisgICAgICAgIEFTU0VSVF9FUShudW1EYXRhU291cmNlLCBtTnVtRGF0YVNvdXJjZSkKKyAgICAgICAgICAgICAgICA8PCAiRXhwZWN0ZWQgIiA8PCBtTnVtRGF0YVNvdXJjZSA8PCAiIGRhdGEgc291cmNlcywgZm91bmQgIiA8PCB0b3RhbERhdGFTb3VyY2U7CisgICAgfQorfQorCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIGluZm9UZXN0LCBNcGVnMnRzVW5pdFRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfdHVwbGUoImNyb3dkXzE5MjB4MTA4MF8yNWZwc182NzAwa2Jwc19oMjY0LnRzIiwgMHgwMSwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoInNlZ21lbnQwMDAwMDEudHMiLCAweDAzLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zLnRzIiwgMHgwMiwgMSkpKTsKKworaW50MzJfdCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIGdFbnYgPSBuZXcgTXBlZzJ0c1VuaXRUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICB1aW50OF90IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBBTE9HVigiTXBlZzJ0c1VuaXQgVGVzdCBSZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9NcGVnMnRzVW5pdFRlc3RFbnZpcm9ubWVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy90ZXN0L01wZWcydHNVbml0VGVzdEVudmlyb25tZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU0MWRiNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9NcGVnMnRzVW5pdFRlc3RFbnZpcm9ubWVudC5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fTVBFRzJUU19VTklUX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisjZGVmaW5lIF9fTVBFRzJUU19VTklUX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2NsYXNzIE1wZWcydHNVbml0VGVzdEVudmlyb25tZW50IDogcHVibGljOjp0ZXN0aW5nOjpFbnZpcm9ubWVudCB7CisgIHB1YmxpYzoKKyAgICBNcGVnMnRzVW5pdFRlc3RFbnZpcm9ubWVudCgpIDogcmVzKCIvZGF0YS9sb2NhbC90bXAvIikge30KKworICAgIC8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworICAgIGludCBpbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKKworICAgIHZvaWQgc2V0UmVzKGNvbnN0IGNoYXIgKl9yZXMpIHsgcmVzID0gX3JlczsgfQorCisgICAgY29uc3Qgc3RyaW5nIGdldFJlcygpIGNvbnN0IHsgcmV0dXJuIHJlczsgfQorCisgIHByaXZhdGU6CisgICAgc3RyaW5nIHJlczsKK307CisKK2ludCBNcGVnMnRzVW5pdFRlc3RFbnZpcm9ubWVudDo6aW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHt7InBhdGgiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwgezAsIDAsIDAsIDB9fTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIlA6Iiwgb3B0aW9ucywgJmluZGV4KTsKKyAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdQJzogeworICAgICAgICAgICAgICAgIHNldFJlcyhvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvcHRpbmQgPCBhcmdjKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgb3B0aW9uOiAlc1xuXG4iCisgICAgICAgICAgICAgICAgInVzYWdlOiAlcyA8Z3Rlc3Qgb3B0aW9ucz4gPHRlc3Qgb3B0aW9ucz5cblxuIgorICAgICAgICAgICAgICAgICJ0ZXN0IG9wdGlvbnMgYXJlOlxuXG4iCisgICAgICAgICAgICAgICAgIi1QLCAtLXBhdGg6IFJlc291cmNlIGZpbGVzIGRpcmVjdG9yeSBsb2NhdGlvblxuIiwKKyAgICAgICAgICAgICAgICBhcmd2W29wdGluZCA/OiAxXSwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmICAvLyBfX01QRUcyVFNfVU5JVF9URVNUX0VOVklST05NRU5UX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy90ZXN0L1JFQURNRS5tZCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM3Y2U3MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9SRUFETUUubWQKQEAgLTAsMCArMSwzOCBAQAorIyMgTWVkaWEgVGVzdGluZyAjIworLS0tCisjIyMjIE1wZWcyVFMgVW5pdCBUZXN0IDoKK1RoZSBNcGVnMlRTIFVuaXQgVGVzdCBTdWl0ZSB2YWxpZGF0ZXMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGxpYnJhcmllcyBwcmVzZW50IGluIE1wZWcyVFMuCisKK1J1biB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHRoZSB0ZXN0IHN1aXRlOgorYGBgCittbW0gZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvCitgYGAKKworVGhlIDMyLWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdC8KKworVGhlIDY0LWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0LworCitUbyB0ZXN0IDY0LWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3Q2NC4KKworYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0L01wZWcydHNVbml0VGVzdC9NcGVnMnRzVW5pdFRlc3QgL2RhdGEvbG9jYWwvdG1wLworCitUbyB0ZXN0IDMyLWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3QuCisKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvTXBlZzJ0c1VuaXRUZXN0L01wZWcydHNVbml0VGVzdCAvZGF0YS9sb2NhbC90bXAvCisKK1RoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvTXBlZzJ0c1VuaXRUZXN0LnppcCApLgorRG93bmxvYWQsIHVuemlwIGFuZCBwdXNoIHRoZXNlIGZpbGVzIGludG8gZGV2aWNlIGZvciB0ZXN0aW5nLgorCitgYGAKK2FkYiBwdXNoIE1wZWcydHNVbml0VGVzdFJlcy8uIC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCit1c2FnZTogTXBlZzJ0c1VuaXRUZXN0IC1QIFw8cGF0aF90b19mb2xkZXJcPgorYGBgCithZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL01wZWcydHNVbml0VGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvTXBlZzJ0c1VuaXRUZXN0UmVzLworYGBgCitBbHRlcm5hdGl2ZWx5LCB0aGUgdGVzdCBjYW4gYWxzbyBiZSBydW4gdXNpbmcgYXRlc3QgY29tbWFuZC4KKworYGBgCithdGVzdCBNcGVnMnRzVW5pdFRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorYGBgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teC5jcHAKaW5kZXggZWVmOWNlMy4uZWIxNTAzOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXguY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214LmNwcApAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0FzU3RyaW5nLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09teEdyYXBoaWNCdWZmZXJTb3VyY2UuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV09teE5vZGUuaD4KQEAgLTQxLDIxICs0MSwyMSBAQAogY29uc3RleHByIHNpemVfdCBrTWF4Tm9kZUluc3RhbmNlcyA9ICgxIDw8IDE2KTsKIAogT214OjpPbXgoKSA6Ci0gICAgbU1hc3RlcihuZXcgT01YTWFzdGVyKCkpLAorICAgIG1TdG9yZShuZXcgT01YU3RvcmUoKSksCiAgICAgbVBhcnNlcigpIHsKICAgICAodm9pZCltUGFyc2VyLnBhcnNlWG1sRmlsZXNJblNlYXJjaERpcnMoKTsKICAgICAodm9pZCltUGFyc2VyLnBhcnNlWG1sUGF0aChtUGFyc2VyLmRlZmF1bHRQcm9maWxpbmdSZXN1bHRzWG1sUGF0aCk7CiB9CiAKIE9teDo6fk9teCgpIHsKLSAgICBkZWxldGUgbU1hc3RlcjsKKyAgICBkZWxldGUgbVN0b3JlOwogfQogCiBSZXR1cm48dm9pZD4gT214OjpsaXN0Tm9kZXMobGlzdE5vZGVzX2NiIF9oaWRsX2NiKSB7CiAgICAgc3RkOjpsaXN0PDo6YW5kcm9pZDo6SU9NWDo6Q29tcG9uZW50SW5mbz4gbGlzdDsKICAgICBjaGFyIGNvbXBvbmVudE5hbWVbMjU2XTsKICAgICBmb3IgKE9NWF9VMzIgaW5kZXggPSAwOwotICAgICAgICAgICAgbU1hc3Rlci0+ZW51bWVyYXRlQ29tcG9uZW50cygKKyAgICAgICAgICAgIG1TdG9yZS0+ZW51bWVyYXRlQ29tcG9uZW50cygKICAgICAgICAgICAgIGNvbXBvbmVudE5hbWUsIHNpemVvZihjb21wb25lbnROYW1lKSwgaW5kZXgpID09IE9NWF9FcnJvck5vbmU7CiAgICAgICAgICAgICArK2luZGV4KSB7CiAgICAgICAgIGxpc3QucHVzaF9iYWNrKDo6YW5kcm9pZDo6SU9NWDo6Q29tcG9uZW50SW5mbygpKTsKQEAgLTYzLDcgKzYzLDcgQEAKICAgICAgICAgaW5mby5tTmFtZSA9IGNvbXBvbmVudE5hbWU7CiAgICAgICAgIDo6YW5kcm9pZDo6VmVjdG9yPDo6YW5kcm9pZDo6U3RyaW5nOD4gcm9sZXM7CiAgICAgICAgIE9NWF9FUlJPUlRZUEUgZXJyID0KLSAgICAgICAgICAgICAgICBtTWFzdGVyLT5nZXRSb2xlc09mQ29tcG9uZW50KGNvbXBvbmVudE5hbWUsICZyb2xlcyk7CisgICAgICAgICAgICAgICAgbVN0b3JlLT5nZXRSb2xlc09mQ29tcG9uZW50KGNvbXBvbmVudE5hbWUsICZyb2xlcyk7CiAgICAgICAgIGlmIChlcnIgPT0gT01YX0Vycm9yTm9uZSkgewogICAgICAgICAgICAgZm9yIChPTVhfVTMyIGkgPSAwOyBpIDwgcm9sZXMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgICAgICBpbmZvLm1Sb2xlcy5wdXNoX2JhY2socm9sZXNbaV0pOwpAQCAtMTAxLDcgKzEwMSw3IEBACiAgICAgICAgICAgICAgICAgdGhpcywgbmV3IExXT214T2JzZXJ2ZXIob2JzZXJ2ZXIpLCBuYW1lLmNfc3RyKCkpOwogCiAgICAgICAgIE9NWF9DT01QT05FTlRUWVBFICpoYW5kbGU7Ci0gICAgICAgIE9NWF9FUlJPUlRZUEUgZXJyID0gbU1hc3Rlci0+bWFrZUNvbXBvbmVudEluc3RhbmNlKAorICAgICAgICBPTVhfRVJST1JUWVBFIGVyciA9IG1TdG9yZS0+bWFrZUNvbXBvbmVudEluc3RhbmNlKAogICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSwgJk9NWE5vZGVJbnN0YW5jZTo6a0NhbGxiYWNrcywKICAgICAgICAgICAgICAgICBpbnN0YW5jZS5nZXQoKSwgJmhhbmRsZSk7CiAKQEAgLTIwOCw3ICsyMDgsNyBAQAogCiAgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBPTVhfRXJyb3JOb25lOwogICAgIGlmIChpbnN0YW5jZS0+aGFuZGxlKCkgIT0gTlVMTCkgewotICAgICAgICBlcnIgPSBtTWFzdGVyLT5kZXN0cm95Q29tcG9uZW50SW5zdGFuY2UoCisgICAgICAgIGVyciA9IG1TdG9yZS0+ZGVzdHJveUNvbXBvbmVudEluc3RhbmNlKAogICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PE9NWF9DT01QT05FTlRUWVBFKj4oaW5zdGFuY2UtPmhhbmRsZSgpKSk7CiAgICAgfQogICAgIHJldHVybiBTdGF0dXNGcm9tT01YRXJyb3IoZXJyKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5jcHAKaW5kZXggNjdmNDc4ZS4uYjVjMTE2NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5jcHAKQEAgLTU0LDYgKzU0LDI0IEBACiAgICAgICAgIH0pOwogICAgIH0KIAorICAgIGlmICghbm9kZXMuZW1wdHkoKSkgeworICAgICAgICBhdXRvIGFueU5vZGUgPSBub2Rlcy5jYmVnaW4oKTsKKyAgICAgICAgc3RkOjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGZpcnN0ID0gYW55Tm9kZS0+Y2JlZ2luKCk7CisgICAgICAgIHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciBsYXN0ID0gYW55Tm9kZS0+Y2VuZCgpOworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lIDogbm9kZXMpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nOjpjb25zdF9pdGVyYXRvciBpdDEgPSBmaXJzdDsKKyAgICAgICAgICAgIGZvciAoc3RkOjpzdHJpbmc6OmNvbnN0X2l0ZXJhdG9yIGl0MiA9IG5hbWUuY2JlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgIGl0MSAhPSBsYXN0ICYmIGl0MiAhPSBuYW1lLmNlbmQoKSAmJiB0b2xvd2VyKCppdDEpID09IHRvbG93ZXIoKml0Mik7CisgICAgICAgICAgICAgICAgICAgICsraXQxLCArK2l0MikgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFzdCA9IGl0MTsKKyAgICAgICAgfQorICAgICAgICBtUHJlZml4ID0gc3RkOjpzdHJpbmcoZmlyc3QsIGxhc3QpOworICAgICAgICBMT0coSU5GTykgPDwgIm9teCBjb21tb24gcHJlZml4OiAnIiA8PCBtUHJlZml4LmNfc3RyKCkgPDwgIiciOworICAgIH0gZWxzZSB7CisgICAgICAgIExPRyhJTkZPKSA8PCAib214IGNvbW1vbiBwcmVmaXg6IG5vIG5vZGVzIjsKKyAgICB9CisKICAgICBNZWRpYUNvZGVjc1htbFBhcnNlciBwYXJzZXI7CiAgICAgcGFyc2VyLnBhcnNlWG1sRmlsZXNJblNlYXJjaERpcnMoeG1sTmFtZXMsIHNlYXJjaERpcnMpOwogICAgIGlmIChwcm9maWxpbmdSZXN1bHRzWG1sUGF0aCAhPSBudWxscHRyKSB7CkBAIC0xMTIsOCArMTMwLDYgQEAKICAgICAgICAgbVJvbGVMaXN0W2ldID0gc3RkOjptb3ZlKHJvbGUpOwogICAgICAgICArK2k7CiAgICAgfQotCi0gICAgbVByZWZpeCA9IHBhcnNlci5nZXRDb21tb25QcmVmaXgoKTsKIH0KIAogT214U3RvcmU6On5PbXhTdG9yZSgpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQuYnAKaW5kZXggNzhiNGYxOS4uN2MzNzJjZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQuYnAKQEAgLTcsNyArNyw3IEBACiAgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAogCiAgICAgc3JjczogWwotICAgICAgICAiT01YTWFzdGVyLmNwcCIsCisgICAgICAgICJPTVhTdG9yZS5jcHAiLAogICAgICAgICAiT01YTm9kZUluc3RhbmNlLmNwcCIsCiAgICAgICAgICJPTVhVdGlscy5jcHAiLAogICAgICAgICAiT214R3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcAppbmRleCBhYzQyMzczLi5iZWJkNTE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcApAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhTdG9yZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvSU9NWEJ1ZmZlclNvdXJjZS5oPgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhTdG9yZS5jcHAKc2ltaWxhcml0eSBpbmRleCA5MSUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5jcHAKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhTdG9yZS5jcHAKaW5kZXggMDk0YjFmNS4uZThmZWU0MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmNwcApAQCAtMTUsMTEgKzE1LDExIEBACiAgKi8KIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJPTVhNYXN0ZXIiCisjZGVmaW5lIExPR19UQUcgIk9NWFN0b3JlIgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFN0b3JlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogCkBAIC0zMCw3ICszMCw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotT01YTWFzdGVyOjpPTVhNYXN0ZXIoKSB7CitPTVhTdG9yZTo6T01YU3RvcmUoKSB7CiAKICAgICBwaWRfdCBwaWQgPSBnZXRwaWQoKTsKICAgICBjaGFyIGZpbGVuYW1lWzIwXTsKQEAgLTU1LDE5ICs1NSwxOSBAQAogICAgIGFkZFBsYXRmb3JtUGx1Z2luKCk7CiB9CiAKLU9NWE1hc3Rlcjo6fk9NWE1hc3RlcigpIHsKK09NWFN0b3JlOjp+T01YU3RvcmUoKSB7CiAgICAgY2xlYXJQbHVnaW5zKCk7CiB9CiAKLXZvaWQgT01YTWFzdGVyOjphZGRWZW5kb3JQbHVnaW4oKSB7Cit2b2lkIE9NWFN0b3JlOjphZGRWZW5kb3JQbHVnaW4oKSB7CiAgICAgYWRkUGx1Z2luKCJsaWJzdGFnZWZyaWdodGh3LnNvIik7CiB9CiAKLXZvaWQgT01YTWFzdGVyOjphZGRQbGF0Zm9ybVBsdWdpbigpIHsKK3ZvaWQgT01YU3RvcmU6OmFkZFBsYXRmb3JtUGx1Z2luKCkgewogICAgIGFkZFBsdWdpbigibGlic3RhZ2VmcmlnaHRfc29mdG9teF9wbHVnaW4uc28iKTsKIH0KIAotdm9pZCBPTVhNYXN0ZXI6OmFkZFBsdWdpbihjb25zdCBjaGFyICpsaWJuYW1lKSB7Cit2b2lkIE9NWFN0b3JlOjphZGRQbHVnaW4oY29uc3QgY2hhciAqbGlibmFtZSkgewogICAgIGlmICg6OmFuZHJvaWQ6OmJhc2U6OkdldEludFByb3BlcnR5KCJ2ZW5kb3IubWVkaWEub214IiwgaW50NjRfdCgxKSkgPT0gMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtOTksNyArOTksNyBAQAogICAgIH0KIH0KIAotdm9pZCBPTVhNYXN0ZXI6OmFkZFBsdWdpbihPTVhQbHVnaW5CYXNlICpwbHVnaW4pIHsKK3ZvaWQgT01YU3RvcmU6OmFkZFBsdWdpbihPTVhQbHVnaW5CYXNlICpwbHVnaW4pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgT01YX1UzMiBpbmRleCA9IDA7CkBAIC0xMjYsNyArMTI2LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgT01YTWFzdGVyOjpjbGVhclBsdWdpbnMoKSB7Cit2b2lkIE9NWFN0b3JlOjpjbGVhclBsdWdpbnMoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIG1QbHVnaW5CeUNvbXBvbmVudE5hbWUuY2xlYXIoKTsKQEAgLTE0OCw3ICsxNDgsNyBAQAogICAgIG1QbHVnaW5zLmNsZWFyKCk7CiB9CiAKLU9NWF9FUlJPUlRZUEUgT01YTWFzdGVyOjptYWtlQ29tcG9uZW50SW5zdGFuY2UoCitPTVhfRVJST1JUWVBFIE9NWFN0b3JlOjptYWtlQ29tcG9uZW50SW5zdGFuY2UoCiAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUgKmNhbGxiYWNrcywKICAgICAgICAgT01YX1BUUiBhcHBEYXRhLApAQCAtMTc3LDcgKzE3Nyw3IEBACiAgICAgcmV0dXJuIGVycjsKIH0KIAotT01YX0VSUk9SVFlQRSBPTVhNYXN0ZXI6OmRlc3Ryb3lDb21wb25lbnRJbnN0YW5jZSgKK09NWF9FUlJPUlRZUEUgT01YU3RvcmU6OmRlc3Ryb3lDb21wb25lbnRJbnN0YW5jZSgKICAgICAgICAgT01YX0NPTVBPTkVOVFRZUEUgKmNvbXBvbmVudCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKQEAgLTE5Myw3ICsxOTMsNyBAQAogICAgIHJldHVybiBwbHVnaW4tPmRlc3Ryb3lDb21wb25lbnRJbnN0YW5jZShjb21wb25lbnQpOwogfQogCi1PTVhfRVJST1JUWVBFIE9NWE1hc3Rlcjo6ZW51bWVyYXRlQ29tcG9uZW50cygKK09NWF9FUlJPUlRZUEUgT01YU3RvcmU6OmVudW1lcmF0ZUNvbXBvbmVudHMoCiAgICAgICAgIE9NWF9TVFJJTkcgbmFtZSwKICAgICAgICAgc2l6ZV90IHNpemUsCiAgICAgICAgIE9NWF9VMzIgaW5kZXgpIHsKQEAgLTIxMyw3ICsyMTMsNyBAQAogICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogfQogCi1PTVhfRVJST1JUWVBFIE9NWE1hc3Rlcjo6Z2V0Um9sZXNPZkNvbXBvbmVudCgKK09NWF9FUlJPUlRZUEUgT01YU3RvcmU6OmdldFJvbGVzT2ZDb21wb25lbnQoCiAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgIFZlY3RvcjxTdHJpbmc4PiAqcm9sZXMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5jcHAKaW5kZXggMWI4NDkzYS4uZDZkMjgwZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuY3BwCkBAIC0zNTQsNyArMzU0LDcgQEAKICAgICBEZXNjcmliZUNvbG9yRm9ybWF0MlBhcmFtcyBkZXNjcmliZVBhcmFtczsKICAgICBJbml0T01YUGFyYW1zKCZkZXNjcmliZVBhcmFtcyk7CiAgICAgZGVzY3JpYmVQYXJhbXMuZUNvbG9yRm9ybWF0ID0gKE9NWF9DT0xPUl9GT1JNQVRUWVBFKWNvbG9yRm9ybWF0OwotICAgIC8vIHJlYXNvbmFibGUgZHVtbXkgdmFsdWVzCisgICAgLy8gcmVhc29uYWJsZSBpbml0aWFsIHZhbHVlcyAodGhhdCB3aWxsIGJlIG92ZXJ3cml0dGVuKQogICAgIGRlc2NyaWJlUGFyYW1zLm5GcmFtZVdpZHRoID0gMTI4OwogICAgIGRlc2NyaWJlUGFyYW1zLm5GcmFtZUhlaWdodCA9IDEyODsKICAgICBkZXNjcmliZVBhcmFtcy5uU3RyaWRlID0gMTI4OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214LmgKaW5kZXggNWE0NmIyNi4uODRhZTUxMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXguaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teC5oCkBAIC0yNyw3ICsyNyw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IE9NWE1hc3RlcjsKK3N0cnVjdCBPTVhTdG9yZTsKIHN0cnVjdCBPTVhOb2RlSW5zdGFuY2U7CiAKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CkBAIC01MSw3ICs1MSw3IEBACiB1c2luZyA6OmFuZHJvaWQ6OnNwOwogdXNpbmcgOjphbmRyb2lkOjp3cDsKIAotdXNpbmcgOjphbmRyb2lkOjpPTVhNYXN0ZXI7Cit1c2luZyA6OmFuZHJvaWQ6Ok9NWFN0b3JlOwogdXNpbmcgOjphbmRyb2lkOjpPTVhOb2RlSW5zdGFuY2U7CiAKIHN0cnVjdCBPbXggOiBwdWJsaWMgSU9teCwgcHVibGljIGhpZGxfZGVhdGhfcmVjaXBpZW50IHsKQEAgLTczLDcgKzczLDcgQEAKICAgICBzdGF0dXNfdCBmcmVlTm9kZShzcDxPTVhOb2RlSW5zdGFuY2U+IGNvbnN0JiBpbnN0YW5jZSk7CiAKIHByb3RlY3RlZDoKLSAgICBPTVhNYXN0ZXIqIG1NYXN0ZXI7CisgICAgT01YU3RvcmUqIG1TdG9yZTsKICAgICBNdXRleCBtTG9jazsKICAgICBLZXllZFZlY3Rvcjx3cDxJQmFzZT4sIHNwPE9NWE5vZGVJbnN0YW5jZT4gPiBtTGl2ZU5vZGVzOwogICAgIEtleWVkVmVjdG9yPE9NWE5vZGVJbnN0YW5jZSosIHdwPElCYXNlPiA+IG1Ob2RlMk9ic2VydmVyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE5vZGVJbnN0YW5jZS5oCmluZGV4IGE3NjFlZjYuLjVmMzJjOWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmgKQEAgLTMzLDcgKzMzLDcgQEAKIGNsYXNzIEdyYXBoaWNCdWZmZXI7CiBjbGFzcyBJT01YQnVmZmVyU291cmNlOwogY2xhc3MgSU9NWE9ic2VydmVyOwotc3RydWN0IE9NWE1hc3RlcjsKK3N0cnVjdCBPTVhTdG9yZTsKIGNsYXNzIE9NWEJ1ZmZlcjsKIHVzaW5nIElIaWRsTWVtb3J5ID0gaGlkbDo6bWVtb3J5OjpWMV8wOjpJTWVtb3J5OwogdXNpbmcgaGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpPbXg7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YU3RvcmUuaApzaW1pbGFyaXR5IGluZGV4IDg4JQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhTdG9yZS5oCmluZGV4IDkzZWFlZjEuLjVkNmMzZWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YU3RvcmUuaApAQCAtMTQsOSArMTQsOSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBPTVhfTUFTVEVSX0hfCisjaWZuZGVmIE9NWF9TVE9SRV9IXwogCi0jZGVmaW5lIE9NWF9NQVNURVJfSF8KKyNkZWZpbmUgT01YX1NUT1JFX0hfCiAKICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9PTVhQbHVnaW5CYXNlLmg+CiAKQEAgLTI3LDkgKzI3LDkgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgT01YTWFzdGVyIDogcHVibGljIE9NWFBsdWdpbkJhc2UgewotICAgIE9NWE1hc3RlcigpOwotICAgIHZpcnR1YWwgfk9NWE1hc3RlcigpOworc3RydWN0IE9NWFN0b3JlIDogcHVibGljIE9NWFBsdWdpbkJhc2UgeworICAgIE9NWFN0b3JlKCk7CisgICAgdmlydHVhbCB+T01YU3RvcmUoKTsKIAogICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBtYWtlQ29tcG9uZW50SW5zdGFuY2UoCiAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLApAQCAtNjYsMTAgKzY2LDEwIEBACiAgICAgdm9pZCBhZGRQbHVnaW4oT01YUGx1Z2luQmFzZSAqcGx1Z2luKTsKICAgICB2b2lkIGNsZWFyUGx1Z2lucygpOwogCi0gICAgT01YTWFzdGVyKGNvbnN0IE9NWE1hc3RlciAmKTsKLSAgICBPTVhNYXN0ZXIgJm9wZXJhdG9yPShjb25zdCBPTVhNYXN0ZXIgJik7CisgICAgT01YU3RvcmUoY29uc3QgT01YU3RvcmUgJik7CisgICAgT01YU3RvcmUgJm9wZXJhdG9yPShjb25zdCBPTVhTdG9yZSAmKTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKLSNlbmRpZiAgLy8gT01YX01BU1RFUl9IXworI2VuZGlmICAvLyBPTVhfU1RPUkVfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcAppbmRleCBiYjY2ZjRjLi5jMzNiZjNmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCkBAIC0zMjksNiArMzI5LDcgQEAKICAgICBtUGFzcy5jbGVhcigpOwogICAgIG1BdXRoVHlwZSA9IE5PTkU7CiAgICAgbU5vbmNlLmNsZWFyKCk7CisgICAgbVJlYWxtLmNsZWFyKCk7CiAKICAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7CiB9CkBAIC05MTEsNiArOTEyLDE0IEBACiAgICAgICAgIENIRUNLX0dFKGosIDApOwogCiAgICAgICAgIG1Ob25jZS5zZXRUbyh2YWx1ZSwgaSArIDcsIGogLSBpIC0gNyk7CisKKyAgICAgICAgaSA9IHZhbHVlLmZpbmQoInJlYWxtPSIpOworICAgICAgICBDSEVDS19HRShpLCAwKTsKKyAgICAgICAgQ0hFQ0tfRVEodmFsdWUuY19zdHIoKVtpICsgNl0sICdcIicpOworICAgICAgICBqID0gdmFsdWUuZmluZCgiXCIiLCBpICsgNyk7CisgICAgICAgIENIRUNLX0dFKGosIDApOworCisgICAgICAgIG1SZWFsbS5zZXRUbyh2YWx1ZSwgaSArIDcsIGogLSBpIC0gNyk7CiAgICAgfQogCiAgICAgcmV0dXJuIHRydWU7CkBAIC05OTMsNyArMTAwMiw3IEBACiAgICAgQVN0cmluZyBBMTsKICAgICBBMS5hcHBlbmQobVVzZXIpOwogICAgIEExLmFwcGVuZCgiOiIpOwotICAgIEExLmFwcGVuZCgiU3RyZWFtaW5nIFNlcnZlciIpOworICAgIEExLmFwcGVuZChtUmVhbG0pOwogICAgIEExLmFwcGVuZCgiOiIpOwogICAgIEExLmFwcGVuZChtUGFzcyk7CiAKQEAgLTEwMjksNiArMTAzOCw5IEBACiAgICAgZnJhZ21lbnQuYXBwZW5kKCJcIiwgIik7CiAgICAgZnJhZ21lbnQuYXBwZW5kKCJyZXNwb25zZT1cIiIpOwogICAgIGZyYWdtZW50LmFwcGVuZChkaWdlc3QpOworICAgIGZyYWdtZW50LmFwcGVuZCgiXCIsICIpOworICAgIGZyYWdtZW50LmFwcGVuZCgicmVhbG09XCIiKTsKKyAgICBmcmFnbWVudC5hcHBlbmQobVJlYWxtKTsKICAgICBmcmFnbWVudC5hcHBlbmQoIlwiIik7CiAgICAgZnJhZ21lbnQuYXBwZW5kKCJcclxuIik7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5oCmluZGV4IDU2YjYwNGQuLjdjZGQ0YzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uaApAQCAtODQsNiArODQsNyBAQAogICAgIEFTdHJpbmcgbVVzZXIsIG1QYXNzOwogICAgIEF1dGhUeXBlIG1BdXRoVHlwZTsKICAgICBBU3RyaW5nIG1Ob25jZTsKKyAgICBBU3RyaW5nIG1SZWFsbTsKICAgICBpbnQgbVNvY2tldDsKICAgICBpbnQzMl90IG1Db25uZWN0aW9uSUQ7CiAgICAgaW50MzJfdCBtTmV4dENTZXE7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5jcHAKaW5kZXggY2MzNmI3OC4uYzA1M2JlOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmNwcApAQCAtMTQsNiArMTQsOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk5ldHdvcmtVdGlscyIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0VTRFMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0VTRFMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWQxYTY0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvRVNEUy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiRVNEU1Rlc3QiLAorICAgIGd0ZXN0OiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiRVNEU1Rlc3QuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJkYXRhc291cmNlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0VTRFMvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZmJjN2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgbW9kdWxlIGNvbmZpZyBmb3IgRVNEUyB1bml0IHRlc3QiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJFU0RTVGVzdCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJFU0RTVGVzdC0+L2RhdGEvbG9jYWwvdG1wL0VTRFNUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKKyAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0VTRFNUZXN0UmVzLTEuMC56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvRVNEU1Rlc3RSZXMvIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJFU0RTVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1mbGFnIiB2YWx1ZT0iLVAgL2RhdGEvbG9jYWwvdG1wL0VTRFNUZXN0UmVzLyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0VTRFNUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0VTRFMvRVNEU1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMWUwMGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0VTRFNUZXN0LmNwcApAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRVNEU1Rlc3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGZzdHJlYW0+CisKKyNpbmNsdWRlIDxFU0RTLmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPGRhdGFzb3VyY2UvRmlsZVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisKKyNpbmNsdWRlICJFU0RTVGVzdEVudmlyb25tZW50LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitzdGF0aWMgRVNEU1Rlc3RFbnZpcm9ubWVudCAqZ0VudiA9IG51bGxwdHI7CisKK3N0cnVjdCBFU0RTUGFyYW1zIHsKKyAgICBjb25zdCBjaGFyICppbnB1dEZpbGU7CisgICAgaW50MzJfdCBvYmplY3RUeXBlSW5kaWNhdGlvbjsKKyAgICBjb25zdCBjaGFyICpjb2RlY1NwZWNpZmljSW5mb0RhdGE7CisgICAgaW50MzJfdCBjb2RlY1NwZWNpZmljSW5mb0RhdGFTaXplOworICAgIGludDMyX3QgYml0cmF0ZU1heDsKKyAgICBpbnQzMl90IGJpdHJhdGVBdmc7Cit9OworCitjbGFzcyBFU0RTVW5pdFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHR1cGxlPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnB1dEZpbGUgKi8gY29uc3QgY2hhciAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPYmplY3RUeXBlSW5kaWNhdGlvbiAqLyBpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlY1NwZWNpZmljSW5mb0RhdGEgKi8gY29uc3QgY2hhciAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb2RlY1NwZWNpZmljSW5mb0RhdGFTaXplICovIGludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEJpdHJhdGVNYXggKi8gaW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQml0cmF0ZUF2ZyAqLyBpbnQzMl90Pj4geworICBwdWJsaWM6CisgICAgRVNEU1VuaXRUZXN0KCkgOiBtRVNEU0RhdGEobnVsbHB0cikgeworICAgICAgICBtRVNEU1BhcmFtcy5pbnB1dEZpbGUgPSBnZXQ8MD4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1FU0RTUGFyYW1zLm9iamVjdFR5cGVJbmRpY2F0aW9uID0gZ2V0PDE+KEdldFBhcmFtKCkpOworICAgICAgICBtRVNEU1BhcmFtcy5jb2RlY1NwZWNpZmljSW5mb0RhdGEgPSBnZXQ8Mj4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1FU0RTUGFyYW1zLmNvZGVjU3BlY2lmaWNJbmZvRGF0YVNpemUgPSBnZXQ8Mz4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1FU0RTUGFyYW1zLmJpdHJhdGVNYXggPSBnZXQ8ND4oR2V0UGFyYW0oKSk7CisgICAgICAgIG1FU0RTUGFyYW1zLmJpdHJhdGVBdmcgPSBnZXQ8NT4oR2V0UGFyYW0oKSk7CisgICAgfTsKKworICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1EYXRhU291cmNlKSBtRGF0YVNvdXJjZS5jbGVhcigpOworICAgICAgICBpZiAobUlucHV0RnApIHsKKyAgICAgICAgICAgIGZjbG9zZShtSW5wdXRGcCk7CisgICAgICAgICAgICBtSW5wdXRGcCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7IEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHJlYWRFU0RTRGF0YSgpKTsgfQorICAgIGNvbnN0IHZvaWQgKm1FU0RTRGF0YTsKKyAgICBzaXplX3QgbUVTRFNTaXplOworICAgIEVTRFNQYXJhbXMgbUVTRFNQYXJhbXM7CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkIHJlYWRFU0RTRGF0YSgpIHsKKyAgICAgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpICsgbUVTRFNQYXJhbXMuaW5wdXRGaWxlOworICAgICAgICBtSW5wdXRGcCA9IGZvcGVuKGlucHV0RmlsZS5jX3N0cigpLCAicmIiKTsKKyAgICAgICAgQVNTRVJUX05FKG1JbnB1dEZwLCBudWxscHRyKSA8PCAiRmlsZSBvcGVuIGZhaWxlZCBmb3IgZmlsZTogIiA8PCBpbnB1dEZpbGU7CisgICAgICAgIGludDMyX3QgZmQgPSBmaWxlbm8obUlucHV0RnApOworICAgICAgICBBU1NFUlRfR0UoZmQsIDApIDw8ICJGaWxlIGRlc2NyaXB0b3IgaW52YWxpZCBmb3IgZmlsZTogIiA8PCBpbnB1dEZpbGU7CisKKyAgICAgICAgc3RydWN0IHN0YXQgYnVmOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGF0KGlucHV0RmlsZS5jX3N0cigpLCAmYnVmKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkZhaWxlZCB0byBnZXQgcHJvcGVydGllcyBvZiBpbnB1dCBmaWxlOiAiIDw8IG1FU0RTUGFyYW1zLmlucHV0RmlsZTsKKyAgICAgICAgc2l6ZV90IGZpbGVTaXplID0gYnVmLnN0X3NpemU7CisKKyAgICAgICAgbURhdGFTb3VyY2UgPSBuZXcgRmlsZVNvdXJjZShkdXAoZmQpLCAwLCBmaWxlU2l6ZSk7CisgICAgICAgIEFTU0VSVF9ORShtRGF0YVNvdXJjZSwgbnVsbHB0cikgPDwgIlVuYWJsZSB0byBjcmVhdGUgZGF0YSBzb3VyY2UgZm9yIGZpbGU6ICIgPDwgaW5wdXRGaWxlOworCisgICAgICAgIHNwPElNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpDcmVhdGUobURhdGFTb3VyY2UpOworICAgICAgICBpZiAoZXh0cmFjdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1EYXRhU291cmNlLmNsZWFyKCk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIlVuYWJsZSB0byBjcmVhdGUgZXh0cmFjdG9yIGZvciBmaWxlOiAiIDw8IGlucHV0RmlsZTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBudW1UcmFja3MgPSBleHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CisgICAgICAgIEFTU0VSVF9HVChudW1UcmFja3MsIDApIDw8ICJObyB0cmFja3MgaW4gZmlsZTogIiA8PCBpbnB1dEZpbGU7CisgICAgICAgIEFTU0VSVF9UUlVFKGVzZHNEYXRhUHJlc2VudChudW1UcmFja3MsIGV4dHJhY3RvcikpCisgICAgICAgICAgICAgICAgPDwgIlVuYWJsZSB0byBmaW5kIGVzZHMgaW4gYW55IHRyYWNrIGluIGZpbGU6ICIgPDwgaW5wdXRGaWxlOworICAgIH0KKworICAgIGJvb2wgZXNkc0RhdGFQcmVzZW50KHNpemVfdCBudW1UcmFja3MsIHNwPElNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yKSB7CisgICAgICAgIGJvb2wgZm91bmRFU0RTID0gZmFsc2U7CisgICAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtVHJhY2tzOyArK2kpIHsKKyAgICAgICAgICAgIHNwPE1ldGFEYXRhPiB0cmFja01ldGEgPSBleHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoaSk7CisgICAgICAgICAgICBpZiAodHJhY2tNZXRhICE9IG51bGxwdHIgJiYKKyAgICAgICAgICAgICAgICB0cmFja01ldGEtPmZpbmREYXRhKGtLZXlFU0RTLCAmdHlwZSwgJm1FU0RTRGF0YSwgJm1FU0RTU2l6ZSkpIHsKKyAgICAgICAgICAgICAgICB0cmFja01ldGEtPmNsZWFyKCk7CisgICAgICAgICAgICAgICAgZm91bmRFU0RTID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZm91bmRFU0RTOworICAgIH0KKworICAgIEZJTEUgKm1JbnB1dEZwOworICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOworfTsKKworVEVTVF9QKEVTRFNVbml0VGVzdCwgSW52YWxpZERhdGFUZXN0KSB7CisgICAgdm9pZCAqaW52YWxpZERhdGEgPSBjYWxsb2MobUVTRFNTaXplLCAxKTsKKyAgICBBU1NFUlRfTkUoaW52YWxpZERhdGEsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5IjsKKyAgICBFU0RTIGVzZHMoaW52YWxpZERhdGEsIG1FU0RTU2l6ZSk7CisgICAgZnJlZShpbnZhbGlkRGF0YSk7CisgICAgQVNTRVJUX05FKGVzZHMuSW5pdENoZWNrKCksIE9LKSA8PCAiaW52YWxpZCBFU0RTIGRhdGEgYWNjZXB0ZWQiOworfQorCitURVNUKEVTRFNTYW5pdHlVbml0VGVzdCwgQ29uc3RydWN0b3JTYW5pdHlUZXN0KSB7CisgICAgdm9pZCAqaW52YWxpZERhdGEgPSBtYWxsb2MoMSk7CisgICAgQVNTRVJUX05FKGludmFsaWREYXRhLCBudWxscHRyKSA8PCAiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSI7CisgICAgRVNEUyBlc2RzX3plcm8oaW52YWxpZERhdGEsIDApOworICAgIGZyZWUoaW52YWxpZERhdGEpOworICAgIEFTU0VSVF9ORShlc2RzX3plcm8uSW5pdENoZWNrKCksIE9LKSA8PCAiaW52YWxpZCBFU0RTIGRhdGEgYWNjZXB0ZWQiOworCisgICAgRVNEUyBlc2RzX251bGwoTlVMTCwgMCk7CisgICAgQVNTRVJUX05FKGVzZHNfbnVsbC5Jbml0Q2hlY2soKSwgT0spIDw8ICJpbnZhbGlkIEVTRFMgZGF0YSBhY2NlcHRlZCI7Cit9CisKK1RFU1RfUChFU0RTVW5pdFRlc3QsIENyZWF0ZUFuZERlc3Ryb3lUZXN0KSB7CisgICAgRVNEUyBlc2RzKG1FU0RTRGF0YSwgbUVTRFNTaXplKTsKKyAgICBBU1NFUlRfRVEoZXNkcy5Jbml0Q2hlY2soKSwgT0spIDw8ICJFU0RTIGRhdGEgaW52YWxpZCI7Cit9CisKK1RFU1RfUChFU0RTVW5pdFRlc3QsIE9iamVjdFR5cGVJbmRpY2F0aW9uVGVzdCkgeworICAgIEVTRFMgZXNkcyhtRVNEU0RhdGEsIG1FU0RTU2l6ZSk7CisgICAgQVNTRVJUX0VRKGVzZHMuSW5pdENoZWNrKCksIE9LKSA8PCAiRVNEUyBkYXRhIGludmFsaWQiOworICAgIHVpbnQ4X3Qgb2JqZWN0VHlwZUluZGljYXRpb247CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZXNkcy5nZXRPYmplY3RUeXBlSW5kaWNhdGlvbigmb2JqZWN0VHlwZUluZGljYXRpb24pOworICAgIEFTU0VSVF9FUShzdGF0dXMsIE9LKSA8PCAiRVNEUyBvYmplY3RUeXBlSW5kaWNhdGlvbiBkYXRhIGludmFsaWQiOworICAgIEFTU0VSVF9FUShvYmplY3RUeXBlSW5kaWNhdGlvbiwgbUVTRFNQYXJhbXMub2JqZWN0VHlwZUluZGljYXRpb24pCisgICAgICAgICAgICA8PCAiRVNEUyBvYmplY3RUeXBlSW5kaWNhdGlvbiBkYXRhIGRvZXNuJ3QgbWF0Y2giOworfQorCitURVNUX1AoRVNEU1VuaXRUZXN0LCBDb2RlY1NwZWNpZmljSW5mb1Rlc3QpIHsKKyAgICBFU0RTIGVzZHMobUVTRFNEYXRhLCBtRVNEU1NpemUpOworICAgIEFTU0VSVF9FUShlc2RzLkluaXRDaGVjaygpLCBPSykgPDwgIkVTRFMgZGF0YSBpbnZhbGlkIjsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgY29uc3Qgdm9pZCAqY29kZWNTcGVjaWZpY0luZm87CisgICAgc2l6ZV90IGNvZGVjU3BlY2lmaWNJbmZvU2l6ZTsKKyAgICBzdGF0dXMgPSBlc2RzLmdldENvZGVjU3BlY2lmaWNJbmZvKCZjb2RlY1NwZWNpZmljSW5mbywgJmNvZGVjU3BlY2lmaWNJbmZvU2l6ZSk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spIDw8ICJFU0RTIGdldENvZGVjU3BlY2lmaWNJbmZvIGRhdGEgaW52YWxpZCI7CisgICAgQVNTRVJUX0VRKG1FU0RTUGFyYW1zLmNvZGVjU3BlY2lmaWNJbmZvRGF0YVNpemUsIGNvZGVjU3BlY2lmaWNJbmZvU2l6ZSkKKyAgICAgICAgICAgIDw8ICJDb2RlY1NwZWNpZmljSW5mbyBkYXRhIGRvZXNuJ3QgbWF0Y2giOworICAgIHN0YXR1cyA9IG1lbWNtcChjb2RlY1NwZWNpZmljSW5mbywgbUVTRFNQYXJhbXMuY29kZWNTcGVjaWZpY0luZm9EYXRhLCBjb2RlY1NwZWNpZmljSW5mb1NpemUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJDb2RlY1NwZWNpZmljSW5mbyBkYXRhIGRvZXNuJ3QgbWF0Y2giOworfQorCitURVNUX1AoRVNEU1VuaXRUZXN0LCBHZXRCaXRyYXRlVGVzdCkgeworICAgIEVTRFMgZXNkcyhtRVNEU0RhdGEsIG1FU0RTU2l6ZSk7CisgICAgQVNTRVJUX0VRKGVzZHMuSW5pdENoZWNrKCksIE9LKSA8PCAiRVNEUyBkYXRhIGludmFsaWQiOworICAgIHVpbnQzMl90IGJpdHJhdGVNYXg7CisgICAgdWludDMyX3QgYml0cmF0ZUF2ZzsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBlc2RzLmdldEJpdFJhdGUoJmJpdHJhdGVNYXgsICZiaXRyYXRlQXZnKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBPSykgPDwgIkVTRFMgYml0UmF0ZSBkYXRhIGludmFsaWQiOworICAgIEFTU0VSVF9FUShiaXRyYXRlTWF4LCBtRVNEU1BhcmFtcy5iaXRyYXRlTWF4KSA8PCAiRVNEUyBiaXRyYXRlTWF4IGRvZXNuJ3QgbWF0Y2giOworICAgIEFTU0VSVF9FUShiaXRyYXRlQXZnLCBtRVNEU1BhcmFtcy5iaXRyYXRlQXZnKSA8PCAiRVNEUyBiaXRyYXRlQXZnIGRvZXNuJ3QgbWF0Y2giOworICAgIEFTU0VSVF9MRShiaXRyYXRlQXZnLCBiaXRyYXRlTWF4KSA8PCAiRVNEUyBiaXRyYXRlTWF4IGlzIGxlc3MgdGhhbiBiaXRyYXRlQXZnIjsKK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBFU0RTVW5pdFRlc3RBbGwsIEVTRFNVbml0VGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgLy8gSW5wdXRGaWxlLCBPYmplY3RUeXBlSW5kaWNhdGlvbiwgQ29kZWNTcGVjaWZpY0luZm9EYXRhLAorICAgICAgICAgICAgICAgIC8vIENvZGVjU3BlY2lmaWNJbmZvRGF0YVNpemUsIEJpdHJhdGVNYXgsIEJpdHJhdGVBdmcKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ2aWRlb18xNzZ4MTQ0XzNncF9oMjYzXzU2a2Jwc18xMmZwc19hYWNfc3RlcmVvXzEyOGticHNfMjIwNTBoei4zZ3AiLCA2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDEzXHg5MCIsIDIsIDEzMTA3MiwgMCksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgidmlkZW9fMTI4MHg3MjBfbXA0X21wZWcyXzMwMDBrYnBzXzMwZnBzX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6Lm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICA5NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDAwXHgwMFx4MDFceEIzXHg1MFx4MDJceEQwXHgzNVx4RkZceEZGXHhFMVx4QTBceDAwXHgwMFx4MDFceEI1XHgxNSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJceDZBXHgwMFx4MDFceDAwXHgwMCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAyMiwgMzQxNTQ1MiwgMzQxNTQ1MiksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgidmlkZW9fMTc2eDE0NF8zZ3BfaDI2M181NmticHNfMjVmcHNfYWFjX21vbm9fMjRrYnBzXzExMDI1aHouM2dwIiwgNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiXHgxNVx4MDgiLCAyLCAyNDU3NiwgMCkpKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgLy8gTWVkaWFFeHRyYWN0b3IgbmVlZHMgYmluZGVyIHRocmVhZCBwb29sCisgICAgUHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOworICAgIGdFbnYgPSBuZXcgRVNEU1Rlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgQUxPR1YoIlRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0VTRFNUZXN0RW52aXJvbm1lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0VTRFMvRVNEU1Rlc3RFbnZpcm9ubWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYTIzMDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0VTRFNUZXN0RW52aXJvbm1lbnQuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0VTRFNfVEVTVF9FTlZJUk9OTUVOVF9IX18KKyNkZWZpbmUgX19FU0RTX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2NsYXNzIEVTRFNUZXN0RW52aXJvbm1lbnQgOiBwdWJsaWMgOjp0ZXN0aW5nOjpFbnZpcm9ubWVudCB7CisgIHB1YmxpYzoKKyAgICBFU0RTVGVzdEVudmlyb25tZW50KCkgOiByZXMoIi9kYXRhL2xvY2FsL3RtcC8iKSB7fQorCisgICAgLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisgICAgaW50IGluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworCisgICAgdm9pZCBzZXRSZXMoY29uc3QgY2hhciAqX3JlcykgeyByZXMgPSBfcmVzOyB9CisKKyAgICBjb25zdCBzdHJpbmcgZ2V0UmVzKCkgY29uc3QgeyByZXR1cm4gcmVzOyB9CisKKyAgcHJpdmF0ZToKKyAgICBzdHJpbmcgcmVzOworfTsKKworaW50IEVTRFNUZXN0RW52aXJvbm1lbnQ6OmluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7eyJyZXMiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwgezAsIDAsIDAsIDB9fTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIlA6Iiwgb3B0aW9ucywgJmluZGV4KTsKKyAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdQJzoKKyAgICAgICAgICAgICAgICBzZXRSZXMob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3B0aW5kIDwgYXJnYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIG9wdGlvbjogJXNcblxuIgorICAgICAgICAgICAgICAgICJ1c2FnZTogJXMgPGd0ZXN0IG9wdGlvbnM+IDx0ZXN0IG9wdGlvbnM+XG5cbiIKKyAgICAgICAgICAgICAgICAidGVzdCBvcHRpb25zIGFyZTpcblxuIgorICAgICAgICAgICAgICAgICItUCwgLS1wYXRoOiBSZXNvdXJjZSBmaWxlcyBkaXJlY3RvcnkgbG9jYXRpb25cbiIsCisgICAgICAgICAgICAgICAgYXJndltvcHRpbmQgPzogMV0sIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAgLy8gX19FU0RTX1RFU1RfRU5WSVJPTk1FTlRfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL1JFQURNRS5tZCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0VTRFMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMGZiODYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL1JFQURNRS5tZApAQCAtMCwwICsxLDQwIEBACisjIyBNZWRpYSBUZXN0aW5nICMjCistLS0KKyMjIyMgRVNEUyBVbml0IFRlc3QgOgorVGhlIEVTRFMgVW5pdCBUZXN0IFN1aXRlIHZhbGlkYXRlcyB0aGUgRVNEUyBjbGFzcyBhdmFpbGFibGUgaW4gbGlic3RhZ2VmcmlnaHQuCisKK1J1biB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHRoZSB0ZXN0IHN1aXRlOgorYGBgCittIEVTRFNUZXN0CitgYGAKKworVGhlIDMyLWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdC8KKworVGhlIDY0LWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0LworCitUbyB0ZXN0IDY0LWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3Q2NC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0L0VTRFNUZXN0L0VTRFNUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUbyB0ZXN0IDMyLWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3QuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvRVNEU1Rlc3QvRVNEU1Rlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9FU0RTL0VTRFNUZXN0UmVzLTEuMC56aXApCitEb3dubG9hZCwgdW56aXAgYW5kIHB1c2ggdGhlc2UgZmlsZXMgaW50byBkZXZpY2UgZm9yIHRlc3RpbmcuCisKK2BgYAorYWRiIHB1c2ggRVNEU1Rlc3RSZXMgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK3VzYWdlOiBFU0RTVGVzdCAtUCBcPHBhdGhfdG9fZm9sZGVyXD4KK2BgYAorYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9FU0RTVGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvRVNEU1Rlc3RSZXMvCitgYGAKK0FsdGVybmF0aXZlbHksIHRoZSB0ZXN0IGNhbiBhbHNvIGJlIHJ1biB1c2luZyBhdGVzdCBjb21tYW5kLgorCitgYGAKK2F0ZXN0IEVTRFNUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKK2BgYApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNmI5NTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJIRVZDVXRpbHNVbml0VGVzdCIsCisgICAgZ3Rlc3Q6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJIRVZDVXRpbHNVbml0VGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0hFVkMvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmODUwYTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgbW9kdWxlIGNvbmZpZyBmb3IgSEVWQyBVdGlscyB1bml0IHRlc3RzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iSEVWQ1V0aWxzVW5pdFRlc3QiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IkhFVkNVdGlsc1VuaXRUZXN0LT4vZGF0YS9sb2NhbC90bXAvSEVWQ1V0aWxzVW5pdFRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1maWxlIgorICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvSEVWQ1V0aWxzL0hFVkNVdGlsc1VuaXRUZXN0LnppcD91bnppcD10cnVlIgorICAgICAgICAgICAgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcC9IRVZDVXRpbHNVbml0VGVzdC8iIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisKKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9IkhFVkNVdGlsc1VuaXRUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWZsYWciIHZhbHVlPSItUCAvZGF0YS9sb2NhbC90bXAvSEVWQ1V0aWxzVW5pdFRlc3QvIiAvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0hFVkMvSEVWQ1V0aWxzVGVzdEVudmlyb25tZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL0hFVkNVdGlsc1Rlc3RFbnZpcm9ubWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NDgxZTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL0hFVkNVdGlsc1Rlc3RFbnZpcm9ubWVudC5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fSEVWQ19VVElMU19URVNUX0VOVklST05NRU5UX0hfXworI2RlZmluZSBfX0hFVkNfVVRJTFNfVEVTVF9FTlZJUk9OTUVOVF9IX18KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY2xhc3MgSEVWQ1V0aWxzVGVzdEVudmlyb25tZW50IDogcHVibGljOjp0ZXN0aW5nOjpFbnZpcm9ubWVudCB7CisgIHB1YmxpYzoKKyAgICBIRVZDVXRpbHNUZXN0RW52aXJvbm1lbnQoKSA6IHJlcygiL2RhdGEvbG9jYWwvdG1wLyIpIHt9CisKKyAgICAvLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyAgICBpbnQgaW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndik7CisKKyAgICB2b2lkIHNldFJlcyhjb25zdCBjaGFyICpfcmVzKSB7IHJlcyA9IF9yZXM7IH0KKworICAgIGNvbnN0IHN0cmluZyBnZXRSZXMoKSBjb25zdCB7IHJldHVybiByZXM7IH0KKworICBwcml2YXRlOgorICAgIHN0cmluZyByZXM7Cit9OworCitpbnQgSEVWQ1V0aWxzVGVzdEVudmlyb25tZW50Ojppbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0ge3sicGF0aCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnUCd9LCB7MCwgMCwgMCwgMH19OworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgaW50IGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiUDoiLCBvcHRpb25zLCAmaW5kZXgpOworICAgICAgICBpZiAoYyA9PSAtMSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ1AnOiB7CisgICAgICAgICAgICAgICAgc2V0UmVzKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG9wdGluZCA8IGFyZ2MpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBvcHRpb246ICVzXG5cbiIKKyAgICAgICAgICAgICAgICAidXNhZ2U6ICVzIDxndGVzdCBvcHRpb25zPiA8dGVzdCBvcHRpb25zPlxuXG4iCisgICAgICAgICAgICAgICAgInRlc3Qgb3B0aW9ucyBhcmU6XG5cbiIKKyAgICAgICAgICAgICAgICAiLVAsIC0tcGF0aDogUmVzb3VyY2UgZmlsZXMgZGlyZWN0b3J5IGxvY2F0aW9uXG4iLAorICAgICAgICAgICAgICAgIGFyZ3Zbb3B0aW5kID86IDFdLCBhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZW5kaWYgIC8vIF9fSEVWQ19VVElMU19URVNUX0VOVklST05NRU5UX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9IRVZDVXRpbHNVbml0VGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL0hFVkNVdGlsc1VuaXRUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjRhMDQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvSEVWQy9IRVZDVXRpbHNVbml0VGVzdC5jcHAKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkhldmNVdGlsaXR5VGVzdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGZzdHJlYW0+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KKyNpbmNsdWRlICJpbmNsdWRlL0hldmNVdGlscy5oIgorCisjaW5jbHVkZSAiSEVWQ1V0aWxzVGVzdEVudmlyb25tZW50LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisvLyBtYXggc2l6ZSBvZiBodmNjIGJveCBpcyAyIEtCCitjb25zdGV4cHIgdWludDMyX3Qga0h2Y2NCb3hNYXhTaXplID0gMjA0ODsKK2NvbnN0ZXhwciB1aW50MzJfdCBrSHZjY0JveE1pblNpemUgPSAyMDsKK2NvbnN0ZXhwciB1aW50MzJfdCBrVlBTQ29kZSA9IDMyOworY29uc3RleHByIHVpbnQzMl90IGtTUFNDb2RlID0gMzM7Citjb25zdGV4cHIgdWludDMyX3Qga1BQU0NvZGUgPSAzNDsKK2NvbnN0ZXhwciB1aW50MzJfdCBrTkFMU2l6ZUxlbmd0aCA9IDI7CisKK3N0YXRpYyBIRVZDVXRpbHNUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOworCitjbGFzcyBIRVZDVXRpbHNVbml0VGVzdAorICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTwKKyAgICAgICAgICAgICAgdHVwbGU8LypmaWxlTmFtZSovIHN0cmluZywgLyppbmZvRmlsZU5hbWUqLyBzdHJpbmcsIC8qbnVtVlBTTmFscyovIHNpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgLypudW1TUFNOYWxzKi8gc2l6ZV90LCAvKm51bVBQU05hbHMqLyBzaXplX3QsIC8qZnJhbWVSYXRlKi8gaW50MTZfdCwKKyAgICAgICAgICAgICAgICAgICAgLyppc0hkciovIGJvb2w+PiB7CisgIHB1YmxpYzoKKyAgICB+SEVWQ1V0aWxzVW5pdFRlc3QoKSB7CisgICAgICAgIGlmIChtTWVkaWFGaWxlU3RyZWFtLmlzX29wZW4oKSkgbU1lZGlhRmlsZVN0cmVhbS5jbG9zZSgpOworICAgICAgICBpZiAobUluZm9GaWxlU3RyZWFtLmlzX29wZW4oKSkgbUluZm9GaWxlU3RyZWFtLmNsb3NlKCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICB0dXBsZTxzdHJpbmcsIHN0cmluZywgc2l6ZV90LCBzaXplX3QsIHNpemVfdCwgaW50MTZfdCwgYm9vbD4gcGFyYW1zID0gR2V0UGFyYW0oKTsKKyAgICAgICAgc3RyaW5nIGlucHV0TWVkaWFGaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MD4ocGFyYW1zKTsKKyAgICAgICAgbU1lZGlhRmlsZVN0cmVhbS5vcGVuKGlucHV0TWVkaWFGaWxlLCBpZnN0cmVhbTo6aW4pOworICAgICAgICBBU1NFUlRfVFJVRShtTWVkaWFGaWxlU3RyZWFtLmlzX29wZW4oKSkgPDwgIkZhaWxlZCB0byBvcGVuIG1lZGlhIGZpbGU6ICIgPDwgaW5wdXRNZWRpYUZpbGU7CisKKyAgICAgICAgc3RyaW5nIGlucHV0SW5mb0ZpbGUgPSBnRW52LT5nZXRSZXMoKSArIGdldDwxPihwYXJhbXMpOworICAgICAgICBtSW5mb0ZpbGVTdHJlYW0ub3BlbihpbnB1dEluZm9GaWxlLCBpZnN0cmVhbTo6aW4pOworICAgICAgICBBU1NFUlRfVFJVRShtSW5mb0ZpbGVTdHJlYW0uaXNfb3BlbigpKSA8PCAiRmFpbGVkIHRvIG9wZW4gaW5mbyBmaWxlOiAiIDw8IGlucHV0SW5mb0ZpbGU7CisKKyAgICAgICAgbU51bVZQU05hbHMgPSBnZXQ8Mj4ocGFyYW1zKTsKKyAgICAgICAgbU51bVNQU05hbHMgPSBnZXQ8Mz4ocGFyYW1zKTsKKyAgICAgICAgbU51bVBQU05hbHMgPSBnZXQ8ND4ocGFyYW1zKTsKKyAgICAgICAgbUZyYW1lUmF0ZSA9IGdldDw1PihwYXJhbXMpOworICAgICAgICBtSXNIRFIgPSBnZXQ8Nj4ocGFyYW1zKTsKKyAgICB9CisKKyAgICBzaXplX3QgbU51bVZQU05hbHM7CisgICAgc2l6ZV90IG1OdW1TUFNOYWxzOworICAgIHNpemVfdCBtTnVtUFBTTmFsczsKKyAgICBpbnQxNl90IG1GcmFtZVJhdGU7CisgICAgYm9vbCBtSXNIRFI7CisgICAgaWZzdHJlYW0gbU1lZGlhRmlsZVN0cmVhbTsKKyAgICBpZnN0cmVhbSBtSW5mb0ZpbGVTdHJlYW07Cit9OworCitURVNUX1AoSEVWQ1V0aWxzVW5pdFRlc3QsIE5BTFVuaXRUZXN0KSB7CisgICAgSGV2Y1BhcmFtZXRlclNldHMgaGV2Y1BhcmFtczsKKworICAgIHN0cmluZyBsaW5lOworICAgIGludDMyX3QgaW5kZXggPSAwOworICAgIHN0YXR1c190IGVycjsKKyAgICB3aGlsZSAoZ2V0bGluZShtSW5mb0ZpbGVTdHJlYW0sIGxpbmUpKSB7CisgICAgICAgIHN0cmluZyB0eXBlOworICAgICAgICBpbnQzMl90IGNodW5rTGVuZ3RoOworCisgICAgICAgIGlzdHJpbmdzdHJlYW0gc3RyaW5nTGluZShsaW5lKTsKKyAgICAgICAgc3RyaW5nTGluZSA+PiB0eXBlID4+IGNodW5rTGVuZ3RoOworICAgICAgICBBU1NFUlRfR1QoY2h1bmtMZW5ndGgsIDApIDw8ICJMZW5ndGggb2YgZGF0YSBjaHVuayBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIjsKKworICAgICAgICBjaGFyICpkYXRhID0gKGNoYXIgKiltYWxsb2MoY2h1bmtMZW5ndGgpOworICAgICAgICBBU1NFUlRfTkUoZGF0YSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBhbGxvY2F0ZSBkYXRhIGJ1ZmZlciBvZiBzaXplOiAiIDw8IGNodW5rTGVuZ3RoOworCisgICAgICAgIG1NZWRpYUZpbGVTdHJlYW0ucmVhZChkYXRhLCBjaHVua0xlbmd0aCk7CisgICAgICAgIEFTU0VSVF9FUShtTWVkaWFGaWxlU3RyZWFtLmdjb3VudCgpLCBjaHVua0xlbmd0aCkKKyAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIHJlYWQgY29tcGxldGUgZmlsZSwgYnl0ZXMgcmVhZDogIiA8PCBtTWVkaWFGaWxlU3RyZWFtLmdjb3VudCgpOworCisgICAgICAgIC8vIEEgdmFsaWQgc3RhcnRjb2RlIGNvbnNpc3RzIG9mIGF0IGxlYXN0IHR3byAweDAwIGJ5dGVzIGZvbGxvd2VkIGJ5IDB4MDEuCisgICAgICAgIGludDMyX3Qgb2Zmc2V0ID0gMDsKKyAgICAgICAgZm9yICg7IG9mZnNldCArIDIgPCBjaHVua0xlbmd0aDsgKytvZmZzZXQpIHsKKyAgICAgICAgICAgIGlmIChkYXRhW29mZnNldCArIDJdID09IDB4MDEgJiYgZGF0YVtvZmZzZXQgKyAxXSA9PSAweDAwICYmIGRhdGFbb2Zmc2V0XSA9PSAweDAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0ICs9IDM7CisgICAgICAgIEFTU0VSVF9MRShvZmZzZXQsIGNodW5rTGVuZ3RoKSA8PCAiTkFMIHVuaXQgb2Zmc2V0IG11c3Qgbm90IGV4Y2VlZCB0aGUgY2h1bmsgbGVuZ3RoIjsKKworICAgICAgICB1aW50OF90ICpuYWxVbml0ID0gKHVpbnQ4X3QgKikoZGF0YSArIG9mZnNldCk7CisgICAgICAgIHNpemVfdCBuYWxVbml0TGVuZ3RoID0gY2h1bmtMZW5ndGggLSBvZmZzZXQ7CisKKyAgICAgICAgLy8gQWRkIE5BTCB1bml0cyBvbmx5IGlmIHRoZXkncmUgb2YgdHlwZTogVlBTL1NQUy9QUFMvU0VJCisgICAgICAgIGlmICghKCh0eXBlLmNvbXBhcmUoIlZQUyIpICYmIHR5cGUuY29tcGFyZSgiU1BTIikgJiYgdHlwZS5jb21wYXJlKCJQUFMiKSAmJgorICAgICAgICAgICAgICAgdHlwZS5jb21wYXJlKCJTRUkiKSkpKSB7CisgICAgICAgICAgICBlcnIgPSBoZXZjUGFyYW1zLmFkZE5hbFVuaXQobmFsVW5pdCwgbmFsVW5pdExlbmd0aCk7CisgICAgICAgICAgICBBU1NFUlRfRVEoZXJyLCAoc3RhdHVzX3QpT0spCisgICAgICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gYWRkIE5BTCBVbml0IHR5cGU6ICIgPDwgdHlwZSA8PCAiIFNpemU6ICIgPDwgbmFsVW5pdExlbmd0aDsKKworICAgICAgICAgICAgc2l6ZV90IHNpemVOYWxVbml0ID0gaGV2Y1BhcmFtcy5nZXRTaXplKGluZGV4KTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShzaXplTmFsVW5pdCwgbmFsVW5pdExlbmd0aCkgPDwgIkludmFsaWQgc2l6ZSByZXR1cm5lZCBmb3IgTkFMOiAiIDw8IHR5cGU7CisKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRlc3RpbmF0aW9uID0gKHVpbnQ4X3QgKiltYWxsb2MobmFsVW5pdExlbmd0aCk7CisgICAgICAgICAgICBBU1NFUlRfTkUoZGVzdGluYXRpb24sIG51bGxwdHIpCisgICAgICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgYnVmZmVyIG9mIHNpemU6ICIgPDwgbmFsVW5pdExlbmd0aDsKKworICAgICAgICAgICAgYm9vbCBzdGF0dXMgPSBoZXZjUGFyYW1zLndyaXRlKGluZGV4LCBkZXN0aW5hdGlvbiwgbmFsVW5pdExlbmd0aCk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJVbmFibGUgdG8gd3JpdGUgTkFMIFVuaXQgZGF0YSI7CisKKyAgICAgICAgICAgIGZyZWUoZGVzdGluYXRpb24pOworICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVyciA9IGhldmNQYXJhbXMuYWRkTmFsVW5pdChuYWxVbml0LCBuYWxVbml0TGVuZ3RoKTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShlcnIsIChzdGF0dXNfdClPSykgPDwgIkludmFsaWQgTkFMIFVuaXQgYWRkZWQsIHR5cGU6ICIgPDwgdHlwZTsKKyAgICAgICAgfQorICAgICAgICBmcmVlKGRhdGEpOworICAgIH0KKworICAgIHNpemVfdCBudW1OYWxVbml0cyA9IGhldmNQYXJhbXMuZ2V0TnVtTmFsVW5pdHNPZlR5cGUoa1ZQU0NvZGUpOworICAgIEFTU0VSVF9FUShudW1OYWxVbml0cywgbU51bVZQU05hbHMpIDw8ICJXcm9uZyBudW1iZXIgb2YgVlBTIE5BTCBVbml0cyI7CisKKyAgICBudW1OYWxVbml0cyA9IGhldmNQYXJhbXMuZ2V0TnVtTmFsVW5pdHNPZlR5cGUoa1NQU0NvZGUpOworICAgIEFTU0VSVF9FUShudW1OYWxVbml0cywgbU51bVNQU05hbHMpIDw8ICJXcm9uZyBudW1iZXIgb2YgU1BTIE5BTCBVbml0cyI7CisKKyAgICBudW1OYWxVbml0cyA9IGhldmNQYXJhbXMuZ2V0TnVtTmFsVW5pdHNPZlR5cGUoa1BQU0NvZGUpOworICAgIEFTU0VSVF9FUShudW1OYWxVbml0cywgbU51bVBQU05hbHMpIDw8ICJXcm9uZyBudW1iZXIgb2YgUFBTIE5BTCBVbml0cyI7CisKKyAgICBIZXZjUGFyYW1ldGVyU2V0czo6SW5mbyBpbmZvID0gaGV2Y1BhcmFtcy5nZXRJbmZvKCk7CisgICAgQVNTRVJUX0VRKGluZm8gJiBIZXZjUGFyYW1ldGVyU2V0czo6a0luZm9Jc0hkciwKKyAgICAgICAgICAgICAgKG1Jc0hEUiA/IEhldmNQYXJhbWV0ZXJTZXRzOjprSW5mb0lzSGRyIDogSGV2Y1BhcmFtZXRlclNldHM6OmtJbmZvTm9uZSkpCisgICAgICAgICAgICA8PCAiV3JvbmcgaW5mbyBhYm91dCBIRFIiOworCisgICAgQVNTRVJUX0VRKGluZm8gJiBIZXZjUGFyYW1ldGVyU2V0czo6a0luZm9IYXNDb2xvckRlc2NyaXB0aW9uLAorICAgICAgICAgICAgICAobUlzSERSID8gSGV2Y1BhcmFtZXRlclNldHM6OmtJbmZvSGFzQ29sb3JEZXNjcmlwdGlvbiA6IEhldmNQYXJhbWV0ZXJTZXRzOjprSW5mb05vbmUpKQorICAgICAgICAgICAgPDwgIldyb25nIGluZm8gYWJvdXQgY29sb3IgZGVzY3JpcHRpb24iOworCisgICAgLy8gYW4gSEVWQyBmaWxlIHN0YXJ0cyB3aXRoIFZQUywgU1BTIGFuZCBQUFMgTkFMIHVuaXRzIGluIHNlcXVlbmNlLgorICAgIHVpbnQ4X3QgdHlwZU5hbFVuaXQgPSBoZXZjUGFyYW1zLmdldFR5cGUoMCk7CisgICAgQVNTRVJUX0VRKHR5cGVOYWxVbml0LCBrSGV2Y05hbFVuaXRUeXBlVnBzKQorICAgICAgICAgICAgPDwgIkV4cGVjdGVkIE5BTCB0eXBlOiAzMihWUFMpLCBmb3VuZDogIiA8PCB0eXBlTmFsVW5pdDsKKworICAgIHR5cGVOYWxVbml0ID0gaGV2Y1BhcmFtcy5nZXRUeXBlKDEpOworICAgIEFTU0VSVF9FUSh0eXBlTmFsVW5pdCwga0hldmNOYWxVbml0VHlwZVNwcykKKyAgICAgICAgICAgIDw8ICJFeHBlY3RlZCBOQUwgdHlwZTogMzMoU1BTKSwgZm91bmQ6ICIgPDwgdHlwZU5hbFVuaXQ7CisKKyAgICB0eXBlTmFsVW5pdCA9IGhldmNQYXJhbXMuZ2V0VHlwZSgyKTsKKyAgICBBU1NFUlRfRVEodHlwZU5hbFVuaXQsIGtIZXZjTmFsVW5pdFR5cGVQcHMpCisgICAgICAgICAgICA8PCAiRXhwZWN0ZWQgTkFMIHR5cGU6IDM0KFBQUyksIGZvdW5kOiAiIDw8IHR5cGVOYWxVbml0OworCisgICAgc2l6ZV90IGh2Y2NCb3hTaXplID0ga0h2Y2NCb3hNYXhTaXplOworICAgIHVpbnQ4X3QgKmh2Y2MgPSAodWludDhfdCAqKW1hbGxvYyhrSHZjY0JveE1heFNpemUpOworICAgIEFTU0VSVF9ORShodmNjLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIGEgaHZjYyBidWZmZXIgb2Ygc2l6ZTogIiA8PCBrSHZjY0JveE1heFNpemU7CisKKyAgICBlcnIgPSBoZXZjUGFyYW1zLm1ha2VIdmNjKGh2Y2MsICZodmNjQm94U2l6ZSwga05BTFNpemVMZW5ndGgpOworICAgIEFTU0VSVF9FUShlcnIsIChzdGF0dXNfdClPSykgPDwgIlVuYWJsZSB0byBjcmVhdGUgaHZjYyBib3giOworCisgICAgQVNTRVJUX0dUKGh2Y2NCb3hTaXplLCBrSHZjY0JveE1pblNpemUpCisgICAgICAgICAgICA8PCAiSHZjYyBib3ggc2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAiIDw8IGtIdmNjQm94TWluU2l6ZTsKKworICAgIGludDE2X3QgZnJhbWVSYXRlID0gaHZjY1trSHZjY0JveE1pblNpemUgLSAxXSB8IChodmNjW2tIdmNjQm94TWluU2l6ZV0gPDwgOCk7CisgICAgaWYgKGZyYW1lUmF0ZSAhPSBtRnJhbWVSYXRlKQorICAgICAgICBjb3V0IDw8ICJbICAgV0FSTiAgIF0gRXhwZWN0ZWQgZnJhbWUgcmF0ZTogIiA8PCBtRnJhbWVSYXRlIDw8ICIgRm91bmQ6ICIgPDwgZnJhbWVSYXRlCisgICAgICAgICAgICAgPDwgZW5kbDsKKworICAgIGZyZWUoaHZjYyk7Cit9CisKKy8vIEluZm8gRmlsZSBjb250YWlucyB0aGUgdHlwZSBhbmQgbGVuZ3RoIGZvciBlYWNoIGNodW5rL2ZyYW1lCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIEhFVkNVdGlsc1VuaXRUZXN0QWxsLCBIRVZDVXRpbHNVbml0VGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV90dXBsZSgiY3Jvd2RfMzg0MHgyMTYwcDUwZjMwMF8zMjUwMGticHMuaGV2YyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzM4NDB4MjE2MHA1MGYzMDBfMzI1MDBrYnBzLmluZm8iLCAxLCAxLCAxLCA1MCwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF8xOTIweDEwODBwMjRmMzAwXzQ1MDBrYnBzLmhldmMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjcm93ZF8xOTIweDEwODBwMjRmMzAwXzQ1MDBrYnBzLmluZm8iLCAxLCAxLCAxLCAyNCwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF8xMjgweDcyMHAyNGYzMDBfMzAwMGticHMuaGV2YyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNyb3dkXzEyODB4NzIwcDI0ZjMwMF8zMDAwa2Jwcy5pbmZvIiwgMSwgMSwgMSwgMjQsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfNjQweDM2MHAyNGYzMDBfNTAwa2Jwcy5oZXZjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY3Jvd2RfNjQweDM2MHAyNGYzMDBfNTAwa2Jwcy5pbmZvIiwgMSwgMSwgMSwgMjQsIGZhbHNlKSkpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IEhFVkNVdGlsc1Rlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgQUxPR1YoIlRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL1JFQURNRS5tZCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0hFVkMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMGU5OWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9IRVZDL1JFQURNRS5tZApAQCAtMCwwICsxLDM5IEBACisjIyBNZWRpYSBUZXN0aW5nICMjCistLS0KKyMjIyMgSEVWQyBVdGlscyBUZXN0CitUaGUgSEVWQyBVdGlsaXR5IFVuaXQgVGVzdCBTdWl0ZSB2YWxpZGF0ZXMgdGhlIEhldmNVdGlscyBsaWJyYXJ5IGF2YWlsYWJsZSBpbiBsaWJzdGFnZWZyaWdodC4KKworUnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQgdGhlIHRlc3Qgc3VpdGU6CitgYGAKK20gSEVWQ1V0aWxzVW5pdFRlc3QKK2BgYAorCitUaGUgMzItYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0LworCitUaGUgNjQtYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvCisKK1RvIHRlc3QgNjQtYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdDY0LgorYGBgCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvSEVWQ1V0aWxzVW5pdFRlc3QvSEVWQ1V0aWxzVW5pdFRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RvIHRlc3QgMzItYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdC9IRVZDVXRpbHNVbml0VGVzdC9IRVZDVXRpbHNVbml0VGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKworVGhlIHJlc291cmNlIGZpbGUgZm9yIHRoZSB0ZXN0cyBpcyB0YWtlbiBmcm9tIFtoZXJlXShodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvSEVWQ1V0aWxzL0hFVkNVdGlsc1VuaXRUZXN0LnppcCkuIERvd25sb2FkLCB1bnppcCBhbmQgcHVzaCB0aGVzZSBmaWxlcyBpbnRvIGRldmljZSBmb3IgdGVzdGluZy4KKworYGBgCithZGIgcHVzaCBIRVZDVXRpbHNVbml0VGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKwordXNhZ2U6IEhFVkNVdGlsc1VuaXRUZXN0IC1QIFw8cGF0aF90b19mb2xkZXJcPgorYGBgCithZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL0hFVkNVdGlsc1VuaXRUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC9IRVZDVXRpbHNVbml0VGVzdC8KK2BgYAorQWx0ZXJuYXRpdmVseSwgdGhlIHRlc3QgY2FuIGFsc28gYmUgcnVuIHVzaW5nIGF0ZXN0IGNvbW1hbmQuCisKK2BgYAorYXRlc3QgSEVWQ1V0aWxzVW5pdFRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorYGBgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZWRpYWNvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZWRpYWNvZGVjL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA2ODY0ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21lZGlhY29kZWMvQW5kcm9pZC5icApAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIm1lZGlhY29kZWNUZXN0IiwKKyAgICBndGVzdDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIk1lZGlhQ29kZWNUZXN0LmNwcCIsCisgICAgICAgICJNZWRpYVRlc3RIZWxwZXIuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhX2NvZGVjbGlzdCIsCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAorICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfY29kZWNiYXNlIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliZ21vY2siLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCisKKyAgICB0ZXN0X3N1aXRlczogWworICAgICAgICAiZ2VuZXJhbC10ZXN0cyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21lZGlhY29kZWMvTWVkaWFDb2RlY1Rlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWVkaWFjb2RlYy9NZWRpYUNvZGVjVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFhODZjMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21lZGlhY29kZWMvTWVkaWFDb2RlY1Rlc3QuY3BwCkBAIC0wLDAgKzEsMjY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGZ1dHVyZT4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKKyNpbmNsdWRlIDxnbW9jay9nbW9jay5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjSW5mby5oPgorCisjaW5jbHVkZSAiTWVkaWFUZXN0SGVscGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTW9ja0J1ZmZlckNoYW5uZWwgOiBwdWJsaWMgQnVmZmVyQ2hhbm5lbEJhc2UgeworcHVibGljOgorICAgIH5Nb2NrQnVmZmVyQ2hhbm5lbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIE1PQ0tfTUVUSE9EKHZvaWQsIHNldENyeXB0bywgKGNvbnN0IHNwPElDcnlwdG8+ICZjcnlwdG8pLCAob3ZlcnJpZGUpKTsKKyAgICBNT0NLX01FVEhPRCh2b2lkLCBzZXREZXNjcmFtYmxlciwgKGNvbnN0IHNwPElEZXNjcmFtYmxlcj4gJmRlc2NyYW1ibGVyKSwgKG92ZXJyaWRlKSk7CisgICAgTU9DS19NRVRIT0Qoc3RhdHVzX3QsIHF1ZXVlSW5wdXRCdWZmZXIsIChjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKSwgKG92ZXJyaWRlKSk7CisgICAgTU9DS19NRVRIT0Qoc3RhdHVzX3QsIHF1ZXVlU2VjdXJlSW5wdXRCdWZmZXIsCisgICAgICAgICAgICAoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgICBib29sIHNlY3VyZSwKKyAgICAgICAgICAgICBjb25zdCB1aW50OF90ICprZXksCisgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaXYsCisgICAgICAgICAgICAgQ3J5cHRvUGx1Z2luOjpNb2RlIG1vZGUsCisgICAgICAgICAgICAgQ3J5cHRvUGx1Z2luOjpQYXR0ZXJuIHBhdHRlcm4sCisgICAgICAgICAgICAgY29uc3QgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUgKnN1YlNhbXBsZXMsCisgICAgICAgICAgICAgc2l6ZV90IG51bVN1YlNhbXBsZXMsCisgICAgICAgICAgICAgQVN0cmluZyAqZXJyb3JEZXRhaWxNc2cpLAorICAgICAgICAgICAgKG92ZXJyaWRlKSk7CisgICAgTU9DS19NRVRIT0Qoc3RhdHVzX3QsIGF0dGFjaEJ1ZmZlciwKKyAgICAgICAgICAgIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMkJ1ZmZlciwgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciksCisgICAgICAgICAgICAob3ZlcnJpZGUpKTsKKyAgICBNT0NLX01FVEhPRChzdGF0dXNfdCwgYXR0YWNoRW5jcnlwdGVkQnVmZmVyLAorICAgICAgICAgICAgKGNvbnN0IHNwPGhhcmR3YXJlOjpIaWRsTWVtb3J5PiAmbWVtb3J5LAorICAgICAgICAgICAgIGJvb2wgc2VjdXJlLAorICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmtleSwKKyAgICAgICAgICAgICBjb25zdCB1aW50OF90ICppdiwKKyAgICAgICAgICAgICBDcnlwdG9QbHVnaW46Ok1vZGUgbW9kZSwKKyAgICAgICAgICAgICBDcnlwdG9QbHVnaW46OlBhdHRlcm4gcGF0dGVybiwKKyAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0LAorICAgICAgICAgICAgIGNvbnN0IENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlICpzdWJTYW1wbGVzLAorICAgICAgICAgICAgIHNpemVfdCBudW1TdWJTYW1wbGVzLAorICAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIpLAorICAgICAgICAgICAgKG92ZXJyaWRlKSk7CisgICAgTU9DS19NRVRIT0Qoc3RhdHVzX3QsIHJlbmRlck91dHB1dEJ1ZmZlciwKKyAgICAgICAgICAgIChjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLCBpbnQ2NF90IHRpbWVzdGFtcE5zKSwKKyAgICAgICAgICAgIChvdmVycmlkZSkpOworICAgIE1PQ0tfTUVUSE9EKHN0YXR1c190LCBkaXNjYXJkQnVmZmVyLCAoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciksIChvdmVycmlkZSkpOworICAgIE1PQ0tfTUVUSE9EKHZvaWQsIGdldElucHV0QnVmZmVyQXJyYXksIChWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICphcnJheSksIChvdmVycmlkZSkpOworICAgIE1PQ0tfTUVUSE9EKHZvaWQsIGdldE91dHB1dEJ1ZmZlckFycmF5LCAoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpLCAob3ZlcnJpZGUpKTsKK307CisKK2NsYXNzIE1vY2tDb2RlYyA6IHB1YmxpYyBDb2RlY0Jhc2UgeworcHVibGljOgorICAgIE1vY2tDb2RlYyhzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE1vY2tCdWZmZXJDaGFubmVsPiAmKT4gbW9jaykgeworICAgICAgICBtTW9ja0J1ZmZlckNoYW5uZWwgPSBzdGQ6Om1ha2Vfc2hhcmVkPE1vY2tCdWZmZXJDaGFubmVsPigpOworICAgICAgICBtb2NrKG1Nb2NrQnVmZmVyQ2hhbm5lbCk7CisgICAgfQorICAgIH5Nb2NrQ29kZWMoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBNT0NLX01FVEhPRCh2b2lkLCBpbml0aWF0ZUFsbG9jYXRlQ29tcG9uZW50LCAoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpLCAob3ZlcnJpZGUpKTsKKyAgICBNT0NLX01FVEhPRCh2b2lkLCBpbml0aWF0ZUNvbmZpZ3VyZUNvbXBvbmVudCwgKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSwgKG92ZXJyaWRlKSk7CisgICAgTU9DS19NRVRIT0Qodm9pZCwgaW5pdGlhdGVDcmVhdGVJbnB1dFN1cmZhY2UsICgpLCAob3ZlcnJpZGUpKTsKKyAgICBNT0NLX01FVEhPRCh2b2lkLCBpbml0aWF0ZVNldElucHV0U3VyZmFjZSwgKGNvbnN0IHNwPFBlcnNpc3RlbnRTdXJmYWNlPiAmc3VyZmFjZSksIChvdmVycmlkZSkpOworICAgIE1PQ0tfTUVUSE9EKHZvaWQsIGluaXRpYXRlU3RhcnQsICgpLCAob3ZlcnJpZGUpKTsKKyAgICBNT0NLX01FVEhPRCh2b2lkLCBpbml0aWF0ZVNodXRkb3duLCAoYm9vbCBrZWVwQ29tcG9uZW50QWxsb2NhdGVkKSwgKG92ZXJyaWRlKSk7CisgICAgTU9DS19NRVRIT0Qodm9pZCwgb25NZXNzYWdlUmVjZWl2ZWQsIChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyksIChvdmVycmlkZSkpOworICAgIE1PQ0tfTUVUSE9EKHN0YXR1c190LCBzZXRTdXJmYWNlLCAoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpLCAob3ZlcnJpZGUpKTsKKyAgICBNT0NLX01FVEhPRCh2b2lkLCBzaWduYWxGbHVzaCwgKCksIChvdmVycmlkZSkpOworICAgIE1PQ0tfTUVUSE9EKHZvaWQsIHNpZ25hbFJlc3VtZSwgKCksIChvdmVycmlkZSkpOworICAgIE1PQ0tfTUVUSE9EKHZvaWQsIHNpZ25hbFJlcXVlc3RJRFJGcmFtZSwgKCksIChvdmVycmlkZSkpOworICAgIE1PQ0tfTUVUSE9EKHZvaWQsIHNpZ25hbFNldFBhcmFtZXRlcnMsIChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyksIChvdmVycmlkZSkpOworICAgIE1PQ0tfTUVUSE9EKHZvaWQsIHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0sICgpLCAob3ZlcnJpZGUpKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJDaGFubmVsQmFzZT4gZ2V0QnVmZmVyQ2hhbm5lbCgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1Nb2NrQnVmZmVyQ2hhbm5lbDsKKyAgICB9CisKKyAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8Q29kZWNDYWxsYmFjaz4gJmNhbGxiYWNrKCkgeworICAgICAgICByZXR1cm4gbUNhbGxiYWNrOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxNb2NrQnVmZmVyQ2hhbm5lbD4gbU1vY2tCdWZmZXJDaGFubmVsOworfTsKKworY2xhc3MgQ291bnRlciB7CitwdWJsaWM6CisgICAgQ291bnRlcigpID0gZGVmYXVsdDsKKyAgICBleHBsaWNpdCBDb3VudGVyKGludDMyX3QgaW5pdENvdW50KSA6IG1Db3VudChpbml0Q291bnQpIHt9CisgICAgfkNvdW50ZXIoKSA9IGRlZmF1bHQ7CisKKyAgICBpbnQzMl90IGFkdmFuY2UoKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICArK21Db3VudDsKKyAgICAgICAgbUNvbmRpdGlvbi5ub3RpZnlfYWxsKCk7CisgICAgICAgIHJldHVybiBtQ291bnQ7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlcCwgdHlwZW5hbWUgUGVyaW9kLCB0eXBlbmFtZSAuLi5BcmdzPgorICAgIGludDMyX3Qgd2FpdEZvcihjb25zdCBzdGQ6OmNocm9ubzo6ZHVyYXRpb248UmVwLCBQZXJpb2Q+ICZkdXJhdGlvbiwgQXJncy4uLiB2YWx1ZXMpIHsKKyAgICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PGludDMyX3Q+IGxpc3QgPSB7dmFsdWVzLi4ufTsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIG1Db25kaXRpb24ud2FpdF9mb3IoCisgICAgICAgICAgICAgICAgbG9jaywKKyAgICAgICAgICAgICAgICBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICBbJmxpc3QsIHRoaXNdeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjpmaW5kKGxpc3QuYmVnaW4oKSwgbGlzdC5lbmQoKSwgbUNvdW50KSAhPSBsaXN0LmVuZCgpOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICByZXR1cm4gbUNvdW50OworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSAuLi5BcmdzPgorICAgIGludDMyX3Qgd2FpdChBcmdzLi4uIHZhbHVlcykgeworICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8aW50MzJfdD4gbGlzdCA9IHt2YWx1ZXMuLi59OworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgbUNvbmRpdGlvbi53YWl0KAorICAgICAgICAgICAgICAgIGxvY2ssCisgICAgICAgICAgICAgICAgWyZsaXN0LCB0aGlzXXsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6ZmluZChsaXN0LmJlZ2luKCksIGxpc3QuZW5kKCksIG1Db3VudCkgIT0gbGlzdC5lbmQoKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIG1Db3VudDsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbUNvbmRpdGlvbjsKKyAgICBpbnQzMl90IG1Db3VudCA9IDA7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIDo6dGVzdGluZzo6XzsKKworVEVTVChNZWRpYUNvZGVjVGVzdCwgUmVjbGFpbVJlbGVhc2VSYWNlKSB7CisgICAgLy8gVGVzdCBzY2VuYXJpbzoKKyAgICAvLworICAgIC8vIDEpIFJlc291cmNlTWFuYWdlciB0aHJlYWQgY2FsbHMgcmVjbGFpbSgpLCBtZXNzYWdlIHBvc3RlZCB0bworICAgIC8vICAgIE1lZGlhQ29kZWMgbG9vcGVyIHRocmVhZC4KKyAgICAvLyAyKSBNZWRpYUNvZGVjIGxvb3BlciB0aHJlYWQgY2FsbHMgaW5pdGlhdGVTaHV0ZG93bigpLCBzaHV0ZG93biBiZWluZworICAgIC8vICAgIGhhbmRsZWQgYXQgdGhlIGNvbXBvbmVudCB0aHJlYWQuCisgICAgLy8gMykgQ2xpZW50IHRocmVhZCBjYWxscyByZWxlYXNlKCksIG1lc3NhZ2UgcG9zdGVkIHRvICYgaGFuZGxlIGF0CisgICAgLy8gICAgTWVkaWFDb2RlYyBsb29wZXIgdGhyZWFkLgorICAgIC8vIDQpIE1lZGlhQ29kZWMgbG9vcGVyIHRocmVhZCBtYXkgY2FsbCBpbml0aWF0ZVNodXRkb3duKCkuCisgICAgLy8gNSkgaW5pdGlhdGVTaHV0ZG93bigpIGZyb20gMikgaXMgaGFuZGxlZCBhdCBvblJlbGVhc2VDb21wbGV0ZSgpIGV2ZW50CisgICAgLy8gICAgcG9zdGVkIHRvIE1lZGlhQ29kZWMgbG9vcGVyIHRocmVhZC4KKyAgICAvLyA2KSBJZiBjYWxsZWQsIGluaXRpYXRlU2h1dGRvd24oKSBmcm9tIDQpIGlzIGhhbmRsZWQgYW5kCisgICAgLy8gICAgb25SZWxlYXNlQ29tcGxldGUoKSBldmVudCBwb3N0ZWQgdG8gTWVkaWFDb2RlYyBsb29wZXIgdGhyZWFkLgorCisgICAgc3RhdGljIGNvbnN0IEFTdHJpbmcga0NvZGVjTmFtZXsidGVzdC5jb2RlYyJ9OworICAgIHN0YXRpYyBjb25zdCBBU3RyaW5nIGtDb2RlY093bmVyeyJub2JvZHkifTsKKyAgICBzdGF0aWMgY29uc3QgQVN0cmluZyBrTWVkaWFUeXBleyJ2aWRlby94LXRlc3QifTsKKworICAgIGVudW0geworICAgICAgICBrSW5pdCwKKyAgICAgICAga1NodXRkb3duRnJvbVJlY2xhaW1SZWNlaXZlZCwKKyAgICAgICAga1JlbGVhc2VDYWxsZWQsCisgICAgfTsKKyAgICBDb3VudGVyIGNvdW50ZXJ7a0luaXR9OworICAgIHNwPE1vY2tDb2RlYz4gbW9ja0NvZGVjOworICAgIHN0ZDo6ZnVuY3Rpb248c3A8Q29kZWNCYXNlPihjb25zdCBBU3RyaW5nICZuYW1lLCBjb25zdCBjaGFyICpvd25lcik+IGdldENvZGVjQmFzZSA9CisgICAgICAgIFsmbW9ja0NvZGVjLCAmY291bnRlcl0oY29uc3QgQVN0cmluZyAmLCBjb25zdCBjaGFyICopIHsKKyAgICAgICAgICAgIG1vY2tDb2RlYyA9IG5ldyBNb2NrQ29kZWMoW10oY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE1vY2tCdWZmZXJDaGFubmVsPiAmKSB7CisgICAgICAgICAgICAgICAgLy8gTm8gbW9jayBzZXR1cCwgYXMgd2UgZG9uJ3QgZXhwZWN0IGFueSBidWZmZXIgb3BlcmF0aW9ucworICAgICAgICAgICAgICAgIC8vIGluIHRoaXMgc2NlbmFyaW8uCisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIE9OX0NBTEwoKm1vY2tDb2RlYywgaW5pdGlhdGVBbGxvY2F0ZUNvbXBvbmVudChfKSkKKyAgICAgICAgICAgICAgICAuV2lsbEJ5RGVmYXVsdChbbW9ja0NvZGVjXShjb25zdCBzcDxBTWVzc2FnZT4gJikgeworICAgICAgICAgICAgICAgICAgICBtb2NrQ29kZWMtPmNhbGxiYWNrKCktPm9uQ29tcG9uZW50QWxsb2NhdGVkKGtDb2RlY05hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBPTl9DQUxMKCptb2NrQ29kZWMsIGluaXRpYXRlU2h1dGRvd24oXykpCisgICAgICAgICAgICAgICAgLldpbGxCeURlZmF1bHQoW21vY2tDb2RlYywgJmNvdW50ZXJdKGJvb2wpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGFnZSA9IGNvdW50ZXIud2FpdChrSW5pdCwga1JlbGVhc2VDYWxsZWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhZ2UgPT0ga0luaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hcmsgdGhhdCAyKSBoYXBwZW5lZCwgc28gdGVzdCBjYW4gcHJvY2VlZCB0byAzKQorICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlci5hZHZhbmNlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhZ2UgPT0ga1JlbGVhc2VDYWxsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSA2KQorICAgICAgICAgICAgICAgICAgICAgICAgbW9ja0NvZGVjLT5jYWxsYmFjaygpLT5vblJlbGVhc2VDb21wbGV0ZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIG1vY2tDb2RlYzsKKyAgICAgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYUNvZGVjTGlzdFdyaXRlcj4gbGlzdFdyaXRlciA9CisgICAgICAgIE1lZGlhVGVzdEhlbHBlcjo6Q3JlYXRlQ29kZWNMaXN0V3JpdGVyKCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvV3JpdGVyPiBpbmZvV3JpdGVyID0gbGlzdFdyaXRlci0+YWRkTWVkaWFDb2RlY0luZm8oKTsKKyAgICBpbmZvV3JpdGVyLT5zZXROYW1lKGtDb2RlY05hbWUuY19zdHIoKSk7CisgICAgaW5mb1dyaXRlci0+c2V0T3duZXIoa0NvZGVjT3duZXIuY19zdHIoKSk7CisgICAgaW5mb1dyaXRlci0+YWRkTWVkaWFUeXBlKGtNZWRpYVR5cGUuY19zdHIoKSk7CisgICAgc3RkOjp2ZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+PiBjb2RlY0luZm9zOworICAgIE1lZGlhVGVzdEhlbHBlcjo6V3JpdGVDb2RlY0luZm9zKGxpc3RXcml0ZXIsICZjb2RlY0luZm9zKTsKKyAgICBzdGQ6OmZ1bmN0aW9uPHN0YXR1c190KGNvbnN0IEFTdHJpbmcgJiwgc3A8TWVkaWFDb2RlY0luZm8+ICopPiBnZXRDb2RlY0luZm8gPQorICAgICAgICBbY29kZWNJbmZvc10oY29uc3QgQVN0cmluZyAmbmFtZSwgc3A8TWVkaWFDb2RlY0luZm8+ICppbmZvKSAtPiBzdGF0dXNfdCB7CisgICAgICAgICAgICBhdXRvIGl0ID0gc3RkOjpmaW5kX2lmKAorICAgICAgICAgICAgICAgICAgICBjb2RlY0luZm9zLmJlZ2luKCksIGNvZGVjSW5mb3MuZW5kKCksCisgICAgICAgICAgICAgICAgICAgIFsmbmFtZV0oY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+ICZpbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmFtZS5lcXVhbHNJZ25vcmVDYXNlKGluZm8tPmdldENvZGVjTmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICppbmZvID0gKGl0ID09IGNvZGVjSW5mb3MuZW5kKCkpID8gbnVsbHB0ciA6ICppdDsKKyAgICAgICAgICAgIHJldHVybiAoKmluZm8pID8gT0sgOiBOQU1FX05PVF9GT1VORDsKKyAgICAgICAgfTsKKworICAgIHNwPEFMb29wZXI+IGxvb3BlcntuZXcgQUxvb3Blcn07CisgICAgbG9vcGVyLT5zdGFydCgpOworICAgIHNwPE1lZGlhQ29kZWM+IGNvZGVjID0gTWVkaWFUZXN0SGVscGVyOjpDcmVhdGVDb2RlYygKKyAgICAgICAgICAgIGtDb2RlY05hbWUsIGxvb3BlciwgZ2V0Q29kZWNCYXNlLCBnZXRDb2RlY0luZm8pOworICAgIEFTU0VSVF9ORShudWxscHRyLCBjb2RlYykgPDwgIkNvZGVjIG11c3Qgbm90IGJlIG51bGwiOworICAgIEFTU0VSVF9ORShudWxscHRyLCBtb2NrQ29kZWMpIDw8ICJNb2NrQ29kZWMgbXVzdCBub3QgYmUgbnVsbCI7CisgICAgc3RkOjpwcm9taXNlPHZvaWQ+IHJlY2xhaW1Db21wbGV0ZWQ7CisgICAgc3RkOjpwcm9taXNlPHZvaWQ+IHJlbGVhc2VDb21wbGV0ZWQ7CisgICAgQ291bnRlciB0aHJlYWRFeGl0Q291bnRlcjsKKyAgICBzdGQ6OnRocmVhZChbY29kZWMsICZyZWNsYWltQ29tcGxldGVkXXsKKyAgICAgICAgLy8gU2ltdWxhdGUgUmVzb3VyY2VNYW5hZ2VyIHRocmVhZC4gUHJvY2VlZCB3aXRoIDEpCisgICAgICAgIE1lZGlhVGVzdEhlbHBlcjo6UmVjbGFpbShjb2RlYywgdHJ1ZSAvKiBmb3JjZSAqLyk7CisgICAgICAgIHJlY2xhaW1Db21wbGV0ZWQuc2V0X3ZhbHVlKCk7CisgICAgfSkuZGV0YWNoKCk7CisgICAgc3RkOjp0aHJlYWQoW2NvZGVjLCAmY291bnRlciwgJnJlbGVhc2VDb21wbGV0ZWRdeworICAgICAgICAvLyBTaW11bGF0ZSBjbGllbnQgdGhyZWFkLiBXYWl0IHVudGlsIDIpIGlzIGNvbXBsZXRlCisgICAgICAgICh2b2lkKWNvdW50ZXIud2FpdChrU2h1dGRvd25Gcm9tUmVjbGFpbVJlY2VpdmVkKTsKKyAgICAgICAgLy8gUHJvY2VlZCB0byAzKSwgYW5kIG1hcmsgdGhhdCA1KSBpcyByZWFkeSB0byBoYXBwZW4uCisgICAgICAgIC8vIE5PVEU6IGl0J3MgZGlmZmljdWx0IHRvIHBpbnBvaW50IHdoZW4gNCkgaGFwcGVucywgc28gd2Ugd2lsbCBzbGVlcAorICAgICAgICAvLyAgICAgICB0byBtZWV0IHRoZSB0aW1pbmcuCisgICAgICAgIGNvdW50ZXIuYWR2YW5jZSgpOworICAgICAgICBjb2RlYy0+cmVsZWFzZSgpOworICAgICAgICByZWxlYXNlQ29tcGxldGVkLnNldF92YWx1ZSgpOworICAgIH0pLmRldGFjaCgpOworICAgIHN0ZDo6dGhyZWFkKFttb2NrQ29kZWMsICZjb3VudGVyXXsKKyAgICAgICAgLy8gU2ltdWxhdGUgY29tcG9uZW50IHRocmVhZC4gV2FpdCB1bnRpbCAzKSBpcyBjb21wbGV0ZQorICAgICAgICAodm9pZCljb3VudGVyLndhaXQoa1JlbGVhc2VDYWxsZWQpOworICAgICAgICAvLyBXZSB3YW50IDQpIHRvIGNvbXBsZXRlIGJlZm9yZSBtb3ZpbmcgZm9yd2FyZCwgYnV0IGl0IGlzIGhhcmQgdG8KKyAgICAgICAgLy8gd2FpdCBmb3IgdGhpcyBleGFjdCBldmVudC4gSnVzdCBzbGVlcCBzbyB0aGF0IHRoZSBvdGhlciB0aHJlYWQgY2FuCisgICAgICAgIC8vIHByb2NlZWQgYW5kIGNvbXBsZXRlIDQpLgorICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcygxMDApKTsKKyAgICAgICAgLy8gUHJvY2VlZCB0byA1KS4KKyAgICAgICAgbW9ja0NvZGVjLT5jYWxsYmFjaygpLT5vblJlbGVhc2VDb21wbGV0ZWQoKTsKKyAgICB9KS5kZXRhY2goKTsKKyAgICBFWFBFQ1RfRVEoCisgICAgICAgICAgICBzdGQ6OmZ1dHVyZV9zdGF0dXM6OnJlYWR5LAorICAgICAgICAgICAgcmVjbGFpbUNvbXBsZXRlZC5nZXRfZnV0dXJlKCkud2FpdF9mb3Ioc3RkOjpjaHJvbm86OnNlY29uZHMoNSkpKQorICAgICAgICA8PCAicmVjbGFpbSB0aW1lZCBvdXQiOworICAgIEVYUEVDVF9FUSgKKyAgICAgICAgICAgIHN0ZDo6ZnV0dXJlX3N0YXR1czo6cmVhZHksCisgICAgICAgICAgICByZWxlYXNlQ29tcGxldGVkLmdldF9mdXR1cmUoKS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6c2Vjb25kcyg1KSkpCisgICAgICAgIDw8ICJyZWxlYXNlIHRpbWVkIG91dCI7CisgICAgbG9vcGVyLT5zdG9wKCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZWRpYWNvZGVjL01lZGlhVGVzdEhlbHBlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZWRpYWNvZGVjL01lZGlhVGVzdEhlbHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJlM2MwNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21lZGlhY29kZWMvTWVkaWFUZXN0SGVscGVyLmNwcApAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdFdyaXRlci5oPgorCisjaW5jbHVkZSAiTWVkaWFUZXN0SGVscGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gc3RhdGljCitzcDxNZWRpYUNvZGVjPiBNZWRpYVRlc3RIZWxwZXI6OkNyZWF0ZUNvZGVjKAorICAgICAgICBjb25zdCBBU3RyaW5nICZuYW1lLAorICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjQmFzZT4oY29uc3QgQVN0cmluZyAmLCBjb25zdCBjaGFyICopPiBnZXRDb2RlY0Jhc2UsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3RhdHVzX3QoY29uc3QgQVN0cmluZyAmLCBzcDxNZWRpYUNvZGVjSW5mbz4gKik+IGdldENvZGVjSW5mbykgeworICAgIHNwPE1lZGlhQ29kZWM+IGNvZGVjID0gbmV3IE1lZGlhQ29kZWMoCisgICAgICAgICAgICBsb29wZXIsIE1lZGlhQ29kZWM6OmtOb1BpZCwgTWVkaWFDb2RlYzo6a05vVWlkLCBnZXRDb2RlY0Jhc2UsIGdldENvZGVjSW5mbyk7CisgICAgaWYgKGNvZGVjLT5pbml0KG5hbWUpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gY29kZWM7Cit9CisKKy8vIHN0YXRpYwordm9pZCBNZWRpYVRlc3RIZWxwZXI6OlJlY2xhaW0oY29uc3Qgc3A8TWVkaWFDb2RlYz4gJmNvZGVjLCBib29sIGZvcmNlKSB7CisgICAgY29kZWMtPnJlY2xhaW0oZm9yY2UpOworfQorCisvLyBzdGF0aWMKK3N0ZDo6c2hhcmVkX3B0cjxNZWRpYUNvZGVjTGlzdFdyaXRlcj4gTWVkaWFUZXN0SGVscGVyOjpDcmVhdGVDb2RlY0xpc3RXcml0ZXIoKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxNZWRpYUNvZGVjTGlzdFdyaXRlcj4obmV3IE1lZGlhQ29kZWNMaXN0V3JpdGVyKTsKK30KKworLy8gc3RhdGljCit2b2lkIE1lZGlhVGVzdEhlbHBlcjo6V3JpdGVDb2RlY0luZm9zKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFDb2RlY0xpc3RXcml0ZXI+ICZ3cml0ZXIsCisgICAgICAgIHN0ZDo6dmVjdG9yPHNwPE1lZGlhQ29kZWNJbmZvPj4gKmNvZGVjSW5mb3MpIHsKKyAgICB3cml0ZXItPndyaXRlQ29kZWNJbmZvcyhjb2RlY0luZm9zKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21lZGlhY29kZWMvTWVkaWFUZXN0SGVscGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZWRpYWNvZGVjL01lZGlhVGVzdEhlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZDYxMTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZWRpYWNvZGVjL01lZGlhVGVzdEhlbHBlci5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfVEVTVF9IRUxQRVJfSF8KKworI2RlZmluZSBNRURJQV9URVNUX0hFTFBFUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBTG9vcGVyOworc3RydWN0IENvZGVjQmFzZTsKK3N0cnVjdCBNZWRpYUNvZGVjOworc3RydWN0IE1lZGlhQ29kZWNJbmZvOworc3RydWN0IE1lZGlhQ29kZWNMaXN0V3JpdGVyOworCitjbGFzcyBNZWRpYVRlc3RIZWxwZXIgeworcHVibGljOgorICAgIC8vIE1lZGlhQ29kZWMKKyAgICBzdGF0aWMgc3A8TWVkaWFDb2RlYz4gQ3JlYXRlQ29kZWMoCisgICAgICAgICAgICBjb25zdCBBU3RyaW5nICZuYW1lLAorICAgICAgICAgICAgY29uc3Qgc3A8QUxvb3Blcj4gJmxvb3BlciwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3A8Q29kZWNCYXNlPihjb25zdCBBU3RyaW5nICYsIGNvbnN0IGNoYXIgKik+IGdldENvZGVjQmFzZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3RhdHVzX3QoY29uc3QgQVN0cmluZyAmLCBzcDxNZWRpYUNvZGVjSW5mbz4gKik+IGdldENvZGVjSW5mbyk7CisgICAgc3RhdGljIHZvaWQgUmVjbGFpbShjb25zdCBzcDxNZWRpYUNvZGVjPiAmY29kZWMsIGJvb2wgZm9yY2UpOworCisgICAgLy8gTWVkaWFDb2RlY0xpc3RXcml0ZXIKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPE1lZGlhQ29kZWNMaXN0V3JpdGVyPiBDcmVhdGVDb2RlY0xpc3RXcml0ZXIoKTsKKyAgICBzdGF0aWMgdm9pZCBXcml0ZUNvZGVjSW5mb3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TWVkaWFDb2RlY0xpc3RXcml0ZXI+ICZ3cml0ZXIsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzcDxNZWRpYUNvZGVjSW5mbz4+ICpjb2RlY0luZm9zKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfVEVTVF9IRUxQRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21ldGFkYXRhdXRpbHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21ldGFkYXRhdXRpbHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTgzMGZjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWV0YWRhdGF1dGlscy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiTWV0YURhdGFVdGlsc1Rlc3QiLAorICAgIGd0ZXN0OiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiTWV0YURhdGFVdGlsc1Rlc3QuY3BwIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21ldGFkYXRhdXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZXNkcyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21ldGFkYXRhdXRpbHMvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWV0YWRhdGF1dGlscy9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0OTdmMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21ldGFkYXRhdXRpbHMvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iVGVzdCBtb2R1bGUgY29uZmlnIGZvciBNZXRhRGF0YVV0aWxzIHVuaXQgdGVzdCI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9Ik1ldGFEYXRhVXRpbHNUZXN0IiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUHVzaEZpbGVQcmVwYXJlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9ImZhbHNlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJNZXRhRGF0YVV0aWxzVGVzdC0+L2RhdGEvbG9jYWwvdG1wL01ldGFEYXRhVXRpbHNUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKKyAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZXRhZGF0YXV0aWxzL01ldGFEYXRhVXRpbHNUZXN0UmVzLTEuMC56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvTWV0YURhdGFVdGlsc1Rlc3RSZXMvIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5HVGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWRldmljZS1wYXRoIiB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im1vZHVsZS1uYW1lIiB2YWx1ZT0iTWV0YURhdGFVdGlsc1Rlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC9NZXRhRGF0YVV0aWxzVGVzdFJlcy8iIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWV0YWRhdGF1dGlscy9NZXRhRGF0YVV0aWxzVGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZXRhZGF0YXV0aWxzL01ldGFEYXRhVXRpbHNUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmQ1ZmRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWV0YWRhdGF1dGlscy9NZXRhRGF0YVV0aWxzVGVzdC5jcHAKQEAgLTAsMCArMSw0OTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1ldGFEYXRhVXRpbHNUZXN0IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxFU0RTLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgorCisjaW5jbHVkZSAiTWV0YURhdGFVdGlsc1Rlc3RFbnZpcm9ubWVudC5oIgorCitjb25zdGV4cHIgdWludDhfdCBrQWR0c0NzZFNpemUgPSA3OworLy8gZnJvbSBBQUMgc3BlY3M6IGh0dHBzOi8vd3d3Lmlzby5vcmcvc3RhbmRhcmQvNDMzNDUuaHRtbAorY29uc3RleHByIGludDMyX3Qga1NhbXBsaW5nRnJlcVtdID0gezk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwMDAsIDIyMDUwLCAxNjAwMCwgMTIwMDAsIDExMDI1LCA4MDAwfTsKK2NvbnN0ZXhwciB1aW50OF90IGtNYXhTYW1wbGluZ0ZyZXFJbmRleCA9IHNpemVvZihrU2FtcGxpbmdGcmVxKSAvIHNpemVvZihrU2FtcGxpbmdGcmVxWzBdKTsKKworc3RhdGljIE1ldGFEYXRhVXRpbHNUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOworCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY2xhc3MgTWV0YURhdGFWYWxpZGF0ZSB7CisgIHB1YmxpYzoKKyAgICBNZXRhRGF0YVZhbGlkYXRlKCkgOiBtSW5wdXRCdWZmZXIobnVsbHB0cikge30KKworICAgIH5NZXRhRGF0YVZhbGlkYXRlKCkgeworICAgICAgICBpZiAobUlucHV0QnVmZmVyKSB7CisgICAgICAgICAgICBkZWxldGVbXSBtSW5wdXRCdWZmZXI7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBudWxscHRyOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBTZXRVcE1ldGFEYXRhVmFsaWRhdGUoc3RyaW5nIGZpbGVOYW1lKSB7CisgICAgICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICAgICAgaW50OF90IGVyciA9IHN0YXQoZmlsZU5hbWUuY19zdHIoKSwgJmJ1Zik7CisgICAgICAgIEFTU0VSVF9FUShlcnIsIDApIDw8ICJGYWlsZWQgdG8gZ2V0IGZpbGUgaW5mb3JtYXRpb24gZm9yIGZpbGU6ICIgPDwgZmlsZU5hbWU7CisKKyAgICAgICAgbUlucHV0QnVmZmVyU2l6ZSA9IGJ1Zi5zdF9zaXplOworICAgICAgICBGSUxFICppbnB1dEZpbGVQdHIgPSBmb3BlbihmaWxlTmFtZS5jX3N0cigpLCAicmIrIik7CisgICAgICAgIEFTU0VSVF9ORShpbnB1dEZpbGVQdHIsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gb3BlbiBmaWxlOiAiIDw8IGZpbGVOYW1lOworCisgICAgICAgIG1JbnB1dEJ1ZmZlciA9IG5ldyB1aW50OF90W21JbnB1dEJ1ZmZlclNpemVdOworICAgICAgICBBU1NFUlRfTkUobUlucHV0QnVmZmVyLCBudWxscHRyKQorICAgICAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IG9mIHNpemU6ICIgPDwgbUlucHV0QnVmZmVyU2l6ZTsKKworICAgICAgICBpbnQzMl90IG51bUJ5dGVzID0KKyAgICAgICAgICAgICAgICBmcmVhZCgoY2hhciAqKW1JbnB1dEJ1ZmZlciwgc2l6ZW9mKHVpbnQ4X3QpLCBtSW5wdXRCdWZmZXJTaXplLCBpbnB1dEZpbGVQdHIpOworICAgICAgICBBU1NFUlRfRVEobnVtQnl0ZXMsIG1JbnB1dEJ1ZmZlclNpemUpIDw8IG51bUJ5dGVzIDw8ICIgb2YgIiA8PCBtSW5wdXRCdWZmZXJTaXplIDw8ICIgcmVhZCI7CisKKyAgICAgICAgZmNsb3NlKGlucHV0RmlsZVB0cik7CisgICAgfQorCisgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlclNpemU7CisgICAgY29uc3QgdWludDhfdCAqbUlucHV0QnVmZmVyOworfTsKKworY2xhc3MgQXZjQ1NEVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08CisgICAgICAgICAgICAgICAgICAgICAgICAgICB0dXBsZTxzdHJpbmcgLyppbnB1dEZpbGUqLywgc2l6ZV90IC8qYXZjV2lkdGgqLywgc2l6ZV90IC8qYXZjSGVpZ2h0Ki8+PiB7CisgIHB1YmxpYzoKKyAgICBBdmNDU0RUZXN0KCkgOiBtSW5wdXRCdWZmZXIobnVsbHB0cikge30KKworICAgIH5BdmNDU0RUZXN0KCkgeworICAgICAgICBpZiAobUlucHV0QnVmZmVyKSB7CisgICAgICAgICAgICBkZWxldGVbXSBtSW5wdXRCdWZmZXI7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBudWxscHRyOworICAgICAgICB9CisgICAgfQorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgdHVwbGU8c3RyaW5nLCBzaXplX3QsIHNpemVfdD4gcGFyYW1zID0gR2V0UGFyYW0oKTsKKyAgICAgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDA+KHBhcmFtcyk7CisgICAgICAgIG1GcmFtZVdpZHRoID0gZ2V0PDE+KHBhcmFtcyk7CisgICAgICAgIG1GcmFtZUhlaWdodCA9IGdldDwyPihwYXJhbXMpOworCisgICAgICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICAgICAgaW50OF90IGVyciA9IHN0YXQoaW5wdXRGaWxlLmNfc3RyKCksICZidWYpOworICAgICAgICBBU1NFUlRfRVEoZXJyLCAwKSA8PCAiRmFpbGVkIHRvIGdldCBpbmZvcm1hdGlvbiBmb3IgZmlsZTogIiA8PCBpbnB1dEZpbGU7CisKKyAgICAgICAgbUlucHV0QnVmZmVyU2l6ZSA9IGJ1Zi5zdF9zaXplOworICAgICAgICBGSUxFICppbnB1dEZpbGVQdHIgPSBmb3BlbihpbnB1dEZpbGUuY19zdHIoKSwgInJiKyIpOworICAgICAgICBBU1NFUlRfTkUoaW5wdXRGaWxlUHRyLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIG9wZW4gZmlsZTogIiA8PCBpbnB1dEZpbGU7CisKKyAgICAgICAgbUlucHV0QnVmZmVyID0gbmV3IHVpbnQ4X3RbbUlucHV0QnVmZmVyU2l6ZV07CisgICAgICAgIEFTU0VSVF9ORShtSW5wdXRCdWZmZXIsIG51bGxwdHIpCisgICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBjcmVhdGUgYSBidWZmZXIgb2Ygc2l6ZTogIiA8PCBtSW5wdXRCdWZmZXJTaXplOworCisgICAgICAgIGludDMyX3QgbnVtQnl0ZXMgPQorICAgICAgICAgICAgICAgIGZyZWFkKChjaGFyICopbUlucHV0QnVmZmVyLCBzaXplb2YodWludDhfdCksIG1JbnB1dEJ1ZmZlclNpemUsIGlucHV0RmlsZVB0cik7CisgICAgICAgIEFTU0VSVF9FUShudW1CeXRlcywgbUlucHV0QnVmZmVyU2l6ZSkgPDwgbnVtQnl0ZXMgPDwgIiBvZiAiIDw8IG1JbnB1dEJ1ZmZlclNpemUgPDwgIiByZWFkIjsKKworICAgICAgICBmY2xvc2UoaW5wdXRGaWxlUHRyKTsKKyAgICB9CisKKyAgICBzaXplX3QgbUZyYW1lV2lkdGg7CisgICAgc2l6ZV90IG1GcmFtZUhlaWdodDsKKyAgICBzaXplX3QgbUlucHV0QnVmZmVyU2l6ZTsKKyAgICBjb25zdCB1aW50OF90ICptSW5wdXRCdWZmZXI7Cit9OworCitjbGFzcyBBdmNDU0RWYWxpZGF0ZVRlc3QgOiBwdWJsaWMgTWV0YURhdGFWYWxpZGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08c3RyaW5nIC8qaW5wdXRGaWxlKi8+IHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpICsgR2V0UGFyYW0oKTsKKworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShTZXRVcE1ldGFEYXRhVmFsaWRhdGUoaW5wdXRGaWxlKSk7CisgICAgfQorfTsKKworY2xhc3MgQWFjQ1NEVGVzdAorICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0dXBsZTx1aW50MzJfdCAvKnByb2ZpbGUqLywgdWludDMyX3QgLypzYW1wbGluZ0ZyZXFJbmRleCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAvKmNoYW5uZWxDb25maWcqLz4+IHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgdHVwbGU8dWludDMyX3QsIHVpbnQzMl90LCB1aW50MzJfdD4gcGFyYW1zID0gR2V0UGFyYW0oKTsKKyAgICAgICAgbUFhY1Byb2ZpbGUgPSBnZXQ8MD4ocGFyYW1zKTsKKyAgICAgICAgbUFhY1NhbXBsaW5nRnJlcUluZGV4ID0gZ2V0PDE+KHBhcmFtcyk7CisgICAgICAgIG1BYWNDaGFubmVsQ29uZmlnID0gZ2V0PDI+KHBhcmFtcyk7CisgICAgfQorCisgICAgdWludDMyX3QgbUFhY1Byb2ZpbGU7CisgICAgdWludDMyX3QgbUFhY1NhbXBsaW5nRnJlcUluZGV4OworICAgIHVpbnQzMl90IG1BYWNDaGFubmVsQ29uZmlnOworfTsKKworY2xhc3MgQWFjQURUU1Rlc3QKKyAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08CisgICAgICAgICAgICAgIHR1cGxlPHN0cmluZyAvKmFkdHNGaWxlKi8sIHVpbnQzMl90IC8qY2hhbm5lbENvdW50Ki8sIHVpbnQzMl90IC8qc2FtcGxlUmF0ZSovPj4geworICBwdWJsaWM6CisgICAgQWFjQURUU1Rlc3QoKSA6IG1JbnB1dEJ1ZmZlcihudWxscHRyKSB7fQorCisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICB0dXBsZTxzdHJpbmcsIHVpbnQzMl90LCB1aW50MzJfdD4gcGFyYW1zID0gR2V0UGFyYW0oKTsKKyAgICAgICAgc3RyaW5nIGZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MD4ocGFyYW1zKTsKKyAgICAgICAgbUFhY0NoYW5uZWxDb3VudCA9IGdldDwxPihwYXJhbXMpOworICAgICAgICBtQWFjU2FtcGxlUmF0ZSA9IGdldDwyPihwYXJhbXMpOworCisgICAgICAgIEZJTEUgKmZpbGVQdHIgPSBmb3BlbihmaWxlTmFtZS5jX3N0cigpLCAiciIpOworICAgICAgICBBU1NFUlRfTkUoZmlsZVB0ciwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBvcGVuIGZpbGU6ICIgPDwgZmlsZU5hbWU7CisKKyAgICAgICAgbUlucHV0QnVmZmVyID0gbmV3IHVpbnQ4X3Rba0FkdHNDc2RTaXplXTsKKyAgICAgICAgQVNTRVJUX05FKG1JbnB1dEJ1ZmZlciwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBhbGxvY2F0ZSBhIG1lbW9yeSBvZiBzaXplOiAiIDw8IGtBZHRzQ3NkU2l6ZTsKKworICAgICAgICBpbnQzMl90IG51bUJ5dGVzID0gZnJlYWQoKHZvaWQgKiltSW5wdXRCdWZmZXIsIHNpemVvZih1aW50OF90KSwga0FkdHNDc2RTaXplLCBmaWxlUHRyKTsKKyAgICAgICAgQVNTRVJUX0VRKG51bUJ5dGVzLCBrQWR0c0NzZFNpemUpCisgICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byByZWFkIGNvbXBsZXRlIGZpbGUsIGJ5dGVzIHJlYWQ6ICIgPDwgbnVtQnl0ZXM7CisKKyAgICAgICAgZmNsb3NlKGZpbGVQdHIpOworICAgIH0KKyAgICBpbnQzMl90IG1BYWNDaGFubmVsQ291bnQ7CisgICAgaW50MzJfdCBtQWFjU2FtcGxlUmF0ZTsKKyAgICBjb25zdCB1aW50OF90ICptSW5wdXRCdWZmZXI7Cit9OworCitjbGFzcyBBYWNDU0RWYWxpZGF0ZVRlc3QgOiBwdWJsaWMgTWV0YURhdGFWYWxpZGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08c3RyaW5nIC8qaW5wdXRGaWxlKi8+IHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpICsgR2V0UGFyYW0oKTsKKworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShTZXRVcE1ldGFEYXRhVmFsaWRhdGUoaW5wdXRGaWxlKSk7CisgICAgfQorfTsKKworY2xhc3MgVm9yYmlzVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08cGFpcjxzdHJpbmcgLypmaWxlTmFtZSovLCBzdHJpbmcgLyppbmZvRmlsZSovPj4geworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPiBwYXJhbXMgPSBHZXRQYXJhbSgpOworICAgICAgICBzdHJpbmcgaW5wdXRNZWRpYUZpbGUgPSBnRW52LT5nZXRSZXMoKSArIHBhcmFtcy5maXJzdDsKKyAgICAgICAgbUlucHV0RmlsZVN0cmVhbS5vcGVuKGlucHV0TWVkaWFGaWxlLCBpZnN0cmVhbTo6aW4pOworICAgICAgICBBU1NFUlRfVFJVRShtSW5wdXRGaWxlU3RyZWFtLmlzX29wZW4oKSkgPDwgIkZhaWxlZCB0byBvcGVuIGRhdGEgZmlsZTogIiA8PCBpbnB1dE1lZGlhRmlsZTsKKworICAgICAgICBzdHJpbmcgaW5wdXRJbmZvRmlsZSA9IGdFbnYtPmdldFJlcygpICsgcGFyYW1zLnNlY29uZDsKKyAgICAgICAgbUluZm9GaWxlU3RyZWFtLm9wZW4oaW5wdXRJbmZvRmlsZSwgaWZzdHJlYW06OmluKTsKKyAgICAgICAgQVNTRVJUX1RSVUUobUlucHV0RmlsZVN0cmVhbS5pc19vcGVuKCkpIDw8ICJGYWlsZWQgdG8gb3BlbiBkYXRhIGZpbGU6ICIgPDwgaW5wdXRJbmZvRmlsZTsKKyAgICAgICAgQVNTRVJUX0ZBTFNFKGlucHV0SW5mb0ZpbGUuZW1wdHkoKSkgPDwgIkVtcHR5IGluZm8gZmlsZTogIiA8PCBpbnB1dEluZm9GaWxlOworICAgIH0KKworICAgIH5Wb3JiaXNUZXN0KCkgeworICAgICAgICBpZiAobUlucHV0RmlsZVN0cmVhbS5pc19vcGVuKCkpIG1JbnB1dEZpbGVTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgaWYgKG1JbmZvRmlsZVN0cmVhbS5pc19vcGVuKCkpIG1JbmZvRmlsZVN0cmVhbS5jbG9zZSgpOworICAgIH0KKworICAgIGlmc3RyZWFtIG1JbnB1dEZpbGVTdHJlYW07CisgICAgaWZzdHJlYW0gbUluZm9GaWxlU3RyZWFtOworfTsKKworVEVTVF9QKEF2Y0NTRFRlc3QsIEF2Y0NTRFZhbGlkYXRpb25UZXN0KSB7CisgICAgQU1lZGlhRm9ybWF0ICpjc2REYXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIEFTU0VSVF9ORShjc2REYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBBTWVkaWEgZm9ybWF0IjsKKworICAgIGJvb2wgc3RhdHVzID0gTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKGNzZERhdGEsIG1JbnB1dEJ1ZmZlciwgbUlucHV0QnVmZmVyU2l6ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIG1ha2UgQVZDIENTRCBmcm9tIEFNZWRpYUZvcm1hdCI7CisKKyAgICBpbnQzMl90IGF2Y1dpZHRoID0gLTE7CisgICAgc3RhdHVzID0gQU1lZGlhRm9ybWF0X2dldEludDMyKGNzZERhdGEsIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsICZhdmNXaWR0aCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCBhdmMgd2lkdGgiOworICAgIEFTU0VSVF9FUShhdmNXaWR0aCwgbUZyYW1lV2lkdGgpOworCisgICAgaW50MzJfdCBhdmNIZWlnaHQgPSAtMTsKKyAgICBzdGF0dXMgPSBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoY3NkRGF0YSwgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsICZhdmNIZWlnaHQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgYXZjIGhlaWdodCI7CisgICAgQVNTRVJUX0VRKGF2Y0hlaWdodCwgbUZyYW1lSGVpZ2h0KTsKKworICAgIGNvbnN0IGNoYXIgKm1pbWVUeXBlID0gIiI7CisgICAgc3RhdHVzID0gQU1lZGlhRm9ybWF0X2dldFN0cmluZyhjc2REYXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lVHlwZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCB0aGUgbWltZSB0eXBlIjsKKyAgICBBU1NFUlRfU1RSRVEobWltZVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisKKyAgICBNZXRhRGF0YUJhc2UgKm1ldGFEYXRhID0gbmV3IE1ldGFEYXRhQmFzZSgpOworICAgIEFTU0VSVF9ORShtZXRhRGF0YSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBjcmVhdGUgTWV0YURhdGEgQmFzZSI7CisKKyAgICBzdGF0dXMgPSBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoKm1ldGFEYXRhLCBtSW5wdXRCdWZmZXIsIG1JbnB1dEJ1ZmZlclNpemUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBtYWtlIEFWQyBDU0QgZnJvbSBNZXRhRGF0YUJhc2UiOworCisgICAgYXZjV2lkdGggPSAtMTsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJmF2Y1dpZHRoKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZmluZCB0aGUgd2lkdGgiOworICAgIEFTU0VSVF9FUShhdmNXaWR0aCwgbUZyYW1lV2lkdGgpOworCisgICAgYXZjSGVpZ2h0ID0gLTE7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmYXZjSGVpZ2h0KTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZmluZCB0aGUgaGVpZ2h0IjsKKyAgICBBU1NFUlRfRVEoYXZjSGVpZ2h0LCBtRnJhbWVIZWlnaHQpOworCisgICAgdm9pZCAqY3NkQU1lZGlhRm9ybWF0QnVmZmVyID0gbnVsbHB0cjsKKyAgICBzaXplX3QgY3NkQU1lZGlhRm9ybWF0U2l6ZTsKKyAgICBzdGF0dXMgPSBBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKGNzZERhdGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQywgJmNzZEFNZWRpYUZvcm1hdEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjc2RBTWVkaWFGb3JtYXRTaXplKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBDU0QgZnJvbSBBTWVkaWFGb3JtYXQiOworICAgIEFTU0VSVF9ORShjc2RBTWVkaWFGb3JtYXRCdWZmZXIsIG51bGxwdHIpIDw8ICJJbnZhbGlkIENTRCBmcm9tIEFNZWRpYUZvcm1hdCI7CisKKyAgICBjb25zdCB2b2lkICpjc2RNZXRhRGF0YUJhc2VCdWZmZXIgPSBudWxscHRyOworICAgIHNpemVfdCBjc2RNZXRhRGF0YUJhc2VTaXplID0gMDsKKyAgICB1aW50MzJfdCBtZWRpYVR5cGU7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmREYXRhKGtLZXlBVkNDLCAmbWVkaWFUeXBlLCAmY3NkTWV0YURhdGFCYXNlQnVmZmVyLCAmY3NkTWV0YURhdGFCYXNlU2l6ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCB0aGUgQ1NEIGZyb20gTWV0YURhdGFCYXNlIjsKKyAgICBBU1NFUlRfTkUoY3NkTWV0YURhdGFCYXNlQnVmZmVyLCBudWxscHRyKSA8PCAiSW52YWxpZCBDU0QgZnJvbSBNZXRhRGF0YUJhc2UiOworICAgIEFTU0VSVF9HVChjc2RNZXRhRGF0YUJhc2VTaXplLCAwKSA8PCAiQ1NEIHNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCI7CisgICAgQVNTRVJUX0VRKGNzZE1ldGFEYXRhQmFzZVNpemUsIGNzZEFNZWRpYUZvcm1hdFNpemUpCisgICAgICAgICAgICA8PCAiQ1NEIHNpemUgb2YgTWV0YURhdGEgdHlwZSBhbmQgQU1lZGlhRm9ybWF0IHR5cGUgbXVzdCBiZSBzYW1lIjsKKworICAgIGludDMyX3QgcmVzdWx0ID0gbWVtY21wKGNzZEFNZWRpYUZvcm1hdEJ1ZmZlciwgY3NkTWV0YURhdGFCYXNlQnVmZmVyLCBjc2RBTWVkaWFGb3JtYXRTaXplKTsKKyAgICBBU1NFUlRfRVEocmVzdWx0LCAwKSA8PCAiQ1NEIGZyb20gQU1lZGlhRm9ybWF0IGFuZCBNZXRhRGF0YUJhc2UgZG8gbm90IG1hdGNoIjsKKworICAgIGRlbGV0ZSBtZXRhRGF0YTsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGNzZERhdGEpOworfQorCitURVNUX1AoQXZjQ1NEVmFsaWRhdGVUZXN0LCBBdmNWYWxpZGF0ZVRlc3QpIHsKKyAgICBBTWVkaWFGb3JtYXQgKmNzZERhdGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgQVNTRVJUX05FKGNzZERhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIEFNZWRpYSBmb3JtYXQiOworCisgICAgYm9vbCBzdGF0dXMgPSBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoY3NkRGF0YSwgbUlucHV0QnVmZmVyLCBtSW5wdXRCdWZmZXJTaXplKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhIHdpdGggQU1lZGlhRm9ybWF0IHN1Y2NlZWRzIHdpdGggaW52YWxpZCBkYXRhIjsKKworICAgIE1ldGFEYXRhQmFzZSAqbWV0YURhdGEgPSBuZXcgTWV0YURhdGFCYXNlKCk7CisgICAgQVNTRVJUX05FKG1ldGFEYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBNZXRhRGF0YSBCYXNlIjsKKworICAgIHN0YXR1cyA9IE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YSgqbWV0YURhdGEsIG1JbnB1dEJ1ZmZlciwgbUlucHV0QnVmZmVyU2l6ZSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIk1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YSB3aXRoIE1ldGFEYXRhQmFzZSBzdWNjZWVkcyB3aXRoIGludmFsaWQgZGF0YSI7Cit9CisKK1RFU1RfUChBYWNDU0RUZXN0LCBBYWNDU0RWYWxpZGF0aW9uVGVzdCkgeworICAgIEFNZWRpYUZvcm1hdCAqY3NkRGF0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBBU1NFUlRfTkUoY3NkRGF0YSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBjcmVhdGUgQU1lZGlhIGZvcm1hdCI7CisKKyAgICBBU1NFUlRfR0UobUFhY1NhbXBsaW5nRnJlcUluZGV4LCAwKTsKKyAgICBBU1NFUlRfTFQobUFhY1NhbXBsaW5nRnJlcUluZGV4LCBrTWF4U2FtcGxpbmdGcmVxSW5kZXgpOworICAgIGJvb2wgc3RhdHVzID0gTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKGNzZERhdGEsIG1BYWNQcm9maWxlLCBtQWFjU2FtcGxpbmdGcmVxSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFhY0NoYW5uZWxDb25maWcpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBtYWtlIEFBQyBDU0QgZnJvbSBBTWVkaWFGb3JtYXQiOworCisgICAgaW50MzJfdCBzYW1wbGVSYXRlID0gLTE7CisgICAgc3RhdHVzID0gQU1lZGlhRm9ybWF0X2dldEludDMyKGNzZERhdGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsICZzYW1wbGVSYXRlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHNhbXBsZSByYXRlIjsKKyAgICBBU1NFUlRfRVEoa1NhbXBsaW5nRnJlcVttQWFjU2FtcGxpbmdGcmVxSW5kZXhdLCBzYW1wbGVSYXRlKTsKKworICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gLTE7CisgICAgc3RhdHVzID0gQU1lZGlhRm9ybWF0X2dldEludDMyKGNzZERhdGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgJmNoYW5uZWxDb3VudCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCBjaGFubmVsIGNvdW50IjsKKyAgICBBU1NFUlRfRVEoY2hhbm5lbENvdW50LCBtQWFjQ2hhbm5lbENvbmZpZyk7CisKKyAgICBjb25zdCBjaGFyICptaW1lVHlwZSA9ICIiOworICAgIHN0YXR1cyA9IEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcoY3NkRGF0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZVR5cGUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgdGhlIG1pbWUgdHlwZSI7CisgICAgQVNTRVJUX1NUUkVRKG1pbWVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOworCisgICAgTWV0YURhdGFCYXNlICptZXRhRGF0YSA9IG5ldyBNZXRhRGF0YUJhc2UoKTsKKyAgICBBU1NFUlRfTkUobWV0YURhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIE1ldGFEYXRhIEJhc2UiOworCisgICAgc3RhdHVzID0gTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKCptZXRhRGF0YSwgbUFhY1Byb2ZpbGUsIG1BYWNTYW1wbGluZ0ZyZXFJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFhY0NoYW5uZWxDb25maWcpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBtYWtlIEFBQyBDU0QgZnJvbSBNZXRhRGF0YUJhc2UiOworCisgICAgc2FtcGxlUmF0ZSA9IC0xOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHNhbXBsaW5nIHJhdGUiOworICAgIEFTU0VSVF9FUShrU2FtcGxpbmdGcmVxW21BYWNTYW1wbGluZ0ZyZXFJbmRleF0sIHNhbXBsZVJhdGUpOworCisgICAgY2hhbm5lbENvdW50ID0gLTE7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmY2hhbm5lbENvdW50KTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IGNoYW5uZWwgY291bnQiOworICAgIEFTU0VSVF9FUShjaGFubmVsQ291bnQsIG1BYWNDaGFubmVsQ29uZmlnKTsKKworICAgIG1pbWVUeXBlID0gIiI7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWVUeXBlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IG1pbWUgdHlwZSI7CisgICAgQVNTRVJUX1NUUkVRKG1pbWVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOworCisgICAgdm9pZCAqY3NkQU1lZGlhRm9ybWF0QnVmZmVyID0gbnVsbHB0cjsKKyAgICBzaXplX3QgY3NkQU1lZGlhRm9ybWF0U2l6ZSA9IDA7CisgICAgc3RhdHVzID0gQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihjc2REYXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCAmY3NkQU1lZGlhRm9ybWF0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNzZEFNZWRpYUZvcm1hdFNpemUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgdGhlIEFNZWRpYUZvcm1hdCBDU0QiOworICAgIEFTU0VSVF9HVChjc2RBTWVkaWFGb3JtYXRTaXplLCAwKSA8PCAiQ1NEIHNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCI7CisgICAgQVNTRVJUX05FKGNzZEFNZWRpYUZvcm1hdEJ1ZmZlciwgbnVsbHB0cikgPDwgIkludmFsaWQgQ1NEIGZvdW5kIjsKKworICAgIGNvbnN0IHZvaWQgKmNzZE1ldGFEYXRhQmFzZUJ1ZmZlcjsKKyAgICBzaXplX3QgY3NkTWV0YURhdGFCYXNlU2l6ZSA9IDA7CisgICAgdWludDMyX3QgbWVkaWFUeXBlOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kRGF0YShrS2V5RVNEUywgJm1lZGlhVHlwZSwgJmNzZE1ldGFEYXRhQmFzZUJ1ZmZlciwgJmNzZE1ldGFEYXRhQmFzZVNpemUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgdGhlIEVTRFMgZGF0YSBmcm9tIE1ldGFEYXRhQmFzZSI7CisgICAgQVNTRVJUX0dUKGNzZE1ldGFEYXRhQmFzZVNpemUsIDApIDw8ICJDU0Qgc2l6ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwIjsKKworICAgIEVTRFMgZXNkcyhjc2RNZXRhRGF0YUJhc2VCdWZmZXIsIGNzZE1ldGFEYXRhQmFzZVNpemUpOworICAgIHN0YXR1c190IHJlc3VsdCA9IGVzZHMuZ2V0Q29kZWNTcGVjaWZpY0luZm8oJmNzZE1ldGFEYXRhQmFzZUJ1ZmZlciwgJmNzZE1ldGFEYXRhQmFzZVNpemUpOworICAgIEFTU0VSVF9FUShyZXN1bHQsIChzdGF0dXNfdClPSykgPDwgIkZhaWxlZCB0byBnZXQgQ1NEIGZyb20gRVNEUyBkYXRhIjsKKyAgICBBU1NFUlRfTkUoY3NkTWV0YURhdGFCYXNlQnVmZmVyLCBudWxscHRyKSA8PCAiSW52YWxpZCBDU0QgZm91bmQiOworICAgIEFTU0VSVF9FUShjc2RBTWVkaWFGb3JtYXRTaXplLCBjc2RNZXRhRGF0YUJhc2VTaXplKQorICAgICAgICAgICAgPDwgIkNTRCBzaXplIGRvIG5vdCBtYXRjaCBiZXR3ZWVuIEFNZWRpYUZvcm1hdCB0eXBlIGFuZCBNZXRhRGF0YUJhc2UgdHlwZSI7CisKKyAgICBpbnQzMl90IG1lbWNtcFJlc3VsdCA9CisgICAgICAgICAgICBtZW1jbXAoY3NkQU1lZGlhRm9ybWF0QnVmZmVyLCBjc2RNZXRhRGF0YUJhc2VCdWZmZXIsIGNzZEFNZWRpYUZvcm1hdFNpemUpOworICAgIEFTU0VSVF9FUShtZW1jbXBSZXN1bHQsIDApIDw8ICJBTWVkaWFGb3JtYXQgYW5kIE1ldGFEYXRhQmFzZSBDU0RzIGRvIG5vdCBtYXRjaCI7CisKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGNzZERhdGEpOworICAgIGRlbGV0ZSBtZXRhRGF0YTsKK30KKworVEVTVF9QKEFhY0FEVFNUZXN0LCBBYWNBRFRTVmFsaWRhdGlvblRlc3QpIHsKKyAgICBNZXRhRGF0YUJhc2UgKm1ldGFEYXRhID0gbmV3IE1ldGFEYXRhQmFzZSgpOworICAgIEFTU0VSVF9ORShtZXRhRGF0YSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBjcmVhdGUgbWV0YSBkYXRhIjsKKworICAgIGJvb2wgc3RhdHVzID0gTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKCptZXRhRGF0YSwgbUlucHV0QnVmZmVyLCBrQWR0c0NzZFNpemUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBtYWtlIEFBQyBDU0QgZnJvbSBNZXRhRGF0YUJhc2UiOworCisgICAgaW50MzJfdCBzYW1wbGVSYXRlID0gLTE7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZVJhdGUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgc2FtcGxpbmcgcmF0ZSI7CisgICAgQVNTRVJUX0VRKHNhbXBsZVJhdGUsIG1BYWNTYW1wbGVSYXRlKTsKKworICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gLTE7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmY2hhbm5lbENvdW50KTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IGNoYW5uZWwgY291bnQiOworICAgIEFTU0VSVF9FUShjaGFubmVsQ291bnQsIG1BYWNDaGFubmVsQ291bnQpOworCisgICAgY29uc3QgY2hhciAqbWltZVR5cGUgPSAiIjsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZVR5cGUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIkZhaWxlZCB0byBnZXQgbWltZSB0eXBlIjsKKyAgICBBU1NFUlRfU1RSRVEobWltZVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CisKKyAgICBkZWxldGUgbWV0YURhdGE7Cit9CisKK1RFU1RfUChBYWNDU0RWYWxpZGF0ZVRlc3QsIEFhY0ludmFsaWRJbnB1dFRlc3QpIHsKKyAgICBNZXRhRGF0YUJhc2UgKm1ldGFEYXRhID0gbmV3IE1ldGFEYXRhQmFzZSgpOworICAgIEFTU0VSVF9ORShtZXRhRGF0YSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBjcmVhdGUgbWV0YSBkYXRhIjsKKworICAgIGJvb2wgc3RhdHVzID0gTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKCptZXRhRGF0YSwgbUlucHV0QnVmZmVyLCBrQWR0c0NzZFNpemUpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEgc3VjY2VlZHMgd2l0aCBpbnZhbGlkIGRhdGEiOworfQorCitURVNUX1AoVm9yYmlzVGVzdCwgVm9yYmlzQ29tbWVudFRlc3QpIHsKKyAgICBzdHJpbmcgbGluZTsKKyAgICBzdHJpbmcgdGFnOworICAgIHN0cmluZyBrZXk7CisgICAgc3RyaW5nIHZhbHVlOworICAgIHNpemVfdCBjb21tZW50TGVuZ3RoOworICAgIGJvb2wgc3RhdHVzOworCisgICAgd2hpbGUgKGdldGxpbmUobUluZm9GaWxlU3RyZWFtLCBsaW5lKSkgeworICAgICAgICBpc3RyaW5nc3RyZWFtIHN0cmluZ0xpbmUobGluZSk7CisgICAgICAgIHN0cmluZ0xpbmUgPj4gdGFnID4+IGtleSA+PiB2YWx1ZSA+PiBjb21tZW50TGVuZ3RoOworICAgICAgICBBU1NFUlRfR1QoY29tbWVudExlbmd0aCwgMCkgPDwgIlZvcmJpcyBjb21tZW50IHNpemUgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCI7CisKKyAgICAgICAgc3RyaW5nIGNvbW1lbnQ7CisgICAgICAgIHN0cmluZyBkYXRhTGluZTsKKworICAgICAgICBnZXRsaW5lKG1JbnB1dEZpbGVTdHJlYW0sIGRhdGFMaW5lKTsKKyAgICAgICAgaXN0cmluZ3N0cmVhbSBkYXRhU3RyaW5nTGluZShkYXRhTGluZSk7CisgICAgICAgIGRhdGFTdHJpbmdMaW5lID4+IGNvbW1lbnQ7CisKKyAgICAgICAgY2hhciAqYnVmZmVyID0gc3RybmR1cChjb21tZW50LmNfc3RyKCksIGNvbW1lbnRMZW5ndGgpOworICAgICAgICBBU1NFUlRfTkUoYnVmZmVyLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciBvZiBzaXplOiAiIDw8IGNvbW1lbnRMZW5ndGg7CisKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmaWxlTWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICAgICAgQVNTRVJUX05FKGZpbGVNZXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBBTWVkaWEgZm9ybWF0IjsKKworICAgICAgICBwYXJzZVZvcmJpc0NvbW1lbnQoZmlsZU1ldGEsIGJ1ZmZlciwgY29tbWVudExlbmd0aCk7CisgICAgICAgIGZyZWUoYnVmZmVyKTsKKworICAgICAgICBpZiAoIXN0cm5jYXNlY21wKHRhZy5jX3N0cigpLCAiQU5EUk9JRF9IQVBUSUMiLCBzaXplb2YodGFnKSkpIHsKKyAgICAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbEV4cGVjdGVkID0gc3RvaSh2YWx1ZSk7CisgICAgICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxGb3VuZCA9IC0xOworICAgICAgICAgICAgc3RhdHVzID0gQU1lZGlhRm9ybWF0X2dldEludDMyKGZpbGVNZXRhLCBrZXkuY19zdHIoKSwgJm51bUNoYW5uZWxGb3VuZCk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBjaGFubmVsIGNvdW50IjsKKyAgICAgICAgICAgIEFTU0VSVF9FUShudW1DaGFubmVsRXhwZWN0ZWQsIG51bUNoYW5uZWxGb3VuZCk7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKHRhZy5jX3N0cigpLCAiQU5EUk9JRF9MT09QIiwgc2l6ZW9mKHRhZykpKSB7CisgICAgICAgICAgICBpbnQzMl90IGxvb3BFeHBlY3RlZCA9ICF2YWx1ZS5jb21wYXJlKCJ0cnVlIik7CisgICAgICAgICAgICBpbnQzMl90IGxvb3BGb3VuZCA9IC0xOworCisgICAgICAgICAgICBzdGF0dXMgPSBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZmlsZU1ldGEsICJsb29wIiwgJmxvb3BGb3VuZCk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBsb29wIGNvdW50IjsKKyAgICAgICAgICAgIEFTU0VSVF9FUShsb29wRXhwZWN0ZWQsIGxvb3BGb3VuZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICp0YWdWYWx1ZSA9ICIiOworICAgICAgICAgICAgc3RhdHVzID0gQU1lZGlhRm9ybWF0X2dldFN0cmluZyhmaWxlTWV0YSwga2V5LmNfc3RyKCksICZ0YWdWYWx1ZSk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSB0YWcgdmFsdWUiOworICAgICAgICAgICAgQVNTRVJUX1NUUkVRKHZhbHVlLmNfc3RyKCksIHRhZ1ZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGZpbGVNZXRhKTsKKyAgICB9Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChNZXRhRGF0YVV0aWxzVGVzdEFsbCwgQXZjQ1NEVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3R1cGxlKCJzcHNfcHBzX3VzZXJkYXRhLmgyNjQiLCA4LCA4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJzcHNfdXNlcmRhdGFfcHBzLmgyNjQiLCA4LCA4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJzcHNfcHBzX3Nwc19wcHMuaDI2NCIsIDgsIDgpKSk7CisKKy8vIFRPRE8oYi8xNTgwNjc2OTEpOiBBZGQgaW52YWxpZCB0ZXN0IHZlY3RvcnMgd2l0aCBpbmNvbXBsZXRlIFBQUyBvciBubyBQUFMKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChNZXRhRGF0YVV0aWxzVGVzdEFsbCwgQXZjQ1NEVmFsaWRhdGVUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKCJzcHNfcHBzX29ubHlfc3RhcnRjb2RlLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzcHNfaW5jb21wbGV0ZV9wcHMuaDI2NCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhiLzE1ODA2NzY5MSkgInNwc19wcHNfaW5jb21wbGV0ZS5oMjY0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmFuZG9tZGF0YS5oMjY0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGIvMTU4MDY3NjkxKSAic3BzLmgyNjQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcHMuaDI2NCIpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKE1ldGFEYXRhVXRpbHNUZXN0QWxsLCBBYWNDU0RUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfdHVwbGUoQUFDT2JqZWN0TWFpbiwgMSwgMSkpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKE1ldGFEYXRhVXRpbHNUZXN0QWxsLCBBYWNBRFRTVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3R1cGxlKCJsb3Vkc29mdGFhY2FkdHMiLCAxLCA0NDEwMCkpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKE1ldGFEYXRhVXRpbHNUZXN0QWxsLCBBYWNDU0RWYWxpZGF0ZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoImxvdWRzb2Z0YWFjYWR0c19pbnZhbGlkaGVhZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG91ZHNvZnRhYWNhZHRzX2ludmFsaWRwcm9maWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibG91ZHNvZnRhYWNhZHRzX2ludmFsaWRjaGFubmVsY29uZmlnIikpOworCisvLyBUT0RPKGIvMTU3OTc0NTA4KSBBZGQgdGVzdCB2ZWN0b3IgZm9yIHZvcmJpcyB0aHVtYm5haWwgdGFnCisvLyBJbmZvIGZpbGUgY29udGFpbnMgVEFHLCBLZXksIFZhbHVlIGFuZCBzaXplIG9mIHRoZSB2b3JiaXMgY29tbWVudAorSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBNZXRhRGF0YVV0aWxzVGVzdEFsbCwgVm9yYmlzVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV9wYWlyKCJ2b3JiaXNjb21tZW50X3NpbnRlbC5kYXQiLCAidm9yYmlzY29tbWVudF9zaW50ZWwuaW5mbyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInZvcmJpc2NvbW1lbnRfYWxidW0uZGF0IiwgInZvcmJpc2NvbW1lbnRfYWxidW0uaW5mbyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInZvcmJpc2NvbW1lbnRfbG9vcC5kYXQiLCAidm9yYmlzY29tbWVudF9sb29wLmluZm8iKSkpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IE1ldGFEYXRhVXRpbHNUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIEFMT0dWKCJUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWV0YWRhdGF1dGlscy9NZXRhRGF0YVV0aWxzVGVzdEVudmlyb25tZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZXRhZGF0YXV0aWxzL01ldGFEYXRhVXRpbHNUZXN0RW52aXJvbm1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDY0MmJjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWV0YWRhdGF1dGlscy9NZXRhRGF0YVV0aWxzVGVzdEVudmlyb25tZW50LmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19NRVRBREFUQV9VVElMU19URVNUX0VOVklST05NRU5UX0hfXworI2RlZmluZSBfX01FVEFEQVRBX1VUSUxTX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2NsYXNzIE1ldGFEYXRhVXRpbHNUZXN0RW52aXJvbm1lbnQgOiBwdWJsaWM6OnRlc3Rpbmc6OkVudmlyb25tZW50IHsKKyAgcHVibGljOgorICAgIE1ldGFEYXRhVXRpbHNUZXN0RW52aXJvbm1lbnQoKSA6IHJlcygiL2RhdGEvbG9jYWwvdG1wLyIpIHt9CisKKyAgICAvLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyAgICBpbnQgaW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndik7CisKKyAgICB2b2lkIHNldFJlcyhjb25zdCBjaGFyICpfcmVzKSB7IHJlcyA9IF9yZXM7IH0KKworICAgIGNvbnN0IHN0cmluZyBnZXRSZXMoKSBjb25zdCB7IHJldHVybiByZXM7IH0KKworICBwcml2YXRlOgorICAgIHN0cmluZyByZXM7Cit9OworCitpbnQgTWV0YURhdGFVdGlsc1Rlc3RFbnZpcm9ubWVudDo6aW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHt7InBhdGgiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwgezAsIDAsIDAsIDB9fTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIlA6Iiwgb3B0aW9ucywgJmluZGV4KTsKKyAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdQJzogeworICAgICAgICAgICAgICAgIHNldFJlcyhvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvcHRpbmQgPCBhcmdjKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgb3B0aW9uOiAlc1xuXG4iCisgICAgICAgICAgICAgICAgInVzYWdlOiAlcyA8Z3Rlc3Qgb3B0aW9ucz4gPHRlc3Qgb3B0aW9ucz5cblxuIgorICAgICAgICAgICAgICAgICJ0ZXN0IG9wdGlvbnMgYXJlOlxuXG4iCisgICAgICAgICAgICAgICAgIi1QLCAtLXBhdGg6IFJlc291cmNlIGZpbGVzIGRpcmVjdG9yeSBsb2NhdGlvblxuIiwKKyAgICAgICAgICAgICAgICBhcmd2W29wdGluZCA/OiAxXSwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmICAvLyBfX01FVEFEQVRBX1VUSUxTX1RFU1RfRU5WSVJPTk1FTlRfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZXRhZGF0YXV0aWxzL1JFQURNRS5tZCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL21ldGFkYXRhdXRpbHMvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NjJhMDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9tZXRhZGF0YXV0aWxzL1JFQURNRS5tZApAQCAtMCwwICsxLDM5IEBACisjIyBNZWRpYSBUZXN0aW5nICMjCistLS0KKyMjIyMgTWV0YURhdGFVdGlscyBUZXN0CitUaGUgTWV0YURhdGFVdGlscyBVbml0IFRlc3QgU3VpdGUgdmFsaWRhdGVzIHRoZSBsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIGxpYnJhcnkgYXZhaWxhYmxlIGluIGxpYnN0YWdlZnJpZ2h0LgorCitSdW4gdGhlIGZvbGxvd2luZyBzdGVwcyB0byBidWlsZCB0aGUgdGVzdCBzdWl0ZToKK2BgYAorbSBNZXRhRGF0YVV0aWxzVGVzdAorYGBgCisKK1RoZSAzMi1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvCisKK1RoZSA2NC1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC8KKworVG8gdGVzdCA2NC1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0NjQuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC9NZXRhRGF0YVV0aWxzVGVzdC9NZXRhRGF0YVV0aWxzVGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKworVG8gdGVzdCAzMi1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0LgorYGBgCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0L01ldGFEYXRhVXRpbHNUZXN0L01ldGFEYXRhVXRpbHNUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvbWV0YWRhdGF1dGlscy9NZXRhRGF0YVV0aWxzVGVzdFJlcy0xLjAuemlwKS4gRG93bmxvYWQsIHVuemlwIGFuZCBwdXNoIHRoZXNlIGZpbGVzIGludG8gZGV2aWNlIGZvciB0ZXN0aW5nLgorCitgYGAKK2FkYiBwdXNoIE1ldGFEYXRhVXRpbHNUZXN0UmVzLTEuMCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKwordXNhZ2U6IE1ldGFEYXRhVXRpbHNUZXN0IC1QIFw8cGF0aF90b19mb2xkZXJcPgorYGBgCithZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL01ldGFEYXRhVXRpbHNUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC9NZXRhRGF0YVV0aWxzVGVzdFJlcy0xLjAvCitgYGAKK0FsdGVybmF0aXZlbHksIHRoZSB0ZXN0IGNhbiBhbHNvIGJlIHJ1biB1c2luZyBhdGVzdCBjb21tYW5kLgorCitgYGAKK2F0ZXN0IE1ldGFEYXRhVXRpbHNUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKK2BgYApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvQW5kcm9pZC5icAppbmRleCA3ZTE2OWNiLi5iNWQ0NTNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvQW5kcm9pZC5icApAQCAtMjgsMTMgKzI4LDE1IEBACiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3dlYm0iLAotICAgICAgICAibGliZGF0YXNvdXJjZSIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYmRhdGFzb3VyY2UiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZXNkcyIsCiAgICAgICAgICJsaWJvZ2ciLAogICAgIF0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL0FuZHJvaWRUZXN0LnhtbAppbmRleCBkODMxNTU1Li5jYzg5MGZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvQW5kcm9pZFRlc3QueG1sCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9BbmRyb2lkVGVzdC54bWwKQEAgLTE5LDEyICsxOSwxMyBAQAogICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgogICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJ3cml0ZXJUZXN0LT4vZGF0YS9sb2NhbC90bXAvd3JpdGVyVGVzdCIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiCi0gICAgICAgICAgICBrZXk9Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlci56aXA/dW56aXA9dHJ1ZSIKLSAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvd3JpdGVyVGVzdFJlcy8iIC8+CisgICAgICAgICAgICBrZXk9Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclRlc3RSZXMtMS4xLnppcD91bnppcD10cnVlIgorICAgICAgICAgICAgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcC9Xcml0ZXJUZXN0UmVzLyIgLz4KICAgICA8L3RhcmdldF9wcmVwYXJlcj4KICAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3QiID4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9IndyaXRlclRlc3QiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC93cml0ZXJUZXN0UmVzLyIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1mbGFnIiB2YWx1ZT0iLVAgL2RhdGEvbG9jYWwvdG1wL1dyaXRlclRlc3RSZXMvIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWZsYWciIHZhbHVlPSItQyB0cnVlIiAvPgogICAgIDwvdGVzdD4KIDwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9SRUFETUUubWQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvUkVBRE1FLm1kCmluZGV4IGFlMDc5MTcuLjBlNTRjYTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9SRUFETUUubWQKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1JFQURNRS5tZApAQCAtMTksMTMgKzE5LDE4IEBACiAKIGFkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Qvd3JpdGVyVGVzdC93cml0ZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KIAotVGhlIHJlc291cmNlIGZpbGUgZm9yIHRoZSB0ZXN0cyBpcyB0YWtlbiBmcm9tIFtoZXJlXShodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci93cml0ZXJUZXN0UmVzLnppcCkuCitUaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclRlc3RSZXMtMS4xLnppcCkuCiBEb3dubG9hZCBhbmQgZXh0cmFjdCB0aGUgZm9sZGVyLiBQdXNoIGFsbCB0aGUgZmlsZXMgaW4gdGhpcyBmb2xkZXIgdG8gL2RhdGEvbG9jYWwvdG1wLyBvbiB0aGUgZGV2aWNlLgogYGBgCi1hZGIgcHVzaCB3cml0ZXJUZXN0UmVzIC9kYXRhL2xvY2FsL3RtcC8KK2FkYiBwdXNoIFdyaXRlclRlc3RSZXMtMS4xLy4gL2RhdGEvbG9jYWwvdG1wL1dyaXRlclRlc3RSZXMvCiBgYGAKIAotdXNhZ2U6IHdyaXRlclRlc3QgLVAgXDxwYXRoX3RvX3Jlc19mb2xkZXJcPgordXNhZ2U6IHdyaXRlclRlc3QgLVAgXDxwYXRoX3RvX3Jlc19mb2xkZXJcPiAtQyA8cmVtb3ZlX291dHB1dF9maWxlPgogYGBgCi1hZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL3dyaXRlclRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wLworYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC93cml0ZXJUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC9Xcml0ZXJUZXN0UmVzLyAtQyB0cnVlCitgYGAKK0FsdGVybmF0aXZlbHksIHRoZSB0ZXN0IGNhbiBhbHNvIGJlIHJ1biB1c2luZyBhdGVzdCBjb21tYW5kLgorCitgYGAKK2F0ZXN0IHdyaXRlclRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQogYGBgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyTGlzdGVuZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJMaXN0ZW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZjBhN2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyTGlzdGVuZXIuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBXUklURVJfTElTVEVORVJfSF8KKyNkZWZpbmUgV1JJVEVSX0xJU1RFTkVSX0hfCisKKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVJlY29yZGVyQ2xpZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2NsYXNzIFdyaXRlckxpc3RlbmVyIDogcHVibGljIEJuTWVkaWFSZWNvcmRlckNsaWVudCB7CisgIHB1YmxpYzoKKyAgICBXcml0ZXJMaXN0ZW5lcigpIDogbVNpZ25hbGVkU2l6ZShmYWxzZSksIG1TaWduYWxlZER1cmF0aW9uKGZhbHNlKSB7fQorCisgICAgdmlydHVhbCB2b2lkIG5vdGlmeShpbnQzMl90IG1zZywgaW50MzJfdCBleHQxLCBpbnQzMl90IGV4dDIpIHsKKyAgICAgICAgQUxPR1YoIm1zZyA6ICVkLCBleHQxIDogJWQsIGV4dDIgOiAlZCIsIG1zZywgZXh0MSwgZXh0Mik7CisgICAgICAgIGlmIChleHQxID09IE1FRElBX1JFQ09SREVSX0lORk9fTUFYX0ZJTEVTSVpFX1JFQUNIRUQpIHsKKyAgICAgICAgICAgIG1TaWduYWxlZFNpemUgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGV4dDEgPT0gTUVESUFfUkVDT1JERVJfSU5GT19NQVhfRFVSQVRJT05fUkVBQ0hFRCkgeworICAgICAgICAgICAgbVNpZ25hbGVkRHVyYXRpb24gPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgdm9sYXRpbGUgYm9vbCBtU2lnbmFsZWRTaXplOworICAgIHZvbGF0aWxlIGJvb2wgbVNpZ25hbGVkRHVyYXRpb247Cit9OworCisjZW5kaWYgIC8vIFdSSVRFUl9MSVNURU5FUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclRlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclRlc3QuY3BwCmluZGV4IGZmMDYzZTMuLmQxNzBlN2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJUZXN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVGVzdC5jcHAKQEAgLTE4LDkgKzE4LDEzIEBACiAjZGVmaW5lIExPR19UQUcgIldyaXRlclRlc3QiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPGZzdHJlYW0+CiAjaW5jbHVkZSA8aW9zdHJlYW0+CiAKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KQEAgLTM5LDE4ICs0Myw0MCBAQAogCiAjZGVmaW5lIE9VVFBVVF9GSUxFX05BTUUgIi9kYXRhL2xvY2FsL3RtcC93cml0ZXIub3V0IgogCisvLyBTdHRzIHZhbHVlcyB3aXRoaW4gMC4xbXMoMTAwdXMpIGRpZmZlcmVuY2UgYXJlIGZ1ZGdlZCB0byBzYXZlIHRvbworLy8gbWFueSBzdHRzIGVudHJpZXMgaW4gTVBFRzRXcml0ZXIuCitjb25zdGV4cHIgaW50MzJfdCBrTXBlZzRNdXhUb2xlcmFuY2VUaW1lVXMgPSAxMDA7CisvLyBUb2xlcmFuY2UgdmFsdWUgZm9yIG90aGVyIHdyaXRlcnMKK2NvbnN0ZXhwciBpbnQzMl90IGtNdXhUb2xlcmFuY2VUaW1lVXMgPSAxOworCiBzdGF0aWMgV3JpdGVyVGVzdEVudmlyb25tZW50ICpnRW52ID0gbnVsbHB0cjsKIAotc3RydWN0IGNvbmZpZ0Zvcm1hdCB7Ci0gICAgY2hhciBtaW1lWzEyOF07Ci0gICAgaW50MzJfdCB3aWR0aDsKLSAgICBpbnQzMl90IGhlaWdodDsKLSAgICBpbnQzMl90IHNhbXBsZVJhdGU7Ci0gICAgaW50MzJfdCBjaGFubmVsQ291bnQ7CitlbnVtIGlucHV0SWQgeworICAgIC8vIGF1ZGlvIHN0cmVhbXMKKyAgICBBQUNfMSwKKyAgICBBQUNfQURUU18xLAorICAgIEFNUl9OQl8xLAorICAgIEFNUl9XQl8xLAorICAgIEZMQUNfMSwKKyAgICBPUFVTXzEsCisgICAgVk9SQklTXzEsCisgICAgLy8gdmlkZW8gc3RyZWFtcworICAgIEFWMV8xLAorICAgIEFWQ18xLAorICAgIEgyNjNfMSwKKyAgICBIRVZDXzEsCisgICAgTVBFRzRfMSwKKyAgICBWUDhfMSwKKyAgICBWUDlfMSwKKyAgICAvLyBoZWlmIHN0cmVhbQorICAgIEhFSUNfMSwKKyAgICBVTlVTRURfSUQsCisgICAgVU5LTk9XTl9JRCwKIH07CiAKIC8vIExvb2tVcFRhYmxlIG9mIGNsaXBzIGFuZCBtZXRhZGF0YSBmb3IgY29tcG9uZW50IHRlc3RpbmcKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgSW5wdXREYXRhIHsKKyAgICBpbnB1dElkIGlucElkOwogICAgIGNvbnN0IGNoYXIgKm1pbWU7CiAgICAgc3RyaW5nIGlucHV0RmlsZTsKICAgICBzdHJpbmcgaW5mbzsKQEAgLTU4LDY1ICs4NCw3MyBAQAogICAgIGludDMyX3Qgc2Vjb25kUGFyYW07CiAgICAgYm9vbCBpc0F1ZGlvOwogfSBrSW5wdXREYXRhW10gPSB7Ci0gICAgICAgIHtNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTLCAiYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5vcHVzIiwKLSAgICAgICAgICJiYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8iLCA0ODAwMCwgMiwgdHJ1ZX0sCi0gICAgICAgIHtNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsICJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouYWFjIiwKLSAgICAgICAgICJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyIsIDQ4MDAwLCAyLCB0cnVlfSwKLSAgICAgICAge01FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTLCAiTXBzXzJfYzJfZnIxX1NjMV9EYzJfMHgwM19yYXcuYWR0cyIsCisgICAgICAgIHtBQUNfMSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDLCAiYXVkaW9fYWFjX3N0ZXJlb184a2Jwc18xMTAyNWh6LmFhYyIsCisgICAgICAgICAiYXVkaW9fYWFjX3N0ZXJlb184a2Jwc18xMTAyNWh6LmluZm8iLCAxMTAyNSwgMiwgdHJ1ZX0sCisgICAgICAgIHtBQUNfQURUU18xLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUUywgIk1wc18yX2MyX2ZyMV9TYzFfRGMyXzB4MDNfcmF3LmFkdHMiLAogICAgICAgICAgIk1wc18yX2MyX2ZyMV9TYzFfRGMyXzB4MDNfcmF3LmluZm8iLCA0ODAwMCwgMiwgdHJ1ZX0sCi0gICAgICAgIHtNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsICJzaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmFtcm5iIiwKKyAgICAgICAge0FNUl9OQl8xLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIsICJzaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmFtcm5iIiwKICAgICAgICAgICJzaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmluZm8iLCA4MDAwLCAxLCB0cnVlfSwKLSAgICAgICAge01FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiwgImJiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouYW1yd2IiLAorICAgICAgICB7QU1SX1dCXzEsIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiwgImJiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouYW1yd2IiLAogICAgICAgICAgImJiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouaW5mbyIsIDE2MDAwLCAxLCB0cnVlfSwKLSAgICAgICAge01FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywgImJiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei52b3JiaXMiLAotICAgICAgICAgImJiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIiwgNDgwMDAsIDIsIHRydWV9LAotICAgICAgICB7TUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQywgImJiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouZmxhYyIsCisgICAgICAgIHtGTEFDXzEsIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMsICJiYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmZsYWMiLAogICAgICAgICAgImJiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouaW5mbyIsIDQ4MDAwLCAyLCB0cnVlfSwKLSAgICAgICAge01FRElBX01JTUVUWVBFX1ZJREVPX1ZQOSwgImJiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLnZwOSIsCi0gICAgICAgICAiYmJiX3ZwOV8xNzZ4MTQ0XzI4NWticHNfNjBmcHMuaW5mbyIsIDE3NiwgMTQ0LCBmYWxzZX0sCi0gICAgICAgIHtNRURJQV9NSU1FVFlQRV9WSURFT19WUDgsICJiYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy52cDgiLAotICAgICAgICAgImJiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLmluZm8iLCAxNzYsIDE0NCwgZmFsc2V9LAotICAgICAgICB7TUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCAiYmJiX2F2Y18xNzZ4MTQ0XzMwMGticHNfNjBmcHMuaDI2NCIsCi0gICAgICAgICAiYmJiX2F2Y18xNzZ4MTQ0XzMwMGticHNfNjBmcHMuaW5mbyIsIDE3NiwgMTQ0LCBmYWxzZX0sCi0gICAgICAgIHtNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDLCAiYmJiX2hldmNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmhldmMiLAotICAgICAgICAgImJiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5pbmZvIiwgMTc2LCAxNDQsIGZhbHNlfSwKLSAgICAgICAge01FRElBX01JTUVUWVBFX1ZJREVPX0FWMSwgImJiYl9hdjFfMTc2XzE0NC5hdjEiLCAiYmJiX2F2MV8xNzZfMTQ0LmluZm8iLCAxNzYsIDE0NCwgZmFsc2V9LAotICAgICAgICB7TUVESUFfTUlNRVRZUEVfVklERU9fSDI2MywgImJiYl9oMjYzXzM1MngyODhfMzAwa2Jwc18xMmZwcy5oMjYzIiwKKyAgICAgICAge09QVVNfMSwgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUywgImJiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoub3B1cyIsCisgICAgICAgICAiYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIiwgNDgwMDAsIDIsIHRydWV9LAorICAgICAgICB7Vk9SQklTXzEsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywgImJiYl92b3JiaXNfMWNoXzY0a2Jwc18xNmtIei52b3JiaXMiLAorICAgICAgICAgImJiYl92b3JiaXNfMWNoXzY0a2Jwc18xNmtIei5pbmZvIiwgMTYwMDAsIDEsIHRydWV9LAorCisgICAgICAgIHtBVjFfMSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVYxLCAiYmJiX2F2MV8xNzZfMTQ0LmF2MSIsICJiYmJfYXYxXzE3Nl8xNDQuaW5mbyIsIDE3NiwgMTQ0LAorICAgICAgICAgZmFsc2V9LAorICAgICAgICB7QVZDXzEsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgImJiYl9hdmNfMzUyeDI4OF83NjhrYnBzXzMwZnBzLmF2YyIsCisgICAgICAgICAiYmJiX2F2Y18zNTJ4Mjg4Xzc2OGticHNfMzBmcHMuaW5mbyIsIDM1MiwgMjg4LCBmYWxzZX0sCisgICAgICAgIHtIMjYzXzEsIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsICJiYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaDI2MyIsCiAgICAgICAgICAiYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmluZm8iLCAzNTIsIDI4OCwgZmFsc2V9LAotICAgICAgICB7TUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJiYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLm00diIsCisgICAgICAgIHtIRVZDXzEsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMsICJiYmJfaGV2Y18zNDB4MjgwXzc2OGticHNfMzBmcHMuaGV2YyIsCisgICAgICAgICAiYmJiX2hldmNfMzQweDI4MF83NjhrYnBzXzMwZnBzLmluZm8iLCAzNDAsIDI4MCwgZmFsc2V9LAorICAgICAgICB7TVBFRzRfMSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJiYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLm00diIsCiAgICAgICAgICAiYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5pbmZvIiwgMzUyLCAyODgsIGZhbHNlfSwKKyAgICAgICAge1ZQOF8xLCBNRURJQV9NSU1FVFlQRV9WSURFT19WUDgsICJiYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy52cDgiLAorICAgICAgICAgImJiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLmluZm8iLCAxNzYsIDE0NCwgZmFsc2V9LAorICAgICAgICB7VlA5XzEsIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOSwgImJiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLnZwOSIsCisgICAgICAgICAiYmJiX3ZwOV8xNzZ4MTQ0XzI4NWticHNfNjBmcHMuaW5mbyIsIDE3NiwgMTQ0LCBmYWxzZX0sCisKKyAgICAgICAge0hFSUNfMSwgTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDLCAiYmJiX2hldmNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmhldmMiLAorICAgICAgICAgImJiYl9oZWljXzE3NngxNDRfMTc2a2Jwc182MGZwcy5pbmZvIiwgMTc2LCAxNDQsIGZhbHNlfSwKIH07CiAKLWNsYXNzIFdyaXRlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHBhaXI8c3RyaW5nLCBpbnQzMl90Pj4geworY2xhc3MgV3JpdGVyVGVzdCB7CiAgIHB1YmxpYzoKLSAgICBXcml0ZXJUZXN0KCkgOiBtV3JpdGVyKG51bGxwdHIpLCBtRmlsZU1ldGEobnVsbHB0ciksIG1DdXJyZW50VHJhY2sobnVsbHB0cikge30KKyAgICBXcml0ZXJUZXN0KCkgOiBtV3JpdGVyKG51bGxwdHIpLCBtRmlsZU1ldGEobnVsbHB0cikge30KIAogICAgIH5Xcml0ZXJUZXN0KCkgewotICAgICAgICBpZiAobVdyaXRlcikgewotICAgICAgICAgICAgbVdyaXRlci5jbGVhcigpOwotICAgICAgICAgICAgbVdyaXRlciA9IG51bGxwdHI7Ci0gICAgICAgIH0KICAgICAgICAgaWYgKG1GaWxlTWV0YSkgewogICAgICAgICAgICAgbUZpbGVNZXRhLmNsZWFyKCk7CiAgICAgICAgICAgICBtRmlsZU1ldGEgPSBudWxscHRyOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtQ3VycmVudFRyYWNrKSB7Ci0gICAgICAgICAgICBtQ3VycmVudFRyYWNrLmNsZWFyKCk7Ci0gICAgICAgICAgICBtQ3VycmVudFRyYWNrID0gbnVsbHB0cjsKKyAgICAgICAgaWYgKG1Xcml0ZXIpIHsKKyAgICAgICAgICAgIG1Xcml0ZXIuY2xlYXIoKTsKKyAgICAgICAgICAgIG1Xcml0ZXIgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGlmIChnRW52LT5jbGVhblVwKCkpIHJlbW92ZShPVVRQVVRfRklMRV9OQU1FKTsKKworICAgICAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwga01heFRyYWNrQ291bnQ7IGlkeCsrKSB7CisgICAgICAgICAgICBtQnVmZmVySW5mb1tpZHhdLmNsZWFyKCk7CisgICAgICAgICAgICBpZiAobUN1cnJlbnRUcmFja1tpZHhdKSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRUcmFja1tpZHhdLT5zdG9wKCk7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRUcmFja1tpZHhdLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRUcmFja1tpZHhdID0gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtSW5wdXRTdHJlYW1baWR4XS5pc19vcGVuKCkpIG1JbnB1dFN0cmVhbVtpZHhdLmNsb3NlKCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgICAgIG1OdW1Dc2RzID0gMDsKLSAgICAgICAgbUlucHV0RnJhbWVJZCA9IDA7CisgICAgdm9pZCBzZXR1cFdyaXRlclR5cGUoc3RyaW5nIHdyaXRlckZvcm1hdCkgewogICAgICAgICBtV3JpdGVyTmFtZSA9IHVua25vd25fY29tcDsKICAgICAgICAgbURpc2FibGVUZXN0ID0gZmFsc2U7Ci0KICAgICAgICAgc3RhdGljIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGFuZGFyZFdyaXRlcnM+IG1hcFdyaXRlciA9IHsKICAgICAgICAgICAgICAgICB7Im9nZyIsIE9HR30sICAgICB7ImFhYyIsIEFBQ30sICAgICAgeyJhYWNfYWR0cyIsIEFBQ19BRFRTfSwgeyJ3ZWJtIiwgV0VCTX0sCiAgICAgICAgICAgICAgICAgeyJtcGVnNCIsIE1QRUc0fSwgeyJhbXJuYiIsIEFNUl9OQn0sIHsiYW1yd2IiLCBBTVJfV0J9LCAgICAgIHsibXBlZzJUcyIsIE1QRUcyVFN9fTsKICAgICAgICAgLy8gRmluZCB0aGUgY29tcG9uZW50IHR5cGUKLSAgICAgICAgc3RyaW5nIHdyaXRlckZvcm1hdCA9IEdldFBhcmFtKCkuZmlyc3Q7CiAgICAgICAgIGlmIChtYXBXcml0ZXIuZmluZCh3cml0ZXJGb3JtYXQpICE9IG1hcFdyaXRlci5lbmQoKSkgewogICAgICAgICAgICAgbVdyaXRlck5hbWUgPSBtYXBXcml0ZXIuYXQod3JpdGVyRm9ybWF0KTsKICAgICAgICAgfQpAQCAtMTI2LDE2ICsxNjAsMTkgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKLSAgICAgICAgbUJ1ZmZlckluZm8uY2xlYXIoKTsKLSAgICAgICAgaWYgKG1JbnB1dFN0cmVhbS5pc19vcGVuKCkpIG1JbnB1dFN0cmVhbS5jbG9zZSgpOwotICAgIH0KLQotICAgIHZvaWQgZ2V0SW5wdXRCdWZmZXJJbmZvKHN0cmluZyBpbnB1dEZpbGVOYW1lLCBzdHJpbmcgaW5wdXRJbmZvKTsKKyAgICB2b2lkIGdldElucHV0QnVmZmVySW5mbyhzdHJpbmcgaW5wdXRGaWxlTmFtZSwgc3RyaW5nIGlucHV0SW5mbywgaW50MzJfdCBpZHggPSAwKTsKIAogICAgIGludDMyX3QgY3JlYXRlV3JpdGVyKGludDMyX3QgZmQpOwogCi0gICAgaW50MzJfdCBhZGRXcml0ZXJTb3VyY2UoYm9vbCBpc0F1ZGlvLCBjb25maWdGb3JtYXQgcGFyYW1zKTsKKyAgICBpbnQzMl90IGFkZFdyaXRlclNvdXJjZShib29sIGlzQXVkaW8sIGNvbmZpZ0Zvcm1hdCBwYXJhbXMsIGludDMyX3QgaWR4ID0gMCk7CisKKyAgICB2b2lkIHNldHVwRXh0cmFjdG9yKEFNZWRpYUV4dHJhY3RvciAqZXh0cmFjdG9yLCBzdHJpbmcgaW5wdXRGaWxlTmFtZSwgaW50MzJfdCAmdHJhY2tDb3VudCk7CisKKyAgICB2b2lkIGV4dHJhY3QoQU1lZGlhRXh0cmFjdG9yICpleHRyYWN0b3IsIGNvbmZpZ0Zvcm1hdCAmcGFyYW1zLCB2ZWN0b3I8QnVmZmVySW5mbz4gJmJ1ZmZlckluZm8sCisgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZmZlciwgc2l6ZV90IGJ1ZlNpemUsIHNpemVfdCAqYnl0ZXNFeHRyYWN0ZWQsIGludDMyX3QgaWR4KTsKKworICAgIHZvaWQgY29tcGFyZVBhcmFtcyhjb25maWdGb3JtYXQgc3JjUGFyYW0sIGNvbmZpZ0Zvcm1hdCBkc3RQYXJhbSwgdmVjdG9yPEJ1ZmZlckluZm8+IGRzdEJ1ZkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXgpOwogCiAgICAgZW51bSBzdGFuZGFyZFdyaXRlcnMgewogICAgICAgICBPR0csCkBAIC0xNTIsMzIgKzE4OSw0MiBAQAogICAgIHN0YW5kYXJkV3JpdGVycyBtV3JpdGVyTmFtZTsKICAgICBzcDxNZWRpYVdyaXRlcj4gbVdyaXRlcjsKICAgICBzcDxNZXRhRGF0YT4gbUZpbGVNZXRhOwotICAgIHNwPE1lZGlhQWRhcHRlcj4gbUN1cnJlbnRUcmFjazsKKyAgICBzcDxNZWRpYUFkYXB0ZXI+IG1DdXJyZW50VHJhY2tba01heFRyYWNrQ291bnRde307CiAKICAgICBib29sIG1EaXNhYmxlVGVzdDsKLSAgICBpbnQzMl90IG1OdW1Dc2RzOwotICAgIGludDMyX3QgbUlucHV0RnJhbWVJZDsKLSAgICBpZnN0cmVhbSBtSW5wdXRTdHJlYW07Ci0gICAgdmVjdG9yPEJ1ZmZlckluZm8+IG1CdWZmZXJJbmZvOworICAgIGludDMyX3QgbU51bUNzZHNba01heFRyYWNrQ291bnRde307CisgICAgaW50MzJfdCBtSW5wdXRGcmFtZUlkW2tNYXhUcmFja0NvdW50XXt9OworICAgIGlmc3RyZWFtIG1JbnB1dFN0cmVhbVtrTWF4VHJhY2tDb3VudF17fTsKKyAgICB2ZWN0b3I8QnVmZmVySW5mbz4gbUJ1ZmZlckluZm9ba01heFRyYWNrQ291bnRdOwogfTsKIAotdm9pZCBXcml0ZXJUZXN0OjpnZXRJbnB1dEJ1ZmZlckluZm8oc3RyaW5nIGlucHV0RmlsZU5hbWUsIHN0cmluZyBpbnB1dEluZm8pIHsKK2NsYXNzIFdyaXRlRnVuY3Rpb25hbGl0eVRlc3QKKyAgICA6IHB1YmxpYyBXcml0ZXJUZXN0LAorICAgICAgcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0dXBsZTxzdHJpbmcgLyogd3JpdGVyRm9ybWF0Ki8sIGlucHV0SWQgLyogaW5wdXRJZDAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRJZCAvKiBpbnB1dElkMSovLCBmbG9hdCAvKiBCdWZmZXJJbnRlcnZhbCovPj4geworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBzZXR1cFdyaXRlclR5cGUoZ2V0PDA+KEdldFBhcmFtKCkpKTsgfQorfTsKKwordm9pZCBXcml0ZXJUZXN0OjpnZXRJbnB1dEJ1ZmZlckluZm8oc3RyaW5nIGlucHV0RmlsZU5hbWUsIHN0cmluZyBpbnB1dEluZm8sIGludDMyX3QgaWR4KSB7CiAgICAgc3RkOjppZnN0cmVhbSBlbGVJbmZvOwogICAgIGVsZUluZm8ub3BlbihpbnB1dEluZm8uY19zdHIoKSk7CiAgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKTsKICAgICBpbnQzMl90IGJ5dGVzQ291bnQgPSAwOwogICAgIHVpbnQzMl90IGZsYWdzID0gMDsKICAgICBpbnQ2NF90IHRpbWVzdGFtcCA9IDA7CisgICAgaW50MzJfdCBudW1Dc2RzID0gMDsKICAgICB3aGlsZSAoMSkgewogICAgICAgICBpZiAoIShlbGVJbmZvID4+IGJ5dGVzQ291bnQpKSBicmVhazsKICAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKICAgICAgICAgZWxlSW5mbyA+PiB0aW1lc3RhbXA7Ci0gICAgICAgIG1CdWZmZXJJbmZvLnB1c2hfYmFjayh7Ynl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcH0pOwotICAgICAgICBpZiAoZmxhZ3MgPT0gQ09ERUNfQ09ORklHX0ZMQUcpIG1OdW1Dc2RzKys7CisgICAgICAgIG1CdWZmZXJJbmZvW2lkeF0ucHVzaF9iYWNrKHtieXRlc0NvdW50LCBmbGFncywgdGltZXN0YW1wfSk7CisgICAgICAgIGlmIChmbGFncyA9PSBDT0RFQ19DT05GSUdfRkxBRykgbnVtQ3NkcysrOwogICAgIH0KICAgICBlbGVJbmZvLmNsb3NlKCk7Ci0gICAgbUlucHV0U3RyZWFtLm9wZW4oaW5wdXRGaWxlTmFtZS5jX3N0cigpLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOwotICAgIEFTU0VSVF9FUShtSW5wdXRTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBtTnVtQ3Nkc1tpZHhdID0gbnVtQ3NkczsKKyAgICBtSW5wdXRTdHJlYW1baWR4XS5vcGVuKGlucHV0RmlsZU5hbWUuY19zdHIoKSwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEobUlucHV0U3RyZWFtW2lkeF0uaXNfb3BlbigpLCB0cnVlKTsKIH0KIAogaW50MzJfdCBXcml0ZXJUZXN0OjpjcmVhdGVXcml0ZXIoaW50MzJfdCBmZCkgewpAQCAtMjIzLDEwICsyNzAsMTAgQEAKICAgICByZXR1cm4gMDsKIH0KIAotaW50MzJfdCBXcml0ZXJUZXN0OjphZGRXcml0ZXJTb3VyY2UoYm9vbCBpc0F1ZGlvLCBjb25maWdGb3JtYXQgcGFyYW1zKSB7Ci0gICAgaWYgKG1JbnB1dEZyYW1lSWQpIHJldHVybiAtMTsKK2ludDMyX3QgV3JpdGVyVGVzdDo6YWRkV3JpdGVyU291cmNlKGJvb2wgaXNBdWRpbywgY29uZmlnRm9ybWF0IHBhcmFtcywgaW50MzJfdCBpZHgpIHsKKyAgICBpZiAobUlucHV0RnJhbWVJZFtpZHhdKSByZXR1cm4gLTE7CiAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZTsKLSAgICBpZiAobUlucHV0U3RyZWFtLmlzX29wZW4oKSkgeworICAgIGlmIChtSW5wdXRTdHJlYW1baWR4XS5pc19vcGVuKCkpIHsKICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBwYXJhbXMubWltZSk7CiAgICAgICAgIGlmIChpc0F1ZGlvKSB7CiAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgcGFyYW1zLmNoYW5uZWxDb3VudCk7CkBAIC0yMzUsMjUgKzI4MiwzNCBAQAogICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigid2lkdGgiLCBwYXJhbXMud2lkdGgpOwogICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiaGVpZ2h0IiwgcGFyYW1zLmhlaWdodCk7CiAgICAgICAgIH0KLQotICAgICAgICBpbnQzMl90IHN0YXR1cyA9Ci0gICAgICAgICAgICAgICAgd3JpdGVIZWFkZXJCdWZmZXJzKG1JbnB1dFN0cmVhbSwgbUJ1ZmZlckluZm8sIG1JbnB1dEZyYW1lSWQsIGZvcm1hdCwgbU51bUNzZHMpOwotICAgICAgICBpZiAoc3RhdHVzICE9IDApIHJldHVybiAtMTsKKyAgICAgICAgaWYgKG1OdW1Dc2RzW2lkeF0pIHsKKyAgICAgICAgICAgIGludDMyX3Qgc3RhdHVzID0gd3JpdGVIZWFkZXJCdWZmZXJzKG1JbnB1dFN0cmVhbVtpZHhdLCBtQnVmZmVySW5mb1tpZHhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0RnJhbWVJZFtpZHhdLCBmb3JtYXQsIG1OdW1Dc2RzW2lkeF0pOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSAwKSByZXR1cm4gLTE7CisgICAgICAgIH0KICAgICB9CisKICAgICBzcDxNZXRhRGF0YT4gdHJhY2tNZXRhID0gbmV3IE1ldGFEYXRhOwogICAgIGNvbnZlcnRNZXNzYWdlVG9NZXRhRGF0YShmb3JtYXQsIHRyYWNrTWV0YSk7Ci0gICAgbUN1cnJlbnRUcmFjayA9IG5ldyBNZWRpYUFkYXB0ZXIodHJhY2tNZXRhKTsKLSAgICBpZiAobUN1cnJlbnRUcmFjayA9PSBudWxscHRyKSB7CisgICAgbUN1cnJlbnRUcmFja1tpZHhdID0gbmV3IE1lZGlhQWRhcHRlcih0cmFja01ldGEpOworICAgIGlmIChtQ3VycmVudFRyYWNrW2lkeF0gPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiTWVkaWFBZGFwdGVyIHJldHVybmVkIG51bGxwdHIiKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KLSAgICBzdGF0dXNfdCByZXN1bHQgPSBtV3JpdGVyLT5hZGRTb3VyY2UobUN1cnJlbnRUcmFjayk7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gbVdyaXRlci0+YWRkU291cmNlKG1DdXJyZW50VHJhY2tbaWR4XSk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogdm9pZCBnZXRGaWxlRGV0YWlscyhzdHJpbmcgJmlucHV0RmlsZVBhdGgsIHN0cmluZyAmaW5mbywgY29uZmlnRm9ybWF0ICZwYXJhbXMsIGJvb2wgJmlzQXVkaW8sCi0gICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc3RyZWFtSW5kZXggPSAwKSB7Ci0gICAgaWYgKHN0cmVhbUluZGV4ID49IHNpemVvZihrSW5wdXREYXRhKSAvIHNpemVvZihrSW5wdXREYXRhWzBdKSkgeworICAgICAgICAgICAgICAgICAgICBpbnB1dElkIGlucElkKSB7CisgICAgaW50MzJfdCBpbnB1dERhdGFTaXplID0gc2l6ZW9mKGtJbnB1dERhdGEpIC8gc2l6ZW9mKGtJbnB1dERhdGFbMF0pOworICAgIGludDMyX3Qgc3RyZWFtSW5kZXggPSAwOworICAgIGZvciAoOyBzdHJlYW1JbmRleCA8IGlucHV0RGF0YVNpemU7IHN0cmVhbUluZGV4KyspIHsKKyAgICAgICAgaWYgKGlucElkID09IGtJbnB1dERhdGFbc3RyZWFtSW5kZXhdLmlucElkKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3RyZWFtSW5kZXggPT0gaW5wdXREYXRhU2l6ZSkgewogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGlucHV0RmlsZVBhdGggKz0ga0lucHV0RGF0YVtzdHJlYW1JbmRleF0uaW5wdXRGaWxlOwpAQCAtMjcwLDcgKzMyNiwxNDcgQEAKICAgICByZXR1cm47CiB9CiAKLVRFU1RfUChXcml0ZXJUZXN0LCBDcmVhdGVXcml0ZXJUZXN0KSB7Cit2b2lkIFdyaXRlclRlc3Q6OnNldHVwRXh0cmFjdG9yKEFNZWRpYUV4dHJhY3RvciAqZXh0cmFjdG9yLCBzdHJpbmcgaW5wdXRGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAmdHJhY2tDb3VudCkgeworICAgIEFMT0dWKCJJbnB1dCBmaWxlIGZvciBleHRyYWN0b3I6ICVzIiwgaW5wdXRGaWxlTmFtZS5jX3N0cigpKTsKKworICAgIGludDMyX3QgZmQgPSBvcGVuKGlucHV0RmlsZU5hbWUuY19zdHIoKSwgT19SRE9OTFkpOworICAgIEFTU0VSVF9HRShmZCwgMCkgPDwgIkZhaWxlZCB0byBvcGVuIHdyaXRlcidzIG91dHB1dCBmaWxlIHRvIHZhbGlkYXRlIjsKKworICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICBpbnQzMl90IHN0YXR1cyA9IGZzdGF0KGZkLCAmYnVmKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRmFpbGVkIHRvIGdldCBwcm9wZXJ0aWVzIG9mIGlucHV0IGZpbGUgZm9yIGV4dHJhY3RvciI7CisKKyAgICBzaXplX3QgZmlsZVNpemUgPSBidWYuc3Rfc2l6ZTsKKyAgICBBTE9HVigiU2l6ZSBvZiBpbnB1dCBmaWxlIHRvIGV4dHJhY3RvcjogJXp1IiwgZmlsZVNpemUpOworCisgICAgc3RhdHVzID0gQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VGZChleHRyYWN0b3IsIGZkLCAwLCBmaWxlU2l6ZSk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgQU1FRElBX09LKSA8PCAiRmFpbGVkIHRvIHNldCBkYXRhIHNvdXJjZSBmb3IgZXh0cmFjdG9yIjsKKworICAgIHRyYWNrQ291bnQgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0VHJhY2tDb3VudChleHRyYWN0b3IpOworICAgIEFTU0VSVF9HVCh0cmFja0NvdW50LCAwKSA8PCAiTm8gdHJhY2tzIHJlcG9ydGVkIGJ5IGV4dHJhY3RvciI7CisgICAgQUxPR1YoIk51bWJlciBvZiB0cmFja3MgcmVwb3J0ZWQgYnkgZXh0cmFjdG9yIDogJWQiLCB0cmFja0NvdW50KTsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgV3JpdGVyVGVzdDo6ZXh0cmFjdChBTWVkaWFFeHRyYWN0b3IgKmV4dHJhY3RvciwgY29uZmlnRm9ybWF0ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPEJ1ZmZlckluZm8+ICZidWZmZXJJbmZvLCB1aW50OF90ICpidWZmZXIsIHNpemVfdCBidWZTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqYnl0ZXNFeHRyYWN0ZWQsIGludDMyX3QgaWR4KSB7CisgICAgQU1lZGlhRXh0cmFjdG9yX3NlbGVjdFRyYWNrKGV4dHJhY3RvciwgaWR4KTsKKyAgICBBTWVkaWFGb3JtYXQgKmZvcm1hdCA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRUcmFja0Zvcm1hdChleHRyYWN0b3IsIGlkeCk7CisgICAgQVNTRVJUX05FKGZvcm1hdCwgbnVsbHB0cikgPDwgIlRyYWNrIGZvcm1hdCBpcyBOVUxMIjsKKyAgICBBTE9HSSgiVHJhY2sgZm9ybWF0ID0gJXMiLCBBTWVkaWFGb3JtYXRfdG9TdHJpbmcoZm9ybWF0KSk7CisKKyAgICBjb25zdCBjaGFyICptaW1lID0gbnVsbHB0cjsKKyAgICBBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSk7CisgICAgQVNTRVJUX05FKG1pbWUsIG51bGxwdHIpIDw8ICJUcmFjayBtaW1lIGlzIE5VTEwiOworICAgIEFMT0dJKCJUcmFjayBtaW1lID0gJXMiLCBtaW1lKTsKKyAgICBzdHJsY3B5KHBhcmFtcy5taW1lLCBtaW1lLCBrTWltZVNpemUpOworCisgICAgaWYgKCFzdHJuY21wKG1pbWUsICJhdWRpby8iLCA2KSkgeworICAgICAgICBBU1NFUlRfVFJVRSgKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsICZwYXJhbXMuY2hhbm5lbENvdW50KSkKKyAgICAgICAgICAgICAgICA8PCAiRXh0cmFjdG9yIGRpZCBub3QgcmVwb3J0IGNoYW5uZWwgY291bnQiOworICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCAmcGFyYW1zLnNhbXBsZVJhdGUpKQorICAgICAgICAgICAgICAgIDw8ICJFeHRyYWN0b3IgZGlkIG5vdCByZXBvcnQgc2FtcGxlIHJhdGUiOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAobWltZSwgInZpZGVvLyIsIDYpIHx8ICFzdHJuY21wKG1pbWUsICJpbWFnZS8iLCA2KSkgeworICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCAmcGFyYW1zLndpZHRoKSkKKyAgICAgICAgICAgICAgICA8PCAiRXh0cmFjdG9yIGRpZCBub3QgcmVwb3J0IHdpZHRoIjsKKyAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsICZwYXJhbXMuaGVpZ2h0KSkKKyAgICAgICAgICAgICAgICA8PCAiRXh0cmFjdG9yIGRpZCBub3QgcmVwb3J0IGhlaWdodCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJJbnZhbGlkIG1pbWUgIiA8PCBtaW1lOworICAgIH0KKworICAgIGludDMyX3QgYnVmZmVyT2Zmc2V0ID0gMDsKKyAgICAvLyBHZXQgQ1NEIGRhdGEKKyAgICBpbnQgaW5kZXggPSAwOworICAgIHZvaWQgKmNzZEJ1ZjsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBjc2RCdWYgPSBudWxscHRyOworICAgICAgICBjaGFyIGNzZE5hbWVbMTZdOworICAgICAgICBzbnByaW50Zihjc2ROYW1lLCAxNiwgImNzZC0lZCIsIGluZGV4KTsKKyAgICAgICAgc2l6ZV90IGNzZFNpemUgPSAwOworICAgICAgICBib29sIGNzZEZvdW5kID0gQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihmb3JtYXQsIGNzZE5hbWUsICZjc2RCdWYsICZjc2RTaXplKTsKKyAgICAgICAgaWYgKCFjc2RGb3VuZCB8fCAhY3NkQnVmIHx8ICFjc2RTaXplKSBicmVhazsKKworICAgICAgICBidWZmZXJJbmZvLnB1c2hfYmFjayh7c3RhdGljX2Nhc3Q8aW50MzJfdD4oY3NkU2l6ZSksIENPREVDX0NPTkZJR19GTEFHLCAwfSk7CisgICAgICAgIG1lbWNweShidWZmZXIgKyBidWZmZXJPZmZzZXQsIGNzZEJ1ZiwgY3NkU2l6ZSk7CisgICAgICAgIGJ1ZmZlck9mZnNldCArPSBjc2RTaXplOworICAgICAgICBpbmRleCsrOworICAgIH0KKworICAgIC8vIEdldCBmcmFtZSBkYXRhCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgc3NpemVfdCBzYW1wbGVTaXplID0gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVNpemUoZXh0cmFjdG9yKTsKKyAgICAgICAgaWYgKHNhbXBsZVNpemUgPCAwKSBicmVhazsKKworICAgICAgICB1aW50OF90ICpzYW1wbGVCdWZmZXIgPSAodWludDhfdCAqKW1hbGxvYyhzYW1wbGVTaXplKTsKKyAgICAgICAgQVNTRVJUX05FKHNhbXBsZUJ1ZmZlciwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBhbGxvY2F0ZSB0aGUgYnVmZmVyIG9mIHNpemUgIiA8PCBzYW1wbGVTaXplOworCisgICAgICAgIGludCBieXRlc1JlYWQgPSBBTWVkaWFFeHRyYWN0b3JfcmVhZFNhbXBsZURhdGEoZXh0cmFjdG9yLCBzYW1wbGVCdWZmZXIsIHNhbXBsZVNpemUpOworICAgICAgICBBU1NFUlRfRVEoYnl0ZXNSZWFkLCBzYW1wbGVTaXplKQorICAgICAgICAgICAgICAgIDw8ICJOdW1iZXIgb2YgYnl0ZXMgZXh0cmFjdGVkIGRvZXMgbm90IG1hdGNoIHdpdGggc2FtcGxlIHNpemUiOworICAgICAgICBpbnQ2NF90IHB0cyA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVUaW1lKGV4dHJhY3Rvcik7CisgICAgICAgIHVpbnQzMl90IGZsYWcgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlRmxhZ3MoZXh0cmFjdG9yKTsKKworICAgICAgICBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpIHsKKyAgICAgICAgICAgIC8vIFJlbW92aW5nIDQgYnl0ZXMgb2YgQU1FRElBRk9STUFUX0tFWV9WQUxJRF9TQU1QTEVTIGZyb20gc2FtcGxlIHNpemUKKyAgICAgICAgICAgIGJ5dGVzUmVhZCA9IGJ5dGVzUmVhZCAtIDQ7CisgICAgICAgIH0KKworICAgICAgICBBU1NFUlRfTEUoYnVmZmVyT2Zmc2V0ICsgYnl0ZXNSZWFkLCBidWZTaXplKQorICAgICAgICAgICAgICAgIDw8ICJTaXplIG9mIHRoZSBidWZmZXIgaXMgaW5zdWZmaWNpZW50IHRvIHN0b3JlIHRoZSBleHRyYWN0ZWQgZGF0YSI7CisgICAgICAgIGJ1ZmZlckluZm8ucHVzaF9iYWNrKHtieXRlc1JlYWQsIGZsYWcsIHB0c30pOworICAgICAgICBtZW1jcHkoYnVmZmVyICsgYnVmZmVyT2Zmc2V0LCBzYW1wbGVCdWZmZXIsIGJ5dGVzUmVhZCk7CisgICAgICAgIGJ1ZmZlck9mZnNldCArPSBieXRlc1JlYWQ7CisKKyAgICAgICAgQU1lZGlhRXh0cmFjdG9yX2FkdmFuY2UoZXh0cmFjdG9yKTsKKyAgICAgICAgZnJlZShzYW1wbGVCdWZmZXIpOworICAgIH0KKyAgICAqYnl0ZXNFeHRyYWN0ZWQgPSBidWZmZXJPZmZzZXQ7CisgICAgcmV0dXJuOworfQorCit2b2lkIFdyaXRlclRlc3Q6OmNvbXBhcmVQYXJhbXMoY29uZmlnRm9ybWF0IHNyY1BhcmFtLCBjb25maWdGb3JtYXQgZHN0UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPEJ1ZmZlckluZm8+IGRzdEJ1ZkluZm8sIGludDMyX3QgaW5kZXgpIHsKKyAgICBBU1NFUlRfU1RSRVEoc3JjUGFyYW0ubWltZSwgZHN0UGFyYW0ubWltZSkKKyAgICAgICAgICAgIDw8ICJFeHRyYWN0ZWQgbWltZSB0eXBlIGRvZXMgbm90IG1hdGNoIHdpdGggaW5wdXQgbWltZSB0eXBlIjsKKworICAgIGlmICghc3RybmNtcChzcmNQYXJhbS5taW1lLCAiYXVkaW8vIiwgNikpIHsKKyAgICAgICAgQVNTRVJUX0VRKHNyY1BhcmFtLmNoYW5uZWxDb3VudCwgZHN0UGFyYW0uY2hhbm5lbENvdW50KQorICAgICAgICAgICAgICAgIDw8ICJFeHRyYWN0ZWQgY2hhbm5lbCBjb3VudCBkb2VzIG5vdCBtYXRjaCB3aXRoIGlucHV0IGNoYW5uZWwgY291bnQiOworICAgICAgICBBU1NFUlRfRVEoc3JjUGFyYW0uc2FtcGxlUmF0ZSwgZHN0UGFyYW0uc2FtcGxlUmF0ZSkKKyAgICAgICAgICAgICAgICA8PCAiRXh0cmFjdGVkIHNhbXBsZSByYXRlIGRvZXMgbm90IG1hdGNoIHdpdGggaW5wdXQgc2FtcGxlIHJhdGUiOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoc3JjUGFyYW0ubWltZSwgInZpZGVvLyIsIDYpIHx8ICFzdHJuY21wKHNyY1BhcmFtLm1pbWUsICJpbWFnZS8iLCA2KSkgeworICAgICAgICBBU1NFUlRfRVEoc3JjUGFyYW0ud2lkdGgsIGRzdFBhcmFtLndpZHRoKQorICAgICAgICAgICAgICAgIDw8ICJFeHRyYWN0ZWQgd2lkdGggZG9lcyBub3QgbWF0Y2ggd2l0aCBpbnB1dCB3aWR0aCI7CisgICAgICAgIEFTU0VSVF9FUShzcmNQYXJhbS5oZWlnaHQsIGRzdFBhcmFtLmhlaWdodCkKKyAgICAgICAgICAgICAgICA8PCAiRXh0cmFjdGVkIGhlaWdodCBkb2VzIG5vdCBtYXRjaCB3aXRoIGlucHV0IGhlaWdodCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJJbnZhbGlkIG1pbWUgdHlwZSIgPDwgc3JjUGFyYW0ubWltZTsKKyAgICB9CisKKyAgICBpbnQzMl90IHRvbGVyYW5jZVZhbHVlVXMgPSBrTXV4VG9sZXJhbmNlVGltZVVzOworICAgIGlmIChtV3JpdGVyTmFtZSA9PSBNUEVHNCkgeworICAgICAgICB0b2xlcmFuY2VWYWx1ZVVzID0ga01wZWc0TXV4VG9sZXJhbmNlVGltZVVzOworICAgIH0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBkc3RCdWZJbmZvLnNpemUoKTsgaSsrKSB7CisgICAgICAgIEFTU0VSVF9FUShtQnVmZmVySW5mb1tpbmRleF1baV0uc2l6ZSwgZHN0QnVmSW5mb1tpXS5zaXplKQorICAgICAgICAgICAgICAgIDw8ICJJbnB1dCBzaXplICIgPDwgbUJ1ZmZlckluZm9baW5kZXhdW2ldLnNpemUgPDwgIiBtaXNtYXRjaGVkIHdpdGggZXh0cmFjdGVkIHNpemUgIgorICAgICAgICAgICAgICAgIDw8IGRzdEJ1ZkluZm9baV0uc2l6ZTsKKyAgICAgICAgQVNTRVJUX0VRKG1CdWZmZXJJbmZvW2luZGV4XVtpXS5mbGFncywgZHN0QnVmSW5mb1tpXS5mbGFncykKKyAgICAgICAgICAgICAgICA8PCAiSW5wdXQgZmxhZyAiIDw8IG1CdWZmZXJJbmZvW2luZGV4XVtpXS5mbGFncworICAgICAgICAgICAgICAgIDw8ICIgbWlzbWF0Y2hlZCB3aXRoIGV4dHJhY3RlZCBzaXplICIgPDwgZHN0QnVmSW5mb1tpXS5mbGFnczsKKyAgICAgICAgQVNTRVJUX0xFKGFicyhtQnVmZmVySW5mb1tpbmRleF1baV0udGltZVVzIC0gZHN0QnVmSW5mb1tpXS50aW1lVXMpLCB0b2xlcmFuY2VWYWx1ZVVzKQorICAgICAgICAgICAgICAgIDw8ICJEaWZmZXJlbmNlIGJldHdlZW4gb3JpZ2luYWwgdGltZXN0YW1wICIgPDwgbUJ1ZmZlckluZm9baW5kZXhdW2ldLnRpbWVVcworICAgICAgICAgICAgICAgIDw8ICIgYW5kIGV4dHJhY3RlZCB0aW1lc3RhbXAgIiA8PCBkc3RCdWZJbmZvW2ldLnRpbWVVcworICAgICAgICAgICAgICAgIDw8ICJpcyBncmVhdGVyIHRoYW4gdG9sZXJhbmNlIHZhbHVlID0gIiA8PCB0b2xlcmFuY2VWYWx1ZVVzIDw8ICIgbWljcm8gc2Vjb25kcyI7CisgICAgfQorICAgIHJldHVybjsKK30KKworVEVTVF9QKFdyaXRlRnVuY3Rpb25hbGl0eVRlc3QsIENyZWF0ZVdyaXRlclRlc3QpIHsKICAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CiAgICAgQUxPR1YoIlRlc3RzIHRoZSBjcmVhdGlvbiBvZiB3cml0ZXJzIik7CiAKQEAgLTI4MSwxNCArNDc3LDE0IEBACiAKICAgICAvLyBDcmVhdGluZyB3cml0ZXIgd2l0aGluIGEgdGVzdCBzY29wZS4gRGVzdHJ1Y3RvciBzaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIHRlc3QgZW5kcwogICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIGNyZWF0ZVdyaXRlcihmZCkpCi0gICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGNyZWF0ZSB3cml0ZXIgZm9yIG91dHB1dCBmb3JtYXQ6IiA8PCBHZXRQYXJhbSgpLmZpcnN0OworICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBjcmVhdGUgd3JpdGVyIGZvciBvdXRwdXQgZm9ybWF0OiIgPDwgZ2V0PDA+KEdldFBhcmFtKCkpOwogfQogCi1URVNUX1AoV3JpdGVyVGVzdCwgV3JpdGVyVGVzdCkgeworVEVTVF9QKFdyaXRlRnVuY3Rpb25hbGl0eVRlc3QsIFdyaXRlclRlc3QpIHsKICAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CiAgICAgQUxPR1YoIkNoZWNrcyBpZiBmb3IgYSBnaXZlbiBpbnB1dCwgYSB2YWxpZCBtdXhlZCBmaWxlIGhhcyBiZWVuIGNyZWF0ZWQgb3Igbm90Iik7CiAKLSAgICBzdHJpbmcgd3JpdGVyRm9ybWF0ID0gR2V0UGFyYW0oKS5maXJzdDsKKyAgICBzdHJpbmcgd3JpdGVyRm9ybWF0ID0gZ2V0PDA+KEdldFBhcmFtKCkpOwogICAgIHN0cmluZyBvdXRwdXRGaWxlID0gT1VUUFVUX0ZJTEVfTkFNRTsKICAgICBpbnQzMl90IGZkID0KICAgICAgICAgICAgIG9wZW4ob3V0cHV0RmlsZS5jX3N0cigpLCBPX0NSRUFUIHwgT19MQVJHRUZJTEUgfCBPX1RSVU5DIHwgT19SRFdSLCBTX0lSVVNSIHwgU19JV1VTUik7CkBAIC0yOTcsMzUgKzQ5MywxMTAgQEAKICAgICBpbnQzMl90IHN0YXR1cyA9IGNyZWF0ZVdyaXRlcihmZCk7CiAgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSB3cml0ZXIgZm9yIG91dHB1dCBmb3JtYXQ6IiA8PCB3cml0ZXJGb3JtYXQ7CiAKLSAgICBzdHJpbmcgaW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCk7Ci0gICAgc3RyaW5nIGlucHV0SW5mbyA9IGdFbnYtPmdldFJlcygpOwotICAgIGNvbmZpZ0Zvcm1hdCBwYXJhbTsKLSAgICBib29sIGlzQXVkaW87Ci0gICAgaW50MzJfdCBpbnB1dEZpbGVJZHggPSBHZXRQYXJhbSgpLnNlY29uZDsKLSAgICBnZXRGaWxlRGV0YWlscyhpbnB1dEZpbGUsIGlucHV0SW5mbywgcGFyYW0sIGlzQXVkaW8sIGlucHV0RmlsZUlkeCk7Ci0gICAgQVNTRVJUX05FKGlucHV0RmlsZS5jb21wYXJlKGdFbnYtPmdldFJlcygpKSwgMCkgPDwgIk5vIGlucHV0IGZpbGUgc3BlY2lmaWVkIjsKKyAgICBpbnB1dElkIGlucElkW10gPSB7Z2V0PDE+KEdldFBhcmFtKCkpLCBnZXQ8Mj4oR2V0UGFyYW0oKSl9OworICAgIEFTU0VSVF9ORShpbnBJZFswXSwgVU5VU0VEX0lEKSA8PCAiVGVzdCBleHBlY3RzIGZpcnN0IGlucHV0SWQgdG8gYmUgYSB2YWxpZCBpZCI7CiAKLSAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRJbnB1dEJ1ZmZlckluZm8oaW5wdXRGaWxlLCBpbnB1dEluZm8pKTsKLSAgICBzdGF0dXMgPSBhZGRXcml0ZXJTb3VyY2UoaXNBdWRpbywgcGFyYW0pOwotICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBhZGQgc291cmNlIGZvciAiIDw8IHdyaXRlckZvcm1hdCA8PCAiV3JpdGVyIjsKKyAgICBpbnQzMl90IG51bVRyYWNrcyA9IDE7CisgICAgaWYgKGlucElkWzFdICE9IFVOVVNFRF9JRCkgeworICAgICAgICBudW1UcmFja3MrKzsKKyAgICB9CisKKyAgICBzaXplX3QgZmlsZVNpemVbbnVtVHJhY2tzXTsKKyAgICBjb25maWdGb3JtYXQgcGFyYW1bbnVtVHJhY2tzXTsKKyAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwgbnVtVHJhY2tzOyBpZHgrKykgeworICAgICAgICBzdHJpbmcgaW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCk7CisgICAgICAgIHN0cmluZyBpbnB1dEluZm8gPSBnRW52LT5nZXRSZXMoKTsKKyAgICAgICAgYm9vbCBpc0F1ZGlvOworICAgICAgICBnZXRGaWxlRGV0YWlscyhpbnB1dEZpbGUsIGlucHV0SW5mbywgcGFyYW1baWR4XSwgaXNBdWRpbywgaW5wSWRbaWR4XSk7CisgICAgICAgIEFTU0VSVF9ORShpbnB1dEZpbGUuY29tcGFyZShnRW52LT5nZXRSZXMoKSksIDApIDw8ICJObyBpbnB1dCBmaWxlIHNwZWNpZmllZCI7CisKKyAgICAgICAgc3RydWN0IHN0YXQgYnVmOworICAgICAgICBzdGF0dXMgPSBzdGF0KGlucHV0RmlsZS5jX3N0cigpLCAmYnVmKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkZhaWxlZCB0byBnZXQgcHJvcGVydGllcyBvZiBpbnB1dCBmaWxlOiIgPDwgaW5wdXRGaWxlOworICAgICAgICBmaWxlU2l6ZVtpZHhdID0gYnVmLnN0X3NpemU7CisKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZ2V0SW5wdXRCdWZmZXJJbmZvKGlucHV0RmlsZSwgaW5wdXRJbmZvLCBpZHgpKTsKKyAgICAgICAgc3RhdHVzID0gYWRkV3JpdGVyU291cmNlKGlzQXVkaW8sIHBhcmFtW2lkeF0sIGlkeCk7CisgICAgICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBhZGQgc291cmNlIGZvciAiIDw8IHdyaXRlckZvcm1hdCA8PCAiV3JpdGVyIjsKKyAgICB9CiAKICAgICBzdGF0dXMgPSBtV3JpdGVyLT5zdGFydChtRmlsZU1ldGEuZ2V0KCkpOwogICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cyk7Ci0gICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW0sIG1CdWZmZXJJbmZvLCBtSW5wdXRGcmFtZUlkLCBtQ3VycmVudFRyYWNrLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlckluZm8uc2l6ZSgpKTsKLSAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8IHdyaXRlckZvcm1hdCA8PCAiIHdyaXRlciBmYWlsZWQiOwotICAgIG1DdXJyZW50VHJhY2stPnN0b3AoKTsKKyAgICBmbG9hdCBpbnRlcnZhbCA9IGdldDwzPihHZXRQYXJhbSgpKTsKKyAgICBBU1NFUlRfTEUoaW50ZXJ2YWwsIDEuMGYpIDw8ICJCdWZmZXIgaW50ZXJ2YWwgaW52YWxpZC4gU2hvdWxkIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxLjAiOwogCisgICAgc2l6ZV90IHJhbmdlID0gMDsKKyAgICBpbnQzMl90IGxvb3BDb3VudCA9IDA7CisgICAgaW50MzJfdCBvZmZzZXRba01heFRyYWNrQ291bnRde307CisgICAgd2hpbGUgKGxvb3BDb3VudCA8IGNlaWwoMS4wIC8gaW50ZXJ2YWwpKSB7CisgICAgICAgIGZvciAoaW50MzJfdCBpZHggPSAwOyBpZHggPCBudW1UcmFja3M7IGlkeCsrKSB7CisgICAgICAgICAgICByYW5nZSA9IG1CdWZmZXJJbmZvW2lkeF0uc2l6ZSgpICogaW50ZXJ2YWw7CisgICAgICAgICAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbVtpZHhdLCBtQnVmZmVySW5mb1tpZHhdLCBtSW5wdXRGcmFtZUlkW2lkeF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VHJhY2tbaWR4XSwgb2Zmc2V0W2lkeF0sIHJhbmdlKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgd3JpdGVyRm9ybWF0IDw8ICIgd3JpdGVyIGZhaWxlZCI7CisgICAgICAgICAgICBvZmZzZXRbaWR4XSArPSByYW5nZTsKKyAgICAgICAgfQorICAgICAgICBsb29wQ291bnQrKzsKKyAgICB9CisgICAgZm9yIChpbnQzMl90IGlkeCA9IDA7IGlkeCA8IGtNYXhUcmFja0NvdW50OyBpZHgrKykgeworICAgICAgICBpZiAobUN1cnJlbnRUcmFja1tpZHhdKSB7CisgICAgICAgICAgICBtQ3VycmVudFRyYWNrW2lkeF0tPnN0b3AoKTsKKyAgICAgICAgfQorICAgIH0KICAgICBzdGF0dXMgPSBtV3JpdGVyLT5zdG9wKCk7CiAgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0b3AgdGhlIHdyaXRlciI7CiAgICAgY2xvc2UoZmQpOworCisgICAgLy8gVmFsaWRhdGUgdGhlIG91dHB1dCBtdXhlZCBmaWxlIGNyZWF0ZWQgYnkgd3JpdGVyCisgICAgLy8gVE9ETyhiLzE0NjQyMzAyMik6IFNraXAgdmFsaWRhdGluZyBvdXRwdXQgZm9yIHdlYm0gd3JpdGVyCisgICAgLy8gVE9ETyhiLzE0NjQyMTAxOCk6IFNraXAgdmFsaWRhdGluZyBvdXRwdXQgZm9yIG9nZyB3cml0ZXIKKyAgICBpZiAobVdyaXRlck5hbWUgIT0gT0dHICYmIG1Xcml0ZXJOYW1lICE9IFdFQk0pIHsKKyAgICAgICAgY29uZmlnRm9ybWF0IGV4dHJhY3RvclBhcmFtc1tudW1UcmFja3NdOworICAgICAgICB2ZWN0b3I8QnVmZmVySW5mbz4gZXh0cmFjdG9yQnVmZmVySW5mb1tudW1UcmFja3NdOworICAgICAgICBpbnQzMl90IHRyYWNrQ291bnQgPSAtMTsKKworICAgICAgICBBTWVkaWFFeHRyYWN0b3IgKmV4dHJhY3RvciA9IEFNZWRpYUV4dHJhY3Rvcl9uZXcoKTsKKyAgICAgICAgQVNTRVJUX05FKGV4dHJhY3RvciwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBjcmVhdGUgZXh0cmFjdG9yIjsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoc2V0dXBFeHRyYWN0b3IoZXh0cmFjdG9yLCBvdXRwdXRGaWxlLCB0cmFja0NvdW50KSk7CisgICAgICAgIEFTU0VSVF9FUSh0cmFja0NvdW50LCBudW1UcmFja3MpCisgICAgICAgICAgICAgICAgPDwgIlRyYWNrcyByZXBvcnRlZCBieSBleHRyYWN0b3IgZG9lcyBub3QgbWF0Y2ggd2l0aCBpbnB1dCBudW1iZXIgb2YgdHJhY2tzIjsKKworICAgICAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwgbnVtVHJhY2tzOyBpZHgrKykgeworICAgICAgICAgICAgY2hhciAqaW5wdXRCdWZmZXIgPSAoY2hhciAqKW1hbGxvYyhmaWxlU2l6ZVtpZHhdKTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShpbnB1dEJ1ZmZlciwgbnVsbHB0cikKKyAgICAgICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBhbGxvY2F0ZSB0aGUgYnVmZmVyIG9mIHNpemUgIiA8PCBmaWxlU2l6ZVtpZHhdOworICAgICAgICAgICAgbUlucHV0U3RyZWFtW2lkeF0uc2Vla2coMCwgbUlucHV0U3RyZWFtW2lkeF0uYmVnKTsKKyAgICAgICAgICAgIG1JbnB1dFN0cmVhbVtpZHhdLnJlYWQoaW5wdXRCdWZmZXIsIGZpbGVTaXplW2lkeF0pOworICAgICAgICAgICAgQVNTRVJUX0VRKG1JbnB1dFN0cmVhbVtpZHhdLmdjb3VudCgpLCBmaWxlU2l6ZVtpZHhdKTsKKworICAgICAgICAgICAgdWludDhfdCAqZXh0cmFjdGVkQnVmZmVyID0gKHVpbnQ4X3QgKiltYWxsb2MoZmlsZVNpemVbaWR4XSk7CisgICAgICAgICAgICBBU1NFUlRfTkUoZXh0cmFjdGVkQnVmZmVyLCBudWxscHRyKQorICAgICAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIHRoZSBidWZmZXIgb2Ygc2l6ZSAiIDw8IGZpbGVTaXplW2lkeF07CisgICAgICAgICAgICBzaXplX3QgYnl0ZXNFeHRyYWN0ZWQgPSAwOworCisgICAgICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShleHRyYWN0KGV4dHJhY3RvciwgZXh0cmFjdG9yUGFyYW1zW2lkeF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RvckJ1ZmZlckluZm9baWR4XSwgZXh0cmFjdGVkQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlU2l6ZVtpZHhdLCAmYnl0ZXNFeHRyYWN0ZWQsIGlkeCkpOworICAgICAgICAgICAgQVNTRVJUX0dUKGJ5dGVzRXh0cmFjdGVkLCAwKSA8PCAiVG90YWwgYnl0ZXMgZXh0cmFjdGVkIGJ5IGV4dHJhY3RvciBjYW5ub3QgYmUgemVybyI7CisKKyAgICAgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgICAgICAgICBjb21wYXJlUGFyYW1zKHBhcmFtW2lkeF0sIGV4dHJhY3RvclBhcmFtc1tpZHhdLCBleHRyYWN0b3JCdWZmZXJJbmZvW2lkeF0sIGlkeCkpOworCisgICAgICAgICAgICBBU1NFUlRfRVEobWVtY21wKGV4dHJhY3RlZEJ1ZmZlciwgKHVpbnQ4X3QgKilpbnB1dEJ1ZmZlciwgYnl0ZXNFeHRyYWN0ZWQpLCAwKQorICAgICAgICAgICAgICAgICAgICA8PCAiRXh0cmFjdGVkIGJpdCBzdHJlYW0gZG9lcyBub3QgbWF0Y2ggd2l0aCBpbnB1dCBiaXQgc3RyZWFtIjsKKworICAgICAgICAgICAgZnJlZShpbnB1dEJ1ZmZlcik7CisgICAgICAgICAgICBmcmVlKGV4dHJhY3RlZEJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgQU1lZGlhRXh0cmFjdG9yX2RlbGV0ZShleHRyYWN0b3IpOworICAgIH0KIH0KIAotVEVTVF9QKFdyaXRlclRlc3QsIFBhdXNlV3JpdGVyVGVzdCkgeworVEVTVF9QKFdyaXRlRnVuY3Rpb25hbGl0eVRlc3QsIFBhdXNlV3JpdGVyVGVzdCkgewogICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKICAgICBBTE9HVigiVmFsaWRhdGVzIHRoZSBwYXVzZSgpIGFwaSBvZiB3cml0ZXJzIik7CiAKLSAgICBzdHJpbmcgd3JpdGVyRm9ybWF0ID0gR2V0UGFyYW0oKS5maXJzdDsKKyAgICBzdHJpbmcgd3JpdGVyRm9ybWF0ID0gZ2V0PDA+KEdldFBhcmFtKCkpOwogICAgIHN0cmluZyBvdXRwdXRGaWxlID0gT1VUUFVUX0ZJTEVfTkFNRTsKICAgICBpbnQzMl90IGZkID0KICAgICAgICAgICAgIG9wZW4ob3V0cHV0RmlsZS5jX3N0cigpLCBPX0NSRUFUIHwgT19MQVJHRUZJTEUgfCBPX1RSVU5DIHwgT19SRFdSLCBTX0lSVVNSIHwgU19JV1VTUik7CkBAIC0zMzgsOCArNjA5LDEwIEBACiAgICAgc3RyaW5nIGlucHV0SW5mbyA9IGdFbnYtPmdldFJlcygpOwogICAgIGNvbmZpZ0Zvcm1hdCBwYXJhbTsKICAgICBib29sIGlzQXVkaW87Ci0gICAgaW50MzJfdCBpbnB1dEZpbGVJZHggPSBHZXRQYXJhbSgpLnNlY29uZDsKLSAgICBnZXRGaWxlRGV0YWlscyhpbnB1dEZpbGUsIGlucHV0SW5mbywgcGFyYW0sIGlzQXVkaW8sIGlucHV0RmlsZUlkeCk7CisgICAgaW5wdXRJZCBpbnBJZCA9IGdldDwxPihHZXRQYXJhbSgpKTsKKyAgICBBU1NFUlRfTkUoaW5wSWQsIFVOVVNFRF9JRCkgPDwgIlRlc3QgZXhwZWN0cyBmaXJzdCBpbnB1dElkIHRvIGJlIGEgdmFsaWQgaWQiOworCisgICAgZ2V0RmlsZURldGFpbHMoaW5wdXRGaWxlLCBpbnB1dEluZm8sIHBhcmFtLCBpc0F1ZGlvLCBpbnBJZCk7CiAgICAgQVNTRVJUX05FKGlucHV0RmlsZS5jb21wYXJlKGdFbnYtPmdldFJlcygpKSwgMCkgPDwgIk5vIGlucHV0IGZpbGUgc3BlY2lmaWVkIjsKIAogICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGdldElucHV0QnVmZmVySW5mbyhpbnB1dEZpbGUsIGlucHV0SW5mbykpOwpAQCAtMzQ4LDggKzYyMSw4IEBACiAKICAgICBzdGF0dXMgPSBtV3JpdGVyLT5zdGFydChtRmlsZU1ldGEuZ2V0KCkpOwogICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cyk7Ci0gICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW0sIG1CdWZmZXJJbmZvLCBtSW5wdXRGcmFtZUlkLCBtQ3VycmVudFRyYWNrLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlckluZm8uc2l6ZSgpIC8gNCk7CisgICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW1bMF0sIG1CdWZmZXJJbmZvWzBdLCBtSW5wdXRGcmFtZUlkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUcmFja1swXSwgMCwgbUJ1ZmZlckluZm9bMF0uc2l6ZSgpIC8gNCk7CiAgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCB3cml0ZXJGb3JtYXQgPDwgIiB3cml0ZXIgZmFpbGVkIjsKIAogICAgIGJvb2wgaXNQYXVzZWQgPSBmYWxzZTsKQEAgLTM1OSwyNiArNjMyLDI2IEBACiAgICAgICAgIGlzUGF1c2VkID0gdHJ1ZTsKICAgICB9CiAgICAgLy8gSW4gdGhlIHBhdXNlIHN0YXRlLCB3cml0ZXJzIHNob3VsZG4ndCB3cml0ZSBhbnl0aGluZy4gVGVzdGluZyB0aGUgd3JpdGVycyBmb3IgdGhlIHNhbWUKLSAgICBpbnQzMl90IG51bUZyYW1lc1BhdXNlZCA9IG1CdWZmZXJJbmZvLnNpemUoKSAvIDQ7Ci0gICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW0sIG1CdWZmZXJJbmZvLCBtSW5wdXRGcmFtZUlkLCBtQ3VycmVudFRyYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEZyYW1lSWQsIG51bUZyYW1lc1BhdXNlZCwgaXNQYXVzZWQpOworICAgIGludDMyX3QgbnVtRnJhbWVzUGF1c2VkID0gbUJ1ZmZlckluZm9bMF0uc2l6ZSgpIC8gNDsKKyAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbVswXSwgbUJ1ZmZlckluZm9bMF0sIG1JbnB1dEZyYW1lSWRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRyYWNrWzBdLCBtSW5wdXRGcmFtZUlkWzBdLCBudW1GcmFtZXNQYXVzZWQsIGlzUGF1c2VkKTsKICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8IHdyaXRlckZvcm1hdCA8PCAiIHdyaXRlciBmYWlsZWQiOwogCiAgICAgaWYgKGlzUGF1c2VkKSB7CiAgICAgICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0YXJ0KG1GaWxlTWV0YS5nZXQoKSk7CiAgICAgICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cyk7CiAgICAgfQotICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtLCBtQnVmZmVySW5mbywgbUlucHV0RnJhbWVJZCwgbUN1cnJlbnRUcmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRGcmFtZUlkLCBtQnVmZmVySW5mby5zaXplKCkpOworICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtWzBdLCBtQnVmZmVySW5mb1swXSwgbUlucHV0RnJhbWVJZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VHJhY2tbMF0sIG1JbnB1dEZyYW1lSWRbMF0sIG1CdWZmZXJJbmZvWzBdLnNpemUoKSk7CiAgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCB3cml0ZXJGb3JtYXQgPDwgIiB3cml0ZXIgZmFpbGVkIjsKLSAgICBtQ3VycmVudFRyYWNrLT5zdG9wKCk7CisgICAgbUN1cnJlbnRUcmFja1swXS0+c3RvcCgpOwogCiAgICAgc3RhdHVzID0gbVdyaXRlci0+c3RvcCgpOwogICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBzdG9wIHRoZSB3cml0ZXIiOwogICAgIGNsb3NlKGZkKTsKIH0KIAotVEVTVF9QKFdyaXRlclRlc3QsIE11bHRpU3RhcnRTdG9wUGF1c2VUZXN0KSB7CitURVNUX1AoV3JpdGVGdW5jdGlvbmFsaXR5VGVzdCwgTXVsdGlTdGFydFN0b3BQYXVzZVRlc3QpIHsKICAgICAvLyBUT0RPOiAoYi8xNDQ4MjE4MDQpCiAgICAgLy8gRW5hYmxlIHRoZSB0ZXN0IGZvciBNUEUyVFMgd3JpdGVyCiAgICAgaWYgKG1EaXNhYmxlVGVzdCB8fCBtV3JpdGVyTmFtZSA9PSBzdGFuZGFyZFdyaXRlcnM6Ok1QRUcyVFMpIHJldHVybjsKQEAgLTM4OSw3ICs2NjIsNyBAQAogICAgICAgICAgICAgb3BlbihvdXRwdXRGaWxlLmNfc3RyKCksIE9fQ1JFQVQgfCBPX0xBUkdFRklMRSB8IE9fVFJVTkMgfCBPX1JEV1IsIFNfSVJVU1IgfCBTX0lXVVNSKTsKICAgICBBU1NFUlRfR0UoZmQsIDApIDw8ICJGYWlsZWQgdG8gb3BlbiBvdXRwdXQgZmlsZSB0byBkdW1wIHdyaXRlcidzIGRhdGEiOwogCi0gICAgc3RyaW5nIHdyaXRlckZvcm1hdCA9IEdldFBhcmFtKCkuZmlyc3Q7CisgICAgc3RyaW5nIHdyaXRlckZvcm1hdCA9IGdldDwwPihHZXRQYXJhbSgpKTsKICAgICBpbnQzMl90IHN0YXR1cyA9IGNyZWF0ZVdyaXRlcihmZCk7CiAgICAgQVNTRVJUX0VRKHN0YXR1cywgKHN0YXR1c190KU9LKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSB3cml0ZXIgZm9yIG91dHB1dCBmb3JtYXQ6IiA8PCB3cml0ZXJGb3JtYXQ7CiAKQEAgLTM5Nyw4ICs2NzAsMTAgQEAKICAgICBzdHJpbmcgaW5wdXRJbmZvID0gZ0Vudi0+Z2V0UmVzKCk7CiAgICAgY29uZmlnRm9ybWF0IHBhcmFtOwogICAgIGJvb2wgaXNBdWRpbzsKLSAgICBpbnQzMl90IGlucHV0RmlsZUlkeCA9IEdldFBhcmFtKCkuc2Vjb25kOwotICAgIGdldEZpbGVEZXRhaWxzKGlucHV0RmlsZSwgaW5wdXRJbmZvLCBwYXJhbSwgaXNBdWRpbywgaW5wdXRGaWxlSWR4KTsKKyAgICBpbnB1dElkIGlucElkID0gZ2V0PDE+KEdldFBhcmFtKCkpOworICAgIEFTU0VSVF9ORShpbnBJZCwgVU5VU0VEX0lEKSA8PCAiVGVzdCBleHBlY3RzIGZpcnN0IGlucHV0SWQgdG8gYmUgYSB2YWxpZCBpZCI7CisKKyAgICBnZXRGaWxlRGV0YWlscyhpbnB1dEZpbGUsIGlucHV0SW5mbywgcGFyYW0sIGlzQXVkaW8sIGlucElkKTsKICAgICBBU1NFUlRfTkUoaW5wdXRGaWxlLmNvbXBhcmUoZ0Vudi0+Z2V0UmVzKCkpLCAwKSA8PCAiTm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQiOwogCiAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZ2V0SW5wdXRCdWZmZXJJbmZvKGlucHV0RmlsZSwgaW5wdXRJbmZvKSk7CkBAIC00MTUsOCArNjkwLDggQEAKICAgICAgICAgbVdyaXRlci0+c3RhcnQobUZpbGVNZXRhLmdldCgpKTsKICAgICB9CiAKLSAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbSwgbUJ1ZmZlckluZm8sIG1JbnB1dEZyYW1lSWQsIG1DdXJyZW50VHJhY2ssIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVySW5mby5zaXplKCkgLyA0KTsKKyAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbVswXSwgbUJ1ZmZlckluZm9bMF0sIG1JbnB1dEZyYW1lSWRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRyYWNrWzBdLCAwLCBtQnVmZmVySW5mb1swXS5zaXplKCkgLyA0KTsKICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8IHdyaXRlckZvcm1hdCA8PCAiIHdyaXRlciBmYWlsZWQiOwogCiAgICAgZm9yIChpbnQzMl90IGNvdW50ID0gMDsgY291bnQgPCBrTWF4Q291bnQ7IGNvdW50KyspIHsKQEAgLTQyNSwyMCArNzAwLDIwIEBACiAgICAgfQogCiAgICAgbVdyaXRlci0+cGF1c2UoKTsKLSAgICBpbnQzMl90IG51bUZyYW1lc1BhdXNlZCA9IG1CdWZmZXJJbmZvLnNpemUoKSAvIDQ7Ci0gICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW0sIG1CdWZmZXJJbmZvLCBtSW5wdXRGcmFtZUlkLCBtQ3VycmVudFRyYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0RnJhbWVJZCwgbnVtRnJhbWVzUGF1c2VkLCB0cnVlKTsKKyAgICBpbnQzMl90IG51bUZyYW1lc1BhdXNlZCA9IG1CdWZmZXJJbmZvWzBdLnNpemUoKSAvIDQ7CisgICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW1bMF0sIG1CdWZmZXJJbmZvWzBdLCBtSW5wdXRGcmFtZUlkWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUcmFja1swXSwgbUlucHV0RnJhbWVJZFswXSwgbnVtRnJhbWVzUGF1c2VkLCB0cnVlKTsKICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8IHdyaXRlckZvcm1hdCA8PCAiIHdyaXRlciBmYWlsZWQiOwogCiAgICAgZm9yIChpbnQzMl90IGNvdW50ID0gMDsgY291bnQgPCBrTWF4Q291bnQ7IGNvdW50KyspIHsKICAgICAgICAgbVdyaXRlci0+c3RhcnQobUZpbGVNZXRhLmdldCgpKTsKICAgICB9CiAKLSAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbSwgbUJ1ZmZlckluZm8sIG1JbnB1dEZyYW1lSWQsIG1DdXJyZW50VHJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRGcmFtZUlkLCBtQnVmZmVySW5mby5zaXplKCkpOworICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtWzBdLCBtQnVmZmVySW5mb1swXSwgbUlucHV0RnJhbWVJZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VHJhY2tbMF0sIG1JbnB1dEZyYW1lSWRbMF0sIG1CdWZmZXJJbmZvWzBdLnNpemUoKSk7CiAgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCB3cml0ZXJGb3JtYXQgPDwgIiB3cml0ZXIgZmFpbGVkIjsKIAotICAgIG1DdXJyZW50VHJhY2stPnN0b3AoKTsKKyAgICBtQ3VycmVudFRyYWNrWzBdLT5zdG9wKCk7CiAKICAgICAvLyBmaXJzdCBzdG9wIHNob3VsZCBzdWNjZWVkLgogICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0b3AoKTsKQEAgLTQ1MSwxOSArNzI2LDM4MCBAQAogICAgIGNsb3NlKGZkKTsKIH0KIAorY2xhc3MgV3JpdGVyVmFsaWRpdHlUZXN0CisgICAgOiBwdWJsaWMgV3JpdGVyVGVzdCwKKyAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08CisgICAgICAgICAgICAgIHR1cGxlPHN0cmluZyAvKiB3cml0ZXJGb3JtYXQqLywgaW5wdXRJZCAvKiBpbnB1dElkMCovLCBib29sIC8qIGFkZFNvdXJjZUZhaWwqLz4+IHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsgc2V0dXBXcml0ZXJUeXBlKGdldDwwPihHZXRQYXJhbSgpKSk7IH0KK307CisKK1RFU1RfUChXcml0ZXJWYWxpZGl0eVRlc3QsIEludmFsaWRJbnB1dFRlc3QpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQUxPR1YoIlZhbGlkYXRlcyB3cml0ZXIncyBiZWhhdmlvciBmb3IgaW52YWxpZCBpbnB1dHMiKTsKKworICAgIHN0cmluZyB3cml0ZXJGb3JtYXQgPSBnZXQ8MD4oR2V0UGFyYW0oKSk7CisgICAgaW5wdXRJZCBpbnBJZCA9IGdldDwxPihHZXRQYXJhbSgpKTsKKyAgICBib29sIGFkZFNvdXJjZUZhaWxFeHBlY3RlZCA9IGdldDwyPihHZXRQYXJhbSgpKTsKKworICAgIC8vIFRlc3Qgd3JpdGVycyBmb3IgaW52YWxpZCBGRCB2YWx1ZQorICAgIGludDMyX3QgZmQgPSAtMTsKKyAgICBpbnQzMl90IHN0YXR1cyA9IGNyZWF0ZVdyaXRlcihmZCk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICBBTE9HVigiY3JlYXRlV3JpdGVyIGZhaWxlZCBmb3IgaW52YWxpZCBGRCwgdGhpcyBpcyBleHBlY3RlZCBiZWhhdmlvciIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSWYgd3JpdGVyIHdhcyBjcmVhdGVkIGZvciBpbnZhbGlkIGZkLCB0ZXN0IGl0IGZ1cnRoZXIuCisgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpOworICAgIHN0cmluZyBpbnB1dEluZm8gPSBnRW52LT5nZXRSZXMoKTsKKyAgICBjb25maWdGb3JtYXQgcGFyYW07CisgICAgYm9vbCBpc0F1ZGlvOworICAgIEFTU0VSVF9ORShpbnBJZCwgVU5VU0VEX0lEKSA8PCAiVGVzdCBleHBlY3RzIGZpcnN0IGlucHV0SWQgdG8gYmUgYSB2YWxpZCBpZCI7CisKKyAgICBnZXRGaWxlRGV0YWlscyhpbnB1dEZpbGUsIGlucHV0SW5mbywgcGFyYW0sIGlzQXVkaW8sIGlucElkKTsKKyAgICBBU1NFUlRfTkUoaW5wdXRGaWxlLmNvbXBhcmUoZ0Vudi0+Z2V0UmVzKCkpLCAwKSA8PCAiTm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQiOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZ2V0SW5wdXRCdWZmZXJJbmZvKGlucHV0RmlsZSwgaW5wdXRJbmZvKSk7CisgICAgc3RhdHVzID0gYWRkV3JpdGVyU291cmNlKGlzQXVkaW8sIHBhcmFtKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKGFkZFNvdXJjZUZhaWxFeHBlY3RlZCkKKyAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGFkZCBzb3VyY2UgZm9yICIgPDwgd3JpdGVyRm9ybWF0IDw8ICIgd3JpdGVyIjsKKyAgICAgICAgQUxPR1YoImFkZFdyaXRlclNvdXJjZSBmYWlsZWQgZm9yIGludmFsaWQgRkQsIHRoaXMgaXMgZXhwZWN0ZWQgYmVoYXZpb3IiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIHN0YXJ0IHRoZSB3cml0ZXIgd2l0aCB2YWxpZCBhcmd1bWVudCBidXQgaW52YWxpZCBGRAorICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0YXJ0KG1GaWxlTWV0YS5nZXQoKSk7CisgICAgQVNTRVJUX05FKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiV3JpdGVyIGRpZCBub3QgZmFpbCBmb3IgaW52YWxpZCBGRCI7CisKKyAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbVswXSwgbUJ1ZmZlckluZm9bMF0sIG1JbnB1dEZyYW1lSWRbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRyYWNrWzBdLCAwLCBtQnVmZmVySW5mb1swXS5zaXplKCkpOworICAgIEFTU0VSVF9ORSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIldyaXRlciBkaWQgbm90IHJlcG9ydCBlcnJvciBmb3IgaW52YWxpZCBGRCI7CisKKyAgICBzdGF0dXMgPSBtQ3VycmVudFRyYWNrWzBdLT5zdG9wKCk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0b3AgdGhlIHRyYWNrIjsKKworICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0b3AoKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gc3RvcCAiIDw8IHdyaXRlckZvcm1hdCA8PCAiIHdyaXRlciI7Cit9CisKK1RFU1RfUChXcml0ZXJWYWxpZGl0eVRlc3QsIE1hbEZvcm1lZERhdGFUZXN0KSB7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIC8vIEVuYWJsZSB0ZXN0IGZvciBPZ2cgd3JpdGVyCisgICAgQVNTRVJUX05FKG1Xcml0ZXJOYW1lLCBPR0cpIDw8ICJUT0RPKGIvMTYwMTA1NjQ2KSI7CisgICAgQUxPR1YoIlRlc3Qgd3JpdGVyIGZvciBtYWxmb3JtZWQgaW5wdXRzIik7CisKKyAgICBzdHJpbmcgd3JpdGVyRm9ybWF0ID0gZ2V0PDA+KEdldFBhcmFtKCkpOworICAgIGlucHV0SWQgaW5wSWQgPSBnZXQ8MT4oR2V0UGFyYW0oKSk7CisgICAgYm9vbCBhZGRTb3VyY2VGYWlsRXhwZWN0ZWQgPSBnZXQ8Mj4oR2V0UGFyYW0oKSk7CisgICAgaW50MzJfdCBmZCA9CisgICAgICAgICAgICBvcGVuKE9VVFBVVF9GSUxFX05BTUUsIE9fQ1JFQVQgfCBPX0xBUkdFRklMRSB8IE9fVFJVTkMgfCBPX1JEV1IsIFNfSVJVU1IgfCBTX0lXVVNSKTsKKyAgICBBU1NFUlRfR0UoZmQsIDApIDw8ICJGYWlsZWQgdG8gb3BlbiBvdXRwdXQgZmlsZSB0byBkdW1wIHdyaXRlcidzIGRhdGEiOworCisgICAgaW50MzJfdCBzdGF0dXMgPSBjcmVhdGVXcml0ZXIoZmQpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIChzdGF0dXNfdClPSykKKyAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gY3JlYXRlIHdyaXRlciBmb3IgIiA8PCB3cml0ZXJGb3JtYXQgPDwgIiBvdXRwdXQgZm9ybWF0IjsKKworICAgIHN0cmluZyBpbnB1dEZpbGUgPSBnRW52LT5nZXRSZXMoKTsKKyAgICBzdHJpbmcgaW5wdXRJbmZvID0gZ0Vudi0+Z2V0UmVzKCk7CisgICAgY29uZmlnRm9ybWF0IHBhcmFtOworICAgIGJvb2wgaXNBdWRpbzsKKyAgICBBU1NFUlRfTkUoaW5wSWQsIFVOVVNFRF9JRCkgPDwgIlRlc3QgZXhwZWN0cyBmaXJzdCBpbnB1dElkIHRvIGJlIGEgdmFsaWQgaWQiOworCisgICAgZ2V0RmlsZURldGFpbHMoaW5wdXRGaWxlLCBpbnB1dEluZm8sIHBhcmFtLCBpc0F1ZGlvLCBpbnBJZCk7CisgICAgQVNTRVJUX05FKGlucHV0RmlsZS5jb21wYXJlKGdFbnYtPmdldFJlcygpKSwgMCkgPDwgIk5vIGlucHV0IGZpbGUgc3BlY2lmaWVkIjsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGdldElucHV0QnVmZmVySW5mbyhpbnB1dEZpbGUsIGlucHV0SW5mbykpOworICAgIC8vIFJlbW92ZSBDU0QgZGF0YSBmcm9tIGlucHV0CisgICAgbU51bUNzZHNbMF0gPSAwOworICAgIHN0YXR1cyA9IGFkZFdyaXRlclNvdXJjZShpc0F1ZGlvLCBwYXJhbSk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICBBU1NFUlRfVFJVRShhZGRTb3VyY2VGYWlsRXhwZWN0ZWQpCisgICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBhZGQgc291cmNlIGZvciAiIDw8IHdyaXRlckZvcm1hdCA8PCAiIHdyaXRlciI7CisgICAgICAgIEFMT0dWKCIlcyB3cml0ZXIgZmFpbGVkIHRvIGFkZFNvdXJjZSBhZnRlciByZW1vdmluZyBDU0QgZnJvbSBpbnB1dCIsIHdyaXRlckZvcm1hdC5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0YXJ0KG1GaWxlTWV0YS5nZXQoKSk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiQ291bGQgbm90IHN0YXJ0ICIgPDwgd3JpdGVyRm9ybWF0IDw8ICJ3cml0ZXIiOworCisgICAgLy8gU2tpcCBmaXJzdCBmZXcgZnJhbWVzLiBUaGVzZSBtYXkgY29udGFpbiBzeW5jIGZyYW1lcyBhbHNvLgorICAgIGludDMyX3QgZnJhbWVJRCA9IG1JbnB1dEZyYW1lSWRbMF0gKyBtQnVmZmVySW5mb1swXS5zaXplKCkgLyA0OworICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtWzBdLCBtQnVmZmVySW5mb1swXSwgZnJhbWVJRCwgbUN1cnJlbnRUcmFja1swXSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXJJbmZvWzBdLnNpemUoKSk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCB3cml0ZXJGb3JtYXQgPDwgIiB3cml0ZXIgZmFpbGVkIjsKKworICAgIHN0YXR1cyA9IG1DdXJyZW50VHJhY2tbMF0tPnN0b3AoKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gc3RvcCB0aGUgdHJhY2siOworCisgICAgVmVjdG9yPFN0cmluZzE2PiBhcmdzOworICAgIHN0YXR1cyA9IG1Xcml0ZXItPmR1bXAoZmQsIGFyZ3MpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBkdW1wIHN0YXRpc3RpY3MgZnJvbSB3cml0ZXIiOworCisgICAgc3RhdHVzID0gbVdyaXRlci0+c3RvcCgpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBzdG9wICIgPDwgd3JpdGVyRm9ybWF0IDw8ICIgd3JpdGVyIjsKKyAgICBjbG9zZShmZCk7Cit9CisKKy8vIFRoaXMgdGVzdCBpcyBzcGVjaWZpYyB0byBNUEVHNFdyaXRlciB0byB0ZXN0IG1vcmUgQVBJcworVEVTVF9QKFdyaXRlRnVuY3Rpb25hbGl0eVRlc3QsIE1wZWc0V3JpdGVyVGVzdCkgeworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBpZiAobVdyaXRlck5hbWUgIT0gc3RhbmRhcmRXcml0ZXJzOjpNUEVHNCkgcmV0dXJuOworICAgIEFMT0dWKCJUZXN0IE1QRUc0IHdyaXRlciBzcGVjaWZpYyBBUElzIik7CisKKyAgICBpbnB1dElkIGlucElkID0gZ2V0PDE+KEdldFBhcmFtKCkpOworICAgIGludDMyX3QgZmQgPQorICAgICAgICAgICAgb3BlbihPVVRQVVRfRklMRV9OQU1FLCBPX0NSRUFUIHwgT19MQVJHRUZJTEUgfCBPX1RSVU5DIHwgT19SRFdSLCBTX0lSVVNSIHwgU19JV1VTUik7CisgICAgQVNTRVJUX0dFKGZkLCAwKSA8PCAiRmFpbGVkIHRvIG9wZW4gb3V0cHV0IGZpbGUgdG8gZHVtcCB3cml0ZXIncyBkYXRhIjsKKworICAgIGludDMyX3Qgc3RhdHVzID0gY3JlYXRlV3JpdGVyKGZkKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAoc3RhdHVzX3QpT0spIDw8ICJGYWlsZWQgdG8gY3JlYXRlIHdyaXRlciBmb3IgbXBlZzQgb3V0cHV0IGZvcm1hdCI7CisKKyAgICBzdHJpbmcgaW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCk7CisgICAgc3RyaW5nIGlucHV0SW5mbyA9IGdFbnYtPmdldFJlcygpOworICAgIGNvbmZpZ0Zvcm1hdCBwYXJhbTsKKyAgICBib29sIGlzQXVkaW87CisgICAgQVNTRVJUX05FKGlucElkLCBVTlVTRURfSUQpIDw8ICJUZXN0IGV4cGVjdHMgZmlyc3QgaW5wdXRJZCB0byBiZSBhIHZhbGlkIGlkIjsKKworICAgIGdldEZpbGVEZXRhaWxzKGlucHV0RmlsZSwgaW5wdXRJbmZvLCBwYXJhbSwgaXNBdWRpbywgaW5wSWQpOworICAgIEFTU0VSVF9ORShpbnB1dEZpbGUuY29tcGFyZShnRW52LT5nZXRSZXMoKSksIDApIDw8ICJObyBpbnB1dCBmaWxlIHNwZWNpZmllZCI7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRJbnB1dEJ1ZmZlckluZm8oaW5wdXRGaWxlLCBpbnB1dEluZm8pKTsKKyAgICBzdGF0dXMgPSBhZGRXcml0ZXJTb3VyY2UoaXNBdWRpbywgcGFyYW0pOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBhZGQgc291cmNlIGZvciBtcGVnNCBXcml0ZXIiOworCisgICAgLy8gc2lnbmFsIG1ldGEgZGF0YSBmb3IgdGhlIHdyaXRlcgorICAgIHNwPE1QRUc0V3JpdGVyPiBtcDR3cml0ZXIgPSBzdGF0aWNfY2FzdDxNUEVHNFdyaXRlciAqPihtV3JpdGVyLmdldCgpKTsKKyAgICBzdGF0dXMgPSBtcDR3cml0ZXItPnNldEludGVybGVhdmVEdXJhdGlvbihrRGVmYXVsdEludGVybGVhdmVEdXJhdGlvbik7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAic2V0SW50ZXJsZWF2ZUR1cmF0aW9uIGZhaWxlZCI7CisKKyAgICBzdGF0dXMgPSBtcDR3cml0ZXItPnNldEdlb0RhdGEoa0RlZmF1bHRMYXRpdHVkZXgxMDAwMCwga0RlZmF1bHRMb25naXR1ZGV4MTAwMDApOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgInNldEdlb0RhdGEgZmFpbGVkIjsKKworICAgIHN0YXR1cyA9IG1wNHdyaXRlci0+c2V0Q2FwdHVyZVJhdGUoa0RlZmF1bHRGUFMpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgInNldENhcHR1cmVSYXRlIGZhaWxlZCI7CisKKyAgICBzdGF0dXMgPSBtV3JpdGVyLT5zdGFydChtRmlsZU1ldGEuZ2V0KCkpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkNvdWxkIG5vdCBzdGFydCB0aGUgd3JpdGVyIjsKKworICAgIHN0YXR1cyA9IHNlbmRCdWZmZXJzVG9Xcml0ZXIobUlucHV0U3RyZWFtWzBdLCBtQnVmZmVySW5mb1swXSwgbUlucHV0RnJhbWVJZFswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VHJhY2tbMF0sIDAsIG1CdWZmZXJJbmZvWzBdLnNpemUoKSk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAibXBlZzQgd3JpdGVyIGZhaWxlZCI7CisKKyAgICBzdGF0dXMgPSBtQ3VycmVudFRyYWNrWzBdLT5zdG9wKCk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0b3AgdGhlIHRyYWNrIjsKKworICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0b3AoKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gc3RvcCB0aGUgd3JpdGVyIjsKKyAgICBtcDR3cml0ZXIuY2xlYXIoKTsKKyAgICBjbG9zZShmZCk7Cit9CisKK2NsYXNzIExpc3RlbmVyVGVzdAorICAgIDogcHVibGljIFdyaXRlclRlc3QsCisgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHR1cGxlPAorICAgICAgICAgICAgICBzdHJpbmcgLyogd3JpdGVyRm9ybWF0Ki8sIGlucHV0SWQgLyogaW5wdXRJZDAqLywgaW5wdXRJZCAvKiBpbnB1dElkMSovLAorICAgICAgICAgICAgICBmbG9hdCAvKiBGaWxlU2l6ZUxpbWl0Ki8sIGZsb2F0IC8qIEZpbGVEdXJhdGlvbkxpbWl0Ki8sIGZsb2F0IC8qIEJ1ZmZlckludGVydmFsKi8+PiB7CisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7IHNldHVwV3JpdGVyVHlwZShnZXQ8MD4oR2V0UGFyYW0oKSkpOyB9Cit9OworCitURVNUX1AoTGlzdGVuZXJUZXN0LCBTZXRNYXhGaWxlTGltaXRzVGVzdCkgeworICAgIC8vIFRPRE8oYi8xNTE4OTI0MTQpOiBFbmFibGUgdGVzdCBmb3Igb3RoZXIgd3JpdGVycworICAgIGlmIChtRGlzYWJsZVRlc3QgfHwgbVdyaXRlck5hbWUgIT0gTVBFRzQpIHJldHVybjsKKyAgICBBTE9HVigiVmFsaWRhdGVzIHdyaXRlciB3aGVuIG1heCBmaWxlIGxpbWl0cyBhcmUgc2V0Iik7CisKKyAgICBzdHJpbmcgd3JpdGVyRm9ybWF0ID0gZ2V0PDA+KEdldFBhcmFtKCkpOworICAgIHN0cmluZyBvdXRwdXRGaWxlID0gT1VUUFVUX0ZJTEVfTkFNRTsKKyAgICBpbnQzMl90IGZkID0KKyAgICAgICAgICAgIG9wZW4ob3V0cHV0RmlsZS5jX3N0cigpLCBPX0NSRUFUIHwgT19MQVJHRUZJTEUgfCBPX1RSVU5DIHwgT19SRFdSLCBTX0lSVVNSIHwgU19JV1VTUik7CisgICAgQVNTRVJUX0dFKGZkLCAwKSA8PCAiRmFpbGVkIHRvIG9wZW4gb3V0cHV0IGZpbGUgdG8gZHVtcCB3cml0ZXIncyBkYXRhIjsKKworICAgIGludDMyX3Qgc3RhdHVzID0gY3JlYXRlV3JpdGVyKGZkKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIHdyaXRlciBmb3Igb3V0cHV0IGZvcm1hdDoiIDw8IHdyaXRlckZvcm1hdDsKKworICAgIGlucHV0SWQgaW5wSWRbXSA9IHtnZXQ8MT4oR2V0UGFyYW0oKSksIGdldDwyPihHZXRQYXJhbSgpKX07CisgICAgQVNTRVJUX05FKGlucElkWzBdLCBVTlVTRURfSUQpIDw8ICJUZXN0IGV4cGVjdHMgZmlyc3QgaW5wdXRJZCB0byBiZSBhIHZhbGlkIGlkIjsKKworICAgIHNpemVfdCBpbnB1dEZpbGVTaXplID0gMDsKKyAgICBpbnQ2NF90IGxhc3RGcmFtZVRpbWVTdGFtcFVzID0gSU5UX01BWDsKKyAgICBpbnQzMl90IG51bVRyYWNrcyA9IDE7CisgICAgaWYgKGlucElkWzFdICE9IFVOVVNFRF9JRCkgeworICAgICAgICBudW1UcmFja3MrKzsKKyAgICB9CisgICAgZm9yIChpbnQzMl90IGlkeCA9IDA7IGlkeCA8IG51bVRyYWNrczsgaWR4KyspIHsKKyAgICAgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpOworICAgICAgICBzdHJpbmcgaW5wdXRJbmZvID0gZ0Vudi0+Z2V0UmVzKCk7CisgICAgICAgIGNvbmZpZ0Zvcm1hdCBwYXJhbTsKKyAgICAgICAgYm9vbCBpc0F1ZGlvOworICAgICAgICBnZXRGaWxlRGV0YWlscyhpbnB1dEZpbGUsIGlucHV0SW5mbywgcGFyYW0sIGlzQXVkaW8sIGlucElkW2lkeF0pOworICAgICAgICBBU1NFUlRfTkUoaW5wdXRGaWxlLmNvbXBhcmUoZ0Vudi0+Z2V0UmVzKCkpLCAwKSA8PCAiTm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQiOworCisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGdldElucHV0QnVmZmVySW5mbyhpbnB1dEZpbGUsIGlucHV0SW5mbywgaWR4KSk7CisgICAgICAgIHN0YXR1cyA9IGFkZFdyaXRlclNvdXJjZShpc0F1ZGlvLCBwYXJhbSwgaWR4KTsKKyAgICAgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGFkZCBzb3VyY2UgZm9yICIgPDwgd3JpdGVyRm9ybWF0IDw8ICJXcml0ZXIiOworCisgICAgICAgIC8vIFJlYWQgZmlsZSBwcm9wZXJ0aWVzCisgICAgICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICAgICAgc3RhdHVzID0gc3RhdChpbnB1dEZpbGUuY19zdHIoKSwgJmJ1Zik7CisgICAgICAgIEFTU0VSVF9FUSgwLCBzdGF0dXMpOworCisgICAgICAgIGlucHV0RmlsZVNpemUgKz0gYnVmLnN0X3NpemU7CisgICAgICAgIGlmIChsYXN0RnJhbWVUaW1lU3RhbXBVcyA+IG1CdWZmZXJJbmZvW2lkeF1bbUJ1ZmZlckluZm9baWR4XS5zaXplKCkgLSAxXS50aW1lVXMpIHsKKyAgICAgICAgICAgIGxhc3RGcmFtZVRpbWVTdGFtcFVzID0gbUJ1ZmZlckluZm9baWR4XVttQnVmZmVySW5mb1tpZHhdLnNpemUoKSAtIDFdLnRpbWVVczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZsb2F0IGZpbGVTaXplTGltaXQgPSBnZXQ8Mz4oR2V0UGFyYW0oKSk7CisgICAgZmxvYXQgZmlsZUR1cmF0aW9uTGltaXQgPSBnZXQ8ND4oR2V0UGFyYW0oKSk7CisgICAgaW50NjRfdCBtYXhGaWxlU2l6ZSA9IDA7CisgICAgaW50NjRfdCBtYXhGaWxlRHVyYXRpb24gPSAwOworICAgIGlmIChmaWxlU2l6ZUxpbWl0ID4gMCkgeworICAgICAgICBtYXhGaWxlU2l6ZSA9IChpbnQ2NF90KShmaWxlU2l6ZUxpbWl0ICogaW5wdXRGaWxlU2l6ZSk7CisgICAgICAgIG1Xcml0ZXItPnNldE1heEZpbGVTaXplKG1heEZpbGVTaXplKTsKKyAgICB9CisgICAgaWYgKGZpbGVEdXJhdGlvbkxpbWl0ID4gMCkgeworICAgICAgICBtYXhGaWxlRHVyYXRpb24gPSAoaW50NjRfdCkoZmlsZUR1cmF0aW9uTGltaXQgKiBsYXN0RnJhbWVUaW1lU3RhbXBVcyk7CisgICAgICAgIG1Xcml0ZXItPnNldE1heEZpbGVEdXJhdGlvbihtYXhGaWxlRHVyYXRpb24pOworICAgIH0KKworICAgIHNwPFdyaXRlckxpc3RlbmVyPiBsaXN0ZW5lciA9IG5ldyBXcml0ZXJMaXN0ZW5lcigpOworICAgIEFTU0VSVF9ORShsaXN0ZW5lciwgbnVsbHB0cikgPDwgInVuYWJsZSB0byBhbGxvY2F0ZSBsaXN0ZW5lciI7CisKKyAgICBtV3JpdGVyLT5zZXRMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgc3RhdHVzID0gbVdyaXRlci0+c3RhcnQobUZpbGVNZXRhLmdldCgpKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpOworCisgICAgZmxvYXQgaW50ZXJ2YWwgPSBnZXQ8NT4oR2V0UGFyYW0oKSk7CisgICAgQVNTRVJUX0xFKGludGVydmFsLCAxLjBmKSA8PCAiQnVmZmVyIGludGVydmFsIGludmFsaWQuIFNob3VsZCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gMS4wIjsKKworICAgIHNpemVfdCByYW5nZSA9IDA7CisgICAgaW50MzJfdCBsb29wQ291bnQgPSAwOworICAgIGludDMyX3Qgb2Zmc2V0W2tNYXhUcmFja0NvdW50XXt9OworICAgIHdoaWxlIChsb29wQ291bnQgPCBjZWlsKDEuMCAvIGludGVydmFsKSkgeworICAgICAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwgbnVtVHJhY2tzOyBpZHgrKykgeworICAgICAgICAgICAgcmFuZ2UgPSBtQnVmZmVySW5mb1tpZHhdLnNpemUoKSAqIGludGVydmFsOworICAgICAgICAgICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW1baWR4XSwgbUJ1ZmZlckluZm9baWR4XSwgbUlucHV0RnJhbWVJZFtpZHhdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRyYWNrW2lkeF0sIG9mZnNldFtpZHhdLCByYW5nZSwgZmFsc2UsIGxpc3RlbmVyKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgd3JpdGVyRm9ybWF0IDw8ICIgd3JpdGVyIGZhaWxlZCI7CisgICAgICAgICAgICBvZmZzZXRbaWR4XSArPSByYW5nZTsKKyAgICAgICAgfQorICAgICAgICBsb29wQ291bnQrKzsKKyAgICB9CisKKyAgICBBU1NFUlRfVFJVRShtV3JpdGVyLT5yZWFjaGVkRU9TKCkpIDw8ICJFT1Mgbm90IHNpZ25hbGxlZC4iOworCisgICAgZm9yIChpbnQzMl90IGlkeCA9IDA7IGlkeCA8IGtNYXhUcmFja0NvdW50OyBpZHgrKykgeworICAgICAgICBpZiAobUN1cnJlbnRUcmFja1tpZHhdKSB7CisgICAgICAgICAgICBtQ3VycmVudFRyYWNrW2lkeF0tPnN0b3AoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0b3AoKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gc3RvcCB0aGUgd3JpdGVyIjsKKyAgICBjbG9zZShmZCk7CisKKyAgICBpZiAobWF4RmlsZVNpemUgPD0gMCkgeworICAgICAgICBBU1NFUlRfRkFMU0UobGlzdGVuZXItPm1TaWduYWxlZFNpemUpOworICAgIH0gZWxzZSBpZiAobWF4RmlsZUR1cmF0aW9uIDw9IDApIHsKKyAgICAgICAgQVNTRVJUX0ZBTFNFKGxpc3RlbmVyLT5tU2lnbmFsZWREdXJhdGlvbik7CisgICAgfSBlbHNlIGlmIChtYXhGaWxlU2l6ZSA+IDAgJiYgbWF4RmlsZUR1cmF0aW9uIDw9IDApIHsKKyAgICAgICAgQVNTRVJUX1RSVUUobGlzdGVuZXItPm1TaWduYWxlZFNpemUpOworICAgIH0gZWxzZSBpZiAobWF4RmlsZUR1cmF0aW9uID4gMCAmJiBtYXhGaWxlU2l6ZSA8PSAwKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKGxpc3RlbmVyLT5tU2lnbmFsZWREdXJhdGlvbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX1RSVUUobGlzdGVuZXItPm1TaWduYWxlZFNpemUgfHwgbGlzdGVuZXItPm1TaWduYWxlZER1cmF0aW9uKTsKKyAgICB9CisKKyAgICBpZiAobWF4RmlsZVNpemUgPiAwKSB7CisgICAgICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICAgICAgc3RhdHVzID0gc3RhdChvdXRwdXRGaWxlLmNfc3RyKCksICZidWYpOworICAgICAgICBBU1NFUlRfRVEoMCwgc3RhdHVzKTsKKyAgICAgICAgQVNTRVJUX0xFKGJ1Zi5zdF9zaXplLCBtYXhGaWxlU2l6ZSk7CisgICAgfQorfQorCisvLyBUT0RPOiAoYi8xNTA5MjMzODcpCisvLyBBZGQgV0VCTSBpbnB1dAorSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKExpc3RlbmVyVGVzdEFsbCwgTGlzdGVuZXJUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfdHVwbGUoImFhYyIsIEFBQ18xLCBVTlVTRURfSUQsIDAuNiwgMC43LCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJhbXJuYiIsIEFNUl9OQl8xLCBVTlVTRURfSUQsIDAuMiwgMC42LCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJhbXJ3YiIsIEFNUl9XQl8xLCBVTlVTRURfSUQsIDAuNSwgMC41LCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnMlRzIiwgQUFDXzEsIFVOVVNFRF9JRCwgMC4yLCAxLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEFBQ18xLCBVTlVTRURfSUQsIDAuNCwgMC4zLCAwLjI1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEFBQ18xLCBVTlVTRURfSUQsIDAuMywgMSwgMC41KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJvZ2ciLCBPUFVTXzEsIFVOVVNFRF9JRCwgMC43LCAwLjMsIDEpKSk7CisKIC8vIFRPRE86IChiLzE0NDQ3NjE2NCkKIC8vIEFkZCBBQUNfQURUUywgRkxBQywgQVYxIGlucHV0Ci1JTlNUQU5USUFURV9URVNUX1NVSVRFX1AoV3JpdGVyVGVzdEFsbCwgV3JpdGVyVGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3BhaXIoIm9nZyIsIDApLCBtYWtlX3BhaXIoIndlYm0iLCAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImFhYyIsIDEpLCBtYWtlX3BhaXIoIm1wZWc0IiwgMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJhbXJuYiIsIDMpLCBtYWtlX3BhaXIoImFtcndiIiwgNCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJ3ZWJtIiwgNSksIG1ha2VfcGFpcigid2VibSIsIDcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigid2VibSIsIDgpLCBtYWtlX3BhaXIoIm1wZWc0IiwgOSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJtcGVnNCIsIDEwKSwgbWFrZV9wYWlyKCJtcGVnNCIsIDEyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1wZWc0IiwgMTMpLCBtYWtlX3BhaXIoIm1wZWcyVHMiLCAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1wZWcyVHMiLCA5KSkpOworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBXcml0ZXJUZXN0QWxsLCBXcml0ZUZ1bmN0aW9uYWxpdHlUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJhYWMiLCBBQUNfMSwgVU5VU0VEX0lELCAxKSwKKworICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImFtcm5iIiwgQU1SX05CXzEsIFVOVVNFRF9JRCwgMSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYW1yd2IiLCBBTVJfV0JfMSwgVU5VU0VEX0lELCAxKSwKKworICAgICAgICAgICAgICAgIC8vIFRPRE8oYi8xNDQ5MDIwMTgpOiBFbmFibGUgdGVzdCBmb3IgbXBlZzJ0cworICAgICAgICAgICAgICAgIC8vIG1ha2VfdHVwbGUoIm1wZWcyVHMiLCBBQUNfMSwgVU5VU0VEX0lELCAxKSwKKyAgICAgICAgICAgICAgICAvLyBtYWtlX3R1cGxlKCJtcGVnMlRzIiwgQVZDXzEsIFVOVVNFRF9JRCwgMSksCisgICAgICAgICAgICAgICAgLy8gVE9ETyhiLzE1NjM1NTg1Nyk6IEFkZCBtdWx0aXRyYWNrIGZvciBtcGVnMnRzCisgICAgICAgICAgICAgICAgLy8gbWFrZV90dXBsZSgibXBlZzJUcyIsIEFBQ18xLCBBVkNfMSwgMC41MCksCisgICAgICAgICAgICAgICAgLy8gbWFrZV90dXBsZSgibXBlZzJUcyIsIEFWQ18xLCBBQUNfMSwgMC4yNSksCisKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEFBQ18xLCBVTlVTRURfSUQsIDEpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgQU1SX05CXzEsIFVOVVNFRF9JRCwgMSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBBTVJfV0JfMSwgVU5VU0VEX0lELCAxKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEFWQ18xLCBVTlVTRURfSUQsIDEpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgSDI2M18xLCBVTlVTRURfSUQsIDEpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgSEVJQ18xLCBVTlVTRURfSUQsIDEpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgSEVWQ18xLCBVTlVTRURfSUQsIDEpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgTVBFRzRfMSwgVU5VU0VEX0lELCAxKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEFBQ18xLCBBVkNfMSwgMC4yNSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBBVkNfMSwgQUFDXzEsIDAuNzUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgQU1SX1dCXzEsIEFBQ18xLCAwLjc1KSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEhFVkNfMSwgQU1SX1dCXzEsIDAuMjUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgSDI2M18xLCBBTVJfTkJfMSwgMC41MCksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBNUEVHNF8xLCBBQUNfMSwgMC43NSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBBTVJfTkJfMSwgQU1SX1dCXzEsIDAuMjUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgSDI2M18xLCBBTVJfTkJfMSwgMC41MCksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBNUEVHNF8xLCBIRVZDXzEsIDAuNzUpLAorCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgib2dnIiwgT1BVU18xLCBVTlVTRURfSUQsIDEpLAorCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgid2VibSIsIE9QVVNfMSwgVU5VU0VEX0lELCAxKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ3ZWJtIiwgVk9SQklTXzEsIFVOVVNFRF9JRCwgMSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgid2VibSIsIFZQOF8xLCBVTlVTRURfSUQsIDEpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIndlYm0iLCBWUDlfMSwgVU5VU0VEX0lELCAxKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ3ZWJtIiwgVlA4XzEsIE9QVVNfMSwgMC41MCksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgid2VibSIsIFZPUkJJU18xLCBWUDhfMSwgMC4yNSkpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBXcml0ZXJWYWxpZGl0eVRlc3QsIFdyaXRlclZhbGlkaXR5VGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYWFjIiwgQUFDXzEsIHRydWUpLAorCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYW1ybmIiLCBBTVJfTkJfMSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYW1yd2IiLCBBTVJfV0JfMSwgdHJ1ZSksCisKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEFBQ18xLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBBTVJfTkJfMSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgQVZDXzEsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIEgyNjNfMSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm1wZWc0IiwgSEVJQ18xLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgibXBlZzQiLCBIRVZDXzEsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIE1QRUc0XzEsIGZhbHNlKSwKKworICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIm9nZyIsIE9QVVNfMSwgdHJ1ZSksCisKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ3ZWJtIiwgT1BVU18xLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgid2VibSIsIFZPUkJJU18xLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ3ZWJtIiwgVlA4XzEsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJ3ZWJtIiwgVlA5XzEsIGZhbHNlKSkpOwogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAgICAgZ0VudiA9IG5ldyBXcml0ZXJUZXN0RW52aXJvbm1lbnQoKTsKICAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKICAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJUZXN0RW52aXJvbm1lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJUZXN0RW52aXJvbm1lbnQuaAppbmRleCA5OWU2ODZmLi43ZGEwYTYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVGVzdEVudmlyb25tZW50LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclRlc3RFbnZpcm9ubWVudC5oCkBAIC0yNSw3ICsyNSw3IEBACiAKIGNsYXNzIFdyaXRlclRlc3RFbnZpcm9ubWVudCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkVudmlyb25tZW50IHsKICAgcHVibGljOgotICAgIFdyaXRlclRlc3RFbnZpcm9ubWVudCgpIDogcmVzKCIvZGF0YS9sb2NhbC90bXAvIikge30KKyAgICBXcml0ZXJUZXN0RW52aXJvbm1lbnQoKSA6IHJlcygiL2RhdGEvbG9jYWwvdG1wLyIpLCBkZWxldGVPdXRwdXQodHJ1ZSkge30KIAogICAgIC8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cwogICAgIGludCBpbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKQEAgLTM0LDE2ICszNCwyMSBAQAogCiAgICAgY29uc3Qgc3RyaW5nIGdldFJlcygpIGNvbnN0IHsgcmV0dXJuIHJlczsgfQogCisgICAgYm9vbCBjbGVhblVwKCkgY29uc3QgeyByZXR1cm4gZGVsZXRlT3V0cHV0OyB9CisKICAgcHJpdmF0ZToKICAgICBzdHJpbmcgcmVzOworICAgIGJvb2wgZGVsZXRlT3V0cHV0OwogfTsKIAogaW50IFdyaXRlclRlc3RFbnZpcm9ubWVudDo6aW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndikgewotICAgIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHt7InJlcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnUCd9LCB7MCwgMCwgMCwgMH19OworICAgIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHt7InJlcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnUCd9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ImNsZWFuVXAiLCBvcHRpb25hbF9hcmd1bWVudCwgMCwgJ0MnfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIDAsIDAsIDB9fTsKIAogICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICAgIGludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIlA6Iiwgb3B0aW9ucywgJmluZGV4KTsKKyAgICAgICAgaW50IGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiUDpDOiIsIG9wdGlvbnMsICZpbmRleCk7CiAgICAgICAgIGlmIChjID09IC0xKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtNTIsNiArNTcsMTEgQEAKICAgICAgICAgICAgIGNhc2UgJ1AnOgogICAgICAgICAgICAgICAgIHNldFJlcyhvcHRhcmcpOwogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnQyc6CisgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAob3B0YXJnLCAiZmFsc2UiKSkgeworICAgICAgICAgICAgICAgICAgICBkZWxldGVPdXRwdXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC02Miw3ICs3Miw4IEBACiAgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBvcHRpb246ICVzXG5cbiIKICAgICAgICAgICAgICAgICAidXNhZ2U6ICVzIDxndGVzdCBvcHRpb25zPiA8dGVzdCBvcHRpb25zPlxuXG4iCiAgICAgICAgICAgICAgICAgInRlc3Qgb3B0aW9ucyBhcmU6XG5cbiIKLSAgICAgICAgICAgICAgICAiLVAsIC0tcGF0aDogUmVzb3VyY2UgZmlsZXMgZGlyZWN0b3J5IGxvY2F0aW9uXG4iLAorICAgICAgICAgICAgICAgICItUCwgLS1wYXRoOiBSZXNvdXJjZSBmaWxlcyBkaXJlY3RvcnkgbG9jYXRpb25cbiIKKyAgICAgICAgICAgICAgICAiLUMsIGRlZmF1bHQ6dHJ1ZS4gRGVsZXRlIG91dHB1dCBmaWxlIGFmdGVyIHRlc3QgY29tcGxldGVzXG4iLAogICAgICAgICAgICAgICAgIGFyZ3Zbb3B0aW5kID86IDFdLCBhcmd2WzBdKTsKICAgICAgICAgcmV0dXJuIDI7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclV0aWxpdHkuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclV0aWxpdHkuY3BwCmluZGV4IGYyNGNjYjYuLmEzMDQzZmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJVdGlsaXR5LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVXRpbGl0eS5jcHAKQEAgLTI0LDkgKzI0LDE2IEBACiAKIGludDMyX3Qgc2VuZEJ1ZmZlcnNUb1dyaXRlcihpZnN0cmVhbSAmaW5wdXRTdHJlYW0sIHZlY3RvcjxCdWZmZXJJbmZvPiAmYnVmZmVySW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICZpbnB1dEZyYW1lSWQsIHNwPE1lZGlhQWRhcHRlcj4gJmN1cnJlbnRUcmFjaywgaW50MzJfdCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByYW5nZSwgYm9vbCBpc1BhdXNlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcmFuZ2UsIGJvb2wgaXNQYXVzZWQsIHNwPFdyaXRlckxpc3RlbmVyPiBsaXN0ZW5lcikgewogICAgIHdoaWxlICgxKSB7CiAgICAgICAgIGlmIChpbnB1dEZyYW1lSWQgPj0gKGludClidWZmZXJJbmZvLnNpemUoKSB8fCBpbnB1dEZyYW1lSWQgPj0gKG9mZnNldCArIHJhbmdlKSkgYnJlYWs7CisgICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpZiAobGlzdGVuZXItPm1TaWduYWxlZER1cmF0aW9uIHx8IGxpc3RlbmVyLT5tU2lnbmFsZWRTaXplKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIk1heCBGaWxlIGxpbWl0IHJlYWNoZWQuIE5vIG1vcmUgYnVmZmVycyB3aWxsIGJlIHNlbnQgdG8gdGhlIHdyaXRlciIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgaW50MzJfdCBzaXplID0gYnVmZmVySW5mb1tpbnB1dEZyYW1lSWRdLnNpemU7CiAgICAgICAgIGNoYXIgKmRhdGEgPSAoY2hhciAqKW1hbGxvYyhzaXplKTsKICAgICAgICAgaWYgKCFkYXRhKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVXRpbGl0eS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclV0aWxpdHkuaAppbmRleCBjZGQ2MjQ2Li42YjQ1NmZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVXRpbGl0eS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJVdGlsaXR5LmgKQEAgLTI3LDEzICsyNywxOSBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFBZGFwdGVyLmg+CiAKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyNpbmNsdWRlICJXcml0ZXJMaXN0ZW5lci5oIgogCiAjZGVmaW5lIENPREVDX0NPTkZJR19GTEFHIDMyCiAKK2NvbnN0ZXhwciB1aW50MzJfdCBrTWF4VHJhY2tDb3VudCA9IDI7CiBjb25zdGV4cHIgdWludDMyX3Qga01heENTRFN0cmxlbiA9IDE2OwogY29uc3RleHByIHVpbnQzMl90IGtNYXhDb3VudCA9IDIwOworY29uc3RleHByIGludDMyX3Qga01pbWVTaXplID0gMTI4OworY29uc3RleHByIGludDMyX3Qga0RlZmF1bHRJbnRlcmxlYXZlRHVyYXRpb24gPSAwOworLy8gR2VvZGF0YSBpcyBzZXQgYWNjb3JkaW5nIHRvIElTTy02NzA5IHN0YW5kYXJkLgorY29uc3RleHByIGludDMyX3Qga0RlZmF1bHRMYXRpdHVkZXgxMDAwMCA9IDUwMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtEZWZhdWx0TG9uZ2l0dWRleDEwMDAwID0gMTAwMDAwMDsKK2NvbnN0ZXhwciBmbG9hdCBrRGVmYXVsdEZQUyA9IDMwLjBmOwogCiBzdHJ1Y3QgQnVmZmVySW5mbyB7CiAgICAgaW50MzJfdCBzaXplOwpAQCAtNDEsOSArNDcsMTggQEAKICAgICBpbnQ2NF90IHRpbWVVczsKIH07CiAKK3N0cnVjdCBjb25maWdGb3JtYXQgeworICAgIGNoYXIgbWltZVtrTWltZVNpemVdOworICAgIGludDMyX3Qgd2lkdGg7CisgICAgaW50MzJfdCBoZWlnaHQ7CisgICAgaW50MzJfdCBzYW1wbGVSYXRlOworICAgIGludDMyX3QgY2hhbm5lbENvdW50OworfTsKKwogaW50MzJfdCBzZW5kQnVmZmVyc1RvV3JpdGVyKGlmc3RyZWFtICZpbnB1dFN0cmVhbSwgdmVjdG9yPEJ1ZmZlckluZm8+ICZidWZmZXJJbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgJmlucHV0RnJhbWVJZCwgc3A8TWVkaWFBZGFwdGVyPiAmY3VycmVudFRyYWNrLCBpbnQzMl90IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHJhbmdlLCBib29sIGlzUGF1c2VkID0gZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcmFuZ2UsIGJvb2wgaXNQYXVzZWQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxXcml0ZXJMaXN0ZW5lcj4gbGlzdGVuZXIgPSBudWxscHRyKTsKIAogaW50MzJfdCB3cml0ZUhlYWRlckJ1ZmZlcnMoaWZzdHJlYW0gJmlucHV0U3RyZWFtLCB2ZWN0b3I8QnVmZmVySW5mbz4gJmJ1ZmZlckluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICZpbnB1dEZyYW1lSWQsIHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBpbnQzMl90IG51bUNzZHMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZmODg5MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJUaW1lZFRleHRVbml0VGVzdCIsCisgICAgZ3Rlc3Q6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJUaW1lZFRleHRVbml0VGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVduby1tdWx0aWNoYXIiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjU0ZTIzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iVGVzdCBtb2R1bGUgY29uZmlnIGZvciBUaW1lZFRleHQgdW5pdCB0ZXN0Ij4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iVGltZWRUZXh0VW5pdFRlc3QiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iVGltZWRUZXh0VW5pdFRlc3QtPi9kYXRhL2xvY2FsL3RtcC9UaW1lZFRleHRVbml0VGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiCisgICAgICAgICAgICBrZXk9Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0VW5pdFRlc3QuemlwP3VuemlwPXRydWUiCisgICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL1RpbWVkVGV4dFVuaXRUZXN0UmVzLyIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKworICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5HVGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWRldmljZS1wYXRoIiB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im1vZHVsZS1uYW1lIiB2YWx1ZT0iVGltZWRUZXh0VW5pdFRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC9UaW1lZFRleHRVbml0VGVzdFJlcy8iIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvUkVBRE1FLm1kIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNzc0YmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9SRUFETUUubWQKQEAgLTAsMCArMSw0MCBAQAorIyMgTWVkaWEgVGVzdGluZyAjIworLS0tCisjIyMjIFRpbWVkVGV4dCBVbml0IFRlc3QgOgorVGhlIFRpbWVkVGV4dCBVbml0IFRlc3QgU3VpdGUgdmFsaWRhdGVzIHRoZSBUZXh0RGVzY3JpcHRpb24gY2xhc3MgYXZhaWxhYmxlIGluIGxpYnN0YWdlZnJpZ2h0LgorCitSdW4gdGhlIGZvbGxvd2luZyBzdGVwcyB0byBidWlsZCB0aGUgdGVzdCBzdWl0ZToKK2BgYAorbSBUaW1lZFRleHRVbml0VGVzdAorYGBgCisKK1RoZSAzMi1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvCisKK1RoZSA2NC1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC8KKworVG8gdGVzdCA2NC1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0NjQuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC9UaW1lZFRleHRVbml0VGVzdC9UaW1lZFRleHRVbml0VGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKworVG8gdGVzdCAzMi1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0LgorYGBgCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0L1RpbWVkVGV4dFVuaXRUZXN0L1RpbWVkVGV4dFVuaXRUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0VW5pdFRlc3QuemlwKS4KK0Rvd25sb2FkLCB1bnppcCBhbmQgcHVzaCB0aGVzZSBmaWxlcyBpbnRvIGRldmljZSBmb3IgdGVzdGluZy4KKworYGBgCithZGIgcHVzaCBUaW1lZFRleHRVbml0VGVzdFJlcy8uIC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCit1c2FnZTogVGltZWRUZXh0VW5pdFRlc3QgLVAgXDxwYXRoX3RvX2ZvbGRlclw+CitgYGAKK2FkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvVGltZWRUZXh0VW5pdFRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL1RpbWVkVGV4dFVuaXRUZXN0UmVzLworYGBgCitBbHRlcm5hdGl2ZWx5LCB0aGUgdGVzdCBjYW4gYWxzbyBiZSBydW4gdXNpbmcgYXRlc3QgY29tbWFuZC4KKworYGBgCithdGVzdCBUaW1lZFRleHRVbml0VGVzdCAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCitgYGAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L1RpbWVkVGV4dFRlc3RFbnZpcm9ubWVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0VGVzdEVudmlyb25tZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIyODBjMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L1RpbWVkVGV4dFRlc3RFbnZpcm9ubWVudC5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fVElNRURURVhUX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisjZGVmaW5lIF9fVElNRURURVhUX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2NsYXNzIFRpbWVkVGV4dFRlc3RFbnZpcm9ubWVudCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkVudmlyb25tZW50IHsKKyAgcHVibGljOgorICAgIFRpbWVkVGV4dFRlc3RFbnZpcm9ubWVudCgpIDogcmVzKCIvZGF0YS9sb2NhbC90bXAvIikge30KKworICAgIC8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworICAgIGludCBpbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKKworICAgIHZvaWQgc2V0UmVzKGNvbnN0IGNoYXIgKl9yZXMpIHsgcmVzID0gX3JlczsgfQorCisgICAgY29uc3Qgc3RyaW5nIGdldFJlcygpIGNvbnN0IHsgcmV0dXJuIHJlczsgfQorCisgIHByaXZhdGU6CisgICAgc3RyaW5nIHJlczsKK307CisKK2ludCBUaW1lZFRleHRUZXN0RW52aXJvbm1lbnQ6OmluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7eyJyZXMiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwgezAsIDAsIDAsIDB9fTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIlA6Iiwgb3B0aW9ucywgJmluZGV4KTsKKyAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdQJzoKKyAgICAgICAgICAgICAgICBzZXRSZXMob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3B0aW5kIDwgYXJnYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIG9wdGlvbjogJXNcblxuIgorICAgICAgICAgICAgICAgICJ1c2FnZTogJXMgPGd0ZXN0IG9wdGlvbnM+IDx0ZXN0IG9wdGlvbnM+XG5cbiIKKyAgICAgICAgICAgICAgICAidGVzdCBvcHRpb25zIGFyZTpcblxuIgorICAgICAgICAgICAgICAgICItUCwgLS1wYXRoOiBSZXNvdXJjZSBmaWxlcyBkaXJlY3RvcnkgbG9jYXRpb25cbiIsCisgICAgICAgICAgICAgICAgYXJndltvcHRpbmQgPzogMV0sIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAgLy8gX19USU1FRFRFWFRfVEVTVF9FTlZJUk9OTUVOVF9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L1RpbWVkVGV4dFVuaXRUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L1RpbWVkVGV4dFVuaXRUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODVhZTM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0VW5pdFRlc3QuY3BwCkBAIC0wLDAgKzEsMzc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJUaW1lZFRleHRVbml0VGVzdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CisKKyNpbmNsdWRlICJ0aW1lZHRleHQvVGV4dERlc2NyaXB0aW9ucy5oIgorCisjaW5jbHVkZSAiVGltZWRUZXh0VGVzdEVudmlyb25tZW50LmgiCisKK2NvbnN0ZXhwciBpbnQzMl90IGtTdGFydFRpbWVNcyA9IDEwMDAwOworCitlbnVtIHsKKyAgICAvLyBUaGVzZSBrZXlzIG11c3QgYmUgaW4gc3luYyB3aXRoIHRoZSBrZXlzIGluCisgICAgLy8gZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGV4dERlc2NyaXB0aW9ucy5oCisgICAgS0VZX0RJU1BMQVlfRkxBR1MgPSAxLAorICAgIEtFWV9TVFlMRV9GTEFHUyA9IDIsCisgICAgS0VZX0JBQ0tHUk9VTkRfQ09MT1JfUkdCQSA9IDMsCisgICAgS0VZX0hJR0hMSUdIVF9DT0xPUl9SR0JBID0gNCwKKyAgICBLRVlfU0NST0xMX0RFTEFZID0gNSwKKyAgICBLRVlfV1JBUF9URVhUID0gNiwKKyAgICBLRVlfU1RBUlRfVElNRSA9IDcsCisgICAgS0VZX1NUUlVDVF9CTElOS0lOR19URVhUX0xJU1QgPSA4LAorICAgIEtFWV9TVFJVQ1RfRk9OVF9MSVNUID0gOSwKKyAgICBLRVlfU1RSVUNUX0hJR0hMSUdIVF9MSVNUID0gMTAsCisgICAgS0VZX1NUUlVDVF9IWVBFUl9URVhUX0xJU1QgPSAxMSwKKyAgICBLRVlfU1RSVUNUX0tBUkFPS0VfTElTVCA9IDEyLAorICAgIEtFWV9TVFJVQ1RfU1RZTEVfTElTVCA9IDEzLAorICAgIEtFWV9TVFJVQ1RfVEVYVF9QT1MgPSAxNCwKKyAgICBLRVlfU1RSVUNUX0pVU1RJRklDQVRJT04gPSAxNSwKKyAgICBLRVlfU1RSVUNUX1RFWFQgPSAxNiwKKworICAgIEtFWV9HTE9CQUxfU0VUVElORyA9IDEwMSwKKyAgICBLRVlfTE9DQUxfU0VUVElORyA9IDEwMiwKKyAgICBLRVlfU1RBUlRfQ0hBUiA9IDEwMywKKyAgICBLRVlfRU5EX0NIQVIgPSAxMDQsCisgICAgS0VZX0ZPTlRfSUQgPSAxMDUsCisgICAgS0VZX0ZPTlRfU0laRSA9IDEwNiwKKyAgICBLRVlfVEVYVF9DT0xPUl9SR0JBID0gMTA3LAorfTsKKworc3RydWN0IEZvbnRJbmZvIHsKKyAgICBpbnQzMl90IGRpc3BsYXlGbGFnID0gLTE7CisgICAgaW50MzJfdCBob3Jpem9udGFsSnVzdGlmaWNhdGlvbiA9IC0xOworICAgIGludDMyX3QgdmVydGljYWxKdXN0aWZpY2F0aW9uID0gLTE7CisgICAgaW50MzJfdCByZ2JhQmFja2dyb3VuZCA9IC0xOworICAgIGludDMyX3QgbGVmdFBvcyA9IC0xOworICAgIGludDMyX3QgdG9wUG9zID0gLTE7CisgICAgaW50MzJfdCBib3R0b21Qb3MgPSAtMTsKKyAgICBpbnQzMl90IHJpZ2h0UG9zID0gLTE7CisgICAgaW50MzJfdCBzdGFydGNoYXIgPSAtMTsKKyAgICBpbnQzMl90IGVuZENoYXIgPSAtMTsKKyAgICBpbnQzMl90IGZvbnRJZCA9IC0xOworICAgIGludDMyX3QgZmFjZVN0eWxlID0gLTE7CisgICAgaW50MzJfdCBmb250U2l6ZSA9IC0xOworICAgIGludDMyX3QgcmdiYVRleHQgPSAtMTsKKyAgICBpbnQzMl90IGVudHJ5Q291bnQgPSAtMTsKK307CisKK3N0cnVjdCBGb250UmVjb3JkIHsKKyAgICBpbnQzMl90IGZvbnRJRCA9IC0xOworICAgIGludDMyX3QgZm9udE5hbWVMZW5ndGggPSAtMTsKKyAgICBjb25zdCB1aW50OF90ICpmb250ID0gbnVsbHB0cjsKK307CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitzdGF0aWMgVGltZWRUZXh0VGVzdEVudmlyb25tZW50ICpnRW52ID0gbnVsbHB0cjsKKworY2xhc3MgVGltZWRUZXh0VW5pdFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPC8qZmlsZW5hbWUqLyBzdHJpbmc+IHsKKyAgcHVibGljOgorICAgIFRpbWVkVGV4dFVuaXRUZXN0KCl7fTsKKworICAgIH5UaW1lZFRleHRVbml0VGVzdCgpIHsKKyAgICAgICAgaWYgKG1FbGVTdHJlYW0pIG1FbGVTdHJlYW0uY2xvc2UoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIG1JbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBHZXRQYXJhbSgpOworICAgICAgICBtRWxlU3RyZWFtLm9wZW4obUlucHV0RmlsZU5hbWUsIGlmc3RyZWFtOjpiaW5hcnkpOworICAgICAgICBBU1NFUlRfRVEobUVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpIDw8ICJGYWlsZWQgdG8gb3BlbiAiIDw8IEdldFBhcmFtKCk7CisKKyAgICAgICAgc3RydWN0IHN0YXQgYnVmOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGF0KG1JbnB1dEZpbGVOYW1lLmNfc3RyKCksICZidWYpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRmFpbGVkIHRvIGdldCBwcm9wZXJ0aWVzIG9mIGlucHV0IGZpbGU6ICIgPDwgR2V0UGFyYW0oKTsKKyAgICAgICAgbUZpbGVTaXplID0gYnVmLnN0X3NpemU7CisgICAgICAgIEFMT0dJKCJTaXplIG9mIHRoZSBpbnB1dCBmaWxlICVzID0gJXp1IiwgR2V0UGFyYW0oKS5jX3N0cigpLCBtRmlsZVNpemUpOworICAgIH0KKworICAgIHN0cmluZyBtSW5wdXRGaWxlTmFtZTsKKyAgICBzaXplX3QgbUZpbGVTaXplOworICAgIGlmc3RyZWFtIG1FbGVTdHJlYW07Cit9OworCitjbGFzcyBTUlREZXNjcmlwdGlvblRlc3QgOiBwdWJsaWMgVGltZWRUZXh0VW5pdFRlc3QgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBUaW1lZFRleHRVbml0VGVzdDo6U2V0VXAoKTsgfQorfTsKKworY2xhc3MgVGV4dDNHUFBEZXNjcmlwdGlvblRlc3QgOiBwdWJsaWMgVGltZWRUZXh0VW5pdFRlc3QgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBUaW1lZFRleHRVbml0VGVzdDo6U2V0VXAoKTsgfQorfTsKKworVEVTVF9QKFNSVERlc2NyaXB0aW9uVGVzdCwgZXh0cmFjdFNSVERlc2NyaXB0aW9uVGVzdCkgeworICAgIGNoYXIgZGF0YVttRmlsZVNpemVdOworICAgIG1FbGVTdHJlYW0ucmVhZChkYXRhLCBzaXplb2YoZGF0YSkpOworICAgIEFTU0VSVF9FUShtRWxlU3RyZWFtLmdjb3VudCgpLCBtRmlsZVNpemUpOworCisgICAgUGFyY2VsIHBhcmNlbDsKKyAgICBpbnQzMl90IGZsYWcgPSBUZXh0RGVzY3JpcHRpb25zOjpPVVRfT0ZfQkFORF9URVhUX1NSVCB8IFRleHREZXNjcmlwdGlvbnM6OkxPQ0FMX0RFU0NSSVBUSU9OUzsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBUZXh0RGVzY3JpcHRpb25zOjpnZXRQYXJjZWxPZkRlc2NyaXB0aW9ucygoY29uc3QgdWludDhfdCAqKWRhdGEsIG1GaWxlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnLCBrU3RhcnRUaW1lTXMsICZwYXJjZWwpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJnZXRQYXJjZWxPZkRlc2NyaXB0aW9ucyByZXR1cm5lZCBlcnJvciI7CisgICAgQUxPR0koIlNpemUgb2YgdGhlIFBhcmNlbDogJXp1IiwgcGFyY2VsLmRhdGFTaXplKCkpOworICAgIEFTU0VSVF9HVChwYXJjZWwuZGF0YVNpemUoKSwgMCkgPDwgIlBhcmNlbCBpcyBlbXB0eSI7CisKKyAgICBwYXJjZWwuc2V0RGF0YVBvc2l0aW9uKDApOworICAgIGludDMyX3Qga2V5ID0gcGFyY2VsLnJlYWRJbnQzMigpOworICAgIEFTU0VSVF9FUShrZXksIEtFWV9MT0NBTF9TRVRUSU5HKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIGtleSI7CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX1NUQVJUX1RJTUUpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgc3RhcnQgdGltZSBrZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGtTdGFydFRpbWVNcykgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCB0aW1pbmdzIjsKKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfU1RSVUNUX1RFWFQpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgc3RydWN0IHRleHQga2V5IjsKKyAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBtRmlsZVNpemUpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgdGV4dCBkYXRhIjsKKyAgICBpbnQzMl90IGZpbGVTaXplID0gcGFyY2VsLnJlYWRJbnQzMigpOworICAgIEFTU0VSVF9FUShmaWxlU2l6ZSwgbUZpbGVTaXplKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIGZpbGUgc2l6ZSB2YWx1ZSI7CisgICAgdWludDhfdCB0bXBEYXRhW2ZpbGVTaXplXTsKKyAgICBzdGF0dXMgPSBwYXJjZWwucmVhZCgodm9pZCAqKXRtcERhdGEsIGZpbGVTaXplKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRmFpbGVkIHRvIHJlYWQgdGhlIGRhdGEgZnJvbSBwYXJjZWwiOworICAgIC8vIFRvIG1ha2Ugc3VyZSBlbmQgb2YgcGFyY2VsIGlzIHJlYWNoZWQKKyAgICBBU1NFUlRfRVEocGFyY2VsLmRhdGFBdmFpbCgpLCAwKSA8PCAiUGFyY2VsIGhhcyBzb21lIGRhdGEgbGVmdCB0byByZWFkIjsKK30KKworLy8gVGhpcyB0ZXN0IHVzZXMgdGhlIHByb3BlcnRpZXMgb2YgdHgzZyBib3ggbWVudGlvbmVkIGluIDNHUFAgVGltZWQgVGV4dCBGb3JtYXQKKy8vIFNwZWNpZmljYXRpb24jOiAyNi4yNDUgLyBTZWN0aW9uOiA1LjE2KFNhbXBsZSBEZXNjcmlwdGlvbiBGb3JtYXQpCisvLyBodHRwczovL3d3dy4zZ3BwLm9yZy9mdHAvU3BlY3MvYXJjaGl2ZS8yNl9zZXJpZXMvMjYuMjQ1LworCitURVNUX1AoVGV4dDNHUFBEZXNjcmlwdGlvblRlc3QsIFRleHQzR1BQR2xvYmFsRGVzY3JpcHRpb25UZXN0KSB7CisgICAgY2hhciBkYXRhW21GaWxlU2l6ZV07CisgICAgbUVsZVN0cmVhbS5yZWFkKGRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgQVNTRVJUX0VRKG1FbGVTdHJlYW0uZ2NvdW50KCksIG1GaWxlU2l6ZSk7CisKKyAgICBjb25zdCB1aW50OF90ICp0bXBEYXRhID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOworICAgIGludDMyX3QgcmVtYWluaW5nID0gbUZpbGVTaXplOworICAgIEZvbnRJbmZvIGZvbnRJbmZvOworICAgIHZlY3RvcjxGb250UmVjb3JkPiBmb250UmVjb3JkRW50cmllczsKKworICAgIC8vIFNraXBwaW5nIHRoZSBieXRlcyBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIG9mIHN1YmJveCh0eDNnKQorICAgIHRtcERhdGEgKz0gMTY7CisgICAgcmVtYWluaW5nIC09IDE2OworCisgICAgZm9udEluZm8uZGlzcGxheUZsYWcgPSBVMzJfQVQodG1wRGF0YSk7CisgICAgQUxPR0koIkRpc3BsYXkgZmxhZzogJWQiLCBmb250SW5mby5kaXNwbGF5RmxhZyk7CisgICAgZm9udEluZm8uaG9yaXpvbnRhbEp1c3RpZmljYXRpb24gPSB0bXBEYXRhWzRdOworICAgIEFMT0dJKCJIb3Jpem9udGFsIEp1c3RpZmljYXRpb246ICVkIiwgZm9udEluZm8uaG9yaXpvbnRhbEp1c3RpZmljYXRpb24pOworICAgIGZvbnRJbmZvLnZlcnRpY2FsSnVzdGlmaWNhdGlvbiA9IHRtcERhdGFbNV07CisgICAgQUxPR0koIlZlcnRpY2FsIEp1c3RpZmljYXRpb246ICVkIiwgZm9udEluZm8udmVydGljYWxKdXN0aWZpY2F0aW9uKTsKKyAgICBmb250SW5mby5yZ2JhQmFja2dyb3VuZCA9CisgICAgICAgICAgICAqKHRtcERhdGEgKyA2KSA8PCAyNCB8ICoodG1wRGF0YSArIDcpIDw8IDE2IHwgKih0bXBEYXRhICsgOCkgPDwgOCB8ICoodG1wRGF0YSArIDkpOworICAgIEFMT0dJKCJyZ2JhIHZhbHVlIG9mIGJhY2tncm91bmQ6ICVkIiwgZm9udEluZm8ucmdiYUJhY2tncm91bmQpOworCisgICAgdG1wRGF0YSArPSAxMDsKKyAgICByZW1haW5pbmcgLT0gMTA7CisKKyAgICBpZiAocmVtYWluaW5nID49IDgpIHsKKyAgICAgICAgZm9udEluZm8ubGVmdFBvcyA9IFUxNl9BVCh0bXBEYXRhKTsKKyAgICAgICAgQUxPR0koIkxlZnQ6ICVkIiwgZm9udEluZm8ubGVmdFBvcyk7CisgICAgICAgIGZvbnRJbmZvLnRvcFBvcyA9IFUxNl9BVCh0bXBEYXRhICsgMik7CisgICAgICAgIEFMT0dJKCJUb3A6ICVkIiwgZm9udEluZm8udG9wUG9zKTsKKyAgICAgICAgZm9udEluZm8uYm90dG9tUG9zID0gVTE2X0FUKHRtcERhdGEgKyA0KTsKKyAgICAgICAgQUxPR0koIkJvdHRvbTogJWQiLCBmb250SW5mby5ib3R0b21Qb3MpOworICAgICAgICBmb250SW5mby5yaWdodFBvcyA9IFUxNl9BVCh0bXBEYXRhICsgNik7CisgICAgICAgIEFMT0dJKCJSaWdodDogJWQiLCBmb250SW5mby5yaWdodFBvcyk7CisKKyAgICAgICAgdG1wRGF0YSArPSA4OworICAgICAgICByZW1haW5pbmcgLT0gODsKKworICAgICAgICBpZiAocmVtYWluaW5nID49IDEyKSB7CisgICAgICAgICAgICBmb250SW5mby5zdGFydGNoYXIgPSBVMTZfQVQodG1wRGF0YSk7CisgICAgICAgICAgICBBTE9HSSgiU3RhcnQgY2hhcmFjdGVyOiAlZCIsIGZvbnRJbmZvLnN0YXJ0Y2hhcik7CisgICAgICAgICAgICBmb250SW5mby5lbmRDaGFyID0gVTE2X0FUKHRtcERhdGEgKyAyKTsKKyAgICAgICAgICAgIEFMT0dJKCJFbmQgY2hhcmFjdGVyOiAlZCIsIGZvbnRJbmZvLmVuZENoYXIpOworICAgICAgICAgICAgZm9udEluZm8uZm9udElkID0gVTE2X0FUKHRtcERhdGEgKyA0KTsKKyAgICAgICAgICAgIEFMT0dJKCJWYWx1ZSBvZiBmb250IElkZW50aWZpZXI6ICVkIiwgZm9udEluZm8uZm9udElkKTsKKyAgICAgICAgICAgIGZvbnRJbmZvLmZhY2VTdHlsZSA9ICoodG1wRGF0YSArIDYpOworICAgICAgICAgICAgQUxPR0koIkZhY2Ugc3R5bGUgZmxhZyA6ICVkIiwgZm9udEluZm8uZmFjZVN0eWxlKTsKKyAgICAgICAgICAgIGZvbnRJbmZvLmZvbnRTaXplID0gKih0bXBEYXRhICsgNyk7CisgICAgICAgICAgICBBTE9HSSgiU2l6ZSBvZiB0aGUgZm9udDogJWQiLCBmb250SW5mby5mb250U2l6ZSk7CisgICAgICAgICAgICBmb250SW5mby5yZ2JhVGV4dCA9ICoodG1wRGF0YSArIDgpIDw8IDI0IHwgKih0bXBEYXRhICsgOSkgPDwgMTYgfCAqKHRtcERhdGEgKyAxMCkgPDwgOCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoodG1wRGF0YSArIDExKTsKKyAgICAgICAgICAgIEFMT0dJKCJyZ2JhIHZhbHVlIG9mIHRoZSB0ZXh0OiAlZCIsIGZvbnRJbmZvLnJnYmFUZXh0KTsKKworICAgICAgICAgICAgdG1wRGF0YSArPSAxMjsKKyAgICAgICAgICAgIHJlbWFpbmluZyAtPSAxMjsKKworICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA+PSAxMCkgeworICAgICAgICAgICAgICAgIC8vIFNraXBwaW5nIHRoZSBieXRlcyBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIG9mIHN1YmJveChmdGFiKQorICAgICAgICAgICAgICAgIGZvbnRJbmZvLmVudHJ5Q291bnQgPSBVMTZfQVQodG1wRGF0YSArIDgpOworICAgICAgICAgICAgICAgIEFMT0dJKCJWYWx1ZSBvZiBlbnRyeSBjb3VudDogJWQiLCBmb250SW5mby5lbnRyeUNvdW50KTsKKworICAgICAgICAgICAgICAgIHRtcERhdGEgKz0gMTA7CisgICAgICAgICAgICAgICAgcmVtYWluaW5nIC09IDEwOworCisgICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZm9udEluZm8uZW50cnlDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPCAzKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0ZW1wRm9udElEID0gVTE2X0FUKHRtcERhdGEpOworICAgICAgICAgICAgICAgICAgICBBTE9HSSgiRm9udCBJZDogJWQiLCB0ZW1wRm9udElEKTsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0ZW1wRm9udE5hbWVMZW5ndGggPSAqKHRtcERhdGEgKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koIkxlbmd0aCBvZiBmb250IG5hbWU6ICVkIiwgdGVtcEZvbnROYW1lTGVuZ3RoKTsKKworICAgICAgICAgICAgICAgICAgICB0bXBEYXRhICs9IDM7CisgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyAtPSAzOworCisgICAgICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPCB0ZW1wRm9udE5hbWVMZW5ndGgpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICp0bXBGb250ID0gdG1wRGF0YTsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqdG1wRm9udE5hbWUgPSBzdHJuZHVwKChjb25zdCBjaGFyICopdG1wRm9udCwgdGVtcEZvbnROYW1lTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUX05FKHRtcEZvbnROYW1lLCBudWxscHRyKSA8PCAiRm9udCBOYW1lIGlzIG51bGwiOworICAgICAgICAgICAgICAgICAgICBBTE9HSSgiRm9udE5hbWUgPSAlcyIsIHRtcEZvbnROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZSh0bXBGb250TmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHRtcERhdGEgKz0gdGVtcEZvbnROYW1lTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgLT0gdGVtcEZvbnROYW1lTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBmb250UmVjb3JkRW50cmllcy5wdXNoX2JhY2soe3RlbXBGb250SUQsIHRlbXBGb250TmFtZUxlbmd0aCwgdG1wRm9udH0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIFBhcmNlbCBwYXJjZWw7CisgICAgaW50MzJfdCBmbGFnID0gVGV4dERlc2NyaXB0aW9uczo6SU5fQkFORF9URVhUXzNHUFAgfCBUZXh0RGVzY3JpcHRpb25zOjpHTE9CQUxfREVTQ1JJUFRJT05TOworICAgIHN0YXR1c190IHN0YXR1cyA9IFRleHREZXNjcmlwdGlvbnM6OmdldFBhcmNlbE9mRGVzY3JpcHRpb25zKChjb25zdCB1aW50OF90ICopZGF0YSwgbUZpbGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWcsIGtTdGFydFRpbWVNcywgJnBhcmNlbCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgImdldFBhcmNlbE9mRGVzY3JpcHRpb25zIHJldHVybmVkIGVycm9yIjsKKyAgICBBTE9HSSgiU2l6ZSBvZiB0aGUgUGFyY2VsOiAlenUiLCBwYXJjZWwuZGF0YVNpemUoKSk7CisgICAgQVNTRVJUX0dUKHBhcmNlbC5kYXRhU2l6ZSgpLCAwKSA8PCAiUGFyY2VsIGlzIGVtcHR5IjsKKworICAgIHBhcmNlbC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgaW50MzJfdCBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX0dMT0JBTF9TRVRUSU5HKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIGtleSI7CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX0RJU1BMQVlfRkxBR1MpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgRElTUExBWSBGTEFHUyBLZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLmRpc3BsYXlGbGFnKQorICAgICAgICAgICAgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCB2YWx1ZSBvZiBkaXNwbGF5IGZsYWciOworCisgICAga2V5ID0gcGFyY2VsLnJlYWRJbnQzMigpOworICAgIEFTU0VSVF9FUShrZXksIEtFWV9TVFJVQ1RfSlVTVElGSUNBVElPTikgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCBTVFJVQ1QgSlVTVElGSUNBVElPTiBrZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLmhvcml6b250YWxKdXN0aWZpY2F0aW9uKQorICAgICAgICAgICAgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCB2YWx1ZSBvZiBIb3Jpem9udGFsIGp1c3RpZmljYXRpb24iOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLnZlcnRpY2FsSnVzdGlmaWNhdGlvbikKKyAgICAgICAgICAgIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgdmFsdWUgb2YgVmVydGljYWwganVzdGlmaWNhdGlvbiI7CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX0JBQ0tHUk9VTkRfQ09MT1JfUkdCQSkgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCBCQUNLR1JPVU5EIENPTE9SIGtleSI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udEluZm8ucmdiYUJhY2tncm91bmQpCisgICAgICAgICAgICA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHJnYmEgYmFja2dyb3VuZCBjb2xvciB2YWx1ZSI7CisKKyAgICBpZiAocGFyY2VsLmRhdGFBdmFpbCgpID09IDApIHsKKyAgICAgICAgQUxPR1YoIkNvbXBsZXRlZCByZWFkaW5nIHRoZSBwYXJjZWwiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfU1RSVUNUX1RFWFRfUE9TKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIFNUUlVDVCBURVhUIFBPU0lUSU9OIGtleSI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udEluZm8ubGVmdFBvcykKKyAgICAgICAgICAgIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgcmdiYSBiYWNrZ3JvdW5kIGNvbG9yIHZhbHVlIjsKKyAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBmb250SW5mby50b3BQb3MpCisgICAgICAgICAgICA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHJnYmEgYmFja2dyb3VuZCBjb2xvciB2YWx1ZSI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udEluZm8uYm90dG9tUG9zKQorICAgICAgICAgICAgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCByZ2JhIGJhY2tncm91bmQgY29sb3IgdmFsdWUiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLnJpZ2h0UG9zKQorICAgICAgICAgICAgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCByZ2JhIGJhY2tncm91bmQgY29sb3IgdmFsdWUiOworCisgICAgaWYgKHBhcmNlbC5kYXRhQXZhaWwoKSA9PSAwKSB7CisgICAgICAgIEFMT0dWKCJDb21wbGV0ZWQgcmVhZGluZyB0aGUgcGFyY2VsIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX1NUUlVDVF9TVFlMRV9MSVNUKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIFNUUlVDVCBTVFlMRSBMSVNUIGtleSI7CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX1NUQVJUX0NIQVIpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgU1RBUlQgQ0hBUiBrZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLnN0YXJ0Y2hhcikKKyAgICAgICAgICAgIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgdmFsdWUgb2Ygc3RhcnQgY2hhcmFjdGVyIjsKKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfRU5EX0NIQVIpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgRU5EIENIQVIga2V5IjsKKyAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBmb250SW5mby5lbmRDaGFyKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHZhbHVlIG9mIGVuZCBjaGFyYWN0ZXIiOworCisgICAga2V5ID0gcGFyY2VsLnJlYWRJbnQzMigpOworICAgIEFTU0VSVF9FUShrZXksIEtFWV9GT05UX0lEKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIEZPTlQgSUQga2V5IjsKKyAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBmb250SW5mby5mb250SWQpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgdmFsdWUgb2YgZm9udCBJZCI7CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX1NUWUxFX0ZMQUdTKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIFNUWUxFIEZMQUdTIGtleSI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udEluZm8uZmFjZVN0eWxlKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHZhbHVlIG9mIHN0eWxlIGZsYWdzIjsKKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfRk9OVF9TSVpFKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIEZPTlQgU0laRSBrZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLmZvbnRTaXplKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHZhbHVlIG9mIGZvbnQgc2l6ZSI7CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX1RFWFRfQ09MT1JfUkdCQSkgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCBURVhUIENPTE9SIFJHQkEga2V5IjsKKyAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBmb250SW5mby5yZ2JhVGV4dCkgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCByZ2JhIHRleHQgY29sb3IgdmFsdWUiOworCisgICAgaWYgKHBhcmNlbC5kYXRhQXZhaWwoKSA9PSAwKSB7CisgICAgICAgIEFMT0dWKCJDb21wbGV0ZWQgcmVhZGluZyB0aGUgcGFyY2VsIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX1NUUlVDVF9GT05UX0xJU1QpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgU1RSVUNUIEZPTlQgTElTVCBrZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLmVudHJ5Q291bnQpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgdmFsdWUgb2YgZW50cnkgY291bnQiOworICAgIEFTU0VSVF9FUShmb250SW5mby5lbnRyeUNvdW50LCBmb250UmVjb3JkRW50cmllcy5zaXplKCkpCisgICAgICAgICAgICA8PCAiQXJyYXkgc2l6ZSBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCBudW1iZXIgb2YgZW50cmllcyI7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZm9udEluZm8uZW50cnlDb3VudDsgaSsrKSB7CisgICAgICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRSZWNvcmRFbnRyaWVzW2ldLmZvbnRJRCkKKyAgICAgICAgICAgICAgICA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHZhbHVlIG9mIGZvbnQgSWQiOworICAgICAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBmb250UmVjb3JkRW50cmllc1tpXS5mb250TmFtZUxlbmd0aCkKKyAgICAgICAgICAgICAgICA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHZhbHVlIG9mIGZvbnQgbmFtZSBsZW5ndGgiOworICAgICAgICB1aW50OF90IGZvbnROYW1lW2ZvbnRSZWNvcmRFbnRyaWVzW2ldLmZvbnROYW1lTGVuZ3RoXTsKKyAgICAgICAgLy8gd3JpdHRlbiB3aXRoIHdyaXRlQnl0ZUFycmF5KCkgd3JpdGVzIGNvdW50LCB0aGVuIHRoZSBhY3R1YWwgZGF0YQorICAgICAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBmb250UmVjb3JkRW50cmllc1tpXS5mb250TmFtZUxlbmd0aCk7CisgICAgICAgIHN0YXR1cyA9IHBhcmNlbC5yZWFkKCh2b2lkICopZm9udE5hbWUsIGZvbnRSZWNvcmRFbnRyaWVzW2ldLmZvbnROYW1lTGVuZ3RoKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkZhaWxlZCB0byByZWFkIHRoZSBmb250IG5hbWUgZnJvbSBwYXJjZWwiOworICAgICAgICBBU1NFUlRfRVEobWVtY21wKGZvbnROYW1lLCBmb250UmVjb3JkRW50cmllc1tpXS5mb250LCBmb250UmVjb3JkRW50cmllc1tpXS5mb250TmFtZUxlbmd0aCksCisgICAgICAgICAgICAgICAgICAwKQorICAgICAgICAgICAgICAgIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgZm9udCI7CisgICAgfQorICAgIC8vIFRvIG1ha2Ugc3VyZSBlbmQgb2YgcGFyY2VsIGlzIHJlYWNoZWQKKyAgICBBU1NFUlRfRVEocGFyY2VsLmRhdGFBdmFpbCgpLCAwKSA8PCAiUGFyY2VsIGhhcyBzb21lIGRhdGEgbGVmdCB0byByZWFkIjsKK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKFRpbWVkVGV4dFVuaXRUZXN0QWxsLCBTUlREZXNjcmlwdGlvblRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoKCJzYW1wbGVUZXN0MS5zcnQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoInNhbXBsZVRlc3QyLnNydCIpKSk7CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChUaW1lZFRleHRVbml0VGVzdEFsbCwgVGV4dDNHUFBEZXNjcmlwdGlvblRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoKCJ0eDNnQm94MSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgidHgzZ0JveDIiKSkpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IFRpbWVkVGV4dFRlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgQUxPR1YoIlRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmNwcAppbmRleCBhMjMyMTUwLi4zYmU1ZTc0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5jcHAKQEAgLTE1MjUsNyArMTUyNSw3IEBACiAgICAgICAgICAgICAgICAgbm9kZUluZm8uYXR0cmlidXRlTGlzdC5wdXNoX2JhY2soQXR0cmlidXRleyJyYW5rIiwgcmFua30pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbm9kZUxpc3QtPmluc2VydChzdGQ6Om1ha2VfcGFpcigKLSAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKG9yZGVyKSwgc3RkOjptb3ZlKG5vZGVJbmZvKSkpOworICAgICAgICAgICAgICAgICAgICBvcmRlciwgc3RkOjptb3ZlKG5vZGVJbmZvKSkpOwogICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ5N2M5NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJYTUxQYXJzZXJUZXN0IiwKKyAgICBndGVzdDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlhNTFBhcnNlclRlc3QuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXIiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBkYXRhOiBbIjp4bWxwYXJzZXJ0ZXN0X3Rlc3RfZmlsZXMiLF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCit9CisKK2ZpbGVncm91cCB7CisgICAgbmFtZTogInhtbHBhcnNlcnRlc3RfdGVzdF9maWxlcyIsCisgICAgc3JjczogWworICAgICAgICAidGVzdGRhdGEvbWVkaWFfY29kZWNzX3VuaXRfdGVzdC54bWwiLAorICAgICAgICAidGVzdGRhdGEvbWVkaWFfY29kZWNzX3VuaXRfdGVzdF9jYWxsZXIueG1sIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlMTFiMWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwyOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJUZXN0IG1vZHVsZSBjb25maWcgZm9yIHhtbCBwYXJzZXIgdW5pdCB0ZXN0Ij4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iWE1MUGFyc2VyVGVzdCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJtZWRpYV9jb2RlY3NfdW5pdF90ZXN0LnhtbC0+L2RhdGEvbG9jYWwvdG1wL21lZGlhX2NvZGVjc191bml0X3Rlc3QueG1sIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJtZWRpYV9jb2RlY3NfdW5pdF90ZXN0X2NhbGxlci54bWwtPi9kYXRhL2xvY2FsL3RtcC9tZWRpYV9jb2RlY3NfdW5pdF90ZXN0X2NhbGxlci54bWwiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IlhNTFBhcnNlclRlc3QtPi9kYXRhL2xvY2FsL3RtcC9YTUxQYXJzZXJUZXN0IiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJYTUxQYXJzZXJUZXN0IiAvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L1JFQURNRS5tZCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTM2M2ZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMzMgQEAKKyMjIE1lZGlhIFRlc3RpbmcgIyMKKy0tLQorIyMjIyBYTUwgUGFyc2VyCitUaGUgWE1MUGFyc2VyIFRlc3QgU3VpdGUgdmFsaWRhdGVzIHRoZSBYTUxQYXJzZXIgYXZhaWxhYmxlIGluIGxpYnN0YWdlZnJpZ2h0LgorCitSdW4gdGhlIGZvbGxvd2luZyBzdGVwcyB0byBidWlsZCB0aGUgdGVzdCBzdWl0ZToKK2BgYAorbSBYTUxQYXJzZXJUZXN0CitgYGAKKworVGhlIDMyLWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdC8KKworVGhlIDY0LWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0LworCitUbyB0ZXN0IDY0LWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3Q2NC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0L1hNTFBhcnNlclRlc3QvWE1MUGFyc2VyVGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKworVG8gdGVzdCAzMi1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0LgorYGBgCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0L1hNTFBhcnNlclRlc3QvWE1MUGFyc2VyVGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKwordXNhZ2U6IFhNTFBhcnNlclRlc3QKK2BgYAorYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9YTUxQYXJzZXJUZXN0CitgYGAKK0FsdGVybmF0aXZlbHksIHRoZSB0ZXN0IGNhbiBhbHNvIGJlIHJ1biB1c2luZyBhdGVzdCBjb21tYW5kLgorCitgYGAKK2F0ZXN0IFhNTFBhcnNlclRlc3QKK2BgYApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvWE1MUGFyc2VyVGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC9YTUxQYXJzZXJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGRkMzc0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Rlc3QvWE1MUGFyc2VyVGVzdC5jcHAKQEAgLTAsMCArMSwzOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlhNTFBhcnNlclRlc3QiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGZzdHJlYW0+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaD4KKworI2luY2x1ZGUgIlhNTFBhcnNlclRlc3RFbnZpcm9ubWVudC5oIgorCisjZGVmaW5lIFhNTF9GSUxFX05BTUUgIm1lZGlhX2NvZGVjc191bml0X3Rlc3RfY2FsbGVyLnhtbCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK3N0YXRpYyBYTUxQYXJzZXJUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOworCitzdHJ1Y3QgQ29kZWNQcm9wZXJ0aWVzIHsKKyAgICBzdHJpbmcgY29kZWNOYW1lOworICAgIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpDb2RlY1Byb3BlcnRpZXMgY29kZWNQcm9wOworfTsKKworc3RydWN0IFJvbGVQcm9wZXJ0aWVzIHsKKyAgICBzdHJpbmcgcm9sZU5hbWU7CisgICAgc3RyaW5nIHR5cGVOYW1lOworICAgIHN0cmluZyBjb2RlY05hbWU7CisgICAgYm9vbCBpc0VuY29kZXI7CisgICAgc2l6ZV90IG9yZGVyOworICAgIHZlY3RvcjxwYWlyPHN0cmluZywgc3RyaW5nPj4gYXR0cmlidXRlTWFwOworfTsKKworY2xhc3MgWE1MUGFyc2VUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgIHB1YmxpYzoKKyAgICB+WE1MUGFyc2VUZXN0KCkgeworICAgICAgICBpZiAobUVsZVN0cmVhbS5pc19vcGVuKCkpIG1FbGVTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgbUlucHV0RGF0YVZlY3Rvci5jbGVhcigpOworICAgICAgICBtSW5wdXRSb2xlVmVjdG9yLmNsZWFyKCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBzZXRVcERhdGFiYXNlKCk7IH0KKworICAgIHZvaWQgc2V0VXBEYXRhYmFzZSgpOworCisgICAgdm9pZCBzZXRDb2RlY1Byb3BlcnRpZXMoc3RyaW5nIGNvZGVjTmFtZSwgYm9vbCBpc0VuY29kZXIsIGludDMyX3Qgb3JkZXIsIHNldDxzdHJpbmc+IHF1aXJrU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDxzdHJpbmc+IGRvbWFpblNldCwgc2V0PHN0cmluZz4gdmFyaWFudFNldCwgc3RyaW5nIHR5cGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxwYWlyPHN0cmluZywgc3RyaW5nPj4gZG9tYWluLCB2ZWN0b3I8c3RyaW5nPiBhbGlhc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyByYW5rKTsKKworICAgIHZvaWQgc2V0Um9sZVByb3BlcnRpZXMoc3RyaW5nIHJvbGVOYW1lLCBib29sIGlzRW5jb2RlciwgaW50MzJfdCBvcmRlciwgc3RyaW5nIHR5cGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGNvZGVjTmFtZSwgdmVjdG9yPHBhaXI8c3RyaW5nLCBzdHJpbmc+PiBkb21haW4pOworCisgICAgdm9pZCBzZXRTZXJ2aWNlQXR0cmlidXRlKG1hcDxzdHJpbmcsIHN0cmluZz4gc2VydmljZUF0dHJpYnV0ZU5hbWVWYWx1ZVBhaXIpOworCisgICAgdm9pZCBwcmludENvZGVjTWFwKGNvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpDb2RlYyBtY29kZWMpOworCisgICAgdm9pZCBjaGVja1JvbGVNYXAoaW50MzJfdCBpbmRleCwgYm9vbCBpc0VuY29kZXIsIHN0cmluZyB0eXBlTmFtZSwgc3RyaW5nIGNvZGVjTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8cGFpcjxzdHJpbmcsIHN0cmluZz4+IGF0dHJNYXApOworCisgICAgYm9vbCBjb21wYXJlTWFwKGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4gJmxocywgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiAmcmhzKTsKKworICAgIGlmc3RyZWFtIG1FbGVTdHJlYW07CisgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXIgbVBhcnNlcjsKKyAgICB2ZWN0b3I8Q29kZWNQcm9wZXJ0aWVzPiBtSW5wdXREYXRhVmVjdG9yOworICAgIHZlY3RvcjxSb2xlUHJvcGVydGllcz4gbUlucHV0Um9sZVZlY3RvcjsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IG1JbnB1dFNlcnZpY2VBdHRyaWJ1dGVNYXA7Cit9OworCit2b2lkIFhNTFBhcnNlVGVzdDo6c2V0VXBEYXRhYmFzZSgpIHsKKyAgICAvLyBUaGUgdmFsdWVzIHNldCBiZWxvdyBhcmUgc3BlY2lmaWMgdG8gdGVzdCB2ZWN0b3IgdGVzdGRhdGEvbWVkaWFfY29kZWNzX3VuaXRfdGVzdC54bWwKKyAgICBzZXRDb2RlY1Byb3BlcnRpZXMoInRlc3QxLmRlY29kZXIiLCBmYWxzZSwgMSwgeyJhdHRyaWJ1dGU6OmRpc2FibGVkIiwgInF1aXJrOjpxdWlyazEifSwKKyAgICAgICAgICAgICAgICAgICAgICAgeyJ0ZWxlcGhvbnkifSwge30sICJhdWRpby9tcGVnIiwge30sIHsiYWxpYXMxLmRlY29kZXIifSwgIjQiKTsKKworICAgIHNldENvZGVjUHJvcGVydGllcygidGVzdDIuZGVjb2RlciIsIGZhbHNlLCAyLCB7InF1aXJrOjpxdWlyazEifSwge30sIHt9LCAiYXVkaW8vM2dwcCIsIHt9LCB7fSwKKyAgICAgICAgICAgICAgICAgICAgICAgIiIpOworCisgICAgc2V0Q29kZWNQcm9wZXJ0aWVzKCJ0ZXN0My5kZWNvZGVyIiwgZmFsc2UsIDMsIHt9LCB7fSwge30sICJhdWRpby9hbXItd2IiLAorICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oImZlYXR1cmUtZmVhdHVyZTEiLCAiZmVhdHVyZTFWYWwiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigiZmVhdHVyZS1mZWF0dXJlMiIsICIwIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oImZlYXR1cmUtZmVhdHVyZTMiLCAiMCIpLAorICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICB7fSwgIiIpOworCisgICAgc2V0Q29kZWNQcm9wZXJ0aWVzKCJ0ZXN0NC5kZWNvZGVyIiwgZmFsc2UsIDQsIHt9LCB7fSwge30sICJhdWRpby9mbGFjIiwKKyAgICAgICAgICAgICAgICAgICAgICAge3BhaXI8c3RyaW5nLCBzdHJpbmc+KCJmZWF0dXJlLWZlYXR1cmUxIiwgImZlYXR1cmUxVmFsIil9LCB7fSwgIiIpOworCisgICAgc2V0Q29kZWNQcm9wZXJ0aWVzKCJ0ZXN0NS5kZWNvZGVyIiwgZmFsc2UsIDUsIHsiYXR0cmlidXRlOjphdHRyaWJ1dGVRdWlyazEifSwge30sIHt9LAorICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW8vZzcxMS1tbGF3Iiwge30sIHt9LCAiIik7CisKKyAgICBzZXRDb2RlY1Byb3BlcnRpZXMoInRlc3Q2LmRlY29kZXIiLCBmYWxzZSwgNiwge30sIHt9LCB7InZhcmlhbnQxIiwgInZhcmlhbnQyIn0sCisgICAgICAgICAgICAgICAgICAgICAgICJhdWRpby9tcDRhLWxhdG0iLAorICAgICAgICAgICAgICAgICAgICAgICB7cGFpcjxzdHJpbmcsIHN0cmluZz4oInZhcmlhbnQxOjo6dmFyaWFudDFMaW1pdDEtcmFuZ2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhcmlhbnQxTGltaXQxTWluLXZhcmlhbnQxTGltaXQxTWF4IiksCisgICAgICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigidmFyaWFudDE6Ojp2YXJpYW50MUxpbWl0Mi1yYW5nZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFyaWFudDFMaW1pdDJMb3ctdmFyaWFudDFMaW1pdDJIaWdoIiksCisgICAgICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigidmFyaWFudDI6Ojp2YXJpYW50MkxpbWl0MSIsICJ2YXJpYW50MkxpbWl0MVZhbHVlIil9LAorICAgICAgICAgICAgICAgICAgICAgICB7fSwgIiIpOworCisgICAgc2V0Q29kZWNQcm9wZXJ0aWVzKAorICAgICAgICAgICAgInRlc3Q3LmRlY29kZXIiLCBmYWxzZSwgNywge30sIHt9LCB7fSwgImF1ZGlvL3ZvcmJpcyIsCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCItbWluLWxpbWl0MSIsICJsaW1pdDFNaW4iKSwKKyAgICAgICAgICAgICAgICAgICAgLypwYWlyPHN0cmluZywgc3RyaW5nPigibGltaXQxLWluIiwgImxpbWl0MUluIiksKi8KKyAgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oImxpbWl0Mi1yYW5nZSIsICJsaW1pdDJNaW4tbGltaXQyTWF4IiksCisgICAgICAgICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJsaW1pdDItc2NhbGUiLCAibGltaXQyU2NhbGUiKSwKKyAgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oImxpbWl0My1kZWZhdWx0IiwgImxpbWl0M1ZhbDMiKSwKKyAgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oImxpbWl0My1yYW5nZXMiLCAibGltaXQzVmFsMSxsaW1pdDNWYWwyLGxpbWl0M1ZhbDMiKSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7fSwgIiIpOworCisgICAgc2V0Q29kZWNQcm9wZXJ0aWVzKCJ0ZXN0OC5lbmNvZGVyIiwgdHJ1ZSwgOCwge30sIHt9LCB7fSwgImF1ZGlvL29wdXMiLAorICAgICAgICAgICAgICAgICAgICAgICB7cGFpcjxzdHJpbmcsIHN0cmluZz4oIm1heC1saW1pdDEiLCAibGltaXQxTWF4Iil9LCB7fSwgIiIpOworCisgICAgc2V0Um9sZVByb3BlcnRpZXMoImF1ZGlvX2RlY29kZXIubXAzIiwgZmFsc2UsIDEsICJhdWRpby9tcGVnIiwgInRlc3QxLmRlY29kZXIiLAorICAgICAgICAgICAgICAgICAgICAgIHtwYWlyPHN0cmluZywgc3RyaW5nPigiYXR0cmlidXRlOjpkaXNhYmxlZCIsICJwcmVzZW50IiksCisgICAgICAgICAgICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJyYW5rIiwgIjQiKX0pOworCisgICAgc2V0Um9sZVByb3BlcnRpZXMoImF1ZGlvX2RlY29kZXIuYW1ybmIiLCBmYWxzZSwgMiwgImF1ZGlvLzNncHAiLCAidGVzdDIuZGVjb2RlciIsIHt9KTsKKworICAgIHNldFJvbGVQcm9wZXJ0aWVzKCJhdWRpb19kZWNvZGVyLmFtcndiIiwgZmFsc2UsIDMsICJhdWRpby9hbXItd2IiLCAidGVzdDMuZGVjb2RlciIsCisgICAgICAgICAgICAgICAgICAgICAge3BhaXI8c3RyaW5nLCBzdHJpbmc+KCJmZWF0dXJlLWZlYXR1cmUxIiwgImZlYXR1cmUxVmFsIiksCisgICAgICAgICAgICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJmZWF0dXJlLWZlYXR1cmUyIiwgIjAiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcGFpcjxzdHJpbmcsIHN0cmluZz4oImZlYXR1cmUtZmVhdHVyZTMiLCAiMCIpfSk7CisKKyAgICBzZXRSb2xlUHJvcGVydGllcygiYXVkaW8vZmxhYyIsIGZhbHNlLCA0LCAiYXVkaW8vZmxhYyIsICJ0ZXN0NC5kZWNvZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICB7cGFpcjxzdHJpbmcsIHN0cmluZz4oImZlYXR1cmUtZmVhdHVyZTEiLCAiZmVhdHVyZTFWYWwiKX0pOworCisgICAgc2V0Um9sZVByb3BlcnRpZXMoImF1ZGlvX2RlY29kZXIuZzcxMW1sYXciLCBmYWxzZSwgNSwgImF1ZGlvL2c3MTEtbWxhdyIsICJ0ZXN0NS5kZWNvZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICB7cGFpcjxzdHJpbmcsIHN0cmluZz4oImF0dHJpYnV0ZTo6YXR0cmlidXRlUXVpcmsxIiwgInByZXNlbnQiKX0pOworCisgICAgc2V0Um9sZVByb3BlcnRpZXMoImF1ZGlvX2RlY29kZXIuYWFjIiwgZmFsc2UsIDYsICJhdWRpby9tcDRhLWxhdG0iLCAidGVzdDYuZGVjb2RlciIsCisgICAgICAgICAgICAgICAgICAgICAge3BhaXI8c3RyaW5nLCBzdHJpbmc+KCJ2YXJpYW50MTo6OnZhcmlhbnQxTGltaXQxLXJhbmdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhcmlhbnQxTGltaXQxTWluLXZhcmlhbnQxTGltaXQxTWF4IiksCisgICAgICAgICAgICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJ2YXJpYW50MTo6OnZhcmlhbnQxTGltaXQyLXJhbmdlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhcmlhbnQxTGltaXQyTG93LXZhcmlhbnQxTGltaXQySGlnaCIpLAorICAgICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigidmFyaWFudDI6Ojp2YXJpYW50MkxpbWl0MSIsICJ2YXJpYW50MkxpbWl0MVZhbHVlIil9KTsKKworICAgIHNldFJvbGVQcm9wZXJ0aWVzKCJhdWRpb19kZWNvZGVyLnZvcmJpcyIsIGZhbHNlLCA3LCAiYXVkaW8vdm9yYmlzIiwgInRlc3Q3LmRlY29kZXIiLAorICAgICAgICAgICAgICAgICAgICAgIHtwYWlyPHN0cmluZywgc3RyaW5nPigiLW1pbi1saW1pdDEiLCAibGltaXQxTWluIiksCisgICAgICAgICAgICAgICAgICAgICAgIC8qcGFpcjxzdHJpbmcsIHN0cmluZz4oImxpbWl0MS1pbiIsICJsaW1pdDFJbiIpLCovCisgICAgICAgICAgICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJsaW1pdDItcmFuZ2UiLCAibGltaXQyTWluLWxpbWl0Mk1heCIpLAorICAgICAgICAgICAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigibGltaXQyLXNjYWxlIiwgImxpbWl0MlNjYWxlIiksCisgICAgICAgICAgICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJsaW1pdDMtZGVmYXVsdCIsICJsaW1pdDNWYWwzIiksCisgICAgICAgICAgICAgICAgICAgICAgIHBhaXI8c3RyaW5nLCBzdHJpbmc+KCJsaW1pdDMtcmFuZ2VzIiwgImxpbWl0M1ZhbDEsbGltaXQzVmFsMixsaW1pdDNWYWwzIil9KTsKKworICAgIHNldFJvbGVQcm9wZXJ0aWVzKCJhdWRpb19lbmNvZGVyLm9wdXMiLCB0cnVlLCA4LCAiYXVkaW8vb3B1cyIsICJ0ZXN0OC5lbmNvZGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICB7cGFpcjxzdHJpbmcsIHN0cmluZz4oIm1heC1saW1pdDEiLCAibGltaXQxTWF4Iil9KTsKKworICAgIHNldFNlcnZpY2VBdHRyaWJ1dGUoCisgICAgICAgICAgICB7cGFpcjxzdHJpbmcsIHN0cmluZz4oImRvbWFpbi10ZWxlcGhvbnkiLCAiMCIpLCBwYWlyPHN0cmluZywgc3RyaW5nPigiZG9tYWluLXR2IiwgIjAiKSwKKyAgICAgICAgICAgICBwYWlyPHN0cmluZywgc3RyaW5nPigic2V0dGluZzIiLCAiMCIpLCBwYWlyPHN0cmluZywgc3RyaW5nPigidmFyaWFudC12YXJpYW50MSIsICIwIil9KTsKK30KKworYm9vbCBYTUxQYXJzZVRlc3Q6OmNvbXBhcmVNYXAoY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiAmbGhzLCBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+ICZyaHMpIHsKKyAgICByZXR1cm4gbGhzLnNpemUoKSA9PSByaHMuc2l6ZSgpICYmIGVxdWFsKGxocy5iZWdpbigpLCBsaHMuZW5kKCksIHJocy5iZWdpbigpKTsKK30KKwordm9pZCBYTUxQYXJzZVRlc3Q6OnNldENvZGVjUHJvcGVydGllcyhzdHJpbmcgY29kZWNOYW1lLCBib29sIGlzRW5jb2RlciwgaW50MzJfdCBvcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0PHN0cmluZz4gcXVpcmtTZXQsIHNldDxzdHJpbmc+IGRvbWFpblNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0PHN0cmluZz4gdmFyaWFudFNldCwgc3RyaW5nIHR5cGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8cGFpcjxzdHJpbmcsIHN0cmluZz4+IGRvbWFpbiwgdmVjdG9yPHN0cmluZz4gYWxpYXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHJhbmspIHsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IEF0dHJpYnV0ZU1hcERCOworICAgIGZvciAoY29uc3QgYXV0byAmQXR0clN0ciA6IGRvbWFpbikgeworICAgICAgICBBdHRyaWJ1dGVNYXBEQi5pbnNlcnQoQXR0clN0cik7CisgICAgfQorICAgIG1hcDxzdHJpbmcsIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpBdHRyaWJ1dGVNYXA+IFR5cGVNYXBEYXRhQmFzZTsKKyAgICBUeXBlTWFwRGF0YUJhc2UuaW5zZXJ0KAorICAgICAgICAgICAgcGFpcjxzdHJpbmcsIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpBdHRyaWJ1dGVNYXA+KHR5cGVOYW1lLCBBdHRyaWJ1dGVNYXBEQikpOworICAgIENvZGVjUHJvcGVydGllcyBjb2RlY1Byb3BlcnR5OworICAgIGNvZGVjUHJvcGVydHkuY29kZWNOYW1lID0gY29kZWNOYW1lOworICAgIGNvZGVjUHJvcGVydHkuY29kZWNQcm9wLmlzRW5jb2RlciA9IGlzRW5jb2RlcjsKKyAgICBjb2RlY1Byb3BlcnR5LmNvZGVjUHJvcC5vcmRlciA9IG9yZGVyOworICAgIGNvZGVjUHJvcGVydHkuY29kZWNQcm9wLnF1aXJrU2V0ID0gcXVpcmtTZXQ7CisgICAgY29kZWNQcm9wZXJ0eS5jb2RlY1Byb3AuZG9tYWluU2V0ID0gZG9tYWluU2V0OworICAgIGNvZGVjUHJvcGVydHkuY29kZWNQcm9wLnZhcmlhbnRTZXQgPSB2YXJpYW50U2V0OworICAgIGNvZGVjUHJvcGVydHkuY29kZWNQcm9wLnR5cGVNYXAgPSBUeXBlTWFwRGF0YUJhc2U7CisgICAgY29kZWNQcm9wZXJ0eS5jb2RlY1Byb3AuYWxpYXNlcyA9IGFsaWFzZXM7CisgICAgY29kZWNQcm9wZXJ0eS5jb2RlY1Byb3AucmFuayA9IHJhbms7CisgICAgbUlucHV0RGF0YVZlY3Rvci5wdXNoX2JhY2soY29kZWNQcm9wZXJ0eSk7Cit9CisKK3ZvaWQgWE1MUGFyc2VUZXN0OjpzZXRSb2xlUHJvcGVydGllcyhzdHJpbmcgcm9sZU5hbWUsIGJvb2wgaXNFbmNvZGVyLCBpbnQzMl90IG9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0eXBlTmFtZSwgc3RyaW5nIGNvZGVjTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8cGFpcjxzdHJpbmcsIHN0cmluZz4+IGF0dHJpYnV0ZU5hbWVWYWx1ZVBhaXIpIHsKKyAgICBzdHJ1Y3QgUm9sZVByb3BlcnRpZXMgcm9sZVByb3BlcnR5OworICAgIHJvbGVQcm9wZXJ0eS5yb2xlTmFtZSA9IHJvbGVOYW1lOworICAgIHJvbGVQcm9wZXJ0eS50eXBlTmFtZSA9IHR5cGVOYW1lOworICAgIHJvbGVQcm9wZXJ0eS5jb2RlY05hbWUgPSBjb2RlY05hbWU7CisgICAgcm9sZVByb3BlcnR5LmlzRW5jb2RlciA9IGlzRW5jb2RlcjsKKyAgICByb2xlUHJvcGVydHkub3JkZXIgPSBvcmRlcjsKKyAgICByb2xlUHJvcGVydHkuYXR0cmlidXRlTWFwID0gYXR0cmlidXRlTmFtZVZhbHVlUGFpcjsKKyAgICBtSW5wdXRSb2xlVmVjdG9yLnB1c2hfYmFjayhyb2xlUHJvcGVydHkpOworfQorCit2b2lkIFhNTFBhcnNlVGVzdDo6c2V0U2VydmljZUF0dHJpYnV0ZShtYXA8c3RyaW5nLCBzdHJpbmc+IHNlcnZpY2VBdHRyaWJ1dGVOYW1lVmFsdWVQYWlyKSB7CisgICAgZm9yIChjb25zdCBhdXRvICZzZXJ2aWNlQXR0clN0ciA6IHNlcnZpY2VBdHRyaWJ1dGVOYW1lVmFsdWVQYWlyKSB7CisgICAgICAgIG1JbnB1dFNlcnZpY2VBdHRyaWJ1dGVNYXAuaW5zZXJ0KHNlcnZpY2VBdHRyU3RyKTsKKyAgICB9Cit9CisKK3ZvaWQgWE1MUGFyc2VUZXN0OjpwcmludENvZGVjTWFwKGNvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpDb2RlYyBtY29kZWMpIHsKKyAgICBjb25zdCBzdHJpbmcgJm5hbWUgPSBtY29kZWMuZmlyc3Q7CisgICAgQUxPR1YoImNvZGVjIG5hbWUgPSAlc1xuIiwgbmFtZS5jX3N0cigpKTsKKyAgICBjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Q29kZWNQcm9wZXJ0aWVzICZwcm9wZXJ0aWVzID0gbWNvZGVjLnNlY29uZDsKKyAgICBib29sIGlzRW5jb2RlciA9IHByb3BlcnRpZXMuaXNFbmNvZGVyOworICAgIEFMT0dWKCJpc0VuY29kZXIgPSAlZFxuIiwgaXNFbmNvZGVyKTsKKyAgICBzaXplX3Qgb3JkZXIgPSBwcm9wZXJ0aWVzLm9yZGVyOworICAgIEFMT0dWKCJvcmRlciA9ICV6dVxuIiwgb3JkZXIpOworICAgIHN0cmluZyByYW5rID0gcHJvcGVydGllcy5yYW5rOworICAgIEFMT0dWKCJyYW5rID0gJXNcbiIsIHJhbmsuY19zdHIoKSk7CisKKyAgICBmb3IgKGF1dG8gJml0clF1aXJrU2V0IDogcHJvcGVydGllcy5xdWlya1NldCkgeworICAgICAgICBBTE9HVigicXVpcmtTZXQ9ICVzIiwgaXRyUXVpcmtTZXQuY19zdHIoKSk7CisgICAgfQorCisgICAgZm9yIChhdXRvICZpdHJEb21haW5TZXQgOiBwcm9wZXJ0aWVzLmRvbWFpblNldCkgeworICAgICAgICBBTE9HVigiZG9tYWluU2V0PSAlcyIsIGl0ckRvbWFpblNldC5jX3N0cigpKTsKKyAgICB9CisKKyAgICBmb3IgKGF1dG8gJml0clZhcmlhbnRTZXQgOiBwcm9wZXJ0aWVzLnZhcmlhbnRTZXQpIHsKKyAgICAgICAgQUxPR1YoInZhcmlhbnRTZXQ9ICVzIiwgaXRyVmFyaWFudFNldC5jX3N0cigpKTsKKyAgICB9CisKKyAgICBtYXA8c3RyaW5nLCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwPiBUeXBlTWFwID0gcHJvcGVydGllcy50eXBlTWFwOworICAgIEFMT0dWKCJUaGUgVHlwZU1hcCBpcyA6Iik7CisKKyAgICBmb3IgKGF1dG8gJml0clR5cGVNYXAgOiBUeXBlTWFwKSB7CisgICAgICAgIEFMT0dWKCJpdHJUeXBlTWFwLT5maXJzdFx0JXNcdCIsIGl0clR5cGVNYXAuZmlyc3QuY19zdHIoKSk7CisKKyAgICAgICAgZm9yIChhdXRvICZpdHJBdHRyaWJ1dGVNYXAgOiBpdHJUeXBlTWFwLnNlY29uZCkgeworICAgICAgICAgICAgQUxPR1YoIkF0dHJpYnV0ZU1hcC0+Zmlyc3QgPSAlcyIsIGl0ckF0dHJpYnV0ZU1hcC5maXJzdC5jX3N0cigpKTsKKyAgICAgICAgICAgIEFMT0dWKCJBdHRyaWJ1dGVNYXAtPnNlY29uZCA9ICVzIiwgaXRyQXR0cmlidXRlTWFwLnNlY29uZC5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBYTUxQYXJzZVRlc3Q6OmNoZWNrUm9sZU1hcChpbnQzMl90IGluZGV4LCBib29sIGlzRW5jb2Rlciwgc3RyaW5nIHR5cGVOYW1lLCBzdHJpbmcgY29kZWNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8cGFpcjxzdHJpbmcsIHN0cmluZz4+IEF0dHJpYnV0ZVBhaXJNYXApIHsKKyAgICBBU1NFUlRfRVEoaXNFbmNvZGVyLCBtSW5wdXRSb2xlVmVjdG9yLmF0KGluZGV4KS5pc0VuY29kZXIpCisgICAgICAgICAgICA8PCAiSW52YWxpZCBSb2xlTWFwIGRhdGEuIElzRW5jb2RlciBtaXNtYXRjaCI7CisgICAgQVNTRVJUX0VRKHR5cGVOYW1lLCBtSW5wdXRSb2xlVmVjdG9yLmF0KGluZGV4KS50eXBlTmFtZSkKKyAgICAgICAgICAgIDw8ICJJbnZhbGlkIFJvbGVNYXAgZGF0YS4gdHlwZU5hbWUgbWlzbWF0Y2giOworICAgIEFTU0VSVF9FUShjb2RlY05hbWUsIG1JbnB1dFJvbGVWZWN0b3IuYXQoaW5kZXgpLmNvZGVjTmFtZSkKKyAgICAgICAgICAgIDw8ICJJbnZhbGlkIFJvbGVNYXAgZGF0YS4gY29kZWNOYW1lIG1pc21hdGNoIjsKKworICAgIHZlY3RvcjxwYWlyPHN0cmluZywgc3RyaW5nPj46Oml0ZXJhdG9yIGl0cl9hdHRyaWJ1dGVNYXBEQiA9CisgICAgICAgICAgICAobUlucHV0Um9sZVZlY3Rvci5hdChpbmRleCkuYXR0cmlidXRlTWFwKS5iZWdpbigpOworICAgIHZlY3RvcjxwYWlyPHN0cmluZywgc3RyaW5nPj46Oml0ZXJhdG9yIGl0cl9hdHRyaWJ1dGVNYXAgPSBBdHRyaWJ1dGVQYWlyTWFwLmJlZ2luKCk7CisgICAgZm9yICg7IGl0cl9hdHRyaWJ1dGVNYXAgIT0gQXR0cmlidXRlUGFpck1hcC5lbmQoKSAmJgorICAgICAgICAgICBpdHJfYXR0cmlidXRlTWFwREIgIT0gbUlucHV0Um9sZVZlY3Rvci5hdChpbmRleCkuYXR0cmlidXRlTWFwLmVuZCgpOworICAgICAgICAgKytpdHJfYXR0cmlidXRlTWFwLCArK2l0cl9hdHRyaWJ1dGVNYXBEQikgeworICAgICAgICBzdHJpbmcgYXR0cmlidXRlTmFtZSA9IGl0cl9hdHRyaWJ1dGVNYXAtPmZpcnN0OworICAgICAgICBzdHJpbmcgYXR0cmlidXRlTmFtZURCID0gaXRyX2F0dHJpYnV0ZU1hcERCLT5maXJzdDsKKyAgICAgICAgc3RyaW5nIGF0dHJpYnV0ZXZhbHVlID0gaXRyX2F0dHJpYnV0ZU1hcC0+c2Vjb25kOworICAgICAgICBzdHJpbmcgYXR0cmlidXRlVmFsdWVEQiA9IGl0cl9hdHRyaWJ1dGVNYXBEQi0+c2Vjb25kOworICAgICAgICBBU1NFUlRfRVEoYXR0cmlidXRlTmFtZSwgYXR0cmlidXRlTmFtZURCKQorICAgICAgICAgICAgICAgIDw8ICJJbnZhbGlkIFJvbGVNYXAgZGF0YS4gQXR0cmlidXRlIG5hbWUgbWlzbWF0Y2hcdCIgPDwgYXR0cmlidXRlTmFtZSA8PCAiICE9ICIKKyAgICAgICAgICAgICAgICA8PCAiYXR0cmlidXRlTmFtZURCIjsKKyAgICAgICAgQVNTRVJUX0VRKGF0dHJpYnV0ZXZhbHVlLCBhdHRyaWJ1dGVWYWx1ZURCKQorICAgICAgICAgICAgICAgIDw8ICJJbnZhbGlkIFJvbGVNYXAgZGF0YS4gQXR0cmlidXRlIHZhbHVlIG1pc21hdGNoXHQiIDw8IGF0dHJpYnV0ZXZhbHVlIDw8ICIgIT0gIgorICAgICAgICAgICAgICAgIDw8ICJhdHRyaWJ1dGVWYWx1ZURCIjsKKyAgICB9Cit9CisKK1RFU1RfRihYTUxQYXJzZVRlc3QsIENvZGVjTWFwUGFyc2VUZXN0KSB7CisgICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKSArIFhNTF9GSUxFX05BTUU7CisgICAgbUVsZVN0cmVhbS5vcGVuKGlucHV0RmlsZU5hbWUsIGlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShtRWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSkgPDwgIkZhaWxlZCB0byBvcGVuIGlucHV0ZmlsZSAiIDw8IGlucHV0RmlsZU5hbWU7CisKKyAgICBtUGFyc2VyLnBhcnNlWG1sUGF0aChpbnB1dEZpbGVOYW1lKTsKKyAgICBmb3IgKGNvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpDb2RlYyAmbWNvZGVjIDogbVBhcnNlci5nZXRDb2RlY01hcCgpKSB7CisgICAgICAgIHByaW50Q29kZWNNYXAobWNvZGVjKTsKKyAgICAgICAgY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkNvZGVjUHJvcGVydGllcyAmcHJvcGVydGllcyA9IG1jb2RlYy5zZWNvbmQ7CisgICAgICAgIGludDMyX3QgaW5kZXggPSBwcm9wZXJ0aWVzLm9yZGVyIC0gMTsKKyAgICAgICAgQVNTRVJUX0dFKGluZGV4LCAwKSA8PCAiSW52YWxpZCBvcmRlciI7CisgICAgICAgIEFTU0VSVF9FUShtSW5wdXREYXRhVmVjdG9yLmF0KGluZGV4KS5jb2RlY05hbWUsIG1jb2RlYy5maXJzdC5jX3N0cigpKQorICAgICAgICAgICAgICAgIDw8ICJJbnZhbGlkIENvZGVjTWFwIGRhdGEuIGNvZGVjTmFtZSBtaXNtYXRjaCI7CisgICAgICAgIEFTU0VSVF9FUShwcm9wZXJ0aWVzLmlzRW5jb2RlciwgbUlucHV0RGF0YVZlY3Rvci5hdChpbmRleCkuY29kZWNQcm9wLmlzRW5jb2RlcikKKyAgICAgICAgICAgICAgICA8PCAiSW52YWxpZCBDb2RlY01hcCBkYXRhLiBpc0VuY29kZXIgbWlzbWF0Y2giOworICAgICAgICBBU1NFUlRfRVEocHJvcGVydGllcy5vcmRlciwgbUlucHV0RGF0YVZlY3Rvci5hdChpbmRleCkuY29kZWNQcm9wLm9yZGVyKQorICAgICAgICAgICAgICAgIDw8ICJJbnZhbGlkIENvZGVjTWFwIGRhdGEuIG9yZGVyIG1pc21hdGNoIjsKKworICAgICAgICBzZXQ8c3RyaW5nPiBxdWlya1NldERCID0gbUlucHV0RGF0YVZlY3Rvci5hdChpbmRleCkuY29kZWNQcm9wLnF1aXJrU2V0OworICAgICAgICBzZXQ8c3RyaW5nPiBxdWlya1NldCA9IHByb3BlcnRpZXMucXVpcmtTZXQ7CisgICAgICAgIHNldDxzdHJpbmc+IHF1aXJrRGlmZmVyZW5jZTsKKyAgICAgICAgc2V0X2RpZmZlcmVuY2UocXVpcmtTZXREQi5iZWdpbigpLCBxdWlya1NldERCLmVuZCgpLCBxdWlya1NldC5iZWdpbigpLCBxdWlya1NldC5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZXIocXVpcmtEaWZmZXJlbmNlLCBxdWlya0RpZmZlcmVuY2UuZW5kKCkpKTsKKyAgICAgICAgQVNTRVJUX0VRKHF1aXJrRGlmZmVyZW5jZS5zaXplKCksIDApIDw8ICJDb2RlY01hcDpxdWlyayBtaXNtYXRjaCI7CisKKyAgICAgICAgbWFwPHN0cmluZywgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkF0dHJpYnV0ZU1hcD4gVHlwZU1hcERCID0KKyAgICAgICAgICAgICAgICBtSW5wdXREYXRhVmVjdG9yLmF0KGluZGV4KS5jb2RlY1Byb3AudHlwZU1hcDsKKyAgICAgICAgbWFwPHN0cmluZywgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkF0dHJpYnV0ZU1hcD4gVHlwZU1hcCA9IHByb3BlcnRpZXMudHlwZU1hcDsKKyAgICAgICAgbWFwPHN0cmluZywgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkF0dHJpYnV0ZU1hcD46Oml0ZXJhdG9yIGl0cl9UeXBlTWFwREIgPSBUeXBlTWFwREIuYmVnaW4oKTsKKyAgICAgICAgbWFwPHN0cmluZywgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkF0dHJpYnV0ZU1hcD46Oml0ZXJhdG9yIGl0cl9UeXBlTWFwID0gVHlwZU1hcC5iZWdpbigpOworCisgICAgICAgIEFTU0VSVF9FUShUeXBlTWFwREIuc2l6ZSgpLCBUeXBlTWFwLnNpemUoKSkKKyAgICAgICAgICAgICAgICA8PCAiSW52YWxpZCBDb2RlY01hcCBkYXRhLiBUeXBlbWFwIHNpemUgbWlzbWF0Y2giOworCisgICAgICAgIGZvciAoOyBpdHJfVHlwZU1hcCAhPSBUeXBlTWFwLmVuZCgpICYmIGl0cl9UeXBlTWFwREIgIT0gVHlwZU1hcERCLmVuZCgpOworICAgICAgICAgICAgICsraXRyX1R5cGVNYXAsICsraXRyX1R5cGVNYXBEQikgeworICAgICAgICAgICAgQVNTRVJUX0VRKGl0cl9UeXBlTWFwLT5maXJzdCwgaXRyX1R5cGVNYXBEQi0+Zmlyc3QpCisgICAgICAgICAgICAgICAgICAgIDw8ICJJbnZhbGlkIENvZGVjTWFwIGRhdGEuIHR5cGUgbWlzbWF0Y2giOworICAgICAgICAgICAgYm9vbCBmbGFnID0gY29tcGFyZU1hcChpdHJfVHlwZU1hcC0+c2Vjb25kLCBpdHJfVHlwZU1hcERCLT5zZWNvbmQpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmxhZykgPDwgInR5cGVNYXAgbWlzbWF0Y2giOworICAgICAgICB9CisgICAgICAgIEFTU0VSVF9FUShtSW5wdXREYXRhVmVjdG9yLmF0KGluZGV4KS5jb2RlY1Byb3AucmFuaywgcHJvcGVydGllcy5yYW5rKQorICAgICAgICAgICAgICAgIDw8ICJJbnZhbGlkIENvZGVjTWFwIGRhdGEuIHJhbmsgbWlzbWF0Y2giOworICAgIH0KK30KKworVEVTVF9GKFhNTFBhcnNlVGVzdCwgUm9sZU1hcFBhcnNlVGVzdCkgeworICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBYTUxfRklMRV9OQU1FOworICAgIG1FbGVTdHJlYW0ub3BlbihpbnB1dEZpbGVOYW1lLCBpZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEobUVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpIDw8ICJGYWlsZWQgdG8gb3BlbiBpbnB1dGZpbGUgIiA8PCBpbnB1dEZpbGVOYW1lOworCisgICAgbVBhcnNlci5wYXJzZVhtbFBhdGgoaW5wdXRGaWxlTmFtZSk7CisKKyAgICBmb3IgKGF1dG8gJm1Sb2xlIDogbVBhcnNlci5nZXRSb2xlTWFwKCkpIHsKKyAgICAgICAgdHlwZWRlZiBwYWlyPHN0cmluZywgc3RyaW5nPiBBdHRyaWJ1dGU7CisgICAgICAgIGNvbnN0IHN0cmluZyAmcm9sZU5hbWUgPSBtUm9sZS5maXJzdDsKKyAgICAgICAgQUxPR1YoIlJvbGUgbWFwOm5hbWUgPSAlc1xuIiwgcm9sZU5hbWUuY19zdHIoKSk7CisgICAgICAgIGNvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpSb2xlUHJvcGVydGllcyAmcHJvcGVydGllcyA9IG1Sb2xlLnNlY29uZDsKKyAgICAgICAgc3RyaW5nIHR5cGUgPSBwcm9wZXJ0aWVzLnR5cGU7CisgICAgICAgIEFMT0dWKCJSb2xlIG1hcDogdHlwZSA9ICVzXG4iLCB0eXBlLmNfc3RyKCkpOworCisgICAgICAgIGJvb2wgaXNFbmNvZGVyID0gcHJvcGVydGllcy5pc0VuY29kZXI7CisgICAgICAgIEFMT0dWKCJSb2xlIG1hcDogaXNFbmNvZGVyID0gJWRcbiIsIGlzRW5jb2Rlcik7CisKKyAgICAgICAgbXVsdGltYXA8c2l6ZV90LCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Tm9kZUluZm8+IG5vZGVMaXN0ID0gcHJvcGVydGllcy5ub2RlTGlzdDsKKyAgICAgICAgbXVsdGltYXA8c2l6ZV90LCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Tm9kZUluZm8+OjppdGVyYXRvciBpdHJfTm9kZTsKKyAgICAgICAgQUxPR1YoIlxuVGhlIG11bHRpbWFwIG5vZGVMaXN0IGlzIDogXG4iKTsKKyAgICAgICAgZm9yIChpdHJfTm9kZSA9IG5vZGVMaXN0LmJlZ2luKCk7IGl0cl9Ob2RlICE9IG5vZGVMaXN0LmVuZCgpOyArK2l0cl9Ob2RlKSB7CisgICAgICAgICAgICBBTE9HVigiaXRyX05vZGUtPmZpcnN0PU9SREVSPVx0JXp1XHQiLCBpdHJfTm9kZS0+Zmlyc3QpOworICAgICAgICAgICAgaW50MzJfdCBpbmRleCA9IGl0cl9Ob2RlLT5maXJzdCAtIDE7CisgICAgICAgICAgICBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Tm9kZUluZm8gbm9kZVB0ciA9IGl0cl9Ob2RlLT5zZWNvbmQ7CisgICAgICAgICAgICBBTE9HVigiUm9sZSBtYXA6aXRyX05vZGUtPnNlY29uZC5uYW1lID0gJXNcbiIsIG5vZGVQdHIubmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIHZlY3RvcjxBdHRyaWJ1dGU+IGF0dHJMaXN0ID0gbm9kZVB0ci5hdHRyaWJ1dGVMaXN0OworICAgICAgICAgICAgZm9yIChhdXRvIGF0dHJOYW1lVmFsdWVMaXN0ID0gYXR0ckxpc3QuYmVnaW4oKTsgYXR0ck5hbWVWYWx1ZUxpc3QgIT0gYXR0ckxpc3QuZW5kKCk7CisgICAgICAgICAgICAgICAgICsrYXR0ck5hbWVWYWx1ZUxpc3QpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiUm9sZSBtYXA6bm9kZVB0ci5hdHRyaWJ1dGVMaXN0LT5maXJzdCA9ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGF0dHJOYW1lVmFsdWVMaXN0LT5maXJzdC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiUm9sZSBtYXA6bm9kZVB0ci5hdHRyaWJ1dGVMaXN0LT5zZWNvbmQgPSAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBhdHRyTmFtZVZhbHVlTGlzdC0+c2Vjb25kLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hlY2tSb2xlTWFwKGluZGV4LCBpc0VuY29kZXIsIHByb3BlcnRpZXMudHlwZSwgbm9kZVB0ci5uYW1lLmNfc3RyKCksIGF0dHJMaXN0KTsKKyAgICAgICAgfQorICAgIH0KK30KKworVEVTVF9GKFhNTFBhcnNlVGVzdCwgU2VydmljZUF0dHJpYnV0ZU1hcFBhcnNlVGVzdCkgeworICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBYTUxfRklMRV9OQU1FOworICAgIG1FbGVTdHJlYW0ub3BlbihpbnB1dEZpbGVOYW1lLCBpZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEobUVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpIDw8ICJGYWlsZWQgdG8gb3BlbiBpbnB1dGZpbGUgIiA8PCBpbnB1dEZpbGVOYW1lOworCisgICAgbVBhcnNlci5wYXJzZVhtbFBhdGgoaW5wdXRGaWxlTmFtZSk7CisgICAgY29uc3QgYXV0byBzZXJ2aWNlQXR0cmlidXRlTWFwID0gbVBhcnNlci5nZXRTZXJ2aWNlQXR0cmlidXRlTWFwKCk7CisgICAgZm9yIChjb25zdCBhdXRvICZhdHRyaWJ1dGVQYWlyIDogc2VydmljZUF0dHJpYnV0ZU1hcCkgeworICAgICAgICBBTE9HVigic2VydmljZUF0dHJpYnV0ZS5rZXkgPSAlcyBcdCBzZXJ2aWNlQXR0cmlidXRlLnZhbHVlID0gJXMiLAorICAgICAgICAgICAgICBhdHRyaWJ1dGVQYWlyLmZpcnN0LmNfc3RyKCksIGF0dHJpYnV0ZVBhaXIuc2Vjb25kLmNfc3RyKCkpOworICAgIH0KKyAgICBib29sIGZsYWcgPSBjb21wYXJlTWFwKG1JbnB1dFNlcnZpY2VBdHRyaWJ1dGVNYXAsIHNlcnZpY2VBdHRyaWJ1dGVNYXApOworICAgIEFTU0VSVF9UUlVFKGZsYWcpIDw8ICJTZXJ2aWNlTWFwUGFyc2VUZXN0OiB0eXBlTWFwIG1pc21hdGNoIjsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgZ0VudiA9IG5ldyBYTUxQYXJzZXJUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIEFMT0dEKCJYTUwgUGFyc2VyIFRlc3QgUmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC9YTUxQYXJzZXJUZXN0RW52aXJvbm1lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L1hNTFBhcnNlclRlc3RFbnZpcm9ubWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYTA5ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC9YTUxQYXJzZXJUZXN0RW52aXJvbm1lbnQuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX1hNTF9QQVJTRVJfVEVTVF9FTlZJUk9OTUVOVF9IX18KKyNkZWZpbmUgX19YTUxfUEFSU0VSX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2NsYXNzIFhNTFBhcnNlclRlc3RFbnZpcm9ubWVudCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkVudmlyb25tZW50IHsKKyAgcHVibGljOgorICAgIFhNTFBhcnNlclRlc3RFbnZpcm9ubWVudCgpIDogcmVzKCIvZGF0YS9sb2NhbC90bXAvIikge30KKworICAgIC8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworICAgIGludCBpbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKKworICAgIHZvaWQgc2V0UmVzKGNvbnN0IGNoYXIgKl9yZXMpIHsgcmVzID0gX3JlczsgfQorCisgICAgY29uc3Qgc3RyaW5nIGdldFJlcygpIGNvbnN0IHsgcmV0dXJuIHJlczsgfQorCisgIHByaXZhdGU6CisgICAgc3RyaW5nIHJlczsKK307CisKK2ludCBYTUxQYXJzZXJUZXN0RW52aXJvbm1lbnQ6OmluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7eyJwYXRoIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdQJ30sIHswLCAwLCAwLCAwfX07CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICBpbnQgYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJQOiIsIG9wdGlvbnMsICZpbmRleCk7CisgICAgICAgIGlmIChjID09IC0xKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgY2FzZSAnUCc6IHsKKyAgICAgICAgICAgICAgICBzZXRSZXMob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3B0aW5kIDwgYXJnYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIG9wdGlvbjogJXNcblxuIgorICAgICAgICAgICAgICAgICJ1c2FnZTogJXMgPGd0ZXN0IG9wdGlvbnM+IDx0ZXN0IG9wdGlvbnM+XG5cbiIKKyAgICAgICAgICAgICAgICAidGVzdCBvcHRpb25zIGFyZTpcblxuIgorICAgICAgICAgICAgICAgICItUCwgLS1wYXRoOiBSZXNvdXJjZSBmaWxlcyBkaXJlY3RvcnkgbG9jYXRpb25cbiIsCisgICAgICAgICAgICAgICAgYXJndltvcHRpbmQgPzogMV0sIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAgLy8gX19YTUxfUEFSU0VSX1RFU1RfRU5WSVJPTk1FTlRfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC90ZXN0ZGF0YS9tZWRpYV9jb2RlY3NfdW5pdF90ZXN0LnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L3Rlc3RkYXRhL21lZGlhX2NvZGVjc191bml0X3Rlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3Mjk5ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC90ZXN0ZGF0YS9tZWRpYV9jb2RlY3NfdW5pdF90ZXN0LnhtbApAQCAtMCwwICsxLDgwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPCEtLSBSRUZFUkVOQ0UgOiBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9tZWRpYV9jb2RlY3MueHNkIC0tPgorPEluY2x1ZGVkPgorICAgIDxTZXR0aW5ncz4KKyAgICAgICAgPERvbWFpbiBuYW1lPSJ0ZWxlcGhvbnkiIGVuYWJsZWQ9ImZhbHNlIiAvPgorICAgICAgICA8RG9tYWluIG5hbWU9InR2IiBlbmFibGVkPSJmYWxzZSIgLz4KKyAgICAgICAgPFZhcmlhbnQgbmFtZT0idmFyaWFudDEiIGVuYWJsZWQ9ImZhbHNlIiAvPgorICAgICAgICA8U2V0dGluZyBuYW1lPSJzZXR0aW5nMSIgdmFsdWU9InNldHRpbmdWYWx1ZTEiIHVwZGF0ZT0idHJ1ZSIgLz4KKyAgICAgICAgPFNldHRpbmcgbmFtZT0ic2V0dGluZzIiIGVuYWJsZWQ9ImZhbHNlIiAvPgorICAgIDwvU2V0dGluZ3M+CisgICAgPERlY29kZXJzPgorICAgICAgICA8IS0tIGVudHJ5IGZvciBlbmFibGVkLCBkb21haW4sIHJhbmsgYW5kIHVwZGF0ZSBwcm9wZXJ0aWVzIC0tPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJ0ZXN0MS5kZWNvZGVyIiB0eXBlPSJhdWRpby9tcGVnIiB1cGRhdGU9ImZhbHNlIiBkb21haW49InRlbGVwaG9ueSIgZW5hYmxlZD0iZmFsc2UiIHJhbms9IjQiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9ImFsaWFzMS5kZWNvZGVyIiAvPgorICAgICAgICAgICAgPFF1aXJrIG5hbWU9InF1aXJrMSIgdmFsdWU9InF1aXJrMVZhbHVlIi8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPCEtLSBlbnRyeSBmb3IgdGVzdGluZyBRdWlyayAtLT4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0idGVzdDIuZGVjb2RlciIgdHlwZT0iYXVkaW8vM2dwcCIgZW5hYmxlZD0idHJ1ZSIgPgorICAgICAgICAgICAgPFF1aXJrIG5hbWU9InF1aXJrMSIgdmFsdWU9InF1aXJrMVZhbHVlIi8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPCEtLSBlbnRyeSBmb3IgdGVzdGluZyBGZWF0dXJlIC0tPgorICAgICAgICA8IS0tIGZlYXR1cmUyIHRha2VzIHZhbHVlIDAgKGZlYXR1cmUgd2l0aCBzYW1lIG5hbWUgdGFrZXMgbG93ZXIgZmVhdHVyZSdzIHZhbHVlKSAtLT4KKyAgICAgICAgPCEtLSBmZWF0dXJlMyBnaXZlcyB2YWx1ZSBhcyAwIHNpbmNlIGl0J3Mgb3B0aW9uYWwgLS0+CisgICAgICAgIDwhLS0gb3B0aW9uYWw9InRydWUiIHJlcXVpcmVkPSJ0cnVlIiBpcyBub3QgYSB2YWxpZCBjb21iaW5hdGlvbi4gLS0+CisgICAgICAgIDwhLS0gb3B0aW9uYWw9ImZhbHNlIiByZXF1aXJlZD0iZmFsc2UiIGlzIG5vdCBhIHZhbGlkIGNvbWJpbmF0aW9uLiAtLT4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0idGVzdDMuZGVjb2RlciIgdHlwZT0iYXVkaW8vYW1yLXdiIiA+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJmZWF0dXJlMSIgdmFsdWU9ImZlYXR1cmUxVmFsIiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iZmVhdHVyZTIiIHZhbHVlPSJmZWF0dXJlMlZhbCIvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iZmVhdHVyZTIiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJmZWF0dXJlMyIgb3B0aW9uYWw9InRydWUiIHJlcXVpcmVkPSJmYWxzZSIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8IS0tIGVudHJ5IGZvciB0ZXN0aW5nIFR5cGUgLS0+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9InRlc3Q0LmRlY29kZXIiPgorICAgICAgICAgICAgPFR5cGUgbmFtZT0iYXVkaW8vZmxhYyI+CisgICAgICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iZmVhdHVyZTEiIHZhbHVlPSJmZWF0dXJlMVZhbCIgLz4KKyAgICAgICAgICAgIDwvVHlwZT4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8IS0tIGVudHJ5IGZvciB0ZXN0aW5nIEF0dHJpYnV0ZSAtLT4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0idGVzdDUuZGVjb2RlciIgdHlwZT0iYXVkaW8vZzcxMS1tbGF3IiA+CisgICAgICAgICAgICA8QXR0cmlidXRlIG5hbWU9ImF0dHJpYnV0ZVF1aXJrMSIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8IS0tIGVudHJ5IGZvciB0ZXN0aW5nIFZhcmlhbnQgLS0+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9InRlc3Q2LmRlY29kZXIiIHR5cGU9ImF1ZGlvL21wNGEtbGF0bSIgdmFyaWFudD0idmFyaWFudDEsdmFyaWFudDIiID4KKyAgICAgICAgICAgIDxWYXJpYW50IG5hbWU9InZhcmlhbnQxIj4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0idmFyaWFudDFMaW1pdDEiIG1pbj0idmFyaWFudDFMaW1pdDFNaW4iIG1heD0idmFyaWFudDFMaW1pdDFNYXgiIC8+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9InZhcmlhbnQxTGltaXQyIiByYW5nZT0idmFyaWFudDFMaW1pdDJMb3ctdmFyaWFudDFMaW1pdDJIaWdoIiAvPgorICAgICAgICAgICAgPC9WYXJpYW50PgorICAgICAgICAgICAgPFZhcmlhbnQgbmFtZT0idmFyaWFudDIiPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJ2YXJpYW50MkxpbWl0MSIgdmFsdWU9InZhcmlhbnQyTGltaXQxVmFsdWUiIC8+CisgICAgICAgICAgICA8L1ZhcmlhbnQ+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPCEtLSBlbnRyeSBmb3IgdGVzdGluZyBMaW1pdCAtLT4KKyAgICAgICAgPCEtLSAnaW4nIGlzIHByZXNlbnQgaW4geHNkIGZpbGUgYnV0IG5vdCBoYW5kbGVkIGluIE1lZGlhQ29kZWNzWG1sUGFyc2VyIC0tPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJ0ZXN0Ny5kZWNvZGVyIiB0eXBlPSJhdWRpby92b3JiaXMiID4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJsaW1pdDEiIGluPSJsaW1pdDFJbiIgbWluPSJsaW1pdDFNaW4iLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJsaW1pdDIiIG1pbj0ibGltaXQyTWluIiBtYXg9ImxpbWl0Mk1heCIgc2NhbGU9ImxpbWl0MlNjYWxlIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImxpbWl0MyIgcmFuZ2VzPSJsaW1pdDNWYWwxLGxpbWl0M1ZhbDIsbGltaXQzVmFsMyIgZGVmYXVsdD0ibGltaXQzVmFsMyIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgIDwvRGVjb2RlcnM+CisgICAgPEVuY29kZXJzPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJ0ZXN0OC5lbmNvZGVyIiB0eXBlPSJhdWRpby9vcHVzIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJsaW1pdDEiIG1heD0ibGltaXQxTWF4IiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgPC9FbmNvZGVycz4KKzwvSW5jbHVkZWQ+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC90ZXN0ZGF0YS9tZWRpYV9jb2RlY3NfdW5pdF90ZXN0X2NhbGxlci54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdGVzdC90ZXN0ZGF0YS9tZWRpYV9jb2RlY3NfdW5pdF90ZXN0X2NhbGxlci54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg2NGNlOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci90ZXN0L3Rlc3RkYXRhL21lZGlhX2NvZGVjc191bml0X3Rlc3RfY2FsbGVyLnhtbApAQCAtMCwwICsxLDQgQEAKKzwhLS0gZW50cnkgZm9yIHRlc3RpbmcgSW5jbHVkZSAtLT4KKzxNZWRpYUNvZGVjcz4KKyAgICA8SW5jbHVkZSBocmVmPSJtZWRpYV9jb2RlY3NfdW5pdF90ZXN0LnhtbCIgLz4KKzwvTWVkaWFDb2RlY3M+CmRpZmYgLS1naXQgYS9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLmJwIGIvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5icAppbmRleCBhZmNhN2M0Li44ZDVjNzdmIDEwMDY0NAotLS0gYS9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQuYnAKQEAgLTM0LDggKzM0LDEwIEBACiAgICAgICAgICJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyIiwKICAgICBdLAogCi0gICAgLy8gYmFjayB0byAzMi1iaXQsIGIvMTI2NTAyNjEzCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKKyAgICAvLyBtZWRpYXNlcnZlciBoYXMgb25seSBiZWVuIHZlcmlmaWVkIG9uIDMyLWJpdCwgc2VlIGIvMTI2NTAyNjEzCisgICAgLy8gdXNlICJwcmVmZXIzMiIgdG8gKm9ubHkqIGVuYWJsZSA2NC1iaXQgYnVpbGRzIG9uIDY0LWJpdC1vbmx5IGx1bmNoCisgICAgLy8gdGFyZ2V0cywgd2hpY2ggYWxsb3dzIHRoZW0gdG8gcmVhY2ggJ2Jvb3RfY29tcGxldGUnLgorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJwcmVmZXIzMiIsCiAKICAgICBpbml0X3JjOiBbIm1lZGlhc2VydmVyLnJjIl0sCiAKZGlmZiAtLWdpdCBhL21lZGlhL210cC9BbmRyb2lkLmJwIGIvbWVkaWEvbXRwL0FuZHJvaWQuYnAKaW5kZXggNjZhMzEzOS4uZTU3MjI0OSAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbXRwL0FuZHJvaWQuYnAKQEAgLTUyLDUgKzUyLDYgQEAKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJ1c2Job3N0IiwKICAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbImxpYmN1dGlsc19oZWFkZXJzIl0sCiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBGZnNIYW5kbGUuY3BwIGIvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5jcHAKaW5kZXggYmQ2YTZjNi4uYzhiNGEwMyAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5jcHAKKysrIGIvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5jcHAKQEAgLTExNCwxMSArMTE0LDExIEBACiB2b2lkIE10cEZmc0hhbmRsZTo6YWR2aXNlKGludCBmZCkgewogICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOVU1fSU9fQlVGUzsgaSsrKSB7CiAgICAgICAgIGlmIChwb3NpeF9tYWR2aXNlKG1Jb2J1ZltpXS5idWZzLmRhdGEoKSwgTUFYX0ZJTEVfQ0hVTktfU0laRSwKLSAgICAgICAgICAgICAgICBQT1NJWF9NQURWX1NFUVVFTlRJQUwgfCBQT1NJWF9NQURWX1dJTExORUVEKSA8IDApCisgICAgICAgICAgICAgICAgUE9TSVhfTUFEVl9TRVFVRU5USUFMIHwgUE9TSVhfTUFEVl9XSUxMTkVFRCkgIT0gMCkKICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gbWFkdmlzZSI7CiAgICAgfQogICAgIGlmIChwb3NpeF9mYWR2aXNlKGZkLCAwLCAwLAotICAgICAgICAgICAgICAgIFBPU0lYX0ZBRFZfU0VRVUVOVElBTCB8IFBPU0lYX0ZBRFZfTk9SRVVTRSB8IFBPU0lYX0ZBRFZfV0lMTE5FRUQpIDwgMCkKKyAgICAgICAgICAgICAgICBQT1NJWF9GQURWX1NFUVVFTlRJQUwgfCBQT1NJWF9GQURWX05PUkVVU0UgfCBQT1NJWF9GQURWX1dJTExORUVEKSAhPSAwKQogICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIGZhZHZpc2UiOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvQW5kcm9pZC5icCBiL21lZGlhL25kay9BbmRyb2lkLmJwCmluZGV4IDQzOTg5YmIuLjM3NTk4ZjggMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9BbmRyb2lkLmJwCisrKyBiL21lZGlhL25kay9BbmRyb2lkLmJwCkBAIC00Myw3ICs0MywxMyBAQAogICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCiAgICAgXSwKICAgICBtaW5fc2RrX3ZlcnNpb246ICIyOSIsCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0KKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAogfQogCiBjY19saWJyYXJ5X3NoYXJlZCB7CkBAIC03OSw2ICs4NSw3IEBACiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJqbmlfaGVhZGVycyIsCiAgICAgICAgICJsaWJtZWRpYWRybV9oZWFkZXJzIiwKICAgICAgICAgImxpYm1lZGlhbWV0cmljc19oZWFkZXJzIiwKICAgICBdLApAQCAtMTA2LDYgKzExMyw4IEBACiAgICAgICAgICJsaWJuYXRpdmVoZWxwZXIiLAogICAgIF0sCiAKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbImpuaV9oZWFkZXJzIl0sCisKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIAogICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKQEAgLTE5NSwzICsyMDQsNDEgQEAKICAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbmRrLyIsCiAgICAgXSwKIH0KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJtZWRpYW5ka19mb3JtYXQiLAorCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJOZGtNZWRpYUZvcm1hdC5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItREVYUE9SVD1fX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KFwiZGVmYXVsdFwiKSkpIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKKworICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCisKKyAgICBhcGV4X2F2YWlsYWJsZTogWyJjb20uYW5kcm9pZC5tZWRpYSJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0LmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdC5jcHAKaW5kZXggYWIwY2I2My4uODY4MDY0MSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0LmNwcAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwCkBAIC0yNiw5ICsyNiw2IEBACiAjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxhbmRyb2lkX3V0aWxfQmluZGVyLmg+Ci0KLSNpbmNsdWRlIDxqbmkuaD4KIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ29kZWMuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ29kZWMuaAppbmRleCA4ZmI2YTg3Li44MGQ1ZDUwIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUNvZGVjLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDb2RlYy5oCkBAIC0xMTQsMTIgKzExNCwxMiBAQAogICAgICAgICBpbnQzMl90IGFjdGlvbkNvZGUsCiAgICAgICAgIGNvbnN0IGNoYXIgKmRldGFpbCk7CiAKLXN0cnVjdCBBTWVkaWFDb2RlY09uQXN5bmNOb3RpZnlDYWxsYmFjayB7Cit0eXBlZGVmIHN0cnVjdCBBTWVkaWFDb2RlY09uQXN5bmNOb3RpZnlDYWxsYmFjayB7CiAgICAgICBBTWVkaWFDb2RlY09uQXN5bmNJbnB1dEF2YWlsYWJsZSAgb25Bc3luY0lucHV0QXZhaWxhYmxlOwogICAgICAgQU1lZGlhQ29kZWNPbkFzeW5jT3V0cHV0QXZhaWxhYmxlIG9uQXN5bmNPdXRwdXRBdmFpbGFibGU7CiAgICAgICBBTWVkaWFDb2RlY09uQXN5bmNGb3JtYXRDaGFuZ2VkICAgb25Bc3luY0Zvcm1hdENoYW5nZWQ7CiAgICAgICBBTWVkaWFDb2RlY09uQXN5bmNFcnJvciAgICAgICAgICAgb25Bc3luY0Vycm9yOwotfTsKK30gQU1lZGlhQ29kZWNPbkFzeW5jTm90aWZ5Q2FsbGJhY2s7CiAKICNpZiBfX0FORFJPSURfQVBJX18gPj0gMjEKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXh0cmFjdG9yLmgKaW5kZXggMTQzMTljNC4uYTFjZDllMyAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oCkBAIC0zNiw2ICszNiw3IEBACiAjaWZuZGVmIF9OREtfTUVESUFfRVhUUkFDVE9SX0gKICNkZWZpbmUgX05ES19NRURJQV9FWFRSQUNUT1JfSAogCisjaW5jbHVkZSA8c3RkYm9vbC5oPgogI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdC5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXQuaAppbmRleCA0OWQ4YjRhLi42MzcxZGU0IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdC5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0LmgKQEAgLTM2LDkgKzM2LDI0IEBACiAjaWZuZGVmIF9OREtfTUVESUFfRk9STUFUX0gKICNkZWZpbmUgX05ES19NRURJQV9GT1JNQVRfSAogCisjaW5jbHVkZSA8c3RkYm9vbC5oPgogI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCisjaWZuZGVmIF9fQU5EUk9JRF9fCisvLyBWYWx1ZSBjb3BpZWQgZnJvbSAnYmlvbmljL2xpYmMvaW5jbHVkZS9hbmRyb2lkL2FwaS1sZXZlbC5oJyB3aGljaCBpcyBub3QgYXZhaWxhYmxlIG9uCisvLyBub24gQW5kcm9pZCBzeXN0ZW1zLiBJdCBpcyBzZXQgdG8gMTAwMDAgd2hpY2ggaXMgc2FtZSBhcyBfX0FORFJPSURfQVBJX0ZVVFVSRV9fIHZhbHVlLgorI2lmbmRlZiBfX0FORFJPSURfQVBJX18KKyNkZWZpbmUgX19BTkRST0lEX0FQSV9fIDEwMDAwCisjZW5kaWYKKworLy8gVmFsdWUgY29waWVkIGZyb20gJ2Jpb25pYy9saWJjL2luY2x1ZGUvYW5kcm9pZC92ZXJzaW9uaW5nLmgnIHdoaWNoIGlzIG5vdCBhdmFpbGFibGUgb24KKy8vIG5vbiBBbmRyb2lkIHN5c3RlbXMKKyNpZm5kZWYgX19JTlRST0RVQ0VEX0lOCisjZGVmaW5lIF9fSU5UUk9EVUNFRF9JTihhcGlfbGV2ZWwpCisjZW5kaWYKKyNlbmRpZgorCiAjaW5jbHVkZSAiTmRrTWVkaWFFcnJvci5oIgogCiBfX0JFR0lOX0RFQ0xTCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9hbmRyb2lkVGVzdC9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL2JlbmNobWFyay90ZXN0cy9FbmNvZGVyVGVzdC5qYXZhIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvYW5kcm9pZFRlc3QvamF2YS9jb20vYW5kcm9pZC9tZWRpYS9iZW5jaG1hcmsvdGVzdHMvRW5jb2RlclRlc3QuamF2YQppbmRleCA0OGUxNDIyLi40MjAyNzMyIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9hbmRyb2lkVGVzdC9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL2JlbmNobWFyay90ZXN0cy9FbmNvZGVyVGVzdC5qYXZhCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL2FuZHJvaWRUZXN0L2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL3Rlc3RzL0VuY29kZXJUZXN0LmphdmEKQEAgLTM0LDYgKzM0LDcgQEAKIGltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsubGlicmFyeS5OYXRpdmU7CiBpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLmxpYnJhcnkuU3RhdHM7CiAKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKIGltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpAQCAtNTcsNDAgKzU4LDg3IEBACiBwdWJsaWMgY2xhc3MgRW5jb2RlclRlc3QgewogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbnRleHQgbUNvbnRleHQgPQogICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VGFyZ2V0Q29udGV4dCgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtRmlsZURpclBhdGggPSBtQ29udGV4dC5nZXRGaWxlc0RpcigpICsgIi8iOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtSW5wdXRGaWxlUGF0aCA9IG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5pbnB1dF9maWxlX3BhdGgpOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtT3V0cHV0RmlsZVBhdGggPSBtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcub3V0cHV0X2ZpbGVfcGF0aCk7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG1TdGF0c0ZpbGUgPQogICAgICAgICAgICAgbUNvbnRleHQuZ2V0RXh0ZXJuYWxGaWxlc0RpcihudWxsKSArICIvRW5jb2Rlci4iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAiLmNzdiI7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJFbmNvZGVyVGVzdCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBQRVJfVEVTVF9USU1FT1VUX01TID0gMTIwMDAwOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFdSSVRFX09VVFBVVCA9IGZhbHNlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUEVSX1RFU1RfVElNRU9VVF9NUyA9IDEyMDAwMDsKICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRU5DT0RFX0RFRkFVTFRfRlJBTUVfUkFURSA9IDI1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkNPREVfREVGQVVMVF9CSVRfUkFURSA9IDgwMDAwMDAgLyogOCBNYnBzICovOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkNPREVfTUlOX0JJVF9SQVRFID0gNjAwMDAwIC8qIDYwMCBLYnBzICovOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkNPREVfREVGQVVMVF9WSURFT19CSVRfUkFURSA9IDgwMDAwMDAgLyogOCBNYnBzICovOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkNPREVfTUlOX1ZJREVPX0JJVF9SQVRFID0gNjAwMDAwIC8qIDYwMCBLYnBzICovOwogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkNPREVfREVGQVVMVF9BVURJT19CSVRfUkFURSA9IDEyODAwMCAvKiAxMjggS2JwcyAqLzsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgbUNvbG9yRm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CisgICAgcHJpdmF0ZSBzdGF0aWMgRmlsZSBtRGVjb2RlZEZpbGVRY2lmOworICAgIHByaXZhdGUgc3RhdGljIEZpbGUgbURlY29kZWRGaWxlRnVsbEhkOworICAgIHByaXZhdGUgc3RhdGljIEZpbGUgbURlY29kZWRGaWxlQXVkaW87CiAgICAgcHJpdmF0ZSBTdHJpbmcgbUlucHV0RmlsZTsKKyAgICBwcml2YXRlIFN0cmluZyBtTWltZTsKKyAgICBwcml2YXRlIGludCBtQml0UmF0ZTsKKyAgICBwcml2YXRlIGludCBtSUZyYW1lSW50ZXJ2YWw7CisgICAgcHJpdmF0ZSBpbnQgbVdpZHRoOworICAgIHByaXZhdGUgaW50IG1IZWlnaHQ7CisgICAgcHJpdmF0ZSBpbnQgbVByb2ZpbGU7CisgICAgcHJpdmF0ZSBpbnQgbUxldmVsOworICAgIHByaXZhdGUgaW50IG1TYW1wbGVSYXRlOworICAgIHByaXZhdGUgaW50IG1OdW1DaGFubmVsOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUNPREVfRlVMTEhEX0lOUFVUID0gImNyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc19oMjY1Lm1rdiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFQ09ERV9RQ0lGX0lOUFVUID0gImNyb3dkXzE3NngxNDRfMjVmcHNfNjAwMGticHNfbXBlZzQubXA0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVDT0RFX0FVRElPX0lOUFVUID0gImJiYl80ODAwMGh6XzJjaF8xMDBrYnBzX29wdXNfMzBzZWMud2VibSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFQ09ERV9GVUxMSERfVU5QQUNLRUQgPSAiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzQwMDBrYnBzX2gyNjUueXV2IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVDT0RFX1FDSUZfVU5QQUNLRUQgPSAiY3Jvd2RfMTc2eDE0NF8yNWZwc182MDAwa2Jwc19tcGVnNC55dXYiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUNPREVfQVVESU9fVU5QQUNLRUQgPSAiYmJiXzQ4MDAwaHpfMmNoXzEwMGticHNfb3B1c18zMHNlYy5yYXciOwogCiAgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycwogICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxPYmplY3RbXT4gaW5wdXRGaWxlcygpIHsKICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW117CiAgICAgICAgICAgICAgICAgLy8gQXVkaW8gVGVzdAotICAgICAgICAgICAgICAgIHsiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfYWFjXzMwc2VjLm1wNCJ9LAotICAgICAgICAgICAgICAgIHsiYmJiXzgwMDBoel8xY2hfOGticHNfYW1ybmJfMzBzZWMuM2dwIn0sCi0gICAgICAgICAgICAgICAgeyJiYmJfMTYwMDBoel8xY2hfOWticHNfYW1yd2JfMzBzZWMuM2dwIn0sCi0gICAgICAgICAgICAgICAgeyJiYmJfNDQxMDBoel8yY2hfNjAwa2Jwc19mbGFjXzMwc2VjLm1wNCJ9LAotICAgICAgICAgICAgICAgIHsiYmJiXzQ4MDAwaHpfMmNoXzEwMGticHNfb3B1c18zMHNlYy53ZWJtIn0sCisgICAgICAgICAgICAgICAgLy8gUGFyYW1ldGVyczogRmlsZW5hbWUsIG1pbWVUeXBlLCBiaXRyYXRlLCB3aWR0aCwgaGVpZ2h0LCBpRnJhbWVJbnRlcnZhbCwKKyAgICAgICAgICAgICAgICAvLyBwcm9maWxlLCBsZXZlbCwgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50CisgICAgICAgICAgICAgICAge0RFQ09ERV9BVURJT19VTlBBQ0tFRCwgTWVkaWFGb3JtYXQuTUlNRVRZUEVfQVVESU9fQUFDLAorICAgICAgICAgICAgICAgICAgICAgICAgRU5DT0RFX0RFRkFVTFRfQVVESU9fQklUX1JBVEUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNDQxMDAsIDJ9LAorICAgICAgICAgICAgICAgIHtERUNPREVfQVVESU9fVU5QQUNLRUQsIE1lZGlhRm9ybWF0Lk1JTUVUWVBFX0FVRElPX0FNUl9OQiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVOQ09ERV9ERUZBVUxUX0FVRElPX0JJVF9SQVRFLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDgwMDAsIDF9LAorICAgICAgICAgICAgICAgIHtERUNPREVfQVVESU9fVU5QQUNLRUQsIE1lZGlhRm9ybWF0Lk1JTUVUWVBFX0FVRElPX0FNUl9XQiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVOQ09ERV9ERUZBVUxUX0FVRElPX0JJVF9SQVRFLCAtMSwgLTEsIC0xLCAtMSwgLTEsIDE2MDAwLCAxfSwKKyAgICAgICAgICAgICAgICB7REVDT0RFX0FVRElPX1VOUEFDS0VELCBNZWRpYUZvcm1hdC5NSU1FVFlQRV9BVURJT19GTEFDLAorICAgICAgICAgICAgICAgICAgICAgICAgRU5DT0RFX0RFRkFVTFRfQVVESU9fQklUX1JBVEUsIC0xLCAtMSwgLTEsIC0xLCAtMSwgNDQxMDAsIDJ9LAorICAgICAgICAgICAgICAgIHtERUNPREVfQVVESU9fVU5QQUNLRUQsIE1lZGlhRm9ybWF0Lk1JTUVUWVBFX0FVRElPX09QVVMsCisgICAgICAgICAgICAgICAgICAgICAgICBFTkNPREVfREVGQVVMVF9BVURJT19CSVRfUkFURSwgLTEsIC0xLCAtMSwgLTEsIC0xLCA0ODAwMCwgMn0sCisKICAgICAgICAgICAgICAgICAvLyBWaWRlbyBUZXN0Ci0gICAgICAgICAgICAgICAgeyJjcm93ZF8xOTIweDEwODBfMjVmcHNfNDAwMGticHNfdnA4LndlYm0ifSwKLSAgICAgICAgICAgICAgICB7ImNyb3dkXzE5MjB4MTA4MF8yNWZwc182NzAwa2Jwc19oMjY0LnRzIn0sCi0gICAgICAgICAgICAgICAgeyJjcm93ZF8xOTIweDEwODBfMjVmcHNfNDAwMGticHNfaDI2NS5ta3YifSwKLSAgICAgICAgICAgICAgICB7ImNyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc192cDkud2VibSJ9LAotICAgICAgICAgICAgICAgIHsiY3Jvd2RfMTc2eDE0NF8yNWZwc182MDAwa2Jwc19tcGVnNC5tcDQifSwKLSAgICAgICAgICAgICAgICB7ImNyb3dkXzE3NngxNDRfMjVmcHNfNjAwMGticHNfaDI2My4zZ3AifX0pOworICAgICAgICAgICAgICAgIC8vIFBhcmFtZXRlcnM6IEZpbGVuYW1lLCBtaW1lVHlwZSwgYml0cmF0ZSwgd2lkdGgsIGhlaWdodCwgaUZyYW1lSW50ZXJ2YWwsCisgICAgICAgICAgICAgICAgLy8gcHJvZmlsZSwgbGV2ZWwsIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudAorICAgICAgICAgICAgICAgIHtERUNPREVfRlVMTEhEX1VOUEFDS0VELCBNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19WUDgsCisgICAgICAgICAgICAgICAgICAgICAgICBFTkNPREVfREVGQVVMVF9WSURFT19CSVRfUkFURSwgMTkyMCwgMTA4MCwgMSwgLTEsIC0xLCAtMSwgLTF9LAorICAgICAgICAgICAgICAgIHtERUNPREVfRlVMTEhEX1VOUEFDS0VELCBNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19BVkMsCisgICAgICAgICAgICAgICAgICAgICAgICBFTkNPREVfREVGQVVMVF9WSURFT19CSVRfUkFURSwgMTkyMCwgMTA4MCwgMSwgLTEsIC0xLCAtMSwgLTF9LAorICAgICAgICAgICAgICAgIHtERUNPREVfRlVMTEhEX1VOUEFDS0VELCBNZWRpYUZvcm1hdC5NSU1FVFlQRV9WSURFT19IRVZDLAorICAgICAgICAgICAgICAgICAgICAgICAgRU5DT0RFX0RFRkFVTFRfVklERU9fQklUX1JBVEUsIDE5MjAsIDEwODAsIDEsIC0xLCAtMSwgLTEsIC0xfSwKKyAgICAgICAgICAgICAgICB7REVDT0RFX0ZVTExIRF9VTlBBQ0tFRCwgTWVkaWFGb3JtYXQuTUlNRVRZUEVfVklERU9fVlA5LAorICAgICAgICAgICAgICAgICAgICAgICAgRU5DT0RFX0RFRkFVTFRfVklERU9fQklUX1JBVEUsIDE5MjAsIDEwODAsIDEsIC0xLCAtMSwgLTEsIC0xfSwKKyAgICAgICAgICAgICAgICB7REVDT0RFX1FDSUZfVU5QQUNLRUQsIE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX01QRUc0LCBFTkNPREVfTUlOX1ZJREVPX0JJVF9SQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgMTc2LCAxNDQsIDEsIC0xLCAtMSwgLTEsIC0xfSwKKyAgICAgICAgICAgICAgICB7REVDT0RFX1FDSUZfVU5QQUNLRUQsIE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1ZJREVPX0gyNjMsIEVOQ09ERV9NSU5fVklERU9fQklUX1JBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAxNzYsIDE0NCwgMSwgLTEsIC0xLCAtMSwgLTF9fSk7CiAgICAgfQogCi0gICAgcHVibGljIEVuY29kZXJUZXN0KFN0cmluZyBpbnB1dEZpbGVOYW1lKSB7Ci0gICAgICAgIHRoaXMubUlucHV0RmlsZSA9IGlucHV0RmlsZU5hbWU7CisgICAgcHVibGljIEVuY29kZXJUZXN0KFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIG1pbWUsIGludCBiaXRyYXRlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZUludGVydmFsLCBpbnQgcHJvZmlsZSwgaW50IGxldmVsLCBpbnQgc2FtcGxlcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxDb3VudCkgeworICAgICAgICB0aGlzLm1JbnB1dEZpbGUgPSBmaWxlbmFtZTsKKyAgICAgICAgdGhpcy5tTWltZSA9IG1pbWU7CisgICAgICAgIHRoaXMubUJpdFJhdGUgPSBiaXRyYXRlOworICAgICAgICB0aGlzLm1JRnJhbWVJbnRlcnZhbCA9IGZyYW1lSW50ZXJ2YWw7CisgICAgICAgIHRoaXMubVdpZHRoID0gd2lkdGg7CisgICAgICAgIHRoaXMubUhlaWdodCA9IGhlaWdodDsKKyAgICAgICAgdGhpcy5tUHJvZmlsZSA9IHByb2ZpbGU7CisgICAgICAgIHRoaXMubUxldmVsID0gbGV2ZWw7CisgICAgICAgIHRoaXMubVNhbXBsZVJhdGUgPSBzYW1wbGVyYXRlOworICAgICAgICB0aGlzLm1OdW1DaGFubmVsID0gY2hhbm5lbENvdW50OwogICAgIH0KIAogICAgIEBCZWZvcmVDbGFzcwpAQCAtMTAxLDMzICsxNDksMzYgQEAKICAgICAgICAgTG9nLmQoVEFHLCAiU2F2aW5nIEJlbmNobWFyayByZXN1bHRzIGluOiAiICsgbVN0YXRzRmlsZSk7CiAgICAgfQogCi0gICAgQFRlc3QodGltZW91dCA9IFBFUl9URVNUX1RJTUVPVVRfTVMpCi0gICAgcHVibGljIHZvaWQgdGVzdEVuY29kZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IHN0YXR1czsKLSAgICAgICAgaW50IGZyYW1lU2l6ZTsKLSAgICAgICAgLy9QYXJhbWV0ZXJzIGZvciB2aWRlbwotICAgICAgICBpbnQgd2lkdGggPSAwOwotICAgICAgICBpbnQgaGVpZ2h0ID0gMDsKLSAgICAgICAgaW50IHByb2ZpbGUgPSAwOwotICAgICAgICBpbnQgbGV2ZWwgPSAwOwotICAgICAgICBpbnQgZnJhbWVSYXRlID0gMDsKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJlcGFyZUlucHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKIAotICAgICAgICAvL1BhcmFtZXRlcnMgZm9yIGF1ZGlvCi0gICAgICAgIGludCBiaXRSYXRlID0gMDsKLSAgICAgICAgaW50IHNhbXBsZVJhdGUgPSAwOwotICAgICAgICBpbnQgbnVtQ2hhbm5lbHMgPSAwOwotICAgICAgICBGaWxlIGlucHV0RmlsZSA9IG5ldyBGaWxlKG1JbnB1dEZpbGVQYXRoICsgbUlucHV0RmlsZSk7Ci0gICAgICAgIGFzc2VydFRydWUoIkNhbm5vdCBmaW5kICIgKyBtSW5wdXRGaWxlICsgIiBpbiBkaXJlY3RvcnkgIiArIG1JbnB1dEZpbGVQYXRoLAotICAgICAgICAgICAgICAgIGlucHV0RmlsZS5leGlzdHMoKSk7CisgICAgICAgIG1EZWNvZGVkRmlsZUZ1bGxIZCA9IG5ldyBGaWxlKG1GaWxlRGlyUGF0aCArIERFQ09ERV9GVUxMSERfVU5QQUNLRUQpOworICAgICAgICBpbnQgc3RhdHVzID0gZGVjb2RlRmlsZShtSW5wdXRGaWxlUGF0aCArIERFQ09ERV9GVUxMSERfSU5QVVQsIG1EZWNvZGVkRmlsZUZ1bGxIZCk7CisgICAgICAgIGFzc2VydEVxdWFscygiRGVjb2RlciByZXR1cm5lZCBlcnJvciAiICsgc3RhdHVzLCAwLCBzdGF0dXMpOworCisgICAgICAgIG1EZWNvZGVkRmlsZVFjaWYgPSBuZXcgRmlsZShtRmlsZURpclBhdGggKyBERUNPREVfUUNJRl9VTlBBQ0tFRCk7CisgICAgICAgIHN0YXR1cyA9IGRlY29kZUZpbGUobUlucHV0RmlsZVBhdGggKyBERUNPREVfUUNJRl9JTlBVVCwgbURlY29kZWRGaWxlUWNpZik7CisgICAgICAgIGFzc2VydEVxdWFscygiRGVjb2RlciByZXR1cm5lZCBlcnJvciAiICsgc3RhdHVzLCAwLCBzdGF0dXMpOworCisgICAgICAgIG1EZWNvZGVkRmlsZUF1ZGlvID0gbmV3IEZpbGUobUZpbGVEaXJQYXRoICsgREVDT0RFX0FVRElPX1VOUEFDS0VEKTsKKyAgICAgICAgc3RhdHVzID0gZGVjb2RlRmlsZShtSW5wdXRGaWxlUGF0aCArIERFQ09ERV9BVURJT19JTlBVVCwgbURlY29kZWRGaWxlQXVkaW8pOworICAgICAgICBhc3NlcnRFcXVhbHMoIkRlY29kZXIgcmV0dXJuZWQgZXJyb3IgIiArIHN0YXR1cywgMCwgc3RhdHVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZGVjb2RlRmlsZShTdHJpbmcgaW5wdXRGaWxlTmFtZSwgRmlsZSBvdXRwdXREZWNvZGVGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgc3RhdHVzID0gLTE7CisgICAgICAgIEZpbGUgaW5wdXRGaWxlID0gbmV3IEZpbGUoaW5wdXRGaWxlTmFtZSk7CisgICAgICAgIGFzc2VydFRydWUoIkNhbm5vdCBvcGVuIGlucHV0IGZpbGUgIiArIGlucHV0RmlsZU5hbWUsIGlucHV0RmlsZS5leGlzdHMoKSk7CiAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaWxlSW5wdXQgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGlucHV0RmlsZSk7CiAgICAgICAgIEZpbGVEZXNjcmlwdG9yIGZpbGVEZXNjcmlwdG9yID0gZmlsZUlucHV0LmdldEZEKCk7CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZGVjb2RlT3V0cHV0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0RGVjb2RlRmlsZSk7CisKICAgICAgICAgRXh0cmFjdG9yIGV4dHJhY3RvciA9IG5ldyBFeHRyYWN0b3IoKTsKICAgICAgICAgaW50IHRyYWNrQ291bnQgPSBleHRyYWN0b3Iuc2V0VXBFeHRyYWN0b3IoZmlsZURlc2NyaXB0b3IpOwotICAgICAgICBhc3NlcnRUcnVlKCJFeHRyYWN0aW9uIGZhaWxlZC4gTm8gdHJhY2tzIGZvciBmaWxlOiAiICsgbUlucHV0RmlsZSwgKHRyYWNrQ291bnQgPiAwKSk7CisgICAgICAgIGFzc2VydFRydWUoIkV4dHJhY3Rpb24gZmFpbGVkLiBObyB0cmFja3MgZm9yIHRoZSBnaXZlbiBpbnB1dCBmaWxlIiwgKHRyYWNrQ291bnQgPiAwKSk7CiAgICAgICAgIEFycmF5TGlzdDxCeXRlQnVmZmVyPiBpbnB1dEJ1ZmZlciA9IG5ldyBBcnJheUxpc3Q8PigpOwogICAgICAgICBBcnJheUxpc3Q8TWVkaWFDb2RlYy5CdWZmZXJJbmZvPiBmcmFtZUluZm8gPSBuZXcgQXJyYXlMaXN0PD4oKTsKICAgICAgICAgZm9yIChpbnQgY3VycmVudFRyYWNrID0gMDsgY3VycmVudFRyYWNrIDwgdHJhY2tDb3VudDsgY3VycmVudFRyYWNrKyspIHsKLSAgICAgICAgICAgIGludCBjb2xvckZvcm1hdCA9IENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOwogICAgICAgICAgICAgZXh0cmFjdG9yLnNlbGVjdEV4dHJhY3RvclRyYWNrKGN1cnJlbnRUcmFjayk7CiAgICAgICAgICAgICBNZWRpYUZvcm1hdCBmb3JtYXQgPSBleHRyYWN0b3IuZ2V0Rm9ybWF0KGN1cnJlbnRUcmFjayk7CiAgICAgICAgICAgICAvLyBHZXQgc2FtcGxlcyBmcm9tIGV4dHJhY3RvcgpAQCAtMTQ2LDE2MyArMTk3LDEzNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZkluZm8ucHJlc2VudGF0aW9uVGltZVVzICsgIiBzaXplID0gIiArIGJ1ZkluZm8uc2l6ZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSB3aGlsZSAoc2FtcGxlU2l6ZSA+IDApOwotICAgICAgICAgICAgaW50IHRpZCA9IGFuZHJvaWQub3MuUHJvY2Vzcy5teVRpZCgpOwotICAgICAgICAgICAgRmlsZSBkZWNvZGVkRmlsZSA9IG5ldyBGaWxlKG1Db250ZXh0LmdldEZpbGVzRGlyKCkgKyAiL2RlY29kZXJfIiArIHRpZCArICIub3V0Iik7Ci0gICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGRlY29kZU91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKGRlY29kZWRGaWxlKTsKICAgICAgICAgICAgIERlY29kZXIgZGVjb2RlciA9IG5ldyBEZWNvZGVyKCk7CiAgICAgICAgICAgICBkZWNvZGVyLnNldHVwRGVjb2RlcihkZWNvZGVPdXRwdXRTdHJlYW0pOwogICAgICAgICAgICAgc3RhdHVzID0gZGVjb2Rlci5kZWNvZGUoaW5wdXRCdWZmZXIsIGZyYW1lSW5mbywgZmFsc2UsIGZvcm1hdCwgIiIpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJEZWNvZGVyIHJldHVybmVkIGVycm9yICIgKyBzdGF0dXMgKyAiIGZvciBmaWxlOiAiICsgbUlucHV0RmlsZSwgMCwKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKICAgICAgICAgICAgIE1lZGlhRm9ybWF0IGRlY29kZXJGb3JtYXQgPSBkZWNvZGVyLmdldEZvcm1hdCgpOworICAgICAgICAgICAgaWYgKGRlY29kZXJGb3JtYXQuY29udGFpbnNLZXkoTWVkaWFGb3JtYXQuS0VZX0NPTE9SX0ZPUk1BVCkpIHsKKyAgICAgICAgICAgICAgICBtQ29sb3JGb3JtYXQgPSBkZWNvZGVyRm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0NPTE9SX0ZPUk1BVCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBkZWNvZGVyLmRlSW5pdENvZGVjKCk7CiAgICAgICAgICAgICBleHRyYWN0b3IudW5zZWxlY3RFeHRyYWN0b3JUcmFjayhjdXJyZW50VHJhY2spOwogICAgICAgICAgICAgaW5wdXRCdWZmZXIuY2xlYXIoKTsKICAgICAgICAgICAgIGZyYW1lSW5mby5jbGVhcigpOwotICAgICAgICAgICAgaWYgKGRlY29kZU91dHB1dFN0cmVhbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZGVjb2RlT3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTdHJpbmcgbWltZSA9IGZvcm1hdC5nZXRTdHJpbmcoTWVkaWFGb3JtYXQuS0VZX01JTUUpOwotICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gbWVkaWFDb2RlY3MgPSBDb2RlY1V0aWxzLnNlbGVjdENvZGVjcyhtaW1lLCB0cnVlKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUoIk5vIHN1aXRhYmxlIGNvZGVjcyBmb3VuZCBmb3IgZmlsZTogIiArIG1JbnB1dEZpbGUgKyAiIHRyYWNrIDogIiArCi0gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUcmFjayArICIgbWltZTogIiArIG1pbWUsIChtZWRpYUNvZGVjcy5zaXplKCkgPiAwKSk7Ci0gICAgICAgICAgICBCb29sZWFuW10gZW5jb2RlTW9kZSA9IHt0cnVlLCBmYWxzZX07Ci0gICAgICAgICAgICAvKiBFbmNvZGluZyB0aGUgZGVjb2RlcidzIG91dHB1dCAqLwotICAgICAgICAgICAgZm9yIChCb29sZWFuIGFzeW5jTW9kZSA6IGVuY29kZU1vZGUpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBjb2RlY05hbWUgOiBtZWRpYUNvZGVjcykgewotICAgICAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGVuY29kZU91dHB1dFN0cmVhbSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChXUklURV9PVVRQVVQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGUgb3V0RW5jb2RlRmlsZSA9IG5ldyBGaWxlKG1PdXRwdXRGaWxlUGF0aCArICJlbmNvZGVyLm91dCIpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dEVuY29kZUZpbGUuZXhpc3RzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCIgVW5hYmxlIHRvIGRlbGV0ZSBleGlzdGluZyBmaWxlIiArIG91dEVuY29kZUZpbGUudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEVuY29kZUZpbGUuZGVsZXRlKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVW5hYmxlIHRvIGNyZWF0ZSBmaWxlIHRvIHdyaXRlIGVuY29kZXIgb3V0cHV0OiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0RW5jb2RlRmlsZS50b1N0cmluZygpLCBvdXRFbmNvZGVGaWxlLmNyZWF0ZU5ld0ZpbGUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVPdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRFbmNvZGVGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBGaWxlIHJhd0ZpbGUgPSBuZXcgRmlsZShtQ29udGV4dC5nZXRGaWxlc0RpcigpICsgIi9kZWNvZGVyXyIgKyB0aWQgKyAiLm91dCIpOwotICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJDYW5ub3Qgb3BlbiBmaWxlIHRvIHdyaXRlIGRlY29kZWQgb3V0cHV0IiwgcmF3RmlsZS5leGlzdHMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiUGF0aCBvZiBkZWNvZGVkIGlucHV0IGZpbGU6ICIgKyByYXdGaWxlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBlbGVTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHJhd0ZpbGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAobWltZS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfV0lEVEgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gZm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0hFSUdIVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0LmNvbnRhaW5zS2V5KE1lZGlhRm9ybWF0LktFWV9GUkFNRV9SQVRFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lUmF0ZSA9IGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9GUkFNRV9SQVRFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZnJhbWVSYXRlIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVJhdGUgPSBFTkNPREVfREVGQVVMVF9GUkFNRV9SQVRFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdC5jb250YWluc0tleShNZWRpYUZvcm1hdC5LRVlfQklUX1JBVEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0UmF0ZSA9IGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9CSVRfUkFURSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJpdFJhdGUgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaW1lLmNvbnRhaW5zKCJ2aWRlby8zZ3BwIikgfHwgbWltZS5jb250YWlucygidmlkZW8vbXA0di1lcyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdFJhdGUgPSBFTkNPREVfTUlOX0JJVF9SQVRFOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdFJhdGUgPSBFTkNPREVfREVGQVVMVF9CSVRfUkFURTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0LmNvbnRhaW5zS2V5KE1lZGlhRm9ybWF0LktFWV9QUk9GSUxFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUgPSBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfUFJPRklMRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0LmNvbnRhaW5zS2V5KE1lZGlhRm9ybWF0LktFWV9QUk9GSUxFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsID0gZm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0xFVkVMKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWNvZGVyRm9ybWF0LmNvbnRhaW5zS2V5KE1lZGlhRm9ybWF0LktFWV9DT0xPUl9GT1JNQVQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JGb3JtYXQgPSBkZWNvZGVyRm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0NPTE9SX0ZPUk1BVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlID0gZm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX1NBTVBMRV9SQVRFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzID0gZm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0NIQU5ORUxfQ09VTlQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlY29kZXJGb3JtYXQuY29udGFpbnNLZXkoTWVkaWFGb3JtYXQuS0VZX0JJVF9SQVRFKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdFJhdGUgPSBkZWNvZGVyRm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0JJVF9SQVRFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0UmF0ZSA9IEVOQ09ERV9ERUZBVUxUX0FVRElPX0JJVF9SQVRFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8qU2V0dXAgRW5jb2RlIEZvcm1hdCovCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhRm9ybWF0IGVuY29kZUZvcm1hdDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1pbWUuc3RhcnRzV2l0aCgidmlkZW8vIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZSA9IHdpZHRoICogaGVpZ2h0ICogMyAvIDI7Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQgPSBNZWRpYUZvcm1hdC5jcmVhdGVWaWRlb0Zvcm1hdChtaW1lLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZUZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9GUkFNRV9SQVRFLCBmcmFtZVJhdGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0JJVF9SQVRFLCBiaXRSYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZUZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9QUk9GSUxFLCBwcm9maWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZUZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9MRVZFTCwgbGV2ZWwpOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0lfRlJBTUVfSU5URVJWQUwsIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX01BWF9JTlBVVF9TSVpFLCBmcmFtZVNpemUpOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0NPTE9SX0ZPUk1BVCwgY29sb3JGb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0ID0gTWVkaWFGb3JtYXQuY3JlYXRlQXVkaW9Gb3JtYXQobWltZSwgc2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0JJVF9SQVRFLCBiaXRSYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZSA9IDQwOTY7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgRW5jb2RlciBlbmNvZGVyID0gbmV3IEVuY29kZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgZW5jb2Rlci5zZXR1cEVuY29kZXIoZW5jb2RlT3V0cHV0U3RyZWFtLCBlbGVTdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBlbmNvZGVyLmVuY29kZShjb2RlY05hbWUsIGVuY29kZUZvcm1hdCwgbWltZSwgZnJhbWVSYXRlLCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZSwgYXN5bmNNb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgZW5jb2Rlci5kZUluaXRFbmNvZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY05hbWUgKyAiIGVuY29kZXIgcmV0dXJuZWQgZXJyb3IgIiArIHN0YXR1cyArICIgZm9yICIgKyAiZmlsZToiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIiArIG1JbnB1dEZpbGUsIDAsIHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgIGVuY29kZXIuZHVtcFN0YXRpc3RpY3MobUlucHV0RmlsZSwgY29kZWNOYW1lLCAoYXN5bmNNb2RlID8gImFzeW5jIiA6ICJzeW5jIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdG9yLmdldENsaXBEdXJhdGlvbigpLCBtU3RhdHNGaWxlKTsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiRW5jb2RpbmcgY29tcGxldGUgZm9yIGZpbGU6ICIgKyBtSW5wdXRGaWxlICsgIiB3aXRoIGNvZGVjOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY05hbWUgKyAiIGZvciBhU3luY01vZGUgPSAiICsgYXN5bmNNb2RlKTsKLSAgICAgICAgICAgICAgICAgICAgZW5jb2Rlci5yZXNldEVuY29kZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgZWxlU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlbmNvZGVPdXRwdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlT3V0cHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vQ2xlYW51cCB0ZW1wb3JhcnkgaW5wdXQgZmlsZQotICAgICAgICAgICAgaWYgKGRlY29kZWRGaWxlLmV4aXN0cygpKSB7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiIFVuYWJsZSB0byBkZWxldGUgZGVjb2RlZCBmaWxlIiArIGRlY29kZWRGaWxlLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkRmlsZS5kZWxldGUoKSk7Ci0gICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiU3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgZGVjb2RlZCBmaWxlIik7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZXh0cmFjdG9yLmRlaW5pdEV4dHJhY3RvcigpOwogICAgICAgICBmaWxlSW5wdXQuY2xvc2UoKTsKKyAgICAgICAgZGVjb2RlT3V0cHV0U3RyZWFtLmNsb3NlKCk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCiAgICAgQFRlc3QodGltZW91dCA9IFBFUl9URVNUX1RJTUVPVVRfTVMpCi0gICAgcHVibGljIHZvaWQgdGVzdE5hdGl2ZUVuY29kZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmlsZSBpbnB1dEZpbGUgPSBuZXcgRmlsZShtSW5wdXRGaWxlUGF0aCArIG1JbnB1dEZpbGUpOwotICAgICAgICBhc3NlcnRUcnVlKCJDYW5ub3QgZmluZCAiICsgbUlucHV0RmlsZSArICIgaW4gZGlyZWN0b3J5ICIgKyBtSW5wdXRGaWxlUGF0aCwKLSAgICAgICAgICAgICAgICBpbnB1dEZpbGUuZXhpc3RzKCkpOwotICAgICAgICBpbnQgdGlkID0gYW5kcm9pZC5vcy5Qcm9jZXNzLm15VGlkKCk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBtRGVjb2RlZEZpbGUgPSBtQ29udGV4dC5nZXRGaWxlc0RpcigpICsgIi9kZWNvZGVyXyIgKyB0aWQgKyAiLm91dCI7Ci0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaWxlSW5wdXQgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGlucHV0RmlsZSk7Ci0gICAgICAgIEZpbGVEZXNjcmlwdG9yIGZpbGVEZXNjcmlwdG9yID0gZmlsZUlucHV0LmdldEZEKCk7Ci0gICAgICAgIEV4dHJhY3RvciBleHRyYWN0b3IgPSBuZXcgRXh0cmFjdG9yKCk7Ci0gICAgICAgIGludCB0cmFja0NvdW50ID0gZXh0cmFjdG9yLnNldFVwRXh0cmFjdG9yKGZpbGVEZXNjcmlwdG9yKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZSgiRXh0cmFjdGlvbiBmYWlsZWQuIE5vIHRyYWNrcyBmb3IgZmlsZTogIiwgdHJhY2tDb3VudCA+IDApOwotICAgICAgICBmb3IgKGludCBjdXJyZW50VHJhY2sgPSAwOyBjdXJyZW50VHJhY2sgPCB0cmFja0NvdW50OyBjdXJyZW50VHJhY2srKykgewotICAgICAgICAgICAgZXh0cmFjdG9yLnNlbGVjdEV4dHJhY3RvclRyYWNrKGN1cnJlbnRUcmFjayk7Ci0gICAgICAgICAgICBNZWRpYUZvcm1hdCBmb3JtYXQgPSBleHRyYWN0b3IuZ2V0Rm9ybWF0KGN1cnJlbnRUcmFjayk7Ci0gICAgICAgICAgICBTdHJpbmcgbWltZSA9IGZvcm1hdC5nZXRTdHJpbmcoTWVkaWFGb3JtYXQuS0VZX01JTUUpOwotICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gbWVkaWFDb2RlY3MgPSBDb2RlY1V0aWxzLnNlbGVjdENvZGVjcyhtaW1lLCB0cnVlKTsKLSAgICAgICAgICAgIC8vIEVuY29kaW5nIHRoZSBkZWNvZGVyJ3Mgb3V0cHV0CisgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IHN0YXR1czsKKyAgICAgICAgaW50IGZyYW1lU2l6ZTsKKworICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBtZWRpYUNvZGVjcyA9IENvZGVjVXRpbHMuc2VsZWN0Q29kZWNzKG1NaW1lLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTm8gc3VpdGFibGUgY29kZWNzIGZvdW5kIGZvciBtaW1ldHlwZTogIiArIG1NaW1lLCAobWVkaWFDb2RlY3Muc2l6ZSgpID4gMCkpOworICAgICAgICBCb29sZWFuW10gZW5jb2RlTW9kZSA9IHt0cnVlLCBmYWxzZX07CisgICAgICAgIC8vIEVuY29kaW5nIHRoZSBkZWNvZGVkIGlucHV0IGZpbGUKKyAgICAgICAgZm9yIChCb29sZWFuIGFzeW5jTW9kZSA6IGVuY29kZU1vZGUpIHsKICAgICAgICAgICAgIGZvciAoU3RyaW5nIGNvZGVjTmFtZSA6IG1lZGlhQ29kZWNzKSB7Ci0gICAgICAgICAgICAgICAgTmF0aXZlIG5hdGl2ZUVuY29kZXIgPSBuZXcgTmF0aXZlKCk7Ci0gICAgICAgICAgICAgICAgaW50IHN0YXR1cyA9IG5hdGl2ZUVuY29kZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIC5FbmNvZGUobUlucHV0RmlsZVBhdGgsIG1JbnB1dEZpbGUsIG1EZWNvZGVkRmlsZSwgbVN0YXRzRmlsZSwgY29kZWNOYW1lKTsKKyAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGVuY29kZU91dHB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKFdSSVRFX09VVFBVVCkgeworICAgICAgICAgICAgICAgICAgICBGaWxlIG91dEVuY29kZUZpbGUgPSBuZXcgRmlsZShtT3V0cHV0RmlsZVBhdGggKyAiZW5jb2Rlci5vdXQiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dEVuY29kZUZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIiBVbmFibGUgdG8gZGVsZXRlIGV4aXN0aW5nIGZpbGUiICsgb3V0RW5jb2RlRmlsZS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRFbmNvZGVGaWxlLmRlbGV0ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJVbmFibGUgdG8gY3JlYXRlIGZpbGUgdG8gd3JpdGUgZW5jb2RlciBvdXRwdXQ6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEVuY29kZUZpbGUudG9TdHJpbmcoKSwgb3V0RW5jb2RlRmlsZS5jcmVhdGVOZXdGaWxlKCkpOworICAgICAgICAgICAgICAgICAgICBlbmNvZGVPdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRFbmNvZGVGaWxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRmlsZSByYXdGaWxlID0gbmV3IEZpbGUobUZpbGVEaXJQYXRoICsgbUlucHV0RmlsZSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2Fubm90IG9wZW4gZGVjb2RlZCBpbnB1dCBmaWxlIiwgcmF3RmlsZS5leGlzdHMoKSk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIlBhdGggb2YgZGVjb2RlZCBpbnB1dCBmaWxlOiAiICsgcmF3RmlsZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGVsZVN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocmF3RmlsZSk7CisgICAgICAgICAgICAgICAgLy8gU2V0dXAgRW5jb2RlIEZvcm1hdAorICAgICAgICAgICAgICAgIE1lZGlhRm9ybWF0IGVuY29kZUZvcm1hdDsKKyAgICAgICAgICAgICAgICBpZiAobU1pbWUuc3RhcnRzV2l0aCgidmlkZW8vIikpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplID0gbVdpZHRoICogbUhlaWdodCAqIDMgLyAyOworICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQgPSBNZWRpYUZvcm1hdC5jcmVhdGVWaWRlb0Zvcm1hdChtTWltZSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0ZSQU1FX1JBVEUsIEVOQ09ERV9ERUZBVUxUX0ZSQU1FX1JBVEUpOworICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfSV9GUkFNRV9JTlRFUlZBTCwgbUlGcmFtZUludGVydmFsKTsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0JJVF9SQVRFLCBtQml0UmF0ZSk7CisgICAgICAgICAgICAgICAgICAgIGVuY29kZUZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9DT0xPUl9GT1JNQVQsIG1Db2xvckZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtUHJvZmlsZSAhPSAtMSAmJiBtTGV2ZWwgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZUZvcm1hdC5zZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9QUk9GSUxFLCBtUHJvZmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfTEVWRUwsIG1MZXZlbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmcmFtZVNpemUgPSA0MDk2OworICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQgPSBNZWRpYUZvcm1hdC5jcmVhdGVBdWRpb0Zvcm1hdChtTWltZSwgbVNhbXBsZVJhdGUsIG1OdW1DaGFubmVsKTsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0JJVF9SQVRFLCBtQml0UmF0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEVuY29kZXIgZW5jb2RlciA9IG5ldyBFbmNvZGVyKCk7CisgICAgICAgICAgICAgICAgZW5jb2Rlci5zZXR1cEVuY29kZXIoZW5jb2RlT3V0cHV0U3RyZWFtLCBlbGVTdHJlYW0pOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IGVuY29kZXIuZW5jb2RlKGNvZGVjTmFtZSwgZW5jb2RlRm9ybWF0LCBtTWltZSwgRU5DT0RFX0RFRkFVTFRfRlJBTUVfUkFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBmcmFtZVNpemUsIGFzeW5jTW9kZSk7CisgICAgICAgICAgICAgICAgZW5jb2Rlci5kZUluaXRFbmNvZGVyKCk7CiAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNOYW1lICsgIiBlbmNvZGVyIHJldHVybmVkIGVycm9yICIgKyBzdGF0dXMgKyAiIGZvciAiICsgImZpbGU6IiArICIgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEZpbGUsIDAsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY05hbWUgKyAiIGVuY29kZXIgcmV0dXJuZWQgZXJyb3IgIiArIHN0YXR1cyArICIgZm9yICIgKyAibWltZToiICsgIiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1pbWUsIDAsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGlucHV0UmVmZXJlbmNlOworICAgICAgICAgICAgICAgIGxvbmcgZHVyYXRpb25VczsKKyAgICAgICAgICAgICAgICBpZiAobU1pbWUuc3RhcnRzV2l0aCgidmlkZW8vIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRSZWZlcmVuY2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEZpbGUgKyAiXyIgKyBtV2lkdGggKyAieCIgKyBtSGVpZ2h0ICsgIl8iICsgbUJpdFJhdGUgKyAiYnBzIjsKKyAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25VcyA9ICgoKGVsZVN0cmVhbS5nZXRDaGFubmVsKCkuc2l6ZSgpICsgZnJhbWVTaXplIC0gMSkgLyBmcmFtZVNpemUpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTkNPREVfREVGQVVMVF9GUkFNRV9SQVRFKSAqIDEwMDAwMDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRSZWZlcmVuY2UgPSBtSW5wdXRGaWxlICsgIl8iICsgbVNhbXBsZVJhdGUgKyAiaHpfIiArIG1OdW1DaGFubmVsICsgImNoXyIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CaXRSYXRlICsgImJwcyI7CisgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uVXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbGVTdHJlYW0uZ2V0Q2hhbm5lbCgpLnNpemUoKSAvIChtU2FtcGxlUmF0ZSAqIG1OdW1DaGFubmVsKSkgKiAxMDAwMDAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbmNvZGVyLmR1bXBTdGF0aXN0aWNzKGlucHV0UmVmZXJlbmNlLCBjb2RlY05hbWUsIChhc3luY01vZGUgPyAiYXN5bmMiIDogInN5bmMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uVXMsIG1TdGF0c0ZpbGUpOworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkVuY29kaW5nIGNvbXBsZXRlIGZvciBtaW1lOiAiICsgbU1pbWUgKyAiIHdpdGggY29kZWM6ICIgKyBjb2RlY05hbWUgKworICAgICAgICAgICAgICAgICAgICAgICAgIiBmb3IgYVN5bmNNb2RlID0gIiArIGFzeW5jTW9kZSk7CisgICAgICAgICAgICAgICAgZW5jb2Rlci5yZXNldEVuY29kZXIoKTsKKyAgICAgICAgICAgICAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5jb2RlT3V0cHV0U3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlT3V0cHV0U3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIEZpbGUgZGVjb2RlZEZpbGUgPSBuZXcgRmlsZShtRGVjb2RlZEZpbGUpOwotICAgICAgICAvLyBDbGVhbnVwIHRlbXBvcmFyeSBpbnB1dCBmaWxlCi0gICAgICAgIGlmIChkZWNvZGVkRmlsZS5leGlzdHMoKSkgewotICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVW5hYmxlIHRvIGRlbGV0ZSAtICIgKyBtRGVjb2RlZEZpbGUsIGRlY29kZWRGaWxlLmRlbGV0ZSgpKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIlN1Y2Nlc3NmdWxseSBkZWxldGVkIC0gIiArIG1EZWNvZGVkRmlsZSk7CisgICAgfQorCisgICAgQFRlc3QodGltZW91dCA9IFBFUl9URVNUX1RJTUVPVVRfTVMpCisgICAgcHVibGljIHZvaWQgdGVzdE5hdGl2ZUVuY29kZXIoKSB7CisgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IG1lZGlhQ29kZWNzID0gQ29kZWNVdGlscy5zZWxlY3RDb2RlY3MobU1pbWUsIHRydWUpOworICAgICAgICBhc3NlcnRUcnVlKCJObyBzdWl0YWJsZSBjb2RlY3MgZm91bmQgZm9yIG1pbWV0eXBlOiAiICsgbU1pbWUsIChtZWRpYUNvZGVjcy5zaXplKCkgPiAwKSk7CisgICAgICAgIGZvciAoU3RyaW5nIGNvZGVjTmFtZSA6IG1lZGlhQ29kZWNzKSB7CisgICAgICAgICAgICBOYXRpdmUgbmF0aXZlRW5jb2RlciA9IG5ldyBOYXRpdmUoKTsKKyAgICAgICAgICAgIGludCBzdGF0dXMgPSBuYXRpdmVFbmNvZGVyCisgICAgICAgICAgICAgICAgICAgIC5FbmNvZGUobUZpbGVEaXJQYXRoLCBtSW5wdXRGaWxlLCBtU3RhdHNGaWxlLCBjb2RlY05hbWUsIG1NaW1lLCBtQml0UmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29sb3JGb3JtYXQsIG1JRnJhbWVJbnRlcnZhbCwgbVdpZHRoLCBtSGVpZ2h0LCBtUHJvZmlsZSwgbUxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBtTnVtQ2hhbm5lbCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29kZWNOYW1lICsgIiBlbmNvZGVyIHJldHVybmVkIGVycm9yICIgKyBzdGF0dXMgKyAiIGZvciAiICsgIm1pbWU6IiArICIgIiArCisgICAgICAgICAgICAgICAgICAgIG1NaW1lLCAwLCBzdGF0dXMpOwogICAgICAgICB9Ci0gICAgICAgIGZpbGVJbnB1dC5jbG9zZSgpOworICAgIH0KKworICAgIEBBZnRlckNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGRlbGV0ZURlY29kZWRGaWxlcygpIHsKKyAgICAgICAgaWYgKG1EZWNvZGVkRmlsZUZ1bGxIZC5leGlzdHMoKSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiIFVuYWJsZSB0byBkZWxldGUgZGVjb2RlZCBmaWxlIiArIG1EZWNvZGVkRmlsZUZ1bGxIZC50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICBtRGVjb2RlZEZpbGVGdWxsSGQuZGVsZXRlKCkpOworICAgICAgICAgICAgTG9nLmkoVEFHLCAiU3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgZGVjb2RlZCBmaWxlIiArIG1EZWNvZGVkRmlsZUZ1bGxIZC50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobURlY29kZWRGaWxlUWNpZi5leGlzdHMoKSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiIFVuYWJsZSB0byBkZWxldGUgZGVjb2RlZCBmaWxlIiArIG1EZWNvZGVkRmlsZVFjaWYudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgbURlY29kZWRGaWxlUWNpZi5kZWxldGUoKSk7CisgICAgICAgICAgICBMb2cuaShUQUcsICJTdWNjZXNzZnVsbHkgZGVsZXRlZCBkZWNvZGVkIGZpbGUiICsgbURlY29kZWRGaWxlUWNpZi50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobURlY29kZWRGaWxlQXVkaW8uZXhpc3RzKCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIiBVbmFibGUgdG8gZGVsZXRlIGRlY29kZWQgZmlsZSIgKyBtRGVjb2RlZEZpbGVBdWRpby50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICBtRGVjb2RlZEZpbGVBdWRpby5kZWxldGUoKSk7CisgICAgICAgICAgICBMb2cuaShUQUcsICJTdWNjZXNzZnVsbHkgZGVsZXRlZCBkZWNvZGVkIGZpbGUiICsgbURlY29kZWRGaWxlQXVkaW8udG9TdHJpbmcoKSk7CisgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2NwcC9OYXRpdmVFbmNvZGVyLmNwcCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vY3BwL05hdGl2ZUVuY29kZXIuY3BwCmluZGV4IDEyNzdjOGIuLjJmNjU4ZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vY3BwL05hdGl2ZUVuY29kZXIuY3BwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vY3BwL05hdGl2ZUVuY29kZXIuY3BwCkBAIC0zMCwxODkgKzMwLDgxIEBACiAjaW5jbHVkZSA8c3RkaW8uaD4KIAogY29uc3RleHByIGludDMyX3QgRU5DT0RFX0RFRkFVTFRfRlJBTUVfUkFURSA9IDI1OwotY29uc3RleHByIGludDMyX3QgRU5DT0RFX0RFRkFVTFRfQVVESU9fQklUX1JBVEUgPSAxMjgwMDAgLyogMTI4IEticHMgKi87Ci1jb25zdGV4cHIgaW50MzJfdCBFTkNPREVfREVGQVVMVF9CSVRfUkFURSA9IDgwMDAwMDAgLyogOCBNYnBzICovOwotY29uc3RleHByIGludDMyX3QgRU5DT0RFX01JTl9CSVRfUkFURSA9IDYwMDAwMCAvKiA2MDAgS2JwcyAqLzsKIAogZXh0ZXJuICJDIiBKTklFWFBPUlQgaW50IEpOSUNBTEwgSmF2YV9jb21fYW5kcm9pZF9tZWRpYV9iZW5jaG1hcmtfbGlicmFyeV9OYXRpdmVfRW5jb2RlKAotICAgICAgICBKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqc3RyaW5nIGpGaWxlUGF0aCwganN0cmluZyBqRmlsZU5hbWUsIGpzdHJpbmcgak91dEZpbGVQYXRoLAotICAgICAgICBqc3RyaW5nIGpTdGF0c0ZpbGUsIGpzdHJpbmcgakNvZGVjTmFtZSkgeworICAgICAgICBKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqc3RyaW5nIGpGaWxlUGF0aCwganN0cmluZyBqRmlsZU5hbWUsIGpzdHJpbmcgalN0YXRzRmlsZSwKKyAgICAgICAganN0cmluZyBqQ29kZWNOYW1lLCBqc3RyaW5nIGpNaW1lLCBqaW50IGpCaXRSYXRlLCBqaW50IGpDb2xvckZvcm1hdCwgamludCBqRnJhbWVJbnRlcnZhbCwKKyAgICAgICAgamludCBqV2lkdGgsIGppbnQgakhlaWdodCwgamludCBqUHJvZmlsZSwgamludCBqTGV2ZWwsIGppbnQgalNhbXBsZVJhdGUsCisgICAgICAgIGppbnQgak51bUNoYW5uZWxzKSB7CisgICAgVU5VU0VEKHRoaXopOwogICAgIGNvbnN0IGNoYXIgKmZpbGVQYXRoID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhqRmlsZVBhdGgsIG51bGxwdHIpOwogICAgIGNvbnN0IGNoYXIgKmZpbGVOYW1lID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhqRmlsZU5hbWUsIG51bGxwdHIpOwotICAgIHN0cmluZyBzRmlsZVBhdGggPSBzdHJpbmcoZmlsZVBhdGgpICsgc3RyaW5nKGZpbGVOYW1lKTsKLSAgICBVTlVTRUQodGhpeik7Ci0gICAgRklMRSAqaW5wdXRGcCA9IGZvcGVuKHNGaWxlUGF0aC5jX3N0cigpLCAicmIiKTsKLSAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqRmlsZU5hbWUsIGZpbGVOYW1lKTsKLSAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqRmlsZVBhdGgsIGZpbGVQYXRoKTsKLSAgICBpZiAoIWlucHV0RnApIHsKLSAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBvcGVuIGlucHV0IGZpbGUgZm9yIHJlYWRpbmciKTsKKyAgICBzdHJpbmcgaW5wdXRGaWxlID0gc3RyaW5nKGZpbGVQYXRoKSArIHN0cmluZyhmaWxlTmFtZSk7CisgICAgY29uc3QgY2hhciAqY29kZWNOYW1lID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhqQ29kZWNOYW1lLCBudWxscHRyKTsKKyAgICBzdHJpbmcgc0NvZGVjTmFtZSA9IHN0cmluZyhjb2RlY05hbWUpOworICAgIGNvbnN0IGNoYXIgKm1pbWUgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGpNaW1lLCBudWxscHRyKTsKKworICAgIGlmc3RyZWFtIGVsZVN0cmVhbTsKKyAgICBlbGVTdHJlYW0ub3BlbihpbnB1dEZpbGUsIGlmc3RyZWFtOjpiaW5hcnkgfCBpZnN0cmVhbTo6YXRlKTsKKyAgICBpZiAoIWVsZVN0cmVhbS5pc19vcGVuKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzIC0gRmlsZSBmYWlsZWQgdG8gb3BlbiBmb3IgcmVhZGluZyEiLCBmaWxlTmFtZSk7CisgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGpGaWxlTmFtZSwgZmlsZU5hbWUpOwogICAgICAgICByZXR1cm4gLTE7CiAgICAgfQogCi0gICAgRGVjb2RlciAqZGVjb2RlciA9IG5ldyBEZWNvZGVyKCk7Ci0gICAgRXh0cmFjdG9yICpleHRyYWN0b3IgPSBkZWNvZGVyLT5nZXRFeHRyYWN0b3IoKTsKLSAgICBpZiAoIWV4dHJhY3RvcikgewotICAgICAgICBBTE9HRSgiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQorICAgIGJvb2wgYXN5bmNNb2RlWzJdID0ge3RydWUsIGZhbHNlfTsKKyAgICBmb3IgKGJvb2wgbW9kZSA6IGFzeW5jTW9kZSkgeworICAgICAgICBzaXplX3QgZWxlU2l6ZSA9IGVsZVN0cmVhbS50ZWxsZygpOworICAgICAgICBlbGVTdHJlYW0uc2Vla2coMCwgaWZzdHJlYW06OmJlZyk7CiAKLSAgICAvLyBSZWFkIGZpbGUgcHJvcGVydGllcwotICAgIHN0cnVjdCBzdGF0IGJ1ZjsKLSAgICBzdGF0KHNGaWxlUGF0aC5jX3N0cigpLCAmYnVmKTsKLSAgICBzaXplX3QgZmlsZVNpemUgPSBidWYuc3Rfc2l6ZTsKLSAgICBpZiAoZmlsZVNpemUgPiBrTWF4QnVmZmVyU2l6ZSkgewotICAgICAgICBBTE9HRSgiRmlsZSBzaXplIGdyZWF0ZXIgdGhhbiBtYXhpbXVtIGJ1ZmZlciBzaXplIik7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgaW50MzJfdCBmZCA9IGZpbGVubyhpbnB1dEZwKTsKLSAgICBpbnQzMl90IHRyYWNrQ291bnQgPSBleHRyYWN0b3ItPmluaXRFeHRyYWN0b3IoZmQsIGZpbGVTaXplKTsKLSAgICBpZiAodHJhY2tDb3VudCA8PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJpbml0RXh0cmFjdG9yIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQorICAgICAgICAvLyBTZXQgZW5jb2RlciBwYXJhbXMKKyAgICAgICAgZW5jUGFyYW1ldGVyIGVuY1BhcmFtczsKKyAgICAgICAgZW5jUGFyYW1zLndpZHRoID0galdpZHRoOworICAgICAgICBlbmNQYXJhbXMuaGVpZ2h0ID0gakhlaWdodDsKKyAgICAgICAgZW5jUGFyYW1zLmJpdHJhdGUgPSBqQml0UmF0ZTsKKyAgICAgICAgZW5jUGFyYW1zLmlGcmFtZUludGVydmFsID0gakZyYW1lSW50ZXJ2YWw7CisgICAgICAgIGVuY1BhcmFtcy5zYW1wbGVSYXRlID0galNhbXBsZVJhdGU7CisgICAgICAgIGVuY1BhcmFtcy5udW1DaGFubmVscyA9IGpOdW1DaGFubmVsczsKKyAgICAgICAgZW5jUGFyYW1zLmZyYW1lUmF0ZSA9IEVOQ09ERV9ERUZBVUxUX0ZSQU1FX1JBVEU7CisgICAgICAgIGVuY1BhcmFtcy5jb2xvckZvcm1hdCA9IGpDb2xvckZvcm1hdDsKKyAgICAgICAgZW5jUGFyYW1zLnByb2ZpbGUgPSBqUHJvZmlsZTsKKyAgICAgICAgZW5jUGFyYW1zLmxldmVsID0gakxldmVsOwogCi0gICAgZm9yIChpbnQgY3VyVHJhY2sgPSAwOyBjdXJUcmFjayA8IHRyYWNrQ291bnQ7IGN1clRyYWNrKyspIHsKLSAgICAgICAgaW50MzJfdCBzdGF0dXMgPSBleHRyYWN0b3ItPnNldHVwVHJhY2tGb3JtYXQoY3VyVHJhY2spOwotICAgICAgICBpZiAoc3RhdHVzICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJUcmFjayBGb3JtYXQgaW52YWxpZCIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQ4X3QgKmlucHV0QnVmZmVyID0gKHVpbnQ4X3QgKiltYWxsb2MoZmlsZVNpemUpOwotICAgICAgICBpZiAoIWlucHV0QnVmZmVyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiSW5zdWZmaWNpZW50IG1lbW9yeSIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIHZlY3RvcjxBTWVkaWFDb2RlY0J1ZmZlckluZm8+IGZyYW1lSW5mbzsKLSAgICAgICAgQU1lZGlhQ29kZWNCdWZmZXJJbmZvIGluZm87Ci0gICAgICAgIHVpbnQzMl90IGlucHV0QnVmZmVyT2Zmc2V0ID0gMDsKLQotICAgICAgICAvLyBHZXQgZnJhbWUgZGF0YQotICAgICAgICB3aGlsZSAoMSkgewotICAgICAgICAgICAgc3RhdHVzID0gZXh0cmFjdG9yLT5nZXRGcmFtZVNhbXBsZShpbmZvKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgfHwgIWluZm8uc2l6ZSkgYnJlYWs7Ci0gICAgICAgICAgICAvLyBjb3B5IHRoZSBtZXRhIGRhdGEgYW5kIGJ1ZmZlciB0byBiZSBwYXNzZWQgdG8gZGVjb2RlcgotICAgICAgICAgICAgaWYgKGlucHV0QnVmZmVyT2Zmc2V0ICsgaW5mby5zaXplID4ga01heEJ1ZmZlclNpemUpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiTWVtb3J5IGFsbG9jYXRlZCBub3Qgc3VmZmljaWVudCIpOwotICAgICAgICAgICAgICAgIGZyZWUoaW5wdXRCdWZmZXIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1lbWNweShpbnB1dEJ1ZmZlciArIGlucHV0QnVmZmVyT2Zmc2V0LCBleHRyYWN0b3ItPmdldEZyYW1lQnVmKCksIGluZm8uc2l6ZSk7Ci0gICAgICAgICAgICBmcmFtZUluZm8ucHVzaF9iYWNrKGluZm8pOwotICAgICAgICAgICAgaW5wdXRCdWZmZXJPZmZzZXQgKz0gaW5mby5zaXplOwotICAgICAgICB9Ci0gICAgICAgIHN0cmluZyBkZWNOYW1lID0gIiI7Ci0gICAgICAgIGNvbnN0IGNoYXIgKm91dHB1dEZpbGVQYXRoID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhqT3V0RmlsZVBhdGgsIG51bGxwdHIpOwotICAgICAgICBGSUxFICpvdXRGcCA9IGZvcGVuKG91dHB1dEZpbGVQYXRoLCAid2IiKTsKLSAgICAgICAgaWYgKG91dEZwID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlcyAtIEZpbGUgZmFpbGVkIHRvIG9wZW4gZm9yIHdyaXRpbmchIiwgb3V0cHV0RmlsZVBhdGgpOwotICAgICAgICAgICAgZnJlZShpbnB1dEJ1ZmZlcik7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgZGVjb2Rlci0+c2V0dXBEZWNvZGVyKCk7Ci0gICAgICAgIHN0YXR1cyA9IGRlY29kZXItPmRlY29kZShpbnB1dEJ1ZmZlciwgZnJhbWVJbmZvLCBkZWNOYW1lLCBmYWxzZSAvKmFzeW5jTW9kZSAqLywgb3V0RnApOworICAgICAgICBFbmNvZGVyICplbmNvZGVyID0gbmV3IEVuY29kZXIoKTsKKyAgICAgICAgZW5jb2Rlci0+c2V0dXBFbmNvZGVyKCk7CisgICAgICAgIGF1dG8gc3RhdHVzID0gZW5jb2Rlci0+ZW5jb2RlKHNDb2RlY05hbWUsIGVsZVN0cmVhbSwgZWxlU2l6ZSwgbW9kZSwgZW5jUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIgKj4obWltZSkpOwogICAgICAgICBpZiAoc3RhdHVzICE9IEFNRURJQV9PSykgewotICAgICAgICAgICAgQUxPR0UoIkRlY29kZSByZXR1cm5lZCBlcnJvciIpOwotICAgICAgICAgICAgZnJlZShpbnB1dEJ1ZmZlcik7CisgICAgICAgICAgICBBTE9HRSgiRW5jb2RlciByZXR1cm5lZCBlcnJvciIpOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9Ci0KLSAgICAgICAgQU1lZGlhRm9ybWF0ICpkZWNvZGVyRm9ybWF0ID0gZGVjb2Rlci0+Z2V0Rm9ybWF0KCk7Ci0gICAgICAgIEFNZWRpYUZvcm1hdCAqZm9ybWF0ID0gZXh0cmFjdG9yLT5nZXRGb3JtYXQoKTsKLSAgICAgICAgaWYgKGlucHV0QnVmZmVyKSB7Ci0gICAgICAgICAgICBmcmVlKGlucHV0QnVmZmVyKTsKLSAgICAgICAgICAgIGlucHV0QnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgQUxPR1YoIkVuY29kaW5nIGNvbXBsZXRlIHdpdGggY29kZWMgJXMgZm9yIGFzeW5jTW9kZSA9ICVkIiwgc0NvZGVjTmFtZS5jX3N0cigpLCBtb2RlKTsKKyAgICAgICAgZW5jb2Rlci0+ZGVJbml0Q29kZWMoKTsKKyAgICAgICAgY29uc3QgY2hhciAqc3RhdHNGaWxlID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhqU3RhdHNGaWxlLCBudWxscHRyKTsKKyAgICAgICAgc3RyaW5nIGlucHV0UmVmZXJlbmNlOworICAgICAgICBpbnQ2NF90IGNsaXBEdXJhdGlvblVzOworICAgICAgICBpZiAoIXN0cm5jbXAobWltZSwgInZpZGVvLyIsIDYpKSB7CisgICAgICAgICAgICBpbnB1dFJlZmVyZW5jZSA9IHN0cmluZyhmaWxlTmFtZSkgKyAiXyIgKyB0b19zdHJpbmcoaldpZHRoKSArICJ4IiArIHRvX3N0cmluZyhqSGVpZ2h0KSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfIiArIHRvX3N0cmluZyhqQml0UmF0ZSkgKyAiYnBzIjsKKyAgICAgICAgICAgIGludDMyX3QgZnJhbWVTaXplID0galdpZHRoICogakhlaWdodCAqIDMgLyAyOworICAgICAgICAgICAgY2xpcER1cmF0aW9uVXMgPQorICAgICAgICAgICAgICAgICAgICAoKChlbGVTaXplICsgZnJhbWVTaXplIC0gMSkgLyBmcmFtZVNpemUpIC8gRU5DT0RFX0RFRkFVTFRfRlJBTUVfUkFURSkgKiAxMDAwMDAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW5wdXRSZWZlcmVuY2UgPSBzdHJpbmcoZmlsZU5hbWUpICsgIl8iICsgdG9fc3RyaW5nKGpTYW1wbGVSYXRlKSArICJoel8iICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9fc3RyaW5nKGpOdW1DaGFubmVscykgKyAiY2hfIiArIHRvX3N0cmluZyhqQml0UmF0ZSkgKyAiYnBzIjsKKyAgICAgICAgICAgIGNsaXBEdXJhdGlvblVzID0gKGVsZVNpemUgLyAoalNhbXBsZVJhdGUgKiBqTnVtQ2hhbm5lbHMpKSAqIDEwMDAwMDA7CiAgICAgICAgIH0KLSAgICAgICAgY29uc3QgY2hhciAqbWltZSA9IG51bGxwdHI7Ci0gICAgICAgIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKTsKLSAgICAgICAgaWYgKCFtaW1lKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRXJyb3IgaW4gQU1lZGlhRm9ybWF0X2dldFN0cmluZyIpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmc3RyZWFtIGVsZVN0cmVhbTsKLSAgICAgICAgZWxlU3RyZWFtLm9wZW4ob3V0cHV0RmlsZVBhdGgsIGlmc3RyZWFtOjpiaW5hcnkgfCBpZnN0cmVhbTo6YXRlKTsKLSAgICAgICAgaWYgKCFlbGVTdHJlYW0uaXNfb3BlbigpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXMgLSBGaWxlIGZhaWxlZCB0byBvcGVuIGZvciByZWFkaW5nISIsIG91dHB1dEZpbGVQYXRoKTsKLSAgICAgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGpPdXRGaWxlUGF0aCwgb3V0cHV0RmlsZVBhdGgpOwotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IGNoYXIgKmNvZGVjTmFtZSA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoakNvZGVjTmFtZSwgTlVMTCk7Ci0gICAgICAgIGNvbnN0IGNoYXIgKmlucHV0UmVmZXJlbmNlID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhqRmlsZU5hbWUsIG51bGxwdHIpOwotICAgICAgICBzdHJpbmcgc0NvZGVjTmFtZSA9IHN0cmluZyhjb2RlY05hbWUpOwotICAgICAgICBzdHJpbmcgc0lucHV0UmVmZXJlbmNlID0gc3RyaW5nKGlucHV0UmVmZXJlbmNlKTsKLQotICAgICAgICBib29sIGFzeW5jTW9kZVsyXSA9IHt0cnVlLCBmYWxzZX07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0gICAgICAgICAgICBzaXplX3QgZWxlU2l6ZSA9IGVsZVN0cmVhbS50ZWxsZygpOwotICAgICAgICAgICAgZWxlU3RyZWFtLnNlZWtnKDAsIGlmc3RyZWFtOjpiZWcpOwotCi0gICAgICAgICAgICAvLyBHZXQgZW5jb2RlciBwYXJhbXMKLSAgICAgICAgICAgIGVuY1BhcmFtZXRlciBlbmNQYXJhbXM7Ci0gICAgICAgICAgICBpZiAoIXN0cm5jbXAobWltZSwgInZpZGVvLyIsIDYpKSB7Ci0gICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgJmVuY1BhcmFtcy53aWR0aCk7Ci0gICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsICZlbmNQYXJhbXMuaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX1JBVEUsICZlbmNQYXJhbXMuZnJhbWVSYXRlKTsKLSAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFLCAmZW5jUGFyYW1zLmJpdHJhdGUpOwotICAgICAgICAgICAgICAgIGlmIChlbmNQYXJhbXMuYml0cmF0ZSA8PSAwIHx8IGVuY1BhcmFtcy5mcmFtZVJhdGUgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICBlbmNQYXJhbXMuZnJhbWVSYXRlID0gRU5DT0RFX0RFRkFVTFRfRlJBTUVfUkFURTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAobWltZSwgInZpZGVvLzNncHAiKSB8fCAhc3RyY21wKG1pbWUsICJ2aWRlby9tcDR2LWVzIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY1BhcmFtcy5iaXRyYXRlID0gRU5DT0RFX01JTl9CSVRfUkFURSAvKiA2MDAgS2JwcyAqLzsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuY1BhcmFtcy5iaXRyYXRlID0gRU5DT0RFX0RFRkFVTFRfQklUX1JBVEUgLyogOCBNYnBzICovOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfUFJPRklMRSwgJmVuY1BhcmFtcy5wcm9maWxlKTsKLSAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0xFVkVMLCAmZW5jUGFyYW1zLmxldmVsKTsKLSAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZGVjb2RlckZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9GT1JNQVQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNQYXJhbXMuY29sb3JGb3JtYXQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCAmZW5jUGFyYW1zLnNhbXBsZVJhdGUpOwotICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY1BhcmFtcy5udW1DaGFubmVscyk7Ci0gICAgICAgICAgICAgICAgZW5jUGFyYW1zLmJpdHJhdGUgPSBFTkNPREVfREVGQVVMVF9BVURJT19CSVRfUkFURTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEVuY29kZXIgKmVuY29kZXIgPSBuZXcgRW5jb2RlcigpOwotICAgICAgICAgICAgZW5jb2Rlci0+c2V0dXBFbmNvZGVyKCk7Ci0gICAgICAgICAgICBzdGF0dXMgPSBlbmNvZGVyLT5lbmNvZGUoc0NvZGVjTmFtZSwgZWxlU3RyZWFtLCBlbGVTaXplLCBhc3luY01vZGVbaV0sIGVuY1BhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKW1pbWUpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiRW5jb2RlciByZXR1cm5lZCBlcnJvciIpOwotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJFbmNvZGluZyBjb21wbGV0ZSB3aXRoIGNvZGVjICVzIGZvciBhc3luY01vZGUgPSAlZCIsIHNDb2RlY05hbWUuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgIGFzeW5jTW9kZVtpXSk7Ci0gICAgICAgICAgICBlbmNvZGVyLT5kZUluaXRDb2RlYygpOwotICAgICAgICAgICAgY29uc3QgY2hhciAqc3RhdHNGaWxlID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhqU3RhdHNGaWxlLCBudWxscHRyKTsKLSAgICAgICAgICAgIGVuY29kZXItPmR1bXBTdGF0aXN0aWNzKHNJbnB1dFJlZmVyZW5jZSwgZXh0cmFjdG9yLT5nZXRDbGlwRHVyYXRpb24oKSwgc0NvZGVjTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhc3luY01vZGVbaV0gPyAiYXN5bmMiIDogInN5bmMiKSwgc3RhdHNGaWxlKTsKLSAgICAgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGpTdGF0c0ZpbGUsIHN0YXRzRmlsZSk7Ci0gICAgICAgICAgICBlbmNvZGVyLT5yZXNldEVuY29kZXIoKTsKLSAgICAgICAgICAgIGRlbGV0ZSBlbmNvZGVyOwotICAgICAgICAgICAgZW5jb2RlciA9IG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxlU3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgIGlmIChvdXRGcCkgewotICAgICAgICAgICAgZmNsb3NlKG91dEZwKTsKLSAgICAgICAgICAgIG91dEZwID0gbnVsbHB0cjsKLSAgICAgICAgfQotICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqRmlsZU5hbWUsIGlucHV0UmVmZXJlbmNlKTsKLSAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoakNvZGVjTmFtZSwgY29kZWNOYW1lKTsKLSAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoak91dEZpbGVQYXRoLCBvdXRwdXRGaWxlUGF0aCk7Ci0gICAgICAgIGlmIChmb3JtYXQpIHsKLSAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUoZm9ybWF0KTsKLSAgICAgICAgICAgIGZvcm1hdCA9IG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRlY29kZXJGb3JtYXQpIHsKLSAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUoZGVjb2RlckZvcm1hdCk7Ci0gICAgICAgICAgICBkZWNvZGVyRm9ybWF0ID0gbnVsbHB0cjsKLSAgICAgICAgfQotICAgICAgICBkZWNvZGVyLT5kZUluaXRDb2RlYygpOwotICAgICAgICBkZWNvZGVyLT5yZXNldERlY29kZXIoKTsKKyAgICAgICAgZW5jb2Rlci0+ZHVtcFN0YXRpc3RpY3MoaW5wdXRSZWZlcmVuY2UsIGNsaXBEdXJhdGlvblVzLCBzQ29kZWNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW9kZSA/ICJhc3luYyIgOiAic3luYyIpLCBzdGF0c0ZpbGUpOworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqU3RhdHNGaWxlLCBzdGF0c0ZpbGUpOworICAgICAgICBlbmNvZGVyLT5yZXNldEVuY29kZXIoKTsKKyAgICAgICAgZGVsZXRlIGVuY29kZXI7CisgICAgICAgIGVuY29kZXIgPSBudWxscHRyOwogICAgIH0KLSAgICBpZiAoaW5wdXRGcCkgewotICAgICAgICBmY2xvc2UoaW5wdXRGcCk7Ci0gICAgICAgIGlucHV0RnAgPSBudWxscHRyOwotICAgIH0KLSAgICBleHRyYWN0b3ItPmRlSW5pdEV4dHJhY3RvcigpOwotICAgIGRlbGV0ZSBkZWNvZGVyOworICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGpGaWxlUGF0aCwgZmlsZVBhdGgpOworICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGpGaWxlTmFtZSwgZmlsZU5hbWUpOworICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGpNaW1lLCBtaW1lKTsKKyAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqQ29kZWNOYW1lLCBjb2RlY05hbWUpOwogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL2JlbmNobWFyay9saWJyYXJ5L0VuY29kZXIuamF2YSBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9iZW5jaG1hcmsvbGlicmFyeS9FbmNvZGVyLmphdmEKaW5kZXggNDVlNTU3NC4uNzU0Y2Q4ZSAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL2JlbmNobWFyay9saWJyYXJ5L0VuY29kZXIuamF2YQorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL2xpYnJhcnkvRW5jb2Rlci5qYXZhCkBAIC0xNzUsMTAgKzE3NSwxMCBAQAogCiAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihATm9uTnVsbCBNZWRpYUNvZGVjIG1lZGlhQ29kZWMsIEBOb25OdWxsIENvZGVjRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbWVkaWFDb2RlYy5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1lZGlhQ29kZWMucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDb2RlY0Vycm9yOiAiICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ29kZWMgRXJyb3I6ICIgKyBlLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7IG1Mb2NrLm5vdGlmeSgpOyB9CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL2xpYnJhcnkvTmF0aXZlLmphdmEgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL2xpYnJhcnkvTmF0aXZlLmphdmEKaW5kZXggMzhiNjA4YS4uM2UzOTY5YyAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL2JlbmNobWFyay9saWJyYXJ5L05hdGl2ZS5qYXZhCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9iZW5jaG1hcmsvbGlicmFyeS9OYXRpdmUuamF2YQpAQCAtMjcsNiArMjcsNyBAQAogICAgIHB1YmxpYyBuYXRpdmUgaW50IERlY29kZShTdHJpbmcgaW5wdXRGaWxlUGF0aCwgU3RyaW5nIGlucHV0RmlsZU5hbWUsIFN0cmluZyBzdGF0c0ZpbGUsCiAgICAgICAgICAgICBTdHJpbmcgY29kZWNOYW1lLCBib29sZWFuIGFzeW5jTW9kZSk7CiAKLSAgICBwdWJsaWMgbmF0aXZlIGludCBFbmNvZGUoU3RyaW5nIGlucHV0RmlsZVBhdGgsIFN0cmluZyBpbnB1dEZpbGVOYW1lLCBTdHJpbmcgb3V0cHV0RmlsZVBhdGgsCi0gICAgICAgICAgICBTdHJpbmcgc3RhdHNGaWxlLCBTdHJpbmcgY29kZWNOYW1lKTsKKyAgICBwdWJsaWMgbmF0aXZlIGludCBFbmNvZGUoU3RyaW5nIGlucHV0RmlsZVBhdGgsIFN0cmluZyBpbnB1dEZpbGVOYW1lLCBTdHJpbmcgc3RhdHNGaWxlLAorICAgICAgICAgICAgU3RyaW5nIGNvZGVjTmFtZSwgU3RyaW5nIG1pbWUsIGludCBiaXRSYXRlLCBpbnQgY29sb3JGb3JtYXQsIGludCBmcmFtZUludGVydmFsLAorICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcHJvZmlsZSwgaW50IGxldmVsLCBpbnQgc2FtcGxlUmF0ZSwgaW50IG51bUNoYW5uZWwpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL1JFQURNRS5tZCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9SRUFETUUubWQKaW5kZXggMDVmYmU2Zi4uMDQ3YzI4OSAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL1JFQURNRS5tZAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvUkVBRE1FLm1kCkBAIC0xLDcgKzEsNyBAQAogIyBCZW5jaG1hcmsgdGVzdHMKIAogQmVuY2htYXJrIGFwcCBhbmFseXNlcyB0aGUgdGltZSB0YWtlbiBieSBNZWRpYUNvZGVjLCBNZWRpYUV4dHJhY3RvciBhbmQgTWVkaWFNdXhlciBmb3IgZ2l2ZW4gc2V0IG9mIGlucHV0cy4gSXQgaXMgdXNlZCB0byBiZW5jaG1hcmsgdGhlc2UgbW9kdWxlcyBvbiBhbmRyb2lkIGRldmljZXMuCi1CZW5jaG1hcmsgcmVzdWx0cyBhcmUgZW1pdHRlZCB0byBsb2djYXQuCitCZW5jaG1hcmsgcmVzdWx0cyBhcmUgcHVibGlzaGVkIGFzIGEgQ1NWIHJlcG9ydC4KIAogVGhpcyBwYWdlIGRlc2NyaWJlcyBzdGVwcyB0byBydW4gdGhlIE5ESyBhbmQgU0RLIGxheWVyIHRlc3QuCiAKQEAgLTEwLDM1ICsxMCw0OSBAQAogbW1tIGZyYW1ld29ya3MvYXYvbWVkaWEvdGVzdHMvYmVuY2htYXJrLwogYGBgCiAKLSMgTkRLCi0KLVRvIHJ1biB0aGUgdGVzdCBzdWl0ZSBmb3IgbWVhc3VyaW5nIHBlcmZvcm1hbmNlIG9mIHRoZSBuYXRpdmUgbGF5ZXIsIGZvbGxvdyB0aGUgZm9sbG93aW5nIHN0ZXBzOgotCi1UaGUgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICRPVVQvZGF0YS9uYXRpdmV0ZXN0NjQvCi0KLWFkYiBwdXNoICRPVVQvZGF0YS9uYXRpdmV0ZXN0NjQvKiAvZGF0YS9sb2NhbC90bXAvCi0KLUVnLiBhZGIgcHVzaCAkT1VUL2RhdGEvbmF0aXZldGVzdDY0L2V4dHJhY3RvclRlc3QvZXh0cmFjdG9yVGVzdCAvZGF0YS9sb2NhbC90bXAvCi0KLVRvIHJ1biB0aGUgYmluYXJ5LCBmb2xsb3cgdGhlIGNvbW1hbmRzIG1lbnRpb25lZCBiZWxvdyB1bmRlciBlYWNoIG1vZHVsZS4KLQotVGhlIHJlc291cmNlIGZpbGUgZm9yIHRoZSB0ZXN0cyBpcyB0YWtlbiBmcm9tIFtoZXJlXShodHRwczovL2RyaXZlLmdvb2dsZS5jb20vb3Blbj9pZD0xZ2hNcjE3QkJKN24wcHFibTdvUkVpVE5fTU5lbUpVcXkpCisjIFJlc291cmNlcworVGhlIHJlc291cmNlIGZpbGUgZm9yIHRoZSB0ZXN0cyBpcyB0YWtlbiBmcm9tIFtoZXJlXShodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFyay56aXApCiAKIERvd25sb2FkIHRoZSBNZWRpYUJlbmNobWFyay56aXAgZmlsZSwgdW56aXAgYW5kIHB1c2ggaXQgdG8gL2RhdGEvbG9jYWwvdG1wLyBvbiB0aGUgZGV2aWNlLgogCiBgYGAKIHVuemlwIE1lZGlhQmVuY2htYXJrLnppcAotYWRiIHB1c2ggTWVkaWFCZW5jaG1hcmsgL2RhdGEvbG9jYWwvdG1wCithZGIgcHVzaCBNZWRpYUJlbmNobWFyayAvZGF0YS9sb2NhbC90bXAvTWVkaWFCZW5jaG1hcmsvcmVzLwogYGBgCiAKK1RoZSByZXNvdXJjZSBmaWxlcyBhcmUgYXNzdW1lZCB0byBiZSBhdCAvZGF0YS9sb2NhbC90bXAvTWVkaWFCZW5jaG1hcmsvcmVzLy4gWW91IGNhbiB1c2UgYSBkaWZmZXJlbnQgbG9jYXRpb24sIGJ1dCB5b3UgaGF2ZSB0byBtb2RpZnkgdGhlIHJlc3Qgb2YgdGhlIGluc3RydWN0aW9ucyB0byByZXBsYWNlIC9kYXRhL2xvY2FsL3RtcC9NZWRpYUJlbmNobWFyay9yZXMvIHdpdGggd2hlcmV2ZXIgeW91IGNob3NlIHRvIHB1dCB0aGUgZmlsZXMuCisKKyMgTkRLIENMSSBUZXN0cworTm90ZTogW0JlbmNobWFyayBBcHBsaWNhdGlvbl0oI0JlbmNobWFya0FwcGxpY2F0aW9uKSBub3cgc3VwcG9ydHMgcHJvZmlsaW5nIGJvdGggU0RLIGFuZCBOREsgQVBJcyBhbmQgdGhhdCBpcyB0aGUgcHJlZmVycmVkIHdheSB0byBiZW5jaG1hcmsgY29kZWNzCisKK1RvIHJ1biB0aGUgdGVzdCBzdWl0ZSBmb3IgbWVhc3VyaW5nIHBlcmZvcm1hbmNlIG9mIHRoZSBuYXRpdmUgbGF5ZXIsIGZvbGxvdyB0aGUgZm9sbG93aW5nIHN0ZXBzOgorCitUaGUgNjQtYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvCisKK1RvIHRlc3QgNjQtYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdDY0LgorCithZGIgcHVzaCAkT1VUL2RhdGEvbmF0aXZldGVzdDY0LyogL2RhdGEvbG9jYWwvdG1wLy4gRm9yIGV4YW1wbGUKKworYGBgCithZGIgcHVzaCAkT1VUL2RhdGEvbmF0aXZldGVzdDY0L2V4dHJhY3RvclRlc3QvZXh0cmFjdG9yVGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKworVGhlIDMyLWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdC8KKworVG8gdGVzdCAzMi1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0LgorCithZGIgcHVzaCAkT1VUL2RhdGEvbmF0aXZldGVzdC8qIC9kYXRhL2xvY2FsL3RtcC8uIEZvciBleGFtcGxlCisKK2BgYAorYWRiIHB1c2ggJE9VVC9kYXRhL25hdGl2ZXRlc3QvZXh0cmFjdG9yVGVzdC9leHRyYWN0b3JUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUbyBydW4gdGhlIGJpbmFyeSwgZm9sbG93IHRoZSBjb21tYW5kcyBtZW50aW9uZWQgYmVsb3cgdW5kZXIgZWFjaCBtb2R1bGUuCisKICMjIEV4dHJhY3RvcgogCiBUaGUgdGVzdCBleHRyYWN0cyBlbGVtZW50YXJ5IHN0cmVhbSBhbmQgYmVuY2htYXJrcyB0aGUgZXh0cmFjdG9ycyBhdmFpbGFibGUgaW4gTkRLLgogCi1UaGUgcmVzb3VyY2UgZmlsZXMgYXJlIGFzc3VtZWQgdG8gYmUgYXQgL2RhdGEvbG9jYWwvdG1wL01lZGlhQmVuY2htYXJrL3Jlcy8uIFlvdSBjYW4gdXNlIGEgZGlmZmVyZW50IGxvY2F0aW9uLCBidXQgeW91IGhhdmUgdG8gbW9kaWZ5IHRoZSByZXN0IG9mIHRoZSBpbnN0cnVjdGlvbnMgdG8gcmVwbGFjZSAvZGF0YS9sb2NhbC90bXAvTWVkaWFCZW5jaG1hcmsvcmVzLyB3aXRoIHdoZXJldmVyIHlvdSBjaG9zZSB0byBwdXQgdGhlIGZpbGVzLgotCi1UaGUgcGF0aCB0byB0aGVzZSBmaWxlcyBvbiB0aGUgZGV2aWNlIGlzIHJlcXVpcmVkIHRvIGJlIGdpdmVuIGZvciB0aGUgdGVzdC4KLQogYGBgCiBhZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL2V4dHJhY3RvclRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL01lZGlhQmVuY2htYXJrL3Jlcy8KIGBgYApAQCAtNDcsOCArNjEsNiBAQAogCiBUaGUgdGVzdCBkZWNvZGVzIGlucHV0IHN0cmVhbSBhbmQgYmVuY2htYXJrcyB0aGUgZGVjb2RlcnMgYXZhaWxhYmxlIGluIE5ESy4KIAotU2V0dXAgc3RlcHMgYXJlIHNhbWUgYXMgZXh0cmFjdG9yLgotCiBgYGAKIGFkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvZGVjb2RlclRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL01lZGlhQmVuY2htYXJrL3Jlcy8KIGBgYApAQCAtNTcsOCArNjksNiBAQAogCiBUaGUgdGVzdCBtdXhlcyBlbGVtZW50YXJ5IHN0cmVhbSBhbmQgYmVuY2htYXJrcyB0aGUgbXV4ZXJzIGF2YWlsYWJsZSBpbiBOREsuCiAKLVNldHVwIHN0ZXBzIGFyZSBzYW1lIGFzIGV4dHJhY3Rvci4KLQogYGBgCiBhZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL211eGVyVGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvTWVkaWFCZW5jaG1hcmsvcmVzLwogYGBgCkBAIC02Nyw1NSArNzcsODIgQEAKIAogVGhlIHRlc3QgZW5jb2RlcyBpbnB1dCBzdHJlYW0gYW5kIGJlbmNobWFya3MgdGhlIGVuY29kZXJzIGF2YWlsYWJsZSBpbiBOREsuCiAKLVNldHVwIHN0ZXBzIGFyZSBzYW1lIGFzIGV4dHJhY3Rvci4KLQogYGBgCiBhZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL2VuY29kZXJUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC9NZWRpYUJlbmNobWFyay9yZXMvCiBgYGAKIAotIyBTREsKKyMgPGEgbmFtZT0iQmVuY2htYXJrQXBwbGljYXRpb24iPjwvYT4gQmVuY2htYXJrIEFwcGxpY2F0aW9uCitUbyBydW4gdGhlIHRlc3Qgc3VpdGUgZm9yIG1lYXN1cmluZyBwZXJmb3JtYW5jZSBvZiB0aGUgU0RLIGFuZCBOREsgQVBJcywgZm9sbG93IHRoZSBmb2xsb3dpbmcgc3RlcHM6CitCZW5jaG1hcmsgQXBwbGljYXRpb24gY2FuIGJlIHJ1biBpbiB0d28gd2F5cy4KIAotVG8gcnVuIHRoZSB0ZXN0IHN1aXRlIGZvciBtZWFzdXJpbmcgcGVyZm9ybWFuY2Ugb2YgdGhlIFNESyBBUElzLCBmb2xsb3cgdGhlIGZvbGxvd2luZyBzdGVwczoKKyMjIFN0ZXBzIHRvIHJ1biB3aXRoIGF0ZXN0CitOb3RlIHRoYXQgYXRlc3QgY29tbWFuZCB3aWxsIGluc3RhbGwgQmVuY2htYXJrIGFwcGxpY2F0aW9uIGFuZCBwdXNoIHRoZSByZXF1aXJlZCB0ZXN0IGZpbGVzIHRvIHRoZSBkZXZpY2UgYXMgd2VsbC4KKworRm9yIHJ1bm5pbmcgYWxsIHRoZSB0ZXN0cywgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZAorYGBgCithdGVzdCBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsudGVzdHMgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorYGBgCisKK0ZvciBydW5uaW5nIHRoZSB0ZXN0cyBpbmRpdmlkdWFsbHksIHJ1biB0aGUgZm9sbG93aW5nIGF0ZXN0IGNvbW1hbmRzOgorCitgYGAKK2F0ZXN0IGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay50ZXN0cy5FeHRyYWN0b3JUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKK2F0ZXN0IGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay50ZXN0cy5EZWNvZGVyVGVzdCAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCithdGVzdCBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsudGVzdHMuTXV4ZXJUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKK2F0ZXN0IGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay50ZXN0cy5FbmNvZGVyVGVzdCAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCitgYGAKKworIyMgU3RlcHMgdG8gcnVuIHdpdGhvdXQgYXRlc3QKIAogVGhlIGFwayB3aWxsIGJlIGNyZWF0ZWQgYXQgdGhlIGZvbGxvd2luZyBwYXRoOgotJE9VVC90ZXN0Y2FzZXMvTWVkaWFCZW5jaG1hcmtUZXN0L2FybTY0LwogCi1UbyBnZXQgdGhlIHJlc29yY2UgZmlsZXMgZm9yIHRoZSB0ZXN0IGZvbGxvdyBpbnN0cnVjdGlvbnMgZ2l2ZW4gaW4gW05ES10oI05ESykKK1RoZSA2NC1iaXQgYXBrIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOgorJE9VVC90ZXN0Y2FzZXMvTWVkaWFCZW5jaG1hcmtUZXN0L2FybTY0LwogCiBGb3IgaW5zdGFsbGluZyB0aGUgYXBrLCBydW4gdGhlIGNvbW1hbmQ6CiBgYGAKIGFkYiBpbnN0YWxsIC1mIC1yICRPVVQvdGVzdGNhc2VzL01lZGlhQmVuY2htYXJrVGVzdC9hcm02NC9NZWRpYUJlbmNobWFya1Rlc3QuYXBrCiBgYGAKIAotRm9yIHJ1bm5pbmcgYWxsIHRoZSB0ZXN0cywgcnVuIHRoZSBjb21tYW5kOgorVGhlIDMyLWJpdCBhcGsgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6CiskT1VUL3Rlc3RjYXNlcy9NZWRpYUJlbmNobWFya1Rlc3QvYXJtLworCitGb3IgaW5zdGFsbGluZyB0aGUgYXBrLCBydW4gdGhlIGNvbW1hbmQ6CitgYGAKK2FkYiBpbnN0YWxsIC1mIC1yICRPVVQvdGVzdGNhc2VzL01lZGlhQmVuY2htYXJrVGVzdC9hcm0vTWVkaWFCZW5jaG1hcmtUZXN0LmFwaworYGBgCisKK1RvIGdldCB0aGUgcmVzb3VyY2UgZmlsZXMgZm9yIHRoZSB0ZXN0IGZvbGxvdyBpbnN0cnVjdGlvbnMgZ2l2ZW4gaW4gW1Jlc291cmNlc10oI1Jlc291cmNlcykKKworRm9yIHJ1bm5pbmcgYWxsIHRoZSB0ZXN0cywgcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZAogYGBgCiBhZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAtdyAtciAtZSBwYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay50ZXN0cyBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsvYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyCiBgYGAKIAogIyMgRXh0cmFjdG9yCiAKLVRoZSB0ZXN0IGV4dHJhY3RzIGVsZW1lbnRhcnkgc3RyZWFtIGFuZCBiZW5jaG1hcmtzIHRoZSBleHRyYWN0b3JzIGF2YWlsYWJsZSBpbiBTREsuCitUaGUgdGVzdCBleHRyYWN0cyBlbGVtZW50YXJ5IHN0cmVhbSBhbmQgYmVuY2htYXJrcyB0aGUgZXh0cmFjdG9ycyBhdmFpbGFibGUgaW4gU0RLIGFuZCBOREsuCiBgYGAKIGFkYiBzaGVsbCBhbSBpbnN0cnVtZW50IC13IC1yIC1lIGNsYXNzICdjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsudGVzdHMuRXh0cmFjdG9yVGVzdCcgY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrL2FuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lcgogYGBgCiAKICMjIERlY29kZXIKIAotVGhlIHRlc3QgZGVjb2RlcyBpbnB1dCBzdHJlYW0gYW5kIGJlbmNobWFya3MgdGhlIGRlY29kZXJzIGF2YWlsYWJsZSBpbiBTREsuCitUaGUgdGVzdCBkZWNvZGVzIGlucHV0IHN0cmVhbSBhbmQgYmVuY2htYXJrcyB0aGUgZGVjb2RlcnMgYXZhaWxhYmxlIGluIFNESyBhbmQgTkRLLgogYGBgCiBhZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAtdyAtciAtZSBjbGFzcyAnY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLnRlc3RzLkRlY29kZXJUZXN0JyBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsvYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyCiBgYGAKIAogIyMgTXV4ZXIKIAotVGhlIHRlc3QgbXV4ZXMgZWxlbWVudGFyeSBzdHJlYW0gYW5kIGJlbmNobWFya3MgZGlmZmVyZW50IHdyaXRlcnMgYXZhaWxhYmxlIGluIFNESy4KK1RoZSB0ZXN0IG11eGVzIGVsZW1lbnRhcnkgc3RyZWFtIGFuZCBiZW5jaG1hcmtzIGRpZmZlcmVudCB3cml0ZXJzIGF2YWlsYWJsZSBpbiBTREsgYW5kIE5ESy4KIGBgYAogYWRiIHNoZWxsIGFtIGluc3RydW1lbnQgLXcgLXIgLWUgY2xhc3MgJ2NvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay50ZXN0cy5NdXhlclRlc3QnIGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay9hbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIKIGBgYAogCiAjIyBFbmNvZGVyCiAKLVRoZSB0ZXN0IGVuY29kZXMgaW5wdXQgc3RyZWFtIGFuZCBiZW5jaG1hcmtzIHRoZSBlbmNvZGVycyBhdmFpbGFibGUgaW4gU0RLLgorVGhlIHRlc3QgZW5jb2RlcyBpbnB1dCBzdHJlYW0gYW5kIGJlbmNobWFya3MgdGhlIGVuY29kZXJzIGF2YWlsYWJsZSBpbiBTREsgYW5kIE5ESy4KIGBgYAogYWRiIHNoZWxsIGFtIGluc3RydW1lbnQgLXcgLXIgLWUgY2xhc3MgJ2NvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay50ZXN0cy5FbmNvZGVyVGVzdCcgY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrL2FuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lcgogYGBgCkBAIC0xMjQsMjQgKzE2MSwyNyBAQAogVG8gcnVuIHRoZSB0ZXN0IHN1aXRlIGZvciBtZWFzdXJpbmcgcGVyZm9ybWFuY2Ugb2YgdGhlIGNvZGVjMiBsYXllciwgZm9sbG93IHRoZSBmb2xsb3dpbmcgc3RlcHM6CiAKIFRoZSAzMi1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvCisKIFRoZSA2NC1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC8KIAogVG8gdGVzdCA2NC1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0NjQuCiBhZGIgcHVzaCAkKE9VVCkvZGF0YS9uYXRpdmV0ZXN0NjQvKiAvZGF0YS9sb2NhbC90bXAvCi1FZy4gYWRiIHB1c2ggJChPVVQpL2RhdGEvbmF0aXZldGVzdDY0L0MyRGVjb2RlclRlc3QvQzJEZWNvZGVyVGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKK2FkYiBwdXNoICQoT1VUKS9kYXRhL25hdGl2ZXRlc3Q2NC9DMkRlY29kZXJUZXN0L0MyRGVjb2RlclRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCiAKIFRvIHRlc3QgMzItYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdC4KIGFkYiBwdXNoICQoT1VUKS9kYXRhL25hdGl2ZXRlc3QvKiAvZGF0YS9sb2NhbC90bXAvCi1FZy4gYWRiIHB1c2ggJChPVVQpL2RhdGEvbmF0aXZldGVzdC9DMkRlY29kZXJUZXN0L0MyRGVjb2RlclRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCithZGIgcHVzaCAkKE9VVCkvZGF0YS9uYXRpdmV0ZXN0L0MyRGVjb2RlclRlc3QvQzJEZWNvZGVyVGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKIAotVG8gZ2V0IHRoZSByZXNvdXJjZSBmaWxlcyBmb3IgdGhlIHRlc3QgZm9sbG93IGluc3RydWN0aW9ucyBnaXZlbiBpbiBbTkRLXSgjTkRLKQorVG8gZ2V0IHRoZSByZXNvdXJjZSBmaWxlcyBmb3IgdGhlIHRlc3QgZm9sbG93IGluc3RydWN0aW9ucyBnaXZlbiBpbiBbUmVzb3VyY2VzXSgjUmVzb3VyY2VzKQogCiAjIyBDMiBEZWNvZGVyCiAKIFRoZSB0ZXN0IGRlY29kZXMgaW5wdXQgc3RyZWFtIGFuZCBiZW5jaG1hcmtzIHRoZSBjb2RlYzIgZGVjb2RlcnMgYXZhaWxhYmxlIGluIGRldmljZS4KIAotU2V0dXAgc3RlcHMgYXJlIHNhbWUgYXMgW2V4dHJhY3Rvcl0oI2V4dHJhY3RvcikuCi0KIGBgYAogYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9DMkRlY29kZXJUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC9NZWRpYUJlbmNobWFyay9yZXMvCiBgYGAKQEAgLTE0OSw4ICsxODksOTUgQEAKIAogVGhlIHRlc3QgZW5jb2RlcyBpbnB1dCBzdHJlYW0gYW5kIGJlbmNobWFya3MgdGhlIGNvZGVjMiBlbmNvZGVycyBhdmFpbGFibGUgaW4gZGV2aWNlLgogCi1TZXR1cCBzdGVwcyBhcmUgc2FtZSBhcyBbZXh0cmFjdG9yXSgjZXh0cmFjdG9yKS4KLQogYGBgCiBhZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL0MyRW5jb2RlclRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL01lZGlhQmVuY2htYXJrL3Jlcy8KIGBgYAorCisjIEFuYWx5c2lzCisKK1RoZSBiZW5jaG1hcmsgcmVzdWx0cyBhcmUgc3RvcmVkIGluIGEgQ1NWIGZpbGUgd2hpY2ggY2FuIGJlIHVzZWQgZm9yIGFuYWx5c2lzLiBUaGVzZSByZXN1bHRzIGFyZSBzdG9yZWQgaW4gZm9sbG93aW5nIGZvcm1hdDoKKzxhcHAgZGlyZWN0b3J5Pi88bW9kdWxlX25hbWU+Ljx0aW1lc3RhbXA+LmNzdgorCitOb3RlOiBUaGlzIHRpbWVzdGFtcCBpcyBpbiBuYW5vIHNlY29uZHMgYW5kIHdpbGwgY2hhbmdlIGJhc2VkIG9uIGN1cnJlbnQgc3lzdGVtIHRpbWUuCisKK1RvIGZpbmQgdGhlIGxvY2F0aW9uIG9mIHRoZSBDU1YgZmlsZSwgbG9vayBmb3IgdGhlIHBhdGggaW4gbG9ncy4gRXhhbXBsZSBsb2cgYmVsb3cgLQorCitgYGAKK2NvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyayBEL0RlY29kZXJUZXN0OiBTYXZpbmcgQmVuY2htYXJrIHJlc3VsdHMgaW46IC9zdG9yYWdlL2VtdWxhdGVkLzAvQW5kcm9pZC9kYXRhL2NvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay9maWxlcy9EZWNvZGVyLjE1ODc3MzIzOTUzODcuY3N2CitgYGAKKworVGhpcyBmaWxlIGNhbiBiZSBwdWxsZWQgZnJvbSB0aGUgZGV2aWNlIHVzaW5nICJhZGIgcHVsbCIgY29tbWFuZC4KK2BgYAorYWRiIHB1bGwgL3N0b3JhZ2UvZW11bGF0ZWQvMC9BbmRyb2lkL2RhdGEvY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrL2ZpbGVzL0RlY29kZXIuMTU4NzczMjM5NTM4Ny5jc3YgLi9EZWNvZGVyLjE1ODc3MzIzOTUzODcuY3N2CitgYGAKKworIyMgQ1NWIENvbHVtbnMKKworRm9sbG93aW5nIGNvbHVtbnMgYXJlIGF2YWlsYWJsZSBpbiBDU1YuCisKK05vdGU6IEFsbCB0aW1lIHZhbHVlcyBhcmUgaW4gbmFubyBzZWNvbmRzCisKKzEuICoqY3VycmVudFRpbWUqKiA6IFRoZSB0aW1lIHJlY29yZGVkIGF0IHRoZSBjcmVhdGlvbiBvZiB0aGUgc3RhdHMuIFRoaXMgbWF5IGJlIHVzZWQgdG8gZXN0aW1hdGUgdGltZSBiZXR3ZWVuIGNvbnNlY3V0aXZlIHRlc3QgY2xpcHMuCisKKzIuICoqZmlsZU5hbWUqKjogVGhlIGZpbGUgYmVpbmcgdXNlZCBhcyBhbiBpbnB1dCBmb3IgdGhlIGJlbmNobWFyayB0ZXN0LgorCiszLiAqKm9wZXJhdGlvbioqOiBUaGUgY3VycmVudCBvcGVyYXRpb24gb24gdGhlIGlucHV0IHRlc3QgdmVjdG9yIGkuZS4gRXh0cmFjdC9NdXgvRW5jb2RlL0RlY29kZS4KKworNC4gKipOREsvU0RLKio6IFRoZSB0YXJnZXQgQVBJcyBpLmUuIEFNZWRpYSB2cyBNZWRpYSBjYWxscyBmb3IgdGhlIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWQuCisKKzUuICoqc3luYy9hc3luYyoqOiBUaGlzIGlzIHNwZWNpZmljIHRvIE1lZGlhQ29kZWMgb2JqZWN0cyAoaS5lLiBFbmNvZGVyIGFuZCBEZWNvZGVyKS4gSXQgc3BlY2lmaWVzIHRoZSBtb2RlIGluIHdoaWNoIE1lZGlhQ29kZWMgQVBJcyBhcmUgd29ya2luZy4gRm9yIGFzeW5jIG1vZGUsIGNhbGxiYWNrcyBhcmUgc2V0LiBGb3Igc3luYyBtb2RlLCB3ZSBoYXZlIHRvIHBvbGwgdGhlIGRlcXVldWVCdWZmZXIgQVBJcyB0byBxdWV1ZSBhbmQgZGVxdWV1ZSBpbnB1dCBvdXRwdXQgYnVmZmVycyByZXNwZWN0aXZlbHkuCisKKzYuICoqc2V0dXBUaW1lKio6IFRoZSB0aW1lIHRha2VuIHRvIHNldCB1cCB0aGUgTWVkaWFFeHRyYWN0b3IvTXV4ZXIvQ29kZWMgaW5zdGFuY2UuCisKKyAgICAqIE1lZGlhQ29kZWM6IGluY2x1ZGVzIHNldHRpbmcgYXN5bmMvc3luYyBtb2RlLCBjb25maWd1cmluZyB3aXRoIGEgZm9ybWF0IGFuZCBjb2RlYy5zdGFydAorCisgICAgKiBNZWRpYUV4dHJhY3RvcjogaW5jbHVkZXMgQU1lZGlhRXh0cmFjdG9yX25ldyBhbmQgc2V0RGF0YVNvdXJjZS4KKworICAgICogTWVkaWFNdXhlcjogaW5jbHVkZXMgY3JlYXRpbmcgdGhlIG9iamVjdCwgYWRkaW5nIHRyYWNrLCBhbmQgc3RhcnRpbmcgdGhlIG11eGVyLgorCis3LiAqKmRlc3Ryb3lUaW1lKio6IFRoZSB0aW1lIHRha2VuIHRvIHN0b3AgYW5kIGNsb3NlIE1lZGlhRXh0cmFjdG9yL011eGVyL0NvZGVjIGluc3RhbmNlLgorCis4LiAqKm1pbmltdW1UaW1lKio6IFRoZSBtaW5pbXVtIHRpbWUgdGFrZW4gdG8gZXh0cmFjdC9tdXgvZW5jb2RlL2RlY29kZSBhIGZyYW1lLgorCis5LiAqKm1heGltdW1UaW1lKio6IFRoZSBtYXhpbXVtIHRpbWUgdGFrZW4gdG8gZXh0cmFjdC9tdXgvZW5jb2RlL2RlY29kZSBhIGZyYW1lLgorCisxMC4gKiphdmVyYWdlVGltZSoqOiBBdmVyYWdlIHRpbWUgdGFrZW4gdG8gZXh0cmFjdC9tdXgvZW5jb2RlL2RlY29kZSBwZXIgZnJhbWUuCisKKyAgICAqIE1lZGlhQ29kZWM6IGNvbXB1dGVkIGFzIHRoZSB0b3RhbCB0aW1lIHRha2VuIHRvIGVuY29kZS9kZWNvZGUgYWxsIGZyYW1lcyBkaXZpZGVkIGJ5IHRoZSBudW1iZXIgb2YgZnJhbWVzIGVuY29kZWQvZGVjb2RlZC4KKworICAgICogTWVkaWFFeHRyYWN0b3I6IGNvbXB1dGVkIGFzIHRoZSB0b3RhbCB0aW1lIHRha2VuIHRvIGV4dHJhY3QgYWxsIGZyYW1lcyBkaXZpZGVkIGJ5IHRoZSBudW1iZXIgb2YgZnJhbWVzIGV4dHJhY3RlZC4KKworICAgICogTWVkaWFNdXhlcjogY29tcHV0ZWQgYXMgdGhlIHRvdGFsIHRpbWUgdGFrZW4gdG8gbXV4IGFsbCBmcmFtZXMgZGl2aWRlZCBieSB0aGUgbnVtYmVyIG9mIGZyYW1lcyBtdXhlZC4KKworMTEuICoqdGltZVRvUHJvY2VzczFTZWNDb250ZW50Kio6IFRoZSB0aW1lIHJlcXVpcmVkIHRvIHByb2Nlc3Mgb25lIHNlY29uZCB3b3J0aCBpbnB1dCBkYXRhLgorCisxMi4gKip0b3RhbEJ5dGVzUHJvY2Vzc2VkUGVyU2VjKio6IFRoZSBudW1iZXIgb2YgYnl0ZXMgZXh0cmFjdGVkL211eGVkL2RlY29kZWQvZW5jb2RlZCBwZXIgc2Vjb25kLgorCisxMy4gKip0aW1lVG9GaXJzdEZyYW1lKio6IFRoZSB0aW1lIHRha2VuIHRvIHJlY2VpdmUgdGhlIGZpcnN0IG91dHB1dCBmcmFtZS4KKworMTQuICoqdG90YWxTaXplSW5CeXRlcyoqOiBUaGUgdG90YWwgb3V0cHV0IHNpemUgb2YgdGhlIG9wZXJhdGlvbiAoaW4gYnl0ZXMpLgorCisxNS4gKip0b3RhbFRpbWUqKjogVGhlIHRpbWUgdGFrZW4gdG8gcGVyZm9ybSB0aGUgY29tcGxldGUgb3BlcmF0aW9uIChpLmUuIEV4dHJhY3QvTXV4L0RlY29kZS9FbmNvZGUpIGZvciByZXNwZWN0aXZlIHRlc3QgdmVjdG9yLgorCisKKyMjIE11eGVyCisxLiAqKmNvbXBvbmVudE5hbWUqKjogVGhlIGZvcm1hdCBvZiB0aGUgb3V0cHV0IE1lZGlhIGZpbGUuIEZvbGxvd2luZyBtdXhlcnMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQ6CisgICAgICogT2dnLCBXZWJtLCAzZ3BwLCBhbmQgbXA0LgorCisjIyBEZWNvZGVyCisxLiAqKmNvbXBvbmVudE5hbWUqKjogSW5jbHVkZXMgYWxsIHN1cHBvcnRlZCBjb2RlY3Mgb24gdGhlIGRldmljZS4gQWxpYXNlZCBjb21wb25lbnRzIGFyZSBza2lwcGVkLgorICAgICogICBWaWRlbzogSDI2MywgSDI2NCwgSDI2NSwgVlB4LCBNcGVnNCwgTXBlZzIsIEFWMQorICAgICogICBBdWRpbzogQUFDLCBGbGFjLCBPcHVzLCBNUDMsIFZvcmJpcywgR1NNLCBBTVItTkIvV0IKKworIyMgRW5jb2RlcgorMS4gKipjb21wb25lbnROYW1lKio6IEluY2x1ZGVzIGFsbCBzdXBwb3J0ZWQgY29kZWNzIG9uIHRoZSBkZXZpY2UuIEFsaWFzZWQgY29tcG9uZW50cyBhcmUgc2tpcHBlZC4KKyAgICAqICAgVmlkZW86IEgyNjMsIEgyNjQsIEgyNjUsIFZQeCwgTXBlZzQKKyAgICAqICAgQXVkaW86IEFBQywgRmxhYywgT3B1cywgQU1SLU5CL1dCCisKKyMjIENvbW1vbiBGYWlsdXJlcworT24gc29tZSBkZXZpY2VzLCBpZiBhIGNvZGVjIGlzbid0IHN1cHBvcnRlZCBzb21lIHRlc3RzIG1heSByZXBvcnQgYSBmYWlsdXJlIGxpa2UgImNvZGVjIG5vdCBmb3VuZCBmb3IiCisKK0ZvciBleGFtcGxlOiBPbiBtb2JpbGUgZGV2aWNlcyB3aXRob3V0IHN1cHBvcnQgZm9yIG1wZWcyIGRlY29kZXIsIGZvbGxvd2luZyBmYWlsdXJlIGlzIG9ic2VydmVkOgorYGBgCitVbmFibGUgdG8gY3JlYXRlIGNvZGVjIGJ5IG1pbWU6IHZpZGVvL21wZWcyCitgYGAKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2RlY29kZXIvQzJEZWNvZGVyLmNwcCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2RlY29kZXIvQzJEZWNvZGVyLmNwcAppbmRleCAyMGExNDY4Li40NmM0YTdjIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9kZWNvZGVyL0MyRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZGVjb2Rlci9DMkRlY29kZXIuY3BwCkBAIC0xNTYsOSArMTU2LDExIEBACiAgICAgbVN0YXRzLT5zZXREZUluaXRUaW1lKHRpbWVUYWtlbik7CiB9CiAKLXZvaWQgQzJEZWNvZGVyOjpkdW1wU3RhdGlzdGljcyhzdHJpbmcgaW5wdXRSZWZlcmVuY2UsIGludDY0X3QgZHVyYXRpb25Vcykgewordm9pZCBDMkRlY29kZXI6OmR1bXBTdGF0aXN0aWNzKHN0cmluZyBpbnB1dFJlZmVyZW5jZSwgaW50NjRfdCBkdXJhdGlvblVzLCBzdHJpbmcgY29tcG9uZW50TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3RhdHNGaWxlKSB7CiAgICAgc3RyaW5nIG9wZXJhdGlvbiA9ICJjMmRlY29kZSI7Ci0gICAgbVN0YXRzLT5kdW1wU3RhdGlzdGljcyhvcGVyYXRpb24sIGlucHV0UmVmZXJlbmNlLCBkdXJhdGlvblVzKTsKKyAgICBzdHJpbmcgbW9kZSA9ICJhc3luYyI7CisgICAgbVN0YXRzLT5kdW1wU3RhdGlzdGljcyhvcGVyYXRpb24sIGlucHV0UmVmZXJlbmNlLCBkdXJhdGlvblVzLCBjb21wb25lbnROYW1lLCBtb2RlLCBzdGF0c0ZpbGUpOwogfQogCiB2b2lkIEMyRGVjb2Rlcjo6cmVzZXREZWNvZGVyKCkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZGVjb2Rlci9DMkRlY29kZXIuaCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2RlY29kZXIvQzJEZWNvZGVyLmgKaW5kZXggNGEzZWI5Ni4uZmIzNWE2NiAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZGVjb2Rlci9DMkRlY29kZXIuaAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9kZWNvZGVyL0MyRGVjb2Rlci5oCkBAIC0zMSw3ICszMSw4IEBACiAKICAgICB2b2lkIGRlSW5pdENvZGVjKCk7CiAKLSAgICB2b2lkIGR1bXBTdGF0aXN0aWNzKHN0cmluZyBpbnB1dFJlZmVyZW5jZSwgaW50NjRfdCBkdXJhdGlvblVzKTsKKyAgICB2b2lkIGR1bXBTdGF0aXN0aWNzKHN0cmluZyBpbnB1dFJlZmVyZW5jZSwgaW50NjRfdCBkdXJhdGlvblVzLCBzdHJpbmcgY29tcG9uZW50TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdGF0c0ZpbGUpOwogCiAgICAgdm9pZCByZXNldERlY29kZXIoKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9DMkVuY29kZXIuY3BwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9DMkVuY29kZXIuY3BwCmluZGV4IDMzNDI5ZWYuLjZhNTBkNDAgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvQzJFbmNvZGVyLmNwcAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0MyRW5jb2Rlci5jcHAKQEAgLTI1MSw5ICsyNTEsMTEgQEAKICAgICBtU3RhdHMtPnNldERlSW5pdFRpbWUodGltZVRha2VuKTsKIH0KIAotdm9pZCBDMkVuY29kZXI6OmR1bXBTdGF0aXN0aWNzKHN0cmluZyBpbnB1dFJlZmVyZW5jZSwgaW50NjRfdCBkdXJhdGlvblVzKSB7Cit2b2lkIEMyRW5jb2Rlcjo6ZHVtcFN0YXRpc3RpY3Moc3RyaW5nIGlucHV0UmVmZXJlbmNlLCBpbnQ2NF90IGR1cmF0aW9uVXMsIHN0cmluZyBjb21wb25lbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdGF0c0ZpbGUpIHsKICAgICBzdHJpbmcgb3BlcmF0aW9uID0gImMyZW5jb2RlIjsKLSAgICBtU3RhdHMtPmR1bXBTdGF0aXN0aWNzKG9wZXJhdGlvbiwgaW5wdXRSZWZlcmVuY2UsIGR1cmF0aW9uVXMpOworICAgIHN0cmluZyBtb2RlID0gImFzeW5jIjsKKyAgICBtU3RhdHMtPmR1bXBTdGF0aXN0aWNzKG9wZXJhdGlvbiwgaW5wdXRSZWZlcmVuY2UsIGR1cmF0aW9uVXMsIGNvbXBvbmVudE5hbWUsIG1vZGUsIHN0YXRzRmlsZSk7CiB9CiAKIHZvaWQgQzJFbmNvZGVyOjpyZXNldEVuY29kZXIoKSB7CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0MyRW5jb2Rlci5oIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9DMkVuY29kZXIuaAppbmRleCBhNGNhMDk3Li43YTAyMWY0IDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0MyRW5jb2Rlci5oCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvQzJFbmNvZGVyLmgKQEAgLTQ0LDcgKzQ0LDggQEAKIAogICAgIHZvaWQgZGVJbml0Q29kZWMoKTsKIAotICAgIHZvaWQgZHVtcFN0YXRpc3RpY3Moc3RyaW5nIGlucHV0UmVmZXJlbmNlLCBpbnQ2NF90IGR1cmF0aW9uVXMpOworICAgIHZvaWQgZHVtcFN0YXRpc3RpY3Moc3RyaW5nIGlucHV0UmVmZXJlbmNlLCBpbnQ2NF90IGR1cmF0aW9uVXMsIHN0cmluZyBjb21wb25lbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN0YXRzRmlsZSk7CiAKICAgICB2b2lkIHJlc2V0RW5jb2RlcigpOwogCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0VuY29kZXIuY3BwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9FbmNvZGVyLmNwcAppbmRleCAyNmZiMWI5Li4xNWM0NzlkIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0VuY29kZXIuY3BwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvRW5jb2Rlci5jcHAKQEAgLTIwMywxMyArMjAzLDEzIEBACiAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCBtUGFyYW1zLndpZHRoKTsKICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULCBtUGFyYW1zLmhlaWdodCk7CiAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX1JBVEUsIG1QYXJhbXMuZnJhbWVSYXRlKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfSV9GUkFNRV9JTlRFUlZBTCwgbVBhcmFtcy5pRnJhbWVJbnRlcnZhbCk7CiAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFLCBtUGFyYW1zLmJpdHJhdGUpOwotICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9JX0ZSQU1FX0lOVEVSVkFMLCAxKTsKLSAgICAgICAgaWYgKG1QYXJhbXMucHJvZmlsZSAmJiBtUGFyYW1zLmxldmVsKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX0ZPUk1BVCwgbVBhcmFtcy5jb2xvckZvcm1hdCk7CisgICAgICAgIGlmIChtUGFyYW1zLnByb2ZpbGUgIT0gLTEgJiYgbVBhcmFtcy5sZXZlbCAhPSAtMSkgewogICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfUFJPRklMRSwgbVBhcmFtcy5wcm9maWxlKTsKICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0xFVkVMLCBtUGFyYW1zLmxldmVsKTsKICAgICAgICAgfQotICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9GT1JNQVQsIG1QYXJhbXMuY29sb3JGb3JtYXQpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBtUGFyYW1zLnNhbXBsZVJhdGUpOwogICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBtUGFyYW1zLm51bUNoYW5uZWxzKTsKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvRW5jb2Rlci5oIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9FbmNvZGVyLmgKaW5kZXggNWFkMTQyYi4uMzI0MzE3YyAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9FbmNvZGVyLmgKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9FbmNvZGVyLmgKQEAgLTIzLDEwICsyMywxMSBAQAogI2luY2x1ZGUgPHF1ZXVlPgogI2luY2x1ZGUgPHRocmVhZD4KIAotI2luY2x1ZGUgIm1lZGlhL05ka0ltYWdlLmgiCiAjaW5jbHVkZSAiQmVuY2htYXJrQ29tbW9uLmgiCiAjaW5jbHVkZSAiU3RhdHMuaCIKIAorLy8gY29uc3RhbnQgbm90IGRlZmluZWQgaW4gTkRLIGFwaQorY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGUgPSAweDdGNDIwODg4OwogCiBzdHJ1Y3QgZW5jUGFyYW1ldGVyIHsKICAgICBpbnQzMl90IGJpdHJhdGUgPSAtMTsKQEAgLTM4LDkgKzM5LDEwIEBACiAgICAgaW50MzJfdCB3aWR0aCA9IDA7CiAgICAgaW50MzJfdCBoZWlnaHQgPSAwOwogICAgIGludDMyX3QgZnJhbWVSYXRlID0gLTE7Ci0gICAgaW50MzJfdCBwcm9maWxlID0gMDsKLSAgICBpbnQzMl90IGxldmVsID0gMDsKLSAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gQUlNQUdFX0ZPUk1BVF9ZVVZfNDIwXzg4ODsKKyAgICBpbnQzMl90IGlGcmFtZUludGVydmFsID0gMDsKKyAgICBpbnQzMl90IHByb2ZpbGUgPSAtMTsKKyAgICBpbnQzMl90IGxldmVsID0gLTE7CisgICAgaW50MzJfdCBjb2xvckZvcm1hdCA9IENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOwogfTsKIAogY2xhc3MgRW5jb2RlciA6IHB1YmxpYyBDYWxsQmFja0hhbmRsZSB7CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvQmVuY2htYXJrVGVzdEVudmlyb25tZW50LmggYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvQmVuY2htYXJrVGVzdEVudmlyb25tZW50LmgKaW5kZXggYWUyZWVlMS4uNGVkYjA0OCAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0JlbmNobWFya1Rlc3RFbnZpcm9ubWVudC5oCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9CZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQuaApAQCAtMjUsNyArMjUsOSBAQAogCiBjbGFzcyBCZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQgOiBwdWJsaWMgOjp0ZXN0aW5nOjpFbnZpcm9ubWVudCB7CiAgIHB1YmxpYzoKLSAgICBCZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQoKSA6IHJlcygiL3NkY2FyZC9tZWRpYS8iKSB7fQorICAgIEJlbmNobWFya1Rlc3RFbnZpcm9ubWVudCgpCisgICAgICAgIDogcmVzKCIvZGF0YS9sb2NhbC90bXAvTWVkaWFCZW5jaG1hcmsvcmVzLyIpLAorICAgICAgICAgIHN0YXRzRmlsZSgiL2RhdGEvbG9jYWwvdG1wL01lZGlhQmVuY2htYXJrL3Jlcy9zdGF0cy5jc3YiKSB7fQogCiAgICAgLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQKICAgICBpbnQgaW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndik7CkBAIC0zNCw4ICszNiwxNSBAQAogCiAgICAgY29uc3Qgc3RyaW5nIGdldFJlcygpIGNvbnN0IHsgcmV0dXJuIHJlczsgfQogCisgICAgdm9pZCBzZXRTdGF0c0ZpbGUoY29uc3Qgc3RyaW5nIG1vZHVsZSkgeyBzdGF0c0ZpbGUgPSBnZXRSZXMoKSArIG1vZHVsZTsgfQorCisgICAgY29uc3Qgc3RyaW5nIGdldFN0YXRzRmlsZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRzRmlsZTsgfQorCisgICAgYm9vbCB3cml0ZVN0YXRzSGVhZGVyKCk7CisKICAgcHJpdmF0ZToKICAgICBzdHJpbmcgcmVzOworICAgIHN0cmluZyBzdGF0c0ZpbGU7CiB9OwogCiBpbnQgQmVuY2htYXJrVGVzdEVudmlyb25tZW50Ojppbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CkBAIC03MCw0ICs3OSwyNiBAQAogICAgIHJldHVybiAwOwogfQogCisvKioKKyAqIFdyaXRlcyB0aGUgc3RhdHMgaGVhZGVyIHRvIGEgZmlsZQorICogPHA+CisgKiBccGFyYW0gc3RhdHNGaWxlICAgIGZpbGUgd2hlcmUgdGhlIHN0YXRzIGRhdGEgaXMgdG8gYmUgd3JpdHRlbgorICoqLworYm9vbCBCZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQ6OndyaXRlU3RhdHNIZWFkZXIoKSB7CisgICAgY2hhciBzdGF0c0hlYWRlcltdID0KKyAgICAgICAgImN1cnJlbnRUaW1lLCBmaWxlTmFtZSwgb3BlcmF0aW9uLCBjb21wb25lbnROYW1lLCBOREsvU0RLLCBzeW5jL2FzeW5jLCBzZXR1cFRpbWUsICIKKyAgICAgICAgImRlc3Ryb3lUaW1lLCBtaW5pbXVtVGltZSwgbWF4aW11bVRpbWUsIGF2ZXJhZ2VUaW1lLCB0aW1lVG9Qcm9jZXNzMVNlY0NvbnRlbnQsICIKKyAgICAgICAgInRvdGFsQnl0ZXNQcm9jZXNzZWRQZXJTZWMsIHRpbWVUb0ZpcnN0RnJhbWUsIHRvdGFsU2l6ZUluQnl0ZXMsIHRvdGFsVGltZVxuIjsKKyAgICBGSUxFICpmcFN0YXRzID0gZm9wZW4oc3RhdHNGaWxlLmNfc3RyKCksICJ3Iik7CisgICAgaWYoIWZwU3RhdHMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpbnQzMl90IG51bUJ5dGVzID0gZndyaXRlKHN0YXRzSGVhZGVyLCBzaXplb2YoY2hhciksIHNpemVvZihzdGF0c0hlYWRlciksIGZwU3RhdHMpOworICAgIGZjbG9zZShmcFN0YXRzKTsKKyAgICBpZihudW1CeXRlcyAhPSBzaXplb2Yoc3RhdHNIZWFkZXIpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKICNlbmRpZiAgLy8gX19CRU5DSE1BUktfVEVTVF9FTlZJUk9OTUVOVF9IX18KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9DMkRlY29kZXJUZXN0LmNwcCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9DMkRlY29kZXJUZXN0LmNwcAppbmRleCBkZWRjNzQzLi44NWRjYmMxIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvQzJEZWNvZGVyVGVzdC5jcHAKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0MyRGVjb2RlclRlc3QuY3BwCkBAIC0xMzYsNyArMTM2LDggQEAKICAgICAgICAgICAgICAgICBtRGVjb2Rlci0+ZGVJbml0Q29kZWMoKTsKICAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSBleHRyYWN0b3ItPmdldENsaXBEdXJhdGlvbigpOwogICAgICAgICAgICAgICAgIEFMT0dWKCJjb2RlYyA6ICVzIiwgY29kZWNOYW1lLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIG1EZWNvZGVyLT5kdW1wU3RhdGlzdGljcyhHZXRQYXJhbSgpLmZpcnN0LCBkdXJhdGlvblVzKTsKKyAgICAgICAgICAgICAgICBtRGVjb2Rlci0+ZHVtcFN0YXRpc3RpY3MoR2V0UGFyYW0oKS5maXJzdCwgZHVyYXRpb25VcywgY29kZWNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnRW52LT5nZXRTdGF0c0ZpbGUoKSk7CiAgICAgICAgICAgICAgICAgbURlY29kZXItPnJlc2V0RGVjb2RlcigpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xNzgsNiArMTc5LDkgQEAKICAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKICAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOwogICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBnRW52LT5zZXRTdGF0c0ZpbGUoIkMyRGVjb2Rlci5jc3YiKTsKKyAgICAgICAgc3RhdHVzID0gZ0Vudi0+d3JpdGVTdGF0c0hlYWRlcigpOworICAgICAgICBBTE9HVigiU3RhdHMgZmlsZSA9ICVkXG4iLCBzdGF0dXMpOwogICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CiAgICAgICAgIEFMT0dWKCJDMiBEZWNvZGVyIFRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0MyRW5jb2RlclRlc3QuY3BwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0MyRW5jb2RlclRlc3QuY3BwCmluZGV4IDk4ZWIxN2EuLmIxOGQ4NTYgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9DMkVuY29kZXJUZXN0LmNwcAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvQzJFbmNvZGVyVGVzdC5jcHAKQEAgLTEwOCw3ICsxMDgsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgc3RyaW5nIGRlY05hbWUgPSAiIjsKLSAgICAgICAgc3RyaW5nIG91dHB1dEZpbGVOYW1lID0gImRlY29kZS5vdXQiOworICAgICAgICBzdHJpbmcgb3V0cHV0RmlsZU5hbWUgPSAiL2RhdGEvbG9jYWwvdG1wL2RlY29kZS5vdXQiOwogICAgICAgICBGSUxFICpvdXRGcCA9IGZvcGVuKG91dHB1dEZpbGVOYW1lLmNfc3RyKCksICJ3YiIpOwogICAgICAgICBBU1NFUlRfTkUob3V0RnAsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gb3BlbiBvdXRwdXQgZmlsZSIgPDwgb3V0cHV0RmlsZU5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZvciBkdW1waW5nIGRlY29kZXIncyBvdXRwdXQiOwpAQCAtMTQwLDcgKzE0MCw4IEBACiAgICAgICAgICAgICAgICAgbUVuY29kZXItPmRlSW5pdENvZGVjKCk7CiAgICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzID0gZXh0cmFjdG9yLT5nZXRDbGlwRHVyYXRpb24oKTsKICAgICAgICAgICAgICAgICBBTE9HVigiY29kZWMgOiAlcyIsIGNvZGVjTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICBtRW5jb2Rlci0+ZHVtcFN0YXRpc3RpY3MoR2V0UGFyYW0oKS5maXJzdCwgZHVyYXRpb25Vcyk7CisgICAgICAgICAgICAgICAgbUVuY29kZXItPmR1bXBTdGF0aXN0aWNzKEdldFBhcmFtKCkuZmlyc3QsIGR1cmF0aW9uVXMsIGNvZGVjTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ0Vudi0+Z2V0U3RhdHNGaWxlKCkpOwogICAgICAgICAgICAgICAgIG1FbmNvZGVyLT5yZXNldEVuY29kZXIoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTgwLDYgKzE4MSw5IEBACiAgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CiAgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKICAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgZ0Vudi0+c2V0U3RhdHNGaWxlKCJDMkVuY29kZXIuY3N2Iik7CisgICAgICAgIHN0YXR1cyA9IGdFbnYtPndyaXRlU3RhdHNIZWFkZXIoKTsKKyAgICAgICAgQUxPR1YoIlN0YXRzIGZpbGUgPSAlZFxuIiwgc3RhdHVzKTsKICAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOwogICAgICAgICBBTE9HVigiQzIgRW5jb2RlciBUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9EZWNvZGVyVGVzdC5jcHAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRGVjb2RlclRlc3QuY3BwCmluZGV4IDlmOTZkM2IuLjgxZWYwMmEgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9EZWNvZGVyVGVzdC5jcHAKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0RlY29kZXJUZXN0LmNwcApAQCAtODQsNyArODQsOCBAQAogICAgICAgICBkZWNvZGVyLT5kZUluaXRDb2RlYygpOwogICAgICAgICBBTE9HVigiY29kZWMgOiAlcyIsIGNvZGVjTmFtZS5jX3N0cigpKTsKICAgICAgICAgc3RyaW5nIGlucHV0UmVmZXJlbmNlID0gZ2V0PDA+KHBhcmFtcyk7Ci0gICAgICAgIGRlY29kZXItPmR1bXBTdGF0aXN0aWNzKGlucHV0UmVmZXJlbmNlKTsKKyAgICAgICAgZGVjb2Rlci0+ZHVtcFN0YXRpc3RpY3MoaW5wdXRSZWZlcmVuY2UsIGNvZGVjTmFtZSwgKGFzeW5jTW9kZSA/ICJhc3luYyIgOiAic3luYyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnRW52LT5nZXRTdGF0c0ZpbGUoKSk7CiAgICAgICAgIGZyZWUoaW5wdXRCdWZmZXIpOwogICAgICAgICBkZWNvZGVyLT5yZXNldERlY29kZXIoKTsKICAgICB9CkBAIC0xNzksOCArMTgwLDExIEBACiAgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CiAgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKICAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgZ0Vudi0+c2V0U3RhdHNGaWxlKCJEZWNvZGVyLmNzdiIpOworICAgICAgICBzdGF0dXMgPSBnRW52LT53cml0ZVN0YXRzSGVhZGVyKCk7CisgICAgICAgIEFMT0dWKCJTdGF0cyBmaWxlID0gJWRcbiIsIHN0YXR1cyk7CiAgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKLSAgICAgICAgQUxPR0QoIkRlY29kZXIgVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgQUxPR1YoIkRlY29kZXIgVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRW5jb2RlclRlc3QuY3BwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0VuY29kZXJUZXN0LmNwcAppbmRleCBkYzJhMmRkLi43ZTE2ODFkIDEwMDY0NAotLS0gYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRW5jb2RlclRlc3QuY3BwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9FbmNvZGVyVGVzdC5jcHAKQEAgLTIzLDYgKzIzLDEwIEBACiAjaW5jbHVkZSAiRGVjb2Rlci5oIgogI2luY2x1ZGUgIkVuY29kZXIuaCIKIAorY29uc3RleHByIGludDMyX3Qga0VuY29kZURlZmF1bHRWaWRlb0JpdFJhdGUgPSA4MDAwMDAwIC8qIDggTWJwcyAqLzsKK2NvbnN0ZXhwciBpbnQzMl90IGtFbmNvZGVNaW5WaWRlb0JpdFJhdGUgPSA2MDAwMDAgLyogNjAwIEticHMgKi87Citjb25zdGV4cHIgaW50MzJfdCBrRW5jb2RlRGVmYXVsdEF1ZGlvQml0UmF0ZSA9IDEyODAwMCAvKiAxMjggS2JwcyAqLzsKKwogc3RhdGljIEJlbmNobWFya1Rlc3RFbnZpcm9ubWVudCAqZ0VudiA9IG51bGxwdHI7CiAKIGNsYXNzIEVuY29kZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0dXBsZTxzdHJpbmcsIHN0cmluZywgYm9vbD4+IHt9OwpAQCAtNzgsNyArODIsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgc3RyaW5nIGRlY05hbWUgPSAiIjsKLSAgICAgICAgc3RyaW5nIG91dHB1dEZpbGVOYW1lID0gImRlY29kZS5vdXQiOworICAgICAgICBzdHJpbmcgb3V0cHV0RmlsZU5hbWUgPSAiL2RhdGEvbG9jYWwvdG1wL2RlY29kZS5vdXQiOwogICAgICAgICBGSUxFICpvdXRGcCA9IGZvcGVuKG91dHB1dEZpbGVOYW1lLmNfc3RyKCksICJ3YiIpOwogICAgICAgICBBU1NFUlRfTkUob3V0RnAsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gb3BlbiBvdXRwdXQgZmlsZSIgPDwgb3V0cHV0RmlsZU5hbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGZvciBkdW1waW5nIGRlY29kZXIncyBvdXRwdXQiOwpAQCAtODYsNiArOTAsNyBAQAogICAgICAgICBkZWNvZGVyLT5zZXR1cERlY29kZXIoKTsKICAgICAgICAgc3RhdHVzID0gZGVjb2Rlci0+ZGVjb2RlKGlucHV0QnVmZmVyLCBmcmFtZUluZm8sIGRlY05hbWUsIGZhbHNlIC8qYXN5bmNNb2RlICovLCBvdXRGcCk7CiAgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIEFNRURJQV9PSykgPDwgIkRlY29kZSByZXR1cm5lZCBlcnJvciA6ICIgPDwgc3RhdHVzOworICAgICAgICBBTWVkaWFGb3JtYXQgKmRlY29kZXJGb3JtYXQgPSBkZWNvZGVyLT5nZXRGb3JtYXQoKTsKIAogICAgICAgICBpZnN0cmVhbSBlbGVTdHJlYW07CiAgICAgICAgIGVsZVN0cmVhbS5vcGVuKG91dHB1dEZpbGVOYW1lLmNfc3RyKCksIGlmc3RyZWFtOjpiaW5hcnkgfCBpZnN0cmVhbTo6YXRlKTsKQEAgLTEwOCwxMSArMTEzLDEzIEBACiAgICAgICAgICAgICBpZiAoZW5jUGFyYW1zLmJpdHJhdGUgPD0gMCB8fCBlbmNQYXJhbXMuZnJhbWVSYXRlIDw9IDApIHsKICAgICAgICAgICAgICAgICBlbmNQYXJhbXMuZnJhbWVSYXRlID0gMjU7CiAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAobWltZSwgInZpZGVvLzNncHAiKSB8fCAhc3RyY21wKG1pbWUsICJ2aWRlby9tcDR2LWVzIikpIHsKLSAgICAgICAgICAgICAgICAgICAgZW5jUGFyYW1zLmJpdHJhdGUgPSA2MDAwMDAgLyogNjAwIEticHMgKi87CisgICAgICAgICAgICAgICAgICAgIGVuY1BhcmFtcy5iaXRyYXRlID0ga0VuY29kZU1pblZpZGVvQml0UmF0ZTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBlbmNQYXJhbXMuYml0cmF0ZSA9IDgwMDAwMDAgLyogOCBNYnBzICovOworICAgICAgICAgICAgICAgICAgICBlbmNQYXJhbXMuYml0cmF0ZSA9IGtFbmNvZGVEZWZhdWx0VmlkZW9CaXRSYXRlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihkZWNvZGVyRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX0ZPUk1BVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW5jUGFyYW1zLmNvbG9yRm9ybWF0KTsKICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfUFJPRklMRSwgJmVuY1BhcmFtcy5wcm9maWxlKTsKICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTEVWRUwsICZlbmNQYXJhbXMubGV2ZWwpOwogICAgICAgICB9IGVsc2UgewpAQCAtMTIwLDggKzEyNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY1BhcmFtcy5zYW1wbGVSYXRlKSk7CiAgICAgICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY1BhcmFtcy5udW1DaGFubmVscykpOwotICAgICAgICAgICAgZW5jUGFyYW1zLmJpdHJhdGUgPQotICAgICAgICAgICAgICAgICAgICBlbmNQYXJhbXMuc2FtcGxlUmF0ZSAqIGVuY1BhcmFtcy5udW1DaGFubmVscyAqIDE2IC8qIGJpdHNQZXJTYW1wbGUgKi87CisgICAgICAgICAgICBlbmNQYXJhbXMuYml0cmF0ZSA9IGtFbmNvZGVEZWZhdWx0QXVkaW9CaXRSYXRlOwogICAgICAgICB9CiAKICAgICAgICAgZW5jb2Rlci0+c2V0dXBFbmNvZGVyKCk7CkBAIC0xMzMsNyArMTM5LDggQEAKICAgICAgICAgZW5jb2Rlci0+ZGVJbml0Q29kZWMoKTsKICAgICAgICAgQUxPR1YoImNvZGVjIDogJXMiLCBjb2RlY05hbWUuY19zdHIoKSk7CiAgICAgICAgIHN0cmluZyBpbnB1dFJlZmVyZW5jZSA9IGdldDwwPihwYXJhbXMpOwotICAgICAgICBlbmNvZGVyLT5kdW1wU3RhdGlzdGljcyhpbnB1dFJlZmVyZW5jZSwgZXh0cmFjdG9yLT5nZXRDbGlwRHVyYXRpb24oKSk7CisgICAgICAgIGVuY29kZXItPmR1bXBTdGF0aXN0aWNzKGlucHV0UmVmZXJlbmNlLCBleHRyYWN0b3ItPmdldENsaXBEdXJhdGlvbigpLCBjb2RlY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhc3luY01vZGUgPyAiYXN5bmMiIDogInN5bmMiKSwgZ0Vudi0+Z2V0U3RhdHNGaWxlKCkpOwogICAgICAgICBlbGVTdHJlYW0uY2xvc2UoKTsKICAgICAgICAgaWYgKG91dEZwKSBmY2xvc2Uob3V0RnApOwogCkBAIC0xNDEsNiArMTQ4LDEwIEBACiAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGZvcm1hdCk7CiAgICAgICAgICAgICBmb3JtYXQgPSBudWxscHRyOwogICAgICAgICB9CisgICAgICAgIGlmIChkZWNvZGVyRm9ybWF0KSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGRlY29kZXJGb3JtYXQpOworICAgICAgICAgICAgZGVjb2RlckZvcm1hdCA9IG51bGxwdHI7CisgICAgICAgIH0KICAgICAgICAgZW5jb2Rlci0+cmVzZXRFbmNvZGVyKCk7CiAgICAgICAgIGRlY29kZXItPmRlSW5pdENvZGVjKCk7CiAgICAgICAgIGZyZWUoaW5wdXRCdWZmZXIpOwpAQCAtMjE0LDggKzIyNSwxMSBAQAogICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwogICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CiAgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGdFbnYtPnNldFN0YXRzRmlsZSgiRW5jb2Rlci5jc3YiKTsKKyAgICAgICAgc3RhdHVzID0gZ0Vudi0+d3JpdGVTdGF0c0hlYWRlcigpOworICAgICAgICBBTE9HVigiU3RhdHMgZmlsZSA9ICVkXG4iLCBzdGF0dXMpOwogICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7Ci0gICAgICAgIEFMT0dEKCJFbmNvZGVyIFRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgICAgIEFMT0dWKCJFbmNvZGVyIFRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRXh0cmFjdG9yVGVzdC5jcHAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRXh0cmFjdG9yVGVzdC5jcHAKaW5kZXggYWQ4ZjFlNi4uZDE0ZDE1YiAxMDA2NDQKLS0tIGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0V4dHJhY3RvclRlc3QuY3BwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9FeHRyYWN0b3JUZXN0LmNwcApAQCAtNDgsOCArNDgsNyBAQAogICAgIEFTU0VSVF9FUShzdGF0dXMsIEFNRURJQV9PSykgPDwgIkV4dHJhY3Rpb24gZmFpbGVkIFxuIjsKIAogICAgIGV4dHJhY3RPYmotPmRlSW5pdEV4dHJhY3RvcigpOwotCi0gICAgZXh0cmFjdE9iai0+ZHVtcFN0YXRpc3RpY3MoR2V0UGFyYW0oKS5maXJzdCk7CisgICAgZXh0cmFjdE9iai0+ZHVtcFN0YXRpc3RpY3MoR2V0UGFyYW0oKS5maXJzdCwgIiIsIGdFbnYtPmdldFN0YXRzRmlsZSgpKTsKIAogICAgIGZjbG9zZShpbnB1dEZwKTsKICAgICBkZWxldGUgZXh0cmFjdE9iajsKQEAgLTc5LDggKzc4LDExIEBACiAgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CiAgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKICAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgZ0Vudi0+c2V0U3RhdHNGaWxlKCJFeHRyYWN0b3IuY3N2Iik7CisgICAgICAgIHN0YXR1cyA9IGdFbnYtPndyaXRlU3RhdHNIZWFkZXIoKTsKKyAgICAgICAgQUxPR1YoIlN0YXRzIGZpbGUgPSAlZFxuIiwgc3RhdHVzKTsKICAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOwotICAgICAgICBBTE9HRCgiIEV4dHJhY3RvciBUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOworICAgICAgICBBTE9HVigiRXh0cmFjdG9yIFRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvTXV4ZXJUZXN0LmNwcCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9NdXhlclRlc3QuY3BwCmluZGV4IGZhMjYzNWQuLjk5MTY0NGIgMTAwNjQ0Ci0tLSBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9NdXhlclRlc3QuY3BwCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9NdXhlclRlc3QuY3BwCkBAIC0xMTMsNyArMTEzLDcgQEAKICAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIk11eCBmYWlsZWQiOwogCiAgICAgICAgIG11eGVyT2JqLT5kZUluaXRNdXhlcigpOwotICAgICAgICBtdXhlck9iai0+ZHVtcFN0YXRpc3RpY3MoR2V0UGFyYW0oKS5maXJzdCArICIuIiArIGZtdC5jX3N0cigpKTsKKyAgICAgICAgbXV4ZXJPYmotPmR1bXBTdGF0aXN0aWNzKEdldFBhcmFtKCkuZmlyc3QgKyAiLiIgKyBmbXQuY19zdHIoKSwgZm10LCBnRW52LT5nZXRTdGF0c0ZpbGUoKSk7CiAgICAgICAgIGZyZWUoaW5wdXRCdWZmZXIpOwogICAgICAgICBmY2xvc2Uob3V0cHV0RnApOwogICAgICAgICBtdXhlck9iai0+cmVzZXRNdXhlcigpOwpAQCAtMTUxLDggKzE1MSwxMSBAQAogICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOwogICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CiAgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGdFbnYtPnNldFN0YXRzRmlsZSgiTXV4ZXIuY3N2Iik7CisgICAgICAgIHN0YXR1cyA9IGdFbnYtPndyaXRlU3RhdHNIZWFkZXIoKTsKKyAgICAgICAgQUxPR1YoIlN0YXRzIGZpbGUgPSAlZFxuIiwgc3RhdHVzKTsKICAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOwotICAgICAgICBBTE9HVigiVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgQUxPR1YoIk11eGVyIFRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9FdmVudExvZ1RhZ3MubG9ndGFncyBiL21lZGlhL3V0aWxzL0V2ZW50TG9nVGFncy5sb2d0YWdzCmluZGV4IDY3ZjBlYTguLmMzOTdmMzQgMTAwNjQ0Ci0tLSBhL21lZGlhL3V0aWxzL0V2ZW50TG9nVGFncy5sb2d0YWdzCisrKyBiL21lZGlhL3V0aWxzL0V2ZW50TG9nVGFncy5sb2d0YWdzCkBAIC0zMSw3ICszMSw3IEBACiAjIDY6IFBlcmNlbnQKICMgRGVmYXVsdCB2YWx1ZSBmb3IgZGF0YSBvZiB0eXBlIGludC9sb25nIGlzIDIgKGJ5dGVzKS4KICMKLSMgU2VlIHN5c3RlbS9jb3JlL2xvZ2NhdC9ldmVudC5sb2d0YWdzIGZvciB0aGUgbWFzdGVyIGNvcHkgb2YgdGhlIHRhZ3MuCisjIFNlZSBzeXN0ZW0vY29yZS9sb2djYXQvZXZlbnQubG9ndGFncyBmb3IgdGhlIG9yaWdpbmFsIGRlZmluaXRpb24gb2YgdGhlIHRhZ3MuCiAKICMgNjEwMDAgLSA2MTE5OSByZXNlcnZlZCBmb3IgYXVkaW9zZXJ2ZXIKIApkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvZnV6emVycy9BbmRyb2lkLmJwIGIvbWVkaWEvdXRpbHMvZnV6emVycy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMTEyM2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9mdXp6ZXJzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1MSBAQAorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJtZWRpYXV0aWxzX2Z1enplcl9kZWZhdWx0cyIsCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLWMrKzJhLWV4dGVuc2lvbnMiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAiYmlvbmljX2xpYmNfcGxhdGZvcm1faGVhZGVycyIsCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgIC8vIEZvciBERUJVR0dFUl9TSUdOQUwKKyAgICAgICAgInN5c3RlbS9jb3JlL2RlYnVnZ2VyZC9pbmNsdWRlIiwKKyAgICBdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibGlibWVkaWF1dGlsc19mdXp6ZXJfYmF0dGVyeV9ub3RpZmllciIsCisgICAgZGVmYXVsdHM6IFsibGlibWVkaWF1dGlsc19mdXp6ZXJfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbIkJhdHRlcnlOb3RpZmllckZ1enouY3BwIl0sCit9CisKK2NjX2Z1enogeworICAgIG5hbWU6ICJsaWJtZWRpYXV0aWxzX2Z1enplcl9zY2hlZHVsaW5nX3BvbGljeV9zZXJ2aWNlIiwKKyAgICBkZWZhdWx0czogWyJsaWJtZWRpYXV0aWxzX2Z1enplcl9kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsiU2NoZWR1bGluZ1BvbGljeVNlcnZpY2VGdXp6LmNwcCJdLAorfQorCitjY19mdXp6IHsKKyAgICBuYW1lOiAibGlibWVkaWF1dGlsc19mdXp6ZXJfc2VydmljZV91dGlsaXRpZXMiLAorICAgIGRlZmF1bHRzOiBbImxpYm1lZGlhdXRpbHNfZnV6emVyX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJTZXJ2aWNlVXRpbGl0aWVzRnV6ei5jcHAiXSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogImxpYm1lZGlhdXRpbHNfZnV6emVyX3RpbWVfY2hlY2siLAorICAgIGRlZmF1bHRzOiBbImxpYm1lZGlhdXRpbHNfZnV6emVyX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJUaW1lQ2hlY2tGdXp6LmNwcCJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvZnV6emVycy9CYXR0ZXJ5Tm90aWZpZXJGdXp6LmNwcCBiL21lZGlhL3V0aWxzL2Z1enplcnMvQmF0dGVyeU5vdGlmaWVyRnV6ei5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBiM2NjZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL2Z1enplcnMvQmF0dGVyeU5vdGlmaWVyRnV6ei5jcHAKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworI2luY2x1ZGUgImZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaCIKKyNpbmNsdWRlICJtZWRpYXV0aWxzL0JhdHRlcnlOb3RpZmllci5oIgorCitzdGF0aWMgY29uc3RleHByIGludCBrTWF4T3BlcmF0aW9ucyA9IDMwOworc3RhdGljIGNvbnN0ZXhwciBpbnQga01heFN0cmluZ0xlbmd0aCA9IDUwMDsKK3VzaW5nIGFuZHJvaWQ6OkJhdHRlcnlOb3RpZmllcjsKKworc3RkOjp2ZWN0b3I8c3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6c3RyaW5nIC8qZmxhc2hsaWdodF9uYW1lKi8sIHN0ZDo6c3RyaW5nIC8qY2FtZXJhX25hbWUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCAvKnZpZGVvX2lkKi8sIHVpZF90IC8qYXVkaW9faWQqLywgdWlkX3QgLypsaWdodF9pZCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IC8qY2FtZXJhX2lkKi8pPj4KKyAgICBvcGVyYXRpb25zID0geworICAgICAgICBbXShzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHVpZF90LCB1aWRfdCwgdWlkX3QsIHVpZF90KSAtPiB2b2lkIHsKKyAgICAgICAgICAgIEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKS5ub3RlUmVzZXRWaWRlbygpOworICAgICAgICB9LAorICAgICAgICBbXShzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHVpZF90LCB1aWRfdCwgdWlkX3QsIHVpZF90KSAtPiB2b2lkIHsKKyAgICAgICAgICAgIEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKS5ub3RlUmVzZXRBdWRpbygpOworICAgICAgICB9LAorICAgICAgICBbXShzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHVpZF90LCB1aWRfdCwgdWlkX3QsIHVpZF90KSAtPiB2b2lkIHsKKyAgICAgICAgICAgIEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKS5ub3RlUmVzZXRGbGFzaGxpZ2h0KCk7CisgICAgICAgIH0sCisgICAgICAgIFtdKHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgdWlkX3QsIHVpZF90LCB1aWRfdCwgdWlkX3QpIC0+IHZvaWQgeworICAgICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVSZXNldENhbWVyYSgpOworICAgICAgICB9LAorICAgICAgICBbXShzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHVpZF90IHZpZGVvX2lkLCB1aWRfdCwgdWlkX3QsIHVpZF90KSAtPiB2b2lkIHsKKyAgICAgICAgICAgIEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKS5ub3RlU3RhcnRWaWRlbyh2aWRlb19pZCk7CisgICAgICAgIH0sCisgICAgICAgIFtdKHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgdWlkX3QgdmlkZW9faWQsIHVpZF90LCB1aWRfdCwgdWlkX3QpIC0+IHZvaWQgeworICAgICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVTdG9wVmlkZW8odmlkZW9faWQpOworICAgICAgICB9LAorICAgICAgICBbXShzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcsIHVpZF90LCB1aWRfdCBhdWRpb19pZCwgdWlkX3QsIHVpZF90KSAtPiB2b2lkIHsKKyAgICAgICAgICAgIEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKS5ub3RlU3RhcnRBdWRpbyhhdWRpb19pZCk7CisgICAgICAgIH0sCisgICAgICAgIFtdKHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywgdWlkX3QsIHVpZF90IGF1ZGlvX2lkLCB1aWRfdCwgdWlkX3QpIC0+IHZvaWQgeworICAgICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVTdG9wQXVkaW8oYXVkaW9faWQpOworICAgICAgICB9LAorICAgICAgICBbXShzdGQ6OnN0cmluZyBmbGFzaGxpZ2h0X25hbWUsIHN0ZDo6c3RyaW5nLCB1aWRfdCwgdWlkX3QsIHVpZF90IGxpZ2h0X2lkLCB1aWRfdCkgLT4gdm9pZCB7CisgICAgICAgICAgICBhbmRyb2lkOjpTdHJpbmc4IG5hbWUoZmxhc2hsaWdodF9uYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVGbGFzaGxpZ2h0T24obmFtZSwgbGlnaHRfaWQpOworICAgICAgICB9LAorICAgICAgICBbXShzdGQ6OnN0cmluZyBmbGFzaGxpZ2h0X25hbWUsIHN0ZDo6c3RyaW5nLCB1aWRfdCwgdWlkX3QsIHVpZF90IGxpZ2h0X2lkLCB1aWRfdCkgLT4gdm9pZCB7CisgICAgICAgICAgICBhbmRyb2lkOjpTdHJpbmc4IG5hbWUoZmxhc2hsaWdodF9uYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVGbGFzaGxpZ2h0T2ZmKG5hbWUsIGxpZ2h0X2lkKTsKKyAgICAgICAgfSwKKyAgICAgICAgW10oc3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nIGNhbWVyYV9uYW1lLCB1aWRfdCwgdWlkX3QsIHVpZF90LCB1aWRfdCBjYW1lcmFfaWQpIC0+IHZvaWQgeworICAgICAgICAgICAgYW5kcm9pZDo6U3RyaW5nOCBuYW1lKGNhbWVyYV9uYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVTdGFydENhbWVyYShuYW1lLCBjYW1lcmFfaWQpOworICAgICAgICB9LAorICAgICAgICBbXShzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmcgY2FtZXJhX25hbWUsIHVpZF90LCB1aWRfdCwgdWlkX3QsIHVpZF90IGNhbWVyYV9pZCkgLT4gdm9pZCB7CisgICAgICAgICAgICBhbmRyb2lkOjpTdHJpbmc4IG5hbWUoY2FtZXJhX25hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBCYXR0ZXJ5Tm90aWZpZXI6OmdldEluc3RhbmNlKCkubm90ZVN0b3BDYW1lcmEobmFtZSwgY2FtZXJhX2lkKTsKKyAgICAgICAgfSwKK307CisKK2V4dGVybiAiQyIgaW50IExMVk1GdXp6ZXJUZXN0T25lSW5wdXQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBGdXp6ZWREYXRhUHJvdmlkZXIgZGF0YV9wcm92aWRlcihkYXRhLCBzaXplKTsKKyAgICBzdGQ6OnN0cmluZyBjYW1lcmFfbmFtZSA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZVJhbmRvbUxlbmd0aFN0cmluZyhrTWF4U3RyaW5nTGVuZ3RoKTsKKyAgICBzdGQ6OnN0cmluZyBmbGFzaGxpZ2h0X25hbWUgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVSYW5kb21MZW5ndGhTdHJpbmcoa01heFN0cmluZ0xlbmd0aCk7CisgICAgdWlkX3QgdmlkZW9faWQgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbDx1aWRfdD4oKTsKKyAgICB1aWRfdCBhdWRpb19pZCA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZUludGVncmFsPHVpZF90PigpOworICAgIHVpZF90IGxpZ2h0X2lkID0gZGF0YV9wcm92aWRlci5Db25zdW1lSW50ZWdyYWw8dWlkX3Q+KCk7CisgICAgdWlkX3QgY2FtZXJhX2lkID0gZGF0YV9wcm92aWRlci5Db25zdW1lSW50ZWdyYWw8dWlkX3Q+KCk7CisgICAgc2l6ZV90IG9wc19ydW4gPSAwOworICAgIHdoaWxlIChkYXRhX3Byb3ZpZGVyLnJlbWFpbmluZ19ieXRlcygpID4gMCAmJiBvcHNfcnVuKysgPCBrTWF4T3BlcmF0aW9ucykgeworICAgICAgICB1aW50OF90IG9wID0gZGF0YV9wcm92aWRlci5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQ4X3Q+KDAsIG9wZXJhdGlvbnMuc2l6ZSgpIC0gMSk7CisgICAgICAgIG9wZXJhdGlvbnNbb3BdKGZsYXNobGlnaHRfbmFtZSwgY2FtZXJhX25hbWUsIHZpZGVvX2lkLCBhdWRpb19pZCwgbGlnaHRfaWQsIGNhbWVyYV9pZCk7CisgICAgfQorICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvZnV6emVycy9TY2hlZHVsaW5nUG9saWN5U2VydmljZUZ1enouY3BwIGIvbWVkaWEvdXRpbHMvZnV6emVycy9TY2hlZHVsaW5nUG9saWN5U2VydmljZUZ1enouY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MjE4NTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9mdXp6ZXJzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlRnV6ei5jcHAKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX1RBRyAiQmF0dGVyeU5vdGlmaWVyRnV6emVyIgorI2luY2x1ZGUgPGJpbmRlci9JQmF0dGVyeVN0YXRzLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9sb2cuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmg+CisjaW5jbHVkZSAiZnV6emVyL0Z1enplZERhdGFQcm92aWRlci5oIgordXNpbmcgYW5kcm9pZDo6SUJhdHRlcnlTdGF0czsKK3VzaW5nIGFuZHJvaWQ6OklCaW5kZXI7Cit1c2luZyBhbmRyb2lkOjpJSW50ZXJmYWNlOwordXNpbmcgYW5kcm9pZDo6SVNlcnZpY2VNYW5hZ2VyOwordXNpbmcgYW5kcm9pZDo6c3A7Cit1c2luZyBhbmRyb2lkOjpTdHJpbmcxNjsKK3VzaW5nIGFuZHJvaWQ6OmRlZmF1bHRTZXJ2aWNlTWFuYWdlcjsKK3VzaW5nIGFuZHJvaWQ6OnJlcXVlc3RDcHVzZXRCb29zdDsKK3VzaW5nIGFuZHJvaWQ6OnJlcXVlc3RQcmlvcml0eTsKK3NwPElCYXR0ZXJ5U3RhdHM+IGdldEJhdHRlcnlTZXJ2aWNlKCkgeworICAgIHNwPElCYXR0ZXJ5U3RhdHM+IGJhdHRlcnlTdGF0U2VydmljZTsKKyAgICBjb25zdCBzcDxJU2VydmljZU1hbmFnZXI+IHNtKGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpKTsKKyAgICBpZiAoc20gIT0gbnVsbHB0cikgeworICAgICAgICBjb25zdCBTdHJpbmcxNiBuYW1lKCJiYXR0ZXJ5c3RhdHMiKTsKKyAgICAgICAgYmF0dGVyeVN0YXRTZXJ2aWNlID0gY2hlY2tlZF9pbnRlcmZhY2VfY2FzdDxJQmF0dGVyeVN0YXRzPihzbS0+Y2hlY2tTZXJ2aWNlKG5hbWUpKTsKKyAgICAgICAgaWYgKGJhdHRlcnlTdGF0U2VydmljZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HVygiYmF0dGVyeXN0YXRzIHNlcnZpY2UgdW5hdmFpbGFibGUhIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYmF0dGVyeVN0YXRTZXJ2aWNlOworfQorZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEZ1enplZERhdGFQcm92aWRlciBkYXRhX3Byb3ZpZGVyKGRhdGEsIHNpemUpOworICAgIHNwPElCYXR0ZXJ5U3RhdHM+IGJhdHRlcnlTdGF0U2VydmljZSA9IGdldEJhdHRlcnlTZXJ2aWNlKCk7CisgICAgLy8gVGhlcmUgaXMgc29tZSBzdGF0ZSBoZXJlLCBidXQgaXQncyBtb3N0bHkgZm9jdXNlZCBhcm91bmQgdGhyZWFkLXNhZmV0eSwgc28KKyAgICAvLyB3ZSB3b24ndCB3b3JyeSBhYm91dCBvcmRlci4KKyAgICBpbnQzMl90IHByaW9yaXR5ID0gZGF0YV9wcm92aWRlci5Db25zdW1lSW50ZWdyYWw8aW50MzJfdD4oKTsKKyAgICBib29sIGlzX2Zvcl9hcHAgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVCb29sKCk7CisgICAgYm9vbCBhc3luYyA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZUJvb2woKTsKKyAgICByZXF1ZXN0UHJpb3JpdHkoZ2V0cGlkKCksIGdldHRpZCgpLCBwcmlvcml0eSwgaXNfZm9yX2FwcCwgYXN5bmMpOworICAgIC8vIFRPRE86IFZlcmlmeSBhbmQgcmUtZW5hYmxlIGluIEFPU1AgKFIpLgorICAgIC8vIGJvb2wgZW5hYmxlID0gZGF0YV9wcm92aWRlci5Db25zdW1lQm9vbCgpOworICAgIC8vIFdlIGFyZSBqdXN0IHVzaW5nIGJhdHRlcnlzdGF0cyB0byBhdm9pZCB0aGUgbmVlZAorICAgIC8vIHRvIHJlZ2lzdGVyIGEgbmV3IHNlcnZpY2UuCisgICAgLy8gcmVxdWVzdENwdXNldEJvb3N0KGVuYWJsZSwgSUludGVyZmFjZTo6YXNCaW5kZXIoYmF0dGVyeVN0YXRTZXJ2aWNlKSk7CisgICAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL2Z1enplcnMvU2VydmljZVV0aWxpdGllc0Z1enouY3BwIGIvbWVkaWEvdXRpbHMvZnV6emVycy9TZXJ2aWNlVXRpbGl0aWVzRnV6ei5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QxNDFiNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL2Z1enplcnMvU2VydmljZVV0aWxpdGllc0Z1enouY3BwCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxmY250bC5oPgorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgImZ1enplci9GdXp6ZWREYXRhUHJvdmlkZXIuaCIKKyNpbmNsdWRlICJtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaCIKKworc3RhdGljIGNvbnN0ZXhwciBpbnQga01heE9wZXJhdGlvbnMgPSA1MDsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtNYXhTdHJpbmdMZW4gPSAyNTY7CisKK2NvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6ZnVuY3Rpb248dm9pZChGdXp6ZWREYXRhUHJvdmlkZXIqLCBhbmRyb2lkOjpNZWRpYVBhY2thZ2VNYW5hZ2VyKT4+CisgICAgb3BlcmF0aW9ucyA9IHsKKyAgICAgICAgW10oRnV6emVkRGF0YVByb3ZpZGVyKiBkYXRhX3Byb3ZpZGVyLCBhbmRyb2lkOjpNZWRpYVBhY2thZ2VNYW5hZ2VyIHBtKSAtPiB2b2lkIHsKKyAgICAgICAgICAgIHVpZF90IHVpZCA9IGRhdGFfcHJvdmlkZXItPkNvbnN1bWVJbnRlZ3JhbDx1aWRfdD4oKTsKKyAgICAgICAgICAgIHBtLmFsbG93UGxheWJhY2tDYXB0dXJlKHVpZCk7CisgICAgICAgIH0sCisgICAgICAgIFtdKEZ1enplZERhdGFQcm92aWRlciogZGF0YV9wcm92aWRlciwgYW5kcm9pZDo6TWVkaWFQYWNrYWdlTWFuYWdlciBwbSkgLT4gdm9pZCB7CisgICAgICAgICAgICBpbnQgc3BhY2VzID0gZGF0YV9wcm92aWRlci0+Q29uc3VtZUludGVncmFsPGludD4oKTsKKworICAgICAgICAgICAgLy8gRHVtcCBldmVyeXRoaW5nIGludG8gL2Rldi9udWxsCisgICAgICAgICAgICBpbnQgZmQgPSBvcGVuKCIvZGV2L251bGwiLCBPX1dST05MWSk7CisgICAgICAgICAgICBwbS5kdW1wKGZkLCBzcGFjZXMpOworICAgICAgICAgICAgY2xvc2UoZmQpOworICAgICAgICB9LAorfTsKKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEZ1enplZERhdGFQcm92aWRlciBkYXRhX3Byb3ZpZGVyKGRhdGEsIHNpemUpOworICAgIHVpZF90IHVpZCA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZUludGVncmFsPHVpZF90PigpOworICAgIHBpZF90IHBpZCA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZUludGVncmFsPHBpZF90PigpOworCisgICAgLy8gVGhlcmUgaXMgbm90IHN0YXRlIGhlcmUsIGFuZCBvcmRlciBpcyBub3Qgc2lnbmlmaWNhbnQsCisgICAgLy8gc28gd2UgY2FuIHNpbXBseSBjYWxsIGFsbCBvZiB0aGUgdGFyZ2V0IGZ1bmN0aW9ucworICAgIGFuZHJvaWQ6OmlzU2VydmljZVVpZCh1aWQpOworICAgIGFuZHJvaWQ6OmlzQXVkaW9TZXJ2ZXJVaWQodWlkKTsKKyAgICBhbmRyb2lkOjppc0F1ZGlvU2VydmVyT3JTeXN0ZW1TZXJ2ZXJVaWQodWlkKTsKKyAgICBhbmRyb2lkOjppc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZCh1aWQpOworICAgIHN0ZDo6c3RyaW5nIHBhY2thZ2VOYW1lU3RyID0gZGF0YV9wcm92aWRlci5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhTdHJpbmdMZW4pOworICAgIGFuZHJvaWQ6OlN0cmluZzE2IG9wUGFja2FnZU5hbWUocGFja2FnZU5hbWVTdHIuY19zdHIoKSk7CisgICAgYW5kcm9pZDo6cmVjb3JkaW5nQWxsb3dlZChvcFBhY2thZ2VOYW1lLCBwaWQsIHVpZCk7CisgICAgYW5kcm9pZDo6c3RhcnRSZWNvcmRpbmcob3BQYWNrYWdlTmFtZSwgcGlkLCB1aWQpOworICAgIGFuZHJvaWQ6OmZpbmlzaFJlY29yZGluZyhvcFBhY2thZ2VOYW1lLCB1aWQpOworICAgIGFuZHJvaWQ6OmNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQocGlkLCB1aWQpOworICAgIGFuZHJvaWQ6OmNhcHR1cmVNZWRpYU91dHB1dEFsbG93ZWQocGlkLCB1aWQpOworICAgIGFuZHJvaWQ6OmNhcHR1cmVIb3R3b3JkQWxsb3dlZChvcFBhY2thZ2VOYW1lLCBwaWQsIHVpZCk7CisgICAgYW5kcm9pZDo6bW9kaWZ5UGhvbmVTdGF0ZUFsbG93ZWQodWlkLCBwaWQpOworICAgIGFuZHJvaWQ6OmJ5cGFzc0ludGVycnVwdGlvblBvbGljeUFsbG93ZWQodWlkLCBwaWQpOworICAgIGFuZHJvaWQ6OnNldHRpbmdzQWxsb3dlZCgpOworICAgIGFuZHJvaWQ6Om1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKTsKKyAgICBhbmRyb2lkOjptb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZCgpOworICAgIGFuZHJvaWQ6OmR1bXBBbGxvd2VkKCk7CisKKyAgICAvLyBNZWRpYVBhY2thZ2VNYW5hZ2VyIGRvZXMgaGF2ZSBzdGF0ZSwgc28gd2UgbmVlZCB0aGUgZnV6emVyIHRvIGRlY2lkZSBvcmRlcgorICAgIGFuZHJvaWQ6Ok1lZGlhUGFja2FnZU1hbmFnZXIgcGFja2FnZU1hbmFnZXI7CisgICAgc2l6ZV90IG9wc19ydW4gPSAwOworICAgIHdoaWxlIChkYXRhX3Byb3ZpZGVyLnJlbWFpbmluZ19ieXRlcygpID4gMCAmJiBvcHNfcnVuKysgPCBrTWF4T3BlcmF0aW9ucykgeworICAgICAgICB1aW50OF90IG9wID0gZGF0YV9wcm92aWRlci5Db25zdW1lSW50ZWdyYWxJblJhbmdlPHVpbnQ4X3Q+KDAsIG9wZXJhdGlvbnMuc2l6ZSgpIC0gMSk7CisgICAgICAgIG9wZXJhdGlvbnNbb3BdKCZkYXRhX3Byb3ZpZGVyLCBwYWNrYWdlTWFuYWdlcik7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9mdXp6ZXJzL1RpbWVDaGVja0Z1enouY3BwIGIvbWVkaWEvdXRpbHMvZnV6emVycy9UaW1lQ2hlY2tGdXp6LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWI2YmE2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvZnV6emVycy9UaW1lQ2hlY2tGdXp6LmNwcApAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKKyNpbmNsdWRlICJmdXp6ZXIvRnV6emVkRGF0YVByb3ZpZGVyLmgiCisjaW5jbHVkZSAibWVkaWF1dGlscy9UaW1lQ2hlY2suaCIKKworc3RhdGljIGNvbnN0ZXhwciBpbnQga01heFN0cmluZ0xlbiA9IDI1NjsKKworLy8gV2hpbGUgaXQgbWlnaHQgYmUgaW50ZXJlc3RpbmcgdG8gdGVzdCBsb25nLXJ1bm5pbmcKKy8vIGpvYnMsIGl0IHNlZW1zIHVubGlrZWx5IGl0J2QgbGVhZCB0byB0aGUgdHlwZXMgb2YgY3Jhc2hlcworLy8gd2UncmUgbG9va2luZyBmb3IsIGFuZCB3b3VsZCBtZWFuIGEgc2lnbmlmaWNhbnQgaW5jcmVhc2UgaW4gZnV6emVyIHRpbWUuCisvLyBUaGVyZWZvcmUsIHdlIGFyZSBzZXR0aW5nIGEgbG93IGNhcC4KK3N0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga01heFRpbWVvdXRNcyA9IDEwMDA7CitzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtNaW5UaW1lb3V0TXMgPSAyMDA7CitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgRnV6emVkRGF0YVByb3ZpZGVyIGRhdGFfcHJvdmlkZXIoZGF0YSwgc2l6ZSk7CisKKyAgICAvLyBUaGVyZSdzIGVzc2VudGlhbGx5IDUgb3BlcmF0aW9ucyB0aGF0IHdlIGNhbiBhY2Nlc3MgaW4gdGhpcyBjbGFzcworICAgIC8vIDEuIFRoZSB0aW1lIGl0IHRha2VzIHRvIHJ1biB0aGlzIG9wZXJhdGlvbi4gQXMgbWVudGlvbmVkIGFib3ZlLAorICAgIC8vICAgIGxvbmctcnVubmluZyB0YXNrcyBhcmUgbm90IGdvb2QgZm9yIGZ1enppbmcsIGJ1dCB0aGVyZSB3aWxsIGJlCisgICAgLy8gICAgc29tZSBjaGFuZ2UgaW4gdGhlIHJ1biB0aW1lLgorICAgIHVpbnQzMl90IHRpbWVvdXRNcyA9CisgICAgICAgIGRhdGFfcHJvdmlkZXIuQ29uc3VtZUludGVncmFsSW5SYW5nZTx1aW50MzJfdD4oa01pblRpbWVvdXRNcywga01heFRpbWVvdXRNcyk7CisgICAgdWludDhfdCBwaWRfc2l6ZSA9IGRhdGFfcHJvdmlkZXIuQ29uc3VtZUludGVncmFsPHVpbnQ4X3Q+KCk7CisgICAgc3RkOjp2ZWN0b3I8cGlkX3Q+IHBpZHMocGlkX3NpemUpOworICAgIGZvciAoYXV0byYgcGlkIDogcGlkcykgeworICAgICAgICBwaWQgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbDxwaWRfdD4oKTsKKyAgICB9CisKKyAgICAvLyAyLiBXZSBhbHNvIGhhdmUgc2V0QXVkaW9IYWxQaWRzLCB3aGljaCBpcyBwb3B1bGF0ZWQgd2l0aCB0aGUgcGlkcyBzZXQKKyAgICAvLyBhYm92ZS4KKyAgICBhbmRyb2lkOjpUaW1lQ2hlY2s6OnNldEF1ZGlvSGFsUGlkcyhwaWRzKTsKKyAgICBzdGQ6OnN0cmluZyBuYW1lID0gZGF0YV9wcm92aWRlci5Db25zdW1lUmFuZG9tTGVuZ3RoU3RyaW5nKGtNYXhTdHJpbmdMZW4pOworCisgICAgLy8gMy4gVGhlIGNvbnN0cnVjdG9yLCB3aGljaCBpcyBmdXp6ZWQgaGVyZToKKyAgICBhbmRyb2lkOjpUaW1lQ2hlY2sgdGltZUNoZWNrKG5hbWUuY19zdHIoKSwgdGltZW91dE1zKTsKKyAgICAvLyBXZSB3aWxsIGxlYXZlIHNvbWUgYnVmZmVyIHRvIGF2b2lkIHNsZWVwaW5nIHRvbyBsb25nCisgICAgdWludDhfdCBzbGVlcF9hbW91bnRfbXMgPSBkYXRhX3Byb3ZpZGVyLkNvbnN1bWVJbnRlZ3JhbEluUmFuZ2U8dWludDhfdD4oMCwgdGltZW91dE1zIC8gMik7CisKKyAgICAvLyBXZSB3YW50IHRvIG1ha2Ugc3VyZSB3ZSBjYW4gY292ZXIgdGhlIHRpbWUgb3V0IGZ1bmN0aW9uYWxpdHkuCisgICAgaWYgKHNsZWVwX2Ftb3VudF9tcykgeworICAgICAgICBhdXRvIG1zID0gc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyhzbGVlcF9hbW91bnRfbXMpOworICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3IobXMpOworICAgIH0KKworICAgIC8vIDQuIEZpbmFsbHksIHRoZSBkZXN0cnVjdG9yIG9uIHRpbWVjaGVjay4gVGhlc2Ugc2VlbSB0byBiZSB0aGUgb25seSBmYWN0b3JzCisgICAgLy8gaW4gcGxheS4KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKaW5kZXggNzY0ZmRjMy4uZWY3NDZmNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAKQEAgLTY4NCw4ICs2ODQsOCBAQAogCiBzcDxOQkxvZzo6V3JpdGVyPiBBdWRpb0ZsaW5nZXI6Om5ld1dyaXRlcl9sKHNpemVfdCBzaXplLCBjb25zdCBjaGFyICpuYW1lKQogewotICAgIC8vIElmIHRoZXJlIGlzIG5vIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIGxvZ3MsIHJldHVybiBhIGR1bW15IHdyaXRlciB0aGF0IGRvZXMgbm90aGluZy4KLSAgICAvLyBTaW1pbGFybHkgaWYgd2UgY2FuJ3QgY29udGFjdCB0aGUgbWVkaWEubG9nIHNlcnZpY2UsIGFsc28gcmV0dXJuIGEgZHVtbXkgd3JpdGVyLgorICAgIC8vIElmIHRoZXJlIGlzIG5vIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIGxvZ3MsIHJldHVybiBhIG5vLW9wIHdyaXRlciB0aGF0IGRvZXMgbm90aGluZy4KKyAgICAvLyBTaW1pbGFybHkgaWYgd2UgY2FuJ3QgY29udGFjdCB0aGUgbWVkaWEubG9nIHNlcnZpY2UsIGFsc28gcmV0dXJuIGEgbm8tb3Agd3JpdGVyLgogICAgIGlmIChtTG9nTWVtb3J5RGVhbGVyID09IDAgfHwgc01lZGlhTG9nU2VydmljZSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBuZXcgTkJMb2c6OldyaXRlcigpOwogICAgIH0KQEAgLTcxMSw3ICs3MTEsNyBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8vIEV2ZW4gYWZ0ZXIgZ2FyYmFnZS1jb2xsZWN0aW5nIGFsbCBvbGQgd3JpdGVycywgdGhlcmUgaXMgc3RpbGwgbm90IGVub3VnaCBtZW1vcnksCi0gICAgICAgIC8vIHNvIHJldHVybiBhIGR1bW15IHdyaXRlcgorICAgICAgICAvLyBzbyByZXR1cm4gYSBuby1vcCB3cml0ZXIKICAgICAgICAgcmV0dXJuIG5ldyBOQkxvZzo6V3JpdGVyKCk7CiAgICAgfQogc3VjY2VzczoKQEAgLTEyODQsOSArMTI4NCw5IEBACiAgICAgfQogCiAgICAgLy8gTm93IHNldCB0aGUgbWFzdGVyIG11dGUgaW4gZWFjaCBwbGF5YmFjayB0aHJlYWQuICBQbGF5YmFjayB0aHJlYWRzCi0gICAgLy8gYXNzaWduZWQgdG8gSEFMcyB3aGljaCBkbyBub3QgaGF2ZSBtYXN0ZXIgbXV0ZSBzdXBwb3J0IHdpbGwgYXBwbHkgbWFzdGVyCi0gICAgLy8gbXV0ZSBkdXJpbmcgdGhlIG1peCBvcGVyYXRpb24uICBUaHJlYWRzIHdpdGggSEFMcyB3aGljaCBkbyBzdXBwb3J0IG1hc3RlcgotICAgIC8vIG11dGUgd2lsbCBzaW1wbHkgaWdub3JlIHRoZSBzZXR0aW5nLgorICAgIC8vIGFzc2lnbmVkIHRvIEhBTHMgd2hpY2ggZG8gbm90IGhhdmUgbWFzdGVyIG11dGUgc3VwcG9ydCB3aWxsIGFwcGx5IG1hc3RlciBtdXRlCisgICAgLy8gZHVyaW5nIHRoZSBtaXggb3BlcmF0aW9uLiAgVGhyZWFkcyB3aXRoIEhBTHMgd2hpY2ggZG8gc3VwcG9ydCBtYXN0ZXIgbXV0ZQorICAgIC8vIHdpbGwgc2ltcGx5IGlnbm9yZSB0aGUgc2V0dGluZy4KICAgICBWZWN0b3I8Vm9sdW1lSW50ZXJmYWNlICo+IHZvbHVtZUludGVyZmFjZXMgPSBnZXRBbGxWb2x1bWVJbnRlcmZhY2VzX2woKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZvbHVtZUludGVyZmFjZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgdm9sdW1lSW50ZXJmYWNlc1tpXS0+c2V0TWFzdGVyTXV0ZShtdXRlZCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKaW5kZXggM2RmZWI4My4uNTI5Yjg3YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcApAQCAtMjkyLDYgKzI5Miw5IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBQcmV2ZW50IGNhbGxzIHRvIHByb2Nlc3MoKSBhbmQgb3RoZXIgZnVuY3Rpb25zIG9uIGVmZmVjdCBpbnRlcmZhY2UgZnJvbSBub3cgb24uCisgICAgLy8gVGhlIGVmZmVjdCBlbmdpbmUgd2lsbCBiZSByZWxlYXNlZCBieSB0aGUgZGVzdHJ1Y3RvciB3aGVuIHRoZSBsYXN0IHN0cm9uZyByZWZlcmVuY2Ugb24KKyAgICAvLyB0aGlzIG9iamVjdCBpcyByZWxlYXNlZCB3aGljaCBjYW4gaGFwcGVuIGFmdGVyIG5leHQgcHJvY2VzcyBpcyBjYWxsZWQuCiAgICAgaWYgKG1IYW5kbGVzLnNpemUoKSA9PSAwICYmICFtUGlubmVkKSB7CiAgICAgICAgIG1TdGF0ZSA9IERFU1RST1lFRDsKICAgICB9CkBAIC01NjUsMjAgKzU2OCw2IEBACiAKIH0KIAotc3NpemVfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6cmVtb3ZlSGFuZGxlX2woRWZmZWN0SGFuZGxlICpoYW5kbGUpCi17Ci0gICAgc3NpemVfdCBzdGF0dXMgPSBFZmZlY3RCYXNlOjpyZW1vdmVIYW5kbGVfbChoYW5kbGUpOwotCi0gICAgLy8gUHJldmVudCBjYWxscyB0byBwcm9jZXNzKCkgYW5kIG90aGVyIGZ1bmN0aW9ucyBvbiBlZmZlY3QgaW50ZXJmYWNlIGZyb20gbm93IG9uLgotICAgIC8vIFRoZSBlZmZlY3QgZW5naW5lIHdpbGwgYmUgcmVsZWFzZWQgYnkgdGhlIGRlc3RydWN0b3Igd2hlbiB0aGUgbGFzdCBzdHJvbmcgcmVmZXJlbmNlIG9uCi0gICAgLy8gdGhpcyBvYmplY3QgaXMgcmVsZWFzZWQgd2hpY2ggY2FuIGhhcHBlbiBhZnRlciBuZXh0IHByb2Nlc3MgaXMgY2FsbGVkLgotICAgIGlmIChzdGF0dXMgPT0gMCAmJiAhbVBpbm5lZCkgewotICAgICAgICBtRWZmZWN0SW50ZXJmYWNlLT5jbG9zZSgpOwotICAgIH0KLQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KIGJvb2wgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnVwZGF0ZVN0YXRlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5oCmluZGV4IDI4MjYyOTcuLjJjNzlhYzUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaApAQCAtMTQ0LDcgKzE0NCw3IEBACiAgICAgc3RhdHVzX3QgYWRkSGFuZGxlKEVmZmVjdEhhbmRsZSAqaGFuZGxlKTsKICAgICBzc2l6ZV90IGRpc2Nvbm5lY3RIYW5kbGUoRWZmZWN0SGFuZGxlICpoYW5kbGUsIGJvb2wgdW5waW5JZkxhc3QpOwogICAgIHNzaXplX3QgcmVtb3ZlSGFuZGxlKEVmZmVjdEhhbmRsZSAqaGFuZGxlKTsKLSAgICB2aXJ0dWFsIHNzaXplX3QgcmVtb3ZlSGFuZGxlX2woRWZmZWN0SGFuZGxlICpoYW5kbGUpOworICAgIHNzaXplX3QgcmVtb3ZlSGFuZGxlX2woRWZmZWN0SGFuZGxlICpoYW5kbGUpOwogICAgIEVmZmVjdEhhbmRsZSogY29udHJvbEhhbmRsZV9sKCk7CiAgICAgYm9vbCBwdXJnZUhhbmRsZXMoKTsKIApAQCAtMjQwLDggKzI0MCw2IEBACiAgICAgICAgIHJldHVybiBtT3V0QnVmZmVyICE9IDAgPyByZWludGVycHJldF9jYXN0PGludDE2X3QqPihtT3V0QnVmZmVyLT5wdHIoKSkgOiBOVUxMOwogICAgIH0KIAotICAgIHNzaXplX3QgcmVtb3ZlSGFuZGxlX2woRWZmZWN0SGFuZGxlICpoYW5kbGUpIG92ZXJyaWRlOwotCiAgICAgc3RhdHVzX3QgICAgICAgICBzZXREZXZpY2VzKGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpOwogICAgIHN0YXR1c190ICAgICAgICAgc2V0SW5wdXREZXZpY2UoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKTsKICAgICBzdGF0dXNfdCAgICAgICAgIHNldFZvbHVtZSh1aW50MzJfdCAqbGVmdCwgdWludDMyX3QgKnJpZ2h0LCBib29sIGNvbnRyb2xsZXIpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcAppbmRleCAzZWFjYzhjLi5jZDNjNzQzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcApAQCAtMjcsNyArMjcsNiBAQAogCiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgPHRpbWUuaD4KLSNpbmNsdWRlIDx1dGlscy9EZWJ1Zy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CkBAIC00MCw2ICszOSw3IEBACiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2hhbm5lbHMuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9mb3JtYXQuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9tb25vX2JsZW5kLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2JpdG9wcy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvTWl4ZXIuaD4KICNpbmNsdWRlICJGYXN0TWl4ZXIuaCIKICNpbmNsdWRlICJUeXBlZExvZ2dlci5oIgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcAppbmRleCBhNDJlMDljLi4zZjIwMjgyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcApAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgPGNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmg+CiAjZW5kaWYKICNlbmRpZgotI2luY2x1ZGUgPHV0aWxzL0RlYnVnLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSAiRmFzdE1peGVyRHVtcFN0YXRlLmgiCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9PV05FUlMgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvT1dORVJTCmluZGV4IGQwMmQ5ZTAuLjAzNGQxNjEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9PV05FUlMKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL09XTkVSUwpAQCAtMSw0ICsxLDQgQEAKK2drYXN0ZW5AZ29vZ2xlLmNvbQogaHVuZ2FAZ29vZ2xlLmNvbQogam10cml2aUBnb29nbGUuY29tCiBtbmFnYW5vdkBnb29nbGUuY29tCi1na2FzdGVuQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcAppbmRleCAxZDAxNDdkLi5jNWQxY2M3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2JpdG9wcy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Db250YWluZXJzLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9EZXZpY2VUeXBlQWRkci5oPgpAQCAtMzQ4Nyw3ICszNDg4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gbGF0ZW5jeSBvZiA1IHNlY29uZHMpLgogICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgbWluTGF0ZW5jeSA9IDAuLCBtYXhMYXRlbmN5ID0gNTAwMC47CiAgICAgICAgICAgICAgICAgICAgIGlmIChsYXRlbmN5TXMgPj0gbWluTGF0ZW5jeSAmJiBsYXRlbmN5TXMgPD0gbWF4TGF0ZW5jeSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm5ldyBkb3duc3RyZWFtIGxhdGVuY3kgJWxmIG1zIiwgbGF0ZW5jeU1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWVigibmV3IGRvd25zdHJlYW0gbGF0ZW5jeSAlbGYgbXMiLCBsYXRlbmN5TXMpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIm91dCBvZiByYW5nZSBkb3duc3RyZWFtIGxhdGVuY3kgJWxmIG1zIiwgbGF0ZW5jeU1zKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYXRlbmN5TXMgPCBtaW5MYXRlbmN5KSBsYXRlbmN5TXMgPSBtaW5MYXRlbmN5OwpAQCAtMzUzNiw3ICszNTM3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlKTsKIAogICAgICAgICAgICAgICAgIGlmIChpc1RpbWVzdGFtcENvcnJlY3Rpb25FbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRTX0JFRk9SRTogJWQgJWxsZCAlbGxkIiwgaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgQUxPR1ZWKCJUU19CRUZPUkU6ICVkICVsbGQgJWxsZCIsIGlkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0pOwogICAgICAgICAgICAgICAgICAgICBhdXRvIGNvcnJlY3RlZFRpbWVzdGFtcCA9IG1UaW1lc3RhbXBWZXJpZmllci5nZXRMYXN0Q29ycmVjdGVkVGltZXN0YW1wKCk7CkBAIC0zNTQ0LDcgKzM1NDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gY29ycmVjdGVkVGltZXN0YW1wLm1GcmFtZXM7CiAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjb3JyZWN0ZWRUaW1lc3RhbXAubVRpbWVOczsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRTX0FGVEVSOiAlZCAlbGxkICVsbGQiLCBpZCgpLAorICAgICAgICAgICAgICAgICAgICBBTE9HVlYoIlRTX0FGVEVSOiAlZCAlbGxkICVsbGQiLCBpZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdKTsKIApAQCAtNjg4Nyw3ICs2ODg4LDcgQEAKICAgICBzbnByaW50ZihtVGhyZWFkTmFtZSwga1RocmVhZE5hbWVMZW5ndGgsICJBdWRpb0luXyVYIiwgaWQpOwogICAgIG1OQkxvZ1dyaXRlciA9IGF1ZGlvRmxpbmdlci0+bmV3V3JpdGVyX2woa0xvZ1NpemUsIG1UaHJlYWROYW1lKTsKIAotICAgIGlmIChtSW5wdXQgIT0gbnVsbHB0ciAmJiBtSW5wdXQtPmF1ZGlvSHdEZXYgIT0gbnVsbHB0cikgeworICAgIGlmIChtSW5wdXQtPmF1ZGlvSHdEZXYgIT0gbnVsbHB0cikgewogICAgICAgICBtSXNNc2REZXZpY2UgPSBzdHJjbXAoCiAgICAgICAgICAgICAgICAgbUlucHV0LT5hdWRpb0h3RGV2LT5tb2R1bGVOYW1lKCksIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpID09IDA7CiAgICAgfQpAQCAtNzMxOCw3ICs3MzE5LDcgQEAKIAogICAgICAgICAgICAgY29uc3Qgc3NpemVfdCBhdmFpbGFibGVUb1JlYWQgPSBtUGlwZVNvdXJjZS0+YXZhaWxhYmxlVG9SZWFkKCk7CiAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlVG9SZWFkID49IDApIHsKLSAgICAgICAgICAgICAgICAvLyBQaXBlU291cmNlIGlzIHRoZSBtYXN0ZXIgY2xvY2suICBJdCBpcyB1cCB0byB0aGUgQXVkaW9SZWNvcmQgY2xpZW50IHRvIGtlZXAgdXAuCisgICAgICAgICAgICAgICAgLy8gUGlwZVNvdXJjZSBpcyB0aGUgcHJpbWFyeSBjbG9jay4gIEl0IGlzIHVwIHRvIHRoZSBBdWRpb1JlY29yZCBjbGllbnQgdG8ga2VlcCB1cC4KICAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChzaXplX3QpYXZhaWxhYmxlVG9SZWFkID4gbVBpcGVGcmFtZXNQMiwKICAgICAgICAgICAgICAgICAgICAgICAgICJtb3JlIGZyYW1lcyB0byByZWFkIHRoYW4gZmlmbyBzaXplLCAlemQgPiAlenUiLAogICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlVG9SZWFkLCBtUGlwZUZyYW1lc1AyKTsKQEAgLTczNzksMTIgKzczODAsMTIgQEAKIAogICAgICAgICAgICAgICAgIC8vIENvcnJlY3QgdGltZXN0YW1wcwogICAgICAgICAgICAgICAgIGlmIChpc1RpbWVzdGFtcENvcnJlY3Rpb25FbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRTX0JFRk9SRTogJWQgJWxsZCAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgQUxPR1ZWKCJUU19CRUZPUkU6ICVkICVsbGQgJWxsZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQoKSwgKGxvbmcgbG9uZyl0aW1lLCAobG9uZyBsb25nKXBvc2l0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgYXV0byBjb3JyZWN0ZWRUaW1lc3RhbXAgPSBtVGltZXN0YW1wVmVyaWZpZXIuZ2V0TGFzdENvcnJlY3RlZFRpbWVzdGFtcCgpOwogICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IGNvcnJlY3RlZFRpbWVzdGFtcC5tRnJhbWVzOwogICAgICAgICAgICAgICAgICAgICB0aW1lID0gY29ycmVjdGVkVGltZXN0YW1wLm1UaW1lTnM7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJUU19BRlRFUjogJWQgJWxsZCAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgQUxPR1ZWKCJUU19BRlRFUjogJWQgJWxsZCAlbGxkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCgpLCAobG9uZyBsb25nKXRpbWUsIChsb25nIGxvbmcpcG9zaXRpb24pOwogICAgICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcAppbmRleCBmMjg2ZDhhLi4xNzg4MDljIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcApAQCAtMTkzMyw2ICsxOTMzLDI1IEBACiB7CiAgICAgbVByb3h5LT5yZWxlYXNlQnVmZmVyKGJ1ZmZlcik7CiAgICAgcmVzdGFydElmRGlzYWJsZWQoKTsKKworICAgIC8vIENoZWNrIGlmIHRoZSBQYXRjaFRyYWNrIGhhcyBlbm91Z2ggZGF0YSB0byB3cml0ZSBvbmNlIGluIHJlbGVhc2VCdWZmZXIoKS4KKyAgICAvLyBJZiBub3QsIHByZXZlbnQgYW4gdW5kZXJydW4gZnJvbSBvY2N1cnJpbmcgYnkgbW92aW5nIHRoZSB0cmFjayBpbnRvIEZTX0ZJTExJTkc7CisgICAgLy8gdGhpcyBsb2dpYyBhdm9pZHMgZ2xpdGNoZXMgd2hlbiBzdXNwZW5kaW5nIEEyRFAgd2l0aCBBdWRpb1BsYXliYWNrQ2FwdHVyZS4KKyAgICAvLyBUT0RPOiBwZXJoYXBzIHVuZGVycnVuIGF2b2lkYW5jZSBjb3VsZCBiZSBhIHRyYWNrIHByb3BlcnR5IGNoZWNrZWQgaW4gaXNSZWFkeSgpIGluc3RlYWQuCisgICAgaWYgKG1GaWxsaW5nVXBTdGF0dXMgPT0gRlNfQUNUSVZFCisgICAgICAgICAgICAmJiBhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpCisgICAgICAgICAgICAmJiAhaXNPZmZsb2FkZWRPckRpcmVjdCgpKSB7CisgICAgICAgIGlmIChzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICAgICAgICAgIHRocmVhZCAhPSAwKSB7CisgICAgICAgICAgICBQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQgPSAoUGxheWJhY2tUaHJlYWQgKil0aHJlYWQuZ2V0KCk7CisgICAgICAgICAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IHBsYXliYWNrVGhyZWFkLT5mcmFtZUNvdW50KCkgKiBzYW1wbGVSYXRlKCkKKyAgICAgICAgICAgICAgICAgICAgLyBwbGF5YmFja1RocmVhZC0+c2FtcGxlUmF0ZSgpOworICAgICAgICAgICAgaWYgKGZyYW1lc1JlYWR5KCkgPCBmcmFtZUNvdW50KSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIiVzKCVkKSBOb3QgZW5vdWdoIGRhdGEsIHdhaXQgZm9yIGJ1ZmZlciB0byBmaWxsIiwgX19mdW5jX18sIG1JZCk7CisgICAgICAgICAgICAgICAgbUZpbGxpbmdVcFN0YXR1cyA9IEZTX0ZJTExJTkc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6cmVzdGFydElmRGlzYWJsZWQoKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1R5cGVkTG9nZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaAppbmRleCA2ZWYxOWJmLi5mZWI3MWUzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaApAQCAtODAsNyArODAsNyBAQAogCiAvLyBUT0RPIFBlcm1pdCBkaXNhYmxpbmcgb2YgbG9nZ2luZyBhdCBjb21waWxlLXRpbWUuCiAKLS8vIFRPRE8gQSBub24tbnVsbHB0ciBkdW1teSBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIGEgbm9wIHdvdWxkIGJlIGZhc3RlciB0aGFuIGNoZWNraW5nIGZvciBudWxscHRyCisvLyBUT0RPIEEgbm9uLW51bGxwdHIgc3R1YiBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIGEgbm9wIHdvdWxkIGJlIGZhc3RlciB0aGFuIGNoZWNraW5nIGZvciBudWxscHRyCiAvLyAgICAgIGluIHRoZSBjYXNlIHdoZW4gbG9nZ2luZyBpcyBlbmFibGVkIGF0IGNvbXBpbGUtdGltZSBhbmQgZW5hYmxlZCBhdCBydW50aW1lLCBidXQgaXQgbWlnaHQgYmUKIC8vICAgICAgc2xvd2VyIHRoYW4gbnVsbHB0ciBjaGVjayB3aGVuIGxvZ2dpbmcgaXMgZW5hYmxlZCBhdCBjb21waWxlLXRpbWUgYW5kIGRpc2FibGVkIGF0IHJ1bnRpbWUuCiAKQEAgLTEyOSw4ICsxMjksOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBleHRlcm4gIkMiIHsKLS8vIFRPRE8gY29uc2lkZXIgYWRkaW5nIGEgdGhyZWFkX2xvY2FsIE5CTG9nOjpXcml0ZXIgdGxEdW1teU5CTG9nV3JpdGVyIGFuZCB0aGVuCi0vLyBpbml0aWFsaXplIGJlbG93IHRsTkJMb2dXcml0ZXIgdG8gJnRsRHVtbXlOQkxvZ1dyaXRlciB0byByZW1vdmUgdGhlIG5lZWQgdG8KKy8vIFRPRE8gY29uc2lkZXIgYWRkaW5nIGEgdGhyZWFkX2xvY2FsIE5CTG9nOjpXcml0ZXIgdGxTdHViTkJMb2dXcml0ZXIgYW5kIHRoZW4KKy8vIGluaXRpYWxpemUgYmVsb3cgdGxOQkxvZ1dyaXRlciB0byAmdGxTdHViTkJMb2dXcml0ZXIgdG8gcmVtb3ZlIHRoZSBuZWVkIHRvCiAvLyBjaGVjayBmb3IgbnVsbHB0ciBldmVyeSB0aW1lLiBBbHNvIHJlZHVjZXMgdGhlIG5lZWQgdG8gYWRkIGEgbmV3IGxvZ2dpbmcgbWFjcm8gYWJvdmUKIC8vIGVhY2ggdGltZSB3ZSB3YW50IHRvIGxvZyBhIG5ldyB0eXBlLgogZXh0ZXJuIHRocmVhZF9sb2NhbCBOQkxvZzo6V3JpdGVyICp0bE5CTG9nV3JpdGVyOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvT1dORVJTIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvT1dORVJTCmluZGV4IGE4NDgzZmEuLmRhOWQzMmYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L09XTkVSUworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9PV05FUlMKQEAgLTEsMyArMSwyIEBACiBqbXRyaXZpQGdvb2dsZS5jb20KLWtyb2NhcmRAZ29vZ2xlLmNvbQogbW5hZ2Fub3ZAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaAppbmRleCA3YzhjZTgzLi43MzZmOGIyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaApAQCAtMTI2LDYgKzEyNiw3IEBACiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUDoKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM6CiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9VU0JfSEVBRFNFVDoKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMRV9IRUFEU0VUOgogICAgICAgICAgICAgcmV0dXJuIERFVklDRV9DQVRFR09SWV9IRUFEU0VUOwogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQ6CiAgICAgICAgICAgICByZXR1cm4gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEOwpAQCAtMTM5LDYgKzE0MCw3IEBACiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSOgogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWToKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVg6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTEVfU1BFQUtFUjoKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUjsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0RldmljZURlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmgKaW5kZXggZGQxNDk5Yy4uMGY5YmNjMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0RldmljZURlc2NyaXB0b3IuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRGV2aWNlRGVzY3JpcHRvci5oCkBAIC0yNDgsNyArMjQ4LDkgQEAKICAgICAgICAgcmV0dXJuIFN0cmluZzgoIiIpOwogICAgIH0KIAotICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7CisgICAgLy8gUmV0dXJuIGEgc3RyaW5nIHRvIGRlc2NyaWJlIHRoZSBEZXZpY2VWZWN0b3IuIFRoZSBzZW5zaXRpdmUgaW5mb3JtYXRpb24gd2lsbCBvbmx5IGJlCisgICAgLy8gYWRkZWQgdG8gdGhlIHN0cmluZyBpZiBgaW5jbHVkZVNlbnNpdGl2ZUluZm9gIGlzIHRydWUuCisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoYm9vbCBpbmNsdWRlU2Vuc2l0aXZlSW5mbyA9IGZhbHNlKSBjb25zdDsKIAogICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGNvbnN0IFN0cmluZzggJnRhZywgaW50IHNwYWNlcyA9IDAsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAKaW5kZXggYjk2MzEyMS4uNDkyMmViZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcApAQCAtNTE2LDcgKzUxNiw3IEBACiAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBTYW1wbGluZyByYXRlOiAlZFxuIiwgbVNhbXBsaW5nUmF0ZSk7CiAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBGb3JtYXQ6ICVkXG4iLCBtRm9ybWF0KTsKICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIENoYW5uZWxzOiAlMDh4XG4iLCBtQ2hhbm5lbE1hc2spOwotICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRGV2aWNlcyAlc1xuIiwgbURldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIERldmljZXMgJXNcbiIsIG1EZXZpY2UtPnRvU3RyaW5nKHRydWUgLyppbmNsdWRlU2Vuc2l0aXZlSW5mbyovKS5jX3N0cigpKTsKICAgICBtRW5hYmxlZEVmZmVjdHMuZHVtcChkc3QsIDEgLypzcGFjZXMqLywgZmFsc2UgLyp2ZXJib3NlKi8pOwogICAgIGRzdC0+YXBwZW5kKCIgQXVkaW9SZWNvcmQgQ2xpZW50czpcbiIpOwogICAgIENsaWVudE1hcEhhbmRsZXI8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj46OmR1bXAoZHN0KTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwCmluZGV4IGQ2ZDQ3MmIuLmEyZTJlZWMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcApAQCAtMjQ1LDcgKzI0NSw3IEBACiAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBTYW1wbGluZyByYXRlOiAlZFxuIiwgbVNhbXBsaW5nUmF0ZSk7CiAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBGb3JtYXQ6ICUwOHhcbiIsIG1Gb3JtYXQpOwogICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgQ2hhbm5lbHM6ICUwOHhcbiIsIG1DaGFubmVsTWFzayk7Ci0gICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBEZXZpY2VzOiAlc1xuIiwgZGV2aWNlcygpLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBEZXZpY2VzOiAlc1xuIiwgZGV2aWNlcygpLnRvU3RyaW5nKHRydWUgLyppbmNsdWRlU2Vuc2l0aXZlSW5mbyovKS5jX3N0cigpKTsKICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIEdsb2JhbCBhY3RpdmUgY291bnQ6ICV1XG4iLCBtR2xvYmFsQWN0aXZlQ291bnQpOwogICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6IG1Sb3V0aW5nQWN0aXZpdGllcykgewogICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFByb2R1Y3QgU3RyYXRlZ3kgaWQ6ICVkIiwgaXRlci5maXJzdCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0RldmljZURlc2NyaXB0b3IuY3BwCmluZGV4IGEyOWU2MGUuLjY4YTMyYTIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0RldmljZURlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0RldmljZURlc2NyaXB0b3IuY3BwCkBAIC00MDgsNyArNDA4LDcgQEAKICAgICB9CiB9CiAKLXN0ZDo6c3RyaW5nIERldmljZVZlY3Rvcjo6dG9TdHJpbmcoKSBjb25zdAorc3RkOjpzdHJpbmcgRGV2aWNlVmVjdG9yOjp0b1N0cmluZyhib29sIGluY2x1ZGVTZW5zaXRpdmVJbmZvKSBjb25zdAogewogICAgIGlmIChpc0VtcHR5KCkpIHsKICAgICAgICAgcmV0dXJuIHsiQVVESU9fREVWSUNFX05PTkUifTsKQEAgLTQxOCw3ICs0MTgsNyBAQAogICAgICAgICBpZiAoZGV2aWNlICE9ICpiZWdpbigpKSB7CiAgICAgICAgICAgIHJlc3VsdCArPSAiOyI7CiAgICAgICAgIH0KLSAgICAgICAgcmVzdWx0ICs9IGRldmljZS0+dG9TdHJpbmcoKTsKKyAgICAgICAgcmVzdWx0ICs9IGRldmljZS0+dG9TdHJpbmcoaW5jbHVkZVNlbnNpdGl2ZUluZm8pOwogICAgIH0KICAgICByZXR1cm4gcmVzdWx0ICsgIn0iOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9BbmRyb2lkLmJwCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9FbmdpbmVCYXNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvRW5naW5lQmFzZS5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvTGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcy5oCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0xhc3RSZW1vdmFibGVNZWRpYURldmljZXMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvTGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcy5jcHAKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKaW5kZXggYTczODhkYS4uYmMzMjQxNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCkBAIC02NSw2ICs2NSwxMiBAQAogICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgogCiAgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9NRURJQSI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0FTU0lTVEFOVCIgdm9sdW1lR3JvdXA9ImFzc2lzdGFudCI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4KKyAgICAgICAgICAgICAgICA8Q29udGVudFR5cGUgdmFsdWU9IkFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0giLz4KKyAgICAgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOVCIvPgorICAgICAgICAgICAgPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KICAgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX01VU0lDIiB2b2x1bWVHcm91cD0ibXVzaWMiPgogICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTUVESUEiLz4gPC9BdHRyaWJ1dGVzPgogICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfR0FNRSIvPiA8L0F0dHJpYnV0ZXM+CkBAIC03MiwxMiArNzgsNiBAQAogICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFIi8+IDwvQXR0cmlidXRlcz4KICAgICAgICAgICAgIDxBdHRyaWJ1dGVzPjwvQXR0cmlidXRlcz4KICAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+Ci0gICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0FTU0lTVEFOVCIgdm9sdW1lR3JvdXA9ImFzc2lzdGFudCI+Ci0gICAgICAgICAgICA8QXR0cmlidXRlcz4KLSAgICAgICAgICAgICAgICA8Q29udGVudFR5cGUgdmFsdWU9IkFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0giLz4KLSAgICAgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOVCIvPgotICAgICAgICAgICAgPC9BdHRyaWJ1dGVzPgotICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KICAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fU1lTVEVNIiB2b2x1bWVHcm91cD0ic3lzdGVtIj4KICAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OIi8+IDwvQXR0cmlidXRlcz4KICAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvYnVpbGRDb21tb25UeXBlc1N0cnVjdHVyZUZpbGUucHkgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvYnVpbGRDb21tb25UeXBlc1N0cnVjdHVyZUZpbGUucHkKaW5kZXggOWE3ZmE4Zi4uZjA2MGQ0NSAxMDA3NTUKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkQ29tbW9uVHlwZXNTdHJ1Y3R1cmVGaWxlLnB5CisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZENvbW1vblR5cGVzU3RydWN0dXJlRmlsZS5weQpAQCAtNTIsMTMgKzUyLDE5IEBACiBkZWYgZmluZEJpdFBvcyhkZWNpbWFsKToKICAgICBwb3MgPSAwCiAgICAgaSA9IDEKLSAgICB3aGlsZSBpICE9IGRlY2ltYWw6CisgICAgd2hpbGUgaSA8IGRlY2ltYWw6CiAgICAgICAgIGkgPSBpIDw8IDEKICAgICAgICAgcG9zID0gcG9zICsgMQogICAgICAgICBpZiBwb3MgPT0gMzI6CiAgICAgICAgICAgICByZXR1cm4gLTEKLSAgICByZXR1cm4gcG9zCiAKKyAgICAjIFRPRE86IGIvMTY4MDY1NzA2LiBUaGlzIGlzIGp1c3QgdG8gZml4IHRoZSBidWlsZC4gVGhhdCB0aGUgcHJvYmxlbSBvZiBkZXZpY2VzIHdpdGgKKyAgICAjIG11bHRpcGxlIGJpdHMgc2V0IG11c3QgYmUgYWRkcmVzc2VkIG1vcmUgZ2VuZXJhbGx5IGluIHRoZSBjb25maWd1cmFibGUgYXVkaW8gcG9saWN5CisgICAgIyBhbmQgcGFyYW1ldGVyIGZyYW1ld29yay4KKyAgICBpZiBpID4gZGVjaW1hbDoKKyAgICAgICAgbG9nZ2luZy5pbmZvKCJEZXZpY2U6e30gd2hpY2ggaGFzIG11bHRpcGxlIGJpdHMgc2V0IGlzIHNraXBwZWQuIGIvMTY4MDY1NzA2Ii5mb3JtYXQoZGVjaW1hbCkpCisgICAgICAgIHJldHVybiAtMgorICAgIHJldHVybiBwb3MKIAogZGVmIGdlbmVyYXRlWG1sU3RydWN0dXJlRmlsZShjb21wb25lbnRUeXBlRGljdCwgc3RydWN0dXJlVHlwZXNGaWxlLCBvdXRwdXRGaWxlKToKIApAQCAtNzQsMTAgKzgwLDEyIEBACiAgICAgICAgICAgICAgICAgaWYgYml0cGFyYW1ldGVyc19ub2RlIGlzIG5vdCBOb25lOgogICAgICAgICAgICAgICAgICAgICBvcmRlcmVkX3ZhbHVlcyA9IE9yZGVyZWREaWN0KHNvcnRlZCh2YWx1ZXNfZGljdC5pdGVtcygpLCBrZXk9bGFtYmRhIHg6IHhbMV0pKQogICAgICAgICAgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBvcmRlcmVkX3ZhbHVlcy5pdGVtcygpOgotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfbm9kZSA9IEVULlN1YkVsZW1lbnQoYml0cGFyYW1ldGVyc19ub2RlLCAiQml0UGFyYW1ldGVyIikKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX25vZGUuc2V0KCdOYW1lJywga2V5KQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfbm9kZS5zZXQoJ1NpemUnLCAiMSIpCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9ub2RlLnNldCgnUG9zJywgc3RyKGZpbmRCaXRQb3ModmFsdWUpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvcyA9IGZpbmRCaXRQb3ModmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiBwb3MgPj0gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9ub2RlID0gRVQuU3ViRWxlbWVudChiaXRwYXJhbWV0ZXJzX25vZGUsICJCaXRQYXJhbWV0ZXIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX25vZGUuc2V0KCdOYW1lJywga2V5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX25vZGUuc2V0KCdTaXplJywgIjEiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX25vZGUuc2V0KCdQb3MnLCBzdHIocG9zKSkKIAogICAgICAgICAgICAgICAgIGVudW1fcGFyYW1ldGVyX25vZGUgPSBjb21wb25lbnRfdHlwZS5maW5kKCJFbnVtUGFyYW1ldGVyIikKICAgICAgICAgICAgICAgICBpZiBlbnVtX3BhcmFtZXRlcl9ub2RlIGlzIG5vdCBOb25lOgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbAppbmRleCBhNzM4OGRhLi5iYzMyNDE2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbApAQCAtNjUsNiArNjUsMTIgQEAKICAgICA8L1Byb2R1Y3RTdHJhdGVneT4KIAogICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfTUVESUEiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9BU1NJU1RBTlQiIHZvbHVtZUdyb3VwPSJhc3Npc3RhbnQiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+CisgICAgICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfU1BFRUNIIi8+CisgICAgICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTlQiLz4KKyAgICAgICAgICAgIDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CiAgICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9NVVNJQyIgdm9sdW1lR3JvdXA9Im11c2ljIj4KICAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX01FRElBIi8+IDwvQXR0cmlidXRlcz4KICAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0dBTUUiLz4gPC9BdHRyaWJ1dGVzPgpAQCAtNzIsMTIgKzc4LDYgQEAKICAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSIvPiA8L0F0dHJpYnV0ZXM+CiAgICAgICAgICAgICA8QXR0cmlidXRlcz48L0F0dHJpYnV0ZXM+CiAgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgotICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9BU1NJU1RBTlQiIHZvbHVtZUdyb3VwPSJhc3Npc3RhbnQiPgotICAgICAgICAgICAgPEF0dHJpYnV0ZXM+Ci0gICAgICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfU1BFRUNIIi8+Ci0gICAgICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTlQiLz4KLSAgICAgICAgICAgIDwvQXR0cmlidXRlcz4KLSAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CiAgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX1NZU1RFTSIgdm9sdW1lR3JvdXA9InN5c3RlbSI+CiAgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTiIvPiA8L0F0dHJpYnV0ZXM+CiAgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5jcHAKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKaW5kZXggMDdlODBkMS4uMTJjNmFlNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCkBAIC00Miw2ICs0Miw3IEBACiAjaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CiAjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGN1dGlscy9iaXRvcHMuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CkBAIC00NjEsNyArNDYyLDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBhdXRvIG11c2ljU3RyYXRlZ3kgPSBzdHJlYW1Ub1N0cmF0ZWd5KEFVRElPX1NUUkVBTV9NVVNJQyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAvLyBtdXRlIG1lZGlhIHN0cmF0ZWdpZXMgYW5kIGRlbGF5IGRldmljZSBzd2l0Y2ggYnkgdGhlIGxhcmdlc3QKKyAgICAgICAvLyBUaGlzIGF2b2lkIHNlbmRpbmcgdGhlIG11c2ljIHRhaWwgaW50byB0aGUgZWFycGllY2Ugb3IgaGVhZHNldC4KKyAgICAgICBzZXRTdHJhdGVneU11dGUobXVzaWNTdHJhdGVneSwgdHJ1ZSwgZGVzYyk7CisgICAgICAgc2V0U3RyYXRlZ3lNdXRlKG11c2ljU3RyYXRlZ3ksIGZhbHNlLCBkZXNjLCBNVVRFX1RJTUVfTVMsCisgICAgICAgICAgbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYXR0cmlidXRlc19pbml0aWFsaXplcihBVURJT19VU0FHRV9NRURJQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgdHJ1ZSAvKmZyb21DYWNoZSovKS50eXBlcygpKTsKKyAgICB9CiAgICAgLy8gVG9nZ2xlIHRoZSBkZXZpY2Ugc3RhdGU6IFVOQVZBSUxBQkxFIC0+IEFWQUlMQUJMRQogICAgIC8vIFRoaXMgd2lsbCBmb3JjZSByZWFkaW5nIGFnYWluIHRoZSBkZXZpY2UgY29uZmlndXJhdGlvbgogICAgIHN0YXR1cyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsCkBAIC0xNzY1LDcgKzE3NzUsOCBAQAogICAgICAgICBjaGVja0FuZFNldFZvbHVtZShjdXJ2ZXMsIGNsaWVudC0+dm9sdW1lU291cmNlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlcy5nZXRWb2x1bWVJbmRleChvdXRwdXREZXNjLT5kZXZpY2VzKCkudHlwZXMoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmRldmljZXMoKS50eXBlcygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+ZGV2aWNlcygpLnR5cGVzKCksIDAgLypkZWxheSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT51c2VId0dhaW4oKSAvKmZvcmNlKi8pOwogCiAgICAgICAgIC8vIHVwZGF0ZSB0aGUgb3V0cHV0cyBpZiBzdGFydGluZyBhbiBvdXRwdXQgd2l0aCBhIHN0cmVhbSB0aGF0IGNhbiBhZmZlY3Qgbm90aWZpY2F0aW9uCiAgICAgICAgIC8vIHJvdXRpbmcKQEAgLTU0NTAsNiArNTQ2MSwxMiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gRG8gbm90IHJldHJpZXZlIGVuZ2luZSBkZXZpY2UgZm9yIG91dHB1dHMgdGhyb3VnaCBNU0QKKyAgICAvLyBUT0RPOiBzdXBwb3J0IGV4cGxpY2l0IHJvdXRpbmcgcmVxdWVzdHMgYnkgcmVzZXR0aW5nIE1TRCBwYXRjaCB0byBlbmdpbmUgZGV2aWNlLgorICAgIGlmIChvdXRwdXREZXNjLT5kZXZpY2VzKCkgPT0gZ2V0TXNkQXVkaW9PdXREZXZpY2VzKCkpIHsKKyAgICAgICAgcmV0dXJuIG91dHB1dERlc2MtPmRldmljZXMoKTsKKyAgICB9CisKICAgICAvLyBIb25vciBleHBsaWNpdCByb3V0aW5nIHJlcXVlc3RzIG9ubHkgaWYgbm8gY2xpZW50IHVzaW5nIGRlZmF1bHQgcm91dGluZyBpcyBhY3RpdmUgb24gdGhpcwogICAgIC8vIGlucHV0OiBhIHNwZWNpZmljIGFwcCBjYW4gbm90IGZvcmNlIHJvdXRpbmcgZm9yIG90aGVyIGFwcHMgYnkgc2V0dGluZyBhIHByZWZlcnJlZCBkZXZpY2UuCiAgICAgYm9vbCBhY3RpdmU7IC8vIHVudXNlZApAQCAtNjAzNSw3ICs2MDUyLDggQEAKICAgICBpZiAoIUludGVyc2VjdGlvbihkZXZpY2VUeXBlcywKICAgICAgICAgICAgIHtBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQLCBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMsCiAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VULCBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORSwKLSAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1VTQl9IRUFEU0VULCBBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEfSkuZW1wdHkoKSAmJgorICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfVVNCX0hFQURTRVQsIEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQsCisgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTEVfSEVBRFNFVH0pLmVtcHR5KCkgJiYKICAgICAgICAgICAgICgodm9sdW1lU291cmNlID09IGFsYXJtVm9sdW1lU3JjIHx8CiAgICAgICAgICAgICAgIHZvbHVtZVNvdXJjZSA9PSByaW5nVm9sdW1lU3JjKSB8fAogICAgICAgICAgICAgICh2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX05PVElGSUNBVElPTikpIHx8CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKaW5kZXggMWVjMGM1ZS4uYjczODYzMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcApAQCAtMTIxLDggKzEyMSw4IEBACiAgICAgICAgIFZlY3RvciA8RWZmZWN0RGVzYyAqPiBlZmZlY3RzID0gbUlucHV0U291cmNlcy52YWx1ZUF0KGluZGV4KS0+bUVmZmVjdHM7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gZWZmZWN0c1tpXTsKLSAgICAgICAgICAgIHNwPEF1ZGlvRWZmZWN0PiBmeCA9IG5ldyBBdWRpb0VmZmVjdChOVUxMLCBTdHJpbmcxNigiYW5kcm9pZCIpLCAmZWZmZWN0LT5tVXVpZCwgLTEsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgYXVkaW9TZXNzaW9uLCBpbnB1dCk7CisgICAgICAgICAgICBzcDxBdWRpb0VmZmVjdD4gZnggPSBuZXcgQXVkaW9FZmZlY3QoU3RyaW5nMTYoImFuZHJvaWQiKSk7CisgICAgICAgICAgICBmeC0+c2V0KE5VTEwsICZlZmZlY3QtPm1VdWlkLCAtMSwgMCwgMCwgYXVkaW9TZXNzaW9uLCBpbnB1dCk7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBmeC0+aW5pdENoZWNrKCk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmIHN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgewogICAgICAgICAgICAgICAgIEFMT0dXKCJhZGRJbnB1dEVmZmVjdHMoKTogZmFpbGVkIHRvIGNyZWF0ZSBGeCAlcyBvbiBzb3VyY2UgJWQiLApAQCAtMjcwLDggKzI3MCw4IEBACiAgICAgICAgIFZlY3RvciA8RWZmZWN0RGVzYyAqPiBlZmZlY3RzID0gbU91dHB1dFN0cmVhbXMudmFsdWVBdChpbmRleCktPm1FZmZlY3RzOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIEVmZmVjdERlc2MgKmVmZmVjdCA9IGVmZmVjdHNbaV07Ci0gICAgICAgICAgICBzcDxBdWRpb0VmZmVjdD4gZnggPSBuZXcgQXVkaW9FZmZlY3QoTlVMTCwgU3RyaW5nMTYoImFuZHJvaWQiKSwgJmVmZmVjdC0+bVV1aWQsIDAsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9TZXNzaW9uLCBvdXRwdXQpOworICAgICAgICAgICAgc3A8QXVkaW9FZmZlY3Q+IGZ4ID0gbmV3IEF1ZGlvRWZmZWN0KFN0cmluZzE2KCJhbmRyb2lkIikpOworICAgICAgICAgICAgZngtPnNldChOVUxMLCAmZWZmZWN0LT5tVXVpZCwgMCwgMCwgMCwgYXVkaW9TZXNzaW9uLCBvdXRwdXQpOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZngtPmluaXRDaGVjaygpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiYWRkT3V0cHV0U2Vzc2lvbkVmZmVjdHMoKTogZmFpbGVkIHRvIGNyZWF0ZSBGeCAgJXMgb24gc2Vzc2lvbiAlZCIsCkBAIC05NzAsMTEgKzk3MCwxMSBAQAogICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlRWZmZWN0c0l0ZXIgOiBtRGV2aWNlRWZmZWN0cykgewogICAgICAgICBjb25zdCBhdXRvJiBkZXZpY2VFZmZlY3RzID0gIGRldmljZUVmZmVjdHNJdGVyLnNlY29uZDsKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBlZmZlY3REZXNjIDogZGV2aWNlRWZmZWN0cy0+bUVmZmVjdERlc2NyaXB0b3JzLT5tRWZmZWN0cykgewotICAgICAgICAgICAgYXV0byBmeCA9IHN0ZDo6bWFrZV91bmlxdWU8QXVkaW9FZmZlY3Q+KAotICAgICAgICAgICAgICAgICAgICAgICAgRUZGRUNUX1VVSURfTlVMTCwgU3RyaW5nMTYoImFuZHJvaWQiKSwgJmVmZmVjdERlc2MtPm1VdWlkLCAwLCBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgQVVESU9fU0VTU0lPTl9ERVZJQ0UsIEFVRElPX0lPX0hBTkRMRV9OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkcntkZXZpY2VFZmZlY3RzLT5nZXREZXZpY2VUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUVmZmVjdHMtPmdldERldmljZUFkZHJlc3MoKX0pOworICAgICAgICAgICAgYXV0byBmeCA9IHN0ZDo6bWFrZV91bmlxdWU8QXVkaW9FZmZlY3Q+KFN0cmluZzE2KCJhbmRyb2lkIikpOworICAgICAgICAgICAgZngtPnNldChFRkZFQ1RfVVVJRF9OVUxMLCAmZWZmZWN0RGVzYy0+bVV1aWQsIDAsIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIEFVRElPX1NFU1NJT05fREVWSUNFLCBBVURJT19JT19IQU5ETEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkcntkZXZpY2VFZmZlY3RzLT5nZXREZXZpY2VUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlRWZmZWN0cy0+Z2V0RGV2aWNlQWRkcmVzcygpfSk7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBmeC0+aW5pdENoZWNrKCk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmIHN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgewogICAgICAgICAgICAgICAgIEFMT0dFKCIlcygpOiBmYWlsZWQgdG8gY3JlYXRlIEZ4ICVzIG9uIHBvcnQgdHlwZT0lZCBhZGRyZXNzPSVzIiwgX19mdW5jX18sCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50LmgKaW5kZXggZTE3MjFlYS4uYmRkZGYwNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnQuaApAQCAtNzUsNiArNzUsMTAgQEAKICAgICBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qZGVsYXlNcyovKSBvdmVycmlkZSB7CisgICAgICAgIGF1dG8gaXRlciA9IG1BY3RpdmVQYXRjaGVzLmZpbmQoKmhhbmRsZSk7CisgICAgICAgIGlmIChpdGVyICE9IG1BY3RpdmVQYXRjaGVzLmVuZCgpKSB7CisgICAgICAgICAgICBtQWN0aXZlUGF0Y2hlcy5lcmFzZSgqaGFuZGxlKTsKKyAgICAgICAgfQogICAgICAgICAqaGFuZGxlID0gbU5leHRQYXRjaEhhbmRsZSsrOwogICAgICAgICBtQWN0aXZlUGF0Y2hlcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoKmhhbmRsZSwgKnBhdGNoKSk7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKaW5kZXggMjQyODhkNi4uM2Q5OTk4YSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKQEAgLTgwMiw3ICs4MDIsNyBAQAogCiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6bWFrZUNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgY29uc3Qgc3A8SUludGVyZmFjZT4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmcxNiYgcGFja2FnZU5hbWUsCi0gICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGZlYXR1cmVJZCwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGludCBhcGkxQ2FtZXJhSWQsCisgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBmZWF0dXJlSWQsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBpbnQgYXBpMUNhbWVyYUlkLAogICAgICAgICBpbnQgZmFjaW5nLCBpbnQgY2xpZW50UGlkLCB1aWRfdCBjbGllbnRVaWQsIGludCBzZXJ2aWNlUGlkLCBpbnQgaGFsVmVyc2lvbiwKICAgICAgICAgaW50IGRldmljZVZlcnNpb24sIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLAogICAgICAgICAvKm91dCovc3A8QmFzaWNDbGllbnQ+KiBjbGllbnQpIHsKQEAgLTk1OCw3ICs5NTgsNyBAQAogICAgIGlmICghKHJldCA9IGNvbm5lY3RIZWxwZXI8SUNhbWVyYUNsaWVudCxDbGllbnQ+KAogICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD57bnVsbHB0cn0sIGlkLCBjYW1lcmFJZCwKICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oQ0FNRVJBX0hBTF9BUElfVkVSU0lPTl9VTlNQRUNJRklFRCksCi0gICAgICAgICAgICBpbnRlcm5hbFBhY2thZ2VOYW1lLCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+KCksIHVpZCwgVVNFX0NBTExJTkdfUElELAorICAgICAgICAgICAgaW50ZXJuYWxQYWNrYWdlTmFtZSwge30sIHVpZCwgVVNFX0NBTExJTkdfUElELAogICAgICAgICAgICAgQVBJXzEsIC8qc2hpbVVwZGF0ZU9ubHkqLyB0cnVlLCAvKm91dCovIHRtcCkKICAgICAgICAgICAgICkuaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgaW5pdGlhbGl6aW5nIHNoaW0gbWV0YWRhdGE6ICVzIiwgX19GVU5DVElPTl9fLCByZXQudG9TdHJpbmc4KCkuc3RyaW5nKCkpOwpAQCAtMTQ3Niw3ICsxNDc2LDcgQEAKICAgICBTdHJpbmc4IGlkID0gY2FtZXJhSWRJbnRUb1N0cihhcGkxQ2FtZXJhSWQpOwogICAgIHNwPENsaWVudD4gY2xpZW50ID0gbnVsbHB0cjsKICAgICByZXQgPSBjb25uZWN0SGVscGVyPElDYW1lcmFDbGllbnQsQ2xpZW50PihjYW1lcmFDbGllbnQsIGlkLCBhcGkxQ2FtZXJhSWQsCi0gICAgICAgICAgICBDQU1FUkFfSEFMX0FQSV9WRVJTSU9OX1VOU1BFQ0lGSUVELCBjbGllbnRQYWNrYWdlTmFtZSwgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PigpLAorICAgICAgICAgICAgQ0FNRVJBX0hBTF9BUElfVkVSU0lPTl9VTlNQRUNJRklFRCwgY2xpZW50UGFja2FnZU5hbWUsIHt9LAogICAgICAgICAgICAgY2xpZW50VWlkLCBjbGllbnRQaWQsIEFQSV8xLCAvKnNoaW1VcGRhdGVPbmx5Ki8gZmFsc2UsIC8qb3V0Ki9jbGllbnQpOwogCiAgICAgaWYoIXJldC5pc09rKCkpIHsKQEAgLTE1MDMsNyArMTUwMyw3IEBACiAgICAgU3RhdHVzIHJldCA9IFN0YXR1czo6b2soKTsKICAgICBzcDxDbGllbnQ+IGNsaWVudCA9IG51bGxwdHI7CiAgICAgcmV0ID0gY29ubmVjdEhlbHBlcjxJQ2FtZXJhQ2xpZW50LENsaWVudD4oY2FtZXJhQ2xpZW50LCBpZCwgYXBpMUNhbWVyYUlkLCBoYWxWZXJzaW9uLAotICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsIHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4oKSwgY2xpZW50VWlkLCBVU0VfQ0FMTElOR19QSUQsIEFQSV8xLAorICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsIHt9LCBjbGllbnRVaWQsIFVTRV9DQUxMSU5HX1BJRCwgQVBJXzEsCiAgICAgICAgICAgICAvKnNoaW1VcGRhdGVPbmx5Ki8gZmFsc2UsIC8qb3V0Ki9jbGllbnQpOwogCiAgICAgaWYoIXJldC5pc09rKCkpIHsKQEAgLTE1NzgsNyArMTU3OCw3IEBACiAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiYgY2FtZXJhQ2IsCiAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjYW1lcmFJZCwKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgIGludCBjbGllbnRVaWQsCiAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyPiogZGV2aWNlKSB7CkBAIC0xNjEyLDcgKzE2MTIsNyBAQAogdGVtcGxhdGU8Y2xhc3MgQ0FMTEJBQ0ssIGNsYXNzIENMSUVOVD4KIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjpjb25uZWN0SGVscGVyKGNvbnN0IHNwPENBTExCQUNLPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBpbnQgaGFsVmVyc2lvbiwgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsIGludCBjbGllbnRVaWQsIGludCBjbGllbnRQaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsIGludCBjbGllbnRVaWQsIGludCBjbGllbnRQaWQsCiAgICAgICAgIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLCBib29sIHNoaW1VcGRhdGVPbmx5LAogICAgICAgICAvKm91dCovc3A8Q0xJRU5UPiYgZGV2aWNlKSB7CiAgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gYmluZGVyOjpTdGF0dXM6Om9rKCk7CkBAIC0yNzE0LDcgKzI3MTQsNyBAQAogQ2FtZXJhU2VydmljZTo6Q2xpZW50OjpDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgIGNvbnN0IHNwPElDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsCiAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZFN0ciwKICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgaW50IGNsaWVudFBpZCwgdWlkX3QgY2xpZW50VWlkLApAQCAtMjc1MSwyNCArMjc1MSwxOCBAQAogCiBDYW1lcmFTZXJ2aWNlOjpCYXNpY0NsaWVudDo6QmFzaWNDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiByZW1vdGVDYWxsYmFjaywKLSAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWRTdHIsIGludCBjYW1lcmFGYWNpbmcsCiAgICAgICAgIGludCBjbGllbnRQaWQsIHVpZF90IGNsaWVudFVpZCwKICAgICAgICAgaW50IHNlcnZpY2VQaWQpOgogICAgICAgICBtQ2FtZXJhSWRTdHIoY2FtZXJhSWRTdHIpLCBtQ2FtZXJhRmFjaW5nKGNhbWVyYUZhY2luZyksCi0gICAgICAgIG1DbGllbnRQYWNrYWdlTmFtZShjbGllbnRQYWNrYWdlTmFtZSksCisgICAgICAgIG1DbGllbnRQYWNrYWdlTmFtZShjbGllbnRQYWNrYWdlTmFtZSksIG1DbGllbnRGZWF0dXJlSWQoY2xpZW50RmVhdHVyZUlkKSwKICAgICAgICAgbUNsaWVudFBpZChjbGllbnRQaWQpLCBtQ2xpZW50VWlkKGNsaWVudFVpZCksCiAgICAgICAgIG1TZXJ2aWNlUGlkKHNlcnZpY2VQaWQpLAogICAgICAgICBtRGlzY29ubmVjdGVkKGZhbHNlKSwgbVVpZElzVHJ1c3RlZChmYWxzZSksCiAgICAgICAgIG1BdWRpb1Jlc3RyaWN0aW9uKGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6QVVESU9fUkVTVFJJQ1RJT05fTk9ORSksCiAgICAgICAgIG1SZW1vdGVCaW5kZXIocmVtb3RlQ2FsbGJhY2spCiB7Ci0gICAgaWYgKGNsaWVudEZlYXR1cmVJZCkgewotICAgICAgICBtQ2xpZW50RmVhdHVyZUlkID0gc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PihuZXcgU3RyaW5nMTYoKmNsaWVudEZlYXR1cmVJZCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1DbGllbnRGZWF0dXJlSWQgPSBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+KCk7Ci0gICAgfQotCiAgICAgaWYgKHNDYW1lcmFTZXJ2aWNlID09IG51bGxwdHIpIHsKICAgICAgICAgc0NhbWVyYVNlcnZpY2UgPSBjYW1lcmFTZXJ2aWNlOwogICAgIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaAppbmRleCA2ODVlZDVlLi42NzcxNzE4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCkBAIC01Miw2ICs1Miw3IEBACiAjaW5jbHVkZSA8bGlzdD4KICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG9wdGlvbmFsPgogI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KICNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgpAQCAtMTQyLDcgKzE0Myw3IEBACiAKICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgICBjb25uZWN0RGV2aWNlKAogICAgICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+JiBjYW1lcmFDYiwgY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLAotICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgICAgICBpbnQzMl90IGNsaWVudFVpZCwKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcj4qIGRldmljZSk7CkBAIC0yOTksNyArMzAwLDcgQEAKICAgICAgICAgQmFzaWNDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUJpbmRlcj4mIHJlbW90ZUNhbGxiYWNrLAogICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZFN0ciwKICAgICAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICAgICAgICAgIGludCBjbGllbnRQaWQsCkBAIC0zMTksNyArMzIwLDcgQEAKICAgICAgICAgY29uc3QgU3RyaW5nOCAgICAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHI7CiAgICAgICAgIGNvbnN0IGludCAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUZhY2luZzsKICAgICAgICAgU3RyaW5nMTYgICAgICAgICAgICAgICAgICAgICAgICBtQ2xpZW50UGFja2FnZU5hbWU7Ci0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4gICAgICAgbUNsaWVudEZlYXR1cmVJZDsKKyAgICAgICAgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4gICAgICAgICBtQ2xpZW50RmVhdHVyZUlkOwogICAgICAgICBwaWRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DbGllbnRQaWQ7CiAgICAgICAgIGNvbnN0IHVpZF90ICAgICAgICAgICAgICAgICAgICAgbUNsaWVudFVpZDsKICAgICAgICAgY29uc3QgcGlkX3QgICAgICAgICAgICAgICAgICAgICBtU2VydmljZVBpZDsKQEAgLTM5MSw3ICszOTIsNyBAQAogICAgICAgICBDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsCiAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkU3RyLAogICAgICAgICAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKQEAgLTcyOSw3ICs3MzAsNyBAQAogICAgIHRlbXBsYXRlPGNsYXNzIENBTExCQUNLLCBjbGFzcyBDTElFTlQ+CiAgICAgYmluZGVyOjpTdGF0dXMgY29ubmVjdEhlbHBlcihjb25zdCBzcDxDQUxMQkFDSz4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGludCBoYWxWZXJzaW9uLCBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsIGludCBjbGllbnRVaWQsIGludCBjbGllbnRQaWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLCBpbnQgY2xpZW50VWlkLCBpbnQgY2xpZW50UGlkLAogICAgICAgICAgICAgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGJvb2wgc2hpbVVwZGF0ZU9ubHksIC8qb3V0Ki9zcDxDTElFTlQ+JiBkZXZpY2UpOwogCiAgICAgLy8gTG9jayBndWFyZGluZyBjYW1lcmEgc2VydmljZSBzdGF0ZQpAQCAtMTA2Myw3ICsxMDY0LDcgQEAKIAogICAgIHN0YXRpYyBiaW5kZXI6OlN0YXR1cyBtYWtlQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3Qgc3A8SUludGVyZmFjZT4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmcxNiYgcGFja2FnZU5hbWUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBmZWF0dXJlSWQsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLCBpbnQgYXBpMUNhbWVyYUlkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGZlYXR1cmVJZCwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIGludCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgICAgICBpbnQgZmFjaW5nLCBpbnQgY2xpZW50UGlkLCB1aWRfdCBjbGllbnRVaWQsIGludCBzZXJ2aWNlUGlkLCBpbnQgaGFsVmVyc2lvbiwKICAgICAgICAgICAgIGludCBkZXZpY2VWZXJzaW9uLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwKICAgICAgICAgICAgIC8qb3V0Ki9zcDxCYXNpY0NsaWVudD4qIGNsaWVudCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcAppbmRleCBiMDQzYzBiLi4wOWUyYzNmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKQEAgLTUwLDcgKzUwLDcgQEAKIENhbWVyYTJDbGllbnQ6OkNhbWVyYTJDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAogICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKKyAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhRGV2aWNlSWQsCiAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCmluZGV4IDAzY2E0NGEuLmY4ZGEwYjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCkBAIC05NCw3ICs5NCw3IEBACiAgICAgQ2FtZXJhMkNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAogICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYURldmljZUlkLAogICAgICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwKICAgICAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAKaW5kZXggODkyOTk2Yy4uYjg2MGNlYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcApAQCAtMzQsNyArMzQsNyBAQAogCiBDYW1lcmFDbGllbnQ6OkNhbWVyYUNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsCi0gICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgIGludCBjYW1lcmFJZCwgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgaW50IGNsaWVudFBpZCwgaW50IGNsaWVudFVpZCwKICAgICAgICAgaW50IHNlcnZpY2VQaWQpOgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmgKaW5kZXggYTdlYjk2MC4uYWFjYjAwZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oCkBAIC02OCw3ICs2OCw3IEBACiAgICAgQ2FtZXJhQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+JiBjYW1lcmFDbGllbnQsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICAgICAgaW50IGNhbWVyYUlkLAogICAgICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgICAgIGludCBjbGllbnRQaWQsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKaW5kZXggZTM1YjQzNi4uMDIyZDY4NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcApAQCAtNTQsNyArNTQsNyBAQAogICAgICAgICBjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+JiByZW1vdGVDYWxsYmFjaywKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLAogICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLApAQCAtODAsNyArODAsNyBAQAogQ2FtZXJhRGV2aWNlQ2xpZW50OjpDYW1lcmFEZXZpY2VDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiYgcmVtb3RlQ2FsbGJhY2ssCiAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICBjb25zdCBzdGQ6Om9wdGlvbmFsPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAogICAgICAgICBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgaW50IGNsaWVudFBpZCwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCmluZGV4IDlkMzg3NGYuLjVjZDE2ZWUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaApAQCAtNTAsNyArNTAsNyBAQAogICAgIENhbWVyYURldmljZUNsaWVudEJhc2UoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4mIHJlbW90ZUNhbGxiYWNrLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwKICAgICAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCkBAIC0xNzUsNyArMTc1LDcgQEAKICAgICBDYW1lcmFEZXZpY2VDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4mIHJlbW90ZUNhbGxiYWNrLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgICAgIGludCBjbGllbnRQaWQsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYU9mZmxpbmVTZXNzaW9uQ2xpZW50LmgKaW5kZXggYjY3ZmNiMy4uMDM2MjFjOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFPZmZsaW5lU2Vzc2lvbkNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhT2ZmbGluZVNlc3Npb25DbGllbnQuaApAQCAtNDgsNyArNDgsNyBAQAogICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8c3A8SUJpbmRlcj4sIHNwPENvbXBvc2l0ZVN0cmVhbT4+JiBvZmZsaW5lQ29tcG9zaXRlU3RyZWFtTWFwLAogICAgICAgICAgICAgY29uc3Qgc3A8SUNhbWVyYURldmljZUNhbGxiYWNrcz4mIHJlbW90ZUNhbGxiYWNrLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpvcHRpb25hbDxTdHJpbmcxNj4mIGNsaWVudEZlYXR1cmVJZCwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkU3RyLCBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICAgICAgaW50IGNsaWVudFBpZCwgdWlkX3QgY2xpZW50VWlkLCBpbnQgc2VydmljZVBpZCkgOgogICAgICAgICAgICAgQ2FtZXJhU2VydmljZTo6QmFzaWNDbGllbnQoCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcAppbmRleCAwYTQxNzc2Li42MDk2OThjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAKQEAgLTQ0LDcgKzQ0LDcgQEAKICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgIGNvbnN0IHNwPFRDYW1DYWxsYmFja3M+JiByZW1vdGVDYWxsYmFjaywKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCisgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLAogICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaAppbmRleCAwNDJmNWFhLi5kNzUwNmFmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaApAQCAtNDgsNyArNDgsNyBAQAogICAgIENhbWVyYTJDbGllbnRCYXNlKGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFRDYW1DYWxsYmFja3M+JiByZW1vdGVDYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPFN0cmluZzE2PiYgY2xpZW50RmVhdHVyZUlkLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6b3B0aW9uYWw8U3RyaW5nMTY+JiBjbGllbnRGZWF0dXJlSWQsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwKICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmNwcAppbmRleCBhNDYxMzNlLi45ZWE5NTI2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmNwcApAQCAtMTAzLDcgKzEwMyw3IEBACiAgICAgfQogICAgIHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBjYWxsYmFja3MgPSBoeWJyaWRDYWxsYmFja3M7CiAgICAgYmluZGVyOjpTdGF0dXMgc2VydmljZVJldCA9IG1BaWRsSUNhbWVyYVNlcnZpY2UtPmNvbm5lY3REZXZpY2UoCi0gICAgICAgICAgICBjYWxsYmFja3MsIFN0cmluZzE2KGNhbWVyYUlkLmNfc3RyKCkpLCBTdHJpbmcxNigiIiksIHN0ZDo6dW5pcXVlX3B0cjxTdHJpbmcxNj4oKSwKKyAgICAgICAgICAgIGNhbGxiYWNrcywgU3RyaW5nMTYoY2FtZXJhSWQuY19zdHIoKSksIFN0cmluZzE2KCIiKSwge30sCiAgICAgICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OlVTRV9DQUxMSU5HX1VJRCwgLypvdXQqLyZkZXZpY2VSZW1vdGUpOwogICAgIEhTdGF0dXMgc3RhdHVzID0gSFN0YXR1czo6Tk9fRVJST1I7CiAgICAgaWYgKCFzZXJ2aWNlUmV0LmlzT2soKSkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLmJwCmluZGV4IGM0ZWZiYWEuLjA1YmJiYzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQuYnAKQEAgLTE1LDE4ICsxNSw2IEBACiAgICAgICAgICJsaWJtZWRpYV9jb2RlY3NlcnZpY2VyZWdpc3RyYW50IiwKICAgICBdLAogCi0gICAgdGFyZ2V0OiB7Ci0gICAgICAgIGFuZHJvaWQ6IHsKLSAgICAgICAgICAgIHByb2R1Y3RfdmFyaWFibGVzOiB7Ci0gICAgICAgICAgICAgICAgbWFsbG9jX25vdF9zdmVsdGU6IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU2N1ZG8gaW5jcmVhc2VzIG1lbW9yeSBmb290cHJpbnQsIHNvIG9ubHkgZW5hYmxlIG9uCi0gICAgICAgICAgICAgICAgICAgIC8vIG5vbi1zdmVsdGUgZGV2aWNlcy4KLSAgICAgICAgICAgICAgICAgICAgc2hhcmVkX2xpYnM6IFsibGliY19zY3VkbyJdLAotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICB9LAotICAgICAgICB9LAotICAgIH0sCi0KICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCiAgICAgXSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9BbmRyb2lkLmJwCmluZGV4IDBiMjVkNjIuLjAzZTFlNDEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvQW5kcm9pZC5icApAQCAtMzUsMjAgKzM1LDYgQEAKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJhdnNlcnZpY2VzX21pbmlqYWlsIiwKICAgICBdLAotICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJiaW9uaWNfbGliY19wbGF0Zm9ybV9oZWFkZXJzIiwKLSAgICBdLAotICAgIHRhcmdldDogewotICAgICAgICBhbmRyb2lkOiB7Ci0gICAgICAgICAgICBwcm9kdWN0X3ZhcmlhYmxlczogewotICAgICAgICAgICAgICAgIG1hbGxvY19ub3Rfc3ZlbHRlOiB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNjdWRvIGluY3JlYXNlcyBtZW1vcnkgZm9vdHByaW50LCBzbyBvbmx5IGVuYWJsZSBvbgotICAgICAgICAgICAgICAgICAgICAvLyBub24tc3ZlbHRlIGRldmljZXMuCi0gICAgICAgICAgICAgICAgICAgIHNoYXJlZF9saWJzOiBbImxpYmNfc2N1ZG8iXSwKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgfSwKLSAgICAgICAgfSwKLSAgICB9LAogICAgIGluaXRfcmM6IFsibWVkaWFleHRyYWN0b3IucmMiXSwKIAogICAgIGNmbGFnczogWwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKaW5kZXggOTk5MmQxYy4uNzFhNWJmZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCkBAIC0zOSwyMyArMzksMjMgQEAKIAogOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBNZWRpYUV4dHJhY3RvclNlcnZpY2U6Om1ha2VFeHRyYWN0b3IoCiAgICAgICAgIGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpJRGF0YVNvdXJjZT4mIHJlbW90ZVNvdXJjZSwKLSAgICAgICAgY29uc3QgOjpzdGQ6OnVuaXF1ZV9wdHI8IDo6c3RkOjpzdHJpbmc+ICZtaW1lLAorICAgICAgICBjb25zdCA6OnN0ZDo6b3B0aW9uYWw8IDo6c3RkOjpzdHJpbmc+ICZtaW1lLAogICAgICAgICA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SU1lZGlhRXh0cmFjdG9yPiogX2FpZGxfcmV0dXJuKSB7Ci0gICAgQUxPR1YoIkBAQCBNZWRpYUV4dHJhY3RvclNlcnZpY2U6Om1ha2VFeHRyYWN0b3IgZm9yICVzIiwgbWltZS5nZXQoKS0+Y19zdHIoKSk7CisgICAgQUxPR1YoIkBAQCBNZWRpYUV4dHJhY3RvclNlcnZpY2U6Om1ha2VFeHRyYWN0b3IgZm9yICVzIiwgbWltZSA/IG1pbWUtPmNfc3RyKCkgOiBudWxscHRyKTsKIAogICAgIHNwPERhdGFTb3VyY2U+IGxvY2FsU291cmNlID0gQ3JlYXRlRGF0YVNvdXJjZUZyb21JRGF0YVNvdXJjZShyZW1vdGVTb3VyY2UpOwogCiAgICAgTWVkaWFCdWZmZXI6OnVzZVNoYXJlZE1lbW9yeSgpOwogICAgIHNwPElNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpDcmVhdGVGcm9tU2VydmljZSgKICAgICAgICAgICAgIGxvY2FsU291cmNlLAotICAgICAgICAgICAgbWltZS5nZXQoKSA/IG1pbWUuZ2V0KCktPmNfc3RyKCkgOiBudWxscHRyKTsKKyAgICAgICAgICAgIG1pbWUgPyBtaW1lLT5jX3N0cigpIDogbnVsbHB0cik7CiAKICAgICBBTE9HVigiZXh0cmFjdG9yIHNlcnZpY2UgY3JlYXRlZCAlcCAoJXMpIiwKICAgICAgICAgICAgIGV4dHJhY3Rvci5nZXQoKSwKICAgICAgICAgICAgIGV4dHJhY3RvciA9PSBudWxscHRyID8gIiIgOiBleHRyYWN0b3ItPm5hbWUoKSk7CiAKICAgICBpZiAoZXh0cmFjdG9yICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmVnaXN0ZXJNZWRpYUV4dHJhY3RvcihleHRyYWN0b3IsIGxvY2FsU291cmNlLCBtaW1lLmdldCgpID8gbWltZS5nZXQoKS0+Y19zdHIoKSA6IG51bGxwdHIpOworICAgICAgICByZWdpc3Rlck1lZGlhRXh0cmFjdG9yKGV4dHJhY3RvciwgbG9jYWxTb3VyY2UsIG1pbWUgPyBtaW1lLT5jX3N0cigpIDogbnVsbHB0cik7CiAgICAgfQogICAgICpfYWlkbF9yZXR1cm4gPSBleHRyYWN0b3I7CiAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmggYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuaAppbmRleCAxYjQwYmY5Li4wMDgxZTdlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuaApAQCAtMzMsNyArMzMsNyBAQAogCiAgICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIG1ha2VFeHRyYWN0b3IoCiAgICAgICAgICAgICBjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6SURhdGFTb3VyY2U+JiBzb3VyY2UsCi0gICAgICAgICAgICBjb25zdCA6OnN0ZDo6dW5pcXVlX3B0cjwgOjpzdGQ6OnN0cmluZz4gJm1pbWUsCisgICAgICAgICAgICBjb25zdCA6OnN0ZDo6b3B0aW9uYWw8IDo6c3RkOjpzdHJpbmc+ICZtaW1lLAogICAgICAgICAgICAgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OklNZWRpYUV4dHJhY3Rvcj4qIF9haWRsX3JldHVybik7CiAKICAgICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgbWFrZUlEYXRhU291cmNlKApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvbWFpbl9leHRyYWN0b3JzZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL21haW5fZXh0cmFjdG9yc2VydmljZS5jcHAKaW5kZXggZjIxNTc0Zi4uYjdiNTFhNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvbWFpbl9leHRyYWN0b3JzZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9tYWluX2V4dHJhY3RvcnNlcnZpY2UuY3BwCkBAIC0yOCw4ICsyOCw2IEBACiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDx1dGlscy9taXNjLmg+CiAKLSNpbmNsdWRlIDxiaW9uaWMvcmVzZXJ2ZWRfc2lnbmFscy5oPgotCiAvLyBmcm9tIExPQ0FMX0NfSU5DTFVERVMKICNpbmNsdWRlICJNZWRpYUV4dHJhY3RvclNlcnZpY2UuaCIKICNpbmNsdWRlICJtaW5pamFpbC5oIgpAQCAtNTAsMTAgKzQ4LDYgQEAKIAogICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKIAotICAgIC8vIERvIG5vdCBhc3Npc3QgcGxhdGZvcm0gcHJvZmlsZXJzIChyZWxldmFudCBvbmx5IG9uIGRlYnVnIGJ1aWxkcykuCi0gICAgLy8gT3RoZXJ3aXNlLCB0aGUgc2lnbmFsIGhhbmRsZXIgY2FuIHZpb2xhdGUgdGhlIHNlY2NvbXAgcG9saWN5LgotICAgIHNpZ25hbChCSU9OSUNfU0lHTkFMX1BST0ZJTEVSLCBTSUdfSUdOKTsKLQogICAgIC8vYi82MjI1NTk1OTogdGhpcyBmb3JjZXMgbGlidXRpcy5zbyB0byBkbG9wZW4gdmVuZG9yIHZlcnNpb24gb2YgbGlidXRpbHMuc28KICAgICAvL2JlZm9yZSBtaW5pamFpbCBpcyBvbi4gVGhpcyBpcyBkaXJ0eSBidXQgcmVxdWlyZWQgc2luY2Ugc29tZSBzeXNjYWxscyBzdWNoCiAgICAgLy9hcyBwcmVhZDY0IGFyZSB1c2VkIGJ5IGxpbmtlciBidXQgYXJlbid0IGFsbG93ZWQgaW4gdGhlIG1pbmlqYWlsLiBCeQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0FuZHJvaWQuYnAKaW5kZXggYTM1MTlkNS4uMGQ1M2M1ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9BbmRyb2lkLmJwCkBAIC0xLDYgKzEsNCBAQAotCi0KLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJyZXNvdXJjZW1hbmFnZXJzZXJ2aWNlIiwKIAogICAgIHNyY3M6IFsKQEAgLTI1LDUgKzIzLDQgQEAKICAgICBdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCi0KIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuaAppbmRleCBlZTk4MmI3Li40OWMyNDdlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oCkBAIC00Myw3ICs0Myw3IEBACiB1c2luZyA6OmFpZGw6OmFuZHJvaWQ6Om1lZGlhOjpNZWRpYVJlc291cmNlUG9saWN5UGFyY2VsOwogCiB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6dHVwbGU8Ci0gICAgICAgIE1lZGlhUmVzb3VyY2U6OlR5cGUsIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGUsIHN0ZDo6dmVjdG9yPGludDhfdD4+LAorICAgICAgICBNZWRpYVJlc291cmNlOjpUeXBlLCBNZWRpYVJlc291cmNlOjpTdWJUeXBlLCBzdGQ6OnZlY3Rvcjx1aW50OF90Pj4sCiAgICAgICAgIE1lZGlhUmVzb3VyY2VQYXJjZWw+IFJlc291cmNlTGlzdDsKIAogc3RydWN0IFJlc291cmNlSW5mbyB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L0FuZHJvaWQuYnAKaW5kZXggYjZjNTQ4Yy4uNmIyZWY2OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvQW5kcm9pZC5icApAQCAtMywxMiArMywxMiBAQAogICAgIG5hbWU6ICJSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlX3Rlc3QiLAogICAgIHNyY3M6IFsiUmVzb3VyY2VNYW5hZ2VyU2VydmljZV90ZXN0LmNwcCJdLAogICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAorICAgIHN0YXRpY19saWJzOiBbImxpYnJlc291cmNlbWFuYWdlcnNlcnZpY2UiXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmJpbmRlcl9uZGsiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYm1lZGlhIiwKLSAgICAgICAgImxpYnJlc291cmNlbWFuYWdlcnNlcnZpY2UiLAogICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAgICAgaW5jbHVkZV9kaXJzOiBbCkBAIC0xOSwxNyArMTksMTYgQEAKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVdhbGwiLAogICAgIF0sCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KIAogY2NfdGVzdCB7CiAgICAgbmFtZTogIlNlcnZpY2VMb2dfdGVzdCIsCiAgICAgc3JjczogWyJTZXJ2aWNlTG9nX3Rlc3QuY3BwIl0sCiAgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCisgICAgc3RhdGljX2xpYnM6IFsibGlicmVzb3VyY2VtYW5hZ2Vyc2VydmljZSJdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlibWVkaWEiLAotICAgICAgICAibGlicmVzb3VyY2VtYW5hZ2Vyc2VydmljZSIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKICAgICBpbmNsdWRlX2RpcnM6IFsKQEAgLTQwLDUgKzM5LDQgQEAKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVdhbGwiLAogICAgIF0sCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhdHJhbnNjb2RpbmcvQW5kcm9pZC5icAppbmRleCAxNzM0N2E5Li44Y2YyZDYyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYXRyYW5zY29kaW5nL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWF0cmFuc2NvZGluZy9BbmRyb2lkLmJwCkBAIC00NCwxOCArNDQsNiBAQAogICAgICAgICAibWVkaWF0cmFuc2NvZGluZ19haWRsX2ludGVyZmFjZS1uZGtfcGxhdGZvcm0iLAogICAgIF0sCiAKLSAgICB0YXJnZXQ6IHsKLSAgICAgICAgYW5kcm9pZDogewotICAgICAgICAgICAgcHJvZHVjdF92YXJpYWJsZXM6IHsKLSAgICAgICAgICAgICAgICBtYWxsb2Nfbm90X3N2ZWx0ZTogewotICAgICAgICAgICAgICAgICAgICAvLyBTY3VkbyBpbmNyZWFzZXMgbWVtb3J5IGZvb3RwcmludCwgc28gb25seSBlbmFibGUgb24KLSAgICAgICAgICAgICAgICAgICAgLy8gbm9uLXN2ZWx0ZSBkZXZpY2VzLgotICAgICAgICAgICAgICAgICAgICBzaGFyZWRfbGliczogWyJsaWJjX3NjdWRvIl0sCi0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIH0sCi0gICAgICAgIH0sCi0gICAgfSwKLQogICAgIGluaXRfcmM6IFsibWVkaWF0cmFuc2NvZGluZy5yYyJdLAogCiAgICAgY2ZsYWdzOiBbCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuY3BwCmluZGV4IDAxYjFjMmUuLmYyY2YwMTYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuY3BwCkBAIC0xMDUsNyArMTA1LDcgQEAKICAgICB9CiAgICAgaW50MzJfdCBjYXBhY2l0eUluRnJhbWVzID0gbnVtQnVyc3RzICogZnJhbWVzUGVyQnVyc3Q7CiAKLSAgICAvLyBGaW5hbCBzYW5pdHkgY2hlY2suCisgICAgLy8gRmluYWwgcmFuZ2UgY2hlY2suCiAgICAgaWYgKGNhcGFjaXR5SW5GcmFtZXMgPiBNQVhfRlJBTUVTX1BFUl9CVUZGRVIpIHsKICAgICAgICAgQUxPR0UoImNhbGN1bGF0ZUJ1ZmZlckNhcGFjaXR5KCkgY2FsYyBjYXBhY2l0eSAlZCA+IG1heCAlZCIsCiAgICAgICAgICAgICAgIGNhcGFjaXR5SW5GcmFtZXMsIE1BWF9GUkFNRVNfUEVSX0JVRkZFUik7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9TaGFyZWRNZW1vcnlQcm94eS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9TaGFyZWRNZW1vcnlQcm94eS5jcHAKaW5kZXggYzQzZWQyMi4uNzhkNDg4NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvU2hhcmVkTWVtb3J5UHJveHkuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL1NoYXJlZE1lbW9yeVByb3h5LmNwcApAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KICNpbmNsdWRlICJTaGFyZWRNZW1vcnlQcm94eS5oIgo=