ZGlmZiAtLWdpdCBhL0RvYy9saWJyYXJ5L211bHRpcHJvY2Vzc2luZy5yc3QgYi9Eb2MvbGlicmFyeS9tdWx0aXByb2Nlc3NpbmcucnN0CmluZGV4IDQxYTUzYzYuLmE5NDU3MWIgMTAwNjQ0Ci0tLSBhL0RvYy9saWJyYXJ5L211bHRpcHJvY2Vzc2luZy5yc3QKKysrIGIvRG9jL2xpYnJhcnkvbXVsdGlwcm9jZXNzaW5nLnJzdApAQCAtMjA4Nyw2ICsyMDg3LDM4IEBACiAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDEwKToKICAgICAgICAgICAgICAgICBQcm9jZXNzKHRhcmdldD1mLCBhcmdzPShsb2NrLCkpLnN0YXJ0KCkKIAorQmV3YXJlIHJlcGxhY2luZyBzeXMuc3RkaW4gd2l0aCBhICJmaWxlIGxpa2Ugb2JqZWN0IgorCisgICAgOm1vZDpgbXVsdGlwcm9jZXNzaW5nYCBvcmlnaW5hbGx5IHVuY29uZGl0aW9uYWxseSBjYWxsZWQ6OgorCisgICAgICAgIG9zLmNsb3NlKHN5cy5zdGRpbi5maWxlbm8oKSkKKworICAgIGluIHRoZSA6bWV0aDpgbXVsdGlwcm9jZXNzaW5nLlByb2Nlc3MuX2Jvb3RzdHJhcGAgbWV0aG9kIC0tLSB0aGlzIHJlc3VsdGVkCisgICAgaW4gaXNzdWVzIHdpdGggcHJvY2Vzc2VzLWluLXByb2Nlc3Nlcy4gVGhpcyBoYXMgYmVlbiBjaGFuZ2VkIHRvOjoKKworICAgICAgICBzeXMuc3RkaW4uY2xvc2UoKQorICAgICAgICBzeXMuc3RkaW4gPSBvcGVuKG9zLmRldm51bGwpCisKKyAgICBXaGljaCBzb2x2ZXMgdGhlIGZ1bmRhbWVudGFsIGlzc3VlIG9mIHByb2Nlc3NlcyBjb2xsaWRpbmcgd2l0aCBlYWNoIG90aGVyCisgICAgcmVzdWx0aW5nIGluIGEgYmFkIGZpbGUgZGVzY3JpcHRvciBlcnJvciwgYnV0IGludHJvZHVjZXMgYSBwb3RlbnRpYWwgZGFuZ2VyCisgICAgdG8gYXBwbGljYXRpb25zIHdoaWNoIHJlcGxhY2UgOmZ1bmM6YHN5cy5zdGRpbmAgd2l0aCBhICJmaWxlLWxpa2Ugb2JqZWN0IgorICAgIHdpdGggb3V0cHV0IGJ1ZmZlcmluZy4gIFRoaXMgZGFuZ2VyIGlzIHRoYXQgaWYgbXVsdGlwbGUgcHJvY2Vzc2VzIGNhbGwKKyAgICA6ZnVuYzpgY2xvc2UoKWAgb24gdGhpcyBmaWxlLWxpa2Ugb2JqZWN0LCBpdCBjb3VsZCByZXN1bHQgaW4gdGhlIHNhbWUKKyAgICBkYXRhIGJlaW5nIGZsdXNoZWQgdG8gdGhlIG9iamVjdCBtdWx0aXBsZSB0aW1lcywgcmVzdWx0aW5nIGluIGNvcnJ1cHRpb24uCisKKyAgICBJZiB5b3Ugd3JpdGUgYSBmaWxlLWxpa2Ugb2JqZWN0IGFuZCBpbXBsZW1lbnQgeW91ciBvd24gY2FjaGluZywgeW91IGNhbgorICAgIG1ha2UgaXQgZm9yay1zYWZlIGJ5IHN0b3JpbmcgdGhlIHBpZCB3aGVuZXZlciB5b3UgYXBwZW5kIHRvIHRoZSBjYWNoZSwKKyAgICBhbmQgZGlzY2FyZGluZyB0aGUgY2FjaGUgd2hlbiB0aGUgcGlkIGNoYW5nZXMuIEZvciBleGFtcGxlOjoKKworICAgICAgIEBwcm9wZXJ0eQorICAgICAgIGRlZiBjYWNoZShzZWxmKToKKyAgICAgICAgICAgcGlkID0gb3MuZ2V0cGlkKCkKKyAgICAgICAgICAgaWYgcGlkICE9IHNlbGYuX3BpZDoKKyAgICAgICAgICAgICAgIHNlbGYuX3BpZCA9IHBpZAorICAgICAgICAgICAgICAgc2VsZi5fY2FjaGUgPSBbXQorICAgICAgICAgICByZXR1cm4gc2VsZi5fY2FjaGUKKworICAgIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgOmlzc3VlOmA1MTU1YCwgOmlzc3VlOmA1MzEzYCBhbmQgOmlzc3VlOmA1MzMxYAogCiBXaW5kb3dzCiB+fn5+fn5+CmRpZmYgLS1naXQgYS9MaWIvbXVsdGlwcm9jZXNzaW5nL3Byb2Nlc3MucHkgYi9MaWIvbXVsdGlwcm9jZXNzaW5nL3Byb2Nlc3MucHkKaW5kZXggYjAzNDMxNy4uMGIwNGUzNiAxMDA2NDQKLS0tIGEvTGliL211bHRpcHJvY2Vzc2luZy9wcm9jZXNzLnB5CisrKyBiL0xpYi9tdWx0aXByb2Nlc3NpbmcvcHJvY2Vzcy5weQpAQCAtMjIwLDcgKzIyMCw4IEBACiAgICAgICAgICAgICBzZWxmLl9jaGlsZHJlbiA9IHNldCgpCiAgICAgICAgICAgICBzZWxmLl9jb3VudGVyID0gaXRlcnRvb2xzLmNvdW50KDEpCiAgICAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICAgICAgb3MuY2xvc2Uoc3lzLnN0ZGluLmZpbGVubygpKQorICAgICAgICAgICAgICAgIHN5cy5zdGRpbi5jbG9zZSgpCisgICAgICAgICAgICAgICAgc3lzLnN0ZGluID0gb3Blbihvcy5kZXZudWxsKQogICAgICAgICAgICAgZXhjZXB0IChPU0Vycm9yLCBWYWx1ZUVycm9yKToKICAgICAgICAgICAgICAgICBwYXNzCiAgICAgICAgICAgICBfY3VycmVudF9wcm9jZXNzID0gc2VsZgpkaWZmIC0tZ2l0IGEvTGliL3Rlc3QvdGVzdF9tdWx0aXByb2Nlc3NpbmcucHkgYi9MaWIvdGVzdC90ZXN0X211bHRpcHJvY2Vzc2luZy5weQppbmRleCAyOTMyM2E1Li41ODY0N2VkIDEwMDY0NAotLS0gYS9MaWIvdGVzdC90ZXN0X211bHRpcHJvY2Vzc2luZy5weQorKysgYi9MaWIvdGVzdC90ZXN0X211bHRpcHJvY2Vzc2luZy5weQpAQCAtMTcsNiArMTcsNyBAQAogaW1wb3J0IHNvY2tldAogaW1wb3J0IHJhbmRvbQogaW1wb3J0IGxvZ2dpbmcKK2Zyb20gU3RyaW5nSU8gaW1wb3J0IFN0cmluZ0lPCiAKIAogIyBXb3JrIGFyb3VuZCBicm9rZW4gc2VtX29wZW4gaW1wbGVtZW50YXRpb25zCkBAIC0xODI5LDcgKzE4MzAsNzMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwcm9jZXNzaW5nLmNvbm5lY3Rpb24uYW5zd2VyX2NoYWxsZW5nZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgX0Zha2VDb25uZWN0aW9uKCksIGInYWJjJykKIAotdGVzdGNhc2VzX290aGVyID0gW090aGVyVGVzdCwgVGVzdEludmFsaWRIYW5kbGVdCisjCisjIElzc3VlIDUxNTUsIDUzMTMsIDUzMzE6IFRlc3QgcHJvY2VzcyBpbiBwcm9jZXNzZXMKKyMgVmVyaWZpZXMgb3MuY2xvc2Uoc3lzLnN0ZGluLmZpbGVubykgdnMuIHN5cy5zdGRpbi5jbG9zZSgpIGJlaGF2aW9yCisjCisKK2RlZiBfVGhpc1N1YlByb2Nlc3MocSk6CisgICAgdHJ5OgorICAgICAgICBpdGVtID0gcS5nZXQoYmxvY2s9RmFsc2UpCisgICAgZXhjZXB0IFF1ZXVlLkVtcHR5OgorICAgICAgICBwYXNzCisKK2RlZiBfVGVzdFByb2Nlc3MocSk6CisgICAgcXVldWUgPSBtdWx0aXByb2Nlc3NpbmcuUXVldWUoKQorICAgIHN1YlByb2MgPSBtdWx0aXByb2Nlc3NpbmcuUHJvY2Vzcyh0YXJnZXQ9X1RoaXNTdWJQcm9jZXNzLCBhcmdzPShxdWV1ZSwpKQorICAgIHN1YlByb2Muc3RhcnQoKQorICAgIHN1YlByb2Muam9pbigpCisKK2RlZiBfYWZ1bmMoeCk6CisgICAgcmV0dXJuIHgqeAorCitkZWYgcG9vbF9pbl9wcm9jZXNzKCk6CisgICAgcG9vbCA9IG11bHRpcHJvY2Vzc2luZy5Qb29sKHByb2Nlc3Nlcz00KQorICAgIHggPSBwb29sLm1hcChfYWZ1bmMsIFsxLCAyLCAzLCA0LCA1LCA2LCA3XSkKKworY2xhc3MgX2ZpbGVfbGlrZShvYmplY3QpOgorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkZWxlZ2F0ZSk6CisgICAgICAgIHNlbGYuX2RlbGVnYXRlID0gZGVsZWdhdGUKKyAgICAgICAgc2VsZi5fcGlkID0gTm9uZQorCisgICAgQHByb3BlcnR5CisgICAgZGVmIGNhY2hlKHNlbGYpOgorICAgICAgICBwaWQgPSBvcy5nZXRwaWQoKQorICAgICAgICAjIFRoZXJlIGFyZSBubyByYWNlIGNvbmRpdGlvbnMgc2luY2UgZm9yayBrZWVwcyBvbmx5IHRoZSBydW5uaW5nIHRocmVhZAorICAgICAgICBpZiBwaWQgIT0gc2VsZi5fcGlkOgorICAgICAgICAgICAgc2VsZi5fcGlkID0gcGlkCisgICAgICAgICAgICBzZWxmLl9jYWNoZSA9IFtdCisgICAgICAgIHJldHVybiBzZWxmLl9jYWNoZQorCisgICAgZGVmIHdyaXRlKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLmNhY2hlLmFwcGVuZChkYXRhKQorCisgICAgZGVmIGZsdXNoKHNlbGYpOgorICAgICAgICBzZWxmLl9kZWxlZ2F0ZS53cml0ZSgnJy5qb2luKHNlbGYuY2FjaGUpKQorICAgICAgICBzZWxmLl9jYWNoZSA9IFtdCisKK2NsYXNzIFRlc3RTdGRpbkJhZGZpbGVkZXNjcmlwdG9yKHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICAgIGRlZiB0ZXN0X3F1ZXVlX2luX3Byb2Nlc3Moc2VsZik6CisgICAgICAgIHF1ZXVlID0gbXVsdGlwcm9jZXNzaW5nLlF1ZXVlKCkKKyAgICAgICAgcHJvYyA9IG11bHRpcHJvY2Vzc2luZy5Qcm9jZXNzKHRhcmdldD1fVGVzdFByb2Nlc3MsIGFyZ3M9KHF1ZXVlLCkpCisgICAgICAgIHByb2Muc3RhcnQoKQorICAgICAgICBwcm9jLmpvaW4oKQorCisgICAgZGVmIHRlc3RfcG9vbF9pbl9wcm9jZXNzKHNlbGYpOgorICAgICAgICBwID0gbXVsdGlwcm9jZXNzaW5nLlByb2Nlc3ModGFyZ2V0PXBvb2xfaW5fcHJvY2VzcykKKyAgICAgICAgcC5zdGFydCgpCisgICAgICAgIHAuam9pbigpCisKKyAgICBkZWYgdGVzdF9mbHVzaGluZyhzZWxmKToKKyAgICAgICAgc2lvID0gU3RyaW5nSU8oKQorICAgICAgICBmbGlrZSA9IF9maWxlX2xpa2Uoc2lvKQorICAgICAgICBmbGlrZS53cml0ZSgnZm9vJykKKyAgICAgICAgcHJvYyA9IG11bHRpcHJvY2Vzc2luZy5Qcm9jZXNzKHRhcmdldD1sYW1iZGE6IGZsaWtlLmZsdXNoKCkpCisgICAgICAgIGZsaWtlLmZsdXNoKCkKKyAgICAgICAgYXNzZXJ0IHNpby5nZXR2YWx1ZSgpID09ICdmb28nCisKK3Rlc3RjYXNlc19vdGhlciA9IFtPdGhlclRlc3QsIFRlc3RJbnZhbGlkSGFuZGxlLCBUZXN0U3RkaW5CYWRmaWxlZGVzY3JpcHRvcl0KIAogIwogIwpkaWZmIC0tZ2l0IGEvTWlzYy9BQ0tTIGIvTWlzYy9BQ0tTCmluZGV4IGIzNWNjNDcuLmI0YjA3Y2YgMTAwNjQ0Ci0tLSBhL01pc2MvQUNLUworKysgYi9NaXNjL0FDS1MKQEAgLTQ1LDYgKzQ1LDcgQEAKIFVsZiBCYXJ0ZWx0CiBOaWNrIEJhc3RpbgogSmVmZiBCYXVlcgorTWlrZSBCYXllcgogTWljaGFlbCBSIEJheAogQW50aG9ueSBCYXh0ZXIKIFNhbXVlbCBMLiBCYXllcgpAQCAtMTc4LDYgKzE3OSw3IEBACiBEZWFuIERyYWF5ZXIKIEpvaG4gRHVCb2lzCiBQYXVsIER1Ym9pcworR3JhaGFtIER1bXBsZXRvbgogUXVpbm4gRHVua2FuCiBSb2JpbiBEdW5uCiBMdWtlIER1bnN0YW4KQEAgLTUzNiw2ICs1MzgsNyBAQAogU2FudGlhZ28gUGVyZXPzbgogTWFyayBQZXJyZWdvCiBUcmV2b3IgUGVycmluCitHYWJyaWVsIGRlIFBlcnRodWlzCiBUaW0gUGV0ZXJzCiBCZW5qYW1pbiBQZXRlcnNvbgogQ2hyaXMgUGV0cmlsbGkKZGlmZiAtLWdpdCBhL01pc2MvTkVXUyBiL01pc2MvTkVXUwppbmRleCAwNzhjMzBkLi5lMGNiMzhkIDEwMDY0NAotLS0gYS9NaXNjL05FV1MKKysrIGIvTWlzYy9ORVdTCkBAIC02NSw2ICs2NSwxMCBAQAogTGlicmFyeQogLS0tLS0tLQogCistIElzc3VlcyAjNTE1NSwgNTMxMywgNTMzMTogbXVsdGlwcm9jZXNzaW5nLlByb2Nlc3MuX2Jvb3RzdHJhcCB3YXMgCisgIHVuY29uZGl0aW9uYWxseSBjYWxsaW5nICJvcy5jbG9zZShzeXMuc3RkaW4uZmlsZW5vKCkpIiByZXN1bHRpbmcgaW4gZmlsZQorICBkZXNjcmlwdG9yIGVycm9ycworCiAtIElzc3VlICM2NDE1OiBGaXhlZCB3YXJuaW5ncy53YXJuIHNhZ2ZhdWx0IG9uIGJhZCBmb3JtYXR0ZWQgc3RyaW5nLgogCiAtIElzc3VlICM2MzQ0OiBGaXhlZCBhIGNyYXNoIG9mIG1tYXAucmVhZCgpIHdoZW4gcGFzc2VkIGEgbmVnYXRpdmUgYXJndW1lbnQuCg==