ZGlmZiAtLWdpdCBhL2FkYi9BbmRyb2lkLmJwIGIvYWRiL0FuZHJvaWQuYnAKaW5kZXggNDdkYWZmZi4uMDZjZmNiZiAxMDA2NDQKLS0tIGEvYWRiL0FuZHJvaWQuYnAKKysrIGIvYWRiL0FuZHJvaWQuYnAKQEAgLTI3LDYgKzI3LDcgQEAKICAgICAgICAgIi1EQURCX0hPU1Q9MSIsICAgICAgICAgLy8gb3ZlcnJpZGRlbiBieSBhZGJkX2RlZmF1bHRzCiAgICAgICAgICItREFMTE9XX0FEQkRfUk9PVD0wIiwgIC8vIG92ZXJyaWRkZW4gYnkgYWRiZF9kZWZhdWx0cwogICAgICAgICAiLURBTkRST0lEX0JBU0VfVU5JUVVFX0ZEX0RJU0FCTEVfSU1QTElDSVRfQ09OVkVSU0lPTj0xIiwKKyAgICAgICAgIi1ERU5BQkxFX0ZBU1RERVBMT1k9MSIsIC8vIGVuYWJsZSBmYXN0IGRlcGxveQogICAgIF0sCiAgICAgY3BwX3N0ZDogImV4cGVyaW1lbnRhbCIsCiAKQEAgLTI3MCwyMiArMjcxLDMzIEBACiAgICAgICAgICJjbGllbnQvY29uc29sZS5jcHAiLAogICAgICAgICAiY2xpZW50L2FkYl9pbnN0YWxsLmNwcCIsCiAgICAgICAgICJjbGllbnQvbGluZV9wcmludGVyLmNwcCIsCisgICAgICAgICJjbGllbnQvZmFzdGRlcGxveS5jcHAiLAorICAgICAgICAiY2xpZW50L2Zhc3RkZXBsb3ljYWxsYmFja3MuY3BwIiwKICAgICAgICAgInNoZWxsX3NlcnZpY2VfcHJvdG9jb2wuY3BwIiwKICAgICBdLAogCisgICAgZ2VuZXJhdGVkX2hlYWRlcnM6IFsKKyAgICAgICAgImJpbjJjX2Zhc3RkZXBsb3lhZ2VudCIsCisgICAgICAgICJiaW4yY19mYXN0ZGVwbG95YWdlbnRzY3JpcHQiCisgICAgXSwKKwogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJhZGJfaG9zdCIsCisgICAgICAgICJsaWJhbmRyb2lkZnciLAogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGliY3J5cHRvX3V0aWxzIiwKICAgICAgICAgImxpYmNyeXB0byIsCisgICAgICAgICJsaWJmYXN0ZGVwbG95X2hvc3QiLAogICAgICAgICAibGliZGlhZ25vc2VfdXNiIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJtZG5zc2QiLAorICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAogICAgICAgICAibGlidXNiIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliemlwYXJjaGl2ZSIsCisgICAgICAgICJsaWJ6IiwKICAgICBdLAogCiAgICAgc3RsOiAibGliYysrX3N0YXRpYyIsCkBAIC0yOTUsMTAgKzMwNyw2IEBACiAgICAgLy8gd2lsbCB2aW9sYXRlIE9EUgogICAgIHNoYXJlZF9saWJzOiBbXSwKIAotICAgIHJlcXVpcmVkOiBbCi0gICAgICAgICJkZXBsb3lwYXRjaGdlbmVyYXRvciIsCi0gICAgXSwKLQogICAgIC8vIEFyY2hpdmUgYWRiLCBhZGIuZXhlLgogICAgIGRpc3Q6IHsKICAgICAgICAgdGFyZ2V0czogWwpAQCAtNjU4LDMgKzY2Niw5MCBAQAogICAgICAgICB9LAogICAgIH0sCiB9CisKKy8vIE5vdGU6IHVzaW5nIHBpcGUgZm9yIHh4ZCB0byBjb250cm9sIHRoZSB2YXJpYWJsZSBuYW1lIGdlbmVyYXRlZAorLy8gdGhlIGRlZmF1bHQgbmFtZSB1c2VkIGJ5IHh4ZCBpcyB0aGUgcGF0aCB0byB0aGUgaW5wdXQgZmlsZS4KK2phdmFfZ2VucnVsZSB7CisgICAgbmFtZTogImJpbjJjX2Zhc3RkZXBsb3lhZ2VudCIsCisgICAgb3V0OiBbImRlcGxveWFnZW50LmluYyJdLAorICAgIHNyY3M6IFsiOmRlcGxveWFnZW50Il0sCisgICAgY21kOiAiKGVjaG8gJ3Vuc2lnbmVkIGNoYXIga0RlcGxveUFnZW50W10gPSB7JyAmJiB4eGQgLWkgPCQoaW4pICYmIGVjaG8gJ307JykgPiAkKG91dCkiLAorfQorCitnZW5ydWxlIHsKKyAgICBuYW1lOiAiYmluMmNfZmFzdGRlcGxveWFnZW50c2NyaXB0IiwKKyAgICBvdXQ6IFsiZGVwbG95YWdlbnRzY3JpcHQuaW5jIl0sCisgICAgc3JjczogWyJmYXN0ZGVwbG95L2RlcGxveWFnZW50L2RlcGxveWFnZW50LnNoIl0sCisgICAgY21kOiAiKGVjaG8gJ3Vuc2lnbmVkIGNoYXIga0RlcGxveUFnZW50U2NyaXB0W10gPSB7JyAmJiB4eGQgLWkgPCQoaW4pICYmIGVjaG8gJ307JykgPiAkKG91dCkiLAorfQorCitjY19saWJyYXJ5X2hvc3Rfc3RhdGljIHsKKyAgICBuYW1lOiAibGliZmFzdGRlcGxveV9ob3N0IiwKKyAgICBkZWZhdWx0czogWyJhZGJfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJmYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3IuY3BwIiwKKyAgICAgICAgImZhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvcGF0Y2hfdXRpbHMuY3BwIiwKKyAgICAgICAgImZhc3RkZXBsb3kvcHJvdG8vQXBrRW50cnkucHJvdG8iLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmFkYl9ob3N0IiwKKyAgICAgICAgImxpYmFuZHJvaWRmdyIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJjcnlwdG9fdXRpbHMiLAorICAgICAgICAibGliY3J5cHRvIiwKKyAgICAgICAgImxpYmRpYWdub3NlX3VzYiIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWRuc3NkIiwKKyAgICAgICAgImxpYnVzYiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ6aXBhcmNoaXZlIiwKKyAgICAgICAgImxpYnoiLAorICAgIF0sCisgICAgc3RsOiAibGliYysrX3N0YXRpYyIsCisgICAgcHJvdG86IHsKKyAgICAgICAgdHlwZTogImxpdGUiLAorICAgICAgICBleHBvcnRfcHJvdG9faGVhZGVyczogdHJ1ZSwKKyAgICB9LAorICAgIHRhcmdldDogeworICAgICAgICB3aW5kb3dzOiB7CisgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgICAgICAgICAgc2hhcmVkX2xpYnM6IFsiQWRiV2luQXBpIl0sCisgICAgICAgIH0sCisgICAgfSwKK30KKworY2NfdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAiZmFzdGRlcGxveV90ZXN0IiwKKyAgICBkZWZhdWx0czogWyJhZGJfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJmYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3JfdGVzdC5jcHAiLAorICAgICAgICAiZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9wYXRjaF91dGlsc190ZXN0LmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYWRiX2hvc3QiLAorICAgICAgICAibGliYW5kcm9pZGZ3IiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmNyeXB0b191dGlscyIsCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGliZGlhZ25vc2VfdXNiIiwKKyAgICAgICAgImxpYmZhc3RkZXBsb3lfaG9zdCIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWRuc3NkIiwKKyAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKKyAgICAgICAgImxpYnVzYiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ6aXBhcmNoaXZlIiwKKyAgICAgICAgImxpYnoiLAorICAgIF0sCisgICAgdGFyZ2V0OiB7CisgICAgICAgIHdpbmRvd3M6IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgICAgICAgICBzaGFyZWRfbGliczogWyJBZGJXaW5BcGkiXSwKKyAgICAgICAgfSwKKyAgICB9LAorICAgIGRhdGE6IFsKKyAgICAgICAgImZhc3RkZXBsb3kvdGVzdGRhdGEvcm90YXRpbmdfY3ViZS1yZWxlYXNlLmFwayIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL2FkYi9hZGJfdXRpbHMuY3BwIGIvYWRiL2FkYl91dGlscy5jcHAKaW5kZXggY2Y1ZmJjOC4uZDE5MTBmMSAxMDA2NDQKLS0tIGEvYWRiL2FkYl91dGlscy5jcHAKKysrIGIvYWRiL2FkYl91dGlscy5jcHAKQEAgLTMyMCw2ICszMjAsMTAgQEAKIH0KIAogc3RkOjpzdHJpbmcgR2V0TG9nRmlsZVBhdGgoKSB7CisgICAgLy8gaHR0cHM6Ly9pc3N1ZXRyYWNrZXIuZ29vZ2xlLmNvbS8xMTI1ODg0OTMKKyAgICBjb25zdCBjaGFyKiBwYXRoID0gZ2V0ZW52KCJBTkRST0lEX0FEQl9MT0dfUEFUSCIpOworICAgIGlmIChwYXRoKSByZXR1cm4gcGF0aDsKKwogI2lmIGRlZmluZWQoX1dJTjMyKQogICAgIGNvbnN0IGNoYXIgbG9nX25hbWVbXSA9ICJhZGIubG9nIjsKICAgICBXQ0hBUiB0ZW1wX3BhdGhbTUFYX1BBVEhdOwpkaWZmIC0tZ2l0IGEvYWRiL2NsaWVudC9jb21tYW5kbGluZS5jcHAgYi9hZGIvY2xpZW50L2NvbW1hbmRsaW5lLmNwcAppbmRleCAxMWEzZGZkLi4zYzAzZWIyIDEwMDY0NAotLS0gYS9hZGIvY2xpZW50L2NvbW1hbmRsaW5lLmNwcAorKysgYi9hZGIvY2xpZW50L2NvbW1hbmRsaW5lLmNwcApAQCAtOTYsOSArOTYsOCBAQAogICAgICAgICAiIHZlcnNpb24gICAgICAgICAgICAgICAgICBzaG93IHZlcnNpb24gbnVtXG4iCiAgICAgICAgICJcbiIKICAgICAgICAgIm5ldHdvcmtpbmc6XG4iCi0gICAgICAgICIgY29ubmVjdCBIT1NUWzpQT1JUXSAgICAgIGNvbm5lY3QgdG8gYSBkZXZpY2UgdmlhIFRDUC9JUCBbZGVmYXVsdCBwb3J0PTU1NTVdXG4iCi0gICAgICAgICIgZGlzY29ubmVjdCBbSE9TVFs6UE9SVF1dXG4iCi0gICAgICAgICIgICAgIGRpc2Nvbm5lY3QgZnJvbSBnaXZlbiBUQ1AvSVAgZGV2aWNlIFtkZWZhdWx0IHBvcnQ9NTU1NV0sIG9yIGFsbFxuIgorICAgICAgICAiIGNvbm5lY3QgSE9TVFs6UE9SVF0gICAgICBjb25uZWN0IHRvIGEgZGV2aWNlIHZpYSBUQ1AvSVBcbiIKKyAgICAgICAgIiBkaXNjb25uZWN0IFtbSE9TVF06UE9SVF0gZGlzY29ubmVjdCBmcm9tIGdpdmVuIFRDUC9JUCBkZXZpY2UsIG9yIGFsbFxuIgogICAgICAgICAiIGZvcndhcmQgLS1saXN0ICAgICAgICAgICBsaXN0IGFsbCBmb3J3YXJkIHNvY2tldCBjb25uZWN0aW9uc1xuIgogICAgICAgICAiIGZvcndhcmQgWy0tbm8tcmViaW5kXSBMT0NBTCBSRU1PVEVcbiIKICAgICAgICAgIiAgICAgZm9yd2FyZCBzb2NrZXQgY29ubmVjdGlvbiB1c2luZzpcbiIKQEAgLTEzMCw3ICsxMjksNyBAQAogICAgICAgICAiICAgICAtYTogcHJlc2VydmUgZmlsZSB0aW1lc3RhbXAgYW5kIG1vZGVcbiIKICAgICAgICAgIiBzeW5jIFthbGx8ZGF0YXxvZG18b2VtfHByb2R1Y3R8c3lzdGVtfHN5c3RlbV9leHR8dmVuZG9yXVxuIgogICAgICAgICAiICAgICBzeW5jIGEgbG9jYWwgYnVpbGQgZnJvbSAkQU5EUk9JRF9QUk9EVUNUX09VVCB0byB0aGUgZGV2aWNlIChkZWZhdWx0IGFsbClcbiIKLSAgICAgICAgIiAgICAgLWw6IGxpc3QgYnV0IGRvbid0IGNvcHlcbiIKKyAgICAgICAgIiAgICAgLWw6IGxpc3QgZmlsZXMgdGhhdCB3b3VsZCBiZSBjb3BpZWQsIGJ1dCBkb24ndCBjb3B5IHRoZW1cbiIKICAgICAgICAgIlxuIgogICAgICAgICAic2hlbGw6XG4iCiAgICAgICAgICIgc2hlbGwgWy1lIEVTQ0FQRV0gWy1uXSBbLVR0XSBbLXhdIFtDT01NQU5ELi4uXVxuIgpAQCAtMTYxNSwxMyArMTYxNCwxMyBAQAogICAgICAgICByZXR1cm4gYWRiX3F1ZXJ5X2NvbW1hbmQocXVlcnkpOwogICAgIH0KICAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMF0sICJjb25uZWN0IikpIHsKLSAgICAgICAgaWYgKGFyZ2MgIT0gMikgZXJyb3JfZXhpdCgidXNhZ2U6IGFkYiBjb25uZWN0IDxob3N0Pls6PHBvcnQ+XSIpOworICAgICAgICBpZiAoYXJnYyAhPSAyKSBlcnJvcl9leGl0KCJ1c2FnZTogYWRiIGNvbm5lY3QgSE9TVFs6UE9SVD5dIik7CiAKICAgICAgICAgc3RkOjpzdHJpbmcgcXVlcnkgPSBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoImhvc3Q6Y29ubmVjdDolcyIsIGFyZ3ZbMV0pOwogICAgICAgICByZXR1cm4gYWRiX3F1ZXJ5X2NvbW1hbmQocXVlcnkpOwogICAgIH0KICAgICBlbHNlIGlmICghc3RyY21wKGFyZ3ZbMF0sICJkaXNjb25uZWN0IikpIHsKLSAgICAgICAgaWYgKGFyZ2MgPiAyKSBlcnJvcl9leGl0KCJ1c2FnZTogYWRiIGRpc2Nvbm5lY3QgWzxob3N0Pls6PHBvcnQ+XV0iKTsKKyAgICAgICAgaWYgKGFyZ2MgPiAyKSBlcnJvcl9leGl0KCJ1c2FnZTogYWRiIGRpc2Nvbm5lY3QgW0hPU1RbOlBPUlRdXSIpOwogCiAgICAgICAgIHN0ZDo6c3RyaW5nIHF1ZXJ5ID0gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKCJob3N0OmRpc2Nvbm5lY3Q6JXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXJnYyA9PSAyKSA/IGFyZ3ZbMV0gOiAiIik7CkBAIC0xODkxLDcgKzE4OTAsMTAgQEAKICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndlswXSwgInRyYWNrLWpkd3AiKSkgewogICAgICAgICByZXR1cm4gYWRiX2Nvbm5lY3RfY29tbWFuZCgidHJhY2stamR3cCIpOwogICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzBdLCAidHJhY2stZGV2aWNlcyIpKSB7Ci0gICAgICAgIHJldHVybiBhZGJfY29ubmVjdF9jb21tYW5kKCJob3N0OnRyYWNrLWRldmljZXMiKTsKKyAgICAgICAgaWYgKGFyZ2MgPiAyIHx8IChhcmdjID09IDIgJiYgc3RyY21wKGFyZ3ZbMV0sICItbCIpKSkgeworICAgICAgICAgICAgZXJyb3JfZXhpdCgidXNhZ2U6IGFkYiB0cmFjay1kZXZpY2VzIFstbF0iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWRiX2Nvbm5lY3RfY29tbWFuZChhcmdjID09IDIgPyAiaG9zdDp0cmFjay1kZXZpY2VzLWwiIDogImhvc3Q6dHJhY2stZGV2aWNlcyIpOwogICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2WzBdLCAicmF3IikpIHsKICAgICAgICAgaWYgKGFyZ2MgIT0gMikgewogICAgICAgICAgICAgZXJyb3JfZXhpdCgidXNhZ2U6IGFkYiByYXcgU0VSVklDRSIpOwpkaWZmIC0tZ2l0IGEvYWRiL2NsaWVudC9mYXN0ZGVwbG95LmNwcCBiL2FkYi9jbGllbnQvZmFzdGRlcGxveS5jcHAKaW5kZXggZjRlODY2NC4uZmJhZTIxOSAxMDA2NDQKLS0tIGEvYWRiL2NsaWVudC9mYXN0ZGVwbG95LmNwcAorKysgYi9hZGIvY2xpZW50L2Zhc3RkZXBsb3kuY3BwCkBAIC0yNyw2ICsyNyw5IEBACiAjaW5jbHVkZSAiYW5kcm9pZGZ3L1ppcEZpbGVSTy5oIgogI2luY2x1ZGUgImNsaWVudC9maWxlX3N5bmNfY2xpZW50LmgiCiAjaW5jbHVkZSAiY29tbWFuZGxpbmUuaCIKKyNpbmNsdWRlICJkZXBsb3lhZ2VudC5pbmMiICAgICAgICAvLyBHZW5lcmF0ZWQgaW5jbHVkZSB2aWEgYnVpbGQgcnVsZS4KKyNpbmNsdWRlICJkZXBsb3lhZ2VudHNjcmlwdC5pbmMiICAvLyBHZW5lcmF0ZWQgaW5jbHVkZSB2aWEgYnVpbGQgcnVsZS4KKyNpbmNsdWRlICJmYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3IuaCIKICNpbmNsdWRlICJmYXN0ZGVwbG95Y2FsbGJhY2tzLmgiCiAjaW5jbHVkZSAic3lzZGVwcy5oIgogCkBAIC0zNSw2ICszOCw4IEBACiBzdGF0aWMgY29uc3RleHByIGxvbmcga1JlcXVpcmVkQWdlbnRWZXJzaW9uID0gMHgwMDAwMDAwMjsKIAogc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBrRGV2aWNlQWdlbnRQYXRoID0gIi9kYXRhL2xvY2FsL3RtcC8iOworc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBrRGV2aWNlQWdlbnRGaWxlID0gIi9kYXRhL2xvY2FsL3RtcC9kZXBsb3lhZ2VudC5qYXIiOworc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBrRGV2aWNlQWdlbnRTY3JpcHQgPSAiL2RhdGEvbG9jYWwvdG1wL2RlcGxveWFnZW50IjsKIAogc3RhdGljIGJvb2wgZ191c2VfbG9jYWxhZ2VudCA9IGZhbHNlOwogCkBAIC03MSw0NiArNzYsMzIgQEAKICAgICBnX3VzZV9sb2NhbGFnZW50ID0gdXNlX2xvY2FsYWdlbnQ7CiB9CiAKLS8vIGxvY2FsX3BhdGggLSBtdXN0IHN0YXJ0IHdpdGggYSAnLycgYW5kIGJlIHJlbGF0aXZlIHRvICRBTkRST0lEX1BST0RVQ1RfT1VUCi1zdGF0aWMgc3RkOjpzdHJpbmcgZ2V0X2FnZW50X2NvbXBvbmVudF9ob3N0X3BhdGgoY29uc3QgY2hhciogbG9jYWxfcGF0aCwgY29uc3QgY2hhciogc2RrX3BhdGgpIHsKLSAgICBzdGQ6OnN0cmluZyBhZGJfZGlyID0gYW5kcm9pZDo6YmFzZTo6R2V0RXhlY3V0YWJsZURpcmVjdG9yeSgpOwotICAgIGlmIChhZGJfZGlyLmVtcHR5KCkpIHsKLSAgICAgICAgZXJyb3JfZXhpdCgiQ291bGQgbm90IGRldGVybWluZSBsb2NhdGlvbiBvZiBhZGIhIik7Ci0gICAgfQotCi0gICAgaWYgKGdfdXNlX2xvY2FsYWdlbnQpIHsKLSAgICAgICAgY29uc3QgY2hhciogcHJvZHVjdF9vdXQgPSBnZXRlbnYoIkFORFJPSURfUFJPRFVDVF9PVVQiKTsKLSAgICAgICAgaWYgKHByb2R1Y3Rfb3V0ID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGVycm9yX2V4aXQoIkNvdWxkIG5vdCBsb2NhdGUgJXMgYmVjYXVzZSAkQU5EUk9JRF9QUk9EVUNUX09VVCBpcyBub3QgZGVmaW5lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgIGxvY2FsX3BhdGgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoIiVzJXMiLCBwcm9kdWN0X291dCwgbG9jYWxfcGF0aCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGFkYl9kaXIgKyBzZGtfcGF0aDsKLSAgICB9Ci19Ci0KIHN0YXRpYyBib29sIGRlcGxveV9hZ2VudChib29sIGNoZWNrVGltZVN0YW1wcykgewogICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBzcmNzOwotICAgIHN0ZDo6c3RyaW5nIGphcl9wYXRoID0KLSAgICAgICAgICAgIGdldF9hZ2VudF9jb21wb25lbnRfaG9zdF9wYXRoKCIvc3lzdGVtL2ZyYW1ld29yay9kZXBsb3lhZ2VudC5qYXIiLCAiL2RlcGxveWFnZW50LmphciIpOwotICAgIHN0ZDo6c3RyaW5nIHNjcmlwdF9wYXRoID0KLSAgICAgICAgICAgIGdldF9hZ2VudF9jb21wb25lbnRfaG9zdF9wYXRoKCIvc3lzdGVtL2Jpbi9kZXBsb3lhZ2VudCIsICIvZGVwbG95YWdlbnQiKTsKLSAgICBzcmNzLnB1c2hfYmFjayhqYXJfcGF0aC5jX3N0cigpKTsKLSAgICBzcmNzLnB1c2hfYmFjayhzY3JpcHRfcGF0aC5jX3N0cigpKTsKLQotICAgIGlmIChkb19zeW5jX3B1c2goc3Jjcywga0RldmljZUFnZW50UGF0aCwgY2hlY2tUaW1lU3RhbXBzKSkgewotICAgICAgICAvLyBvbiB3aW5kb3dzIHRoZSBzaGVsbCBzY3JpcHQgbWlnaHQgaGF2ZSBsb3N0IGV4ZWN1dGUgcGVybWlzc2lvbgotICAgICAgICAvLyBzbyBuZWVkIHRvIHNldCB0aGlzIGV4cGxpY2l0bHkKLSAgICAgICAgY29uc3QgY2hhcioga0NobW9kQ29tbWFuZFBhdHRlcm4gPSAiY2htb2QgNzc3ICVzZGVwbG95YWdlbnQiOwotICAgICAgICBzdGQ6OnN0cmluZyBjaG1vZENvbW1hbmQgPQotICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZihrQ2htb2RDb21tYW5kUGF0dGVybiwga0RldmljZUFnZW50UGF0aCk7Ci0gICAgICAgIGludCByZXQgPSBzZW5kX3NoZWxsX2NvbW1hbmQoY2htb2RDb21tYW5kKTsKLSAgICAgICAgaWYgKHJldCAhPSAwKSB7Ci0gICAgICAgICAgICBlcnJvcl9leGl0KCJFcnJvciBleGVjdXRpbmcgJXMgcmV0dXJuY29kZTogJWQiLCBjaG1vZENvbW1hbmQuY19zdHIoKSwgcmV0KTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVycm9yX2V4aXQoIkVycm9yIHB1c2hpbmcgYWdlbnQgZmlsZXMgdG8gZGV2aWNlIik7CisgICAgLy8gVE9ETzogRGVwbG95IGFnZW50IGZyb20gYmluMmMgZGlyZWN0bHkgaW5zdGVhZCBvZiB3cml0aW5nIHRvIGRpc2sgZmlyc3QuCisgICAgVGVtcG9yYXJ5RmlsZSB0ZW1wQWdlbnQ7CisgICAgYW5kcm9pZDo6YmFzZTo6V3JpdGVGdWxseSh0ZW1wQWdlbnQuZmQsIGtEZXBsb3lBZ2VudCwgc2l6ZW9mKGtEZXBsb3lBZ2VudCkpOworICAgIHNyY3MucHVzaF9iYWNrKHRlbXBBZ2VudC5wYXRoKTsKKyAgICBpZiAoIWRvX3N5bmNfcHVzaChzcmNzLCBrRGV2aWNlQWdlbnRGaWxlLCBjaGVja1RpbWVTdGFtcHMpKSB7CisgICAgICAgIGVycm9yX2V4aXQoIkZhaWxlZCB0byBwdXNoIGZhc3RkZXBsb3kgYWdlbnQgdG8gZGV2aWNlLiIpOworICAgIH0KKyAgICBzcmNzLmNsZWFyKCk7CisgICAgLy8gVE9ETzogRGVwbG95IGFnZW50IGZyb20gYmluMmMgZGlyZWN0bHkgaW5zdGVhZCBvZiB3cml0aW5nIHRvIGRpc2sgZmlyc3QuCisgICAgVGVtcG9yYXJ5RmlsZSB0ZW1wQWdlbnRTY3JpcHQ7CisgICAgYW5kcm9pZDo6YmFzZTo6V3JpdGVGdWxseSh0ZW1wQWdlbnRTY3JpcHQuZmQsIGtEZXBsb3lBZ2VudFNjcmlwdCwgc2l6ZW9mKGtEZXBsb3lBZ2VudFNjcmlwdCkpOworICAgIHNyY3MucHVzaF9iYWNrKHRlbXBBZ2VudFNjcmlwdC5wYXRoKTsKKyAgICBpZiAoIWRvX3N5bmNfcHVzaChzcmNzLCBrRGV2aWNlQWdlbnRTY3JpcHQsIGNoZWNrVGltZVN0YW1wcykpIHsKKyAgICAgICAgZXJyb3JfZXhpdCgiRmFpbGVkIHRvIHB1c2ggZmFzdGRlcGxveSBhZ2VudCBzY3JpcHQgdG8gZGV2aWNlLiIpOworICAgIH0KKyAgICBzcmNzLmNsZWFyKCk7CisgICAgLy8gb24gd2luZG93cyB0aGUgc2hlbGwgc2NyaXB0IG1pZ2h0IGhhdmUgbG9zdCBleGVjdXRlIHBlcm1pc3Npb24KKyAgICAvLyBzbyBuZWVkIHRvIHNldCB0aGlzIGV4cGxpY2l0bHkKKyAgICBjb25zdCBjaGFyKiBrQ2htb2RDb21tYW5kUGF0dGVybiA9ICJjaG1vZCA3NzcgJXMiOworICAgIHN0ZDo6c3RyaW5nIGNobW9kQ29tbWFuZCA9CisgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGYoa0NobW9kQ29tbWFuZFBhdHRlcm4sIGtEZXZpY2VBZ2VudFNjcmlwdCk7CisgICAgaW50IHJldCA9IHNlbmRfc2hlbGxfY29tbWFuZChjaG1vZENvbW1hbmQpOworICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICBlcnJvcl9leGl0KCJFcnJvciBleGVjdXRpbmcgJXMgcmV0dXJuY29kZTogJWQiLCBjaG1vZENvbW1hbmQuY19zdHIoKSwgcmV0KTsKICAgICB9CiAKICAgICByZXR1cm4gdHJ1ZTsKQEAgLTIzOCwzNCArMjI5LDE1IEBACiAgICAgfQogfQogCi1zdGF0aWMgc3RkOjpzdHJpbmcgZ2V0X3BhdGNoX2dlbmVyYXRvcl9jb21tYW5kKCkgewotICAgIGlmIChnX3VzZV9sb2NhbGFnZW50KSB7Ci0gICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBvbiBhIFdpbmRvd3MgbWFjaGluZQotICAgICAgICBjb25zdCBjaGFyKiBob3N0X291dCA9IGdldGVudigiQU5EUk9JRF9IT1NUX09VVCIpOwotICAgICAgICBpZiAoaG9zdF9vdXQgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgZXJyb3JfZXhpdCgKLSAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBsb2NhdGUgZGVwbG95cGF0Y2hnZW5lcmF0b3IuamFyIGJlY2F1c2UgJEFORFJPSURfSE9TVF9PVVQgIgotICAgICAgICAgICAgICAgICAgICAiaXMgbm90IGRlZmluZWQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKCJqYXZhIC1qYXIgJXMvZnJhbWV3b3JrL2RlcGxveXBhdGNoZ2VuZXJhdG9yLmphciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdF9vdXQpOwotICAgIH0KLQotICAgIHN0ZDo6c3RyaW5nIGFkYl9kaXIgPSBhbmRyb2lkOjpiYXNlOjpHZXRFeGVjdXRhYmxlRGlyZWN0b3J5KCk7Ci0gICAgaWYgKGFkYl9kaXIuZW1wdHkoKSkgewotICAgICAgICBlcnJvcl9leGl0KCJDb3VsZCBub3QgbG9jYXRlIGRlcGxveXBhdGNoZ2VuZXJhdG9yLmphciIpOwotICAgIH0KLSAgICByZXR1cm4gYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmKFIiKGphdmEgLWphciAiJXMvZGVwbG95cGF0Y2hnZW5lcmF0b3IuamFyIikiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRiX2Rpci5jX3N0cigpKTsKLX0KLQogdm9pZCBjcmVhdGVfcGF0Y2goY29uc3QgY2hhciogYXBrUGF0aCwgY29uc3QgY2hhciogbWV0YWRhdGFQYXRoLCBjb25zdCBjaGFyKiBwYXRjaFBhdGgpIHsKLSAgICBzdGQ6OnN0cmluZyBnZW5lcmF0ZVBhdGNoQ29tbWFuZCA9IGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigKLSAgICAgICAgICAgIFIiKCVzICIlcyIgIiVzIiA+ICIlcyIpIiwgZ2V0X3BhdGNoX2dlbmVyYXRvcl9jb21tYW5kKCkuY19zdHIoKSwgYXBrUGF0aCwgbWV0YWRhdGFQYXRoLAotICAgICAgICAgICAgcGF0Y2hQYXRoKTsKLSAgICBpbnQgcmV0dXJuQ29kZSA9IHN5c3RlbShnZW5lcmF0ZVBhdGNoQ29tbWFuZC5jX3N0cigpKTsKLSAgICBpZiAocmV0dXJuQ29kZSAhPSAwKSB7Ci0gICAgICAgIGVycm9yX2V4aXQoIkV4ZWN1dGluZyAlcyByZXR1cm5lZCAlZCIsIGdlbmVyYXRlUGF0Y2hDb21tYW5kLmNfc3RyKCksIHJldHVybkNvZGUpOworICAgIERlcGxveVBhdGNoR2VuZXJhdG9yIGdlbmVyYXRvcihmYWxzZSk7CisgICAgdW5pcXVlX2ZkIHBhdGNoRmQoYWRiX29wZW4ocGF0Y2hQYXRoLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0NMT0VYRUMpKTsKKyAgICBpZiAocGF0Y2hGZCA8IDApIHsKKyAgICAgICAgcGVycm9yX2V4aXQoImFkYjogZmFpbGVkIHRvIGNyZWF0ZSAlcyIsIHBhdGNoUGF0aCk7CisgICAgfQorICAgIGJvb2wgc3VjY2VzcyA9IGdlbmVyYXRvci5DcmVhdGVQYXRjaChhcGtQYXRoLCBtZXRhZGF0YVBhdGgsIHBhdGNoRmQpOworICAgIGlmICghc3VjY2VzcykgeworICAgICAgICBlcnJvcl9leGl0KCJGYWlsZWQgdG8gY3JlYXRlIHBhdGNoIGZvciAlcyIsIGFwa1BhdGgpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvYWRiL2RhZW1vbi9zaGVsbF9zZXJ2aWNlLmNwcCBiL2FkYi9kYWVtb24vc2hlbGxfc2VydmljZS5jcHAKaW5kZXggZGU5NzA2OC4uMGZiMTRjNCAxMDA2NDQKLS0tIGEvYWRiL2RhZW1vbi9zaGVsbF9zZXJ2aWNlLmNwcAorKysgYi9hZGIvZGFlbW9uL3NoZWxsX3NlcnZpY2UuY3BwCkBAIC0yMjIsNyArMjIyLDcgQEAKIGJvb2wgU3VicHJvY2Vzczo6Rm9ya0FuZEV4ZWMoc3RkOjpzdHJpbmcqIGVycm9yKSB7CiAgICAgdW5pcXVlX2ZkIGNoaWxkX3N0ZGlub3V0X3NmZCwgY2hpbGRfc3RkZXJyX3NmZDsKICAgICB1bmlxdWVfZmQgcGFyZW50X2Vycm9yX3NmZCwgY2hpbGRfZXJyb3Jfc2ZkOwotICAgIGNoYXIgcHRzX25hbWVbUEFUSF9NQVhdOworICAgIGNvbnN0IGNoYXIqIHB0c19uYW1lID0gbnVsbHB0cjsKIAogICAgIGlmIChjb21tYW5kXy5lbXB0eSgpKSB7CiAgICAgICAgIF9fYW5kcm9pZF9sb2dfc2VjdXJpdHlfYnN3cml0ZShTRUNfVEFHX0FEQl9TSEVMTF9JTlRFUkFDVElWRSwgIiIpOwpAQCAtMjgzLDEwICsyODMsMjIgQEAKICAgICBjZW52LnB1c2hfYmFjayhudWxscHRyKTsKIAogICAgIGlmICh0eXBlXyA9PSBTdWJwcm9jZXNzVHlwZTo6a1B0eSkgewotICAgICAgICBpbnQgZmQ7Ci0gICAgICAgIHBpZF8gPSBmb3JrcHR5KCZmZCwgcHRzX25hbWUsIG51bGxwdHIsIG51bGxwdHIpOworICAgICAgICB1bmlxdWVfZmQgcHR5X21hc3Rlcihwb3NpeF9vcGVucHQoT19SRFdSIHwgT19OT0NUVFkgfCBPX0NMT0VYRUMpKTsKKyAgICAgICAgaWYgKHB0eV9tYXN0ZXIgPT0gLTEpIHsKKyAgICAgICAgICAgICplcnJvciA9CisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigiZmFpbGVkIHRvIGNyZWF0ZSBwdHkgbWFzdGVyOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVubG9ja3B0KHB0eV9tYXN0ZXIuZ2V0KCkpICE9IDApIHsKKyAgICAgICAgICAgICplcnJvciA9IGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZigiZmFpbGVkIHRvIHVubG9ja3B0IHB0eSBtYXN0ZXI6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcGlkXyA9IGZvcmsoKTsKKyAgICAgICAgcHRzX25hbWUgPSBwdHNuYW1lKHB0eV9tYXN0ZXIuZ2V0KCkpOwogICAgICAgICBpZiAocGlkXyA+IDApIHsKLSAgICAgICAgICBzdGRpbm91dF9zZmRfLnJlc2V0KGZkKTsKKyAgICAgICAgICAgIHN0ZGlub3V0X3NmZF8gPSBzdGQ6Om1vdmUocHR5X21hc3Rlcik7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBpZiAoIUNyZWF0ZVNvY2tldHBhaXIoJnN0ZGlub3V0X3NmZF8sICZjaGlsZF9zdGRpbm91dF9zZmQpKSB7CmRpZmYgLS1naXQgYS9hZGIvZmFzdGRlcGxveS9BbmRyb2lkLmJwIGIvYWRiL2Zhc3RkZXBsb3kvQW5kcm9pZC5icAppbmRleCAxYmEwZGUwLi45NWUxYTI4IDEwMDY0NAotLS0gYS9hZGIvZmFzdGRlcGxveS9BbmRyb2lkLmJwCisrKyBiL2FkYi9mYXN0ZGVwbG95L0FuZHJvaWQuYnAKQEAgLTEzLDI3ICsxMywxNSBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAvLwotCiBqYXZhX2JpbmFyeSB7CiAgICAgbmFtZTogImRlcGxveWFnZW50IiwKICAgICBzZGtfdmVyc2lvbjogIjI0IiwKICAgICBzcmNzOiBbImRlcGxveWFnZW50L3NyYy8qKi8qLmphdmEiLCAiZGVwbG95bGliL3NyYy8qKi8qLmphdmEiLCAicHJvdG8vKiovKi5wcm90byJdLAogICAgIHN0YXRpY19saWJzOiBbImFwa3psaWJfemlwIl0sCi0gICAgd3JhcHBlcjogImRlcGxveWFnZW50L2RlcGxveWFnZW50LnNoIiwKICAgICBwcm90bzogewogICAgICAgICB0eXBlOiAibGl0ZSIsCiAgICAgfSwKICAgICBkZXhfcHJlb3B0OiB7CiAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAogICAgIH0KLX0KLQotamF2YV9iaW5hcnlfaG9zdCB7Ci0gICAgbmFtZTogImRlcGxveXBhdGNoZ2VuZXJhdG9yIiwKLSAgICBzcmNzOiBbImRlcGxveXBhdGNoZ2VuZXJhdG9yL3NyYy8qKi8qLmphdmEiLCAiZGVwbG95bGliL3NyYy8qKi8qLmphdmEiLCAicHJvdG8vKiovKi5wcm90byJdLAotICAgIHN0YXRpY19saWJzOiBbImFwa3psaWIiXSwKLSAgICBtYW5pZmVzdDogImRlcGxveXBhdGNoZ2VuZXJhdG9yL21hbmlmZXN0LnR4dCIsCi0gICAgcHJvdG86IHsKLSAgICAgICAgdHlwZTogImZ1bGwiLAotICAgIH0KLX0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hZGIvZmFzdGRlcGxveS9kZXBsb3lhZ2VudC9zcmMvY29tL2FuZHJvaWQvZmFzdGRlcGxveS9EZXBsb3lBZ2VudC5qYXZhIGIvYWRiL2Zhc3RkZXBsb3kvZGVwbG95YWdlbnQvc3JjL2NvbS9hbmRyb2lkL2Zhc3RkZXBsb3kvRGVwbG95QWdlbnQuamF2YQppbmRleCAyZDNiMTM1Li5hODEwM2M0IDEwMDY0NAotLS0gYS9hZGIvZmFzdGRlcGxveS9kZXBsb3lhZ2VudC9zcmMvY29tL2FuZHJvaWQvZmFzdGRlcGxveS9EZXBsb3lBZ2VudC5qYXZhCisrKyBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveWFnZW50L3NyYy9jb20vYW5kcm9pZC9mYXN0ZGVwbG95L0RlcGxveUFnZW50LmphdmEKQEAgLTE4MSw3ICsxODEsNyBAQAogICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZXh0cmFjdE1ldGFEYXRhKFN0cmluZyBwYWNrYWdlTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKICAgICAgICAgRmlsZSBhcGtGaWxlID0gZ2V0RmlsZUZyb21QYWNrYWdlTmFtZShwYWNrYWdlTmFtZSk7CiAgICAgICAgIEFQS01ldGFEYXRhIGFwa01ldGFEYXRhID0gUGF0Y2hVdGlscy5nZXRBUEtNZXRhRGF0YShhcGtGaWxlKTsKLSAgICAgICAgYXBrTWV0YURhdGEud3JpdGVEZWxpbWl0ZWRUbyhTeXN0ZW0ub3V0KTsKKyAgICAgICAgYXBrTWV0YURhdGEud3JpdGVUbyhTeXN0ZW0ub3V0KTsKICAgICB9CiAKICAgICBwcml2YXRlIHN0YXRpYyBpbnQgY3JlYXRlSW5zdGFsbFNlc3Npb24oU3RyaW5nW10gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uIHsKQEAgLTIyMyw3ICsyMjMsNiBAQAogICAgICAgICB9CiAKICAgICAgICAgaW50IHdyaXRlRXhpdENvZGUgPSB3cml0ZVBhdGNoZWREYXRhVG9TZXNzaW9uKG5ldyBSYW5kb21BY2Nlc3NGaWxlKGRldmljZUZpbGUsICJyIiksIGRlbHRhU3RyZWFtLCBzZXNzaW9uSWQpOwotCiAgICAgICAgIGlmICh3cml0ZUV4aXRDb2RlID09IDApIHsKICAgICAgICAgICAgIHJldHVybiBjb21taXRJbnN0YWxsU2Vzc2lvbihzZXNzaW9uSWQpOwogICAgICAgICB9IGVsc2UgewpAQCAtMjg1LDcgKzI4NCw2IEBACiAgICAgICAgICAgICBpZiAob2xkRGF0YUxlbiA+IDApIHsKICAgICAgICAgICAgICAgICBQYXRjaFV0aWxzLnBpcGUob2xkRGF0YSwgb3V0cHV0U3RyZWFtLCBidWZmZXIsIChpbnQpIG9sZERhdGFMZW4pOwogICAgICAgICAgICAgfQotCiAgICAgICAgICAgICBuZXdEYXRhQnl0ZXNXcml0dGVuICs9IGNvcHlMZW4gKyBvbGREYXRhTGVuOwogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveWxpYi9zcmMvY29tL2FuZHJvaWQvZmFzdGRlcGxveS9QYXRjaFV0aWxzLmphdmEgYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lsaWIvc3JjL2NvbS9hbmRyb2lkL2Zhc3RkZXBsb3kvUGF0Y2hVdGlscy5qYXZhCmluZGV4IGYwZjAwZTEuLmM2MGY5YTYgMTAwNjQ0Ci0tLSBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveWxpYi9zcmMvY29tL2FuZHJvaWQvZmFzdGRlcGxveS9QYXRjaFV0aWxzLmphdmEKKysrIGIvYWRiL2Zhc3RkZXBsb3kvZGVwbG95bGliL3NyYy9jb20vYW5kcm9pZC9mYXN0ZGVwbG95L1BhdGNoVXRpbHMuamF2YQpAQCAtMzksNyArMzksNyBAQAogY2xhc3MgUGF0Y2hVdGlscyB7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBORUdBVElWRV9NQVNLID0gMUwgPDwgNjM7CiAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBORUdBVElWRV9MT05HX1NJR05fTUFTSyA9IDFMIDw8IDYzOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNJR05BVFVSRSA9ICJIQU1BREkvSUhEIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdOQVRVUkUgPSAiRkFTVERFUExPWSI7CiAKICAgICBwcml2YXRlIHN0YXRpYyBsb25nIGdldE9mZnNldEZyb21FbnRyeShTdG9yZWRFbnRyeSBlbnRyeSkgewogICAgICAgICByZXR1cm4gZW50cnkuZ2V0Q2VudHJhbERpcmVjdG9yeUhlYWRlcigpLmdldE9mZnNldCgpICsgZW50cnkuZ2V0TG9jYWxIZWFkZXJTaXplKCk7CmRpZmYgLS1naXQgYS9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9kZXBsb3lfcGF0Y2hfZ2VuZXJhdG9yLmNwcCBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYzkyNDMKLS0tIC9kZXYvbnVsbAorKysgYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9kZXBsb3lfcGF0Y2hfZ2VuZXJhdG9yLmNwcApAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJkZXBsb3lfcGF0Y2hfZ2VuZXJhdG9yLmgiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiYWRiX3VuaXF1ZV9mZC5oIgorI2luY2x1ZGUgImFuZHJvaWQtYmFzZS9maWxlLmgiCisjaW5jbHVkZSAicGF0Y2hfdXRpbHMuaCIKKyNpbmNsdWRlICJzeXNkZXBzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBjb206OmFuZHJvaWQ6OmZhc3RkZXBsb3k7CisKK3ZvaWQgRGVwbG95UGF0Y2hHZW5lcmF0b3I6OkxvZyhjb25zdCBjaGFyKiBmbXQsIC4uLikgeworICAgIGlmICghaXNfdmVyYm9zZV8pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB2YV9saXN0IGFwOworICAgIHZhX3N0YXJ0KGFwLCBmbXQpOworICAgIHZwcmludGYoZm10LCBhcCk7CisgICAgcHJpbnRmKCJcbiIpOworICAgIHZhX2VuZChhcCk7Cit9CisKK3ZvaWQgRGVwbG95UGF0Y2hHZW5lcmF0b3I6OkFQS0VudHJ5VG9Mb2coY29uc3QgQVBLRW50cnkmIGVudHJ5KSB7CisgICAgTG9nKCJGaWxlbmFtZTogJXMiLCBlbnRyeS5maWxlbmFtZSgpLmNfc3RyKCkpOworICAgIExvZygiQ1JDMzI6IDB4JTA4bGxYIiwgZW50cnkuY3JjMzIoKSk7CisgICAgTG9nKCJEYXRhIE9mZnNldDogJWxsZCIsIGVudHJ5LmRhdGFvZmZzZXQoKSk7CisgICAgTG9nKCJDb21wcmVzc2VkIFNpemU6ICVsbGQiLCBlbnRyeS5jb21wcmVzc2Vkc2l6ZSgpKTsKKyAgICBMb2coIlVuY29tcHJlc3NlZCBTaXplOiAlbGxkIiwgZW50cnkudW5jb21wcmVzc2Vkc2l6ZSgpKTsKK30KKwordm9pZCBEZXBsb3lQYXRjaEdlbmVyYXRvcjo6QVBLTWV0YURhdGFUb0xvZyhjb25zdCBjaGFyKiBmaWxlLCBjb25zdCBBUEtNZXRhRGF0YSYgbWV0YWRhdGEpIHsKKyAgICBpZiAoIWlzX3ZlcmJvc2VfKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgTG9nKCJBUEsgTWV0YWRhdGE6ICVzIiwgZmlsZSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRhZGF0YS5lbnRyaWVzX3NpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IEFQS0VudHJ5JiBlbnRyeSA9IG1ldGFkYXRhLmVudHJpZXMoaSk7CisgICAgICAgIEFQS0VudHJ5VG9Mb2coZW50cnkpOworICAgIH0KK30KKwordm9pZCBEZXBsb3lQYXRjaEdlbmVyYXRvcjo6UmVwb3J0U2F2aW5ncyhjb25zdCBzdGQ6OnZlY3RvcjxTaW1wbGVFbnRyeT4mIGlkZW50aWNhbEVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRvdGFsU2l6ZSkgeworICAgIGxvbmcgdG90YWxFcXVhbEJ5dGVzID0gMDsKKyAgICBpbnQgdG90YWxFcXVhbEZpbGVzID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlkZW50aWNhbEVudHJpZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGlkZW50aWNhbEVudHJpZXNbaV0uZGV2aWNlRW50cnkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgdG90YWxFcXVhbEJ5dGVzICs9IGlkZW50aWNhbEVudHJpZXNbaV0ubG9jYWxFbnRyeS0+Y29tcHJlc3NlZHNpemUoKTsKKyAgICAgICAgICAgIHRvdGFsRXF1YWxGaWxlcysrOworICAgICAgICB9CisgICAgfQorICAgIGZsb2F0IHNhdmluZ1BlcmNlbnQgPSAodG90YWxFcXVhbEJ5dGVzICogMTAwLjBmKSAvIHRvdGFsU2l6ZTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkRldGVjdGVkICVkIGVxdWFsIEFQSyBlbnRyaWVzXG4iLCB0b3RhbEVxdWFsRmlsZXMpOworICAgIGZwcmludGYoc3RkZXJyLCAiJWxkIGJ5dGVzIGFyZSBlcXVhbCBvdXQgb2YgJSIgUFJJdTY0ICIgKCUuMmYlJSlcbiIsIHRvdGFsRXF1YWxCeXRlcywgdG90YWxTaXplLAorICAgICAgICAgICAgc2F2aW5nUGVyY2VudCk7Cit9CisKK3ZvaWQgRGVwbG95UGF0Y2hHZW5lcmF0b3I6OkdlbmVyYXRlUGF0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8U2ltcGxlRW50cnk+JiBlbnRyaWVzVG9Vc2VPbkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbG9jYWxBcGtQYXRoLCBib3Jyb3dlZF9mZCBvdXRwdXQpIHsKKyAgICB1bmlxdWVfZmQgaW5wdXQoYWRiX29wZW4obG9jYWxBcGtQYXRoLCBPX1JET05MWSB8IE9fQ0xPRVhFQykpOworICAgIHNpemVfdCBuZXdBcGtTaXplID0gYWRiX2xzZWVrKGlucHV0LCAwTCwgU0VFS19FTkQpOworICAgIGFkYl9sc2VlayhpbnB1dCwgMEwsIFNFRUtfU0VUKTsKKworICAgIFBhdGNoVXRpbHM6OldyaXRlU2lnbmF0dXJlKG91dHB1dCk7CisgICAgUGF0Y2hVdGlsczo6V3JpdGVMb25nKG5ld0Fwa1NpemUsIG91dHB1dCk7CisgICAgc2l6ZV90IGN1cnJlbnRTaXplT3V0ID0gMDsKKyAgICAvLyBXcml0ZSBkYXRhIGZyb20gdGhlIGhvc3QgdXB0byB0aGUgZmlyc3QgZW50cnkgd2UgaGF2ZSB0aGF0IG1hdGNoZXMgYSBkZXZpY2UgZW50cnkuIFRoZW4gd3JpdGUKKyAgICAvLyB0aGUgbWV0YWRhdGEgYWJvdXQgdGhlIGRldmljZSBlbnRyeSBhbmQgcmVwZWF0IGZvciBhbGwgZW50cmllcyB0aGF0IG1hdGNoIG9uIGRldmljZS4gRmluYWxseQorICAgIC8vIHdyaXRlIG91dCBhbnkgZGF0YSBsZWZ0LiBJZiB0aGUgZGV2aWNlIGFuZCBob3N0IEFQS3MgYXJlIGV4YWN0bHkgdGhlIHNhbWUgdGhpcyBlbmRzIHVwCisgICAgLy8gd3JpdGluZyBvdXQgemlwIG1ldGFkYXRhIGZyb20gdGhlIGxvY2FsIEFQSyBmb2xsb3dlZCBieSBvZmZzZXRzIHRvIHRoZSBkYXRhIHRvIHVzZSBmcm9tIHRoZQorICAgIC8vIGRldmljZSBBUEsuCisgICAgZm9yIChhdXRvJiYgZW50cnkgOiBlbnRyaWVzVG9Vc2VPbkRldmljZSkgeworICAgICAgICBpbnQ2NF90IGRldmljZURhdGFPZmZzZXQgPSBlbnRyeS5kZXZpY2VFbnRyeS0+ZGF0YW9mZnNldCgpOworICAgICAgICBpbnQ2NF90IGhvc3REYXRhT2Zmc2V0ID0gZW50cnkubG9jYWxFbnRyeS0+ZGF0YW9mZnNldCgpOworICAgICAgICBpbnQ2NF90IGRldmljZURhdGFMZW5ndGggPSBlbnRyeS5kZXZpY2VFbnRyeS0+Y29tcHJlc3NlZHNpemUoKTsKKyAgICAgICAgaW50NjRfdCBkZWx0YUZyb21EZXZpY2VEYXRhU3RhcnQgPSBob3N0RGF0YU9mZnNldCAtIGN1cnJlbnRTaXplT3V0OworICAgICAgICBQYXRjaFV0aWxzOjpXcml0ZUxvbmcoZGVsdGFGcm9tRGV2aWNlRGF0YVN0YXJ0LCBvdXRwdXQpOworICAgICAgICBpZiAoZGVsdGFGcm9tRGV2aWNlRGF0YVN0YXJ0ID4gMCkgeworICAgICAgICAgICAgUGF0Y2hVdGlsczo6UGlwZShpbnB1dCwgb3V0cHV0LCBkZWx0YUZyb21EZXZpY2VEYXRhU3RhcnQpOworICAgICAgICB9CisgICAgICAgIFBhdGNoVXRpbHM6OldyaXRlTG9uZyhkZXZpY2VEYXRhT2Zmc2V0LCBvdXRwdXQpOworICAgICAgICBQYXRjaFV0aWxzOjpXcml0ZUxvbmcoZGV2aWNlRGF0YUxlbmd0aCwgb3V0cHV0KTsKKyAgICAgICAgYWRiX2xzZWVrKGlucHV0LCBkZXZpY2VEYXRhTGVuZ3RoLCBTRUVLX0NVUik7CisgICAgICAgIGN1cnJlbnRTaXplT3V0ICs9IGRlbHRhRnJvbURldmljZURhdGFTdGFydCArIGRldmljZURhdGFMZW5ndGg7CisgICAgfQorICAgIGlmIChjdXJyZW50U2l6ZU91dCAhPSBuZXdBcGtTaXplKSB7CisgICAgICAgIFBhdGNoVXRpbHM6OldyaXRlTG9uZyhuZXdBcGtTaXplIC0gY3VycmVudFNpemVPdXQsIG91dHB1dCk7CisgICAgICAgIFBhdGNoVXRpbHM6OlBpcGUoaW5wdXQsIG91dHB1dCwgbmV3QXBrU2l6ZSAtIGN1cnJlbnRTaXplT3V0KTsKKyAgICAgICAgUGF0Y2hVdGlsczo6V3JpdGVMb25nKDAsIG91dHB1dCk7CisgICAgICAgIFBhdGNoVXRpbHM6OldyaXRlTG9uZygwLCBvdXRwdXQpOworICAgIH0KK30KKworYm9vbCBEZXBsb3lQYXRjaEdlbmVyYXRvcjo6Q3JlYXRlUGF0Y2goY29uc3QgY2hhciogbG9jYWxBcGtQYXRoLCBjb25zdCBjaGFyKiBkZXZpY2VBcGtNZXRhZGF0YVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3Jyb3dlZF9mZCBvdXRwdXQpIHsKKyAgICBzdGQ6OnN0cmluZyBjb250ZW50OworICAgIEFQS01ldGFEYXRhIGRldmljZUFwa01ldGFkYXRhOworICAgIGlmIChhbmRyb2lkOjpiYXNlOjpSZWFkRmlsZVRvU3RyaW5nKGRldmljZUFwa01ldGFkYXRhUGF0aCwgJmNvbnRlbnQpKSB7CisgICAgICAgIGRldmljZUFwa01ldGFkYXRhLlBhcnNlUGFydGlhbEZyb21TdHJpbmcoY29udGVudCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVE9ETzogV2hhdCBkbyB3ZSB3YW50IHRvIGRvIGlmIHdlIGRvbid0IGZpbmQgYW55IG1ldGFkYXRhLgorICAgICAgICAvLyBUaGUgY3VycmVudCBmYWxsYmFjayBiZWhhdmlvciBpcyB0byBidWlsZCBhIHBhdGNoIHdpdGggdGhlIGNvbnRlbnRzIG9mIHxsb2NhbEFwa1BhdGh8LgorICAgIH0KKworICAgIEFQS01ldGFEYXRhIGxvY2FsQXBrTWV0YWRhdGEgPSBQYXRjaFV0aWxzOjpHZXRBUEtNZXRhRGF0YShsb2NhbEFwa1BhdGgpOworICAgIC8vIExvZyBnYXRoZXJlZCBtZXRhZGF0YSBpbmZvLgorICAgIEFQS01ldGFEYXRhVG9Mb2coZGV2aWNlQXBrTWV0YWRhdGFQYXRoLCBkZXZpY2VBcGtNZXRhZGF0YSk7CisgICAgQVBLTWV0YURhdGFUb0xvZyhsb2NhbEFwa1BhdGgsIGxvY2FsQXBrTWV0YWRhdGEpOworCisgICAgc3RkOjp2ZWN0b3I8U2ltcGxlRW50cnk+IGlkZW50aWNhbEVudHJpZXM7CisgICAgdWludDY0X3QgdG90YWxTaXplID0KKyAgICAgICAgICAgIEJ1aWxkSWRlbnRpY2FsRW50cmllcyhpZGVudGljYWxFbnRyaWVzLCBsb2NhbEFwa01ldGFkYXRhLCBkZXZpY2VBcGtNZXRhZGF0YSk7CisgICAgUmVwb3J0U2F2aW5ncyhpZGVudGljYWxFbnRyaWVzLCB0b3RhbFNpemUpOworICAgIEdlbmVyYXRlUGF0Y2goaWRlbnRpY2FsRW50cmllcywgbG9jYWxBcGtQYXRoLCBvdXRwdXQpOworICAgIHJldHVybiB0cnVlOworfQorCit1aW50NjRfdCBEZXBsb3lQYXRjaEdlbmVyYXRvcjo6QnVpbGRJZGVudGljYWxFbnRyaWVzKHN0ZDo6dmVjdG9yPFNpbXBsZUVudHJ5PiYgb3V0SWRlbnRpY2FsRW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVBLTWV0YURhdGEmIGxvY2FsQXBrTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFQS01ldGFEYXRhJiBkZXZpY2VBcGtNZXRhZGF0YSkgeworICAgIHVpbnQ2NF90IHRvdGFsU2l6ZSA9IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb2NhbEFwa01ldGFkYXRhLmVudHJpZXNfc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgQVBLRW50cnkmIGxvY2FsRW50cnkgPSBsb2NhbEFwa01ldGFkYXRhLmVudHJpZXMoaSk7CisgICAgICAgIHRvdGFsU2l6ZSArPSBsb2NhbEVudHJ5LmNvbXByZXNzZWRzaXplKCk7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZGV2aWNlQXBrTWV0YWRhdGEuZW50cmllc19zaXplKCk7IGorKykgeworICAgICAgICAgICAgY29uc3QgQVBLRW50cnkmIGRldmljZUVudHJ5ID0gZGV2aWNlQXBrTWV0YWRhdGEuZW50cmllcyhqKTsKKyAgICAgICAgICAgIGlmIChkZXZpY2VFbnRyeS5jcmMzMigpID09IGxvY2FsRW50cnkuY3JjMzIoKSAmJgorICAgICAgICAgICAgICAgIGRldmljZUVudHJ5LmZpbGVuYW1lKCkuY29tcGFyZShsb2NhbEVudHJ5LmZpbGVuYW1lKCkpID09IDApIHsKKyAgICAgICAgICAgICAgICBTaW1wbGVFbnRyeSBzaW1wbGVFbnRyeTsKKyAgICAgICAgICAgICAgICBzaW1wbGVFbnRyeS5sb2NhbEVudHJ5ID0gY29uc3RfY2FzdDxBUEtFbnRyeSo+KCZsb2NhbEVudHJ5KTsKKyAgICAgICAgICAgICAgICBzaW1wbGVFbnRyeS5kZXZpY2VFbnRyeSA9IGNvbnN0X2Nhc3Q8QVBLRW50cnkqPigmZGV2aWNlRW50cnkpOworICAgICAgICAgICAgICAgIEFQS0VudHJ5VG9Mb2cobG9jYWxFbnRyeSk7CisgICAgICAgICAgICAgICAgb3V0SWRlbnRpY2FsRW50cmllcy5wdXNoX2JhY2soc2ltcGxlRW50cnkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHN0ZDo6c29ydChvdXRJZGVudGljYWxFbnRyaWVzLmJlZ2luKCksIG91dElkZW50aWNhbEVudHJpZXMuZW5kKCksCisgICAgICAgICAgICAgIFtdKGNvbnN0IFNpbXBsZUVudHJ5JiBsaHMsIGNvbnN0IFNpbXBsZUVudHJ5JiByaHMpIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBsaHMubG9jYWxFbnRyeS0+ZGF0YW9mZnNldCgpIDwgcmhzLmxvY2FsRW50cnktPmRhdGFvZmZzZXQoKTsKKyAgICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHRvdGFsU2l6ZTsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9kZXBsb3lfcGF0Y2hfZ2VuZXJhdG9yLmggYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9kZXBsb3lfcGF0Y2hfZ2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBlNDFhNQotLS0gL2Rldi9udWxsCisrKyBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3IuaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiYWRiX3VuaXF1ZV9mZC5oIgorI2luY2x1ZGUgImZhc3RkZXBsb3kvcHJvdG8vQXBrRW50cnkucGIuaCIKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhIHBhdGNoIHRoYXQgY2FuIGJlIGFjY2VwdGVkIGJ5IHRoZSBkZXBsb3lhZ2VudC4gVGhlCisgKiBwYXRjaCBmb3JtYXQgaXMgZG9jdW1lbnRlZCBpbiBHZW5lcmF0ZVBhdGNoLgorICovCitjbGFzcyBEZXBsb3lQYXRjaEdlbmVyYXRvciB7CisgIHB1YmxpYzoKKyAgICAvKioKKyAgICAgKiBTaW1wbGUgc3RydWN0IHRvIGhvbGQgbWFwcGluZyBiZXR3ZWVuIGxvY2FsIG1ldGFkYXRhIGFuZCBkZXZpY2UgbWV0YWRhdGEuCisgICAgICovCisgICAgc3RydWN0IFNpbXBsZUVudHJ5IHsKKyAgICAgICAgY29tOjphbmRyb2lkOjpmYXN0ZGVwbG95OjpBUEtFbnRyeSogbG9jYWxFbnRyeTsKKyAgICAgICAgY29tOjphbmRyb2lkOjpmYXN0ZGVwbG95OjpBUEtFbnRyeSogZGV2aWNlRW50cnk7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIElmIHxpc192ZXJib3NlfCBpcyB0cnVlIEFwa0VudHJpZXMgdGhhdCBhcmUgc2ltaWxhciBiZXR3ZWVuIGRldmljZSBhbmQgaG9zdCBhcmUgd3JpdHRlbiB0bworICAgICAqIHRoZSBjb25zb2xlLgorICAgICAqLworICAgIGV4cGxpY2l0IERlcGxveVBhdGNoR2VuZXJhdG9yKGJvb2wgaXNfdmVyYm9zZSkgOiBpc192ZXJib3NlXyhpc192ZXJib3NlKSB7fQorICAgIC8qKgorICAgICAqIEdpdmVuIGEgfGxvY2FsQXBrUGF0aHwsIGFuZCB0aGUgfGRldmljZUFwa01ldGFkYXRhUGF0aHwgZnJvbSBhbiBpbnN0YWxsZWQgQVBLIHRoaXMgZnVuY3Rpb24KKyAgICAgKiB3cml0ZXMgYSBwYXRjaCB0byB0aGUgZ2l2ZW4gfG91dHB1dHwuCisgICAgICovCisgICAgYm9vbCBDcmVhdGVQYXRjaChjb25zdCBjaGFyKiBsb2NhbEFwa1BhdGgsIGNvbnN0IGNoYXIqIGRldmljZUFwa01ldGFkYXRhUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIG91dHB1dCk7CisKKyAgcHJpdmF0ZToKKyAgICBib29sIGlzX3ZlcmJvc2VfOworCisgICAgLyoqCisgICAgICogTG9nIGZ1bmN0aW9uIG9ubHkgbG9ncyBkYXRhIHRvIHN0ZG91dCB3aGVuIHxpc192ZXJib3NlX3wgaXMgdHJ1ZS4KKyAgICAgKi8KKyAgICB2b2lkIExvZyhjb25zdCBjaGFyKiBmbXQsIC4uLikgX19hdHRyaWJ1dGVfXygoX19mb3JtYXRfXyhfX3ByaW50Zl9fLCAyLCAzKSkpOworCisgICAgLyoqCisgICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGxvZyB0aGUgQVBLTWV0YURhdGEgc3RydWN0dXJlLiBJZiB8aXNfdmVyYm9zZV98IGlzIGZhbHNlIHRoaXMgZnVuY3Rpb24KKyAgICAgKiBlYXJseSBvdXRzLiB8ZmlsZXwgaXMgdGhlIHBhdGggdG8gdGhlIGZpbGUgcmVwcmVzZW50ZWQgYnkgfG1ldGFkYXRhfC4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkCisgICAgICogZm9yIGRlYnVnZ2luZyAvIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHZvaWQgQVBLTWV0YURhdGFUb0xvZyhjb25zdCBjaGFyKiBmaWxlLCBjb25zdCBjb206OmFuZHJvaWQ6OmZhc3RkZXBsb3k6OkFQS01ldGFEYXRhJiBtZXRhZGF0YSk7CisgICAgLyoqCisgICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIGxvZyBBUEtFbnRyeS4KKyAgICAgKi8KKyAgICB2b2lkIEFQS0VudHJ5VG9Mb2coY29uc3QgY29tOjphbmRyb2lkOjpmYXN0ZGVwbG95OjpBUEtFbnRyeSYgZW50cnkpOworCisgICAgLyoqCisgICAgICogSGVscGVyIGZ1bmN0aW9uIHRvIHJlcG9ydCBzYXZpbmdzIGJ5IGZhc3RkZXBsb3kuIFRoaXMgZnVuY3Rpb24gcHJpbnRzIG91dCBzYXZpbmdzIGV2ZW4gd2l0aAorICAgICAqIHxpc192ZXJib3NlX3wgc2V0IHRvIGZhbHNlLiB8dG90YWxTaXplfCBpcyB1c2VkIHRvIHNob3cgYSBwZXJjZW50YWdlIG9mIHNhdmluZ3MuIE5vdGU6CisgICAgICogfHRvdGFsU2l6ZXwgaXMgdGhlIHNpemUgb2YgdGhlIFppcEVudHJpZXMuIE5vdCB0aGUgc2l6ZSBvZiB0aGUgZW50aXJlIGZpbGUuIFRoZSBtZXRhZGF0YSBvZgorICAgICAqIHRoZSB6aXAgZGF0YSBuZWVkcyB0byBiZSBzZW50IGFjcm9zcyB3aXRoIGV2ZXJ5IGl0ZXJhdGlvbi4KKyAgICAgKiBbUGF0Y2ggZm9ybWF0XQorICAgICAqIHxGaXhlZCBTdHJpbmd8IFNpZ25hdHVyZQorICAgICAqIHxsb25nfCAgICAgICAgIE5ldyBTaXplIG9mIEFwaworICAgICAqIHxQYWNrZXRzW118ICAgIEFycmF5IG9mIFBhY2tldHMKKyAgICAgKgorICAgICAqIFtQYWNrZXQgRm9ybWF0XQorICAgICAqIHxsb25nfCAgICAgU2l6ZSBvZiBkYXRhIHRvIHVzZSBmcm9tIHBhdGNoCisgICAgICogfGJ5dGVbXXwgICBQYXRjaCBkYXRhCisgICAgICogfGxvbmd8ICAgICBPZmZzZXQgb2YgZGF0YSB0byB1c2UgYWxyZWFkeSBvbiBkZXZpY2UKKyAgICAgKiB8bG9uZ3wgICAgIExlbmd0aCBvZiBkYXRhIHRvIHJlYWQgZnJvbSBkZXZpY2UgQVBLCisgICAgICogVE9ETyhiLzEzODMwNjc4NCk6IE1vdmUgdGhlIHBhdGNoIGZvcm1hdCB0byBhIHByb3RvLgorICAgICAqLworICAgIHZvaWQgUmVwb3J0U2F2aW5ncyhjb25zdCBzdGQ6OnZlY3RvcjxTaW1wbGVFbnRyeT4mIGlkZW50aWNhbEVudHJpZXMsIHVpbnQ2NF90IHRvdGFsU2l6ZSk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGVudW1lcmF0ZXMgZWFjaCBlbnRyeSBpbiB8ZW50cmllc1RvVXNlT25EZXZpY2V8IGFuZCBidWlsZHMgYSBwYXRjaCBmaWxlIGNvcHlpbmcgZGF0YQorICAgICAqIGZyb20gfGxvY2FsQXBrUGF0aHwgd2hlcmUgd2UgYXJlIHVuYWJsZSB0byB1c2UgZW50cmllcyBhbHJlYWR5IG9uIHRoZSBkZXZpY2UuIFRoZSBuZXcgcGF0Y2gKKyAgICAgKiBpcyB3cml0dGVuIHRvIHxvdXRwdXR8LiBUaGUgZW50cmllcyBhcmUgZXhwZWN0ZWQgdG8gYmUgc29ydGVkIGJ5IGRhdGEgb2Zmc2V0IGZyb20gbG93ZXN0IHRvCisgICAgICogaGlnaGVzdC4KKyAgICAgKi8KKyAgICB2b2lkIEdlbmVyYXRlUGF0Y2goY29uc3Qgc3RkOjp2ZWN0b3I8U2ltcGxlRW50cnk+JiBlbnRyaWVzVG9Vc2VPbkRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbG9jYWxBcGtQYXRoLCBhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBvdXRwdXQpOworCisgIHByb3RlY3RlZDoKKyAgICB1aW50NjRfdCBCdWlsZElkZW50aWNhbEVudHJpZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTaW1wbGVFbnRyeT4mIG91dElkZW50aWNhbEVudHJpZXMsCisgICAgICAgICAgICBjb25zdCBjb206OmFuZHJvaWQ6OmZhc3RkZXBsb3k6OkFQS01ldGFEYXRhJiBsb2NhbEFwa01ldGFkYXRhLAorICAgICAgICAgICAgY29uc3QgY29tOjphbmRyb2lkOjpmYXN0ZGVwbG95OjpBUEtNZXRhRGF0YSYgZGV2aWNlQXBrTWV0YWRhdGFQYXRoKTsKK307ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYWRiL2Zhc3RkZXBsb3kvZGVwbG95cGF0Y2hnZW5lcmF0b3IvZGVwbG95X3BhdGNoX2dlbmVyYXRvcl90ZXN0LmNwcCBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3JfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNkYzQ0ZQotLS0gL2Rldi9udWxsCisrKyBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL2RlcGxveV9wYXRjaF9nZW5lcmF0b3JfdGVzdC5jcHAKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJkZXBsb3lfcGF0Y2hfZ2VuZXJhdG9yLmgiCisjaW5jbHVkZSAicGF0Y2hfdXRpbHMuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJzeXNkZXBzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBjb206OmFuZHJvaWQ6OmZhc3RkZXBsb3k7CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBHZXRUZXN0RmlsZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgeworICAgIHJldHVybiAiZmFzdGRlcGxveS90ZXN0ZGF0YS8iICsgbmFtZTsKK30KKworY2xhc3MgVGVzdFBhdGNoR2VuZXJhdG9yIDogRGVwbG95UGF0Y2hHZW5lcmF0b3IgeworICBwdWJsaWM6CisgICAgVGVzdFBhdGNoR2VuZXJhdG9yKCkgOiBEZXBsb3lQYXRjaEdlbmVyYXRvcihmYWxzZSkge30KKyAgICB2b2lkIEdhdGhlcklkZW50aWNhbEVudHJpZXMoc3RkOjp2ZWN0b3I8RGVwbG95UGF0Y2hHZW5lcmF0b3I6OlNpbXBsZUVudHJ5PiYgb3V0SWRlbnRpY2FsRW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVBLTWV0YURhdGEmIG1ldGFkYXRhQSwgY29uc3QgQVBLTWV0YURhdGEmIG1ldGFkYXRhQikgeworICAgICAgICBCdWlsZElkZW50aWNhbEVudHJpZXMob3V0SWRlbnRpY2FsRW50cmllcywgbWV0YWRhdGFBLCBtZXRhZGF0YUIpOworICAgIH0KK307CisKK1RFU1QoRGVwbG95UGF0Y2hHZW5lcmF0b3JUZXN0LCBJZGVudGljYWxGaWxlRW50cmllcykgeworICAgIHN0ZDo6c3RyaW5nIGFwa1BhdGggPSBHZXRUZXN0RmlsZSgicm90YXRpbmdfY3ViZS1yZWxlYXNlLmFwayIpOworICAgIEFQS01ldGFEYXRhIG1ldGFkYXRhQSA9IFBhdGNoVXRpbHM6OkdldEFQS01ldGFEYXRhKGFwa1BhdGguY19zdHIoKSk7CisgICAgVGVzdFBhdGNoR2VuZXJhdG9yIGdlbmVyYXRvcjsKKyAgICBzdGQ6OnZlY3RvcjxEZXBsb3lQYXRjaEdlbmVyYXRvcjo6U2ltcGxlRW50cnk+IGVudHJpZXM7CisgICAgZ2VuZXJhdG9yLkdhdGhlcklkZW50aWNhbEVudHJpZXMoZW50cmllcywgbWV0YWRhdGFBLCBtZXRhZGF0YUEpOworICAgIC8vIEV4cGVjdCB0aGUgZW50cnkgY291bnQgdG8gbWF0Y2ggdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBtZXRhZGF0YS4KKyAgICBjb25zdCB1aW50MzJfdCBpZGVudGljYWxDb3VudCA9IGVudHJpZXMuc2l6ZSgpOworICAgIGNvbnN0IHVpbnQzMl90IGVudHJpZXNDb3VudCA9IG1ldGFkYXRhQS5lbnRyaWVzX3NpemUoKTsKKyAgICBFWFBFQ1RfRVEoaWRlbnRpY2FsQ291bnQsIGVudHJpZXNDb3VudCk7Cit9CisKK1RFU1QoRGVwbG95UGF0Y2hHZW5lcmF0b3JUZXN0LCBOb0RldmljZU1ldGFkYXRhKSB7CisgICAgc3RkOjpzdHJpbmcgYXBrUGF0aCA9IEdldFRlc3RGaWxlKCJyb3RhdGluZ19jdWJlLXJlbGVhc2UuYXBrIik7CisgICAgLy8gR2V0IHNpemUgb2Ygb3VyIHRlc3QgYXBrLgorICAgIGxvbmcgYXBrU2l6ZSA9IDA7CisgICAgeworICAgICAgICB1bmlxdWVfZmQgYXBrRmlsZShhZGJfb3BlbihhcGtQYXRoLmNfc3RyKCksIE9fUkRXUikpOworICAgICAgICBhcGtTaXplID0gYWRiX2xzZWVrKGFwa0ZpbGUsIDBMLCBTRUVLX0VORCk7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGEgcGF0Y2ggdGhhdCBpcyAxMDAlIGRpZmZlcmVudC4KKyAgICBUZW1wb3JhcnlGaWxlIG91dHB1dDsKKyAgICBEZXBsb3lQYXRjaEdlbmVyYXRvciBnZW5lcmF0b3IodHJ1ZSk7CisgICAgZ2VuZXJhdG9yLkNyZWF0ZVBhdGNoKGFwa1BhdGguY19zdHIoKSwgIiIsIG91dHB1dC5mZCk7CisKKyAgICAvLyBFeHBlY3QgYSBwYXRjaCBmaWxlIHRoYXQgaGFzIGEgc2l6ZSBhdCBsZWFzdCB0aGUgc2l6ZSBvZiBvdXIgaW5pdGlhbCBBUEsuCisgICAgbG9uZyBwYXRjaFNpemUgPSBhZGJfbHNlZWsob3V0cHV0LmZkLCAwTCwgU0VFS19FTkQpOworICAgIEVYUEVDVF9HVChwYXRjaFNpemUsIGFwa1NpemUpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL21hbmlmZXN0LnR4dCBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL21hbmlmZXN0LnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMwMDUwNS4uMDAwMDAwMAotLS0gYS9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9tYW5pZmVzdC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1NYWluLUNsYXNzOiBjb20uYW5kcm9pZC5mYXN0ZGVwbG95LkRlcGxveVBhdGNoR2VuZXJhdG9yCmRpZmYgLS1naXQgYS9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9wYXRjaF91dGlscy5jcHAgYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9wYXRjaF91dGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjExZGRkMQotLS0gL2Rldi9udWxsCisrKyBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL3BhdGNoX3V0aWxzLmNwcApAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInBhdGNoX3V0aWxzLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkZncvWmlwRmlsZVJPLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImFkYl9pby5oIgorI2luY2x1ZGUgImFuZHJvaWQtYmFzZS9lbmRpYW4uaCIKKyNpbmNsdWRlICJzeXNkZXBzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBjb206OmFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgY29tOjphbmRyb2lkOjpmYXN0ZGVwbG95OwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmJhc2U7CisKK3N0YXRpYyBjb25zdGV4cHIgY2hhciBrU2lnbmF0dXJlW10gPSAiRkFTVERFUExPWSI7CisKK0FQS01ldGFEYXRhIFBhdGNoVXRpbHM6OkdldEFQS01ldGFEYXRhKGNvbnN0IGNoYXIqIGFwa1BhdGgpIHsKKyAgICBBUEtNZXRhRGF0YSBhcGtNZXRhRGF0YTsKKyN1bmRlZiBvcGVuCisgICAgc3RkOjp1bmlxdWVfcHRyPGFuZHJvaWQ6OlppcEZpbGVSTz4gemlwRmlsZShhbmRyb2lkOjpaaXBGaWxlUk86Om9wZW4oYXBrUGF0aCkpOworI2RlZmluZSBvcGVuIF9fX3h4eF91bml4X29wZW4KKyAgICBpZiAoemlwRmlsZSA9PSBudWxscHRyKSB7CisgICAgICAgIHByaW50ZigiQ291bGQgbm90IG9wZW4gJXMiLCBhcGtQYXRoKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisgICAgdm9pZCogY29va2llOworICAgIGlmICh6aXBGaWxlLT5zdGFydEl0ZXJhdGlvbigmY29va2llKSkgeworICAgICAgICBhbmRyb2lkOjpaaXBFbnRyeVJPIGVudHJ5OworICAgICAgICB3aGlsZSAoKGVudHJ5ID0gemlwRmlsZS0+bmV4dEVudHJ5KGNvb2tpZSkpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGNoYXIgZmlsZU5hbWVbMjU2XTsKKyAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgZmlsZSBuYW1lLgorICAgICAgICAgICAgLy8gVE9ETzogSGFuZGxlIGZpbGVuYW1lcyBsb25nZXIgdGhhbiAyNTYuCisgICAgICAgICAgICBpZiAoemlwRmlsZS0+Z2V0RW50cnlGaWxlTmFtZShlbnRyeSwgZmlsZU5hbWUsIHNpemVvZihmaWxlTmFtZSkpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVpbnQzMl90IHVuY29tcHJlc3NlZFNpemUsIGNvbXByZXNzZWRTaXplLCBjcmMzMjsKKyAgICAgICAgICAgIGludDY0X3QgZGF0YU9mZnNldDsKKyAgICAgICAgICAgIHppcEZpbGUtPmdldEVudHJ5SW5mbyhlbnRyeSwgbnVsbHB0ciwgJnVuY29tcHJlc3NlZFNpemUsICZjb21wcmVzc2VkU2l6ZSwgJmRhdGFPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgJmNyYzMyKTsKKyAgICAgICAgICAgIEFQS0VudHJ5KiBhcGtFbnRyeSA9IGFwa01ldGFEYXRhLmFkZF9lbnRyaWVzKCk7CisgICAgICAgICAgICBhcGtFbnRyeS0+c2V0X2NyYzMyKGNyYzMyKTsKKyAgICAgICAgICAgIGFwa0VudHJ5LT5zZXRfZmlsZW5hbWUoZmlsZU5hbWUpOworICAgICAgICAgICAgYXBrRW50cnktPnNldF9jb21wcmVzc2Vkc2l6ZShjb21wcmVzc2VkU2l6ZSk7CisgICAgICAgICAgICBhcGtFbnRyeS0+c2V0X3VuY29tcHJlc3NlZHNpemUodW5jb21wcmVzc2VkU2l6ZSk7CisgICAgICAgICAgICBhcGtFbnRyeS0+c2V0X2RhdGFvZmZzZXQoZGF0YU9mZnNldCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGFwa01ldGFEYXRhOworfQorCit2b2lkIFBhdGNoVXRpbHM6OldyaXRlU2lnbmF0dXJlKGJvcnJvd2VkX2ZkIG91dHB1dCkgeworICAgIFdyaXRlRmRFeGFjdGx5KG91dHB1dCwga1NpZ25hdHVyZSwgc2l6ZW9mKGtTaWduYXR1cmUpIC0gMSk7Cit9CisKK3ZvaWQgUGF0Y2hVdGlsczo6V3JpdGVMb25nKGludDY0X3QgdmFsdWUsIGJvcnJvd2VkX2ZkIG91dHB1dCkgeworICAgIGludDY0X3QgdG9MaXR0bGVFbmRpYW4gPSBodG9sZTY0KHZhbHVlKTsKKyAgICBXcml0ZUZkRXhhY3RseShvdXRwdXQsICZ0b0xpdHRsZUVuZGlhbiwgc2l6ZW9mKGludDY0X3QpKTsKK30KKwordm9pZCBQYXRjaFV0aWxzOjpQaXBlKGJvcnJvd2VkX2ZkIGlucHV0LCBib3Jyb3dlZF9mZCBvdXRwdXQsIHNpemVfdCBhbW91bnQpIHsKKyAgICBjb25zdGV4cHIgc3RhdGljIGludCBCVUZGRVJfU0laRSA9IDEyOCAqIDEwMjQ7CisgICAgY2hhciBidWZmZXJbQlVGRkVSX1NJWkVdOworICAgIHNpemVfdCB0cmFuc2ZlckFtb3VudCA9IDA7CisgICAgd2hpbGUgKHRyYW5zZmVyQW1vdW50ICE9IGFtb3VudCkgeworICAgICAgICBsb25nIGNodW5rQW1vdW50ID0KKyAgICAgICAgICAgICAgICBhbW91bnQgLSB0cmFuc2ZlckFtb3VudCA+IEJVRkZFUl9TSVpFID8gQlVGRkVSX1NJWkUgOiBhbW91bnQgLSB0cmFuc2ZlckFtb3VudDsKKyAgICAgICAgbG9uZyByZWFkQW1vdW50ID0gYWRiX3JlYWQoaW5wdXQsIGJ1ZmZlciwgY2h1bmtBbW91bnQpOworICAgICAgICBXcml0ZUZkRXhhY3RseShvdXRwdXQsIGJ1ZmZlciwgcmVhZEFtb3VudCk7CisgICAgICAgIHRyYW5zZmVyQW1vdW50ICs9IHJlYWRBbW91bnQ7CisgICAgfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL3BhdGNoX3V0aWxzLmggYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9wYXRjaF91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYmZlOGYKLS0tIC9kZXYvbnVsbAorKysgYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9wYXRjaF91dGlscy5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgImFkYl91bmlxdWVfZmQuaCIKKyNpbmNsdWRlICJmYXN0ZGVwbG95L3Byb3RvL0Fwa0VudHJ5LnBiLmgiCisKKy8qKgorICogSGVscGVyIGNsYXNzIHRoYXQgbWlycm9ycyB0aGUgUGF0Y2hVdGlscyBmcm9tIGRlcGxveSBhZ2VudC4KKyAqLworY2xhc3MgUGF0Y2hVdGlscyB7CisgIHB1YmxpYzoKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgbG9jYWwgQVBLIGZpbGUgYW5kIGJ1aWxkcyB0aGUgQVBLTWV0YURhdGEgcmVxdWlyZWQgYnkgdGhlIHBhdGNoaW5nCisgICAgICogYWxnb3JpdGhtLiBUaGUgaWYgdGhpcyBmdW5jdGlvbiBoYXMgYW4gZXJyb3IgYSBzdHJpbmcgaXMgcHJpbnRlZCB0byB0aGUgdGVybWluYWwgYW5kIGV4aXQoMSkKKyAgICAgKiBpcyBjYWxsZWQuCisgICAgICovCisgICAgc3RhdGljIGNvbTo6YW5kcm9pZDo6ZmFzdGRlcGxveTo6QVBLTWV0YURhdGEgR2V0QVBLTWV0YURhdGEoY29uc3QgY2hhciogZmlsZSk7CisgICAgLyoqCisgICAgICogV3JpdGVzIGEgZml4ZWQgc2lnbmF0dXJlIHN0cmluZyB0byB0aGUgaGVhZGVyIG9mIHRoZSBwYXRjaC4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBXcml0ZVNpZ25hdHVyZShhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBvdXRwdXQpOworICAgIC8qKgorICAgICAqIFdyaXRlcyBhbiBpbnQ2NCB0byB0aGUgfG91dHB1dHwgcmV2ZXJzaW5nIHRoZSBieXRlcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBXcml0ZUxvbmcoaW50NjRfdCB2YWx1ZSwgYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgb3V0cHV0KTsKKyAgICAvKioKKyAgICAgKiBDb3B5IHxhbW91bnR8IG9mIGRhdGEgZnJvbSB8aW5wdXR8IHRvIHxvdXRwdXR8LgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIFBpcGUoYW5kcm9pZDo6YmFzZTo6Ym9ycm93ZWRfZmQgaW5wdXQsIGFuZHJvaWQ6OmJhc2U6OmJvcnJvd2VkX2ZkIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBhbW91bnQpOworfTsKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9wYXRjaF91dGlsc190ZXN0LmNwcCBiL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL3BhdGNoX3V0aWxzX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZWVlYmYKLS0tIC9kZXYvbnVsbAorKysgYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9wYXRjaF91dGlsc190ZXN0LmNwcApAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInBhdGNoX3V0aWxzLmgiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImFkYl9pby5oIgorI2luY2x1ZGUgInN5c2RlcHMuaCIKKwordXNpbmcgbmFtZXNwYWNlIGNvbTo6YW5kcm9pZDo6ZmFzdGRlcGxveTsKKworc3RhdGljIHN0ZDo6c3RyaW5nIEdldFRlc3RGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7CisgICAgcmV0dXJuICJmYXN0ZGVwbG95L3Rlc3RkYXRhLyIgKyBuYW1lOworfQorCitib29sIEZpbGVNYXRjaGVzQ29udGVudChhbmRyb2lkOjpiYXNlOjpib3Jyb3dlZF9mZCBpbnB1dCwgY29uc3QgY2hhciogY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGNvbnRlbnRzU2l6ZSkgeworICAgIGFkYl9sc2VlayhpbnB1dCwgMCwgU0VFS19TRVQpOworICAgIC8vIFVzZSBhIHRlbXAgYnVmZmVyIGxhcmdlciB0aGFuIGFueSB0ZXN0IGNvbnRlbnRzLgorICAgIGNvbnN0ZXhwciBpbnQgQlVGRkVSX1NJWkUgPSAyMDQ4OworICAgIGNoYXIgYnVmZmVyW0JVRkZFUl9TSVpFXTsKKyAgICBib29sIHJlc3VsdCA9IHRydWU7CisgICAgLy8gVmFsaWRhdGUgc2l6ZSBvZiBmaWxlcyBpcyBlcXVhbC4KKyAgICBzc2l6ZV90IHJlYWRBbW91bnQgPSBhZGJfcmVhZChpbnB1dCwgYnVmZmVyLCBCVUZGRVJfU0laRSk7CisgICAgRVhQRUNUX0VRKHJlYWRBbW91bnQsIGNvbnRlbnRzU2l6ZSk7CisgICAgcmVzdWx0ID0gbWVtY21wKGJ1ZmZlciwgY29udGVudHMsIHJlYWRBbW91bnQpID09IDA7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWFkQW1vdW50OyBpKyspIHsKKyAgICAgICAgcHJpbnRmKCIleCIsIGJ1ZmZlcltpXSk7CisgICAgfQorICAgIHByaW50ZigiID09ICIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGVudHNTaXplOyBpKyspIHsKKyAgICAgICAgcHJpbnRmKCIleCIsIGNvbnRlbnRzW2ldKTsKKyAgICB9CisgICAgcHJpbnRmKCJcbiIpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworVEVTVChQYXRjaFV0aWxzVGVzdCwgU3dhcExvbmdXcml0ZXMpIHsKKyAgICBUZW1wb3JhcnlGaWxlIG91dHB1dDsKKyAgICBQYXRjaFV0aWxzOjpXcml0ZUxvbmcoMHgwMDExMjIzMzQ0NTU2Njc3LCBvdXRwdXQuZmQpOworICAgIGFkYl9sc2VlayhvdXRwdXQuZmQsIDAsIFNFRUtfU0VUKTsKKyAgICBjb25zdCBjaGFyIGV4cGVjdGVkW10gPSB7MHg3NywgMHg2NiwgMHg1NSwgMHg0NCwgMHgzMywgMHgyMiwgMHgxMSwgMHgwMH07CisgICAgRVhQRUNUX1RSVUUoRmlsZU1hdGNoZXNDb250ZW50KG91dHB1dC5mZCwgZXhwZWN0ZWQsIDgpKTsKK30KKworVEVTVChQYXRjaFV0aWxzVGVzdCwgUGlwZVdyaXRlc0Ftb3VudFRvT3V0cHV0KSB7CisgICAgc3RkOjpzdHJpbmcgZXhwZWN0ZWQoIlNvbWUgRGF0YSIpOworICAgIFRlbXBvcmFyeUZpbGUgaW5wdXQ7CisgICAgVGVtcG9yYXJ5RmlsZSBvdXRwdXQ7CisgICAgLy8gUG9wdWxhdGUgaW5wdXQgZmlsZS4KKyAgICBXcml0ZUZkRXhhY3RseShpbnB1dC5mZCwgZXhwZWN0ZWQpOworICAgIGFkYl9sc2VlayhpbnB1dC5mZCwgMCwgU0VFS19TRVQpOworICAgIC8vIE9wZW4gaW5wdXQgZmlsZSBmb3IgcmVhZCwgYW5kIG91dHB1dCBmaWxlIGZvciB3cml0ZS4KKyAgICBQYXRjaFV0aWxzOjpQaXBlKGlucHV0LmZkLCBvdXRwdXQuZmQsIGV4cGVjdGVkLnNpemUoKSk7CisgICAgLy8gVmFsaWRhdGUgcGlwZSB3b3JrZWQKKyAgICBFWFBFQ1RfVFJVRShGaWxlTWF0Y2hlc0NvbnRlbnQob3V0cHV0LmZkLCBleHBlY3RlZC5jX3N0cigpLCBleHBlY3RlZC5zaXplKCkpKTsKK30KKworVEVTVChQYXRjaFV0aWxzVGVzdCwgU2lnbmF0dXJlQ29uc3RNYXRjaGVzKSB7CisgICAgc3RkOjpzdHJpbmcgYXBrRmlsZSA9IEdldFRlc3RGaWxlKCJyb3RhdGluZ19jdWJlLXJlbGVhc2UuYXBrIik7CisgICAgVGVtcG9yYXJ5RmlsZSBvdXRwdXQ7CisgICAgUGF0Y2hVdGlsczo6V3JpdGVTaWduYXR1cmUob3V0cHV0LmZkKTsKKyAgICBzdGQ6OnN0cmluZyBjb250ZW50cygiRkFTVERFUExPWSIpOworICAgIEVYUEVDVF9UUlVFKEZpbGVNYXRjaGVzQ29udGVudChvdXRwdXQuZmQsIGNvbnRlbnRzLmNfc3RyKCksIGNvbnRlbnRzLnNpemUoKSkpOworfQorCitURVNUKFBhdGNoVXRpbHNUZXN0LCBHYXRoZXJNZXRhZGF0YSkgeworICAgIHN0ZDo6c3RyaW5nIGFwa0ZpbGUgPSBHZXRUZXN0RmlsZSgicm90YXRpbmdfY3ViZS1yZWxlYXNlLmFwayIpOworICAgIEFQS01ldGFEYXRhIG1ldGFkYXRhID0gUGF0Y2hVdGlsczo6R2V0QVBLTWV0YURhdGEoYXBrRmlsZS5jX3N0cigpKTsKKyAgICBzdGQ6OnN0cmluZyBleHBlY3RlZE1ldGFkYXRhOworICAgIGFuZHJvaWQ6OmJhc2U6OlJlYWRGaWxlVG9TdHJpbmcoR2V0VGVzdEZpbGUoInJvdGF0aW5nX2N1YmUtbWV0YWRhdGEtcmVsZWFzZS5kYXRhIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXhwZWN0ZWRNZXRhZGF0YSk7CisgICAgc3RkOjpzdHJpbmcgYWN0dWFsTWV0YWRhdGE7CisgICAgbWV0YWRhdGEuU2VyaWFsaXplVG9TdHJpbmcoJmFjdHVhbE1ldGFkYXRhKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRNZXRhZGF0YSwgYWN0dWFsTWV0YWRhdGEpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL3NyYy9jb20vYW5kcm9pZC9mYXN0ZGVwbG95L0RlcGxveVBhdGNoR2VuZXJhdG9yLmphdmEgYi9hZGIvZmFzdGRlcGxveS9kZXBsb3lwYXRjaGdlbmVyYXRvci9zcmMvY29tL2FuZHJvaWQvZmFzdGRlcGxveS9EZXBsb3lQYXRjaEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNGIyZWFiLi4wMDAwMDAwCi0tLSBhL2FkYi9mYXN0ZGVwbG95L2RlcGxveXBhdGNoZ2VuZXJhdG9yL3NyYy9jb20vYW5kcm9pZC9mYXN0ZGVwbG95L0RlcGxveVBhdGNoR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuZmFzdGRlcGxveTsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLlN0cmluZ0J1aWxkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlN0YW5kYXJkQ2hhcnNldHM7Ci1pbXBvcnQgc3RhdGljIGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0cy5VVEZfODsKLQotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RNYXAuU2ltcGxlRW50cnk7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5mYXN0ZGVwbG95LkFQS01ldGFEYXRhOwotaW1wb3J0IGNvbS5hbmRyb2lkLmZhc3RkZXBsb3kuQVBLRW50cnk7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBEZXBsb3lQYXRjaEdlbmVyYXRvciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gMTI4ICogMTAyNDsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDIpIHsKLSAgICAgICAgICAgICAgICBzaG93VXNhZ2UoMCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJvb2xlYW4gdmVyYm9zZSA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMikgewotICAgICAgICAgICAgICAgIFN0cmluZyB2ZXJib3NlRmxhZyA9IGFyZ3NbMl07Ci0gICAgICAgICAgICAgICAgaWYgKHZlcmJvc2VGbGFnLmNvbXBhcmVUbygiLS12ZXJib3NlIikgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICB2ZXJib3NlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBudWxsOwotICAgICAgICAgICAgU3RyaW5nIGFwa1BhdGggPSBhcmdzWzBdOwotICAgICAgICAgICAgU3RyaW5nIGRldmljZU1ldGFkYXRhUGF0aCA9IGFyZ3NbMV07Ci0gICAgICAgICAgICBGaWxlIGhvc3RGaWxlID0gbmV3IEZpbGUoYXBrUGF0aCk7Ci0KLSAgICAgICAgICAgIExpc3Q8QVBLRW50cnk+IGRldmljZVppcEVudHJpZXMgPSBnZXRNZXRhZGF0YUZyb21GaWxlKGRldmljZU1ldGFkYXRhUGF0aCk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkRldmljZSBFbnRyaWVzICgiICsgZGV2aWNlWmlwRW50cmllcy5zaXplKCkgKyAiKSIpOwotICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHsKLSAgICAgICAgICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChBUEtFbnRyeSBlbnRyeSA6IGRldmljZVppcEVudHJpZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgQVBLRW50cnlUb1N0cmluZyhlbnRyeSwgc2IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIExpc3Q8QVBLRW50cnk+IGhvc3RGaWxlRW50cmllcyA9IFBhdGNoVXRpbHMuZ2V0QVBLTWV0YURhdGEoaG9zdEZpbGUpLmdldEVudHJpZXNMaXN0KCk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkhvc3QgRW50cmllcyAoIiArIGhvc3RGaWxlRW50cmllcy5zaXplKCkgKyAiKSIpOwotICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHsKLSAgICAgICAgICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChBUEtFbnRyeSBlbnRyeSA6IGhvc3RGaWxlRW50cmllcykgewotICAgICAgICAgICAgICAgICAgICBBUEtFbnRyeVRvU3RyaW5nKGVudHJ5LCBzYik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihzYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTGlzdDxTaW1wbGVFbnRyeTxBUEtFbnRyeSwgQVBLRW50cnk+PiBpZGVudGljYWxDb250ZW50c0VudHJ5U2V0ID0KLSAgICAgICAgICAgICAgICBnZXRJZGVudGljYWxDb250ZW50cyhkZXZpY2VaaXBFbnRyaWVzLCBob3N0RmlsZUVudHJpZXMpOwotICAgICAgICAgICAgcmVwb3J0SWRlbnRpY2FsQ29udGVudHMoaWRlbnRpY2FsQ29udGVudHNFbnRyeVNldCwgaG9zdEZpbGUpOwotCi0gICAgICAgICAgICBpZiAodmVyYm9zZSkgewotICAgICAgICAgICAgICAgIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBmb3IgKFNpbXBsZUVudHJ5PEFQS0VudHJ5LCBBUEtFbnRyeT4gaWRlbnRpY2FsRW50cnkgOiBpZGVudGljYWxDb250ZW50c0VudHJ5U2V0KSB7Ci0gICAgICAgICAgICAgICAgICAgIEFQS0VudHJ5IGVudHJ5ID0gaWRlbnRpY2FsRW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgICAgICAgQVBLRW50cnlUb1N0cmluZyhlbnRyeSwgc2IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIklkZW50aWNhbCBFbnRyaWVzICgiICsgaWRlbnRpY2FsQ29udGVudHNFbnRyeVNldC5zaXplKCkgKyAiKSIpOwotICAgICAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihzYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY3JlYXRlUGF0Y2goaWRlbnRpY2FsQ29udGVudHNFbnRyeVNldCwgaG9zdEZpbGUsIFN5c3RlbS5vdXQpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJFcnJvcjogIiArIGUpOwotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KDIpOwotICAgICAgICB9Ci0gICAgICAgIFN5c3RlbS5leGl0KDApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2hvd1VzYWdlKGludCBleGl0Q29kZSkgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oInVzYWdlOiBkZXBsb3lwYXRjaGdlbmVyYXRvciA8YXBrcGF0aD4gPGRldmljZWFwa21ldGFkYXRhPiBbLS12ZXJib3NlXSIpOwotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIiIpOwotICAgICAgICBTeXN0ZW0uZXhpdChleGl0Q29kZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBUEtFbnRyeVRvU3RyaW5nKEFQS0VudHJ5IGVudHJ5LCBTdHJpbmdCdWlsZGVyIG91dHB1dFN0cmluZykgewotICAgICAgICBvdXRwdXRTdHJpbmcuYXBwZW5kKFN0cmluZy5mb3JtYXQoIkZpbGVuYW1lOiAlc1xuIiwgZW50cnkuZ2V0RmlsZU5hbWUoKSkpOwotICAgICAgICBvdXRwdXRTdHJpbmcuYXBwZW5kKFN0cmluZy5mb3JtYXQoIkNSQzMyOiAweCUwOFhcbiIsIGVudHJ5LmdldENyYzMyKCkpKTsKLSAgICAgICAgb3V0cHV0U3RyaW5nLmFwcGVuZChTdHJpbmcuZm9ybWF0KCJEYXRhIE9mZnNldDogJWRcbiIsIGVudHJ5LmdldERhdGFPZmZzZXQoKSkpOwotICAgICAgICBvdXRwdXRTdHJpbmcuYXBwZW5kKFN0cmluZy5mb3JtYXQoIkNvbXByZXNzZWQgU2l6ZTogJWRcbiIsIGVudHJ5LmdldENvbXByZXNzZWRTaXplKCkpKTsKLSAgICAgICAgb3V0cHV0U3RyaW5nLmFwcGVuZChTdHJpbmcuZm9ybWF0KCJVbmNvbXByZXNzZWQgU2l6ZTogJWRcbiIsIGVudHJ5LmdldFVuY29tcHJlc3NlZFNpemUoKSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8QVBLRW50cnk+IGdldE1ldGFkYXRhRnJvbUZpbGUoU3RyaW5nIGRldmljZU1ldGFkYXRhUGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBuZXcgRmlsZUlucHV0U3RyZWFtKG5ldyBGaWxlKGRldmljZU1ldGFkYXRhUGF0aCkpOwotICAgICAgICBBUEtNZXRhRGF0YSBhcGtNZXRhRGF0YSA9IEFQS01ldGFEYXRhLnBhcnNlRGVsaW1pdGVkRnJvbShpcyk7Ci0gICAgICAgIHJldHVybiBhcGtNZXRhRGF0YS5nZXRFbnRyaWVzTGlzdCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U2ltcGxlRW50cnk8QVBLRW50cnksIEFQS0VudHJ5Pj4gZ2V0SWRlbnRpY2FsQ29udGVudHMoCi0gICAgICAgIExpc3Q8QVBLRW50cnk+IGRldmljZVppcEVudHJpZXMsIExpc3Q8QVBLRW50cnk+IGhvc3RaaXBFbnRyaWVzKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBMaXN0PFNpbXBsZUVudHJ5PEFQS0VudHJ5LCBBUEtFbnRyeT4+IGlkZW50aWNhbENvbnRlbnRzID0KLSAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8U2ltcGxlRW50cnk8QVBLRW50cnksIEFQS0VudHJ5Pj4oKTsKLQotICAgICAgICBmb3IgKEFQS0VudHJ5IGRldmljZVppcEVudHJ5IDogZGV2aWNlWmlwRW50cmllcykgewotICAgICAgICAgICAgZm9yIChBUEtFbnRyeSBob3N0WmlwRW50cnkgOiBob3N0WmlwRW50cmllcykgewotICAgICAgICAgICAgICAgIGlmIChkZXZpY2VaaXBFbnRyeS5nZXRDcmMzMigpID09IGhvc3RaaXBFbnRyeS5nZXRDcmMzMigpICYmCi0gICAgICAgICAgICAgICAgICAgIGRldmljZVppcEVudHJ5LmdldEZpbGVOYW1lKCkuZXF1YWxzKGhvc3RaaXBFbnRyeS5nZXRGaWxlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgICAgICBpZGVudGljYWxDb250ZW50cy5hZGQobmV3IFNpbXBsZUVudHJ5KGRldmljZVppcEVudHJ5LCBob3N0WmlwRW50cnkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGlkZW50aWNhbENvbnRlbnRzLCBuZXcgQ29tcGFyYXRvcjxTaW1wbGVFbnRyeTxBUEtFbnRyeSwgQVBLRW50cnk+PigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKAotICAgICAgICAgICAgICAgIFNpbXBsZUVudHJ5PEFQS0VudHJ5LCBBUEtFbnRyeT4gcDEsIFNpbXBsZUVudHJ5PEFQS0VudHJ5LCBBUEtFbnRyeT4gcDIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTG9uZy5jb21wYXJlKHAxLmdldFZhbHVlKCkuZ2V0RGF0YU9mZnNldCgpLCBwMi5nZXRWYWx1ZSgpLmdldERhdGFPZmZzZXQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotCi0gICAgICAgIHJldHVybiBpZGVudGljYWxDb250ZW50czsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlcG9ydElkZW50aWNhbENvbnRlbnRzKAotICAgICAgICBMaXN0PFNpbXBsZUVudHJ5PEFQS0VudHJ5LCBBUEtFbnRyeT4+IGlkZW50aWNhbENvbnRlbnRzRW50cnlTZXQsIEZpbGUgaG9zdEZpbGUpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGxvbmcgdG90YWxFcXVhbEJ5dGVzID0gMDsKLSAgICAgICAgaW50IHRvdGFsRXF1YWxGaWxlcyA9IDA7Ci0gICAgICAgIGZvciAoU2ltcGxlRW50cnk8QVBLRW50cnksIEFQS0VudHJ5PiBlbnRyaWVzIDogaWRlbnRpY2FsQ29udGVudHNFbnRyeVNldCkgewotICAgICAgICAgICAgQVBLRW50cnkgaG9zdEFQS0VudHJ5ID0gZW50cmllcy5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgdG90YWxFcXVhbEJ5dGVzICs9IGhvc3RBUEtFbnRyeS5nZXRDb21wcmVzc2VkU2l6ZSgpOwotICAgICAgICAgICAgdG90YWxFcXVhbEZpbGVzKys7Ci0gICAgICAgIH0KLQotICAgICAgICBmbG9hdCBzYXZpbmdQZXJjZW50ID0gKGZsb2F0KSAodG90YWxFcXVhbEJ5dGVzICogMTAwKSAvIGhvc3RGaWxlLmxlbmd0aCgpOwotCi0gICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRGV0ZWN0ZWQgIiArIHRvdGFsRXF1YWxGaWxlcyArICIgZXF1YWwgQVBLIGVudHJpZXMiKTsKLSAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKHRvdGFsRXF1YWxCeXRlcyArICIgYnl0ZXMgYXJlIGVxdWFsIG91dCBvZiAiICsgaG9zdEZpbGUubGVuZ3RoKCkgKyAiICgiCi0gICAgICAgICAgICArIHNhdmluZ1BlcmNlbnQgKyAiJSkiKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBjcmVhdGVQYXRjaChMaXN0PFNpbXBsZUVudHJ5PEFQS0VudHJ5LCBBUEtFbnRyeT4+IHppcEVudHJ5U2ltcGxlRW50cnlzLAotICAgICAgICBGaWxlIGhvc3RGaWxlLCBPdXRwdXRTdHJlYW0gcGF0Y2hTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgUGF0Y2hGb3JtYXRFeGNlcHRpb24gewotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaG9zdEZpbGVJbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oaG9zdEZpbGUpOwotCi0gICAgICAgIHBhdGNoU3RyZWFtLndyaXRlKFBhdGNoVXRpbHMuU0lHTkFUVVJFLmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVNfQVNDSUkpKTsKLSAgICAgICAgUGF0Y2hVdGlscy53cml0ZUZvcm1hdHRlZExvbmcoaG9zdEZpbGUubGVuZ3RoKCksIHBhdGNoU3RyZWFtKTsKLQotICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbQlVGRkVSX1NJWkVdOwotICAgICAgICBsb25nIHRvdGFsQnl0ZXNXcml0dGVuID0gMDsKLSAgICAgICAgSXRlcmF0b3I8U2ltcGxlRW50cnk8QVBLRW50cnksIEFQS0VudHJ5Pj4gZW50cnlTaW1wbGVFbnRyeUl0ZXJhdG9yID0KLSAgICAgICAgICAgIHppcEVudHJ5U2ltcGxlRW50cnlzLml0ZXJhdG9yKCk7Ci0gICAgICAgIHdoaWxlIChlbnRyeVNpbXBsZUVudHJ5SXRlcmF0b3IuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBTaW1wbGVFbnRyeTxBUEtFbnRyeSwgQVBLRW50cnk+IGVudHJ5U2ltcGxlRW50cnkgPSBlbnRyeVNpbXBsZUVudHJ5SXRlcmF0b3IubmV4dCgpOwotICAgICAgICAgICAgQVBLRW50cnkgZGV2aWNlQVBLRW50cnkgPSBlbnRyeVNpbXBsZUVudHJ5LmdldEtleSgpOwotICAgICAgICAgICAgQVBLRW50cnkgaG9zdEFQS0VudHJ5ID0gZW50cnlTaW1wbGVFbnRyeS5nZXRWYWx1ZSgpOwotCi0gICAgICAgICAgICBsb25nIG5ld0RhdGFMZW4gPSBob3N0QVBLRW50cnkuZ2V0RGF0YU9mZnNldCgpIC0gdG90YWxCeXRlc1dyaXR0ZW47Ci0gICAgICAgICAgICBsb25nIG9sZERhdGFPZmZzZXQgPSBkZXZpY2VBUEtFbnRyeS5nZXREYXRhT2Zmc2V0KCk7Ci0gICAgICAgICAgICBsb25nIG9sZERhdGFMZW4gPSBkZXZpY2VBUEtFbnRyeS5nZXRDb21wcmVzc2VkU2l6ZSgpOwotCi0gICAgICAgICAgICBQYXRjaFV0aWxzLndyaXRlRm9ybWF0dGVkTG9uZyhuZXdEYXRhTGVuLCBwYXRjaFN0cmVhbSk7Ci0gICAgICAgICAgICBQYXRjaFV0aWxzLnBpcGUoaG9zdEZpbGVJbnB1dFN0cmVhbSwgcGF0Y2hTdHJlYW0sIGJ1ZmZlciwgbmV3RGF0YUxlbik7Ci0gICAgICAgICAgICBQYXRjaFV0aWxzLndyaXRlRm9ybWF0dGVkTG9uZyhvbGREYXRhT2Zmc2V0LCBwYXRjaFN0cmVhbSk7Ci0gICAgICAgICAgICBQYXRjaFV0aWxzLndyaXRlRm9ybWF0dGVkTG9uZyhvbGREYXRhTGVuLCBwYXRjaFN0cmVhbSk7Ci0KLSAgICAgICAgICAgIGxvbmcgc2tpcCA9IGhvc3RGaWxlSW5wdXRTdHJlYW0uc2tpcChvbGREYXRhTGVuKTsKLSAgICAgICAgICAgIGlmIChza2lwICE9IG9sZERhdGFMZW4pIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGF0Y2hGb3JtYXRFeGNlcHRpb24oInNraXAgZXJyb3I6IGF0dGVtcHRlZCB0byBza2lwICIgKyBvbGREYXRhTGVuCi0gICAgICAgICAgICAgICAgICAgICsgIiBieXRlcyBidXQgcmV0dXJuIGNvZGUgd2FzICIgKyBza2lwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRvdGFsQnl0ZXNXcml0dGVuICs9IG9sZERhdGFMZW4gKyBuZXdEYXRhTGVuOwotICAgICAgICB9Ci0gICAgICAgIGxvbmcgcmVtYWluZGVyTGVuID0gaG9zdEZpbGUubGVuZ3RoKCkgLSB0b3RhbEJ5dGVzV3JpdHRlbjsKLSAgICAgICAgUGF0Y2hVdGlscy53cml0ZUZvcm1hdHRlZExvbmcocmVtYWluZGVyTGVuLCBwYXRjaFN0cmVhbSk7Ci0gICAgICAgIFBhdGNoVXRpbHMucGlwZShob3N0RmlsZUlucHV0U3RyZWFtLCBwYXRjaFN0cmVhbSwgYnVmZmVyLCByZW1haW5kZXJMZW4pOwotICAgICAgICBQYXRjaFV0aWxzLndyaXRlRm9ybWF0dGVkTG9uZygwLCBwYXRjaFN0cmVhbSk7Ci0gICAgICAgIFBhdGNoVXRpbHMud3JpdGVGb3JtYXR0ZWRMb25nKDAsIHBhdGNoU3RyZWFtKTsKLSAgICAgICAgcGF0Y2hTdHJlYW0uZmx1c2goKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9hZGIvZmFzdGRlcGxveS90ZXN0ZGF0YS9yb3RhdGluZ19jdWJlLW1ldGFkYXRhLXJlbGVhc2UuZGF0YSBiL2FkYi9mYXN0ZGVwbG95L3Rlc3RkYXRhL3JvdGF0aW5nX2N1YmUtbWV0YWRhdGEtcmVsZWFzZS5kYXRhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NzFiZjMKLS0tIC9kZXYvbnVsbAorKysgYi9hZGIvZmFzdGRlcGxveS90ZXN0ZGF0YS9yb3RhdGluZ19jdWJlLW1ldGFkYXRhLXJlbGVhc2UuZGF0YQpAQCAtMCwwICsxLDYgQEAKKworIwjHgs+rDBIUTUVUQS1JTkYvTUFOSUZFU1QuTUYYxwYgUShXCisjCIONlY4HEhNBbmRyb2lkTWFuaWZlc3QueG1sGDEg5AUo6A8KKzYIprWAPhIjbGliL2FybWVhYmktdjdhL2xpYnZ1bGthbl9zYW1wbGUuc28YgQ4gwNJRKIyy7AEKKyAIl+OXkQ4SDnJlc291cmNlcy5hcnNjGPTgUSC0BCi0BAorHAiLnMLJAhILY2xhc3Nlcy5kZXgYwQcg/wUo9ApkaWZmIC0tZ2l0IGEvYWRiL2Zhc3RkZXBsb3kvdGVzdGRhdGEvcm90YXRpbmdfY3ViZS1yZWxlYXNlLmFwayBiL2FkYi9mYXN0ZGVwbG95L3Rlc3RkYXRhL3JvdGF0aW5nX2N1YmUtcmVsZWFzZS5hcGsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ3ZTBlYQotLS0gL2Rldi9udWxsCisrKyBiL2FkYi9mYXN0ZGVwbG95L3Rlc3RkYXRhL3JvdGF0aW5nX2N1YmUtcmVsZWFzZS5hcGsKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYWRiL3NvY2tldF9zcGVjLmNwcCBiL2FkYi9zb2NrZXRfc3BlYy5jcHAKaW5kZXggMTMzMzcyNC4uOTg0NjhiNSAxMDA2NDQKLS0tIGEvYWRiL3NvY2tldF9zcGVjLmNwcAorKysgYi9hZGIvc29ja2V0X3NwZWMuY3BwCkBAIC05Myw3ICs5Myw3IEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBzdGQ6OnN0cmluZyBhZGRyKHNwZWMuc3Vic3RyKDQpKTsKLSAgICAgICAgcG9ydF92YWx1ZSA9IC0xOworICAgICAgICBwb3J0X3ZhbHVlID0gREVGQVVMVF9BREJfTE9DQUxfVFJBTlNQT1JUX1BPUlQ7CiAKICAgICAgICAgLy8gRklYTUU6IFBhcnNlTmV0QWRkcmVzcyByZWplY3RzIHBvcnQgMC4gVGhpcyBjdXJyZW50bHkgZG9lc24ndCBodXJ0LCBiZWNhdXNlIGxpc3RlbmluZwogICAgICAgICAvLyAgICAgICAgb24gYW4gYWRkcmVzcyB0aGF0IGlzbid0ICdsb2NhbGhvc3QnIGlzIHVuc3VwcG9ydGVkLgpkaWZmIC0tZ2l0IGEvYWRiL3NvY2tldF9zcGVjX3Rlc3QuY3BwIGIvYWRiL3NvY2tldF9zcGVjX3Rlc3QuY3BwCmluZGV4IGY1ZWMwZjEuLjNhMmY2MGMgMTAwNjQ0Ci0tLSBhL2FkYi9zb2NrZXRfc3BlY190ZXN0LmNwcAorKysgYi9hZGIvc29ja2V0X3NwZWNfdGVzdC5jcHAKQEAgLTIwLDM4ICsyMCw3MSBAQAogCiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KIAotVEVTVChzb2NrZXRfc3BlYywgcGFyc2VfdGNwX3NvY2tldF9zcGVjKSB7CitURVNUKHNvY2tldF9zcGVjLCBwYXJzZV90Y3Bfc29ja2V0X3NwZWNfanVzdF9wb3J0KSB7CiAgICAgc3RkOjpzdHJpbmcgaG9zdG5hbWUsIGVycm9yLCBzZXJpYWw7CiAgICAgaW50IHBvcnQ7CiAgICAgRVhQRUNUX1RSVUUocGFyc2VfdGNwX3NvY2tldF9zcGVjKCJ0Y3A6NTAzNyIsICZob3N0bmFtZSwgJnBvcnQsICZzZXJpYWwsICZlcnJvcikpOwogICAgIEVYUEVDVF9FUSgiIiwgaG9zdG5hbWUpOwogICAgIEVYUEVDVF9FUSg1MDM3LCBwb3J0KTsKICAgICBFWFBFQ1RfRVEoIiIsIHNlcmlhbCk7Cit9CiAKLSAgICAvLyBCYWQgcG9ydHM6CitURVNUKHNvY2tldF9zcGVjLCBwYXJzZV90Y3Bfc29ja2V0X3NwZWNfYmFkX3BvcnRzKSB7CisgICAgc3RkOjpzdHJpbmcgaG9zdG5hbWUsIGVycm9yLCBzZXJpYWw7CisgICAgaW50IHBvcnQ7CiAgICAgRVhQRUNUX0ZBTFNFKHBhcnNlX3RjcF9zb2NrZXRfc3BlYygidGNwOiIsICZob3N0bmFtZSwgJnBvcnQsICZzZXJpYWwsICZlcnJvcikpOwogICAgIEVYUEVDVF9GQUxTRShwYXJzZV90Y3Bfc29ja2V0X3NwZWMoInRjcDotMSIsICZob3N0bmFtZSwgJnBvcnQsICZzZXJpYWwsICZlcnJvcikpOwogICAgIEVYUEVDVF9GQUxTRShwYXJzZV90Y3Bfc29ja2V0X3NwZWMoInRjcDo2NTUzNiIsICZob3N0bmFtZSwgJnBvcnQsICZzZXJpYWwsICZlcnJvcikpOworfQogCitURVNUKHNvY2tldF9zcGVjLCBwYXJzZV90Y3Bfc29ja2V0X3NwZWNfaG9zdF9hbmRfcG9ydCkgeworICAgIHN0ZDo6c3RyaW5nIGhvc3RuYW1lLCBlcnJvciwgc2VyaWFsOworICAgIGludCBwb3J0OwogICAgIEVYUEVDVF9UUlVFKHBhcnNlX3RjcF9zb2NrZXRfc3BlYygidGNwOmxvY2FsaG9zdDoxMjM0IiwgJmhvc3RuYW1lLCAmcG9ydCwgJnNlcmlhbCwgJmVycm9yKSk7CiAgICAgRVhQRUNUX0VRKCJsb2NhbGhvc3QiLCBob3N0bmFtZSk7CiAgICAgRVhQRUNUX0VRKDEyMzQsIHBvcnQpOwogICAgIEVYUEVDVF9FUSgibG9jYWxob3N0OjEyMzQiLCBzZXJpYWwpOworfQogCi0gICAgRVhQRUNUX0ZBTFNFKHBhcnNlX3RjcF9zb2NrZXRfc3BlYygidGNwOmxvY2FsaG9zdCIsICZob3N0bmFtZSwgJnBvcnQsICZzZXJpYWwsICZlcnJvcikpOworVEVTVChzb2NrZXRfc3BlYywgcGFyc2VfdGNwX3NvY2tldF9zcGVjX2hvc3Rfbm9fcG9ydCkgeworICAgIHN0ZDo6c3RyaW5nIGhvc3RuYW1lLCBlcnJvciwgc2VyaWFsOworICAgIGludCBwb3J0OworICAgIEVYUEVDVF9UUlVFKHBhcnNlX3RjcF9zb2NrZXRfc3BlYygidGNwOmxvY2FsaG9zdCIsICZob3N0bmFtZSwgJnBvcnQsICZzZXJpYWwsICZlcnJvcikpOworICAgIEVYUEVDVF9FUSgibG9jYWxob3N0IiwgaG9zdG5hbWUpOworICAgIEVYUEVDVF9FUSg1NTU1LCBwb3J0KTsKKyAgICBFWFBFQ1RfRVEoImxvY2FsaG9zdDo1NTU1Iiwgc2VyaWFsKTsKK30KKworVEVTVChzb2NrZXRfc3BlYywgcGFyc2VfdGNwX3NvY2tldF9zcGVjX2hvc3RfYmFkX3BvcnRzKSB7CisgICAgc3RkOjpzdHJpbmcgaG9zdG5hbWUsIGVycm9yLCBzZXJpYWw7CisgICAgaW50IHBvcnQ7CiAgICAgRVhQRUNUX0ZBTFNFKHBhcnNlX3RjcF9zb2NrZXRfc3BlYygidGNwOmxvY2FsaG9zdDoiLCAmaG9zdG5hbWUsICZwb3J0LCAmc2VyaWFsLCAmZXJyb3IpKTsKICAgICBFWFBFQ1RfRkFMU0UocGFyc2VfdGNwX3NvY2tldF9zcGVjKCJ0Y3A6bG9jYWxob3N0Oi0xIiwgJmhvc3RuYW1lLCAmcG9ydCwgJnNlcmlhbCwgJmVycm9yKSk7CiAgICAgRVhQRUNUX0ZBTFNFKHBhcnNlX3RjcF9zb2NrZXRfc3BlYygidGNwOmxvY2FsaG9zdDo2NTUzNiIsICZob3N0bmFtZSwgJnBvcnQsICZzZXJpYWwsICZlcnJvcikpOworfQogCi0gICAgLy8gSVB2NjoKK1RFU1Qoc29ja2V0X3NwZWMsIHBhcnNlX3RjcF9zb2NrZXRfc3BlY19pcHY2X2FuZF9wb3J0KSB7CisgICAgc3RkOjpzdHJpbmcgaG9zdG5hbWUsIGVycm9yLCBzZXJpYWw7CisgICAgaW50IHBvcnQ7CiAgICAgRVhQRUNUX1RSVUUocGFyc2VfdGNwX3NvY2tldF9zcGVjKCJ0Y3A6Wzo6MV06MTIzNCIsICZob3N0bmFtZSwgJnBvcnQsICZzZXJpYWwsICZlcnJvcikpOwogICAgIEVYUEVDVF9FUSgiOjoxIiwgaG9zdG5hbWUpOwogICAgIEVYUEVDVF9FUSgxMjM0LCBwb3J0KTsKICAgICBFWFBFQ1RfRVEoIls6OjFdOjEyMzQiLCBzZXJpYWwpOworfQogCitURVNUKHNvY2tldF9zcGVjLCBwYXJzZV90Y3Bfc29ja2V0X3NwZWNfaXB2Nl9ub19wb3J0KSB7CisgICAgc3RkOjpzdHJpbmcgaG9zdG5hbWUsIGVycm9yLCBzZXJpYWw7CisgICAgaW50IHBvcnQ7CisgICAgRVhQRUNUX1RSVUUocGFyc2VfdGNwX3NvY2tldF9zcGVjKCJ0Y3A6OjoxIiwgJmhvc3RuYW1lLCAmcG9ydCwgJnNlcmlhbCwgJmVycm9yKSk7CisgICAgRVhQRUNUX0VRKCI6OjEiLCBob3N0bmFtZSk7CisgICAgRVhQRUNUX0VRKDU1NTUsIHBvcnQpOworICAgIEVYUEVDVF9FUSgiWzo6MV06NTU1NSIsIHNlcmlhbCk7Cit9CisKK1RFU1Qoc29ja2V0X3NwZWMsIHBhcnNlX3RjcF9zb2NrZXRfc3BlY19pcHY2X2JhZF9wb3J0cykgeworICAgIHN0ZDo6c3RyaW5nIGhvc3RuYW1lLCBlcnJvciwgc2VyaWFsOworICAgIGludCBwb3J0OwogICAgIEVYUEVDVF9GQUxTRShwYXJzZV90Y3Bfc29ja2V0X3NwZWMoInRjcDpbOjoxXSIsICZob3N0bmFtZSwgJnBvcnQsICZzZXJpYWwsICZlcnJvcikpOwogICAgIEVYUEVDVF9GQUxTRShwYXJzZV90Y3Bfc29ja2V0X3NwZWMoInRjcDpbOjoxXToiLCAmaG9zdG5hbWUsICZwb3J0LCAmc2VyaWFsLCAmZXJyb3IpKTsKICAgICBFWFBFQ1RfRkFMU0UocGFyc2VfdGNwX3NvY2tldF9zcGVjKCJ0Y3A6Wzo6MV06LTEiLCAmaG9zdG5hbWUsICZwb3J0LCAmc2VyaWFsLCAmZXJyb3IpKTsKLSAgICBFWFBFQ1RfRkFMU0UocGFyc2VfdGNwX3NvY2tldF9zcGVjKCJ0Y3A6OjoxIiwgJmhvc3RuYW1lLCAmcG9ydCwgJnNlcmlhbCwgJmVycm9yKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKHBhcnNlX3RjcF9zb2NrZXRfc3BlYygidGNwOjo6MToxMjM0IiwgJmhvc3RuYW1lLCAmcG9ydCwgJnNlcmlhbCwgJmVycm9yKSk7CiB9CmRpZmYgLS1naXQgYS9hZGIvdHJhbnNwb3J0LmNwcCBiL2FkYi90cmFuc3BvcnQuY3BwCmluZGV4IDhiYzkyNWYuLjNkMWQ2MjAgMTAwNjQ0Ci0tLSBhL2FkYi90cmFuc3BvcnQuY3BwCisrKyBiL2FkYi90cmFuc3BvcnQuY3BwCkBAIC01NDIsOSArNTQyLDcgQEAKICAgICAvLyBmb3IgdGhlIGZpcnN0IHRpbWUsIGV2ZW4gaWYgbm8gdXBkYXRlIG9jY3VycmVkLgogICAgIGlmICh0cmFja2VyLT51cGRhdGVfbmVlZGVkKSB7CiAgICAgICAgIHRyYWNrZXItPnVwZGF0ZV9uZWVkZWQgPSBmYWxzZTsKLQotICAgICAgICBzdGQ6OnN0cmluZyB0cmFuc3BvcnRzID0gbGlzdF90cmFuc3BvcnRzKHRyYWNrZXItPmxvbmdfb3V0cHV0KTsKLSAgICAgICAgZGV2aWNlX3RyYWNrZXJfc2VuZCh0cmFja2VyLCB0cmFuc3BvcnRzKTsKKyAgICAgICAgZGV2aWNlX3RyYWNrZXJfc2VuZCh0cmFja2VyLCBsaXN0X3RyYW5zcG9ydHModHJhY2tlci0+bG9uZ19vdXRwdXQpKTsKICAgICB9CiB9CiAKQEAgLTU4NywxMyArNTg1LDExIEBACiAgICAgdXBkYXRlX3RyYW5zcG9ydF9zdGF0dXMoKTsKIAogICAgIC8vIE5vdGlmeSBgYWRiIHRyYWNrLWRldmljZXNgIGNsaWVudHMuCi0gICAgc3RkOjpzdHJpbmcgdHJhbnNwb3J0cyA9IGxpc3RfdHJhbnNwb3J0cyhmYWxzZSk7Ci0KICAgICBkZXZpY2VfdHJhY2tlciogdHJhY2tlciA9IGRldmljZV90cmFja2VyX2xpc3Q7CiAgICAgd2hpbGUgKHRyYWNrZXIgIT0gbnVsbHB0cikgewogICAgICAgICBkZXZpY2VfdHJhY2tlciogbmV4dCA9IHRyYWNrZXItPm5leHQ7CiAgICAgICAgIC8vIFRoaXMgbWF5IGRlc3Ryb3kgdGhlIHRyYWNrZXIgaWYgdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkLgotICAgICAgICBkZXZpY2VfdHJhY2tlcl9zZW5kKHRyYWNrZXIsIHRyYW5zcG9ydHMpOworICAgICAgICBkZXZpY2VfdHJhY2tlcl9zZW5kKHRyYWNrZXIsIGxpc3RfdHJhbnNwb3J0cyh0cmFja2VyLT5sb25nX291dHB1dCkpOwogICAgICAgICB0cmFja2VyID0gbmV4dDsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9mc19tZ3IvbGliZG0vZG0uY3BwIGIvZnNfbWdyL2xpYmRtL2RtLmNwcAppbmRleCAwYWQ4ZDlkLi5hNGUwZDc2IDEwMDY0NAotLS0gYS9mc19tZ3IvbGliZG0vZG0uY3BwCisrKyBiL2ZzX21nci9saWJkbS9kbS5jcHAKQEAgLTE1MCw2ICsxNTAsMTUgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorc3RkOjpvcHRpb25hbDxEZXZpY2VNYXBwZXI6OkluZm8+IERldmljZU1hcHBlcjo6R2V0RGV0YWlsZWRJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSBjb25zdCB7CisgICAgc3RydWN0IGRtX2lvY3RsIGlvOworICAgIEluaXRJbygmaW8sIG5hbWUpOworICAgIGlmIChpb2N0bChmZF8sIERNX0RFVl9TVEFUVVMsICZpbykgPCAwKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7CisgICAgfQorICAgIHJldHVybiBJbmZvKGlvLmZsYWdzKTsKK30KKwogRG1EZXZpY2VTdGF0ZSBEZXZpY2VNYXBwZXI6OkdldFN0YXRlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSBjb25zdCB7CiAgICAgc3RydWN0IGRtX2lvY3RsIGlvOwogICAgIEluaXRJbygmaW8sIG5hbWUpOwpAQCAtMTYyLDYgKzE3MSwyNCBAQAogICAgIHJldHVybiBEbURldmljZVN0YXRlOjpTVVNQRU5ERUQ7CiB9CiAKK2Jvb2wgRGV2aWNlTWFwcGVyOjpDaGFuZ2VTdGF0ZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgRG1EZXZpY2VTdGF0ZSBzdGF0ZSkgeworICAgIGlmIChzdGF0ZSAhPSBEbURldmljZVN0YXRlOjpTVVNQRU5ERUQgJiYgc3RhdGUgIT0gRG1EZXZpY2VTdGF0ZTo6QUNUSVZFKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdHJ1Y3QgZG1faW9jdGwgaW87CisgICAgSW5pdElvKCZpbywgbmFtZSk7CisKKyAgICBpZiAoc3RhdGUgPT0gRG1EZXZpY2VTdGF0ZTo6U1VTUEVOREVEKSBpby5mbGFncyA9IERNX1NVU1BFTkRfRkxBRzsKKworICAgIGlmIChpb2N0bChmZF8sIERNX0RFVl9TVVNQRU5ELCAmaW8pIDwgMCkgeworICAgICAgICBQTE9HKEVSUk9SKSA8PCAiRE1fREVWX1NVU1BFTkQgIgorICAgICAgICAgICAgICAgICAgICA8PCAoc3RhdGUgPT0gRG1EZXZpY2VTdGF0ZTo6U1VTUEVOREVEID8gInN1c3BlbmQiIDogInJlc3VtZSIpIDw8ICIgZmFpbGVkIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogYm9vbCBEZXZpY2VNYXBwZXI6OkNyZWF0ZURldmljZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgRG1UYWJsZSYgdGFibGUpIHsKICAgICBzdGQ6OnN0cmluZyBpZ25vcmVfcGF0aDsKICAgICBpZiAoIUNyZWF0ZURldmljZShuYW1lLCB0YWJsZSwgJmlnbm9yZV9wYXRoLCAwbXMpKSB7CmRpZmYgLS1naXQgYS9mc19tZ3IvbGliZG0vZG1fdGFyZ2V0LmNwcCBiL2ZzX21nci9saWJkbS9kbV90YXJnZXQuY3BwCmluZGV4IGRhMTAxM2UuLjFhNDgzZWMgMTAwNjQ0Ci0tLSBhL2ZzX21nci9saWJkbS9kbV90YXJnZXQuY3BwCisrKyBiL2ZzX21nci9saWJkbS9kbV90YXJnZXQuY3BwCkBAIC0xNiw2ICsxNiw3IEBACiAKICNpbmNsdWRlICJsaWJkbS9kbV90YXJnZXQuaCIKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIApAQCAtMTY1LDM1ICsxNjYsMjkgQEAKIH0KIAogYm9vbCBEbVRhcmdldFNuYXBzaG90OjpQYXJzZVN0YXR1c1RleHQoY29uc3Qgc3RkOjpzdHJpbmcmIHRleHQsIFN0YXR1cyogc3RhdHVzKSB7CisgICAgLy8gVHJ5IHRvIHBhcnNlIHRoZSBsaW5lIGFzIGl0IHNob3VsZCBiZQorICAgIGludCBhcmdzID0gc3NjYW5mKHRleHQuY19zdHIoKSwgIiUiIFBSSXU2NCAiLyUiIFBSSXU2NCAiICUiIFBSSXU2NCwgJnN0YXR1cy0+c2VjdG9yc19hbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cy0+dG90YWxfc2VjdG9ycywgJnN0YXR1cy0+bWV0YWRhdGFfc2VjdG9ycyk7CisgICAgaWYgKGFyZ3MgPT0gMykgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CiAgICAgYXV0byBzZWN0aW9ucyA9IGFuZHJvaWQ6OmJhc2U6OlNwbGl0KHRleHQsICIgIik7CisgICAgaWYgKHNlY3Rpb25zLnNpemUoKSA9PSAwKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNvdWxkIG5vdCBwYXJzZSBlbXB0eSBzdGF0dXMiOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIEVycm9yIGNvZGVzIGFyZTogIkludmFsaWQiLCAiT3ZlcmZsb3ciIGFuZCAiTWVyZ2UgZmFpbGVkIgogICAgIGlmIChzZWN0aW9ucy5zaXplKCkgPT0gMSkgewotICAgICAgICAvLyBUaGlzIGlzIHByb2JhYmx5IGFuIGVycm9yIGNvZGUsICJJbnZhbGlkIiBpcyBwb3NzaWJsZSBhcyBpcyAiT3ZlcmZsb3ciCi0gICAgICAgIC8vIG9uIDQuNCsuCisgICAgICAgIGlmICh0ZXh0ID09ICJJbnZhbGlkIiB8fCB0ZXh0ID09ICJPdmVyZmxvdyIpIHsKKyAgICAgICAgICAgIHN0YXR1cy0+ZXJyb3IgPSB0ZXh0OworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHNlY3Rpb25zLnNpemUoKSA9PSAyICYmIHRleHQgPT0gIk1lcmdlIGZhaWxlZCIpIHsKICAgICAgICAgc3RhdHVzLT5lcnJvciA9IHRleHQ7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KLSAgICBpZiAoc2VjdGlvbnMuc2l6ZSgpICE9IDIpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAic25hcHNob3Qgc3RhdHVzIHNob3VsZCBoYXZlIHR3byBjb21wb25lbnRzIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBhdXRvIHNlY3Rvcl9pbmZvID0gYW5kcm9pZDo6YmFzZTo6U3BsaXQoc2VjdGlvbnNbMF0sICIvIik7Ci0gICAgaWYgKHNlY3Rvcl9pbmZvLnNpemUoKSAhPSAyKSB7Ci0gICAgICAgIExPRyhFUlJPUikgPDwgInNuYXBzaG90IHNlY3RvciBpbmZvIHNob3VsZCBoYXZlIHR3byBjb21wb25lbnRzIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlBhcnNlVWludChzZWN0aW9uc1sxXSwgJnN0YXR1cy0+bWV0YWRhdGFfc2VjdG9ycykpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiY291bGQgbm90IHBhcnNlIG1ldGFkYXRhIHNlY3RvcnMiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmICghYW5kcm9pZDo6YmFzZTo6UGFyc2VVaW50KHNlY3Rvcl9pbmZvWzBdLCAmc3RhdHVzLT5zZWN0b3JzX2FsbG9jYXRlZCkpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiY291bGQgbm90IHBhcnNlIHNlY3RvcnMgYWxsb2NhdGVkIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OlBhcnNlVWludChzZWN0b3JfaW5mb1sxXSwgJnN0YXR1cy0+dG90YWxfc2VjdG9ycykpIHsKLSAgICAgICAgTE9HKEVSUk9SKSA8PCAiY291bGQgbm90IHBhcnNlIHRvdGFsIHNlY3RvcnMiOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOworICAgIExPRyhFUlJPUikgPDwgImNvdWxkIG5vdCBwYXJzZSBzbmFwc2hvdCBzdGF0dXM6IHdyb25nIGZvcm1hdCI7CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiBzdGQ6OnN0cmluZyBEbVRhcmdldENyeXB0OjpHZXRQYXJhbWV0ZXJTdHJpbmcoKSBjb25zdCB7CmRpZmYgLS1naXQgYS9mc19tZ3IvbGliZG0vZG1fdGVzdC5jcHAgYi9mc19tZ3IvbGliZG0vZG1fdGVzdC5jcHAKaW5kZXggYjI4YThmMi4uMTZiZTBkNSAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYmRtL2RtX3Rlc3QuY3BwCisrKyBiL2ZzX21nci9saWJkbS9kbV90ZXN0LmNwcApAQCAtMTY2LDYgKzE2NiwzNCBAQAogICAgIEFTU0VSVF9UUlVFKGRldi5EZXN0cm95KCkpOwogfQogCitURVNUKGxpYmRtLCBEbVN1c3BlbmRSZXN1bWUpIHsKKyAgICB1bmlxdWVfZmQgdG1wMShDcmVhdGVUZW1wRmlsZSgiZmlsZV9zdXNwZW5kX3Jlc3VtZSIsIDUxMikpOworICAgIEFTU0VSVF9HRSh0bXAxLCAwKTsKKworICAgIExvb3BEZXZpY2UgbG9vcF9hKHRtcDEsIDEwcyk7CisgICAgQVNTRVJUX1RSVUUobG9vcF9hLnZhbGlkKCkpOworCisgICAgRG1UYWJsZSB0YWJsZTsKKyAgICBBU1NFUlRfVFJVRSh0YWJsZS5FbXBsYWNlPERtVGFyZ2V0TGluZWFyPigwLCAxLCBsb29wX2EuZGV2aWNlKCksIDApKTsKKyAgICBBU1NFUlRfVFJVRSh0YWJsZS52YWxpZCgpKTsKKworICAgIFRlbXBEZXZpY2UgZGV2KCJsaWJkbS10ZXN0LWRtLXN1c3BlbmQtcmVzdW1lIiwgdGFibGUpOworICAgIEFTU0VSVF9UUlVFKGRldi52YWxpZCgpKTsKKyAgICBBU1NFUlRfRkFMU0UoZGV2LnBhdGgoKS5lbXB0eSgpKTsKKworICAgIGF1dG8mIGRtID0gRGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpOworCisgICAgLy8gVGVzdCBTZXQgYW5kIEdldCBzdGF0dXMgb2YgZGV2aWNlLgorICAgIHZlY3RvcjxEZXZpY2VNYXBwZXI6OlRhcmdldEluZm8+IHRhcmdldHM7CisgICAgQVNTRVJUX0VRKGRtLkdldFN0YXRlKGRldi5uYW1lKCkpLCBEbURldmljZVN0YXRlOjpBQ1RJVkUpOworCisgICAgQVNTRVJUX1RSVUUoZG0uQ2hhbmdlU3RhdGUoZGV2Lm5hbWUoKSwgRG1EZXZpY2VTdGF0ZTo6U1VTUEVOREVEKSk7CisgICAgQVNTRVJUX0VRKGRtLkdldFN0YXRlKGRldi5uYW1lKCkpLCBEbURldmljZVN0YXRlOjpTVVNQRU5ERUQpOworCisgICAgQVNTRVJUX1RSVUUoZG0uQ2hhbmdlU3RhdGUoZGV2Lm5hbWUoKSwgRG1EZXZpY2VTdGF0ZTo6QUNUSVZFKSk7CisgICAgQVNTRVJUX0VRKGRtLkdldFN0YXRlKGRldi5uYW1lKCkpLCBEbURldmljZVN0YXRlOjpBQ1RJVkUpOworfQorCiBURVNUKGxpYmRtLCBEbVZlcml0eUFyZ3NBdmIyKSB7CiAgICAgc3RkOjpzdHJpbmcgZGV2aWNlID0gIi9kZXYvYmxvY2svcGxhdGZvcm0vc29jLzFkYTQwMDAudWZzaGMvYnktbmFtZS92ZW5kb3JfYSI7CiAgICAgc3RkOjpzdHJpbmcgYWxnb3JpdGhtID0gInNoYTEiOwpAQCAtNDI4LDYgKzQ1NiwzMyBAQAogICAgIH0KIH0KIAorVEVTVChsaWJkbSwgUGFyc2VTdGF0dXNUZXh0KSB7CisgICAgRG1UYXJnZXRTbmFwc2hvdDo6U3RhdHVzIHN0YXR1czsKKworICAgIC8vIEJhZCBpbnB1dHMKKyAgICBFWFBFQ1RfRkFMU0UoRG1UYXJnZXRTbmFwc2hvdDo6UGFyc2VTdGF0dXNUZXh0KCIiLCAmc3RhdHVzKSk7CisgICAgRVhQRUNUX0ZBTFNFKERtVGFyZ2V0U25hcHNob3Q6OlBhcnNlU3RhdHVzVGV4dCgiWCIsICZzdGF0dXMpKTsKKyAgICBFWFBFQ1RfRkFMU0UoRG1UYXJnZXRTbmFwc2hvdDo6UGFyc2VTdGF0dXNUZXh0KCIxMjMiLCAmc3RhdHVzKSk7CisgICAgRVhQRUNUX0ZBTFNFKERtVGFyZ2V0U25hcHNob3Q6OlBhcnNlU3RhdHVzVGV4dCgiMTIzLzQ1NiIsICZzdGF0dXMpKTsKKyAgICBFWFBFQ1RfRkFMU0UoRG1UYXJnZXRTbmFwc2hvdDo6UGFyc2VTdGF0dXNUZXh0KCIxMjMgNDU2IiwgJnN0YXR1cykpOworICAgIEVYUEVDVF9GQUxTRShEbVRhcmdldFNuYXBzaG90OjpQYXJzZVN0YXR1c1RleHQoIjEyMyA0NTYiLCAmc3RhdHVzKSk7CisgICAgRVhQRUNUX0ZBTFNFKERtVGFyZ2V0U25hcHNob3Q6OlBhcnNlU3RhdHVzVGV4dCgiMTIzIDQ1NiA3ODkiLCAmc3RhdHVzKSk7CisgICAgRVhQRUNUX0ZBTFNFKERtVGFyZ2V0U25hcHNob3Q6OlBhcnNlU3RhdHVzVGV4dCgiMTIzIDQ1Ni83ODkiLCAmc3RhdHVzKSk7CisgICAgRVhQRUNUX0ZBTFNFKERtVGFyZ2V0U25hcHNob3Q6OlBhcnNlU3RhdHVzVGV4dCgiMTIzLzQ1Ni83ODkiLCAmc3RhdHVzKSk7CisgICAgRVhQRUNUX0ZBTFNFKERtVGFyZ2V0U25hcHNob3Q6OlBhcnNlU3RhdHVzVGV4dCgiMTIzIC8gNDU2IDc4OSIsICZzdGF0dXMpKTsKKworICAgIC8vIEdvb2QgaW5wdXQKKyAgICBFWFBFQ1RfVFJVRShEbVRhcmdldFNuYXBzaG90OjpQYXJzZVN0YXR1c1RleHQoIjEyMy80NTYgNzg5IiwgJnN0YXR1cykpOworICAgIEVYUEVDVF9FUShzdGF0dXMuc2VjdG9yc19hbGxvY2F0ZWQsIDEyMyk7CisgICAgRVhQRUNUX0VRKHN0YXR1cy50b3RhbF9zZWN0b3JzLCA0NTYpOworICAgIEVYUEVDVF9FUShzdGF0dXMubWV0YWRhdGFfc2VjdG9ycywgNzg5KTsKKworICAgIC8vIEtub3duIGVycm9yIGNvZGVzCisgICAgRVhQRUNUX1RSVUUoRG1UYXJnZXRTbmFwc2hvdDo6UGFyc2VTdGF0dXNUZXh0KCJJbnZhbGlkIiwgJnN0YXR1cykpOworICAgIEVYUEVDVF9UUlVFKERtVGFyZ2V0U25hcHNob3Q6OlBhcnNlU3RhdHVzVGV4dCgiTWVyZ2UgZmFpbGVkIiwgJnN0YXR1cykpOworICAgIEVYUEVDVF9UUlVFKERtVGFyZ2V0U25hcHNob3Q6OlBhcnNlU3RhdHVzVGV4dCgiT3ZlcmZsb3ciLCAmc3RhdHVzKSk7Cit9CisKIFRFU1QobGliZG0sIENyeXB0QXJncykgewogICAgIERtVGFyZ2V0Q3J5cHQgdGFyZ2V0MSgwLCA1MTIsICJzaGExIiwgImFiY2RlZmdoIiwgNTAsICIvZGV2L2xvb3AwIiwgMTAwKTsKICAgICBBU1NFUlRfRVEodGFyZ2V0MS5uYW1lKCksICJjcnlwdCIpOwpkaWZmIC0tZ2l0IGEvZnNfbWdyL2xpYmRtL2luY2x1ZGUvbGliZG0vZG0uaCBiL2ZzX21nci9saWJkbS9pbmNsdWRlL2xpYmRtL2RtLmgKaW5kZXggOWMwYzJmMy4uYzZiMzdjZiAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYmRtL2luY2x1ZGUvbGliZG0vZG0uaAorKysgYi9mc19tZ3IvbGliZG0vaW5jbHVkZS9saWJkbS9kbS5oCkBAIC0yNyw2ICsyNyw3IEBACiAKICNpbmNsdWRlIDxjaHJvbm8+CiAjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG9wdGlvbmFsPgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx1dGlsaXR5PgogI2luY2x1ZGUgPHZlY3Rvcj4KQEAgLTcwLDE1ICs3MSwzNyBAQAogICAgICAgICB1aW50NjRfdCBkZXZfOwogICAgIH07CiAKKyAgICBjbGFzcyBJbmZvIHsKKyAgICAgICAgdWludDMyX3QgZmxhZ3NfOworCisgICAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IEluZm8odWludDMyX3QgZmxhZ3MpIDogZmxhZ3NfKGZsYWdzKSB7fQorCisgICAgICAgIGJvb2wgSXNBY3RpdmVUYWJsZVByZXNlbnQoKSBjb25zdCB7IHJldHVybiBmbGFnc18gJiBETV9BQ1RJVkVfUFJFU0VOVF9GTEFHOyB9CisgICAgICAgIGJvb2wgSXNCdWZmZXJGdWxsKCkgY29uc3QgeyByZXR1cm4gZmxhZ3NfICYgRE1fQlVGRkVSX0ZVTExfRkxBRzsgfQorICAgICAgICBib29sIElzSW5hY3RpdmVUYWJsZVByZXNlbnQoKSBjb25zdCB7IHJldHVybiBmbGFnc18gJiBETV9JTkFDVElWRV9QUkVTRU5UX0ZMQUc7IH0KKyAgICAgICAgYm9vbCBJc1JlYWRPbmx5KCkgY29uc3QgeyByZXR1cm4gZmxhZ3NfICYgRE1fUkVBRE9OTFlfRkxBRzsgfQorICAgICAgICBib29sIElzU3VzcGVuZGVkKCkgY29uc3QgeyByZXR1cm4gZmxhZ3NfICYgRE1fU1VTUEVORF9GTEFHOyB9CisgICAgfTsKKwogICAgIC8vIFJlbW92ZXMgYSBkZXZpY2UgbWFwcGVyIGRldmljZSB3aXRoIHRoZSBnaXZlbiBuYW1lLgogICAgIC8vIFJldHVybnMgJ3RydWUnIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KICAgICBib29sIERlbGV0ZURldmljZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSk7CiAKKyAgICAvLyBGZXRjaGVzIGFuZCByZXR1cm5zIHRoZSBjb21wbGV0ZSBzdGF0ZSBvZiB0aGUgdW5kZXJseWluZyBkZXZpY2UgbWFwcGVyCisgICAgLy8gZGV2aWNlIHdpdGggZ2l2ZW4gbmFtZS4KKyAgICBzdGQ6Om9wdGlvbmFsPEluZm8+IEdldERldGFpbGVkSW5mbyhjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSkgY29uc3Q7CisKICAgICAvLyBSZXR1cm5zIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB1bmRlcmx5aW5nIGRldmljZSBtYXBwZXIgZGV2aWNlCiAgICAgLy8gd2l0aCBnaXZlbiBuYW1lLgogICAgIC8vIE9uZSBvZiBJTlZBTElELCBTVVNQRU5ERUQgb3IgQUNUSVZFLgogICAgIERtRGV2aWNlU3RhdGUgR2V0U3RhdGUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpIGNvbnN0OwogCisgICAgLy8gUHV0cyB0aGUgZ2l2ZW4gZGV2aWNlIHRvIHRoZSBzcGVjaWZpZWQgc3RhdHVzLCB3aGljaCBtdXN0IGJlIGVpdGhlcjoKKyAgICAvLyAtIFNVU1BFTkRFRDogc3VzcGVuZCB0aGUgZGV2aWNlLCBvcgorICAgIC8vIC0gQUNUSVZFOiByZXN1bWVzIHRoZSBkZXZpY2UuCisgICAgYm9vbCBDaGFuZ2VTdGF0ZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgRG1EZXZpY2VTdGF0ZSBzdGF0ZSk7CisKICAgICAvLyBDcmVhdGVzIGEgZGV2aWNlLCBsb2FkcyB0aGUgZ2l2ZW4gdGFibGUsIGFuZCBhY3RpdmF0ZXMgaXQuIElmIHRoZSBkZXZpY2UKICAgICAvLyBpcyBub3QgYWJsZSB0byBiZSBhY3RpdmF0ZWQsIGl0IGlzIGRlc3Ryb3llZCwgYW5kIGZhbHNlIGlzIHJldHVybmVkLgogICAgIC8vIEFmdGVyIGNyZWF0aW9uLCB8cGF0aHwgY29udGFpbnMgdGhlIHJlc3VsdCBvZiBjYWxsaW5nCmRpZmYgLS1naXQgYS9mc19tZ3IvbGlibHAvYnVpbGRlci5jcHAgYi9mc19tZ3IvbGlibHAvYnVpbGRlci5jcHAKaW5kZXggYzEyZTNiMi4uODc5N2VhOSAxMDA2NDQKLS0tIGEvZnNfbWdyL2xpYmxwL2J1aWxkZXIuY3BwCisrKyBiL2ZzX21nci9saWJscC9idWlsZGVyLmNwcApAQCAtMTA2MCw3ICsxMDYwLDcgQEAKICAgICBpZiAoc1JldHJvZml0RGFwLmhhc192YWx1ZSgpKSB7CiAgICAgICAgIHJldHVybiAqc1JldHJvZml0RGFwOwogICAgIH0KLSAgICByZXR1cm4gIWFuZHJvaWQ6OmJhc2U6OkdldEJvb2xQcm9wZXJ0eSgicm8uYm9vdC5keW5hbWljX3BhcnRpdGlvbnNfcmV0cm9maXQiLCBmYWxzZSk7CisgICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OkdldEJvb2xQcm9wZXJ0eSgicm8uYm9vdC5keW5hbWljX3BhcnRpdGlvbnNfcmV0cm9maXQiLCBmYWxzZSk7CiB9CiAKIGJvb2wgTWV0YWRhdGFCdWlsZGVyOjpJc1JldHJvZml0TWV0YWRhdGEoKSBjb25zdCB7CmRpZmYgLS1naXQgYS9mc19tZ3IvdGVzdHMvYWRiLXJlbW91bnQtdGVzdC5zaCBiL2ZzX21nci90ZXN0cy9hZGItcmVtb3VudC10ZXN0LnNoCmluZGV4IGMyYTBmMzMuLjY0MmYyYzEgMTAwNzU1Ci0tLSBhL2ZzX21nci90ZXN0cy9hZGItcmVtb3VudC10ZXN0LnNoCisrKyBiL2ZzX21nci90ZXN0cy9hZGItcmVtb3VudC10ZXN0LnNoCkBAIC0xNSwxMCArMTUsMTMgQEAKIAogYWRiIHJlbW91bnQgdGVzdHMKIAotLS1oZWxwICAgICAgICBUaGlzIGhlbHAKLS0tc2VyaWFsICAgICAgU3BlY2lmeSBkZXZpY2UgKG11c3QgaWYgbXVsdGlwbGUgYXJlIHByZXNlbnQpCi0tLWNvbG9yICAgICAgIERyZXNzIG91dHB1dCB3aXRoIGhpZ2hsaWdodGluZyBjb2xvcnMKLS0tcHJpbnQtdGltZSAgUmVwb3J0IHRoZSB0ZXN0IGR1cmF0aW9uCistLWNvbG9yICAgICAgICAgICAgICAgICAgICAgRHJlc3Mgb3V0cHV0IHdpdGggaGlnaGxpZ2h0aW5nIGNvbG9ycworLS1oZWxwICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaGVscAorLS1uby13YWl0LXNjcmVlbiAgICAgICAgICAgIERvIG5vdCB3YWl0IGZvciBkaXNwbGF5IHNjcmVlbiB0byBzZXR0bGUKKy0tcHJpbnQtdGltZSAgICAgICAgICAgICAgICBSZXBvcnQgdGhlIHRlc3QgZHVyYXRpb24KKy0tc2VyaWFsICAgICAgICAgICAgICAgICAgICBTcGVjaWZ5IGRldmljZSAobXVzdCBpZiBtdWx0aXBsZSBhcmUgcHJlc2VudCkKKy0td2FpdC1hZGIgPGR1cmF0aW9uPiAgICAgICBhZGIgd2FpdCB0aW1lb3V0CistLXdhaXQtZmFzdGJvb3QgPGR1cmF0aW9uPiAgZmFzdGJvb3Qgd2FpdCB0aW1lb3V0CiAKIENvbmRpdGlvbnM6CiAgLSBNdXN0IGJlIGEgdXNlcmRlYnVnIGJ1aWxkLgpAQCAtNTMsNiArNTYsNyBAQAogCiBBREJfV0FJVD00bQogRkFTVEJPT1RfV0FJVD0ybQorc2NyZWVuX3dhaXQ9dHJ1ZQogCiAjIwogIyMgIEhlbHBlciBGdW5jdGlvbnMKQEAgLTE4NSw3ICsxODksNyBAQAogWyAiVVNBR0U6IGFkYl9jYXQgPGZpbGU+ID5zdGRvdXQKIAogUmV0dXJuczogY29udGVudCBvZiBmaWxlIHRvIHN0ZG91dCB3aXRoIGNhcnJpYWdlIHJldHVybnMgc2tpcHBlZCwKLSAgICAgICAgIHRydWUgb2YgdGhlIGZpbGUgZXhpc3RzIiBdCisgICAgICAgICB0cnVlIGlmIHRoZSBmaWxlIGV4aXN0cyIgXQogYWRiX2NhdCgpIHsKICAgICBsb2NhbCBPVVRQVVQ9ImBhZGJfc2ggY2F0ICR7MX0gPC9kZXYvbnVsbCAyPiYxYCIKICAgICBsb2NhbCByZXQ9JHs/fQpAQCAtMTkzLDYgKzE5NywxNyBAQAogICAgIHJldHVybiAke3JldH0KIH0KIAorWyAiVVNBR0U6IGFkYl9scyA8ZGlyZmlsZT4gPnN0ZG91dAorCitSZXR1cm5zOiBmaWxlbmFtZSBvciBkaXJlY3RvcnUgY29udGVudCB0byBzdGRvdXQgd2l0aCBjYXJyaWFnZSByZXR1cm5zIHNraXBwZWQsCisgICAgICAgICB0cnVlIGlmIHRoZSBscyBoYWQgbm8gZXJyb3JzIiBdCithZGJfbHMoKSB7CisgICAgbG9jYWwgT1VUUFVUPSJgYWRiX3NoIGxzICR7MX0gPC9kZXYvbnVsbCAyPi9kZXYvbnVsbGAiCisgICAgbG9jYWwgcmV0PSR7P30KKyAgICBlY2hvICIke09VVFBVVH0iIHwgdHIgLWQgJ1xyJworICAgIHJldHVybiAke3JldH0KK30KKwogWyAiVVNBR0U6IGFkYl9yZWJvb3QKIAogUmV0dXJuczogdHJ1ZSBpZiB0aGUgcmVib290IGNvbW1hbmQgc3VjY2VlZGVkIiBdCkBAIC00MzYsNiArNDUxLDEwIEBACiAtbiAtIGVjaG8gbmV3bGluZSBhdCBleGl0CiBUSU1FT1VUIC0gZGVmYXVsdCBgZm9ybWF0X2R1cmF0aW9uICR7d2FpdF9mb3Jfc2NyZWVuX3RpbWVvdXR9YCIgXQogd2FpdF9mb3Jfc2NyZWVuKCkgeworICBpZiAhICR7c2NyZWVuX3dhaXR9OyB0aGVuCisgICAgYWRiX3dhaXQKKyAgICByZXR1cm4KKyAgZmkKICAgZXhpdF9mdW5jdGlvbj10cnVlCiAgIGlmIFsgWCItbiIgPSBYIiR7MX0iIF07IHRoZW4KICAgICBleGl0X2Z1bmN0aW9uPWVjaG8KQEAgLTc0Myw2ICs3NjIsOSBAQAogCiBPUFRJT05TPWBnZXRvcHQgLS1hbHRlcm5hdGl2ZSAtLXVucXVvdGVkIFwKICAgICAgICAgICAgICAgICAtLWxvbmdvcHRpb25zIGhlbHAsc2VyaWFsOixjb2xvdXIsY29sb3Isbm8tY29sb3VyLG5vLWNvbG9yIFwKKyAgICAgICAgICAgICAgICAtLWxvbmdvcHRpb25zIHdhaXQtYWRiOix3YWl0LWZhc3Rib290OiBcCisgICAgICAgICAgICAgICAgLS1sb25nb3B0aW9ucyB3YWl0LXNjcmVlbix3YWl0LWRpc3BsYXkgXAorICAgICAgICAgICAgICAgIC0tbG9uZ29wdGlvbnMgbm8td2FpdC1zY3JlZW4sbm8td2FpdC1kaXNwbGF5IFwKICAgICAgICAgICAgICAgICAtLWxvbmdvcHRpb25zIGd0ZXN0X3ByaW50X3RpbWUscHJpbnQtdGltZSBcCiAgICAgICAgICAgICAgICAgLS0gIj9oczoiICR7Kn1gIHx8CiAgICggZWNobyAiJHtVU0FHRX0iID4mMiA7IGZhbHNlICkgfHwKQEAgLTc2Niw5ICs3ODgsMjMgQEAKICAgICAtLW5vLWNvbG9yIHwgLS1uby1jb2xvdXIpCiAgICAgICBjb2xvcj1mYWxzZQogICAgICAgOzsKKyAgICAtLW5vLXdhaXQtZGlzcGxheSB8IC0tbm8td2FpdC1zY3JlZW4pCisgICAgICBzY3JlZW5fd2FpdD1mYWxzZQorICAgICAgOzsKKyAgICAtLXdhaXQtZGlzcGxheSB8IC0td2FpdC1zY3JlZW4pCisgICAgICBzY3JlZW5fd2FpdD10cnVlCisgICAgICA7OwogICAgIC0tcHJpbnQtdGltZSB8IC0tZ3Rlc3RfcHJpbnRfdGltZSkKICAgICAgIHByaW50X3RpbWU9dHJ1ZQogICAgICAgOzsKKyAgICAtLXdhaXQtYWRiKQorICAgICAgQURCX1dBSVQ9JHsyfQorICAgICAgc2hpZnQKKyAgICAgIDs7CisgICAgLS13YWl0LWZhc3Rib290KQorICAgICAgRkFTVEJPT1RfV0FJVD0kezJ9CisgICAgICBzaGlmdAorICAgICAgOzsKICAgICAtLSkKICAgICAgIHNoaWZ0CiAgICAgICBicmVhawpAQCAtMTE0NSwxMCArMTE4MSwxNCBAQAogCiBBPSJIZWxsbyBXb3JsZCEgJChkYXRlKSIKIGVjaG8gIiR7QX0iIHwgYWRiX3NoIGNhdCAtICI+L3N5c3RlbS9oZWxsbyIKK2VjaG8gIiR7QX0iIHwgYWRiX3NoIGNhdCAtICI+L3N5c3RlbS9wcml2LWFwcC9oZWxsbyIKIGVjaG8gIiR7QX0iIHwgYWRiX3NoIGNhdCAtICI+L3ZlbmRvci9oZWxsbyIKIEI9ImBhZGJfY2F0IC9zeXN0ZW0vaGVsbG9gIiB8fAotICBkaWUgInN5dGVtIGhlbGxvIgorICBkaWUgInN5c3RlbSBoZWxsbyIKIGNoZWNrX2VxICIke0F9IiAiJHtCfSIgL3N5c3RlbSBiZWZvcmUgcmVib290CitCPSJgYWRiX2NhdCAvc3lzdGVtL3ByaXYtYXBwL2hlbGxvYCIgfHwKKyAgZGllICJzeXN0ZW0gcHJpdi1hcHAgaGVsbG8iCitjaGVja19lcSAiJHtBfSIgIiR7Qn0iIC9zeXN0ZW0vcHJpdi1hcHAgYmVmb3JlIHJlYm9vdAogQj0iYGFkYl9jYXQgL3ZlbmRvci9oZWxsb2AiIHx8CiAgIGRpZSAidmVuZG9yIGhlbGxvIgogY2hlY2tfZXEgIiR7QX0iICIke0J9IiAvdmVuZG9yIGJlZm9yZSByZWJvb3QKQEAgLTEyMzAsNiArMTI3MCwxMyBAQAogZmkKIEI9ImBhZGJfY2F0IC9zeXN0ZW0vaGVsbG9gIgogY2hlY2tfZXEgIiR7QX0iICIke0J9IiAvc3lzdGVtIGFmdGVyIHJlYm9vdAorIyBJZiBvdmVybGF5ZnMgaGFzIGEgbmVzdGVkIHNlY3VyaXR5IHByb2JsZW0sIHRoaXMgd2lsbCBmYWlsLgorQj0iYGFkYl9scyAvc3lzdGVtL2AiIHx8CisgIGRpciAiYWRiIGxzIC9zeXN0ZW0iCitbIFgiJHtCfSIgIT0gWCIke0IjKnByaXYtYXBwfSIgXSB8fAorICBkaXIgImFkYiBscyAvc3lzdGVtL3ByaXYtYXBwIgorQj0iYGFkYl9jYXQgL3N5c3RlbS9wcml2LWFwcC9oZWxsb2AiCitjaGVja19lcSAiJHtBfSIgIiR7Qn0iIC9zeXN0ZW0vcHJpdi1hcHAgYWZ0ZXIgcmVib290CiBlY2hvICIke0dSRUVOfVsgICAgICAgT0sgXSR7Tk9STUFMfSAvc3lzdGVtIGNvbnRlbnQgcmVtYWlucyBhZnRlciByZWJvb3QiID4mMgogIyBPbmx5IHJvb3QgY2FuIHJlYWQgdmVuZG9yIGlmIHNlcG9saWN5IHBlcm1pc3Npb25zIGFyZSBhcyBleHBlY3RlZC4KIGFkYl9yb290IHx8CkBAIC0xMzUxLDYgKzEzOTgsMTIgQEAKICAgZmkKICAgQj0iYGFkYl9jYXQgL3N5c3RlbS9oZWxsb2AiCiAgIGNoZWNrX2VxICIke0F9IiAiJHtCfSIgc3lzdGVtIGFmdGVyIGZsYXNoIHZlbmRvcgorICBCPSJgYWRiX2xzIC9zeXN0ZW0vYCIgfHwKKyAgICBkaXIgImFkYiBscyAvc3lzdGVtIgorICBbIFgiJHtCfSIgIT0gWCIke0IjKnByaXYtYXBwfSIgXSB8fAorICAgIGRpciAiYWRiIGxzIC9zeXN0ZW0vcHJpdi1hcHAiCisgIEI9ImBhZGJfY2F0IC9zeXN0ZW0vcHJpdi1hcHAvaGVsbG9gIgorICBjaGVja19lcSAiJHtBfSIgIiR7Qn0iIHN5c3RlbS9wcml2LWFwcCBhZnRlciBmbGFzaCB2ZW5kb3IKICAgYWRiX3Jvb3QgfHwKICAgICBkaWUgImFkYiByb290IgogICBCPSJgYWRiX2NhdCAvdmVuZG9yL2hlbGxvYCIKQEAgLTEzOTIsMTUgKzE0NDUsMTcgQEAKIGVjaG8gIiR7SH0iCiBbICR7ZXJyfSA9IDAgXSAmJgogICAoIGFkYl9zaCBybSAvdmVuZG9yL2hlbGxvIDwvZGV2L251bGwgMj4vZGV2L251bGwgfHwgdHJ1ZSApICYmCi0gIGFkYl9zaCBybSAvc3lzdGVtL2hlbGxvIDwvZGV2L251bGwgfHwKKyAgYWRiX3NoIHJtIC9zeXN0ZW0vaGVsbG8gL3N5c3RlbS9wcml2LWFwcC9oZWxsbyA8L2Rldi9udWxsIHx8CiAgICggWyAtbiAiJHtMfSIgXSAmJiBlY2hvICIke0x9IiAmJiBmYWxzZSApIHx8CiAgIGRpZSAtdCAke1R9ICJjbGVhbnVwIGhlbGxvIgogQj0iYGFkYl9jYXQgL3N5c3RlbS9oZWxsb2AiCiBjaGVja19lcSAiY2F0OiAvc3lzdGVtL2hlbGxvOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5IiAiJHtCfSIgYWZ0ZXIgcm0KK0I9ImBhZGJfY2F0IC9zeXN0ZW0vcHJpdi1hcHAvaGVsbG9gIgorY2hlY2tfZXEgImNhdDogL3N5c3RlbS9wcml2LWFwcC9oZWxsbzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIgIiR7Qn0iIGFmdGVyIHJtCiBCPSJgYWRiX2NhdCAvdmVuZG9yL2hlbGxvYCIKIGNoZWNrX2VxICJjYXQ6IC92ZW5kb3IvaGVsbG86IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkiICIke0J9IiBhZnRlciBybQogCi1pZiBbIC1uICIke3NjcmF0Y2hfcGFydGl0aW9ufSIgXTsgdGhlbgoraWYgJHtpc19ib290bG9hZGVyX2Zhc3Rib290fSAmJiBbIC1uICIke3NjcmF0Y2hfcGFydGl0aW9ufSIgXTsgdGhlbgogCiAgIGVjaG8gIiR7R1JFRU59WyBSVU4gICAgICBdJHtOT1JNQUx9IHRlc3QgZmFzdGJvb3QgZmxhc2ggdG8gJHtzY3JhdGNoX3BhcnRpdGlvbn0gcmVjb3ZlcnkiID4mMgogCkBAIC0xNTQyLDcgKzE1OTcsOSBAQAogICAgIGFkYl93YWl0ICR7QURCX1dBSVR9IHx8CiAgICAgZGllICJhZGIgcmVtb3VudCAtUiIKICAgaWYgWyAib3JhbmdlIiAhPSAiYGdldF9wcm9wZXJ0eSByby5ib290LnZlcmlmaWVkYm9vdHN0YXRlYCIgLW8gXAotICAgICAgICIyIiA9ICJgZ2V0X3Byb3BlcnR5IHBhcnRpdGlvbi5zeXN0ZW0udmVyaWZpZWRgIiBdOyB0aGVuCisgICAgICAgIjIiID0gImBnZXRfcHJvcGVydHkgcGFydGl0aW9uLnN5c3RlbS52ZXJpZmllZGAiIF0gJiYKKyAgICAgWyAtbiAiYGdldF9wcm9wZXJ0eSByby5ib290LnZlcmlmaWVkYm9vdHN0YXRlYCIgLW8gXAorICAgICAgIC1uICJgZ2V0X3Byb3BlcnR5IHBhcnRpdGlvbi5zeXN0ZW0udmVyaWZpZWRgIiBdOyB0aGVuCiAgICAgZGllICJyZW1vdW50IC1SIGNvbW1hbmQgZmFpbGVkIHRvIGRpc2FibGUgdmVyaXR5IgogICBmaQogCmRpZmYgLS1naXQgYS9mc19tZ3IvdG9vbHMvZG1jdGwuY3BwIGIvZnNfbWdyL3Rvb2xzL2RtY3RsLmNwcAppbmRleCA3ZTZhZDViLi40ZmIwYjgzIDEwMDY0NAotLS0gYS9mc19tZ3IvdG9vbHMvZG1jdGwuY3BwCisrKyBiL2ZzX21nci90b29scy9kbWN0bC5jcHAKQEAgLTQ5LDcgKzQ5LDEwIEBACiAgICAgc3RkOjpjZXJyIDw8ICIgIGRlbGV0ZSA8ZG0tbmFtZT4iIDw8IHN0ZDo6ZW5kbDsKICAgICBzdGQ6OmNlcnIgPDwgIiAgbGlzdCA8ZGV2aWNlcyB8IHRhcmdldHM+IFstdl0iIDw8IHN0ZDo6ZW5kbDsKICAgICBzdGQ6OmNlcnIgPDwgIiAgZ2V0cGF0aCA8ZG0tbmFtZT4iIDw8IHN0ZDo6ZW5kbDsKKyAgICBzdGQ6OmNlcnIgPDwgIiAgaW5mbyA8ZG0tbmFtZT4iIDw8IHN0ZDo6ZW5kbDsKICAgICBzdGQ6OmNlcnIgPDwgIiAgc3RhdHVzIDxkbS1uYW1lPiIgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y2VyciA8PCAiICByZXN1bWUgPGRtLW5hbWU+IiA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjZXJyIDw8ICIgIHN1c3BlbmQgPGRtLW5hbWU+IiA8PCBzdGQ6OmVuZGw7CiAgICAgc3RkOjpjZXJyIDw8ICIgIHRhYmxlIDxkbS1uYW1lPiIgPDwgc3RkOjplbmRsOwogICAgIHN0ZDo6Y2VyciA8PCAiICBoZWxwIiA8PCBzdGQ6OmVuZGw7CiAgICAgc3RkOjpjZXJyIDw8IHN0ZDo6ZW5kbDsKQEAgLTM1Nyw2ICszNjAsNDEgQEAKICAgICByZXR1cm4gMDsKIH0KIAorc3RhdGljIGludCBJbmZvQ21kSGFuZGxlcihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBpZiAoYXJnYyAhPSAxKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiSW52YWxpZCBhcmd1bWVudHMsIHNlZSBcJ2RtY3RsIGhlbHBcJyIgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBEZXZpY2VNYXBwZXImIGRtID0gRGV2aWNlTWFwcGVyOjpJbnN0YW5jZSgpOworICAgIGF1dG8gaW5mbyA9IGRtLkdldERldGFpbGVkSW5mbyhhcmd2WzBdKTsKKyAgICBpZiAoIWluZm8pIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJJbnZhbGlkIGRldmljZSBcIiIgPDwgYXJndlswXSA8PCAiXCIuIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIGNvbnN0ZXhwciBpbnQgc3BhY2luZyA9IDE0OworICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmxlZnQgPDwgc3RkOjpzZXR3KHNwYWNpbmcpIDw8ICJkZXZpY2UiCisgICAgICAgICAgICAgIDw8ICI6ICIgPDwgYXJndlswXSA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjb3V0IDw8IHN0ZDo6bGVmdCA8PCBzdGQ6OnNldHcoc3BhY2luZykgPDwgImFjdGl2ZSIKKyAgICAgICAgICAgICAgPDwgIjogIiA8PCBzdGQ6OmJvb2xhbHBoYSA8PCAhaW5mby0+SXNTdXNwZW5kZWQoKSA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjb3V0IDw8IHN0ZDo6bGVmdCA8PCBzdGQ6OnNldHcoc3BhY2luZykgPDwgImFjY2VzcyIKKyAgICAgICAgICAgICAgPDwgIjogIjsKKyAgICBpZiAoaW5mby0+SXNSZWFkT25seSgpKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAicm8gIjsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OmNvdXQgPDwgInJ3ICI7CisgICAgfQorICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjb3V0IDw8IHN0ZDo6bGVmdCA8PCBzdGQ6OnNldHcoc3BhY2luZykgPDwgImFjdGl2ZVRhYmxlIgorICAgICAgICAgICAgICA8PCAiOiAiIDw8IHN0ZDo6Ym9vbGFscGhhIDw8IGluZm8tPklzQWN0aXZlVGFibGVQcmVzZW50KCkgPDwgc3RkOjplbmRsOworICAgIHN0ZDo6Y291dCA8PCBzdGQ6OmxlZnQgPDwgc3RkOjpzZXR3KHNwYWNpbmcpIDw8ICJpbmFjdGl2ZVRhYmxlIgorICAgICAgICAgICAgICA8PCAiOiAiIDw8IHN0ZDo6Ym9vbGFscGhhIDw8IGluZm8tPklzSW5hY3RpdmVUYWJsZVByZXNlbnQoKSA8PCBzdGQ6OmVuZGw7CisgICAgc3RkOjpjb3V0IDw8IHN0ZDo6bGVmdCA8PCBzdGQ6OnNldHcoc3BhY2luZykgPDwgImJ1ZmZlckZ1bGwiCisgICAgICAgICAgICAgIDw8ICI6ICIgPDwgc3RkOjpib29sYWxwaGEgPDwgaW5mby0+SXNCdWZmZXJGdWxsKCkgPDwgc3RkOjplbmRsOworICAgIHJldHVybiAwOworfQorCiBzdGF0aWMgaW50IER1bXBUYWJsZShjb25zdCBzdGQ6OnN0cmluZyYgbW9kZSwgaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CiAgICAgaWYgKGFyZ2MgIT0gMSkgewogICAgICAgICBzdGQ6OmNlcnIgPDwgIkludmFsaWQgYXJndW1lbnRzLCBzZWUgXCdkbWN0bCBoZWxwXCciIDw8IHN0ZDo6ZW5kbDsKQEAgLTM5OSw2ICs0MzcsMzQgQEAKICAgICByZXR1cm4gRHVtcFRhYmxlKCJzdGF0dXMiLCBhcmdjLCBhcmd2KTsKIH0KIAorc3RhdGljIGludCBSZXN1bWVDbWRIYW5kbGVyKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIGlmIChhcmdjICE9IDEpIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJJbnZhbGlkIGFyZ3VtZW50cywgc2VlIFwnZG1jdGwgaGVscFwnIiA8PCBzdGQ6OmVuZGw7CisgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIH0KKworICAgIERldmljZU1hcHBlciYgZG0gPSBEZXZpY2VNYXBwZXI6Okluc3RhbmNlKCk7CisgICAgaWYgKCFkbS5DaGFuZ2VTdGF0ZShhcmd2WzBdLCBEbURldmljZVN0YXRlOjpBQ1RJVkUpKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiQ291bGQgbm90IHJlc3VtZSBkZXZpY2UgXCIiIDw8IGFyZ3ZbMF0gPDwgIlwiLiIgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgU3VzcGVuZENtZEhhbmRsZXIoaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgaWYgKGFyZ2MgIT0gMSkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIkludmFsaWQgYXJndW1lbnRzLCBzZWUgXCdkbWN0bCBoZWxwXCciIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgRGV2aWNlTWFwcGVyJiBkbSA9IERldmljZU1hcHBlcjo6SW5zdGFuY2UoKTsKKyAgICBpZiAoIWRtLkNoYW5nZVN0YXRlKGFyZ3ZbMF0sIERtRGV2aWNlU3RhdGU6OlNVU1BFTkRFRCkpIHsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJDb3VsZCBub3Qgc3VzcGVuZCBkZXZpY2UgXCIiIDw8IGFyZ3ZbMF0gPDwgIlwiLiIgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpmdW5jdGlvbjxpbnQoaW50LCBjaGFyKiopPj4gY21kbWFwID0gewogICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb2ZmCiAgICAgICAgIHsiY3JlYXRlIiwgRG1DcmVhdGVDbWRIYW5kbGVyfSwKQEAgLTQwNiw4ICs0NzIsMTEgQEAKICAgICAgICAgeyJsaXN0IiwgRG1MaXN0Q21kSGFuZGxlcn0sCiAgICAgICAgIHsiaGVscCIsIEhlbHBDbWRIYW5kbGVyfSwKICAgICAgICAgeyJnZXRwYXRoIiwgR2V0UGF0aENtZEhhbmRsZXJ9LAorICAgICAgICB7ImluZm8iLCBJbmZvQ21kSGFuZGxlcn0sCiAgICAgICAgIHsidGFibGUiLCBUYWJsZUNtZEhhbmRsZXJ9LAogICAgICAgICB7InN0YXR1cyIsIFN0YXR1c0NtZEhhbmRsZXJ9LAorICAgICAgICB7InJlc3VtZSIsIFJlc3VtZUNtZEhhbmRsZXJ9LAorICAgICAgICB7InN1c3BlbmQiLCBTdXNwZW5kQ21kSGFuZGxlcn0sCiAgICAgICAgIC8vIGNsYW5nLWZvcm1hdCBvbgogfTsKIApkaWZmIC0tZ2l0IGEvaW5pdC9zaWdjaGxkX2hhbmRsZXIuY3BwIGIvaW5pdC9zaWdjaGxkX2hhbmRsZXIuY3BwCmluZGV4IGM5YTA5Y2QuLjk4NDIzNWQgMTAwNjQ0Ci0tLSBhL2luaXQvc2lnY2hsZF9oYW5kbGVyLmNwcAorKysgYi9pbml0L3NpZ2NobGRfaGFuZGxlci5jcHAKQEAgLTczLDYgKzczLDEzIEBACiAgICAgICAgICAgICAgICAgYXV0byBleGVjX2R1cmF0aW9uX21zID0KICAgICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4oZXhlY19kdXJhdGlvbikuY291bnQoKTsKICAgICAgICAgICAgICAgICB3YWl0X3N0cmluZyA9IFN0cmluZ1ByaW50ZigiIHdhaXRpbmcgdG9vayAlZiBzZWNvbmRzIiwgZXhlY19kdXJhdGlvbl9tcyAvIDEwMDAuMGYpOworICAgICAgICAgICAgfSBlbHNlIGlmIChzZXJ2aWNlLT5mbGFncygpICYgU1ZDX09ORVNIT1QpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGV4ZWNfZHVyYXRpb24gPSBib290X2Nsb2NrOjpub3coKSAtIHNlcnZpY2UtPnRpbWVfc3RhcnRlZCgpOworICAgICAgICAgICAgICAgIGF1dG8gZXhlY19kdXJhdGlvbl9tcyA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzPihleGVjX2R1cmF0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY291bnQoKTsKKyAgICAgICAgICAgICAgICB3YWl0X3N0cmluZyA9IFN0cmluZ1ByaW50ZigiIG9uZXNob3Qgc2VydmljZSB0b29rICVmIHNlY29uZHMgaW4gYmFja2dyb3VuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY19kdXJhdGlvbl9tcyAvIDEwMDAuMGYpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbmFtZSA9IFN0cmluZ1ByaW50ZigiVW50cmFja2VkIHBpZCAlZCIsIHBpZCk7CmRpZmYgLS1naXQgYS9saWJpb24vT1dORVJTIGIvbGliaW9uL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDNhZDJkCi0tLSAvZGV2L251bGwKKysrIGIvbGliaW9uL09XTkVSUwpAQCAtMCwwICsxLDIgQEAKK3NzcGF0aWxAZ29vZ2xlLmNvbQoraHJpZHlhQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL2xpYmlvbi9pb24uYyBiL2xpYmlvbi9pb24uYwppbmRleCBiOGRlNWE0Li4xZWNmYzc4IDEwMDY0NAotLS0gYS9saWJpb24vaW9uLmMKKysrIGIvbGliaW9uL2lvbi5jCkBAIC0xNTIsNiArMTUyLDggQEAKICAgICBpb25fdXNlcl9oYW5kbGVfdCBoYW5kbGU7CiAgICAgaW50IHJldDsKIAorICAgIGlmICghaGFuZGxlX2ZkKSByZXR1cm4gLUVJTlZBTDsKKwogICAgIGlmICghaW9uX2lzX2xlZ2FjeShmZCkpIHsKICAgICAgICAgc3RydWN0IGlvbl9uZXdfYWxsb2NhdGlvbl9kYXRhIGRhdGEgPSB7CiAgICAgICAgICAgICAubGVuID0gbGVuLApAQCAtMjAxLDYgKzIwMyw3IEBACiAgICAgaW50IHJldDsKICAgICBzdHJ1Y3QgaW9uX2hlYXBfcXVlcnkgcXVlcnk7CiAKKyAgICBpZiAoIWNudCkgcmV0dXJuIC1FSU5WQUw7CiAgICAgbWVtc2V0KCZxdWVyeSwgMCwgc2l6ZW9mKHF1ZXJ5KSk7CiAKICAgICByZXQgPSBpb25faW9jdGwoZmQsIElPTl9JT0NfSEVBUF9RVUVSWSwgJnF1ZXJ5KTsKZGlmZiAtLWdpdCBhL2xpYmlvbi90ZXN0cy9BbmRyb2lkLmJwIGIvbGliaW9uL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggYjNmY2IzYi4uZDNiNDY4OCAxMDA2NDQKLS0tIGEvbGliaW9uL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbGliaW9uL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTE4LDE4ICsxOCwxNSBAQAogICAgIG5hbWU6ICJpb24tdW5pdC10ZXN0cyIsCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItZyIsCi0gICAgICAgICItV2FsbCIsCi0gICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMiLAogICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsibGliaW9uIl0sCiAgICAgc3JjczogWwotICAgICAgICAiaW9uX3Rlc3RfZml4dHVyZS5jcHAiLAogICAgICAgICAiYWxsb2NhdGVfdGVzdC5jcHAiLAotICAgICAgICAiZm9ybWVybHlfdmFsaWRfaGFuZGxlX3Rlc3QuY3BwIiwKLSAgICAgICAgImludmFsaWRfdmFsdWVzX3Rlc3QuY3BwIiwKLSAgICAgICAgIm1hcF90ZXN0LmNwcCIsCi0gICAgICAgICJkZXZpY2VfdGVzdC5jcHAiLAogICAgICAgICAiZXhpdF90ZXN0LmNwcCIsCisgICAgCSJoZWFwX3F1ZXJ5LmNwcCIsCisgICAgICAgICJpbnZhbGlkX3ZhbHVlc190ZXN0LmNwcCIsCisgICAgICAgICJpb25fdGVzdF9maXh0dXJlLmNwcCIsCisgICAgICAgICJtYXBfdGVzdC5jcHAiLAogICAgIF0sCiB9CmRpZmYgLS1naXQgYS9saWJpb24vdGVzdHMvYWxsb2NhdGVfdGVzdC5jcHAgYi9saWJpb24vdGVzdHMvYWxsb2NhdGVfdGVzdC5jcHAKaW5kZXggM2M0NTI0ZS4uNWVkMDFiYiAxMDA2NDQKLS0tIGEvbGliaW9uL3Rlc3RzL2FsbG9jYXRlX3Rlc3QuY3BwCisrKyBiL2xpYmlvbi90ZXN0cy9hbGxvY2F0ZV90ZXN0LmNwcApAQCAtMTQsOTUgKzE0LDEwNiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPG1lbW9yeT4KIAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAKICNpbmNsdWRlIDxpb24vaW9uLmg+CiAjaW5jbHVkZSAiaW9uX3Rlc3RfZml4dHVyZS5oIgogCi1jbGFzcyBBbGxvY2F0ZSA6IHB1YmxpYyBJb25BbGxIZWFwc1Rlc3QgewotfTsKK2NsYXNzIEFsbG9jYXRlIDogcHVibGljIElvblRlc3Qge307CiAKLVRFU1RfRihBbGxvY2F0ZSwgQWxsb2NhdGUpCi17Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBhbGxvY2F0aW9uU2l6ZXNbXSA9IHs0KjEwMjQsIDY0KjEwMjQsIDEwMjQqMTAyNCwgMioxMDI0KjEwMjR9OwotICAgIGZvciAodW5zaWduZWQgaW50IGhlYXBNYXNrIDogbV9hbGxIZWFwcykgeworVEVTVF9GKEFsbG9jYXRlLCBBbGxvY2F0ZSkgeworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgYWxsb2NhdGlvblNpemVzW10gPSB7NCAqIDEwMjQsIDY0ICogMTAyNCwgMTAyNCAqIDEwMjQsIDIgKiAxMDI0ICogMTAyNH07CisgICAgZm9yIChjb25zdCBhdXRvJiBoZWFwIDogaW9uX2hlYXBzKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IHNpemUgOiBhbGxvY2F0aW9uU2l6ZXMpIHsKLSAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAiaGVhcCAiIDw8IGhlYXBNYXNrKTsKKyAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJoZWFwOiIgPDwgaGVhcC5uYW1lIDw8ICI6IiA8PCBoZWFwLnR5cGUgPDwgIjoiIDw8IGhlYXAuaGVhcF9pZCk7CiAgICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgInNpemUgIiA8PCBzaXplKTsKLSAgICAgICAgICAgIGlvbl91c2VyX2hhbmRsZV90IGhhbmRsZSA9IDA7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jKG1faW9uRmQsIHNpemUsIDAsIGhlYXBNYXNrLCAwLCAmaGFuZGxlKSk7Ci0gICAgICAgICAgICBBU1NFUlRfVFJVRShoYW5kbGUgIT0gMCk7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2ZyZWUobV9pb25GZCwgaGFuZGxlKSk7CisgICAgICAgICAgICBpbnQgZmQ7CisgICAgICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jX2ZkKGlvbmZkLCBzaXplLCAwLCAoMSA8PCBoZWFwLmhlYXBfaWQpLCAwLCAmZmQpKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZkICE9IDApOworICAgICAgICAgICAgQVNTRVJUX0VRKGNsb3NlKGZkKSwgMCk7ICAvLyBmcmVlIHRoZSBidWZmZXIKICAgICAgICAgfQogICAgIH0KIH0KIAotVEVTVF9GKEFsbG9jYXRlLCBBbGxvY2F0ZUNhY2hlZCkKLXsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGFsbG9jYXRpb25TaXplc1tdID0gezQqMTAyNCwgNjQqMTAyNCwgMTAyNCoxMDI0LCAyKjEwMjQqMTAyNH07Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgaGVhcE1hc2sgOiBtX2FsbEhlYXBzKSB7CitURVNUX0YoQWxsb2NhdGUsIEFsbG9jYXRlQ2FjaGVkKSB7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBhbGxvY2F0aW9uU2l6ZXNbXSA9IHs0ICogMTAyNCwgNjQgKiAxMDI0LCAxMDI0ICogMTAyNCwgMiAqIDEwMjQgKiAxMDI0fTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGhlYXAgOiBpb25faGVhcHMpIHsKICAgICAgICAgZm9yIChzaXplX3Qgc2l6ZSA6IGFsbG9jYXRpb25TaXplcykgewotICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJoZWFwICIgPDwgaGVhcE1hc2spOworICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImhlYXA6IiA8PCBoZWFwLm5hbWUgPDwgIjoiIDw8IGhlYXAudHlwZSA8PCAiOiIgPDwgaGVhcC5oZWFwX2lkKTsKICAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAic2l6ZSAiIDw8IHNpemUpOwotICAgICAgICAgICAgaW9uX3VzZXJfaGFuZGxlX3QgaGFuZGxlID0gMDsKLSAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2MobV9pb25GZCwgc2l6ZSwgMCwgaGVhcE1hc2ssIElPTl9GTEFHX0NBQ0hFRCwgJmhhbmRsZSkpOwotICAgICAgICAgICAgQVNTRVJUX1RSVUUoaGFuZGxlICE9IDApOwotICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9mcmVlKG1faW9uRmQsIGhhbmRsZSkpOworICAgICAgICAgICAgaW50IGZkOworICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvY19mZChpb25mZCwgc2l6ZSwgMCwgKDEgPDwgaGVhcC5oZWFwX2lkKSwgSU9OX0ZMQUdfQ0FDSEVELCAmZmQpKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZkICE9IDApOworICAgICAgICAgICAgQVNTRVJUX0VRKGNsb3NlKGZkKSwgMCk7ICAvLyBmcmVlIHRoZSBidWZmZXIKICAgICAgICAgfQogICAgIH0KIH0KIAotVEVTVF9GKEFsbG9jYXRlLCBBbGxvY2F0ZUNhY2hlZE5lZWRzU3luYykKLXsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGFsbG9jYXRpb25TaXplc1tdID0gezQqMTAyNCwgNjQqMTAyNCwgMTAyNCoxMDI0LCAyKjEwMjQqMTAyNH07Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgaGVhcE1hc2sgOiBtX2FsbEhlYXBzKSB7CitURVNUX0YoQWxsb2NhdGUsIEFsbG9jYXRlQ2FjaGVkTmVlZHNTeW5jKSB7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBhbGxvY2F0aW9uU2l6ZXNbXSA9IHs0ICogMTAyNCwgNjQgKiAxMDI0LCAxMDI0ICogMTAyNCwgMiAqIDEwMjQgKiAxMDI0fTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGhlYXAgOiBpb25faGVhcHMpIHsKICAgICAgICAgZm9yIChzaXplX3Qgc2l6ZSA6IGFsbG9jYXRpb25TaXplcykgewotICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJoZWFwICIgPDwgaGVhcE1hc2spOworICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImhlYXA6IiA8PCBoZWFwLm5hbWUgPDwgIjoiIDw8IGhlYXAudHlwZSA8PCAiOiIgPDwgaGVhcC5oZWFwX2lkKTsKICAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAic2l6ZSAiIDw8IHNpemUpOwotICAgICAgICAgICAgaW9uX3VzZXJfaGFuZGxlX3QgaGFuZGxlID0gMDsKLSAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2MobV9pb25GZCwgc2l6ZSwgMCwgaGVhcE1hc2ssIElPTl9GTEFHX0NBQ0hFRF9ORUVEU19TWU5DLCAmaGFuZGxlKSk7Ci0gICAgICAgICAgICBBU1NFUlRfVFJVRShoYW5kbGUgIT0gMCk7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2ZyZWUobV9pb25GZCwgaGFuZGxlKSk7CisgICAgICAgICAgICBpbnQgZmQ7CisgICAgICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jX2ZkKGlvbmZkLCBzaXplLCAwLCAoMSA8PCBoZWFwLmhlYXBfaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT05fRkxBR19DQUNIRURfTkVFRFNfU1lOQywgJmZkKSk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmZCAhPSAwKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShjbG9zZShmZCksIDApOyAgLy8gZnJlZSB0aGUgYnVmZmVyCiAgICAgICAgIH0KICAgICB9CiB9CiAKLVRFU1RfRihBbGxvY2F0ZSwgUmVwZWF0ZWRBbGxvY2F0ZSkKLXsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGFsbG9jYXRpb25TaXplc1tdID0gezQqMTAyNCwgNjQqMTAyNCwgMTAyNCoxMDI0LCAyKjEwMjQqMTAyNH07Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgaGVhcE1hc2sgOiBtX2FsbEhlYXBzKSB7CitURVNUX0YoQWxsb2NhdGUsIFJlcGVhdGVkQWxsb2NhdGUpIHsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGFsbG9jYXRpb25TaXplc1tdID0gezQgKiAxMDI0LCA2NCAqIDEwMjQsIDEwMjQgKiAxMDI0LCAyICogMTAyNCAqIDEwMjR9OworICAgIGZvciAoY29uc3QgYXV0byYgaGVhcCA6IGlvbl9oZWFwcykgewogICAgICAgICBmb3IgKHNpemVfdCBzaXplIDogYWxsb2NhdGlvblNpemVzKSB7Ci0gICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgImhlYXAgIiA8PCBoZWFwTWFzayk7CisgICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiaGVhcDoiIDw8IGhlYXAubmFtZSA8PCAiOiIgPDwgaGVhcC50eXBlIDw8ICI6IiA8PCBoZWFwLmhlYXBfaWQpOwogICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJzaXplICIgPDwgc2l6ZSk7Ci0gICAgICAgICAgICBpb25fdXNlcl9oYW5kbGVfdCBoYW5kbGUgPSAwOworICAgICAgICAgICAgaW50IGZkOwogCiAgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IDEwMjQ7IGkrKykgewogICAgICAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAiaXRlcmF0aW9uICIgPDwgaSk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvYyhtX2lvbkZkLCBzaXplLCAwLCBoZWFwTWFzaywgMCwgJmhhbmRsZSkpOwotICAgICAgICAgICAgICAgIEFTU0VSVF9UUlVFKGhhbmRsZSAhPSAwKTsKLSAgICAgICAgICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2ZyZWUobV9pb25GZCwgaGFuZGxlKSk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvY19mZChpb25mZCwgc2l6ZSwgMCwgKDEgPDwgaGVhcC5oZWFwX2lkKSwgMCwgJmZkKSk7CisgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmQgIT0gMCk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKGNsb3NlKGZkKSwgMCk7ICAvLyBmcmVlIHRoZSBidWZmZXIKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KIAotVEVTVF9GKEFsbG9jYXRlLCBaZXJvZWQpCi17CitURVNUX0YoQWxsb2NhdGUsIExhcmdlKSB7CisgICAgZm9yIChjb25zdCBhdXRvJiBoZWFwIDogaW9uX2hlYXBzKSB7CisgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKQorICAgICAgICAgICAgICAgICAgICAgPDwgImhlYXA6IiA8PCBoZWFwLm5hbWUgPDwgIjoiIDw8IGhlYXAudHlwZSA8PCAiOiIgPDwgaGVhcC5oZWFwX2lkKTsKKyAgICAgICAgaW50IGZkOworICAgICAgICBBU1NFUlRfRVEoLUVOT01FTSwKKyAgICAgICAgICAgICAgICAgIGlvbl9hbGxvY19mZChpb25mZCwgM1VMICogMTAyNCAqIDEwMjQgKiAxMDI0LCAwLCAoMSA8PCBoZWFwLmhlYXBfaWQpLCAwLCAmZmQpKTsKKyAgICB9Cit9CisKKy8vIE1ha2Ugc3VyZSBhbGwgaGVhcHMgYWx3YXlzIHJldHVybiB6ZXJvZWQgcGFnZXMKK1RFU1RfRihBbGxvY2F0ZSwgWmVyb2VkKSB7CiAgICAgYXV0byB6ZXJvZXNfcHRyID0gc3RkOjptYWtlX3VuaXF1ZTxjaGFyW10+KDQwOTYpOwogCi0gICAgZm9yICh1bnNpZ25lZCBpbnQgaGVhcE1hc2sgOiBtX2FsbEhlYXBzKSB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAiaGVhcCAiIDw8IGhlYXBNYXNrKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGhlYXAgOiBpb25faGVhcHMpIHsKKyAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpCisgICAgICAgICAgICAgICAgICAgICA8PCAiaGVhcDoiIDw8IGhlYXAubmFtZSA8PCAiOiIgPDwgaGVhcC50eXBlIDw8ICI6IiA8PCBoZWFwLmhlYXBfaWQpOwogICAgICAgICBpbnQgZmRzWzE2XTsKICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CiAgICAgICAgICAgICBpbnQgbWFwX2ZkID0gLTE7CiAKLSAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2NfZmQobV9pb25GZCwgNDA5NiwgMCwgaGVhcE1hc2ssIDAsICZtYXBfZmQpKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2NfZmQoaW9uZmQsIDQwOTYsIDAsICgxIDw8IGhlYXAuaGVhcF9pZCksIDAsICZtYXBfZmQpKTsKICAgICAgICAgICAgIEFTU0VSVF9HRShtYXBfZmQsIDApOwogCi0gICAgICAgICAgICB2b2lkICpwdHIgPSBOVUxMOworICAgICAgICAgICAgdm9pZCogcHRyID0gTlVMTDsKICAgICAgICAgICAgIHB0ciA9IG1tYXAoTlVMTCwgNDA5NiwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgbWFwX2ZkLCAwKTsKICAgICAgICAgICAgIEFTU0VSVF9UUlVFKHB0ciAhPSBOVUxMKTsKIApAQCAtMTE2LDEzICsxMjcsMTMgQEAKICAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBjbG9zZShmZHNbaV0pKTsKICAgICAgICAgfQogCi0gICAgICAgIGludCBuZXdJb25GZCA9IGlvbl9vcGVuKCk7CisgICAgICAgIGludCBuZXdfaW9uZmQgPSBpb25fb3BlbigpOwogICAgICAgICBpbnQgbWFwX2ZkID0gLTE7CiAKLSAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvY19mZChuZXdJb25GZCwgNDA5NiwgMCwgaGVhcE1hc2ssIDAsICZtYXBfZmQpKTsKKyAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvY19mZChuZXdfaW9uZmQsIDQwOTYsIDAsICgxIDw8IGhlYXAuaGVhcF9pZCksIDAsICZtYXBfZmQpKTsKICAgICAgICAgQVNTRVJUX0dFKG1hcF9mZCwgMCk7CiAKLSAgICAgICAgdm9pZCAqcHRyID0gTlVMTDsKKyAgICAgICAgdm9pZCogcHRyID0gTlVMTDsKICAgICAgICAgcHRyID0gbW1hcChOVUxMLCA0MDk2LCBQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIG1hcF9mZCwgMCk7CiAgICAgICAgIEFTU0VSVF9UUlVFKHB0ciAhPSBOVUxMKTsKIApAQCAtMTMwLDE0ICsxNDEsNiBAQAogCiAgICAgICAgIEFTU0VSVF9FUSgwLCBtdW5tYXAocHRyLCA0MDk2KSk7CiAgICAgICAgIEFTU0VSVF9FUSgwLCBjbG9zZShtYXBfZmQpKTsKLSAgICB9Ci19Ci0KLVRFU1RfRihBbGxvY2F0ZSwgTGFyZ2UpCi17Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgaGVhcE1hc2sgOiBtX2FsbEhlYXBzKSB7Ci0gICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgImhlYXAgIiA8PCBoZWFwTWFzayk7Ci0gICAgICAgIGlvbl91c2VyX2hhbmRsZV90IGhhbmRsZSA9IDA7Ci0gICAgICAgIEFTU0VSVF9FUSgtRU5PTUVNLCBpb25fYWxsb2MobV9pb25GZCwgM1VMKjEwMjQqMTAyNCoxMDI0LCAwLCBoZWFwTWFzaywgMCwgJmhhbmRsZSkpOworICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2Nsb3NlKG5ld19pb25mZCkpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYmlvbi90ZXN0cy9kZXZpY2VfdGVzdC5jcHAgYi9saWJpb24vdGVzdHMvZGV2aWNlX3Rlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjNmN2I2Li4wMDAwMDAwCi0tLSBhL2xpYmlvbi90ZXN0cy9kZXZpY2VfdGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxmY250bC5oPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpbmNsdWRlIDxzeXMvbW1hbi5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxsaW51eC9pb25fdGVzdC5oPgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgPGlvbi9pb24uaD4KLQotI2luY2x1ZGUgImlvbl90ZXN0X2ZpeHR1cmUuaCIKLQotI2RlZmluZSBBTElHTih4LHkpICgoKHgpICsgKCh5KSAtIDEpKSAmIH4oKHkpIC0gMSkpCi0KLWNsYXNzIERldmljZSA6IHB1YmxpYyBJb25BbGxIZWFwc1Rlc3QgewotIHB1YmxpYzoKLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKTsKLSAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKTsKLSAgICBpbnQgbV9kZXZpY2VGZDsKLSAgICB2b2lkIHJlYWRETUEoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBzaXplKTsKLSAgICB2b2lkIHdyaXRlRE1BKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSk7Ci0gICAgdm9pZCByZWFkS2VybmVsKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSk7Ci0gICAgdm9pZCB3cml0ZUtlcm5lbChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpOwotICAgIHZvaWQgYmxvd0NhY2hlKCk7Ci0gICAgdm9pZCBkaXJ0eUNhY2hlKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpOwotfTsKLQotdm9pZCBEZXZpY2U6OlNldFVwKCkKLXsKLSAgICBJb25BbGxIZWFwc1Rlc3Q6OlNldFVwKCk7Ci0gICAgbV9kZXZpY2VGZCA9IG9wZW4oIi9kZXYvaW9uLXRlc3QiLCBPX1JET05MWSk7Ci0gICAgQVNTRVJUX0dFKG1fZGV2aWNlRmQsIDApOwotfQotCi12b2lkIERldmljZTo6VGVhckRvd24oKQotewotICAgIEFTU0VSVF9FUSgwLCBjbG9zZShtX2RldmljZUZkKSk7Ci0gICAgSW9uQWxsSGVhcHNUZXN0OjpUZWFyRG93bigpOwotfQotCi12b2lkIERldmljZTo6cmVhZERNQShpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IHNpemUpCi17Ci0gICAgQVNTRVJUX0VRKDAsIGlvY3RsKG1fZGV2aWNlRmQsIElPTl9JT0NfVEVTVF9TRVRfRkQsIGZkKSk7Ci0gICAgc3RydWN0IGlvbl90ZXN0X3J3X2RhdGEgaW9uX3Rlc3RfcndfZGF0YSA9IHsKLSAgICAgICAgICAgIC5wdHIgPSAodWludDY0X3QpYnVmLAotICAgICAgICAgICAgLm9mZnNldCA9IDAsCi0gICAgICAgICAgICAuc2l6ZSA9IHNpemUsCi0gICAgICAgICAgICAud3JpdGUgPSAwLAotICAgIH07Ci0KLSAgICBBU1NFUlRfRVEoMCwgaW9jdGwobV9kZXZpY2VGZCwgSU9OX0lPQ19URVNUX0RNQV9NQVBQSU5HLCAmaW9uX3Rlc3RfcndfZGF0YSkpOwotICAgIEFTU0VSVF9FUSgwLCBpb2N0bChtX2RldmljZUZkLCBJT05fSU9DX1RFU1RfU0VUX0ZELCAtMSkpOwotfQotCi12b2lkIERldmljZTo6d3JpdGVETUEoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBzaXplKQotewotICAgIEFTU0VSVF9FUSgwLCBpb2N0bChtX2RldmljZUZkLCBJT05fSU9DX1RFU1RfU0VUX0ZELCBmZCkpOwotICAgIHN0cnVjdCBpb25fdGVzdF9yd19kYXRhIGlvbl90ZXN0X3J3X2RhdGEgPSB7Ci0gICAgICAgICAgICAucHRyID0gKHVpbnQ2NF90KWJ1ZiwKLSAgICAgICAgICAgIC5vZmZzZXQgPSAwLAotICAgICAgICAgICAgLnNpemUgPSBzaXplLAotICAgICAgICAgICAgLndyaXRlID0gMSwKLSAgICB9OwotCi0gICAgQVNTRVJUX0VRKDAsIGlvY3RsKG1fZGV2aWNlRmQsIElPTl9JT0NfVEVTVF9ETUFfTUFQUElORywgJmlvbl90ZXN0X3J3X2RhdGEpKTsKLSAgICBBU1NFUlRfRVEoMCwgaW9jdGwobV9kZXZpY2VGZCwgSU9OX0lPQ19URVNUX1NFVF9GRCwgLTEpKTsKLX0KLQotdm9pZCBEZXZpY2U6OnJlYWRLZXJuZWwoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBzaXplKQotewotICAgIEFTU0VSVF9FUSgwLCBpb2N0bChtX2RldmljZUZkLCBJT05fSU9DX1RFU1RfU0VUX0ZELCBmZCkpOwotICAgIHN0cnVjdCBpb25fdGVzdF9yd19kYXRhIGlvbl90ZXN0X3J3X2RhdGEgPSB7Ci0gICAgICAgICAgICAucHRyID0gKHVpbnQ2NF90KWJ1ZiwKLSAgICAgICAgICAgIC5vZmZzZXQgPSAwLAotICAgICAgICAgICAgLnNpemUgPSBzaXplLAotICAgICAgICAgICAgLndyaXRlID0gMCwKLSAgICB9OwotCi0gICAgQVNTRVJUX0VRKDAsIGlvY3RsKG1fZGV2aWNlRmQsIElPTl9JT0NfVEVTVF9LRVJORUxfTUFQUElORywgJmlvbl90ZXN0X3J3X2RhdGEpKTsKLSAgICBBU1NFUlRfRVEoMCwgaW9jdGwobV9kZXZpY2VGZCwgSU9OX0lPQ19URVNUX1NFVF9GRCwgLTEpKTsKLX0KLQotdm9pZCBEZXZpY2U6OndyaXRlS2VybmVsKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSkKLXsKLSAgICBBU1NFUlRfRVEoMCwgaW9jdGwobV9kZXZpY2VGZCwgSU9OX0lPQ19URVNUX1NFVF9GRCwgZmQpKTsKLSAgICBzdHJ1Y3QgaW9uX3Rlc3RfcndfZGF0YSBpb25fdGVzdF9yd19kYXRhID0gewotICAgICAgICAgICAgLnB0ciA9ICh1aW50NjRfdClidWYsCi0gICAgICAgICAgICAub2Zmc2V0ID0gMCwKLSAgICAgICAgICAgIC5zaXplID0gc2l6ZSwKLSAgICAgICAgICAgIC53cml0ZSA9IDEsCi0gICAgfTsKLQotICAgIEFTU0VSVF9FUSgwLCBpb2N0bChtX2RldmljZUZkLCBJT05fSU9DX1RFU1RfS0VSTkVMX01BUFBJTkcsICZpb25fdGVzdF9yd19kYXRhKSk7Ci0gICAgQVNTRVJUX0VRKDAsIGlvY3RsKG1fZGV2aWNlRmQsIElPTl9JT0NfVEVTVF9TRVRfRkQsIC0xKSk7Ci19Ci0KLXZvaWQgRGV2aWNlOjpibG93Q2FjaGUoKQotewotICAgIGNvbnN0IHNpemVfdCBiaWdnZXJfdGhhbl9jYWNoZSA9IDgqMTAyNCoxMDI0OwotICAgIHZvaWQgKmJ1ZjEgPSBtYWxsb2MoYmlnZ2VyX3RoYW5fY2FjaGUpOwotICAgIHZvaWQgKmJ1ZjIgPSBtYWxsb2MoYmlnZ2VyX3RoYW5fY2FjaGUpOwotICAgIG1lbXNldChidWYxLCAweGFhLCBiaWdnZXJfdGhhbl9jYWNoZSk7Ci0gICAgbWVtY3B5KGJ1ZjIsIGJ1ZjEsIGJpZ2dlcl90aGFuX2NhY2hlKTsKLSAgICBmcmVlKGJ1ZjEpOwotICAgIGZyZWUoYnVmMik7Ci19Ci0KLXZvaWQgRGV2aWNlOjpkaXJ0eUNhY2hlKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpCi17Ci0gICAgLyogdHJ5IHRvIGRpcnR5IGNhY2hlIGxpbmVzICovCi0gICAgZm9yIChzaXplX3QgaSA9IHNpemUtMTsgaSA+IDA7IGktLSkgewotICAgICAgICAoKHZvbGF0aWxlIGNoYXIgKilwdHIpW2ldOwotICAgICAgICAoKGNoYXIgKilwdHIpW2ldID0gaTsKLSAgICB9Ci19Ci0KLVRFU1RfRihEZXZpY2UsIEtlcm5lbFJlYWRDYWNoZWQpCi17Ci0gICAgYXV0byBhbGxvY19wdHIgPSBzdGQ6Om1ha2VfdW5pcXVlPGNoYXJbXT4oODE5MiArIDEwMjQpOwotICAgIHZvaWQgKmJ1ZiA9ICh2b2lkICopKEFMSUdOKCh1bnNpZ25lZCBsb25nKWFsbG9jX3B0ci5nZXQoKSwgNDA5NikgKyAxMDI0KTsKLQotICAgIGZvciAodW5zaWduZWQgaW50IGhlYXBNYXNrIDogbV9hbGxIZWFwcykgewotICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgImhlYXAgIiA8PCBoZWFwTWFzayk7Ci0gICAgICAgIGludCBtYXBfZmQgPSAtMTsKLSAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzID0gSU9OX0ZMQUdfQ0FDSEVEOwotCi0gICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2NfZmQobV9pb25GZCwgNDA5NiwgMCwgaGVhcE1hc2ssIGZsYWdzLCAmbWFwX2ZkKSk7Ci0gICAgICAgIEFTU0VSVF9HRShtYXBfZmQsIDApOwotCi0gICAgICAgIHZvaWQgKnB0cjsKLSAgICAgICAgcHRyID0gbW1hcChOVUxMLCA0MDk2LCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBtYXBfZmQsIDApOwotICAgICAgICBBU1NFUlRfVFJVRShwdHIgIT0gTlVMTCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDk2OyBpKyspCi0gICAgICAgICAgICAoKGNoYXIgKilwdHIpW2ldID0gaTsKLQotICAgICAgICAoKGNoYXIqKWJ1ZilbNDA5Nl0gPSAweDEyOwotICAgICAgICByZWFkS2VybmVsKG1hcF9mZCwgYnVmLCA0MDk2KTsKLSAgICAgICAgQVNTRVJUX0VRKCgoY2hhciopYnVmKVs0MDk2XSwgMHgxMik7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDk2OyBpKyspCi0gICAgICAgICAgICBBU1NFUlRfRVEoKGNoYXIpaSwgKChjaGFyICopYnVmKVtpXSk7Ci0KLSAgICAgICAgQVNTRVJUX0VRKDAsIG11bm1hcChwdHIsIDQwOTYpKTsKLSAgICAgICAgQVNTRVJUX0VRKDAsIGNsb3NlKG1hcF9mZCkpOwotICAgIH0KLX0KLQotVEVTVF9GKERldmljZSwgS2VybmVsV3JpdGVDYWNoZWQpCi17Ci0gICAgYXV0byBhbGxvY19wdHIgPSBzdGQ6Om1ha2VfdW5pcXVlPGNoYXJbXT4oODE5MiArIDEwMjQpOwotICAgIHZvaWQgKmJ1ZiA9ICh2b2lkICopKEFMSUdOKCh1bnNpZ25lZCBsb25nKWFsbG9jX3B0ci5nZXQoKSwgNDA5NikgKyAxMDI0KTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDA5NjsgaSsrKQotICAgICAgICAoKGNoYXIgKilidWYpW2ldID0gaTsKLQotICAgIGZvciAodW5zaWduZWQgaW50IGhlYXBNYXNrIDogbV9hbGxIZWFwcykgewotICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgImhlYXAgIiA8PCBoZWFwTWFzayk7Ci0gICAgICAgIGludCBtYXBfZmQgPSAtMTsKLSAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzID0gSU9OX0ZMQUdfQ0FDSEVEOwotCi0gICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2NfZmQobV9pb25GZCwgNDA5NiwgMCwgaGVhcE1hc2ssIGZsYWdzLCAmbWFwX2ZkKSk7Ci0gICAgICAgIEFTU0VSVF9HRShtYXBfZmQsIDApOwotCi0gICAgICAgIHZvaWQgKnB0cjsKLSAgICAgICAgcHRyID0gbW1hcChOVUxMLCA0MDk2LCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBtYXBfZmQsIDApOwotICAgICAgICBBU1NFUlRfVFJVRShwdHIgIT0gTlVMTCk7Ci0KLSAgICAgICAgZGlydHlDYWNoZShwdHIsIDQwOTYpOwotCi0gICAgICAgIHdyaXRlS2VybmVsKG1hcF9mZCwgYnVmLCA0MDk2KTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQwOTY7IGkrKykKLSAgICAgICAgICAgIEFTU0VSVF9FUSgoY2hhcilpLCAoKGNoYXIgKilwdHIpW2ldKSA8PCBpOwotCi0gICAgICAgIEFTU0VSVF9FUSgwLCBtdW5tYXAocHRyLCA0MDk2KSk7Ci0gICAgICAgIEFTU0VSVF9FUSgwLCBjbG9zZShtYXBfZmQpKTsKLSAgICB9Ci19Ci0KLVRFU1RfRihEZXZpY2UsIERNQVJlYWRDYWNoZWQpCi17Ci0gICAgYXV0byBhbGxvY19wdHIgPSBzdGQ6Om1ha2VfdW5pcXVlPGNoYXJbXT4oODE5MiArIDEwMjQpOwotICAgIHZvaWQgKmJ1ZiA9ICh2b2lkICopKEFMSUdOKCh1bnNpZ25lZCBsb25nKWFsbG9jX3B0ci5nZXQoKSwgNDA5NikgKyAxMDI0KTsKLQotICAgIGZvciAodW5zaWduZWQgaW50IGhlYXBNYXNrIDogbV9hbGxIZWFwcykgewotICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgImhlYXAgIiA8PCBoZWFwTWFzayk7Ci0gICAgICAgIGludCBtYXBfZmQgPSAtMTsKLSAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzID0gSU9OX0ZMQUdfQ0FDSEVEOwotCi0gICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2NfZmQobV9pb25GZCwgNDA5NiwgMCwgaGVhcE1hc2ssIGZsYWdzLCAmbWFwX2ZkKSk7Ci0gICAgICAgIEFTU0VSVF9HRShtYXBfZmQsIDApOwotCi0gICAgICAgIHZvaWQgKnB0cjsKLSAgICAgICAgcHRyID0gbW1hcChOVUxMLCA0MDk2LCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBtYXBfZmQsIDApOwotICAgICAgICBBU1NFUlRfVFJVRShwdHIgIT0gTlVMTCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDk2OyBpKyspCi0gICAgICAgICAgICAoKGNoYXIgKilwdHIpW2ldID0gaTsKLQotICAgICAgICByZWFkRE1BKG1hcF9mZCwgYnVmLCA0MDk2KTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQwOTY7IGkrKykKLSAgICAgICAgICAgIEFTU0VSVF9FUSgoY2hhcilpLCAoKGNoYXIgKilidWYpW2ldKTsKLQotICAgICAgICBBU1NFUlRfRVEoMCwgbXVubWFwKHB0ciwgNDA5NikpOwotICAgICAgICBBU1NFUlRfRVEoMCwgY2xvc2UobWFwX2ZkKSk7Ci0gICAgfQotfQotCi1URVNUX0YoRGV2aWNlLCBETUFXcml0ZUNhY2hlZCkKLXsKLSAgICBhdXRvIGFsbG9jX3B0ciA9IHN0ZDo6bWFrZV91bmlxdWU8Y2hhcltdPig4MTkyICsgMTAyNCk7Ci0gICAgdm9pZCAqYnVmID0gKHZvaWQgKikoQUxJR04oKHVuc2lnbmVkIGxvbmcpYWxsb2NfcHRyLmdldCgpLCA0MDk2KSArIDEwMjQpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDk2OyBpKyspCi0gICAgICAgICgoY2hhciAqKWJ1ZilbaV0gPSBpOwotCi0gICAgZm9yICh1bnNpZ25lZCBpbnQgaGVhcE1hc2sgOiBtX2FsbEhlYXBzKSB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAiaGVhcCAiIDw8IGhlYXBNYXNrKTsKLSAgICAgICAgaW50IG1hcF9mZCA9IC0xOwotICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MgPSBJT05fRkxBR19DQUNIRUQ7Ci0KLSAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvY19mZChtX2lvbkZkLCA0MDk2LCAwLCBoZWFwTWFzaywgZmxhZ3MsICZtYXBfZmQpKTsKLSAgICAgICAgQVNTRVJUX0dFKG1hcF9mZCwgMCk7Ci0KLSAgICAgICAgdm9pZCAqcHRyOwotICAgICAgICBwdHIgPSBtbWFwKE5VTEwsIDQwOTYsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIG1hcF9mZCwgMCk7Ci0gICAgICAgIEFTU0VSVF9UUlVFKHB0ciAhPSBOVUxMKTsKLQotICAgICAgICBkaXJ0eUNhY2hlKHB0ciwgNDA5Nik7Ci0KLSAgICAgICAgd3JpdGVETUEobWFwX2ZkLCBidWYsIDQwOTYpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDA5NjsgaSsrKQotICAgICAgICAgICAgQVNTRVJUX0VRKChjaGFyKWksICgoY2hhciAqKXB0cilbaV0pIDw8IGk7Ci0KLSAgICAgICAgQVNTRVJUX0VRKDAsIG11bm1hcChwdHIsIDQwOTYpKTsKLSAgICAgICAgQVNTRVJUX0VRKDAsIGNsb3NlKG1hcF9mZCkpOwotICAgIH0KLX0KLQotVEVTVF9GKERldmljZSwgS2VybmVsUmVhZENhY2hlZE5lZWRzU3luYykKLXsKLSAgICBhdXRvIGFsbG9jX3B0ciA9IHN0ZDo6bWFrZV91bmlxdWU8Y2hhcltdPig4MTkyICsgMTAyNCk7Ci0gICAgdm9pZCAqYnVmID0gKHZvaWQgKikoQUxJR04oKHVuc2lnbmVkIGxvbmcpYWxsb2NfcHRyLmdldCgpLCA0MDk2KSArIDEwMjQpOwotCi0gICAgZm9yICh1bnNpZ25lZCBpbnQgaGVhcE1hc2sgOiBtX2FsbEhlYXBzKSB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAiaGVhcCAiIDw8IGhlYXBNYXNrKTsKLSAgICAgICAgaW50IG1hcF9mZCA9IC0xOwotICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MgPSBJT05fRkxBR19DQUNIRUQgfCBJT05fRkxBR19DQUNIRURfTkVFRFNfU1lOQzsKLQotICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jX2ZkKG1faW9uRmQsIDQwOTYsIDAsIGhlYXBNYXNrLCBmbGFncywgJm1hcF9mZCkpOwotICAgICAgICBBU1NFUlRfR0UobWFwX2ZkLCAwKTsKLQotICAgICAgICB2b2lkICpwdHI7Ci0gICAgICAgIHB0ciA9IG1tYXAoTlVMTCwgNDA5NiwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgbWFwX2ZkLCAwKTsKLSAgICAgICAgQVNTRVJUX1RSVUUocHRyICE9IE5VTEwpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDA5NjsgaSsrKQotICAgICAgICAgICAgKChjaGFyICopcHRyKVtpXSA9IGk7Ci0KLSAgICAgICAgKChjaGFyKilidWYpWzQwOTZdID0gMHgxMjsKLSAgICAgICAgcmVhZEtlcm5lbChtYXBfZmQsIGJ1ZiwgNDA5Nik7Ci0gICAgICAgIEFTU0VSVF9FUSgoKGNoYXIqKWJ1ZilbNDA5Nl0sIDB4MTIpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDA5NjsgaSsrKQotICAgICAgICAgICAgQVNTRVJUX0VRKChjaGFyKWksICgoY2hhciAqKWJ1ZilbaV0pOwotCi0gICAgICAgIEFTU0VSVF9FUSgwLCBtdW5tYXAocHRyLCA0MDk2KSk7Ci0gICAgICAgIEFTU0VSVF9FUSgwLCBjbG9zZShtYXBfZmQpKTsKLSAgICB9Ci19Ci0KLVRFU1RfRihEZXZpY2UsIEtlcm5lbFdyaXRlQ2FjaGVkTmVlZHNTeW5jKQotewotICAgIGF1dG8gYWxsb2NfcHRyID0gc3RkOjptYWtlX3VuaXF1ZTxjaGFyW10+KDgxOTIgKyAxMDI0KTsKLSAgICB2b2lkICpidWYgPSAodm9pZCAqKShBTElHTigodW5zaWduZWQgbG9uZylhbGxvY19wdHIuZ2V0KCksIDQwOTYpICsgMTAyNCk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDQwOTY7IGkrKykKLSAgICAgICAgKChjaGFyICopYnVmKVtpXSA9IGk7Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGludCBoZWFwTWFzayA6IG1fYWxsSGVhcHMpIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJoZWFwICIgPDwgaGVhcE1hc2spOwotICAgICAgICBpbnQgbWFwX2ZkID0gLTE7Ci0gICAgICAgIHVuc2lnbmVkIGludCBmbGFncyA9IElPTl9GTEFHX0NBQ0hFRCB8IElPTl9GTEFHX0NBQ0hFRF9ORUVEU19TWU5DOwotCi0gICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2NfZmQobV9pb25GZCwgNDA5NiwgMCwgaGVhcE1hc2ssIGZsYWdzLCAmbWFwX2ZkKSk7Ci0gICAgICAgIEFTU0VSVF9HRShtYXBfZmQsIDApOwotCi0gICAgICAgIHZvaWQgKnB0cjsKLSAgICAgICAgcHRyID0gbW1hcChOVUxMLCA0MDk2LCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBtYXBfZmQsIDApOwotICAgICAgICBBU1NFUlRfVFJVRShwdHIgIT0gTlVMTCk7Ci0KLSAgICAgICAgZGlydHlDYWNoZShwdHIsIDQwOTYpOwotCi0gICAgICAgIHdyaXRlS2VybmVsKG1hcF9mZCwgYnVmLCA0MDk2KTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQwOTY7IGkrKykKLSAgICAgICAgICAgIEFTU0VSVF9FUSgoY2hhcilpLCAoKGNoYXIgKilwdHIpW2ldKSA8PCBpOwotCi0gICAgICAgIEFTU0VSVF9FUSgwLCBtdW5tYXAocHRyLCA0MDk2KSk7Ci0gICAgICAgIEFTU0VSVF9FUSgwLCBjbG9zZShtYXBfZmQpKTsKLSAgICB9Ci19Ci0KLVRFU1RfRihEZXZpY2UsIERNQVJlYWRDYWNoZWROZWVkc1N5bmMpCi17Ci0gICAgYXV0byBhbGxvY19wdHIgPSBzdGQ6Om1ha2VfdW5pcXVlPGNoYXJbXT4oODE5MiArIDEwMjQpOwotICAgIHZvaWQgKmJ1ZiA9ICh2b2lkICopKEFMSUdOKCh1bnNpZ25lZCBsb25nKWFsbG9jX3B0ci5nZXQoKSwgNDA5NikgKyAxMDI0KTsKLQotICAgIGZvciAodW5zaWduZWQgaW50IGhlYXBNYXNrIDogbV9hbGxIZWFwcykgewotICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgImhlYXAgIiA8PCBoZWFwTWFzayk7Ci0gICAgICAgIGludCBtYXBfZmQgPSAtMTsKLSAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzID0gSU9OX0ZMQUdfQ0FDSEVEIHwgSU9OX0ZMQUdfQ0FDSEVEX05FRURTX1NZTkM7Ci0KLSAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvY19mZChtX2lvbkZkLCA0MDk2LCAwLCBoZWFwTWFzaywgZmxhZ3MsICZtYXBfZmQpKTsKLSAgICAgICAgQVNTRVJUX0dFKG1hcF9mZCwgMCk7Ci0KLSAgICAgICAgdm9pZCAqcHRyOwotICAgICAgICBwdHIgPSBtbWFwKE5VTEwsIDQwOTYsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIG1hcF9mZCwgMCk7Ci0gICAgICAgIEFTU0VSVF9UUlVFKHB0ciAhPSBOVUxMKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQwOTY7IGkrKykKLSAgICAgICAgICAgICgoY2hhciAqKXB0cilbaV0gPSBpOwotCi0gICAgICAgIGlvbl9zeW5jX2ZkKG1faW9uRmQsIG1hcF9mZCk7Ci0KLSAgICAgICAgcmVhZERNQShtYXBfZmQsIGJ1ZiwgNDA5Nik7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDk2OyBpKyspCi0gICAgICAgICAgICBBU1NFUlRfRVEoKGNoYXIpaSwgKChjaGFyICopYnVmKVtpXSk7Ci0KLSAgICAgICAgQVNTRVJUX0VRKDAsIG11bm1hcChwdHIsIDQwOTYpKTsKLSAgICAgICAgQVNTRVJUX0VRKDAsIGNsb3NlKG1hcF9mZCkpOwotICAgIH0KLX0KLQotVEVTVF9GKERldmljZSwgRE1BV3JpdGVDYWNoZWROZWVkc1N5bmMpCi17Ci0gICAgYXV0byBhbGxvY19wdHIgPSBzdGQ6Om1ha2VfdW5pcXVlPGNoYXJbXT4oODE5MiArIDEwMjQpOwotICAgIHZvaWQgKmJ1ZiA9ICh2b2lkICopKEFMSUdOKCh1bnNpZ25lZCBsb25nKWFsbG9jX3B0ci5nZXQoKSwgNDA5NikgKyAxMDI0KTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDA5NjsgaSsrKQotICAgICAgICAoKGNoYXIgKilidWYpW2ldID0gaTsKLQotICAgIGZvciAodW5zaWduZWQgaW50IGhlYXBNYXNrIDogbV9hbGxIZWFwcykgewotICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgImhlYXAgIiA8PCBoZWFwTWFzayk7Ci0gICAgICAgIGludCBtYXBfZmQgPSAtMTsKLSAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzID0gSU9OX0ZMQUdfQ0FDSEVEIHwgSU9OX0ZMQUdfQ0FDSEVEX05FRURTX1NZTkM7Ci0KLSAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvY19mZChtX2lvbkZkLCA0MDk2LCAwLCBoZWFwTWFzaywgZmxhZ3MsICZtYXBfZmQpKTsKLSAgICAgICAgQVNTRVJUX0dFKG1hcF9mZCwgMCk7Ci0KLSAgICAgICAgdm9pZCAqcHRyOwotICAgICAgICBwdHIgPSBtbWFwKE5VTEwsIDQwOTYsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIG1hcF9mZCwgMCk7Ci0gICAgICAgIEFTU0VSVF9UUlVFKHB0ciAhPSBOVUxMKTsKLQotICAgICAgICBkaXJ0eUNhY2hlKHB0ciwgNDA5Nik7Ci0KLSAgICAgICAgd3JpdGVETUEobWFwX2ZkLCBidWYsIDQwOTYpOwotCi0gICAgICAgIGlvbl9zeW5jX2ZkKG1faW9uRmQsIG1hcF9mZCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDk2OyBpKyspCi0gICAgICAgICAgICBBU1NFUlRfRVEoKGNoYXIpaSwgKChjaGFyICopcHRyKVtpXSkgPDwgaTsKLQotICAgICAgICBBU1NFUlRfRVEoMCwgbXVubWFwKHB0ciwgNDA5NikpOwotICAgICAgICBBU1NFUlRfRVEoMCwgY2xvc2UobWFwX2ZkKSk7Ci0gICAgfQotfQotVEVTVF9GKERldmljZSwgS2VybmVsUmVhZCkKLXsKLSAgICBhdXRvIGFsbG9jX3B0ciA9IHN0ZDo6bWFrZV91bmlxdWU8Y2hhcltdPig4MTkyICsgMTAyNCk7Ci0gICAgdm9pZCAqYnVmID0gKHZvaWQgKikoQUxJR04oKHVuc2lnbmVkIGxvbmcpYWxsb2NfcHRyLmdldCgpLCA0MDk2KSArIDEwMjQpOwotCi0gICAgZm9yICh1bnNpZ25lZCBpbnQgaGVhcE1hc2sgOiBtX2FsbEhlYXBzKSB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAiaGVhcCAiIDw8IGhlYXBNYXNrKTsKLSAgICAgICAgaW50IG1hcF9mZCA9IC0xOwotICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MgPSAwOwotCi0gICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2NfZmQobV9pb25GZCwgNDA5NiwgMCwgaGVhcE1hc2ssIGZsYWdzLCAmbWFwX2ZkKSk7Ci0gICAgICAgIEFTU0VSVF9HRShtYXBfZmQsIDApOwotCi0gICAgICAgIHZvaWQgKnB0cjsKLSAgICAgICAgcHRyID0gbW1hcChOVUxMLCA0MDk2LCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBtYXBfZmQsIDApOwotICAgICAgICBBU1NFUlRfVFJVRShwdHIgIT0gTlVMTCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDk2OyBpKyspCi0gICAgICAgICAgICAoKGNoYXIgKilwdHIpW2ldID0gaTsKLQotICAgICAgICAoKGNoYXIqKWJ1ZilbNDA5Nl0gPSAweDEyOwotICAgICAgICByZWFkS2VybmVsKG1hcF9mZCwgYnVmLCA0MDk2KTsKLSAgICAgICAgQVNTRVJUX0VRKCgoY2hhciopYnVmKVs0MDk2XSwgMHgxMik7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDk2OyBpKyspCi0gICAgICAgICAgICBBU1NFUlRfRVEoKGNoYXIpaSwgKChjaGFyICopYnVmKVtpXSk7Ci0KLSAgICAgICAgQVNTRVJUX0VRKDAsIG11bm1hcChwdHIsIDQwOTYpKTsKLSAgICAgICAgQVNTRVJUX0VRKDAsIGNsb3NlKG1hcF9mZCkpOwotICAgIH0KLX0KLQotVEVTVF9GKERldmljZSwgS2VybmVsV3JpdGUpCi17Ci0gICAgYXV0byBhbGxvY19wdHIgPSBzdGQ6Om1ha2VfdW5pcXVlPGNoYXJbXT4oODE5MiArIDEwMjQpOwotICAgIHZvaWQgKmJ1ZiA9ICh2b2lkICopKEFMSUdOKCh1bnNpZ25lZCBsb25nKWFsbG9jX3B0ci5nZXQoKSwgNDA5NikgKyAxMDI0KTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDA5NjsgaSsrKQotICAgICAgICAoKGNoYXIgKilidWYpW2ldID0gaTsKLQotICAgIGZvciAodW5zaWduZWQgaW50IGhlYXBNYXNrIDogbV9hbGxIZWFwcykgewotICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgImhlYXAgIiA8PCBoZWFwTWFzayk7Ci0gICAgICAgIGludCBtYXBfZmQgPSAtMTsKLSAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzID0gMDsKLQotICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jX2ZkKG1faW9uRmQsIDQwOTYsIDAsIGhlYXBNYXNrLCBmbGFncywgJm1hcF9mZCkpOwotICAgICAgICBBU1NFUlRfR0UobWFwX2ZkLCAwKTsKLQotICAgICAgICB2b2lkICpwdHI7Ci0gICAgICAgIHB0ciA9IG1tYXAoTlVMTCwgNDA5NiwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgbWFwX2ZkLCAwKTsKLSAgICAgICAgQVNTRVJUX1RSVUUocHRyICE9IE5VTEwpOwotCi0gICAgICAgIGRpcnR5Q2FjaGUocHRyLCA0MDk2KTsKLQotICAgICAgICB3cml0ZUtlcm5lbChtYXBfZmQsIGJ1ZiwgNDA5Nik7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDk2OyBpKyspCi0gICAgICAgICAgICBBU1NFUlRfRVEoKGNoYXIpaSwgKChjaGFyICopcHRyKVtpXSkgPDwgaTsKLQotICAgICAgICBBU1NFUlRfRVEoMCwgbXVubWFwKHB0ciwgNDA5NikpOwotICAgICAgICBBU1NFUlRfRVEoMCwgY2xvc2UobWFwX2ZkKSk7Ci0gICAgfQotfQotCi1URVNUX0YoRGV2aWNlLCBETUFSZWFkKQotewotICAgIGF1dG8gYWxsb2NfcHRyID0gc3RkOjptYWtlX3VuaXF1ZTxjaGFyW10+KDgxOTIgKyAxMDI0KTsKLSAgICB2b2lkICpidWYgPSAodm9pZCAqKShBTElHTigodW5zaWduZWQgbG9uZylhbGxvY19wdHIuZ2V0KCksIDQwOTYpICsgMTAyNCk7Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGludCBoZWFwTWFzayA6IG1fYWxsSGVhcHMpIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJoZWFwICIgPDwgaGVhcE1hc2spOwotICAgICAgICBpbnQgbWFwX2ZkID0gLTE7Ci0gICAgICAgIHVuc2lnbmVkIGludCBmbGFncyA9IDA7Ci0KLSAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvY19mZChtX2lvbkZkLCA0MDk2LCAwLCBoZWFwTWFzaywgZmxhZ3MsICZtYXBfZmQpKTsKLSAgICAgICAgQVNTRVJUX0dFKG1hcF9mZCwgMCk7Ci0KLSAgICAgICAgdm9pZCAqcHRyOwotICAgICAgICBwdHIgPSBtbWFwKE5VTEwsIDQwOTYsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIG1hcF9mZCwgMCk7Ci0gICAgICAgIEFTU0VSVF9UUlVFKHB0ciAhPSBOVUxMKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDQwOTY7IGkrKykKLSAgICAgICAgICAgICgoY2hhciAqKXB0cilbaV0gPSBpOwotCi0gICAgICAgIHJlYWRETUEobWFwX2ZkLCBidWYsIDQwOTYpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDA5NjsgaSsrKQotICAgICAgICAgICAgQVNTRVJUX0VRKChjaGFyKWksICgoY2hhciAqKWJ1ZilbaV0pOwotCi0gICAgICAgIEFTU0VSVF9FUSgwLCBtdW5tYXAocHRyLCA0MDk2KSk7Ci0gICAgICAgIEFTU0VSVF9FUSgwLCBjbG9zZShtYXBfZmQpKTsKLSAgICB9Ci19Ci0KLVRFU1RfRihEZXZpY2UsIERNQVdyaXRlKQotewotICAgIGF1dG8gYWxsb2NfcHRyID0gc3RkOjptYWtlX3VuaXF1ZTxjaGFyW10+KDgxOTIgKyAxMDI0KTsKLSAgICB2b2lkICpidWYgPSAodm9pZCAqKShBTElHTigodW5zaWduZWQgbG9uZylhbGxvY19wdHIuZ2V0KCksIDQwOTYpICsgMTAyNCk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDQwOTY7IGkrKykKLSAgICAgICAgKChjaGFyICopYnVmKVtpXSA9IGk7Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGludCBoZWFwTWFzayA6IG1fYWxsSGVhcHMpIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJoZWFwICIgPDwgaGVhcE1hc2spOwotICAgICAgICBpbnQgbWFwX2ZkID0gLTE7Ci0gICAgICAgIHVuc2lnbmVkIGludCBmbGFncyA9IDA7Ci0KLSAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvY19mZChtX2lvbkZkLCA0MDk2LCAwLCBoZWFwTWFzaywgZmxhZ3MsICZtYXBfZmQpKTsKLSAgICAgICAgQVNTRVJUX0dFKG1hcF9mZCwgMCk7Ci0KLSAgICAgICAgdm9pZCAqcHRyOwotICAgICAgICBwdHIgPSBtbWFwKE5VTEwsIDQwOTYsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIG1hcF9mZCwgMCk7Ci0gICAgICAgIEFTU0VSVF9UUlVFKHB0ciAhPSBOVUxMKTsKLQotICAgICAgICBkaXJ0eUNhY2hlKHB0ciwgNDA5Nik7Ci0KLSAgICAgICAgd3JpdGVETUEobWFwX2ZkLCBidWYsIDQwOTYpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDA5NjsgaSsrKQotICAgICAgICAgICAgQVNTRVJUX0VRKChjaGFyKWksICgoY2hhciAqKXB0cilbaV0pIDw8IGk7Ci0KLSAgICAgICAgQVNTRVJUX0VRKDAsIG11bm1hcChwdHIsIDQwOTYpKTsKLSAgICAgICAgQVNTRVJUX0VRKDAsIGNsb3NlKG1hcF9mZCkpOwotICAgIH0KLX0KLQotVEVTVF9GKERldmljZSwgSXNDYWNoZWQpCi17Ci0gICAgYXV0byBidWZfcHRyID0gc3RkOjptYWtlX3VuaXF1ZTxjaGFyW10+KDQwOTYpOwotICAgIHZvaWQgKmJ1ZiA9IGJ1Zl9wdHIuZ2V0KCk7Ci0KLSAgICBmb3IgKHVuc2lnbmVkIGludCBoZWFwTWFzayA6IG1fYWxsSGVhcHMpIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJoZWFwICIgPDwgaGVhcE1hc2spOwotICAgICAgICBpbnQgbWFwX2ZkID0gLTE7Ci0gICAgICAgIHVuc2lnbmVkIGludCBmbGFncyA9IElPTl9GTEFHX0NBQ0hFRCB8IElPTl9GTEFHX0NBQ0hFRF9ORUVEU19TWU5DOwotCi0gICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2NfZmQobV9pb25GZCwgNDA5NiwgMCwgaGVhcE1hc2ssIGZsYWdzLCAmbWFwX2ZkKSk7Ci0gICAgICAgIEFTU0VSVF9HRShtYXBfZmQsIDApOwotCi0gICAgICAgIHZvaWQgKnB0cjsKLSAgICAgICAgcHRyID0gbW1hcChOVUxMLCA0MDk2LCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBtYXBfZmQsIDApOwotICAgICAgICBBU1NFUlRfVFJVRShwdHIgIT0gTlVMTCk7Ci0KLSAgICAgICAgZGlydHlDYWNoZShwdHIsIDQwOTYpOwotCi0gICAgICAgIHJlYWRETUEobWFwX2ZkLCBidWYsIDQwOTYpOwotCi0gICAgICAgIGJvb2wgc2FtZSA9IHRydWU7Ci0gICAgICAgIGZvciAoaW50IGkgPSA0MDk2LTE2OyBpID49IDA7IGkgLT0gMTYpCi0gICAgICAgICAgICBpZiAoKChjaGFyICopYnVmKVtpXSAhPSBpKQotICAgICAgICAgICAgICAgIHNhbWUgPSBmYWxzZTsKLSAgICAgICAgQVNTRVJUX0ZBTFNFKHNhbWUpOwotCi0gICAgICAgIEFTU0VSVF9FUSgwLCBtdW5tYXAocHRyLCA0MDk2KSk7Ci0gICAgICAgIEFTU0VSVF9FUSgwLCBjbG9zZShtYXBfZmQpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9saWJpb24vdGVzdHMvZXhpdF90ZXN0LmNwcCBiL2xpYmlvbi90ZXN0cy9leGl0X3Rlc3QuY3BwCmluZGV4IGNkZDNlMjcuLmYzMTIzODkgMTAwNjQ0Ci0tLSBhL2xpYmlvbi90ZXN0cy9leGl0X3Rlc3QuY3BwCisrKyBiL2xpYmlvbi90ZXN0cy9leGl0X3Rlc3QuY3BwCkBAIC0yMiwyMDYgKzIyLDIwNiBAQAogCiAjaW5jbHVkZSAiaW9uX3Rlc3RfZml4dHVyZS5oIgogCi1jbGFzcyBFeGl0IDogcHVibGljIElvbkFsbEhlYXBzVGVzdCB7Ci19OworY2xhc3MgRXhpdCA6IHB1YmxpYyBJb25UZXN0IHt9OwogCi1URVNUX0YoRXhpdCwgV2l0aEFsbG9jKQotewotICAgIHN0YXRpYyBjb25zdCBzaXplX3QgYWxsb2NhdGlvblNpemVzW10gPSB7NCoxMDI0LCA2NCoxMDI0LCAxMDI0KjEwMjQsIDIqMTAyNCoxMDI0fTsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBoZWFwTWFzayA6IG1fYWxsSGVhcHMpIHsKK1RFU1RfRihFeGl0LCBXaXRoQWxsb2NGZCkgeworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgYWxsb2NhdGlvblNpemVzW10gPSB7NCAqIDEwMjQsIDY0ICogMTAyNCwgMTAyNCAqIDEwMjQsIDIgKiAxMDI0ICogMTAyNH07CisgICAgZm9yIChjb25zdCBhdXRvJiBoZWFwIDogaW9uX2hlYXBzKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IHNpemUgOiBhbGxvY2F0aW9uU2l6ZXMpIHsKLSAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAiaGVhcCAiIDw8IGhlYXBNYXNrKTsKKyAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJoZWFwOiIgPDwgaGVhcC5uYW1lIDw8ICI6IiA8PCBoZWFwLnR5cGUgPDwgIjoiIDw8IGhlYXAuaGVhcF9pZCk7CiAgICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgInNpemUgIiA8PCBzaXplKTsKLSAgICAgICAgICAgIEVYUEVDVF9FWElUKHsKLSAgICAgICAgICAgICAgICBpb25fdXNlcl9oYW5kbGVfdCBoYW5kbGUgPSAwOworICAgICAgICAgICAgRVhQRUNUX0VYSVQoCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYW5kbGVfZmQgPSAtMTsKIAotICAgICAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2MobV9pb25GZCwgc2l6ZSwgMCwgaGVhcE1hc2ssIDAsICZoYW5kbGUpKTsKLSAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShoYW5kbGUgIT0gMCk7Ci0gICAgICAgICAgICAgICAgZXhpdCgwKTsKLSAgICAgICAgICAgIH0sIDo6dGVzdGluZzo6RXhpdGVkV2l0aENvZGUoMCksICIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVF9FUSgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvbl9hbGxvY19mZChpb25mZCwgc2l6ZSwgMCwgKDEgPDwgaGVhcC5oZWFwX2lkKSwgMCwgJmhhbmRsZV9mZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUX05FKC0xLCBoYW5kbGVfZmQpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgwKTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgwKSwgIiIpOwogICAgICAgICB9CiAgICAgfQogfQogCi1URVNUX0YoRXhpdCwgV2l0aEFsbG9jRmQpCi17Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBhbGxvY2F0aW9uU2l6ZXNbXSA9IHs0KjEwMjQsIDY0KjEwMjQsIDEwMjQqMTAyNCwgMioxMDI0KjEwMjR9OwotICAgIGZvciAodW5zaWduZWQgaW50IGhlYXBNYXNrIDogbV9hbGxIZWFwcykgewotICAgICAgICBmb3IgKHNpemVfdCBzaXplIDogYWxsb2NhdGlvblNpemVzKSB7Ci0gICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgImhlYXAgIiA8PCBoZWFwTWFzayk7Ci0gICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgInNpemUgIiA8PCBzaXplKTsKLSAgICAgICAgICAgIEVYUEVDVF9FWElUKHsKLSAgICAgICAgICAgICAgICBpbnQgaGFuZGxlX2ZkID0gLTE7Ci0KLSAgICAgICAgICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jX2ZkKG1faW9uRmQsIHNpemUsIDAsIGhlYXBNYXNrLCAwLCAmaGFuZGxlX2ZkKSk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX05FKC0xLCBoYW5kbGVfZmQpOwotICAgICAgICAgICAgICAgIGV4aXQoMCk7Ci0gICAgICAgICAgICB9LCA6OnRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDApLCAiIik7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLVRFU1RfRihFeGl0LCBXaXRoUmVwZWF0ZWRBbGxvY0ZkKQotewotICAgIHN0YXRpYyBjb25zdCBzaXplX3QgYWxsb2NhdGlvblNpemVzW10gPSB7NCoxMDI0LCA2NCoxMDI0LCAxMDI0KjEwMjQsIDIqMTAyNCoxMDI0fTsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBoZWFwTWFzayA6IG1fYWxsSGVhcHMpIHsKK1RFU1RfRihFeGl0LCBXaXRoUmVwZWF0ZWRBbGxvY0ZkKSB7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBhbGxvY2F0aW9uU2l6ZXNbXSA9IHs0ICogMTAyNCwgNjQgKiAxMDI0LCAxMDI0ICogMTAyNCwgMiAqIDEwMjQgKiAxMDI0fTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGhlYXAgOiBpb25faGVhcHMpIHsKICAgICAgICAgZm9yIChzaXplX3Qgc2l6ZSA6IGFsbG9jYXRpb25TaXplcykgewogICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCAxMDI0OyBpKyspIHsKLSAgICAgICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgImhlYXAgIiA8PCBoZWFwTWFzayk7CisgICAgICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJoZWFwOiIgPDwgaGVhcC5uYW1lIDw8ICI6IiA8PCBoZWFwLnR5cGUgPDwgIjoiIDw8IGhlYXAuaGVhcF9pZCk7CiAgICAgICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJzaXplICIgPDwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX0VYSVQoewotICAgICAgICAgICAgICAgICAgICBpbnQgaGFuZGxlX2ZkID0gLTE7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VYSVQoCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhhbmRsZV9mZCA9IC0xOwogCi0gICAgICAgICAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2NfZmQobV9pb25GZCwgc2l6ZSwgMCwgaGVhcE1hc2ssIDAsICZoYW5kbGVfZmQpKTsKLSAgICAgICAgICAgICAgICAgICAgQVNTRVJUX05FKC0xLCBoYW5kbGVfZmQpOwotICAgICAgICAgICAgICAgICAgICBleGl0KDApOwotICAgICAgICAgICAgICAgIH0sIDo6dGVzdGluZzo6RXhpdGVkV2l0aENvZGUoMCksICIiKQotICAgICAgICAgICAgICAgICAgICAgICAgPDwgImZhaWxlZCBvbiBoZWFwICIgPDwgaGVhcE1hc2sKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgYW5kIHNpemUgIiA8PCBzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICA8PCAiIG9uIGl0ZXJhdGlvbiAiIDw8IGk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvY19mZChpb25mZCwgc2l6ZSwgMCwgKDEgPDwgaGVhcC5oZWFwX2lkKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoYW5kbGVfZmQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlRfTkUoLTEsIGhhbmRsZV9mZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDApLCAiIikKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJmYWlsZWQgb24gaGVhcCAiIDw8IGhlYXAubmFtZSA8PCAiOiIgPDwgaGVhcC50eXBlIDw8ICI6IiA8PCBoZWFwLmhlYXBfaWQKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgYW5kIHNpemUgIiA8PCBzaXplIDw8ICIgb24gaXRlcmF0aW9uICIgPDwgaTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KIAotCi1URVNUX0YoRXhpdCwgV2l0aE1hcHBpbmcpCi17Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBhbGxvY2F0aW9uU2l6ZXNbXSA9IHs0KjEwMjQsIDY0KjEwMjQsIDEwMjQqMTAyNCwgMioxMDI0KjEwMjR9OwotICAgIGZvciAodW5zaWduZWQgaW50IGhlYXBNYXNrIDogbV9hbGxIZWFwcykgeworVEVTVF9GKEV4aXQsIFdpdGhNYXBwaW5nKSB7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBhbGxvY2F0aW9uU2l6ZXNbXSA9IHs0ICogMTAyNCwgNjQgKiAxMDI0LCAxMDI0ICogMTAyNCwgMiAqIDEwMjQgKiAxMDI0fTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGhlYXAgOiBpb25faGVhcHMpIHsKICAgICAgICAgZm9yIChzaXplX3Qgc2l6ZSA6IGFsbG9jYXRpb25TaXplcykgewotICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJoZWFwICIgPDwgaGVhcE1hc2spOworICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImhlYXA6IiA8PCBoZWFwLm5hbWUgPDwgIjoiIDw8IGhlYXAudHlwZSA8PCAiOiIgPDwgaGVhcC5oZWFwX2lkKTsKICAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAic2l6ZSAiIDw8IHNpemUpOwotICAgICAgICAgICAgRVhQRUNUX0VYSVQoewotICAgICAgICAgICAgICAgIGludCBtYXBfZmQgPSAtMTsKKyAgICAgICAgICAgIEVYUEVDVF9FWElUKAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFwX2ZkID0gLTE7CiAKLSAgICAgICAgICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jX2ZkKG1faW9uRmQsIHNpemUsIDAsIGhlYXBNYXNrLCAwLCAmbWFwX2ZkKSk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX0dFKG1hcF9mZCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jX2ZkKGlvbmZkLCBzaXplLCAwLCAoMSA8PCBoZWFwLmhlYXBfaWQpLCAwLCAmbWFwX2ZkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlRfR0UobWFwX2ZkLCAwKTsKIAotICAgICAgICAgICAgICAgIHZvaWQgKnB0cjsKLSAgICAgICAgICAgICAgICBwdHIgPSBtbWFwKE5VTEwsIHNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIG1hcF9mZCwgMCk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUocHRyICE9IE5VTEwpOwotICAgICAgICAgICAgICAgIGV4aXQoMCk7Ci0gICAgICAgICAgICB9LCA6OnRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDApLCAiIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotVEVTVF9GKEV4aXQsIFdpdGhQYXJ0aWFsTWFwcGluZykKLXsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGFsbG9jYXRpb25TaXplc1tdID0gezY0KjEwMjQsIDEwMjQqMTAyNCwgMioxMDI0KjEwMjR9OwotICAgIGZvciAodW5zaWduZWQgaW50IGhlYXBNYXNrIDogbV9hbGxIZWFwcykgewotICAgICAgICBmb3IgKHNpemVfdCBzaXplIDogYWxsb2NhdGlvblNpemVzKSB7Ci0gICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgImhlYXAgIiA8PCBoZWFwTWFzayk7Ci0gICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgInNpemUgIiA8PCBzaXplKTsKLSAgICAgICAgICAgIEVYUEVDVF9FWElUKHsKLSAgICAgICAgICAgICAgICBpbnQgbWFwX2ZkID0gLTE7Ci0KLSAgICAgICAgICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jX2ZkKG1faW9uRmQsIHNpemUsIDAsIGhlYXBNYXNrLCAwLCAmbWFwX2ZkKSk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX0dFKG1hcF9mZCwgMCk7Ci0KLSAgICAgICAgICAgICAgICB2b2lkICpwdHI7Ci0gICAgICAgICAgICAgICAgcHRyID0gbW1hcChOVUxMLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBtYXBfZmQsIDApOwotICAgICAgICAgICAgICAgIEFTU0VSVF9UUlVFKHB0ciAhPSBOVUxMKTsKLQotICAgICAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBtdW5tYXAocHRyLCBzaXplIC8gMikpOwotICAgICAgICAgICAgICAgIGV4aXQoMCk7Ci0gICAgICAgICAgICB9LCA6OnRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDApLCAiIik7CisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwdHI7CisgICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSBtbWFwKE5VTEwsIHNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIG1hcF9mZCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShwdHIgIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBleGl0KDApOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDApLCAiIik7CiAgICAgICAgIH0KICAgICB9CiB9CiAKLVRFU1RfRihFeGl0LCBXaXRoTWFwcGluZ0NhY2hlZCkKLXsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGFsbG9jYXRpb25TaXplc1tdID0gezQqMTAyNCwgNjQqMTAyNCwgMTAyNCoxMDI0LCAyKjEwMjQqMTAyNH07Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgaGVhcE1hc2sgOiBtX2FsbEhlYXBzKSB7CitURVNUX0YoRXhpdCwgV2l0aFBhcnRpYWxNYXBwaW5nKSB7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBhbGxvY2F0aW9uU2l6ZXNbXSA9IHs2NCAqIDEwMjQsIDEwMjQgKiAxMDI0LCAyICogMTAyNCAqIDEwMjR9OworICAgIGZvciAoY29uc3QgYXV0byYgaGVhcCA6IGlvbl9oZWFwcykgewogICAgICAgICBmb3IgKHNpemVfdCBzaXplIDogYWxsb2NhdGlvblNpemVzKSB7Ci0gICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgImhlYXAgIiA8PCBoZWFwTWFzayk7CisgICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiaGVhcDoiIDw8IGhlYXAubmFtZSA8PCAiOiIgPDwgaGVhcC50eXBlIDw8ICI6IiA8PCBoZWFwLmhlYXBfaWQpOwogICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJzaXplICIgPDwgc2l6ZSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRVhJVCh7Ci0gICAgICAgICAgICAgICAgaW50IG1hcF9mZCA9IC0xOworICAgICAgICAgICAgRVhQRUNUX0VYSVQoCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXBfZmQgPSAtMTsKIAotICAgICAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2NfZmQobV9pb25GZCwgc2l6ZSwgMCwgaGVhcE1hc2ssIElPTl9GTEFHX0NBQ0hFRCwgJm1hcF9mZCkpOwotICAgICAgICAgICAgICAgIEFTU0VSVF9HRShtYXBfZmQsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvY19mZChpb25mZCwgc2l6ZSwgMCwgKDEgPDwgaGVhcC5oZWFwX2lkKSwgMCwgJm1hcF9mZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUX0dFKG1hcF9mZCwgMCk7CiAKLSAgICAgICAgICAgICAgICB2b2lkICpwdHI7Ci0gICAgICAgICAgICAgICAgcHRyID0gbW1hcChOVUxMLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBtYXBfZmQsIDApOwotICAgICAgICAgICAgICAgIEFTU0VSVF9UUlVFKHB0ciAhPSBOVUxMKTsKLSAgICAgICAgICAgICAgICBleGl0KDApOwotICAgICAgICAgICAgfSwgOjp0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgwKSwgIiIpOwotICAgICAgICB9Ci0gICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcHRyOworICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gbW1hcChOVUxMLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBtYXBfZmQsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUocHRyICE9IE5VTEwpOwogCi19Ci0KLVRFU1RfRihFeGl0LCBXaXRoUGFydGlhbE1hcHBpbmdDYWNoZWQpCi17Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBhbGxvY2F0aW9uU2l6ZXNbXSA9IHs2NCoxMDI0LCAxMDI0KjEwMjQsIDIqMTAyNCoxMDI0fTsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBoZWFwTWFzayA6IG1fYWxsSGVhcHMpIHsKLSAgICAgICAgZm9yIChzaXplX3Qgc2l6ZSA6IGFsbG9jYXRpb25TaXplcykgewotICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJoZWFwICIgPDwgaGVhcE1hc2spOwotICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJzaXplICIgPDwgc2l6ZSk7Ci0gICAgICAgICAgICBFWFBFQ1RfRVhJVCh7Ci0gICAgICAgICAgICAgICAgaW50IG1hcF9mZCA9IC0xOwotCi0gICAgICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvY19mZChtX2lvbkZkLCBzaXplLCAwLCBoZWFwTWFzaywgSU9OX0ZMQUdfQ0FDSEVELCAmbWFwX2ZkKSk7Ci0gICAgICAgICAgICAgICAgQVNTRVJUX0dFKG1hcF9mZCwgMCk7Ci0KLSAgICAgICAgICAgICAgICB2b2lkICpwdHI7Ci0gICAgICAgICAgICAgICAgcHRyID0gbW1hcChOVUxMLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBtYXBfZmQsIDApOwotICAgICAgICAgICAgICAgIEFTU0VSVF9UUlVFKHB0ciAhPSBOVUxMKTsKLQotICAgICAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBtdW5tYXAocHRyLCBzaXplIC8gMikpOwotICAgICAgICAgICAgICAgIGV4aXQoMCk7Ci0gICAgICAgICAgICB9LCA6OnRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDApLCAiIik7CisgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlRfRVEoMCwgbXVubWFwKHB0ciwgc2l6ZSAvIDIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6RXhpdGVkV2l0aENvZGUoMCksICIiKTsKICAgICAgICAgfQogICAgIH0KIH0KIAotVEVTVF9GKEV4aXQsIFdpdGhNYXBwaW5nTmVlZHNTeW5jKQotewotICAgIHN0YXRpYyBjb25zdCBzaXplX3QgYWxsb2NhdGlvblNpemVzW10gPSB7NCoxMDI0LCA2NCoxMDI0LCAxMDI0KjEwMjQsIDIqMTAyNCoxMDI0fTsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBoZWFwTWFzayA6IG1fYWxsSGVhcHMpIHsKK1RFU1RfRihFeGl0LCBXaXRoTWFwcGluZ0NhY2hlZCkgeworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgYWxsb2NhdGlvblNpemVzW10gPSB7NCAqIDEwMjQsIDY0ICogMTAyNCwgMTAyNCAqIDEwMjQsIDIgKiAxMDI0ICogMTAyNH07CisgICAgZm9yIChjb25zdCBhdXRvJiBoZWFwIDogaW9uX2hlYXBzKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IHNpemUgOiBhbGxvY2F0aW9uU2l6ZXMpIHsKLSAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAiaGVhcCAiIDw8IGhlYXBNYXNrKTsKKyAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJoZWFwOiIgPDwgaGVhcC5uYW1lIDw8ICI6IiA8PCBoZWFwLnR5cGUgPDwgIjoiIDw8IGhlYXAuaGVhcF9pZCk7CiAgICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgInNpemUgIiA8PCBzaXplKTsKLSAgICAgICAgICAgIEVYUEVDVF9FWElUKHsKLSAgICAgICAgICAgICAgICBpbnQgbWFwX2ZkID0gLTE7CisgICAgICAgICAgICBFWFBFQ1RfRVhJVCgKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hcF9mZCA9IC0xOwogCi0gICAgICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvY19mZChtX2lvbkZkLCBzaXplLCAwLCBoZWFwTWFzaywgSU9OX0ZMQUdfQ0FDSEVEIHwgSU9OX0ZMQUdfQ0FDSEVEX05FRURTX1NZTkMsICZtYXBfZmQpKTsKLSAgICAgICAgICAgICAgICBBU1NFUlRfR0UobWFwX2ZkLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2NfZmQoaW9uZmQsIHNpemUsIDAsICgxIDw8IGhlYXAuaGVhcF9pZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPTl9GTEFHX0NBQ0hFRCwgJm1hcF9mZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUX0dFKG1hcF9mZCwgMCk7CiAKLSAgICAgICAgICAgICAgICB2b2lkICpwdHI7Ci0gICAgICAgICAgICAgICAgcHRyID0gbW1hcChOVUxMLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBtYXBfZmQsIDApOwotICAgICAgICAgICAgICAgIEFTU0VSVF9UUlVFKHB0ciAhPSBOVUxMKTsKLSAgICAgICAgICAgICAgICBleGl0KDApOwotICAgICAgICAgICAgfSwgOjp0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgwKSwgIiIpOworICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcHRyOworICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gbW1hcChOVUxMLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBtYXBfZmQsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUocHRyICE9IE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCgwKTsKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpFeGl0ZWRXaXRoQ29kZSgwKSwgIiIpOwogICAgICAgICB9CiAgICAgfQotCiB9CiAKLVRFU1RfRihFeGl0LCBXaXRoUGFydGlhbE1hcHBpbmdOZWVkc1N5bmMpCi17Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBhbGxvY2F0aW9uU2l6ZXNbXSA9IHs2NCoxMDI0LCAxMDI0KjEwMjQsIDIqMTAyNCoxMDI0fTsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBoZWFwTWFzayA6IG1fYWxsSGVhcHMpIHsKK1RFU1RfRihFeGl0LCBXaXRoUGFydGlhbE1hcHBpbmdDYWNoZWQpIHsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGFsbG9jYXRpb25TaXplc1tdID0gezY0ICogMTAyNCwgMTAyNCAqIDEwMjQsIDIgKiAxMDI0ICogMTAyNH07CisgICAgZm9yIChjb25zdCBhdXRvJiBoZWFwIDogaW9uX2hlYXBzKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IHNpemUgOiBhbGxvY2F0aW9uU2l6ZXMpIHsKLSAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAiaGVhcCAiIDw8IGhlYXBNYXNrKTsKKyAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJoZWFwOiIgPDwgaGVhcC5uYW1lIDw8ICI6IiA8PCBoZWFwLnR5cGUgPDwgIjoiIDw8IGhlYXAuaGVhcF9pZCk7CiAgICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgInNpemUgIiA8PCBzaXplKTsKLSAgICAgICAgICAgIEVYUEVDVF9FWElUKHsKLSAgICAgICAgICAgICAgICBpbnQgbWFwX2ZkID0gLTE7CisgICAgICAgICAgICBFWFBFQ1RfRVhJVCgKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1hcF9mZCA9IC0xOwogCi0gICAgICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvY19mZChtX2lvbkZkLCBzaXplLCAwLCBoZWFwTWFzaywgSU9OX0ZMQUdfQ0FDSEVEIHwgSU9OX0ZMQUdfQ0FDSEVEX05FRURTX1NZTkMsICZtYXBfZmQpKTsKLSAgICAgICAgICAgICAgICBBU1NFUlRfR0UobWFwX2ZkLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2NfZmQoaW9uZmQsIHNpemUsIDAsICgxIDw8IGhlYXAuaGVhcF9pZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPTl9GTEFHX0NBQ0hFRCwgJm1hcF9mZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUX0dFKG1hcF9mZCwgMCk7CiAKLSAgICAgICAgICAgICAgICB2b2lkICpwdHI7Ci0gICAgICAgICAgICAgICAgcHRyID0gbW1hcChOVUxMLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBtYXBfZmQsIDApOwotICAgICAgICAgICAgICAgIEFTU0VSVF9UUlVFKHB0ciAhPSBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHB0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IG1tYXAoTlVMTCwgc2l6ZSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgbWFwX2ZkLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVF9UUlVFKHB0ciAhPSBOVUxMKTsKIAotICAgICAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBtdW5tYXAocHRyLCBzaXplIC8gMikpOwotICAgICAgICAgICAgICAgIGV4aXQoMCk7Ci0gICAgICAgICAgICB9LCA6OnRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDApLCAiIik7CisgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlRfRVEoMCwgbXVubWFwKHB0ciwgc2l6ZSAvIDIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6RXhpdGVkV2l0aENvZGUoMCksICIiKTsKKyAgICAgICAgfQorICAgIH0KK30KKworVEVTVF9GKEV4aXQsIFdpdGhNYXBwaW5nTmVlZHNTeW5jKSB7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBhbGxvY2F0aW9uU2l6ZXNbXSA9IHs0ICogMTAyNCwgNjQgKiAxMDI0LCAxMDI0ICogMTAyNCwgMiAqIDEwMjQgKiAxMDI0fTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGhlYXAgOiBpb25faGVhcHMpIHsKKyAgICAgICAgZm9yIChzaXplX3Qgc2l6ZSA6IGFsbG9jYXRpb25TaXplcykgeworICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImhlYXA6IiA8PCBoZWFwLm5hbWUgPDwgIjoiIDw8IGhlYXAudHlwZSA8PCAiOiIgPDwgaGVhcC5oZWFwX2lkKTsKKyAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAic2l6ZSAiIDw8IHNpemUpOworICAgICAgICAgICAgRVhQRUNUX0VYSVQoCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXBfZmQgPSAtMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvY19mZChpb25mZCwgc2l6ZSwgMCwgKDEgPDwgaGVhcC5oZWFwX2lkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9OX0ZMQUdfQ0FDSEVEIHwgSU9OX0ZMQUdfQ0FDSEVEX05FRURTX1NZTkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXBfZmQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVF9HRShtYXBfZmQsIDApOworCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwdHI7CisgICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSBtbWFwKE5VTEwsIHNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIG1hcF9mZCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShwdHIgIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBleGl0KDApOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OkV4aXRlZFdpdGhDb2RlKDApLCAiIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RFU1RfRihFeGl0LCBXaXRoUGFydGlhbE1hcHBpbmdOZWVkc1N5bmMpIHsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGFsbG9jYXRpb25TaXplc1tdID0gezY0ICogMTAyNCwgMTAyNCAqIDEwMjQsIDIgKiAxMDI0ICogMTAyNH07CisgICAgZm9yIChjb25zdCBhdXRvJiBoZWFwIDogaW9uX2hlYXBzKSB7CisgICAgICAgIGZvciAoc2l6ZV90IHNpemUgOiBhbGxvY2F0aW9uU2l6ZXMpIHsKKyAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJoZWFwOiIgPDwgaGVhcC5uYW1lIDw8ICI6IiA8PCBoZWFwLnR5cGUgPDwgIjoiIDw8IGhlYXAuaGVhcF9pZCk7CisgICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgInNpemUgIiA8PCBzaXplKTsKKyAgICAgICAgICAgIEVYUEVDVF9FWElUKAorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFwX2ZkID0gLTE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2NfZmQoaW9uZmQsIHNpemUsIDAsICgxIDw8IGhlYXAuaGVhcF9pZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElPTl9GTEFHX0NBQ0hFRCB8IElPTl9GTEFHX0NBQ0hFRF9ORUVEU19TWU5DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFwX2ZkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlRfR0UobWFwX2ZkLCAwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogcHRyOworICAgICAgICAgICAgICAgICAgICAgICAgcHRyID0gbW1hcChOVUxMLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBtYXBfZmQsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUocHRyICE9IE5VTEwpOworCisgICAgICAgICAgICAgICAgICAgICAgICBBU1NFUlRfRVEoMCwgbXVubWFwKHB0ciwgc2l6ZSAvIDIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMCk7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6RXhpdGVkV2l0aENvZGUoMCksICIiKTsKICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL2xpYmlvbi90ZXN0cy9mb3JtZXJseV92YWxpZF9oYW5kbGVfdGVzdC5jcHAgYi9saWJpb24vdGVzdHMvZm9ybWVybHlfdmFsaWRfaGFuZGxlX3Rlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWFiOGYzLi4wMDAwMDAwCi0tLSBhL2xpYmlvbi90ZXN0cy9mb3JtZXJseV92YWxpZF9oYW5kbGVfdGVzdC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN5cy9tbWFuLmg+Ci0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSA8aW9uL2lvbi5oPgotCi0jaW5jbHVkZSAiaW9uX3Rlc3RfZml4dHVyZS5oIgotCi1jbGFzcyBGb3JtZXJseVZhbGlkSGFuZGxlIDogcHVibGljIElvblRlc3QgewotIHB1YmxpYzoKLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKTsKLSAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKTsKLSAgICBpb25fdXNlcl9oYW5kbGVfdCBtX2hhbmRsZTsKLX07Ci0KLXZvaWQgRm9ybWVybHlWYWxpZEhhbmRsZTo6U2V0VXAoKQotewotICAgIElvblRlc3Q6OlNldFVwKCk7Ci0gICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvYyhtX2lvbkZkLCA0MDk2LCAwLCAxLyogaW9uX2Vudi0+bV9maXJzdEhlYXAgKi8sIDAsICZtX2hhbmRsZSkpOwotICAgIEFTU0VSVF9UUlVFKG1faGFuZGxlICE9IDApOwotICAgIEFTU0VSVF9FUSgwLCBpb25fZnJlZShtX2lvbkZkLCBtX2hhbmRsZSkpOwotfQotCi12b2lkIEZvcm1lcmx5VmFsaWRIYW5kbGU6OlRlYXJEb3duKCkKLXsKLSAgICBtX2hhbmRsZSA9IDA7Ci19Ci0KLVRFU1RfRihGb3JtZXJseVZhbGlkSGFuZGxlLCBmcmVlKQotewotCUFTU0VSVF9FUSgtRUlOVkFMLCBpb25fZnJlZShtX2lvbkZkLCBtX2hhbmRsZSkpOwotfQotCi1URVNUX0YoRm9ybWVybHlWYWxpZEhhbmRsZSwgbWFwKQotewotICAgIGludCBtYXBfZmQ7Ci0gICAgdW5zaWduZWQgY2hhciAqcHRyOwotCi0gICAgQVNTRVJUX0VRKC1FSU5WQUwsIGlvbl9tYXAobV9pb25GZCwgbV9oYW5kbGUsIDQwOTYsIFBST1RfUkVBRCwgMCwgMCwgJnB0ciwgJm1hcF9mZCkpOwotfQotCi1URVNUX0YoRm9ybWVybHlWYWxpZEhhbmRsZSwgc2hhcmUpCi17Ci0gICAgaW50IHNoYXJlX2ZkOwotCi0gICAgQVNTRVJUX0VRKC1FSU5WQUwsIGlvbl9zaGFyZShtX2lvbkZkLCBtX2hhbmRsZSwgJnNoYXJlX2ZkKSk7Ci19CmRpZmYgLS1naXQgYS9saWJpb24vdGVzdHMvaGVhcF9xdWVyeS5jcHAgYi9saWJpb24vdGVzdHMvaGVhcF9xdWVyeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFkM2JiZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmlvbi90ZXN0cy9oZWFwX3F1ZXJ5LmNwcApAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSAiaW9uX3Rlc3RfZml4dHVyZS5oIgorCitjbGFzcyBIZWFwUXVlcnkgOiBwdWJsaWMgSW9uVGVzdCB7fTsKKworVEVTVF9GKEhlYXBRdWVyeSwgQXRsZWFzdE9uZUhlYXApIHsKKyAgICBBU1NFUlRfR1QoaW9uX2hlYXBzLnNpemUoKSwgMCk7Cit9CisKKy8vIFRPRE86IENoZWNrIGlmIHdlIGV4cGVjdCBzb21lIG9mIHRoZSBkZWZhdWx0CisvLyBoZWFwIHR5cGVzIHRvIGJlIHByZXNlbnQgb24gYWxsIGRldmljZXMuCmRpZmYgLS1naXQgYS9saWJpb24vdGVzdHMvaW52YWxpZF92YWx1ZXNfdGVzdC5jcHAgYi9saWJpb24vdGVzdHMvaW52YWxpZF92YWx1ZXNfdGVzdC5jcHAKaW5kZXggNzdmZWExNy4uNDhmY2Q3MiAxMDA2NDQKLS0tIGEvbGliaW9uL3Rlc3RzL2ludmFsaWRfdmFsdWVzX3Rlc3QuY3BwCisrKyBiL2xpYmlvbi90ZXN0cy9pbnZhbGlkX3ZhbHVlc190ZXN0LmNwcApAQCAtMTYsMTcxICsxNiw3MSBAQAogCiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KIAorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogCiAjaW5jbHVkZSA8aW9uL2lvbi5oPgotCiAjaW5jbHVkZSAiaW9uX3Rlc3RfZml4dHVyZS5oIgogCi1jbGFzcyBJbnZhbGlkVmFsdWVzIDogcHVibGljIElvbkFsbEhlYXBzVGVzdCB7Ci0gcHVibGljOgotICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpOwotICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpOwotICAgIGlvbl91c2VyX2hhbmRsZV90IG1fdmFsaWRIYW5kbGU7Ci0gICAgaW50IG1fdmFsaWRTaGFyZUZkOwotICAgIGlvbl91c2VyX2hhbmRsZV90IGNvbnN0IG1fYmFkSGFuZGxlID0gLTE7Ci19OworY2xhc3MgSW52YWxpZFZhbHVlcyA6IHB1YmxpYyBJb25UZXN0IHt9OwogCi12b2lkIEludmFsaWRWYWx1ZXM6OlNldFVwKCkKLXsKLSAgICBJb25BbGxIZWFwc1Rlc3Q6OlNldFVwKCk7Ci0gICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvYyhtX2lvbkZkLCA0MDk2LCAwLCBtX2ZpcnN0SGVhcCwgMCwgJm1fdmFsaWRIYW5kbGUpKQotICAgICAgPDwgbV9pb25GZCA8PCAiICIgPDwgbV9maXJzdEhlYXA7Ci0gICAgQVNTRVJUX1RSVUUobV92YWxpZEhhbmRsZSAhPSAwKTsKLSAgICBBU1NFUlRfRVEoMCwgaW9uX3NoYXJlKG1faW9uRmQsIG1fdmFsaWRIYW5kbGUsICZtX3ZhbGlkU2hhcmVGZCkpOwotfQotCi12b2lkIEludmFsaWRWYWx1ZXM6OlRlYXJEb3duKCkKLXsKLSAgICBBU1NFUlRfRVEoMCwgaW9uX2ZyZWUobV9pb25GZCwgbV92YWxpZEhhbmRsZSkpOwotICAgIEFTU0VSVF9FUSgwLCBjbG9zZShtX3ZhbGlkU2hhcmVGZCkpOwotICAgIG1fdmFsaWRIYW5kbGUgPSAwOwotICAgIElvbkFsbEhlYXBzVGVzdDo6VGVhckRvd24oKTsKLX0KLQotVEVTVF9GKEludmFsaWRWYWx1ZXMsIGlvbl9jbG9zZSkKLXsKK1RFU1RfRihJbnZhbGlkVmFsdWVzLCBpb25fY2xvc2UpIHsKICAgICBFWFBFQ1RfRVEoLUVCQURGLCBpb25fY2xvc2UoLTEpKTsKIH0KIAotVEVTVF9GKEludmFsaWRWYWx1ZXMsIGlvbl9hbGxvYykKLXsKLSAgICBpb25fdXNlcl9oYW5kbGVfdCBoYW5kbGU7Ci0gICAgLyogaW52YWxpZCBpb25fZmQgKi8KLSAgICBpbnQgcmV0ID0gaW9uX2FsbG9jKDAsIDQwOTYsIDAsIG1fZmlyc3RIZWFwLCAwLCAmaGFuZGxlKTsKLSAgICBFWFBFQ1RfVFJVRShyZXQgPT0gLUVJTlZBTCB8fCByZXQgPT0gLUVOT1RUWSk7Ci0gICAgLyogaW52YWxpZCBpb25fZmQgKi8KLSAgICBFWFBFQ1RfRVEoLUVCQURGLCBpb25fYWxsb2MoLTEsIDQwOTYsIDAsIG1fZmlyc3RIZWFwLCAwLCAmaGFuZGxlKSk7Ci0gICAgLyogbm8gaGVhcHMgKi8KLSAgICBFWFBFQ1RfRVEoLUVOT0RFViwgaW9uX2FsbG9jKG1faW9uRmQsIDQwOTYsIDAsIDAsIDAsICZoYW5kbGUpKTsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBoZWFwTWFzayA6IG1fYWxsSGVhcHMpIHsKLSAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJoZWFwICIgPDwgaGVhcE1hc2spOwotICAgICAgICAvKiB6ZXJvIHNpemUgKi8KLSAgICAgICAgRVhQRUNUX0VRKC1FSU5WQUwsIGlvbl9hbGxvYyhtX2lvbkZkLCAwLCAwLCBoZWFwTWFzaywgMCwgJmhhbmRsZSkpOwotICAgICAgICAvKiB0b28gbGFyZ2Ugc2l6ZSAqLwotICAgICAgICBFWFBFQ1RfRVEoLUVJTlZBTCwgaW9uX2FsbG9jKG1faW9uRmQsIC0xLCAwLCBoZWFwTWFzaywgMCwgJmhhbmRsZSkpOwotICAgICAgICAvKiBiYWQgYWxpZ25tZW50ICovCi0gICAgICAgIEVYUEVDVF9FUSgtRUlOVkFMLCBpb25fYWxsb2MobV9pb25GZCwgNDA5NiwgLTEsIGhlYXBNYXNrLCAwLCAmaGFuZGxlKSk7Ci0gICAgICAgIC8qIE5VTEwgaGFuZGxlICovCi0gICAgICAgIEVYUEVDVF9FUSgtRUlOVkFMLCBpb25fYWxsb2MobV9pb25GZCwgNDA5NiwgMCwgaGVhcE1hc2ssIDAsIE5VTEwpKTsKLSAgICB9Ci19Ci0KLVRFU1RfRihJbnZhbGlkVmFsdWVzLCBpb25fYWxsb2NfZmQpCi17CitURVNUX0YoSW52YWxpZFZhbHVlcywgaW9uX2FsbG9jX2ZkKSB7CiAgICAgaW50IGZkOwotICAgIC8qIGludmFsaWQgaW9uX2ZkICovCi0gICAgaW50IHJldCA9IGlvbl9hbGxvY19mZCgwLCA0MDk2LCAwLCBtX2ZpcnN0SGVhcCwgMCwgJmZkKTsKLSAgICBFWFBFQ1RfVFJVRShyZXQgPT0gLUVJTlZBTCB8fCByZXQgPT0gLUVOT1RUWSk7Ci0gICAgLyogaW52YWxpZCBpb25fZmQgKi8KLSAgICBFWFBFQ1RfRVEoLUVCQURGLCBpb25fYWxsb2NfZmQoLTEsIDQwOTYsIDAsIG1fZmlyc3RIZWFwLCAwLCAmZmQpKTsKLSAgICAvKiBubyBoZWFwcyAqLwotICAgIEVYUEVDVF9FUSgtRU5PREVWLCBpb25fYWxsb2NfZmQobV9pb25GZCwgNDA5NiwgMCwgMCwgMCwgJmZkKSk7Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgaGVhcE1hc2sgOiBtX2FsbEhlYXBzKSB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAiaGVhcCAiIDw8IGhlYXBNYXNrKTsKLSAgICAgICAgLyogemVybyBzaXplICovCi0gICAgICAgIEVYUEVDVF9FUSgtRUlOVkFMLCBpb25fYWxsb2NfZmQobV9pb25GZCwgMCwgMCwgaGVhcE1hc2ssIDAsICZmZCkpOwotICAgICAgICAvKiB0b28gbGFyZ2Ugc2l6ZSAqLwotICAgICAgICBFWFBFQ1RfRVEoLUVJTlZBTCwgaW9uX2FsbG9jX2ZkKG1faW9uRmQsIC0xLCAwLCBoZWFwTWFzaywgMCwgJmZkKSk7Ci0gICAgICAgIC8qIGJhZCBhbGlnbm1lbnQgKi8KLSAgICAgICAgRVhQRUNUX0VRKC1FSU5WQUwsIGlvbl9hbGxvY19mZChtX2lvbkZkLCA0MDk2LCAtMSwgaGVhcE1hc2ssIDAsICZmZCkpOwotICAgICAgICAvKiBOVUxMIGhhbmRsZSAqLwotICAgICAgICBFWFBFQ1RfRVEoLUVJTlZBTCwgaW9uX2FsbG9jX2ZkKG1faW9uRmQsIDQwOTYsIDAsIGhlYXBNYXNrLCAwLCBOVUxMKSk7CisgICAgLy8gbm8gaGVhcHMKKyAgICBFWFBFQ1RfRVEoLUVOT0RFViwgaW9uX2FsbG9jX2ZkKGlvbmZkLCA0MDk2LCAwLCAwLCAwLCAmZmQpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGhlYXAgOiBpb25faGVhcHMpIHsKKyAgICAgICAgLy8gaW52YWxpZCBpb25fZmQKKyAgICAgICAgaW50IHJldCA9IGlvbl9hbGxvY19mZCgwLCA0MDk2LCAwLCAoMSA8PCBoZWFwLmhlYXBfaWQpLCAwLCAmZmQpOworICAgICAgICBFWFBFQ1RfVFJVRShyZXQgPT0gLUVJTlZBTCB8fCByZXQgPT0gLUVOT1RUWSk7CisgICAgICAgIC8vIGludmFsaWQgaW9uX2ZkCisgICAgICAgIEVYUEVDVF9FUSgtRUJBREYsIGlvbl9hbGxvY19mZCgtMSwgNDA5NiwgMCwgKDEgPDwgaGVhcC5oZWFwX2lkKSwgMCwgJmZkKSk7CisgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKQorICAgICAgICAgICAgICAgICAgICAgPDwgImhlYXA6IiA8PCBoZWFwLm5hbWUgPDwgIjoiIDw8IGhlYXAudHlwZSA8PCAiOiIgPDwgaGVhcC5oZWFwX2lkKTsKKyAgICAgICAgLy8gemVybyBzaXplCisgICAgICAgIEVYUEVDVF9FUSgtRUlOVkFMLCBpb25fYWxsb2NfZmQoaW9uZmQsIDAsIDAsICgxIDw8IGhlYXAuaGVhcF9pZCksIDAsICZmZCkpOworICAgICAgICAvLyB0b28gbGFyZ2Ugc2l6ZQorICAgICAgICBFWFBFQ1RfRVEoLUVJTlZBTCwgaW9uX2FsbG9jX2ZkKGlvbmZkLCAtMSwgMCwgKDEgPDwgaGVhcC5oZWFwX2lkKSwgMCwgJmZkKSk7CisgICAgICAgIC8vIGJhZCBhbGlnbm1lbnQKKyAgICAgICAgLy8gVE9ETzogQ3VycmVudCB1c2Vyc3BhY2UgYW5kIGtlcm5lbCBjb2RlIGNvbXBsZXRlbHkgaWdub3JlcyBhbGlnbm1lbnQuIFNvIHRoaXMKKyAgICAgICAgLy8gdGVzdCBpcyBnb2luZyB0byBmYWlsLiBXZSBuZWVkIHRvIGNvbXBsZXRlbHkgcmVtb3ZlIGFsaWdubWVudCBmcm9tIHRoZSBBUEkuCisgICAgICAgIC8vIEFsbCBtZW1vcnkgYnkgZGVmYXVsdCBpcyBhbHdheXMgcGFnZSBhbGlnbmVkLiBPUiBhY3R1YWxseSBwYXNzIHRoZSBhbGlnbm1lbnQKKyAgICAgICAgLy8gZG93biBpbnRvIHRoZSBrZXJuZWwgYW5kIG1ha2Uga2VybmVsIHJlc3BlY3QgdGhlIGFsaWdubWVudC4KKyAgICAgICAgLy8gRVhQRUNUX0VRKC1FSU5WQUwsIGlvbl9hbGxvY19mZChpb25mZCwgNDA5NiwgLTEsICgxIDw8IGhlYXAuaGVhcF9pZCksIDAsICZmZCkpOworCisgICAgICAgIC8vIE5VTEwgZmQKKyAgICAgICAgRVhQRUNUX0VRKC1FSU5WQUwsIGlvbl9hbGxvY19mZChpb25mZCwgNDA5NiwgMCwgKDEgPDwgaGVhcC5oZWFwX2lkKSwgMCwgbnVsbHB0cikpOwogICAgIH0KIH0KIAotVEVTVF9GKEludmFsaWRWYWx1ZXMsIGlvbl9mcmVlKQotewotICAgIC8qIGludmFsaWQgaW9uIGZkICovCi0gICAgaW50IHJldCA9IGlvbl9mcmVlKDAsIG1fdmFsaWRIYW5kbGUpOwotICAgIEVYUEVDVF9UUlVFKHJldCA9PSAtRUlOVkFMIHx8IHJldCA9PSAtRU5PVFRZKTsKLSAgICAvKiBpbnZhbGlkIGlvbiBmZCAqLwotICAgIEVYUEVDVF9FUSgtRUJBREYsIGlvbl9mcmVlKC0xLCBtX3ZhbGlkSGFuZGxlKSk7Ci0gICAgLyogemVybyBoYW5kbGUgKi8KLSAgICBFWFBFQ1RfRVEoLUVJTlZBTCwgaW9uX2ZyZWUobV9pb25GZCwgMCkpOwotICAgIC8qIGJhZCBoYW5kbGUgKi8KLSAgICBFWFBFQ1RfRVEoLUVJTlZBTCwgaW9uX2ZyZWUobV9pb25GZCwgbV9iYWRIYW5kbGUpKTsKK1RFU1RfRihJbnZhbGlkVmFsdWVzLCBpb25fcXVlcnlfaGVhcF9jbnQpIHsKKyAgICAvLyBOVUxMIGNvdW50CisgICAgRVhQRUNUX0VRKC1FSU5WQUwsIGlvbl9xdWVyeV9oZWFwX2NudChpb25mZCwgbnVsbHB0cikpOworCisgICAgaW50IGhlYXBfY291bnQ7CisgICAgLy8gYmFkIGZkCisgICAgRVhQRUNUX0VRKC1FQkFERiwgaW9uX3F1ZXJ5X2hlYXBfY250KC0xLCAmaGVhcF9jb3VudCkpOwogfQogCi1URVNUX0YoSW52YWxpZFZhbHVlcywgaW9uX21hcCkKLXsKLSAgICBpbnQgbWFwX2ZkOwotICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKK1RFU1RfRihJbnZhbGlkVmFsdWVzLCBpb25fcXVlcnlfZ2V0X2hlYXBzKSB7CisgICAgaW50IGhlYXBfY291bnQ7CisgICAgQVNTRVJUX0VRKDAsIGlvbl9xdWVyeV9oZWFwX2NudChpb25mZCwgJmhlYXBfY291bnQpKTsKKyAgICBBU1NFUlRfR1QoaGVhcF9jb3VudCwgMCk7CiAKLSAgICAvKiBpbnZhbGlkIGlvbiBmZCAqLwotICAgIGludCByZXQgPSBpb25fbWFwKDAsIG1fdmFsaWRIYW5kbGUsIDQwOTYsIFBST1RfUkVBRCwgMCwgMCwgJnB0ciwgJm1hcF9mZCk7Ci0gICAgRVhQRUNUX1RSVUUocmV0ID09IC1FSU5WQUwgfHwgcmV0ID09IC1FTk9UVFkpOwotICAgIC8qIGludmFsaWQgaW9uIGZkICovCi0gICAgRVhQRUNUX0VRKC1FQkFERiwgaW9uX21hcCgtMSwgbV92YWxpZEhhbmRsZSwgNDA5NiwgUFJPVF9SRUFELCAwLCAwLCAmcHRyLCAmbWFwX2ZkKSk7Ci0gICAgLyogemVybyBoYW5kbGUgKi8KLSAgICBFWFBFQ1RfRVEoLUVJTlZBTCwgaW9uX21hcChtX2lvbkZkLCAwLCA0MDk2LCBQUk9UX1JFQUQsIDAsIDAsICZwdHIsICZtYXBfZmQpKTsKLSAgICAvKiBiYWQgaGFuZGxlICovCi0gICAgRVhQRUNUX0VRKC1FSU5WQUwsIGlvbl9tYXAobV9pb25GZCwgbV9iYWRIYW5kbGUsIDQwOTYsIFBST1RfUkVBRCwgMCwgMCwgJnB0ciwgJm1hcF9mZCkpOwotICAgIC8qIHplcm8gbGVuZ3RoICovCi0gICAgRVhQRUNUX0VRKC1FSU5WQUwsIGlvbl9tYXAobV9pb25GZCwgbV92YWxpZEhhbmRsZSwgMCwgUFJPVF9SRUFELCAwLCAwLCAmcHRyLCAmbWFwX2ZkKSk7Ci0gICAgLyogYmFkIHByb3QgKi8KLSAgICBFWFBFQ1RfRVEoLUVJTlZBTCwgaW9uX21hcChtX2lvbkZkLCBtX3ZhbGlkSGFuZGxlLCA0MDk2LCAtMSwgMCwgMCwgJnB0ciwgJm1hcF9mZCkpOwotICAgIC8qIGJhZCBvZmZzZXQgKi8KLSAgICBFWFBFQ1RfRVEoLUVJTlZBTCwgaW9uX21hcChtX2lvbkZkLCBtX3ZhbGlkSGFuZGxlLCA0MDk2LCBQUk9UX1JFQUQsIDAsIC0xLCAmcHRyLCAmbWFwX2ZkKSk7Ci0gICAgLyogTlVMTCBwdHIgKi8KLSAgICBFWFBFQ1RfRVEoLUVJTlZBTCwgaW9uX21hcChtX2lvbkZkLCBtX3ZhbGlkSGFuZGxlLCA0MDk2LCBQUk9UX1JFQUQsIDAsIDAsIE5VTEwsICZtYXBfZmQpKTsKLSAgICAvKiBOVUxMIG1hcF9mZCAqLwotICAgIEVYUEVDVF9FUSgtRUlOVkFMLCBpb25fbWFwKG1faW9uRmQsIG1fdmFsaWRIYW5kbGUsIDQwOTYsIFBST1RfUkVBRCwgMCwgMCwgJnB0ciwgTlVMTCkpOwotfQorICAgIC8vIG51bGxwdHIgYnVmZmVycywgc3RpbGwgcmV0dXJucyBzdWNjZXNzIGJ1dCB3aXRob3V0CisgICAgLy8gdGhlIGlvbl9oZWFwX2RhdGEuCisgICAgRVhQRUNUX0VRKDAsIGlvbl9xdWVyeV9nZXRfaGVhcHMoaW9uZmQsIGhlYXBfY291bnQsIG51bGxwdHIpKTsKIAotVEVTVF9GKEludmFsaWRWYWx1ZXMsIGlvbl9zaGFyZSkKLXsKLSAgICBpbnQgc2hhcmVfZmQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPHN0cnVjdCBpb25faGVhcF9kYXRhW10+IGhlYXBzID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8c3RydWN0IGlvbl9oZWFwX2RhdGFbXT4oaGVhcF9jb3VudCk7CisgICAgLy8gYmFkIGZkCisgICAgRVhQRUNUX0VRKC1FQkFERiwgaW9uX3F1ZXJ5X2dldF9oZWFwcygtMSwgaGVhcF9jb3VudCwgaGVhcHMuZ2V0KCkpKTsKIAotICAgIC8qIGludmFsaWQgaW9uIGZkICovCi0gICAgaW50IHJldCA9IGlvbl9zaGFyZSgwLCBtX3ZhbGlkSGFuZGxlLCAmc2hhcmVfZmQpOwotICAgIEVYUEVDVF9UUlVFKHJldCA9PSAtRUlOVkFMIHx8IHJldCA9PSAtRU5PVFRZKTsKLSAgICAvKiBpbnZhbGlkIGlvbiBmZCAqLwotICAgIEVYUEVDVF9FUSgtRUJBREYsIGlvbl9zaGFyZSgtMSwgbV92YWxpZEhhbmRsZSwgJnNoYXJlX2ZkKSk7Ci0gICAgLyogemVybyBoYW5kbGUgKi8KLSAgICBFWFBFQ1RfRVEoLUVJTlZBTCwgaW9uX3NoYXJlKG1faW9uRmQsIDAsICZzaGFyZV9mZCkpOwotICAgIC8qIGJhZCBoYW5kbGUgKi8KLSAgICBFWFBFQ1RfRVEoLUVJTlZBTCwgaW9uX3NoYXJlKG1faW9uRmQsIG1fYmFkSGFuZGxlLCAmc2hhcmVfZmQpKTsKLSAgICAvKiBOVUxMIHNoYXJlX2ZkICovCi0gICAgRVhQRUNUX0VRKC1FSU5WQUwsIGlvbl9zaGFyZShtX2lvbkZkLCBtX3ZhbGlkSGFuZGxlLCBOVUxMKSk7Ci19Ci0KLVRFU1RfRihJbnZhbGlkVmFsdWVzLCBpb25faW1wb3J0KQotewotICAgIGlvbl91c2VyX2hhbmRsZV90IGhhbmRsZTsKLQotICAgIC8qIGludmFsaWQgaW9uIGZkICovCi0gICAgaW50IHJldCA9IGlvbl9pbXBvcnQoMCwgbV92YWxpZFNoYXJlRmQsICZoYW5kbGUpOwotICAgIEVYUEVDVF9UUlVFKHJldCA9PSAtRUlOVkFMIHx8IHJldCA9PSAtRU5PVFRZKTsKLSAgICAvKiBpbnZhbGlkIGlvbiBmZCAqLwotICAgIEVYUEVDVF9FUSgtRUJBREYsIGlvbl9pbXBvcnQoLTEsIG1fdmFsaWRTaGFyZUZkLCAmaGFuZGxlKSk7Ci0gICAgLyogYmFkIHNoYXJlX2ZkICovCi0gICAgRVhQRUNUX0VRKC1FSU5WQUwsIGlvbl9pbXBvcnQobV9pb25GZCwgMCwgJmhhbmRsZSkpOwotICAgIC8qIGludmFsaWQgc2hhcmVfZmQgKi8KLSAgICBFWFBFQ1RfRVEoLUVCQURGLCBpb25faW1wb3J0KG1faW9uRmQsIC0xLCAmaGFuZGxlKSk7Ci0gICAgLyogTlVMTCBoYW5kbGUgKi8KLSAgICBFWFBFQ1RfRVEoLUVJTlZBTCwgaW9uX2ltcG9ydChtX2lvbkZkLCBtX3ZhbGlkU2hhcmVGZCwgTlVMTCkpOwotfQotCi1URVNUX0YoSW52YWxpZFZhbHVlcywgaW9uX3N5bmNfZmQpCi17Ci0gICAgLyogaW52YWxpZCBpb24gZmQgKi8KLSAgICBpbnQgcmV0ID0gaW9uX3N5bmNfZmQoMCwgbV92YWxpZFNoYXJlRmQpOwotICAgIEVYUEVDVF9UUlVFKHJldCA9PSAtRUlOVkFMIHx8IHJldCA9PSAtRU5PVFRZKTsKLSAgICAvKiBpbnZhbGlkIGlvbiBmZCAqLwotICAgIEVYUEVDVF9FUSgtRUJBREYsIGlvbl9zeW5jX2ZkKC0xLCBtX3ZhbGlkU2hhcmVGZCkpOwotICAgIC8qIGJhZCBzaGFyZV9mZCAqLwotICAgIEVYUEVDVF9FUSgtRUlOVkFMLCBpb25fc3luY19mZChtX2lvbkZkLCAwKSk7Ci0gICAgLyogaW52YWxpZCBzaGFyZV9mZCAqLwotICAgIEVYUEVDVF9FUSgtRUJBREYsIGlvbl9zeW5jX2ZkKG1faW9uRmQsIC0xKSk7CisgICAgLy8gaW52YWxpZCBoZWFwIGRhdGEgcG9pbnRlcgorICAgIEVYUEVDVF9FUSgtRUZBVUxULCBpb25fcXVlcnlfZ2V0X2hlYXBzKGlvbmZkLCBoZWFwX2NvdW50LCByZWludGVycHJldF9jYXN0PHZvaWQqPigweGRlYWRmMDBkKSkpOwogfQpkaWZmIC0tZ2l0IGEvbGliaW9uL3Rlc3RzL2lvbl80LjEyLmggYi9saWJpb24vdGVzdHMvaW9uXzQuMTIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTQ1MTBjCi0tLSAvZGV2L251bGwKKysrIGIvbGliaW9uL3Rlc3RzL2lvbl80LjEyLmgKQEAgLTAsMCArMSw1MCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqCisgKioqICAgVGhpcyBoZWFkZXIgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gYSBMaW51eCBrZXJuZWwgaGVhZGVyCisgKioqICAgb2YgdGhlIHNhbWUgbmFtZSwgdG8gbWFrZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgZm9yIHVzZXJzcGFjZSB0bworICoqKiAgIGNhbGwgaW50byB0aGUga2VybmVsIGF2YWlsYWJsZSB0byBsaWJjLiAgSXQgY29udGFpbnMgb25seSBjb25zdGFudHMsCisgKioqICAgc3RydWN0dXJlcywgYW5kIG1hY3JvcyBnZW5lcmF0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgaGVhZGVyLCBhbmQgdGh1cywKKyAqKiogICBjb250YWlucyBubyBjb3B5cmlnaHRhYmxlIGluZm9ybWF0aW9uLgorICoqKgorICoqKiAgIFRvIGVkaXQgdGhlIGNvbnRlbnQgb2YgdGhpcyBoZWFkZXIsIG1vZGlmeSB0aGUgY29ycmVzcG9uZGluZworICoqKiAgIHNvdXJjZSBmaWxlIChlLmcuIHVuZGVyIGV4dGVybmFsL2tlcm5lbC1oZWFkZXJzL29yaWdpbmFsLykgdGhlbgorICoqKiAgIHJ1biBiaW9uaWMvbGliYy9rZXJuZWwvdG9vbHMvdXBkYXRlX2FsbC5weQorICoqKgorICoqKiAgIEFueSBtYW51YWwgY2hhbmdlIGhlcmUgd2lsbCBiZSBsb3N0IHRoZSBuZXh0IHRpbWUgdGhpcyBzY3JpcHQgd2lsbAorICoqKiAgIGJlIHJ1bi4gWW91J3ZlIGJlZW4gd2FybmVkIQorICoqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfVUFQSV9MSU5VWF9JT05fTkVXX0gKKyNkZWZpbmUgX1VBUElfTElOVVhfSU9OX05FV19ICisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2RlZmluZSBJT05fTlVNX0hFQVBfSURTIChzaXplb2YodW5zaWduZWQgaW50KSAqIDgpCitzdHJ1Y3QgaW9uX25ld19hbGxvY2F0aW9uX2RhdGEgeworICBfX3U2NCBsZW47CisgIF9fdTMyIGhlYXBfaWRfbWFzazsKKyAgX191MzIgZmxhZ3M7CisgIF9fdTMyIGZkOworICBfX3UzMiB1bnVzZWQ7Cit9OworI2RlZmluZSBNQVhfSEVBUF9OQU1FIDMyCitzdHJ1Y3QgaW9uX2hlYXBfZGF0YSB7CisgIGNoYXIgbmFtZVtNQVhfSEVBUF9OQU1FXTsKKyAgX191MzIgdHlwZTsKKyAgX191MzIgaGVhcF9pZDsKKyAgX191MzIgcmVzZXJ2ZWQwOworICBfX3UzMiByZXNlcnZlZDE7CisgIF9fdTMyIHJlc2VydmVkMjsKK307CitzdHJ1Y3QgaW9uX2hlYXBfcXVlcnkgeworICBfX3UzMiBjbnQ7CisgIF9fdTMyIHJlc2VydmVkMDsKKyAgX191NjQgaGVhcHM7CisgIF9fdTMyIHJlc2VydmVkMTsKKyAgX191MzIgcmVzZXJ2ZWQyOworfTsKKyNkZWZpbmUgSU9OX0lPQ19NQUdJQyAnSScKKyNkZWZpbmUgSU9OX0lPQ19ORVdfQUxMT0MgX0lPV1IoSU9OX0lPQ19NQUdJQywgMCwgc3RydWN0IGlvbl9uZXdfYWxsb2NhdGlvbl9kYXRhKQorI2RlZmluZSBJT05fSU9DX0hFQVBfUVVFUlkgX0lPV1IoSU9OX0lPQ19NQUdJQywgOCwgc3RydWN0IGlvbl9oZWFwX3F1ZXJ5KQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJpb24vdGVzdHMvaW9uX3Rlc3RfZml4dHVyZS5jcHAgYi9saWJpb24vdGVzdHMvaW9uX3Rlc3RfZml4dHVyZS5jcHAKaW5kZXggZTIwYzczMC4uOTM1ZmU1YyAxMDA2NDQKLS0tIGEvbGliaW9uL3Rlc3RzL2lvbl90ZXN0X2ZpeHR1cmUuY3BwCisrKyBiL2xpYmlvbi90ZXN0cy9pb25fdGVzdF9maXh0dXJlLmNwcApAQCAtMTUsNTkgKzE1LDI2IEBACiAgKi8KIAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KICNpbmNsdWRlIDxpb24vaW9uLmg+CiAKICNpbmNsdWRlICJpb25fdGVzdF9maXh0dXJlLmgiCiAKLUlvblRlc3Q6OklvblRlc3QoKSA6IG1faW9uRmQoLTEpCi17Ci19CitJb25UZXN0OjpJb25UZXN0KCkgOiBpb25mZCgtMSksIGlvbl9oZWFwcygpIHt9CiAKIHZvaWQgSW9uVGVzdDo6U2V0VXAoKSB7Ci0gICAgbV9pb25GZCA9IGlvbl9vcGVuKCk7Ci0gICAgQVNTRVJUX0dFKG1faW9uRmQsIDApOworICAgIGlvbmZkID0gaW9uX29wZW4oKTsKKyAgICBBU1NFUlRfR0UoaW9uZmQsIDApOworCisgICAgaW50IGhlYXBfY291bnQ7CisgICAgaW50IHJldCA9IGlvbl9xdWVyeV9oZWFwX2NudChpb25mZCwgJmhlYXBfY291bnQpOworICAgIEFTU0VSVF9FUShyZXQsIDApOworICAgIEFTU0VSVF9HVChoZWFwX2NvdW50LCAwKTsKKworICAgIGlvbl9oZWFwcy5yZXNpemUoaGVhcF9jb3VudCwge30pOworICAgIHJldCA9IGlvbl9xdWVyeV9nZXRfaGVhcHMoaW9uZmQsIGhlYXBfY291bnQsIGlvbl9oZWFwcy5kYXRhKCkpOworICAgIEFTU0VSVF9FUShyZXQsIDApOwogfQogCiB2b2lkIElvblRlc3Q6OlRlYXJEb3duKCkgewotICAgIGlvbl9jbG9zZShtX2lvbkZkKTsKLX0KLQotSW9uQWxsSGVhcHNUZXN0OjpJb25BbGxIZWFwc1Rlc3QoKSA6Ci0gICAgICAgIG1fZmlyc3RIZWFwKDApLAotICAgICAgICBtX2xhc3RIZWFwKDApLAotICAgICAgICBtX2FsbEhlYXBzKCkKLXsKLX0KLQotdm9pZCBJb25BbGxIZWFwc1Rlc3Q6OlNldFVwKCkgewotICAgIGludCBmZCA9IGlvbl9vcGVuKCk7Ci0gICAgQVNTRVJUX0dFKGZkLCAwKTsKLQotICAgIGZvciAoaW50IGkgPSAxOyBpICE9IDA7IGkgPDw9IDEpIHsKLSAgICAgICAgaW9uX3VzZXJfaGFuZGxlX3QgaGFuZGxlID0gMDsKLSAgICAgICAgaW50IHJldDsKLSAgICAgICAgcmV0ID0gaW9uX2FsbG9jKGZkLCA0MDk2LCAwLCBpLCAwLCAmaGFuZGxlKTsKLSAgICAgICAgaWYgKHJldCA9PSAwICYmIGhhbmRsZSAhPSAwKSB7Ci0gICAgICAgICAgICBpb25fZnJlZShmZCwgaGFuZGxlKTsKLSAgICAgICAgICAgIGlmICghbV9maXJzdEhlYXApIHsKLSAgICAgICAgICAgICAgICBtX2ZpcnN0SGVhcCA9IGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtX2xhc3RIZWFwID0gaTsKLSAgICAgICAgICAgIG1fYWxsSGVhcHMucHVzaF9iYWNrKGkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQVNTRVJUX0VRKC1FTk9ERVYsIHJldCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaW9uX2Nsb3NlKGZkKTsKLQotICAgIEVYUEVDVF9ORSgwVSwgbV9maXJzdEhlYXApOwotICAgIEVYUEVDVF9ORSgwVSwgbV9sYXN0SGVhcCk7Ci0KLSAgICBSZWNvcmRQcm9wZXJ0eSgiSGVhcHMiLCBtX2FsbEhlYXBzLnNpemUoKSk7Ci0gICAgSW9uVGVzdDo6U2V0VXAoKTsKLX0KLQotdm9pZCBJb25BbGxIZWFwc1Rlc3Q6OlRlYXJEb3duKCkgewotICAgIElvblRlc3Q6OlRlYXJEb3duKCk7CisgICAgaW9uX2Nsb3NlKGlvbmZkKTsKIH0KZGlmZiAtLWdpdCBhL2xpYmlvbi90ZXN0cy9pb25fdGVzdF9maXh0dXJlLmggYi9saWJpb24vdGVzdHMvaW9uX3Rlc3RfZml4dHVyZS5oCmluZGV4IDQwOTgyMTQuLjRmMjU0YjggMTAwNjQ0Ci0tLSBhL2xpYmlvbi90ZXN0cy9pb25fdGVzdF9maXh0dXJlLmgKKysrIGIvbGliaW9uL3Rlc3RzL2lvbl90ZXN0X2ZpeHR1cmUuaApAQCAtMTgsMjkgKzE4LDE5IEBACiAjZGVmaW5lIElPTl9URVNUX0ZJWFRVUkVfSF8KIAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgImlvbl80LjEyLmgiCiAKIHVzaW5nIDo6dGVzdGluZzo6VGVzdDsKIAogY2xhc3MgSW9uVGVzdCA6IHB1YmxpYyB2aXJ0dWFsIFRlc3QgewotIHB1YmxpYzoKKyAgcHVibGljOgogICAgIElvblRlc3QoKTsKLQl2aXJ0dWFsIH5Jb25UZXN0KCkge307Ci0JdmlydHVhbCB2b2lkIFNldFVwKCk7Ci0JdmlydHVhbCB2b2lkIFRlYXJEb3duKCk7Ci0JaW50IG1faW9uRmQ7Ci19OwotCi1jbGFzcyBJb25BbGxIZWFwc1Rlc3QgOiBwdWJsaWMgSW9uVGVzdCB7Ci0gcHVibGljOgotICAgIElvbkFsbEhlYXBzVGVzdCgpOwotICAgIHZpcnR1YWwgfklvbkFsbEhlYXBzVGVzdCgpIHt9OworICAgIHZpcnR1YWwgfklvblRlc3QoKXt9OwogICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpOwogICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpOwotCi0gICAgdW5zaWduZWQgaW50IG1fZmlyc3RIZWFwOwotICAgIHVuc2lnbmVkIGludCBtX2xhc3RIZWFwOwotCi0gICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQgaW50PiBtX2FsbEhlYXBzOworICAgIGludCBpb25mZDsKKyAgICBzdGQ6OnZlY3RvcjxzdHJ1Y3QgaW9uX2hlYXBfZGF0YT4gaW9uX2hlYXBzOwogfTsKIAogI2VuZGlmIC8qIElPTl9URVNUX0ZJWFRVUkVfSF8gKi8KZGlmZiAtLWdpdCBhL2xpYmlvbi90ZXN0cy9tYXBfdGVzdC5jcHAgYi9saWJpb24vdGVzdHMvbWFwX3Rlc3QuY3BwCmluZGV4IGMwMDZkYzguLmYxYjQ3YjcgMTAwNjQ0Ci0tLSBhL2xpYmlvbi90ZXN0cy9tYXBfdGVzdC5jcHAKKysrIGIvbGliaW9uL3Rlc3RzL21hcF90ZXN0LmNwcApAQCAtMTUsNjEgKzE1LDMwIEBACiAgKi8KIAogI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogCiAjaW5jbHVkZSA8aW9uL2lvbi5oPgotCiAjaW5jbHVkZSAiaW9uX3Rlc3RfZml4dHVyZS5oIgogCi1jbGFzcyBNYXAgOiBwdWJsaWMgSW9uQWxsSGVhcHNUZXN0IHsKLX07CitjbGFzcyBNYXAgOiBwdWJsaWMgSW9uVGVzdCB7fTsKIAotVEVTVF9GKE1hcCwgTWFwSGFuZGxlKQotewotICAgIHN0YXRpYyBjb25zdCBzaXplX3QgYWxsb2NhdGlvblNpemVzW10gPSB7NCoxMDI0LCA2NCoxMDI0LCAxMDI0KjEwMjQsIDIqMTAyNCoxMDI0fTsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBoZWFwTWFzayA6IG1fYWxsSGVhcHMpIHsKK1RFU1RfRihNYXAsIE1hcEZkKSB7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBhbGxvY2F0aW9uU2l6ZXNbXSA9IHs0ICogMTAyNCwgNjQgKiAxMDI0LCAxMDI0ICogMTAyNCwgMiAqIDEwMjQgKiAxMDI0fTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGhlYXAgOiBpb25faGVhcHMpIHsKICAgICAgICAgZm9yIChzaXplX3Qgc2l6ZSA6IGFsbG9jYXRpb25TaXplcykgewotICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJoZWFwICIgPDwgaGVhcE1hc2spOwotICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJzaXplICIgPDwgc2l6ZSk7Ci0gICAgICAgICAgICBpb25fdXNlcl9oYW5kbGVfdCBoYW5kbGUgPSAwOwotCi0gICAgICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jKG1faW9uRmQsIHNpemUsIDAsIGhlYXBNYXNrLCAwLCAmaGFuZGxlKSk7Ci0gICAgICAgICAgICBBU1NFUlRfVFJVRShoYW5kbGUgIT0gMCk7Ci0KLSAgICAgICAgICAgIGludCBtYXBfZmQgPSAtMTsKLSAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgKnB0ciA9IE5VTEw7Ci0gICAgICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX21hcChtX2lvbkZkLCBoYW5kbGUsIHNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIDAsICZwdHIsICZtYXBfZmQpKTsKLSAgICAgICAgICAgIEFTU0VSVF9UUlVFKHB0ciAhPSBOVUxMKTsKLSAgICAgICAgICAgIEFTU0VSVF9HRShtYXBfZmQsIDApOwotCi0gICAgICAgICAgICBBU1NFUlRfRVEoMCwgY2xvc2UobWFwX2ZkKSk7Ci0KLSAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBpb25fZnJlZShtX2lvbkZkLCBoYW5kbGUpKTsKLQotICAgICAgICAgICAgbWVtc2V0KHB0ciwgMHhhYSwgc2l6ZSk7Ci0KLSAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBtdW5tYXAocHRyLCBzaXplKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLVRFU1RfRihNYXAsIE1hcEZkKQotewotICAgIHN0YXRpYyBjb25zdCBzaXplX3QgYWxsb2NhdGlvblNpemVzW10gPSB7NCoxMDI0LCA2NCoxMDI0LCAxMDI0KjEwMjQsIDIqMTAyNCoxMDI0fTsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBoZWFwTWFzayA6IG1fYWxsSGVhcHMpIHsKLSAgICAgICAgZm9yIChzaXplX3Qgc2l6ZSA6IGFsbG9jYXRpb25TaXplcykgewotICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJoZWFwICIgPDwgaGVhcE1hc2spOworICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImhlYXA6IiA8PCBoZWFwLm5hbWUgPDwgIjoiIDw8IGhlYXAudHlwZSA8PCAiOiIgPDwgaGVhcC5oZWFwX2lkKTsKICAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAic2l6ZSAiIDw8IHNpemUpOwogICAgICAgICAgICAgaW50IG1hcF9mZCA9IC0xOwogCi0gICAgICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jX2ZkKG1faW9uRmQsIHNpemUsIDAsIGhlYXBNYXNrLCAwLCAmbWFwX2ZkKSk7CisgICAgICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jX2ZkKGlvbmZkLCBzaXplLCAwLCAoMSA8PCBoZWFwLmhlYXBfaWQpLCAwLCAmbWFwX2ZkKSk7CiAgICAgICAgICAgICBBU1NFUlRfR0UobWFwX2ZkLCAwKTsKIAotICAgICAgICAgICAgdm9pZCAqcHRyOworICAgICAgICAgICAgdm9pZCogcHRyOwogICAgICAgICAgICAgcHRyID0gbW1hcChOVUxMLCBzaXplLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBtYXBfZmQsIDApOwogICAgICAgICAgICAgQVNTRVJUX1RSVUUocHRyICE9IE5VTEwpOwotCiAgICAgICAgICAgICBBU1NFUlRfRVEoMCwgY2xvc2UobWFwX2ZkKSk7CiAKICAgICAgICAgICAgIG1lbXNldChwdHIsIDB4YWEsIHNpemUpOwpAQCAtNzksNTMgKzQ4LDUxIEBACiAgICAgfQogfQogCi1URVNUX0YoTWFwLCBNYXBPZmZzZXQpCi17Ci0gICAgZm9yICh1bnNpZ25lZCBpbnQgaGVhcE1hc2sgOiBtX2FsbEhlYXBzKSB7Ci0gICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAiaGVhcCAiIDw8IGhlYXBNYXNrKTsKK1RFU1RfRihNYXAsIE1hcE9mZnNldCkgeworICAgIGZvciAoY29uc3QgYXV0byYgaGVhcCA6IGlvbl9oZWFwcykgeworICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJoZWFwOiIgPDwgaGVhcC5uYW1lIDw8ICI6IiA8PCBoZWFwLnR5cGUgPDwgIjoiIDw8IGhlYXAuaGVhcF9pZCk7CiAgICAgICAgIGludCBtYXBfZmQgPSAtMTsKIAotICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jX2ZkKG1faW9uRmQsIFBBR0VfU0laRSAqIDIsIDAsIGhlYXBNYXNrLCAwLCAmbWFwX2ZkKSk7CisgICAgICAgIEFTU0VSVF9FUSgwLCBpb25fYWxsb2NfZmQoaW9uZmQsIGdldHBhZ2VzaXplKCkgKiAyLCAwLCAoMSA8PCBoZWFwLmhlYXBfaWQpLCAwLCAmbWFwX2ZkKSk7CiAgICAgICAgIEFTU0VSVF9HRShtYXBfZmQsIDApOwogCi0gICAgICAgIHVuc2lnbmVkIGNoYXIgKnB0cjsKLSAgICAgICAgcHRyID0gKHVuc2lnbmVkIGNoYXIgKiltbWFwKE5VTEwsIFBBR0VfU0laRSAqIDIsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIG1hcF9mZCwgMCk7CisgICAgICAgIHVuc2lnbmVkIGNoYXIqIHB0cjsKKyAgICAgICAgcHRyID0gKHVuc2lnbmVkIGNoYXIqKW1tYXAoTlVMTCwgZ2V0cGFnZXNpemUoKSAqIDIsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9mZCwgMCk7CiAgICAgICAgIEFTU0VSVF9UUlVFKHB0ciAhPSBOVUxMKTsKIAotICAgICAgICBtZW1zZXQocHRyLCAwLCBQQUdFX1NJWkUpOwotICAgICAgICBtZW1zZXQocHRyICsgUEFHRV9TSVpFLCAweGFhLCBQQUdFX1NJWkUpOworICAgICAgICBtZW1zZXQocHRyLCAwLCBnZXRwYWdlc2l6ZSgpKTsKKyAgICAgICAgbWVtc2V0KHB0ciArIGdldHBhZ2VzaXplKCksIDB4YWEsIGdldHBhZ2VzaXplKCkpOwogCi0gICAgICAgIEFTU0VSVF9FUSgwLCBtdW5tYXAocHRyLCBQQUdFX1NJWkUgKiAyKSk7CisgICAgICAgIEFTU0VSVF9FUSgwLCBtdW5tYXAocHRyLCBnZXRwYWdlc2l6ZSgpICogMikpOwogCi0gICAgICAgIHB0ciA9ICh1bnNpZ25lZCBjaGFyICopbW1hcChOVUxMLCBQQUdFX1NJWkUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIG1hcF9mZCwgUEFHRV9TSVpFKTsKKyAgICAgICAgcHRyID0gKHVuc2lnbmVkIGNoYXIqKW1tYXAoTlVMTCwgZ2V0cGFnZXNpemUoKSwgUFJPVF9SRUFEIHwgUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgbWFwX2ZkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRwYWdlc2l6ZSgpKTsKICAgICAgICAgQVNTRVJUX1RSVUUocHRyICE9IE5VTEwpOwotCiAgICAgICAgIEFTU0VSVF9FUShwdHJbMF0sIDB4YWEpOwotICAgICAgICBBU1NFUlRfRVEocHRyW1BBR0VfU0laRSAtIDFdLCAweGFhKTsKLQotICAgICAgICBBU1NFUlRfRVEoMCwgbXVubWFwKHB0ciwgUEFHRV9TSVpFKSk7Ci0KKyAgICAgICAgQVNTRVJUX0VRKHB0cltnZXRwYWdlc2l6ZSgpIC0gMV0sIDB4YWEpOworICAgICAgICBBU1NFUlRfRVEoMCwgbXVubWFwKHB0ciwgZ2V0cGFnZXNpemUoKSkpOwogICAgICAgICBBU1NFUlRfRVEoMCwgY2xvc2UobWFwX2ZkKSk7CiAgICAgfQogfQogCi1URVNUX0YoTWFwLCBNYXBDYWNoZWQpCi17Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBhbGxvY2F0aW9uU2l6ZXNbXSA9IHs0KjEwMjQsIDY0KjEwMjQsIDEwMjQqMTAyNCwgMioxMDI0KjEwMjR9OwotICAgIGZvciAodW5zaWduZWQgaW50IGhlYXBNYXNrIDogbV9hbGxIZWFwcykgeworVEVTVF9GKE1hcCwgTWFwQ2FjaGVkKSB7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBhbGxvY2F0aW9uU2l6ZXNbXSA9IHs0ICogMTAyNCwgNjQgKiAxMDI0LCAxMDI0ICogMTAyNCwgMiAqIDEwMjQgKiAxMDI0fTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGhlYXAgOiBpb25faGVhcHMpIHsKICAgICAgICAgZm9yIChzaXplX3Qgc2l6ZSA6IGFsbG9jYXRpb25TaXplcykgewotICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpIDw8ICJoZWFwICIgPDwgaGVhcE1hc2spOworICAgICAgICAgICAgU0NPUEVEX1RSQUNFKDo6dGVzdGluZzo6TWVzc2FnZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImhlYXA6IiA8PCBoZWFwLm5hbWUgPDwgIjoiIDw8IGhlYXAudHlwZSA8PCAiOiIgPDwgaGVhcC5oZWFwX2lkKTsKICAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAic2l6ZSAiIDw8IHNpemUpOwogICAgICAgICAgICAgaW50IG1hcF9mZCA9IC0xOwogICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWdzID0gSU9OX0ZMQUdfQ0FDSEVEOwogCi0gICAgICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jX2ZkKG1faW9uRmQsIHNpemUsIDAsIGhlYXBNYXNrLCBmbGFncywgJm1hcF9mZCkpOworICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvY19mZChpb25mZCwgc2l6ZSwgMCwgKDEgPDwgaGVhcC5oZWFwX2lkKSwgZmxhZ3MsICZtYXBfZmQpKTsKICAgICAgICAgICAgIEFTU0VSVF9HRShtYXBfZmQsIDApOwogCi0gICAgICAgICAgICB2b2lkICpwdHI7CisgICAgICAgICAgICB2b2lkKiBwdHI7CiAgICAgICAgICAgICBwdHIgPSBtbWFwKE5VTEwsIHNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIG1hcF9mZCwgMCk7CiAgICAgICAgICAgICBBU1NFUlRfVFJVRShwdHIgIT0gTlVMTCk7Ci0KICAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBjbG9zZShtYXBfZmQpKTsKIAogICAgICAgICAgICAgbWVtc2V0KHB0ciwgMHhhYSwgc2l6ZSk7CkBAIC0xMzUsMjMgKzEwMiwyMiBAQAogICAgIH0KIH0KIAotVEVTVF9GKE1hcCwgTWFwQ2FjaGVkTmVlZHNTeW5jKQotewotICAgIHN0YXRpYyBjb25zdCBzaXplX3QgYWxsb2NhdGlvblNpemVzW10gPSB7NCoxMDI0LCA2NCoxMDI0LCAxMDI0KjEwMjQsIDIqMTAyNCoxMDI0fTsKLSAgICBmb3IgKHVuc2lnbmVkIGludCBoZWFwTWFzayA6IG1fYWxsSGVhcHMpIHsKK1RFU1RfRihNYXAsIE1hcENhY2hlZE5lZWRzU3luYykgeworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgYWxsb2NhdGlvblNpemVzW10gPSB7NCAqIDEwMjQsIDY0ICogMTAyNCwgMTAyNCAqIDEwMjQsIDIgKiAxMDI0ICogMTAyNH07CisgICAgZm9yIChjb25zdCBhdXRvJiBoZWFwIDogaW9uX2hlYXBzKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IHNpemUgOiBhbGxvY2F0aW9uU2l6ZXMpIHsKLSAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKSA8PCAiaGVhcCAiIDw8IGhlYXBNYXNrKTsKKyAgICAgICAgICAgIFNDT1BFRF9UUkFDRSg6OnRlc3Rpbmc6Ok1lc3NhZ2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJoZWFwOiIgPDwgaGVhcC5uYW1lIDw8ICI6IiA8PCBoZWFwLnR5cGUgPDwgIjoiIDw8IGhlYXAuaGVhcF9pZCk7CiAgICAgICAgICAgICBTQ09QRURfVFJBQ0UoOjp0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgInNpemUgIiA8PCBzaXplKTsKICAgICAgICAgICAgIGludCBtYXBfZmQgPSAtMTsKICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFncyA9IElPTl9GTEFHX0NBQ0hFRCB8IElPTl9GTEFHX0NBQ0hFRF9ORUVEU19TWU5DOwogCi0gICAgICAgICAgICBBU1NFUlRfRVEoMCwgaW9uX2FsbG9jX2ZkKG1faW9uRmQsIHNpemUsIDAsIGhlYXBNYXNrLCBmbGFncywgJm1hcF9mZCkpOworICAgICAgICAgICAgQVNTRVJUX0VRKDAsIGlvbl9hbGxvY19mZChpb25mZCwgc2l6ZSwgMCwgKDEgPDwgaGVhcC5oZWFwX2lkKSwgZmxhZ3MsICZtYXBfZmQpKTsKICAgICAgICAgICAgIEFTU0VSVF9HRShtYXBfZmQsIDApOwogCi0gICAgICAgICAgICB2b2lkICpwdHI7CisgICAgICAgICAgICB2b2lkKiBwdHI7CiAgICAgICAgICAgICBwdHIgPSBtbWFwKE5VTEwsIHNpemUsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsIE1BUF9TSEFSRUQsIG1hcF9mZCwgMCk7CiAgICAgICAgICAgICBBU1NFUlRfVFJVRShwdHIgIT0gTlVMTCk7Ci0KICAgICAgICAgICAgIEFTU0VSVF9FUSgwLCBjbG9zZShtYXBfZmQpKTsKIAogICAgICAgICAgICAgbWVtc2V0KHB0ciwgMHhhYSwgc2l6ZSk7CmRpZmYgLS1naXQgYS9saWJuYXRpdmVsb2FkZXIvbmF0aXZlX2xvYWRlcl9uYW1lc3BhY2UuY3BwIGIvbGlibmF0aXZlbG9hZGVyL25hdGl2ZV9sb2FkZXJfbmFtZXNwYWNlLmNwcAppbmRleCA0YjAyMTE2Li40YWRkNmU2IDEwMDY0NAotLS0gYS9saWJuYXRpdmVsb2FkZXIvbmF0aXZlX2xvYWRlcl9uYW1lc3BhY2UuY3BwCisrKyBiL2xpYm5hdGl2ZWxvYWRlci9uYXRpdmVfbG9hZGVyX25hbWVzcGFjZS5jcHAKQEAgLTY5LDEwICs2OSwxOCBAQAogLy8gImRlZmF1bHQiIGFsd2F5cyBleGlzdHMuCiBSZXN1bHQ8TmF0aXZlTG9hZGVyTmFtZXNwYWNlPiBOYXRpdmVMb2FkZXJOYW1lc3BhY2U6OkdldFBsYXRmb3JtTmFtZXNwYWNlKGJvb2wgaXNfYnJpZGdlZCkgewogICBhdXRvIG5zID0gR2V0RXhwb3J0ZWROYW1lc3BhY2Uoa1BsYXRmb3JtTmFtZXNwYWNlTmFtZSwgaXNfYnJpZGdlZCk7Ci0gIGlmICghbnMpIHsKLSAgICBucyA9IEdldEV4cG9ydGVkTmFtZXNwYWNlKGtEZWZhdWx0TmFtZXNwYWNlTmFtZSwgaXNfYnJpZGdlZCk7CisgIGlmIChucykgcmV0dXJuIG5zOworICBucyA9IEdldEV4cG9ydGVkTmFtZXNwYWNlKGtEZWZhdWx0TmFtZXNwYWNlTmFtZSwgaXNfYnJpZGdlZCk7CisgIGlmIChucykgcmV0dXJuIG5zOworCisgIC8vIElmIG5vdGhpbmcgaXMgZm91bmQsIHJldHVybiBOYXRpdmVMb2FkZXJOYW1lc3BhY2UgY29uc3RydWN0ZWQgZnJvbSBudWxscHRyLgorICAvLyBudWxscHRyIGFsc28gbWVhbnMgZGVmYXVsdCBuYW1lc3BhY2UgdG8gdGhlIGxpbmtlci4KKyAgaWYgKCFpc19icmlkZ2VkKSB7CisgICAgcmV0dXJuIE5hdGl2ZUxvYWRlck5hbWVzcGFjZShrRGVmYXVsdE5hbWVzcGFjZU5hbWUsIHN0YXRpY19jYXN0PGFuZHJvaWRfbmFtZXNwYWNlX3QqPihudWxscHRyKSk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIE5hdGl2ZUxvYWRlck5hbWVzcGFjZShrRGVmYXVsdE5hbWVzcGFjZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxuYXRpdmVfYnJpZGdlX25hbWVzcGFjZV90Kj4obnVsbHB0cikpOwogICB9Ci0gIHJldHVybiBuczsKIH0KIAogUmVzdWx0PE5hdGl2ZUxvYWRlck5hbWVzcGFjZT4gTmF0aXZlTG9hZGVyTmFtZXNwYWNlOjpDcmVhdGUoCg==