ZGlmZiAtLWdpdCBhLy5iYXplbHJjIGIvLmJhemVscmMKaW5kZXggNTViZjYxMy4uYWYwYjJmZCAxMDA2NDQKLS0tIGEvLmJhemVscmMKKysrIGIvLmJhemVscmMKQEAgLTE1LDYgKzE1LDE4IEBACiAjCiAjIFRGTE0gQmF6ZWwgY29uZmlndXJhdGlvbiBmaWxlLgogCisjIFRoZSBzZW12ZXItZm9ybWF0IHZlcnNpb24gbGFiZWwgZW1iZWRkZWQgaW4gYnVpbGQgb3V0cHV0cyB3aGVuIGFuZCB3aGVyZQorIyBzdGFtcGluZyBpcyB1c2VkLiBOb3RlIFRGTE0gZG9lcyBub3QgY3VycmVudGx5IHB1Ymxpc2ggc2VtdmVyLXZlcnNpb25lZAorIyByZWxlYXNlczsgaG93ZXZlciwgdGhpcyB2YWx1ZSBpcyB1c2VkIHdoZXJlIGEgdmVyc2lvbiBsYWJlbCBpcyByZXF1aXJlZCwgc3VjaAorIyBhcyBpbiB0aGUgUHl0aG9uIGRpc3RyaWJ1dGlvbiBwYWNrYWdlLgorYnVpbGQgLS1lbWJlZF9sYWJlbD0wCisKKyMgR2V0IHN0YW1wIHZhbHVlcyBmcm9tIGEgc2NyaXB0J3Mgb3V0cHV0CitidWlsZCAtLXdvcmtzcGFjZV9zdGF0dXNfY29tbWFuZD0uL3Rvb2xzL3dvcmtzcGFjZV9zdGF0dXMuc2gKKworIyBUT0RPKGIvMzE1ODUzODIwKTogTmVlZGVkIGZvciBCYXplbCA3LjAsIHVudGlsIG1pZ3JhdGVkIHRvIGJ6bG1vZAorYnVpbGQgLS1ub2VuYWJsZV9iemxtb2QKKwogIyBVc2UgdGhlIGZvbGxvd2luZyBDKysgc3RhbmRhcmQKIGJ1aWxkIC0tY3h4b3B0IC1zdGQ9YysrMTcKIApkaWZmIC0tZ2l0IGEvLmJhemVsdmVyc2lvbiBiLy5iYXplbHZlcnNpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZjZTc3YgotLS0gL2Rldi9udWxsCisrKyBiLy5iYXplbHZlcnNpb24KQEAgLTAsMCArMSBAQAorNy4wLjAKZGlmZiAtLWdpdCBhLy5naXRodWIvbWVyZ2lmeS55bWwgYi8uZ2l0aHViL21lcmdpZnkueW1sCmluZGV4IDc5YjlmYzkuLjRkM2I2YWQgMTAwNjQ0Ci0tLSBhLy5naXRodWIvbWVyZ2lmeS55bWwKKysrIGIvLmdpdGh1Yi9tZXJnaWZ5LnltbApAQCAtMSw2ICsxLDcgQEAKIHF1ZXVlX3J1bGVzOgogICAtIG5hbWU6IGRlZmF1bHQKICAgICBjaGVja3NfdGltZW91dDogMiBoCisgICAgYnJhbmNoX3Byb3RlY3Rpb25faW5qZWN0aW9uX21vZGU6IHF1ZXVlCiAgICAgY29uZGl0aW9uczoKICAgICAgIC0gYmFzZT1tYWluCiAgICAgICAtIGxhYmVsPWNpOnJlYWR5X3RvX21lcmdlCkBAIC0xNCw3ICsxNSw2IEBACiAgICAgYWN0aW9uczoKICAgICAgIHF1ZXVlOgogICAgICAgICBuYW1lOiBkZWZhdWx0Ci0gICAgICAgIHJlcXVpcmVfYnJhbmNoX3Byb3RlY3Rpb246IHRydWUKICAgICAgICAgbWV0aG9kOiBzcXVhc2gKICAgICAgICAgY29tbWl0X21lc3NhZ2VfdGVtcGxhdGU6IHwKICAgICAgICAgICB7eyB0aXRsZSB9fSAoI3t7IG51bWJlciB9fSkKZGlmZiAtLWdpdCBhLy5naXRodWIvd29ya2Zsb3dzL2NpLnltbCBiLy5naXRodWIvd29ya2Zsb3dzL2NpLnltbAppbmRleCA4NzI4Njc1Li4xMzg2NzUxIDEwMDY0NAotLS0gYS8uZ2l0aHViL3dvcmtmbG93cy9jaS55bWwKKysrIGIvLmdpdGh1Yi93b3JrZmxvd3MvY2kueW1sCkBAIC0zNSw3ICszNSw2IEBACiAgICAgICAgIHJ1bjogfAogICAgICAgICAgIHN1ZG8gY2kvaW5zdGFsbF9iYXplbGlzay5zaAogICAgICAgICAgIHBpcDMgaW5zdGFsbCBQaWxsb3cKLSAgICAgICAgICBwaXAzIGluc3RhbGwgV2F2ZQogICAgICAgICAgIHBpcDMgaW5zdGFsbCBudW1weQogICAgICAgLSBuYW1lOiBUZXN0CiAgICAgICAgIHJ1bjogfApAQCAtNTYsNyArNTUsNiBAQAogICAgICAgICBydW46IHwKICAgICAgICAgICBzdWRvIGNpL2luc3RhbGxfYmF6ZWxpc2suc2gKICAgICAgICAgICBwaXAzIGluc3RhbGwgUGlsbG93Ci0gICAgICAgICAgcGlwMyBpbnN0YWxsIFdhdmUKICAgICAgICAgICBwaXAzIGluc3RhbGwgbnVtcHkKICAgICAgIC0gbmFtZTogVGVzdAogICAgICAgICBydW46IHwKQEAgLTc3LDggKzc1LDEyIEBACiAgICAgICAgIHJ1bjogfAogICAgICAgICAgIHN1ZG8gY2kvaW5zdGFsbF9iYXplbGlzay5zaAogICAgICAgICAgIHBpcDMgaW5zdGFsbCBQaWxsb3cKLSAgICAgICAgICBwaXAzIGluc3RhbGwgV2F2ZQogICAgICAgICAgIHBpcDMgaW5zdGFsbCBudW1weQorICAgICAgLSBuYW1lOiBGaXgga2VybmVsIG1tYXAgcm5kIGJpdHMKKyAgICAgICAgIyBBc2FuIGluIGxsdm0gMTQgcHJvdmlkZWQgaW4gdWJ1bnR1IDIyLjA0IGlzIGluY29tcGF0aWJsZSB3aXRoCisgICAgICAgICMgaGlnaC1lbnRyb3B5IEFTTFIgaW4gbXVjaCBuZXdlciBrZXJuZWxzIHRoYXQgR2l0SHViIHJ1bm5lcnMgYXJlCisgICAgICAgICMgdXNpbmcgbGVhZGluZyB0byByYW5kb20gY3Jhc2hlczogaHR0cHM6Ly9yZXZpZXdzLmxsdm0ub3JnL0QxNDgyODAKKyAgICAgICAgcnVuOiBzdWRvIHN5c2N0bCB2bS5tbWFwX3JuZF9iaXRzPTI4CiAgICAgICAtIG5hbWU6IFRlc3QKICAgICAgICAgcnVuOiB8CiAgICAgICAgICAgdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2NpX2J1aWxkL3Rlc3RfYmF6ZWxfbXNhbi5zaApAQCAtOTgsOCArMTAwLDEyIEBACiAgICAgICAgIHJ1bjogfAogICAgICAgICAgIHN1ZG8gY2kvaW5zdGFsbF9iYXplbGlzay5zaAogICAgICAgICAgIHBpcDMgaW5zdGFsbCBQaWxsb3cKLSAgICAgICAgICBwaXAzIGluc3RhbGwgV2F2ZQogICAgICAgICAgIHBpcDMgaW5zdGFsbCBudW1weQorICAgICAgLSBuYW1lOiBGaXgga2VybmVsIG1tYXAgcm5kIGJpdHMKKyAgICAgICAgIyBBc2FuIGluIGxsdm0gMTQgcHJvdmlkZWQgaW4gdWJ1bnR1IDIyLjA0IGlzIGluY29tcGF0aWJsZSB3aXRoCisgICAgICAgICMgaGlnaC1lbnRyb3B5IEFTTFIgaW4gbXVjaCBuZXdlciBrZXJuZWxzIHRoYXQgR2l0SHViIHJ1bm5lcnMgYXJlCisgICAgICAgICMgdXNpbmcgbGVhZGluZyB0byByYW5kb20gY3Jhc2hlczogaHR0cHM6Ly9yZXZpZXdzLmxsdm0ub3JnL0QxNDgyODAKKyAgICAgICAgcnVuOiBzdWRvIHN5c2N0bCB2bS5tbWFwX3JuZF9iaXRzPTI4CiAgICAgICAtIG5hbWU6IFRlc3QKICAgICAgICAgcnVuOiB8CiAgICAgICAgICAgdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2NpX2J1aWxkL3Rlc3RfYmF6ZWxfYXNhbi5zaApAQCAtMTE4LDcgKzEyNCw2IEBACiAgICAgICAtIG5hbWU6IEluc3RhbGwgZGVwZW5kZW5jaWVzCiAgICAgICAgIHJ1bjogfAogICAgICAgICAgIHBpcDMgaW5zdGFsbCBQaWxsb3cKLSAgICAgICAgICBwaXAzIGluc3RhbGwgV2F2ZQogICAgICAgICAgIHBpcDMgaW5zdGFsbCBudW1weQogICAgICAgLSBuYW1lOiBUZXN0CiAgICAgICAgIHJ1bjogfApAQCAtMTM5LDcgKzE0NCw2IEBACiAgICAgICAtIG5hbWU6IEluc3RhbGwgZGVwZW5kZW5jaWVzCiAgICAgICAgIHJ1bjogfAogICAgICAgICAgIHBpcDMgaW5zdGFsbCBQaWxsb3cKLSAgICAgICAgICBwaXAzIGluc3RhbGwgV2F2ZQogICAgICAgICAgIHBpcDMgaW5zdGFsbCBudW1weQogICAgICAgLSBuYW1lOiBUZXN0CiAgICAgICAgIHJ1bjogfApAQCAtMTYwLDcgKzE2NCw2IEBACiAgICAgICAtIG5hbWU6IEluc3RhbGwgZGVwZW5kZW5jaWVzCiAgICAgICAgIHJ1bjogfAogICAgICAgICAgIHBpcDMgaW5zdGFsbCBQaWxsb3cKLSAgICAgICAgICBwaXAzIGluc3RhbGwgV2F2ZQogICAgICAgICAgIHBpcDMgaW5zdGFsbCBudW1weQogICAgICAgLSBuYW1lOiBUZXN0CiAgICAgICAgIHJ1bjogfApAQCAtMjEzLDcgKzIxNiw2IEBACiAgICAgICAtIG5hbWU6IEluc3RhbGwgZGVwZW5kZW5jaWVzCiAgICAgICAgIHJ1bjogfAogICAgICAgICAgIHBpcDMgaW5zdGFsbCBQaWxsb3cKLSAgICAgICAgICBwaXAzIGluc3RhbGwgV2F2ZQogICAgICAgICAgIHBpcDMgaW5zdGFsbCBudW1weQogICAgICAgLSBuYW1lOiBUZXN0CiAgICAgICAgIHJ1bjogfApAQCAtMjM0LDcgKzIzNiw2IEBACiAgICAgICAtIG5hbWU6IEluc3RhbGwgZGVwZW5kZW5jaWVzCiAgICAgICAgIHJ1bjogfAogICAgICAgICAgIHBpcDMgaW5zdGFsbCBQaWxsb3cKLSAgICAgICAgICBwaXAzIGluc3RhbGwgV2F2ZQogICAgICAgICAgIHBpcDMgaW5zdGFsbCBudW1weQogICAgICAgLSBuYW1lOiBUZXN0CiAgICAgICAgIHJ1bjogfApAQCAtMjU2LDcgKzI1Nyw2IEBACiAgICAgICAtIG5hbWU6IEluc3RhbGwgZGVwZW5kZW5jaWVzCiAgICAgICAgIHJ1bjogfAogICAgICAgICAgIHBpcDMgaW5zdGFsbCBQaWxsb3cKLSAgICAgICAgICBwaXAzIGluc3RhbGwgV2F2ZQogICAgICAgICAgIHBpcDMgaW5zdGFsbCBudW1weQogICAgICAgLSBuYW1lOiBUZXN0CiAgICAgICAgIHJ1bjogfApAQCAtMjc4LDcgKzI3OCw2IEBACiAgICAgICAtIG5hbWU6IEluc3RhbGwgZGVwZW5kZW5jaWVzCiAgICAgICAgIHJ1bjogfAogICAgICAgICAgIHBpcDMgaW5zdGFsbCBQaWxsb3cKLSAgICAgICAgICBwaXAzIGluc3RhbGwgV2F2ZQogICAgICAgICAgIHBpcDMgaW5zdGFsbCBudW1weQogICAgICAgLSBuYW1lOiBUZXN0CiAgICAgICAgIHJ1bjogfApAQCAtMzAwLDcgKzI5OSw2IEBACiAgICAgICAtIG5hbWU6IEluc3RhbGwgZGVwZW5kZW5jaWVzCiAgICAgICAgIHJ1bjogfAogICAgICAgICAgIHBpcDMgaW5zdGFsbCBQaWxsb3cKLSAgICAgICAgICBwaXAzIGluc3RhbGwgV2F2ZQogICAgICAgICAgIHBpcDMgaW5zdGFsbCBudW1weQogICAgICAgLSBuYW1lOiBUZXN0CiAgICAgICAgIHJ1bjogfApkaWZmIC0tZ2l0IGEvLmdpdGh1Yi93b3JrZmxvd3MvY29ydGV4X20ueW1sIGIvLmdpdGh1Yi93b3JrZmxvd3MvY29ydGV4X20ueW1sCmluZGV4IDI2ZmU3N2QuLmExZTgxNjggMTAwNjQ0Ci0tLSBhLy5naXRodWIvd29ya2Zsb3dzL2NvcnRleF9tLnltbAorKysgYi8uZ2l0aHViL3dvcmtmbG93cy9jb3J0ZXhfbS55bWwKQEAgLTE0LDI0ICsxNCw0MCBAQAogICAjIEFsbG93IG1hbnVhbGx5IHRyaWdnZXJpbmcgb2YgdGhlIHdvcmtmbG93LgogICB3b3JrZmxvd19kaXNwYXRjaDoge30KIAorICBwdWxsX3JlcXVlc3RfdGFyZ2V0OgorICAgIHR5cGVzOgorICAgICAgLSBjbG9zZWQKKyAgICAgIC0gbGFiZWxlZAorCisgIHdvcmtmbG93X2NhbGw6CisgICAgaW5wdXRzOgorICAgICAgdHJpZ2dlci1zaGE6CisgICAgICAgIHJlcXVpcmVkOiB0cnVlCisgICAgICAgIHR5cGU6IHN0cmluZworICAgIHNlY3JldHM6CisgICAgICB0ZmxtLWJvdC10b2tlbjoKKyAgICAgICAgcmVxdWlyZWQ6IHRydWUKKwogam9iczoKICAgY29ydGV4X21fZ2VuZXJpYzoKICAgICBydW5zLW9uOiB1YnVudHUtbGF0ZXN0CiAKICAgICBpZjogfAogICAgICAgZ2l0aHViLmV2ZW50X25hbWUgPT0gJ3dvcmtmbG93X2Rpc3BhdGNoJyB8fAotICAgICAgKGdpdGh1Yi5ldmVudF9uYW1lID09ICdzY2hlZHVsZScgJiYgZ2l0aHViLnJlcG9zaXRvcnkgPT0gJ3RlbnNvcmZsb3cvdGZsaXRlLW1pY3JvJykKKyAgICAgIChnaXRodWIuZXZlbnRfbmFtZSA9PSAnc2NoZWR1bGUnICYmCisgICAgICAgZ2l0aHViLnJlcG9zaXRvcnkgPT0gJ3RlbnNvcmZsb3cvdGZsaXRlLW1pY3JvJykgfHwKKyAgICAgIChnaXRodWIuZXZlbnQuYWN0aW9uID09ICdsYWJlbGVkJyAmJgorICAgICAgIGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lID09ICdjaTpydW5fZnVsbCcpCiAKICAgICBuYW1lOiBDb3J0ZXgtTSBHZW5lcmljCiAgICAgc3RlcHM6CiAgICAgICAtIHVzZXM6IGFjdGlvbnMvc2V0dXAtcHl0aG9uQHY0Ci0gICAgICAgIHdpdGg6IAorICAgICAgICB3aXRoOgogICAgICAgICAgIHB5dGhvbi12ZXJzaW9uOiAnMy4xMCcKICAgICAgIC0gdXNlczogYWN0aW9ucy9jaGVja291dEB2MgogICAgICAgLSBuYW1lOiBJbnN0YWxsIGRlcGVuZGVuY2llcwogICAgICAgICBydW46IHwKICAgICAgICAgICBwaXAzIGluc3RhbGwgUGlsbG93Ci0gICAgICAgICAgcGlwMyBpbnN0YWxsIFdhdmUKICAgICAgICAgICBwaXAzIGluc3RhbGwgbnVtcHkKICAgICAgIC0gbmFtZTogVGVzdAogICAgICAgICBydW46IHwKQEAgLTQyLDE4ICs1OCwyMCBAQAogCiAgICAgaWY6IHwKICAgICAgIGdpdGh1Yi5ldmVudF9uYW1lID09ICd3b3JrZmxvd19kaXNwYXRjaCcgfHwKLSAgICAgIChnaXRodWIuZXZlbnRfbmFtZSA9PSAnc2NoZWR1bGUnICYmIGdpdGh1Yi5yZXBvc2l0b3J5ID09ICd0ZW5zb3JmbG93L3RmbGl0ZS1taWNybycpCisgICAgICAoZ2l0aHViLmV2ZW50X25hbWUgPT0gJ3NjaGVkdWxlJyAmJgorICAgICAgIGdpdGh1Yi5yZXBvc2l0b3J5ID09ICd0ZW5zb3JmbG93L3RmbGl0ZS1taWNybycpIHx8CisgICAgICAoZ2l0aHViLmV2ZW50LmFjdGlvbiA9PSAnbGFiZWxlZCcgJiYKKyAgICAgICBnaXRodWIuZXZlbnQubGFiZWwubmFtZSA9PSAnY2k6cnVuX2Z1bGwnKQogCiAgICAgbmFtZTogQ29ydGV4LU0gQ29yc3RvbmUgMzAwIChGVlApCiAgICAgc3RlcHM6CiAgICAgICAtIHVzZXM6IGFjdGlvbnMvc2V0dXAtcHl0aG9uQHY0Ci0gICAgICAgIHdpdGg6IAorICAgICAgICB3aXRoOgogICAgICAgICAgIHB5dGhvbi12ZXJzaW9uOiAnMy4xMCcKICAgICAgIC0gdXNlczogYWN0aW9ucy9jaGVja291dEB2MgogICAgICAgLSBuYW1lOiBJbnN0YWxsIGRlcGVuZGVuY2llcwogICAgICAgICBydW46IHwKICAgICAgICAgICBwaXAzIGluc3RhbGwgUGlsbG93Ci0gICAgICAgICAgcGlwMyBpbnN0YWxsIFdhdmUKICAgICAgICAgICBwaXAzIGluc3RhbGwgbnVtcHkKICAgICAgIC0gbmFtZTogVGVzdAogICAgICAgICBydW46IHwKZGlmZiAtLWdpdCBhLy5naXRodWIvd29ya2Zsb3dzL2dlbmVyYXRlX2ludGVncmF0aW9uX3Rlc3RzLnltbCBiLy5naXRodWIvd29ya2Zsb3dzL2dlbmVyYXRlX2ludGVncmF0aW9uX3Rlc3RzLnltbAppbmRleCA5MWM4ZjE4Li43NGVkOTQ0IDEwMDY0NAotLS0gYS8uZ2l0aHViL3dvcmtmbG93cy9nZW5lcmF0ZV9pbnRlZ3JhdGlvbl90ZXN0cy55bWwKKysrIGIvLmdpdGh1Yi93b3JrZmxvd3MvZ2VuZXJhdGVfaW50ZWdyYXRpb25fdGVzdHMueW1sCkBAIC0zMCw3ICszMCw2IEBACiAgICAgICAtIG5hbWU6IEluc3RhbGwgZGVwZW5kZW5jaWVzCiAgICAgICAgIHJ1bjogfAogICAgICAgICAgIHBpcDMgaW5zdGFsbCBQaWxsb3cKLSAgICAgICAgICBwaXAzIGluc3RhbGwgV2F2ZQogICAgICAgICAgIHBpcDMgaW5zdGFsbCBudW1weQogICAgICAgLSBuYW1lOiBUZXN0CiAgICAgICAgIHJ1bjogfApkaWZmIC0tZ2l0IGEvLmdpdGh1Yi93b3JrZmxvd3MvcHlwaV9idWlsZC55bWwgYi8uZ2l0aHViL3dvcmtmbG93cy9weXBpX2J1aWxkLnltbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmE4MDc1Ci0tLSAvZGV2L251bGwKKysrIGIvLmdpdGh1Yi93b3JrZmxvd3MvcHlwaV9idWlsZC55bWwKQEAgLTAsMCArMSw1NCBAQAorIyBZQU1MIHNjaGVtYSBmb3IgR2l0SHViIEFjdGlvbnM6CisjIGh0dHBzOi8vaGVscC5naXRodWIuY29tL2VuL2FjdGlvbnMvYXV0b21hdGluZy15b3VyLXdvcmtmbG93LXdpdGgtZ2l0aHViLWFjdGlvbnMvd29ya2Zsb3ctc3ludGF4LWZvci1naXRodWItYWN0aW9ucworIworIyBIZWxwZnVsIFlBTUwgcGFyc2VyIHRvIGNsYXJpZnkgWUFNTCBzeW50YXg6CisjIGh0dHBzOi8veWFtbC1vbmxpbmUtcGFyc2VyLmFwcHNwb3QuY29tLworIworCituYW1lOiBQeVBJIEJ1aWxkCisKK29uOgorICBzY2hlZHVsZToKKyAgICAjIDFwbSBVVEMgaXMgNmFtIG9yIDdhbSBQVCBkZXBlbmRpbmcgb24gZGF5bGlnaHQgc2F2aW5ncy4KKyAgICAtIGNyb246ICcwIDEzICogKiAqJworCisgIHdvcmtmbG93X2Rpc3BhdGNoOgorICAgIGlucHV0czoKKyAgICAgIHVwbG9hZC10eXBlOgorICAgICAgICBkZXNjcmlwdGlvbjogJ1VwbG9hZCB0eXBlJworICAgICAgICByZXF1aXJlZDogdHJ1ZQorICAgICAgICBkZWZhdWx0OiAncHlwaScKKyAgICAgICAgdHlwZTogY2hvaWNlCisgICAgICAgIG9wdGlvbnM6CisgICAgICAgICAgLSAncHlwaScKKyAgICAgICAgICAtICdubyB1cGxvYWQnCitlbnY6CisgIFRXSU5FX1BBU1NXT1JEOiAke3sgc2VjcmV0cy5QWVBJX0FQSV9LRVkgfX0KKworam9iczoKKyAgcHlwaS1idWlsZDoKKyAgICBydW5zLW9uOiB1YnVudHUtbGF0ZXN0CisgICAgc3RlcHM6CisgICAgICAtIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjIKKyAgICAgICAgd2l0aDoKKyAgICAgICAgICB0b2tlbjogJHt7IHNlY3JldHMuVEZMTV9CT1RfUkVQT19UT0tFTiB9fQorICAgICAgLSBuYW1lOiBCdWlsZCBXaGVlbCAzLjEwCisgICAgICAgIHJ1bjogfAorICAgICAgICAgIHB5dGhvbi90ZmxpdGVfbWljcm8vcHlwaV9idWlsZC5zaCBjcDMxMAorICAgICAgLSBuYW1lOiBCdWlsZCBXaGVlbCAzLjExCisgICAgICAgIHJ1bjogfAorICAgICAgICAgIHB5dGhvbi90ZmxpdGVfbWljcm8vcHlwaV9idWlsZC5zaCBjcDMxMQorICAgICAgLSBuYW1lOiBDaGVjayBEaXJlY3RvcnkgT3V0cHV0CisgICAgICAgIHJ1bjogfAorICAgICAgICAgIGxzIC1sIGJhemVsLXB5cGktb3V0CisgICAgICAtIG5hbWU6IEluc3RhbGwgVHdpbmUKKyAgICAgICAgcnVuOiB8CisgICAgICAgICAgcHl0aG9uIC1tIHBpcCBpbnN0YWxsIC0tdXBncmFkZSBwaXAgc2V0dXB0b29scyB3aGVlbAorICAgICAgICAgIHBpcCBpbnN0YWxsIHR3aW5lCisgICAgICAtIG5hbWU6IHVwbG9hZCB0byBweXBpCisgICAgICAgIGlmOiB8CisgICAgICAgICAgZ2l0aHViLmV2ZW50LmlucHV0cy51cGxvYWQtdHlwZSA9PSAncHlwaScgfHwKKyAgICAgICAgICBnaXRodWIuZXZlbnRfbmFtZSA9PSAnc2NoZWR1bGUnCisgICAgICAgIHJ1bjogfAorICAgICAgICAgIHB5dGhvbi90ZmxpdGVfbWljcm8vcHlwaV91cGxvYWQuc2ggXAorICAgICAgICAgIGJhemVsLXB5cGktb3V0L3RmbGl0ZV9taWNyby0qLndobApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhLy5naXRodWIvd29ya2Zsb3dzL3N5bmMueW1sIGIvLmdpdGh1Yi93b3JrZmxvd3Mvc3luYy55bWwKaW5kZXggZDUwNWE5ZC4uMGM1NDM0ZSAxMDA2NDQKLS0tIGEvLmdpdGh1Yi93b3JrZmxvd3Mvc3luYy55bWwKKysrIGIvLmdpdGh1Yi93b3JrZmxvd3Mvc3luYy55bWwKQEAgLTYyLDUgKzYyLDUgQEAKICAgICAgICAgICBhdXRob3I6IFRGTE0tYm90IDx0ZmxtLWdpdGh1Yi1ib3RAZ29vZ2xlLmNvbT4KICAgICAgICAgICBib2R5OiAiQlVHPWF1dG9tYXRlZCBzeW5jIGZyb20gdXBzdHJlYW1cbk5PX0NIRUNLX1RGTElURV9GSUxFUz1hdXRvbWF0ZWQgc3luYyBmcm9tIHVwc3RyZWFtIgogICAgICAgICAgIGxhYmVsczogYm90OnN5bmMtdGYsIGNpOnJ1bgotICAgICAgICAgIHJldmlld2VyczogYWR2YWl0amFpbgorICAgICAgICAgIHJldmlld2VyczogcmFzY2FuaQogCmRpZmYgLS1naXQgYS8uZ2l0aHViL3dvcmtmbG93cy90ZXN0c19lbnRyeS55bWwgYi8uZ2l0aHViL3dvcmtmbG93cy90ZXN0c19lbnRyeS55bWwKaW5kZXggMDdjZjYxNy4uMWVkNGRlMSAxMDA2NDQKLS0tIGEvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdHNfZW50cnkueW1sCisrKyBiLy5naXRodWIvd29ya2Zsb3dzL3Rlc3RzX2VudHJ5LnltbApAQCAtMjgsOSArMjgsMTAgQEAKICAgICBydW5zLW9uOiB1YnVudHUtbGF0ZXN0CiAgICAgc3RlcHM6CiAgICAgICAtIG5hbWU6IGZhaWwtd2l0aG91dC1sYWJlbHMKLSAgICAgICAgaWY6ICR7eyAhKGNvbnRhaW5zKGdpdGh1Yi5ldmVudC5wdWxsX3JlcXVlc3QubGFiZWxzLioubmFtZSwgJ2NpOnJ1bicpIHx8Ci0gICAgICAgICAgY29udGFpbnMoZ2l0aHViLmV2ZW50LnB1bGxfcmVxdWVzdC5sYWJlbHMuKi5uYW1lLCAnY2k6cmVhZHlfdG9fbWVyZ2UnKSB8fAotICAgICAgICAgIGNvbnRhaW5zKGdpdGh1Yi5ldmVudC5wdWxsX3JlcXVlc3QubGFiZWxzLioubmFtZSwgJ2NpOnJ1bl9mdWxsJykpIH19CisgICAgICAgIGlmOiBnaXRodWIuZXZlbnQuYWN0aW9uID09ICdsYWJlbGVkJyAmJgorICAgICAgICAgICEoZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUgPT0gJ2NpOnJ1bicgfHwKKyAgICAgICAgICAgIGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lID09ICdjaTpyZWFkeV90b19tZXJnZScgfHwKKyAgICAgICAgICAgIGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lID09ICdjaTpydW5fZnVsbCcpCiAgICAgICAgIHJ1bjogZXhpdCAxCiAKICAgY2ktcmVhZHktdG8tbWVyZ2U6CkBAIC02MCw3ICs2MSw4IEBACiAgICAgbmVlZHM6IGNpLXJlYWR5LXRvLW1lcmdlCiAgICAgc3RlcHM6CiAgICAgICAtIG5hbWU6IHJlbW92ZS1jaXJ1bgotICAgICAgICBpZjogJHt7IGNvbnRhaW5zKGdpdGh1Yi5ldmVudC5wdWxsX3JlcXVlc3QubGFiZWxzLioubmFtZSwgJ2NpOnJ1bicpIH19CisgICAgICAgIGlmOiBnaXRodWIuZXZlbnQuYWN0aW9uID09ICdsYWJlbGVkJyAmJgorICAgICAgICAgICAgZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUgPT0gJ2NpOnJ1bicKICAgICAgICAgdXNlczogYWN0aW9ucy9naXRodWItc2NyaXB0QHY1CiAgICAgICAgIHdpdGg6CiAgICAgICAgICAgZ2l0aHViLXRva2VuOiAke3sgc2VjcmV0cy5URkxNX0JPVF9SRVBPX1RPS0VOIH19CkBAIC03OCw3ICs4MCw4IEBACiAgICAgbmVlZHM6IGNpLXJ1bgogICAgIHN0ZXBzOgogICAgICAgLSBuYW1lOiByZW1vdmUtY2lydW4tZnVsbAotICAgICAgICBpZjogJHt7IGNvbnRhaW5zKGdpdGh1Yi5ldmVudC5wdWxsX3JlcXVlc3QubGFiZWxzLioubmFtZSwgJ2NpOnJ1bl9mdWxsJykgfX0KKyAgICAgICAgaWY6IGdpdGh1Yi5ldmVudC5hY3Rpb24gPT0gJ2xhYmVsZWQnICYmCisgICAgICAgICAgICBnaXRodWIuZXZlbnQubGFiZWwubmFtZSA9PSAnY2k6cnVuX2Z1bGwnCiAgICAgICAgIHVzZXM6IGFjdGlvbnMvZ2l0aHViLXNjcmlwdEB2NQogICAgICAgICB3aXRoOgogICAgICAgICAgIGdpdGh1Yi10b2tlbjogJHt7IHNlY3JldHMuVEZMTV9CT1RfUkVQT19UT0tFTiB9fQpAQCAtMTAyLDcgKzEwNSw3IEBACiAgICAgICAgICAgZWNobyAiUFIgZGVzY3JpcHRpb24gcmVxdWlyZXMgYSBCVUc9IGxpbmUgd2l0aCBpc3N1ZSBudW1iZXIuIgogICAgICAgICAgIGVjaG8gIlNlZSBodHRwczovL3Rlc3RpbmcuZ29vZ2xlYmxvZy5jb20vMjAxNy8wOS9jb2RlLWhlYWx0aC1wcm92aWRpbmctY29udGV4dC13aXRoLmh0bWwgZm9yIGFkZGl0aW9uYWwgY29udGV4dCIKICAgICAgICAgICBleGl0IDEKLSAgCisKICAgY2FsbC1jaToKICAgICBuZWVkczogY2ktcnVuCiAgICAgdXNlczogLi8uZ2l0aHViL3dvcmtmbG93cy9jaS55bWwKQEAgLTEyOCw3ICsxMzEsNyBAQAogICBjYWxsLWNoZWNrLXRmbGl0ZS1maWxlczoKICAgICBuZWVkczogY2ktcnVuCiAgICAgdXNlczogLi8uZ2l0aHViL3dvcmtmbG93cy9jaGVja190ZmxpdGVfZmlsZXMueW1sCi0gICAgd2l0aDogCisgICAgd2l0aDoKICAgICAgIHRyaWdnZXItc2hhOiAke3sgZ2l0aHViLmV2ZW50LnB1bGxfcmVxdWVzdC5oZWFkLnNoYSB9fQogICAgICAgcHItbnVtYmVyOiAke3sgZ2l0aHViLmV2ZW50LnB1bGxfcmVxdWVzdC5udW1iZXIgfX0KICAgICAgIHByLWJvZHk6ICR7eyBnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LmJvZHkgfX0KZGlmZiAtLWdpdCBhLy5naXRodWIvd29ya2Zsb3dzL3Rlc3RzX3Bvc3QueW1sIGIvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdHNfcG9zdC55bWwKaW5kZXggNzE5YWRhYS4uZDE1YjA5MiAxMDA2NDQKLS0tIGEvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdHNfcG9zdC55bWwKKysrIGIvLmdpdGh1Yi93b3JrZmxvd3MvdGVzdHNfcG9zdC55bWwKQEAgLTExLDQ2ICsxMSwxMiBAQAogICAgICAgLSBsYWJlbGVkCiAKIGpvYnM6Ci0gIHJpc2N2X3Bvc3RtZXJnZToKLSAgICBpZjogJHt7IGdpdGh1Yi5ldmVudC5wdWxsX3JlcXVlc3QubWVyZ2VkID09IHRydWUgfHwKLSAgICAgIGNvbnRhaW5zKGdpdGh1Yi5ldmVudC5wdWxsX3JlcXVlc3QubGFiZWxzLioubmFtZSwgJ2NpOnJ1bl9mdWxsJykgfX0KLSAgICB1c2VzOiAuLy5naXRodWIvd29ya2Zsb3dzL3Jpc2N2X3Bvc3RtZXJnZS55bWwKLSAgICB3aXRoOgotICAgICAgdHJpZ2dlci1zaGE6ICR7eyBnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LmhlYWQuc2hhIH19Ci0gICAgc2VjcmV0czoKLSAgICAgIHRmbG0tYm90LXRva2VuOiAke3sgc2VjcmV0cy5URkxNX0JPVF9QQUNLQUdFX1JFQURfVE9LRU4gfX0KLQotICB4dGVuc2FfcG9zdG1lcmdlOgotICAgIGlmOiAke3sgZ2l0aHViLmV2ZW50LnB1bGxfcmVxdWVzdC5tZXJnZWQgPT0gdHJ1ZSB8fAotICAgICAgICAgICAgY29udGFpbnMoZ2l0aHViLmV2ZW50LnB1bGxfcmVxdWVzdC5sYWJlbHMuKi5uYW1lLCAnY2k6cnVuX2Z1bGwnKSB9fQotICAgIHVzZXM6IC4vLmdpdGh1Yi93b3JrZmxvd3MveHRlbnNhX3Bvc3RtZXJnZS55bWwKLSAgICB3aXRoOgotICAgICAgdHJpZ2dlci1zaGE6ICR7eyBnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LmhlYWQuc2hhIH19Ci0gICAgc2VjcmV0czoKLSAgICAgIHRmbG0tYm90LXRva2VuOiAke3sgc2VjcmV0cy5URkxNX0JPVF9QQUNLQUdFX1JFQURfVE9LRU4gfX0KLQotICBpc3N1ZV9vbl9lcnJvcjoKLSAgICBuZWVkczogW3Jpc2N2X3Bvc3RtZXJnZSx4dGVuc2FfcG9zdG1lcmdlXQotICAgIGlmOiAke3sgYWx3YXlzKCkgJiYgY29udGFpbnMobmVlZHMuKi5yZXN1bHQsICdmYWlsdXJlJykgJiYKLSAgICAgICAgICAgICFjb250YWlucyhnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0LmxhYmVscy4qLm5hbWUsICdjaTpydW5fZnVsbCcpIH19Ci0gICAgdXNlczogLi8uZ2l0aHViL3dvcmtmbG93cy9pc3N1ZV9vbl9lcnJvci55bWwKLSAgICB3aXRoOgotICAgICAgcmVwbzogJHt7IGdpdGh1Yi5yZXBvc2l0b3J5fX0KLSAgICAgIHdvcmtmbG93OiAke3sgZ2l0aHViLndvcmtmbG93IH19Ci0gICAgICBydW5fbnVtYmVyOiAke3sgZ2l0aHViLnJ1bl9udW1iZXIgfX0KLSAgICAgIHJ1bl9pZDogJHt7IGdpdGh1Yi5ydW5faWQgfX0KLSAgICAgIGZsYWdfbGFiZWw6IGNpOmJvdF9pc3N1ZQotICAgICAgcHJfbnVtYmVyOiAke3sgZ2l0aHViLmV2ZW50Lm51bWJlciB9fQotICAgICAgcHJfbGluazogJHt7IGdpdGh1Yi5ldmVudC5wdWxsX3JlcXVlc3QuX2xpbmtzLmh0bWwuaHJlZiB9fQotICAgIHNlY3JldHM6Ci0gICAgICB0b2tlbjogJHt7IHNlY3JldHMuR0lUSFVCX1RPS0VOIH19Ci0KICAgY2lfcnVuX2Z1bGw6Ci0gICAgbmVlZHM6IFtpc3N1ZV9vbl9lcnJvcl0KICAgICBydW5zLW9uOiB1YnVudHUtbGF0ZXN0CiAgICAgc3RlcHM6CiAgICAgICAtIG5hbWU6IHJlbW92ZS1jaXJ1bi1mdWxsCi0gICAgICAgIGlmOiAke3sgY29udGFpbnMoZ2l0aHViLmV2ZW50LnB1bGxfcmVxdWVzdC5sYWJlbHMuKi5uYW1lLCAnY2k6cnVuX2Z1bGwnKSB9fQorICAgICAgICBpZjogZ2l0aHViLmV2ZW50LmFjdGlvbiA9PSAnbGFiZWxlZCcgJiYKKyAgICAgICAgICAgIGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lID09ICdjaTpydW5fZnVsbCcKICAgICAgICAgdXNlczogYWN0aW9ucy9naXRodWItc2NyaXB0QHY1CiAgICAgICAgIHdpdGg6CiAgICAgICAgICAgZ2l0aHViLXRva2VuOiAke3sgc2VjcmV0cy5URkxNX0JPVF9SRVBPX1RPS0VOIH19CkBAIC02MywzICsyOSw0OCBAQAogICAgICAgICAgICAgfSkKICAgICAgICAgY29udGludWUtb24tZXJyb3I6IHRydWUKIAorICByaXNjdl9wb3N0bWVyZ2U6CisgICAgbmVlZHM6IFtjaV9ydW5fZnVsbF0KKyAgICBpZjogYWx3YXlzKCkgJiYgZ2l0aHViLmV2ZW50LnB1bGxfcmVxdWVzdC5tZXJnZWQgPT0gdHJ1ZSB8fAorICAgICAgICAoZ2l0aHViLmV2ZW50LmFjdGlvbiA9PSAnbGFiZWxlZCcgJiYKKyAgICAgICAgIGdpdGh1Yi5ldmVudC5sYWJlbC5uYW1lID09ICdjaTpydW5fZnVsbCcpCisgICAgdXNlczogLi8uZ2l0aHViL3dvcmtmbG93cy9yaXNjdl9wb3N0bWVyZ2UueW1sCisgICAgd2l0aDoKKyAgICAgIHRyaWdnZXItc2hhOiAke3sgZ2l0aHViLmV2ZW50LnB1bGxfcmVxdWVzdC5oZWFkLnNoYSB9fQorICAgIHNlY3JldHM6CisgICAgICB0ZmxtLWJvdC10b2tlbjogJHt7IHNlY3JldHMuVEZMTV9CT1RfUEFDS0FHRV9SRUFEX1RPS0VOIH19CisKKyAgeHRlbnNhX3Bvc3RtZXJnZToKKyAgICBuZWVkczogW2NpX3J1bl9mdWxsXQorICAgIGlmOiBhbHdheXMoKSAmJiBnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0Lm1lcmdlZCA9PSB0cnVlIHx8CisgICAgICAgIChnaXRodWIuZXZlbnQuYWN0aW9uID09ICdsYWJlbGVkJyAmJgorICAgICAgICAgZ2l0aHViLmV2ZW50LmxhYmVsLm5hbWUgPT0gJ2NpOnJ1bl9mdWxsJykKKyAgICB1c2VzOiAuLy5naXRodWIvd29ya2Zsb3dzL3h0ZW5zYV9wb3N0bWVyZ2UueW1sCisgICAgd2l0aDoKKyAgICAgIHRyaWdnZXItc2hhOiAke3sgZ2l0aHViLmV2ZW50LnB1bGxfcmVxdWVzdC5oZWFkLnNoYSB9fQorICAgIHNlY3JldHM6CisgICAgICB0ZmxtLWJvdC10b2tlbjogJHt7IHNlY3JldHMuVEZMTV9CT1RfUEFDS0FHRV9SRUFEX1RPS0VOIH19CisKKyAgY29ydGV4X21fY2lfZnVsbDoKKyAgICBuZWVkczogW2NpX3J1bl9mdWxsXQorICAgIHVzZXM6IC4vLmdpdGh1Yi93b3JrZmxvd3MvY29ydGV4X20ueW1sCisgICAgd2l0aDoKKyAgICAgIHRyaWdnZXItc2hhOiAke3sgZ2l0aHViLmV2ZW50LnB1bGxfcmVxdWVzdC5oZWFkLnNoYSB9fQorICAgIHNlY3JldHM6CisgICAgICB0ZmxtLWJvdC10b2tlbjogJHt7IHNlY3JldHMuVEZMTV9CT1RfUEFDS0FHRV9SRUFEX1RPS0VOIH19CisKKyAgaXNzdWVfb25fZXJyb3I6CisgICAgbmVlZHM6IFtyaXNjdl9wb3N0bWVyZ2UsIHh0ZW5zYV9wb3N0bWVyZ2UsIGNvcnRleF9tX2NpX2Z1bGxdCisgICAgaWY6ICR7eyBhbHdheXMoKSAmJiBjb250YWlucyhuZWVkcy4qLnJlc3VsdCwgJ2ZhaWx1cmUnKSAmJgorICAgICAgICAgICAgZ2l0aHViLmV2ZW50LnB1bGxfcmVxdWVzdC5tZXJnZWQgPT0gdHJ1ZSB9fQorICAgIHVzZXM6IC4vLmdpdGh1Yi93b3JrZmxvd3MvaXNzdWVfb25fZXJyb3IueW1sCisgICAgd2l0aDoKKyAgICAgIHJlcG86ICR7eyBnaXRodWIucmVwb3NpdG9yeX19CisgICAgICB3b3JrZmxvdzogJHt7IGdpdGh1Yi53b3JrZmxvdyB9fQorICAgICAgcnVuX251bWJlcjogJHt7IGdpdGh1Yi5ydW5fbnVtYmVyIH19CisgICAgICBydW5faWQ6ICR7eyBnaXRodWIucnVuX2lkIH19CisgICAgICBmbGFnX2xhYmVsOiBjaTpib3RfaXNzdWUKKyAgICAgIHByX251bWJlcjogJHt7IGdpdGh1Yi5ldmVudC5udW1iZXIgfX0KKyAgICAgIHByX2xpbms6ICR7eyBnaXRodWIuZXZlbnQucHVsbF9yZXF1ZXN0Ll9saW5rcy5odG1sLmhyZWYgfX0KKyAgICBzZWNyZXRzOgorICAgICAgdG9rZW46ICR7eyBzZWNyZXRzLkdJVEhVQl9UT0tFTiB9fQpkaWZmIC0tZ2l0IGEvLmdpdGh1Yi93b3JrZmxvd3MveHRlbnNhX3Bvc3RtZXJnZS55bWwgYi8uZ2l0aHViL3dvcmtmbG93cy94dGVuc2FfcG9zdG1lcmdlLnltbAppbmRleCA4ZTExODhlLi5kOTFjYzk0IDEwMDY0NAotLS0gYS8uZ2l0aHViL3dvcmtmbG93cy94dGVuc2FfcG9zdG1lcmdlLnltbAorKysgYi8uZ2l0aHViL3dvcmtmbG93cy94dGVuc2FfcG9zdG1lcmdlLnltbApAQCAtMzEsNyArMzEsNyBAQAogICAgICAgLSBydW46IHwKICAgICAgICAgICBybSAtcmYgLmdpdAogICAgICAgICAgIGVjaG8gJHt7IHNlY3JldHMudGZsbS1ib3QtdG9rZW4gfX0gfCBkb2NrZXIgbG9naW4gZ2hjci5pbyAtdSB0ZmxtLWJvdCAtLXBhc3N3b3JkLXN0ZGluCi0gICAgICAgICAgZG9ja2VyIHJ1biAtLWVudiBYVEVOU0FfVE9PTFNfVkVSU0lPTj1SSS0yMDIwLjQtbGludXggLS1ybSAtdiBgcHdkYDovb3B0L3RmbGl0ZS1taWNybyBnaGNyLmlvL3RmbG0tYm90L3h0ZW5zYV94cGxvcmVyXzEzOjAuMSBcCisgICAgICAgICAgZG9ja2VyIHJ1biAtLWVudiBYVEVOU0FfVE9PTFNfVkVSU0lPTj1SSS0yMDIwLjQtbGludXggLS1ybSAtdiBgcHdkYDovb3B0L3RmbGl0ZS1taWNybyBnaGNyLmlvL3RmbG0tYm90L3h0ZW5zYV94cGxvcmVyXzEzOjAuMyBcCiAgICAgICAgICAgL2Jpbi9iYXNoIC1jIFwKICAgICAgICAgICAiY2QgL29wdCAmJiB0ZmxpdGUtbWljcm8vdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2NpX2J1aWxkL3Rlc3RfeHRlbnNhX2Z1c2lvbl9mMS5zaCBFWFRFUk5BTCB0ZmxpdGUtbWljcm8vIgogCkBAIC00Niw3ICs0Niw3IEBACiAgICAgICAtIHJ1bjogfAogICAgICAgICAgIHJtIC1yZiAuZ2l0CiAgICAgICAgICAgZWNobyAke3sgc2VjcmV0cy50ZmxtLWJvdC10b2tlbiB9fSB8IGRvY2tlciBsb2dpbiBnaGNyLmlvIC11IHRmbG0tYm90IC0tcGFzc3dvcmQtc3RkaW4KLSAgICAgICAgICBkb2NrZXIgcnVuIC0tZW52IFhURU5TQV9UT09MU19WRVJTSU9OPVJJLTIwMjAuNC1saW51eCAtLXJtIC12IGBwd2RgOi9vcHQvdGZsaXRlLW1pY3JvIGdoY3IuaW8vdGZsbS1ib3QveHRlbnNhX3hwbG9yZXJfMTM6MC4xIFwKKyAgICAgICAgICBkb2NrZXIgcnVuIC0tZW52IFhURU5TQV9UT09MU19WRVJTSU9OPVJJLTIwMjAuNC1saW51eCAtLXJtIC12IGBwd2RgOi9vcHQvdGZsaXRlLW1pY3JvIGdoY3IuaW8vdGZsbS1ib3QveHRlbnNhX3hwbG9yZXJfMTM6MC4zIFwKICAgICAgICAgICAvYmluL2Jhc2ggLWMgXAogICAgICAgICAgICJjZCAvb3B0ICYmIHRmbGl0ZS1taWNyby90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvY2lfYnVpbGQvdGVzdF94dGVuc2FfdmlzaW9uX3A2LnNoIFJVTl9URVNUUyB0ZmxpdGUtbWljcm8vIgogCkBAIC02MSw2ICs2MSw2IEBACiAgICAgICAtIHJ1bjogfAogICAgICAgICAgIHJtIC1yZiAuZ2l0CiAgICAgICAgICAgZWNobyAke3sgc2VjcmV0cy50ZmxtLWJvdC10b2tlbiB9fSB8IGRvY2tlciBsb2dpbiBnaGNyLmlvIC11IHRmbG0tYm90IC0tcGFzc3dvcmQtc3RkaW4KLSAgICAgICAgICBkb2NrZXIgcnVuIC0tZW52IFhURU5TQV9UT09MU19WRVJTSU9OPVJJLTIwMTkuMi1saW51eCAtLXJtIC12IGBwd2RgOi9vcHQvdGZsaXRlLW1pY3JvIGdoY3IuaW8vdGZsbS1ib3QveHRlbnNhX3hwbG9yZXJfMTE6MC4xIFwKKyAgICAgICAgICBkb2NrZXIgcnVuIC0tZW52IFhURU5TQV9UT09MU19WRVJTSU9OPVJJLTIwMTkuMi1saW51eCAtLXJtIC12IGBwd2RgOi9vcHQvdGZsaXRlLW1pY3JvIGdoY3IuaW8vdGZsbS1ib3QveHRlbnNhX3hwbG9yZXJfMTE6MC4yIFwKICAgICAgICAgICAvYmluL2Jhc2ggLWMgXAogICAgICAgICAgICJjZCAvb3B0ICYmIHRmbGl0ZS1taWNyby90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvY2lfYnVpbGQvdGVzdF94dGVuc2FfaGlmaW1pbmkuc2ggdGZsaXRlLW1pY3JvLyIKZGlmZiAtLWdpdCBhLy5naXRodWIvd29ya2Zsb3dzL3h0ZW5zYV9wcmVzdWJtaXQueW1sIGIvLmdpdGh1Yi93b3JrZmxvd3MveHRlbnNhX3ByZXN1Ym1pdC55bWwKaW5kZXggNThjNDI1OC4uNTE5YWZmOSAxMDA2NDQKLS0tIGEvLmdpdGh1Yi93b3JrZmxvd3MveHRlbnNhX3ByZXN1Ym1pdC55bWwKKysrIGIvLmdpdGh1Yi93b3JrZmxvd3MveHRlbnNhX3ByZXN1Ym1pdC55bWwKQEAgLTMyLDcgKzMyLDcgQEAKICAgICAgIC0gcnVuOiB8CiAgICAgICAgICAgcm0gLXJmIC5naXQKICAgICAgICAgICBlY2hvICR7eyBzZWNyZXRzLnRmbG0tYm90LXRva2VuIH19IHwgZG9ja2VyIGxvZ2luIGdoY3IuaW8gLXUgdGZsbS1ib3QgLS1wYXNzd29yZC1zdGRpbgotICAgICAgICAgIGRvY2tlciBydW4gLS1lbnYgWFRFTlNBX1RPT0xTX1ZFUlNJT049UkktMjAyMC40LWxpbnV4IC0tcm0gLXYgYHB3ZGA6L29wdC90ZmxpdGUtbWljcm8gZ2hjci5pby90ZmxtLWJvdC94dGVuc2FfeHBsb3Jlcl8xMzowLjEgXAorICAgICAgICAgIGRvY2tlciBydW4gLS1lbnYgWFRFTlNBX1RPT0xTX1ZFUlNJT049UkktMjAyMC40LWxpbnV4IC0tcm0gLXYgYHB3ZGA6L29wdC90ZmxpdGUtbWljcm8gZ2hjci5pby90ZmxtLWJvdC94dGVuc2FfeHBsb3Jlcl8xMzowLjMgXAogICAgICAgICAgIC9iaW4vYmFzaCAtYyBcCiAgICAgICAgICAgImNkIC9vcHQgJiYgdGZsaXRlLW1pY3JvL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9jaV9idWlsZC90ZXN0X3h0ZW5zYV92aXNpb25fcDYuc2ggUlVOX05PX1RFU1RTIHRmbGl0ZS1taWNyby8iCiAKQEAgLTQ3LDcgKzQ3LDcgQEAKICAgICAgIC0gcnVuOiB8CiAgICAgICAgICAgcm0gLXJmIC5naXQKICAgICAgICAgICBlY2hvICR7eyBzZWNyZXRzLnRmbG0tYm90LXRva2VuIH19IHwgZG9ja2VyIGxvZ2luIGdoY3IuaW8gLXUgdGZsbS1ib3QgLS1wYXNzd29yZC1zdGRpbgotICAgICAgICAgIGRvY2tlciBydW4gLS1lbnYgWFRFTlNBX1RPT0xTX1ZFUlNJT049UkktMjAyMi45LWxpbnV4IC0tcm0gLXYgYHB3ZGA6L29wdC90ZmxpdGUtbWljcm8gZ2hjci5pby90ZmxtLWJvdC94dGVuc2FfaGlmaTU6MC4xIFwKKyAgICAgICAgICBkb2NrZXIgcnVuIC0tZW52IFhURU5TQV9UT09MU19WRVJTSU9OPVJJLTIwMjIuOS1saW51eCAtLXJtIC12IGBwd2RgOi9vcHQvdGZsaXRlLW1pY3JvIGdoY3IuaW8vdGZsbS1ib3QveHRlbnNhX3hwbG9yZXJfaGlmaTU6MC4yIFwKICAgICAgICAgICAvYmluL2Jhc2ggLWMgXAogICAgICAgICAgICJjZCAvb3B0ICYmIHRmbGl0ZS1taWNyby90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvY2lfYnVpbGQvdGVzdF94dGVuc2FfaGlmaTUuc2ggdGZsaXRlLW1pY3JvLyIKIApAQCAtNjIsNiArNjIsNiBAQAogICAgICAgLSBydW46IHwKICAgICAgICAgICBybSAtcmYgLmdpdAogICAgICAgICAgIGVjaG8gJHt7IHNlY3JldHMudGZsbS1ib3QtdG9rZW4gfX0gfCBkb2NrZXIgbG9naW4gZ2hjci5pbyAtdSB0ZmxtLWJvdCAtLXBhc3N3b3JkLXN0ZGluCi0gICAgICAgICAgZG9ja2VyIHJ1biAtLWVudiBYVEVOU0FfVE9PTFNfVkVSU0lPTj1SSS0yMDIwLjQtbGludXggLS1ybSAtdiBgcHdkYDovb3B0L3RmbGl0ZS1taWNybyBnaGNyLmlvL3RmbG0tYm90L3h0ZW5zYV94cGxvcmVyXzEzOjAuMSBcCisgICAgICAgICAgZG9ja2VyIHJ1biAtLWVudiBYVEVOU0FfVE9PTFNfVkVSU0lPTj1SSS0yMDIwLjQtbGludXggLS1ybSAtdiBgcHdkYDovb3B0L3RmbGl0ZS1taWNybyBnaGNyLmlvL3RmbG0tYm90L3h0ZW5zYV94cGxvcmVyXzEzOjAuMyBcCiAgICAgICAgICAgL2Jpbi9iYXNoIC1jIFwKICAgICAgICAgICAiY2QgL29wdCAmJiB0ZmxpdGUtbWljcm8vdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2NpX2J1aWxkL3Rlc3RfeHRlbnNhX2hpZmkzei5zaCBFWFRFUk5BTCB0ZmxpdGUtbWljcm8vIgpkaWZmIC0tZ2l0IGEvQ09OVFJJQlVUSU5HLm1kIGIvQ09OVFJJQlVUSU5HLm1kCmluZGV4IGE0NDI1NzAuLmUxNDEwYWYgMTAwNjQ0Ci0tLSBhL0NPTlRSSUJVVElORy5tZAorKysgYi9DT05UUklCVVRJTkcubWQKQEAgLTQsMjUgKzQsMjcgQEAKIC0tPgogCiA8IS0tdHMtLT4KLSAgICogW0hvdyB0byBDb250cmlidXRlXSgjaG93LXRvLWNvbnRyaWJ1dGUpCi0gICAgICAqIFtDb250cmlidXRvciBMaWNlbnNlIEFncmVlbWVudF0oI2NvbnRyaWJ1dG9yLWxpY2Vuc2UtYWdyZWVtZW50KQotICAgICAgKiBbQ29tbXVuaXR5IEd1aWRlbGluZXNdKCNjb21tdW5pdHktZ3VpZGVsaW5lcykKLSAgICogW0NvZGUgQ29udHJpYnV0aW9uIEd1aWRlbGluZXNdKCNjb2RlLWNvbnRyaWJ1dGlvbi1ndWlkZWxpbmVzKQotICAgICAgKiBbR2VuZXJhbCBQdWxsIFJlcXVlc3QgR3VpZGVsaW5lc10oI2dlbmVyYWwtcHVsbC1yZXF1ZXN0LWd1aWRlbGluZXMpCi0gICAgICAqIFtHdWlkZWxpbmVzIGZvciBTcGVjaWZpYyBDb250cmlidXRpb24gQ2F0ZWdvcmllc10oI2d1aWRlbGluZXMtZm9yLXNwZWNpZmljLWNvbnRyaWJ1dGlvbi1jYXRlZ29yaWVzKQotICAgICAgICAgKiBbQnVnIEZpeGVzXSgjYnVnLWZpeGVzKQotICAgICAgICAgKiBbUmVmZXJlbmNlIEtlcm5lbCBJbXBsZW1lbnRhdGlvbnNdKCNyZWZlcmVuY2Uta2VybmVsLWltcGxlbWVudGF0aW9ucykKLSAgICAgICAgICogW09wdGltaXplZCBLZXJuZWwgSW1wbGVtZW50YXRpb25zXSgjb3B0aW1pemVkLWtlcm5lbC1pbXBsZW1lbnRhdGlvbnMpCi0gICAgICAgICAqIFtOZXcgVGFyZ2V0IC8gUGxhdGZvcm0gLyBJREUgLyBFeGFtcGxlc10oI25ldy10YXJnZXQtLXBsYXRmb3JtLS1pZGUtLWV4YW1wbGVzKQotICAgKiBbRGV2ZWxvcG1lbnQgV29ya2Zsb3cgTm90ZXNdKCNkZXZlbG9wbWVudC13b3JrZmxvdy1ub3RlcykKLSAgICAgICogW0luaXRpYWwgU2V0dXBdKCNpbml0aWFsLXNldHVwKQotICAgICAgKiBbQmVmb3JlIHN1Ym1pdHRpbmcgeW91ciBQUl0oI2JlZm9yZS1zdWJtaXR0aW5nLXlvdXItcHIpCi0gICAgICAqIFtEdXJpbmcgdGhlIFBSIHJldmlld10oI2R1cmluZy10aGUtcHItcmV2aWV3KQotICAgICAgKiBbUmV2aWV3ZXIgbm90ZXNdKCNyZXZpZXdlci1ub3RlcykKLSAgICAgICogW1B5dGhvbiBub3Rlc10oI3B5dGhvbi1ub3RlcykKLSAgICogW0NvbnRpbnVvdXMgSW50ZWdyYXRpb24gU3lzdGVtXSgjY29udGludW91cy1pbnRlZ3JhdGlvbi1zeXN0ZW0pCisqIFtIb3cgdG8gQ29udHJpYnV0ZV0oI2hvdy10by1jb250cmlidXRlKQorICAgKiBbQ29udHJpYnV0b3IgTGljZW5zZSBBZ3JlZW1lbnRdKCNjb250cmlidXRvci1saWNlbnNlLWFncmVlbWVudCkKKyAgICogW0NvbW11bml0eSBHdWlkZWxpbmVzXSgjY29tbXVuaXR5LWd1aWRlbGluZXMpCisqIFtDb2RlIENvbnRyaWJ1dGlvbiBHdWlkZWxpbmVzXSgjY29kZS1jb250cmlidXRpb24tZ3VpZGVsaW5lcykKKyAgICogW0dlbmVyYWwgUHVsbCBSZXF1ZXN0IEd1aWRlbGluZXNdKCNnZW5lcmFsLXB1bGwtcmVxdWVzdC1ndWlkZWxpbmVzKQorICAgKiBbR3VpZGVsaW5lcyBmb3IgU3BlY2lmaWMgQ29udHJpYnV0aW9uIENhdGVnb3JpZXNdKCNndWlkZWxpbmVzLWZvci1zcGVjaWZpYy1jb250cmlidXRpb24tY2F0ZWdvcmllcykKKyAgICAgICogW0J1ZyBGaXhlc10oI2J1Zy1maXhlcykKKyAgICAgICogW1JlZmVyZW5jZSBLZXJuZWwgSW1wbGVtZW50YXRpb25zXSgjcmVmZXJlbmNlLWtlcm5lbC1pbXBsZW1lbnRhdGlvbnMpCisgICAgICAqIFtPcHRpbWl6ZWQgS2VybmVsIEltcGxlbWVudGF0aW9uc10oI29wdGltaXplZC1rZXJuZWwtaW1wbGVtZW50YXRpb25zKQorICAgICAgKiBbTmV3IFRhcmdldCAvIFBsYXRmb3JtIC8gSURFIC8gRXhhbXBsZXNdKCNuZXctdGFyZ2V0LS1wbGF0Zm9ybS0taWRlLS1leGFtcGxlcykKKyogW0RldmVsb3BtZW50IEVudmlyb25tZW50XSgjZGV2ZWxvcG1lbnQtZW52aXJvbm1lbnQpCisgICAqIFtQcmVyZXF1aXNpdGVzXSgjcHJlcmVxdWlzaXRlcykKKyAgICogW1JlY29tbWVuZGF0aW9uc10oI3JlY29tbWVuZGF0aW9ucykKKyogW0RldmVsb3BtZW50IFdvcmtmbG93IE5vdGVzXSgjZGV2ZWxvcG1lbnQtd29ya2Zsb3ctbm90ZXMpCisgICAqIFtCZWZvcmUgc3VibWl0dGluZyB5b3VyIFBSXSgjYmVmb3JlLXN1Ym1pdHRpbmcteW91ci1wcikKKyAgICogW0R1cmluZyB0aGUgUFIgcmV2aWV3XSgjZHVyaW5nLXRoZS1wci1yZXZpZXcpCisgICAqIFtSZXZpZXdlciBub3Rlc10oI3Jldmlld2VyLW5vdGVzKQorICAgKiBbUHl0aG9uIG5vdGVzXSgjcHl0aG9uLW5vdGVzKQorKiBbQ29udGludW91cyBJbnRlZ3JhdGlvbiBTeXN0ZW1dKCNjb250aW51b3VzLWludGVncmF0aW9uLXN5c3RlbSkKIAotPCEtLSBBZGRlZCBieTogYWR2YWl0amFpbiwgYXQ6IFRodSAxNiBTZXAgMjAyMSAxMTo0Mzo0MiBBTSBQRFQgLS0+Cis8IS0tIEFkZGVkIGJ5OiBya3Vlc3RlciwgYXQ6IEZyaSBEZWMgMTUgMDQ6MjU6NDEgUE0gQ1NUIDIwMjMgLS0+CiAKIDwhLS10ZS0tPgogCkBAIC0xNDMsMTAgKzE0NSwyMCBAQAogUGxlYXNlIHNlZSB0aGUgW25ldyBwbGF0Zm9ybSBzdXBwb3J0IGd1aWRlXSh0ZW5zb3JmbG93L2xpdGUvbWljcm8vZG9jcy9uZXdfcGxhdGZvcm1fc3VwcG9ydC5tZCkKIGZvciBkb2N1bWVudGF0aW9uIG9uIGhvdyB0byBhZGQgVEZMTSBzdXBwb3J0IGZvciB5b3VyIHBhcnRpY3VsYXIgcGxhdGZvcm0uCiAKKyMgRGV2ZWxvcG1lbnQgRW52aXJvbm1lbnQKIAotIyBEZXZlbG9wbWVudCBXb3JrZmxvdyBOb3RlcworV2Ugc3VwcG9ydCBhbWQ2NC1hcmNoaXRlY3R1cmUgZGV2ZWxvcG1lbnQgYW5kIHRlc3Rpbmcgb24gVWJ1bnR1IDIyLjA0LCBhbHRob3VnaAorb3RoZXIgT1NlcyBtYXkgd29yay4KIAotIyMgSW5pdGlhbCBTZXR1cAorIyMgUHJlcmVxdWlzaXRlcworCitURkxNJ3MgcHJpbWFyeSBidWlsZCBzeXN0ZW0gaXMgW0JhemVsXShodHRwczovL2JhemVsLmJ1aWxkKS4gQWRkCitbQmF6ZWxpc2tdKGh0dHBzOi8vZ2l0aHViLmNvbS9iYXplbGJ1aWxkL2JhemVsaXNrKSBhcyB0aGUgYGJhemVsYCBleGVjdXRhYmxlIGluCit5b3VyIFBBVEggKFtlLmcuLCBjb3B5IGl0IHRvIGAvdXNyL2xvY2FsL2Jpbi9iYXplbGBdKGNpL2luc3RhbGxfYmF6ZWxpc2suc2gpKSB0bworYXV0b21hdGljYWxseSBkb3dubG9hZCBhbmQgcnVuIHRoZSBjb3JyZWN0IEJhemVsIHZlcnNpb24gYXMgc3BlY2lmaWVkIGluCitgLy8uYmF6ZWx2ZXJzaW9uYC4KKworIyMgUmVjb21tZW5kYXRpb25zCiAKIEJlbG93IGFyZSBzb21lIHRpcHMgdGhhdCBtaWdodCBiZSB1c2VmdWwgYW5kIGltcHJvdmUgdGhlIGRldmVsb3BtZW50IGV4cGVyaWVuY2UuCiAKQEAgLTE1Niw3ICsxNjgsOSBAQAogKiBDb2RlIHNlYXJjaCB0aGUgW1RmTGl0ZSBNaWNybyBjb2RlYmFzZV0oaHR0cHM6Ly9zb3VyY2VncmFwaC5jb20vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmbGl0ZS1taWNyb0BtYWluKQogICBvbiBTb3VyY2VncmFwaC4gQW5kIG9wdGlvbmFsbHkgaW5zdGFsbCB0aGUgW3BsdWdpbiB0aGF0IGVuYWJsZXMgR2l0SHViIGludGVncmF0aW9uXShodHRwczovL2RvY3Muc291cmNlZ3JhcGguY29tL2ludGVncmF0aW9uL2dpdGh1YiNnaXRodWItaW50ZWdyYXRpb24td2l0aC1zb3VyY2VncmFwaCkuCiAKLSogSW5zdGFsbCBbYmF6ZWxdKGNpL2luc3RhbGxfYmF6ZWxpc2suc2gpIGFuZCBbYnVpbGRpZmllcl0oY2kvaW5zdGFsbF9idWlsZGlmaWVyLnNoKS4KKyogSW5zdGFsbAorICBbQnVpbGRpZmllcl0oaHR0cHM6Ly9naXRodWIuY29tL2JhemVsYnVpbGQvYnVpbGR0b29scy9ibG9iL21hc3Rlci9idWlsZGlmaWVyL1JFQURNRS5tZCkKKyAgKFtlLmcuXShjaS9pbnN0YWxsX2J1aWxkaWZpZXIuc2gpKSB0byBmb3JtYXQgQmF6ZWwgQlVJTEQgYW5kIC5iemwgZmlsZXMuCiAKICogSW5zdGFsbCB0aGUgbGF0ZXN0IGNsYW5nIGFuZCBjbGFuZy1mb3JtYXQuIEZvciBleGFtcGxlLCBbaGVyZV0oY2kvRG9ja2VyZmlsZS5taWNybykKICAgaXMgdGhlIHdoYXQgd2UgZG8gZm9yIHRoZSBURkxNIGNvbnRpbnVvdXMgaW50ZWdyYXRpb24gRG9ja2VyIGNvbnRhaW5lci4KQEAgLTE2NCw4ICsxNzgsOCBAQAogKiBHZXQgYSBjb3B5IG9mIFtjcHBsaW50XShodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL3N0eWxlZ3VpZGUvdHJlZS9naC1wYWdlcy9jcHBsaW50KQogICBvciBpbnN0YWxsIGl0OgogCi0qIEluc3RhbGwgUGlsbG93IGFuZCBXYXZlLiAgRm9yIGV4YW1wbGUsIFtoZXJlXShjaS9Eb2NrZXJmaWxlLm1pY3JvKSBpcyB3aGF0IHdlCi0gIGRvIGZvciB0aGUgVEZMTSBjb250aW51b3VzIGludGVncmF0aW9uIERvY2tlciBjb250YWluZXIuCisqIEluc3RhbGwgUGlsbG93LiAgRm9yIGV4YW1wbGUsIFtoZXJlXShjaS9Eb2NrZXJmaWxlLm1pY3JvKSBpcyB3aGF0IHdlIGRvIGZvcgorICB0aGUgVEZMTSBjb250aW51b3VzIGludGVncmF0aW9uIERvY2tlciBjb250YWluZXIuCiAKICAgYGBgCiAgIHBpcCBpbnN0YWxsIGNwcGxpbnQKQEAgLTE4NCw2ICsxOTgsOCBAQAogICBjcCB0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvZGV2X3NldHVwL3ByZS1wdXNoLnRmbG0gLmdpdC9ob29rcy9wcmUtcHVzaAogICBgYGAKIAorIyBEZXZlbG9wbWVudCBXb3JrZmxvdyBOb3RlcworCiAjIyBCZWZvcmUgc3VibWl0dGluZyB5b3VyIFBSCiAKIDEuICBSdW4gaW4tcGxhY2UgY2xhbmctZm9ybWF0IG9uIGFsbCB0aGUgZmlsZXMgdGhhdCBhcmUgbW9kaWZpZWQgaW4geW91ciBnaXQKZGlmZiAtLWdpdCBhL1dPUktTUEFDRSBiL1dPUktTUEFDRQppbmRleCBmODgxZGY5Li40ODIwMmY1IDEwMDY0NAotLS0gYS9XT1JLU1BBQ0UKKysrIGIvV09SS1NQQUNFCkBAIC0xNSw1NCArMTUsNzIgQEAKIAogd29ya3NwYWNlKG5hbWUgPSAidGZsaXRlX21pY3JvIikKIAorbG9hZCgiLy90ZW5zb3JmbG93OndvcmtzcGFjZS5iemwiLCAid29ya3NwYWNlIikKKword29ya3NwYWNlKCkKKwogbG9hZCgiQGJhemVsX3Rvb2xzLy90b29scy9idWlsZF9kZWZzL3JlcG86aHR0cC5iemwiLCAiaHR0cF9hcmNoaXZlIikKIAogIyBjb21waWxlX2NvbW1hbmRzLmpzb24gZ2VuZXJhdG9yCiBodHRwX2FyY2hpdmUoCiAgICAgbmFtZSA9ICJoZWRyb25fY29tcGlsZV9jb21tYW5kcyIsCi0gICAgdXJsID0gImh0dHBzOi8vZ2l0aHViLmNvbS9oZWRyb252aXNpb24vYmF6ZWwtY29tcGlsZS1jb21tYW5kcy1leHRyYWN0b3IvYXJjaGl2ZS8xMjY2ZDZhMjUzMTRkMTY1Y2E3OGQwMDYxZDMzOTllOTA5Yjc5MjBlLnRhci5neiIsCi0gICAgc3RyaXBfcHJlZml4ID0gImJhemVsLWNvbXBpbGUtY29tbWFuZHMtZXh0cmFjdG9yLTEyNjZkNmEyNTMxNGQxNjVjYTc4ZDAwNjFkMzM5OWU5MDliNzkyMGUiLAogICAgIHNoYTI1NiA9ICJiYWNhYmZlNzU4Njc2ZmRjMTllNGJlYTdjNGEzYWM5OWM3ZTczNzhkMjU5YTlmMTA1NGQzNDFjNmE2YjQ0ZmY2IiwKKyAgICBzdHJpcF9wcmVmaXggPSAiYmF6ZWwtY29tcGlsZS1jb21tYW5kcy1leHRyYWN0b3ItMTI2NmQ2YTI1MzE0ZDE2NWNhNzhkMDA2MWQzMzk5ZTkwOWI3OTIwZSIsCisgICAgdXJsID0gImh0dHBzOi8vZ2l0aHViLmNvbS9oZWRyb252aXNpb24vYmF6ZWwtY29tcGlsZS1jb21tYW5kcy1leHRyYWN0b3IvYXJjaGl2ZS8xMjY2ZDZhMjUzMTRkMTY1Y2E3OGQwMDYxZDMzOTllOTA5Yjc5MjBlLnRhci5neiIsCiApCisKIGxvYWQoIkBoZWRyb25fY29tcGlsZV9jb21tYW5kcy8vOndvcmtzcGFjZV9zZXR1cC5iemwiLCAiaGVkcm9uX2NvbXBpbGVfY29tbWFuZHNfc2V0dXAiKQorCiBoZWRyb25fY29tcGlsZV9jb21tYW5kc19zZXR1cCgpCiAKK19ydWxlc19weXRob25fdmVyc2lvbiA9ICIwLjI2LjAiCisKIGh0dHBfYXJjaGl2ZSgKICAgICBuYW1lID0gInJ1bGVzX3B5dGhvbiIsCi0gICAgc2hhMjU2ID0gIjQ5N2NhNDczNzRmNDhjOGIwNjdkNzg2YjUxMmFjMTBhMjc2MjExODEwZjRhNTgwMTc4ZWU5YjlhZDEzOTMyM2EiLAotICAgIHN0cmlwX3ByZWZpeCA9ICJydWxlc19weXRob24tMC4xNi4xIiwKLSAgICB1cmwgPSAiaHR0cHM6Ly9naXRodWIuY29tL2JhemVsYnVpbGQvcnVsZXNfcHl0aG9uL2FyY2hpdmUvcmVmcy90YWdzLzAuMTYuMS50YXIuZ3oiLAorICAgIHNoYTI1NiA9ICI5ZDA0MDQxYWM5MmEwOTg1ZTM0NDIzNWY1ZDk0NmY3MWFjNTQzZjFiMTU2NWYyY2RiYzlhMmFhZWU4YWRmNTViIiwKKyAgICBzdHJpcF9wcmVmaXggPSAicnVsZXNfcHl0aG9uLXt9Ii5mb3JtYXQoX3J1bGVzX3B5dGhvbl92ZXJzaW9uKSwKKyAgICB1cmwgPSAiaHR0cHM6Ly9naXRodWIuY29tL2JhemVsYnVpbGQvcnVsZXNfcHl0aG9uL2FyY2hpdmUvcmVmcy90YWdzL3t9LnRhci5neiIuZm9ybWF0KF9ydWxlc19weXRob25fdmVyc2lvbiksCiApCiAKK2xvYWQoIkBydWxlc19weXRob24vL3B5dGhvbjpyZXBvc2l0b3JpZXMuYnpsIiwgInB5X3JlcG9zaXRvcmllcyIpCisKK3B5X3JlcG9zaXRvcmllcygpCisKKyMgUmVhZCB0aGUgUHl0aG9uIHBhY2thZ2UgZGVwZW5kZW5jaWVzIG9mIHRoZSBidWlsZCBlbnZpcm9ubWVudC4gVG8gbW9kaWZ5CisjIHRoZW0sIHNlZSAvL3RoaXJkX3BhcnR5OnB5dGhvbl9yZXF1aXJlbWVudHMuaW4uCiBsb2FkKCJAcnVsZXNfcHl0aG9uLy9weXRob246cGlwLmJ6bCIsICJwaXBfcGFyc2UiKQorCiBwaXBfcGFyc2UoCiAgICAgbmFtZSA9ICJ0ZmxtX3BpcF9kZXBzIiwKICAgICByZXF1aXJlbWVudHNfbG9jayA9ICIvL3RoaXJkX3BhcnR5OnB5dGhvbl9yZXF1aXJlbWVudHMudHh0IiwKICkKIAorIyBDcmVhdGUgcmVwb3NpdG9yaWVzIGZvciBlYWNoIFB5dGhvbiBwYWNrYWdlIGRlcGVuZGVuY3kuCiBsb2FkKCJAdGZsbV9waXBfZGVwcy8vOnJlcXVpcmVtZW50cy5iemwiLCAiaW5zdGFsbF9kZXBzIiwgInJlcXVpcmVtZW50IikKKwogaW5zdGFsbF9kZXBzKCkKIAotbG9hZCgiLy90ZW5zb3JmbG93OndvcmtzcGFjZS5iemwiLCAid29ya3NwYWNlIikKLXdvcmtzcGFjZSgpCi0KIGh0dHBfYXJjaGl2ZSgKLSAgbmFtZSA9ICJweWJpbmQxMV9iYXplbCIsCi0gIHN0cmlwX3ByZWZpeCA9ICJweWJpbmQxMV9iYXplbC1mYWY1NmZiM2RmMTEyODdmMjZkYmM2NmZkZWRmNjBhMmZjMmM2NjMxIiwKLSAgdXJscyA9IFsiaHR0cHM6Ly9naXRodWIuY29tL3B5YmluZC9weWJpbmQxMV9iYXplbC9hcmNoaXZlL2ZhZjU2ZmIzZGYxMTI4N2YyNmRiYzY2ZmRlZGY2MGEyZmMyYzY2MzEuemlwIl0sCi0gIHNoYTI1NiA9ICJhMTg1YWE2OGM5M2I5ZjYyYzgwZmNiM2FhZGMzYzgzYzc2Mzg1NDc1MGRjM2YzOGJlMWRhZGNiN2JlMjIzODM3IiwKKyAgICBuYW1lID0gInB5YmluZDExX2JhemVsIiwKKyAgICBzaGEyNTYgPSAiYTE4NWFhNjhjOTNiOWY2MmM4MGZjYjNhYWRjM2M4M2M3NjM4NTQ3NTBkYzNmMzhiZTFkYWRjYjdiZTIyMzgzNyIsCisgICAgc3RyaXBfcHJlZml4ID0gInB5YmluZDExX2JhemVsLWZhZjU2ZmIzZGYxMTI4N2YyNmRiYzY2ZmRlZGY2MGEyZmMyYzY2MzEiLAorICAgIHVybHMgPSBbImh0dHBzOi8vZ2l0aHViLmNvbS9weWJpbmQvcHliaW5kMTFfYmF6ZWwvYXJjaGl2ZS9mYWY1NmZiM2RmMTEyODdmMjZkYmM2NmZkZWRmNjBhMmZjMmM2NjMxLnppcCJdLAogKQogCiBodHRwX2FyY2hpdmUoCi0gIG5hbWUgPSAicHliaW5kMTEiLAotICBidWlsZF9maWxlID0gIkBweWJpbmQxMV9iYXplbC8vOnB5YmluZDExLkJVSUxEIiwKLSAgc3RyaXBfcHJlZml4ID0gInB5YmluZDExLTIuMTAuMCIsCi0gIHVybHMgPSBbImh0dHBzOi8vZ2l0aHViLmNvbS9weWJpbmQvcHliaW5kMTEvYXJjaGl2ZS9yZWZzL3RhZ3MvdjIuMTAuMC50YXIuZ3oiXSwKLSAgc2hhMjU2ID0gImVhY2Y1ODJmYThmNjk2MjI3OTg4ZDA4Y2ZjNDYxMjE3NzA4MjM4MzlmZTllMzAxYTIwZmJjZTY3ZTdjZDcwZWMiLAorICAgIG5hbWUgPSAicHliaW5kMTEiLAorICAgIGJ1aWxkX2ZpbGUgPSAiQHB5YmluZDExX2JhemVsLy86cHliaW5kMTEuQlVJTEQiLAorICAgIHNoYTI1NiA9ICJlYWNmNTgyZmE4ZjY5NjIyNzk4OGQwOGNmYzQ2MTIxNzcwODIzODM5ZmU5ZTMwMWEyMGZiY2U2N2U3Y2Q3MGVjIiwKKyAgICBzdHJpcF9wcmVmaXggPSAicHliaW5kMTEtMi4xMC4wIiwKKyAgICB1cmxzID0gWyJodHRwczovL2dpdGh1Yi5jb20vcHliaW5kL3B5YmluZDExL2FyY2hpdmUvcmVmcy90YWdzL3YyLjEwLjAudGFyLmd6Il0sCiApCiAKIGxvYWQoIkBweWJpbmQxMV9iYXplbC8vOnB5dGhvbl9jb25maWd1cmUuYnpsIiwgInB5dGhvbl9jb25maWd1cmUiKQotcHl0aG9uX2NvbmZpZ3VyZShuYW1lID0gImxvY2FsX2NvbmZpZ19weXRob24iLCBweXRob25fdmVyc2lvbiA9ICIzIikKKworcHl0aG9uX2NvbmZpZ3VyZSgKKyAgICBuYW1lID0gImxvY2FsX2NvbmZpZ19weXRob24iLAorICAgIHB5dGhvbl92ZXJzaW9uID0gIjMiLAorKQogCiBsb2FkKCIvL3B5dGhvbjpweV9wa2dfY2NfZGVwcy5iemwiLCAicHlfcGtnX2NjX2RlcHMiKQogCkBAIC03Niw1ICs5NCwxMyBAQAogICAgIG5hbWUgPSAidGVuc29yZmxvd19jY19kZXBzIiwKICAgICBpbmNsdWRlcyA9IFsidGVuc29yZmxvdy9pbmNsdWRlIl0sCiAgICAgbGlicyA9IFsidGVuc29yZmxvdy9saWJ0ZW5zb3JmbG93X2ZyYW1ld29yay5zby4yIl0sCi0gICAgcGtnID0gcmVxdWlyZW1lbnQoInRlbnNvcmZsb3ctY3B1IiksCisgICAgcGtnID0gcmVxdWlyZW1lbnQoInRlbnNvcmZsb3ciKSwKKykKKworIyBPcHRpbWl6ZWQga2VybmVsIGRlcHMKK2h0dHBfYXJjaGl2ZSgKKyAgICBuYW1lID0gIm5ubGliX2hpZmk0IiwKKyAgICBidWlsZF9maWxlID0gIkB0ZmxpdGVfbWljcm8vL3RoaXJkX3BhcnR5L3h0ZW5zYS9ubmxpYl9oaWZpNDpubmxpYl9oaWZpNC5CVUlMRCIsCisgICAgc3RyaXBfcHJlZml4ID0gIm5ubGliLWhpZmk0LTM0ZjVmOTk1ZjI4ZDI5OGFlMmI2ZTJiYTZlNzZjMzJhNWNiMzQ5ODkiLAorICAgIHVybHMgPSBbImh0dHBzOi8vZ2l0aHViLmNvbS9mb3NzLXh0ZW5zYS9ubmxpYi1oaWZpNC9hcmNoaXZlLzM0ZjVmOTk1ZjI4ZDI5OGFlMmI2ZTJiYTZlNzZjMzJhNWNiMzQ5ODkuemlwIl0sCiApCmRpZmYgLS1naXQgYS9jaS9Eb2NrZXJmaWxlLm1pY3JvIGIvY2kvRG9ja2VyZmlsZS5taWNybwppbmRleCA2Y2U3NzVlLi4wNTE1Y2NhIDEwMDY0NAotLS0gYS9jaS9Eb2NrZXJmaWxlLm1pY3JvCisrKyBiL2NpL0RvY2tlcmZpbGUubWljcm8KQEAgLTU5LDcgKzU5LDYgQEAKICMgaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZsaXRlLW1pY3JvL3B1bGwvMzM3CiAjIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmbGl0ZS1taWNyby9wdWxsLzQxMAogUlVOIHBpcCBpbnN0YWxsIFBpbGxvdwotUlVOIHBpcCBpbnN0YWxsIFdhdmUKIAogIyBuZWNlc3NhcnkgYml0cyBmb3IgY3JlYXRlX3NpemVfbG9nIHNjcmlwdHMKIFJVTiBwaXAgaW5zdGFsbCBwYW5kYXMKZGlmZiAtLWdpdCBhL2NpL0RvY2tlcmZpbGUueHRlbnNhX3hwbG9yZXJfMTEgYi9jaS9Eb2NrZXJmaWxlLnh0ZW5zYV94cGxvcmVyXzExCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhN2YzMTYKLS0tIC9kZXYvbnVsbAorKysgYi9jaS9Eb2NrZXJmaWxlLnh0ZW5zYV94cGxvcmVyXzExCkBAIC0wLDAgKzEsNDkgQEAKK0ZST00gcHl0aG9uOjMuMTAtYnVsbHNleWUKK0VOViBERUJJQU5fRlJPTlRFTkQgbm9uaW50ZXJhdGl2ZQorCitSVU4gXAorICBhcHQgdXBkYXRlICYmIFwKKyAgYXB0IGluc3RhbGwgLXkgXAorICAgIGF1dG9tYWtlIFwKKyAgICBidWlsZC1lc3NlbnRpYWwgXAorICAgIGN1cmwgXAorICAgIGdpdCBcCisgICAgdW56aXAgXAorICAgIHdnZXQKKworV09SS0RJUiAvb3B0L3h0ZW5zYQorCitDT1BZIC4vWHBsb3Jlci04LjAuMTEtbGludXgteDY0LWluc3RhbGxlci5iaW4gLgorQ09QWSAuL21pbmkxbTFtX1JJXzIwMTlfMl9saW51eF93X2tleXMudGd6IC4KK0NPUFkgLi9YdGVuc2FUb29sc19SSV8yMDIyXzlfbGludXgudGd6IC4KK0NPUFkgY2kvaW5zdGFsbF9jb3Jlc194cGxvcmVyXzExLnNoIC4KK0NPUFkgY2kvaW5zdGFsbF9iYXplbGlzay5zaCAuCisKK1JVTiBcCisgIHBpcDMgaW5zdGFsbCBQaWxsb3cKKworUlVOIFwKKyAgcGlwMyBpbnN0YWxsIG51bXB5CisKK1JVTiBcCisgIGNobW9kICt4IFhwbG9yZXItOC4wLjExLWxpbnV4LXg2NC1pbnN0YWxsZXIuYmluICYmIFwKKyAgLi9YcGxvcmVyLTguMC4xMS1saW51eC14NjQtaW5zdGFsbGVyLmJpbiAtLXByZWZpeCAvb3B0L3h0ZW5zYSAtLW1vZGUgdW5hdHRlbmRlZAorCitFTlYgWFRFTlNBX0JBU0UgIi9vcHQveHRlbnNhL1h0RGV2VG9vbHMvaW5zdGFsbC8iCisKK1JVTiBcCisgIGNobW9kICt4IGluc3RhbGxfY29yZXNfeHBsb3Jlcl8xMS5zaCAmJiBcCisgIC4vaW5zdGFsbF9jb3Jlc194cGxvcmVyXzExLnNoCisKK1JVTiAuL2luc3RhbGxfYmF6ZWxpc2suc2gKKworUlVOIFwKKyAgcm0gWHBsb3Jlci04LjAuMTEtbGludXgteDY0LWluc3RhbGxlci5iaW4gJiYgXAorICBybSBtaW5pMW0xbV9SSV8yMDE5XzJfbGludXhfd19rZXlzLnRneiAmJiBcCisgIHJtIFh0ZW5zYVRvb2xzX1JJXzIwMjJfOV9saW51eC50Z3ogJiYgXAorICBybSAtZiBpbnN0YWxsX2NvcmVzX3hwbG9yZXJfMTEuc2gKKworRU5WIExJQ19ESVIgIi9vcHQveHRlbnNhL2xpY2Vuc2VzL1JJLTIwMjAuNC1saW51eCIKK0VOViBMTV9MSUNFTlNFX0ZJTEUgIi9vcHQveHRlbnNhL2xpY2Vuc2VzL1JJLTIwMTkuMi1saW51eC9taW5pMW0xbV9SRy9taXNjL2xpY2Vuc2UuZGF0IgorCitDTUQgL29wdC94dGVuc2EvWHREZXZUb29scy9pbnN0YWxsL3Rvb2xzL1JJLTIwMjAuNC1saW51eC9YdGVuc2FUb29scy9iaW4veHQtY2xhbmcrKyAtLXh0ZW5zYS1jb3JlPQpkaWZmIC0tZ2l0IGEvY2kvRG9ja2VyZmlsZS54dGVuc2FfeHBsb3Jlcl8xMyBiL2NpL0RvY2tlcmZpbGUueHRlbnNhX3hwbG9yZXJfMTMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUwYmU2YwotLS0gL2Rldi9udWxsCisrKyBiL2NpL0RvY2tlcmZpbGUueHRlbnNhX3hwbG9yZXJfMTMKQEAgLTAsMCArMSw1MSBAQAorRlJPTSBweXRob246My4xMC1idWxsc2V5ZQorRU5WIERFQklBTl9GUk9OVEVORCBub25pbnRlcmF0aXZlCisKK1JVTiBcCisgIGFwdCB1cGRhdGUgJiYgXAorICBhcHQgaW5zdGFsbCAteSBcCisgICAgYXV0b21ha2UgXAorICAgIGJ1aWxkLWVzc2VudGlhbCBcCisgICAgY3VybCBcCisgICAgZ2l0IFwKKyAgICB1bnppcCBcCisgICAgd2dldAorCitXT1JLRElSIC9vcHQveHRlbnNhCisKK0NPUFkgLi9YcGxvcmVyLTguMC4xMy1saW51eC14NjQtaW5zdGFsbGVyLmJpbiAuCitDT1BZIC4vRjFfMTkwMzA1X3N3dXBncmFkZV9saW51eC50Z3ogLgorQ09QWSAuL1A2XzIwMDUyOF9saW51eC50Z3ogLgorQ09QWSAuL0hJRklfMTkwMzA0X3N3dXBncmFkZV9saW51eC50Z3ogLgorQ09QWSBjaS9pbnN0YWxsX2NvcmVzX3hwbG9yZXJfMTMuc2ggLgorQ09QWSBjaS9pbnN0YWxsX2JhemVsaXNrLnNoIC4KKworUlVOIFwKKyAgcGlwMyBpbnN0YWxsIFBpbGxvdworCitSVU4gXAorICBwaXAzIGluc3RhbGwgbnVtcHkKKworUlVOIFwKKyAgY2htb2QgK3ggWHBsb3Jlci04LjAuMTMtbGludXgteDY0LWluc3RhbGxlci5iaW4gJiYgXAorICAuL1hwbG9yZXItOC4wLjEzLWxpbnV4LXg2NC1pbnN0YWxsZXIuYmluIC0tcHJlZml4IC9vcHQveHRlbnNhIC0tbW9kZSB1bmF0dGVuZGVkCisKK0VOViBYVEVOU0FfQkFTRSAiL29wdC94dGVuc2EvWHREZXZUb29scy9pbnN0YWxsLyIKKworUlVOIFwKKyAgY2htb2QgK3ggaW5zdGFsbF9jb3Jlc194cGxvcmVyXzEzLnNoICYmIFwKKyAgLi9pbnN0YWxsX2NvcmVzX3hwbG9yZXJfMTMuc2gKKworUlVOIC4vaW5zdGFsbF9iYXplbGlzay5zaAorCitSVU4gXAorICBybSBYcGxvcmVyLTguMC4xMy1saW51eC14NjQtaW5zdGFsbGVyLmJpbiAmJiBcCisgIHJtIEYxXzE5MDMwNV9zd3VwZ3JhZGVfbGludXgudGd6ICYmIFwKKyAgcm0gUDZfMjAwNTI4X2xpbnV4LnRneiAmJiBcCisgIHJtIEhJRklfMTkwMzA0X3N3dXBncmFkZV9saW51eC50Z3ogJiYgXAorICBybSAtZiBpbnN0YWxsX2NvcmVzX3hwbG9yZXJfMTMuc2gKKworRU5WIExJQ19ESVIgIi9vcHQveHRlbnNhL2xpY2Vuc2VzL1JJLTIwMjAuNC1saW51eCIKK0VOViBMTV9MSUNFTlNFX0ZJTEUgIiR7TElDX0RJUn0vRjFfMTkwMzA1X3N3dXBncmFkZS9taXNjL2xpY2Vuc2UuZGF0OiR7TElDX0RJUn0vQUVfSGlGaTVfTEU1X0FPX0ZQX1hDL21pc2MvbGljZW5zZS5kYXQ6JHtMSUNfRElSfS9QNl8yMDA1MjgvbWlzYy9saWNlbnNlLmRhdDoke0xJQ19ESVJ9L0hJRklfMTkwMzA0X3N3dXBncmFkZS9taXNjL2xpY2Vuc2UuZGF0IgorCitDTUQgL29wdC94dGVuc2EvWHREZXZUb29scy9pbnN0YWxsL3Rvb2xzL1JJLTIwMjAuNC1saW51eC9YdGVuc2FUb29scy9iaW4veHQtY2xhbmcrKyAtLXh0ZW5zYS1jb3JlPQpkaWZmIC0tZ2l0IGEvY2kvRG9ja2VyZmlsZS54dGVuc2FfeHBsb3Jlcl9zb2xvIGIvY2kvRG9ja2VyZmlsZS54dGVuc2FfeHBsb3Jlcl9zb2xvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZmUyMDUKLS0tIC9kZXYvbnVsbAorKysgYi9jaS9Eb2NrZXJmaWxlLnh0ZW5zYV94cGxvcmVyX3NvbG8KQEAgLTAsMCArMSw0OSBAQAorRlJPTSBweXRob246My4xMC1idWxsc2V5ZQorRU5WIERFQklBTl9GUk9OVEVORCBub25pbnRlcmF0aXZlCisKK1JVTiBcCisgIGFwdCB1cGRhdGUgJiYgXAorICBhcHQgaW5zdGFsbCAteSBcCisgICAgYXV0b21ha2UgXAorICAgIGJ1aWxkLWVzc2VudGlhbCBcCisgICAgY3VybCBcCisgICAgZ2l0IFwKKyAgICB1bnppcCBcCisgICAgd2dldAorCitXT1JLRElSIC9vcHQveHRlbnNhCisKK0NPUFkgLi9YcGxvcmVyLXNvbG8tOS4wLjE5LWxpbnV4LXg2NC1pbnN0YWxsZXIuYmluIC4KK0NPUFkgLi9QUkRfSDVfUkRPXzA3XzAxXzIwMjJfbGludXgudGd6IC4KK0NPUFkgLi9YdGVuc2FUb29sc19SSV8yMDIyXzlfbGludXgudGd6IC4KK0NPUFkgY2kvaW5zdGFsbF9jb3Jlc194cGxvcmVyX3NvbG8uc2ggLgorQ09QWSBjaS9pbnN0YWxsX2JhemVsaXNrLnNoIC4KKworUlVOIFwKKyAgcGlwMyBpbnN0YWxsIFBpbGxvdworCitSVU4gXAorICBwaXAzIGluc3RhbGwgbnVtcHkKKworUlVOIFwKKyAgY2htb2QgK3ggWHBsb3Jlci1zb2xvLTkuMC4xOS1saW51eC14NjQtaW5zdGFsbGVyLmJpbiAmJiBcCisgIC4vWHBsb3Jlci1zb2xvLTkuMC4xOS1saW51eC14NjQtaW5zdGFsbGVyLmJpbiAtLXByZWZpeCAvb3B0L3h0ZW5zYSAtLW1vZGUgdW5hdHRlbmRlZAorCitFTlYgWFRFTlNBX0JBU0UgIi9vcHQveHRlbnNhL1h0RGV2VG9vbHMvaW5zdGFsbC8iCisKK1JVTiBcCisgIGNobW9kICt4IGluc3RhbGxfY29yZXNfeHBsb3Jlcl9zb2xvLnNoICYmIFwKKyAgLi9pbnN0YWxsX2NvcmVzX3hwbG9yZXJfc29sby5zaAorCitSVU4gLi9pbnN0YWxsX2JhemVsaXNrLnNoCisKK1JVTiBcCisgIHJtIFhwbG9yZXItc29sby05LjAuMTktbGludXgteDY0LWluc3RhbGxlci5iaW4gJiYgXAorICBybSBQUkRfSDVfUkRPXzA3XzAxXzIwMjJfbGludXgudGd6ICYmIFwKKyAgcm0gWHRlbnNhVG9vbHNfUklfMjAyMl85X2xpbnV4LnRneiAmJiBcCisgIHJtIC1mIGluc3RhbGxfY29yZXNfeHBsb3Jlcl9zb2xvLnNoCisKK0VOViBMSUNfRElSICIvb3B0L3h0ZW5zYS9saWNlbnNlcy9SSS0yMDIwLjQtbGludXgiCitFTlYgTE1fTElDRU5TRV9GSUxFICIvb3B0L3h0ZW5zYS9saWNlbnNlcy9SSS0yMDIyLjktbGludXgvUFJEX0g1X1JET18wN18wMV8yMDIyL21pc2MvbGljZW5zZS5kYXQiCisKK0NNRCAvb3B0L3h0ZW5zYS9YdERldlRvb2xzL2luc3RhbGwvdG9vbHMvUkktMjAyMC40LWxpbnV4L1h0ZW5zYVRvb2xzL2Jpbi94dC1jbGFuZysrIC0teHRlbnNhLWNvcmU9CmRpZmYgLS1naXQgYS9jaS9mbGF0YnVmZmVyc19mb3JfdGZfc3luYy9CVUlMRCBiL2NpL2ZsYXRidWZmZXJzX2Zvcl90Zl9zeW5jL0JVSUxECmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmJhYjNmLi4wMDAwMDAwCi0tLSBhL2NpL2ZsYXRidWZmZXJzX2Zvcl90Zl9zeW5jL0JVSUxECisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIyBUaGlzIGVtcHR5IEJVSUxEIGZpbGUgaXMgcmVxdWlyZWQgdG8gbWFrZSBCYXplbCB0cmVhdCB0aGlzIGRpcmVjdG9yeSBhcyBhIHBhY2thZ2UuCmRpZmYgLS1naXQgYS9jaS9mbGF0YnVmZmVyc19mb3JfdGZfc3luYy9CVUlMRC5zeXN0ZW0gYi9jaS9mbGF0YnVmZmVyc19mb3JfdGZfc3luYy9CVUlMRC5zeXN0ZW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZTRkN2EuLjAwMDAwMDAKLS0tIGEvY2kvZmxhdGJ1ZmZlcnNfZm9yX3RmX3N5bmMvQlVJTEQuc3lzdGVtCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotbGljZW5zZXMoWyJub3RpY2UiXSkgICMgQXBhY2hlIDIuMAotCi1maWxlZ3JvdXAoCi0gICAgbmFtZSA9ICJMSUNFTlNFLnR4dCIsCi0gICAgdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdLAotKQotCi0jIFB1YmxpYyBmbGF0YyBsaWJyYXJ5IHRvIGNvbXBpbGUgZmxhdGJ1ZmZlciBmaWxlcyBhdCBydW50aW1lLgotY2NfbGlicmFyeSgKLSAgICBuYW1lID0gImZsYXRidWZmZXJzIiwKLSAgICBsaW5rb3B0cyA9IFsiLWxmbGF0YnVmZmVycyJdLAotICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKLSkKLQotIyBQdWJsaWMgZmxhdGMgY29tcGlsZXIgbGlicmFyeS4KLWNjX2xpYnJhcnkoCi0gICAgbmFtZSA9ICJmbGF0Y19saWJyYXJ5IiwKLSAgICBsaW5rb3B0cyA9IFsiLWxmbGF0YnVmZmVycyJdLAotICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKLSkKLQotZ2VucnVsZSgKLSAgICBuYW1lID0gImxuZmxhdGMiLAotICAgIG91dHMgPSBbImZsYXRjLmJpbiJdLAotICAgIGNtZCA9ICJsbiAtcyAkJCh3aGljaCBmbGF0YykgJEAiLAotKQotCi0jIFB1YmxpYyBmbGF0YyBjb21waWxlci4KLXNoX2JpbmFyeSgKLSAgICBuYW1lID0gImZsYXRjIiwKLSAgICBzcmNzID0gWyJmbGF0Yy5iaW4iXSwKLSAgICB2aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0sCi0pCi0KLWNjX2xpYnJhcnkoCi0gICAgbmFtZSA9ICJydW50aW1lX2NjIiwKLSAgICB2aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0sCi0pCi0KLXB5X2xpYnJhcnkoCi0gICAgbmFtZSA9ICJydW50aW1lX3B5IiwKLSAgICB2aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0sCi0pCmRpZmYgLS1naXQgYS9jaS9mbGF0YnVmZmVyc19mb3JfdGZfc3luYy9idWlsZF9kZWZzLmJ6bCBiL2NpL2ZsYXRidWZmZXJzX2Zvcl90Zl9zeW5jL2J1aWxkX2RlZnMuYnpsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWVmYjAxLi4wMDAwMDAwCi0tLSBhL2NpL2ZsYXRidWZmZXJzX2Zvcl90Zl9zeW5jL2J1aWxkX2RlZnMuYnpsCisrKyAvZGV2L251bGwKQEAgLTEsNjQwICswLDAgQEAKLSIiIkJVSUxEIHJ1bGVzIGZvciBnZW5lcmF0aW5nIGZsYXRidWZmZXIgZmlsZXMuIiIiCi0KLWxvYWQoIkBidWlsZF9iYXplbF9ydWxlc19hbmRyb2lkLy9hbmRyb2lkOnJ1bGVzLmJ6bCIsICJhbmRyb2lkX2xpYnJhcnkiKQotbG9hZCgiQHJ1bGVzX3B5dGhvbi8vcHl0aG9uOmRlZnMuYnpsIiwgInB5X2xpYnJhcnkiKQotCi1mbGF0Y19wYXRoID0gIkBmbGF0YnVmZmVycy8vOmZsYXRjIgotemlwX2ZpbGVzID0gIi8vdGVuc29yZmxvdy9saXRlL3Rvb2xzOnppcF9maWxlcyIKLQotREVGQVVMVF9JTkNMVURFX1BBVEhTID0gWwotICAgICIuLyIsCi0gICAgIiQoR0VORElSKSIsCi0gICAgIiQoQklORElSKSIsCi1dCi0KLURFRkFVTFRfRkxBVENfQVJHUyA9IFsKLSAgICAiLS1uby11bmlvbi12YWx1ZS1uYW1lc3BhY2luZyIsCi0gICAgIi0tZ2VuLW9iamVjdC1hcGkiLAotXQotCi1kZWYgZmxhdGJ1ZmZlcl9saWJyYXJ5X3B1YmxpYygKLSAgICAgICAgbmFtZSwKLSAgICAgICAgc3JjcywKLSAgICAgICAgb3V0cywKLSAgICAgICAgbGFuZ3VhZ2VfZmxhZywKLSAgICAgICAgb3V0X3ByZWZpeCA9ICIiLAotICAgICAgICBpbmNsdWRlcyA9IFtdLAotICAgICAgICBpbmNsdWRlX3BhdGhzID0gW10sCi0gICAgICAgIGNvbXBhdGlibGVfd2l0aCA9IFtdLAotICAgICAgICBmbGF0Y19hcmdzID0gREVGQVVMVF9GTEFUQ19BUkdTLAotICAgICAgICByZWZsZWN0aW9uX25hbWUgPSAiIiwKLSAgICAgICAgcmVmbGVjdGlvbl92aXNpYmlsaXR5ID0gTm9uZSwKLSAgICAgICAgb3V0cHV0X3RvX2JpbmRpciA9IEZhbHNlKToKLSAgICAiIiJHZW5lcmF0ZXMgY29kZSBmaWxlcyBmb3IgcmVhZGluZy93cml0aW5nIHRoZSBnaXZlbiBmbGF0YnVmZmVycyBpbiB0aGUgcmVxdWVzdGVkIGxhbmd1YWdlIHVzaW5nIHRoZSBwdWJsaWMgY29tcGlsZXIuCi0KLSAgICBPdXRzOgotICAgICAgZmlsZWdyb3VwKG5hbWUpOiBhbGwgZ2VuZXJhdGVkIHNvdXJjZSBmaWxlcy4KLSAgICAgIEZpbGVzZXQoW3JlZmxlY3Rpb25fbmFtZV0pOiAoT3B0aW9uYWwpIGFsbCBnZW5lcmF0ZWQgcmVmbGVjdGlvbiBiaW5hcmllcy4KLQotICAgIEFyZ3M6Ci0gICAgICBuYW1lOiBSdWxlIG5hbWUuCi0gICAgICBzcmNzOiBTb3VyY2UgLmZicyBmaWxlcy4gU2VudCBpbiBvcmRlciB0byB0aGUgY29tcGlsZXIuCi0gICAgICBvdXRzOiBPdXRwdXQgZmlsZXMgZnJvbSBmbGF0Yy4KLSAgICAgIGxhbmd1YWdlX2ZsYWc6IFRhcmdldCBsYW5ndWFnZSBmbGFnLiBPbmUgb2YgWy1jLCAtaiwgLWpzXS4KLSAgICAgIG91dF9wcmVmaXg6IFByZXBlbmQgdGhpcyBwYXRoIHRvIHRoZSBmcm9udCBvZiBhbGwgZ2VuZXJhdGVkIGZpbGVzIGV4Y2VwdCBvbgotICAgICAgICAgIHNpbmdsZSBzb3VyY2UgdGFyZ2V0cy4gVXN1YWxseSBpcyBhIGRpcmVjdG9yeSBuYW1lLgotICAgICAgaW5jbHVkZXM6IE9wdGlvbmFsLCBsaXN0IG9mIGZpbGVncm91cHMgb2Ygc2NoZW1hcyB0aGF0IHRoZSBzcmNzIGRlcGVuZCBvbi4KLSAgICAgIGluY2x1ZGVfcGF0aHM6IE9wdGlvbmFsLCBsaXN0IG9mIHBhdGhzIHRoZSBpbmNsdWRlcyBmaWxlcyBjYW4gYmUgZm91bmQgaW4uCi0gICAgICBjb21wYXRpYmxlX3dpdGg6IE9wdGlvbmFsLCBwYXNzZWQgdG8gZ2VucnVsZSBmb3IgZW52aXJvbm1lbnRzIHRoaXMgcnVsZQotICAgICAgICAgIGNhbiBiZSBidWlsdCBmb3IuCi0gICAgICBmbGF0Y19hcmdzOiBPcHRpb25hbCwgbGlzdCBvZiBhZGRpdGlvbmFsIGFyZ3VtZW50cyB0byBwYXNzIHRvIGZsYXRjLgotICAgICAgcmVmbGVjdGlvbl9uYW1lOiBPcHRpb25hbCwgaWYgc2V0IHRoaXMgd2lsbCBnZW5lcmF0ZSB0aGUgZmxhdGJ1ZmZlcgotICAgICAgICByZWZsZWN0aW9uIGJpbmFyaWVzIGZvciB0aGUgc2NoZW1hcy4KLSAgICAgIHJlZmxlY3Rpb25fdmlzaWJpbGl0eTogVGhlIHZpc2liaWxpdHkgb2YgdGhlIGdlbmVyYXRlZCByZWZsZWN0aW9uIEZpbGVzZXQuCi0gICAgICBvdXRwdXRfdG9fYmluZGlyOiBQYXNzZWQgdG8gZ2VucnVsZSBmb3Igb3V0cHV0IHRvIGJpbiBkaXJlY3RvcnkuCi0gICAgIiIiCi0gICAgaW5jbHVkZV9wYXRoc19jbWQgPSBbIi1JICVzIiAlIChzKSBmb3IgcyBpbiBpbmNsdWRlX3BhdGhzXQotCi0gICAgIyAnJChARCknIHdoZW4gZ2l2ZW4gYSBzaW5nbGUgc291cmNlIHRhcmdldCB3aWxsIGdpdmUgdGhlIGFwcHJvcHJpYXRlCi0gICAgIyBkaXJlY3RvcnkuIEFwcGVuZGluZyAnb3V0X3ByZWZpeCcgaXMgb25seSBuZWNlc3Nhcnkgd2hlbiBnaXZlbiBhIGJ1aWxkCi0gICAgIyB0YXJnZXQgd2l0aCBtdWx0aXBsZSBzb3VyY2VzLgotICAgIG91dHB1dF9kaXJlY3RvcnkgPSAoCi0gICAgICAgICgiLW8gJChARCkvJXMiICUgKG91dF9wcmVmaXgpKSBpZiBsZW4oc3JjcykgPiAxIGVsc2UgKCItbyAkKEBEKSIpCi0gICAgKQotICAgIGdlbnJ1bGVfY21kID0gIiAiLmpvaW4oWwotICAgICAgICAiZm9yIGYgaW4gJChTUkNTKTsgZG8iLAotICAgICAgICAiJChsb2NhdGlvbiAlcykiICUgKGZsYXRjX3BhdGgpLAotICAgICAgICAiICIuam9pbihmbGF0Y19hcmdzKSwKLSAgICAgICAgIiAiLmpvaW4oaW5jbHVkZV9wYXRoc19jbWQpLAotICAgICAgICBsYW5ndWFnZV9mbGFnLAotICAgICAgICBvdXRwdXRfZGlyZWN0b3J5LAotICAgICAgICAiJCRmOyIsCi0gICAgICAgICJkb25lIiwKLSAgICBdKQotICAgIG5hdGl2ZS5nZW5ydWxlKAotICAgICAgICBuYW1lID0gbmFtZSwKLSAgICAgICAgc3JjcyA9IHNyY3MsCi0gICAgICAgIG91dHMgPSBvdXRzLAotICAgICAgICBvdXRwdXRfdG9fYmluZGlyID0gb3V0cHV0X3RvX2JpbmRpciwKLSAgICAgICAgY29tcGF0aWJsZV93aXRoID0gY29tcGF0aWJsZV93aXRoLAotICAgICAgICB0b29scyA9IGluY2x1ZGVzICsgW2ZsYXRjX3BhdGhdLAotICAgICAgICBjbWQgPSBnZW5ydWxlX2NtZCwKLSAgICAgICAgbWVzc2FnZSA9ICJHZW5lcmF0aW5nIGZsYXRidWZmZXIgZmlsZXMgZm9yICVzOiIgJSAobmFtZSksCi0gICAgKQotICAgIGlmIHJlZmxlY3Rpb25fbmFtZToKLSAgICAgICAgcmVmbGVjdGlvbl9nZW5ydWxlX2NtZCA9ICIgIi5qb2luKFsKLSAgICAgICAgICAgICJmb3IgZiBpbiAkKFNSQ1MpOyBkbyIsCi0gICAgICAgICAgICAiJChsb2NhdGlvbiAlcykiICUgKGZsYXRjX3BhdGgpLAotICAgICAgICAgICAgIi1iIC0tc2NoZW1hIiwKLSAgICAgICAgICAgICIgIi5qb2luKGZsYXRjX2FyZ3MpLAotICAgICAgICAgICAgIiAiLmpvaW4oaW5jbHVkZV9wYXRoc19jbWQpLAotICAgICAgICAgICAgbGFuZ3VhZ2VfZmxhZywKLSAgICAgICAgICAgIG91dHB1dF9kaXJlY3RvcnksCi0gICAgICAgICAgICAiJCRmOyIsCi0gICAgICAgICAgICAiZG9uZSIsCi0gICAgICAgIF0pCi0gICAgICAgIHJlZmxlY3Rpb25fb3V0cyA9IFsKLSAgICAgICAgICAgIChvdXRfcHJlZml4ICsgIiVzLmJmYnMiKSAlIChzLnJlcGxhY2UoIi5mYnMiLCAiIikuc3BsaXQoIi8iKVstMV0pCi0gICAgICAgICAgICBmb3IgcyBpbiBzcmNzCi0gICAgICAgIF0KLSAgICAgICAgbmF0aXZlLmdlbnJ1bGUoCi0gICAgICAgICAgICBuYW1lID0gIiVzX3NyY3MiICUgcmVmbGVjdGlvbl9uYW1lLAotICAgICAgICAgICAgc3JjcyA9IHNyY3MsCi0gICAgICAgICAgICBvdXRzID0gcmVmbGVjdGlvbl9vdXRzLAotICAgICAgICAgICAgb3V0cHV0X3RvX2JpbmRpciA9IG91dHB1dF90b19iaW5kaXIsCi0gICAgICAgICAgICBjb21wYXRpYmxlX3dpdGggPSBjb21wYXRpYmxlX3dpdGgsCi0gICAgICAgICAgICB0b29scyA9IGluY2x1ZGVzICsgW2ZsYXRjX3BhdGhdLAotICAgICAgICAgICAgY21kID0gcmVmbGVjdGlvbl9nZW5ydWxlX2NtZCwKLSAgICAgICAgICAgIG1lc3NhZ2UgPSAiR2VuZXJhdGluZyBmbGF0YnVmZmVyIHJlZmxlY3Rpb24gYmluYXJ5IGZvciAlczoiICUgKG5hbWUpLAotICAgICAgICApCi0gICAgICAgICMgVE9ETyhiLzExNDQ1Njc3Myk6IE1ha2UgYmF6ZWwgcnVsZXMgcHJvcGVyIGFuZCBzdXBwb3J0ZWQgYnkgZmxhdGJ1ZmZlcgotICAgICAgICAjIEhhdmUgdG8gY29tbWVudCB0aGlzIHNpbmNlIEZpbGVzZXRFbnRyeSBpcyBub3Qgc3VwcG9ydGVkIGluIGJhemVsCi0gICAgICAgICMgc2t5bGFyay4KLSAgICAgICAgIyBuYXRpdmUuRmlsZXNldCgKLSAgICAgICAgIyAgICAgbmFtZSA9IHJlZmxlY3Rpb25fbmFtZSwKLSAgICAgICAgIyAgICAgb3V0ID0gIiVzX291dCIgJSByZWZsZWN0aW9uX25hbWUsCi0gICAgICAgICMgICAgIGVudHJpZXMgPSBbCi0gICAgICAgICMgICAgICAgICBuYXRpdmUuRmlsZXNldEVudHJ5KGZpbGVzID0gcmVmbGVjdGlvbl9vdXRzKSwKLSAgICAgICAgIyAgICAgXSwKLSAgICAgICAgIyAgICAgdmlzaWJpbGl0eSA9IHJlZmxlY3Rpb25fdmlzaWJpbGl0eSwKLSAgICAgICAgIyAgICAgY29tcGF0aWJsZV93aXRoID0gY29tcGF0aWJsZV93aXRoLAotICAgICAgICAjICkKLQotZGVmIGZsYXRidWZmZXJfY2NfbGlicmFyeSgKLSAgICAgICAgbmFtZSwKLSAgICAgICAgc3JjcywKLSAgICAgICAgc3Jjc19maWxlZ3JvdXBfbmFtZSA9ICIiLAotICAgICAgICBvdXRfcHJlZml4ID0gIiIsCi0gICAgICAgIGluY2x1ZGVzID0gW10sCi0gICAgICAgIGluY2x1ZGVfcGF0aHMgPSBbXSwKLSAgICAgICAgY29tcGF0aWJsZV93aXRoID0gW10sCi0gICAgICAgIGZsYXRjX2FyZ3MgPSBERUZBVUxUX0ZMQVRDX0FSR1MsCi0gICAgICAgIHZpc2liaWxpdHkgPSBOb25lLAotICAgICAgICBzcmNzX2ZpbGVncm91cF92aXNpYmlsaXR5ID0gTm9uZSwKLSAgICAgICAgZ2VuX3JlZmxlY3Rpb25zID0gRmFsc2UpOgotICAgICcnJ0EgY2NfbGlicmFyeSB3aXRoIHRoZSBnZW5lcmF0ZWQgcmVhZGVyL3dyaXRlcnMgZm9yIHRoZSBnaXZlbiBmbGF0YnVmZmVyIGRlZmluaXRpb25zLgotCi0gICAgT3V0czoKLSAgICAgIGZpbGVncm91cChbbmFtZV1fc3Jjcyk6IGFsbCBnZW5lcmF0ZWQgLmggZmlsZXMuCi0gICAgICBmaWxlZ3JvdXAoc3Jjc19maWxlZ3JvdXBfbmFtZSBpZiBzcGVjaWZpZWQsIG9yIFtuYW1lXV9pbmNsdWRlcyBpZiBub3QpOgotICAgICAgICAgIE90aGVyIGZsYXRidWZmZXJfY2NfbGlicmFyeSdzIGNhbiBwYXNzIHRoaXMgaW4gZm9yIHRoZWlyIGBpbmNsdWRlc2AKLSAgICAgICAgICBwYXJhbWV0ZXIsIGlmIHRoZXkgZGVwZW5kIG9uIHRoZSBzY2hlbWFzIGluIHRoaXMgbGlicmFyeS4KLSAgICAgIEZpbGVzZXQoW25hbWVdX3JlZmxlY3Rpb24pOiAoT3B0aW9uYWwpIGFsbCBnZW5lcmF0ZWQgcmVmbGVjdGlvbiBiaW5hcmllcy4KLSAgICAgIGNjX2xpYnJhcnkoW25hbWVdKTogbGlicmFyeSB3aXRoIHNvdXJjZXMgYW5kIGZsYXRidWZmZXJzIGRlcHMuCi0KLSAgICBSZW1hcmtzOgotICAgICAgKiogQmVjYXVzZSB0aGUgZ2VucnVsZSB1c2VkIHRvIGNhbGwgZmxhdGMgZG9lcyBub3QgaGF2ZSBhbnkgdHJpdmlhbCB3YXkgb2YKLSAgICAgICAgY29tcHV0aW5nIHRoZSBvdXRwdXQgbGlzdCBvZiBmaWxlcyB0cmFuc2l0aXZlbHkgZ2VuZXJhdGVkIGJ5IGluY2x1ZGVzIGFuZAotICAgICAgICAtLWdlbi1pbmNsdWRlcyAodGhlIGRlZmF1bHQpIGJlaW5nIGRlZmluZWQgZm9yIGZsYXRjLCB0aGUgLS1nZW4taW5jbHVkZXMKLSAgICAgICAgZmxhZyB3aWxsIG5vdCB3b3JrIGFzIGV4cGVjdGVkLiBUaGUgd2F5IGFyb3VuZCB0aGlzIGlzIHRvIGFkZCBhIGRlcGVuZGVuY3kKLSAgICAgICAgdG8gdGhlIGZsYXRidWZmZXJfY2NfbGlicmFyeSBkZWZpbmVkIGFsb25nc2lkZSB0aGUgZmxhdGMgaW5jbHVkZWQgRmlsZXNldC4KLSAgICAgICAgRm9yIGV4YW1wbGUgeW91IG1pZ2h0IGRlZmluZToKLQotICAgICAgICBmbGF0YnVmZmVyX2NjX2xpYnJhcnkoCi0gICAgICAgICAgICBuYW1lID0gIm15X2ZicyIsCi0gICAgICAgICAgICBzcmNzID0gWyAic2NoZW1hcy9mb28uZmJzIiBdLAotICAgICAgICAgICAgaW5jbHVkZXMgPSBbICIvL3RoaXJkX3BhcnR5L2Jheno6YmF6el9mYnNfaW5jbHVkZXMiIF0sCi0gICAgICAgICkKLQotICAgICAgICBJbiB3aGljaCBmb28uZmJzIGluY2x1ZGVzIGEgZmV3IGZpbGVzIGZyb20gdGhlIEZpbGVzZXQgZGVmaW5lZCBhdAotICAgICAgICAvL3RoaXJkX3BhcnR5L2Jheno6YmF6el9mYnNfaW5jbHVkZXMuIFdoZW4gY29tcGlsaW5nIHRoZSBsaWJyYXJ5IHRoYXQKLSAgICAgICAgaW5jbHVkZXMgZm9vX2dlbmVyYXRlZC5oLCBhbmQgdGhlcmVmb3JlIGhhcyBteV9mYnMgYXMgYSBkZXBlbmRlbmN5LCBpdAotICAgICAgICB3aWxsIGZhaWwgdG8gZmluZCBhbnkgb2YgdGhlIGJhenogKl9nZW5lcmF0ZWQuaCBmaWxlcyB1bmxlc3MgeW91IGFsc28KLSAgICAgICAgYWRkIGJhenoncyBmbGF0YnVmZmVyX2NjX2xpYnJhcnkgdG8geW91ciBvd24gZGVwZW5kZW5jeSBsaXN0LCBlLmcuOgotCi0gICAgICAgIGNjX2xpYnJhcnkoCi0gICAgICAgICAgICBuYW1lID0gIm15X2xpYiIsCi0gICAgICAgICAgICBkZXBzID0gWwotICAgICAgICAgICAgICAgICI6bXlfZmJzIiwKLSAgICAgICAgICAgICAgICAiLy90aGlyZF9wYXJ0eS9iYXp6OmJhenpfZmJzIgotICAgICAgICAgICAgXSwKLSAgICAgICAgKQotCi0gICAgICAgIEhhcHB5IGRlcGVuZGVudCBGbGF0YnVmZmVyaW5nIQotCi0gICAgQXJnczoKLSAgICAgIG5hbWU6IFJ1bGUgbmFtZS4KLSAgICAgIHNyY3M6IFNvdXJjZSAuZmJzIGZpbGVzLiBTZW50IGluIG9yZGVyIHRvIHRoZSBjb21waWxlci4KLSAgICAgIHNyY3NfZmlsZWdyb3VwX25hbWU6IE5hbWUgb2YgdGhlIG91dHB1dCBmaWxlZ3JvdXAgdGhhdCBob2xkcyBzcmNzLiBQYXNzIHRoaXMKLSAgICAgICAgICBmaWxlZ3JvdXAgaW50byB0aGUgYGluY2x1ZGVzYCBwYXJhbWV0ZXIgb2YgYW55IG90aGVyCi0gICAgICAgICAgZmxhdGJ1ZmZlcl9jY19saWJyYXJ5IHRoYXQgZGVwZW5kcyBvbiB0aGlzIG9uZSdzIHNjaGVtYXMuCi0gICAgICBvdXRfcHJlZml4OiBQcmVwZW5kIHRoaXMgcGF0aCB0byB0aGUgZnJvbnQgb2YgYWxsIGdlbmVyYXRlZCBmaWxlcy4gVXN1YWxseQotICAgICAgICAgIGlzIGEgZGlyZWN0b3J5IG5hbWUuCi0gICAgICBpbmNsdWRlczogT3B0aW9uYWwsIGxpc3Qgb2YgZmlsZWdyb3VwcyBvZiBzY2hlbWFzIHRoYXQgdGhlIHNyY3MgZGVwZW5kIG9uLgotICAgICAgICAgICoqIFNFRSBSRU1BUktTIEJFTE9XICoqCi0gICAgICBpbmNsdWRlX3BhdGhzOiBPcHRpb25hbCwgbGlzdCBvZiBwYXRocyB0aGUgaW5jbHVkZXMgZmlsZXMgY2FuIGJlIGZvdW5kIGluLgotICAgICAgY29tcGF0aWJsZV93aXRoOiBPcHRpb25hbCwgcGFzc2VkIHRvIGdlbnJ1bGUgZm9yIGVudmlyb25tZW50cyB0aGlzIHJ1bGUKLSAgICAgICAgICBjYW4gYmUgYnVpbHQgZm9yCi0gICAgICBmbGF0Y19hcmdzOiBPcHRpb25hbCBsaXN0IG9mIGFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gZmxhdGMKLSAgICAgICAgICAoZS5nLiAtLWdlbi1tdXRhYmxlKS4KLSAgICAgIHZpc2liaWxpdHk6IFRoZSB2aXNpYmlsaXR5IG9mIHRoZSBnZW5lcmF0ZWQgY2NfbGlicmFyeS4gQnkgZGVmYXVsdCwgdXNlIHRoZQotICAgICAgICAgIGRlZmF1bHQgdmlzaWJpbGl0eSBvZiB0aGUgcHJvamVjdC4KLSAgICAgIHNyY3NfZmlsZWdyb3VwX3Zpc2liaWxpdHk6IFRoZSB2aXNpYmlsaXR5IG9mIHRoZSBnZW5lcmF0ZWQgc3JjcyBmaWxlZ3JvdXAuCi0gICAgICAgICAgQnkgZGVmYXVsdCwgdXNlIHRoZSB2YWx1ZSBvZiB0aGUgdmlzaWJpbGl0eSBwYXJhbWV0ZXIgYWJvdmUuCi0gICAgICBnZW5fcmVmbGVjdGlvbnM6IE9wdGlvbmFsLCBpZiB0cnVlIHRoaXMgd2lsbCBnZW5lcmF0ZSB0aGUgZmxhdGJ1ZmZlcgotICAgICAgICByZWZsZWN0aW9uIGJpbmFyaWVzIGZvciB0aGUgc2NoZW1hcy4KLSAgICAnJycKLSAgICBvdXRwdXRfaGVhZGVycyA9IFsKLSAgICAgICAgKG91dF9wcmVmaXggKyAiJXNfZ2VuZXJhdGVkLmgiKSAlIChzLnJlcGxhY2UoIi5mYnMiLCAiIikuc3BsaXQoIi8iKVstMV0pCi0gICAgICAgIGZvciBzIGluIHNyY3MKLSAgICBdCi0gICAgcmVmbGVjdGlvbl9uYW1lID0gIiVzX3JlZmxlY3Rpb24iICUgbmFtZSBpZiBnZW5fcmVmbGVjdGlvbnMgZWxzZSAiIgotCi0gICAgZmxhdGJ1ZmZlcl9saWJyYXJ5X3B1YmxpYygKLSAgICAgICAgbmFtZSA9ICIlc19zcmNzIiAlIChuYW1lKSwKLSAgICAgICAgc3JjcyA9IHNyY3MsCi0gICAgICAgIG91dHMgPSBvdXRwdXRfaGVhZGVycywKLSAgICAgICAgbGFuZ3VhZ2VfZmxhZyA9ICItYyIsCi0gICAgICAgIG91dF9wcmVmaXggPSBvdXRfcHJlZml4LAotICAgICAgICBpbmNsdWRlcyA9IGluY2x1ZGVzLAotICAgICAgICBpbmNsdWRlX3BhdGhzID0gaW5jbHVkZV9wYXRocywKLSAgICAgICAgY29tcGF0aWJsZV93aXRoID0gY29tcGF0aWJsZV93aXRoLAotICAgICAgICBmbGF0Y19hcmdzID0gZmxhdGNfYXJncywKLSAgICAgICAgcmVmbGVjdGlvbl9uYW1lID0gcmVmbGVjdGlvbl9uYW1lLAotICAgICAgICByZWZsZWN0aW9uX3Zpc2liaWxpdHkgPSB2aXNpYmlsaXR5LAotICAgICkKLSAgICBuYXRpdmUuY2NfbGlicmFyeSgKLSAgICAgICAgbmFtZSA9IG5hbWUsCi0gICAgICAgIGhkcnMgPSBvdXRwdXRfaGVhZGVycywKLSAgICAgICAgc3JjcyA9IG91dHB1dF9oZWFkZXJzLAotICAgICAgICBmZWF0dXJlcyA9IFsKLSAgICAgICAgICAgICItcGFyc2VfaGVhZGVycyIsCi0gICAgICAgIF0sCi0gICAgICAgIGRlcHMgPSBbCi0gICAgICAgICAgICAiQGZsYXRidWZmZXJzLy86cnVudGltZV9jYyIsCi0gICAgICAgIF0sCi0gICAgICAgIGluY2x1ZGVzID0gWyIuIl0sCi0gICAgICAgIGxpbmtzdGF0aWMgPSAxLAotICAgICAgICB2aXNpYmlsaXR5ID0gdmlzaWJpbGl0eSwKLSAgICAgICAgY29tcGF0aWJsZV93aXRoID0gY29tcGF0aWJsZV93aXRoLAotICAgICkKLQotICAgICMgQSBmaWxlZ3JvdXAgZm9yIHRoZSBgc3Jjc2AuIFRoYXQgaXMsIGFsbCB0aGUgc2NoZW1hIGZpbGVzIGZvciB0aGlzCi0gICAgIyBGbGF0YnVmZmVyIHNldC4KLSAgICBuYXRpdmUuZmlsZWdyb3VwKAotICAgICAgICBuYW1lID0gc3Jjc19maWxlZ3JvdXBfbmFtZSBpZiBzcmNzX2ZpbGVncm91cF9uYW1lIGVsc2UgIiVzX2luY2x1ZGVzIiAlIChuYW1lKSwKLSAgICAgICAgc3JjcyA9IHNyY3MsCi0gICAgICAgIHZpc2liaWxpdHkgPSBzcmNzX2ZpbGVncm91cF92aXNpYmlsaXR5IGlmIHNyY3NfZmlsZWdyb3VwX3Zpc2liaWxpdHkgIT0gTm9uZSBlbHNlIHZpc2liaWxpdHksCi0gICAgICAgIGNvbXBhdGlibGVfd2l0aCA9IGNvbXBhdGlibGVfd2l0aCwKLSAgICApCi0KLSMgQ3VzdG9tIHByb3ZpZGVyIHRvIHRyYWNrIGRlcGVuZGVuY2llcyB0cmFuc2l0aXZlbHkuCi1GbGF0YnVmZmVySW5mbyA9IHByb3ZpZGVyKAotICAgIGZpZWxkcyA9IHsKLSAgICAgICAgInRyYW5zaXRpdmVfc3JjcyI6ICJmbGF0YnVmZmVyIHNjaGVtYSBkZWZpbml0aW9ucy4iLAotICAgIH0sCi0pCi0KLWRlZiBfZmxhdGJ1ZmZlcl9zY2hlbWFzX2FzcGVjdF9pbXBsKHRhcmdldCwgY3R4KToKLSAgICBfaWdub3JlID0gW3RhcmdldF0KLSAgICB0cmFuc2l0aXZlX3NyY3MgPSBkZXBzZXQoKQotICAgIGlmIGhhc2F0dHIoY3R4LnJ1bGUuYXR0ciwgImRlcHMiKToKLSAgICAgICAgZm9yIGRlcCBpbiBjdHgucnVsZS5hdHRyLmRlcHM6Ci0gICAgICAgICAgICBpZiBGbGF0YnVmZmVySW5mbyBpbiBkZXA6Ci0gICAgICAgICAgICAgICAgdHJhbnNpdGl2ZV9zcmNzID0gZGVwc2V0KGRlcFtGbGF0YnVmZmVySW5mb10udHJhbnNpdGl2ZV9zcmNzLCB0cmFuc2l0aXZlID0gW3RyYW5zaXRpdmVfc3Jjc10pCi0gICAgaWYgaGFzYXR0cihjdHgucnVsZS5hdHRyLCAic3JjcyIpOgotICAgICAgICBmb3Igc3JjIGluIGN0eC5ydWxlLmF0dHIuc3JjczoKLSAgICAgICAgICAgIGlmIEZsYXRidWZmZXJJbmZvIGluIHNyYzoKLSAgICAgICAgICAgICAgICB0cmFuc2l0aXZlX3NyY3MgPSBkZXBzZXQoc3JjW0ZsYXRidWZmZXJJbmZvXS50cmFuc2l0aXZlX3NyY3MsIHRyYW5zaXRpdmUgPSBbdHJhbnNpdGl2ZV9zcmNzXSkKLSAgICAgICAgICAgIGZvciBmIGluIHNyYy5maWxlczoKLSAgICAgICAgICAgICAgICBpZiBmLmV4dGVuc2lvbiA9PSAiZmJzIjoKLSAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGl2ZV9zcmNzID0gZGVwc2V0KFtmXSwgdHJhbnNpdGl2ZSA9IFt0cmFuc2l0aXZlX3NyY3NdKQotICAgIHJldHVybiBbRmxhdGJ1ZmZlckluZm8odHJhbnNpdGl2ZV9zcmNzID0gdHJhbnNpdGl2ZV9zcmNzKV0KLQotIyBBbiBhc3BlY3QgdGhhdCBydW5zIG92ZXIgYWxsIGRlcGVuZGVuY2llcyBhbmQgdHJhbnNpdGl2ZWx5IGNvbGxlY3RzCi0jIGZsYXRidWZmZXIgc2NoZW1hIGZpbGVzLgotX2ZsYXRidWZmZXJfc2NoZW1hc19hc3BlY3QgPSBhc3BlY3QoCi0gICAgYXR0cl9hc3BlY3RzID0gWwotICAgICAgICAiZGVwcyIsCi0gICAgICAgICJzcmNzIiwKLSAgICBdLAotICAgIGltcGxlbWVudGF0aW9uID0gX2ZsYXRidWZmZXJfc2NoZW1hc19hc3BlY3RfaW1wbCwKLSkKLQotIyBSdWxlIHRvIGludm9rZSB0aGUgZmxhdGJ1ZmZlciBjb21waWxlci4KLWRlZiBfZ2VuX2ZsYXRidWZmZXJfc3Jjc19pbXBsKGN0eCk6Ci0gICAgb3V0cHV0cyA9IGN0eC5hdHRyLm91dHB1dHMKLSAgICBpbmNsdWRlX3BhdGhzID0gY3R4LmF0dHIuaW5jbHVkZV9wYXRocwotICAgIGlmIGN0eC5hdHRyLm5vX2luY2x1ZGVzOgotICAgICAgICBub19pbmNsdWRlc19zdGF0ZW1lbnQgPSBbIi0tbm8taW5jbHVkZXMiXQotICAgIGVsc2U6Ci0gICAgICAgIG5vX2luY2x1ZGVzX3N0YXRlbWVudCA9IFtdCi0KLSAgICAjIE5lZWQgdG8gZ2VuZXJhdGUgYWxsIGZpbGVzIGluIGEgZGlyZWN0b3J5LgotICAgIGlmIG5vdCBvdXRwdXRzOgotICAgICAgICBvdXRwdXRzID0gW2N0eC5hY3Rpb25zLmRlY2xhcmVfZGlyZWN0b3J5KCJ7fV9hbGwiLmZvcm1hdChjdHguYXR0ci5uYW1lKSldCi0gICAgICAgIG91dHB1dF9kaXJlY3RvcnkgPSBvdXRwdXRzWzBdLnBhdGgKLSAgICBlbHNlOgotICAgICAgICBvdXRwdXRzID0gW2N0eC5hY3Rpb25zLmRlY2xhcmVfZmlsZShvdXRwdXQpIGZvciBvdXRwdXQgaW4gb3V0cHV0c10KLSAgICAgICAgb3V0cHV0X2RpcmVjdG9yeSA9IG91dHB1dHNbMF0uZGlybmFtZQotCi0gICAgZGVwcyA9IGRlcHNldChjdHguZmlsZXMuc3JjcyArIGN0eC5maWxlcy5kZXBzLCB0cmFuc2l0aXZlID0gWwotICAgICAgICBkZXBbRmxhdGJ1ZmZlckluZm9dLnRyYW5zaXRpdmVfc3JjcwotICAgICAgICBmb3IgZGVwIGluIGN0eC5hdHRyLmRlcHMKLSAgICAgICAgaWYgRmxhdGJ1ZmZlckluZm8gaW4gZGVwCi0gICAgXSkKLQotICAgIGluY2x1ZGVfcGF0aHNfY21kX2xpbmUgPSBbXQotICAgIGZvciBzIGluIGluY2x1ZGVfcGF0aHM6Ci0gICAgICAgIGluY2x1ZGVfcGF0aHNfY21kX2xpbmUuZXh0ZW5kKFsiLUkiLCBzXSkKLQotICAgIGZvciBzcmMgaW4gY3R4LmZpbGVzLnNyY3M6Ci0gICAgICAgIGN0eC5hY3Rpb25zLnJ1bigKLSAgICAgICAgICAgIGlucHV0cyA9IGRlcHMsCi0gICAgICAgICAgICBvdXRwdXRzID0gb3V0cHV0cywKLSAgICAgICAgICAgIGV4ZWN1dGFibGUgPSBjdHguZXhlY3V0YWJsZS5fZmxhdGMsCi0gICAgICAgICAgICBhcmd1bWVudHMgPSBbCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmF0dHIubGFuZ3VhZ2VfZmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLW8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9kaXJlY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBBbGxvdyBmb3IgYWJzb2x1dGUgaW1wb3J0cyBhbmQgcmVmZXJlbmNpbmcgb2YgZ2VuZXJhdGVkIGZpbGVzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICItSSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4vIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLUkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5nZW5maWxlc19kaXIucGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLUkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5iaW5fZGlyLnBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBdICsgbm9faW5jbHVkZXNfc3RhdGVtZW50ICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfcGF0aHNfY21kX2xpbmUgKyBbCi0gICAgICAgICAgICAgICAgIi0tbm8tdW5pb24tdmFsdWUtbmFtZXNwYWNpbmciLAotICAgICAgICAgICAgICAgICItLWdlbi1vYmplY3QtYXBpIiwKLSAgICAgICAgICAgICAgICBzcmMucGF0aCwKLSAgICAgICAgICAgIF0sCi0gICAgICAgICAgICBwcm9ncmVzc19tZXNzYWdlID0gIkdlbmVyYXRpbmcgZmxhdGJ1ZmZlciBmaWxlcyBmb3Ige306Ii5mb3JtYXQoc3JjKSwKLSAgICAgICAgICAgIHVzZV9kZWZhdWx0X3NoZWxsX2VudiA9IFRydWUsCi0gICAgICAgICkKLSAgICByZXR1cm4gWwotICAgICAgICBEZWZhdWx0SW5mbyhmaWxlcyA9IGRlcHNldChvdXRwdXRzKSksCi0gICAgXQotCi1fZ2VuX2ZsYXRidWZmZXJfc3JjcyA9IHJ1bGUoCi0gICAgX2dlbl9mbGF0YnVmZmVyX3NyY3NfaW1wbCwKLSAgICBhdHRycyA9IHsKLSAgICAgICAgInNyY3MiOiBhdHRyLmxhYmVsX2xpc3QoCi0gICAgICAgICAgICBhbGxvd19maWxlcyA9IFsiLmZicyJdLAotICAgICAgICAgICAgbWFuZGF0b3J5ID0gVHJ1ZSwKLSAgICAgICAgKSwKLSAgICAgICAgIm91dHB1dHMiOiBhdHRyLnN0cmluZ19saXN0KAotICAgICAgICAgICAgZGVmYXVsdCA9IFtdLAotICAgICAgICAgICAgbWFuZGF0b3J5ID0gRmFsc2UsCi0gICAgICAgICksCi0gICAgICAgICJkZXBzIjogYXR0ci5sYWJlbF9saXN0KAotICAgICAgICAgICAgZGVmYXVsdCA9IFtdLAotICAgICAgICAgICAgbWFuZGF0b3J5ID0gRmFsc2UsCi0gICAgICAgICAgICBhc3BlY3RzID0gW19mbGF0YnVmZmVyX3NjaGVtYXNfYXNwZWN0XSwKLSAgICAgICAgKSwKLSAgICAgICAgImluY2x1ZGVfcGF0aHMiOiBhdHRyLnN0cmluZ19saXN0KAotICAgICAgICAgICAgZGVmYXVsdCA9IFtdLAotICAgICAgICAgICAgbWFuZGF0b3J5ID0gRmFsc2UsCi0gICAgICAgICksCi0gICAgICAgICJsYW5ndWFnZV9mbGFnIjogYXR0ci5zdHJpbmcoCi0gICAgICAgICAgICBtYW5kYXRvcnkgPSBUcnVlLAotICAgICAgICApLAotICAgICAgICAibm9faW5jbHVkZXMiOiBhdHRyLmJvb2woCi0gICAgICAgICAgICBkZWZhdWx0ID0gRmFsc2UsCi0gICAgICAgICAgICBtYW5kYXRvcnkgPSBGYWxzZSwKLSAgICAgICAgKSwKLSAgICAgICAgIl9mbGF0YyI6IGF0dHIubGFiZWwoCi0gICAgICAgICAgICBkZWZhdWx0ID0gTGFiZWwoIkBmbGF0YnVmZmVycy8vOmZsYXRjIiksCi0gICAgICAgICAgICBleGVjdXRhYmxlID0gVHJ1ZSwKLSAgICAgICAgICAgIGNmZyA9ICJleGVjIiwKLSAgICAgICAgKSwKLSAgICB9LAotICAgIG91dHB1dF90b19nZW5maWxlcyA9IFRydWUsCi0pCi0KLWRlZiBmbGF0YnVmZmVyX3B5X3N0cmlwX3ByZWZpeF9zcmNzKG5hbWUsIHNyY3MgPSBbXSwgc3RyaXBfcHJlZml4ID0gIiIpOgotICAgICIiIlN0cmlwcyBwYXRoIHByZWZpeC4KLQotICAgIEFyZ3M6Ci0gICAgICBuYW1lOiBSdWxlIG5hbWUuIChyZXF1aXJlZCkKLSAgICAgIHNyY3M6IFNvdXJjZSAucHkgZmlsZXMuIChyZXF1aXJlZCkKLSAgICAgIHN0cmlwX3ByZWZpeDogUGF0aCB0aGF0IG5lZWRzIHRvIGJlIHN0cmlwcGVkIGZyb20gdGhlIHNyY3MgZmlsZXBhdGhzLiAocmVxdWlyZWQpCi0gICAgIiIiCi0gICAgZm9yIHNyYyBpbiBzcmNzOgotICAgICAgICBuYXRpdmUuZ2VucnVsZSgKLSAgICAgICAgICAgIG5hbWUgPSBuYW1lICsgIl8iICsgc3JjLnJlcGxhY2UoIi4iLCAiXyIpLnJlcGxhY2UoIi8iLCAiXyIpLAotICAgICAgICAgICAgc3JjcyA9IFtzcmNdLAotICAgICAgICAgICAgb3V0cyA9IFtzcmMucmVwbGFjZShzdHJpcF9wcmVmaXgsICIiKV0sCi0gICAgICAgICAgICBjbWQgPSAiY3AgJDwgJEAiLAotICAgICAgICApCi0KLWRlZiBfY29uY2F0X2ZsYXRidWZmZXJfcHlfc3Jjc19pbXBsKGN0eCk6Ci0gICAgIyBNZXJnZSBhbGwgZ2VuZXJhdGVkIHB5dGhvbiBmaWxlcy4gVGhlIGZpbGVzIGFyZSBjb25jYXRlbmF0ZWQgYW5kIGltcG9ydAotICAgICMgc3RhdGVtZW50cyBhcmUgcmVtb3ZlZC4gRmluYWxseSB3ZSBpbXBvcnQgdGhlIGZsYXRidWZmZXIgcnVudGltZSBsaWJyYXJ5LgotICAgICMgSU1QT1JUQU5UOiBPdXIgV2luZG93cyBzaGVsbCBkb2VzIG5vdCBzdXBwb3J0ICJmaW5kIC4uLiAtZXhlYyIgcHJvcGVybHkuCi0gICAgIyBJZiB5b3UncmUgY2hhbmdpbmcgdGhlIGNvbW1hbmRsaW5lIGJlbG93LCBwbGVhc2UgYnVpbGQgd2hlZWxzIGFuZCBydW4gc21va2UKLSAgICAjIHRlc3RzIG9uIGFsbCB0aGUgdGhyZWUgb3BlcmF0aW5nIHN5c3RlbXMuCi0gICAgY29tbWFuZCA9ICJlY2hvICdpbXBvcnQgZmxhdGJ1ZmZlcnNcbicgPiAlczsgIgotICAgIGNvbW1hbmQgKz0gImZvciBmIGluICQoZmluZCAlcyAtbmFtZSAnKi5weScgfCBzb3J0KTsgZG8gY2F0ICRmIHwgc2VkICcvaW1wb3J0IGZsYXRidWZmZXJzL2QnID4+ICVzOyBkb25lICIKLSAgICBjdHguYWN0aW9ucy5ydW5fc2hlbGwoCi0gICAgICAgIGlucHV0cyA9IGN0eC5hdHRyLmRlcHNbMF0uZmlsZXMsCi0gICAgICAgIG91dHB1dHMgPSBbY3R4Lm91dHB1dHMub3V0XSwKLSAgICAgICAgY29tbWFuZCA9IGNvbW1hbmQgJSAoCi0gICAgICAgICAgICBjdHgub3V0cHV0cy5vdXQucGF0aCwKLSAgICAgICAgICAgIGN0eC5hdHRyLmRlcHNbMF0uZmlsZXMudG9fbGlzdCgpWzBdLnBhdGgsCi0gICAgICAgICAgICBjdHgub3V0cHV0cy5vdXQucGF0aCwKLSAgICAgICAgKSwKLSAgICAgICAgdXNlX2RlZmF1bHRfc2hlbGxfZW52ID0gVHJ1ZSwKLSAgICApCi0KLV9jb25jYXRfZmxhdGJ1ZmZlcl9weV9zcmNzID0gcnVsZSgKLSAgICBfY29uY2F0X2ZsYXRidWZmZXJfcHlfc3Jjc19pbXBsLAotICAgIGF0dHJzID0gewotICAgICAgICAiZGVwcyI6IGF0dHIubGFiZWxfbGlzdChtYW5kYXRvcnkgPSBUcnVlKSwKLSAgICB9LAotICAgIG91dHB1dF90b19nZW5maWxlcyA9IFRydWUsCi0gICAgb3V0cHV0cyA9IHsib3V0IjogIiV7bmFtZX0ucHkifSwKLSkKLQotZGVmIGZsYXRidWZmZXJfcHlfbGlicmFyeSgKLSAgICAgICAgbmFtZSwKLSAgICAgICAgc3JjcywKLSAgICAgICAgZGVwcyA9IFtdLAotICAgICAgICBpbmNsdWRlX3BhdGhzID0gW10pOgotICAgICIiIkEgcHlfbGlicmFyeSB3aXRoIHRoZSBnZW5lcmF0ZWQgcmVhZGVyL3dyaXRlcnMgZm9yIHRoZSBnaXZlbiBzY2hlbWEuCi0KLSAgICBUaGlzIHJ1bGUgYXNzdW1lcyB0aGF0IHRoZSBzY2hlbWEgZmlsZXMgZGVmaW5lIG5vbi1jb25mbGljdGluZyBuYW1lcywgc28gdGhhdAotICAgIHRoZXkgY2FuIGJlIG1lcmdlZCBpbiBhIHNpbmdsZSBmaWxlLiBUaGlzIGlzIGUuZy4gdGhlIGNhc2UgaWYgb25seSBhIHNpbmdsZQotICAgIG5hbWVzcGFjZSBpcyB1c2VkLgotICAgIFRoZSBydWxlIGNhbGwgdGhlIGZsYXRidWZmZXIgY29tcGlsZXIgZm9yIGFsbCBzY2hlbWEgZmlsZXMgYW5kIG1lcmdlcyB0aGUKLSAgICBnZW5lcmF0ZWQgcHl0aG9uIGZpbGVzIGludG8gYSBzaW5nbGUgZmlsZSB0aGF0IGlzIHdyYXBwZWQgaW4gYSBweV9saWJyYXJ5LgotCi0gICAgQXJnczoKLSAgICAgIG5hbWU6IFJ1bGUgbmFtZS4gKHJlcXVpcmVkKQotICAgICAgc3JjczogTGlzdCBvZiBzb3VyY2UgLmZicyBmaWxlcy4gKHJlcXVpcmVkKQotICAgICAgZGVwczogTGlzdCBvZiBkZXBlbmRlbmNpZXMuCi0gICAgICBpbmNsdWRlX3BhdGhzOiBPcHRpb25hbCwgbGlzdCBvZiBwYXRocyB0aGUgaW5jbHVkZXMgZmlsZXMgY2FuIGJlIGZvdW5kIGluLgotICAgICIiIgotICAgIGFsbF9zcmNzID0gInt9X3NyY3MiLmZvcm1hdChuYW1lKQotICAgIF9nZW5fZmxhdGJ1ZmZlcl9zcmNzKAotICAgICAgICBuYW1lID0gYWxsX3NyY3MsCi0gICAgICAgIHNyY3MgPSBzcmNzLAotICAgICAgICBsYW5ndWFnZV9mbGFnID0gIi0tcHl0aG9uIiwKLSAgICAgICAgZGVwcyA9IGRlcHMsCi0gICAgICAgIGluY2x1ZGVfcGF0aHMgPSBpbmNsdWRlX3BhdGhzLAotICAgICkKLSAgICBhbGxfc3Jjc19ub19pbmNsdWRlID0gInt9X3NyY3Nfbm9faW5jbHVkZSIuZm9ybWF0KG5hbWUpCi0gICAgX2dlbl9mbGF0YnVmZmVyX3NyY3MoCi0gICAgICAgIG5hbWUgPSBhbGxfc3Jjc19ub19pbmNsdWRlLAotICAgICAgICBzcmNzID0gc3JjcywKLSAgICAgICAgbGFuZ3VhZ2VfZmxhZyA9ICItLXB5dGhvbiIsCi0gICAgICAgIGRlcHMgPSBkZXBzLAotICAgICAgICBub19pbmNsdWRlcyA9IFRydWUsCi0gICAgICAgIGluY2x1ZGVfcGF0aHMgPSBpbmNsdWRlX3BhdGhzLAotICAgICkKLSAgICBjb25jYXRfcHlfc3JjcyA9ICJ7fV9nZW5lcmF0ZWQiLmZvcm1hdChuYW1lKQotICAgIF9jb25jYXRfZmxhdGJ1ZmZlcl9weV9zcmNzKAotICAgICAgICBuYW1lID0gY29uY2F0X3B5X3NyY3MsCi0gICAgICAgIGRlcHMgPSBbCi0gICAgICAgICAgICAiOnt9Ii5mb3JtYXQoYWxsX3NyY3Nfbm9faW5jbHVkZSksCi0gICAgICAgIF0sCi0gICAgKQotICAgIHB5X2xpYnJhcnkoCi0gICAgICAgIG5hbWUgPSBuYW1lLAotICAgICAgICBzcmNzID0gWwotICAgICAgICAgICAgIjp7fSIuZm9ybWF0KGNvbmNhdF9weV9zcmNzKSwKLSAgICAgICAgXSwKLSAgICAgICAgc3Jjc192ZXJzaW9uID0gIlBZMyIsCi0gICAgICAgIGRlcHMgPSBkZXBzICsgWwotICAgICAgICAgICAgIkBmbGF0YnVmZmVycy8vOnJ1bnRpbWVfcHkiLAotICAgICAgICBdLAotICAgICkKLQotZGVmIGZsYXRidWZmZXJfamF2YV9saWJyYXJ5KAotICAgICAgICBuYW1lLAotICAgICAgICBzcmNzLAotICAgICAgICBjdXN0b21fcGFja2FnZSA9ICIiLAotICAgICAgICBwYWNrYWdlX3ByZWZpeCA9ICIiLAotICAgICAgICBpbmNsdWRlX3BhdGhzID0gREVGQVVMVF9JTkNMVURFX1BBVEhTLAotICAgICAgICBmbGF0Y19hcmdzID0gREVGQVVMVF9GTEFUQ19BUkdTLAotICAgICAgICB2aXNpYmlsaXR5ID0gTm9uZSk6Ci0gICAgIiIiQSBqYXZhIGxpYnJhcnkgd2l0aCB0aGUgZ2VuZXJhdGVkIHJlYWRlci93cml0ZXJzIGZvciB0aGUgZ2l2ZW4gZmxhdGJ1ZmZlciBkZWZpbml0aW9ucy4KLQotICAgIEFyZ3M6Ci0gICAgICBuYW1lOiBSdWxlIG5hbWUuIChyZXF1aXJlZCkKLSAgICAgIHNyY3M6IExpc3Qgb2Ygc291cmNlIC5mYnMgZmlsZXMgaW5jbHVkaW5nIGFsbCBpbmNsdWRlcy4gKHJlcXVpcmVkKQotICAgICAgY3VzdG9tX3BhY2thZ2U6IFBhY2thZ2UgbmFtZSBvZiBnZW5lcmF0ZWQgSmF2YSBmaWxlcy4gSWYgbm90IHNwZWNpZmllZAotICAgICAgICAgIG5hbWVzcGFjZSBpbiB0aGUgc2NoZW1hIGZpbGVzIHdpbGwgYmUgdXNlZC4gKG9wdGlvbmFsKQotICAgICAgcGFja2FnZV9wcmVmaXg6IGxpa2UgY3VzdG9tX3BhY2thZ2UsIGJ1dCBwcmVmaXhlcyB0byB0aGUgZXhpc3RpbmcKLSAgICAgICAgICBuYW1lc3BhY2UuIChvcHRpb25hbCkKLSAgICAgIGluY2x1ZGVfcGF0aHM6IExpc3Qgb2YgcGF0aHMgdGhhdCBpbmNsdWRlcyBmaWxlcyBjYW4gYmUgZm91bmQgaW4uIChvcHRpb25hbCkKLSAgICAgIGZsYXRjX2FyZ3M6IExpc3Qgb2YgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byBmbGF0Yy4gKG9wdGlvbmFsKQotICAgICAgdmlzaWJpbGl0eTogVmlzaWJpbGl0eSBzZXR0aW5nIGZvciB0aGUgamF2YV9saWJyYXJ5IHJ1bGUuIChvcHRpb25hbCkKLSAgICAiIiIKLSAgICBvdXRfc3JjamFyID0gImphdmFfJXNfYWxsLnNyY2phciIgJSBuYW1lCi0gICAgZmxhdGJ1ZmZlcl9qYXZhX3NyY2phcigKLSAgICAgICAgbmFtZSA9ICIlc19zcmNqYXIiICUgbmFtZSwKLSAgICAgICAgc3JjcyA9IHNyY3MsCi0gICAgICAgIG91dCA9IG91dF9zcmNqYXIsCi0gICAgICAgIGN1c3RvbV9wYWNrYWdlID0gY3VzdG9tX3BhY2thZ2UsCi0gICAgICAgIGZsYXRjX2FyZ3MgPSBmbGF0Y19hcmdzLAotICAgICAgICBpbmNsdWRlX3BhdGhzID0gaW5jbHVkZV9wYXRocywKLSAgICAgICAgcGFja2FnZV9wcmVmaXggPSBwYWNrYWdlX3ByZWZpeCwKLSAgICApCi0KLSAgICBuYXRpdmUuZmlsZWdyb3VwKAotICAgICAgICBuYW1lID0gIiVzLnNyY2phciIgJSBuYW1lLAotICAgICAgICBzcmNzID0gW291dF9zcmNqYXJdLAotICAgICkKLQotICAgIG5hdGl2ZS5qYXZhX2xpYnJhcnkoCi0gICAgICAgIG5hbWUgPSBuYW1lLAotICAgICAgICBzcmNzID0gW291dF9zcmNqYXJdLAotICAgICAgICBqYXZhY29wdHMgPSBbIi1zb3VyY2UgNyAtdGFyZ2V0IDciXSwKLSAgICAgICAgZGVwcyA9IFsKLSAgICAgICAgICAgICJAZmxhdGJ1ZmZlcnMvLzpydW50aW1lX2phdmEiLAotICAgICAgICBdLAotICAgICAgICB2aXNpYmlsaXR5ID0gdmlzaWJpbGl0eSwKLSAgICApCi0KLWRlZiBmbGF0YnVmZmVyX2phdmFfc3JjamFyKAotICAgICAgICBuYW1lLAotICAgICAgICBzcmNzLAotICAgICAgICBvdXQsCi0gICAgICAgIGN1c3RvbV9wYWNrYWdlID0gIiIsCi0gICAgICAgIHBhY2thZ2VfcHJlZml4ID0gIiIsCi0gICAgICAgIGluY2x1ZGVfcGF0aHMgPSBERUZBVUxUX0lOQ0xVREVfUEFUSFMsCi0gICAgICAgIGZsYXRjX2FyZ3MgPSBERUZBVUxUX0ZMQVRDX0FSR1MpOgotICAgICIiIkdlbmVyYXRlIGZsYXRidWZmZXIgSmF2YSBzb3VyY2UgZmlsZXMuCi0KLSAgICBBcmdzOgotICAgICAgbmFtZTogUnVsZSBuYW1lLiAocmVxdWlyZWQpCi0gICAgICBzcmNzOiBMaXN0IG9mIHNvdXJjZSAuZmJzIGZpbGVzIGluY2x1ZGluZyBhbGwgaW5jbHVkZXMuIChyZXF1aXJlZCkKLSAgICAgIG91dDogT3V0cHV0IGZpbGUgbmFtZS4gKHJlcXVpcmVkKQotICAgICAgY3VzdG9tX3BhY2thZ2U6IFBhY2thZ2UgbmFtZSBvZiBnZW5lcmF0ZWQgSmF2YSBmaWxlcy4gSWYgbm90IHNwZWNpZmllZAotICAgICAgICAgIG5hbWVzcGFjZSBpbiB0aGUgc2NoZW1hIGZpbGVzIHdpbGwgYmUgdXNlZC4gKG9wdGlvbmFsKQotICAgICAgcGFja2FnZV9wcmVmaXg6IGxpa2UgY3VzdG9tX3BhY2thZ2UsIGJ1dCBwcmVmaXhlcyB0byB0aGUgZXhpc3RpbmcKLSAgICAgICAgICBuYW1lc3BhY2UuIChvcHRpb25hbCkKLSAgICAgIGluY2x1ZGVfcGF0aHM6IExpc3Qgb2YgcGF0aHMgdGhhdCBpbmNsdWRlcyBmaWxlcyBjYW4gYmUgZm91bmQgaW4uIChvcHRpb25hbCkKLSAgICAgIGZsYXRjX2FyZ3M6IExpc3Qgb2YgYWRkaXRpb25hbCBhcmd1bWVudHMgdG8gcGFzcyB0byBmbGF0Yy4gKG9wdGlvbmFsKQotICAgICIiIgotICAgIGNvbW1hbmRfZm10ID0gIiIic2V0IC1lCi0gICAgICB0bXBkaXI9JChARCkKLSAgICAgIHNjaGVtYXM9JCR0bXBkaXIvc2NoZW1hcwotICAgICAgamF2YV9yb290PSQkdG1wZGlyL2phdmEKLSAgICAgIHJtIC1yZiAkJHNjaGVtYXMKLSAgICAgIHJtIC1yZiAkJGphdmFfcm9vdAotICAgICAgbWtkaXIgLXAgJCRzY2hlbWFzCi0gICAgICBta2RpciAtcCAkJGphdmFfcm9vdAotCi0gICAgICBmb3Igc3JjIGluICQoU1JDUyk7IGRvCi0gICAgICAgIGRlc3Q9JCRzY2hlbWFzLyQkc3JjCi0gICAgICAgIHJtIC1yZiAkJChkaXJuYW1lICQkZGVzdCkKLSAgICAgICAgbWtkaXIgLXAgJCQoZGlybmFtZSAkJGRlc3QpCi0gICAgICAgIGlmIFsgLXogIntjdXN0b21fcGFja2FnZX0iIF0gJiYgWyAteiAie3BhY2thZ2VfcHJlZml4fSIgXTsgdGhlbgotICAgICAgICAgIGNwIC1mICQkc3JjICQkZGVzdAotICAgICAgICBlbHNlCi0gICAgICAgICAgaWYgWyAteiAie3BhY2thZ2VfcHJlZml4fSIgXTsgdGhlbgotICAgICAgICAgICAgc2VkIC1lICJzL25hbWVzcGFjZVxccy4qL25hbWVzcGFjZSB7Y3VzdG9tX3BhY2thZ2V9Oy8iICQkc3JjID4gJCRkZXN0Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgc2VkIC1lICJzL25hbWVzcGFjZSBcXChbXjtdXFwrXFwpOy9uYW1lc3BhY2Uge3BhY2thZ2VfcHJlZml4fS5cXDE7LyIgJCRzcmMgPiAkJGRlc3QKLSAgICAgICAgICBmaQotICAgICAgICBmaQotICAgICAgZG9uZQotCi0gICAgICBmbGF0Y19hcmdfST0iLUkgJCR0bXBkaXIvc2NoZW1hcyIKLSAgICAgIGZvciBpbmNsdWRlX3BhdGggaW4ge2luY2x1ZGVfcGF0aHN9OyBkbwotICAgICAgICBmbGF0Y19hcmdfST0iJCRmbGF0Y19hcmdfSSAtSSAkJHNjaGVtYXMvJCRpbmNsdWRlX3BhdGgiCi0gICAgICBkb25lCi0KLSAgICAgIGZsYXRjX2FkZGl0aW9uYWxfYXJncz0KLSAgICAgIGZvciBhcmcgaW4ge2ZsYXRjX2FyZ3N9OyBkbwotICAgICAgICBmbGF0Y19hZGRpdGlvbmFsX2FyZ3M9IiQkZmxhdGNfYWRkaXRpb25hbF9hcmdzICQkYXJnIgotICAgICAgZG9uZQotCi0gICAgICBmb3Igc3JjIGluICQoU1JDUyk7IGRvCi0gICAgICAgICQobG9jYXRpb24ge2ZsYXRjX3BhdGh9KSAkJGZsYXRjX2FyZ19JIC0tamF2YSAkJGZsYXRjX2FkZGl0aW9uYWxfYXJncyAtbyAkJGphdmFfcm9vdCAgJCRzY2hlbWFzLyQkc3JjCi0gICAgICBkb25lCi0KLSAgICAgICQobG9jYXRpb24ge3ppcF9maWxlc30pIC1leHBvcnRfemlwX3BhdGg9JEAgLWZpbGVfZGlyZWN0b3J5PSQkamF2YV9yb290Ci0gICAgICAiIiIKLSAgICBnZW5ydWxlX2NtZCA9IGNvbW1hbmRfZm10LmZvcm1hdCgKLSAgICAgICAgcGFja2FnZV9uYW1lID0gbmF0aXZlLnBhY2thZ2VfbmFtZSgpLAotICAgICAgICBjdXN0b21fcGFja2FnZSA9IGN1c3RvbV9wYWNrYWdlLAotICAgICAgICBwYWNrYWdlX3ByZWZpeCA9IHBhY2thZ2VfcHJlZml4LAotICAgICAgICBmbGF0Y19wYXRoID0gZmxhdGNfcGF0aCwKLSAgICAgICAgemlwX2ZpbGVzID0gemlwX2ZpbGVzLAotICAgICAgICBpbmNsdWRlX3BhdGhzID0gIiAiLmpvaW4oaW5jbHVkZV9wYXRocyksCi0gICAgICAgIGZsYXRjX2FyZ3MgPSAiICIuam9pbihmbGF0Y19hcmdzKSwKLSAgICApCi0KLSAgICBuYXRpdmUuZ2VucnVsZSgKLSAgICAgICAgbmFtZSA9IG5hbWUsCi0gICAgICAgIHNyY3MgPSBzcmNzLAotICAgICAgICBvdXRzID0gW291dF0sCi0gICAgICAgIHRvb2xzID0gW2ZsYXRjX3BhdGgsIHppcF9maWxlc10sCi0gICAgICAgIGNtZCA9IGdlbnJ1bGVfY21kLAotICAgICkKLQotZGVmIGZsYXRidWZmZXJfYW5kcm9pZF9saWJyYXJ5KAotICAgICAgICBuYW1lLAotICAgICAgICBzcmNzLAotICAgICAgICBjdXN0b21fcGFja2FnZSA9ICIiLAotICAgICAgICBwYWNrYWdlX3ByZWZpeCA9ICIiLAotICAgICAgICBpbmNsdWRlX3BhdGhzID0gREVGQVVMVF9JTkNMVURFX1BBVEhTLAotICAgICAgICBmbGF0Y19hcmdzID0gREVGQVVMVF9GTEFUQ19BUkdTLAotICAgICAgICB2aXNpYmlsaXR5ID0gTm9uZSk6Ci0gICAgIiIiQW4gYW5kcm9pZF9saWJyYXJ5IHdpdGggdGhlIGdlbmVyYXRlZCByZWFkZXIvd3JpdGVycyBmb3IgdGhlIGdpdmVuIGZsYXRidWZmZXIgZGVmaW5pdGlvbnMuCi0KLSAgICBBcmdzOgotICAgICAgbmFtZTogUnVsZSBuYW1lLiAocmVxdWlyZWQpCi0gICAgICBzcmNzOiBMaXN0IG9mIHNvdXJjZSAuZmJzIGZpbGVzIGluY2x1ZGluZyBhbGwgaW5jbHVkZXMuIChyZXF1aXJlZCkKLSAgICAgIGN1c3RvbV9wYWNrYWdlOiBQYWNrYWdlIG5hbWUgb2YgZ2VuZXJhdGVkIEphdmEgZmlsZXMuIElmIG5vdCBzcGVjaWZpZWQKLSAgICAgICAgICBuYW1lc3BhY2UgaW4gdGhlIHNjaGVtYSBmaWxlcyB3aWxsIGJlIHVzZWQuIChvcHRpb25hbCkKLSAgICAgIHBhY2thZ2VfcHJlZml4OiBsaWtlIGN1c3RvbV9wYWNrYWdlLCBidXQgcHJlZml4ZXMgdG8gdGhlIGV4aXN0aW5nCi0gICAgICAgICAgbmFtZXNwYWNlLiAob3B0aW9uYWwpCi0gICAgICBpbmNsdWRlX3BhdGhzOiBMaXN0IG9mIHBhdGhzIHRoYXQgaW5jbHVkZXMgZmlsZXMgY2FuIGJlIGZvdW5kIGluLiAob3B0aW9uYWwpCi0gICAgICBmbGF0Y19hcmdzOiBMaXN0IG9mIGFkZGl0aW9uYWwgYXJndW1lbnRzIHRvIHBhc3MgdG8gZmxhdGMuIChvcHRpb25hbCkKLSAgICAgIHZpc2liaWxpdHk6IFZpc2liaWxpdHkgc2V0dGluZyBmb3IgdGhlIGFuZHJvaWRfbGlicmFyeSBydWxlLiAob3B0aW9uYWwpCi0gICAgIiIiCi0gICAgb3V0X3NyY2phciA9ICJhbmRyb2lkXyVzX2FsbC5zcmNqYXIiICUgbmFtZQotICAgIGZsYXRidWZmZXJfamF2YV9zcmNqYXIoCi0gICAgICAgIG5hbWUgPSAiJXNfc3JjamFyIiAlIG5hbWUsCi0gICAgICAgIHNyY3MgPSBzcmNzLAotICAgICAgICBvdXQgPSBvdXRfc3JjamFyLAotICAgICAgICBjdXN0b21fcGFja2FnZSA9IGN1c3RvbV9wYWNrYWdlLAotICAgICAgICBmbGF0Y19hcmdzID0gZmxhdGNfYXJncywKLSAgICAgICAgaW5jbHVkZV9wYXRocyA9IGluY2x1ZGVfcGF0aHMsCi0gICAgICAgIHBhY2thZ2VfcHJlZml4ID0gcGFja2FnZV9wcmVmaXgsCi0gICAgKQotCi0gICAgbmF0aXZlLmZpbGVncm91cCgKLSAgICAgICAgbmFtZSA9ICIlcy5zcmNqYXIiICUgbmFtZSwKLSAgICAgICAgc3JjcyA9IFtvdXRfc3JjamFyXSwKLSAgICApCi0KLSAgICAjIFRvIHN1cHBvcnQgb3JnLmNoZWNrZXJmcmFtZXdvcmsuZGF0YWZsb3cucXVhbC5QdXJlLgotICAgIGNoZWNrZXJmcmFtZXdvcmtfYW5ub3RhdGlvbnMgPSBbCi0gICAgICAgICJAb3JnX2NoZWNrZXJmcmFtZXdvcmtfcXVhbCIsCi0gICAgXSBpZiAiLS1qYXZhLWNoZWNrZXJmcmFtZXdvcmsiIGluIGZsYXRjX2FyZ3MgZWxzZSBbXQotCi0gICAgYW5kcm9pZF9saWJyYXJ5KAotICAgICAgICBuYW1lID0gbmFtZSwKLSAgICAgICAgc3JjcyA9IFtvdXRfc3JjamFyXSwKLSAgICAgICAgamF2YWNvcHRzID0gWyItc291cmNlIDcgLXRhcmdldCA3Il0sCi0gICAgICAgIHZpc2liaWxpdHkgPSB2aXNpYmlsaXR5LAotICAgICAgICBkZXBzID0gWwotICAgICAgICAgICAgIkBmbGF0YnVmZmVycy8vOnJ1bnRpbWVfYW5kcm9pZCIsCi0gICAgICAgIF0gKyBjaGVja2VyZnJhbWV3b3JrX2Fubm90YXRpb25zLAotICAgICkKZGlmZiAtLWdpdCBhL2NpL2ZsYXRidWZmZXJzX2Zvcl90Zl9zeW5jL2ZsYXRidWZmZXJzLkJVSUxEIGIvY2kvZmxhdGJ1ZmZlcnNfZm9yX3RmX3N5bmMvZmxhdGJ1ZmZlcnMuQlVJTEQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwOGMwY2QuLjAwMDAwMDAKLS0tIGEvY2kvZmxhdGJ1ZmZlcnNfZm9yX3RmX3N5bmMvZmxhdGJ1ZmZlcnMuQlVJTEQKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotbG9hZCgiQGJ1aWxkX2JhemVsX3J1bGVzX2FuZHJvaWQvL2FuZHJvaWQ6cnVsZXMuYnpsIiwgImFuZHJvaWRfbGlicmFyeSIpCi1sb2FkKCI6YnVpbGRfZGVmcy5iemwiLCAiZmxhdGJ1ZmZlcl9weV9zdHJpcF9wcmVmaXhfc3JjcyIpCi0KLXBhY2thZ2UoZGVmYXVsdF92aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0pCi0KLWxpY2Vuc2VzKFsibm90aWNlIl0pICAjIEFwYWNoZSAyLjAKLQotZXhwb3J0c19maWxlcyhbIkxJQ0VOU0UudHh0Il0pCi0KLWxpY2Vuc2VzKFsibm90aWNlIl0pCi0KLWNvbmZpZ19zZXR0aW5nKAotICAgIG5hbWUgPSAiZnJlZWJzZCIsCi0gICAgdmFsdWVzID0geyJjcHUiOiAiZnJlZWJzZCJ9LAotKQotCi1jb25maWdfc2V0dGluZygKLSAgICBuYW1lID0gIndpbmRvd3MiLAotICAgIHZhbHVlcyA9IHsiY3B1IjogIng2NF93aW5kb3dzIn0sCi0pCi0KLWxvYWQoIkBydWxlc19jYy8vY2M6ZGVmcy5iemwiLCAiY2NfYmluYXJ5IiwgImNjX2xpYnJhcnkiKQotCi0jIFB1YmxpYyBmbGF0YyBsaWJyYXJ5IHRvIGNvbXBpbGUgZmxhdGJ1ZmZlciBmaWxlcyBhdCBydW50aW1lLgotY2NfbGlicmFyeSgKLSAgICBuYW1lID0gImZsYXRidWZmZXJzIiwKLSAgICBoZHJzID0gWyIvLzpwdWJsaWNfaGVhZGVycyJdLAotICAgIGxpbmtzdGF0aWMgPSAxLAotICAgIHN0cmlwX2luY2x1ZGVfcHJlZml4ID0gIi9pbmNsdWRlIiwKLSAgICB2aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0sCi0gICAgZGVwcyA9IFsiLy9zcmM6ZmxhdGJ1ZmZlcnMiXSwKLSkKLQotIyBQdWJsaWMgQysrIGhlYWRlcnMgZm9yIHRoZSBGbGF0YnVmZmVycyBsaWJyYXJ5LgotZmlsZWdyb3VwKAotICAgIG5hbWUgPSAicHVibGljX2hlYWRlcnMiLAotICAgIHNyY3MgPSBbCi0gICAgICAgICJpbmNsdWRlL2ZsYXRidWZmZXJzL2Jhc2UuaCIsCi0gICAgICAgICJpbmNsdWRlL2ZsYXRidWZmZXJzL2NvZGVfZ2VuZXJhdG9ycy5oIiwKLSAgICAgICAgImluY2x1ZGUvZmxhdGJ1ZmZlcnMvZmxhdGJ1ZmZlcnMuaCIsCi0gICAgICAgICJpbmNsdWRlL2ZsYXRidWZmZXJzL2ZsZXhidWZmZXJzLmgiLAotICAgICAgICAiaW5jbHVkZS9mbGF0YnVmZmVycy9oYXNoLmgiLAotICAgICAgICAiaW5jbHVkZS9mbGF0YnVmZmVycy9pZGwuaCIsCi0gICAgICAgICJpbmNsdWRlL2ZsYXRidWZmZXJzL21pbmlyZWZsZWN0LmgiLAotICAgICAgICAiaW5jbHVkZS9mbGF0YnVmZmVycy9yZWZsZWN0aW9uLmgiLAotICAgICAgICAiaW5jbHVkZS9mbGF0YnVmZmVycy9yZWZsZWN0aW9uX2dlbmVyYXRlZC5oIiwKLSAgICAgICAgImluY2x1ZGUvZmxhdGJ1ZmZlcnMvcmVnaXN0cnkuaCIsCi0gICAgICAgICJpbmNsdWRlL2ZsYXRidWZmZXJzL3N0bF9lbXVsYXRpb24uaCIsCi0gICAgICAgICJpbmNsdWRlL2ZsYXRidWZmZXJzL3V0aWwuaCIsCi0gICAgXSwKLSAgICB2aXNpYmlsaXR5ID0gWyIvLzpfX3N1YnBhY2thZ2VzX18iXSwKLSkKLQotIyBQdWJsaWMgZmxhdGMgY29tcGlsZXIgbGlicmFyeS4KLWNjX2xpYnJhcnkoCi0gICAgbmFtZSA9ICJmbGF0Y19saWJyYXJ5IiwKLSAgICBsaW5rc3RhdGljID0gMSwKLSAgICB2aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0sCi0gICAgZGVwcyA9IFsKLSAgICAgICAgIkBmbGF0YnVmZmVycy8vc3JjOmZsYXRjX2xpYnJhcnkiLAotICAgIF0sCi0pCi0KLSMgUHVibGljIGZsYXRjIGNvbXBpbGVyLgotY2NfYmluYXJ5KAotICAgIG5hbWUgPSAiZmxhdGMiLAotICAgIGxpbmtvcHRzID0gc2VsZWN0KHsKLSAgICAgICAgIjpmcmVlYnNkIjogWwotICAgICAgICAgICAgIi1sbSIsCi0gICAgICAgIF0sCi0gICAgICAgICI6d2luZG93cyI6IFtdLAotICAgICAgICAiLy9jb25kaXRpb25zOmRlZmF1bHQiOiBbCi0gICAgICAgICAgICAiLWxtIiwKLSAgICAgICAgICAgICItbGRsIiwKLSAgICAgICAgXSwKLSAgICB9KSwKLSAgICB2aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0sCi0gICAgZGVwcyA9IFsKLSAgICAgICAgIkBmbGF0YnVmZmVycy8vc3JjOmZsYXRjIiwKLSAgICBdLAotKQotCi1maWxlZ3JvdXAoCi0gICAgbmFtZSA9ICJmbGF0Y19oZWFkZXJzIiwKLSAgICBzcmNzID0gWwotICAgICAgICAiaW5jbHVkZS9mbGF0YnVmZmVycy9mbGF0Yy5oIiwKLSAgICBdLAotICAgIHZpc2liaWxpdHkgPSBbIi8vOl9fc3VicGFja2FnZXNfXyJdLAotKQotCi0jIExpYnJhcnkgdXNlZCBieSBmbGF0YnVmZmVyX2NjX2xpYnJhcnkgcnVsZXMuCi1jY19saWJyYXJ5KAotICAgIG5hbWUgPSAicnVudGltZV9jYyIsCi0gICAgaGRycyA9IFsKLSAgICAgICAgImluY2x1ZGUvZmxhdGJ1ZmZlcnMvYmFzZS5oIiwKLSAgICAgICAgImluY2x1ZGUvZmxhdGJ1ZmZlcnMvZmxhdGJ1ZmZlcnMuaCIsCi0gICAgICAgICJpbmNsdWRlL2ZsYXRidWZmZXJzL2ZsZXhidWZmZXJzLmgiLAotICAgICAgICAiaW5jbHVkZS9mbGF0YnVmZmVycy9zdGxfZW11bGF0aW9uLmgiLAotICAgICAgICAiaW5jbHVkZS9mbGF0YnVmZmVycy91dGlsLmgiLAotICAgIF0sCi0gICAgbGlua3N0YXRpYyA9IDEsCi0gICAgc3RyaXBfaW5jbHVkZV9wcmVmaXggPSAiL2luY2x1ZGUiLAotICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKLSkKLQotZmxhdGJ1ZmZlcl9weV9zdHJpcF9wcmVmaXhfc3JjcygKLSAgICBuYW1lID0gImZsYXRidWZmZXJfcHlfc3RyaXBfcHJlZml4IiwKLSAgICBzcmNzID0gWwotICAgICAgICAicHl0aG9uL2ZsYXRidWZmZXJzL19faW5pdF9fLnB5IiwKLSAgICAgICAgInB5dGhvbi9mbGF0YnVmZmVycy9idWlsZGVyLnB5IiwKLSAgICAgICAgInB5dGhvbi9mbGF0YnVmZmVycy9jb21wYXQucHkiLAotICAgICAgICAicHl0aG9uL2ZsYXRidWZmZXJzL2VuY29kZS5weSIsCi0gICAgICAgICJweXRob24vZmxhdGJ1ZmZlcnMvbnVtYmVyX3R5cGVzLnB5IiwKLSAgICAgICAgInB5dGhvbi9mbGF0YnVmZmVycy9wYWNrZXIucHkiLAotICAgICAgICAicHl0aG9uL2ZsYXRidWZmZXJzL3RhYmxlLnB5IiwKLSAgICAgICAgInB5dGhvbi9mbGF0YnVmZmVycy91dGlsLnB5IiwKLSAgICBdLAotICAgIHN0cmlwX3ByZWZpeCA9ICJweXRob24vZmxhdGJ1ZmZlcnMvIiwKLSkKLQotZmlsZWdyb3VwKAotICAgIG5hbWUgPSAicnVudGltZV9weV9zcmNzIiwKLSAgICBzcmNzID0gWwotICAgICAgICAiX19pbml0X18ucHkiLAotICAgICAgICAiYnVpbGRlci5weSIsCi0gICAgICAgICJjb21wYXQucHkiLAotICAgICAgICAiZW5jb2RlLnB5IiwKLSAgICAgICAgIm51bWJlcl90eXBlcy5weSIsCi0gICAgICAgICJwYWNrZXIucHkiLAotICAgICAgICAidGFibGUucHkiLAotICAgICAgICAidXRpbC5weSIsCi0gICAgXSwKLSkKLQotcHlfbGlicmFyeSgKLSAgICBuYW1lID0gInJ1bnRpbWVfcHkiLAotICAgIHNyY3MgPSBbIjpydW50aW1lX3B5X3NyY3MiXSwKLSAgICB2aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0sCi0pCi0KLWZpbGVncm91cCgKLSAgICBuYW1lID0gInJ1bnRpbWVfamF2YV9zcmNzIiwKLSAgICBzcmNzID0gZ2xvYihbImphdmEvY29tL2dvb2dsZS9mbGF0YnVmZmVycy8qKi8qLmphdmEiXSksCi0pCi0KLWphdmFfbGlicmFyeSgKLSAgICBuYW1lID0gInJ1bnRpbWVfamF2YSIsCi0gICAgc3JjcyA9IFsiOnJ1bnRpbWVfamF2YV9zcmNzIl0sCi0gICAgdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdLAotKQotCi1hbmRyb2lkX2xpYnJhcnkoCi0gICAgbmFtZSA9ICJydW50aW1lX2FuZHJvaWQiLAotICAgIHNyY3MgPSBbIjpydW50aW1lX2phdmFfc3JjcyJdLAotICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKLSkKZGlmZiAtLWdpdCBhL2NpL2ZsYXRidWZmZXJzX2Zvcl90Zl9zeW5jL3dvcmtzcGFjZS5iemwgYi9jaS9mbGF0YnVmZmVyc19mb3JfdGZfc3luYy93b3Jrc3BhY2UuYnpsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWMxZmQ5Li4wMDAwMDAwCi0tLSBhL2NpL2ZsYXRidWZmZXJzX2Zvcl90Zl9zeW5jL3dvcmtzcGFjZS5iemwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0iIiJMb2FkcyB0aGUgRmxhdGJ1ZmZlcnMgbGlicmFyeSwgdXNlZCBieSBURiBMaXRlLiIiIgotCi1sb2FkKCIvL3RoaXJkX3BhcnR5OnJlcG8uYnpsIiwgInRmX2h0dHBfYXJjaGl2ZSIsICJ0Zl9taXJyb3JfdXJscyIpCi0KLWRlZiByZXBvKCk6Ci0gICAgdGZfaHR0cF9hcmNoaXZlKAotICAgICAgICBuYW1lID0gImZsYXRidWZmZXJzIiwKLSAgICAgICAgc3RyaXBfcHJlZml4ID0gImZsYXRidWZmZXJzLTEuMTIuMCIsCi0gICAgICAgIHNoYTI1NiA9ICI2MmYyMjIzZmI5MTgxZDFkNjMzODQ1MTM3NTYyODk3NTc3NWY3NTIyMTg1MjY2Y2Q1Mjk2NTcxYWMxNTJiYzQ1IiwKLSAgICAgICAgdXJscyA9IHRmX21pcnJvcl91cmxzKCJodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2ZsYXRidWZmZXJzL2FyY2hpdmUvdjEuMTIuMC50YXIuZ3oiKSwKLSAgICAgICAgYnVpbGRfZmlsZSA9ICIvL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzOmZsYXRidWZmZXJzLkJVSUxEIiwKLSAgICAgICAgc3lzdGVtX2J1aWxkX2ZpbGUgPSAiLy90aGlyZF9wYXJ0eS9mbGF0YnVmZmVyczpCVUlMRC5zeXN0ZW0iLAotICAgICAgICBsaW5rX2ZpbGVzID0gewotICAgICAgICAgICAgIi8vdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnM6YnVpbGRfZGVmcy5iemwiOiAiYnVpbGRfZGVmcy5iemwiLAotICAgICAgICB9LAotICAgICkKZGlmZiAtLWdpdCBhL2NpL2luc3RhbGxfYmF6ZWxpc2suc2ggYi9jaS9pbnN0YWxsX2JhemVsaXNrLnNoCmluZGV4IGQyZjhhMTMuLmRiMzg1ZTYgMTAwNzU1Ci0tLSBhL2NpL2luc3RhbGxfYmF6ZWxpc2suc2gKKysrIGIvY2kvaW5zdGFsbF9iYXplbGlzay5zaApAQCAtMTgsNSArMTgsNSBAQAogd2dldCBodHRwczovL2dpdGh1Yi5jb20vYmF6ZWxidWlsZC9iYXplbGlzay9yZWxlYXNlcy9kb3dubG9hZC92MS4xNi4wL2JhemVsaXNrLWxpbnV4LWFtZDY0CiBtdiBiYXplbGlzay1saW51eC1hbWQ2NCBiYXplbAogY2htb2QgK3ggYmF6ZWwKLXN1ZG8gbXYgYmF6ZWwgL3Vzci9sb2NhbC9iaW4KK212IGJhemVsIC91c3IvbG9jYWwvYmluCiAKZGlmZiAtLWdpdCBhL2NpL2luc3RhbGxfY29yZXNfeHBsb3Jlcl8xMS5zaCBiL2NpL2luc3RhbGxfY29yZXNfeHBsb3Jlcl8xMS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZGYwMGNiCi0tLSAvZGV2L251bGwKKysrIGIvY2kvaW5zdGFsbF9jb3Jlc194cGxvcmVyXzExLnNoCkBAIC0wLDAgKzEsMTkgQEAKKyMhL2Jpbi9iYXNoCisKK21rZGlyIC9vcHQveHRlbnNhL2xpY2Vuc2VzCisKK21rZGlyIC1wIC9vcHQveHRlbnNhL1h0RGV2VG9vbHMvaW5zdGFsbC90b29scy8KK3RhciB4dnpmIFh0ZW5zYVRvb2xzX1JJXzIwMjJfOV9saW51eC50Z3ogLS1kaXIgL29wdC94dGVuc2EvWHREZXZUb29scy9pbnN0YWxsL3Rvb2xzLworCisKKyMjIyMjIyMjIyMjCisjICBIaWZpbWluaQorIyMjIyMjIyMjIyMKK2NkIC9vcHQveHRlbnNhLwordGFyIHh2emYgbWluaTFtMW1fUklfMjAxOV8yX2xpbnV4X3dfa2V5cy50Z3ogLS1kaXIgL29wdC94dGVuc2EvbGljZW5zZXMvCitjZCAvb3B0L3h0ZW5zYS9saWNlbnNlcy9SSS0yMDE5LjItbGludXgvbWluaTFtMW1fUkcvCisKKy4vaW5zdGFsbCAtLXh0ZW5zYS10b29scyBcCisgIC9vcHQveHRlbnNhL1h0RGV2VG9vbHMvaW5zdGFsbC90b29scy9SSS0yMDE5LjItbGludXgvWHRlbnNhVG9vbHMvIFwKKyAgLS1uby1kZWZhdWx0IFwKKyAgLS1uby1yZXBsYWNlCmRpZmYgLS1naXQgYS9jaS9pbnN0YWxsX2NvcmVzX3hwbG9yZXJfMTMuc2ggYi9jaS9pbnN0YWxsX2NvcmVzX3hwbG9yZXJfMTMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTI0YjFmMwotLS0gL2Rldi9udWxsCisrKyBiL2NpL2luc3RhbGxfY29yZXNfeHBsb3Jlcl8xMy5zaApAQCAtMCwwICsxLDM5IEBACisjIS9iaW4vYmFzaAorCitta2RpciAvb3B0L3h0ZW5zYS9saWNlbnNlcworCisjIyMjIyMjIyMjIyMjIworIyAgRnVzaW9uIEYxCisjIyMjIyMjIyMjIyMjIworY2QgL29wdC94dGVuc2EvCit0YXIgeHZ6ZiBGMV8xOTAzMDVfc3d1cGdyYWRlX2xpbnV4LnRneiAtLWRpciAvb3B0L3h0ZW5zYS9saWNlbnNlcy8KK2NkIC9vcHQveHRlbnNhL2xpY2Vuc2VzL1JJLTIwMjAuNC1saW51eC9GMV8xOTAzMDVfc3d1cGdyYWRlLworCisuL2luc3RhbGwgLS14dGVuc2EtdG9vbHMgXAorICAvb3B0L3h0ZW5zYS9YdERldlRvb2xzL2luc3RhbGwvdG9vbHMvUkktMjAyMC40LWxpbnV4L1h0ZW5zYVRvb2xzLyBcCisgIC0tbm8tZGVmYXVsdCBcCisgIC0tbm8tcmVwbGFjZQorCisjIyMjIyMjIyMjIyMjIworIyAgVmlzaW9uIFA2CisjIyMjIyMjIyMjIyMjIworY2QgL29wdC94dGVuc2EvCit0YXIgeHZ6ZiBQNl8yMDA1MjhfbGludXgudGd6IC0tZGlyIC9vcHQveHRlbnNhL2xpY2Vuc2VzLworY2QgL29wdC94dGVuc2EvbGljZW5zZXMvUkktMjAyMC40LWxpbnV4L1A2XzIwMDUyOC8KKworLi9pbnN0YWxsIC0teHRlbnNhLXRvb2xzIFwKKyAgL29wdC94dGVuc2EvWHREZXZUb29scy9pbnN0YWxsL3Rvb2xzL1JJLTIwMjAuNC1saW51eC9YdGVuc2FUb29scy8gXAorICAtLW5vLWRlZmF1bHQgXAorICAtLW5vLXJlcGxhY2UKKworIyMjIyMjIyMjIyMjIyMKKyMgIEhpZmkzWgorIyMjIyMjIyMjIyMjIyMKK2NkIC9vcHQveHRlbnNhLwordGFyIHh2emYgSElGSV8xOTAzMDRfc3d1cGdyYWRlX2xpbnV4LnRneiAtLWRpciAvb3B0L3h0ZW5zYS9saWNlbnNlcy8KK2NkIC9vcHQveHRlbnNhL2xpY2Vuc2VzL1JJLTIwMjAuNC1saW51eC9ISUZJXzE5MDMwNF9zd3VwZ3JhZGUvCisKKy4vaW5zdGFsbCAtLXh0ZW5zYS10b29scyBcCisgIC9vcHQveHRlbnNhL1h0RGV2VG9vbHMvaW5zdGFsbC90b29scy9SSS0yMDIwLjQtbGludXgvWHRlbnNhVG9vbHMvIFwKKyAgLS1uby1kZWZhdWx0IFwKKyAgLS1uby1yZXBsYWNlCmRpZmYgLS1naXQgYS9jaS9pbnN0YWxsX2NvcmVzX3hwbG9yZXJfc29sby5zaCBiL2NpL2luc3RhbGxfY29yZXNfeHBsb3Jlcl9zb2xvLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU1OWM2N2EKLS0tIC9kZXYvbnVsbAorKysgYi9jaS9pbnN0YWxsX2NvcmVzX3hwbG9yZXJfc29sby5zaApAQCAtMCwwICsxLDE5IEBACisjIS9iaW4vYmFzaAorCitta2RpciAvb3B0L3h0ZW5zYS9saWNlbnNlcworCitta2RpciAtcCAvb3B0L3h0ZW5zYS9YdERldlRvb2xzL2luc3RhbGwvdG9vbHMvCit0YXIgeHZ6ZiBYdGVuc2FUb29sc19SSV8yMDIyXzlfbGludXgudGd6IC0tZGlyIC9vcHQveHRlbnNhL1h0RGV2VG9vbHMvaW5zdGFsbC90b29scy8KKworCisjIyMjIyMjIyMjIworIyAgSGlmaTUKKyMjIyMjIyMjIyMjCitjZCAvb3B0L3h0ZW5zYS8KK3RhciB4dnpmIFBSRF9INV9SRE9fMDdfMDFfMjAyMl9saW51eC50Z3ogLS1kaXIgL29wdC94dGVuc2EvbGljZW5zZXMvCitjZCAvb3B0L3h0ZW5zYS9saWNlbnNlcy9SSS0yMDIyLjktbGludXgvUFJEX0g1X1JET18wN18wMV8yMDIyLworCisuL2luc3RhbGwgLS14dGVuc2EtdG9vbHMgXAorICAvb3B0L3h0ZW5zYS9YdERldlRvb2xzL2luc3RhbGwvdG9vbHMvUkktMjAyMi45LWxpbnV4L1h0ZW5zYVRvb2xzLyBcCisgIC0tbm8tZGVmYXVsdCBcCisgIC0tbm8tcmVwbGFjZQpkaWZmIC0tZ2l0IGEvY2kvc3luY19mcm9tX3Vwc3RyZWFtX3RmLnNoIGIvY2kvc3luY19mcm9tX3Vwc3RyZWFtX3RmLnNoCmluZGV4IDA5NGRmNjUuLmJiNWQwOTggMTAwNzU1Ci0tLSBhL2NpL3N5bmNfZnJvbV91cHN0cmVhbV90Zi5zaAorKysgYi9jaS9zeW5jX2Zyb21fdXBzdHJlYW1fdGYuc2gKQEAgLTQ3LDYgKzQ3LDcgQEAKIGdpdCBjaGVja291dCB0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9vcHRpbWl6ZWQvbmVvbl9jaGVjay5oCiAjIGh0dHA6Ly9iLzE0OTg2MjgxMwogZ2l0IGNoZWNrb3V0IHRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3J1bnRpbWVfc2hhcGUuaAorZ2l0IGNoZWNrb3V0IHRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3J1bnRpbWVfc2hhcGUuY2MKICMgaHR0cDovL2IvMTg3NzI4ODkxCiBnaXQgY2hlY2tvdXQgdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvb3BfbWFjcm9zLmgKICMgaHR0cDovL2IvMjQyMDc3ODQzCkBAIC01Nyw4ICs1OCw4IEBACiBiYXplbCBidWlsZCB0ZW5zb3JmbG93L2xpdGUvcHl0aG9uOnNjaGVtYV9weQogL2Jpbi9jcCBiYXplbC1iaW4vdGVuc29yZmxvdy9saXRlL3B5dGhvbi9zY2hlbWFfcHlfZ2VuZXJhdGVkLnB5IHRlbnNvcmZsb3cvbGl0ZS9weXRob24vc2NoZW1hX3B5X2dlbmVyYXRlZC5weQogCi1iYXplbCBidWlsZCB0ZW5zb3JmbG93L2xpdGUvc2NoZW1hOnNjaGVtYV9mYnNfc3JjcwotL2Jpbi9jcCAuL2JhemVsLWJpbi90ZW5zb3JmbG93L2xpdGUvc2NoZW1hL3NjaGVtYV9nZW5lcmF0ZWQuaCB0ZW5zb3JmbG93L2xpdGUvc2NoZW1hL3NjaGVtYV9nZW5lcmF0ZWQuaAorYmF6ZWwgYnVpbGQgdGVuc29yZmxvdy9jb21waWxlci9tbGlyL2xpdGUvc2NoZW1hOnNjaGVtYV9mYnNfc3JjcworL2Jpbi9jcCAuL2JhemVsLWJpbi90ZW5zb3JmbG93L2NvbXBpbGVyL21saXIvbGl0ZS9zY2hlbWEvc2NoZW1hX2dlbmVyYXRlZC5oIHRlbnNvcmZsb3cvbGl0ZS9zY2hlbWEvc2NoZW1hX2dlbmVyYXRlZC5oCiAKICMgTXVzdCBjbGVhbiB0aGUgYmF6ZWwgZGlyZWN0b3JpZXMgb3V0IGFmdGVyIGJ1aWxkaW5nIGFzIHdlIGRvbid0IGNoZWNrIHRoZXNlIGluLgogYmF6ZWwgY2xlYW4KZGlmZiAtLWdpdCBhL2NpL3RmbGl0ZV9maWxlcy50eHQgYi9jaS90ZmxpdGVfZmlsZXMudHh0CmluZGV4IDUxMzgxY2UuLjY1MTQxMzcgMTAwNjQ0Ci0tLSBhL2NpL3RmbGl0ZV9maWxlcy50eHQKKysrIGIvY2kvdGZsaXRlX2ZpbGVzLnR4dApAQCAtMSwzICsxLDYgQEAKK3RlbnNvcmZsb3cvY29tcGlsZXIvbWxpci9saXRlL3NjaGVtYS9zY2hlbWEuZmJzCit0ZW5zb3JmbG93L2NvbXBpbGVyL21saXIvbGl0ZS9zY2hlbWEvc2NoZW1hX3V0aWxzLmgKK3RlbnNvcmZsb3cvY29tcGlsZXIvbWxpci9saXRlL3NjaGVtYS9zY2hlbWFfdXRpbHMuY2MKIHRlbnNvcmZsb3cvbGl0ZS9hcnJheS5oCiB0ZW5zb3JmbG93L2xpdGUvYXJyYXkuY2MKIHRlbnNvcmZsb3cvbGl0ZS9idWlsdGluX29wX2RhdGEuaApAQCAtMTIsNyArMTUsNiBAQAogdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvdGVuc29yX2N0eXBlcy5jYwogdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvcmVmZXJlbmNlL2NvbXBhcmlzb25zLmNjCiB0ZW5zb3JmbG93L2xpdGUva2VybmVscy9rZXJuZWxfdXRpbC5jYwotdGVuc29yZmxvdy9saXRlL3NjaGVtYS9zY2hlbWFfdXRpbHMuY2MKIHRlbnNvcmZsb3cvbGl0ZS9jL2J1aWx0aW5fb3BfZGF0YS5oCiB0ZW5zb3JmbG93L2xpdGUvYy9jX2FwaV90eXBlcy5oCiB0ZW5zb3JmbG93L2xpdGUvYy9jb21tb24uaApAQCAtMTA4LDcgKzExMCw2IEBACiB0ZW5zb3JmbG93L2xpdGUvcG9ydGFibGVfdHlwZV90b190ZmxpdGV0eXBlLmgKIHRlbnNvcmZsb3cvbGl0ZS9weXRob24vc2NoZW1hX3V0aWwucHkKIHRlbnNvcmZsb3cvbGl0ZS9zY2hlbWEvc2NoZW1hX3V0aWxzLmgKLXRlbnNvcmZsb3cvbGl0ZS9zY2hlbWEvc2NoZW1hLmZicwogdGVuc29yZmxvdy9saXRlL3Rvb2xzL2ZsYXRidWZmZXJfdXRpbHMucHkKIHRlbnNvcmZsb3cvbGl0ZS90b29scy9mbGF0YnVmZmVyX3V0aWxzX3Rlc3QucHkKIHRlbnNvcmZsb3cvbGl0ZS90b29scy9yYW5kb21pemVfd2VpZ2h0cy5weQpkaWZmIC0tZ2l0IGEvY29kZWdlbi9CVUlMRCBiL2NvZGVnZW4vQlVJTEQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU2MmMwNAotLS0gL2Rldi9udWxsCisrKyBiL2NvZGVnZW4vQlVJTEQKQEAgLTAsMCArMSw3MSBAQAorbG9hZCgiQHJ1bGVzX3B5dGhvbi8vcHl0aG9uOmRlZnMuYnpsIiwgInB5X2JpbmFyeSIsICJweV9saWJyYXJ5IikKK2xvYWQoIkB0ZmxtX3BpcF9kZXBzLy86cmVxdWlyZW1lbnRzLmJ6bCIsICJyZXF1aXJlbWVudCIpCisKK3BhY2thZ2UoCisgICAgZGVmYXVsdF92aXNpYmlsaXR5ID0gWyIvLzpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlcyA9IFsibm90aWNlIl0sCispCisKK3B5X2xpYnJhcnkoCisgICAgbmFtZSA9ICJncmFwaCIsCisgICAgc3JjcyA9IFsKKyAgICAgICAgImdyYXBoLnB5IiwKKyAgICBdLAorICAgIGRlcHMgPSBbCisgICAgICAgICI6dGVuc29yIiwKKyAgICAgICAgIjp1dGlscyIsCisgICAgICAgICIvL2NvZGVnZW4vb3BlcmF0b3JzOmZhY3RvcnkiLAorICAgICAgICAiLy9jb2RlZ2VuL29wZXJhdG9yczpvcGVyYXRvciIsCisgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9weXRob246c2NoZW1hX3B5IiwKKyAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL3Rvb2xzOnZpc3VhbGl6ZSIsCisgICAgXSwKKykKKworcHlfbGlicmFyeSgKKyAgICBuYW1lID0gImluZmVyZW5jZV9nZW5lcmF0b3IiLAorICAgIHNyY3MgPSBbCisgICAgICAgICJpbmZlcmVuY2VfZ2VuZXJhdG9yLnB5IiwKKyAgICBdLAorICAgIGRhdGEgPSBbCisgICAgICAgICJ0ZW1wbGF0ZXMvaW5mZXJlbmNlLmNjLm1ha28iLAorICAgICAgICAidGVtcGxhdGVzL2luZmVyZW5jZS5oLm1ha28iLAorICAgIF0sCisgICAgZGVwcyA9IFsKKyAgICAgICAgIjpncmFwaCIsCisgICAgICAgIHJlcXVpcmVtZW50KCJtYWtvIiksCisgICAgXSwKKykKKworcHlfbGlicmFyeSgKKyAgICBuYW1lID0gInRlbnNvciIsCisgICAgc3JjcyA9IFsKKyAgICAgICAgInRlbnNvci5weSIsCisgICAgXSwKKyAgICBkZXBzID0gWworICAgICAgICAiOnV0aWxzIiwKKyAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL3B5dGhvbjpzY2hlbWFfcHkiLAorICAgIF0sCispCisKK3B5X2xpYnJhcnkoCisgICAgbmFtZSA9ICJ1dGlscyIsCisgICAgc3JjcyA9IFsKKyAgICAgICAgInV0aWxzLnB5IiwKKyAgICBdLAorKQorCitweV9iaW5hcnkoCisgICAgbmFtZSA9ICJjb2RlX2dlbmVyYXRvciIsCisgICAgc3JjcyA9IFsKKyAgICAgICAgImNvZGVfZ2VuZXJhdG9yLnB5IiwKKyAgICBdLAorICAgIHB5dGhvbl92ZXJzaW9uID0gIlBZMyIsCisgICAgc3Jjc192ZXJzaW9uID0gIlBZMyIsCisgICAgZGVwcyA9IFsKKyAgICAgICAgIjpncmFwaCIsCisgICAgICAgICI6aW5mZXJlbmNlX2dlbmVyYXRvciIsCisgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS90b29sczpmbGF0YnVmZmVyX3V0aWxzIiwKKyAgICAgICAgIkBhYnNsX3B5Ly9hYnNsOmFwcCIsCisgICAgICAgICJAYWJzbF9weS8vYWJzbC9mbGFncyIsCisgICAgXSwKKykKZGlmZiAtLWdpdCBhL2NvZGVnZW4vUkVBRE1FLm1kIGIvY29kZWdlbi9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY3ZTlkMgotLS0gL2Rldi9udWxsCisrKyBiL2NvZGVnZW4vUkVBRE1FLm1kCkBAIC0wLDAgKzEsMyBAQAorIyBURkxNIENvZGUgR2VuZXJhdG9yCisKK1RoaXMgaXMgYSB3b3JrIGluIHByb2dyZXNzIGV4cGVyaW1lbnQuIEl0IGlzIG5vdCByZWFkeSBmb3IgdXNlLgpkaWZmIC0tZ2l0IGEvY29kZWdlbi9idWlsZF9kZWYuYnpsIGIvY29kZWdlbi9idWlsZF9kZWYuYnpsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YjYyMzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb2RlZ2VuL2J1aWxkX2RlZi5iemwKQEAgLTAsMCArMSw0NCBAQAorIiIiIEJ1aWxkIHJ1bGUgZm9yIGdlbmVyYXRpbmcgTUwgaW5mZXJlbmNlIGNvZGUgZnJvbSBURkxpdGUgbW9kZWwuICIiIgorCitsb2FkKCIvL3RlbnNvcmZsb3cvbGl0ZS9taWNybzpidWlsZF9kZWYuYnpsIiwgIm1pY3JvX2NvcHRzIikKKworZGVmIHRmbG1faW5mZXJlbmNlX2xpYnJhcnkoCisgICAgICAgIG5hbWUsCisgICAgICAgIHRmbGl0ZV9tb2RlbCwKKyAgICAgICAgdmlzaWJpbGl0eSA9IE5vbmUpOgorICAgICIiIkNyZWF0ZXMgYSBDKysgbGlicmFyeSBjYXBhYmxlIG9mIHBlcmZvcm1pbmcgTUwgaW5mZXJlbmNlIG9mIHRoZSBwcm92aWRlZAorICAgIG1vZGVsLgorCisgICAgQXJnczoKKyAgICAgIG5hbWU6IFRhcmdldCBuYW1lLgorICAgICAgdGZsaXRlX21vZGVsOiBURkxpdGUgTW9kZWwgdG8gZ2VuZXJhdGUgaW5mZXJlbmNlIGZyb20uCisgICAgICB2aXNpYmlsaXR5OiBWaXNpYmlsaXR5IGZvciB0aGUgQysrIGxpYnJhcnkuCisgICAgIiIiCisgICAgZ2VuZXJhdGVkX3RhcmdldCA9IG5hbWUgKyAiX2dlbiIKKyAgICBuYXRpdmUuZ2VucnVsZSgKKyAgICAgICAgbmFtZSA9IGdlbmVyYXRlZF90YXJnZXQsCisgICAgICAgIHNyY3MgPSBbdGZsaXRlX21vZGVsXSwKKyAgICAgICAgb3V0cyA9IFtuYW1lICsgIi5oIiwgbmFtZSArICIuY2MiXSwKKyAgICAgICAgdG9vbHMgPSBbIi8vY29kZWdlbjpjb2RlX2dlbmVyYXRvciJdLAorICAgICAgICBjbWQgPSAiJChsb2NhdGlvbiAvL2NvZGVnZW46Y29kZV9nZW5lcmF0b3IpICIgKworICAgICAgICAgICAgICAiLS1tb2RlbD0kPCAtLW91dHB1dF9kaXI9JChSVUxFRElSKSAtLW91dHB1dF9uYW1lPSVzIiAlIG5hbWUsCisgICAgICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwcml2YXRlIl0sCisgICAgKQorCisgICAgbmF0aXZlLmNjX2xpYnJhcnkoCisgICAgICAgIG5hbWUgPSBuYW1lLAorICAgICAgICBoZHJzID0gW25hbWUgKyAiLmgiXSwKKyAgICAgICAgc3JjcyA9IFtuYW1lICsgIi5jYyJdLAorICAgICAgICBkZXBzID0gWworICAgICAgICAgICAgZ2VuZXJhdGVkX3RhcmdldCwKKyAgICAgICAgICAgICIvL2NvZGVnZW4vcnVudGltZTptaWNyb19jb2RlZ2VuX2NvbnRleHQiLAorICAgICAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL2M6Y29tbW9uIiwKKyAgICAgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9jOmNfYXBpX3R5cGVzIiwKKyAgICAgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsOmNvbXBhdGliaWxpdHkiLAorICAgICAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHM6bWljcm9fb3BzIiwKKyAgICAgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNybzptaWNyb19jb21tb24iLAorICAgICAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvOm1pY3JvX2NvbnRleHQiLAorICAgICAgICBdLAorICAgICAgICBjb3B0cyA9IG1pY3JvX2NvcHRzKCksCisgICAgICAgIHZpc2liaWxpdHkgPSB2aXNpYmlsaXR5LAorICAgICkKZGlmZiAtLWdpdCBhL2NvZGVnZW4vY29kZV9nZW5lcmF0b3IucHkgYi9jb2RlZ2VuL2NvZGVfZ2VuZXJhdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxY2FiNzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb2RlZ2VuL2NvZGVfZ2VuZXJhdG9yLnB5CkBAIC0wLDAgKzEsNjYgQEAKKyMgQ29weXJpZ2h0IDIwMjMgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisiIiIgR2VuZXJhdGVzIEMvQysrIHNvdXJjZSBjb2RlIGNhcGFibGUgb2YgcGVyZm9ybWluZyBpbmZlcmVuY2UgZm9yIGEgbW9kZWwuICIiIgorCitpbXBvcnQgb3MKKworZnJvbSBhYnNsIGltcG9ydCBhcHAKK2Zyb20gYWJzbCBpbXBvcnQgZmxhZ3MKK2Zyb20gY29sbGVjdGlvbnMuYWJjIGltcG9ydCBTZXF1ZW5jZQorCitmcm9tIHRmbGl0ZV9taWNyby5jb2RlZ2VuIGltcG9ydCBpbmZlcmVuY2VfZ2VuZXJhdG9yCitmcm9tIHRmbGl0ZV9taWNyby5jb2RlZ2VuIGltcG9ydCBncmFwaAorZnJvbSB0ZmxpdGVfbWljcm8udGVuc29yZmxvdy5saXRlLnRvb2xzIGltcG9ydCBmbGF0YnVmZmVyX3V0aWxzCisKKyMgVXNhZ2UgaW5mb3JtYXRpb246CisjIERlZmF1bHQ6CisjICAgYGJhemVsIHJ1biBjb2RlZ2VuOmNvZGVfZ2VuZXJhdG9yIC0tIFwKKyMgICAgICAgIC0tbW9kZWw9PC9wYXRoL3RvL215X21vZGVsLnRmbGl0ZT4KKyMgT3V0cHV0IHdpbGwgYmUgbG9jYXRlZCBhdDogL3BhdGgvdG8vbXlfbW9kZWwuaHxjYworCitfTU9ERUxfUEFUSCA9IGZsYWdzLkRFRklORV9zdHJpbmcobmFtZT0ibW9kZWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJQYXRoIHRvIHRoZSBURkxpdGUgbW9kZWwgZmlsZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPVRydWUpCisKK19PVVRQVVRfRElSID0gZmxhZ3MuREVGSU5FX3N0cmluZygKKyAgICBuYW1lPSJvdXRwdXRfZGlyIiwKKyAgICBkZWZhdWx0PU5vbmUsCisgICAgaGVscD0iUGF0aCB0byB3cml0ZSBnZW5lcmF0ZWQgc291cmNlIHRvLiBMZWF2ZSBibGFuayB0byB1c2UgJ21vZGVsJyBwYXRoLiIsCisgICAgcmVxdWlyZWQ9RmFsc2UpCisKK19PVVRQVVRfTkFNRSA9IGZsYWdzLkRFRklORV9zdHJpbmcoCisgICAgbmFtZT0ib3V0cHV0X25hbWUiLAorICAgIGRlZmF1bHQ9Tm9uZSwKKyAgICBoZWxwPSgiVGhlIG91dHB1dCBiYXNlbmFtZSBmb3IgdGhlIGdlbmVyYXRlZCAuaC8uY2MuIExlYXZlIGJsYW5rIHRvIHVzZSAiCisgICAgICAgICAgIidtb2RlbCcgYmFzZW5hbWUuIiksCisgICAgcmVxdWlyZWQ9RmFsc2UpCisKKworZGVmIG1haW4oYXJndjogU2VxdWVuY2Vbc3RyXSkgLT4gTm9uZToKKyAgb3V0cHV0X2RpciA9IF9PVVRQVVRfRElSLnZhbHVlIG9yIG9zLnBhdGguZGlybmFtZShfTU9ERUxfUEFUSC52YWx1ZSkKKyAgb3V0cHV0X25hbWUgPSBfT1VUUFVUX05BTUUudmFsdWUgb3Igb3MucGF0aC5zcGxpdGV4dCgKKyAgICAgIG9zLnBhdGguYmFzZW5hbWUoX01PREVMX1BBVEgudmFsdWUpKVswXQorCisgIG1vZGVsID0gZmxhdGJ1ZmZlcl91dGlscy5yZWFkX21vZGVsKF9NT0RFTF9QQVRILnZhbHVlKQorCisgIHByaW50KCJHZW5lcmF0aW5nIGluZmVyZW5jZSBjb2RlIGZvciBtb2RlbDoge30iLmZvcm1hdChfTU9ERUxfUEFUSC52YWx1ZSkpCisKKyAgaW5mZXJlbmNlX2dlbmVyYXRvci5nZW5lcmF0ZShvdXRwdXRfZGlyLCBvdXRwdXRfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFwaC5PcENvZGVUYWJsZShbbW9kZWxdKSwgZ3JhcGguR3JhcGgobW9kZWwpKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgIGFwcC5ydW4obWFpbikKZGlmZiAtLWdpdCBhL2NvZGVnZW4vZXhhbXBsZXMvaGVsbG9fd29ybGQvQlVJTEQgYi9jb2RlZ2VuL2V4YW1wbGVzL2hlbGxvX3dvcmxkL0JVSUxECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NDI1Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb2RlZ2VuL2V4YW1wbGVzL2hlbGxvX3dvcmxkL0JVSUxECkBAIC0wLDAgKzEsMTcgQEAKK2xvYWQoIi8vY29kZWdlbjpidWlsZF9kZWYuYnpsIiwgInRmbG1faW5mZXJlbmNlX2xpYnJhcnkiKQorCitwYWNrYWdlKGRlZmF1bHRfdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdKQorCit0ZmxtX2luZmVyZW5jZV9saWJyYXJ5KAorICAgIG5hbWUgPSAiaGVsbG9fd29ybGRfbW9kZWwiLAorICAgIHRmbGl0ZV9tb2RlbCA9ICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9oZWxsb193b3JsZC9tb2RlbHM6aGVsbG9fd29ybGRfaW50OC50ZmxpdGUiLAorKQorCitjY19iaW5hcnkoCisgICAgbmFtZSA9ICJoZWxsb193b3JsZCIsCisgICAgc3JjcyA9IFsiaGVsbG9fd29ybGQuY2MiXSwKKyAgICBkZXBzID0gWworICAgICAgICAiOmhlbGxvX3dvcmxkX21vZGVsIiwKKyAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL2M6Y19hcGlfdHlwZXMiLAorICAgIF0sCispCmRpZmYgLS1naXQgYS9jb2RlZ2VuL2V4YW1wbGVzL2hlbGxvX3dvcmxkL1JFQURNRS5tZCBiL2NvZGVnZW4vZXhhbXBsZXMvaGVsbG9fd29ybGQvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyYWZlZTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb2RlZ2VuL2V4YW1wbGVzL2hlbGxvX3dvcmxkL1JFQURNRS5tZApAQCAtMCwwICsxLDI3IEBACisjIENvZGVnZW4gSGVsbG8gV29ybGQgRXhhbXBsZQorCitUaGlzIGlzIGEgY29kZS1nZW5lcmF0ZWQgZXhhbXBsZSBvZiB0aGUgaGVsbG8gd29ybGQgbW9kZWwuIFRoZSBnZW5lcmF0ZWQgc291cmNlCitpcyBjaGVja2VkIGluIGZvciBub3cgc28gdGhhdCBpdCBjYW4gYmUgcmV2aWV3ZWQgZHVyaW5nIHRoZSBwcm90b3R5cGluZyBzdGFnZS4KKworIyMgQnVpbGRpbmcgdGhlIGV4YW1wbGUgZXhlY3V0YWJsZQorUGxlYXNlIG5vdGUgdGhhdCB0aGlzIHdpbGwgZXhlY3V0ZSBCYXplbCBmcm9tIG1ha2UgYXMgcGFydCBvZiB0aGUgcHJvY2Vzcy4KKworYGBgCitiYXplbCBidWlsZCAvL2NvZGVnZW4vZXhhbXBsZXMvaGVsbG9fd29ybGQ6aGVsbG9fd29ybGQKK2BgYAorCisjIyBSdW5uaW5nIHRoZSBleGFtcGxlCisKK1RPRE8ocmphc2NhbmkpOiBUaGUgY29tbWFuZCB3b3JrcywgYnV0IGl0J2xsIGp1c3QgY3Jhc2ggYXMgd2UgZG9uJ3QgaGF2ZSBhbGwgb2YKK3RoZSBkYXRhIHN0cnVjdHVyZXMgZnVsbHkgcG9wdWxhdGVkIHlldC4KKworYGBgCitiYXplbCBydW4gLy9jb2RlZ2VuL2V4YW1wbGVzL2hlbGxvX3dvcmxkOmhlbGxvX3dvcmxkCitgYGAKKworIyMgVXBkYXRpbmcgdGhlIGdlbmVyYXRlZCBzb3VyY2VzCitUbyB1cGRhdGUgdGhlIGdlbmVyYXRlZCBzb3VyY2UsIHlvdSBjYW4gZXhlY3V0ZSB0aGlzIG1ha2UgdGFyZ2V0OgorCitgYGAKKy4vY29kZWdlbi9leGFtcGxlcy9oZWxsb193b3JsZC91cGRhdGVfZXhhbXBsZV9zb3VyY2Uuc2gKK2BgYApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9zaW1wbGVfZmVhdHVyZXMvc2ltcGxlX21vZGVsX3NldHRpbmdzLmNjIGIvY29kZWdlbi9leGFtcGxlcy9oZWxsb193b3JsZC9oZWxsb193b3JsZC5jYwpzaW1pbGFyaXR5IGluZGV4IDYyJQpjb3B5IGZyb20gdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9zaW1wbGVfZmVhdHVyZXMvc2ltcGxlX21vZGVsX3NldHRpbmdzLmNjCmNvcHkgdG8gY29kZWdlbi9leGFtcGxlcy9oZWxsb193b3JsZC9oZWxsb193b3JsZC5jYwppbmRleCBlMmNmNjYxLi43MGQ2NjViIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy9zaW1wbGVfbW9kZWxfc2V0dGluZ3MuY2MKKysrIGIvY29kZWdlbi9leGFtcGxlcy9oZWxsb193b3JsZC9oZWxsb193b3JsZC5jYwpAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAyMDE4IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTEzLDExICsxMywxNiBAQAogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9zaW1wbGVfZmVhdHVyZXMvc2ltcGxlX21vZGVsX3NldHRpbmdzLmgiCisjaW5jbHVkZSAiY29kZWdlbi9leGFtcGxlcy9oZWxsb193b3JsZC9oZWxsb193b3JsZF9tb2RlbC5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9jL2NfYXBpX3R5cGVzLmgiCiAKLWNvbnN0IGNoYXIqIGtDYXRlZ29yeUxhYmVsc1trQ2F0ZWdvcnlDb3VudF0gPSB7Ci0gICAgInNpbGVuY2UiLAotICAgICJ1bmtub3duIiwKLSAgICAieWVzIiwKLSAgICAibm8iLAotfTsKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICBoZWxsb193b3JsZF9tb2RlbDo6TW9kZWwgaGVsbG9fd29ybGR7fTsKKworICBUZkxpdGVTdGF0dXMgc3RhdHVzID0gaGVsbG9fd29ybGQuSW52b2tlKCk7CisgIGlmIChzdGF0dXMgIT0ga1RmTGl0ZU9rKSB7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9jb2RlZ2VuL2V4YW1wbGVzL2hlbGxvX3dvcmxkL2hlbGxvX3dvcmxkX21vZGVsLmNjIGIvY29kZWdlbi9leGFtcGxlcy9oZWxsb193b3JsZC9oZWxsb193b3JsZF9tb2RlbC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDgyOTBjCi0tLSAvZGV2L251bGwKKysrIGIvY29kZWdlbi9leGFtcGxlcy9oZWxsb193b3JsZC9oZWxsb193b3JsZF9tb2RlbC5jYwpAQCAtMCwwICsxLDMxNiBAQAorLyogQ29weXJpZ2h0IDIwMjMgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIEFVVE9NQVRJQ0FMTFkgR0VORVJBVEVEIERPIE5PVCBNT0RJRlkgKi8KKworI2luY2x1ZGUgImhlbGxvX3dvcmxkX21vZGVsLmgiCisKKyNpbmNsdWRlICJjb2RlZ2VuL3J1bnRpbWUvbWljcm9fY29kZWdlbl9jb250ZXh0LmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2MvYnVpbHRpbl9vcF9kYXRhLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2MvY19hcGlfdHlwZXMuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvYy9jb21tb24uaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9jb21wYXRpYmlsaXR5LmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvbWljcm9fb3BzLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2NvbW1vbi5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19jb250ZXh0LmgiCisKK25hbWVzcGFjZSBoZWxsb193b3JsZF9tb2RlbCB7CituYW1lc3BhY2UgeworLy8gVE9ETyhyamFzY2FuaSk6IFdlIHNob3VsZCBwcm9iYWJseSBzcGxpdCBvdXQgdGhlIE9wVGFibGUgdG8gYSBzZXBhcmF0ZSBmaWxlCisvLyBvbmNlIHdlIHN0YXJ0IGdlbmVyYXRpbmcgZm9yIG11bHRpcGxlIG1vZGVscy4KK2VudW0gT3BDb2RlIHsga0Z1bGx5Q29ubmVjdGVkLCBrQ291bnQgfTsKKworVEZMTUluZmVyZW5jZVJlZ2lzdHJhdGlvbiBvcF90YWJsZVtPcENvZGU6OmtDb3VudF0gPSB7CisgICAgdGZsaXRlOjpSZWdpc3RlckluZmVyZW5jZV9GVUxMWV9DT05ORUNURUQoKSwKK307CisKKy8vIGJ1ZmZlcl8xIGlzIGxvY2F0ZWQgaW4gdGhlIGFyZW5hCisKK2FsaWduYXMoMTYpIHVpbnQ4X3QgYnVmZmVyXzJbNF0gPSB7CisgICAgMHhBRCwKKyAgICAweDAxLAorICAgIDB4MDAsCisgICAgMHgwMCwKK307CisKK2FsaWduYXMoMTYpIHVpbnQ4X3QgYnVmZmVyXzNbMTZdID0geworICAgIDB4RDksIDB4M0IsIDB4MjcsIDB4MTUsIDB4MUMsIDB4RTAsIDB4REUsIDB4REQsCisgICAgMHgwRiwgMHgxQiwgMHhDNSwgMHhENywgMHgxMiwgMHhERCwgMHhGOSwgMHg3RiwKK307CisKK2FsaWduYXMoMTYpIHVpbnQ4X3QgYnVmZmVyXzRbNjRdID0geworICAgIDB4MjcsIDB4RkQsIDB4RkYsIDB4RkYsIDB4QTIsIDB4MDcsIDB4MDAsIDB4MDAsIDB4NjIsIDB4MDIsIDB4MDAsCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhGMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyOSwgMHhGRSwKKyAgICAweEZGLCAweEZGLCAweERELCAweEZGLCAweEZGLCAweEZGLCAweDlELCAweEZDLCAweEZGLCAweEZGLCAweDNCLAorICAgIDB4MDIsIDB4MDAsIDB4MDAsIDB4NDUsIDB4MDIsIDB4MDAsIDB4MDAsIDB4QTQsIDB4MTAsIDB4MDAsIDB4MDAsCisgICAgMHg2NywgMHgwRiwgMHgwMCwgMHgwMCwgMHg0RiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKyAgICAweDAwLCAweDg3LCAweEZDLCAweEZGLCAweEZGLCAweDExLCAweEVDLCAweEZGLCAweEZGLAorfTsKKworYWxpZ25hcygxNikgdWludDhfdCBidWZmZXJfNVsyNTZdID0geworICAgIDB4RjQsIDB4MUEsIDB4RUQsIDB4MDksIDB4MTksIDB4MjEsIDB4RjQsIDB4MjQsIDB4RTAsIDB4MjEsIDB4RUYsIDB4QkMsCisgICAgMHhGNywgMHhGNSwgMHhGQSwgMHgxOSwgMHgwMywgMHhEQywgMHhEMiwgMHgwMiwgMHgwNiwgMHhGOSwgMHhGNCwgMHgwMiwKKyAgICAweEZGLCAweEZBLCAweEVGLCAweEYxLCAweEVGLCAweEQzLCAweDI3LCAweEUxLCAweEZCLCAweDI3LCAweERELCAweEVCLAorICAgIDB4REIsIDB4RTQsIDB4MDUsIDB4MUEsIDB4MTcsIDB4RkMsIDB4MjQsIDB4MTIsIDB4MTUsIDB4RUYsIDB4MUUsIDB4RTQsCisgICAgMHgxMCwgMHhGRSwgMHgxNCwgMHhEQSwgMHgxQywgMHhGOCwgMHhGMywgMHhGMSwgMHhFRiwgMHhFMiwgMHhGMywgMHgwOSwKKyAgICAweEUzLCAweEU5LCAweEVELCAweEUzLCAweEU0LCAweDE1LCAweDA3LCAweDBCLCAweDA0LCAweDFCLCAweDFBLCAweEZFLAorICAgIDB4RUIsIDB4MDEsIDB4REUsIDB4MjEsIDB4RTYsIDB4MEIsIDB4RUMsIDB4MDMsIDB4MjMsIDB4MEEsIDB4MjIsIDB4MjQsCisgICAgMHgxRSwgMHgyNywgMHgwMywgMHhFNiwgMHgwMywgMHgyNCwgMHhGRiwgMHhDMCwgMHgxMSwgMHhGOCwgMHhGQywgMHhGMSwKKyAgICAweDExLCAweDBDLCAweEY1LCAweEUwLCAweEYzLCAweDA3LCAweDE3LCAweEU1LCAweEU4LCAweEVELCAweEZBLCAweERDLAorICAgIDB4RTgsIDB4MjMsIDB4RkIsIDB4MDcsIDB4REQsIDB4RkIsIDB4RkQsIDB4MDAsIDB4MTQsIDB4MjYsIDB4MTEsIDB4MTcsCisgICAgMHhFNywgMHhGMSwgMHgxMSwgMHhFQSwgMHgwMiwgMHgyNiwgMHgwNCwgMHgwNCwgMHgyNSwgMHgyMSwgMHgxRCwgMHgwQSwKKyAgICAweERCLCAweDFELCAweERDLCAweDIwLCAweDAxLCAweEZBLCAweEUzLCAweDM3LCAweDBCLCAweEYxLCAweDFBLCAweDE2LAorICAgIDB4RUYsIDB4MUMsIDB4RTcsIDB4MDMsIDB4RTAsIDB4MTYsIDB4MDIsIDB4MDMsIDB4MjEsIDB4MTgsIDB4MDksIDB4MkUsCisgICAgMHhEOSwgMHhFNSwgMHgxNCwgMHgwQiwgMHhFQSwgMHgxQSwgMHhGQywgMHhEOCwgMHgxMywgMHgwMCwgMHhDNCwgMHhEOCwKKyAgICAweEVDLCAweEQ5LCAweEZFLCAweDBELCAweDE5LCAweDIwLCAweEQ4LCAweEQ2LCAweEUyLCAweDFGLCAweEU5LCAweEQ3LAorICAgIDB4Q0EsIDB4RTIsIDB4REQsIDB4QzYsIDB4MTMsIDB4RTcsIDB4MDQsIDB4M0UsIDB4MDAsIDB4MDEsIDB4MTQsIDB4QzcsCisgICAgMHhEQiwgMHhFNywgMHgxNSwgMHgxNSwgMHhGNSwgMHgwNiwgMHhENiwgMHgxQSwgMHhEQywgMHgwOSwgMHgyMiwgMHhGRSwKKyAgICAweDA4LCAweDAyLCAweDEzLCAweEVGLCAweDE5LCAweDFFLCAweEUyLCAweDA5LCAweEZELCAweEYzLCAweDE0LCAweERELAorICAgIDB4REEsIDB4MjAsIDB4RDksIDB4MEYsIDB4RTMsIDB4RjksIDB4RjcsIDB4RUUsIDB4RTksIDB4MjQsIDB4RTYsIDB4MjksCisgICAgMHgwMCwgMHgwNywgMHgxNiwgMHhFMiwgMHgxRSwgMHgwRCwgMHgyMywgMHhEMywgMHhERCwgMHhGNywgMHgxNCwgMHhGQSwKKyAgICAweDA4LCAweDIyLCAweDI2LCAweDIxLCAweDA5LCAweDA4LCAweDBGLCAweDBCLCAweEUwLCAweDEyLCAweEY0LCAweDdGLAorICAgIDB4REMsIDB4NTgsIDB4RTUsIDB4MjYsCit9OworCithbGlnbmFzKDE2KSB1aW50OF90IGJ1ZmZlcl82WzY0XSA9IHsKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEMyLCAweEVBLCAweEZGLAorICAgIDB4RkYsIDB4NzUsIDB4RUEsIDB4RkYsIDB4RkYsIDB4QjgsIDB4RkEsIDB4RkYsIDB4RkYsIDB4MjQsIDB4RkEsCisgICAgMHhGRiwgMHhGRiwgMHhDOCwgMHhFRiwgMHhGRiwgMHhGRiwgMHhBQywgMHhGRiwgMHhGRiwgMHhGRiwgMHg0NCwKKyAgICAweDBELCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweEJELCAweDA3LCAweDAwLCAweDAwLAorICAgIDB4MzMsIDB4RUEsIDB4RkYsIDB4RkYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4Q0MsIDB4RTQsIDB4RkYsCisgICAgMHhGRiwgMHg0RiwgMHgwRCwgMHgwMCwgMHgwMCwgMHhDRiwgMHhFMywgMHhGRiwgMHhGRiwKK307CisKK2FsaWduYXMoMTYpIHVpbnQ4X3QgYnVmZmVyXzdbMTZdID0geworICAgIDB4RjcsIDB4Q0EsIDB4MzksIDB4NDcsIDB4NjgsIDB4NzMsIDB4NjIsIDB4NjMsCisgICAgMHg0MCwgMHhFNiwgMHg3RiwgMHgxOSwgMHhBRSwgMHg0NCwgMHg1RiwgMHg1NiwKK307CisKKy8vIGJ1ZmZlcl84IGlzIGxvY2F0ZWQgaW4gdGhlIGFyZW5hCisKKy8vIGJ1ZmZlcl85IGlzIGxvY2F0ZWQgaW4gdGhlIGFyZW5hCisKKy8vIGJ1ZmZlcl8xMCBpcyBsb2NhdGVkIGluIHRoZSBhcmVuYQorCitjb25zdGV4cHIgc2l6ZV90IGtTdWJncmFwaDBJbnB1dHNbMV0gPSB7MH07CisKK2NvbnN0ZXhwciBzaXplX3Qga1N1YmdyYXBoME91dHB1dHNbMV0gPSB7OX07CisKK3N0cnVjdCBOb2RlMF8wIHsKKyAgc3RydWN0IElucHV0cyB7CisgICAgaW50IHNpemUgPSAzOworICAgIGludCBkYXRhWzNdID0gezAsIDYsIDV9OworICB9IGlucHV0czsKKyAgc3RydWN0IE91dHB1dHMgeworICAgIGludCBzaXplID0gMTsKKyAgICBpbnQgZGF0YVsxXSA9IHs3fTsKKyAgfSBvdXRwdXRzOworICAvLyBObyBpbnRlcm1lZGlhdGVzCisgIFRmTGl0ZUZ1bGx5Q29ubmVjdGVkUGFyYW1zIGJ1aWx0aW5fZGF0YSA9IHsKKyAgICAgIC5hY3RpdmF0aW9uID0ga1RmTGl0ZUFjdFJlbHUsCisgICAgICAud2VpZ2h0c19mb3JtYXQgPSBrVGZMaXRlRnVsbHlDb25uZWN0ZWRXZWlnaHRzRm9ybWF0RGVmYXVsdCwKKyAgICAgIC5rZWVwX251bV9kaW1zID0gZmFsc2UsCisgICAgICAuYXN5bW1ldHJpY19xdWFudGl6ZV9pbnB1dHMgPSBmYWxzZSwKKyAgICAgIC5xdWFudGl6ZWRfYmlhc190eXBlID0ga1RmTGl0ZU5vVHlwZX07Cit9IG5vZGVfMF8wOworCitzdHJ1Y3QgTm9kZTBfMSB7CisgIHN0cnVjdCBJbnB1dHMgeworICAgIGludCBzaXplID0gMzsKKyAgICBpbnQgZGF0YVszXSA9IHs3LCA0LCAzfTsKKyAgfSBpbnB1dHM7CisgIHN0cnVjdCBPdXRwdXRzIHsKKyAgICBpbnQgc2l6ZSA9IDE7CisgICAgaW50IGRhdGFbMV0gPSB7OH07CisgIH0gb3V0cHV0czsKKyAgLy8gTm8gaW50ZXJtZWRpYXRlcworICBUZkxpdGVGdWxseUNvbm5lY3RlZFBhcmFtcyBidWlsdGluX2RhdGEgPSB7CisgICAgICAuYWN0aXZhdGlvbiA9IGtUZkxpdGVBY3RSZWx1LAorICAgICAgLndlaWdodHNfZm9ybWF0ID0ga1RmTGl0ZUZ1bGx5Q29ubmVjdGVkV2VpZ2h0c0Zvcm1hdERlZmF1bHQsCisgICAgICAua2VlcF9udW1fZGltcyA9IGZhbHNlLAorICAgICAgLmFzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzID0gZmFsc2UsCisgICAgICAucXVhbnRpemVkX2JpYXNfdHlwZSA9IGtUZkxpdGVOb1R5cGV9OworfSBub2RlXzBfMTsKKworc3RydWN0IE5vZGUwXzIgeworICBzdHJ1Y3QgSW5wdXRzIHsKKyAgICBpbnQgc2l6ZSA9IDM7CisgICAgaW50IGRhdGFbM10gPSB7OCwgMiwgMX07CisgIH0gaW5wdXRzOworICBzdHJ1Y3QgT3V0cHV0cyB7CisgICAgaW50IHNpemUgPSAxOworICAgIGludCBkYXRhWzFdID0gezl9OworICB9IG91dHB1dHM7CisgIC8vIE5vIGludGVybWVkaWF0ZXMKKyAgVGZMaXRlRnVsbHlDb25uZWN0ZWRQYXJhbXMgYnVpbHRpbl9kYXRhID0geworICAgICAgLmFjdGl2YXRpb24gPSBrVGZMaXRlQWN0Tm9uZSwKKyAgICAgIC53ZWlnaHRzX2Zvcm1hdCA9IGtUZkxpdGVGdWxseUNvbm5lY3RlZFdlaWdodHNGb3JtYXREZWZhdWx0LAorICAgICAgLmtlZXBfbnVtX2RpbXMgPSBmYWxzZSwKKyAgICAgIC5hc3ltbWV0cmljX3F1YW50aXplX2lucHV0cyA9IGZhbHNlLAorICAgICAgLnF1YW50aXplZF9iaWFzX3R5cGUgPSBrVGZMaXRlTm9UeXBlfTsKK30gbm9kZV8wXzI7CisKK3N0cnVjdCBUZW5zb3IwXzBEaW1zIHsKKyAgaW50IHNpemUgPSAyOworICBpbnQgZGF0YVsyXSA9IHsxLCAxfTsKK30gdGVuc29yMF8wX2RpbXM7CisKK3N0cnVjdCBUZW5zb3IwXzFEaW1zIHsKKyAgaW50IHNpemUgPSAxOworICBpbnQgZGF0YVsxXSA9IHsxfTsKK30gdGVuc29yMF8xX2RpbXM7CisKK3N0cnVjdCBUZW5zb3IwXzJEaW1zIHsKKyAgaW50IHNpemUgPSAyOworICBpbnQgZGF0YVsyXSA9IHsxLCAxNn07Cit9IHRlbnNvcjBfMl9kaW1zOworCitzdHJ1Y3QgVGVuc29yMF8zRGltcyB7CisgIGludCBzaXplID0gMTsKKyAgaW50IGRhdGFbMV0gPSB7MTZ9OworfSB0ZW5zb3IwXzNfZGltczsKKworc3RydWN0IFRlbnNvcjBfNERpbXMgeworICBpbnQgc2l6ZSA9IDI7CisgIGludCBkYXRhWzJdID0gezE2LCAxNn07Cit9IHRlbnNvcjBfNF9kaW1zOworCitzdHJ1Y3QgVGVuc29yMF81RGltcyB7CisgIGludCBzaXplID0gMTsKKyAgaW50IGRhdGFbMV0gPSB7MTZ9OworfSB0ZW5zb3IwXzVfZGltczsKKworc3RydWN0IFRlbnNvcjBfNkRpbXMgeworICBpbnQgc2l6ZSA9IDI7CisgIGludCBkYXRhWzJdID0gezE2LCAxfTsKK30gdGVuc29yMF82X2RpbXM7CisKK3N0cnVjdCBUZW5zb3IwXzdEaW1zIHsKKyAgaW50IHNpemUgPSAyOworICBpbnQgZGF0YVsyXSA9IHsxLCAxNn07Cit9IHRlbnNvcjBfN19kaW1zOworCitzdHJ1Y3QgVGVuc29yMF84RGltcyB7CisgIGludCBzaXplID0gMjsKKyAgaW50IGRhdGFbMl0gPSB7MSwgMTZ9OworfSB0ZW5zb3IwXzhfZGltczsKKworc3RydWN0IFRlbnNvcjBfOURpbXMgeworICBpbnQgc2l6ZSA9IDI7CisgIGludCBkYXRhWzJdID0gezEsIDF9OworfSB0ZW5zb3IwXzlfZGltczsKKworVGZMaXRlU3RhdHVzIEludm9rZVN1YmdyYXBoMChUZkxpdGVDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZmxpdGU6OlNwYW48VGZMaXRlTm9kZT4gbm9kZXMpIHsKKyAgVEZMSVRFX0RDSEVDSyhub2Rlcy5zaXplKCkgPT0gMyk7CisgIFRGX0xJVEVfRU5TVVJFX09LKAorICAgICAgY29udGV4dCwgb3BfdGFibGVbT3BDb2RlOjprRnVsbHlDb25uZWN0ZWRdLmludm9rZShjb250ZXh0LCAmbm9kZXNbMF0pKTsKKyAgVEZfTElURV9FTlNVUkVfT0soCisgICAgICBjb250ZXh0LCBvcF90YWJsZVtPcENvZGU6OmtGdWxseUNvbm5lY3RlZF0uaW52b2tlKGNvbnRleHQsICZub2Rlc1sxXSkpOworICBURl9MSVRFX0VOU1VSRV9PSygKKyAgICAgIGNvbnRleHQsIG9wX3RhYmxlW09wQ29kZTo6a0Z1bGx5Q29ubmVjdGVkXS5pbnZva2UoY29udGV4dCwgJm5vZGVzWzJdKSk7CisKKyAgcmV0dXJuIGtUZkxpdGVPazsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK01vZGVsOjpNb2RlbCgpCisgIDogc3ViZ3JhcGhzX3sKKyAgICAgIHsuaW5wdXRzID0geyZrU3ViZ3JhcGgwSW5wdXRzWzBdLCAxfSwKKyAgICAgICAub3V0cHV0cyA9IHsma1N1YmdyYXBoME91dHB1dHNbMF0sIDF9LAorICAgICAgIC5ub2RlcyA9IHsmc3ViZ3JhcGgwX25vZGVzX1swXSwgM30sCisgICAgICAgLnRlbnNvcnMgPSB7JnN1YmdyYXBoMF90ZW5zb3JzX1swXSwgMTB9LAorICAgICAgIC5pbnZva2UgPSAmSW52b2tlU3ViZ3JhcGgwfSwKKyAgICB9LAorICAgIG1pY3JvX2NvbnRleHRfeyZjb250ZXh0XywgeyZzdWJncmFwaHNfWzBdLCAxfX0geworICBjb250ZXh0Xy5pbXBsXyA9IHN0YXRpY19jYXN0PHZvaWQqPigmbWljcm9fY29udGV4dF8pOworICBjb250ZXh0Xy5SZXBvcnRFcnJvciA9IG51bGxwdHI7CisgIGNvbnRleHRfLkdldFRlbnNvciA9IG51bGxwdHI7CisgIGNvbnRleHRfLkdldEV2YWxUZW5zb3IgPSB0ZmxpdGU6Ok1pY3JvQ29udGV4dEdldEV2YWxUZW5zb3I7CisgIGNvbnRleHRfLnByb2ZpbGVyID0gbnVsbHB0cjsKKyAgY29udGV4dF8uR2V0RXh0ZXJuYWxDb250ZXh0ID0gbnVsbHB0cjsKKyAgY29udGV4dF8uR2V0U2NyYXRjaEJ1ZmZlciA9IG51bGxwdHI7CisKKyAgc3ViZ3JhcGgwX25vZGVzX1swXSA9IFRmTGl0ZU5vZGV7CisgICAgICAuaW5wdXRzID0gcmVpbnRlcnByZXRfY2FzdDxUZkxpdGVJbnRBcnJheSo+KCZub2RlXzBfMC5pbnB1dHMpLAorICAgICAgLm91dHB1dHMgPSByZWludGVycHJldF9jYXN0PFRmTGl0ZUludEFycmF5Kj4oJm5vZGVfMF8wLm91dHB1dHMpLAorICAgICAgLmludGVybWVkaWF0ZXMgPSBudWxscHRyLAorICAgICAgLnVzZXJfZGF0YSA9IG51bGxwdHIsCisgICAgICAuYnVpbHRpbl9kYXRhID0gc3RhdGljX2Nhc3Q8dm9pZCo+KCZub2RlXzBfMC5idWlsdGluX2RhdGEpLAorICAgICAgLmN1c3RvbV9pbml0aWFsX2RhdGEgPSBudWxscHRyLAorICAgICAgLmN1c3RvbV9pbml0aWFsX2RhdGFfc2l6ZSA9IDB9OworICBzdWJncmFwaDBfbm9kZXNfWzFdID0gVGZMaXRlTm9kZXsKKyAgICAgIC5pbnB1dHMgPSByZWludGVycHJldF9jYXN0PFRmTGl0ZUludEFycmF5Kj4oJm5vZGVfMF8xLmlucHV0cyksCisgICAgICAub3V0cHV0cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8VGZMaXRlSW50QXJyYXkqPigmbm9kZV8wXzEub3V0cHV0cyksCisgICAgICAuaW50ZXJtZWRpYXRlcyA9IG51bGxwdHIsCisgICAgICAudXNlcl9kYXRhID0gbnVsbHB0ciwKKyAgICAgIC5idWlsdGluX2RhdGEgPSBzdGF0aWNfY2FzdDx2b2lkKj4oJm5vZGVfMF8xLmJ1aWx0aW5fZGF0YSksCisgICAgICAuY3VzdG9tX2luaXRpYWxfZGF0YSA9IG51bGxwdHIsCisgICAgICAuY3VzdG9tX2luaXRpYWxfZGF0YV9zaXplID0gMH07CisgIHN1YmdyYXBoMF9ub2Rlc19bMl0gPSBUZkxpdGVOb2RleworICAgICAgLmlucHV0cyA9IHJlaW50ZXJwcmV0X2Nhc3Q8VGZMaXRlSW50QXJyYXkqPigmbm9kZV8wXzIuaW5wdXRzKSwKKyAgICAgIC5vdXRwdXRzID0gcmVpbnRlcnByZXRfY2FzdDxUZkxpdGVJbnRBcnJheSo+KCZub2RlXzBfMi5vdXRwdXRzKSwKKyAgICAgIC5pbnRlcm1lZGlhdGVzID0gbnVsbHB0ciwKKyAgICAgIC51c2VyX2RhdGEgPSBudWxscHRyLAorICAgICAgLmJ1aWx0aW5fZGF0YSA9IHN0YXRpY19jYXN0PHZvaWQqPigmbm9kZV8wXzIuYnVpbHRpbl9kYXRhKSwKKyAgICAgIC5jdXN0b21faW5pdGlhbF9kYXRhID0gbnVsbHB0ciwKKyAgICAgIC5jdXN0b21faW5pdGlhbF9kYXRhX3NpemUgPSAwfTsKKworICBzdWJncmFwaDBfdGVuc29yc19bMF0gPSBUZkxpdGVFdmFsVGVuc29yeworICAgICAgLmRhdGEgPSB7LmRhdGEgPSBzdGF0aWNfY2FzdDx2b2lkKj4obnVsbHB0ciAvKiBidWZmZXJfMSAqLyl9LAorICAgICAgLmRpbXMgPSByZWludGVycHJldF9jYXN0PFRmTGl0ZUludEFycmF5Kj4oJnRlbnNvcjBfMF9kaW1zKSwKKyAgICAgIC50eXBlID0ga1RmTGl0ZUludDh9OworICBzdWJncmFwaDBfdGVuc29yc19bMV0gPSBUZkxpdGVFdmFsVGVuc29yeworICAgICAgLmRhdGEgPSB7LmRhdGEgPSBzdGF0aWNfY2FzdDx2b2lkKj4oJmJ1ZmZlcl8yKX0sCisgICAgICAuZGltcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8VGZMaXRlSW50QXJyYXkqPigmdGVuc29yMF8xX2RpbXMpLAorICAgICAgLnR5cGUgPSBrVGZMaXRlSW50MzJ9OworICBzdWJncmFwaDBfdGVuc29yc19bMl0gPSBUZkxpdGVFdmFsVGVuc29yeworICAgICAgLmRhdGEgPSB7LmRhdGEgPSBzdGF0aWNfY2FzdDx2b2lkKj4oJmJ1ZmZlcl8zKX0sCisgICAgICAuZGltcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8VGZMaXRlSW50QXJyYXkqPigmdGVuc29yMF8yX2RpbXMpLAorICAgICAgLnR5cGUgPSBrVGZMaXRlSW50OH07CisgIHN1YmdyYXBoMF90ZW5zb3JzX1szXSA9IFRmTGl0ZUV2YWxUZW5zb3J7CisgICAgICAuZGF0YSA9IHsuZGF0YSA9IHN0YXRpY19jYXN0PHZvaWQqPigmYnVmZmVyXzQpfSwKKyAgICAgIC5kaW1zID0gcmVpbnRlcnByZXRfY2FzdDxUZkxpdGVJbnRBcnJheSo+KCZ0ZW5zb3IwXzNfZGltcyksCisgICAgICAudHlwZSA9IGtUZkxpdGVJbnQzMn07CisgIHN1YmdyYXBoMF90ZW5zb3JzX1s0XSA9IFRmTGl0ZUV2YWxUZW5zb3J7CisgICAgICAuZGF0YSA9IHsuZGF0YSA9IHN0YXRpY19jYXN0PHZvaWQqPigmYnVmZmVyXzUpfSwKKyAgICAgIC5kaW1zID0gcmVpbnRlcnByZXRfY2FzdDxUZkxpdGVJbnRBcnJheSo+KCZ0ZW5zb3IwXzRfZGltcyksCisgICAgICAudHlwZSA9IGtUZkxpdGVJbnQ4fTsKKyAgc3ViZ3JhcGgwX3RlbnNvcnNfWzVdID0gVGZMaXRlRXZhbFRlbnNvcnsKKyAgICAgIC5kYXRhID0gey5kYXRhID0gc3RhdGljX2Nhc3Q8dm9pZCo+KCZidWZmZXJfNil9LAorICAgICAgLmRpbXMgPSByZWludGVycHJldF9jYXN0PFRmTGl0ZUludEFycmF5Kj4oJnRlbnNvcjBfNV9kaW1zKSwKKyAgICAgIC50eXBlID0ga1RmTGl0ZUludDMyfTsKKyAgc3ViZ3JhcGgwX3RlbnNvcnNfWzZdID0gVGZMaXRlRXZhbFRlbnNvcnsKKyAgICAgIC5kYXRhID0gey5kYXRhID0gc3RhdGljX2Nhc3Q8dm9pZCo+KCZidWZmZXJfNyl9LAorICAgICAgLmRpbXMgPSByZWludGVycHJldF9jYXN0PFRmTGl0ZUludEFycmF5Kj4oJnRlbnNvcjBfNl9kaW1zKSwKKyAgICAgIC50eXBlID0ga1RmTGl0ZUludDh9OworICBzdWJncmFwaDBfdGVuc29yc19bN10gPSBUZkxpdGVFdmFsVGVuc29yeworICAgICAgLmRhdGEgPSB7LmRhdGEgPSBzdGF0aWNfY2FzdDx2b2lkKj4obnVsbHB0ciAvKiBidWZmZXJfOCAqLyl9LAorICAgICAgLmRpbXMgPSByZWludGVycHJldF9jYXN0PFRmTGl0ZUludEFycmF5Kj4oJnRlbnNvcjBfN19kaW1zKSwKKyAgICAgIC50eXBlID0ga1RmTGl0ZUludDh9OworICBzdWJncmFwaDBfdGVuc29yc19bOF0gPSBUZkxpdGVFdmFsVGVuc29yeworICAgICAgLmRhdGEgPSB7LmRhdGEgPSBzdGF0aWNfY2FzdDx2b2lkKj4obnVsbHB0ciAvKiBidWZmZXJfOSAqLyl9LAorICAgICAgLmRpbXMgPSByZWludGVycHJldF9jYXN0PFRmTGl0ZUludEFycmF5Kj4oJnRlbnNvcjBfOF9kaW1zKSwKKyAgICAgIC50eXBlID0ga1RmTGl0ZUludDh9OworICBzdWJncmFwaDBfdGVuc29yc19bOV0gPSBUZkxpdGVFdmFsVGVuc29yeworICAgICAgLmRhdGEgPSB7LmRhdGEgPSBzdGF0aWNfY2FzdDx2b2lkKj4obnVsbHB0ciAvKiBidWZmZXJfMTAgKi8pfSwKKyAgICAgIC5kaW1zID0gcmVpbnRlcnByZXRfY2FzdDxUZkxpdGVJbnRBcnJheSo+KCZ0ZW5zb3IwXzlfZGltcyksCisgICAgICAudHlwZSA9IGtUZkxpdGVJbnQ4fTsKK30KKworVGZMaXRlU3RhdHVzIE1vZGVsOjpJbnZva2UoKSB7IHJldHVybiBtaWNyb19jb250ZXh0Xy5JbnZva2VTdWJncmFwaCgwKTsgfQorCit9ICAvLyBuYW1lc3BhY2UgaGVsbG9fd29ybGRfbW9kZWwKZGlmZiAtLWdpdCBhL2NvZGVnZW4vZXhhbXBsZXMvaGVsbG9fd29ybGQvaGVsbG9fd29ybGRfbW9kZWwuaCBiL2NvZGVnZW4vZXhhbXBsZXMvaGVsbG9fd29ybGQvaGVsbG9fd29ybGRfbW9kZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGNmZTJjCi0tLSAvZGV2L251bGwKKysrIGIvY29kZWdlbi9leGFtcGxlcy9oZWxsb193b3JsZC9oZWxsb193b3JsZF9tb2RlbC5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBBVVRPTUFUSUNBTExZIEdFTkVSQVRFRCBETyBOT1QgTU9ESUZZICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiY29kZWdlbi9ydW50aW1lL21pY3JvX2NvZGVnZW5fY29udGV4dC5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9jL2NfYXBpX3R5cGVzLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2MvY29tbW9uLmgiCisKK25hbWVzcGFjZSBoZWxsb193b3JsZF9tb2RlbCB7CisKK2NsYXNzIE1vZGVsIHsKKyBwdWJsaWM6CisgIE1vZGVsKCk7CisKKyAgVGZMaXRlU3RhdHVzIEludm9rZSgpOworCisgcHJpdmF0ZToKKyAgVGZMaXRlQ29udGV4dCBjb250ZXh0XyA9IHt9OworICB0ZmxpdGU6OlN1YmdyYXBoIHN1YmdyYXBoc19bMV07CisgIHRmbGl0ZTo6TWljcm9Db2RlZ2VuQ29udGV4dCBtaWNyb19jb250ZXh0XzsKKyAgVGZMaXRlTm9kZSBzdWJncmFwaDBfbm9kZXNfWzNdID0ge307CisgIFRmTGl0ZUV2YWxUZW5zb3Igc3ViZ3JhcGgwX3RlbnNvcnNfWzEwXSA9IHt9OworfTsKKworfSAgLy8gbmFtZXNwYWNlIGhlbGxvX3dvcmxkX21vZGVsCmRpZmYgLS1naXQgYS9jb2RlZ2VuL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3VwZGF0ZV9leGFtcGxlX3NvdXJjZS5zaCBiL2NvZGVnZW4vZXhhbXBsZXMvaGVsbG9fd29ybGQvdXBkYXRlX2V4YW1wbGVfc291cmNlLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEzODFmZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb2RlZ2VuL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3VwZGF0ZV9leGFtcGxlX3NvdXJjZS5zaApAQCAtMCwwICsxLDMyIEBACisjIS91c3IvYmluL2VudiBiYXNoCisjIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjCisjIFN5bmNzIHRoZSBnZW5lcmF0ZWQgZXhhbXBsZSBzb3VyY2UgY29kZSBpbiB0aGUgcmVwb3NpdG9yeS4KKyMKKworc2V0IC1lCisKK1NDUklQVF9ESVI9IiQoY2QgIiQoZGlybmFtZSAiJHtCQVNIX1NPVVJDRVswXX0iKSIgJiYgcHdkKSIKK1JPT1RfRElSPSR7U0NSSVBUX0RJUn0vLi4vLi4vLi4KK2NkICIke1JPT1RfRElSfSIKKworYmF6ZWwgYnVpbGQgLy9jb2RlZ2VuL2V4YW1wbGVzL2hlbGxvX3dvcmxkOmhlbGxvX3dvcmxkX21vZGVsCitjcCAuL2JhemVsLWJpbi9jb2RlZ2VuL2V4YW1wbGVzL2hlbGxvX3dvcmxkL2hlbGxvX3dvcmxkX21vZGVsLmggJHtTQ1JJUFRfRElSfQorY3AgLi9iYXplbC1iaW4vY29kZWdlbi9leGFtcGxlcy9oZWxsb193b3JsZC9oZWxsb193b3JsZF9tb2RlbC5jYyAke1NDUklQVF9ESVJ9CitjbGFuZy1mb3JtYXQgLS1zdHlsZT1nb29nbGUgLWkgXAorICAke1NDUklQVF9ESVJ9L2hlbGxvX3dvcmxkX21vZGVsLmggXAorICAke1NDUklQVF9ESVJ9L2hlbGxvX3dvcmxkX21vZGVsLmNjCmRpZmYgLS1naXQgYS9jb2RlZ2VuL2dyYXBoLnB5IGIvY29kZWdlbi9ncmFwaC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDVhNzAwCi0tLSAvZGV2L251bGwKKysrIGIvY29kZWdlbi9ncmFwaC5weQpAQCAtMCwwICsxLDI2MiBAQAorIyBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyIiIiBQcm92aWRlcyBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBtb2RlbCB0aGF0IGlzIGNvbmR1Y2l2ZSB0byBjb2RlIAorICAgIGdlbmVyYXRpb24gdXNpbmcgdGVtcGxhdGVzLiAiIiIKKworZnJvbSB0eXBpbmcgaW1wb3J0IERpY3QsIExpc3QsIE9wdGlvbmFsLCBTZXF1ZW5jZQoraW1wb3J0IHN0cmluZworaW1wb3J0IHRleHR3cmFwCisKK2Zyb20gdGZsaXRlX21pY3JvLmNvZGVnZW4ub3BlcmF0b3JzIGltcG9ydCBmYWN0b3J5Citmcm9tIHRmbGl0ZV9taWNyby5jb2RlZ2VuLm9wZXJhdG9ycyBpbXBvcnQgb3BlcmF0b3IKK2Zyb20gdGZsaXRlX21pY3JvLmNvZGVnZW4gaW1wb3J0IHRlbnNvcgorZnJvbSB0ZmxpdGVfbWljcm8uY29kZWdlbiBpbXBvcnQgdXRpbHMKK2Zyb20gdGZsaXRlX21pY3JvLnRlbnNvcmZsb3cubGl0ZS5weXRob24gaW1wb3J0IHNjaGVtYV9weV9nZW5lcmF0ZWQgYXMgc2NoZW1hX2ZiCitmcm9tIHRmbGl0ZV9taWNyby50ZW5zb3JmbG93LmxpdGUudG9vbHMgaW1wb3J0IHZpc3VhbGl6ZQorCisKK2NsYXNzIE9wQ29kZShvYmplY3QpOgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBvcF9jb2RlOiBzY2hlbWFfZmIuT3BlcmF0b3JDb2RlVCk6CisgICAgc2VsZi5fb3BfY29kZTogc2NoZW1hX2ZiLk9wZXJhdG9yQ29kZVQgPSBvcF9jb2RlCisKKyAgQHByb3BlcnR5CisgIGRlZiBuYW1lKHNlbGYpIC0+IHN0cjoKKyAgICBpZiBzZWxmLl9vcF9jb2RlLmN1c3RvbUNvZGU6CisgICAgICByZXR1cm4gc2VsZi5fb3BfY29kZS5jdXN0b21Db2RlCisgICAgcmV0dXJuIHZpc3VhbGl6ZS5CdWlsdGluQ29kZVRvTmFtZShzZWxmLl9vcF9jb2RlLmJ1aWx0aW5Db2RlKQorCisgIEBwcm9wZXJ0eQorICBkZWYgcmVnaXN0ZXJfZnVuY3Rpb24oc2VsZikgLT4gc3RyOgorICAgIHJldHVybiAidGZsaXRlOjpSZWdpc3RlckluZmVyZW5jZV97fSIuZm9ybWF0KHNlbGYubmFtZSkKKworICBAcHJvcGVydHkKKyAgZGVmIGVudW1fbmFtZShzZWxmKSAtPiBzdHI6CisgICAgcmV0dXJuICJre30iLmZvcm1hdCh1dGlscy50b19wYXNjYWxfY2FzZShzZWxmLm5hbWUpKQorCisgIEBwcm9wZXJ0eQorICBkZWYgZnVsbF9lbnVtX25hbWUoc2VsZikgLT4gc3RyOgorICAgIHJldHVybiAiT3BDb2RlOjoiICsgc2VsZi5lbnVtX25hbWUKKworCitjbGFzcyBTdWJncmFwaChvYmplY3QpOgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2RlbDogc2NoZW1hX2ZiLk1vZGVsVCwgYnVmZmVyczogU2VxdWVuY2VbdGVuc29yLkJ1ZmZlcl0sCisgICAgICAgICAgICAgICBzdWJncmFwaF9pZHg6IGludCwgc3ViZ3JhcGg6IHNjaGVtYV9mYi5TdWJHcmFwaFQpOgorICAgIHNlbGYuX3N1YmdyYXBoX2lkeDogaW50ID0gc3ViZ3JhcGhfaWR4CisgICAgc2VsZi5fc3ViZ3JhcGg6IHNjaGVtYV9mYi5TdWJHcmFwaFQgPSBzdWJncmFwaAorICAgIHNlbGYuX29wX2NvZGVzOiBMaXN0W09wQ29kZV0gPSBbCisgICAgICAgIE9wQ29kZShvcF9jb2RlKSBmb3Igb3BfY29kZSBpbiBtb2RlbC5vcGVyYXRvckNvZGVzCisgICAgXQorICAgIHNlbGYuX3RlbnNvcnM6IExpc3RbVGVuc29yXSA9IFtdCisgICAgZm9yIHQgaW4gc3ViZ3JhcGgudGVuc29yczoKKyAgICAgIHNlbGYuX3RlbnNvcnMuYXBwZW5kKHRlbnNvci5UZW5zb3IoYnVmZmVyc1t0LmJ1ZmZlcl0sIHQpKQorCisgICAgc2VsZi5fb3BlcmF0b3JzOiBMaXN0W29wZXJhdG9yLk9wZXJhdG9yXSA9IFtdCisgICAgZm9yIG9wIGluIHN1YmdyYXBoLm9wZXJhdG9yczoKKyAgICAgIG9wX2NvZGUgPSBtb2RlbC5vcGVyYXRvckNvZGVzW29wLm9wY29kZUluZGV4XQorICAgICAgc2VsZi5fb3BlcmF0b3JzLmFwcGVuZChmYWN0b3J5LmNyZWF0ZV9vcGVyYXRvcihvcF9jb2RlLCBvcCkpCisKKyAgQHByb3BlcnR5CisgIGRlZiBpbmRleChzZWxmKSAtPiBpbnQ6CisgICAgcmV0dXJuIHNlbGYuX3N1YmdyYXBoX2lkeAorCisgIEBwcm9wZXJ0eQorICBkZWYgaW5wdXRzKHNlbGYpIC0+IFNlcXVlbmNlW2ludF06CisgICAgcmV0dXJuIHNlbGYuX3N1YmdyYXBoLmlucHV0cworCisgIEBwcm9wZXJ0eQorICBkZWYgb3V0cHV0cyhzZWxmKSAtPiBTZXF1ZW5jZVtpbnRdOgorICAgIHJldHVybiBzZWxmLl9zdWJncmFwaC5vdXRwdXRzCisKKyAgQHByb3BlcnR5CisgIGRlZiBvcGVyYXRvcnMoc2VsZikgLT4gU2VxdWVuY2Vbb3BlcmF0b3IuT3BlcmF0b3JdOgorICAgIHJldHVybiBzZWxmLl9vcGVyYXRvcnMKKworICBAcHJvcGVydHkKKyAgZGVmIHRlbnNvcnMoc2VsZikgLT4gU2VxdWVuY2VbdGVuc29yLlRlbnNvcl06CisgICAgcmV0dXJuIHNlbGYuX3RlbnNvcnMKKworICBAcHJvcGVydHkKKyAgZGVmIG5lZWRzX3plcm9fbGVuZ3RoX2ludF9hcnJheShzZWxmKSAtPiBib29sOgorICAgIHJldHVybiBhbnkodC5uZWVkc196ZXJvX2xlbmd0aF9pbnRfYXJyYXkgZm9yIHQgaW4gc2VsZi50ZW5zb3JzKQorCisgIEBwcm9wZXJ0eQorICBkZWYgaW52b2tlX2ZuX25hbWUoc2VsZikgLT4gc3RyOgorICAgIHJldHVybiBmIkludm9rZVN1YmdyYXBoe3NlbGYuaW5kZXh9IgorCisgIEBwcm9wZXJ0eQorICBkZWYgaW5wdXRzX2FycmF5X25hbWUoc2VsZikgLT4gc3RyOgorICAgIHJldHVybiBmImtTdWJncmFwaHtzZWxmLmluZGV4fUlucHV0cyIKKworICBAcHJvcGVydHkKKyAgZGVmIG91dHB1dHNfYXJyYXlfbmFtZShzZWxmKSAtPiBzdHI6CisgICAgcmV0dXJuIGYia1N1YmdyYXBoe3NlbGYuaW5kZXh9T3V0cHV0cyIKKworICBAcHJvcGVydHkKKyAgZGVmIG5vZGVzX2FycmF5KHNlbGYpIC0+IHN0cjoKKyAgICByZXR1cm4gZiJzdWJncmFwaHtzZWxmLmluZGV4fV9ub2Rlc18iCisKKyAgZGVmIG5vZGVzX2VsZW1lbnQoc2VsZiwgb3BlcmF0b3JfaWR4OiBpbnQpIC0+IHN0cjoKKyAgICByZXR1cm4gc2VsZi5ub2Rlc19hcnJheSArIGYiW3tvcGVyYXRvcl9pZHh9XSIKKworICBkZWYgbm9kZV9kYXRhX3R5cGUoc2VsZiwgb3BlcmF0b3JfaWR4OiBpbnQpIC0+IHN0cjoKKyAgICByZXR1cm4gZiJOb2Rle3NlbGYuaW5kZXh9X3tvcGVyYXRvcl9pZHh9IgorCisgIGRlZiBub2RlX2RhdGFfbmFtZShzZWxmLCBvcGVyYXRvcl9pZHg6IGludCkgLT4gc3RyOgorICAgIHJldHVybiBmIm5vZGVfe3NlbGYuaW5kZXh9X3tvcGVyYXRvcl9pZHh9IgorCisgIGRlZiBnZW5lcmF0ZV9jX25vZGVfZGF0YShzZWxmLCBpbmRlbnQ6IHN0cikgLT4gc3RyOgorICAgIG5vZGVfZGF0YV9zdHJzOiBMaXN0W3N0cl0gPSBbXQorICAgIGZvciBvcF9pZHgsIG9wIGluIGVudW1lcmF0ZShzZWxmLm9wZXJhdG9ycyk6CisgICAgICB0eXBlX25hbWUgPSBzZWxmLm5vZGVfZGF0YV90eXBlKG9wX2lkeCkKKyAgICAgIG5vZGVfbmFtZSA9IHNlbGYubm9kZV9kYXRhX25hbWUob3BfaWR4KQorICAgICAgbm9kZV9kYXRhX3N0cnMuYXBwZW5kKG9wLmdlbmVyYXRlX2Nfbm9kZV9kYXRhKHR5cGVfbmFtZSwgbm9kZV9uYW1lKSkKKyAgICByZXR1cm4gdGV4dHdyYXAuaW5kZW50KCJcblxuIi5qb2luKG5vZGVfZGF0YV9zdHJzKSwgaW5kZW50KQorCisgIGRlZiBnZW5lcmF0ZV9jX25vZGVfaW5pdChzZWxmLCBpbmRlbnQ6IHN0cikgLT4gc3RyOgorICAgIG5vZGVfaW5pdF9zdHJzOiBMaXN0W3N0cl0gPSBbXQorICAgIGZvciBvcF9pZHgsIG9wIGluIGVudW1lcmF0ZShzZWxmLm9wZXJhdG9ycyk6CisgICAgICB0ZmxpdGVfbm9kZV9uYW1lID0gc2VsZi5ub2Rlc19lbGVtZW50KG9wX2lkeCkKKyAgICAgIG5vZGVfZGF0YV9uYW1lID0gc2VsZi5ub2RlX2RhdGFfbmFtZShvcF9pZHgpCisgICAgICBub2RlX2luaXRfc3Rycy5hcHBlbmQoCisgICAgICAgICAgb3AuZ2VuZXJhdGVfY19ub2RlX2luaXQodGZsaXRlX25vZGVfbmFtZSwgbm9kZV9kYXRhX25hbWUpKQorICAgIHJldHVybiB0ZXh0d3JhcC5pbmRlbnQoIlxuIi5qb2luKG5vZGVfaW5pdF9zdHJzKSwgaW5kZW50KQorCisgIGRlZiBnZW5lcmF0ZV9jX2ludm9rZShzZWxmLCBpbmRlbnQ6IHN0cikgLT4gc3RyOgorICAgIGZ1bmN0aW9uX3RlbXBsYXRlID0gc3RyaW5nLlRlbXBsYXRlKAorICAgICAgICAiVGZMaXRlU3RhdHVzICR7ZnVuY3Rpb25fbmFtZX0oVGZMaXRlQ29udGV4dCogY29udGV4dCxcbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZsaXRlOjpTcGFuPFRmTGl0ZU5vZGU+IG5vZGVzKSB7XG4iCisgICAgICAgICIgIFRGTElURV9EQ0hFQ0sobm9kZXMuc2l6ZSgpID09ICR7bnVtX25vZGVzfSk7XG4iCisgICAgICAgICIke2JvZHl9XG4iCisgICAgICAgICIgIHJldHVybiBrVGZMaXRlT2s7XG4iCisgICAgICAgICJ9IikKKworICAgIGJvZHlfdGVtcGxhdGUgPSBzdHJpbmcuVGVtcGxhdGUoCisgICAgICAgICIgIFRGX0xJVEVfRU5TVVJFX09LKFxuIgorICAgICAgICAiICAgICAgY29udGV4dCwgb3BfdGFibGVbJHtvcF9jb2RlfV0uaW52b2tlKGNvbnRleHQsICYke25vZGV9KSk7XG4iKQorICAgIGludm9rZV9zdHJzOiBMaXN0W3N0cl0gPSBbXQorICAgIGZvciBvcF9pZHgsIG9wIGluIGVudW1lcmF0ZShzZWxmLm9wZXJhdG9ycyk6CisgICAgICBpbnZva2Vfc3Rycy5hcHBlbmQoCisgICAgICAgICAgYm9keV90ZW1wbGF0ZS5zdWJzdGl0dXRlKAorICAgICAgICAgICAgICBvcF9jb2RlPXNlbGYuX29wX2NvZGVzW29wLm9wX2NvZGVfaW5kZXhdLmZ1bGxfZW51bV9uYW1lLAorICAgICAgICAgICAgICBub2RlPWYibm9kZXNbe29wX2lkeH1dIikpCisKKyAgICBpbnZva2UgPSBmdW5jdGlvbl90ZW1wbGF0ZS5zdWJzdGl0dXRlKGZ1bmN0aW9uX25hbWU9c2VsZi5pbnZva2VfZm5fbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9ub2Rlcz1sZW4oc2VsZi5vcGVyYXRvcnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keT0iIi5qb2luKGludm9rZV9zdHJzKSkKKyAgICByZXR1cm4gdGV4dHdyYXAuaW5kZW50KGludm9rZSwgaW5kZW50KQorCisgIGRlZiBnZW5lcmF0ZV9jX2lucHV0X2FycmF5KHNlbGYsIGluZGVudDogc3RyKSAtPiBzdHI6CisgICAgcmV0dXJuIHV0aWxzLmdlbmVyYXRlX2NfaW50X2FycmF5KGluZGVudCwgInNpemVfdCIsIHNlbGYuaW5wdXRzX2FycmF5X25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaW5wdXRzKQorCisgIGRlZiBnZW5lcmF0ZV9jX291dHB1dF9hcnJheShzZWxmLCBpbmRlbnQ6IHN0cikgLT4gc3RyOgorICAgIHJldHVybiB1dGlscy5nZW5lcmF0ZV9jX2ludF9hcnJheShpbmRlbnQsICJzaXplX3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm91dHB1dHNfYXJyYXlfbmFtZSwgc2VsZi5vdXRwdXRzKQorCisgIGRlZiBnZW5lcmF0ZV9jX3N1YmdyYXBoX2luaXQoc2VsZiwgaW5kZW50OiBzdHIpIC0+IHN0cjoKKyAgICBpbml0X3RlbXBsYXRlID0gc3RyaW5nLlRlbXBsYXRlKAorICAgICAgICAiey5pbnB1dHMgPSB7JiR7aW5wdXRfYXJyYXl9WzBdLCAke2lucHV0X3NpemV9fSxcbiIKKyAgICAgICAgIiAub3V0cHV0cyA9IHsmJHtvdXRwdXRfYXJyYXl9WzBdLCAke291dHB1dF9zaXplfX0sXG4iCisgICAgICAgICIgLm5vZGVzID0geyYke25vZGVfYXJyYXl9WzBdLCAke25vZGVfc2l6ZX19LFxuIgorICAgICAgICAiIC50ZW5zb3JzID0geyYke3RlbnNvcl9hcnJheX1bMF0sICR7dGVuc29yX3NpemV9fSxcbiIKKyAgICAgICAgIiAuaW52b2tlID0gJiR7aW52b2tlfX0sIikKKyAgICByZXR1cm4gdGV4dHdyYXAuaW5kZW50KAorICAgICAgICBpbml0X3RlbXBsYXRlLnN1YnN0aXR1dGUoaW5wdXRfYXJyYXk9c2VsZi5pbnB1dHNfYXJyYXlfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3NpemU9bGVuKHNlbGYuaW5wdXRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9hcnJheT1zZWxmLm91dHB1dHNfYXJyYXlfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9zaXplPWxlbihzZWxmLm91dHB1dHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZV9hcnJheT1zZWxmLm5vZGVzX2FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZV9zaXplPWxlbihzZWxmLm9wZXJhdG9ycyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW5zb3JfYXJyYXk9c2VsZi50ZW5zb3JzX2FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVuc29yX3NpemU9bGVuKHNlbGYudGVuc29ycyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZva2U9c2VsZi5pbnZva2VfZm5fbmFtZSksIGluZGVudCkKKworICBAcHJvcGVydHkKKyAgZGVmIHRlbnNvcnNfYXJyYXkoc2VsZikgLT4gc3RyOgorICAgIHJldHVybiBmInN1YmdyYXBoe3NlbGYuaW5kZXh9X3RlbnNvcnNfIgorCisgIGRlZiB0ZW5zb3JzX2VsZW1lbnQoc2VsZiwgdGVuc29yX2lkeDogaW50KSAtPiBzdHI6CisgICAgcmV0dXJuIHNlbGYudGVuc29yc19hcnJheSArIGYiW3t0ZW5zb3JfaWR4fV0iCisKKyAgZGVmIHRlbnNvcl9kYXRhX3R5cGUoc2VsZiwgdGVuc29yX2lkeDogaW50KSAtPiBzdHI6CisgICAgcmV0dXJuIGYiVGVuc29ye3NlbGYuaW5kZXh9X3t0ZW5zb3JfaWR4fSIKKworICBkZWYgdGVuc29yX2RhdGFfbmFtZShzZWxmLCB0ZW5zb3JfaWR4OiBpbnQpIC0+IHN0cjoKKyAgICByZXR1cm4gZiJ0ZW5zb3J7c2VsZi5pbmRleH1fe3RlbnNvcl9pZHh9IgorCisgIGRlZiBnZW5lcmF0ZV9jX3RlbnNvcl9kYXRhKHNlbGYsIGluZGVudDogc3RyKSAtPiBzdHI6CisgICAgdGVuc29yX2RpbXNfc3RyczogTGlzdFtzdHJdID0gW10KKyAgICBmb3IgdGVuc29yX2lkeCwgdGVuc29yIGluIGVudW1lcmF0ZShzZWxmLnRlbnNvcnMpOgorICAgICAgdHlwZV9uYW1lID0gc2VsZi50ZW5zb3JfZGF0YV90eXBlKHRlbnNvcl9pZHgpCisgICAgICB0ZW5zb3JfbmFtZSA9IHNlbGYudGVuc29yX2RhdGFfbmFtZSh0ZW5zb3JfaWR4KQorICAgICAgdGVuc29yX2RpbXNfc3Rycy5hcHBlbmQoCisgICAgICAgICAgdGVuc29yLmdlbmVyYXRlX2NfdGVuc29yX2RpbXModHlwZV9uYW1lLCB0ZW5zb3JfbmFtZSkpCisgICAgcmV0dXJuIHRleHR3cmFwLmluZGVudCgiXG5cbiIuam9pbih0ZW5zb3JfZGltc19zdHJzKSwgaW5kZW50KQorCisgIGRlZiBnZW5lcmF0ZV9jX3RlbnNvcl9pbml0KHNlbGYsIGluZGVudDogc3RyKSAtPiBzdHI6CisgICAgdGVuc29yX2luaXRfc3RyczogTGlzdFtzdHJdID0gW10KKyAgICBmb3IgdGVuc29yX2lkeCwgdGVuc29yIGluIGVudW1lcmF0ZShzZWxmLnRlbnNvcnMpOgorICAgICAgdGZsaXRlX3RlbnNvcl9uYW1lID0gc2VsZi50ZW5zb3JzX2VsZW1lbnQodGVuc29yX2lkeCkKKyAgICAgIHRlbnNvcl9kYXRhX25hbWUgPSBzZWxmLnRlbnNvcl9kYXRhX25hbWUodGVuc29yX2lkeCkKKyAgICAgIHRlbnNvcl9pbml0X3N0cnMuYXBwZW5kKAorICAgICAgICAgIHRlbnNvci5nZW5lcmF0ZV9jX3RlbnNvcl9pbml0KHRmbGl0ZV90ZW5zb3JfbmFtZSwgdGVuc29yX2RhdGFfbmFtZSkpCisgICAgcmV0dXJuIHRleHR3cmFwLmluZGVudCgiXG4iLmpvaW4odGVuc29yX2luaXRfc3RycyksIGluZGVudCkKKworCitjbGFzcyBHcmFwaChvYmplY3QpOgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2RlbDogc2NoZW1hX2ZiLk1vZGVsVCk6CisgICAgYnVmZmVyczogTGlzdFt0ZW5zb3IuQnVmZmVyXSA9IFsKKyAgICAgICAgdGVuc29yLkJ1ZmZlcigiYnVmZmVyX3t9Ii5mb3JtYXQoaWR4KSwgYnVmZmVyKQorICAgICAgICBmb3IgaWR4LCBidWZmZXIgaW4gZW51bWVyYXRlKG1vZGVsLmJ1ZmZlcnMpCisgICAgXQorICAgIHNlbGYuX3N1YmdyYXBoczogTGlzdFtTdWJHcmFwaF0gPSBbCisgICAgICAgIFN1YmdyYXBoKG1vZGVsLCBidWZmZXJzLCBpZHgsIHN1YmdyYXBoKQorICAgICAgICBmb3IgaWR4LCBzdWJncmFwaCBpbiBlbnVtZXJhdGUobW9kZWwuc3ViZ3JhcGhzKQorICAgIF0KKworICBAcHJvcGVydHkKKyAgZGVmIHN1YmdyYXBocyhzZWxmKSAtPiBTZXF1ZW5jZVtTdWJncmFwaF06CisgICAgcmV0dXJuIHNlbGYuX3N1YmdyYXBocworCisgIEBwcm9wZXJ0eQorICBkZWYgYnVmZmVycyhzZWxmKSAtPiBTZXF1ZW5jZVt0ZW5zb3IuQnVmZmVyXToKKyAgICBidWZmZXJzOiBMaXN0W3RlbnNvci5CdWZmZXJdID0gW10KKyAgICBmb3Igc3ViZ3JhcGggaW4gc2VsZi5zdWJncmFwaHM6CisgICAgICBmb3IgdCBpbiBzdWJncmFwaC50ZW5zb3JzOgorICAgICAgICBidWZmZXJzLmFwcGVuZCh0LmJ1ZmZlcikKKyAgICByZXR1cm4gYnVmZmVycworCisgIEBwcm9wZXJ0eQorICBkZWYgbmVlZHNfemVyb19sZW5ndGhfaW50X2FycmF5KHNlbGYpIC0+IGJvb2w6CisgICAgcmV0dXJuIGFueShzdWJncmFwaC5uZWVkc196ZXJvX2xlbmd0aF9pbnRfYXJyYXkKKyAgICAgICAgICAgICAgIGZvciBzdWJncmFwaCBpbiBzZWxmLnN1YmdyYXBocykKKworCitjbGFzcyBPcENvZGVUYWJsZShvYmplY3QpOgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBtb2RlbHM6IFNlcXVlbmNlW3NjaGVtYV9mYi5Nb2RlbFRdKToKKyAgICBvcF9jb2RlcyA9IFtdCisgICAgZm9yIG1vZGVsIGluIG1vZGVsczoKKyAgICAgIGZvciBvcF9jb2RlIGluIG1vZGVsLm9wZXJhdG9yQ29kZXM6CisgICAgICAgIG9wX2NvZGVzLmFwcGVuZChPcENvZGUob3BfY29kZSkpCisKKyAgICBzZWxmLl9vcF9jb2RlczogTGlzdChbT3BDb2RlXSkgPSBsaXN0KHNldChvcF9jb2RlcykpCisKKyAgQHByb3BlcnR5CisgIGRlZiBvcF9jb2RlcyhzZWxmKSAtPiBTZXF1ZW5jZVtPcENvZGVdOgorICAgIHJldHVybiBzZWxmLl9vcF9jb2RlcwpkaWZmIC0tZ2l0IGEvY29kZWdlbi9pbmZlcmVuY2VfZ2VuZXJhdG9yLnB5IGIvY29kZWdlbi9pbmZlcmVuY2VfZ2VuZXJhdG9yLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMzUxZjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb2RlZ2VuL2luZmVyZW5jZV9nZW5lcmF0b3IucHkKQEAgLTAsMCArMSw2OCBAQAorIyBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyIiIiBHZW5lcmF0ZXMgQy9DKysgaW5mZXJlbmNlIHNvdXJjZSBjb2RlLiAiIiIKKworaW1wb3J0IHBhdGhsaWIKKworZnJvbSBtYWtvIGltcG9ydCB0ZW1wbGF0ZQorZnJvbSB0eXBpbmcgaW1wb3J0IFR5cGVkRGljdAorCitmcm9tIHRmbGl0ZV9taWNyby5jb2RlZ2VuIGltcG9ydCBncmFwaAorCitfVEVNUExBVEVfRElSID0gcGF0aGxpYi5QYXRoKF9fZmlsZV9fKS5wYXJlbnQgLyAndGVtcGxhdGVzJworX0hFQURFUl9URU1QTEFURSA9IF9URU1QTEFURV9ESVIgLyAnaW5mZXJlbmNlLmgubWFrbycKK19TT1VSQ0VfVEVNUExBVEUgPSBfVEVNUExBVEVfRElSIC8gJ2luZmVyZW5jZS5jYy5tYWtvJworCisKK2NsYXNzIE1vZGVsRGF0YShUeXBlZERpY3QpOgorICBoZWFkZXJfZmlsZTogc3RyCisgIG1vZGVsX25hbWU6IHN0cgorICBvcF9jb2RlX3RhYmxlOiBncmFwaC5PcENvZGVUYWJsZQorICBncmFwaDogZ3JhcGguR3JhcGgKKworCitkZWYgX3JlbmRlcihvdXRwdXRfZmlsZTogcGF0aGxpYi5QYXRoLCB0ZW1wbGF0ZV9maWxlOiBwYXRobGliLlBhdGgsCisgICAgICAgICAgICBtb2RlbF9kYXRhOiBNb2RlbERhdGEpIC0+IE5vbmU6CisgIHByaW50KCJHZW5lcmF0aW5nIHt9Ii5mb3JtYXQob3V0cHV0X2ZpbGUpKQorICB0ID0gdGVtcGxhdGUuVGVtcGxhdGUoZmlsZW5hbWU9c3RyKHRlbXBsYXRlX2ZpbGUpKQorICB3aXRoIG91dHB1dF9maWxlLm9wZW4oJ3crJykgYXMgZmlsZToKKyAgICBmaWxlLndyaXRlKHQucmVuZGVyKCoqbW9kZWxfZGF0YSkpCisKKworZGVmIF9nZW5lcmF0ZV9oZWFkZXIoaGVhZGVyX3BhdGg6IHBhdGhsaWIuUGF0aCwgbW9kZWxfZGF0YTogTW9kZWxEYXRhKSAtPiBOb25lOgorICBfcmVuZGVyKGhlYWRlcl9wYXRoLCBfSEVBREVSX1RFTVBMQVRFLCBtb2RlbF9kYXRhKQorCisKK2RlZiBfZ2VuZXJhdGVfc291cmNlKHNvdXJjZV9wYXRoOiBwYXRobGliLlBhdGgsIG1vZGVsX2RhdGE6IE1vZGVsRGF0YSkgLT4gTm9uZToKKyAgX3JlbmRlcihzb3VyY2VfcGF0aCwgX1NPVVJDRV9URU1QTEFURSwgbW9kZWxfZGF0YSkKKworCitkZWYgZ2VuZXJhdGUob3V0cHV0X2Rpcjogc3RyLCBvdXRwdXRfbmFtZTogc3RyLAorICAgICAgICAgICAgIG9wX2NvZGVfdGFibGU6IGdyYXBoLk9wQ29kZVRhYmxlLCBncmFwaDogZ3JhcGguR3JhcGgpIC0+IE5vbmU6CisgICIiIiBHZW5lcmF0ZSBDL0MrKyBpbmZlcmVuY2UgY29kZS4gIiIiCisgIGhlYWRlcl9maWxlID0gZiJ7b3V0cHV0X25hbWV9LmgiCisgIG1vZGVsX2RhdGE6IE1vZGVsRGF0YSA9IHsKKyAgICAgICdoZWFkZXJfZmlsZSc6IGhlYWRlcl9maWxlLAorICAgICAgJ21vZGVsX25hbWUnOiBvdXRwdXRfbmFtZSwKKyAgICAgICdvcF9jb2RlX3RhYmxlJzogb3BfY29kZV90YWJsZSwKKyAgICAgICdncmFwaCc6IGdyYXBoLAorICB9CisKKyAgIyBFbnN1cmUgb3V0cHV0IGRpcmVjdG9yeSBleGlzdHMKKyAgb3V0cHV0X3BhdGggPSBwYXRobGliLlBhdGgob3V0cHV0X2RpcikKKyAgb3V0cHV0X3BhdGgubWtkaXIocGFyZW50cz1UcnVlLCBleGlzdF9vaz1UcnVlKQorCisgIF9nZW5lcmF0ZV9oZWFkZXIob3V0cHV0X3BhdGggLyBoZWFkZXJfZmlsZSwgbW9kZWxfZGF0YSkKKyAgX2dlbmVyYXRlX3NvdXJjZShvdXRwdXRfcGF0aCAvIGYie291dHB1dF9uYW1lfS5jYyIsIG1vZGVsX2RhdGEpCmRpZmYgLS1naXQgYS9jb2RlZ2VuL29wZXJhdG9ycy9CVUlMRCBiL2NvZGVnZW4vb3BlcmF0b3JzL0JVSUxECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhN2FlMjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb2RlZ2VuL29wZXJhdG9ycy9CVUlMRApAQCAtMCwwICsxLDUyIEBACitsb2FkKCJAcnVsZXNfcHl0aG9uLy9weXRob246ZGVmcy5iemwiLCAicHlfbGlicmFyeSIpCisKK3BhY2thZ2UoCisgICAgZGVmYXVsdF92aXNpYmlsaXR5ID0gWyIvLzpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICBsaWNlbnNlcyA9IFsibm90aWNlIl0sCispCisKK3B5X2xpYnJhcnkoCisgICAgbmFtZSA9ICJjb25zdGFudHMiLAorICAgIHNyY3MgPSBbCisgICAgICAgICJjb25zdGFudHMucHkiLAorICAgIF0sCisgICAgZGVwcyA9IFsKKyAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL3B5dGhvbjpzY2hlbWFfcHkiLAorICAgIF0sCispCisKK3B5X2xpYnJhcnkoCisgICAgbmFtZSA9ICJmYWN0b3J5IiwKKyAgICBzcmNzID0gWworICAgICAgICAiZmFjdG9yeS5weSIsCisgICAgXSwKKyAgICBkZXBzID0gWworICAgICAgICAiOmZ1bGx5X2Nvbm5lY3RlZCIsCisgICAgICAgICI6b3BlcmF0b3IiLAorICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvcHl0aG9uOnNjaGVtYV9weSIsCisgICAgXSwKKykKKworcHlfbGlicmFyeSgKKyAgICBuYW1lID0gImZ1bGx5X2Nvbm5lY3RlZCIsCisgICAgc3JjcyA9IFsKKyAgICAgICAgImZ1bGx5X2Nvbm5lY3RlZC5weSIsCisgICAgXSwKKyAgICBkZXBzID0gWworICAgICAgICAiOmNvbnN0YW50cyIsCisgICAgICAgICI6b3BlcmF0b3IiLAorICAgICAgICAiLy9jb2RlZ2VuOnV0aWxzIiwKKyAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL3B5dGhvbjpzY2hlbWFfcHkiLAorICAgIF0sCispCisKK3B5X2xpYnJhcnkoCisgICAgbmFtZSA9ICJvcGVyYXRvciIsCisgICAgc3JjcyA9IFsKKyAgICAgICAgIm9wZXJhdG9yLnB5IiwKKyAgICBdLAorICAgIGRlcHMgPSBbCisgICAgICAgICIvL2NvZGVnZW46dXRpbHMiLAorICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvcHl0aG9uOnNjaGVtYV9weSIsCisgICAgXSwKKykKZGlmZiAtLWdpdCBhL2NvZGVnZW4vb3BlcmF0b3JzL2NvbnN0YW50cy5weSBiL2NvZGVnZW4vb3BlcmF0b3JzL2NvbnN0YW50cy5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWZmMTdhCi0tLSAvZGV2L251bGwKKysrIGIvY29kZWdlbi9vcGVyYXRvcnMvY29uc3RhbnRzLnB5CkBAIC0wLDAgKzEsNTAgQEAKKyMgQ29weXJpZ2h0IDIwMjMgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisiIiIgT3BlcmF0b3IgQ29uc3RhbnRzICIiIgorCitmcm9tIHR5cGluZyBpbXBvcnQgRGljdAorCitmcm9tIHRmbGl0ZV9taWNyby50ZW5zb3JmbG93LmxpdGUucHl0aG9uIGltcG9ydCBzY2hlbWFfcHlfZ2VuZXJhdGVkIGFzIHNjaGVtYV9mYgorCitBQ1RJVkFUSU9OX0ZVTkNTOiBEaWN0W2ludCwgc3RyXSA9IHsKKyAgICBzY2hlbWFfZmIuQWN0aXZhdGlvbkZ1bmN0aW9uVHlwZS5OT05FOiAia1RmTGl0ZUFjdE5vbmUiLAorICAgIHNjaGVtYV9mYi5BY3RpdmF0aW9uRnVuY3Rpb25UeXBlLlJFTFU6ICJrVGZMaXRlQWN0UmVsdSIsCisgICAgc2NoZW1hX2ZiLkFjdGl2YXRpb25GdW5jdGlvblR5cGUuUkVMVV9OMV9UT18xOiAia1RmTGl0ZUFjdFJlbHVOMVRvMSIsCisgICAgc2NoZW1hX2ZiLkFjdGl2YXRpb25GdW5jdGlvblR5cGUuUkVMVTY6ICJrVGZMaXRlQWN0UmVsdTYiLAorICAgIHNjaGVtYV9mYi5BY3RpdmF0aW9uRnVuY3Rpb25UeXBlLlRBTkg6ICJrVGZMaXRlQWN0VGFuaCIsCisgICAgc2NoZW1hX2ZiLkFjdGl2YXRpb25GdW5jdGlvblR5cGUuU0lHTl9CSVQ6ICJrVGZMaXRlQWN0U2lnbkJpdCIsCit9CisKK1RGTElURV9UWVBFOiBEaWN0W2ludCwgc3RyXSA9IHsKKyAgICAwOiAia1RmTGl0ZU5vVHlwZSIsCisgICAgMTogImtUZkxpdGVGbG9hdDMyIiwKKyAgICAyOiAia1RmTGl0ZUludDMyIiwKKyAgICAzOiAia1RmTGl0ZVVJbnQ4IiwKKyAgICA0OiAia1RmTGl0ZUludDY0IiwKKyAgICA1OiAia1RmTGl0ZVN0cmluZyIsCisgICAgNjogImtUZkxpdGVCb29sIiwKKyAgICA3OiAia1RmTGl0ZUludDE2IiwKKyAgICA4OiAia1RmTGl0ZUNvbXBsZXg2NCIsCisgICAgOTogImtUZkxpdGVJbnQ4IiwKKyAgICAxMDogImtUZkxpdGVGbG9hdDE2IiwKKyAgICAxMTogImtUZkxpdGVGbG9hdDY0IiwKKyAgICAxMjogImtUZkxpdGVDb21wbGV4MTI4IiwKKyAgICAxMzogImtUZkxpdGVVSW50NjQiLAorICAgIDE0OiAia1RmTGl0ZVJlc291cmNlIiwKKyAgICAxNTogImtUZkxpdGVWYXJpYW50IiwKKyAgICAxNjogImtUZkxpdGVVSW50MzIiLAorICAgIDE3OiAia1RmTGl0ZVVJbnQxNiIsCisgICAgMTg6ICJrVGZMaXRlSW50NCIsCit9CmRpZmYgLS1naXQgYS9jb2RlZ2VuL29wZXJhdG9ycy9mYWN0b3J5LnB5IGIvY29kZWdlbi9vcGVyYXRvcnMvZmFjdG9yeS5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjJjYWNiCi0tLSAvZGV2L251bGwKKysrIGIvY29kZWdlbi9vcGVyYXRvcnMvZmFjdG9yeS5weQpAQCAtMCwwICsxLDI4IEBACisjIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIiIiIEEgZmFjdG9yeSBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgb3BlcmF0b3JzICIiIgorCitmcm9tIHRmbGl0ZV9taWNyby5jb2RlZ2VuLm9wZXJhdG9ycyBpbXBvcnQgZnVsbHlfY29ubmVjdGVkCitmcm9tIHRmbGl0ZV9taWNyby5jb2RlZ2VuLm9wZXJhdG9ycyBpbXBvcnQgb3BlcmF0b3IKK2Zyb20gdGZsaXRlX21pY3JvLnRlbnNvcmZsb3cubGl0ZS5weXRob24gaW1wb3J0IHNjaGVtYV9weV9nZW5lcmF0ZWQgYXMgc2NoZW1hX2ZiCisKK19CVUlMVElOX09QRVJBVE9SUzogZGljdFtpbnQsIG9wZXJhdG9yLk9wZXJhdG9yLl9fY2xhc3NfX10gPSB7CisgICAgc2NoZW1hX2ZiLkJ1aWx0aW5PcGVyYXRvci5GVUxMWV9DT05ORUNURUQ6IGZ1bGx5X2Nvbm5lY3RlZC5GdWxseUNvbm5lY3RlZCwKK30KKworCitkZWYgY3JlYXRlX29wZXJhdG9yKG9wX2NvZGU6IHNjaGVtYV9mYi5PcGVyYXRvckNvZGVULCBvcDogc2NoZW1hX2ZiLk9wZXJhdG9yKToKKyAgb3BlcmF0b3JfY2xhc3MgPSBfQlVJTFRJTl9PUEVSQVRPUlNbb3BfY29kZS5idWlsdGluQ29kZV0KKyAgcmV0dXJuIG9wZXJhdG9yX2NsYXNzKG9wKQpkaWZmIC0tZ2l0IGEvY29kZWdlbi9vcGVyYXRvcnMvZnVsbHlfY29ubmVjdGVkLnB5IGIvY29kZWdlbi9vcGVyYXRvcnMvZnVsbHlfY29ubmVjdGVkLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NTZiZWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb2RlZ2VuL29wZXJhdG9ycy9mdWxseV9jb25uZWN0ZWQucHkKQEAgLTAsMCArMSw1NiBAQAorIyBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyIiIiBGdWxseUNvbm5lY3RlZCBvcGVyYXRvciAiIiIKKworZnJvbSB0eXBpbmcgaW1wb3J0IERpY3QKK2ltcG9ydCBzdHJpbmcKKworZnJvbSB0ZmxpdGVfbWljcm8uY29kZWdlbi5vcGVyYXRvcnMgaW1wb3J0IGNvbnN0YW50cworZnJvbSB0ZmxpdGVfbWljcm8uY29kZWdlbi5vcGVyYXRvcnMgaW1wb3J0IG9wZXJhdG9yCitmcm9tIHRmbGl0ZV9taWNyby5jb2RlZ2VuIGltcG9ydCB1dGlscworZnJvbSB0ZmxpdGVfbWljcm8udGVuc29yZmxvdy5saXRlLnB5dGhvbiBpbXBvcnQgc2NoZW1hX3B5X2dlbmVyYXRlZCBhcyBzY2hlbWFfZmIKKworX1dFSUdIVFNfRk9STUFUUzogRGljdFtpbnQsIHN0cl0gPSB7CisgICAgc2NoZW1hX2ZiLkZ1bGx5Q29ubmVjdGVkT3B0aW9uc1dlaWdodHNGb3JtYXQuREVGQVVMVDoKKyAgICAia1RmTGl0ZUZ1bGx5Q29ubmVjdGVkV2VpZ2h0c0Zvcm1hdERlZmF1bHQiLAorICAgIHNjaGVtYV9mYi5GdWxseUNvbm5lY3RlZE9wdGlvbnNXZWlnaHRzRm9ybWF0LlNIVUZGTEVENHgxNklOVDg6CisgICAgImtUZkxpdGVGdWxseUNvbm5lY3RlZFdlaWdodHNGb3JtYXRTaHVmZmxlZDR4MTZJbnQ4IiwKK30KKworCitjbGFzcyBGdWxseUNvbm5lY3RlZChvcGVyYXRvci5PcGVyYXRvcik6CisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG9wOiBzY2hlbWFfZmIuT3BlcmF0b3JUKToKKyAgICBhc3NlcnQgb3AuYnVpbHRpbk9wdGlvbnNUeXBlID09IHNjaGVtYV9mYi5CdWlsdGluT3B0aW9ucy5GdWxseUNvbm5lY3RlZE9wdGlvbnMKKyAgICBzdXBlcihGdWxseUNvbm5lY3RlZCwgc2VsZikuX19pbml0X18ob3ApCisgICAgc2VsZi5fYnVpbHRpbl9vcHRpb25zOiBzY2hlbWFfZmIuRnVsbHlDb25uZWN0ZWRPcHRpb25zVCA9IG9wLmJ1aWx0aW5PcHRpb25zCisKKyAgZGVmIGdlbmVyYXRlX2NfYnVpbHRpbl9kYXRhKHNlbGYpIC0+IHN0cjoKKyAgICBidWlsdGluX3RlbXBsYXRlID0gc3RyaW5nLlRlbXBsYXRlKAorICAgICAgICAiVGZMaXRlRnVsbHlDb25uZWN0ZWRQYXJhbXMgYnVpbHRpbl9kYXRhID0ge1xuIgorICAgICAgICAiICAgIC5hY3RpdmF0aW9uID0gJHthY3RpdmF0aW9ufSxcbiIKKyAgICAgICAgIiAgICAud2VpZ2h0c19mb3JtYXQgPSAke3dlaWdodHNfZm9ybWF0fSxcbiIKKyAgICAgICAgIiAgICAua2VlcF9udW1fZGltcyA9ICR7a2VlcF9udW1fZGltc30sXG4iCisgICAgICAgICIgICAgLmFzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzID0gJHthc3ltbWV0cmljX3F1YW50aXplX2lucHV0c30sXG4iCisgICAgICAgICIgICAgLnF1YW50aXplZF9iaWFzX3R5cGUgPSAke3F1YW50aXplZF9iaWFzX3R5cGV9fTsiKQorICAgIHJldHVybiBidWlsdGluX3RlbXBsYXRlLnN1YnN0aXR1dGUoCisgICAgICAgIGFjdGl2YXRpb249Y29uc3RhbnRzLkFDVElWQVRJT05fRlVOQ1NbCisgICAgICAgICAgICBzZWxmLl9idWlsdGluX29wdGlvbnMuZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb25dLAorICAgICAgICB3ZWlnaHRzX2Zvcm1hdD1fV0VJR0hUU19GT1JNQVRTW3NlbGYuX2J1aWx0aW5fb3B0aW9ucy53ZWlnaHRzRm9ybWF0XSwKKyAgICAgICAga2VlcF9udW1fZGltcz11dGlscy5ib29sX3RvX2Nfc3RyKHNlbGYuX2J1aWx0aW5fb3B0aW9ucy5rZWVwTnVtRGltcyksCisgICAgICAgIGFzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzPXV0aWxzLmJvb2xfdG9fY19zdHIoCisgICAgICAgICAgICBzZWxmLl9idWlsdGluX29wdGlvbnMuYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKSwKKyAgICAgICAgcXVhbnRpemVkX2JpYXNfdHlwZT1jb25zdGFudHMuVEZMSVRFX1RZUEVbCisgICAgICAgICAgICBzZWxmLl9idWlsdGluX29wdGlvbnMucXVhbnRpemVkQmlhc1R5cGVdKQpkaWZmIC0tZ2l0IGEvY29kZWdlbi9vcGVyYXRvcnMvb3BlcmF0b3IucHkgYi9jb2RlZ2VuL29wZXJhdG9ycy9vcGVyYXRvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODc5ZDM3Ci0tLSAvZGV2L251bGwKKysrIGIvY29kZWdlbi9vcGVyYXRvcnMvb3BlcmF0b3IucHkKQEAgLTAsMCArMSw5MiBAQAorIyBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyIiIiBQcm92aWRlcyBvYmplY3QgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBtb2RlbCB0aGF0IGlzIGNvbmR1Y2l2ZSB0byBjb2RlIAorICAgIGdlbmVyYXRpb24gdXNpbmcgdGVtcGxhdGVzLiAiIiIKKworaW1wb3J0IGFiYworZnJvbSB0eXBpbmcgaW1wb3J0IE9wdGlvbmFsCitpbXBvcnQgc3RyaW5nCitpbXBvcnQgdGV4dHdyYXAKKworZnJvbSB0ZmxpdGVfbWljcm8uY29kZWdlbiBpbXBvcnQgdXRpbHMKK2Zyb20gdGZsaXRlX21pY3JvLnRlbnNvcmZsb3cubGl0ZS5weXRob24gaW1wb3J0IHNjaGVtYV9weV9nZW5lcmF0ZWQgYXMgc2NoZW1hX2ZiCisKKworY2xhc3MgT3BlcmF0b3IoYWJjLkFCQyk6CisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG9wZXJhdG9yOiBzY2hlbWFfZmIuT3BlcmF0b3JUKToKKyAgICBzZWxmLl9vcGVyYXRvcjogc2NoZW1hX2ZiLk9wZXJhdG9yVCA9IG9wZXJhdG9yCisgICAgc2VsZi5faW5wdXRzOiB1dGlscy5JbnRBcnJheSA9IHV0aWxzLkludEFycmF5KHNlbGYuX29wZXJhdG9yLmlucHV0cykKKyAgICBzZWxmLl9vdXRwdXRzOiB1dGlscy5JbnRBcnJheSA9IHV0aWxzLkludEFycmF5KHNlbGYuX29wZXJhdG9yLm91dHB1dHMpCisgICAgc2VsZi5faW50ZXJtZWRpYXRlczogT3B0aW9uYWxbdXRpbHMuSW50QXJyYXldID0gdXRpbHMuSW50QXJyYXkoCisgICAgICAgIHNlbGYuX29wZXJhdG9yLmludGVybWVkaWF0ZXMpIGlmIHNlbGYuX29wZXJhdG9yLmludGVybWVkaWF0ZXMgZWxzZSBOb25lCisKKyAgZGVmIGdlbmVyYXRlX2Nfbm9kZV9kYXRhKHNlbGYsIHR5cGVfbmFtZTogc3RyLCBub2RlX25hbWU6IHN0cikgLT4gc3RyOgorICAgIHN0cnVjdF90ZW1wbGF0ZSA9IHN0cmluZy5UZW1wbGF0ZSgic3RydWN0ICR7dHlwZV9uYW1lfSB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIke2JvZHl9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifSAke25vZGVfbmFtZX07IikKKyAgICBib2R5X3RlbXBsYXRlID0gc3RyaW5nLlRlbXBsYXRlKCIke2lucHV0c31cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIke291dHB1dHN9XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHtpbnRlcm1lZGlhdGVzfVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiR7YnVpbHRpbl9kYXRhfVxuIikKKyAgICBpZiBzZWxmLl9pbnRlcm1lZGlhdGVzOgorICAgICAgaW50ZXJtZWRpYXRlcyA9IHNlbGYuX2ludGVybWVkaWF0ZXMuZ2VuZXJhdGVfY19zdHJ1Y3QoCisgICAgICAgICAgIkludGVybWVkaWF0ZXMiLCAiaW50ZXJtZWRpYXRlcyIpCisgICAgZWxzZToKKyAgICAgIGludGVybWVkaWF0ZXMgPSAiLy8gTm8gaW50ZXJtZWRpYXRlcyIKKworICAgIGJvZHkgPSBib2R5X3RlbXBsYXRlLnN1YnN0aXR1dGUoCisgICAgICAgIGlucHV0cz1zZWxmLl9pbnB1dHMuZ2VuZXJhdGVfY19zdHJ1Y3QoIklucHV0cyIsICJpbnB1dHMiKSwKKyAgICAgICAgb3V0cHV0cz1zZWxmLl9vdXRwdXRzLmdlbmVyYXRlX2Nfc3RydWN0KCJPdXRwdXRzIiwgIm91dHB1dHMiKSwKKyAgICAgICAgaW50ZXJtZWRpYXRlcz1pbnRlcm1lZGlhdGVzLAorICAgICAgICBidWlsdGluX2RhdGE9c2VsZi5nZW5lcmF0ZV9jX2J1aWx0aW5fZGF0YSgpKQorCisgICAgcmV0dXJuIHN0cnVjdF90ZW1wbGF0ZS5zdWJzdGl0dXRlKHR5cGVfbmFtZT10eXBlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVfbmFtZT1ub2RlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk9dGV4dHdyYXAuaW5kZW50KGJvZHksICIgICIpKQorCisgIGRlZiBnZW5lcmF0ZV9jX25vZGVfaW5pdChzZWxmLCB0ZmxpdGVfbm9kZV9uYW1lOiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlX2RhdGFfbmFtZTogc3RyKSAtPiBzdHI6CisgICAgaW5pdF90ZW1wbGF0ZSA9IHN0cmluZy5UZW1wbGF0ZSgKKyAgICAgICAgIiR7dGZsaXRlX25vZGVfbmFtZX0gPSBUZkxpdGVOb2Rle1xuIgorICAgICAgICAiICAgIC5pbnB1dHMgPSIKKyAgICAgICAgIiByZWludGVycHJldF9jYXN0PFRmTGl0ZUludEFycmF5Kj4oJiR7bm9kZV9kYXRhX25hbWV9LmlucHV0cyksXG4iCisgICAgICAgICIgICAgLm91dHB1dHMgPSIKKyAgICAgICAgIiByZWludGVycHJldF9jYXN0PFRmTGl0ZUludEFycmF5Kj4oJiR7bm9kZV9kYXRhX25hbWV9Lm91dHB1dHMpLFxuIgorICAgICAgICAiICAgIC5pbnRlcm1lZGlhdGVzID0gJHtpbnRlcm1lZGlhdGVzfSxcbiIKKyAgICAgICAgIiAgICAudXNlcl9kYXRhID0gbnVsbHB0cixcbiIKKyAgICAgICAgIiAgICAuYnVpbHRpbl9kYXRhID0iCisgICAgICAgICIgc3RhdGljX2Nhc3Q8dm9pZCo+KCYke25vZGVfZGF0YV9uYW1lfS5idWlsdGluX2RhdGEpLFxuIgorICAgICAgICAiICAgIC5jdXN0b21faW5pdGlhbF9kYXRhID0gbnVsbHB0cixcbiIKKyAgICAgICAgIiAgICAuY3VzdG9tX2luaXRpYWxfZGF0YV9zaXplID0gMH07IikKKworICAgIGlmIHNlbGYuX2ludGVybWVkaWF0ZXM6CisgICAgICBpbnRlcm1lZGlhdGVzID0gKAorICAgICAgICAgICJyZWludGVycHJldF9jYXN0PFRmTGl0ZUludEFycmF5Kj4oJnt9LmludGVybWVkaWF0ZXMpIi5mb3JtYXQoCisgICAgICAgICAgICAgIHNlbGYuX2ludGVybWVkaWF0ZXMpKQorICAgIGVsc2U6CisgICAgICBpbnRlcm1lZGlhdGVzID0gIm51bGxwdHIiCisKKyAgICByZXR1cm4gaW5pdF90ZW1wbGF0ZS5zdWJzdGl0dXRlKHRmbGl0ZV9ub2RlX25hbWU9dGZsaXRlX25vZGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVfZGF0YV9uYW1lPW5vZGVfZGF0YV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlcz1pbnRlcm1lZGlhdGVzKQorCisgIEBwcm9wZXJ0eQorICBkZWYgb3BfY29kZV9pbmRleChzZWxmKSAtPiBpbnQ6CisgICAgcmV0dXJuIHNlbGYuX29wZXJhdG9yLm9wY29kZUluZGV4CisKKyAgQGFiYy5hYnN0cmFjdG1ldGhvZAorICBkZWYgZ2VuZXJhdGVfY19idWlsdGluX2RhdGEoc2VsZikgLT4gc3RyOgorICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IoZiJHZW5lcmF0aW5nIGJ1aWx0aW4gZGF0YSBpbiB7c2VsZi5fX25hbWVfX30iKQpkaWZmIC0tZ2l0IGEvY29kZWdlbi9ydW50aW1lL0JVSUxEIGIvY29kZWdlbi9ydW50aW1lL0JVSUxECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyM2NiNzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb2RlZ2VuL3J1bnRpbWUvQlVJTEQKQEAgLTAsMCArMSwxOSBAQAorbG9hZCgiLy90ZW5zb3JmbG93L2xpdGUvbWljcm86YnVpbGRfZGVmLmJ6bCIsICJtaWNyb19jb3B0cyIpCisKK3BhY2thZ2UoZGVmYXVsdF92aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0pCisKK2NjX2xpYnJhcnkoCisgICAgbmFtZSA9ICJtaWNyb19jb2RlZ2VuX2NvbnRleHQiLAorICAgIHNyY3MgPSBbIm1pY3JvX2NvZGVnZW5fY29udGV4dC5jYyJdLAorICAgIGhkcnMgPSBbIm1pY3JvX2NvZGVnZW5fY29udGV4dC5oIl0sCisgICAgY29wdHMgPSBtaWNyb19jb3B0cygpLAorICAgIGRlcHMgPSBbCisgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9jOmNvbW1vbiIsCisgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzOm9wX21hY3JvcyIsCisgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsOmNvbXBhdGliaWxpdHkiLAorICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm86bWljcm9fY29udGV4dCIsCisgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNybzptaWNyb19ncmFwaCIsCisgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNybzptaWNyb19sb2ciLAorICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm86c3BhbiIsCisgICAgXSwKKykKZGlmZiAtLWdpdCBhL2NvZGVnZW4vcnVudGltZS9taWNyb19jb2RlZ2VuX2NvbnRleHQuY2MgYi9jb2RlZ2VuL3J1bnRpbWUvbWljcm9fY29kZWdlbl9jb250ZXh0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1OGM4MjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb2RlZ2VuL3J1bnRpbWUvbWljcm9fY29kZWdlbl9jb250ZXh0LmNjCkBAIC0wLDAgKzEsMTM5IEBACisvKiBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgImNvZGVnZW4vcnVudGltZS9taWNyb19jb2RlZ2VuX2NvbnRleHQuaCIKKworI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9jL2NvbW1vbi5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL2NvbXBhdGliaWxpdHkuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9vcF9tYWNyb3MuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fbG9nLmgiCisKK25hbWVzcGFjZSB0ZmxpdGUgeworCitNaWNyb0NvZGVnZW5Db250ZXh0OjpNaWNyb0NvZGVnZW5Db250ZXh0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwYW48U3ViZ3JhcGg+IHN1YmdyYXBocykKKyAgICA6IGNvbnRleHRfKGNvbnRleHQpLCBzdWJncmFwaHNfKHN1YmdyYXBocykge30KKwordm9pZCogTWljcm9Db2RlZ2VuQ29udGV4dDo6R2V0U2NyYXRjaEJ1ZmZlcihpbnQgYnVmZmVyX2lkeCkgeworICAvLyBUT0RPKHJqYXNjYW5pKTogSW1wbGVtZW50IHNjcmF0Y2ggYnVmZmVycworICByZXR1cm4gbnVsbHB0cjsKK30KKworVGZMaXRlRXZhbFRlbnNvciogTWljcm9Db2RlZ2VuQ29udGV4dDo6R2V0RXZhbFRlbnNvcihpbnQgdGVuc29yX2lkeCkgeworICBURkxJVEVfRENIRUNLKHN0YXRpY19jYXN0PHNpemVfdD4odGVuc29yX2lkeCkgPAorICAgICAgICAgICAgICAgIHN1YmdyYXBoc19bY3VycmVudF9zdWJncmFwaF9pZHhfXS50ZW5zb3JzLnNpemUoKSk7CisgIHJldHVybiAmc3ViZ3JhcGhzX1tjdXJyZW50X3N1YmdyYXBoX2lkeF9dLnRlbnNvcnNbdGVuc29yX2lkeF07Cit9CisKK1RmTGl0ZVN0YXR1cyBNaWNyb0NvZGVnZW5Db250ZXh0OjpzZXRfZXh0ZXJuYWxfY29udGV4dCgKKyAgICB2b2lkKiBleHRlcm5hbF9jb250ZXh0X3BheWxvYWQpIHsKKyAgaWYgKGV4dGVybmFsX2NvbnRleHRfcGF5bG9hZCA9PSBudWxscHRyIHx8CisgICAgICBleHRlcm5hbF9jb250ZXh0X3BheWxvYWRfICE9IG51bGxwdHIpIHsKKyAgICBNaWNyb1ByaW50ZigKKyAgICAgICAgIkF0dGVtcHRpbmcgdG8gc2V0IGV4dGVybmFsIGNvbnRleHQgdG8gJXggYnV0IGl0IHdhcyAleCBhbHJlYWR5IiwKKyAgICAgICAgZXh0ZXJuYWxfY29udGV4dF9wYXlsb2FkLCBleHRlcm5hbF9jb250ZXh0X3BheWxvYWRfKTsKKyAgICByZXR1cm4ga1RmTGl0ZUVycm9yOworICB9CisKKyAgZXh0ZXJuYWxfY29udGV4dF9wYXlsb2FkXyA9IGV4dGVybmFsX2NvbnRleHRfcGF5bG9hZDsKKyAgcmV0dXJuIGtUZkxpdGVPazsKK30KKwordm9pZCogTWljcm9Db2RlZ2VuQ29udGV4dDo6ZXh0ZXJuYWxfY29udGV4dCgpIHsKKyAgcmV0dXJuIGV4dGVybmFsX2NvbnRleHRfcGF5bG9hZF87Cit9CisKK01pY3JvR3JhcGgmIE1pY3JvQ29kZWdlbkNvbnRleHQ6OmdyYXBoKCkgeyByZXR1cm4gKnRoaXM7IH0KKwordm9pZCogTWljcm9Db2RlZ2VuQ29udGV4dDo6QWxsb2NhdGVQZXJzaXN0ZW50QnVmZmVyKHNpemVfdCkgeworICAvLyBOb3QgYWxsb3dlZCBhdCBFdmFsCisgIFRGTElURV9BQk9SVDsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK1RmTGl0ZVN0YXR1cyBNaWNyb0NvZGVnZW5Db250ZXh0OjpSZXF1ZXN0U2NyYXRjaEJ1ZmZlckluQXJlbmEoc2l6ZV90LCBpbnQqKSB7CisgIC8vIE5vdCBhbGxvd2VkIGF0IEV2YWwKKyAgVEZMSVRFX0FCT1JUOworICByZXR1cm4ga1RmTGl0ZUVycm9yOworfQorCitUZkxpdGVUZW5zb3IqIE1pY3JvQ29kZWdlbkNvbnRleHQ6OkFsbG9jYXRlVGVtcFRmTGl0ZVRlbnNvcihpbnQpIHsKKyAgLy8gTm90IGFsbG93ZWQgYXQgRXZhbAorICBURkxJVEVfQUJPUlQ7CisgIHJldHVybiBudWxscHRyOworfQorCit2b2lkIE1pY3JvQ29kZWdlbkNvbnRleHQ6OkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKFRmTGl0ZVRlbnNvciopIHsKKyAgLy8gTm90IGFsbG93ZWQgYXQgRXZhbAorICBURkxJVEVfQUJPUlQ7Cit9CisKK3VpbnQ4X3QqIE1pY3JvQ29kZWdlbkNvbnRleHQ6OkFsbG9jYXRlVGVtcEJ1ZmZlcihzaXplX3QsIHNpemVfdCkgeworICAvLyBOb3QgYWxsb3dlZCBhdCBFdmFsCisgIFRGTElURV9BQk9SVDsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3ZvaWQgTWljcm9Db2RlZ2VuQ29udGV4dDo6RGVhbGxvY2F0ZVRlbXBCdWZmZXIodWludDhfdCopIHsKKyAgLy8gTm90IGFsbG93ZWQgYXQgRXZhbAorICBURkxJVEVfQUJPUlQ7Cit9CisKK1RmTGl0ZVN0YXR1cyBNaWNyb0NvZGVnZW5Db250ZXh0OjpJbnZva2VTdWJncmFwaChpbnQgc3ViZ3JhcGhfaWR4KSB7CisgIFRGX0xJVEVfRU5TVVJFKGNvbnRleHRfLAorICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzaXplX3Q+KHN1YmdyYXBoX2lkeCkgPCBzdWJncmFwaHNfLnNpemUoKSk7CisgIHNpemVfdCBwcmV2aW91c19zdWJncmFwaF9pZHggPSBjdXJyZW50X3N1YmdyYXBoX2lkeF87CisgIGN1cnJlbnRfc3ViZ3JhcGhfaWR4XyA9IHN1YmdyYXBoX2lkeDsKKyAgVGZMaXRlU3RhdHVzIHN0YXR1cyA9CisgICAgICBzdWJncmFwaHNfW3N1YmdyYXBoX2lkeF0uaW52b2tlKGNvbnRleHRfLCBzdWJncmFwaHNfW3N1YmdyYXBoX2lkeF0ubm9kZXMpOworICBjdXJyZW50X3N1YmdyYXBoX2lkeF8gPSBwcmV2aW91c19zdWJncmFwaF9pZHg7CisgIHJldHVybiBzdGF0dXM7Cit9CisKK3NpemVfdCBNaWNyb0NvZGVnZW5Db250ZXh0OjpOdW1TdWJncmFwaElucHV0cyhpbnQgc3ViZ3JhcGhfaWR4KSB7CisgIFRGTElURV9EQ0hFQ0soc3RhdGljX2Nhc3Q8c2l6ZV90PihzdWJncmFwaF9pZHgpIDwgc3ViZ3JhcGhzXy5zaXplKCkpOworICByZXR1cm4gc3ViZ3JhcGhzX1tzdWJncmFwaF9pZHhdLmlucHV0cy5zaXplKCk7Cit9CisKK1RmTGl0ZUV2YWxUZW5zb3IqIE1pY3JvQ29kZWdlbkNvbnRleHQ6OkdldFN1YmdyYXBoSW5wdXQoaW50IHN1YmdyYXBoX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0X2lkeCkgeworICBURkxJVEVfRENIRUNLKHN0YXRpY19jYXN0PHNpemVfdD4oc3ViZ3JhcGhfaWR4KSA8IHN1YmdyYXBoc18uc2l6ZSgpKTsKKyAgVEZMSVRFX0RDSEVDSyhzdGF0aWNfY2FzdDxzaXplX3Q+KGlucHV0X2lkeCkgPAorICAgICAgICAgICAgICAgIHN1YmdyYXBoc19bc3ViZ3JhcGhfaWR4XS5pbnB1dHMuc2l6ZSgpKTsKKyAgY29uc3Qgc2l6ZV90IHRlbnNvcl9pZHggPSBzdWJncmFwaHNfW3N1YmdyYXBoX2lkeF0uaW5wdXRzW2lucHV0X2lkeF07CisgIHJldHVybiAmc3ViZ3JhcGhzX1tzdWJncmFwaF9pZHhdLnRlbnNvcnNbdGVuc29yX2lkeF07Cit9CisKK3NpemVfdCBNaWNyb0NvZGVnZW5Db250ZXh0OjpOdW1TdWJncmFwaE91dHB1dHMoaW50IHN1YmdyYXBoX2lkeCkgeworICBURkxJVEVfRENIRUNLKHN0YXRpY19jYXN0PHNpemVfdD4oc3ViZ3JhcGhfaWR4KSA8IHN1YmdyYXBoc18uc2l6ZSgpKTsKKyAgcmV0dXJuIHN1YmdyYXBoc19bc3ViZ3JhcGhfaWR4XS5vdXRwdXRzLnNpemUoKTsKK30KKworVGZMaXRlRXZhbFRlbnNvciogTWljcm9Db2RlZ2VuQ29udGV4dDo6R2V0U3ViZ3JhcGhPdXRwdXQoaW50IHN1YmdyYXBoX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRwdXRfaWR4KSB7CisgIFRGTElURV9EQ0hFQ0soc3RhdGljX2Nhc3Q8c2l6ZV90PihzdWJncmFwaF9pZHgpIDwgc3ViZ3JhcGhzXy5zaXplKCkpOworICBURkxJVEVfRENIRUNLKHN0YXRpY19jYXN0PHNpemVfdD4ob3V0cHV0X2lkeCkgPAorICAgICAgICAgICAgICAgIHN1YmdyYXBoc19bc3ViZ3JhcGhfaWR4XS5vdXRwdXRzLnNpemUoKSk7CisgIGNvbnN0IHNpemVfdCB0ZW5zb3JfaWR4ID0gc3ViZ3JhcGhzX1tzdWJncmFwaF9pZHhdLm91dHB1dHNbb3V0cHV0X2lkeF07CisgIHJldHVybiAmc3ViZ3JhcGhzX1tzdWJncmFwaF9pZHhdLnRlbnNvcnNbdGVuc29yX2lkeF07Cit9CisKK2ludCBNaWNyb0NvZGVnZW5Db250ZXh0OjpOdW1TdWJncmFwaHMoKSB7IHJldHVybiBzdWJncmFwaHNfLnNpemUoKTsgfQorCitNaWNyb1Jlc291cmNlVmFyaWFibGVzKiBNaWNyb0NvZGVnZW5Db250ZXh0OjpHZXRSZXNvdXJjZVZhcmlhYmxlcygpIHsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZmxpdGUKZGlmZiAtLWdpdCBhL2NvZGVnZW4vcnVudGltZS9taWNyb19jb2RlZ2VuX2NvbnRleHQuaCBiL2NvZGVnZW4vcnVudGltZS9taWNyb19jb2RlZ2VuX2NvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjkzYWQyCi0tLSAvZGV2L251bGwKKysrIGIvY29kZWdlbi9ydW50aW1lL21pY3JvX2NvZGVnZW5fY29udGV4dC5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaWZuZGVmIENPREVHRU5fUlVOVElNRV9NSUNST19DT0RFR0VOX0NPTlRFWFRfSF8KKyNkZWZpbmUgQ09ERUdFTl9SVU5USU1FX01JQ1JPX0NPREVHRU5fQ09OVEVYVF9IXworCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2MvY29tbW9uLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2NvbnRleHQuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fZ3JhcGguaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vc3Bhbi5oIgorCituYW1lc3BhY2UgdGZsaXRlIHsKKworc3RydWN0IFN1YmdyYXBoIHsKKyAgU3Bhbjxjb25zdCBzaXplX3Q+IGlucHV0czsKKyAgU3Bhbjxjb25zdCBzaXplX3Q+IG91dHB1dHM7CisgIFNwYW48VGZMaXRlTm9kZT4gbm9kZXM7CisgIFNwYW48VGZMaXRlRXZhbFRlbnNvcj4gdGVuc29yczsKKyAgVGZMaXRlU3RhdHVzICgqaW52b2tlKShUZkxpdGVDb250ZXh0KiwgU3BhbjxUZkxpdGVOb2RlPik7Cit9OworCitjbGFzcyBNaWNyb0NvZGVnZW5Db250ZXh0IDogcHVibGljIE1pY3JvQ29udGV4dCwgTWljcm9HcmFwaCB7CisgcHVibGljOgorICBNaWNyb0NvZGVnZW5Db250ZXh0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFNwYW48U3ViZ3JhcGg+IHN1YmdyYXBocyk7CisKKyAgfk1pY3JvQ29kZWdlbkNvbnRleHQoKSA9IGRlZmF1bHQ7CisKKyAgLy8gTWljcm9Db250ZXh0IEFQSQorICB2b2lkKiBBbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIoc2l6ZV90IGJ5dGVzKSBvdmVycmlkZTsKKyAgVGZMaXRlU3RhdHVzIFJlcXVlc3RTY3JhdGNoQnVmZmVySW5BcmVuYShzaXplX3QgYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBidWZmZXJfaWR4KSBvdmVycmlkZTsKKyAgdm9pZCogR2V0U2NyYXRjaEJ1ZmZlcihpbnQgYnVmZmVyX2lkeCkgb3ZlcnJpZGU7CisgIFRmTGl0ZVRlbnNvciogQWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKGludCB0ZW5zb3JfaWR4KSBvdmVycmlkZTsKKyAgdm9pZCBEZWFsbG9jYXRlVGVtcFRmTGl0ZVRlbnNvcihUZkxpdGVUZW5zb3IqIHRlbnNvcikgb3ZlcnJpZGU7CisgIHVpbnQ4X3QqIEFsbG9jYXRlVGVtcEJ1ZmZlcihzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWdubWVudCkgb3ZlcnJpZGU7CisgIHZvaWQgRGVhbGxvY2F0ZVRlbXBCdWZmZXIodWludDhfdCogYnVmZmVyKSBvdmVycmlkZTsKKyAgVGZMaXRlRXZhbFRlbnNvciogR2V0RXZhbFRlbnNvcihpbnQgdGVuc29yX2lkeCkgb3ZlcnJpZGU7CisgIFRmTGl0ZVN0YXR1cyBzZXRfZXh0ZXJuYWxfY29udGV4dCh2b2lkKiBleHRlcm5hbF9jb250ZXh0X3BheWxvYWQpIG92ZXJyaWRlOworICB2b2lkKiBleHRlcm5hbF9jb250ZXh0KCkgb3ZlcnJpZGU7CisgIE1pY3JvR3JhcGgmIGdyYXBoKCkgb3ZlcnJpZGU7CisKKyAgLy8gTWljcm9HcmFwaCBBUEkKKyAgVGZMaXRlU3RhdHVzIEludm9rZVN1YmdyYXBoKGludCBzdWJncmFwaF9pZHgpIG92ZXJyaWRlOworICBzaXplX3QgTnVtU3ViZ3JhcGhJbnB1dHMoaW50IHN1YmdyYXBoX2lkeCkgb3ZlcnJpZGU7CisgIFRmTGl0ZUV2YWxUZW5zb3IqIEdldFN1YmdyYXBoSW5wdXQoaW50IHN1YmdyYXBoX2lkeCwgaW50IGlucHV0X2lkeCkgb3ZlcnJpZGU7CisgIHNpemVfdCBOdW1TdWJncmFwaE91dHB1dHMoaW50IHN1YmdyYXBoX2lkeCkgb3ZlcnJpZGU7CisgIFRmTGl0ZUV2YWxUZW5zb3IqIEdldFN1YmdyYXBoT3V0cHV0KGludCBzdWJncmFwaF9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRwdXRfaWR4KSBvdmVycmlkZTsKKyAgaW50IE51bVN1YmdyYXBocygpIG92ZXJyaWRlOworICBNaWNyb1Jlc291cmNlVmFyaWFibGVzKiBHZXRSZXNvdXJjZVZhcmlhYmxlcygpIG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgVGZMaXRlQ29udGV4dCogY29udGV4dF87CisgIFNwYW48U3ViZ3JhcGg+IHN1YmdyYXBoc187CisgIHNpemVfdCBjdXJyZW50X3N1YmdyYXBoX2lkeF8gPSAwOworICB2b2lkKiBleHRlcm5hbF9jb250ZXh0X3BheWxvYWRfID0gbnVsbHB0cjsKKworICBURl9MSVRFX1JFTU9WRV9WSVJUVUFMX0RFTEVURQorfTsKKworfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQorCisjZW5kaWYgIC8vIENPREVHRU5fUlVOVElNRV9NSUNST19DT0RFR0VOX0NPTlRFWFRfSF8KZGlmZiAtLWdpdCBhL2NvZGVnZW4vdGVtcGxhdGVzL2luZmVyZW5jZS5jYy5tYWtvIGIvY29kZWdlbi90ZW1wbGF0ZXMvaW5mZXJlbmNlLmNjLm1ha28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I2ZTU5YQotLS0gL2Rldi9udWxsCisrKyBiL2NvZGVnZW4vdGVtcGxhdGVzL2luZmVyZW5jZS5jYy5tYWtvCkBAIC0wLDAgKzEsOTMgQEAKKy8qIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisvKiBBVVRPTUFUSUNBTExZIEdFTkVSQVRFRCBETyBOT1QgTU9ESUZZICovCisKKyNpbmNsdWRlICIke2hlYWRlcl9maWxlfSIKKworI2luY2x1ZGUgImNvZGVnZW4vcnVudGltZS9taWNyb19jb2RlZ2VuX2NvbnRleHQuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvYy9idWlsdGluX29wX2RhdGEuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvYy9jX2FwaV90eXBlcy5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9jL2NvbW1vbi5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL2NvbXBhdGliaWxpdHkuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9taWNyb19vcHMuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fY29tbW9uLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2NvbnRleHQuaCIKKworbmFtZXNwYWNlICR7bW9kZWxfbmFtZX0geworbmFtZXNwYWNlIHsKKy8vIFRPRE8ocmphc2NhbmkpOiBXZSBzaG91bGQgcHJvYmFibHkgc3BsaXQgb3V0IHRoZSBPcFRhYmxlIHRvIGEgc2VwYXJhdGUgZmlsZQorLy8gb25jZSB3ZSBzdGFydCBnZW5lcmF0aW5nIGZvciBtdWx0aXBsZSBtb2RlbHMuCitlbnVtIE9wQ29kZSB7CislIGZvciBvcF9jb2RlIGluIG9wX2NvZGVfdGFibGUub3BfY29kZXM6CisgICR7b3BfY29kZS5lbnVtX25hbWV9LAorJSBlbmRmb3IKKyAga0NvdW50Cit9OworCitURkxNSW5mZXJlbmNlUmVnaXN0cmF0aW9uIG9wX3RhYmxlW09wQ29kZTo6a0NvdW50XSA9IHsKKyUgZm9yIG9wX2NvZGUgaW4gb3BfY29kZV90YWJsZS5vcF9jb2RlczoKKyAgICAke29wX2NvZGUucmVnaXN0ZXJfZnVuY3Rpb259KCksCislIGVuZGZvcgorfTsKKworJSBmb3IgYnVmZmVyIGluIGdyYXBoLmJ1ZmZlcnM6Ciske2J1ZmZlci5nZW5lcmF0ZV9jX2J1ZmZlcl9hcnJheSgiIil9CislIGVuZGZvcgorJSBmb3Igc3ViZ3JhcGggaW4gZ3JhcGguc3ViZ3JhcGhzOgorJHtzdWJncmFwaC5nZW5lcmF0ZV9jX2lucHV0X2FycmF5KCIiKX0KKworJHtzdWJncmFwaC5nZW5lcmF0ZV9jX291dHB1dF9hcnJheSgiIil9CisKKyR7c3ViZ3JhcGguZ2VuZXJhdGVfY19ub2RlX2RhdGEoIiIpfQorCiske3N1YmdyYXBoLmdlbmVyYXRlX2NfdGVuc29yX2RhdGEoIiIpfQorJSBlbmRmb3IKKyUgaWYgZ3JhcGgubmVlZHNfemVyb19sZW5ndGhfaW50X2FycmF5OgorCitUZkxpdGVJbnRBcnJheSB6ZXJvX2xlbmd0aF9pbnRfYXJyYXkgPSB7fTsKKyUgZW5kaWYKKworJSBmb3Igc3ViZ3JhcGggaW4gZ3JhcGguc3ViZ3JhcGhzOgorJHtzdWJncmFwaC5nZW5lcmF0ZV9jX2ludm9rZSgiIil9CislIGVuZGZvcgorCit9ICAvLyBuYW1lc3BhY2UKKworTW9kZWw6Ok1vZGVsKCkKKyAgOiBzdWJncmFwaHNfeworJWZvciBzdWJncmFwaCBpbiBncmFwaC5zdWJncmFwaHM6Ciske3N1YmdyYXBoLmdlbmVyYXRlX2Nfc3ViZ3JhcGhfaW5pdCgiICAgICAgIil9CislZW5kZm9yCisgICAgfSwKKyAgICBtaWNyb19jb250ZXh0X3smY29udGV4dF8sIHsmc3ViZ3JhcGhzX1swXSwgJHtsZW4oZ3JhcGguc3ViZ3JhcGhzKX19fSB7CisgIGNvbnRleHRfLmltcGxfID0gc3RhdGljX2Nhc3Q8dm9pZCo+KCZtaWNyb19jb250ZXh0Xyk7CisgIGNvbnRleHRfLlJlcG9ydEVycm9yID0gbnVsbHB0cjsKKyAgY29udGV4dF8uR2V0VGVuc29yID0gbnVsbHB0cjsKKyAgY29udGV4dF8uR2V0RXZhbFRlbnNvciA9IHRmbGl0ZTo6TWljcm9Db250ZXh0R2V0RXZhbFRlbnNvcjsKKyAgY29udGV4dF8ucHJvZmlsZXIgPSBudWxscHRyOworICBjb250ZXh0Xy5HZXRFeHRlcm5hbENvbnRleHQgPSBudWxscHRyOworICBjb250ZXh0Xy5HZXRTY3JhdGNoQnVmZmVyID0gbnVsbHB0cjsKKworJSBmb3Igc3ViZ3JhcGggaW4gZ3JhcGguc3ViZ3JhcGhzOgorJHtzdWJncmFwaC5nZW5lcmF0ZV9jX25vZGVfaW5pdCgiICAiKX0KKworJHtzdWJncmFwaC5nZW5lcmF0ZV9jX3RlbnNvcl9pbml0KCIgICIpfQorJSBlbmRmb3IKK30KKworVGZMaXRlU3RhdHVzIE1vZGVsOjpJbnZva2UoKSB7IHJldHVybiBtaWNyb19jb250ZXh0Xy5JbnZva2VTdWJncmFwaCgwKTsgfQorCit9ICAvLyBuYW1lc3BhY2UgJHttb2RlbF9uYW1lfQpkaWZmIC0tZ2l0IGEvY29kZWdlbi90ZW1wbGF0ZXMvaW5mZXJlbmNlLmgubWFrbyBiL2NvZGVnZW4vdGVtcGxhdGVzL2luZmVyZW5jZS5oLm1ha28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFiNjRlMQotLS0gL2Rldi9udWxsCisrKyBiL2NvZGVnZW4vdGVtcGxhdGVzL2luZmVyZW5jZS5oLm1ha28KQEAgLTAsMCArMSw0NCBAQAorLyogQ29weXJpZ2h0IDIwMjMgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKy8qIEFVVE9NQVRJQ0FMTFkgR0VORVJBVEVEIERPIE5PVCBNT0RJRlkgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJjb2RlZ2VuL3J1bnRpbWUvbWljcm9fY29kZWdlbl9jb250ZXh0LmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2MvY19hcGlfdHlwZXMuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvYy9jb21tb24uaCIKKworbmFtZXNwYWNlICR7bW9kZWxfbmFtZX0geworCitjbGFzcyBNb2RlbCB7CisgcHVibGljOgorICBNb2RlbCgpOworCisgIFRmTGl0ZVN0YXR1cyBJbnZva2UoKTsKKworIHByaXZhdGU6CisgIFRmTGl0ZUNvbnRleHQgY29udGV4dF8gPSB7fTsKKyAgdGZsaXRlOjpTdWJncmFwaCBzdWJncmFwaHNfWyR7bGVuKGdyYXBoLnN1YmdyYXBocyl9XTsKKyAgdGZsaXRlOjpNaWNyb0NvZGVnZW5Db250ZXh0IG1pY3JvX2NvbnRleHRfOworJSBmb3Igc3ViZ3JhcGggaW4gZ3JhcGguc3ViZ3JhcGhzOgorICBUZkxpdGVOb2RlICR7c3ViZ3JhcGgubm9kZXNfYXJyYXl9WyR7bGVuKHN1YmdyYXBoLm9wZXJhdG9ycyl9XSA9IHt9OworJSBlbmRmb3IKKyUgZm9yIHN1YmdyYXBoIGluIGdyYXBoLnN1YmdyYXBoczoKKyAgVGZMaXRlRXZhbFRlbnNvciAke3N1YmdyYXBoLnRlbnNvcnNfYXJyYXl9WyR7bGVuKHN1YmdyYXBoLnRlbnNvcnMpfV0gPSB7fTsKKyUgZW5kZm9yCit9OworCit9ICAvLyBuYW1lc3BhY2UgJHttb2RlbF9uYW1lfQpkaWZmIC0tZ2l0IGEvY29kZWdlbi90ZW5zb3IucHkgYi9jb2RlZ2VuL3RlbnNvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzg3MGZjCi0tLSAvZGV2L251bGwKKysrIGIvY29kZWdlbi90ZW5zb3IucHkKQEAgLTAsMCArMSwxMjcgQEAKKyMgQ29weXJpZ2h0IDIwMjMgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisiIiIgVGVuc29yIGNsYXNzICIiIgorCitmcm9tIHR5cGluZyBpbXBvcnQgRGljdCwgT3B0aW9uYWwKK2ltcG9ydCBzdHJpbmcKK2ltcG9ydCB0ZXh0d3JhcAorCitmcm9tIHRmbGl0ZV9taWNyby5jb2RlZ2VuIGltcG9ydCB1dGlscworZnJvbSB0ZmxpdGVfbWljcm8udGVuc29yZmxvdy5saXRlLnB5dGhvbiBpbXBvcnQgc2NoZW1hX3B5X2dlbmVyYXRlZCBhcyBzY2hlbWFfZmIKKworX1RFTlNPUl9UWVBFUzogRGljdFtpbnQsIHN0cl0gPSB7CisgICAgc2NoZW1hX2ZiLlRlbnNvclR5cGUuRkxPQVQxNjogImtUZkxpdGVGbG9hdDE2IiwKKyAgICBzY2hlbWFfZmIuVGVuc29yVHlwZS5GTE9BVDMyOiAia1RmTGl0ZUZsb2F0MzIiLAorICAgIHNjaGVtYV9mYi5UZW5zb3JUeXBlLkZMT0FUNjQ6ICJrVGZMaXRlRmxvYXQ2NCIsCisgICAgc2NoZW1hX2ZiLlRlbnNvclR5cGUuSU5UMTY6ICJrVGZMaXRlSW50MTYiLAorICAgIHNjaGVtYV9mYi5UZW5zb3JUeXBlLlVJTlQxNjogImtUZkxpdGVVSW50MTYiLAorICAgIHNjaGVtYV9mYi5UZW5zb3JUeXBlLklOVDMyOiAia1RmTGl0ZUludDMyIiwKKyAgICBzY2hlbWFfZmIuVGVuc29yVHlwZS5VSU5UMzI6ICJrVGZMaXRlVUludDMyIiwKKyAgICBzY2hlbWFfZmIuVGVuc29yVHlwZS5VSU5UODogImtUZkxpdGVVSW50OCIsCisgICAgc2NoZW1hX2ZiLlRlbnNvclR5cGUuSU5UODogImtUZkxpdGVJbnQ4IiwKKyAgICBzY2hlbWFfZmIuVGVuc29yVHlwZS5JTlQ2NDogImtUZkxpdGVJbnQ2NCIsCisgICAgc2NoZW1hX2ZiLlRlbnNvclR5cGUuVUlOVDY0OiAia1RmTGl0ZVVJbnQ2NCIsCisgICAgc2NoZW1hX2ZiLlRlbnNvclR5cGUuU1RSSU5HOiAia1RmTGl0ZVN0cmluZyIsCisgICAgc2NoZW1hX2ZiLlRlbnNvclR5cGUuQk9PTDogImtUZkxpdGVCb29sIiwKKyAgICBzY2hlbWFfZmIuVGVuc29yVHlwZS5DT01QTEVYNjQ6ICJrVGZMaXRlQ29tcGxleDY0IiwKKyAgICBzY2hlbWFfZmIuVGVuc29yVHlwZS5DT01QTEVYMTI4OiAia1RmTGl0ZUNvbXBsZXgxMjgiLAorICAgIHNjaGVtYV9mYi5UZW5zb3JUeXBlLlJFU09VUkNFOiAia1RmTGl0ZVJlc291cmNlIiwKKyAgICBzY2hlbWFfZmIuVGVuc29yVHlwZS5WQVJJQU5UOiAia1RmTGl0ZVZhcmlhbnQiLAorICAgIHNjaGVtYV9mYi5UZW5zb3JUeXBlLklOVDQ6ICJrVGZMaXRlSW50NCIsCit9CisKKworY2xhc3MgQnVmZmVyKG9iamVjdCk6CisgICIiIiBUaGlzIGJ1ZmZlciBjb3VsZCBiZSBlaXRoZXIgYSBzdGF0aWMgYXJyYXkgb3IgYSBwb2ludGVyIGludG8gdGhlIGFyZW5hICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBidWZmZXJfbmFtZTogc3RyLCBidWZmZXI6IHNjaGVtYV9mYi5CdWZmZXJUKToKKyAgICAjIFRPRE8ocmphc2NhbmkpOiBHZXQgYXJlbmEgYWxsb2NhdGlvbiBvZmZzZXRzIGZyb20gcHJlcHJvY2Vzc29yCisgICAgc2VsZi5fYnVmZmVyX25hbWUgPSBidWZmZXJfbmFtZQorICAgIHNlbGYuX2J1ZmZlciA9IGJ1ZmZlcgorCisgIEBwcm9wZXJ0eQorICBkZWYgYWRkcmVzcyhzZWxmKSAtPiBzdHI6CisgICAgaWYgc2VsZi5fYnVmZmVyIGlzIE5vbmUgb3Igc2VsZi5fYnVmZmVyLmRhdGEgaXMgTm9uZToKKyAgICAgICMgVE9ETyhyamFzY2FuaSk6IFRoaXMgbmVlZHMgdG8gcG9pbnQgaW50byB0aGUgYXJlbmEKKyAgICAgIHJldHVybiBmIm51bGxwdHIgLyoge3NlbGYuX2J1ZmZlcl9uYW1lfSAqLyIKKyAgICByZXR1cm4gZiIme3NlbGYuX2J1ZmZlcl9uYW1lfSIKKworICBkZWYgZ2VuZXJhdGVfY19idWZmZXJfYXJyYXkoc2VsZiwgaW5kZW50OiBzdHIpIC0+IHN0cjoKKyAgICBpZiBzZWxmLl9idWZmZXIgaXMgTm9uZSBvciBzZWxmLl9idWZmZXIuZGF0YSBpcyBOb25lOgorICAgICAgcmV0dXJuIGYiLy8ge3NlbGYuX2J1ZmZlcl9uYW1lfSBpcyBsb2NhdGVkIGluIHRoZSBhcmVuYVxuIgorCisgICAgYnVmZmVyX3RlbXBsYXRlID0gc3RyaW5nLlRlbXBsYXRlKAorICAgICAgICAiYWxpZ25hcygxNikgdWludDhfdCAke2J1ZmZlcl9uYW1lfVske3NpemV9XSA9IHtcbiIKKyAgICAgICAgIiR7Ym9keX1cbiIKKyAgICAgICAgIn07XG4iKQorCisgICAgYnl0ZV9zdHJzID0gWycweHs6MDJYfScuZm9ybWF0KGIpIGZvciBiIGluIHNlbGYuX2J1ZmZlci5kYXRhXQorCisgICAgbGluZXMgPSBbXQorICAgIGZvciBieXRlX3N0cnNfZm9yX2xpbmUgaW4gdXRpbHMuc3BsaXRfaW50b19jaHVua3MoYnl0ZV9zdHJzLCAxMik6CisgICAgICBieXRlc19zZWdtZW50ID0gJywgJy5qb2luKGJ5dGVfc3Ryc19mb3JfbGluZSkKKyAgICAgIGxpbmVzLmFwcGVuZChmJyAgICB7Ynl0ZXNfc2VnbWVudH0sJykKKworICAgIHJldHVybiB0ZXh0d3JhcC5pbmRlbnQoCisgICAgICAgIGJ1ZmZlcl90ZW1wbGF0ZS5zdWJzdGl0dXRlKGJ1ZmZlcl9uYW1lPXNlbGYuX2J1ZmZlcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplPWxlbihzZWxmLl9idWZmZXIuZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHk9J1xuJy5qb2luKGxpbmVzKSksIGluZGVudCkKKworCitjbGFzcyBUZW5zb3Iob2JqZWN0KToKKworICBkZWYgX19pbml0X18oc2VsZiwgYnVmZmVyOiBCdWZmZXIsIHRlbnNvcjogc2NoZW1hX2ZiLlRlbnNvclQpOgorICAgIHNlbGYuX2J1ZmZlciA9IGJ1ZmZlcgorICAgIHNlbGYuX3RlbnNvcjogc2NoZW1hX2ZiLlRlbnNvclQgPSB0ZW5zb3IKKworICBAcHJvcGVydHkKKyAgZGVmIGJ1ZmZlcl9pbmRleChzZWxmKSAtPiBib29sOgorICAgIHJldHVybiBzZWxmLl90ZW5zb3IuYnVmZmVyCisKKyAgQHByb3BlcnR5CisgIGRlZiBidWZmZXIoc2VsZikgLT4gQnVmZmVyOgorICAgIHJldHVybiBzZWxmLl9idWZmZXIKKworICBAcHJvcGVydHkKKyAgZGVmIGhhc19zaGFwZShzZWxmKSAtPiBib29sOgorICAgIHJldHVybiBzZWxmLl90ZW5zb3Iuc2hhcGUgaXMgbm90IE5vbmUKKworICBAcHJvcGVydHkKKyAgZGVmIG5lZWRzX3plcm9fbGVuZ3RoX2ludF9hcnJheShzZWxmKSAtPiBib29sOgorICAgIHJldHVybiBub3Qgc2VsZi5oYXNfc2hhcGUKKworICBkZWYgZ2VuZXJhdGVfY190ZW5zb3JfZGltcyhzZWxmLCB0eXBlX25hbWU6IHN0ciwgdGVuc29yX25hbWU6IHN0cikgLT4gc3RyOgorICAgIGlmIG5vdCBzZWxmLmhhc19zaGFwZToKKyAgICAgIHJldHVybiBmIi8vIE5vIGRhdGEgZGltcyBuZWNlc3NhcnkgZm9yIHt0ZW5zb3JfbmFtZX0iCisgICAgcmV0dXJuIHV0aWxzLkludEFycmF5KHNlbGYuX3RlbnNvci5zaGFwZSkuZ2VuZXJhdGVfY19zdHJ1Y3QoCisgICAgICAgIHR5cGVfbmFtZSArICJEaW1zIiwgdGVuc29yX25hbWUgKyAiX2RpbXMiKQorCisgIGRlZiBnZW5lcmF0ZV9jX3RlbnNvcl9pbml0KHNlbGYsIHRmbGl0ZV90ZW5zb3JfbmFtZTogc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW5zb3JfbmFtZTogc3RyKSAtPiBzdHI6CisgICAgaW5pdF90ZW1wbGF0ZSA9IHN0cmluZy5UZW1wbGF0ZSgKKyAgICAgICAgIiR7dGZsaXRlX3RlbnNvcl9uYW1lfSA9IFRmTGl0ZUV2YWxUZW5zb3J7XG4iCisgICAgICAgICIgICAgLmRhdGEgPSB7LmRhdGEgPSBzdGF0aWNfY2FzdDx2b2lkKj4oJHtkYXRhfSl9LFxuIgorICAgICAgICAiICAgIC5kaW1zID0gJHtkaW1zfSxcbiIKKyAgICAgICAgIiAgICAudHlwZSA9ICR7dGZsaXRlX3R5cGV9fTsiKQorICAgIGRpbXMgPSAicmVpbnRlcnByZXRfY2FzdDxUZkxpdGVJbnRBcnJheSo+KCZ7fSkiLmZvcm1hdCgKKyAgICAgICAgZiJ7dGVuc29yX25hbWV9X2RpbXMiIGlmIHNlbGYuX3RlbnNvci4KKyAgICAgICAgc2hhcGUgaXMgbm90IE5vbmUgZWxzZSAiemVyb19sZW5ndGhfaW50X2FycmF5IikKKworICAgIHJldHVybiBpbml0X3RlbXBsYXRlLnN1YnN0aXR1dGUoCisgICAgICAgIHRmbGl0ZV90ZW5zb3JfbmFtZT10ZmxpdGVfdGVuc29yX25hbWUsCisgICAgICAgIHRlbnNvcl9uYW1lPXRlbnNvcl9uYW1lLAorICAgICAgICBkYXRhPXNlbGYuX2J1ZmZlci5hZGRyZXNzLAorICAgICAgICBkaW1zPWRpbXMsCisgICAgICAgIHRmbGl0ZV90eXBlPV9URU5TT1JfVFlQRVNbc2VsZi5fdGVuc29yLnR5cGVdKQpkaWZmIC0tZ2l0IGEvY29kZWdlbi91dGlscy5weSBiL2NvZGVnZW4vdXRpbHMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZjMzFjOAotLS0gL2Rldi9udWxsCisrKyBiL2NvZGVnZW4vdXRpbHMucHkKQEAgLTAsMCArMSwxMDEgQEAKKyMgQ29weXJpZ2h0IDIwMjMgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisiIiIgVXRpbGl0eSBmdW5jdGlvbnMgYW5kIGNsYXNzZXMgZm9yIGNvZGUgZ2VuZXJhdGlvbi4gIiIiCisKK2Zyb20gdHlwaW5nIGltcG9ydCBBbnksIEdlbmVyYXRvciwgSXRlcmFibGUsIExpc3QsIE9wdGlvbmFsLCBTZXF1ZW5jZSwgVHVwbGUKK2ltcG9ydCBzdHJpbmcKK2ltcG9ydCB0ZXh0d3JhcAoraW1wb3J0IGl0ZXJ0b29scworCisKK2RlZiB0b19wYXNjYWxfY2FzZShzOiBzdHIpIC0+IHN0cjoKKyAgIiIiIEJhc2ljIGZ1bmN0aW9uIGZvciBjb252ZXJ0aW5nIHNuYWtlX2Nhc2UgdG8gUGFzY2FsQ2FzZS4gIiIiCisgICMgVGhpcyBpc24ndCBwZXJmZWN0LCBhcyB0aGVyZSBtaWdodCBiZSBzb21lIGNhc2VzIHdoZXJlIHdlIHdhbnQgdW5kZXJzY29yZXMKKyAgIyB0byByZW1haW4gaWYgdGhleSBhcmUgdXNlZCBhcyBudW1iZXIgc2VwYXJhdG9ycy4KKyAgcmV0dXJuIHMudGl0bGUoKS5yZXBsYWNlKCdfJywgJycpCisKKworZGVmIGJvb2xfdG9fY19zdHIoYjogYm9vbCkgLT4gc3RyOgorICAiIiIgQ29udmVydCBhIHB5dGhvbiBib29sIHZhbHVlIHRvIGEgQyBib29sIHN0cmluZy4gSWUsIEZhbHNlIC0+ICdmYWxzZScgIiIiCisgIHJldHVybiBzdHIoYikubG93ZXIoKQorCisKK2RlZiBzcGxpdF9pbnRvX2NodW5rcygKKyAgICBkYXRhOiBJdGVyYWJsZVtBbnldLAorICAgIGNodW5rX3NpemU6IGludCkgLT4gR2VuZXJhdG9yW1R1cGxlW0FueSwgLi4uXSwgTm9uZSwgTm9uZV06CisgICIiIlNwbGl0cyBhbiBpdGVyYWJsZSBpbnRvIGNodW5rcyBvZiBhIGdpdmVuIHNpemUuIiIiCisgIGRhdGFfaXRlcmF0b3IgPSBpdGVyKGRhdGEpCisgIHdoaWxlIFRydWU6CisgICAgY2h1bmsgPSB0dXBsZShpdGVydG9vbHMuaXNsaWNlKGRhdGFfaXRlcmF0b3IsIGNodW5rX3NpemUpKQorICAgIGlmIG5vdCBjaHVuazoKKyAgICAgIGJyZWFrCisgICAgeWllbGQgY2h1bmsKKworCitkZWYgZ2VuZXJhdGVfY19pbnRfYXJyYXkoaW5kZW50OiBzdHIsIGludF90eXBlOiBzdHIsIG5hbWU6IHN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnRzOiBTZXF1ZW5jZVtpbnRdKSAtPiBzdHI6CisgIGludF9zdHJzID0gWyd7fScuZm9ybWF0KGkpIGZvciBpIGluIGludHNdCisKKyAgIyBUcnkgdG8gZG8gaXQgb24gYSBzaW5nbGUgbGluZSBmaXJzdAorICBzaW5nbGVfbGluZV9hcnJheV90ZW1wbGF0ZSA9IHN0cmluZy5UZW1wbGF0ZSgKKyAgICAgICJjb25zdGV4cHIgJHtpbnRfdHlwZX0gJHtuYW1lfVske3NpemV9XSA9IHske2RhdGF9fTsiKQorICBzaW5nbGVfbGluZSA9IHRleHR3cmFwLmluZGVudCgKKyAgICAgIHNpbmdsZV9saW5lX2FycmF5X3RlbXBsYXRlLnN1YnN0aXR1dGUoaW50X3R5cGU9aW50X3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1sZW4oaW50X3N0cnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhPScsICcuam9pbihpbnRfc3RycykpLCBpbmRlbnQpCisKKyAgaWYgbGVuKHNpbmdsZV9saW5lKSA8IDgxOgorICAgIHJldHVybiBzaW5nbGVfbGluZQorCisgICMgQ291bGRuJ3QgZml0LCBzbyBzcGxpdCBpdCBhY3Jvc3MgbXVsdGlwbGUgbGluZXMKKyAgbXVsdGlfbGluZV9hcnJheV90ZW1wbGF0ZSA9IHN0cmluZy5UZW1wbGF0ZSgKKyAgICAgICJjb25zdGV4cHIgJHtpbnRfdHlwZX0gJHtuYW1lfVske3NpemV9XSA9IHtcbiIKKyAgICAgICIke2JvZHl9XG4iCisgICAgICAifTtcbiIpCisKKyAgbGluZXMgPSBbXQorICBmb3IgaW50X3N0cnNfZm9yX2xpbmUgaW4gc3BsaXRfaW50b19jaHVua3MoaW50X3N0cnMsIDEyKToKKyAgICBpbnRzX3NlZ21lbnQgPSAnLCAnLmpvaW4oaW50X3N0cnNfZm9yX2xpbmUpCisgICAgbGluZXMuYXBwZW5kKGYnICAgIHtpbnRzX3NlZ21lbnR9LCcpCisKKyAgcmV0dXJuIHRleHR3cmFwLmluZGVudCgKKyAgICAgIG11bHRpX2xpbmVfYXJyYXlfdGVtcGxhdGUuc3Vic3RpdHV0ZShpbnRfdHlwZT1pbnRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1sZW4oaW50cyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9keT0nXG4nLmpvaW4obGluZXMpKSwgaW5kZW50KQorCisKK2NsYXNzIEludEFycmF5KG9iamVjdCk6CisgICIiIiBBIGhlbHBlciBjbGFzcyBmb3IgZ2VuZXJhdGluZyBpbnQgYXJyYXlzIHRoYXQgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSB0aGUKKyAgICAgIGJhY2tpbmcgc3RvcmFnZSBmb3IgYSBUZkxpdGVJbnRBcnJheS4gIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIGRhdGE6IExpc3RbaW50XSk6CisgICAgc2VsZi5fZGF0YSA9IGRhdGEKKworICBkZWYgZ2VuZXJhdGVfY19zdHJ1Y3Qoc2VsZiwgdHlwZV9uYW1lOiBzdHIsCisgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZV9uYW1lOiBPcHRpb25hbFtzdHJdKSAtPiBzdHI6CisgICAgc3RydWN0X3RlbXBsYXRlID0gc3RyaW5nLlRlbXBsYXRlKCJzdHJ1Y3QgJHt0eXBlX25hbWV9IHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgaW50IHNpemUgPSAke3NpemV9O1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBpbnQgZGF0YVske3NpemV9XSA9IHske2RhdGF9fTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn0iKQorICAgICMgVE9ETyhyamFzY2FuaSk6IE1ha2UgdGhpcyBwcmV0dHkgcHJpbnQgaW4gbXVsdGktbGluZSBjaHVua3MKKyAgICBpbnRfc3RycyA9IFsne30nLmZvcm1hdChpKSBmb3IgaSBpbiBzZWxmLl9kYXRhXQorICAgIGNfc3RydWN0X3N0ciA9IHN0cnVjdF90ZW1wbGF0ZS5zdWJzdGl0dXRlKHR5cGVfbmFtZT10eXBlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZT1sZW4oaW50X3N0cnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE9JywgJy5qb2luKGludF9zdHJzKSkKKyAgICBpZiB2YXJpYWJsZV9uYW1lOgorICAgICAgcmV0dXJuIGNfc3RydWN0X3N0ciArICIge307Ii5mb3JtYXQodmFyaWFibGVfbmFtZSkKKyAgICByZXR1cm4gY19zdHJ1Y3Rfc3RyICsgIjsiCmRpZmYgLS1naXQgYS9kZWJ1Z2dpbmdfb3V0cHV0Lm1kIGIvZGVidWdnaW5nX291dHB1dC5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWFhMTRlCi0tLSAvZGV2L251bGwKKysrIGIvZGVidWdnaW5nX291dHB1dC5tZApAQCAtMCwwICsxLDc2IEBACisjIEhvdyB0byBkZWJ1ZyBpbnZhbGlkIG91dHB1dAorCitUaGUgVEZMTSBkZWJ1Z2dpbmcgb3V0cHV0IHRvb2xzIGFsbG93IFRGTE0gdXNlcnMgdG8gZWFzaWx5IGRlYnVnIHRoZWlyIG1vZGVscworYnkgcHJvdmlkaW5nIGEgdG9vbCB0aGF0IHdpbGwgY29tcGFyZSB0aGUgaW50ZXJtZWRpYXRlICB2YWx1ZXMob3V0cHV0IG9mIGVhY2ggT1AvS2VybmVsKQorZnJvbSBhIG1vZGVsIHBvc3QgaW52b2tlIGJldHdlZW4gdGhlIFRGTE0gYW5kIFRmTGl0ZS4gQXMgd2VsbCBhcyBhIHdheSB0bworY29tcGFyZSBpbnRlcm1lZGlhdGUgdmFsdWVzIGJldHdlZW4gVEZMTSB4ODYgaW1wbGVtZW50YXRpb25zIGFuZCBPcHRpbWl6ZWQgCitJbXBsZW1lbnRhdGlvbnMuCisKKyMjIEhvdyB0byBkZWJ1ZyBURkxNIEludGVycHJldGVyIG91dHB1dCBvbiBlbWJlZGRlZCB0YXJnZXRzCisKK0ZpcnN0IHlvdSBjYWxsIGEgQysrIGJpbmFyeSB0aGF0IHRha2VzIGEgVGZMaXRlIG1vZGVsIGFuZCByZXR1cm5zIGEgZmlsZSB0aGF0IGhhcworcmFuZG9tIGlucHV0cyBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBvdXRwdXQgdmFsdWVzIGZvciBlYWNoIGxheWVyIG9mIHRoZSBtb2RlbAoraXQgd2FzIHByb3ZpZGVkLgorCitUaGUgc2Vjb25kIGlzIHlvdSBwcm92aWRlIGEgVGZMaXRlIG1vZGVsIGFuZCBmaWxlIG91dHB1dHRlZCBieSBDKysgYmluYXJ5IGFib3ZlCit0byBhICBweXRob24gc2NyaXB0LiBUaGUgc2NyaXB0IHJ1bnMgVEZMTSB4ODYgaW5mZXJlbmNlIGNvbXBhcmlzb24gdG8gdGhlIAorZXhwZWN0ZWQgb3V0cHV0LgorCisjIyBIb3cgdG8gZGVidWcgVEZMTSBQeXRob24gSW50ZXJwcmV0ZXIgb3V0cHV0CisKK1VzaW5nIGEgcHl0aG9uIHNjcmlwdCBtZW50aW9uZWQgaW4gdGhlIHNlY3Rpb24gYWJvdmUgd2hlbiBvbmx5IGEgVGZMaXRlIG1vZGVsIGlzCitwcm92aWRlZCBhcyBpbnB1dCwgdGhlIHNjcmlwdCBnZW5lcmF0ZXMgcmFuZG9tIGlucHV0IGFuZCBjb21wYXJlcyBURkxNIHZzIFRmTGl0ZQoraW5mZXJlbmNlIG91dHB1dHMgZm9yIGVhY2ggbGF5ZXIgb2YgdGhlIG1vZGVsLgorCisjIyBDKysgRXhwZWN0ZWQgTGF5ZXIgYnkgTGF5ZXIgT3V0cHV0IFRvb2wgb24gVEZMaXRlIE1pY3JvCisKK1RoaXMgQysrIGJpbmFyeSBhbGxvd3MgeW91IHRvIHBhc3MgaW4gYSBUZkxpdGUgbW9kZWwgYW5kIHJldHVybnMgYSBmbGF0YnVmZmVyCitmaWxlIHdpdGggaW5wdXQgYW5kIHRoZSBjb3JyZXNwb25kaW5nIG91dHB1dCB2YWx1ZXMgYXBwZW5kZWQgaW50byBpdCB0aGF0IGNhbiBiZQorcGFzc2VkIGludG8gYSBweXRob24gZGVidWdnaW5nIHRvb2wgd2hpY2ggY2FuIGNvbXBhcmUgdGhvc2UgZ29sZGVuIHZhbHVlcyB2cwordGhlIHg4NiBURkxNIHJlZmVyZW5jZSBrZXJuZWwgaW1wbGVtZW50YXRpb24uCisKK1RoZSBDKysgVG9vbC9iaW5hcnkgd2lsbCB3cml0ZSBhIGRlYnVnZ2luZyBmaWxlIHRvIHRoZSBwYXRoIHByb3ZpZGUgaW4KKzJuZCBhcmcgdXNpbmcgdGhlIHRmbGl0ZV9tb2RlbCBwcm92aWRlZCBpbiB0aGUgMXN0IGFyZy4KKworIyMjIyMgQ29tbWFuZCBiYXplbC9ibGF6ZToKKworYGBgCisgYmF6ZWwgcnVuIHRlbnNvcmZsb3cvbGl0ZS9taWNyby90b29sczpsYXllcl9jYyAtLSBcCisgICAgPC9wYXRoL3RvL2lucHV0X21vZGVsLnRmbGl0ZT4KKyAgIDwvcGF0aC90by9vdXRwdXQuZmlsZV9uYW1lPgorYGBgCisKKyMjIyMjIEhvdyB0byBCdWlsZCB1c2luZyBNYWtlZmlsZSA6CisKK2BgYAorbWFrZSAtZiB0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9NYWtlZmlsZSBsYXllcl9ieV9sYXllcl9vdXRwdXRfdG9vbCAtajI0CitgYGAKKworIyMgUHl0aG9uIExheWVyIGJ5IExheWVyIERlYnVnZ2luZyBUb29sIAorCitUaGUgUHl0aG9uIFRvb2wvU2NyaXB0IGNhbiBmaXJzdCBiZSB1c2VkIHRvIGNvbXBhcmUgVEZMTSB2cyBUZmxpdGUgb3V0cHV0cyBmb3IKK3JhbmRvbSBpbnB1dHMgYnkgb25seSBwcm92aWRpbmcgYSBUZkxpdGUgZmlsZS4KKworIyMjIyBUZkxpdGUgdnMgVEZMTSBjb21tYW5kOgorYGBgIAorIGJhemVsIHJ1biB0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHM6bGF5ZXJfYnlfbGF5ZXJfZGVidWdnZXIgLS0gXAorICAgIC0taW5wdXRfdGZsaXRlX2ZpbGU9PC9wYXRoL3RvL215X21vZGVsLnRmbGl0ZT4KK2BgYAorCitUaGUgUHl0aG9uIFRvb2wvU2NyaXB0IGNhbiBhbHNvIGJlIHVzZWQgdG8gY29tcGFyZSBURkxNJ3MgcHl0aG9uIHg4NiBvdXRwdXQKK3ZzIGV4cGVjdGVkIG91dHB1dCBwcm92aWRlZCBieSB0aGUgQysrIFRvb2wvYmluYXJ5LgorCisjIyMjIFRGTE0gdnMgRXhwZWN0ZWQgQ29tbWFuZDoKK2BgYCAKKyAgYmF6ZWwgcnVuIHRlbnNvcmZsb3cvbGl0ZS9taWNyby90b29sczpsYXllcl9ieV9sYXllcl9kZWJ1Z2dlciAtLSBcCisgICAgLS1pbnB1dF90ZmxpdGVfZmlsZT08L3BhdGgvdG8vbXlfbW9kZWwudGZsaXRlPiBcCisgICAgLS1sYXllcl9ieV9sYXllcl9kYXRhX2ZpbGU9PC9wYXRoL3RvL215X2RlYnVnX2ZsYXRidWZmZXJfZmlsZT4KK2BgYAorCisjIyMjIE9wdGlvbmFsIEZsYWdzOgorIGAgLS1wcmludF9kdW1wICBgCitXaGVuIHRoaXMgZmxhZyBpcyBzZXQsIGl0IHdpbGwgcHJpbnQgdGhlIFRGTE0gb3V0cHV0IGZvciBlYWNoIGxheWVyIHRoYXQgaXMKK2NvbXBhcmVkLgorCisgYCAtLXJuZ2AKK0ludGVnZXIgcmFuZG9tIG51bWJlciBzZWVkIGZvciBnZW5lcmF0aW5nIGlucHV0IGRhdGEgZm9yIGNvbXBhcmlzb25zIGFnYWluc3QgVEZMaXRlLiAoRGVmYXVsdDogNDIpCmRpZmYgLS1naXQgYS9weXRob24vdGZsaXRlX21pY3JvL0JVSUxEIGIvcHl0aG9uL3RmbGl0ZV9taWNyby9CVUlMRAppbmRleCA2ODMyMWZkLi4yODJlOWRiIDEwMDY0NAotLS0gYS9weXRob24vdGZsaXRlX21pY3JvL0JVSUxECisrKyBiL3B5dGhvbi90ZmxpdGVfbWljcm8vQlVJTEQKQEAgLTEsNSArMSw4IEBACitsb2FkKCJAYmF6ZWxfc2t5bGliLy9ydWxlczpjb21tb25fc2V0dGluZ3MuYnpsIiwgInN0cmluZ19mbGFnIikKK2xvYWQoIkBydWxlc19weXRob24vL3B5dGhvbjpkZWZzLmJ6bCIsICJweV9saWJyYXJ5IiwgInB5X3Rlc3QiKQogbG9hZCgiQHB5YmluZDExX2JhemVsLy86YnVpbGRfZGVmcy5iemwiLCAicHliaW5kX2V4dGVuc2lvbiIpCiBsb2FkKCIvL3B5dGhvbjpweV9uYW1lc3BhY2UuYnpsIiwgInB5X25hbWVzcGFjZSIpCitsb2FkKCIvL3Rvb2xzOmV4cGFuZF9zdGFtcF92YXJzLmJ6bCIsICJleHBhbmRfc3RhbXBfdmFycyIpCiBsb2FkKCJAcnVsZXNfcHl0aG9uLy9weXRob246cGFja2FnaW5nLmJ6bCIsICJweV9wYWNrYWdlIiwgInB5X3doZWVsIikKIGxvYWQoIkB0ZmxtX3BpcF9kZXBzLy86cmVxdWlyZW1lbnRzLmJ6bCIsICJyZXF1aXJlbWVudCIpCiBsb2FkKApAQCAtNzAsOSArNzMsNyBAQAogICAgIHNyY3MgPSBbCiAgICAgICAgICJydW50aW1lLnB5IiwKICAgICBdLAotICAgIGRhdGEgPSBbCi0gICAgICAgICI6X3J1bnRpbWUuc28iLAotICAgIF0sCisgICAgZGF0YSA9IFsiOl9ydW50aW1lLnNvIl0sCiAgICAgc3Jjc192ZXJzaW9uID0gIlBZMyIsCiAgICAgdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdLAogICAgIGRlcHMgPSBbCkBAIC05MSw5ICs5MiwxMCBAQAogICAgICAgICAibm91YnNhbiIsCiAgICAgXSwKICAgICBkZXBzID0gWwotICAgICAgICByZXF1aXJlbWVudCgibnVtcHkiKSwKLSAgICAgICAgcmVxdWlyZW1lbnQoInRlbnNvcmZsb3ctY3B1IiksCiAgICAgICAgICI6cnVudGltZSIsCisgICAgICAgIHJlcXVpcmVtZW50KCJudW1weSIpLAorICAgICAgICByZXF1aXJlbWVudCgidGVuc29yZmxvdyIpLAorICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvcmVjaXBlczphZGRfZm91cl9udW1iZXJzIiwKICAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvL3Rlc3Rpbmc6Z2VuZXJhdGVfdGVzdF9tb2RlbHNfbGliIiwKICAgICBdLAogKQpAQCAtMTA4LDYgKzExMCwxNCBAQAogICAgIF0sCiApCiAKKyMgR2VuZXJhdGUgYSB2ZXJzaW9uIGF0dHJpYnV0ZSwgaW1wb3J0ZWQgYXMgdGZsaXRlX21pY3JvLl9fdmVyc2lvbl9fLCB1c2luZworIyBzdGFtcCAoYS5rLmEuIHdvcmtzcGFjZSBzdGF0dXMpIHZhcmlhYmxlcy4KK2V4cGFuZF9zdGFtcF92YXJzKAorICAgIG5hbWUgPSAidmVyc2lvbiIsCisgICAgb3V0ID0gIl92ZXJzaW9uLnB5IiwKKyAgICB0ZW1wbGF0ZSA9ICJfdmVyc2lvbi5weS5pbiIsCispCisKICMgQ29sbGVjdCB0aGUgYGRlcHNgIGFuZCB0aGVpciB0cmFuc2l0aXZlIGRlcGVuZGVuY2VzIHRvZ2V0aGVyIGludG8gYSBzZXQgb2YKICMgZmlsZXMgdG8gcGFja2FnZS4gVGhlIGZpbGVzIHJldGFpbiB0aGVpciBmdWxsIHBhdGggcmVsYXRpdmUgdG8gdGhlIHdvcmtzcGFjZQogIyByb290LCB3aGljaCBkZXRlcm1pbmVzIHRoZSBzdWJwYWNrYWdlIHBhdGggYXQgd2hpY2ggdGhleSdyZSBsb2NhdGVkIHdpdGhpbgpAQCAtMTI4LDYgKzEzOCw3IEBACiAgICAgZGVwcyA9IFsKICAgICAgICAgIjpwb3N0aW5zdGFsbF9jaGVjayIsCiAgICAgICAgICI6cnVudGltZSIsCisgICAgICAgICI6dmVyc2lvbiIsCiAgICAgXSwKICkKIApAQCAtMTUwLDE2ICsxNjEsNzggQEAKICAgICBdLAogKQogCitleHBhbmRfc3RhbXBfdmFycygKKyAgICBuYW1lID0gImRlc2NyaXB0aW9uX2ZpbGUiLAorICAgIG91dCA9ICJSRUFETUUucHlwaS5tZCIsCisgICAgdGVtcGxhdGUgPSAiUkVBRE1FLnB5cGkubWQuaW4iLAorKQorCisjIEJ1aWxkaW5nIHRoZSA6d2hsIG9yIGl0cyBkZXNjZW5kYW50cyByZXF1aXJlcyB0aGUgZm9sbG93aW5nIGJ1aWxkIHNldHRpbmcgdG8KKyMgc3VwcGx5IHRoZSBQeXRob24gY29tcGF0aWJpbGl0eSB0YWdzIGZvciB0aGUgd2hlZWwgbWV0YWRhdGEuCitzdHJpbmdfZmxhZygKKyAgICBuYW1lID0gImNvbXBhdGliaWxpdHlfdGFnIiwKKyAgICBidWlsZF9zZXR0aW5nX2RlZmF1bHQgPSAibG9jYWwiLAorICAgIHZhbHVlcyA9IFsKKyAgICAgICAgImNwMzEwX2NwMzEwX21hbnlsaW51eF8yXzI4X3g4Nl82NCIsCisgICAgICAgICJjcDMxMV9jcDMxMV9tYW55bGludXhfMl8yOF94ODZfNjQiLAorICAgICAgICAibG9jYWwiLAorICAgIF0sCispCisKK2NvbmZpZ19zZXR0aW5nKAorICAgIG5hbWUgPSAiY3AzMTBfY3AzMTBfbWFueWxpbnV4XzJfMjhfeDg2XzY0IiwKKyAgICBmbGFnX3ZhbHVlcyA9IHsKKyAgICAgICAgIjpjb21wYXRpYmlsaXR5X3RhZyI6ICJjcDMxMF9jcDMxMF9tYW55bGludXhfMl8yOF94ODZfNjQiLAorICAgIH0sCispCisKK2NvbmZpZ19zZXR0aW5nKAorICAgIG5hbWUgPSAiY3AzMTFfY3AzMTFfbWFueWxpbnV4XzJfMjhfeDg2XzY0IiwKKyAgICBmbGFnX3ZhbHVlcyA9IHsKKyAgICAgICAgIjpjb21wYXRpYmlsaXR5X3RhZyI6ICJjcDMxMV9jcDMxMV9tYW55bGludXhfMl8yOF94ODZfNjQiLAorICAgIH0sCispCisKK2NvbmZpZ19zZXR0aW5nKAorICAgIG5hbWUgPSAibG9jYWwiLAorICAgIGZsYWdfdmFsdWVzID0geworICAgICAgICAiOmNvbXBhdGliaWxpdHlfdGFnIjogImxvY2FsIiwKKyAgICB9LAorKQorCiBweV93aGVlbCgKICAgICBuYW1lID0gIndobCIsCisgICAgIyBUaGlzIG1hY3JvIHlpZWxkcyBhZGRpdGlvbmFsIHRhcmdldHM6CisgICAgIworICAgICMgLSB3aGwuZGlzdDogYnVpbGQgYSBwcm9wZXJseSBuYW1lZCBmaWxlIHVuZGVyIHdobF9kaXN0LworICAgICMKKyAgICBhYmkgPSBzZWxlY3QoeworICAgICAgICAiOmNwMzEwX2NwMzEwX21hbnlsaW51eF8yXzI4X3g4Nl82NCI6ICJjcDMxMCIsCisgICAgICAgICI6Y3AzMTFfY3AzMTFfbWFueWxpbnV4XzJfMjhfeDg2XzY0IjogImNwMzExIiwKKyAgICAgICAgIjpsb2NhbCI6ICJub25lIiwKKyAgICB9KSwKKyAgICBkZXNjcmlwdGlvbl9maWxlID0gIjpkZXNjcmlwdGlvbl9maWxlIiwKICAgICBkaXN0cmlidXRpb24gPSAidGZsaXRlX21pY3JvIiwKKyAgICBwbGF0Zm9ybSA9IHNlbGVjdCh7CisgICAgICAgICI6Y3AzMTBfY3AzMTBfbWFueWxpbnV4XzJfMjhfeDg2XzY0IjogIm1hbnlsaW51eF8yXzI4X3g4Nl82NCIsCisgICAgICAgICI6Y3AzMTFfY3AzMTFfbWFueWxpbnV4XzJfMjhfeDg2XzY0IjogIm1hbnlsaW51eF8yXzI4X3g4Nl82NCIsCisgICAgICAgICI6bG9jYWwiOiAiYW55IiwKKyAgICB9KSwKKyAgICBweXRob25fdGFnID0gc2VsZWN0KHsKKyAgICAgICAgIjpjcDMxMF9jcDMxMF9tYW55bGludXhfMl8yOF94ODZfNjQiOiAiY3AzMTAiLAorICAgICAgICAiOmNwMzExX2NwMzExX21hbnlsaW51eF8yXzI4X3g4Nl82NCI6ICJjcDMxMSIsCisgICAgICAgICI6bG9jYWwiOiAicHkzIiwKKyAgICB9KSwKICAgICByZXF1aXJlcyA9IFsKICAgICAgICAgImZsYXRidWZmZXJzIiwKICAgICAgICAgIm51bXB5IiwKICAgICAgICAgInRlbnNvcmZsb3ciLAogICAgIF0sCisgICAgc3RhbXAgPSAxLCAgIyAxID09IGFsd2F5cyBzdGFtcAogICAgIHN0cmlwX3BhdGhfcHJlZml4ZXMgPSBbcGFja2FnZV9uYW1lKCldLAotICAgIHZlcnNpb24gPSAiMC4xLjAiLAorICAgIHN1bW1hcnkgPSAiVGVuc29yRmxvdyBMaXRlIGZvciBNaWNyb2NvbnRyb2xsZXJzIiwKKyAgICB0d2luZSA9ICJAdGZsbV9waXBfZGVwc190d2luZS8vOnBrZyIsCisgICAgdmVyc2lvbiA9ICJ7QlVJTERfRU1CRURfTEFCRUx9LmRldntTVEFCTEVfR0lUX0NPTU1JVF9USU1FfSIsCiAgICAgZGVwcyA9IFsKICAgICAgICAgIjpuYW1lc3BhY2UiLAogICAgIF0sCkBAIC0xNzYsNCArMjQ5LDcgQEAKICAgICBkYXRhID0gWwogICAgICAgICAiOndobCIsCiAgICAgXSwKKyAgICB0YWdzID0gWworICAgICAgICAibm90YXAiLCAgIyBTZWUgaHR0cDovL2IvMjk0Mjc4NjUwI2NvbW1lbnQ0IGZvciBtb3JlIGRldGFpbHMuCisgICAgXSwKICkKZGlmZiAtLWdpdCBhL3B5dGhvbi90ZmxpdGVfbWljcm8vUkVBRE1FLm1kIGIvcHl0aG9uL3RmbGl0ZV9taWNyby9SRUFETUUubWQKaW5kZXggY2Y1ZjYzOC4uOTI3NzA1ZiAxMDA2NDQKLS0tIGEvcHl0aG9uL3RmbGl0ZV9taWNyby9SRUFETUUubWQKKysrIGIvcHl0aG9uL3RmbGl0ZV9taWNyby9SRUFETUUubWQKQEAgLTEsMjUgKzEsMTI3IEBACi0jIFRGTE0gUHl0aG9uIEludGVycHJldGVyCisjIFRoZSBgdGZsaXRlX21pY3JvYCBQeXRob24gUGFja2FnZQogCi1UaGUgVEZMTSBpbnRlcnByZXRlciBjYW4gYmUgaW52b2tlZCBmcm9tIFB5dGhvbiBieSB1c2luZyB0aGUgUHl0aG9uIGludGVycHJldGVyCi13cmFwcGVyIGluIHRoaXMgZGlyZWN0b3J5LgorVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIGB0ZmxpdGVfbWljcm9gIFB5dGhvbiBwYWNrYWdlLiBUaGUgZm9sbG93aW5nIGlzCittYWlubHkgZG9jdW1lbnRhdGlvbiBmb3IgaXRzIGRldmVsb3BlcnMuCiAKLSMjIFVzYWdlCitUaGUgYHRmbGl0ZV9taWNyb2AgcGFja2FnZSBjb250YWlucyBhIGNvbXBsZXRlIFRGTE0gaW50ZXJwcmV0ZXIgYnVpbHQgYXMgYQorQ1B5dGhvbiBleHRlbnNpb24gbW9kdWxlLiBUaGUgYnVpbGQgb2Ygc2ltcGxlIFB5dGhvbiBwYWNrYWdlcyBtYXkgYmUgZHJpdmVuIGJ5CitzdGFuZGFyZCBQeXRob24gcGFja2FnZSBidWlsZGVycyBzdWNoIGFzIGBidWlsZGAsIGBzZXR1cHRvb2xzYCwgYW5kIGBmbGl0YDsKK2hvd2V2ZXIsIGFzIFRGTE0gaXMgZmlyc3QgYW5kIGZvcmVtb3N0IGEgbGFyZ2UgQy9DKysgcHJvamVjdCwgYHRmbGl0ZV9taWNyb2AncworYnVpbGQgaXMgaW5zdGVhZCBkcml2ZW4gYnkgaXRzIEMvQysrIGJ1aWxkIHN5c3RlbSBCYXplbC4KIAotVGhlcmUgYXJlIHR3byB3YXlzIHRvIGltcG9ydCB0aGUgUHl0aG9uIHdyYXBwZXIsIGVpdGhlciBieSB1c2luZyBCYXplbC9CbGF6ZSwgb3IKLWluIG5lYXIgZnV0dXJlIGJ5IGluc3RhbGxpbmcgYSBQeVBpIHBhY2thZ2UuCisjIyBCdWlsZGluZyBhbmQgaW5zdGFsbGluZyBsb2NhbGx5CiAKLSMjIyBCYXplbAorIyMjIEJ1aWxkaW5nCiAKLSMjIyMgQnVpbGQKK1RoZSBCYXplbCB0YXJnZXQgYC8vcHl0aG9uL3RmbGl0ZV9taWNybzp3aGwuZGlzdGAgYnVpbGRzIGEgYHRmbGl0ZV9taWNyb2AKK1B5dGhvbiAqLndobCogdW5kZXIgdGhlIG91dHB1dCBkaXJlY3RvcnkgYGJhemVsLWJpbi9weXRob24vdGZsaXRlX21pY3JvL3dobF9kaXN0YC4gRm9yIGV4YW1wbGU6CitgYGAKKyUgYmF6ZWwgYnVpbGQgLy9weXRob24vdGZsaXRlX21pY3JvOndobC5kaXN0CisuLi4uCitUYXJnZXQgLy9weXRob24vdGZsaXRlX21pY3JvOndobC5kaXN0IHVwLXRvLWRhdGU6CisgIGJhemVsLWJpbi9weXRob24vdGZsaXRlX21pY3JvL3dobF9kaXN0CisKKyUgdHJlZSBiYXplbC1iaW4vcHl0aG9uL3RmbGl0ZV9taWNyby93aGxfZGlzdAorYmF6ZWwtYmluL3B5dGhvbi90ZmxpdGVfbWljcm8vd2hsX2Rpc3QKK+KUlOKUgOKUgCB0ZmxpdGVfbWljcm8tMC5kZXYyMDIzMDkyMDE2MTYzOC1weTMtbm9uZS1hbnkud2hsCitgYGAKKworIyMjIEluc3RhbGxpbmcKKworSW5zdGFsbCB0aGUgcmVzdWx0aW5nICoud2hsKiB2aWEgcGlwLiBGb3IgZXhhbXBsZSwgaW4gYSBQeXRob24gdmlydHVhbAorZW52aXJvbm1lbnQ6CitgYGAKKyUgcHl0aG9uMyAtbSB2ZW52IH4vdG1wL3ZlbnYKKyUgc291cmNlIH4vdG1wL3ZlbnYvYmluL2FjdGl2YXRlCisodmVudikgJCBwaXAgaW5zdGFsbCBiYXplbC1iaW4vcHl0aG9uL3RmbGl0ZV9taWNyby93aGxfZGlzdC90ZmxpdGVfbWljcm8tMC5kZXYyMDIzMDkyMDE2MTYzOC1weTMtbm9uZS1hbnkud2hsCitQcm9jZXNzaW5nIC4vYmF6ZWwtYmluL3B5dGhvbi90ZmxpdGVfbWljcm8vd2hsX2Rpc3QvdGZsaXRlX21pY3JvLTAuZGV2MjAyMzA5MjAxNjE2MzgtcHkzLW5vbmUtYW55LndobAorLi4uLgorSW5zdGFsbGluZyBjb2xsZWN0ZWQgcGFja2FnZXM6IFsuLi4uXQorYGBgCisKK1RoZSBwYWNrYWdlIHNob3VsZCBub3cgYmUgaW1wb3J0YWJsZSBhbmQgdXNhYmxlLiBGb3IgZXhhbXBsZToKK2BgYAorKHZlbnYpICQgcHl0aG9uCitQeXRob24gMy4xMC4xMiAobWFpbiwgSnVuIDExIDIwMjMsIDA1OjI2OjI4KSBbR0NDIDExLjQuMF0gb24gbGludXgKK1R5cGUgImhlbHAiLCAiY29weXJpZ2h0IiwgImNyZWRpdHMiIG9yICJsaWNlbnNlIiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKz4+PiBpbXBvcnQgdGZsaXRlX21pY3JvCis+Pj4gdGZsaXRlX21pY3JvLnBvc3RpbnN0YWxsX2NoZWNrLnBhc3NlZCgpCitUcnVlCis+Pj4gIGkgPSB0ZmxpdGVfbWljcm8ucnVudGltZS5JbnRlcnByZXRlci5mcm9tX2ZpbGUoImZvby50ZmxpdGUiKQorPj4+ICMgZXRjLgorYGBgCisKKyMjIEJ1aWxkaW5nIGFuZCB1cGxvYWRpbmcgdG8gUHlQSQorCitUaGUgKi53aGwqIGdlbmVyYXRlZCBhYm92ZSBpcyB1bnN1aXRhYmxlIGZvciBkaXN0cmlidXRpb24gdG8gdGhlIHdpZGVyIHdvcmxkCit2aWEgUHlQSS4gVGhlIGV4dGVuc2lvbiBtb2R1bGUgaXMgaW5ldml0YWJseSBjb21waWxlZCBhZ2FpbnN0IGEgcGFydGljdWxhcgorUHl0aG9uIGltcGxlbWVudGF0aW9uIGFuZCBwbGF0Zm9ybSBDIGxpYnJhcnkuIFRoZSByZXN1bHRpbmcgcGFja2FnZSBpcyBvbmx5CitiaW5hcnktY29tcGF0aWJsZSB3aXRoIGEgc3lzdGVtIHJ1bm5pbmcgdGhlIHNhbWUgUHl0aG9uIGltcGxlbWVudGF0aW9uIGFuZCBhCitjb21wYXRpYmxlICh0eXBpY2FsbHkgdGhlIHNhbWUgb3IgbmV3ZXIpIEMgbGlicmFyeS4KKworVGhlIHNvbHV0aW9uIGlzIHRvIGRpc3RyaWJ1dGUgbXVsdGlwbGUgKi53aGwqcywgb25lIGJ1aWx0IGZvciBlYWNoIFB5dGhvbgoraW1wbGVtZW50YXRpb24gYW5kIHBsYXRmb3JtIGNvbWJpbmF0aW9uLiBURkxNIGFjY29tcGxpc2hlcyB0aGlzIGJ5IHJ1bm5pbmcKK0JhemVsIGJ1aWxkcyBmcm9tIHdpdGhpbiBtdWx0aXBsZSwgdW5pcXVlbHkgY29uZmlndXJlZCBEb2NrZXIgY29udGFpbmVycy4gVGhlCitpbWFnZXMgdXNlZCBhcmUgYmFzZWQgb24gc3RhbmRhcmRzLWNvbmZvcm1pbmcgaW1hZ2VzIHB1Ymxpc2hlZCBieSB0aGUgUHl0aG9uCitQYWNrYWdlIEF1dGhvcml0eSAoUHlQQSkgZm9yIGV4YWN0bHkgc3VjaCB1c2UuCisKK1B5dGhvbiAqLndobCpzIGNvbnRhaW4gbWV0YWRhdGEgdXNlZCBieSBpbnN0YWxsZXJzIHN1Y2ggYXMgYHBpcGAgdG8gZGV0ZXJtaW5lCit3aGljaCBkaXN0cmlidXRpb25zICgqLndobCpzKSBhcmUgY29tcGF0aWJsZSB3aXRoIHRoZSB0YXJnZXQgcGxhdGZvcm0uIFNlZSB0aGUgUHlQQQorc3BlY2lmaWNhdGlvbiBmb3IgW3BsYXRmb3JtIGNvbXBhdGliaWxpdHkKK3RhZ3NdKGh0dHBzOi8vcGFja2FnaW5nLnB5dGhvbi5vcmcvZW4vbGF0ZXN0L3NwZWNpZmljYXRpb25zL3BsYXRmb3JtLWNvbXBhdGliaWxpdHktdGFncy8pLgorCisjIyMgQnVpbGRpbmcKKworSW4gYW4gZW52aXJvbm1lbnQgd2l0aCBhIHdvcmtpbmcgRG9ja2VyIGluc3RhbGxhdGlvbiwgcnVuIHRoZSBzY3JpcHQKK2BweXRob24vdGZsaXRlX21pY3JvL3B5cGlfYnVpbGQuc2ggPHB5dGhvbi10YWc+YCBvbmNlIGZvciBlYWNoIHRhZy4gVGhlCitzY3JpcHQncyBvbmxpbmUgaGVscCAoYC0taGVscGApIGxpc3RzIHRoZSBhdmFpbGFibGUgdGFncy4gVGhlIHNjcmlwdCBidWlsZHMgYW4KK2FwcHJvcHJpYXRlIERvY2tlciBjb250YWluZXIgYW5kIGludm9rZXMgYSBCYXplbCBidWlsZCBhbmQgdGVzdCB3aXRoaW4gaXQuCitGb3IgZXhhbXBsZToKK2BgYAorJSBweXRob24vdGZsaXRlX21pY3JvL3B5cGlfYnVpbGQuc2ggY3AzMTAKK1srXSBCdWlsZGluZyAyLjZzICg3LzcpIEZJTklTSEVECis9PiB3cml0aW5nIGltYWdlIHNoYTI1Njo5MDA3MDRkYWQ3ZmEyNzkzOGRjYzFjNTA1N2MwZTc2MGZiNGFiMGRmZjY3NjQxNTE4MjQ1NWFlNjY1NDZiYmQ0CitiYXplbCBidWlsZCAvL3B5dGhvbi90ZmxpdGVfbWljcm86d2hsLmRpc3QgXAorICAgIC0tLy9weXRob24vdGZsaXRlX21pY3JvOmNvbXBhdGliaWxpdHlfdGFnPWNwMzEwX2NwMzEwX21hbnlsaW51eF8yXzI4X3g4Nl82NAorYmF6ZWwgdGVzdCAvL3B5dGhvbi90ZmxpdGVfbWljcm86d2hsX3Rlc3QgXAorICAgIC0tLy9weXRob24vdGZsaXRlX21pY3JvOmNvbXBhdGliaWxpdHlfdGFnPWNwMzEwX2NwMzEwX21hbnlsaW51eF8yXzI4X3g4Nl82NAorLy9weXRob24vdGZsaXRlX21pY3JvOndobF90ZXN0CitFeGVjdXRlZCAxIG91dCBvZiAxIHRlc3Q6IDEgdGVzdCBwYXNzZXMuCitPdXRwdXQ6CitiYXplbC1weXBpLW91dC90ZmxpdGVfbWljcm8tMC5kZXYyMDIzMDkyMDAzMTMxMC1jcDMxMC1jcDMxMC1tYW55bGludXhfMl8yOF94ODZfNjQud2hsCitgYGAKKworQnkgZGVmYXVsdCwgKi53aGwqcyBhcmUgZ2VuZXJhdGVkIHVuZGVyIHRoZSBvdXRwdXQgZGlyZWN0b3J5IGBiYXplbC1weXBpLW91dC9gLgorCisjIyMgVXBsb2FkaW5nIHRvIFB5UEkKKworVXBsb2FkIHRoZSBnZW5lcmF0ZWQgKi53aGwqcyB0byBQeVBJIHdpdGggdGhlIHNjcmlwdAorYHB5dGhvbi90ZmxpdGVfbWljcm8vcHlwaV91cGxvYWQuc2hgLiBUaGlzIHNjcmlwdCBsaWdodGx5IHdyYXBzIHRoZSBzdGFuZGFyZAordXBsb2FkIHRvb2wgYHR3aW5lYC4gQSBQeVBJIGF1dGhlbnRpY2F0aW9uIHRva2VuIG11c3QgYmUgYXNzaWduZWQgdG8KK2BUV0lORV9QQVNTV09SRGAgaW4gdGhlIGVudmlyb25tZW50LiBGb3IgZXhhbXBsZToKK2BgYAorJSBleHBvcnQgVFdJTkVfUEFTU1dPUkQ9cHlwaS1BZ0VOZEdWWy4uLi5dCislIC4vcHl0aG9uL3RmbGl0ZV9taWNyby9weXBpX3VwbG9hZC5zaCAtLXRlc3QtcHlwaSBiYXplbC1weXBpLW91dC90ZmxpdGVfbWljcm8tKi53aGwKK1VwbG9hZGluZyBkaXN0cmlidXRpb25zIHRvIGh0dHBzOi8vdGVzdC5weXBpLm9yZy9sZWdhY3kvCitVcGxvYWRpbmcgdGZsaXRlX21pY3JvLTAuZGV2MjAyMzA5MjAwMzEzMTAtY3AzMTAtY3AzMTAtbWFueWxpbnV4XzJfMjhfeDg2XzY0LndobAorVXBsb2FkaW5nIHRmbGl0ZV9taWNyby0wLmRldjIwMjMwOTIwMDMxMzEwLWNwMzExLWNwMzExLW1hbnlsaW51eF8yXzI4X3g4Nl82NC53aGwKK1ZpZXcgYXQ6CitodHRwczovL3Rlc3QucHlwaS5vcmcvcHJvamVjdC90ZmxpdGUtbWljcm8vMC5kZXYyMDIzMDkyMDAzMTMxMC8KK2BgYAorCitTZWUgdGhlIHNjcmlwdCdzIG9ubGluZSBoZWxwIChgLS1oZWxwYCkgZm9yIG1vcmUuCisKKyMjIFVzaW5nIGB0ZmxpdGVfbWljcm9gIGZyb20gd2l0aGluIHRoZSBURkxNIHNvdXJjZSB0cmVlCisKKzpjb25zdHJ1Y3Rpb246CisqVGhlIHJlbWFpbmRlciBvZiB0aGlzIGRvY3VtZW50IGlzIHVuZGVyIGNvbnN0cnVjdGlvbiBhbmQgbWF5IGNvbnRhaW4gc29tZQorb2Jzb2xldGUgaW5mb3JtYXRpb24uKgorOmNvbnN0cnVjdGlvbjoKIAogVGhlIG9ubHkgcGFja2FnZSB0aGF0IG5lZWRzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBgQlVJTERgIGZpbGUgaXMKIGAvL3B5dGhvbi90ZmxpdGVfbWljcm86cnVudGltZWAuIEl0IGNvbnRhaW5zIGFsbAogdGhlIGNvcnJlY3QgZGVwZW5kZW5jaWVzIHRvIGJ1aWxkIHRoZSBQeXRob24gaW50ZXJwcmV0ZXIuCiAKLSMjIyBQeVBpCi0KLVdvcmsgaW4gcHJvZ3Jlc3MuCi0KICMjIyBFeGFtcGxlcwogCiBEZXBlbmRpbmcgb24gdGhlIHdvcmtmbG93LCB0aGUgcGFja2FnZSBpbXBvcnQgcGF0aCBtYXkgYmUgc2xpZ2h0bHkgZGlmZmVyZW50LgpAQCAtNTUsNyArMTU3LDcgQEAKIHByaW50KHRmbG1faW50ZXJwcmV0ZXIuZ2V0X291dHB1dF9kZXRhaWxzKDApKQogYGBgCiAKLSMjIFRlY2huaWNhbCBEZXRhaWxzCisjIyMgVGVjaG5pY2FsIERldGFpbHMKIAogVGhlIFB5dGhvbiBpbnRlcnByZXRlciB1c2VzIFtweWJpbmQxMV0oaHR0cHM6Ly9naXRodWIuY29tL3B5YmluZC9weWJpbmQxMSkgdG8KIGV4cG9zZSBhbiBldm9sdmluZyBzZXQgb2YgQysrIEFQSXMuIFRoZSBCYXplbCBidWlsZCBsZXZlcmFnZXMgdGhlCkBAIC02NCw3ICsxNjYsNyBAQAogVGhlIG1vc3QgdXBkYXRlZCBQeXRob24gQVBJcyBjYW4gYmUgZm91bmQgaW4KIGBweXRob24vdGZsaXRlX21pY3JvL3J1bnRpbWUucHlgLgogCi0jIyBDdXN0b20gT3BzCisjIyMgQ3VzdG9tIE9wcwogCiBUaGUgUHl0aG9uIGludGVycHJldGVyIHdvcmtzIHdpdGggbW9kZWxzIHdpdGgKIFtjdXN0b20gb3BzXShodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9saXRlL2d1aWRlL29wc19jdXN0b20pIGJ1dCBzcGVjaWFsIHN0ZXBzCkBAIC0xMjYsNyArMjI4LDcgQEAKIHByb3Blcmx5IGluY2x1ZGVkIGluIFRGTE0ncyBvcCByZXNvbHZlci4gVGhpcyBhcHByb2FjaCBpcyB2ZXJ5IHNpbWlsYXIgdG8KIFRGTGl0ZSdzIGN1c3RvbSBvcCBzdXBwb3J0LgogCi0jIyBQcmludCBBbGxvY2F0aW9ucworIyMjIFByaW50IEFsbG9jYXRpb25zCiAKIFRoZSBQeXRob24gaW50ZXJwcmV0ZXIgY2FuIGFsc28gYmUgdXNlZCB0byBwcmludCBtZW1vcnkgYXJlbmEgYWxsb2NhdGlvbnMuIFRoaXMKIGlzIHZlcnkgaGVscGZ1bCB0byBmaWd1cmUgb3V0IGFjdHVhbCBtZW1vcnkgYXJlbmEgdXNhZ2UuCmRpZmYgLS1naXQgYS9weXRob24vdGZsaXRlX21pY3JvL1JFQURNRS5weXBpLm1kLmluIGIvcHl0aG9uL3RmbGl0ZV9taWNyby9SRUFETUUucHlwaS5tZC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDQzNTZlCi0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL3RmbGl0ZV9taWNyby9SRUFETUUucHlwaS5tZC5pbgpAQCAtMCwwICsxLDUgQEAKKyMgVGVuc29yRmxvdyBMaXRlIGZvciBNaWNyb2NvbnRyb2xsZXJzCisKK1RoaXMgcGFja2FnZSBpcyBidWlsdCBmcm9tIGNvbW1pdAorW3tTVEFCTEVfR0lUX0hBU0h9XShodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmxpdGUtbWljcm8vYmxvYi97U1RBQkxFX0dJVF9IQVNIfS9weXRob24vdGZsaXRlX21pY3JvKQorb2YgW2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmxpdGUtbWljcm9dKGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmbGl0ZS1taWNybykuCmRpZmYgLS1naXQgYS9weXRob24vdGZsaXRlX21pY3JvL19faW5pdF9fLnB5IGIvcHl0aG9uL3RmbGl0ZV9taWNyby9fX2luaXRfXy5weQppbmRleCA5NDAyODljLi45ZjE1MjEzIDEwMDY0NAotLS0gYS9weXRob24vdGZsaXRlX21pY3JvL19faW5pdF9fLnB5CisrKyBiL3B5dGhvbi90ZmxpdGVfbWljcm8vX19pbml0X18ucHkKQEAgLTExLDYgKzExLDcgQEAKICMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjIC0tLS0KIAogIyBEZWZpbmUgYSBwdWJsaWMgQVBJIGZvciB0aGUgcGFja2FnZSBieSBwcm92aWRpbmcgYWxpYXNlcyBmb3IgbW9kdWxlcyB3aGljaAogIyBhcmUgb3RoZXJ3aXNlIGRlZXBseSBuZXN0ZWQgaW4gc3VicGFja2FnZXMgZGV0ZXJtaW5lZCBieSB0aGVpciBsb2NhdGlvbiBpbgpAQCAtMjAsNSArMjEsOCBAQAogCiBmcm9tIHRmbGl0ZV9taWNyby5weXRob24udGZsaXRlX21pY3JvIGltcG9ydCBydW50aW1lCiAKKyMgVW5hbWJpZ3VvdXNseSBpZGVudGlmeSB0aGUgc291cmNlIHVzZWQgdG8gYnVpbGQgdGhlIHBhY2thZ2UuCitmcm9tIHRmbGl0ZV9taWNyby5weXRob24udGZsaXRlX21pY3JvLl92ZXJzaW9uIGltcG9ydCBfX3ZlcnNpb25fXworCiAjIE9yZGVyZWQgYWZ0ZXIgYHJ1bnRpbWVgIHRvIGF2b2lkIGEgY2lyY3VsYXIgZGVwZW5kZW5jeQogZnJvbSB0ZmxpdGVfbWljcm8ucHl0aG9uLnRmbGl0ZV9taWNybyBpbXBvcnQgcG9zdGluc3RhbGxfY2hlY2sKZGlmZiAtLWdpdCBhL3B5dGhvbi90ZmxpdGVfbWljcm8vX3J1bnRpbWUuY2MgYi9weXRob24vdGZsaXRlX21pY3JvL19ydW50aW1lLmNjCmluZGV4IDgyNGIzYjQuLjI0NjU0NWYgMTAwNjQ0Ci0tLSBhL3B5dGhvbi90ZmxpdGVfbWljcm8vX3J1bnRpbWUuY2MKKysrIGIvcHl0aG9uL3RmbGl0ZV9taWNyby9fcnVudGltZS5jYwpAQCAtMjQsMTQgKzI0LDE5IEBACiAKIFBZQklORDExX01PRFVMRShfcnVudGltZSwgbSkgewogICBtLmRvYygpID0gIlRGTGl0ZSBNaWNybyBSdW50aW1lIEV4dGVuc2lvbiI7Ci0KKyAgcHk6OmVudW1fPHRmbGl0ZTo6SW50ZXJwcmV0ZXJDb25maWc+KG0sICJQeXRob25JbnRlcnByZXRlckNvbmZpZyIpCisgICAgICAudmFsdWUoImtBbGxvY2F0aW9uUmVjb3JkaW5nIiwKKyAgICAgICAgICAgICB0ZmxpdGU6OkludGVycHJldGVyQ29uZmlnOjprQWxsb2NhdGlvblJlY29yZGluZykKKyAgICAgIC52YWx1ZSgia1ByZXNlcnZlQWxsVGVuc29ycyIsCisgICAgICAgICAgICAgdGZsaXRlOjpJbnRlcnByZXRlckNvbmZpZzo6a1ByZXNlcnZlQWxsVGVuc29ycyk7CiAgIHB5OjpjbGFzc188SW50ZXJwcmV0ZXJXcmFwcGVyPihtLCAiSW50ZXJwcmV0ZXJXcmFwcGVyIikKICAgICAgIC5kZWYocHk6OmluaXQoW10oY29uc3QgcHk6OmJ5dGVzJiBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHJlZ2lzdGVyZXJzX2J5X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBhcmVuYV9zaXplLCBpbnQgbnVtX3Jlc291cmNlX3ZhcmlhYmxlcykgeworICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYXJlbmFfc2l6ZSwgaW50IG51bV9yZXNvdXJjZV92YXJpYWJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgIHRmbGl0ZTo6SW50ZXJwcmV0ZXJDb25maWcgY29uZmlnKSB7CiAgICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8SW50ZXJwcmV0ZXJXcmFwcGVyPigKICAgICAgICAgICAgIG5ldyBJbnRlcnByZXRlcldyYXBwZXIoZGF0YS5wdHIoKSwgcmVnaXN0ZXJlcnNfYnlfbmFtZSwgYXJlbmFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3Jlc291cmNlX3ZhcmlhYmxlcykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcmVzb3VyY2VfdmFyaWFibGVzLCBjb25maWcpKTsKICAgICAgIH0pKQogICAgICAgLmRlZigiUHJpbnRBbGxvY2F0aW9ucyIsICZJbnRlcnByZXRlcldyYXBwZXI6OlByaW50QWxsb2NhdGlvbnMpCiAgICAgICAuZGVmKCJJbnZva2UiLCAmSW50ZXJwcmV0ZXJXcmFwcGVyOjpJbnZva2UpCkBAIC01NSw2ICs2MCwxNCBAQAogICAgICAgICAgIH0sCiAgICAgICAgICAgcHk6OmFyZygiaW5kZXgiKSkKICAgICAgIC5kZWYoCisgICAgICAgICAgIkdldFRlbnNvciIsCisgICAgICAgICAgW10oSW50ZXJwcmV0ZXJXcmFwcGVyJiBzZWxmLCBzaXplX3QgdGVuc29yX2luZGV4LAorICAgICAgICAgICAgIHNpemVfdCBzdWJncmFwaF9pbmRleCA9IDApIHsKKyAgICAgICAgICAgIHJldHVybiB0ZmxpdGU6OlB5b09yVGhyb3coCisgICAgICAgICAgICAgICAgc2VsZi5HZXRUZW5zb3IodGVuc29yX2luZGV4LCBzdWJncmFwaF9pbmRleCkpOworICAgICAgICAgIH0sCisgICAgICAgICAgcHk6OmFyZygidGVuc29yX2luZGV4IiksIHB5OjphcmcoInN1YmdyYXBoX2luZGV4IikpCisgICAgICAuZGVmKAogICAgICAgICAgICJHZXRPdXRwdXRUZW5zb3JEZXRhaWxzIiwKICAgICAgICAgICBbXShJbnRlcnByZXRlcldyYXBwZXImIHNlbGYsIHNpemVfdCBpbmRleCkgewogICAgICAgICAgICAgcmV0dXJuIHRmbGl0ZTo6UHlvT3JUaHJvdyhzZWxmLkdldE91dHB1dFRlbnNvckRldGFpbHMoaW5kZXgpKTsKZGlmZiAtLWdpdCBhL3B5dGhvbi90ZmxpdGVfbWljcm8vX3ZlcnNpb24ucHkuaW4gYi9weXRob24vdGZsaXRlX21pY3JvL192ZXJzaW9uLnB5LmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NzY4ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vdGZsaXRlX21pY3JvL192ZXJzaW9uLnB5LmluCkBAIC0wLDAgKzEgQEAKK19fdmVyc2lvbl9fID0gIntCVUlMRF9FTUJFRF9MQUJFTH0uZGV2e1NUQUJMRV9HSVRfQ09NTUlUX1RJTUV9LWd7U1RBQkxFX0dJVF9IQVNIfSIKZGlmZiAtLWdpdCBhL3B5dGhvbi90ZmxpdGVfbWljcm8vaW50ZXJwcmV0ZXJfd3JhcHBlci5jYyBiL3B5dGhvbi90ZmxpdGVfbWljcm8vaW50ZXJwcmV0ZXJfd3JhcHBlci5jYwppbmRleCA0MWM0ZjdhLi41M2VmZThlIDEwMDY0NAotLS0gYS9weXRob24vdGZsaXRlX21pY3JvL2ludGVycHJldGVyX3dyYXBwZXIuY2MKKysrIGIvcHl0aG9uL3RmbGl0ZV9taWNyby9pbnRlcnByZXRlcl93cmFwcGVyLmNjCkBAIC0xNSw2ICsxNSwxMSBAQAogCiAjaW5jbHVkZSAicHl0aG9uL3RmbGl0ZV9taWNyby9pbnRlcnByZXRlcl93cmFwcGVyLmgiCiAKKyNpbmNsdWRlIDxjc3RkZGVmPgorCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2FsbG9jYXRvci5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb191dGlscy5oIgorCiAvLyBEaXNhbGxvdyBOdW1weSAxLjcgZGVwcmVjYXRlZCBzeW1ib2xzLgogI2RlZmluZSBOUFlfTk9fREVQUkVDQVRFRF9BUEkgTlBZXzFfN19BUElfVkVSU0lPTgogLy8gU2VlIGh0dHBzOi8vbnVtcHkub3JnL2RvYy8xLjE2L3JlZmVyZW5jZS9jLWFwaS5hcnJheS5odG1sI2ltcG9ydGluZy10aGUtYXBpCkBAIC0xODcsNiArMTkyLDM5IEBACiAgIHJldHVybiByZXN1bHQ7CiB9CiAKK1B5T2JqZWN0KiBHZXRFdmFsVGVuc29yRGV0YWlscyhjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBldmFsX3RlbnNvcikgeworICBQeU9iamVjdCogdGVuc29yX3R5cGUgPQorICAgICAgUHlBcnJheV9UeXBlT2JqZWN0RnJvbVR5cGUoVGZMaXRlVHlwZVRvUHlBcnJheVR5cGUoZXZhbF90ZW5zb3ItPnR5cGUpKTsKKyAgUHlPYmplY3QqIG5wX3NpemVfYXJyYXkgPQorICAgICAgUHlBcnJheUZyb21JbnRWZWN0b3IoZXZhbF90ZW5zb3ItPmRpbXMtPmRhdGEsIGV2YWxfdGVuc29yLT5kaW1zLT5zaXplKTsKKyAgUHlPYmplY3QqIHRlbnNvcl9zaXplID0KKyAgICAgIFB5QXJyYXlfUmV0dXJuKHJlaW50ZXJwcmV0X2Nhc3Q8UHlBcnJheU9iamVjdCo+KG5wX3NpemVfYXJyYXkpKTsKKworICBzaXplX3QgZXZhbF90ZW5zb3JfYnl0ZXMgPSB0ZmxpdGU6OkV2YWxUZW5zb3JCeXRlcyhldmFsX3RlbnNvcik7CisgIHZvaWQqIGRhdGEgPSBtYWxsb2MoZXZhbF90ZW5zb3JfYnl0ZXMpOworICBtZW1jcHkoZGF0YSwgZXZhbF90ZW5zb3ItPmRhdGEuZGF0YSwgZXZhbF90ZW5zb3JfYnl0ZXMpOworCisgIHN0ZDo6dmVjdG9yPG5weV9pbnRwPiBkaW1zKGV2YWxfdGVuc29yLT5kaW1zLT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmFsX3RlbnNvci0+ZGltcy0+ZGF0YSArIGV2YWxfdGVuc29yLT5kaW1zLT5zaXplKTsKKyAgaW50IHB5X3R5cGVfbnVtID0gVGZMaXRlVHlwZVRvUHlBcnJheVR5cGUoZXZhbF90ZW5zb3ItPnR5cGUpOworICBQeU9iamVjdCogbnBfYXJyYXkgPQorICAgICAgUHlBcnJheV9TaW1wbGVOZXdGcm9tRGF0YShkaW1zLnNpemUoKSwgZGltcy5kYXRhKCksIHB5X3R5cGVfbnVtLCBkYXRhKTsKKworICAvLyBUcmFuc2ZlciBvd25lcnNoaXAgdG8gUHl0aG9uIHNvIHRoYXQgdGhlcmUncyBQeXRob24gd2lsbCB0YWtlIGNhcmUgb2YKKyAgLy8gcmVsZWFzaW5nIHRoaXMgYnVmZmVyCisgIFB5QXJyYXlfRU5BQkxFRkxBR1MocmVpbnRlcnByZXRfY2FzdDxQeUFycmF5T2JqZWN0Kj4obnBfYXJyYXkpLAorICAgICAgICAgICAgICAgICAgICAgIE5QWV9BUlJBWV9PV05EQVRBKTsKKworICBQeU9iamVjdCogcmVzdWx0ID0gUHlEaWN0X05ldygpOworICBQeURpY3RfU2V0SXRlbVN0cmluZyhyZXN1bHQsICJkdHlwZSIsIHRlbnNvcl90eXBlKTsKKyAgUHlEaWN0X1NldEl0ZW1TdHJpbmcocmVzdWx0LCAic2hhcGUiLCB0ZW5zb3Jfc2l6ZSk7CisgIFB5RGljdF9TZXRJdGVtU3RyaW5nKAorICAgICAgcmVzdWx0LCAidGVuc29yX2RhdGEiLAorICAgICAgUHlBcnJheV9SZXR1cm4ocmVpbnRlcnByZXRfY2FzdDxQeUFycmF5T2JqZWN0Kj4obnBfYXJyYXkpKSk7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKwogfSAgLy8gbmFtZXNwYWNlCiAKIEludGVycHJldGVyV3JhcHBlcjo6fkludGVycHJldGVyV3JhcHBlcigpIHsKQEAgLTIwNCw3ICsyNDIsNyBAQAogCiBJbnRlcnByZXRlcldyYXBwZXI6OkludGVycHJldGVyV3JhcHBlcigKICAgICBQeU9iamVjdCogbW9kZWxfZGF0YSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiByZWdpc3RlcmVyc19ieV9uYW1lLAotICAgIHNpemVfdCBhcmVuYV9zaXplLCBpbnQgbnVtX3Jlc291cmNlX3ZhcmlhYmxlcykgeworICAgIHNpemVfdCBhcmVuYV9zaXplLCBpbnQgbnVtX3Jlc291cmNlX3ZhcmlhYmxlcywgSW50ZXJwcmV0ZXJDb25maWcgY29uZmlnKSB7CiAgIGludGVycHJldGVyXyA9IG51bGxwdHI7CiAKICAgLy8gYG1vZGVsX2RhdGFgIGlzIHVzZWQgYXMgYSByYXcgcG9pbnRlciBiZXlvbmQgdGhlIHNjb3BlIG9mIHRoaXMKQEAgLTIyMywxMiArMjYxLDYgQEAKICAgY29uc3QgTW9kZWwqIG1vZGVsID0gR2V0TW9kZWwoYnVmKTsKICAgbW9kZWxfID0gbW9kZWxfZGF0YTsKICAgbWVtb3J5X2FyZW5hXyA9IHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+KG5ldyB1aW50OF90W2FyZW5hX3NpemVdKTsKLSAgYWxsb2NhdG9yXyA9IFJlY29yZGluZ01pY3JvQWxsb2NhdG9yOjpDcmVhdGUobWVtb3J5X2FyZW5hXy5nZXQoKSwgYXJlbmFfc2l6ZSk7Ci0gIE1pY3JvUmVzb3VyY2VWYXJpYWJsZXMqIHJlc291cmNlX3ZhcmlhYmxlc18gPSBudWxscHRyOwotICBpZiAobnVtX3Jlc291cmNlX3ZhcmlhYmxlcyA+IDApCi0gICAgcmVzb3VyY2VfdmFyaWFibGVzXyA9Ci0gICAgICAgIE1pY3JvUmVzb3VyY2VWYXJpYWJsZXM6OkNyZWF0ZShhbGxvY2F0b3JfLCBudW1fcmVzb3VyY2VfdmFyaWFibGVzKTsKLQogICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nJiByZWdpc3RlcmVyIDogcmVnaXN0ZXJlcnNfYnlfbmFtZSkgewogICAgIGlmICghQWRkQ3VzdG9tT3BSZWdpc3RlcmVyQnlOYW1lKHJlZ2lzdGVyZXIuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHl0aG9uX29wc19yZXNvbHZlcl8pKSB7CkBAIC0yMzcsNiArMjY5LDI0IEBACiAgICAgfQogICB9CiAKKyAgc3dpdGNoIChjb25maWcpIHsKKyAgICBjYXNlIEludGVycHJldGVyQ29uZmlnOjprQWxsb2NhdGlvblJlY29yZGluZzogeworICAgICAgcmVjb3JkaW5nX2FsbG9jYXRvcl8gPQorICAgICAgICAgIFJlY29yZGluZ01pY3JvQWxsb2NhdG9yOjpDcmVhdGUobWVtb3J5X2FyZW5hXy5nZXQoKSwgYXJlbmFfc2l6ZSk7CisgICAgICBhbGxvY2F0b3JfID0gcmVjb3JkaW5nX2FsbG9jYXRvcl87CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBJbnRlcnByZXRlckNvbmZpZzo6a1ByZXNlcnZlQWxsVGVuc29yczogeworICAgICAgYWxsb2NhdG9yXyA9IE1pY3JvQWxsb2NhdG9yOjpDcmVhdGUobWVtb3J5X2FyZW5hXy5nZXQoKSwgYXJlbmFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbW9yeVBsYW5uZXJUeXBlOjprTGluZWFyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBNaWNyb1Jlc291cmNlVmFyaWFibGVzKiByZXNvdXJjZV92YXJpYWJsZXNfID0gbnVsbHB0cjsKKyAgaWYgKG51bV9yZXNvdXJjZV92YXJpYWJsZXMgPiAwKQorICAgIHJlc291cmNlX3ZhcmlhYmxlc18gPQorICAgICAgICBNaWNyb1Jlc291cmNlVmFyaWFibGVzOjpDcmVhdGUoYWxsb2NhdG9yXywgbnVtX3Jlc291cmNlX3ZhcmlhYmxlcyk7CisKICAgaW50ZXJwcmV0ZXJfID0gbmV3IE1pY3JvSW50ZXJwcmV0ZXIobW9kZWwsIHB5dGhvbl9vcHNfcmVzb2x2ZXJfLCBhbGxvY2F0b3JfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZV92YXJpYWJsZXNfKTsKIApAQCAtMjUwLDcgKzMwMCwxMyBAQAogICBJbXBvcnROdW1weSgpOwogfQogCi12b2lkIEludGVycHJldGVyV3JhcHBlcjo6UHJpbnRBbGxvY2F0aW9ucygpIHsgYWxsb2NhdG9yXy0+UHJpbnRBbGxvY2F0aW9ucygpOyB9Cit2b2lkIEludGVycHJldGVyV3JhcHBlcjo6UHJpbnRBbGxvY2F0aW9ucygpIHsKKyAgaWYgKCFyZWNvcmRpbmdfYWxsb2NhdG9yXykgeworICAgIFRocm93VmFsdWVFcnJvcigiQ2Fubm90IHByaW50IGFsbG9jYXRpb25zIGFzIHRoZXkgd2VyZSBub3QgcmVjb3JkZWQiKTsKKyAgICByZXR1cm47CisgIH0KKyAgcmV0dXJuIHJlY29yZGluZ19hbGxvY2F0b3JfLT5QcmludEFsbG9jYXRpb25zKCk7Cit9CiAKIGludCBJbnRlcnByZXRlcldyYXBwZXI6Okludm9rZSgpIHsKICAgVGZMaXRlU3RhdHVzIHN0YXR1cyA9IGludGVycHJldGVyXy0+SW52b2tlKCk7CkBAIC0zNTgsNiArNDE0LDE4IEBACiAgIHJldHVybiBQeUFycmF5X1JldHVybihyZWludGVycHJldF9jYXN0PFB5QXJyYXlPYmplY3QqPihucF9hcnJheSkpOwogfQogCitQeU9iamVjdCogSW50ZXJwcmV0ZXJXcmFwcGVyOjpHZXRUZW5zb3Ioc2l6ZV90IHRlbnNvcl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3ViZ3JhcGhfaW5kZXgpIHsKKyAgaWYgKCFpbnRlcnByZXRlcl8tPnByZXNlcnZlX2FsbF90ZW5zb3JzKCkpIHsKKyAgICBUaHJvd1J1bnRpbWVFcnJvcigKKyAgICAgICAgIlRGTE0gb25seSBzdXBwb3J0cyBHZXRUZW5zb3IoKSB3aGVuIHVzaW5nIGEgcHl0aG9uIGludGVycHJldGVyIHdpdGggIgorICAgICAgICAidGhlIEludGVycHJldGVyQ29uZmlnLmtQZXNlcnZlckFsbFRlbnNvcnMgaW50ZXJwcmV0ZXJfY29uZmlnIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgcmV0dXJuIEdldEV2YWxUZW5zb3JEZXRhaWxzKAorICAgICAgaW50ZXJwcmV0ZXJfLT5HZXRUZW5zb3IodGVuc29yX2luZGV4LCBzdWJncmFwaF9pbmRleCkpOworfQorCiBQeU9iamVjdCogSW50ZXJwcmV0ZXJXcmFwcGVyOjpHZXRJbnB1dFRlbnNvckRldGFpbHMoc2l6ZV90IGluZGV4KSBjb25zdCB7CiAgIHJldHVybiBHZXRUZW5zb3JEZXRhaWxzKGludGVycHJldGVyXy0+aW5wdXQoaW5kZXgpKTsKIH0KZGlmZiAtLWdpdCBhL3B5dGhvbi90ZmxpdGVfbWljcm8vaW50ZXJwcmV0ZXJfd3JhcHBlci5oIGIvcHl0aG9uL3RmbGl0ZV9taWNyby9pbnRlcnByZXRlcl93cmFwcGVyLmgKaW5kZXggMWVhZDVhZi4uOWJiMzFiMCAxMDA2NDQKLS0tIGEvcHl0aG9uL3RmbGl0ZV9taWNyby9pbnRlcnByZXRlcl93cmFwcGVyLmgKKysrIGIvcHl0aG9uL3RmbGl0ZV9taWNyby9pbnRlcnByZXRlcl93cmFwcGVyLmgKQEAgLTE4LDE2ICsxOCwyOSBAQAogI2luY2x1ZGUgPFB5dGhvbi5oPgogCiAjaW5jbHVkZSAicHl0aG9uL3RmbGl0ZV9taWNyby9weXRob25fb3BzX3Jlc29sdmVyLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2FsbG9jYXRvci5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19pbnRlcnByZXRlci5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9yZWNvcmRpbmdfbWljcm9fYWxsb2NhdG9yLmgiCiAKIG5hbWVzcGFjZSB0ZmxpdGUgewogCisvLyBBbGxvY2F0aW9uIFJlY29yZGluZyBpcyBtdXR1YWxseSBleGNsdXNpdmUgZnJvbSB0aGUgUHJlc2VydmVBbGxUZW5zb3JzCisvLyBkZWJ1Z2dpbmcgZmVhdHVyZSBiZWNhdXNlIFByZXNlcnZlQWxsVGVuc29ycyB1c2VzIHRoZSBMaW5lYXJNZW1vcnlQbGFubmVyLgorLy8gVGhpcyBtZWFucyB0aGF0IHRoZSBBbGxvY2F0aW9ucyByZWNvcmRlZCBieSB0aGUgUmVjb3JkaW5nTWljcm9BbGxvY2F0b3IKKy8vIHdvdWxkbid0IGJlIGFjY3VyYXRlIGJlY2F1c2UgdGhlIEdyZWVkeU1lbW9yeVBsYW5uZXIgd291bGQgaGF2ZSB0byBiZSB1c2VkLgorLy8gU28gdGhpcyBFbnVtIHdhcyBtYWRlIHRvIHJlcHJlc2VudCB0aGUgdHdvIHBvc3NpYmxlIG1vZGVzL2NvbmZpZ3MgeW91IGNhbiB1c2UKKy8vIHRoZSBweXRob24gaW50ZXJwcmV0ZXIgZm9yLgorZW51bSBJbnRlcnByZXRlckNvbmZpZyB7CisgIGtBbGxvY2F0aW9uUmVjb3JkaW5nID0gMCwKKyAga1ByZXNlcnZlQWxsVGVuc29ycyA9IDEsCit9OworCiBjbGFzcyBJbnRlcnByZXRlcldyYXBwZXIgewogIHB1YmxpYzoKLSAgSW50ZXJwcmV0ZXJXcmFwcGVyKFB5T2JqZWN0KiBtb2RlbF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiByZWdpc3RlcmVyc19ieV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGFyZW5hX3NpemUsIGludCBudW1fcmVzb3VyY2VfdmFyaWFibGVzKTsKKyAgSW50ZXJwcmV0ZXJXcmFwcGVyKAorICAgICAgUHlPYmplY3QqIG1vZGVsX2RhdGEsIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcmVnaXN0ZXJlcnNfYnlfbmFtZSwKKyAgICAgIHNpemVfdCBhcmVuYV9zaXplLCBpbnQgbnVtX3Jlc291cmNlX3ZhcmlhYmxlcywKKyAgICAgIEludGVycHJldGVyQ29uZmlnIGNvbmZpZyA9IEludGVycHJldGVyQ29uZmlnOjprQWxsb2NhdGlvblJlY29yZGluZyk7CiAgIH5JbnRlcnByZXRlcldyYXBwZXIoKTsKIAogICB2b2lkIFByaW50QWxsb2NhdGlvbnMoKTsKQEAgLTM3LDkgKzUwLDExIEBACiAgIFB5T2JqZWN0KiBHZXRPdXRwdXRUZW5zb3Ioc2l6ZV90IGluZGV4KSBjb25zdDsKICAgUHlPYmplY3QqIEdldElucHV0VGVuc29yRGV0YWlscyhzaXplX3QgaW5kZXgpIGNvbnN0OwogICBQeU9iamVjdCogR2V0T3V0cHV0VGVuc29yRGV0YWlscyhzaXplX3QgaW5kZXgpIGNvbnN0OworICBQeU9iamVjdCogR2V0VGVuc29yKHNpemVfdCB0ZW5zb3JfaW5kZXgsIHNpemVfdCBzdWJncmFwaF9pbmRleCA9IDApOwogCiAgcHJpdmF0ZToKLSAgdGZsaXRlOjpSZWNvcmRpbmdNaWNyb0FsbG9jYXRvciogYWxsb2NhdG9yXzsKKyAgdGZsaXRlOjpNaWNyb0FsbG9jYXRvciogYWxsb2NhdG9yXyA9IG51bGxwdHI7CisgIHRmbGl0ZTo6UmVjb3JkaW5nTWljcm9BbGxvY2F0b3IqIHJlY29yZGluZ19hbGxvY2F0b3JfID0gbnVsbHB0cjsKICAgY29uc3QgUHlPYmplY3QqIG1vZGVsXzsKICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gbWVtb3J5X2FyZW5hXzsKICAgdGZsaXRlOjpQeXRob25PcHNSZXNvbHZlciBweXRob25fb3BzX3Jlc29sdmVyXzsKZGlmZiAtLWdpdCBhL3B5dGhvbi90ZmxpdGVfbWljcm8vbnVtcHlfdXRpbHMuY2MgYi9weXRob24vdGZsaXRlX21pY3JvL251bXB5X3V0aWxzLmNjCmluZGV4IDRhNGFhZDguLjIwZjQzYzkgMTAwNjQ0Ci0tLSBhL3B5dGhvbi90ZmxpdGVfbWljcm8vbnVtcHlfdXRpbHMuY2MKKysrIGIvcHl0aG9uL3RmbGl0ZV9taWNyby9udW1weV91dGlscy5jYwpAQCAtNDAsNiArNDAsOSBAQAogICAgICAgcmV0dXJuIE5QWV9GTE9BVDMyOwogICAgIGNhc2Uga1RmTGl0ZUZsb2F0MTY6CiAgICAgICByZXR1cm4gTlBZX0ZMT0FUMTY7CisgICAgY2FzZSBrVGZMaXRlQkZsb2F0MTY6CisgICAgICAvLyBUT0RPKGIvMzI5NDkxOTQ5KTogTlBZX0JGTE9BVDE2IGN1cnJlbnRseSBkb2Vzbid0IGV4aXN0CisgICAgICByZXR1cm4gTlBZX0ZMT0FUMTY7CiAgICAgY2FzZSBrVGZMaXRlRmxvYXQ2NDoKICAgICAgIHJldHVybiBOUFlfRkxPQVQ2NDsKICAgICBjYXNlIGtUZkxpdGVJbnQzMjoKZGlmZiAtLWdpdCBhL3B5dGhvbi90ZmxpdGVfbWljcm8vcHlwaV9idWlsZC5kb2NrZXJmaWxlIGIvcHl0aG9uL3RmbGl0ZV9taWNyby9weXBpX2J1aWxkLmRvY2tlcmZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJhYzMyMAotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi90ZmxpdGVfbWljcm8vcHlwaV9idWlsZC5kb2NrZXJmaWxlCkBAIC0wLDAgKzEsMTYgQEAKKyMgVXNlIHRoZSBQeXRob24gUGFja2FnaW5nIEF1dGhvcml0eSdzIHJlZmVyZW5jZSBidWlsZCBlbnZpcm9ubWVudAorIyBmb3IgYmluYXJ5IGV4dGVuc2lvbnMuIEJpbmFyeSBleHRlbnNpb25zIGFyZSB0eXBpY2FsbHkgYnVpbHQgYW5kIGRpc3RyaWJ1dGVkCisjIGZvciBlYWNoIHRhcmdldCBQeXRob24gdmVyc2lvbiBhbmQgT1MgcGxhdGZvcm0uIFRoZSByZWZlcmVuY2UgYnVpbGQKKyMgZW52aXJvbm1lbnQgY29udGFpbnMgUHl0aG9uIGluc3RhbGxhdGlvbnMgZm9yIGVhY2ggdmVyc2lvbiwgYW5kIGEgQy9DKysKKyMgdG9vbGNoYWluIHNwZWNpZmllZCBmb3IgbWF4aW11bSBjb21wYXRpYmlsaXR5IGFtb25nIHg4Nl82NCBMaW51eCBwYWx0Zm9ybXMuCitGUk9NIHF1YXkuaW8vcHlwYS9tYW55bGludXhfMl8yOF94ODZfNjQKKworIyBJbnN0YWxsIGJhemVsICh2aWEgYmF6ZWxpc2spCitFTlYgQkFaRUxJU0s9aHR0cHM6Ly9naXRodWIuY29tL2JhemVsYnVpbGQvYmF6ZWxpc2svcmVsZWFzZXMvZG93bmxvYWQvdjEuMTguMC9iYXplbGlzay1saW51eC1hbWQ2NAorRU5WIEJBWkVMPS91c3IvbG9jYWwvYmluL2JhemVsCitSVU4gY3VybCAtLW91dHB1dCAkQkFaRUwgLS1sb2NhdGlvbiAkQkFaRUxJU0sgJiYgY2htb2QgNzU1ICRCQVpFTAorCisjIEFwcGVuZCB0aGUgbG9jYXRpb24gb2YgdGhlIEMvQysrIHRvb2xjaGFpbiB0byB0aGUgZGVmYXVsdCBQQVRILCB3aGVyZQorIyBiYXplbCBleHBlY3RzIHRvIGZpbmQgaXQuIFRoZSByZWZlcmVuY2UgZW52aXJvbm1lbnQgcHJvdmlkZXMgdGhlIGxvY2F0aW9uCisjICh0eXBpY2FsbHkgc29tZXdoZXJlIHVuZGVyIC9vcHQpIGluIERFVlRPT0xTRVRfUk9PVFBBVEguCitSVU4gZWNobyAiUEFUSD0iJHtQQVRIfTovJHtERVZUT09MU0VUX1JPT1RQQVRIfSIiID4+L2V0Yy9lbnZpcm9ubWVudApkaWZmIC0tZ2l0IGEvcHl0aG9uL3RmbGl0ZV9taWNyby9weXBpX2J1aWxkLnNoIGIvcHl0aG9uL3RmbGl0ZV9taWNyby9weXBpX2J1aWxkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA1ODEyMjUKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vdGZsaXRlX21pY3JvL3B5cGlfYnVpbGQuc2gKQEAgLTAsMCArMSwxMTkgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3NldCAtZQorCitPVVRfRElSX0RFRkFVTFQ9YmF6ZWwtcHlwaS1vdXQKKworVVNBR0U9IiQoYmFzZW5hbWUgJDApIDxweXRob24tdGFnPiBbPG91dHB1dC1kaXJlY3Rvcnk+XQorCitCdWlsZCBhIFB5dGhvbiB3aGVlbCBmb3IgcHVibGljIHJlbGVhc2UgdG8gUHlQSSB1c2luZyBhIHNwZWNpYWwgRG9ja2VyIGJ1aWxkCitjb250YWluZXIuIFVzZXMgYmF6ZWwsIGJ1dCBkb2VzIG5vdCBwb2xsdXRlIHRoZSBXT1JLU1BBQ0UncyBkZWZhdWx0IGNhY2hlLgorCis8cHl0aG9uLXRhZz4gbXVzdCBiZSBvbmUgb2YgdGhlIHN1cHBvcnRlZCBpbnRlcnByZXRlcnM6CisgICBjcDMxMAorICAgY3AzMTEKKworPG91dHB1dC1kaXJlY3Rvcnk+IGRlZmF1bHRzIHRvICRPVVRfRElSX0RFRkFVTFQuCisiCisKK2Nhc2UgIiQxIiBpbgorICAgIGNwMzEwfGNwMzExKQorICAgICAgICBQWV9UQUc9JDEKKyAgICAgICAgT1VURElSPSQocmVhbHBhdGggJHsyOi0kT1VUX0RJUl9ERUZBVUxUfSkKKyAgICAgICAgbWtkaXIgLXAgJE9VVERJUgorICAgICAgICBicmVhaworICAgICAgICA7OworICAgICopCisgICAgICAgIGVjaG8gdXNhZ2U6ICIkVVNBR0UiID4mMgorICAgICAgICBleGl0IDEKK2VzYWMKKworU1JDRElSPSQocmVhbHBhdGggLikKK2lmICEgdGVzdCAtZiAkU1JDRElSL1dPUktTUEFDRTsgdGhlbgorICAgIGVjaG8gImVycm9yOiBtdXN0IHJ1biBmcm9tIHRoZSB0b3Agb2YgdGhlIHNvdXJjZSB0cmVlIiA+JjIKKyAgICBleGl0IDEKK2ZpCisKKyMgUmVtb3ZlIEJhemVsJ3Mgd29ya3NwYWNlIHN5bWxpbmtzIHNvIHRoZXknbGwgYmUgcmV3cml0dGVuIGJlbG93LCBwb2ludGluZyBpbnRvCisjIE9VVERJUi4KK2ZpbmQgLiAtbWF4ZGVwdGggMSAtdHlwZSBsIC1uYW1lIGJhemVsLVwqIHwgeGFyZ3Mgcm0gLWYKKworIyBCdWlsZCB0aGUgRG9ja2VyIGltYWdlIGZyb20gaXRzIHNvdXJjZSBmaWxlLiBEb24ndCBwb2xsdXRlIHRoZSBwdWJsaWMgbGlzdCBvZgorIyBpbWFnZXMgYnkgdGFnZ2luZzsganVzdCB1c2UgdGhlIGltYWdlJ3MgSUQuCitET0NLRVJGSUxFPXB5dGhvbi90ZmxpdGVfbWljcm8vcHlwaV9idWlsZC5kb2NrZXJmaWxlCitJTUFHRV9JRF9GSUxFPSRPVVRESVIvaW1hZ2UtaWQKK2RvY2tlciBidWlsZCAtIC0taWlkZmlsZSAkSU1BR0VfSURfRklMRSA8JERPQ0tFUkZJTEUKK0lNQUdFX0lEPSQoY2F0ICRJTUFHRV9JRF9GSUxFKQorCisjIEJ1aWxkIHRoZSBQeXRob24gcGFja2FnZSB3aXRoaW4gYW4gZXBoZW1lcmFsIGNvbnRhaW5lci4KK2RvY2tlciBydW4gXAorICAgIC0tcm0gXAorICAgIC0taW50ZXJhY3RpdmUgXAorICAgIC0tbW91bnQgdHlwZT1iaW5kLHNvdXJjZT0kU1JDRElSLGRlc3RpbmF0aW9uPSRTUkNESVIgXAorICAgIC0tbW91bnQgdHlwZT1iaW5kLHNvdXJjZT0kT1VURElSLGRlc3RpbmF0aW9uPSRPVVRESVIgXAorICAgIC0td29ya2RpciAkU1JDRElSIFwKKyAgICAtLWVudiBVU0VSPSQoaWQgLXVuKSBcCisgICAgJElNQUdFX0lEIFwKKyAgICAvYmluL2Jhc2ggLXMgLWUgLXggLXUgXAorPDxFT0YKKyAgICAjIFNldHVwIHRoZSBQeXRob24gY29tcGF0aWJpbGl0eSB0YWdzLiBUaGUgUFlfQUJJIGFsd2F5cyBtYXRjaGVzIHRoZSBQeXRob24KKyAgICAjIGludGVycHJldGVyIHRhZy4gVGhlIHBsYXRmb3JtIHRhZyBpcyBzdXBwbGllZCBieSB0aGUgYnVpbGQgaW1hZ2UgaW4gdGhlCisgICAgIyBlbnZpcm9ubWVudCB2YXJpYWJsZSBBVURJVFdIRUVMX1BMQVQuCisgICAgUFlfQUJJPSRQWV9UQUcKKyAgICBQWV9QTEFURk9STT1cJEFVRElUV0hFRUxfUExBVAorICAgIFBZX0NPTVBBVElCSUxJVFk9JHtQWV9UQUd9X1wke1BZX0FCSX1fXCR7UFlfUExBVEZPUk19CisKKyAgICAjIExpbmsgdGhlIGRlc2lyZWQgUHl0aG9uIHZlcnNpb24gaW50byB0aGUgUEFUSCwgd2hlcmUgYmF6ZWwgd2lsbCBmaW5kIGl0LgorICAgICMgVGhlIGJ1aWxkIGltYWdlIGNvbnRhaW5zIG1hbnkgZGlmZmVyZW50IFB5dGhvbiB2ZXJzaW9ucyBhcyBvcHRpb25zLgorICAgIGxuIC1zZiAvb3B0L3B5dGhvbi8kUFlfVEFHLSRQWV9UQUcvYmluLyogL3Vzci9iaW4KKworICAgICMgQmF6ZWxpc2sgZmFpbHMgaWYgaXQgY2FuJ3QgY2hlY2sgSE9NRSBmb3IgYSAucmMgZmlsZS4sIGFuZCBwaXAgKGluCisgICAgIyA6d2hsX3Rlc3QpIGluc3RhbGxhdGlvbiBvZiBzb21lIGRlcGVuZGVuY2llcyAoZS5nLiwgd3JhcHQpIGV4cGVjdHMgSE9NRS4KKyAgICBleHBvcnQgSE9NRT0kT1VURElSCisKKyAgICAjIEJhemVsaXNrLCBiYXplbCwgYW5kIHBpcCBhbGwgbmVlZCBhIHdyaXRhYmxlIGNhY2hlIGRpcmVjdG9yeS4KKyAgICBleHBvcnQgWERHX0NBQ0hFX0hPTUU9JE9VVERJUi9jYWNoZQorCisgICAgIyBSZWxvY2F0ZSB0aGUgYmF6ZWwgcm9vdCB0byBrZWVwIHRoZSBjYWNoZSB1c2VkIGZvciBlYWNoIFB5dGhvbiB0b29sY2hhaW4KKyAgICAjIHNlcGFyYXRlLiBEcm9wIHJvb3QgcHJpdmxlZGdlcyBhbmQgcnVuIGFzIHRoZSBpbnZva2luZyB1c2VyLgorICAgIGNhbGxfYmF6ZWwoKSB7CisgICAgICAgIHNldHByaXYgLS1yZXVpZD0kKGlkIC11KSAtLXJlZ2lkPSQoaWQgLWcpIC0tY2xlYXItZ3JvdXBzIFwKKyAgICAgICAgICAgIGJhemVsIFwKKyAgICAgICAgICAgICAgICAtLW91dHB1dF91c2VyX3Jvb3Q9JE9VVERJUi8kUFlfVEFHLW91dCBcCisgICAgICAgICAgICAgICAgIlwkQCIgXAorICAgICAgICAgICAgICAgIC0tYWN0aW9uX2Vudj1IT01FIGAjIGhlbHAgc2V0dXB0b29scyBmaW5kIEhPTUUgaW4gY29udGFpbmVyYCBcCisgICAgICAgICAgICAgICAgLS1hY3Rpb25fZW52PVVTRVIgYCMgYmF6ZWwgcmVhZHMgVVNFUiB2aWEgd2hvYW1pYCBcCisgICAgICAgICAgICAgICAgLS1hY3Rpb25fZW52PVhER19DQUNIRV9IT01FIGAjIGxvY2F0ZSBwaXAncyBjYWNoZSBpbnNpZGUgT1VURElSYAorICAgIH0KKworICAgICMgQnVpbGQgdGhlIHdoZWVsIHZpYSBiYXplbCwgdXNpbmcgdGhlIFB5dGhvbiBjb21wYXRpYmlsaXR5IHRhZyBtYXRjaGluZyB0aGUKKyAgICAjIGJ1aWxkIGVudmlyb25tZW50LgorICAgIGNhbGxfYmF6ZWwgYnVpbGQgLy9weXRob24vdGZsaXRlX21pY3JvOndobC5kaXN0IFwKKyAgICAgICAgLS0vL3B5dGhvbi90ZmxpdGVfbWljcm86Y29tcGF0aWJpbGl0eV90YWc9XCRQWV9DT01QQVRJQklMSVRZCisKKyAgICAjIFRlc3QsIGluIHRoZSBjb250YWluZXIgZW52aXJvbm1lbnQuCisgICAgY2FsbF9iYXplbCB0ZXN0IC8vcHl0aG9uL3RmbGl0ZV9taWNybzp3aGxfdGVzdCBcCisgICAgICAgICAgICAtLS8vcHl0aG9uL3RmbGl0ZV9taWNybzpjb21wYXRpYmlsaXR5X3RhZz1cJFBZX0NPTVBBVElCSUxJVFkKK0VPRgorCisjIE1ha2UgdGhlIG91dHB1dCBkaXJlY3RvcnkgdHJlZSB3cml0YWJsZSBzbyBpdCBjYW4gYmUgcmVtb3ZlZCBlYXNpbHkgYnkgdGhlCisjIHVzZXIgd2l0aCBgcm0gLXJmICRPVVRESVJgLiBCYXplbCBsZWF2ZXMgaXQgd3JpdGUtcHJvdGVjdGVkLgorY2htb2QgLVIgK3cgJE9VVERJUgorCisjIENvcHkgdGhlIGdlbmVyYXRlZCB3aGVlbCBmaWxlIHRvIHRoZSByb290IG9mIHRoZSAkT1VURElSLgorY3AgYmF6ZWwtYmluL3B5dGhvbi90ZmxpdGVfbWljcm8vd2hsX2Rpc3QvKi53aGwgJE9VVERJUgorZWNobyAiT3V0cHV0OlxuJChscyAkT1VURElSLyoud2hsKSIKZGlmZiAtLWdpdCBhL3B5dGhvbi90ZmxpdGVfbWljcm8vcHlwaV91cGxvYWQuc2ggYi9weXRob24vdGZsaXRlX21pY3JvL3B5cGlfdXBsb2FkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE1MTk0YzQKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vdGZsaXRlX21pY3JvL3B5cGlfdXBsb2FkLnNoCkBAIC0wLDAgKzEsNTcgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3NldCAtZQorCitVU0FHRT0iJChiYXNlbmFtZSAkMCkgWy0tdGVzdC1weXBpXSA8d2hsPi4uLgorCitVcGxvYWQgdGhlIGdpdmVuIFB5dGhvbiB3aGVlbHMgdG8gUHlQSSB1c2luZyB0aGUgcHJvZ3JhbSB0d2luZS4gUmVxdWlyZXMgYW4KK2F1dGhlbnRpY2F0aW9uIHRva2VuIGluIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBUV0lORV9QQVNTV09SRC4gVFdJTkVfVVNFUk5BTUUKK2lzIHNldCB0byBcYF9fdG9rZW5fX1xgIGlmIG5vdCBzZXQgaW4gdGhlIGVudmlyb25tZW50LgorIgorCitkaWUgKCkgeworICAgIGVjaG8gIiQqIiA+JjIKKyAgICBleGl0IDEKK30KKworY2FzZSAiJDEiIGluCisgICAgLS10ZXN0LXB5cGkpCisgICAgICAgIGV4cG9ydCBUV0lORV9SRVBPU0lUT1JZPXRlc3RweXBpCisgICAgICAgIHNoaWZ0CisgICAgICAgIDs7CisgICAgLWh8LS1oZWxwKQorICAgICAgICBlY2hvICIkVVNBR0UiCisgICAgICAgIGV4aXQKK2VzYWMKKworaWYgWyAhICIkIyIgLWdlIDEgXTsgdGhlbgorICAgIGRpZSAiJFVTQUdFIgorZmkKKworaWYgWyAhIC14ICQoY29tbWFuZCAtdiB0d2luZSkgXTsgdGhlbgorICAgIGRpZSAiZXJyb3I6IHR3aW5lIG5vdCBmb3VuZC4gT24gRGViaWFuIGFuZCBkZXJpdmF0aXZlcywgdHJ5IFxgYXB0IGluc3RhbGwgdHdpbmVcYC4iCitmaQorCitpZiBbICEgIiRUV0lORV9QQVNTV09SRCIgXTsgdGhlbgorICAgIGRpZSAiZXJyb3I6IFRXSU5FX1BBU1NXT1JEIGlzIG5vdCBzZXQiCitmaQorCis6ICR7VFdJTkVfVVNFUk5BTUU6PSJfX3Rva2VuX18ifQorCitleHBvcnQgVFdJTkVfUEFTU1dPUkQKK2V4cG9ydCBUV0lORV9VU0VSTkFNRQordHdpbmUgdXBsb2FkICIkQCIKZGlmZiAtLWdpdCBhL3B5dGhvbi90ZmxpdGVfbWljcm8vcHl0aG9uX29wc19yZXNvbHZlci5jYyBiL3B5dGhvbi90ZmxpdGVfbWljcm8vcHl0aG9uX29wc19yZXNvbHZlci5jYwppbmRleCBhNDdhMjYxLi5mNWQ2ZTYzIDEwMDY0NAotLS0gYS9weXRob24vdGZsaXRlX21pY3JvL3B5dGhvbl9vcHNfcmVzb2x2ZXIuY2MKKysrIGIvcHl0aG9uL3RmbGl0ZV9taWNyby9weXRob25fb3BzX3Jlc29sdmVyLmNjCkBAIC0yOCw2ICsyOCw3IEBACiAgIEFkZEFyZ01pbigpOwogICBBZGRBc3NpZ25WYXJpYWJsZSgpOwogICBBZGRBdmVyYWdlUG9vbDJEKCk7CisgIEFkZEJhdGNoTWF0TXVsKCk7CiAgIEFkZEJhdGNoVG9TcGFjZU5kKCk7CiAgIEFkZEJyb2FkY2FzdEFyZ3MoKTsKICAgQWRkQnJvYWRjYXN0VG8oKTsKQEAgLTQ1LDggKzQ2LDkgQEAKICAgQWRkRGVxdWFudGl6ZSgpOwogICBBZGREZXRlY3Rpb25Qb3N0cHJvY2VzcygpOwogICBBZGREaXYoKTsKLSAgQWRkRW5lcmd5KCk7CiAgIEFkZEVsdSgpOworICBBZGRFbWJlZGRpbmdMb29rdXAoKTsKKyAgQWRkRW5lcmd5KCk7CiAgIEFkZEVxdWFsKCk7CiAgIEFkZEV0aG9zVSgpOwogICBBZGRFeHAoKTsKQEAgLTU1LDggKzU3LDggQEAKICAgQWRkRmlsbCgpOwogICBBZGRGaWx0ZXJCYW5rKCk7CiAgIEFkZEZpbHRlckJhbmtMb2coKTsKLSAgQWRkRmlsdGVyQmFua1NxdWFyZVJvb3QoKTsKICAgQWRkRmlsdGVyQmFua1NwZWN0cmFsU3VidHJhY3Rpb24oKTsKKyAgQWRkRmlsdGVyQmFua1NxdWFyZVJvb3QoKTsKICAgQWRkRmxvb3IoKTsKICAgQWRkRmxvb3JEaXYoKTsKICAgQWRkRmxvb3JNb2QoKTsKQEAgLTc1LDExICs3NywxMSBAQAogICBBZGRMZXNzKCk7CiAgIEFkZExlc3NFcXVhbCgpOwogICBBZGRMb2coKTsKKyAgQWRkTG9nU29mdG1heCgpOwogICBBZGRMb2dpY2FsQW5kKCk7CiAgIEFkZExvZ2ljYWxOb3QoKTsKICAgQWRkTG9naWNhbE9yKCk7CiAgIEFkZExvZ2lzdGljKCk7Ci0gIEFkZExvZ1NvZnRtYXgoKTsKICAgQWRkTWF4UG9vbDJEKCk7CiAgIEFkZE1heGltdW0oKTsKICAgQWRkTWVhbigpOwpAQCAtODksNiArOTEsNyBAQAogICBBZGROZWcoKTsKICAgQWRkTm90RXF1YWwoKTsKICAgQWRkT3ZlcmxhcEFkZCgpOworICBBZGRQQ0FOKCk7CiAgIEFkZFBhY2soKTsKICAgQWRkUGFkKCk7CiAgIEFkZFBhZFYyKCk7CkBAIC0xMTcsOCArMTIwLDggQEAKICAgQWRkU3F1YXJlKCk7CiAgIEFkZFNxdWFyZWREaWZmZXJlbmNlKCk7CiAgIEFkZFNxdWVlemUoKTsKLSAgQWRkU3RyaWRlZFNsaWNlKCk7CiAgIEFkZFN0YWNrZXIoKTsKKyAgQWRkU3RyaWRlZFNsaWNlKCk7CiAgIEFkZFN1YigpOwogICBBZGRTdW0oKTsKICAgQWRkU3ZkZigpOwpkaWZmIC0tZ2l0IGEvcHl0aG9uL3RmbGl0ZV9taWNyby9ydW50aW1lLnB5IGIvcHl0aG9uL3RmbGl0ZV9taWNyby9ydW50aW1lLnB5CmluZGV4IDA2YTYyYjAuLmZiZjJmMjAgMTAwNjQ0Ci0tLSBhL3B5dGhvbi90ZmxpdGVfbWljcm8vcnVudGltZS5weQorKysgYi9weXRob24vdGZsaXRlX21pY3JvL3J1bnRpbWUucHkKQEAgLTE0LDE1ICsxNCw2NCBAQAogIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICIiIlB5dGhvbiBwYWNrYWdlIGZvciBURkxNIFB5dGhvbiBJbnRlcnByZXRlciIiIgogCitpbXBvcnQgZW51bQogaW1wb3J0IG9zCi0KLWZyb20gdGZsaXRlX21pY3JvLnB5dGhvbi50ZmxpdGVfbWljcm8gaW1wb3J0IF9ydW50aW1lCiBmcm9tIHRmbGl0ZV9taWNyby50ZW5zb3JmbG93LmxpdGUudG9vbHMgaW1wb3J0IGZsYXRidWZmZXJfdXRpbHMKK2Zyb20gdGZsaXRlX21pY3JvLnB5dGhvbi50ZmxpdGVfbWljcm8gaW1wb3J0IF9ydW50aW1lCisKKworY2xhc3MgSW50ZXJwcmV0ZXJDb25maWcoZW51bS5FbnVtKToKKyAgIiIiVGhlcmUgYXJlIHR3byBtdXR1YWxseSBleGNsdXNpdmUgdHlwZXMgb2Ygd2F5IHlvdSBjb3VsZCB1c2UgdGhlIFRGTE0gcHl0aG9uCisKKyAgaW50ZXJwcmV0ZXIsIHRoaXMgZW51bSBpcyBtYWRlIHNvIHRoYXQgdXNlcnMgY2FuIGNsZWFybHkgY2hvb3NlIGJldHdlZW4gdGhlCisgIHR3bworICBkaWZmZXJlbnQgdXNhZ2UgbWV0aG9kIGZvciB0aGUgaW50ZXJwcmV0ZXIuCisKKyAgVGhlIGZpcnN0IGRlZmF1bHQgd2F5IGlzIGtSZWNvcmRpbmdBbGxvY2F0aW9uIHdoZXJlIGFsbCBtZW1vcnkgdXNhZ2UgYnkgdGhlCisgIGludGVycHJldGVyIGlzIHJlY29yZGVkIG9uIGluZmVyZW5jZS4gV2hlbiB1c2luZyB0aGlzIGNvbmZpZyB0aGUgR2V0VGVuc29yKCkKKyAgYXBpIGlzIGRpc2FibGVkIGJ5IHRoZSBpbnRlcnByZXRlciBzaW5jZSB0aGlzIGludGVycHJldGVyIGNvbmZpZ3VyYXRpb24KKyAgZG9lc27igJl0CisgIGd1YXJhbnRlZSB0aGF0IHRoZSB2YWxpZCBkYXRhIGZvciBhbGwgdGVuc29ycyBpcyBhdmFpbGFibGUgcG9zdCBpbmZlcmVuY2UuCisKKyAgVGhlIHNlY29uZCB3YXkgaXMga1ByZXNlcnZlQWxsVGVuc29ycyB3aGVyZSB0aGUgR2V0VGVuc29yKCkgYXBpIGlzIGRpc2FibGVkIGJ5CisgIHRoZSBpbnRlcnByZXRlciBzaW5jZSB0aGlzIGludGVycHJldGVyIGNvbmZpZ3VyYXRpb24gZG9lc27igJl0IGd1YXJhbnRlZSB0aGF0CisgIHRoZQorICB2YWxpZCBkYXRhIGZvciBhbGwgdGVuc29ycyBpcyBhdmFpbGFibGUgcG9zdCBpbmZlcmVuY2UuIEJ1dCB0aGUgbWVtb3J5IHVzYWdlCisgIGJ5CisgIHRoZSBpbnRlcnByZXRlciB3b27igJl0IGJlIHJlY29yZGVkIG9uIGluZmVyZW5jZS4KKworICBVc2FnZToKKworICBkZWZhdWx0X2ludGVycHJldGVyID0gSW50ZXJwcmV0ZXIo4oCmCisgICAgICAgIGludHJlcHJldGVyX2NvbmZpZz1JbnRlcnByZXRlckNvbmZpZy5rQWxsb2NhdGlvblJlY29yZGluZykKKworICBwcmVzZXJ2ZV9pbnRlcnByZXRlciA9IEludGVycHJldGVyKOKApgorICAgICAgICBpbnRyZXByZXRlcl9jb25maWc9SW50ZXJwcmV0ZXJDb25maWcua1ByZXNlcnZlQWxsVGVuc29ycykKKyAgIiIiCisKKyAga0FsbG9jYXRpb25SZWNvcmRpbmcgPSAwCisgIGtQcmVzZXJ2ZUFsbFRlbnNvcnMgPSAxCisKKworI1RPRE8oYi8yOTcxMTg3NjgpOiBPbmNlIEtvcmtvIERvY2tlciBjb250cmFpbmVyIGZvciB1YnVudHUgeDg2IGhhcyBpbXV0YWJsZWRpY3QKKyMgYWRkZWQgdG8gaXQsIHRoaXMgc2hvdWxkIGJlIHR1cm5lZCBpbnRvIGFuIGltbXV0YWJsZWRpY3QuCitfRU5VTV9UUkFOU0xBVE9SID0geworICAgIEludGVycHJldGVyQ29uZmlnLmtBbGxvY2F0aW9uUmVjb3JkaW5nOgorICAgIChfcnVudGltZS5QeXRob25JbnRlcnByZXRlckNvbmZpZy5rQWxsb2NhdGlvblJlY29yZGluZyksCisgICAgSW50ZXJwcmV0ZXJDb25maWcua1ByZXNlcnZlQWxsVGVuc29yczoKKyAgICAoX3J1bnRpbWUuUHl0aG9uSW50ZXJwcmV0ZXJDb25maWcua1ByZXNlcnZlQWxsVGVuc29ycyksCit9CiAKIAogY2xhc3MgSW50ZXJwcmV0ZXIob2JqZWN0KToKIAotICBkZWYgX19pbml0X18oc2VsZiwgbW9kZWxfZGF0YSwgY3VzdG9tX29wX3JlZ2lzdGVyZXJzLCBhcmVuYV9zaXplKToKKyAgZGVmIF9faW5pdF9fKAorICAgICAgc2VsZiwKKyAgICAgIG1vZGVsX2RhdGEsCisgICAgICBjdXN0b21fb3BfcmVnaXN0ZXJlcnMsCisgICAgICBhcmVuYV9zaXplLAorICAgICAgaW50cmVwcmV0ZXJfY29uZmlnPUludGVycHJldGVyQ29uZmlnLmtBbGxvY2F0aW9uUmVjb3JkaW5nLAorICApOgogICAgIGlmIG1vZGVsX2RhdGEgaXMgTm9uZToKICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIk1vZGVsIG11c3Qgbm90IGJlIE5vbmUiKQogCkBAIC0zMywyMCArODIsMjggQEAKICAgICAjIFRoaXMgaXMgYSBoZXVyaXN0aWMgdG8gZW5zdXJlIHRoYXQgdGhlIGFyZW5hIGlzIHN1ZmZpY2llbnRseSBzaXplZC4KICAgICBpZiBhcmVuYV9zaXplIGlzIE5vbmU6CiAgICAgICBhcmVuYV9zaXplID0gbGVuKG1vZGVsX2RhdGEpICogMTAKLQogICAgICMgU29tZSBtb2RlbHMgbWFrZSB1c2Ugb2YgcmVzb3VyY2UgdmFyaWFibGVzIG9wcywgZ2V0IHRoZSBjb3VudCBoZXJlCiAgICAgbnVtX3Jlc291cmNlX3ZhcmlhYmxlcyA9IGZsYXRidWZmZXJfdXRpbHMuY291bnRfcmVzb3VyY2VfdmFyaWFibGVzKAogICAgICAgICBtb2RlbF9kYXRhKQogICAgIHByaW50KCJOdW1iZXIgb2YgcmVzb3VyY2UgdmFyaWFibGVzIHRoZSBtb2RlbCB1c2VzID0gIiwKICAgICAgICAgICBudW1fcmVzb3VyY2VfdmFyaWFibGVzKQogCi0gICAgc2VsZi5faW50ZXJwcmV0ZXIgPSBfcnVudGltZS5JbnRlcnByZXRlcldyYXBwZXIobW9kZWxfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21fb3BfcmVnaXN0ZXJlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlbmFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fcmVzb3VyY2VfdmFyaWFibGVzKQorICAgIHNlbGYuX2ludGVycHJldGVyID0gX3J1bnRpbWUuSW50ZXJwcmV0ZXJXcmFwcGVyKAorICAgICAgICBtb2RlbF9kYXRhLAorICAgICAgICBjdXN0b21fb3BfcmVnaXN0ZXJlcnMsCisgICAgICAgIGFyZW5hX3NpemUsCisgICAgICAgIG51bV9yZXNvdXJjZV92YXJpYWJsZXMsCisgICAgICAgIF9FTlVNX1RSQU5TTEFUT1JbaW50cmVwcmV0ZXJfY29uZmlnXSwKKyAgICApCiAKICAgQGNsYXNzbWV0aG9kCi0gIGRlZiBmcm9tX2ZpbGUoc2VsZiwgbW9kZWxfcGF0aCwgY3VzdG9tX29wX3JlZ2lzdGVyZXJzPVtdLCBhcmVuYV9zaXplPU5vbmUpOgorICBkZWYgZnJvbV9maWxlKAorICAgICAgc2VsZiwKKyAgICAgIG1vZGVsX3BhdGgsCisgICAgICBjdXN0b21fb3BfcmVnaXN0ZXJlcnM9W10sCisgICAgICBhcmVuYV9zaXplPU5vbmUsCisgICAgICBpbnRyZXByZXRlcl9jb25maWc9SW50ZXJwcmV0ZXJDb25maWcua0FsbG9jYXRpb25SZWNvcmRpbmcsCisgICk6CiAgICAgIiIiSW5zdGFudGlhdGVzIGEgVEZMTSBpbnRlcnByZXRlciBmcm9tIGEgbW9kZWwgLnRmbGl0ZSBmaWxlcGF0aC4KIAogICAgIEFyZ3M6CkBAIC02NSwxMCArMTIyLDIxIEBACiAgICAgd2l0aCBvcGVuKG1vZGVsX3BhdGgsICJyYiIpIGFzIGY6CiAgICAgICBtb2RlbF9kYXRhID0gZi5yZWFkKCkKIAotICAgIHJldHVybiBJbnRlcnByZXRlcihtb2RlbF9kYXRhLCBjdXN0b21fb3BfcmVnaXN0ZXJlcnMsIGFyZW5hX3NpemUpCisgICAgcmV0dXJuIEludGVycHJldGVyKAorICAgICAgICBtb2RlbF9kYXRhLAorICAgICAgICBjdXN0b21fb3BfcmVnaXN0ZXJlcnMsCisgICAgICAgIGFyZW5hX3NpemUsCisgICAgICAgIGludHJlcHJldGVyX2NvbmZpZywKKyAgICApCiAKICAgQGNsYXNzbWV0aG9kCi0gIGRlZiBmcm9tX2J5dGVzKHNlbGYsIG1vZGVsX2RhdGEsIGN1c3RvbV9vcF9yZWdpc3RlcmVycz1bXSwgYXJlbmFfc2l6ZT1Ob25lKToKKyAgZGVmIGZyb21fYnl0ZXMoCisgICAgICBzZWxmLAorICAgICAgbW9kZWxfZGF0YSwKKyAgICAgIGN1c3RvbV9vcF9yZWdpc3RlcmVycz1bXSwKKyAgICAgIGFyZW5hX3NpemU9Tm9uZSwKKyAgICAgIGludHJlcHJldGVyX2NvbmZpZz1JbnRlcnByZXRlckNvbmZpZy5rQWxsb2NhdGlvblJlY29yZGluZywKKyAgKToKICAgICAiIiJJbnN0YW50aWF0ZXMgYSBURkxNIGludGVycHJldGVyIGZyb20gYSBtb2RlbCBpbiBieXRlIGFycmF5LgogCiAgICAgQXJnczoKQEAgLTgyLDcgKzE1MCwxMiBAQAogICAgICAgQW4gSW50ZXJwcmV0ZXIgaW5zdGFuY2UKICAgICAiIiIKIAotICAgIHJldHVybiBJbnRlcnByZXRlcihtb2RlbF9kYXRhLCBjdXN0b21fb3BfcmVnaXN0ZXJlcnMsIGFyZW5hX3NpemUpCisgICAgcmV0dXJuIEludGVycHJldGVyKAorICAgICAgICBtb2RlbF9kYXRhLAorICAgICAgICBjdXN0b21fb3BfcmVnaXN0ZXJlcnMsCisgICAgICAgIGFyZW5hX3NpemUsCisgICAgICAgIGludHJlcHJldGVyX2NvbmZpZywKKyAgICApCiAKICAgZGVmIHByaW50X2FsbG9jYXRpb25zKHNlbGYpOgogICAgICIiIkludm9rZSB0aGUgUmVjb3JkaW5nTWljcm9BbGxvY2F0b3IgdG8gcHJpbnQgdGhlIGFyZW5hIHVzYWdlLgpAQCAtMTU3LDYgKzIzMCw5IEBACiAKICAgICByZXR1cm4gc2VsZi5faW50ZXJwcmV0ZXIuR2V0T3V0cHV0VGVuc29yKGluZGV4KQogCisgIGRlZiBHZXRUZW5zb3Ioc2VsZiwgdGVuc29yX2luZGV4LCBzdWJncmFwaF9pbmRleCk6CisgICAgcmV0dXJuIHNlbGYuX2ludGVycHJldGVyLkdldFRlbnNvcih0ZW5zb3JfaW5kZXgsIHN1YmdyYXBoX2luZGV4KQorCiAgIGRlZiBnZXRfaW5wdXRfZGV0YWlscyhzZWxmLCBpbmRleCk6CiAgICAgIiIiR2V0IGlucHV0IHRlbnNvciBpbmZvcm1hdGlvbgogCmRpZmYgLS1naXQgYS9weXRob24vdGZsaXRlX21pY3JvL3J1bnRpbWVfdGVzdC5weSBiL3B5dGhvbi90ZmxpdGVfbWljcm8vcnVudGltZV90ZXN0LnB5CmluZGV4IDZhMTI3ZmMuLjJhOTAwM2MgMTAwNjQ0Ci0tLSBhL3B5dGhvbi90ZmxpdGVfbWljcm8vcnVudGltZV90ZXN0LnB5CisrKyBiL3B5dGhvbi90ZmxpdGVfbWljcm8vcnVudGltZV90ZXN0LnB5CkBAIC0yMSwxMyArMjEsNzggQEAKIAogaW1wb3J0IGdjCiBpbXBvcnQgd2Vha3JlZgorCiBpbXBvcnQgbnVtcHkgYXMgbnAKIGltcG9ydCB0ZW5zb3JmbG93IGFzIHRmCiAKIGZyb20gdGVuc29yZmxvdy5weXRob24uZnJhbWV3b3JrIGltcG9ydCB0ZXN0X3V0aWwKIGZyb20gdGVuc29yZmxvdy5weXRob24ucGxhdGZvcm0gaW1wb3J0IHRlc3QKLWZyb20gdGZsaXRlX21pY3JvLnRlbnNvcmZsb3cubGl0ZS5taWNyby50ZXN0aW5nIGltcG9ydCBnZW5lcmF0ZV90ZXN0X21vZGVscwogZnJvbSB0ZmxpdGVfbWljcm8ucHl0aG9uLnRmbGl0ZV9taWNybyBpbXBvcnQgcnVudGltZQorZnJvbSB0ZmxpdGVfbWljcm8udGVuc29yZmxvdy5saXRlLm1pY3JvLmV4YW1wbGVzLnJlY2lwZXMgaW1wb3J0IGFkZF9mb3VyX251bWJlcnMKK2Zyb20gdGZsaXRlX21pY3JvLnRlbnNvcmZsb3cubGl0ZS5taWNyby50ZXN0aW5nIGltcG9ydCBnZW5lcmF0ZV90ZXN0X21vZGVscworCisKK2NsYXNzIFBlc2VydmVBbGxUZW5zb3JzVGVzdCh0ZXN0X3V0aWwuVGVuc29yRmxvd1Rlc3RDYXNlKToKKworICBkZWYgQWRkRm91ck51bWJlcnNUZXN0SW50ZXJwcmV0ZXJNYWtlcihzZWxmLCBpbnB1dHMpOgorICAgICIiIlJldHVybnMgYSB0ZmxtIGludGVycHJldGVyIHdpdGggYSBzaW1wbGUgbW9kZWwgdGhhdCBsb2FkcyA0IG51bWJlcnMgbG9hZGVkCisKKyAgICBpbnRvIGl0IGFuZCBsb2FkcyB0aGUgNCBpbnB1dHMgaW50byB0aGUgbW9kZWwKKyAgICAiIiIKKyAgICBtb2RlbF9kYXRhID0gYWRkX2ZvdXJfbnVtYmVycy5nZW5lcmF0ZV9tb2RlbCh3cml0ZV9maWxlPUZhbHNlKQorICAgIHRmbG1faW50ZXJwcmV0ZXIgPSBydW50aW1lLkludGVycHJldGVyLmZyb21fYnl0ZXMoCisgICAgICAgIG1vZGVsX2RhdGEsCisgICAgICAgIGludHJlcHJldGVyX2NvbmZpZz1ydW50aW1lLkludGVycHJldGVyQ29uZmlnLmtQcmVzZXJ2ZUFsbFRlbnNvcnMsCisgICAgKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGlucHV0cyksIDQpCisgICAgdGZsbV9pbnRlcnByZXRlci5zZXRfaW5wdXQoaW5wdXRzWzBdLCAwKQorICAgIHRmbG1faW50ZXJwcmV0ZXIuc2V0X2lucHV0KGlucHV0c1sxXSwgMSkKKyAgICB0ZmxtX2ludGVycHJldGVyLnNldF9pbnB1dChpbnB1dHNbMl0sIDIpCisgICAgdGZsbV9pbnRlcnByZXRlci5zZXRfaW5wdXQoaW5wdXRzWzNdLCAzKQorICAgIHJldHVybiB0ZmxtX2ludGVycHJldGVyCisKKyAgZGVmIHRlc3RHZXRUZW5zb3JBY2N1cmF0ZWx5R2V0c0FsbFRlbm9ycyhzZWxmKToKKyAgICAiIiJUZXN0IGNoZWNrcyB0aGF0IEdldFRlbnNvcigpIHJldHVybnMgYWNjdXJhdGUgdmFsdWVzIGZvciBlYWNoIHRlbnNvciBpbiB0aGUKKworICAgIG1vZGVsIGJhc2VkIG9uIGlucHV0cyBvZiAxIDIgMyA0IGludG8gdGhlIEFkZEZvdXJOdW1iZXJzIFRmTGl0ZSBtb2RlbAorICAgICIiIgorICAgIHRmbG1faW50ZXJwcmV0ZXIgPSBzZWxmLkFkZEZvdXJOdW1iZXJzVGVzdEludGVycHJldGVyTWFrZXIoCisgICAgICAgIFtbbnAuZmxvYXQzMigxKV0sIFtucC5mbG9hdDMyKDIpXSwgW25wLmZsb2F0MzIoMyldLCBbbnAuZmxvYXQzMig0KV1dKQorCisgICAgdGZsbV9pbnRlcnByZXRlci5pbnZva2UoKQorCisgICAgdGZsbV9vdXRwdXQgPSB0ZmxtX2ludGVycHJldGVyLmdldF9vdXRwdXQoMCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHRmbG1fb3V0cHV0WzBdLmFzdHlwZSgiZmxvYXQzMiIpLCAxMC4wKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodGZsbV9pbnRlcnByZXRlci5HZXRUZW5zb3IoMCwgMClbInRlbnNvcl9kYXRhIl1bMF0sIDEuMCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHRmbG1faW50ZXJwcmV0ZXIuR2V0VGVuc29yKDEsIDApWyJ0ZW5zb3JfZGF0YSJdWzBdLCAyLjApCisgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZmxtX2ludGVycHJldGVyLkdldFRlbnNvcigyLCAwKVsidGVuc29yX2RhdGEiXVswXSwgMy4wKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodGZsbV9pbnRlcnByZXRlci5HZXRUZW5zb3IoMywgMClbInRlbnNvcl9kYXRhIl1bMF0sIDQuMCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHRmbG1faW50ZXJwcmV0ZXIuR2V0VGVuc29yKDQsIDApWyJ0ZW5zb3JfZGF0YSJdWzBdLCA3LjApCisgICAgc2VsZi5hc3NlcnRFcXVhbCh0ZmxtX2ludGVycHJldGVyLkdldFRlbnNvcig1LCAwKVsidGVuc29yX2RhdGEiXVswXSwgOS4wKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwodGZsbV9pbnRlcnByZXRlci5HZXRUZW5zb3IoNiwgMClbInRlbnNvcl9kYXRhIl1bMF0sIDEwLjApCisKKyAgZGVmIHRlc3RHZXRUZW5zb3JBbGxVbmlxdWVUZW5zb3JzKHNlbGYpOgorICAgICIiIlRlc3QgY2hlY2tzIHRoYXQgR2V0VGVuc29yKCkgcmV0dXJucyBhbGwgdGhlIHRlbnNvcnMgaW4gdGhlIG1vZGVsLgorCisgICAgRHVlIHRvIHRoZSB2YWx1ZXMgdXNlZCBhcyBpbnB1dHMgYWxsIHRoZSBUZW5zb3JzIGhhdmUgdW5pcXVlIGRhdGEgdmFsdWVzIHNvCisgICAgdGhpcyB0ZXN0IGNvbmZpcm1zIHRoYXQgdGhpcyBpcyB0aGUgY2FzZS4KKyAgICAiIiIKKyAgICB0ZmxtX2ludGVycHJldGVyID0gc2VsZi5BZGRGb3VyTnVtYmVyc1Rlc3RJbnRlcnByZXRlck1ha2VyKAorICAgICAgICBbW25wLmZsb2F0MzIoMSldLCBbbnAuZmxvYXQzMigyKV0sIFtucC5mbG9hdDMyKDMpXSwgW25wLmZsb2F0MzIoNCldXSkKKworICAgIHRmbG1faW50ZXJwcmV0ZXIuaW52b2tlKCkKKyAgICB0ZW5zb3JzID0gWworICAgICAgICB0ZmxtX2ludGVycHJldGVyLkdldFRlbnNvcigwLCAwKVsidGVuc29yX2RhdGEiXVswXSwKKyAgICAgICAgdGZsbV9pbnRlcnByZXRlci5HZXRUZW5zb3IoMSwgMClbInRlbnNvcl9kYXRhIl1bMF0sCisgICAgICAgIHRmbG1faW50ZXJwcmV0ZXIuR2V0VGVuc29yKDIsIDApWyJ0ZW5zb3JfZGF0YSJdWzBdLAorICAgICAgICB0ZmxtX2ludGVycHJldGVyLkdldFRlbnNvcigzLCAwKVsidGVuc29yX2RhdGEiXVswXSwKKyAgICAgICAgdGZsbV9pbnRlcnByZXRlci5HZXRUZW5zb3IoNCwgMClbInRlbnNvcl9kYXRhIl1bMF0sCisgICAgICAgIHRmbG1faW50ZXJwcmV0ZXIuR2V0VGVuc29yKDUsIDApWyJ0ZW5zb3JfZGF0YSJdWzBdLAorICAgICAgICB0ZmxtX2ludGVycHJldGVyLkdldFRlbnNvcig2LCAwKVsidGVuc29yX2RhdGEiXVswXSwKKyAgICBdCisKKyAgICAjIENoZWNrIHRoYXQgYWxsIHRlbnNvcnMgYXJlIHVuaXF1ZQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNldCh0ZW5zb3JzKSksIDcpCiAKIAogY2xhc3MgQ29udk1vZGVsVGVzdHModGVzdF91dGlsLlRlbnNvckZsb3dUZXN0Q2FzZSk6CmRpZmYgLS1naXQgYS9weXRob24vdGZsaXRlX21pY3JvL3NpZ25hbC9CVUlMRCBiL3B5dGhvbi90ZmxpdGVfbWljcm8vc2lnbmFsL0JVSUxECmluZGV4IDJiZjVhOTQuLjBmY2UyNjYgMTAwNjQ0Ci0tLSBhL3B5dGhvbi90ZmxpdGVfbWljcm8vc2lnbmFsL0JVSUxECisrKyBiL3B5dGhvbi90ZmxpdGVfbWljcm8vc2lnbmFsL0JVSUxECkBAIC0xLDggKzEsMTAgQEAKK2xvYWQoIkBydWxlc19weXRob24vL3B5dGhvbjpkZWZzLmJ6bCIsICJweV9saWJyYXJ5IiwgInB5X3Rlc3QiKQogbG9hZCgiLy9weXRob24vdGZsaXRlX21pY3JvL3NpZ25hbDp0ZmxtX3NpZ25hbC5iemwiLCAicHlfdGZsbV9zaWduYWxfbGlicmFyeSIpCiBsb2FkKCIvL3RlbnNvcmZsb3c6ZXh0cmFfcnVsZXMuYnpsIiwgInRmbG1fc2lnbmFsX2ZyaWVuZHMiKQogbG9hZCgiQHRmbG1fcGlwX2RlcHMvLzpyZXF1aXJlbWVudHMuYnpsIiwgInJlcXVpcmVtZW50IikKIAogcGFja2FnZSgKKyAgICBkZWZhdWx0X3Zpc2liaWxpdHkgPSBbIjpfX3N1YnBhY2thZ2VzX18iXSwKICAgICBsaWNlbnNlcyA9IFsibm90aWNlIl0sCiApCiAKQEAgLTIxLDYgKzIzLDcgQEAKICAgICAgICAgIjpmaWx0ZXJfYmFua19vcHNfY2MiLAogICAgICAgICAiOmZyYW1lcl9vcF9jYyIsCiAgICAgICAgICI6b3ZlcmxhcF9hZGRfb3BfY2MiLAorICAgICAgICAiOnBjYW5fb3BfY2MiLAogICAgICAgICAiOnN0YWNrZXJfb3BfY2MiLAogICAgICAgICAiOndpbmRvd19vcF9jYyIsCiAgICAgXSwKQEAgLTMzLDcgKzM2LDcgQEAKICAgICAgICAgIm9wcy9fX2luaXRfXy5weSIsCiAgICAgXSwKICAgICBzcmNzX3ZlcnNpb24gPSAiUFkzIiwKLSAgICB2aXNpYmlsaXR5ID0gWyIvL3B5dGhvbi90ZmxpdGVfbWljcm8vc2lnbmFsL3V0aWxzOl9fc3VicGFja2FnZXNfXyJdLAorICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKICAgICBkZXBzID0gWwogICAgICAgICAiOmRlbGF5X29wIiwKICAgICAgICAgIjplbmVyZ3lfb3AiLApAQCAtNDEsNiArNDQsNyBAQAogICAgICAgICAiOmZpbHRlcl9iYW5rX29wcyIsCiAgICAgICAgICI6ZnJhbWVyX29wIiwKICAgICAgICAgIjpvdmVybGFwX2FkZF9vcCIsCisgICAgICAgICI6cGNhbl9vcCIsCiAgICAgICAgICI6c3RhY2tlcl9vcCIsCiAgICAgICAgICI6d2luZG93X29wIiwKICAgICBdLApAQCAtNTMsNiArNTcsOSBAQAogICAgIGNjX29wX2tlcm5lbHMgPSBbCiAgICAgICAgICIvL3NpZ25hbC90ZW5zb3JmbG93X2NvcmUva2VybmVsczpkZWxheV9rZXJuZWwiLAogICAgIF0sCisgICAgZGVwcyA9IFsKKyAgICAgICAgIi8vcHl0aG9uL3RmbGl0ZV9taWNyby9zaWduYWwvdXRpbHM6dXRpbCIsCisgICAgXSwKICkKIAogcHlfdGVzdCgKQEAgLTYzLDkgKzcwLDggQEAKICAgICBzcmNzX3ZlcnNpb24gPSAiUFkzIiwKICAgICBkZXBzID0gWwogICAgICAgICAiOmRlbGF5X29wIiwKLSAgICAgICAgIi8vcHl0aG9uL3RmbGl0ZV9taWNyby9zaWduYWwvdXRpbHM6dXRpbCIsCiAgICAgICAgIHJlcXVpcmVtZW50KCJudW1weSIpLAotICAgICAgICByZXF1aXJlbWVudCgidGVuc29yZmxvdy1jcHUiKSwKKyAgICAgICAgcmVxdWlyZW1lbnQoInRlbnNvcmZsb3ciKSwKICAgICBdLAogKQogCkBAIC03Niw2ICs4Miw5IEBACiAgICAgY2Nfb3Bfa2VybmVscyA9IFsKICAgICAgICAgIi8vc2lnbmFsL3RlbnNvcmZsb3dfY29yZS9rZXJuZWxzOmVuZXJneV9rZXJuZWwiLAogICAgIF0sCisgICAgZGVwcyA9IFsKKyAgICAgICAgIi8vcHl0aG9uL3RmbGl0ZV9taWNyby9zaWduYWwvdXRpbHM6dXRpbCIsCisgICAgXSwKICkKIAogcHlfdGVzdCgKQEAgLTg5LDkgKzk4LDggQEAKICAgICBzcmNzX3ZlcnNpb24gPSAiUFkzIiwKICAgICBkZXBzID0gWwogICAgICAgICAiOmVuZXJneV9vcCIsCi0gICAgICAgICIvL3B5dGhvbi90ZmxpdGVfbWljcm8vc2lnbmFsL3V0aWxzOnV0aWwiLAogICAgICAgICByZXF1aXJlbWVudCgibnVtcHkiKSwKLSAgICAgICAgcmVxdWlyZW1lbnQoInRlbnNvcmZsb3ctY3B1IiksCisgICAgICAgIHJlcXVpcmVtZW50KCJ0ZW5zb3JmbG93IiksCiAgICAgXSwKICkKIApAQCAtMTAyLDYgKzExMCw5IEBACiAgICAgY2Nfb3Bfa2VybmVscyA9IFsKICAgICAgICAgIi8vc2lnbmFsL3RlbnNvcmZsb3dfY29yZS9rZXJuZWxzOmZmdF9rZXJuZWwiLAogICAgIF0sCisgICAgZGVwcyA9IFsKKyAgICAgICAgIi8vcHl0aG9uL3RmbGl0ZV9taWNyby9zaWduYWwvdXRpbHM6dXRpbCIsCisgICAgXSwKICkKIAogcHlfdGVzdCgKQEAgLTExNSw5ICsxMjYsOCBAQAogICAgIHNyY3NfdmVyc2lvbiA9ICJQWTMiLAogICAgIGRlcHMgPSBbCiAgICAgICAgICI6ZmZ0X29wcyIsCi0gICAgICAgICIvL3B5dGhvbi90ZmxpdGVfbWljcm8vc2lnbmFsL3V0aWxzOnV0aWwiLAogICAgICAgICByZXF1aXJlbWVudCgibnVtcHkiKSwKLSAgICAgICAgcmVxdWlyZW1lbnQoInRlbnNvcmZsb3ctY3B1IiksCisgICAgICAgIHJlcXVpcmVtZW50KCJ0ZW5zb3JmbG93IiksCiAgICAgXSwKICkKIApAQCAtMTMwLDYgKzE0MCw3IEBACiAgICAgXSwKICAgICBkZXBzID0gWwogICAgICAgICAiLy9weXRob24vdGZsaXRlX21pY3JvL3NpZ25hbC91dGlsczpmcmVxX3RvX21lbCIsCisgICAgICAgICIvL3B5dGhvbi90ZmxpdGVfbWljcm8vc2lnbmFsL3V0aWxzOnV0aWwiLAogICAgIF0sCiApCiAKQEAgLTE0OSw5ICsxNjAsOCBAQAogICAgIHNyY3NfdmVyc2lvbiA9ICJQWTMiLAogICAgIGRlcHMgPSBbCiAgICAgICAgICI6ZmlsdGVyX2Jhbmtfb3BzIiwKLSAgICAgICAgIi8vcHl0aG9uL3RmbGl0ZV9taWNyby9zaWduYWwvdXRpbHM6dXRpbCIsCiAgICAgICAgIHJlcXVpcmVtZW50KCJudW1weSIpLAotICAgICAgICByZXF1aXJlbWVudCgidGVuc29yZmxvdy1jcHUiKSwKKyAgICAgICAgcmVxdWlyZW1lbnQoInRlbnNvcmZsb3ciKSwKICAgICBdLAogKQogCkBAIC0xNjIsNiArMTcyLDkgQEAKICAgICBjY19vcF9rZXJuZWxzID0gWwogICAgICAgICAiLy9zaWduYWwvdGVuc29yZmxvd19jb3JlL2tlcm5lbHM6ZnJhbWVyX2tlcm5lbCIsCiAgICAgXSwKKyAgICBkZXBzID0gWworICAgICAgICAiLy9weXRob24vdGZsaXRlX21pY3JvL3NpZ25hbC91dGlsczp1dGlsIiwKKyAgICBdLAogKQogCiBweV90ZXN0KApAQCAtMTc1LDkgKzE4OCw4IEBACiAgICAgc3Jjc192ZXJzaW9uID0gIlBZMyIsCiAgICAgZGVwcyA9IFsKICAgICAgICAgIjpmcmFtZXJfb3AiLAotICAgICAgICAiLy9weXRob24vdGZsaXRlX21pY3JvL3NpZ25hbC91dGlsczp1dGlsIiwKICAgICAgICAgcmVxdWlyZW1lbnQoIm51bXB5IiksCi0gICAgICAgIHJlcXVpcmVtZW50KCJ0ZW5zb3JmbG93LWNwdSIpLAorICAgICAgICByZXF1aXJlbWVudCgidGVuc29yZmxvdyIpLAogICAgIF0sCiApCiAKQEAgLTE4OCw2ICsyMDAsOSBAQAogICAgIGNjX29wX2tlcm5lbHMgPSBbCiAgICAgICAgICIvL3NpZ25hbC90ZW5zb3JmbG93X2NvcmUva2VybmVsczpvdmVybGFwX2FkZF9rZXJuZWwiLAogICAgIF0sCisgICAgZGVwcyA9IFsKKyAgICAgICAgIi8vcHl0aG9uL3RmbGl0ZV9taWNyby9zaWduYWwvdXRpbHM6dXRpbCIsCisgICAgXSwKICkKIAogcHlfdGVzdCgKQEAgLTE5OCwxMCArMjEzLDQyIEBACiAgICAgc3Jjc192ZXJzaW9uID0gIlBZMyIsCiAgICAgZGVwcyA9IFsKICAgICAgICAgIjpvdmVybGFwX2FkZF9vcCIsCi0gICAgICAgICIvL3B5dGhvbi90ZmxpdGVfbWljcm8vc2lnbmFsL3V0aWxzOnV0aWwiLAogICAgICAgICAiQGFic2xfcHkvL2Fic2wvdGVzdGluZzpwYXJhbWV0ZXJpemVkIiwKICAgICAgICAgcmVxdWlyZW1lbnQoIm51bXB5IiksCi0gICAgICAgIHJlcXVpcmVtZW50KCJ0ZW5zb3JmbG93LWNwdSIpLAorICAgICAgICByZXF1aXJlbWVudCgidGVuc29yZmxvdyIpLAorICAgIF0sCispCisKK3B5X3RmbG1fc2lnbmFsX2xpYnJhcnkoCisgICAgbmFtZSA9ICJwY2FuX29wIiwKKyAgICBzcmNzID0gWyJvcHMvcGNhbl9vcC5weSJdLAorICAgIGNjX29wX2RlZnMgPSBbIi8vc2lnbmFsL3RlbnNvcmZsb3dfY29yZS9vcHM6cGNhbl9vcCJdLAorICAgIGNjX29wX2tlcm5lbHMgPSBbCisgICAgICAgICIvL3NpZ25hbC90ZW5zb3JmbG93X2NvcmUva2VybmVsczpwY2FuX2tlcm5lbCIsCisgICAgXSwKKyAgICBkZXBzID0gWworICAgICAgICAiLy9weXRob24vdGZsaXRlX21pY3JvL3NpZ25hbC91dGlsczp1dGlsIiwKKyAgICAgICAgIi8vcHl0aG9uL3RmbGl0ZV9taWNyby9zaWduYWwvdXRpbHM6d2lkZV9keW5hbWljX2Z1bmNfbHV0IiwKKyAgICBdLAorKQorCitweV90ZXN0KAorICAgIG5hbWUgPSAicGNhbl9vcF90ZXN0IiwKKyAgICBzcmNzID0gWyJvcHMvcGNhbl9vcF90ZXN0LnB5Il0sCisgICAgZGF0YSA9IFsKKyAgICAgICAgIi8vcHl0aG9uL3RmbGl0ZV9taWNyby9zaWduYWwvb3BzL3Rlc3RkYXRhOnBjYW5fb3BfdGVzdDEudHh0IiwKKyAgICBdLAorICAgIHB5dGhvbl92ZXJzaW9uID0gIlBZMyIsCisgICAgc3Jjc192ZXJzaW9uID0gIlBZMyIsCisgICAgdGFncyA9IFsKKyAgICAgICAgIm5vYXNhbiIsCisgICAgICAgICJub21zYW4iLAorICAgICAgICAibm91YnNhbiIsCisgICAgXSwKKyAgICBkZXBzID0gWworICAgICAgICAiOnBjYW5fb3AiLAorICAgICAgICByZXF1aXJlbWVudCgibnVtcHkiKSwKKyAgICAgICAgcmVxdWlyZW1lbnQoInRlbnNvcmZsb3ciKSwKICAgICBdLAogKQogCkBAIC0yMTIsNiArMjU5LDkgQEAKICAgICBjY19vcF9rZXJuZWxzID0gWwogICAgICAgICAiLy9zaWduYWwvdGVuc29yZmxvd19jb3JlL2tlcm5lbHM6c3RhY2tlcl9rZXJuZWwiLAogICAgIF0sCisgICAgZGVwcyA9IFsKKyAgICAgICAgIi8vcHl0aG9uL3RmbGl0ZV9taWNyby9zaWduYWwvdXRpbHM6dXRpbCIsCisgICAgXSwKICkKIAogcHlfdGVzdCgKQEAgLTIyNSw5ICsyNzUsOCBAQAogICAgIHNyY3NfdmVyc2lvbiA9ICJQWTMiLAogICAgIGRlcHMgPSBbCiAgICAgICAgICI6c3RhY2tlcl9vcCIsCi0gICAgICAgICIvL3B5dGhvbi90ZmxpdGVfbWljcm8vc2lnbmFsL3V0aWxzOnV0aWwiLAogICAgICAgICByZXF1aXJlbWVudCgibnVtcHkiKSwKLSAgICAgICAgcmVxdWlyZW1lbnQoInRlbnNvcmZsb3ctY3B1IiksCisgICAgICAgIHJlcXVpcmVtZW50KCJ0ZW5zb3JmbG93IiksCiAgICAgXSwKICkKIApAQCAtMjM4LDYgKzI4Nyw5IEBACiAgICAgY2Nfb3Bfa2VybmVscyA9IFsKICAgICAgICAgIi8vc2lnbmFsL3RlbnNvcmZsb3dfY29yZS9rZXJuZWxzOndpbmRvd19rZXJuZWwiLAogICAgIF0sCisgICAgZGVwcyA9IFsKKyAgICAgICAgIi8vcHl0aG9uL3RmbGl0ZV9taWNyby9zaWduYWwvdXRpbHM6dXRpbCIsCisgICAgXSwKICkKIAogcHlfdGVzdCgKQEAgLTI1MCw4ICszMDIsNyBAQAogICAgIHNyY3NfdmVyc2lvbiA9ICJQWTMiLAogICAgIGRlcHMgPSBbCiAgICAgICAgICI6d2luZG93X29wIiwKLSAgICAgICAgIi8vcHl0aG9uL3RmbGl0ZV9taWNyby9zaWduYWwvdXRpbHM6dXRpbCIsCiAgICAgICAgIHJlcXVpcmVtZW50KCJudW1weSIpLAotICAgICAgICByZXF1aXJlbWVudCgidGVuc29yZmxvdy1jcHUiKSwKKyAgICAgICAgcmVxdWlyZW1lbnQoInRlbnNvcmZsb3ciKSwKICAgICBdLAogKQpkaWZmIC0tZ2l0IGEvcHl0aG9uL3RmbGl0ZV9taWNyby9zaWduYWwvb3BzL3BjYW5fb3AucHkgYi9weXRob24vdGZsaXRlX21pY3JvL3NpZ25hbC9vcHMvcGNhbl9vcC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTNlNzZiCi0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL3RmbGl0ZV9taWNyby9zaWduYWwvb3BzL3BjYW5fb3AucHkKQEAgLTAsMCArMSw3MCBAQAorIyBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworaW1wb3J0IHRlbnNvcmZsb3cgYXMgdGYKK2Zyb20gdGZsaXRlX21pY3JvLnB5dGhvbi50ZmxpdGVfbWljcm8uc2lnbmFsLnV0aWxzIGltcG9ydCB1dGlsCitmcm9tIHRmbGl0ZV9taWNyby5weXRob24udGZsaXRlX21pY3JvLnNpZ25hbC51dGlscyBpbXBvcnQgd2lkZV9keW5hbWljX2Z1bmNfbHV0X3dyYXBwZXIKKworZ2VuX3BjYW5fb3AgPSB1dGlsLmxvYWRfY3VzdG9tX29wKCJwY2FuX29wLnNvIikKKworUENBTl9TTlJfQklUUyA9IDEyCisKKworZGVmIF9wY2FuX3dyYXBwZXIocGNhbl9mbiwgZGVmYXVsdF9uYW1lKToKKyAgIiIiV3JhcHBlciBhcm91bmQgZ2VuX3BjYW4ucGNhbiouIiIiCisKKyAgZGVmIF9wY2FuKGlucHV0X3RlbnNvciwKKyAgICAgICAgICAgIG5vaXNlX2VzdGltYXRlLAorICAgICAgICAgICAgc3RyZW5ndGgsCisgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgICAgICBnYWluX2JpdHMsCisgICAgICAgICAgICBzbW9vdGhpbmdfYml0cywKKyAgICAgICAgICAgIGlucHV0X2NvcnJlY3Rpb25fYml0cywKKyAgICAgICAgICAgIG5hbWU9ZGVmYXVsdF9uYW1lKToKKyAgICB3aXRoIHRmLm5hbWVfc2NvcGUobmFtZSkgYXMgc2NvcGU6CisgICAgICBpbnB1dF90ZW5zb3IgPSB0Zi5jb252ZXJ0X3RvX3RlbnNvcihpbnB1dF90ZW5zb3IsIGR0eXBlPXRmLnVpbnQzMikKKyAgICAgIG5vaXNlX2VzdGltYXRlID0gdGYuY29udmVydF90b190ZW5zb3Iobm9pc2VfZXN0aW1hdGUsIGR0eXBlPXRmLnVpbnQzMikKKworICAgICAgaW5wdXRfYml0cyA9IHNtb290aGluZ19iaXRzIC0gaW5wdXRfY29ycmVjdGlvbl9iaXRzCisgICAgICBzbnJfc2hpZnQgPSBnYWluX2JpdHMgLSBpbnB1dF9jb3JyZWN0aW9uX2JpdHMgLSBQQ0FOX1NOUl9CSVRTCisgICAgICBpZiBzbnJfc2hpZnQgPCAxOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJTTlIgc2hpZnQgbXVzdCBiZSBub24tbmVnYXRpdmU6ICVkIiAlIHNucl9zaGlmdCkKKworICAgICAgbHV0ID0gd2lkZV9keW5hbWljX2Z1bmNfbHV0X3dyYXBwZXIud2lkZV9keW5hbWljX2Z1bmNfbHV0KAorICAgICAgICAgIHN0cmVuZ3RoLCBvZmZzZXQsIGlucHV0X2JpdHMsIGdhaW5fYml0cykKKworICAgICAgbHV0X3RlbnNvciA9IHRmLmNvbnZlcnRfdG9fdGVuc29yKGx1dCwgZHR5cGU9dGYuaW50MTYpCisKKyAgICAgIGRpbV9saXN0ID0gaW5wdXRfdGVuc29yLnNoYXBlLmFzX2xpc3QoKQorICAgICAgaWYgbGVuKGRpbV9saXN0KSAhPSAxOgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCJJbnB1dCB0ZW5zb3IgbXVzdCBoYXZlIGEgcmFuayBvZiAxIikKKyAgICAgIGRpbV9saXN0ID0gbm9pc2VfZXN0aW1hdGUuc2hhcGUuYXNfbGlzdCgpCisgICAgICBpZiBsZW4oZGltX2xpc3QpICE9IDE6CisgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIk5vaXNlIGVzdGltYXRlIG11c3QgaGF2ZSBhIHJhbmsgb2YgMSIpCisKKyAgICAgIHNucl9zaGlmdCA9IDYKKyAgICAgIHJldHVybiBwY2FuX2ZuKGlucHV0X3RlbnNvciwKKyAgICAgICAgICAgICAgICAgICAgIG5vaXNlX2VzdGltYXRlLAorICAgICAgICAgICAgICAgICAgICAgbHV0X3RlbnNvciwKKyAgICAgICAgICAgICAgICAgICAgIHNucl9zaGlmdD1zbnJfc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICBuYW1lPXNjb3BlKQorCisgIHJldHVybiBfcGNhbgorCisKKyMgVE9ETyhiLzI4NjI1MDQ3Myk6IGNoYW5nZSBiYWNrIG5hbWUgYWZ0ZXIgbmFtZSBjbGFzaCByZXNvbHZlZAorcGNhbiA9IF9wY2FuX3dyYXBwZXIoZ2VuX3BjYW5fb3Auc2lnbmFsX3BjYW4sICJzaWduYWxfcGNhbiIpCisKK3RmLm5vX2dyYWRpZW50KCJwY2FuIikKZGlmZiAtLWdpdCBhL3B5dGhvbi90ZmxpdGVfbWljcm8vc2lnbmFsL29wcy9wY2FuX29wX3Rlc3QucHkgYi9weXRob24vdGZsaXRlX21pY3JvL3NpZ25hbC9vcHMvcGNhbl9vcF90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MDBiZjMKLS0tIC9kZXYvbnVsbAorKysgYi9weXRob24vdGZsaXRlX21pY3JvL3NpZ25hbC9vcHMvcGNhbl9vcF90ZXN0LnB5CkBAIC0wLDAgKzEsODMgQEAKKyMgQ29weXJpZ2h0IDIwMjMgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2ltcG9ydCBvcworCitpbXBvcnQgbnVtcHkgYXMgbnAKK2ltcG9ydCB0ZW5zb3JmbG93IGFzIHRmCisKK2Zyb20gdGVuc29yZmxvdy5weXRob24ucGxhdGZvcm0gaW1wb3J0IHJlc291cmNlX2xvYWRlcgorZnJvbSB0ZmxpdGVfbWljcm8ucHl0aG9uLnRmbGl0ZV9taWNyby5zaWduYWwub3BzIGltcG9ydCBwY2FuX29wCitmcm9tIHRmbGl0ZV9taWNyby5weXRob24udGZsaXRlX21pY3JvLnNpZ25hbC51dGlscyBpbXBvcnQgdXRpbAorCisKK2NsYXNzIFBjYW5PcFRlc3QodGYudGVzdC5UZXN0Q2FzZSk6CisKKyAgX1BSRUZJWF9QQVRIID0gcmVzb3VyY2VfbG9hZGVyLmdldF9wYXRoX3RvX2RhdGFmaWxlKCcnKQorCisgIGRlZiBHZXRSZXNvdXJjZShzZWxmLCBmaWxlcGF0aCk6CisgICAgZnVsbF9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYuX1BSRUZJWF9QQVRILCBmaWxlcGF0aCkKKyAgICB3aXRoIG9wZW4oZnVsbF9wYXRoLCAncnQnKSBhcyBmOgorICAgICAgZmlsZV90ZXh0ID0gZi5yZWFkKCkKKyAgICByZXR1cm4gZmlsZV90ZXh0CisKKyAgZGVmIFNpbmdsZVBjYW5PcFRlc3Qoc2VsZiwgZmlsZW5hbWUpOgorICAgIGxpbmVzID0gc2VsZi5HZXRSZXNvdXJjZShmaWxlbmFtZSkuc3BsaXRsaW5lcygpCisgICAgYXJncyA9IGxpbmVzWzBdLnNwbGl0KCkKKyAgICBzdHJlbmd0aCA9IGZsb2F0KGFyZ3NbMF0pCisgICAgb2Zmc2V0ID0gZmxvYXQoYXJnc1sxXSkKKyAgICBnYWluX2JpdHMgPSBpbnQoYXJnc1syXSkKKyAgICBzbW9vdGhpbmdfYml0cyA9IGludChhcmdzWzNdKQorICAgIGlucHV0X2NvcnJlY3Rpb25fYml0cyA9IGludChhcmdzWzRdKQorCisgICAgZnVuYyA9IHRmLmZ1bmN0aW9uKHBjYW5fb3AucGNhbikKKyAgICBjaGFubmVsX251bSA9IGxlbihsaW5lc1sxXS5zcGxpdCgpKQorCisgICAgY29uY3JldGVfZnVuY3Rpb24gPSBmdW5jLmdldF9jb25jcmV0ZV9mdW5jdGlvbigKKyAgICAgICAgdGYuVGVuc29yU3BlYyhjaGFubmVsX251bSwgZHR5cGU9dGYudWludDMyKSwKKyAgICAgICAgdGYuVGVuc29yU3BlYyhjaGFubmVsX251bSwgZHR5cGU9dGYudWludDMyKSwKKyAgICAgICAgc3RyZW5ndGg9c3RyZW5ndGgsCisgICAgICAgIG9mZnNldD1vZmZzZXQsCisgICAgICAgIGdhaW5fYml0cz1nYWluX2JpdHMsCisgICAgICAgIHNtb290aGluZ19iaXRzPXNtb290aGluZ19iaXRzLAorICAgICAgICBpbnB1dF9jb3JyZWN0aW9uX2JpdHM9aW5wdXRfY29ycmVjdGlvbl9iaXRzKQorICAgIGludGVycHJldGVyID0gdXRpbC5nZXRfdGZsbV9pbnRlcnByZXRlcihjb25jcmV0ZV9mdW5jdGlvbiwgZnVuYykKKworICAgICMgUmVhZCBsaW5lcyBpbiBwYWlycyA8aW5wdXQsIG5vaXNlX2VzdGltYXRlLCBleHBlY3RlZD4KKyAgICBmb3IgaSBpbiByYW5nZSgxLCBsZW4obGluZXMpLCAzKToKKyAgICAgIGluX2ZyYW1lID0gbnAuYXJyYXkoW2ludChqKSBmb3IgaiBpbiBsaW5lc1tpICsgMF0uc3BsaXQoKV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPSd1aW50MzInKQorICAgICAgbm9pc2VfZXN0aW1hdGUgPSBucC5hcnJheShbaW50KGopIGZvciBqIGluIGxpbmVzW2kgKyAxXS5zcGxpdCgpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHR5cGU9J3VpbnQzMicpCisgICAgICBvdXRwdXRfZXhwZWN0ZWQgPSBucC5hcnJheShbaW50KGopIGZvciBqIGluIGxpbmVzW2kgKyAyXS5zcGxpdCgpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR0eXBlPSd1aW50MzInKQorICAgICAgIyBURkxNCisgICAgICBpbnRlcnByZXRlci5zZXRfaW5wdXQoaW5fZnJhbWUsIDApCisgICAgICBpbnRlcnByZXRlci5zZXRfaW5wdXQobm9pc2VfZXN0aW1hdGUsIDEpCisgICAgICBpbnRlcnByZXRlci5pbnZva2UoKQorICAgICAgb3V0cHV0ID0gaW50ZXJwcmV0ZXIuZ2V0X291dHB1dCgwKQorICAgICAgc2VsZi5hc3NlcnRBbGxFcXVhbChvdXRwdXRfZXhwZWN0ZWQsIG91dHB1dCkKKyAgICAgICMgVEYKKyAgICAgIG91dHB1dCA9IHNlbGYuZXZhbHVhdGUoCisgICAgICAgICAgcGNhbl9vcC5wY2FuKGluX2ZyYW1lLCBub2lzZV9lc3RpbWF0ZSwgc3RyZW5ndGgsIG9mZnNldCwgZ2Fpbl9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICBzbW9vdGhpbmdfYml0cywgaW5wdXRfY29ycmVjdGlvbl9iaXRzKSkKKyAgICAgIHNlbGYuYXNzZXJ0QWxsRXF1YWwob3V0cHV0X2V4cGVjdGVkLCBvdXRwdXQpCisKKyAgZGVmIHRlc3RQY2FuT3Aoc2VsZik6CisgICAgc2VsZi5TaW5nbGVQY2FuT3BUZXN0KCd0ZXN0ZGF0YS9wY2FuX29wX3Rlc3QxLnR4dCcpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgdGYudGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3B5dGhvbi90ZmxpdGVfbWljcm8vc2lnbmFsL29wcy90ZXN0ZGF0YS9CVUlMRCBiL3B5dGhvbi90ZmxpdGVfbWljcm8vc2lnbmFsL29wcy90ZXN0ZGF0YS9CVUlMRAppbmRleCA4N2ZkOWYyLi40YzhkN2JjIDEwMDY0NAotLS0gYS9weXRob24vdGZsaXRlX21pY3JvL3NpZ25hbC9vcHMvdGVzdGRhdGEvQlVJTEQKKysrIGIvcHl0aG9uL3RmbGl0ZV9taWNyby9zaWduYWwvb3BzL3Rlc3RkYXRhL0JVSUxECkBAIC0xNiw2ICsxNiw3IEBACiAgICAgImZpbHRlcl9iYW5rX3NxdWFyZV9yb290X3Rlc3QxLnR4dCIsCiAgICAgImZpbHRlcl9iYW5rX3NwZWN0cmFsX3N1YnRyYWN0aW9uX3Rlc3QxLnR4dCIsCiAgICAgImZyYW1lcl90ZXN0MS50eHQiLAorICAgICJwY2FuX29wX3Rlc3QxLnR4dCIsCiAgICAgInJmZnRfdGVzdDEudHh0IiwKICAgICAic3RhY2tlcl90ZXN0MS50eHQiLAogICAgICJ3aW5kb3dfdGVzdDEudHh0IiwKZGlmZiAtLWdpdCBhL3B5dGhvbi90ZmxpdGVfbWljcm8vc2lnbmFsL29wcy90ZXN0ZGF0YS9wY2FuX29wX3Rlc3QxLnR4dCBiL3B5dGhvbi90ZmxpdGVfbWljcm8vc2lnbmFsL29wcy90ZXN0ZGF0YS9wY2FuX29wX3Rlc3QxLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGRhNzcxCi0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL3RmbGl0ZV9taWNyby9zaWduYWwvb3BzL3Rlc3RkYXRhL3BjYW5fb3BfdGVzdDEudHh0CkBAIC0wLDAgKzEsMTM0OCBAQAorMC45NTAwMDAgODAuMDAwMDAwIDIxIDEwIDMKKzI4NiAyOTggMzA1IDI5MSAyOTAgMjc5IDI3MyAyNTcgMjUwIDI0MCAyNDAgMjMzIDIzNCAyMzAgMjIxIDIwNSAxODMgMTU5IDE1NiAxODggMjM5IDI5OCAzNDUgMzc0IDM4MCAzNjkgMzU5IDM2NCAzNzIgMzU0IDMwMiAyNDMgMTk0IDEzNSA2NCA3MiAxNzEgMjQ1IDI3NyAzMDQKKzczMTAgMTgzMDggNzc5NiAxNzg3OCA3NDEzIDE3MTQxIDY5NzggMTU3ODkgNjM5MCAxNDc0NSA2MTM1IDE0MzE0IDU5ODEgMTQxMzAgNTY0OSAxMjU5NCA0Njc3IDk3NjggMzk4NyAxMTU1MCA2MTA5IDE4MzA4IDg4MTkgMjI5NzcgOTcxMyAyMjY3MCA5MTc2IDIyMzYzIDk1MDkgMjE3NDggNzcxOSAxNDkyOSA0OTU5IDgyOTQgMTYzNiA0NDIzIDQzNzEgMTUwNTIgNzA4MCAxODY3NworMTMwMSA4MzYgMTM1NCA4MjcgMTMxMiA4MTEgMTI2MyA3NzkgMTE5MiA3NTMgMTE2MCA3NDMgMTE0MCA3MzggMTA5NiA2OTggOTU2IDYwNyA4NDUgNjY3IDExNTcgODM2IDE0NjEgOTEyIDE1NDYgOTA4IDE0OTYgOTA0IDE1MjcgODk1IDEzNDYgNzU4IDk5OSA1NDggMzc4IDM0NCA5MDggNzYxIDEyNzQgODQzCis2IDggOCAxMSAxMCA4IDUgNCA0IDIgNiA4IDExIDExIDEwIDExIDYgNyA1IDYgMTEgOCA5IDggNyA2IDYgMTEgMTQgMTIgMTEgMTEgMTEgOSA4IDkgOSAxMSAxMSA1Cis3MjgwIDE3NzAxIDc4MDUgMTc0ODEgNzQ4MyAxNjYwNCA2OTMxIDE1MDg3IDYzMzIgMTM5ODMgNjEzNSAxMzk0NiA2MTEyIDEzOTU4IDU3NjMgMTI1MTQgNDcxMyA5NjEyIDQwMTUgMTEyMjUgNjIzNyAxNzcwMSA4ODI4IDIyMDg5IDk2NDkgMjE2NzggOTEwMCAyMTY5NyA5NjI5IDIxMTgwIDc4MDcgMTQ3MDkgNTExNiA4MzQ5IDE3OTkgNDcxMCA0NDkxIDE0ODI0IDcxODQgMTc4NjMKKzMgMiA1IDQgOCAyIDIgMCAxIDAgMyAzIDEyIDUgMTAgNiA0IDMgMyAyIDEyIDIgNiAxIDMgMSAyIDMgMTMgNCAxMCA1IDEzIDYgMTEgOSAxMCA1IDEwIDAKKzggNSA5IDcgMTIgMTAgOSA3IDUgNCA0IDYgOCA4IDEyIDggOCAxMCA5IDggMTYgMTIgMTAgMTAgOSA3IDUgMTIgOSA5IDEyIDggMTAgMTEgMTAgMTEgMTAgOSA5IDcKKzczMDIgMTY5NDYgNzg0MCAxNjg2MiA3NjAyIDE2MjIyIDY5ODggMTQ2MTEgNjMwMSAxMzM4OSA2MDg0IDEzNDc3IDYxNjMgMTM2MTIgNTkyNSAxMjI1NCA0Nzk5IDk2NDkgNDE0NCAxMTA0MyA2NDkwIDE3Mzc2IDg4NjMgMjEzNzggOTYzOCAyMDgwNyA5MDAwIDIxMTMyIDk2MTggMjA0NjIgNzkxOCAxNDMxNyA1MjQzIDg1MjMgMjAwOSA1MTAzIDQ2MzQgMTQ0ODcgNzIzNCAxNzIyMQorNSAwIDYgMSAxMiA0IDcgMiAyIDAgMSAxIDYgMyAxNSAzIDcgNyAxMCAzIDI0IDUgNyAyIDUgMSAxIDQgNSAyIDEyIDIgMTEgOSAxNyAxMyAxMiAzIDcgMQorMTEgMTQgOCAxNyAxNCA3IDkgOCAzIDUgNyA2IDggMTAgNSAzIDQgMTQgMTQgNiAxMSAxMSAxMSAxMSA0IDExIDcgNyA5IDkgMTAgMTQgMTUgMTEgMTEgMTMgMTAgMTAgMTEgNgorNzQwMCAxNjc4OSA3ODQ4IDE2ODk0IDc3NzAgMTU2NzggNzA0MyAxNDIyNSA2MjIwIDEyODkyIDYxMTEgMTMwMzcgNjIxMyAxMzQwOSA1OTA0IDExNzAzIDQ3ODEgOTkzMCA0Mzk4IDEwNzQ5IDY2MDkgMTcwMDkgODkyMiAyMDc3MSA5NDk5IDIwMjM0IDg5NTQgMjAyOTQgOTYwNyAxOTc4NyA3OTc1IDE0MzE4IDU0OTUgODY4NyAyMjQwIDU1OTUgNDc3MyAxNDIzMiA3MzM0IDE2NTU2CisxMCA3IDUgMTEgMTYgMiA3IDMgMCAxIDQgMSA2IDUgMiAwIDEgMTMgMjQgMiAxMSA0IDkgMyAxIDMgMyAxIDUgMiA4IDkgMjQgOSAyMCAxOCAxMSA0IDEwIDEKKzYgOCAzIDUgNiA1IDcgOCA3IDggMTAgOSAxMCA2IDggNyA3IDEyIDEwIDggMTIgOCAxMyA5IDcgMTIgOSA5IDggMTMgMTAgMTIgMTcgMTIgOCA5IDggOSAxMCA4Cis3MzY4IDE2MjczIDc3MjggMTYxODcgNzcyOSAxNTA0NCA3MDQ2IDEzODYzIDYyNDMgMTI2MTAgNjIxNCAxMjgwNyA2MzEzIDEyOTczIDU5NjEgMTE0MzAgNDg0MCAxMDA3MSA0NTQzIDEwNTk1IDY3NTAgMTY0ODAgOTAzMSAyMDA3NyA5NDQwIDE5NzU3IDg5NjAgMTk2MjkgOTU3MSAxOTM5OCA4MDMxIDE0MTk2IDU3OTIgODkwMyAyMzg4IDU4MTIgNDg1OCAxMzkzMSA3NDA2IDE2MDU0CiszIDIgMCAxIDMgMSA0IDMgNCAzIDEwIDQgOSAxIDYgMiA1IDkgMTIgNCAxMyAyIDEyIDIgMyA0IDYgMiA0IDUgOCA2IDMwIDEwIDEwIDggNyAzIDggMgorNyA5IDExIDUgNSA3IDEwIDYgNSA3IDYgNCA3IDYgNSAxMCA5IDExIDEwIDExIDExIDYgOSA2IDEwIDggMTEgMTIgOSAxMiAxMSAxMyAxNSAxMSAxMCA5IDggMTEgMTEgOQorNzM2MyAxNTg0OSA3ODE2IDE1NTIzIDc2NjMgMTQ1NzEgNzEyNSAxMzM5OSA2MjE0IDEyMjgzIDYyMTIgMTIyODQgNjMzNCAxMjU2MyA1OTQwIDExMzU4IDQ5NDkgMTAxNDIgNDY4NSAxMDYzNSA2ODYyIDE1ODU5IDkwMzUgMTkyNDEgOTQ1OSAxOTA2MyA5MDE3IDE5MTg4IDk1NjIgMTg5NzEgODExMSAxNDE0MiA2MDMwIDkwNDQgMjU4NCA2MDE2IDQ5NDEgMTM3NzAgNzUwMiAxNTY0MworNCAzIDEwIDEgMiAyIDkgMSAyIDIgMyAwIDQgMSAyIDYgOSA4IDEyIDcgMTEgMSA2IDEgNyAyIDkgNCA1IDQgOSA4IDIzIDkgMTYgOCA3IDUgMTAgMworNyAxNSAxMyA3IDYgNyA2IDUgMTAgOSA0IDggNyAzIDkgMTEgNyA5IDUgNSAxMSAxMCA2IDUgOCA4IDEwIDE0IDkgNyA4IDExIDEzIDEzIDE2IDEwIDggOCA1IDUKKzczNTggMTU4MTkgNzk1MyAxNTAyMSA3NjI1IDE0MTI2IDcxMDAgMTI5MDIgNjMxNCAxMjA5OCA2MTU5IDEyMDM4IDYzNTQgMTE5OTMgNjAyMSAxMTM1MiA1MDA0IDEwMDg2IDQ2OTUgMTAzMDQgNjk3MSAxNTUyMSA4OTYyIDE4MzkzIDk0MjcgMTg0MTAgOTA0NyAxODg5NiA5NTUzIDE4MjYyIDgxMTMgMTM5NjkgNjIxMSA5MzAwIDI5MjggNjI2OSA1MDIyIDEzNDM1IDc0NDIgMTUwMTEKKzQgOSAxNCAyIDMgMiAzIDEgOSA0IDEgMyA0IDAgOCA3IDUgNSAzIDEgMTEgNCAyIDAgNCAyIDcgNiA1IDEgNSA1IDE3IDEyIDM5IDEwIDcgMyAyIDEKKzUgNyA1IDYgNSA1IDcgOSA4IDcgNCA0IDQgNCA3IDEwIDEyIDkgNSA2IDggNyA3IDYgNyA5IDYgOCAxMCAxMCAxMCAxNCAxMCAxMyAxMSAxMSA4IDkgNyA2Cis3MzAyIDE1Mjk5IDc4ODIgMTQ0ODggNzU2MiAxMzU4NSA3MTAxIDEyNjgwIDYzNjAgMTE4MDIgNjEwNyAxMTU2MSA2Mjk3IDExNTE5IDYwNDkgMTEyODUgNTE4NSAxMDAzMyA0NzA1IDEwMDU0IDcwMDEgMTUwMTkgODkxNyAxNzY1OCA5MzcwIDE3ODU4IDg5NzQgMTgyNTMgOTU3MCAxNzc4MCA4MTY2IDEzOTkxIDYzMTEgOTU0MCAzMTM2IDY1NjggNTEwMSAxMzE4MSA3NDM1IDE0NDc5CisyIDIgMiAxIDIgMSA0IDQgNiAyIDEgMCAxIDAgNSA2IDE2IDUgMyAyIDUgMiAzIDEgMyAyIDIgMiA3IDMgOCA5IDkgMTIgMTggMTEgNyA0IDQgMQorMyAxIDMgNSA0IDUgMTAgOCA2IDggMyAzIDIgNCA2IDYgNiA4IDcgNSA3IDggOCA1IDExIDEwIDEwIDExIDExIDYgOCAxMCA5IDExIDEyIDkgMTAgMTAgOSAxMAorNzE5NiAxNDQ0MiA3NzYxIDEzOTI1IDc0NzUgMTMwNzcgNzE3OSAxMjQxMCA2MzU0IDExNTg1IDYwMzEgMTEwNTEgNjE5MCAxMTA3MyA2MDUxIDEwOTc2IDUyMDggOTkyMiA0NzY2IDk3NTcgNzAwNSAxNDYwOSA4ODk4IDE2OTA1IDk0MTcgMTc0MDAgOTAwNSAxNzgzMyA5NjEyIDE3MDgxIDgxNjYgMTM3NjUgNjM4MyA5NjQzIDMzNjQgNjcyNiA1MjI5IDEzMDA0IDc0NzkgMTQyMjQKKzAgMCAwIDEgMSAxIDkgMyAzIDMgMCAwIDAgMCAzIDIgNCA0IDUgMSA0IDIgNCAwIDggMyA3IDQgOCAxIDUgNCA3IDggMjAgNyAxMSA1IDcgNAorNCA4IDYgMyA1IDkgNiA0IDYgNyA2IDggNCAzIDcgMTAgOCA3IDQgMyAxMCA4IDEzIDEwIDkgMTAgOSAxMiA5IDcgNyAxMCAxMSA4IDkgMTEgNyAxMSA3IDcKKzcxMTggMTQwNjcgNzcyMCAxMzI3MyA3NDE2IDEyODQ1IDcxNTMgMTE5MTEgNjM0OCAxMTMxOSA2MDMzIDEwODc5IDYxMzcgMTA1OTIgNjA3OCAxMDkzMSA1MjgyIDk3NTYgNDc0OSA5MzU1IDcwODUgMTQyMjMgOTAwOCAxNjUwNSA5NDExIDE2OTcwIDkwMTAgMTc1MDAgOTYwMiAxNjQ4NiA4MTQxIDEzNTUzIDY1MDQgOTU1NSAzNTEwIDY5OTggNTI3NyAxMjg5OSA3NDcxIDEzODAwCisxIDMgMyAwIDIgNCAzIDAgMyAyIDMgNCAxIDAgNSA2IDcgMyAxIDAgOSAzIDEyIDQgNSAzIDYgNSA1IDEgMyA0IDExIDQgMTEgMTEgNSA2IDQgMgorNyAxMyA5IDkgOCA4IDUgNCA1IDUgNCA2IDggNSA1IDYgNiA2IDcgNSA3IDggMTIgOSA0IDkgOCA2IDYgOCA1IDkgMTAgOSA5IDEwIDkgMTEgOCA2Cis3MTE5IDE0MDIxIDc3NTcgMTMwMjkgNzQzNSAxMjU2NSA3MTAyIDExNDQyIDYzMTcgMTA5NDcgNTk4NCAxMDU5NCA2MTg4IDEwMjYzIDYwNTQgMTA2NDMgNTMwMyA5NTM5IDQ4MDkgOTEwMCA3MDg3IDEzODYxIDkwODkgMTYwNjcgOTI3OCAxNjUwNCA4OTg5IDE2ODE4IDk1MTUgMTU5ODggODA2NSAxMzI5MiA2NTk3IDk1MzQgMzY1MiA3MTkyIDUzNzUgMTI4MDAgNzQ4OCAxMzM0MAorNCA4IDYgNCA1IDMgMiAwIDIgMSAxIDIgNiAxIDIgMiA0IDIgNSAxIDQgMyAxMCAzIDEgMyA0IDEgMiAyIDIgNCA5IDUgMTEgOSA5IDYgNSAxCis2IDcgMTAgOCAxMSAxNCA2IDcgOCA4IDYgNiAxMiA4IDYgNyA3IDUgNiA2IDExIDExIDggMTAgOSA5IDExIDkgMTAgMTIgMTIgOSAxNCAxNCAxNCAxNiAxMSA3IDggNworNzA5NCAxMzYwOSA3ODE4IDEyNzM4IDc1MzAgMTI2NzEgNzA3OCAxMTE4NSA2MzYzIDEwNzgxIDU5ODcgMTAzMjcgNjM0MCAxMDEzOCA2MDU2IDEwNDM0IDUzNDkgOTI3MyA0ODQyIDg5MjIgNzE5MSAxMzcwNSA5MDY2IDE1NzE3IDkyNzYgMTYwNjYgOTA0NSAxNjM2MSA5NTMzIDE1NzY2IDgxNzAgMTMwNDcgNjc5MCA5ODIyIDM5MTggNzc0MyA1NTIyIDEyNDYyIDc1MDUgMTI5NjkKKzMgMiA4IDMgMTAgMTAgMyAyIDYgNCAzIDIgMTQgNCAzIDMgNSAxIDQgMiAxMCA1IDQgNCA1IDMgOSAzIDcgNiAxMSA0IDE4IDEzIDI2IDIxIDEzIDIgNSAyCis3IDcgMyA0IDQgNiA2IDggOCA1IDUgNiA4IDYgNCA3IDYgOSAxMCA4IDYgOSAxNCAxMSA4IDEwIDkgMTQgMTAgOSAxMSA5IDExIDE2IDExIDkgMTAgOSA2IDYKKzcwOTUgMTMyMjIgNzY5OSAxMjIxOSA3NDQ0IDEyMjc5IDcwNTQgMTEwMDUgNjQwOCAxMDQ0MSA1OTY1IDEwMDc2IDYzODYgOTg5OCA2MDA3IDEwMjM4IDUzNjggOTI2OSA0OTc2IDg4NzggNzE2NCAxMzQzNSA5MTk3IDE1NDQ5IDkyNDggMTU3MTYgOTA0OSAxNjIzOSA5NTUwIDE1MzczIDgyNDcgMTI4MTcgNjkwMSAxMDIxNSA0MTAxIDc4MzEgNTYzOSAxMjI2NyA3NDcxIDEyNTU5Cis0IDIgMCAwIDEgMSAzIDMgNiAxIDIgMiA2IDIgMSAzIDQgNSAxMSA0IDMgNCAxNCA1IDQgNCA2IDcgNyAzIDkgNCAxMSAxNyAxNSA2IDEwIDQgMyAxCisxNSA4IDUgNiA4IDE1IDE1IDcgOCA3IDUgMyA1IDcgOSA5IDggNiA1IDcgNyAxMCAxNSA4IDYgMTEgOSAxMSA5IDEwIDggMTAgMTMgMTQgNyA2IDcgOCA5IDEwCis3MzAxIDEyOTIwIDc2MzQgMTE4NTQgNzQ2MiAxMjQ2MyA3MjYxIDEwNzc0IDY0NTIgMTAyNDQgNTk0MyA5NjU1IDYzNTQgOTczNCA2MDg3IDEwMTc2IDU0MzggOTA4MSA0OTc5IDg3NzUgNzE2NCAxMzI0MyA5MzUwIDE1MDEzIDkxNzAgMTU0NDggOTA1MyAxNTk0MCA5NTQxIDE1MDY1IDgyNDUgMTI2NjIgNzA2MSAxMDQ2MiA0MTc3IDc3MjkgNTY3NyAxMjAyMiA3NTE0IDEyNDE5CisyMCAzIDIgMiA1IDEyIDIwIDMgNiAzIDIgMCAyIDMgOCA1IDcgMiAyIDMgNCA1IDE2IDIgMiA1IDYgNSA1IDQgNSA1IDE1IDEyIDYgMyA1IDMgNyA1CisxMCA5IDYgMyA1IDkgMTMgMTEgNSAzIDEwIDggNiA0IDcgOSA5IDkgNSA1IDEwIDE1IDcgNyA4IDggNyA1IDggOSAxMCAxMSAxMSAxMSAxMiA5IDkgMTAgOSAxMAorNzM3NCAxMjY5NyA3NTk2IDExMzI3IDc0MDMgMTIyNjggNzQxMiAxMDgwMyA2NDE4IDk4MTMgNjA1MCA5NTY3IDYzNDggOTM5NSA2MTEzIDEwMTE4IDU1MzIgOTA4OSA0OTgyIDg1NTUgNzI0MCAxMzM3MCA5Mjk1IDE0NTQyIDkxNDUgMTUwMTIgOTAwNSAxNTI5MCA5NTA3IDE0NzE0IDgyOTQgMTI1NzggNzE2NSAxMDUxMCA0Mzc5IDc4MTggNTc2NSAxMTkxNSA3NTU2IDEyMjg4Cis4IDQgMyAwIDIgNCAxNCA3IDIgMCAxMCA0IDMgMSA0IDUgOCA2IDIgMSA4IDExIDMgMiA0IDIgMyAxIDQgMyA4IDYgMTAgNyAxOCA2IDggNSA3IDUKKzExIDggNyAxMiA4IDExIDkgNyA0IDcgOCA3IDYgMyA0IDQgOCA5IDggMTAgOSA5IDggMTIgMTIgOCA4IDEzIDEyIDYgOCA5IDExIDggOCA4IDggMTAgMTEgOAorNzQ3MSAxMjQyNiA3NTg1IDExMzg0IDc0MjIgMTIyMDcgNzQ1NyAxMDU4NCA2MzYwIDk2NTQgNjEwMyA5NDIzIDYzNDIgOTAxNSA2MDYyIDk3NTYgNTU5OCA5MDk2IDUwNjIgODY1NiA3Mjg5IDEzMTIwIDkyNjcgMTQ0MDYgOTIyMyAxNDYwMiA4OTg0IDE1MTcxIDk1NzYgMTQxOTkgODI5MSAxMjM3NiA3MjY3IDEwMzcwIDQ0NzQgNzg0MCA1ODI1IDExODE0IDc2NDggMTIwNDIKKzEwIDMgNCA4IDUgNiA3IDMgMSAzIDYgMyAzIDAgMSAxIDYgNiA3IDcgNyA0IDQgNiAxMCAyIDQgNyAxMCAxIDUgNCAxMCA0IDcgNSA2IDUgMTAgMworMTQgMTMgMTggOSAxMCA2IDYgNSA0IDYgNyA1IDMgNSA0IDQgOCAxMCA4IDEyIDEzIDEwIDcgNCA1IDEyIDE0IDkgMTMgOSAxMiA3IDkgMTMgMTAgOCAxMiA5IDkgOQorNzY0MiAxMjQ3OSA3ODU1IDExMjUzIDc0OTIgMTE4NDMgNzQyNCAxMDI1NiA2MzAzIDk0NDMgNjEyOSA5MTY0IDYyNjAgODc4MSA2MDEyIDk0MTYgNTY2MiA5MTY0IDUxNDAgODg3MyA3NDM5IDEyOTQ3IDkyMTQgMTM3ODcgOTEyMCAxNDQ2MyA5MTE3IDE0ODEzIDk2NjkgMTM5MDAgODM5MCAxMjA2MyA3MzE1IDEwNTQ2IDQ2MTcgNzg2MSA1OTg2IDExNjU4IDc2ODcgMTE4NzIKKzE2IDkgMjcgNCA4IDIgMyAxIDEgMiA0IDEgMCAxIDEgMSA2IDcgNyAxMCAxNCA1IDMgMCAxIDYgMTQgMyAxMSAzIDExIDIgNyAxMCAxMiA1IDE0IDQgNiA0CisxMCAxMiA1IDYgOCA3IDggOSAxMCA1IDcgNyA4IDcgNyA2IDcgMTMgNyAxMyAxMCA3IDcgNiA4IDEyIDExIDEyIDEzIDExIDE1IDE1IDkgOSA5IDggNyA3IDggNgorNzcwNiAxMjQ2NyA3Nzg2IDEwOTQ2IDc1MDkgMTE1NjIgNzQ0MyAxMDE5MyA2NDAxIDkxODMgNjE1NCA5MDQ0IDYzMDggODY4NCA2MDQwIDkyMTkgNTY5OSA5NDEyIDUxOTAgOTEzOSA3NTA4IDEyNjAwIDkxNjIgMTMzMjggOTA5NiAxNDMzMiA5MTcwIDE0NjYxIDk3NTkgMTM3NDEgODU2MyAxMjI2MCA3MzYyIDEwNDY2IDQ3MzEgNzg4MCA2MDE1IDExMzg4IDc2OTkgMTE1MjgKKzggNyAyIDIgNSAyIDUgNSA5IDEgNCAzIDYgMyA1IDIgNSAxMiA1IDEyIDggMiAzIDEgNCA2IDggNiAxMSA1IDE3IDEyIDcgNSA5IDUgNSAyIDUgMgorMTMgMTAgNiAxMSA4IDcgOSA3IDcgMTAgOSA1IDUgNCA3IDUgNSA2IDcgMTAgMTYgOCA5IDcgNyAxMiAxMiA4IDkgMTAgMTUgOCAxMCAxMCAxMSA4IDYgOCA5IDcKKzc4NDUgMTIzMzMgNzc0NSAxMDk2NSA3NTI2IDExMjk4IDc0ODcgMTAwMTEgNjQyMCA5MjQ2IDYyMzAgODgwOCA2Mjc4IDg0MDggNjA2OCA4OTczIDU2ODQgOTIxNSA1MjM5IDkyMDUgNzcyOSAxMjMzNSA5MTYzIDEyOTU4IDkwNDcgMTQyMDkgOTI0NyAxNDI3MiA5NzQ1IDEzNTMwIDg3MzIgMTIwMTUgNzQzMyAxMDQ1MiA0ODk0IDc4OTggNjAxOCAxMTE5NiA3NzM2IDExMjY2CisxNCA1IDMgNyA1IDIgNyAzIDQgNyA4IDEgMiAxIDUgMSAyIDIgNSA3IDIxIDMgNSAyIDMgNiAxMCAzIDUgNCAxNyAzIDggNiAxNCA1IDMgMyA2IDIKKzggNyA1IDExIDcgNyA2IDcgOSA3IDkgMTEgNiA3IDkgOCA1IDUgNyA3IDkgMTAgMTIgMTAgOSAxMCAxMCAxMSAxMSAxMCAxNCAxMCAxMSAxMSAxMCA5IDggNiA1IDUKKzc4NTMgMTIwMjMgNzY3OSAxMDk4MiA3NTE3IDExMDUwIDc0NTMgOTg0MCA2NDg5IDkxMjEgNjMwNCA4OTU1IDYyNzQgODMzMyA2MTQ2IDg5MjYgNTY2OSA4OTY5IDUyODcgOTA4MiA3NzY2IDEyMjA5IDkyNDEgMTI3OTQgOTA1MSAxMzk3MCA5MjcxIDE0MDkxIDk3ODIgMTMzMzIgODg3MSAxMTkwOCA3NTI4IDEwNTAwIDUwMjcgNzk3NyA2MDcyIDEwODkyIDc2NzAgMTA4OTcKKzUgMiAyIDcgNCAzIDMgMyA3IDMgOCA5IDMgMyA4IDQgMiAxIDUgMyA2IDUgMTAgNSA2IDQgNyA1IDggNSAxNCA1IDEwIDcgMTEgNiA2IDIgMiAxCisxMCA4IDUgOCA2IDQgMTEgOSA1IDEwIDExIDEyIDYgNSA5IDYgNCA4IDkgMTQgOSA5IDEyIDkgOCA2IDkgMTAgOSAxMSA5IDEzIDE0IDEzIDEwIDExIDkgOSA4IDcKKzc5MTIgMTE3OTMgNzYxNSAxMDgxNCA3NDgyIDEwNjMyIDc1NDggOTgwMiA2NDU0IDkxODggNjQyNyA5MTU0IDYyNzAgODE0MCA2MjIyIDg3NTkgNTYyOSA4OTIyIDUzODUgOTM5NyA3ODAyIDEyMDI5IDkzMTcgMTI1NzkgOTAyOSAxMzUwMCA5MjY5IDEzODU5IDk3NjcgMTMyMDcgODg3OSAxMTk5MiA3Njk3IDEwNjY4IDUxNTcgODE3NCA2MTUwIDEwNzkxIDc2ODMgMTA2NzMKKzggMyAyIDQgMyAxIDEwIDUgMiA3IDExIDEwIDMgMiA4IDIgMSA0IDkgMTQgNiA0IDEwIDQgNCAxIDUgNCA1IDYgNiA5IDE2IDEwIDExIDkgOCA1IDUgMworMTAgNyA4IDEwIDEyIDggOSAxMyA3IDUgNSA1IDUgNyA4IDUgNSA1IDggMTAgOSA3IDggNyAxMCA5IDkgMTEgOSA4IDggOSAxMSA3IDkgMTEgOSAxMCA5IDcKKzc5NzAgMTE1MTUgNzYyOSAxMDc3OSA3NjAxIDEwNDg1IDc1ODkgMTAwMTIgNjQ3MSA4OTQzIDYzOTQgODkxMSA2MjQxIDgwODEgNjI3MSA4NTQwIDU2MTYgODY5MyA1NDU1IDk0NDcgNzgzNyAxMTczNyA5Mjg4IDEyMjU0IDkwNTkgMTMyNDIgOTI2NyAxMzcwMyA5NzUzIDEyOTA2IDg4NjEgMTE4MjUgNzc4NiAxMDQ1OCA1MjU4IDgzNTkgNjIyNiAxMDc1NyA3NzIxIDEwNDYyCis4IDIgNSA2IDEyIDQgNiAxMSA0IDEgMiAxIDIgNCA2IDEgMiAxIDcgNyA2IDIgNCAyIDcgNCA1IDUgNSAzIDQgNCAxMCAzIDkgOSA4IDYgNiAzCis4IDcgMTEgMTAgMTIgNiAxMSAxMCA3IDEwIDUgNSAxMCA1IDYgOCA4IDcgOCA2IDggOSAxMSA2IDYgNyA1IDEyIDE0IDEwIDkgMTIgMTEgMTAgMTQgMTEgOCA1IDUgNworNzk3NSAxMTI1NCA3NzE5IDEwNzQ2IDc3MTggMTAyMjQgNzY4MCAxMDAyNSA2NDg4IDkwMjAgNjM2MiA4NjgzIDYzNDAgNzkwMyA2MjY3IDg1MTkgNTY4MCA4NjAxIDU1MjMgOTI0OCA3ODQ1IDExNTg1IDkzMzcgMTE4ODcgODk4NiAxMjg3NyA5MTYzIDEzNjE4IDk4NjcgMTI3NDYgODg2OSAxMTg1MiA3ODcyIDEwNDQ0IDU0ODQgODUzMyA2Mjc1IDEwNDE4IDc2NTYgMTAyNjQKKzUgMiAxMCA2IDEyIDIgMTAgNiA0IDcgMiAxIDkgMiAzIDUgNiAzIDYgMiA1IDQgOCAyIDIgMiAxIDcgMTMgNSA2IDggMTAgNiAyMSA5IDYgMSAyIDMKKzcgMTQgMTQgMTAgMTIgNyA2IDUgNiA2IDUgNCA2IDkgMTAgOCA5IDkgOSA1IDggNyA5IDggNiA4IDggOSAxMCA5IDggNyA5IDE0IDEyIDggOSA5IDYgOAorNzk1NCAxMTQzOCA3ODg0IDEwNzE1IDc4MzIgMTAwNDAgNzY0MSA5NzMwIDY0NzkgODg0NyA2MzMwIDg0MDcgNjMzNSA3OTgxIDYzNjYgODQ5OSA1NzY4IDg2MzcgNTYxNSA5MDAwIDc4NTMgMTEzMTkgOTMzMyAxMTY2NSA4OTE1IDEyNTk1IDkxMzggMTMzNTMgOTg3NiAxMjUzNCA4ODUyIDExNTcwIDc5MDUgMTA2NzcgNTY1MyA4NTEyIDYzNDggMTAzNDUgNzYxOCAxMDEzOQorNCAxMSAxNiA2IDEyIDMgMyAxIDMgMiAyIDEgMyA2IDkgNSA4IDYgOCAxIDUgMiA1IDMgMiAzIDQgNCA2IDQgNCAyIDYgMTIgMTUgNSA4IDUgMyA0Cis2IDggNyA1IDYgNiAzIDMgNyA1IDQgNCA3IDQgNSA3IDEwIDcgNyA0IDcgOCAxMiA4IDcgNyA2IDExIDE0IDExIDkgNyA5IDkgOCAxMCAxMSA4IDYgNgorNzkwOCAxMTI0MyA3ODY2IDEwMzc5IDc3ODkgOTgwNiA3NTI2IDkzMzAgNjQ5NiA4NjIzIDYyNzQgODE0OCA2MzU1IDc3NDcgNjMzNCA4NDE5IDU4NzkgODU0OCA1NjUzIDg3MDUgNzgzNSAxMTEzMSA5NDA2IDExNDU2IDg4NzEgMTIyNjkgOTA2MyAxMzIyNyA5OTg3IDEyNDU3IDg4NjEgMTEzMDUgNzkzNyAxMDU4OSA1NzE2IDg2MTUgNjQ3MCAxMDIxNSA3NTgxIDk4OTkKKzMgMyA0IDEgMyAyIDAgMCA0IDEgMSAxIDQgMSAyIDMgMTAgMyA1IDEgNCAzIDEwIDMgMyAyIDIgNiAxMyA2IDYgMiA2IDUgNiA3IDExIDQgMyAyCis1IDMgNyAxMCA3IDcgMTEgOCAxNCAxNiA5IDUgOSA0IDMgNiA5IDcgNSAxMCA3IDUgNyA4IDcgOCAxMCA5IDE1IDEwIDggNSAxMCAxMSAxMiAxMCAxMSA3IDcgNworNzgzOCAxMDc1MiA3ODQ4IDEwMzcwIDc3NzMgOTY0NyA3NjE5IDkyNjEgNjY5MSA5MDg4IDYzNDcgNzk2NiA2NDI2IDc1MjcgNjI1MiA4MjgyIDU5NjIgODQ2NSA1NjM5IDg3OTcgNzgxOCAxMDc3MCA5MzUwIDExMjYwIDg4MjggMTIwMjQgOTA5MiAxMjk4NiAxMDEyMSAxMjMyMyA4ODQ0IDEwOTMzIDc5OTQgMTA2MjkgNTg4MCA4NzEyIDY1ODkgMTAwMzIgNzU3MCA5NzM1CisyIDAgNCA2IDQgMyAxMCA0IDE4IDE5IDggMiA3IDEgMCAyIDggMyAyIDcgNCAxIDMgMyAzIDMgNyA0IDE1IDUgNCAxIDggNyAxNSA3IDExIDMgNCAzCis1IDcgOCA4IDEzIDE0IDEwIDcgOSAxMCA4IDUgNyA3IDYgMTIgMTAgNiA2IDEwIDkgNiA3IDggMTEgMTAgMTMgOCAxMCAxMCA4IDEyIDkgOSAxNSAxMSAxMCA5IDExIDkKKzc3NzAgMTA1MzYgNzg1NiAxMDIzOSA3OTExIDk5MjggNzY4NCA5MTM1IDY3NTQgOTE1NyA2MzkzIDc3OTUgNjQ0NCA3NTA1IDYyNDkgODUyMiA2MDY4IDgzMjUgNTY1MSA4ODgzIDc4NTIgMTA0OTIgOTI5NSAxMTA3NSA4ODg4IDExOTE2IDkxOTcgMTI2OTggMTAxMjMgMTIxOTggODgyNyAxMTAxNCA4MDI0IDEwNTQ0IDYxMTYgODg2NSA2NjgwIDk5ODMgNzY2MiA5NzAzCisyIDMgNSA0IDE0IDEzIDggMyA3IDcgNiAyIDQgNCAzIDExIDEwIDIgMyA3IDYgMiAzIDMgOSA1IDEyIDMgNiA1IDQgOCA2IDUgMjIgOSA5IDUgMTAgNQorNSA0IDYgNSA4IDUgMyA0IDUgOCAxMCA3IDExIDcgNyAxMSA4IDkgOSAxMiA4IDcgMTEgOSA3IDEyIDE0IDEwIDEwIDkgMTEgMTIgMTIgMTIgOSAxMSA4IDkgOSA1Cis3NzAzIDEwMTQ5IDc4MTMgOTkzMSA3OTE4IDk2MzkgNzU2OCA4ODMyIDY3MTMgOTA5OSA2NDg5IDc3NTcgNjU2NCA3NDg0IDYyNzEgODY4NiA2MTIxIDgzNzggNTczOSA5MDg3IDc4NjAgMTAyOTIgOTM0NCAxMDk2MyA4ODQ1IDExOTM4IDkzMjUgMTI1NTAgMTAxMjUgMTIwMTkgODg4NyAxMTA5MCA4MTMwIDEwNjQ4IDYxOTMgOTAwOCA2NzE3IDk5MzYgNzcwMCA5NDI4CisyIDEgMyAxIDUgMSAwIDEgMiA0IDkgNCAxMSA0IDQgOSA2IDYgOCAxMCA1IDMgOCA1IDMgOCAxNCA1IDYgNCA5IDggMTEgOSA4IDkgNiA1IDYgMQorMyA2IDQgMyA0IDMgMiAyIDMgNSAzIDQgMTAgMTAgNSA1IDEwIDcgOCA4IDggNyA4IDYgOCAxMCA1IDggMTAgMTMgMTAgMTIgMTAgOSA3IDcgOSAxMCA5IDYKKzc1ODcgOTkwOCA3NzIwIDk1MTkgNzgyMiA5MjQ0IDc0MzAgODQyNCA2NjIyIDg4NjAgNjQwMyA3NTM3IDY2NTUgNzY0OSA2MjQyIDg0NzIgNjIyMyA4MzA1IDU4MDAgOTAzMyA3ODY4IDEwMTA0IDkzMTUgMTA2NzMgODgyOCAxMTgzNiA5MjIwIDEyMjg4IDEwMTI3IDEyMDk2IDg5MjAgMTExNjEgODE4MiAxMDU2MiA2MjE3IDg4OTcgNjc3OSA5OTU0IDc3MzcgOTIzMAorMCAyIDEgMCAxIDAgMCAwIDAgMSAwIDEgOSA4IDIgMSAxMCAzIDYgNCA1IDMgNCAyIDQgNSAxIDMgNiA5IDcgOCA4IDUgNCAzIDcgNiA2IDIKKzUgOCA2IDEyIDEwIDYgNSAyIDMgNyA0IDIgNyA1IDggNSA5IDcgMTAgNyA1IDYgNiA4IDcgOSA4IDkgMTEgOCAxMCAxMCA4IDggOSAxMCA3IDExIDkgNQorNzUyNSA5ODA1IDc2ODAgOTY4NSA3ODgyIDkwNTggNzM3MiA4MDQxIDY1MzMgODc1OCA2MzQ1IDcyMDcgNjY2NyA3NDk3IDYyOTAgODI3MCA2Mjk3IDgyMzYgNTkxMCA4OTIxIDc3OTkgOTg2NiA5MjM1IDEwNTI0IDg3ODYgMTE2NzggOTE5NCAxMjEwMyAxMDE1NSAxMTg2MSA4OTUyIDExMTA1IDgxODIgMTA0MTkgNjI5MSA4OTc3IDY3ODggMTAwMzIgNzc3MyA4OTgzCisyIDQgMyAxMCA4IDIgMiAwIDAgMyAxIDAgNCAyIDYgMiA4IDMgMTAgMyAyIDIgMiA0IDMgNCA0IDQgOCAzIDcgNiA1IDQgOCA3IDQgOCA2IDEKKzUgMyAzIDUgMyA1IDkgNiA0IDQgNyA2IDEyIDYgMTAgMTAgMTAgNyAxMCAxMyAxMiAxMCA4IDcgMTEgOSAxMSAxMiA5IDcgMTQgMTIgOCAxMSAxMCAxMCA4IDcgOCA1Cis3NDY0IDk0MDEgNzU2NCA5NDExIDc3NjEgODgyMSA3NDE4IDc5MjcgNjQ3MiA4NDc4IDYzNjUgNzE0MyA2ODA3IDc0MTUgNjM4OCA4Mzg4IDYzOTUgODE3MSA2MDE4IDkxODQgNzkxMSA5ODg4IDkyMDggMTAzMjIgODg0NyAxMTUzMCA5MjQ1IDEyMTE0IDEwMTMxIDExNTc5IDkwODYgMTExNzUgODE4MiAxMDQ2OSA2Mzg5IDkwNTIgNjgyMyA5ODYwIDc3ODMgODc1MQorMiAwIDAgMSAwIDEgNyAzIDEgMSA0IDMgMTMgMyA5IDcgOSAzIDEwIDEyIDEyIDYgNCAzIDkgNCA4IDggNSAyIDE0IDggNSA3IDkgNyA2IDMgNSAxCisxMCA3IDQgNSA0IDMgMyA3IDQgNSA3IDkgOCA3IDUgNyA4IDExIDYgMTAgOSA4IDEwIDggMTEgMTAgMTIgMTEgMTAgMTAgMTIgMTAgNyA1IDYgMTAgMTAgNiA2IDUKKzc1MzMgOTI2NyA3NDc3IDkxNTMgNzY2OSA4NDc2IDczMDkgNzg4MSA2NDEyIDgyNzYgNjM4NSA3MjY3IDY4NDEgNzQwMCA2MzU2IDgzMTQgNjQzOSA4MzU2IDYwMjEgOTI0NyA3OTQzIDk3ODYgOTIzMyAxMDE5NCA4OTA3IDExNDUyIDkzMjAgMTIwNjMgMTAxMzMgMTE0OTggOTE2NSAxMTExOCA4MTU2IDEwMTQ4IDYzODIgOTEyMyA2OTA4IDk2MzcgNzc0MiA4NTMzCis4IDMgMSAxIDEgMCAwIDQgMSAyIDQgNyA1IDQgMiAzIDYgOSAzIDcgNiA0IDcgNCA5IDUgMTAgNiA2IDUgMTAgNiAzIDEgMyA3IDkgMiAzIDEKKzEwIDkgNCA2IDcgOCA4IDQgNyA3IDYgNSA1IDUgOCA2IDYgNiA0IDggNyA3IDkgOSAxMSAxMSAxNCAxNiAxNCA5IDExIDggNyA4IDEwIDkgMTAgOSA4IDcKKzc2MDAgOTI2MyA3MzkyIDg5NzIgNzY1NiA4NDU4IDczMzEgNzY1MyA2NDMwIDgyMDkgNjM3OCA3MTM4IDY3OTggNzI2MyA2NDAxIDgxODMgNjQzMSA4MjIzIDU5NzIgOTE4MyA3OTIzIDk2MjggOTIzMiAxMDEzNSA4OTY1IDExNDQwIDk0NDUgMTIzMjIgMTAyMzcgMTEzNjEgOTIxNyAxMDk0MiA4MTMxIDEwMDMwIDY0NzggOTEyOCA2OTkxIDk2MTEgNzc1MyA4NDUxCis4IDUgMSAyIDQgNSA1IDEgNCAzIDMgMiAyIDIgNiAyIDMgMiAxIDQgNCAzIDUgNSA5IDcgMTQgMTQgMTMgNCA4IDQgNCA0IDkgNiA5IDUgNSAzCisxMCAxMSA1IDggOSAxMyAxNCA4IDE1IDkgMTAgMTEgNyA5IDEwIDggNyA3IDggOSAxMyAxMCAxMiAxMiAxMyAxMyAxMyAxMyAxNiAxMCAxMCA3IDggMTEgMTIgOSAxMCAxMSAxMSA5Cis3NjY1IDkzODMgNzMzNSA4OTI1IDc2OTQgODc0OSA3NTA1IDc2ODUgNjY1MiA4MjY5IDY0NzQgNzM4NSA2ODA3IDczODAgNjQ5NiA4MTgzIDY0NDkgODE1OSA2MDI3IDkxODQgODA1NyA5NjY0IDkzMDggMTAyNjQgOTA3MyAxMTU1MiA5NTQxIDEyMzgxIDEwMzkwIDExMjkzIDkyNDIgMTA3MTUgODEzMiAxMDEwNCA2NjIzIDkxMzMgNzA3MiA5NzEwIDc4NDAgODQ5NgorOCA4IDIgNCA2IDEyIDE3IDUgMjEgNiA5IDEwIDQgNyA5IDUgNCAzIDYgNSAxMyA3IDEwIDkgMTIgOSAxMiA5IDE2IDYgNyAzIDUgOCAxMyA2IDkgOCAxMCA2Cis2IDYgNCA0IDUgMTAgMTEgMTAgOCA4IDUgNiA4IDkgNyA2IDggOCAxMCAxMCA3IDcgNyA3IDggOCA5IDcgOSA4IDkgMTAgOCAxMiAxMiA5IDEyIDEwIDcgOAorNzYyNyA5MTg4IDcyNTQgODYzNSA3NjI5IDg4MzggNzU5OCA3ODM4IDY2OTAgODI2NCA2NDQwIDczMTAgNjg0MSA3NDkwIDY1MTIgODA2MCA2NDkyIDgxNjAgNjEzMiA5MjQ3IDgwMzQgOTUxNCA5MjU0IDEwMDc4IDkwNTEgMTEzNTAgOTUzMiAxMjA2OCAxMDM2MCAxMTEwNiA5MjQxIDEwNjg2IDgxMzMgMTAyMzUgNjc2NCA5MTM3IDcyMDIgOTc0MSA3ODIzIDg0NzcKKzMgMiAxIDEgMiA3IDEwIDggNiA1IDIgMyA1IDcgNCAyIDYgNSAxMCA3IDQgMyAzIDMgNCAzIDUgMiA1IDMgNSA2IDUgOSAxMyA1IDEyIDYgNCA1Cis4IDExIDEzIDYgNCA3IDEwIDQgNSA2IDUgNyA3IDYgNSA2IDcgNSA3IDkgOCA2IDExIDggNyA4IDEzIDE0IDEzIDEzIDEwIDExIDExIDEzIDEyIDkgOSA5IDkgNworNzY0MSA5MzEyIDc0MDUgODQ4NSA3NTQwIDg3MzcgNzY2MyA3NjEzIDY2NTAgODEzNiA2NDA3IDczMDEgNjg0OSA3NDA5IDY0NzcgNzk0NSA2NTA4IDc5NzcgNjE1NyA5MjQ1IDgwMzcgOTMxMSA5MzA0IDk5NjQgOTAwMyAxMTE2MCA5NjI2IDEyMjA0IDEwNDMzIDExMjM4IDkyNjUgMTA3MjAgODIxMSAxMDQxOSA2OTAxIDkxNDEgNzI1MiA5NzA5IDc4NTcgODM5OAorNSA4IDE0IDIgMSAzIDggMSAyIDIgMiA0IDQgMyAyIDIgNCAyIDQgNSA1IDIgOCA0IDMgMyAxMSAxMCAxMSAxMCA3IDcgOSAxMSAxMyA1IDcgNSA2IDMKKzMgMSA4IDggNCAxMCAxNCA3IDUgMyA3IDUgNiA2IDUgMTAgNyA1IDEwIDkgNCAxMSA4IDEyIDE1IDExIDE2IDEyIDExIDE3IDEwIDEwIDExIDEyIDkgOSA5IDggNiA2Cis3NTI2IDg4MTQgNzQyNCA4NDY3IDc0NTQgODgyNyA3ODI5IDc1ODYgNjYxMSA3ODMyIDY0MjUgNzE3MCA2ODMxIDczMzMgNjQ0MyA4MDgyIDY1MjQgNzgwNSA2MjU4IDkyNDMgNzkzOCA5NDI4IDkyNzYgMTAxMDMgOTE2MSAxMTE2NiA5Nzk0IDEyMjA5IDEwNDUzIDExNjA4IDkyODkgMTA2OTEgODI4NyAxMDUzMSA2OTU4IDkxNDUgNzMwMSA5NjE3IDc4MTQgODI2MgorMCAwIDUgNSAxIDcgMTYgNCAyIDAgNCAyIDMgMyAyIDggNCAyIDEwIDUgMSA4IDQgOSAxNiA3IDE3IDggNyAxNyA3IDYgOSA5IDcgNSA3IDQgMyAyCiszIDMgNCA3IDcgMTYgOCA1IDUgMyA2IDYgNiA5IDYgMTAgMTMgOSA5IDEwIDUgNCA2IDggMTAgOSA5IDEwIDExIDEwIDggOSAxMCA4IDcgNyA4IDcgNyA2Cis3NDE0IDg0NjkgNzM0MCA4Mzg5IDc0NDYgOTI4MCA3ODM4IDc0MzggNjU3MyA3NTQ2IDY0MTcgNzEwOCA2ODEzIDc0NDUgNjQzNSA4MjExIDY2OTMgNzg4OSA2MzMxIDkzMDIgNzg2NyA5MTA4IDkxOTcgOTk4OCA5MTg3IDExMDQ5IDk3NzkgMTIwOTAgMTA0NzMgMTE1MjUgOTI2MSAxMDYwMiA4MzM1IDEwMzkwIDY5NjMgOTAyNiA3MzIzIDk0NzAgNzc5NyA4MTM0CiswIDAgMSAzIDQgMTggNSAyIDIgMCAzIDMgMyA3IDMgOCAxNiA2IDggNyAyIDEgMiA0IDcgNSA1IDUgNyA1IDQgNSA4IDQgNCAzIDUgMyA0IDIKKzYgNCA4IDkgMTEgMTAgMTMgOCA0IDYgNSA4IDYgNyAxMSAxNiAxMiA5IDEyIDEyIDkgNyA4IDkgNiA2IDcgMTEgOCA5IDYgNyA4IDcgOSA2IDYgNiA5IDYKKzczODIgODIwNiA3MzYxIDg0MzggNzU0MSA5MzM3IDc5NzQgNzQ4MyA2NTExIDc0NjEgNjM4NCA3MTczIDY3OTYgNzQyOCA2NTU1IDg3MDEgNjgzMiA3OTY4IDY0NzkgOTQ4MSA3OTAwIDg5OTEgOTE3MSA5OTQxIDkxMTEgMTA3NTQgOTcxMyAxMjA0MCAxMDQxNiAxMTM4NiA5MTgzIDEwMzk1IDgzMzEgMTAxOTYgNzAxOSA4ODUzIDcyOTMgOTI3MCA3ODMyIDgwMTQKKzMgMSA1IDYgMTAgNyAxNCA1IDEgMyAyIDUgMyA0IDExIDE5IDEzIDYgMTQgMTAgNiAzIDQgNSAyIDIgMyA2IDQgNCAyIDMgNSAzIDcgMiAzIDIgNiAyCisxMyAxMCAxMCA2IDkgNCA5IDEyIDUgMyA1IDggNSA3IDEwIDggNSA4IDEwIDkgMTEgMTAgNyAxMCAxMCAxMiA4IDEzIDEyIDEzIDEwIDYgNiA5IDggOCA3IDggOSA4Cis3NTMwIDgzMjggNzQzMiA4MzAwIDc1ODIgOTAyMiA4MDA1IDc3NzEgNjQ3NiA3MTk3IDYzNTIgNzIzNCA2NzU0IDc0MTIgNjY0NiA4NjcwIDY3ODkgNzk4MSA2NTcyIDk0NjUgNzk4MyA5MDY1IDkxMjAgOTk1OCA5MTM5IDEwODQ2IDk2NzUgMTIxMTYgMTA0NjIgMTE1MDEgOTIwOSAxMDEzOSA4Mjc2IDEwMTM3IDcwNDggODgxMyA3Mjg5IDkyMDUgNzg2NiA4MDI0CisxNCA4IDggMiA2IDEgNiAxMiAyIDAgMiA1IDIgNCA5IDQgMiA1IDkgNSAxMCA3IDMgNiA3IDkgNCA5IDkgMTAgNyAyIDIgNSA1IDQgNCA0IDYgNQorNSA1IDUgMyA2IDggMTEgOSA2IDggMTAgMTIgNyA1IDggNiAxMSAxMiA5IDkgNCA2IDYgNyA1IDggOSA5IDEwIDEwIDE0IDEwIDggOSAxMSAxMCAxMSA5IDkgNworNzQ2OSA4MTM1IDczNzQgNzk4NiA3NTQ2IDg5NzIgODA4NiA3ODU3IDY0NjcgNzI1NiA2NDQ5IDc1MzcgNjc2NCA3Mjc0IDY2ODQgODUxOCA2OTAwIDgyMzkgNjYzOCA5NDUwIDc4ODUgODg4OSA5MDQ1IDk3OTAgOTAzOCAxMDY4NiA5NjYzIDExOTQyIDEwNDU2IDExNDI1IDkzMzYgMTAxNDUgODI3MyAxMDA4MSA3MTUzIDg4OTggNzM4OCA5MjA1IDc4OTkgNzk3MgorMiAyIDIgMCAzIDQgOSA2IDMgNSA5IDEyIDQgMiA2IDIgMTEgMTEgNyA1IDEgMiAyIDMgMSA0IDUgNCA2IDUgMTQgNiA1IDUgMTAgNyAxMCA1IDYgNAorNCA0IDMgNyA2IDMgNSAzIDUgNyA1IDEwIDcgNSA3IDggMTAgOSA2IDkgNyA2IDExIDkgNyA4IDExIDExIDExIDkgMTMgMTEgNyAxMCAxMiAxMSAxMSA3IDYgNQorNzM4NCA3ODkyIDcyNjYgNzkzNiA3NTExIDg2MTggODAxMSA3NTY5IDY0MzMgNzI1MCA2NDE1IDc2OTkgNjc3NCA3MTQ0IDY2OTYgODQ5OCA2OTgzIDgyOTcgNjYyNSA5NDM1IDc4NjcgODcyNCA5MTAwIDk3NTUgODk5MSAxMDUzNiA5NzAyIDExOTAxIDEwNDc2IDExMjkyIDk0MzUgMTAyMTIgODI0NSAxMDA5MCA3MjgxIDkwMzkgNzQ4NCA5MDgyIDc4NTUgNzgwMAorMSAxIDAgNCAzIDAgMiAwIDIgNCAyIDggNCAyIDQgNSA5IDYgMyA1IDQgMiA4IDUgMyA0IDggNiA3IDQgMTIgOCAzIDYgMTIgOSAxMCAzIDMgMgorMTMgMTIgNiA2IDUgNCA2IDkgNSAzIDUgNCA0IDQgNiA2IDYgOSA4IDcgNyA2IDEwIDEzIDEwIDEyIDEwIDEyIDEwIDEyIDE0IDExIDEwIDkgOCAxMCAxMSA5IDggNgorNzUzMSA4MTU1IDcyMzcgNzgyOCA3NDUxIDgzNDYgNzk2NCA3NjY3IDY0MDAgNjk5OSA2MzgyIDc0ODIgNjcwNyA2OTYxIDY2ODIgODM1NiA2OTYyIDgzNTIgNjY2NCA5Mjk4IDc4NDkgODU2OSA5MTI4IDk5NjggOTAyMiAxMDY0MSA5NzE1IDExOTI0IDEwNDcwIDExMzUxIDk1NTcgMTAyNzUgODI5NCAxMDAzNyA3MzAzIDkxMTEgNzU3OCA5MDkwIDc4NjMgNzcwMAorMTQgMTEgMyAzIDIgMSAyIDYgMiAwIDIgMSAxIDEgMyAyIDMgNiA2IDMgNCAyIDcgMTEgNyA5IDcgOCA2IDggMTMgOCA4IDUgNSA3IDEwIDYgNSAzCis2IDExIDE2IDExIDUgNyA1IDcgNiA0IDQgNCA1IDMgNyA3IDcgNyA5IDggMTEgOSA2IDExIDYgMTIgMTAgOSAxMCAxMSAxMiAxMyA3IDkgOSAxMCAxMCA2IDcgNworNzQ5NiA4MzQxIDc0NjUgODAzNCA3MzkyIDgyNzUgNzg5MyA3NjM3IDYzOTMgNjgyNCA2MzI0IDcyNzggNjY2NyA2NzI3IDY2OTQgODI4NCA2OTY3IDgyODAgNjcyNyA5MjMxIDc5MzQgODYwNyA5MDUzIDEwMDQ1IDg5NTAgMTA3MzkgOTcyOCAxMTc2MSAxMDQ2NCAxMTM0NSA5NjI1IDEwNDU3IDgyNjUgOTk4NyA3MzUwIDkxNzggNzY0NCA4OTEzIDc4NDUgNzY2OAorMyA5IDIyIDkgMiAzIDIgNCAzIDEgMSAxIDIgMCA0IDMgNCAzIDcgNCAxMCA2IDIgOCAyIDkgNiA0IDYgNyAxMCAxMSAzIDUgNyA3IDggMiA0IDQKKzQgMyA1IDggNyAzIDUgNCA3IDcgNCA4IDExIDcgNSA2IDQgNiA2IDEwIDggNyA4IDggMTIgMTAgMTIgMTAgNyAxMyAxNCAxNCA3IDExIDEwIDggMTAgOSA5IDUKKzc0MTEgODAyNCA3NDA2IDgwNDMgNzM4NiA3OTYyIDc4MjMgNzQyNCA2NDEyIDY4NDQgNjI2OCA3MzMyIDY3ODEgNjc1MyA2NjU0IDgxNTUgNjg5NSA4MTUxIDY3MTIgOTI5MSA3OTQwIDg1MjAgOTAzMSA5OTMzIDkwMzMgMTA3MDkgOTc5MSAxMTY2OSAxMDM4MSAxMTQ2MyA5NzQyIDEwNjg5IDgyMzcgMTAwNjMgNzQyMiA5MTE4IDc3MDggODkzMSA3ODc5IDc1MTUKKzEgMCAyIDUgNCAwIDIgMSA0IDQgMSA1IDExIDQgMiAyIDEgMiAzIDcgNSAzIDQgNCAxMCA2IDEwIDUgMyAxMCAxMyAxMiAzIDggOCA0IDggNiA2IDIKKzUgMiA0IDYgNiA2IDUgMTAgMTAgNSA4IDEyIDkgNSA2IDUgNyA5IDkgOCA4IDcgOCA3IDkgMTEgMTAgOSAxNCAxMiA4IDExIDEwIDExIDEwIDcgOCA3IDEwIDgKKzczNTMgNzY2NSA3MzIzIDc5MjkgNzM1NCA3ODUyIDc3NTUgNzU5MiA2NTA3IDY3NDAgNjMxNiA3NjI5IDY4NDEgNjY1NSA2NjQxIDc5NzIgNjkwMSA4MjE0IDY3NzQgOTIyNSA3OTQ2IDg0MzggOTAxMCA5NzY3IDkwMzcgMTA3NDIgOTgwMiAxMTUyMSAxMDQ3OSAxMTUxMiA5NzAzIDEwNzIzIDgyODcgMTAxMzUgNzQ5MiA5MDAxIDc3MjAgODgyNSA3OTM3IDc1NTUKKzIgMCAxIDIgMyAzIDIgOCA5IDIgNiAxMiA3IDIgMyAyIDQgNiA3IDQgNSAzIDQgMyA2IDcgNiA0IDEyIDggNCA3IDggOCA4IDMgNSAzIDggNQorOSA1IDEwIDYgMiA0IDUgNSA5IDYgNiA4IDEyIDkgNSA4IDcgMTEgNyA2IDYgNSA1IDYgMTAgOSA4IDcgOSA5IDkgNyA5IDEyIDcgMTAgOSA4IDcgNworNzM5OSA3NTEyIDczOTUgNzgyMSA3MjIxIDc2MjYgNzY4OSA3NDQzIDY1NzQgNjcwNCA2MzExIDc2NjIgNjk3NiA2ODA4IDY2MDMgNzk4NSA2OTA3IDgzOTYgNjc4MyA5MDQwIDc5MDEgODIzOCA4OTEyIDk1NDkgOTA2NyAxMDY1MCA5NzYxIDExMjU5IDEwNDQ3IDExMzc0IDk2OTAgMTA1MDkgODMxMCAxMDI2NCA3NDgzIDkwNzUgNzc1NyA4Nzg3IDc5MTcgNzUzMQorNyAyIDggMyAwIDEgMiAyIDcgMyAzIDUgMTMgNyAyIDUgNCA5IDQgMiAzIDIgMSAyIDcgNSA0IDIgNSA0IDUgMyA2IDkgNCA3IDYgNCA0IDQKKzcgMTEgMTIgNCAyIDMgNCA1IDMgNiAxMSA4IDkgOSA4IDYgOCA5IDkgNiA0IDUgNiAxMCAxMiA4IDEwIDEwIDEwIDkgOSA5IDkgMTAgOSA5IDcgMTEgMTEgNgorNzM5MyA3NzM3IDc1MTcgNzU5NyA3MDkxIDczNTIgNzU5OSA3MzAzIDY0ODYgNjY3MCA2NDM0IDc2OTMgNzAzMSA2OTUyIDY2NDIgNzg3NCA2OTM5IDg0NDUgNjg0MyA4ODY2IDc4MDYgODA1MCA4ODQyIDk1OTAgOTE0NyAxMDUwMiA5NzcyIDExMTk3IDEwNDQxIDExMjQ0IDk2NzggMTA0MzEgODMzMiAxMDI2MiA3NTI2IDkwODMgNzc0MiA4OTM1IDgwMDAgNzQ0NworNCAxMCAxMiAxIDAgMCAxIDIgMCAzIDExIDUgNyA3IDYgMyA1IDYgNyAyIDEgMiAyIDcgMTAgNCA2IDYgNiA0IDUgNSA2IDYgNyA2IDQgOSAxMCAzCisxMiA2IDExIDkgNiA0IDYgNyA2IDEyIDkgNCA2IDkgNyA5IDYgOSAxMCAxMSA3IDUgMTQgMTIgOSA5IDkgMTAgOSA5IDExIDEzIDkgMTEgMTYgOSAxMCAxMCA5IDgKKzc1MTUgNzY0MSA3NjEwIDc2OTQgNzA2NyA3MTU2IDc1NjIgNzI5NCA2NDc3IDcwMDcgNjUwMyA3NDc3IDcwMDggNzA4NyA2NjU1IDc5NTQgNjkxOSA4NDkxIDY5MjcgOTAwOSA3NzkwIDc4NzQgODk3OSA5NzUxIDkxNDggMTA0MjQgOTc1OCAxMTEzOSAxMDQxMCAxMTEyMiA5NzE3IDEwNjAzIDgzNTQgMTAzMjIgNzc0NyA5MDkwIDc4MDQgOTAxMyA4MDMwIDc0OTEKKzEyIDMgMTAgNiAzIDEgMyA0IDMgMTMgNyAxIDMgNyA0IDYgMyA2IDkgOSA0IDIgMTQgMTAgNSA1IDUgNiA1IDQgOCAxMCA2IDggMjEgNiA4IDcgNiA1CisxMyA1IDUgMTMgNyA0IDMgOCA0IDExIDggNSAxMCAxMSA4IDkgOCA2IDkgNiA3IDcgMTIgMTMgMTIgOSAxMSAxMCA5IDEyIDExIDkgMTEgNyA4IDEwIDkgOSA4IDgKKzc2NTkgNzQ4OSA3NTQ3IDgwMzEgNzA2OSA2OTcyIDc0NDkgNzM0NyA2NDE3IDcyNjIgNjU0NSA3MzM1IDcwODggNzMzNyA2NjkzIDgwMjkgNjk1MCA4MzUwIDY5ODQgODgzNyA3Nzc0IDc4MzEgOTA2MSA5OTY0IDkyMjYgMTAzNTEgOTc5NSAxMTA4NSAxMDM4MCAxMTE5MSA5NzU1IDEwNTE5IDg0MjYgMTAxMzIgNzc1OCA5MTU4IDc4MzkgOTAyNSA4MDM0IDc1MzMKKzE0IDIgMiAxMyA0IDEgMCA1IDEgMTAgNiAyIDkgMTAgNiA2IDUgMiA3IDIgNCA0IDEwIDExIDEwIDUgOCA2IDUgOCA4IDUgOSAzIDUgNyA2IDYgNSA1Cis5IDggMTAgMTIgMTIgOCA0IDggNCA3IDYgOCA4IDYgOCAxMCA3IDggOCA1IDcgNyAxMiAxMSA4IDEwIDkgMTAgMTEgMTMgOSAxNSAxMCA5IDggMTEgMTAgNyA4IDgKKzc2OTcgNzUzMSA3NjE0IDgyODYgNzE5OSA3MDQ1IDczNjUgNzM5NyA2MzU5IDcyNTYgNjUzNCA3Mzg2IDcxMTUgNzI2NSA2NzMwIDgxNjEgNjk1NSA4MzQwIDcwMTQgODYxMyA3NzU4IDc3OTEgOTE0MSAxMDA0MSA5MjAwIDEwMzQ0IDk3ODAgMTEwMzQgMTA0MDIgMTEzMTggOTc0MSAxMDgwOSA4NDcxIDEwMDc3IDc3NjggOTI4NCA3ODk4IDg5MTMgODAzNyA3NTcyCis2IDUgOCAxMSAxMiA1IDEgNSAxIDQgMyA1IDUgMyA2IDggNCA1IDUgMSA0IDQgMTAgOCA0IDYgNSA2IDcgMTAgNSAxNCA3IDUgNSA4IDggMyA1IDUKKzYgMTIgMTUgMTIgOCA3IDUgNSAzIDUgMTAgNiA1IDEwIDUgNSA0IDYgMTQgMTAgOSAxMCA4IDYgOCA3IDggMTAgMTMgMTQgOSAxMyAxMSAxMyAxMiAxMiAxMCAxMCA5IDYKKzc2NTggNzgxNiA3ODA3IDg1MjYgNzIyMyA3MDUyIDczMDggNzI2MCA2Mjc2IDcxMjcgNjYyNiA3MzExIDcwNjUgNzQ0MyA2Njg5IDc5NzggNjg4MyA4MjA4IDcxOTYgODcxMCA3Nzk0IDc5MzcgOTExNyA5ODA3IDkxNzQgMTAxNTMgOTc0MCAxMDk4NiAxMDQ3NCAxMTQ5OSA5NzI3IDEwOTU5IDg1NDAgMTAyNzEgNzg4MCA5NDY0IDc5NTYgODk5MiA4MDY2IDc0ODYKKzMgMTIgMTggMTEgNSA0IDIgMiAwIDIgOSAzIDIgOCAyIDIgMSAyIDE3IDcgNiA4IDQgMiA0IDMgNCA2IDExIDExIDUgMTAgOSAxMSAxMiAxMCA4IDcgNiAzCis5IDEwIDE0IDEwIDUgNyA4IDcgMyA1IDggNyA3IDExIDEwIDcgNSA3IDYgNyA2IDcgMTAgNyAxMCA2IDkgMTUgMTQgOCA5IDEwIDkgMTMgOSA5IDcgNyA4IDcKKzc2OTYgNzk2MSA3OTY5IDg2MjggNzE3MCA3MDU4IDczMzAgNzI1NCA2MTk2IDcwMDYgNjY2NSA3MzAyIDcwNjcgNzY3MiA2Nzc3IDc5MjkgNjgzOCA4MTQ1IDcxNjkgODYxNyA3NzUyIDc4OTAgOTE0NSA5NjQ4IDkyMDAgOTkxMiA5NzI2IDExMjQ4IDEwNTcwIDExMzAwIDk3MTQgMTA5MTUgODU1NiAxMDQ1MyA3OTEzIDk0NDkgNzkzNiA4ODgyIDgwNjkgNzQ2NgorNiA4IDE2IDcgMiA0IDUgNCAwIDIgNiA0IDQgMTAgOSA0IDIgMyAzIDMgMyA0IDcgMyA3IDIgNSAxMyAxMiAzIDUgNiA2IDExIDYgNSA0IDMgNSA0CisxMCAxMyAxMiA5IDggMTQgMTAgMyA2IDUgOCA2IDcgOCA4IDcgOCA0IDQgOCA2IDkgMTAgNyAxMSA5IDEyIDExIDE1IDExIDEyIDggOSAxMCAxMCAxMSAxMiA3IDUgNgorNzc1OSA4MjgyIDgwNzYgODY2MyA3MTk1IDc0OTQgNzQwMiA3MDAzIDYxOTQgNjg5MiA2NzAzIDcyMzIgNzA2OSA3NzAzIDY4MTIgNzg4MyA2ODcxIDc5MDIgNzA5MiA4NTkxIDc3MTEgNzk2OSA5MTcyIDk0OTkgOTI1MSA5ODcwIDk3ODkgMTEyNDggMTA2ODkgMTEyOTcgOTc3OCAxMDc1MSA4NTcyIDEwNDQwIDc5NzEgOTU1NyA4MDQ0IDg3NzkgNzk5NSA3Mzg2Cis4IDEzIDExIDYgNSAxNyA4IDAgMyAyIDYgMyA0IDUgNiA0IDUgMSAxIDUgMyA2IDcgMyA4IDUgMTAgNyAxNCA3IDEwIDQgNiA2IDggOCAxMSAzIDIgMworMTUgMTIgMTEgNCA1IDcgNSA3IDggNCA2IDcgNyA1IDggNyA3IDggNiAxMSA4IDkgOCA3IDcgOCA3IDkgOCAxNCAxMiA4IDggOSAxMCAxMiA3IDggMTAgNworNzk0OCA4NTIyIDgxNTUgODM4OCA3MTQzIDc0NzQgNzM0NSA3MDEyIDYyNDMgNjcyNCA2Njg5IDcyMjggNzA3MSA3NTQ4IDY4NDYgNzg0MCA2ODc4IDc5MTkgNzA2OCA4NzUxIDc3MjMgODA0MyA5MTQ3IDkzNTkgOTE5OSA5NzY5IDk3MjMgMTExMjYgMTA2MjYgMTE0NzkgOTg0MCAxMDU5NyA4NTYyIDEwMzY2IDgwMjcgOTcyMCA4MDIyIDg3NDMgODA1MSA3MzcyCisxOCAxMSA5IDEgMiA0IDIgNCA2IDEgMyA0IDQgMiA1IDQgNCA1IDMgOSA1IDYgNCAzIDMgNCAzIDQgNCAxMSA5IDQgNSA1IDggMTAgNCA0IDggNAorMTQgOSA4IDMgOCAxMiA2IDUgMTMgOSA1IDQgNSA2IDEyIDEyIDggOCA3IDggOCA4IDEyIDEwIDYgNyA3IDEzIDExIDEyIDcgOSA4IDkgOCA5IDkgOCA5IDYKKzgxMDcgODU2MyA4MTU1IDgwNjkgNzE2OSA3NzYyIDczMTUgNjg5OCA2NDE5IDY4NzMgNjY0OSA3MDQwIDcwMjIgNzQ2MyA2OTgxIDgxMDYgNjkxMCA3OTM1IDcwNzAgODcxNyA3NzM0IDgwNTEgOTIyNSA5NDExIDkxMjIgOTYxMiA5NjU5IDExMjU3IDEwNjQxIDExNTI3IDk3NzMgMTA1MTQgODU1MiAxMDI5NyA4MDMxIDk2ODkgODA1MSA4NzA5IDgwODAgNzI5OAorMTYgNiA1IDAgNSAxMiAzIDIgMTYgNyAyIDEgMiAzIDEzIDExIDUgNSA0IDQgNSA1IDEwIDcgMiAzIDMgMTAgNyA4IDMgNSA1IDUgNSA1IDYgNCA2IDMKKzcgNiA2IDggOSAxNCA4IDUgMTQgNyA1IDEyIDggNCA3IDcgOCA2IDUgNSA2IDMgOCAxMCA1IDYgNiAxMSAxMCAxMyAxMCAxMSAxMyAxNCAxMSA5IDcgOSA3IDYKKzgwODMgODQxNyA4MTA0IDgwNzYgNzIyMCA4MTU2IDczMzYgNjc5MSA2NjE2IDY4OTAgNjYxMCA3MzU0IDcwNTEgNzI2MCA2OTg1IDgwNDkgNjk0MiA3ODI3IDcwMjEgODUwMSA3Njk0IDc3NTIgOTE5OSA5NDYwIDkwMjIgOTQwMyA5NTcxIDExMjU3IDEwNjMwIDExNjM0IDk3ODQgMTA1NTggODY3MCAxMDUzOSA4MTExIDk2NjAgODAyOCA4NzM5IDgwNTcgNzIyOAorNCAyIDIgNSA3IDE1IDUgMiAxOCA0IDIgMTIgNSAxIDQgNCA1IDMgMiAxIDMgMCA0IDcgMSAyIDIgNyA2IDkgNiA3IDEzIDEyIDkgNSA0IDYgNCAzCisxMiA2IDQgNyA5IDkgNiA2IDEwIDUgNCA3IDUgNiA5IDcgNCA4IDExIDggOSA2IDcgMTEgNiA2IDYgMTAgOSAxMiAxMiAxMiAxMyAxMiA4IDkgMTAgMTAgMTAgNgorODE4NyA4MjgwIDgwMDMgODAyMSA3MjY5IDgyMTkgNzMwNiA2NzUyIDY3MDYgNjc4MyA2NTQ3IDczNDIgNzAwMiA3MTkzIDcwNDAgNzk5NiA2ODcwIDc4NDggNzEyNiA4NDgyIDc3MzEgNzY1NSA5MTQ4IDk1NjggODk1MCA5MjA3IDk0ODUgMTExOTUgMTA1OTQgMTE2NzMgOTg0NiAxMDY2MSA4Nzg1IDEwNjQzIDgxMTMgOTYzMyA4MDgzIDg4MjkgODExMSA3MTYyCisxMSAyIDEgNCA3IDYgMyAzIDkgMiAxIDQgMiAzIDcgNCAxIDUgMTAgNSA2IDMgMyA4IDIgMiAyIDYgNSA4IDkgOSAxMiA5IDUgNSA4IDcgOCAzCis4IDcgNCAyIDQgNSAxMSA3IDUgNiA4IDYgNiA3IDYgNiAxMSA5IDggNyAxMCA3IDcgMTAgMTAgMTQgMTAgNiA4IDggOCAxMiAxMSAxMCA5IDYgNiA5IDcgNgorODE4NyA4MjEzIDc5MDUgNzY2MiA3MTg5IDgwMzMgNzQwNCA2Nzc2IDY2NjYgNjc0NCA2NTg4IDcyNzAgNjk4MCA3MTkxIDcwMTcgNzg4NCA2OTc5IDc5MzAgNzE1MiA4NDAzIDc3OTMgNzYyNSA5MDk4IDk2MDggODk4MiA5NTE0IDk1MDMgMTA4OTEgMTA1MzQgMTE0NjQgOTgwNCAxMDc1OCA4ODQ2IDEwNjE4IDgxNDAgOTQyMyA4MDM0IDg4NTIgODA4NyA3MTAwCis1IDMgMSAwIDEgMiAxMCA0IDIgMyA2IDMgMyA0IDMgMyAxMSA2IDUgMyA4IDQgMyA3IDcgMTQgNyAyIDQgMyA0IDkgOSA2IDYgMiAyIDYgNCAzCis5IDEyIDggMTEgNyA4IDYgNyAxMSA5IDcgNyAxMCAxMyAxMiAxMCA4IDEzIDEyIDExIDExIDEwIDEwIDUgNiAxNiAxMyAxMSAxMSAxMiA5IDcgMTUgMTMgMTEgOCA5IDggOCA3Cis4MjEyIDg0NTcgNzkxMiA3ODc4IDcxODggODA0MiA3MzcyIDY3OTkgNjc4MCA2ODkyIDY2MDIgNzI2MyA3MDYxIDc1NTggNzE0OCA4MDI1IDcwMDkgODI1MiA3MjgwIDg1NzQgNzg3OSA3NzgxIDkxMjYgOTMzOCA4OTExIDk5MjYgOTU5OCAxMDkxMyAxMDU1MiAxMTUxMyA5Nzg5IDEwNTQyIDkwMDggMTA3NzkgODIxNyA5MzQ5IDgwNjMgODgxMiA4MDg5IDcxMDQKKzYgMTEgNSAxMCA0IDUgMyA0IDExIDcgNCA0IDkgMTQgMTMgOCA1IDEzIDEyIDkgMTAgOCA3IDEgMiAxNyAxMSA3IDcgOCA1IDMgMTYgMTAgOSA0IDYgNCA1IDQKKzEzIDExIDEzIDEzIDggOSA3IDYgNiA0IDEwIDcgNCAxMSAxMSA4IDkgOSAxMSA5IDE1IDggOSAxNyAxMSAxNCA3IDkgMTEgOSAxMSAxMCAxMCAxMSA5IDEyIDEwIDYgMTAgOQorODMzOSA4NjI1IDgwNDYgODIwNCA3MjEzIDgxMTIgNzM2NiA2NzU5IDY3NjQgNjcyNCA2NjkyIDcyNTcgNjk4NiA3NzgwIDcyNTAgODAzNSA3MDY0IDgzMDkgNzM3OSA4NjEyIDgwNjUgNzgwNSA5MTI4IDk4MjIgODk2OSAxMDE5MCA5NTM3IDEwODExIDEwNTY5IDExMzc1IDk4MjUgMTA1MjMgOTAzOCAxMDgwOCA4MjQxIDk1MjUgODExNyA4NjUxIDgxNDIgNzIzMAorMTMgOSAxMyAxMyA1IDYgNCAzIDMgMSA5IDQgMSAxMCAxMCA1IDcgNiAxMCA2IDE4IDUgNiAyMCA5IDEzIDMgNSA3IDQgOCA2IDcgNyA2IDEwIDggMiA4IDcKKzYgNyA5IDUgNSA5IDcgNSA4IDQgNSA1IDkgMTEgOSAxMSAxMiA3IDYgNyA5IDYgMTEgMTQgOCA4IDEwIDEyIDEzIDkgOCA5IDExIDEzIDExIDEwIDkgNSA4IDYKKzgyODQgODUzNyA4MDc1IDgwMTggNzE2MCA4MTc4IDczNjEgNjY2MCA2Nzk5IDY1NjYgNjY1MiA3MTI4IDcwNDEgNzk4OSA3Mjk5IDgyMjggNzE5NCA4MjQwIDczNDggODUyNSA4MDkzIDc3MDUgOTE4MSAxMDA5MiA4OTQ5IDEwMDcwIDk1NTQgMTA4OTkgMTA2MzcgMTEyNDUgOTc4NCAxMDQ0NCA5MDkzIDEwOTU4IDgzMTYgOTU2NyA4MTQ0IDg0MzkgODE0MyA3MTY0CisyIDMgNiAyIDIgNiA0IDIgNiAxIDIgMiA3IDEwIDcgOSAxMiAzIDMgMyA2IDMgOCAxMyA0IDQgNyA5IDEwIDQgNCA1IDkgMTAgOSA3IDYgMSA1IDMKKzUgMTEgOCAyIDQgNyA2IDEwIDggNiA4IDExIDEwIDEwIDEwIDYgOCAxMSAxMCA2IDcgOSA5IDYgOSA4IDcgOSAxMCAxNSAxMiAxMyAxMCAxMSAxMSA4IDcgOSA4IDcKKzgyMDUgODcwMCA4MDc3IDc2NTkgNzA4MyA4MTE3IDczMzAgNjg3NCA2ODMzIDY1NDAgNjY5MCA3Mzc2IDcxMjAgODEyNCA3MzcyIDgxMDIgNzIxOCA4NDIxIDc0MjAgODM4MiA4MDY5IDc3OTUgOTE4MSA5ODU1IDg5NTUgOTk1NyA5NDk0IDEwNzk4IDEwNjI3IDExNDkxIDk4NDYgMTA2MTYgOTEyMSAxMDk3NiA4Mzg5IDk0ODQgODExOSA4NDg1IDgxNDQgNzE2NAorMiA5IDUgMCAxIDQgMyA5IDUgMyA2IDEwIDkgOCA4IDIgNSA5IDggMiA0IDYgNSAyIDYgNCAzIDUgNiAxMyA5IDEwIDcgNyA5IDQgNCA2IDUgNAorMTQgMTMgNiA3IDQgNiA5IDYgNSA2IDUgOCA3IDQgOCA2IDQgNiAxMCAxMyA2IDggMTAgNiA4IDkgMTAgMTIgMTEgMTEgMTMgMTEgMTMgMTMgMTEgNyA2IDggOSA4Cis4MzU4IDg5NzYgODAyOCA3NjI5IDcwMDggNzk5OCA3Mzc3IDY4MzAgNjc5MCA2NTE2IDY2NTAgNzQyNCA3MTIxIDc4ODIgNzM5MiA3OTg0IDcxNDAgODI4NCA3NDkwIDg2NzcgODAyMCA3ODE4IDkyMDcgOTYzMiA4OTM1IDk5MTIgOTUxMiAxMDg4NyAxMDY0MiAxMTQ3NyA5OTMyIDEwNjU0IDkyMjUgMTExMTYgODQ2MCA5MzQ1IDgwNjkgODQ2NyA4MTcwIDcyMjUKKzE1IDEyIDIgNCAxIDIgNyAzIDIgMyAyIDUgNCAxIDUgMiAxIDIgOCAxMyAyIDUgNyAyIDQgNSA3IDkgNyA3IDExIDcgMTIgMTAgOSAzIDIgNSA2IDUKKzcgOCAxMCA2IDQgOCAxMSA1IDYgNCA1IDQgNiA4IDUgNiA5IDYgNCA3IDggMTEgOSA2IDggMTAgMTUgMTMgOSAxMSAxMiAxMCA5IDEyIDggMTAgOSA5IDkgOQorODMyOCA4OTI4IDgwODMgNzUzOSA2OTM1IDgwMDkgNzQ3NCA2NzI3IDY3NzMgNjM3MCA2NjExIDcyMjQgNzA5NiA3OTAwIDczMzUgNzg3MyA3MTkxIDgxNTUgNzQwNSA4NTg2IDgwMjQgODAyNCA5MjA3IDk0MjIgODkxNiA5OTMxIDk2NTcgMTEwMzIgMTA2MDYgMTE0NjQgOTk5MCAxMDYyOSA5MjI0IDExMTg2IDg0NTMgOTM5OCA4MDk3IDg1MTEgODE5NiA3MzQ0CiszIDQgOCAzIDEgNSAxMCAyIDMgMSAyIDEgMyA1IDIgMyA3IDIgMSAzIDUgOSA1IDIgNCA2IDE1IDEwIDUgNyA5IDYgNSA4IDUgNyA2IDYgNiA3Cis1IDQgNCAzIDcgOCA3IDYgNCA1IDcgMyA1IDQgOSAxMSAxMiA1IDUgNiA3IDEwIDEwIDExIDEwIDEwIDYgMTAgMTAgMTMgMTAgOSAxMiAxMSAxMiA4IDggMTAgNiA3Cis4MjQ3IDg2MzggNzk4MyA3MjcwIDY5NDAgODAxOSA3NDY2IDY2OTIgNjcwNiA2Mjk1IDY2MjQgNjk3NCA3MDQ2IDc2NzEgNzM4MSA4MDc2IDczMTggNzk3MiA3MzQ3IDg0MzkgODAwMiA4MTU2IDkyMzIgOTUzMiA4OTQ5IDk5NDkgOTU2OSAxMDk4NCAxMDU5NiAxMTU3NCA5OTk2IDEwNTQ0IDkzMDAgMTExOTAgODU0OCA5MzI1IDgwOTkgODYxNCA4MTQ0IDczMzMKKzIgMSAxIDAgNCA1IDQgMyAxIDIgNCAwIDIgMSA3IDkgMTIgMiAyIDIgNCA4IDcgOCA3IDYgMiA2IDYgOSA2IDUgMTAgNyAxMSA0IDUgNyAyIDQKKzYgNCA2IDMgNiA3IDggNyAxMyAxNSAxMCA0IDcgOSAxMCA3IDcgNyA4IDggNiA5IDExIDkgNiAxMiAxMSAxMCA5IDEwIDEyIDE1IDE0IDExIDExIDExIDkgMTAgOCA3Cis4MTk0IDgzNjUgNzkzNyA3MDE4IDY5MjAgNzk2NyA3NDg0IDY3MjAgNjg3MCA2ODM4IDY3MTQgNjgwMSA3MDQ5IDc3NjMgNzQ1MiA4MDIxIDczMTQgNzkyMyA3MzY4IDg0MjQgNzk1NSA4MjE5IDkyODIgOTUxMyA4ODc4IDEwMDg5IDk2MTEgMTA5MzkgMTA1NjEgMTE0OTMgMTAwNTMgMTA4MzIgOTQyNSAxMTE5NCA4NjE1IDk0NDEgODEyNiA4NzExIDgxNDUgNzMyMworMiAxIDIgMCAzIDQgNSA0IDE1IDIxIDkgMSA0IDYgOCA0IDQgNCA1IDUgMiA2IDggNSAyIDkgOCA2IDUgNSA5IDE0IDE0IDcgOSA4IDYgNyA1IDQKKzggNiA3IDcgNyA1IDEwIDEwIDEwIDkgMTEgNiA5IDEyIDExIDYgNSA3IDYgNiA0IDUgNyA2IDkgOSAxMiAxMSAxMCAxMCAxMiAxNCAxNCAxMCAxMCA4IDkgOSA3IDYKKzgxOTMgODIzMSA3OTE3IDcwMjYgNjkyNiA3Nzk2IDc1NTIgNjkzMSA2OTU0IDY5ODAgNjgyNyA2NzYxIDcxMDMgODAzNCA3NTQ3IDc5MDggNzI1OSA3ODc3IDczMzcgODI4NyA3ODU4IDgwMzMgOTIyOSA5MzEwIDg4ODYgMTAwMzYgOTY3NyAxMDk1OCAxMDU1MiAxMTQxNyAxMDEwOCAxMTA0MiA5NTQ3IDExMTM2IDg2NTUgOTM2NiA4MTUzIDg3NDEgODEyMCA3MjUyCis1IDIgNCA0IDQgMiA4IDkgOSA3IDExIDMgNyAxMSAxMCAzIDIgNCAzIDIgMSAyIDMgMiA2IDUgMTAgNyA2IDUgOSAxMiAxMyA2IDcgNCA2IDYgNCAzCis3IDEyIDggNiA3IDYgMTEgNyAzIDYgOSAxMCA3IDggOSA1IDcgNSAzIDggNyA2IDEyIDEwIDcgMTIgMTEgOCA5IDggMTQgMTIgMTIgOCAxMCA5IDEwIDEwIDYgNQorODE2NyA4NDc0IDc5MjMgNjk3MyA2OTMyIDc2OTYgNzY0NCA2OTQ1IDY4NTcgNjkyOSA2ODg2IDY5NjkgNzEwNCA4MDQzIDc1ODggNzc0MCA3MjU2IDc3MTEgNzIzMCA4MjgxIDc4NDAgNzkxOSA5MzA1IDkzNjUgODg0MyAxMDE3MSA5NzE2IDEwNzkyIDEwNTE4IDExMjIzIDEwMjEzIDExMTE2IDk2MTUgMTA5NTkgODY5NCA5MzU3IDgyMDUgODgzMCA4MDcwIDcxMjQKKzMgMTEgNSAzIDQgMyAxMCA0IDAgMyA3IDkgNCA1IDYgMiA0IDIgMCA1IDQgMyAxMCA3IDMgOSA4IDQgNSAzIDEzIDggMTAgMyA3IDUgOCA3IDIgMgorOCAxMiA4IDEzIDE0IDUgMyA1IDggMTAgNyA2IDUgNyA1IDYgNyA1IDYgNiA0IDUgNiA2IDkgMTEgMTAgMTEgMTIgMTMgMTAgMTAgMTAgMTMgMTAgMTAgOCA5IDcgNQorODE2NyA4NzAyIDc5MjkgNzM1MyA3MTE2IDc1NDEgNzUyOSA2ODM1IDY4OTAgNzEyNyA2ODkzIDY5MTkgNzA1NCA3OTkwIDc1MjYgNzY0NCA3MjUzIDc1NTUgNzIwMiA4MTUyIDc3NDYgNzc1MSA5MjI2IDkxNzEgODg1MiAxMDIzNiA5NzI5IDEwODIwIDEwNTYyIDExMzQ4IDEwMjEzIDExMDYzIDk2MzAgMTExMDAgODczMiA5NDA5IDgyMDQgODg1MyA4MDQ3IDcwMDMKKzUgMTEgNSAxNCAxNyAyIDAgMiA1IDkgNCAzIDIgNCAyIDMgNCAyIDMgMiAxIDIgMiAyIDYgOCA2IDcgOSAxMCA2IDYgNyAxMCA3IDcgNSA2IDQgMgorMyAzIDEwIDggOCA1IDggNyA2IDggOSA5IDEwIDkgOSA1IDEwIDcgNiA4IDcgOSA5IDcgMTAgMTQgMTEgOSA5IDEzIDE0IDE0IDEwIDEwIDEwIDExIDcgOCA4IDUKKzgwMzkgODM2NCA3OTg2IDc0MDMgNzE0MiA3Mzk1IDc1NDUgNjg1NCA2ODcxIDcxOTAgNjk1MCA3MDU2IDcxMzMgODA2MyA3NTY4IDc0OTIgNzMyNyA3NTMxIDcxNzUgODE1NCA3NzMxIDc4MzggOTIyNSA5MDUwIDg4ODYgMTA0ODEgOTc2NyAxMDcyMyAxMDUyOCAxMTQ2NSAxMDMxNSAxMTI1OSA5NjQ1IDExMDQ4IDg3NjkgOTUyMCA4MTc4IDg4MTMgODA1MCA2ODkwCiswIDAgOCA1IDUgMiA1IDQgMyA1IDcgNyA5IDYgNyAyIDggNCAzIDUgNCA2IDUgMyA3IDEyIDggNSA1IDEwIDEyIDExIDcgNiA3IDggMyA0IDUgMgorOSAxNSAxMiA3IDUgNyA3IDcgMyA1IDQgNiA5IDEzIDEzIDEyIDkgMTEgOSA4IDggMTAgNyAxMCA5IDExIDEwIDkgOSAxMCAxMSAxMSAxMiA5IDggOSA3IDggOCA2Cis4MDY4IDg3ODMgODA5MyA3Mzg4IDcwOTEgNzM4MSA3NTM1IDY4NzIgNjc3NiA3MDY1IDY4NzggNzAwMSA3MTg0IDgzNzcgNzcxMSA3Nzc5IDczNzQgNzc1NCA3MjI1IDgxNTYgNzc0MiA3OTgyIDkxNzMgOTEyMSA4ODk0IDEwNTI3IDk3NzggMTA2MzIgMTA0OTUgMTEzOTEgMTAzMzggMTEyNTkgOTcxMCAxMDkzOCA4NzU0IDk1MDEgODE1MiA4Nzc1IDgwNTMgNjg0NQorNiAxNyAxMSA0IDIgNCA0IDQgMCAyIDEgMyA3IDEzIDE0IDEyIDcgMTAgNyA1IDUgOCAzIDcgNiA3IDYgNSA1IDYgNyA3IDEwIDUgNCA1IDMgNCA1IDMKKzMgNyA3IDkgNSAzIDQgNCA1IDQgMyA0IDcgOCA3IDcgMTIgOCA2IDcgMTAgMTEgOSA4IDEwIDkgMTIgMTAgMTIgMTAgMTAgMTAgOSA3IDggOSA4IDggOSA4Cis3OTQzIDg2ODYgODA2OSA3NDk3IDcwNDEgNzEyMiA3NDQ5IDY3MDUgNjczNCA2ODg2IDY3ODIgNjgyNiA3MTgzIDgzNjUgNzY5NyA3NzQyIDc0OTYgNzc4MCA3MTk4IDgwOTYgNzgwNCA4MTc4IDkxNzQgOTA2NSA4OTI3IDEwNDQ4IDk4NDAgMTA2MDggMTA1MzkgMTEzMjEgMTAzMzUgMTExOTcgOTY5NyAxMDcxMSA4NzM5IDk0ODMgODE1MiA4NzQwIDgwODIgNjkyNQorMCAzIDQgNyAyIDAgMSAxIDIgMSAwIDEgNCA1IDQgNCAxMiA1IDMgNCA4IDkgNSA0IDcgNSA5IDYgOSA2IDYgNiA1IDMgNCA1IDUgNCA2IDUKKzE1IDExIDE1IDcgNSAxMSA5IDggOCA4IDYgNSA0IDYgNiA1IDExIDkgMTEgMTAgOCAxMSAxMyAxMyA5IDYgNiA5IDEwIDEwIDExIDEyIDExIDkgMTIgMTAgMTAgOSA3IDcKKzgxMjggODg0MCA4MjUxIDc0NzcgNjk5MyA3MzcwIDc0OTMgNjc5NCA2NzcwIDY5NjQgNjc2NiA2NzIzIDcxMDUgODIzMSA3NjU4IDc1ODQgNzU5MCA3ODY2IDcyOTkgODIyNCA3ODEzIDgzNjMgOTI3NyA5MzE5IDg5MzQgMTAxODkgOTc0NyAxMDUyNCAxMDUzMSAxMTI1NiAxMDM1OCAxMTI2MiA5NzM2IDEwNjIxIDg4MjcgOTUyOCA4MjA0IDg3NjggODA1OSA2OTM5CisxOCA5IDE4IDQgMiAxMCA3IDYgNiA1IDMgMiAxIDIgMyAyIDEwIDYgMTAgOCA1IDkgMTIgMTIgNiAyIDIgNSA2IDYgNyA4IDggNSAxMCA3IDggNiA0IDQKKzEwIDE0IDEzIDcgOCA2IDYgNSA2IDEwIDEyIDkgOSA1IDcgOCA3IDEzIDEyIDExIDcgNSA2IDcgOSAxMiAxMSA5IDkgOCA4IDEwIDEyIDEwIDEyIDcgMTAgMTAgNyA3Cis4MTgwIDkxNjkgODM3NyA3NDU4IDcwMjIgNzI5NiA3NDU5IDY2OTMgNjc1NCA3MTYwIDY5MDMgNjg3MiA3MTU3IDgwNDQgNzY0NSA3NjIwIDc1NzkgODE5MiA3NDIzIDg0MDYgNzc5NiA4MTY4IDkxOTggOTE4OSA4OTQxIDEwMzE0IDk3ODQgMTA0NDUgMTA0OTggMTEwNzIgMTAzMDMgMTEyMDAgOTc5OSAxMDU5OCA4OTEzIDkzODYgODI1NCA4ODU2IDgwMzYgNjk1MgorOCAxNCAxMyA0IDUgMyAzIDIgMyA5IDEzIDcgNyAyIDQgNSA0IDEzIDEyIDkgNCAyIDIgMyA2IDkgOCA1IDUgMyA0IDYgMTAgNiAxMCAzIDggNyA0IDQKKzUgMTAgMTIgMTIgOSA4IDkgOCAzIDggOCA4IDEwIDggMTAgMTAgNiA3IDYgNSA2IDYgNSA3IDEwIDExIDExIDExIDExIDExIDExIDEyIDEwIDEwIDEwIDkgMTEgMTAgOSA5Cis4MTAzIDkyMzMgODQ3NCA3NzQ3IDcwNzYgNzM0OSA3NTAyIDY3ODIgNjY2MiA3MjIxIDY5MzUgNjk1MSA3MjMzIDgwNTIgNzcwOSA3Nzc3IDc1NDMgODEzMCA3MzkxIDgyMDggNzc1NCA4MDQ2IDkwOTYgOTA2NyA4OTczIDEwMzcwIDk4MjAgMTA0OTQgMTA1MTcgMTEwODMgMTAzMjYgMTEyNjUgOTgxMCAxMDU3NiA4OTQ2IDkzNzUgODMyOSA4OTM5IDgwNjUgNzA4NworMiA3IDExIDEyIDcgNSA3IDYgMCA1IDUgNSA4IDUgOCA4IDMgNCAzIDIgMyAyIDEgMyA3IDcgOCA3IDcgNyA4IDggNiA2IDcgNSA5IDcgNiA3Cis3IDUgOCAxOSAxNCA0IDYgNCAxIDYgOSA0IDUgMyA3IDcgNCA4IDUgNyA3IDggNiA4IDkgMTEgOSA4IDEyIDEyIDEyIDggOCAxMCA5IDkgOCA5IDggNQorODA3OSA4OTg2IDg0NjYgODQ0OSA3MjU3IDcxNTMgNzQ2OCA2NjIwIDY1MjEgNzE1NiA2OTkxIDY3NzkgNzE4MCA3NzUzIDc2OTUgNzc0MCA3NDU2IDgxMzMgNzMzNCA4MTQ1IDc3MzkgODA1NCA5MDIyIDkwMTQgODk3OSAxMDQyMyA5ODA0IDEwMzU1IDEwNTYxIDExMTU1IDEwMzc0IDExMDgwIDk3NjkgMTA1NTUgODk1MiA5MzY1IDgzMjUgODk1NSA4MDY4IDY5NjgKKzQgMSA1IDI4IDE3IDEgMyAxIDAgMyA3IDEgMiAwIDQgNCAxIDUgMiAzIDQgNSAyIDQgNiA3IDUgNCA5IDggOSAzIDQgNiA2IDUgNSA2IDUgMgorNiA1IDkgOSA5IDYgNSA2IDYgNiA4IDQgOSA3IDcgNyA4IDggNiA4IDEwIDExIDExIDExIDE2IDEwIDExIDggMTEgMTEgMTAgMTIgMTYgMTMgOCA1IDggOSA5IDkKKzgwMzAgODc1NCA4NDg0IDg0OTUgNzMwNSA3MDkyIDc0MDkgNjU5MSA2NTExIDcwOTUgNzAyMCA2NjE4IDcyMzAgNzcxNyA3NjgxIDc3MDUgNzQ3NCA4MTM2IDczMDQgODE0NyA3ODAxIDgyNDYgOTA3NyA5MTQ4IDkxNjMgMTA0MTIgOTg0MCAxMDIyNSAxMDU3OCAxMTE2MSAxMDM3MCAxMTE1MiA5OTM0IDEwNzIwIDg5MzMgOTExMCA4MzIxIDg5NzAgODA5NiA3MTAyCisyIDEgNiA2IDcgMyAyIDMgMyAzIDUgMSA3IDQgNCA0IDUgNSAzIDUgOCA5IDkgOCAxOCA2IDggNCA3IDcgNiA4IDE3IDEwIDQgMSA1IDYgNiA3Cis2IDkgNiA2IDkgMTAgOCA2IDQgNCA1IDQgMTAgMTMgMTEgNiA4IDggNiA1IDkgMTIgMTAgOCAxMSA3IDcgNyA2IDkgNyAxMCAxMyAxNCA4IDEwIDkgOSA2IDYKKzc5ODIgODc4MSA4NDI1IDgzNTMgNzM1MiA3MjgwIDc0MjggNjU2NCA2NDUwIDY5MTUgNjk3MiA2NDY2IDczMDUgODA1MiA3NzcwIDc2MTEgNzQ5MSA4MTM5IDcyNzUgNzk2NSA3ODM2IDg0ODggOTEwNiA5MDkwIDkyMTUgMTAyMTcgOTc3MyAxMDA0MSAxMDQ2NyAxMTA0NCAxMDI5MCAxMTA5NyAxMDAxOCAxMDkzNiA4OTE0IDkxNzcgODM0MyA4OTg0IDgwNDcgNzA0NAorMiA2IDIgMiA3IDggNSAzIDEgMSAyIDEgOCAxMyAxMCAzIDUgNSAzIDIgNiAxMSA3IDQgOCAzIDMgMyAyIDUgMyA2IDExIDEyIDQgNyA2IDYgMiAzCis0IDExIDUgMiA5IDkgNiAyIDMgNSA1IDYgNiA1IDQgNyA3IDYgOCA5IDEwIDExIDcgNCA0IDggNiA4IDcgNiA2IDYgMTAgNyA3IDcgOCA3IDYgNAorNzg4NCA4OTI5IDgzNDIgNzk3NCA3Mzk4IDczOTYgNzM5NSA2MjkzIDYzNjUgNjgwNyA2OTI1IDY0NDYgNzI3NiA3ODc2IDc2NzggNzU4NCA3NDgyIDgwMTkgNzI5NyA4MDQwIDc4OTYgODY1NCA5MDU3IDg3OTAgOTA4NyAxMDA5NSA5NjgyIDk5MzAgMTAzODQgMTA3NTAgMTAxODYgMTA3OTkgMTAwMjMgMTA3MDkgODg3MCA5MDU2IDgzMzkgODg3NSA3OTk5IDY4NjcKKzEgOSAxIDAgNyA3IDMgMCAwIDIgMiAzIDMgMiAxIDQgNCAyIDUgNiA4IDkgMyAxIDEgNCAyIDQgMyAyIDIgMiA2IDMgMyAzIDUgMyAyIDEKKzkgMTkgMjEgMTggMTIgMTAgNiA3IDYgNCA1IDggNiA2IDggMTIgOSAxMCAxMiAxMCA5IDEyIDEyIDggOCA5IDggNyA3IDggMTIgMTEgMTAgMTAgOCA2IDcgOSAxMSA1Cis3OTE3IDk1NjAgODY3MCA4NjAxIDc1MjAgNzU2NiA3MzYzIDYzNDUgNjM1OSA2NjQ0IDY4NzkgNjU1MCA3MjQ3IDc3NzIgNzY5MCA3ODY2IDc1MjUgODE1MiA3NDIxIDgxNzEgNzkyOCA4ODcyIDkxMzcgODc1NCA5MDY0IDEwMDQyIDk2NDQgOTc2NCAxMDMwMyAxMDU5NiAxMDIzOCAxMDgyNiAxMDAyOCAxMDY4MCA4ODUzIDg4ODEgODMwOSA4ODk1IDgwODAgNjc2MgorNiAyNSAzNCAyNSAxMiA4IDMgNCAzIDEgMiA2IDMgMyA1IDEyIDcgOCAxMiA4IDYgMTAgMTAgNCA0IDUgNCAzIDMgNCA5IDcgNiA2IDQgMiAzIDYgOSAyCis3IDkgOCAxMSA3IDggOSA5IDkgOCA4IDggOSAxMCA3IDcgOCA3IDYgOCA4IDEyIDkgMTEgOSA5IDYgNSA2IDEwIDEwIDEyIDEwIDkgOSA4IDcgNiA4IDQKKzc4OTggOTUzOSA4NjU4IDg3NjAgNzUxMSA3NjAzIDc0MDkgNjUxNyA2NDMwIDY3MzYgNjkxMSA2NjQ4IDcyOTYgNzkyMCA3Njc2IDc4MjQgNzU0MSA4MDkyIDczODkgODE3MiA3OTM0IDkwNzYgOTEzOCA4OTA0IDkwNjcgOTk5MiA5NTU2IDk0ODUgMTAxOTkgMTA1NzQgMTAyMzggMTA5MTMgMTAwMzMgMTA1OTIgODg2MiA4ODM5IDgyODAgODcyOSA4MDgyIDY2MDIKKzQgNSA0IDkgNCA1IDcgNyA3IDYgNSA2IDcgOCA0IDQgNSA0IDMgNSA1IDEwIDUgOSA2IDUgMiAxIDIgNiA2IDkgNiA1IDYgNCAzIDIgNSAxCis0IDEwIDEwIDkgNSA4IDUgOSA5IDkgMTMgOSA4IDExIDggNSA5IDggOCA0IDcgMTEgOSAxMiAxMiA4IDYgMTEgMTEgOCA2IDcgOSAxMyAxMSA5IDcgOSAxMCA2Cis3ODAzIDk1ODEgODY5NyA4Nzg3IDc0NTEgNzYzOCA3MzUxIDY2NzggNjQ5OSA2ODg0IDcwNzAgNjgwMiA3MzE4IDgxMjAgNzY4OCA3NjYxIDc1ODIgODA5NyA3NDA5IDc5MjcgNzkxNCA5MjA3IDkxMzkgOTEwNyA5MTQ3IDk4ODQgOTQ3MCA5NTkxIDEwMjI1IDEwNDMxIDEwMTM1IDEwNjg4IDEwMDEyIDEwNzU1IDg5MjEgODg2MSA4MjUyIDg3NTggODEzNSA2NTc0CisxIDcgNyA2IDIgNSAyIDcgNyA3IDE1IDcgNSA5IDUgMiA2IDUgNSAxIDQgOCA1IDEwIDEwIDQgMiA4IDggNCAyIDMgNSAxMCA5IDYgMyA2IDggMworMyA2IDUgMyA0IDkgOCA3IDQgNSA3IDEwIDYgOCA1IDQgNSA3IDkgNCA3IDcgNyAxMCA4IDkgMTAgMTIgOSAxMSA5IDkgMTIgOCAxMSA5IDYgNyA4IDcKKzc2ODQgOTM3NCA4NjA3IDg0NDQgNzM2NyA3NzMyIDczNzEgNjcwNyA2NDM5IDY3NzggNzA3MiA3MDA4IDcyODggODEyNCA3NjIzIDc0NDcgNzUyMCA4MDQxIDc0NTQgNzY5NyA3ODk1IDkwODQgOTA4OSA5MTc0IDkxMjMgOTg0MyA5NDg5IDk3NTIgMTAxOTkgMTA0ODAgMTAxMTIgMTA1OTkgMTAwNjggMTA2MDEgODk3OSA4ODgyIDgxOTkgODY2MiA4MTM2IDY2MDkKKzAgMiAxIDAgMSA2IDUgNCAxIDIgNCA5IDMgNSAyIDEgMiA0IDcgMSA0IDMgMyA3IDQgNSA3IDEwIDUgNyA1IDUgOSA0IDkgNiAyIDMgNSA0Cis5IDUgOSA3IDQgNCA3IDUgMyA1IDUgNSA1IDcgNCA0IDcgOCAxMyAxMiA4IDcgOCA5IDEyIDkgOCAxNSAxMSA5IDExIDcgMTAgMTMgMTIgOSA5IDggOCA3Cis3NzIyIDkxMTggODYyMiA4MzY3IDcyODUgNzUxMyA3MzY1IDY2MTEgNjM1NCA2Njc4IDcwMjMgNjg5NCA3MjMzIDgwNjYgNzUzNCA3MjQ1IDc1MTEgODA1MCA3NjAwIDc5NzIgNzkwMiA4OTY5IDkwNjYgOTE3NiA5MjAyIDk4MDUgOTQ1NiAxMDA4OCAxMDIyNSAxMDQwNCAxMDE0MCAxMDM5MyAxMDA3MiAxMDc2MyA5MDYxIDg5MDIgODIyNCA4NjMzIDgxMzcgNjY0MgorNiAxIDYgMyAxIDEgNCAyIDAgMiAyIDIgMiA0IDEgMSA0IDUgMTQgMTEgNSAzIDQgNSAxMCA1IDQgMTUgOCA1IDggMyA2IDEwIDEwIDYgNiA0IDUgNAorMTIgOSAxMCA4IDcgNCAzIDUgOSA1IDEwIDcgNiA2IDggNCA1IDQgNSAxMCA4IDYgOSAxMSA4IDExIDEwIDggMTAgMTEgMTEgMTIgOSAxMSAxNCAxMCA3IDggOCA4Cis3ODM1IDkxMjMgODY2MiA4MzU2IDcyODIgNzMwNyA3MjU3IDY1MjEgNjQyNSA2NTg0IDcxMDMgNjkxMCA3MjA1IDc5NTAgNzU1MCA3MDU2IDc0NTEgNzgxMiA3NTM4IDgxMDggNzkwOSA4Nzk5IDkwNjkgOTMwMSA5MTc2IDk4OTIgOTQ3NSA5OTc0IDEwMjI1IDEwNDU1IDEwMTY4IDEwNTA2IDEwMDUwIDEwNzkzIDkxOTIgODk4MiA4MTk3IDg2MDYgODEzOCA2NzM0CisxMiA2IDcgNSA0IDEgMCAyIDcgMiA5IDQgMyAyIDUgMSAyIDEgMiA4IDUgMiA2IDggNCA4IDcgNCA2IDcgOCA5IDUgNyAxNCA3IDMgNCA1IDYKKzUgMTMgOSA5IDUgNyAxMSAxMiAxMCA5IDQgMiA2IDcgNiA2IDggNyA2IDcgNyA5IDcgMTMgOCAxMSA5IDEyIDYgOSA3IDExIDEwIDggMTEgMTEgNyA4IDggNQorNzc2NyA5Mzc0IDg2NzUgODQwNyA3MjI4IDcyOTggNzM1NyA2ODY3IDY1MjAgNjc0MSA3MDI3IDY2MTggNzE3OCA3OTAzIDc1MTQgNzAwMSA3NDY5IDc3NzMgNzUwMyA4MDUxIDc4OTAgODgyNCA5MDIxIDk1NDEgOTE1MSA5OTc0IDk0NjggMTAxMTIgMTAxMjMgMTAzODAgMTAwOTMgMTA1NTEgMTAwNTQgMTA2MzYgOTI0MyA5MTE4IDgxNzEgODU4MSA4MTM5IDY2MzcKKzIgMTIgNiA2IDIgNCAxMCAxMyA5IDcgMSAwIDMgNCAzIDMgNSA0IDMgNCA0IDYgMyAxMiA0IDggNSA5IDIgNSAzIDcgNiA0IDggOCAzIDUgNSAyCis4IDEwIDEwIDkgOSA4IDggMTEgNSA1IDUgOSAxMCA4IDYgOCA4IDYgNyA3IDggMTIgOSA4IDggNyA2IDkgNyA2IDkgMTEgOSA4IDkgOSA2IDExIDkgOQorNzc3NyA5NDI1IDg3MTQgODQ1NSA3Mjc3IDczNTEgNzM3NyA3MTMwIDY0ODUgNjY0MyA2OTc5IDY3NzMgNzI1NCA3OTIwIDc0NzkgNzA3MiA3NDg3IDc2NzUgNzQ5NCA3OTk4IDc4OTcgOTAzMSA5MDI1IDk0NjAgOTEyNyA5ODA1IDkzODUgMTAwNTggMTAwNDkgMTAxMjUgMTAwNzEgMTA1OTMgMTAwMzMgMTA0ODkgOTI0MiA5MTIzIDgxMjAgODc0MSA4MTY1IDY3OTEKKzUgNyA3IDYgNyA1IDUgMTAgMiAyIDIgNyA4IDUgMyA1IDUgMyA0IDQgNSAxMCA2IDQgNCAzIDIgNSAzIDIgNSA3IDUgNCA1IDYgMiA5IDYgNworNSA2IDYgMyA2IDggNCAyIDcgMTAgNSA2IDEyIDEwIDggNiA5IDEwIDEyIDEwIDEwIDEyIDEyIDEwIDExIDggOCAxMSA4IDggOSA4IDEwIDcgOCA5IDYgOSA4IDgKKzc3MTAgOTIyOCA4NjQ5IDgxMzIgNzI0OCA3NDAxIDcyOTUgNjgyNSA2NTAyIDY4NTggNjkzMiA2NzM1IDczNzkgODA1OSA3NDk2IDcwMTYgNzUzMCA3ODI4IDc2MTMgODEzMiA3OTU1IDkyMjYgOTEwNiA5NTA2IDkxODAgOTcwOCA5MzU1IDEwMTMwIDEwMDAyIDEwMDA5IDEwMDQ5IDEwNDQ4IDEwMDM4IDEwMjg5IDkyMTUgOTEyOCA4MDcwIDg3NjkgODE2NSA2ODc1CisyIDIgMiAwIDMgNSAxIDAgNCA5IDIgMyAxMiA4IDUgMyA3IDggMTIgOCA4IDEwIDEwIDcgOCA0IDQgOCA0IDQgNSA0IDYgMyA0IDYgMiA2IDUgNQorNCAzIDUgNyA1IDIgNCA3IDcgOCA5IDEwIDExIDcgOCA3IDkgOSA3IDggOSA3IDExIDEwIDggMTEgMTAgMTAgMTAgNyA2IDYgMTEgMTAgOCA2IDcgOCA3IDgKKzc2MTkgODg1OCA4NTYwIDgwNzQgNzE5NCA3MDc5IDcyMTUgNjg0NSA2NTE4IDY5MzggNjk4OSA2OTQ1IDc0NzUgODAwNSA3NTEzIDcwMjUgNzU3MiA3OTExIDc2MDEgODEzNSA3OTg2IDkxMDIgOTE1OSA5NTUwIDkxNTUgOTgwMSA5Mzc3IDEwMTM2IDEwMDA3IDk4MzggOTk1MSAxMDE4OSAxMDA2OCAxMDI4NiA5MTg5IDg5NDggODA0NyA4NzM0IDgxNDAgNjk1NAorMSAwIDEgNCAyIDAgMSA0IDQgNSA3IDkgMTAgNCA1IDQgNyA2IDQgNSA2IDMgOCA3IDQgOCA3IDYgNiAzIDIgMiA4IDYgNCAyIDQgNCAzIDUKKzQgMTEgMTEgNSA4IDEwIDggMTEgNiA2IDQgNyA5IDYgNiA4IDYgNSA2IDYgNSA3IDggOCAxMCA4IDEzIDExIDEwIDEwIDEyIDE1IDExIDExIDEwIDkgNyAxMCA3IDUKKzc1MzEgOTAwMiA4NjI3IDc4OTYgNzIxOCA3MjY4IDcyMzkgNzExMCA2NTA4IDY4OTAgNjkxNiA2OTU4IDc1MTggNzg5MyA3NDc4IDcwOTUgNzUzNiA3NzQzIDc1NjQgODAxNSA3OTE0IDg5ODUgOTEzNCA5NDY4IDkxODIgOTcwNCA5NDc1IDEwMjAzIDEwMDEyIDk4NjIgMTAwMDkgMTA0OTkgMTAwOTcgMTAzNDQgOTIxNSA4OTY0IDgwMjUgODgyNCA4MTE1IDY4NDMKKzEgOSA5IDIgNSA4IDUgMTEgMyAzIDEgNCA3IDMgMyA1IDMgMiAzIDIgMiAzIDQgNCA3IDQgMTIgOCA2IDYgOSAxNCA4IDcgNyA2IDQgNyA0IDIKKzQgMTEgMTAgOSA1IDUgNiA3IDkgNSA1IDkgOCA3IDcgOSA5IDkgNyA3IDggNSA4IDEyIDEwIDkgOSA5IDggNyAxMSA4IDggMTQgMTUgMTEgOSA4IDggNgorNzQ0NSA5MTM3IDg2NjcgNzk3NSA3MTY1IDcxMzkgNzIxMSA3MTEzIDY1NzUgNjc4MyA2ODcxIDcwOTMgNzUzNCA3ODQ5IDc0NzAgNzIyMiA3NTc3IDc4MzEgNzU1NCA3OTY0IDc5MjAgODc1MyA5MTEwIDk2MzcgOTIwOCA5Njc0IDk0NjggMTAxNDMgOTk2NiA5NzAwIDEwMDQwIDEwMzYwIDEwMDQ5IDEwNTgzIDkzNjggOTEwMSA4MDU0IDg3ODYgODExNiA2ODAxCisxIDggNyA2IDIgMiAzIDQgNyAyIDIgNyA1IDQgNCA3IDcgNiA0IDQgNSAxIDQgMTAgNyA1IDUgNSA0IDMgOCA0IDQgMTIgMTYgOCA2IDQgNSAzCis0IDcgMTIgOSAxMiA2IDMgOSA4IDYgMTAgNSA4IDUgNyA4IDEyIDYgNyA4IDUgNyA3IDExIDEzIDEyIDExIDcgMTAgMTMgMTQgMTQgMTAgMTEgOSAxMCAxMCAxMSAxMCA2Cis3MzYxIDkwMTggODc1NyA4MDQ5IDcyOTIgNzA3OSA3MTA3IDcyMzkgNjYxNSA2NzQ0IDY5NTUgNjk3NCA3NTUwIDc2ODUgNzQ2MiA3MjgwIDc2OTQgNzcyOSA3NTQ0IDc5NzcgNzg1MCA4NjU3IDkwNjEgOTczNCA5MzEwIDk4MzAgOTUxMiA5OTY0IDk5NzIgOTkxNiAxMDE0NyAxMDU5OCAxMDA1MyAxMDYyMyA5MzY0IDkxNjkgODEwOCA4OTM0IDgxNjkgNjc2MQorMSAzIDExIDYgMTIgMyAwIDcgNiAzIDkgMiA1IDIgNCA1IDEyIDMgNCA1IDIgMyAzIDggMTIgOSA4IDMgNiAxMSAxMyAxMiA2IDcgNSA3IDggOSA4IDMKKzMgNCA3IDYgMTEgMTEgNCAzIDUgOCA2IDUgNyA3IDUgNSA4IDYgNyA2IDkgMTYgMTAgOSAxMiAxMyA5IDYgNyAxMyAxMCAxMyAxMCAxMCAxMSA4IDYgOSA5IDUKKzcyNTMgODcyMiA4NzE3IDc5MzQgNzM5MSA3MzMwIDcwMzEgNjk4OCA2NTc3IDY4MzAgNjkzNCA2ODYyIDc1NDAgNzY1MyA3NDAzIDcxNTAgNzcwNiA3NjMzIDc1MzQgNzg2NyA3ODg0IDkxMjAgOTA5MCA5NzAyIDkzODQgMTAwMzggOTUwNCA5NzM0IDk5MDIgMTAxMTkgMTAxNDkgMTA3NjAgMTAwNTcgMTA2MDAgOTQxMSA5MTEwIDgwNTggODk1MCA4MTk1IDY2NjIKKzAgMSAzIDIgMTAgMTAgMSAwIDIgNiAzIDIgNCA0IDIgMiA1IDMgNCAzIDYgMTggNyA1IDEwIDExIDUgMiAzIDExIDYgMTAgNiA2IDggNCAyIDYgNiAyCis5IDExIDEyIDggMTIgNyA1IDMgMyAzIDMgNiA4IDYgNyA3IDggNyA4IDcgMTEgOSA4IDExIDcgNyAxMCAxMiA2IDkgMTEgMTAgOCAxMCAxMCA3IDYgMTEgMTAgOAorNzMwMiA4ODc0IDg4MDYgNzk0OSA3NTEzIDczMjAgNjk4MyA2NzUzIDY0ODkgNjYwNCA2ODM3IDY4MTggNzU1NiA3NTYyIDczOTcgNzE1MSA3NzE4IDc2MDUgNzU1MCA3ODI1IDc5NjggOTEyNSA5MDY3IDk3OTUgOTMyOCA5ODY1IDk1MjIgOTg4NyA5ODA4IDEwMDY0IDEwMTc2IDEwNzI4IDEwMDEwIDEwNTc4IDk0MzEgODk5MyA4MDEwIDkwODggODI0NiA2NzUzCis3IDkgMTEgNSAxMiA0IDIgMCAwIDAgMCAzIDUgMyA0IDQgNSA0IDUgNCAxMCA2IDQgOCAzIDMgNyA5IDIgNSA4IDYgNCA2IDcgMyAyIDkgOCA2Cis5IDUgNyA5IDggOSA5IDggNyA2IDYgNiA1IDYgNiA5IDEwIDYgNiA2IDExIDEwIDcgMTMgMTIgOCA2IDkgOCA5IDEyIDE3IDE0IDExIDkgNiA4IDkgOCA3Cis3MzQ5IDg2NDggODc2NSA4MDI1IDc1MjkgNzQzMyA3MDM4IDY4MzkgNjUwNSA2NTc2IDY4MTkgNjc3NyA3NDk1IDc0NzYgNzM2NSA3Mjc0IDc3ODAgNzUxNyA3NTE0IDc3MjQgODA1MCA5MTkxIDkwMTkgMTAwMDYgOTQwMSA5NzY0IDk0MzcgOTg0NiA5NzY3IDEwMDEzIDEwMjI4IDExMTI4IDEwMTE3IDEwNjE5IDk0MjUgODgyMiA4MDE0IDkwOTUgODI0NCA2Nzc3Cis3IDEgMyA2IDUgNyA3IDUgNCAzIDMgMyAyIDMgMyA3IDggMyAzIDMgOSA3IDMgMTEgMTAgNCAyIDUgNCA1IDkgMTcgMTMgNyA1IDIgNSA2IDUgNAorNyA0IDYgMTIgOCA3IDEwIDYgMTIgMTMgMTQgNyA1IDQgNSA0IDcgMTAgMTEgNSAxMSAxMyA4IDEwIDEwIDEwIDkgMTAgOSA5IDEwIDExIDEwIDggOSA4IDEwIDEwIDEyIDgKKzczNDQgODM3NCA4Njk5IDgyODAgNzU0NSA3NDE3IDcxMTcgNjc5NyA2NjQ5IDY5ODAgNzAwNiA2ODAwIDc0MzUgNzI3MyA3MzA4IDcwODMgNzc2NCA3NjgwIDc2MDcgNzU2NyA4MTMwIDk0MzggODk5OCAxMDAyMCA5NDIxIDk3OTIgOTQzMSA5ODY5IDk3NTMgOTk2NSAxMDIyOCAxMTEzNiAxMDEyMCAxMDQ3MyA5NDE5IDg3ODQgODA2OSA5MTYzIDgzNDQgNjg2MQorNCAxIDIgMTEgNSA0IDkgMyAxMyAxNSAxOCA0IDIgMSAyIDEgNCA4IDEwIDIgOSAxMiA0IDYgNyA2IDUgNiA1IDUgNiA3IDYgNCA1IDQgOCA3IDExIDUKKzEzIDkgOCA5IDcgMTEgOSA4IDkgOCA5IDUgNyAyIDQgNSA5IDcgNiA2IDExIDggOCA3IDggNyAxMCAxMiA4IDEzIDcgOSAxMCAxMCAxMSA5IDggOCAxMSA5Cis3NDkyIDg0MjQgODY4NiA4MzM2IDc1MzUgNzY0NyA3MTY5IDY4ODAgNjcxMyA3MDUyIDcwNjEgNjY5OSA3NDI4IDY5NTkgNzIyNyA2OTY1IDc4MDAgNzY0OSA3NTcwIDc0ODEgODIwOCA5MzYzIDg5NzcgOTg0OCA5MzkwIDk2MzQgOTQ1MSAxMDAxNCA5NzE0IDEwMTY1IDEwMTUxIDExMDIwIDEwMTIyIDEwNDU5IDk0NjUgODgwOSA4MDcyIDkxMDQgODQxNiA3MDAyCisxNCA2IDQgNiA0IDEwIDcgNSA3IDUgNyAyIDQgMCAxIDIgNiA0IDMgMyA5IDQgNCAzIDQgMyA3IDkgNCAxMSAzIDUgNiA2IDggNiA1IDQgOSA3Cis1IDEwIDMgMSA0IDEwIDcgOCA4IDYgNiA4IDUgNCA5IDggOCA2IDcgOCA3IDYgNyA4IDggOSA5IDkgMTEgOSA3IDkgOSAxMSA5IDkgOCA4IDkgNgorNzQzMiA4NTMyIDg1NDUgNzg5NyA3NDQ5IDc4MDIgNzE2OCA2OTU4IDY3NDkgNjk5NyA3MDM4IDY3ODggNzM3MCA2Nzg3IDcyNzYgNzAzOCA3ODA5IDc1NTggNzU1OSA3NTIzIDgxODIgOTE2OSA4OTMxIDk3NDggOTM2MCA5NjA4IDk0NDUgOTk2NiA5NzUyIDEwMTA4IDEwMDc2IDEwOTExIDEwMDk5IDEwNTA3IDk0NTggODgzMyA4MDc0IDkwNDkgODQzNSA2OTUwCisyIDcgMCAwIDEgOCA0IDUgNiAzIDMgNiAyIDEgNyA1IDUgMyA0IDUgMyAyIDMgNCA0IDUgNSA1IDggNSAzIDUgNSA3IDUgNiA1IDQgNiAzCis5IDEzIDggNSA1IDUgMyA0IDggNyA0IDQgNSA2IDcgNSA3IDkgOCA3IDcgOCA3IDEzIDEzIDggMTAgOSAxNCAxMCAxMiAxNiA4IDcgOCAxMyA5IDExIDExIDkKKzc0NzYgODgxOCA4NTM2IDc3MzAgNzM5MCA3NjQxIDcwNjUgNjc4NiA2Nzg1IDcwMDcgNjk2NCA2NjI2IDczMTMgNjc0OCA3MjczIDY5MjIgNzc5MiA3NjU3IDc1NzQgNzUwMSA4MTU2IDkxMTAgODg4NiA5OTYxIDk0NTggOTUyMyA5NDY0IDk5MjEgOTg2NiAxMDExNSAxMDEzMSAxMTIzOSAxMDA1MSAxMDMwNiA5NDI2IDkxMDEgODEwMiA5MTgxIDg1MDUgNzA4NQorNyAxMiA1IDIgMiAyIDAgMSA2IDQgMSAxIDIgMyA0IDIgNCA2IDUgNCAzIDQgMyAxMSAxMiA0IDcgNSAxMyA2IDkgMTUgNCAzIDQgMTIgNiA4IDkgNworNiA5IDcgMTMgMTIgNiAzIDMgNyAxMiA5IDcgNiA4IDggNiA3IDExIDEzIDkgOCAxMCAxMiAxMCAxNyAxMCA5IDEwIDE0IDkgOCAxMSAxMyAxMCA5IDkgMTAgMTEgMTAgNworNzQ0MiA4ODQxIDg1MDEgODA2NCA3NTEyIDc1NTEgNjk2NSA2NTYzIDY3OTQgNzMyMyA3MDIwIDY2NTggNzI4MyA2ODM0IDcyOTUgNjg3NSA3Nzc2IDc4NzMgNzcxNyA3NjAzIDgxNTYgOTE3NyA4OTcwIDk5NzcgOTY1NiA5NTY2IDk0NTcgOTk0MCA5OTc3IDEwMDYxIDEwMDgyIDExMjQwIDEwMTMyIDEwMzAyIDk0MjAgOTEwNyA4MTU1IDkzMDUgODU0OCA3MDg5CiszIDYgMyAxMyAxMiAzIDAgMCA0IDEyIDcgNCAzIDUgNSAzIDQgMTAgMTQgNiA1IDcgMTAgNiAyMCA3IDUgNiAxMyA1IDQgNyAxMSA2IDUgNiA4IDggNyA0Cis2IDggMTEgMTYgOCAzIDcgNiA2IDcgNyA3IDkgNiA1IDYgNiAxMSA4IDcgNyA3IDkgOSAxMSA5IDcgOSAxMCAxMSAxMyA5IDEwIDkgMTAgMTAgMTEgNyA2IDUKKzc0MDkgODgwMiA4NTY5IDg1NjMgNzUyOCA3MjgyIDY5NzAgNjUzNyA2Nzc3IDczMTMgNzAyMyA2Njg4IDczMzEgNjc5MiA3MjQwIDY4MzEgNzczNSA4MDc2IDc3MjggNzU3NiA4MTMxIDkwNTYgODk3NiA5OTMxIDk2OTYgOTU0NSA5Mzk5IDk4OTYgOTk4MyAxMDEzMyAxMDE2MiAxMTExOCAxMDEzNCAxMDIzNiA5NDQwIDkxNzQgODIzMiA5MTc2IDg0ODcgNjk3MAorMyA0IDkgMjAgNSAwIDQgMyAzIDQgNCA0IDcgMyAyIDMgMyA5IDUgNCA0IDMgNiA1IDggNSAzIDUgNiA4IDExIDQgNiA1IDcgNyA5IDMgMiAyCis3IDE0IDExIDEwIDEzIDEzIDggNyA2IDQgNSA4IDEyIDcgMTQgMTIgOSAxNiAyNiAxNyAxMyAxMyA2IDkgMTcgOCAxMCAxMSAxMSAxMiAxMCAxMCA3IDggMTMgMTMgMTYgMTYgMTMgMTEKKzc0MDIgOTEzNCA4NjM2IDg2NjMgNzY3MiA3NjQzIDcwMDAgNjU3NCA2NzYxIDcxMTkgNjk3NSA2Nzc4IDc0NTQgNjgxNCA3NDE3IDcxNTggNzc3MSA4NTc0IDgxOTkgODE2NSA4MjYwIDkzMTEgODkwNSA5ODg4IDk4ODggOTQ2MyA5NDE5IDk5NzggMTAwMTQgMTAyNjIgMTAxNjMgMTEwNjUgMTAwNTkgMTAxMTMgOTUzNiA5NDIyIDg0MzUgOTYwOCA4NjA3IDcyMjcKKzQgMTQgOSA3IDE0IDE0IDUgNCAzIDEgMiA2IDEyIDQgMTcgMTMgNiAyMCA1NCAyMyAxMyAxMiAyIDUgMTkgNCA3IDggOCA5IDYgNiAzIDQgMTIgMTIgMjAgMTggMTMgMTAKKzEzIDE0IDEzIDcgNCA1IDQgNSA3IDEwIDggNSAzIDUgMTIgMTEgMTUgMTMgMTIgMTAgMTEgMTAgNyA5IDEzIDE0IDEwIDEwIDEzIDEyIDEwIDkgMTIgMTEgOSA5IDkgOCA4IDkKKzc1NDkgOTQ0NiA4NzUyIDg1NzMgNzU4MiA3NDkxIDY5MjcgNjQ4NiA2NzcxIDczMDYgNzAwNSA2Njc4IDczNDQgNjcxMiA3NTM4IDc0MDQgNzk2MCA4ODU4IDgzMDEgODI4OSA4MzM0IDkzNjYgODg2MSA5ODQ3IDk5NzMgOTc1NSA5NDM5IDk5OTMgMTAwOTYgMTAzODMgMTAxNjQgMTA5NTQgMTAxMTQgMTAxODIgOTUyOCA5NDA5IDg0NTQgOTUyMyA4NTk2IDczNDYKKzE0IDE0IDEyIDMgMSAyIDEgMiA0IDggNSAyIDAgMiAxMiAxMCAxOCAxMiAxMSA4IDkgNyAzIDUgMTEgMTMgNyA2IDExIDkgNiA1IDkgOCA1IDUgNiA0IDQgNworMTEgOSAxMSAzIDIgNyA4IDQgOCA4IDMgNCA0IDggNyA4IDUgNiA4IDEzIDcgNSA3IDcgMTEgMTMgNyAxMCAxMSAxMiAxMyA4IDcgMTEgNyA3IDcgOCAxMCA3Cis3NjQxIDk0MzIgODgxNCA4MjQyIDc0NDMgNzQ3MSA2OTU4IDYzNDIgNjgwNiA3MzU5IDY5MDYgNjUyMyA3MjYyIDY4MDAgNzUyOCA3NDUxIDc4ODkgODY5NSA4Mjk4IDg1OTAgODMwNCA5MTExIDg4MTggOTY4NiAxMDAwNSA5OTY4IDkzODIgMTAwMDcgMTAxMjUgMTA0OTcgMTAyNDIgMTA3ODggMTAwNDAgMTAyNDYgOTQ2OSA5Mjc0IDg0MjEgOTQ0MyA4NjM3IDczMzUKKzEwIDUgOSAwIDAgNCA1IDEgNiA1IDAgMSAxIDYgNCA1IDIgMiA1IDEzIDMgMSAzIDMgOCAxMSAzIDYgOCA5IDExIDQgMyA4IDMgMyAzIDQgNyA0CisxMyA5IDkgOCAzIDQgNiA4IDYgOSA4IDIgMiA4IDEyIDExIDYgMTEgOCA5IDggNCA1IDUgNCA3IDEwIDkgMTQgMTEgMTIgMTIgMTIgMTQgNyA3IDEwIDEyIDkgNworNzc4MiA5NDE5IDg4MjQgODIzOSA3MzMzIDcyNjggNjkzNyA2NDUyIDY3ODkgNzQ3MCA2OTM4IDYyNTQgNzEzMSA2ODgzIDc2NDYgNzY3OSA3ODQ1IDg4NDkgODI5NSA4NjI3IDgzMDEgODgxMCA4NzI1IDk0MTIgOTg1NyA5ODAwIDk0MDMgOTk1OSAxMDIzMCAxMDU0MyAxMDI5MyAxMDg3NyAxMDA5NiAxMDQ5MSA5NDExIDkxNDcgODQ2NiA5NjEzIDg2NTEgNzMyNAorMTQgNSA2IDUgMCAxIDMgNiAzIDcgNSAwIDAgNSAxMiAxMCAzIDkgNSA2IDUgMSAxIDEgMSAzIDcgNSAxMyA3IDkgOSA5IDEyIDMgMyA3IDEwIDYgNAorMTkgMTEgMiA5IDEwIDQgNyA3IDMgNiA1IDMgMyA1IDUgNSA1IDEzIDkgMTAgMTEgOSA4IDcgNiA2IDE0IDE0IDExIDggMTAgMTAgMTMgMTEgMTEgOCA4IDExIDggNworODA3MyA5NTI5IDg2NTQgODI5NyA3NDA1IDcwNzcgNjk0MiA2NDk0IDY2OTYgNzM5MCA2ODkyIDYwNjMgNzAyOSA2Nzc3IDc1ODIgNzUyNSA3Nzc2IDkxMTYgODMxNyA4NzIzIDgzNzQgODgzNCA4NzExIDkyNzcgOTc2NCA5NTgwIDk1MjYgMTAyMjEgMTAyNTUgMTA0MDEgMTAyOTEgMTA4MzggMTAxNzYgMTA1MzcgOTQ1NyA5MDg5IDg0NTkgOTcxMiA4NjM5IDczMTQKKzI5IDggMCA2IDggMSA0IDQgMCAzIDIgMCAwIDIgMiAyIDIgMTIgNiA3IDkgNiA0IDMgMiAyIDEzIDEzIDggNCA2IDYgMTEgNyA4IDQgNSA4IDQgNAorMTkgMTEgNCA4IDUgNyA3IDkgOSA3IDYgNSA5IDUgOCA4IDUgNSA2IDYgNyA5IDUgMTEgMTEgNyA2IDkgOSAxMCAxMSA4IDEyIDEyIDkgOSA2IDkgNyA4Cis4MzU3IDk2MzMgODU0MCA4MjkwIDczNDcgNzA4MiA2OTQ3IDY2NTcgNjc1OCA3Mzc2IDY4NzMgNjAwNiA3MDgzIDY2NzcgNzU5NyA3NTY1IDc3MDkgODg3NiA4MjYyIDg1NjggODM0MyA4ODU2IDg2MjEgOTM5NiA5ODAxIDk0MzUgOTQ0MSAxMDE2MCAxMDIyOSAxMDM5MSAxMDMxNSAxMDY3OSAxMDIyOCAxMDY0MiA5NDUwIDkwOTYgODQwMSA5NjgyIDg2MDIgNzM2NgorMjggOCAxIDUgMiA0IDQgNyA3IDQgMyAyIDcgMiA1IDUgMiAxIDIgMiAzIDYgMSA4IDggMyAyIDUgNSA2IDggNCA5IDkgNSA2IDIgNSAzIDUKKzE3IDE3IDEwIDcgNyA5IDcgMTAgOSA2IDUgMTQgMTEgNyA3IDcgOCA5IDUgNCA1IDEyIDcgMTMgMTQgMTAgOSA3IDUgMTIgMTIgNiA5IDggNyA5IDEwIDkgOCA5Cis4NTgyIDEwMDk5IDg1ODIgODIyMiA3MzQyIDcyMTAgNjk1MiA2ODcxIDY4MTkgNzMwMiA2ODI5IDY1MDUgNzE4NyA2NzA2IDc1ODYgNzU0MSA3NzIxIDg4OTYgODE4MyA4Mjk5IDgyNjIgOTA2MSA4NTg0IDk2MzAgOTkxNCA5NDgzIDk0MzUgOTk4MCAxMDEwMSAxMDUwNCAxMDM2NCAxMDQwNiAxMDIwMiAxMDQ5NSA5MzkzIDkxMDMgODQ0NiA5NjU0IDg1OTEgNzQ3NgorMjIgMTkgNyAzIDQgNyA0IDkgNyAzIDIgMTkgMTAgNCA0IDQgNSA2IDIgMSAyIDEwIDMgMTEgMTMgNyA1IDMgMSA5IDkgMiA1IDQgMyA2IDcgNSA1IDcKKzggNyA4IDYgNiA5IDEzIDE0IDYgMTMgMjAgMTkgMjAgMTYgMTEgMTIgMTIgMTMgMTIgMTAgMTAgMTQgOSA3IDEwIDEzIDEyIDcgOCAxMiAxMyAxMCAxNSAyMSAxOCAxOSAyNiAyMyAxNCAxMworODU3MiA5OTIzIDg1NzIgODA5NyA3MzEyIDczMzAgNzExMCA3MzE4IDY4MDIgNzY2MiA3MTY5IDcyODIgNzUxOCA3Mjg2IDc2NzcgNzgyNSA3ODM1IDkxNjAgODI4NSA4NDE1IDgzMTEgOTM3NyA4NTk5IDk0ODIgOTkyMiA5NzEyIDk1MDYgOTgxMSAxMDA1MyAxMDYxMSAxMDQzNyAxMDM5NiAxMDMzMCAxMTE1NSA5NjE4IDk3MjQgODg5OSAxMDQ4NyA4NzM0IDc4MjYKKzUgMyA1IDIgMyA3IDE1IDE3IDMgMTQgMzYgMzIgMzQgMjIgMTAgMTIgMTIgMTIgMTEgNyA4IDE0IDYgMyA2IDExIDEwIDMgNCA5IDExIDYgMTQgMjcgMjIgMjUgNTEgMzQgMTUgMTQKKzcgNSAxMiA3IDQgMTIgMTUgMTAgOSA4IDEzIDkgNyAxMCAxNCAxMSA3IDkgNyA1IDEzIDE0IDEwIDcgOCA5IDkgNyA3IDExIDYgOCA5IDEyIDEyIDEwIDE1IDEyIDggMTEKKzg1MzYgOTYzNCA4NjY0IDgwNDEgNzIzMSA3NjI3IDczMTUgNzQ5MyA2ODYyIDc2OTMgNzMyMiA3Mzk4IDc1MDkgNzQ2MyA3ODQzIDgwMzEgNzgxOCA5MTYzIDgyNTcgODIxNyA4NDM1IDk2NzQgODYzOSA5MzQzIDk4NzggOTY4MiA5NDk4IDk2NTIgOTk4MCAxMDY1MCAxMDMyOSAxMDI2MyAxMDMwMiAxMTIyMiA5Njg0IDk3NTQgOTA2MCAxMDU5NSA4NzIwIDgwMzIKKzMgMSAxMSA0IDEgMTIgMjAgOCA3IDUgMTUgNyA0IDggMTYgOSA0IDUgMyAyIDEzIDEzIDcgMyA0IDUgNSAzIDMgNyAyIDQgNSA4IDEwIDYgMTYgOSA0IDkKKzEwIDcgOCA2IDUgNCA1IDYgNyA2IDUgNSA2IDEwIDEyIDcgOSA4IDEzIDUgMTEgMTEgOCA3IDkgMTIgMTQgMTAgOCA2IDUgNyAxMCAxMSAxNCA5IDggMTEgNiA2Cis4NTc4IDk0ODYgODY1MiA3OTI3IDcxNzggNzQxNSA3MjYwIDc0MTIgNjg2OSA3NjAwIDcyNjcgNzI2MSA3NDc0IDc2MjkgNzk1MyA3OTc5IDc4NTIgOTEwNCA4MzgzIDgwMzEgODUwNSA5NzY5IDg2MjcgOTIxMiA5ODYxIDk4MzggOTYxOCA5Njg3IDk5MzUgMTAzNzkgMTAxOTggMTAwNzcgMTAzMDAgMTEyMjQgOTgwMCA5NzIxIDkwMzggMTA2MzUgODY1NSA3OTE4Cis3IDMgNCAzIDIgMSAyIDMgNCAzIDIgMiAzIDggMTEgNCA2IDQgMTMgMiA5IDggNCAzIDUgOSAxMyA3IDQgMiAxIDMgNiA3IDEzIDUgNCA3IDIgMworMTEgNiA4IDggMTIgMTEgNCA3IDUgNSA3IDEyIDcgNiA0IDcgOCAxMCA1IDQgOCAxMiA3IDYgOCA4IDEzIDEyIDEzIDExIDExIDEyIDkgOSA4IDkgOCAxMSA3IDYKKzg2NDUgOTI4NSA4NjQwIDc5NDIgNzMwNSA3NjQ1IDcxODEgNzM5NyA2ODI1IDc0NTEgNzI2NCA3NTYyIDc0NjYgNzUzOSA3ODU2IDc5MzAgNzg2MCA5MTcyIDgzMDEgNzc5NCA4NDk3IDk5MjAgODU5MCA5MDI3IDk4MTkgOTczOSA5NzEwIDk4NDMgMTAwMTkgMTA0MzIgMTAyMjQgMTAyMDkgMTAyNzIgMTExMDMgOTc1OSA5NjkwIDkwMTYgMTA2NzIgODYxNyA3ODExCis5IDIgNCA1IDEyIDEwIDEgNCAyIDIgNCAxMiA0IDMgMSA0IDUgNyAyIDEgNSA5IDMgMiA0IDQgMTEgOSAxMSA3IDggOSA1IDQgNCA1IDQgNyAzIDMKKzEyIDEwIDUgNyAxNCA3IDUgNiA1IDUgNSAxMyA2IDYgNiA4IDEwIDEyIDggOCA3IDcgOCA1IDggMTIgMTAgMTUgMTQgOSAxMiAxMiAxMCA4IDExIDExIDcgNCA3IDcKKzg3MzUgOTM0MiA4NTUyIDc4OTUgNzQ4MCA3NjE2IDcxMjkgNzMyMSA2NzgyIDczMTEgNzIxMCA3OTA2IDc0MzIgNzQ1NSA3ODEzIDc5NDUgNzkxOSA5MzU4IDgyOTggNzgxNyA4NDYzIDk3NTQgODU4MCA4NzkyIDk3NzggOTg5MSA5NzIzIDEwMTc0IDEwMTI2IDEwMzU5IDEwMjc1IDEwMzMzIDEwMjcxIDEwOTI4IDk3OTYgOTc4NCA4OTY5IDEwMjc3IDg1ODAgNzc3MgorMTEgNyAxIDQgMTcgNCAyIDMgMiAyIDIgMTQgMyAzIDMgNSA4IDEwIDUgNSAzIDMgNSAxIDQgOSA3IDE1IDEzIDUgOSA5IDYgNCA4IDggMyAxIDMgNAorMSA1IDcgNyA1IDUgNiA1IDEwIDkgNiA0IDYgMTMgNyAxMCA4IDUgNyAxMiA3IDcgNiA5IDEwIDcgNSA5IDE0IDEzIDggMTEgOCA3IDEwIDggOSA4IDEwIDkKKzg1NDIgOTA4OCA4NTE3IDc4NTEgNzQyMSA3NDY2IDcxMDQgNzE4OCA2ODY4IDc0MjUgNzE4MyA3Njc3IDczOTkgNzgwNiA3Nzk2IDgwODIgNzkyNSA5MTAzIDgyNjkgODA4NSA4NDMwIDk1OTggODUxOSA4ODE3IDk3ODkgOTcyNyA5NjA4IDEwMTE2IDEwMjMxIDEwNTM2IDEwMjIzIDEwMzg4IDEwMjE5IDEwNzAyIDk4MDcgOTY4OCA4OTc1IDEwMTUxIDg2MjEgNzg1OAorMCAxIDMgNCAyIDIgMyAyIDkgNyAzIDEgMyAxNCA0IDggNSAxIDMgMTEgMyAzIDIgNiA2IDMgMSA1IDEzIDEwIDQgNyA0IDMgNiA0IDYgNCA3IDYKKzMgNiA3IDcgNSA0IDggNyAxMCA3IDUgNSA1IDcgMyA5IDYgNiA4IDExIDcgOCA2IDEwIDExIDEwIDkgMTAgMTIgMTAgMTEgMTAgMTAgNyA4IDkgOCA4IDcgNworODQwNSA4OTExIDg0ODMgNzgxMCA3MzYzIDcyNjMgNzEzMSA3MTg2IDY5NTIgNzQwOSA3MTMxIDc1MjMgNzM0MiA3NzY3IDc2NzggODE1MCA3ODgwIDg5MjUgODI2NyA4Mjc1IDgzOTggOTUxMyA4NDU5IDg5MDIgOTgyNSA5NzU3IDk1OTggMTAxMjMgMTAyODIgMTA1MTggMTAyNDggMTAzNzkgMTAyMTkgMTA0ODkgOTc2NiA5NjU5IDg5NTUgMTAwMzMgODU4NCA3ODE2CiswIDIgMyA0IDIgMSA1IDQgOSA0IDIgMiAyIDQgMCA2IDMgMiA1IDkgMyA0IDIgNyA4IDYgNSA2IDkgNiA4IDYgNiAzIDQgNSA0IDQgMyA0Cis2IDYgNCAxMCA1IDQgNSA1IDExIDkgNiA4IDE2IDE1IDExIDEyIDkgMTIgMTIgMTIgMTAgNyA2IDEyIDEyIDExIDEyIDExIDEzIDkgOSAxMCA2IDggOSA5IDcgNyA3IDYKKzgzNDggODc0NCA4MzczIDc5NTUgNzMwNyA3MDcyIDcwODAgNzA2MiA3MDU5IDc1MTcgNzEwNiA3NTYzIDc1NjcgODIyMiA3NzY3IDgzOTggNzkxMyA5MTI2IDgzNjcgODUxNSA4NDQzIDkzNzIgODQwMSA5MTA1IDk4ODYgOTg0NyA5NjY1IDEwMTkxIDEwMzU3IDEwNDM5IDEwMjIyIDEwMzcwIDEwMTE3IDEwMzUxIDk3NTIgOTYzMiA4OTEwIDk4NjEgODU0OCA3NzE1CisyIDIgMSA4IDIgMSAyIDIgMTEgNyAzIDUgMjIgMTggMTAgMTEgNiAxMCAxMSAxMSA3IDMgMiAxMCA5IDggMTAgOCAxMSA1IDUgNiAyIDQgNSA1IDMgMyAzIDMKKzEgMyA3IDggNyA4IDMgNCA0IDUgNCA1IDEyIDkgMTQgOCA1IDEwIDkgNyA2IDggNiA3IDExIDEwIDEwIDcgOCA2IDcgMTMgMTAgOCA4IDkgNyAxMCAxMCA3Cis4MTY1IDg0MDMgODM0MiA3OTY5IDczMDMgNzEzOSA2OTc5IDY4ODQgNjk4NSA3MzczIDcwMzAgNzQxNiA3Njg0IDgyODEgNzkzMCA4Mzg1IDc4NDMgOTE5MiA4Mzg4IDg0MzQgODM4NSA5MzAxIDgzNDQgODk4OCA5OTIwIDk4NzAgOTY3OSAxMDAwOSAxMDMwMiAxMDE4MSAxMDE0NSAxMDU0NiAxMDEyMCAxMDIyMSA5NzEzIDk2MDcgODg2NiA5ODgzIDg1OTAgNzY4MgorMCAwIDMgNSA0IDUgMCAxIDEgMiAxIDIgMTIgNiAxNiA1IDIgNyA2IDMgMiA0IDIgMyA4IDYgNyAzIDQgMiAzIDEwIDYgNCA0IDUgMyA2IDcgNAorNCA2IDQgMyA1IDUgNiA2IDkgOSA3IDYgNCA1IDUgNSA3IDYgMTQgMTAgNyAxMCA5IDExIDggMTYgMTcgMTAgOCA4IDExIDEyIDEzIDkgOSA5IDggOCA4IDUKKzgwNjMgODI2NyA4MjM2IDc2NzUgNzI0OCA3MDE3IDY5NTggNjgzOSA3MDQwIDc0ODMgNzAzMyA3MzM5IDc1OTQgODA5MSA3ODU5IDgxODkgNzgyNiA5MDA5IDg1MzYgODU0MiA4MzU0IDkzNTcgODM2NSA5MTI0IDk4NzYgMTAyNjAgOTg3MSAxMDAyMiAxMDI0OSAxMDA2MSAxMDE3MiAxMDY1MCAxMDE5OSAxMDE2MCA5NzAwIDk1ODMgODg0OSA5NzgxIDg1ODAgNzUyOAorMSAyIDEgMCAyIDIgMyAzIDcgNyA0IDMgMSAyIDIgMiA0IDIgMTUgNyAzIDcgNiA4IDQgMTcgMTkgNiA0IDQgOCA5IDExIDUgNSA1IDQgNCA1IDIKKzEzIDkgOCA1IDggNCA1IDEzIDEwIDggMTAgNSAzIDUgNiA2IDkgNyAxMCAxMiA5IDggNiA5IDEwIDkgOSAxMCA2IDUgNyAxMCA4IDEwIDkgOCA5IDggOCA2Cis4MTk0IDgzMjMgODIzNCA3NTIxIDcyNzEgNjg0MSA2OTEyIDcyMjcgNzExOSA3NTI1IDcxMTMgNzIwNSA3NDgxIDc5MTIgNzgxNiA4MDY2IDc4NjAgODg5OCA4NTc4IDg3NjYgODM3NSA5Mjg3IDgzMDkgOTEyOSA5ODg1IDEwMTk3IDk4NTQgMTAwMzUgMTAxNDYgOTc2NCAxMDA5NyAxMDYyNSAxMDE0OCAxMDE2NCA5Njg3IDk0OTkgODg1OCA5Njg1IDg1NzAgNzQ0NAorMTMgNiA1IDIgNSAxIDIgMTUgOSA1IDkgMiAwIDIgMyAyIDYgMyA3IDExIDYgNCAyIDYgNiA1IDUgNiAyIDEgMyA2IDQgNiA1IDQgNiA0IDUgMworMTIgMTYgMTUgMTQgOCA3IDEwIDYgNiA4IDcgNCA2IDUgNyAxMCA2IDYgNyAxMSA4IDExIDEyIDcgMTAgNiA3IDcgOSAxMCAxNSAxMSAxMyAxMSAxMCA3IDkgOCAxMSA4Cis4Mjk2IDg4MDYgODQxMSA3OTI5IDcyOTMgNjg2MCA2OTk1IDcxNjIgNzA5NCA3NTY1IDcxMTQgNzAxOCA3NDQ3IDc3NDQgNzc5OSA4MTk2IDc4MTcgODczMiA4NTQyIDg5MTUgODM3MCA5NDA1IDg0MDggOTAxMSA5ODkzIDk5NTMgOTc4NiA5ODYyIDEwMTIyIDk3OTIgMTAyMjggMTA2NjMgMTAyMjYgMTAyMjkgOTcwMCA5MzU5IDg4NjYgOTU5NSA4NjM3IDc0ODgKKzExIDE5IDE3IDE2IDUgNCA5IDMgMyA1IDQgMSAzIDIgNCA4IDMgMiAzIDkgNSA4IDExIDMgNiAyIDMgMyA1IDYgMTUgNyAxMSA4IDcgMyA2IDQgOSA1CisxNyAyMyAxNiA2IDExIDExIDYgNSA3IDExIDggNiA4IDYgNSA5IDYgOSAxMSA5IDkgNyA5IDExIDcgNyA3IDggMTQgNyAxMCAxMCA4IDggOCAxMCA5IDYgOSA1Cis4NTIzIDk2OTAgODYxMCA3ODIxIDczOTIgNzEyNCA2OTczIDcwMzkgNzA5NSA3Nzg2IDcxNDAgNjk2NSA3NDY1IDc2NDggNzczMiA4MjU3IDc3NzUgODc2MSA4NjA5IDg5MzMgODM5MSA5MjcwIDg0MjggOTE0NiA5ODI0IDk3ODUgOTcyMCA5NzYxIDEwMjI3IDk2MzQgMTAyMjggMTA2MzcgMTAxNzUgMTAxMDYgOTY2MiA5NDExIDg4NzQgOTM4NyA4NjUxIDczNDUKKzIyIDM3IDE5IDMgMTAgMTAgMyAyIDQgMTAgNSAzIDUgMyAyIDYgMyA2IDkgNiA2IDMgNiA4IDMgMyAzIDQgMTMgMyA2IDYgNCA0IDQgNyA2IDIgNiAyCisxNCA4IDExIDggNCA2IDUgMTMgMTEgNyA1IDcgOSA2IDQgNSA2IDkgMTEgOCA3IDggOCA4IDkgOCAxMCAxMSA5IDEyIDkgOSA3IDEwIDcgNyAxMSA5IDggOAorODY2OCA5NjAwIDg2NzYgNzg0MyA3MzA5IDcwNjUgNjkyNiA3NDE1IDcxOTkgNzc0OCA3MDg5IDY5NzcgNzUwOCA3NTU3IDc2NDEgODA2OCA3NzM0IDg3ODggODY3NSA4ODg4IDgzNjAgOTIwNSA4NDIyIDkwODggOTgwOCA5Njg5IDk3MzIgOTg1MSAxMDIwMSA5NzkzIDEwMjAyIDEwNTUxIDEwMDk5IDEwMTE0IDk1OTkgOTI3NiA4OTMzIDkzNzYgODYzOSA3Mzk1CisxNSA0IDkgNSAxIDMgMiAxNCAxMCA0IDIgNCA3IDMgMSAyIDMgNiA5IDQgMyA0IDUgNCA1IDQgNiA4IDUgMTAgNSA1IDMgNiAzIDMgOSA1IDQgNQorNCA2IDQgNSA1IDMgNiAxMiA5IDYgNiA4IDcgNiA3IDkgMTEgMTEgNyA5IDkgNiA3IDcgMTAgMTIgMTMgOCAxMiAxMiA4IDkgMTEgMTEgOCA4IDExIDExIDcgNworODU1MyA5MzkyIDg1NjEgNzY3OSA3MjU0IDY4MjUgNjkwNiA3NzA3IDcyNDkgNzY1MSA3MDY1IDcwNDkgNzQ5OSA3NDcyIDc2MjkgODEzNiA3ODIyIDg5MzYgODYzNyA4OTA3IDgzODEgOTAyMSA4MzkwIDg5NzIgOTgxOCA5ODQ0IDk4MjEgOTc1MSAxMDI1MyA5OTQyIDEwMTUxIDEwNDcwIDEwMTI4IDEwMTgyIDk1NjMgOTIxMCA4OTkxIDk0ODkgODYwMiA3MzgxCisxIDIgMSAyIDIgMCAzIDEyIDcgMyAzIDUgNCAzIDQgNiAxMCA5IDMgNiA2IDIgMyAzIDYgOSAxMSA0IDkgOSA0IDUgOCA4IDQgNCA5IDggMyA0Cis2IDEwIDUgNCAzIDUgMTAgNyA2IDYgNCA2IDEyIDYgNCA3IDYgOCA3IDkgNSA3IDkgMTEgOCAxNCAxMiA5IDE5IDEwIDcgMTAgMTAgMTIgMTEgMTIgMTEgOCA4IDcKKzg0OTIgOTQ0MiA4NDc1IDc0NjQgNzE0OSA2NzIyIDY5ODkgNzY3NCA3MjIxIDc1NjAgNjk5MCA2OTk0IDc2MTggNzM5MiA3NTQwIDgwNzcgNzc4MCA4ODkxIDg2MDAgODkyNSA4Mjk5IDg5MDkgODQxMCA5MTA5IDk3NzcgMTAxMTMgOTg4MiA5NzE4IDEwNDgyIDk5NTkgMTAwNzYgMTA0NTYgMTAxMzAgMTAzMDggOTYwNSA5Mzk0IDkwNDcgOTQxMSA4NTkxIDczNjgKKzIgNyAxIDEgMCAyIDkgNCAzIDMgMSAzIDEyIDMgMSA0IDMgNCAzIDYgMiAzIDYgOCA0IDEzIDkgNSAyMyA2IDMgNiA2IDkgOCAxMCA5IDQgNSA0Cis2IDggOSAxMCA0IDggMTIgNyA0IDYgOSA5IDcgNyA1IDcgNiAxNCA3IDUgNCA2IDEwIDEwIDEwIDE1IDEwIDggMTMgMTAgMTAgOSAxMyA5IDYgOSAxMSA4IDcgNQorODQzMyA5MzY3IDg0OTMgNzYzMCA3MDcyIDY4MTAgNzEyMSA3NjQzIDcxNDIgNzQ3NSA3MDQ1IDcxMjcgNzYwNiA3Mzc4IDc0NzkgODAyMiA3NzM5IDkyMTcgODU2NCA4Njk2IDgxOTQgODc0MyA4NDU1IDkxNzYgOTc4OCAxMDQyNyA5ODkwIDk2MjYgMTA1NTIgOTk3NSAxMDA4MCAxMDM4MSAxMDIwOSAxMDI0MiA5NTE4IDkzODMgOTEwMiA5MzM3IDg1NTUgNzIzMworMiA0IDYgOCAxIDYgMTMgNCAxIDMgNyA3IDQgNCAyIDQgMyAxNCAzIDEgMSAyIDcgNyA2IDE0IDYgNCAxMCA2IDYgNSAxMSA1IDIgNSA4IDQgMyAyCis5IDkgNyAxMSAxMCAxNSAxMyA4IDEwIDExIDkgNSA1IDQgMiA1IDYgNiA1IDUgNSA1IDUgOSA5IDkgMTEgOSA4IDggMTAgMTAgMTIgMTIgOSA4IDEwIDEwIDcgOAorODQ1MiA5MzU3IDg0NTkgNzg0OCA3MTUxIDczMjIgNzI3NSA3Njc1IDcyMTkgNzcwMiA3MDk5IDcwMDYgNzU0MyA3MTgxIDczNDMgNzg0NyA3Njk5IDkwMzIgODQ3OCA4NDgxIDgxMTcgODUyNSA4MzcxIDkxNzggOTc3MyAxMDM1NCA5OTI0IDk2MDEgMTA0OTMgOTg2OCAxMDA4MyAxMDM3MiAxMDI2MCAxMDM2NCA5NTEwIDkzMTEgOTEzMCA5MzkxIDg1MjAgNzI5MAorNiA1IDMgMTAgOSAxOSAxNSA1IDggMTAgNyAyIDIgMSAwIDIgMyAyIDEgMSAyIDEgMSA1IDUgNSA4IDUgNCA0IDYgNiA5IDkgNSA0IDcgNyAzIDUKKzE0IDE0IDExIDEwIDkgMTIgMTMgMTAgOCA5IDggOCA5IDYgMTAgMTAgMTAgNyA2IDcgMTAgNiAxMCA4IDUgNiA4IDEwIDkgMTYgMTIgMTQgOSAxMiA4IDkgOCAxMSA3IDYKKzg1OTggOTY1NSA4NTI5IDc5OTEgNzIwMiA3NjE5IDc0MjUgNzgyOCA3MjQzIDc3OTIgNzEyNiA3MDc3IDc1ODQgNzExOCA3NDE1IDc5OTAgNzc2MiA4OTIwIDg0MTkgODQwMiA4MTY5IDgzODIgODQxNyA5MTE4IDk2NTYgMTAxMDEgOTg4MCA5NjM5IDEwNDYxIDEwMjU4IDEwMTM4IDEwNjA5IDEwMjMzIDEwNDc5IDk0NzcgOTMwNSA5MTA2IDk1MDMgODQ4NiA3MjIxCisxNSAxMyA5IDggNyAxMiAxNCA4IDUgNiA1IDUgNiAzIDggOCA4IDMgMiAzIDggMiA3IDQgMSAyIDQgNyA1IDE3IDkgMTIgNSA5IDQgNSA0IDggMyAzCis5IDEzIDggMTAgMTMgMTEgMTYgOCA4IDcgMiA1IDggNiAxNSAxMSA0IDUgNyA4IDQgNyAxNiA5IDEwIDkgMTAgOCAxMCAxMCAxNSAxNCAxMCAxMCA5IDEwIDggMTEgOCA2Cis4NjEzIDk4NzQgODUyMCA4MTI1IDczNTQgNzgzNyA3NjQ4IDc4NDkgNzI2NiA3NzU0IDY5OTkgNjk1OSA3NTk5IDcwNTkgNzYxMyA4MTg2IDc2NzAgODY5MiA4Mzg3IDgzODkgODA2NyA4MzA5IDg2MTUgOTEyMyA5NjcwIDEwMDQ3IDk4ODggOTU1MiAxMDQ1NSAxMDI1NiAxMDI2OCAxMDgzMiAxMDIzMyAxMDQ2NCA5NDcwIDkzNjEgOTA4MyA5NjA4IDg0NzggNzE1NgorNiAxMSA1IDggMTQgMTAgMjEgNSA1IDQgMCAyIDUgMyAxOSA5IDEgMSAzIDUgMSAzIDE5IDYgNyA1IDYgNCA2IDYgMTQgMTIgNiA2IDUgNyA0IDggNSAzCis0IDggMTAgMTAgNiAxMSAxNyAxMCA3IDkgNiA1IDUgMTAgMTQgNCA3IDYgNiA5IDkgNSA3IDggMTAgMTEgNSA2IDcgOSAxMyAxNCAxMiAxMiAxMSA5IDExIDEwIDkgNgorODUwMCA5NzczIDg1NjIgODI1MSA3MzIzIDgwNDIgNzg5MSA3OTkyIDcyNjMgNzg0MSA2OTc3IDY4NDggNzUzNyA3MjQ5IDc3ODAgNzk0MCA3NjU3IDg1MzkgODMzMSA4NDM4IDgwOTUgODExNyA4NTc4IDkwNjcgOTY4NCAxMDEyMCA5NzY4IDkzNDcgMTAzNzIgMTAxOTMgMTAzNDMgMTEwNDIgMTAyODQgMTA1NzMgOTUxNCA5MzUyIDkxMzcgOTY0NSA4NDk2IDcwOTUKKzEgNCA3IDggMyA5IDI0IDggNCA2IDMgMiAyIDggMTYgMSA0IDIgMiA2IDYgMiAzIDQgNyA4IDEgMiAzIDUgMTEgMTIgOSA5IDggNSA4IDcgNiAzCis4IDEwIDQgOCA1IDYgNCAyIDIgNyA4IDQgNyA3IDggNiA0IDUgNyA1IDggMTAgOCAxMCA5IDkgMTAgOSA5IDExIDkgNyAxMiAxMSAxMSA4IDggOSA3IDcKKzg0OTIgOTgwMSA4NDUwIDgyNDcgNzI2OCA3OTI4IDc3OTYgNzYzNSA3MTMyIDc4MDAgNzAwNyA2NjgyIDc1MjcgNzI0NCA3NzkwIDc4MzIgNzU2OCA4MzMzIDgzMDEgODIzOCA4MDk3IDgyNDQgODU2OCA5MTM3IDk2NzIgMTAwNjUgOTc3OSA5MzM5IDEwMzQzIDEwMjU3IDEwMzE0IDEwODA5IDEwMzM0IDEwNjE0IDk1NTcgOTI4MiA5MTEzIDk2MTkgODQ2MiA3MDk5Cis1IDYgMSA1IDIgMiAxIDAgMCA0IDUgMSA0IDQgNSAzIDEgMiAzIDIgNSA4IDUgNyA1IDUgNiA1IDUgOCA1IDMgOSA3IDggNCA0IDUgMyA0Cis4IDExIDcgNCA2IDcgNCA2IDcgNCA3IDQgOSA3IDQgNCA0IDYgMTAgOSA3IDE0IDggMTAgMTIgOSA3IDYgOCA4IDEwIDEzIDEzIDEwIDEwIDkgOCA4IDggNworODQ4NCA5ODg4IDg0MTcgNzk5NyA3MjM5IDc4ODIgNzcwMyA3NTQ1IDcxMzIgNzU3NyA3MDExIDY1MjYgNzU2OSA3MjM5IDc2OTcgNzYwNyA3NDgxIDgyMDEgODM0OSA4Mjk2IDgwNzMgODYwOSA4NTU4IDkyMDMgOTczNyAxMDAxNCA5NzEzIDkxNDcgMTAyODkgMTAxMzMgMTAzMTIgMTA5NTkgMTA0MDggMTA1OTEgOTU3NCA5Mjc4IDkwOTAgOTUzMyA4NDU1IDcxMDMKKzUgOCAzIDEgMyA0IDEgMyA0IDEgNCAxIDcgNCAxIDEgMSAyIDcgNiA0IDE1IDUgNyAxMCA1IDMgMiA0IDQgNiAxMCAxMSA2IDcgNSA0IDQgNSA0Cis2IDUgNSA4IDYgMyA2IDcgNyA2IDkgMTAgOCAxMiAxMCA3IDYgMTkgMTggMTAgNiA4IDggMTEgOSA1IDkgMTAgMTAgMTAgMTEgMTIgOCA2IDggMTIgMTEgOSA3IDkKKzg0MjUgOTYwMSA4MzM0IDgwMDggNzIxMSA3NTkzIDc2NjQgNzUyMiA3MTMyIDc0OTEgNzA2NiA2NzQ4IDc1ODQgNzU0MSA3NzYwIDc1ODAgNzQ0NyA4ODc2IDg2MDAgODQxMiA4MDI0IDg1ODMgODU0OCA5MzI2IDk3MjMgOTcyMCA5NzAwIDkyMTIgMTAyODcgMTAxMzkgMTAzMzUgMTEwMzggMTAzNTIgMTAzMjQgOTUzOSA5NDU4IDkxNDQgOTUxMyA4NDIyIDcyMjkKKzIgMSAyIDUgMyAwIDMgNCA0IDMgNyA5IDUgMTIgOCA0IDMgMjcgMjUgNyAyIDUgNSA4IDUgMSA1IDcgNiA2IDggOCA0IDIgNCAxMCA4IDUgMyA3CisxMSA1IDggMTEgMTAgOSA2IDYgNiAxNiAxNCA4IDcgNyA4IDUgNiAxMCA2IDggNiA4IDYgMTEgOCA5IDggOSAxMiAxMCA5IDEyIDkgOSA5IDggMTIgMTEgNyA2Cis4NDk1IDkzMzIgODMzMCA4MjAzIDcyODYgNzY5MCA3NjI2IDc0MzkgNzEwNyA4MDI0IDcyNDcgNjgzNCA3NTczIDc1MTggNzc3MCA3NDMyIDc0MTQgODk1NyA4NTM4IDgzOTggNzk3NyA4NTU5IDg0ODcgOTQ0MiA5Njg0IDk2ODkgOTY2MiA5MjEyIDEwMzM2IDEwMTQ1IDEwMzA3IDExMTEyIDEwMzIzIDEwMjU3IDk1MzAgOTM4MiA5MjIyIDk2MTggODM5MCA3MTYzCis5IDEgNSA5IDggNiAzIDMgMyAyMSAxNyA1IDQgNCA1IDIgMyA3IDIgNSAyIDUgMiA4IDQgNSA0IDUgOSA2IDUgOCA1IDUgNSA0IDEwIDggMyAzCis3IDggMTUgMTkgMTIgMTAgMTMgMTIgMTEgNiA3IDQgNCA1IDcgNyA3IDkgNyAxMCA2IDcgNyA2IDEwIDkgMTEgMTEgOCAxMCAxNSA5IDEwIDEwIDEzIDggMTAgMTAgNyA0Cis4NDYxIDkyNjMgODUwNSA4ODc4IDc0MTAgNzg0MiA3NzY3IDc3MjkgNzIxMCA3OTExIDcyNDUgNjY2OSA3NDg2IDczNzQgNzc1NCA3NDE2IDc0MDcgODk3MiA4NTAzIDg1MDggNzkzMSA4NDc1IDg0NTQgOTI0NCA5Njk3IDk2NjAgOTcwMSA5MzM1IDEwMjgyIDEwMTUwIDEwNDMzIDEwOTk4IDEwMzIwIDEwMjU1IDk2MjQgOTMxMCA5MjQ3IDk2NTUgODM1OSA2OTc4CiszIDQgMTcgMjcgMTIgOCAxNCAxMiAxMCAzIDQgMSAxIDIgNCA0IDQgNiAzIDcgMiAzIDMgMiA3IDUgOCA4IDQgNiAxNCA1IDYgNiAxMSA0IDcgNyAzIDEKKzYgNyA3IDEzIDE2IDEyIDkgMTEgNiA1IDQgNCA0IDggOSA1IDggNCA1IDYgNyAxMSA4IDEwIDcgOCAxMSAxMSAxMCAxMiAxMSA5IDExIDEwIDkgOSAxMiAxMiA4IDEwCis4NDAzIDkxMzcgODQ3MSA5MTQ0IDc2MzQgODEwOCA3ODAzIDc5NDEgNzE4MyA3NzQzIDcxNjYgNjUxNCA3NDAxIDc0MjMgNzc5MCA3Mjc4IDc0MjYgODY3OSA4NDE4IDgzNjYgNzkxMSA4NjQyIDg0NDcgOTMwMyA5NjMzIDk1NzEgOTc0MCA5NDUwIDEwMjgwIDEwMjc4IDEwNDUzIDEwODkxIDEwMzQzIDEwMjU0IDk2MTMgOTMwNCA5MzIyIDk4MTIgODM1NCA3MTczCisyIDMgMyAxMiAyMiAxMSA2IDEwIDMgMiAxIDEgMSA1IDYgMiA1IDEgMSAyIDQgOSA1IDcgMyA0IDggOCA2IDkgNyA1IDcgNiA1IDUgMTAgMTAgNSA5Cis3IDcgNiA4IDggOSA3IDEwIDggOCA3IDUgNyAxMSA5IDEwIDYgNiA5IDcgOCA2IDYgOSA4IDcgNiA2IDcgMTQgOSAxMyA4IDEyIDE2IDEzIDEyIDEyIDEwIDkKKzgzNzIgOTAxOCA4NDEyIDkwODYgNzY0NyA4MTc0IDc3ODcgODA3OCA3MjA4IDc3NjkgNzE2NiA2NDMwIDczOTUgNzY1MyA3ODI1IDc0NTUgNzM5MyA4NTI2IDg0MzcgODI5NCA3OTE4IDg0OTIgODM4OSA5Mjk3IDk1OTcgOTQyNiA5NjUwIDkyNTEgMTAyMDIgMTA1MjEgMTA0MjIgMTEwMzYgMTAyODkgMTAzNzYgOTc4MiA5NTQ0IDkzOTYgOTk2MCA4NDAxIDcyOTUKKzMgMyAyIDQgNSA2IDQgOCA1IDUgNCAyIDQgMTAgNiA4IDMgMiA2IDMgNSAyIDIgNSA0IDMgMiAyIDMgMTIgNSAxMCA0IDkgMTcgMTIgMTAgOSA3IDcKKzMgMyA5IDE2IDExIDkgNyA4IDcgNyA1IDYgNSA4IDYgMTEgOSA5IDExIDcgOSA4IDExIDEwIDkgOCA1IDcgOCA3IDEyIDExIDEwIDExIDEzIDEyIDkgMTIgOCA2Cis4MjM5IDg2NjEgODQzMiA5NTIzIDc3MzcgODIzNiA3NzcxIDgwODQgNzIwNyA3NzMyIDcxMTQgNjQxMiA3MzM4IDc2ODUgNzc4MyA3NjgzIDc0MzggODU2NyA4NTA3IDgyMjYgNzk1MCA4NDc0IDg0NjAgOTM1MyA5NTg3IDkzNTEgOTUzNiA5MTI2IDEwMTUxIDEwMzE5IDEwNDY4IDExMDQ5IDEwMjg3IDEwNDI5IDk4NzAgOTcwOCA5MzkxIDEwMDk5IDgzOTUgNzIyNQorMCAwIDYgMTggMTAgNiA0IDUgNCA0IDIgMyAyIDUgMyAxMCA3IDYgOSAzIDYgNSA5IDcgNSA0IDEgMyA0IDMgOSA3IDYgNyAxMSAxMCA1IDkgNSAzCis5IDEyIDYgMTQgMTMgMTAgNyAxMyA5IDcgMyA5IDExIDggNCAxMSAxMyAxMCA2IDYgOCA4IDYgMTEgNyA4IDkgNiAxMCAxMCAxMSA2IDkgMTEgMTAgMTEgNyAxMiA5IDcKKzgyNjMgODg3OCA4Mzc0IDk4MTEgNzg3NiA4MzU2IDc3NTUgODM5NyA3MjU3IDc2OTggNzAxMyA2NTgwIDc0MzYgNzcxNSA3NjkwIDc4OTcgNzU4NCA4NjY3IDg0NDggODEwMSA3OTU2IDg0NTcgODQwMiA5NDY3IDk1MjYgOTI4MSA5NTI4IDg5NDcgMTAxNTMgMTAzMTQgMTA0ODcgMTA3NTQgMTAyNjAgMTA0NzkgOTg3OSA5ODAxIDkzMzUgMTAyMzAgODQxNSA3MjIxCis2IDEwIDIgMTMgMTQgNyA0IDEzIDcgNCAwIDcgMTAgNSAxIDEwIDE0IDcgMiAyIDUgNSAyIDggMyA0IDUgMiA2IDYgNyAyIDUgNyA2IDggMyA5IDYgNAorOSA1IDEwIDE1IDggNyAxMSAxNSA2IDQgNyA5IDYgNiA2IDEzIDE1IDcgNiA2IDcgOCAxMSAxMiA2IDkgMTEgNyAxMSAxMiAxMyA3IDExIDEyIDEyIDkgOSA4IDcgOAorODI4NiA4NjUyIDg0MjAgMTAxNDMgNzg4MyA4Mjg0IDc4NDIgODgxNCA3MjI5IDc0ODEgNzAxNiA2NzM4IDc0MDMgNzYyMCA3NjUxIDgyMjEgNzc3OCA4NTc3IDgzOTAgNzk4MyA3OTM2IDg0NDEgODQ3MyA5NjM2IDk0NDEgOTI3NyA5NTcxIDg4NDAgMTAxODAgMTA0MzIgMTA1NTcgMTA1MzggMTAyODUgMTA1ODcgOTkzOSA5NzY1IDkzMzIgMTAxMDcgODM4MyA3Mjc5Cis2IDEgNyAxNSA1IDMgMTAgMTcgMyAxIDQgNyAzIDMgMyAxMyAxOSAzIDIgMiA0IDUgOSAxMCAyIDUgOCAzIDggOSAxMCAzIDggOSA5IDUgNSA0IDMgNQorMTAgNSAxNCAxNSA4IDYgMTEgOSA2IDcgMTMgMTEgNyA4IDYgNyA1IDYgMyA3IDEwIDggMTAgMTIgNSA3IDggMTAgMTEgOSAxMCA5IDExIDEwIDE0IDEzIDEyIDggNyA2Cis4MzM0IDg0NDAgODU2NyAxMDQ1NiA3ODkwIDgxNTUgNzkyNyA4ODM4IDcyMDEgNzQ2MiA3MTczIDcwMDkgNzM5NyA3NjU0IDc2MTMgODE1NyA3NzExIDg0MzEgODI1NyA3OTM0IDc5OTMgODQyNiA4NTE3IDk3OTUgOTMzMyA5MTUwIDk1MzYgODkyMyAxMDIwNyAxMDM1OSAxMDU0OSAxMDQ1OCAxMDMwOSAxMDU2NiAxMDA0OCA5OTc3IDk0MDUgOTk5MiA4MzUyIDcyMTAKKzggMSAxNSAxNCA1IDIgMTAgNiAzIDQgMTUgMTEgNCA1IDMgMyAyIDIgMCA0IDggNSA3IDEwIDEgMyA0IDcgOCA1IDYgNSA4IDYgMTMgMTEgMTAgNCAzIDMKKzEyIDExIDE0IDggOSA3IDkgOCA3IDYgNCA1IDYgMTEgOSA0IDQgNyA2IDcgOCAxMCAxMCA4IDYgOCA4IDE0IDExIDExIDEwIDkgOSAxMCAxMiAxMSA4IDEwIDEwIDEwCis4NDMyIDg2MDkgODcxMSAxMDMyMCA3OTIzIDgwOTUgNzk1OSA4Nzk5IDcyMDAgNzM4MiA3MDk2IDY4OTUgNzM2NSA3ODcwIDc2NTMgNzkxMyA3NjIwIDgzNTUgODIwNCA3ODg4IDc5OTcgODUzNCA4NTYwIDk2OTggOTI1MyA5MDkyIDk1MDIgOTI0NyAxMDIzMyAxMDQxMyAxMDU0MSAxMDM4MyAxMDI4MSAxMDU0NiAxMDEwMyAxMDA1NCA5Mzc0IDEwMDA2IDgzOTkgNzM5MQorMTEgOSAxNSA0IDYgNCA2IDQgNCAzIDEgMiAzIDEwIDYgMSAxIDMgMiA0IDUgNyA3IDQgMiA0IDQgMTQgOCA3IDYgNSA1IDYgOSA4IDQgNiA3IDgKKzYgMyA2IDcgOCA5IDYgNSA0IDggMTAgNyA4IDExIDggNiA4IDcgNyA3IDggOSA3IDYgOCAxMiA5IDEzIDExIDkgMTEgMTEgOSA4IDEwIDggOCA2IDkgOQorODM3NCA4Mjc2IDg2NDYgMTAxMzAgNzkyOSA4MTYyIDc5MTMgODU3OCA3MTIyIDc0MzAgNzE3NCA2OTExIDczODUgODA3MyA3NjY2IDc4MDYgNzYzNCA4MjgzIDgxNzggNzg0NCA4MDAxIDg1NzQgODUyNSA5NDg0IDkyMjYgOTI4MyA5NDk0IDk0OTAgMTAyNTggMTAzNDEgMTA1NTkgMTA0MzUgMTAyNTQgMTA0MDQgMTAxMDYgOTk0MiA5MzQ0IDk3NzQgODQxOSA3NTAwCisyIDAgMiAzIDUgNiAzIDEgMSA1IDkgNCA1IDkgNSAzIDUgMyAzIDQgNSA2IDMgMiA0IDEwIDUgMTIgOCA1IDcgNyA1IDQgNiA0IDQgMiA2IDcKKzQgNyAxMSAxNyAxMCA3IDUgNyA3IDUgNyA2IDE1IDkgNSA2IDYgNyA2IDYgNyA3IDYgOCA5IDYgOCAxMCAxMiAxMCA5IDEwIDEwIDEwIDEwIDggOCA4IDggNgorODI2NyA4MjA5IDg3MTEgMTA1NjYgNzk4NiA4MTAyIDc4NDMgODQ5MyA3MTIzIDcyOTEgNzE3MyA2ODY0IDc1ODQgODE0MSA3NjAyIDc3MDYgNzU5NiA4MjE2IDgxMjcgNzc0MiA3OTgwIDg0ODkgODQ2NSA5NDA2IDkyMjUgOTA5NCA5NDYxIDk1MzQgMTAzMDggMTAzMzQgMTA1MjUgMTA0MjMgMTAyNTMgMTAzOTQgMTAxMDkgOTgzNyA5MzE1IDk2NzkgODQxMyA3NDE4CisxIDMgOSAxOCA4IDQgMiAzIDQgMiA0IDMgMTkgNiAyIDMgMyAzIDIgMyA0IDMgMiA0IDUgMiA0IDcgOSA2IDUgNiA2IDYgNiA0IDQgNCA1IDMKKzggNSA2IDcgNyAzIDMgNCA4IDMgNyA5IDE0IDExIDUgNSAxMCA5IDEwIDExIDggNiA4IDYgNiA3IDEwIDEwIDkgMTAgMTEgOCA2IDkgMTEgMTEgMTAgMTAgMTEgNworODI2NSA4MDIzIDg2NDYgMTAzNjIgNzk2NSA3ODAwIDc3MjMgODIyOSA3MTQ5IDcwMzcgNzE3MiA3MDA1IDc3NTIgODMyOCA3NTQwIDc1NTAgNzY2MiA4Mjc1IDgxNzkgNzk1MyA3OTg1IDgzNDggODQ1OCA5MjEwIDkxNDggODk3OCA5NDgwIDk1NzYgMTAyODAgMTAzMjggMTA1NDMgMTAyODkgMTAxNTAgMTAzMjMgMTAxMzcgOTkyMiA5MzM4IDk3MTIgODQ4NCA3NDAzCis1IDIgMiAzIDQgMCAwIDEgNSAwIDQgNyAxNiA5IDIgMiA4IDYgOCAxMCA1IDIgNSAyIDIgMyA3IDcgNSA2IDcgNCAyIDUgOCA4IDcgNyA5IDQKKzE3IDE0IDExIDExIDcgNSA3IDUgNiA0IDQgNCA4IDEwIDEwIDE0IDEwIDggNCA5IDggNSAxMiA3IDExIDcgNyAxMCAxMSA5IDEyIDExIDkgOCA3IDcgMTEgOCA5IDYKKzg0OTMgODQwMSA4NzExIDEwNDE2IDc5NDUgNzYzOSA3NzA5IDgwNDIgNzEyMyA2ODYwIDcwOTUgNjgzMCA3NzYyIDg0NDIgNzYwNyA3OTU3IDc3MjYgODI3MCA4MDc3IDgwMjggNzk5MCA4MTU0IDg1NTMgOTA4NyA5MjAwIDg4NjkgOTQyMiA5NjE1IDEwMzA0IDEwMjYxIDEwNTg2IDEwMzQ3IDEwMTI2IDEwMTk1IDEwMDYyIDk3NTYgOTM4NiA5NjIwIDg1MDIgNzMyNworMjIgMTUgOSA3IDQgMiA0IDIgMyAxIDEgMSA1IDcgOCAxNiA4IDUgMSA2IDUgMiAxMSAzIDggMyAzIDcgOCA1IDkgNyA1IDQgMyAzIDggNCA2IDMKKzI1IDE5IDYgMTIgNyA1IDUgNiA3IDQgOSA3IDQgNyAxMSA2IDUgNSA0IDggOCA3IDggOCA1IDggNiA1IDggOSAxMCAxNCAxMCA4IDkgOSAxMSA5IDkgNQorODkyMCA5MDY0IDg2NDYgMTA1MjggNzkyNSA3NDg3IDc2NDQgNzkyOCA3MTI0IDY2OTQgNzE0NyA2ODUwIDc2NzAgODM2NSA3Njk4IDc4NDggNzY2MCA4MDgxIDc5NzcgODAzNyA3OTk1IDgwOTQgODU0MyA5MDMzIDkwOTggODgyOCA5MzQwIDkzNDUgMTAyNTEgMTAxOTggMTA1NzcgMTA1ODYgMTAxMjggMTAwNzQgMTAwNDAgOTcyMyA5NDMyIDk1OTUgODUxOSA3MTk0Cis0NyAyNiAyIDkgNCAyIDIgMiA0IDEgNyA0IDEgMyAxMCAzIDIgMiAxIDUgNSA0IDUgNCAxIDQgMiAxIDQgNSA2IDEyIDYgNCA1IDUgOCA1IDYgMgorOSAxNyAxNiA4IDYgMTEgMTMgMTAgOSA0IDQgOCA3IDUgNSAzIDQgNSA0IDUgNSAxMCA4IDUgOCA2IDYgNSA4IDExIDkgMTQgMTMgOSAxMCAxMiA5IDggNiA0Cis4OTI3IDk1NjQgODgzOSAxMDM4NyA3ODgwIDc3MTMgNzc4NSA4MDY2IDcxNzYgNjUzOCA3MDcwIDY5MzAgNzY1NyA4MTcwIDc2MzMgNzU2MSA3NTcxIDc5MDMgNzg4MCA3ODYxIDc5MjMgODIyMiA4NTM0IDg3OTggOTA3NSA4NjY2IDkyNjAgOTA5MSAxMDE5OSAxMDI2MSAxMDU0MyAxMDgxMCAxMDIwNyAxMDAyMiAxMDA0NCA5ODc2IDk0MjYgOTUxMCA4NDU5IDcwMDgKKzYgMjAgMTkgNCAzIDEwIDE0IDggNyAxIDEgNSA0IDIgMiAwIDEgMiAxIDIgMiA4IDUgMSA0IDIgMiAxIDQgOCA1IDEyIDExIDUgNiA5IDUgNCAyIDEKKzYgNyA1IDMgOSAxNSAxMCA2IDUgNSA2IDUgNiA2IDggOSAzIDcgNiA1IDEyIDE1IDExIDggNyA4IDkgMTAgMTAgMTEgOSAxMCAxMSA4IDkgNyAxMSAxMSA5IDYKKzg4NTcgOTQyMCA4NzQ2IDk5NDggNzkxMyA4MTcxIDc4NDYgNzk1MCA3MTI0IDY0NTIgNzA0NiA2ODIxIDc2MTkgODA0OCA3NjQ2IDc2NjAgNzQ1OCA3ODU4IDc4MzYgNzY5NiA4MDMxIDg2NTAgODYwMiA4NzYxIDkwMjcgODYzNyA5MjU4IDkxNTkgMTAyMDAgMTAzMjEgMTA1MDkgMTA3NzUgMTAyMzMgOTkxMiAxMDAyMyA5NzEzIDk0NzEgOTYxNSA4NDc3IDY5NTYKKzIgMyAxIDAgNiAxOCA4IDIgMiAyIDMgMiAzIDIgNSA2IDAgNCAzIDIgMTEgMTcgOSA0IDMgNCA1IDcgNiA4IDUgNiA4IDQgNSAzIDggOCA2IDMKKzggOSAxNCA5IDggNCAzIDQgNSA1IDUgNSAxMCA4IDggNiA1IDcgNiA2IDYgOCA0IDggMTEgNiAxMCAxMSAxMSAxMiAxMCAxMyAxMSAxMCAxMCA5IDkgMTAgNyA1Cis4ODQwIDk0MDcgODg4NSA5OTA0IDc5MTkgNzkyNiA3NzI2IDc3MTggNzA3MyA2MzcyIDY5OTcgNjcxOCA3Njg0IDgwNTYgNzY1OSA3NTY5IDczOTkgNzgxNiA3NzkzIDc2MDIgNzk4MyA4NjIyIDg0ODkgODcyNiA5MDgyIDg0ODcgOTI4MiA5Mjg1IDEwMjI2IDEwNDM5IDEwNTAyIDEwOTI3IDEwMjU4IDk5MzEgMTAwMjggOTY4MyA5NDY0IDk2NTIgODQ0NCA2ODQ1Cis0IDUgMTQgNSA1IDEgMCAxIDIgMiAyIDIgOCA1IDUgMyAyIDQgMyAzIDIgNCAxIDQgOSAyIDcgOCA4IDkgNiAxMCA4IDYgNiA1IDUgNyAzIDIKKzcgMTQgMTUgMTcgMjAgOSA4IDUgMyA1IDkgNiA5IDYgOCA4IDUgOCA3IDcgOSAxMSA5IDkgMTMgMTAgMTIgOCA5IDkgMTAgMTYgMTQgMTIgNyA4IDEyIDcgNyA3Cis4Nzk4IDk3MDIgOTA0NiAxMDM1NCA4MjMyIDgwMDMgNzczNyA3NTYyIDY5NzMgNjI5NiA3MDUyIDY2ODMgNzcyMiA3OTQxIDc2NzIgNzYwNiA3MzQyIDc4MzggNzc3NyA3NTc1IDgwMTMgODc4MCA4NTA3IDg3NTUgOTE4NyA4NTkyIDkzNTcgOTIxOSAxMDIwMCAxMDM2NSAxMDQ5NSAxMTI1NCAxMDM1OSAxMDA3MiA5OTU2IDk1OTMgOTUzNCA5NTAyIDg0MTIgNjg2NAorMyAxMyAxNiAxOSAzMiA2IDUgMiAwIDIgNyAzIDYgMiA1IDUgMiA1IDQgNCA2IDkgNiA2IDEyIDcgMTAgNCA1IDUgNiAxNSAxMiA5IDMgNCAxMCAzIDMgNAorMiAzIDggMTEgMTEgMTAgMTEgNyA5IDUgNSAxMSAxMCA4IDcgNSAxMCAxNCA3IDggMTAgOSAxMCA4IDYgNyA4IDEyIDggMTUgMTMgMTIgMTUgMTUgNyAxMCAxMyAxMCA2IDYKKzg2MjkgOTMwNCA5MDI0IDEwNDA4IDgzMDcgODEzNyA3ODI1IDc1MzggNzAyOCA2MjI1IDcwMDMgNjk1NyA3Nzg0IDc5NTYgNzY1OSA3NDU2IDc0MTQgODIyNyA3NzYxIDc2MTIgODA2OCA4ODA2IDg1NTAgODcyMSA5MTExIDg1MDYgOTMyNyA5NDAzIDEwMTQ5IDEwNjY0IDEwNTY1IDExMzE2IDEwNDgzIDEwMzg5IDk4ODYgOTYzMSA5NjI4IDk1NDYgODM1NSA2ODIwCiswIDAgNCA3IDkgOCAxMCA0IDcgMiAyIDExIDggNSA0IDIgOCAxNSA0IDUgOCA2IDcgNCAyIDMgNCAxMCA0IDE0IDEwIDggMTQgMTQgMyA3IDExIDcgMiAzCis5IDkgNyA1IDYgOCA3IDYgNyA2IDcgMTAgOCA4IDcgMyA1IDYgMyA3IDggNiAxMiAxMSA2IDEwIDkgMTEgOCAxNCA4IDcgMTAgMTEgMTAgOCAxMCA4IDcgOAorODY0MyA5Mjk4IDg5NzcgMTAwOTAgODI1MyA4MTQwIDc4MDggNzQ1NCA3MDMxIDYyMjAgNzAwNyA3MTUzIDc3OTQgNzk3MCA3NjQ2IDcxOTIgNzM1NiA4MTAyIDc2NDMgNzU4NSA4MDcxIDg2NDYgODY0MyA4ODczIDkwMzYgODYxMCA5MzI0IDk1MTQgMTAxMDAgMTA4ODQgMTA1MDUgMTEwNjcgMTA0NzYgMTA0NDEgOTg5NCA5NTQ0IDk2NDMgOTQ2NCA4MzI1IDY5MDIKKzYgNSAzIDEgMiA1IDQgMyA0IDMgNCA5IDUgNSA0IDAgMiAyIDAgNCA1IDIgMTEgOSAyIDcgNSA4IDQgMTIgNCAzIDYgNyA2IDQgNyA0IDMgNQorMTAgNSAxMSA5IDEzIDkgNCAxMiAxMCAzIDggNyA4IDkgNSA4IDExIDYgNiA5IDcgOSAxMCA5IDEzIDYgMTEgMTAgMTMgMTIgMTAgMTEgNyA3IDcgNyA2IDggNyA2Cis4NjgyIDkwNDcgOTAzNCAxMDAzNyA4Mzc5IDgyMDQgNzcxNSA3NzQ0IDcxMTEgNjAzMSA3MDM2IDcxNTMgNzgwMyA4MDQ0IDc1ODIgNzI1MSA3NDUzIDc5ODQgNzYwNSA3NjgyIDgwNDggODY4MCA4NjgyIDg4OTMgOTE0MiA4NDYyIDkzNzIgOTU1NyAxMDE4MCAxMDk2OCAxMDQ5OCAxMTA3OCAxMDM5MyAxMDI0NCA5ODI1IDk0MDEgOTU1NSA5Mzg3IDgyOTYgNjg1NgorNyAxIDkgNSAxMyA2IDEgMTIgOSAwIDUgNCA1IDYgMiA1IDEwIDIgMyA2IDQgNiA3IDYgMTIgMiA4IDcgMTEgOCA2IDcgMyAzIDMgMyAyIDQgMyAzCis1IDggMTQgMTAgOCA2IDcgNiA2IDMgNiA2IDkgMTEgOCA1IDYgNiA2IDYgMTEgMTMgMTAgMTAgMTAgNyAxMSA4IDExIDEyIDEzIDEzIDExIDEyIDkgNyA3IDcgNyA1Cis4NTkzIDg5OTUgOTE2NiAxMDA0OSA4Mzc0IDgwODAgNzcwMSA3NjQ4IDcwODYgNTg1MyA3MDEzIDcwOTIgNzgzOCA4MjM3IDc1OTcgNzEyMyA3NDIwIDc4NzMgNzU2OCA3NTg5IDgxMjggODk1NyA4NzIwIDg5NzMgOTE2OSA4Mzg0IDk0MTkgOTQ3NSAxMDIwNyAxMTA0NyAxMDU2OCAxMTIxMiAxMDQxNCAxMDM2NiA5ODA5IDkyNjcgOTQ5NSA5MjUzIDgyNjcgNjc1MQorMSA0IDE0IDYgNSAyIDQgMyAzIDAgMyAzIDYgOSA1IDIgMyAzIDMgMyA5IDEyIDcgNyA3IDMgOCA0IDggOCAxMCAxMCA3IDkgNSAzIDMgMyAzIDIKKzYgOCA2IDQgNCA3IDYgMyAzIDQgNSAzIDYgNSA1IDggOCA5IDUgNiA2IDggNyA4IDkgNiA3IDggNiAxMSAxMCAxMyAxMiAxMSA5IDcgNyA3IDUgNQorODUzMSA4OTQ2IDkwOTAgOTY5MSA4MjY3IDgwMjUgNzY2MiA3MzczIDY5ODUgNTc0NyA2OTY1IDY4NTAgNzc5NSA4MDQ5IDc1MzUgNzE4NyA3NDM5IDc5NTMgNzUwNiA3NTAyIDgwNzggODkxMSA4NjgxIDg5MjYgOTE3MCA4MjQ5IDkzNjIgOTM5OCAxMDEwNSAxMTA2MCAxMDU1OSAxMTMzNyAxMDQ2MCAxMDQxOSA5Nzk0IDkxNDEgOTQzNiA5MTI3IDgxODggNjY1MworMiA0IDIgMSAxIDQgMyAwIDAgMSAyIDAgMyAyIDIgNSA1IDYgMiAzIDIgNCAzIDQgNSAyIDMgNCAyIDcgNiAxMCA5IDcgNSAzIDMgMyAyIDIKKzUgMTQgMTIgNSA4IDEwIDUgNyA0IDUgMTMgNSAzIDQgMyA2IDE1IDggNyA3IDUgNSA2IDggMTAgOCA3IDggMTAgOSAxMCAxNyAxMyAxMCAxMiA3IDkgNyA2IDUKKzg0NDUgOTI2OSA5MTY5IDk0MTYgODI2NSA4MTU3IDc1OTggNzM2MCA2OTEyIDU3MDkgNzEyMyA2NzQ2IDc2NzcgNzgxMSA3NDIzIDcxMjQgNzYzNiA3OTY3IDc0OTcgNzQ4MSA4MDA0IDg2ODMgODYxNyA4ODgxIDkxOTYgODI0NSA5MzA3IDkzMjUgMTAxMDggMTA5NDkgMTA1NTEgMTE3MDEgMTA1MzEgMTA0MDggOTg1NiA5MDIyIDk0MzAgOTAwOSA4MTM2IDY1NjEKKzEgMTQgMTAgMSA1IDggMiA0IDEgMiAxNSAyIDAgMSAwIDMgMTkgNSA0IDQgMiAxIDIgNCA3IDUgMyA0IDYgNSA2IDE2IDEwIDYgOSAzIDUgMyAyIDIKKzQgMTEgOSA5IDYgMTIgOSAxMCA2IDkgMTEgNCA3IDQgNiA4IDkgOSA3IDYgMTAgNSA5IDE0IDggMTAgOCA5IDExIDEyIDEzIDEyIDEzIDExIDE1IDkgMTAgMTEgOCA2Cis4MzM2IDkzODggOTE3MCA5NDA0IDgyMTIgODQwNCA3NjM4IDc1MzIgNjg5MiA1OTE5IDcyMjYgNjU4NyA3NjY0IDc1ODggNzM5MSA3MTg4IDc2NzUgODA0MSA3NDg4IDc0MDAgODA1OSA4NDY5IDg2MzEgOTIwOCA5MTcwIDgzNjQgOTI3OSA5MzE4IDEwMTM2IDExMDI5IDEwNjE5IDExNzM2IDEwNjAwIDEwNDU5IDk5OTMgOTAzMyA5NDUwIDkxNDQgODEzNyA2NTM1CisxIDggNSA1IDIgMTEgNiA4IDMgOCAxMCAxIDQgMSAzIDUgNiA2IDQgMyA4IDEgNiAxNCA0IDcgNCA1IDggOCAxMCA4IDEwIDcgMTUgNiA3IDggNSAzCis4IDEwIDYgMTAgOCAzIDMgNCA0IDkgMTEgNiA4IDMgNSA3IDcgNSA3IDQgOCA2IDggOSAxMCAxMSA4IDcgOSAxMyAxMyAxMCA5IDE0IDExIDcgOCA3IDcgNQorODMzMiA5NDM5IDkwOTQgOTQ1NCA4MjExIDgwODQgNzUyNCA3MzI1IDY4MjIgNjExNiA3MzI2IDY1NjAgNzY3NyA3MzE3IDczMzQgNzE4NiA3NjYyIDc4NjUgNzQ4MCA3MjAxIDgwNjIgODMyOSA4NjIwIDkyMDggOTE5NiA4NTM3IDkyNTEgOTE4OSAxMDExMyAxMTE2NSAxMDY4NiAxMTY0NiAxMDU2NSAxMDY5MSAxMDAyNCA4OTIxIDk0MTggOTAyNSA4MTEyIDY0NTAKKzUgNyAyIDcgNSAwIDAgMSAxIDggMTAgMyA1IDAgMiA0IDQgMiA0IDEgNSAyIDQgNSA3IDkgNCAzIDUgMTAgMTAgNSA1IDEyIDggMyA0IDMgNCAyCis3IDE0IDEzIDQgNCA0IDQgMTEgMTAgNiA2IDQgNiA1IDUgNCA1IDQgNSA4IDggOSA2IDggOCA4IDExIDExIDggMTMgMTAgMTMgMTEgMTQgOCA4IDcgOSA5IDUKKzgzMDIgOTczMiA5MTk5IDkxMzIgODEwOCA3ODQ0IDc0MzggNzU2MSA2OTA3IDYxMTcgNzI5NiA2NDEyIDc2MzggNzE4NSA3Mjc4IDcwMDAgNzU5OCA3NjM4IDc0MjEgNzI2MCA4MDY1IDgzODIgODU1OCA5MTQ3IDkxNzAgODUxNiA5MzAxIDkzMTMgMTAwNjUgMTEyOTMgMTA2NzQgMTE3NDUgMTA1ODIgMTA5MDkgOTk3OCA4ODc3IDkzNjEgOTAzNiA4MTM5IDYzNzAKKzMgMTMgMTIgMSAxIDEgMSAxMCA5IDMgMyAxIDMgMiAyIDEgMiAxIDIgNSA1IDYgMiA0IDQgNSA4IDggNCAxMCA2IDkgNyAxMiA0IDQgMyA2IDYgMgorMTQgMTcgMTQgNiA3IDggNiA2IDEwIDggOCAxMCAxMiA3IDUgNiA5IDcgNCA4IDggOSA3IDkgOCAxMCA3IDggOCAxMyAxMiAxMyA5IDExIDEzIDEzIDEyIDEwIDEwIDkKKzg0NTIgMTAxOTIgOTMyNyA4OTUyIDgwODQgNzg2NCA3NDA1IDc0NzUgNjk5MCA2MjQxIDczMTggNjY0MSA3NzU0IDcxODMgNzIyNCA2OTQ4IDc2MzggNzYwOSA3MzM3IDczMTUgODA2OCA4NDMyIDg1MjMgOTE1MSA5MTQ1IDg2MTkgOTI0NyA5MjQ1IDEwMDE4IDExNDE0IDEwNzE0IDExODM5IDEwNTQ3IDEwOTMwIDEwMDYxIDkxNDMgOTQzNCA5MTA4IDgxOTEgNjU0MAorMTUgMTkgMTQgMiA0IDUgMyAzIDkgNiA1IDkgMTIgNCAyIDMgNiA0IDEgNSA1IDYgMyA1IDQgNyAzIDQgNCAxMCA5IDkgNSA3IDExIDEyIDEwIDcgOCA3CisxMCA5IDYgNyA4IDkgOSAxMCAxMCA2IDggOSA4IDggNCA4IDkgNyA2IDYgNyA4IDEwIDEyIDEyIDkgMTEgMTEgMTUgMTUgMTAgMTIgNyAxMiAxMyAxMCAxMiAxNCA4IDgKKzg0OTYgMTAxMzMgOTI0NyA4ODQ0IDgwODYgNzk0NSA3NDUwIDc2NDAgNzA3MSA2MjM1IDczMzkgNjc5NSA3NzY0IDcyNDMgNzE0NSA3MDIyIDc2NzcgNzU4MiA3MzA3IDcyNDQgODA0NSA4NDE3IDg1NjUgOTMzOSA5MjIzIDg2NTQgOTI5NyA5MzY2IDEwMTUxIDExNjUwIDEwNzAyIDExODY1IDEwNDYyIDExMDExIDEwMTQyIDkyMDggOTUwNSA5NDIxIDgxOTEgNjYzOQorNyA1IDIgMyA1IDYgNyA4IDkgMyA1IDcgNSA1IDEgNSA2IDQgMyAzIDQgNSA3IDEwIDEwIDYgOCA4IDE1IDEzIDYgOCAzIDggMTEgNyAxMCAxNCA1IDYKKzcgMTAgMTEgOCAxMiAxMSAxNCA5IDkgNyAxMCA1IDUgNSAxMSA5IDggNSA3IDkgNyA4IDkgOCA4IDggNyA3IDEyIDEwIDExIDE1IDcgMTAgMTAgOSA5IDcgOCAxMAorODQ2MiAxMDEzOSA5Mjk3IDg4MDQgODE5MCA4MTQ0IDc2MjEgNzczNCA3MTI0IDYyOTAgNzQxMSA2Njk0IDc2OTcgNzExNSA3MjQ3IDcxNTMgNzY4OSA3NDM0IDczMDMgNzM2MiA4MDIzIDg0MDMgODU4MSA5MjcwIDkxOTcgODYyNiA5MjQzIDkyMzQgMTAyMDQgMTE1NjUgMTA3MTYgMTIwNzQgMTAzNzkgMTA5NjQgMTAxNDQgOTIwOCA5NDk3IDkyODUgODE5MSA2ODU1CiszIDYgOCA0IDExIDkgMTYgNiA3IDQgOCAyIDIgMiAxMCA3IDUgMiA0IDcgNCA1IDYgNCA0IDQgMyAzIDkgNSA3IDEyIDMgNiA2IDUgNSAzIDUgOQorMTMgMTEgOSA4IDkgMTIgNiA1IDkgNyA0IDcgNSA0IDQgNyA5IDQgNSA5IDEwIDEwIDYgNSA5IDkgOCA4IDEyIDggMTIgMTEgMTQgMTQgOSA3IDcgNiAxMCA4Cis4NTgzIDEwMjA2IDkyOTQgODc2NyA4MjE1IDgzOTIgNzU4NCA3NTc3IDcxNzYgNjM0MiA3MzI4IDY3MjIgNzYzMiA2OTMzIDcxNjggNzE1MyA3NzI3IDcyMzMgNzI0OCA3NDczIDgwNzggODUxMyA4NTIwIDkwMjEgOTE5NyA4NjYxIDkyMTYgOTE3MSAxMDI1NiAxMTM2MiAxMDc1NSAxMjAyNSAxMDQ3NyAxMTE2NiAxMDEyMCA5MDg1IDk0MzggOTA5NiA4MjQyIDY5MzUKKzEzIDggNSA0IDYgMTEgMyAyIDcgNCAxIDQgMiAxIDEgNCA2IDEgMiA3IDggNyAyIDEgNSA2IDQgNCA5IDMgOSA2IDEyIDEyIDUgMyAzIDIgOCA1Cis5IDkgNCA2IDUgNiA2IDUgMSA1IDcgOSA2IDUgNyA4IDcgMTIgMTIgOCA1IDYgMTEgOCA1IDggNiA5IDkgOSAxMCAxMiAxMyAxMSAxMSAxMSA4IDcgMTAgNworODU5OCAxMDE0NiA5MTY0IDg2MDkgODEzNyA4MjU3IDc1NDggNzQyOSA3MDIyIDYyNjggNzMyNCA2ODcxIDc1OTQgNjgyNCA3MTY4IDcyMTUgNzcxMyA3NTM2IDczNzMgNzUxNiA4MDA0IDgzNzAgODU4OCA4OTcxIDkwOTUgODYzMiA5MTM5IDkxNzMgMTAyMzAgMTEyMzMgMTA3NDIgMTIwNDAgMTA1NDcgMTExNzEgMTAxNDggOTIxNSA5NDA2IDg5ODAgODI5MSA2OTQ4Cis2IDUgMSAyIDIgMiAzIDIgMCAyIDQgNyAzIDIgNCA1IDQgMTIgMTIgNSAyIDIgOSA0IDEgNCAyIDUgNSA0IDYgOCAxMCA3IDggOCA0IDMgOCA0Cis3IDcgNyA2IDQgMTMgOSA0IDQgNiA0IDUgNSA3IDggNSA2IDggOCAxNCA4IDggNyA5IDggNyA3IDcgMTMgMTAgOSAxMyA5IDEwIDEwIDcgMTEgMTEgNyA2Cis4NTYyIDk5NjcgOTExNCA4NDYxIDgwMzYgODU2MCA3NTg5IDcyMjkgNjk0OCA2MjYwIDcyNDMgNjc2NSA3NTMyIDY4NDQgNzE5MyA3MDg5IDc2NzMgNzU3NSA3MzkzIDc5MjUgODAwOCA4MzU5IDg1NTIgODk4NSA5MDcyIDg1NDQgOTA4OSA5MDUyIDEwMzA2IDExMTczIDEwNzAzIDEyMTE2IDEwNTEzIDExMTE1IDEwMTUwIDkwOTIgOTQ1MiA5MTE3IDgyNjIgNjg5OQorMyAzIDMgMiAxIDEzIDYgMSAxIDMgMSAyIDIgNCA1IDIgMyA1IDUgMTYgNSA1IDMgNiA0IDMgMyAzIDExIDYgNSA5IDUgNiA2IDMgOCA4IDMgMworMTEgMTEgOSAzIDMgMTEgMTAgMyA2IDUgNSA2IDYgNiA1IDYgNyA2IDUgNiA1IDggOCA2IDkgMTEgNyA3IDggMTAgOSAxMyAxMCAxMyA5IDEwIDkgOSA3IDcKKzg2MjkgMTAwNDQgOTExNiA4MTM3IDc5MTIgODcyMiA3NjU1IDY5NzkgNjkyNyA2MTkxIDcxOTAgNjcyNyA3NDk3IDY4MDIgNzE0MSA3MDMyIDc2NjAgNzQ4OSA3MzM2IDc4MTggNzkzNSA4MzQ4IDg1NDMgODgxNCA5MDc1IDg3MDcgOTA0MSA4OTM4IDEwMjUzIDExMTE3IDEwNjY1IDEyMTg3IDEwNTA2IDExMjQ2IDEwMTI2IDkxNjAgOTQ0NiA5MTIyIDgyMzQgNjkxNQorOSA4IDYgMCAwIDkgOCAwIDMgMiAyIDMgMyAzIDIgMyA0IDMgMiAzIDIgNSA1IDIgNiA5IDMgMyA0IDYgNSA5IDYgMTAgNSA3IDUgNiAzIDQKKzkgMTUgMTMgNCA2IDcgNCAzIDQgMyA3IDkgMTAgOCA2IDkgNyA2IDQgMTEgNyA4IDggMTIgNyA5IDcgMTAgMTEgMTEgMTAgNyAxMCAxMCAxMSAxMSA5IDEwIDggOAorODY0MyAxMDM2MiA5MjIwIDc4OTQgNzg2NyA4NjI4IDc1NjYgNjc0NCA2ODU2IDYwMDMgNzE4OSA2ODc2IDc1NjUgNjg4NSA3MTE2IDcxNjMgNzY0NyA3NDA4IDcyNTUgODAyNCA3OTE1IDgzMzggODUzNCA5MDIyIDkwMjcgODczNyA4OTk0IDkwMTYgMTAyNzggMTExMjUgMTA2NTQgMTE4ODUgMTA0OTkgMTExODUgMTAxNTQgOTI4NiA5NDQwIDkxODkgODIzMiA2OTkxCis2IDE0IDEyIDEgMyAzIDEgMCAxIDAgNCA3IDggNSAzIDcgNCAzIDEgOSA0IDUgNSAxMCAzIDYgMyA3IDggNyA2IDIgNiA2IDggOCA1IDcgNSA1Cis1IDggOSA4IDcgMTEgNiAzIDYgNyA5IDkgMTEgMTAgOCA4IDkgMTAgNSAxMSA5IDYgNSA4IDEwIDkgOSA4IDEwIDggMTEgOSAxMCAxMyAxMSAxMCA5IDggNiA2Cis4NTU1IDEwMjMxIDkyMTkgNzkxMSA3ODQ5IDg3ODYgNzUzMCA2NTIzIDY4MzggNjA3MiA3MjM5IDcwMTYgNzY1NyA3MDg2IDcxNDIgNzIyNCA3Njg2IDc1NzcgNzIwMSA4MjE4IDc5NDcgODIwNiA4NDQ4IDg5NzIgOTA1NyA4NzY1IDg5OTkgODk2NiAxMDI3NyAxMDk0OSAxMDY2OSAxMTcyNCAxMDQ5MiAxMTMxMiAxMDE4MSA5MzQzIDk0MzQgOTEyOSA4MTc5IDY5NDAKKzEgNCA1IDUgNCA5IDMgMCAzIDUgNyA3IDEwIDkgNSA1IDYgOCAyIDkgNiAyIDEgNCA3IDYgNiA0IDYgNCA3IDQgNiAxMCA4IDcgNSA0IDIgMworMTEgNiAxMCA4IDYgOSA3IDYgNiA0IDcgOSA4IDcgNiA2IDcgNyA1IDUgNiA5IDYgNSAxMCAxMSA3IDEwIDEwIDkgMTQgMTYgOCAxMSAxMCAxMyA4IDExIDkgNgorODYyMiA5OTg1IDkyNDQgNzkyNyA3ODA2IDg4MTEgNzUyMCA2NTAwIDY4MjAgNTk1MyA3MjM3IDcxNDcgNzY3MCA3MDkwIDcxMTcgNzE1OSA3NjczIDc1NTIgNzE0OSA4MDMyIDc5MDEgODI2NiA4MzkwIDg3NDAgOTA4NiA4OTE0IDg5NTMgOTA0MiAxMDI3NiAxMDg0NSAxMDc2MCAxMjAwMyAxMDQzNCAxMTMwOSAxMDE4MiA5NTgxIDk0MDIgOTI1NyA4MjA0IDY4OTIKKzkgMiA3IDUgMyA2IDQgMyAzIDEgNCA3IDUgNCAzIDMgNCA0IDIgMiAzIDYgMiAxIDcgOSAzIDcgNiA1IDEyIDE0IDQgNyA2IDEyIDQgOCA2IDMKKzEwIDcgNiA5IDYgOCA4IDQgNiA2IDcgMTAgMTUgOSA1IDcgNyA4IDUgNiA3IDExIDYgNSAxMSA5IDkgNyAxMCAxMSAxNCAxNyAxMSAxMCA5IDEyIDEwIDE2IDEzIDgKKzg2NjIgOTgxNSA5MTY2IDgwMDQgNzc2NCA4NzczIDc1MzYgNjM1NSA2ODAzIDU5NjQgNzIzNSA3MzMyIDc4NjEgNzIxNyA3MDY3IDcxNTkgNzY2MCA3NTkwIDcwOTggNzkxOCA3ODgyIDg0NDUgODMzMyA4NTIyIDkxNDAgODkzMiA4OTU5IDg5MjkgMTAyNzUgMTA4NzAgMTA4NDkgMTIzMjcgMTA0NTQgMTEyNDQgMTAxNTcgOTc0MyA5NDIyIDk2ODQgODMzMSA2OTY5Cis3IDMgMiA2IDMgNCA1IDEgMyAzIDQgOCAxOCA3IDIgNCA0IDUgMiAzIDQgOSAyIDEgOCA2IDYgMyA2IDcgMTIgMTUgNyA2IDUgMTAgNyAxOCAxMyA1Cis0IDggOSA2IDcgNiA2IDUgNyA4IDkgOSAxMCA2IDQgNyAxMyA5IDMgNSAxMCA3IDcgOSA5IDYgOSA5IDExIDkgMTEgMTggMTMgMTQgMTEgMTEgOSA4IDEwIDEwCis4NTQ4IDk3MTcgOTE2NyA3ODkyIDc3NDkgODYxNSA3NTAxIDYyODAgNjgxMiA2MDk3IDcyODQgNzQ0NSA3OTIwIDcxNTIgNjk5MiA3MTU5IDc4MDEgNzY4NyA2OTk3IDc3NTAgNzk0MCA4MzY4IDgzMDMgODU2MyA5MTQxIDg3NjQgODk2NSA4OTQ2IDEwMjk5IDEwNzcwIDEwODU5IDEyNjkzIDEwNTI1IDExNDI5IDEwMTg0IDk4MzQgOTQxNiA5NTk0IDgzNzggNzE2NQorMSA0IDUgMyA0IDIgMyAyIDQgNiA3IDcgOCAzIDEgNCAxNCA2IDAgMiA4IDMgMyA2IDUgMiA2IDYgOCA1IDcgMTcgMTAgMTEgOCA4IDUgNCA3IDkKKzMgNiAxMCA0IDQgNCAzIDMgNCA4IDUgNiA3IDUgNiA3IDExIDcgNCA1IDYgNiA3IDcgMTAgOSAxMSAxMSA5IDEwIDEzIDEyIDEwIDEyIDE0IDExIDEwIDggNSA2Cis4NDExIDk1MDIgOTE5MyA3NjY0IDc2NTcgODM0MyA3MzkwIDYwODcgNjc0NCA2MjIyIDcyMjkgNzM2NiA3OTAxIDcwMzAgNjk3MCA3MTU5IDc4ODcgNzY1NSA2OTI0IDc1OTIgNzg5NSA4MjM0IDgyNzQgODQ3OSA5MTY4IDg3OTEgOTAyMiA5MDg1IDEwMjcxIDEwNzM4IDEwOTIwIDEyNjY4IDEwNTE3IDExNDgwIDEwMjg3IDk5MTkgOTQzNiA5NTA5IDgyOTYgNzEwMworMCAyIDcgMSAxIDEgMCAwIDEgNiAyIDMgNCAyIDMgNCAxMCA0IDEgMiAzIDIgMyAzIDcgNiA5IDkgNSA2IDEwIDcgNiA4IDEzIDggNyA0IDIgMworNyAxMCA3IDEwIDYgNCA1IDcgNSA5IDcgNyA1IDYgOCA5IDQgMyA3IDEwIDEwIDEyIDcgOCAxMCAxMSAxMCA5IDggMTAgMTAgMTEgMTEgMTEgMTQgMTEgOSA4IDEwIDYKKzgzNzkgOTU0NiA5MTQyIDc4MTggNzYxOSA4MDg4IDczMzMgNjE1MSA2NzAzIDY0MDEgNzIyNyA3MzU0IDc4MzEgNjk3NiA3MDAwIDcyODIgNzc5MiA3MzgwIDY5MzAgNzc1MCA3OTUzIDg0NzcgODI0NiA4NDYxIDkxOTQgODkzOSA5MDUyIDkwOTIgMTAyMTkgMTA3MDggMTA5MDMgMTI1ODMgMTA1MzUgMTE0NjcgMTAzODggOTk5OSA5NDMwIDk0MjkgODM0NCA3MDQ1CiszIDcgMyA4IDMgMSAyIDQgMiA3IDQgNCAyIDMgNSA3IDEgMCA0IDggOCAxMSAzIDUgNyA5IDcgNiA0IDYgNiA2IDcgNyAxMiA4IDUgNCA3IDMKKzExIDEzIDEwIDEzIDcgNCA0IDUgNSA0IDQgNCA2IDggMTAgOSA2IDUgNSA2IDggMTAgOCA1IDUgNyA4IDggMTAgMTIgMTEgMTAgMTEgMTAgMTIgOCAxMCAxMSA3IDYKKzg0NTEgOTc3MSA5MTY5IDgxNDcgNzYwNyA3ODQ4IDcyNTIgNjA4OSA2NjYzIDYyNjIgNzE0OCA3MTU4IDc3ODggNzA0OCA3MDgwIDczOTggNzc1MCA3MjQ0IDY4ODQgNzY1MyA3OTU4IDg1ODIgODI0NCA4MjYwIDkwOTIgODgzMiA5MDMwIDkwMzggMTAyMTkgMTA4MDIgMTA5MTIgMTI0NDIgMTA1NTMgMTEzOTMgMTA0MzUgOTg5MCA5NDUwIDk1MzkgODMxNCA2OTkwCis5IDExIDcgMTMgNCAxIDEgMiAyIDEgMSAxIDMgNSA5IDcgMyAyIDIgMyA1IDcgNSAyIDEgMyA0IDQgNiA5IDcgNSA3IDUgOSA0IDcgOCAzIDMKKzYgOCAxMSAyMCAxNSA2IDYgNiA0IDMgMiA1IDQgNyA2IDcgOCA5IDcgMTAgMTAgOSAxMyA5IDQgNyA2IDggMTEgOCA5IDExIDEyIDcgMTEgMTAgOCA4IDggNworODM5MyA5Njc2IDkyMjEgODg4NiA3ODAwIDc3NDUgNzIyNCA2MDkyIDY1OTggNjA3MCA3MDIwIDcwMzUgNzY5NSA3MDU1IDcwNTYgNzM4NCA3NzYxIDczNjIgNjg5MSA3ODA4IDgwMTQgODYyMCA4MzcwIDgzMTcgODk2NyA4NzMyIDg5NTcgODk4NyAxMDI0NSAxMDY0NSAxMDg2OSAxMjM3MSAxMDU5NiAxMTEzOSAxMDQ1NSA5OTEwIDk0MTggOTQ1OCA4MzEwIDcwMDAKKzIgNCA4IDMwIDE5IDMgMyAzIDEgMCAwIDIgMSA0IDMgNCA1IDcgNCA4IDggNiAxMyA2IDEgMyAyIDQgOCA0IDUgNiA5IDMgNyA2IDQgNCA1IDQKKzEyIDggOCA4IDYgNiAzIDUgNSAzIDcgNSA2IDggNyA5IDcgOSA1IDggNyA2IDggNyA2IDExIDkgOSA3IDkgOSAxMyAxMCAxMiAxMSAxMCA5IDExIDkgOAorODQ5MCA5NTg2IDkxOTUgODg0NCA3NzU4IDc2NDggNzEyMCA2MDMzIDY1NjEgNTg5MCA3MDIzIDY5MjAgNzY1NiA3MTIzIDcwNTggNzQ5MyA3NzQ2IDc0NzMgNjg0NiA3ODMxIDc5OTIgODQ3MSA4MzY1IDgyNDggODg5NiA4ODgzIDg5NjMgOTAwMCAxMDE2OCAxMDU1OSAxMDgyNyAxMjQyNyAxMDU4NyAxMTIwNyAxMDQ3NSA5OTI5IDk0MTIgOTU2NiA4MzMyIDcwNzEKKzExIDQgNCA0IDMgMyAwIDIgMiAwIDQgMiAzIDUgNCA3IDQgNyAyIDUgNCAyIDUgMyAyIDkgNiA2IDMgNSA1IDkgNiA4IDcgNiA1IDggNiA1CisxNCAxMCA4IDcgNyA2IDMgMyA2IDYgNyA1IDcgMTMgMTAgMTMgOCA2IDYgOCA3IDggMTAgNiA4IDggOCA5IDggOSA5IDEwIDkgMTMgMTMgMTAgOCAxMCA5IDUKKzg2MzUgOTYyNSA5MTY5IDg3NDMgNzc0MyA3NTU3IDcwMTggNTg1NSA2NTUwIDU5MDUgNzAyNiA2ODEyIDc2NDMgNzQ5NCA3MTM3IDc4NDIgNzc1NyA3MzkzIDY4MjggNzg1MiA3OTcxIDg0NTQgODQxMSA4MTIxIDg4NzggODg0MSA4OTQzIDkwMTIgMTAxMTggMTA0NzggMTA3ODYgMTIyOTUgMTA1NTIgMTEzMzMgMTA1NDUgOTk0NyA5MzgxIDk2MDYgODM1NCA2OTUzCisxNSA3IDQgMyA0IDMgMCAwIDMgMyA0IDIgNCAxNCA5IDE0IDUgMyAzIDUgNCA1IDcgMiA0IDQgNCA2IDQgNSA1IDUgNSAxMCAxMCA2IDQgNyA2IDIKKzkgOCAxNCA5IDUgNCAxMCA3IDkgNyA2IDggMTEgMTIgMTIgMTEgNyA2IDQgMTAgMTAgOSA5IDEwIDEwIDYgNiA5IDEwIDggMTAgMTEgMTAgMTEgMTIgMTAgNyAxMSAxNCA5Cis4NjQ5IDk1MzkgOTI5NyA4NzcxIDc2NzcgNzM0OSA3MDk4IDU5MzMgNjYxNiA1OTgwIDcwMDMgNjg5NCA3NzMzIDc3ODEgNzI2NSA4MDQ3IDc3NDIgNzMxOCA2NzU5IDc5OTUgODAyNyA4NDk5IDg0MzEgODI0OCA4OTEyIDg2NzkgODg3MyA5MDI0IDEwMTIxIDEwMzQwIDEwNzcyIDEyMjMzIDEwNTQ0IDExMzI4IDEwNTg4IDk5NjQgOTMyNSA5NzA1IDg1MDMgNzA4OAorNiA0IDE0IDYgMiAxIDkgNSA3IDUgMyA1IDEwIDEyIDEyIDkgNCAzIDEgOCA4IDYgNiA4IDcgMiAyIDYgNiA0IDYgNiA2IDcgOSA2IDMgOCAxNSA3Cis3IDExIDUgNCAxMCAxMiAxMyA1IDQgNSA5IDggOSAxMiA4IDYgOCAxMCAxMSAxMiA4IDggNyA4IDggNyA5IDggOSAxMCAxMCAxMCA4IDEzIDExIDggNyA2IDggNQorODYxMiA5NjQyIDkxOTIgODQ5MCA3NzQwIDc2NDUgNzI1MyA1ODg0IDY1NTMgNTkyOCA3MDU4IDY5NzEgNzc3MCA4MDUxIDcyODggNzkzMiA3NzUzIDc0OTMgNjg3MSA4MjUyIDgwMzEgODQ4MCA4Mzk5IDgyNDQgODg5NCA4NTg4IDg4ODEgODk3NCAxMDA5OCAxMDMzNCAxMDc1OCAxMjExMyAxMDQ4NSAxMTQ0NyAxMDYwNCA5ODU3IDkyNzEgOTQ5MSA4NDk1IDY5NjkKKzMgOCAxIDEgOCAxMiAxNSAyIDEgMiA3IDUgNiAxMSA1IDIgNSA4IDExIDExIDUgNSAzIDUgNCAzIDYgNCA1IDYgNiA1IDQgMTAgNyA0IDMgMiA1IDIKKzM5IDEyOSAyOTQgNDM2IDU0MCA1NDggNDQxIDI1NCAxMjAgMTA5IDE1MCAxOTUgMTQ5IDgyIDQ2IDk4IDc1IDEzMSAyMDggMTc1IDkwIDQyIDE5IDI0IDE5IDIwIDI5IDIzIDczIDE0MCA2NSA0OCA1MiAzNiAyNCAxNyAxNCAxNSAxMyAxMAorOTM5MyAxNjk4OCAxNjQ3NyAzNDc2NyAyMTM1MCA0MDg1NCAxODM0NSAyMTEzNiA5NDU2IDEyMjY5IDEwNzE2IDE4NTMzIDExMzg0IDEyNjA1IDgyODEgMTM0NzYgOTQ3NiAxNTA5MSAxMjAxNiAxODUwOCAxMDEzMSAxMDU1MSA4Njc1IDkyMjMgOTE1NyA5MzAxIDk0MDAgOTg0OCAxMTcxMSAxODMxNSAxMjE1MSAxNDMzNSAxMTU1MiAxMjk3MSAxMDk1MiAxMDMxMCA5Mzk3IDk4NDMgODYxNSA3MTY1CisxMDMgMzQyIDg3OCA3OTAgMTQxNyA4OTIgMTI2NiA2MzcgNDUwIDM0NyA1NDIgNTIwIDUyMCAyNDAgMTQ0IDI4NyAyNTcgMzc2IDcyOSA0NjEgMzA5IDEwNyAyNyA0MiAyNiAyOSA2MCAzNiAyMTggMzU4IDE4MiAxMDIgMTM4IDY3IDM1IDE5IDE0IDE1IDEzIDkKKzY2IDQxNyAxMTgxIDE0NTAgMTY5NCAxNzMxIDExMjggNzY0IDQyNCAzODAgNDE0IDMzOCAyMDcgMTY0IDcyIDIyMSAxNDMgMjkxIDQxNiAyNDYgMTcyIDEyOCA0NCAxNDYgODcgNzkgMTg0IDQyOCAzNTkgNTc5IDI2MiA1MTUgNDI4IDE5NSAxMzQgMTAwIDEyNiA2NyA2MCA0OQorMTA4NDUgNDE1ODggNDYyNTQgMTIxNzY1IDY0MTE5IDE0NDc1MSA0NjcyMSA2NjgwNiAyMDA1OCAzNDg3OSAyMTAzMSAzODE4NiAxNjM5MSAyMTkyNCA5OTE0IDI2MjQ1IDEyODk0IDMyMDYzIDIyMzUwIDMyNTExIDE0Mjc0IDE3NzgxIDk1ODMgMTc2MzkgMTExNTIgMTM1OTYgMTM4NjggMzU1NTIgMjA1OTUgNTI3ODggMTg1NDUgNDUxMTUgMjIyMDQgMjQxNzMgMTQxMDMgMTU4MzUgMTIzODMgMTMzNjggOTkzMyA5NzQ1CisyMDEgNjUzIDE4MDAgOTQ1IDE5ODIgOTkwIDE3MDEgODMzIDExNDcgNjc5IDEwODMgNTU2IDYwMSAzNzggMjM4IDQ2MSA0NjEgNTM3IDEwNDMgNDQwIDUzMiAzMjkgMTIzIDM4NiAyODAgMjE3IDU4NCA3NjIgOTQ0IDc1MyA3MjEgNzY2IDEwODAgNDI3IDQwNCAyNjMgNDA4IDE3NyAxODcgMTQzCisxOTggMTk1IDQwOSA0NDYgMTA1MCAxMDIzIDQwOCAyNjQgMjI0IDI2MyAzNzAgMzQ4IDIwOSAxMTEgNjggMTkyIDIzMSA3MzYgNzAyIDIyOSAyMjkgMjM5IDE5MSAyNjUgMTYxIDEyOCAxODEgNjI5IDU5MSA1NDkgMzU0IDMzMSAyNjYgMjE2IDIzMSAxMDEgMTk5IDExMSA4MSA4OAorMTU2MzUgNTEwNzMgNTU1NTQgMTQxODYwIDg5MzU4IDE5ODkxNiA1NTk4NCA3OTAxNyAyNTI4MyA0ODk0NCAyOTk2NCA1NzI3NSAyMTMyNCAyNzQyOCAxMTQwNCAzNjQ2NiAxODQ3NyA3NTM1NyAzOTczNiA0NDYyOSAxOTc3MSAzMTM5NyAxNDIyNiAzMjg2MSAxNDk4OSAyMDY0NCAxODE0OCA3MjA2MyAzNTE4OCA4MzM1MCAyNzEzMSA2Mjc0NCAyODQ0OSAzNTk5MyAxOTY1NSAyMTA5MCAxNzE2MCAxOTM4NSAxMTc1NSAxNDU2NgorNTg5IDIxOSA0ODggMjEyIDkwNiAzOTkgNDg0IDIwNyA0ODIgMzMyIDczNiAzOTQgNTEwIDE5MSAyMDIgMzAwIDYzMCA3MjQgMTE4NyAzMDggNTk2IDQzNiA1OTkgNDc1IDQ3OSAyOTUgNDg1IDYzMyAxMDg1IDQ3NiA3NTcgMzQyIDUzMiAzNDkgNjA0IDIxNSA1NTkgMjYwIDI0OCAyMzcKKzIwMiAyMTMgMjI4IDM3MCA1NzMgNDE4IDQxMyAzMjcgMzc2IDUyMSAyMzAgMTA0IDgyIDU5IDM4IDczIDE0NCAyOTIgMjU4IDE3NiAxMzcgMTQ5IDIwNyAxODQgNzYgODIgOTggMjU5IDI2MSAyNDEgMjIxIDE3NyAxMTYgOTIgODcgNTggMTIzIDYwIDc0IDkwCisyMDQwOCA2MTA5NCA1OTk5NSAxNTYwODAgMTAxNzc0IDIxMjY2MiA2NTE0MyA5NDM2NiAzNDI2MyA3ODAxNiAzNTA5NSA2MDIyOCAyMjg4NyAyOTQwNyAxMjA5MCAzODc2MyAyMTY5NiA4ODc3NSA0NTMzOSA1Mjc2NCAyMjc3OSAzODY2NyAxOTE2MiA0MjE5MyAxNjU1NyAyNDQ0MyAyMDIwMCA4MzY1MSA0MDk4MSA5MzE1NSAzMjEwMyA2OTg1MyAzMDcwNCAzOTQ4NSAyMTM4OCAyMzM4OCAxOTg3NSAyMTkwOCAxMzM1MyAxOTIyMQorNTA2IDIwMiAyMjUgMTQ3IDQwNSAxMTMgNDI5IDIyMyA2ODAgNDc4IDM4NCA2NyAxNTAgNjUgODAgNjggMzI2IDIwNyAzNTAgMTg0IDI5NSAyMDYgNTQ0IDI0OSAxNzkgMTQxIDIxNCAxODkgMzkwIDE1MCAzOTIgMTM3IDE4MiAxMDAgMTc0IDg1IDI4OSA5NyAyMDIgMjAwCisyMDcgMTA0IDEwOCAyMzcgMzIyIDQ0NCAyNjUgMTkzIDE4NyAzMjIgMzMxIDIwMCAxMTYgODYgNTYgMTkxIDE3MiAxOTIgMjExIDE4NSAxMjggNzEgMTE2IDE3OSA0OCA1MiA1NCAxNDYgMTM0IDg5IDIxNyA5MSA2MyA1NyA2NSA0OSA2OSAzNSA1MSA0OAorMjUxODkgNjM4MTggNjEyNTggMTYxMjc2IDEwNzQ2NCAyMjcxODEgNzAyOTAgMTAwNTYxIDM4MTg3IDkzMTE4IDQyNjgwIDY4OTAxIDI1MjgwIDMyOTI2IDEzMjE5IDQ4MTcxIDI1NTUxIDk1MjQ0IDQ5NjAwIDYwOTY0IDI1NDgyIDQwNzA5IDIxNjQ4IDUwNjU4IDE3MzcwIDI2MTcxIDIxMDc2IDg3NjAyIDQzMzgzIDkzMDMzIDM2ODQ4IDcxMjUyIDMxNTQ3IDQwNjE3IDIyNTE1IDI0OTk1IDIxMTQyIDIyNzQzIDE0MzIzIDIxMDE2Cis0NDIgNjIgNzAgNjcgMTg2IDExMiAyMzUgOTUgMjc5IDIyMiA0OTQgMTY1IDIxOSAxMTAgMTM4IDIyNyAzNTIgMTAzIDI1MCAxNjcgMjQ2IDYwIDI1MSAxOTcgODUgNTkgODUgNzMgMTU4IDI0IDM0NCA0MCA2NyAzOCAxMDggNTYgMTI2IDMzIDExMiA2OQorMjE4IDIwNiAxMDQgMjU2IDgwMiA3MjYgMzIwIDIxMyAyMjMgMjQwIDM0OCAxOTAgNjkgNTggNjQgMTc2IDIwMyAxNTcgMTUxIDU5IDU4IDk3IDc0IDkxIDI0IDQ4IDUwIDY5IDcyIDgxIDEyMyA3NiA3NSAzMSAzNyAyOCAxMjEgNDggMjggMjkKKzMwMTMyIDcyNjQ1IDYyMzg3IDE2NzMyNyAxMjUyODIgMjU4MTU0IDc2NzE1IDEwNzYxMyA0MjkzNCAxMDIyNzYgNTA1MTAgNzY0NDAgMjY0MTIgMzQ1MTMgMTQ1MjUgNTYwOTMgMzAxMDIgOTkxNzUgNTIyMjEgNjA5MzEgMjYzMjggNDQyMjUgMjI5OTkgNTMyMDkgMTc1NDkgMjc1NDkgMjE4MjcgODY1ODUgNDQxNDAgOTI0MjcgMzkwNzIgNzE2NDYgMzI2NzYgNDAwODQgMjI4OTggMjUyMTUgMjM3MDcgMjQzMjcgMTQ2ODEgMjE1MzYKKzQwNSAxNjMgNjQgNzMgNDgxIDE5NSAyNzMgMTAxIDMxMCAxMzEgNDQ2IDEzNyA5OSA1MSAxNTUgMTcyIDM3MyA2NyAxNTEgMjEgNzMgOTQgMTI5IDYzIDIxIDQ3IDcxIDE2IDU0IDIwIDE1NyAyOCA4OSAxMSAzNiAxOCAyNDUgNTYgMzUgMjQKKzIyOTcgMTMwOSAxODgyIDI5MTkgMjI1OSAyNDY1IDE5NjUgMTE1OCA1MTUgNjg0IDM5NSAzMTQgMTkwIDE3NiA5MyAxODAgMTgwIDkxIDcyIDgyIDY5IDgyIDE0NiAxOTggNjEgMTE2IDgxIDE4IDI0IDY1IDE3OCAxMDggMTEyIDIwIDE4IDI0IDkzIDI4IDE0IDE2Cis4ODA5NiAxNDg3MDggMTA4OTM4IDMzNjYyMyAxNzk5MDAgMzk0MTA4IDEyNTAzMCAxNzIzMDEgNTUwMjYgMTM4MTYyIDU5MzQ2IDkxMTQ1IDMwNjA5IDQzMjU1IDE2NTM5IDYzNzg2IDMzOTUxIDk4ODE1IDUyNzU3IDYyMzEzIDI3NDM0IDQ2NjA5IDI2MTU2IDYyMTgxIDE4NjcwIDMzMDIyIDIzMzUyIDgyNDk1IDQzNjUxIDkwODc1IDQyNjQ2IDczOTgyIDM0NzIzIDM4OTA3IDIyNzg2IDI1MTc2IDI1NDkyIDI0NTg3IDE0NjcyIDIxMjI2CisyMDg3IDcxNSAxMzgxIDc2NSAxMDY3IDUzMyAxMjc0IDU0MCA2MzcgMzY4IDQ0MSAyMjEgMzQwIDIyOSAyMzMgMTU0IDI5NCAyMiA0MCAzOSA5NCA2NCAyODMgMTgwIDExOCAxNzEgMTQ1IDEgNiAxMyAyMzYgNTMgMTU1IDUgOCAxMyAxNjEgMTkgOCA3CiszNDkzIDU3MTkgNDU1NSA5NTM4IDkwOTggODUxOSA2NDcwIDIzMTMgMTU1NSAxNzg3IDEwMTMgODAzIDU5OCA0NzkgNzE5IDE2MDEgODIyIDQxNCAyMTEgMTQ2IDE0NCAxODUgMjMzIDI4MSAxMTQgMTY5IDEwNSAxNCAxNCA4OCAyNjIgMTQ0IDExMCAxOCAxNSAyMiAzOSAxOCAyMyAxOAorMTc1MTg2IDQ5MTE0NiAyMjI2NTUgOTAyNDE3IDQwNzk3NiA4OTM4NDggMjg3Mjk4IDMwNDA2OCA5MzQwMiAyMzk2NjEgODM3NTkgMTM1MDEwIDQ1MTMxIDcwMDg4IDM0NTA1IDE1ODMyMCA1NDExNSAxMTgzMjEgNTY4MzMgNjc1NDQgMzA0MzAgNTUxNzggMzE0NTkgNzU3MTQgMjExMTggNDE0MjMgMjU0NTMgNzg0MDUgNDI5MTkgOTA4MjkgNDgyNzggNzgzOTAgMzY2NjggMzc2NzggMjI2MDAgMjUwMTcgMjU4NTIgMjQyMTcgMTQ4OTMgMjEwNTgKKzE3MzAgMTA1MiAxNzgyIDk5MCAyMDYzIDg4NiAyMDU3IDY1OCAxMzE2IDYxMiA5MjggNDUzIDg5OSA0NzggMTM1MiA4MzkgMTA3MiAyMzEgMjE1IDEwNiAyNDQgMTg3IDQyMyAyMzUgMjUxIDIyNyAxOTEgMCAyIDI1IDMzNSA4NSAxNDMgNCA2IDExIDM0IDggMjMgOQorNDA3MyA3ODI4IDY0MjIgMTM2MTIgOTk3NiAxMjM0MSA3MjA1IDQwNzggMjM2OCAxOTE1IDE3NjMgMTU4NSA3MzAgMTA0MSAxMDIxIDM1NzIgMTg5OCA3ODYgNDg3IDM5NiA0NjEgNTA4IDM2NiA0MjIgMjYxIDE3NSAzMiAxOSAyMCA3MSAxOTggMTM2IDEyNCAzMCAyNCAyMiAyNSAyNiAzMyAyOAorMjc0OTI4IDk0MjYxMSAzODEyNTkgMTY4NDU2MSA2NTI4MDMgMTU5ODQxOSA0NjQzMDMgNTM2MzY2IDE1MTYwMiAzNDI5MzQgMTI2NzM0IDIyNDI4OCA2MjY2NSAxMjk4MzkgNTk3NDIgMzY4Mjc1IDEwMTI4MSAxNTk1MTEgNjc4NjMgODc4MjAgNDE0NTQgODMwNzcgNDAwMjkgOTcwOTcgMjcyNjIgNDk2ODkgMjU2MzUgNzQ4NjggNDIzNTggODk3NDEgNTIxMzQgODIwNDIgMzg5MjIgMzcyNjAgMjI2NDkgMjQ4NjcgMjU4NDUgMjQzNjEgMTUzNjQgMjE1MTQKKzEzMjEgNzY1IDE1NDYgNzc2IDE0NzAgNzQzIDE0MTcgNjgxIDEzMjIgNDcwIDExMjQgNTc0IDgzMiA2MjYgMTIzNiA4NjMgMTQ5NyAzNzYgNTAxIDMwNyA3MzEgNDM3IDU4NCAyOTcgNTM5IDE5NiAyMyAxIDQgMTYgMjE4IDcxIDE2MCAxMiAxNSAxMSAxNCAxNiA0NyAyMgorNDA1MyA4NDEyIDcxMjUgMTU2NDMgMTI0OTYgMTkxNzggMTE2OTUgNDQ0NSAyNDQ2IDI0NTggMjM5MCAyMTkyIDk5NyAxNTAyIDIxMzggNDA3MSAzMDg0IDExMjYgODc4IDgxNSAxMDc4IDEwMDcgNTAxIDM4MCA0MTUgMzQwIDYwIDE5IDIxIDM5IDExMSAxMjMgMTA1IDI4IDI0IDI4IDI5IDI5IDM1IDM0CiszNzE2NjkgMTQwMjg2OCA1NTM4NzQgMjU0NDU1OCA5NTU5MzUgMjY4MDc2NiA3NTE2NjUgNzc3Mjc1IDIxMDM0MyA0NzMzNzIgMTg0NjY0IDM0NTUwMiA4NjU4NiAyMTQzMjggMTEyOTAzIDU5NjI5MSAxNzc1ODcgMjE5MTE5IDg4NjEyIDEzMjYyMiA2Nzk3NSAxMzk5NjAgNTE4MzYgMTE0NjE3IDM3MTg5IDY3NTk2IDI2NTI4IDcxNTQzIDQxODM3IDg2NzUyIDUzNjY5IDg0Njc2IDQwNjM0IDM2NzQ0IDIyNjk3IDI1MDk1IDI1OTQxIDI0NjgxIDE1ODc1IDIyMzEyCis5NzkgNTY0IDEyMDUgNjA0IDEyNDQgNzEzIDE0OTcgNTA4IDk4NCA0MzIgMTEwMiA1NDIgODg0IDU2NyAxNTI0IDYxNiAxNDk5IDM5OSA3NTMgNDY3IDExODUgNTY2IDY1NCAyMTQgNzEyIDMzMSA3NyAxIDUgNSA5MCA1NSAxMTkgMTAgMTUgMTggMTggMjAgNTEgMzIKKzQ2MzUgOTE3OCA3Nzk4IDE1ODk1IDEzNjczIDIzOTA5IDE2MzMzIDYwNzggMzgxNyAzMDg1IDI0MzUgMzEzMCAxNTM0IDI0NDMgMzQ0MSA0MzE0IDMzODIgMTUxMSAxMTY1IDEwMDkgMTQ1MyAxNTk4IDk5MiA3MTQgNTc1IDQ0MCAxMzIgMzIgMTcgNzQgMTI4IDEyMiA4OCA1NiA0OSA1MiA1NSA1OSA0OSA1MAorNDgwODczIDE4ODI1NzIgNzM5MzgzIDMzNjg0MzkgMTI4MTU4NyAzOTg4ODM1IDExNTA0MTMgMTEwNDA1NyAzMDI2NjQgNjM0NTA1IDI0MjI5OCA1MTcwNzIgMTIzNjM3IDM1MTU2MCAxOTgwNDUgODI1NTU2IDI1OTYwNiAyOTg4MDQgMTE2MTgwIDE4NjY1NSAxMDM0MjAgMjI5NzM5IDc1ODk5IDE1MTYwNiA1MDk1OSA5MDU3MiAyOTI0MCA2OTIxNiA0MTIyNyA4NjA5MyA1NTYwMSA4NzA5MSA0MTg2OSAzNzk3OSAyMzM4MiAyNjc4NCAyNjY5OSAyNjgyNSAxNjczMSAyNDA0NQorODU4IDQ0MiA5OTYgNDQ0IDEwNTQgNTgzIDE0MDcgNTAyIDExMzIgNDIzIDg0OSA1MjMgOTkwIDYwMSAxNTAyIDQ1OCAxMTM4IDQxNCA3NzkgNDIzIDExMDggNTY0IDk5MiAzNTQgNzcyIDMzNyAyMjYgNSAzIDE5IDEwOCA1MiA4NiA0MSA2MiA1NyA2NSA3NCA5MSA2MgorNTA3MCA5Nzc1IDc2NDcgMTQxNDEgMTI4NzYgMjU4ODkgMTczNzkgNzc3MSA0ODY3IDMzNDYgMjY2NSAzODExIDE4NDMgMzAxNyA0NzUyIDQ5MjcgMjkxMSAxNTY2IDEyMTIgOTk5IDE0NDMgMTUyNCA5MzkgNzIzIDYwMCA0MTYgMTQyIDI0IDE3IDYyIDU5IDUzIDQ1IDQ1IDUxIDUzIDU4IDUzIDQyIDU1Cis1OTg0NzAgMjM3MDE3MyA5MTY0MDEgNDAzNTEyOCAxNTc4NzM3IDUzNDAwNzAgMTU2NTk0NSAxNTE1MjQ3IDQxOTUyMSA4MDIwMDYgMzA0MzczIDcyMDE4NyAxNjc2NjIgNTE1ODI0IDMxNDU3NCAxMDc4NzI3IDMyNzUzNyAzNzcwODcgMTQ0MjYxIDIzNjgzMiAxMzc3MjQgMzA5NTg1IDk4MDA3IDE4NjkyOSA2NTAyNCAxMTA2OTUgMzIxMzkgNjY1MzcgNDA2MzIgODQ3MzYgNTU3MjEgODUxMjEgNDE5NzQgMzg0NjUgMjQxMDEgMjg0MzMgMjc1MTUgMjg0NzEgMTczODYgMjU5ODEKKzc4MSAzODIgNzY4IDMxNSA3ODcgNDc5IDEwOTQgNDcyIDEwNDIgMzU0IDc2NyA0NjggOTIyIDUwMyAxMzc0IDQwMyA3ODQgMzMzIDY3NiAzMTggODUxIDQwNCA3MzIgMjg0IDY1MyAyNTAgMjI5IDMgMyAxNCAyNCAxMCAyMyAyNiA2NCA1NSA2OSA1NSA2NiA2NworNTA4MyAxMDAzMCA3NTcyIDEzMjkzIDEyNTAyIDI0MzgxIDE0Njc5IDkyODggNDU4NSAzMjk3IDI4NDIgNDE5MSAxNjczIDMxNzIgNDQxMyA0OTA3IDMyNDggMTUzMyAxMzk4IDEyNjMgMTMzMiAxOTc4IDEyODcgODk1IDcyMSA0NDkgMTU3IDI1IDIyIDQ2IDc2IDg2IDcxIDM5IDQ5IDM3IDQzIDU1IDYwIDY2Cis3MTM0NjQgMjg0NDE4NiAxMDg3MDgzIDQ2MDk3MTggMTg1ODkwOCA2NTE3NTg2IDE5MDIwODUgMTk5NDk2NyA1MjYyNTIgOTU2NDQ3IDM2OTQyMyA5MzQ0NjIgMjA2MjQyIDY3OTc1NSA0MTk1MjggMTMxNTQ3OSA0MDIzODcgNDQ4NjQ2IDE3NjM5NiAzMDAyMTggMTY4MzM1IDQxMjUzNCAxMjg0NTkgMjMwNzAwIDgxODMxIDEzMTYzOSAzNTM1MCA2NDA4MCA0MDE4MCA4MjQ3OCA1NjI3MiA4NTI5NyA0Mjc0MSAzODU1MyAyNDc1MSAyOTAwMCAyNzkyNyAzMDE0MSAxODQ4NSAyODQ3NworNjUyIDMyMCA2NTEgMjU3IDYzNCAzNTIgNzM4IDQyMyA3ODYgMjgwIDY3MiAzODQgNjY3IDQwNSA5MzkgMzI2IDcwNiAyNjEgNjQ4IDMzNCA2NDYgMzkzIDc5NSAyODYgNjU2IDIzMCAyNDAgMyA1IDggNDAgMjYgNTUgMTkgNTcgMjYgMzcgNTQgMTE2IDg0Cis1MTA3IDEwNTA0IDc2NTYgMTM5MTYgMTIwOTkgMjA2MjggMTE2MzAgODY4NSA0NDU4IDMxMjEgMzA4MSAzOTgxIDE1MDQgMzI2OSAzOTg5IDQ5NTMgMzM1MiAxNTA2IDE1NDEgMTU0OCAxNjQ2IDI3MDYgMTU1MSAxMzAxIDk4NSA1NDEgMTkyIDE4IDIwIDEwNiAxMjQgMTM3IDY0IDI1IDIzIDMxIDI5IDI0IDI3IDI2Cis4MjYyMDEgMzMxODg4MSAxMjU1NjUyIDUxODgxMTAgMjEyMTc4NCA3MzkzODc5IDIxNTE4OTQgMjQwODg1OCA2MjcwNzIgMTA5MDgwOCA0Mzg5NTkgMTEyMjk3OSAyMzk1MzkgODM5ODEwIDUxMTAyMyAxNTQwODUzIDQ3ODAyNyA1MTQyNTMgMjExMzg0IDM3NzMxMCAyMDYyMDggNTU0MDMyIDE2NDg5OSAyOTY3ODggMTA0OTY3IDE1Njk3OCAzOTM3NSA2MTM0MSAzOTY4OCA4NDA0MSA1ODAzNyA4ODU5NiA0MzMxMCAzNzc3NSAyNDcyMSAyOTE2NCAyNzk3MSAyOTgwNyAxODcxMyAyODM2NQorNTU0IDI3NyA1NzMgMjM4IDU0MSAyNDggNTEyIDMyNiA2NDcgMjMwIDYwNCAzMDIgNTA1IDMyNCA2OTEgMjcyIDYwNiAyMTkgNTkzIDMyOCA2NTUgNDE3IDc3OCAzNTAgNzE5IDI0MyAyODAgMSA0IDQxIDk3IDYzIDQ0IDggMTIgMTggMTYgMTAgMjUgMTMKKzQ3ODggMTA5NzQgODM0OSAxNDk1MiAxMTQ2NyAxNjU5OSA5NjA1IDc5MDggNDAwNSAzMDcxIDMyODQgMzkzNSAxODE1IDMxODIgNTAyMCA1NDA5IDMyNDUgMTY0MiAxNjYwIDE4MTUgMjMxNyAyNTcwIDIwMDQgMTg3MSAxMzQ5IDYxOCAyMDUgMjMgMjggNzIgNzUgMTE3IDk4IDM3IDQ1IDU0IDU4IDYxIDY0IDU4Cis5Mjc5NjkgMzc5Mzk3MSAxNDM3NzI3IDU3OTU0NDkgMjM2MTk0MiA3OTcwMDY1IDIzNDM3MDMgMjc1MDE4MCA3MTM3OTUgMTIxNDAzNiA1MTE5NDggMTI5NzM1OSAyNzk5NTUgOTg0OTE3IDYyNjU4OSAxNzgwNzIxIDU0OTA0NCA1ODQyNzkgMjQ4NTQwIDQ2NjE4MSAyNjAyODggNjc4Njg1IDIxMjAwOSAzOTM5MzEgMTM2ODMwIDE4NTUyOCA0MzYzMiA1OTA3MyAzOTQxMyA4MzQyMiA1ODUwNSA5MDQ2OCA0NDczMyAzNzc4MSAyNTI1NCAzMDczMSAyODc1NSAzMTc2NiAxOTg4MSAzMDIyNgorNDUxIDI0NiA1NDUgMjI4IDQ1OSAxNzEgMzc5IDI0OCA1MDAgMTk5IDU1NyAyNTMgNTQ0IDI2MCA3MzggMjUxIDUxOCAyMTUgNTQ1IDMwNyA3NTcgMzE2IDc4OCAzOTAgNzk1IDIzNiAyNzUgMyA5IDE5IDM2IDQ0IDk1IDE4IDQ3IDUxIDY1IDYyIDExOSA2MAorNDc2OCAxMTMxNSA4OTkzIDE0OTE1IDExODQ4IDEzOTEyIDkyNDggNzc1NSA0MzY0IDMzMzEgMzU1NiA0NDExIDI2NDAgMzIxMSA2ODQ5IDkxNjQgMjk3MSAyMjM2IDE4OTkgMTc2NyAyMjkwIDI1OTYgMTkwNiAyNTc5IDEzMTcgNTA0IDIzMCAyOSAzMiA5MCAxMDMgMTc2IDg3IDM4IDUwIDU4IDUzIDU0IDU3IDQwCisxMDI2Njg1IDQyNjE1MDcgMTYzMTcyMCA2MzY0MDc2IDI2MDU4NDQgODM0NjU5OSAyNTIxNTk4IDMwNjE2MjMgODA3NTMxIDEzNDU4NDUgNTkwMDY4IDE0OTA1MjEgMzQwNDUxIDExMjMxMDAgNzg2MDI0IDIyMzY4OTUgNjExMjg0IDY4NjU5NyAyOTA4NzggNTQ2NzcxIDMxMjMyOCA3OTc0NTcgMjU1NDM4IDUyODc0MyAxNjcwODAgMjA1MzYxIDQ4NDIyIDU3MzEwIDM5MjQ3IDgzOTQ2IDU5Njc3IDk1ODUzIDQ1ODQwIDM3ODQ4IDI1OTAxIDMyNDUwIDI5MzkxIDMzMTc3IDIwODQxIDMwODcwCis0MDYgMjI4IDUxMSAxOTggNDMwIDEyNiAzMzMgMjEwIDQ3NyAxOTUgNTM1IDI0NiA2NzcgMjMxIDgwOCAzNzQgNDIxIDI2MyA1NTIgMjUzIDYzMyAyNjIgNjIxIDQxMiA2NDMgMTU3IDI4NSA1IDEyIDMwIDY3IDg4IDc0IDE5IDU2IDU1IDUyIDQ2IDk0IDI4Cis0Nzg0IDExMjU4IDk0NTggMTQwNTUgMTE1MDUgMTIwODMgODg0MiA3NDQ2IDQ2MTUgMzYyMSAzMzI1IDQwNzMgMjc5NCAyODA4IDc0OTggMTExNzkgMzAxOSAyNTcxIDE5MDIgMjExMyAzNTM2IDM2NzEgMjc4NyAzNDA4IDExMTAgNDAyIDIwOSAzMyAyMyAxMzAgMTI4IDEzNSA4OCA1MiA0NSA1MSA1MSA0OSA1NSA2MAorMTEyMzM0NiA0Njk3NDkwIDE4MzI3NTYgNjg0NTc1MSAyODM0ODg5IDg1ODgxNzIgMjY4NDY3NCAzMzM1Mzk2IDkwNTM0MyAxNDg3NTYyIDY2MDMzMyAxNjUxMzI4IDQwMzM3MyAxMjI4MjMzIDk1ODA2OSAyNzg5NDk2IDY3MzE5NyA4MDMzNTggMzMyMjM2IDY0Mzc4MyAzOTQ5MjAgOTc1MTQ4IDMyMDMwNCA3MDYzOTggMTkxMjgzIDIxNzczNyA1MjU1NSA1NTg5OCAzODg1NSA4Njg5NiA2MTQ1OSA5ODM5NiA0Njk0NSAzODc3MSAyNjQwNCAzMzYzNiAyOTk2MCAzNDE5NiAyMTcyNiAzMjcwNAorMzc1IDIwMiA0NzEgMTY1IDM3NiA5OCAyOTQgMTc3IDQ0NCAxOTAgNDQxIDE5MiA1OTcgMTc0IDcxOSAzNzIgMzg3IDI1NiA0ODMgMjY1IDc5MSAzMTMgNzY1IDQyMSA0NTkgMTAyIDIzMiA3IDYgNTkgOTUgNTAgNzMgMzQgNDQgNDAgNDcgMzYgODUgNTgKKzQ4MDYgMTA0NzEgODkzNSAxMTkyMyAxMDM5MSAxMjQ3OCA5NzQxIDcyMTkgNDE1NiAzMDUxIDMwMTggMjkxMyAyMzk3IDI0ODUgNDM4OSAxMDM1NCA0MTcxIDI5OTIgMjI5MyAzMDU5IDM4MzkgNDExMSAzNDI3IDM3MzEgOTA4IDM5MyAyMTMgNDcgMjkgMTI3IDE3NiAxODYgMTA3IDQ1IDQ0IDQ4IDUxIDU1IDYwIDQ2CisxMjE4MTU2IDUwNTg5NjQgMjAxNTQwNSA3MTY3NTQxIDMwMjk3NDAgODgzOTUxOSAyODY2NjU5IDM1Nzg3OTcgOTg4OTgwIDE1ODU3NTcgNzIwOTk2IDE3MzEyMTkgNDU0NTc2IDEzMDcyMTQgMTA0NjM0NiAzMjU4MjU2IDc2MzAxMiA5Mzg5NzkgMzgyNTU3IDc5MzA5NCA0ODMxOTUgMTE2OTIxMSAzOTk5MTAgODkzMjM5IDIwOTcxOCAyMjg4MTggNTY2ODcgNTU0MzEgMzg2MjYgODk0ODUgNjQ0MjMgMTAzOTE5IDQ4NTA4IDM5MjA5IDI2ODY5IDM0NTY2IDMwNTE1IDM1NTIzIDIyNzE3IDMzNTY3CiszNDcgMTY4IDQwMCAxMjIgMzA4IDEwMCAzMDYgMTUyIDM1OCAxMzcgMzU2IDExMCA0MzggMTM0IDM2MyAyNzkgNDg0IDI1NCA1MDkgMzIyIDY5NyAzMDEgNzU0IDM1MyAzMjYgOTEgMjE5IDE1IDEwIDUzIDE0NyA4NSA5OCAyNSA0MSAzNCA0NiA0NCA5MyAzMworNDc4OSA5NDE1IDc0NjkgOTcwMyA4Mjc1IDEyODY1IDg1NjggNTkxMyAyOTQ0IDE5NTMgMjM0NyAyMTEwIDE3MDEgMTUwMCAzMzY3IDY2MjQgNDE5OCAzMjkyIDI0MjEgNDAzMSA0MTQ2IDI3MjYgMjIxNiAyMTIxIDU4NCAyNzggMTk2IDQzIDE5IDgwIDExMyAxNDUgNjkgMjMgMjkgMjcgMjIgMjcgMzMgMzAKKzEzMTAxNjUgNTMzMzg3MiAyMTU2MDE5IDczMzM2MzQgMzE2NTYzNyA5MDk5NTYyIDMwMTQxMTcgMzcyNzM1NyAxMDM5NTQ3IDE2MTA2MDIgNzYyOTkyIDE3NTY5ODMgNDg2NzEwIDEzMjA5NDAgMTEwNjI5NCAzNDY5NzMwIDg1MTI3NiAxMDg0ODk0IDQzNDg5MyA5OTMxNjQgNTc3MTE0IDEyNjY1MzkgNDQ2NTczIDk2OTk1NSAyMTk0MTEgMjMyMTY5IDYwMjgyIDU0NzQ3IDM4MTQ3IDg5MDMxIDY1NzAzIDEwNjU5MiA0OTA2MCAzODI2OSAyNjkzOSAzNDE1MCAzMDMxNSAzNTA1MCAyMjk5MyAzMzM5NgorMzE5IDEzMyAzMDYgODIgMjE4IDk5IDI0NSAxMDYgMjIzIDYyIDI0NCA2MCAyNzEgNTUgMjQ5IDE0MSA0MjggMjQ3IDQ2NiAzNDQgNjQ4IDE2MCA0MDggMTU1IDE3NiA0NSAxODMgMTMgNCAyMSA3MCA1MCA0MSA2IDE3IDExIDggMTAgMjggMTQKKzQ4NDggOTA3NyA1NzEzIDg1MjggNTM0NiA4ODIzIDYwNDAgMjY5OCAxNDkyIDExMzQgMTI0OSAxMzkwIDg4MiA4NjQgMjA0MiAzMjk5IDI2NjUgMTg4NiAyMjc2IDE5NjcgMTkyNiAxNzgxIDE2MTEgOTk3IDMzMiAxOTIgMjQyIDkzIDExIDU3IDYzIDQ0IDI0IDE1IDE1IDE3IDE0IDEzIDE2IDE3CisxNDAxMzg1IDU1NzE1MjAgMjI0ODIzNiA3NDE3NTcyIDMyMjMyNjkgOTA5NTY3MyAzMDkzMjcxIDM2Njk0ODMgMTA1MTczNSAxNTgzNjM5IDc3NTg3MiAxNzM2OTY2IDQ5NzEwNiAxMjk0NzY4IDExMzA4NzUgMzQ2NDIzNiA4OTgxNDkgMTEzNTY3NCA0ODIyMTYgMTA1NDQyNCA2MTE5NDAgMTI5OTk2OSA0NzY2MDYgOTczMDEzIDIyMjQyMCAyMzAwMzUgNjQ5NjMgNTcxNzYgMzc0NzUgODcxOTEgNjU2NzMgMTAyODk5IDQ4NDQ4IDM2ODk0IDI2NjQ5IDMzMTQ1IDI5OTE2IDMzNzQ1IDIyODI4IDMyNDM2CisyOTkgMTE5IDIwOSA2NSAxMTQgNDkgMTQ4IDI0IDgwIDIxIDk3IDI3IDEwNiAxOSAxMjIgNDAgMjMyIDEwNyAzODcgMTI2IDI1MCA3OSAyNTkgNDEgNzAgMjIgMjI1IDU4IDEgMTEgMjEgNCA1IDMgNCA0IDMgMiA2IDQKKzQ1MzIgMTAyMDQgNzI5NCA2Mjk4IDQ4MDMgNjMzMiA0MjM5IDIzOTMgMTMzNyAxMTIwIDU2MCA4NzIgNTQ3IDg5OCAxMTM1IDEwMTkgMTExMyA4MDggODIyIDU3NiAxMjk3IDEyNDggMTEzMyA2NzEgMjQzIDE1NCAyMDIgNzYgOCAzOSA1NyAyMSAxNSAxNiAxNSAxNyAxNyAxNCAxNSAxNAorMTQ4MjI1MCA1ODY0MTUwIDIzNzg1NjUgNzM1OTQ2OSAzMjY1NTgyIDg5Mzg5NzcgMzEyNDQxMSAzNTk2MzQyIDEwNTk2NTcgMTU1NzQzNCA3NzA4MTggMTY4NjMyNSA0OTg2NzkgMTI3MjI1NSAxMTMxNjU3IDMzMTg5OTUgOTA0MTc5IDExMTcxNzcgNDkxMTkwIDEwMjY1NDkgNjI5ODE4IDEyOTg2NDggNDkzNjcwIDk1NTg1OSAyMjMwNzkgMjI1Njk0IDY4NTA0IDU4NDE0IDM2NzQzIDg0MzU1IDY1NDkwIDk4MDE1IDQ3NjIyIDM1NjYzIDI2MzY3IDMyMjAwIDI5NjAzIDMyNTgwIDIyNjQxIDMxMzUwCisyNTYgMTMyIDI2NyAzNSA5NSAyNiA4MiAxOSA2NCAyMiAyMCAxMSA0MyAyMSA0MSA0IDU4IDIxIDk2IDEyIDE0MiAzOSAxNTYgMTkgMzcgMTQgMTY4IDM3IDAgNSAxNyAxIDIgMyA0IDQgNSAzIDYgMworNDU3NyAxMDc4NyA3Njk0IDYxNTQgNDc4NyA1NDU1IDM3NDggMjc2OCAxMzE5IDk0OCA4MzQgNDIyIDMyMCA2MjggOTMzIDE0MjMgOTgzIDM1NSAyNjkgMzgxIDg5NiA5MTQgOTUzIDc1NyAxODcgMTM1IDE1MyA4MCAxMCAxOCAyOSAxNSAxNSAxNCAxNSAxNyAxMyAxNiAyMSAxNQorMTU2MjI0NyA2MTc1MDQxIDI1MTU4NjUgNzI5NjAwNSAzMzA2NDI5IDg3Mzc4MDEgMzE0MjIyMyAzNTUwNjI5IDEwNjY5MjEgMTUyMjIzNCA3NzI4OTQgMTYxMTA3NiA0OTQ0MTAgMTIzNDUwNSAxMTI3MjU2IDMyMDcyODggOTA2NzM1IDEwNzE5NTkgNDg1ODA0IDk4ODM2NiA2MzY5OTkgMTI3Njg4NiA1MDU3MDcgOTQ1MDE3IDIyMjI5MCAyMjA0NDYgNzA3MDQgNTk4MjQgMzYwODEgODAzOTkgNjQ1OTYgOTMwNTUgNDY4MTYgMzQzODMgMjYwOTIgMzEzMTIgMjkxOTYgMzE2MDggMjI2MTIgMzAzOTAKKzI0MiAxMzAgMjY4IDM0IDkyIDIwIDY1IDI3IDYyIDE2IDQ1IDIgMTUgMTAgMjggOCA0NSA0IDEwIDUgNzcgMjEgMTE3IDI1IDIyIDExIDEwOCA0MCAxIDEgNCAwIDIgMiA1IDQgMyA0IDEyIDQKKzQ2NDQgMTA0ODcgNzE5NiA1NzczIDQ0MTUgMzc3MyAyNjIyIDE5MzggOTE3IDczMSAxMTczIDI4NyAxNjcgMzYzIDkwNyAxMTgzIDEzOTMgNDQxIDQwMiA4MDMgODg0IDkzNiA3ODcgNTE4IDE1OSA2OSA5OSA3MSA5IDEyIDIyIDEzIDE1IDE0IDE1IDE2IDE3IDE4IDE2IDE3CisxNjQxOTYwIDY0NDg4NDggMjYzNzAwOCA3MjEyOTQxIDMzMzY3NDcgODQ0NTM1NyAzMTMwODA3IDM0NTY2NjUgMTA2MzcyNyAxNDc1ODE0IDc4MzU4NCAxNTMyMDQ3IDQ4NjMzNiAxMTgyNzM5IDExMjIzMDEgMzA4NzUzOSA5MTk3MDggMTAzNDczOCA0ODM5NTIgOTc4NDAwIDY0MzY5NCAxMjU3NzgxIDUxMzIwMCA5MjAxNDIgMjIwODA1IDIxMTQ1OCA3MTQ2OSA2MDU5NiAzNTQxMCA3NjMxMiA2MzU0NSA4ODI3MCA0NjAzMCAzMzE4MCAyNTgyNCAzMDQxNiAyODkwMSAzMDgxNyAyMjQ1NiAyOTYxMQorMjMwIDExNyAyMzIgMzAgNzggMTAgMzIgMTQgMzAgMTAgODYgMSA0IDMgMjcgNiA4NyA3IDI0IDI2IDczIDIzIDg0IDEyIDE2IDMgNDcgMzEgMSAwIDIgMCAyIDMgNSA0IDUgNSA3IDUKKzUyMjMgMTA4MjMgNjkxMiA2MDgwIDQxMjcgMTc0MSAxMjY5IDEzNDQgMTA4OSA5MTAgOTMyIDIxNCAxOTAgMTcwIDE1NjggMTg4NSA2NTEgNDcwIDM3MiA0ODAgNTQzIDc1MCA4MDggNTY2IDEyNyA2NiA2NiAzNCA5IDEyIDE1IDE2IDE0IDE0IDE4IDE4IDEyIDE0IDEzIDE3CisxNzM0NDg0IDY3MjY4NzAgMjc0Nzg2NyA3MTUzNzIyIDMzNTg5NDYgODA0NTYxOCAzMDg1MDkwIDMzMzE4NDUgMTA2NTAxMCAxNDQzMTc2IDc4Nzg0NyAxNDUzMjc1IDQ3OTA1MiAxMTIyMjIxIDExMzQzNjYgMzAxODEwMyA5MTMzOTAgMTAwMTUzMSA0ODEzODAgOTQ5MTg4IDY0MTUwNSAxMjI4Mzk1IDUyMTA0MyA4OTk3MDkgMjE4NTM5IDIwMjgyNSA3MTM3MiA1OTA0OSAzNDc1NiA3MjQ3MCA2MjM0MiA4Mzk1NyA0NTIzOCAzMjA0OSAyNTYzOSAyOTY5NiAyODQ4NiAyOTgyOCAyMjIyNyAyODg3OAorMjQ5IDExNSAyMDkgMzUgNjggMiA3IDcgNDIgMTcgNTQgMCA1IDAgNzggMTcgMTkgOCAyMSAxMCAyOCAxNSA4NiAxNSAxMCAzIDIxIDcgMSAwIDEgMCAxIDMgNyA1IDIgMyA0IDUKKzU3NjkgMTE0NTMgNjcwNyA2NDQ3IDM4ODggNjk3IDEwMzAgNzQ2IDExNzggNzY4IDQ5OSAzMTQgMzcxIDQzNCAxMzQwIDE5ODEgNjA3IDUwNyA2MTggNTk0IDQ0OSA0NzMgNDgxIDI1NCA4MCA1OSA0MiAyMiAxNSAxMCAxMSAxNiAxNiAxNSAxNiAxOCAxNiAxNSAxNyAxNgorMTgzODY1NSA3MDI2OTE3IDI4NTA3MTggNzEyMDYwMyAzMzc0NDgyIDc2MDU3MjIgMzAzNDQwNSAzMTc3Nzc0IDEwNjg1MzYgMTQwMzc3MiA3ODA5MzUgMTM4NTM3MyA0NzY1NzYgMTA4MTU1NCAxMTQwMzAyIDI5NTg3MzEgOTA2MTA1IDk3MjU5MCA0ODUxNjAgOTI4NzMyIDYzNjk2OCAxMTgzNzU0IDUyMDMzMSA4NjEzMzMgMjE1MTI4IDE5NDI4MCA3MDY2MyA1Njg1NyAzNDI3MSA2ODczNiA2MTA2NiA3OTkwMiA0NDUxNyAzMTA0NyAyNTQwNyAyOTAyMCAyODE4MyAyODk1OSAyMjEwNiAyODEyOAorMjYxIDExNyAxOTEgMzkgNjAgMCA1IDIgNDkgMTIgMTYgMiAyMSA2IDU3IDIwIDE3IDEwIDU4IDE1IDE5IDYgMzEgMyA0IDIgOCAzIDMgMCAwIDEgMiAzIDUgNiA1IDQgOCA1Cis2NTE4IDEyNjAzIDY4MzIgNjMxNCAzNTM3IDI4NDggMTk3OCAxMTA3IDY1MCA0MzMgMzkwIDMzOSAzMTcgMjQ3IDg0MyA5MDEgMTExNiA1OTAgMzEyIDI3NyAyNTIgNDU0IDQ4NCAyODYgNTIgMjQgMTIgNyAxMyAxNCAxNSAxNyAxNSAxMCAxNiAxNSAyMCAxOCAxNiAxNQorMTk1OTM3MiA3Mzc5NjE1IDI5NTQxOTcgNzA4MTMwMCAzMzgwNjU4IDczMjQzNzEgMzAwOTIxOCAzMDU1MTI2IDEwNTg0NzcgMTM0NjE1MSA3NzE0MDkgMTMyMzA4MSA0NzI3ODIgMTAzMTgzOCAxMTMzMzg1IDI4MzY1NjkgOTEyMDEzIDk1MDQ4NSA0ODEwMjQgODkwMDI4IDYyNzUwOCAxMTQwNjI0IDUxOTcxNCA4MjcyMjYgMjExMDg2IDE4NDA5OCA2OTIwNSA1Mzg3NSAzMzc0NyA2NTQ3MiA1OTkyNSA3NjE1MiA0Mzc4OSAyOTc5OCAyNTE4MSAyODIwMCAyNzk5MCAyODMyNyAyMTk2MyAyNzM2MQorMjgyIDEyNiAxODcgMzkgNDkgNyAxOSA2IDE1IDQgMTAgMiAxNiAyIDIzIDQgNTggMTUgMTUgMyA2IDYgMzEgNCAxIDAgMCAwIDIgMSAxIDEgMiAxIDUgNCA4IDYgNyA0Cis3Mzg0IDEzODY2IDcwNjAgNDk4OSAzMjY3IDQyMzQgMjIwNiAxMzM1IDcyOSA1ODQgMjE2IDIwNCAyOTkgMjYxIDk1NiAxMDQ0IDcxMCA0NDEgMTU0IDE1NyAzOTIgNDYyIDM1NSAyOTUgNjkgMjggMTAgMTAgOCA5IDggMTQgMTMgOSAxNiAxNCAxNSAxOSAxNyAxNAorMjA5OTIxMiA3Nzg4NzQ4IDMwNjA5MjEgNjk2Mjk1MCAzMzc5Nzc4IDcxNDUwNTIgMjk5MDQ4OCAyOTUzODQ0IDEwNTA2ODggMTMwMTI2NCA3NTc2NzMgMTI1NjIzMiA0Njg2MjIgOTg1OTY1IDExMjk1MjkgMjczMDUyMiA5MDczOTUgOTIwNTUyIDQ3Mjk1MiA4NDYyNzQgNjIxODYzIDExMDA1NzMgNTE1ODE0IDc5NTcxOCAyMDc1ODAgMTc0NzcyIDY3NzMzIDUxMjU3IDMzMTA5IDYyMDk2IDU4NjMzIDcyNDQzIDQzMDI4IDI4NTYzIDI0OTYxIDI3MzY4IDI3Njc0IDI3Nzk0IDIxODQ5IDI2NTc5CiszMDkgMTM1IDE4NSAyNSA0MiAxNyAyNSA5IDE5IDggMyAxIDE0IDIgMjkgNiAyMyA4IDMgMSAxNSA3IDE3IDUgMyAwIDAgMCAxIDAgMCAwIDEgMSA2IDQgNCA3IDggNAorODA5MiAxMzUzNSA1ODM1IDIxMzcgMjA5MCAyMTQ4IDExMDkgOTI3IDc5MyA0MjcgMTkxIDEzOSAxOTkgMTIxIDM5NiA0OTEgMjc1IDE4NiAxNzYgMTU3IDM1MCAyOTYgMjg3IDIzMiA2NSAyNiA4IDggNiAxNSAxMiAxMSA3IDggMTIgMTQgMTUgMTUgMTEgMTAKKzIyNTM2NjAgODE1Mjk5OCAzMTMzNjY3IDY2NzY0ODEgMzM0ODgzMiA2ODQ4MzM0IDI5NDQxODQgMjgzMzU3MyAxMDQ0NzMwIDEyNDk0MjUgNzQzNjQxIDExODk0MDAgNDYyMDEwIDkzNDI0MyAxMTExNDU0IDI1OTY4NjMgODkxNzczIDg3Njc0OCA0NjU2NDQgODA1MTQ1IDYxNTI4NiAxMDUyNzI2IDUxMDI3MyA3NjIyMzAgMjA0MDU5IDE2NTg4MyA2NjI0NiA0ODY3MyAzMjQzNSA1OTI5MSA1NzQ3NiA2ODc3MiA0MjEzMiAyNzM0MCAyNDY0NCAyNjU4NiAyNzM2NiAyNzA0NyAyMTU4NCAyNTU5OAorMzIxIDEyNCAxMzggNSAxNyA0IDYgNCAyMyA0IDIgMCA2IDAgNSAxIDMgMSA1IDEgMTIgMyAxMSAzIDMgMCAwIDAgMCAxIDAgMCAwIDEgMyA0IDQgNCAzIDIKKzc3MDYgMTAyMTIgMzQwOSAyNjI3IDIzMjEgMTM0NyAxMzkwIDYzOSA0MjQgNTEwIDE3NiAzMTMgMjY5IDIxMyAzODUgNDA1IDM3MyAxNTkgMjA2IDI0NCAyODYgMTY3IDMwMCAyNDIgNzYgMTcgOCA4IDEyIDcgNyAxMCAxMSAxMSAxMCAxMiAxMSAxMiAxMSAxMworMjM5NDM4NSA4MjkxMjM3IDMxNDI1ODIgNjQzNzMwNCAzMzI0NTY0IDY1MjAyMDYgMjkwNjIxOSAyNzAyODI0IDEwMjk0ODggMTIwNTc5NSA3Mjk1NzYgMTEzNzI2OCA0NTczNTIgODkxMjc2IDEwOTM1NDkgMjQ2NTkzOSA4NzkwNDYgODMzOTEzIDQ1OTI4NSA3NzE4MjkgNjA3MjM3IDk5OTgyNSA1MDUyMDMgNzMxMzY1IDIwMDkwNyAxNTY5NzQgNjQ3OTYgNDYyNDQgMzE5MzIgNTYxNjMgNTYyMjAgNjUyNjAgNDEzNjEgMjYzNzUgMjQyODQgMjU3MjggMjY5NjQgMjYxNjEgMjEzMjYgMjQ4NjAKKzI4NCA3NSA1MyA4IDIyIDIgMTAgMiA2IDcgMiAzIDEyIDIgNSAxIDcgMSA3IDMgOCAxIDEyIDQgNCAwIDAgMCAyIDAgMCAwIDEgMiAyIDMgMiAzIDMgNAorNzUwOSA3OTc4IDIzMjcgMTM1MCAxMzM0IDEzNjMgMTEyOSA2MjAgNDE3IDI3NyAxMjIgMzAyIDIyNCAyMjUgMzcwIDU4OCA1NTMgMjI2IDI1NiAyNjIgMjIzIDI5NCAyMDkgMTI1IDMzIDcgNyA3IDggMTIgNSAxMSAxMyAxMyAxMSAxMiAxMiAxMiAxMiAxMQorMjUyNjU2MSA4MjgzOTMxIDMxMjM2MTYgNjEzNDAyMiAzMjc1NjcyIDYyMTI3NDggMjg2MjUzMCAyNTc4NzUyIDEwMTQ0NDggMTE1MDQ2OCA3MTQ0ODEgMTA4NzU4OCA0NTE2NjAgODUxNjI1IDEwNzU3MDggMjM1NDExMyA4NzEyMzggNzk3NzY1IDQ1NDM2MyA3NDE2MTcgNTk3Nzc4IDk1NzkwMCA0OTc5MzMgNjk1MTY0IDE5NjczNSAxNDc5ODYgNjMzNTcgNDM4OTkgMzEzMzkgNTM1MzAgNTQ5NDQgNjIwMjAgNDA2NjAgMjU1OTEgMjM5NTggMjQ5MjEgMjY1OTcgMjUzMjggMjExMDAgMjQwNDQKKzI1OCA0NiAyNSAyIDcgMiA3IDIgNiAyIDEgMyA4IDIgNCAyIDE1IDMgMTEgNCA1IDMgNiAxIDAgMCAwIDAgMSAxIDAgMCAyIDMgMyAzIDMgMyA0IDMKKzg4NTMgOTE3NyAyMTQwIDEyNzcgMTI3OSA3MjcgNTc5IDcxNiAzODggMjI5IDQzIDIxMiAzMTUgMjI5IDE1OSAzOTQgNDMzIDI1NCAyMTYgMjQ1IDEyNiAxMDYgMTIzIDEwNiAyMSAxMSAxMCAxMCAxMSAxNCAxMyAxMyAxMCAxMyAxNyAxMSAxMiAxMyAxMSA5CisyNjg5Nzk0IDgzNTA3MjcgMzEwMDM0MyA1ODQ0NDUxIDMyMjY1OTQgNTg4NDY2MyAyODA1ODcyIDI0NjgwMjIgOTk5MDQyIDEwOTU1MTEgNjk3NzQ0IDEwMzUzNjAgNDQ4NDM3IDgxNDU5OCAxMDUyOTE5IDIyMzcwNzggODYwNTU3IDc2NTUwNiA0NDg1NDIgNzEyMTczIDU4NjA3NiA5MDY5NDAgNDg4NjQ3IDY1OTk2OCAxOTIzNjAgMTM5NzgzIDYyMDMxIDQxODc5IDMwODM3IDUxMTc4IDUzOTA0IDU5MDk3IDM5OTAwIDI0ODU0IDIzNzk0IDI0MTAxIDI2MjM5IDI0NjA3IDIwODU0IDIzMTU0CisyOTQgNjEgMjEgMiA3IDAgMSAzIDUgMSAwIDEgMTcgMyAwIDEgOSA0IDggNCAxIDAgMiAxIDAgMCAwIDEgMiAxIDEgMSAxIDQgNyAzIDMgNCAzIDIKKzY3MzYgNTcxOCAyMDU5IDE2NDIgMTMzOCAzNjIgNjI3IDQ3MSAzNzEgNTAyIDI4NSAyMzMgMjIxIDI0NSAxOTkgMzA5IDI2MSAzMDAgMjE3IDEzNiAxNzAgOTcgMTAzIDcyIDQxIDUzIDM3IDE2IDE1IDExIDEyIDE5IDE1IDExIDEzIDEwIDEzIDE4IDE2IDExCisyNzk0ODM2IDgyMDEwMDMgMzA3NTU4MSA1NTk0Njc4IDMxODAyNDkgNTU1MzgzNyAyNzUxODU1IDIzNDg4ODMgOTgzNTg2IDEwNjA2MjQgNjg3NjExIDk4NzU1NSA0NDI4OTEgNzgwNzc2IDEwMzE3MjEgMjEyMTg0MiA4NDU3NDYgNzM4MDA4IDQ0Mjg5MSA2Nzc3OTkgNTc1NzkxIDg1ODQ4NSA0NzkwODEgNjI0Nzk1IDE4ODYwNiAxMzQ2NTIgNjE0MjggNDAzNDkgMzA0NTAgNDg3ODMgNTI4NjUgNTY3MTggMzkyODcgMjQwMzggMjM1MzIgMjMyNjkgMjU5MTYgMjQyMzYgMjA3NDIgMjI0NDAKKzE5OSAyNCAyMCA0IDggMCAyIDEgNSA5IDYgMiA4IDMgMSAwIDMgNiA4IDEgMyAwIDEgMCAxIDQgOCAzIDQgMSAxIDIgMiAzIDQgMiAzIDggNyAzCis0MzczIDUwMjUgNDY0NSA1MjIwIDUzODggMzA5MyAxMzYxIDE3MTEgMTI2MCA4MzAgMTQzNCA4NjIgMzQyIDQwMiAzMTUgNDc4IDgwOSA4MTQgNTgxIDMyNCAyNzQgMzUyIDQ5MSAzNjYgMTk3IDMwMyAyOTcgMjA2IDU5IDI2IDUzIDEzMCA1MiAyOSAyNyAyNyA0NyAyMCAyNCAxOQorMjgzNjg1MiA4MDE3Njg2IDMxMTc1NDEgNTU3OTcxNCAzMjM4NTg5IDU0MTA2NDYgMjcxNzk0OSAyMzEzMDc1IDk5MTI0MSAxMDQ3OTgyIDcwNzEwMiA5ODEyNjMgNDQwNTc3IDc1ODYyOSAxMDE0MDE3IDIwMjM5MDMgODQ1MzEzIDc0MzczOSA0NDY2ODYgNjU3MDM4IDU2ODQyMSA4Mjg2MDMgNDc5NjcyIDYwOTc5NCAxODg5MzMgMTQ1MTg4IDY3NDg2IDUwNTg0IDMxMTk4IDQ3NDUzIDUyOTAwIDYxMzAxIDM5NjM1IDI0Mzc3IDIzNjM0IDIzNTMxIDI2NDcwIDI0MDEwIDIwODM3IDIyMjYwCisxMDMgMTkgOTcgNDMgMTE2IDE2IDExIDI0IDYzIDI1IDEzOSAzMCAyMSAxMSAzIDIgMzUgNDcgNjAgOSA4IDcgMzcgMTQgMzQgMTIwIDI4MiAyMzcgNjAgNiAyMSA5OCAzMyAyMCAxOCAxOCA0OCAxMCAxNyAxMAorNDQ3NSA3MjgxIDY5MjcgMTIyMDEgMTEyMTcgMTIyMDcgNTYxNCAyNjkyIDIxMjEgMTE3OSAxNTI4IDExNzYgNzczIDY5NSA2MDEgMTIwMyAxNzk3IDEzNDggNzgyIDY1OCA2MDkgNzQ0IDEwNzggMTAzMSA0MjUgNDQ1IDM3NCAxODEgNzggMjcgODYgMTYxIDU5IDM3IDI5IDMxIDQ2IDMyIDM1IDI4CisyODgwNDI2IDc5ODM5NzAgMzIxNjc4OCA1OTk0NTQzIDM0NDQ0NzcgNTgzNTk4OCAyNzkzNjA3IDIzMzk2ODUgMTAyMDcxNCAxMDU3NTQwIDcyODUwOSA5OTQ2NDAgNDQ5MzM4IDc1NTgxMiAxMDA0MDY2IDE5NzYzODMgODcwMTQ2IDc4MTkzNCA0NTU1MjUgNjU4MDQzIDU2OTc5OCA4MjQ1OTggNDk1MjU0IDYzNjU0OSAxOTUwODAgMTYzODE2IDc1MzYxIDU4NjY5IDMyNDEzIDQ2MjY0IDUzNzc3IDY3NTE0IDQwMTUzIDI1MTg3IDIzNzg1IDI0MDIzIDI2OTg1IDI0NTM1IDIxMjExIDIyNjQ0CisxMDUgNDEgMTY5IDE2NSAyODYgMTcxIDE1NSA2MCAxNDYgNTAgMTQ2IDU1IDk5IDMzIDE0IDE1IDE0MiAxMDggOTkgMzkgNDMgMzEgMTQ1IDk4IDEzMiAxNzkgMzM2IDE2OSA5NiA3IDU1IDEyMyA0MiAzMiAyMSAyNCA0NCAyNCAzNiAyMQorNjk0MCA5MTczIDcxODMgODU3NCAxNzgzNSAxODc4NSA5OTc5IDc0OTQgNDIwMyAyMDE2IDMwMjcgMjM3NyA5NTggOTU2IDg3MCAyNTE5IDI5MjEgMjgxNSAxMzkyIDg4MCA2NDkgMTU3NiAyMTcxIDE5NzEgODM0IDkyNyA2ODYgMTYxIDc2IDQ3IDE0MSAxODggOTEgNDAgMjUgMzUgNTIgMzIgMzEgMjYKKzI5ODU5MjQgODA2ODUxNyAzMzIwMTAxIDYxNjE2NTAgMzgxNDM5OCA2NjM5OTQ2IDI5Nzg5NTcgMjY1OTcyMiAxMTAyNjcyIDExMTc5NDggNzg3NzAwIDEwODEwMDAgNDYyNjA5IDc2OTE5OSAxMDAxMjQwIDIwMTI1NjUgOTIzMDkyIDkwNzk2NiA0Nzk3MzYgNjcyNjI3IDU3MjE2MyA4NzE5NDkgNTM4Mzg2IDcxOTQ1MCAyMTE1MjkgMjEwOTQwIDkxMDE1IDY1MDQwIDMzNTQ2IDQ2Mzc1IDU2MDM4IDc1MDEzIDQxNDc2IDI2MTMzIDIzODMwIDI0NzMxIDI3NjQwIDI1MDI4IDIxNDczIDIyODgyCisxODggNjUgMTY5IDkyIDQ0MSAyNTIgMjk5IDI0MyAzMjcgMTIyIDMyMSAxNjEgMTMzIDYwIDI5IDY2IDI1MSAyNDUgMjEzIDY3IDQ5IDExNiAzMzEgMjExIDI5MSAzMzIgNTU5IDEyOCA4OCAyMSAxMjUgMTM3IDkyIDM1IDE1IDI5IDU1IDI0IDI4IDE4Cis3NDgwIDgzNDggNTg1MiA2MTI4IDEyODI0IDEzMDQwIDIwNjMxIDEwODUyIDQ2ODcgMzIwNiAzNjk2IDMwMDcgMTM5MCAxNDg0IDEyOTkgMzMzNSA0NDE0IDMxMDUgMTU4MiAxMTQwIDEwNjggMTczMiAxODM4IDE3MzkgNzc4IDEwMTUgODEzIDIyMyA1NCA0NSAxNDMgMjY0IDE3MCA1NCAzMiAyMyAzNyAzNSAyOSAzMQorMzEwMjU5MiA4MDk3MzA1IDMzODY4MTEgNjE2ODQ1NSA0MDQ2OTkxIDcwNDI3MTAgMzQzMTk3MiAzMTY2ODY0IDExOTQ5NTcgMTI0Nzg0MiA4NjI1MTUgMTIwMDg4NSA0ODY1OTIgODE0MjIyIDEwMDk0NTEgMjA5NjcxMCAxMDEyODgxIDEwNDQyNTMgNTA4MjAwIDcwMjMwOSA1ODUxODAgOTI2MDQzIDU3MTkyOSA3ODMxMjQgMjI2MTM2IDI2MDY0MyAxMDk1MjUgNzQ4MzggMzQwODggNDYzNTcgNTgyOTQgODY3MzEgNDQ3ODYgMjc4ODIgMjQwNTMgMjQ2NjAgMjc4OTUgMjU2NzYgMjE2NzggMjM0MTMKKzE5NyA1MiAxMjEgNDkgMjgwIDE0MiA1ODUgMzA2IDM0NCAyMDQgMzYzIDE5NiAyMDkgMTE4IDY1IDEwNCAzNzUgMjM4IDIzNiA5OSAxMTcgMTIyIDI1NCAxNTggMjQ2IDI5NSA1NTcgMTc2IDQ0IDE5IDEyMSAxODYgMjExIDU5IDI1IDEyIDI3IDI3IDI0IDI0Cis3NjE4IDg2NzkgNjM3MSA3MDgyIDEwNzE5IDE1NDQyIDI2ODEzIDE1MjgxIDc1MDcgNDY2MyA0NDI3IDM3NTIgMTcxMiAxNzk0IDIwMDUgNDQ1MyA1MDkyIDI4NzggMTQyMSAxMjA5IDEzODUgMjMwNyAyMTA0IDEyNzggNTkwIDk1OSA2OTYgMTg2IDMwIDk3IDIzNyA5OCAxNDMgNjkgNDEgNjMgNTYgNTIgNDggNTQKKzMyMTk4NzUgODE0NDcwMiAzNDY1MTIzIDYyMzM0NjMgNDIxOTk2OCA3NTY4ODgyIDQwMzE3MDUgMzkxNTY4NiAxMzU3MDI0IDE0NTk0NTcgOTU0MTQ4IDEzNTkzNDggNTE4MjA4IDg3NTU4OSAxMDM1NTA0IDIyNDQ0OTMgMTExNzc2MCAxMTU4NDE3IDUzMTgzNyA3MzQ0NTAgNjA1OTc1IDEwMTIyMTggNjExNDM1IDgxNDY1NSAyMzU1NzIgMzAzOTIzIDEyNDU4MiA4MTc3NSAzNDAwMyA0OTUzNSA2Mjg5NyA4NzU0OCA0NzMyMyAzMDQ0OCAyNDUwMCAyNzA1MSAyODYzMCAyNzMzMCAyMjM2MyAyNTMyNQorMTkyIDU2IDEzMyA2MyAyMTYgMTY1IDY1NiAzNTcgNTE2IDI3MCAzOTkgMjI1IDI1NyAxNDAgMTMyIDE0OSA0MDUgMTkzIDE5NyAxMDEgMTY0IDE2NSAyNzkgOTIgMTYyIDIzNSA0MTEgMTIyIDEzIDgwIDIyNiAzMyAxNTcgODMgNDAgODIgNjEgNTYgNjMgNjcKKzc5NTggMTAyNTQgNjc2MiA2MjUxIDkzNzYgMTQzNzYgMjgzNDEgMTk1NzYgMTI4NzkgNTg0OCA1MTgyIDYwOTAgMjY3MiAzMTQ5IDM3MzMgNjk5NSA0NTY5IDI3NTUgMTYxMSAxMzYxIDE0MjQgMjk5MiAyMTc0IDExMzAgNzExIDcwMCA1MjYgMzU3IDUxIDE0OSAzMTUgMTY2IDEzMCA3MSA2MiA2MiA1OSA5NyA3MiA0NAorMzM0MjkyMiA4Mjg2MDE5IDM1NTE0NzUgNjI0MzUxNiA0MzU0Mjk3IDc5OTc5OTMgNDY1NTUyNiA0ODgzNDU0IDE2NTIzNjcgMTczMTE3OSAxMDYyNzk0IDE2NTE5NDQgNTczNTc0IDEwMTY1MjIgMTEwNTA3OSAyNTM5NTg0IDEyMDY2NTEgMTI1ODE3NSA1NTk3NDEgNzc0MDAxIDYyNzI0OCAxMTM1MzA4IDY1MTc0NCA4MzUyMDIgMjQ3ODY2IDMyODY5NCAxMzQ5MTcgOTg4MDEgMzQ0NTcgNTU3MTcgNjkzNzkgOTI0OTMgNDk0NjQgMzI5ODMgMjU0NzMgMjkyMzcgMjk0MjMgMzE2NDkgMjM2NDUgMjY1MDgKKzE5MiA3NiAxNDAgNDkgMTc0IDEzOSA2MTQgMzg1IDc0NyAyODcgNDM0IDMxOSAzOTcgMjQ4IDI4NCAyMzQgMzMwIDE2NCAyMjAgMTEyIDE2MyAyMDggMjcwIDcxIDE5NyAxMzkgMjc0IDIzNiAzOSAxMzYgMjk1IDg0IDEzMCA4MCA4NiA3MiA2NSAxMzggMTIwIDQyCis3OTI1IDEwMzgxIDcyMDEgNzA5OCA5NjI0IDE1MzUwIDI2MzI5IDI0MzUzIDE5OTE1IDczMzkgNTIxNiA3MzUzIDM4NzQgNDg2MiA0OTk5IDg0NjAgMzMzMyAyNjcwIDE4MjEgMTM2NCAxNTgwIDMyODMgMjMxMSAxNDA4IDc0NiA1MzQgNDM1IDQwOSA4NyAyNDcgMzk1IDI0NCAxNjEgNjggNTYgNTMgNjAgODQgNjYgNTYKKzM0NjIwNTQgODQyNjY2MCAzNjQ2ODkzIDYzMDUwMDMgNDQ5MTYxMiA4NDYxMTk4IDUyMTIzNDMgNjA4NjY0NiAyMTIwMTk1IDIwNzgyMDIgMTE2OTU5NyAyMDA0NTgxIDY1ODI4NCAxMjU0MjQyIDEyMDUyNzkgMjkwNjk3NiAxMjYxNzI4IDEzNDY3MjUgNTkyMzE3IDgxMTM2MyA2NTE5NzggMTI2ODg5MSA2OTQ1NDkgODcxNTk1IDI2MDc0OCAzNDE3ODAgMTQyNjY4IDExODAwMSAzNTgyMCA2NzU0OSA3Nzc0NCAxMDE5MzQgNTIzNDQgMzUxODEgMjYyNjggMzA3MzkgMzAyMjIgMzQ5MTAgMjQ3NDEgMjgzNTgKKzE4MSA3NyAxNDggNjIgMTczIDE0NSA1MDEgMzg3IDkzMiAzMDggMzk5IDMyMCA1MjcgMzQxIDM2OCAyNTIgMjExIDE0MyAyNDIgMTA0IDE3OSAyMDYgMjcwIDk3IDIwMCA4NSAyMDQgMjI4IDEwMyAyMjMgMzQ4IDEzNSAxNjUgNjggNjkgNDkgNjUgMTAwIDk5IDYxCis3OTY0IDk1MjggNjc2NCA2MTc1IDcwNjkgMTA5MTAgMTcxMTMgMjgxNjAgMjA4NDggODk4NyA3MzI3IDcyNzkgNDc4NiA3MzM3IDYzMTcgNzQzMCAyODgzIDIyNDQgMTcyMiAxNDQyIDE1MzAgMzQyNCAyOTE5IDE5MjQgMTQ0OCA4MDUgNDIzIDQwMiA5MyAzNDkgNjY2IDM5NyAzMDYgMTAzIDUwIDUxIDU1IDcyIDYxIDU3CiszNTc5MjA5IDg1MDY0NTcgMzcyODc1OCA2MzA2MDk0IDQ1NjAxODcgODYyMzgyOSA1NTE5Njc2IDc0NTE1NDIgMjYwMDE5NCAyNTA1NjUzIDEzMjc2OTYgMjMzMTUxNCA3NjQxOTMgMTYyOTc1NyAxMzM2NjY5IDMxODkwNDUgMTMwMzkyNyAxNDAzNzkwIDYyMTU0OSA4NTEyNzYgNjc0ODEzIDE0MDMxMjIgNzUxODI3IDkzNzUwNyAyOTEyNTMgMzcwNzMxIDE0OTkxOSAxMzU2MTkgMzczMDMgODQ5MzcgOTI4MjcgMTIwMjA4IDU4ODU5IDM5Mzk4IDI2ODkwIDMyMDI4IDMwODczIDM3MjM4IDI1NjgyIDMwMTU4CisxNzUgNjMgMTMwIDQ3IDEwOCA4MiAyODYgMzU1IDgwNiAzMjYgNTEzIDI3MyA1NjQgNDA1IDQzMSAxODggMTY3IDEwMyAyMTMgMTA1IDE2MyAxOTEgMzI1IDE0MCA0MDUgMTQzIDE4NiAxOTQgMTA5IDI3MyA1MzAgMjE1IDMzMCAxMjAgNTMgNDMgNTMgNzAgODMgNTgKKzgxODAgOTU5NCA2NzQxIDU4NjkgNjg0MSA4NjgwIDEyMjE3IDI4OTM0IDIwODEwIDExMzQzIDgwMzEgNjk2MCA2MzIzIDEwNTg4IDg2NTYgNTA0NyAyNzc1IDE3NzUgOTU0IDEyMDYgMTMzNSAzMTQ4IDMwNjMgMTc1OSAxMzQ2IDkxNCA0NjUgMzE1IDE0NCA0ODIgNjgwIDQ4MyAzNjIgMTE2IDUyIDQ3IDQ3IDc4IDY1IDU0CiszNjk4OTYxIDg1ODU1MjEgMzgwNzk5MiA2Mjg4MzIwIDQ2MjEyMjIgODYzOTY5NyA1Njk0MTgzIDg3ODIxMDAgMzA2NzIzOSAzMDUyMjA1IDE0OTk4NDQgMjYxOTIzMyA5MDY3NDcgMjE4MjQ3NSAxNTI0NTcwIDMzMDc3ODUgMTM0MjMxMiAxNDI4NjE3IDYzMDQxOSA4NzQyOTUgNjkyMDkzIDE1MTIzNDMgODExMzU2IDk4OTMyNyAzMTgzODkgNDA0NjQxIDE1ODA2MyAxNDY4MzUgNDAwNTIgMTA5NDUzIDEwNzg5MiAxNDI2NzAgNjY2NDMgNDQxNjAgMjc1NDcgMzI5OTMgMzEzMDMgMzk3OTUgMjY3MDIgMzE2NjYKKzE3MyA2NCAxMjYgNDIgMTAxIDUzIDE3NyAzMTcgNjcyIDM0MCA0OTYgMjI0IDYzMiA0NTUgNTI5IDEwMSAxNTIgNjYgODcgNzMgMTI5IDE1NCAzMTMgMTE0IDMzOCAxNTEgMTk4IDEyNSAxOTEgMzA0IDQ2MyAyMzMgMzYxIDEyNiA1NSAzNSAzOCA3NCA4OCA0OQorNzU5OCA4NzA4IDYzODkgNTI4MyA1NDU3IDY5MzkgMTExNDUgMjUyMzIgMTgwNTIgMTI2NzUgODQ1NCA3MjY4IDg0ODcgMTM3ODggMTA3MDEgMzQwMyAyMjYzIDE0NTYgMTAwOSA3MjIgOTM2IDI3MjAgMzEzMyAxNDg2IDEzMzYgOTQ0IDUyNCAzMTggMjYyIDU0MyA1OTAgNTEwIDQ0OCA5OSA0NyA1MSA1MyAxMDggMTAyIDQ5CiszODAwODQ2IDg2MDU0MDggMzg3NjI1MCA2MjM1NjEwIDQ2NDUzNTUgODU0NzY1MSA1ODM2OTMxIDk4MDUzODYgMzQ1MjEyNCAzNjQ3ODAwIDE2Nzg1MDggMjkwODYxMyAxMTAxMDYwIDI4OTg2MzIgMTc2MDA1NSAzMzE4Mzk3IDEzNjY2NTEgMTQzMjM1NiA2NDA0NzQgODY2MTk3IDY5ODc0MiAxNTg4NzE2IDg3MTE4OSAxMDIxMjY1IDM0NDU5MiA0MzgzNjAgMTY3NTExIDE1NzU2MiA0NTc0OSAxMzYyNDYgMTIwMjgwIDE2NTQ0MyA3NjQzMSA0NzU5MiAyODA2MCAzNDE0NiAzMTg3NiA0NDA0MiAyODY0MiAzMjc3NgorMTUxIDUzIDExMyAzNSA2NiAzMyAxNTAgMjM3IDUwMCAzMTAgNDYwIDIwNyA3MjkgNDU0IDU2OCA0NyAxMDkgNDQgOTQgMjcgNzAgMTE0IDI5NCA4MyAzMDYgMTQxIDIxNiAxMTYgMzUzIDI4MyAzNTAgMjEyIDQxMCA4OCA0NCAzOSA0NyAxMTMgMTYzIDM4Cis2NTIzIDY5MzIgNTkzNyA1MjQ4IDM0MjEgNDU3MSA4MjI1IDE3MjUyIDE0MTY2IDExNDU0IDc2NTMgNzQ2MiAxMDEzNCAxNDgxMSAxMTEyMCAyMTE2IDExNDIgMTE4NSA2NTkgNzM2IDc0NyAxNDEzIDIxOTIgMTI3OSAxMDgzIDg0MyA1MzMgMjQ4IDI4MiA0NjQgNTMxIDQ0MyA0MDEgODYgNDggNDggNTkgMTM0IDEwNCA1NgorMzg3MjcwOCA4NTE0OTg5IDM5MzEyNTAgNjE4MzkxMiA0NjE2ODQwIDgzMTU2NDMgNTkwMTQ3MyAxMDI3NzAwNiAzNzI4MDY1IDQxMzI2NDYgMTgzMjIzNiAzMTkyNTQ5IDEzMzI2MjQgMzYzNDY3MSAyMDAwMzczIDMyNDkzMDMgMTM2MTcyNyAxNDE5MjIxIDY0MTMzMSA4NTk0NDUgNzAwMzk0IDE1ODAyMDggOTA1NDc0IDEwMzg1NzAgMzYzNjc0IDQ2Mzg1MSAxNzY5NTQgMTYzMzQ1IDUxODE1IDE1NjU3OCAxMzA4NTEgMTgyNzMzIDg0NzczIDUwMDIwIDI4NTg2IDM1MDQ2IDMyNTg4IDQ5NjMyIDMwNTg1IDM0MjUwCisxMTcgMzMgOTkgMzUgMjYgMTUgOTIgMTMzIDM0NCAyMzggMzY5IDE4OSA3MzIgMzczIDUxNiAxOSAzMCAzMCA0MSAyOCA0NCAzNCAxNzcgNjEgMjIxIDEwOSAyMDcgNzEgMzQwIDIwMCAyODYgMTU0IDMyNCA2MyA0NSAzNCA1NiAxMzUgMTU3IDQ4Cis2NDcwIDczMjkgNjAxMyA0NjQ5IDM5MTUgNTY3NiA5NTczIDEzMzczIDEzMzkzIDEwMTA2IDgyNjggODAyMiAxMjI0NCAxNDMwMSA5NjY4IDIyODAgMTM0OCAxMDI3IDczMiA2NjYgMzg5IDgxMiAxMzQ4IDg4NCA3MzkgNjkzIDQyMSAxODUgMjU1IDM5NiA1NTkgMzc4IDMxOCA1NyA0OCA1MiA2MCA5NiAxMjQgNTMKKzM5NDE0MjEgODQ1NDM4NSAzOTg2ODIwIDYwOTg1MTUgNDYwMTY2NSA4MTY1NDQzIDU5OTg4NjIgMTA0ODIwMTQgMzk3NzM1OCA0NTA1NTg0IDE5OTc4NDcgMzQ5Mzg1NSAxNjEyMzQ0IDQyOTUyMTcgMjE5NzU3NSAzMTk0NDMwIDEzNjIxOTEgMTM5NzE2NyA2NDQwMzIgODQ4Nzk3IDY5Mjg1MyAxNTM1Mjg2IDkxNzMyOCAxMDMwNTY5IDM3MzQ4NiA0Nzg1OTcgMTgzMjk4IDE2NDkxMCA1NzAzOSAxNzE1MTIgMTQxODczIDE5NDk5MiA5MDc4NSA1MDUyMCAyOTA5OSAzNjEzOCAzMzMwOCA1MjU1MiAzMjk5MSAzNTQ1MQorMTEyIDM5IDk4IDI4IDM0IDI0IDExNSA4NiAyOTggMTg1IDM2OSAxODIgNzI4IDMwMiA0MDUgMjMgNDEgMjMgNTAgMjMgMTIgMTEgODIgMjkgMTI1IDc0IDE0MiAzOSAyNzMgMTQzIDI4MiAxMTAgMjI1IDI3IDQzIDM4IDU3IDcyIDE4NyA0MQorNjQ3NiA3NTk3IDU2OTUgNDU5NCAzNzc5IDU3NjMgOTgyMCAxNTQyMiAxMjg1NSA5MjAxIDc4MjEgOTk4OCAxNDM2NyAxNjA5MiA2MzQ4IDI0NjcgMTM0OCA3NTAgNzI2IDc0OCA1MDQgOTMzIDExOTMgNjk1IDUwNCA1MzcgMzUzIDIyMCAzMzAgMzIxIDM3NSAyMjEgMTU1IDY2IDQ3IDQ5IDUxIDk3IDg5IDQ1Cis0MDA4NTcyIDg0MTM4ODMgNDAzMjg3MyA2MDE0ODYyIDQ1ODMzOTIgODAyOTYwMCA2MTAwMTMzIDEwODAwNjA3IDQyMDY2NzUgNDgwMDU0NiAyMTQ3ODk4IDM4OTc4NjkgMTkzOTM1MCA1MDI2MTY2IDIzMDQ5ODYgMzE1NDMzOCAxMzYyNjQ0IDEzNTk0MTggNjQ2NTEzIDg0MzgyNiA2ODg0NDAgMTUwMDQ5MyA5MjQ5MjQgMTAxMTQzNiAzNzcwNDYgNDgyODc0IDE4Nzc0NSAxNjg1MzIgNjQwNTAgMTgwOTQzIDE0NzkxNyAxOTY4NzAgOTI0ODAgNTE1NDMgMjk1NzQgMzY5ODAgMzM3ODAgNTUzNTggMzQ0NDIgMzYwODgKKzExMSA0MiA4OCAyOSAzMiAyNiAxMTUgMTA1IDI3MSAxNDkgMzIzIDIxMSA3MDcgMjkzIDIzMiAyOCA0MSAxMyA0OSAzMCAyMSAxNiA2NCAxOCA2MyA0NCAxMDUgNTMgMzM0IDk1IDE2MCA0MCA3NCAzNSA0MSAzMyA0MCA2NyAxMTEgMjgKKzYyMjcgNjg4OCA1MjA1IDQzNDYgNDE3MiA1MTY5IDgwMjIgMTQwOTQgMTEwNDQgODA1MSA3NjY2IDkwNDEgMTI5MDcgMTQ0NjAgNDc3MiAxODk4IDg5MiA1MjkgNjE3IDUzNSA0NzEgNzA2IDc4MiA2NzMgMzQyIDQwNyAzMTEgMTU4IDI0NiAyMzcgMjgzIDIyMyAxNTAgNjUgNDkgNDkgNDQgODAgODIgNTgKKzQwNjc2ODIgODMzMjI1MiA0MDY1MjUxIDU5MjA5OTIgNDU3NTYyMSA3ODY1NDE0IDYxNTI5MTUgMTEwMTg0OTcgNDM4Mzk3NCA1MDA3MTU4IDIyOTAyNDEgNDIxOTQ2MiAyMjIwODcyIDU2MTI5OTQgMjM2OTQzMCAzMDgxNjkzIDEzNTE0MjkgMTMxMDM1NiA2NDYxNDUgODI2MDY3IDY4MzI5NCAxNDUzODQxIDkyMTgyNCA5OTIwOTkgMzc2Mzc2IDQ3ODkwNyAxOTEwMDggMTY4MTI3IDY4NzM5IDE4NDY0NyAxNTE0NTggMTk4NzU4IDk0MDA1IDUyNDQzIDMwMDg4IDM3NzcxIDM0MDYxIDU2OTUxIDM1Njc4IDM3NDg2CisxMDEgMzQgNzUgMjYgNDAgMjEgODIgODcgMjEzIDExNiAyOTUgMTcyIDU1OSAyMjUgMTUzIDE3IDE4IDcgMzUgMTYgMTggMTAgMjggMTggMjkgMjUgODIgMjcgMjE4IDUyIDEwMSA0MCA2OCAzMyA0MyAzMiAyOSA0MyA5NCA0NQorNjQ0OCA3MjM0IDU1MjggNDc4MyA1MTA1IDQ5ODEgNzc2NyAxMjQwNiA5NDAyIDc0NjcgNzYxMyA5MTc2IDEwNjMwIDEwOTIyIDM2NjQgMTE4NSA4MDcgNjE1IDM5NyA2NDEgNDY4IDc3MiA4OTggNjA4IDQyMiA0NjggMjkzIDEzNiAyMjkgMjkwIDM4MCAzMTIgMTEwIDQ3IDU0IDU5IDU1IDEwMCAxMDUgNDYKKzQxMzA5NjUgODI3Njc3NiA0MTA1MDc4IDU4NTk2MDIgNDU5MTg5NCA3Njk5NTI4IDYxOTc4NjEgMTExMTk2MDcgNDUxNDg3MyA1MTY1NDk0IDI0Mjc2NzYgNDUzMDA1NSAyNDM3MTYwIDU5NDcyNDggMjQwMzk0MiAyOTY5NjAyIDEzMzgzMjEgMTI2OTUyMSA2NDAxNjMgODE1ODg2IDY3ODE5OSAxNDE0MDQzIDkyMTc2NyA5Njk5MjkgMzc3NzY3IDQ3ODkyNiAxOTM3MjkgMTY2Mzk1IDcyODc2IDE5MTM4NSAxNTczOTAgMjA2MDAxIDk0NDcwIDUyMTg0IDMwNzE3IDM5MTI5IDM0NjE2IDU5Njc3IDM3NDcxIDM4MDYzCisxMDYgMzggODMgMzMgNTkgMjAgNzYgNjYgMTY3IDk4IDI3NiAxNjAgNDA4IDE0MSAxMDAgNyAxNSAxMCAxNSAyNCAxOCAxMiAzNyAxNSA0NCAzNCA3MiAyMSAxODcgNzIgMTUxIDcyIDM2IDE3IDUxIDQ0IDQ1IDYzIDEzMSAyNworNjQ2NyA3NTE0IDU5MjMgNTAzOSA1NDU2IDU5OTUgODcwOCAxMzQ2NSA4MzY2IDY2NTQgODEwNyA5NDI4IDg4MjEgODQzMiAzMDg1IDEzNzggNDE0IDQzOCAyMTEgNTEwIDUyOCA1MzAgNTI2IDUzNCAzNzIgMzYyIDI1OSAxMjAgMjA2IDI5OCA0MjIgMjUzIDk1IDQzIDQ1IDQ3IDQ2IDExMCA5NyA0NQorNDE5MzE1NCA4MjQxODMxIDQxNTQwMDggNTgxNzYyMyA0NjE2NzMzIDc2MDU4OTIgNjI2NTczOSAxMTI3OTcxMyA0NjE2MDIyIDUyNjQzODIgMjU3NDMwOCA0ODM3NDk1IDI2MDE4MDcgNjEwODQ2OCAyNDIyNzkxIDI4NzYwOTQgMTMxNTQ5NCAxMjIwMjYyIDYyOTU3NiA3OTgyNjcgNjc0NzY1IDEzNjE3NjUgOTEyMjAyIDk0NDU0MyAzNzc4NDUgNDcyNDMxIDE5NTUxMyAxNjM3ODQgNzYzMjIgMTk4MjEwIDE2NDI0OCAyMDkxODUgOTQ1NDAgNTE2OTQgMzExMDAgMzk2NjggMzQ5MjcgNjI4NTQgMzkwMTUgMzg1NDQKKzEwNCA0MiA5MiAzNiA2NyAzMCA5MSA3NyAxMzggNzggMjc4IDE1NCAzMDQgOTAgNzMgMTAgNCA1IDQgMTUgMjQgNiAxMiAxMiAzNCAyMCA1NSAxNiAxNTQgNzEgMTY2IDQ2IDI3IDE0IDM1IDI3IDMxIDcwIDExMSAyNgorNjAzMiA2ODI4IDU3MjggNTIxOSA1NzQyIDY0NTkgOTUwOSAxNTcyNSA4NjExIDU5OTkgODIwMiAxMDE2NCA3NDY0IDY1NTUgMjc5MSAxODQ4IDEwMDEgMzk3IDMzNCA3MDMgNjk2IDQzMCA3NDYgODY2IDQzMiAzMjQgMjM0IDE0MyAxNjAgMjMwIDQ0MSAyODYgMTIzIDU0IDQ0IDQwIDQwIDEyNSA4MiA2MQorNDI0MjY3MSA4MTY2ODM2IDQxOTY3MzEgNTc4OTIyMiA0NjQ4MjYzIDc1NDYzODEgNjM1MjM5OCAxMTU2OTA2MiA0NzIwOTA5IDUzMTcwOTUgMjcxOTcwOCA1MTcxNzA3IDI3Mjc2NTUgNjE0NDY5NyAyNDMzNjU0IDI4MTcwNzEgMTMwODI0MiAxMTcxNDM5IDYyMjM5NyA3OTM1NjMgNjc1NzEyIDEzMDY0ODAgOTA4NDk5IDk0MTA3NyAzNzk0NTUgNDYzOTkyIDE5NjYxMyAxNjI3NDIgNzg1MDYgMjAwNDQ4IDE3MTQyMCAyMTQyMDUgOTUzMjQgNTE5MTAgMzE0NDggMzk3NDUgMzUwNzcgNjY3NjIgNDAxMzcgMzk5NzkKKzkyIDM1IDg1IDQwIDczIDM2IDEwMyA5NyAxMzkgNjMgMjY0IDE1NiAyMzQgNTYgNjAgMTkgMjUgNCAxMSAzMCA0MSA0IDI2IDMzIDQ2IDE3IDQ0IDI0IDEwMSA0MSAxNjcgNTYgNDQgMjMgMzMgMTkgMjMgODIgODAgNDUKKzYxNDYgNzE2OCA2MjQ1IDU1NzYgNTYyOCA2Mzk1IDg5NzAgMTQ1MzkgNzUxMiA0ODI2IDcwMjAgODI4MyA1ODQzIDU0MzMgMjY1OSAxOTUzIDEyNDAgNTU5IDQ4NSA3MTUgNjc0IDQ0NSA1NTMgNzM2IDQxNiA0MDIgMjkyIDIzOSAxMTEgMjcwIDQ4OSAzMzcgMTY2IDM2IDIzIDI3IDMxIDEyMiA1OSAzNAorNDI5Mzg2NiA4MTE3MjI5IDQyNTE2MDQgNTc4NDQ1OCA0Njc2MDkyIDc0ODY1MDkgNjQyMzExNiAxMTc2ODE4NiA0Nzk1MDg0IDUyOTQ1NzkgMjgzMTI2MyA1MzcwMzA0IDI4MDg5MjUgNjEwOTgyMCAyNDQwODcyIDI3NjgwNDEgMTMwNzI4MSAxMTM1NDk5IDYxOTI1NyA3ODk4NzggNjc2MDczIDEyNTU0MzQgODk5OTU1IDkyOTgzMiAzODA2MTYgNDYwODUxIDE5OTE2OSAxNjc2NjEgNzkzODMgMjA1MDA5IDE3OTY0MCAyMjIwNTcgOTcxODcgNTEwMDcgMzEyNTAgMzkwMTkgMzQ5OTMgNzAyNTEgNDA2NDMgMzk2NjkKKzkzIDM4IDk3IDQ2IDcwIDM1IDkxIDgxIDExMiA0MSAyMDUgMTA5IDE2MiAzOCA1NCAyMyAzOCAxMCAyMyAzMiAzOSA1IDE0IDI0IDQyIDI3IDY4IDYzIDUwIDU1IDE4MSA3MiA3OCAxMCA5IDkgMTQgNzQgNDEgMTQKKzYyMjggNzQ0NiA2NDEwIDU0NjMgNTUzMiA2NDA1IDczMDQgOTg1NCA0NjE4IDM5OTggNDkyNCA1OTExIDQ5NDEgNDI4OSAyMTEwIDExOTEgODAwIDU0OCA0NjkgNTg5IDYxMiA1MDcgNDk4IDU4MSAyNDYgMzQxIDM0MyAyNzggODEgMTU4IDQyMSAzMjIgMTY1IDM5IDI2IDI4IDMyIDgzIDQwIDI5Cis0MzQ1ODc5IDgwODc2NzggNDMwOTMyNSA1NzczMDM3IDQ3MDA3NzIgNzQzMDg0MyA2NDQ5NDgxIDExNjY3NTI4IDQ3OTM0MzAgNTIyMjU0NCAyODg2NDU0IDU0MTEyNTUgMjg2NTEwOSA2MDA2NzUxIDI0MzM4NzYgMjY3NTEzNyAxMjk1MDk2IDExMDEwMzkgNjE1Nzg3IDc3ODY3MyA2NzQ4NDAgMTIxMTI1OSA4OTAyMTkgOTA5NzM5IDM3NzQwMiA0NTQxNTEgMjAyOTY1IDE3NDY4MSA3OTQ3MSAyMDI0MTYgMTg1OTE3IDIyODUxNiA5ODk3OCA1MDM0MiAzMTEzNCAzODM5OCAzNDkzNyA3MTEzNSA0MDY1MCAzOTA3MAorOTQgNDEgMTAwIDQ0IDY3IDM2IDYyIDM3IDQ1IDI4IDEyMSA1OCAxMjQgMjUgMzQgOSAxNiAxMCAyMiAyMiAzMiA3IDEyIDE1IDE1IDIwIDg4IDc5IDI2IDE5IDE0MCA2MyA3NCAxMiAxMSAxMCAxNSAzMyAxOSAxMAorNTk0NiA2Nzg3IDU3MjcgNDg5OCA0ODk0IDQ3NDQgNDU2NSA1NDg0IDI0MDEgMjI4MyAzNDc4IDQ0ODYgMzkwMCAyOTg2IDEwMTEgNzkyIDcyMSA1OTYgMzM3IDQ2NyA0OTggMzc5IDI3OCA1NzAgMjQ2IDI0NCAyMzggMTQ3IDM3IDE0OSAzNTAgMjQwIDg1IDQxIDI4IDE4IDMzIDg0IDU2IDI4Cis0Mzg5Mzg1IDgwMTk0MTMgNDM0ODE0NiA1NzI3NTg5IDQ3MDg1MjcgNzI3NjQ3MCA2NDA1MTcyIDExMzA0NDI4IDQ3MzUxNDUgNTA0OTQ2NSAyOTAzMzA0IDUzNjIyMDEgMjg5MzI3OSA1ODI5ODEyIDIzOTg5NjEgMjU2MzI5MyAxMjgxMTk2IDEwNzE1OTYgNjA5MDI5IDc2MDY0NSA2NzA3MjMgMTE2MTg3MSA4NzUxMDIgODkwMTc2IDM3NDI2OSA0NDE4OTMgMjAzOTgyIDE3MzIzMSA3ODQzMiAxOTk0MjUgMTkwMjIyIDIyOTU1MCA5ODY3OSA0OTg0MCAzMTA3MiAzNzIwMCAzNDkwOCA3MjAyNyA0MTA2NiAzODQ0NgorODUgMzYgODEgMzUgNTIgMjAgMjUgMTIgMTIgMTAgNjUgMzQgODIgMTIgOCA0IDEzIDEyIDExIDE0IDIxIDQgMyAxNSAxNSAxMCA0MyAyMiA1IDE3IDEwMSAzNCAyMCAxNCAxMyA0IDE2IDMzIDM2IDEwCis1NjQ4IDU4MTAgNDA1MiAyNzMzIDIyOTAgMTM4MCAxOTc3IDM0NjAgMTIxNiA3NDcgMTA5MiAxNTk3IDIxMDMgMTQxNCA0OTQgNzMxIDQ2MCAyNDUgMzA2IDM1MiAzOTAgODEwIDYxNSA1MDUgMjE4IDEyOSAxMjggNDIgNDAgNjkgMjM1IDE3MiA1NyAxOCAxNyAxOCAyMyA0MCAzMCAxNworNDQyNDE4OCA3ODk1MjE5IDQzNDMxODAgNTU1MTg1NiA0NjQ5NTI0IDY5MjQ2ODMgNjI5NTgxNCAxMDgzODc2MyA0NjQ4MDIzIDQ3OTI0MDMgMjg1ODc0MSA1MTM4NTk3IDI4NzQ4MTAgNTU2NjkxMCAyMzUxNzAyIDI0NTQ0MTIgMTI2MDk3MSAxMDIyMzU1IDYwMTY0NyA3MzY2MzQgNjYzOTQ4IDExNDE5MjUgODY4OTc3IDg2Nzc5MyAzNzA0OTggNDIzMzA1IDIwMjE2MSAxNjU0MTcgNzc0OTYgMTkxNjk5IDE5MTQ4MCAyMjYzNDQgOTc2NzIgNDc5NTUgMzA3MzAgMzYwNzMgMzQ2MjQgNzAxNjMgNDA4MDcgMzcxODMKKzc2IDI2IDQxIDExIDExIDEgNCA1IDMgMSA2IDQgMjQgMyAyIDQgNSAyIDEwIDkgMTMgMjEgMTkgMTMgMTIgMyAxMiAyIDYgNCA0NyAxOCA5IDIgNSA0IDcgOCAxMCAzCis2MDA4IDY3OTggMzg3MCAyNDI0IDE5NjYgMTE0NyAxNTE2IDMyMzEgMTQ5NSA2MTUgMzk5IDExMzMgMTczMiAxMDcxIDMwMyA0MDIgMzYxIDI0OCAyOTggMzQ2IDMxNSA0MTcgMzE4IDQ3MCAxNjAgNzMgODIgMzkgMjEgMzAgMTMxIDEwOCAyNyAxMSAxNCAxNCAxOCAyMiAxNiAxMgorNDQ2NzMyNCA3ODM5MTc3IDQzMzM2ODYgNTM2NzY4MiA0NTgzNzEyIDY1Nzk2ODcgNjE3NzQwMSAxMDM4Njk2OCA0NTcwMjA4IDQ1NDI2NTQgMjc5NzU3NiA0ODk5OTAyIDI4NDczMTkgNTI5ODcwOCAyMzAwNzQxIDIzMzE4NTEgMTIzODcyMCA5NzYyNTIgNTk0MjQ1IDcxMzY5NSA2NTU0MjUgMTA5OTAzMSA4NTU0MTMgODQ0NjAzIDM2NTMzOSA0MDIzOTIgMTk5MjEwIDE1Nzg4OCA3NjA5OCAxODIwNDAgMTkwMDQ4IDIxOTM5OSA5NTkyMyA0NTc1MyAzMDMyMCAzNDc2OCAzNDIxOSA2NzMwNSA0MDE5NyAzNTY4OQorODUgMzcgMzcgMTAgOCAxIDIgNSA1IDAgMCAyIDE3IDIgMCAxIDMgMiA5IDkgOSA1IDUgMTIgNiAxIDUgMSAxIDAgMTUgNyAyIDEgMyAyIDQgMiAzIDIKKzU2MDIgNjY5OSAzNzQ1IDMwNTMgMjM1MSAxNTg0IDEzNzEgMjgwMyAxNjQ2IDg4NyA1NTIgNzgzIDEzNzEgOTIyIDMzOCAyNTAgMzY5IDI2MiAxNjYgMTgyIDI5MCAzMDcgMjcyIDQ1MSAxMzggNjYgODMgMzEgMTUgMjYgMTIyIDg4IDMxIDkgMTQgMTEgMTMgMTQgMTAgMTAKKzQ0OTkwMDUgNzc4MDQxNSA0MzIxMjM0IDUyMzMyMDIgNDUyOTM4NCA2MjgyMjM4IDYwNTgyMzggOTkzNTk4NCA0NDk4MTk2IDQzMjQ2MDAgMjc0MTg0OSA0NjU0MDI1IDI4MTEyODYgNTAzNzQ0MyAyMjUxOTQ2IDIyMDczMDUgMTIxNzIyOSA5MzM3NzUgNTgzNjU0IDY4MjA1NiA2NDY0NzYgMTA1MTk1MyA4NDEwMTIgODIxNjM3IDM1OTc0NiAzODIzMDQgMTk2MzU4IDE1MDMxOSA3NDU4MSAxNzI3MTUgMTg4NDIyIDIxMTY0MiA5NDMyMCA0MzU2MCAyOTkyMCAzMzM1NyAzMzY5NyA2NDEyNiAzOTQ0OSAzNDE2MgorNzQgMzYgMzYgMTYgMTIgMyAyIDQgNiAxIDEgMSAxMSAxIDEgMCAzIDMgMyAyIDcgMyA0IDExIDUgMSA1IDEgMSAwIDEzIDUgMiAwIDMgMSAyIDEgMSAxCis1MzM4IDY1MzIgMzkzMSAzNjAwIDI5MTAgMjE0NCAxMzc0IDE1NDIgMTg2MiAxMjYzIDU0OSA1NDYgOTIwIDEwNDEgNDM5IDMyMyAyMjIgMTI2IDExMCAxNTIgMzA1IDMwOCAzMDAgMzMwIDExOCAzMyAyOCAxNSAxNCAxMCAzMSAzMSAyMCAxNSAxNiAxNSAxOCAxNSAxMyAxNAorNDUyMzE0NyA3NzE0OTE4IDQzMTM4NDcgNTE0MDM5NyA0NDkwNzAyIDYwMzcwNDEgNTk0MjEyNiA5NDM0NTg1IDQ0MzM1MDMgNDE0MjczMCAyNjg3NDM2IDQ0MDgzMzkgMjc2NDYyNCA0Nzk5MTY1IDIyMDY5NTEgMjA5NDcxNiAxMTkyNTE3IDg4NTQ5MSA1NzE4OTUgNjUwNDcyIDYzODEzNCAxMDA3NzYxIDgyNzY4NiA3OTI2MTUgMzUzNzgxIDM2MTM5NCAxOTIxNzEgMTQyMjIxIDczMDc3IDE2Mjk2NiAxODQ1MTAgMjAwODQ4IDkyNDc2IDQxODY4IDI5NTgyIDMyMjc3IDMzMzE1IDYxMjAwIDM4Nzk2IDMyOTcyCis2NyAzNSAzOSAyNCAyMCA2IDIgMSA4IDQgMSAwIDUgMiAxIDEgMSAwIDEgMiA4IDMgNSA2IDMgMCAwIDAgMCAwIDAgMCAxIDIgNCAzIDUgMSAyIDMKKzU1MjUgNjUwMCAzOTcyIDMzMTkgMjgyMSAyMjI0IDE1ODQgNzQ3IDE2ODggMTIxOSA0OTUgNTcyIDYyMiA3MjggNzExIDMzMSAyNDYgOTEgOTggMjA1IDE2MyAxOTUgMjAzIDMxNSA4MCAyMCAxOSA5IDkgOSA1OSA1MyAyNCAxMyAxMyAxNCAxNSA5IDExIDEwCis0NTUxNDY2IDc2NTEzODUgNDMwNzY5MyA1MDM1ODk2IDQ0NTA3MTAgNTgxMTQ3MCA1ODM0MjgxIDg5MTQ0MjYgNDM2NTk3NyAzOTY5MDY4IDI2MzMwMDEgNDE3ODk5MSAyNzExNTA5IDQ1NTU5NTMgMjE3MDAzMiAxOTg5MzczIDExNjkwMzYgODM3OTU0IDU2MDEyMyA2MjQwMzkgNjI2MzcwIDk1OTI3OCA4MTIyMTMgNzY0NDEyIDM0Njk5NCAzNDA5MzkgMTg3ODU5IDEzNDI0MSA3MTQ4MiAxNTM3NDEgMTgxNDEyIDE5MjA1MyA5MDc4MCA0MDE1NCAyOTE3NSAzMTIwMCAzMjg2NiA1ODA4MSAzODEwOCAzMTYwOAorNzAgMzUgNDAgMjEgMTkgNyAzIDAgNyA0IDEgMCAyIDEgNCAxIDEgMCAxIDQgMiAxIDIgNiAxIDAgMCAwIDAgMCAzIDIgMSAyIDMgMyAzIDAgMSAxCis1NTE2IDYzMzQgMzk5MiAzNzAwIDI5OTEgMTkxNyAxNTYzIDkwNiAxNDQ3IDEwNTIgNjQ5IDgzOSA1NDMgNzEyIDk2MSAyOTkgMTYyIDExNiAxNTEgMTU3IDEwMSAxMjggMTQ5IDIzMiAyNiAzNCAzOCAxMiA4IDEwIDMwIDM2IDIzIDEwIDEzIDE1IDEyIDEzIDE0IDkKKzQ1Nzg4NDggNzU4MTQ2NSA0MzAyMjAzIDQ5NjEwNzMgNDQxNjA2MiA1NTgwNTcxIDU3Mjg1OTEgODQzNTI0NCA0MjkzOTc2IDM3OTU1NjUgMjU4Mzg2MiAzOTc5ODA3IDI2NTc3MDEgNDMyNjM1MCAyMTQwNDI2IDE4ODgzODUgMTE0Mzk5NCA3OTQ4MDUgNTUwMDAwIDU5NjI0MyA2MTMzMTUgOTA5NTg3IDc5NTc0NiA3MzI4MDIgMzM4OTk2IDMyMjU3MiAxODQxNDAgMTI2OTI0IDY5OTAyIDE0NTEzMSAxNzc2NTAgMTgyNzQyIDg5MTAxIDM4MzU5IDI4Nzc5IDMwMjQ5IDMyMzUyIDU1Mzk0IDM3NTE0IDMwMjY0Cis3MCAzNCA0MCAyNyAyMiA1IDMgMCA1IDMgMiAyIDEgMSA4IDEgMCAwIDIgMiAxIDAgMSAzIDAgMCAxIDAgMCAwIDAgMSAxIDEgMyA0IDIgMSAyIDEKKzUyNDggNjE1OSA0ODIzIDU0ODQgNjY4NiA2MTM1IDM0MjMgMTQ4NyAxNjE0IDg1OSA2ODUgNzMxIDU1NiAxMDg2IDEzMTkgODY5IDQyMiAxMzYgODQgMTQwIDkxIDE2OCAyMzkgMjk2IDYzIDE0MyAxMzUgMjEgOSAxMSAzNCA0MyAzMyAyMiAxNSAxNiAxNSAxNiAyMCAyMAorNDU5ODY5NiA3NTA0OTg5IDQzMTgwOTMgNTAwMDM0MyA0NDc2NzMzIDU2MjI2NjkgNTY3MzA4NiA4MDIwNTA3IDQyMjgwNDEgMzYyMDYxNSAyNTM2ODcwIDM3ODU5MzkgMjYwNTU2OCA0MTMzNTAwIDIxMjA3MTAgMTgyODQ3NSAxMTI2MjIzIDc1NTQ3NCA1Mzg0MTcgNTY5MDcxIDYwMDMzMCA4NjUzMzUgNzgxOTkwIDcwNzAyMSAzMzIxNDMgMzEyMDA0IDE4Mjk5NCAxMjA1OTkgNjgzODcgMTM3MDk5IDE3NDA4NCAxNzQ0MTkgODc3MjAgMzc0MDkgMjg0NDQgMjk0MTcgMzE5MjcgNTMwNTMgMzcwODggMjk2NzYKKzYyIDMyIDU5IDU5IDEwMiA1OCAxNyAxIDYgMiAzIDEgMiAzIDE3IDkgNSAxIDAgMiAwIDEgMyA2IDEgNyAxNyAwIDAgMCAxIDEgMyA2IDQgNCAzIDEgNSA3Cis1Nzc3IDY4MDAgNTU4MiA2ODY4IDEwNDk0IDkzOTAgNjkwNiAzNDIxIDIyMDcgMTQ0OSAxNTc2IDE2NTQgODE1IDkwNyAxMzkwIDE3MTAgODEwIDQ4MCAyOTYgMzU0IDIxNSA0MzggODI1IDgyMSAyMTQgNDgzIDM4MyAyMyAxOCAxOCA5NyAxMTMgODEgMjggMjQgMjQgMjYgMjggMzEgMjgKKzQ2MzE1NzEgNzQ3MjQ4MiA0MzUyOTg4IDUxMjIyODcgNDYzMzIzMSA1ODYyMjIwIDU3MDgwMDEgNzc0OTQ3MyA0MTc4OTExIDM0OTI0MDkgMjUxMzgyNyAzNjYwNDA5IDI1NjEzNTcgMzk0MTIyMyAyMTAzMzAxIDE4MjM4MjkgMTExODgxNCA3Mzk2MzcgNTMyNTQyIDU1NjY3NyA1OTA4MzkgODQwMzI2IDc4MzU1NyA3MTUwNDEgMzI5MzIxIDMyMjk1OCAxODgyMTYgMTE0Nzc2IDY3MTM5IDEyOTk3OSAxNzIyMTcgMTcwODk2IDg3NjAwIDM2ODg0IDI4MzQ3IDI5MTI2IDMxNzk0IDUxNTkwIDM2OTU0IDI5NjE1Cis3NSA0MCA3NyA4NiAxODcgMTE3IDcyIDkgMTIgNyAxOCA5IDQgMiAxOSAzNiAyMSAxNiAxMSAxNSA1IDEwIDQzIDUyIDE1IDc4IDExOSAxIDEgMCAxMCAxMyAyMiAxMCAxMSAxMCAxMSA2IDEzIDE0Cis2MjQzIDczMjEgNTk4NSA3MzMwIDExMjM1IDg4MzkgODI3OCA0NDg2IDIzMTkgMTc1OCAxNzQ4IDE4NTMgMTQyMSAxNjk5IDE4NzQgMTU5NiA3NjAgNTAxIDMzNiAzMTAgMjY0IDYyMyAxMDU0IDc5OCA0NzMgNzAyIDQwOSAzMCAyNiAxMiAxMDggMTM0IDExNyAzNiAyOSAyOSAyNyAyOCAyNiAyOQorNDY3NTUzOCA3NDczOTM1IDQzOTczMTQgNTI2NTI5OSA0ODA0NzY0IDYwNTM1NDcgNTc3NzExNiA3NTYwMTMyIDQxMzM4NzAgMzM5MDg4MCAyNDk1NzU2IDM1NTQ2MzcgMjUzMzc0MSAzODA5MTQxIDIwOTg2OTkgMTgxMjQ1NyAxMTEwMzEyIDcyNjA0MCA1Mjc4MzYgNTQyMzIzIDU4MjgzOCA4MjgxODQgNzkwOTM5IDcyMTE2NyAzMzMxOTEgMzQ2NzEwIDE5Mzk3MiAxMDk3MzIgNjYxMjcgMTIyOTE3IDE3MDY3OCAxNjg4NzUgODg0MDQgMzY4ODIgMjgzODAgMjkxNjAgMzE2OTAgNTAyMTQgMzY2OTYgMjk2MTkKKzg1IDQ2IDg2IDkzIDE5NiAxMDAgOTcgMTcgMTQgMTIgMjIgMTIgMTQgOSAzNSAzMiAxOSAxOCAxNSAxMiA3IDIyIDY5IDQ4IDcxIDEyOSAxMjYgMiAzIDAgMTIgMTkgNDYgMTcgMTYgMTUgMTIgNiA5IDE1Cis1NzM4IDYzMDEgNTM3NiA3MTE0IDkwNDMgNzI0OSA2NTU0IDMzNDcgMTYxNiAxMzU5IDE1NDIgMTQzNyAxMzgwIDIxNTUgMTU1NSA4NjMgNTYwIDI3NSAyMzEgMTk4IDIwMiA0NDEgNjcxIDY5OSA0NTcgNDgwIDE4NiAyMiAyMCAxNyA3MCA4NiA4NSAyMCAyMCAyNyAyOSAyNyAyNyAyOAorNDcwNTQ5OCA3NDEyNjM0IDQ0MjQ5NjYgNTM4NjQ2MCA0OTE1OTgyIDYxMzU3MDkgNTgwMDQzNiA3MzEyMTczIDQwNzE5ODMgMzI3MDkyOSAyNDcyODcwIDM0Mjk2NTMgMjUwNTc2NiAzNzEyOTk5IDIwODYwNTggMTc1NjczNCAxMDk2OTA5IDY5OTM3NCA1MjA1NjQgNTIxOTQ5IDU3MzQ1MiA4MDU1ODggNzg4MzQ2IDcyMDg0MyAzMzY1NTUgMzU1Mzk4IDE5Mzg4NCAxMDQ0OTkgNjQ5ODcgMTE2NTg2IDE2ODIwNiAxNjQwMjYgODgzNjkgMzU4OTcgMjgxODIgMjkwNjkgMzE2NDAgNDg4NjAgMzY0NzAgMjk1NjIKKzcxIDM1IDY5IDg1IDE0MSA2OCA2MiAxMCA3IDcgMTcgNyAxNCAxNSAyNCAxMCAxMCA2IDcgNSA0IDExIDI4IDM3IDY1IDY1IDI5IDEgMiAwIDUgOCAyNCA1IDcgMTMgMTQgNiAxMCAxNAorNDU5NCAzOTI4IDM0MzMgNjM3NiA1OTM5IDQ3ODMgMjU4MSA2MzYgOTUzIDg4MiAxMTM2IDEzOTIgMTIwNyAxNDAxIDgyNCA0MzQgMTE3IDk5IDEzNCA3OSA3NSAxOTggMzA4IDIzMiAyMDUgMTY0IDY1IDkgNyAxMyAzOSA0MSA0NCAxMyAxNyAxNyAxOCAyMiAxNyAxMworNDcwNTQ2NiA3MjA5MjIwIDQ0MDIyNTkgNTQ1NTAxMSA0OTQ1MDc4IDYwNjE0MzcgNTcyMTYxNCA2OTEyNTM0IDM5OTQ2OTMgMzEyODg2OSAyNDQwMTc3IDMzMDk0MDMgMjQ3NDA2NyAzNTc2MzAyIDIwNTUwNDYgMTY3Nzk5OCAxMDcyNTE3IDY2MzQ5NSA1MTA5OTQgNDk1NDg2IDU2MTA1MyA3Njk0MTkgNzc2NTM5IDY5MTg0NyAzMzMzOTMgMzQ0MTUwIDE5MDcwNSA5ODc4MiA2MzU0MyAxMTAzODkgMTY1MDAzIDE1NjcwMyA4NzI4NyAzNDU0MSAyNzkxMyAyODM2OSAzMTMxMCA0NzI4MCAzNTk5NCAyODU4NworNDYgMTQgMjkgNjggNzAgMzAgMTAgMCAyIDMgOSA4IDEwIDYgNiAyIDAgMCAyIDAgMCAyIDYgNCAxMyA4IDMgMCAwIDAgMSAyIDYgMiA1IDUgNSA0IDQgMworNDQyMSAzMDU5IDIwMjkgNTA1NCA1MTA2IDMxMjYgMjUxOSAxNzEyIDYyNyA1MjYgNTEzIDUzNiA2OTcgNzg5IDgyNiAxOTggODQgNjUgNTUgMzAgMjYgOTEgMjU2IDE3MSA3MSA1OCAyNCAxNyAxMSAxMSAyMCAzOCAzMCAxMyAxMyAxOSAxNCAxNyAxMiAxNAorNDcwMTAxMyA2OTY0NjIxIDQzNDQyMzAgNTQzODIyOCA0OTUyMTU0IDU4ODk4MTkgNTY0MzE3NSA2NjAyOTc5IDM5MTA5OTkgMjk3MzQ2MCAyMzkyMzc1IDMxNDM3NzcgMjQzMDEyMiAzNDEwMjA2IDIwMjQ4NTkgMTU4OTQ4NiAxMDQ3ODkwIDYyNzY4MCA0OTk2NDMgNDY3NjAxIDU0NzcxMSA3Mjg4NDYgNzYzNjk3IDY2MDg0MyAzMjY4ODUgMzI3MDY1IDE4NjU1NyA5Mzg5OSA2MjIzNyAxMDQ0NDEgMTYxMzk1IDE0OTYzNSA4NTg3NCAzMzI2NyAyNzU0OCAyNzgzNCAzMDg4NiA0NTQ4NyAzNTQwMiAyNzczMQorNDIgOSAxMCA0MiA1MiAxMyA5IDMgMSAxIDIgMSAzIDIgNyAwIDAgMCAwIDAgMCAwIDQgMiAxIDEgMCAwIDAgMCAwIDEgMyAyIDMgNyAzIDIgMiAzCis1MDA2IDMzNjEgMTEzOCAxOTkyIDE2NzYgMTU3NSAxMTM4IDg1NCAzMTIgMjEzIDQ0MiA0NTcgMzc1IDQyOCA0NDIgMTk4IDYyIDM2IDMyIDIxIDM3IDU5IDEyNyA4NCA0NSA0MiAxOSAxNCAxMSAxMSAxMSAyMSAyMCA5IDE0IDE3IDE0IDggOSAxMQorNDcxMTYyNSA2NzUzMjUyIDQyNjQ4NzMgNTIzNDMzMSA0ODcxMzc0IDU2MzMyMDggNTUzMTM5MiA2MjU5Mjg0IDM4MjEzNDIgMjgwODE0NSAyMzQzOTUxIDI5ODMyMzQgMjM3OTA0MyAzMjMxODk3IDE5ODU2MTAgMTUwNjI4NSAxMDIzMzE1IDU5MjIzMiA0ODc5ODggNDQwODM2IDUzNDk4NCA2ODg3NDEgNzQ3ODc4IDYyNjM1NCAzMTk4NzUgMzEwMDIyIDE4MjM4NSA4OTEyNSA2MDk2NCA5ODg1MCAxNTc2NDcgMTQxOTQ3IDg0MjQxIDMxODIzIDI3MjE4IDI3MjA4IDMwNDcyIDQzMjQ5IDM0NzQ4IDI2NzQzCis1NCAxMiAzIDcgNSAzIDIgMCAwIDAgMSAxIDEgMCAyIDAgMCAwIDAgMCAwIDAgMSAwIDAgMCAwIDAgMCAwIDAgMCAxIDEgNCA2IDMgMCAxIDIKKzQ4NjcgMzUyNCA4NTEgNzUyIDY0NyAxMzM1IDE3NzMgODYwIDMyNiAyMzUgMzEzIDI5NCAyMjIgMzE5IDIzMCAxMjIgNjEgNDIgMjAgMjUgMjUgNDcgMTA4IDgyIDI0IDM5IDE3IDE3IDE3IDggOCAyMCAyOSAxMyA5IDEyIDE2IDEwIDEyIDExCis0NzE4NDE5IDY1NjQ1NzkgNDE4MDE2MSA0OTY2NDg0IDQ3NjYzMDYgNTM3NzI0OCA1NDM4NjMyIDU5MzY1NzggMzczNDI4MSAyNjU0MTAwIDIyOTM0MzkgMjgyMjMwOSAyMzI1MzI4IDMwNTc1ODkgMTk0MTkyMSAxNDIzNDA2IDk5OTMyOCA1NTkyNzkgNDc2MzE3IDQxNTkyMiA1MjIyNjggNjUwMzA1IDczMTk2OSA1OTM4MTIgMzEyNTAzIDI5MzgxNyAxNzgyNjYgODQ4MjIgNTk4NzYgOTM0MTAgMTUzOTE2IDEzNDY1OSA4Mjg3OSAzMDcxMiAyNjc2OCAyNjMxMiAzMDEyMCA0MTI2OCAzNDE4NyAyNTgxNAorNTEgMTQgMSAxIDAgMyA1IDEgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAxIDEgMCAwIDAgMyAyIDEgMyA0IDEgMiAyCiszNjMwIDI3MDQgMTExOCA2NjIgMTI0OCAxOTk1IDEwNDkgNjcwIDQyNCAzMjMgMzI3IDI3OSAzMjcgMzQ5IDI2MSAxNzEgNzMgNjkgMjIgMjMgMzIgNTMgOTEgNjUgMjkgNDMgMjEgMjQgMTMgMTUgMjAgMTUgMTkgMjEgMTcgMTIgMTQgMTIgMTIgMTYKKzQ2OTM0MjMgNjMzNjg0NyA0MTA0Mzg4IDQ3MDkxNzggNDY3OTIyNCA1MTc3MTk0IDUzMjk2ODAgNTYyMTU2MCAzNjUxODk5IDI1MTQ3MDQgMjI0NDU0NSAyNjcwMTE4IDIyNzU2MzggMjg5NTU4MiAxOTAwMTE1IDEzNDg1MTAgOTc2MjQ3IDUyOTk2MiA0NjQ5ODggMzkyMzgwIDUxMDA0OCA2MTQ1NDQgNzE2MDIyIDU2MjE3OCAzMDU0NDMgMjc4ODMwIDE3NDM1MiA4MTIwNyA1ODcxMyA4ODcyNyAxNTA1ODQgMTI3NTAxIDgxMjk1IDMwMTU5IDI2NTM0IDI1NDcwIDI5NzI1IDM5NTI5IDMzNjQwIDI1MjQ4CisyOCA4IDMgMCAzIDcgMSAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMiAxIDAgMCAwIDEgNyA2IDMgMyAxIDIgNQorMjU1MCAxODQwIDk1NSA4NDAgMTE2OSA3NjQgNzk0IDQ2OSAzMjIgMzM3IDI3MiAzNTEgMzQ4IDM1MSAyMDggMTczIDQ4IDUwIDI5IDEzIDMzIDQ4IDg4IDUwIDQ2IDU2IDM2IDI5IDIyIDI1IDI5IDMxIDE3IDE3IDI4IDE1IDE4IDE2IDE3IDE1Cis0NjQxNDQzIDYwNjk2OTYgNDAyNjM0MCA0NDc4MjQ2IDQ1OTIyOTcgNDkxMzUxMyA1MjE2OTI5IDUzMTMwOTQgMzU2ODk2NiAyMzg0NTMyIDIxOTU0NjYgMjUzMTQ4MiAyMjI3NzI2IDI3NDM0MTggMTg1Nzk5OCAxMjc4MjMxIDk1MzEwMyA1MDEyMzcgNDU0MTIxIDM2OTYzNiA0OTgxNTkgNTgwNjIxIDcwMDM5NyA1MzE1MjAgMjk4OTkzIDI2NTU0MSAxNzA5MTkgNzgxMTYgNTc4MDkgODQ5MzkgMTQ3NTY2IDEyMTc1NSA3OTcwMCAyOTM5MyAyNjU4NyAyNDg2MyAyOTQ0MyAzODE0MCAzMzIzNCAyNDY1NAorMTQgNCAyIDEgMyAxIDEgMCAwIDAgMCAwIDEgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMSAxIDMgMyAyIDEgMSAxIDUgMTYgNSA2IDMgNCA1CisyMDc4IDE2NTYgOTY5IDM5OSA0NjkgNjE2IDczMyA0NjQgMjU1IDIzNiAyMDggMjcwIDIwMiAzNzcgMzgyIDE4MiA3NCA5MiA0MyAxNSAyMSA0MSA2NyA1NCA1NCA0OSA0NCA4NCAyOSAxNyA0MSAzMiAyMiAyOSAzMyAxNiAxMyAzMiAyMyAxOAorNDU3ODY5NSA1ODA3MjY5IDM5NTA1OTkgNDIzNDA3NSA0NDg5NjQ2IDQ2NTY1NTkgNTEwNTQzNCA1MDIyODI4IDM0ODYzOTAgMjI1NTk2NSAyMTQ1OTc2IDIzOTYxODcgMjE3NzI3OCAyNjAxOTgxIDE4MjEzODAgMTIxMjcyMSA5MzEyMDEgNDc2ODE2IDQ0Mzg4MyAzNDgzODAgNDg2MjYwIDU0ODMwNCA2ODQ2MjUgNTAyOTQ3IDI5MjkwOSAyNTI2MTkgMTY3Nzc3IDc4NTg5IDU3MTA3IDgwODg3IDE0NDkzMCAxMTY0MTUgNzgyNzIgMjk0MTEgMjY3NjYgMjQzNTQgMjkwNDAgMzc4MTcgMzI5OTIgMjQyODAKKzEwIDMgMiAwIDAgMCAxIDAgMCAwIDAgMCAwIDAgMSAwIDAgMSAwIDAgMCAwIDAgMCAxIDEgMiAyOSA1IDEgMiAyIDIgMTUgMjMgNiAzIDEzIDggNworMTc1NiAxNDI0IDEwMjUgNTYzIDQ3NSAyODQgMzQ3IDMwMCAxNTMgMTM4IDE2OCAzNTQgMjI4IDIwOCAxOTUgMTA3IDY3IDExOSA1NyAyMSA1NCA0MCA0NiA0NiA0NiA1NSA0MSA3NSA0MCA0NCA1OSA0NyAzMiAzMiAzNiAyNiAyMSA2NCAzMSAyNAorNDUwOTI4MyA1NTQ2MzM0IDM4NzgxODAgNDAxNDYzMCA0Mzg5NzExIDQzOTQ2MjUgNDk4Njg1NSA0NzM5OTAxIDM0MDMyNjggMjEyOTA5MCAyMDk2Njk5IDIyNzQxNzAgMjEyODc1NCAyNDU4NjQ3IDE3ODA4OTYgMTE0NjUzNCA5MDk2NjcgNDU1NTE5IDQzNDI1OSAzMjg3NjggNDc1NTAxIDUxNzg2NCA2Njg3MTAgNDc1NTk3IDI4Njc3MiAyNDA4NDEgMTY0NjM2IDc4NDgxIDU2NzAzIDc4NzM3IDE0MjgyMCAxMTIzMTcgNzcxMzYgMjk2MTIgMjcwMTggMjQ0OTAgMjg4NTEgMzk0ODAgMzI5NjAgMjQyOTcKKzcgMyAzIDAgMCAwIDAgMCAwIDAgMCAxIDAgMCAwIDAgMCAyIDAgMCAwIDAgMCAwIDAgMSAxIDIzIDExIDggNSA0IDQgMTkgMjcgMTYgOCA1MSAxNSAxNAorMjA4NSAxODIwIDEwNjQgNjk3IDQxMyAxMjggMzc3IDM3MyAyNDkgMTc4IDMxOSAzMzcgMjA4IDEzMSAxMjEgMTI2IDg1IDE5NyA5OCAzOCA1OSA1NSA2NCA1OCAzMyAxMTEgNjAgNTUgMTAwIDEwOSA5NCA3NCA2MiAxMjAgOTcgODggNDcgNzkgNDYgMzgKKzQ0NTAwMTMgNTMyNTM4MyAzODA4NTY2IDM4MTY1ODMgNDI5MDY4NiA0MTM4ODIyIDQ4NzIwMDMgNDQ3ODQzNCAzMzI0Njc1IDIwMTIyODUgMjA1MjUxMiAyMTU4NDI5IDIwODA5MzAgMjMxOTE4MiAxNzM5NTMxIDEwODU0ODUgODg5MTMxIDQ0MDI5MiA0MjU5MjMgMzExMzc3IDQ2NTEzOSA0OTAxNzIgNjUzNjUyIDQ1MDYyNSAyODA0NTYgMjMzMjEwIDE2MjA1OSA3NzE1MSA1Nzg0MyA4MDcwOSAxNDE2NTcgMTEwMTI0IDc2Nzk1IDM1MjA3IDI4ODIzIDI4NDI3IDI5MzMyIDQxOTY0IDMzMzEzIDI1MTczCisxMCA1IDMgMSAwIDAgMCAwIDAgMCAxIDEgMCAwIDAgMCAwIDcgMSAwIDAgMCAwIDAgMCA3IDQgMTMgNjYgNDcgMTMgMTIgMTYgMTY5IDE1MSAxMzMgNDEgNzAgMzMgMzMKKzI1ODYgMjIwNiAxMzcyIDExNjUgMTI5MSAxMTQ2IDc5OCA2MDUgMzQxIDM1MiA1ODIgNDA1IDIyNiAyOTggMjA0IDEwOCA5NyAyMTkgMTg0IDU3IDc0IDgyIDkwIDYzIDMzIDE0NCA3MCA0OSAxMjAgOTUgODIgODYgODAgMTI1IDExMCAxMjAgNjIgODggNTYgMzcKKzQ0MDUwMzAgNTE0MTQwNCAzNzQ4NTYzIDM2NTkxNzIgNDIxNjU3NyAzOTYwOTEwIDQ3NzA3ODAgNDI0NjkwOCAzMjUwMzk2IDE5MTMxNzggMjAxNjE1MSAyMDUzODEwIDIwMzQ3NjAgMjE5ODM0NSAxNzAxMzIxIDEwMjY5OTMgODY5NDE0IDQyNzMzMCA0MTk5OTQgMjk2MTk3IDQ1NTQxOSA0NjU4MDAgNjM5NjM1IDQyNzQ1OSAyNzQyOTggMjI4MDY0IDE1OTgwMiA3NTUzMiA1OTQ2NiA4MTcwMyAxNDAyMTYgMTA4ODAwIDc2OTIyIDQwNzc0IDMwOTE1IDM0MDkzIDMwMTg0IDQ0ODUyIDMzOTEyIDI1OTM1CisxNiA5IDYgNCA0IDMgMSAwIDAgMSAzIDEgMCAwIDAgMCAwIDkgNiAxIDAgMSAwIDAgMCAxMiA1IDEwIDg5IDM1IDEwIDE3IDI3IDE1NCAxNjggMTc0IDY5IDc4IDQ4IDMwCiszMjg5IDI5NjMgMjA0OSAxOTI5IDIzODEgMjUxMSAyMTEyIDE0NjAgOTYzIDYzNSAxNDQ2IDEyNjYgNTk4IDIwNiAxMTEgNzYgNzUgMTIyIDg0IDQ0IDQxIDU4IDgyIDEzNiA1OSAxMjcgNzYgNDQgNjUgNTcgNDUgNTQgMzggNjIgNjAgNjggMzUgNjQgNDEgMzYKKzQzNzkxNDAgNTAxNDk3MSAzNzA3MzYzIDM1NTgxNDMgNDE3MjE4MSAzODc3NTM0IDQ3MDU2NzMgNDA4MTgwMiAzMTkzODcxIDE4Mzc0MDQgMjAwMjc4NCAyMDA4MzY2IDE5OTkyNTEgMjA3OTEwNSAxNjYxNjg3IDk3MDA0NSA4NDk2MjcgNDA5MTg2IDQxMTY1NiAyODExMjkgNDQ1MDk4IDQ0MTQxNiA2MjU3NjMgNDEwMTY4IDI2ODk1OCAyMjIxODMgMTU3NzU1IDczNzAzIDU5NjQzIDgwMzAyIDEzNzg2NiAxMDU1ODkgNzU5NzMgNDIxMzYgMzE2NzcgMzYyMjUgMzAzMjUgNDYwOTIgMzQxMTMgMjY1OTAKKzI2IDE3IDEzIDEzIDE1IDE5IDkgNSA0IDUgMjIgMTcgMyAwIDAgMCAwIDMgMSAwIDAgMCAwIDMgMSAxMCA3IDggMjYgMTMgMyA3IDYgNDMgNjEgNjUgMjIgNDAgMjUgMjgKKzQzMzkgNDIxOCAzMjcxIDQ4OTEgNjU2OSA3NDI1IDYwNTQgMjg3NSAyMzQ5IDIwNTAgMzg2NyAzNDY0IDEzNzUgMTg2IDk1IDk2IDQyIDk5IDQ0IDIwIDIyIDY5IDE0NSAyMjEgMTQ5IDk1IDEzOSAxNzYgMzEgMzIgMzIgMjIgMjggMjUgMzAgMzIgMjkgMzQgNDIgNDEKKzQzODA3MzcgNDk3MzIyOCAzNjk4NDI5IDM2NDUxNTMgNDIzNTk0OSA0MTAxMDY0IDQ3NDI5NTggNDAxMzUzNiAzMTc0MTg3IDE4NTMxMTEgMjA1MTYzNyAyMTAwNjg4IDE5ODQ0OTEgMTk2NTc5MSAxNjIyNjM0IDkxNzc0MiA4Mjk0OTEgMzkwNzE4IDQwMjUwNCAyNjU0OTAgNDM0NTQ5IDQxOTE3MSA2MTM4NDggMzk5MTM2IDI2NjA1MiAyMTQ2ODkgMTU3MzcwIDgwMDkzIDU4OTQ2IDc3NDUwIDEzNTI0MiAxMDA2MDUgNzQ3OTIgNDExNDMgMzE2NTMgMzYwMTcgMzAzMDkgNDU0MTUgMzQzMzUgMjc1MTMKKzQ2IDM1IDM1IDgwIDEwNSAxMzMgNzkgMjMgMjUgNTEgMTM0IDExMSAyMCAwIDAgMCAwIDIgMCAwIDAgMCAyIDEwIDEwIDYgMjQgMTE1IDYgNCAxIDEgMyA3IDE1IDE0IDE1IDExIDI2IDM0Cis1NDc5IDU0MDUgNDMzNiA1NjY4IDc5MDcgMTMzMTAgMTI3ODAgNTYxNiA0NzQ0IDQzMTEgODIzOSA2MDAyIDIxNzUgNjEyIDMwNyAxMzggNjUgNzIgMjYgMzEgMjUgOTQgMzc0IDUxOCAyNTYgMTU2IDE5MCAyMjUgMzkgMTE5IDYxIDM3IDQwIDMzIDM1IDI4IDIzIDMwIDMwIDI0Cis0NDExNDM1IDUwMDY5MTYgMzcxNjk0MiAzNzc0NjgwIDQzMzIzMjggNDY3Mjc0MyA0OTUxMjQ2IDQxMTc3NjYgMzIxNjIxNyAyMDA2Nzg1IDIyMTEwMzAgMjM0MzM5OSAxOTkwNTQ5IDE4ODU0NDggMTU4OTk3NSA4NzExNTggODEwNDQ1IDM3MTY5OSAzOTMxMjAgMjUxNDY1IDQyNDM0MCAzOTk3OTYgNjA4MDg0IDQwNzAxMyAyNjU5NTQgMjExMzkyIDE1ODI5OCA4OTExMSA1ODQ3MSA4MDExNCAxMzM0MjUgOTY4NDIgNzM5NDcgNDA3MDEgMzE3NTcgMzU1NzYgMzAxNDAgNDQ1MzMgMzQyNDQgMjczMzYKKzczIDU3IDYxIDk3IDEzNiAyNTQgMjI2IDg0IDk1IDE2MSAzMzQgMjEyIDUwIDQgMSAwIDAgMSAwIDAgMCAxIDE0IDU3IDMxIDE3IDQ0IDE0NCA5IDU3IDYgMyA3IDEzIDIwIDExIDkgOSAxMyAxMQorNjI4NyA1NTgzIDQ1MjYgNjU0OSA5NTU4IDE2NjM3IDEzMTI3IDExNzI5IDgzODkgNzY0OCAxMDI3MSA3MjQxIDIxMTEgNzQ4IDM2NSAyNTMgMTMzIDE2NiA2NCA1NCA1MSAyMTkgNTE3IDY4NCAzNTggMjc5IDMzMSAyODkgMTE0IDM5MSAxNzQgNjQgOTYgNDggNjIgNTAgMzQgNTAgNTUgNTMKKzQ0NjIwMjIgNTA0OTUxOCAzNzM5ODUwIDM5NTA1NjIgNDQ2ODUwNCA1NDE0NTI1IDUxNjMyMDUgNDU5MTMxMCAzMzUwMzczIDIzNTYyNTYgMjQxODM4NyAyNjQ3NjY5IDE5OTQ4MjAgMTgxODI4MCAxNTU5NjE0IDgzNDQzNCA3OTM2MTMgMzU5NTk2IDM4NDk0MiAyMzk2OTUgNDE1MDUwIDM4OTI2NCA2MDYxMTkgNDI0NjE2IDI2ODQ2NiAyMTU4NTAgMTYyODA3IDEwMTUxOSA1OTkyNSA5OTMyOSAxMzQ1NDIgOTQ5NjMgNzQ1NTUgNDEyMDggMzI1NDkgMzY1MTMgMzAyNTYgNDQ5MzMgMzQ3OTUgMjg5NTIKKzkyIDYwIDY2IDExNSAxNzQgMjgxIDIyMSAyMTkgMjA2IDI4NyAzOTcgMjMyIDQ3IDcgMiAzIDEgNyAwIDEgMCAxMSAyOCA4OSA2MCA1MyAxMTggMTczIDgwIDI2MyA0OSAxMiA0MiAyNyA2MiAzNSAyMCAyNSA0NSA1MworNjIzMiA0OTQ4IDM2MDcgNjY1NCA5Njc3IDEyNjY2IDE4MTIxIDE2NDg5IDg3MjYgOTAxMyAxMTE0MSA3OTc2IDE2MTggNzMxIDQyNyAyNzkgMTc5IDIwNSAxMDAgMTAwIDEwOSAyMzMgNTkxIDY0NiAzNDcgMzQyIDMzMSAzMTcgMjQ1IDQzOSAyMzYgMTcyIDIzMSA1NSA1OCA1MSA1MyA1MSA2OCA2MworNDUwOTk0MCA1MDUwNTUxIDM3Mzg2OTQgNDEyMjM0MyA0NjA0MzIzIDU4Njc4MzQgNTQ5NzUzMiA1MzI4ODg1IDM0ODk3OTQgMjc2ODYyMiAyNjQyODA3IDI5Nzg4NDAgMTk4NjM4MiAxNzU0MDk4IDE1MzE1OTUgODAxNTExIDc3ODM3NyAzNTA2MTUgMzc3ODg4IDIzMTQ1NyA0MDc0NzUgMzgwMjI0IDYwNjA5NSA0Mzg4MjggMjcwNjM0IDIyMzkxMSAxNjcyMDMgMTE0OTAzIDY0NjkxIDEyMDM0MCAxMzcyMTYgOTk4MzIgNzg1OTggNDIxMTQgMzMyMTkgMzc0NTUgMzA4NTUgNDUzNzAgMzU2NjQgMzEwODUKKzg5IDQ3IDQyIDExMSAxNjkgMTgwIDMwNyAyODYgMjA0IDI5MCAzOTUgMjI2IDI4IDcgMyA0IDIgMTIgMiA1IDIgMTMgMzcgNzYgNTUgNzMgMTEzIDE2NyAyMzAgMjQ0IDg2IDc5IDE3NCAzNCA1MyAzNSA0OSAyNiA2NyA2OAorNjUxNiA1MDk5IDM1OTQgNTE3MyA3NTk4IDEwOTgwIDE5MDYyIDE2NjM3IDEwNjQzIDkyNDYgMTI2MzcgNzY1NyAxNzEzIDg0NCA0NDkgMjQ2IDE5MCAxODkgMTU0IDE2NSAxNDggMjg4IDUzMSA2MzIgMjc3IDMxNSAyNzYgMzYwIDM0OSA0NzIgMjA1IDI0NCAzMDIgNzcgNjcgNDAgNTUgNDIgMzUgNTMKKzQ1NjM5MjEgNTA2MDgwMCAzNzM3MjM1IDQxOTI4MjggNDY4MzYwNyA2MTkwMzYyIDU4NDc1NjcgNjAzMTMwMCAzNjc0NzM4IDMxNzA1NjIgMjg5OTg2NiAzMjcwNTQzIDE5ODA1ODMgMTcwMDcwOSAxNTA0ODM4IDc2ODUzNSA3NjM4MDIgMzQxMTkwIDM3MjM5MSAyMjc3MDcgNDAxMDg2IDM3NTEwNSA2MDQ1MzggNDUxMzI3IDI3MDk1OCAyMjk4MjkgMTcwMDg0IDEzMDEyNiA3MTk5NyAxNDIxMTggMTM5MDMwIDEwODgzMyA4NDM1NSA0NDMxNyAzNDEwMiAzNzY2NSAzMTQ5MCA0NTIyOCAzNTY2OCAzMjQ3NgorOTUgNTAgNDEgNzEgMTE3IDEzNCAzMDMgMjQ0IDI0NyAyNTIgNDExIDE4OCAzMSAxMCAzIDQgMiAxMCA2IDE2IDQgMjEgMzAgNjkgMzUgNTkgODEgMTc0IDMyMyAyMjcgNjQgMTIzIDIyOSA2MSA2OSAyMSA1MSAxNyAxNyA0NgorNjYzOSA0NjUzIDMyNzIgNDc1MiA2ODYyIDk1NDIgMjEyNTAgMTQ4MTIgOTUzOCA5NjQwIDEyNTk0IDgxNTYgMTUwOCA2NjIgMzcwIDI4OCAxMjQgMTUyIDEwOSAxMzQgMTM1IDI0MiA1NzcgNjI2IDI5OSAzMjcgMzM3IDU3MCA1MDAgNTM2IDMwNCAyNzggMzIxIDg0IDYzIDMwIDI4IDMwIDM3IDMyCis0NjE5Njk5IDUwNDMwMzMgMzcyNzU4MSA0MjMzMjE5IDQ3NDIwOTggNjQwNTE5MiA2MjQ0Nzk1IDY1Nzk0NDggMzgyNjgxOSAzNTcyNTkzIDMxNDk0MDkgMzU3NTQwMiAxOTY5Njg5IDE2MzkzNDIgMTQ3NjczMCA3NDAxMTggNzQ3OTA0IDMzMDA1NyAzNjU4ODEgMjIyMjc3IDM5NDUyNCAzNjc0NjcgNjA0MTk2IDQ2MjcwOCAyNzE4MzcgMjM2MTI5IDE3NDQ1MiAxNTczMzggODI5ODAgMTY2NTIxIDE0MzMzMCAxMTkzODIgOTA0NTQgNDY4MTggMzQ4NjEgMzcyNDggMzE0MTkgNDQzNTcgMzU3MjMgMzI0OTMKKzk2IDQxIDM0IDU5IDk4IDEwMyAzMTkgMTg5IDIwMyAyMjUgMzY5IDE4MCAyNCA2IDIgNSAxIDcgMyAxMSA0IDE1IDM1IDY1IDQxIDYxIDEwOSAyNTkgNDI5IDIyNCAxMjIgMTMyIDIyOSA2NyA1OSAxMiAxMyA5IDE5IDE2Cis2NTQ0IDQzNjggMzI3MyA0OTU5IDcxNDkgMTE2MDggMjA3MTcgMTQ4NjkgOTQ0NiAxMDM5NyAxNTI2NiA4MzIzIDE2NjQgNzc0IDMyNSAyODEgMTg3IDE5NSAxMjIgMTI1IDE0MCAyMzkgNTYwIDU5MCAyNzkgMzgxIDQ5NiA3NjcgNjMxIDU4OCAyODUgMjk0IDMwNiA4NCA2MSAyMyAzNCAzMyAzNiAyOQorNDY3MTY1NiA1MDA4ODIyIDM3MTgxOTQgNDI4MzkwNCA0ODA2NDY1IDY3MzQwNjIgNjYxODQ4MiA3MDk4MjExIDM5NzI3NTIgMzk5NzAxMSAzNDYxMDI2IDM4NzIyMzAgMTk2MzA1NCAxNTg4NTM4IDE0NDgxNzMgNzEyOTc2IDczNDAxMyAzMjIyMzQgMzU5ODY1IDIxNjYyMCAzODgyNTQgMzYwMTAzIDYwMzQyOCA0NzExOTQgMjcyMTgyIDI0NTM2OSAxODI3NzYgMTk1MDIwIDk3MDM4IDE5MjY1NSAxNDcwMzcgMTMwMjgxIDk2MDE4IDQ5MTY5IDM1NTUwIDM2NDI2IDMxNTAzIDQzNzIzIDM1NzUxIDMyMzI1Cis5MiAzNyAzNSA2MyAxMDEgMTI4IDI4NCAxNjggMTk0IDIxNyA0MDkgMTY3IDMwIDEwIDIgNiAyIDEzIDQgMTAgNCAxNSAzMyA1NSAzNSA3NyAxODAgMjkwIDQ3NiAyMTEgMTA3IDEzMCAyMDAgNjIgNTQgNyAxOSAxMSAxOCAxMworNjUyMiA0NDQyIDMyNzIgNTU5NiA2OTMyIDEyMTgxIDIxNzc3IDE1NjE2IDkzMTMgMTA2NjAgMTc4MzEgOTk0MyAyMDIzIDg3NiAzNTMgMzA2IDIwNCAxODIgMTMxIDE0MCAxMzMgMjcwIDU1MiA1OTkgMjk5IDQwMSA3MzMgMTA2MyA2OTAgNjEzIDI2MSAzMzIgMzU4IDg3IDY1IDQ2IDQ3IDYwIDU3IDYxCis0NzIxNzU0IDQ5ODEyMTAgMzcwOTAxNSA0MzcwNjg0IDQ4NjM2NzggNzA3ODQwNCA3MDA5OTM2IDc2MzE3NDMgNDExMTY0MiA0NDEyMTIzIDM4MzA0MzIgNDI1MDc3OCAxOTY1NzYyIDE1NDcwNDggMTQyMTA0NSA2ODg5OTkgNzIwOTA0IDMxNDA4MiAzNTQyMzAgMjEyMjI0IDM4MTk2MSAzNTUwODUgNjAyNDc0IDQ3OTcyNCAyNzMwMzAgMjU1MjgzIDE5Njk1MCAyNDg2MjcgMTEyMjUzIDIxODc1NyAxNTAwMzggMTQyODYxIDEwMjc3MiA1MTU2NCAzNjMyNCAzNzA2NiAzMTkxOCA0NDc4NSAzNjMxNSAzNDEzMworOTAgMzggMzUgNzYgOTUgMTI5IDI4MSAxNjQgMTgzIDIwNCA0MzYgMTkzIDQ1IDEzIDIgNyAzIDExIDQgMTMgNCAyMCAzMiA1NSA0MCA4MCAyNzEgMzI2IDQ1MSAxODggOTAgMTQwIDIyNiA2MSA1OSAyOSAzNyAzNiA0NSA1NworNjYyOSA0NzIyIDM2ODggNTg1OCA2ODg4IDEyNjQ0IDIxMzQ1IDE1ODEyIDkyNjAgOTY5NiAxODM3MyAxMDk2MCAyNTk1IDEwMDQgNDQ1IDI5OCAyMTkgMTk4IDE2NiAxNTMgMTU1IDI4MyA1NDMgNTY1IDMwOSA0ODIgNzg5IDExNTkgNzY1IDY5MSAyOTIgNDE5IDUwNCAxMDEgNTcgNDkgNTkgMTEwIDc5IDY3Cis0NzczMzM2IDQ5NzI0NTcgMzcxMDY5OSA0NDY4MzU0IDQ5MTgzMzggNzQzMDUzMiA3MzgwNTc1IDgxNDUzMDYgNDI0NTcxMCA0NzQzMTA0IDQyMDQ0NzEgNDY2OTA5NiAxOTgzMDI0IDE1MTU5MTIgMTM5Njk0NiA2NjU5NjkgNzA4NTA1IDMwNzQwMiAzNDk2MzAgMjA4ODkxIDM3NjM4OCAzNTExNjcgNjAxMzE0IDQ4NTY1MyAyNzQxMTMgMjY5NTc5IDIxMjIwMiAzMDQ5MTYgMTI5MDA2IDI0ODA4NSAxNTM3NTYgMTYwMDMyIDExMzA4OSA1NDY3NSAzNjg3NCAzNzg1MiAzMjYyOSA0ODg1NiAzNzQyNyAzNjIwMQorOTEgNDMgNDQgODEgOTIgMTI3IDI1OSAxNTYgMTc1IDE2NSA0MTUgMTk4IDcyIDE4IDQgNyAzIDE0IDggMTcgNiAyMyAzMSA0OCA0MyAxMDIgMjcxIDI5NiA0NDUgMTkwIDEwNCAxNzAgMzA5IDc0IDQ0IDMyIDU2IDEwMSA4MyA2MworNjY4NyA1MDE2IDQwMTIgNTgxMCA3MTQzIDEyODMxIDIxNjExIDE2NjE4IDk0MTQgOTYxMCAyMDQ0OCAxMTc4MCAzMDM1IDEyMjUgNjQxIDM3NiAyNTMgMjY0IDE5NiAxNTYgMTY0IDM0MyA3MjYgNTkwIDMzMiA0OTEgODc0IDExNzcgNzkwIDcxOSAzNDAgMzg5IDQwOSAxMTQgNTMgNDQgNDEgMTIxIDk4IDcwCis0ODI1MTEzIDQ5ODIyOTIgMzcyMDYyNCA0NTU3MjE1IDQ5NzgxNTIgNzc3MzAyMiA3NzQ4NzYyIDg2Nzc1NzUgNDM4MDM2OCA1MDQ4OTQzIDQ2MjIyMTUgNTExMjY5NSAyMDExMTAzIDE1MDAyMjEgMTM3ODQ1OSA2NDkxMTIgNjk3Mjg1IDMwNTE3OCAzNDU5MTIgMjA1OTQyIDM3MTE4NCAzNTExNzAgNjA0ODYxIDQ5Mjc2MyAyNzU3NTYgMjgzNTcwIDIyOTI0NiAzNTg5MzMgMTQ1OTc5IDI3NzM3NCAxNTg2MDggMTc0MzI5IDEyMDcyMCA1ODM5OCAzNzMwOCAzODI4NCAzMjg2MiA1MzM1OCAzODk5NyAzODMyOQorOTEgNDkgNTIgNzcgOTYgMTIwIDI0NyAxNTUgMTcyIDE0OSA0MzAgMTk0IDk0IDI4IDkgMTMgNSAyNiAxMSAxOCA2IDM0IDU2IDUxIDQ5IDk4IDI4MCAyNDkgNDEzIDE3OCAxMjcgMTM2IDIyMiA4MyAzOCAyNSAyNyAxMDUgMTEzIDY0Cis2NzIxIDU0NzMgNDM3MCA2MDYwIDc2MzYgMTI3MTggMjE4ODMgMTc0MTIgOTg5NCAxMDExOSAyMDE1OCAxMDY4OSAzNjE4IDEwNTEgNTI5IDM0NCAzMDAgMzQyIDI2OSAxNzAgMTg2IDQ3MCA3MTcgNjY2IDMzMSA0NDggODU4IDEwMTUgNzQ0IDcxMCAzODYgMzkyIDM1OCA4MyAzNCA0MyA0OSAxMTkgMTMzIDg0Cis0ODc2NDY3IDUwMTk2MTQgMzczOTQ1MiA0NjU2MTA0IDUwNDkwNzUgODA4ODAyMSA4MTE0NzEwIDkyMjY2OTEgNDUyMzkzNCA1MzY3NzA0IDUwMjIxMTcgNTQ2MjY1MSAyMDUzMzg0IDE0NzQ3ODIgMTM1NzU3MCA2MzEzMDEgNjg3NTQ3IDMwNzg3OSAzNDQxNTMgMjA0MDMwIDM2NjY3MiAzNTg5NzYgNjA4MDg5IDUwNDExNSAyNzczMzMgMjk0MDgwIDI0NTQ1NSAzOTk3NTYgMTYxMzUzIDMwNDM1MiAxNjQ1MTUgMTg3OTUzIDEyNjg1NyA1OTk5MyAzNzI0NSAzODYyOCAzMzI5NCA1NzQ2NyA0MTQyMyA0MTE5MAorOTAgNTkgNjEgODAgMTA1IDExMiAyNDAgMTU3IDE3OSAxNDggMzg4IDE1NSAxMjEgMjEgNiAxMSA3IDQzIDIxIDIyIDkgNjEgNTQgNjMgNDggODAgMjU0IDE3OCAzNDggMTU3IDE0NiAxMjMgMTc3IDQzIDE1IDIzIDM4IDkyIDE2NSA4MQorNjczNyA1ODMyIDQ1MjIgNTkzNCA3ODc5IDEzMTkyIDIxMjU5IDE3NDU1IDkwOTQgOTAzOSAxODU1MSAxMjgxNyA0MzM0IDk2MiA0NjggNDIzIDMxMyAzNDYgMjU5IDIxMSAyMTQgNDYxIDg0OCA4NTEgMzc1IDQ3NSA2NjEgNjA0IDYyNSA1NjggMzAwIDI2MCAxODQgNjcgNTIgNTEgNTIgMTUwIDExMyA2MQorNDkyNjk0OCA1MDc2NzUyIDM3NjE2OTYgNDc0MTMxOSA1MTI0NDM5IDg0MTMyNDIgODQ1NTU3MiA5NzQ1NTAzIDQ2NDM0NjYgNTYwMDk4OCA1MzcwOTU3IDU5MjIzNDkgMjExMjkxMiAxNDQ1NDAxIDEzMzU2NDMgNjE5NDEyIDY3ODM4NCAzMTA2NjQgMzQyMTgyIDIwNDc1MiAzNjI5ODkgMzY1NzYxIDYxNDU4NiA1MjYxNTIgMjc5OTk1IDMwNTYxOCAyNTYyMjQgNDEyODc5IDE3MzMwMSAzMjA5ODggMTY4MDc2IDE5MjY1MCAxMjgzOTMgNjA1MDkgMzc2NDQgMzk0NDMgMzM3OTIgNjMyMzQgNDMyNzcgNDI0NjYKKzg4IDY1IDY1IDc2IDEwOSAxMTYgMjI2IDE0NCAxNTMgMTE2IDMyNSAxODAgMTUzIDE5IDUgMTggOCA0MyAyMCAzMyAxMiA1NiA3MyA5MyA2MSA4MyAxNzMgNzUgMjYwIDEwNCA5NiA1NyA1OSAyNyAzNiAzMiA0MiAxMTggMTI0IDQxCis2ODg1IDYyOTMgNDY0NiA1MzA0IDgwMzggMTI5MjkgMTYwMTggMTQ2MzYgOTE5MCA2MjU1IDEzMTc2IDEzNDU1IDY3NjYgMTEzNiAzNzYgMzc4IDIzNCAzMTcgMjE3IDIwNiAyNTAgNDM3IDEwOTUgMTA2MiA1MTIgNTM3IDQ2OSAyNzUgMzkyIDU4OCAyNDIgMjA4IDE0NiA2NSA0MiA2NSAzOCA5NCAxMTQgNTcKKzQ5Nzk5NTIgNTE1ODc4NSAzNzg2NTU0IDQ3ODI3MTUgNTIwMTk4NyA4NzAyNzkzIDg2NTM5NTIgMTAwNTk5OTUgNDc2MjQ2OCA1NjQ5MjMzIDU1NzM2OTEgNjM5MzY2NCAyMjMzMTIyIDE0Mjg0NzMgMTMxMTkxMiA2MDU0NzIgNjY3NDMwIDMxMTUwMCAzMzkxODcgMjA1MTIzIDM2MDMxOCAzNzA2NjQgNjI3MjM0IDU1OTgzMCAyODYwOTMgMzIwMjczIDI2MTgxNiA0MDUwMDIgMTc4OTk1IDMzNzg1NCAxNzAwNjYgMTkzODcwIDEyODkyMCA2MDg3MiAzNzc3NyA0MTA2OSAzMzkxOSA2NTIxNSA0NTExMCA0MzQyMAorOTAgNzIgNjcgNjAgMTEwIDEwNiAxNTEgMTA3IDE1MSA2MSAyMDIgMTcyIDI2MSAyNyAzIDE1IDQgMzYgMTQgMzIgMTcgNDkgMTEwIDEyMyAxMDQgOTUgMTAxIDE2IDEzMyAxMDIgNjMgMzYgMzYgMjUgMjMgNDkgMjIgNDkgMTE5IDM1Cis2ODgyIDY0MDkgNDcyNCA1NjA1IDgwNDAgMTI1NjkgMTQ5MTkgMTI4NTIgNzMxMSA2MDg1IDEwNDM3IDEzMTAxIDgxNzMgMjY0NCA3NTYgNTIzIDM4NSA0MzkgMzA1IDMzNiAyNzkgNzA5IDEzODYgMTEzOSA3MTcgNTczIDM4NSAxODYgMjc4IDQ3MyAzMjEgMzk4IDQwNiA0MyAyOSAzMiAyNyA2NyAxMDEgMzgKKzUwMzE1NTYgNTI0MzAyMyAzODEyNzg2IDQ4NDAxMjAgNTI3NzY1MCA4OTUyODU0IDg4MTkyODcgMTAyNDYwMTQgNDgzMDQ2OCA1Njg0MTM5IDU3MDEzNDggNjgxNDk1MiAyMzg2Mjk4IDE1MDUyMDggMTI5ODQ4NyA2MDEyNzYgNjYwNjEwIDMxOTc4MSAzMzg1MTYgMjEzNDU5IDM1ODQ1NSAzOTE5ODQgNjQ3MDA1IDU5NjIxOCAyOTcyNzkgMzM2MjYxIDI2NTEyMSAzOTIxMzAgMTgxNjMzIDM0NjY0MyAxNzQwMjYgMjA2NjkwIDEzNjA4MCA1OTg2MSAzNzU3NSA0MDU3MCAzMzc2MiA2NTQxOCA0NjU2NSA0MzE0OQorODggNzMgNjkgNjUgMTA2IDk4IDEzMiA4MyAxMDUgNTYgMTQyIDE1MCAzMDcgMTE5IDE0IDI5IDEzIDY2IDI4IDc3IDIxIDEwOCAxNTEgMTI2IDE2NCA5OCA3MCA4IDczIDY2IDEwMSAxMDkgMTk1IDExIDExIDEyIDExIDI0IDk0IDE1Cis3MDQ5IDY1NzAgNDc0OCA1OTE3IDg4ODkgMTIwNDMgMTIzNzUgMTE0NjcgNjI0NCAzOTMxIDUwODEgNzg4MSA1NDkxIDUyNzcgMTYxOCA3NDYgNTAyIDUyOSAzOTggMzQ3IDM5OCAxMTYxIDE1MzUgMTAzNSAxMDE2IDkwNyAzMzQgMTQ1IDE2MSAyOTQgMjc1IDM4MyA0MTYgNTYgMjkgMjkgMzAgMzggNzggMzIKKzUwODYxNDEgNTMzMjA5OCAzODM4OTc2IDQ5MTMyNTAgNTM3MzEyNyA5MTU1NTk2IDg5MTU0NjMgMTAzMzU3ODEgNDg2OTQ5NSA1NTg0NjE1IDU2ODg5MDYgNjg5MDI2MCAyNDY3MDkxIDE3MzkxMDQgMTMwNzQzMiA2MTEwMzMgNjU2OTUxIDMzMzA5NSAzNDAyMzkgMjIxOTcwIDM1OTY4MCA0Mzk3OTQgNjcwMDkyIDYyNDAzNCAzMTU4MjkgMzcxODA5IDI2NzA0MCAzNzc1MTEgMTgxMjE0IDM0MzkwNyAxNzY3MTEgMjE3ODE5IDE0MzMxNiA1OTcwOSAzNzM3OCAzOTkxNyAzMzY4NiA2MzgyNyA0NzM5NiA0MjUyNgorOTIgNzMgNjkgNzAgMTIyIDg4IDk2IDY3IDc5IDI0IDM5IDYyIDE3NyAyNTEgNjUgNTggMjIgODcgNDggNzcgNDMgMTg3IDE2NiAxMDIgMjQyIDE2OSA1MiA1IDI1IDI2IDc2IDk0IDE5MSAxOSAxMSAxMCAxNCA4IDU2IDExCis3MTk3IDYzMzQgNDMzOSA2NDc2IDk1NTIgMTEyMjEgMTAzNjEgODg4NiA0NDQwIDI1NTIgMTk3MyAzMDI5IDMwNDggNjczMyAyOTk5IDE4NDcgOTI5IDg0NSA2MzEgNTU3IDYyMCAxODA5IDE3ODggMTE4MSAxMjM1IDczMiAyNTIgOTEgMTEwIDQzOSA1NDQgMzg4IDMwNCA2MCAyOCAzNiAyOSA0MiA0MyAzNgorNTE0MzE0NyA1NDAxMzMwIDM4NTQwNTcgNTAxNjMzNiA1NDgzMTY4IDkyOTU2NzIgODk1Nzc1NSAxMDI2MTU5MiA0ODYxNDMzIDU0MDYzNDAgNTU5NzMyNiA2NjYyOTU1IDI0ODM0MTggMjA0ODQyMCAxMzUxNDU2IDY4Nzg0NyA2NjQyOTggMzY1MDI0IDM0Nzg3NSAyNDI4NzMgMzY2NTQ5IDUyNDU0NyA2OTkwNjkgNjU5MTUxIDMzOTUxNCAzOTQ0NzMgMjY2ODE1IDM2MDQ1MiAxNzk1MDIgMzUwMjQ0IDE4NjIwNSAyMjg1ODggMTQ3NTA5IDU5ODEyIDM3MTYwIDM5NzMzIDMzNTg2IDYyNTc3IDQ3MzEyIDQyMTg2Cis5NCA2NyA1NyA4MSAxMzEgNzUgNzAgNDAgNDAgMTAgNiAxMCA2OSAyODIgMTY4IDIwNiA3NiAxNTcgMTA5IDE0NCA5NyAyNzIgMTkzIDExNSAyODMgMTEzIDMwIDIgMTEgNTYgMTk5IDg5IDExOCAyMiAxMCAxNiAxMyAxMCAxNyAxNAorNzM3MiA1Nzk4IDQwNjUgNzgzNCAxMDA3MiAxMTg4NyA2NDA1IDQ1NTggMjQzMSAxODUwIDE0NjggMTIxMyAxMzMwIDE4MTQgMjc1MCAzNzAwIDE5MjUgMTE0MiA3OTYgNzcyIDExNDAgMjMwMiAxNjU4IDk3NyA3NjIgNTI4IDE2NSA3OSAxMDQgMzE3IDQxNCAyODMgMTk2IDUxIDM4IDI2IDI1IDM0IDM2IDMxCis1MjAzMjAzIDU0MzM0NzggMzg2MTc1OCA1MTk2NjY5IDU2MDM3NTUgOTQ2ODI2MSA4ODk3ODY2IDk5MjU5NTMgNDgwMjIxNyA1MTk1NjMyIDU0OTUxMjMgNjMzNzcxNyAyNDU1NDIxIDIwMzY5NjcgMTM4ODAxNSA4NzM4OTYgNjk2OTIyIDQxMzI4NSAzNTk1MzggMjc1NzMwIDM4NjUzOSA2MzQ1MDQgNzI0MDAwIDY3OTYyNyAzNTA1MTcgNDAzMjQ0IDI2NDM3MiAzNDM2NzkgMTc3Njc5IDM0ODcwNSAxOTIxMzkgMjMyMjYwIDE0ODgzNiA1OTM1NiAzNzIwMyAzODk0NiAzMzM4NiA2MDkxMSA0NzA1MSA0MTU1OQorOTYgNTYgNDkgMTA2IDEzNyA4NCAyNiAxMSAxMiA2IDMgMSAxMyAzNCAxNDQgMzU4IDIxMyAxOTkgMTQ3IDE5NyAyMTcgMjk5IDE2NiA4MCAxNDMgNjEgMTMgMSAxMCAyOSAxMzAgNDcgNTMgMTYgMTkgOCA5IDcgMTIgMTEKKzc0OTEgNTQwNCAzNTg2IDkyOTQgOTQ0MiAxMTYzMiA0MDE0IDE3ODYgMTI4OSAxMjg2IDIwMTIgMTE2OCAxMDA3IDEzMDcgMTQ3OSAyNzYzIDE3NzUgMTY5MSAxMzY3IDk0NSAxMTYzIDI1OTAgMTQwMSA4OTcgNTgwIDUwMyAyNjkgNzUgNjggMjI4IDMyMyAyMzggMTQ0IDU2IDI5IDE5IDE3IDIxIDIzIDE3Cis1MjY0ODAyIDU0Mzk0OTAgMzg1NzAyMiA1NDU1ODgxIDU3MDUyMjcgOTYxNDgyOSA4Nzc4MzUzIDk0NDAxNDcgNDcxNTI4NyA0OTYyOTE1IDU0MDkzNzcgNjAyOTIyOCAyNDE5ODY2IDE5OTUwNTIgMTM5MTE3MiA5OTEyMTYgNzI0ODk3IDQ5MjM3OSAzODU1MDYgMzE3MjQ1IDQwNjYxOCA3NTU1NTggNzQxNzM5IDY5Mzk2MCAzNTY1OTMgNDA5OTUzIDI2NDY0OCAzMjc2NjYgMTc0OTgxIDM0MTc5MSAxOTU1OTkgMjMyOTQ3IDE0ODgwMSA1OTIzNSAzNzAxNSAzNzc3NiAzMjk4NyA1ODU0NiA0NjQ2NCA0MDEwOQorOTYgNDkgMzggMTI4IDEyMiA3NyAxMCAxIDMgMyA2IDEgNyAxOCA0OCAyMTUgMTgyIDI2NSAyNzUgMjE5IDIwOCAyNzkgMTI1IDY2IDkxIDUzIDM0IDEgNCAxNSA4NCAzMyAyOCAyMCAxMSA0IDQgMiA1IDMKKzc0ODcgNTA5NyAzNTkyIDEwODY3IDk4MjYgODIzNSAyODMxIDE3MDYgMTE2MiAxMTI2IDEzOTMgMTExNiA3NTYgOTU0IDY3OCAxMDYxIDEwMjQgMTgyNiAxNjEwIDExNDQgMTEzMSAyMzAyIDEzODYgOTk1IDc2NCA3MDYgMzY3IDEyMCA1NiAyMDAgMzQ3IDIzMSA4OSA1NCAzMCAxNiAxNSAxNyAxNSAxNworNTMyNDc2MSA1NDI2MjgwIDM4NTI1NTggNTc5NjE4MiA1ODEzOTgyIDk1NDM5MDAgODYzMTU4MyA4OTc4NTczIDQ2MjcyODEgNDczNDMzMCA1MzA5OTQ5IDU3MzYwNTMgMjM3ODc4MyAxOTMzOTY1IDEzNzM3NzUgOTk2OTMwIDczMjk3NyA1NzUwMjIgNDE3MDM4IDM2ODQ5NSA0MjUzNzggODUxNjU1IDc1ODY1MiA3MTM0NTQgMzY3MjIwIDQyODczMSAyNjc0MjIgMzE1Mzc5IDE3MjA0NCAzMzM1NzEgMTk5NTg2IDIzMzE2MiAxNDczNjEgNTg5OTggMzY4NTcgMzY0OTIgMzI1NDYgNTYwNzcgNDU2ODcgMzg3NDYKKzk1IDQzIDM5IDE0NSAxMjUgMzkgNSAxIDMgMiAzIDEgNCAxMCAxMCA0NCA3NiAyNTEgMzAzIDIzMyAxODkgMjA1IDExOSA3NiAxMzUgOTMgNjMgNSAzIDEyIDkyIDMxIDExIDE4IDEyIDMgMyAyIDIgMworNzM1OSA0ODg0IDQwNDcgMTE2MDEgOTcyMiAzOTY3IDMyNzMgMjI4MiAxMjk4IDEzMTMgMTE5OSAxMDY0IDYyOSA1NjEgNjcxIDc4MSA1NzkgMTMwOCAxNTg2IDE0MDggMTA5MCAxNzk4IDE2ODkgMTEzNyA3NTEgNzIyIDQ2NyAxMzEgNDQgMjEwIDM0OSAxNzcgODUgMzkgMTkgMTUgMTQgMTcgMTcgMTQKKzUzNzk5NTEgNTQwMDc3NyAzODU5ODM2IDYxNjExNjEgNTkxNzM2MyA5MjE1MDExIDg0OTk3NzUgODU4MDA4MCA0NTQ0OTQ4IDQ1MzA5NDkgNTIwODA0NCA1NDU3MjczIDIzMzU0NzkgMTg1MjM5OCAxMzU2NjMzIDk4NTA5OSA3Mjk0ODAgNjIwODgyIDQ0NzE2OSA0MzI4OTAgNDQyNjIyIDkxMTAyMiA3ODI4ODggNzQwNTAyIDM3NzI1MCA0NDczNjYgMjcyNjgzIDMwNDUwNSAxNjg4NzMgMzI2NDU5IDIwMzUyNCAyMzAwNDcgMTQ1ODU1IDU3ODU0IDM2NDIyIDM1MjI0IDMyMDkxIDUzNzU2IDQ0OTgxIDM3MjgxCis5MCA0MCA0OSAxNDggMTIxIDkgNyAzIDMgNCAyIDEgMyAzIDEwIDI0IDI0IDE0NiAyNzQgMjQ2IDE3MCAxMzMgMTUyIDkwIDEyNiA4OSA5NSA2IDIgMTQgOTAgMTggMTAgMTAgNSAzIDMgMiAyIDIKKzcwNzggNTA3MSA0NzY2IDExNzcxIDg5MTIgMjMxMyA0MDY1IDI0NjAgMTMxOSAxNDYyIDEzMzYgMTEwNCA2NjEgMzAwIDM4NSA0NTggNDQ3IDg0NyAxNjIyIDE4MzEgMTIzOSAxOTkzIDE4NzAgMTE0OSA3NjEgOTA5IDUzOSA5OCA0MSAxODEgMzI5IDE3OSA2NiAyOSAyMyAxNiAxNSAxNSAxOSAxNworNTQyNjU4MCA1Mzg4MjkzIDM4ODUzMTIgNjUxNDY4NyA1OTk3NDU4IDg4MDQyMzcgODM5MTUwMyA4MjE2NDMyIDQ0NjUyMDcgNDM0ODkyNCA1MTEyMTg1IDUxOTc2NzYgMjI5NDA3NCAxNzU5Njg5IDEzMzI2MDggOTU0MTMzIDcyMjY5NiA2MzU2NjggNDc3NDY4IDUxOTQwOSA0NjMyNDQgOTc4ODA3IDgxMTE0NiA3NjY2NjUgMzg3Mjg1IDQ3NjM3MSAyNzk2NTQgMjkyMjU2IDE2NTcwNSAzMTc5OTIgMjA2ODUzIDIyNzI0MiAxNDM5MDEgNTYxNjQgMzYxMDAgMzQwOTMgMzE2NzMgNTE0NTIgNDQzNDMgMzYwODgKKzgyIDQ0IDY4IDEzNyAxMDMgMyAxMiA0IDQgNSAzIDIgMyAxIDMgOCAxNSA2OSAyNjAgMjc4IDE5MSAxNDAgMTY2IDg2IDEyMyAxMTggMTE2IDMgMSAxMSA3OSAxOSA2IDUgNyAzIDMgMSAzIDQKKzY5NzQgNTM1OSA1MzUyIDExODUxIDgwMDMgMTY1NCAzMDg3IDIwMDUgNzA4IDEwNjEgMTEwNyA1MjEgNTYyIDMzMCAyMDggNDMxIDUwMSA4NTQgMTI5NiAxOTg4IDEzNzQgMTgwMiAyMDA0IDE1NjQgODYxIDEyMjggNjg5IDEwMSAyNCAyMTEgNDY2IDE4NCA0MCAyNiAyNSAxOSAxNiAyMSAxNyAxMworNTQ2OTM4NyA1Mzk0MjUyIDM5MjUxMzEgNjg1MTkxNyA2MDUyMzE3IDgzNzc2MjEgODI2MDkzNCA3ODQ2NjQ4IDQzNzE4MzggNDE1MzE4NCA1MDEyODY1IDQ5MTc4MzcgMjI1MTE3MiAxNjc0Mzg2IDEzMDQ2NTggOTIzMzY2IDcxNzQ2MSA2NDk5OTcgNDk4Njc3IDYxMDM4MyA0ODY4MDIgMTAzMDc5MSA4NDIxMjQgODE2NzU1IDM5OTYyNiA1MjMyMzUgMjkwMjg1IDI4MDkyNiAxNjIxODEgMzExODc2IDIxMzYwMSAyMjQ5MTIgMTQxMzMxIDU0MzkxIDM1ODM3IDMzMjE0IDMxMjkxIDQ5NjU1IDQzNjcwIDM0NzIxCis3OSA0OSA4MyAxMjkgODQgMSA3IDMgMSAzIDIgMCAyIDEgMSA4IDE5IDY3IDE4NiAyNjEgMjA2IDExMyAxNzMgMTI3IDE0MSAxNjQgMTYwIDQgMCAxNiAxMzIgMjEgMiA1IDkgNSA0IDMgMyAyCis2Nzc3IDU0OTUgNTYxNyAxMjY3NSA5MDQ3IDE2NTAgOTA4IDk1MCA5MjYgNTgzIDkxMSA1MzYgNDQxIDMxOSAyODQgMzc2IDI5NiA0NzQgMTE0OCAyMjA0IDEyMTAgMTY1NyAyNDQxIDE4NDkgMTEzMiAxMjU4IDY1NCAxMTAgMjEgMTYxIDM4NyAxMzUgNDkgMzQgMjUgMTkgMTcgMTUgMTggMTIKKzU1MDYwODkgNTQwODIwOSAzOTcwNzMxIDcyMTk1MzkgNjEzMjQ5NCA3OTc2MzU2IDgwNzc5MjMgNzQzNDIzMyA0Mjg2MzczIDM5Mzk4MjEgNDkxMTAxNCA0NjU1NzA5IDIyMDYyNDggMTU5MzUyNSAxMjc5MzQ5IDg5MTA2NiA3MDcxMTcgNjQwMTIwIDUxNTU3NCA3MDkxNjkgNTA1NTgwIDEwNzA3NDcgODgzNDk5IDg4MTM0OSA0MTg1ODYgNTY5MTMwIDI5OTc1NiAyNzA4MjkgMTU4NjY5IDMwMzA1NSAyMTgxNjEgMjE5NzExIDEzOTA1NSA1MzIxNiAzNTU4MSAzMjM4OCAzMDk0NCA0NzU5NyA0MzAzOSAzMzM3NQorNzQgNTAgODkgMTMwIDEwMSAyIDAgMCAyIDAgMSAwIDEgMSAyIDYgNiAyMSAxNTIgMjQ4IDE2NyA5NCAyMTEgMTQ1IDE5MyAxNTQgMTQyIDUgMCA5IDk2IDExIDMgOCA5IDUgNSAyIDMgMgorNjQwOSA1MDcwIDUwMTIgMTI2MzggOTc2NiAyNjY2IDMwMDAgMjAyOSAxMzY0IDQ0MCA1MDcgNTcwIDQ3MyAzOTIgMjAxIDQyMiA0ODkgODI2IDE0NzMgMjQ3NiAxMzAyIDE3NjAgMjQxNCAxNzgzIDEyOTAgMTE4MyA1MTkgMTQ5IDIzIDE3MyAzNTUgMTI3IDU3IDE5IDE3IDE1IDE3IDE3IDE3IDE2Cis1NTMyNDY4IDUzOTUyMTcgMzk5OTcyNyA3NTYyODMxIDYyMjkwNDkgNzY2MTU4NiA3OTUyOTU4IDcxMTI4NTMgNDIxNDIzNyAzNzMwNDczIDQ4MDEzNzggNDQxMTM5NyAyMTYzMjYzIDE1MjIwMDAgMTI1MjU1MCA4NjM1MzAgNzAxOTY1IDY1MjQ2MSA1NDAzNTcgODE4NzM5IDUyNjI0MSAxMTE0NjM0IDkyMzE1MSA5MzgwMTMgNDQxMTEyIDYwNzY2NCAzMDU1NDAgMjYzNzM0IDE1NTI5NiAyOTU1MDEgMjIxNzg5IDIxNDMzMSAxMzcwNDAgNTExOTAgMzUxMjcgMzEzNjYgMzA2MDYgNDU3ODUgNDIzOTkgMzIzNTUKKzY1IDQzIDcxIDEyNCAxMTIgNSA3IDMgNCAwIDAgMCAyIDIgMSA5IDE5IDYzIDIwMyAyMzggMTc3IDk4IDE5NyAxMjUgMjE0IDEzMCA5NyAxMCAwIDExIDgwIDExIDUgMiA0IDMgNSAyIDMgNAorNjA5MCA0NDQ4IDQyOTUgMTI4NzEgMTAyOTIgMzgwNiA0MjUyIDI2MjYgNzg0IDQ1MyA0NDEgNzc4IDM5MiAxNDggOTcgMzQ0IDQxNiA3MjkgMjE4MyAzMDg4IDE0NjUgMTg1MSAyMzQwIDE3MDQgMTI4OCAxMTY1IDQ1NiA5MCAyNCAxNTUgMjkxIDExMyA1MSA0MiAzOCAzMCAzMyAzMCAyNSAzMAorNTU1MDAzNCA1MzQ0NzkxIDQwMDk2NzEgNzg5OTg0MSA2MzM2NjQwIDc0MzU3NDAgNzg2MzExNyA2ODQ3NDM0IDQxMjkwNzYgMzUzNDQ4NCA0NjkyNzkyIDQxOTQ1MjIgMjExOTI4MSAxNDM5Nzc2IDEyMjM3NjEgODMyODU0IDY5NTA3NSA2NTgxMDIgNTgyNjcwIDk1OTMzNSA1NTA1NTMgMTE2MTQ3OSA5NTk5MjIgOTg2NDI0IDQ2MzAyNCA2NDI3ODAgMzA5NTY5IDI1MzQzOSAxNTIwMzIgMjg3Mjk0IDIyMzY5MSAyMDg0MTQgMTM0OTIyIDUwNjk5IDM1MjIxIDMxMzI3IDMwNjg1IDQ0ODgxIDQxOTc5IDMyMjU2Cis1OSAzNCA1MiAxMTggMTE2IDEyIDE0IDcgMSAwIDAgMSAxIDAgMCA2IDE0IDQ4IDMwOCAyNTcgMTk4IDEwMSAxNzkgMTA5IDIwMSAxMTcgNzYgNCAwIDEwIDUzIDkgNCAxNCAyMSAxNSAxOSA5IDcgMTQKKzU1ODUgMzYxMyAzNTU5IDExNjE3IDgyODUgMjQ4OSAyMzk3IDEyOTggMTE5OSA4MjAgMTAxMiA2MzAgMzU2IDE2MSAxMTEgNDA3IDU0MCAxMTM4IDI0MDkgMjY5OCAxMjM2IDE1NTAgMjE2NyAxNjUwIDExMDYgOTM0IDQxOSA1MSAyNiAxNTYgMjMzIDk3IDY4IDM1IDI1IDE3IDE5IDE4IDE1IDE3Cis1NTU0MjUyIDUyNDYwOTAgNDAwMDU1MyA4MTM5NTg5IDYzOTAyNDEgNzE0MjUzMSA3NzI4MTAwIDY1MTYzNTAgNDA1NjY0OSAzMzcyODAyIDQ2MDE1MTMgMzk4MTU2NiAyMDc1NDc2IDEzNjMyODQgMTE5NjA0OSA4MDc4ODkgNjkxNTI3IDY4ODUzMyA2Mjk3MDQgMTA2NzUzNSA1Njg0MDQgMTE4NzAyMSA5OTEzNTMgMTAyODYxMiA0Nzk3MzcgNjYxNTk3IDMxMjU1MSAyNDEzNjYgMTQ4OTAxIDI3OTY0MSAyMjQwNjIgMjAxODY5IDEzMzI5MiA0OTgwNyAzNDk4MCAzMDQ5MSAzMDQwNCA0MzI5NCA0MTMxNCAzMTM2NQorNTAgMjMgMzYgOTcgODEgNSA0IDEgNCAyIDIgMSAxIDAgMCA5IDI0IDEwMiAzMTkgMTk0IDE1MSA3MSAxNTUgOTggMTU2IDc3IDYzIDEgMCAxMCAzNCA3IDcgMTAgOSA1IDYgMyAyIDQKKzQ3NzUgMjUwMCAzODMxIDkxMTYgNTE1NyAzMzU5IDI4MjggMTY2OSA3MTcgNTgxIDExNzYgNjQzIDUxNiA1MDUgMjgxIDUwNyA0MjMgOTU1IDE5MDggMTg0OCA4MTEgMTI3NiAxMjU2IDExNDAgODQ0IDgxNCAzMzEgNDUgMTQgMTE5IDE2MiA5MiA0OCAyMyAxNiAxMiAxMSAxNCAxNCAxMQorNTUzNzY2MCA1MDg0OTMxIDM5OTg2MTUgODIxMTI5NyA2MzYyNTQ0IDY5MjAzNjUgNzYwNzQ3MSA2MjI3OTI0IDM5NzM3MDkgMzIwNjEzNyA0NTE2NzA1IDM3ODIxODYgMjAzNjg1NSAxMzEyNTE2IDExNzMzNzQgNzkwNTY2IDY4NTA3NyA3MDU4OTUgNjYyNzU3IDExMTcwMjIgNTc0OTQ1IDExOTQxOTYgOTk4NzExIDEwMzY5MzYgNDg5MzM1IDY3MTkxMiAzMTMyMDkgMjI5NjQ5IDE0NTU0MSAyNzAxNzQgMjIyNjA5IDE5NTQwOSAxMzExOTEgNDgyMzEgMzQ1MTUgMjkzOTggMjk5MjYgNDE1NTYgNDA2NDAgMzAxNTgKKzM2IDEyIDQyIDYyIDMyIDExIDYgMyAxIDEgMyAxIDIgNiAyIDE2IDE1IDcyIDIyNSAxMDYgNzUgNDggNjIgNDggMTAxIDU3IDM5IDEgMCA2IDE2IDcgMyA0IDMgMiAyIDIgMiAyCiszODcwIDIwMzAgMzk0MyA3ODY5IDU5MjEgMzk3MCAxNzQ2IDE0OTYgMzM5IDY4MCAxMTA4IDM4MyAyOTYgMzA1IDE2NiA0ODAgNTI0IDExMDggMTg5NyAxMDIzIDYzMCAxMDk1IDk2OSA2MjcgNzExIDU2NSAxODUgMjcgMTMgNTEgODggNzAgNDggMjUgMTcgMTUgMTYgMTggMTYgMTYKKzU0OTgzNDggNDkwNDU2NSAzOTk5NTg4IDgyMDIwOTAgNjM1NTA2OCA2NzQ5MDY2IDc0NjIxOTQgNTk0NjE3NCAzODgzMTc3IDMwNTU1NTQgNDQzMjI3NiAzNTc4Nzk0IDE5OTM1NzQgMTI1MjUwNiAxMTQ4MzI1IDc3MjYyMyA2ODEzNjkgNzMxNjE1IDY5NDcwNCAxMTEyODUzIDU3NjY5NiAxMTg5ODIxIDk5ODU0OSAxMDEzMjQzIDQ5NTI5NCA2NjYzMTEgMzEwMTE5IDIxNzUyOSAxNDIyNDAgMjU3MDk3IDIxOTMwMSAxODc5ODUgMTI5MTQzIDQ2ODczIDM0MDg3IDI4NTU1IDI5NTg3IDQwMTY4IDQwMDM0IDI5MzMxCisyNCA4IDQ0IDQ2IDQyIDE2IDIgMyAwIDIgMiAwIDAgMiAwIDE1IDIzIDg4IDIxMCAzNCA0NSAzNSAzNyAxNSA3MyAyOCAxMiAwIDAgMSA1IDQgMyA1IDQgNCA0IDMgMyA0CiszMjUzIDE2NTggMzMyNiA2NDMxIDYyNzkgNDgxNSAzMDE1IDEwODYgNDk5IDY0NSA4NjAgNTM3IDM1MCA0MDMgMTU5IDQ1NyA2MTQgMTYyMyAxMDA0IDc0OCA2MjYgMTIzNSAxMDE4IDYyNyA2MDUgMzU3IDExMyAxNiAxOCA1NCA2MCA1NiA0NyAyMCAxOCAxOCAxNiAxNSAxNyAxNgorNTQ0NDI0NSA0NzEyMTY2IDM5ODQ3NjUgODEwNTA4OSA2MzU2OTMwIDY2Mzk5NjAgNzM1Mjk4MyA1NjU2MTM5IDM3OTg5OTUgMjkxMTg1NSA0MzQzNjE1IDMzOTcwNjcgMTk1Mjc1NCAxMjAyMTE4IDExMjM3MjMgNzU0MzQ0IDY4MDA1NSA3ODc0MzIgNzAzMDI2IDEwOTIwMzkgNTc4MzAxIDExOTQzMDkgOTk5NjQ0IDk5MDk3MiA0OTgzOTUgNjQ4MjY3IDMwNTI2NSAyMDU0NjAgMTM5MTQ5IDI0NDk4OSAyMTUzNjAgMTgwMTQ2IDEyNzEyMCA0NTI4OSAzMzY5NiAyNzk0NyAyOTI1NyAzODY3OSAzOTQ2OSAyODU1NAorMTcgNiAzMSAzMSA0NyAyNSA4IDEgMCAyIDEgMSAxIDQgMCAxNCAzMiAxNDIgNzkgMTkgNDUgNDUgNDAgMTUgNTMgMTEgNCAwIDAgMSAyIDMgMyA0IDUgNiA0IDIgMyA1CisyODg0IDEyMjQgMTMwNCAxMTUxIDIxNzggNDQ2NiAzNTgzIDE0ODcgOTU4IDYzNyA0NzYgNzQwIDQwMCAzNjYgMTc1IDQzNiA3NTUgOTQ3IDU5MSA1NDEgNDA3IDg1NyAxMDA2IDQwOSA0ODkgMjU4IDUzIDEwIDE3IDYyIDQ4IDc5IDYzIDE0IDEyIDE0IDExIDE1IDE0IDExCis1MzgyMDYwIDQ1MDQ2NDcgMzkxODYyNSA3Njg5NTE4IDYyNTM5MTQgNjUxNTk1OCA3MjYxMDE4IDU0MDgxNDIgMzcyODY0OCAyNzc2Mjg2IDQyNDczNTEgMzIzODcxNSAxOTE0MjMxIDExNTI0NzkgMTEwMDE0NCA3MzU4NzEgNjgyMzc4IDc5ODM2OSA3MDA1ODMgMTA1OTc1NyA1NzQyNjggMTE3NTMwNSAxMDAwNDA1IDk1NjY0NCA0OTg0NTMgNjI1MjIzIDI5ODk5OSAxOTM3NDcgMTM2MTA5IDIzNDA5OSAyMTEyMTAgMTc0MTkxIDEyNTU1NyA0MzQzMSAzMzE2MSAyNzEzMCAyODgwNyAzNzI3OSAzODg0MSAyNzUxNgorMTQgMyA1IDEgNSAyMiAxMSAzIDIgMiAwIDIgMSA0IDEgMTMgNDggNTUgMjggMTAgMTkgMjIgMzkgNyAzNCA2IDEgMCAwIDIgMSA2IDcgMiAyIDQgMiAzIDIgMgorMjQwOSAxMTUxIDIyMjUgNDE0NSAzMTI5IDI5MDIgMTk4NiAxMzc4IDEwMjMgNDk0IDQxNyA0ODQgMzAzIDE1OCAyODcgNzgxIDU3OSA0MDkgNTMxIDM3NyAyOTIgNDU2IDM4OSAxOTggMjQzIDIwNCA1MyAxMyAxNiA2NiAzNiA3NCA2NyAxNyAxNSAxNCA5IDEwIDExIDEyCis1MzA5Mjg1IDQzMDUwOTMgMzg3NzY3OSA3NDgyODI0IDYxNzc3ODAgNjMwMzMwOCA3MTMwNTI1IDUxNjgzMjcgMzY2MTcxOCAyNjQwMDY1IDQxNTE5ODIgMzA3NDEzNSAxODc0MTkwIDEwOTMwNDAgMTA4MDAxNyA3Mzk3MDMgNjgwMTQ0IDc3NTU5NiA2OTY2NjcgMTAxOTMzNiA1NjczOTYgMTEzMjgwNSA5ODUzNzUgOTExNDEyIDQ5MjIyMSA2MDAyNDQgMjkyODg5IDE4MjkyMSAxMzMxMjAgMjI0MTA4IDIwNjg1NyAxNjgyODYgMTI0MTM1IDQxODY5IDMyNzE2IDI2MzYyIDI4MzE3IDM1NjU2IDM4MTUyIDI2NjAyCisxMCAzIDE0IDE0IDEyIDEwIDMgMyAzIDEgMCAxIDEgMCAyIDQ0IDI4IDEwIDIyIDUgMTAgNiA2IDEgOCA0IDEgMCAwIDIgMCA2IDggMyAzIDQgMSAxIDEgMworMTc4OCA4NTkgMTM1NCAxNTI2IDE0MTggMjI0MSAxMjcyIDcyOSA0MzUgMzgxIDc3MSA1MTIgMjQ5IDM3NCA0NzMgNzc4IDM4OCAxNjYgMjk1IDI0NSAxNTcgMjI5IDI0MyAxNDQgMTAxIDEzMyA0NyAxMiAxMiAzMSAzNSA0NyA0MSA3IDExIDExIDEwIDEwIDExIDExCis1MjIyNDUzIDQwOTk1NzIgMzgxNTQ5MCA3MTI3NjI2IDYwNTk4MDkgNjA2MjgwNiA2OTg1MDM4IDQ5MDMwMjcgMzU4MTQyOCAyNTA1MDc1IDQwNjgwNDMgMjkyMTE1MCAxODMzNzY4IDEwNTA0MzcgMTA2NTE0NyA3NDMxMjEgNjczMDgzIDczOTI2MCA2ODY4MTYgOTczMjMwIDU1NzI0NSAxMDc4OTA4IDk2Njk4OCA4NjU1NzYgNDgyNTE1IDU3MjQwMiAyODY3NzggMTcyNjgzIDEzMDEwMyAyMTI1NjYgMjAyNTg3IDE2MTA3NiAxMjIwODQgMzk3ODcgMzIxODAgMjU0NTYgMjc4NjUgMzQxMzEgMzc0ODAgMjU2ODEKKzUgMiA1IDIgMiA2IDEgMSAwIDEgMSAxIDAgNSA4IDQzIDEzIDEgNyAyIDMgMSAyIDEgMSAyIDAgMCAwIDAgMCAyIDMgMCAyIDIgMiAxIDEgMgorMTcxNSA3OTUgOTM5IDE0NTcgNzcyIDE2MjggMTIyMSA2OTYgMzQwIDI5OSA2MjEgNDA0IDIzNiAzNDggMzMyIDI3NSAxNTEgMTEwIDMyMyAyNjAgMTM4IDIwNyAxNzMgMTE4IDEwNiA4MCAxOCA3IDExIDMzIDI2IDM2IDM1IDEwIDkgOSA4IDExIDkgOAorNTEzNTkyMiAzOTAyNDUwIDM3NDQyNDUgNjc4OTUwMCA1OTI4MjY5IDU3OTkwNzIgNjg0MTg3OSA0NjUxNjE3IDM1MDA3MTQgMjM3MzE0NiAzOTgyMzY1IDI3NzA3MDggMTc5NDAyMyAxMDA4NzkzIDEwNDcwNDQgNzE1NDMwIDY2MDE0MCA3MDE2NjQgNjc3OTI3IDkzMDgxMiA1NDY4NjEgMTAyNjg5MyA5NDcyNzEgODIwODkzIDQ3MzE3OSA1NDI5NzQgMjgwMDc5IDE2Mjc1MiAxMjcxMzYgMjAxODM5IDE5ODE5NCAxNTM2MjMgMTE5OTMxIDM4MDE0IDMxNjA2IDI0NDgxIDI3MzczIDMyNzU5IDM2Nzc0IDI0NjMxCis1IDEgMiAyIDAgMyAxIDEgMCAwIDEgMCAwIDQgNCA1IDIgMCA4IDMgMiAxIDEgMCAxIDAgMCAwIDAgMCAwIDEgMiAxIDEgMSAxIDEgMSAxCisyMTAxIDg4OSA3NDEgMTEwOSA3OTYgNzQxIDk0NSA2MDQgMjc0IDc5IDI0MyAyMzAgMTYyIDE4NSAxNjMgMTMyIDExMCAxNDAgMTk3IDI5NiAxMTEgMTM1IDE3MCA1MSA3NSA1NyAyNSAxNCAxMSAxNSAxMSAxNiAxNCA5IDEwIDExIDkgMTAgOSA5Cis1MDYxNDE4IDM3MjI5MzAgMzY2OTcxNyA2NDUwMjgwIDU4MDA2MjcgNTQ5NjY2NyA2Njk1MjM5IDQ0MDk2MzkgMzQyMDMyOCAyMjM1NjE2IDM4ODkxNjMgMjYxODYwMiAxNzUzMzc5IDk1OTYzMyAxMDI1MDcyIDY4MDYxNSA2NDY0NzIgNjY4MTY3IDY2NjAzOSA4OTMxNTEgNTM2MDQ2IDk3MzU3NSA5Mjc5NjkgNzc0Nzc0IDQ2MzI4NCA1MTM4OTggMjczNzI2IDE1Mzg0NyAxMjQyNDMgMTkwNjUwIDE5MzUyNyAxNDUzODggMTE3Mjk0IDM2Mjg2IDMxMDcyIDIzNjg4IDI2OTE5IDMxNDA3IDM2MDg2IDIzNzA2Cis4IDIgMSAxIDAgMCAwIDAgMCAwIDAgMCAwIDEgMSAxIDEgMSAzIDQgMSAwIDEgMCAwIDAgMCAwIDAgMCAwIDAgMCAxIDEgMyAxIDEgMSAyCisxODQzIDkyOCAxMTQ1IDE0NjAgOTIyIDU0MiA0MzcgMTQwIDY0IDc1IDEyNyAyMjUgMTM0IDExMSAxMTQgNTUgNTQgMTc3IDE0MyAxMTMgMTI3IDcwIDc5IDE5IDM4IDI3IDE1IDE2IDExIDExIDE3IDE4IDE1IDEwIDcgOCAxMiAxMyA5IDgKKzQ5ODIxNzkgMzU1NjU3NyAzNjA3Mzc3IDYxNTI5NzcgNTY3OTM5MiA1MjAwMTc5IDY1MzkyNzQgNDE1MzY3MiAzMzM2NTgxIDIxMDYwOTIgMzc5NTMyMiAyNDc1MzE1IDE3MTMwMzQgOTA4ODc2IDEwMDIzOTYgNjQzMTU4IDYzMTcxNCA2Mzg5NTMgNjUzMDY3IDg0NjUwNiA1MjU5MTAgOTE5NDYzIDkwNjgyMyA3Mjk0NTYgNDUyNjkwIDQ4NDcyNCAyNjcyNzYgMTQ1NTk5IDEyMTQyMiAxNzk4ODcgMTg5MTMwIDEzNzc3MCAxMTQ3NDkgMzQ3MjMgMzA0NzUgMjI3NTggMjY1NTMgMzAzMjEgMzU0MTUgMjI3NzUKKzYgMyA0IDIgMSAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAzIDEgMCAyIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEgMCAxIDMgMyAxIDEKKzE1ODEgMTEzMSA3NjEgNjUzIDc1OCA1MzAgMzA5IDI0NCAxNDEgNDEgOTUgMTExIDc1IDEwNyA5MiA0MSA2MiA5NiA2NSA4MiA1MyA1NCA5OSAyMCAxMiAxOSAxMiA5IDEwIDE0IDE4IDE1IDggMTAgNiA4IDEwIDggOCA5Cis0ODk4MjIxIDM0MTI2NzYgMzUzNjc3NyA1ODIzOTMyIDU1NTY5OTEgNDkyMDc0MiA2MzgzOTMwIDM5MTk0NTIgMzI1Njg5MiAxOTgyMjUwIDM3MDMwMDYgMjMzMzYyMSAxNjcyMTg4IDg2MDkxOSA5Nzk3MjQgNjA3MDg5IDYxNzUyOSA2MDY1MTUgNjM4NDI1IDgwMDc1NSA1MTQxMzYgODY3NjE1IDg4NjcxNiA2ODY5MTkgNDQxNjk2IDQ1NjgwOSAyNjA5MTAgMTM3NDE2IDExODY0NiAxNjk5NTQgMTg0ODY4IDEzMDQyNSAxMTIwODggMzMyNTQgMjk4NjcgMjE4ODQgMjYxNDUgMjg5OTMgMzQ3MzUgMjE5NjEKKzUgNCAyIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEgMCAxIDIgMSAwIDIKKzEzODUgMTA4MiAzOTMgMzY0IDI1NSAzNDQgMTY4IDEzMSAxMzcgNDMgNDAgNjUgMjMgMjUgNTEgMzAgMjIgNDUgMzUgNTQgMzggMzEgNjUgMjMgMTIgMTggMTEgOCAxMCAxMiAxMyAxNCA5IDEzIDkgNiA3IDcgOSAxMAorNDgxMTM0OCAzMjc0Mzk5IDM0NTg1MzMgNTQ5Njg3MyA1NDI0Nzg4IDQ2NDY2NDMgNjIyODg2MCAzNjkyMzQyIDMxNzkwOTEgMTg2NTk2MSAzNjExNTg4IDIxOTc2MDIgMTYzMTAzMiA4MTA4MDEgOTU2NTcwIDU3MjUwOCA2MDI2NzUgNTcyODkwIDYyMzM4MiA3NTYwMjkgNTAyMjcyIDgxNzQ2NCA4NjYyNDIgNjQ3MTE4IDQzMDk3NiA0MzA1MDcgMjU0Njc3IDEyOTY2MiAxMTU5MzkgMTYwNDk0IDE4MDU4NSAxMjM0NTkgMTA5NTE5IDMyMDU3IDI5MzUxIDIwOTM5IDI1NjcxIDI3NjgzIDM0MDk3IDIxMjU3Cis0IDQgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAyIDEgMSAxIDEgMSAyCis2NTAgNzkzIDU1OCAyMDAgMjAyIDI1OCAxMDQgOTQgOTggMzUgNDAgNTUgMzQgMTkgMzEgMjggMTkgMTcgMjYgNjQgMjIgMjUgMzcgMjYgOCAxMiAxMyAxMCAxMyAxNyAxMiAxNCAxMCAxMSAxMSAxMCAxMCA3IDggNworNDcwNzg1NiAzMTI2NjYyIDMzODY0NjAgNTE3OTM2MSA1Mjk0NTMwIDQzODM3MDYgNjA3NjAyNSAzNDc2NTg1IDMxMDIyMzUgMTc1NjE1OCAzNTIyNDUzIDIwNjkxMzAgMTU5MTE4NSA3NjMzMjIgOTMzNDgzIDUzOTg3OSA1ODgxMTUgNTM5NTYyIDYwODQ4NCA3MTQ2MDEgNDkwMjk1IDc2OTk1NCA4NDU1NjMgNjA5ODg5IDQyMDQyMSA0MDU0MTQgMjQ4NjUxIDEyMjQ5NiAxMTMzNzcgMTUxOTA5IDE3NjM4MyAxMTY5MTEgMTA3MDQwIDMwODA5IDI4ODk5IDIwMjk3IDI1Mjg1IDI2NDUyIDMzNDUwIDIwNDExCiswIDIgMSAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAyIDIgMyAyIDEgMSAxCiszNzYgNzIyIDQzOCA5MSA0NCA0MCA0OCA1MyA0MiAyMCAzMiAyOCAxMyAxMyA4IDEyIDE1IDI0IDE1IDM2IDE0IDE5IDExIDE4IDExIDEzIDcgMTAgMTMgMTUgMTMgMTMgMTQgMTAgOCA5IDEyIDggOCA4Cis0NTk5OTQzIDI5ODM0MjcgMzMxMzExOCA0ODc0MjAyIDUxNjM0ODUgNDEyMzE1MSA1OTI1NTczIDMyNzEyNTQgMzAyNTg2NiAxNjUyMDIxIDM0MzUzMzggMTk0NjcwNyAxNTUxNzk1IDcxODMyMyA5MTAzODQgNTA4MjI0IDU3MzgxNyA1MDg2NjQgNTkzNjc3IDY3MzkzOCA0Nzg0MTMgNzI0OTI1IDgyNDczNiA1NzQ0MDMgNDEwMjA3IDM4MTg4OCAyNDI2MjIgMTE1NzYwIDExMDg3OSAxNDM3MTYgMTcyMzEyIDExMDY5NSAxMDQ3MjUgMjk1NzQgMjgzODIgMTk2MzIgMjQ5NjAgMjUzNTYgMzI4MTkgMTk2NzcKKzAgMiAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDEgMSAyIDMgMSAxIDIKKzMwMSAzNjUgMjQ3IDY3IDI5IDM3IDM0IDI1IDcgMTQgMjEgMTAgOCA4IDEzIDggMTUgMTkgMTkgMjEgMTUgMTEgMTEgOSAxNCA5IDcgOSAxMSAxNCAxNCAxMiAxNiAxMyA3IDYgOCA3IDUgNgorNDQ5MjgwNyAyODI2ODUzIDMyMzY3MjUgNDU4NTg3OCA1MDM1MzI4IDM4NzgwNDUgNTc3ODUxOSAzMDc2NTIyIDI5NTA1MDkgMTU1Mzc2MyAzMzUwMTE3IDE4MzA1MjMgMTUxMzI2MSA2NzU3MTYgODg3OTkwIDQ3ODIyMyA1NTk4NzYgNDc5MzEyIDU3OTM0MiA2MzQ3OTMgNDY2ODUzIDY4MjEwNyA4MDQ0MjggNTQwNDkzIDQwMDMyNCAzNTk1MjggMjM2NzQ0IDEwOTM2NyAxMDgzOTIgMTM1OTUzIDE2ODM2OCAxMDQ3OTAgMTAyNTE5IDI4NTk4IDI3ODUyIDE4ODIyIDI0NTQxIDI0MjY0IDMyMTI3IDE4ODY1CiswIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAzIDAgMSAxIDEgMCAxCisxNjMgODcgNzUgNzQgMzcgNTAgNDQgMTQgMTMgMTYgMjYgMTggMTcgMTQgMjAgMTYgMTcgMTYgMjUgMjMgMTMgMTIgMTQgMTMgMyA3IDEyIDEyIDE3IDE3IDEyIDE0IDEwIDEwIDggMTAgOSA4IDggNQorNDM4NDgxOCAyNjYyNTkzIDMxNTc4NDIgNDMxNTI4MiA0OTEwNTc1IDM2NDg0NDMgNTYzNTM5MiAyODkyNzk4IDI4NzcxODYgMTQ2MTUyNCAzMjY3MTUxIDE3MjE4MDEgMTQ3NTkxOSA2MzYwMzQgODY2MzM0IDQ1MDUxMyA1NDYzMzQgNDUxNTM3IDU2NTUxOCA1OTgxMjAgNDU1NTMxIDY0MTkxOSA3ODQ3MDQgNTA4ODYzIDM5MDQwNyAzMzgzODcgMjMxMTQwIDEwMzU0MiAxMDYxMjAgMTI4ODQwIDE2NDQ3MSA5OTM2MiAxMDAyMTUgMjc0OTYgMjczNjEgMTgzMDcgMjQxNTggMjMyOTkgMzE1MjkgMTgwNDAKKzAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDIgMSAzIDIgMSAxIDAKKzMzIDM1IDIwIDE5IDQwIDYxIDM2IDE2IDUgOCA4IDEyIDEzIDggOSAxMSAxMSAxNCAxNCAxMSA3IDE0IDkgOSA5IDggOCAxMyAxMiAxNiAxMSAxMiA5IDkgOCA5IDkgNyA3IDkKKzg0MyAyMTUwIDUxMSAxMTY3IDEwMjIgMzc0NyA5MjAgOTgzIDEyNyA0OTEgMjA0IDczNyAzMzIgNDkxIDIzMCA2NzUgMjgxIDg2MCAzNTcgNjc1IDE3OCA4NjAgMjMwIDU1MiAyMzAgNDkxIDIwNCA3OTggMzA2IDk4MyAyODEgNzM3IDIzMCA1NTIgMjA0IDU1MiAyMzAgNDMwIDE3OCA1NTIKKzE3OSAxNjggODggNzIgMjI3IDI5NyAyMDAgNTMgNiAxNCAxNSAzMSAzOSAxNCAxOSAyNiAyOCA0MSA0NSAyNiAxMSA0MSAxOSAxOCAxOSAxNCAxNSAzNiAzMyA1MyAyOCAzMSAxOSAxOCAxNSAxOCAxOSAxMSAxMSAxOAorMjIgMjEgMTUgMTMgMzMgMzAgMzEgMTUgMTIgNyA3IDYgNyA2IDUgNCA3IDggMTMgOCA3IDQgNSAxMyAxMiA3IDYgNiAxMSAxMyAxMSAxMSA4IDExIDEwIDcgNiA3IDggNQorMTM4NCAzMzExIDg4MSAxODk1IDE4NDAgNTM2NSAxNjg5IDE4NDUgNDMwIDg5MSAzNzcgMTA2MSA1MDIgODMwIDM1MiA4ODAgNDUyIDEyOTkgNjgwIDExMjYgMzUyIDEwNTQgMzUyIDEzMTcgNTMxIDg5MSAzNTIgMTExOCA1NzkgMTcyMiA1NTUgMTM2OCA0MjggMTE5NCA0NTQgOTQ4IDM3NyA4MzQgMzc4IDgyNgorOTEgNjQgNDcgMzAgMTYwIDk2IDE0OSA0MCAzMyAxMCAxMSA3IDExIDcgNSAzIDExIDEyIDM3IDEzIDExIDMgNSAzMyAzMiAxMCA4IDcgMjcgMzEgMjcgMjMgMTQgMjQgMjIgMTAgOCAxMCAxNCA1CisxOCAxNSA5IDkgMjIgMjEgMjQgMTUgNyA0IDYgNCA3IDUgNyA1IDcgNSA5IDEzIDEwIDcgMTEgMTAgMTEgOSA2IDkgMTIgMTAgOSA4IDkgMTAgNyA4IDEwIDggNSA1CisxODA5IDQwMzMgMTA4OSAyMzM0IDIzNTYgNjMzMyAyMjYwIDI2NTUgNTk4IDEwODMgNTIwIDEyNDMgNjY4IDEwODcgNTIyIDExMzQgNjE5IDE1MjggODkzIDE4NTcgNTk4IDE0MjAgNjI0IDE4NTIgNzk4IDEzOTAgNDk2IDE2MDMgODcxIDIyMzMgNzcxIDE3NzcgNjQ3IDE3MzYgNjIxIDEzODIgNjIzIDEyNzUgNDk2IDEwODMKKzU4IDI5IDE2IDEzIDgwIDQzIDk0IDM2IDEwIDMgOCAzIDEwIDUgMTEgNSAxMCA0IDE3IDMwIDIyIDkgMjYgMTggMjYgMTUgOCAxNSAzMCAxNyAxNyAxMSAxNyAxOCAxMCAxMiAyMiAxMiA1IDUKKzI3IDI3IDE2IDE0IDIwIDI3IDI0IDEzIDcgOSA5IDUgMTAgOCA1IDYgNiA3IDEwIDEyIDcgNyA2IDkgNSA0IDYgMTAgOSAxNCAxNSAxMCAxMSAxMCA4IDEwIDggOCA4IDYKKzI0NTQgNTQ0OSAxNDcwIDMwNTQgMjgwOCA3NjExIDI4MTcgMzI5NCA3NjIgMTU3MCA3MzcgMTQ3NSA5MDYgMTUxMyA2MzYgMTQzNCA3NTYgMTg2NiAxMTI2IDI0ODIgNzYyIDE3NjQgNzYxIDIyOTMgOTA1IDE1NTIgNjM2IDIxMjEgMTA3OSAyOTU5IDExMzUgMjI4NCA5MTIgMjI0NiA4MDkgMTkxMyA4MTEgMTY5MCA2ODggMTM4NgorMTExIDc5IDQ5IDI5IDYyIDYyIDg3IDI0IDEwIDE1IDE3IDQgMjEgMTIgNSA2IDcgOCAyMCAyMyAxMCA4IDcgMTMgNSAzIDcgMTcgMTYgMzAgNDUgMTYgMjUgMTcgMTMgMTcgMTMgMTEgMTQgNworMjIgMzkgMjcgNyA3IDI2IDI3IDE1IDkgOCA3IDUgOCA5IDkgMTMgMTAgMTIgMTUgOCA0IDkgNCAzIDQgNSA2IDkgOSAxMSAxMiAxMyAxMSAxMSAxNCAxMSAxMCA5IDYgNQorMjk1NSA3NTE4IDIxMjMgMzMwMCAyOTE2IDg3NTEgMzQzNiA0MDE3IDk3MyAxOTY3IDg5NyAxNjkzIDEwODcgMTk3NSA4NTAgMjE0NiA5OTIgMjQ5MSAxNDgxIDI4MjQgODQ1IDIyMTEgODQ0IDIzMzkgOTg0IDE3NjYgNzczIDI1NDYgMTI4MiAzNDU3IDE0MTMgMjk0NSAxMTcwIDI3ODcgMTE0NiAyNDc0IDEwNDYgMjE0MSA4MjQgMTYxMAorNzMgMTIwIDExNSA3IDcgNTEgOTkgMjkgMTYgMTEgMTAgNCAxMyAxNCAxNyAyOSAyMCAyMyA0MyA5IDMgMTMgMyAxIDMgNCA3IDEzIDE2IDE3IDI3IDI1IDI0IDE4IDM5IDE5IDIwIDE0IDcgNAorMTYgMzEgMjIgMTQgMTQgMTkgMTMgMTEgMTIgMTAgMTMgMTIgMTAgNSA0IDggNyA0IDEyIDkgNiAxMyAxMCA2IDUgOCA2IDcgNyA5IDkgMTEgMTAgMTEgOSA3IDcgOCA2IDYKKzMyOTAgODk3MSAyNjMyIDM5NjIgMzIwMSA5MzkzIDM2ODIgNDQ1MSAxMjU1IDI0NjMgMTIwNiAyMzI4IDEzMTUgMjE2MyA5MzEgMjUwOCAxMTQ2IDI1ODcgMTc1MCAzMjA3IDk3NyAyODc3IDEwNzggMjU2NyAxMDg3IDIxNTEgOTA3IDI4MjMgMTQyOCAzODAyIDE2MDcgMzQ0NCAxMzk2IDMyOTUgMTM0NyAyNzU1IDExOTggMjUwNCA5NTYgMTg4MgorMzcgNzIgNzcgMjYgMjggMjYgMjMgMTUgMjggMTYgMzMgMjQgMTkgNCAzIDEwIDkgMiAyNiAxMSA3IDI2IDIwIDUgNSAxMSA3IDcgOSAxMSAxNSAxNyAxOSAxNyAxNSA3IDkgMTAgNyA2CisxNSAxNyA2IDE2IDE2IDYgMTEgOCA3IDExIDggNiA2IDYgMyA3IDQgNCA1IDUgNSA1IDUgNyA4IDExIDYgNCA3IDggOCA5IDExIDkgMTAgNyA3IDcgNiA2CiszNTkxIDk0NzcgMjcxOSA0NzA3IDM1MzAgOTE5OCAzODcxIDQ2NzUgMTQwMiAyOTkxIDEzODAgMjU1NiAxNDM1IDI0MDEgOTg0IDI3ODcgMTIxOSAyNjc3IDE4MzQgMzMyMSAxMDgwIDMwMTEgMTE3OCAyODQzIDEyNjQgMjY5NyAxMDM3IDI4OTkgMTU3MSA0MDY1IDE3NzEgMzc5MCAxNjQyIDM2NTAgMTU2OCAzMDE5IDEzNDcgMjc4MyAxMDg1IDIxMzcKKzMxIDIwIDUgMzAgMzYgMiAxNiA3IDkgMTggMTIgNSA2IDUgMSA3IDMgMiA0IDMgNSAzIDUgNyAxMiAxOSA3IDIgOSA4IDExIDExIDIyIDExIDE4IDcgOSA3IDcgNgorNyA5IDggMTggMTQgMTkgMTkgMTAgMyA2IDggOSA5IDggNyA3IDcgMTEgNyA4IDcgNSA3IDggNSA2IDcgNiA5IDggMTEgMTMgOSA5IDcgNyA2IDggOCA2CiszNjgwIDk0NjEgMjg1NSA1NTMwIDM3OTkgOTgxMyA0MjYwIDUwMDggMTQ0MyAzMTgwIDE1NTAgMjk1NSAxNjI5IDI3NDggMTEzOCAzMDQ5IDEzNjcgMzE5MiAxOTY3IDM2MTMgMTIzMSAzMTM3IDEzMjcgMzE2MyAxMzYwIDI5MDMgMTE5MCAzMDkzIDE3NjEgNDMxMiAyMDA3IDQzNjEgMTgzMSAzOTgzIDE3MDcgMzI2NyAxNDY2IDMxMDcgMTI2MiAyMzc3Cis2IDUgOSAzNSAyNiAyNSA0NiAxMSAxIDUgMTIgMTIgMTUgMTAgOSA3IDkgMTcgOCA4IDkgMyA5IDkgNCA1IDkgNSAxNCA4IDIxIDIxIDE0IDEwIDkgNyA2IDkgMTIgNgorMTAgOSA2IDE3IDEwIDcgOCA3IDQgMTAgNiAzIDYgOCA3IDQgNSA3IDcgNiA1IDggOCA1IDUgNSA1IDMgNCA3IDEwIDEwIDkgMTEgNiA3IDUgNiA2IDUKKzM4NDMgOTQ0NiAyOTM3IDYyNDIgMzk1OSA5NjU0IDQzNTggNTEzNyAxNTA5IDM2MDMgMTY2NCAyOTYyIDE3NDEgMzA3NCAxMjg4IDMxMTEgMTQ2MCAzNDMwIDIwOTYgMzc2NCAxMzI4IDM0NDAgMTQ5OCAzMjgwIDE0NTMgMzAzNiAxMjg4IDMwOTEgMTgxOSA0NDgzIDIyMTIgNDcxMyAyMDE1IDQ0MTkgMTgxNyAzNTAxIDE1NTcgMzI4OSAxMzgzIDI1NDEKKzEzIDUgNSAyOSAxMyAzIDggNSAzIDEzIDYgMSA2IDkgOSAyIDQgNyA4IDQgNCA5IDEyIDMgNCAzIDQgMSAyIDYgMTcgMTIgMTQgMTUgNiA2IDQgNSA3IDQKKzYgNSAzIDggNyA0IDYgNSAzIDUgNiA1IDQgNSA0IDMgNCA4IDYgNCA1IDcgNyA3IDUgNyA3IDYgNiA2IDcgOSA5IDEwIDUgNSA2IDUgNyA1CiszOTAwIDkxODYgMjk0MCA2MzU4IDQwMzkgOTMyMCA0NDAyIDUxMzUgMTU0OCAzNjk0IDE3NzUgMzA5MSAxNzk5IDMxOTYgMTM1OCAzMTA4IDE1MjUgMzcxNSAyMTk3IDM3ODMgMTQyMiAzNjYzIDE2MzkgMzUxMyAxNTQ0IDMyODMgMTQzNCAzMjc0IDE5MjYgNDU4MiAyMzM1IDQ5ODMgMjE5NCA0NzY4IDE4OTkgMzU5OCAxNjcxIDMzOTggMTUyNyAyNjk1Cis0IDEgMSA2IDYgMSA0IDIgMSAzIDYgMyAyIDMgMyAxIDMgOCA2IDIgNCA2IDkgNiA0IDcgOSA1IDYgNCA4IDkgMTMgMTIgNCAzIDYgMyA5IDMKKzMgMyA3IDEzIDE2IDkgMTEgNiA0IDYgOCA1IDMgNCA1IDUgNSA2IDYgNyA3IDcgNSA2IDggNyA4IDkgMTIgMTEgOCA4IDggOSA4IDkgOSA5IDggNgorMzg3OSA4ODE5IDMwNDUgNjc3NSA0MzQ3IDkzMTMgNDU3MyA1MTk1IDE2MTEgMzg0MCAxOTM1IDMyMTIgMTgzMCAzMjQ5IDE0NTEgMzIyOCAxNjE0IDM4NjAgMjI5NSAzOTg2IDE1NjUgMzg3MyAxNzI1IDM2NzAgMTcwOSAzNTE2IDE2MDIgMzYzMCAyMTg0IDQ5ODIgMjQ4MSA1MTc1IDIzNDMgNTAzNCAyMDU2IDM5MzUgMTg1OSAzNzQ3IDE2OTMgMjkwMQorMSAwIDcgMTUgMzIgNSAxNCA0IDMgNCAxMSAzIDEgMiA0IDMgNCA0IDYgNiA5IDYgNCA0IDExIDYgMTIgMTEgMjQgMTQgMTAgNyAxMCA5IDExIDEwIDE0IDExIDExIDUKKzEwIDkgMyA2IDcgMTAgOCA1IDQgNCAyIDYgMTAgNyA5IDYgNyA3IDcgMTAgMTAgNyA2IDUgNSA4IDcgNiA1IDggOCA5IDggMTAgMTAgMTMgOSA4IDggNgorNDAzNyA4ODQyIDMwNDUgNjczNyA0NDE3IDkzNjggNDY2MyA1MTkwIDE2NzMgMzg1NSAxOTM3IDMzODcgMjAzOSAzNDg0IDE2NDQgMzQwMiAxNzUyIDQwNTggMjQxNiA0MzYxIDE3ODEgNDA3MCAxODM1IDM3NTYgMTc5NCAzNzk2IDE3NDAgMzc4MCAyMjU3IDUxNzQgMjYyMyA1NDE3IDI0ODkgNTM0NiAyMjYwIDQ0OTcgMjA0MiA0MDEzIDE4NTUgMzA5NQorMTMgNiAxIDMgNiA3IDcgMiAyIDIgMCA1IDE3IDYgMTUgNSA5IDYgOCAxMiAxOCA2IDYgMyA0IDggOSA0IDQgNyAxMCA4IDEwIDExIDE2IDIxIDE0IDggMTEgNQorOCA5IDMgOSA2IDcgNyA0IDQgNSA1IDMgOCA3IDQgNyA1IDQgNiA3IDYgNyA2IDUgNiA0IDggOSA3IDggOCA5IDcgNyA5IDggNiA5IDYgNQorNDE0MCA4ODY0IDMwNDUgNjg4NSA0NDYwIDkyMzYgNDcyNSA1MTI0IDE3MzMgMzkzMCAyMDE2IDMzNjggMjE5MiAzNzA1IDE3MDUgMzYyNyAxODM2IDQwNjAgMjUwOSA0NTI5IDE4ODkgNDI1NSAxOTQyIDM4MzcgMTkwMiAzODEzIDE5MDEgNDEwNiAyMzc5IDUzNTUgMjc2MiA1NjQ0IDI2MDUgNTQ1NSAyNDMzIDQ3MTggMjE0NCA0MzI1IDE5NjIgMzIxNgorOCA2IDEgNyA0IDMgNSAxIDIgMyA0IDEgMTAgNiAyIDYgNCAyIDUgNiA2IDYgNiAzIDYgMiAxMSAxMCA4IDcgMTAgOCA3IDUgMTMgNyA2IDEwIDYgMworMSAyIDQgMTIgOCA3IDUgOCA2IDQgNCA2IDUgNiA1IDIgMyA1IDQgNiA3IDggNSA2IDUgNSA1IDggNyA5IDEwIDcgNyA2IDcgOSA4IDkgNiA0Cis0MDYyIDg0NTUgMzA3MSA3MjA5IDQ1NTMgOTExMSA0NzM0IDUzMDggMTg0MyAzOTM5IDIwNjcgMzUzNCAyMjY1IDM4NTEgMTc5MCAzNTMyIDE4NjYgNDEyMyAyNTQ4IDQ2MjUgMjAyMCA0NDkxIDIwMjEgMzk3NSAxOTgyIDM4OTEgMTk4MSA0MzUxIDI0OTggNTU4NiAyOTQ4IDU3MzUgMjcxOCA1NDk2IDI1NTEgNDk4NyAyMjk0IDQ2MTggMjA2NiAzMjY4CiswIDAgMiAxMiA3IDMgMyA3IDYgMiAyIDUgNCA0IDQgMCAxIDMgMiA0IDggNyA0IDQgNCAzIDQgOCA4IDggMTUgNSA3IDMgNyA5IDEwIDkgNiAyCisyIDUgNyAxMSA3IDMgNSA0IDMgMiA0IDQgNyA2IDcgMiA1IDYgNCA0IDcgNiA1IDkgNCA1IDUgNyA2IDggMTAgOCA2IDUgOSA4IDggNyA2IDUKKzQwMTEgODI1NCAzMTczIDc0NTIgNDYxOCA4NzQ4IDQ3NDMgNTIzNSAxODczIDM4MjUgMjExNyAzNTY3IDIzODcgMzk4OCAxOTI0IDM0NDIgMTk0NyA0MjQ0IDI1ODYgNDU5MyAyMTQ4IDQ1OTAgMjA5OCA0Mjg5IDIwMzQgMzk2NCAyMDU5IDQ1MjAgMjU4OSA1NzQyIDMxMzAgNTg4MiAyODAzIDU0NzMgMjcxNyA1MTc5IDI0NDEgNDc3MCAyMTY3IDMzNzkKKzAgMiA3IDEwIDUgMCAzIDEgMSAwIDIgMiA4IDQgOCAwIDQgNCAyIDEgOCA0IDQgMTAgMiAzIDQgNiA1IDYgMTQgNiA1IDIgMTIgNyAxMCA1IDYgMworNSAyIDcgMTAgOCA4IDUgNiAzIDIgMyAyIDYgNCA0IDYgMyAyIDIgNSA1IDggNSA4IDYgNiA2IDggNyA3IDYgOCA3IDYgNSA1IDYgNyA2IDUKKzQwMzggNzg4MSAzMjcyIDc2MTkgNDcwNyA4NzE0IDQ3NTIgNTI4OSAxOTAyIDM3MTggMjE0MCAzNDc1IDI0ODAgMzk5NCAxOTc4IDM2MDQgMTk3NSA0MTEyIDI1NzIgNDYyNCAyMjIyIDQ4MDYgMjE3MyA0NTIzIDIxMzYgNDA5NCAyMTYwIDQ3NDAgMjcwMyA1ODI3IDMyMDUgNjAyMCAyOTExIDU1MTMgMjc3NiA1MTc1IDI1MzMgNDkxMyAyMjY2IDM0ODMKKzMgMCA3IDggNyA0IDMgNCAxIDAgMSAwIDUgMiAyIDUgMSAwIDAgMyA0IDcgNCA3IDYgNCA2IDcgNyA1IDUgNiA3IDMgMyAyIDUgNSA2IDMKKzggNiA2IDkgOCAxMCA2IDYgNCAzIDMgMiA2IDUgNCA1IDQgMyA0IDYgNSA3IDQgNiA3IDggOCA5IDUgNCA2IDcgNyA4IDYgNyA2IDcgNiA3Cis0MTQxIDc3NzYgMzM0MyA3NzE0IDQ3OTMgODgwNSA0Nzg2IDUzNDAgMTk1NiAzNjc5IDIxNjMgMzM4OSAyNTcxIDQwNjEgMjAzMCAzNjk0IDIwMjcgNDA0OSAyNjEwIDQ3MTUgMjI5NCA0OTQ3IDIyMjEgNDYyMCAyMjYxIDQzMzkgMjMxMCA1MDA4IDI3NjMgNTcyMyAzMjc4IDYwODggMzAxNyA1NjczIDI4NjAgNTI5NCAyNjIzIDUwNDggMjM2MiAzNzA0Cis4IDMgNSA2IDcgNyA0IDQgMiAxIDEgMCA1IDMgMiAzIDIgMSAyIDQgNCA1IDIgNCA4IDggMTAgOSAzIDEgNSA1IDcgNiA1IDUgNSA1IDYgNgorNSA2IDggNSA1IDUgNSAzIDUgNiAzIDYgNSA0IDMgNyA2IDQgNSA2IDYgNSA1IDYgNiA0IDUgOCA0IDQgNiA2IDYgNyA3IDYgNyA2IDYgNgorNDE2NSA3Njc4IDM0NjQgNzU1OCA0ODAxIDg1ODMgNDc5NCA1MjAzIDIwMzQgMzgyNiAyMTg1IDM1NTQgMjYzNCA0MDYzIDIwNTYgMzkwMiAyMTI5IDQwNTEgMjY3MiA0ODAwIDIzOTAgNDk1NyAyMjkzIDQ3MTEgMjM1NyA0MzI0IDIzODAgNTE5OSAyNzk2IDU2MjUgMzM0OSA2MDkxIDMwOTUgNTc2MiAyOTY3IDUzNDQgMjczNiA1MTEzIDI0NTYgMzg1MAorMyAzIDkgMiAyIDEgMiAxIDQgNCAxIDUgNCAyIDEgNiA2IDIgMyA0IDUgMiA0IDQgNiAyIDQgNyAyIDEgNSAzIDUgNSA3IDQgNyA0IDUgNAorNSAzIDkgNyA3IDYgNyA0IDUgMyA0IDggNyA2IDQgNSA0IDYgNSA0IDUgNCAzIDggOSA0IDUgOCA2IDYgNyA2IDcgNyA3IDQgNyA2IDYgNQorNDE4OCA3NDAxIDM2MDcgNzUzNCA0ODYwIDg0MzYgNDg1MyA1MTM2IDIxMTEgMzc4MCAyMjMyIDM4MzIgMjc0NyA0MTg3IDIxMDYgMzk3NSAyMTc4IDQxNzYgMjczMyA0NzU3IDI0NTggNDkwNSAyMzEyIDQ5MTkgMjUyOCA0MzEwIDI0NDggNTM3OCAyODc5IDU2NTYgMzQ0NCA2MDk0IDMxOTYgNTg0NiAzMDcxIDUyNjkgMjg0NiA1MTc0IDI1NDggMzkyNgorMyAwIDExIDQgNSAyIDUgMSA0IDEgMiA4IDcgNCAyIDMgMiA0IDMgMSA0IDEgMSA3IDEzIDIgNCA3IDUgMyA2IDMgNyA1IDcgMSA3IDQgNSAzCis1IDMgOSA3IDYgNCA2IDUgNCA2IDQgNSA1IDUgNCAzIDQgOCA0IDMgNCA2IDUgNyA5IDYgNSA3IDggOCA3IDYgNiA4IDggNSA3IDYgNyA1Cis0MjExIDcxNDEgMzc0NyA3NTEyIDQ4OTIgODE3NSA0ODg1IDUxMzUgMjE2MCAzOTIxIDIyNzggMzkwOSAyODA2IDQyNDIgMjE1NSAzOTIwIDIyMjUgNDQxNiAyNzY3IDQ2NTUgMjQ5OCA0OTc5IDIzODIgNTA1MyAyNjk0IDQ0MjAgMjUxNCA1NDg1IDMwMTEgNTgwOCAzNTM2IDYwOTYgMzI2OSA1OTg2IDMxOTggNTI2MCAyOTUzIDUyMzIgMjY2MyAzOTk3CiszIDAgMTEgNCA0IDEgNCAyIDIgNCAyIDMgMyAzIDIgMSAyIDggMiAxIDIgNCA0IDUgMTIgNCA0IDUgOSA2IDYgMyA1IDYgOSAyIDcgNCA3IDMKKzggNCA0IDkgOCAxMiA4IDYgNSA5IDUgNSA0IDUgMyA2IDUgNSA3IDUgNCA3IDYgNyA4IDkgOCA4IDggNiA2IDEwIDggNyA3IDYgNSA1IDYgNQorNDMxMCA2OTU4IDM3NTUgNzYxNCA0OTc0IDg0MjEgNDk2NyA1MTk1IDIyMzMgNDIzOCAyMzQ4IDM5ODEgMjgzOCA0Mjk0IDIxNzcgNDA1MyAyMjk3IDQ0NTggMjg3NiA0NjgyIDI1MzcgNTExMCAyNDc1IDUxNzkgMjgzMSA0NzA3IDI2NTUgNTY0NyAzMTQwIDU4MjggMzYwMSA2MzQ0IDMzOTEgNjA1NiAzMjk3IDUzMTMgMzAwNyA1MjI1IDI3NDkgNDA2NAorOCAxIDIgNiA3IDExIDcgNCA0IDEwIDQgMyAyIDMgMSA0IDQgMyA3IDMgMiA1IDUgNSA5IDkgMTAgNiA5IDMgNSA5IDkgNSA3IDQgMyAyIDUgMworNCA1IDcgNSA0IDYgNSA0IDMgNSAzIDQgMyA1IDMgNSA0IDUgNiA0IDMgNSA1IDYgNSAxMCA2IDggOCA3IDUgNCA1IDYgNiA2IDYgNSA0IDUKKzQzMDQgNjg0NyAzODQwIDc0NjQgNDk1MiA4Mjg0IDQ5NzAgNTEyOSAyMjUzIDQyOTAgMjM2NiAzOTg3IDI4NDMgNDM0MyAyMTk5IDQxMTcgMjM0MSA0NDk3IDI5NTcgNDY0NiAyNTUwIDUxMTAgMjU0MSA1MjM2IDI4ODggNTAzOCAyNzQyIDU3OTkgMzI2NiA1OTA4IDM2MzggNjIwOSAzNDM0IDYwNjEgMzM2OCA1MzYyIDMwODUgNTIxOCAyNzgyIDQxMjcKKzIgMiA2IDIgMSAyIDIgMSAxIDMgMSAyIDEgMyAxIDMgMiAzIDUgMSAxIDIgNCA0IDMgMTEgNSA2IDkgNSAzIDEgMyAzIDUgNCA1IDIgMiAzCisyIDEgNCA1IDYgNiA0IDMgMyA2IDMgMyA3IDYgMyA0IDQgNSA1IDYgNSA2IDUgNSAzIDUgNyA5IDcgNyA3IDMgNiA4IDggOCA3IDUgNSA0Cis0MjQ3IDY0OTcgMzg0NiA3MzIzIDQ5ODEgODE1NSA0OTQ4IDUwMDUgMjI3MyA0NDAxIDIzODMgMzkzMiAyOTUwIDQ0NTEgMjIyMCA0MTE1IDIzODQgNDUzNCAzMDEwIDQ3MzUgMjYxNCA1MTcyIDI2MDUgNTIyOSAyODkyIDUwNDIgMjg1MiA2MDA0IDMzNjMgNTk4MyAzNzI2IDYwMjAgMzUwMSA2MTg4IDM0ODggNTUzMSAzMTg2IDUyMTIgMjg0MCA0MTI1CiswIDAgMiAyIDQgMiAxIDEgMSA0IDEgMSA3IDQgMSAyIDIgMyAzIDQgNCA0IDQgMiAxIDIgNyA4IDcgNSA2IDAgNSA2IDkgNiA3IDIgMyAyCiszIDEgMiA2IDUgNCAzIDUgMiAzIDMgNCAxMSA2IDYgNiAzIDUgNCA0IDQgNCA0IDUgNCA1IDcgOCA3IDggNyA1IDcgNiA2IDYgOCA2IDYgNAorNDIxNyA2MTY4IDM4MDEgNzI1MiA0OTg0IDc5MTEgNDkwMSA1MDExIDIyNjcgNDMyMSAyNDAwIDM5NDEgMzE1NyA0NTUyIDIzMTcgNDIzNiAyNDAxIDQ1NjkgMzAzNyA0Njk2IDI2NTAgNTEwNyAyNjQyIDUyMjIgMjkyMiA1MDQ2IDI5NTkgNjEzNSAzNDU3IDYxMTUgMzgxMSA1OTY2IDM1OTIgNjE4NSAzNTU0IDU1NjcgMzMxMCA1MjY3IDI5MjIgNDEyMworMSAwIDAgMyAyIDEgMSAyIDAgMSAxIDIgMTggNCA2IDQgMSAzIDIgMSAyIDEgMiAyIDIgMiA3IDYgNiA2IDYgMiA2IDMgNSAzIDkgNCA1IDIKKzUgNCAzIDIgMyA0IDMgNSAzIDIgNCAzIDUgNSA0IDUgMyA1IDYgNSA2IDQgNSA3IDcgNyA2IDUgMyA2IDkgNyA5IDcgNyA3IDkgNSA1IDQKKzQyMzkgNjA0MyAzNzgyIDY5MzkgNDkzNiA3NjgyIDQ4NTUgNTAxNyAyMjg3IDQxODQgMjQ0MiAzODg4IDMyMDYgNDU4NiAyMzYxIDQyODkgMjQxNyA0NjAyIDMxMTQgNDcyMSAyNzM3IDUwNDYgMjcwMyA1MzM4IDMwMjcgNTE3MyAzMDM4IDYwNzQgMzQ0NyA2MTE2IDM5NDUgNjAzOCAzNzMyIDYyNDMgMzY0NCA1NjYzIDM0NTcgNTI1OCAyOTc2IDQxMjEKKzMgMSAxIDAgMSAxIDEgMiAxIDAgMiAxIDMgMyAyIDMgMSAzIDUgMyA1IDEgMyA1IDcgNSA1IDIgMSAzIDEwIDUgMTEgNCA2IDUgMTEgMiAzIDIKKzYgNCAzIDQgMyA0IDMgMyA0IDIgMyA3IDYgMyAxIDIgNSA0IDUgMyA2IDQgNSA2IDUgOCA1IDUgNiA3IDggNyA5IDggNiA2IDUgNiA2IDcKKzQyODYgNTkyNiAzNzY0IDY3NjggNDg4OSA3NDY2IDQ4MTAgNDkwMCAyMzMyIDQwNTUgMjQ1NyA0MDg0IDMyNzkgNDQ5NSAyMzI3IDQxNTQgMjQ4NCA0NTcxIDMxNjQgNDYyMiAyODIyIDQ5ODkgMjc2MyA1Mzg2IDMwNzkgNTM1NCAzMDg5IDYwMTYgMzUxNCA2MTc5IDQwNTEgNjEwNSAzODY4IDYzNTkgMzcwNiA1NjkxIDM0OTggNTMxMSAzMDU1IDQzMDMKKzQgMSAxIDEgMSAxIDEgMSAyIDAgMSA2IDUgMSAwIDAgNCAxIDMgMSA1IDEgMyA0IDMgNyAzIDIgNSA0IDggNCAxMCA2IDQgMyAzIDQgNSA2Cis1IDYgMyA1IDQgMyA0IDMgNCAzIDQgMiAzIDUgMyAyIDcgNyA2IDUgNCA2IDUgNyA0IDYgNiA1IDcgNyA1IDcgNiA3IDYgNiA1IDYgNCA0Cis0MzA2IDU5MzkgMzc0NiA2NjY5IDQ4NjkgNzIwMiA0NzkyIDQ3OTAgMjM3NiAzOTk2IDI0OTcgMzk2MSAzMjczIDQ1MzIgMjM0NSA0MDI3IDI2MDAgNDcyNiAzMjM4IDQ2NTEgMjg1MyA1MDU4IDI4MjEgNTQ5MiAzMTA0IDU0MDEgMzE2NSA1OTYyIDM2MDUgNjIzOCA0MDc3IDYxNjggMzkyNCA2NDA3IDM3NjYgNTcxOCAzNTM4IDUzNjAgMzA4MCA0MjkwCiszIDMgMSAyIDEgMCAxIDEgMiAxIDIgMCAxIDMgMSAwIDcgNSA1IDMgMiA0IDMgNSAyIDMgNSAyIDYgNCAzIDQgNCA0IDQgMyAzIDQgMiAyCis0IDMgMiAzIDYgOCA2IDEgMyAzIDcgNCA1IDUgNCAyIDMgNSA2IDQgNCA1IDUgNiA2IDEwIDkgNiA1IDcgNyA1IDUgNyA3IDEwIDYgNiA1IDUKKzQzMDAgNTc2NiAzNzAzIDY0NTMgNDkwMCA3MjYxIDQ4MjUgNDU2NCAyMzkzIDM5NDAgMjYxMyAzOTY5IDMzMTkgNDU2NyAyMzg4IDM5MDggMjYxMSA0NzQ5IDMzMTAgNDYxNyAyODg0IDUwNjEgMjg3OCA1NTMxIDMxNzkgNTY5MSAzMzE2IDU5NzIgMzY0MiA2MjkzIDQxNTQgNjEwNSAzOTUzIDY0NTIgMzg1MCA1OTg5IDM2MDMgNTQwNyAzMTMwIDQzMzkKKzIgMCAwIDAgNCA1IDQgMCAxIDEgNyAyIDMgMyAyIDAgMSAzIDUgMSAyIDIgMyAzIDUgMTAgMTEgMyAzIDQgNiAyIDMgNCA2IDEwIDUgMyAzIDMKKzMgMiAzIDQgMyA0IDYgNCAyIDMgNCA2IDQgNCA3IDYgMiA0IDggOCA1IDYgNiA3IDkgNSA2IDYgNyAzIDUgNSA2IDcgNyA2IDYgNiA1IDcKKzQyNjkgNTU0MiAzNjg3IDYzMTEgNDg1NCA3MDcxIDQ4NTcgNDUzNSAyMzg0IDM4ODcgMjY1MCA0MDk5IDMzMzggNDUzOCAyNTA3IDQwNDIgMjU5NiA0NzA5IDM0MzEgNDgzMSAyOTM5IDUxMjUgMjk1OSA1NjI5IDMzMjkgNTY1NiAzMzg2IDU5ODIgMzczMCA2MDk5IDQxNzggNjA0NSA0MDA3IDY0OTQgMzkzMiA1OTk4IDM2NjYgNTQ1MSAzMTc5IDQ1MDgKKzEgMCAxIDEgMSAxIDQgMSAwIDEgMiA0IDIgMSA4IDQgMCAxIDkgNyAzIDQgNSA1IDExIDIgNSAzIDYgMCAzIDIgNCA0IDYgMyA0IDMgMyA2Cis1IDUgNiA2IDIgMyA2IDQgMiAyIDQgNSA5IDYgNiA1IDUgNCA1IDcgNSA3IDcgNSA3IDUgNiA3IDcgMyA1IDcgNyA4IDkgNCA1IDYgNSA0Cis0MjkwIDU1MTYgMzc0OCA2MzAwIDQ3ODMgNjgzMSA0ODg5IDQ1MDggMjM3NSAzNzc2IDI2ODYgNDE2MCAzNDg0IDQ2MzQgMjU5NyA0MTA2IDI2NTkgNDY3MiAzNDczIDQ5NzEgMjk5MyA1MjQ3IDMwNjQgNTU5OCAzNDI0IDU2MjMgMzQ1NCA2MDUzIDM4MTUgNTkxNyA0MjAxIDYxMTIgNDA4NSA2NTk1IDQwNjMgNTg4MyAzNzAyIDU0OTIgMzIyNyA0NDgzCiszIDIgNCAzIDAgMCA0IDEgMCAwIDIgMyAxMSA0IDUgMyA0IDEgMyA1IDMgNSA3IDIgNyAyIDUgNSA2IDAgMyA0IDYgNiAxMCAxIDMgMyAzIDEKKzMgMiA0IDMgNCAzIDQgNCAzIDQgNSA0IDQgNCAzIDQgNCA1IDUgNSA1IDQgNSA3IDUgNSA1IDcgNiA1IDggOSA2IDYgNiA1IDUgNiA1IDQKKzQyNTkgNTMwNyAzNzU2IDYxMDYgNDc2NSA2NjA1IDQ4NjkgNDQ4MyAyMzkyIDM3OTUgMjc0NiA0MTU2IDM0OTkgNDYwMSAyNjA4IDQxMDUgMjY5NCA0Njk4IDM1MTQgNDk3OSAzMDQ2IDUxNzcgMzExNSA1NjkyIDM0NjYgNTU5MiAzNDk1IDYxMTkgMzg3MyA1ODY5IDQzMDAgNjI5OCA0MTM2IDY1NjcgNDExNCA1ODM3IDM3MzcgNTUzMSAzMjc0IDQ0NTkKKzEgMCAyIDAgMSAwIDEgMSAxIDIgMyAyIDIgMSAxIDIgMiAzIDMgMiAzIDEgMyA1IDMgMiAzIDQgNCAyIDggOCA0IDMgNCAyIDMgMyAzIDEKKzQgNiA2IDMgNSA1IDMgMSAyIDIgMyAzIDIgNiA0IDIgNCA1IDMgNSA1IDMgNCA0IDQgNCAzIDUgOCA2IDggOCA3IDYgNyA2IDYgNSA0IDMKKzQyNTQgNTM1NyAzODE1IDU5MjMgNDc3MyA2NTE1IDQ4MjQgNDI3NSAyMzgzIDM2OTAgMjc1NCA0MDkwIDM0NjIgNDY5MyAyNjQ1IDM5ODEgMjcyOCA0NzIzIDM1MDIgNDk4NyAzMDk3IDUwNTAgMzEzOSA1NTk2IDM0ODEgNTUwMiAzNDg0IDYwNTkgMzk4MCA1ODg1IDQzOTcgNjQxMSA0MjExIDY1NDEgNDE5MCA1ODU1IDM3OTcgNTUwNiAzMjk0IDQzNzUKKzIgNCA0IDAgMiAyIDEgMCAwIDAgMSAxIDAgNCAyIDAgMiAzIDEgMiAzIDEgMiAxIDIgMSAxIDIgOCAzIDggNiA2IDMgNiAzIDQgMiAyIDEKKzIgMyA0IDQgNCA1IDMgMSAzIDIgMiAzIDIgMyAyIDIgMiAzIDMgNCAzIDMgNCA1IDQgNCA0IDUgNSA0IDUgNiA1IDUgNCA1IDUgNCAzIDMKKzQxOTggNTIxOSAzODIyIDU4MTMgNDc1NiA2NDMxIDQ3ODAgNDA3OSAyNDAwIDM1OTEgMjczNiA0MDI4IDM0MjYgNDU5NSAyNjMwIDM4NjUgMjcxMSA0NjIzIDM0OTEgNDkzMyAzMDk2IDQ5MzEgMzE2MiA1NTY3IDM0OTYgNTQxNyAzNDk5IDYwMDIgNDAwOCA1Nzc3IDQ0MTUgNjM5NCA0MjMzIDY0NTUgNDE4NyA1ODEwIDM4MzAgNTQyMSAzMjg4IDQyOTYKKzAgMSAyIDEgMSAyIDEgMCAxIDAgMCAxIDAgMSAwIDAgMCAxIDEgMSAxIDEgMiAyIDIgMSAyIDIgMyAxIDMgMyAzIDIgMiAyIDMgMSAxIDEKKzYgNCA1IDQgMyA0IDMgMiA2IDYgNSA1IDQgMyAzIDMgNCAzIDQgNyAzIDQgNSA2IDYgNCA2IDcgNyA1IDYgNSA4IDUgNCA3IDcgNyA1IDMKKzQyNDYgNTE1MSAzODU0IDU3MDkgNDcxMyA2MjkwIDQ3MzcgMzk1NyAyNDkzIDM3NDQgMjc5NSA0MDkzIDM0NDIgNDUwMyAyNjQxIDM4MTcgMjc0NSA0NTI5IDM1MDYgNTA2NyAzMDk1IDQ4ODAgMzIxMCA1NjAxIDM1NjIgNTMzNyAzNTY1IDYwNzEgNDA4NiA1NzM3IDQ0NTggNjMxNyA0MzMxIDYzNzQgNDE4NCA1ODkxIDM5MTMgNTUyNSAzMzMzIDQyMjIKKzQgMSAzIDEgMSAxIDEgMCA1IDQgMyAzIDIgMSAxIDEgMiAxIDIgNSAxIDEgMyAzIDUgMSA1IDUgNiAyIDQgMiA4IDIgMiA1IDYgNSAzIDEKKzYgNiAyIDMgMyA1IDIgMiA2IDcgNCA2IDggNCA0IDQgNSAzIDIgNiA1IDMgNCA0IDMgNCA2IDcgNyA2IDYgNiA4IDYgNSA2IDggNyA0IDMKKzQyOTMgNTIxMCAzODA4IDU1NTAgNDY3MiA2MjE5IDQ2NjkgMzg0MiAyNTg0IDM5NDkgMjgyNyA0MjE2IDM1NjAgNDQ3OCAyNjc3IDM4MzMgMjgwNCA0NDQxIDM0NjkgNTEzMSAzMTQ1IDQ3NzEgMzIzMiA1NTEwIDM1NDkgNTI2MiAzNjI5IDYxMzYgNDE2MiA1NzYxIDQ1MDAgNjMwNiA0NDI3IDYzNjAgNDIwNyA1OTA2IDQwMTkgNTYyMyAzMzUyIDQxNTMKKzQgNCAwIDAgMSAyIDAgMCA1IDYgMiA0IDkgMSAyIDIgMyAxIDAgNCAzIDEgMiAxIDEgMSA1IDQgNiAzIDQgMyA4IDMgMyAzIDggNSAyIDEKKzUgMyAzIDQgMyAzIDcgNiA5IDUgMyAzIDUgNSA0IDUgMyAzIDQgNCA3IDQgNiA1IDMgNCA1IDQgNCA1IDQgOCA5IDYgNyA2IDUgNiA1IDMKKzQzMTMgNTA4MSAzNzg5IDU0NjIgNDYzMiA2MDMwIDQ3MzEgMzk4MCAyNzQ5IDQwMTkgMjgzMyA0MTQ3IDM1OTggNDUxNiAyNzEyIDM5MTAgMjgxMCA0MzU4IDM0ODQgNTA2OCAzMjQ1IDQ3MzAgMzMwNCA1NDg2IDM1MzcgNTE5MiAzNjY2IDYwMTMgNDE2MCA1NzIyIDQ0ODkgNjQxOSA0NTQ2IDYzNDcgNDI4MCA1OTIwIDQwNDYgNTY1NCAzMzk2IDQwODgKKzMgMSAxIDEgMSAwIDUgNCAxMiAzIDEgMSAzIDMgMiAzIDEgMSAyIDEgNyAxIDUgMiAxIDEgMyAxIDIgMiAxIDYgMTAgMyA2IDMgMyAzIDMgMQorNiA0IDQgMiAyIDMgNiA3IDYgNSA1IDYgMyAzIDMgMyA0IDMgNSA0IDUgNiA1IDcgNCA2IDYgNiA1IDYgNiA3IDcgNyA3IDYgNiA1IDUgMworNDM1OCA1MDIxIDM3OTYgNTI1NyA0NTY3IDU4NTIgNDc2NiA0MTcxIDI4MzMgNDA4NSAyODkwIDQyNjYgMzU4NCA0NDI5IDI3MjAgMzg1OSAyODQyIDQyODAgMzUyNCA1MDA5IDMyOTEgNDgxNCAzMzQ5IDU1ODYgMzU1MCA1MjQ5IDM3MjcgNjAyMCA0MTgzIDU3NDcgNDUzMCA2NDYzIDQ2MTEgNjM5NiA0MzUyIDU5MzMgNDA5OCA1NjIxIDM0MzkgNDAyNworNCAxIDIgMCAwIDAgNCA2IDUgMyAzIDQgMSAxIDEgMSAyIDEgMyAxIDMgNCAzIDUgMiA0IDQgMyAzIDMgNCA0IDYgNCA2IDMgNCAyIDMgMQorMiA1IDcgMiA0IDMgMyA0IDMgNCAzIDUgMyAzIDQgNSA1IDMgNCA0IDQgNSA2IDYgMyA0IDQgNyA3IDcgOCA3IDYgNSA1IDUgNSA2IDUgMworNDMwMCA1MDI2IDM4ODAgNTA2NCA0NTU1IDU2ODUgNDcyMyA0MTY2IDI4MzggNDA4NSAyODk0IDQzMTcgMzU3MSA0MzQ3IDI3NTQgMzkzNCAyODk4IDQyMDcgMzUzOCA0OTU0IDMzMTEgNDgzMiAzNDE4IDU2MTkgMzUzOCA1MTc5IDM3MzYgNjA4OCA0MjU3IDU4MzIgNDYyMSA2NTA1IDQ2NDkgNjMxOSA0MzcxIDU4ODQgNDEyMyA1NjUyIDM0ODAgMzk2OQorMCAyIDYgMCAxIDAgMSAyIDEgMiAxIDMgMSAxIDIgMyAzIDEgMiAxIDIgMiA1IDMgMSAxIDIgNSA2IDUgNyA0IDQgMiAzIDIgMyAzIDMgMQorNSA3IDkgNCA0IDQgMyAzIDEgMiAzIDQgNCAzIDQgNSA1IDUgMiAzIDQgNSA2IDUgNiA1IDUgNiA1IDggNiA2IDUgNiA3IDcgNCA1IDQgNAorNDMyMCA1MTU0IDQwMTMgNTAwNSA0NTQzIDU1ODkgNDY4MSA0MTAwIDI3OTIgMzk2MiAyODk4IDQzMDMgMzU4NCA0MjcwIDI3ODcgNDAwNSAyOTUzIDQyNjEgMzUwMCA0ODQxIDMzMzAgNDg0OSAzNDg2IDU1ODkgMzYwMyA1MTc1IDM3NzAgNjA5MSA0Mjc4IDU5NzMgNDY1OSA2NDgzIDQ2NjAgNjMwOCA0NDQwIDU5NjEgNDEyMiA1NjIwIDM0OTUgMzk3NgorMyA1IDEwIDEgMSAxIDEgMSAwIDAgMSAyIDIgMSAyIDMgMyAzIDAgMSAyIDIgNSAyIDUgMiAzIDMgMyA2IDQgMyAzIDMgNiA1IDIgMiAyIDIKKzIgMiA3IDYgNSA1IDMgMiAzIDQgNCA1IDQgNSA1IDMgNCA1IDMgNSA1IDYgNCA0IDQgNCA1IDUgNiA3IDYgNSA2IDUgNCA1IDYgNSA2IDQKKzQyNjMgNDk2NyA0MDkxIDUwNzMgNDU1NyA1NTYwIDQ2NDAgMzk3NiAyNzk4IDM5NzAgMjkyNyA0MzUyIDM1OTYgNDMyMCAyODQ1IDM5NDkgMjk4MSA0MzEyIDM0ODkgNDg1NyAzMzc0IDQ5MjYgMzUwMSA1NDk5IDM2MTUgNTExMCAzODAzIDYwMzIgNDMyNCA2MDQ0IDQ2OTYgNjQwMSA0Njk3IDYyMzYgNDQzMSA1OTEwIDQxNzIgNTU5MCAzNTYxIDM5ODMKKzAgMCA2IDQgMyAyIDEgMCAxIDIgMiAzIDIgMyAzIDEgMiAzIDEgMiAzIDQgMiAxIDIgMSAzIDIgNCA1IDQgMiA0IDIgMiAyIDQgMiA1IDIKKzQgMiA0IDIgMyA3IDQgMiAzIDMgNCA0IDQgNCA3IDMgNCA4IDYgNSA1IDUgNCAzIDMgNSA1IDYgNyA2IDQgNyA5IDYgNSA2IDYgNCA0IDMKKzQyNTggNDc5MSA0MDkxIDQ4OTEgNDUxOSA1NjU2IDQ2MjYgMzg2MCAyODA0IDM5MTYgMjk1NiA0MzM2IDM2MDggNDMwNiAyOTUyIDM4OTYgMzAwOCA0NTQ0IDM1NTUgNDg3MiAzNDE3IDQ5MzcgMzUxNSA1MzUzIDM2MDEgNTExMCAzODM1IDYwMzggNDM5NCA2MDQ5IDQ2ODEgNjQ0NyA0ODA5IDYyMzAgNDQ0OCA1OTI0IDQyMjEgNTUwMCAzNTc0IDM5MjgKKzIgMCAyIDAgMSA1IDEgMCAxIDEgMiAyIDIgMiA3IDEgMiA3IDUgMiAzIDIgMiAxIDEgMiAzIDMgNiAzIDEgNCA5IDMgMyAzIDQgMSAyIDEKKzMgMyAzIDIgNCA1IDUgNyA2IDQgNyA2IDQgNSA1IDQgMyA0IDcgNyA1IDcgNSA2IDQgMyA0IDUgOCA5IDYgNSA3IDcgOSA4IDYgNCA0IDQKKzQyMjggNDY4NyA0MDY1IDQ3MjAgNDUwOCA1NjIzIDQ2MzggNDA1OCAyODg3IDM5MjYgMzA2MSA0NDQ0IDM2MjAgNDM1NCAzMDA2IDM5MDcgMzAwOSA0NTE3IDM2NDUgNTAwOSAzNDU5IDUwNzAgMzU1NSA1NDAwIDM2MTMgNDk4NyAzODQxIDU5ODIgNDQ4OCA2MjM5IDQ3MTcgNjM2NyA0ODY3IDYyODYgNDU2NyA2MDYwIDQyNjkgNTQxNSAzNTg3IDM5MzgKKzEgMSAxIDAgMSAyIDMgNiA1IDIgNyA0IDIgMyAzIDIgMSAxIDYgNSAzIDUgMyAzIDIgMSAyIDIgNyA4IDQgMiA1IDQgOSA2IDQgMSAyIDIKKzYgNyAzIDQgNyA3IDQgNCA0IDQgMyA0IDUgNSA0IDIgMyA0IDMgMyA0IDUgNCAzIDUgNSA4IDYgNiA3IDQgNSA1IDQgOCA3IDUgNSA1IDQKKzQyNzUgNDgzNSA0MDQwIDQ2ODIgNDU3NCA1NzE1IDQ2MjQgNDA2MCAyOTE3IDM5MzYgMzA2MSA0NDIzIDM2NTcgNDM5OSAzMDMzIDM3OTUgMzAxMCA0NDkxIDM2MzAgNDg5MiAzNDc0IDUwNzIgMzU2OCA1MjYwIDM2NTAgNDk5NCAzOTQ5IDU5OTEgNDUyOSA2Mjk0IDQ3MDEgNjI5MiA0ODczIDYxNTQgNDY1NyA2MTI2IDQyOTAgNTM5NyAzNjI1IDM5NDcKKzQgNSAxIDEgNiA1IDEgMiAyIDIgMSAyIDMgMyAyIDAgMSAxIDEgMSAyIDIgMiAxIDMgMiA4IDMgNCA0IDEgMiAyIDEgNyA0IDMgMiAzIDIKKzcgNSA0IDcgNiA1IDggNSA1IDQgNCAzIDQgNSA0IDMgMyAzIDIgMiAzIDQgNSA0IDQgNSA2IDYgNyA2IDUgNiA2IDQgNCA0IDMgNCA0IDQKKzQzNDcgNDg1MiA0MDQxIDQ4MzEgNDYxMyA1Njc5IDQ3MTMgNDEyMyAyOTcxIDM5NDUgMzA4NiA0MzQxIDM2NjcgNDQ0MiAzMDU5IDM3NTEgMzAxMSA0NDA1IDM1OTAgNDcyMSAzNDYzIDUwMTMgMzYwNiA1MTkwIDM2NjEgNTAwMSA0MDAzIDYwMDAgNDU5NCA2Mjg1IDQ3MTEgNjI4MyA0OTA0IDYwMzAgNDY0MiA2MDA0IDQyNTkgNTMxOCAzNjM2IDM5NTUKKzYgMiAyIDUgNCAyIDcgMyAzIDIgMiAxIDIgMyAyIDEgMSAxIDAgMCAxIDEgMyAxIDIgMiA0IDMgNiAzIDMgMyA0IDEgMSAxIDEgMSAyIDIKKzggNyA0IDQgNCA2IDUgMiAyIDQgNSAyIDQgNSA0IDMgNiA0IDMgNCA0IDQgNSA1IDUgOCA4IDUgNiA1IDQgNSA2IDQgNiA2IDYgNSA1IDQKKzQ0NDIgNDk5MCA0MDQyIDQ3ODYgNDYwMCA1NzA2IDQ3MjMgMzk5OCAyOTQ3IDM5NTQgMzEzNiA0MjAzIDM2NzcgNDQ4MiAzMDg0IDM3MTAgMzA4OSA0Mzg2IDM1NzcgNDY4MyAzNDc4IDQ5NTcgMzY0MyA1MTg1IDM2OTcgNTE5MiA0MTA3IDU5NDcgNDYzMiA2MjE1IDQ2OTUgNjIxMyA0OTM0IDU5MTMgNDY3OSA2MDEyIDQzMDYgNTMwNiAzNjczIDM5NjMKKzggNSAyIDEgMSAzIDMgMCAwIDIgMyAwIDIgMyAyIDEgNSAyIDEgMSAyIDEgMyAyIDMgNyA4IDIgNCAyIDEgMiA0IDEgNCAzIDQgMiAzIDIKKzQgNCAyIDQgNSA0IDYgNiAyIDIgMSAxIDIgNCAzIDMgNCAzIDMgMyAzIDMgMyA2IDUgNCA2IDQgNSA1IDQgNiA1IDQgNyA0IDUgNSA0IDQKKzQ0MzMgNDkzNiAzOTkyIDQ3NDQgNDYxMiA1NjA5IDQ3NTggNDEyNiAyOTI0IDM4MzkgMzA4MyA0MDEyIDM2MzYgNDQ1OCAzMDgzIDM2NzEgMzExNCA0MzA3IDM1NjQgNDU4NiAzNDY3IDQ4NDMgMzYyOCA1MjQyIDM3MzIgNTEyNiA0MTU3IDU4MzUgNDY0NCA2MTQ5IDQ2ODAgNjIwOCA0OTM4IDU4MDMgNDc0MSA1ODk3IDQzMjYgNTI5NCAzNjgzIDM5NzAKKzIgMSAwIDEgMyAxIDQgNCAwIDAgMCAwIDAgMSAxIDEgMiAxIDEgMSAxIDEgMSA0IDMgMSA0IDEgMyAyIDEgMyAyIDEgNSAxIDMgMiAyIDIKKzUgMSAzIDQgMyAzIDYgNyA0IDMgMiAzIDMgNSAzIDMgMyA1IDYgNSA1IDUgNCA2IDUgMyA2IDUgNiA3IDcgNSA1IDUgNiA1IDUgNSA0IDQKKzQ0NTAgNDcwMSAzOTY5IDQ3MDUgNDU3MyA1NDU2IDQ3OTIgNDMwOCAyOTUzIDM3OTIgMzA1NyAzOTU1IDM2MjEgNDQ5NyAzMDgyIDM2MzUgMzExMiA0MzU1IDM2MjggNDYxOCAzNTA4IDQ4NTkgMzYzOSA1Mjk2IDM3NjYgNTAwMiA0MjA2IDU3OTIgNDY4MSA2MjEwIDQ3NDIgNjE0MiA0OTQyIDU3NjIgNDc3NiA1ODUwIDQzNDUgNTI4MyAzNjkzIDM5NzcKKzMgMCAxIDEgMSAwIDQgNiAyIDEgMCAxIDEgMyAxIDEgMSAzIDUgMyAzIDIgMiA0IDMgMSA0IDIgNCA0IDUgMiAyIDIgNCAyIDMgMiAyIDIKKzYgNSAzIDQgNyA4IDcgNiAzIDMgMiAzIDQgNSA0IDcgNSA1IDUgNiA2IDUgNCA1IDMgNyA5IDUgNSA2IDYgNSA2IDYgNyA2IDYgNCA1IDMKKzQ0OTIgNDcyNiAzOTQ2IDQ2NjggNDYzNyA1NjIwIDQ4NTEgNDQxOCAyOTU1IDM3NDggMzAzMSAzOTAyIDM2MzIgNDUzNCAzMTA3IDM4NDYgMzE2MiA0NDAwIDM2NjUgNDcwOSAzNTczIDQ4NzQgMzY1MCA1Mjg1IDM3NDggNTEzMSA0MzMxIDU3NTEgNDY5MSA2MjA2IDQ3NzYgNjA4MCA0OTcyIDU3ODQgNDgzNSA1ODY3IDQzODkgNTIxMSAzNzI4IDM5MjIKKzQgMyAxIDEgNSA2IDUgNCAxIDEgMCAxIDIgMyAyIDYgMyAzIDMgNCA1IDIgMiAyIDEgNSAxMCAyIDMgMyA0IDIgNCAzIDUgMyA0IDEgMyAxCis1IDQgMyAzIDQgNSA1IDYgNCAzIDMgMyA0IDQgNiA4IDQgNiA1IDUgNCA0IDYgOCA4IDYgNSA3IDYgNiA2IDUgNSA4IDUgNiA1IDUgNyA0Cis0NTA3IDQ2ODggMzkyNCA0NTcyIDQ2MjMgNTU5MCA0ODU3IDQ1MjEgMjk4MyAzNzA3IDMwMzIgMzg1MiAzNjQzIDQ1MDcgMzE4MiA0MTA2IDMxODUgNDUwNCAzNzAxIDQ3MzMgMzU4NiA0ODI3IDM3MTIgNTQ1OSAzODU4IDUxOTEgNDM1MCA1ODM2IDQ3MjcgNjIwMiA0ODEwIDYwMjIgNDk3NSA1OTI4IDQ4NDIgNTg4MyA0NDA3IDUyMDUgMzgxMyAzOTMyCiszIDEgMSAxIDEgMiAyIDQgMiAxIDEgMSAyIDEgNSA4IDIgNCAzIDMgMiAxIDQgNyA4IDQgMyA1IDQgMyA0IDIgMiA2IDIgMyAzIDIgNiAyCis2IDYgNCA0IDcgOCA2IDggOCA1IDcgMyAzIDQgNSA2IDUgOCA2IDUgNiA2IDUgNyA4IDcgNSA1IDcgMTAgNyA1IDcgNyA1IDYgNSA2IDggNgorNDU0NyA0Nzc1IDM5MjggNDU0MyA0Njg2IDU3NDYgNDg4OSA0NzQxIDMxMTMgMzc5MSAzMTM1IDM4MDUgMzYyOCA0NDgyIDMyMzAgNDIyOCAzMjMzIDQ3MjUgMzc2MSA0NzU2IDM2NDkgNDkwNiAzNzQ3IDU1NjEgMzk2NiA1MzA5IDQzNjkgNTc5MyA0Nzg3IDY0NDQgNDg2OCA1OTY3IDUwMjkgNjAwMiA0ODQ4IDU4OTggNDQyNCA1MjYxIDM5MjIgNDA2NAorNCA0IDIgMSA1IDYgNCA3IDkgMyA3IDEgMSAxIDMgNCAzIDcgNCAzIDUgNCAzIDUgOCA1IDMgMiA1IDkgNSAyIDUgNSAyIDMgMyA0IDggNAorNiA2IDQgNiA1IDMgMiA0IDYgNSA0IDQgMiA0IDUgNCA3IDcgNyA0IDUgNiA2IDYgNSA4IDYgNSA2IDYgNyA4IDUgOSA3IDggNiA2IDUgNQorNDU4NiA0ODU3IDM5MzIgNDYzOSA0Njk2IDU1ODUgNDgxOCA0NzAyIDMxODggMzg3MCAzMTU4IDM4MjIgMzU4OCA0NDU4IDMyNzcgNDIyMCAzMzMxIDQ4NzEgMzg0NiA0NzE2IDM2ODUgNDk4MCAzODA2IDU1OTUgMzk5NCA1NDgxIDQ0MTMgNTc1MiA0ODIwIDY0MjYgNDkyNSA2MTAwIDUwMzEgNjE5NCA0OTA1IDYwMzUgNDQ2NiA1MzEzIDM5NTEgNDEyNworNCA0IDIgNCAzIDAgMCAxIDUgMyAyIDIgMCAxIDMgMiA3IDUgNiAxIDMgNCA0IDMgMyA3IDQgMiA0IDMgNSA2IDIgOCA1IDYgNCA0IDMgMworNiA1IDUgMyAzIDQgNSA3IDQgMyAyIDQgNSA0IDUgNCAyIDMgNSA2IDcgOCA0IDkgNSA1IDcgOSA2IDYgNiA2IDcgNiA3IDggNyA2IDcgNgorNDYyNCA0ODcyIDM5NjEgNDU0NCA0NjU1IDU0OTUgNDgyNSA0ODQ5IDMyMTAgMzgyMiAzMTMwIDM4MzggMzYyNiA0NDM2IDMzMjMgNDIxMiAzMjk4IDQ3NjMgMzg3NyA0ODAxIDM3NzEgNTE3MiAzODEzIDU4MTIgNDAyMiA1NDU5IDQ0ODEgNTk1OSA0ODUzIDY0MDkgNDk1NSA2MTAyIDUwODQgNjE5MSA0OTYxIDYxNjQgNDUzMyA1MzYyIDQwMzEgNDI0OAorNCAyIDMgMSAxIDEgMiA1IDIgMSAwIDIgMyAyIDMgMiAwIDEgMyA0IDYgNyAyIDggMyAyIDYgOCA0IDMgNCAzIDUgMyA1IDYgNiA0IDYgNAorNCA2IDQgMyAzIDUgNCA2IDUgNCA1IDYgNyA3IDcgNyA0IDUgNSA1IDcgOCA3IDcgNSA5IDEwIDkgNyA3IDggNyA2IDcgNCA3IDggNyA2IDUKKzQ2MTAgNDk0OCAzOTY0IDQ0NTUgNDYxNSA1NDcyIDQ4MDYgNDkyNiAzMjU3IDM4MzggMzE3OSAzOTc2IDM3MTQgNDU5OSAzNDE4IDQzODkgMzMxNyA0Nzg0IDM5MDggNDgyMCAzODU1IDUzNTMgMzg5NiA1ODkzIDQwNDkgNTY4NCA0NjI0IDYxNTQgNDkxMCA2NDU0IDUwMzUgNjE2NSA1MTEwIDYyNDkgNDkzOSA2MjI0IDQ2MjQgNTQ3MCA0MDgzIDQzMDAKKzEgNCAyIDEgMSAyIDEgNCAzIDIgMyA0IDYgNiA3IDYgMiAyIDMgMiA2IDcgNiA1IDMgOCAxMiA4IDUgNCA3IDQgNCA0IDEgNCA3IDUgNCAzCis3IDggMyA0IDUgNSA1IDQgNCAzIDQgMyA0IDMgNyA0IDUgNyA1IDMgNiA1IDUgNyAxMCA5IDExIDkgOCA4IDEwIDcgNSA2IDcgOCA5IDkgNyAzCis0NjczIDUxNDIgMzk0MSA0NDMzIDQ2MjcgNTQ1MCA0ODEzIDQ4NzYgMzI3NyAzNzkyIDMyMDEgMzkyMSAzNzIzIDQ1MDcgMzUxMSA0MzcxIDMzNjIgNDkyNyAzOTM4IDQ3MTUgMzkxMiA1MzM5IDM5MjYgNTk2OSA0MjAzIDU4OTUgNDc4OSA2MzM3IDQ5OTEgNjU1OCA1MTY0IDYyMjUgNTExMCA2MjQyIDQ5OTQgNjM0MiA0NzM4IDU2OTQgNDE2MCA0MjI2Cis1IDcgMSAyIDMgMiAyIDEgMiAxIDIgMSAyIDEgNiAyIDMgNSAzIDEgNCAyIDMgNSAxMiA4IDE0IDggNyA2IDExIDQgMiAzIDUgNiA5IDggNiAxCiszIDYgNCA3IDcgNiA0IDMgOCA0IDMgMyA1IDMgOCA2IDQgNiAxMSA3IDUgNSA3IDggOSA2IDkgMTEgMTEgOCA2IDYgOCA3IDQgNiA3IDggNyA1Cis0NjMzIDUyMDIgMzk0NCA0NTk3IDQ2OTAgNTQ5MSA0Nzk1IDQ3NjcgMzM5OSAzODEwIDMxOTcgMzg3MCAzNzU3IDQ0MjAgMzYyNyA0NDc3IDMzODAgNTAwMCA0MTIwIDQ4NjIgMzk0MiA1MzI1IDQwMDYgNjEwMiA0MzI4IDU5MDkgNDg5OSA2NjMyIDUxNDcgNjY1NiA1MTg4IDYyMjAgNTE4NiA2Mjk3IDQ5NzEgNjMzMCA0Nzk4IDU4NDMgNDIzNSA0Mjc5CisxIDQgMiA2IDUgMyAxIDEgOSAyIDEgMSAzIDEgOCA0IDIgNCAxNSA1IDMgMiA2IDYgMTAgMyA5IDExIDEzIDYgNCAzIDcgNCAxIDMgNSA2IDYgMworNSAzIDUgNiA4IDQgNCA2IDggNiA2IDQgNSA1IDUgNiAzIDQgNCA0IDMgNSA1IDYgMTAgOSA1IDggOSA5IDcgNiA2IDcgNyA2IDYgNiA1IDYKKzQ2NDUgNTA3NCAzOTczIDQ2ODkgNDc3NyA1NDA3IDQ3NzcgNDg0OSAzNTE4IDM5NTAgMzI3MCAzODgzIDM3OTEgNDQ2MSAzNjY0IDQ1NzcgMzM3MiA0OTQ1IDQxMTkgNDgxNiAzOTIwIDUzMTIgNDAzMyA2MTA0IDQ0NzUgNjEwNyA0OTA0IDY3MjUgNTI0OCA2ODA5IDUyMzcgNjIxNSA1MjA5IDYzNDkgNTAyNSA2MzE4IDQ4MzEgNTg2MSA0MjU3IDQzOTAKKzMgMSAzIDQgNyAxIDEgNCA5IDQgNSAyIDMgMyAzIDQgMSAxIDIgMSAxIDIgMyAzIDEyIDggMiA2IDkgNyA1IDMgNCA0IDUgMyA0IDMgMyA0CisxMiA4IDkgNSA5IDQgNyA4IDkgNSAzIDIgNCA3IDcgNiA2IDkgMyA0IDcgNyAxMSA2IDExIDcgNSA4IDQgOCA4IDkgNSA2IDkgNiA4IDcgNiA2Cis0ODM1IDUyNjEgNDEwMyA0NzE0IDQ4ODcgNTMyOCA0ODM2IDUwNDkgMzY2MCA0MDIwIDMyNjUgMzc3MiAzNzk4IDQ2MjMgMzc1MSA0NjcxIDM0NDEgNTIwMSA0MDkyIDQ3NzIgNDAwMSA1NDIzIDQyMTMgNjEwNiA0NjQ0IDYxNzAgNDkwOSA2ODEzIDUyMTkgNjg5MSA1MzEwIDYzOTUgNTIwNiA2MzM2IDUxMjkgNjMwNyA0OTE0IDU5MzkgNDMwNCA0NDk1CisxNyA3IDEwIDMgOSAxIDUgNyAxMSAzIDEgMCAyIDUgNiA0IDUgOSAxIDEgNiA1IDE1IDMgMTQgNCAyIDYgMSA1IDcgNyAyIDMgOSAzIDcgNSA0IDQKKzggNiA0IDcgNiA0IDEwIDcgNCAyIDMgMyA1IDUgMyA4IDcgNyA2IDggOSA4IDUgNCA3IDggNyA4IDkgOSA3IDkgNiAxMSA4IDYgNyAxMCA5IDcKKzQ5MTggNTMxMyA0MTAyIDQ4NjEgNDkxOCA1MjU0IDQ5NzAgNTE3NiAzNjcwIDM5MDEgMzI2MCAzNzMwIDM4MzEgNDY1MiAzNzM0IDQ4ODIgMzUzNCA1MzE5IDQxNDMgNDk3NyA0MTMxIDU1ODkgNDIzNSA1OTg1IDQ3MDcgNjI5MSA0OTY1IDY4OTUgNTMxOCA3MDMwIDUzNTYgNjU2NCA1MjI5IDY2MzEgNTIwNSA2Mjk3IDQ5NzAgNjE5NyA0NDI2IDQ2NTUKKzcgNCAyIDUgNCAxIDExIDUgMiAwIDEgMSAzIDMgMSA3IDYgNSA0IDcgMTAgNiAzIDEgNSA2IDUgNSA5IDcgNSA3IDQgMTEgNyAzIDUgMTAgMTAgNQorNiAxMCA3IDggOCA1IDggNyAzIDQgMyA0IDUgNCA4IDkgNiA0IDUgNSA3IDEwIDggOCA3IDYgNiA4IDEwIDggNyA3IDcgOSA2IDkgOCA2IDkgNQorNDk0OCA1NjA4IDQxNzggNTA2MCA0OTk5IDUyNDUgNTA1MCA1Mjk1IDM2NTUgMzkxMiAzMjU1IDM3NTEgMzg2MyA0NjE4IDM4NDUgNTE0MiAzNTk5IDUyNDUgNDE2NyA0OTg1IDQyMDYgNTg2OCA0MzMzIDYxMTcgNDc2OCA2MjgyIDQ5OTQgNjk3MiA1NDQwIDcwOTkgNTQwMSA2NjAwIDUyNzcgNjc4NiA1MjI4IDY0NzIgNTA1MCA2MTkzIDQ1NDUgNDY4MgorNCAxMCA2IDcgNyAyIDcgNSAxIDIgMSAyIDMgMSA4IDkgNSAxIDMgMiA2IDEwIDggNiA1IDMgNCA1IDExIDUgNSA0IDUgNyA0IDcgNyAzIDEwIDMKKzQgNSA0IDUgNiA3IDYgNSA3IDYgMyA2IDEzIDUgOCAxMCA1IDUgNCA2IDYgNSA5IDkgOSA4IDcgNiA4IDkgNiA4IDcgOCA5IDkgMTIgNiA3IDUKKzQ5MjYgNTU3OCA0MTc1IDUwNjMgNTAyNyA1MzYwIDUwNzcgNTI4NCAzNzQyIDQwNDUgMzI1MCAzODk0IDQwOTggNDY0OCAzOTUzIDU0NDcgMzYzNiA1MjM3IDQxNjUgNTA1NCA0MjU0IDU4MjMgNDQ1NCA2MzAyIDQ4NzkgNjM5NiA1MDQ4IDY5MjIgNTUwOCA3MjI2IDU0MTkgNjY5NSA1MzI0IDY4NzAgNTMyNyA2NjM2IDUyMzAgNjE5MCA0NjEwIDQ3MDgKKzEgMiAyIDIgNCA1IDQgMiA2IDQgMSA0IDIyIDMgOCAxMSAzIDIgMiA0IDQgMiAxMCA4IDkgNiA1IDMgNyA3IDMgNiA1IDUgOSA3IDE2IDMgNiAzCisxMCAxMCAxMSA1IDUgNiA4IDcgNiAzIDUgNiA4IDcgMyAyIDQgNyA2IDcgNiA1IDUgMTEgOSA3IDEwIDcgOSAxMCA4IDkgNyAxMSAxMSAxMCAxMiA3IDggNgorNTA1OCA1ODU3IDQzNTEgNTA2NiA1MDI5IDU0MDcgNTE1NCA1Mzk3IDM4MDEgMzk4NiAzMjk2IDQwMjggNDIwMCA0Nzk5IDM5MzEgNTI0MyAzNjQ3IDUzNTIgNDIxNCA1MTgwIDQzMDEgNTc4MCA0NDcwIDY1OTkgNDk4NyA2NDQyIDUxNzcgNjkzNiA1NjAwIDc0MDYgNTQ4OCA2ODQ2IDUzNzAgNzEzMyA1NDc1IDY4NTIgNTQwNiA2MjQ4IDQ2OTkgNDc5NAorMTEgMTAgMTUgMiAyIDMgNyA1IDQgMSAzIDQgOCA1IDEgMCAyIDUgNCA1IDQgMiAzIDExIDkgNCAxMSA0IDggOCA3IDcgNSAxMCAxMyA5IDE1IDQgNyA0CisxMSA4IDcgMyA0IDQgOCA4IDUgMyA0IDYgNiAzIDQgNiA5IDkgNSAxMSA3IDggNSA4IDEzIDEwIDcgOSA3IDcgNyA2IDggMTEgMTAgOCA4IDEwIDggNgorNTIxMiA1OTk3IDQ0MjEgNDk0NiA1MDA1IDUzMjggNTIyOSA1NTY0IDM4MzMgMzkzMSAzMzE1IDQxNTQgNDI0OCA0Njk1IDM5MzUgNTI5NyAzNzg2IDU1ODMgNDIzNiA1NTQ1IDQzNzIgNTkyNCA0NDg2IDY2OTQgNTE5NCA2NjY5IDUyMjYgNzA3MiA1NjM5IDczOTEgNTUyOSA2ODAzIDU0NDAgNzM4MCA1NTkzIDY5MzIgNTQ3NSA2NDg3IDQ3ODYgNDg3NAorMTMgNiA2IDEgMSAxIDcgNiAzIDEgMiA0IDQgMSAyIDQgMTEgOCAzIDEzIDYgNiAzIDYgMTkgOSA1IDcgNSA0IDUgMyA3IDEwIDEwIDUgNyA5IDcgNAorNCA1IDQgNiA4IDUgMTAgNiAyIDQgNCAzIDUgNSA4IDYgNSA2IDcgMTAgNSA5IDggOSA3IDggOCAxNiAxMiA5IDggNyA1IDggMTEgMTEgOSA4IDggMTAKKzUxODQgNTk0NCA0NDEyIDUwMTcgNTA4NCA1MzE1IDUzNTQgNTU5OCAzNzg4IDM5NDAgMzMzNCA0MDg5IDQyNjkgNDcyMCA0MDQxIDUzNDcgMzgxOSA1NjE2IDQzMDkgNTgyNiA0MzkwIDYxMjEgNDU3OCA2ODQ1IDUyNDMgNjc2MCA1MzAwIDc2MzAgNTgwNCA3NTAwIDU1OTUgNjgyNCA1NDMyIDc0MjggNTczNCA3MTkxIDU1NjggNjU4OSA0ODcxIDUxOTUKKzEgMiAyIDQgNyAyIDExIDMgMCAyIDIgMSAzIDMgOCA0IDMgMyA2IDEwIDMgOCA3IDcgNSA2IDcgMjIgMTUgNyA2IDQgMiA1IDEyIDEwIDggNiA3IDExCis1IDcgOCA2IDQgMiAzIDQgNCA2IDcgNiAzIDUgNiA0IDcgNSA2IDExIDkgOSA1IDkgNiA5IDcgOSA5IDkgMTAgMTMgOSAxMiA5IDcgNiA3IDcgOAorNTE4MiA2MDE3IDQ1MDYgNTA4NCA1MDU5IDUxMTggNTI5NyA1NTA3IDM3OTUgNDA3MiAzNDI5IDQyMTIgNDIzOSA0NzQzIDQwOTMgNTI3MSAzOTAyIDU1ODYgNDM1NCA2MTUyIDQ1MTAgNjMwNiA0NTkxIDY5ODcgNTI2NSA2OTA3IDUzNDYgNzcyNSA1ODg5IDc2MDIgNTcxMCA3MjEzIDU1MjYgNzcxOSA1ODIwIDcxODkgNTU4MiA2NjIzIDQ5MjggNTM3NAorMiA1IDcgNCAxIDAgMSAxIDIgNCA3IDQgMSAzIDQgMSA2IDIgNCAxMiAxMCA4IDMgNyA0IDcgNSA2IDggNiAxMCAxNSA4IDEyIDggNCAzIDQgNSA3CiszIDQgNSA1IDMgNiA2IDUgOSA5IDggMTEgMyAyIDMgNSA2IDkgNyA1IDEwIDExIDYgNiAxMSA4IDcgOSA5IDggMTAgMTAgNSAxMCA4IDggNyA2IDcgNQorNTEyOSA1OTAxIDQ1MjEgNTA4NiA1MDA5IDUxNzkgNTMxOCA1NDgzIDM5MzAgNDM4MCAzNTQ3IDQ2MzUgNDIwOSA0NTgxIDQwNjcgNTI2MSAzOTU3IDU4MDMgNDQyNCA2MDkwIDQ2NTMgNjYwMyA0NjI5IDY5MzYgNTQxNCA2OTg0IDUzOTEgNzgxNCA1OTcyIDc2MzcgNTgyMyA3Mzk0IDU1MTUgNzg3MCA1ODc5IDcyNDkgNTYyMSA2NTk0IDQ5ODMgNTM1OAorMSAxIDMgMiAxIDQgNCAyIDEwIDEwIDkgMTQgMSAwIDEgMiA0IDggNiAyIDEyIDExIDQgMyAxMyA1IDUgNiA4IDUgMTAgOCAyIDggNiA1IDUgMyA1IDIKKzIgMiAzIDcgOSA4IDUgMyA0IDQgNSAzIDMgNSA2IDYgMyA4IDcgNiA2IDcgNyA5IDkgOCA3IDEwIDggMTAgMTEgMTAgOCA3IDggMTEgMTEgNiA2IDUKKzUwNTIgNTY2OSA0NDg0IDUyMTAgNTExNCA1MzU5IDUzMTMgNTMzOCAzOTM0IDQzNjIgMzU4NiA0NTQxIDQxODAgNDYxMyA0MTE4IDUzMTMgMzkzNCA1OTQ2IDQ0OTIgNjA5MyA0NjkwIDY2MzYgNDY5MiA3MDcyIDU1MDggNzA1NiA1NDM1IDc5NTkgNjAyNyA3NzkzIDU5NTggNzU2NCA1NTgxIDc4MjcgNTkzNiA3NDg5IDU3NjEgNjU2NyA1MDExIDUzNDMKKzAgMCAxIDUgOSA3IDIgMSAyIDIgMyAxIDEgMyA0IDQgMSA2IDYgMyA0IDQgNSA3IDggNSA1IDggNiA4IDEyIDggNiA0IDYgMTAgMTIgMyA0IDIKKzUgNSA4IDUgNyA3IDYgNSAzIDMgNSA3IDcgNiA4IDUgNCA0IDcgNyA1IDYgNiA4IDggNiA4IDEwIDkgMTEgOSAxMCA4IDEwIDEwIDkgMTIgNyA2IDUKKzUwNTMgNTYzNiA0NTc2IDUyMDQgNTE2NSA1NDY3IDUzMzMgNTMyNCAzOTEyIDQyODQgMzYyNCA0Njk4IDQyNTQgNDcwNCA0MjE5IDUzMDEgMzkzOCA1ODM1IDQ1NTggNjE1NyA0NzAwIDY2MDYgNDcyOCA3MTM5IDU1NzUgNzAwMSA1NTAzIDgwOTUgNjEwNiA4MDAxIDYwMzkgNzcyNCA1NjQ2IDc5NzEgNjA0MyA3NTkyIDU5MjMgNjYwMyA1MDM5IDUzMjkKKzIgMiA3IDIgNSA1IDQgMiAxIDEgMyA1IDYgNCA4IDIgMiAxIDYgNCAzIDMgNCA1IDYgMyA3IDggOCAxMCA4IDggNiA4IDEwIDYgMTUgNCA0IDIKKzYgOSA2IDMgMTAgMTIgMTMgNyA0IDQgMyA0IDcgNSA0IDMgNCA3IDkgOCA5IDYgNiA4IDEwIDEwIDEyIDEwIDkgNyA4IDkgOSA4IDcgNiA3IDcgNyA3Cis1MDgwIDU4NTAgNDYxNSA1MDc2IDUyOTEgNTg3NiA1NTMyIDU0MzQgMzkxNiA0MjcyIDM2MTAgNDY2MSA0MzI2IDQ3MjggNDIxNSA1MTY3IDM5NDEgNTkxNCA0Njc0IDYyNzkgNDgxMiA2NTc4IDQ3NjMgNzIwMiA1NjkxIDcxOTUgNTY3MiA4MjIzIDYxODMgNzk1MSA2MDkyIDc4MTMgNTczNSA3OTg0IDYwNzEgNzUwNSA1OTU0IDY2MzYgNTA5MiA1NDM5Cis0IDggNCAxIDExIDE1IDE4IDUgMiAyIDEgMSA2IDMgMiAxIDIgNSA5IDYgOSAzIDQgNSAxMCA5IDE1IDggOCA0IDYgNiA4IDUgNSAzIDUgNCA1IDUKKzQgNCA2IDYgNiA3IDYgNiA4IDQgNSA4IDMgOSA3IDkgNiA3IDggOSAxMSA5IDggMTAgOCA3IDcgOCA5IDggOSA4IDkgNiA3IDkgNyA5IDggNgorNTA1NSA1NzQ0IDQ2NTMgNTE0MCA1MzEyIDU5NTMgNTU0NyA1NDc2IDQwMjIgNDI2MSAzNjQ3IDQ4NzIgNDI5NCA0OTk3IDQyODggNTQwOSAzOTk1IDU5ODkgNDc2MSA2NDU1IDQ5NzMgNjczNiA0ODQ4IDczODQgNTc1MyA3MTkzIDU3MDkgODIyMSA2MjU4IDc5NjUgNjE2OSA3ODM1IDU4MjEgNzg3MyA2MDk4IDc2MDcgNTk4NCA2NzkwIDUxNjkgNTQ4MQorMSAxIDQgNCA0IDUgMyAzIDggMiAzIDcgMSA5IDYgOCA0IDUgNyA3IDE0IDcgNyA4IDYgNCA1IDUgOCA1IDggNSA4IDMgNSA2IDUgNyA3IDMKKzYgNCA0IDUgMyAzIDcgNiA4IDkgOSA2IDQgNyA0IDQgNiA2IDggMTAgNiA2IDkgMTAgOSA2IDggNiA2IDkgNiA5IDEwIDcgNyA4IDYgOSA4IDYKKzUwODIgNTY0NSA0NjM5IDUxMzggNTI1NiA1NzgwIDU1ODcgNTUxNiA0MTI2IDQ1NTggMzc4NiA0OTQ4IDQyODkgNTEyNyA0MjgzIDUzMzAgNDA0OCA1OTk4IDQ4NDYgNjY4MiA1MDAyIDY3MDAgNDk1NyA3NTU1IDU4MzkgNzEzMCA1NzcwIDgwOTYgNjI1NSA4MDQwIDYxNjggNzkxNyA1OTMxIDc4MzAgNjEyNCA3NjQyIDU5ODcgNjkzNSA1MjQ0IDU1MjAKKzQgMSAxIDIgMSAwIDUgMyA4IDkgMTEgNCAyIDUgMiAxIDQgMyA3IDkgNCAzIDkgOCA4IDMgNiAyIDMgNiAzIDYgMTAgNCA0IDUgMyA3IDcgMworOCA4IDEyIDEwIDUgMiAxMCA3IDYgNyA1IDQgNCA1IDMgNSA0IDkgOCA5IDcgOSA4IDggOCAxMCA3IDggMTEgMTYgMTIgMTAgMTQgMTIgOCAxMSA5IDggOCA4Cis1MTU5IDU3OTcgNDgyOSA1NDQ0IDUyNTIgNTU1NiA1NzAzIDU2MTUgNDE3NiA0NzE0IDM4MTkgNDg5NiA0Mjg0IDUxMjYgNDI1MiA1MzE3IDQwNDkgNjE5MSA0OTI5IDY4MzQgNTA1NiA2ODUwIDUwMzcgNzU5MyA1ODk3IDczMTYgNTgwNCA4MTAxIDYzODAgODU0MCA2MzIwIDgwNTYgNjE0MCA4MDk3IDYxNzUgNzg1OSA2MDY3IDcwMTAgNTMxNyA1NjgwCis3IDYgMTcgMTEgMiAwIDEwIDUgNCA1IDMgMSAyIDIgMSAyIDIgOCA3IDcgNSA3IDcgNSA2IDggNSA1IDExIDIwIDE0IDggMTkgMTEgNiAxMCA4IDUgNyA2CisyIDggOSA2IDYgNiA2IDUgOCA3IDggNiA1IDQgNCA2IDUgNyA2IDkgMTAgNiA4IDkgOCA3IDcgOSAxNSAyMCAxNCA4IDExIDEzIDEzIDE0IDggOSA2IDcKKzUwODEgNTk0MCA0OTM4IDU0ODUgNTI3NCA1NTkxIDU3MTQgNTU4NSA0Mjc2IDQ4NjEgMzkyOCA0OTcwIDQzMDQgNTA2NCA0MjQ4IDUzNjYgNDA3NSA2MjQ5IDQ5NTkgNjk3NiA1MTg1IDY4MDcgNTExNSA3NjkwIDU5NTQgNzMwNyA1ODM4IDgxNjcgNjYwNCA5MjU2IDY1MjAgODA2NCA2MjY3IDg0MDkgNjM1MyA4MjQ3IDYxMjAgNzE0MiA1MzM3IDU3NjkKKzAgNiA5IDMgNCAzIDMgMiA4IDUgOCA0IDMgMSAyIDQgMyA0IDQgNyAxMSAzIDcgNiA2IDQgNSA2IDIxIDI5IDE5IDUgMTIgMTMgMTYgMTUgNiA3IDQgNQorNyA4IDUgNSA1IDQgMyA1IDcgMTIgOSA1IDYgNiA3IDcgNiA0IDcgNiA1IDUgNSAxMiAxMyA1IDggMTIgMTAgOSA4IDcgMTAgOCA5IDEwIDExIDggOCA2Cis1MTMzIDYwNzUgNDk0MiA1NDYzIDUyNzAgNTUwMSA1NjQ4IDU1NTcgNDM0OCA1MzA2IDQwNjAgNDk3OCA0MzQ5IDUxMjggNDMyMCA1NDc0IDQxMjYgNjExOSA1MDE0IDY5MjYgNTE4MyA2NzA1IDUxMTUgNzk2NSA2MTM3IDcxNzUgNTg5NiA4NDE0IDY2OTQgOTI1MyA2NTYxIDgwMTAgNjM2NiA4Mzk1IDY0MjQgODM2NiA2MjQ4IDcyMDQgNTQwOCA1NzkxCis1IDYgMiAyIDIgMSAwIDIgNiAxNiAxMCAyIDQgNCA2IDUgNCAxIDUgMyAyIDIgMiAxMSAxNyAyIDYgMTEgOSA1IDYgNCA5IDUgNyA3IDEyIDUgNyAzCisxMCAxNyAxNSAxMCA5IDUgMTAgOCA4IDkgNSA0IDUgMTAgOCA2IDEwIDUgOSAxNiA4IDkgMTAgMTEgNyA5IDExIDEzIDEyIDEwIDEwIDcgOSA3IDcgOCAxMCA4IDcgNgorNTI2MCA2NzU0IDUyMDIgNTc0OSA1MzY4IDU0NzggNTc2MiA1NzE1IDQ0NDMgNTU0MCA0MDg2IDQ5MjUgNDM2OCA1NDM0IDQ0MTYgNTUxNCA0Mjc4IDYwNTkgNTExOCA3NDkzIDUyNTggNjg1NSA1MjQyIDgxNjIgNjE2MiA3Mjk3IDYwMzAgODcwNyA2ODMzIDkzMTIgNjY1MiA3OTU5IDY0MzcgODMyMSA2NDQyIDgzNTUgNjM0NyA3MjYzIDU0NTEgNTgxMgorMTEgMjcgMjUgMTAgOSAyIDEwIDYgOCA4IDMgMSAzIDExIDggMyAxMiAyIDkgMjIgNyA3IDExIDkgNCA3IDEyIDEzIDEzIDcgOSA0IDcgMyA0IDUgOSA1IDUgMworMTEgMTQgMTIgNyA5IDEwIDEwIDkgOSA1IDcgNyAxMiAxMCAxMCA2IDQgNSA5IDcgNyA3IDkgOCA3IDggOCAxMCAxNCAxMSAxMSA5IDcgMTIgMTAgOSA4IDggOCAxMAorNTQwOSA3MjA4IDUzNzggNTgzNCA1NDY0IDU3NjMgNTg3MyA1OTI1IDQ1NjIgNTUxNCA0MTYyIDUwNTkgNDU2NSA1NzIyIDQ1NjEgNTU1MSA0MjczIDYwMDIgNTIyMCA3NDczIDUzMDUgNjg3MyA1MzQxIDgxNjMgNjE4NyA3MzUwIDYwODMgODc5OCA3MDIwIDk0MjkgNjc2NyA4MDM0IDY0NTUgODU1OSA2NTM2IDg0MDYgNjM5MyA3MzE4IDU1MTkgNjA3NworMTMgMTcgMTYgNSA4IDEwIDEwIDggOSAyIDYgNSAxNyAxMCAxMiAzIDIgMiA5IDQgNSA0IDkgNSA0IDUgNiA3IDE3IDggMTEgNiA0IDExIDkgNiA2IDUgNyAxMAorOCAxMiAxNiAxNyA5IDkgNSA4IDEwIDkgNiA0IDkgNyA5IDEwIDUgNyA4IDcgNiA4IDkgMTIgMTMgOSAxMCAxMSAxMSA4IDggMTEgMTAgMTAgMTAgOCA3IDggOSA4Cis1NDc4IDc1MTIgNTY1MiA2NTI4IDU1NTcgNTk3MCA1ODU0IDYwNjEgNDcwMyA1NzM2IDQyMTEgNTAwMSA0NjgxIDU4MDggNDY3NyA1ODMyIDQyOTQgNjA3MSA1Mjk0IDc0NTQgNTMyNSA2OTUyIDU0MzcgODQxMCA2MzY0IDc0NjEgNjE4NiA4OTQ1IDcxMjUgOTM1NCA2ODAyIDgyMjcgNjU0OSA4NjU5IDY2MjggODM5MyA2NDEyIDczNzAgNTYxMSA2MjAzCis3IDEyIDI3IDI4IDggOCAyIDYgMTIgOCA0IDEgOSA1IDkgMTAgMyA1IDcgNCA0IDUgOCAxMSAxNiA3IDEwIDkgMTAgNCA2IDkgOSA3IDkgNSA0IDUgOCA2CisxMSAxMiA3IDggOSAyIDIgNyA4IDggOSA2IDEzIDExIDUgNyA5IDkgNiA4IDYgNSAxMCAxNiAxMSA5IDkgMTMgMTMgNyAxMCAxMSA5IDEwIDEwIDcgNiA2IDUgNgorNTYyMiA3Nzk4IDU2ODkgNjYyNyA1NjQ4IDU3MzQgNTc1OCA2MTI3IDQ3OTAgNTg4MyA0MzM1IDUwNjkgNDg5NiA2MTM1IDQ2ODggNTkxMiA0NDE2IDYyNTkgNTMxNSA3NDk4IDUzNDUgNjg0MiA1NTU2IDg4ODggNjQ4NiA3NTY2IDYyNjEgOTIwNyA3Mjc5IDkyMjIgNjg4NyA4NDA5IDY2MTUgODc1MyA2NzE4IDgzMTkgNjQwNSA3Mjk2IDU1OTggNjE5OQorMTMgMTIgNSA2IDggMCAwIDQgNyA2IDEwIDQgMTkgMTIgMyA1IDEwIDggNCA1IDQgMiAxMCAxOSAxMSA3IDggMTIgMTUgMyA5IDkgNyA3IDkgMyAzIDMgMiAzCis2IDEwIDEwIDExIDYgNiA1IDYgNyA4IDExIDMgNSA3IDMgNiA3IDggOCA5IDggOCAxMCA5IDcgMTEgOSA5IDEwIDEwIDExIDcgMTAgMTEgMTAgNyA3IDEwIDkgNworNTYzNSA3OTQ0IDU4MDIgNjkwNSA1NjYwIDU3NTggNTc0MiA2MTI4IDQ4NDkgNjAyMSA0NTA3IDQ5NDkgNDkwMSA2MTk2IDQ2NDcgNTkyNSA0NDg0IDYzNzQgNTM4NiA3NjAxIDU0MTYgNjkyMiA1NjcyIDg5MDcgNjUwMyA3Nzg3IDYzMzQgOTIwNyA3MzUyIDkyODMgNjk5NiA4MzM0IDY3MDUgODkwMyA2ODA1IDgyNDkgNjQyNCA3NDcyIDU2ODggNjI1NworMyA4IDEwIDExIDMgMyAyIDMgNSA2IDE1IDEgMiA0IDEgMyA2IDYgNyA2IDcgNSAxMCA2IDQgMTAgOCA1IDggNyAxMSAzIDkgOSA5IDMgNCA4IDggNAorNiAxMSA2IDggNiA1IDQgOSAxMCA1IDUgNyA1IDUgNiA2IDkgOCA4IDEwIDkgNyA3IDYgOCA4IDcgOCA2IDcgNyA5IDggNyA5IDEwIDEwIDEwIDggNworNTY0NyA4MTQzIDU4MTAgNjk4MiA1NjcyIDU3MTkgNTcwMCA2MzEzIDQ5ODMgNTk2NiA0NTIyIDUwODIgNDkwNiA2MTMxIDQ2ODQgNTkzOCA0NjAyIDY0ODMgNTQ1NiA3NzU5IDU1MTAgNjkzNiA1NzA5IDg3NDEgNjU0NSA3ODExIDYzNTQgOTE0NiA3MzIxIDkxNTYgNzAwMCA4Mzg2IDY3NDIgODc5OCA2ODY1IDgzNjggNjUxOSA3NjM4IDU3NTAgNjMxMQorMyA5IDMgNSAzIDIgMSA4IDExIDIgMyA1IDIgMiA0IDMgOSA2IDcgOCA4IDQgNSAyIDYgNSA0IDQgMyAzIDQgNiA2IDMgNyA3IDkgOCA2IDQKKzcgMTYgMTggMTIgNyAxMSAxMyA5IDYgMyA0IDUgMiA4IDYgNCAxMCAxMSAxMSA5IDExIDggNSAxMSA5IDggOCAxMCAxMCA5IDcgMTAgMTEgOSA5IDExIDExIDkgNyA1Cis1Njg0IDg2MzcgNjEyNSA3MzAwIDU3MDkgNjA1MSA1ODkwIDY0ODcgNTAxMSA1NzkyIDQ1MTEgNTA4NCA0ODM0IDYyNTQgNDcyMCA1ODI3IDQ3NDIgNjc2OSA1NjAwIDc4NDYgNTY1MyA3MDExIDU2OTQgODg5MiA2NjExIDc4MzMgNjM5OSA5MjExIDczOTMgOTE1OSA3MDA0IDg0OTcgNjg1NCA4ODIzIDY5MjMgODU0MSA2NjM3IDc3MzIgNTc4NSA2MjM5Cis1IDE5IDMyIDEyIDUgMTIgMTcgNyA0IDAgMSAyIDAgNiA0IDEgMTIgMTEgMTMgNiAxMyA1IDIgOSA3IDUgNiA3IDggNSA0IDcgMTEgNiA3IDkgMTEgNiA1IDIKKzcgNSAxMSAxMyA4IDYgOCA1IDUgNSA3IDEwIDYgOCAxMSAxMCAxMCAxMCAxMCA3IDkgMTEgNyA3IDggNSA3IDggMTMgMTAgOCA4IDkgOSA5IDcgOSA3IDUgNAorNTcyMSA4NDI1IDYyNTMgNzY2MCA1NzcwIDYwNTYgNTk0NyA2NDA0IDUwMTMgNTc1MSA0NTc3IDUzOTMgNDg2NiA2MzcwIDQ4ODMgNjA5MSA0ODc5IDY5NzcgNTcxNSA3ODA1IDU3NDEgNzI2NiA1NzMwIDg3ODggNjY1MCA3NjcwIDY0MTggOTE0OSA3NTQwIDkyMjMgNzAzMyA4NDc4IDY5MTIgODg0NiA2OTgwIDg0NTggNjcwMSA3Njk4IDU3NjggNjExMAorNSAxIDEyIDE0IDYgMyA2IDIgMiAyIDYgMTEgNCA2IDE0IDEwIDExIDkgMTAgNCA4IDEwIDUgMyA2IDIgNCA0IDE0IDcgNSA1IDcgNiA3IDMgNyA0IDIgMQorNiAxMCA2IDQgNCAzIDUgNyA5IDYgNiAxMiA4IDMgNiA4IDUgNiA2IDUgOSAxMSAxMCA5IDYgNCAxMSA5IDE0IDExIDEwIDkgMTMgMTAgOSA4IDkgOCA4IDUKKzU3MzEgODUzMyA2MjUwIDc0NDYgNTcyOCA1ODc2IDU5MjYgNjQ0OSA1MTE3IDU3NzQgNDYxNiA1ODA2IDQ5NDkgNjE3MiA0OTE0IDYyMTcgNDg4NSA2OTI3IDU3MjUgNzY0MyA1ODI3IDc1MDUgNTg0MiA4ODEzIDY2MzcgNzQ1NSA2NTM4IDkxNTMgNzcwOSA5MzQ1IDcxMTMgODUyMiA3MDcxIDg5MjkgNzAzNSA4NDQyIDY3NjMgNzcyNyA1ODI4IDYwNTAKKzMgNyAzIDEgMSAwIDIgNCA5IDMgNCAxNSA3IDAgNCA2IDIgMyAzIDIgOCAxMCAxMCA2IDMgMSAxMSA1IDE2IDggOSA2IDE1IDcgNyA1IDcgNSA2IDIKKzIgNiA4IDUgNCA0IDUgMyA1IDMgNiAxMCA4IDQgNiA1IDYgNyA4IDcgOSAxMSAxMyA5IDExIDExIDEzIDE0IDEwIDYgOCA3IDkgOCAxMiAxMSAxMyAxMSA3IDUKKzU2MzkgODM4OSA2Mjk4IDczMDYgNTY4NyA1NzY5IDU5MDUgNjI0NiA1MTE3IDU2MTEgNDY1NCA2MDcyIDUwMjkgNjA0NyA0OTQ0IDYxNTEgNDkxNiA2OTQxIDU3ODYgNzYxNCA1OTExIDc3MzAgNjAyOCA4ODM3IDY3NTIgNzY4MyA2NzA3IDk0NjMgNzc3MiA5MTUyIDcxMzkgODQ0MCA3MTI0IDg4ODQgNzE2NiA4NjExIDY5MjYgNzkzOSA1ODYxIDU5OTQKKzAgMiA2IDIgMSAxIDIgMCAyIDAgNCAxMCA3IDEgNCAyIDQgNCA2IDQgOCAxMCAxNyA2IDExIDEwIDE2IDE0IDggMiA1IDMgNyA0IDEzIDkgMTUgMTAgNSAyCis2IDUgNSA3IDYgNyA1IDIgNiA3IDkgNSA2IDYgNSA2IDcgNiA3IDUgNiAxMCAxMyAxMCAxMSA5IDEwIDE2IDExIDEyIDEyIDExIDggOCA5IDEwIDEwIDEwIDkgNgorNTY1MSA4MTkyIDYyNjggNzI5NyA1Njk4IDU4NTIgNTg4NSA1OTk0IDUxNDIgNTcwNCA0NzY3IDYwMTQgNTA1NiA2MDUyIDQ5NDggNjE1MCA0OTcyIDY4OTMgNTgyMCA3NDY0IDU5MTYgNzg4MCA2MjA5IDg5MjEgNjg2NCA3Nzc0IDY3OTUgOTg3OCA3ODU5IDkzNDAgNzI2NyA4NjA5IDcxNTAgODg0MiA3MjE3IDg3MDggNzAwOCA4MDc3IDU5NDQgNjAwMgorMyAyIDIgNCAzIDUgMiAwIDQgNSA5IDIgNCAzIDIgMyA1IDMgNSAyIDMgOCAxNyA3IDExIDYgOSAxNyAxMCAxMCAxMiA5IDUgNCA3IDcgOSA4IDggMworMyAxIDQgNiA1IDUgOCA5IDggNCA4IDUgNSA3IDggMyA1IDYgNSA1IDE1IDEyIDcgMTEgOSA3IDkgMTAgMTAgNyA4IDcgOCA4IDExIDEwIDkgOCA2IDgKKzU1ODYgNzc2MSA2MjEzIDcyMjcgNTY4MyA1ODA4IDU5NDIgNjE4NyA1MjE4IDU2MDcgNDg1MiA1OTYwIDUwNTcgNjExOCA1MDI4IDU5NjUgNDk3NSA2ODQ4IDU4MDIgNzMyMyA2MTUxIDgxNDQgNjIzMiA5MDYxIDY5MjIgNzczNyA2ODU1IDk4OTkgNzkxOCA5MjA5IDcyOTAgODUyMiA3MTc2IDg4MDMgNzMxOCA4Nzk5IDcwNjMgODA4MyA1OTQ4IDYxMzMKKzAgMCAxIDMgMiAyIDYgOCA3IDEgNyAyIDIgNCA3IDAgMiAzIDIgMiAyMiAxMSA0IDkgNyA0IDcgNiA4IDMgNSAzIDUgNCAxMCA3IDcgNSAzIDYKKzQgNSA1IDkgOCAxMyAxMCA5IDggNCA4IDExIDUgNCA3IDggOSA4IDcgOSA5IDEyIDEyIDcgNiA3IDggMTEgMTAgNyAxMiAxNSAxMSA4IDcgOSA5IDkgMTEgNworNTU0OCA3NjAyIDYxODUgNzM0NiA1NzQ1IDYyNTggNjA0OSA2MzY4IDUyOTIgNTUxNiA0OTM1IDYyNzggNTA1OCA1OTk2IDUwODEgNjA5OCA1MDgwIDY5MjggNTgzNiA3NDM2IDYyMjcgODM5MiA2MzgzIDg5NDcgNjkwMiA3NzAyIDY4ODggOTk4MCA3OTc1IDkwODYgNzQxNCA4OTMyIDcyNzggODc2NiA3MzE0IDg4MjQgNzExNiA4MTUwIDYwODAgNjE5NQorMSAyIDIgNyA2IDE2IDEwIDggNyAxIDcgMTIgMiAxIDUgNiA5IDUgNSA3IDggMTEgMTQgMyAzIDQgNSA4IDggMyAxMiAxNiAxMCA0IDQgNiA3IDYgMTIgNAorNyAxNiAxMyAxMSA2IDkgMTEgOSAxMiA5IDkgOSA1IDQgNSA0IDcgOSA5IDggNSA5IDcgNyAxMSA2IDUgOSA5IDkgMTAgMTEgMTEgNiA4IDkgMTAgOSA4IDYKKzU1ODggODEyOCA2MzYyIDc1ODEgNTc1NCA2NDM1IDYxNzkgNjUzOCA1NDY2IDU3MzcgNTA0MSA2NDU0IDUwNTkgNTg4MiA1MDgxIDU5NzcgNTEzMiA3MDY1IDU5MjAgNzQ4MSA2MTk5IDg0NDEgNjQwMiA4ODQwIDcwMTAgNzYwOCA2ODQzIDk5MzQgODAwNSA5MDkzIDc0ODQgOTA3MSA3Mzc3IDg2MDggNzMzNSA4ODQ3IDcxOTMgODIxMyA2MTMyIDYxOTEKKzUgMjAgMTYgMTAgMyA3IDEyIDcgMTUgOCA5IDcgMiAxIDIgMSA1IDcgOCA1IDIgNiA0IDMgMTEgMyAyIDUgNiA2IDggOSAxMCAyIDUgNiA5IDYgNiAzCisxNCAxNSAxMSA3IDIgNiAxMCA5IDQgNSA4IDkgOCA5IDQgOSAxMSA5IDQgNyA3IDggNyA5IDkgMTQgMTQgMTEgMTUgOCAxMCA5IDExIDggOSA4IDEwIDggOSA2Cis1ODA2IDg1NjEgNjQ4NCA3NTU2IDU2NjEgNjQxNyA2MjgwIDY2OTggNTQzMSA1Njk5IDUxMTkgNjYxOSA1MTM3IDYwODIgNTA1NiA2MTcxIDUyODUgNzE5NCA1ODc0IDc0NjIgNjIyMyA4NDI2IDY0MjEgODg2MiA3MDY1IDgwMTEgNzAzMCAxMDAxMyA4MTg4IDkwMzggNzU1MiA5MDc5IDc0NzQgODU4MyA3MzgxIDg4MDcgNzI2OSA4MjExIDYyMDggNjE4OAorMjAgMTcgMTEgNCAwIDMgOSA3IDEgMiA3IDcgNyA4IDEgOCAxMyA3IDEgNCA0IDUgNCA2IDcgMTYgMTcgOCAxOCA0IDggNiAxMCA1IDcgNCA4IDUgOCAzCiszIDUgNCA1IDMgMiA0IDUgOSAxMCAxMCA4IDEwIDEyIDQgOCAxMCA2IDMgOCA5IDEwIDYgNiA5IDEyIDggOCAxMyAxMCA2IDcgMTEgMTEgMTAgNSA3IDkgMTEgOAorNTczNyA4MzU0IDY0MjQgNzQwOSA1NTk2IDYxNTQgNjIyNSA2NjAzIDU1MjUgNTk3MSA1MjQ2IDY3MTMgNTI2NCA2NDU0IDUwMzIgNjI5MiA1NDA4IDcxMzEgNTgwNCA3NTA1IDYyOTcgODUzNCA2NDE0IDg2OTggNzExOCA4MjY3IDcwNTkgOTkwMyA4MzE1IDkxMTAgNzUxNiA4OTY0IDc1NjggODc0MyA3NDUyIDg1ODUgNzI2NiA4MjcxIDYzMzQgNjMwOAorMCAxIDEgMiAwIDAgMSAyIDggMTAgMTEgNiAxMSAxNCAxIDYgMTEgMyAwIDUgOCA3IDMgMiA3IDExIDUgNCAxMyA3IDMgMyAxMCA5IDggMSA0IDYgMTIgNgorMTAgMTMgOCA2IDkgNSA3IDUgNCA2IDYgOCA4IDcgNiA2IDggNiAxMSA3IDEwIDkgMTYgMTIgMTIgMTEgOSA4IDExIDkgMTEgOCAxMSAxMiA4IDUgOSAxMSAxMSA4Cis1ODQ5IDg2NTEgNjQ2OCA3MzMzIDU2ODYgNjA5MSA2MjQ4IDY1MTQgNTQ4OSA1OTgxIDUyNjggNjgwMSA1MzM3IDY0OTYgNTA1OSA2MjgzIDU0NzcgNzA3MSA1OTQwIDc0ODQgNjM5NSA4NTc0IDY2NjIgODkxMyA3MjQ3IDg0NDYgNzExMiA5ODAwIDgzODggOTExNiA3NjA5IDg5MTcgNzY2MCA4OTU1IDc0NzAgODM3NyA3MzE0IDg0NTAgNjQ1NyA2NDIxCisxMCAxMyA2IDMgOCAyIDQgMiAxIDMgNCA2IDcgNCA0IDMgNyAzIDEyIDQgOSA2IDI0IDEwIDEyIDkgNyA0IDkgNiAxMCA0IDEwIDEwIDUgMSA3IDkgMTEgNgorNyAxMiA2IDQgNyA1IDEwIDggOSA4IDYgNCA0IDUgOSA5IDEwIDYgMTMgNyA1IDggMTEgMTMgNyAxMSAxMCAxMiAxMSAxMyAxMSAxMCAxMCA4IDggMTAgMTEgMTAgMTAgNgorNTg4MSA4ODY5IDY0NTkgNzEzOCA1NzIyIDYwMzIgNjM0NyA2NjE0IDU1ODIgNjExMyA1Mjg5IDY2MzggNTMwNiA2NDEzIDUxNjIgNjQ1OCA1NTk1IDcwMTUgNjEyNCA3NDY1IDYzNjMgODU1MSA2Nzc2IDkxNzYgNzI0NSA4NjE1IDcxOTAgOTk0OSA4NDU5IDkzNjcgNzcwMCA4OTk2IDc3MjQgODkwOSA3NDg4IDg0ODggNzQxMiA4NTU3IDY1NTEgNjQwNAorNSAxMCAzIDEgNSAyIDkgNiA4IDYgNCAxIDEgMiA5IDcgMTAgMyAxNyA0IDIgNSAxMSAxMiA0IDkgOSA5IDkgMTIgMTAgNyA4IDQgNSA3IDEwIDcgOSAzCis4IDEyIDExIDYgNCA3IDcgMyA3IDcgOCA3IDYgNCA3IDUgOCA1IDcgNyA4IDggNiA5IDkgOCAxMyAxMSA5IDExIDEyIDE0IDEzIDkgOSA5IDEwIDExIDEwIDYKKzU5MzggOTA3NCA2NTc4IDcwNzggNTY4MSA2MTAwIDYzNjcgNjQwMSA1NjIxIDYxNzYgNTM2MSA2NjY5IDUzMjYgNjI3MyA1MjEyIDYzNzcgNTY1OSA2OTAxIDYxNTAgNzQ0NyA2NDA4IDg1MjkgNjc2MCA5MTc4IDcyOTQgODU4OSA3MzQyIDEwMDI3IDg0NzcgOTQ4MCA3ODE0IDkzMTYgNzg2MyA4OTI3IDc1MzEgODUzMSA3NDgyIDg3MTkgNjY0MyA2Mzg4Cis2IDEwIDExIDMgMSA0IDQgMCA1IDQgNyA0IDQgMSA1IDIgNiAyIDQgNCA2IDUgMyA1IDcgNSAxNCA4IDYgOCAxMiAxNCAxNCA2IDcgNiA4IDkgOSAzCis4IDExIDcgMTAgMTEgOCA5IDcgNiA2IDYgNiA0IDcgOSA3IDggNSA1IDcgNiA2IDcgNiA4IDkgMTMgMTQgMTMgMTIgOSAxMSAxMCA1IDkgOCA2IDggOSA3Cis1OTk0IDkyMDUgNjU5MiA3MjY3IDU4MjAgNjIyNSA2NDM4IDY0NDcgNTYzNCA2MTc0IDUzODAgNjYzNyA1Mjk1IDYzMjYgNTMxMSA2NDI0IDU3MjIgNjc5NCA2MTI0IDc0MzAgNjQwMSA4Mzg1IDY3NzAgODk5NSA3MzE2IDg2MjYgNzQ5MSAxMDI4NSA4NTk3IDk2NDggNzg0OCA5NDMyIDc5MjIgODY5OCA3NTczIDg1MTAgNzQ0OCA4Njg3IDY3MDcgNjQzNAorNiA4IDQgOCAxMiA2IDcgNCAzIDMgNCAzIDEgNCA5IDQgNiAyIDIgNCAzIDIgNCAyIDUgNiAxNCAxMyAxMyAxMCA2IDggOCAxIDcgNSAzIDQgNyA0Cis0IDggNSA5IDcgMyA0IDYgNyA0IDcgNyA3IDggNCA2IDYgNSA2IDkgMTEgNSA1IDcgNyA3IDkgMTIgMTAgNyAxMSAxMiAxMSAxMiAxNCAxMiAxMCA4IDkgNworNTk0NiA5MTQ0IDY1NTUgNzM4MyA1ODUzIDYwMzUgNjM3OSA2NDI4IDU2NzIgNjA0OSA1NDI0IDY2NjggNTM0MSA2NDM3IDUyODAgNjQwNyA1NzMyIDY2OTMgNjEyNCA3NTM3IDY1MjIgODE4OSA2NzI4IDg4ODUgNzMxMiA4NTM4IDc1MzQgMTA0MDUgODYzOCA5NDk5IDc5MzMgOTYwMyA4MDA1IDg5MTMgNzc0MSA4NzM2IDc1MTcgODY1NyA2NzY5IDY0NzgKKzEgNCAyIDcgNSAwIDEgMyA1IDEgNSA0IDUgNiAxIDMgMyAyIDMgNyAxMSAyIDIgMyA0IDMgNyA5IDcgMyAxMCAxMCAxMCAxMCAxNiAxMSA4IDQgNyA0Cis0IDcgNyAxMyA5IDggNyA3IDggNyA5IDExIDcgNiAzIDUgNiA2IDYgNiA5IDUgNiAxMCA4IDkgNyA5IDEyIDggOCA5IDEwIDEwIDEwIDExIDEwIDkgOSA4Cis1ODk5IDkwMjUgNjU3MCA3NzM4IDU5MzYgNjE2NCA2Mzk4IDY0NzIgNTczNCA2MTE2IDU1MTggNjk0MyA1Mzg2IDY0MTkgNTIyNCA2MzI5IDU3NDIgNjY2MCA2MTI0IDc0NTMgNjU4OSA4MDA0IDY3MTMgODk2NiA3MzMzIDg1NzggNzUyNCAxMDMzMyA4NzI5IDk0MjAgNzkzOSA5NTc5IDgwNjAgODk5MiA3ODAzIDg4ODcgNzU4NCA4NjkwIDY4MzAgNjU4MAorMSAzIDQgMTQgOCA2IDQgNCA2IDQgOCAxMSA1IDMgMSAyIDMgMyAzIDMgNyAyIDMgNyA1IDYgNCA1IDExIDQgNSA1IDggNyA4IDkgOCA2IDcgNgorOSA4IDcgMTggMTEgOCA2IDcgNCA1IDEyIDExIDExIDYgOCA2IDkgMTAgOCA4IDggOSA5IDEwIDExIDkgMTMgNyA5IDggOCAxMyAxNCA5IDggOCAxMCA4IDkgNworNTk4MSA4OTc1IDY1ODQgODM3OSA2MDY5IDYyODUgNjM5MSA2NTEzIDU2OTMgNjA1NiA1Njg3IDcyMDIgNTUzMiA2NDAyIDUyOTggNjMxNyA1ODI4IDY4NzQgNjE3NSA3NDk3IDY2MjkgODA3NiA2Nzc1IDkwNDIgNzQzMSA4NjE2IDc2NjggMTAxNDMgODc0MSA5MzQ2IDc5NDUgOTgwMiA4MjE2IDkwMDUgNzgxMiA4ODQ1IDc2NTAgODY2MCA2ODg5IDY2MTUKKzggNCA0IDI1IDEyIDYgMyA0IDEgMiAxNSAxMCAxMyAzIDcgMyA4IDkgNiA1IDYgNiA3IDcgMTAgNiAxNCAzIDYgNCA1IDExIDE1IDYgNSA0IDggNCA3IDQKKzYgNSA0IDkgMTAgOCAxMCA4IDQgNCA4IDEyIDggNCA4IDcgNSA3IDkgNiA3IDggOSAxMSAxMSAxMiAxMSA3IDcgNyA4IDExIDExIDExIDExIDEwIDYgOCA3IDYKKzU5ODUgODc0MyA2NTIxIDg0MjkgNjE3MyA2Mzk5IDY0ODcgNjYxMyA1NjUzIDU5MzggNTc0OSA3NTA3IDU1OTggNjI2MyA1MzcwIDYzNjggNTgxMCA2ODkxIDYyNTAgNzQxNSA2NjQyIDgwODIgNjgzNSA5MTc1IDc1MjYgODgzNiA3NzU3IDk5NjQgODcwMSA5MjE1IDc5NTEgOTg4OSA4MjkyIDkxNDAgNzg5OCA4OTI4IDc2MTIgODYzMSA2ODk1IDY1ODYKKzMgMSAxIDYgMTAgNiA5IDYgMSAxIDYgMTIgNiAxIDcgNCAyIDQgOCAzIDQgNSA3IDggMTAgMTAgMTAgMyAzIDMgNSA4IDkgOCAxMCA3IDMgNCA0IDMKKzggNSA3IDEyIDEyIDExIDcgNSA1IDUgNyAxMyAxMiA4IDggNiAxMiA4IDUgNCA4IDEwIDEyIDE4IDExIDEwIDkgOSA3IDggMTAgOCA5IDcgNyAxMCA4IDggOSA2Cis2MDQwIDg1MjUgNjUzNyA4NjYwIDYzMjUgNjY5MCA2NTA0IDY1MjMgNTYzOSA1ODg4IDU3ODQgNzg1NSA1NzY1IDYzNzggNTQ0MCA2MzU0IDU5NzEgNjk2OSA2MjIxIDcyMTUgNjY4MCA4MjExIDY5NzEgOTczMCA3NjE5IDg5MjAgNzc5MyA5OTE5IDg2NjIgOTE1MyA4MDA4IDk3ODcgODMxNSA5MDIxIDc4NzkgOTAwNiA3NjI2IDg2MDQgNjk1MiA2NTU5Cis2IDEgNCAxMSAxNCAxMSA0IDIgMiAyIDUgMTQgMTUgNiA3IDMgMTQgNSAyIDEgNiA4IDEzIDIyIDEwIDcgNiA1IDMgNCA4IDQgNiAzIDQgNyA1IDQgNyAzCis1IDggOCAxMiA1IDcgNCA3IDEwIDcgMTEgNiAxMCA2IDUgNSA2IDggNyA5IDcgMTMgMTIgMTEgNiA3IDkgOCA4IDExIDEyIDggOCA5IDkgNyA5IDkgOCA2Cis2MDE3IDg1MDUgNjU3OCA4ODc3IDYyOTQgNjcxOCA2NDQzIDY1NjEgNTc1MyA1OTY0IDU5MjAgNzc1MiA1ODc2IDYzNjMgNTQzMiA2Mjc5IDU5NzUgNzA0MiA2MjQ0IDczMzUgNjY5MiA4NTE3IDcxMDMgOTgyMiA3NTgyIDg4MTQgNzgyOCA5ODE1IDg2NTAgOTI3OSA4MTE0IDk2OTEgODMxMSA5MDMyIDc5MTIgODg5NSA3NjY1IDg2NDAgNjk4MiA2NTM0CisyIDUgNiAxMCAyIDQgMSA0IDEwIDUgMTIgMyAxMCAzIDIgMiAzIDUgNCA3IDQgMTMgMTMgOCAzIDMgNiA0IDQgOCAxMSA0IDUgNiA2IDMgNiA2IDUgMworNCA4IDkgOSA2IDkgNSAzIDUgOSA3IDYgOCA2IDQgMyA2IDcgNiA3IDYgOSA5IDE0IDIwIDEwIDggNyA3IDEwIDExIDYgNyA3IDkgOSAxMSA5IDEwIDExCis1OTY5IDg0ODYgNjY0MyA4ODk3IDYyOTAgNjg2NyA2NDA5IDYzNTEgNTczNyA2MTU5IDU5NTEgNzY1NSA1OTMzIDYzNDkgNTM5OCA2MDg2IDU5NzkgNzA0OSA2MjQxIDczMjQgNjY3OCA4NTU4IDcxNTUgMTAwOTIgNzkwMyA4ODk5IDc4MzcgOTY1NiA4NjEzIDkzMzYgODE5MiA5NDc4IDgyODIgODkyMCA3OTQ0IDg5MTQgNzc1NCA4Njc0IDcwNjMgNjgxNworMSA1IDcgNiAzIDcgMiAwIDIgOCA1IDMgNiAzIDEgMCAzIDQgMyA0IDMgNiA3IDEzIDMzIDcgNSAzIDMgNyA5IDIgMyAzIDYgNiAxMCA2IDkgMTEKKzggOSA4IDYgNSA0IDExIDExIDUgNCA4IDEwIDcgMyAzIDUgNSA3IDUgNiA5IDE2IDcgOCAxMCAxMyAxMiA5IDcgMTAgOSA3IDEwIDExIDkgOCA4IDcgOSA3Cis2MDI0IDg1MjkgNjY4MSA4NzMxIDYyNjAgNjcwMCA2NTMwIDY2NDUgNTcyMSA2MDM1IDYwMDYgNzgxMCA1OTYzIDYxNTIgNTMzOSA2MDI4IDU5NTcgNzA1NiA2MjEzIDcyNTMgNjc0MSA5MDI3IDcxNTUgOTk3OCA3OTYxIDkxNjMgNzk0OCA5NjI5IDg1NzYgOTM5MCA4MjE3IDkzMzkgODMzMCA5MDYwIDc5NzUgODg3MCA3NzY0IDg1ODMgNzExNiA2ODM4Cis2IDYgNiAyIDIgMSAxMSAxMSAyIDEgNiA4IDUgMCAxIDIgMiA0IDIgMyA3IDE5IDQgNCA4IDEyIDExIDUgMyA3IDYgMyA4IDkgNiA0IDUgMyA3IDQKKzEwIDkgMTEgOSA3IDQgNiA4IDMgNCA3IDQgNyA5IDYgNSA2IDggNyA2IDYgNiAxMyAxMiA5IDExIDE2IDE2IDE3IDEzIDkgOSAxMiAxMyAxNCAxNCAxMSA5IDggNgorNjEyOSA4NTcwIDY3OTUgODc2MCA2MjgyIDY1NDMgNjUyMCA2NzM3IDU2NTQgNTkxOCA2MDM1IDc1ODcgNTk5MyA2MzM1IDUzNTkgNTk3MyA1OTYxIDcxMjQgNjIzNiA3MTg2IDY3MjYgODg1NCA3MzA4IDEwMTE2IDc5OTIgOTI4OSA4MTU4IDEwMDM0IDg3OTYgOTYyNSA4MjQxIDkzMzEgODQyOCA5MzE1IDgxMzMgOTE5NyA3ODUxIDg2MjAgNzE0MiA2Nzk2CisxMCA2IDExIDYgNCAxIDMgNiAwIDEgNSAxIDUgOCA0IDIgMyA1IDQgMyAzIDIgMTUgOSA2IDggMjAgMTcgMjIgMTEgNiA1IDExIDEyIDE2IDE0IDEwIDYgNSAzCisxMyAxMSAxMyA2IDYgOCA4IDYgNSA3IDEwIDUgNiA2IDcgMTAgNCA2IDggOCA4IDE2IDE0IDExIDEyIDggNyAxMyAxMSA5IDkgMTAgMTEgMTEgMTEgOSAxMCA4IDcgOAorNjMwOCA4NzMxIDY5NTcgODYwMyA2Mjc4IDY2NDEgNjU2MSA2NzAxIDU2NDAgNTk5MiA2MTM5IDc0MzggNTk5NiA2MzIzIDU0MDQgNjIyOSA1OTE0IDcwNjUgNjI4NCA3MjQ2IDY3NjIgOTMwNSA3NDgzIDEwMTg0IDgwOTkgOTIyMyA4MTMzIDEwMjMwIDg4NTcgOTYwMCA4MjY1IDkzODUgODQ5OCA5NDMxIDgyMTEgOTE5OCA3OTEwIDg1OTQgNzE0MiA2ODc5CisxNiA5IDE1IDIgMyA2IDYgMyAyIDUgMTAgMiAzIDMgNSAxMCAxIDMgNiA1IDYgMTggMTcgOCAxMSA0IDQgMTEgOSA1IDYgNyA5IDggOSA1IDggNCA0IDUKKzEzIDE5IDE5IDExIDExIDUgNyA1IDkgMTEgOSA3IDcgNiA1IDcgNiA5IDYgNiA3IDE1IDEwIDExIDEyIDEyIDEwIDEyIDEzIDkgMTAgMTAgOCAxMCA4IDggMTEgOSA4IDkKKzY0ODIgOTM3NCA3MjY5IDg3NjIgNjQwMiA2NTQ5IDY1NzYgNjYwNiA1NzI5IDYzMDggNjIxNSA3NDIxIDYwMjUgNjMxMiA1Mzk2IDYyODUgNTkxOSA3MTk0IDYyODAgNzE3OSA2NzcyIDk2NjggNzU1MSAxMDI0OCA4MjAzIDk0MDYgODE4NSAxMDM1MyA4OTY4IDk1NzYgODMxNCA5NDM2IDg0OTAgOTQ3OSA4MjEwIDkxMzcgNzk5MyA4NjMxIDcxNjggNzAxOQorMTYgMjYgMzIgOSAxMSAyIDQgMiA4IDEyIDggNCA1IDMgMiA0IDMgNyAzIDMgNCAxNSA4IDggMTEgMTAgOCA5IDEyIDUgOCA3IDUgNyA1IDQgMTAgNiA1IDcKKzQgNCA2IDggNyA0IDkgOCA3IDYgNSA2IDggOSA2IDYgOCA3IDcgNyAxMSA1IDUgMTggMTYgMTAgMTEgMTUgMTUgNyA5IDEwIDExIDEzIDExIDcgNiA2IDYgNgorNjQyMiA5MDU3IDcyNDAgODcyNyA2NDIxIDY0MDEgNjY0MSA2NzAxIDU3NjQgNjI5OCA2MTg3IDczNDQgNjA3OSA2NDg2IDU0MTQgNjI3NiA1OTc1IDcxOTIgNjMwMiA3MTc4IDY4ODQgOTM5NSA3NDkwIDEwNzM5IDg0MDcgOTQ1NiA4MjYxIDEwNjUzIDkxMjcgOTQzMSA4MzM2IDk0ODQgODU1OSA5NzA4IDgyODYgOTAxOCA3OTQ2IDg0ODEgNzE0MiA2OTY2CisxIDEgMyA0IDQgMSA3IDYgNSAzIDIgMyA2IDcgMyAzIDYgNCA0IDQgMTEgMSAyIDIwIDIwIDcgOSAxNCAxNiAzIDYgNyA5IDExIDkgMyAyIDIgMyAzCisyIDUgNiAxMSA5IDUgOSA5IDcgNyA0IDkgOSA3IDUgNiA3IDggMTMgMTMgMTEgMTIgMTMgMTQgOSAxMCAxMCA3IDggOCAxMSAxMCAxMyA4IDkgMTAgMTIgMTEgNiA0Cis2MzEyIDg4MjAgNzIxMiA4ODc5IDY0OTAgNjMyNCA2NzA1IDY4NTEgNTc5OSA2MzUwIDYxMzQgNzQ1NiA2MTU3IDY1MjYgNTQwNiA2MjY4IDYwMDQgNzI1MSA2NDc2IDc1NDYgNjk5MyA5NTY4IDc2MzUgMTA5NTQgODQyNyA5NTAzIDgzMTAgMTA0NDMgOTEwMyA5MzU2IDg0MDkgOTUyOSA4Njc3IDk2MTcgODMwOSA5MDkxIDgwNTQgODY0NyA3MTE3IDY3OTMKKzAgMSAzIDkgNyAyIDcgNyA1IDQgMSA3IDggNCAyIDMgNSA1IDE2IDE0IDExIDEwIDE0IDEyIDYgNyA4IDMgNCA0IDkgNyAxMyA0IDYgNyAxMSA5IDMgMQorMTAgNiA3IDkgOSA4IDEwIDYgNyAxMiA5IDEwIDE0IDcgNyA2IDUgOSAxMyAxNCAxMyAxMyAxNCAxMiA4IDggMTAgOSA5IDkgMTAgNyAxMiAxMyAxMyAxMyA5IDkgNiA1Cis2NDEwIDg2NTkgNzIxMCA4ODk5IDY1NTggNjQzNiA2NzkzIDY4MDggNTgzMyA2NzA2IDYyMTAgNzYyMyA2MzYxIDY1NjQgNTQ0OSA2MjYwIDU5ODEgNzM2OCA2NjQ2IDc5NTMgNzE1MCA5NzkyIDc4MDIgMTEwMzQgODQyMSA5NDI0IDgzNTggMTAzNjkgOTEwNSA5MzQ3IDg0NTQgOTM4NyA4NzY3IDk4MzggODQzMyA5MzQ0IDgwODMgODY4MSA3MDkyIDY2OTIKKzkgMiA0IDYgNyA2IDkgMyA1IDEzIDggOCAxOSA0IDUgMyAyIDcgMTYgMTYgMTUgMTEgMTYgOCA1IDQgNyA1IDYgNSA3IDMgMTEgMTEgMTMgMTIgNiA2IDMgMgorOCA2IDYgMTUgMTUgNyA4IDUgNCAxMSA5IDEyIDE0IDYgNiA2IDUgNiA4IDkgMTQgMTAgMTEgMTEgMTMgOSA4IDggOCAxMSA4IDYgOSA5IDEwIDEyIDkgOSA5IDcKKzY0NTQgODUwOCA3MTgzIDkyODYgNjc3NyA2NDc5IDY4MjcgNjcwNiA1Nzg5IDY5NzkgNjI4NSA3OTAyIDY1NjAgNjUzOCA1NDY2IDYyNTMgNTk1OSA3Mjk0IDY2ODQgODAyOCA3MzI5IDk4MTggNzg4OCAxMTA0NyA4NTQzIDk0MTEgODM1MyAxMDIzOCA5MDgyIDk0NjIgODQ0NyA5MTkyIDg3NzggOTgwMCA4NDc4IDk1MjAgODExMSA4NzEzIDcxNDUgNjcyMAorNiAyIDMgMTYgMjEgNCA2IDIgMSAxMSA4IDEyIDE4IDMgMyAzIDIgMyA2IDYgMTcgNiAxMCA3IDEzIDUgNSA0IDQgOCA1IDIgNiA1IDcgMTAgNiA2IDcgNAorNiA1IDUgOSA1IDggNiA5IDcgMTAgMTMgMTAgMTQgOCA2IDUgNiAxMSA4IDEwIDkgMTAgMTAgMTIgOSAxMSA5IDkgMTAgOCAxMCA4IDExIDExIDkgNSA3IDkgMTAgMTAKKzY0NDYgODMwNCA3MTMxIDkyODEgNjczNSA2NTgxIDY4MDkgNjg1NiA1ODIzIDcxNzQgNjQ2MCA4MDQyIDY3NTQgNjYzNyA1NDgyIDYxODUgNTk2MyA3NTMyIDY3MjEgODE2MCA3Mzc2IDk4NDMgNzk0NiAxMTEyMSA4NTU5IDk1MjIgODM3NCAxMDE3NiA5MTEwIDkzODUgODQ5MSA5MTMyIDg4NDAgOTg4NyA4NDk2IDkyNTYgODA4NyA4NzQzIDcyMjIgNjkzMQorMyAyIDIgNSAyIDYgMyA3IDUgOSAxNiA4IDE4IDYgMyAyIDMgMTAgNiA4IDcgNiA4IDggNiA4IDYgNSA3IDQgNyA0IDkgOCA2IDEgNCA2IDggOQorMyA1IDUgNyA3IDYgNSA3IDkgOCAxMSA4IDcgOSA5IDQgNSA2IDcgMTIgNSA5IDkgMTEgMTggOSA5IDkgOCAxMyAxMyAxNCAxMiAxMCA3IDggMTAgOSA3IDkKKzYzNjEgODExMiA3MDgwIDkxNTQgNjc0NSA2NTU0IDY3NjYgNjg3NCA1OTA3IDcyMzUgNjU3OSA4MDUwIDY3NjQgNjc5MSA1NTc1IDYwNTkgNTk0MSA3NDQ4IDY3MzIgODQwNyA3MzE5IDk4MDUgNzk3NyAxMTEyOSA4ODA1IDk1MDMgODM5NSAxMDExOCA5MDg3IDk2MjAgODYxMSA5NDQ0IDg5MjYgOTkwOCA4NDYyIDkxOTIgODE0MCA4NzcxIDcyMjAgNzA2OAorMCAyIDIgMyA0IDMgMiA0IDggNSAxMSA1IDQgNyA4IDEgMiAzIDQgMTEgMiA1IDYgNyAyNCA1IDYgNSA0IDExIDEzIDE0IDEwIDYgMyA0IDggNiA0IDcKKzMgNyA5IDkgMTMgOSA5IDYgNyA0IDcgOSA1IDkgOCA3IDkgOCA5IDExIDUgNiAxMCA4IDE0IDEwIDEzIDEzIDkgMTEgMTIgOSA5IDkgOSA4IDkgNyA4IDYKKzYyNzggODA1NSA3MTMzIDkxNTcgNjkwOCA2NzEzIDY4MjcgNjgzMCA1OTM4IDcwNDYgNjU5MyA4MTE5IDY3MjIgNjkzNiA1NjQwIDYxMjUgNjAyMiA3NDkyIDY3OTQgODU3OCA3MjY0IDk1ODUgODAzMyAxMDk1MiA4OTQzIDk1NDcgODUxNyAxMDMwOSA5MDkwIDk3MTggODcwMiA5NDMwIDg5MzMgOTg2NiA4NDgwIDkxMzIgODE2NiA4Njc0IDcyNDQgNzAxMgorMCA0IDcgNSAxNSA3IDcgMyA1IDEgNCA2IDIgNyA2IDQgOCA1IDcgOSAyIDIgOCAzIDE0IDcgMTMgMTEgNiA4IDExIDUgNiA1IDYgNCA2IDMgNSAzCiszIDcgNCA5IDExIDEwIDUgMyA1IDUgNCA2IDUgNCA1IDkgOSA2IDUgNCA2IDYgNyA3IDEyIDExIDEzIDE0IDEyIDEwIDExIDEwIDcgNyAxMSAxMiA5IDggMTAgNworNjE5NyA4MDAxIDcwNTcgOTE2MCA3MDE2IDY5MjQgNjc4NCA2NjA0IDU5MTcgNjkzMCA2NTMwIDgwMDAgNjY4MiA2NzY1IDU2MjcgNjMxMCA2MTAxIDc0MTEgNjc1MiA4MzA5IDcyMzYgOTM3OCA4MDExIDEwNzI0IDkwMjYgOTY1MCA4NjM2IDEwNTUwIDkxNjkgOTc0OSA4NzY1IDk0NzggODg4OCA5NzA0IDg1NDkgOTMyMSA4MTkyIDg2NDUgNzMxOCA3MDIxCiswIDQgMSA1IDExIDkgMiAwIDIgMiAxIDIgMiAxIDIgOCA4IDMgMiAxIDMgMiA0IDMgMTAgOCAxMyAxMiAxMCA2IDkgNyAzIDMgOSAxMCA2IDQgOCA0CisxMCAxMCAxMCA3IDggNSA5IDggNyA1IDYgNSA2IDUgMyA1IDEwIDQgNiAxMCAxMSA4IDggMTAgMTQgMTEgMTAgOSAxMCAxNCAxMCA3IDYgMTAgMTEgMTEgNyA5IDggMTAKKzYyOTcgODEzNSA3MTM2IDkwNDAgNzA0NSA2ODE1IDY4NDQgNjY5OSA1OTQ4IDY4MjEgNjUyMCA3ODI3IDY2NjggNjY2NiA1NTYzIDYyMzggNjIwNCA3MjEyIDY3MzYgODQyNCA3MzM2IDkzMDYgODAxNSAxMDY5NCA5MTU4IDk3NDYgODY3NiAxMDQ2OSA5MTk1IDEwMDI0IDg4MDEgOTMzOSA4ODE5IDk3MzYgODYxNiA5NDM3IDgxNjYgODY3OSA3MzM5IDcyMTQKKzkgOCA5IDMgNSAyIDcgNiA1IDIgMyAyIDMgMiAwIDIgMTAgMSAzIDcgMTAgNCA1IDYgMTQgOCA3IDUgNyAxMyA3IDMgMiA2IDkgOCAzIDYgNSA4Cis1IDkgMTAgOCA1IDUgMTAgMTAgNiA2IDQgNSA1IDYgNSA1IDcgNyA5IDkgMTAgOCA3IDEwIDYgOSAxMSAxMSAxMSAxMSAxMCA5IDcgOSAxMSAxMiA4IDEwIDExIDExCis2MjY3IDgxOTkgNzIxMyA4OTg5IDY5OTYgNjcxMyA2OTI4IDY5MTEgNTk1MiA2NzgwIDY0NTkgNzY2NCA2NjI5IDY2MzQgNTU1MSA2MTcwIDYyMjggNzIwOSA2Nzk3IDg0NzEgNzQwOCA5MjM5IDc5OTMgMTA2NjYgOTA4MiA5NzE0IDg3NDAgMTA1MTYgOTI0NiAxMDA5OCA4ODM2IDkzMzEgODc3NyA5NzA0IDg2ODIgOTYwOCA4MTY2IDg3NzIgNzQzNiA3NDU2CisyIDYgOCA0IDIgMiA5IDkgMyAzIDEgMiAyIDMgMiAyIDQgNCA3IDYgOCA0IDQgNiAyIDUgOSA3IDggOCA3IDUgMyA1IDkgMTAgNSA3IDEwIDEwCis0IDYgMTAgOCA2IDYgNyA3IDkgNCA0IDYgOCA3IDUgOCA5IDcgMTIgMTEgNyA5IDEzIDEyIDggOCAxMSAxMCA4IDggOSAxMyAxNSAxMSAxMCAxMyA5IDExIDkgOAorNjIxMiA4MDc1IDcyODggODk0MSA2OTc0IDY2NzggNjkzMyA2OTI2IDYwMzMgNjYxOCA2NDAwIDc1NzIgNjY2OCA2NjY2IDU1NDAgNjI5MSA2MzAyIDcyMDYgNjkzNCA4NjM4IDc0MDIgOTIzNyA4MTI1IDEwNzYzIDkwNTkgOTYyMiA4ODAzIDEwNDk5IDkyMTkgOTk4MyA4ODQ1IDk1NjkgODk0MSA5Nzk3IDg3MjAgOTgzMCA4MTkyIDg5MjEgNzQ4MCA3NTAwCisxIDIgOCA0IDMgMyA0IDQgOCAxIDEgMyA2IDQgMiA2IDggNCAxMyA5IDQgNSAxMyA5IDQgNCA5IDYgNCA0IDYgMTIgMTYgOCA3IDExIDYgOSA3IDUKKzYgMiA1IDQgOCA5IDYgNSA3IDYgMTAgMTMgMTQgMTEgNiA2IDggOSAxMiAxMiAxMCA5IDEyIDE0IDYgMTEgMTkgOSA3IDggMTEgMTEgMTEgMTQgMTAgMTEgMTAgOSAxMiA5Cis2MjEwIDc3MTMgNzIzMyA4NjUwIDcwMDQgNjgzMCA2OTEzIDY4MTcgNjA2MSA2NTg5IDY0OTUgNzkxNiA2ODU5IDY5NDEgNTU1NSA2MjgyIDYzNDkgNzMyNiA3MDY3IDg4NTYgNzQ3MiA5MjM1IDgyMjggMTA5NzcgODk4NiA5NzIwIDkwNjggMTA0MjIgOTE2NyA5ODc1IDg5MDUgOTY3MCA4OTk4IDEwMDY5IDg3NTcgOTkxNiA4MjQzIDg5MzggNzYwMCA3NjAyCiszIDAgMiAxIDUgNyAzIDIgNSAzIDkgMTQgMTggMTEgMyAzIDYgNyAxMyAxMCA4IDUgMTEgMTIgMiA4IDI2IDUgMyA0IDkgOCA5IDEzIDcgOCA4IDYgMTIgNgorNCA0IDMgNSA3IDEyIDEzIDcgMyA4IDkgOCAxMSA3IDYgNiA0IDUgNyA4IDcgNiA1IDggOCAxMiAxNSAxMCA1IDExIDEyIDExIDggOCA4IDEyIDEwIDggNyA3Cis2MTU3IDc0OTUgNzEyOSA4NDM4IDcwMDggNzE1NyA3MDcyIDY4MzggNTk4NiA2Njg1IDY1NjIgNzkzMiA2OTY4IDY5NTQgNTU2OSA2MjczIDYyOTIgNzE5MyA3MDY5IDg4MTYgNzQ2NCA5MDQ5IDgxNTAgMTA4MDkgODk2NiA5ODc0IDkyMjUgMTA0MTEgOTA2NSA5OTU4IDg5ODkgOTc2NSA4OTc3IDk5NTYgODc0MiAxMDA1OCA4MjkyIDg4OTMgNzU4OSA3NTc1CisxIDEgMCAxIDQgMTMgMTUgNCAwIDYgNyA1IDExIDQgMyAzIDEgMiA0IDQgNCAyIDIgNCA0IDkgMTYgNiAxIDggMTAgOCA0IDQgNCA5IDggNCA0IDQKKzUgNSA5IDYgNCAxMiAxMiA1IDUgNSA1IDYgOCA2IDUgNCA4IDYgNSA1IDYgOCA3IDkgNyA3IDEwIDEwIDkgMTEgMTIgMTEgMTEgOSAxMCAxMCA5IDcgOCA2Cis2MTMxIDczNTIgNzE4MSA4MzAwIDY5MzUgNzQ2NCA3MjAyIDY3MzQgNTk2NCA2NTkxIDY1MjYgNzgyNCA2OTk4IDY5MDUgNTU1NyA2MTQyIDYzMzkgNzEzMCA3MDIwIDg1OTQgNzQzMSA4OTk3IDgxMjUgMTA3MTMgODkyMSA5NzExIDkyNTAgMTA0MDAgOTA2OCAxMDAzNiA5MDcxIDk4NTQgOTAzNCA5OTExIDg3NzkgMTAwNjggODMxNSA4Nzg5IDc2MDQgNzQ4OQorMiAyIDcgMiAxIDEyIDEyIDIgMiAyIDIgMyA1IDMgMiAxIDYgMyAyIDEgMyA0IDQgNSAzIDMgNyA2IDYgOCAxMCA4IDkgNSA3IDYgNiAzIDUgMworOCA2IDE1IDE0IDUgNiA4IDUgNCA2IDEwIDggOSAxMiA5IDQgNyA5IDkgMTEgMTEgMTAgMTEgMTAgOCA3IDkgMTEgOCA4IDEwIDkgOSA5IDEwIDExIDExIDkgNyA1Cis2MTgyIDcyNzkgNzM4NSA4NjYyIDY4ODkgNzM4NCA3MjI2IDY2MzcgNTkxNyA2NTY0IDY2MTggNzg0NiA3MDUzIDcyMjcgNTY0OCA2MDE5IDYzNTkgNzI1NSA3MDc0IDg3NTQgNzUyNiA5MDcxIDgyMDMgMTA2ODQgODkwMiA5NTU4IDkyNDkgMTA0NTEgOTA0NiA5OTI1IDkxMDAgOTgxNSA5MDM4IDk4NjkgODgxNSAxMDEzOSA4Mzg4IDg4MTQgNzU5MyA3MzQ2Cis2IDMgMTkgMTUgMiAzIDUgMiAxIDMgOSA1IDcgMTIgOCAxIDQgNyA3IDkgMTAgNyA5IDYgNCAzIDUgNyA0IDQgNyA1IDYgNSA3IDggOSA2IDQgMgorMTIgMTAgNSA0IDcgMTAgNiAzIDMgOCA4IDYgNiAxMSA3IDYgOSA2IDkgOSA3IDcgOSA3IDkgOCAxMCA4IDkgOCA4IDggMTAgNyAxMiA5IDkgOCA5IDgKKzYzMzQgNzQ1NiA3MzI4IDgzODggNjg5NSA3NTU1IDcxOTggNjQyMyA1ODQ1IDY2NjEgNjY1NyA3NzQzIDcwMzAgNzQ2OSA1Njg1IDYwMjYgNjQzMCA3MTg4IDcxMjcgODc4MSA3NTE3IDg5NTYgODIyOCAxMDQ3MyA4OTA5IDk0NzYgOTI3MyAxMDMxNSA5MDUwIDk4MjEgOTA3NyA5NzE3IDkwNjggOTcwNiA4OTAxIDEwMDgzIDg0MDggODc3NiA3NjMzIDczOTYKKzE0IDggMiAxIDQgOCAzIDAgMCA2IDYgMyAzIDEwIDUgMyA3IDMgNyA2IDQgMyA2IDMgNiA0IDcgNCA2IDQgNCA0IDcgMyAxMCA1IDYgNCA2IDUKKzUgNiA5IDcgNyA2IDUgNSAyIDUgOSA2IDYgNCA2IDggOCA2IDUgNSA5IDEwIDEyIDExIDExIDE2IDEwIDEwIDExIDMgNSA2IDEwIDYgMTAgMTAgMTIgMTAgOSA3Cis2MzAzIDczNzcgNzM3NSA4MzE0IDY5MDEgNzQ3MCA3MTQ2IDYzNDQgNTc1MCA2NTY4IDY3MjAgNzY0NyA3MDA3IDcyNjYgNTY5NiA2MTU1IDY0NzMgNzEyNSA3MDc2IDg1NjEgNzU1OSA5MDMzIDgzMjkgMTA1MjAgODk2NyA5ODkwIDkyOTcgMTAzMTAgOTEwNSA5NDE2IDg5NzggOTUwMiA5MDk3IDk0OTIgODkzNCAxMDA5MiA4NTA0IDg4NjMgNzY3MiA3MzgyCisyIDMgNyAzIDQgMyAyIDIgMCAyIDcgMyAzIDEgMyA2IDYgMyAyIDEgNyA3IDExIDcgOSAxNyA3IDYgOCAwIDEgMiA3IDIgNyA2IDExIDcgNiA0CisxMyA3IDggMTIgMTQgNiA1IDcgMyA0IDYgOCAxMCA5IDYgNSA2IDYgOSAxMiAxNCA4IDEwIDkgNiAxMCA4IDExIDExIDcgOCAxMCAxMCA5IDkgNyAxMiA5IDYgNgorNjQ3NyA3MzY0IDczOTUgODU1MiA3MDg2IDczOTAgNzA5NSA2MzkzIDU2ODMgNjQxOSA2NzA1IDc2NzkgNzA4NyA3MzgyIDU3MDcgNjA5MiA2NDY0IDcwNjYgNzEyOSA4Nzg0IDc3MjggODk4MiA4Mzc2IDEwNDQxIDg4OTYgOTkxMCA5MjY5IDEwMzY3IDkxNTggOTI4MSA4OTU4IDk1NDYgOTEyNSA5NDc1IDg5NDEgOTkxNiA4NTk4IDg4ODQgNzYzMyA3MzA3CisxNiA0IDUgMTEgMTcgMyAyIDQgMCAxIDMgNSA5IDcgMyAyIDMgMyA3IDExIDE2IDQgNyA1IDIgNiA0IDcgOCAzIDQgNyA3IDUgNiAzIDExIDYgMyAzCisxNyAxMSA2IDE1IDE3IDUgNiA4IDMgNCA3IDggMTIgNyA4IDcgNyA4IDEzIDkgOSA3IDcgMTMgMTIgMTAgOCA4IDEwIDkgOCA5IDkgNiA3IDkgMTIgNyA3IDQKKzY3NDkgNzU5NyA3MzYzIDg5NjAgNzM0MyA3MjUzIDcwNzEgNjUwMCA1NjE3IDYyNzkgNjcxNiA3NzA5IDcyMTYgNzM2OSA1NzY5IDYxNTYgNjQ4MSA3MTMzIDcyODMgODgwOSA3NzY1IDg4NzMgODM0NSAxMDYxMyA4OTgwIDk5MjkgOTI0MiAxMDIzNiA5MTg1IDkyNzcgODkzOCA5NTI2IDkxMjcgOTI3NSA4ODk2IDk4NzQgODY5MCA4NzgxIDc2MjEgNzExNAorMjcgMTAgMyAxNiAyNSAyIDMgNiAwIDEgNCA1IDEyIDQgNiA0IDQgNSAxNSA2IDYgMyAzIDEwIDEwIDYgNCA0IDcgNSA0IDUgNiAyIDMgNSAxMSAzIDQgMQorNSAzIDUgMTAgOSAxMiA3IDUgNyA3IDEyIDggMTAgMTEgNyA2IDYgNiA3IDggNyAxMCAxMiA2IDE0IDEzIDcgNyAxNyAxMCA4IDExIDE0IDExIDEyIDExIDkgOSA5IDgKKzY3MDggNzMyNSA3MzA3IDkwMzYgNzM4OSA3NTU1IDcwNzMgNjQxNyA1NjU1IDYzMzIgNjg1NSA3NzM3IDcyOTEgNzYwMiA1ODAzIDYxNTUgNjQ3MiA3MDczIDcyODAgODc3MSA3NzUwIDg5NTUgODQ0MyAxMDM0NCA5MTEzIDEwMTMxIDkxOTAgMTAwNTEgOTM5MCA5MzM0IDg5MTkgOTYzMCA5MjU3IDkzOTQgODk4MCA5OTU3IDg3MDMgODgwNyA3NjYwIDcxNzgKKzIgMCAyIDcgNyAxMiA0IDIgNSA0IDEzIDUgOCAxMCA1IDMgMyAzIDQgNCA0IDcgMTEgMiAxNCAxMSAzIDMgMjAgNyA0IDggMTQgOCAxMCA4IDYgNiA2IDUKKzYgOCA3IDUgNCA2IDYgOSA2IDYgNSAzIDYgOCA1IDUgNiA1IDggMTAgOCAxMiAxMCA3IDEyIDEwIDggMTUgMTMgOSAxMCAxNCAxMCAxMiAxMiAxMiA2IDcgNyA4Cis2NjkzIDczNzcgNzMwMyA4ODAxIDczMDYgNzQ3MCA3MDQ5IDY1ODQgNTY2NyA2MzIwIDY4MTEgNzQ1NyA3MjYyIDc2MzcgNTc4NSA2MDkyIDY0NjMgNjk1NSA3MzAyIDg4NTkgNzc2MSA5MTU0IDg0ODcgMTAxNTMgOTE5MiAxMDEzNyA5MTY1IDEwMzY5IDk0ODcgOTMyNiA4OTUxIDk5MTIgOTI4MSA5NTY3IDkwNjIgMTAwOTYgODYzOSA4NzA4IDc2NDcgNzIzOAorMyA1IDQgMSAxIDMgMyA3IDMgMyAyIDAgMyA1IDIgMiAzIDIgNSA3IDUgMTAgNyAzIDEwIDYgNCAxNCAxMiA1IDcgMTMgNyAxMCAxMCA5IDIgMyA0IDUKKzcgMTAgMTIgOSA2IDQgNyA2IDMgNSA3IDUgNiA0IDcgOSA3IDEwIDYgMTAgOSA3IDkgOSA5IDExIDEyIDkgMTIgOCA5IDExIDggNyA5IDE1IDEyIDEyIDkgOAorNjcwNCA3NTQ4IDc0MjcgODgyNSA3Mjc2IDcyNjcgNzA1MSA2NTU3IDU2MDIgNjI0OCA2ODE5IDczMTYgNzIzNCA3NDI0IDU4MTkgNjI3OSA2NDgwIDcxNTIgNzI3MyA4OTQxIDc3OTcgOTAzNCA4NTA1IDEwMDk2IDkxOTIgMTAyMDQgOTI0MiAxMDI5OSA5NTU2IDkyNTcgODk1NyA5OTkzIDkyNTMgOTQyMyA5MDY1IDEwNDExIDg3MzAgODkyMiA3Njg2IDcyOTUKKzQgOCAxMiA2IDMgMSA0IDMgMCAyIDQgMiAzIDEgNSA4IDQgOSAzIDcgNiAzIDYgNSA1IDggMTAgNSAxMCA0IDYgOCA0IDMgNiAxNCAxMSAxMCA2IDUKKzQgOSA5IDkgMyA3IDkgNCAzIDUgNSA2IDMgMyA1IDExIDEwIDggNiA2IDEwIDggOSAxMSAxNCAxMyAxMyAxMSAxMCAxMCAxMSA5IDkgMTEgMTEgMTAgMTEgMTIgOSA3Cis2NjM4IDc2NDggNzQ3MSA4ODQ4IDcxNzEgNzI2MSA3MTA1IDY0MDkgNTUzOCA2MTgwIDY3NzYgNzI0NSA3MTMwIDcxNjIgNTgwMSA2NTc4IDY1NzMgNzIxNCA3MjQ0IDg3NzMgNzg1NyA4OTgzIDg1MjIgMTAxNjYgOTMyMCAxMDM5MCA5MzQzIDEwMzU2IDk1NzMgOTMxNSA5MDE0IDk5NDYgOTI1MiA5NTMzIDkxMTkgMTA0MDAgODc5MyA5MTIzIDc3MjQgNzI4NworMSA2IDcgNiAwIDQgNyAxIDAgMiAyIDMgMCAwIDIgMTEgOSA1IDMgMiA4IDQgNiA4IDE0IDExIDEyIDcgNyA3IDkgNSA1IDggOCA2IDkgMTAgNiA0Cis5IDYgMTIgOCA1IDcgMyAyIDYgNSA0IDUgNSA0IDQgNCA3IDUgMTEgNyA2IDcgNiAxMSAxMSAxMiA4IDEyIDEyIDggMTAgMTAgOCA5IDEyIDkgMTEgNyA3IDcKKzY3MDIgNzU1NyA3NTkxIDg4MDggNzExOSA3MjU1IDcwMDQgNjE0NyA1NTUzIDYxMTYgNjcwOSA3MTE3IDcwNzkgNjk3OCA1NzU4IDY0MjkgNjU4NyA3MDg4IDczNDQgODY3NiA3ODE0IDg4NzQgODQ2MiAxMDIzMSA5MzY4IDEwNTAzIDkzMTQgMTA0NzEgOTY0MCA5MjQ3IDkwNDQgOTk2MyA5MjI1IDk1MTMgOTE5OCAxMDMyOCA4ODU0IDkwMDUgNzcxMCA3Mjc5Cis3IDMgMTIgNCAyIDQgMCAwIDMgMiAxIDIgMiAxIDEgMSA0IDIgMTAgMyAzIDMgMiA4IDggOSA0IDkgMTAgNCA3IDYgNCA1IDEwIDUgOSAzIDQgNAorOCA0IDcgNyAxMCA1IDMgNCA2IDUgNSA0IDUgNSA1IDYgMyA0IDYgNyA2IDYgOSAxMSAxMCA5IDExIDExIDEyIDE1IDEyIDcgNiA2IDggNyA3IDkgMTAgNQorNjczOSA3MzQ5IDc1ODAgODcwOSA3MTk2IDcxMjYgNjkwNSA2MDIzIDU1NjcgNjA1NiA2NjY5IDY5MzUgNzAzMCA2ODY2IDU3NDIgNjQxMSA2NDk5IDY5MDggNzMxNCA4NTg1IDc3NzIgODcxMCA4NDgwIDEwMjkyIDkzODkgMTA0MjUgOTM2MiAxMDUxOCA5NzA2IDk2MTMgOTEyNCA5Nzk1IDkxNDggOTMxMCA5MTcyIDEwMTM4IDg4MTEgOTAxNyA3NzczIDcxNDkKKzYgMSA0IDMgOSAyIDAgMSAzIDIgMiAxIDIgMiAyIDMgMCAxIDMgMyAzIDIgNiA4IDcgNSA4IDcgMTAgMTUgMTAgMyAyIDIgNCAzIDMgNiA4IDIKKzY5MzEgNTcyMCAzODkyIDI0MTUgMjI5OSAyOTI3IDMzMDUgMjk1MSAyMTM1IDE0OTYgMTY0MSAxOTU0IDIyMjEgMjYxNSAyNjYyIDE5MTQgNzg1IDEwNTcgMTI2NiAxNDE1IDE3NDIgMTY3NCAyNDQzIDM2NDUgMzk5MiA0Nzk1IDM3ODIgNDMwOSAzOTk2IDIwMzQgMzc3OSAyNzI0IDQzMjAgNDQ1OCAzMDMxIDI1MjggOTY3IDExNTggMTY4MSA3NDgKKzE4Mzc0NCAzNTgzMzAgMTA2ODgwIDE1NjU1OCA2NTc4NCAxODY1MjYgOTEyMTYgMTg2OTYzIDYwMDAzIDk3NjAzIDQ4NDUwIDEyNjU2NyA2MzYyOCAxNjcxMTMgNzM2NDYgMTIzNjE3IDI2NDAzIDcxNDMyIDM5NDkzIDk1MDAzIDUyMTA3IDExMTAzMyA3MDcxNyAyMzM2MTQgMTExMjAwIDMwNDM5MiAxMDU4MDUgMjc0NjIxIDExMTYxMSAxMzQwMDAgMTA1NDk2IDE3NjU2MyAxMTkzNDkgMjgyNjM5IDg2NDIyIDE2NDg0MyAzMzMwOSA3OTYyMCA1MDU0OSA1MjY3NQorMzMzNSAxNDYzIDI5NzggMTMxMSAyNjY2IDEzNTAgMjkzNCAxMzU4IDI2NDUgMTIxMCAyNDI3IDEyNTUgMjYzMyAxMzQwIDI4MzkgMTI1MSAxNzk0IDExMTYgMjIwMSAxMTcyIDI0MjIgMTE5OSAyNjg2IDEzNDggMjk0NCAxNDMwIDI5MjEgMTQwMiAyOTM3IDEyNTMgMjkyNyAxMzI0IDI5OTMgMTQxNyAyODI0IDEzMTEgMTg4NyAxMTIwIDIzOTggOTkzCis2Njg5OCA1MzUyMiAzNDU0MyAyMjAzOSAyNTM5NyAzMjYyMCAzNDQ0NCAyNzI4NCAxNTUzMCA5MDE3IDEzNDcxIDExNjI5IDcwMjkgMTc5MDMgMjU3MDMgMjI5MDEgMTU3MjUgMTgwMDkgMjAwODAgMTg1NjIgMTQxMjkgNzE5NiAxMzM3NSAyMzk0MCAxNzkyNiAzMzk5NCAyNjk2NCAzMzIxOSAyNTExOSAxNjk0NSAzNzIxMyAyNDg0MCAyODI4OCA0MDQ0NiAyNzkxNSAxNzU1OCAxODA5MyAyNTIwNyAyMTE0NSA2MjUxCisxODg5MjM3IDM2MjUwODggOTg3MjE3IDE1MDExODUgNzEzMzUyIDIxNzk0MjYgOTY5NDEzIDE4NTIwMDYgNDU1NDkwIDY0NTcyOCAzOTE1OTIgODMzNDI5IDI0MTcxOCAxMjU3MDAyIDcyODg0MCAxNTIzMTgwIDQyNzcxNCAxMTczNTc0IDU1MTgwMiAxMjI5NzA1IDQxMTk3OCA1NDY0NzUgNDEwODUwIDE2OTA0MTEgNTY2NjU3IDIzNzQ2MzUgNzkyNDMwIDIyOTkwMzYgNzUwOTI5IDExNjcwMTggMTA1NDExOSAxNjkyMDc3IDgzOTQ4MSAyNzUwNTgyIDc5Nzg0MSAxMjMzNjcyIDQ5NDk3OSAxNjIzNDk4IDU4OTgwNiA0MzM1NjAKKzM2MjcgMTUxNyAzNDUyIDE0NzQgMzUxMyAxNTM2IDM0OTMgMTQ2OCAzMTg1IDEzMzYgMzIyNCAxMzMwIDI1NzcgMTQyNiAzNDgxIDE1MDcgMzQ0MSAxNTI3IDM1MjQgMTUxMyAzMjA2IDEyMzAgMzA0MSAxNDA4IDMwNjkgMTQ3OSAzMzQ1IDE0OTMgMzI5NiAxNDQxIDM1MzMgMTQ2NCAzMzA2IDE1MzUgMzQzOSAxNDIzIDM0NDcgMTU1NCAzNTA4IDEzMDkKKzIwOTU3IDE4MzU3IDIwNjU1IDE5MjY2IDE4Mjg2IDE5NzQwIDE4NzM5IDE3ODAwIDE3Njg3IDE2ODgyIDE1OTkzIDE0NjI2IDEzMzc0IDExODUwIDEwMjc1IDg0NDAgNjI2MSA0NjA5IDMyODMgMzQ1MSA0NzY2IDYyOTQgNzYyMyA4NDA3IDgyMzEgNzgwNyA2NzAzIDUxNjcgMzMxNSA0OTU3IDc3NzUgODAyMiA3MTEzIDY5MjcgNDY3NCAzNjI2IDU1NzUgNjAxNiAzODMwIDM1NjQKKzIzNzc3ODggNDUzNTM5OSAxNDkwNTY2IDI1OTQ3NzIgMTE2Mjk4MCAzMjYxNDQyIDE0MjQyMjggMjgzNDQ3NyA4OTYyNDMgMTY0NDE3MyA3OTA2MzcgMTY4MjAxMCA1Nzc1NTYgMTkwOTYxOSA5NzMzMDAgMTk1MDMyNSA1NzcwODMgMTM4NjMyNyA2MjE5NDggMTM2Nzk0NiA1MjM1MjQgOTAwMzc1IDU5NTQ1NiAyMTA1NDk1IDc2MjkxNiAyNzExODA1IDk0Mzk5MyAyNDc4NTQ3IDgxNjkyMiAxNDAxNTQ1IDEyMjY1NTMgMjA4MzQwOCAxMDAwMzUwIDMwMTExMzEgODk3NDAzIDEzODI0MjcgNjI1MTMzIDE4OTU3MDAgNjcyOTg2IDYyNjUxMAorODg3IDM4NCAxMzg4IDc0NSAxNTY5IDU5MSAxMzE3IDYxOCAxOTA1IDEwMDcgMTk2MiA4NDIgMjIzNCA1ODEgOTk0IDM4NyAxMDEyIDI4NCA0NjQgMjAwIDgyMyA2MzMgMTIxMCAzNTggMTAxOSAyNDggNjQ2IDE2MSAzNDIgMzA3IDU5OCAzNDMgNjUxIDE4NiA0NTYgMjExIDgyOCAyNjYgNTA4IDUwNQorMzU0MDQgNDExOTUgMzc2MTkgMjM1MzIgMTkxNDAgMjAyMTcgMTU3NzkgMjU4NzAgMjQ1MTMgMTI5NTkgNjA5NiA2MDQ4IDEwMzAwIDExNDI1IDEwNzU3IDEyMDk4IDExODE2IDE4MTMzIDE4MTc5IDI2NDUyIDI5OTY1IDI2MDc0IDEyNzI3IDg0MTQgODI3NyAxMTY5MCAxOTcyOCAyMzQ3MiAxODI5NyAxOTA5NSAyNTIyNyAyMzA1NyAyMDA0MSAxMjQ5NyAxNDA0OSA5NTE4IDExMjk2IDIwODUyIDIyNzQ5IDEwMjA4CiszMjIzNDQ1IDY3OTQyMDMgMjQxNDk5MiAzODg0ODM5IDE2MjMyMTQgNDMwNzg0NSAxNzkyMDI1IDQyNTM4MDMgMTUwMDQ4MyAyMzQxNjk1IDkyNjcyOSAxOTUyNjY3IDgyNjQzMiAyNDk2OTY5IDEyMjM5NzggMjU3NjU4MSA4NjQ3MjMgMjQxNzE5NiAxMDcxMTIyIDI5MTEwMTcgMTI3NjQzNSAyNDQ4Mjc2IDkwNTkyNSAyNDk2MTA1IDk1NTQ1MSAzMjY3MzA3IDE0MjQ3MjQgMzc3MTkwMSAxMjY0MjQ1IDI0OTA2MDQgMTg0MDc5OSAzMzc0OTczIDE0ODc2NzUgMzU5ODI1NCAxMjM0MTI4IDE4ODQyNDYgODk4MjgxIDMwNjMwNTcgMTIzNzcwNyAxMjE2MDc0CisxMTIwIDYwOSAxNjI1IDU5MCAxMTY0IDQ1NCA4NDggNjA1IDE2NDcgNTMzIDU5MiAyNTkgMTE4MyA0MzIgODUyIDQ0NiAxMzAwIDc1MCAxNjcxIDkyNCAyMzk0IDEwODggMTMzNyAzMDEgODAyIDMyMSAxMzg1IDYwNiAxNDUwIDc3MCAxMzU4IDY3MyAxMzQ1IDMwOCAxMTIyIDQ2MSAxMTkwIDY3NCAxODU3IDgxMAorMTUzNDEgMTU4MjIgMTY4MjggMTA3MTIgODk1NyA5MzQzIDg3OTMgMTE4MTQgOTkwNiAzNjA5IDI4MDkgMjM0NyAzNzAyIDgwMjYgOTcxMCA3OTU5IDYxODEgNjM1NCAzNjY3IDgwNzIgODI4OSA4NjkwIDM3NjEgMjQ2NSA0OTM1IDU2MzggOTY3OCA5NDI4IDUzOTQgNTk0MiA4NjkxIDcyNjUgNDAwNSAzMzYzIDQ5NTAgMzM2NyA0MzcwIDY0MjMgNjAxOSAzNDY3CiszNTM1MTMxIDczNTg2MzEgMjc4NDg3MSA0MzA5ODc2IDE4MTE2NTYgNDYyMzM5NSAxOTcyMDYxIDQ3MjQ0MDcgMTcxNjI0NyAyNDIyOTI2IDk3NTM5OSAxOTc5NzA1IDkwMDQzMyAyODQwMjU0IDE0NDE2MzUgMjkxMDk3MyAxMDAxMTM4IDI2NjI1NDQgMTEzODEyMCAzMjMyMjg2IDE0NTY0NTggMjgzNTI3NyA5Nzk0NTAgMjQ5Nzc4OCAxMDU3NzUwIDM0MTc2NjEgMTYzNjU1MSA0MTI0ODI4IDEzNzA1NjkgMjcwNjIzNSAyMDE3MDEwIDM2MTg4MjYgMTU1MjkxNSAzNTg4OTgxIDEzMjk4NTQgMTk3ODA1NSA5ODc1NjQgMzI3Mzg5NCAxMzYwNjcwIDEzNTYxMTYKKzQwNCAxNzUgNTkzIDIxMCA0NDkgMTYxIDQwMSAyMTUgNTM1IDk3IDIyNCA1OSAzNDYgMjQzIDY0MiAyMzMgNTU3IDE5NSAyNjkgMjA1IDUzMiAyNjkgMzIxIDQ0IDQxMyAxMTMgNTUyIDE4NCAzNDggMTc1IDM4NyAxNTIgMjA1IDM5IDMyNiAxMTMgMzgwIDE0NyA0MDAgMjA0Cis1MDEgNDUyIDEyNCAxMjEgNjcgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCA0NyA0MyA1NSAzMSAwIDAgMCAwIDAgMCAzMCA0MyAzNiAwIDAgMCAwIDAgMCAwIDAgMjkKKzM0NTk2ODggNjk0NDkwMCAyNzE4NTIwIDQwNTg3MjcgMTc2ODE0MyA0MzQ2MDAyIDE5MjI4MzEgNDQ0MDk1NCAxNjczNDAzIDIyNzc1NTYgOTUxMDQ5IDE4NjA5MjcgODc3OTU1IDI2Njk4NDUgMTQwNTY0NiAyNzM2MzIxIDk3NjE0NiAyNTAyNzk3IDExMTA5MTAgMzA0MDk5OCAxNDIxNTA1IDI2NjcwNzEgOTU0OTk5IDIzNDc5MjYgMTAzMTM0NCAzMjEyNjA5IDE1OTU2OTcgMzg3NzM0OCAxMzM3MTIxIDI1NDY1MDkgMTk2NzU3OCAzNDAxNzA1IDE1MTQxNDggMzM3MzY1MCAxMjk2NjU2IDE4NTkzNzYgOTYyOTExIDMwNzc0NjggMTMyNjcwMyAxMjc2NTM0CiswIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwCisxMjc3OSA5MDY5IDQzNTEgMTM3NiAxNTA4IDMwOTQgNDY3NiA1ODUxIDY1NzcgNzA5NyA4NDMzIDk5MTYgOTk4NiA4NDI4IDcyNDQgNjMxMyA0MDEyIDQ3MzYgNjk1NCA3MDYyIDUwMjUgNDIyOCAyMzEzIDI4ODMgNzA5OCAxMjI3MSAxMzU3OCAxMzE5MiAxNTE1NCA3NTQzIDM0MjEgNDA1OSA2NTAyIDMyNzYgMjg0MiA0NjIyIDUyNTkgODA3MyA1NjI3IDQzNTkKKzM2OTk5ODUgNzA4NTM5OSAyNzYxODc4IDM4OTk3NTEgMTc2MjU1MiA0Mjc1MzQwIDE5OTQzNjAgNDUzMzk3OCAxNzk5NzUzIDI1NzY5MzAgMTE0Mjg3NiAyMzU4NDkwIDExMTEzMDUgMzAyNzQ1NiAxNTU1NzMxIDI5NjAwMDMgMTA1NDMzNCAyNjQzNjAzIDEyNjA5MzkgMzI5MjQxNyAxNTE0NDcwIDI3NjY4MTEgOTkwMjg1IDIzODQxODAgMTE4NzA0MCAzNzczNzU5IDE5MDI5NTAgNDQ1NTIwMCAxNjkxMTE2IDI4NTcxNDcgMjAwNTkwOSAzNDQ2OTg1IDE2NDI1NTcgMzM3MjUwOCAxMzM2OTM1IDIwMzE3ODIgMTA3MzMwNiAzMzg4ODEyIDE0Mzc0MjQgMTQ2Nzc1MQorMzA3IDc5IDEwOCA1IDMwIDI0IDE4MSA3OCAzMTQgMjM1IDY5OSAzOTEgODYyIDIzOCA0MjIgMTY3IDMyMyAxMzEgNTEzIDE2NyAyODMgMTAyIDE3MCA2NiA1NTggMjg2IDY3OCAyNjQgODY4IDIyMyAxMTQgNjIgMzQ4IDQyIDE1OCAxNzUgNDM4IDE5MiAzNDYgMjQ2Cis1MzUxNCA0OTcwMiAzMjc1NCAxNjQ1NCAxNTUzNCAyNjI5OSAzNDIxMyAyNzMxMiAyNjU2MSAzNDQ2OCAzOTg2NyAzNzIyNSA0NDM5MCAzNDE0OCAyMzQ3NSA0Mzg5NSAzMDIyOSAyMDE2NiAyMjcxNCAyNDY2MCAxMjIxMSAxNTI1NCAxMDc3NiAyMzY0NiAzMzc5MCAzNzc0MiAzOTE3NCA0MTM4NCA1NDQ2NSAyNjQ0MCAyMTIxOSAyMTU4NSAzOTE5MSAzMzE1NSAyNzQyOSAyNDY0MSAyNTkyOCAzOTA4MCAyNDM3NCAzNDI0MgorNDk3NTU3MiA5NzEzODU4IDM1MzAyMDYgNDY3NjY2OCAyMTE1NjQwIDU2MzQ1NzQgMjgxOTE0MyA1OTM5OTMxIDI0MzM3OTAgNDUzOTk0OCAyMTMzNDQ2IDQ1MDM5OTcgMjIxODI4MiA0OTQzNzgzIDIxMTY5NzQgNTQ3OTIwOSAxODAwNzQzIDM3MjM5NDEgMTgxMDA4OCA0NjA5OTI4IDE3ODg4MDcgMzUzNzk3NiAxMjQxMDI1IDM2OTM4ODYgMjAyMTE2NCA1ODY2MTE2IDI4NTY4MzEgNjczMDQyOCAzMDQxMTYxIDQzMTAxMzIgMjQ5ODI0NSA0NTY2MzAyIDI2MDMzNzMgNTIwNzEyNiAyMDA0NzE0IDM0MjM3NjEgMTcwOTI5NyA1NTg2NDY5IDIwMjQ2MDEgMzQ4MzQzMgorMTEzNyA1MzAgOTM1IDMyOSA3MTcgNDYyIDEyNTUgNDU2IDExMTYgNzc3IDE5MjEgODUzIDIwODEgNzExIDExMTYgODM2IDE2NzcgNTE2IDEyMzkgNTMyIDY0NSA0MDEgODQzIDYyMiAxNjkzIDY2MyAxNDI3IDYyMyAxODc3IDYxMyA4NTggNDYyIDE1NzIgNjQ4IDEzNjkgNzEyIDE1MTIgNzI3IDExOTcgOTk3Cis5OTU0IDgyNTggMTQ0ODEgMjA2NTkgMjk4NzcgMzg2NTkgMzg4NzkgNTMxMDYgNDgzNDkgNDIyNTMgNDUwMzQgMzkzNTAgMzc3NDggNDQ4OTkgNTg4NjUgNDUyMDIgMzM2NjkgMjM2NzEgMjIxNDggMTYyNzcgMTM0OTcgMjEyNTcgMjQ0NTEgMjM1OTAgMTk0NjYgMzAxNDUgMzg5MjEgMjc2OTYgMjQyNzkgMzk5NzcgMTgwNTggMjg1NDQgMzk4NzMgMzUyNjggMzM5MjQgMzAyMDIgNDE4MDMgNTE5NDUgNDI5ODcgMzI2MTEKKzUxMDU4MTQgOTYzODQwMSAzODEyMjUwIDU2NjUzMTYgMjgyNjU1NyA3NjcxNjI1IDM3NDI2MTIgODg0NjI0OSAzNjA4OTU1IDY4NjM0ODAgMzIzMTM2OSA2NjUxMzMzIDMxMjc4MzkgNzQwNTY1MCAzNTY4ODYzIDc5Mjc1NjcgMjYxNjQ1NCA0OTU0ODAwIDIzMzEwNjAgNTMzMzM2MSAyMDg5MTY5IDQ2MzE2ODMgMTgzNTA3MyA0OTIxNTcyIDI0NjgzMDggNzM2NjE5NiAzNzgwNDMyIDgwMjgxOTEgMzU4NTg3NSA2NTA3NjIxIDI4OTc0ODcgNjA0NjAwNyAzNTU3NjM3IDcwNjE0ODggMjgyMTg1MSA1MDczODc5IDI3MzUyMTYgODQ0MjY2NSAzMDcyOTE1IDUyNzc5NzIKKzE1NCAzOSAzNDYgMzQ0IDEwODggNTAyIDEwNTYgNjM2IDEzNzYgNjI3IDE0NDIgNTk4IDEyNDQgNjE1IDE3MDMgNTc2IDEzMzMgNDczIDk2MyAyNzcgNjIxIDQ0OSAxMzIwIDQ3MSA3OTEgMzkyIDEwNDcgMzI4IDY2NSA2MTkgNjE0IDQ2NSAxMTQzIDQ5NSAxMjQ0IDYwNiAxNTk5IDY0NiAxNDU3IDYyOAorMTU2ODMgMTYwNzMgMTgxOTEgMjAwOTkgMTk1MjEgMjM5NTMgMjgxNzEgMjAyMjMgMTUwMzEgMTg0NzcgNTk5MTEgNzYxMjAgMjUwNTAgMTkwNTUgMzI4MDAgNjYwNTMgMzc0MTQgMzU5MDAgMTg5NzcgMTk2MzggMjYxMTAgMjk0MDUgMjQ1NzIgMTk0MzcgMTg5NjggMTk1MjcgMjU5MzcgMjA3NzcgMjY1NjggMjYxOTkgMTc4NTMgMjQyMDQgMjYxODEgMzcwOTggMzIyOTIgMjUxOTkgMzIzNjkgMzMxMDAgMzkzNDIgMzkyNTAKKzUzNzkyNTIgMTAwNDc2MDUgNDE4MjA5MCA2NTYwMjQzIDMyNTUwMDIgODY4Mjk1OCA0MzY5MzA0IDk1NTc5NDYgMzkwMzA5MyA3NTg2ODY4IDQ2ODIxNzggMTA5Mjg4OTEgMzY5MDA5OCA4MTMyMDIwIDQzMTgyMjIgMTE1MTAwNjMgMzUwNzUzMyA2ODYzMTMwIDI3NTc5NjggNjIxOTg4MSAyNzA0NDUzIDYxNjAzNjMgMjQxNzM4NSA1ODIwNDUwIDI4OTE1NjAgODEyMzkzMiA0MzQ5MDc0IDg4MjMwMDYgNDE3NTUwMyA3NzI2NzgwIDMyODE1MjMgNzE3MDI5NCA0MTM4MDc4IDg5MTcwMjQgMzU3Njg3MiA2MzE3NjIyIDM0OTQzNjggOTk2OTcwNiA0MDAxODg0IDczNzI3MjgKKzI2NSAxMjQgNDExIDI3OSA1ODQgMjUxIDY1MSAxODIgMzUwIDIwNiAxMzY5IDc1MyA2NjMgMjAxIDc3NiA2MTMgMTA4NiA1MjMgNjg2IDI5MCA5ODcgNDc0IDEwMzkgMzEwIDY0OSAyMDcgNTk0IDIwOSA2MzAgMzE5IDUyNCAzMTQgNjI2IDQxNiA5MDUgMzg1IDkzMSAzMjMgMTAwMiA1MzAKKzIzMDE4IDE0ODg2IDk2MTEgMjQzMTkgMjQ2NDMgMjE2MjkgMTg2MTEgMzM3MzcgNTAzODcgMzg4MjUgMzcwMTkgMzc4NDAgNTAxNDIgMzQ5OTggMzU5MTkgNDE0MDggNDMyNzEgMTM1MzIgMTk4NTkgMTMyNzMgMjEyMTUgMjIxNTMgMjE3OTYgMTg0ODUgMTY0NDEgMjA3OTMgMjcwODggMjk5NjMgMzgzMjUgMjAwNjcgMjA1NDIgMjI5NjcgMjc3NDcgMzAxODAgMjY5OTEgMjkwMjAgMzQ4NjkgMjY1NDAgMzUyOTUgMzA4ODIKKzU4MzMzNjUgMTAzNTkzMzEgNDMyMzM3MiA3NjYwNzQyIDM4MDM2ODIgOTQ5MDgzMyA0NzM1OTc1IDExMDU3MjA5IDUwOTM2NzYgOTUxNjk4NSA1NTExNTkzIDEyNTk3OTc5IDQ4Nzk3MzUgOTc5NDMwOCA1MTI4NjA0IDEzMzYzNDkxIDQ1MjYwODggNzI4MjczMSAzMTk2NzY1IDY2NjIxNjMgMzE3OTI0OSA3MTUxNzgxIDI5MTQxOTkgNjYwNjkwOSAzMjM5NjQ5IDg5MTM5ODUgNDkzMjk0MyAxMDEzNDQ5OCA1MDUwOTUxIDg0OTYwNTggMzcyNDcwOSA4MTUxMTI4IDQ3NDQwNjAgMTAyMzYyMDggNDE3NzUzOCA3NzIxNDk2IDQyOTg0NzUgMTEwMDIwOTkgNDgwNDIxMSA4ODI3Njk1CiszNzkgMTAzIDE4MCAyOTIgNjMzIDIwMCAzNzYgMjk4IDEwNDMgNDA5IDY5NSAyODcgMTA4NiAzNTQgNzI1IDI5OSA5OTIgMTQ0IDYwOSAxNTkgNjU1IDI4MiA3NTAgMjQ3IDQ4NSAyMDUgNTUxIDI3OSA3ODcgMjA1IDUyNyAyNTUgNTg2IDI4MiA2NDEgMzYxIDgyOSAyMjEgNzU0IDM0MworMTk1NTYgMjA5NTAgMTYxOTYgMTQ4MTQgMjM5MTUgMjkyMTEgNDE0MzUgODEwOTEgNjI1NTEgMzU3NjkgNDAwOTMgNDQ4NTQgNDI1NjUgMjg4NjkgNTM5NDEgMzQwNjcgMjE5MjEgMTc2NDcgMjkxMzAgMjcwODQgMjUzNzMgMjE1OTQgMzAwOTkgMjczNTkgMjMxMzIgMjEyMDQgMjExNzggMzA3MDIgMzA3MjcgMjA2NTEgMjE2MTggMzkzNTkgMzExMjkgMjU2MDAgMzQ5ODMgMzA1NjIgMjk4ODggMjkyNzEgMzIzNDAgMzU0MDQKKzYxODc2NDQgMTEwMjQ5MTIgNDYyOTQ1NiA4MTExMjUxIDQzMjAwNTYgMTA3MTYwNTcgNTY3NjkzMSAxNTM3NTgzMSA2NTY1NDgwIDExMTQzNTQ3IDYzOTg4ODIgMTQ1OTc4NDggNTg0NTk4OCAxMDk4MDMxMiA2Mzc5NDQzIDE0NjU0NzA1IDQ5NzM0NTcgNzkyOTk3MiAzODYxNTk4IDc5MjY0MjIgMzc0ODQ4MSA4MDQ5MzcyIDM2MTA4NTYgNzg5MTM3OSAzNzUwMDg4IDk2ODE4ODggNTM1MTE2MiAxMTQxMjcwNiA1NzEwMzIxIDkyNTUwNjEgNDE4NDMzNyAxMDA4MDE5OCA1NDIxMzY3IDExMTk0ODYwIDQ5Njc1MDUgOTEzNTg3NyA0OTU1MTgyIDEyMTQwMzM2IDU1MTA5NzIgMTA0NzMxODgKKzI4OSAxNjEgMzI3IDE0MiA1NDkgMjU2IDc1NSA1NDkgMTAwNCAzMTEgNjQwIDI5NyA3NTYgMjQ2IDg4NCAyMDIgNDI4IDE4NSA3NDYgMzE5IDY2NiAyNDEgODMyIDMyMyA2MDIgMTk0IDM4MCAyNTAgNTQzIDE5OCA1MDAgMzk3IDU4MSAyMDQgNzMwIDMyMyA2MTQgMjIxIDU5OSAzMzMKKzMwMDY0IDE4NzA5IDEzNjA0IDI3NTgxIDQ0NjI4IDUzODM0IDYzNjY0IDUzNzAzIDYyMzY4IDU4ODgwIDMyNDYwIDMzODE2IDQ1NTcwIDM5MzM0IDM3NjQyIDI2NjYzIDkzMTkgMTA4OTMgMjIwNDYgMjcwMDIgMjI5NjUgMjMzNzcgMzIwODMgMzIxMjAgMjgxNjMgMTc5ODkgMTc5MjggMjExNzkgMjUxNzUgMjY3OTAgMjQ1ODggMjg0MTYgMzEzMTQgMjM0NjUgMzIwMzIgMzY3NzggMjk4ODcgMzM1NzcgMzI3NzggMzUwMTAKKzY4MDE2OTAgMTE1MTI4NzggNDg2MTY0MSA5MzE5MTAzIDUzNTMwMTYgMTMzODA1NDYgNzE2MjYyNiAxNzc1MjY5NiA3OTk1ODY1IDE0MDkyNDAxIDcwNjg5MDMgMTU3OTk1ODMgNjg2NDkzNSAxMjczODEwMiA3MTgyNDE0IDE1NDEzNTY2IDUwODc1MTkgODEyMzQzMSA0MzI4NzUwIDkxMDk3OTEgNDI0MTk0OSA5MDAyNjUzIDQzNDA4MzggOTM5MTI4OCA0Mzc2Mzg5IDEwMjA2MTk3IDU2NzU4NjMgMTIwMjkxNTYgNjIxMTMwOCAxMDM0NTY5MCA0NzA4NDEyIDExMjIxMjE4IDYwODY0OTUgMTE5NjQ4MjYgNTY2MjMxNyAxMDg0NzI5NSA1NTk1NDcwIDEzNDc0ODMyIDYyMTEyODcgMTE5OTU3NDkKKzQyNyAxMjcgMjQ4IDI3OSA4NzMgNDA5IDkzMCAzMDMgODE5IDQyNCA0NTEgMTgzIDY4MSAzMDAgNTI0IDEzNyAxNDAgODcgNDk1IDI3OCA1MzAgMjM4IDc1MCAzMzUgNjQ0IDE0MiAyOTAgMTQyIDM5MCAyNDMgNTE4IDIzNCA1MTcgMTY1IDU2OSAzMzEgNTM0IDIyMiA1MjggMjc3CiszMzQxNyAyNzIzNyAxMTM5NSAxNTUzMiAzMjU0MCA0MDI4OSA0NDU4MyA2MTEzNSA0MDI5MyA3MDAwNCA0NTQ4OSA1MDkwMCA0NTg0OCAyODMwMyAzMzA1OSAzNDU2MiAxMjc3MiAxNjE1MiAzMTQyNSAyODY0MyAyNjcyMSAyMDk2MSAzMjQ3MCAyODgxOSAyMzA4NiAyNDQwNyAxOTg3MCAxNjcwOCAyMjg3MiAyNjk5NyAyNDY1NSAyNTEyMyAzNDU3OCAyNDk5MyAzNDM1NCAzMDE0MSAyNjIxNCAzNDcwMCAzMzk4MiAzMzA1OQorNzQ4NjExOCAxMjQ5NTUwNiA1MDMxNTYyIDk3MTQyMjYgNjA1MTE5MCAxNTA1MzAwMSA4MTIzNDc1IDIwNDQzNTU5IDg4MjYyNTEgMTc1NDc3NjIgODA1NTI1MSAxNzk3ODgxNSA3ODY1NTUyIDEzNzEyNzEyIDc4NDgxODcgMTY2MTIxOTIgNTI4NzAwMSA4NjI4MzgzIDUwMjM5OTEgMTAzMjI5ODAgNDgxOTExMSA5NzUwMzA3IDUwNjI0OTAgMTA1OTg0MDAgNDg1NzI3NSAxMTA5MzM1NSA2MDQyMTAxIDEyMzMzOTMzIDY2NDA5MTggMTEzODM2MDIgNTIyMTExNyAxMjA5MTQ2NiA2ODE4NDU1IDEyNzgyNDczIDYzOTkxNDAgMTIwNDgyNzEgNjEyNTg4MyAxNDc5ODI1NiA2OTI0ODk3IDEzMzA3MDk1Cis0MzMgMTg4IDE4OSAxMjEgNTM5IDI1MCA1NTYgMzA5IDQ2NyA0MTQgNTgwIDI3MSA1OTYgMTc3IDQxMiAxODAgMjA3IDE1MiA2NDEgMjY0IDU1NSAxODYgNjU3IDI1MiA0NjUgMTkyIDMwNCA5NSAzMjEgMjEyIDQ2NSAxODEgNTAxIDE2MSA1MzkgMjMwIDQxNSAyMDcgNDgzIDIyNgorMjA4ODQgMjE1NzYgMTM5NjIgMTY1NzMgMjc3NTkgMzA3NDkgNDkyNzAgNzAzNTggNTMxNjQgNTUzNjcgNDYwMjQgNTI4NjEgNDkzMjIgMjI3OTQgMzE0NTIgMjg0NzMgOTI2MiAxMjMxNCAyNzk3NiAyOTc4NyAyNDU5NyAyMTgzNyAzMTg0MSAyNTk2MyAyMDQxNCAyMzg4NiAyMTY4NiAyMDI1NiAyMjAzMCAyODQ0MCAyNzg4NyAzNzA1MiAzMTM0OCAyMzU3MyAzMDMxMCAzMDI0MSAyNTMyNCAzMTI2NCAzMjMwMyAzNTkzNworNzgzMzA4NiAxMzA3MTM4MSA1MjYyODYwIDEwMTQ5NTk5IDY2MDk3MjEgMTYwMzg5OTkgOTE4MDE0OSAyMzUzOTYxNCA5OTY0OTIyIDE5ODk2NTQ5IDkwMzA2NTMgMjAxNDc3NzcgODkyOTk5NCAxNDI5MDM4OSA4NDU2MjYxIDE3MzY0ODEwIDUzOTE3NzkgODg2NzI0MiA1NjEzNzExIDExNTMzNjY1IDUzMjc1NzAgMTA1MDY5MjMgNTc1MDA0OCAxMTU1NzYyMyA1MjU3ODUzIDExODk1Mjc2IDY0NDU2MTggMTI4Mzg0MDUgNzAzODI4MCAxMjQ0Nzg5NiA1ODAzNjQxIDEzNjQyMzg5IDc0NDk1NzYgMTM0NjM4MjIgNzAxNDE5NSAxMzE4MzMzNSA2NjIwMzA1IDE1ODMxMTc4IDc1Nzc3NzMgMTQ3MTY1ODEKKzIzNiAxMzAgMjM1IDEyNiA0MDMgMTYxIDU2MSAyOTYgNTU5IDI3MyA1MzEgMjU4IDU3NCAxMTkgMzY2IDEzMCAxMzAgOTggNDk2IDI0MSA0NTggMTgxIDU1NyAyMDIgMzc0IDE2OSAzMTEgMTE4IDI4NSAxOTkgNDczIDI1MiA0MTAgMTM3IDQxNiAyMDEgMzYyIDE2NCA0MTcgMjE2CisyMjIxMiAxNzk3NSAxNDIxNCAyNTA0MSAzNjIxNyA0OTM0OCA2ODAyNyA2NDIyMyA2NjY4OSA0OTU4MiAzMjA2MiAzNzE0NCA0MTU5NSAzNDE0MSA0MTYwNSAyNTIwOCA4NTI5IDk2MzggMTgyMDMgMjkyNzMgMjMxOTYgMjEyMzUgMjkyNjcgMzM0ODcgMjYzNDAgMTk4OTkgMTkwNTQgMjI2OTYgMjU3MDYgMjYzOTUgMjc4MDEgMjg1OTIgMzEyMDUgMjc4MjUgMzExOTcgMzExODkgMjYxNjYgMzI4MzMgMzMzOTQgNDE2NDYKKzgyMDUzMzkgMTMzOTE0NjkgNTQ5NDgyNiAxMTA3OTEwNCA3MzcwNTE3IDE4MTA4NTE1IDEwNjg5OTIxIDI2MDcyOTk1IDExNDIwOTAxIDIxNzQ4OTk4IDk2MjQ4MDIgMjEyMjA5OTQgOTc3MDM0MyAxNTUzMDUzOCA5MzA4NjkxIDE3ODcxNjgwIDU0NzUyMDQgODkyNzM2MyA1OTM4ODg3IDEyNjQwMTMzIDU3ODc1MjMgMTExODExNTggNjM1NDY0NSAxMjkyMTU1MSA1Nzk5OTE1IDEyNDA0MTMzIDY3NzE3ODEgMTM0NjI1MTcgNzUxOTY5MCAxMzMyMjY5NSA2MzY5NDI1IDE0NTgwNDk5IDgwNjEyODcgMTQzNjU1MjMgNzYzNjU3MCAxNDMwODU0MSA3MTIzOTA4IDE2ODk4NTIzIDgyNDIyNDAgMTYzOTIyNDgKKzI0NSA5MyAyMjcgMTk4IDQ4NCAyNjEgNjgzIDIzMyA2MTkgMjE0IDMyNyAxNTMgNDMzIDE5NCA0NTQgMTA4IDExMCA2MCAyODIgMjA3IDM4OSAxNTggNDUwIDIzOCA0NDQgMTI1IDI1MiAxMjkgMzE4IDE2NyA0MjQgMTY2IDM3NyAxNjAgMzkyIDE4NyAzNDQgMTY4IDQwMCAyMzAKKzQ2Mjg1IDI2MDc5IDE4MzczIDMzNjE3IDMwODg3IDI1MDQ4IDM2MTAxIDU0MTY5IDQ0MTc3IDY2NzQyIDM2NzcwIDMyOTkzIDM4Mzk2IDI1NDY4IDQyMTY5IDUxMTA0IDMwODA4IDE4OTY0IDMwMzcxIDMwNDA2IDI0NzgwIDE3Mjc4IDMyNzU5IDMxOTUwIDE5OTM4IDI0ODI5IDIzNDc4IDE3OTM2IDI0NzcyIDM2MDA0IDI1NDQ4IDIzNDA3IDMyNTkyIDI1MjEyIDMyNzcyIDMwMzkxIDI0NDQ2IDMzNzcxIDMyNzQxIDM1MDI1Cis5MTgzNjY2IDE0MTkwMjQyIDU4MjczMTYgMTI0Nzk3MjkgNzk3NjA3MiAxODU2MDkzNCAxMTM0NTg5NiAyNzgzNjY4NiAxMjI2NTA3MSAyNDU0NDU3MiAxMDMyNDQ2NyAyMTk3NDc5MyAxMDUwNzkzOSAxNjE2MzQzMyAxMDE1NDI1OSAxOTkzOTEyNCA2MTI2MDUzIDk1NTY4NDMgNjU2Njk5MSAxMzc0OTgyNCA2Mjc2NDg1IDExNTcxODMyIDcwMzM0MTMgMTQxMDkyMTcgNjE2NDc5NCAxMzE4NTM0NiA3MjAyODkwIDEzNzU2NzQxIDc5NjUyMDcgMTQ3MzUzNjEgNjg2MDkzNyAxNTE0Mzc3MiA4NjkzMTgzIDE1MDUyNTg4IDgyODM2NjkgMTUzMTcyMTAgNzU3MDk3MiAxNzk1OTQ1OCA4ODczNDI3IDE3NTYwNjAxCis1MjMgMTQ2IDI5MCAyNDcgMzczIDEwMSAzMDYgMTc0IDM1NiAyNzggMzU3IDEyMSAzNjcgMTIyIDQxOSAyNDcgNTAwIDE2NyA0NTUgMTk1IDM3NyAxMTMgNDU1IDIwMSAzMDEgMTU0IDMwMiA4OSAyODYgMjE3IDM1MiAxMTMgMzY1IDEzMiAzODQgMTY2IDMwMCAxNTggMzU5IDE3NQorMTMzNTQgMTkwMjQgMjA4MzQgMTgzNjcgMjk4MTQgMjM0MTIgMzE0MTMgNTI1NTEgNzIzMjYgMzI0NzAgMjE5NzEgNDE1OTcgMzkyOTggMzQwNzIgMzEyNTYgNDM2NTggMjU5MjggMTYxNjAgMTkzMTggMTcwMTkgMjM3NDAgMjE1ODggMjA2MjEgMTk2NDkgMTE4MDYgMTY5OTYgMjYwNjEgMjIxODEgMjIzNTIgMjE5MTYgMjM5NjEgMTc0MjMgMjA3OTAgMzUwNTEgMjQ3NzMgMjg1NTMgMjc4NTQgMzIzNDIgNDY3OTUgMjQ0MTQKKzkyOTU3NzIgMTQ1MDc2NDkgNjIxNDQxNSAxMjg1OTM5OCA4NTM5MDgyIDE4ODg1Njk4IDExODY1NjU4IDI5Mzk1MTU0IDEzODA3NzI2IDI1MDY2ODMzIDEwNjI4MzY3IDIzMjExOTc0IDExMjUwMTgwIDE3Mjg2OTY0IDEwNjk5NzU1IDIxNDI1MDYzIDY2MzU5MTAgOTk3NjI4NSA2ODk2ODczIDEzOTcwNDcyIDY3MjY2NTYgMTIyMDM4NjMgNzM4NDk1OSAxNDQ2OTg4MyA2MzEyNjkwIDEzNDM4NDQ5IDc2ODkyNjUgMTQyOTQxMTUgODMzNzc0MSAxNTE5NzczOSA3MzAyMTY3IDE1MzA1NjA4IDkwMDc2MTYgMTYzMDI5MTUgODcxMDE0MCAxNjE1MjQzOSA4MDkzOTkyIDE4ODY4OTQ1IDk4NDgxMTMgMTgwMDY5NDIKKzEwMiA4OSAzMTIgMTAxIDMzNiA4NCAyNDIgMTU0IDUzNiA5NCAxNzcgMTU5IDM0OCAxNjggMjc5IDE5MSAzNzIgMTI1IDI0NyA3NyAzMzAgMTQxIDI0OCA5NCAxNDYgODEgMzE3IDExNCAyNDEgMTAxIDMwNCA2NyAyMDUgMTkyIDI2MiAxNDUgMzIzIDE0MSA0OTUgOTYKKzIzMzI5IDIzMjA0IDE5MzA5IDE3OTMyIDM2MTk4IDY3MTUwIDY0NTI5IDM4NjE3IDMyNjA3IDQzNDk1IDM1MjQ0IDU4OTQwIDQzMTQ3IDQwMzI0IDQwODk4IDQ1NzA1IDMxMzk4IDE1NTcyIDE3MTY3IDExODYzIDE4Mzg0IDI0NjI2IDM0NDUxIDI0Nzc0IDM3Njc3IDE5MDQxIDE0NTIxIDIxMTYxIDM3ODAzIDIzNDY2IDE1NTY2IDI2NjY0IDI5MTYyIDMyMTMzIDI5OTU1IDI5NDMxIDI0NDQzIDI3ODI0IDMxMTM5IDMyNjcwCis5NjYwMDY1IDE1MDYyODIxIDY1NTI4NjggMTMxODk1NjIgOTI1MTIyOSAyMTg3ODEzMCAxMzIxODk3MyAzMDAwNDA0OCAxNDI5NjU1NCAyNjIzNTEwOCAxMTI2Mzk3MSAyNTQ0MDQzOCAxMjA3MjI4MiAxODcyNzE5NCAxMTQ3ODEwOCAyMjk0NzYxMiA3MjcyODY2IDEwMzM0NDM3IDcxNjM1MzUgMTM4NjExMTAgNzAyODY3NiAxMjk4NDYyMCA4MDgxMjU5IDE1MTIzNzc3IDcxMTgyMjIgMTM4MDIwMDYgNzg2ODUwOCAxNDczNjU4MSA5MDk1OTQxIDE1NzI3NjA0IDc1MTc3ODYgMTYwMjU0NzggOTUyODIwOSAxNzI5ODk1MSA5MjU4NDMwIDE2OTkxNDk5IDg1MTY3NjIgMTk0NDYyOTEgMTAzOTgyNjEgMTg5MzM3MzIKKzIyMCAxMTcgMjY1IDkzIDM5NSAzMTMgNTAzIDk2IDE5OCAxMzcgMzA1IDIyMyAzNTcgMjAxIDM1NSAxODEgNDE4IDExNCAyMDQgMzcgMjI3IDE1OCA0MTUgMTIzIDUyNCA5NCAxNDUgMTAxIDQxNSAxMDcgMTY3IDEzMSAyOTEgMTU1IDMxNiAxNDQgMjY0IDExMiAyODUgMTQzCisxMTYwNCAxODE4MyAxMTIxOCA4NTM5IDE4NjUxIDg5MjI2IDgxNzEyIDI5NDM2IDM2Mjk5IDM5MjYxIDI3ODgxIDI4ODQwIDQxODkyIDU1MjY4IDQ3MjY1IDMwNjA1IDEzMjU1IDE0NDM3IDE5NzgxIDE4MTI1IDE1MjA0IDIwNjk5IDE4NjA0IDMyMTg1IDQ3MzM5IDExOTUxIDExNjM5IDE4NTY3IDIyMjA2IDI1NDgyIDE3NDUwIDI5MDU5IDI1MzI0IDI0NDMyIDQ1MTA2IDM0OTczIDI2NjMwIDIzODQwIDI3MjU3IDI0MDQ0Cis5NzE1NTQ0IDE1Mjc2MjA2IDY2NzYwNDYgMTI5MjI4MzUgOTQ5NzA1MyAyNjA0NzMxNyAxNDk3Nzc0NSAzMDAxMjM1MiAxNDg2NzU1NiAyNzA3MzE2MyAxMTY5NTQ5MiAyNTY4NTkzMSAxMjg0MTc4MSAyMDk5OTEzNSAxMjM5OTc4NyAyMzQ1MTEwNSA3NDMwMTQxIDEwNjAxMzY5IDc0OTAzNjAgMTQxNDMwMzEgNzI0MTg2OCAxMzQ3NzI2OSA4MzU1MDg4IDE2MTkzNzUzIDgxNTA2MzAgMTM3MDgxNTggNzk2OTYwNSAxNDk5MzEzMiA5NDM2NTE2IDE2MzQ5NTM2IDc3NzYxODIgMTY4NDkzMDAgOTkzNzY5NyAxNzc2MjA5NyAxMDE4MDMzMCAxODEyMDcwNCA4OTg0ODg0IDE5NzQ0MjMxIDEwODM1NDQyIDE5Mjc0OTU3Cis3NCA3MyAxMjQgMjMgMTYzIDM0OSA1NzQgNTggMjE5IDExOCAyMTUgNzYgMzE0IDI1OSAzODYgMTAwIDEzNiA5NCAyMzAgODYgMTY5IDExMiAxOTAgMTcxIDU5NCA0MCAxMDAgODEgMjEyIDEyMiAxODcgMTQxIDIzMiAxMDMgNDUzIDE2NiAyODAgODEgMjI4IDg4CisyMDIxNSAyOTY1MCAzMDEwMiAxMzQyMCAyNzI1OCA3MDEzMyA3NDIwOSAzODIxNCAzMDE2NCAzNDcxOCAyNDE3NCAyODQxMiA0Mzg4OCA0NDUzMiA1NjI4MiA0NzY1MyAzNDk3MyAyODQzNiAyMzM0NyAxODMxNSAxOTQ5OSAyNTUwNyAyNTY3NCAzOTIyNSA0NjkzNCAyNTQ0NiAxNjg0MCAxOTI4NSAyMDg5NyAyODEwMyAxODk0MSAyODAxMiAyNTY4NSAyMjExMCA0MDExNCAzMDA3MSAyNTA0MSAyNTI4NyAyNzA5NiAyMjY4NQorOTk4OTc1NyAxNjE4MTI5MiA3Mjc4ODcxIDEyOTcxOTg3IDk5NTY3NTcgMjg3OTMzMzcgMTY1MDA4MTcgMzA1NTk0NTYgMTUyNjc0NzggMjc1ODE4MjYgMTIwMjE0ODAgMjU4OTA0MDAgMTM2NDMwOTMgMjI0NzUxNzIgMTM1Mjg5NTUgMjQ5NzE3NzcgODEzODY1NiAxMTcxMjM0OSA3OTAwMTgyIDE0NDE5NzExIDc1NTk1MjkgMTQyMzU3NTIgODgwMjgwOCAxNzYzMjA1MyA5MTQ2OTEzIDE0NDQ5MDQwIDgyMDExMjkgMTUyNzg0MDIgOTczNTEyOCAxNzA5NTE4MSA4MDY2MjQxIDE3NTU5MzcwIDEwMzQ2MTkxIDE4MDU0Nzk3IDEwOTUxNjA4IDE4ODgwOTkzIDk0MDA3MDEgMjAxMTMxOTUgMTEyNTc1OTQgMTk1MTIyMTYKKzE3MiAxNTMgMzk4IDU3IDI1NSAyMjcgNDYxIDg1IDE2NCA4OCAxNzIgNjcgMzExIDE3NSA0MTYgMTY4IDQyMiAyMjAgMjY2IDgzIDIyNiAxNDEgMjc0IDIwNCA1MzEgMTQxIDE3MCA4MSAxODUgMTM0IDIwNCAxMjcgMjMwIDgxIDM2NiAxMjYgMjQ3IDkwIDIyMCA3OQorMjI1MTkgMjMzNDkgMjAwNTcgMTUwMjcgNzY2MyA4NjgyIDc5MjYgNDgyMiA3ODg4IDUzMDYgNTU2OCAxMTYxMCAxNjExNiAxNDY3NiAyNTE0NCAyMjg1OSAxOTM0OSAxOTIyOSAxMzk3NiAxNTg5MCAxOTM3NSAxNzcwMyAxODI0MCAyNDcxOCAxOTA5OCAxNDE4MCAxMDA3NyA2NzU1IDY4NzEgNzM4NiA1NDcwIDExNjY1IDEzNDc2IDEwMzk1IDkxMDQgNjIwMCA3MDk3IDc5MzMgMTEzODggMTI2NDYKKzEwMzE2MDIwIDE2NjQ0OTU4IDc2MDk4NzIgMTMxMTY5MjAgOTkwNDA4OCAyNzU5OTIwNyAxNjI5MTUwOSAyOTAyMjIxNCAxNTA4Nzk4NyAyNjI1Mjk3MSAxMTg2MzcxNSAyNTA1MDMyOCAxMzcxNDQ4MCAyMjAyODM3MyAxMzgzMzk3MCAyNDg3NzkzMSA4NDMwMDk2IDEyMTkxMDE4IDgwNjAyMjggMTQ1MzA4MDUgNzg2NjA5MSAxNDQ2OTI2OSA5MDQ5MzIwIDE4MDkyNzg0IDk0MDY3NjcgMTQ0NTMzMTYgODI1Mzk5NCAxNDc3Njc0NSA5NjY3NzQ2IDE2NTIzMjg5IDgwMDQ3MDcgMTcyMjI1MTkgMTA0MzIzOTUgMTc2MTAxOTYgMTA5MTA5MzkgMTgxMjkwOTIgOTM0NzQ0NCAxOTM5MzgzNiAxMTI2NzY3MiAxOTExODQ2OQorMTk0IDEwMSAyMjkgNjggMzEgNSAxMyAxIDE0IDIgMTEgMTIgNzMgMjYgMTQ0IDQ4IDIwMCAxMTkgMTMzIDY0IDIxNSA3OCAxNzIgOTggMTczIDUwIDc2IDEwIDI3IDEwIDIzIDI0IDg3IDE5IDM3IDYgMzAgOSA1NSAyNQorMTQ0OSA3MDMgMTIwNiAxNDQ0IDYyOCAxNTQ5IDEwMzUgMTM5OCAxMjk4IDE0MDUgMTI1NCAxNjcwIDEyNTYgMTY1NyAxNjM0IDE1MzAgMTY2OCAxNzg5IDE3NjEgMTgxNyAxODU3IDE5MzEgMTk2MSAyMDk2IDIxMjkgMjEwNCAyMjU2IDIyOTkgMjM0NCAyNDI1IDI1NjEgMjU0OSAyNjIyIDI3MzAgMjc5MyAyOTAwIDI5MzggMzA4MSAzMTM3IDMyMzQKKzEwMDk1NTM3IDE1Njg5NDkxIDc0NTA3MzIgMTI0MTg2NTIgOTY3MjkwMSAyNjAzODQ4OCAxNTkxMTI3NSAyNzM2Njg0MSAxNDc0NDUxOSAyNDc2NDE3NiAxMTU5OTYxMSAyMzY0OTk3MCAxMzQwNDIyNiAyMDgwODUyNiAxMzUzMDM5NiAyMzQ3OTMxNSA4MjYyMjkwIDExNTY5NDk4IDc5MDQwMzMgMTM3NzA2MjQgNzcxNzE5NiAxMzcxOTc4MyA4ODczNTQ2IDE3MTM2MDM0IDkyMjYzNjQgMTM3MTU0MTYgODEwNTYxNSAxNDAzMTQyMSA5NDg2MzI0IDE1NjgwOTE3IDc4NzAzNDggMTYzNDU4MTQgMTAyMzg5OTIgMTY3MjEzNTEgMTA3MDk5NjEgMTcyMTk1NTkgOTE4OTIwMiAxODQxOTU0MiAxMTA2NjU4MiAxODE3MDA5NgorMSAwIDEgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAyIDEgMiAwIDIgMSAyIDAgMiAxIDMgMSAzIDEgNSAxIDMgMSAzIDEgNSAxIDQgMQorMTQ1MCA2NjkgMTE3OSAxNDA0IDYyOCAxNTQxIDEwMDEgMTM5MCAxMjcyIDE0MjggMTI2MyAxNjUwIDEyNTggMTY2MiAxNjE5IDE1MTUgMTYzNiAxNzY5IDE3NzggMTgyOCAxODg4IDE5MzUgMTk2OSAyMTAyIDIxMjAgMjEyNCAyMjM4IDIyOTEgMjM0NyAyNDI4IDI1MzkgMjU4MiAyNjQxIDI3MTYgMjgwMSAyOTAyIDI5NTMgMzA2MyAzMTA5IDMyMjEKKzk4ODA1ODMgMTQ3ODkyNjEgNzI5NDg3NCAxMTc1OTgyMSA5NDQ3NDg1IDI0NTcwOTE3IDE1NTM5NjYzIDI1ODEwMjk1IDE0NDA4OTYxIDIzMzY2MTE4IDExMzQyMzMwIDIyMzMyNDAxIDEzMTAxNzY4IDE5NjYyMTc0IDEzMjM0MDE3IDIyMTYzNjkxIDgwOTc4NTUgMTA5ODQwMzkgNzc1MjE3MSAxMzA1NjcyNyA3NTcyODEwIDEzMDE1NTExIDg3MDIzNjQgMTYyMzcwNTUgOTA1MDIzNSAxMzAyMzAxNyA3OTYwNDgwIDEzMzMwMzIzIDkzMDk1MDggMTQ4ODkyNzAgNzczODc4MCAxNTUyMzczNiAxMDA1MDkwMiAxNTg4NDk3NSAxMDUxNDIwNCAxNjM2NDcxOSA5MDM1Mjk0IDE3NTAyNTk3IDEwODY5Nzk2IDE3Mjc3ODI0CisxIDAgMSAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDIgMSAyIDEgMyAxIDIgMCAyIDEgMyAxIDMgMSA1IDEgMyAxIDMgMSA1IDEgNCAxCisxNTAzIDgwNyAxMTY0IDE0NDIgNTk2IDE1NzUgMTAxNCAxMzk4IDEyNzQgMTQzMSAxMjQ5IDE2NDggMTI0MiAxNjU5IDE2MjUgMTU0OCAxNjg0IDE3NzYgMTgxMiAxODQ4IDE4ODkgMTkyMSAxOTU0IDIwNzAgMjExMiAyMTIxIDIyMzkgMjI3NiAyMzI1IDI0MzEgMjUxNSAyNTYwIDI2NDUgMjc0OCAyODA4IDI5MjMgMjk1OCAzMDc3IDMxMzUgMzI0MworOTY3MjM1MCAxMzk1MTUyMSA3MTQyNTI0IDExMTQyODUzIDkyMjY4NzkgMjMxOTM0ODYgMTUxNzc2NjAgMjQzNDc2MjkgMTQwODE4MzEgMjIwNTIxMjUgMTEwOTExMTQgMjEwOTM3NjAgMTI4MDY0NTIgMTg1ODQ0MTYgMTI5NDUxOTAgMjA5MjkwMjggNzkzODc1MiAxMDQzNDEzNiA3NjA0OTY5IDEyMzg2ODkxIDc0MzIwNTQgMTIzNTI2MzMgODUzNTA3MiAxNTM5MDA0NiA4ODc4Mjk4IDEyMzcxOTc2IDc4MTg5OTMgMTI2NzAzNjcgOTEzNjU0NCAxNDE0NTMwNCA3NjA5ODgzIDE0NzQ5NjI5IDk4Njc2MTAgMTUxMDA3NDUgMTAzMjM1MTMgMTU1NjI0NTcgODg4NTM1NiAxNjY0MTUyNyAxMDY3ODU4NyAxNjQ0MDQzOAorMSAwIDEgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAyIDEgMiAxIDMgMSAyIDAgMiAxIDQgMSAzIDEgNSAxIDMgMSA0IDEgNSAxIDQgMgorMTM4NCA2OTAgMTE1MyAxNDY5IDY0NyAxNTQ3IDEwMTIgMTM3MiAxMjQ0IDE0MTMgMTI2NCAxNjQ4IDEyNTEgMTY2NCAxNjIzIDE1NTEgMTY1OCAxNzgwIDE3NDkgMTg0MCAxODcwIDE5MTYgMTk3MiAyMTA0IDIxMjEgMjEwNiAyMjcwIDIzMTkgMjM0NyAyNDExIDI1MjMgMjU2OCAyNjI0IDI3MzAgMjc4NCAyOTAzIDI5NDQgMzA3NiAzMTM0IDMyNDMKKzk0NjYyNzMgMTMxNTY4NTUgNjk5MzY5NiAxMDU2NDU2MCA5MDEzMDgzIDIxODk2OTc3IDE0ODI0NjQzIDIyOTcxMTIyIDEzNzYyMTAwIDIwODE1ODYyIDEwODQ2NTUzIDE5OTI5NDM0IDEyNTE4NzM4IDE3NTcxNjI4IDEyNjYzNTIyIDE5NzY4NjI2IDc3ODI5NTYgOTkxNzQ3MiA3NDU5ODMyIDExNzU2NzUyIDcyOTQzMjYgMTE3MjkyMTkgODM3MjQxNyAxNDU5NTk0NSA4NzEwODgzIDExNzU5MDc1IDc2ODE4MzEgMTIwNTI2NDkgODk2ODQ2MCAxMzQ0NDc0NiA3NDg0NDA4IDE0MDIyNDU4IDk2ODgzNTcgMTQzNjI0NjEgMTAxMzY5NjkgMTQ4MDcxMDAgODczODgwMyAxNTgzMjA1NyAxMDQ5MjEyNiAxNTY1MzI5MworMSAwIDEgMSAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAyIDEgMiAxIDMgMSAyIDEgMyAxIDQgMiAzIDEgNSAxIDMgMSAzIDIgNSAxIDQgMgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3B5dGhvbi90ZmxpdGVfbWljcm8vc2lnbmFsL3RmbG1fc2lnbmFsLmJ6bCBiL3B5dGhvbi90ZmxpdGVfbWljcm8vc2lnbmFsL3RmbG1fc2lnbmFsLmJ6bAppbmRleCA5YmY3NzNlLi4xNjM1YjQ4IDEwMDY0NAotLS0gYS9weXRob24vdGZsaXRlX21pY3JvL3NpZ25hbC90ZmxtX3NpZ25hbC5iemwKKysrIGIvcHl0aG9uL3RmbGl0ZV9taWNyby9zaWduYWwvdGZsbV9zaWduYWwuYnpsCkBAIC0yNSw3ICsyNSw3IEBACiAgICAgICBzcmNzOiBQeXRob24gc291cmNlIGZpbGVzIGZvciB0aGUgUHl0aG9uIGxpYnJhcnkuCiAgICAgICBkZXBzOiBEZXBlbmRlbmNpZXMgZm9yIHRoZSBQeXRob24gbGlicmFyeS4KICAgICAgIHZpc2liaWxpdHk6IFZpc2liaWxpdHkgZm9yIHRoZSBQeXRob24gbGlicmFyeS4KLSAgICAgIGNjX29wX2RlZnM6IEEgbGlzdCBvZiBjKysgc3JjIGZpbGVzIGNvbnRhaW5pbmcgUkVHSVNURVJfT1AgZGVmaW5pdGlvbnMuCisgICAgICBjY19vcF9kZWZzOiBBIGxpc3Qgb2YgYysrIGxpYnJhcmllcyBjb250YWluaW5nIFJFR0lTVEVSX09QIGRlZmluaXRpb25zLgogICAgICAgY2Nfb3Bfa2VybmVsczogQSBsaXN0IG9mIGMrKyB0YXJnZXRzIGNvbnRhaW5pbmcga2VybmVscyB0aGF0IGFyZSB1c2VkCiAgICAgICAgICAgYnkgdGhlIFB5dGhvbiBsaWJyYXJ5LgogICAgICIiIgpAQCAtMzksMTIgKzM5LDEyIEBACiAgICAgICAgIGxpYnJhcnlfbmFtZSA9IG5hbWUgKyAiX2NjIgogICAgICAgICBuYXRpdmUuY2NfbGlicmFyeSgKICAgICAgICAgICAgIG5hbWUgPSBsaWJyYXJ5X25hbWUsCi0gICAgICAgICAgICBzcmNzID0gY2Nfb3BfZGVmcywKICAgICAgICAgICAgIGNvcHRzID0gc2VsZWN0KHsKICAgICAgICAgICAgICAgICAiLy9jb25kaXRpb25zOmRlZmF1bHQiOiBbIi1wdGhyZWFkIl0sCiAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgIGFsd2F5c2xpbmsgPSAxLAogICAgICAgICAgICAgZGVwcyA9CisgICAgICAgICAgICAgICAgY2Nfb3BfZGVmcyArCiAgICAgICAgICAgICAgICAgY2Nfb3Bfa2VybmVscyArCiAgICAgICAgICAgICAgICAgWyJAdGVuc29yZmxvd19jY19kZXBzLy86Y2NfbGlicmFyeSJdICsKICAgICAgICAgICAgICAgICBzZWxlY3QoeyIvL2NvbmRpdGlvbnM6ZGVmYXVsdCI6IFtdfSksCmRpZmYgLS1naXQgYS9weXRob24vdGZsaXRlX21pY3JvL3NpZ25hbC91dGlscy9CVUlMRCBiL3B5dGhvbi90ZmxpdGVfbWljcm8vc2lnbmFsL3V0aWxzL0JVSUxECmluZGV4IDMyYTI2ZmIuLjU4YjdkY2YgMTAwNjQ0Ci0tLSBhL3B5dGhvbi90ZmxpdGVfbWljcm8vc2lnbmFsL3V0aWxzL0JVSUxECisrKyBiL3B5dGhvbi90ZmxpdGVfbWljcm8vc2lnbmFsL3V0aWxzL0JVSUxECkBAIC0xLDQgKzEsNSBAQAogIyBTaWduYWwgcHl0aG9uIHV0aWxpdGllcy4KK2xvYWQoIkBydWxlc19weXRob24vL3B5dGhvbjpkZWZzLmJ6bCIsICJweV9saWJyYXJ5IiwgInB5X3Rlc3QiKQogbG9hZCgiQHRmbG1fcGlwX2RlcHMvLzpyZXF1aXJlbWVudHMuYnpsIiwgInJlcXVpcmVtZW50IikKIGxvYWQoIkBweWJpbmQxMV9iYXplbC8vOmJ1aWxkX2RlZnMuYnpsIiwgInB5YmluZF9leHRlbnNpb24iKQogCkBAIC0zNiw5ICszNywzOSBAQAogcHlfbGlicmFyeSgKICAgICBuYW1lID0gInV0aWwiLAogICAgIHNyY3MgPSBbInV0aWwucHkiXSwKKyAgICB2aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0sCiAgICAgZGVwcyA9IFsKKyAgICAgICAgcmVxdWlyZW1lbnQoInRlbnNvcmZsb3ciKSwKICAgICAgICAgIi8vcHl0aG9uL3RmbGl0ZV9taWNybzpydW50aW1lIiwKLSAgICAgICAgIi8vcHl0aG9uL3RmbGl0ZV9taWNyby9zaWduYWw6b3BzIiwKLSAgICAgICAgcmVxdWlyZW1lbnQoInRlbnNvcmZsb3ctY3B1IiksCiAgICAgXSwKICkKKworcHliaW5kX2V4dGVuc2lvbigKKyAgICBuYW1lID0gIndpZGVfZHluYW1pY19mdW5jX2x1dF93cmFwcGVyIiwgICMgOndpZGVfZHluYW1pY19mdW5jX2x1dF93cmFwcGVyLnNvCisgICAgc3JjcyA9IFsKKyAgICAgICAgIndpZGVfZHluYW1pY19mdW5jX2x1dF93cmFwcGVyLmNjIiwKKyAgICBdLAorKQorCitweV9saWJyYXJ5KAorICAgIG5hbWUgPSAid2lkZV9keW5hbWljX2Z1bmNfbHV0IiwKKyAgICBkYXRhID0gWworICAgICAgICAiOndpZGVfZHluYW1pY19mdW5jX2x1dF93cmFwcGVyLnNvIiwKKyAgICBdLAorKQorCitweV90ZXN0KAorICAgIG5hbWUgPSAid2lkZV9keW5hbWljX2Z1bmNfbHV0X3Rlc3QiLAorICAgIHNyY3MgPSBbIndpZGVfZHluYW1pY19mdW5jX2x1dF90ZXN0LnB5Il0sCisgICAgZGF0YSA9IFsKKyAgICAgICAgIjp3aWRlX2R5bmFtaWNfZnVuY19sdXRfd3JhcHBlci5zbyIsCisgICAgXSwKKyAgICBweXRob25fdmVyc2lvbiA9ICJQWTMiLAorICAgIHNyY3NfdmVyc2lvbiA9ICJQWTMiLAorICAgIHRhZ3MgPSBbCisgICAgICAgICJub2FzYW4iLAorICAgICAgICAibm9tc2FuIiwKKyAgICAgICAgIm5vdWJzYW4iLAorICAgIF0sCisgICAgdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdLAorKQpkaWZmIC0tZ2l0IGEvcHl0aG9uL3RmbGl0ZV9taWNyby9zaWduYWwvdXRpbHMvd2lkZV9keW5hbWljX2Z1bmNfbHV0X3Rlc3QucHkgYi9weXRob24vdGZsaXRlX21pY3JvL3NpZ25hbC91dGlscy93aWRlX2R5bmFtaWNfZnVuY19sdXRfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2JjZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvcHl0aG9uL3RmbGl0ZV9taWNyby9zaWduYWwvdXRpbHMvd2lkZV9keW5hbWljX2Z1bmNfbHV0X3Rlc3QucHkKQEAgLTAsMCArMSwxNTcgQEAKKyMgQ29weXJpZ2h0IDIwMjMgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisiIiJUZXN0cyBmb3Igc2lnbmFsLnB5dGhvbi51dGlscy53aWRlX2R5bmFtaWNfZnVuY19sdXQiIiIKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB0ZmxpdGVfbWljcm8ucHl0aG9uLnRmbGl0ZV9taWNyby5zaWduYWwudXRpbHMgaW1wb3J0IHdpZGVfZHluYW1pY19mdW5jX2x1dF93cmFwcGVyCisKKworY2xhc3MgV2lkZUR5bmFtaWNGdW5jTHV0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgZGVmIHRlc3RXaWRlRHluYW1pY0Z1bmNMdXQoc2VsZik6CisgICAgc2VsZi5tYXhEaWZmID0gTm9uZQorICAgIGV4cGVjdGVkX2x1dCA9IFsKKyAgICAgICAgMzI2MzYsCisgICAgICAgIDMyNjMzLAorICAgICAgICAzMjYzMCwKKyAgICAgICAgLTYsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDMyNjI0LAorICAgICAgICAtMTIsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDMyNjEyLAorICAgICAgICAtMjMsCisgICAgICAgIC0yLAorICAgICAgICAwLAorICAgICAgICAzMjU4NywKKyAgICAgICAgLTQ4LAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAzMjUzOSwKKyAgICAgICAgLTk2LAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAzMjQ0MywKKyAgICAgICAgLTE5MCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMzIyNTMsCisgICAgICAgIC0zNzgsCisgICAgICAgIDQsCisgICAgICAgIDAsCisgICAgICAgIDMxODc5LAorICAgICAgICAtNzM5LAorICAgICAgICAxOCwKKyAgICAgICAgMCwKKyAgICAgICAgMzExNTgsCisgICAgICAgIC0xNDA5LAorICAgICAgICA2MiwKKyAgICAgICAgMCwKKyAgICAgICAgMjk4MTEsCisgICAgICAgIC0yNTY3LAorICAgICAgICAyMDIsCisgICAgICAgIDAsCisgICAgICAgIDI3NDQ2LAorICAgICAgICAtNDMwMSwKKyAgICAgICAgNTYyLAorICAgICAgICAwLAorICAgICAgICAyMzcwNywKKyAgICAgICAgLTYyNjUsCisgICAgICAgIDEyMzAsCisgICAgICAgIDAsCisgICAgICAgIDE4NjcyLAorICAgICAgICAtNzQ1OCwKKyAgICAgICAgMTk1MiwKKyAgICAgICAgMCwKKyAgICAgICAgMTMxNjYsCisgICAgICAgIC03MDMwLAorICAgICAgICAyMjEyLAorICAgICAgICAwLAorICAgICAgICA4MzQ4LAorICAgICAgICAtNTM0MiwKKyAgICAgICAgMTg2OCwKKyAgICAgICAgMCwKKyAgICAgICAgNDg3NCwKKyAgICAgICAgLTM0NTksCisgICAgICAgIDEyODIsCisgICAgICAgIDAsCisgICAgICAgIDI2OTcsCisgICAgICAgIC0yMDI1LAorICAgICAgICA3NzQsCisgICAgICAgIDAsCisgICAgICAgIDE0NDYsCisgICAgICAgIC0xMTIwLAorICAgICAgICA0MzYsCisgICAgICAgIDAsCisgICAgICAgIDc2MiwKKyAgICAgICAgLTU5NiwKKyAgICAgICAgMjMyLAorICAgICAgICAwLAorICAgICAgICAzOTgsCisgICAgICAgIC0zMTMsCisgICAgICAgIDEyMiwKKyAgICAgICAgMCwKKyAgICAgICAgMjA3LAorICAgICAgICAtMTY0LAorICAgICAgICA2NCwKKyAgICAgICAgMCwKKyAgICAgICAgMTA3LAorICAgICAgICAtODUsCisgICAgICAgIDM0LAorICAgICAgICAwLAorICAgICAgICA1NiwKKyAgICAgICAgLTQ1LAorICAgICAgICAxOCwKKyAgICAgICAgMCwKKyAgICAgICAgMjksCisgICAgICAgIC0yMiwKKyAgICAgICAgOCwKKyAgICAgICAgMCwKKyAgICAgICAgMTUsCisgICAgICAgIC0xMywKKyAgICAgICAgNiwKKyAgICAgICAgMCwKKyAgICAgICAgOCwKKyAgICAgICAgLTgsCisgICAgICAgIDQsCisgICAgICAgIDAsCisgICAgICAgIDQsCisgICAgICAgIC0yLAorICAgICAgICAwLAorICAgICAgICAwLAorICAgICAgICAyLAorICAgICAgICAtMywKKyAgICAgICAgMiwKKyAgICAgICAgMCwKKyAgICAgICAgMSwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMCwKKyAgICAgICAgMSwKKyAgICAgICAgLTMsCisgICAgICAgIDIsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgICAgIDAsCisgICAgXQorICAgIGx1dCA9IHdpZGVfZHluYW1pY19mdW5jX2x1dF93cmFwcGVyLndpZGVfZHluYW1pY19mdW5jX2x1dCgKKyAgICAgICAgMC45NSwgODAuMCwgNywgMjEpCisgICAgc2VsZi5hc3NlcnRFcXVhbChsdXQsIGV4cGVjdGVkX2x1dCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3B5dGhvbi90ZmxpdGVfbWljcm8vc2lnbmFsL3V0aWxzL3dpZGVfZHluYW1pY19mdW5jX2x1dF93cmFwcGVyLmNjIGIvcHl0aG9uL3RmbGl0ZV9taWNyby9zaWduYWwvdXRpbHMvd2lkZV9keW5hbWljX2Z1bmNfbHV0X3dyYXBwZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVjZjE2MQotLS0gL2Rldi9udWxsCisrKyBiL3B5dGhvbi90ZmxpdGVfbWljcm8vc2lnbmFsL3V0aWxzL3dpZGVfZHluYW1pY19mdW5jX2x1dF93cmFwcGVyLmNjCkBAIC0wLDAgKzEsOTYgQEAKKy8qIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaW5jbHVkZSA8cHliaW5kMTEvcHliaW5kMTEuaD4KKyNpbmNsdWRlIDxweWJpbmQxMS9weXR5cGVzLmg+CisKKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bGltaXRzPgorCituYW1lc3BhY2UgcHkgPSBweWJpbmQxMTsKKworY29uc3RleHByIHNpemVfdCBrV2lkZUR5bmFtaWNGdW5jdGlvbkJpdHMgPSAzMjsKK2NvbnN0ZXhwciBzaXplX3Qga1dpZGVEeW5hbWljRnVuY3Rpb25MVVRTaXplID0KKyAgICAoNCAqIGtXaWRlRHluYW1pY0Z1bmN0aW9uQml0cyAtIDMpOworCitpbnQxNl90IFBjYW5HYWluTG9va3VwRnVuY3Rpb24oY29uc3QgZmxvYXQgc3RyZW5ndGgsIGNvbnN0IGZsb2F0IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgZ2Fpbl9iaXRzLCBpbnQzMl90IGlucHV0X2JpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgeCkgeworICBjb25zdCBmbG9hdCB4X2FzX2Zsb2F0ID0KKyAgICAgIHN0YXRpY19jYXN0PGZsb2F0Pih4KSAvIChzdGF0aWNfY2FzdDx1aW50MzJfdD4oMSkgPDwgaW5wdXRfYml0cyk7CisgIGNvbnN0IGZsb2F0IGdhaW5fYXNfZmxvYXQgPSAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KDEpIDw8IGdhaW5fYml0cykgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG93Zih4X2FzX2Zsb2F0ICsgb2Zmc2V0LCAtc3RyZW5ndGgpOworCisgIGlmIChnYWluX2FzX2Zsb2F0ID4gc3RkOjpudW1lcmljX2xpbWl0czxpbnQxNl90Pjo6bWF4KCkpIHsKKyAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxpbnQxNl90Pjo6bWF4KCk7CisgIH0KKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludDE2X3Q+KGdhaW5fYXNfZmxvYXQgKyAwLjVmKTsKK30KKworcHk6Omxpc3QgV2lkZUR5bmFtaWNGdW5jTHV0KGZsb2F0IHN0cmVuZ3RoLCBmbG9hdCBvZmZzZXQsIGludCBpbnB1dF9iaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBnYWluX2JpdHMpIHsKKyAgLy8gQXZvaWQgYWNjZXNzaW5nIG91dHNpZGUgb2YgdGhlIGJ1ZmZlciBiZWxvdyBnYWluX2x1dFs0ICogaW50ZXJ2YWwgKyAzXS4KKyAgaW50MTZfdCBnYWluX2x1dF9zdG9yYWdlW2tXaWRlRHluYW1pY0Z1bmN0aW9uTFVUU2l6ZSArIDFdOworICBpbnQxNl90KiBnYWluX2x1dCA9IGdhaW5fbHV0X3N0b3JhZ2U7CisKKyAgZ2Fpbl9sdXRbMF0gPQorICAgICAgUGNhbkdhaW5Mb29rdXBGdW5jdGlvbihzdHJlbmd0aCwgb2Zmc2V0LCBnYWluX2JpdHMsIGlucHV0X2JpdHMsIDApOworICBnYWluX2x1dFsxXSA9CisgICAgICBQY2FuR2Fpbkxvb2t1cEZ1bmN0aW9uKHN0cmVuZ3RoLCBvZmZzZXQsIGdhaW5fYml0cywgaW5wdXRfYml0cywgMSk7CisgIC8vIFRoaXMgcHV0cyB0aGUgcG9pbnRlciBvdXRzaWRlIG9mIHRoZSBidWZmZXIgbWFraW5nIHRoZSBjYWxjdWxhdGlvbiBpbiB0aGUKKyAgLy8gbG9vcCBiZWxvdyBhIGxvdCBzaW1wbGVyLgorICBnYWluX2x1dCAtPSA2OworCisgIGZvciAoc2l6ZV90IGludGVydmFsID0gMjsgaW50ZXJ2YWwgPD0ga1dpZGVEeW5hbWljRnVuY3Rpb25CaXRzOyArK2ludGVydmFsKSB7CisgICAgY29uc3QgdWludDMyX3QgeDAgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oMSkgPDwgKGludGVydmFsIC0gMSk7CisgICAgY29uc3QgdWludDMyX3QgeDEgPSB4MCArICh4MCA+PiAxKTsKKyAgICBjb25zdCB1aW50MzJfdCB4MiA9CisgICAgICAgIChpbnRlcnZhbCA9PSBrV2lkZUR5bmFtaWNGdW5jdGlvbkJpdHMpID8geDAgKyAoeDAgLSAxKSA6IDIgKiB4MDsKKworICAgIGNvbnN0IGludDE2X3QgeTAgPQorICAgICAgICBQY2FuR2Fpbkxvb2t1cEZ1bmN0aW9uKHN0cmVuZ3RoLCBvZmZzZXQsIGdhaW5fYml0cywgaW5wdXRfYml0cywgeDApOworICAgIGNvbnN0IGludDE2X3QgeTEgPQorICAgICAgICBQY2FuR2Fpbkxvb2t1cEZ1bmN0aW9uKHN0cmVuZ3RoLCBvZmZzZXQsIGdhaW5fYml0cywgaW5wdXRfYml0cywgeDEpOworICAgIGNvbnN0IGludDE2X3QgeTIgPQorICAgICAgICBQY2FuR2Fpbkxvb2t1cEZ1bmN0aW9uKHN0cmVuZ3RoLCBvZmZzZXQsIGdhaW5fYml0cywgaW5wdXRfYml0cywgeDIpOworCisgICAgY29uc3QgaW50MzJfdCBkaWZmMSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHkxIC0geTApOworICAgIGNvbnN0IGludDMyX3QgZGlmZjIgPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih5MiAtIHkwKTsKKyAgICBjb25zdCBpbnQzMl90IGExID0gNCAqIGRpZmYxIC0gZGlmZjI7CisgICAgY29uc3QgaW50MzJfdCBhMiA9IGRpZmYyIC0gYTE7CisKKyAgICBnYWluX2x1dFs0ICogaW50ZXJ2YWxdID0geTA7CisgICAgZ2Fpbl9sdXRbNCAqIGludGVydmFsICsgMV0gPSBzdGF0aWNfY2FzdDxpbnQxNl90PihhMSk7CisgICAgZ2Fpbl9sdXRbNCAqIGludGVydmFsICsgMl0gPSBzdGF0aWNfY2FzdDxpbnQxNl90PihhMik7CisgICAgZ2Fpbl9sdXRbNCAqIGludGVydmFsICsgM10gPSAwOworICB9CisgIC8vIEJyaW5ncyB0aGUgcG9pbnRlciBiYWNrIHRvIHRoZSBzdGFydCBvZiB0aGUgYnVmZmVyIHBvc3QgY2FsY3VsYXRpb24gZm9yIHRoZQorICAvLyBsdXQKKyAgZ2Fpbl9sdXQgKz0gNjsKKworICBweTo6bGlzdCBsdXRfbGlzdCA9IHB5OjpsaXN0KCk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga1dpZGVEeW5hbWljRnVuY3Rpb25MVVRTaXplOyBpKyspIHsKKyAgICBsdXRfbGlzdC5hcHBlbmQoZ2Fpbl9sdXRbaV0pOworICB9CisKKyAgcmV0dXJuIGx1dF9saXN0OworfQorCitQWUJJTkQxMV9NT0RVTEUod2lkZV9keW5hbWljX2Z1bmNfbHV0X3dyYXBwZXIsIG0pIHsKKyAgbS5kb2MoKSA9ICJ3aWRlX2R5bmFtaWNfZnVuY19sdXQiOworICBtLmRlZigid2lkZV9keW5hbWljX2Z1bmNfbHV0IiwgJldpZGVEeW5hbWljRnVuY0x1dCwgcHk6OmFyZygic3RyZW5ndGgiKSwKKyAgICAgICAgcHk6OmFyZygib2Zmc2V0IiksIHB5OjphcmcoImlucHV0X2JpdHMiKSwgcHk6OmFyZygiZ2Fpbl9iaXRzIikpOworfQpkaWZmIC0tZ2l0IGEvcHl0aG9uL3RmbGl0ZV9taWNyby93aGxfdGVzdC5zaCBiL3B5dGhvbi90ZmxpdGVfbWljcm8vd2hsX3Rlc3Quc2gKaW5kZXggOGI2ZDk3Zi4uZjNlODI5MyAxMDA3NTUKLS0tIGEvcHl0aG9uL3RmbGl0ZV9taWNyby93aGxfdGVzdC5zaAorKysgYi9weXRob24vdGZsaXRlX21pY3JvL3dobF90ZXN0LnNoCkBAIC0zNyw3ICszNyw3IEBACiAKICMgUnVuIHRoZSBwYWNrYWdlJ3MgcG9zdC1pbnN0YWxsYXRpb24gY2hlY2tzLgogcHl0aG9uMyA8PCBIRVJFRE9DCi1pbXBvcnQgc3lzCi1mcm9tIHRmbGl0ZV9taWNybyBpbXBvcnQgcG9zdGluc3RhbGxfY2hlY2sKLXN5cy5leGl0KDAgaWYgcG9zdGluc3RhbGxfY2hlY2sucGFzc2VkKCkgZWxzZSAxKQoraW1wb3J0IHN5cywgdGZsaXRlX21pY3JvCitwcmludCh0ZmxpdGVfbWljcm8uX192ZXJzaW9uX18pCitzeXMuZXhpdCgwIGlmIHRmbGl0ZV9taWNyby5wb3N0aW5zdGFsbF9jaGVjay5wYXNzZWQoKSBlbHNlIDEpCiBIRVJFRE9DCmRpZmYgLS1naXQgYS9zaWduYWwvbWljcm8va2VybmVscy9CVUlMRCBiL3NpZ25hbC9taWNyby9rZXJuZWxzL0JVSUxECmluZGV4IDRkMzdmMDYuLmI3YWM2NTggMTAwNjQ0Ci0tLSBhL3NpZ25hbC9taWNyby9rZXJuZWxzL0JVSUxECisrKyBiL3NpZ25hbC9taWNyby9rZXJuZWxzL0JVSUxECkBAIC0xMCwxOSArMTAsMjQgQEAKICAgICBzcmNzID0gWwogICAgICAgICAiZGVsYXkuY2MiLAogICAgICAgICAiZW5lcmd5LmNjIiwKLSAgICAgICAgImZmdF9hdXRvX3NjYWxlLmNjIiwKKyAgICAgICAgImZmdF9hdXRvX3NjYWxlX2NvbW1vbi5jYyIsCisgICAgICAgICJmZnRfYXV0b19zY2FsZV9rZXJuZWwuY2MiLAogICAgICAgICAiZmlsdGVyX2JhbmsuY2MiLAogICAgICAgICAiZmlsdGVyX2JhbmtfbG9nLmNjIiwKICAgICAgICAgImZpbHRlcl9iYW5rX3NwZWN0cmFsX3N1YnRyYWN0aW9uLmNjIiwKICAgICAgICAgImZpbHRlcl9iYW5rX3NxdWFyZV9yb290LmNjIiwKKyAgICAgICAgImZpbHRlcl9iYW5rX3NxdWFyZV9yb290X2NvbW1vbi5jYyIsCiAgICAgICAgICJmcmFtZXIuY2MiLAogICAgICAgICAiaXJmZnQuY2MiLAogICAgICAgICAib3ZlcmxhcF9hZGQuY2MiLAorICAgICAgICAicGNhbi5jYyIsCiAgICAgICAgICJyZmZ0LmNjIiwKICAgICAgICAgInN0YWNrZXIuY2MiLAogICAgICAgICAid2luZG93LmNjIiwKICAgICBdLAogICAgIGhkcnMgPSBbCisgICAgICAgICJmZnRfYXV0b19zY2FsZV9rZXJuZWwuaCIsCisgICAgICAgICJmaWx0ZXJfYmFua19zcXVhcmVfcm9vdC5oIiwKICAgICAgICAgImlyZmZ0LmgiLAogICAgICAgICAicmZmdC5oIiwKICAgICBdLApAQCAtNDAsOSArNDUsMTEgQEAKICAgICAgICAgIi8vc2lnbmFsL3NyYzpmaWx0ZXJfYmFua19zcXVhcmVfcm9vdCIsCiAgICAgICAgICIvL3NpZ25hbC9zcmM6aXJmZnQiLAogICAgICAgICAiLy9zaWduYWwvc3JjOm92ZXJsYXBfYWRkIiwKKyAgICAgICAgIi8vc2lnbmFsL3NyYzpwY2FuX2FyZ2NfZml4ZWQiLAogICAgICAgICAiLy9zaWduYWwvc3JjOnJmZnQiLAogICAgICAgICAiLy9zaWduYWwvc3JjOndpbmRvdyIsCiAgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZTp0eXBlX3RvX3RmbGl0ZXR5cGUiLAorICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvYzpjb21tb24iLAogICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUva2VybmVsczprZXJuZWxfdXRpbCIsCiAgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsOnRlbnNvciIsCiAgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNybzpmbGF0YnVmZmVyX3V0aWxzIiwKQEAgLTMyNCwzICszMzEsMjggQEAKICAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvL3Rlc3Rpbmc6bWljcm9fdGVzdCIsCiAgICAgXSwKICkKKworY2NfbGlicmFyeSgKKyAgICBuYW1lID0gInBjYW5fZmxleGJ1ZmZlcnNfZ2VuZXJhdGVkX2RhdGEiLAorICAgIHNyY3MgPSBbCisgICAgICAgICJwY2FuX2ZsZXhidWZmZXJzX2dlbmVyYXRlZF9kYXRhLmNjIiwKKyAgICBdLAorICAgIGhkcnMgPSBbCisgICAgICAgICJwY2FuX2ZsZXhidWZmZXJzX2dlbmVyYXRlZF9kYXRhLmgiLAorICAgIF0sCispCisKK2NjX3Rlc3QoCisgICAgbmFtZSA9ICJwY2FuX3Rlc3QiLAorICAgIHNyY3MgPSBbCisgICAgICAgICJwY2FuX3Rlc3QuY2MiLAorICAgIF0sCisgICAgZGVwcyA9IFsKKyAgICAgICAgIjpwY2FuX2ZsZXhidWZmZXJzX2dlbmVyYXRlZF9kYXRhIiwKKyAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL2M6Y29tbW9uIiwKKyAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvOm9wX3Jlc29sdmVycyIsCisgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNybzp0ZXN0X2hlbHBlcnMiLAorICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVsczprZXJuZWxfcnVubmVyIiwKKyAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvL3Rlc3Rpbmc6bWljcm9fdGVzdCIsCisgICAgXSwKKykKZGlmZiAtLWdpdCBhL3NpZ25hbC9taWNyby9rZXJuZWxzL2RlbGF5LmNjIGIvc2lnbmFsL21pY3JvL2tlcm5lbHMvZGVsYXkuY2MKaW5kZXggMTU1ZTE5OC4uMzNlZjM1ZSAxMDA2NDQKLS0tIGEvc2lnbmFsL21pY3JvL2tlcm5lbHMvZGVsYXkuY2MKKysrIGIvc2lnbmFsL21pY3JvL2tlcm5lbHMvZGVsYXkuY2MKQEAgLTQ0LDcgKzQ0LDcgQEAKICAgdGZsbV9zaWduYWw6OkNpcmN1bGFyQnVmZmVyKiogY2lyY3VsYXJfYnVmZmVyczsKIH07CiAKLXZvaWQqIEluaXQoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogYnVmZmVyLCBzaXplX3QgbGVuZ3RoKSB7Cit2b2lkKiBEZWxheUluaXQoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogYnVmZmVyLCBzaXplX3QgbGVuZ3RoKSB7CiAgIGF1dG8qIHBhcmFtcyA9IHN0YXRpY19jYXN0PFRGTE1TaWduYWxGcm9udGVuZERlbGF5UGFyYW1zKj4oCiAgICAgICBjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIoY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoVEZMTVNpZ25hbEZyb250ZW5kRGVsYXlQYXJhbXMpKSk7CkBAIC01OCw3ICs1OCw3IEBACiAgIHJldHVybiBwYXJhbXM7CiB9CiAKLVRmTGl0ZVN0YXR1cyBQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBEZWxheVByZXBhcmUoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBOdW1JbnB1dHMobm9kZSksIDEpOwogICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBOdW1PdXRwdXRzKG5vZGUpLCAxKTsKIApAQCAtMTA4LDcgKzEwOCw3IEBACiAgIHJldHVybiBrVGZMaXRlT2s7CiB9CiAKLVRmTGl0ZVN0YXR1cyBFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBEZWxheUV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBhdXRvKiBwYXJhbXMgPQogICAgICAgcmVpbnRlcnByZXRfY2FzdDxURkxNU2lnbmFsRnJvbnRlbmREZWxheVBhcmFtcyo+KG5vZGUtPnVzZXJfZGF0YSk7CiAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0ID0KQEAgLTEzMiw3ICsxMzIsNyBAQAogICByZXR1cm4ga1RmTGl0ZU9rOwogfQogCi12b2lkIFJlc2V0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIHZvaWQqIGJ1ZmZlcikgewordm9pZCBEZWxheVJlc2V0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIHZvaWQqIGJ1ZmZlcikgewogICBhdXRvKiBwYXJhbXMgPSBzdGF0aWNfY2FzdDxURkxNU2lnbmFsRnJvbnRlbmREZWxheVBhcmFtcyo+KGJ1ZmZlcik7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLT5vdXRlcl9kaW1zOyArK2kpIHsKICAgICB0ZmxtX3NpZ25hbDo6Q2lyY3VsYXJCdWZmZXJSZXNldChwYXJhbXMtPmNpcmN1bGFyX2J1ZmZlcnNbaV0pOwpAQCAtMTQ1LDggKzE0NSw4IEBACiAKIG5hbWVzcGFjZSB0ZmxtX3NpZ25hbCB7CiBURkxNUmVnaXN0cmF0aW9uKiBSZWdpc3Rlcl9ERUxBWSgpIHsKLSAgc3RhdGljIFRGTE1SZWdpc3RyYXRpb24gciA9Ci0gICAgICBtaWNybzo6UmVnaXN0ZXJPcChJbml0LCBQcmVwYXJlLCBFdmFsLCBudWxscHRyLCBSZXNldCk7CisgIHN0YXRpYyBURkxNUmVnaXN0cmF0aW9uIHIgPSBtaWNybzo6UmVnaXN0ZXJPcChEZWxheUluaXQsIERlbGF5UHJlcGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGF5RXZhbCwgbnVsbHB0ciwgRGVsYXlSZXNldCk7CiAgIHJldHVybiAmcjsKIH0KIH0gIC8vIG5hbWVzcGFjZSB0ZmxtX3NpZ25hbApkaWZmIC0tZ2l0IGEvc2lnbmFsL21pY3JvL2tlcm5lbHMvZW5lcmd5LmNjIGIvc2lnbmFsL21pY3JvL2tlcm5lbHMvZW5lcmd5LmNjCmluZGV4IGZhNzliYzguLjZhODYzNjYgMTAwNjQ0Ci0tLSBhL3NpZ25hbC9taWNyby9rZXJuZWxzL2VuZXJneS5jYworKysgYi9zaWduYWwvbWljcm8va2VybmVscy9lbmVyZ3kuY2MKQEAgLTQyLDcgKzQyLDcgQEAKICAgaW50MzJfdCBzdGFydF9pbmRleDsKIH07CiAKLXZvaWQqIEluaXQoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogYnVmZmVyLCBzaXplX3QgbGVuZ3RoKSB7Cit2b2lkKiBFbmVyZ3lJbml0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgewogICBURkxJVEVfRENIRUNLKGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlciAhPSBudWxscHRyKTsKIAogICBhdXRvKiBkYXRhID0KQEAgLTYwLDcgKzYwLDcgQEAKICAgcmV0dXJuIGRhdGE7CiB9CiAKLVRmTGl0ZVN0YXR1cyBQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBFbmVyZ3lQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgTnVtSW5wdXRzKG5vZGUpLCAxKTsKICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgTnVtT3V0cHV0cyhub2RlKSwgMSk7CiAKQEAgLTgzLDcgKzgzLDcgQEAKICAgcmV0dXJuIGtUZkxpdGVPazsKIH0KIAotVGZMaXRlU3RhdHVzIEV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworVGZMaXRlU3RhdHVzIEVuZXJneUV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBhdXRvKiBwYXJhbXMgPSByZWludGVycHJldF9jYXN0PFRGTE1TaWduYWxFbmVyZ3lQYXJhbXMqPihub2RlLT51c2VyX2RhdGEpOwogCiAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0ID0KQEAgLTEwNCw3ICsxMDQsOCBAQAogCiBuYW1lc3BhY2UgdGZsbV9zaWduYWwgewogVEZMTVJlZ2lzdHJhdGlvbiogUmVnaXN0ZXJfRU5FUkdZKCkgewotICBzdGF0aWMgVEZMTVJlZ2lzdHJhdGlvbiByID0gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChJbml0LCBQcmVwYXJlLCBFdmFsKTsKKyAgc3RhdGljIFRGTE1SZWdpc3RyYXRpb24gciA9CisgICAgICB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKEVuZXJneUluaXQsIEVuZXJneVByZXBhcmUsIEVuZXJneUV2YWwpOwogICByZXR1cm4gJnI7CiB9CiB9ICAvLyBuYW1lc3BhY2UgdGZsbV9zaWduYWwKZGlmZiAtLWdpdCBhL3NpZ25hbC9taWNyby9rZXJuZWxzL2ZmdF9hdXRvX3NjYWxlLmNjIGIvc2lnbmFsL21pY3JvL2tlcm5lbHMvZmZ0X2F1dG9fc2NhbGVfY29tbW9uLmNjCnNpbWlsYXJpdHkgaW5kZXggNjElCnJlbmFtZSBmcm9tIHNpZ25hbC9taWNyby9rZXJuZWxzL2ZmdF9hdXRvX3NjYWxlLmNjCnJlbmFtZSB0byBzaWduYWwvbWljcm8va2VybmVscy9mZnRfYXV0b19zY2FsZV9jb21tb24uY2MKaW5kZXggOGViMGQ4Zi4uODcwM2FjNiAxMDA2NDQKLS0tIGEvc2lnbmFsL21pY3JvL2tlcm5lbHMvZmZ0X2F1dG9fc2NhbGUuY2MKKysrIGIvc2lnbmFsL21pY3JvL2tlcm5lbHMvZmZ0X2F1dG9fc2NhbGVfY29tbW9uLmNjCkBAIC0xMiwyNiArMTIsMTcgQEAKIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotI2luY2x1ZGUgInNpZ25hbC9zcmMvZmZ0X2F1dG9fc2NhbGUuaCIKLQotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3RlbnNvcl9jdHlwZXMuaCIKKyNpbmNsdWRlICJzaWduYWwvbWljcm8va2VybmVscy9mZnRfYXV0b19zY2FsZV9rZXJuZWwuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9rZXJuZWxfdXRpbC5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2tlcm5lbF91dGlsLmgiCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2NvbnRleHQuaCIKIAogbmFtZXNwYWNlIHRmbGl0ZSB7Ci1uYW1lc3BhY2UgewogCiBjb25zdGV4cHIgaW50IGtJbnB1dFRlbnNvciA9IDA7CiBjb25zdGV4cHIgaW50IGtPdXRwdXRUZW5zb3IgPSAwOwogY29uc3RleHByIGludCBrU2NhbGVCaXRUZW5zb3IgPSAxOwogCi1UZkxpdGVTdGF0dXMgUHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgRmZ0QXV0b1NjYWxlUHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bUlucHV0cyhub2RlKSwgMSk7CiAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bU91dHB1dHMobm9kZSksIDIpOwogCkBAIC02MCwzMiArNTEsNCBAQAogICByZXR1cm4ga1RmTGl0ZU9rOwogfQogCi1UZkxpdGVTdGF0dXMgRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7Ci0gIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0ID0KLSAgICAgIHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dChjb250ZXh0LCBub2RlLCBrSW5wdXRUZW5zb3IpOwotICBUZkxpdGVFdmFsVGVuc29yKiBvdXRwdXQgPQotICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbE91dHB1dChjb250ZXh0LCBub2RlLCBrT3V0cHV0VGVuc29yKTsKLSAgVGZMaXRlRXZhbFRlbnNvciogc2NhbGVfYml0ID0KLSAgICAgIHRmbGl0ZTo6bWljcm86OkdldEV2YWxPdXRwdXQoY29udGV4dCwgbm9kZSwga1NjYWxlQml0VGVuc29yKTsKLQotICBjb25zdCBpbnQxNl90KiBpbnB1dF9kYXRhID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90PihpbnB1dCk7Ci0gIGludDE2X3QqIG91dHB1dF9kYXRhID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90PihvdXRwdXQpOwotICBpbnQzMl90KiBzY2FsZV9iaXRfZGF0YSA9IHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50MzJfdD4oc2NhbGVfYml0KTsKLQotICAqc2NhbGVfYml0X2RhdGEgPQotICAgICAgdGZsbV9zaWduYWw6OkZmdEF1dG9TY2FsZShpbnB1dF9kYXRhLCBvdXRwdXQtPmRpbXMtPmRhdGFbMF0sIG91dHB1dF9kYXRhKTsKLSAgcmV0dXJuIGtUZkxpdGVPazsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIFRPRE8oYi8yODYyNTA0NzMpOiByZW1vdmUgbmFtZXNwYWNlIG9uY2UgZGUtZHVwZWQgbGlicmFyaWVzCi1uYW1lc3BhY2UgdGZsbV9zaWduYWwgewotCi1URkxNUmVnaXN0cmF0aW9uKiBSZWdpc3Rlcl9GRlRfQVVUT19TQ0FMRSgpIHsKLSAgc3RhdGljIFRGTE1SZWdpc3RyYXRpb24gciA9IHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AobnVsbHB0ciwgUHJlcGFyZSwgRXZhbCk7Ci0gIHJldHVybiAmcjsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHRmbG1fc2lnbmFsCiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCmRpZmYgLS1naXQgYS9zaWduYWwvbWljcm8va2VybmVscy9mZnRfYXV0b19zY2FsZV9rZXJuZWwuY2MgYi9zaWduYWwvbWljcm8va2VybmVscy9mZnRfYXV0b19zY2FsZV9rZXJuZWwuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk0NmZiMwotLS0gL2Rldi9udWxsCisrKyBiL3NpZ25hbC9taWNyby9rZXJuZWxzL2ZmdF9hdXRvX3NjYWxlX2tlcm5lbC5jYwpAQCAtMCwwICsxLDY0IEBACisvKiBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgInNpZ25hbC9taWNyby9rZXJuZWxzL2ZmdF9hdXRvX3NjYWxlX2tlcm5lbC5oIgorCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAic2lnbmFsL3NyYy9mZnRfYXV0b19zY2FsZS5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3RlbnNvcl9jdHlwZXMuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9rZXJuZWxfdXRpbC5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2tlcm5lbF91dGlsLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2NvbnRleHQuaCIKKworbmFtZXNwYWNlIHRmbGl0ZSB7CituYW1lc3BhY2UgeworCitjb25zdGV4cHIgaW50IGtJbnB1dFRlbnNvciA9IDA7Citjb25zdGV4cHIgaW50IGtPdXRwdXRUZW5zb3IgPSAwOworY29uc3RleHByIGludCBrU2NhbGVCaXRUZW5zb3IgPSAxOworCitUZkxpdGVTdGF0dXMgRmZ0QXV0b1NjYWxlRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CisgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0ID0KKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dChjb250ZXh0LCBub2RlLCBrSW5wdXRUZW5zb3IpOworICBUZkxpdGVFdmFsVGVuc29yKiBvdXRwdXQgPQorICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbE91dHB1dChjb250ZXh0LCBub2RlLCBrT3V0cHV0VGVuc29yKTsKKyAgVGZMaXRlRXZhbFRlbnNvciogc2NhbGVfYml0ID0KKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldEV2YWxPdXRwdXQoY29udGV4dCwgbm9kZSwga1NjYWxlQml0VGVuc29yKTsKKworICBjb25zdCBpbnQxNl90KiBpbnB1dF9kYXRhID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90PihpbnB1dCk7CisgIGludDE2X3QqIG91dHB1dF9kYXRhID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90PihvdXRwdXQpOworICBpbnQzMl90KiBzY2FsZV9iaXRfZGF0YSA9IHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50MzJfdD4oc2NhbGVfYml0KTsKKworICAqc2NhbGVfYml0X2RhdGEgPQorICAgICAgdGZsbV9zaWduYWw6OkZmdEF1dG9TY2FsZShpbnB1dF9kYXRhLCBvdXRwdXQtPmRpbXMtPmRhdGFbMF0sIG91dHB1dF9kYXRhKTsKKyAgcmV0dXJuIGtUZkxpdGVPazsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIFRPRE8oYi8yODYyNTA0NzMpOiByZW1vdmUgbmFtZXNwYWNlIG9uY2UgZGUtZHVwZWQgbGlicmFyaWVzCituYW1lc3BhY2UgdGZsbV9zaWduYWwgeworCitURkxNUmVnaXN0cmF0aW9uKiBSZWdpc3Rlcl9GRlRfQVVUT19TQ0FMRSgpIHsKKyAgc3RhdGljIFRGTE1SZWdpc3RyYXRpb24gciA9CisgICAgICB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKG51bGxwdHIsIEZmdEF1dG9TY2FsZVByZXBhcmUsIEZmdEF1dG9TY2FsZUV2YWwpOworICByZXR1cm4gJnI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZmxtX3NpZ25hbAorfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9zaW1wbGVfZmVhdHVyZXMvc2ltcGxlX21vZGVsX3NldHRpbmdzLmNjIGIvc2lnbmFsL21pY3JvL2tlcm5lbHMvZmZ0X2F1dG9fc2NhbGVfa2VybmVsLmgKc2ltaWxhcml0eSBpbmRleCA2MCUKY29weSBmcm9tIHRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL3NpbXBsZV9tb2RlbF9zZXR0aW5ncy5jYwpjb3B5IHRvIHNpZ25hbC9taWNyby9rZXJuZWxzL2ZmdF9hdXRvX3NjYWxlX2tlcm5lbC5oCmluZGV4IGUyY2Y2NjEuLjk0NjFjOTAgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL3NpbXBsZV9tb2RlbF9zZXR0aW5ncy5jYworKysgYi9zaWduYWwvbWljcm8va2VybmVscy9mZnRfYXV0b19zY2FsZV9rZXJuZWwuaApAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAyMDE4IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTEyLDEyICsxMiwxNSBAQAogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2lmbmRlZiBTSUdOQUxfTUlDUk9fS0VSTkVMU19GRlRfQVVUT19TQ0FMRV9LRVJORUxfSF8KKyNkZWZpbmUgU0lHTkFMX01JQ1JPX0tFUk5FTFNfRkZUX0FVVE9fU0NBTEVfS0VSTkVMX0hfCiAKLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy9zaW1wbGVfbW9kZWxfc2V0dGluZ3MuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvYy9jb21tb24uaCIKIAotY29uc3QgY2hhcioga0NhdGVnb3J5TGFiZWxzW2tDYXRlZ29yeUNvdW50XSA9IHsKLSAgICAic2lsZW5jZSIsCi0gICAgInVua25vd24iLAotICAgICJ5ZXMiLAotICAgICJubyIsCi19OworbmFtZXNwYWNlIHRmbGl0ZSB7CisKK1RmTGl0ZVN0YXR1cyBGZnRBdXRvU2NhbGVQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpOworCit9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCisKKyNlbmRpZiAgLy8gU0lHTkFMX01JQ1JPX0tFUk5FTFNfRkZUX0FVVE9fU0NBTEVfS0VSTkVMX0hfCmRpZmYgLS1naXQgYS9zaWduYWwvbWljcm8va2VybmVscy9mZnRfdGVzdC5jYyBiL3NpZ25hbC9taWNyby9rZXJuZWxzL2ZmdF90ZXN0LmNjCmluZGV4IDlkNmZkMjUuLmJmNTRkNDEgMTAwNjQ0Ci0tLSBhL3NpZ25hbC9taWNyby9rZXJuZWxzL2ZmdF90ZXN0LmNjCisrKyBiL3NpZ25hbC9taWNyby9rZXJuZWxzL2ZmdF90ZXN0LmNjCkBAIC0yNzQsMTEgKzI3NCwxMSBAQAogICBjb25zdCBURkxNUmVnaXN0cmF0aW9uKiByZWdpc3RyYXRpb24gPQogICAgICAgdGZsaXRlOjp0ZmxtX3NpZ25hbDo6UmVnaXN0ZXJfUkZGVF9JTlQxNigpOwogLy8gU2VlIChiLzI4NzUxODgxNSkgZm9yIHdoeSB0aGlzIGlzIG5lZWRlZC4KLSNpZiBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQorI2lmIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCiAgIGludCB0b2xlcmFuY2UgPSA5OwotI2Vsc2UgICAvLyBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQorI2Vsc2UgICAvLyBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQogICBpbnQgdG9sZXJhbmNlID0gMzsKLSNlbmRpZiAgLy8gZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKKyNlbmRpZiAgLy8gZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKICAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoCiAgICAgICBrVGZMaXRlT2ssIHRmbGl0ZTo6dGVzdGluZzo6VGVzdEZGVDxpbnQxNl90PigKICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3NoYXBlLCB0ZmxpdGU6OmtSZmZ0SW50MTZMZW5ndGg1MTJJbnB1dCwKZGlmZiAtLWdpdCBhL3NpZ25hbC9taWNyby9rZXJuZWxzL2ZpbHRlcl9iYW5rLmNjIGIvc2lnbmFsL21pY3JvL2tlcm5lbHMvZmlsdGVyX2JhbmsuY2MKaW5kZXggNzg2NmFjMy4uMWNmMDhkMiAxMDA2NDQKLS0tIGEvc2lnbmFsL21pY3JvL2tlcm5lbHMvZmlsdGVyX2JhbmsuY2MKKysrIGIvc2lnbmFsL21pY3JvL2tlcm5lbHMvZmlsdGVyX2JhbmsuY2MKQEAgLTQ2LDcgKzQ2LDggQEAKICAgdWludDY0X3QqIHdvcmtfYXJlYTsKIH07CiAKLXZvaWQqIEluaXQoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogYnVmZmVyLCBzaXplX3QgbGVuZ3RoKSB7Cit2b2lkKiBGaWx0ZXJCYW5rSW5pdChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKSB7CiAgIFRGTElURV9EQ0hFQ0soY29udGV4dC0+QWxsb2NhdGVQZXJzaXN0ZW50QnVmZmVyICE9IG51bGxwdHIpOwogCiAgIGF1dG8qIHBhcmFtcyA9IHN0YXRpY19jYXN0PFRGTE1TaWduYWxGaWx0ZXJCYW5rUGFyYW1zKj4oCkBAIC03MCw3ICs3MSw3IEBACiAgIHJldHVybiBwYXJhbXM7CiB9CiAKLVRmTGl0ZVN0YXR1cyBQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBGaWx0ZXJCYW5rUHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bUlucHV0cyhub2RlKSwgNik7CiAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bU91dHB1dHMobm9kZSksIDEpOwogCkBAIC0xMjIsNyArMTIzLDcgQEAKICAgcmV0dXJuIGtUZkxpdGVPazsKIH0KIAotVGZMaXRlU3RhdHVzIEV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworVGZMaXRlU3RhdHVzIEZpbHRlckJhbmtFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgYXV0byogcGFyYW1zID0gcmVpbnRlcnByZXRfY2FzdDxURkxNU2lnbmFsRmlsdGVyQmFua1BhcmFtcyo+KG5vZGUtPnVzZXJfZGF0YSk7CiAKICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXQwID0KQEAgLTE2Niw3ICsxNjcsOCBAQAogbmFtZXNwYWNlIHRmbG1fc2lnbmFsIHsKIAogVEZMTVJlZ2lzdHJhdGlvbiogUmVnaXN0ZXJfRklMVEVSX0JBTksoKSB7Ci0gIHN0YXRpYyBURkxNUmVnaXN0cmF0aW9uIHIgPSB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKEluaXQsIFByZXBhcmUsIEV2YWwpOworICBzdGF0aWMgVEZMTVJlZ2lzdHJhdGlvbiByID0gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcCgKKyAgICAgIEZpbHRlckJhbmtJbml0LCBGaWx0ZXJCYW5rUHJlcGFyZSwgRmlsdGVyQmFua0V2YWwpOwogICByZXR1cm4gJnI7CiB9CiAKZGlmZiAtLWdpdCBhL3NpZ25hbC9taWNyby9rZXJuZWxzL2ZpbHRlcl9iYW5rX2xvZy5jYyBiL3NpZ25hbC9taWNyby9rZXJuZWxzL2ZpbHRlcl9iYW5rX2xvZy5jYwppbmRleCBlYTBjZGI3Li4zZDM4ZTYxIDEwMDY0NAotLS0gYS9zaWduYWwvbWljcm8va2VybmVscy9maWx0ZXJfYmFua19sb2cuY2MKKysrIGIvc2lnbmFsL21pY3JvL2tlcm5lbHMvZmlsdGVyX2JhbmtfbG9nLmNjCkBAIC00Miw3ICs0Miw4IEBACiAgIGludCBvdXRwdXRfc2NhbGU7CiB9OwogCi12b2lkKiBJbml0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgewordm9pZCogRmlsdGVyQmFua0xvZ0luaXQoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCkgewogICBURkxJVEVfRENIRUNLKGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlciAhPSBudWxscHRyKTsKIAogICBhdXRvKiBwYXJhbXMgPSBzdGF0aWNfY2FzdDxURkxNU2lnbmFsTG9nUGFyYW1zKj4oCkBAIC01OSw3ICs2MCw3IEBACiAgIHJldHVybiBwYXJhbXM7CiB9CiAKLVRmTGl0ZVN0YXR1cyBQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBGaWx0ZXJCYW5rTG9nUHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bUlucHV0cyhub2RlKSwgMSk7CiAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bU91dHB1dHMobm9kZSksIDEpOwogCkBAIC04Miw3ICs4Myw3IEBACiAgIHJldHVybiBrVGZMaXRlT2s7CiB9CiAKLVRmTGl0ZVN0YXR1cyBFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBGaWx0ZXJCYW5rTG9nRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIGF1dG8qIHBhcmFtcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8VEZMTVNpZ25hbExvZ1BhcmFtcyo+KG5vZGUtPnVzZXJfZGF0YSk7CiAKICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXQgPQpAQCAtMTAzLDcgKzEwNCw4IEBACiBuYW1lc3BhY2UgdGZsbV9zaWduYWwgewogCiBURkxNUmVnaXN0cmF0aW9uKiBSZWdpc3Rlcl9GSUxURVJfQkFOS19MT0coKSB7Ci0gIHN0YXRpYyBURkxNUmVnaXN0cmF0aW9uIHIgPSB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKEluaXQsIFByZXBhcmUsIEV2YWwpOworICBzdGF0aWMgVEZMTVJlZ2lzdHJhdGlvbiByID0gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcCgKKyAgICAgIEZpbHRlckJhbmtMb2dJbml0LCBGaWx0ZXJCYW5rTG9nUHJlcGFyZSwgRmlsdGVyQmFua0xvZ0V2YWwpOwogICByZXR1cm4gJnI7CiB9CiAKZGlmZiAtLWdpdCBhL3NpZ25hbC9taWNyby9rZXJuZWxzL2ZpbHRlcl9iYW5rX3NwZWN0cmFsX3N1YnRyYWN0aW9uLmNjIGIvc2lnbmFsL21pY3JvL2tlcm5lbHMvZmlsdGVyX2Jhbmtfc3BlY3RyYWxfc3VidHJhY3Rpb24uY2MKaW5kZXggZjVlYTRkNy4uZTA2OTMyMyAxMDA2NDQKLS0tIGEvc2lnbmFsL21pY3JvL2tlcm5lbHMvZmlsdGVyX2Jhbmtfc3BlY3RyYWxfc3VidHJhY3Rpb24uY2MKKysrIGIvc2lnbmFsL21pY3JvL2tlcm5lbHMvZmlsdGVyX2Jhbmtfc3BlY3RyYWxfc3VidHJhY3Rpb24uY2MKQEAgLTUxLDEyICs1MSwxNCBAQAogICBzaXplX3Qgbm9pc2VfZXN0aW1hdGVfc2l6ZTsKIH07CiAKLXZvaWQgUmVzZXRTdGF0ZShURkxNU2lnbmFsU3BlY3RyYWxTdWJ0cmFjdGlvblBhcmFtcyogcGFyYW1zKSB7Cit2b2lkIEZpbHRlckJhbmtTcGVjdHJhbFN1YnRyYWN0aW9uUmVzZXRTdGF0ZSgKKyAgICBURkxNU2lnbmFsU3BlY3RyYWxTdWJ0cmFjdGlvblBhcmFtcyogcGFyYW1zKSB7CiAgIG1lbXNldChwYXJhbXMtPm5vaXNlX2VzdGltYXRlLCAwLAogICAgICAgICAgc2l6ZW9mKHVpbnQzMl90KSAqIHBhcmFtcy0+Y29uZmlnLm51bV9jaGFubmVscyk7CiB9CiAKLXZvaWQqIEluaXQoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogYnVmZmVyLCBzaXplX3QgbGVuZ3RoKSB7Cit2b2lkKiBGaWx0ZXJCYW5rU3BlY3RyYWxTdWJ0cmFjdGlvbkluaXQoVGZMaXRlQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpIHsKICAgVEZMSVRFX0RDSEVDSyhjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIgIT0gbnVsbHB0cik7CiAKICAgYXV0byogcGFyYW1zID0gc3RhdGljX2Nhc3Q8VEZMTVNpZ25hbFNwZWN0cmFsU3VidHJhY3Rpb25QYXJhbXMqPigKQEAgLTk2LDcgKzk4LDggQEAKICAgcmV0dXJuIHBhcmFtczsKIH0KIAotVGZMaXRlU3RhdHVzIFByZXBhcmUoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworVGZMaXRlU3RhdHVzIEZpbHRlckJhbmtTcGVjdHJhbFN1YnRyYWN0aW9uUHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bUlucHV0cyhub2RlKSwgMSk7CiAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bU91dHB1dHMobm9kZSksIDIpOwogCkBAIC0xMjUsNyArMTI4LDcgQEAKICAgVGZMaXRlVHlwZVNpemVPZihvdXRwdXQtPnR5cGUsICZwYXJhbXMtPm5vaXNlX2VzdGltYXRlX3NpemUpOwogICBwYXJhbXMtPm5vaXNlX2VzdGltYXRlX3NpemUgKj0gRWxlbWVudENvdW50KCpub2lzZV9lc3RpbWF0ZS0+ZGltcyk7CiAKLSAgUmVzZXRTdGF0ZShwYXJhbXMpOworICBGaWx0ZXJCYW5rU3BlY3RyYWxTdWJ0cmFjdGlvblJlc2V0U3RhdGUocGFyYW1zKTsKIAogICBtaWNyb19jb250ZXh0LT5EZWFsbG9jYXRlVGVtcFRmTGl0ZVRlbnNvcihpbnB1dCk7CiAgIG1pY3JvX2NvbnRleHQtPkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKG91dHB1dCk7CkBAIC0xMzMsNyArMTM2LDggQEAKICAgcmV0dXJuIGtUZkxpdGVPazsKIH0KIAotVGZMaXRlU3RhdHVzIEV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworVGZMaXRlU3RhdHVzIEZpbHRlckJhbmtTcGVjdHJhbFN1YnRyYWN0aW9uRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIGF1dG8qIHBhcmFtcyA9CiAgICAgICByZWludGVycHJldF9jYXN0PFRGTE1TaWduYWxTcGVjdHJhbFN1YnRyYWN0aW9uUGFyYW1zKj4obm9kZS0+dXNlcl9kYXRhKTsKIApAQCAtMTU4LDggKzE2Miw5IEBACiAgIHJldHVybiBrVGZMaXRlT2s7CiB9CiAKLXZvaWQgUmVzZXQoVGZMaXRlQ29udGV4dCogY29udGV4dCwgdm9pZCogYnVmZmVyKSB7Ci0gIFJlc2V0U3RhdGUoc3RhdGljX2Nhc3Q8VEZMTVNpZ25hbFNwZWN0cmFsU3VidHJhY3Rpb25QYXJhbXMqPihidWZmZXIpKTsKK3ZvaWQgRmlsdGVyQmFua1NwZWN0cmFsU3VidHJhY3Rpb25SZXNldChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCB2b2lkKiBidWZmZXIpIHsKKyAgRmlsdGVyQmFua1NwZWN0cmFsU3VidHJhY3Rpb25SZXNldFN0YXRlKAorICAgICAgc3RhdGljX2Nhc3Q8VEZMTVNpZ25hbFNwZWN0cmFsU3VidHJhY3Rpb25QYXJhbXMqPihidWZmZXIpKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlCkBAIC0xNjcsOCArMTcyLDEwIEBACiBuYW1lc3BhY2UgdGZsbV9zaWduYWwgewogCiBURkxNUmVnaXN0cmF0aW9uKiBSZWdpc3Rlcl9GSUxURVJfQkFOS19TUEVDVFJBTF9TVUJUUkFDVElPTigpIHsKLSAgc3RhdGljIFRGTE1SZWdpc3RyYXRpb24gciA9Ci0gICAgICB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKEluaXQsIFByZXBhcmUsIEV2YWwsIC8qRnJlZSovIG51bGxwdHIsIFJlc2V0KTsKKyAgc3RhdGljIFRGTE1SZWdpc3RyYXRpb24gciA9IHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoCisgICAgICBGaWx0ZXJCYW5rU3BlY3RyYWxTdWJ0cmFjdGlvbkluaXQsIEZpbHRlckJhbmtTcGVjdHJhbFN1YnRyYWN0aW9uUHJlcGFyZSwKKyAgICAgIEZpbHRlckJhbmtTcGVjdHJhbFN1YnRyYWN0aW9uRXZhbCwKKyAgICAgIC8qRnJlZSovIG51bGxwdHIsIEZpbHRlckJhbmtTcGVjdHJhbFN1YnRyYWN0aW9uUmVzZXQpOwogICByZXR1cm4gJnI7CiB9CiAKZGlmZiAtLWdpdCBhL3NpZ25hbC9taWNyby9rZXJuZWxzL2ZpbHRlcl9iYW5rX3NxdWFyZV9yb290LmNjIGIvc2lnbmFsL21pY3JvL2tlcm5lbHMvZmlsdGVyX2Jhbmtfc3F1YXJlX3Jvb3QuY2MKaW5kZXggOGRmMjYxNy4uYmQ3ZWZmOSAxMDA2NDQKLS0tIGEvc2lnbmFsL21pY3JvL2tlcm5lbHMvZmlsdGVyX2Jhbmtfc3F1YXJlX3Jvb3QuY2MKKysrIGIvc2lnbmFsL21pY3JvL2tlcm5lbHMvZmlsdGVyX2Jhbmtfc3F1YXJlX3Jvb3QuY2MKQEAgLTE3LDYgKzE3LDcgQEAKIAogI2luY2x1ZGUgPHN0ZGludC5oPgogCisjaW5jbHVkZSAic2lnbmFsL21pY3JvL2tlcm5lbHMvZmlsdGVyX2Jhbmtfc3F1YXJlX3Jvb3QuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC90ZW5zb3JfY3R5cGVzLmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMva2VybmVsX3V0aWwuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9rZXJuZWxfdXRpbC5oIgpAQCAtMzAsMzcgKzMxLDggQEAKIGNvbnN0ZXhwciBpbnQga1NjYWxlQml0c1RlbnNvciA9IDE7CiBjb25zdGV4cHIgaW50IGtPdXRwdXRUZW5zb3IgPSAwOwogCi1UZkxpdGVTdGF0dXMgUHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7Ci0gIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bUlucHV0cyhub2RlKSwgMik7Ci0gIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bU91dHB1dHMobm9kZSksIDEpOwotCi0gIE1pY3JvQ29udGV4dCogbWljcm9fY29udGV4dCA9IEdldE1pY3JvQ29udGV4dChjb250ZXh0KTsKLQotICBUZkxpdGVUZW5zb3IqIGlucHV0ID0KLSAgICAgIG1pY3JvX2NvbnRleHQtPkFsbG9jYXRlVGVtcElucHV0VGVuc29yKG5vZGUsIGtJbnB1dFRlbnNvcik7Ci0gIFRmTGl0ZVRlbnNvciogc2NhbGVfYml0cyA9Ci0gICAgICBtaWNyb19jb250ZXh0LT5BbGxvY2F0ZVRlbXBJbnB1dFRlbnNvcihub2RlLCBrU2NhbGVCaXRzVGVuc29yKTsKLSAgVGZMaXRlVGVuc29yKiBvdXRwdXQgPQotICAgICAgbWljcm9fY29udGV4dC0+QWxsb2NhdGVUZW1wT3V0cHV0VGVuc29yKG5vZGUsIGtPdXRwdXRUZW5zb3IpOwotICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCBpbnB1dCAhPSBudWxscHRyKTsKLSAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgc2NhbGVfYml0cyAhPSBudWxscHRyKTsKLSAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgb3V0cHV0ICE9IG51bGxwdHIpOwotCi0gIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bURpbWVuc2lvbnMoaW5wdXQpLCAxKTsKLSAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgTnVtRGltZW5zaW9ucyhzY2FsZV9iaXRzKSwgMCk7Ci0gIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bURpbWVuc2lvbnMob3V0cHV0KSwgMSk7Ci0KLSAgVEZfTElURV9FTlNVUkVfVFlQRVNfRVEoY29udGV4dCwgaW5wdXQtPnR5cGUsIGtUZkxpdGVVSW50NjQpOwotICBURl9MSVRFX0VOU1VSRV9UWVBFU19FUShjb250ZXh0LCBzY2FsZV9iaXRzLT50eXBlLCBrVGZMaXRlSW50MzIpOwotICBURl9MSVRFX0VOU1VSRV9UWVBFU19FUShjb250ZXh0LCBvdXRwdXQtPnR5cGUsIGtUZkxpdGVVSW50MzIpOwotCi0gIG1pY3JvX2NvbnRleHQtPkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKGlucHV0KTsKLSAgbWljcm9fY29udGV4dC0+RGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3Iob3V0cHV0KTsKLSAgbWljcm9fY29udGV4dC0+RGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3Ioc2NhbGVfYml0cyk7Ci0gIHJldHVybiBrVGZMaXRlT2s7Ci19Ci0KLVRmTGl0ZVN0YXR1cyBFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBGaWx0ZXJCYW5rU3F1YXJlUm9vdEV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGZMaXRlTm9kZSogbm9kZSkgewogICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dCA9CiAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsSW5wdXQoY29udGV4dCwgbm9kZSwga0lucHV0VGVuc29yKTsKICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogc2NhbGVfYml0cyA9CkBAIC04Myw3ICs1NSw4IEBACiBuYW1lc3BhY2UgdGZsbV9zaWduYWwgewogCiBURkxNUmVnaXN0cmF0aW9uKiBSZWdpc3Rlcl9GSUxURVJfQkFOS19TUVVBUkVfUk9PVCgpIHsKLSAgc3RhdGljIFRGTE1SZWdpc3RyYXRpb24gciA9IHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AobnVsbHB0ciwgUHJlcGFyZSwgRXZhbCk7CisgIHN0YXRpYyBURkxNUmVnaXN0cmF0aW9uIHIgPSB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKAorICAgICAgbnVsbHB0ciwgRmlsdGVyQmFua1NxdWFyZVJvb3RQcmVwYXJlLCBGaWx0ZXJCYW5rU3F1YXJlUm9vdEV2YWwpOwogICByZXR1cm4gJnI7CiB9CiAKZGlmZiAtLWdpdCBhL3NpZ25hbC9taWNyby9rZXJuZWxzL2ZpbHRlcl9iYW5rX3NxdWFyZV9yb290LmggYi9zaWduYWwvbWljcm8va2VybmVscy9maWx0ZXJfYmFua19zcXVhcmVfcm9vdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YjY3NzkKLS0tIC9kZXYvbnVsbAorKysgYi9zaWduYWwvbWljcm8va2VybmVscy9maWx0ZXJfYmFua19zcXVhcmVfcm9vdC5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2lmbmRlZiBTSUdOQUxfTUlDUk9fS0VSTkVMU19GSUxURVJfQkFOS19TUVVBUkVfUk9PVF9IXworI2RlZmluZSBTSUdOQUxfTUlDUk9fS0VSTkVMU19GSUxURVJfQkFOS19TUVVBUkVfUk9PVF9IXworCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2MvY29tbW9uLmgiCisKK25hbWVzcGFjZSB0ZmxpdGUgeworCitUZkxpdGVTdGF0dXMgRmlsdGVyQmFua1NxdWFyZVJvb3RQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRmTGl0ZU5vZGUqIG5vZGUpOworCit9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCisKKyNlbmRpZiAgLy8gU0lHTkFMX01JQ1JPX0tFUk5FTFNfRklMVEVSX0JBTktfU1FVQVJFX1JPT1RfSF8KZGlmZiAtLWdpdCBhL3NpZ25hbC9taWNyby9rZXJuZWxzL2ZpbHRlcl9iYW5rX3NxdWFyZV9yb290X2NvbW1vbi5jYyBiL3NpZ25hbC9taWNyby9rZXJuZWxzL2ZpbHRlcl9iYW5rX3NxdWFyZV9yb290X2NvbW1vbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDMwOTAxCi0tLSAvZGV2L251bGwKKysrIGIvc2lnbmFsL21pY3JvL2tlcm5lbHMvZmlsdGVyX2Jhbmtfc3F1YXJlX3Jvb3RfY29tbW9uLmNjCkBAIC0wLDAgKzEsNTYgQEAKKy8qIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2luY2x1ZGUgInNpZ25hbC9taWNyby9rZXJuZWxzL2ZpbHRlcl9iYW5rX3NxdWFyZV9yb290LmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMva2VybmVsX3V0aWwuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9rZXJuZWxfdXRpbC5oIgorCituYW1lc3BhY2UgdGZsaXRlIHsKKworY29uc3RleHByIGludCBrSW5wdXRUZW5zb3IgPSAwOworY29uc3RleHByIGludCBrU2NhbGVCaXRzVGVuc29yID0gMTsKK2NvbnN0ZXhwciBpbnQga091dHB1dFRlbnNvciA9IDA7CisKK1RmTGl0ZVN0YXR1cyBGaWx0ZXJCYW5rU3F1YXJlUm9vdFByZXBhcmUoVGZMaXRlQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGZMaXRlTm9kZSogbm9kZSkgeworICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBOdW1JbnB1dHMobm9kZSksIDIpOworICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBOdW1PdXRwdXRzKG5vZGUpLCAxKTsKKworICBNaWNyb0NvbnRleHQqIG1pY3JvX2NvbnRleHQgPSBHZXRNaWNyb0NvbnRleHQoY29udGV4dCk7CisKKyAgVGZMaXRlVGVuc29yKiBpbnB1dCA9CisgICAgICBtaWNyb19jb250ZXh0LT5BbGxvY2F0ZVRlbXBJbnB1dFRlbnNvcihub2RlLCBrSW5wdXRUZW5zb3IpOworICBUZkxpdGVUZW5zb3IqIHNjYWxlX2JpdHMgPQorICAgICAgbWljcm9fY29udGV4dC0+QWxsb2NhdGVUZW1wSW5wdXRUZW5zb3Iobm9kZSwga1NjYWxlQml0c1RlbnNvcik7CisgIFRmTGl0ZVRlbnNvciogb3V0cHV0ID0KKyAgICAgIG1pY3JvX2NvbnRleHQtPkFsbG9jYXRlVGVtcE91dHB1dFRlbnNvcihub2RlLCBrT3V0cHV0VGVuc29yKTsKKyAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgaW5wdXQgIT0gbnVsbHB0cik7CisgIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIHNjYWxlX2JpdHMgIT0gbnVsbHB0cik7CisgIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIG91dHB1dCAhPSBudWxscHRyKTsKKworICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBOdW1EaW1lbnNpb25zKGlucHV0KSwgMSk7CisgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bURpbWVuc2lvbnMoc2NhbGVfYml0cyksIDApOworICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBOdW1EaW1lbnNpb25zKG91dHB1dCksIDEpOworCisgIFRGX0xJVEVfRU5TVVJFX1RZUEVTX0VRKGNvbnRleHQsIGlucHV0LT50eXBlLCBrVGZMaXRlVUludDY0KTsKKyAgVEZfTElURV9FTlNVUkVfVFlQRVNfRVEoY29udGV4dCwgc2NhbGVfYml0cy0+dHlwZSwga1RmTGl0ZUludDMyKTsKKyAgVEZfTElURV9FTlNVUkVfVFlQRVNfRVEoY29udGV4dCwgb3V0cHV0LT50eXBlLCBrVGZMaXRlVUludDMyKTsKKworICBtaWNyb19jb250ZXh0LT5EZWFsbG9jYXRlVGVtcFRmTGl0ZVRlbnNvcihpbnB1dCk7CisgIG1pY3JvX2NvbnRleHQtPkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKG91dHB1dCk7CisgIG1pY3JvX2NvbnRleHQtPkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKHNjYWxlX2JpdHMpOworICByZXR1cm4ga1RmTGl0ZU9rOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCmRpZmYgLS1naXQgYS9zaWduYWwvbWljcm8va2VybmVscy9mcmFtZXIuY2MgYi9zaWduYWwvbWljcm8va2VybmVscy9mcmFtZXIuY2MKaW5kZXggODQzN2JkMC4uMzZmMTg5YyAxMDA2NDQKLS0tIGEvc2lnbmFsL21pY3JvL2tlcm5lbHMvZnJhbWVyLmNjCisrKyBiL3NpZ25hbC9taWNyby9rZXJuZWxzL2ZyYW1lci5jYwpAQCAtNDgsNyArNDgsNyBAQAogICB0ZmxpdGU6OnRmbG1fc2lnbmFsOjpDaXJjdWxhckJ1ZmZlcioqIGNpcmN1bGFyX2J1ZmZlcnM7CiB9OwogCi12b2lkIFJlc2V0U3RhdGUoVEZMTVNpZ25hbEZyYW1lclBhcmFtcyogcGFyYW1zKSB7Cit2b2lkIEZyYW1lclJlc2V0U3RhdGUoVEZMTVNpZ25hbEZyYW1lclBhcmFtcyogcGFyYW1zKSB7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLT5vdXRlcl9kaW1zOyArK2kpIHsKICAgICB0ZmxpdGU6OnRmbG1fc2lnbmFsOjpDaXJjdWxhckJ1ZmZlclJlc2V0KHBhcmFtcy0+Y2lyY3VsYXJfYnVmZmVyc1tpXSk7CiAgICAgaWYgKHBhcmFtcy0+cHJlZmlsbCkgewpAQCAtNTgsNyArNTgsNyBAQAogICB9CiB9CiAKLXZvaWQqIEluaXQoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogYnVmZmVyLCBzaXplX3QgbGVuZ3RoKSB7Cit2b2lkKiBGcmFtZXJJbml0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgewogICBjb25zdCB1aW50OF90KiBidWZmZXJfdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJ1ZmZlcik7CiAKICAgYXV0byogcGFyYW1zID0KQEAgLTc2LDcgKzc2LDcgQEAKICAgcmV0dXJuIHBhcmFtczsKIH0KIAotVGZMaXRlU3RhdHVzIFByZXBhcmUoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworVGZMaXRlU3RhdHVzIEZyYW1lclByZXBhcmUoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBOdW1JbnB1dHMobm9kZSksIDEpOwogICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBOdW1PdXRwdXRzKG5vZGUpLCAyKTsKIApAQCAtMTMyLDcgKzEzMiw3IEBACiAgICAgICAgIGNhcGFjaXR5LCBwYXJhbXMtPnN0YXRlX2J1ZmZlcnNbaV0sIHN0YXRlX3NpemUpOwogICB9CiAKLSAgUmVzZXRTdGF0ZShwYXJhbXMpOworICBGcmFtZXJSZXNldFN0YXRlKHBhcmFtcyk7CiAKICAgbWljcm9fY29udGV4dC0+RGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3IoaW5wdXQpOwogICBtaWNyb19jb250ZXh0LT5EZWFsbG9jYXRlVGVtcFRmTGl0ZVRlbnNvcihvdXRwdXQpOwpAQCAtMTQxLDcgKzE0MSw3IEBACiAgIHJldHVybiBrVGZMaXRlT2s7CiB9CiAKLVRmTGl0ZVN0YXR1cyBFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBGcmFtZXJFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgYXV0byogcGFyYW1zID0gcmVpbnRlcnByZXRfY2FzdDxURkxNU2lnbmFsRnJhbWVyUGFyYW1zKj4obm9kZS0+dXNlcl9kYXRhKTsKIAogICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dCA9CkBAIC0xODEsOCArMTgxLDggQEAKICAgcmV0dXJuIGtUZkxpdGVPazsKIH0KIAotdm9pZCBSZXNldChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCB2b2lkKiBidWZmZXIpIHsKLSAgUmVzZXRTdGF0ZShzdGF0aWNfY2FzdDxURkxNU2lnbmFsRnJhbWVyUGFyYW1zKj4oYnVmZmVyKSk7Cit2b2lkIEZyYW1lclJlc2V0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIHZvaWQqIGJ1ZmZlcikgeworICBGcmFtZXJSZXNldFN0YXRlKHN0YXRpY19jYXN0PFRGTE1TaWduYWxGcmFtZXJQYXJhbXMqPihidWZmZXIpKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlCkBAIC0xOTAsOCArMTkwLDggQEAKIG5hbWVzcGFjZSB0ZmxtX3NpZ25hbCB7CiAvLyBUT0RPKGIvMjg2MjUwNDczKTogcmVtb3ZlIG5hbWVzcGFjZSBvbmNlIGRlLWR1cGVkIGxpYnJhcmllcyBhYm92ZQogVEZMTVJlZ2lzdHJhdGlvbiogUmVnaXN0ZXJfRlJBTUVSKCkgewotICBzdGF0aWMgVEZMTVJlZ2lzdHJhdGlvbiByID0KLSAgICAgIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoSW5pdCwgUHJlcGFyZSwgRXZhbCwgbnVsbHB0ciwgUmVzZXQpOworICBzdGF0aWMgVEZMTVJlZ2lzdHJhdGlvbiByID0gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcCgKKyAgICAgIEZyYW1lckluaXQsIEZyYW1lclByZXBhcmUsIEZyYW1lckV2YWwsIG51bGxwdHIsIEZyYW1lclJlc2V0KTsKICAgcmV0dXJuICZyOwogfQogfSAgLy8gbmFtZXNwYWNlIHRmbG1fc2lnbmFsCmRpZmYgLS1naXQgYS9zaWduYWwvbWljcm8va2VybmVscy9pcmZmdC5jYyBiL3NpZ25hbC9taWNyby9rZXJuZWxzL2lyZmZ0LmNjCmluZGV4IDZjYjNkN2MuLmIwZDU4ZDUgMTAwNjQ0Ci0tLSBhL3NpZ25hbC9taWNyby9rZXJuZWxzL2lyZmZ0LmNjCisrKyBiL3NpZ25hbC9taWNyby9rZXJuZWxzL2lyZmZ0LmNjCkBAIC01MCw3ICs1MCw3IEBACiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgKCpnZXRfbmVlZGVkX21lbW9yeV9mdW5jKShpbnQzMl90KSwKICAgICAgICAgICB2b2lkKiAoKmluaXRfZnVuYykoaW50MzJfdCwgdm9pZCosIHNpemVfdCk+Ci12b2lkKiBJbml0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgewordm9pZCogSXJmZnRJbml0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgewogICBURkxJVEVfRENIRUNLKGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlciAhPSBudWxscHRyKTsKIAogICBhdXRvKiBwYXJhbXMgPSBzdGF0aWNfY2FzdDxUZkxpdGVBdWRpb0Zyb250ZW5kSXJmZnRQYXJhbXMqPigKQEAgLTc5LDcgKzc5LDcgQEAKIH0KIAogdGVtcGxhdGUgPFRmTGl0ZVR5cGUgVGZMaXRlVHlwZUVudW0+Ci1UZkxpdGVTdGF0dXMgUHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgSXJmZnRQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgTnVtSW5wdXRzKG5vZGUpLCAxKTsKICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgTnVtT3V0cHV0cyhub2RlKSwgMSk7CiAKQEAgLTExMyw3ICsxMTMsNyBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdm9pZCAoKmFwcGx5X2Z1bmMpKHZvaWQqLCBjb25zdCBDb21wbGV4PFQ+KiBpbnB1dCwgVCopPgotVGZMaXRlU3RhdHVzIEV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworVGZMaXRlU3RhdHVzIElyZmZ0RXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIGF1dG8qIHBhcmFtcyA9CiAgICAgICByZWludGVycHJldF9jYXN0PFRmTGl0ZUF1ZGlvRnJvbnRlbmRJcmZmdFBhcmFtcyo+KG5vZGUtPnVzZXJfZGF0YSk7CiAKQEAgLTEzMyw2MSArMTMzLDYxIEBACiAgIHJldHVybiBrVGZMaXRlT2s7CiB9CiAKLXZvaWQqIEluaXRBbGwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogYnVmZmVyLCBzaXplX3QgbGVuZ3RoKSB7Cit2b2lkKiBJcmZmdEluaXRBbGwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogYnVmZmVyLCBzaXplX3QgbGVuZ3RoKSB7CiAgIGNvbnN0IHVpbnQ4X3QqIGJ1ZmZlcl90ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oYnVmZmVyKTsKICAgY29uc3QgZmxleGJ1ZmZlcnM6Ok1hcCYgbSA9IGZsZXhidWZmZXJzOjpHZXRSb290KGJ1ZmZlcl90LCBsZW5ndGgpLkFzTWFwKCk7CiAgIGF1dG8gdGVuc29yX3R5cGUgPSBzdGF0aWNfY2FzdDx0ZmxpdGU6OlRlbnNvclR5cGU+KG1bIlQiXS5Bc0ludDMyKCkpOwogCiAgIHN3aXRjaCAodGVuc29yX3R5cGUpIHsKICAgICBjYXNlIFRlbnNvclR5cGVfSU5UMTY6IHsKLSAgICAgIHJldHVybiBJbml0PGludDE2X3QsIHRmbG1fc2lnbmFsOjpJcmZmdEludDE2R2V0TmVlZGVkTWVtb3J5LAotICAgICAgICAgICAgICAgICAgdGZsbV9zaWduYWw6OklyZmZ0SW50MTZJbml0Pihjb250ZXh0LCBidWZmZXIsIGxlbmd0aCk7CisgICAgICByZXR1cm4gSXJmZnRJbml0PGludDE2X3QsIHRmbG1fc2lnbmFsOjpJcmZmdEludDE2R2V0TmVlZGVkTWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICB0ZmxtX3NpZ25hbDo6SXJmZnRJbnQxNkluaXQ+KGNvbnRleHQsIGJ1ZmZlciwgbGVuZ3RoKTsKICAgICB9CiAgICAgY2FzZSBUZW5zb3JUeXBlX0lOVDMyOiB7Ci0gICAgICByZXR1cm4gSW5pdDxpbnQzMl90LCB0ZmxtX3NpZ25hbDo6SXJmZnRJbnQzMkdldE5lZWRlZE1lbW9yeSwKLSAgICAgICAgICAgICAgICAgIHRmbG1fc2lnbmFsOjpJcmZmdEludDMySW5pdD4oY29udGV4dCwgYnVmZmVyLCBsZW5ndGgpOworICAgICAgcmV0dXJuIElyZmZ0SW5pdDxpbnQzMl90LCB0ZmxtX3NpZ25hbDo6SXJmZnRJbnQzMkdldE5lZWRlZE1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgdGZsbV9zaWduYWw6OklyZmZ0SW50MzJJbml0Pihjb250ZXh0LCBidWZmZXIsIGxlbmd0aCk7CiAgICAgfQogICAgIGNhc2UgVGVuc29yVHlwZV9GTE9BVDMyOiB7Ci0gICAgICByZXR1cm4gSW5pdDxmbG9hdCwgdGZsbV9zaWduYWw6OklyZmZ0RmxvYXRHZXROZWVkZWRNZW1vcnksCi0gICAgICAgICAgICAgICAgICB0ZmxtX3NpZ25hbDo6SXJmZnRGbG9hdEluaXQ+KGNvbnRleHQsIGJ1ZmZlciwgbGVuZ3RoKTsKKyAgICAgIHJldHVybiBJcmZmdEluaXQ8ZmxvYXQsIHRmbG1fc2lnbmFsOjpJcmZmdEZsb2F0R2V0TmVlZGVkTWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgICB0ZmxtX3NpZ25hbDo6SXJmZnRGbG9hdEluaXQ+KGNvbnRleHQsIGJ1ZmZlciwgbGVuZ3RoKTsKICAgICB9CiAgICAgZGVmYXVsdDoKICAgICAgIHJldHVybiBudWxscHRyOwogICB9CiB9CiAKLVRmTGl0ZVN0YXR1cyBQcmVwYXJlQWxsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBJcmZmdFByZXBhcmVBbGwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBhdXRvKiBwYXJhbXMgPQogICAgICAgcmVpbnRlcnByZXRfY2FzdDxUZkxpdGVBdWRpb0Zyb250ZW5kSXJmZnRQYXJhbXMqPihub2RlLT51c2VyX2RhdGEpOwogCiAgIHN3aXRjaCAocGFyYW1zLT5mZnRfdHlwZSkgewogICAgIGNhc2Uga1RmTGl0ZUludDE2OiB7Ci0gICAgICByZXR1cm4gUHJlcGFyZTxrVGZMaXRlSW50MTY+KGNvbnRleHQsIG5vZGUpOworICAgICAgcmV0dXJuIElyZmZ0UHJlcGFyZTxrVGZMaXRlSW50MTY+KGNvbnRleHQsIG5vZGUpOwogICAgIH0KICAgICBjYXNlIGtUZkxpdGVJbnQzMjogewotICAgICAgcmV0dXJuIFByZXBhcmU8a1RmTGl0ZUludDMyPihjb250ZXh0LCBub2RlKTsKKyAgICAgIHJldHVybiBJcmZmdFByZXBhcmU8a1RmTGl0ZUludDMyPihjb250ZXh0LCBub2RlKTsKICAgICB9CiAgICAgY2FzZSBrVGZMaXRlRmxvYXQzMjogewotICAgICAgcmV0dXJuIFByZXBhcmU8a1RmTGl0ZUZsb2F0MzI+KGNvbnRleHQsIG5vZGUpOworICAgICAgcmV0dXJuIElyZmZ0UHJlcGFyZTxrVGZMaXRlRmxvYXQzMj4oY29udGV4dCwgbm9kZSk7CiAgICAgfQogICAgIGRlZmF1bHQ6CiAgICAgICByZXR1cm4ga1RmTGl0ZUVycm9yOwogICB9CiB9CiAKLVRmTGl0ZVN0YXR1cyBFdmFsQWxsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBJcmZmdEV2YWxBbGwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBhdXRvKiBwYXJhbXMgPQogICAgICAgcmVpbnRlcnByZXRfY2FzdDxUZkxpdGVBdWRpb0Zyb250ZW5kSXJmZnRQYXJhbXMqPihub2RlLT51c2VyX2RhdGEpOwogCiAgIHN3aXRjaCAocGFyYW1zLT5mZnRfdHlwZSkgewogICAgIGNhc2Uga1RmTGl0ZUludDE2OiB7Ci0gICAgICByZXR1cm4gRXZhbDxpbnQxNl90LCB0ZmxtX3NpZ25hbDo6SXJmZnRJbnQxNkFwcGx5Pihjb250ZXh0LCBub2RlKTsKKyAgICAgIHJldHVybiBJcmZmdEV2YWw8aW50MTZfdCwgdGZsbV9zaWduYWw6OklyZmZ0SW50MTZBcHBseT4oY29udGV4dCwgbm9kZSk7CiAgICAgfQogICAgIGNhc2Uga1RmTGl0ZUludDMyOiB7Ci0gICAgICByZXR1cm4gRXZhbDxpbnQzMl90LCB0ZmxtX3NpZ25hbDo6SXJmZnRJbnQzMkFwcGx5Pihjb250ZXh0LCBub2RlKTsKKyAgICAgIHJldHVybiBJcmZmdEV2YWw8aW50MzJfdCwgdGZsbV9zaWduYWw6OklyZmZ0SW50MzJBcHBseT4oY29udGV4dCwgbm9kZSk7CiAgICAgfQogICAgIGNhc2Uga1RmTGl0ZUZsb2F0MzI6IHsKLSAgICAgIHJldHVybiBFdmFsPGZsb2F0LCB0ZmxtX3NpZ25hbDo6SXJmZnRGbG9hdEFwcGx5Pihjb250ZXh0LCBub2RlKTsKKyAgICAgIHJldHVybiBJcmZmdEV2YWw8ZmxvYXQsIHRmbG1fc2lnbmFsOjpJcmZmdEZsb2F0QXBwbHk+KGNvbnRleHQsIG5vZGUpOwogICAgIH0KICAgICBkZWZhdWx0OgogICAgICAgcmV0dXJuIGtUZkxpdGVFcnJvcjsKQEAgLTIwMSwyOCArMjAxLDI4IEBACiAKIFRGTE1SZWdpc3RyYXRpb24qIFJlZ2lzdGVyX0lSRkZUKCkgewogICBzdGF0aWMgVEZMTVJlZ2lzdHJhdGlvbiByID0KLSAgICAgIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoSW5pdEFsbCwgUHJlcGFyZUFsbCwgRXZhbEFsbCk7CisgICAgICB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKElyZmZ0SW5pdEFsbCwgSXJmZnRQcmVwYXJlQWxsLCBJcmZmdEV2YWxBbGwpOwogICByZXR1cm4gJnI7CiB9CiAKIFRGTE1SZWdpc3RyYXRpb24qIFJlZ2lzdGVyX0lSRkZUX0ZMT0FUKCkgewogICBzdGF0aWMgVEZMTVJlZ2lzdHJhdGlvbiByID0gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcCgKLSAgICAgIEluaXQ8ZmxvYXQsIElyZmZ0RmxvYXRHZXROZWVkZWRNZW1vcnksIElyZmZ0RmxvYXRJbml0PiwKLSAgICAgIFByZXBhcmU8a1RmTGl0ZUZsb2F0MzI+LCBFdmFsPGZsb2F0LCBJcmZmdEZsb2F0QXBwbHk+KTsKKyAgICAgIElyZmZ0SW5pdDxmbG9hdCwgSXJmZnRGbG9hdEdldE5lZWRlZE1lbW9yeSwgSXJmZnRGbG9hdEluaXQ+LAorICAgICAgSXJmZnRQcmVwYXJlPGtUZkxpdGVGbG9hdDMyPiwgSXJmZnRFdmFsPGZsb2F0LCBJcmZmdEZsb2F0QXBwbHk+KTsKICAgcmV0dXJuICZyOwogfQogCiBURkxNUmVnaXN0cmF0aW9uKiBSZWdpc3Rlcl9JUkZGVF9JTlQxNigpIHsKICAgc3RhdGljIFRGTE1SZWdpc3RyYXRpb24gciA9IHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoCi0gICAgICBJbml0PGludDE2X3QsIElyZmZ0SW50MTZHZXROZWVkZWRNZW1vcnksIElyZmZ0SW50MTZJbml0PiwKLSAgICAgIFByZXBhcmU8a1RmTGl0ZUludDE2PiwgRXZhbDxpbnQxNl90LCBJcmZmdEludDE2QXBwbHk+KTsKKyAgICAgIElyZmZ0SW5pdDxpbnQxNl90LCBJcmZmdEludDE2R2V0TmVlZGVkTWVtb3J5LCBJcmZmdEludDE2SW5pdD4sCisgICAgICBJcmZmdFByZXBhcmU8a1RmTGl0ZUludDE2PiwgSXJmZnRFdmFsPGludDE2X3QsIElyZmZ0SW50MTZBcHBseT4pOwogICByZXR1cm4gJnI7CiB9CiAKIFRGTE1SZWdpc3RyYXRpb24qIFJlZ2lzdGVyX0lSRkZUX0lOVDMyKCkgewogICBzdGF0aWMgVEZMTVJlZ2lzdHJhdGlvbiByID0gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcCgKLSAgICAgIEluaXQ8aW50MzJfdCwgSXJmZnRJbnQzMkdldE5lZWRlZE1lbW9yeSwgSXJmZnRJbnQzMkluaXQ+LAotICAgICAgUHJlcGFyZTxrVGZMaXRlSW50MzI+LCBFdmFsPGludDMyX3QsIElyZmZ0SW50MzJBcHBseT4pOworICAgICAgSXJmZnRJbml0PGludDMyX3QsIElyZmZ0SW50MzJHZXROZWVkZWRNZW1vcnksIElyZmZ0SW50MzJJbml0PiwKKyAgICAgIElyZmZ0UHJlcGFyZTxrVGZMaXRlSW50MzI+LCBJcmZmdEV2YWw8aW50MzJfdCwgSXJmZnRJbnQzMkFwcGx5Pik7CiAgIHJldHVybiAmcjsKIH0KIApkaWZmIC0tZ2l0IGEvc2lnbmFsL21pY3JvL2tlcm5lbHMvb3ZlcmxhcF9hZGQuY2MgYi9zaWduYWwvbWljcm8va2VybmVscy9vdmVybGFwX2FkZC5jYwppbmRleCA4ZGU3NDYzLi5jMzY1Y2Q4IDEwMDY0NAotLS0gYS9zaWduYWwvbWljcm8va2VybmVscy9vdmVybGFwX2FkZC5jYworKysgYi9zaWduYWwvbWljcm8va2VybmVscy9vdmVybGFwX2FkZC5jYwpAQCAtNDgsMTQgKzQ4LDE1IEBACiB9OwogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXZvaWQgUmVzZXRTdGF0ZShURkxNU2lnbmFsT3ZlcmxhcEFkZFBhcmFtczxUPiogcGFyYW1zKSB7Cit2b2lkIE92ZXJsYXBBZGRSZXNldFN0YXRlKFRGTE1TaWduYWxPdmVybGFwQWRkUGFyYW1zPFQ+KiBwYXJhbXMpIHsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMtPm91dGVyX2RpbXM7IGkrKykgewogICAgIG1lbXNldChwYXJhbXMtPnN0YXRlX2J1ZmZlcnNbaV0sIDAsIHNpemVvZihUKSAqIHBhcmFtcy0+ZnJhbWVfc2l6ZSk7CiAgIH0KIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci12b2lkKiBJbml0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgewordm9pZCogT3ZlcmxhcEFkZEluaXQoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCkgewogICBjb25zdCB1aW50OF90KiBidWZmZXJfdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJ1ZmZlcik7CiAKICAgYXV0byogcGFyYW1zID0gc3RhdGljX2Nhc3Q8VEZMTVNpZ25hbE92ZXJsYXBBZGRQYXJhbXM8VD4qPigKQEAgLTczLDcgKzc0LDcgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQsIFRmTGl0ZVR5cGUgVGZMaXRlVHlwZUVudW0+Ci1UZkxpdGVTdGF0dXMgUHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgT3ZlcmxhcEFkZFByZXBhcmUoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBOdW1JbnB1dHMobm9kZSksIDEpOwogICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBOdW1PdXRwdXRzKG5vZGUpLCAxKTsKIApAQCAtMTEyLDcgKzExMyw3IEBACiAgICAgICAgIHN0YXRpY19jYXN0PFQqPihjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIoCiAgICAgICAgICAgICBjb250ZXh0LCBwYXJhbXMtPmZyYW1lX3NpemUgKiBzaXplb2YoVCkpKTsKICAgfQotICBSZXNldFN0YXRlKHBhcmFtcyk7CisgIE92ZXJsYXBBZGRSZXNldFN0YXRlKHBhcmFtcyk7CiAKICAgbWljcm9fY29udGV4dC0+RGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3IoaW5wdXQpOwogICBtaWNyb19jb250ZXh0LT5EZWFsbG9jYXRlVGVtcFRmTGl0ZVRlbnNvcihvdXRwdXQpOwpAQCAtMTIwLDcgKzEyMSw3IEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotVGZMaXRlU3RhdHVzIEV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworVGZMaXRlU3RhdHVzIE92ZXJsYXBBZGRFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgYXV0byogcGFyYW1zID0KICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8VEZMTVNpZ25hbE92ZXJsYXBBZGRQYXJhbXM8VD4qPihub2RlLT51c2VyX2RhdGEpOwogICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dCA9CkBAIC0xNDQsNjkgKzE0NSw3MCBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXZvaWQgUmVzZXQoVGZMaXRlQ29udGV4dCogY29udGV4dCwgdm9pZCogYnVmZmVyKSB7Ci0gIFJlc2V0U3RhdGUoc3RhdGljX2Nhc3Q8VEZMTVNpZ25hbE92ZXJsYXBBZGRQYXJhbXM8VD4qPihidWZmZXIpKTsKK3ZvaWQgT3ZlcmxhcEFkZFJlc2V0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIHZvaWQqIGJ1ZmZlcikgeworICBPdmVybGFwQWRkUmVzZXRTdGF0ZShzdGF0aWNfY2FzdDxURkxNU2lnbmFsT3ZlcmxhcEFkZFBhcmFtczxUPio+KGJ1ZmZlcikpOwogfQogCi12b2lkKiBJbml0QWxsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgewordm9pZCogT3ZlcmxhcEFkZEluaXRBbGwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCkgewogICBjb25zdCB1aW50OF90KiBidWZmZXJfdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJ1ZmZlcik7CiAgIGNvbnN0IGZsZXhidWZmZXJzOjpNYXAmIG0gPSBmbGV4YnVmZmVyczo6R2V0Um9vdChidWZmZXJfdCwgbGVuZ3RoKS5Bc01hcCgpOwogICBhdXRvIHRlbnNvcl90eXBlID0gc3RhdGljX2Nhc3Q8dGZsaXRlOjpUZW5zb3JUeXBlPihtWyJUIl0uQXNJbnQzMigpKTsKIAogICBzd2l0Y2ggKHRlbnNvcl90eXBlKSB7CiAgICAgY2FzZSBUZW5zb3JUeXBlX0lOVDE2OiB7Ci0gICAgICByZXR1cm4gSW5pdDxpbnQxNl90Pihjb250ZXh0LCBidWZmZXIsIGxlbmd0aCk7CisgICAgICByZXR1cm4gT3ZlcmxhcEFkZEluaXQ8aW50MTZfdD4oY29udGV4dCwgYnVmZmVyLCBsZW5ndGgpOwogICAgIH0KICAgICBjYXNlIFRlbnNvclR5cGVfRkxPQVQzMjogewotICAgICAgcmV0dXJuIEluaXQ8ZmxvYXQ+KGNvbnRleHQsIGJ1ZmZlciwgbGVuZ3RoKTsKKyAgICAgIHJldHVybiBPdmVybGFwQWRkSW5pdDxmbG9hdD4oY29udGV4dCwgYnVmZmVyLCBsZW5ndGgpOwogICAgIH0KICAgICBkZWZhdWx0OgogICAgICAgcmV0dXJuIG51bGxwdHI7CiAgIH0KIH0KIAotVGZMaXRlU3RhdHVzIFByZXBhcmVBbGwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworVGZMaXRlU3RhdHVzIE92ZXJsYXBBZGRQcmVwYXJlQWxsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgYXV0byogcGFyYW1zID0KICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8VEZMTVNpZ25hbE92ZXJsYXBBZGRQYXJhbXM8dm9pZD4qPihub2RlLT51c2VyX2RhdGEpOwogCiAgIHN3aXRjaCAocGFyYW1zLT50eXBlKSB7CiAgICAgY2FzZSBrVGZMaXRlSW50MTY6IHsKLSAgICAgIHJldHVybiBQcmVwYXJlPGludDE2X3QsIGtUZkxpdGVJbnQxNj4oY29udGV4dCwgbm9kZSk7CisgICAgICByZXR1cm4gT3ZlcmxhcEFkZFByZXBhcmU8aW50MTZfdCwga1RmTGl0ZUludDE2Pihjb250ZXh0LCBub2RlKTsKICAgICB9CiAgICAgY2FzZSBrVGZMaXRlRmxvYXQzMjogewotICAgICAgcmV0dXJuIFByZXBhcmU8ZmxvYXQsIGtUZkxpdGVGbG9hdDMyPihjb250ZXh0LCBub2RlKTsKKyAgICAgIHJldHVybiBPdmVybGFwQWRkUHJlcGFyZTxmbG9hdCwga1RmTGl0ZUZsb2F0MzI+KGNvbnRleHQsIG5vZGUpOwogICAgIH0KICAgICBkZWZhdWx0OgogICAgICAgcmV0dXJuIGtUZkxpdGVFcnJvcjsKICAgfQogfQogCi1UZkxpdGVTdGF0dXMgRXZhbEFsbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgT3ZlcmxhcEFkZEV2YWxBbGwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBhdXRvKiBwYXJhbXMgPQogICAgICAgcmVpbnRlcnByZXRfY2FzdDxURkxNU2lnbmFsT3ZlcmxhcEFkZFBhcmFtczx2b2lkPio+KG5vZGUtPnVzZXJfZGF0YSk7CiAKICAgc3dpdGNoIChwYXJhbXMtPnR5cGUpIHsKICAgICBjYXNlIGtUZkxpdGVJbnQxNjogewotICAgICAgcmV0dXJuIEV2YWw8aW50MTZfdD4oY29udGV4dCwgbm9kZSk7CisgICAgICByZXR1cm4gT3ZlcmxhcEFkZEV2YWw8aW50MTZfdD4oY29udGV4dCwgbm9kZSk7CiAgICAgfQogICAgIGNhc2Uga1RmTGl0ZUZsb2F0MzI6IHsKLSAgICAgIHJldHVybiBFdmFsPGZsb2F0Pihjb250ZXh0LCBub2RlKTsKKyAgICAgIHJldHVybiBPdmVybGFwQWRkRXZhbDxmbG9hdD4oY29udGV4dCwgbm9kZSk7CiAgICAgfQogICAgIGRlZmF1bHQ6CiAgICAgICByZXR1cm4ga1RmTGl0ZUVycm9yOwogICB9CiB9CiAKLXZvaWQgUmVzZXRBbGwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgdm9pZCogYnVmZmVyKSB7Cit2b2lkIE92ZXJsYXBBZGRSZXNldEFsbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCB2b2lkKiBidWZmZXIpIHsKICAgYXV0byogcGFyYW1zID0gcmVpbnRlcnByZXRfY2FzdDxURkxNU2lnbmFsT3ZlcmxhcEFkZFBhcmFtczx2b2lkPio+KGJ1ZmZlcik7CiAKICAgc3dpdGNoIChwYXJhbXMtPnR5cGUpIHsKICAgICBjYXNlIGtUZkxpdGVJbnQxNjogewotICAgICAgUmVzZXQ8aW50MTZfdD4oY29udGV4dCwgYnVmZmVyKTsKKyAgICAgIE92ZXJsYXBBZGRSZXNldDxpbnQxNl90Pihjb250ZXh0LCBidWZmZXIpOwogICAgICAgYnJlYWs7CiAgICAgfQogICAgIGNhc2Uga1RmTGl0ZUZsb2F0MzI6IHsKLSAgICAgIFJlc2V0PGZsb2F0Pihjb250ZXh0LCBidWZmZXIpOworICAgICAgT3ZlcmxhcEFkZFJlc2V0PGZsb2F0Pihjb250ZXh0LCBidWZmZXIpOwogICAgICAgYnJlYWs7CiAgICAgfQogICAgIGRlZmF1bHQ6CkBAIC0yMTgsMjIgKzIyMCwyMyBAQAogCiBuYW1lc3BhY2UgdGZsbV9zaWduYWwgewogVEZMTVJlZ2lzdHJhdGlvbiogUmVnaXN0ZXJfT1ZFUkxBUF9BREQoKSB7Ci0gIHN0YXRpYyBURkxNUmVnaXN0cmF0aW9uIHIgPSB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKAotICAgICAgSW5pdEFsbCwgUHJlcGFyZUFsbCwgRXZhbEFsbCwgbnVsbHB0ciwgUmVzZXRBbGwpOworICBzdGF0aWMgVEZMTVJlZ2lzdHJhdGlvbiByID0KKyAgICAgIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoT3ZlcmxhcEFkZEluaXRBbGwsIE92ZXJsYXBBZGRQcmVwYXJlQWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVybGFwQWRkRXZhbEFsbCwgbnVsbHB0ciwgT3ZlcmxhcEFkZFJlc2V0QWxsKTsKICAgcmV0dXJuICZyOwogfQogCiBURkxNUmVnaXN0cmF0aW9uKiBSZWdpc3Rlcl9PVkVSTEFQX0FERF9GTE9BVCgpIHsKLSAgc3RhdGljIFRGTE1SZWdpc3RyYXRpb24gciA9Ci0gICAgICB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKEluaXQ8ZmxvYXQ+LCBQcmVwYXJlPGZsb2F0LCBrVGZMaXRlRmxvYXQzMj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2YWw8ZmxvYXQ+LCBudWxscHRyLCBSZXNldDxmbG9hdD4pOworICBzdGF0aWMgVEZMTVJlZ2lzdHJhdGlvbiByID0gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcCgKKyAgICAgIE92ZXJsYXBBZGRJbml0PGZsb2F0PiwgT3ZlcmxhcEFkZFByZXBhcmU8ZmxvYXQsIGtUZkxpdGVGbG9hdDMyPiwKKyAgICAgIE92ZXJsYXBBZGRFdmFsPGZsb2F0PiwgbnVsbHB0ciwgT3ZlcmxhcEFkZFJlc2V0PGZsb2F0Pik7CiAgIHJldHVybiAmcjsKIH0KIAogVEZMTVJlZ2lzdHJhdGlvbiogUmVnaXN0ZXJfT1ZFUkxBUF9BRERfSU5UMTYoKSB7Ci0gIHN0YXRpYyBURkxNUmVnaXN0cmF0aW9uIHIgPQotICAgICAgdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChJbml0PGludDE2X3Q+LCBQcmVwYXJlPGludDE2X3QsIGtUZkxpdGVJbnQxNj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2YWw8aW50MTZfdD4sIG51bGxwdHIsIFJlc2V0PGludDE2X3Q+KTsKKyAgc3RhdGljIFRGTE1SZWdpc3RyYXRpb24gciA9IHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoCisgICAgICBPdmVybGFwQWRkSW5pdDxpbnQxNl90PiwgT3ZlcmxhcEFkZFByZXBhcmU8aW50MTZfdCwga1RmTGl0ZUludDE2PiwKKyAgICAgIE92ZXJsYXBBZGRFdmFsPGludDE2X3Q+LCBudWxscHRyLCBPdmVybGFwQWRkUmVzZXQ8aW50MTZfdD4pOwogICByZXR1cm4gJnI7CiB9CiB9ICAvLyBuYW1lc3BhY2UgdGZsbV9zaWduYWwKZGlmZiAtLWdpdCBhL3NpZ25hbC9taWNyby9rZXJuZWxzL3BjYW4uY2MgYi9zaWduYWwvbWljcm8va2VybmVscy9wY2FuLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NzNlMWIKLS0tIC9kZXYvbnVsbAorKysgYi9zaWduYWwvbWljcm8va2VybmVscy9wY2FuLmNjCkBAIC0wLDAgKzEsMTM1IEBACisvKiBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSAic2lnbmFsL3NyYy9wY2FuX2FyZ2NfZml4ZWQuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC90ZW5zb3JfY3R5cGVzLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMva2VybmVsX3V0aWwuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZmxhdGJ1ZmZlcl91dGlscy5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2tlcm5lbF91dGlsLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21lbW9yeV9oZWxwZXJzLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2NvbnRleHQuaCIKKworbmFtZXNwYWNlIHRmbGl0ZSB7CituYW1lc3BhY2UgdGZsbV9zaWduYWwgeworLy8gVE9ETyhiLzI4NjI1MDQ3Myk6IHJlbW92ZSBuYW1lc3BhY2Ugb25jZSBkZS1kdXBlZCBsaWJyYXJpZXMgYWJvdmUKKworY29uc3RleHByIGludCBrSW5wdXRUZW5zb3IgPSAwOworY29uc3RleHByIGludCBrTm9pc2VFc3RpbWF0ZVRlbnNvciA9IDE7Citjb25zdGV4cHIgaW50IGtHYWluTHV0VGVuc29yID0gMjsKK2NvbnN0ZXhwciBpbnQga091dHB1dFRlbnNvciA9IDA7CisKKy8vIEluZGljZXMgaW50byB0aGUgaW5pdCBmbGV4YnVmZmVyJ3MgdmVjdG9yLgorLy8gVGhlIHBhcmFtZXRlcidzIG5hbWUgaXMgaW4gdGhlIGNvbW1lbnQgdGhhdCBmb2xsb3dzLgorLy8gRWxlbWVudHMgaW4gdGhlIHZlY3RvcnMgYXJlIG9yZGVyZWQgYWxwaGFiZXRpY2FsbHkgYnkgcGFyYW1ldGVyIG5hbWUuCitjb25zdGV4cHIgaW50IGtTbnJTaGlmdEluZGV4ID0gMDsgIC8vICdzbnJfc2hpZnQnCisKK3N0cnVjdCBUZkxpdGVQY2FuUGFyYW1zIHsKKyAgaW50IHNucl9zaGlmdDsKK307CisKK3ZvaWQqIFBjYW5Jbml0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgeworICBhdXRvKiBwYXJhbXMgPSBzdGF0aWNfY2FzdDxUZkxpdGVQY2FuUGFyYW1zKj4oCisgICAgICBjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIoY29udGV4dCwgc2l6ZW9mKFRmTGl0ZVBjYW5QYXJhbXMpKSk7CisKKyAgdGZsaXRlOjpGbGV4YnVmZmVyV3JhcHBlciBmYncocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoKTsKKyAgcGFyYW1zLT5zbnJfc2hpZnQgPSBmYncuRWxlbWVudEFzSW50MzIoa1NuclNoaWZ0SW5kZXgpOworICByZXR1cm4gcGFyYW1zOworfQorCitUZkxpdGVTdGF0dXMgUGNhblByZXBhcmUoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBOdW1JbnB1dHMobm9kZSksIDMpOworICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBOdW1PdXRwdXRzKG5vZGUpLCAxKTsKKworICBNaWNyb0NvbnRleHQqIG1pY3JvX2NvbnRleHQgPSBHZXRNaWNyb0NvbnRleHQoY29udGV4dCk7CisKKyAgVGZMaXRlVGVuc29yKiBpbnB1dCA9CisgICAgICBtaWNyb19jb250ZXh0LT5BbGxvY2F0ZVRlbXBJbnB1dFRlbnNvcihub2RlLCBrSW5wdXRUZW5zb3IpOworICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCBpbnB1dCAhPSBudWxscHRyKTsKKyAgVGZMaXRlVGVuc29yKiBub2lzZV9lc3RpbWF0ZSA9CisgICAgICBtaWNyb19jb250ZXh0LT5BbGxvY2F0ZVRlbXBJbnB1dFRlbnNvcihub2RlLCBrTm9pc2VFc3RpbWF0ZVRlbnNvcik7CisgIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIG5vaXNlX2VzdGltYXRlICE9IG51bGxwdHIpOworICBUZkxpdGVUZW5zb3IqIGdhaW5fbHV0ID0KKyAgICAgIG1pY3JvX2NvbnRleHQtPkFsbG9jYXRlVGVtcElucHV0VGVuc29yKG5vZGUsIGtHYWluTHV0VGVuc29yKTsKKyAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgZ2Fpbl9sdXQgIT0gbnVsbHB0cik7CisgIFRmTGl0ZVRlbnNvciogb3V0cHV0ID0KKyAgICAgIG1pY3JvX2NvbnRleHQtPkFsbG9jYXRlVGVtcE91dHB1dFRlbnNvcihub2RlLCBrT3V0cHV0VGVuc29yKTsKKyAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgb3V0cHV0ICE9IG51bGxwdHIpOworCisgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bURpbWVuc2lvbnMoaW5wdXQpLCAxKTsKKyAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgTnVtRGltZW5zaW9ucyhub2lzZV9lc3RpbWF0ZSksIDEpOworICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBOdW1EaW1lbnNpb25zKGdhaW5fbHV0KSwgMSk7CisgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bURpbWVuc2lvbnMob3V0cHV0KSwgMSk7CisKKyAgVEZfTElURV9FTlNVUkVfVFlQRVNfRVEoY29udGV4dCwgaW5wdXQtPnR5cGUsIGtUZkxpdGVVSW50MzIpOworICBURl9MSVRFX0VOU1VSRV9UWVBFU19FUShjb250ZXh0LCBub2lzZV9lc3RpbWF0ZS0+dHlwZSwga1RmTGl0ZVVJbnQzMik7CisgIFRGX0xJVEVfRU5TVVJFX1RZUEVTX0VRKGNvbnRleHQsIGdhaW5fbHV0LT50eXBlLCBrVGZMaXRlSW50MTYpOworICBURl9MSVRFX0VOU1VSRV9UWVBFU19FUShjb250ZXh0LCBvdXRwdXQtPnR5cGUsIGtUZkxpdGVVSW50MzIpOworCisgIG1pY3JvX2NvbnRleHQtPkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKGlucHV0KTsKKyAgbWljcm9fY29udGV4dC0+RGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3Iob3V0cHV0KTsKKyAgbWljcm9fY29udGV4dC0+RGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3Iobm9pc2VfZXN0aW1hdGUpOworICBtaWNyb19jb250ZXh0LT5EZWFsbG9jYXRlVGVtcFRmTGl0ZVRlbnNvcihnYWluX2x1dCk7CisgIHJldHVybiBrVGZMaXRlT2s7Cit9CisKK1RmTGl0ZVN0YXR1cyBQY2FuRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CisgIGF1dG8qIHBhcmFtcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8VGZMaXRlUGNhblBhcmFtcyo+KG5vZGUtPnVzZXJfZGF0YSk7CisKKyAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXQgPQorICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KGNvbnRleHQsIG5vZGUsIGtJbnB1dFRlbnNvcik7CisgIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIGlucHV0ICE9IG51bGxwdHIpOworICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBub2lzZV9lc3RpbWF0ZSA9CisgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsSW5wdXQoY29udGV4dCwgbm9kZSwga05vaXNlRXN0aW1hdGVUZW5zb3IpOworICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCBub2lzZV9lc3RpbWF0ZSAhPSBudWxscHRyKTsKKyAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogZ2Fpbl9sdXQgPQorICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KGNvbnRleHQsIG5vZGUsIGtHYWluTHV0VGVuc29yKTsKKyAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgZ2Fpbl9sdXQgIT0gbnVsbHB0cik7CisgIFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dCA9CisgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsT3V0cHV0KGNvbnRleHQsIG5vZGUsIGtPdXRwdXRUZW5zb3IpOworICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCBvdXRwdXQgIT0gbnVsbHB0cik7CisKKyAgY29uc3QgdWludDMyX3QqIGlucHV0X2RhdGEgPSB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPHVpbnQzMl90PihpbnB1dCk7CisgIGNvbnN0IHVpbnQzMl90KiBub2lzZV9lc3RpbWF0ZV9kYXRhID0KKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8dWludDMyX3Q+KG5vaXNlX2VzdGltYXRlKTsKKyAgY29uc3QgaW50MTZfdCogZ2Fpbl9sdXRfZGF0YSA9CisgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KGdhaW5fbHV0KTsKKyAgdWludDMyX3QqIG91dHB1dF9kYXRhID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTx1aW50MzJfdD4ob3V0cHV0KTsKKworICBpbnQgbnVtX2NoYW5uZWxzID0gaW5wdXQtPmRpbXMtPmRhdGFbMF07CisKKyAgc2l6ZV90IG91dHB1dF9ieXRlX3NpemU7CisgIFRGX0xJVEVfRU5TVVJFX09LKAorICAgICAgY29udGV4dCwgdGZsaXRlOjpUZkxpdGVFdmFsVGVuc29yQnl0ZUxlbmd0aChvdXRwdXQsICZvdXRwdXRfYnl0ZV9zaXplKSk7CisKKyAgbWVtY3B5KG91dHB1dF9kYXRhLCBpbnB1dF9kYXRhLCBvdXRwdXRfYnl0ZV9zaXplKTsKKworICB0ZmxpdGU6OnRmbG1fc2lnbmFsOjpBcHBseVBjYW5BdXRvR2FpbkNvbnRyb2xGaXhlZCgKKyAgICAgIGdhaW5fbHV0X2RhdGEsIHBhcmFtcy0+c25yX3NoaWZ0LCBub2lzZV9lc3RpbWF0ZV9kYXRhLCBvdXRwdXRfZGF0YSwKKyAgICAgIG51bV9jaGFubmVscyk7CisgIHJldHVybiBrVGZMaXRlT2s7Cit9CisKK1RGTE1SZWdpc3RyYXRpb24qIFJlZ2lzdGVyX1BDQU4oKSB7CisgIHN0YXRpYyBURkxNUmVnaXN0cmF0aW9uIHIgPQorICAgICAgdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChQY2FuSW5pdCwgUGNhblByZXBhcmUsIFBjYW5FdmFsKTsKKyAgcmV0dXJuICZyOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGZsbV9zaWduYWwKK30gIC8vIG5hbWVzcGFjZSB0ZmxpdGUKZGlmZiAtLWdpdCBhL3NpZ25hbC9taWNyby9rZXJuZWxzL3BjYW5fZmxleGJ1ZmZlcnNfZ2VuZXJhdGVkX2RhdGEuY2MgYi9zaWduYWwvbWljcm8va2VybmVscy9wY2FuX2ZsZXhidWZmZXJzX2dlbmVyYXRlZF9kYXRhLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmYzlhOWYKLS0tIC9kZXYvbnVsbAorKysgYi9zaWduYWwvbWljcm8va2VybmVscy9wY2FuX2ZsZXhidWZmZXJzX2dlbmVyYXRlZF9kYXRhLmNjCkBAIC0wLDAgKzEsNyBAQAorI2luY2x1ZGUgInNpZ25hbC9taWNyby9rZXJuZWxzL3BjYW5fZmxleGJ1ZmZlcnNfZ2VuZXJhdGVkX2RhdGEuaCIKKworY29uc3QgaW50IGdfZ2VuX2RhdGFfc2l6ZV9zbnJfc2hpZnRfNl90ZXN0ID0gMjA7Citjb25zdCB1bnNpZ25lZCBjaGFyIGdfZ2VuX2RhdGFfc25yX3NoaWZ0XzZfdGVzdFtdID0geworICAgIDB4NzMsIDB4NmUsIDB4NzIsIDB4NWYsIDB4NzMsIDB4NjgsIDB4NjksIDB4NjYsIDB4NzQsIDB4MDAsCisgICAgMHgwMSwgMHgwYiwgMHgwMSwgMHgwMSwgMHgwMSwgMHgwNiwgMHgwNCwgMHgwMiwgMHgyNCwgMHgwMSwKK307CmRpZmYgLS1naXQgYS9zaWduYWwvbWljcm8va2VybmVscy9wY2FuX2ZsZXhidWZmZXJzX2dlbmVyYXRlZF9kYXRhLmggYi9zaWduYWwvbWljcm8va2VybmVscy9wY2FuX2ZsZXhidWZmZXJzX2dlbmVyYXRlZF9kYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJiNGNkNwotLS0gL2Rldi9udWxsCisrKyBiL3NpZ25hbC9taWNyby9rZXJuZWxzL3BjYW5fZmxleGJ1ZmZlcnNfZ2VuZXJhdGVkX2RhdGEuaApAQCAtMCwwICsxLDcgQEAKKyNpZm5kZWYgU0lHTkFMX01JQ1JPX0tFUk5FTFNfUENBTl9GTEVYQlVGRkVSU19HRU5FUkFURURfREFUQV9IXworI2RlZmluZSBTSUdOQUxfTUlDUk9fS0VSTkVMU19QQ0FOX0ZMRVhCVUZGRVJTX0dFTkVSQVRFRF9EQVRBX0hfCisKK2V4dGVybiBjb25zdCBpbnQgZ19nZW5fZGF0YV9zaXplX3Nucl9zaGlmdF82X3Rlc3Q7CitleHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBnX2dlbl9kYXRhX3Nucl9zaGlmdF82X3Rlc3RbXTsKKworI2VuZGlmICAvLyBTSUdOQUxfTUlDUk9fS0VSTkVMU19QQ0FOX0ZMRVhCVUZGRVJTX0dFTkVSQVRFRF9EQVRBX0hfCmRpZmYgLS1naXQgYS9zaWduYWwvbWljcm8va2VybmVscy9wY2FuX3Rlc3QuY2MgYi9zaWduYWwvbWljcm8va2VybmVscy9wY2FuX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVjYjVkMQotLS0gL2Rldi9udWxsCisrKyBiL3NpZ25hbC9taWNyby9rZXJuZWxzL3BjYW5fdGVzdC5jYwpAQCAtMCwwICsxLDEzMiBAQAorLyogQ29weXJpZ2h0IDIwMjMgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlICJzaWduYWwvbWljcm8va2VybmVscy9wY2FuX2ZsZXhidWZmZXJzX2dlbmVyYXRlZF9kYXRhLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMva2VybmVsX3J1bm5lci5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0X2hlbHBlcnMuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vdGVzdGluZy9taWNyb190ZXN0LmgiCisKK25hbWVzcGFjZSB0ZmxpdGUgeworbmFtZXNwYWNlIHRmbG1fc2lnbmFsIHsKK25hbWVzcGFjZSB7CisKK1RmTGl0ZVN0YXR1cyBUZXN0UENBTihjb25zdCB1bnNpZ25lZCBjaGFyKiBpbml0X2RhdGEsIGludCBpbml0X2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQqIGlucHV0X2RpbXNfZGF0YSwgY29uc3QgdWludDMyX3QqIGlucHV0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgaW50KiBub2lzZV9lc3RpbWF0ZV9kaW1zX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIG5vaXNlX2VzdGltYXRlX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgaW50KiBnYWluX2x1dF9kaW1zX2RhdGEsIGNvbnN0IGludDE2X3QqIGdhaW5fbHV0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgaW50KiBvdXRwdXRfZGltc19kYXRhLCBjb25zdCB1aW50MzJfdCogZ29sZGVuLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBvdXRwdXRfZGF0YSkgeworICBUZkxpdGVJbnRBcnJheSogaW5wdXRfZGltcyA9CisgICAgICA6OnRmbGl0ZTo6dGVzdGluZzo6SW50QXJyYXlGcm9tSW50cyhpbnB1dF9kaW1zX2RhdGEpOworICBUZkxpdGVJbnRBcnJheSogbm9pc2VfZXN0aW1hdGVfZGltcyA9CisgICAgICA6OnRmbGl0ZTo6dGVzdGluZzo6SW50QXJyYXlGcm9tSW50cyhub2lzZV9lc3RpbWF0ZV9kaW1zX2RhdGEpOworICBUZkxpdGVJbnRBcnJheSogZ2Fpbl9sdXRfZGltcyA9CisgICAgICA6OnRmbGl0ZTo6dGVzdGluZzo6SW50QXJyYXlGcm9tSW50cyhnYWluX2x1dF9kaW1zX2RhdGEpOworICBUZkxpdGVJbnRBcnJheSogb3V0cHV0X2RpbXMgPQorICAgICAgOjp0ZmxpdGU6OnRlc3Rpbmc6OkludEFycmF5RnJvbUludHMob3V0cHV0X2RpbXNfZGF0YSk7CisgIGNvbnN0IGludCBvdXRwdXRfbGVuID0gRWxlbWVudENvdW50KCpvdXRwdXRfZGltcyk7CisgIGNvbnN0ZXhwciBpbnQga0lucHV0c1NpemUgPSAzOworICBjb25zdGV4cHIgaW50IGtPdXRwdXRzU2l6ZSA9IDE7CisgIGNvbnN0ZXhwciBpbnQga1RlbnNvcnNTaXplID0ga0lucHV0c1NpemUgKyBrT3V0cHV0c1NpemU7CisgIFRmTGl0ZVRlbnNvciB0ZW5zb3JzW2tUZW5zb3JzU2l6ZV0gPSB7CisgICAgICB0ZmxpdGU6OnRlc3Rpbmc6OkNyZWF0ZVRlbnNvcihpbnB1dF9kYXRhLCBpbnB1dF9kaW1zKSwKKyAgICAgIHRmbGl0ZTo6dGVzdGluZzo6Q3JlYXRlVGVuc29yKG5vaXNlX2VzdGltYXRlX2RhdGEsIG5vaXNlX2VzdGltYXRlX2RpbXMpLAorICAgICAgdGZsaXRlOjp0ZXN0aW5nOjpDcmVhdGVUZW5zb3IoZ2Fpbl9sdXRfZGF0YSwgZ2Fpbl9sdXRfZGltcyksCisgICAgICB0ZmxpdGU6OnRlc3Rpbmc6OkNyZWF0ZVRlbnNvcihvdXRwdXRfZGF0YSwgb3V0cHV0X2RpbXMpLAorICB9OworICBpbnQgaW5wdXRzX2FycmF5X2RhdGFbXSA9IHszLCAwLCAxLCAyfTsKKyAgVGZMaXRlSW50QXJyYXkqIGlucHV0c19hcnJheSA9CisgICAgICA6OnRmbGl0ZTo6dGVzdGluZzo6SW50QXJyYXlGcm9tSW50cyhpbnB1dHNfYXJyYXlfZGF0YSk7CisgIGludCBvdXRwdXRzX2FycmF5X2RhdGFbXSA9IHsxLCAzfTsKKyAgVGZMaXRlSW50QXJyYXkqIG91dHB1dHNfYXJyYXkgPQorICAgICAgOjp0ZmxpdGU6OnRlc3Rpbmc6OkludEFycmF5RnJvbUludHMob3V0cHV0c19hcnJheV9kYXRhKTsKKworICBjb25zdCBURkxNUmVnaXN0cmF0aW9uKiByZWdpc3RyYXRpb24gPSB0ZmxpdGU6OnRmbG1fc2lnbmFsOjpSZWdpc3Rlcl9QQ0FOKCk7CisgIG1pY3JvOjpLZXJuZWxSdW5uZXIgcnVubmVyKCpyZWdpc3RyYXRpb24sIHRlbnNvcnMsIGtUZW5zb3JzU2l6ZSwgaW5wdXRzX2FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzX2FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmJ1aWx0aW5fZGF0YT0qL251bGxwdHIpOworCisgIC8vIFRmTGl0ZSB1c2VzIGEgY2hhciogZm9yIHRoZSByYXcgYnl0ZXMgd2hlcmVhcyBmbGV4YnVmZmVycyB1c2UgYW4gdW5zaWduZWQKKyAgLy8gY2hhciouIFRoaXMgc21hbGwgZGlzY3JlcGFuY3kgcmVzdWx0cyBpbiBjb21waWxlciB3YXJuaW5ncyB1bmxlc3Mgd2UKKyAgLy8gcmVpbnRlcnByZXRfY2FzdCByaWdodCBiZWZvcmUgcGFzc2luZyBpbiB0aGUgZmxleGJ1ZmZlciBieXRlcyB0byB0aGUKKyAgLy8gS2VybmVsUnVubmVyLgorICBUZkxpdGVTdGF0dXMgc3RhdHVzID0gcnVubmVyLkluaXRBbmRQcmVwYXJlKAorICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oaW5pdF9kYXRhKSwgaW5pdF9kYXRhX3NpemUpOworICBpZiAoc3RhdHVzICE9IGtUZkxpdGVPaykgeworICAgIHJldHVybiBzdGF0dXM7CisgIH0KKyAgc3RhdHVzID0gcnVubmVyLkludm9rZSgpOworICBpZiAoc3RhdHVzICE9IGtUZkxpdGVPaykgeworICAgIHJldHVybiBzdGF0dXM7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBvdXRwdXRfbGVuOyArK2kpIHsKKyAgICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUShnb2xkZW5baV0sIG91dHB1dF9kYXRhW2ldKTsKKyAgfQorICByZXR1cm4ga1RmTGl0ZU9rOworfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSB0ZmxtX3NpZ25hbAorfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQorCitURl9MSVRFX01JQ1JPX1RFU1RTX0JFR0lOCisKK1RGX0xJVEVfTUlDUk9fVEVTVChNaXgxUmVmMUNhc2UpIHsKKyAgaW50IGlucHV0X3NoYXBlW10gPSB7MSwgNDB9OworICBpbnQgbm9pc2VfZXN0aW1hdGVfc2hhcGVbXSA9IHsxLCA0MH07CisgIGludCBnYWluX2x1dF9zaGFwZVtdID0gezEsIDEyNX07CisgIGludCBvdXRwdXRfc2hhcGVbXSA9IHsxLCA0MH07CisgIGNvbnN0IHVpbnQzMl90IGlucHV0W10gPSB7Mjg2LCAyOTgsIDMwNSwgMjkxLCAyOTAsIDI3OSwgMjczLCAyNTcsIDI1MCwgMjQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MCwgMjMzLCAyMzQsIDIzMCwgMjIxLCAyMDUsIDE4MywgMTU5LCAxNTYsIDE4OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzksIDI5OCwgMzQ1LCAzNzQsIDM4MCwgMzY5LCAzNTksIDM2NCwgMzcyLCAzNTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAyLCAyNDMsIDE5NCwgMTM1LCA2NCwgIDcyLCAgMTcxLCAyNDUsIDI3NywgMzA0fTsKKyAgY29uc3QgdWludDMyX3Qgbm9pc2VfZXN0aW1hdGVbXSA9IHsKKyAgICAgIDczMTAsIDE4MzA4LCA3Nzk2LCAxNzg3OCwgNzQxMywgMTcxNDEsIDY5NzgsIDE1Nzg5LCA2MzkwLCAxNDc0NSwKKyAgICAgIDYxMzUsIDE0MzE0LCA1OTgxLCAxNDEzMCwgNTY0OSwgMTI1OTQsIDQ2NzcsIDk3NjgsICAzOTg3LCAxMTU1MCwKKyAgICAgIDYxMDksIDE4MzA4LCA4ODE5LCAyMjk3NywgOTcxMywgMjI2NzAsIDkxNzYsIDIyMzYzLCA5NTA5LCAyMTc0OCwKKyAgICAgIDc3MTksIDE0OTI5LCA0OTU5LCA4Mjk0LCAgMTYzNiwgNDQyMywgIDQzNzEsIDE1MDUyLCA3MDgwLCAxODY3N307CisKKyAgY29uc3QgaW50MTZfdCBnYWluX2x1dFtdID0geworICAgICAgMzI2MzYsIDMyNjMzLCAgMzI2MzAsIC02LCAgICAgMCwgICAgIC0yMTU4OSwgMzI2MjQsIC0xMiwgICAgMCwgICAgIC0yMTU4OSwKKyAgICAgIDMyNjEyLCAtMjMsICAgIC0yLCAgICAtMjE1ODksIDMyNTg3LCAtNDgsICAgIDAsICAgICAtMjE1ODksIDMyNTM5LCAtOTYsCisgICAgICAwLCAgICAgLTIxNTg5LCAzMjQ0MywgLTE5MCwgICAwLCAgICAgLTIxNTg5LCAzMjI1MywgLTM3OCwgICA0LCAgICAgLTIxNTg5LAorICAgICAgMzE4NzksIC03MzksICAgMTgsICAgIC0yMTU4OSwgMzExNTgsIC0xNDA5LCAgNjIsICAgIC0yMTU4OSwgMjk4MTEsIC0yNTY3LAorICAgICAgMjAyLCAgIC0yMTU4OSwgMjc0NDYsIC00MzAxLCAgNTYyLCAgIC0yMTU4OSwgMjM3MDcsIC02MjY1LCAgMTIzMCwgIC0yMTU4OSwKKyAgICAgIDE4NjcyLCAtNzQ1OCwgIDE5NTIsICAtMjE1ODksIDEzMTY2LCAtNzAzMCwgIDIyMTIsICAtMjE1ODksIDgzNDgsICAtNTM0MiwKKyAgICAgIDE4NjgsICAtMjE1ODksIDQ4NzQsICAtMzQ1OSwgIDEyODIsICAtMjE1ODksIDI2OTcsICAtMjAyNSwgIDc3NCwgICAtMjE1ODksCisgICAgICAxNDQ2LCAgLTExMjAsICA0MzYsICAgLTIxNTg5LCA3NjIsICAgLTU5NiwgICAyMzIsICAgLTIxNTg5LCAzOTgsICAgLTMxMywKKyAgICAgIDEyMiwgICAtMjE1ODksIDIwNywgICAtMTY0LCAgIDY0LCAgICAtMjE1ODksIDEwNywgICAtODUsICAgIDM0LCAgICAtMjE1ODksCisgICAgICA1NiwgICAgLTQ1LCAgICAxOCwgICAgLTIxNTg5LCAyOSwgICAgLTIyLCAgICA4LCAgICAgLTIxNTg5LCAxNSwgICAgLTEzLAorICAgICAgNiwgICAgIC0yMTU4OSwgOCwgICAgIC04LCAgICAgNCwgICAgIC0yMTU4OSwgNCwgICAgIC0yLCAgICAgMCwgICAgIC0yMTU4OSwKKyAgICAgIDIsICAgICAtMywgICAgIDIsICAgICAtMjE1ODksIDEsICAgICAwLCAgICAgIDAsICAgICAtMjE1ODksIDEsICAgICAtMywKKyAgICAgIDIsICAgICAtMjE1ODksIDAsICAgICAwLCAgICAgIDB9OworCisgIHVpbnQzMl90IG91dHB1dFs0MF07CisgIGNvbnN0IHVpbnQzMl90IGdvbGRlbltdID0gezEzMDEsIDgzNiwgMTM1NCwgODI3LCAxMzEyLCA4MTEsIDEyNjMsIDc3OSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE5MiwgNzUzLCAxMTYwLCA3NDMsIDExNDAsIDczOCwgMTA5NiwgNjk4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NTYsICA2MDcsIDg0NSwgIDY2NywgMTE1NywgODM2LCAxNDYxLCA5MTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1NDYsIDkwOCwgMTQ5NiwgOTA0LCAxNTI3LCA4OTUsIDEzNDYsIDc1OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTk5LCAgNTQ4LCAzNzgsICAzNDQsIDkwOCwgIDc2MSwgMTI3NCwgODQzfTsKKyAgbWVtc2V0KG91dHB1dCwgMCwgc2l6ZW9mKG91dHB1dCkpOworICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUSgKKyAgICAgIGtUZkxpdGVPaywKKyAgICAgIHRmbGl0ZTo6dGZsbV9zaWduYWw6OlRlc3RQQ0FOKAorICAgICAgICAgIGdfZ2VuX2RhdGFfc25yX3NoaWZ0XzZfdGVzdCwgZ19nZW5fZGF0YV9zaXplX3Nucl9zaGlmdF82X3Rlc3QsCisgICAgICAgICAgaW5wdXRfc2hhcGUsIGlucHV0LCBub2lzZV9lc3RpbWF0ZV9zaGFwZSwgbm9pc2VfZXN0aW1hdGUsCisgICAgICAgICAgZ2Fpbl9sdXRfc2hhcGUsIGdhaW5fbHV0LCBvdXRwdXRfc2hhcGUsIGdvbGRlbiwgb3V0cHV0KSk7Cit9CisKK1RGX0xJVEVfTUlDUk9fVEVTVFNfRU5ECmRpZmYgLS1naXQgYS9zaWduYWwvbWljcm8va2VybmVscy9yZmZ0LmNjIGIvc2lnbmFsL21pY3JvL2tlcm5lbHMvcmZmdC5jYwppbmRleCBmY2NjNmViLi5jOTQ3MmIwIDEwMDY0NAotLS0gYS9zaWduYWwvbWljcm8va2VybmVscy9yZmZ0LmNjCisrKyBiL3NpZ25hbC9taWNyby9rZXJuZWxzL3JmZnQuY2MKQEAgLTQ4LDEyICs0OCwxMyBAQAogICBpbnQzMl90IG91dHB1dF9sZW5ndGg7CiAgIFRmTGl0ZVR5cGUgZmZ0X3R5cGU7CiAgIFQqIHdvcmtfYXJlYTsKKyAgaW50IHNjcmF0Y2hfYnVmZmVyX2luZGV4OwogICBpbnQ4X3QqIHN0YXRlOwogfTsKIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCAoKmdldF9uZWVkZWRfbWVtb3J5X2Z1bmMpKGludDMyX3QpLAogICAgICAgICAgIHZvaWQqICgqaW5pdF9mdW5jKShpbnQzMl90LCB2b2lkKiwgc2l6ZV90KT4KLXZvaWQqIEluaXQoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogYnVmZmVyLCBzaXplX3QgbGVuZ3RoKSB7Cit2b2lkKiBSZmZ0SW5pdChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpIHsKICAgVEZMSVRFX0RDSEVDSyhjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIgIT0gbnVsbHB0cik7CiAKICAgY29uc3QgdWludDhfdCogYnVmZmVyX3QgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihidWZmZXIpOwpAQCAtNjUsOSArNjYsNiBAQAogICBwYXJhbXMtPmZmdF9sZW5ndGggPSBmYncuRWxlbWVudEFzSW50MzIoa0ZmdExlbmd0aEluZGV4KTsKICAgcGFyYW1zLT5mZnRfdHlwZSA9IHR5cGVUb1RmTGl0ZVR5cGU8VD4oKTsKIAotICBwYXJhbXMtPndvcmtfYXJlYSA9IHN0YXRpY19jYXN0PFQqPihjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIoCi0gICAgICBjb250ZXh0LCBwYXJhbXMtPmZmdF9sZW5ndGggKiBzaXplb2YoVCkpKTsKLQogICBzaXplX3Qgc3RhdGVfc2l6ZSA9ICgqZ2V0X25lZWRlZF9tZW1vcnlfZnVuYykocGFyYW1zLT5mZnRfbGVuZ3RoKTsKICAgcGFyYW1zLT5zdGF0ZSA9IHN0YXRpY19jYXN0PGludDhfdCo+KAogICAgICAgY29udGV4dC0+QWxsb2NhdGVQZXJzaXN0ZW50QnVmZmVyKGNvbnRleHQsIHN0YXRlX3NpemUgKiBzaXplb2YoaW50OF90KSkpOwpAQCAtNzYsNyArNzQsNyBAQAogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgVGZMaXRlVHlwZSBUZkxpdGVUeXBlRW51bT4KLVRmTGl0ZVN0YXR1cyBQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBSZmZ0UHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bUlucHV0cyhub2RlKSwgMSk7CiAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bU91dHB1dHMobm9kZSksIDEpOwogCkBAIC0xMDMsMTMgKzEwMSwxNSBAQAogICBwYXJhbXMtPm91dHB1dF9sZW5ndGggPQogICAgICAgb3V0cHV0X3NoYXBlLkRpbXMob3V0cHV0X3NoYXBlLkRpbWVuc2lvbnNDb3VudCgpIC0gMSkgLyAyOwogCisgIGNvbnRleHQtPlJlcXVlc3RTY3JhdGNoQnVmZmVySW5BcmVuYShjb250ZXh0LCBwYXJhbXMtPmZmdF9sZW5ndGggKiBzaXplb2YoVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLT5zY3JhdGNoX2J1ZmZlcl9pbmRleCk7CiAgIG1pY3JvX2NvbnRleHQtPkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKGlucHV0KTsKICAgbWljcm9fY29udGV4dC0+RGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3Iob3V0cHV0KTsKICAgcmV0dXJuIGtUZkxpdGVPazsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHZvaWQgKCphcHBseV9mdW5jKSh2b2lkKiwgY29uc3QgVCogaW5wdXQsIENvbXBsZXg8VD4qKT4KLVRmTGl0ZVN0YXR1cyBFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBSZmZ0RXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIGF1dG8qIHBhcmFtcyA9CiAgICAgICByZWludGVycHJldF9jYXN0PFRmTGl0ZUF1ZGlvRnJvbnRlbmRSZmZ0UGFyYW1zPFQ+Kj4obm9kZS0+dXNlcl9kYXRhKTsKIApAQCAtMTIyLDc0ICsxMjIsNzYgQEAKICAgICAgIHRmbGl0ZTo6bWljcm86OkdldEV2YWxPdXRwdXQoY29udGV4dCwgbm9kZSwga091dHB1dFRlbnNvcik7CiAgIENvbXBsZXg8VD4qIG91dHB1dF9kYXRhID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxDb21wbGV4PFQ+PihvdXRwdXQpOwogCisgIFQqIHdvcmtfYXJlYSA9IHN0YXRpY19jYXN0PFQqPigKKyAgICAgIGNvbnRleHQtPkdldFNjcmF0Y2hCdWZmZXIoY29udGV4dCwgcGFyYW1zLT5zY3JhdGNoX2J1ZmZlcl9pbmRleCkpOworCiAgIGZvciAoaW50IGlucHV0X2lkeCA9IDAsIG91dHB1dF9pZHggPSAwOyBpbnB1dF9pZHggPCBwYXJhbXMtPmlucHV0X3NpemU7CiAgICAgICAgaW5wdXRfaWR4ICs9IHBhcmFtcy0+aW5wdXRfbGVuZ3RoLCBvdXRwdXRfaWR4ICs9IHBhcmFtcy0+b3V0cHV0X2xlbmd0aCkgewotICAgIG1lbWNweShwYXJhbXMtPndvcmtfYXJlYSwgJmlucHV0X2RhdGFbaW5wdXRfaWR4XSwKLSAgICAgICAgICAgc2l6ZW9mKFQpICogcGFyYW1zLT5pbnB1dF9sZW5ndGgpOworICAgIG1lbWNweSh3b3JrX2FyZWEsICZpbnB1dF9kYXRhW2lucHV0X2lkeF0sIHNpemVvZihUKSAqIHBhcmFtcy0+aW5wdXRfbGVuZ3RoKTsKICAgICAvLyBaZXJvIHBhZCBpbnB1dCB0byBGRlQgbGVuZ3RoCi0gICAgbWVtc2V0KCZwYXJhbXMtPndvcmtfYXJlYVtwYXJhbXMtPmlucHV0X2xlbmd0aF0sIDAsCisgICAgbWVtc2V0KCZ3b3JrX2FyZWFbcGFyYW1zLT5pbnB1dF9sZW5ndGhdLCAwLAogICAgICAgICAgICBzaXplb2YoVCkgKiAocGFyYW1zLT5mZnRfbGVuZ3RoIC0gcGFyYW1zLT5pbnB1dF9sZW5ndGgpKTsKIAotICAgICgqYXBwbHlfZnVuYykocGFyYW1zLT5zdGF0ZSwgcGFyYW1zLT53b3JrX2FyZWEsICZvdXRwdXRfZGF0YVtvdXRwdXRfaWR4XSk7CisgICAgKCphcHBseV9mdW5jKShwYXJhbXMtPnN0YXRlLCB3b3JrX2FyZWEsICZvdXRwdXRfZGF0YVtvdXRwdXRfaWR4XSk7CiAgIH0KICAgcmV0dXJuIGtUZkxpdGVPazsKIH0KIAotdm9pZCogSW5pdEFsbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpIHsKK3ZvaWQqIFJmZnRJbml0QWxsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgewogICBjb25zdCB1aW50OF90KiBidWZmZXJfdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJ1ZmZlcik7CiAgIGNvbnN0IGZsZXhidWZmZXJzOjpNYXAmIG0gPSBmbGV4YnVmZmVyczo6R2V0Um9vdChidWZmZXJfdCwgbGVuZ3RoKS5Bc01hcCgpOwogICBhdXRvIHRlbnNvcl90eXBlID0gc3RhdGljX2Nhc3Q8dGZsaXRlOjpUZW5zb3JUeXBlPihtWyJUIl0uQXNJbnQzMigpKTsKIAogICBzd2l0Y2ggKHRlbnNvcl90eXBlKSB7CiAgICAgY2FzZSBUZW5zb3JUeXBlX0lOVDE2OiB7Ci0gICAgICByZXR1cm4gSW5pdDxpbnQxNl90LCA6OnRmbG1fc2lnbmFsOjpSZmZ0SW50MTZHZXROZWVkZWRNZW1vcnksCi0gICAgICAgICAgICAgICAgICA6OnRmbG1fc2lnbmFsOjpSZmZ0SW50MTZJbml0Pihjb250ZXh0LCBidWZmZXIsIGxlbmd0aCk7CisgICAgICByZXR1cm4gUmZmdEluaXQ8aW50MTZfdCwgOjp0ZmxtX3NpZ25hbDo6UmZmdEludDE2R2V0TmVlZGVkTWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgIDo6dGZsbV9zaWduYWw6OlJmZnRJbnQxNkluaXQ+KGNvbnRleHQsIGJ1ZmZlciwgbGVuZ3RoKTsKICAgICB9CiAgICAgY2FzZSBUZW5zb3JUeXBlX0lOVDMyOiB7Ci0gICAgICByZXR1cm4gSW5pdDxpbnQzMl90LCA6OnRmbG1fc2lnbmFsOjpSZmZ0SW50MzJHZXROZWVkZWRNZW1vcnksCi0gICAgICAgICAgICAgICAgICA6OnRmbG1fc2lnbmFsOjpSZmZ0SW50MzJJbml0Pihjb250ZXh0LCBidWZmZXIsIGxlbmd0aCk7CisgICAgICByZXR1cm4gUmZmdEluaXQ8aW50MzJfdCwgOjp0ZmxtX3NpZ25hbDo6UmZmdEludDMyR2V0TmVlZGVkTWVtb3J5LAorICAgICAgICAgICAgICAgICAgICAgIDo6dGZsbV9zaWduYWw6OlJmZnRJbnQzMkluaXQ+KGNvbnRleHQsIGJ1ZmZlciwgbGVuZ3RoKTsKICAgICB9CiAgICAgY2FzZSBUZW5zb3JUeXBlX0ZMT0FUMzI6IHsKLSAgICAgIHJldHVybiBJbml0PGZsb2F0LCA6OnRmbG1fc2lnbmFsOjpSZmZ0RmxvYXRHZXROZWVkZWRNZW1vcnksCi0gICAgICAgICAgICAgICAgICA6OnRmbG1fc2lnbmFsOjpSZmZ0RmxvYXRJbml0Pihjb250ZXh0LCBidWZmZXIsIGxlbmd0aCk7CisgICAgICByZXR1cm4gUmZmdEluaXQ8ZmxvYXQsIDo6dGZsbV9zaWduYWw6OlJmZnRGbG9hdEdldE5lZWRlZE1lbW9yeSwKKyAgICAgICAgICAgICAgICAgICAgICA6OnRmbG1fc2lnbmFsOjpSZmZ0RmxvYXRJbml0Pihjb250ZXh0LCBidWZmZXIsIGxlbmd0aCk7CiAgICAgfQogICAgIGRlZmF1bHQ6CiAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgfQogfQogCi1UZkxpdGVTdGF0dXMgUHJlcGFyZUFsbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgUmZmdFByZXBhcmVBbGwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBhdXRvKiBwYXJhbXMgPQogICAgICAgcmVpbnRlcnByZXRfY2FzdDxUZkxpdGVBdWRpb0Zyb250ZW5kUmZmdFBhcmFtczx2b2lkPio+KG5vZGUtPnVzZXJfZGF0YSk7CiAKICAgc3dpdGNoIChwYXJhbXMtPmZmdF90eXBlKSB7CiAgICAgY2FzZSBrVGZMaXRlSW50MTY6IHsKLSAgICAgIHJldHVybiBQcmVwYXJlPGludDE2X3QsIGtUZkxpdGVJbnQxNj4oY29udGV4dCwgbm9kZSk7CisgICAgICByZXR1cm4gUmZmdFByZXBhcmU8aW50MTZfdCwga1RmTGl0ZUludDE2Pihjb250ZXh0LCBub2RlKTsKICAgICB9CiAgICAgY2FzZSBrVGZMaXRlSW50MzI6IHsKLSAgICAgIHJldHVybiBQcmVwYXJlPGludDMyX3QsIGtUZkxpdGVJbnQzMj4oY29udGV4dCwgbm9kZSk7CisgICAgICByZXR1cm4gUmZmdFByZXBhcmU8aW50MzJfdCwga1RmTGl0ZUludDMyPihjb250ZXh0LCBub2RlKTsKICAgICB9CiAgICAgY2FzZSBrVGZMaXRlRmxvYXQzMjogewotICAgICAgcmV0dXJuIFByZXBhcmU8ZmxvYXQsIGtUZkxpdGVGbG9hdDMyPihjb250ZXh0LCBub2RlKTsKKyAgICAgIHJldHVybiBSZmZ0UHJlcGFyZTxmbG9hdCwga1RmTGl0ZUZsb2F0MzI+KGNvbnRleHQsIG5vZGUpOwogICAgIH0KICAgICBkZWZhdWx0OgogICAgICAgcmV0dXJuIGtUZkxpdGVFcnJvcjsKICAgfQogfQogCi1UZkxpdGVTdGF0dXMgRXZhbEFsbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgUmZmdEV2YWxBbGwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBhdXRvKiBwYXJhbXMgPQogICAgICAgcmVpbnRlcnByZXRfY2FzdDxUZkxpdGVBdWRpb0Zyb250ZW5kUmZmdFBhcmFtczx2b2lkPio+KG5vZGUtPnVzZXJfZGF0YSk7CiAKICAgc3dpdGNoIChwYXJhbXMtPmZmdF90eXBlKSB7CiAgICAgY2FzZSBrVGZMaXRlSW50MTY6IHsKLSAgICAgIHJldHVybiBFdmFsPGludDE2X3QsIDo6dGZsbV9zaWduYWw6OlJmZnRJbnQxNkFwcGx5Pihjb250ZXh0LCBub2RlKTsKKyAgICAgIHJldHVybiBSZmZ0RXZhbDxpbnQxNl90LCA6OnRmbG1fc2lnbmFsOjpSZmZ0SW50MTZBcHBseT4oY29udGV4dCwgbm9kZSk7CiAgICAgfQogICAgIGNhc2Uga1RmTGl0ZUludDMyOiB7Ci0gICAgICByZXR1cm4gRXZhbDxpbnQzMl90LCA6OnRmbG1fc2lnbmFsOjpSZmZ0SW50MzJBcHBseT4oY29udGV4dCwgbm9kZSk7CisgICAgICByZXR1cm4gUmZmdEV2YWw8aW50MzJfdCwgOjp0ZmxtX3NpZ25hbDo6UmZmdEludDMyQXBwbHk+KGNvbnRleHQsIG5vZGUpOwogICAgIH0KICAgICBjYXNlIGtUZkxpdGVGbG9hdDMyOiB7Ci0gICAgICByZXR1cm4gRXZhbDxmbG9hdCwgOjp0ZmxtX3NpZ25hbDo6UmZmdEZsb2F0QXBwbHk+KGNvbnRleHQsIG5vZGUpOworICAgICAgcmV0dXJuIFJmZnRFdmFsPGZsb2F0LCA6OnRmbG1fc2lnbmFsOjpSZmZ0RmxvYXRBcHBseT4oY29udGV4dCwgbm9kZSk7CiAgICAgfQogICAgIGRlZmF1bHQ6CiAgICAgICByZXR1cm4ga1RmTGl0ZUVycm9yOwpAQCAtMjAyLDM0ICsyMDQsMzQgQEAKIAogVEZMTVJlZ2lzdHJhdGlvbiogUmVnaXN0ZXJfUkZGVCgpIHsKICAgc3RhdGljIFRGTE1SZWdpc3RyYXRpb24gciA9Ci0gICAgICB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKEluaXRBbGwsIFByZXBhcmVBbGwsIEV2YWxBbGwpOworICAgICAgdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChSZmZ0SW5pdEFsbCwgUmZmdFByZXBhcmVBbGwsIFJmZnRFdmFsQWxsKTsKICAgcmV0dXJuICZyOwogfQogCiBURkxNUmVnaXN0cmF0aW9uKiBSZWdpc3Rlcl9SRkZUX0ZMT0FUKCkgewogICBzdGF0aWMgVEZMTVJlZ2lzdHJhdGlvbiByID0gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcCgKLSAgICAgIEluaXQ8ZmxvYXQsIDo6dGZsbV9zaWduYWw6OlJmZnRGbG9hdEdldE5lZWRlZE1lbW9yeSwKLSAgICAgICAgICAgOjp0ZmxtX3NpZ25hbDo6UmZmdEZsb2F0SW5pdD4sCi0gICAgICBQcmVwYXJlPGZsb2F0LCBrVGZMaXRlRmxvYXQzMj4sCi0gICAgICBFdmFsPGZsb2F0LCA6OnRmbG1fc2lnbmFsOjpSZmZ0RmxvYXRBcHBseT4pOworICAgICAgUmZmdEluaXQ8ZmxvYXQsIDo6dGZsbV9zaWduYWw6OlJmZnRGbG9hdEdldE5lZWRlZE1lbW9yeSwKKyAgICAgICAgICAgICAgIDo6dGZsbV9zaWduYWw6OlJmZnRGbG9hdEluaXQ+LAorICAgICAgUmZmdFByZXBhcmU8ZmxvYXQsIGtUZkxpdGVGbG9hdDMyPiwKKyAgICAgIFJmZnRFdmFsPGZsb2F0LCA6OnRmbG1fc2lnbmFsOjpSZmZ0RmxvYXRBcHBseT4pOwogICByZXR1cm4gJnI7CiB9CiAKIFRGTE1SZWdpc3RyYXRpb24qIFJlZ2lzdGVyX1JGRlRfSU5UMTYoKSB7CiAgIHN0YXRpYyBURkxNUmVnaXN0cmF0aW9uIHIgPSB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKAotICAgICAgSW5pdDxpbnQxNl90LCA6OnRmbG1fc2lnbmFsOjpSZmZ0SW50MTZHZXROZWVkZWRNZW1vcnksCi0gICAgICAgICAgIDo6dGZsbV9zaWduYWw6OlJmZnRJbnQxNkluaXQ+LAotICAgICAgUHJlcGFyZTxpbnQxNl90LCBrVGZMaXRlSW50MTY+LAotICAgICAgRXZhbDxpbnQxNl90LCA6OnRmbG1fc2lnbmFsOjpSZmZ0SW50MTZBcHBseT4pOworICAgICAgUmZmdEluaXQ8aW50MTZfdCwgOjp0ZmxtX3NpZ25hbDo6UmZmdEludDE2R2V0TmVlZGVkTWVtb3J5LAorICAgICAgICAgICAgICAgOjp0ZmxtX3NpZ25hbDo6UmZmdEludDE2SW5pdD4sCisgICAgICBSZmZ0UHJlcGFyZTxpbnQxNl90LCBrVGZMaXRlSW50MTY+LAorICAgICAgUmZmdEV2YWw8aW50MTZfdCwgOjp0ZmxtX3NpZ25hbDo6UmZmdEludDE2QXBwbHk+KTsKICAgcmV0dXJuICZyOwogfQogCiBURkxNUmVnaXN0cmF0aW9uKiBSZWdpc3Rlcl9SRkZUX0lOVDMyKCkgewogICBzdGF0aWMgVEZMTVJlZ2lzdHJhdGlvbiByID0gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcCgKLSAgICAgIEluaXQ8aW50MzJfdCwgOjp0ZmxtX3NpZ25hbDo6UmZmdEludDMyR2V0TmVlZGVkTWVtb3J5LAotICAgICAgICAgICA6OnRmbG1fc2lnbmFsOjpSZmZ0SW50MzJJbml0PiwKLSAgICAgIFByZXBhcmU8aW50MzJfdCwga1RmTGl0ZUludDMyPiwKLSAgICAgIEV2YWw8aW50MzJfdCwgOjp0ZmxtX3NpZ25hbDo6UmZmdEludDMyQXBwbHk+KTsKKyAgICAgIFJmZnRJbml0PGludDMyX3QsIDo6dGZsbV9zaWduYWw6OlJmZnRJbnQzMkdldE5lZWRlZE1lbW9yeSwKKyAgICAgICAgICAgICAgIDo6dGZsbV9zaWduYWw6OlJmZnRJbnQzMkluaXQ+LAorICAgICAgUmZmdFByZXBhcmU8aW50MzJfdCwga1RmTGl0ZUludDMyPiwKKyAgICAgIFJmZnRFdmFsPGludDMyX3QsIDo6dGZsbV9zaWduYWw6OlJmZnRJbnQzMkFwcGx5Pik7CiAgIHJldHVybiAmcjsKIH0KIApkaWZmIC0tZ2l0IGEvc2lnbmFsL21pY3JvL2tlcm5lbHMvc3RhY2tlci5jYyBiL3NpZ25hbC9taWNyby9rZXJuZWxzL3N0YWNrZXIuY2MKaW5kZXggNDJhMmVlNi4uZmMxYTRhMyAxMDA2NDQKLS0tIGEvc2lnbmFsL21pY3JvL2tlcm5lbHMvc3RhY2tlci5jYworKysgYi9zaWduYWwvbWljcm8va2VybmVscy9zdGFja2VyLmNjCkBAIC01Miw3ICs1Miw3IEBACiAgIHRmbG1fc2lnbmFsOjpDaXJjdWxhckJ1ZmZlciogY2lyY3VsYXJfYnVmZmVyOwogfTsKIAotdm9pZCogSW5pdChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpIHsKK3ZvaWQqIFN0YWNrZXJJbml0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgewogICBjb25zdCB1aW50OF90KiBidWZmZXJfdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJ1ZmZlcik7CiAKICAgYXV0byogcGFyYW1zID0KQEAgLTg4LDcgKzg4LDcgQEAKICAgcmV0dXJuIHBhcmFtczsKIH0KIAotVGZMaXRlU3RhdHVzIFByZXBhcmUoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworVGZMaXRlU3RhdHVzIFN0YWNrZXJQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgTnVtSW5wdXRzKG5vZGUpLCAxKTsKICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgTnVtT3V0cHV0cyhub2RlKSwgMik7CiAKQEAgLTExOCw3ICsxMTgsNyBAQAogICByZXR1cm4ga1RmTGl0ZU9rOwogfQogCi1UZkxpdGVTdGF0dXMgRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgU3RhY2tlckV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBhdXRvKiBwYXJhbXMgPSByZWludGVycHJldF9jYXN0PFRGTE1TaWduYWxTdGFja2VyUGFyYW1zKj4obm9kZS0+dXNlcl9kYXRhKTsKICAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgcGFyYW1zICE9IG51bGxwdHIpOwogCkBAIC0xNTcsNyArMTU3LDcgQEAKICAgcmV0dXJuIGtUZkxpdGVPazsKIH0KIAotdm9pZCBSZXNldChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCB2b2lkKiBidWZmZXIpIHsKK3ZvaWQgU3RhY2tlclJlc2V0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIHZvaWQqIGJ1ZmZlcikgewogICBhdXRvKiBwYXJhbXMgPSBzdGF0aWNfY2FzdDxURkxNU2lnbmFsU3RhY2tlclBhcmFtcyo+KGJ1ZmZlcik7CiAgIHRmbG1fc2lnbmFsOjpDaXJjdWxhckJ1ZmZlclJlc2V0KHBhcmFtcy0+Y2lyY3VsYXJfYnVmZmVyKTsKICAgcGFyYW1zLT5zdGFja2VyX2hhc19maXJzdF9mcmFtZSA9IGZhbHNlOwpAQCAtMTY3LDggKzE2Nyw4IEBACiAKIG5hbWVzcGFjZSB0ZmxtX3NpZ25hbCB7CiBURkxNUmVnaXN0cmF0aW9uKiBSZWdpc3Rlcl9TVEFDS0VSKCkgewotICBzdGF0aWMgVEZMTVJlZ2lzdHJhdGlvbiByID0KLSAgICAgIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoSW5pdCwgUHJlcGFyZSwgRXZhbCwgLypGcmVlKi8gbnVsbHB0ciwgUmVzZXQpOworICBzdGF0aWMgVEZMTVJlZ2lzdHJhdGlvbiByID0gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcCgKKyAgICAgIFN0YWNrZXJJbml0LCBTdGFja2VyUHJlcGFyZSwgU3RhY2tlckV2YWwsIC8qRnJlZSovIG51bGxwdHIsIFN0YWNrZXJSZXNldCk7CiAgIHJldHVybiAmcjsKIH0KIH0gIC8vIG5hbWVzcGFjZSB0ZmxtX3NpZ25hbApkaWZmIC0tZ2l0IGEvc2lnbmFsL21pY3JvL2tlcm5lbHMvd2luZG93LmNjIGIvc2lnbmFsL21pY3JvL2tlcm5lbHMvd2luZG93LmNjCmluZGV4IGU4NTA4OTguLmNkOWM0NjIgMTAwNjQ0Ci0tLSBhL3NpZ25hbC9taWNyby9rZXJuZWxzL3dpbmRvdy5jYworKysgYi9zaWduYWwvbWljcm8va2VybmVscy93aW5kb3cuY2MKQEAgLTQxLDcgKzQxLDcgQEAKICAgaW50MzJfdCBpbnB1dF9zaXplOwogfTsKIAotdm9pZCogSW5pdChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpIHsKK3ZvaWQqIFdpbmRvd0luaXQoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogYnVmZmVyLCBzaXplX3QgbGVuZ3RoKSB7CiAgIGNvbnN0IHVpbnQ4X3QqIGJ1ZmZlcl90ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oYnVmZmVyKTsKIAogICBhdXRvKiBwYXJhbXMgPQpAQCAtNTMsNyArNTMsNyBAQAogICByZXR1cm4gcGFyYW1zOwogfQogCi1UZkxpdGVTdGF0dXMgUHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgV2luZG93UHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bUlucHV0cyhub2RlKSwgMik7CiAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bU91dHB1dHMobm9kZSksIDEpOwogCkBAIC04Nyw3ICs4Nyw3IEBACiAgIHJldHVybiBrVGZMaXRlT2s7CiB9CiAKLVRmTGl0ZVN0YXR1cyBFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBXaW5kb3dFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgYXV0byogcGFyYW1zID0gcmVpbnRlcnByZXRfY2FzdDxURkxNU2lnbmFsV2luZG93UGFyYW1zKj4obm9kZS0+dXNlcl9kYXRhKTsKIAogICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dCA9CkBAIC0xMTQsNyArMTE0LDggQEAKIG5hbWVzcGFjZSB0ZmxtX3NpZ25hbCB7CiAKIFRGTE1SZWdpc3RyYXRpb24qIFJlZ2lzdGVyX1dJTkRPVygpIHsKLSAgc3RhdGljIFRGTE1SZWdpc3RyYXRpb24gciA9IHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoSW5pdCwgUHJlcGFyZSwgRXZhbCk7CisgIHN0YXRpYyBURkxNUmVnaXN0cmF0aW9uIHIgPQorICAgICAgdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChXaW5kb3dJbml0LCBXaW5kb3dQcmVwYXJlLCBXaW5kb3dFdmFsKTsKICAgcmV0dXJuICZyOwogfQogCmRpZmYgLS1naXQgYS9zaWduYWwvbWljcm8va2VybmVscy94dGVuc2EvZmZ0X2F1dG9fc2NhbGVfa2VybmVsLmNjIGIvc2lnbmFsL21pY3JvL2tlcm5lbHMveHRlbnNhL2ZmdF9hdXRvX3NjYWxlX2tlcm5lbC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmQ3MzliCi0tLSAvZGV2L251bGwKKysrIGIvc2lnbmFsL21pY3JvL2tlcm5lbHMveHRlbnNhL2ZmdF9hdXRvX3NjYWxlX2tlcm5lbC5jYwpAQCAtMCwwICsxLDEwMyBAQAorLyogQ29weXJpZ2h0IDIwMjMgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlICJzaWduYWwvbWljcm8va2VybmVscy9mZnRfYXV0b19zY2FsZV9rZXJuZWwuaCIKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgInNpZ25hbC9zcmMvZmZ0X2F1dG9fc2NhbGUuaCIKKyNpbmNsdWRlICJzaWduYWwvc3JjL21heF9hYnMuaCIKKyNpbmNsdWRlICJzaWduYWwvc3JjL21zYi5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3RlbnNvcl9jdHlwZXMuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9rZXJuZWxfdXRpbC5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2tlcm5lbF91dGlsLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2NvbnRleHQuaCIKKworI2lmIFhDSEFMX0hBVkVfSElGSTMKKyNpbmNsdWRlIDx4dGVuc2EvdGllL3h0X2hpZmkzLmg+CituYW1lc3BhY2UgeworLy8gSW1wbGVtZW50YXRpb24gZm9yIERTUHMgdGhhdCBzdXBwb3J0IHRoZSBIaWZpMyBJU0EuIEJpdCBleGFjdCB3aXRoIHRoZQorLy8gcG9ydGFibGUgdmVyc2lvbiBiZWxvdy4KK2ludCBYdGVuc2FGZnRBdXRvU2NhbGUoY29uc3QgaW50MTZfdCogaW5wdXQsIGludCBzaXplLCBpbnQxNl90KiBvdXRwdXQpIHsKKyAgY29uc3QgaW50MTZfdCBtYXggPSB0ZmxpdGU6OnRmbG1fc2lnbmFsOjpNYXhBYnMxNihpbnB1dCwgc2l6ZSk7CisgIGludCBzY2FsZV9iaXRzID0gKHNpemVvZihpbnQxNl90KSAqIDgpIC0KKyAgICAgICAgICAgICAgICAgICB0ZmxpdGU6OnRmbG1fc2lnbmFsOjpNb3N0U2lnbmlmaWNhbnRCaXQzMihtYXgpIC0gMTsKKyAgaW50IGk7CisgIGlmIChzY2FsZV9iaXRzID4gMCkgeworICAgIGNvbnN0IGFlX2ludDE2eDQqIGlucHV0XzE2eDRfcHRyID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBhZV9pbnQxNng0Kj4oaW5wdXQpOworICAgIGFlX2ludDE2eDQqIG91dHB1dF8xNng0X3B0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8YWVfaW50MTZ4NCo+KG91dHB1dCk7CisgICAgY29uc3QgaW50IG51bV9pdGVyYXRpb25zID0gKChzaXplICsgMykgPj4gMik7CisgICAgZm9yIChpID0gMDsgaSA8IG51bV9pdGVyYXRpb25zOyArK2kpIHsKKyAgICAgIGFlX2ludDE2eDQgaW5wdXRfMTZ4NDsKKyAgICAgIEFFX0wxNlg0X0lQKGlucHV0XzE2eDQsIGlucHV0XzE2eDRfcHRyLCA4KTsKKyAgICAgIGFlX2YxNng0IGlucHV0X2YxNng0ID0gKnJlaW50ZXJwcmV0X2Nhc3Q8YWVfZjE2eDQqPigmaW5wdXRfMTZ4NCk7CisgICAgICBpbnB1dF9mMTZ4NCA9IEFFX1NMQUExNlMoaW5wdXRfZjE2eDQsIHNjYWxlX2JpdHMpOworICAgICAgaW5wdXRfMTZ4NCA9ICpyZWludGVycHJldF9jYXN0PGFlX2ludDE2eDQqPigmaW5wdXRfZjE2eDQpOworICAgICAgQUVfUzE2WDRfSVAoaW5wdXRfMTZ4NCwgb3V0cHV0XzE2eDRfcHRyLCA4KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgbWVtY3B5KG91dHB1dCwgaW5wdXQsIHNpemUgKiBzaXplb2Yob3V0cHV0WzBdKSk7CisgICAgc2NhbGVfYml0cyA9IDA7CisgIH0KKyAgcmV0dXJuIHNjYWxlX2JpdHM7Cit9Cit9ICAvLyBuYW1lc3BhY2UKKyNlbmRpZgorCituYW1lc3BhY2UgdGZsaXRlIHsKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciBpbnQga0lucHV0VGVuc29yID0gMDsKK2NvbnN0ZXhwciBpbnQga091dHB1dFRlbnNvciA9IDA7Citjb25zdGV4cHIgaW50IGtTY2FsZUJpdFRlbnNvciA9IDE7CisKK1RmTGl0ZVN0YXR1cyBFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKKyAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXQgPQorICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KGNvbnRleHQsIG5vZGUsIGtJbnB1dFRlbnNvcik7CisgIFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dCA9CisgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsT3V0cHV0KGNvbnRleHQsIG5vZGUsIGtPdXRwdXRUZW5zb3IpOworICBUZkxpdGVFdmFsVGVuc29yKiBzY2FsZV9iaXQgPQorICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbE91dHB1dChjb250ZXh0LCBub2RlLCBrU2NhbGVCaXRUZW5zb3IpOworCisgIGNvbnN0IGludDE2X3QqIGlucHV0X2RhdGEgPSB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KGlucHV0KTsKKyAgaW50MTZfdCogb3V0cHV0X2RhdGEgPSB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KG91dHB1dCk7CisgIGludDMyX3QqIHNjYWxlX2JpdF9kYXRhID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQzMl90PihzY2FsZV9iaXQpOworCisjaWYgWENIQUxfSEFWRV9ISUZJMworICAqc2NhbGVfYml0X2RhdGEgPQorICAgICAgWHRlbnNhRmZ0QXV0b1NjYWxlKGlucHV0X2RhdGEsIG91dHB1dC0+ZGltcy0+ZGF0YVswXSwgb3V0cHV0X2RhdGEpOworI2Vsc2UKKyAgKnNjYWxlX2JpdF9kYXRhID0KKyAgICAgIHRmbG1fc2lnbmFsOjpGZnRBdXRvU2NhbGUoaW5wdXRfZGF0YSwgb3V0cHV0LT5kaW1zLT5kYXRhWzBdLCBvdXRwdXRfZGF0YSk7CisjZW5kaWYKKyAgcmV0dXJuIGtUZkxpdGVPazsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIFRPRE8oYi8yODYyNTA0NzMpOiByZW1vdmUgbmFtZXNwYWNlIG9uY2UgZGUtZHVwZWQgbGlicmFyaWVzCituYW1lc3BhY2UgdGZsbV9zaWduYWwgeworCitURkxNUmVnaXN0cmF0aW9uKiBSZWdpc3Rlcl9GRlRfQVVUT19TQ0FMRSgpIHsKKyAgc3RhdGljIFRGTE1SZWdpc3RyYXRpb24gciA9CisgICAgICB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKG51bGxwdHIsIEZmdEF1dG9TY2FsZVByZXBhcmUsIEV2YWwpOworICByZXR1cm4gJnI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZmxtX3NpZ25hbAorfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvc2lnbmFsL21pY3JvL2tlcm5lbHMveHRlbnNhL2ZpbHRlcl9iYW5rX3NxdWFyZV9yb290LmNjIGIvc2lnbmFsL21pY3JvL2tlcm5lbHMveHRlbnNhL2ZpbHRlcl9iYW5rX3NxdWFyZV9yb290LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZTQxMTkKLS0tIC9kZXYvbnVsbAorKysgYi9zaWduYWwvbWljcm8va2VybmVscy94dGVuc2EvZmlsdGVyX2Jhbmtfc3F1YXJlX3Jvb3QuY2MKQEAgLTAsMCArMSw3MiBAQAorLyogQ29weXJpZ2h0IDIwMjMgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlICJzaWduYWwvbWljcm8va2VybmVscy9maWx0ZXJfYmFua19zcXVhcmVfcm9vdC5oIgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC90ZW5zb3JfY3R5cGVzLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMva2VybmVsX3V0aWwuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9rZXJuZWxfdXRpbC5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9tZW1vcnlfaGVscGVycy5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb191dGlscy5oIgorCisvLyBEZWZpbmVkIGluIHNxdWFyZV9yb290LlMKK2V4dGVybiAiQyIgdWludDMyX3QgeHRlbnNhX3NxcnRfNjQoY29uc3QgdWludDY0X3QgbnVtKTsKKworbmFtZXNwYWNlIHRmbGl0ZSB7CituYW1lc3BhY2UgeworCitjb25zdGV4cHIgaW50IGtJbnB1dFRlbnNvciA9IDA7Citjb25zdGV4cHIgaW50IGtTY2FsZUJpdHNUZW5zb3IgPSAxOworY29uc3RleHByIGludCBrT3V0cHV0VGVuc29yID0gMDsKKwordm9pZCBBcHBseUZpbHRlcmJhbmtTcXJ0KGNvbnN0IHVpbnQ2NF90KiBpbnB1dCwgaW50IG51bV9jaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2NhbGVfZG93bl9iaXRzLCB1aW50MzJfdCogb3V0cHV0KSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2NoYW5uZWxzOyArK2kpIHsKKyAgICBvdXRwdXRbaV0gPSB4dGVuc2Ffc3FydF82NChpbnB1dFtpXSkgPj4gc2NhbGVfZG93bl9iaXRzOworICB9Cit9CisKK1RmTGl0ZVN0YXR1cyBFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKKyAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXQgPQorICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KGNvbnRleHQsIG5vZGUsIGtJbnB1dFRlbnNvcik7CisgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIHNjYWxlX2JpdHMgPQorICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KGNvbnRleHQsIG5vZGUsIGtTY2FsZUJpdHNUZW5zb3IpOworICBUZkxpdGVFdmFsVGVuc29yKiBvdXRwdXQgPQorICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbE91dHB1dChjb250ZXh0LCBub2RlLCBrT3V0cHV0VGVuc29yKTsKKworICBjb25zdCB1aW50NjRfdCogaW5wdXRfZGF0YSA9IHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8dWludDY0X3Q+KGlucHV0KTsKKyAgY29uc3QgaW50MzJfdCogc2NhbGVfYml0c19kYXRhID0KKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50MzJfdD4oc2NhbGVfYml0cyk7CisgIHVpbnQzMl90KiBvdXRwdXRfZGF0YSA9IHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8dWludDMyX3Q+KG91dHB1dCk7CisgIGludDMyX3QgbnVtX2NoYW5uZWxzID0gaW5wdXQtPmRpbXMtPmRhdGFbMF07CisgIEFwcGx5RmlsdGVyYmFua1NxcnQoaW5wdXRfZGF0YSwgbnVtX2NoYW5uZWxzLCAqc2NhbGVfYml0c19kYXRhLCBvdXRwdXRfZGF0YSk7CisgIHJldHVybiBrVGZMaXRlT2s7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgdGZsbV9zaWduYWwgeworCitURkxNUmVnaXN0cmF0aW9uKiBSZWdpc3Rlcl9GSUxURVJfQkFOS19TUVVBUkVfUk9PVCgpIHsKKyAgc3RhdGljIFRGTE1SZWdpc3RyYXRpb24gciA9CisgICAgICB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKG51bGxwdHIsIEZpbHRlckJhbmtTcXVhcmVSb290UHJlcGFyZSwgRXZhbCk7CisgIHJldHVybiAmcjsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRmbG1fc2lnbmFsCisKK30gIC8vIG5hbWVzcGFjZSB0ZmxpdGUKZGlmZiAtLWdpdCBhL3NpZ25hbC9taWNyby9rZXJuZWxzL3h0ZW5zYS94dGVuc2Ffc3F1YXJlX3Jvb3QuUyBiL3NpZ25hbC9taWNyby9rZXJuZWxzL3h0ZW5zYS94dGVuc2Ffc3F1YXJlX3Jvb3QuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTRkNzJmCi0tLSAvZGV2L251bGwKKysrIGIvc2lnbmFsL21pY3JvL2tlcm5lbHMveHRlbnNhL3h0ZW5zYV9zcXVhcmVfcm9vdC5TCkBAIC0wLDAgKzEsNDAwIEBACisvKiBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLnNlY3Rpb24gLm5vdGUuR05VLXN0YWNrLCIiLEBwcm9nYml0cworCisjaW5jbHVkZSAieHRlbnNhL2NvbmZpZy9jb3JlLWlzYS5oIgorCisjaWZkZWYgX19YVEVOU0FfQ0FMTDBfQUJJX18KKyNkZWZpbmUgTk9fUkVHSVNURVJfV0lORE9XICgxKQorI2VuZGlmCisKKyNpZiBYQ0hBTF9IQVZFX1dJTkRPV0VEID09IDAKKyNkZWZpbmUgTk9fUkVHSVNURVJfV0lORE9XCisjZW5kaWYKKworLy8gU2luY2UgdGhlIDY0IGJpdCBzcXJ0IGp1bXBzIGludG8gdGhlIG1pZGRsZSBvZiB0aGUgMzIgYml0IHNxcnQgdW5kZXIgY2VydGFpbgorLy8gY29uZGl0aW9ucywgYm90aCBmdW5jdGlvbnMgc2hvdWxkIHJlc2VydmUgdGhlIHNhbWUgYW1vdW50IG9mIHN0YWNrIHNwYWNlLgorI2RlZmluZSBYVEVOU0FfU1FSVF9TVEFDS19TSVpFIDMyCisKKy50ZXh0CisudHlwZSB4dGVuc2Ffc3FydF82NCwgQGZ1bmN0aW9uCisuYWxpZ24gNAorLmdsb2JhbCB4dGVuc2Ffc3FydF82NAorCisvLyBNYWtlIG1hY3JvcyBmb3Igb3VyIDY0IGJpdCBmdW5jdGlvbnMsIHNpbmNlIHdlIGRvbid0IGhhdmUgYSBjYXJyeS9ib3Jyb3cgYml0CisvLyBpbiB0aGUgYmFzZSBJU0EsIHRoZXNlIHRha2UgdXAgd2F5IG1vcmUgY3ljbGVzIHRoYW4gdGhleSBzaG91bGQuIFRoZXNlIGFyZQorLy8gdGhlICJwcmVmZXJyZWQgaW5zdHJ1Y3Rpb24gaWRpb21zIiBmcm9tIDguOS4yIG9mIHRoZSBiYXNlIElTQSBtYW51YWwuIFNpbmNlCisvLyB0aGVzZSBtYWNyb3MgZGVmaW5lIGEganVtcCAoYW5kIEkgY291bGRuJ3QgZmluZCBhIHdheSB0byBiZSBjbGV2ZXIgYW5kIHVzZQorLy8gc29tZXRoaW5nIGxpa2UgX19MSU5FX18vX19GSUxFX18gdG8gZGVmaW5lIHRoZXNlIGF1dG9tYXRpY2FsbHksIHlvdSBtYXkgYWxzbworLy8gaGF2ZSB0byBwcm92aWRlIGFuICdvcG5hbWUnIHRoYXQgY29udGFpbnMgYSB1bmlxdWUgc3RyaW5nIHRvIGRlZmluZSBhIGxhYmVsCisvLyBmb3IgdGhlIG1hY3JvLgorCisvLyBkZXN0IG11c3Qgbm90IGJlIHRoZSBzYW1lIGFzIG51bTIsIG9yIHRoaXMgZnVuY3Rpb24gd2lsbCBub3Qgd29yayEKKyNkZWZpbmUgQUREXzY0KGRlc3QsIG51bTEsIG51bTIsIG9wbmFtZSkgXAorICBhZGQubiBkZXN0IyNfbG93LCBudW0xIyNfbG93LCBudW0yIyNfbG93OyBcCisgIGFkZC5uIGRlc3QjI19oaWdoLCBudW0xIyNfaGlnaCwgbnVtMiMjX2hpZ2g7IFwKKyAgYmdldSBkZXN0IyNfbG93LCBudW0yIyNfbG93LCAuYWRkXzY0X2p1bXBfIyNvcG5hbWU7IFwKKyAgYWRkaS5uIGRlc3QjI19oaWdoLCBkZXN0IyNfaGlnaCwgMTsgXAorICAuYWRkXzY0X2p1bXBfIyNvcG5hbWU6CisKKy8vIEFsbCB0aHJlZSByZWdpc3RlcnMgbXVzdCBiZSB1bmlxdWUsIG9yIHRoaXMgZnVuY3Rpb24gd2lsbCBub3Qgd29yayEKKyNkZWZpbmUgU1VCXzY0KGRlc3QsIG51bTEsIG51bTIsIG9wbmFtZSkgXAorICBzdWIgZGVzdCMjX2xvdywgbnVtMSMjX2xvdywgbnVtMiMjX2xvdzsgXAorICBzdWIgZGVzdCMjX2hpZ2gsIG51bTEjI19oaWdoLCBudW0yIyNfaGlnaDsgXAorICBiZ2V1IG51bTEjI19sb3csIG51bTIjI19sb3csIC5zdWJfNjRfanVtcF8jI29wbmFtZTsgXAorICBhZGRpLm4gZGVzdCMjX2hpZ2gsIGRlc3QjI19oaWdoLCAtMTsgXAorICAuc3ViXzY0X2p1bXBfIyNvcG5hbWU6CisKKyNkZWZpbmUgU1JMSV82NChkZXN0LCB2YWwsIGltbSkgXAorICBzbGxpIHNjcmF0Y2g0LCB2YWwjI19oaWdoLCAoMzIgLSBpbW0pOyBcCisgIHNybGkgZGVzdCMjX2hpZ2gsIHZhbCMjX2hpZ2gsIGltbTsgXAorICBzcmxpIGRlc3QjI19sb3csIHZhbCMjX2xvdywgaW1tOyBcCisgIG9yIGRlc3QjI19sb3csIGRlc3QjI19sb3csIHNjcmF0Y2g0OworCisjZGVmaW5lIENPTkRfTU9WXzY0KG9wLCBkZXN0LCB2YWwsIHRlc3QpIFwKKyAgbW92IyNvcCBkZXN0IyNfbG93LCB2YWwjI19sb3csIHRlc3Q7IFwKKyAgbW92IyNvcCBkZXN0IyNfaGlnaCwgdmFsIyNfaGlnaCwgdGVzdAorCisjZGVmaW5lIG51bV9sb3cgYTIKKyNkZWZpbmUgbnVtX2hpZ2ggYTMKKyNkZWZpbmUgYml0X2xvdyBhNAorI2RlZmluZSBiaXRfaGlnaCBhNQorI2RlZmluZSByZXNfbG93IGE2CisjZGVmaW5lIHJlc19oaWdoIGE3CisjZGVmaW5lIHRlbXAxX2xvdyBhOAorI2RlZmluZSB0ZW1wMV9oaWdoIGE5CisjZGVmaW5lIHRlbXAyX2xvdyBhMTAKKyNkZWZpbmUgdGVtcDJfaGlnaCBhMTEKKyNkZWZpbmUgc2NyYXRjaDEgYTEyCisjZGVmaW5lIHNjcmF0Y2gyIGExMworI2RlZmluZSBzY3JhdGNoMyBhMTQKKyNkZWZpbmUgc2NyYXRjaDQgYTE1CisjZGVmaW5lIHRlbXAzX2xvdyBzY3JhdGNoMQorI2RlZmluZSB0ZW1wM19oaWdoIHNjcmF0Y2gyCisKKy5hbGlnbiA0Cit4dGVuc2Ffc3FydF82NDoKKyNpZmRlZiBOT19SRUdJU1RFUl9XSU5ET1cKK2FkZGkubiBhMSwgYTEsIC1YVEVOU0FfU1FSVF9TVEFDS19TSVpFCitzMzJpLm4gYTAsIGExLCA0CitzMzJpLm4gYTExLCBhMSwgOAorczMyaS5uIGExMiwgYTEsIDEyCitzMzJpLm4gYTEzLCBhMSwgMTYKK3MzMmkubiBhMTQsIGExLCAyMAorczMyaS5uIGExNSwgYTEsIDI0CisjZWxzZQorZW50cnkgYTEsIFhURU5TQV9TUVJUX1NUQUNLX1NJWkUKKyNlbmRpZgorLy8gSW4gdGhlIGV2ZW50IHRoYXQgdGhlIHVwcGVyIHdvcmQgb2YgdGhlIG51bWJlciBpcyBhbGwgemVybywgd2UgY2FuIGp1c3QKKy8vIHByZXRlbmQgdGhhdCB3ZSdyZSBkb2luZyBhIDMyIGJpdCBzcXJ0IChidXQgdGhlIHJvdW5kaW5nIGNvbmRpdGlvbiBhdCB0aGUKKy8vIGVuZCBpcyBzbGlnaHRseSBkaWZmZXJlbnQsIHNvIHdlJ3ZlIGdvdCBhIGJpdCBvZiBhbiBhbm9tbHkgdGhlcmUuIFN1Y2ggaXMKKy8vIGxpZmUpCitiZXF6Lm4gbnVtX2hpZ2gsIC54dGVuc2Ffc3FydF8zMl9zdGFydAorLy8gKiogdWludDY0IHJlcz0gMDsKK21vdmkubiByZXNfbG93LCAwCittb3ZpLm4gcmVzX2hpZ2gsIDAKKworbW92aS5uIHNjcmF0Y2gyLCAxCisKKy8vIFNldHVwICdiaXQnIC0gZmlyc3Qgd2UgbmVlZCB0byBrbm93IHdoYXQgYml0IHRvIHNldCBpdCB0by4KKy8vICoqIGludCBtYXhfYml0X251bWJlciA9IDY0IC0gTW9zdFNpZ25pZmljYW50Qml0XzY0KG51bSk7Cittb3ZpLm4gYml0X2xvdywgMAorbnNhdSBzY3JhdGNoMSwgbnVtX2hpZ2gKKworLy8gKiogbWF4X2JpdF9udW1iZXIgfD0gMTsKK29yIHNjcmF0Y2gxLCBzY3JhdGNoMiwgc2NyYXRjaDEKKworLy8gVGhlIGFtbW91bnQgd2Ugc2hpZnQgYnkgaXMgMzEgLSB3aGF0J3MgaW4gc2NyYXRjaDEgZm9yIHRoZSBtYXggYml0IG51bWJlci4KKy8vIFRoaXMgaXMgYmVjYXVzZSB3ZSd2ZSBnb3QgdGhlIHR3byB3b3Jkcywgc28gd2UgY2FuJ3QgZG8gYSA2NCBiaXQgc2hpZnQuCittb3ZpLm4gc2NyYXRjaDMsIDMxCitzdWIgc2NyYXRjaDEsIHNjcmF0Y2gzLCBzY3JhdGNoMQorCisvLyBEbyB0aGUgc2hpZnQKKy8vICoqIHVpbnQzMiBiaXQgPSAxIDw8ICg2MyAtIG1heF9iaXRfbnVtYmVyKTsKK3NzbCBzY3JhdGNoMQorc2xsIGJpdF9oaWdoLCBzY3JhdGNoMgorCisvLyBGaWd1cmUgb3V0IGhvdyBtYW55IGl0ZXJhdGlvbnMgd2UncmUgZ29pbmcgdG8gbmVlZC4gSG93ZXZlciwgd2UgYWxyZWFkeSBoYXZlCisvLyAzMSAtIG1heF9iaXRfbnVtYmVyIGluIHNjcmF0Y2gxLCBzbyBqdXN0IGFkZCAzMiB0byB0aGF0LgorLy8gKiogaW50IGl0ZXJhdGlvbnMgPSAoNjMgLSBtYXhfYml0X251bWJlcikgLyAyICsgMTsKK2FkZGkubiBzY3JhdGNoMSwgc2NyYXRjaDEsIDMyCitzcmxpIHNjcmF0Y2gxLCBzY3JhdGNoMSwgMQorYWRkIHNjcmF0Y2gxLCBzY3JhdGNoMSwgc2NyYXRjaDIKKworLy8gSWYgdGhlIG51bWJlciBvZiBpdGVyYXRpb25zIGlzIGVxdWFsIHRvIDMyLCB0aGlzIG1lYW5zIHRoYXQgd2UncmUgbGlrZWx5IGluCisvLyBhbiBvdmVyZmxvdyBzcG90IGlmIHdlIHRyeSBhbmQgZG8gYSBzdWJ0cmFjdGlvbiAoc2luY2UgdGhlIHVwcGVyIG1vc3QgYml0IGlzCisvLyBnb2luZyB0byBiZSBzZXQgc2luY2UgdGhlIGJpdCBoYWQgdG8gYmUgc2hpZnRlZCB1cCBzbyBoaWdoKS4gV2UgaGF2ZSB0byBkbworLy8gb25lIGl0ZXJhdGlvbiBvZiB0aGUgbG9vcCB3aGVyZSB3ZSB1c2UgdGhlIHBpcGVsaW5lIGRlc3Ryb3lpbmcgYnJhbmNoIGNhbGwKKy8vIHRoYXQgY2FuIGNvbXBhcmUgdHdvIHVuc2lnbmVkIG51bWJlcnMuIElmIHdlIG5lZWQgbGVzcyB0aGFuIDMyIGl0ZXJhdGlvbnMsCisvLyB3ZSBjYW4gc2tpcCB0aGlzIHNsb3cgcGF0aCBhbmQganVtcCB0byB0aGUgdGlnaHQgaW5uZXIgbG9vcC4KK2JsdGkgc2NyYXRjaDEsIDMyLCAueHRlbnNhX3NxcnRfNjRfaW5uZXJfbG9vcF9zdGFydAorCisvLyBDYWNoZSBiaXQgKyByZXMuCitBRERfNjQodGVtcDEsIGJpdCwgcmVzLCB0ZW1wMV9iaXRfcmVzKQorLy8gU2luY2Ugd2UndmUgc3RvcmVkIGEgY29weSBvZiBiaXQgKyByZXMsIHdlIGNhbiByaWdodCBzaGlmdCByZXMgKHNpbmNlIGJvdGgKKy8vIGJyYW5jaGVzIG9mIHRoZSBjb25kaXRpb25hbCBhcmUgZ29pbmcgdG8gbmVlZCBpdCwgb25lIGJyYW5jaCBqdXN0IG5lZWRzIHRvCisvLyBwZXJmb3JtIGFuIGV4dHJhIGFkZGl0aW9uKS4KKy8vICoqIHJlcyA8PD0gMTsKK1NSTElfNjQocmVzLCByZXMsIDEpOworCisvLyAqKiBpZiAobnVtID49IHJlc19wbHVzX2JpdCkgeworYmx0dSBudW1faGlnaCwgdGVtcDFfaGlnaCwgLnh0ZW5zYV9zcXJ0XzY0X2JyYW5jaF9za2lwCitibmUgbnVtX2hpZ2gsIHRlbXAxX2hpZ2gsIC54dGVuc2Ffc3FydF82NF9jb21wYXJpc29uX2ZhaWxlZAorYmx0dSBudW1fbG93LCB0ZW1wMV9sb3csIC54dGVuc2Ffc3FydF82NF9icmFuY2hfc2tpcAorLnh0ZW5zYV9zcXJ0XzY0X2NvbXBhcmlzb25fZmFpbGVkOgorCisvLyAqKiAgIG51bSAtPSByZXMgKyBiaXQ7CitTVUJfNjQodGVtcDIsIG51bSwgdGVtcDEsIHRlbXAyX251bV90ZW1wMV9lYXJseV9icmFuY2gpCisvLyBTaW5jZSB0aGUgc3ViIGNhbid0IHVzZSB0aGUgc2FtZSByZWdpc3RlcnMsIHdlIGhhdmUgdG8gbW92ZSBpdCBiYWNrIHRvIHdoZXJlCisvLyBpdCBiZWxvbmdzLgorbW92Lm4gbnVtX2xvdywgdGVtcDJfbG93Cittb3YubiBudW1faGlnaCwgdGVtcDJfaGlnaAorLy8gKiogICByZXMgKz0gYml0OworQUREXzY0KHJlcywgcmVzLCBiaXQsIHJlc19yZXNfYml0X2Vhcmx5X2JyYW5jaCkKKy8vICoqIH0KKy54dGVuc2Ffc3FydF82NF9icmFuY2hfc2tpcDoKKworLy8gKiogYml0ID4+PSAyOworU1JMSV82NChiaXQsIGJpdCwgMikKKy8vIE1ha2Ugc3VyZSB3ZSBrbm9jayBvZmYgdGhpcyBpdGVyYXRpb24gd2hlbiB3ZSBmYWxsIGludG8gdGhlIGlubmVyIGxvb3AuCitzdWIgc2NyYXRjaDEsIHNjcmF0Y2gxLCBzY3JhdGNoMgorCisueHRlbnNhX3NxcnRfNjRfaW5uZXJfbG9vcF9zdGFydDoKK2xvb3Agc2NyYXRjaDEsIC54dGVuc2Ffc3FydF82NF9yb3VuZAorCisvLyBXZSBkb24ndCBoYXZlIGVub3VnaCByZWdpc3RlcnMgdG8gYmUgYXMgdmVyYm9zZSBhcyB0aGUgMzIgYml0IHZlcnNpb24sIHNvCisvLyB0aGlzIHZlcnNpb24gaXMgbm90IGFzIGVhc3kgdG8gcmVhZC4gSW5zdGVhZCBvZiBoYXZpbmcgdGhlIHR3byBvcGVyYXRpb25zIGluCisvLyB0aGUgc2FtZSBzdHlsZSBvZiBjb25kaXRpb25hbCBtb3ZlLCB3ZSBzb3J0IG9mIGRlY2lkZSB0byBkbyBib3RoIGJyYW5jaGVzIGF0CisvLyB0aGUgc2FtZSB0aW1lIG9mIHRoZSBpZiwgdGhlbiBmaXggdXAgd2hhdCB3YXMgaW5jb3JyZWN0IGF0IHRoZSBlbmQuCitTUkxJXzY0KHRlbXAxLCByZXMsIDEpCitBRERfNjQocmVzLCByZXMsIGJpdCwgcmVzX3Jlc19iaXQpCisKK1NVQl82NCh0ZW1wMiwgbnVtLCByZXMsIG51bV9yZXNfdGVtcDIpCitBRERfNjQocmVzLCB0ZW1wMSwgYml0LCByZXNfdGVtcDFfYml0KQorCitDT05EX01PVl82NChnZXosIG51bSwgdGVtcDIsIHRlbXAyX2hpZ2gpCitDT05EX01PVl82NChsdHosIHJlcywgdGVtcDEsIHRlbXAyX2hpZ2gpCisKKy8vICoqIGJpdCA+Pj0gMjsKK1NSTElfNjQoYml0LCBiaXQsIDIpCisKKy54dGVuc2Ffc3FydF82NF9yb3VuZDoKKworLy8gTmVlZCB0byBkbyBpZiAobnVtID4gcmVzKSB7ICsrcmVzOyB9LCBidXQgd2UnbGwgZG8gaXQgd2l0aCBjb25kaXRpb25hbCBtb3ZlcworLy8gYWdhaW4uIEV4Y2VwdCB3ZSdyZSBnb2luZyB0byBkbyBpdCBzbGlnaHRseSBiYWNrd2FyZHMsIHNpbmNlIHdlIG5lZWQgdG8gbW92ZQorLy8gdGhlIHJlc3VsdCBpbnRvIHRoZSBudW0gcmVnaXN0ZXIgdG8gYmUgcmV0dXJuZWQuIFdlJ2xsIGRvIHRoaXMgYnkgc2V0dGluZworLy8gdGhlIHJldHVybiB2YWx1ZSB0byByZXMgKyAxLCBidXQgaW4gdGhlIGV2ZW50IHRoYXQgaXQgd2FzIGEgbWlzdGFrZSwgd2UnbGwKKy8vIGNvbmRpdGlvbmFsbHkgbW92ZSB0aGUgcmF3IHJlc3VsdCBiYWNrIGludG8gcGxhY2UuCitTVUJfNjQodGVtcDEsIHJlcywgbnVtLCByZXNfbnVtX3RlbXAxKQorYWRkaS5uIG51bV9sb3csIHJlc19sb3csIDEKK21vdmdleiBudW1fbG93LCByZXNfbG93LCB0ZW1wMV9oaWdoCisKKy8vIEJ1dCB3ZSBtYXkgaGF2ZSBvdmVyZmxvd2VkIG51bV9sb3cgLSBzZXQgaXQgYmFjayB0byByZXN1bHRfbG93IGlmIGl0J3MgYmVlbgorLy8gemVyb2VkIG91dC4KK21vdmVxeiBudW1fbG93LCByZXNfbG93LCBudW1fbG93CisKKyNpZmRlZiBOT19SRUdJU1RFUl9XSU5ET1cKK2wzMmkubiBhMCwgYTEsIDQKK2wzMmkubiBhMTEsIGExLCA4CitsMzJpLm4gYTEyLCBhMSwgMTIKK2wzMmkubiBhMTMsIGExLCAxNgorbDMyaS5uIGExNCwgYTEsIDIwCitsMzJpLm4gYTE1LCBhMSwgMjQKK2FkZGkgYTEsIGExLCBYVEVOU0FfU1FSVF9TVEFDS19TSVpFCityZXQubgorI2Vsc2UKK3JldHcubgorI2VuZGlmCisueHRlbnNhX3NxcnRfNjRfZW5kOgorICAuc2l6ZSB4dGVuc2Ffc3FydF82NCwgLiAtIHh0ZW5zYV9zcXJ0XzY0CisKKworI3VuZGVmIEFERF82NAorI3VuZGVmIFNVQl82NAorI3VuZGVmIFNSTElfNjQKKyN1bmRlZiBDT05EX01PVl82NAorCisjdW5kZWYgbnVtX2xvdworI3VuZGVmIG51bV9oaWdoCisjdW5kZWYgYml0X2xvdworI3VuZGVmIGJpdF9oaWdoCisjdW5kZWYgcmVzX2xvdworI3VuZGVmIHJlc19oaWdoCisjdW5kZWYgdGVtcDFfbG93CisjdW5kZWYgdGVtcDFfaGlnaAorI3VuZGVmIHRlbXAyX2xvdworI3VuZGVmIHRlbXAyX2hpZ2gKKyN1bmRlZiBzY3JhdGNoMQorI3VuZGVmIHNjcmF0Y2gyCisjdW5kZWYgc2NyYXRjaDMKKyN1bmRlZiBzY3JhdGNoNAorI3VuZGVmIHRlbXAzX2xvdworI3VuZGVmIHRlbXAzX2hpZ2gKKy50ZXh0CisudHlwZSB4dGVuc2Ffc3FydF8zMiwgQGZ1bmN0aW9uCisuYWxpZ24gNAorLmdsb2JhbCB4dGVuc2Ffc3FydF8zMgorCisvLyBNYWtlIHRoZSBwcm9ncmFtIG1vcmUgcmVhZGFibGUuLi4KKyNkZWZpbmUgbnVtIGEyCisjZGVmaW5lIGJpdCBhNAorI2RlZmluZSByZXMgYTUKKyNkZWZpbmUgb25lIGE2CisjZGVmaW5lIG1heF9iaXRfbnVtYmVyIGE3CisjZGVmaW5lIGl0ZXJhdGlvbnMgbWF4X2JpdF9udW1iZXIKKyNkZWZpbmUgYml0X3BsdXNfcmVzIGE4CisjZGVmaW5lIG51bV9taW51c19iaXRfcGx1c19yZXMgYTkKKyNkZWZpbmUgcmVzX3NoaWZ0X2xlZnRfcGx1c19iaXQgYTEwCisjZGVmaW5lIHJlc19taW51c19udW0gcmVzX3NoaWZ0X2xlZnRfcGx1c19iaXQKKworeHRlbnNhX3NxcnRfMzI6CisjaWZkZWYgTk9fUkVHSVNURVJfV0lORE9XCithZGRpLm4gYTEsIGExLCAtWFRFTlNBX1NRUlRfU1RBQ0tfU0laRQorczMyaS5uIGEwLCBhMSwgNAorczMyaS5uIGExMSwgYTEsIDgKK3MzMmkubiBhMTIsIGExLCAxMgorczMyaS5uIGExMywgYTEsIDE2CitzMzJpLm4gYTE0LCBhMSwgMjAKK3MzMmkubiBhMTUsIGExLCAyNAorI2Vsc2UKK2VudHJ5IGExLCBYVEVOU0FfU1FSVF9TVEFDS19TSVpFCisjZW5kaWYKKworLnh0ZW5zYV9zcXJ0XzMyX3N0YXJ0OgorLy8gSWYgdGhlIG51bWJlciBpcyB6ZXJvLCBqdXN0IHF1aWNrbHkgZXhpdCB3aXRob3V0IGRvaW5nIGFueXRoaW5nLgorYmVxei5uIG51bSwgLnh0ZW5zYV9zcXJ0XzMyX3JldHVybgorCisvLyAqKiB1aW50MzIgcmVzID0gMDsKK21vdmkubiByZXMsIDAKKy8vIEFsc28sIHNldHVwIHRoZSBoYW5keSBjb25zdGFudCB3ZSBuZWVkIGEgZmV3IHRpbWVzLgorbW92aS5uIG9uZSwgMQorCisvLyBUaGlzIHdpbGwgZ2l2ZSB1cyAoMzIgLSBpbmRleCBvZiB0aGUgZmlyc3QgYml0IHRoYXQgaXMgc2V0KS4KKy8vICoqIGludCBtYXhfYml0X251bWJlciA9IDMyIC0gTW9zdFNpZ25pZmljYW50Qml0XzMyKG51bSk7Cituc2F1IG1heF9iaXRfbnVtYmVyLCBudW0KKworLy8gKiogbWF4X2JpdF9udW1iZXIgfD0gb25lOworb3IgbWF4X2JpdF9udW1iZXIsIG1heF9iaXRfbnVtYmVyLCBvbmUKKworLy8gVGhlIGFtbW91bnQgd2Ugc2hpZnQgYnkgaXMgMzEgLSB3aGF0IHdlIHN0b3JlZCBpbiBtYXhfYml0X251bWJlci4KK21vdmkubiBhMTUsIDMxCitzdWIgbWF4X2JpdF9udW1iZXIsIGExNSwgbWF4X2JpdF9udW1iZXIKKworLy8gRG8gdGhlIHNoaWZ0LgorLy8gKiogdWludDMyIGJpdCA9IDEgPDwgKDMxIC0gbWF4X2JpdF9udW1iZXIpOworc3NsIG1heF9iaXRfbnVtYmVyCitzbGwgYml0LCBvbmUKKworLy8gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgd2UncmUgZ29pbmcgdG8gbmVlZC4KKy8vICoqIGludCBpdGVyYXRpb25zID0gKDMxIC0gbWF4X2JpdF9udW1iZXIpIC8gMiArIDE7CitzcmxpIGl0ZXJhdGlvbnMsIG1heF9iaXRfbnVtYmVyLCAxCithZGQgaXRlcmF0aW9ucywgaXRlcmF0aW9ucywgb25lCisKKy8vIElmIHRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyBpcyBlcXVhbCB0byAxNiwgdGhpcyBtZWFucyB0aGF0IHdlJ3JlIGxpa2VseSBpbgorLy8gYW4gb3ZlcmZsb3cgc3BvdCBpZiB3ZSB0cnkgYW5kIGRvIGEgc3VidHJhY3Rpb24gKHNpbmNlIHRoZSB1cHBlciBtb3N0IGJpdCBpcworLy8gZ29pbmcgdG8gYmUgc2V0IHNpbmNlIHRoZSBiaXQgaGFkIHRvIGJlIHNoaWZ0ZWQgdXAgc28gaGlnaCkuIFdlIGhhdmUgdG8gZG8KKy8vIG9uZSBpdGVyYXRpb24gb2YgdGhlIGxvb3Agd2hlcmUgd2UgdXNlIHRoZSBwaXBlbGluZSBkZXN0cm95aW5nIGJyYW5jaCBjYWxsCisvLyB0aGF0IGNhbiBjb21wYXJlIHR3byB1bnNpZ25lZCBudW1iZXJzLiBJZiB3ZSBuZWVkIGxlc3MgdGhhbiAxNiBpdGVyYXRpb25zLAorLy8gd2UgY2FuIHNraXAgdGhpcyBzbG93IHBhdGggYW5kIGp1bXAgdG8gdGhlIHRpZ2h0IGlubmVyIGxvb3AuCitibHRpIGl0ZXJhdGlvbnMsIDE2LCAueHRlbnNhX3NxcnRfMzJfaW5uZXJfbG9vcF9zdGFydAorCisvLyBDYWNoZSBiaXQgKyByZXMgaW50byBhbm90aGVyIHJlZ2lzdGVyLgorYWRkLm4gYml0X3BsdXNfcmVzLCBiaXQsIHJlcworLy8gU2luY2Ugd2UndmUgc3RvcmVkIGEgY29weSBvZiBiaXQgKyByZXMsIHdlIGNhbiByaWdodCBzaGlmdCByZXMgKHNpbmNlIGJvdGgKKy8vIGJyYW5jaGVzIG9mIHRoZSBjb25kaXRpb25hbCBhcmUgZ29pbmcgdG8gbmVlZCBpdCwgb25lIGJyYW5jaCBqdXN0IG5lZWRzIHRvCisvLyBwZXJmb3JtIGFuIGV4dHJhIGFkZGl0aW9uKS4KKy8vICoqIHJlcyA8PD0gMTsKK3NybGkgcmVzLCByZXMsIDEKKy8vICoqIGlmIChudW0gPj0gcmVzX3BsdXNfYml0KSB7CitibHR1IG51bSwgYml0X3BsdXNfcmVzLCAueHRlbnNhX3NxcnRfMzJfYnJhbmNoX3NraXAKKy8vICoqICAgbnVtIC09IHJlcyArIGJpdDsKK3N1YiBudW0sIG51bSwgYml0X3BsdXNfcmVzCisvLyAqKiAgIHJlcyArPSBiaXQ7CithZGQgcmVzLCByZXMsIGJpdAorLy8gKiogfQorLnh0ZW5zYV9zcXJ0XzMyX2JyYW5jaF9za2lwOgorCisvLyAqKiBiaXQgPj49IDI7CitzcmxpIGJpdCwgYml0LCAyCisvLyBNYWtlIHN1cmUgd2Uga25vY2sgb2ZmIHRoaXMgaXRlcmF0aW9uIHdoZW4gd2UgZmFsbCBpbnRvIHRoZSBpbm5lciBsb29wLgorc3ViIGl0ZXJhdGlvbnMsIGl0ZXJhdGlvbnMsIG9uZQorCisueHRlbnNhX3NxcnRfMzJfaW5uZXJfbG9vcF9zdGFydDoKKy8vIFN0YXJ0IGEgemVybyBvdmVyaGVhZCBsb29wIGZvciB0aGUgbnVtYmVyIG9mIHJlbWFpbmluZyBpdGVyYXRpb25zLgorbG9vcCBpdGVyYXRpb25zLCAueHRlbnNhX3NxcnRfMzJfcm91bmQKKworLy8gQ2FjaGUgYml0ICsgcmVzIGludG8gYW5vdGhlciByZWdpc3Rlci4KK2FkZC5uIGJpdF9wbHVzX3JlcywgYml0LCByZXMKKy8vICoqIHJlcyA8PD0gMTsKK3NybGkgcmVzLCByZXMsIDEKKworLy8gV2UgY2FuIGRvZGdlIGEgaGVmdHkgYnJhbmNoIHBlbmFsdHkgYnkgZG9pbmcgY29uZGl0aW9uYWwgbW92ZXMgLSBzbyB3ZSBuZWVkCisvLyB0byBjb21wdXRlIHRoZSB2YWx1ZXMgZm9yIG51bSBhbmQgcmVzIGZvciB3aGF0IHdvdWxkIGhhcHBlbiBpZiB3ZSB0b29rIHRoZQorLy8gaWYgcGFydCBvZiB0aGUgY29uZGl0aW9uLiBJZiB0aGUgY29uZGl0aW9uIGlzIHRydWUsIHRoZW4gd2UnbGwgY29weSBzdHVmZgorLy8gYWNyb3NzLgorCisvLyBjb21wdXRlIG51bSAtIGJpdF9wbHVzX3Jlcy4gV2UgY2FuIHVzZSB0aGlzIGZvciB0aGUgY29uZGl0aW9uYWwgY2hlY2sKKy8vIGFnYWluc3QgemVyby4KK3N1YiBudW1fbWludXNfYml0X3BsdXNfcmVzLCBudW0sIGJpdF9wbHVzX3JlcworLy8gY29tcHV0ZSB0aGUgc2hpZnRlZCByZXMgKyBiaXQuCithZGQgcmVzX3NoaWZ0X2xlZnRfcGx1c19iaXQsIHJlcywgYml0CisKKy8vIENvcHkgc3R1ZmYgaWYgdGhlIGNvbmRpdGlvbiBpcyB0cnVlLgorbW92Z2V6IG51bSwgbnVtX21pbnVzX2JpdF9wbHVzX3JlcywgbnVtX21pbnVzX2JpdF9wbHVzX3JlcworbW92Z2V6IHJlcywgcmVzX3NoaWZ0X2xlZnRfcGx1c19iaXQsIG51bV9taW51c19iaXRfcGx1c19yZXMKKworLy8gKiogYml0ID4+PSAyOworc3JsaSBiaXQsIGJpdCwgMgorCisueHRlbnNhX3NxcnRfMzJfcm91bmQ6CisKKy8vIE5lZWQgdG8gZG8gaWYgKG51bSA+IHJlcykgeyArK3JlczsgfSwgYnV0IHdlJ2xsIGRvIGl0IHdpdGggY29uZGl0aW9uYWwgbW92ZXMKKy8vIGFnYWluLiBFeGNlcHQgd2UncmUgZ29pbmcgdG8gZG8gaXQgc2xpZ2h0bHkgYmFja3dhcmRzLCBzaW5jZSB3ZSBuZWVkIHRvIG1vdmUKKy8vIHRoZSByZXN1bHQgaW50byB0aGUgbnVtIHJlZ2lzdGVyIHRvIGJlIHJldHVybmVkLiBXZSdsbCBkbyB0aGlzIGJ5IHNldHRpbmcKKy8vIHRoZSByZXR1cm4gdmFsdWUgdG8gcmVzICsgMSwgYnV0IGluIHRoZSBldmVudCB0aGF0IGl0IHdhcyBhIG1pc3Rha2UsIHdlJ2xsCisvLyBjb25kaXRpb25hbGx5IG1vdmUgdGhlIHJhdyByZXN1bHQgYmFjayBpbnRvIHBsYWNlLgorc3ViIHJlc19taW51c19udW0sIHJlcywgbnVtCithZGQubiBudW0sIHJlcywgb25lCittb3ZnZXogbnVtLCByZXMsIHJlc19taW51c19udW0KKworLy8gQnV0IHdlIG1pZ2h0IGhhdmUgYWxzbyBwb29jaGVkIHRoZSByb3VuZGluZyBieSBhZGRpbmcgYW4gZXh0cmEgYml0LCBtYWtlIHN1cmUKKy8vIHdlIGRvbid0IGV4cGxvZGUgd2hlbiB3ZSBvdmVyZmxvdy4KK2NsYW1wcyBudW0sIG51bSwgMTYKKworLnh0ZW5zYV9zcXJ0XzMyX3JldHVybjoKKyNpZmRlZiBOT19SRUdJU1RFUl9XSU5ET1cKK2wzMmkubiBhMCwgYTEsIDQKK2wzMmkubiBhMTEsIGExLCA4CitsMzJpLm4gYTEyLCBhMSwgMTIKK2wzMmkubiBhMTMsIGExLCAxNgorbDMyaS5uIGExNCwgYTEsIDIwCitsMzJpLm4gYTE1LCBhMSwgMjQKK2FkZGkgYTEsIGExLCBYVEVOU0FfU1FSVF9TVEFDS19TSVpFCityZXQubgorI2Vsc2UKK3JldHcubgorI2VuZGlmCisKKyN1bmRlZiBudW0KKyN1bmRlZiBiaXQKKyN1bmRlZiByZXMKKyN1bmRlZiBvbmUKKyN1bmRlZiBtYXhfYml0X251bWJlcgorI3VuZGVmIGl0ZXJhdGlvbnMKKyN1bmRlZiBiaXRfcGx1c19yZXMKKyN1bmRlZiBudW1fbWludXNfYml0X3BsdXNfcmVzCisjdW5kZWYgcmVzX3NoaWZ0X2xlZnRfcGx1c19iaXQKKyN1bmRlZiByZXNfbWludXNfbnVtCmRpZmYgLS1naXQgYS9zaWduYWwvc3JjL0JVSUxEIGIvc2lnbmFsL3NyYy9CVUlMRAppbmRleCBjMDlmNjA4Li5lNWMxMDYwIDEwMDY0NAotLS0gYS9zaWduYWwvc3JjL0JVSUxECisrKyBiL3NpZ25hbC9zcmMvQlVJTEQKQEAgLTE0MiwzICsxNDIsMTMgQEAKICAgICAgICAgIjpzcXVhcmVfcm9vdF82NCIsCiAgICAgXSwKICkKKworY2NfbGlicmFyeSgKKyAgICBuYW1lID0gInBjYW5fYXJnY19maXhlZCIsCisgICAgc3JjcyA9IFsicGNhbl9hcmdjX2ZpeGVkLmNjIl0sCisgICAgaGRycyA9IFsicGNhbl9hcmdjX2ZpeGVkLmgiXSwKKyAgICBkZXBzID0gWworICAgICAgICAiOm1zYl8zMiIsCisgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsOmNvbXBhdGliaWxpdHkiLAorICAgIF0sCispCmRpZmYgLS1naXQgYS9zaWduYWwvc3JjL21heF9hYnMuY2MgYi9zaWduYWwvc3JjL21heF9hYnMuY2MKaW5kZXggMzY1OTM4ZC4uMGFkMTE3YSAxMDA2NDQKLS0tIGEvc2lnbmFsL3NyYy9tYXhfYWJzLmNjCisrKyBiL3NpZ25hbC9zcmMvbWF4X2Ficy5jYwpAQCAtMTUsMTEgKzE1LDU4IEBACiAKICNpbmNsdWRlICJzaWduYWwvc3JjL21heF9hYnMuaCIKIAorI2lmIGRlZmluZWQoWFRFTlNBKQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHh0ZW5zYS90aWUveHRfbWlzYy5oPgorI2VuZGlmCisjaWYgWENIQUxfSEFWRV9ISUZJMworI2luY2x1ZGUgPHh0ZW5zYS90aWUveHRfaGlmaTMuaD4KK3N0YXRpYyBpbmxpbmUgYWVfcDI0eDJzIE1heEFiczE2U2luZ2xlKGFlX3AyNHgycyBtYXgsIGFlX3AyNHgycyBjdXJyZW50KSB7CisgIHJldHVybiBBRV9NQVhBQlNTUDI0UyhtYXgsIGN1cnJlbnQpOworfQorI2VsaWYgWENIQUxfSEFWRV9ISUZJX01JTkkgfHwgWENIQUxfSEFWRV9ISUZJMiB8fCBYQ0hBTF9IQVZFX0hJRklfRVAKKyNpbmNsdWRlIDx4dGVuc2EvdGllL3h0X2hpZmkyLmg+CitzdGF0aWMgaW5saW5lIGFlX3AyNHgycyBNYXhBYnMxNlNpbmdsZShhZV9wMjR4MnMgbWF4LCBhZV9wMjR4MnMgY3VycmVudCkgeworICBjdXJyZW50ID0gQUVfQUJTU1AyNFMoY3VycmVudCk7CisgIHJldHVybiBBRV9NQVhQMjRTKG1heCwgY3VycmVudCk7Cit9CisjZW5kaWYKKwogLy8gVE9ETyhiLzI4NjI1MDQ3Myk6IHJlbW92ZSBuYW1lc3BhY2Ugb25jZSBkZS1kdXBlZCBsaWJyYXJpZXMKIG5hbWVzcGFjZSB0ZmxpdGUgewogbmFtZXNwYWNlIHRmbG1fc2lnbmFsIHsKIAorI2lmIFhDSEFMX0hBVkVfSElGSV9NSU5JIHx8IFhDSEFMX0hBVkVfSElGSTIgfHwgWENIQUxfSEFWRV9ISUZJX0VQIHx8IFwKKyAgICBYQ0hBTF9IQVZFX0hJRkkzCitpbnQxNl90IFh0ZW5zYU1heEFiczE2KGNvbnN0IGludDE2X3QqIGlucHV0LCBpbnQgc2l6ZSkgeworICBpbnQgaTsKKyAgYWVfcDI0eDJzIGN1cnJlbnRfMjR4MjsKKyAgLy8gQUVfTFAxNlgyRl9JVSgpIGVmZmVjdGl2ZWx5IHByZS1pbmNyZW1lbnRzIHRoZSBhZGRyZXNzIGluIGlucHV0XzE2eDIgYnkgNAorICAvLyAgYnl0ZXMgYmVmb3JlIGxvYWRpbmcsIHNvIHdlIG5lZWQgdG8gaW5pdGlhbGl6ZSBpdCBhY2NvcmRpbmdseS4KKyAgY29uc3QgYWVfcDE2eDJzKiBpbnB1dF8xNngyID0gKGNvbnN0IGFlX3AxNngycyopKGlucHV0IC0gMik7CisgIGFlX3AyNHgycyBtYXggPSBBRV9aRVJPUDQ4KCk7CisgIGNvbnN0IGludCBudW1faXRlcmF0aW9ucyA9IHNpemUgLyAyOworICBmb3IgKGkgPSAwOyBpIDwgbnVtX2l0ZXJhdGlvbnM7IGkrKykgeworICAgIC8vIEFkdmFuY2luZyB0aGUgcG9pbnRlciBieSAyIFggMTYtYml0cy4KKyAgICBBRV9MUDE2WDJGX0lVKGN1cnJlbnRfMjR4MiwgaW5wdXRfMTZ4MiwgNCk7CisgICAgbWF4ID0gTWF4QWJzMTZTaW5nbGUobWF4LCBjdXJyZW50XzI0eDIpOworICB9CisgIGlmIChzaXplICYgMSkgeyAgLy8gbiBpcyBvZGQKKyAgICAvLyBBZHZhbmNpbmcgdGhlIHBvaW50ZXIgYnkgMiBYIDE2LWJpdHMuCisgICAgY3VycmVudF8yNHgyID0gQUVfTFAxNkZfSSgoYWVfcDE2cyopaW5wdXRfMTZ4MiwgNCk7CisgICAgbWF4ID0gTWF4QWJzMTZTaW5nbGUobWF4LCBjdXJyZW50XzI0eDIpOworICB9CisgIGNvbnN0IGludCBtYXhfTCA9IEFFX1RSVU5DQTE2UDI0U19MKG1heCk7CisgIGNvbnN0IGludCBtYXhfSCA9IEFFX1RSVU5DQTE2UDI0U19IKG1heCk7CisgIHJldHVybiAobWF4X0wgPj0gbWF4X0gpID8gbWF4X0wgOiBtYXhfSDsKK30KKyNlbmRpZgorCiBpbnQxNl90IE1heEFiczE2KGNvbnN0IGludDE2X3QqIGlucHV0LCBpbnQgc2l6ZSkgeworI2lmIFhDSEFMX0hBVkVfSElGSV9NSU5JIHx8IFhDSEFMX0hBVkVfSElGSTIgfHwgWENIQUxfSEFWRV9ISUZJX0VQIHx8IFwKKyAgICBYQ0hBTF9IQVZFX0hJRkkzCisgIHJldHVybiBYdGVuc2FNYXhBYnMxNihpbnB1dCwgc2l6ZSk7CisjZWxzZQogICBpbnQxNl90IG1heCA9IDA7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgY29uc3QgaW50MTZfdCB2YWx1ZSA9IGlucHV0W2ldOwpAQCAtMzAsNiArNzcsOCBAQAogICAgIH0KICAgfQogICByZXR1cm4gbWF4OworI2VuZGlmCiB9CisKIH0gIC8vIG5hbWVzcGFjZSB0ZmxtX3NpZ25hbAogfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvc2lnbmFsL3NyYy9tc2JfMzIuY2MgYi9zaWduYWwvc3JjL21zYl8zMi5jYwppbmRleCA2ZjEyZGM0Li42N2YyNjY0IDEwMDY0NAotLS0gYS9zaWduYWwvc3JjL21zYl8zMi5jYworKysgYi9zaWduYWwvc3JjL21zYl8zMi5jYwpAQCAtMTUsMTMgKzE1LDIxIEBACiAKICNpbmNsdWRlICJzaWduYWwvc3JjL21zYi5oIgogCisjaWYgZGVmaW5lZChYVEVOU0EpCisjaW5jbHVkZSA8eHRlbnNhL3RpZS94dF9taXNjLmg+CisjZW5kaWYKKwogbmFtZXNwYWNlIHRmbGl0ZSB7CiBuYW1lc3BhY2UgdGZsbV9zaWduYWwgewogLy8gVE9ETyhiLzI4NjI1MDQ3Myk6IHJlbW92ZSBuYW1lc3BhY2Ugb25jZSBkZS1kdXBlZCBsaWJyYXJpZXMgYWJvdmUKIAogLy8gVE9ETyhiLzI5MTE2NzM1MCk6ICBjYW4gYWxsb3cgX19idWlsdGluX2NseiB0byBiZSB1c2VkIGluIG1vcmUgY2FzZXMgaGVyZQogdWludDMyX3QgTW9zdFNpZ25pZmljYW50Qml0MzIodWludDMyX3QgeCkgewotI2lmIGRlZmluZWQoX19HTlVDX18pCisjaWYgZGVmaW5lZChYVEVOU0EpCisgIC8vIFhUX05TQVUgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGxlZnQgc2hpZnRzIG5lZWRlZCB0byBwdXQgdGhlIE1TQiBpbiB0aGUKKyAgLy8gbGVmdG1vc3QgcG9zaXRpb24uIFJldHVybnMgMzIgaWYgdGhlIGFyZ3VtZW50IGlzIDAuCisgIHJldHVybiAzMiAtIFhUX05TQVUoeCk7CisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKQogICBpZiAoeCkgewogICAgIHJldHVybiAzMiAtIF9fYnVpbHRpbl9jbHooeCk7CiAgIH0KZGlmZiAtLWdpdCBhL3NpZ25hbC9zcmMvbXNiXzY0LmNjIGIvc2lnbmFsL3NyYy9tc2JfNjQuY2MKaW5kZXggMjMzOTg1Yy4uNzQxNjQzOCAxMDA2NDQKLS0tIGEvc2lnbmFsL3NyYy9tc2JfNjQuY2MKKysrIGIvc2lnbmFsL3NyYy9tc2JfNjQuY2MKQEAgLTE1LDEyICsxNSwyNSBAQAogCiAjaW5jbHVkZSAic2lnbmFsL3NyYy9tc2IuaCIKIAorI2lmIGRlZmluZWQoWFRFTlNBKQorI2luY2x1ZGUgPHh0ZW5zYS90aWUveHRfbWlzYy5oPgorI2VuZGlmCisKIG5hbWVzcGFjZSB0ZmxpdGUgewogbmFtZXNwYWNlIHRmbG1fc2lnbmFsIHsKIC8vIFRPRE8oYi8yODYyNTA0NzMpOiByZW1vdmUgbmFtZXNwYWNlIG9uY2UgZGUtZHVwZWQgbGlicmFyaWVzIGFib3ZlCiAKIHVpbnQzMl90IE1vc3RTaWduaWZpY2FudEJpdDY0KHVpbnQ2NF90IHgpIHsKLSNpZiBkZWZpbmVkKF9fR05VQ19fKQorI2lmIGRlZmluZWQoWFRFTlNBKQorICAvLyBYVF9OU0FVIHJldHVybnMgdGhlIG51bWJlciBvZiBsZWZ0IHNoaWZ0cyBuZWVkZWQgdG8gcHV0IHRoZSBNU0IgaW4gdGhlCisgIC8vIGxlZnRtb3N0IHBvc2l0aW9uLiBSZXR1cm5zIDMyIGlmIHRoZSBhcmd1bWVudCBpcyAwLgorICB1aW50MzJfdCB1cHBlciA9IDY0IC0gWFRfTlNBVSgodWludDMyX3QpKHggPj4gMzIpKTsKKyAgaWYgKHVwcGVyICE9IDMyKSB7CisgICAgcmV0dXJuIHVwcGVyOworICB9CisgIC8vIE9ubHkgaWYgdGhlIHVwcGVyIGJpdHMgYXJlIGFsbCBjbGVhciBkbyB3ZSB3YW50IHRvIGxvb2sgYXQgdGhlIGxvd2VyIGJpdHMuCisgIHJldHVybiAzMiAtIFhUX05TQVUoKHVpbnQzMl90KXgpOworI2VsaWYgZGVmaW5lZChfX0dOVUNfXykKICAgaWYgKHgpIHsKICAgICByZXR1cm4gNjQgLSBfX2J1aWx0aW5fY2x6bGwoeCk7CiAgIH0KZGlmZiAtLWdpdCBhL3NpZ25hbC9zcmMvcGNhbl9hcmdjX2ZpeGVkLmNjIGIvc2lnbmFsL3NyYy9wY2FuX2FyZ2NfZml4ZWQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcwMGIyOAotLS0gL2Rldi9udWxsCisrKyBiL3NpZ25hbC9zcmMvcGNhbl9hcmdjX2ZpeGVkLmNjCkBAIC0wLDAgKzEsNzUgQEAKKy8qIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaW5jbHVkZSAicGNhbl9hcmdjX2ZpeGVkLmgiCisKK25hbWVzcGFjZSB0ZmxpdGUgeworbmFtZXNwYWNlIHRmbG1fc2lnbmFsIHsKKworaW50MTZfdCBXaWRlRHluYW1pY0Z1bmN0aW9uKGNvbnN0IHVpbnQzMl90IHgsIGNvbnN0IGludDE2X3QqIGx1dCkgeworICBpZiAoeCA8PSAyKSB7CisgICAgcmV0dXJuIGx1dFt4XTsKKyAgfQorCisgIGNvbnN0IGludDE2X3QgaW50ZXJ2YWwgPSBNb3N0U2lnbmlmaWNhbnRCaXQzMih4KTsKKyAgbHV0ICs9IDQgKiBpbnRlcnZhbCAtIDY7CisKKyAgY29uc3QgaW50MTZfdCBmcmFjID0KKyAgICAgICgoaW50ZXJ2YWwgPCAxMSkgPyAoeCA8PCAoMTEgLSBpbnRlcnZhbCkpIDogKHggPj4gKGludGVydmFsIC0gMTEpKSkgJgorICAgICAgMHgzRkY7CisKKyAgaW50MzJfdCByZXN1bHQgPSAoKGludDMyX3QpbHV0WzJdICogZnJhYykgPj4gNTsKKyAgcmVzdWx0ICs9IChpbnQzMl90KSgodWludDMyX3QpbHV0WzFdIDw8IDUpOworICByZXN1bHQgKj0gZnJhYzsKKyAgcmVzdWx0ID0gKHJlc3VsdCArICgxIDw8IDE0KSkgPj4gMTU7CisgIHJlc3VsdCArPSBsdXRbMF07CisgIHJldHVybiAoaW50MTZfdClyZXN1bHQ7Cit9CisKKy8vIEV2YWx1YXRlIHRoZSBwaWVjZXdpc2UgcG9seW5vbWlhbCAic2hyaW5rIiBmdW5jdGlvbiBkZWZpbmVkIGJ5CisvLyAgIHNocmluayh4KSA9IHheMiAvIDQgIGZvciB4IDwgMiwKKy8vICAgc2hyaW5rKHgpID0geCAtIDEgICAgZm9yIHggPj0gMi4KKy8vIFRoZSBpbnB1dCB4IGhhcyBrUGNhblNuckJpdHMgZnJhY3Rpb25hbCBiaXRzLCBhbmQgdGhlIG91dHB1dCBoYXMKKy8vIGtQY2FuT3V0cHV0Qml0cyBmcmFjdGlvbmFsIGJpdHMuCit1aW50MzJfdCBQY2FuU2hyaW5rKGNvbnN0IHVpbnQzMl90IHgpIHsKKyAgVEZMSVRFX0RDSEVDSyhrUGNhblNuckJpdHMgPj0ga1BjYW5PdXRwdXRCaXRzKTsKKyAgaWYgKHggPCAoMiA8PCBrUGNhblNuckJpdHMpKSB7CisgICAgLy8gQ29tcHV0ZSB4XjIgLyA0LgorICAgIHJldHVybiAoeCAqIHgpID4+ICgyICsgMiAqIGtQY2FuU25yQml0cyAtIGtQY2FuT3V0cHV0Qml0cyk7CisgIH0gZWxzZSB7CisgICAgLy8gQ29tcHV0ZSB4IC0gMS4KKyAgICByZXR1cm4gKHggPj4gKGtQY2FuU25yQml0cyAtIGtQY2FuT3V0cHV0Qml0cykpIC0gKDEgPDwga1BjYW5PdXRwdXRCaXRzKTsKKyAgfQorfQorCit2b2lkIEFwcGx5UGNhbkF1dG9HYWluQ29udHJvbEZpeGVkKGNvbnN0IGludDE2X3QqIGdhaW5fbHV0LCBpbnQzMl90IHNucl9zaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QqIG5vaXNlX2VzdGltYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZmlsdGVyYmFua19vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fY2hhbm5lbHMpIHsKKyAgaW50IGk7CisgIGZvciAoaSA9IDA7IGkgPCBudW1fY2hhbm5lbHM7ICsraSkgeworICAgIC8vIFRoZSBnYWluIGhhcyBnYWluX2JpdHMgZnJhY3Rpb25hbCBiaXRzLCBhbmQgZmlsdGVyYmFua19vdXRwdXRbaV0gaGFzCisgICAgLy8gLWlucHV0X2NvcnJlY3Rpb25fYml0cyBmcmFjdGlvbmFsIGJpdHMuIFRoZSBwcm9kdWN0IGlzIHNoaWZ0ZWQgc28gdGhhdAorICAgIC8vIHRoZSByZXN1bHRpbmcgc25yIGhhcyBrUGNhblNuckJpdHMgZnJhY3Rpb25hbCBiaXRzLgorICAgIGNvbnN0IHVpbnQzMl90IGdhaW4gPSBXaWRlRHluYW1pY0Z1bmN0aW9uKG5vaXNlX2VzdGltYXRlW2ldLCBnYWluX2x1dCk7CisgICAgY29uc3QgdWludDMyX3Qgc25yID0gKCh1aW50NjRfdClmaWx0ZXJiYW5rX291dHB1dFtpXSAqIGdhaW4pID4+IHNucl9zaGlmdDsKKyAgICAvLyBSZXN1bHQgaGFzIGtQY2FuT3V0cHV0Qml0cyBmcmFjdGlvbmFsIGJpdHMuCisgICAgLy8gTk9URTogVGhpcyBhc3N1bWVzIGZpbHRlcmJhbmtfb3V0cHV0X3NjYWxlID0gMSA8PCBrUGNhbk91dHB1dEJpdHMuCisgICAgZmlsdGVyYmFua19vdXRwdXRbaV0gPSBQY2FuU2hyaW5rKHNucik7CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIHRmbG1fc2lnbmFsCit9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCmRpZmYgLS1naXQgYS9zaWduYWwvc3JjL3BjYW5fYXJnY19maXhlZC5oIGIvc2lnbmFsL3NyYy9wY2FuX2FyZ2NfZml4ZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmVhZjNkCi0tLSAvZGV2L251bGwKKysrIGIvc2lnbmFsL3NyYy9wY2FuX2FyZ2NfZml4ZWQuaApAQCAtMCwwICsxLDQxIEBACisvKiBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2lmbmRlZiBTSUdOQUxfTUlDUk9fS0VSTkVMU19fU1JDX1BDQU5fQUdDX0ZJWEVEX0gKKyNkZWZpbmUgU0lHTkFMX01JQ1JPX0tFUk5FTFNfX1NSQ19QQ0FOX0FHQ19GSVhFRF9ICisjaW5jbHVkZSA8Y3N0ZGludD4KKworI2luY2x1ZGUgIm1zYi5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL2NvbXBhdGliaWxpdHkuaCIKKworbmFtZXNwYWNlIHRmbGl0ZSB7CituYW1lc3BhY2UgdGZsbV9zaWduYWwgeworCisjZGVmaW5lIGtQY2FuU25yQml0cyAxMgorI2RlZmluZSBrUGNhbk91dHB1dEJpdHMgNgorCitpbnQxNl90IFdpZGVEeW5hbWljRnVuY3Rpb24oY29uc3QgdWludDMyX3QgeCwgY29uc3QgaW50MTZfdCogbHV0KTsKKwordWludDMyX3QgUGNhblNocmluayhjb25zdCB1aW50MzJfdCB4KTsKKwordm9pZCBBcHBseVBjYW5BdXRvR2FpbkNvbnRyb2xGaXhlZChjb25zdCBpbnQxNl90KiBnYWluX2x1dCwgaW50MzJfdCBzbnJfc2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBub2lzZV9lc3RpbWF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIGZpbHRlcmJhbmtfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2NoYW5uZWxzKTsKKworfSAgLy8gbmFtZXNwYWNlIHRmbG1fc2lnbmFsCit9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCisKKyNlbmRpZiAgLy8gU0lHTkFMX01JQ1JPX0tFUk5FTFNfX1BDQU5fQUdDX0ZJWEVEX0gKZGlmZiAtLWdpdCBhL3NpZ25hbC90ZW5zb3JmbG93X2NvcmUva2VybmVscy9CVUlMRCBiL3NpZ25hbC90ZW5zb3JmbG93X2NvcmUva2VybmVscy9CVUlMRAppbmRleCAzYjdkMWJlLi4zM2Y1ZDA4IDEwMDY0NAotLS0gYS9zaWduYWwvdGVuc29yZmxvd19jb3JlL2tlcm5lbHMvQlVJTEQKKysrIGIvc2lnbmFsL3RlbnNvcmZsb3dfY29yZS9rZXJuZWxzL0JVSUxECkBAIC02Niw2ICs2NiwxNSBAQAogKQogCiB0ZmxtX3NpZ25hbF9rZXJuZWxfbGlicmFyeSgKKyAgICBuYW1lID0gInBjYW5fa2VybmVsIiwKKyAgICBzcmNzID0gWyJwY2FuX2tlcm5lbC5jYyJdLAorICAgIGRlcHMgPSBbCisgICAgICAgICIvL3NpZ25hbC9zcmM6cGNhbl9hcmdjX2ZpeGVkIiwKKyAgICAgICAgIkB0ZW5zb3JmbG93X2NjX2RlcHMvLzpjY19saWJyYXJ5IiwKKyAgICBdLAorKQorCit0ZmxtX3NpZ25hbF9rZXJuZWxfbGlicmFyeSgKICAgICBuYW1lID0gInN0YWNrZXJfa2VybmVsIiwKICAgICBzcmNzID0gWyJzdGFja2VyX2tlcm5lbC5jYyJdLAogICAgIGRlcHMgPSBbCmRpZmYgLS1naXQgYS9zaWduYWwvdGVuc29yZmxvd19jb3JlL2tlcm5lbHMvcGNhbl9rZXJuZWwuY2MgYi9zaWduYWwvdGVuc29yZmxvd19jb3JlL2tlcm5lbHMvcGNhbl9rZXJuZWwuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFhZGRlMAotLS0gL2Rldi9udWxsCisrKyBiL3NpZ25hbC90ZW5zb3JmbG93X2NvcmUva2VybmVscy9wY2FuX2tlcm5lbC5jYwpAQCAtMCwwICsxLDUzIEBACisvKiBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgInNpZ25hbC9zcmMvcGNhbl9hcmdjX2ZpeGVkLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9jb3JlL2ZyYW1ld29yay9vcF9rZXJuZWwuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2NvcmUvZnJhbWV3b3JrL3R5cGVzLmgiCisKK25hbWVzcGFjZSB0ZW5zb3JmbG93IHsKK25hbWVzcGFjZSBzaWduYWwgeworCitjbGFzcyBQY2FuT3AgOiBwdWJsaWMgdGVuc29yZmxvdzo6T3BLZXJuZWwgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgUGNhbk9wKHRlbnNvcmZsb3c6Ok9wS2VybmVsQ29uc3RydWN0aW9uKiBjb250ZXh0KQorICAgICAgOiB0ZW5zb3JmbG93OjpPcEtlcm5lbChjb250ZXh0KSB7CisgICAgT1BfUkVRVUlSRVNfT0soY29udGV4dCwgY29udGV4dC0+R2V0QXR0cigic25yX3NoaWZ0IiwgJnNucl9zaGlmdF8pKTsKKyAgfQorCisgIHZvaWQgQ29tcHV0ZSh0ZW5zb3JmbG93OjpPcEtlcm5lbENvbnRleHQqIGNvbnRleHQpIG92ZXJyaWRlIHsKKyAgICB0ZW5zb3JmbG93OjpUZW5zb3IqIG91dHB1dF90ZW5zb3IgPSBudWxscHRyOworICAgIGNvbnN0IHVpbnQzMl90KiBpbnB1dCA9IGNvbnRleHQtPmlucHV0KDApLmZsYXQ8dWludDMyX3Q+KCkuZGF0YSgpOworICAgIGNvbnN0IHVpbnQzMl90KiBub2lzZV9lc3RpbWF0ZSA9IGNvbnRleHQtPmlucHV0KDEpLmZsYXQ8dWludDMyX3Q+KCkuZGF0YSgpOworICAgIGNvbnN0IGludDE2X3QqIGdhaW5fbHV0ID0gY29udGV4dC0+aW5wdXQoMikuZmxhdDxpbnQxNl90PigpLmRhdGEoKTsKKyAgICBpbnQzMl90IG51bV9jaGFubmVscyA9IGNvbnRleHQtPmlucHV0KDApLk51bUVsZW1lbnRzKCk7CisgICAgT1BfUkVRVUlSRVNfT0soY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5hbGxvY2F0ZV9vdXRwdXQoMCwge251bV9jaGFubmVsc30sICZvdXRwdXRfdGVuc29yKSk7CisgICAgdWludDMyX3QqIG91dHB1dCA9IG91dHB1dF90ZW5zb3ItPmZsYXQ8dWludDMyX3Q+KCkuZGF0YSgpOworCisgICAgbWVtY3B5KG91dHB1dCwgaW5wdXQsIHNpemVvZih1aW50MzJfdCkgKiBudW1fY2hhbm5lbHMpOworICAgIHRmbGl0ZTo6dGZsbV9zaWduYWw6OkFwcGx5UGNhbkF1dG9HYWluQ29udHJvbEZpeGVkKAorICAgICAgICBnYWluX2x1dCwgc25yX3NoaWZ0Xywgbm9pc2VfZXN0aW1hdGUsIG91dHB1dCwgbnVtX2NoYW5uZWxzKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgaW50IHNucl9zaGlmdF87Cit9OworCitSRUdJU1RFUl9LRVJORUxfQlVJTERFUihOYW1lKCJTaWduYWxQQ0FOIikuRGV2aWNlKHRlbnNvcmZsb3c6OkRFVklDRV9DUFUpLAorICAgICAgICAgICAgICAgICAgICAgICAgUGNhbk9wKTsKKworfSAgLy8gbmFtZXNwYWNlIHNpZ25hbAorfSAgLy8gbmFtZXNwYWNlIHRlbnNvcmZsb3cKZGlmZiAtLWdpdCBhL3NpZ25hbC90ZW5zb3JmbG93X2NvcmUvb3BzL0JVSUxEIGIvc2lnbmFsL3RlbnNvcmZsb3dfY29yZS9vcHMvQlVJTEQKaW5kZXggMTg1YzU5My4uOGVmNDdkOCAxMDA2NDQKLS0tIGEvc2lnbmFsL3RlbnNvcmZsb3dfY29yZS9vcHMvQlVJTEQKKysrIGIvc2lnbmFsL3RlbnNvcmZsb3dfY29yZS9vcHMvQlVJTEQKQEAgLTU0LDYgKzU0LDE0IEBACiApCiAKIHRmbG1fc2lnbmFsX2tlcm5lbF9saWJyYXJ5KAorICAgIG5hbWUgPSAicGNhbl9vcCIsCisgICAgc3JjcyA9IFsicGNhbl9vcC5jYyJdLAorICAgIGRlcHMgPSBbCisgICAgICAgICJAdGVuc29yZmxvd19jY19kZXBzLy86Y2NfbGlicmFyeSIsCisgICAgXSwKKykKKwordGZsbV9zaWduYWxfa2VybmVsX2xpYnJhcnkoCiAgICAgbmFtZSA9ICJzdGFja2VyX29wIiwKICAgICBzcmNzID0gWyJzdGFja2VyX29wLmNjIl0sCiAgICAgZGVwcyA9IFsKZGlmZiAtLWdpdCBhL3NpZ25hbC90ZW5zb3JmbG93X2NvcmUvb3BzL2RlbGF5X29wLmNjIGIvc2lnbmFsL3RlbnNvcmZsb3dfY29yZS9vcHMvZGVsYXlfb3AuY2MKaW5kZXggZGZlZTNkMi4uZmI4MTZhNiAxMDA2NDQKLS0tIGEvc2lnbmFsL3RlbnNvcmZsb3dfY29yZS9vcHMvZGVsYXlfb3AuY2MKKysrIGIvc2lnbmFsL3RlbnNvcmZsb3dfY29yZS9vcHMvZGVsYXlfb3AuY2MKQEAgLTIyLDExICsyMiwxMSBAQAogbmFtZXNwYWNlIHRlbnNvcmZsb3cgewogbmFtZXNwYWNlIHNpZ25hbCB7CiAKLVN0YXR1cyBEZWxheVNoYXBlKEluZmVyZW5jZUNvbnRleHQqIGMpIHsKK2Fic2w6OlN0YXR1cyBEZWxheVNoYXBlKEluZmVyZW5jZUNvbnRleHQqIGMpIHsKICAgU2hhcGVIYW5kbGUgb3V0OwogICBURl9SRVRVUk5fSUZfRVJST1IoYy0+V2l0aFJhbmtBdExlYXN0KGMtPmlucHV0KDApLCAxLCAmb3V0KSk7CiAgIGMtPnNldF9vdXRwdXQoMCwgb3V0KTsKLSAgcmV0dXJuIE9rU3RhdHVzKCk7CisgIHJldHVybiBhYnNsOjpPa1N0YXR1cygpOwogfQogCiAvLyBUT0RPKGIvMjg2MjUwNDczKTogY2hhbmdlIGJhY2sgbmFtZSBhZnRlciBuYW1lIGNsYXNoIHJlc29sdmVkCmRpZmYgLS1naXQgYS9zaWduYWwvdGVuc29yZmxvd19jb3JlL29wcy9lbmVyZ3lfb3AuY2MgYi9zaWduYWwvdGVuc29yZmxvd19jb3JlL29wcy9lbmVyZ3lfb3AuY2MKaW5kZXggOWNhNzRlZC4uZDRmN2NiNyAxMDA2NDQKLS0tIGEvc2lnbmFsL3RlbnNvcmZsb3dfY29yZS9vcHMvZW5lcmd5X29wLmNjCisrKyBiL3NpZ25hbC90ZW5zb3JmbG93X2NvcmUvb3BzL2VuZXJneV9vcC5jYwpAQCAtMjIsNyArMjIsNyBAQAogbmFtZXNwYWNlIHRlbnNvcmZsb3cgewogbmFtZXNwYWNlIHNpZ25hbCB7CiAKLVN0YXR1cyBFbmVyZ3lTaGFwZShJbmZlcmVuY2VDb250ZXh0KiBjKSB7CithYnNsOjpTdGF0dXMgRW5lcmd5U2hhcGUoSW5mZXJlbmNlQ29udGV4dCogYykgewogICBTaGFwZUhhbmRsZSBvdXQ7CiAKICAgVEZfUkVUVVJOX0lGX0VSUk9SKGMtPldpdGhSYW5rKGMtPmlucHV0KDApLCAxLCAmb3V0KSk7CkBAIC0zMCw3ICszMCw3IEBACiAKICAgVEZfUkVUVVJOX0lGX0VSUk9SKGMtPlJlcGxhY2VEaW0ob3V0LCAwLCBjLT5NYWtlRGltKGxlbmd0aCksICZvdXQpKTsKICAgYy0+c2V0X291dHB1dCgwLCBvdXQpOwotICByZXR1cm4gT2tTdGF0dXMoKTsKKyAgcmV0dXJuIGFic2w6Ok9rU3RhdHVzKCk7CiB9CiAKIC8vIFRPRE8oYi8yODYyNTA0NzMpOiBjaGFuZ2UgYmFjayBuYW1lIGFmdGVyIG5hbWUgY2xhc2ggcmVzb2x2ZWQKZGlmZiAtLWdpdCBhL3NpZ25hbC90ZW5zb3JmbG93X2NvcmUvb3BzL2ZmdF9vcHMuY2MgYi9zaWduYWwvdGVuc29yZmxvd19jb3JlL29wcy9mZnRfb3BzLmNjCmluZGV4IDRmNTJhMmIuLjYzZDhlNzggMTAwNjQ0Ci0tLSBhL3NpZ25hbC90ZW5zb3JmbG93X2NvcmUvb3BzL2ZmdF9vcHMuY2MKKysrIGIvc2lnbmFsL3RlbnNvcmZsb3dfY29yZS9vcHMvZmZ0X29wcy5jYwpAQCAtMjIsNyArMjIsNyBAQAogbmFtZXNwYWNlIHRlbnNvcmZsb3cgewogbmFtZXNwYWNlIHNpZ25hbCB7CiAKLVN0YXR1cyBSZmZ0U2hhcGUoSW5mZXJlbmNlQ29udGV4dCogYykgeworYWJzbDo6U3RhdHVzIFJmZnRTaGFwZShJbmZlcmVuY2VDb250ZXh0KiBjKSB7CiAgIFNoYXBlSGFuZGxlIG91dDsKICAgaW50IGZmdF9sZW5ndGg7CiAgIFRGX1JFVFVSTl9JRl9FUlJPUihjLT5HZXRBdHRyPGludD4oImZmdF9sZW5ndGgiLCAmZmZ0X2xlbmd0aCkpOwpAQCAtMzAsMTcgKzMwLDE3IEBACiAgIGF1dG8gZGltID0gKChmZnRfbGVuZ3RoIC8gMikgKyAxKSAqIDI7ICAvLyAqIDIgZm9yIGNvbXBsZXgKICAgVEZfUkVUVVJOX0lGX0VSUk9SKGMtPlJlcGxhY2VEaW0ob3V0LCAtMSwgYy0+TWFrZURpbShkaW0pLCAmb3V0KSk7CiAgIGMtPnNldF9vdXRwdXQoMCwgb3V0KTsKLSAgcmV0dXJuIE9rU3RhdHVzKCk7CisgIHJldHVybiBhYnNsOjpPa1N0YXR1cygpOwogfQogCi1TdGF0dXMgSXJmZnRTaGFwZShJbmZlcmVuY2VDb250ZXh0KiBjKSB7CithYnNsOjpTdGF0dXMgSXJmZnRTaGFwZShJbmZlcmVuY2VDb250ZXh0KiBjKSB7CiAgIFNoYXBlSGFuZGxlIG91dDsKICAgaW50IGZmdF9sZW5ndGg7CiAgIFRGX1JFVFVSTl9JRl9FUlJPUihjLT5HZXRBdHRyPGludD4oImZmdF9sZW5ndGgiLCAmZmZ0X2xlbmd0aCkpOwogICBURl9SRVRVUk5fSUZfRVJST1IoYy0+V2l0aFJhbmtBdExlYXN0KGMtPmlucHV0KDApLCAxLCAmb3V0KSk7CiAgIFRGX1JFVFVSTl9JRl9FUlJPUihjLT5SZXBsYWNlRGltKG91dCwgLTEsIGMtPk1ha2VEaW0oZmZ0X2xlbmd0aCksICZvdXQpKTsKICAgYy0+c2V0X291dHB1dCgwLCBvdXQpOwotICByZXR1cm4gT2tTdGF0dXMoKTsKKyAgcmV0dXJuIGFic2w6Ok9rU3RhdHVzKCk7CiB9CiAKIC8vIFRPRE8oYi8yODYyNTA0NzMpOiBjaGFuZ2UgYmFjayBuYW1lIGFmdGVyIG5hbWUgY2xhc2ggcmVzb2x2ZWQKQEAgLTEwNyw3ICsxMDcsNyBAQAogICAgICAgVEZfUkVUVVJOX0lGX0VSUk9SKGMtPldpdGhSYW5rKGMtPmlucHV0KDApLCAxLCAmb3V0KSk7CiAgICAgICBjLT5zZXRfb3V0cHV0KDAsIG91dCk7CiAgICAgICBjLT5zZXRfb3V0cHV0KDEsIGMtPlNjYWxhcigpKTsKLSAgICAgIHJldHVybiBPa1N0YXR1cygpOworICAgICAgcmV0dXJuIGFic2w6Ok9rU3RhdHVzKCk7CiAgICAgfSkKICAgICAuRG9jKFIiZG9jKAogU2hpZnRzIHRoZSBpbnB1dCBsZWZ0IHVudGlsIHRoZSBhbXBsaXR1ZGUgaXMgbWF4aW1pemVkIHdpdGhvdXQgY2xpcHBpbmcuIFJldHVybnMKZGlmZiAtLWdpdCBhL3NpZ25hbC90ZW5zb3JmbG93X2NvcmUvb3BzL2ZpbHRlcl9iYW5rX29wcy5jYyBiL3NpZ25hbC90ZW5zb3JmbG93X2NvcmUvb3BzL2ZpbHRlcl9iYW5rX29wcy5jYwppbmRleCBkZTE2NzE1Li43ZTAyMWZmIDEwMDY0NAotLS0gYS9zaWduYWwvdGVuc29yZmxvd19jb3JlL29wcy9maWx0ZXJfYmFua19vcHMuY2MKKysrIGIvc2lnbmFsL3RlbnNvcmZsb3dfY29yZS9vcHMvZmlsdGVyX2Jhbmtfb3BzLmNjCkBAIC0yMiw3ICsyMiw3IEBACiBuYW1lc3BhY2UgdGVuc29yZmxvdyB7CiBuYW1lc3BhY2Ugc2lnbmFsIHsKIAotU3RhdHVzIEZpbHRlckJhbmtTaGFwZShJbmZlcmVuY2VDb250ZXh0KiBjKSB7CithYnNsOjpTdGF0dXMgRmlsdGVyQmFua1NoYXBlKEluZmVyZW5jZUNvbnRleHQqIGMpIHsKICAgU2hhcGVIYW5kbGUgb3V0OwogICBzaGFwZV9pbmZlcmVuY2U6OkRpbWVuc2lvbkhhbmRsZSB1bnVzZWQ7CiAgIGludCBudW1fY2hhbm5lbHM7CkBAIC00OSw3ICs0OSw3IEBACiAgICAgICBjLT5XaXRoVmFsdWUoYy0+RGltKGMtPmlucHV0KDUpLCAwKSwgbnVtX2NoYW5uZWxzICsgMSwgJnVudXNlZCkpOwogICBURl9SRVRVUk5fSUZfRVJST1IoYy0+UmVwbGFjZURpbShvdXQsIDAsIGMtPk1ha2VEaW0obnVtX2NoYW5uZWxzKSwgJm91dCkpOwogICBjLT5zZXRfb3V0cHV0KDAsIG91dCk7Ci0gIHJldHVybiBPa1N0YXR1cygpOworICByZXR1cm4gYWJzbDo6T2tTdGF0dXMoKTsKIH0KIAogLy8gVE9ETyhiLzI4NjI1MDQ3Myk6IGNoYW5nZSBiYWNrIG5hbWUgYWZ0ZXIgbmFtZSBjbGFzaCByZXNvbHZlZApAQCAtOTIsNyArOTIsNyBAQAogICAgICAgU2hhcGVIYW5kbGUgb3V0OwogICAgICAgVEZfUkVUVVJOX0lGX0VSUk9SKGMtPldpdGhSYW5rKGMtPmlucHV0KDApLCAxLCAmb3V0KSk7CiAgICAgICBjLT5zZXRfb3V0cHV0KDAsIG91dCk7Ci0gICAgICByZXR1cm4gT2tTdGF0dXMoKTsKKyAgICAgIHJldHVybiBhYnNsOjpPa1N0YXR1cygpOwogICAgIH0pCiAgICAgLkRvYyhSImRvYygKIEFwcGxpZXMgYSBzcXVhcmUgcm9vdCB0byBlYWNoIGVsZW1lbnQgaW4gdGhlIGlucHV0IHRoZW4gc2hpZnQgcmlnaHQgYnkKQEAgLTEyMiw3ICsxMjIsNyBAQAogICAgICAgVEZfUkVUVVJOX0lGX0VSUk9SKGMtPldpdGhSYW5rKGMtPmlucHV0KDApLCAxLCAmb3V0KSk7CiAgICAgICBjLT5zZXRfb3V0cHV0KDAsIG91dCk7CiAgICAgICBjLT5zZXRfb3V0cHV0KDEsIG91dCk7Ci0gICAgICByZXR1cm4gT2tTdGF0dXMoKTsKKyAgICAgIHJldHVybiBhYnNsOjpPa1N0YXR1cygpOwogICAgIH0pCiAgICAgLkRvYyhSImRvYygKIEFwcGxpZXMgc3BlY3RyYWwgc3VidHJhY3Rpb24gdG8gYSBmaWx0ZXIgYmFuayBvdXRwdXQgb2Ygc2l6ZSBudW1fY2hhbm5lbHMKQEAgLTE1Miw3ICsxNTIsNyBAQAogICAgICAgU2hhcGVIYW5kbGUgb3V0OwogICAgICAgVEZfUkVUVVJOX0lGX0VSUk9SKGMtPldpdGhSYW5rKGMtPmlucHV0KDApLCAxLCAmb3V0KSk7CiAgICAgICBjLT5zZXRfb3V0cHV0KDAsIG91dCk7Ci0gICAgICByZXR1cm4gT2tTdGF0dXMoKTsKKyAgICAgIHJldHVybiBhYnNsOjpPa1N0YXR1cygpOwogICAgIH0pCiAgICAgLkRvYyhSImRvYygKIEFwcGxpZXMgbmF0dXJhbCBsb2cgdG8gZWFjaCBlbGVtZW50IGluIGlucHV0IHdpdGggcHJlLXNoaWZ0IGFuZCBwb3N0IHNjYWxpbmcuCmRpZmYgLS1naXQgYS9zaWduYWwvdGVuc29yZmxvd19jb3JlL29wcy9mcmFtZXJfb3AuY2MgYi9zaWduYWwvdGVuc29yZmxvd19jb3JlL29wcy9mcmFtZXJfb3AuY2MKaW5kZXggZWJhYzZlNy4uYmY3NzY5OSAxMDA2NDQKLS0tIGEvc2lnbmFsL3RlbnNvcmZsb3dfY29yZS9vcHMvZnJhbWVyX29wLmNjCisrKyBiL3NpZ25hbC90ZW5zb3JmbG93X2NvcmUvb3BzL2ZyYW1lcl9vcC5jYwpAQCAtMjIsNyArMjIsNyBAQAogbmFtZXNwYWNlIHRlbnNvcmZsb3cgewogbmFtZXNwYWNlIHNpZ25hbCB7CiAKLVN0YXR1cyBGcmFtZXJTaGFwZShJbmZlcmVuY2VDb250ZXh0KiBjKSB7CithYnNsOjpTdGF0dXMgRnJhbWVyU2hhcGUoSW5mZXJlbmNlQ29udGV4dCogYykgewogICBTaGFwZUhhbmRsZSB1bnVzZWQ7CiAgIFNoYXBlSGFuZGxlIGluOwogICBpbnQgZnJhbWVfc3RlcCwgZnJhbWVfc2l6ZTsKQEAgLTQxLDcgKzQxLDcgQEAKICAgVEZfUkVUVVJOX0lGX0VSUk9SKGMtPlJlcGxhY2VEaW0ob3V0LCAtMSwgYy0+TWFrZURpbShmcmFtZV9zaXplKSwgJm91dCkpOwogICBjLT5zZXRfb3V0cHV0KDAsIG91dCk7CiAgIGMtPnNldF9vdXRwdXQoMSwgYy0+U2NhbGFyKCkpOwotICByZXR1cm4gT2tTdGF0dXMoKTsKKyAgcmV0dXJuIGFic2w6Ok9rU3RhdHVzKCk7CiB9CiAKIC8vIFRPRE8oYi8yODYyNTA0NzMpOiBjaGFuZ2UgYmFjayBuYW1lIGFmdGVyIG5hbWUgY2xhc2ggcmVzb2x2ZWQKZGlmZiAtLWdpdCBhL3NpZ25hbC90ZW5zb3JmbG93X2NvcmUvb3BzL292ZXJsYXBfYWRkX29wLmNjIGIvc2lnbmFsL3RlbnNvcmZsb3dfY29yZS9vcHMvb3ZlcmxhcF9hZGRfb3AuY2MKaW5kZXggNzU5ZmFhOS4uNzRjY2IxZiAxMDA2NDQKLS0tIGEvc2lnbmFsL3RlbnNvcmZsb3dfY29yZS9vcHMvb3ZlcmxhcF9hZGRfb3AuY2MKKysrIGIvc2lnbmFsL3RlbnNvcmZsb3dfY29yZS9vcHMvb3ZlcmxhcF9hZGRfb3AuY2MKQEAgLTIyLDcgKzIyLDcgQEAKIG5hbWVzcGFjZSB0ZW5zb3JmbG93IHsKIG5hbWVzcGFjZSBzaWduYWwgewogCi1TdGF0dXMgT3ZlcmxhcEFkZFNoYXBlKEluZmVyZW5jZUNvbnRleHQqIGMpIHsKK2Fic2w6OlN0YXR1cyBPdmVybGFwQWRkU2hhcGUoSW5mZXJlbmNlQ29udGV4dCogYykgewogICBzaGFwZV9pbmZlcmVuY2U6OkRpbWVuc2lvbkhhbmRsZSB1bnVzZWQ7CiAgIFNoYXBlSGFuZGxlIGluOwogICBTaGFwZUhhbmRsZSBvdXQ7CkBAIC0zOSw3ICszOSw3IEBACiAgICAgICAgIGMtPlJlcGxhY2VEaW0ob3V0LCAtMSwgYy0+TWFrZURpbShuX2ZyYW1lcyAqIGZyYW1lX3N0ZXApLCAmb3V0KSk7CiAgIH0KICAgYy0+c2V0X291dHB1dCgwLCBvdXQpOwotICByZXR1cm4gT2tTdGF0dXMoKTsKKyAgcmV0dXJuIGFic2w6Ok9rU3RhdHVzKCk7CiB9CiAKIC8vIFRPRE8oYi8yODYyNTA0NzMpOiBjaGFuZ2UgYmFjayBuYW1lIGFmdGVyIG5hbWUgY2xhc2ggcmVzb2x2ZWQKZGlmZiAtLWdpdCBhL3NpZ25hbC90ZW5zb3JmbG93X2NvcmUvb3BzL3BjYW5fb3AuY2MgYi9zaWduYWwvdGVuc29yZmxvd19jb3JlL29wcy9wY2FuX29wLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhODQ5MGYKLS0tIC9kZXYvbnVsbAorKysgYi9zaWduYWwvdGVuc29yZmxvd19jb3JlL29wcy9wY2FuX29wLmNjCkBAIC0wLDAgKzEsNjAgQEAKKy8qIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaW5jbHVkZSAidGVuc29yZmxvdy9jb3JlL2ZyYW1ld29yay9vcC5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvY29yZS9mcmFtZXdvcmsvc2hhcGVfaW5mZXJlbmNlLmgiCisKK3VzaW5nIDo6dGVuc29yZmxvdzo6c2hhcGVfaW5mZXJlbmNlOjpJbmZlcmVuY2VDb250ZXh0OwordXNpbmcgOjp0ZW5zb3JmbG93OjpzaGFwZV9pbmZlcmVuY2U6OlNoYXBlSGFuZGxlOworCituYW1lc3BhY2UgdGVuc29yZmxvdyB7CituYW1lc3BhY2Ugc2lnbmFsIHsKKworbmFtZXNwYWNlIHsKKworYWJzbDo6U3RhdHVzIFBjYW5TaGFwZShJbmZlcmVuY2VDb250ZXh0KiBjKSB7CisgIFNoYXBlSGFuZGxlIG91dCwgbHV0OworICBURl9SRVRVUk5fSUZfRVJST1IoYy0+V2l0aFJhbmsoYy0+aW5wdXQoMCksIDEsICZvdXQpKTsKKyAgVEZfUkVUVVJOX0lGX0VSUk9SKGMtPldpdGhSYW5rKGMtPmlucHV0KDEpLCAxLCAmb3V0KSk7CisgIFRGX1JFVFVSTl9JRl9FUlJPUihjLT5XaXRoUmFuayhjLT5pbnB1dCgyKSwgMSwgJmx1dCkpOworCisgIGMtPnNldF9vdXRwdXQoMCwgb3V0KTsKKyAgcmV0dXJuIGFic2w6Ok9rU3RhdHVzKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitSRUdJU1RFUl9PUCgiU2lnbmFsUENBTiIpCisgICAgLkF0dHIoInNucl9zaGlmdDogaW50IikKKyAgICAuSW5wdXQoImlucHV0OiB1aW50MzIiKQorICAgIC5JbnB1dCgibm9pc2VfZXN0aW1hdGU6IHVpbnQzMiIpCisgICAgLklucHV0KCJnYWluX2x1dDogaW50MTYiKQorICAgIC5PdXRwdXQoIm91dHB1dDogdWludDMyIikKKyAgICAuU2V0U2hhcGVGbihQY2FuU2hhcGUpCisgICAgLkRvYyhSImRvYygKK0RldGVybWluZXMgd2hldGhlciBwZXItY2hhbm5lbCBhbXBsaXR1ZGUtbm9ybWFsaXplZCAoUENBTikgYXV0byBnYWluIGNvbnRyb2wgaXMKK2FwcGxpZWQsIHVzaW5nIGVpdGhlciBmbG9hdGluZy1wb2ludCBvciBmaXhlZC1wb2ludCBjb21wdXRhdGlvbi4gSWYgZW5hYmxlZCwKK3RoZSBkeW5hbWljIHJhbmdlIG9mIHRoZSBmaWx0ZXJiYW5rIG91dHB1dCBpcyBjb21wcmVzc2VkIGJ5IGRpdmlkaW5nIGJ5IGEgcG93ZXIKK29mIHRoZSBub2lzZSBlc3RpbWF0ZS4KKworaW5wdXQ6IEEgMS1EIGFycmF5IG9mIG1lbC1zcGVjdHJ1bSBzdWJiYW5kIGZpbHRlciBiYW5rIG91dHB1dHMuCitub2lzZV9lc3RpbWF0ZTogQSAxLUQgYXJyYXkgb2YgbWVsLXNwZWN0cnVuIHN1YmJhYmQgbm9pc2UgZXN0aW1hdGVzLgorZ2Fpbl9sdXQ6IEEgMS1EIGxvb2t1cCB0YWJsZSBmb3IgZ2FpbiBjYWxjdWxhdGlvbi4KK291dHB1dDogQSAxLUQgYXJyYXkgb2YgcHJvY2Vzc2VkIHN1YmJhbmQgZmlsdGVyIGJhbmsuCitzbnJfc2hpZnQ6IEFtb3VudCBvZiByaWdodCBzaGlmdCB3aGVuIGNhbGN1bGNhdGluZyB0aGUgU05SLgorKWRvYyIpOworCit9ICAvLyBuYW1lc3BhY2Ugc2lnbmFsCit9ICAvLyBuYW1lc3BhY2UgdGVuc29yZmxvdwpkaWZmIC0tZ2l0IGEvc2lnbmFsL3RlbnNvcmZsb3dfY29yZS9vcHMvc3RhY2tlcl9vcC5jYyBiL3NpZ25hbC90ZW5zb3JmbG93X2NvcmUvb3BzL3N0YWNrZXJfb3AuY2MKaW5kZXggMmFhNjljMC4uNWZkMmFjYSAxMDA2NDQKLS0tIGEvc2lnbmFsL3RlbnNvcmZsb3dfY29yZS9vcHMvc3RhY2tlcl9vcC5jYworKysgYi9zaWduYWwvdGVuc29yZmxvd19jb3JlL29wcy9zdGFja2VyX29wLmNjCkBAIC0yMiw3ICsyMiw3IEBACiBuYW1lc3BhY2UgdGVuc29yZmxvdyB7CiBuYW1lc3BhY2Ugc2lnbmFsIHsKIAotU3RhdHVzIFN0YWNrZXJTaGFwZShJbmZlcmVuY2VDb250ZXh0KiBjKSB7CithYnNsOjpTdGF0dXMgU3RhY2tlclNoYXBlKEluZmVyZW5jZUNvbnRleHQqIGMpIHsKICAgaW50IG51bV9jaGFubmVscywgc3RhY2tlcl9sZWZ0X2NvbnRleHQsIHN0YWNrZXJfcmlnaHRfY29udGV4dDsKICAgVEZfUkVUVVJOX0lGX0VSUk9SKGMtPkdldEF0dHI8aW50PigibnVtX2NoYW5uZWxzIiwgJm51bV9jaGFubmVscykpOwogICBURl9SRVRVUk5fSUZfRVJST1IoCkBAIC00MSw3ICs0MSw3IEBACiAgICAgICBjLT5SZXBsYWNlRGltKG91dCwgMCwgYy0+TWFrZURpbShudW1fY2hhbm5lbHMgKiBvdXRwdXRfZnJhbWVzKSwgJm91dCkpOwogICBjLT5zZXRfb3V0cHV0KDAsIG91dCk7CiAgIGMtPnNldF9vdXRwdXQoMSwgYy0+U2NhbGFyKCkpOwotICByZXR1cm4gT2tTdGF0dXMoKTsKKyAgcmV0dXJuIGFic2w6Ok9rU3RhdHVzKCk7CiB9CiAKIC8vIFRPRE8oYi8yODYyNTA0NzMpOiBjaGFuZ2UgYmFjayBuYW1lIGFmdGVyIG5hbWUgY2xhc2ggcmVzb2x2ZWQKZGlmZiAtLWdpdCBhL3NpZ25hbC90ZW5zb3JmbG93X2NvcmUvb3BzL3dpbmRvd19vcC5jYyBiL3NpZ25hbC90ZW5zb3JmbG93X2NvcmUvb3BzL3dpbmRvd19vcC5jYwppbmRleCAyNGU1MWIyLi41YTA4ZGE4IDEwMDY0NAotLS0gYS9zaWduYWwvdGVuc29yZmxvd19jb3JlL29wcy93aW5kb3dfb3AuY2MKKysrIGIvc2lnbmFsL3RlbnNvcmZsb3dfY29yZS9vcHMvd2luZG93X29wLmNjCkBAIC0yMiw3ICsyMiw3IEBACiBuYW1lc3BhY2UgdGVuc29yZmxvdyB7CiBuYW1lc3BhY2Ugc2lnbmFsIHsKIAotU3RhdHVzIFdpbmRvd1NoYXBlKEluZmVyZW5jZUNvbnRleHQqIGMpIHsKK2Fic2w6OlN0YXR1cyBXaW5kb3dTaGFwZShJbmZlcmVuY2VDb250ZXh0KiBjKSB7CiAgIFNoYXBlSGFuZGxlIG91dDsKICAgVEZfUkVUVVJOX0lGX0VSUk9SKGMtPldpdGhSYW5rKGMtPmlucHV0KDEpLCAxLCAmb3V0KSk7CiAgIFRGX1JFVFVSTl9JRl9FUlJPUihjLT5XaXRoUmFua0F0TGVhc3QoYy0+aW5wdXQoMCksIDEsICZvdXQpKTsKQEAgLTMzLDcgKzMzLDcgQEAKICAgVEZfUkVUVVJOX0lGX0VSUk9SKGMtPldpdGhWYWx1ZShjLT5EaW0oYy0+aW5wdXQoMSksIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZmVyZW5jZUNvbnRleHQ6OlZhbHVlKGRpbV9pbiksICZkaW1faW4pKTsKICAgYy0+c2V0X291dHB1dCgwLCBvdXQpOwotICByZXR1cm4gT2tTdGF0dXMoKTsKKyAgcmV0dXJuIGFic2w6Ok9rU3RhdHVzKCk7CiB9CiAKIC8vIFRPRE8oYi8yODYyNTA0NzMpOiBjaGFuZ2UgYmFjayBuYW1lIHRvICJXaW5kb3ciIGFmdGVyIG5hbWUgY2xhc2ggcmVzb2x2ZWQKQEAgLTU1LDQgKzU1LDQgQEAKIClkb2MiKTsKIAogfSAgLy8gbmFtZXNwYWNlIHNpZ25hbAotfSAgLy8gbmFtZXNwYWNlIHRlbnNvcmZsb3cKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9ICAvLyBuYW1lc3BhY2UgdGVuc29yZmxvdwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9jb21waWxlci9tbGlyL2xpdGUva2VybmVscy9pbnRlcm5hbC9CVUlMRCBiL3RlbnNvcmZsb3cvY29tcGlsZXIvbWxpci9saXRlL2tlcm5lbHMvaW50ZXJuYWwvQlVJTEQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGViYmMyMQotLS0gL2Rldi9udWxsCisrKyBiL3RlbnNvcmZsb3cvY29tcGlsZXIvbWxpci9saXRlL2tlcm5lbHMvaW50ZXJuYWwvQlVJTEQKQEAgLTAsMCArMSwxMCBAQAorcGFja2FnZSgKKyAgICBkZWZhdWx0X3Zpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKKyAgICBsaWNlbnNlcyA9IFsibm90aWNlIl0sCispCisKK2NjX2xpYnJhcnkoCisgICAgbmFtZSA9ICJjb21wYXRpYmlsaXR5X21hY3JvcyIsCisgICAgaGRycyA9IFsiY29tcGF0aWJpbGl0eV9tYWNyb3MuaCJdLAorICAgIGRlcHMgPSBbIi8vdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWw6Y29tcGF0aWJpbGl0eSJdLAorKQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9zaW1wbGVfZmVhdHVyZXMvc2ltcGxlX21vZGVsX3NldHRpbmdzLmNjIGIvdGVuc29yZmxvdy9jb21waWxlci9tbGlyL2xpdGUva2VybmVscy9pbnRlcm5hbC9jb21wYXRpYmlsaXR5X21hY3Jvcy5oCnNpbWlsYXJpdHkgaW5kZXggNjAlCmNvcHkgZnJvbSB0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy9zaW1wbGVfbW9kZWxfc2V0dGluZ3MuY2MKY29weSB0byB0ZW5zb3JmbG93L2NvbXBpbGVyL21saXIvbGl0ZS9rZXJuZWxzL2ludGVybmFsL2NvbXBhdGliaWxpdHlfbWFjcm9zLmgKaW5kZXggZTJjZjY2MS4uNWQwNzM4MCAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9zaW1wbGVfZmVhdHVyZXMvc2ltcGxlX21vZGVsX3NldHRpbmdzLmNjCisrKyBiL3RlbnNvcmZsb3cvY29tcGlsZXIvbWxpci9saXRlL2tlcm5lbHMvaW50ZXJuYWwvY29tcGF0aWJpbGl0eV9tYWNyb3MuaApAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAyMDE4IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgMjAyNCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTEzLDExICsxMyw5IEBACiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy9zaW1wbGVfbW9kZWxfc2V0dGluZ3MuaCIKKyNpZm5kZWYgVEVOU09SRkxPV19DT01QSUxFUl9NTElSX0xJVEVfS0VSTkVMU19JTlRFUk5BTF9DT01QQVRBQklMSVRZX01BQ1JPU19IXworI2RlZmluZSBURU5TT1JGTE9XX0NPTVBJTEVSX01MSVJfTElURV9LRVJORUxTX0lOVEVSTkFMX0NPTVBBVEFCSUxJVFlfTUFDUk9TX0hfCiAKLWNvbnN0IGNoYXIqIGtDYXRlZ29yeUxhYmVsc1trQ2F0ZWdvcnlDb3VudF0gPSB7Ci0gICAgInNpbGVuY2UiLAotICAgICJ1bmtub3duIiwKLSAgICAieWVzIiwKLSAgICAibm8iLAotfTsKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9jb21wYXRpYmlsaXR5LmgiICAvLyBJV1lVIHByYWdtYToga2VlcAorCisjZW5kaWYgIC8vIFRFTlNPUkZMT1dfQ09NUElMRVJfTUxJUl9MSVRFX0tFUk5FTFNfSU5URVJOQUxfQ09NUEFUQUJJTElUWV9NQUNST1NfSF8KZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvY29tcGlsZXIvbWxpci9saXRlL3NjaGVtYS9CVUlMRCBiL3RlbnNvcmZsb3cvY29tcGlsZXIvbWxpci9saXRlL3NjaGVtYS9CVUlMRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTQ3MjZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVuc29yZmxvdy9jb21waWxlci9tbGlyL2xpdGUvc2NoZW1hL0JVSUxECkBAIC0wLDAgKzEsNDEgQEAKK2xvYWQoIkBmbGF0YnVmZmVycy8vOmJ1aWxkX2RlZnMuYnpsIiwgImZsYXRidWZmZXJfY2NfbGlicmFyeSIpCisKK3BhY2thZ2UoCisgICAgZGVmYXVsdF92aXNpYmlsaXR5ID0gWworICAgICAgICAiLy92aXNpYmlsaXR5OnB1YmxpYyIsCisgICAgXSwKKyAgICBsaWNlbnNlcyA9IFsibm90aWNlIl0sCispCisKK2V4cG9ydHNfZmlsZXMoCisgICAgc3JjcyA9IFsic2NoZW1hLmZicyJdLAorKQorCitmbGF0YnVmZmVyX2NjX2xpYnJhcnkoCisgICAgbmFtZSA9ICJzY2hlbWFfZmJzIiwKKyAgICBzcmNzID0gWyJzY2hlbWEuZmJzIl0sCispCisKKyMgR2VuZXJpYyBzY2hlbWEgZm9yIGluZmVyZW5jZSBvbiBkZXZpY2UgKGJ1dCB3aXRoIHJlZmxlY3Rpb25zIG1ha2VzIGJpZ2dlcikuCitmbGF0YnVmZmVyX2NjX2xpYnJhcnkoCisgICAgbmFtZSA9ICJzY2hlbWFfZmJzX3dpdGhfcmVmbGVjdGlvbiIsCisgICAgc3JjcyA9IFsic2NoZW1hLmZicyJdLAorICAgIGZsYXRjX2FyZ3MgPSBbCisgICAgICAgICItLXJlZmxlY3QtdHlwZXMiLAorICAgICAgICAiLS1yZWZsZWN0LW5hbWVzIiwKKyAgICAgICAgIi0tbm8tdW5pb24tdmFsdWUtbmFtZXNwYWNpbmciLAorICAgICAgICAiLS1nZW4tb2JqZWN0LWFwaSIsCisgICAgXSwKKyAgICBvdXRfcHJlZml4ID0gInJlZmxlY3Rpb24vIiwKKykKKworY2NfbGlicmFyeSgKKyAgICBuYW1lID0gInNjaGVtYV91dGlscyIsCisgICAgc3JjcyA9IFsic2NoZW1hX3V0aWxzLmNjIl0sCisgICAgaGRycyA9IFsic2NoZW1hX3V0aWxzLmgiXSwKKyAgICBkZXBzID0gWworICAgICAgICAiOnNjaGVtYV9mYnMiLAorICAgICAgICAiLy90ZW5zb3JmbG93L2NvbXBpbGVyL21saXIvbGl0ZS9rZXJuZWxzL2ludGVybmFsOmNvbXBhdGliaWxpdHlfbWFjcm9zIiwKKyAgICAgICAgIkBmbGF0YnVmZmVycy8vOnJ1bnRpbWVfY2MiLAorICAgIF0sCispCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvc2NoZW1hL3NjaGVtYS5mYnMgYi90ZW5zb3JmbG93L2NvbXBpbGVyL21saXIvbGl0ZS9zY2hlbWEvc2NoZW1hLmZicwpzaW1pbGFyaXR5IGluZGV4IDc5JQpyZW5hbWUgZnJvbSB0ZW5zb3JmbG93L2xpdGUvc2NoZW1hL3NjaGVtYS5mYnMKcmVuYW1lIHRvIHRlbnNvcmZsb3cvY29tcGlsZXIvbWxpci9saXRlL3NjaGVtYS9zY2hlbWEuZmJzCmluZGV4IDRjODQ2NDYuLjdhYjc4YmUgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9zY2hlbWEvc2NoZW1hLmZicworKysgYi90ZW5zb3JmbG93L2NvbXBpbGVyL21saXIvbGl0ZS9zY2hlbWEvc2NoZW1hLmZicwpAQCAtNTgsNiArNTgsNyBAQAogICBVSU5UMzIgPSAxNSwKICAgVUlOVDE2ID0gMTYsCiAgIElOVDQgPSAxNywKKyAgQkZMT0FUMTYgPSAxOCwKIH0KIAogLy8gQ3VzdG9tIHF1YW50aXphdGlvbiBwYXJhbWV0ZXJzIGZvciBleHBlcmltZW50aW5nIHdpdGggbmV3IHF1YW50aXphdGlvbgpAQCAtMjM1LDggKzIzNiwxMiBAQAogICAvLyByZXByZXNlbnRlZCB3aXRoIC0xLgogICBzaGFwZV9zaWduYXR1cmU6W2ludF07IC8vIE9wdGlvbmFsLgogCi0gIC8vIElmIGZhbHNlLCB0aGUgcmFuayBvciB0aGUgbnVtYmVyIG9mIHRlbnNvciBkaW1lbnNpb25zIGlzIHVua25vd24uCi0gIC8vIElmIGZhbHNlLCAic2hhcGUiIG11c3QgYmUgW10uCisgIC8vIFRoaXMgZmllbGQgaXMgYWRkZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBzY2FsYXJzIGFuZCB0ZW5zb3JzIG9mIHVua25vd24KKyAgLy8gcmFua3MgKGJvdGggb2Ygd2hpY2ggc2hhcGUgaXMgW10pLgorICAvLyBGb3Igc2NhbGFycyAocmFuayA9IDApLCBzaGFwZSA9IFtdIGFuZCBoYXNfcmFuayA9IHRydWUuCisgIC8vIEZvciB0ZW5zb3JzIHdpdGgga25vd24gcmFuayAocmFuayA+IDApIGFuZCBzaGFwZSwgc2hhcGUgPSBbLi4uXSBhbmQKKyAgLy8gaGFzX3JhbmsgPSB0cnVlLgorICAvLyBGb3IgdGVuc29ycyB3aXRoIHVua25vd24gcmFuayBhbmQgc2hhcGUsIHNoYXBlID0gW10gYW5kIGhhc19yYW5rID0gZmFsc2UuCiAgIGhhc19yYW5rOiBib29sID0gZmFsc2U7CiAKICAgLy8gVGhlIG5lc3RlZCBUZW5zb3IgdHlwZXMgZm9yIFZBUklBTlQgdHlwZS4gVGhpcyBpcyBhbHdheXMgZW1wdHkgZm9yCkBAIC00MjAsNiArNDI1LDUzIEBACiAgIEJJVENBU1QgPSAxNTksCiAgIEJJVFdJU0VfWE9SID0gMTYwLAogICBSSUdIVF9TSElGVCA9IDE2MSwKKyAgLy8gQWxsIE9wZXJhdG9ycyBzdGFydCB3aXRoIFNUQUJMRUhMT18gcHJlZml4ZXMgYXJlIHN1YmplY3QgdG8gY2hhbmdlCisgIC8vIE1hbnkgb2YgdGhlIG9wcyBiZWxvdyBjYW4gbm90IGJlIGV4ZWN1dGVkIGJ5IFRGbGl0ZSBydW50aW1lCisgIFNUQUJMRUhMT19MT0dJU1RJQyA9IDE2MiwgLy8gV0FSTklORzogRG8gbm90IGhhdmUgcnVudGltZSBzdXBwb3J0CisgIFNUQUJMRUhMT19BREQgPSAxNjMsCisgIFNUQUJMRUhMT19ESVZJREUgPSAxNjQsIC8vIFdBUk5JTkc6IE5vIHJ1bnRpbWUgc3VwcG9ydCB5ZXQKKyAgU1RBQkxFSExPX01VTFRJUExZID0gMTY1LAorICBTVEFCTEVITE9fTUFYSU1VTSA9IDE2NiwKKyAgU1RBQkxFSExPX1JFU0hBUEUgPSAxNjcsIC8vIFdBUk5JTkc6IE5vIHJ1bnRpbWUgc3VwcG9ydCB5ZXQKKyAgU1RBQkxFSExPX0NMQU1QID0gMTY4LCAvLyBXQVJOSU5HOiBObyBydW50aW1lIHN1cHBvcnQKKyAgU1RBQkxFSExPX0NPTkNBVEVOQVRFID0gMTY5LCAvLyBXQVJOSU5HOiBObyBydW50aW1lIHN1cHBvcnQKKyAgU1RBQkxFSExPX0JST0FEQ0FTVF9JTl9ESU0gPSAxNzAsIC8vIFdBUk5JTkc6IE5vIHJ1bnRpbWUgc3VwcG9ydAorICBTVEFCTEVITE9fQ09OVk9MVVRJT04gPSAxNzEsIC8vIFdBUk5JTkc6IE5vIHJ1bnRpbWUgc3VwcG9ydAorICBTVEFCTEVITE9fU0xJQ0UgPSAxNzIsIC8vIFdBUk5JTkc6IE5vIHJ1bnRpbWUgc3VwcG9ydAorICBTVEFCTEVITE9fQ1VTVE9NX0NBTEwgPSAxNzMsIC8vIFdBUk5JTkc6IE5vIHJ1bnRpbWUgc3VwcG9ydAorICBTVEFCTEVITE9fUkVEVUNFID0gMTc0LCAvLyBXQVJOSU5HOiBObyBydW50aW1lIHN1cHBvcnQKKyAgU1RBQkxFSExPX0FCUyA9IDE3NSwgLy8gV0FSTklORzogTm8gcnVudGltZSBzdXBwb3J0CisgIFNUQUJMRUhMT19BTkQgPSAxNzYsIC8vIFdBUk5JTkc6IE5vIHJ1bnRpbWUgc3VwcG9ydAorICBTVEFCTEVITE9fQ09TSU5FID0gMTc3LCAvLyBXQVJOSU5HOiBObyBydW50aW1lIHN1cHBvcnQKKyAgU1RBQkxFSExPX0VYUE9ORU5USUFMID0gMTc4LCAvLyBXQVJOSU5HOiBObyBydW50aW1lIHN1cHBvcnQKKyAgU1RBQkxFSExPX0ZMT09SID0gMTc5LCAvLyBXQVJOSU5HOiBObyBydW50aW1lIHN1cHBvcnQKKyAgU1RBQkxFSExPX0xPRyA9IDE4MCwgLy8gV0FSTklORzogTm8gcnVudGltZSBzdXBwb3J0CisgIFNUQUJMRUhMT19NSU5JTVVNID0gMTgxLAorICBTVEFCTEVITE9fTkVHQVRFID0gMTgyLCAvLyBXQVJOSU5HOiBObyBydW50aW1lIHN1cHBvcnQKKyAgU1RBQkxFSExPX09SID0gMTgzLCAvLyBXQVJOSU5HOiBObyBydW50aW1lIHN1cHBvcnQKKyAgU1RBQkxFSExPX1BPV0VSID0gMTg0LCAvLyBXQVJOSU5HOiBObyBydW50aW1lIHN1cHBvcnQKKyAgU1RBQkxFSExPX1JFTUFJTkRFUiA9IDE4NSwgLy8gV0FSTklORzogTm8gcnVudGltZSBzdXBwb3J0CisgIFNUQUJMRUhMT19SU1FSVCA9IDE4NiwgLy8gV0FSTklORzogTm8gcnVudGltZSBzdXBwb3J0CisgIFNUQUJMRUhMT19TRUxFQ1QgPSAxODcsIC8vIFdBUk5JTkc6IE5vIHJ1bnRpbWUgc3VwcG9ydAorICBTVEFCTEVITE9fU1VCVFJBQ1QgPSAxODgsIC8vIFdBUk5JTkc6IE5vIHJ1bnRpbWUgc3VwcG9ydAorICBTVEFCTEVITE9fVEFOSCA9IDE4OSwgLy8gV0FSTklORzogTm8gcnVudGltZSBzdXBwb3J0CisgIFNUQUJMRUhMT19TQ0FUVEVSID0gMTkwLAorICBTVEFCTEVITE9fQ09NUEFSRSA9IDE5MSwgLy8gV0FSTklORzogTm8gcnVudGltZSBzdXBwb3J0CisgIFNUQUJMRUhMT19DT05WRVJUID0gMTkyLCAvLyBXQVJOSU5HOiBObyBydW50aW1lIHN1cHBvcnQKKyAgU1RBQkxFSExPX0RZTkFNSUNfU0xJQ0UgPSAxOTMsIC8vIFdBUk5JTkc6IE5vIHJ1bnRpbWUgc3VwcG9ydAorICBTVEFCTEVITE9fRFlOQU1JQ19VUERBVEVfU0xJQ0UgPSAxOTQsIC8vIFdBUk5JTkc6IE5vIHJ1bnRpbWUgc3VwcG9ydAorICBTVEFCTEVITE9fUEFEID0gMTk1LAorICBTVEFCTEVITE9fSU9UQSA9IDE5NiwgLy8gV0FSTklORzogTm8gcnVudGltZSBzdXBwb3J0CisgIFNUQUJMRUhMT19ET1RfR0VORVJBTCA9IDE5NywgLy8gV0FSTklORzogTm8gcnVudGltZSBzdXBwb3J0CisgIFNUQUJMRUhMT19SRURVQ0VfV0lORE9XID0gMTk4LAorICBTVEFCTEVITE9fU09SVCA9IDE5OSwgLy8gV0FSTklORzogTm8gcnVudGltZSBzdXBwb3J0CisgIFNUQUJMRUhMT19XSElMRSA9IDIwMCwgLy8gV0FSTklORzogTm8gcnVudGltZSBzdXBwb3J0CisgIFNUQUJMRUhMT19HQVRIRVIgPSAyMDEsCisgIFNUQUJMRUhMT19UUkFOU1BPU0UgPSAyMDIsIC8vIFdBUk5JTkc6IE5vIHJ1bnRpbWUgc3VwcG9ydAorICBESUxBVEUgPSAyMDMsCisgIFNUQUJMRUhMT19STkdfQklUX0dFTkVSQVRPUiA9IDIwNCwKKyAgUkVEVUNFX1dJTkRPVyA9IDIwNSAoZGVwcmVjYXRlZCksCisgIFNUQUJMRUhMT19DT01QT1NJVEUgPSAyMDYsIC8vIFdBUk5JTkc6IE5vIHJ1bnRpbWUgc3VwcG9ydAogfQogLy8gTElOVC5UaGVuQ2hhbmdlKG5uYXBpX2xpbnRlci9saW50ZXIucHJvdG8pCiAKQEAgLTU1MSw2ICs2MDMsMTkyIEBACiAgIEJpdGNhc3RPcHRpb25zLAogICBCaXR3aXNlWG9yT3B0aW9ucywKICAgUmlnaHRTaGlmdE9wdGlvbnMsCisgIC8vIERPIE5PVCBhZGQgbmV3IG9wdGlvbnMgdGhpcyB1bmlvbiwgd2lsbCBjYXVzZSBmYWlsdXJlIGluIEphdmEgYXBpCisgIC8vIGdlbmVyYXRpb24gb3RoZXJ3aXNlCisgIC8vIEFkZCBuZXcgYnVpbHRpbiBvcHRpb25zIGludG8gYnVpbHRpbiBvcHRpb25zIDIgaW5zdGVhZAorfQorCit1bmlvbiBCdWlsdGluT3B0aW9uczJ7CisgIFN0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9ucywKKyAgU3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zLAorICBTdGFibGVobG9TbGljZU9wdGlvbnMsCisgIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucywKKyAgU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnMsCisgIFN0YWJsZWhsb1JlZHVjZU9wdGlvbnMsCisgIFN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zLAorICBTdGFibGVobG9Db21wYXJlT3B0aW9ucywKKyAgU3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9ucywKKyAgU3RhYmxlaGxvUGFkT3B0aW9ucywKKyAgU3RhYmxlaGxvSW90YU9wdGlvbnMsCisgIFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zLAorICBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zLAorICBTdGFibGVobG9Tb3J0T3B0aW9ucywKKyAgU3RhYmxlaGxvV2hpbGVPcHRpb25zLAorICBTdGFibGVobG9HYXRoZXJPcHRpb25zLAorICBTdGFibGVobG9UcmFuc3Bvc2VPcHRpb25zLAorICBEaWxhdGVPcHRpb25zLAorICBTdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zLAorICBSZWR1Y2VXaW5kb3dPcHRpb25zIChkZXByZWNhdGVkKSwKKyAgU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9ucywKK30KKwordGFibGUgU3RhYmxlaGxvR2F0aGVyT3B0aW9uc3sKKyAgb2Zmc2V0X2RpbXMgOiBbbG9uZ107CisgIGNvbGxhcHNlZF9zbGljZV9kaW1zIDogW2xvbmddOworICBzdGFydF9pbmRleF9tYXAgOiBbbG9uZ107CisgIGluZGV4X3ZlY3Rvcl9kaW0gOiBsb25nOworICBzbGljZV9zaXplcyA6IFtsb25nXTsKKyAgaW5kaWNlc19hcmVfc29ydGVkIDogYm9vbDsKK30KKwordGFibGUgU3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9uc3sKKyAgcGVybXV0YXRpb24gOiBbbG9uZ107Cit9CisKK2VudW0gU3RhYmxlaGxvUHJlY2lzaW9uQ29uZmlnIDogdWludCB7CisgIERFRkFVTFQsCisgIEhJR0gsCisgIEhJR0hFU1QsCit9CisKK3RhYmxlIFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zeworICBsaHNfYmF0Y2hpbmdfZGltZW5zaW9ucyA6IFtsb25nXTsKKyAgcmhzX2JhdGNoaW5nX2RpbWVuc2lvbnMgOiBbbG9uZ107CisgIGxoc19jb250cmFjdGluZ19kaW1lbnNpb25zIDogW2xvbmddOworICByaHNfY29udHJhY3RpbmdfZGltZW5zaW9ucyA6IFtsb25nXTsKKyAgcHJlY2lzaW9uX2NvbmZpZyA6IFtTdGFibGVobG9QcmVjaXNpb25Db25maWddOworfQorCit0YWJsZSBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zeworICB3aW5kb3dfZGltZW5zaW9ucyA6IFtsb25nXTsKKyAgd2luZG93X3N0cmlkZXMgOiBbbG9uZ107CisgIGJhc2VfZGlsYXRpb25zIDogW2xvbmddOworICB3aW5kb3dfZGlsYXRpb25zIDogW2xvbmddOworICBwYWRkaW5nIDogW2xvbmddOworICBib2R5X3N1YmdyYXBoX2luZGV4IDogaW50OworfQorCit0YWJsZSBTdGFibGVobG9XaGlsZU9wdGlvbnN7CisgIGNvbmRfc3ViZ3JhcGhfaW5kZXggOiBpbnQ7CisgIGJvZHlfc3ViZ3JhcGhfaW5kZXggOiBpbnQ7Cit9CisKK3RhYmxlIFN0YWJsZWhsb1NvcnRPcHRpb25zeworICBkaW1lbnNpb24gOiBsb25nOworICBpc19zdGFibGUgOiBib29sOworICBjb21wYXJhdG9yX3N1YmdyYXBoX2luZGV4IDogaW50OworfQorCit0YWJsZSBTdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnMgeworICBkaW1lbnNpb24gOiBsb25nOworfQorCit0YWJsZSBTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnN7CisgIGJyb2FkY2FzdF9kaW1lbnNpb25zIDogW2xvbmddOworfQorCitlbnVtIFN0YWJsZWhsb0NvbXBhcmlzb25EaXJlY3Rpb24gOiB1aW50IHsKKyAgU1RBQkxFSExPX0NPTVBBUklTT05fRElSRUNUSU9OX0VRLAorICBTVEFCTEVITE9fQ09NUEFSSVNPTl9ESVJFQ1RJT05fTkUsCisgIFNUQUJMRUhMT19DT01QQVJJU09OX0RJUkVDVElPTl9HRSwKKyAgU1RBQkxFSExPX0NPTVBBUklTT05fRElSRUNUSU9OX0dULAorICBTVEFCTEVITE9fQ09NUEFSSVNPTl9ESVJFQ1RJT05fTEUsCisgIFNUQUJMRUhMT19DT01QQVJJU09OX0RJUkVDVElPTl9MVCwKKworfQorCitlbnVtIFN0YWJsZWhsb0NvbXBhcmlzb25UeXBlIDogdWludCB7CisgIFNUQUJMRUhMT19DT01QQVJJU09OX1RZUEVfTk9UWVBFLAorICBTVEFCTEVITE9fQ09NUEFSSVNPTl9UWVBFX0ZMT0FULAorICBTVEFCTEVITE9fQ09NUEFSSVNPTl9UWVBFX0ZMT0FUX1RPVEFMX09SREVSLAorICBTVEFCTEVITE9fQ09NUEFSSVNPTl9UWVBFX1NJR05FRCwKKyAgU1RBQkxFSExPX0NPTVBBUklTT05fVFlQRV9VTlNJR05FRCwKK30KKwordGFibGUgU3RhYmxlaGxvQ29tcGFyZU9wdGlvbnN7CisgIGNvbXBhcmlzb25fZGlyZWN0aW9uIDogU3RhYmxlaGxvQ29tcGFyaXNvbkRpcmVjdGlvbjsKKyAgY29tcGFyZV90eXBlIDogU3RhYmxlaGxvQ29tcGFyaXNvblR5cGU7Cit9CisKK3RhYmxlIFN0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnN7CisgIHNsaWNlX3NpemVzIDogW2xvbmddOworfQorCit0YWJsZSBTdGFibGVobG9QYWRPcHRpb25zeworICBlZGdlX3BhZGRpbmdfbG93IDogW2xvbmddOworICBlZGdlX3BhZGRpbmdfaGlnaCA6IFtsb25nXTsKKyAgaW50ZXJpb3JfcGFkZGluZyA6IFtsb25nXTsKK30KKwordGFibGUgU3RhYmxlaGxvSW90YU9wdGlvbnN7CisgIGlvdGFfZGltZW5zaW9uIDogbG9uZzsKK30KKwordGFibGUgU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnMgeworICBjYWxsX3RhcmdldF9uYW1lIDogc3RyaW5nOworICBoYXNfc2lkZV9lZmZlY3QgOiBib29sOworICBiYWNrZW5kX2NvbmZpZzogc3RyaW5nOworICBhcGlfdmVyc2lvbiA6IGludDsgLy8gd2lsbCBiZSBkZWNwcmVjYXRlZAorICBjYWxsZWRfY29tcHV0YXRpb25zOiBbaW50XTsgLy8gc2hvdWxkIHBvaW50IHRvIHN1YmdyYXBocyBvZiB0aGUgY29tcHV0YXRpb25zCisgIGN1c3RvbV9hdHRyaWJ1dGVzIDogW3VieXRlXTsKK30KKwordGFibGUgU3RhYmxlaGxvUmVkdWNlT3B0aW9ucyB7CisgIGRpbWVuc2lvbnMgOiBbbG9uZ107CisgIGJvZHlfc3ViZ3JhcGhfaW5kZXggOiBpbnQ7Cit9CisKK3RhYmxlIFN0YWJsZWhsb1NsaWNlT3B0aW9uc3sKKyAgc3RhcnRfaW5kaWNlcyA6IFtsb25nXTsKKyAgbGltaXRfaW5kaWNlcyA6IFtsb25nXTsKKyAgc3RyaWRlcyA6IFtsb25nXTsKK30KKwordGFibGUgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zeworICB3aW5kb3dfc3RyaWRlcyA6IFtsb25nXTsKKyAgcGFkZGluZyA6IFtsb25nXTsKKyAgbGhzX2RpbGF0aW9uIDogW2xvbmddOworICByaHNfZGlsYXRpb24gOiBbbG9uZ107CisgIHdpbmRvd19yZXZlcnNhbCA6IFtib29sXTsKKyAgaW5wdXRfYmF0Y2hfZGltZW5zaW9uIDogbG9uZzsKKyAgaW5wdXRfZmVhdHVyZV9kaW1lbnNpb24gOiBsb25nOworICBpbnB1dF9zcGF0aWFsX2RpbWVuc2lvbnMgOiBbbG9uZ107CisgIGtlcm5lbF9pbnB1dF9mZWF0dXJlX2RpbWVuc2lvbiA6IGxvbmc7CisgIGtlcm5lbF9vdXRwdXRfZmVhdHVyZV9kaW1lbnNpb24gOiBsb25nOworICBrZXJuZWxfc3BhdGlhbF9kaW1lbnNpb25zIDogW2xvbmddOworICBvdXRwdXRfYmF0Y2hfZGltZW5zaW9uIDogbG9uZzsKKyAgb3V0cHV0X2ZlYXR1cmVfZGltZW5zaW9uIDogbG9uZzsKKyAgb3V0cHV0X3NwYXRpYWxfZGltZW5zaW9ucwk6IFtsb25nXTsKKyAgZmVhdHVyZV9ncm91cF9jb3VudCA6IGxvbmc7CisgIGJhdGNoX2dyb3VwX2NvdW50IDogbG9uZzsKKyAgcHJlY2lzaW9uX2NvbmZpZyA6IFtTdGFibGVobG9QcmVjaXNpb25Db25maWddOworfQorCit0YWJsZSBTdGFibGVobG9TY2F0dGVyT3B0aW9ucyB7CisgIGluZGljZXNfYXJlX3NvcnRlZDogYm9vbDsKKyAgdXBkYXRlX3dpbmRvd19kaW1zOiBbbG9uZ107CisgIGluc2VydGVkX3dpbmRvd19kaW1zOiBbbG9uZ107CisgIHNjYXR0ZXJfZGltc190b19vcGVyYW5kX2RpbXM6IFtsb25nXTsKKyAgaW5kZXhfdmVjdG9yX2RpbTogbG9uZzsKKyAgdW5pcXVlX2luZGljZXM6IGJvb2w7CisgIHVwZGF0ZV9jb21wdXRhdGlvbl9zdWJncmFwaF9pbmRleDogaW50OworfQorCitlbnVtIFJuZ0FsZ29yaXRobSA6IGJ5dGUgeworICAvLyBBbiBhbGdvcml0aG0gYXV0by1zZWxlY3RlZCBieSB0aGUgc3lzdGVtIGFjY29yZGluZyB0byBkZXZpY2UgdHlwZS4KKyAgREVGQVVMVCA9IDAsCisgIC8vIFRoZSBQaGlsb3ggYWxnb3JpdGhtLCBhcyBkZXNjcmliZWQgaW4gcGFwZXIKKyAgLy8gWydQYXJhbGxlbCBSYW5kb20gTnVtYmVyczogQXMgRWFzeSBhcyAxLCAyLCAzJ10KKyAgLy8gKGh0dHBzOi8vd3d3LnRoZXNhbG1vbnMub3JnL2pvaG4vcmFuZG9tMTIzL3BhcGVycy9yYW5kb20xMjNzYzExLnBkZikKKyAgUEhJTE9YID0gMSwKKyAgLy8gVGhlIFRocmVlRnJ5IGFsZ29yaXRobSwgYXMgZGVzY3JpYmVkIGluIHBhcGVyCisgIC8vIFsnUGFyYWxsZWwgUmFuZG9tIE51bWJlcnM6IEFzIEVhc3kgYXMgMSwgMiwgMyddCisgIC8vIChodHRwczovL3d3dy50aGVzYWxtb25zLm9yZy9qb2huL3JhbmRvbTEyMy9wYXBlcnMvcmFuZG9tMTIzc2MxMS5wZGYpCisgIFRIUkVFRlJZID0gMiwKK30KKwordGFibGUgU3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9ucyB7CisgIGFsZ29yaXRobTpSbmdBbGdvcml0aG07CiB9CiAKIC8vIExJTlQuSWZDaGFuZ2UKQEAgLTU3NSw2ICs4MTMsOSBAQAogICBmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uOkFjdGl2YXRpb25GdW5jdGlvblR5cGU7CiAgIGRpbGF0aW9uX3dfZmFjdG9yOmludCA9IDE7CiAgIGRpbGF0aW9uX2hfZmFjdG9yOmludCA9IDE7CisgIC8vIFBhcmFtZXRlcnMgZm9yIENvbnYyRCB2ZXJzaW9uIDggb3IgYWJvdmUuCisgIC8vIFdoZW4gc2V0LCBxdWFudGl6ZWRfYmlhc190eXBlIGRlZmluZXMgdGhlIGR0eXBlIGZvciBib3RoIGJpYXMgYW5kIGFjY3VtdWxhdG9yLgorICBxdWFudGl6ZWRfYmlhc190eXBlOiBUZW5zb3JUeXBlOwogfQogCiAvLyBPcHRpb25zIGZvciBib3RoIENvbnYzRCBhbmQgQ29udjNEVHJhbnNwb3NlLgpAQCAtNjgyLDYgKzkyMywxMCBAQAogICAvLyBJZiBzZXQgdG8gdHJ1ZSwgdGhlbiB3ZWlnaHRzLW9ubHkgb3Agd2lsbCB1c2UgYXN5bW1ldHJpYyBxdWFudGl6YXRpb24gZm9yCiAgIC8vIGlucHV0cy4KICAgYXN5bW1ldHJpY19xdWFudGl6ZV9pbnB1dHM6IGJvb2w7CisKKyAgLy8gUGFyYW1ldGVycyBmb3IgRnVsbHlDb25uZWN0ZWQgdmVyc2lvbiAxMSBvciBhYm92ZS4KKyAgLy8gV2hlbiBzZXQsIHF1YW50aXplZF9iaWFzX3R5cGUgZGVmaW5lcyB0aGUgZHR5cGUgZm9yIGJvdGggYmlhcyBhbmQgYWNjdW11bGF0b3IuCisgIHF1YW50aXplZF9iaWFzX3R5cGU6IFRlbnNvclR5cGU7CiB9CiAKIHRhYmxlIFNvZnRtYXhPcHRpb25zIHsKQEAgLTk0MSw2ICsxMTg2LDExIEBACiAKICAgLy8gUGFyYW1ldGVycyBzdXBwb3J0ZWQgYnkgdmVyc2lvbiA0OgogICBmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uOkFjdGl2YXRpb25GdW5jdGlvblR5cGUgPSBOT05FOworCisgIC8vIFBhcmFtZXRlcnMgZm9yIFRyYW5zcG9zZUNvbnYgdmVyc2lvbiA1IG9yIGFib3ZlLgorICAvLyBJZiBzZXQsIHVzZSB0aGlzIGZvciBiaWFzIGFuZCBhY2N1bXVsYXRvci4KKyAgLy8gV2hlbiBzZXQsIHF1YW50aXplZF9iaWFzX3R5cGUgZGVmaW5lcyB0aGUgZHR5cGUgZm9yIGJvdGggYmlhcyBhbmQgYWNjdW11bGF0b3IuCisgIHF1YW50aXplZF9iaWFzX3R5cGU6IFRlbnNvclR5cGU7CiB9CiAKIHRhYmxlIEV4cGFuZERpbXNPcHRpb25zIHsKQEAgLTExOTgsNiArMTQ0OCwyMyBAQAogdGFibGUgUmlnaHRTaGlmdE9wdGlvbnMgewogfQogCit0YWJsZSBEaWxhdGVPcHRpb25zIHsKK30KKworZW51bSBSZWR1Y2VXaW5kb3dGdW5jdGlvbiA6IGludCB7CisgIFVOU1VQUE9SVEVELAorICBBREQsCisgIE1VTCwKKyAgTUlOSU1VTSwKKyAgTUFYSU1VTSwKKyAgQUxMLAorICBBTlksCit9CisKK3RhYmxlIFJlZHVjZVdpbmRvd09wdGlvbnMgKGRlcHJlY2F0ZWQpIHsKKyAgcmVkdWNlX2Z1bmN0aW9uOiBSZWR1Y2VXaW5kb3dGdW5jdGlvbjsKK30KKwogLy8gQW4gT3BlcmF0b3JDb2RlIGNhbiBiZSBhbiBlbnVtIHZhbHVlIChCdWlsdGluT3BlcmF0b3IpIGlmIHRoZSBvcGVyYXRvciBpcyBhCiAvLyBidWlsdGluLCBvciBhIHN0cmluZyBpZiB0aGUgb3BlcmF0b3IgaXMgY3VzdG9tLgogdGFibGUgT3BlcmF0b3JDb2RlIHsKQEAgLTEyMjIsNiArMTQ4OSwxNCBAQAogICBGTEVYQlVGRkVSUyA9IDAsCiB9CiAKK3RhYmxlIFN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnMgeworICBuYW1lOnN0cmluZzsKKyAgZGVjb21wb3NpdGlvbl9zdWJncmFwaF9pbmRleDppbnQzMjsKKyAgY29tcG9zaXRlX2F0dHJpYnV0ZXM6W3VieXRlXTsKKyAgY29tcG9zaXRlX2F0dHJpYnV0ZXNfZm9ybWF0OkN1c3RvbU9wdGlvbnNGb3JtYXQ7CisgIHZlcnNpb246aW50MzI7Cit9CisKIC8vIEFuIG9wZXJhdG9yIHRha2VzIHRlbnNvcnMgYXMgaW5wdXRzIGFuZCBvdXRwdXRzLiBUaGUgdHlwZSBvZiBvcGVyYXRpb24gYmVpbmcKIC8vIHBlcmZvcm1lZCBpcyBkZXRlcm1pbmVkIGJ5IGFuIGluZGV4IGludG8gdGhlIGxpc3Qgb2YgdmFsaWQgT3BlcmF0b3JDb2RlcywKIC8vIHdoaWxlIHRoZSBzcGVjaWZpY3Mgb2YgZWFjaCBvcGVyYXRpb25zIGlzIGNvbmZpZ3VyZWQgdXNpbmcgYnVpbHRpbl9vcHRpb25zCkBAIC0xMjY0LDYgKzE1MzksMTEgQEAKICAgLy8gYmVnaW5uaW5nIG9mIHRoZSBmaWxlIGFuZCBpcyBvbmx5IHZhbGlkIGlmID4gMQogICBsYXJnZV9jdXN0b21fb3B0aW9uc19vZmZzZXQ6IHVsb25nOwogICBsYXJnZV9jdXN0b21fb3B0aW9uc19zaXplOiB1bG9uZzsKKworICAvLyBGbGF0YnVmZmVycyB1bmlvbiBzdHJ1Y3QgaGFzIGEgMTI4IGVsZW1lbnRzIGxpbWl0IGluIEpBVkEsIHNvIGEgc2Vjb25kCisgIC8vIHVuaW9uIGlzIGFkZGVkLCBpbiB0aGUgY2FzZSBvZiB3aGVyZSBCdWl0bGluT3B0aW9uczIgcnVucyBvdXQsIGEgdGhpcmQKKyAgLy8gb25lIGNhbiBiZSBhZGRlZAorICBidWlsdGluX29wdGlvbnNfMiA6IEJ1aWx0aW5PcHRpb25zMjsKIH0KIAogLy8gVGhlIHJvb3QgdHlwZSwgZGVmaW5pbmcgYSBzdWJncmFwaCwgd2hpY2ggdHlwaWNhbGx5IHJlcHJlc2VudHMgYW4gZW50aXJlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2NvbXBpbGVyL21saXIvbGl0ZS9zY2hlbWEvc2NoZW1hX2dlbmVyYXRlZC5oIGIvdGVuc29yZmxvdy9jb21waWxlci9tbGlyL2xpdGUvc2NoZW1hL3NjaGVtYV9nZW5lcmF0ZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWVlZGY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVuc29yZmxvdy9jb21waWxlci9tbGlyL2xpdGUvc2NoZW1hL3NjaGVtYV9nZW5lcmF0ZWQuaApAQCAtMCwwICsxLDIyIEBACisvKiBDb3B5cmlnaHQgMjAyNCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNpZm5kZWYgVEVOU09SRkxPV19DT01QSUxFUl9NTElSX0xJVEVfU0NIRU1BX1NDSEVNQV9HRU5FUkFURURfSF8KKyNkZWZpbmUgVEVOU09SRkxPV19DT01QSUxFUl9NTElSX0xJVEVfU0NIRU1BX1NDSEVNQV9HRU5FUkFURURfSF8KKworLy8gVGhpcyBmaWxlIHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgdGhlIG1ha2UgYnVpbGQgdG8gcmVkaXJlY3Qgc2NoZW1hX3V0aWxzLmNjCisvLyB1c2FnZSBvZiB0aGUgZ2VuZXJhdGVkIHNjaGVtYSB0byB0aGUgcHJvcGVyIGxvY2F0aW9uLgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9zY2hlbWEvc2NoZW1hX2dlbmVyYXRlZC5oIiAgLy8gSVdZVSBwcmFnbWE6IGtlZXAKKworI2VuZGlmICAvLyBURU5TT1JGTE9XX0xJVEVfU0NIRU1BX1NDSEVNQV9VVElMU19IXwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL3NjaGVtYS9zY2hlbWFfdXRpbHMuY2MgYi90ZW5zb3JmbG93L2NvbXBpbGVyL21saXIvbGl0ZS9zY2hlbWEvc2NoZW1hX3V0aWxzLmNjCnNpbWlsYXJpdHkgaW5kZXggODklCnJlbmFtZSBmcm9tIHRlbnNvcmZsb3cvbGl0ZS9zY2hlbWEvc2NoZW1hX3V0aWxzLmNjCnJlbmFtZSB0byB0ZW5zb3JmbG93L2NvbXBpbGVyL21saXIvbGl0ZS9zY2hlbWEvc2NoZW1hX3V0aWxzLmNjCmluZGV4IGZjMTkyOTAuLmExNzMzODAgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9zY2hlbWEvc2NoZW1hX3V0aWxzLmNjCisrKyBiL3RlbnNvcmZsb3cvY29tcGlsZXIvbWxpci9saXRlL3NjaGVtYS9zY2hlbWFfdXRpbHMuY2MKQEAgLTEyLDE2ICsxMiwxNiBAQAogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9zY2hlbWEvc2NoZW1hX3V0aWxzLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9jb21waWxlci9tbGlyL2xpdGUvc2NoZW1hL3NjaGVtYV91dGlscy5oIgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvY29tcGF0aWJpbGl0eS5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvY29tcGlsZXIvbWxpci9saXRlL2tlcm5lbHMvaW50ZXJuYWwvY29tcGF0aWJpbGl0eV9tYWNyb3MuaCIKIAogbmFtZXNwYWNlIHRmbGl0ZSB7CiAKIC8vIFRoZSBmb2xsb3dpbmcgR2V0QnVpbHRpbkNvZGUgbWV0aG9kcyBhcmUgdGhlIHV0aWxpdHkgbWV0aG9kcyBmb3IgcmVhZGluZwotLy8gYnVpbHRpbiBvcGVyYXRvcmUgY29kZSwgZW5zdXJpbmcgY29tcGF0aWJpbGl0eSBpc3N1ZXMgYmV0d2VlbiB2MyBhbmQgdjNhCisvLyBidWlsdGluIG9wZXJhdG9yIGNvZGUsIGVuc3VyaW5nIGNvbXBhdGliaWxpdHkgaXNzdWVzIGJldHdlZW4gdjMgYW5kIHYzYQogLy8gc2NoZW1hLiBBbHdheXMgdGhlIG1heGltdW0gdmFsdWUgb2YgdGhlIHR3byBmaWVsZHMgYWx3YXlzIHdpbGwgYmUgdGhlIGNvcnJlY3QKIC8vIHZhbHVlIGFzIGZvbGxvd3M6CiAvLwpAQCAtMjksNyArMjksNyBAQAogLy8KIC8vIFRoZSBgYnVpbHRpbl9jb2RlYCBmaWVsZCBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSB2MyBtb2RlbHMuIEZsYXRidWZmZXIKIC8vIGxpYnJhcnkgd2lsbCBmZWVkIHplcm8gdmFsdWUsIHdoaWNoIGlzIHRoZSBkZWZhdWx0IHZhbHVlIGluIHRoZSB2M2Egc2NoZW1hLgotLy8gVGhlIGFjdHVhbCBidWlsdGluIG9wZXJhdG9yZSBjb2RlIHZhbHVlIHdpbGwgZXhpc3QgaW4gdGhlCisvLyBUaGUgYWN0dWFsIGJ1aWx0aW4gb3BlcmF0b3IgY29kZSB2YWx1ZSB3aWxsIGV4aXN0IGluIHRoZQogLy8gYGRlcHJlY2F0ZWRfYnVpbHRpbl9jb2RlYCBmaWVsZC4gQXQgdGhlIHNhbWUgdGltZSwgaXQgaW1wbGllcyB0aGF0CiAvLyBgZGVwcmVjYXRlZF9idWlsdGluX2NvZGVgID49IGBidWlsdGluX2NvZGVgIGFuZCB0aGUgbWF4aW11bSB2YWx1ZSBvZiB0aGUgdHdvCiAvLyBmaWVsZHMgd2lsbCBiZSBzYW1lIHdpdGggYGRlcHJlY2F0ZWRfYnVpbHRpbl9jb2RlJy4KZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvY29tcGlsZXIvbWxpci9saXRlL3NjaGVtYS9zY2hlbWFfdXRpbHMuaCBiL3RlbnNvcmZsb3cvY29tcGlsZXIvbWxpci9saXRlL3NjaGVtYS9zY2hlbWFfdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDk4YWEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVuc29yZmxvdy9jb21waWxlci9tbGlyL2xpdGUvc2NoZW1hL3NjaGVtYV91dGlscy5oCkBAIC0wLDAgKzEsMzMgQEAKKy8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2lmbmRlZiBURU5TT1JGTE9XX0NPTVBJTEVSX01MSVJfTElURV9TQ0hFTUFfU0NIRU1BX1VUSUxTX0hfCisjZGVmaW5lIFRFTlNPUkZMT1dfQ09NUElMRVJfTUxJUl9MSVRFX1NDSEVNQV9TQ0hFTUFfVVRJTFNfSF8KKworI2luY2x1ZGUgImZsYXRidWZmZXJzL2ZsYXRidWZmZXJzLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9jb21waWxlci9tbGlyL2xpdGUvc2NoZW1hL3NjaGVtYV9nZW5lcmF0ZWQuaCIKKworbmFtZXNwYWNlIHRmbGl0ZSB7CisKKy8vIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgaW50cm9kdWNlZCB0byByZXNvbHZlIG9wIGJ1aWx0aW4gY29kZSBzaG9ydGFnZQorLy8gcHJvYmxlbS4gVGhlIG5ldyBidWlsdGluIG9wZXJhdG9yIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGV4dGVuZGVkIGJ1aWx0aW4KKy8vIGNvZGUgZmllbGQgaW4gdGhlIGZsYXRidWZmZXIgc2NoZW1hLiBUaG9zZSBtZXRob2RzIGhlbHBzIHRvIGhpZGUgYnVpbHRpbiBjb2RlCisvLyBkZXRhaWxzLgorQnVpbHRpbk9wZXJhdG9yIEdldEJ1aWx0aW5Db2RlKGNvbnN0IE9wZXJhdG9yQ29kZSAqb3BfY29kZSk7CisKK0J1aWx0aW5PcGVyYXRvciBHZXRCdWlsdGluQ29kZShjb25zdCBPcGVyYXRvckNvZGVUICpvcF9jb2RlKTsKKworfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQorCisjZW5kaWYgIC8vIFRFTlNPUkZMT1dfQ09NUElMRVJfTUxJUl9MSVRFX1NDSEVNQV9TQ0hFTUFfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvZXh0cmFfcnVsZXMuYnpsIGIvdGVuc29yZmxvdy9leHRyYV9ydWxlcy5iemwKaW5kZXggN2EzNTIzZS4uMjllMGJkYSAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9leHRyYV9ydWxlcy5iemwKKysrIGIvdGVuc29yZmxvdy9leHRyYV9ydWxlcy5iemwKQEAgLTE5LDYgKzE5LDEwIEBACiAgICAgIiIiQ29uZmlnIHNldHRpbmcgZm9yIGFsbCBGdXNpb24gRjEgYmFzZWQgY29yZXMuIiIiCiAgICAgcmV0dXJuICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzOnh0ZW5zYV9mdXNpb25fZjFfZGVmYXVsdCIKIAorZGVmIHh0ZW5zYV9oaWZpXzNfY29uZmlnKCk6CisgICAgIiIiQ29uZmlnIHNldHRpbmcgZm9yIGFsbCBIaUZpIDMgYmFzZWQgY29yZXMuIiIiCisgICAgcmV0dXJuICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzOnh0ZW5zYV9oaWZpXzNfZGVmYXVsdCIKKwogZGVmIHh0ZW5zYV9oaWZpXzN6X2NvbmZpZygpOgogICAgICIiIkNvbmZpZyBzZXR0aW5nIGZvciBhbGwgSGlGaSAzeiBiYXNlZCBjb3Jlcy4iIiIKICAgICByZXR1cm4gIi8vdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHM6eHRlbnNhX2hpZmlfM3pfZGVmYXVsdCIKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9idWlsZF9kZWYuYnpsIGIvdGVuc29yZmxvdy9saXRlL2J1aWxkX2RlZi5iemwKaW5kZXggZThmYzQ5Yy4uZTY1ZWMyMyAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL2J1aWxkX2RlZi5iemwKKysrIGIvdGVuc29yZmxvdy9saXRlL2J1aWxkX2RlZi5iemwKQEAgLTMsNiArMyw3IEBACiAgICAgY29wdHMgPSBbCiAgICAgICAgICItREZBUk1IQVNIX05PX0NYWF9TVFJJTkciLAogICAgICAgICAiLVduby1zaWduLWNvbXBhcmUiLAorICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKICAgICAgICAgIi1mbm8tZXhjZXB0aW9ucyIsICAjIEV4Y2VwdGlvbnMgYXJlIHVudXNlZCBpbiBURkxpdGUuCiAgICAgXQogICAgIHJldHVybiBjb3B0cwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL2J1aWx0aW5fb3BzLmggYi90ZW5zb3JmbG93L2xpdGUvYnVpbHRpbl9vcHMuaAppbmRleCBmOTg3MWFkLi41ZGJhMGY2IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvYnVpbHRpbl9vcHMuaAorKysgYi90ZW5zb3JmbG93L2xpdGUvYnVpbHRpbl9vcHMuaApAQCAtMTg5LDYgKzE4OSw1MSBAQAogICBrVGZMaXRlQnVpbHRpbkJpdGNhc3QgPSAxNTksCiAgIGtUZkxpdGVCdWlsdGluQml0d2lzZVhvciA9IDE2MCwKICAga1RmTGl0ZUJ1aWx0aW5SaWdodFNoaWZ0ID0gMTYxLAorICBrVGZMaXRlQnVpbHRpblN0YWJsZWhsb0xvZ2lzdGljID0gMTYyLAorICBrVGZMaXRlQnVpbHRpblN0YWJsZWhsb0FkZCA9IDE2MywKKyAga1RmTGl0ZUJ1aWx0aW5TdGFibGVobG9EaXZpZGUgPSAxNjQsCisgIGtUZkxpdGVCdWlsdGluU3RhYmxlaGxvTXVsdGlwbHkgPSAxNjUsCisgIGtUZkxpdGVCdWlsdGluU3RhYmxlaGxvTWF4aW11bSA9IDE2NiwKKyAga1RmTGl0ZUJ1aWx0aW5TdGFibGVobG9SZXNoYXBlID0gMTY3LAorICBrVGZMaXRlQnVpbHRpblN0YWJsZWhsb0NsYW1wID0gMTY4LAorICBrVGZMaXRlQnVpbHRpblN0YWJsZWhsb0NvbmNhdGVuYXRlID0gMTY5LAorICBrVGZMaXRlQnVpbHRpblN0YWJsZWhsb0Jyb2FkY2FzdEluRGltID0gMTcwLAorICBrVGZMaXRlQnVpbHRpblN0YWJsZWhsb0NvbnZvbHV0aW9uID0gMTcxLAorICBrVGZMaXRlQnVpbHRpblN0YWJsZWhsb1NsaWNlID0gMTcyLAorICBrVGZMaXRlQnVpbHRpblN0YWJsZWhsb0N1c3RvbUNhbGwgPSAxNzMsCisgIGtUZkxpdGVCdWlsdGluU3RhYmxlaGxvUmVkdWNlID0gMTc0LAorICBrVGZMaXRlQnVpbHRpblN0YWJsZWhsb0FicyA9IDE3NSwKKyAga1RmTGl0ZUJ1aWx0aW5TdGFibGVobG9BbmQgPSAxNzYsCisgIGtUZkxpdGVCdWlsdGluU3RhYmxlaGxvQ29zaW5lID0gMTc3LAorICBrVGZMaXRlQnVpbHRpblN0YWJsZWhsb0V4cG9uZW50aWFsID0gMTc4LAorICBrVGZMaXRlQnVpbHRpblN0YWJsZWhsb0Zsb29yID0gMTc5LAorICBrVGZMaXRlQnVpbHRpblN0YWJsZWhsb0xvZyA9IDE4MCwKKyAga1RmTGl0ZUJ1aWx0aW5TdGFibGVobG9NaW5pbXVtID0gMTgxLAorICBrVGZMaXRlQnVpbHRpblN0YWJsZWhsb05lZ2F0ZSA9IDE4MiwKKyAga1RmTGl0ZUJ1aWx0aW5TdGFibGVobG9PciA9IDE4MywKKyAga1RmTGl0ZUJ1aWx0aW5TdGFibGVobG9Qb3dlciA9IDE4NCwKKyAga1RmTGl0ZUJ1aWx0aW5TdGFibGVobG9SZW1haW5kZXIgPSAxODUsCisgIGtUZkxpdGVCdWlsdGluU3RhYmxlaGxvUnNxcnQgPSAxODYsCisgIGtUZkxpdGVCdWlsdGluU3RhYmxlaGxvU2VsZWN0ID0gMTg3LAorICBrVGZMaXRlQnVpbHRpblN0YWJsZWhsb1N1YnRyYWN0ID0gMTg4LAorICBrVGZMaXRlQnVpbHRpblN0YWJsZWhsb1RhbmggPSAxODksCisgIGtUZkxpdGVCdWlsdGluU3RhYmxlaGxvU2NhdHRlciA9IDE5MCwKKyAga1RmTGl0ZUJ1aWx0aW5TdGFibGVobG9Db21wYXJlID0gMTkxLAorICBrVGZMaXRlQnVpbHRpblN0YWJsZWhsb0NvbnZlcnQgPSAxOTIsCisgIGtUZkxpdGVCdWlsdGluU3RhYmxlaGxvRHluYW1pY1NsaWNlID0gMTkzLAorICBrVGZMaXRlQnVpbHRpblN0YWJsZWhsb0R5bmFtaWNVcGRhdGVTbGljZSA9IDE5NCwKKyAga1RmTGl0ZUJ1aWx0aW5TdGFibGVobG9QYWQgPSAxOTUsCisgIGtUZkxpdGVCdWlsdGluU3RhYmxlaGxvSW90YSA9IDE5NiwKKyAga1RmTGl0ZUJ1aWx0aW5TdGFibGVobG9Eb3RHZW5lcmFsID0gMTk3LAorICBrVGZMaXRlQnVpbHRpblN0YWJsZWhsb1JlZHVjZVdpbmRvdyA9IDE5OCwKKyAga1RmTGl0ZUJ1aWx0aW5TdGFibGVobG9Tb3J0ID0gMTk5LAorICBrVGZMaXRlQnVpbHRpblN0YWJsZWhsb1doaWxlID0gMjAwLAorICBrVGZMaXRlQnVpbHRpblN0YWJsZWhsb0dhdGhlciA9IDIwMSwKKyAga1RmTGl0ZUJ1aWx0aW5TdGFibGVobG9UcmFuc3Bvc2UgPSAyMDIsCisgIGtUZkxpdGVCdWlsdGluRGlsYXRlID0gMjAzLAorICBrVGZMaXRlQnVpbHRpblN0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvciA9IDIwNCwKKyAga1RmTGl0ZUJ1aWx0aW5SZWR1Y2VXaW5kb3cgPSAyMDUsCisgIGtUZkxpdGVCdWlsdGluU3RhYmxlaGxvQ29tcG9zaXRlID0gMjA2LAogfSBUZkxpdGVCdWlsdGluT3BlcmF0b3I7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL2MvYnVpbHRpbl9vcF9kYXRhLmggYi90ZW5zb3JmbG93L2xpdGUvYy9idWlsdGluX29wX2RhdGEuaAppbmRleCA3NjI4ZTVhLi4wNjA2ODE5IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvYy9idWlsdGluX29wX2RhdGEuaAorKysgYi90ZW5zb3JmbG93L2xpdGUvYy9idWlsdGluX29wX2RhdGEuaApAQCAtMTUsNiArMTUsOSBAQAogI2lmbmRlZiBURU5TT1JGTE9XX0xJVEVfQ19CVUlMVElOX09QX0RBVEFfSF8KICNkZWZpbmUgVEVOU09SRkxPV19MSVRFX0NfQlVJTFRJTl9PUF9EQVRBX0hfCiAKKy8vLyBGb3IgZG9jdW1lbnRhdGlvbiwgc2VlCisvLy8gdGhpcmRfcGFydHkvdGVuc29yZmxvdy9saXRlL2NvcmUvYy9idWlsdGluX29wX2RhdGEuaAorCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2NvcmUvYy9idWlsdGluX29wX2RhdGEuaCIKIAogI2VuZGlmICAvLyBURU5TT1JGTE9XX0xJVEVfQ19CVUlMVElOX09QX0RBVEFfSF8KZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9jL2NfYXBpX3R5cGVzLmggYi90ZW5zb3JmbG93L2xpdGUvYy9jX2FwaV90eXBlcy5oCmluZGV4IGNkYmYxZmQuLjA1Y2RhMDcgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9jL2NfYXBpX3R5cGVzLmgKKysrIGIvdGVuc29yZmxvdy9saXRlL2MvY19hcGlfdHlwZXMuaApAQCAtMTUsNiArMTUsMTIgQEAKICNpZm5kZWYgVEVOU09SRkxPV19MSVRFX0NfQ19BUElfVFlQRVNfSF8KICNkZWZpbmUgVEVOU09SRkxPV19MSVRFX0NfQ19BUElfVFlQRVNfSF8KIAorLy8vIFxmaWxlCisvLy8KKy8vLyBDIEFQSSB0eXBlcyBmb3IgVGVuc29yRmxvdyBMaXRlLgorLy8vCisvLy8gRm9yIGRvY3VtZW50YXRpb24sIHNlZSB0ZW5zb3JmbG93L2xpdGUvY29yZS9jL2NfYXBpX3R5cGVzLmgKKwogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9jb3JlL2MvY19hcGlfdHlwZXMuaCIKIAogI2VuZGlmICAvLyBURU5TT1JGTE9XX0xJVEVfQ19DX0FQSV9UWVBFU19IXwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL2MvY29tbW9uLmggYi90ZW5zb3JmbG93L2xpdGUvYy9jb21tb24uaAppbmRleCBlM2U4MDAxLi44YThiNTEzIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvYy9jb21tb24uaAorKysgYi90ZW5zb3JmbG93L2xpdGUvYy9jb21tb24uaApAQCAtMTMsMjUgKzEzLDE3IEBACiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKLS8vIFRoaXMgZmlsZSBkZWZpbmVzIGNvbW1vbiBDIHR5cGVzIGFuZCBBUElzIGZvciBpbXBsZW1lbnRpbmcgb3BlcmF0aW9ucywKLS8vIGRlbGVnYXRlcyBhbmQgb3RoZXIgY29uc3RydWN0cyBpbiBUZW5zb3JGbG93IExpdGUuIFRoZSBhY3R1YWwgb3BlcmF0aW9ucyBhbmQKLS8vIGRlbGVnYXRlcyBjYW4gYmUgZGVmaW5lZCB1c2luZyBDKyssIGJ1dCB0aGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlIGludGVycHJldGVyCi0vLyBhbmQgdGhlIG9wZXJhdGlvbnMgYXJlIEMuCi0vLwotLy8gU3VtbWFyeSBvZiBhYnN0cmFjdGlvbnMKLS8vIFRGX0xJVEVfRU5TVVJFIC0gU2VsZi1zdWZmaWNpZW50IGVycm9yIGNoZWNraW5nCi0vLyBUZkxpdGVTdGF0dXMgLSBTdGF0dXMgcmVwb3J0aW5nCi0vLyBUZkxpdGVJbnRBcnJheSAtIHN0b3JlcyB0ZW5zb3Igc2hhcGVzIChkaW1zKSwKLS8vIFRmTGl0ZUNvbnRleHQgLSBhbGxvd3MgYW4gb3AgdG8gYWNjZXNzIHRoZSB0ZW5zb3JzCi0vLyBUZkxpdGVUZW5zb3IgLSB0ZW5zb3IgKGEgbXVsdGlkaW1lbnNpb25hbCBhcnJheSkKLS8vIFRmTGl0ZU5vZGUgLSBhIHNpbmdsZSBub2RlIG9yIG9wZXJhdGlvbgotLy8gVGZMaXRlUmVnaXN0cmF0aW9uIC0gdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgY29uY2VwdHVhbCBvcGVyYXRpb24uCi0vLyBUZkxpdGVEZWxlZ2F0ZSAtIGFsbG93cyBkZWxlZ2F0aW9uIG9mIG5vZGVzIHRvIGFsdGVybmF0aXZlIGJhY2tlbmRzLgotLy8KLS8vIFNvbWUgYWJzdHJhY3Rpb25zIGluIHRoaXMgZmlsZSBhcmUgY3JlYXRlZCBhbmQgbWFuYWdlZCBieSBJbnRlcnByZXRlci4KLS8vCi0vLyBOT1RFOiBUaGUgb3JkZXIgb2YgdmFsdWVzIGluIHRoZXNlIHN0cnVjdHMgYXJlICJzZW1pLUFCSSBzdGFibGUiLiBOZXcgdmFsdWVzCi0vLyBzaG91bGQgYmUgYWRkZWQgb25seSB0byB0aGUgZW5kIG9mIHN0cnVjdHMgYW5kIG5ldmVyIHJlb3JkZXJlZC4KKy8vLyBcZmlsZQorLy8vCisvLy8gVGhpcyBmaWxlIGRlZmluZXMgY29tbW9uIEMgdHlwZXMgYW5kIEFQSXMgZm9yIGltcGxlbWVudGluZyBvcGVyYXRpb25zLAorLy8vIGRlbGVnYXRlcyBhbmQgb3RoZXIgY29uc3RydWN0cyBpbiBUZW5zb3JGbG93IExpdGUuIFRoZSBhY3R1YWwgb3BlcmF0aW9ucyBhbmQKKy8vLyBkZWxlZ2F0ZXMgY2FuIGJlIGRlZmluZWQgdXNpbmcgQysrLCBidXQgdGhlIGludGVyZmFjZSBiZXR3ZWVuIHRoZQorLy8vIGludGVycHJldGVyIGFuZCB0aGUgb3BlcmF0aW9ucyBhcmUgQy4KKy8vLworLy8vIEZvciBkb2N1bWVudGF0aW9uLCBzZWUgdGVuc29yZmxvdy9saXRlL2NvcmUvYy9jb21tb24uaC4KKy8vLworLy8vIFNlZSBhbHNvIGNfYXBpX29wYXF1ZS5oIHdoaWNoIGhhcyBtb3JlIEFCSS1zdGFibGUgdmFyaWFudHMgb2Ygc29tZSBvZiB0aGVzZQorLy8vIEFQSXMuCiAKICNpZm5kZWYgVEVOU09SRkxPV19MSVRFX0NfQ09NTU9OX0hfCiAjZGVmaW5lIFRFTlNPUkZMT1dfTElURV9DX0NPTU1PTl9IXwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL2NvcmUvYXBpL2Vycm9yX3JlcG9ydGVyLmggYi90ZW5zb3JmbG93L2xpdGUvY29yZS9hcGkvZXJyb3JfcmVwb3J0ZXIuaAppbmRleCA5OWFiOGNmLi4xZTBlZjdkIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvY29yZS9hcGkvZXJyb3JfcmVwb3J0ZXIuaAorKysgYi90ZW5zb3JmbG93L2xpdGUvY29yZS9hcGkvZXJyb3JfcmVwb3J0ZXIuaApAQCAtNjEsOSArNjEsOSBAQAogLy8gcmVkdWNlIGJpbmFyeSBzaXplLCBkZWZpbmUgVEZfTElURV9TVFJJUF9FUlJPUl9TVFJJTkdTIHdoZW4gY29tcGlsaW5nIGFuZAogLy8gZXZlcnkgY2FsbCB3aWxsIGJlIHN0dWJiZWQgb3V0LCB0YWtpbmcgbm8gbWVtb3J5LgogI2lmbmRlZiBURl9MSVRFX1NUUklQX0VSUk9SX1NUUklOR1MKLSNkZWZpbmUgVEZfTElURV9SRVBPUlRfRVJST1IocmVwb3J0ZXIsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBzdGF0aWNfY2FzdDx0ZmxpdGU6OkVycm9yUmVwb3J0ZXIqPihyZXBvcnRlciktPlJlcG9ydChfX1ZBX0FSR1NfXyk7IFwKKyNkZWZpbmUgVEZfTElURV9SRVBPUlRfRVJST1IocmVwb3J0ZXIsIC4uLikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljX2Nhc3Q8Ojp0ZmxpdGU6OkVycm9yUmVwb3J0ZXIqPihyZXBvcnRlciktPlJlcG9ydChfX1ZBX0FSR1NfXyk7IFwKICAgfSB3aGlsZSAoZmFsc2UpCiAjZWxzZSAgLy8gVEZfTElURV9TVFJJUF9FUlJPUl9TVFJJTkdTCiAjZGVmaW5lIFRGX0xJVEVfUkVQT1JUX0VSUk9SKHJlcG9ydGVyLCAuLi4pCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvY29yZS9hcGkvZmxhdGJ1ZmZlcl9jb252ZXJzaW9ucy5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9jb3JlL2FwaS9mbGF0YnVmZmVyX2NvbnZlcnNpb25zLmNjCmluZGV4IDlmOTU1ZGYuLjM1MjY4MTAgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9jb3JlL2FwaS9mbGF0YnVmZmVyX2NvbnZlcnNpb25zLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9jb3JlL2FwaS9mbGF0YnVmZmVyX2NvbnZlcnNpb25zLmNjCkBAIC0xNSwxMSArMTUsMTMgQEAKIAogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9jb3JlL2FwaS9mbGF0YnVmZmVyX2NvbnZlcnNpb25zLmgiCiAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8Y3N0ZGRlZj4KICNpbmNsdWRlIDxjc3RkaW50PgogI2luY2x1ZGUgPG1lbW9yeT4KIAogI2luY2x1ZGUgImZsYXRidWZmZXJzL2ZsYXRidWZmZXJzLmgiICAvLyBmcm9tIEBmbGF0YnVmZmVycworI2luY2x1ZGUgImZsYXRidWZmZXJzL3ZlY3Rvci5oIiAgLy8gZnJvbSBAZmxhdGJ1ZmZlcnMKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvY29yZS9hcGkvZXJyb3JfcmVwb3J0ZXIuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvY29yZS9jL2J1aWx0aW5fb3BfZGF0YS5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9jb3JlL2MvY29tbW9uLmgiCkBAIC03Niw5ICs3OCwxMCBAQAogLy8gQ29waWVzIHRoZSBjb250ZW50cyBmcm9tIHRoZSBmbGF0YnVmZmVyIGludCB2ZWN0b3IgYGZsYXRidWZmZXJgIGludG8gdGhlCiAvLyBpbnQgYXJyYXkgYGJ1ZmZlcmAuIGBmbGF0X3ZlY3RvcmAgYW5kIGBidWZmZXJgIHJlcHJlc2VudCB0aGUgc2FtZQogLy8gY29uZmlndXJhdGlvbiBvcGVyYXRpb24gZm9yIGEgZ2l2ZW4gb3BlcmF0aW9uLgotVGZMaXRlU3RhdHVzIEZsYXRCdWZmZXJJbnRWZWN0b3JUb0FycmF5KAotICAgIGludCBtYXhfc2l6ZV9vZl9idWZmZXIsIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4qIGZsYXRfdmVjdG9yLAotICAgIGludCogYnVmZmVyLCBFcnJvclJlcG9ydGVyKiBlcnJvcl9yZXBvcnRlciwgY29uc3QgY2hhciogb3BfbmFtZSkgewordGVtcGxhdGUgPHR5cGVuYW1lIERhdGFUeXBlID0gaW50MzJfdD4KK3N0YXRpYyBUZkxpdGVTdGF0dXMgRmxhdEJ1ZmZlckludFZlY3RvclRvQXJyYXkoCisgICAgaW50IG1heF9zaXplX29mX2J1ZmZlciwgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxEYXRhVHlwZT4qIGZsYXRfdmVjdG9yLAorICAgIERhdGFUeXBlKiBidWZmZXIsIEVycm9yUmVwb3J0ZXIqIGVycm9yX3JlcG9ydGVyLCBjb25zdCBjaGFyKiBvcF9uYW1lKSB7CiAgIGlmICghZmxhdF92ZWN0b3IpIHsKICAgICBURl9MSVRFX1JFUE9SVF9FUlJPUihlcnJvcl9yZXBvcnRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAiSW5wdXQgYXJyYXkgbm90IHByb3ZpZGVkIGZvciBvcGVyYXRpb24gJyVzJy5cbiIsCkBAIC04Niw3ICs4OSw3IEBACiAgICAgcmV0dXJuIGtUZkxpdGVFcnJvcjsKICAgfSBlbHNlIHsKICAgICBzaXplX3QgbnVtX2RpbWVuc2lvbnMgPSBmbGF0X3ZlY3Rvci0+c2l6ZSgpOwotICAgIGlmIChudW1fZGltZW5zaW9ucyA+IG1heF9zaXplX29mX2J1ZmZlciAvIHNpemVvZihpbnQpKSB7CisgICAgaWYgKG51bV9kaW1lbnNpb25zID4gbWF4X3NpemVfb2ZfYnVmZmVyIC8gc2l6ZW9mKERhdGFUeXBlKSkgewogICAgICAgVEZfTElURV9SRVBPUlRfRVJST1IoCiAgICAgICAgICAgZXJyb3JfcmVwb3J0ZXIsCiAgICAgICAgICAgIkZvdW5kIHRvbyBtYW55IGRpbWVuc2lvbnMgaW4gdGhlIGlucHV0IGFycmF5IG9mIG9wZXJhdGlvbiAnJXMnLlxuIiwKQEAgLTE0Miw2ICsxNDUsMTggQEAKICAgcmV0dXJuIGtUZkxpdGVNaXJyb3JQYWRkaW5nVW5rbm93bjsKIH0KIAorVGZMaXRlUm5nQWxnb3JpdGhtIENvbnZlcnRSbmdBbGdvcml0aG0oUm5nQWxnb3JpdGhtIGFsZ29yaXRobSkgeworICBzd2l0Y2ggKGFsZ29yaXRobSkgeworICAgIGNhc2UgUm5nQWxnb3JpdGhtX1RIUkVFRlJZOgorICAgICAgcmV0dXJuIGtUZkxpdGVSbmdBbGdvcml0aG1UaHJlZWZyeTsKKyAgICBjYXNlIFJuZ0FsZ29yaXRobV9QSElMT1g6CisgICAgICByZXR1cm4ga1RmTGl0ZVJuZ0FsZ29yaXRobVBoaWxveDsKKyAgICBjYXNlIFJuZ0FsZ29yaXRobV9ERUZBVUxUOgorICAgICAgcmV0dXJuIGtUZkxpdGVSbmdBbGdvcml0aG1EZWZhdWx0OworICB9CisgIHJldHVybiBrVGZMaXRlUm5nQWxnb3JpdGhtVW5rbm93bjsKK30KKwogI2lmbmRlZiBURl9MSVRFX1NUQVRJQ19NRU1PUlkKIFRmTGl0ZVN0YXR1cyBQYXJzZU9wRGF0YVRmTGl0ZShjb25zdCBPcGVyYXRvciogb3AsIEJ1aWx0aW5PcGVyYXRvciBvcF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yUmVwb3J0ZXIqIGVycm9yX3JlcG9ydGVyLApAQCAtODU3LDYgKzg3Miw5NyBAQAogICAgICAgKmJ1aWx0aW5fZGF0YSA9IHBhcmFtcy5yZWxlYXNlKCk7CiAgICAgICByZXR1cm4ga1RmTGl0ZU9rOwogICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fU0NBVFRFUjogeworICAgICAgcmV0dXJuIFBhcnNlU3RhYmxlaGxvU2NhdHRlcihvcCwgZXJyb3JfcmVwb3J0ZXIsIGFsbG9jYXRvciwgYnVpbHRpbl9kYXRhKTsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX1JOR19CSVRfR0VORVJBVE9SOiB7CisgICAgICByZXR1cm4gUGFyc2VTdGFibGVobG9SbmdCaXRHZW5lcmF0b3Iob3AsIGVycm9yX3JlcG9ydGVyLCBhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVpbHRpbl9kYXRhKTsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0dBVEhFUjogeworICAgICAgcmV0dXJuIFBhcnNlU3RhYmxlaGxvR2F0aGVyKG9wLCBlcnJvcl9yZXBvcnRlciwgYWxsb2NhdG9yLCBidWlsdGluX2RhdGEpOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fUkVEVUNFX1dJTkRPVzogeworICAgICAgcmV0dXJuIFBhcnNlU3RhYmxlaGxvUmVkdWNlV2luZG93KG9wLCBlcnJvcl9yZXBvcnRlciwgYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5fZGF0YSk7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wZXJhdG9yX1JFRFVDRV9XSU5ET1c6IHsKKyAgICAgIGF1dG8gcGFyYW1zID0gc2FmZV9hbGxvY2F0b3IuQWxsb2NhdGU8VGZMaXRlUmVkdWNlV2luZG93UGFyYW1zPigpOworICAgICAgVEZfTElURV9FTlNVUkUoZXJyb3JfcmVwb3J0ZXIsIHBhcmFtcyAhPSBudWxscHRyKTsKKyAgICAgIGlmIChjb25zdCBhdXRvKiByZWR1Y2VfcGFyYW1zID0KKyAgICAgICAgICAgICAgb3AtPmJ1aWx0aW5fb3B0aW9uc18yX2FzX1JlZHVjZVdpbmRvd09wdGlvbnMoKSkgeworICAgICAgICBzd2l0Y2ggKHJlZHVjZV9wYXJhbXMtPnJlZHVjZV9mdW5jdGlvbigpKSB7CisgICAgICAgICAgY2FzZSBSZWR1Y2VXaW5kb3dGdW5jdGlvbl9BREQ6CisgICAgICAgICAgICBwYXJhbXMtPnJlZHVjZV9mdW5jdGlvbiA9IFRmTGl0ZVJlZHVjZVdpbmRvd0Z1bmN0aW9uQWRkOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBSZWR1Y2VXaW5kb3dGdW5jdGlvbl9NVUw6CisgICAgICAgICAgICBwYXJhbXMtPnJlZHVjZV9mdW5jdGlvbiA9IFRmTGl0ZVJlZHVjZVdpbmRvd0Z1bmN0aW9uTXVsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBSZWR1Y2VXaW5kb3dGdW5jdGlvbl9NSU5JTVVNOgorICAgICAgICAgICAgcGFyYW1zLT5yZWR1Y2VfZnVuY3Rpb24gPSBUZkxpdGVSZWR1Y2VXaW5kb3dGdW5jdGlvbk1pbjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2UgUmVkdWNlV2luZG93RnVuY3Rpb25fTUFYSU1VTToKKyAgICAgICAgICAgIHBhcmFtcy0+cmVkdWNlX2Z1bmN0aW9uID0gVGZMaXRlUmVkdWNlV2luZG93RnVuY3Rpb25NYXg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFJlZHVjZVdpbmRvd0Z1bmN0aW9uX0FMTDoKKyAgICAgICAgICAgIHBhcmFtcy0+cmVkdWNlX2Z1bmN0aW9uID0gVGZMaXRlUmVkdWNlV2luZG93RnVuY3Rpb25BbGw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFJlZHVjZVdpbmRvd0Z1bmN0aW9uX0FOWToKKyAgICAgICAgICAgIHBhcmFtcy0+cmVkdWNlX2Z1bmN0aW9uID0gVGZMaXRlUmVkdWNlV2luZG93RnVuY3Rpb25Bbnk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIFJlZHVjZVdpbmRvd0Z1bmN0aW9uX1VOU1VQUE9SVEVEOgorICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4ga1RmTGl0ZUVycm9yOworICAgICAgICB9CisgICAgICB9CisgICAgICAqYnVpbHRpbl9kYXRhID0gcGFyYW1zLnJlbGVhc2UoKTsKKyAgICAgIHJldHVybiBrVGZMaXRlT2s7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19QQUQ6IHsKKyAgICAgIHJldHVybiBQYXJzZVN0YWJsZWhsb1BhZChvcCwgZXJyb3JfcmVwb3J0ZXIsIGFsbG9jYXRvciwgYnVpbHRpbl9kYXRhKTsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0NPTVBPU0lURTogeworICAgICAgcmV0dXJuIFBhcnNlU3RhYmxlaGxvQ29tcG9zaXRlKG9wLCBlcnJvcl9yZXBvcnRlciwgYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWx0aW5fZGF0YSk7CisgICAgfQorICAgIC8vIFRPRE86IHNraXAgcGFyYW0gcGFyc2luZyBmb3Igbm93IHNpbmNlIG9wcyBiZWxvdyBkb24ndCBoYXZlIGtlcm5lbHMKKyAgICBjYXNlIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fU0xJQ0U6CisgICAgY2FzZSBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0JST0FEQ0FTVF9JTl9ESU06CisgICAgY2FzZSBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0NPTlZPTFVUSU9OOgorICAgIGNhc2UgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19MT0dJU1RJQzoKKyAgICBjYXNlIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fQUREOgorICAgIGNhc2UgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19ESVZJREU6CisgICAgY2FzZSBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX01VTFRJUExZOgorICAgIGNhc2UgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19NQVhJTVVNOgorICAgIGNhc2UgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19SRVNIQVBFOgorICAgIGNhc2UgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19DTEFNUDoKKyAgICBjYXNlIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fQ09OQ0FURU5BVEU6CisgICAgY2FzZSBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0NVU1RPTV9DQUxMOgorICAgIGNhc2UgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19SRURVQ0U6CisgICAgY2FzZSBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0FCUzoKKyAgICBjYXNlIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fQU5EOgorICAgIGNhc2UgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19DT1NJTkU6CisgICAgY2FzZSBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0VYUE9ORU5USUFMOgorICAgIGNhc2UgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19GTE9PUjoKKyAgICBjYXNlIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fTE9HOgorICAgIGNhc2UgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19NSU5JTVVNOgorICAgIGNhc2UgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19ORUdBVEU6CisgICAgY2FzZSBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX09SOgorICAgIGNhc2UgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19QT1dFUjoKKyAgICBjYXNlIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fUkVNQUlOREVSOgorICAgIGNhc2UgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19SU1FSVDoKKyAgICBjYXNlIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fU0VMRUNUOgorICAgIGNhc2UgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19TVUJUUkFDVDoKKyAgICBjYXNlIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fVEFOSDoKKyAgICBjYXNlIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fRFlOQU1JQ19TTElDRToKKyAgICBjYXNlIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fRFlOQU1JQ19VUERBVEVfU0xJQ0U6CisgICAgY2FzZSBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0lPVEE6CisgICAgY2FzZSBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0NPTVBBUkU6CisgICAgY2FzZSBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0NPTlZFUlQ6CisgICAgY2FzZSBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0RPVF9HRU5FUkFMOgorICAgIGNhc2UgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19TT1JUOgorICAgIGNhc2UgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19XSElMRToKKyAgICBjYXNlIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fVFJBTlNQT1NFOgogCiAgICAgLy8gQmVsb3cgYXJlIHRoZSBvcHMgd2l0aCBubyBidWlsdGluX2RhdGEgc3RydWN0dXJlLgogICAgIC8vIFRPRE8oYXNlbGxlKTogSW1wbGVtZW50IGNhbGwgaW4gQnVpbHRpbk9wdGlvbnMsIGJ1dCBudWxscHRycyBhcmUKQEAgLTg5OSw2ICsxMDA1LDcgQEAKICAgICBjYXNlIEJ1aWx0aW5PcGVyYXRvcl9TSUdOOgogICAgIGNhc2UgQnVpbHRpbk9wZXJhdG9yX0JJVENBU1Q6CiAgICAgY2FzZSBCdWlsdGluT3BlcmF0b3JfV0hFUkU6CisgICAgY2FzZSBCdWlsdGluT3BlcmF0b3JfRElMQVRFOgogICAgICAgcmV0dXJuIGtUZkxpdGVPazsKICAgICBjYXNlIEJ1aWx0aW5PcGVyYXRvcl9QTEFDRUhPTERFUl9GT1JfR1JFQVRFUl9PUF9DT0RFUzoKICAgICAgIHJldHVybiBrVGZMaXRlRXJyb3I7CkBAIC05MTQsNiArMTAyMSw5IEBACiAgICAgY2FzZSBUZW5zb3JUeXBlX0ZMT0FUMTY6CiAgICAgICAqdHlwZSA9IGtUZkxpdGVGbG9hdDE2OwogICAgICAgcmV0dXJuIGtUZkxpdGVPazsKKyAgICBjYXNlIFRlbnNvclR5cGVfQkZMT0FUMTY6CisgICAgICAqdHlwZSA9IGtUZkxpdGVCRmxvYXQxNjsKKyAgICAgIHJldHVybiBrVGZMaXRlT2s7CiAgICAgY2FzZSBUZW5zb3JUeXBlX0ZMT0FUMzI6CiAgICAgICAqdHlwZSA9IGtUZkxpdGVGbG9hdDMyOwogICAgICAgcmV0dXJuIGtUZkxpdGVPazsKQEAgLTk5OSw3ICsxMTA5LDcgQEAKICAgfSBlbHNlIHsKICAgICAvLyBUT0RPKGIvMTU3NDgwMTY5KTogV2Ugc2hvdWxkIGVpdGhlciByZXR1cm4ga1RmTGl0ZUVycm9yIG9yIGZpbGwgaW4gc29tZQogICAgIC8vIHJlYXNvbmFibGUgZGVmYXVsdHMgaW4gdGhlIHBhcmFtcyBzdHJ1Y3QuIFdlIGFyZSBub3QgZG9pbmcgc28gdW50aWwgd2UKLSAgICAvLyBiZXR0ZXIgdW5kZXJ0YW5kIHRoZSByYW1pZmljYXRpb25zIG9mIGNoYW5naW5nIHRoZSBsZWdhY3kgYmVoYXZpb3IuCisgICAgLy8gYmV0dGVyIHVuZGVyc3RhbmQgdGhlIHJhbWlmaWNhdGlvbnMgb2YgY2hhbmdpbmcgdGhlIGxlZ2FjeSBiZWhhdmlvci4KICAgfQogCiAgICpidWlsdGluX2RhdGEgPSBwYXJhbXMucmVsZWFzZSgpOwpAQCAtMTAyOSw3ICsxMTM5LDcgQEAKICAgfSBlbHNlIHsKICAgICAvLyBUT0RPKGIvMTU3NDgwMTY5KTogV2Ugc2hvdWxkIGVpdGhlciByZXR1cm4ga1RmTGl0ZUVycm9yIG9yIGZpbGwgaW4gc29tZQogICAgIC8vIHJlYXNvbmFibGUgZGVmYXVsdHMgaW4gdGhlIHBhcmFtcyBzdHJ1Y3QuIFdlIGFyZSBub3QgZG9pbmcgc28gdW50aWwgd2UKLSAgICAvLyBiZXR0ZXIgdW5kZXJ0YW5kIHRoZSByYW1pZmljYXRpb25zIG9mIGNoYW5naW5nIHRoZSBsZWdhY3kgYmVoYXZpb3IuCisgICAgLy8gYmV0dGVyIHVuZGVyc3RhbmQgdGhlIHJhbWlmaWNhdGlvbnMgb2YgY2hhbmdpbmcgdGhlIGxlZ2FjeSBiZWhhdmlvci4KICAgfQogCiAgICpidWlsdGluX2RhdGEgPSBwYXJhbXMucmVsZWFzZSgpOwpAQCAtMTA1NCw3ICsxMTY0LDcgQEAKICAgfSBlbHNlIHsKICAgICAvLyBUT0RPKGIvMTU3NDgwMTY5KTogV2Ugc2hvdWxkIGVpdGhlciByZXR1cm4ga1RmTGl0ZUVycm9yIG9yIGZpbGwgaW4gc29tZQogICAgIC8vIHJlYXNvbmFibGUgZGVmYXVsdHMgaW4gdGhlIHBhcmFtcyBzdHJ1Y3QuIFdlIGFyZSBub3QgZG9pbmcgc28gdW50aWwgd2UKLSAgICAvLyBiZXR0ZXIgdW5kZXJ0YW5kIHRoZSByYW1pZmljYXRpb25zIG9mIGNoYW5naW5nIHRoZSBsZWdhY3kgYmVoYXZpb3IuCisgICAgLy8gYmV0dGVyIHVuZGVyc3RhbmQgdGhlIHJhbWlmaWNhdGlvbnMgb2YgY2hhbmdpbmcgdGhlIGxlZ2FjeSBiZWhhdmlvci4KICAgfQogCiAgICpidWlsdGluX2RhdGEgPSBwYXJhbXMucmVsZWFzZSgpOwpAQCAtMTEzNCw3ICsxMjQ0LDcgQEAKICAgfSBlbHNlIHsKICAgICAvLyBUT0RPKGIvMTU3NDgwMTY5KTogV2Ugc2hvdWxkIGVpdGhlciByZXR1cm4ga1RmTGl0ZUVycm9yIG9yIGZpbGwgaW4gc29tZQogICAgIC8vIHJlYXNvbmFibGUgZGVmYXVsdHMgaW4gdGhlIHBhcmFtcyBzdHJ1Y3QuIFdlIGFyZSBub3QgZG9pbmcgc28gdW50aWwgd2UKLSAgICAvLyBiZXR0ZXIgdW5kZXJ0YW5kIHRoZSByYW1pZmljYXRpb25zIG9mIGNoYW5naW5nIHRoZSBsZWdhY3kgYmVoYXZpb3IuCisgICAgLy8gYmV0dGVyIHVuZGVyc3RhbmQgdGhlIHJhbWlmaWNhdGlvbnMgb2YgY2hhbmdpbmcgdGhlIGxlZ2FjeSBiZWhhdmlvci4KICAgfQogCiAgICpidWlsdGluX2RhdGEgPSBwYXJhbXMucmVsZWFzZSgpOwpAQCAtMTE5Miw3ICsxMzAyLDcgQEAKICAgfSBlbHNlIHsKICAgICAvLyBUT0RPKGIvMTU3NDgwMTY5KTogV2Ugc2hvdWxkIGVpdGhlciByZXR1cm4ga1RmTGl0ZUVycm9yIG9yIGZpbGwgaW4gc29tZQogICAgIC8vIHJlYXNvbmFibGUgZGVmYXVsdHMgaW4gdGhlIHBhcmFtcyBzdHJ1Y3QuIFdlIGFyZSBub3QgZG9pbmcgc28gdW50aWwgd2UKLSAgICAvLyBiZXR0ZXIgdW5kZXJ0YW5kIHRoZSByYW1pZmljYXRpb25zIG9mIGNoYW5naW5nIHRoZSBsZWdhY3kgYmVoYXZpb3IuCisgICAgLy8gYmV0dGVyIHVuZGVyc3RhbmQgdGhlIHJhbWlmaWNhdGlvbnMgb2YgY2hhbmdpbmcgdGhlIGxlZ2FjeSBiZWhhdmlvci4KICAgfQogCiAgICpidWlsdGluX2RhdGEgPSBwYXJhbXMucmVsZWFzZSgpOwpAQCAtMTIyMCwxMCArMTMzMCwxMyBAQAogCiAgICAgcGFyYW1zLT5kaWxhdGlvbl93aWR0aF9mYWN0b3IgPSBzY2hlbWFfcGFyYW1zLT5kaWxhdGlvbl93X2ZhY3RvcigpOwogICAgIHBhcmFtcy0+ZGlsYXRpb25faGVpZ2h0X2ZhY3RvciA9IHNjaGVtYV9wYXJhbXMtPmRpbGF0aW9uX2hfZmFjdG9yKCk7CisgICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKAorICAgICAgICBDb252ZXJ0VGVuc29yVHlwZShzY2hlbWFfcGFyYW1zLT5xdWFudGl6ZWRfYmlhc190eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMtPnF1YW50aXplZF9iaWFzX3R5cGUsIGVycm9yX3JlcG9ydGVyKSk7CiAgIH0gZWxzZSB7CiAgICAgLy8gVE9ETyhiLzE1NzQ4MDE2OSk6IFdlIHNob3VsZCBlaXRoZXIgcmV0dXJuIGtUZkxpdGVFcnJvciBvciBmaWxsIGluIHNvbWUKICAgICAvLyByZWFzb25hYmxlIGRlZmF1bHRzIGluIHRoZSBwYXJhbXMgc3RydWN0LiBXZSBhcmUgbm90IGRvaW5nIHNvIHVudGlsIHdlCi0gICAgLy8gYmV0dGVyIHVuZGVydGFuZCB0aGUgcmFtaWZpY2F0aW9ucyBvZiBjaGFuZ2luZyB0aGUgbGVnYWN5IGJlaGF2aW9yLgorICAgIC8vIGJldHRlciB1bmRlcnN0YW5kIHRoZSByYW1pZmljYXRpb25zIG9mIGNoYW5naW5nIHRoZSBsZWdhY3kgYmVoYXZpb3IuCiAgIH0KIAogICAqYnVpbHRpbl9kYXRhID0gcGFyYW1zLnJlbGVhc2UoKTsKQEAgLTEyNzQsNyArMTM4Nyw3IEBACiAgIH0gZWxzZSB7CiAgICAgLy8gVE9ETyhiLzE1NzQ4MDE2OSk6IFdlIHNob3VsZCBlaXRoZXIgcmV0dXJuIGtUZkxpdGVFcnJvciBvciBmaWxsIGluIHNvbWUKICAgICAvLyByZWFzb25hYmxlIGRlZmF1bHRzIGluIHRoZSBwYXJhbXMgc3RydWN0LiBXZSBhcmUgbm90IGRvaW5nIHNvIHVudGlsIHdlCi0gICAgLy8gYmV0dGVyIHVuZGVydGFuZCB0aGUgcmFtaWZpY2F0aW9ucyBvZiBjaGFuZ2luZyB0aGUgbGVnYWN5IGJlaGF2aW9yLgorICAgIC8vIGJldHRlciB1bmRlcnN0YW5kIHRoZSByYW1pZmljYXRpb25zIG9mIGNoYW5naW5nIHRoZSBsZWdhY3kgYmVoYXZpb3IuCiAgIH0KIAogICAqYnVpbHRpbl9kYXRhID0gcGFyYW1zLnJlbGVhc2UoKTsKQEAgLTEzMTAsNyArMTQyMyw3IEBACiAgIH0gZWxzZSB7CiAgICAgLy8gVE9ETyhiLzE1NzQ4MDE2OSk6IFdlIHNob3VsZCBlaXRoZXIgcmV0dXJuIGtUZkxpdGVFcnJvciBvciBmaWxsIGluIHNvbWUKICAgICAvLyByZWFzb25hYmxlIGRlZmF1bHRzIGluIHRoZSBwYXJhbXMgc3RydWN0LiBXZSBhcmUgbm90IGRvaW5nIHNvIHVudGlsIHdlCi0gICAgLy8gYmV0dGVyIHVuZGVydGFuZCB0aGUgcmFtaWZpY2F0aW9ucyBvZiBjaGFuZ2luZyB0aGUgbGVnYWN5IGJlaGF2aW9yLgorICAgIC8vIGJldHRlciB1bmRlcnN0YW5kIHRoZSByYW1pZmljYXRpb25zIG9mIGNoYW5naW5nIHRoZSBsZWdhY3kgYmVoYXZpb3IuCiAgIH0KIAogICAqYnVpbHRpbl9kYXRhID0gcGFyYW1zLnJlbGVhc2UoKTsKQEAgLTE0MzQsNyArMTU0Nyw5IEBACiAgICAgcGFyYW1zLT5rZWVwX251bV9kaW1zID0gc2NoZW1hX3BhcmFtcy0+a2VlcF9udW1fZGltcygpOwogICAgIHBhcmFtcy0+YXN5bW1ldHJpY19xdWFudGl6ZV9pbnB1dHMgPQogICAgICAgICBzY2hlbWFfcGFyYW1zLT5hc3ltbWV0cmljX3F1YW50aXplX2lucHV0cygpOwotCisgICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKAorICAgICAgICBDb252ZXJ0VGVuc29yVHlwZShzY2hlbWFfcGFyYW1zLT5xdWFudGl6ZWRfYmlhc190eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMtPnF1YW50aXplZF9iaWFzX3R5cGUsIGVycm9yX3JlcG9ydGVyKSk7CiAgICAgc3dpdGNoIChzY2hlbWFfcGFyYW1zLT53ZWlnaHRzX2Zvcm1hdCgpKSB7CiAgICAgICBjYXNlIEZ1bGx5Q29ubmVjdGVkT3B0aW9uc1dlaWdodHNGb3JtYXRfREVGQVVMVDoKICAgICAgICAgcGFyYW1zLT53ZWlnaHRzX2Zvcm1hdCA9IGtUZkxpdGVGdWxseUNvbm5lY3RlZFdlaWdodHNGb3JtYXREZWZhdWx0OwpAQCAtMTQ1MSw3ICsxNTY2LDcgQEAKICAgfSBlbHNlIHsKICAgICAvLyBUT0RPKGIvMTU3NDgwMTY5KTogV2Ugc2hvdWxkIGVpdGhlciByZXR1cm4ga1RmTGl0ZUVycm9yIG9yIGZpbGwgaW4gc29tZQogICAgIC8vIHJlYXNvbmFibGUgZGVmYXVsdHMgaW4gdGhlIHBhcmFtcyBzdHJ1Y3QuIFdlIGFyZSBub3QgZG9pbmcgc28gdW50aWwgd2UKLSAgICAvLyBiZXR0ZXIgdW5kZXJ0YW5kIHRoZSByYW1pZmljYXRpb25zIG9mIGNoYW5naW5nIHRoZSBsZWdhY3kgYmVoYXZpb3IuCisgICAgLy8gYmV0dGVyIHVuZGVyc3RhbmQgdGhlIHJhbWlmaWNhdGlvbnMgb2YgY2hhbmdpbmcgdGhlIGxlZ2FjeSBiZWhhdmlvci4KICAgfQogCiAgICpidWlsdGluX2RhdGEgPSBwYXJhbXMucmVsZWFzZSgpOwpAQCAtMTUyOCw3ICsxNjQzLDcgQEAKICAgfSBlbHNlIHsKICAgICAvLyBUT0RPKGIvMTU3NDgwMTY5KTogV2Ugc2hvdWxkIGVpdGhlciByZXR1cm4ga1RmTGl0ZUVycm9yIG9yIGZpbGwgaW4gc29tZQogICAgIC8vIHJlYXNvbmFibGUgZGVmYXVsdHMgaW4gdGhlIHBhcmFtcyBzdHJ1Y3QuIFdlIGFyZSBub3QgZG9pbmcgc28gdW50aWwgd2UKLSAgICAvLyBiZXR0ZXIgdW5kZXJ0YW5kIHRoZSByYW1pZmljYXRpb25zIG9mIGNoYW5naW5nIHRoZSBsZWdhY3kgYmVoYXZpb3IuCisgICAgLy8gYmV0dGVyIHVuZGVyc3RhbmQgdGhlIHJhbWlmaWNhdGlvbnMgb2YgY2hhbmdpbmcgdGhlIGxlZ2FjeSBiZWhhdmlvci4KICAgfQogCiAgICpidWlsdGluX2RhdGEgPSBwYXJhbXMucmVsZWFzZSgpOwpAQCAtMTU1NSw3ICsxNjcwLDcgQEAKICAgfSBlbHNlIHsKICAgICAvLyBUT0RPKGIvMTU3NDgwMTY5KTogV2Ugc2hvdWxkIGVpdGhlciByZXR1cm4ga1RmTGl0ZUVycm9yIG9yIGZpbGwgaW4gc29tZQogICAgIC8vIHJlYXNvbmFibGUgZGVmYXVsdHMgaW4gdGhlIHBhcmFtcyBzdHJ1Y3QuIFdlIGFyZSBub3QgZG9pbmcgc28gdW50aWwgd2UKLSAgICAvLyBiZXR0ZXIgdW5kZXJ0YW5kIHRoZSByYW1pZmljYXRpb25zIG9mIGNoYW5naW5nIHRoZSBsZWdhY3kgYmVoYXZpb3IuCisgICAgLy8gYmV0dGVyIHVuZGVyc3RhbmQgdGhlIHJhbWlmaWNhdGlvbnMgb2YgY2hhbmdpbmcgdGhlIGxlZ2FjeSBiZWhhdmlvci4KICAgfQogCiAgICpidWlsdGluX2RhdGEgPSBwYXJhbXMucmVsZWFzZSgpOwpAQCAtMTcxMSw3ICsxODI2LDcgQEAKICAgfSBlbHNlIHsKICAgICAvLyBUT0RPKGIvMTU3NDgwMTY5KTogV2Ugc2hvdWxkIGVpdGhlciByZXR1cm4ga1RmTGl0ZUVycm9yIG9yIGZpbGwgaW4gc29tZQogICAgIC8vIHJlYXNvbmFibGUgZGVmYXVsdHMgaW4gdGhlIHBhcmFtcyBzdHJ1Y3QuIFdlIGFyZSBub3QgZG9pbmcgc28gdW50aWwgd2UKLSAgICAvLyBiZXR0ZXIgdW5kZXJ0YW5kIHRoZSByYW1pZmljYXRpb25zIG9mIGNoYW5naW5nIHRoZSBsZWdhY3kgYmVoYXZpb3IuCisgICAgLy8gYmV0dGVyIHVuZGVyc3RhbmQgdGhlIHJhbWlmaWNhdGlvbnMgb2YgY2hhbmdpbmcgdGhlIGxlZ2FjeSBiZWhhdmlvci4KICAgfQogCiAgICpidWlsdGluX2RhdGEgPSBwYXJhbXMucmVsZWFzZSgpOwpAQCAtMTczNSw3ICsxODUwLDcgQEAKICAgfSBlbHNlIHsKICAgICAvLyBUT0RPKGIvMTU3NDgwMTY5KTogV2Ugc2hvdWxkIGVpdGhlciByZXR1cm4ga1RmTGl0ZUVycm9yIG9yIGZpbGwgaW4gc29tZQogICAgIC8vIHJlYXNvbmFibGUgZGVmYXVsdHMgaW4gdGhlIHBhcmFtcyBzdHJ1Y3QuIFdlIGFyZSBub3QgZG9pbmcgc28gdW50aWwgd2UKLSAgICAvLyBiZXR0ZXIgdW5kZXJ0YW5kIHRoZSByYW1pZmljYXRpb25zIG9mIGNoYW5naW5nIHRoZSBsZWdhY3kgYmVoYXZpb3IuCisgICAgLy8gYmV0dGVyIHVuZGVyc3RhbmQgdGhlIHJhbWlmaWNhdGlvbnMgb2YgY2hhbmdpbmcgdGhlIGxlZ2FjeSBiZWhhdmlvci4KICAgfQogCiAgICpidWlsdGluX2RhdGEgPSBwYXJhbXMucmVsZWFzZSgpOwpAQCAtMTc3Niw3ICsxODkxLDcgQEAKICAgfSBlbHNlIHsKICAgICAvLyBUT0RPKGIvMTU3NDgwMTY5KTogV2Ugc2hvdWxkIGVpdGhlciByZXR1cm4ga1RmTGl0ZUVycm9yIG9yIGZpbGwgaW4gc29tZQogICAgIC8vIHJlYXNvbmFibGUgZGVmYXVsdHMgaW4gdGhlIHBhcmFtcyBzdHJ1Y3QuIFdlIGFyZSBub3QgZG9pbmcgc28gdW50aWwgd2UKLSAgICAvLyBiZXR0ZXIgdW5kZXJ0YW5kIHRoZSByYW1pZmljYXRpb25zIG9mIGNoYW5naW5nIHRoZSBsZWdhY3kgYmVoYXZpb3IuCisgICAgLy8gYmV0dGVyIHVuZGVyc3RhbmQgdGhlIHJhbWlmaWNhdGlvbnMgb2YgY2hhbmdpbmcgdGhlIGxlZ2FjeSBiZWhhdmlvci4KICAgfQogCiAgICpidWlsdGluX2RhdGEgPSBwYXJhbXMucmVsZWFzZSgpOwpAQCAtMTgyMiw3ICsxOTM3LDcgQEAKICAgfSBlbHNlIHsKICAgICAvLyBUT0RPKGIvMTU3NDgwMTY5KTogV2Ugc2hvdWxkIGVpdGhlciByZXR1cm4ga1RmTGl0ZUVycm9yIG9yIGZpbGwgaW4gc29tZQogICAgIC8vIHJlYXNvbmFibGUgZGVmYXVsdHMgaW4gdGhlIHBhcmFtcyBzdHJ1Y3QuIFdlIGFyZSBub3QgZG9pbmcgc28gdW50aWwgd2UKLSAgICAvLyBiZXR0ZXIgdW5kZXJ0YW5kIHRoZSByYW1pZmljYXRpb25zIG9mIGNoYW5naW5nIHRoZSBsZWdhY3kgYmVoYXZpb3IuCisgICAgLy8gYmV0dGVyIHVuZGVyc3RhbmQgdGhlIHJhbWlmaWNhdGlvbnMgb2YgY2hhbmdpbmcgdGhlIGxlZ2FjeSBiZWhhdmlvci4KICAgfQogCiAgICpidWlsdGluX2RhdGEgPSBwYXJhbXMucmVsZWFzZSgpOwpAQCAtMTg4MCw3ICsxOTk1LDcgQEAKICAgfSBlbHNlIHsKICAgICAvLyBUT0RPKGIvMTU3NDgwMTY5KTogV2Ugc2hvdWxkIGVpdGhlciByZXR1cm4ga1RmTGl0ZUVycm9yIG9yIGZpbGwgaW4gc29tZQogICAgIC8vIHJlYXNvbmFibGUgZGVmYXVsdHMgaW4gdGhlIHBhcmFtcyBzdHJ1Y3QuIFdlIGFyZSBub3QgZG9pbmcgc28gdW50aWwgd2UKLSAgICAvLyBiZXR0ZXIgdW5kZXJ0YW5kIHRoZSByYW1pZmljYXRpb25zIG9mIGNoYW5naW5nIHRoZSBsZWdhY3kgYmVoYXZpb3IuCisgICAgLy8gYmV0dGVyIHVuZGVyc3RhbmQgdGhlIHJhbWlmaWNhdGlvbnMgb2YgY2hhbmdpbmcgdGhlIGxlZ2FjeSBiZWhhdmlvci4KICAgfQogCiAgICpidWlsdGluX2RhdGEgPSBwYXJhbXMucmVsZWFzZSgpOwpAQCAtMTkzMyw3ICsyMDQ4LDcgQEAKICAgfSBlbHNlIHsKICAgICAvLyBUT0RPKGIvMTU3NDgwMTY5KTogV2Ugc2hvdWxkIGVpdGhlciByZXR1cm4ga1RmTGl0ZUVycm9yIG9yIGZpbGwgaW4gc29tZQogICAgIC8vIHJlYXNvbmFibGUgZGVmYXVsdHMgaW4gdGhlIHBhcmFtcyBzdHJ1Y3QuIFdlIGFyZSBub3QgZG9pbmcgc28gdW50aWwgd2UKLSAgICAvLyBiZXR0ZXIgdW5kZXJ0YW5kIHRoZSByYW1pZmljYXRpb25zIG9mIGNoYW5naW5nIHRoZSBsZWdhY3kgYmVoYXZpb3IuCisgICAgLy8gYmV0dGVyIHVuZGVyc3RhbmQgdGhlIHJhbWlmaWNhdGlvbnMgb2YgY2hhbmdpbmcgdGhlIGxlZ2FjeSBiZWhhdmlvci4KICAgfQogCiAgICpidWlsdGluX2RhdGEgPSBwYXJhbXMucmVsZWFzZSgpOwpAQCAtMTk5NCw2ICsyMTA5LDMwNyBAQAogICByZXR1cm4ga1RmTGl0ZU9rOwogfQogCitUZkxpdGVTdGF0dXMgUGFyc2VTdGFibGVobG9SZWR1Y2VXaW5kb3coY29uc3QgT3BlcmF0b3IqIG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yUmVwb3J0ZXIqIGVycm9yX3JlcG9ydGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWx0aW5EYXRhQWxsb2NhdG9yKiBhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIGJ1aWx0aW5fZGF0YSkgeworICBDaGVja1BhcnNlUG9pbnRlclBhcmFtcyhvcCwgZXJyb3JfcmVwb3J0ZXIsIGFsbG9jYXRvciwgYnVpbHRpbl9kYXRhKTsKKworICBTYWZlQnVpbHRpbkRhdGFBbGxvY2F0b3Igc2FmZV9hbGxvY2F0b3IoYWxsb2NhdG9yKTsKKyAgYXV0byBwYXJhbXMgPSBzYWZlX2FsbG9jYXRvci5BbGxvY2F0ZTxUZkxpdGVTdGFibGVobG9SZWR1Y2VXaW5kb3dQYXJhbXM+KCk7CisKKyAgY29uc3QgU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9ucyogc2NoZW1hX3BhcmFtcyA9CisgICAgICBvcC0+YnVpbHRpbl9vcHRpb25zXzJfYXNfU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9ucygpOworICBpZiAoc2NoZW1hX3BhcmFtcykgeworICAgIGlmICghc2NoZW1hX3BhcmFtcy0+d2luZG93X2RpbWVuc2lvbnMoKSB8fAorICAgICAgICBzY2hlbWFfcGFyYW1zLT53aW5kb3dfZGltZW5zaW9ucygpLT5zaXplKCkgPT0gMCkgeworICAgICAgVEZfTElURV9SRVBPUlRfRVJST1IoZXJyb3JfcmVwb3J0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJ3dpbmRvd19kaW1lbnNpb25zJyBhdHRyaWJ1dGUgaXMgbm90IG9wdGlvbmFsIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJ3N0YWJsZWhsby5yZWR1Y2Vfd2luZG93JyBhbmQgY2Fubm90IGJlIGVtcHR5LiIpOworICAgICAgcmV0dXJuIGtUZkxpdGVFcnJvcjsKKyAgICB9CisKKyAgICBjb25zdCBzaXplX3QgcmFuayA9IHNjaGVtYV9wYXJhbXMtPndpbmRvd19kaW1lbnNpb25zKCktPnNpemUoKTsKKworICAgIGF1dG8gTG9hZEF0dHIgPSBbJmVycm9yX3JlcG9ydGVyXSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIHBhcmFtc19hcnJheSwgc2l6ZV90IHBhcmFtc19hcnJheV9zaXplX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiogZmxhdGJ1ZmZlcl92ZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBhdHRyX25hbWUsIGNvbnN0IHNpemVfdCBleHBlY3RlZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBmaWxsX3ZhbHVlKSAtPiBUZkxpdGVTdGF0dXMgeworICAgICAgaWYgKGZsYXRidWZmZXJfdmVjdG9yICYmIGZsYXRidWZmZXJfdmVjdG9yLT5zaXplKCkpIHsKKyAgICAgICAgaWYgKGV4cGVjdGVkX3NpemUgIT0gMCAmJiBmbGF0YnVmZmVyX3ZlY3Rvci0+c2l6ZSgpICE9IGV4cGVjdGVkX3NpemUpIHsKKyAgICAgICAgICBURl9MSVRFX1JFUE9SVF9FUlJPUigKKyAgICAgICAgICAgICAgZXJyb3JfcmVwb3J0ZXIsCisgICAgICAgICAgICAgICInJXMnIGF0dHJpYnV0ZSBvZiAnc3RhYmxlaGxvLnJlZHVjZV93aW5kb3cnIGRvZXMgbm90IGhhdmUgdGhlICIKKyAgICAgICAgICAgICAgImV4cGVjdGVkIHNpemUgKCVsbHUgIT0gJWxsdSkuIiwKKyAgICAgICAgICAgICAgYXR0cl9uYW1lLCBmbGF0YnVmZmVyX3ZlY3Rvci0+c2l6ZSgpLCBleHBlY3RlZF9zaXplKTsKKyAgICAgICAgICByZXR1cm4ga1RmTGl0ZUVycm9yOworICAgICAgICB9CisgICAgICAgIFRmTGl0ZVN0YXR1cyBzdGF0dXMgPSBGbGF0QnVmZmVySW50VmVjdG9yVG9BcnJheSgKKyAgICAgICAgICAgIHBhcmFtc19hcnJheV9zaXplX2J5dGVzLCBmbGF0YnVmZmVyX3ZlY3RvciwgcGFyYW1zX2FycmF5LAorICAgICAgICAgICAgZXJyb3JfcmVwb3J0ZXIsICJzdGFibGVobG8ucmVkdWNlX3dpbmRvdyIpOworICAgICAgICBpZiAoc3RhdHVzICE9IGtUZkxpdGVPaykgeworICAgICAgICAgIFRGX0xJVEVfUkVQT1JUX0VSUk9SKGVycm9yX3JlcG9ydGVyLCAiQ2hlY2sgdGhlICclcycgYXR0cmlidXRlLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cl9uYW1lKTsKKyAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OmZpbGxfbihwYXJhbXNfYXJyYXksIHBhcmFtc19hcnJheV9zaXplX2J5dGVzIC8gc2l6ZW9mKGludDY0X3QpLAorICAgICAgICAgICAgICAgICAgICBmaWxsX3ZhbHVlKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBrVGZMaXRlT2s7CisgICAgfTsKKworICAgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUygKKyAgICAgICAgTG9hZEF0dHIocGFyYW1zLT53aW5kb3dfZGltZW5zaW9ucywgc2l6ZW9mKHBhcmFtcy0+d2luZG93X2RpbWVuc2lvbnMpLAorICAgICAgICAgICAgICAgICBzY2hlbWFfcGFyYW1zLT53aW5kb3dfZGltZW5zaW9ucygpLCAid2luZG93X2RpbWVuc2lvbnMiLAorICAgICAgICAgICAgICAgICAvKmV4cGVjdGVkX3NpemU9Ki9yYW5rLCAvKmZpbGxfdmFsdWU9Ki8xKSk7CisgICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKAorICAgICAgICBMb2FkQXR0cihwYXJhbXMtPndpbmRvd19zdHJpZGVzLCBzaXplb2YocGFyYW1zLT53aW5kb3dfc3RyaWRlcyksCisgICAgICAgICAgICAgICAgIHNjaGVtYV9wYXJhbXMtPndpbmRvd19zdHJpZGVzKCksICJ3aW5kb3dfc3RyaWRlcyIsCisgICAgICAgICAgICAgICAgIC8qZXhwZWN0ZWRfc2l6ZT0qL3JhbmssIC8qZmlsbF92YWx1ZT0qLzEpKTsKKyAgICBURl9MSVRFX0VOU1VSRV9TVEFUVVMoCisgICAgICAgIExvYWRBdHRyKHBhcmFtcy0+YmFzZV9kaWxhdGlvbnMsIHNpemVvZihwYXJhbXMtPmJhc2VfZGlsYXRpb25zKSwKKyAgICAgICAgICAgICAgICAgc2NoZW1hX3BhcmFtcy0+YmFzZV9kaWxhdGlvbnMoKSwgImJhc2VfZGlsYXRpb25zIiwKKyAgICAgICAgICAgICAgICAgLypleHBlY3RlZF9zaXplPSovcmFuaywgLypmaWxsX3ZhbHVlPSovMSkpOworICAgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUygKKyAgICAgICAgTG9hZEF0dHIocGFyYW1zLT53aW5kb3dfZGlsYXRpb25zLCBzaXplb2YocGFyYW1zLT53aW5kb3dfZGlsYXRpb25zKSwKKyAgICAgICAgICAgICAgICAgc2NoZW1hX3BhcmFtcy0+d2luZG93X2RpbGF0aW9ucygpLCAid2luZG93X2RpbGF0aW9ucyIsCisgICAgICAgICAgICAgICAgIC8qZXhwZWN0ZWRfc2l6ZT0qL3JhbmssIC8qZmlsbF92YWx1ZT0qLzEpKTsKKyAgICBURl9MSVRFX0VOU1VSRV9TVEFUVVMoTG9hZEF0dHIocGFyYW1zLT5wYWRkaW5nLCBzaXplb2YocGFyYW1zLT5wYWRkaW5nKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hX3BhcmFtcy0+cGFkZGluZygpLCAicGFkZGluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qZXhwZWN0ZWRfc2l6ZT0qLzIgKiByYW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmZpbGxfdmFsdWU9Ki8wKSk7CisKKyAgICBwYXJhbXMtPmJvZHlfc3ViZ3JhcGhfaW5kZXggPSBzY2hlbWFfcGFyYW1zLT5ib2R5X3N1YmdyYXBoX2luZGV4KCk7CisgICAgKmJ1aWx0aW5fZGF0YSA9IHBhcmFtcy5yZWxlYXNlKCk7CisgICAgcmV0dXJuIGtUZkxpdGVPazsKKyAgfQorICBURl9MSVRFX1JFUE9SVF9FUlJPUigKKyAgICAgIGVycm9yX3JlcG9ydGVyLAorICAgICAgIkNvdWxkIG5vdCBnZXQgJ3N0YWJsZWhsby5yZWR1Y2Vfd2luZG93JyBvcGVyYXRpb24gcGFyYW1ldGVycy4iKTsKKyAgcmV0dXJuIGtUZkxpdGVFcnJvcjsKK30KKworVGZMaXRlU3RhdHVzIFBhcnNlU3RhYmxlaGxvU2NhdHRlcihjb25zdCBPcGVyYXRvciogb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yUmVwb3J0ZXIqIGVycm9yX3JlcG9ydGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsdGluRGF0YUFsbG9jYXRvciogYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogYnVpbHRpbl9kYXRhKSB7CisgIENoZWNrUGFyc2VQb2ludGVyUGFyYW1zKG9wLCBlcnJvcl9yZXBvcnRlciwgYWxsb2NhdG9yLCBidWlsdGluX2RhdGEpOworCisgIFNhZmVCdWlsdGluRGF0YUFsbG9jYXRvciBzYWZlX2FsbG9jYXRvcihhbGxvY2F0b3IpOworICBzdGQ6OnVuaXF1ZV9wdHI8VGZMaXRlU3RhYmxlaGxvU2NhdHRlclBhcmFtcywKKyAgICAgICAgICAgICAgICAgIFNhZmVCdWlsdGluRGF0YUFsbG9jYXRvcjo6QnVpbHRpbkRhdGFEZWxldGVyPgorICAgICAgcGFyYW1zID0gc2FmZV9hbGxvY2F0b3IuQWxsb2NhdGU8VGZMaXRlU3RhYmxlaGxvU2NhdHRlclBhcmFtcz4oKTsKKyAgVEZfTElURV9FTlNVUkUoZXJyb3JfcmVwb3J0ZXIsIHBhcmFtcyAhPSBudWxscHRyKTsKKworICBjb25zdCBTdGFibGVobG9TY2F0dGVyT3B0aW9ucyogc2NoZW1hX3BhcmFtcyA9CisgICAgICBvcC0+YnVpbHRpbl9vcHRpb25zXzJfYXNfU3RhYmxlaGxvU2NhdHRlck9wdGlvbnMoKTsKKyAgaWYgKHNjaGVtYV9wYXJhbXMpIHsKKyAgICBwYXJhbXMtPmluZGljZXNfYXJlX3NvcnRlZCA9IHNjaGVtYV9wYXJhbXMtPmluZGljZXNfYXJlX3NvcnRlZCgpOworCisgICAgaWYgKHNjaGVtYV9wYXJhbXMtPnVwZGF0ZV93aW5kb3dfZGltcygpKSB7CisgICAgICBURl9MSVRFX0VOU1VSRV9TVEFUVVMoRmxhdEJ1ZmZlckludFZlY3RvclRvQXJyYXk8aW50NjRfdD4oCisgICAgICAgICAgc2NoZW1hX3BhcmFtcy0+dXBkYXRlX3dpbmRvd19kaW1zKCktPnNpemUoKSAqIHNpemVvZihpbnQ2NF90KSwKKyAgICAgICAgICBzY2hlbWFfcGFyYW1zLT51cGRhdGVfd2luZG93X2RpbXMoKSwgcGFyYW1zLT51cGRhdGVfd2luZG93X2RpbXMsCisgICAgICAgICAgZXJyb3JfcmVwb3J0ZXIsICJzdGFibGVobG9fc2NhdHRlciIpKTsKKyAgICAgIHBhcmFtcy0+bnVtX3VwZGF0ZV93aW5kb3dfZGltcyA9CisgICAgICAgICAgc2NoZW1hX3BhcmFtcy0+dXBkYXRlX3dpbmRvd19kaW1zKCktPnNpemUoKTsKKyAgICB9CisKKyAgICBpZiAoc2NoZW1hX3BhcmFtcy0+aW5zZXJ0ZWRfd2luZG93X2RpbXMoKSkgeworICAgICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKEZsYXRCdWZmZXJJbnRWZWN0b3JUb0FycmF5PGludDY0X3Q+KAorICAgICAgICAgIHNjaGVtYV9wYXJhbXMtPmluc2VydGVkX3dpbmRvd19kaW1zKCktPnNpemUoKSAqIHNpemVvZihpbnQ2NF90KSwKKyAgICAgICAgICBzY2hlbWFfcGFyYW1zLT5pbnNlcnRlZF93aW5kb3dfZGltcygpLCBwYXJhbXMtPmluc2VydGVkX3dpbmRvd19kaW1zLAorICAgICAgICAgIGVycm9yX3JlcG9ydGVyLCAic3RhYmxlaGxvX3NjYXR0ZXIiKSk7CisgICAgICBwYXJhbXMtPm51bV9pbnNlcnRlZF93aW5kb3dfZGltcyA9CisgICAgICAgICAgc2NoZW1hX3BhcmFtcy0+aW5zZXJ0ZWRfd2luZG93X2RpbXMoKS0+c2l6ZSgpOworICAgIH0KKworICAgIGlmIChzY2hlbWFfcGFyYW1zLT5zY2F0dGVyX2RpbXNfdG9fb3BlcmFuZF9kaW1zKCkpIHsKKyAgICAgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhGbGF0QnVmZmVySW50VmVjdG9yVG9BcnJheTxpbnQ2NF90PigKKyAgICAgICAgICBzY2hlbWFfcGFyYW1zLT5zY2F0dGVyX2RpbXNfdG9fb3BlcmFuZF9kaW1zKCktPnNpemUoKSAqCisgICAgICAgICAgICAgIHNpemVvZihpbnQ2NF90KSwKKyAgICAgICAgICBzY2hlbWFfcGFyYW1zLT5zY2F0dGVyX2RpbXNfdG9fb3BlcmFuZF9kaW1zKCksCisgICAgICAgICAgcGFyYW1zLT5zY2F0dGVyX2RpbXNfdG9fb3BlcmFuZF9kaW1zLCBlcnJvcl9yZXBvcnRlciwKKyAgICAgICAgICAic3RhYmxlaGxvX3NjYXR0ZXIiKSk7CisgICAgICBwYXJhbXMtPm51bV9zY2F0dGVyX2RpbXNfdG9fb3BlcmFuZF9kaW1zID0KKyAgICAgICAgICBzY2hlbWFfcGFyYW1zLT5zY2F0dGVyX2RpbXNfdG9fb3BlcmFuZF9kaW1zKCktPnNpemUoKTsKKyAgICB9CisKKyAgICBwYXJhbXMtPmluZGV4X3ZlY3Rvcl9kaW0gPSBzY2hlbWFfcGFyYW1zLT5pbmRleF92ZWN0b3JfZGltKCk7CisgICAgcGFyYW1zLT51bmlxdWVfaW5kaWNlcyA9IHNjaGVtYV9wYXJhbXMtPnVuaXF1ZV9pbmRpY2VzKCk7CisgICAgcGFyYW1zLT51cGRhdGVfY29tcHV0YXRpb25fc3ViZ3JhcGhfaW5kZXggPQorICAgICAgICBzY2hlbWFfcGFyYW1zLT51cGRhdGVfY29tcHV0YXRpb25fc3ViZ3JhcGhfaW5kZXgoKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBUT0RPKGIvMTU3NDgwMTY5KTogV2Ugc2hvdWxkIGVpdGhlciByZXR1cm4ga1RmTGl0ZUVycm9yIG9yIGZpbGwgaW4gc29tZQorICAgIC8vIHJlYXNvbmFibGUgZGVmYXVsdHMgaW4gdGhlIHBhcmFtcyBzdHJ1Y3QuIFdlIGFyZSBub3QgZG9pbmcgc28gdW50aWwgd2UKKyAgICAvLyBiZXR0ZXIgdW5kZXJzdGFuZCB0aGUgcmFtaWZpY2F0aW9ucyBvZiBjaGFuZ2luZyB0aGUgbGVnYWN5IGJlaGF2aW9yLgorICB9CisgICpidWlsdGluX2RhdGEgPSBwYXJhbXMucmVsZWFzZSgpOworICByZXR1cm4ga1RmTGl0ZU9rOworfQorCitUZkxpdGVTdGF0dXMgUGFyc2VTdGFibGVobG9SbmdCaXRHZW5lcmF0b3IoY29uc3QgT3BlcmF0b3IqIG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yUmVwb3J0ZXIqIGVycm9yX3JlcG9ydGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWx0aW5EYXRhQWxsb2NhdG9yKiBhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIGJ1aWx0aW5fZGF0YSkgeworICBDaGVja1BhcnNlUG9pbnRlclBhcmFtcyhvcCwgZXJyb3JfcmVwb3J0ZXIsIGFsbG9jYXRvciwgYnVpbHRpbl9kYXRhKTsKKworICBTYWZlQnVpbHRpbkRhdGFBbGxvY2F0b3Igc2FmZV9hbGxvY2F0b3IoYWxsb2NhdG9yKTsKKyAgc3RkOjp1bmlxdWVfcHRyPFRmTGl0ZVN0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvclBhcmFtcywKKyAgICAgICAgICAgICAgICAgIFNhZmVCdWlsdGluRGF0YUFsbG9jYXRvcjo6QnVpbHRpbkRhdGFEZWxldGVyPgorICAgICAgcGFyYW1zID0gc2FmZV9hbGxvY2F0b3IuQWxsb2NhdGU8VGZMaXRlU3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yUGFyYW1zPigpOworICBURl9MSVRFX0VOU1VSRShlcnJvcl9yZXBvcnRlciwgcGFyYW1zICE9IG51bGxwdHIpOworCisgIGNvbnN0IFN0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnMqIHNjaGVtYV9wYXJhbXMgPQorICAgICAgb3AtPmJ1aWx0aW5fb3B0aW9uc18yX2FzX1N0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnMoKTsKKyAgaWYgKHNjaGVtYV9wYXJhbXMgIT0gbnVsbHB0cikgeworICAgIHBhcmFtcy0+YWxnb3JpdGhtID0gQ29udmVydFJuZ0FsZ29yaXRobShzY2hlbWFfcGFyYW1zLT5hbGdvcml0aG0oKSk7CisgIH0gZWxzZSB7CisgICAgLy8gVE9ETyhiLzE1NzQ4MDE2OSk6IFdlIHNob3VsZCBlaXRoZXIgcmV0dXJuIGtUZkxpdGVFcnJvciBvciBmaWxsIGluIHNvbWUKKyAgICAvLyByZWFzb25hYmxlIGRlZmF1bHRzIGluIHRoZSBwYXJhbXMgc3RydWN0LiBXZSBhcmUgbm90IGRvaW5nIHNvIHVudGlsIHdlCisgICAgLy8gYmV0dGVyIHVuZGVyc3RhbmQgdGhlIHJhbWlmaWNhdGlvbnMgb2YgY2hhbmdpbmcgdGhlIGxlZ2FjeSBiZWhhdmlvci4KKyAgfQorCisgICpidWlsdGluX2RhdGEgPSBwYXJhbXMucmVsZWFzZSgpOworICByZXR1cm4ga1RmTGl0ZU9rOworfQorCitUZkxpdGVTdGF0dXMgUGFyc2VTdGFibGVobG9HYXRoZXIoY29uc3QgT3BlcmF0b3IqIG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yUmVwb3J0ZXIqIGVycm9yX3JlcG9ydGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWx0aW5EYXRhQWxsb2NhdG9yKiBhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIGJ1aWx0aW5fZGF0YSkgeworICBDaGVja1BhcnNlUG9pbnRlclBhcmFtcyhvcCwgZXJyb3JfcmVwb3J0ZXIsIGFsbG9jYXRvciwgYnVpbHRpbl9kYXRhKTsKKworICBTYWZlQnVpbHRpbkRhdGFBbGxvY2F0b3Igc2FmZV9hbGxvY2F0b3IoYWxsb2NhdG9yKTsKKyAgc3RkOjp1bmlxdWVfcHRyPFRmTGl0ZVN0YWJsZWhsb0dhdGhlclBhcmFtcywKKyAgICAgICAgICAgICAgICAgIFNhZmVCdWlsdGluRGF0YUFsbG9jYXRvcjo6QnVpbHRpbkRhdGFEZWxldGVyPgorICAgICAgcGFyYW1zID0gc2FmZV9hbGxvY2F0b3IuQWxsb2NhdGU8VGZMaXRlU3RhYmxlaGxvR2F0aGVyUGFyYW1zPigpOworICBURl9MSVRFX0VOU1VSRShlcnJvcl9yZXBvcnRlciwgcGFyYW1zICE9IG51bGxwdHIpOworCisgIGNvbnN0IFN0YWJsZWhsb0dhdGhlck9wdGlvbnMqIHNjaGVtYV9wYXJhbXMgPQorICAgICAgb3AtPmJ1aWx0aW5fb3B0aW9uc18yX2FzX1N0YWJsZWhsb0dhdGhlck9wdGlvbnMoKTsKKworICBpZiAoc2NoZW1hX3BhcmFtcyAhPSBudWxscHRyKSB7CisgICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKEZsYXRCdWZmZXJJbnRWZWN0b3JUb0FycmF5PGludDY0X3Q+KAorICAgICAgICAvKm1heF9zaXplX29mX2J1ZmZlcj0qL3NjaGVtYV9wYXJhbXMtPm9mZnNldF9kaW1zKCktPnNpemUoKSAqCisgICAgICAgICAgICBzaXplb2YoaW50NjRfdCksCisgICAgICAgIC8qZmxhdF92ZWN0b3I9Ki9zY2hlbWFfcGFyYW1zLT5vZmZzZXRfZGltcygpLAorICAgICAgICAvKmJ1ZmZlcj0qL3BhcmFtcy0+b2Zmc2V0X2RpbXMsIC8qZXJyb3JfcmVwb3J0ZXI9Ki9lcnJvcl9yZXBvcnRlciwKKyAgICAgICAgLypvcF9uYW1lPSovInN0YWJsZWhsb19nYXRoZXIiKSk7CisgICAgcGFyYW1zLT5udW1fb2Zmc2V0X2RpbXMgPSBzY2hlbWFfcGFyYW1zLT5vZmZzZXRfZGltcygpLT5zaXplKCk7CisKKyAgICBURl9MSVRFX0VOU1VSRV9TVEFUVVMoRmxhdEJ1ZmZlckludFZlY3RvclRvQXJyYXk8aW50NjRfdD4oCisgICAgICAgIHNjaGVtYV9wYXJhbXMtPmNvbGxhcHNlZF9zbGljZV9kaW1zKCktPnNpemUoKSAqIHNpemVvZihpbnQ2NF90KSwKKyAgICAgICAgc2NoZW1hX3BhcmFtcy0+Y29sbGFwc2VkX3NsaWNlX2RpbXMoKSwgcGFyYW1zLT5jb2xsYXBzZWRfc2xpY2VfZGltcywKKyAgICAgICAgZXJyb3JfcmVwb3J0ZXIsICJzdGFibGVobG9fZ2F0aGVyIikpOworICAgIHBhcmFtcy0+bnVtX2NvbGxhcHNlZF9zbGljZV9kaW1zID0KKyAgICAgICAgc2NoZW1hX3BhcmFtcy0+Y29sbGFwc2VkX3NsaWNlX2RpbXMoKS0+c2l6ZSgpOworCisgICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKEZsYXRCdWZmZXJJbnRWZWN0b3JUb0FycmF5PGludDY0X3Q+KAorICAgICAgICBzY2hlbWFfcGFyYW1zLT5zdGFydF9pbmRleF9tYXAoKS0+c2l6ZSgpICogc2l6ZW9mKGludDY0X3QpLAorICAgICAgICBzY2hlbWFfcGFyYW1zLT5zdGFydF9pbmRleF9tYXAoKSwgcGFyYW1zLT5zdGFydF9pbmRleF9tYXAsCisgICAgICAgIGVycm9yX3JlcG9ydGVyLCAic3RhYmxlaGxvX2dhdGhlciIpKTsKKyAgICBwYXJhbXMtPm51bV9zdGFydF9pbmRleF9tYXAgPSBzY2hlbWFfcGFyYW1zLT5zdGFydF9pbmRleF9tYXAoKS0+c2l6ZSgpOworCisgICAgcGFyYW1zLT5pbmRleF92ZWN0b3JfZGltID0gc2NoZW1hX3BhcmFtcy0+aW5kZXhfdmVjdG9yX2RpbSgpOworCisgICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKEZsYXRCdWZmZXJJbnRWZWN0b3JUb0FycmF5PGludDY0X3Q+KAorICAgICAgICBzY2hlbWFfcGFyYW1zLT5zbGljZV9zaXplcygpLT5zaXplKCkgKiBzaXplb2YoaW50NjRfdCksCisgICAgICAgIHNjaGVtYV9wYXJhbXMtPnNsaWNlX3NpemVzKCksIHBhcmFtcy0+c2xpY2Vfc2l6ZXMsIGVycm9yX3JlcG9ydGVyLAorICAgICAgICAic3RhYmxlaGxvX2dhdGhlciIpKTsKKyAgICBwYXJhbXMtPm51bV9zbGljZV9zaXplcyA9IHNjaGVtYV9wYXJhbXMtPnNsaWNlX3NpemVzKCktPnNpemUoKTsKKworICAgIHBhcmFtcy0+aW5kaWNlc19hcmVfc29ydGVkID0gc2NoZW1hX3BhcmFtcy0+aW5kaWNlc19hcmVfc29ydGVkKCk7CisgIH0gZWxzZSB7CisgICAgLy8gVE9ETyhiLzE1NzQ4MDE2OSk6IFdlIHNob3VsZCBlaXRoZXIgcmV0dXJuIGtUZkxpdGVFcnJvciBvciBmaWxsIGluIHNvbWUKKyAgICAvLyByZWFzb25hYmxlIGRlZmF1bHRzIGluIHRoZSBwYXJhbXMgc3RydWN0LiBXZSBhcmUgbm90IGRvaW5nIHNvIHVudGlsIHdlCisgICAgLy8gYmV0dGVyIHVuZGVyc3RhbmQgdGhlIHJhbWlmaWNhdGlvbnMgb2YgY2hhbmdpbmcgdGhlIGxlZ2FjeSBiZWhhdmlvci4KKyAgfQorCisgICpidWlsdGluX2RhdGEgPSBwYXJhbXMucmVsZWFzZSgpOworICByZXR1cm4ga1RmTGl0ZU9rOworfQorCitUZkxpdGVTdGF0dXMgUGFyc2VTdGFibGVobG9QYWQoY29uc3QgT3BlcmF0b3IqIG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yUmVwb3J0ZXIqIGVycm9yX3JlcG9ydGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWx0aW5EYXRhQWxsb2NhdG9yKiBhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIGJ1aWx0aW5fZGF0YSkgeworICBDaGVja1BhcnNlUG9pbnRlclBhcmFtcyhvcCwgZXJyb3JfcmVwb3J0ZXIsIGFsbG9jYXRvciwgYnVpbHRpbl9kYXRhKTsKKworICBTYWZlQnVpbHRpbkRhdGFBbGxvY2F0b3Igc2FmZV9hbGxvY2F0b3IoYWxsb2NhdG9yKTsKKyAgYXV0byBwYXJhbXMgPSBzYWZlX2FsbG9jYXRvci5BbGxvY2F0ZTxUZkxpdGVTdGFibGVobG9QYWRQYXJhbXM+KCk7CisgIGNvbnN0IFN0YWJsZWhsb1BhZE9wdGlvbnMqIHNjaGVtYV9wYXJhbXMgPQorICAgICAgb3AtPmJ1aWx0aW5fb3B0aW9uc18yX2FzX1N0YWJsZWhsb1BhZE9wdGlvbnMoKTsKKworICBpZiAoc2NoZW1hX3BhcmFtcykgeworICAgIGF1dG8gTG9hZEF0dHIgPQorICAgICAgICBbJmVycm9yX3JlcG9ydGVyXSgKKyAgICAgICAgICAgIGludDY0X3QqIHBhcmFtc19hcnJheSwgY29uc3Qgc2l6ZV90IHBhcmFtc19hcnJheV9zaXplX2J5dGVzLAorICAgICAgICAgICAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiogY29uc3QgZmxhdGJ1ZmZlcl92ZWN0b3IsCisgICAgICAgICAgICBjb25zdCBjaGFyKiBjb25zdCBhdHRyX25hbWUpIC0+IFRmTGl0ZVN0YXR1cyB7CisgICAgICBUZkxpdGVTdGF0dXMgc3RhdHVzID0gRmxhdEJ1ZmZlckludFZlY3RvclRvQXJyYXkoCisgICAgICAgICAgcGFyYW1zX2FycmF5X3NpemVfYnl0ZXMsIGZsYXRidWZmZXJfdmVjdG9yLCBwYXJhbXNfYXJyYXksCisgICAgICAgICAgZXJyb3JfcmVwb3J0ZXIsICJzdGFibGVobG8ucGFkIik7CisgICAgICBpZiAoc3RhdHVzICE9IGtUZkxpdGVPaykgeworICAgICAgICBURl9MSVRFX1JFUE9SVF9FUlJPUihlcnJvcl9yZXBvcnRlciwgIkNoZWNrIHRoZSAnJXMnIGF0dHJpYnV0ZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyX25hbWUpOworICAgICAgfQorICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9OworCisgICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKAorICAgICAgICBMb2FkQXR0cihwYXJhbXMtPmVkZ2VfcGFkZGluZ19sb3csIHNpemVvZihwYXJhbXMtPmVkZ2VfcGFkZGluZ19sb3cpLAorICAgICAgICAgICAgICAgICBzY2hlbWFfcGFyYW1zLT5lZGdlX3BhZGRpbmdfbG93KCksICJlZGdlX3BhZGRpbmdfbG93IikpOworICAgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUygKKyAgICAgICAgTG9hZEF0dHIocGFyYW1zLT5lZGdlX3BhZGRpbmdfaGlnaCwgc2l6ZW9mKHBhcmFtcy0+ZWRnZV9wYWRkaW5nX2hpZ2gpLAorICAgICAgICAgICAgICAgICBzY2hlbWFfcGFyYW1zLT5lZGdlX3BhZGRpbmdfaGlnaCgpLCAiZWRnZV9wYWRkaW5nX2hpZ2giKSk7CisgICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKAorICAgICAgICBMb2FkQXR0cihwYXJhbXMtPmludGVyaW9yX3BhZGRpbmcsIHNpemVvZihwYXJhbXMtPmludGVyaW9yX3BhZGRpbmcpLAorICAgICAgICAgICAgICAgICBzY2hlbWFfcGFyYW1zLT5pbnRlcmlvcl9wYWRkaW5nKCksICJpbnRlcmlvcl9wYWRkaW5nIikpOworICAgIGlmIChzY2hlbWFfcGFyYW1zLT5lZGdlX3BhZGRpbmdfbG93KCktPnNpemUoKSAhPQorICAgICAgICAgICAgc2NoZW1hX3BhcmFtcy0+ZWRnZV9wYWRkaW5nX2hpZ2goKS0+c2l6ZSgpIHx8CisgICAgICAgIHNjaGVtYV9wYXJhbXMtPmVkZ2VfcGFkZGluZ19sb3coKS0+c2l6ZSgpICE9CisgICAgICAgICAgICBzY2hlbWFfcGFyYW1zLT5pbnRlcmlvcl9wYWRkaW5nKCktPnNpemUoKSkgeworICAgICAgVEZfTElURV9SRVBPUlRfRVJST1IoZXJyb3JfcmVwb3J0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiJ3N0YWJsZWhsby5wYWQnIG9wZXJhdGlvbiBwYXJhbWV0ZXIgYXJyYXkgc2l6ZXMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImFyZSBub3QgY29uc2lzdGVudC4iKTsKKyAgICAgIHJldHVybiBrVGZMaXRlRXJyb3I7CisgICAgfQorICAgICpidWlsdGluX2RhdGEgPSBwYXJhbXMucmVsZWFzZSgpOworICAgIHJldHVybiBrVGZMaXRlT2s7CisgIH0KKyAgVEZfTElURV9SRVBPUlRfRVJST1IoZXJyb3JfcmVwb3J0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICJDb3VsZCBub3QgZ2V0ICdzdGFibGVobG8ucGFkJyBvcGVyYXRpb24gcGFyYW1ldGVycy4iKTsKKyAgcmV0dXJuIGtUZkxpdGVFcnJvcjsKK30KKworVGZMaXRlU3RhdHVzIFBhcnNlU3RhYmxlaGxvQ29tcG9zaXRlKGNvbnN0IE9wZXJhdG9yKiBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvclJlcG9ydGVyKiBlcnJvcl9yZXBvcnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsdGluRGF0YUFsbG9jYXRvciogYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiBidWlsdGluX2RhdGEpIHsKKyAgQ2hlY2tQYXJzZVBvaW50ZXJQYXJhbXMob3AsIGVycm9yX3JlcG9ydGVyLCBhbGxvY2F0b3IsIGJ1aWx0aW5fZGF0YSk7CisKKyAgU2FmZUJ1aWx0aW5EYXRhQWxsb2NhdG9yIHNhZmVfYWxsb2NhdG9yKGFsbG9jYXRvcik7CisgIGF1dG8gcGFyYW1zID0gc2FmZV9hbGxvY2F0b3IuQWxsb2NhdGU8VGZMaXRlU3RhYmxlaGxvQ29tcG9zaXRlUGFyYW1zPigpOworICBjb25zdCBTdGFibGVITE9Db21wb3NpdGVPcHRpb25zKiBzY2hlbWFfcGFyYW1zID0KKyAgICAgIG9wLT5idWlsdGluX29wdGlvbnNfMl9hc19TdGFibGVITE9Db21wb3NpdGVPcHRpb25zKCk7CisgIGlmIChzY2hlbWFfcGFyYW1zKSB7CisgICAgcGFyYW1zLT5uYW1lID0gc2NoZW1hX3BhcmFtcy0+bmFtZSgpLT5jX3N0cigpOworICAgIHBhcmFtcy0+dmVyc2lvbiA9IHNjaGVtYV9wYXJhbXMtPnZlcnNpb24oKTsKKyAgICBwYXJhbXMtPnN1YmdyYXBoX2luZGV4ID0gc2NoZW1hX3BhcmFtcy0+ZGVjb21wb3NpdGlvbl9zdWJncmFwaF9pbmRleCgpOworICAgIHBhcmFtcy0+YXR0cmlidXRlcyA9IHNjaGVtYV9wYXJhbXMtPmNvbXBvc2l0ZV9hdHRyaWJ1dGVzKCktPmRhdGEoKTsKKyAgICBwYXJhbXMtPmF0dHJpYnV0ZXNfc2l6ZSA9IHNjaGVtYV9wYXJhbXMtPmNvbXBvc2l0ZV9hdHRyaWJ1dGVzKCktPnNpemUoKTsKKyAgICAqYnVpbHRpbl9kYXRhID0gcGFyYW1zLnJlbGVhc2UoKTsKKyAgICByZXR1cm4ga1RmTGl0ZU9rOworICB9CisgIFRGX0xJVEVfUkVQT1JUX0VSUk9SKAorICAgICAgZXJyb3JfcmVwb3J0ZXIsCisgICAgICAiQ291bGQgbm90IGdldCAnc3RhYmxlaGxvLmNvbXBvc2l0ZScgb3BlcmF0aW9uIHBhcmFtZXRlcnMuIik7CisgIHJldHVybiBrVGZMaXRlRXJyb3I7Cit9CisKIC8vIFdlIGhhdmUgdGhpcyBwYXJzZSBmdW5jdGlvbiBpbnN0ZWFkIG9mIGRpcmVjdGx5IHJldHVybmluZyBrVGZMaXRlT2sgZnJvbSB0aGUKIC8vIHN3aXRjaC1jYXNlIGluIFBhcnNlT3BEYXRhIGJlY2F1c2UgdGhpcyBmdW5jdGlvbiBpcyB1c2VkIGFzIHBhcnQgb2YgdGhlCiAvLyBzZWxlY3RpdmUgcmVnaXN0cmF0aW9uIGZvciB0aGUgT3BSZXNvbHZlciBpbXBsZW1lbnRhdGlvbiBpbiBtaWNyby4KQEAgLTIwMzQsNyArMjQ1MCw3IEBACiAgIH0gZWxzZSB7CiAgICAgLy8gVE9ETyhiLzE1NzQ4MDE2OSk6IFdlIHNob3VsZCBlaXRoZXIgcmV0dXJuIGtUZkxpdGVFcnJvciBvciBmaWxsIGluIHNvbWUKICAgICAvLyByZWFzb25hYmxlIGRlZmF1bHRzIGluIHRoZSBwYXJhbXMgc3RydWN0LiBXZSBhcmUgbm90IGRvaW5nIHNvIHVudGlsIHdlCi0gICAgLy8gYmV0dGVyIHVuZGVydGFuZCB0aGUgcmFtaWZpY2F0aW9ucyBvZiBjaGFuZ2luZyB0aGUgbGVnYWN5IGJlaGF2aW9yLgorICAgIC8vIGJldHRlciB1bmRlcnN0YW5kIHRoZSByYW1pZmljYXRpb25zIG9mIGNoYW5naW5nIHRoZSBsZWdhY3kgYmVoYXZpb3IuCiAgIH0KIAogICAqYnVpbHRpbl9kYXRhID0gcGFyYW1zLnJlbGVhc2UoKTsKQEAgLTIwNzUsNyArMjQ5MSw3IEBACiAgIH0gZWxzZSB7CiAgICAgLy8gVE9ETyhiLzE1NzQ4MDE2OSk6IFdlIHNob3VsZCBlaXRoZXIgcmV0dXJuIGtUZkxpdGVFcnJvciBvciBmaWxsIGluIHNvbWUKICAgICAvLyByZWFzb25hYmxlIGRlZmF1bHRzIGluIHRoZSBwYXJhbXMgc3RydWN0LiBXZSBhcmUgbm90IGRvaW5nIHNvIHVudGlsIHdlCi0gICAgLy8gYmV0dGVyIHVuZGVydGFuZCB0aGUgcmFtaWZpY2F0aW9ucyBvZiBjaGFuZ2luZyB0aGUgbGVnYWN5IGJlaGF2aW9yLgorICAgIC8vIGJldHRlciB1bmRlcnN0YW5kIHRoZSByYW1pZmljYXRpb25zIG9mIGNoYW5naW5nIHRoZSBsZWdhY3kgYmVoYXZpb3IuCiAgIH0KIAogICAqYnVpbHRpbl9kYXRhID0gcGFyYW1zLnJlbGVhc2UoKTsKQEAgLTIxMDgsNyArMjUyNCw3IEBACiAgIH0gZWxzZSB7CiAgICAgLy8gVE9ETyhiLzE1NzQ4MDE2OSk6IFdlIHNob3VsZCBlaXRoZXIgcmV0dXJuIGtUZkxpdGVFcnJvciBvciBmaWxsIGluIHNvbWUKICAgICAvLyByZWFzb25hYmxlIGRlZmF1bHRzIGluIHRoZSBwYXJhbXMgc3RydWN0LiBXZSBhcmUgbm90IGRvaW5nIHNvIHVudGlsIHdlCi0gICAgLy8gYmV0dGVyIHVuZGVydGFuZCB0aGUgcmFtaWZpY2F0aW9ucyBvZiBjaGFuZ2luZyB0aGUgbGVnYWN5IGJlaGF2aW9yLgorICAgIC8vIGJldHRlciB1bmRlcnN0YW5kIHRoZSByYW1pZmljYXRpb25zIG9mIGNoYW5naW5nIHRoZSBsZWdhY3kgYmVoYXZpb3IuCiAgIH0KIAogICAqYnVpbHRpbl9kYXRhID0gcGFyYW1zLnJlbGVhc2UoKTsKQEAgLTIxMzIsNyArMjU0OCw3IEBACiAgIH0gZWxzZSB7CiAgICAgLy8gVE9ETyhiLzE1NzQ4MDE2OSk6IFdlIHNob3VsZCBlaXRoZXIgcmV0dXJuIGtUZkxpdGVFcnJvciBvciBmaWxsIGluIHNvbWUKICAgICAvLyByZWFzb25hYmxlIGRlZmF1bHRzIGluIHRoZSBwYXJhbXMgc3RydWN0LiBXZSBhcmUgbm90IGRvaW5nIHNvIHVudGlsIHdlCi0gICAgLy8gYmV0dGVyIHVuZGVydGFuZCB0aGUgcmFtaWZpY2F0aW9ucyBvZiBjaGFuZ2luZyB0aGUgbGVnYWN5IGJlaGF2aW9yLgorICAgIC8vIGJldHRlciB1bmRlcnN0YW5kIHRoZSByYW1pZmljYXRpb25zIG9mIGNoYW5naW5nIHRoZSBsZWdhY3kgYmVoYXZpb3IuCiAgIH0KIAogICAqYnVpbHRpbl9kYXRhID0gcGFyYW1zLnJlbGVhc2UoKTsKQEAgLTIxNTYsNyArMjU3Miw3IEBACiAgIH0gZWxzZSB7CiAgICAgLy8gVE9ETyhiLzE1NzQ4MDE2OSk6IFdlIHNob3VsZCBlaXRoZXIgcmV0dXJuIGtUZkxpdGVFcnJvciBvciBmaWxsIGluIHNvbWUKICAgICAvLyByZWFzb25hYmxlIGRlZmF1bHRzIGluIHRoZSBwYXJhbXMgc3RydWN0LiBXZSBhcmUgbm90IGRvaW5nIHNvIHVudGlsIHdlCi0gICAgLy8gYmV0dGVyIHVuZGVydGFuZCB0aGUgcmFtaWZpY2F0aW9ucyBvZiBjaGFuZ2luZyB0aGUgbGVnYWN5IGJlaGF2aW9yLgorICAgIC8vIGJldHRlciB1bmRlcnN0YW5kIHRoZSByYW1pZmljYXRpb25zIG9mIGNoYW5naW5nIHRoZSBsZWdhY3kgYmVoYXZpb3IuCiAgIH0KIAogICAqYnVpbHRpbl9kYXRhID0gcGFyYW1zLnJlbGVhc2UoKTsKQEAgLTIyMTQsNyArMjYzMCw3IEBACiAgIH0gZWxzZSB7CiAgICAgLy8gVE9ETyhiLzE1NzQ4MDE2OSk6IFdlIHNob3VsZCBlaXRoZXIgcmV0dXJuIGtUZkxpdGVFcnJvciBvciBmaWxsIGluIHNvbWUKICAgICAvLyByZWFzb25hYmxlIGRlZmF1bHRzIGluIHRoZSBwYXJhbXMgc3RydWN0LiBXZSBhcmUgbm90IGRvaW5nIHNvIHVudGlsIHdlCi0gICAgLy8gYmV0dGVyIHVuZGVydGFuZCB0aGUgcmFtaWZpY2F0aW9ucyBvZiBjaGFuZ2luZyB0aGUgbGVnYWN5IGJlaGF2aW9yLgorICAgIC8vIGJldHRlciB1bmRlcnN0YW5kIHRoZSByYW1pZmljYXRpb25zIG9mIGNoYW5naW5nIHRoZSBsZWdhY3kgYmVoYXZpb3IuCiAgIH0KIAogICAqYnVpbHRpbl9kYXRhID0gcGFyYW1zLnJlbGVhc2UoKTsKQEAgLTIyNzAsNyArMjY4Niw3IEBACiAgIH0gZWxzZSB7CiAgICAgLy8gVE9ETyhiLzE1NzQ4MDE2OSk6IFdlIHNob3VsZCBlaXRoZXIgcmV0dXJuIGtUZkxpdGVFcnJvciBvciBmaWxsIGluIHNvbWUKICAgICAvLyByZWFzb25hYmxlIGRlZmF1bHRzIGluIHRoZSBwYXJhbXMgc3RydWN0LiBXZSBhcmUgbm90IGRvaW5nIHNvIHVudGlsIHdlCi0gICAgLy8gYmV0dGVyIHVuZGVydGFuZCB0aGUgcmFtaWZpY2F0aW9ucyBvZiBjaGFuZ2luZyB0aGUgbGVnYWN5IGJlaGF2aW9yLgorICAgIC8vIGJldHRlciB1bmRlcnN0YW5kIHRoZSByYW1pZmljYXRpb25zIG9mIGNoYW5naW5nIHRoZSBsZWdhY3kgYmVoYXZpb3IuCiAgIH0KIAogICAqYnVpbHRpbl9kYXRhID0gcGFyYW1zLnJlbGVhc2UoKTsKQEAgLTIyOTUsNyArMjcxMSw3IEBACiAgIH0gZWxzZSB7CiAgICAgLy8gVE9ETyhiLzE1NzQ4MDE2OSk6IFdlIHNob3VsZCBlaXRoZXIgcmV0dXJuIGtUZkxpdGVFcnJvciBvciBmaWxsIGluIHNvbWUKICAgICAvLyByZWFzb25hYmxlIGRlZmF1bHRzIGluIHRoZSBwYXJhbXMgc3RydWN0LiBXZSBhcmUgbm90IGRvaW5nIHNvIHVudGlsIHdlCi0gICAgLy8gYmV0dGVyIHVuZGVydGFuZCB0aGUgcmFtaWZpY2F0aW9ucyBvZiBjaGFuZ2luZyB0aGUgbGVnYWN5IGJlaGF2aW9yLgorICAgIC8vIGJldHRlciB1bmRlcnN0YW5kIHRoZSByYW1pZmljYXRpb25zIG9mIGNoYW5naW5nIHRoZSBsZWdhY3kgYmVoYXZpb3IuCiAgIH0KIAogICAqYnVpbHRpbl9kYXRhID0gcGFyYW1zLnJlbGVhc2UoKTsKQEAgLTIzMjIsNyArMjczOCw3IEBACiAgIH0gZWxzZSB7CiAgICAgLy8gVE9ETyhiLzE1NzQ4MDE2OSk6IFdlIHNob3VsZCBlaXRoZXIgcmV0dXJuIGtUZkxpdGVFcnJvciBvciBmaWxsIGluIHNvbWUKICAgICAvLyByZWFzb25hYmxlIGRlZmF1bHRzIGluIHRoZSBwYXJhbXMgc3RydWN0LiBXZSBhcmUgbm90IGRvaW5nIHNvIHVudGlsIHdlCi0gICAgLy8gYmV0dGVyIHVuZGVydGFuZCB0aGUgcmFtaWZpY2F0aW9ucyBvZiBjaGFuZ2luZyB0aGUgbGVnYWN5IGJlaGF2aW9yLgorICAgIC8vIGJldHRlciB1bmRlcnN0YW5kIHRoZSByYW1pZmljYXRpb25zIG9mIGNoYW5naW5nIHRoZSBsZWdhY3kgYmVoYXZpb3IuCiAgIH0KIAogICAqYnVpbHRpbl9kYXRhID0gcGFyYW1zLnJlbGVhc2UoKTsKQEAgLTIzNjUsMTAgKzI3ODEsMTMgQEAKIAogICAgIHBhcmFtcy0+YWN0aXZhdGlvbiA9CiAgICAgICAgIENvbnZlcnRBY3RpdmF0aW9uKHRyYW5zcG9zZV9jb252X3BhcmFtcy0+ZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbigpKTsKKyAgICBURl9MSVRFX0VOU1VSRV9TVEFUVVMoCisgICAgICAgIENvbnZlcnRUZW5zb3JUeXBlKHRyYW5zcG9zZV9jb252X3BhcmFtcy0+cXVhbnRpemVkX2JpYXNfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLT5xdWFudGl6ZWRfYmlhc190eXBlLCBlcnJvcl9yZXBvcnRlcikpOwogICB9IGVsc2UgewogICAgIC8vIFRPRE8oYi8xNTc0ODAxNjkpOiBXZSBzaG91bGQgZWl0aGVyIHJldHVybiBrVGZMaXRlRXJyb3Igb3IgZmlsbCBpbiBzb21lCiAgICAgLy8gcmVhc29uYWJsZSBkZWZhdWx0cyBpbiB0aGUgcGFyYW1zIHN0cnVjdC4gV2UgYXJlIG5vdCBkb2luZyBzbyB1bnRpbCB3ZQotICAgIC8vIGJldHRlciB1bmRlcnRhbmQgdGhlIHJhbWlmaWNhdGlvbnMgb2YgY2hhbmdpbmcgdGhlIGxlZ2FjeSBiZWhhdmlvci4KKyAgICAvLyBiZXR0ZXIgdW5kZXJzdGFuZCB0aGUgcmFtaWZpY2F0aW9ucyBvZiBjaGFuZ2luZyB0aGUgbGVnYWN5IGJlaGF2aW9yLgogICB9CiAgICpidWlsdGluX2RhdGEgPSBwYXJhbXMucmVsZWFzZSgpOwogICByZXR1cm4ga1RmTGl0ZU9rOwpAQCAtMjM5Miw3ICsyODExLDcgQEAKICAgfSBlbHNlIHsKICAgICAvLyBUT0RPKGIvMTU3NDgwMTY5KTogV2Ugc2hvdWxkIGVpdGhlciByZXR1cm4ga1RmTGl0ZUVycm9yIG9yIGZpbGwgaW4gc29tZQogICAgIC8vIHJlYXNvbmFibGUgZGVmYXVsdHMgaW4gdGhlIHBhcmFtcyBzdHJ1Y3QuIFdlIGFyZSBub3QgZG9pbmcgc28gdW50aWwgd2UKLSAgICAvLyBiZXR0ZXIgdW5kZXJ0YW5kIHRoZSByYW1pZmljYXRpb25zIG9mIGNoYW5naW5nIHRoZSBsZWdhY3kgYmVoYXZpb3IuCisgICAgLy8gYmV0dGVyIHVuZGVyc3RhbmQgdGhlIHJhbWlmaWNhdGlvbnMgb2YgY2hhbmdpbmcgdGhlIGxlZ2FjeSBiZWhhdmlvci4KICAgfQogCiAgICpidWlsdGluX2RhdGEgPSBwYXJhbXMucmVsZWFzZSgpOwpAQCAtMjQyMyw3ICsyODQyLDcgQEAKICAgfSBlbHNlIHsKICAgICAvLyBUT0RPKGIvMTU3NDgwMTY5KTogV2Ugc2hvdWxkIGVpdGhlciByZXR1cm4ga1RmTGl0ZUVycm9yIG9yIGZpbGwgaW4gc29tZQogICAgIC8vIHJlYXNvbmFibGUgZGVmYXVsdHMgaW4gdGhlIHBhcmFtcyBzdHJ1Y3QuIFdlIGFyZSBub3QgZG9pbmcgc28gdW50aWwgd2UKLSAgICAvLyBiZXR0ZXIgdW5kZXJ0YW5kIHRoZSByYW1pZmljYXRpb25zIG9mIGNoYW5naW5nIHRoZSBsZWdhY3kgYmVoYXZpb3IuCisgICAgLy8gYmV0dGVyIHVuZGVyc3RhbmQgdGhlIHJhbWlmaWNhdGlvbnMgb2YgY2hhbmdpbmcgdGhlIGxlZ2FjeSBiZWhhdmlvci4KICAgfQogCiAgICpidWlsdGluX2RhdGEgPSBwYXJhbXMucmVsZWFzZSgpOwpAQCAtMjQ0OCw3ICsyODY3LDcgQEAKICAgfSBlbHNlIHsKICAgICAvLyBUT0RPKGIvMTU3NDgwMTY5KTogV2Ugc2hvdWxkIGVpdGhlciByZXR1cm4ga1RmTGl0ZUVycm9yIG9yIGZpbGwgaW4gc29tZQogICAgIC8vIHJlYXNvbmFibGUgZGVmYXVsdHMgaW4gdGhlIHBhcmFtcyBzdHJ1Y3QuIFdlIGFyZSBub3QgZG9pbmcgc28gdW50aWwgd2UKLSAgICAvLyBiZXR0ZXIgdW5kZXJ0YW5kIHRoZSByYW1pZmljYXRpb25zIG9mIGNoYW5naW5nIHRoZSBsZWdhY3kgYmVoYXZpb3IuCisgICAgLy8gYmV0dGVyIHVuZGVyc3RhbmQgdGhlIHJhbWlmaWNhdGlvbnMgb2YgY2hhbmdpbmcgdGhlIGxlZ2FjeSBiZWhhdmlvci4KICAgfQogCiAgICpidWlsdGluX2RhdGEgPSBwYXJhbXMucmVsZWFzZSgpOwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL2NvcmUvYXBpL2ZsYXRidWZmZXJfY29udmVyc2lvbnMuaCBiL3RlbnNvcmZsb3cvbGl0ZS9jb3JlL2FwaS9mbGF0YnVmZmVyX2NvbnZlcnNpb25zLmgKaW5kZXggOWZmZTM5Ny4uYzAxZTg4NyAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL2NvcmUvYXBpL2ZsYXRidWZmZXJfY29udmVyc2lvbnMuaAorKysgYi90ZW5zb3JmbG93L2xpdGUvY29yZS9hcGkvZmxhdGJ1ZmZlcl9jb252ZXJzaW9ucy5oCkBAIC00MjAsNiArNDIwLDM2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWx0aW5EYXRhQWxsb2NhdG9yKiBhbGxvY2F0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiBidWlsdGluX2RhdGEpOwogCitUZkxpdGVTdGF0dXMgUGFyc2VTdGFibGVobG9TY2F0dGVyKGNvbnN0IE9wZXJhdG9yKiBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JSZXBvcnRlciogZXJyb3JfcmVwb3J0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWx0aW5EYXRhQWxsb2NhdG9yKiBhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiBidWlsdGluX2RhdGEpOworCitUZkxpdGVTdGF0dXMgUGFyc2VTdGFibGVobG9SbmdCaXRHZW5lcmF0b3IoY29uc3QgT3BlcmF0b3IqIG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yUmVwb3J0ZXIqIGVycm9yX3JlcG9ydGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWx0aW5EYXRhQWxsb2NhdG9yKiBhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIGJ1aWx0aW5fZGF0YSk7CisKK1RmTGl0ZVN0YXR1cyBQYXJzZVN0YWJsZWhsb0dhdGhlcihjb25zdCBPcGVyYXRvciogb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JSZXBvcnRlciogZXJyb3JfcmVwb3J0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbHRpbkRhdGFBbGxvY2F0b3IqIGFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogYnVpbHRpbl9kYXRhKTsKKworVGZMaXRlU3RhdHVzIFBhcnNlU3RhYmxlaGxvUmVkdWNlV2luZG93KGNvbnN0IE9wZXJhdG9yKiBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvclJlcG9ydGVyKiBlcnJvcl9yZXBvcnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsdGluRGF0YUFsbG9jYXRvciogYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqKiBidWlsdGluX2RhdGEpOworCitUZkxpdGVTdGF0dXMgUGFyc2VTdGFibGVobG9QYWQoY29uc3QgT3BlcmF0b3IqIG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yUmVwb3J0ZXIqIGVycm9yX3JlcG9ydGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWx0aW5EYXRhQWxsb2NhdG9yKiBhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCoqIGJ1aWx0aW5fZGF0YSk7CisKK1RmTGl0ZVN0YXR1cyBQYXJzZVN0YWJsZWhsb0NvbXBvc2l0ZShjb25zdCBPcGVyYXRvciogb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JSZXBvcnRlciogZXJyb3JfcmVwb3J0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbHRpbkRhdGFBbGxvY2F0b3IqIGFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogYnVpbHRpbl9kYXRhKTsKKwogfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQogCiAjZW5kaWYgIC8vIFRFTlNPUkZMT1dfTElURV9DT1JFX0FQSV9GTEFUQlVGRkVSX0NPTlZFUlNJT05TX0hfCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvY29yZS9jL2J1aWx0aW5fb3BfZGF0YS5oIGIvdGVuc29yZmxvdy9saXRlL2NvcmUvYy9idWlsdGluX29wX2RhdGEuaAppbmRleCBlOWM2ZWIzLi5lMTQyOGU3IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvY29yZS9jL2J1aWx0aW5fb3BfZGF0YS5oCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9jb3JlL2MvYnVpbHRpbl9vcF9kYXRhLmgKQEAgLTIxLDYgKzIxLDcgQEAKICNkZWZpbmUgVEVOU09SRkxPV19MSVRFX0NPUkVfQ19CVUlMVElOX09QX0RBVEFfSF8KIAogI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KIAogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9jb3JlL2MvY29tbW9uLmgiCkBAIC0zMiw2ICszMywxMCBAQAogLy8gVGZMaXRlUmVzaGFwZVBhcmFtcyBjYW4ndCBoYXZlIGR5bmFtaWMgZGF0YSBzbyB3ZSBmaXggdGhlIG1heGltdW0gcG9zc2libGUKIC8vIG51bWJlciBvZiBkaW1lbnNpb25zLgogI2RlZmluZSBURkxJVEVfUkVTSEFQRV9QQVJBTVNfTUFYX0RJTUVOU0lPTl9DT1VOVCA4CisjZGVmaW5lIFRGTElURV9TVEFCTEVITE9fU0NBVFRFUl9QQVJBTVNfTUFYX0RJTUVOU0lPTl9DT1VOVCA4CisjZGVmaW5lIFRGTElURV9TVEFCTEVITE9fR0FUSEVSX1BBUkFNU19NQVhfRElNRU5TSU9OX0NPVU5UIDgKKyNkZWZpbmUgVEZMSVRFX1NUQUJMRUhMT19SRURVQ0VfV0lORE9XX1BBUkFNU19NQVhfRElNRU5TSU9OX0NPVU5UIDgKKyNkZWZpbmUgVEZMSVRFX1NUQUJMRUhMT19QQURfUEFSQU1TX01BWF9ESU1FTlNJT05fQ09VTlQgOAogCiAvLyBUT0RPKGFzZWxsZSk6IENvbnNpZGVyIHVzaW5nICJpZiB0aGlzIHRoZW4gdGhhdCIgZm9yIHRlc3RpbmcuCiAKQEAgLTkwLDYgKzk1LDEwIEBACiAgIC8vIE5vdGU6IFZlcnNpb24gMiBzdXBwb3J0cyBkaWxhdGlvbiB2YWx1ZXMgbm90IGVxdWFsIHRvIDEuCiAgIGludCBkaWxhdGlvbl93aWR0aF9mYWN0b3I7CiAgIGludCBkaWxhdGlvbl9oZWlnaHRfZmFjdG9yOworCisgIC8vIFBhcmFtZXRlcnMgZm9yIENPTlZfMkQgdmVyc2lvbiA3IG9yIGFib3ZlLgorICAvLyBVc2VkIHRvIGRldGVybWluZSB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHF1YW50aXplZCBiaWFzLgorICBUZkxpdGVUeXBlIHF1YW50aXplZF9iaWFzX3R5cGU7CiB9IFRmTGl0ZUNvbnZQYXJhbXM7CiAKIHR5cGVkZWYgc3RydWN0IHsKQEAgLTE5Myw2ICsyMDIsMTAgQEAKICAgLy8gSWYgc2V0IHRvIHRydWUgYW5kIHRoZSB3ZWlnaHRzIGFyZSBxdWFudGl6ZWQsIHRoZW4gbm9uIGNvbnN0YW50IGlucHV0cwogICAvLyBhcmUgcXVhbnRpemVkIGF0IGV2YWx1YXRpb24gdGltZSB3aXRoIGFzeW1tZXRyaWMgcXVhbnRpemF0aW9uLgogICBib29sIGFzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzOworCisgIC8vIFBhcmFtZXRlcnMgZm9yIEZ1bGx5Q29ubmVjdGVkIHZlcnNpb24gMTAgb3IgYWJvdmUuCisgIC8vIFVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcXVhbnRpemVkIGJpYXMuCisgIFRmTGl0ZVR5cGUgcXVhbnRpemVkX2JpYXNfdHlwZTsKIH0gVGZMaXRlRnVsbHlDb25uZWN0ZWRQYXJhbXM7CiAKIHR5cGVkZWYgZW51bSB7CkBAIC0zNDEsNyArMzU0LDcgQEAKICAgLy8gVGhlc2UgZmllbGRzIGFyZSBvbmx5IHVzZWQgaW4gb2xkIG1vZGVscyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KICAgLy8gSW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIHdlIHVzZSB0aGUgMm5kIGlucHV0IG9mIHRoZSBvcCBhcyB0aGUgc2hhcGUsCiAgIC8vIGFuZCB0aGVzZSBmaWVsZHMgYXJlIHVudXNlZC4KLSAgaW50IHNoYXBlW1RGTElURV9SRVNIQVBFX1BBUkFNU19NQVhfRElNRU5TSU9OX0NPVU5UXTsKKyAgaW50MzJfdCBzaGFwZVtURkxJVEVfUkVTSEFQRV9QQVJBTVNfTUFYX0RJTUVOU0lPTl9DT1VOVF07CiAgIGludCBudW1fZGltZW5zaW9uczsKIH0gVGZMaXRlUmVzaGFwZVBhcmFtczsKIApAQCAtMzk4LDcgKzQxMSw3IEBACiB0eXBlZGVmIHN0cnVjdCB7CiAgIC8vIFRPRE8oYWhlbnR6KTogV2UgY2FuJ3QgaGF2ZSBkeW5hbWljIGRhdGEgaW4gdGhpcyBzdHJ1Y3QsIGF0IGxlYXN0IG5vdCB5ZXQuCiAgIC8vIEZvciBub3cgd2Ugd2lsbCBmaXggdGhlIG1heGltdW0gcG9zc2libGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMuCi0gIGludCBzcXVlZXplX2RpbXNbOF07CisgIGludDMyX3Qgc3F1ZWV6ZV9kaW1zWzhdOwogICBpbnQgbnVtX3NxdWVlemVfZGltczsKIH0gVGZMaXRlU3F1ZWV6ZVBhcmFtczsKIApAQCAtNDMwLDYgKzQ0MywxMCBAQAogCiAgIC8vIFBhcmFtZXRlcnMgc3VwcG9ydGVkIGJ5IHZlcnNpb24gNDoKICAgVGZMaXRlRnVzZWRBY3RpdmF0aW9uIGFjdGl2YXRpb247CisKKyAgLy8gUGFyYW1ldGVycyBmb3IgVHJhbnNwb3NlQ29udiB2ZXJzaW9uIDUgb3IgYWJvdmUuCisgIC8vIFVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgcXVhbnRpemVkIGJpYXMuCisgIFRmTGl0ZVR5cGUgcXVhbnRpemVkX2JpYXNfdHlwZTsKIH0gVGZMaXRlVHJhbnNwb3NlQ29udlBhcmFtczsKIAogdHlwZWRlZiBzdHJ1Y3QgewpAQCAtNTM1LDYgKzU1MiwxMDggQEAKICAgYm9vbCBhcHByb3hpbWF0ZTsKIH0gVGZMaXRlR2VsdVBhcmFtczsKIAordHlwZWRlZiBzdHJ1Y3QgeworICBpbnQ2NF90IGRpbWVuc2lvbjsKK30gVGZMaXRlU3RhYmxlaGxvQ29uY2F0ZW5hdGVQYXJhbXM7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgLy8gU2VlIHRoZSBzdGFibGVobG8gc3BlYyBmb3IgdGhlIGV4cGxhbmF0aW9uIG9mIHRoZSBhdHRyaWJ1dGVzOgorICAvLyBodHRwczovL2dpdGh1Yi5jb20vb3BlbnhsYS9zdGFibGVobG8vYmxvYi9tYWluL2RvY3Mvc3BlYy5tZCNzY2F0dGVyCisgIGJvb2wgaW5kaWNlc19hcmVfc29ydGVkOworICBpbnQ2NF90CisgICAgICB1cGRhdGVfd2luZG93X2RpbXNbVEZMSVRFX1NUQUJMRUhMT19TQ0FUVEVSX1BBUkFNU19NQVhfRElNRU5TSU9OX0NPVU5UXTsKKyAgaW50IG51bV91cGRhdGVfd2luZG93X2RpbXM7CisgIGludDY0X3QKKyAgICAgIGluc2VydGVkX3dpbmRvd19kaW1zW1RGTElURV9TVEFCTEVITE9fU0NBVFRFUl9QQVJBTVNfTUFYX0RJTUVOU0lPTl9DT1VOVF07CisgIGludCBudW1faW5zZXJ0ZWRfd2luZG93X2RpbXM7CisgIGludDY0X3Qgc2NhdHRlcl9kaW1zX3RvX29wZXJhbmRfZGltcworICAgICAgW1RGTElURV9TVEFCTEVITE9fU0NBVFRFUl9QQVJBTVNfTUFYX0RJTUVOU0lPTl9DT1VOVF07CisgIGludCBudW1fc2NhdHRlcl9kaW1zX3RvX29wZXJhbmRfZGltczsKKyAgaW50NjRfdCBpbmRleF92ZWN0b3JfZGltOworICBib29sIHVuaXF1ZV9pbmRpY2VzOworICBpbnQgdXBkYXRlX2NvbXB1dGF0aW9uX3N1YmdyYXBoX2luZGV4OworfSBUZkxpdGVTdGFibGVobG9TY2F0dGVyUGFyYW1zOworCit0eXBlZGVmIGVudW0geworICBrVGZMaXRlUm5nQWxnb3JpdGhtVW5rbm93biA9IDAsCisgIC8vIEFuIGFsZ29yaXRobSBhdXRvLXNlbGVjdGVkIGJ5IHRoZSBzeXN0ZW0gYWNjb3JkaW5nIHRvIGRldmljZSB0eXBlLgorICBrVGZMaXRlUm5nQWxnb3JpdGhtRGVmYXVsdCwKKyAgLy8gVGhlIFBoaWxveCBhbGdvcml0aG0sIGFzIGRlc2NyaWJlZCBpbiBwYXBlcgorICAvLyBbJ1BhcmFsbGVsIFJhbmRvbSBOdW1iZXJzOiBBcyBFYXN5IGFzIDEsIDIsIDMnXQorICAvLyAoaHR0cHM6Ly93d3cudGhlc2FsbW9ucy5vcmcvam9obi9yYW5kb20xMjMvcGFwZXJzL3JhbmRvbTEyM3NjMTEucGRmKQorICBrVGZMaXRlUm5nQWxnb3JpdGhtUGhpbG94LAorICAvLyBUaGUgVGhyZWVGcnkgYWxnb3JpdGhtLCBhcyBkZXNjcmliZWQgaW4gcGFwZXIKKyAgLy8gWydQYXJhbGxlbCBSYW5kb20gTnVtYmVyczogQXMgRWFzeSBhcyAxLCAyLCAzJ10KKyAgLy8gKGh0dHBzOi8vd3d3LnRoZXNhbG1vbnMub3JnL2pvaG4vcmFuZG9tMTIzL3BhcGVycy9yYW5kb20xMjNzYzExLnBkZikKKyAga1RmTGl0ZVJuZ0FsZ29yaXRobVRocmVlZnJ5LAorfSBUZkxpdGVSbmdBbGdvcml0aG07CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgVGZMaXRlUm5nQWxnb3JpdGhtIGFsZ29yaXRobTsKK30gVGZMaXRlU3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yUGFyYW1zOworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8vIFNlZSB0aGUgc3RhYmxlaGxvIHNwZWMgZm9yIHRoZSBleHBsYW5hdGlvbiBvZiB0aGUgYXR0cmlidXRlczoKKyAgLy8gaHR0cHM6Ly9naXRodWIuY29tL29wZW54bGEvc3RhYmxlaGxvL2Jsb2IvbWFpbi9kb2NzL3NwZWMubWQjZ2F0aGVyCisgIGludDY0X3Qgb2Zmc2V0X2RpbXNbVEZMSVRFX1NUQUJMRUhMT19HQVRIRVJfUEFSQU1TX01BWF9ESU1FTlNJT05fQ09VTlRdOworICBpbnQgbnVtX29mZnNldF9kaW1zOworICBpbnQ2NF90CisgICAgICBjb2xsYXBzZWRfc2xpY2VfZGltc1tURkxJVEVfU1RBQkxFSExPX0dBVEhFUl9QQVJBTVNfTUFYX0RJTUVOU0lPTl9DT1VOVF07CisgIGludCBudW1fY29sbGFwc2VkX3NsaWNlX2RpbXM7CisgIGludDY0X3Qgc3RhcnRfaW5kZXhfbWFwW1RGTElURV9TVEFCTEVITE9fR0FUSEVSX1BBUkFNU19NQVhfRElNRU5TSU9OX0NPVU5UXTsKKyAgaW50IG51bV9zdGFydF9pbmRleF9tYXA7CisgIGludDY0X3QgaW5kZXhfdmVjdG9yX2RpbTsKKyAgaW50NjRfdCBzbGljZV9zaXplc1tURkxJVEVfU1RBQkxFSExPX0dBVEhFUl9QQVJBTVNfTUFYX0RJTUVOU0lPTl9DT1VOVF07CisgIGludCBudW1fc2xpY2Vfc2l6ZXM7CisgIGJvb2wgaW5kaWNlc19hcmVfc29ydGVkOworfSBUZkxpdGVTdGFibGVobG9HYXRoZXJQYXJhbXM7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgLy8gU2VlIHRoZSBzdGFibGVobG8gc3BlYyBmb3IgdGhlIGV4cGxhbmF0aW9uIG9mIHRoZSBhdHRyaWJ1dGVzOgorICAvLyBodHRwczovL2dpdGh1Yi5jb20vb3BlbnhsYS9zdGFibGVobG8vYmxvYi9tYWluL2RvY3Mvc3BlYy5tZCNyZWR1Y2Vfd2luZG93CisgIGludDY0X3Qgd2luZG93X2RpbWVuc2lvbnMKKyAgICAgIFtURkxJVEVfU1RBQkxFSExPX1JFRFVDRV9XSU5ET1dfUEFSQU1TX01BWF9ESU1FTlNJT05fQ09VTlRdOworICBpbnQ2NF90CisgICAgICB3aW5kb3dfc3RyaWRlc1tURkxJVEVfU1RBQkxFSExPX1JFRFVDRV9XSU5ET1dfUEFSQU1TX01BWF9ESU1FTlNJT05fQ09VTlRdOworICBpbnQ2NF90CisgICAgICBiYXNlX2RpbGF0aW9uc1tURkxJVEVfU1RBQkxFSExPX1JFRFVDRV9XSU5ET1dfUEFSQU1TX01BWF9ESU1FTlNJT05fQ09VTlRdOworICBpbnQ2NF90IHdpbmRvd19kaWxhdGlvbnMKKyAgICAgIFtURkxJVEVfU1RBQkxFSExPX1JFRFVDRV9XSU5ET1dfUEFSQU1TX01BWF9ESU1FTlNJT05fQ09VTlRdOworICBpbnQ2NF90CisgICAgICBwYWRkaW5nWzIgKiBURkxJVEVfU1RBQkxFSExPX1JFRFVDRV9XSU5ET1dfUEFSQU1TX01BWF9ESU1FTlNJT05fQ09VTlRdOworICBpbnQgYm9keV9zdWJncmFwaF9pbmRleDsKK30gVGZMaXRlU3RhYmxlaGxvUmVkdWNlV2luZG93UGFyYW1zOworCitlbnVtIFRmTGl0ZVJlZHVjZVdpbmRvd0Z1bmN0aW9uIHsKKyAgVGZMaXRlUmVkdWNlV2luZG93RnVuY3Rpb25VbnN1cHBvcnRlZCwKKyAgVGZMaXRlUmVkdWNlV2luZG93RnVuY3Rpb25BZGQsCisgIFRmTGl0ZVJlZHVjZVdpbmRvd0Z1bmN0aW9uTXVsLAorICBUZkxpdGVSZWR1Y2VXaW5kb3dGdW5jdGlvbk1pbiwKKyAgVGZMaXRlUmVkdWNlV2luZG93RnVuY3Rpb25NYXgsCisgIFRmTGl0ZVJlZHVjZVdpbmRvd0Z1bmN0aW9uQWxsLAorICBUZkxpdGVSZWR1Y2VXaW5kb3dGdW5jdGlvbkFueQorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworICBlbnVtIFRmTGl0ZVJlZHVjZVdpbmRvd0Z1bmN0aW9uIHJlZHVjZV9mdW5jdGlvbjsKK30gVGZMaXRlUmVkdWNlV2luZG93UGFyYW1zOworCit0eXBlZGVmIHN0cnVjdCB7CisgIC8vIFNlZSB0aGUgc3RhYmxlaGxvIHNwZWMgZm9yIHRoZSBleHBsYW5hdGlvbiBvZiB0aGUgYXR0cmlidXRlczoKKyAgLy8gaHR0cHM6Ly9naXRodWIuY29tL29wZW54bGEvc3RhYmxlaGxvL2Jsb2IvbWFpbi9kb2NzL3NwZWMubWQjcGFkCisgIGludDY0X3QgZWRnZV9wYWRkaW5nX2xvd1tURkxJVEVfU1RBQkxFSExPX1BBRF9QQVJBTVNfTUFYX0RJTUVOU0lPTl9DT1VOVF07CisgIGludDY0X3QgZWRnZV9wYWRkaW5nX2hpZ2hbVEZMSVRFX1NUQUJMRUhMT19QQURfUEFSQU1TX01BWF9ESU1FTlNJT05fQ09VTlRdOworICBpbnQ2NF90IGludGVyaW9yX3BhZGRpbmdbVEZMSVRFX1NUQUJMRUhMT19QQURfUEFSQU1TX01BWF9ESU1FTlNJT05fQ09VTlRdOworfSBUZkxpdGVTdGFibGVobG9QYWRQYXJhbXM7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgY29uc3QgY2hhciogbmFtZTsKKyAgaW50MzJfdCBzdWJncmFwaF9pbmRleDsKKyAgaW50MzJfdCB2ZXJzaW9uOworICBjb25zdCB1aW50OF90KiBhdHRyaWJ1dGVzOworICBzaXplX3QgYXR0cmlidXRlc19zaXplOworfSBUZkxpdGVTdGFibGVobG9Db21wb3NpdGVQYXJhbXM7CisKICNpZmRlZiBfX2NwbHVzcGx1cwogfSAgLy8gZXh0ZXJuICJDIgogI2VuZGlmICAvLyBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL2NvcmUvYy9jX2FwaV90eXBlcy5oIGIvdGVuc29yZmxvdy9saXRlL2NvcmUvYy9jX2FwaV90eXBlcy5oCmluZGV4IDNhNjU5NGQuLjMyY2VmYTggMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9jb3JlL2MvY19hcGlfdHlwZXMuaAorKysgYi90ZW5zb3JmbG93L2xpdGUvY29yZS9jL2NfYXBpX3R5cGVzLmgKQEAgLTEyLDE2ICsxMiwyNCBAQAogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLy8gV0FSTklORzogVXNlcnMgb2YgVGVuc29yRmxvdyBMaXRlIHNob3VsZCBub3QgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHksIGJ1dAorLy8gc2hvdWxkIGluc3RlYWQgaW5jbHVkZSAidGhpcmRfcGFydHkvdGVuc29yZmxvdy9saXRlL2MvY19hcGlfdHlwZXMuaCIuCisvLyBPbmx5IHRoZSBUZW5zb3JGbG93IExpdGUgaW1wbGVtZW50YXRpb24gaXRzZWxmIHNob3VsZCBpbmNsdWRlIHRoaXMgZmlsZQorLy8gZGlyZWN0bHkuCiAKIC8vLyBUaGlzIGZpbGUgZGVjbGFyZXMgdHlwZXMgdXNlZCBieSB0aGUgcHVyZSBDIGluZmVyZW5jZSBBUEkgZGVmaW5lZCBpbgogLy8vIGNfYXBpLmgsIHNvbWUgb2Ygd2hpY2ggYXJlIGFsc28gdXNlZCBpbiB0aGUgQysrIGFuZCBDIGtlcm5lbCBhbmQgaW50ZXJwcmV0ZXIKIC8vLyBBUElzLgotCi0vLyBXQVJOSU5HOiBVc2VycyBvZiBUZW5zb3JGbG93IExpdGUgc2hvdWxkIG5vdCBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseSwKLS8vIGJ1dCBzaG91bGQgaW5zdGVhZCBpbmNsdWRlCi0vLyAidGhpcmRfcGFydHkvdGVuc29yZmxvdy9saXRlL2MvY19hcGlfdHlwZXMuaCIuCi0vLyBPbmx5IHRoZSBUZW5zb3JGbG93IExpdGUgaW1wbGVtZW50YXRpb24gaXRzZWxmIHNob3VsZCBpbmNsdWRlIHRoaXMKLS8vIGZpbGUgZGlyZWN0bHkuCisvLy8KKy8vIGNsYW5nLWZvcm1hdCBvZmYKKy8vIE5PTElOVEJFR0lOKHdoaXRlc3BhY2UvbGluZV9sZW5ndGgpCisvLy8gXG5vdGUgVXNlcnMgb2YgVGVuc29yRmxvdyBMaXRlIHNob3VsZCB1c2UKKy8vLyBcY29kZQorLy8vICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvYy9jX2FwaV90eXBlcy5oIgorLy8vIFxlbmRjb2RlCisvLy8gdG8gYWNjZXNzIHRoZSBBUElzIGRvY3VtZW50ZWQgb24gdGhpcyBwYWdlLgorLy8gTk9MSU5URU5EKHdoaXRlc3BhY2UvbGluZV9sZW5ndGgpCisvLyBjbGFuZy1mb3JtYXQgb24KIAogLy8gSVdZVSBwcmFnbWE6IHByaXZhdGUsIGluY2x1ZGUgInRoaXJkX3BhcnR5L3RlbnNvcmZsb3cvbGl0ZS9jL2NfYXBpX3R5cGVzLmgiCiAKQEAgLTM0LDkgKzQyLDEzIEBACiBleHRlcm4gIkMiIHsKICNlbmRpZgogCi0vKiogXGFkZHRvZ3JvdXAgY19hcGlfdHlwZXMgdGVuc29yZmxvdy9saXRlL2MvY19hcGlfdHlwZXMuaAorLy8gY2xhbmctZm9ybWF0IG9mZgorLy8gTk9MSU5UQkVHSU4od2hpdGVzcGFjZS9saW5lX2xlbmd0aCkKKy8qKiBcZGVmZ3JvdXAgY19hcGlfdHlwZXMgbGl0ZS9jL2NfYXBpX3R5cGVzLmgKICAqICBAewogICovCisvLyBOT0xJTlRFTkQod2hpdGVzcGFjZS9saW5lX2xlbmd0aCkKKy8vIGNsYW5nLWZvcm1hdCBvbgogCiAvLyBEZWZpbmUgVEZMX0NBUElfRVhQT1JUIG1hY3JvIHRvIGV4cG9ydCBhIGZ1bmN0aW9uIHByb3Blcmx5IHdpdGggYSBzaGFyZWQKIC8vIGxpYnJhcnkuCkBAIC0xMjEsMTQgKzEzMywxNCBAQAogICBrVGZMaXRlVUludDMyID0gMTYsCiAgIGtUZkxpdGVVSW50MTYgPSAxNywKICAga1RmTGl0ZUludDQgPSAxOCwKKyAga1RmTGl0ZUJGbG9hdDE2ID0gMTksCiB9IFRmTGl0ZVR5cGU7CiAKLS8vLyBMZWdhY3kuIFdpbGwgYmUgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiBUZkxpdGVBZmZpbmVRdWFudGl6YXRpb24uCisvLy8gTGVnYWN5LiBXaWxsIGJlIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgYFRmTGl0ZUFmZmluZVF1YW50aXphdGlvbmAuCiAvLy8gSWYgcGVyLWxheWVyIHF1YW50aXphdGlvbiBpcyBzcGVjaWZpZWQgdGhpcyBmaWVsZCB3aWxsIHN0aWxsIGJlIHBvcHVsYXRlZCBpbgotLy8vIGFkZGl0aW9uIHRvIFRmTGl0ZUFmZmluZVF1YW50aXphdGlvbi4KKy8vLyBhZGRpdGlvbiB0byBgVGZMaXRlQWZmaW5lUXVhbnRpemF0aW9uYC4KIC8vLyBQYXJhbWV0ZXJzIGZvciBhc3ltbWV0cmljIHF1YW50aXphdGlvbi4gUXVhbnRpemVkIHZhbHVlcyBjYW4gYmUgY29udmVydGVkCi0vLy8gYmFjayB0byBmbG9hdCB1c2luZzoKLS8vLyAgICAgcmVhbF92YWx1ZSA9IHNjYWxlICogKHF1YW50aXplZF92YWx1ZSAtIHplcm9fcG9pbnQpCisvLy8gYmFjayB0byBmbG9hdCB1c2luZzogYHJlYWxfdmFsdWUgPSBzY2FsZSAqIChxdWFudGl6ZWRfdmFsdWUgLSB6ZXJvX3BvaW50KWAKIHR5cGVkZWYgc3RydWN0IFRmTGl0ZVF1YW50aXphdGlvblBhcmFtcyB7CiAgIGZsb2F0IHNjYWxlOwogICBpbnQzMl90IHplcm9fcG9pbnQ7CkBAIC0xNTYsNiArMTY4LDcgQEAKIC8vLyBUaGlzIGlzIGFuIGFic3RyYWN0IHR5cGUgdGhhdCBpcyBpbnRlbmRlZCB0byBoYXZlIHRoZSBzYW1lCiAvLy8gcm9sZSBhcyBUZkxpdGVEZWxlZ2F0ZSwgYnV0IHdpdGhvdXQgZXhwb3NpbmcgdGhlIGltcGxlbWVudGF0aW9uCiAvLy8gZGV0YWlscyBvZiBob3cgZGVsZWdhdGVzIGFyZSBpbXBsZW1lbnRlZC4KKy8vLwogLy8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIHR5cGUgYW5kIHN1YmplY3QgdG8gY2hhbmdlLgogdHlwZWRlZiBzdHJ1Y3QgVGZMaXRlT3BhcXVlRGVsZWdhdGVTdHJ1Y3QgVGZMaXRlT3BhcXVlRGVsZWdhdGVTdHJ1Y3Q7CiAKQEAgLTE2Myw2ICsxNzYsNyBAQAogLy8vIFRmTGl0ZURlbGVnYXRlOyBhbGxvd3MgZGVsZWdhdGlvbiBvZiBub2RlcyB0byBhbHRlcm5hdGl2ZSBiYWNrZW5kcy4KIC8vLyBGb3IgVEYgTGl0ZSBpbiBQbGF5IFNlcnZpY2VzLCB0aGlzIGlzIGFuIG9wYXF1ZSB0eXBlLAogLy8vIGJ1dCBmb3IgcmVndWxhciBURiBMaXRlLCB0aGlzIGlzIGp1c3QgYSB0eXBlZGVmIGZvciBUZkxpdGVEZWxlZ2F0ZS4KKy8vLwogLy8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIHR5cGUgYW5kIHN1YmplY3QgdG8gY2hhbmdlLgogI2lmIFRGTElURV9XSVRIX1NUQUJMRV9BQkkgfHwgVEZMSVRFX1VTRV9PUEFRVUVfREVMRUdBVEUKIHR5cGVkZWYgVGZMaXRlT3BhcXVlRGVsZWdhdGVTdHJ1Y3QgVGZMaXRlT3BhcXVlRGVsZWdhdGU7CmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvY29yZS9jL2NvbW1vbi5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9jb3JlL2MvY29tbW9uLmNjCmluZGV4IDM2N2YxNzUuLjdhZmVjZGIgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9jb3JlL2MvY29tbW9uLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9jb3JlL2MvY29tbW9uLmNjCkBAIC0zNzAsNiArMzcwLDggQEAKICAgICAgIHJldHVybiAiU1RSSU5HIjsKICAgICBjYXNlIGtUZkxpdGVGbG9hdDE2OgogICAgICAgcmV0dXJuICJGTE9BVDE2IjsKKyAgICBjYXNlIGtUZkxpdGVCRmxvYXQxNjoKKyAgICAgIHJldHVybiAiQkZMT0FUMTYiOwogICAgIGNhc2Uga1RmTGl0ZUZsb2F0NjQ6CiAgICAgICByZXR1cm4gIkZMT0FUNjQiOwogICAgIGNhc2Uga1RmTGl0ZVJlc291cmNlOgpAQCAtMzg0LDQwICszODYsMTI4IEBACiAKIFRmTGl0ZURlbGVnYXRlIFRmTGl0ZURlbGVnYXRlQ3JlYXRlKCkgeyByZXR1cm4gVGZMaXRlRGVsZWdhdGV7fTsgfQogCi0jaWZuZGVmIFRGX0xJVEVfU1RBVElDX01FTU9SWQotVGZMaXRlT3BhcXVlRGVsZWdhdGUqIFRmTGl0ZU9wYXF1ZURlbGVnYXRlQ3JlYXRlKAotICAgIGNvbnN0IFRmTGl0ZU9wYXF1ZURlbGVnYXRlQnVpbGRlciogb3BhcXVlX2RlbGVnYXRlX2J1aWxkZXIpIHsKLSAgaWYgKCFvcGFxdWVfZGVsZWdhdGVfYnVpbGRlcikgcmV0dXJuIG51bGxwdHI7Ci0KLSAgVGZMaXRlRGVsZWdhdGUqIHJlc3VsdCA9IG5ldyBUZkxpdGVEZWxlZ2F0ZXt9OwotICByZXN1bHQtPm9wYXF1ZV9kZWxlZ2F0ZV9idWlsZGVyID0gbmV3IFRmTGl0ZU9wYXF1ZURlbGVnYXRlQnVpbGRlcnt9OwotICAqKHJlc3VsdC0+b3BhcXVlX2RlbGVnYXRlX2J1aWxkZXIpID0gKm9wYXF1ZV9kZWxlZ2F0ZV9idWlsZGVyOwotCi0gIHJldHVybiByZWludGVycHJldF9jYXN0PFRmTGl0ZU9wYXF1ZURlbGVnYXRlKj4ocmVzdWx0KTsKKy8vIFJldHVybnMgYSB0ZW5zb3IgZGF0YSBhbGxvY2F0aW9uIHN0cmF0ZWd5LgorVGZMaXRlQWxsb2NhdGlvblN0cmF0ZWd5IFRmTGl0ZVRlbnNvckdldEFsbG9jYXRpb25TdHJhdGVneSgKKyAgICBjb25zdCBUZkxpdGVUZW5zb3IqIGNvbnN0IHQpIHsKKyAgc3dpdGNoICh0LT5hbGxvY2F0aW9uX3R5cGUpIHsKKyAgICBjYXNlIGtUZkxpdGVNZW1Ob25lOgorICAgICAgcmV0dXJuIGtUZkxpdGVBbGxvY2F0aW9uU3RyYXRlZ3lOb25lOworICAgIGNhc2Uga1RmTGl0ZU1tYXBSbzoKKyAgICAgIHJldHVybiBrVGZMaXRlQWxsb2NhdGlvblN0cmF0ZWd5TU1hcDsKKyAgICBjYXNlIGtUZkxpdGVBcmVuYVJ3OgorICAgICAgcmV0dXJuIGtUZkxpdGVBbGxvY2F0aW9uU3RyYXRlZ3lBcmVuYTsKKyAgICBjYXNlIGtUZkxpdGVBcmVuYVJ3UGVyc2lzdGVudDoKKyAgICAgIHJldHVybiBrVGZMaXRlQWxsb2NhdGlvblN0cmF0ZWd5QXJlbmE7CisgICAgY2FzZSBrVGZMaXRlRHluYW1pYzoKKyAgICAgIHJldHVybiBrVGZMaXRlQWxsb2NhdGlvblN0cmF0ZWd5TWFsbG9jOworICAgIGNhc2Uga1RmTGl0ZVBlcnNpc3RlbnRSbzoKKyAgICAgIHJldHVybiBrVGZMaXRlQWxsb2NhdGlvblN0cmF0ZWd5VW5rbm93bjsKKyAgICBjYXNlIGtUZkxpdGVDdXN0b206CisgICAgICByZXR1cm4ga1RmTGl0ZUFsbG9jYXRpb25TdHJhdGVneVVua25vd247CisgICAgY2FzZSBrVGZMaXRlVmFyaWFudE9iamVjdDoKKyAgICAgIHJldHVybiBrVGZMaXRlQWxsb2NhdGlvblN0cmF0ZWd5TmV3OworICB9CisgIHJldHVybiBrVGZMaXRlQWxsb2NhdGlvblN0cmF0ZWd5VW5rbm93bjsKIH0KIAotdm9pZCBUZkxpdGVPcGFxdWVEZWxlZ2F0ZURlbGV0ZShUZkxpdGVPcGFxdWVEZWxlZ2F0ZSogb3BhcXVlX2RlbGVnYXRlKSB7Ci0gIGlmICghb3BhcXVlX2RlbGVnYXRlKSByZXR1cm47Ci0KLSAgY29uc3QgVGZMaXRlRGVsZWdhdGUqIHRmbGl0ZV9kZWxlZ2F0ZSA9Ci0gICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IFRmTGl0ZURlbGVnYXRlKj4ob3BhcXVlX2RlbGVnYXRlKTsKLSAgZGVsZXRlIHRmbGl0ZV9kZWxlZ2F0ZS0+b3BhcXVlX2RlbGVnYXRlX2J1aWxkZXI7Ci0gIGRlbGV0ZSB0ZmxpdGVfZGVsZWdhdGU7CisvLyBSZXR1cm5zIGhvdyBzdGFibGUgYSB0ZW5zb3IgZGF0YSBidWZmZXIgYWRkcmVzcyBpcyBhY3Jvc3MgcnVucy4KK1RmTGl0ZVJ1blN0YWJpbGl0eSBUZkxpdGVUZW5zb3JHZXRCdWZmZXJBZGRyZXNzU3RhYmlsaXR5KAorICAgIGNvbnN0IFRmTGl0ZVRlbnNvciogY29uc3QgdCkgeworICBzd2l0Y2ggKHQtPmFsbG9jYXRpb25fdHlwZSkgeworICAgIGNhc2Uga1RmTGl0ZU1lbU5vbmU6CisgICAgICByZXR1cm4ga1RmTGl0ZVJ1blN0YWJpbGl0eUFjcm9zc1J1bnM7CisgICAgY2FzZSBrVGZMaXRlTW1hcFJvOgorICAgICAgcmV0dXJuIGtUZkxpdGVSdW5TdGFiaWxpdHlBY3Jvc3NSdW5zOworICAgIGNhc2Uga1RmTGl0ZUFyZW5hUnc6CisgICAgICByZXR1cm4ga1RmTGl0ZVJ1blN0YWJpbGl0eVVuc3RhYmxlOworICAgIGNhc2Uga1RmTGl0ZUFyZW5hUndQZXJzaXN0ZW50OgorICAgICAgcmV0dXJuIGtUZkxpdGVSdW5TdGFiaWxpdHlVbnN0YWJsZTsKKyAgICBjYXNlIGtUZkxpdGVEeW5hbWljOgorICAgICAgcmV0dXJuIGtUZkxpdGVSdW5TdGFiaWxpdHlTaW5nbGVSdW47CisgICAgY2FzZSBrVGZMaXRlUGVyc2lzdGVudFJvOgorICAgICAgcmV0dXJuIGtUZkxpdGVSdW5TdGFiaWxpdHlTaW5nbGVSdW47CisgICAgY2FzZSBrVGZMaXRlQ3VzdG9tOgorICAgICAgcmV0dXJuIGtUZkxpdGVSdW5TdGFiaWxpdHlVbmtub3duOworICAgIGNhc2Uga1RmTGl0ZVZhcmlhbnRPYmplY3Q6CisgICAgICByZXR1cm4ga1RmTGl0ZVJ1blN0YWJpbGl0eUFjcm9zc1J1bnM7CisgIH0KKyAgcmV0dXJuIGtUZkxpdGVSdW5TdGFiaWxpdHlVbmtub3duOwogfQotI2VuZGlmICAvLyBURl9MSVRFX1NUQVRJQ19NRU1PUlkKIAotdm9pZCogVGZMaXRlT3BhcXVlRGVsZWdhdGVHZXREYXRhKGNvbnN0IFRmTGl0ZU9wYXF1ZURlbGVnYXRlKiBkZWxlZ2F0ZSkgewotICBpZiAoIWRlbGVnYXRlKSByZXR1cm4gbnVsbHB0cjsKKy8vIFJldHVybnMgaG93IHN0YWJsZSBhIHRlbnNvciBkYXRhIHZhbHVlcyBhcmUgYWNyb3NzIHJ1bnMuCitUZkxpdGVSdW5TdGFiaWxpdHkgVGZMaXRlVGVuc29yR2V0RGF0YVN0YWJpbGl0eShjb25zdCBUZkxpdGVUZW5zb3IqIGNvbnN0IHQpIHsKKyAgc3dpdGNoICh0LT5hbGxvY2F0aW9uX3R5cGUpIHsKKyAgICBjYXNlIGtUZkxpdGVNZW1Ob25lOgorICAgICAgcmV0dXJuIGtUZkxpdGVSdW5TdGFiaWxpdHlBY3Jvc3NSdW5zOworICAgIGNhc2Uga1RmTGl0ZU1tYXBSbzoKKyAgICAgIHJldHVybiBrVGZMaXRlUnVuU3RhYmlsaXR5QWNyb3NzUnVuczsKKyAgICBjYXNlIGtUZkxpdGVBcmVuYVJ3OgorICAgICAgcmV0dXJuIGtUZkxpdGVSdW5TdGFiaWxpdHlTaW5nbGVSdW47CisgICAgY2FzZSBrVGZMaXRlQXJlbmFSd1BlcnNpc3RlbnQ6CisgICAgICByZXR1cm4ga1RmTGl0ZVJ1blN0YWJpbGl0eUFjcm9zc1J1bnM7CisgICAgY2FzZSBrVGZMaXRlRHluYW1pYzoKKyAgICAgIHJldHVybiBrVGZMaXRlUnVuU3RhYmlsaXR5U2luZ2xlUnVuOworICAgIGNhc2Uga1RmTGl0ZVBlcnNpc3RlbnRSbzoKKyAgICAgIHJldHVybiBrVGZMaXRlUnVuU3RhYmlsaXR5U2luZ2xlUnVuOworICAgIGNhc2Uga1RmTGl0ZUN1c3RvbToKKyAgICAgIHJldHVybiBrVGZMaXRlUnVuU3RhYmlsaXR5VW5rbm93bjsKKyAgICBjYXNlIGtUZkxpdGVWYXJpYW50T2JqZWN0OgorICAgICAgcmV0dXJuIGtUZkxpdGVSdW5TdGFiaWxpdHlTaW5nbGVSdW47CisgIH0KKyAgcmV0dXJuIGtUZkxpdGVSdW5TdGFiaWxpdHlVbmtub3duOworfQogCi0gIC8vIFRoZSBmb2xsb3dpbmcgY2FzdCBpcyBzYWZlIG9ubHkgYmVjYXVzZSB0aGlzIGNvZGUgaXMgcGFydCBvZiB0aGUKLSAgLy8gVEYgTGl0ZSBydW50aW1lIGltcGxlbWVudGF0aW9uLiAgQXBwcyB1c2luZyBURiBMaXRlIHNob3VsZCBub3QgcmVseSBvbgotICAvLyAnVGZMaXRlT3BhcXVlRGVsZWdhdGUnIGFuZCAnVGZMaXRlRGVsZWdhdGUnIGJlaW5nIGVxdWl2YWxlbnQuCi0gIGNvbnN0IGF1dG8qIHRmbGl0ZV9kZWxlZ2F0ZSA9Ci0gICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IFRmTGl0ZURlbGVnYXRlKj4oZGVsZWdhdGUpOworLy8gUmV0dXJucyB0aGUgb3BlcmF0aW9uIHN0ZXAgd2hlbiB0aGUgZGF0YSBvZiBhIHRlbnNvciBpcyBwb3B1bGF0ZWQuCisvLworLy8gU29tZSBvcGVyYXRpb25zIGNhbiBwcmVjb21wdXRlIHRoZWlyIHJlc3VsdHMgYmVmb3JlIHRoZSBldmFsdWF0aW9uIHN0ZXAuIFRoaXMKKy8vIG1ha2VzIHRoZSBkYXRhIGF2YWlsYWJsZSBlYXJsaWVyIGZvciBzdWJzZXF1ZW50IG9wZXJhdGlvbnMuCitUZkxpdGVSdW5TdGVwIFRmTGl0ZVRlbnNvckdldERhdGFLbm93blN0ZXAoY29uc3QgVGZMaXRlVGVuc29yKiB0KSB7CisgIHN3aXRjaCAodC0+YWxsb2NhdGlvbl90eXBlKSB7CisgICAgY2FzZSBrVGZMaXRlTWVtTm9uZToKKyAgICAgIHJldHVybiBrVGZMaXRlUnVuU3RlcEluaXQ7CisgICAgY2FzZSBrVGZMaXRlTW1hcFJvOgorICAgICAgcmV0dXJuIGtUZkxpdGVSdW5TdGVwSW5pdDsKKyAgICBjYXNlIGtUZkxpdGVBcmVuYVJ3OgorICAgICAgcmV0dXJuIGtUZkxpdGVSdW5TdGVwRXZhbDsKKyAgICBjYXNlIGtUZkxpdGVBcmVuYVJ3UGVyc2lzdGVudDoKKyAgICAgIHJldHVybiBrVGZMaXRlUnVuU3RlcEV2YWw7CisgICAgY2FzZSBrVGZMaXRlRHluYW1pYzoKKyAgICAgIHJldHVybiBrVGZMaXRlUnVuU3RlcEV2YWw7CisgICAgY2FzZSBrVGZMaXRlUGVyc2lzdGVudFJvOgorICAgICAgcmV0dXJuIGtUZkxpdGVSdW5TdGVwUHJlcGFyZTsKKyAgICBjYXNlIGtUZkxpdGVDdXN0b206CisgICAgICByZXR1cm4ga1RmTGl0ZVJ1blN0ZXBVbmtub3duOworICAgIGNhc2Uga1RmTGl0ZVZhcmlhbnRPYmplY3Q6CisgICAgICByZXR1cm4ga1RmTGl0ZVJ1blN0ZXBFdmFsOworICB9CisgIHJldHVybiBrVGZMaXRlUnVuU3RlcFVua25vd247Cit9CiAKLSAgaWYgKCF0ZmxpdGVfZGVsZWdhdGUtPm9wYXF1ZV9kZWxlZ2F0ZV9idWlsZGVyKSByZXR1cm4gdGZsaXRlX2RlbGVnYXRlLT5kYXRhXzsKLQotICByZXR1cm4gdGZsaXRlX2RlbGVnYXRlLT5vcGFxdWVfZGVsZWdhdGVfYnVpbGRlci0+ZGF0YTsKKy8vIFJldHVybnMgdGhlIG9wZXJhdGlvbiBzdGVvcCB3aGVuIHRoZSBzaGFwZSBvZiBhIHRlbnNvciBpcyBjb21wdXRlZC4KKy8vCisvLyBTb21lIG9wZXJhdGlvbnMgY2FuIHByZWNvbXB1dGUgdGhlIHNoYXBlIG9mIHRoZWlyIHJlc3VsdHMgYmVmb3JlIHRoZQorLy8gZXZhbHVhdGlvbiBzdGVwLiBUaGlzIG1ha2VzIHRoZSBzaGFwZSBhdmFpbGFibGUgZWFybGllciBmb3Igc3Vic2VxdWVudAorLy8gb3BlcmF0aW9ucy4KK1RmTGl0ZVJ1blN0ZXAgVGZMaXRlVGVuc29yR2V0U2hhcGVLbm93blN0ZXAoY29uc3QgVGZMaXRlVGVuc29yKiB0KSB7CisgIHN3aXRjaCAodC0+YWxsb2NhdGlvbl90eXBlKSB7CisgICAgY2FzZSBrVGZMaXRlTWVtTm9uZToKKyAgICAgIHJldHVybiBrVGZMaXRlUnVuU3RlcEluaXQ7CisgICAgY2FzZSBrVGZMaXRlTW1hcFJvOgorICAgICAgcmV0dXJuIGtUZkxpdGVSdW5TdGVwSW5pdDsKKyAgICBjYXNlIGtUZkxpdGVBcmVuYVJ3OgorICAgICAgcmV0dXJuIGtUZkxpdGVSdW5TdGVwUHJlcGFyZTsKKyAgICBjYXNlIGtUZkxpdGVBcmVuYVJ3UGVyc2lzdGVudDoKKyAgICAgIHJldHVybiBrVGZMaXRlUnVuU3RlcFByZXBhcmU7CisgICAgY2FzZSBrVGZMaXRlRHluYW1pYzoKKyAgICAgIHJldHVybiBrVGZMaXRlUnVuU3RlcEV2YWw7CisgICAgY2FzZSBrVGZMaXRlUGVyc2lzdGVudFJvOgorICAgICAgcmV0dXJuIGtUZkxpdGVSdW5TdGVwUHJlcGFyZTsKKyAgICBjYXNlIGtUZkxpdGVDdXN0b206CisgICAgICByZXR1cm4ga1RmTGl0ZVJ1blN0ZXBVbmtub3duOworICAgIGNhc2Uga1RmTGl0ZVZhcmlhbnRPYmplY3Q6CisgICAgICByZXR1cm4ga1RmTGl0ZVJ1blN0ZXBFdmFsOworICB9CisgIHJldHVybiBrVGZMaXRlUnVuU3RlcFVua25vd247CiB9CiAKIH0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9jb3JlL2MvY29tbW9uLmggYi90ZW5zb3JmbG93L2xpdGUvY29yZS9jL2NvbW1vbi5oCmluZGV4IDE5YTc0YTcuLjY0OGI4NjIgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9jb3JlL2MvY29tbW9uLmgKKysrIGIvdGVuc29yZmxvdy9saXRlL2NvcmUvYy9jb21tb24uaApAQCAtMTIsMzIgKzEyLDQxIEBACiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvLyBXQVJOSU5HOiBVc2VycyBvZiBUZW5zb3JGbG93IExpdGUgc2hvdWxkIG5vdCBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseSwgYnV0CisvLyBzaG91bGQgaW5zdGVhZCBpbmNsdWRlICJ0aGlyZF9wYXJ0eS90ZW5zb3JmbG93L2xpdGUvYy9jb21tb24uaCIuCisvLyBPbmx5IHRoZSBUZW5zb3JGbG93IExpdGUgaW1wbGVtZW50YXRpb24gaXRzZWxmIHNob3VsZCBpbmNsdWRlIHRoaXMgZmlsZQorLy8gZGlyZWN0bHkuCiAKLS8vIFRoaXMgZmlsZSBkZWZpbmVzIGNvbW1vbiBDIHR5cGVzIGFuZCBBUElzIGZvciBpbXBsZW1lbnRpbmcgb3BlcmF0aW9ucywKLS8vIGRlbGVnYXRlcyBhbmQgb3RoZXIgY29uc3RydWN0cyBpbiBUZW5zb3JGbG93IExpdGUuIFRoZSBhY3R1YWwgb3BlcmF0aW9ucyBhbmQKLS8vIGRlbGVnYXRlcyBjYW4gYmUgZGVmaW5lZCB1c2luZyBDKyssIGJ1dCB0aGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlIGludGVycHJldGVyCi0vLyBhbmQgdGhlIG9wZXJhdGlvbnMgYXJlIEMuCi0vLwotLy8gU3VtbWFyeSBvZiBhYnN0cmFjdGlvbnMKLS8vIFRGX0xJVEVfRU5TVVJFIC0gU2VsZi1zdWZmaWNpZW50IGVycm9yIGNoZWNraW5nCi0vLyBUZkxpdGVTdGF0dXMgLSBTdGF0dXMgcmVwb3J0aW5nCi0vLyBUZkxpdGVJbnRBcnJheSAtIHN0b3JlcyB0ZW5zb3Igc2hhcGVzIChkaW1zKSwKLS8vIFRmTGl0ZUNvbnRleHQgLSBhbGxvd3MgYW4gb3AgdG8gYWNjZXNzIHRoZSB0ZW5zb3JzCi0vLyBUZkxpdGVUZW5zb3IgLSB0ZW5zb3IgKGEgbXVsdGlkaW1lbnNpb25hbCBhcnJheSkKLS8vIFRmTGl0ZU5vZGUgLSBhIHNpbmdsZSBub2RlIG9yIG9wZXJhdGlvbgotLy8gVGZMaXRlUmVnaXN0cmF0aW9uIC0gdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgY29uY2VwdHVhbCBvcGVyYXRpb24uCi0vLyBUZkxpdGVEZWxlZ2F0ZSAtIGFsbG93cyBkZWxlZ2F0aW9uIG9mIG5vZGVzIHRvIGFsdGVybmF0aXZlIGJhY2tlbmRzLgotLy8KLS8vIFNvbWUgYWJzdHJhY3Rpb25zIGluIHRoaXMgZmlsZSBhcmUgY3JlYXRlZCBhbmQgbWFuYWdlZCBieSBJbnRlcnByZXRlci4KLS8vCi0vLyBOT1RFOiBUaGUgb3JkZXIgb2YgdmFsdWVzIGluIHRoZXNlIHN0cnVjdHMgYXJlICJzZW1pLUFCSSBzdGFibGUiLiBOZXcgdmFsdWVzCi0vLyBzaG91bGQgYmUgYWRkZWQgb25seSB0byB0aGUgZW5kIG9mIHN0cnVjdHMgYW5kIG5ldmVyIHJlb3JkZXJlZC4KKy8vLyBUaGlzIGZpbGUgZGVmaW5lcyBjb21tb24gQyB0eXBlcyBhbmQgQVBJcyBmb3IgaW1wbGVtZW50aW5nIG9wZXJhdGlvbnMsCisvLy8gZGVsZWdhdGVzIGFuZCBvdGhlciBjb25zdHJ1Y3RzIGluIFRlbnNvckZsb3cgTGl0ZS4gVGhlIGFjdHVhbCBvcGVyYXRpb25zIGFuZAorLy8vIGRlbGVnYXRlcyBjYW4gYmUgZGVmaW5lZCB1c2luZyBDKyssIGJ1dCB0aGUgaW50ZXJmYWNlIGJldHdlZW4gdGhlCisvLy8gaW50ZXJwcmV0ZXIgYW5kIHRoZSBvcGVyYXRpb25zIGFyZSBDLgorLy8vCisvLy8gU3VtbWFyeSBvZiBhYnN0cmFjdGlvbnM6CisvLy8gKiBgVEZfTElURV9FTlNVUkVgIC0gc2VsZi1zdWZmaWNpZW50IGVycm9yIGNoZWNraW5nCisvLy8gKiBgVGZMaXRlU3RhdHVzYCAtIHN0YXR1cyByZXBvcnRpbmcKKy8vLyAqIGBUZkxpdGVJbnRBcnJheWAgLSBzdG9yZXMgdGVuc29yIHNoYXBlcyAoZGltcyksCisvLy8gKiBgVGZMaXRlQ29udGV4dGAgLSBhbGxvd3MgYW4gb3AgdG8gYWNjZXNzIHRoZSB0ZW5zb3JzCisvLy8gKiBgVGZMaXRlVGVuc29yYCAtIHRlbnNvciAoYSBtdWx0aWRpbWVuc2lvbmFsIGFycmF5KQorLy8vICogYFRmTGl0ZU5vZGVgIC0gYSBzaW5nbGUgbm9kZSBvciBvcGVyYXRpb24KKy8vLyAqIGBUZkxpdGVSZWdpc3RyYXRpb25gIC0gdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgY29uY2VwdHVhbCBvcGVyYXRpb24uCisvLy8gKiBgVGZMaXRlRGVsZWdhdGVgIC0gYWxsb3dzIGRlbGVnYXRpb24gb2Ygbm9kZXMgdG8gYWx0ZXJuYXRpdmUgYmFja2VuZHMuCisvLy8KKy8vLyBTb21lIGFic3RyYWN0aW9ucyBpbiB0aGlzIGZpbGUgYXJlIGNyZWF0ZWQgYW5kIG1hbmFnZWQgYnkgSW50ZXJwcmV0ZXIuCisvLy8KKy8vLyBOT1RFOiBUaGUgb3JkZXIgb2YgdmFsdWVzIGluIHRoZXNlIHN0cnVjdHMgYXJlICJzZW1pLUFCSSBzdGFibGUiLiBOZXcgdmFsdWVzCisvLy8gc2hvdWxkIGJlIGFkZGVkIG9ubHkgdG8gdGhlIGVuZCBvZiBzdHJ1Y3RzIGFuZCBuZXZlciByZW9yZGVyZWQuCisvLy8KKy8vIGNsYW5nLWZvcm1hdCBvZmYKKy8vIE5PTElOVEJFR0lOKHdoaXRlc3BhY2UvbGluZV9sZW5ndGgpCisvLy8gXG5vdGUgVXNlcnMgb2YgVGVuc29yRmxvdyBMaXRlIHNob3VsZCB1c2UKKy8vLyBcY29kZQorLy8vICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvYy9jb21tb24uaCIKKy8vLyBcZW5kY29kZQorLy8vIHRvIGFjY2VzcyB0aGUgQVBJcyBkb2N1bWVudGVkIG9uIHRoaXMgcGFnZS4KKy8vIE5PTElOVEVORCh3aGl0ZXNwYWNlL2xpbmVfbGVuZ3RoKQorLy8gY2xhbmctZm9ybWF0IG9uCiAKLS8vLyBXQVJOSU5HOiBVc2VycyBvZiBUZW5zb3JGbG93IExpdGUgc2hvdWxkIG5vdCBpbmNsdWRlIHRoaXMgZmlsZSBkaXJlY3RseSwKLS8vLyBidXQgc2hvdWxkIGluc3RlYWQgaW5jbHVkZQotLy8vICJ0aGlyZF9wYXJ0eS90ZW5zb3JmbG93L2xpdGUvYy9jb21tb24uaCIuCi0vLy8gT25seSB0aGUgVGVuc29yRmxvdyBMaXRlIGltcGxlbWVudGF0aW9uIGl0c2VsZiBzaG91bGQgaW5jbHVkZSB0aGlzCi0vLy8gZmlsZSBkaXJlY3RseS4KIC8vIElXWVUgcHJhZ21hOiBwcml2YXRlLCBpbmNsdWRlICJ0aGlyZF9wYXJ0eS90ZW5zb3JmbG93L2xpdGUvYy9jb21tb24uaCIKIAogI2lmbmRlZiBURU5TT1JGTE9XX0xJVEVfQ09SRV9DX0NPTU1PTl9IXwpAQCAtNTQsMTUgKzYzLDIzIEBACiBleHRlcm4gIkMiIHsKICNlbmRpZiAgLy8gX19jcGx1c3BsdXMKIAotLy8gVGhlIGxpc3Qgb2YgZXh0ZXJuYWwgY29udGV4dCB0eXBlcyBrbm93biB0byBURiBMaXRlLiBUaGlzIGxpc3QgZXhpc3RzIHNvbGVseQotLy8gdG8gYXZvaWQgY29uZmxpY3RzIGFuZCB0byBlbnN1cmUgb3BzIGNhbiBzaGFyZSB0aGUgZXh0ZXJuYWwgY29udGV4dHMgdGhleQotLy8gbmVlZC4gQWNjZXNzIHRvIHRoZSBleHRlcm5hbCBjb250ZXh0cyBpcyBjb250cm9sbGVkIGJ5IG9uZSBvZiB0aGUKLS8vIGNvcnJlc3BvbmRpbmcgc3VwcG9ydCBmaWxlcy4KKy8vIGNsYW5nLWZvcm1hdCBvZmYKKy8vIE5PTElOVEJFR0lOKHdoaXRlc3BhY2UvbGluZV9sZW5ndGgpCisvKiogXGRlZmdyb3VwIGNvbW1vbiBsaXRlL2MvY29tbW9uLmgKKyAqICBAeworICovCisvLyBOT0xJTlRFTkQod2hpdGVzcGFjZS9saW5lX2xlbmd0aCkKKy8vIGNsYW5nLWZvcm1hdCBvbgorCisvLy8gVGhlIGxpc3Qgb2YgZXh0ZXJuYWwgY29udGV4dCB0eXBlcyBrbm93biB0byBURiBMaXRlLiBUaGlzIGxpc3QgZXhpc3RzIHNvbGVseQorLy8vIHRvIGF2b2lkIGNvbmZsaWN0cyBhbmQgdG8gZW5zdXJlIG9wcyBjYW4gc2hhcmUgdGhlIGV4dGVybmFsIGNvbnRleHRzIHRoZXkKKy8vLyBuZWVkLiBBY2Nlc3MgdG8gdGhlIGV4dGVybmFsIGNvbnRleHRzIGlzIGNvbnRyb2xsZWQgYnkgb25lIG9mIHRoZQorLy8vIGNvcnJlc3BvbmRpbmcgc3VwcG9ydCBmaWxlcy4KIHR5cGVkZWYgZW51bSBUZkxpdGVFeHRlcm5hbENvbnRleHRUeXBlIHsKLSAga1RmTGl0ZUVpZ2VuQ29udGV4dCA9IDAsICAgICAgIC8vIGluY2x1ZGUgZWlnZW5fc3VwcG9ydC5oIHRvIHVzZS4KLSAga1RmTGl0ZUdlbW1Mb3dwQ29udGV4dCA9IDEsICAgIC8vIGluY2x1ZGUgZ2VtbV9zdXBwb3J0LmggdG8gdXNlLgotICBrVGZMaXRlRWRnZVRwdUNvbnRleHQgPSAyLCAgICAgLy8gUGxhY2Vob2xkZXIgZm9yIEVkZ2UgVFBVIHN1cHBvcnQuCi0gIGtUZkxpdGVDcHVCYWNrZW5kQ29udGV4dCA9IDMsICAvLyBpbmNsdWRlIGNwdV9iYWNrZW5kX2NvbnRleHQuaCB0byB1c2UuCisgIGtUZkxpdGVFaWdlbkNvbnRleHQgPSAwLCAgICAgICAvLy8gaW5jbHVkZSBlaWdlbl9zdXBwb3J0LmggdG8gdXNlLgorICBrVGZMaXRlR2VtbUxvd3BDb250ZXh0ID0gMSwgICAgLy8vIGluY2x1ZGUgZ2VtbV9zdXBwb3J0LmggdG8gdXNlLgorICBrVGZMaXRlRWRnZVRwdUNvbnRleHQgPSAyLCAgICAgLy8vIFBsYWNlaG9sZGVyIGZvciBFZGdlIFRQVSBzdXBwb3J0LgorICBrVGZMaXRlQ3B1QmFja2VuZENvbnRleHQgPSAzLCAgLy8vIGluY2x1ZGUgY3B1X2JhY2tlbmRfY29udGV4dC5oIHRvIHVzZS4KICAga1RmTGl0ZU1heEV4dGVybmFsQ29udGV4dHMgPSA0CiB9IFRmTGl0ZUV4dGVybmFsQ29udGV4dFR5cGU7CiAKQEAgLTczLDIwICs5MCwyMiBAQAogc3RydWN0IFRmTGl0ZVJlZ2lzdHJhdGlvbjsKIHN0cnVjdCBUZkxpdGVPcGFxdWVEZWxlZ2F0ZUJ1aWxkZXI7CiAKLS8vIEFuIGV4dGVybmFsIGNvbnRleHQgaXMgYSBjb2xsZWN0aW9uIG9mIGluZm9ybWF0aW9uIHVucmVsYXRlZCB0byB0aGUgVEYgTGl0ZQotLy8gZnJhbWV3b3JrLCBidXQgdXNlZnVsIHRvIGEgc3Vic2V0IG9mIHRoZSBvcHMuIFRGIExpdGUga25vd3MgdmVyeSBsaXR0bGUKLS8vIGFib3V0IHRoZSBhY3R1YWwgY29udGV4dHMsIGJ1dCBpdCBrZWVwcyBhIGxpc3Qgb2YgdGhlbSwgYW5kIGlzIGFibGUgdG8KLS8vIHJlZnJlc2ggdGhlbSBpZiBjb25maWd1cmF0aW9ucyBsaWtlIHRoZSBudW1iZXIgb2YgcmVjb21tZW5kZWQgdGhyZWFkcwotLy8gY2hhbmdlLgorLy8vIEFuIGV4dGVybmFsIGNvbnRleHQgaXMgYSBjb2xsZWN0aW9uIG9mIGluZm9ybWF0aW9uIHVucmVsYXRlZCB0byB0aGUgVEYgTGl0ZQorLy8vIGZyYW1ld29yaywgYnV0IHVzZWZ1bCB0byBhIHN1YnNldCBvZiB0aGUgb3BzLiBURiBMaXRlIGtub3dzIHZlcnkgbGl0dGxlCisvLy8gYWJvdXQgdGhlIGFjdHVhbCBjb250ZXh0cywgYnV0IGl0IGtlZXBzIGEgbGlzdCBvZiB0aGVtLCBhbmQgaXMgYWJsZSB0bworLy8vIHJlZnJlc2ggdGhlbSBpZiBjb25maWd1cmF0aW9ucyBsaWtlIHRoZSBudW1iZXIgb2YgcmVjb21tZW5kZWQgdGhyZWFkcworLy8vIGNoYW5nZS4KIHR5cGVkZWYgc3RydWN0IFRmTGl0ZUV4dGVybmFsQ29udGV4dCB7CiAgIFRmTGl0ZUV4dGVybmFsQ29udGV4dFR5cGUgdHlwZTsKICAgVGZMaXRlU3RhdHVzICgqUmVmcmVzaCkoc3RydWN0IFRmTGl0ZUNvbnRleHQqIGNvbnRleHQpOwogfSBUZkxpdGVFeHRlcm5hbENvbnRleHQ7CiAKKy8vIExJTlQuSWZDaGFuZ2Uob3B0aW9uYWxfdGVuc29yKQogI2RlZmluZSBrVGZMaXRlT3B0aW9uYWxUZW5zb3IgKC0xKQorLy8gTElOVC5UaGVuQ2hhbmdlKC8vdGVuc29yZmxvdy9jb21waWxlci9tbGlyL2xpdGUvZmxhdGJ1ZmZlcl9leHBvcnQuY2M6b3B0aW9uYWxfdGVuc29yKQogCi0vLyBGaXhlZCBzaXplIGxpc3Qgb2YgaW50ZWdlcnMuIFVzZWQgZm9yIGRpbWVuc2lvbnMgYW5kIGlucHV0cy9vdXRwdXRzIHRlbnNvcgotLy8gaW5kaWNlcworLy8vIEZpeGVkIHNpemUgbGlzdCBvZiBpbnRlZ2Vycy4gVXNlZCBmb3IgZGltZW5zaW9ucyBhbmQgaW5wdXRzL291dHB1dHMgdGVuc29yCisvLy8gaW5kaWNlcwogdHlwZWRlZiBzdHJ1Y3QgVGZMaXRlSW50QXJyYXkgewogICBpbnQgc2l6ZTsKIApAQCAtMTA1LDMzICsxMjQsMzMgQEAKICNlbmRpZgogfSBUZkxpdGVJbnRBcnJheTsKIAotLy8gR2l2ZW4gdGhlIHNpemUgKG51bWJlciBvZiBlbGVtZW50cykgaW4gYSBUZkxpdGVJbnRBcnJheSwgY2FsY3VsYXRlIGl0cyBzaXplCi0vLyBpbiBieXRlcy4KKy8vLyBHaXZlbiB0aGUgc2l6ZSAobnVtYmVyIG9mIGVsZW1lbnRzKSBpbiBhIFRmTGl0ZUludEFycmF5LCBjYWxjdWxhdGUgaXRzIHNpemUKKy8vLyBpbiBieXRlcy4KIHNpemVfdCBUZkxpdGVJbnRBcnJheUdldFNpemVJbkJ5dGVzKGludCBzaXplKTsKIAogI2lmbmRlZiBURl9MSVRFX1NUQVRJQ19NRU1PUlkKLS8vIENyZWF0ZSBhIGFycmF5IG9mIGEgZ2l2ZW4gYHNpemVgICh1bmluaXRpYWxpemVkIGVudHJpZXMpLgotLy8gVGhpcyByZXR1cm5zIGEgcG9pbnRlciwgdGhhdCB5b3UgbXVzdCBmcmVlIHVzaW5nIFRmTGl0ZUludEFycmF5RnJlZSgpLgorLy8vIENyZWF0ZSBhIGFycmF5IG9mIGEgZ2l2ZW4gYHNpemVgICh1bmluaXRpYWxpemVkIGVudHJpZXMpLgorLy8vIFRoaXMgcmV0dXJucyBhIHBvaW50ZXIsIHRoYXQgeW91IG11c3QgZnJlZSB1c2luZyBUZkxpdGVJbnRBcnJheUZyZWUoKS4KIFRmTGl0ZUludEFycmF5KiBUZkxpdGVJbnRBcnJheUNyZWF0ZShpbnQgc2l6ZSk7CiAjZW5kaWYKIAotLy8gQ2hlY2sgaWYgdHdvIGludGFycmF5cyBhcmUgZXF1YWwuIFJldHVybnMgMSBpZiB0aGV5IGFyZSBlcXVhbCwgMCBvdGhlcndpc2UuCisvLy8gQ2hlY2sgaWYgdHdvIGludGFycmF5cyBhcmUgZXF1YWwuIFJldHVybnMgMSBpZiB0aGV5IGFyZSBlcXVhbCwgMCBvdGhlcndpc2UuCiBpbnQgVGZMaXRlSW50QXJyYXlFcXVhbChjb25zdCBUZkxpdGVJbnRBcnJheSogYSwgY29uc3QgVGZMaXRlSW50QXJyYXkqIGIpOwogCi0vLyBDaGVjayBpZiBhbiBpbnRhcnJheSBlcXVhbHMgYW4gYXJyYXkuIFJldHVybnMgMSBpZiBlcXVhbHMsIDAgb3RoZXJ3aXNlLgorLy8vIENoZWNrIGlmIGFuIGludGFycmF5IGVxdWFscyBhbiBhcnJheS4gUmV0dXJucyAxIGlmIGVxdWFscywgMCBvdGhlcndpc2UuCiBpbnQgVGZMaXRlSW50QXJyYXlFcXVhbHNBcnJheShjb25zdCBUZkxpdGVJbnRBcnJheSogYSwgaW50IGJfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBiX2RhdGFbXSk7CiAKICNpZm5kZWYgVEZfTElURV9TVEFUSUNfTUVNT1JZCi0vLyBDcmVhdGUgYSBjb3B5IG9mIGFuIGFycmF5IHBhc3NlZCBhcyBgc3JjYC4KLS8vIFlvdSBhcmUgZXhwZWN0ZWQgdG8gZnJlZSBtZW1vcnkgd2l0aCBUZkxpdGVJbnRBcnJheUZyZWUKKy8vLyBDcmVhdGUgYSBjb3B5IG9mIGFuIGFycmF5IHBhc3NlZCBhcyBgc3JjYC4KKy8vLyBZb3UgYXJlIGV4cGVjdGVkIHRvIGZyZWUgbWVtb3J5IHdpdGggVGZMaXRlSW50QXJyYXlGcmVlCiBUZkxpdGVJbnRBcnJheSogVGZMaXRlSW50QXJyYXlDb3B5KGNvbnN0IFRmTGl0ZUludEFycmF5KiBzcmMpOwogCi0vLyBGcmVlIG1lbW9yeSBvZiBhcnJheSBgYWAuCisvLy8gRnJlZSBtZW1vcnkgb2YgYXJyYXkgYGFgLgogdm9pZCBUZkxpdGVJbnRBcnJheUZyZWUoVGZMaXRlSW50QXJyYXkqIGEpOwogI2VuZGlmICAvLyBURl9MSVRFX1NUQVRJQ19NRU1PUlkKIAotLy8gRml4ZWQgc2l6ZSBsaXN0IG9mIGZsb2F0cy4gVXNlZCBmb3IgcGVyLWNoYW5uZWwgcXVhbnRpemF0aW9uLgorLy8vIEZpeGVkIHNpemUgbGlzdCBvZiBmbG9hdHMuIFVzZWQgZm9yIHBlci1jaGFubmVsIHF1YW50aXphdGlvbi4KIHR5cGVkZWYgc3RydWN0IFRmTGl0ZUZsb2F0QXJyYXkgewogICBpbnQgc2l6ZTsKICNpZiBkZWZpbmVkKF9NU0NfVkVSKQpAQCAtMTQ5LDIwICsxNjgsMjAgQEAKICNlbmRpZgogfSBUZkxpdGVGbG9hdEFycmF5OwogCi0vLyBHaXZlbiB0aGUgc2l6ZSAobnVtYmVyIG9mIGVsZW1lbnRzKSBpbiBhIFRmTGl0ZUZsb2F0QXJyYXksIGNhbGN1bGF0ZSBpdHMgc2l6ZQotLy8gaW4gYnl0ZXMuCisvLy8gR2l2ZW4gdGhlIHNpemUgKG51bWJlciBvZiBlbGVtZW50cykgaW4gYSBUZkxpdGVGbG9hdEFycmF5LCBjYWxjdWxhdGUgaXRzCisvLy8gc2l6ZSBpbiBieXRlcy4KIGludCBUZkxpdGVGbG9hdEFycmF5R2V0U2l6ZUluQnl0ZXMoaW50IHNpemUpOwogCiAjaWZuZGVmIFRGX0xJVEVfU1RBVElDX01FTU9SWQotLy8gQ3JlYXRlIGEgYXJyYXkgb2YgYSBnaXZlbiBgc2l6ZWAgKHVuaW5pdGlhbGl6ZWQgZW50cmllcykuCi0vLyBUaGlzIHJldHVybnMgYSBwb2ludGVyLCB0aGF0IHlvdSBtdXN0IGZyZWUgdXNpbmcgVGZMaXRlRmxvYXRBcnJheUZyZWUoKS4KKy8vLyBDcmVhdGUgYSBhcnJheSBvZiBhIGdpdmVuIGBzaXplYCAodW5pbml0aWFsaXplZCBlbnRyaWVzKS4KKy8vLyBUaGlzIHJldHVybnMgYSBwb2ludGVyLCB0aGF0IHlvdSBtdXN0IGZyZWUgdXNpbmcgVGZMaXRlRmxvYXRBcnJheUZyZWUoKS4KIFRmTGl0ZUZsb2F0QXJyYXkqIFRmTGl0ZUZsb2F0QXJyYXlDcmVhdGUoaW50IHNpemUpOwogCi0vLyBDcmVhdGUgYSBjb3B5IG9mIGFuIGFycmF5IHBhc3NlZCBhcyBgc3JjYC4KLS8vIFlvdSBhcmUgZXhwZWN0ZWQgdG8gZnJlZSBtZW1vcnkgd2l0aCBUZkxpdGVGbG9hdEFycmF5RnJlZS4KKy8vLyBDcmVhdGUgYSBjb3B5IG9mIGFuIGFycmF5IHBhc3NlZCBhcyBgc3JjYC4KKy8vLyBZb3UgYXJlIGV4cGVjdGVkIHRvIGZyZWUgbWVtb3J5IHdpdGggVGZMaXRlRmxvYXRBcnJheUZyZWUuCiBUZkxpdGVGbG9hdEFycmF5KiBUZkxpdGVGbG9hdEFycmF5Q29weShjb25zdCBUZkxpdGVGbG9hdEFycmF5KiBzcmMpOwogCi0vLyBGcmVlIG1lbW9yeSBvZiBhcnJheSBgYWAuCisvLy8gRnJlZSBtZW1vcnkgb2YgYXJyYXkgYGFgLgogdm9pZCBUZkxpdGVGbG9hdEFycmF5RnJlZShUZkxpdGVGbG9hdEFycmF5KiBhKTsKICNlbmRpZiAgLy8gVEZfTElURV9TVEFUSUNfTUVNT1JZCiAKQEAgLTE5MSwxOCArMjEwLDE4IEBACiAjZGVmaW5lIFRGX0xJVEVfTUFZQkVfS0VSTkVMX0xPRyhjb250ZXh0LCAuLi4pIEFSR1NfVU5VU0VEKF9fVkFfQVJHU19fKQogI2VuZGlmICAvLyBURl9MSVRFX1NUUklQX0VSUk9SX1NUUklOR1MKIAotLy8gQ2hlY2sgd2hldGhlciB2YWx1ZSBpcyB0cnVlLCBhbmQgaWYgbm90IHJldHVybiBrVGZMaXRlRXJyb3IgZnJvbQotLy8gdGhlIGN1cnJlbnQgZnVuY3Rpb24gKGFuZCByZXBvcnQgdGhlIGVycm9yIHN0cmluZyBtc2cpLgotI2RlZmluZSBURl9MSVRFX0VOU1VSRV9NU0coY29udGV4dCwgdmFsdWUsIG1zZykgICAgICAgIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCEodmFsdWUpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgVEZfTElURV9LRVJORUxfTE9HKChjb250ZXh0KSwgX19GSUxFX18gIiAiIG1zZyk7IFwKLSAgICAgIHJldHVybiBrVGZMaXRlRXJyb3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorLy8vIENoZWNrIHdoZXRoZXIgdmFsdWUgaXMgdHJ1ZSwgYW5kIGlmIG5vdCByZXR1cm4ga1RmTGl0ZUVycm9yIGZyb20KKy8vLyB0aGUgY3VycmVudCBmdW5jdGlvbiAoYW5kIHJlcG9ydCB0aGUgZXJyb3Igc3RyaW5nIG1zZykuCisjZGVmaW5lIFRGX0xJVEVfRU5TVVJFX01TRyhjb250ZXh0LCB2YWx1ZSwgLi4uKSAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCEodmFsdWUpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBURl9MSVRFX0tFUk5FTF9MT0coKGNvbnRleHQpLCBfX0ZJTEVfXyAiICIgX19WQV9BUkdTX18pOyBcCisgICAgICByZXR1cm4ga1RmTGl0ZUVycm9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIH0gd2hpbGUgKDApCiAKLS8vIENoZWNrIHdoZXRoZXIgdGhlIHZhbHVlIGBhYCBpcyB0cnVlLCBhbmQgaWYgbm90IHJldHVybiBrVGZMaXRlRXJyb3IgZnJvbQotLy8gdGhlIGN1cnJlbnQgZnVuY3Rpb24sIHdoaWxlIGFsc28gcmVwb3J0aW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IuCisvLy8gQ2hlY2sgd2hldGhlciB0aGUgdmFsdWUgYGFgIGlzIHRydWUsIGFuZCBpZiBub3QgcmV0dXJuIGtUZkxpdGVFcnJvciBmcm9tCisvLy8gdGhlIGN1cnJlbnQgZnVuY3Rpb24sIHdoaWxlIGFsc28gcmVwb3J0aW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IuCiAjZGVmaW5lIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIGEpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgaWYgKCEoYSkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0yMjAsMTEgKzIzOSwxMiBAQAogICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB9IHdoaWxlICgwKQogCi0vLyBDaGVjayB3aGV0aGVyIHRoZSB2YWx1ZSBgYSA9PSBiYCBpcyB0cnVlLCBhbmQgaWYgbm90IHJldHVybiBrVGZMaXRlRXJyb3IgZnJvbQotLy8gdGhlIGN1cnJlbnQgZnVuY3Rpb24sIHdoaWxlIGFsc28gcmVwb3J0aW5nIHRoZSBsb2NhdGlvbiBvZiB0aGUgZXJyb3IuCi0vLyBgYWAgYW5kIGBiYCBtYXkgYmUgZXZhbHVhdGVkIG1vcmUgdGhhbiBvbmNlLCBzbyBubyBzaWRlIGVmZmVjdHMgb3IKLS8vIGV4dHJlbWVseSBleHBlbnNpdmUgY29tcHV0YXRpb25zIHNob3VsZCBiZSBkb25lLgotLy8gTk9URTogVXNlIFRGX0xJVEVfRU5TVVJFX1RZUEVTX0VRIGlmIGNvbXBhcmluZyBUZkxpdGVUeXBlcy4KKy8vLyBDaGVjayB3aGV0aGVyIHRoZSB2YWx1ZSBgYSA9PSBiYCBpcyB0cnVlLCBhbmQgaWYgbm90IHJldHVybiBrVGZMaXRlRXJyb3IKKy8vLyBmcm9tIHRoZSBjdXJyZW50IGZ1bmN0aW9uLCB3aGlsZSBhbHNvIHJlcG9ydGluZyB0aGUgbG9jYXRpb24gb2YgdGhlIGVycm9yLgorLy8vIGBhYCBhbmQgYGJgIG1heSBiZSBldmFsdWF0ZWQgbW9yZSB0aGFuIG9uY2UsIHNvIG5vIHNpZGUgZWZmZWN0cyBvcgorLy8vIGV4dHJlbWVseSBleHBlbnNpdmUgY29tcHV0YXRpb25zIHNob3VsZCBiZSBkb25lLgorLy8vCisvLy8gTk9URTogVXNlIFRGX0xJVEVfRU5TVVJFX1RZUEVTX0VRIGlmIGNvbXBhcmluZyBUZkxpdGVUeXBlcy4KICNkZWZpbmUgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgYSwgYikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBpZiAoKGEpICE9IChiKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTI2Myw2MSArMjgzLDY5IEBACiAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB9IHdoaWxlICgwKQogCi0vLyBTaW5nbGUtcHJlY2lzaW9uIGNvbXBsZXggZGF0YSB0eXBlIGNvbXBhdGlibGUgd2l0aCB0aGUgQzk5IGRlZmluaXRpb24uCisvLy8gU2luZ2xlLXByZWNpc2lvbiBjb21wbGV4IGRhdGEgdHlwZSBjb21wYXRpYmxlIHdpdGggdGhlIEM5OSBkZWZpbml0aW9uLgogdHlwZWRlZiBzdHJ1Y3QgVGZMaXRlQ29tcGxleDY0IHsKLSAgZmxvYXQgcmUsIGltOyAgLy8gcmVhbCBhbmQgaW1hZ2luYXJ5IHBhcnRzLCByZXNwZWN0aXZlbHkuCisgIGZsb2F0IHJlLCBpbTsgIC8vLyByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMsIHJlc3BlY3RpdmVseS4KIH0gVGZMaXRlQ29tcGxleDY0OwogCi0vLyBEb3VibGUtcHJlY2lzaW9uIGNvbXBsZXggZGF0YSB0eXBlIGNvbXBhdGlibGUgd2l0aCB0aGUgQzk5IGRlZmluaXRpb24uCisvLy8gRG91YmxlLXByZWNpc2lvbiBjb21wbGV4IGRhdGEgdHlwZSBjb21wYXRpYmxlIHdpdGggdGhlIEM5OSBkZWZpbml0aW9uLgogdHlwZWRlZiBzdHJ1Y3QgVGZMaXRlQ29tcGxleDEyOCB7Ci0gIGRvdWJsZSByZSwgaW07ICAvLyByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMsIHJlc3BlY3RpdmVseS4KKyAgZG91YmxlIHJlLCBpbTsgIC8vLyByZWFsIGFuZCBpbWFnaW5hcnkgcGFydHMsIHJlc3BlY3RpdmVseS4KIH0gVGZMaXRlQ29tcGxleDEyODsKIAotLy8gSGFsZiBwcmVjaXNpb24gZGF0YSB0eXBlIGNvbXBhdGlibGUgd2l0aCB0aGUgQzk5IGRlZmluaXRpb24uCisvLy8gSGFsZiBwcmVjaXNpb24gZGF0YSB0eXBlIGNvbXBhdGlibGUgd2l0aCB0aGUgQzk5IGRlZmluaXRpb24uCiB0eXBlZGVmIHN0cnVjdCBUZkxpdGVGbG9hdDE2IHsKICAgdWludDE2X3QgZGF0YTsKIH0gVGZMaXRlRmxvYXQxNjsKIAotLy8gUmV0dXJuIHRoZSBuYW1lIG9mIGEgZ2l2ZW4gdHlwZSwgZm9yIGVycm9yIHJlcG9ydGluZyBwdXJwb3Nlcy4KKy8vLyBiZmxvYXQxNiBkYXRhIHR5cGUgY29tcGF0aWJsZSB3aXRoIHRoZSBHb29nbGUgQnJhaW4gZGVmaW5pdGlvbi4KKy8vLyBodHRwczovL2Nsb3VkLmdvb2dsZS5jb20vdHB1L2RvY3MvYmZsb2F0MTYuCisvLy8gVGhpcyBwcm92aWRlcyAxIGJpdCBvZiBzaWduLCA4IGJpdHMgb2YgZXhwb25lbnQsIGFuZCA3IGJpdHMgb2YgbWFudGlzc2EuCit0eXBlZGVmIHN0cnVjdCBUZkxpdGVCRmxvYXQxNiB7CisgIHVpbnQxNl90IGRhdGE7Cit9IFRmTGl0ZUJGbG9hdDE2OworCisvLy8gUmV0dXJuIHRoZSBuYW1lIG9mIGEgZ2l2ZW4gdHlwZSwgZm9yIGVycm9yIHJlcG9ydGluZyBwdXJwb3Nlcy4KIGNvbnN0IGNoYXIqIFRmTGl0ZVR5cGVHZXROYW1lKFRmTGl0ZVR5cGUgdHlwZSk7CiAKLS8vIFN1cHBvcnRlZFF1YW50aXphdGlvblR5cGVzLgorLy8vIFN1cHBvcnRlZFF1YW50aXphdGlvblR5cGVzLgogdHlwZWRlZiBlbnVtIFRmTGl0ZVF1YW50aXphdGlvblR5cGUgewotICAvLyBObyBxdWFudGl6YXRpb24uCisgIC8vLyBObyBxdWFudGl6YXRpb24uCiAgIGtUZkxpdGVOb1F1YW50aXphdGlvbiA9IDAsCi0gIC8vIEFmZmluZSBxdWFudGl6YXRpb24gKHdpdGggc3VwcG9ydCBmb3IgcGVyLWNoYW5uZWwgcXVhbnRpemF0aW9uKS4KLSAgLy8gQ29ycmVzcG9uZHMgdG8gVGZMaXRlQWZmaW5lUXVhbnRpemF0aW9uLgorICAvLy8gQWZmaW5lIHF1YW50aXphdGlvbiAod2l0aCBzdXBwb3J0IGZvciBwZXItY2hhbm5lbCBxdWFudGl6YXRpb24pLgorICAvLy8gQ29ycmVzcG9uZHMgdG8gVGZMaXRlQWZmaW5lUXVhbnRpemF0aW9uLgogICBrVGZMaXRlQWZmaW5lUXVhbnRpemF0aW9uID0gMSwKIH0gVGZMaXRlUXVhbnRpemF0aW9uVHlwZTsKIAotLy8gU3RydWN0dXJlIHNwZWNpZnlpbmcgdGhlIHF1YW50aXphdGlvbiB1c2VkIGJ5IHRoZSB0ZW5zb3IsIGlmLWFueS4KKy8vLyBTdHJ1Y3R1cmUgc3BlY2lmeWluZyB0aGUgcXVhbnRpemF0aW9uIHVzZWQgYnkgdGhlIHRlbnNvciwgaWYtYW55LgogdHlwZWRlZiBzdHJ1Y3QgVGZMaXRlUXVhbnRpemF0aW9uIHsKLSAgLy8gVGhlIHR5cGUgb2YgcXVhbnRpemF0aW9uIGhlbGQgYnkgcGFyYW1zLgorICAvLy8gVGhlIHR5cGUgb2YgcXVhbnRpemF0aW9uIGhlbGQgYnkgcGFyYW1zLgogICBUZkxpdGVRdWFudGl6YXRpb25UeXBlIHR5cGU7Ci0gIC8vIEhvbGRzIGFuIG9wdGlvbmFsIHJlZmVyZW5jZSB0byBhIHF1YW50aXphdGlvbiBwYXJhbSBzdHJ1Y3R1cmUuIFRoZSBhY3R1YWwKLSAgLy8gdHlwZSBkZXBlbmRzIG9uIHRoZSB2YWx1ZSBvZiB0aGUgYHR5cGVgIGZpZWxkIChzZWUgdGhlIGNvbW1lbnQgdGhlcmUgZm9yCi0gIC8vIHRoZSB2YWx1ZXMgYW5kIGNvcnJlc3BvbmRpbmcgdHlwZXMpLgorICAvLy8gSG9sZHMgYW4gb3B0aW9uYWwgcmVmZXJlbmNlIHRvIGEgcXVhbnRpemF0aW9uIHBhcmFtIHN0cnVjdHVyZS4gVGhlIGFjdHVhbAorICAvLy8gdHlwZSBkZXBlbmRzIG9uIHRoZSB2YWx1ZSBvZiB0aGUgYHR5cGVgIGZpZWxkIChzZWUgdGhlIGNvbW1lbnQgdGhlcmUgZm9yCisgIC8vLyB0aGUgdmFsdWVzIGFuZCBjb3JyZXNwb25kaW5nIHR5cGVzKS4KICAgdm9pZCogcGFyYW1zOwogfSBUZkxpdGVRdWFudGl6YXRpb247CiAKLS8vIFBhcmFtZXRlcnMgZm9yIGFzeW1tZXRyaWMgcXVhbnRpemF0aW9uIGFjcm9zcyBhIGRpbWVuc2lvbiAoaS5lIHBlciBvdXRwdXQKLS8vIGNoYW5uZWwgcXVhbnRpemF0aW9uKS4KLS8vIHF1YW50aXplZF9kaW1lbnNpb24gc3BlY2lmaWVzIHdoaWNoIGRpbWVuc2lvbiB0aGUgc2NhbGVzIGFuZCB6ZXJvX3BvaW50cwotLy8gY29ycmVzcG9uZCB0by4KLS8vIEZvciBhIHBhcnRpY3VsYXIgdmFsdWUgaW4gcXVhbnRpemVkX2RpbWVuc2lvbiwgcXVhbnRpemVkIHZhbHVlcyBjYW4gYmUKLS8vIGNvbnZlcnRlZCBiYWNrIHRvIGZsb2F0IHVzaW5nOgotLy8gICAgIHJlYWxfdmFsdWUgPSBzY2FsZSAqIChxdWFudGl6ZWRfdmFsdWUgLSB6ZXJvX3BvaW50KQorLy8vIFBhcmFtZXRlcnMgZm9yIGFzeW1tZXRyaWMgcXVhbnRpemF0aW9uIGFjcm9zcyBhIGRpbWVuc2lvbiAoaS5lIHBlciBvdXRwdXQKKy8vLyBjaGFubmVsIHF1YW50aXphdGlvbikuCisvLy8gcXVhbnRpemVkX2RpbWVuc2lvbiBzcGVjaWZpZXMgd2hpY2ggZGltZW5zaW9uIHRoZSBzY2FsZXMgYW5kIHplcm9fcG9pbnRzCisvLy8gY29ycmVzcG9uZCB0by4KKy8vLyBGb3IgYSBwYXJ0aWN1bGFyIHZhbHVlIGluIHF1YW50aXplZF9kaW1lbnNpb24sIHF1YW50aXplZCB2YWx1ZXMgY2FuIGJlCisvLy8gY29udmVydGVkIGJhY2sgdG8gZmxvYXQgdXNpbmc6CisvLy8gICAgIGByZWFsX3ZhbHVlID0gc2NhbGUgKiAocXVhbnRpemVkX3ZhbHVlIC0gemVyb19wb2ludClgCiB0eXBlZGVmIHN0cnVjdCBUZkxpdGVBZmZpbmVRdWFudGl6YXRpb24gewogICBUZkxpdGVGbG9hdEFycmF5KiBzY2FsZTsKICAgVGZMaXRlSW50QXJyYXkqIHplcm9fcG9pbnQ7CiAgIGludDMyX3QgcXVhbnRpemVkX2RpbWVuc2lvbjsKIH0gVGZMaXRlQWZmaW5lUXVhbnRpemF0aW9uOwogCi0vKiBBIHVuaW9uIG9mIHBvaW50ZXJzIHRoYXQgcG9pbnRzIHRvIG1lbW9yeSBmb3IgYSBnaXZlbiB0ZW5zb3IuICovCisvLy8gQSB1bmlvbiBvZiBwb2ludGVycyB0aGF0IHBvaW50cyB0byBtZW1vcnkgZm9yIGEgZ2l2ZW4gdGVuc29yLgorLy8vCisvLy8gRG8gbm90IGFjY2VzcyB0aGVzZSBtZW1iZXJzIGRpcmVjdGx5LCBpZiBwb3NzaWJsZSwgdXNlCisvLy8gYEdldFRlbnNvckRhdGE8VFlQRT4odGVuc29yKWAgaW5zdGVhZCwgb3RoZXJ3aXNlIG9ubHkgYWNjZXNzIGAuZGF0YWAsIGFzCisvLy8gb3RoZXIgbWVtYmVycyBhcmUgZGVwcmVjYXRlZC4KIHR5cGVkZWYgdW5pb24gVGZMaXRlUHRyVW5pb24gewotICAvKiBEbyBub3QgYWNjZXNzIHRoZXNlIG1lbWJlcnMgZGlyZWN0bHksIGlmIHBvc3NpYmxlLCB1c2UKLSAgICogR2V0VGVuc29yRGF0YTxUWVBFPih0ZW5zb3IpIGluc3RlYWQsIG90aGVyd2lzZSBvbmx5IGFjY2VzcyAuZGF0YSwgYXMgb3RoZXIKLSAgICogbWVtYmVycyBhcmUgZGVwcmVjYXRlZC4gKi8KICAgaW50MzJfdCogaTMyOwogICB1aW50MzJfdCogdTMyOwogICBpbnQ2NF90KiBpNjQ7CkBAIC0zMzQsMjQgKzM2MiwyNiBAQAogICBUZkxpdGVDb21wbGV4NjQqIGM2NDsKICAgVGZMaXRlQ29tcGxleDEyOCogYzEyODsKICAgaW50OF90KiBpbnQ4OwotICAvKiBPbmx5IHVzZSB0aGlzIG1lbWJlci4gKi8KKyAgLy8vIE9ubHkgdXNlIHRoaXMgbWVtYmVyLgogICB2b2lkKiBkYXRhOwogfSBUZkxpdGVQdHJVbmlvbjsKIAotLy8gTWVtb3J5IGFsbG9jYXRpb24gc3RyYXRlZ2llcy4KLS8vICAqIGtUZkxpdGVNbWFwUm86IFJlYWQtb25seSBtZW1vcnktbWFwcGVkIGRhdGEsIG9yIGRhdGEgZXh0ZXJuYWxseSBhbGxvY2F0ZWQuCi0vLyAgKiBrVGZMaXRlQXJlbmFSdzogQXJlbmEgYWxsb2NhdGVkIHdpdGggbm8gZ3VhcmFudGVlcyBhYm91dCBwZXJzaXN0ZW5jZSwKLS8vICAgICAgICBhbmQgYXZhaWxhYmxlIGR1cmluZyBldmFsLgotLy8gICoga1RmTGl0ZUFyZW5hUndQZXJzaXN0ZW50OiBBcmVuYSBhbGxvY2F0ZWQgYnV0IHBlcnNpc3RlbnQgYWNyb3NzIGV2YWwsIGFuZAotLy8gICAgICAgIG9ubHkgYXZhaWxhYmxlIGR1cmluZyBldmFsLgotLy8gICoga1RmTGl0ZUR5bmFtaWM6IEFsbG9jYXRlZCBkdXJpbmcgZXZhbCwgb3IgZm9yIHN0cmluZyB0ZW5zb3JzLgotLy8gICoga1RmTGl0ZVBlcnNpc3RlbnRSbzogQWxsb2NhdGVkIGFuZCBwb3B1bGF0ZWQgZHVyaW5nIHByZXBhcmUuIFRoaXMgaXMKLS8vICAgICAgICB1c2VmdWwgZm9yIHRlbnNvcnMgdGhhdCBjYW4gYmUgY29tcHV0ZWQgZHVyaW5nIHByZXBhcmUgYW5kIHRyZWF0ZWQKLS8vICAgICAgICBhcyBjb25zdGFudCBpbnB1dHMgZm9yIGRvd25zdHJlYW0gb3BzIChhbHNvIGluIHByZXBhcmUpLgotLy8gICoga1RmTGl0ZUN1c3RvbTogQ3VzdG9tIG1lbW9yeSBhbGxvY2F0aW9uIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLiBTZWUKLS8vICAgICAgICBUZkxpdGVDdXN0b21BbGxvY2F0aW9uIGJlbG93LgotLy8gKiBrVGZMaXRlVmFyaWFudE9iamVjdDogQWxsb2NhdGlvbiBpcyBhbiBhcmJpdHJhcnkgdHlwZS1lcmFzZWQgQysrIG9iamVjdC4KLS8vICAgICAgICBBbGxvY2F0aW9uIGFuZCBkZWFsbG9jYXRpb24gYXJlIGRvbmUgdGhyb3VnaCBgbmV3YCBhbmQgYGRlbGV0ZWAuCisvLy8gTWVtb3J5IGFsbG9jYXRpb24gc3RyYXRlZ2llcy4KKy8vLyAgKiBga1RmTGl0ZU1tYXBSb2A6IFJlYWQtb25seSBtZW1vcnktbWFwcGVkIGRhdGEsIG9yIGRhdGEgZXh0ZXJuYWxseQorLy8vICAgICAgICBhbGxvY2F0ZWQuCisvLy8gICogYGtUZkxpdGVBcmVuYVJ3YDogQXJlbmEgYWxsb2NhdGVkIHdpdGggbm8gZ3VhcmFudGVlcyBhYm91dCBwZXJzaXN0ZW5jZSwKKy8vLyAgICAgICAgYW5kIGF2YWlsYWJsZSBkdXJpbmcgZXZhbC4KKy8vLyAgKiBga1RmTGl0ZUFyZW5hUndQZXJzaXN0ZW50YDogQXJlbmEgYWxsb2NhdGVkIGJ1dCBwZXJzaXN0ZW50IGFjcm9zcyBldmFsLAorLy8vICBhbmQgb25seSBhdmFpbGFibGUgZHVyaW5nIGV2YWwuCisvLy8gICogYGtUZkxpdGVEeW5hbWljYDogQWxsb2NhdGVkIGR1cmluZyBldmFsLCBvciBmb3Igc3RyaW5nIHRlbnNvcnMuCisvLy8gICogYGtUZkxpdGVQZXJzaXN0ZW50Um9gOiBBbGxvY2F0ZWQgYW5kIHBvcHVsYXRlZCBkdXJpbmcgcHJlcGFyZS4gVGhpcyBpcworLy8vICAgICAgICB1c2VmdWwgZm9yIHRlbnNvcnMgdGhhdCBjYW4gYmUgY29tcHV0ZWQgZHVyaW5nIHByZXBhcmUgYW5kIHRyZWF0ZWQKKy8vLyAgICAgICAgYXMgY29uc3RhbnQgaW5wdXRzIGZvciBkb3duc3RyZWFtIG9wcyAoYWxzbyBpbiBwcmVwYXJlKS4KKy8vLyAgKiBga1RmTGl0ZUN1c3RvbWA6IEN1c3RvbSBtZW1vcnkgYWxsb2NhdGlvbiBwcm92aWRlZCBieSB0aGUgdXNlci4gU2VlCisvLy8gICAgICAgIFRmTGl0ZUN1c3RvbUFsbG9jYXRpb24gYmVsb3cuCisvLy8gICogYGtUZkxpdGVWYXJpYW50T2JqZWN0YDogQWxsb2NhdGlvbiBpcyBhbiBhcmJpdHJhcnkgdHlwZS1lcmFzZWQgQysrCisvLy8gIG9iamVjdC4KKy8vLyAgICAgICAgQWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIGFyZSBkb25lIHRocm91Z2ggYG5ld2AgYW5kIGBkZWxldGVgLgogdHlwZWRlZiBlbnVtIFRmTGl0ZUFsbG9jYXRpb25UeXBlIHsKICAga1RmTGl0ZU1lbU5vbmUgPSAwLAogICBrVGZMaXRlTW1hcFJvLApAQCAtMzYzLDIwICszOTMsNTEgQEAKICAga1RmTGl0ZVZhcmlhbnRPYmplY3QsCiB9IFRmTGl0ZUFsbG9jYXRpb25UeXBlOwogCi0vLyBUaGUgZGVsZWdhdGVzIHNob3VsZCB1c2UgemVybyBvciBwb3NpdGl2ZSBpbnRlZ2VycyB0byByZXByZXNlbnQgaGFuZGxlcy4KLS8vIC0xIGlzIHJlc2VydmVkIGZyb20gdW5hbGxvY2F0ZWQgc3RhdHVzLgorLy8vIE1lbW9yeSBhbGxvY2F0aW9uIHN0cmF0ZWdpZXMuCisvLy8KKy8vLyBUZkxpdGVBbGxvY2F0aW9uVHlwZSB2YWx1ZXMgaGF2ZSBiZWVuIG92ZXJsb2FkZWQgdG8gbWVhbiBtb3JlIHRoYW4gdGhlaXIKKy8vLyBvcmlnaW5hbCBpbnRlbnQuIFRoaXMgZW51bSBzaG91bGQgb25seSBiZSB1c2VkIHRvIGRvY3VtZW50IHRoZSBhbGxvY2F0aW9uCisvLy8gc3RyYXRlZ3kgdXNlZCBieSBhIHRlbnNvciBmb3IgaXQgZGF0YS4KK3R5cGVkZWYgZW51bSBUZkxpdGVBbGxvY2F0aW9uU3RyYXRlZ3kgeworICBrVGZMaXRlQWxsb2NhdGlvblN0cmF0ZWd5VW5rbm93biwKKyAga1RmTGl0ZUFsbG9jYXRpb25TdHJhdGVneU5vbmUsICAgIC8vLyBObyBkYXRhIGlzIGFsbG9jYXRlZC4KKyAga1RmTGl0ZUFsbG9jYXRpb25TdHJhdGVneU1NYXAsICAgIC8vLyBEYXRhIGlzIG1tYXBlZC4KKyAga1RmTGl0ZUFsbG9jYXRpb25TdHJhdGVneUFyZW5hLCAgIC8vLyBIYW5kbGVkIGJ5IHRoZSBhcmVuYS4KKyAga1RmTGl0ZUFsbG9jYXRpb25TdHJhdGVneU1hbGxvYywgIC8vLyBVc2VzIGBtYWxsb2NgL2BmcmVlYC4KKyAga1RmTGl0ZUFsbG9jYXRpb25TdHJhdGVneU5ldyAgICAgIC8vLyBVc2VzIGBuZXdbXWAvYGRlbGV0ZVtdYC4KK30gVGZMaXRlQWxsb2NhdGlvblN0cmF0ZWd5OworCisvLy8gRGVzY3JpYmVzIGhvdyBzdGFibGUgYSB0ZW5zb3IgYXR0cmlidXRlIGlzIHdpdGggcmVnYXJkcyB0byBhbiBpbnRlcnByZXRlcgorLy8vIHJ1bnMuCit0eXBlZGVmIGVudW0gVGZMaXRlUnVuU3RhYmlsaXR5IHsKKyAga1RmTGl0ZVJ1blN0YWJpbGl0eVVua25vd24sCisgIGtUZkxpdGVSdW5TdGFiaWxpdHlVbnN0YWJsZSwgICAvLy8gTWF5IGNoYW5nZSBhdCBhbnkgdGltZS4KKyAga1RmTGl0ZVJ1blN0YWJpbGl0eVNpbmdsZVJ1biwgIC8vLyBXaWxsIHN0YXkgdGhlIHNhbWUgZm9yIG9uZSBydW4uCisgIGtUZkxpdGVSdW5TdGFiaWxpdHlBY3Jvc3NSdW5zICAvLy8gV2lsbCBzdGF5IHRoZSBzYW1lIGFjcm9zcyBhbGwgcnVucy4KK30gVGZMaXRlUnVuU3RhYmlsaXR5OworCisvLy8gRGVzY3JpYmVzIHRoZSBzdGVwcyBvZiBhIFRGTGl0ZSBvcGVyYXRpb24gbGlmZSBjeWNsZS4KK3R5cGVkZWYgZW51bSBUZkxpdGVSdW5TdGVwIHsKKyAga1RmTGl0ZVJ1blN0ZXBVbmtub3duLAorICBrVGZMaXRlUnVuU3RlcEluaXQsCisgIGtUZkxpdGVSdW5TdGVwUHJlcGFyZSwKKyAga1RmTGl0ZVJ1blN0ZXBFdmFsCit9IFRmTGl0ZVJ1blN0ZXA7CisKKy8vLyBUaGUgZGVsZWdhdGVzIHNob3VsZCB1c2UgemVybyBvciBwb3NpdGl2ZSBpbnRlZ2VycyB0byByZXByZXNlbnQgaGFuZGxlcy4KKy8vLyAtMSBpcyByZXNlcnZlZCBmcm9tIHVuYWxsb2NhdGVkIHN0YXR1cy4KIHR5cGVkZWYgaW50IFRmTGl0ZUJ1ZmZlckhhbmRsZTsKIGVudW0gewogICBrVGZMaXRlTnVsbEJ1ZmZlckhhbmRsZSA9IC0xLAogfTsKIAotLy8gU3RvcmFnZSBmb3JtYXQgb2YgZWFjaCBkaW1lbnNpb24gaW4gYSBzcGFyc2UgdGVuc29yLgorLy8vIFN0b3JhZ2UgZm9ybWF0IG9mIGVhY2ggZGltZW5zaW9uIGluIGEgc3BhcnNlIHRlbnNvci4KIHR5cGVkZWYgZW51bSBUZkxpdGVEaW1lbnNpb25UeXBlIHsKICAga1RmTGl0ZURpbURlbnNlID0gMCwKICAga1RmTGl0ZURpbVNwYXJzZUNTUiwKIH0gVGZMaXRlRGltZW5zaW9uVHlwZTsKIAotLy8gTWV0YWRhdGEgdG8gZW5jb2RlIGVhY2ggZGltZW5zaW9uIGluIGEgc3BhcnNlIHRlbnNvci4KKy8vLyBNZXRhZGF0YSB0byBlbmNvZGUgZWFjaCBkaW1lbnNpb24gaW4gYSBzcGFyc2UgdGVuc29yLgogdHlwZWRlZiBzdHJ1Y3QgVGZMaXRlRGltZW5zaW9uTWV0YWRhdGEgewogICBUZkxpdGVEaW1lbnNpb25UeXBlIGZvcm1hdDsKICAgaW50IGRlbnNlX3NpemU7CkBAIC0zODQsOCArNDQ1LDggQEAKICAgVGZMaXRlSW50QXJyYXkqIGFycmF5X2luZGljZXM7CiB9IFRmTGl0ZURpbWVuc2lvbk1ldGFkYXRhOwogCi0vLyBQYXJhbWV0ZXJzIHVzZWQgdG8gZW5jb2RlIGEgc3BhcnNlIHRlbnNvci4gRm9yIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9mIGVhY2gKLS8vIGZpZWxkIHBsZWFzZSByZWZlciB0byBsaXRlL3NjaGVtYS9zY2hlbWEuZmJzLgorLy8vIFBhcmFtZXRlcnMgdXNlZCB0byBlbmNvZGUgYSBzcGFyc2UgdGVuc29yLiBGb3IgZGV0YWlsZWQgZXhwbGFuYXRpb24gb2YgZWFjaAorLy8vIGZpZWxkIHBsZWFzZSByZWZlciB0byBsaXRlL3NjaGVtYS9zY2hlbWEuZmJzLgogdHlwZWRlZiBzdHJ1Y3QgVGZMaXRlU3BhcnNpdHkgewogICBUZkxpdGVJbnRBcnJheSogdHJhdmVyc2FsX29yZGVyOwogICBUZkxpdGVJbnRBcnJheSogYmxvY2tfbWFwOwpAQCAtMzkzLDEzMyArNDU0LDE0MSBAQAogICBpbnQgZGltX21ldGFkYXRhX3NpemU7CiB9IFRmTGl0ZVNwYXJzaXR5OwogCi0vLyBEZWZpbmVzIGEgY3VzdG9tIG1lbW9yeSBhbGxvY2F0aW9uIG5vdCBvd25lZCBieSB0aGUgcnVudGltZS4KLS8vIGBkYXRhYCBzaG91bGQgYmUgYWxpZ25lZCB0byBrRGVmYXVsdFRlbnNvckFsaWdubWVudCBkZWZpbmVkIGluCi0vLyBsaXRlL3V0aWwuaC4gKEN1cnJlbnRseSA2NCBieXRlcykKLS8vIE5PVEU6IFNlZSBJbnRlcnByZXRlci5TZXRDdXN0b21BbGxvY2F0aW9uRm9yVGVuc29yIGZvciBkZXRhaWxzIG9uIHVzYWdlLgorLy8vIERlZmluZXMgYSBjdXN0b20gbWVtb3J5IGFsbG9jYXRpb24gbm90IG93bmVkIGJ5IHRoZSBydW50aW1lLgorLy8vIGBkYXRhYCBzaG91bGQgYmUgYWxpZ25lZCB0byBrRGVmYXVsdFRlbnNvckFsaWdubWVudCBkZWZpbmVkIGluCisvLy8gbGl0ZS91dGlsLmguIChDdXJyZW50bHkgNjQgYnl0ZXMpCisvLy8gTk9URTogU2VlIGBJbnRlcnByZXRlcjo6U2V0Q3VzdG9tQWxsb2NhdGlvbkZvclRlbnNvcmAgZm9yIGRldGFpbHMgb24gdXNhZ2UuCiB0eXBlZGVmIHN0cnVjdCBUZkxpdGVDdXN0b21BbGxvY2F0aW9uIHsKICAgdm9pZCogZGF0YTsKICAgc2l6ZV90IGJ5dGVzOwogfSBUZkxpdGVDdXN0b21BbGxvY2F0aW9uOwogCi0vLyBUaGUgZmxhZ3MgdXNlZCBpbiBgSW50ZXJwcmV0ZXI6OlNldEN1c3RvbUFsbG9jYXRpb25Gb3JUZW5zb3JgLgotLy8gTm90ZSB0aGF0IHRoaXMgaXMgYSBiaXRtYXNrLCBzbyB0aGUgdmFsdWVzIHNob3VsZCBiZSAxLCAyLCA0LCA4LCAuLi5ldGMuCisvLy8gVGhlIGZsYWdzIHVzZWQgaW4gYEludGVycHJldGVyOjpTZXRDdXN0b21BbGxvY2F0aW9uRm9yVGVuc29yYC4KKy8vLyBOb3RlIHRoYXQgdGhpcyBpcyBhIGJpdG1hc2ssIHNvIHRoZSB2YWx1ZXMgc2hvdWxkIGJlIDEsIDIsIDQsIDgsIC4uLmV0Yy4KIHR5cGVkZWYgZW51bSBUZkxpdGVDdXN0b21BbGxvY2F0aW9uRmxhZ3MgewogICBrVGZMaXRlQ3VzdG9tQWxsb2NhdGlvbkZsYWdzTm9uZSA9IDAsCi0gIC8vIFNraXBzIGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhdGlvbi5kYXRhIHBvaW50cyB0byBhbiBhbGlnbmVkIGJ1ZmZlciBhcwotICAvLyBleHBlY3RlZCBieSB0aGUgVEZMaXRlIHJ1bnRpbWUuCi0gIC8vIE5PVEU6IFNldHRpbmcgdGhpcyBmbGFnIGNhbiBjYXVzZSBjcmFzaGVzIHdoZW4gY2FsbGluZyBJbnZva2UoKS4KLSAgLy8gVXNlIHdpdGggY2F1dGlvbi4KKyAgLy8vIFNraXBzIGNoZWNraW5nIHdoZXRoZXIgYWxsb2NhdGlvbi5kYXRhIHBvaW50cyB0byBhbiBhbGlnbmVkIGJ1ZmZlciBhcworICAvLy8gZXhwZWN0ZWQgYnkgdGhlIFRGTGl0ZSBydW50aW1lLgorICAvLy8gTk9URTogU2V0dGluZyB0aGlzIGZsYWcgY2FuIGNhdXNlIGNyYXNoZXMgd2hlbiBjYWxsaW5nIEludm9rZSgpLgorICAvLy8gVXNlIHdpdGggY2F1dGlvbi4KICAga1RmTGl0ZUN1c3RvbUFsbG9jYXRpb25GbGFnc1NraXBBbGlnbkNoZWNrID0gMSwKIH0gVGZMaXRlQ3VzdG9tQWxsb2NhdGlvbkZsYWdzOwogCi0vLyBBIHRlbnNvciBpbiB0aGUgaW50ZXJwcmV0ZXIgc3lzdGVtIHdoaWNoIGlzIGEgd3JhcHBlciBhcm91bmQgYSBidWZmZXIgb2YKLS8vIGRhdGEgaW5jbHVkaW5nIGEgZGltZW5zaW9uYWxpdHkgKG9yIE5VTEwgaWYgbm90IGN1cnJlbnRseSBkZWZpbmVkKS4KK2VudW0geyBrVGZMaXRlTm9CdWZmZXJJZGVudGlmaWVyID0gU0laRV9NQVggfTsKKworLy8vIEEgdGVuc29yIGluIHRoZSBpbnRlcnByZXRlciBzeXN0ZW0gd2hpY2ggaXMgYSB3cmFwcGVyIGFyb3VuZCBhIGJ1ZmZlciBvZgorLy8vIGRhdGEgaW5jbHVkaW5nIGEgZGltZW5zaW9uYWxpdHkgKG9yIE5VTEwgaWYgbm90IGN1cnJlbnRseSBkZWZpbmVkKS4KICNpZm5kZWYgVEZfTElURV9TVEFUSUNfTUVNT1JZCiB0eXBlZGVmIHN0cnVjdCBUZkxpdGVUZW5zb3IgewotICAvLyBUaGUgZGF0YSB0eXBlIHNwZWNpZmljYXRpb24gZm9yIGRhdGEgc3RvcmVkIGluIGBkYXRhYC4gVGhpcyBhZmZlY3RzCi0gIC8vIHdoYXQgbWVtYmVyIG9mIGBkYXRhYCB1bmlvbiBzaG91bGQgYmUgdXNlZC4KKyAgLy8vIFRoZSBkYXRhIHR5cGUgc3BlY2lmaWNhdGlvbiBmb3IgZGF0YSBzdG9yZWQgaW4gYGRhdGFgLiBUaGlzIGFmZmVjdHMKKyAgLy8vIHdoYXQgbWVtYmVyIG9mIGBkYXRhYCB1bmlvbiBzaG91bGQgYmUgdXNlZC4KICAgVGZMaXRlVHlwZSB0eXBlOwotICAvLyBBIHVuaW9uIG9mIGRhdGEgcG9pbnRlcnMuIFRoZSBhcHByb3ByaWF0ZSB0eXBlIHNob3VsZCBiZSB1c2VkIGZvciBhIHR5cGVkCi0gIC8vIHRlbnNvciBiYXNlZCBvbiBgdHlwZWAuCisgIC8vLyBBIHVuaW9uIG9mIGRhdGEgcG9pbnRlcnMuIFRoZSBhcHByb3ByaWF0ZSB0eXBlIHNob3VsZCBiZSB1c2VkIGZvciBhIHR5cGVkCisgIC8vLyB0ZW5zb3IgYmFzZWQgb24gYHR5cGVgLgogICBUZkxpdGVQdHJVbmlvbiBkYXRhOwotICAvLyBBIHBvaW50ZXIgdG8gYSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIHRoZSBkaW1lbnNpb25hbGl0eSBpbnRlcnByZXRhdGlvbgotICAvLyB0aGF0IHRoZSBidWZmZXIgc2hvdWxkIGhhdmUuIE5PVEU6IHRoZSBwcm9kdWN0IG9mIGVsZW1lbnRzIG9mIGBkaW1zYAotICAvLyBhbmQgdGhlIGVsZW1lbnQgZGF0YXR5cGUgc2l6ZSBzaG91bGQgYmUgZXF1YWwgdG8gYGJ5dGVzYCBiZWxvdy4KKyAgLy8vIEEgcG9pbnRlciB0byBhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIGRpbWVuc2lvbmFsaXR5IGludGVycHJldGF0aW9uCisgIC8vLyB0aGF0IHRoZSBidWZmZXIgc2hvdWxkIGhhdmUuIE5PVEU6IHRoZSBwcm9kdWN0IG9mIGVsZW1lbnRzIG9mIGBkaW1zYAorICAvLy8gYW5kIHRoZSBlbGVtZW50IGRhdGF0eXBlIHNpemUgc2hvdWxkIGJlIGVxdWFsIHRvIGBieXRlc2AgYmVsb3cuCiAgIFRmTGl0ZUludEFycmF5KiBkaW1zOwotICAvLyBRdWFudGl6YXRpb24gaW5mb3JtYXRpb24uCisgIC8vLyBRdWFudGl6YXRpb24gaW5mb3JtYXRpb24uCiAgIFRmTGl0ZVF1YW50aXphdGlvblBhcmFtcyBwYXJhbXM7Ci0gIC8vIEhvdyBtZW1vcnkgaXMgbWFwcGVkCi0gIC8vICBrVGZMaXRlTW1hcFJvOiBNZW1vcnkgbWFwcGVkIHJlYWQgb25seS4KLSAgLy8gIGkuZS4gd2VpZ2h0cwotICAvLyAga1RmTGl0ZUFyZW5hUnc6IEFyZW5hIGFsbG9jYXRlZCByZWFkIHdyaXRlIG1lbW9yeQotICAvLyAgKGkuZS4gdGVtcG9yYXJpZXMsIG91dHB1dHMpLgorICAvLy8gSG93IG1lbW9yeSBpcyBtYXBwZWQKKyAgLy8vICBrVGZMaXRlTW1hcFJvOiBNZW1vcnkgbWFwcGVkIHJlYWQgb25seS4KKyAgLy8vICBpLmUuIHdlaWdodHMKKyAgLy8vICBrVGZMaXRlQXJlbmFSdzogQXJlbmEgYWxsb2NhdGVkIHJlYWQgd3JpdGUgbWVtb3J5CisgIC8vLyAgKGkuZS4gdGVtcG9yYXJpZXMsIG91dHB1dHMpLgogICBUZkxpdGVBbGxvY2F0aW9uVHlwZSBhbGxvY2F0aW9uX3R5cGU7Ci0gIC8vIFRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc3RvcmUgdGhlIGRhdGEgb2YgdGhpcyBUZW5zb3IuIEkuZS4KLSAgLy8gKGJ5dGVzIG9mIGVhY2ggZWxlbWVudCkgKiBkaW1zWzBdICogLi4uICogZGltc1tuLTFdLiAgRm9yIGV4YW1wbGUsIGlmCi0gIC8vIHR5cGUgaXMga1RmTGl0ZUZsb2F0MzIgYW5kIGRpbXMgPSB7MywgMn0gdGhlbgotICAvLyBieXRlcyA9IHNpemVvZihmbG9hdCkgKiAzICogMiA9IDQgKiAzICogMiA9IDI0LgorICAvLy8gVGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBzdG9yZSB0aGUgZGF0YSBvZiB0aGlzIFRlbnNvci4gSS5lLgorICAvLy8gKGJ5dGVzIG9mIGVhY2ggZWxlbWVudCkgKiBkaW1zWzBdICogLi4uICogZGltc1tuLTFdLiAgRm9yIGV4YW1wbGUsIGlmCisgIC8vLyB0eXBlIGlzIGtUZkxpdGVGbG9hdDMyIGFuZCBkaW1zID0gezMsIDJ9IHRoZW4KKyAgLy8vIGJ5dGVzID0gc2l6ZW9mKGZsb2F0KSAqIDMgKiAyID0gNCAqIDMgKiAyID0gMjQuCiAgIHNpemVfdCBieXRlczsKIAotICAvLyBBbiBvcGFxdWUgcG9pbnRlciB0byBhIHRmbGl0ZTo6TU1hcEFsbG9jYXRpb24KKyAgLy8vIEFuIG9wYXF1ZSBwb2ludGVyIHRvIGEgdGZsaXRlOjpNTWFwQWxsb2NhdGlvbgogICBjb25zdCB2b2lkKiBhbGxvY2F0aW9uOwogCi0gIC8vIE51bGwtdGVybWluYXRlZCBuYW1lIG9mIHRoaXMgdGVuc29yLgorICAvLy8gTnVsbC10ZXJtaW5hdGVkIG5hbWUgb2YgdGhpcyB0ZW5zb3IuCiAgIGNvbnN0IGNoYXIqIG5hbWU7CiAKLSAgLy8gVGhlIGRlbGVnYXRlIHdoaWNoIGtub3dzIGhvdyB0byBoYW5kbGUgYGJ1ZmZlcl9oYW5kbGVgLgotICAvLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBpbnRlcmZhY2UgdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KKyAgLy8vIFRoZSBkZWxlZ2F0ZSB3aGljaCBrbm93cyBob3cgdG8gaGFuZGxlIGBidWZmZXJfaGFuZGxlYC4KKyAgLy8vCisgIC8vLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBpbnRlcmZhY2UgdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KICAgc3RydWN0IFRmTGl0ZURlbGVnYXRlKiBkZWxlZ2F0ZTsKIAotICAvLyBBbiBpbnRlZ2VyIGJ1ZmZlciBoYW5kbGUgdGhhdCBjYW4gYmUgaGFuZGxlZCBieSBgZGVsZWdhdGVgLgotICAvLyBUaGUgdmFsdWUgaXMgdmFsaWQgb25seSB3aGVuIGRlbGVnYXRlIGlzIG5vdCBudWxsLgotICAvLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBpbnRlcmZhY2UgdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KKyAgLy8vIEFuIGludGVnZXIgYnVmZmVyIGhhbmRsZSB0aGF0IGNhbiBiZSBoYW5kbGVkIGJ5IGBkZWxlZ2F0ZWAuCisgIC8vLyBUaGUgdmFsdWUgaXMgdmFsaWQgb25seSB3aGVuIGRlbGVnYXRlIGlzIG5vdCBudWxsLgorICAvLy8KKyAgLy8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGludGVyZmFjZSB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgogICBUZkxpdGVCdWZmZXJIYW5kbGUgYnVmZmVyX2hhbmRsZTsKIAotICAvLyBJZiB0aGUgZGVsZWdhdGUgdXNlcyBpdHMgb3duIGJ1ZmZlciAoZS5nLiBHUFUgbWVtb3J5KSwgdGhlIGRlbGVnYXRlIGlzCi0gIC8vIHJlc3BvbnNpYmxlIHRvIHNldCBkYXRhX2lzX3N0YWxlIHRvIHRydWUuCi0gIC8vIGBkZWxlZ2F0ZS0+Q29weUZyb21CdWZmZXJIYW5kbGVgIGNhbiBiZSBjYWxsZWQgdG8gY29weSB0aGUgZGF0YSBmcm9tCi0gIC8vIGRlbGVnYXRlIGJ1ZmZlci4KLSAgLy8gV0FSTklORzogVGhpcyBpcyBhbiAvLyBleHBlcmltZW50YWwgaW50ZXJmYWNlIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCisgIC8vLyBJZiB0aGUgZGVsZWdhdGUgdXNlcyBpdHMgb3duIGJ1ZmZlciAoZS5nLiBHUFUgbWVtb3J5KSwgdGhlIGRlbGVnYXRlIGlzCisgIC8vLyByZXNwb25zaWJsZSB0byBzZXQgZGF0YV9pc19zdGFsZSB0byB0cnVlLgorICAvLy8gYGRlbGVnYXRlLT5Db3B5RnJvbUJ1ZmZlckhhbmRsZWAgY2FuIGJlIGNhbGxlZCB0byBjb3B5IHRoZSBkYXRhIGZyb20KKyAgLy8vIGRlbGVnYXRlIGJ1ZmZlci4KKyAgLy8vCisgIC8vLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBpbnRlcmZhY2UgdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KICAgYm9vbCBkYXRhX2lzX3N0YWxlOwogCi0gIC8vIFRydWUgaWYgdGhlIHRlbnNvciBpcyBhIHZhcmlhYmxlLgorICAvLy8gVHJ1ZSBpZiB0aGUgdGVuc29yIGlzIGEgdmFyaWFibGUuCiAgIGJvb2wgaXNfdmFyaWFibGU7CiAKLSAgLy8gUXVhbnRpemF0aW9uIGluZm9ybWF0aW9uLiBSZXBsYWNlcyBwYXJhbXMgZmllbGQgYWJvdmUuCisgIC8vLyBRdWFudGl6YXRpb24gaW5mb3JtYXRpb24uIFJlcGxhY2VzIHBhcmFtcyBmaWVsZCBhYm92ZS4KICAgVGZMaXRlUXVhbnRpemF0aW9uIHF1YW50aXphdGlvbjsKIAotICAvLyBQYXJhbWV0ZXJzIHVzZWQgdG8gZW5jb2RlIGEgc3BhcnNlIHRlbnNvci4KLSAgLy8gVGhpcyBpcyBvcHRpb25hbC4gVGhlIGZpZWxkIGlzIE5VTEwgaWYgYSB0ZW5zb3IgaXMgZGVuc2UuCi0gIC8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGludGVyZmFjZSB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgorICAvLy8gUGFyYW1ldGVycyB1c2VkIHRvIGVuY29kZSBhIHNwYXJzZSB0ZW5zb3IuCisgIC8vLyBUaGlzIGlzIG9wdGlvbmFsLiBUaGUgZmllbGQgaXMgTlVMTCBpZiBhIHRlbnNvciBpcyBkZW5zZS4KKyAgLy8vCisgIC8vLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBpbnRlcmZhY2UgdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KICAgVGZMaXRlU3BhcnNpdHkqIHNwYXJzaXR5OwogCi0gIC8vIE9wdGlvbmFsLiBFbmNvZGVzIHNoYXBlcyB3aXRoIHVua25vd24gZGltZW5zaW9ucyB3aXRoIC0xLiBUaGlzIGZpZWxkIGlzCi0gIC8vIG9ubHkgcG9wdWxhdGVkIHdoZW4gdW5rbm93biBkaW1lbnNpb25zIGV4aXN0IGluIGEgcmVhZC13cml0ZSB0ZW5zb3IgKGkuZS4KLSAgLy8gYW4gaW5wdXQgb3Igb3V0cHV0IHRlbnNvcikuIChlLmcuICBgZGltc2AgY29udGFpbnMgWzEsIDEsIDEsIDNdIGFuZAotICAvLyBgZGltc19zaWduYXR1cmVgIGNvbnRhaW5zIFsxLCAtMSwgLTEsIDNdKS4gIElmIG5vIHVua25vd24gZGltZW5zaW9ucyBleGlzdAotICAvLyB0aGVuIGBkaW1zX3NpZ25hdHVyZWAgaXMgZWl0aGVyIG51bGwsIG9yIHNldCB0byBhbiBlbXB0eSBhcnJheS4gIE5vdGUgdGhhdAotICAvLyB0aGlzIGZpZWxkIG9ubHkgZXhpc3RzIHdoZW4gVEZfTElURV9TVEFUSUNfTUVNT1JZIGlzIG5vdCBkZWZpbmVkLgorICAvLy8gT3B0aW9uYWwuIEVuY29kZXMgc2hhcGVzIHdpdGggdW5rbm93biBkaW1lbnNpb25zIHdpdGggLTEuIFRoaXMgZmllbGQgaXMKKyAgLy8vIG9ubHkgcG9wdWxhdGVkIHdoZW4gdW5rbm93biBkaW1lbnNpb25zIGV4aXN0IGluIGEgcmVhZC13cml0ZSB0ZW5zb3IgKGkuZS4KKyAgLy8vIGFuIGlucHV0IG9yIG91dHB1dCB0ZW5zb3IpLiAoZS5nLiAgYGRpbXNgIGNvbnRhaW5zIFsxLCAxLCAxLCAzXSBhbmQKKyAgLy8vIGBkaW1zX3NpZ25hdHVyZWAgY29udGFpbnMgWzEsIC0xLCAtMSwgM10pLiAgSWYgbm8gdW5rbm93biBkaW1lbnNpb25zIGV4aXN0CisgIC8vLyB0aGVuIGBkaW1zX3NpZ25hdHVyZWAgaXMgZWl0aGVyIG51bGwsIG9yIHNldCB0byBhbiBlbXB0eSBhcnJheS4gIE5vdGUgdGhhdAorICAvLy8gdGhpcyBmaWVsZCBvbmx5IGV4aXN0cyB3aGVuIFRGX0xJVEVfU1RBVElDX01FTU9SWSBpcyBub3QgZGVmaW5lZC4KICAgY29uc3QgVGZMaXRlSW50QXJyYXkqIGRpbXNfc2lnbmF0dXJlOwogfSBUZkxpdGVUZW5zb3I7CiAKLS8vIEEgc3RydWN0dXJlIHJlcHJlc2VudGluZyBhbiBpbnN0YW5jZSBvZiBhIG5vZGUuCi0vLyBUaGlzIHN0cnVjdHVyZSBvbmx5IGV4aGliaXRzIHRoZSBpbnB1dHMsIG91dHB1dHMsIHVzZXIgZGVmaW5lZCBkYXRhIGFuZCBzb21lCi0vLyBub2RlIHByb3BlcnRpZXMgKGxpa2Ugc3RhdGVmdWxuZXNzKSwgbm90IG90aGVyIGZlYXR1cmVzIGxpa2UgdGhlIHR5cGUuCisvLy8gQSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGFuIGluc3RhbmNlIG9mIGEgbm9kZS4KKy8vLyBUaGlzIHN0cnVjdHVyZSBvbmx5IGV4aGliaXRzIHRoZSBpbnB1dHMsIG91dHB1dHMsIHVzZXIgZGVmaW5lZCBkYXRhIGFuZCBzb21lCisvLy8gbm9kZSBwcm9wZXJ0aWVzIChsaWtlIHN0YXRlZnVsbmVzcyksIG5vdCBvdGhlciBmZWF0dXJlcyBsaWtlIHRoZSB0eXBlLgogdHlwZWRlZiBzdHJ1Y3QgVGZMaXRlTm9kZSB7Ci0gIC8vIElucHV0cyB0byB0aGlzIG5vZGUgZXhwcmVzc2VkIGFzIGluZGljZXMgaW50byB0aGUgc2ltdWxhdG9yJ3MgdGVuc29ycy4KKyAgLy8vIElucHV0cyB0byB0aGlzIG5vZGUgZXhwcmVzc2VkIGFzIGluZGljZXMgaW50byB0aGUgc2ltdWxhdG9yJ3MgdGVuc29ycy4KICAgVGZMaXRlSW50QXJyYXkqIGlucHV0czsKIAotICAvLyBPdXRwdXRzIHRvIHRoaXMgbm9kZSBleHByZXNzZWQgYXMgaW5kaWNlcyBpbnRvIHRoZSBzaW11bGF0b3IncyB0ZW5zb3JzLgorICAvLy8gT3V0cHV0cyB0byB0aGlzIG5vZGUgZXhwcmVzc2VkIGFzIGluZGljZXMgaW50byB0aGUgc2ltdWxhdG9yJ3MgdGVuc29ycy4KICAgVGZMaXRlSW50QXJyYXkqIG91dHB1dHM7CiAKLSAgLy8gaW50ZXJtZWRpYXRlIHRlbnNvcnMgdG8gdGhpcyBub2RlIGV4cHJlc3NlZCBhcyBpbmRpY2VzIGludG8gdGhlIHNpbXVsYXRvcidzCi0gIC8vIHRlbnNvcnMuCisgIC8vLyBpbnRlcm1lZGlhdGUgdGVuc29ycyB0byB0aGlzIG5vZGUgZXhwcmVzc2VkIGFzIGluZGljZXMgaW50byB0aGUKKyAgLy8vIHNpbXVsYXRvcidzIHRlbnNvcnMuCiAgIFRmTGl0ZUludEFycmF5KiBpbnRlcm1lZGlhdGVzOwogCi0gIC8vIFRlbXBvcmFyeSB0ZW5zb3JzIHVzZXMgZHVyaW5nIHRoZSBjb21wdXRhdGlvbnMuIFRoaXMgdXN1YWxseSBjb250YWlucyBubwotICAvLyB0ZW5zb3JzLCBidXQgb3BzIGFyZSBhbGxvd2VkIHRvIGNoYW5nZSB0aGF0IGlmIHRoZXkgbmVlZCBzY3JhdGNoIHNwYWNlIG9mCi0gIC8vIGFueSBzb3J0LgorICAvLy8gVGVtcG9yYXJ5IHRlbnNvcnMgdXNlcyBkdXJpbmcgdGhlIGNvbXB1dGF0aW9ucy4gVGhpcyB1c3VhbGx5IGNvbnRhaW5zIG5vCisgIC8vLyB0ZW5zb3JzLCBidXQgb3BzIGFyZSBhbGxvd2VkIHRvIGNoYW5nZSB0aGF0IGlmIHRoZXkgbmVlZCBzY3JhdGNoIHNwYWNlIG9mCisgIC8vLyBhbnkgc29ydC4KICAgVGZMaXRlSW50QXJyYXkqIHRlbXBvcmFyaWVzOwogCi0gIC8vIE9wYXF1ZSBkYXRhIHByb3ZpZGVkIGJ5IHRoZSBub2RlIGltcGxlbWVudGVyIHRocm91Z2ggYFJlZ2lzdHJhdGlvbi5pbml0YC4KKyAgLy8vIE9wYXF1ZSBkYXRhIHByb3ZpZGVkIGJ5IHRoZSBub2RlIGltcGxlbWVudGVyIHRocm91Z2ggYFJlZ2lzdHJhdGlvbi5pbml0YC4KICAgdm9pZCogdXNlcl9kYXRhOwogCi0gIC8vIE9wYXF1ZSBkYXRhIHByb3ZpZGVkIHRvIHRoZSBub2RlIGlmIHRoZSBub2RlIGlzIGEgYnVpbHRpbi4gVGhpcyBpcyB1c3VhbGx5Ci0gIC8vIGEgc3RydWN0dXJlIGRlZmluZWQgaW4gYnVpbHRpbl9vcF9kYXRhLmgKKyAgLy8vIE9wYXF1ZSBkYXRhIHByb3ZpZGVkIHRvIHRoZSBub2RlIGlmIHRoZSBub2RlIGlzIGEgYnVpbHRpbi4gVGhpcyBpcyB1c3VhbGx5CisgIC8vLyBhIHN0cnVjdHVyZSBkZWZpbmVkIGluIGJ1aWx0aW5fb3BfZGF0YS5oCiAgIHZvaWQqIGJ1aWx0aW5fZGF0YTsKIAotICAvLyBDdXN0b20gaW5pdGlhbCBkYXRhLiBUaGlzIGlzIHRoZSBvcGFxdWUgZGF0YSBwcm92aWRlZCBpbiB0aGUgZmxhdGJ1ZmZlci4KLSAgLy8gV0FSTklORzogVGhpcyBpcyBhbiBleHBlcmltZW50YWwgaW50ZXJmYWNlIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCisgIC8vLyBDdXN0b20gaW5pdGlhbCBkYXRhLiBUaGlzIGlzIHRoZSBvcGFxdWUgZGF0YSBwcm92aWRlZCBpbiB0aGUgZmxhdGJ1ZmZlci4KKyAgLy8vCisgIC8vLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBpbnRlcmZhY2UgdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KICAgY29uc3Qgdm9pZCogY3VzdG9tX2luaXRpYWxfZGF0YTsKICAgaW50IGN1c3RvbV9pbml0aWFsX2RhdGFfc2l6ZTsKIAotICAvLyBUaGUgcG9pbnRlciB0byB0aGUgZGVsZWdhdGUuIFRoaXMgaXMgbm9uLW51bGwgb25seSB3aGVuIHRoZSBub2RlIGlzCi0gIC8vIGNyZWF0ZWQgYnkgY2FsbGluZyBgaW50ZXJwcmV0ZXIuTW9kaWZ5R3JhcGhXaXRoRGVsZWdhdGVgLgotICAvLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBpbnRlcmZhY2UgdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KKyAgLy8vIFRoZSBwb2ludGVyIHRvIHRoZSBkZWxlZ2F0ZS4gVGhpcyBpcyBub24tbnVsbCBvbmx5IHdoZW4gdGhlIG5vZGUgaXMKKyAgLy8vIGNyZWF0ZWQgYnkgY2FsbGluZyBgaW50ZXJwcmV0ZXIuTW9kaWZ5R3JhcGhXaXRoRGVsZWdhdGVgLgorICAvLy8KKyAgLy8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGludGVyZmFjZSB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgogICBzdHJ1Y3QgVGZMaXRlRGVsZWdhdGUqIGRlbGVnYXRlOwogCi0gIC8vIFdoZXRoZXIgdGhpcyBvcCBtaWdodCBoYXZlIHNpZGUgZWZmZWN0IChlLmcuIHN0YXRlZnVsIG9wKS4KKyAgLy8vIFdoZXRoZXIgdGhpcyBvcCBtaWdodCBoYXZlIHNpZGUgZWZmZWN0IChlLmcuIHN0YXRlZnVsIG9wKS4KICAgYm9vbCBtaWdodF9oYXZlX3NpZGVfZWZmZWN0OwogfSBUZkxpdGVOb2RlOwogI2Vsc2UgICAvLyBkZWZpbmVkKFRGX0xJVEVfU1RBVElDX01FTU9SWSk/CkBAIC02MDIsOTAgKzY3MSw4OSBAQAogICB2b2lkKiBidWlsdGluX2RhdGE7CiAKICAgLy8gQ3VzdG9tIGluaXRpYWwgZGF0YS4gVGhpcyBpcyB0aGUgb3BhcXVlIGRhdGEgcHJvdmlkZWQgaW4gdGhlIGZsYXRidWZmZXIuCisgIC8vCiAgIC8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGludGVyZmFjZSB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgogICBjb25zdCB2b2lkKiBjdXN0b21faW5pdGlhbF9kYXRhOwogICBpbnQgY3VzdG9tX2luaXRpYWxfZGF0YV9zaXplOwogfSBUZkxpdGVOb2RlOwogI2VuZGlmICAvLyBURl9MSVRFX1NUQVRJQ19NRU1PUlkKIAotLy8gTGlnaHQtd2VpZ2h0IHRlbnNvciBzdHJ1Y3QgZm9yIFRGIE1pY3JvIHJ1bnRpbWUuIFByb3ZpZGVzIHRoZSBtaW5pbWFsIGFtb3VudAotLy8gb2YgaW5mb3JtYXRpb24gcmVxdWlyZWQgZm9yIGEga2VybmVsIHRvIHJ1biBkdXJpbmcgVGZMaXRlUmVnaXN0cmF0aW9uOjpFdmFsLgorLy8vIExpZ2h0LXdlaWdodCB0ZW5zb3Igc3RydWN0IGZvciBURiBNaWNybyBydW50aW1lLiBQcm92aWRlcyB0aGUgbWluaW1hbCBhbW91bnQKKy8vLyBvZiBpbmZvcm1hdGlvbiByZXF1aXJlZCBmb3IgYSBrZXJuZWwgdG8gcnVuIGR1cmluZyBUZkxpdGVSZWdpc3RyYXRpb246OkV2YWwuCiAvLyBUT0RPKGIvMTYwOTU1Njg3KTogTW92ZSB0aGlzIGZpZWxkIGludG8gVEZfTElURV9TVEFUSUNfTUVNT1JZIHdoZW4gVEZMTQogLy8gYnVpbGRzIHdpdGggdGhpcyBmbGFnIGJ5IGRlZmF1bHQgaW50ZXJuYWxseS4KIHR5cGVkZWYgc3RydWN0IFRmTGl0ZUV2YWxUZW5zb3IgewotICAvLyBBIHVuaW9uIG9mIGRhdGEgcG9pbnRlcnMuIFRoZSBhcHByb3ByaWF0ZSB0eXBlIHNob3VsZCBiZSB1c2VkIGZvciBhIHR5cGVkCi0gIC8vIHRlbnNvciBiYXNlZCBvbiBgdHlwZWAuCisgIC8vLyBBIHVuaW9uIG9mIGRhdGEgcG9pbnRlcnMuIFRoZSBhcHByb3ByaWF0ZSB0eXBlIHNob3VsZCBiZSB1c2VkIGZvciBhIHR5cGVkCisgIC8vLyB0ZW5zb3IgYmFzZWQgb24gYHR5cGVgLgogICBUZkxpdGVQdHJVbmlvbiBkYXRhOwogCi0gIC8vIEEgcG9pbnRlciB0byBhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIGRpbWVuc2lvbmFsaXR5IGludGVycHJldGF0aW9uCi0gIC8vIHRoYXQgdGhlIGJ1ZmZlciBzaG91bGQgaGF2ZS4KKyAgLy8vIEEgcG9pbnRlciB0byBhIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIGRpbWVuc2lvbmFsaXR5IGludGVycHJldGF0aW9uCisgIC8vLyB0aGF0IHRoZSBidWZmZXIgc2hvdWxkIGhhdmUuCiAgIFRmTGl0ZUludEFycmF5KiBkaW1zOwogCi0gIC8vIFRoZSBkYXRhIHR5cGUgc3BlY2lmaWNhdGlvbiBmb3IgZGF0YSBzdG9yZWQgaW4gYGRhdGFgLiBUaGlzIGFmZmVjdHMKLSAgLy8gd2hhdCBtZW1iZXIgb2YgYGRhdGFgIHVuaW9uIHNob3VsZCBiZSB1c2VkLgorICAvLy8gVGhlIGRhdGEgdHlwZSBzcGVjaWZpY2F0aW9uIGZvciBkYXRhIHN0b3JlZCBpbiBgZGF0YWAuIFRoaXMgYWZmZWN0cworICAvLy8gd2hhdCBtZW1iZXIgb2YgYGRhdGFgIHVuaW9uIHNob3VsZCBiZSB1c2VkLgogICBUZkxpdGVUeXBlIHR5cGU7CiB9IFRmTGl0ZUV2YWxUZW5zb3I7CiAKICNpZm5kZWYgVEZfTElURV9TVEFUSUNfTUVNT1JZCi0vLyBGcmVlIGRhdGEgbWVtb3J5IG9mIHRlbnNvciBgdGAuCisvLy8gRnJlZSBkYXRhIG1lbW9yeSBvZiB0ZW5zb3IgYHRgLgogdm9pZCBUZkxpdGVUZW5zb3JEYXRhRnJlZShUZkxpdGVUZW5zb3IqIHQpOwogCi0vLyBGcmVlIHF1YW50aXphdGlvbiBkYXRhLgorLy8vIEZyZWUgcXVhbnRpemF0aW9uIGRhdGEuCiB2b2lkIFRmTGl0ZVF1YW50aXphdGlvbkZyZWUoVGZMaXRlUXVhbnRpemF0aW9uKiBxdWFudGl6YXRpb24pOwogCi0vLyBGcmVlIHNwYXJzaXR5IHBhcmFtZXRlcnMuCisvLy8gRnJlZSBzcGFyc2l0eSBwYXJhbWV0ZXJzLgogdm9pZCBUZkxpdGVTcGFyc2l0eUZyZWUoVGZMaXRlU3BhcnNpdHkqIHNwYXJzaXR5KTsKIAotLy8gRnJlZSBtZW1vcnkgb2YgdGVuc29yIGB0YC4KKy8vLyBGcmVlIG1lbW9yeSBvZiB0ZW5zb3IgYHRgLgogdm9pZCBUZkxpdGVUZW5zb3JGcmVlKFRmTGl0ZVRlbnNvciogdCk7CiAKLS8vIFNldCBhbGwgb2YgYSB0ZW5zb3IncyBmaWVsZHMgKGFuZCBmcmVlIGFueSBwcmV2aW91c2x5IGFsbG9jYXRlZCBkYXRhKS4KKy8vLyBTZXQgYWxsIG9mIGEgdGVuc29yJ3MgZmllbGRzIChhbmQgZnJlZSBhbnkgcHJldmlvdXNseSBhbGxvY2F0ZWQgZGF0YSkuCiB2b2lkIFRmTGl0ZVRlbnNvclJlc2V0KFRmTGl0ZVR5cGUgdHlwZSwgY29uc3QgY2hhciogbmFtZSwgVGZMaXRlSW50QXJyYXkqIGRpbXMsCiAgICAgICAgICAgICAgICAgICAgICAgIFRmTGl0ZVF1YW50aXphdGlvblBhcmFtcyBxdWFudGl6YXRpb24sIGNoYXIqIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsIFRmTGl0ZUFsbG9jYXRpb25UeXBlIGFsbG9jYXRpb25fdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogYWxsb2NhdGlvbiwgYm9vbCBpc192YXJpYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgVGZMaXRlVGVuc29yKiB0ZW5zb3IpOwogCi0vLyBDb3BpZXMgdGhlIGNvbnRlbnRzIG9mICdzcmMnIGluICdkc3QnLgotLy8gRnVuY3Rpb24gZG9lcyBub3RoaW5nIGlmIGVpdGhlciAnc3JjJyBvciAnZHN0JyBpcyBwYXNzZWQgYXMgbnVsbHB0ciBhbmQKLS8vIHJldHVybiBrVGZMaXRlT2suCi0vLyBSZXR1cm5zIGtUZkxpdGVFcnJvciBpZiAnc3JjJyBhbmQgJ2RzdCcgZG9lc24ndCBoYXZlIG1hdGNoaW5nIGRhdGEgc2l6ZS4KLS8vIE5vdGUgZnVuY3Rpb24gY29waWVzIGNvbnRlbnRzLCBzbyBpdCB3b24ndCBjcmVhdGUgbmV3IGRhdGEgcG9pbnRlcgotLy8gb3IgY2hhbmdlIGFsbG9jYXRpb24gdHlwZS4KLS8vIEFsbCBUZW5zb3IgcmVsYXRlZCBwcm9wZXJ0aWVzIHdpbGwgYmUgY29waWVkIGZyb20gJ3NyYycgdG8gJ2RzdCcgbGlrZQotLy8gcXVhbnRpemF0aW9uLCBzcGFyc2l0eSwgLi4uCisvLy8gQ29waWVzIHRoZSBjb250ZW50cyBvZiBgc3JjYCBpbiBgZHN0YC4KKy8vLyBGdW5jdGlvbiBkb2VzIG5vdGhpbmcgaWYgZWl0aGVyIGBzcmNgIG9yIGBkc3RgIGlzIHBhc3NlZCBhcyBudWxscHRyIGFuZAorLy8vIHJldHVybiBga1RmTGl0ZU9rYC4KKy8vLyBSZXR1cm5zIGBrVGZMaXRlRXJyb3JgIGlmIGBzcmNgIGFuZCBgZHN0YCBkb2Vzbid0IGhhdmUgbWF0Y2hpbmcgZGF0YSBzaXplLgorLy8vIE5vdGUgZnVuY3Rpb24gY29waWVzIGNvbnRlbnRzLCBzbyBpdCB3b24ndCBjcmVhdGUgbmV3IGRhdGEgcG9pbnRlcgorLy8vIG9yIGNoYW5nZSBhbGxvY2F0aW9uIHR5cGUuCisvLy8gQWxsIFRlbnNvciByZWxhdGVkIHByb3BlcnRpZXMgd2lsbCBiZSBjb3BpZWQgZnJvbSBgc3JjYCB0byBgZHN0YCBsaWtlCisvLy8gcXVhbnRpemF0aW9uLCBzcGFyc2l0eSwgLi4uCiBUZkxpdGVTdGF0dXMgVGZMaXRlVGVuc29yQ29weShjb25zdCBUZkxpdGVUZW5zb3IqIHNyYywgVGZMaXRlVGVuc29yKiBkc3QpOwogCi0vLyBDaGFuZ2UgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSBibG9jayBvd25lZCBieSBgdGVuc29yYCB0byBgbnVtX2J5dGVzYC4KLS8vIFRlbnNvcnMgd2l0aCBhbGxvY2F0aW9uIHR5cGVzIG90aGVyIHRoYW4gYGtUZkxpdGVEeW5hbWljYCB3aWxsIGJlIGlnbm9yZWQgYW5kCi0vLyBhIGtUZkxpdGVPayB3aWxsIGJlIHJldHVybmVkLgotLy8gYHRlbnNvcmAncyBpbnRlcm5hbCBkYXRhIGJ1ZmZlciB3aWxsIGJlIGFzc2lnbmVkIGEgcG9pbnRlcgotLy8gd2hpY2ggY2FuIHNhZmVseSBiZSBwYXNzZWQgdG8gZnJlZSBvciByZWFsbG9jIGlmIGBudW1fYnl0ZXNgIGlzIHplcm8uCi0vLyBJZiBgcHJlc2VydmVfZGF0YWAgaXMgdHJ1ZSwgdGVuc29yIGRhdGEgd2lsbCBiZSB1bmNoYW5nZWQgaW4gdGhlIHJhbmdlIGZyb20KLS8vIHRoZSBzdGFydCBvZiB0aGUgcmVnaW9uIHVwIHRvIHRoZSBtaW5pbXVtIG9mIHRoZSBvbGQgYW5kIG5ldyBzaXplcy4gSW4gdGhlCi0vLyBjYXNlIG9mIE5VTEwgdGVuc29yLCBvciBhbiBlcnJvciBhbGxvY2F0aW5nIG5ldyBtZW1vcnksIHJldHVybnMKLS8vIGBrVGZMaXRlRXJyb3JgLgorLy8vIENoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGJsb2NrIG93bmVkIGJ5IGB0ZW5zb3JgIHRvIGBudW1fYnl0ZXNgLgorLy8vIFRlbnNvcnMgd2l0aCBhbGxvY2F0aW9uIHR5cGVzIG90aGVyIHRoYW4gYGtUZkxpdGVEeW5hbWljYCB3aWxsIGJlIGlnbm9yZWQKKy8vLyBhbmQgYSBga1RmTGl0ZU9rYCB3aWxsIGJlIHJldHVybmVkLiBgdGVuc29yYCdzIGludGVybmFsIGRhdGEgYnVmZmVyIHdpbGwgYmUKKy8vLyBhc3NpZ25lZCBhIHBvaW50ZXIgd2hpY2ggY2FuIHNhZmVseSBiZSBwYXNzZWQgdG8gZnJlZSBvciByZWFsbG9jIGlmCisvLy8gYG51bV9ieXRlc2AgaXMgemVyby4gSWYgYHByZXNlcnZlX2RhdGFgIGlzIHRydWUsIHRlbnNvciBkYXRhIHdpbGwgYmUKKy8vLyB1bmNoYW5nZWQgaW4gdGhlIHJhbmdlIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSByZWdpb24gdXAgdG8gdGhlIG1pbmltdW0gb2YgdGhlCisvLy8gb2xkIGFuZCBuZXcgc2l6ZXMuIEluIHRoZSBjYXNlIG9mIE5VTEwgdGVuc29yLCBvciBhbiBlcnJvciBhbGxvY2F0aW5nIG5ldworLy8vIG1lbW9yeSwgcmV0dXJucyBga1RmTGl0ZUVycm9yYC4KIFRmTGl0ZVN0YXR1cyBUZkxpdGVUZW5zb3JSZXNpemVNYXliZUNvcHkoc2l6ZV90IG51bV9ieXRlcywgVGZMaXRlVGVuc29yKiB0ZW5zb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJlc2VydmVfZGF0YSk7CiAKLS8vIENoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgbWVtb3J5IGJsb2NrIG93bmVkIGJ5IGB0ZW5zb3JgIHRvIGBudW1fYnl0ZXNgLgotLy8gVGVuc29ycyB3aXRoIGFsbG9jYXRpb24gdHlwZXMgb3RoZXIgdGhhbiBrVGZMaXRlRHluYW1pYyB3aWxsIGJlIGlnbm9yZWQgYW5kCi0vLyBhIGtUZkxpdGVPayB3aWxsIGJlIHJldHVybmVkLgotLy8gYHRlbnNvcmAncyBpbnRlcm5hbCBkYXRhIGJ1ZmZlciB3aWxsIGJlIGFzc2lnbmVkIGEgcG9pbnRlcgotLy8gd2hpY2ggY2FuIHNhZmVseSBiZSBwYXNzZWQgdG8gZnJlZSBvciByZWFsbG9jIGlmIGBudW1fYnl0ZXNgIGlzIHplcm8uCi0vLyBUZW5zb3IgZGF0YSB3aWxsIGJlIHVuY2hhbmdlZCBpbiB0aGUgcmFuZ2UgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHJlZ2lvbiB1cCB0bwotLy8gdGhlIG1pbmltdW0gb2YgdGhlIG9sZCBhbmQgbmV3IHNpemVzLiBJbiB0aGUgY2FzZQotLy8gb2YgTlVMTCB0ZW5zb3IsIG9yIGFuIGVycm9yIGFsbG9jYXRpbmcgbmV3IG1lbW9yeSwgcmV0dXJucyBga1RmTGl0ZUVycm9yYC4KKy8vLyBDaGFuZ2UgdGhlIHNpemUgb2YgdGhlIG1lbW9yeSBibG9jayBvd25lZCBieSBgdGVuc29yYCB0byBgbnVtX2J5dGVzYC4KKy8vLyBUZW5zb3JzIHdpdGggYWxsb2NhdGlvbiB0eXBlcyBvdGhlciB0aGFuIGBrVGZMaXRlRHluYW1pY2Agd2lsbCBiZSBpZ25vcmVkCisvLy8gYW5kIGEgYGtUZkxpdGVPa2Agd2lsbCBiZSByZXR1cm5lZC4gYHRlbnNvcmAncyBpbnRlcm5hbCBkYXRhIGJ1ZmZlciB3aWxsIGJlCisvLy8gYXNzaWduZWQgYSBwb2ludGVyIHdoaWNoIGNhbiBzYWZlbHkgYmUgcGFzc2VkIHRvIGZyZWUgb3IgcmVhbGxvYyBpZgorLy8vIGBudW1fYnl0ZXNgIGlzIHplcm8uIFRlbnNvciBkYXRhIHdpbGwgYmUgdW5jaGFuZ2VkIGluIHRoZSByYW5nZSBmcm9tIHRoZQorLy8vIHN0YXJ0IG9mIHRoZSByZWdpb24gdXAgdG8gdGhlIG1pbmltdW0gb2YgdGhlIG9sZCBhbmQgbmV3IHNpemVzLiBJbiB0aGUgY2FzZQorLy8vIG9mIE5VTEwgdGVuc29yLCBvciBhbiBlcnJvciBhbGxvY2F0aW5nIG5ldyBtZW1vcnksIHJldHVybnMgYGtUZkxpdGVFcnJvcmAuCiBUZkxpdGVTdGF0dXMgVGZMaXRlVGVuc29yUmVhbGxvYyhzaXplX3QgbnVtX2J5dGVzLCBUZkxpdGVUZW5zb3IqIHRlbnNvcik7CiAjZW5kaWYgIC8vIFRGX0xJVEVfU1RBVElDX01FTU9SWQogCi0vLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBpbnRlcmZhY2UgdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KLS8vCi0vLyBDdXJyZW50bHksIFRmTGl0ZURlbGVnYXRlUGFyYW1zIGhhcyB0byBiZSBhbGxvY2F0ZWQgaW4gYSB3YXkgdGhhdCBpdCdzCi0vLyB0cml2aWFsbHkgZGVzdHJ1Y3RhYmxlLiBJdCB3aWxsIGJlIHN0b3JlZCBhcyBgYnVpbHRpbl9kYXRhYCBmaWVsZCBpbgotLy8gYFRmTGl0ZU5vZGVgIG9mIHRoZSBkZWxlZ2F0ZSBub2RlLgotLy8KLS8vIFNlZSBhbHNvIHRoZSBgQ3JlYXRlRGVsZWdhdGVQYXJhbXNgIGZ1bmN0aW9uIGluIGBpbnRlcnByZXRlci5jY2AgZGV0YWlscy4KKy8vLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBpbnRlcmZhY2UgdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KKy8vLworLy8vIEN1cnJlbnRseSwgVGZMaXRlRGVsZWdhdGVQYXJhbXMgaGFzIHRvIGJlIGFsbG9jYXRlZCBpbiBhIHdheSB0aGF0IGl0J3MKKy8vLyB0cml2aWFsbHkgZGVzdHJ1Y3RhYmxlLiBJdCB3aWxsIGJlIHN0b3JlZCBhcyBgYnVpbHRpbl9kYXRhYCBmaWVsZCBpbgorLy8vIGBUZkxpdGVOb2RlYCBvZiB0aGUgZGVsZWdhdGUgbm9kZS4KKy8vLworLy8vIFNlZSBhbHNvIHRoZSBgQ3JlYXRlRGVsZWdhdGVQYXJhbXNgIGZ1bmN0aW9uIGluIGBpbnRlcnByZXRlci5jY2AgZGV0YWlscy4KIHR5cGVkZWYgc3RydWN0IFRmTGl0ZURlbGVnYXRlUGFyYW1zIHsKICAgc3RydWN0IFRmTGl0ZURlbGVnYXRlKiBkZWxlZ2F0ZTsKICAgVGZMaXRlSW50QXJyYXkqIG5vZGVzX3RvX3JlcGxhY2U7CkBAIC02OTMsMTQgKzc2MSwxNCBAQAogICBUZkxpdGVJbnRBcnJheSogb3V0cHV0X3RlbnNvcnM7CiB9IFRmTGl0ZURlbGVnYXRlUGFyYW1zOwogCi0vLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBpbnRlcmZhY2UgdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KLS8vCi0vLyBDdXJyZW50bHksIFRmTGl0ZU9wYXF1ZURlbGVnYXRlUGFyYW1zIGhhcyB0byBiZSBhbGxvY2F0ZWQgaW4gYSB3YXkgdGhhdCBpdCdzCi0vLyB0cml2aWFsbHkgZGVzdHJ1Y3RhYmxlLiBJdCB3aWxsIGJlIHN0b3JlZCBhcyBgYnVpbHRpbl9kYXRhYCBmaWVsZCBpbgotLy8gYFRmTGl0ZU5vZGVgIG9mIHRoZSBkZWxlZ2F0ZSBub2RlLgotLy8KLS8vIFNlZSBhbHNvIHRoZSBgQ3JlYXRlT3BhcXVlRGVsZWdhdGVQYXJhbXNgIGZ1bmN0aW9uIGluIGBzdWJncmFwaC5jY2AKLS8vIGRldGFpbHMuCisvLy8gV0FSTklORzogVGhpcyBpcyBhbiBleHBlcmltZW50YWwgaW50ZXJmYWNlIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCisvLy8KKy8vLyBDdXJyZW50bHksIFRmTGl0ZU9wYXF1ZURlbGVnYXRlUGFyYW1zIGhhcyB0byBiZSBhbGxvY2F0ZWQgaW4gYSB3YXkgdGhhdCBpdCdzCisvLy8gdHJpdmlhbGx5IGRlc3RydWN0YWJsZS4gSXQgd2lsbCBiZSBzdG9yZWQgYXMgYGJ1aWx0aW5fZGF0YWAgZmllbGQgaW4KKy8vLyBgVGZMaXRlTm9kZWAgb2YgdGhlIGRlbGVnYXRlIG5vZGUuCisvLy8KKy8vLyBTZWUgYWxzbyB0aGUgYENyZWF0ZU9wYXF1ZURlbGVnYXRlUGFyYW1zYCBmdW5jdGlvbiBpbiBgc3ViZ3JhcGguY2NgCisvLy8gZGV0YWlscy4KIHR5cGVkZWYgc3RydWN0IFRmTGl0ZU9wYXF1ZURlbGVnYXRlUGFyYW1zIHsKICAgVGZMaXRlT3BhcXVlRGVsZWdhdGUqIGRlbGVnYXRlOwogICB2b2lkKiBkZWxlZ2F0ZV9kYXRhOwpAQCAtNzA5LDM3MSArNzc3LDQzMCBAQAogICBUZkxpdGVJbnRBcnJheSogb3V0cHV0X3RlbnNvcnM7CiB9IFRmTGl0ZU9wYXF1ZURlbGVnYXRlUGFyYW1zOwogCisvLy8gYFRmTGl0ZUNvbnRleHRgIGFsbG93cyBhbiBvcCB0byBhY2Nlc3MgdGhlIHRlbnNvcnMuCisvLy8KKy8vLyBgVGZMaXRlQ29udGV4dGAgaXMgYSBzdHJ1Y3QgdGhhdCBpcyBjcmVhdGVkIGJ5IHRoZSBURiBMaXRlIHJ1bnRpbWUKKy8vLyBhbmQgcGFzc2VkIHRvIHRoZSAibWV0aG9kcyIgKEMgZnVuY3Rpb24gcG9pbnRlcnMpIGluIHRoZQorLy8vIGBUZkxpdGVSZWdpc3RyYXRpb25gIHN0cnVjdCB0aGF0IGFyZSB1c2VkIHRvIGRlZmluZSBjdXN0b20gb3BzIGFuZCBjdXN0b20KKy8vLyBkZWxlZ2F0ZSBrZXJuZWxzLiBJdCBjb250YWlucyBpbmZvcm1hdGlvbiBhbmQgbWV0aG9kcyAoQyBmdW5jdGlvbiBwb2ludGVycykKKy8vLyB0aGF0IGNhbiBiZSBjYWxsZWQgYnkgdGhlIGNvZGUgaW1wbGVtZW50aW5nIGEgY3VzdG9tIG9wIG9yIGEgY3VzdG9tIGRlbGVnYXRlCisvLy8ga2VybmVsLiBUaGVzZSBtZXRob2RzIHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBjb250ZXh0IGluIHdoaWNoIHRoYXQgY3VzdG9tIG9wCisvLy8gb3IgY3VzdG9tIGRlbGVnYXRlIGtlcm5lbCBvY2N1cnMsIHN1Y2ggYXMgYWNjZXNzIHRvIHRoZSBpbnB1dCBhbmQgb3V0cHV0CisvLy8gdGVuc29ycyBmb3IgdGhhdCBvcCwgYXMgd2VsbCBhcyBtZXRob2RzIGZvciBhbGxvY2F0aW5nIG1lbW9yeSBidWZmZXJzCisvLy8gYW5kIGludGVybWVkaWF0ZSB0ZW5zb3JzLCBldGMuCisvLy8KKy8vLyBTZWUgYWxzbyBgVGZMaXRlT3BhcXVlQ29udGV4dGAsIHdoaWNoIGlzIGFuIG1vcmUgQUJJLXN0YWJsZSBlcXVpdmFsZW50LgogdHlwZWRlZiBzdHJ1Y3QgVGZMaXRlQ29udGV4dCB7Ci0gIC8vIE51bWJlciBvZiB0ZW5zb3JzIGluIHRoZSBjb250ZXh0LgorICAvLy8gTnVtYmVyIG9mIHRlbnNvcnMgaW4gdGhlIGNvbnRleHQuCiAgIHNpemVfdCB0ZW5zb3JzX3NpemU7CiAKLSAgLy8gVGhlIGV4ZWN1dGlvbiBwbGFuIGNvbnRhaW5zIGEgbGlzdCBvZiB0aGUgbm9kZSBpbmRpY2VzIGluIGV4ZWN1dGlvbgotICAvLyBvcmRlci4gZXhlY3V0aW9uX3BsYW4tPnNpemUgaXMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIG5vZGVzLiBBbmQsCi0gIC8vIGV4ZWN1dGlvbl9wbGFuLT5kYXRhWzBdIGlzIHRoZSBmaXJzdCBub2RlIHRoYXQgbmVlZHMgdG8gYmUgcnVuLgotICAvLyBUZkxpdGVEZWxlZ2F0ZXMgY2FuIHRyYXZlcnNlIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBwbGFuIGJ5IGl0ZXJhdGluZwotICAvLyB0aHJvdWdoIGVhY2ggbWVtYmVyIG9mIHRoaXMgYXJyYXkgYW5kIHVzaW5nIEdldE5vZGVBbmRSZWdpc3RyYXRpb24oKSB0bwotICAvLyBhY2Nlc3MgZGV0YWlscyBhYm91dCBhIG5vZGUuIGkuZS4KLSAgLy8KLSAgLy8gVGZMaXRlSW50QXJyYXkqIGV4ZWN1dGlvbl9wbGFuOwotICAvLyBURl9MSVRFX0VOU1VSRV9TVEFUVVMoY29udGV4dC0+R2V0RXhlY3V0aW9uUGxhbihjb250ZXh0LCAmZXhlY3V0aW9uX3BsYW4pKTsKLSAgLy8gZm9yIChpbnQgZXhlY19pbmRleCA9IDA7IGV4ZWNfaW5kZXggPCBleGVjdXRpb25fcGxhbi0+c2l6ZTsgZXhlY19pbmRleCsrKSB7Ci0gIC8vICAgIGludCBub2RlX2luZGV4ID0gZXhlY3V0aW9uX3BsYW4tPmRhdGFbZXhlY19pbmRleF07Ci0gIC8vICAgIFRmTGl0ZU5vZGUqIG5vZGU7Ci0gIC8vICAgIFRmTGl0ZVJlZ2lzdHJhdGlvbiogcmVnOwotICAvLyAgICBjb250ZXh0LT5HZXROb2RlQW5kUmVnaXN0cmF0aW9uKGNvbnRleHQsIG5vZGVfaW5kZXgsICZub2RlLCAmcmVnKTsKLSAgLy8gfQotICAvLyBOb3RlOiB0aGUgbWVtb3J5IHBvaW50ZWQgYnkgJ2AqZXhlY3V0aW9uX3BsYW5gIGlzIE9XTkVEIGJ5IFRmTGl0ZSBydW50aW1lLgotICAvLyBGdXR1cmUgY2FsbHMgdG8gR2V0RXhlY3V0aW9uUGxhbiBpbnZhbGlkYXRlcyBlYXJsaWVyIG91dHB1dHMuIFRoZSBmb2xsb3dpbmcKLSAgLy8gY29kZSBzbmlwcGV0IHNob3dzIHRoZSBpc3N1ZSBvZiBzdWNoIGFuIGludm9jYXRpb24gcGF0dGVybi4gQWZ0ZXIgY2FsbGluZwotICAvLyBDaGVja05vZGUsIHN1YnNlcXVlbnQgYWNjZXNzIHRvIGBwbGFuXzFzdGAgaXMgdW5kZWZpbmVkLgotICAvLwotICAvLyB2b2lkIENoZWNrTm9kZShjb25zdCBUZkxpdGVOb2RlKiBub2RlKSB7Ci0gIC8vICAgLi4uCi0gIC8vICAgVGZMaXRlSW50QXJyYXkqIHBsYW5fMm5kOwotICAvLyAgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhjb250ZXh0LT5HZXRFeGVjdXRpb25QbGFuKGNvbnRleHQsICZwbGFuXzJuZCkpOwotICAvLyAgIC4uLgotICAvLyB9Ci0gIC8vCi0gIC8vIFRmTGl0ZUludEFycmF5KiBwbGFuXzFzdDsKLSAgLy8gVEZfTElURV9FTlNVUkVfU1RBVFVTKGNvbnRleHQtPkdldEV4ZWN1dGlvblBsYW4oY29udGV4dCwgJnBsYW5fMXN0KSk7Ci0gIC8vIGZvciAoaW50IGV4ZWNfaW5kZXggPSAwOyBleGVjX2luZGV4IDwgcGxhbl8xc3QtPnNpemU7IGV4ZWNfaW5kZXgrKykgewotICAvLyAgICBpbnQgbm9kZV9pbmRleCA9IHBsYW5fMXN0LT5kYXRhW2V4ZWNfaW5kZXhdOwotICAvLyAgICBUZkxpdGVOb2RlKiBub2RlOwotICAvLyAgICBUZkxpdGVSZWdpc3RyYXRpb24qIHJlZzsKLSAgLy8gICAgY29udGV4dC0+R2V0Tm9kZUFuZFJlZ2lzdHJhdGlvbihjb250ZXh0LCBub2RlX2luZGV4LCAmbm9kZSwgJnJlZyk7Ci0gIC8vICAgIENoZWNrTm9kZShub2RlKTsKLSAgLy8gfQotICAvLwotICAvLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBpbnRlcmZhY2UgdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KKyAgLy8vIFRoZSBleGVjdXRpb24gcGxhbiBjb250YWlucyBhIGxpc3Qgb2YgdGhlIG5vZGUgaW5kaWNlcyBpbiBleGVjdXRpb24KKyAgLy8vIG9yZGVyLiBleGVjdXRpb25fcGxhbi0+c2l6ZSBpcyB0aGUgY3VycmVudCBudW1iZXIgb2Ygbm9kZXMuIEFuZCwKKyAgLy8vIGV4ZWN1dGlvbl9wbGFuLT5kYXRhWzBdIGlzIHRoZSBmaXJzdCBub2RlIHRoYXQgbmVlZHMgdG8gYmUgcnVuLgorICAvLy8gVGZMaXRlRGVsZWdhdGVzIGNhbiB0cmF2ZXJzZSB0aGUgY3VycmVudCBleGVjdXRpb24gcGxhbiBieSBpdGVyYXRpbmcKKyAgLy8vIHRocm91Z2ggZWFjaCBtZW1iZXIgb2YgdGhpcyBhcnJheSBhbmQgdXNpbmcgR2V0Tm9kZUFuZFJlZ2lzdHJhdGlvbigpIHRvCisgIC8vLyBhY2Nlc3MgZGV0YWlscyBhYm91dCBhIG5vZGUuIGkuZS4KKyAgLy8vCisgIC8vLworICAvLy8gICAgIFRmTGl0ZUludEFycmF5KiBleGVjdXRpb25fcGxhbjsKKyAgLy8vICAgICBURl9MSVRFX0VOU1VSRV9TVEFUVVMoY29udGV4dC0+R2V0RXhlY3V0aW9uUGxhbihjb250ZXh0LAorICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleGVjdXRpb25fcGxhbikpOworICAvLy8gICAgIGZvciAoaW50IGV4ZWNfaW5kZXggPSAwOyBleGVjX2luZGV4IDwgZXhlY3V0aW9uX3BsYW4tPnNpemU7CisgIC8vLyAgICAgICAgICAgZXhlY19pbmRleCsrKSB7CisgIC8vLyAgICAgICAgaW50IG5vZGVfaW5kZXggPSBleGVjdXRpb25fcGxhbi0+ZGF0YVtleGVjX2luZGV4XTsKKyAgLy8vICAgICAgICBUZkxpdGVOb2RlKiBub2RlOworICAvLy8gICAgICAgIFRmTGl0ZVJlZ2lzdHJhdGlvbiogcmVnOworICAvLy8gICAgICAgIGNvbnRleHQtPkdldE5vZGVBbmRSZWdpc3RyYXRpb24oY29udGV4dCwgbm9kZV9pbmRleCwgJm5vZGUsICZyZWcpOworICAvLy8gICAgIH0KKyAgLy8vCisgIC8vLyBOb3RlOiB0aGUgbWVtb3J5IHBvaW50ZWQgYnkgJ2AqZXhlY3V0aW9uX3BsYW5gIGlzIE9XTkVEIGJ5IFRmTGl0ZSBydW50aW1lLgorICAvLy8gRnV0dXJlIGNhbGxzIHRvIEdldEV4ZWN1dGlvblBsYW4gaW52YWxpZGF0ZXMgZWFybGllciBvdXRwdXRzLiBUaGUKKyAgLy8vIGZvbGxvd2luZyBjb2RlIHNuaXBwZXQgc2hvd3MgdGhlIGlzc3VlIG9mIHN1Y2ggYW4gaW52b2NhdGlvbiBwYXR0ZXJuLgorICAvLy8gQWZ0ZXIgY2FsbGluZyBDaGVja05vZGUsIHN1YnNlcXVlbnQgYWNjZXNzIHRvIGBwbGFuXzFzdGAgaXMgdW5kZWZpbmVkLgorICAvLy8KKyAgLy8vICAgICB2b2lkIENoZWNrTm9kZShjb25zdCBUZkxpdGVOb2RlKiBub2RlKSB7CisgIC8vLyAgICAgICAuLi4KKyAgLy8vICAgICAgIFRmTGl0ZUludEFycmF5KiBwbGFuXzJuZDsKKyAgLy8vICAgICAgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUygKKyAgLy8vICAgICAgICAgICBjb250ZXh0LT5HZXRFeGVjdXRpb25QbGFuKGNvbnRleHQsICZwbGFuXzJuZCkKKyAgLy8vICAgICAgICk7CisgIC8vLyAgICAgICAuLi4KKyAgLy8vICAgICB9CisgIC8vLworICAvLy8gICAgIFRmTGl0ZUludEFycmF5KiBwbGFuXzFzdDsKKyAgLy8vICAgICBURl9MSVRFX0VOU1VSRV9TVEFUVVMoY29udGV4dC0+R2V0RXhlY3V0aW9uUGxhbihjb250ZXh0LCAmcGxhbl8xc3QpKTsKKyAgLy8vICAgICBmb3IgKGludCBleGVjX2luZGV4ID0gMDsgZXhlY19pbmRleCA8IHBsYW5fMXN0LT5zaXplOyBleGVjX2luZGV4KyspIHsKKyAgLy8vICAgICAgICBpbnQgbm9kZV9pbmRleCA9IHBsYW5fMXN0LT5kYXRhW2V4ZWNfaW5kZXhdOworICAvLy8gICAgICAgIFRmTGl0ZU5vZGUqIG5vZGU7CisgIC8vLyAgICAgICAgVGZMaXRlUmVnaXN0cmF0aW9uKiByZWc7CisgIC8vLyAgICAgICAgY29udGV4dC0+R2V0Tm9kZUFuZFJlZ2lzdHJhdGlvbihjb250ZXh0LCBub2RlX2luZGV4LCAmbm9kZSwgJnJlZyk7CisgIC8vLyAgICAgICAgQ2hlY2tOb2RlKG5vZGUpOworICAvLy8gICAgIH0KKyAgLy8vCisgIC8vLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBpbnRlcmZhY2UgdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KICAgVGZMaXRlU3RhdHVzICgqR2V0RXhlY3V0aW9uUGxhbikoc3RydWN0IFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRmTGl0ZUludEFycmF5KiogZXhlY3V0aW9uX3BsYW4pOwogCi0gIC8vIEFuIGFycmF5IG9mIHRlbnNvcnMgaW4gdGhlIGludGVycHJldGVyIGNvbnRleHQgKG9mIGxlbmd0aCBgdGVuc29yc19zaXplYCkKKyAgLy8vIEFuIGFycmF5IG9mIHRlbnNvcnMgaW4gdGhlIGludGVycHJldGVyIGNvbnRleHQgKG9mIGxlbmd0aCBgdGVuc29yc19zaXplYCkKICAgVGZMaXRlVGVuc29yKiB0ZW5zb3JzOwogCi0gIC8vIG9wYXF1ZSBmdWxsIGNvbnRleHQgcHRyIChhbiBvcGFxdWUgYysrIGRhdGEgc3RydWN0dXJlKQorICAvLy8gb3BhcXVlIGZ1bGwgY29udGV4dCBwdHIgKGFuIG9wYXF1ZSBjKysgZGF0YSBzdHJ1Y3R1cmUpCiAgIHZvaWQqIGltcGxfOwogCi0gIC8vIFJlcXVlc3QgbWVtb3J5IHBvaW50ZXIgYmUgcmVzaXplZC4gVXBkYXRlcyBkaW1lbnNpb25zIG9uIHRoZSB0ZW5zb3IuCi0gIC8vIE5PVEU6IFJlc2l6ZVRlbnNvciB0YWtlcyBvd25lcnNoaXAgb2YgbmV3U2l6ZS4KKyAgLy8vIFJlcXVlc3QgbWVtb3J5IHBvaW50ZXIgYmUgcmVzaXplZC4gVXBkYXRlcyBkaW1lbnNpb25zIG9uIHRoZSB0ZW5zb3IuCisgIC8vLyBOT1RFOiBSZXNpemVUZW5zb3IgdGFrZXMgb3duZXJzaGlwIG9mIG5ld1NpemUuCiAgIFRmTGl0ZVN0YXR1cyAoKlJlc2l6ZVRlbnNvcikoc3RydWN0IFRmTGl0ZUNvbnRleHQqLCBUZkxpdGVUZW5zb3IqIHRlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZkxpdGVJbnRBcnJheSogbmV3X3NpemUpOwotICAvLyBSZXF1ZXN0IHRoYXQgYW4gZXJyb3IgYmUgcmVwb3J0ZWQgd2l0aCBmb3JtYXQgc3RyaW5nIG1zZy4KKyAgLy8vIFJlcXVlc3QgdGhhdCBhbiBlcnJvciBiZSByZXBvcnRlZCB3aXRoIGZvcm1hdCBzdHJpbmcgbXNnLgogICB2b2lkICgqUmVwb3J0RXJyb3IpKHN0cnVjdCBUZkxpdGVDb250ZXh0KiwgY29uc3QgY2hhciogbXNnLCAuLi4pOwogCi0gIC8vIEFkZCBgdGVuc29yc190b19hZGRgIHRlbnNvcnMsIHByZXNlcnZpbmcgcHJlLWV4aXN0aW5nIFRlbnNvciBlbnRyaWVzLiAgSWYKLSAgLy8gbm9uLW51bGwsIHRoZSB2YWx1ZSBwb2ludGVkIHRvIGJ5IGBmaXJzdF9uZXdfdGVuc29yX2luZGV4YCB3aWxsIGJlIHNldCB0bwotICAvLyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG5ldyB0ZW5zb3IuCisgIC8vLyBBZGQgYHRlbnNvcnNfdG9fYWRkYCB0ZW5zb3JzLCBwcmVzZXJ2aW5nIHByZS1leGlzdGluZyBUZW5zb3IgZW50cmllcy4gIElmCisgIC8vLyBub24tbnVsbCwgdGhlIHZhbHVlIHBvaW50ZWQgdG8gYnkgYGZpcnN0X25ld190ZW5zb3JfaW5kZXhgIHdpbGwgYmUgc2V0IHRvCisgIC8vLyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG5ldyB0ZW5zb3IuCiAgIFRmTGl0ZVN0YXR1cyAoKkFkZFRlbnNvcnMpKHN0cnVjdCBUZkxpdGVDb250ZXh0KiwgaW50IHRlbnNvcnNfdG9fYWRkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGZpcnN0X25ld190ZW5zb3JfaW5kZXgpOwogCi0gIC8vIEdldCBhIFRlbnNvciBub2RlIGJ5IG5vZGVfaW5kZXguCi0gIC8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGludGVyZmFjZSB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgorICAvLy8gR2V0IGEgVGVuc29yIG5vZGUgYnkgbm9kZV9pbmRleC4KKyAgLy8vCisgIC8vLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBpbnRlcmZhY2UgdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KICAgVGZMaXRlU3RhdHVzICgqR2V0Tm9kZUFuZFJlZ2lzdHJhdGlvbikoCiAgICAgICBzdHJ1Y3QgVGZMaXRlQ29udGV4dCosIGludCBub2RlX2luZGV4LCBUZkxpdGVOb2RlKiogbm9kZSwKICAgICAgIHN0cnVjdCBUZkxpdGVSZWdpc3RyYXRpb24qKiByZWdpc3RyYXRpb24pOwogCi0gIC8vIFJlcGxhY2Ugb3BzIHdpdGggb25lIG9yIG1vcmUgc3R1YiBkZWxlZ2F0ZSBvcGVyYXRpb25zLiBUaGlzIGZ1bmN0aW9uCi0gIC8vIGRvZXMgbm90IHRha2Ugb3duZXJzaGlwIG9mIGBub2Rlc190b19yZXBsYWNlYC4KKyAgLy8vIFJlcGxhY2Ugb3BzIHdpdGggb25lIG9yIG1vcmUgc3R1YiBkZWxlZ2F0ZSBvcGVyYXRpb25zLiBUaGlzIGZ1bmN0aW9uCisgIC8vLyBkb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiBgbm9kZXNfdG9fcmVwbGFjZWAuCiAgIFRmTGl0ZVN0YXR1cyAoKlJlcGxhY2VOb2RlU3Vic2V0c1dpdGhEZWxlZ2F0ZUtlcm5lbHMpKAogICAgICAgc3RydWN0IFRmTGl0ZUNvbnRleHQqLCBzdHJ1Y3QgVGZMaXRlUmVnaXN0cmF0aW9uIHJlZ2lzdHJhdGlvbiwKICAgICAgIGNvbnN0IFRmTGl0ZUludEFycmF5KiBub2Rlc190b19yZXBsYWNlLCBzdHJ1Y3QgVGZMaXRlRGVsZWdhdGUqIGRlbGVnYXRlKTsKIAotICAvLyBOdW1iZXIgb2YgdGhyZWFkcyB0aGF0IGFyZSByZWNvbW1lbmRlZCB0byBzdWJzeXN0ZW1zIGxpa2UgZ2VtbWxvd3AgYW5kCi0gIC8vIGVpZ2VuLgorICAvLy8gTnVtYmVyIG9mIHRocmVhZHMgdGhhdCBhcmUgcmVjb21tZW5kZWQgdG8gc3Vic3lzdGVtcyBsaWtlIGdlbW1sb3dwIGFuZAorICAvLy8gZWlnZW4uCiAgIGludCByZWNvbW1lbmRlZF9udW1fdGhyZWFkczsKIAotICAvLyBBY2Nlc3MgZXh0ZXJuYWwgY29udGV4dHMgYnkgdHlwZS4KLSAgLy8gV0FSTklORzogVGhpcyBpcyBhbiBleHBlcmltZW50YWwgaW50ZXJmYWNlIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCisgIC8vLyBBY2Nlc3MgZXh0ZXJuYWwgY29udGV4dHMgYnkgdHlwZS4KKyAgLy8vCisgIC8vLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBpbnRlcmZhY2UgdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KICAgVGZMaXRlRXh0ZXJuYWxDb250ZXh0KiAoKkdldEV4dGVybmFsQ29udGV4dCkoc3RydWN0IFRmTGl0ZUNvbnRleHQqLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZkxpdGVFeHRlcm5hbENvbnRleHRUeXBlKTsKLSAgLy8gU2V0IHRoZSB2YWx1ZSBvZiBhIGV4dGVybmFsIGNvbnRleHQuIERvZXMgbm90IHRha2Ugb3duZXJzaGlwIG9mIHRoZQotICAvLyBwb2ludGVyLgotICAvLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBpbnRlcmZhY2UgdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KKyAgLy8vIFNldCB0aGUgdmFsdWUgb2YgYSBleHRlcm5hbCBjb250ZXh0LiBEb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiB0aGUKKyAgLy8vIHBvaW50ZXIuCisgIC8vLworICAvLy8gV0FSTklORzogVGhpcyBpcyBhbiBleHBlcmltZW50YWwgaW50ZXJmYWNlIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCiAgIHZvaWQgKCpTZXRFeHRlcm5hbENvbnRleHQpKHN0cnVjdCBUZkxpdGVDb250ZXh0KiwgVGZMaXRlRXh0ZXJuYWxDb250ZXh0VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGZMaXRlRXh0ZXJuYWxDb250ZXh0Kik7CiAKLSAgLy8gRmxhZyBmb3IgYWxsb3dpbmcgZmxvYXQxNiBwcmVjaXNpb24gZm9yIEZQMzIgY2FsY3VsYXRpb24uCi0gIC8vIGRlZmF1bHQ6IGZhbHNlLgotICAvLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBBUEkgYW5kIHN1YmplY3QgdG8gY2hhbmdlLgorICAvLy8gRmxhZyBmb3IgYWxsb3dpbmcgZmxvYXQxNiBwcmVjaXNpb24gZm9yIEZQMzIgY2FsY3VsYXRpb24uCisgIC8vLyBkZWZhdWx0OiBmYWxzZS4KKyAgLy8vCisgIC8vLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBBUEkgYW5kIHN1YmplY3QgdG8gY2hhbmdlLgogICBib29sIGFsbG93X2ZwMzJfcmVsYXhfdG9fZnAxNjsKIAotICAvLyBQb2ludGVyIHRvIHRoZSBvcC1sZXZlbCBwcm9maWxlciwgaWYgc2V0OyBudWxscHRyIG90aGVyd2lzZS4KKyAgLy8vIFBvaW50ZXIgdG8gdGhlIG9wLWxldmVsIHByb2ZpbGVyLCBpZiBzZXQ7IG51bGxwdHIgb3RoZXJ3aXNlLgogICB2b2lkKiBwcm9maWxlcjsKIAotICAvLyBBbGxvY2F0ZSBwZXJzaXN0ZW50IGJ1ZmZlciB3aGljaCBoYXMgdGhlIHNhbWUgbGlmZSB0aW1lIGFzIHRoZSBpbnRlcnByZXRlci4KLSAgLy8gUmV0dXJucyBudWxscHRyIG9uIGZhaWx1cmUuCi0gIC8vIFRoZSBtZW1vcnkgaXMgYWxsb2NhdGVkIGZyb20gaGVhcCBmb3IgVEZMLCBhbmQgZnJvbSB0YWlsIGluIFRGTE0uCi0gIC8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgYXZhaWxhYmxlIGluIEluaXQgb3IgUHJlcGFyZSBzdGFnZS4KLSAgLy8gV0FSTklORzogVGhpcyBpcyBhbiBleHBlcmltZW50YWwgaW50ZXJmYWNlIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCisgIC8vLyBBbGxvY2F0ZSBwZXJzaXN0ZW50IGJ1ZmZlciB3aGljaCBoYXMgdGhlIHNhbWUgbGlmZSB0aW1lIGFzIHRoZQorICAvLy8gaW50ZXJwcmV0ZXIuIFJldHVybnMgYG51bGxwdHJgIG9uIGZhaWx1cmUuIFRoZSBtZW1vcnkgaXMgYWxsb2NhdGVkIGZyb20KKyAgLy8vIGhlYXAgZm9yIFRGTCwgYW5kIGZyb20gdGFpbCBpbiBURkxNLiBUaGlzIG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBpbgorICAvLy8gYEluaXRgIG9yIGBQcmVwYXJlYCBzdGFnZS4KKyAgLy8vCisgIC8vLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBpbnRlcmZhY2UgdGhhdCBpcyBzdWJqZWN0CisgIC8vLyB0byBjaGFuZ2UuCiAgIHZvaWQqICgqQWxsb2NhdGVQZXJzaXN0ZW50QnVmZmVyKShzdHJ1Y3QgVGZMaXRlQ29udGV4dCogY3R4LCBzaXplX3QgYnl0ZXMpOwogCi0gIC8vIEFsbG9jYXRlIGEgYnVmZmVyIHdoaWNoIHdpbGwgYmUgZGVhbGxvY2F0ZWQgcmlnaHQgYWZ0ZXIgaW52b2tlIHBoYXNlLgotICAvLyBUaGUgbWVtb3J5IGlzIGFsbG9jYXRlZCBmcm9tIGhlYXAgaW4gVEZMLCBhbmQgZnJvbSB2b2xhdGlsZSBhcmVuYSBpbiBURkxNLgotICAvLyBUaGlzIG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBpbnZva2Ugc3RhZ2UuCi0gIC8vIE5PVEU6IElmIHBvc3NpYmxlIHVzZSBSZXF1ZXN0U2NyYXRjaEJ1ZmZlckluQXJlbmEgbWV0aG9kIHRvIGF2b2lkIG1lbW9yeQotICAvLyBhbGxvY2F0aW9uIGR1cmluZyBpbmZlcmVuY2UgdGltZS4KLSAgLy8gV0FSTklORzogVGhpcyBpcyBhbiBleHBlcmltZW50YWwgaW50ZXJmYWNlIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCisgIC8vLyBBbGxvY2F0ZSBhIGJ1ZmZlciB3aGljaCB3aWxsIGJlIGRlYWxsb2NhdGVkIHJpZ2h0IGFmdGVyIGludm9rZSBwaGFzZS4KKyAgLy8vIFRoZSBtZW1vcnkgaXMgYWxsb2NhdGVkIGZyb20gaGVhcCBpbiBURkwsIGFuZCBmcm9tIHZvbGF0aWxlIGFyZW5hIGluIFRGTE0uCisgIC8vLyBUaGlzIG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBpbnZva2Ugc3RhZ2UuCisgIC8vLworICAvLy8gTk9URTogSWYgcG9zc2libGUgdXNlIGBSZXF1ZXN0U2NyYXRjaEJ1ZmZlckluQXJlbmFgIG1ldGhvZCB0byBhdm9pZCBtZW1vcnkKKyAgLy8vIGFsbG9jYXRpb24gZHVyaW5nIGluZmVyZW5jZSB0aW1lLgorICAvLy8KKyAgLy8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGludGVyZmFjZSB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgogICBUZkxpdGVTdGF0dXMgKCpBbGxvY2F0ZUJ1ZmZlckZvckV2YWwpKHN0cnVjdCBUZkxpdGVDb250ZXh0KiBjdHgsIHNpemVfdCBieXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiogcHRyKTsKIAotICAvLyBSZXF1ZXN0IGEgc2NyYXRjaCBidWZmZXIgaW4gdGhlIGFyZW5hIHRocm91Z2ggc3RhdGljIG1lbW9yeSBwbGFubmluZy4KLSAgLy8gVGhpcyBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgaW4gUHJlcGFyZSBzdGFnZSBhbmQgdGhlIGJ1ZmZlciBpcyBhbGxvY2F0ZWQKLSAgLy8gYnkgdGhlIGludGVycHJldGVyIGJldHdlZW4gUHJlcGFyZSBhbmQgRXZhbCBzdGFnZS4gSW4gRXZhbCBzdGFnZSwKLSAgLy8gR2V0U2NyYXRjaEJ1ZmZlciBBUEkgY2FuIGJlIHVzZWQgdG8gZmV0Y2ggdGhlIGFkZHJlc3MuCi0gIC8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGludGVyZmFjZSB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgorICAvLy8gUmVxdWVzdCBhIHNjcmF0Y2ggYnVmZmVyIGluIHRoZSBhcmVuYSB0aHJvdWdoIHN0YXRpYyBtZW1vcnkgcGxhbm5pbmcuCisgIC8vLyBUaGlzIG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBgUHJlcGFyZWAgc3RhZ2UgYW5kIHRoZSBidWZmZXIgaXMKKyAgLy8vIGFsbG9jYXRlZCBieSB0aGUgaW50ZXJwcmV0ZXIgYmV0d2VlbiBQcmVwYXJlIGFuZCBFdmFsIHN0YWdlLiBJbiBgRXZhbGAKKyAgLy8vIHN0YWdlLCBgR2V0U2NyYXRjaEJ1ZmZlcmAgQVBJIGNhbiBiZSB1c2VkIHRvIGZldGNoIHRoZSBhZGRyZXNzLgorICAvLy8KKyAgLy8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGludGVyZmFjZSB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgogICBUZkxpdGVTdGF0dXMgKCpSZXF1ZXN0U2NyYXRjaEJ1ZmZlckluQXJlbmEpKHN0cnVjdCBUZkxpdGVDb250ZXh0KiBjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ5dGVzLCBpbnQqIGJ1ZmZlcl9pZHgpOwogCi0gIC8vIEdldCB0aGUgc2NyYXRjaCBidWZmZXIgcG9pbnRlci4KLSAgLy8gVGhpcyBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgaW4gRXZhbCBzdGFnZS4KLSAgLy8gV0FSTklORzogVGhpcyBpcyBhbiBleHBlcmltZW50YWwgaW50ZXJmYWNlIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCisgIC8vLyBHZXQgdGhlIHNjcmF0Y2ggYnVmZmVyIHBvaW50ZXIuCisgIC8vLyBUaGlzIG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBFdmFsIHN0YWdlLgorICAvLy8KKyAgLy8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGludGVyZmFjZSB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgogICB2b2lkKiAoKkdldFNjcmF0Y2hCdWZmZXIpKHN0cnVjdCBUZkxpdGVDb250ZXh0KiBjdHgsIGludCBidWZmZXJfaWR4KTsKIAotICAvLyBSZXNpemUgdGhlIG1lbW9yeSBwb2ludGVyIG9mIHRoZSBgdGVuc29yYC4gVGhpcyBtZXRob2QgYmVoYXZlcyB0aGUgc2FtZSBhcwotICAvLyBgUmVzaXplVGVuc29yYCwgZXhjZXB0IHRoYXQgaXQgbWFrZXMgYSBjb3B5IG9mIHRoZSBzaGFwZSBhcnJheSBpbnRlcm5hbGx5Ci0gIC8vIHNvIHRoZSBzaGFwZSBhcnJheSBjb3VsZCBiZSBkZWFsbG9jYXRlZCByaWdodCBhZnRlcndhcmRzLgotICAvLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBpbnRlcmZhY2UgdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KKyAgLy8vIFJlc2l6ZSB0aGUgbWVtb3J5IHBvaW50ZXIgb2YgdGhlIGB0ZW5zb3JgLiBUaGlzIG1ldGhvZCBiZWhhdmVzIHRoZSBzYW1lIGFzCisgIC8vLyBgUmVzaXplVGVuc29yYCwgZXhjZXB0IHRoYXQgaXQgbWFrZXMgYSBjb3B5IG9mIHRoZSBzaGFwZSBhcnJheSBpbnRlcm5hbGx5CisgIC8vLyBzbyB0aGUgc2hhcGUgYXJyYXkgY291bGQgYmUgZGVhbGxvY2F0ZWQgcmlnaHQgYWZ0ZXJ3YXJkcy4KKyAgLy8vCisgIC8vLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBpbnRlcmZhY2UgdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KICAgVGZMaXRlU3RhdHVzICgqUmVzaXplVGVuc29yRXhwbGljaXQpKHN0cnVjdCBUZkxpdGVDb250ZXh0KiBjdHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZkxpdGVUZW5zb3IqIHRlbnNvciwgaW50IGRpbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQqIHNoYXBlKTsKIAotICAvLyBUaGlzIG1ldGhvZCBwcm92aWRlcyBhIHByZXZpZXcgb2YgcG9zdC1kZWxlZ2F0aW9uIHBhcnRpdGlvbmluZy4gRWFjaAotICAvLyBUZkxpdGVEZWxlZ2F0ZVBhcmFtcyBpbiB0aGUgcmVmZXJlbmNlZCBhcnJheSBjb3JyZXNwb25kcyB0byBvbmUgaW5zdGFuY2Ugb2YKLSAgLy8gdGhlIGRlbGVnYXRlIGtlcm5lbC4KLSAgLy8gRXhhbXBsZSB1c2FnZToKLSAgLy8KLSAgLy8gVGZMaXRlSW50QXJyYXkqIG5vZGVzX3RvX3JlcGxhY2UgPSAuLi47Ci0gIC8vIFRmTGl0ZURlbGVnYXRlUGFyYW1zKiBwYXJhbXNfYXJyYXk7Ci0gIC8vIGludCBudW1fcGFydGl0aW9ucyA9IDA7Ci0gIC8vIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhjb250ZXh0LT5QcmV2aWV3RGVsZWdhdGVQYXJ0aXRpb25pbmcoCi0gIC8vICAgIGNvbnRleHQsIGRlbGVnYXRlLCBub2Rlc190b19yZXBsYWNlLCAmcGFyYW1zX2FycmF5LCAmbnVtX3BhcnRpdGlvbnMpKTsKLSAgLy8gZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgbnVtX3BhcnRpdGlvbnM7IGlkeCsrKSB7Ci0gIC8vICAgIGNvbnN0IGF1dG8mIHBhcnRpdGlvbl9wYXJhbXMgPSBwYXJhbXNfYXJyYXlbaWR4XTsKLSAgLy8gICAgLi4uCi0gIC8vIH0KLSAgLy8KLSAgLy8gTk9URTogVGhlIGNvbnRleHQgb3ducyB0aGUgbWVtb3J5IHJlZmVyZW5jZWQgYnkgcGFydGl0aW9uX3BhcmFtc19hcnJheS4gSXQKLSAgLy8gd2lsbCBiZSBjbGVhcmVkIHdpdGggYW5vdGhlciBjYWxsIHRvIFByZXZpZXdEZWxlZ2F0ZVBhcnRpdGlvbmluZywgb3IgYWZ0ZXIKLSAgLy8gVGZMaXRlRGVsZWdhdGVQYXJhbXM6OlByZXBhcmUgcmV0dXJucy4KLSAgLy8KLSAgLy8gV0FSTklORzogVGhpcyBpcyBhbiBleHBlcmltZW50YWwgaW50ZXJmYWNlIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCisgIC8vLyBUaGlzIG1ldGhvZCBwcm92aWRlcyBhIHByZXZpZXcgb2YgcG9zdC1kZWxlZ2F0aW9uIHBhcnRpdGlvbmluZy4gRWFjaAorICAvLy8gVGZMaXRlRGVsZWdhdGVQYXJhbXMgaW4gdGhlIHJlZmVyZW5jZWQgYXJyYXkgY29ycmVzcG9uZHMgdG8gb25lIGluc3RhbmNlCisgIC8vLyBvZiB0aGUgZGVsZWdhdGUga2VybmVsLiBFeGFtcGxlIHVzYWdlOgorICAvLy8KKyAgLy8vICAgICBUZkxpdGVJbnRBcnJheSogbm9kZXNfdG9fcmVwbGFjZSA9IC4uLjsKKyAgLy8vICAgICBUZkxpdGVEZWxlZ2F0ZVBhcmFtcyogcGFyYW1zX2FycmF5OworICAvLy8gICAgIGludCBudW1fcGFydGl0aW9ucyA9IDA7CisgIC8vLyAgICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKGNvbnRleHQtPlByZXZpZXdEZWxlZ2F0ZVBhcnRpdGlvbmluZygKKyAgLy8vICAgICAgICBjb250ZXh0LCBkZWxlZ2F0ZSwgbm9kZXNfdG9fcmVwbGFjZSwgJnBhcmFtc19hcnJheSwKKyAgLy8vICAgICAgICAmbnVtX3BhcnRpdGlvbnMpKTsKKyAgLy8vICAgICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBudW1fcGFydGl0aW9uczsgaWR4KyspIHsKKyAgLy8vICAgICAgICBjb25zdCBhdXRvJiBwYXJ0aXRpb25fcGFyYW1zID0gcGFyYW1zX2FycmF5W2lkeF07CisgIC8vLyAgICAgICAgLi4uCisgIC8vLyAgICAgfQorICAvLy8KKyAgLy8vIE5PVEU6IFRoZSBjb250ZXh0IG93bnMgdGhlIG1lbW9yeSByZWZlcmVuY2VkIGJ5IHBhcnRpdGlvbl9wYXJhbXNfYXJyYXkuIEl0CisgIC8vLyB3aWxsIGJlIGNsZWFyZWQgd2l0aCBhbm90aGVyIGNhbGwgdG8gUHJldmlld0RlbGVnYXRlUGFydGl0aW9uaW5nLCBvciBhZnRlcgorICAvLy8gVGZMaXRlRGVsZWdhdGVQYXJhbXM6OlByZXBhcmUgcmV0dXJucy4KKyAgLy8vCisgIC8vLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBpbnRlcmZhY2UgdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KICAgVGZMaXRlU3RhdHVzICgqUHJldmlld0RlbGVnYXRlUGFydGl0aW9uaW5nKSgKICAgICAgIHN0cnVjdCBUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBUZkxpdGVJbnRBcnJheSogbm9kZXNfdG9fcmVwbGFjZSwKICAgICAgIFRmTGl0ZURlbGVnYXRlUGFyYW1zKiogcGFydGl0aW9uX3BhcmFtc19hcnJheSwgaW50KiBudW1fcGFydGl0aW9ucyk7CiAKLSAgLy8gUmV0dXJucyBhIFRmTGl0ZVRlbnNvciBzdHJ1Y3QgZm9yIGEgZ2l2ZW4gaW5kZXguCi0gIC8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGludGVyZmFjZSB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgotICAvLyBXQVJOSU5HOiBUaGlzIG1ldGhvZCBtYXkgbm90IGJlIGF2YWlsYWJsZSBvbiBhbGwgcGxhdGZvcm1zLgorICAvLy8gUmV0dXJucyBhIFRmTGl0ZVRlbnNvciBzdHJ1Y3QgZm9yIGEgZ2l2ZW4gaW5kZXguCisgIC8vLworICAvLy8gV0FSTklORzogVGhpcyBpcyBhbiBleHBlcmltZW50YWwgaW50ZXJmYWNlIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCisgIC8vLworICAvLy8gV0FSTklORzogVGhpcyBtZXRob2QgbWF5IG5vdCBiZSBhdmFpbGFibGUgb24gYWxsIHBsYXRmb3Jtcy4KICAgVGZMaXRlVGVuc29yKiAoKkdldFRlbnNvcikoY29uc3Qgc3RydWN0IFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0ZW5zb3JfaWR4KTsKIAotICAvLyBSZXR1cm5zIGEgVGZMaXRlRXZhbFRlbnNvciBzdHJ1Y3QgZm9yIGEgZ2l2ZW4gaW5kZXguCi0gIC8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGludGVyZmFjZSB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgotICAvLyBXQVJOSU5HOiBUaGlzIG1ldGhvZCBtYXkgbm90IGJlIGF2YWlsYWJsZSBvbiBhbGwgcGxhdGZvcm1zLgorICAvLy8gUmV0dXJucyBhIFRmTGl0ZUV2YWxUZW5zb3Igc3RydWN0IGZvciBhIGdpdmVuIGluZGV4LgorICAvLy8KKyAgLy8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGludGVyZmFjZSB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgorICAvLy8KKyAgLy8vIFdBUk5JTkc6IFRoaXMgbWV0aG9kIG1heSBub3QgYmUgYXZhaWxhYmxlIG9uIGFsbCBwbGF0Zm9ybXMuCiAgIFRmTGl0ZUV2YWxUZW5zb3IqICgqR2V0RXZhbFRlbnNvcikoY29uc3Qgc3RydWN0IFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRlbnNvcl9pZHgpOwogCi0gIC8vIFJldHJpZXZlcyBuYW1lZCBtZXRhZGF0YSBidWZmZXIgZnJvbSB0aGUgVEZMaXRlIG1vZGVsLgotICAvLyBSZXR1cm5zIGtUZkxpdGVPayBpZiBtZXRhZGF0YSBpcyBzdWNjZXNzZnVsbHkgb2J0YWluZWQgZnJvbSB0aGUgZmxhdGJ1ZmZlcgotICAvLyBNb2RlbDogdGhhdCBpcywgdGhlcmUgZXhpc3RzIGEgYG1ldGFkYXRhYCBlbnRyeSB3aXRoIGdpdmVuIGBuYW1lYCBzdHJpbmcuCi0gIC8vIChzZWUgVEZMaXRlJ3Mgc2NoZW1hLmZicykuCi0gIC8vIFRoZSBjb3JyZXNwb25kaW5nIGBidWZmZXJgIGluZm9ybWF0aW9uIGlzIHBvcHVsYXRlZCBpbiBgcHRyYCAmIGBieXRlc2AuCi0gIC8vIFRoZSBkYXRhIGZyb20gYHB0cmAgaXMgdmFsaWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgSW50ZXJwcmV0ZXIuCi0gIC8vCi0gIC8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGludGVyZmFjZSB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgorICAvLy8gUmV0cmlldmVzIG5hbWVkIG1ldGFkYXRhIGJ1ZmZlciBmcm9tIHRoZSBURkxpdGUgbW9kZWwuCisgIC8vLyBSZXR1cm5zIGtUZkxpdGVPayBpZiBtZXRhZGF0YSBpcyBzdWNjZXNzZnVsbHkgb2J0YWluZWQgZnJvbSB0aGUgZmxhdGJ1ZmZlcgorICAvLy8gTW9kZWw6IHRoYXQgaXMsIHRoZXJlIGV4aXN0cyBhIGBtZXRhZGF0YWAgZW50cnkgd2l0aCBnaXZlbiBgbmFtZWAgc3RyaW5nLgorICAvLy8gKHNlZSBURkxpdGUncyBzY2hlbWEuZmJzKS4KKyAgLy8vIFRoZSBjb3JyZXNwb25kaW5nIGBidWZmZXJgIGluZm9ybWF0aW9uIGlzIHBvcHVsYXRlZCBpbiBgcHRyYCAmIGBieXRlc2AuCisgIC8vLyBUaGUgZGF0YSBmcm9tIGBwdHJgIGlzIHZhbGlkIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIEludGVycHJldGVyLgorICAvLy8KKyAgLy8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGludGVyZmFjZSB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgogICBUZkxpdGVTdGF0dXMgKCpHZXRNb2RlbE1ldGFkYXRhKShjb25zdCBzdHJ1Y3QgVGZMaXRlQ29udGV4dCogY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhcioqIHB0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBieXRlcyk7CiAKLSAgLy8gUmV0cmlldmVzIHRoZSBjb3JyZXNwb25kaW5nIFRmTGl0ZUNvbnRleHQgb2YgYSBzdWJncmFwaCB0aGF0IHRoZSBnaXZlbgotICAvLyBzdWJncmFwaF9pbmRleCBwb2ludHMgdG8gYW5kIHN3aXRjaGVzIHRvIHRoZSBkZWxlZ2F0ZSBjb250ZXh0IGZvciB0aGF0Ci0gIC8vIHN1YmdyYXBoLiBJZiBhbiBpbnZhbGlkIHN1YmdyYXBoIGluZGV4IGlzIGdpdmVuLCByZXR1cm5zIGtUZkxpdGVFcnJvci4KLSAgLy8gTk9URTogVGhpcyBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byBiZSBwYWlyZWQgd2l0aCBSZWxlYXNlU3ViZ3JhcGhDb250ZXh0KCkKLSAgLy8gb25jZSB0aGUgZGVsZWdhdGUgcHJlcGFyYXRpb24gaXMgZG9uZSBhbmQvb3IgdGhlIGRlbGVnYXRlIGNvbnRleHQgZnVuY3Rpb25zCi0gIC8vIGFyZSBubyBsb25nZXIgbmVlZGVkLgotICAvLwotICAvLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBpbnRlcmZhY2UgdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KKyAgLy8vIFJldHJpZXZlcyB0aGUgY29ycmVzcG9uZGluZyBUZkxpdGVDb250ZXh0IG9mIGEgc3ViZ3JhcGggdGhhdCB0aGUgZ2l2ZW4KKyAgLy8vIHN1YmdyYXBoX2luZGV4IHBvaW50cyB0byBhbmQgc3dpdGNoZXMgdG8gdGhlIGRlbGVnYXRlIGNvbnRleHQgZm9yIHRoYXQKKyAgLy8vIHN1YmdyYXBoLiBJZiBhbiBpbnZhbGlkIHN1YmdyYXBoIGluZGV4IGlzIGdpdmVuLCByZXR1cm5zIGtUZkxpdGVFcnJvci4KKyAgLy8vCisgIC8vLyBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIHBhaXJlZCB3aXRoIFJlbGVhc2VTdWJncmFwaENvbnRleHQoKQorICAvLy8gb25jZSB0aGUgZGVsZWdhdGUgcHJlcGFyYXRpb24gaXMgZG9uZSBhbmQvb3IgdGhlIGRlbGVnYXRlIGNvbnRleHQKKyAgLy8vIGZ1bmN0aW9ucyBhcmUgbm8gbG9uZ2VyIG5lZWRlZC4KKyAgLy8vCisgIC8vLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBpbnRlcmZhY2UgdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KICAgVGZMaXRlU3RhdHVzICgqQWNxdWlyZVN1YmdyYXBoQ29udGV4dCkoCiAgICAgICBzdHJ1Y3QgVGZMaXRlQ29udGV4dCogY29udGV4dCwgaW50IHN1YmdyYXBoX2luZGV4LAogICAgICAgc3RydWN0IFRmTGl0ZUNvbnRleHQqKiBhY3F1aXJlZF9jb250ZXh0KTsKLSAgLy8gUmVsZWFzZXMgdGhlIHN1YmdyYXBoIGNvbnRleHQgYnkgc3dpdGNoaW5nIGJhY2sgdG8gdGhlIFRGTGl0ZSBrZXJuZWwKLSAgLy8gY29udGV4dCBmb3IgdGhlIHN1YmdyYXBoIHRoYXQgdGhlIGdpdmVuIHN1YmdyYXBoX2luZGV4IHBvaW50cyB0by4KLSAgLy8gTk9URTogVGhpcyBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byBiZSB1c2VkIGFmdGVyIEFjcXVpcmVTdWJncmFwaENvbnRleHQoKQotICAvLyBvbmNlIHRoZSBkZWxlZ2F0ZSBwcmVwYXJhdGlvbiBpcyBkb25lIGFuZC9vciB0aGUgZGVsZWdhdGUgY29udGV4dCBmdW5jdGlvbnMKLSAgLy8gYXJlIG5vIGxvbmdlciBuZWVkZWQuCi0gIC8vCi0gIC8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGludGVyZmFjZSB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgorICAvLy8gUmVsZWFzZXMgdGhlIHN1YmdyYXBoIGNvbnRleHQgYnkgc3dpdGNoaW5nIGJhY2sgdG8gdGhlIFRGTGl0ZSBrZXJuZWwKKyAgLy8vIGNvbnRleHQgZm9yIHRoZSBzdWJncmFwaCB0aGF0IHRoZSBnaXZlbiBzdWJncmFwaF9pbmRleCBwb2ludHMgdG8uCisgIC8vLworICAvLy8gTk9URTogVGhpcyBmdW5jdGlvbiBpcyBleHBlY3RlZCB0byBiZSB1c2VkIGFmdGVyIEFjcXVpcmVTdWJncmFwaENvbnRleHQoKQorICAvLy8gb25jZSB0aGUgZGVsZWdhdGUgcHJlcGFyYXRpb24gaXMgZG9uZSBhbmQvb3IgdGhlIGRlbGVnYXRlIGNvbnRleHQKKyAgLy8vIGZ1bmN0aW9ucyBhcmUgbm8gbG9uZ2VyIG5lZWRlZC4KKyAgLy8vCisgIC8vLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBpbnRlcmZhY2UgdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KICAgVGZMaXRlU3RhdHVzICgqUmVsZWFzZVN1YmdyYXBoQ29udGV4dCkoc3RydWN0IFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJncmFwaF9pbmRleCk7CiB9IFRmTGl0ZUNvbnRleHQ7CiAKLS8vIGBUZkxpdGVSZWdpc3RyYXRpb25FeHRlcm5hbGAgaXMgYW4gZXh0ZXJuYWwgdmVyc2lvbiBvZiBgVGZMaXRlUmVnaXN0cmF0aW9uYAotLy8gZm9yIEMgQVBJIHdoaWNoIGRvZXNuJ3QgdXNlIGludGVybmFsIHR5cGVzIChzdWNoIGFzIGBUZkxpdGVDb250ZXh0YCkgYnV0IG9ubHkKLS8vIHVzZXMgc3RhYmxlIEFQSSB0eXBlcyAoc3VjaCBhcyBgVGZMaXRlT3BhcXVlQ29udGV4dGApLiBUaGUgcHVycG9zZSBvZiBlYWNoCi0vLyBmaWVsZCBpcyB0aGUgZXhhY3RseSB0aGUgc2FtZSBhcyB3aXRoIGBUZkxpdGVSZWdpc3RyYXRpb25gLgotdHlwZWRlZiBzdHJ1Y3QgVGZMaXRlUmVnaXN0cmF0aW9uRXh0ZXJuYWwgVGZMaXRlUmVnaXN0cmF0aW9uRXh0ZXJuYWw7CisvLy8gYFRmTGl0ZU9wZXJhdG9yYCBpcyBhbiBleHRlcm5hbCB2ZXJzaW9uIG9mIGBUZkxpdGVSZWdpc3RyYXRpb25gCisvLy8gZm9yIEMgQVBJIHdoaWNoIGRvZXNuJ3QgdXNlIGludGVybmFsIHR5cGVzIChzdWNoIGFzIGBUZkxpdGVDb250ZXh0YCkgYnV0CisvLy8gb25seSB1c2VzIHN0YWJsZSBBUEkgdHlwZXMgKHN1Y2ggYXMgYFRmTGl0ZU9wYXF1ZUNvbnRleHRgKS4gVGhlIHB1cnBvc2Ugb2YKKy8vLyBlYWNoIGZpZWxkIGlzIHRoZSBleGFjdGx5IHRoZSBzYW1lIGFzIHdpdGggYFRmTGl0ZVJlZ2lzdHJhdGlvbmAuCit0eXBlZGVmIHN0cnVjdCBUZkxpdGVPcGVyYXRvciBUZkxpdGVPcGVyYXRvcjsKIAotLy8gVGhlIHZhbGlkIHZhbHVlcyBvZiB0aGUgYGlucGxhY2Vfb3BlcmF0b3JgIGZpZWxkIGluIGBUZkxpdGVSZWdpc3RyYXRpb25gLgotLy8gVGhpcyBhbGxvdyBhbiBvcCB0byBzaWduYWwgdG8gdGhlIHJ1bnRpbWUgdGhhdCB0aGUgc2FtZSBkYXRhIHBvaW50ZXIKLS8vIG1heSBiZSBwYXNzZWQgYXMgYW4gaW5wdXQgYW5kIG91dHB1dCB3aXRob3V0IGltcGFjdGluZyB0aGUgcmVzdWx0LgotLy8gVGhpcyBkb2VzIG5vdCBtZWFuIHRoYXQgdGhlIG1lbW9yeSBjYW4gc2FmZWx5IGJlIHJldXNlZCwgaXQgaXMgdXAgdG8gdGhlCi0vLyBydW50aW1lIHRvIGRldGVybWluZSB0aGlzLCBlLmcuIGlmIGFub3RoZXIgb3AgY29uc3VtZXMgdGhlIHNhbWUgaW5wdXQgb3Igbm90Ci0vLyBvciBpZiBhbiBpbnB1dCB0ZW5zb3IgaGFzIHN1ZmZpY2llbnQgbWVtb3J5IGFsbG9jYXRlZCB0byBzdG9yZSB0aGUgb3V0cHV0Ci0vLyBkYXRhLgotLy8KLS8vIFNldHRpbmcgdGhlc2UgZmxhZ3MgYXV0aG9yaXplcyB0aGUgcnVudGltZSB0byBzZXQgdGhlIGRhdGEgcG9pbnRlcnMgb2YgYW4KLS8vIGlucHV0IGFuZCBvdXRwdXQgdGVuc29yIHRvIHRoZSBzYW1lIHZhbHVlLiBJbiBzdWNoIGNhc2VzLCB0aGUgbWVtb3J5IHJlcXVpcmVkCi0vLyBieSB0aGUgb3V0cHV0IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoYXQgcmVxdWlyZWQgYnkgdGhlIHNoYXJlZAotLy8gaW5wdXQsIG5ldmVyIGdyZWF0ZXIuIElmIGtUZkxpdGVJbnBsYWNlT3BEYXRhVW5tb2RpZmllZCBpcyBzZXQsIHRoZW4gdGhlCi0vLyBydW50aW1lIGNhbiBzaGFyZSB0aGUgc2FtZSBpbnB1dCB0ZW5zb3Igd2l0aCBtdWx0aXBsZSBvcGVyYXRvcidzIG91dHB1dHMsCi0vLyBwcm92aWRlZCB0aGF0IGtUZkxpdGVJbnBsYWNlT3BEYXRhVW5tb2RpZmllZCBpcyBzZXQgZm9yIGFsbCBvZiB0aGVtLgotLy8gT3RoZXJ3aXNlLCBpZiBhbiBpbnB1dCB0ZW5zb3IgaXMgY29uc3VtZWQgYnkgbXVsdGlwbGUgb3BlcmF0b3JzLCBpdCBtYXkgb25seQotLy8gYmUgc2hhcmVkIHdpdGggdGhlIG9wZXJhdG9yIHdoaWNoIGlzIHRoZSBsYXN0IHRvIGNvbnN1bWUgaXQuCi0vLwotLy8gTm90ZSB0aGF0IHRoaXMgaXMgYSBiaXRtYXNrLCBzbyB0aGUgdmFsdWVzIHNob3VsZCBiZSAxLCAyLCA0LCA4LCAuLi5ldGMuCisjaWZuZGVmIERPWFlHRU5fU0tJUAorLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorLy8gRGVwcmVjYXRlZC4gVXNlIFRmTGl0ZU9wZXJhdG9yIGluc3RlYWQuCit0eXBlZGVmIFRmTGl0ZU9wZXJhdG9yIFRmTGl0ZVJlZ2lzdHJhdGlvbkV4dGVybmFsOworI2VuZGlmCisKKy8vLyBUaGUgdmFsaWQgdmFsdWVzIG9mIHRoZSBgaW5wbGFjZV9vcGVyYXRvcmAgZmllbGQgaW4gYFRmTGl0ZVJlZ2lzdHJhdGlvbmAuCisvLy8gVGhpcyBhbGxvdyBhbiBvcCB0byBzaWduYWwgdG8gdGhlIHJ1bnRpbWUgdGhhdCB0aGUgc2FtZSBkYXRhIHBvaW50ZXIKKy8vLyBtYXkgYmUgcGFzc2VkIGFzIGFuIGlucHV0IGFuZCBvdXRwdXQgd2l0aG91dCBpbXBhY3RpbmcgdGhlIHJlc3VsdC4KKy8vLyBUaGlzIGRvZXMgbm90IG1lYW4gdGhhdCB0aGUgbWVtb3J5IGNhbiBzYWZlbHkgYmUgcmV1c2VkLCBpdCBpcyB1cCB0byB0aGUKKy8vLyBydW50aW1lIHRvIGRldGVybWluZSB0aGlzLCBlLmcuIGlmIGFub3RoZXIgb3AgY29uc3VtZXMgdGhlIHNhbWUgaW5wdXQgb3Igbm90CisvLy8gb3IgaWYgYW4gaW5wdXQgdGVuc29yIGhhcyBzdWZmaWNpZW50IG1lbW9yeSBhbGxvY2F0ZWQgdG8gc3RvcmUgdGhlIG91dHB1dAorLy8vIGRhdGEuCisvLy8KKy8vLyBTZXR0aW5nIHRoZXNlIGZsYWdzIGF1dGhvcml6ZXMgdGhlIHJ1bnRpbWUgdG8gc2V0IHRoZSBkYXRhIHBvaW50ZXJzIG9mIGFuCisvLy8gaW5wdXQgYW5kIG91dHB1dCB0ZW5zb3IgdG8gdGhlIHNhbWUgdmFsdWUuIEluIHN1Y2ggY2FzZXMsIHRoZSBtZW1vcnkKKy8vLyByZXF1aXJlZCBieSB0aGUgb3V0cHV0IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoYXQgcmVxdWlyZWQgYnkgdGhlCisvLy8gc2hhcmVkIGlucHV0LCBuZXZlciBncmVhdGVyLiBJZiBrVGZMaXRlSW5wbGFjZU9wRGF0YVVubW9kaWZpZWQgaXMgc2V0LCB0aGVuCisvLy8gdGhlIHJ1bnRpbWUgY2FuIHNoYXJlIHRoZSBzYW1lIGlucHV0IHRlbnNvciB3aXRoIG11bHRpcGxlIG9wZXJhdG9yJ3MKKy8vLyBvdXRwdXRzLCBwcm92aWRlZCB0aGF0IGtUZkxpdGVJbnBsYWNlT3BEYXRhVW5tb2RpZmllZCBpcyBzZXQgZm9yIGFsbCBvZgorLy8vIHRoZW0uIE90aGVyd2lzZSwgaWYgYW4gaW5wdXQgdGVuc29yIGlzIGNvbnN1bWVkIGJ5IG11bHRpcGxlIG9wZXJhdG9ycywgaXQKKy8vLyBtYXkgb25seSBiZSBzaGFyZWQgd2l0aCB0aGUgb3BlcmF0b3Igd2hpY2ggaXMgdGhlIGxhc3QgdG8gY29uc3VtZSBpdC4KKy8vLworLy8vIE5vdGUgdGhhdCB0aGlzIGlzIGEgYml0bWFzaywgc28gdGhlIHZhbHVlcyBzaG91bGQgYmUgMSwgMiwgNCwgOCwgLi4uZXRjLgogdHlwZWRlZiBlbnVtIHsKLSAgLy8gVGhlIGRlZmF1bHQgdmFsdWUuIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIHNhbWUgZGF0YSBwb2ludGVyIGNhbm5vdCBzYWZlbHkKLSAgLy8gYmUgcGFzc2VkIGFzIGFuIG9wJ3MgaW5wdXQgYW5kIG91dHB1dC4KKyAgLy8vIFRoZSBkZWZhdWx0IHZhbHVlLiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSBzYW1lIGRhdGEgcG9pbnRlciBjYW5ub3Qgc2FmZWx5CisgIC8vLyBiZSBwYXNzZWQgYXMgYW4gb3AncyBpbnB1dCBhbmQgb3V0cHV0LgogICBrVGZMaXRlSW5wbGFjZU9wTm9uZSA9IDAsCi0gIC8vIFRoaXMgaW5kaWNhdGVzIHRoYXQgYW4gb3AncyBmaXJzdCBvdXRwdXQncyBkYXRhIGlzIGlkZW50aWNhbCB0byBpdHMgZmlyc3QKLSAgLy8gaW5wdXQncyBkYXRhLCBmb3IgZXhhbXBsZSBSZXNoYXBlLgorICAvLy8gVGhpcyBpbmRpY2F0ZXMgdGhhdCBhbiBvcCdzIGZpcnN0IG91dHB1dCdzIGRhdGEgaXMgaWRlbnRpY2FsIHRvIGl0cyBmaXJzdAorICAvLy8gaW5wdXQncyBkYXRhLCBmb3IgZXhhbXBsZSBSZXNoYXBlLgogICBrVGZMaXRlSW5wbGFjZU9wRGF0YVVubW9kaWZpZWQgPSAxLAotICAvLyBTZXR0aW5nIGtUZkxpdGVJbnBsYWNlSW5wdXRDYW5CZVNoYXJlZFdpdGhDb3JyZXNwb25kaW5nT3V0cHV0IG1lYW5zCi0gIC8vIHRoYXQgSW5wdXROIG1heSBiZSBzaGFyZWQgd2l0aCBPdXRwdXROIGluc3RlYWQgb2Ygd2l0aCB0aGUgZmlyc3Qgb3V0cHV0LgotICAvLyBUaGlzIGZsYWcgcmVxdWlyZXMgb25lIG9yIG1vcmUgb2Yga1RmTGl0ZUlucGxhY2VPcElucHV0TlNoYXJlZCB0byBiZSBzZXQuCisgIC8vLyBTZXR0aW5nIGtUZkxpdGVJbnBsYWNlSW5wdXRDYW5CZVNoYXJlZFdpdGhDb3JyZXNwb25kaW5nT3V0cHV0IG1lYW5zCisgIC8vLyB0aGF0IElucHV0TiBtYXkgYmUgc2hhcmVkIHdpdGggT3V0cHV0TiBpbnN0ZWFkIG9mIHdpdGggdGhlIGZpcnN0IG91dHB1dC4KKyAgLy8vIFRoaXMgZmxhZyByZXF1aXJlcyBvbmUgb3IgbW9yZSBvZiBrVGZMaXRlSW5wbGFjZU9wSW5wdXROU2hhcmVkIHRvIGJlIHNldC4KICAga1RmTGl0ZUlucGxhY2VJbnB1dENhbkJlU2hhcmVkV2l0aENvcnJlc3BvbmRpbmdPdXRwdXQgPSAyLAotICAvLyBrVGZMaXRlSW5wbGFjZU9wSW5wdXROU2hhcmVkIGluZGljYXRlcyB0aGF0IGl0IGlzIHNhZmUgZm9yIGFuIG9wIHRvIHNoYXJlCi0gIC8vIElucHV0TidzIGRhdGEgcG9pbnRlciB3aXRoIGFuIG91dHB1dCB0ZW5zb3IuIElmCi0gIC8vIGtUZkxpdGVJbnBsYWNlSW5wdXRDYW5CZVNoYXJlZFdpdGhDb3JyZXNwb25kaW5nT3V0cHV0IGlzIHNldCB0aGVuCi0gIC8vIGtUZkxpdGVJbnBsYWNlT3BJbnB1dE5TaGFyZWQgaW5kaWNhdGVzIHRoYXQgSW5wdXROIG1heSBiZSBzaGFyZWQKLSAgLy8gd2l0aCBPdXRwdXROLCBvdGhlcndpc2Uga1RmTGl0ZUlucGxhY2VPcElucHV0TlNoYXJlZCBpbmRpY2F0ZXMgdGhhdCBJbnB1dE4KLSAgLy8gbWF5IGJlIHNoYXJlZCB3aXRoIHRoZSBmaXJzdCBvdXRwdXQuCi0gIC8vCi0gIC8vIEluZGljYXRlcyB0aGF0IGFuIG9wJ3MgZmlyc3QgaW5wdXQgbWF5IGJlIHNoYXJlZCB3aXRoIHRoZSBmaXJzdCBvdXRwdXQKLSAgLy8gdGVuc29yLiBrVGZMaXRlSW5wbGFjZUlucHV0Q2FuQmVTaGFyZWRXaXRoQ29ycmVzcG9uZGluZ091dHB1dCBoYXMKLSAgLy8gbm8gaW1wYWN0IG9uIHRoZSBiZWhhdmlvciBhbGxvd2VkIGJ5IHRoaXMgZmxhZy4KKyAgLy8vIGtUZkxpdGVJbnBsYWNlT3BJbnB1dE5TaGFyZWQgaW5kaWNhdGVzIHRoYXQgaXQgaXMgc2FmZSBmb3IgYW4gb3AgdG8gc2hhcmUKKyAgLy8vIElucHV0TidzIGRhdGEgcG9pbnRlciB3aXRoIGFuIG91dHB1dCB0ZW5zb3IuIElmCisgIC8vLyBrVGZMaXRlSW5wbGFjZUlucHV0Q2FuQmVTaGFyZWRXaXRoQ29ycmVzcG9uZGluZ091dHB1dCBpcyBzZXQgdGhlbgorICAvLy8ga1RmTGl0ZUlucGxhY2VPcElucHV0TlNoYXJlZCBpbmRpY2F0ZXMgdGhhdCBJbnB1dE4gbWF5IGJlIHNoYXJlZAorICAvLy8gd2l0aCBPdXRwdXROLCBvdGhlcndpc2Uga1RmTGl0ZUlucGxhY2VPcElucHV0TlNoYXJlZCBpbmRpY2F0ZXMgdGhhdCBJbnB1dE4KKyAgLy8vIG1heSBiZSBzaGFyZWQgd2l0aCB0aGUgZmlyc3Qgb3V0cHV0LgorICAvLy8KKyAgLy8vIEluZGljYXRlcyB0aGF0IGFuIG9wJ3MgZmlyc3QgaW5wdXQgbWF5IGJlIHNoYXJlZCB3aXRoIHRoZSBmaXJzdCBvdXRwdXQKKyAgLy8vIHRlbnNvci4ga1RmTGl0ZUlucGxhY2VJbnB1dENhbkJlU2hhcmVkV2l0aENvcnJlc3BvbmRpbmdPdXRwdXQgaGFzCisgIC8vLyBubyBpbXBhY3Qgb24gdGhlIGJlaGF2aW9yIGFsbG93ZWQgYnkgdGhpcyBmbGFnLgogICBrVGZMaXRlSW5wbGFjZU9wSW5wdXQwU2hhcmVkID0gNCwKLSAgLy8gSW5kaWNhdGVzIHRoYXQgYW4gb3AncyBzZWNvbmQgaW5wdXQgbWF5IGJlIHNoYXJlZCB3aXRoIHRoZSBmaXJzdCBvdXRwdXQKLSAgLy8gaWYga1RmTGl0ZUlucGxhY2VJbnB1dENhbkJlU2hhcmVkV2l0aENvcnJlc3BvbmRpbmdPdXRwdXQgaXMgbm90IHNldAotICAvLyBvciBzZWNvbmQgb3V0cHV0IGlmIGtUZkxpdGVJbnBsYWNlSW5wdXRDYW5CZVNoYXJlZFdpdGhDb3JyZXNwb25kaW5nT3V0cHV0Ci0gIC8vIGlzIHNldC4KKyAgLy8vIEluZGljYXRlcyB0aGF0IGFuIG9wJ3Mgc2Vjb25kIGlucHV0IG1heSBiZSBzaGFyZWQgd2l0aCB0aGUgZmlyc3Qgb3V0cHV0CisgIC8vLyBpZiBrVGZMaXRlSW5wbGFjZUlucHV0Q2FuQmVTaGFyZWRXaXRoQ29ycmVzcG9uZGluZ091dHB1dCBpcyBub3Qgc2V0CisgIC8vLyBvciBzZWNvbmQgb3V0cHV0IGlmIGtUZkxpdGVJbnBsYWNlSW5wdXRDYW5CZVNoYXJlZFdpdGhDb3JyZXNwb25kaW5nT3V0cHV0CisgIC8vLyBpcyBzZXQuCiAgIGtUZkxpdGVJbnBsYWNlT3BJbnB1dDFTaGFyZWQgPSA4LAotICAvLyBJbmRpY2F0ZXMgdGhhdCBhbiBvcCdzIHRoaXJkIGlucHV0IG1heSBiZSBzaGFyZWQgd2l0aCB0aGUgZmlyc3Qgb3V0cHV0Ci0gIC8vIGlmIGtUZkxpdGVJbnBsYWNlSW5wdXRDYW5CZVNoYXJlZFdpdGhDb3JyZXNwb25kaW5nT3V0cHV0IGlzIG5vdCBzZXQKLSAgLy8gb3IgdGhpcmQgb3V0cHV0IGlmIGtUZkxpdGVJbnBsYWNlSW5wdXRDYW5CZVNoYXJlZFdpdGhDb3JyZXNwb25kaW5nT3V0cHV0IGlzCi0gIC8vIHNldC4KKyAgLy8vIEluZGljYXRlcyB0aGF0IGFuIG9wJ3MgdGhpcmQgaW5wdXQgbWF5IGJlIHNoYXJlZCB3aXRoIHRoZSBmaXJzdCBvdXRwdXQKKyAgLy8vIGlmIGtUZkxpdGVJbnBsYWNlSW5wdXRDYW5CZVNoYXJlZFdpdGhDb3JyZXNwb25kaW5nT3V0cHV0IGlzIG5vdCBzZXQKKyAgLy8vIG9yIHRoaXJkIG91dHB1dCBpZiBrVGZMaXRlSW5wbGFjZUlucHV0Q2FuQmVTaGFyZWRXaXRoQ29ycmVzcG9uZGluZ091dHB1dAorICAvLy8gaXMKKyAgLy8vIHNldC4KICAga1RmTGl0ZUlucGxhY2VPcElucHV0MlNoYXJlZCA9IDE2LAotICAvLyBQbGFjZWhvbGRlciB0byBlbnN1cmUgdGhhdCBlbnVtIGNhbiBob2xkIDY0IGJpdCB2YWx1ZXMgdG8gYWNjb21tb2RhdGUKLSAgLy8gZnV0dXJlIGZpZWxkcy4KKyAgLy8vIFBsYWNlaG9sZGVyIHRvIGVuc3VyZSB0aGF0IGVudW0gY2FuIGhvbGQgNjQgYml0IHZhbHVlcyB0byBhY2NvbW1vZGF0ZQorICAvLy8gZnV0dXJlIGZpZWxkcy4KICAga1RmTGl0ZUlucGxhY2VPcE1heFZhbHVlID0gVUlOVDY0X01BWCwKIH0gVGZMaXRlSW5QbGFjZU9wOwogCi0vLyBUaGUgbnVtYmVyIG9mIHNoYXJlYWJsZSBpbnB1dHMgc3VwcG9ydGVkLgorLy8vIFRoZSBudW1iZXIgb2Ygc2hhcmVhYmxlIGlucHV0cyBzdXBwb3J0ZWQuCiBzdGF0aWMgY29uc3QgaW50IGtUZkxpdGVNYXhTaGFyYWJsZU9wSW5wdXRzID0gMzsKIAorLy8vIGBUZkxpdGVSZWdpc3RyYXRpb25gIGRlZmluZXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIGFuIG9wZXJhdGlvbgorLy8vIChhIGJ1aWx0LWluIG9wLCBjdXN0b20gb3AsIG9yIGN1c3RvbSBkZWxlZ2F0ZSBrZXJuZWwpLgorLy8vCisvLy8gSXQgaXMgYSBzdHJ1Y3QgY29udGFpbmluZyAibWV0aG9kcyIgKEMgZnVuY3Rpb24gcG9pbnRlcnMpIHRoYXQgd2lsbCBiZQorLy8vIGludm9rZWQgYnkgdGhlIFRGIExpdGUgcnVudGltZSB0byBldmFsdWF0ZSBpbnN0YW5jZXMgb2YgdGhlIG9wZXJhdGlvbi4KKy8vLworLy8vIFNlZSBhbHNvIGBUZkxpdGVPcGVyYXRvcmAgd2hpY2ggaXMgYSBtb3JlIEFCSS1zdGFibGUgZXF1aXZhbGVudC4KIHR5cGVkZWYgc3RydWN0IFRmTGl0ZVJlZ2lzdHJhdGlvbiB7Ci0gIC8vIEluaXRpYWxpemVzIHRoZSBvcCBmcm9tIHNlcmlhbGl6ZWQgZGF0YS4KLSAgLy8gQ2FsbGVkIG9ubHkgKm9uY2UqIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIG9wLCBzbyBhbnkgb25lLXRpbWUgYWxsb2NhdGlvbnMKLSAgLy8gc2hvdWxkIGJlIG1hZGUgaGVyZSAodW5sZXNzIHRoZXkgZGVwZW5kIG9uIHRlbnNvciBzaXplcykuCi0gIC8vCi0gIC8vIElmIGEgYnVpbHQtaW4gb3A6Ci0gIC8vICAgYGJ1ZmZlcmAgaXMgdGhlIG9wJ3MgcGFyYW1zIGRhdGEgKFRmTGl0ZUxTVE1QYXJhbXMqKS4KLSAgLy8gICBgbGVuZ3RoYCBpcyB6ZXJvLgotICAvLyBJZiBjdXN0b20gb3A6Ci0gIC8vICAgYGJ1ZmZlcmAgaXMgdGhlIG9wJ3MgYGN1c3RvbV9vcHRpb25zYC4KLSAgLy8gICBgbGVuZ3RoYCBpcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyLgotICAvLwotICAvLyBSZXR1cm5zIGEgdHlwZS1wdW5uZWQgKGkuZS4gdm9pZCopIG9wYXF1ZSBkYXRhIChlLmcuIGEgcHJpbWl0aXZlIHBvaW50ZXIKLSAgLy8gb3IgYW4gaW5zdGFuY2Ugb2YgYSBzdHJ1Y3QpLgotICAvLwotICAvLyBUaGUgcmV0dXJuZWQgcG9pbnRlciB3aWxsIGJlIHN0b3JlZCB3aXRoIHRoZSBub2RlIGluIHRoZSBgdXNlcl9kYXRhYCBmaWVsZCwKLSAgLy8gYWNjZXNzaWJsZSB3aXRoaW4gcHJlcGFyZSBhbmQgaW52b2tlIGZ1bmN0aW9ucyBiZWxvdy4KLSAgLy8gTk9URTogaWYgdGhlIGRhdGEgaXMgYWxyZWFkeSBpbiB0aGUgZGVzaXJlZCBmb3JtYXQsIHNpbXBseSBpbXBsZW1lbnQgdGhpcwotICAvLyBmdW5jdGlvbiB0byByZXR1cm4gYG51bGxwdHJgIGFuZCBpbXBsZW1lbnQgdGhlIGZyZWUgZnVuY3Rpb24gdG8gYmUgYSBuby1vcC4KKyAgLy8vIEluaXRpYWxpemVzIHRoZSBvcCBmcm9tIHNlcmlhbGl6ZWQgZGF0YS4KKyAgLy8vIENhbGxlZCBvbmx5ICpvbmNlKiBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBvcCwgc28gYW55IG9uZS10aW1lIGFsbG9jYXRpb25zCisgIC8vLyBzaG91bGQgYmUgbWFkZSBoZXJlICh1bmxlc3MgdGhleSBkZXBlbmQgb24gdGVuc29yIHNpemVzKS4KKyAgLy8vCisgIC8vLyAqIElmIGEgYnVpbHQtaW4gb3A6CisgIC8vLyAgICAgICAqIGBidWZmZXJgIGlzIHRoZSBvcCdzIHBhcmFtcyBkYXRhIChUZkxpdGVMU1RNUGFyYW1zKikuCisgIC8vLyAgICAgICAqIGBsZW5ndGhgIGlzIHplcm8uCisgIC8vLyAqIElmIGN1c3RvbSBvcDoKKyAgLy8vICAgICAgICogYGJ1ZmZlcmAgaXMgdGhlIG9wJ3MgYGN1c3RvbV9vcHRpb25zYC4KKyAgLy8vICAgICAgICogYGxlbmd0aGAgaXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4KKyAgLy8vCisgIC8vLyBSZXR1cm5zIGEgdHlwZS1wdW5uZWQgKGkuZS4gdm9pZCopIG9wYXF1ZSBkYXRhIChlLmcuIGEgcHJpbWl0aXZlIHBvaW50ZXIKKyAgLy8vIG9yIGFuIGluc3RhbmNlIG9mIGEgc3RydWN0KS4KKyAgLy8vCisgIC8vLyBUaGUgcmV0dXJuZWQgcG9pbnRlciB3aWxsIGJlIHN0b3JlZCB3aXRoIHRoZSBub2RlIGluIHRoZSBgdXNlcl9kYXRhYAorICAvLy8gZmllbGQsIGFjY2Vzc2libGUgd2l0aGluIHByZXBhcmUgYW5kIGludm9rZSBmdW5jdGlvbnMgYmVsb3cuCisgIC8vLworICAvLy8gTk9URTogaWYgdGhlIGRhdGEgaXMgYWxyZWFkeSBpbiB0aGUgZGVzaXJlZCBmb3JtYXQsIHNpbXBseSBpbXBsZW1lbnQgdGhpcworICAvLy8gZnVuY3Rpb24gdG8gcmV0dXJuIGBudWxscHRyYCBhbmQgaW1wbGVtZW50IHRoZSBmcmVlIGZ1bmN0aW9uIHRvIGJlIGEKKyAgLy8vIG5vLW9wLgogICB2b2lkKiAoKmluaXQpKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCk7CiAKLSAgLy8gVGhlIHBvaW50ZXIgYGJ1ZmZlcmAgaXMgdGhlIGRhdGEgcHJldmlvdXNseSByZXR1cm5lZCBieSBhbiBpbml0IGludm9jYXRpb24uCisgIC8vLyBUaGUgcG9pbnRlciBgYnVmZmVyYCBpcyB0aGUgZGF0YSBwcmV2aW91c2x5IHJldHVybmVkIGJ5IGFuIGluaXQKKyAgLy8vIGludm9jYXRpb24uCiAgIHZvaWQgKCpmcmVlKShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCB2b2lkKiBidWZmZXIpOwogCi0gIC8vIHByZXBhcmUgaXMgY2FsbGVkIHdoZW4gdGhlIGlucHV0cyB0aGlzIG5vZGUgZGVwZW5kcyBvbiBoYXZlIGJlZW4gcmVzaXplZC4KLSAgLy8gY29udGV4dC0+UmVzaXplVGVuc29yKCkgY2FuIGJlIGNhbGxlZCB0byByZXF1ZXN0IG91dHB1dCB0ZW5zb3JzIHRvIGJlCi0gIC8vIHJlc2l6ZWQuCi0gIC8vIENhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgb3AuCi0gIC8vCi0gIC8vIFJldHVybnMga1RmTGl0ZU9rIG9uIHN1Y2Nlc3MuCisgIC8vLyBwcmVwYXJlIGlzIGNhbGxlZCB3aGVuIHRoZSBpbnB1dHMgdGhpcyBub2RlIGRlcGVuZHMgb24gaGF2ZSBiZWVuIHJlc2l6ZWQuCisgIC8vLyBgY29udGV4dC0+UmVzaXplVGVuc29yKClgIGNhbiBiZSBjYWxsZWQgdG8gcmVxdWVzdCBvdXRwdXQgdGVuc29ycyB0byBiZQorICAvLy8gcmVzaXplZC4KKyAgLy8vIENhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgb3AuCisgIC8vLworICAvLy8gUmV0dXJucyBga1RmTGl0ZU9rYCBvbiBzdWNjZXNzLgogICBUZkxpdGVTdGF0dXMgKCpwcmVwYXJlKShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKTsKIAotICAvLyBFeGVjdXRlIHRoZSBub2RlIChzaG91bGQgcmVhZCBub2RlLT5pbnB1dHMgYW5kIG91dHB1dCB0byBub2RlLT5vdXRwdXRzKS4KLSAgLy8gUmV0dXJucyBrVGZMaXRlT2sgb24gc3VjY2Vzcy4KKyAgLy8vIEV4ZWN1dGUgdGhlIG5vZGUgKHNob3VsZCByZWFkIGBub2RlLT5pbnB1dHNgIGFuZCBvdXRwdXQgdG8KKyAgLy8vIGBub2RlLT5vdXRwdXRzYCkuCisgIC8vLworICAvLy8gUmV0dXJucyBga1RmTGl0ZU9rYCBvbiBzdWNjZXNzLgogICBUZkxpdGVTdGF0dXMgKCppbnZva2UpKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpOwogCi0gIC8vIHByb2ZpbGluZ19zdHJpbmcgaXMgY2FsbGVkIGR1cmluZyBzdW1tYXJpemF0aW9uIG9mIHByb2ZpbGluZyBpbmZvcm1hdGlvbgotICAvLyBpbiBvcmRlciB0byBncm91cCBleGVjdXRpb25zIHRvZ2V0aGVyLiBQcm92aWRpbmcgYSB2YWx1ZSBoZXJlIHdpbGwgY2F1c2UgYQotICAvLyBnaXZlbiBvcCB0byBhcHBlYXIgbXVsdGlwbGUgdGltZXMgaXMgdGhlIHByb2ZpbGluZyByZXBvcnQuIFRoaXMgaXMKLSAgLy8gcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgY3VzdG9tIG9wcyB0aGF0IGNhbiBwZXJmb3JtIHNpZ25pZmljYW50bHkKLSAgLy8gZGlmZmVyZW50IGNhbGN1bGF0aW9ucyBkZXBlbmRpbmcgb24gdGhlaXIgYHVzZXItZGF0YWAuCisgIC8vLyBgcHJvZmlsaW5nX3N0cmluZ2AgaXMgY2FsbGVkIGR1cmluZyBzdW1tYXJpemF0aW9uIG9mIHByb2ZpbGluZyBpbmZvcm1hdGlvbgorICAvLy8gaW4gb3JkZXIgdG8gZ3JvdXAgZXhlY3V0aW9ucyB0b2dldGhlci4gUHJvdmlkaW5nIGEgdmFsdWUgaGVyZSB3aWxsIGNhdXNlIGEKKyAgLy8vIGdpdmVuIG9wIHRvIGFwcGVhciBtdWx0aXBsZSB0aW1lcyBpcyB0aGUgcHJvZmlsaW5nIHJlcG9ydC4gVGhpcyBpcworICAvLy8gcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgY3VzdG9tIG9wcyB0aGF0IGNhbiBwZXJmb3JtIHNpZ25pZmljYW50bHkKKyAgLy8vIGRpZmZlcmVudCBjYWxjdWxhdGlvbnMgZGVwZW5kaW5nIG9uIHRoZWlyIGB1c2VyLWRhdGFgLgogICBjb25zdCBjaGFyKiAoKnByb2ZpbGluZ19zdHJpbmcpKGNvbnN0IFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGZMaXRlTm9kZSogbm9kZSk7CiAKLSAgLy8gQnVpbHRpbiBjb2Rlcy4gSWYgdGhpcyBrZXJuZWwgcmVmZXJzIHRvIGEgYnVpbHRpbiB0aGlzIGlzIHRoZSBjb2RlCi0gIC8vIG9mIHRoZSBidWlsdGluLiBUaGlzIGlzIHNvIHdlIGNhbiBkbyBtYXJzaGFsaW5nIHRvIG90aGVyIGZyYW1ld29ya3MgbGlrZQotICAvLyBOTiBBUEkuCi0gIC8vIE5vdGU6IEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgcmVnaXN0cmF0aW9uIGJpbmRlciB0byBzZXQgdGhpcwotICAvLyBwcm9wZXJseS4KKyAgLy8vIEJ1aWx0aW4gY29kZXMuIElmIHRoaXMga2VybmVsIHJlZmVycyB0byBhIGJ1aWx0aW4gdGhpcyBpcyB0aGUgY29kZQorICAvLy8gb2YgdGhlIGJ1aWx0aW4uIFRoaXMgaXMgc28gd2UgY2FuIGRvIG1hcnNoYWxpbmcgdG8gb3RoZXIgZnJhbWV3b3JrcyBsaWtlCisgIC8vLyBOTiBBUEkuCisgIC8vLworICAvLy8gTm90ZTogSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSByZWdpc3RyYXRpb24gYmluZGVyIHRvIHNldCB0aGlzCisgIC8vLyBwcm9wZXJseS4KICAgaW50MzJfdCBidWlsdGluX2NvZGU7CiAKLSAgLy8gQ3VzdG9tIG9wIG5hbWUuIElmIHRoZSBvcCBpcyBhIGJ1aWx0aW4sIHRoaXMgd2lsbCBiZSBudWxsLgotICAvLyBOb3RlOiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIHJlZ2lzdHJhdGlvbiBiaW5kZXIgdG8gc2V0IHRoaXMKLSAgLy8gcHJvcGVybHkuCi0gIC8vIFdBUk5JTkc6IFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGludGVyZmFjZSB0aGF0IGlzIHN1YmplY3QgdG8gY2hhbmdlLgorICAvLy8gQ3VzdG9tIG9wIG5hbWUuIElmIHRoZSBvcCBpcyBhIGJ1aWx0aW4sIHRoaXMgd2lsbCBiZSBgbnVsbGAuCisgIC8vLworICAvLy8gTm90ZTogSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSByZWdpc3RyYXRpb24gYmluZGVyIHRvIHNldCB0aGlzCisgIC8vLyBwcm9wZXJseS4KKyAgLy8vCisgIC8vLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBpbnRlcmZhY2UgdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KICAgY29uc3QgY2hhciogY3VzdG9tX25hbWU7CiAKLSAgLy8gVGhlIHZlcnNpb24gb2YgdGhlIG9wLgotICAvLyBOb3RlOiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIHJlZ2lzdHJhdGlvbiBiaW5kZXIgdG8gc2V0IHRoaXMKLSAgLy8gcHJvcGVybHkuCisgIC8vLyBUaGUgdmVyc2lvbiBvZiB0aGUgb3AuCisgIC8vLyBOb3RlOiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIHJlZ2lzdHJhdGlvbiBiaW5kZXIgdG8gc2V0IHRoaXMKKyAgLy8vIHByb3Blcmx5LgogICBpbnQgdmVyc2lvbjsKIAotICAvLyBUaGUgZXh0ZXJuYWwgdmVyc2lvbiBvZiBgVGZMaXRlUmVnaXN0cmF0aW9uYC4gU2luY2Ugd2UgY2FuJ3QgdXNlIGludGVybmFsCi0gIC8vIHR5cGVzIChzdWNoIGFzIGBUZkxpdGVDb250ZXh0YCkgZm9yIEMgQVBJIHRvIG1haW50YWluIEFCSSBzdGFiaWxpdHkuCi0gIC8vIEMgQVBJIHVzZXIgd2lsbCBwcm92aWRlIGBUZkxpdGVSZWdpc3RyYXRpb25FeHRlcm5hbGAgdG8gaW1wbGVtZW50IGN1c3RvbQotICAvLyBvcHMuIFdlIGtlZXAgaXQgaW5zaWRlIG9mIGBUZkxpdGVSZWdpc3RyYXRpb25gIGFuZCB1c2UgaXQgdG8gcm91dGUKLSAgLy8gY2FsbGJhY2tzIHByb3Blcmx5LgotICBUZkxpdGVSZWdpc3RyYXRpb25FeHRlcm5hbCogcmVnaXN0cmF0aW9uX2V4dGVybmFsOworICAvLy8gVGhlIGV4dGVybmFsIChpLmUuIEFCSS1zdGFibGUpIHZlcnNpb24gb2YgYFRmTGl0ZVJlZ2lzdHJhdGlvbmAuCisgIC8vLyBTaW5jZSB3ZSBjYW4ndCB1c2UgaW50ZXJuYWwgdHlwZXMgKHN1Y2ggYXMgYFRmTGl0ZUNvbnRleHRgKSBmb3IgQyBBUEkgdG8KKyAgLy8vIG1haW50YWluIEFCSSBzdGFiaWxpdHkuICBDIEFQSSB1c2VyIHdpbGwgcHJvdmlkZSBgVGZMaXRlT3BlcmF0b3JgIHRvCisgIC8vLyBpbXBsZW1lbnQgY3VzdG9tIG9wcy4gIFdlIGtlZXAgaXQgaW5zaWRlIG9mIGBUZkxpdGVSZWdpc3RyYXRpb25gIGFuZCB1c2UKKyAgLy8vIGl0IHRvIHJvdXRlIGNhbGxiYWNrcyBwcm9wZXJseS4KKyAgVGZMaXRlT3BlcmF0b3IqIHJlZ2lzdHJhdGlvbl9leHRlcm5hbDsKIAotICAvLyBSZXRyaWV2ZXMgYXN5bmNocm9ub3VzIGtlcm5lbC4KLSAgLy8KLSAgLy8gSWYgdGhlIGBhc3luY19rZXJuZWxgIGZpZWxkIGlzIG51bGxwdHIsIGl0IG1lYW5zIHRoZSBvcGVyYXRpb24gZGVzY3JpYmVkIGJ5Ci0gIC8vIHRoaXMgVGZMaXRlUmVnaXN0cmF0aW9uIG9iamVjdCBkb2VzIG5vdCBzdXBwb3J0IGFzeW5jaHJvbm91cyBleGVjdXRpb24uCi0gIC8vIE90aGVyd2lzZSwgdGhlIGZ1bmN0aW9uIHRoYXQgdGhlIGZpZWxkIHBvaW50cyB0byBzaG91bGQgb25seSBiZSBjYWxsZWQgZm9yCi0gIC8vIGRlbGVnYXRlIGtlcm5lbCBub2RlcywgaS5lLiBgbm9kZWAgc2hvdWxkIGJlIGEgZGVsZWdhdGUga2VybmVsIG5vZGUgY3JlYXRlZAotICAvLyBieSBhcHBseWluZyBhIGRlbGVnYXRlLgotICAvLyBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBudWxscHRyLCB0aGF0IG1lYW5zIHRoYXQgdGhlIHVuZGVybHlpbmcgZGVsZWdhdGUKLSAgLy8gZG9lcyBub3Qgc3VwcG9ydCBhc3luY2hyb25vdXMgZXhlY3V0aW9uIGZvciB0aGlzIGBub2RlYC4KKyAgLy8vIFJldHJpZXZlcyBhc3luY2hyb25vdXMga2VybmVsLgorICAvLy8KKyAgLy8vIElmIHRoZSBgYXN5bmNfa2VybmVsYCBmaWVsZCBpcyBudWxscHRyLCBpdCBtZWFucyB0aGUgb3BlcmF0aW9uIGRlc2NyaWJlZAorICAvLy8gYnkgdGhpcyBUZkxpdGVSZWdpc3RyYXRpb24gb2JqZWN0IGRvZXMgbm90IHN1cHBvcnQgYXN5bmNocm9ub3VzIGV4ZWN1dGlvbi4KKyAgLy8vIE90aGVyd2lzZSwgdGhlIGZ1bmN0aW9uIHRoYXQgdGhlIGZpZWxkIHBvaW50cyB0byBzaG91bGQgb25seSBiZSBjYWxsZWQgZm9yCisgIC8vLyBkZWxlZ2F0ZSBrZXJuZWwgbm9kZXMsIGkuZS4gYG5vZGVgIHNob3VsZCBiZSBhIGRlbGVnYXRlIGtlcm5lbCBub2RlCisgIC8vLyBjcmVhdGVkIGJ5IGFwcGx5aW5nIGEgZGVsZWdhdGUuIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIG51bGxwdHIsIHRoYXQKKyAgLy8vIG1lYW5zIHRoYXQgdGhlIHVuZGVybHlpbmcgZGVsZWdhdGUgZG9lcyBub3Qgc3VwcG9ydCBhc3luY2hyb25vdXMgZXhlY3V0aW9uCisgIC8vLyBmb3IgdGhpcyBgbm9kZWAuCiAgIHN0cnVjdCBUZkxpdGVBc3luY0tlcm5lbCogKCphc3luY19rZXJuZWwpKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRmTGl0ZU5vZGUqIG5vZGUpOwogCi0gIC8vIEluZGljYXRlcyBpZiBhbiBvcGVyYXRvcidzIG91dHB1dCBtYXkgc2FmZWx5IG92ZXJ3cml0ZSBpdHMgaW5wdXRzLgotICAvLyBTZWUgdGhlIGNvbW1lbnRzIGluIGBUZkxpdGVJblBsYWNlT3BgLgorICAvLy8gSW5kaWNhdGVzIGlmIGFuIG9wZXJhdG9yJ3Mgb3V0cHV0IG1heSBzYWZlbHkgb3ZlcndyaXRlIGl0cyBpbnB1dHMuCisgIC8vLyBTZWUgdGhlIGNvbW1lbnRzIGluIGBUZkxpdGVJblBsYWNlT3BgLgogICB1aW50NjRfdCBpbnBsYWNlX29wZXJhdG9yOwogfSBUZkxpdGVSZWdpc3RyYXRpb247CiAKIC8vLyBccHJpdmF0ZQotLy8gT2xkIHZlcnNpb24gb2YgYFRmTGl0ZVJlZ2lzdHJhdGlvbmAgdG8gbWFpbnRhaW4gYmluYXJ5IGJhY2t3YXJkCi0vLyBjb21wYXRpYmlsaXR5LgotLy8gVGhlIGxlZ2FjeSByZWdpc3RyYXRpb24gdHlwZSBtdXN0IGJlIGEgUE9EIHN0cnVjdCB0eXBlIHdob3NlIGZpZWxkIHR5cGVzIG11c3QKLS8vIGJlIGEgcHJlZml4IG9mIHRoZSBmaWVsZCB0eXBlcyBpbiBUZkxpdGVSZWdpc3RyYXRpb24sIGFuZCBvZmZzZXQgb2YgdGhlIGZpcnN0Ci0vLyBmaWVsZCBpbiBUZkxpdGVSZWdpc3RyYXRpb24gdGhhdCBpcyBub3QgcHJlc2VudCBpbiB0aGUgbGVnYWN5IHJlZ2lzdHJhdGlvbgotLy8gdHlwZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgbGVnYWN5IHJlZ2lzdHJhdGlvbgotLy8gdHlwZS4KLS8vIFdBUk5JTkc6IFRoaXMgc3RydWN0dXJlIGlzIGRlcHJlY2F0ZWQgLyBub3QgYW4gb2ZmaWNpYWwgcGFydCBvZiB0aGUKLS8vIEFQSS4gSXQgc2hvdWxkIGJlIG9ubHkgdXNlZCBmb3IgYmluYXJ5IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisvLy8gT2xkIHZlcnNpb24gb2YgYFRmTGl0ZVJlZ2lzdHJhdGlvbmAgdG8gbWFpbnRhaW4gYmluYXJ5IGJhY2t3YXJkCisvLy8gY29tcGF0aWJpbGl0eS4KKy8vLyBUaGUgbGVnYWN5IHJlZ2lzdHJhdGlvbiB0eXBlIG11c3QgYmUgYSBQT0Qgc3RydWN0IHR5cGUgd2hvc2UgZmllbGQgdHlwZXMKKy8vLyBtdXN0IGJlIGEgcHJlZml4IG9mIHRoZSBmaWVsZCB0eXBlcyBpbiBUZkxpdGVSZWdpc3RyYXRpb24sIGFuZCBvZmZzZXQgb2YgdGhlCisvLy8gZmlyc3QgZmllbGQgaW4gVGZMaXRlUmVnaXN0cmF0aW9uIHRoYXQgaXMgbm90IHByZXNlbnQgaW4gdGhlIGxlZ2FjeQorLy8vIHJlZ2lzdHJhdGlvbiB0eXBlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSBsZWdhY3kKKy8vLyByZWdpc3RyYXRpb24gdHlwZS4KKy8vLworLy8vIFdBUk5JTkc6IFRoaXMgc3RydWN0dXJlIGlzIGRlcHJlY2F0ZWQgLyBub3QgYW4gb2ZmaWNpYWwgcGFydCBvZiB0aGUKKy8vLyBBUEkuIEl0IHNob3VsZCBiZSBvbmx5IHVzZWQgZm9yIGJpbmFyeSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgogdHlwZWRlZiBzdHJ1Y3QgVGZMaXRlUmVnaXN0cmF0aW9uX1YzIHsKICAgdm9pZCogKCppbml0KShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpOwogICB2b2lkICgqZnJlZSkoVGZMaXRlQ29udGV4dCogY29udGV4dCwgdm9pZCogYnVmZmVyKTsKQEAgLTEwODQsMjEgKzEyMTEsMjIgQEAKICAgaW50MzJfdCBidWlsdGluX2NvZGU7CiAgIGNvbnN0IGNoYXIqIGN1c3RvbV9uYW1lOwogICBpbnQgdmVyc2lvbjsKLSAgVGZMaXRlUmVnaXN0cmF0aW9uRXh0ZXJuYWwqIHJlZ2lzdHJhdGlvbl9leHRlcm5hbDsKKyAgVGZMaXRlT3BlcmF0b3IqIHJlZ2lzdHJhdGlvbl9leHRlcm5hbDsKICAgc3RydWN0IFRmTGl0ZUFzeW5jS2VybmVsKiAoKmFzeW5jX2tlcm5lbCkoVGZMaXRlQ29udGV4dCogY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGZMaXRlTm9kZSogbm9kZSk7CiB9IFRmTGl0ZVJlZ2lzdHJhdGlvbl9WMzsKIAogLy8vIFxwcml2YXRlCi0vLyBPbGQgdmVyc2lvbiBvZiBgVGZMaXRlUmVnaXN0cmF0aW9uYCB0byBtYWludGFpbiBiaW5hcnkgYmFja3dhcmQKLS8vIGNvbXBhdGliaWxpdHkuCi0vLyBUaGUgbGVnYWN5IHJlZ2lzdHJhdGlvbiB0eXBlIG11c3QgYmUgYSBQT0Qgc3RydWN0IHR5cGUgd2hvc2UgZmllbGQgdHlwZXMgbXVzdAotLy8gYmUgYSBwcmVmaXggb2YgdGhlIGZpZWxkIHR5cGVzIGluIFRmTGl0ZVJlZ2lzdHJhdGlvbiwgYW5kIG9mZnNldCBvZiB0aGUgZmlyc3QKLS8vIGZpZWxkIGluIFRmTGl0ZVJlZ2lzdHJhdGlvbiB0aGF0IGlzIG5vdCBwcmVzZW50IGluIHRoZSBsZWdhY3kgcmVnaXN0cmF0aW9uCi0vLyB0eXBlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSBsZWdhY3kgcmVnaXN0cmF0aW9uCi0vLyB0eXBlLgotLy8gV0FSTklORzogVGhpcyBzdHJ1Y3R1cmUgaXMgZGVwcmVjYXRlZCAvIG5vdCBhbiBvZmZpY2lhbCBwYXJ0IG9mIHRoZQotLy8gQVBJLiBJdCBzaG91bGQgYmUgb25seSB1c2VkIGZvciBiaW5hcnkgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKy8vLyBPbGQgdmVyc2lvbiBvZiBgVGZMaXRlUmVnaXN0cmF0aW9uYCB0byBtYWludGFpbiBiaW5hcnkgYmFja3dhcmQKKy8vLyBjb21wYXRpYmlsaXR5LgorLy8vIFRoZSBsZWdhY3kgcmVnaXN0cmF0aW9uIHR5cGUgbXVzdCBiZSBhIFBPRCBzdHJ1Y3QgdHlwZSB3aG9zZSBmaWVsZCB0eXBlcworLy8vIG11c3QgYmUgYSBwcmVmaXggb2YgdGhlIGZpZWxkIHR5cGVzIGluIFRmTGl0ZVJlZ2lzdHJhdGlvbiwgYW5kIG9mZnNldCBvZiB0aGUKKy8vLyBmaXJzdCBmaWVsZCBpbiBUZkxpdGVSZWdpc3RyYXRpb24gdGhhdCBpcyBub3QgcHJlc2VudCBpbiB0aGUgbGVnYWN5CisvLy8gcmVnaXN0cmF0aW9uIHR5cGUgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIGxlZ2FjeQorLy8vIHJlZ2lzdHJhdGlvbiB0eXBlLgorLy8vCisvLy8gV0FSTklORzogVGhpcyBzdHJ1Y3R1cmUgaXMgZGVwcmVjYXRlZCAvIG5vdCBhbiBvZmZpY2lhbCBwYXJ0IG9mIHRoZQorLy8vIEFQSS4gSXQgc2hvdWxkIGJlIG9ubHkgdXNlZCBmb3IgYmluYXJ5IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCiB0eXBlZGVmIHN0cnVjdCBUZkxpdGVSZWdpc3RyYXRpb25fVjIgewogICB2b2lkKiAoKmluaXQpKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCk7CiAgIHZvaWQgKCpmcmVlKShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCB2b2lkKiBidWZmZXIpOwpAQCAtMTEwOSwxOSArMTIzNywyMCBAQAogICBpbnQzMl90IGJ1aWx0aW5fY29kZTsKICAgY29uc3QgY2hhciogY3VzdG9tX25hbWU7CiAgIGludCB2ZXJzaW9uOwotICBUZkxpdGVSZWdpc3RyYXRpb25FeHRlcm5hbCogcmVnaXN0cmF0aW9uX2V4dGVybmFsOworICBUZkxpdGVPcGVyYXRvciogcmVnaXN0cmF0aW9uX2V4dGVybmFsOwogfSBUZkxpdGVSZWdpc3RyYXRpb25fVjI7CiAKIC8vLyBccHJpdmF0ZQotLy8gT2xkIHZlcnNpb24gb2YgYFRmTGl0ZVJlZ2lzdHJhdGlvbmAgdG8gbWFpbnRhaW4gYmluYXJ5IGJhY2t3YXJkCi0vLyBjb21wYXRpYmlsaXR5LgotLy8gVGhlIGxlZ2FjeSByZWdpc3RyYXRpb24gdHlwZSBtdXN0IGJlIGEgUE9EIHN0cnVjdCB0eXBlIHdob3NlIGZpZWxkIHR5cGVzIG11c3QKLS8vIGJlIGEgcHJlZml4IG9mIHRoZSBmaWVsZCB0eXBlcyBpbiBUZkxpdGVSZWdpc3RyYXRpb24sIGFuZCBvZmZzZXQgb2YgdGhlIGZpcnN0Ci0vLyBmaWVsZCBpbiBUZkxpdGVSZWdpc3RyYXRpb24gdGhhdCBpcyBub3QgcHJlc2VudCBpbiB0aGUgbGVnYWN5IHJlZ2lzdHJhdGlvbgotLy8gdHlwZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgbGVnYWN5IHJlZ2lzdHJhdGlvbgotLy8gdHlwZS4KLS8vIFdBUk5JTkc6IFRoaXMgc3RydWN0dXJlIGlzIGRlcHJlY2F0ZWQgLyBub3QgYW4gb2ZmaWNpYWwgcGFydCBvZiB0aGUKLS8vIEFQSS4gSXQgc2hvdWxkIGJlIG9ubHkgdXNlZCBmb3IgYmluYXJ5IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisvLy8gT2xkIHZlcnNpb24gb2YgYFRmTGl0ZVJlZ2lzdHJhdGlvbmAgdG8gbWFpbnRhaW4gYmluYXJ5IGJhY2t3YXJkCisvLy8gY29tcGF0aWJpbGl0eS4KKy8vLyBUaGUgbGVnYWN5IHJlZ2lzdHJhdGlvbiB0eXBlIG11c3QgYmUgYSBQT0Qgc3RydWN0IHR5cGUgd2hvc2UgZmllbGQgdHlwZXMKKy8vLyBtdXN0IGJlIGEgcHJlZml4IG9mIHRoZSBmaWVsZCB0eXBlcyBpbiBUZkxpdGVSZWdpc3RyYXRpb24sIGFuZCBvZmZzZXQgb2YgdGhlCisvLy8gZmlyc3QgZmllbGQgaW4gVGZMaXRlUmVnaXN0cmF0aW9uIHRoYXQgaXMgbm90IHByZXNlbnQgaW4gdGhlIGxlZ2FjeQorLy8vIHJlZ2lzdHJhdGlvbiB0eXBlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSBsZWdhY3kKKy8vLyByZWdpc3RyYXRpb24gdHlwZS4KKy8vLworLy8vIFdBUk5JTkc6IFRoaXMgc3RydWN0dXJlIGlzIGRlcHJlY2F0ZWQgLyBub3QgYW4gb2ZmaWNpYWwgcGFydCBvZiB0aGUKKy8vLyBBUEkuIEl0IHNob3VsZCBiZSBvbmx5IHVzZWQgZm9yIGJpbmFyeSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgogdHlwZWRlZiBzdHJ1Y3QgVGZMaXRlUmVnaXN0cmF0aW9uX1YxIHsKICAgdm9pZCogKCppbml0KShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpOwogICB2b2lkICgqZnJlZSkoVGZMaXRlQ29udGV4dCogY29udGV4dCwgdm9pZCogYnVmZmVyKTsKQEAgLTExMzQsMTg0ICsxMjYzLDIwMiBAQAogICBpbnQgdmVyc2lvbjsKIH0gVGZMaXRlUmVnaXN0cmF0aW9uX1YxOwogCi0vLyBUaGUgZmxhZ3MgdXNlZCBpbiBgVGZMaXRlRGVsZWdhdGVgLiBOb3RlIHRoYXQgdGhpcyBpcyBhIGJpdG1hc2ssIHNvIHRoZQotLy8gdmFsdWVzIHNob3VsZCBiZSAxLCAyLCA0LCA4LCAuLi5ldGMuCisvLy8gVGhlIGZsYWdzIHVzZWQgaW4gYFRmTGl0ZURlbGVnYXRlYC4gTm90ZSB0aGF0IHRoaXMgaXMgYSBiaXRtYXNrLCBzbyB0aGUKKy8vLyB2YWx1ZXMgc2hvdWxkIGJlIDEsIDIsIDQsIDgsIC4uLmV0Yy4KIHR5cGVkZWYgZW51bSBUZkxpdGVEZWxlZ2F0ZUZsYWdzIHsKICAga1RmTGl0ZURlbGVnYXRlRmxhZ3NOb25lID0gMCwKLSAgLy8gVGhlIGZsYWcgaXMgc2V0IGlmIHRoZSBkZWxlZ2F0ZSBjYW4gaGFuZGxlIGR5bmFtaWMgc2l6ZWQgdGVuc29ycy4KLSAgLy8gRm9yIGV4YW1wbGUsIHRoZSBvdXRwdXQgc2hhcGUgb2YgYSBgUmVzaXplYCBvcCB3aXRoIG5vbi1jb25zdGFudCBzaGFwZQotICAvLyBjYW4gb25seSBiZSBpbmZlcnJlZCB3aGVuIHRoZSBvcCBpcyBpbnZva2VkLgotICAvLyBJbiB0aGlzIGNhc2UsIHRoZSBEZWxlZ2F0ZSBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZwotICAvLyBgU2V0VGVuc29yVG9EeW5hbWljYCB0byBtYXJrIHRoZSB0ZW5zb3IgYXMgYSBkeW5hbWljIHRlbnNvciwgYW5kIGNhbGxpbmcKLSAgLy8gYFJlc2l6ZVRlbnNvcmAgd2hlbiBpbnZva2luZyB0aGUgb3AuCi0gIC8vCi0gIC8vIElmIHRoZSBkZWxlZ2F0ZSBpc24ndCBjYXBhYmxlIHRvIGhhbmRsZSBkeW5hbWljIHRlbnNvcnMsIHRoaXMgZmxhZyBuZWVkCi0gIC8vIHRvIGJlIHNldCB0byBmYWxzZS4KKyAgLy8vIFRoZSBmbGFnIGlzIHNldCBpZiB0aGUgZGVsZWdhdGUgY2FuIGhhbmRsZSBkeW5hbWljIHNpemVkIHRlbnNvcnMuCisgIC8vLyBGb3IgZXhhbXBsZSwgdGhlIG91dHB1dCBzaGFwZSBvZiBhIGBSZXNpemVgIG9wIHdpdGggbm9uLWNvbnN0YW50IHNoYXBlCisgIC8vLyBjYW4gb25seSBiZSBpbmZlcnJlZCB3aGVuIHRoZSBvcCBpcyBpbnZva2VkLgorICAvLy8gSW4gdGhpcyBjYXNlLCB0aGUgRGVsZWdhdGUgaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcKKyAgLy8vIGBTZXRUZW5zb3JUb0R5bmFtaWNgIHRvIG1hcmsgdGhlIHRlbnNvciBhcyBhIGR5bmFtaWMgdGVuc29yLCBhbmQgY2FsbGluZworICAvLy8gYFJlc2l6ZVRlbnNvcmAgd2hlbiBpbnZva2luZyB0aGUgb3AuCisgIC8vLworICAvLy8gSWYgdGhlIGRlbGVnYXRlIGlzbid0IGNhcGFibGUgdG8gaGFuZGxlIGR5bmFtaWMgdGVuc29ycywgdGhpcyBmbGFnIG5lZWQKKyAgLy8vIHRvIGJlIHNldCB0byBmYWxzZS4KICAga1RmTGl0ZURlbGVnYXRlRmxhZ3NBbGxvd0R5bmFtaWNUZW5zb3JzID0gMSwKIAotICAvLyBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgYnkgZGVsZWdhdGVzICh0aGF0IGFsbG93IGR5bmFtaWMgdGVuc29ycykgdG8gZW5zdXJlCi0gIC8vIGFwcGxpY2FibGUgdGVuc29yIHNoYXBlcyBhcmUgYXV0b21hdGljYWxseSBwcm9wYWdhdGVkIGluIHRoZSBjYXNlIG9mIHRlbnNvcgotICAvLyByZXNpemluZy4KLSAgLy8gVGhpcyBtZWFucyB0aGF0IG5vbi1keW5hbWljIChhbGxvY2F0aW9uX3R5cGUgIT0ga1RmTGl0ZUR5bmFtaWMpIEkvTyB0ZW5zb3JzCi0gIC8vIG9mIGEgZGVsZWdhdGUga2VybmVsIHdpbGwgaGF2ZSBjb3JyZWN0IHNoYXBlcyBiZWZvcmUgaXRzIFByZXBhcmUoKSBtZXRob2QKLSAgLy8gaXMgY2FsbGVkLiBUaGUgcnVudGltZSBsZXZlcmFnZXMgVEZMaXRlIGJ1aWx0aW4gb3BzIGluIHRoZSBvcmlnaW5hbAotICAvLyBleGVjdXRpb24gcGxhbiB0byBwcm9wYWdhdGUgc2hhcGVzLgotICAvLwotICAvLyBBIGZldyBwb2ludHMgdG8gbm90ZToKLSAgLy8gMS4gVGhpcyByZXF1aXJlcyBrVGZMaXRlRGVsZWdhdGVGbGFnc0FsbG93RHluYW1pY1RlbnNvcnMuIElmIHRoYXQgZmxhZyBpcwotICAvLyBmYWxzZSwgdGhpcyBvbmUgaXMgcmVkdW5kYW50IHNpbmNlIHRoZSBkZWxlZ2F0ZSBrZXJuZWxzIGFyZSByZS1pbml0aWFsaXplZAotICAvLyBldmVyeSB0aW1lIHRlbnNvcnMgYXJlIHJlc2l6ZWQuCi0gIC8vIDIuIEVuYWJsaW5nIHRoaXMgZmxhZyBhZGRzIHNvbWUgb3ZlcmhlYWQgdG8gQWxsb2NhdGVUZW5zb3JzKCksIHNpbmNlIGV4dHJhCi0gIC8vIHdvcmsgaXMgcmVxdWlyZWQgdG8gcHJlcGFyZSB0aGUgb3JpZ2luYWwgZXhlY3V0aW9uIHBsYW4uCi0gIC8vIDMuIFRoaXMgZmxhZyByZXF1aXJlcyB0aGF0IHRoZSBvcmlnaW5hbCBleGVjdXRpb24gcGxhbiBvbmx5IGhhdmUgb3BzIHdpdGgKLSAgLy8gdmFsaWQgcmVnaXN0cmF0aW9ucyAoYW5kIG5vdCAnZHVtbXknIGN1c3RvbSBvcHMgbGlrZSB3aXRoIEZsZXgpLgotICAvLyBXQVJOSU5HOiBUaGlzIGZlYXR1cmUgaXMgZXhwZXJpbWVudGFsIGFuZCBzdWJqZWN0IHRvIGNoYW5nZS4KKyAgLy8vIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCBieSBkZWxlZ2F0ZXMgKHRoYXQgYWxsb3cgZHluYW1pYyB0ZW5zb3JzKSB0byBlbnN1cmUKKyAgLy8vIGFwcGxpY2FibGUgdGVuc29yIHNoYXBlcyBhcmUgYXV0b21hdGljYWxseSBwcm9wYWdhdGVkIGluIHRoZSBjYXNlIG9mCisgIC8vLyB0ZW5zb3IgcmVzaXppbmcuIFRoaXMgbWVhbnMgdGhhdCBub24tZHluYW1pYyAoYWxsb2NhdGlvbl90eXBlICE9CisgIC8vLyBrVGZMaXRlRHluYW1pYykgSS9PIHRlbnNvcnMgb2YgYSBkZWxlZ2F0ZSBrZXJuZWwgd2lsbCBoYXZlIGNvcnJlY3Qgc2hhcGVzCisgIC8vLyBiZWZvcmUgaXRzIFByZXBhcmUoKSBtZXRob2QgaXMgY2FsbGVkLiBUaGUgcnVudGltZSBsZXZlcmFnZXMgVEZMaXRlCisgIC8vLyBidWlsdGluIG9wcyBpbiB0aGUgb3JpZ2luYWwgZXhlY3V0aW9uIHBsYW4gdG8gcHJvcGFnYXRlIHNoYXBlcy4KKyAgLy8vCisgIC8vLyBBIGZldyBwb2ludHMgdG8gbm90ZToKKyAgLy8vIDEuIFRoaXMgcmVxdWlyZXMga1RmTGl0ZURlbGVnYXRlRmxhZ3NBbGxvd0R5bmFtaWNUZW5zb3JzLiBJZiB0aGF0IGZsYWcgaXMKKyAgLy8vIGZhbHNlLCB0aGlzIG9uZSBpcyByZWR1bmRhbnQgc2luY2UgdGhlIGRlbGVnYXRlIGtlcm5lbHMgYXJlIHJlLWluaXRpYWxpemVkCisgIC8vLyBldmVyeSB0aW1lIHRlbnNvcnMgYXJlIHJlc2l6ZWQuCisgIC8vLyAyLiBFbmFibGluZyB0aGlzIGZsYWcgYWRkcyBzb21lIG92ZXJoZWFkIHRvIEFsbG9jYXRlVGVuc29ycygpLCBzaW5jZSBleHRyYQorICAvLy8gd29yayBpcyByZXF1aXJlZCB0byBwcmVwYXJlIHRoZSBvcmlnaW5hbCBleGVjdXRpb24gcGxhbi4KKyAgLy8vIDMuIFRoaXMgZmxhZyByZXF1aXJlcyB0aGF0IHRoZSBvcmlnaW5hbCBleGVjdXRpb24gcGxhbiBvbmx5IGhhdmUgb3BzIHdpdGgKKyAgLy8vIHZhbGlkIHJlZ2lzdHJhdGlvbnMgKGFuZCBub3QgJ2R1bW15JyBjdXN0b20gb3BzIGxpa2Ugd2l0aCBGbGV4KS4KKyAgLy8vCisgIC8vLyBXQVJOSU5HOiBUaGlzIGZlYXR1cmUgaXMgZXhwZXJpbWVudGFsIGFuZCBzdWJqZWN0IHRvIGNoYW5nZS4KICAga1RmTGl0ZURlbGVnYXRlRmxhZ3NSZXF1aXJlUHJvcGFnYXRlZFNoYXBlcyA9IDIsCiAKLSAgLy8gVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGJ5IGRlbGVnYXRlcyB0byByZXF1ZXN0IHBlci1vcGVyYXRvciBwcm9maWxpbmcuIElmIGEKLSAgLy8gbm9kZSBpcyBhIGRlbGVnYXRlIG5vZGUsIHRoaXMgZmxhZyB3aWxsIGJlIGNoZWNrZWQgYmVmb3JlIHByb2ZpbGluZy4gSWYKLSAgLy8gc2V0LCB0aGVuIHRoZSBub2RlIHdpbGwgbm90IGJlIHByb2ZpbGVkLiBUaGUgZGVsZWdhdGUgd2lsbCB0aGVuIGFkZCBwZXIKLSAgLy8gb3BlcmF0b3IgaW5mb3JtYXRpb24gdXNpbmcgUHJvZmlsZXI6OkV2ZW50VHlwZTo6T1BFUkFUT1JfSU5WT0tFX0VWRU5UIGFuZAotICAvLyB0aGUgcmVzdWx0cyB3aWxsIGFwcGVhciBpbiB0aGUgb3BlcmF0b3Itd2lzZSBQcm9maWxpbmcgc2VjdGlvbiBhbmQgbm90IGluCi0gIC8vIHRoZSBEZWxlZ2F0ZSBpbnRlcm5hbCBzZWN0aW9uLgorICAvLy8gVGhpcyBmbGFnIGNhbiBiZSB1c2VkIGJ5IGRlbGVnYXRlcyB0byByZXF1ZXN0IHBlci1vcGVyYXRvciBwcm9maWxpbmcuIElmIGEKKyAgLy8vIG5vZGUgaXMgYSBkZWxlZ2F0ZSBub2RlLCB0aGlzIGZsYWcgd2lsbCBiZSBjaGVja2VkIGJlZm9yZSBwcm9maWxpbmcuIElmCisgIC8vLyBzZXQsIHRoZW4gdGhlIG5vZGUgd2lsbCBub3QgYmUgcHJvZmlsZWQuIFRoZSBkZWxlZ2F0ZSB3aWxsIHRoZW4gYWRkIHBlcgorICAvLy8gb3BlcmF0b3IgaW5mb3JtYXRpb24gdXNpbmcgYFByb2ZpbGVyOjpFdmVudFR5cGU6Ok9QRVJBVE9SX0lOVk9LRV9FVkVOVGAKKyAgLy8vIGFuZCB0aGUgcmVzdWx0cyB3aWxsIGFwcGVhciBpbiB0aGUgb3BlcmF0b3Itd2lzZSBQcm9maWxpbmcgc2VjdGlvbiBhbmQgbm90CisgIC8vLyBpbiB0aGUgRGVsZWdhdGUgaW50ZXJuYWwgc2VjdGlvbi4KICAga1RmTGl0ZURlbGVnYXRlRmxhZ3NQZXJPcGVyYXRvclByb2ZpbGluZyA9IDQKIH0gVGZMaXRlRGVsZWdhdGVGbGFnczsKIAotLy8gV0FSTklORzogVGhpcyBpcyBhbiBleHBlcmltZW50YWwgaW50ZXJmYWNlIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCisvLy8gV0FSTklORzogVGhpcyBpcyBhbiBleHBlcmltZW50YWwgaW50ZXJmYWNlIHRoYXQgaXMgc3ViamVjdCB0byBjaGFuZ2UuCiB0eXBlZGVmIHN0cnVjdCBUZkxpdGVEZWxlZ2F0ZSB7Ci0gIC8vIERhdGEgdGhhdCBkZWxlZ2F0ZSBuZWVkcyB0byBpZGVudGlmeSBpdHNlbGYuIFRoaXMgZGF0YSBpcyBvd25lZCBieSB0aGUKLSAgLy8gZGVsZWdhdGUuIFRoZSBkZWxlZ2F0ZSBpcyBvd25lZCBpbiB0aGUgdXNlciBjb2RlLCBzbyB0aGUgZGVsZWdhdGUgaXMKLSAgLy8gcmVzcG9uc2libGUgZm9yIGRlYWxsb2NhdGluZyB0aGlzIHdoZW4gaXQgaXMgZGVzdHJveWVkLgorICAvLy8gRGF0YSB0aGF0IGRlbGVnYXRlIG5lZWRzIHRvIGlkZW50aWZ5IGl0c2VsZi4gVGhpcyBkYXRhIGlzIG93bmVkIGJ5IHRoZQorICAvLy8gZGVsZWdhdGUuIFRoZSBkZWxlZ2F0ZSBpcyBvd25lZCBpbiB0aGUgdXNlciBjb2RlLCBzbyB0aGUgZGVsZWdhdGUgaXMKKyAgLy8vIHJlc3BvbnNpYmxlIGZvciBkZWFsbG9jYXRpbmcgdGhpcyB3aGVuIGl0IGlzIGRlc3Ryb3llZC4KICAgdm9pZCogZGF0YV87CiAKLSAgLy8gSW52b2tlZCBieSBNb2RpZnlHcmFwaFdpdGhEZWxlZ2F0ZS4gVGhpcyBwcmVwYXJlIGlzIGNhbGxlZCwgZ2l2aW5nIHRoZQotICAvLyBkZWxlZ2F0ZSBhIHZpZXcgb2YgdGhlIGN1cnJlbnQgZ3JhcGggdGhyb3VnaCBUZkxpdGVDb250ZXh0Ki4gSXQgdHlwaWNhbGx5Ci0gIC8vIHdpbGwgbG9vayBhdCB0aGUgbm9kZXMgYW5kIGNhbGwgUmVwbGFjZU5vZGVTdWJzZXRzV2l0aERlbGVnYXRlS2VybmVscygpCi0gIC8vIHRvIGFzayB0aGUgVGVuc29yRmxvdyBsaXRlIHJ1bnRpbWUgdG8gY3JlYXRlIG1hY3JvLW5vZGVzIHRvIHJlcHJlc2VudAotICAvLyBkZWxlZ2F0ZWQgc3ViZ3JhcGhzIG9mIHRoZSBvcmlnaW5hbCBncmFwaC4KKyAgLy8vIEludm9rZWQgYnkgYE1vZGlmeUdyYXBoV2l0aERlbGVnYXRlYC4gVGhpcyBwcmVwYXJlIGlzIGNhbGxlZCwgZ2l2aW5nIHRoZQorICAvLy8gZGVsZWdhdGUgYSB2aWV3IG9mIHRoZSBjdXJyZW50IGdyYXBoIHRocm91Z2ggYFRmTGl0ZUNvbnRleHQqYC4gSXQKKyAgLy8vIHR5cGljYWxseSB3aWxsIGxvb2sgYXQgdGhlIG5vZGVzIGFuZCBjYWxsCisgIC8vLyBgUmVwbGFjZU5vZGVTdWJzZXRzV2l0aERlbGVnYXRlS2VybmVscygpYCB0byBhc2sgdGhlIFRlbnNvckZsb3cgbGl0ZQorICAvLy8gcnVudGltZSB0byBjcmVhdGUgbWFjcm8tbm9kZXMgdG8gcmVwcmVzZW50IGRlbGVnYXRlZCBzdWJncmFwaHMgb2YgdGhlCisgIC8vLyBvcmlnaW5hbCBncmFwaC4KICAgVGZMaXRlU3RhdHVzICgqUHJlcGFyZSkoVGZMaXRlQ29udGV4dCogY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFRmTGl0ZURlbGVnYXRlKiBkZWxlZ2F0ZSk7CiAKLSAgLy8gQ29weSB0aGUgZGF0YSBmcm9tIGRlbGVnYXRlIGJ1ZmZlciBoYW5kbGUgaW50byByYXcgbWVtb3J5IG9mIHRoZSBnaXZlbgotICAvLyAndGVuc29yJy4gTm90ZSB0aGF0IHRoZSBkZWxlZ2F0ZSBpcyBhbGxvd2VkIHRvIGFsbG9jYXRlIHRoZSByYXcgYnl0ZXMgYXMKLSAgLy8gbG9uZyBhcyBpdCBmb2xsb3dzIHRoZSBydWxlcyBmb3Iga1RmTGl0ZUR5bmFtaWMgdGVuc29ycywgaW4gd2hpY2ggY2FzZSB0aGlzCi0gIC8vIGNhbm5vdCBiZSBudWxsLgorICAvLy8gQ29weSB0aGUgZGF0YSBmcm9tIGRlbGVnYXRlIGJ1ZmZlciBoYW5kbGUgaW50byByYXcgbWVtb3J5IG9mIHRoZSBnaXZlbgorICAvLy8gYHRlbnNvcmAuIE5vdGUgdGhhdCB0aGUgZGVsZWdhdGUgaXMgYWxsb3dlZCB0byBhbGxvY2F0ZSB0aGUgcmF3IGJ5dGVzIGFzCisgIC8vLyBsb25nIGFzIGl0IGZvbGxvd3MgdGhlIHJ1bGVzIGZvciBga1RmTGl0ZUR5bmFtaWNgIHRlbnNvcnMsIGluIHdoaWNoIGNhc2UKKyAgLy8vIHRoaXMgY2Fubm90IGJlIG51bGwuCiAgIFRmTGl0ZVN0YXR1cyAoKkNvcHlGcm9tQnVmZmVySGFuZGxlKShUZkxpdGVDb250ZXh0KiBjb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFRmTGl0ZURlbGVnYXRlKiBkZWxlZ2F0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRmTGl0ZUJ1ZmZlckhhbmRsZSBidWZmZXJfaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGZMaXRlVGVuc29yKiB0ZW5zb3IpOwogCi0gIC8vIENvcHkgdGhlIGRhdGEgZnJvbSByYXcgbWVtb3J5IG9mIHRoZSBnaXZlbiAndGVuc29yJyB0byBkZWxlZ2F0ZSBidWZmZXIKLSAgLy8gaGFuZGxlLiBUaGlzIGNhbiBiZSBudWxsIGlmIHRoZSBkZWxlZ2F0ZSBkb2Vzbid0IHVzZSBpdHMgb3duIGJ1ZmZlci4KKyAgLy8vIENvcHkgdGhlIGRhdGEgZnJvbSByYXcgbWVtb3J5IG9mIHRoZSBnaXZlbiBgdGVuc29yYCB0byBkZWxlZ2F0ZSBidWZmZXIKKyAgLy8vIGhhbmRsZS4gVGhpcyBjYW4gYmUgbnVsbCBpZiB0aGUgZGVsZWdhdGUgZG9lc24ndCB1c2UgaXRzIG93biBidWZmZXIuCiAgIFRmTGl0ZVN0YXR1cyAoKkNvcHlUb0J1ZmZlckhhbmRsZSkoVGZMaXRlQ29udGV4dCogY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgVGZMaXRlRGVsZWdhdGUqIGRlbGVnYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRmTGl0ZUJ1ZmZlckhhbmRsZSBidWZmZXJfaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRmTGl0ZVRlbnNvciogdGVuc29yKTsKIAotICAvLyBGcmVlIHRoZSBEZWxlZ2F0ZSBCdWZmZXIgSGFuZGxlLiBOb3RlOiBUaGlzIG9ubHkgZnJlZXMgdGhlIGhhbmRsZSwgYnV0Ci0gIC8vIHRoaXMgZG9lc24ndCByZWxlYXNlIHRoZSB1bmRlcmx5aW5nIHJlc291cmNlIChlLmcuIHRleHR1cmVzKS4gVGhlCi0gIC8vIHJlc291cmNlcyBhcmUgZWl0aGVyIG93bmVkIGJ5IGFwcGxpY2F0aW9uIGxheWVyIG9yIHRoZSBkZWxlZ2F0ZS4KLSAgLy8gVGhpcyBjYW4gYmUgbnVsbCBpZiB0aGUgZGVsZWdhdGUgZG9lc24ndCB1c2UgaXRzIG93biBidWZmZXIuCisgIC8vLyBGcmVlIHRoZSBEZWxlZ2F0ZSBCdWZmZXIgSGFuZGxlLiBOb3RlOiBUaGlzIG9ubHkgZnJlZXMgdGhlIGhhbmRsZSwgYnV0CisgIC8vLyB0aGlzIGRvZXNuJ3QgcmVsZWFzZSB0aGUgdW5kZXJseWluZyByZXNvdXJjZSAoZS5nLiB0ZXh0dXJlcykuIFRoZQorICAvLy8gcmVzb3VyY2VzIGFyZSBlaXRoZXIgb3duZWQgYnkgYXBwbGljYXRpb24gbGF5ZXIgb3IgdGhlIGRlbGVnYXRlLgorICAvLy8gVGhpcyBjYW4gYmUgbnVsbCBpZiB0aGUgZGVsZWdhdGUgZG9lc24ndCB1c2UgaXRzIG93biBidWZmZXIuCiAgIHZvaWQgKCpGcmVlQnVmZmVySGFuZGxlKShUZkxpdGVDb250ZXh0KiBjb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IFRmTGl0ZURlbGVnYXRlKiBkZWxlZ2F0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRmTGl0ZUJ1ZmZlckhhbmRsZSogaGFuZGxlKTsKIAotICAvLyBCaXRtYXNrIGZsYWdzLiBTZWUgdGhlIGNvbW1lbnRzIGluIGBUZkxpdGVEZWxlZ2F0ZUZsYWdzYC4KKyAgLy8vIEJpdG1hc2sgZmxhZ3MuIFNlZSB0aGUgY29tbWVudHMgaW4gYFRmTGl0ZURlbGVnYXRlRmxhZ3NgLgogICBpbnQ2NF90IGZsYWdzOwogCi0gIC8vIFRoZSBvcGFxdWUgZGVsZWdhdGUgYnVpbGRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBvYmplY3QuICBJZiBzZXQgdGhlbiB0aGUKLSAgLy8gVEYgTGl0ZSBydW50aW1lIHdpbGwgZ2l2ZSBwcmVjZWRlbmNlIHRvIHRoaXMgZmllbGQuICBFLmcuIGluc3RlYWQgb2YKLSAgLy8gaW52b2tpbmcgJ1ByZXBhcmUnIHZpYSB0aGUgZnVuY3Rpb24gcG9pbnRlciBpbnNpZGUgdGhlICdUZkxpdGVEZWxlZ2F0ZScKLSAgLy8gb2JqZWN0LCB0aGUgcnVudGltZSB3aWxsIGZpcnN0IGNoZWNrIGlmIHRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uCi0gIC8vIHBvaW50ZXIgaW5zaWRlICdvcGFxdWVfZGVsZWdhdGVfYnVpbGRlcicgaXMgc2V0IGFuZCBpZiBzbyBpbnZva2UgdGhhdC4KLSAgLy8KLSAgLy8gSWYgdGhpcyBmaWVsZCBpcyBub24tbnVsbCwgdGhlbiB0aGUgJ1ByZXBhcmUnIGZpZWxkIChvZiB0aGUKLSAgLy8gJ1RmTGl0ZURlbGVnYXRlJykgc2hvdWxkIGJlIG51bGwuCisgIC8vLyBUaGUgb3BhcXVlIGRlbGVnYXRlIGJ1aWxkZXIgYXNzb2NpYXRlZCB3aXRoIHRoaXMgb2JqZWN0LiAgSWYgc2V0IHRoZW4gdGhlCisgIC8vLyBURiBMaXRlIHJ1bnRpbWUgd2lsbCBnaXZlIHByZWNlZGVuY2UgdG8gdGhpcyBmaWVsZC4gIEUuZy4gaW5zdGVhZCBvZgorICAvLy8gaW52b2tpbmcgYFByZXBhcmVgIHZpYSB0aGUgZnVuY3Rpb24gcG9pbnRlciBpbnNpZGUgdGhlIGBUZkxpdGVEZWxlZ2F0ZWAKKyAgLy8vIG9iamVjdCwgdGhlIHJ1bnRpbWUgd2lsbCBmaXJzdCBjaGVjayBpZiB0aGUgY29ycmVzcG9uZGluZyBmdW5jdGlvbgorICAvLy8gcG9pbnRlciBpbnNpZGUgYG9wYXF1ZV9kZWxlZ2F0ZV9idWlsZGVyYCBpcyBzZXQgYW5kIGlmIHNvIGludm9rZSB0aGF0LgorICAvLy8KKyAgLy8vIElmIHRoaXMgZmllbGQgaXMgbm9uLW51bGwsIHRoZW4gdGhlIGBQcmVwYXJlYCBmaWVsZCAob2YgdGhlCisgIC8vLyBgVGZMaXRlRGVsZWdhdGVgKSBzaG91bGQgYmUgbnVsbC4KICAgc3RydWN0IFRmTGl0ZU9wYXF1ZURlbGVnYXRlQnVpbGRlciogb3BhcXVlX2RlbGVnYXRlX2J1aWxkZXI7CiB9IFRmTGl0ZURlbGVnYXRlOwogCi0vLyBCdWlsZCBhICdudWxsJyBkZWxlZ2F0ZSwgd2l0aCBhbGwgdGhlIGZpZWxkcyBwcm9wZXJseSBzZXQgdG8gdGhlaXIgZGVmYXVsdAotLy8gdmFsdWVzLgorLy8vIEJ1aWxkIGEgYG51bGxgIGRlbGVnYXRlLCB3aXRoIGFsbCB0aGUgZmllbGRzIHByb3Blcmx5IHNldCB0byB0aGVpciBkZWZhdWx0CisvLy8gdmFsdWVzLgogVGZMaXRlRGVsZWdhdGUgVGZMaXRlRGVsZWdhdGVDcmVhdGUodm9pZCk7CiAKLS8vIGBUZkxpdGVPcGFxdWVEZWxlZ2F0ZUJ1aWxkZXJgIGlzIHVzZWQgZm9yIGNvbnN0cnVjdGluZwotLy8gYFRmTGl0ZU9wYXF1ZURlbGVnYXRlYCwgc2VlIGBUZkxpdGVPcGFxdWVEZWxlZ2F0ZUNyZWF0ZWAgYmVsb3cuICBOb3RlOgotLy8gVGhpcyBzdHJ1Y3QgaXMgbm90IEFCSSBzdGFibGUuCi0vLwotLy8gRm9yIGZvcndhcmQgc291cmNlIGNvbXBhdGliaWxpdHkgYFRmTGl0ZU9wYXF1ZURlbGVnYXRlQnVpbGRlcmAgb2JqZWN0cyBzaG91bGQKLS8vIGJlIGJyYWNlLWluaXRpYWxpemVkLCBzbyB0aGF0IGFsbCBmaWVsZHMgKGluY2x1ZGluZyBhbnkgdGhhdCBtaWdodCBiZSBhZGRlZAotLy8gaW4gdGhlIGZ1dHVyZSkgZ2V0IHplcm8taW5pdGlhbGl6ZWQuICBUaGUgcHVycG9zZSBvZiBlYWNoIGZpZWxkIGlzIGV4YWN0bHkKLS8vIHRoZSBzYW1lIGFzIHdpdGggYFRmTGl0ZURlbGVnYXRlYC4KLS8vCi0vLyBXQVJOSU5HOiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBpbnRlcmZhY2UgdGhhdCBpcyBzdWJqZWN0IHRvIGNoYW5nZS4KKy8vLyBgVGZMaXRlT3BhcXVlRGVsZWdhdGVCdWlsZGVyYCBpcyB1c2VkIGZvciBjb25zdHJ1Y3RpbmcKKy8vLyBgVGZMaXRlT3BhcXVlRGVsZWdhdGVgLCBzZWUgYFRmTGl0ZU9wYXF1ZURlbGVnYXRlQ3JlYXRlYCBpbiBjX2FwaV9vcGFxdWUuaC4KKy8vLyBOT1RFOiBUaGlzIHN0cnVjdCBpcyBub3QgQUJJIHN0YWJsZS4KKy8vLworLy8vIEZvciBmb3J3YXJkIHNvdXJjZSBjb21wYXRpYmlsaXR5IGBUZkxpdGVPcGFxdWVEZWxlZ2F0ZUJ1aWxkZXJgIG9iamVjdHMKKy8vLyBzaG91bGQgYmUgYnJhY2UtaW5pdGlhbGl6ZWQsIHNvIHRoYXQgYWxsIGZpZWxkcyAoaW5jbHVkaW5nIGFueSB0aGF0IG1pZ2h0IGJlCisvLy8gYWRkZWQgaW4gdGhlIGZ1dHVyZSkgZ2V0IHplcm8taW5pdGlhbGl6ZWQuICBUaGUgcHVycG9zZSBvZiBlYWNoIGZpZWxkIGlzCisvLy8gZXhhY3RseSB0aGUgc2FtZSBhcyB3aXRoIGBUZkxpdGVEZWxlZ2F0ZWAuCisvLy8KKy8vLyBOT1RFOiBUaGlzIHR5cGUgaXMgcGFydCBvZiB0aGUgVGVuc29yRmxvdyBMaXRlIEV4dGVuc2lvbiBBUElzLgorLy8vIFdlIHJlc2VydmUgdGhlIHJpZ2h0IHRvIG1ha2UgY2hhbmdlcyB0byB0aGlzIEFQSSBpbiBmdXR1cmUgcmVsZWFzZXMsCisvLy8gcG90ZW50aWFsbHkgaW5jbHVkaW5nIG5vbi1iYWNrd2FyZHMtY29tcGF0aWJsZSBjaGFuZ2VzLCBvbiBhIGRpZmZlcmVudAorLy8vIHNjaGVkdWxlIHRoYW4gZm9yIHRoZSBvdGhlciBUZW5zb3JGbG93IExpdGUgQVBJcy4gU2VlCisvLy8gaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ3VpZGUvdmVyc2lvbnMjc2VwYXJhdGVfdmVyc2lvbl9udW1iZXJfZm9yX3RlbnNvcmZsb3dfbGl0ZV9leHRlbnNpb25fYXBpcy4KIHR5cGVkZWYgc3RydWN0IFRmTGl0ZU9wYXF1ZURlbGVnYXRlQnVpbGRlciB7Ci0gIC8vIERhdGEgdGhhdCBkZWxlZ2F0ZSBuZWVkcyB0byBpZGVudGlmeSBpdHNlbGYuIFRoaXMgZGF0YSBpcyBvd25lZCBieSB0aGUKLSAgLy8gZGVsZWdhdGUuIFRoZSBkZWxlZ2F0ZSBpcyBvd25lZCBpbiB0aGUgdXNlciBjb2RlLCBzbyB0aGUgZGVsZWdhdGUgaXMKLSAgLy8gcmVzcG9uc2libGUgZm9yIGRlYWxsb2NhdGluZyB0aGlzIHdoZW4gaXQgaXMgZGVzdHJveWVkLgorICAvLy8gRGF0YSB0aGF0IGRlbGVnYXRlIG5lZWRzIHRvIGlkZW50aWZ5IGl0c2VsZi4gVGhpcyBkYXRhIGlzIG93bmVkIGJ5IHRoZQorICAvLy8gZGVsZWdhdGUuIFRoZSBkZWxlZ2F0ZSBpcyBvd25lZCBpbiB0aGUgdXNlciBjb2RlLCBzbyB0aGUgZGVsZWdhdGUgaXMKKyAgLy8vIHJlc3BvbnNpYmxlIGZvciBkZWFsbG9jYXRpbmcgdGhpcyB3aGVuIGl0IGlzIGRlc3Ryb3llZC4KICAgdm9pZCogZGF0YTsKLSAgLy8gSW52b2tlZCBieSBNb2RpZnlHcmFwaFdpdGhEZWxlZ2F0ZS4gVGhpcyBwcmVwYXJlIGlzIGNhbGxlZCwgZ2l2aW5nIHRoZQotICAvLyBkZWxlZ2F0ZSBhIHZpZXcgb2YgdGhlIGN1cnJlbnQgZ3JhcGggdGhyb3VnaCBUZkxpdGVDb250ZXh0Ki4gSXQgdHlwaWNhbGx5Ci0gIC8vIHdpbGwgbG9vayBhdCB0aGUgbm9kZXMgYW5kIGNhbGwgUmVwbGFjZU5vZGVTdWJzZXRzV2l0aERlbGVnYXRlS2VybmVscygpCi0gIC8vIHRvIGFzayB0aGUgVGVuc29yRmxvdyBsaXRlIHJ1bnRpbWUgdG8gY3JlYXRlIG1hY3JvLW5vZGVzIHRvIHJlcHJlc2VudAotICAvLyBkZWxlZ2F0ZWQgc3ViZ3JhcGhzIG9mIHRoZSBvcmlnaW5hbCBncmFwaC4KKyAgLy8vIEludm9rZWQgYnkgTW9kaWZ5R3JhcGhXaXRoRGVsZWdhdGUuIFRoaXMgcHJlcGFyZSBpcyBjYWxsZWQsIGdpdmluZyB0aGUKKyAgLy8vIGRlbGVnYXRlIGEgdmlldyBvZiB0aGUgY3VycmVudCBncmFwaCB0aHJvdWdoIGBUZkxpdGVDb250ZXh0KmAuIEl0CisgIC8vLyB0eXBpY2FsbHkgd2lsbCBsb29rIGF0IHRoZSBub2RlcyBhbmQgY2FsbAorICAvLy8gYFJlcGxhY2VOb2RlU3Vic2V0c1dpdGhEZWxlZ2F0ZUtlcm5lbHMoKWAgdG8gYXNrIHRoZSBUZW5zb3JGbG93IGxpdGUKKyAgLy8vIHJ1bnRpbWUgdG8gY3JlYXRlIG1hY3JvLW5vZGVzIHRvIHJlcHJlc2VudCBkZWxlZ2F0ZWQgc3ViZ3JhcGhzIG9mIHRoZQorICAvLy8gb3JpZ2luYWwgZ3JhcGguCiAgIFRmTGl0ZVN0YXR1cyAoKlByZXBhcmUpKFRmTGl0ZU9wYXF1ZUNvbnRleHQqIGNvbnRleHQsICAvLyBOT0xJTlQKICAgICAgICAgICAgICAgICAgICAgICAgICAgVGZMaXRlT3BhcXVlRGVsZWdhdGUqIGRlbGVnYXRlLCB2b2lkKiBkYXRhKTsKLSAgLy8gQ29waWVzIHRoZSBkYXRhIGZyb20gZGVsZWdhdGUgYnVmZmVyIGhhbmRsZSBpbnRvIHJhdyBtZW1vcnkgb2YgdGhlIGdpdmVuCi0gIC8vICd0ZW5zb3InLiBOb3RlIHRoYXQgdGhlIGRlbGVnYXRlIGlzIGFsbG93ZWQgdG8gYWxsb2NhdGUgdGhlIHJhdyBieXRlcyBhcwotICAvLyBsb25nIGFzIGl0IGZvbGxvd3MgdGhlIHJ1bGVzIGZvciBrVGZMaXRlRHluYW1pYyB0ZW5zb3JzLCBpbiB3aGljaCBjYXNlIHRoaXMKLSAgLy8gY2Fubm90IGJlIG51bGwuCisgIC8vLyBDb3BpZXMgdGhlIGRhdGEgZnJvbSBkZWxlZ2F0ZSBidWZmZXIgaGFuZGxlIGludG8gcmF3IG1lbW9yeSBvZiB0aGUgZ2l2ZW4KKyAgLy8vIGB0ZW5zb3JgLiBOb3RlIHRoYXQgdGhlIGRlbGVnYXRlIGlzIGFsbG93ZWQgdG8gYWxsb2NhdGUgdGhlIHJhdyBieXRlcyBhcworICAvLy8gbG9uZyBhcyBpdCBmb2xsb3dzIHRoZSBydWxlcyBmb3Iga1RmTGl0ZUR5bmFtaWMgdGVuc29ycywgaW4gd2hpY2ggY2FzZQorICAvLy8gdGhpcyBjYW5ub3QgYmUgbnVsbC4KICAgVGZMaXRlU3RhdHVzICgqQ29weUZyb21CdWZmZXJIYW5kbGUpKCAgLy8gTk9MSU5UCiAgICAgICBUZkxpdGVPcGFxdWVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVPcGFxdWVEZWxlZ2F0ZSogZGVsZWdhdGUsIHZvaWQqIGRhdGEsCiAgICAgICBUZkxpdGVCdWZmZXJIYW5kbGUgYnVmZmVyX2hhbmRsZSwgVGZMaXRlT3BhcXVlVGVuc29yKiB0ZW5zb3IpOwotICAvLyBDb3BpZXMgdGhlIGRhdGEgZnJvbSByYXcgbWVtb3J5IG9mIHRoZSBnaXZlbiAndGVuc29yJyB0byBkZWxlZ2F0ZSBidWZmZXIKLSAgLy8gaGFuZGxlLiBUaGlzIGNhbiBiZSBudWxsIGlmIHRoZSBkZWxlZ2F0ZSBkb2Vzbid0IHVzZSBpdHMgb3duIGJ1ZmZlci4KKyAgLy8vIENvcGllcyB0aGUgZGF0YSBmcm9tIHJhdyBtZW1vcnkgb2YgdGhlIGdpdmVuIGB0ZW5zb3JgIHRvIGRlbGVnYXRlIGJ1ZmZlcgorICAvLy8gaGFuZGxlLiBUaGlzIGNhbiBiZSBudWxsIGlmIHRoZSBkZWxlZ2F0ZSBkb2Vzbid0IHVzZSBpdHMgb3duIGJ1ZmZlci4KICAgVGZMaXRlU3RhdHVzICgqQ29weVRvQnVmZmVySGFuZGxlKSggIC8vIE5PTElOVAogICAgICAgVGZMaXRlT3BhcXVlQ29udGV4dCogY29udGV4dCwgVGZMaXRlT3BhcXVlRGVsZWdhdGUqIGRlbGVnYXRlLCB2b2lkKiBkYXRhLAogICAgICAgVGZMaXRlQnVmZmVySGFuZGxlIGJ1ZmZlcl9oYW5kbGUsIFRmTGl0ZU9wYXF1ZVRlbnNvciogdGVuc29yKTsKLSAgLy8gRnJlZXMgdGhlIERlbGVnYXRlIEJ1ZmZlciBIYW5kbGUuIE5vdGU6IFRoaXMgb25seSBmcmVlcyB0aGUgaGFuZGxlLCBidXQKLSAgLy8gdGhpcyBkb2Vzbid0IHJlbGVhc2UgdGhlIHVuZGVybHlpbmcgcmVzb3VyY2UgKGUuZy4gdGV4dHVyZXMpLiBUaGUKLSAgLy8gcmVzb3VyY2VzIGFyZSBlaXRoZXIgb3duZWQgYnkgYXBwbGljYXRpb24gbGF5ZXIgb3IgdGhlIGRlbGVnYXRlLgotICAvLyBUaGlzIGNhbiBiZSBudWxsIGlmIHRoZSBkZWxlZ2F0ZSBkb2Vzbid0IHVzZSBpdHMgb3duIGJ1ZmZlci4KKyAgLy8vIEZyZWVzIHRoZSBEZWxlZ2F0ZSBCdWZmZXIgSGFuZGxlLiBOb3RlOiBUaGlzIG9ubHkgZnJlZXMgdGhlIGhhbmRsZSwgYnV0CisgIC8vLyB0aGlzIGRvZXNuJ3QgcmVsZWFzZSB0aGUgdW5kZXJseWluZyByZXNvdXJjZSAoZS5nLiB0ZXh0dXJlcykuIFRoZQorICAvLy8gcmVzb3VyY2VzIGFyZSBlaXRoZXIgb3duZWQgYnkgYXBwbGljYXRpb24gbGF5ZXIgb3IgdGhlIGRlbGVnYXRlLgorICAvLy8gVGhpcyBjYW4gYmUgbnVsbCBpZiB0aGUgZGVsZWdhdGUgZG9lc24ndCB1c2UgaXRzIG93biBidWZmZXIuCiAgIHZvaWQgKCpGcmVlQnVmZmVySGFuZGxlKShUZkxpdGVPcGFxdWVDb250ZXh0KiBjb250ZXh0LCAgLy8gTk9MSU5UCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZkxpdGVPcGFxdWVEZWxlZ2F0ZSogZGVsZWdhdGUsIHZvaWQqIGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZkxpdGVCdWZmZXJIYW5kbGUqIGhhbmRsZSk7Ci0gIC8vIEJpdG1hc2sgZmxhZ3MuIFNlZSB0aGUgY29tbWVudHMgaW4gYFRmTGl0ZURlbGVnYXRlRmxhZ3NgLgorICAvLy8gQml0bWFzayBmbGFncy4gU2VlIHRoZSBjb21tZW50cyBpbiBgVGZMaXRlRGVsZWdhdGVGbGFnc2AuCiAgIGludDY0X3QgZmxhZ3M7CiB9IFRmTGl0ZU9wYXF1ZURlbGVnYXRlQnVpbGRlcjsKIAogI2lmbmRlZiBURl9MSVRFX1NUQVRJQ19NRU1PUlkKLS8vIENyZWF0ZXMgYW4gb3BhcXVlIGRlbGVnYXRlIGFuZCByZXR1cm5zIGl0cyBhZGRyZXNzLiAgVGhlIG9wYXF1ZSBkZWxlZ2F0ZSB3aWxsCi0vLyBiZWhhdmUgYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZCAnb3BhcXVlX2RlbGVnYXRlX2J1aWxkZXInLiAgVGhlIGxpZmV0aW1lIG9mCi0vLyB0aGUgb2JqZWN0cyBwb2ludGVkIHRvIGJ5IGFueSBvZiB0aGUgZmllbGRzIHdpdGhpbiB0aGUKLS8vICdvcGFxdWVfZGVsZWdhdGVfYnVpbGRlcicgbXVzdCBvdXRsaXZlIHRoZSByZXR1cm5lZAotLy8gJ1RmTGl0ZU9wYXF1ZURlbGVnYXRlJyBhbmQgYW55ICdUZkxpdGVJbnRlcnByZXRlcicsCi0vLyAnVGZMaXRlSW50ZXJwcmV0ZXJPcHRpb25zJywgJ3RmbGl0ZTo6SW50ZXJwcmV0ZXInLCBvcgotLy8gJ3RmbGl0ZTo6SW50ZXJwcmV0ZXJCdWlsZGVyJyB0aGF0IHRoZSBkZWxlZ2F0ZSBpcyBhZGRlZCB0by4gIFRoZSByZXR1cm5lZAotLy8gYWRkcmVzcyBzaG91bGQgYmUgcGFzc2VkIHRvICdUZkxpdGVPcGFxdWVEZWxlZ2F0ZURlbGV0ZScgZm9yIGRlbGV0aW9uLiAgSWYKLS8vICdvcGFxdWVfZGVsZWdhdGVfYnVpbGRlcicgaXMgYSBudWxsIHBvaW50ZXIsIHRoZW4gYSBudWxsIHBvaW50ZXIgd2lsbCBiZQotLy8gcmV0dXJuZWQuCisvLyBTZWUgY19hcGlfb3BhcXVlLmguCisvLyBUaGlzIGRlY2xhcmF0aW9uIGluIGNvbW1vbi5oIGlzIG9ubHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorLy8gTk9URTogVGhpcyBmdW5jdGlvbiBpcyBwYXJ0IG9mIHRoZSBUZW5zb3JGbG93IExpdGUgRXh0ZW5zaW9uIEFQSXMsIHNlZSBhYm92ZS4KIFRmTGl0ZU9wYXF1ZURlbGVnYXRlKiBUZkxpdGVPcGFxdWVEZWxlZ2F0ZUNyZWF0ZSgKICAgICBjb25zdCBUZkxpdGVPcGFxdWVEZWxlZ2F0ZUJ1aWxkZXIqIG9wYXF1ZV9kZWxlZ2F0ZV9idWlsZGVyKTsKIAotLy8gRGVsZXRlcyB0aGUgcHJvdmlkZWQgb3BhcXVlICdkZWxlZ2F0ZScuICBUaGlzIGZ1bmN0aW9uIGhhcyBubyBlZmZlY3QgaWYgdGhlCi0vLyAnZGVsZWdhdGUnIGlzIGEgbnVsbCBwb2ludGVyLgorLy8gU2VlIGNfYXBpX29wYXF1ZS5oLgorLy8gVGhpcyBkZWNsYXJhdGlvbiBpbiBjb21tb24uaCBpcyBvbmx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKy8vIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgcGFydCBvZiB0aGUgVGVuc29yRmxvdyBMaXRlIEV4dGVuc2lvbiBBUElzLCBzZWUgYWJvdmUuCiB2b2lkIFRmTGl0ZU9wYXF1ZURlbGVnYXRlRGVsZXRlKFRmTGl0ZU9wYXF1ZURlbGVnYXRlKiBkZWxlZ2F0ZSk7CiAjZW5kaWYgIC8vIFRGX0xJVEVfU1RBVElDX01FTU9SWQogCi0vLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3ZpZGVkIG9wYXF1ZSAnZGVsZWdhdGUnLgotLy8KLS8vIEEgbnVsbCBwb2ludGVyIHdpbGwgYmUgcmV0dXJuZWQgd2hlbjoKLS8vIC0gVGhlICdkZWxlZ2F0ZScgaXMgbnVsbC4KLS8vIC0gVGhlICdkYXRhJyBmaWVsZCBvZiB0aGUgJ1RmTGl0ZU9wYXF1ZURlbGVnYXRlQnVpbGRlcicgdXNlZCB0byBjb25zdHJ1Y3QgdGhlCi0vLyAgICdkZWxlZ2F0ZScgd2FzIG51bGwuCi0vLyAtIE9yIGluIGNhc2Ugb2YgYW55IG90aGVyIGVycm9yLgotLy8gLSBUaGUgJ2RlbGVnYXRlJyBoYXMgYmVlbiBjb25zdHJ1Y3RlZCB2aWEgYSAnVGZMaXRlT3BhcXVlRGVsZWdhdGVCdWlsZGVyJywKLS8vICAgYnV0IHRoZSAnZGF0YScgZmllbGQgb2YgdGhlICdUZkxpdGVPcGFxdWVEZWxlZ2F0ZUJ1aWxkZXInIGlzIG51bGwuCi0vLwotLy8gIFRoZSBkYXRhXyBmaWVsZCBvZiAnZGVsZWdhdGUnIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlCi0vLyAgJ29wYXF1ZV9kZWxlZ2F0ZV9idWlsZGVyJyBmaWVsZCBpcyBudWxsLgorLy8gU2VlIGNfYXBpX29wYXF1ZS5oLgorLy8gVGhpcyBkZWNsYXJhdGlvbiBpbiBjb21tb24uaCBpcyBvbmx5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKy8vIE5PVEU6IFRoaXMgZnVuY3Rpb24gaXMgcGFydCBvZiB0aGUgVGVuc29yRmxvdyBMaXRlIEV4dGVuc2lvbiBBUElzLCBzZWUgYWJvdmUuCiB2b2lkKiBUZkxpdGVPcGFxdWVEZWxlZ2F0ZUdldERhdGEoY29uc3QgVGZMaXRlT3BhcXVlRGVsZWdhdGUqIGRlbGVnYXRlKTsKIAorLy8vIFJldHVybnMgYSB0ZW5zb3IgZGF0YSBhbGxvY2F0aW9uIHN0cmF0ZWd5LgorVGZMaXRlQWxsb2NhdGlvblN0cmF0ZWd5IFRmTGl0ZVRlbnNvckdldEFsbG9jYXRpb25TdHJhdGVneSgKKyAgICBjb25zdCBUZkxpdGVUZW5zb3IqIHQpOworCisvLy8gUmV0dXJucyBob3cgc3RhYmxlIGEgdGVuc29yIGRhdGEgYnVmZmVyIGFkZHJlc3MgaXMgYWNyb3NzIHJ1bnMuCitUZkxpdGVSdW5TdGFiaWxpdHkgVGZMaXRlVGVuc29yR2V0QnVmZmVyQWRkcmVzc1N0YWJpbGl0eShjb25zdCBUZkxpdGVUZW5zb3IqIHQpOworCisvLy8gUmV0dXJucyBob3cgc3RhYmxlIGEgdGVuc29yIGRhdGEgdmFsdWVzIGFyZSBhY3Jvc3MgcnVucy4KK1RmTGl0ZVJ1blN0YWJpbGl0eSBUZkxpdGVUZW5zb3JHZXREYXRhU3RhYmlsaXR5KGNvbnN0IFRmTGl0ZVRlbnNvciogdCk7CisKKy8vLyBSZXR1cm5zIHRoZSBvcGVyYXRpb24gc3RlcCB3aGVuIHRoZSBkYXRhIG9mIGEgdGVuc29yIGlzIHBvcHVsYXRlZC4KKy8vLworLy8vIFNvbWUgb3BlcmF0aW9ucyBjYW4gcHJlY29tcHV0ZSB0aGVpciByZXN1bHRzIGJlZm9yZSB0aGUgZXZhbHVhdGlvbiBzdGVwLgorLy8vIFRoaXMgbWFrZXMgdGhlIGRhdGEgYXZhaWxhYmxlIGVhcmxpZXIgZm9yIHN1YnNlcXVlbnQgb3BlcmF0aW9ucy4KK1RmTGl0ZVJ1blN0ZXAgVGZMaXRlVGVuc29yR2V0RGF0YUtub3duU3RlcChjb25zdCBUZkxpdGVUZW5zb3IqIHQpOworCisvLy8gUmV0dXJucyB0aGUgb3BlcmF0aW9uIHN0ZW9wIHdoZW4gdGhlIHNoYXBlIG9mIGEgdGVuc29yIGlzIGNvbXB1dGVkLgorLy8vCisvLy8gU29tZSBvcGVyYXRpb25zIGNhbiBwcmVjb21wdXRlIHRoZSBzaGFwZSBvZiB0aGVpciByZXN1bHRzIGJlZm9yZSB0aGUKKy8vLyBldmFsdWF0aW9uIHN0ZXAuIFRoaXMgbWFrZXMgdGhlIHNoYXBlIGF2YWlsYWJsZSBlYXJsaWVyIGZvciBzdWJzZXF1ZW50CisvLy8gb3BlcmF0aW9ucy4KK1RmTGl0ZVJ1blN0ZXAgVGZMaXRlVGVuc29yR2V0U2hhcGVLbm93blN0ZXAoY29uc3QgVGZMaXRlVGVuc29yKiB0KTsKKworLyoqIEB9ICovCisvLyBFbmRzIGBcYWRkdG9ncm91cGAsIGl0J3MgaW1wb3J0YW50IGZvciB0aGUgZG9jIGdlbmVyYXRvciB0aGF0IHRoaXMgZG9lc24ndAorLy8gaW5jbHVkZSB0aGUgQ0MgY29kZSBiZWxvdy4KKwogI2lmZGVmIF9fY3BsdXNwbHVzCiB9ICAvLyBleHRlcm4gIkMiCiAKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9jb3JlL21hY3Jvcy5oIGIvdGVuc29yZmxvdy9saXRlL2NvcmUvbWFjcm9zLmgKaW5kZXggZDMyOWRlZC4uODZkZTRkYSAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL2NvcmUvbWFjcm9zLmgKKysrIGIvdGVuc29yZmxvdy9saXRlL2NvcmUvbWFjcm9zLmgKQEAgLTY1LDE0ICs2NSw0IEBACiAjZGVmaW5lIFRGTElURV9IQVNfQVRUUklCVVRFX1dFQUsgMAogI2VuZGlmCiAKLSNpZm5kZWYgVEZfTElURV9TVEFUSUNfTUVNT1JZCi0vLyBtYXhpbXVtIHNpemUgb2YgYSB2YWxpZCBmbGF0YnVmZmVyCi1pbmxpbmUgY29uc3RleHByIHVuc2lnbmVkIGludCBmbGF0YnVmZmVyX3NpemVfbWF4ID0gMjE0NzQ4MzY0ODsKLS8vIElmIG5vbmUgemVybyB0aGVuIHRoZSBidWZmZXIgaXMgc3RvcmVkIG91dHNpZGUgb2YgdGhlIGZsYXRidWZmZXJzLCBzdHJpbmcKLWlubGluZSBjb25zdGV4cHIgY2hhciB0ZmxpdGVfbWV0YWRhdGFfYnVmZmVyX2xvY2F0aW9uW10gPSAiYnVmZmVyX2xvY2F0aW9uIjsKLS8vIGZpZWxkIGZvciBtaW5pbXVtIHJ1bnRpbWUgdmVyc2lvbiwgc3RyaW5nCi1pbmxpbmUgY29uc3RleHByIGNoYXIgdGZsaXRlX21ldGFkYXRhX21pbl9ydW50aW1lX3ZlcnNpb25bXSA9Ci0gICAgIm1pbl9ydW50aW1lX3ZlcnNpb24iOwotI2VuZGlmCi0KICNlbmRpZiAgLy8gVEVOU09SRkxPV19MSVRFX0NPUkVfTUFDUk9TX0hfCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvZXhwZXJpbWVudGFsL21pY3JvZnJvbnRlbmQvbGliL2ZpbHRlcmJhbmtfaW8uYyBiL3RlbnNvcmZsb3cvbGl0ZS9leHBlcmltZW50YWwvbWljcm9mcm9udGVuZC9saWIvZmlsdGVyYmFua19pby5jCmluZGV4IDZjZTRjN2MuLmVhNDVkMWIgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9leHBlcmltZW50YWwvbWljcm9mcm9udGVuZC9saWIvZmlsdGVyYmFua19pby5jCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9leHBlcmltZW50YWwvbWljcm9mcm9udGVuZC9saWIvZmlsdGVyYmFua19pby5jCkBAIC0xNyw3ICsxNyw3IEBACiBzdGF0aWMgdm9pZCBQcmludEFycmF5KEZJTEUqIGZwLCBjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBpbnQxNl90KiB2YWx1ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplKSB7CiAgIGZwcmludGYoZnAsICJzdGF0aWMgaW50MTZfdCBmaWx0ZXJiYW5rXyVzW10gPSB7IiwgbmFtZSk7Ci0gIGludCBpOworICBzaXplX3QgaTsKICAgZm9yIChpID0gMDsgaSA8IHNpemU7ICsraSkgewogICAgIGZwcmludGYoZnAsICIlZCIsIHZhbHVlc1tpXSk7CiAgICAgaWYgKGkgPCBzaXplIC0gMSkgewpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL2V4cGVyaW1lbnRhbC9taWNyb2Zyb250ZW5kL2xpYi9maWx0ZXJiYW5rX3V0aWwuYyBiL3RlbnNvcmZsb3cvbGl0ZS9leHBlcmltZW50YWwvbWljcm9mcm9udGVuZC9saWIvZmlsdGVyYmFua191dGlsLmMKaW5kZXggZjE4ZWJmNS4uNDMwZmM2ZSAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL2V4cGVyaW1lbnRhbC9taWNyb2Zyb250ZW5kL2xpYi9maWx0ZXJiYW5rX3V0aWwuYworKysgYi90ZW5zb3JmbG93L2xpdGUvZXhwZXJpbWVudGFsL21pY3JvZnJvbnRlbmQvbGliL2ZpbHRlcmJhbmtfdXRpbC5jCkBAIC0yOCw3ICsyOCw3IEBACiAgIGNvbmZpZy0+b3V0cHV0X3NjYWxlX3NoaWZ0ID0gNzsKIH0KIAotc3RhdGljIGZsb2F0IEZyZXFUb01lbChmbG9hdCBmcmVxKSB7IHJldHVybiAxMTI3LjAgKiBsb2cxcChmcmVxIC8gNzAwLjApOyB9CitzdGF0aWMgZmxvYXQgRnJlcVRvTWVsKGZsb2F0IGZyZXEpIHsgcmV0dXJuIDExMjcuMGYgKiBsb2cxcGYoZnJlcSAvIDcwMC4wZik7IH0KIAogc3RhdGljIHZvaWQgQ2FsY3VsYXRlQ2VudGVyRnJlcXVlbmNpZXMoY29uc3QgaW50IG51bV9jaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IGxvd2VyX2ZyZXF1ZW5jeV9saW1pdCwKQEAgLTQ5LDggKzQ5LDggQEAKIAogc3RhdGljIHZvaWQgUXVhbnRpemVGaWx0ZXJiYW5rV2VpZ2h0cyhjb25zdCBmbG9hdCBmbG9hdF93ZWlnaHQsIGludDE2X3QqIHdlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCogdW53ZWlnaHQpIHsKLSAgKndlaWdodCA9IGZsb29yKGZsb2F0X3dlaWdodCAqICgxIDw8IGtGaWx0ZXJiYW5rQml0cykgKyAwLjUpOwotICAqdW53ZWlnaHQgPSBmbG9vcigoMS4wIC0gZmxvYXRfd2VpZ2h0KSAqICgxIDw8IGtGaWx0ZXJiYW5rQml0cykgKyAwLjUpOworICAqd2VpZ2h0ID0gZmxvb3JmKGZsb2F0X3dlaWdodCAqICgxIDw8IGtGaWx0ZXJiYW5rQml0cykgKyAwLjVmKTsKKyAgKnVud2VpZ2h0ID0gZmxvb3JmKCgxLjBmIC0gZmxvYXRfd2VpZ2h0KSAqICgxIDw8IGtGaWx0ZXJiYW5rQml0cykgKyAwLjVmKTsKIH0KIAogaW50IEZpbHRlcmJhbmtQb3B1bGF0ZVN0YXRlKGNvbnN0IHN0cnVjdCBGaWx0ZXJiYW5rQ29uZmlnKiBjb25maWcsCkBAIC05NSw4ICs5NSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+dXBwZXJfYmFuZF9saW1pdCwgY2VudGVyX21lbF9mcmVxcyk7CiAKICAgLy8gQWx3YXlzIGV4Y2x1ZGUgREMuCi0gIGNvbnN0IGZsb2F0IGh6X3Blcl9zYmluID0gMC41ICogc2FtcGxlX3JhdGUgLyAoKGZsb2F0KXNwZWN0cnVtX3NpemUgLSAxKTsKLSAgc3RhdGUtPnN0YXJ0X2luZGV4ID0gMS41ICsgY29uZmlnLT5sb3dlcl9iYW5kX2xpbWl0IC8gaHpfcGVyX3NiaW47CisgIGNvbnN0IGZsb2F0IGh6X3Blcl9zYmluID0gMC41ZiAqIHNhbXBsZV9yYXRlIC8gKChmbG9hdClzcGVjdHJ1bV9zaXplIC0gMSk7CisgIHN0YXRlLT5zdGFydF9pbmRleCA9IDEuNWYgKyBjb25maWctPmxvd2VyX2JhbmRfbGltaXQgLyBoel9wZXJfc2JpbjsKICAgc3RhdGUtPmVuZF9pbmRleCA9IDA7ICAvLyBJbml0aWFsaXplZCB0byB6ZXJvIGhlcmUsIGJ1dCBhY3R1YWxseSBzZXQgYmVsb3cuCiAKICAgLy8gRm9yIGVhY2ggY2hhbm5lbCwgd2UgbmVlZCB0byBmaWd1cmUgb3V0IHdoYXQgZnJlcXVlbmNpZXMgYmVsb25nIHRvIGl0LCBhbmQKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9leHBlcmltZW50YWwvbWljcm9mcm9udGVuZC9saWIvZnJvbnRlbmRfbWFpbi5jIGIvdGVuc29yZmxvdy9saXRlL2V4cGVyaW1lbnRhbC9taWNyb2Zyb250ZW5kL2xpYi9mcm9udGVuZF9tYWluLmMKaW5kZXggODYxNzc4Yy4uNjA4NjhmOCAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL2V4cGVyaW1lbnRhbC9taWNyb2Zyb250ZW5kL2xpYi9mcm9udGVuZF9tYWluLmMKKysrIGIvdGVuc29yZmxvdy9saXRlL2V4cGVyaW1lbnRhbC9taWNyb2Zyb250ZW5kL2xpYi9mcm9udGVuZF9tYWluLmMKQEAgLTU2LDcgKzU2LDcgQEAKICAgICBhdWRpb19maWxlX3NpemUgLT0gbnVtX3NhbXBsZXNfcmVhZDsKIAogICAgIGlmIChvdXRwdXQudmFsdWVzICE9IE5VTEwpIHsKLSAgICAgIGludCBpOworICAgICAgc2l6ZV90IGk7CiAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3V0cHV0LnNpemU7ICsraSkgewogICAgICAgICBwcmludGYoIiVkICIsIG91dHB1dC52YWx1ZXNbaV0pOwogICAgICAgfQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL2V4cGVyaW1lbnRhbC9taWNyb2Zyb250ZW5kL2xpYi9ub2lzZV9yZWR1Y3Rpb25faW8uYyBiL3RlbnNvcmZsb3cvbGl0ZS9leHBlcmltZW50YWwvbWljcm9mcm9udGVuZC9saWIvbm9pc2VfcmVkdWN0aW9uX2lvLmMKaW5kZXggMTljMzJiMy4uOGE1ZDdhNCAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL2V4cGVyaW1lbnRhbC9taWNyb2Zyb250ZW5kL2xpYi9ub2lzZV9yZWR1Y3Rpb25faW8uYworKysgYi90ZW5zb3JmbG93L2xpdGUvZXhwZXJpbWVudGFsL21pY3JvZnJvbnRlbmQvbGliL25vaXNlX3JlZHVjdGlvbl9pby5jCkBAIC0xNiw3ICsxNiw3IEBACiAKIHZvaWQgTm9pc2VSZWR1Y3Rpb25Xcml0ZU1lbW1hcFByZWFtYmxlKAogICAgIEZJTEUqIGZwLCBjb25zdCBzdHJ1Y3QgTm9pc2VSZWR1Y3Rpb25TdGF0ZSogc3RhdGUpIHsKLSAgZnByaW50ZihmcCwgInN0YXRpYyB1aW50MzJfdCBub2lzZV9yZWR1Y3Rpb25fZXN0aW1hdGVbJXp1XTtcbiIsCisgIGZwcmludGYoZnAsICJzdGF0aWMgdWludDMyX3Qgbm9pc2VfcmVkdWN0aW9uX2VzdGltYXRlWyVkXTtcbiIsCiAgICAgICAgICAgc3RhdGUtPm51bV9jaGFubmVscyk7CiAgIGZwcmludGYoZnAsICJcbiIpOwogfQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL2V4cGVyaW1lbnRhbC9taWNyb2Zyb250ZW5kL2xpYi93aW5kb3dfaW8uYyBiL3RlbnNvcmZsb3cvbGl0ZS9leHBlcmltZW50YWwvbWljcm9mcm9udGVuZC9saWIvd2luZG93X2lvLmMKaW5kZXggZDEyY2FjMi4uNWE3YjA0NyAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL2V4cGVyaW1lbnRhbC9taWNyb2Zyb250ZW5kL2xpYi93aW5kb3dfaW8uYworKysgYi90ZW5zb3JmbG93L2xpdGUvZXhwZXJpbWVudGFsL21pY3JvZnJvbnRlbmQvbGliL3dpbmRvd19pby5jCkBAIC0xNiw3ICsxNiw3IEBACiAKIHZvaWQgV2luZG93V3JpdGVNZW1tYXBQcmVhbWJsZShGSUxFKiBmcCwgY29uc3Qgc3RydWN0IFdpbmRvd1N0YXRlKiBzdGF0ZSkgewogICBmcHJpbnRmKGZwLCAic3RhdGljIGludDE2X3Qgd2luZG93X2NvZWZmaWNpZW50c1tdID0ge1xuIik7Ci0gIGludCBpOworICBzaXplX3QgaTsKICAgZm9yIChpID0gMDsgaSA8IHN0YXRlLT5zaXplOyArK2kpIHsKICAgICBmcHJpbnRmKGZwLCAiJWQiLCBzdGF0ZS0+Y29lZmZpY2llbnRzW2ldKTsKICAgICBpZiAoaSA8IHN0YXRlLT5zaXplIC0gMSkgewpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL2V4cGVyaW1lbnRhbC9taWNyb2Zyb250ZW5kL2xpYi93aW5kb3dfdXRpbC5jIGIvdGVuc29yZmxvdy9saXRlL2V4cGVyaW1lbnRhbC9taWNyb2Zyb250ZW5kL2xpYi93aW5kb3dfdXRpbC5jCmluZGV4IGVlZTZlN2IuLjZmZGZmZGMgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9leHBlcmltZW50YWwvbWljcm9mcm9udGVuZC9saWIvd2luZG93X3V0aWwuYworKysgYi90ZW5zb3JmbG93L2xpdGUvZXhwZXJpbWVudGFsL21pY3JvZnJvbnRlbmQvbGliL3dpbmRvd191dGlsLmMKQEAgLTQxLDEzICs0MSwxMyBAQAogICB9CiAKICAgLy8gUG9wdWxhdGUgdGhlIHdpbmRvdyB2YWx1ZXMuCi0gIGNvbnN0IGZsb2F0IGFyZyA9IE1fUEkgKiAyLjAgLyAoKGZsb2F0KXN0YXRlLT5zaXplKTsKLSAgaW50IGk7CisgIGNvbnN0IGZsb2F0IGFyZyA9IChmbG9hdClNX1BJICogMi4wZiAvICgoZmxvYXQpc3RhdGUtPnNpemUpOworICBzaXplX3QgaTsKICAgZm9yIChpID0gMDsgaSA8IHN0YXRlLT5zaXplOyArK2kpIHsKLSAgICBmbG9hdCBmbG9hdF92YWx1ZSA9IDAuNSAtICgwLjUgKiBjb3MoYXJnICogKGkgKyAwLjUpKSk7CisgICAgZmxvYXQgZmxvYXRfdmFsdWUgPSAwLjVmIC0gKDAuNWYgKiBjb3NmKGFyZyAqIChpICsgMC41ZikpKTsKICAgICAvLyBTY2FsZSBpdCB0byBmaXhlZCBwb2ludCBhbmQgcm91bmQgaXQuCiAgICAgc3RhdGUtPmNvZWZmaWNpZW50c1tpXSA9Ci0gICAgICAgIGZsb29yKGZsb2F0X3ZhbHVlICogKDEgPDwga0Zyb250ZW5kV2luZG93Qml0cykgKyAwLjUpOworICAgICAgICBmbG9vcmYoZmxvYXRfdmFsdWUgKiAoMSA8PCBrRnJvbnRlbmRXaW5kb3dCaXRzKSArIDAuNWYpOwogICB9CiAKICAgc3RhdGUtPmlucHV0X3VzZWQgPSAwOwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvY29tbW9uLmNjIGIvdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvY29tbW9uLmNjCmluZGV4IDE2NTRhYjguLmZhYmIwMjAgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL2NvbW1vbi5jYworKysgYi90ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9jb21tb24uY2MKQEAgLTE3LDYgKzE3LDUzIEBACiAKIG5hbWVzcGFjZSB0ZmxpdGUgewogCisvLyBTaW5nbGUtcm91bmRpbmcgTXVsdGlwbHlCeVF1YW50aXplZE11bHRpcGxpZXIKKyNpZiBURkxJVEVfU0lOR0xFX1JPVU5ESU5HCitpbnQzMl90IE11bHRpcGx5QnlRdWFudGl6ZWRNdWx0aXBsaWVyKGludDMyX3QgeCwgaW50MzJfdCBxdWFudGl6ZWRfbXVsdGlwbGllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNoaWZ0KSB7CisgIFRGTElURV9EQ0hFQ0socXVhbnRpemVkX211bHRpcGxpZXIgPj0gMCk7CisgIFRGTElURV9EQ0hFQ0soc2hpZnQgPj0gLTMxICYmIHNoaWZ0IDw9IDMwKTsKKworICBjb25zdCBpbnQ2NF90IHRvdGFsX3NoaWZ0ID0gMzEgLSBzaGlmdDsKKyAgY29uc3QgaW50NjRfdCByb3VuZCA9IHN0YXRpY19jYXN0PGludDY0X3Q+KDEpIDw8ICh0b3RhbF9zaGlmdCAtIDEpOworICBpbnQ2NF90IHJlc3VsdCA9IHggKiBzdGF0aWNfY2FzdDxpbnQ2NF90PihxdWFudGl6ZWRfbXVsdGlwbGllcikgKyByb3VuZDsKKyAgcmVzdWx0ID0gcmVzdWx0ID4+IHRvdGFsX3NoaWZ0OworCisgIFRGTElURV9EQ0hFQ0socmVzdWx0ID49IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbigpICYmCisgICAgICAgICAgICAgICAgcmVzdWx0IDw9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCgpKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KHJlc3VsdCk7Cit9CisKK2ludDMyX3QgTXVsdGlwbHlCeVF1YW50aXplZE11bHRpcGxpZXIoaW50NjRfdCB4LCBpbnQzMl90IHF1YW50aXplZF9tdWx0aXBsaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2hpZnQpIHsKKyAgLy8gSW5wdXRzOgorICAvLyAtIHF1YW50aXplZF9tdWx0aXBsaWVyIGhhcyBmaXhlZCBwb2ludCBhdCBiaXQgMzEKKyAgLy8gLSBzaGlmdCBpcyAtMzEgdG8gKzcgKG5lZ2F0aXZlIGZvciByaWdodCBzaGlmdCkKKyAgLy8KKyAgLy8gQXNzdW1wdGlvbnM6IFRoZSBmb2xsb3dpbmcgaW5wdXQgcmFuZ2VzIGFyZSBhc3N1bWVkCisgIC8vIC0gcXVhbnRpemVfc2NhbGU+PTAgICh0aGUgdXN1YWwgcmFuZ2UgaXMgKDE8PDMwKSB0byAoMT4+MzEpLTEpCisgIC8vIC0gc2NhbGluZyBpcyBjaG9zZW4gc28gZmluYWwgc2NhbGVkIHJlc3VsdCBmaXRzIGluIGludDMyX3QKKyAgLy8gLSBpbnB1dCB4IGlzIGluIHRoZSByYW5nZSAtKDE8PDQ3KSA8PSB4IDwgKDE8PDQ3KQorICBURkxJVEVfRENIRUNLKHF1YW50aXplZF9tdWx0aXBsaWVyID49IDApOworICBURkxJVEVfRENIRUNLKHNoaWZ0ID49IC0zMSAmJiBzaGlmdCA8IDgpOworICBURkxJVEVfRENIRUNLKHggPj0gLShzdGF0aWNfY2FzdDxpbnQ2NF90PigxKSA8PCA0NykgJiYKKyAgICAgICAgICAgICAgICB4IDwgKHN0YXRpY19jYXN0PGludDY0X3Q+KDEpIDw8IDQ3KSk7CisKKyAgY29uc3QgaW50MzJfdCByZWR1Y2VkX211bHRpcGxpZXIgPQorICAgICAgKHF1YW50aXplZF9tdWx0aXBsaWVyIDwgMHg3RkZGMDAwMCkKKyAgICAgICAgICA/ICgocXVhbnRpemVkX211bHRpcGxpZXIgKyAoMSA8PCAxNSkpID4+IDE2KQorICAgICAgICAgIDogMHg3RkZGOworICBjb25zdCBpbnQ2NF90IHRvdGFsX3NoaWZ0ID0gMTUgLSBzaGlmdDsKKyAgY29uc3QgaW50NjRfdCByb3VuZCA9IHN0YXRpY19jYXN0PGludDY0X3Q+KDEpIDw8ICh0b3RhbF9zaGlmdCAtIDEpOworICBpbnQ2NF90IHJlc3VsdCA9IHggKiBzdGF0aWNfY2FzdDxpbnQ2NF90PihyZWR1Y2VkX211bHRpcGxpZXIpICsgcm91bmQ7CisgIHJlc3VsdCA9IHJlc3VsdCA+PiB0b3RhbF9zaGlmdDsKKworICBURkxJVEVfRENIRUNLKHJlc3VsdCA+PSBzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptaW4oKSAmJgorICAgICAgICAgICAgICAgIHJlc3VsdCA8PSBzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgoKSk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihyZXN1bHQpOworfQorLy8gRG91YmxlLXJvdW5kaW5nIE11bHRpcGx5QnlRdWFudGl6ZWRNdWx0aXBsaWVyCisjZWxzZQogaW50MzJfdCBNdWx0aXBseUJ5UXVhbnRpemVkTXVsdGlwbGllcihpbnQzMl90IHgsIGludDMyX3QgcXVhbnRpemVkX211bHRpcGxpZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaGlmdCkgewogICB1c2luZyBnZW1tbG93cDo6Um91bmRpbmdEaXZpZGVCeVBPVDsKQEAgLTUxLDUgKzk4LDYgQEAKICAgaW50MzJfdCByZXN1bHQgPSB4ID4+IHRvdGFsX3NoaWZ0OwogICByZXR1cm4gcmVzdWx0OwogfQorI2VuZGlmICAvLyBURkxJVEVfU0lOR0xFX1JPVU5ESU5HCiAKIH0gIC8vIG5hbWVzcGFjZSB0ZmxpdGUKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL2NvbW1vbi5oIGIvdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvY29tbW9uLmgKaW5kZXggMDUxODRkZi4uOTc2MWE4YyAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvY29tbW9uLmgKKysrIGIvdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvY29tbW9uLmgKQEAgLTE2LDYgKzE2LDEwIEBACiAjZGVmaW5lIFRFTlNPUkZMT1dfTElURV9LRVJORUxTX0lOVEVSTkFMX0NPTU1PTl9IXwogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKworI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3J1bnRpbWVfc2hhcGUuaCIKICNpZm5kZWYgQUxMT1dfU0xPV19HRU5FUklDX0RFUFRIV0lTRUNPTlZfRkFMTEJBQ0sKICNpZmRlZiBHRU1NTE9XUF9BTExPV19TTE9XX1NDQUxBUl9GQUxMQkFDSwogI2RlZmluZSBBTExPV19TTE9XX0dFTkVSSUNfREVQVEhXSVNFQ09OVl9GQUxMQkFDSwpAQCAtMzUsNiArMzksMTE3IEBACiAKIGNvbnN0ZXhwciBpbnQga1JldmVyc2VTaGlmdCA9IC0xOwogCisvLyBSZWR1Y2VzIGFuZCBjb21wcmVzc2VzIGRpbWVuc2lvbnMgc28gdGhhdCBicm9hZGNhc3QgaGFuZGxpbmcgYmVjb21lcyBtb3JlCisvLyBlZmZpY2llbnQuIFJldHVybnMgdHJ1ZSBpZiB0aGUgb3V0cHV0IHNoYXBlIGlzIGJyb2FkY2FzdGFibGU7IGl0IGRvZXNuJ3QKKy8vIGNvbnRhaW4gYW55IGRlZ2VuZXJhdGUgZGltZW5zaW9uLCBpLmUuIHNoYXBlIGRpbWVuc2lvbiA9IDAuIEZhbHNlIG90aGVyd2lzZS4KK3RlbXBsYXRlIDxpbnQgTUFYX0RJTSA9IDY+Citib29sIFJlZHVjZURpbWVuc2lvbnNGb3JCcm9hZGNhc3QoY29uc3QgUnVudGltZVNoYXBlJiBpbnB1dDFfc2hhcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUnVudGltZVNoYXBlJiBpbnB1dDJfc2hhcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBjb21wcmVzc2VkX2lucHV0MV9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBjb21wcmVzc2VkX2lucHV0Ml9zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBjb21wcmVzc2VkX291dHB1dF9zaGFwZSkgeworICBzaXplX3QgbnVtX2NvbXByZXNzZWRfZGltcyA9IDA7CisgIHNpemVfdCBjb21wcmVzc2VkX2lucHV0MV9zaGFwZVtNQVhfRElNXTsKKyAgc2l6ZV90IGNvbXByZXNzZWRfaW5wdXQyX3NoYXBlW01BWF9ESU1dOworICBzdGQ6OmZpbGwoY29tcHJlc3NlZF9pbnB1dDFfc2hhcGUsIGNvbXByZXNzZWRfaW5wdXQxX3NoYXBlICsgTUFYX0RJTSwgMSk7CisgIHN0ZDo6ZmlsbChjb21wcmVzc2VkX2lucHV0Ml9zaGFwZSwgY29tcHJlc3NlZF9pbnB1dDJfc2hhcGUgKyBNQVhfRElNLCAxKTsKKyAgc3RkOjpmaWxsKGNvbXByZXNzZWRfb3V0cHV0X3NoYXBlLCBjb21wcmVzc2VkX291dHB1dF9zaGFwZSArIE1BWF9ESU0sIDEpOworICBib29sIGJyb2FkY2FzdF9pbnB1dDEgPSBmYWxzZTsKKyAgYm9vbCBicm9hZGNhc3RfaW5wdXQyID0gZmFsc2U7CisgIGJvb2wgZmlyc3Rfbm9udW5pdCA9IHRydWU7CisgIGNvbnN0IHNpemVfdCBudW1faW5wdXQxX2RpbXMgPSBpbnB1dDFfc2hhcGUuRGltZW5zaW9uc0NvdW50KCk7CisgIGNvbnN0IHNpemVfdCBudW1faW5wdXQyX2RpbXMgPSBpbnB1dDJfc2hhcGUuRGltZW5zaW9uc0NvdW50KCk7CisgIGNvbnN0IGludDMyX3QqIGlucHV0MV9kaW1zID0gaW5wdXQxX3NoYXBlLkRpbXNEYXRhKCk7CisgIGNvbnN0IGludDMyX3QqIGlucHV0Ml9kaW1zID0gaW5wdXQyX3NoYXBlLkRpbXNEYXRhKCk7CisgIGNvbnN0IHNpemVfdCBudW1fY29tbW9uX2RpbXMgPSBzdGQ6Om1pbihudW1faW5wdXQxX2RpbXMsIG51bV9pbnB1dDJfZGltcyk7CisgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDw9IG51bV9jb21tb25fZGltczsgaSsrKSB7CisgICAgY29uc3Qgc2l6ZV90IGlucHV0MV9kaW0gPSBpbnB1dDFfZGltc1tudW1faW5wdXQxX2RpbXMgLSBpXTsKKyAgICBjb25zdCBzaXplX3QgaW5wdXQyX2RpbSA9IGlucHV0Ml9kaW1zW251bV9pbnB1dDJfZGltcyAtIGldOworICAgIGlmIChpbnB1dDFfZGltID09IDAgfHwgaW5wdXQyX2RpbSA9PSAwKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChpbnB1dDFfZGltID09IDEgJiYgaW5wdXQyX2RpbSA9PSAxKSB7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgYXNzZXJ0KCFicm9hZGNhc3RfaW5wdXQxIHx8ICFicm9hZGNhc3RfaW5wdXQyKTsKKworICAgIGlmIChpbnB1dDFfZGltID09IDEpIHsKKyAgICAgIGlmICghYnJvYWRjYXN0X2lucHV0MSkgeworICAgICAgICBicm9hZGNhc3RfaW5wdXQxID0gdHJ1ZTsKKyAgICAgICAgYnJvYWRjYXN0X2lucHV0MiA9IGZhbHNlOworICAgICAgICBudW1fY29tcHJlc3NlZF9kaW1zKys7CisgICAgICB9CisgICAgICBjb21wcmVzc2VkX2lucHV0Ml9zaGFwZVtudW1fY29tcHJlc3NlZF9kaW1zIC0gMV0gKj0gaW5wdXQyX2RpbTsKKyAgICAgIGNvbXByZXNzZWRfb3V0cHV0X3NoYXBlW251bV9jb21wcmVzc2VkX2RpbXMgLSAxXSAqPSBpbnB1dDJfZGltOworICAgIH0gZWxzZSBpZiAoaW5wdXQyX2RpbSA9PSAxKSB7CisgICAgICBpZiAoIWJyb2FkY2FzdF9pbnB1dDIpIHsKKyAgICAgICAgYnJvYWRjYXN0X2lucHV0MSA9IGZhbHNlOworICAgICAgICBicm9hZGNhc3RfaW5wdXQyID0gdHJ1ZTsKKyAgICAgICAgbnVtX2NvbXByZXNzZWRfZGltcysrOworICAgICAgfQorICAgICAgY29tcHJlc3NlZF9pbnB1dDFfc2hhcGVbbnVtX2NvbXByZXNzZWRfZGltcyAtIDFdICo9IGlucHV0MV9kaW07CisgICAgICBjb21wcmVzc2VkX291dHB1dF9zaGFwZVtudW1fY29tcHJlc3NlZF9kaW1zIC0gMV0gKj0gaW5wdXQxX2RpbTsKKyAgICB9IGVsc2UgeworICAgICAgVEZMSVRFX0RDSEVDSyhpbnB1dDFfZGltID09IGlucHV0Ml9kaW0pOworICAgICAgaWYgKGJyb2FkY2FzdF9pbnB1dDEgfHwgYnJvYWRjYXN0X2lucHV0MiB8fCBmaXJzdF9ub251bml0KSB7CisgICAgICAgIGJyb2FkY2FzdF9pbnB1dDEgPSBmYWxzZTsKKyAgICAgICAgYnJvYWRjYXN0X2lucHV0MiA9IGZhbHNlOworICAgICAgICBudW1fY29tcHJlc3NlZF9kaW1zKys7CisgICAgICB9CisgICAgICBjb21wcmVzc2VkX2lucHV0MV9zaGFwZVtudW1fY29tcHJlc3NlZF9kaW1zIC0gMV0gKj0gaW5wdXQxX2RpbTsKKyAgICAgIGNvbXByZXNzZWRfaW5wdXQyX3NoYXBlW251bV9jb21wcmVzc2VkX2RpbXMgLSAxXSAqPSBpbnB1dDFfZGltOworICAgICAgY29tcHJlc3NlZF9vdXRwdXRfc2hhcGVbbnVtX2NvbXByZXNzZWRfZGltcyAtIDFdICo9IGlucHV0MV9kaW07CisgICAgfQorICAgIGZpcnN0X25vbnVuaXQgPSBmYWxzZTsKKyAgfQorICBpZiAobnVtX2lucHV0MV9kaW1zID4gbnVtX2lucHV0Ml9kaW1zKSB7CisgICAgaWYgKCFicm9hZGNhc3RfaW5wdXQyKSB7CisgICAgICBudW1fY29tcHJlc3NlZF9kaW1zKys7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtX2lucHV0MV9kaW1zIC0gbnVtX2lucHV0Ml9kaW1zOyBpKyspIHsKKyAgICAgIGNvbnN0IHNpemVfdCBpbnB1dDFfZGltID0gaW5wdXQxX2RpbXNbaV07CisgICAgICBpZiAoaW5wdXQxX2RpbSA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGNvbXByZXNzZWRfaW5wdXQxX3NoYXBlW251bV9jb21wcmVzc2VkX2RpbXMgLSAxXSAqPSBpbnB1dDFfZGltOworICAgICAgY29tcHJlc3NlZF9vdXRwdXRfc2hhcGVbbnVtX2NvbXByZXNzZWRfZGltcyAtIDFdICo9IGlucHV0MV9kaW07CisgICAgfQorICB9IGVsc2UgaWYgKG51bV9pbnB1dDJfZGltcyA+IG51bV9pbnB1dDFfZGltcykgeworICAgIGlmICghYnJvYWRjYXN0X2lucHV0MSkgeworICAgICAgbnVtX2NvbXByZXNzZWRfZGltcysrOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bV9pbnB1dDJfZGltcyAtIG51bV9pbnB1dDFfZGltczsgaSsrKSB7CisgICAgICBjb25zdCBzaXplX3QgaW5wdXQyX2RpbSA9IGlucHV0Ml9kaW1zW2ldOworICAgICAgaWYgKGlucHV0Ml9kaW0gPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBjb21wcmVzc2VkX2lucHV0Ml9zaGFwZVtudW1fY29tcHJlc3NlZF9kaW1zIC0gMV0gKj0gaW5wdXQyX2RpbTsKKyAgICAgIGNvbXByZXNzZWRfb3V0cHV0X3NoYXBlW251bV9jb21wcmVzc2VkX2RpbXMgLSAxXSAqPSBpbnB1dDJfZGltOworICAgIH0KKyAgfQorICBudW1fY29tcHJlc3NlZF9kaW1zID0gKG51bV9jb21wcmVzc2VkX2RpbXMgPiAxKSA/IG51bV9jb21wcmVzc2VkX2RpbXMgOiAxOworCisgIGludCBpbnB1dDFfc3RyaWRlID0gMTsKKyAgaW50IGlucHV0Ml9zdHJpZGUgPSAxOworICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9ESU07ICsraSkgeworICAgIGNvbXByZXNzZWRfaW5wdXQxX3N0cmlkZVtpXSA9IGlucHV0MV9zdHJpZGU7CisgICAgaW5wdXQxX3N0cmlkZSAqPSBjb21wcmVzc2VkX2lucHV0MV9zaGFwZVtpXTsKKyAgICBjb21wcmVzc2VkX2lucHV0Ml9zdHJpZGVbaV0gPSBpbnB1dDJfc3RyaWRlOworICAgIGlucHV0Ml9zdHJpZGUgKj0gY29tcHJlc3NlZF9pbnB1dDJfc2hhcGVbaV07CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfRElNOyArK2kpIHsKKyAgICBpZiAoY29tcHJlc3NlZF9pbnB1dDFfc2hhcGVbaV0gIT0gY29tcHJlc3NlZF9pbnB1dDJfc2hhcGVbaV0pIHsKKyAgICAgIGlmIChjb21wcmVzc2VkX2lucHV0MV9zaGFwZVtpXSA9PSAxKSB7CisgICAgICAgIGNvbXByZXNzZWRfaW5wdXQxX3N0cmlkZVtpXSA9IDA7CisgICAgICB9IGVsc2UgeworICAgICAgICBURkxJVEVfRENIRUNLX0VRKGNvbXByZXNzZWRfaW5wdXQyX3NoYXBlW2ldLCAxKTsKKyAgICAgICAgY29tcHJlc3NlZF9pbnB1dDJfc3RyaWRlW2ldID0gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKIGlubGluZSB2b2lkIEdldEFjdGl2YXRpb25NaW5NYXgoRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb25UeXBlIGFjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogb3V0cHV0X2FjdGl2YXRpb25fbWluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogb3V0cHV0X2FjdGl2YXRpb25fbWF4KSB7CkBAIC0xNDIsMjQgKzI1NywxNCBAQAogI2VuZGlmCiB9CiAKK1RGTElURV9OT0lOTElORSBpbnQzMl90IE11bHRpcGx5QnlRdWFudGl6ZWRNdWx0aXBsaWVyKAorICAgIGludDMyX3QgeCwgaW50MzJfdCBxdWFudGl6ZWRfbXVsdGlwbGllciwgaW50IHNoaWZ0KTsKKworVEZMSVRFX05PSU5MSU5FIGludDMyX3QgTXVsdGlwbHlCeVF1YW50aXplZE11bHRpcGxpZXIoCisgICAgaW50NjRfdCB4LCBpbnQzMl90IHF1YW50aXplZF9tdWx0aXBsaWVyLCBpbnQgc2hpZnQpOworCiAvLyBTaW5nbGUtcm91bmRpbmcgTXVsdGlwbHlCeVF1YW50aXplZE11bHRpcGxpZXIKICNpZiBURkxJVEVfU0lOR0xFX1JPVU5ESU5HCi1pbmxpbmUgaW50MzJfdCBNdWx0aXBseUJ5UXVhbnRpemVkTXVsdGlwbGllcihpbnQzMl90IHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHF1YW50aXplZF9tdWx0aXBsaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNoaWZ0KSB7Ci0gIFRGTElURV9EQ0hFQ0socXVhbnRpemVkX211bHRpcGxpZXIgPj0gMCk7Ci0gIFRGTElURV9EQ0hFQ0soc2hpZnQgPj0gLTMxICYmIHNoaWZ0IDw9IDMwKTsKLQotICBjb25zdCBpbnQ2NF90IHRvdGFsX3NoaWZ0ID0gMzEgLSBzaGlmdDsKLSAgY29uc3QgaW50NjRfdCByb3VuZCA9IHN0YXRpY19jYXN0PGludDY0X3Q+KDEpIDw8ICh0b3RhbF9zaGlmdCAtIDEpOwotICBpbnQ2NF90IHJlc3VsdCA9IHggKiBzdGF0aWNfY2FzdDxpbnQ2NF90PihxdWFudGl6ZWRfbXVsdGlwbGllcikgKyByb3VuZDsKLSAgcmVzdWx0ID0gcmVzdWx0ID4+IHRvdGFsX3NoaWZ0OwotCi0gIFRGTElURV9EQ0hFQ0socmVzdWx0ID49IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbigpICYmCi0gICAgICAgICAgICAgICAgcmVzdWx0IDw9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1heCgpKTsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KHJlc3VsdCk7Ci19Ci0KIGlubGluZSBpbnQzMl90IE11bHRpcGx5QnlRdWFudGl6ZWRNdWx0aXBsaWVyU21hbGxlclRoYW5PbmVFeHAoCiAgICAgaW50MzJfdCB4LCBpbnQzMl90IHF1YW50aXplZF9tdWx0aXBsaWVyLCBpbnQgc2hpZnQpIHsKICAgVEZMSVRFX0RDSEVDS19MRShzaGlmdCwgMCk7CkBAIC0xNzIsMzYgKzI3Nyw2IEBACiAgIHJldHVybiBNdWx0aXBseUJ5UXVhbnRpemVkTXVsdGlwbGllcih4LCBxdWFudGl6ZWRfbXVsdGlwbGllciwgc2hpZnQpOwogfQogCi1pbmxpbmUgaW50MzJfdCBNdWx0aXBseUJ5UXVhbnRpemVkTXVsdGlwbGllcihpbnQ2NF90IHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHF1YW50aXplZF9tdWx0aXBsaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNoaWZ0KSB7Ci0gIC8vIElucHV0czoKLSAgLy8gLSBxdWFudGl6ZWRfbXVsdGlwbGllciBoYXMgZml4ZWQgcG9pbnQgYXQgYml0IDMxCi0gIC8vIC0gc2hpZnQgaXMgLTMxIHRvICs3IChuZWdhdGl2ZSBmb3IgcmlnaHQgc2hpZnQpCi0gIC8vCi0gIC8vIEFzc3VtcHRpb25zOiBUaGUgZm9sbG93aW5nIGlucHV0IHJhbmdlcyBhcmUgYXNzdW1lZAotICAvLyAtIHF1YW50aXplX3NjYWxlPj0wICAodGhlIHVzdWFsIHJhbmdlIGlzICgxPDwzMCkgdG8gKDE+PjMxKS0xKQotICAvLyAtIHNjYWxpbmcgaXMgY2hvc2VuIHNvIGZpbmFsIHNjYWxlZCByZXN1bHQgZml0cyBpbiBpbnQzMl90Ci0gIC8vIC0gaW5wdXQgeCBpcyBpbiB0aGUgcmFuZ2UgLSgxPDw0NykgPD0geCA8ICgxPDw0NykKLSAgVEZMSVRFX0RDSEVDSyhxdWFudGl6ZWRfbXVsdGlwbGllciA+PSAwKTsKLSAgVEZMSVRFX0RDSEVDSyhzaGlmdCA+PSAtMzEgJiYgc2hpZnQgPCA4KTsKLSAgVEZMSVRFX0RDSEVDSyh4ID49IC0oc3RhdGljX2Nhc3Q8aW50NjRfdD4oMSkgPDwgNDcpICYmCi0gICAgICAgICAgICAgICAgeCA8IChzdGF0aWNfY2FzdDxpbnQ2NF90PigxKSA8PCA0NykpOwotCi0gIGNvbnN0IGludDMyX3QgcmVkdWNlZF9tdWx0aXBsaWVyID0KLSAgICAgIChxdWFudGl6ZWRfbXVsdGlwbGllciA8IDB4N0ZGRjAwMDApCi0gICAgICAgICAgPyAoKHF1YW50aXplZF9tdWx0aXBsaWVyICsgKDEgPDwgMTUpKSA+PiAxNikKLSAgICAgICAgICA6IDB4N0ZGRjsKLSAgY29uc3QgaW50NjRfdCB0b3RhbF9zaGlmdCA9IDE1IC0gc2hpZnQ7Ci0gIGNvbnN0IGludDY0X3Qgcm91bmQgPSBzdGF0aWNfY2FzdDxpbnQ2NF90PigxKSA8PCAodG90YWxfc2hpZnQgLSAxKTsKLSAgaW50NjRfdCByZXN1bHQgPSB4ICogc3RhdGljX2Nhc3Q8aW50NjRfdD4ocmVkdWNlZF9tdWx0aXBsaWVyKSArIHJvdW5kOwotICByZXN1bHQgPSByZXN1bHQgPj4gdG90YWxfc2hpZnQ7Ci0KLSAgVEZMSVRFX0RDSEVDSyhyZXN1bHQgPj0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKCkgJiYKLSAgICAgICAgICAgICAgICByZXN1bHQgPD0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KCkpOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVzdWx0KTsKLX0KLQogI2lmZGVmIFVTRV9ORU9OCiBpbmxpbmUgaW50MzJ4NHg0X3QgTXVsdGlwbHlCeVF1YW50aXplZE11bHRpcGxpZXI0Um93cygKICAgICBpbnQzMng0eDRfdCBpbnB1dF92YWwsIGludDMyX3QgcXVhbnRpemVkX211bHRpcGxpZXIsIGludCBzaGlmdCkgewpAQCAtMjUxLDEyICszMjYsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aXplZF9tdWx0aXBsaWVyKTsKIH0KIAotVEZMSVRFX05PSU5MSU5FIGludDMyX3QgTXVsdGlwbHlCeVF1YW50aXplZE11bHRpcGxpZXIoCi0gICAgaW50MzJfdCB4LCBpbnQzMl90IHF1YW50aXplZF9tdWx0aXBsaWVyLCBpbnQgc2hpZnQpOwotCi1URkxJVEVfTk9JTkxJTkUgaW50MzJfdCBNdWx0aXBseUJ5UXVhbnRpemVkTXVsdGlwbGllcigKLSAgICBpbnQ2NF90IHgsIGludDMyX3QgcXVhbnRpemVkX211bHRpcGxpZXIsIGludCBzaGlmdCk7Ci0KICNpZmRlZiBVU0VfTkVPTgogLy8gUm91bmQgdXNlcyBBUk0ncyByb3VuZGluZyBzaGlmdCByaWdodC4KIGlubGluZSBpbnQzMng0eDRfdCBNdWx0aXBseUJ5UXVhbnRpemVkTXVsdGlwbGllcjRSb3dzKApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvY3BwbWF0aC5oIGIvdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvY3BwbWF0aC5oCmluZGV4IGM5N2NjMzEuLjY3YWI0NjEgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL2NwcG1hdGguaAorKysgYi90ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9jcHBtYXRoLmgKQEAgLTMyLDggKzMyLDggQEAKICAgICByZXR1cm4gVEZfTElURV9HTE9CQUxfU1REX1BSRUZJWDo6c3RkX25hbWUoeCk7ICAgIFwKICAgfQogCi1ERUNMQVJFX1NURF9HTE9CQUxfU1dJVENIMShUZkxpdGVSb3VuZCwgcm91bmQpOwotREVDTEFSRV9TVERfR0xPQkFMX1NXSVRDSDEoVGZMaXRlRXhwbTEsIGV4cG0xKTsKK0RFQ0xBUkVfU1REX0dMT0JBTF9TV0lUQ0gxKFRmTGl0ZVJvdW5kLCByb3VuZCkKK0RFQ0xBUkVfU1REX0dMT0JBTF9TV0lUQ0gxKFRmTGl0ZUV4cG0xLCBleHBtMSkKIAogfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQogCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9wb3J0YWJsZV90ZW5zb3IuaCBiL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3BvcnRhYmxlX3RlbnNvci5oCmluZGV4IDFlZWU2MjEuLmE5Zjk1NTEgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3BvcnRhYmxlX3RlbnNvci5oCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3BvcnRhYmxlX3RlbnNvci5oCkBAIC0xNSw2ICsxNSw3IEBACiAjaWZuZGVmIFRFTlNPUkZMT1dfTElURV9LRVJORUxTX0lOVEVSTkFMX1BPUlRBQkxFX1RFTlNPUl9IXwogI2RlZmluZSBURU5TT1JGTE9XX0xJVEVfS0VSTkVMU19JTlRFUk5BTF9QT1JUQUJMRV9URU5TT1JfSF8KIAorI2luY2x1ZGUgPGNzdGRkZWY+CiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2NvcmUvYy9jb21tb24uaCIKQEAgLTUwLDYgKzUxLDI2IEBACiAgICAgICBhbGxfc2hhcGVfcHRyXy5wdXNoX2JhY2soJmFsbF9zaGFwZV9baV0pOwogICAgIH0KICAgfQorCisgIGV4cGxpY2l0IFZlY3Rvck9mVGVuc29ycyhjb25zdCBzdGQ6OnZlY3RvcjxUZkxpdGVUZW5zb3IqPiYgdGVuc29ycykgeworICAgIGludCBudW1fdGVuc29ycyA9IHRlbnNvcnMuc2l6ZSgpOworCisgICAgYWxsX2RhdGFfLnJlc2VydmUobnVtX3RlbnNvcnMpOworICAgIGFsbF9zaGFwZV8ucmVzZXJ2ZShudW1fdGVuc29ycyk7CisgICAgYWxsX3NoYXBlX3B0cl8ucmVzZXJ2ZShudW1fdGVuc29ycyk7CisKKyAgICBmb3IgKGF1dG8qIHQgOiB0ZW5zb3JzKSB7CisgICAgICBhbGxfZGF0YV8ucHVzaF9iYWNrKEdldFRlbnNvckRhdGE8VD4odCkpOworICAgICAgYWxsX3NoYXBlXy5wdXNoX2JhY2soR2V0VGVuc29yU2hhcGUodCkpOworICAgIH0KKworICAgIC8vIFRha2luZyB0aGUgcG9pbnRlciBmcm9tIGluc2lkZSBhIHN0ZDo6dmVjdG9yIGlzIG9ubHkgT0sgaWYgdGhlIHZlY3RvciBpcworICAgIC8vIG5ldmVyIG1vZGlmaWVkLCBzbyB3ZSBwb3B1bGF0ZSBhbGxfc2hhcGUgaW4gdGhlIHByZXZpb3VzIGxvb3AgYW5kIHRoZW4gd2UKKyAgICAvLyBhcmUgZnJlZSB0byBncmFiIGl0ZXJhdG9ycyBoZXJlLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX3RlbnNvcnM7ICsraSkgeworICAgICAgYWxsX3NoYXBlX3B0cl8ucHVzaF9iYWNrKCZhbGxfc2hhcGVfW2ldKTsKKyAgICB9CisgIH0KICAgLy8gUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZGF0YSBwb2ludGVycyBvZiBhbGwgdGVuc29ycyBpbiB0aGUgbGlzdC4gRm9yCiAgIC8vIGV4YW1wbGU6CiAgIC8vICAgZmxvYXQqIGNvbnN0KiBmID0gdi5kYXRhKCk7CkBAIC02Miw2ICs4Myw4IEBACiAgIC8vICAgZGltc1sxXSBhcmUgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIHNlY29uZCB0ZW5zb3IgaW4gdGhlIGxpc3QuCiAgIGNvbnN0IFJ1bnRpbWVTaGFwZSogY29uc3QqIHNoYXBlcygpIGNvbnN0IHsgcmV0dXJuIGFsbF9zaGFwZV9wdHJfLmRhdGEoKTsgfQogCisgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gYWxsX2RhdGFfLnNpemUoKTsgfQorCiAgcHJpdmF0ZToKICAgc3RkOjp2ZWN0b3I8VCo+IGFsbF9kYXRhXzsKICAgc3RkOjp2ZWN0b3I8UnVudGltZVNoYXBlPiBhbGxfc2hhcGVfOwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvcG9ydGFibGVfdGVuc29yX3V0aWxzLmNjIGIvdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvcG9ydGFibGVfdGVuc29yX3V0aWxzLmNjCmluZGV4IDAyNDA0M2QuLjU3N2ZjNmIgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3BvcnRhYmxlX3RlbnNvcl91dGlscy5jYworKysgYi90ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9wb3J0YWJsZV90ZW5zb3JfdXRpbHMuY2MKQEAgLTcwLDYgKzcwLDEyIEBACiAKIHZvaWQgVW5wYWNrRGVuc2VJbnQ0SW50b0ludDgoY29uc3QgaW50OF90KiBzcmNfYnVmZmVyLCBpbnQgbnVtX2VsZW1lbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QqIGRzdF9idWZmZXIpIHsKKyAgLy8gbnVtX2VsZW1lbnRzIG1lYW5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgcmVnYXJkbGVzcyBvZiBwYWNrZWQgb3IgdW5wYWNrZWQuCisgIC8vIEZvciBleGFtcGxlLCAzIGVsZW1lbnRzIG1lYW5zIGJvdGgKKyAgLy8gICAxKSBQYWNrZWQ6IDMgaW50NCdzID0gMTIgYml0IC0+IDE2IGJpdHMgKHBhZGRlZCkgPSAyIGJ5dGVzLgorICAvLyAgICAgIHN0b3JlZCBpbiBzcmNfYnVmZmVyWzBdIGFuZCBzcmNfYnVmZmVyWzFdIChpID0gMC4uMSkKKyAgLy8gICAyKSBVbnBhY2tlZDogMyBpbnQ4J3MgPSAzIGJ5dGVzLgorICAvLy4gICAgIHN0b3JlZCBpbiBkc3RfYnVmZmVyWzBdLCBkc3RfYnVmZmVyWzFdIGFuZCBkc3RfYnVmZmVyWzJdIChqID0gMC4uMikKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fZWxlbWVudHMgLyAyOyBpKyspIHsKICAgICBpbnQ4X3QgYnl0ZSA9IHNyY19idWZmZXJbaV07CiAgICAgLy8gU2hpZnQgbGVmdCBmaXJzdCBzbyB0aGF0IHNpZ24gaXMgcHJvcGVybHkgZXh0ZW5kZWQgd2hlbiBzaGlmdGVkIHJpZ2h0CmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9wb3J0YWJsZV90ZW5zb3JfdXRpbHMuaCBiL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3BvcnRhYmxlX3RlbnNvcl91dGlscy5oCmluZGV4IGMyODg5MmMuLmVkNTlmZDAgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3BvcnRhYmxlX3RlbnNvcl91dGlscy5oCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3BvcnRhYmxlX3RlbnNvcl91dGlscy5oCkBAIC0yNDEsNyArMjQxLDggQEAKICAgICBjb25zdCBpbnQzMl90KiBfX3Jlc3RyaWN0X18gaW5kaWNlcywgaW50IG1fcm93cywgaW50IG1fY29scywKICAgICBjb25zdCBpbnQ4X3QqIF9fcmVzdHJpY3RfXyB2ZWN0b3IsIGNvbnN0IGludDMyX3QqIF9fcmVzdHJpY3RfXyBiaWFzX3ZlY3RvciwKICAgICBpbnQgbl9iYXRjaCwgY29uc3QgaW50MzJfdCBpbnB1dF9vZmZzZXQsIGNvbnN0IGludDMyX3Qgb3V0cHV0X211bHRpcGxpZXIsCi0gICAgY29uc3QgaW50MzJfdCBvdXRwdXRfc2hpZnQsIGNvbnN0IGludDMyX3Qgb3V0cHV0X29mZnNldCwKKyAgICBpbnQzMl90IG91dHB1dF9zaGlmdCwgY29uc3QgaW50MzJfdCogcGVyX2NoYW5uZWxfc2NhbGUsCisgICAgY29uc3QgaW50MzJfdCogcGVyX2NoYW5uZWxfc2hpZnQsIGludDMyX3Qgb3V0cHV0X29mZnNldCwKICAgICBjb25zdCBpbnQzMl90IG91dHB1dF9hY3RpdmF0aW9uX21pbiwgY29uc3QgaW50MzJfdCBvdXRwdXRfYWN0aXZhdGlvbl9tYXgsCiAgICAgaW50OF90KiBfX3Jlc3RyaWN0X18gcmVzdWx0KTsKIApAQCAtMjU5LDcgKzI2MCw3IEBACiAgICAgY29uc3QgaW50OF90KiBfX3Jlc3RyaWN0X18gbWF0cml4LCBjb25zdCB1aW50OF90KiBfX3Jlc3RyaWN0X18gbGVkZ2VyLAogICAgIGNvbnN0IGludCBtX3Jvd3MsIGNvbnN0IGludCBtX2NvbHMsIGNvbnN0IGludDhfdCogX19yZXN0cmljdF9fIHZlY3RvcnMsCiAgICAgY29uc3QgZmxvYXQqIF9fcmVzdHJpY3RfXyBzY2FsaW5nX2ZhY3RvcnMsIGludCBuX2JhdGNoLAotICAgIGZsb2F0KiBfX3Jlc3RyaWN0X18gcmVzdWx0KTsKKyAgICBmbG9hdCogX19yZXN0cmljdF9fIHJlc3VsdCwgY29uc3QgZmxvYXQqIHBlcl9jaGFubmVsX3NjYWxlID0gbnVsbHB0cik7CiAKIC8vIFNhbWUgYXMgdGhlIGFib3ZlIDgsIDgsIDggaW50ZWdlciBtYXRtdWwgZXhjZXB0IGZvciB0aGUgcHJlc2VuY2Ugb2YgemVybwogLy8gcG9pbnQgYW5kIG5vbi1hY2N1bXVsYXRpdmUuCkBAIC0zMTYsNyArMzE3LDcgQEAKIHZvaWQgQXBwbHlTaWdtb2lkKGNvbnN0IGludDE2X3QqIGlucHV0LCBpbnQzMl90IG5fYmF0Y2gsIGludDMyX3Qgbl9pbnB1dCwKICAgICAgICAgICAgICAgICAgIGludDE2X3QqIG91dHB1dCk7CiAKLS8vIFNhbWUgYXMgYWJvdmUgYnV0IHRoZSBpbnRlcm5hbCBjYWxjdWFsdGlvbiBpcyBmbG9hdC4KKy8vIFNhbWUgYXMgYWJvdmUgYnV0IHRoZSBpbnRlcm5hbCBjYWxjdWxhdGlvbiBpcyBmbG9hdC4KIHZvaWQgQXBwbHlTaWdtb2lkRmxvYXQoY29uc3QgaW50MTZfdCogaW5wdXQsIGludDMyX3Qgbl9iYXRjaCwgaW50MzJfdCBuX2lucHV0LAogICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiBvdXRwdXQpOwogCkBAIC0zMzIsNyArMzMzLDcgQEAKIHZvaWQgQXBwbHlUYW5oKGludDMyX3QgaW50Z2VyX2JpdHMsIGNvbnN0IGludDE2X3QqIGlucHV0LCBpbnQzMl90IG5fYmF0Y2gsCiAgICAgICAgICAgICAgICBpbnQzMl90IG5faW5wdXQsIGludDE2X3QqIG91dHB1dCk7CiAKLS8vIEFwcGx5IFRhbmggdG8gYSBxdWFudGl6ZWQgdmVjdG9yLiBUYmUgaW50ZXJuYWwgY2FsY3VsYXRpb24gaXMgaW4gZmxvYXQuCisvLyBBcHBseSBUYW5oIHRvIGEgcXVhbnRpemVkIHZlY3Rvci4gVGhlIGludGVybmFsIGNhbGN1bGF0aW9uIGlzIGluIGZsb2F0LgogLy8gICAgLSBJbnB1dCBoYXMgMl4oaW50ZWdlcl9iaXRzKSBhcyBzY2FsZS4KIC8vICAgIC0gT3V0cHV0IGhhcyBRMC4xNSBhcyBzY2FsZS4KIHZvaWQgQXBwbHlUYW5oRmxvYXQoY29uc3QgaW50MTZfdCogaW5wdXQsIGludDMyX3Qgbl9iYXRjaCwgaW50MzJfdCBuX2lucHV0LApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvcXVhbnRpemF0aW9uX3V0aWwuaCBiL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3F1YW50aXphdGlvbl91dGlsLmgKaW5kZXggMGVlOTE0Yi4uZWI0ZTg0MCAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvcXVhbnRpemF0aW9uX3V0aWwuaAorKysgYi90ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9xdWFudGl6YXRpb25fdXRpbC5oCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8bGltaXRzPgogCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvY29tcGF0aWJpbGl0eS5oIgotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL2NwcG1hdGguaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC90eXBlcy5oIgogCiBuYW1lc3BhY2UgdGZsaXRlIHsKQEAgLTEwMyw2ICsxMDIsNyBAQAogICByZXR1cm4gQ2hvb3NlUXVhbnRpemF0aW9uUGFyYW1zPFQ+KHJtaW4sIHJtYXgsIGZhbHNlKTsKIH0KIAorLy8gTElOVC5JZkNoYW5nZQogLy8gQ29udmVydHMgYSBmbG9hdGluZy1wb2ludCBudW1iZXIgdG8gYW4gaW50ZWdlci4gRm9yIGFsbCBpbnB1dHMgeCB3aGVyZQogLy8gc3RhdGljX2Nhc3Q8SW50T3V0Pih4KSBpcyBsZWdhbCBhY2NvcmRpbmcgdG8gdGhlIEMrKyBzdGFuZGFyZCwgdGhlIHJlc3VsdAogLy8gaXMgaWRlbnRpY2FsIHRvIHRoYXQgY2FzdCAoaS5lLiB0aGUgcmVzdWx0IGlzIHggd2l0aCBpdHMgZnJhY3Rpb25hbCBwYXJ0CkBAIC0xNjcsNiArMTY3LDcgQEAKICAgcmV0dXJuIHggPCAwID8gc3RkOjpudW1lcmljX2xpbWl0czxJbnRPdXQ+OjptaW4oKQogICAgICAgICAgICAgICAgOiBzdGQ6Om51bWVyaWNfbGltaXRzPEludE91dD46Om1heCgpOwogfQorLy8gTElOVC5UaGVuQ2hhbmdlKC8vdGVuc29yZmxvdy9jb21waWxlci9tbGlyL2xpdGUva2VybmVscy9pbnRlcm5hbC9xdWFudGl6YXRpb25fdXRpbC5oKQogCiAvLyBEZWNvbXBvc2UgYSBkb3VibGUgbXVsdGlwbGllciBpbnRvIGEgUTAuMzEgaW50MzIgcmVwcmVzZW50YXRpb24gb2YgaXRzCiAvLyBzaWduaWZpY2FuZCwgYW5kIHNoaWZ0IHJlcHJlc2VudGF0aW9uIG9mIE5FR0FUSVZFIGl0cyBleHBvbmVudCAtLS0KZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3JlZmVyZW5jZS9hZGQuaCBiL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3JlZmVyZW5jZS9hZGQuaAppbmRleCBiODlhNTdiLi41YjUyMGJkIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9yZWZlcmVuY2UvYWRkLmgKKysrIGIvdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvcmVmZXJlbmNlL2FkZC5oCkBAIC0xNiwxMCArMTYsMTMgQEAKICNkZWZpbmUgVEVOU09SRkxPV19MSVRFX0tFUk5FTFNfSU5URVJOQUxfUkVGRVJFTkNFX0FERF9IXwogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KICNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KIAogI2luY2x1ZGUgImZpeGVkcG9pbnQvZml4ZWRwb2ludC5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL2NvbW1vbi5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL2NvbXBhdGliaWxpdHkuaCIKIAogbmFtZXNwYWNlIHRmbGl0ZSB7CiAKQEAgLTE5NCwyMSArMTk3LDEzNSBAQAogICB9CiB9CiAKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lIHZvaWQgQWRkQnJvYWRjYXN0KGNvbnN0IFQqIGlucHV0X2RhdGEsIGNvbnN0IFQqIGJyb2FkY2FzdF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIFQqIG91dHB1dF9kYXRhLCBzaXplX3Qgc2l6ZSwgVCBhY3RpdmF0aW9uX21pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUIGFjdGl2YXRpb25fbWF4KSB7CisgIGZvciAoc2l6ZV90IGMgPSAwOyBjIDwgc2l6ZTsgKytjKSB7CisgICAgb3V0cHV0X2RhdGFbY10gPSBBY3RpdmF0aW9uRnVuY3Rpb25XaXRoTWluTWF4PFQ+KAorICAgICAgICBpbnB1dF9kYXRhW2NdICsgYnJvYWRjYXN0X2RhdGFbMF0sIGFjdGl2YXRpb25fbWluLCBhY3RpdmF0aW9uX21heCk7CisgIH0KK30KKwordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIEFkZEJyb2FkY2FzdDxpbnQzMl90Pihjb25zdCBpbnQzMl90KiBpbnB1dF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QqIGJyb2FkY2FzdF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIG91dHB1dF9kYXRhLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGFjdGl2YXRpb25fbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYWN0aXZhdGlvbl9tYXgpIHsKKyAgc2l6ZV90IGMgPSAwOworI2lmZGVmIFVTRV9ORU9OCisgIGNvbnN0IGludDMyeDRfdCB2bWF4ID0gdmR1cHFfbl9zMzIoYWN0aXZhdGlvbl9tYXgpOworICBjb25zdCBpbnQzMng0X3Qgdm1pbiA9IHZkdXBxX25fczMyKGFjdGl2YXRpb25fbWluKTsKKyAgY29uc3QgaW50MzJ4NF90IHZiID0gdmR1cHFfbl9zMzIoYnJvYWRjYXN0X2RhdGFbMF0pOworICBmb3IgKDsgYyArIDQgPD0gc2l6ZTsgYyArPSA0KSB7CisgICAgY29uc3QgaW50MzJ4NF90IHZhID0gdmxkMXFfczMyKCZpbnB1dF9kYXRhW2NdKTsKKyAgICBpbnQzMng0X3QgdnJlcyA9IHZhZGRxX3MzMih2YSwgdmIpOworICAgIHZyZXMgPSB2bWF4cV9zMzIodm1pbiwgdnJlcyk7CisgICAgdnJlcyA9IHZtaW5xX3MzMih2bWF4LCB2cmVzKTsKKyAgICB2c3QxcV9zMzIoJm91dHB1dF9kYXRhW2NdLCB2cmVzKTsKKyAgfQorI2VuZGlmCisgIGZvciAoOyBjIDwgc2l6ZTsgKytjKSB7CisgICAgb3V0cHV0X2RhdGFbY10gPSBBY3RpdmF0aW9uRnVuY3Rpb25XaXRoTWluTWF4PGludDMyX3Q+KAorICAgICAgICBpbnB1dF9kYXRhW2NdICsgYnJvYWRjYXN0X2RhdGFbMF0sIGFjdGl2YXRpb25fbWluLCBhY3RpdmF0aW9uX21heCk7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIEFkZEVsZW1lbnR3aXNlKGNvbnN0IFQqIGlucHV0MV9kYXRhLCBjb25zdCBUKiBpbnB1dDJfZGF0YSwgVCogb3V0cHV0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLCBUIGFjdGl2YXRpb25fbWluLCBUIGFjdGl2YXRpb25fbWF4KSB7CisgIGZvciAoc2l6ZV90IGMgPSAwOyBjIDwgc2l6ZTsgKytjKSB7CisgICAgb3V0cHV0X2RhdGFbY10gPSBBY3RpdmF0aW9uRnVuY3Rpb25XaXRoTWluTWF4PFQ+KAorICAgICAgICBpbnB1dDFfZGF0YVtjXSArIGlucHV0Ml9kYXRhW2NdLCBhY3RpdmF0aW9uX21pbiwgYWN0aXZhdGlvbl9tYXgpOworICB9Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgdm9pZCBBZGRFbGVtZW50d2lzZTxpbnQzMl90Pihjb25zdCBpbnQzMl90KiBpbnB1dDFfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QqIGlucHV0Ml9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogb3V0cHV0X2RhdGEsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBhY3RpdmF0aW9uX21pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYWN0aXZhdGlvbl9tYXgpIHsKKyAgc2l6ZV90IGMgPSAwOworI2lmZGVmIFVTRV9ORU9OCisgIGNvbnN0IGludDMyeDRfdCB2bWF4ID0gdmR1cHFfbl9zMzIoYWN0aXZhdGlvbl9tYXgpOworICBjb25zdCBpbnQzMng0X3Qgdm1pbiA9IHZkdXBxX25fczMyKGFjdGl2YXRpb25fbWluKTsKKyAgZm9yICg7IGMgKyA0IDw9IHNpemU7IGMgKz0gNCkgeworICAgIGNvbnN0IGludDMyeDRfdCB2YSA9IHZsZDFxX3MzMigmaW5wdXQxX2RhdGFbY10pOworICAgIGNvbnN0IGludDMyeDRfdCB2YiA9IHZsZDFxX3MzMigmaW5wdXQyX2RhdGFbY10pOworICAgIGludDMyeDRfdCB2cmVzID0gdmFkZHFfczMyKHZhLCB2Yik7CisgICAgdnJlcyA9IHZtYXhxX3MzMih2bWluLCB2cmVzKTsKKyAgICB2cmVzID0gdm1pbnFfczMyKHZtYXgsIHZyZXMpOworICAgIHZzdDFxX3MzMigmb3V0cHV0X2RhdGFbY10sIHZyZXMpOworICB9CisjZW5kaWYKKyAgZm9yICg7IGMgPCBzaXplOyArK2MpIHsKKyAgICBvdXRwdXRfZGF0YVtjXSA9IEFjdGl2YXRpb25GdW5jdGlvbldpdGhNaW5NYXg8aW50MzJfdD4oCisgICAgICAgIGlucHV0MV9kYXRhW2NdICsgaW5wdXQyX2RhdGFbY10sIGFjdGl2YXRpb25fbWluLCBhY3RpdmF0aW9uX21heCk7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbmxpbmUgdm9pZCBCcm9hZGNhc3RBZGRSZWN1cnNpdmVEaW1lbnNpb25zKAorICAgIGludCBkaW1lbnNpb24sIHNpemVfdCogaW5wdXQxX29mZnNldF9wLCBzaXplX3QqIGlucHV0Ml9vZmZzZXRfcCwKKyAgICBzaXplX3QqIG91dHB1dF9vZmZzZXQsIHNpemVfdCogY29tcHJlc3NlZF9pbnB1dDFfc3RyaWRlLAorICAgIHNpemVfdCogY29tcHJlc3NlZF9pbnB1dDJfc3RyaWRlLCBzaXplX3QqIGNvbXByZXNzZWRfb3V0cHV0X3NoYXBlLAorICAgIFQgYWN0aXZhdGlvbl9taW4sIFQgYWN0aXZhdGlvbl9tYXgsIGNvbnN0IFQqIGlucHV0MV9kYXRhLAorICAgIGNvbnN0IFQqIGlucHV0Ml9kYXRhLCBUKiBvdXRwdXRfZGF0YSkgeworICBpZiAoZGltZW5zaW9uID4gMCkgeworICAgIGZvciAoc2l6ZV90IGMgPSAwOyBjIDwgY29tcHJlc3NlZF9vdXRwdXRfc2hhcGVbZGltZW5zaW9uXTsgKytjKSB7CisgICAgICBzaXplX3QgaW5wdXQxX29mZnNldF9jID0gKmlucHV0MV9vZmZzZXRfcDsKKyAgICAgIHNpemVfdCBpbnB1dDJfb2Zmc2V0X2MgPSAqaW5wdXQyX29mZnNldF9wOworICAgICAgQnJvYWRjYXN0QWRkUmVjdXJzaXZlRGltZW5zaW9ucygKKyAgICAgICAgICBkaW1lbnNpb24gLSAxLCAmaW5wdXQxX29mZnNldF9jLCAmaW5wdXQyX29mZnNldF9jLCBvdXRwdXRfb2Zmc2V0LAorICAgICAgICAgIGNvbXByZXNzZWRfaW5wdXQxX3N0cmlkZSwgY29tcHJlc3NlZF9pbnB1dDJfc3RyaWRlLAorICAgICAgICAgIGNvbXByZXNzZWRfb3V0cHV0X3NoYXBlLCBhY3RpdmF0aW9uX21pbiwgYWN0aXZhdGlvbl9tYXgsIGlucHV0MV9kYXRhLAorICAgICAgICAgIGlucHV0Ml9kYXRhLCBvdXRwdXRfZGF0YSk7CisgICAgICAqaW5wdXQxX29mZnNldF9wICs9IGNvbXByZXNzZWRfaW5wdXQxX3N0cmlkZVtkaW1lbnNpb25dOworICAgICAgKmlucHV0Ml9vZmZzZXRfcCArPSBjb21wcmVzc2VkX2lucHV0Ml9zdHJpZGVbZGltZW5zaW9uXTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgVEZMSVRFX0RDSEVDSyhkaW1lbnNpb24gPT0gMCk7CisgICAgYm9vbCBpbnB1dDFfaXNfYnJvYWRjYXN0ID0gY29tcHJlc3NlZF9pbnB1dDFfc3RyaWRlW2RpbWVuc2lvbl0gPT0gMDsKKyAgICBib29sIGlucHV0Ml9pc19icm9hZGNhc3QgPSBjb21wcmVzc2VkX2lucHV0Ml9zdHJpZGVbZGltZW5zaW9uXSA9PSAwOworICAgIFRGTElURV9EQ0hFQ0soIShpbnB1dDFfaXNfYnJvYWRjYXN0ICYmIGlucHV0Ml9pc19icm9hZGNhc3QpKTsKKyAgICBjb25zdCBUKiBpbnB1dDFfZGF0YV9wdHIgPSBpbnB1dDFfZGF0YSArICppbnB1dDFfb2Zmc2V0X3A7CisgICAgY29uc3QgVCogaW5wdXQyX2RhdGFfcHRyID0gaW5wdXQyX2RhdGEgKyAqaW5wdXQyX29mZnNldF9wOworICAgIFQqIG91dHB1dF9kYXRhX3B0ciA9IG91dHB1dF9kYXRhICsgKm91dHB1dF9vZmZzZXQ7CisgICAgaWYgKGlucHV0MV9pc19icm9hZGNhc3QpIHsKKyAgICAgIC8vIGlucHV0MSBpcyBicm9hZGNhc3QuCisgICAgICBBZGRCcm9hZGNhc3Q8VD4oaW5wdXQyX2RhdGFfcHRyLCBpbnB1dDFfZGF0YV9wdHIsIG91dHB1dF9kYXRhX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzc2VkX291dHB1dF9zaGFwZVtkaW1lbnNpb25dLCBhY3RpdmF0aW9uX21pbiwKKyAgICAgICAgICAgICAgICAgICAgICBhY3RpdmF0aW9uX21heCk7CisgICAgICAqaW5wdXQyX29mZnNldF9wICs9IGNvbXByZXNzZWRfb3V0cHV0X3NoYXBlW2RpbWVuc2lvbl07CisgICAgfSBlbHNlIGlmIChpbnB1dDJfaXNfYnJvYWRjYXN0KSB7CisgICAgICAvLyBpbnB1dDIgaXMgYnJvYWRjYXN0LgorICAgICAgQWRkQnJvYWRjYXN0PFQ+KGlucHV0MV9kYXRhX3B0ciwgaW5wdXQyX2RhdGFfcHRyLCBvdXRwdXRfZGF0YV9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NlZF9vdXRwdXRfc2hhcGVbZGltZW5zaW9uXSwgYWN0aXZhdGlvbl9taW4sCisgICAgICAgICAgICAgICAgICAgICAgYWN0aXZhdGlvbl9tYXgpOworICAgICAgKmlucHV0MV9vZmZzZXRfcCArPSBjb21wcmVzc2VkX291dHB1dF9zaGFwZVtkaW1lbnNpb25dOworICAgIH0gZWxzZSB7CisgICAgICAvLyBBZGQgZWxlbWVudC13aXNlLgorICAgICAgQWRkRWxlbWVudHdpc2U8VD4oaW5wdXQxX2RhdGFfcHRyLCBpbnB1dDJfZGF0YV9wdHIsIG91dHB1dF9kYXRhX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzZWRfb3V0cHV0X3NoYXBlW2RpbWVuc2lvbl0sIGFjdGl2YXRpb25fbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZhdGlvbl9tYXgpOworICAgICAgKmlucHV0MV9vZmZzZXRfcCArPSBjb21wcmVzc2VkX291dHB1dF9zaGFwZVtkaW1lbnNpb25dOworICAgICAgKmlucHV0Ml9vZmZzZXRfcCArPSBjb21wcmVzc2VkX291dHB1dF9zaGFwZVtkaW1lbnNpb25dOworICAgIH0KKyAgICAqb3V0cHV0X29mZnNldCArPSBjb21wcmVzc2VkX291dHB1dF9zaGFwZVtkaW1lbnNpb25dOworICB9Cit9CisKIHRlbXBsYXRlIDx0eXBlbmFtZSBULAotICAgICAgICAgIC8vIEZvciB1bnF1YW50aXplZCBhZGQgZm9yIHNtYWxsIGludGVnZXJzLCBleHBsaWN0bHkgc2V0IHRvIHRydWUuCisgICAgICAgICAgLy8gRm9yIHVucXVhbnRpemVkIGFkZCBmb3Igc21hbGwgaW50ZWdlcnMsIGV4cGxpY2l0bHkgc2V0IHRvIHRydWUuCiAgICAgICAgICAgYm9vbCBkdW1teSA9IGZhbHNlPgogaW5saW5lIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFpc19zbWFsbF9pbnRlZ2VyPFQ+Ojp2YWx1ZSB8fCBkdW1teSwgdm9pZD46OnR5cGUKIEJyb2FkY2FzdEFkZDZEU2xvdyhjb25zdCBBcml0aG1ldGljUGFyYW1zJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgUnVudGltZVNoYXBlJiBpbnB1dDFfc2hhcGUsIGNvbnN0IFQqIGlucHV0MV9kYXRhLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgaW5wdXQyX3NoYXBlLCBjb25zdCBUKiBpbnB1dDJfZGF0YSwKICAgICAgICAgICAgICAgICAgICBjb25zdCBSdW50aW1lU2hhcGUmIG91dHB1dF9zaGFwZSwgVCogb3V0cHV0X2RhdGEpIHsKLSAgTmRBcnJheURlc2M8Nj4gZGVzYzE7Ci0gIE5kQXJyYXlEZXNjPDY+IGRlc2MyOwotICBOZEFycmF5RGVzY3NGb3JFbGVtZW50d2lzZUJyb2FkY2FzdChpbnB1dDFfc2hhcGUsIGlucHV0Ml9zaGFwZSwgJmRlc2MxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYzIpOwotICBjb25zdCBSdW50aW1lU2hhcGUgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlID0KLSAgICAgIFJ1bnRpbWVTaGFwZTo6RXh0ZW5kZWRTaGFwZSg2LCBvdXRwdXRfc2hhcGUpOwotCisgIGNvbnN0ZXhwciBpbnQga01heEJyb2FkY2FzdERpbSA9IDY7CiAgIFQgYWN0aXZhdGlvbl9taW4sIGFjdGl2YXRpb25fbWF4OwogICBHZXRBY3RpdmF0aW9uUGFyYW1zKHBhcmFtcywgJmFjdGl2YXRpb25fbWluLCAmYWN0aXZhdGlvbl9tYXgpOwogCkBAIC0yMjMsNjQgKzM0MCw3NCBAQAogICAvLyBXZSBuYW1lIG91ciB2YXJpYWJsZXMgYnkgdGhlaXIgVGVuc29yZmxvdyBjb252ZW50aW9uLCBidXQgZ2VuZXJhdGUgQyBjb2RlCiAgIC8vIG5lc3RpbmcgbG9vcHMgc3VjaCB0aGF0IHRoZSBpbm5lcm1vc3QgbG9vcCBoYXMgdGhlIHNtYWxsZXN0IHN0cmlkZSBmb3IgdGhlCiAgIC8vIGJlc3QgY2FjaGUgYmVoYXZpb3IuCi0gIHNpemVfdCBpbnB1dDFfb2Zmc2V0X2EgPSAwOwotICBzaXplX3QgaW5wdXQyX29mZnNldF9hID0gMDsKLSAgc2l6ZV90IG91dHB1dF9vZmZzZXRfYSA9IDA7Ci0gIGZvciAoaW50IGEgPSAwOyBhIDwgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoMCk7ICsrYSkgewotICAgIHNpemVfdCBpbnB1dDFfb2Zmc2V0X2QgPSBpbnB1dDFfb2Zmc2V0X2E7Ci0gICAgc2l6ZV90IGlucHV0Ml9vZmZzZXRfZCA9IGlucHV0Ml9vZmZzZXRfYTsKLSAgICBzaXplX3Qgb3V0cHV0X29mZnNldF9kID0gb3V0cHV0X29mZnNldF9hOwotICAgIGZvciAoaW50IGQgPSAwOyBkIDwgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoMSk7ICsrZCkgewotICAgICAgc2l6ZV90IGlucHV0MV9vZmZzZXRfYiA9IGlucHV0MV9vZmZzZXRfZDsKLSAgICAgIHNpemVfdCBpbnB1dDJfb2Zmc2V0X2IgPSBpbnB1dDJfb2Zmc2V0X2Q7Ci0gICAgICBzaXplX3Qgb3V0cHV0X29mZnNldF9iID0gb3V0cHV0X29mZnNldF9kOwotICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCBleHRlbmRlZF9vdXRwdXRfc2hhcGUuRGltcygyKTsgKytiKSB7Ci0gICAgICAgIHNpemVfdCBpbnB1dDFfb2Zmc2V0X3kgPSBpbnB1dDFfb2Zmc2V0X2I7Ci0gICAgICAgIHNpemVfdCBpbnB1dDJfb2Zmc2V0X3kgPSBpbnB1dDJfb2Zmc2V0X2I7Ci0gICAgICAgIHNpemVfdCBvdXRwdXRfb2Zmc2V0X3kgPSBvdXRwdXRfb2Zmc2V0X2I7Ci0gICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoMyk7ICsreSkgewotICAgICAgICAgIHNpemVfdCBpbnB1dDFfb2Zmc2V0X3ggPSBpbnB1dDFfb2Zmc2V0X3k7Ci0gICAgICAgICAgc2l6ZV90IGlucHV0Ml9vZmZzZXRfeCA9IGlucHV0Ml9vZmZzZXRfeTsKLSAgICAgICAgICBzaXplX3Qgb3V0cHV0X29mZnNldF94ID0gb3V0cHV0X29mZnNldF95OwotICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoNCk7ICsreCkgewotICAgICAgICAgICAgc2l6ZV90IGlucHV0MV9vZmZzZXRfYyA9IGlucHV0MV9vZmZzZXRfeDsKLSAgICAgICAgICAgIHNpemVfdCBpbnB1dDJfb2Zmc2V0X2MgPSBpbnB1dDJfb2Zmc2V0X3g7Ci0gICAgICAgICAgICBzaXplX3Qgb3V0cHV0X29mZnNldF9jID0gb3V0cHV0X29mZnNldF94OwotICAgICAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBleHRlbmRlZF9vdXRwdXRfc2hhcGUuRGltcyg1KTsgKytjKSB7Ci0gICAgICAgICAgICAgIG91dHB1dF9kYXRhW291dHB1dF9vZmZzZXRfY10gPSBBY3RpdmF0aW9uRnVuY3Rpb25XaXRoTWluTWF4PFQ+KAotICAgICAgICAgICAgICAgICAgaW5wdXQxX2RhdGFbaW5wdXQxX29mZnNldF9jXSArIGlucHV0Ml9kYXRhW2lucHV0Ml9vZmZzZXRfY10sCi0gICAgICAgICAgICAgICAgICBhY3RpdmF0aW9uX21pbiwgYWN0aXZhdGlvbl9tYXgpOwotICAgICAgICAgICAgICBpbnB1dDFfb2Zmc2V0X2MgKz0gZGVzYzEuc3RyaWRlc1s1XTsKLSAgICAgICAgICAgICAgaW5wdXQyX29mZnNldF9jICs9IGRlc2MyLnN0cmlkZXNbNV07Ci0gICAgICAgICAgICAgICsrb3V0cHV0X29mZnNldF9jOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5wdXQxX29mZnNldF94ICs9IGRlc2MxLnN0cmlkZXNbNF07Ci0gICAgICAgICAgICBpbnB1dDJfb2Zmc2V0X3ggKz0gZGVzYzIuc3RyaWRlc1s0XTsKLSAgICAgICAgICAgIG91dHB1dF9vZmZzZXRfeCArPSBleHRlbmRlZF9vdXRwdXRfc2hhcGUuRGltcyg1KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaW5wdXQxX29mZnNldF95ICs9IGRlc2MxLnN0cmlkZXNbM107Ci0gICAgICAgICAgaW5wdXQyX29mZnNldF95ICs9IGRlc2MyLnN0cmlkZXNbM107Ci0gICAgICAgICAgb3V0cHV0X29mZnNldF95ICs9Ci0gICAgICAgICAgICAgIGV4dGVuZGVkX291dHB1dF9zaGFwZS5EaW1zKDQpICogZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoNSk7Ci0gICAgICAgIH0KLSAgICAgICAgaW5wdXQxX29mZnNldF9iICs9IGRlc2MxLnN0cmlkZXNbMl07Ci0gICAgICAgIGlucHV0Ml9vZmZzZXRfYiArPSBkZXNjMi5zdHJpZGVzWzJdOwotICAgICAgICBvdXRwdXRfb2Zmc2V0X2IgKz0gZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoMykgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoNCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoNSk7Ci0gICAgICB9Ci0gICAgICBpbnB1dDFfb2Zmc2V0X2QgKz0gZGVzYzEuc3RyaWRlc1sxXTsKLSAgICAgIGlucHV0Ml9vZmZzZXRfZCArPSBkZXNjMi5zdHJpZGVzWzFdOwotICAgICAgb3V0cHV0X29mZnNldF9kICs9Ci0gICAgICAgICAgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoMikgKiBleHRlbmRlZF9vdXRwdXRfc2hhcGUuRGltcygzKSAqCi0gICAgICAgICAgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoNCkgKiBleHRlbmRlZF9vdXRwdXRfc2hhcGUuRGltcyg1KTsKKyAgc2l6ZV90IGNvbXByZXNzZWRfaW5wdXQxX3N0cmlkZVtrTWF4QnJvYWRjYXN0RGltXTsKKyAgc2l6ZV90IGNvbXByZXNzZWRfaW5wdXQyX3N0cmlkZVtrTWF4QnJvYWRjYXN0RGltXTsKKyAgc2l6ZV90IGNvbXByZXNzZWRfb3V0cHV0X3NoYXBlW2tNYXhCcm9hZGNhc3REaW1dOworICBib29sIGJyb2FkY2FzdGFibGVfc2hhcGUgPSBSZWR1Y2VEaW1lbnNpb25zRm9yQnJvYWRjYXN0PGtNYXhCcm9hZGNhc3REaW0+KAorICAgICAgaW5wdXQxX3NoYXBlLCBpbnB1dDJfc2hhcGUsIGNvbXByZXNzZWRfaW5wdXQxX3N0cmlkZSwKKyAgICAgIGNvbXByZXNzZWRfaW5wdXQyX3N0cmlkZSwgY29tcHJlc3NlZF9vdXRwdXRfc2hhcGUpOworICAvLyBTa2lwIGJyb2FkY2FzdGluZyBmb3IgZGVnZW5lcmF0ZSBzaGFwZXMuCisgIGlmICghYnJvYWRjYXN0YWJsZV9zaGFwZSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHNpemVfdCBpbnB1dDFfb2Zmc2V0ID0gMDsKKyAgc2l6ZV90IGlucHV0Ml9vZmZzZXQgPSAwOworICBzaXplX3Qgb3V0cHV0X29mZnNldCA9IDA7CisgIEJyb2FkY2FzdEFkZFJlY3Vyc2l2ZURpbWVuc2lvbnM8VD4oCisgICAgICBrTWF4QnJvYWRjYXN0RGltIC0gMSwgJmlucHV0MV9vZmZzZXQsICZpbnB1dDJfb2Zmc2V0LCAmb3V0cHV0X29mZnNldCwKKyAgICAgIGNvbXByZXNzZWRfaW5wdXQxX3N0cmlkZSwgY29tcHJlc3NlZF9pbnB1dDJfc3RyaWRlLAorICAgICAgY29tcHJlc3NlZF9vdXRwdXRfc2hhcGUsIGFjdGl2YXRpb25fbWluLCBhY3RpdmF0aW9uX21heCwgaW5wdXQxX2RhdGEsCisgICAgICBpbnB1dDJfZGF0YSwgb3V0cHV0X2RhdGEpOworfQorCisvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIDgtYml0IGFzIHdlbGwgYXMgZm9yIDE2LWJpdCwgYnV0IHRoZSBhY2N1bXVsYXRvcgorLy8gaXMgMzItYml0IGZvciBib3RoIGNhc2VzLiBUaGUgb3ZlcmZsb3cgZG9lcyBub3QgaGFwcGVuIGR1ZSB0byB0aGUKKy8vIGNob2ljZSBvZiB0aGUgc2hpZnQgKDIwIG9yIDE1LCBhY2NvcmRpbmdseSAtIHNlZSBhZGQuY2MgZm9yIG1vcmUgY29tbWVudHMpLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbmxpbmUgdm9pZCBCcm9hZGNhc3RBZGRSZWN1cnNpdmVEaW1lbnNpb25zKAorICAgIGNvbnN0IEFyaXRobWV0aWNQYXJhbXMmIHBhcmFtcywgaW50IGRpbWVuc2lvbiwgc2l6ZV90KiBpbnB1dDFfb2Zmc2V0X3AsCisgICAgc2l6ZV90KiBpbnB1dDJfb2Zmc2V0X3AsIHNpemVfdCogb3V0cHV0X29mZnNldCwKKyAgICBzaXplX3QqIGNvbXByZXNzZWRfaW5wdXQxX3N0cmlkZSwgc2l6ZV90KiBjb21wcmVzc2VkX2lucHV0Ml9zdHJpZGUsCisgICAgc2l6ZV90KiBjb21wcmVzc2VkX291dHB1dF9zaGFwZSwgY29uc3QgVCogaW5wdXQxX2RhdGEsIGNvbnN0IFQqIGlucHV0Ml9kYXRhLAorICAgIFQqIG91dHB1dF9kYXRhKSB7CisgIGZvciAoc2l6ZV90IGMgPSAwOyBjIDwgY29tcHJlc3NlZF9vdXRwdXRfc2hhcGVbZGltZW5zaW9uXTsgKytjKSB7CisgICAgaWYgKGRpbWVuc2lvbiA+IDApIHsKKyAgICAgIHNpemVfdCBpbnB1dDFfb2Zmc2V0X2MgPSAqaW5wdXQxX29mZnNldF9wOworICAgICAgc2l6ZV90IGlucHV0Ml9vZmZzZXRfYyA9ICppbnB1dDJfb2Zmc2V0X3A7CisgICAgICBCcm9hZGNhc3RBZGRSZWN1cnNpdmVEaW1lbnNpb25zKAorICAgICAgICAgIHBhcmFtcywgZGltZW5zaW9uIC0gMSwgJmlucHV0MV9vZmZzZXRfYywgJmlucHV0Ml9vZmZzZXRfYywKKyAgICAgICAgICBvdXRwdXRfb2Zmc2V0LCBjb21wcmVzc2VkX2lucHV0MV9zdHJpZGUsIGNvbXByZXNzZWRfaW5wdXQyX3N0cmlkZSwKKyAgICAgICAgICBjb21wcmVzc2VkX291dHB1dF9zaGFwZSwgaW5wdXQxX2RhdGEsIGlucHV0Ml9kYXRhLCBvdXRwdXRfZGF0YSk7CisgICAgfSBlbHNlIHsKKyAgICAgIFRGTElURV9EQ0hFQ0soZGltZW5zaW9uID09IDApOworICAgICAgY29uc3QgaW50MzJfdCBpbnB1dDFfdmFsID0KKyAgICAgICAgICBwYXJhbXMuaW5wdXQxX29mZnNldCArIGlucHV0MV9kYXRhWyppbnB1dDFfb2Zmc2V0X3BdOworICAgICAgY29uc3QgaW50MzJfdCBpbnB1dDJfdmFsID0KKyAgICAgICAgICBwYXJhbXMuaW5wdXQyX29mZnNldCArIGlucHV0Ml9kYXRhWyppbnB1dDJfb2Zmc2V0X3BdOworICAgICAgY29uc3QgaW50MzJfdCBzaGlmdGVkX2lucHV0MV92YWwgPSBpbnB1dDFfdmFsICogKDEgPDwgcGFyYW1zLmxlZnRfc2hpZnQpOworICAgICAgY29uc3QgaW50MzJfdCBzaGlmdGVkX2lucHV0Ml92YWwgPSBpbnB1dDJfdmFsICogKDEgPDwgcGFyYW1zLmxlZnRfc2hpZnQpOworICAgICAgY29uc3QgaW50MzJfdCBzY2FsZWRfaW5wdXQxX3ZhbCA9CisgICAgICAgICAgTXVsdGlwbHlCeVF1YW50aXplZE11bHRpcGxpZXJTbWFsbGVyVGhhbk9uZUV4cCgKKyAgICAgICAgICAgICAgc2hpZnRlZF9pbnB1dDFfdmFsLCBwYXJhbXMuaW5wdXQxX211bHRpcGxpZXIsCisgICAgICAgICAgICAgIHBhcmFtcy5pbnB1dDFfc2hpZnQpOworICAgICAgY29uc3QgaW50MzJfdCBzY2FsZWRfaW5wdXQyX3ZhbCA9CisgICAgICAgICAgTXVsdGlwbHlCeVF1YW50aXplZE11bHRpcGxpZXJTbWFsbGVyVGhhbk9uZUV4cCgKKyAgICAgICAgICAgICAgc2hpZnRlZF9pbnB1dDJfdmFsLCBwYXJhbXMuaW5wdXQyX211bHRpcGxpZXIsCisgICAgICAgICAgICAgIHBhcmFtcy5pbnB1dDJfc2hpZnQpOworICAgICAgY29uc3QgaW50MzJfdCByYXdfc3VtID0gc2NhbGVkX2lucHV0MV92YWwgKyBzY2FsZWRfaW5wdXQyX3ZhbDsKKyAgICAgIGNvbnN0IGludDMyX3QgcmF3X291dHB1dCA9CisgICAgICAgICAgTXVsdGlwbHlCeVF1YW50aXplZE11bHRpcGxpZXJTbWFsbGVyVGhhbk9uZUV4cCgKKyAgICAgICAgICAgICAgcmF3X3N1bSwgcGFyYW1zLm91dHB1dF9tdWx0aXBsaWVyLCBwYXJhbXMub3V0cHV0X3NoaWZ0KSArCisgICAgICAgICAgcGFyYW1zLm91dHB1dF9vZmZzZXQ7CisgICAgICBjb25zdCBpbnQzMl90IGNsYW1wZWRfb3V0cHV0ID0KKyAgICAgICAgICBzdGQ6Om1pbihwYXJhbXMucXVhbnRpemVkX2FjdGl2YXRpb25fbWF4LAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bWF4KHBhcmFtcy5xdWFudGl6ZWRfYWN0aXZhdGlvbl9taW4sIHJhd19vdXRwdXQpKTsKKyAgICAgIG91dHB1dF9kYXRhWypvdXRwdXRfb2Zmc2V0XSA9IHN0YXRpY19jYXN0PFQ+KGNsYW1wZWRfb3V0cHV0KTsKKyAgICAgICsrKCpvdXRwdXRfb2Zmc2V0KTsKICAgICB9Ci0gICAgaW5wdXQxX29mZnNldF9hICs9IGRlc2MxLnN0cmlkZXNbMF07Ci0gICAgaW5wdXQyX29mZnNldF9hICs9IGRlc2MyLnN0cmlkZXNbMF07Ci0gICAgb3V0cHV0X29mZnNldF9hICs9Ci0gICAgICAgIGV4dGVuZGVkX291dHB1dF9zaGFwZS5EaW1zKDEpICogZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoMikgKgotICAgICAgICBleHRlbmRlZF9vdXRwdXRfc2hhcGUuRGltcygzKSAqIGV4dGVuZGVkX291dHB1dF9zaGFwZS5EaW1zKDQpICoKLSAgICAgICAgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoNSk7CisgICAgKmlucHV0MV9vZmZzZXRfcCArPSBjb21wcmVzc2VkX2lucHV0MV9zdHJpZGVbZGltZW5zaW9uXTsKKyAgICAqaW5wdXQyX29mZnNldF9wICs9IGNvbXByZXNzZWRfaW5wdXQyX3N0cmlkZVtkaW1lbnNpb25dOwogICB9CiB9CiAKQEAgLTI5MywxMiArNDIwLDcgQEAKICAgICAgICAgICAgICAgICAgICBjb25zdCBSdW50aW1lU2hhcGUmIGlucHV0MV9zaGFwZSwgY29uc3QgVCogaW5wdXQxX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgUnVudGltZVNoYXBlJiBpbnB1dDJfc2hhcGUsIGNvbnN0IFQqIGlucHV0Ml9kYXRhLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgb3V0cHV0X3NoYXBlLCBUKiBvdXRwdXRfZGF0YSkgewotICBOZEFycmF5RGVzYzw2PiBkZXNjMTsKLSAgTmRBcnJheURlc2M8Nj4gZGVzYzI7Ci0gIE5kQXJyYXlEZXNjc0ZvckVsZW1lbnR3aXNlQnJvYWRjYXN0KGlucHV0MV9zaGFwZSwgaW5wdXQyX3NoYXBlLCAmZGVzYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjMik7Ci0gIGNvbnN0IFJ1bnRpbWVTaGFwZSBleHRlbmRlZF9vdXRwdXRfc2hhcGUgPQotICAgICAgUnVudGltZVNoYXBlOjpFeHRlbmRlZFNoYXBlKDYsIG91dHB1dF9zaGFwZSk7CisgIGNvbnN0ZXhwciBpbnQga01heEJyb2FkY2FzdERpbSA9IDY7CiAKICAgLy8gSW4gVGVuc29yZmxvdywgdGhlIGRpbWVuc2lvbnMgYXJlIGNhbm9uaWNhbGx5IG5hbWVkIChiYXRjaF9udW1iZXIsIHJvdywKICAgLy8gY29sLCBjaGFubmVsKSwgd2l0aCBleHRlbnRzIChiYXRjaGVzLCBoZWlnaHQsIHdpZHRoLCBkZXB0aCksIHdpdGggdGhlCkBAIC0zMTEsODcgKzQzMywyNCBAQAogICAvLyBXZSBuYW1lIG91ciB2YXJpYWJsZXMgYnkgdGhlaXIgVGVuc29yZmxvdyBjb252ZW50aW9uLCBidXQgZ2VuZXJhdGUgQyBjb2RlCiAgIC8vIG5lc3RpbmcgbG9vcHMgc3VjaCB0aGF0IHRoZSBpbm5lcm1vc3QgbG9vcCBoYXMgdGhlIHNtYWxsZXN0IHN0cmlkZSBmb3IgdGhlCiAgIC8vIGJlc3QgY2FjaGUgYmVoYXZpb3IuCi0gIHNpemVfdCBpbnB1dDFfb2Zmc2V0X2EgPSAwOwotICBzaXplX3QgaW5wdXQyX29mZnNldF9hID0gMDsKLSAgc2l6ZV90IG91dHB1dF9vZmZzZXRfYSA9IDA7Ci0gIGZvciAoaW50IGEgPSAwOyBhIDwgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoMCk7ICsrYSkgewotICAgIHNpemVfdCBpbnB1dDFfb2Zmc2V0X2QgPSBpbnB1dDFfb2Zmc2V0X2E7Ci0gICAgc2l6ZV90IGlucHV0Ml9vZmZzZXRfZCA9IGlucHV0Ml9vZmZzZXRfYTsKLSAgICBzaXplX3Qgb3V0cHV0X29mZnNldF9kID0gb3V0cHV0X29mZnNldF9hOwotICAgIGZvciAoaW50IGQgPSAwOyBkIDwgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoMSk7ICsrZCkgewotICAgICAgc2l6ZV90IGlucHV0MV9vZmZzZXRfYiA9IGlucHV0MV9vZmZzZXRfZDsKLSAgICAgIHNpemVfdCBpbnB1dDJfb2Zmc2V0X2IgPSBpbnB1dDJfb2Zmc2V0X2Q7Ci0gICAgICBzaXplX3Qgb3V0cHV0X29mZnNldF9iID0gb3V0cHV0X29mZnNldF9kOwotICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCBleHRlbmRlZF9vdXRwdXRfc2hhcGUuRGltcygyKTsgKytiKSB7Ci0gICAgICAgIHNpemVfdCBpbnB1dDFfb2Zmc2V0X3kgPSBpbnB1dDFfb2Zmc2V0X2I7Ci0gICAgICAgIHNpemVfdCBpbnB1dDJfb2Zmc2V0X3kgPSBpbnB1dDJfb2Zmc2V0X2I7Ci0gICAgICAgIHNpemVfdCBvdXRwdXRfb2Zmc2V0X3kgPSBvdXRwdXRfb2Zmc2V0X2I7Ci0gICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoMyk7ICsreSkgewotICAgICAgICAgIHNpemVfdCBpbnB1dDFfb2Zmc2V0X3ggPSBpbnB1dDFfb2Zmc2V0X3k7Ci0gICAgICAgICAgc2l6ZV90IGlucHV0Ml9vZmZzZXRfeCA9IGlucHV0Ml9vZmZzZXRfeTsKLSAgICAgICAgICBzaXplX3Qgb3V0cHV0X29mZnNldF94ID0gb3V0cHV0X29mZnNldF95OwotICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoNCk7ICsreCkgewotICAgICAgICAgICAgc2l6ZV90IGlucHV0MV9vZmZzZXRfYyA9IGlucHV0MV9vZmZzZXRfeDsKLSAgICAgICAgICAgIHNpemVfdCBpbnB1dDJfb2Zmc2V0X2MgPSBpbnB1dDJfb2Zmc2V0X3g7Ci0gICAgICAgICAgICBzaXplX3Qgb3V0cHV0X29mZnNldF9jID0gb3V0cHV0X29mZnNldF94OwotICAgICAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBleHRlbmRlZF9vdXRwdXRfc2hhcGUuRGltcyg1KTsgKytjKSB7Ci0gICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgaW5wdXQxX3ZhbCA9Ci0gICAgICAgICAgICAgICAgICBwYXJhbXMuaW5wdXQxX29mZnNldCArIGlucHV0MV9kYXRhW2lucHV0MV9vZmZzZXRfY107Ci0gICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgaW5wdXQyX3ZhbCA9Ci0gICAgICAgICAgICAgICAgICBwYXJhbXMuaW5wdXQyX29mZnNldCArIGlucHV0Ml9kYXRhW2lucHV0Ml9vZmZzZXRfY107Ci0gICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2hpZnRlZF9pbnB1dDFfdmFsID0KLSAgICAgICAgICAgICAgICAgIGlucHV0MV92YWwgKiAoMSA8PCBwYXJhbXMubGVmdF9zaGlmdCk7Ci0gICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2hpZnRlZF9pbnB1dDJfdmFsID0KLSAgICAgICAgICAgICAgICAgIGlucHV0Ml92YWwgKiAoMSA8PCBwYXJhbXMubGVmdF9zaGlmdCk7Ci0gICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2NhbGVkX2lucHV0MV92YWwgPQotICAgICAgICAgICAgICAgICAgTXVsdGlwbHlCeVF1YW50aXplZE11bHRpcGxpZXJTbWFsbGVyVGhhbk9uZUV4cCgKLSAgICAgICAgICAgICAgICAgICAgICBzaGlmdGVkX2lucHV0MV92YWwsIHBhcmFtcy5pbnB1dDFfbXVsdGlwbGllciwKLSAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMuaW5wdXQxX3NoaWZ0KTsKLSAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBzY2FsZWRfaW5wdXQyX3ZhbCA9Ci0gICAgICAgICAgICAgICAgICBNdWx0aXBseUJ5UXVhbnRpemVkTXVsdGlwbGllclNtYWxsZXJUaGFuT25lRXhwKAotICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0ZWRfaW5wdXQyX3ZhbCwgcGFyYW1zLmlucHV0Ml9tdWx0aXBsaWVyLAotICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5pbnB1dDJfc2hpZnQpOwotICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHJhd19zdW0gPSBzY2FsZWRfaW5wdXQxX3ZhbCArIHNjYWxlZF9pbnB1dDJfdmFsOwotICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHJhd19vdXRwdXQgPQotICAgICAgICAgICAgICAgICAgTXVsdGlwbHlCeVF1YW50aXplZE11bHRpcGxpZXJTbWFsbGVyVGhhbk9uZUV4cCgKLSAgICAgICAgICAgICAgICAgICAgICByYXdfc3VtLCBwYXJhbXMub3V0cHV0X211bHRpcGxpZXIsIHBhcmFtcy5vdXRwdXRfc2hpZnQpICsKLSAgICAgICAgICAgICAgICAgIHBhcmFtcy5vdXRwdXRfb2Zmc2V0OwotICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGNsYW1wZWRfb3V0cHV0ID0gc3RkOjptaW4oCi0gICAgICAgICAgICAgICAgICBwYXJhbXMucXVhbnRpemVkX2FjdGl2YXRpb25fbWF4LAotICAgICAgICAgICAgICAgICAgc3RkOjptYXgocGFyYW1zLnF1YW50aXplZF9hY3RpdmF0aW9uX21pbiwgcmF3X291dHB1dCkpOwotICAgICAgICAgICAgICBvdXRwdXRfZGF0YVtvdXRwdXRfb2Zmc2V0X2NdID0gc3RhdGljX2Nhc3Q8VD4oY2xhbXBlZF9vdXRwdXQpOwotICAgICAgICAgICAgICBpbnB1dDFfb2Zmc2V0X2MgKz0gZGVzYzEuc3RyaWRlc1s1XTsKLSAgICAgICAgICAgICAgaW5wdXQyX29mZnNldF9jICs9IGRlc2MyLnN0cmlkZXNbNV07Ci0gICAgICAgICAgICAgICsrb3V0cHV0X29mZnNldF9jOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5wdXQxX29mZnNldF94ICs9IGRlc2MxLnN0cmlkZXNbNF07Ci0gICAgICAgICAgICBpbnB1dDJfb2Zmc2V0X3ggKz0gZGVzYzIuc3RyaWRlc1s0XTsKLSAgICAgICAgICAgIG91dHB1dF9vZmZzZXRfeCArPSBleHRlbmRlZF9vdXRwdXRfc2hhcGUuRGltcyg1KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaW5wdXQxX29mZnNldF95ICs9IGRlc2MxLnN0cmlkZXNbM107Ci0gICAgICAgICAgaW5wdXQyX29mZnNldF95ICs9IGRlc2MyLnN0cmlkZXNbM107Ci0gICAgICAgICAgb3V0cHV0X29mZnNldF95ICs9Ci0gICAgICAgICAgICAgIGV4dGVuZGVkX291dHB1dF9zaGFwZS5EaW1zKDQpICogZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoNSk7Ci0gICAgICAgIH0KLSAgICAgICAgaW5wdXQxX29mZnNldF9iICs9IGRlc2MxLnN0cmlkZXNbMl07Ci0gICAgICAgIGlucHV0Ml9vZmZzZXRfYiArPSBkZXNjMi5zdHJpZGVzWzJdOwotICAgICAgICBvdXRwdXRfb2Zmc2V0X2IgKz0gZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoMykgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoNCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoNSk7Ci0gICAgICB9Ci0gICAgICBpbnB1dDFfb2Zmc2V0X2QgKz0gZGVzYzEuc3RyaWRlc1sxXTsKLSAgICAgIGlucHV0Ml9vZmZzZXRfZCArPSBkZXNjMi5zdHJpZGVzWzFdOwotICAgICAgb3V0cHV0X29mZnNldF9kICs9Ci0gICAgICAgICAgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoMikgKiBleHRlbmRlZF9vdXRwdXRfc2hhcGUuRGltcygzKSAqCi0gICAgICAgICAgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoNCkgKiBleHRlbmRlZF9vdXRwdXRfc2hhcGUuRGltcyg1KTsKLSAgICB9Ci0gICAgaW5wdXQxX29mZnNldF9hICs9IGRlc2MxLnN0cmlkZXNbMF07Ci0gICAgaW5wdXQyX29mZnNldF9hICs9IGRlc2MyLnN0cmlkZXNbMF07Ci0gICAgb3V0cHV0X29mZnNldF9hICs9Ci0gICAgICAgIGV4dGVuZGVkX291dHB1dF9zaGFwZS5EaW1zKDEpICogZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoMikgKgotICAgICAgICBleHRlbmRlZF9vdXRwdXRfc2hhcGUuRGltcygzKSAqIGV4dGVuZGVkX291dHB1dF9zaGFwZS5EaW1zKDQpICoKLSAgICAgICAgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoNSk7CisgIHNpemVfdCBjb21wcmVzc2VkX2lucHV0MV9zdHJpZGVba01heEJyb2FkY2FzdERpbV07CisgIHNpemVfdCBjb21wcmVzc2VkX2lucHV0Ml9zdHJpZGVba01heEJyb2FkY2FzdERpbV07CisgIHNpemVfdCBjb21wcmVzc2VkX291dHB1dF9zaGFwZVtrTWF4QnJvYWRjYXN0RGltXTsKKyAgYm9vbCBicm9hZGNhc3RhYmxlX3NoYXBlID0gUmVkdWNlRGltZW5zaW9uc0ZvckJyb2FkY2FzdDxrTWF4QnJvYWRjYXN0RGltPigKKyAgICAgIGlucHV0MV9zaGFwZSwgaW5wdXQyX3NoYXBlLCBjb21wcmVzc2VkX2lucHV0MV9zdHJpZGUsCisgICAgICBjb21wcmVzc2VkX2lucHV0Ml9zdHJpZGUsIGNvbXByZXNzZWRfb3V0cHV0X3NoYXBlKTsKKyAgLy8gU2tpcCBicm9hZGNhc3RpbmcgZm9yIGRlZ2VuZXJhdGUgc2hhcGVzLgorICBpZiAoIWJyb2FkY2FzdGFibGVfc2hhcGUpIHsKKyAgICByZXR1cm47CiAgIH0KKworICBzaXplX3QgaW5wdXQxX29mZnNldCA9IDA7CisgIHNpemVfdCBpbnB1dDJfb2Zmc2V0ID0gMDsKKyAgc2l6ZV90IG91dHB1dF9vZmZzZXQgPSAwOworICBCcm9hZGNhc3RBZGRSZWN1cnNpdmVEaW1lbnNpb25zKAorICAgICAgcGFyYW1zLCBrTWF4QnJvYWRjYXN0RGltIC0gMSwgJmlucHV0MV9vZmZzZXQsICZpbnB1dDJfb2Zmc2V0LAorICAgICAgJm91dHB1dF9vZmZzZXQsIGNvbXByZXNzZWRfaW5wdXQxX3N0cmlkZSwgY29tcHJlc3NlZF9pbnB1dDJfc3RyaWRlLAorICAgICAgY29tcHJlc3NlZF9vdXRwdXRfc2hhcGUsIGlucHV0MV9kYXRhLCBpbnB1dDJfZGF0YSwgb3V0cHV0X2RhdGEpOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3JlZmVyZW5jZS9jb21wYXJpc29ucy5oIGIvdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvcmVmZXJlbmNlL2NvbXBhcmlzb25zLmgKaW5kZXggMzU1ODMxOS4uMzY2YjM3OCAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvcmVmZXJlbmNlL2NvbXBhcmlzb25zLmgKKysrIGIvdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvcmVmZXJlbmNlL2NvbXBhcmlzb25zLmgKQEAgLTI1NywxMiArMjU3LDEyIEBACiAgICAgICAgIG9wX3BhcmFtcywgaW5wdXQxX3NoYXBlLCBpbnB1dDFfZGF0YSwgaW5wdXQyX3NoYXBlLCBpbnB1dDJfZGF0YSwgICAgICAgXAogICAgICAgICBvdXRwdXRfc2hhcGUsIG91dHB1dF9kYXRhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgfQotVEZMSVRFX0NPTVBBUklTT05fT1AoRXF1YWwpOwotVEZMSVRFX0NPTVBBUklTT05fT1AoTm90RXF1YWwpOwotVEZMSVRFX0NPTVBBUklTT05fT1AoR3JlYXRlcik7Ci1URkxJVEVfQ09NUEFSSVNPTl9PUChHcmVhdGVyRXF1YWwpOwotVEZMSVRFX0NPTVBBUklTT05fT1AoTGVzcyk7Ci1URkxJVEVfQ09NUEFSSVNPTl9PUChMZXNzRXF1YWwpOworVEZMSVRFX0NPTVBBUklTT05fT1AoRXF1YWwpCitURkxJVEVfQ09NUEFSSVNPTl9PUChOb3RFcXVhbCkKK1RGTElURV9DT01QQVJJU09OX09QKEdyZWF0ZXIpCitURkxJVEVfQ09NUEFSSVNPTl9PUChHcmVhdGVyRXF1YWwpCitURkxJVEVfQ09NUEFSSVNPTl9PUChMZXNzKQorVEZMSVRFX0NPTVBBUklTT05fT1AoTGVzc0VxdWFsKQogI3VuZGVmIFRGTElURV9DT01QQVJJU09OX09QCiAKIH0gIC8vIG5hbWVzcGFjZSByZWZlcmVuY2Vfb3BzCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9yZWZlcmVuY2UvaW50ZWdlcl9vcHMvYWRkLmggYi90ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9yZWZlcmVuY2UvaW50ZWdlcl9vcHMvYWRkLmgKaW5kZXggNTc5OTY0ZC4uYzJhMGUwZiAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvcmVmZXJlbmNlL2ludGVnZXJfb3BzL2FkZC5oCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3JlZmVyZW5jZS9pbnRlZ2VyX29wcy9hZGQuaApAQCAtMTYsNiArMTYsNyBAQAogI2RlZmluZSBURU5TT1JGTE9XX0xJVEVfS0VSTkVMU19JTlRFUk5BTF9SRUZFUkVOQ0VfSU5URUdFUl9PUFNfQUREX0hfCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KICNpbmNsdWRlIDxsaW1pdHM+CiAKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9jb21tb24uaCIKQEAgLTM1LDcgKzM2LDMwIEBACiAgIFRGTElURV9EQ0hFQ0tfTEUoLXBhcmFtcy5pbnB1dDJfb2Zmc2V0LCBzdGQ6Om51bWVyaWNfbGltaXRzPGludDhfdD46Om1heCgpKTsKIH0KIAotLy8gVE9ETyhiLzI3MDU4OTA4OCk6IG1vdmUgdG8gYSBtb3JlIGFwcHJvcHJpYXRlIGZpbGUgKGIvMjcwNTg5MDg4I2NvbW1lbnQyKQorLy8gVE9ETzogYi8yNzA1ODkwODggLSBtb3ZlIHRvIGEgbW9yZSBhcHByb3ByaWF0ZSBmaWxlIChiLzI3MDU4OTA4OCNjb21tZW50MikKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBCcm9hZGNhc3RJbnB1dDEoaW50IHNpemUsIGNvbnN0IEFyaXRobWV0aWNQYXJhbXMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQqIGlucHV0MV9kYXRhLCBjb25zdCBUKiBpbnB1dDJfZGF0YSwgVCogb3V0cHV0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICB2b2lkICgqY2hlY2tfYXJpdGhtZXRpY19wYXJhbXMpKGNvbnN0IEFyaXRobWV0aWNQYXJhbXMmKSwKKyAgICAgICAgICAgICAgICAgICAgIFQgKCpiaW5hcnlfZnVuYykoVCwgVCwgY29uc3QgQXJpdGhtZXRpY1BhcmFtcyYpKSB7CisgIENoZWNrQXJpdGhtZXRpY1BhcmFtcyhwYXJhbXMpOworICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgIG91dHB1dF9kYXRhW2ldID0gYmluYXJ5X2Z1bmMoaW5wdXQxX2RhdGFbMF0sIGlucHV0Ml9kYXRhW2ldLCBwYXJhbXMpOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBCcm9hZGNhc3RJbnB1dDIoaW50IHNpemUsIGNvbnN0IEFyaXRobWV0aWNQYXJhbXMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQqIGlucHV0MV9kYXRhLCBjb25zdCBUKiBpbnB1dDJfZGF0YSwgVCogb3V0cHV0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICB2b2lkICgqY2hlY2tfYXJpdGhtZXRpY19wYXJhbXMpKGNvbnN0IEFyaXRobWV0aWNQYXJhbXMmKSwKKyAgICAgICAgICAgICAgICAgICAgIFQgKCpiaW5hcnlfZnVuYykoVCwgVCwgY29uc3QgQXJpdGhtZXRpY1BhcmFtcyYpKSB7CisgIENoZWNrQXJpdGhtZXRpY1BhcmFtcyhwYXJhbXMpOworICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgIG91dHB1dF9kYXRhW2ldID0gYmluYXJ5X2Z1bmMoaW5wdXQxX2RhdGFbaV0sIGlucHV0Ml9kYXRhWzBdLCBwYXJhbXMpOworICB9Cit9CisKKy8vIFRPRE86IGIvMjcwNTg5MDg4IC0gbW92ZSB0byBhIG1vcmUgYXBwcm9wcmlhdGUgZmlsZSAoYi8yNzA1ODkwODgjY29tbWVudDIpCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIHZvaWQgRWxlbWVudFdpc2UoaW50IHNpemUsIGNvbnN0IEFyaXRobWV0aWNQYXJhbXMmIHBhcmFtcywgY29uc3QgVCogaW5wdXQxX2RhdGEsCiAgICAgICAgICAgICAgICAgIGNvbnN0IFQqIGlucHV0Ml9kYXRhLCBUKiBvdXRwdXRfZGF0YSwKQEAgLTQ2LDcgKzcwLDYwIEBACiAgICAgb3V0cHV0X2RhdGFbaV0gPSBiaW5hcnlfZnVuYyhpbnB1dDFfZGF0YVtpXSwgaW5wdXQyX2RhdGFbaV0sIHBhcmFtcyk7CiAgIH0KIH0KLS8vIFRPRE8oYi8yNzA1ODkwODgpOiBtb3ZlIHRvIGEgbW9yZSBhcHByb3ByaWF0ZSBmaWxlLiAoYi8yNzA1ODkwODgjY29tbWVudDIpCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lIHZvaWQgQnJvYWRjYXN0QWRkUmVjdXJzaXZlRGltZW5zaW9ucygKKyAgICBjb25zdCBBcml0aG1ldGljUGFyYW1zJiBwYXJhbXMsIGludCBkaW1lbnNpb24sIHNpemVfdCogaW5wdXQxX29mZnNldF9wLAorICAgIHNpemVfdCogaW5wdXQyX29mZnNldF9wLCBzaXplX3QqIG91dHB1dF9vZmZzZXQsCisgICAgc2l6ZV90KiBjb21wcmVzc2VkX2lucHV0MV9zdHJpZGUsIHNpemVfdCogY29tcHJlc3NlZF9pbnB1dDJfc3RyaWRlLAorICAgIHNpemVfdCogY29tcHJlc3NlZF9vdXRwdXRfc2hhcGUsIGNvbnN0IFQqIGlucHV0MV9kYXRhLCBjb25zdCBUKiBpbnB1dDJfZGF0YSwKKyAgICBUKiBvdXRwdXRfZGF0YSwgdm9pZCAoKmNoZWNrX2FyaXRobWV0aWNfcGFyYW1zKShjb25zdCBBcml0aG1ldGljUGFyYW1zJiksCisgICAgVCAoKmJpbmFyeV9mdW5jKShULCBULCBjb25zdCBBcml0aG1ldGljUGFyYW1zJikpIHsKKyAgaWYgKGRpbWVuc2lvbiA+IDApIHsKKyAgICBmb3IgKHNpemVfdCBjID0gMDsgYyA8IGNvbXByZXNzZWRfb3V0cHV0X3NoYXBlW2RpbWVuc2lvbl07ICsrYykgeworICAgICAgc2l6ZV90IGlucHV0MV9vZmZzZXRfYyA9ICppbnB1dDFfb2Zmc2V0X3A7CisgICAgICBzaXplX3QgaW5wdXQyX29mZnNldF9jID0gKmlucHV0Ml9vZmZzZXRfcDsKKyAgICAgIEJyb2FkY2FzdEFkZFJlY3Vyc2l2ZURpbWVuc2lvbnMoCisgICAgICAgICAgcGFyYW1zLCBkaW1lbnNpb24gLSAxLCAmaW5wdXQxX29mZnNldF9jLCAmaW5wdXQyX29mZnNldF9jLAorICAgICAgICAgIG91dHB1dF9vZmZzZXQsIGNvbXByZXNzZWRfaW5wdXQxX3N0cmlkZSwgY29tcHJlc3NlZF9pbnB1dDJfc3RyaWRlLAorICAgICAgICAgIGNvbXByZXNzZWRfb3V0cHV0X3NoYXBlLCBpbnB1dDFfZGF0YSwgaW5wdXQyX2RhdGEsIG91dHB1dF9kYXRhLAorICAgICAgICAgIGNoZWNrX2FyaXRobWV0aWNfcGFyYW1zLCBiaW5hcnlfZnVuYyk7CisgICAgICAqaW5wdXQxX29mZnNldF9wICs9IGNvbXByZXNzZWRfaW5wdXQxX3N0cmlkZVtkaW1lbnNpb25dOworICAgICAgKmlucHV0Ml9vZmZzZXRfcCArPSBjb21wcmVzc2VkX2lucHV0Ml9zdHJpZGVbZGltZW5zaW9uXTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgVEZMSVRFX0RDSEVDSyhkaW1lbnNpb24gPT0gMCk7CisgICAgYm9vbCBpbnB1dDFfaXNfYnJvYWRjYXN0ID0gY29tcHJlc3NlZF9pbnB1dDFfc3RyaWRlW2RpbWVuc2lvbl0gPT0gMDsKKyAgICBib29sIGlucHV0Ml9pc19icm9hZGNhc3QgPSBjb21wcmVzc2VkX2lucHV0Ml9zdHJpZGVbZGltZW5zaW9uXSA9PSAwOworICAgIFRGTElURV9EQ0hFQ0soIShpbnB1dDFfaXNfYnJvYWRjYXN0ICYmIGlucHV0Ml9pc19icm9hZGNhc3QpKTsKKyAgICBjb25zdCBUKiBpbnB1dDFfZGF0YV9wdHIgPSBpbnB1dDFfZGF0YSArICppbnB1dDFfb2Zmc2V0X3A7CisgICAgY29uc3QgVCogaW5wdXQyX2RhdGFfcHRyID0gaW5wdXQyX2RhdGEgKyAqaW5wdXQyX29mZnNldF9wOworICAgIFQqIG91dHB1dF9kYXRhX3B0ciA9IG91dHB1dF9kYXRhICsgKm91dHB1dF9vZmZzZXQ7CisgICAgaWYgKGlucHV0MV9pc19icm9hZGNhc3QpIHsKKyAgICAgIC8vIGlucHV0MSBpcyBicm9hZGNhc3QuCisgICAgICBCcm9hZGNhc3RJbnB1dDE8VD4oY29tcHJlc3NlZF9vdXRwdXRfc2hhcGVbZGltZW5zaW9uXSwgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0MV9kYXRhX3B0ciwgaW5wdXQyX2RhdGFfcHRyLCBvdXRwdXRfZGF0YV9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfYXJpdGhtZXRpY19wYXJhbXMsIGJpbmFyeV9mdW5jKTsKKyAgICAgICppbnB1dDJfb2Zmc2V0X3AgKz0gY29tcHJlc3NlZF9vdXRwdXRfc2hhcGVbZGltZW5zaW9uXTsKKyAgICB9IGVsc2UgaWYgKGlucHV0Ml9pc19icm9hZGNhc3QpIHsKKyAgICAgIC8vIGlucHV0MiBpcyBicm9hZGNhc3QuCisgICAgICBCcm9hZGNhc3RJbnB1dDI8VD4oY29tcHJlc3NlZF9vdXRwdXRfc2hhcGVbZGltZW5zaW9uXSwgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0MV9kYXRhX3B0ciwgaW5wdXQyX2RhdGFfcHRyLCBvdXRwdXRfZGF0YV9wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfYXJpdGhtZXRpY19wYXJhbXMsIGJpbmFyeV9mdW5jKTsKKyAgICAgICppbnB1dDFfb2Zmc2V0X3AgKz0gY29tcHJlc3NlZF9vdXRwdXRfc2hhcGVbZGltZW5zaW9uXTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gQWRkIGVsZW1lbnQtd2lzZS4KKyAgICAgIEVsZW1lbnRXaXNlPFQ+KGNvbXByZXNzZWRfb3V0cHV0X3NoYXBlW2RpbWVuc2lvbl0sIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0MV9kYXRhX3B0ciwgaW5wdXQyX2RhdGFfcHRyLCBvdXRwdXRfZGF0YV9wdHIsCisgICAgICAgICAgICAgICAgICAgICBjaGVja19hcml0aG1ldGljX3BhcmFtcywgYmluYXJ5X2Z1bmMpOworICAgICAgKmlucHV0MV9vZmZzZXRfcCArPSBjb21wcmVzc2VkX291dHB1dF9zaGFwZVtkaW1lbnNpb25dOworICAgICAgKmlucHV0Ml9vZmZzZXRfcCArPSBjb21wcmVzc2VkX291dHB1dF9zaGFwZVtkaW1lbnNpb25dOworICAgIH0KKyAgICAqb3V0cHV0X29mZnNldCArPSBjb21wcmVzc2VkX291dHB1dF9zaGFwZVtkaW1lbnNpb25dOworICB9Cit9CisKKy8vIFRPRE86IGIvMjcwNTg5MDg4IC0gbW92ZSB0byBhIG1vcmUgYXBwcm9wcmlhdGUgZmlsZS4gKGIvMjcwNTg5MDg4I2NvbW1lbnQyKQogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiB2b2lkIEJyb2FkY2FzdEJpbmFyeUZ1bmN0aW9uNkRTbG93KAogICAgIGNvbnN0IEFyaXRobWV0aWNQYXJhbXMmIHBhcmFtcywgY29uc3QgUnVudGltZVNoYXBlJiBpbnB1dDFfc2hhcGUsCkBAIC01NCwxMiArMTMxLDcgQEAKICAgICBjb25zdCBUKiBpbnB1dDJfZGF0YSwgY29uc3QgUnVudGltZVNoYXBlJiBvdXRwdXRfc2hhcGUsIFQqIG91dHB1dF9kYXRhLAogICAgIHZvaWQgKCpjaGVja19hcml0aG1ldGljX3BhcmFtcykoY29uc3QgQXJpdGhtZXRpY1BhcmFtcyYpLAogICAgIFQgKCpiaW5hcnlfZnVuYykoVCwgVCwgY29uc3QgQXJpdGhtZXRpY1BhcmFtcyYpKSB7Ci0gIE5kQXJyYXlEZXNjPDY+IGRlc2MxOwotICBOZEFycmF5RGVzYzw2PiBkZXNjMjsKLSAgTmRBcnJheURlc2NzRm9yRWxlbWVudHdpc2VCcm9hZGNhc3QoaW5wdXQxX3NoYXBlLCBpbnB1dDJfc2hhcGUsICZkZXNjMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MyKTsKLSAgY29uc3QgUnVudGltZVNoYXBlIGV4dGVuZGVkX291dHB1dF9zaGFwZSA9Ci0gICAgICBSdW50aW1lU2hhcGU6OkV4dGVuZGVkU2hhcGUoNiwgb3V0cHV0X3NoYXBlKTsKKyAgY29uc3RleHByIGludCBrTWF4QnJvYWRjYXN0RGltID0gNjsKIAogICAvLyBJbiBUZW5zb3JmbG93LCB0aGUgZGltZW5zaW9ucyBhcmUgY2Fub25pY2FsbHkgbmFtZWQgKGJhdGNoX251bWJlciwgcm93LAogICAvLyBjb2wsIGNoYW5uZWwpLCB3aXRoIGV4dGVudHMgKGJhdGNoZXMsIGhlaWdodCwgd2lkdGgsIGRlcHRoKSwgd2l0aCB0aGUKQEAgLTcyLDY1ICsxNDQsMjUgQEAKICAgLy8gV2UgbmFtZSBvdXIgdmFyaWFibGVzIGJ5IHRoZWlyIFRlbnNvcmZsb3cgY29udmVudGlvbiwgYnV0IGdlbmVyYXRlIEMgY29kZQogICAvLyBuZXN0aW5nIGxvb3BzIHN1Y2ggdGhhdCB0aGUgaW5uZXJtb3N0IGxvb3AgaGFzIHRoZSBzbWFsbGVzdCBzdHJpZGUgZm9yIHRoZQogICAvLyBiZXN0IGNhY2hlIGJlaGF2aW9yLgotICBzaXplX3QgaW5wdXQxX29mZnNldF9hID0gMDsKLSAgc2l6ZV90IGlucHV0Ml9vZmZzZXRfYSA9IDA7Ci0gIHNpemVfdCBvdXRwdXRfb2Zmc2V0X2EgPSAwOwotICBmb3IgKGludCBhID0gMDsgYSA8IGV4dGVuZGVkX291dHB1dF9zaGFwZS5EaW1zKDApOyArK2EpIHsKLSAgICBzaXplX3QgaW5wdXQxX29mZnNldF9kID0gaW5wdXQxX29mZnNldF9hOwotICAgIHNpemVfdCBpbnB1dDJfb2Zmc2V0X2QgPSBpbnB1dDJfb2Zmc2V0X2E7Ci0gICAgc2l6ZV90IG91dHB1dF9vZmZzZXRfZCA9IG91dHB1dF9vZmZzZXRfYTsKLSAgICBmb3IgKGludCBkID0gMDsgZCA8IGV4dGVuZGVkX291dHB1dF9zaGFwZS5EaW1zKDEpOyArK2QpIHsKLSAgICAgIHNpemVfdCBpbnB1dDFfb2Zmc2V0X2IgPSBpbnB1dDFfb2Zmc2V0X2Q7Ci0gICAgICBzaXplX3QgaW5wdXQyX29mZnNldF9iID0gaW5wdXQyX29mZnNldF9kOwotICAgICAgc2l6ZV90IG91dHB1dF9vZmZzZXRfYiA9IG91dHB1dF9vZmZzZXRfZDsKLSAgICAgIGZvciAoaW50IGIgPSAwOyBiIDwgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoMik7ICsrYikgewotICAgICAgICBzaXplX3QgaW5wdXQxX29mZnNldF95ID0gaW5wdXQxX29mZnNldF9iOwotICAgICAgICBzaXplX3QgaW5wdXQyX29mZnNldF95ID0gaW5wdXQyX29mZnNldF9iOwotICAgICAgICBzaXplX3Qgb3V0cHV0X29mZnNldF95ID0gb3V0cHV0X29mZnNldF9iOwotICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IGV4dGVuZGVkX291dHB1dF9zaGFwZS5EaW1zKDMpOyArK3kpIHsKLSAgICAgICAgICBzaXplX3QgaW5wdXQxX29mZnNldF94ID0gaW5wdXQxX29mZnNldF95OwotICAgICAgICAgIHNpemVfdCBpbnB1dDJfb2Zmc2V0X3ggPSBpbnB1dDJfb2Zmc2V0X3k7Ci0gICAgICAgICAgc2l6ZV90IG91dHB1dF9vZmZzZXRfeCA9IG91dHB1dF9vZmZzZXRfeTsKLSAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IGV4dGVuZGVkX291dHB1dF9zaGFwZS5EaW1zKDQpOyArK3gpIHsKLSAgICAgICAgICAgIHNpemVfdCBpbnB1dDFfb2Zmc2V0X2MgPSBpbnB1dDFfb2Zmc2V0X3g7Ci0gICAgICAgICAgICBzaXplX3QgaW5wdXQyX29mZnNldF9jID0gaW5wdXQyX29mZnNldF94OwotICAgICAgICAgICAgc2l6ZV90IG91dHB1dF9vZmZzZXRfYyA9IG91dHB1dF9vZmZzZXRfeDsKLSAgICAgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoNSk7ICsrYykgewotICAgICAgICAgICAgICBvdXRwdXRfZGF0YVtvdXRwdXRfb2Zmc2V0X2NdID0KLSAgICAgICAgICAgICAgICAgIGJpbmFyeV9mdW5jKGlucHV0MV9kYXRhW2lucHV0MV9vZmZzZXRfY10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDJfZGF0YVtpbnB1dDJfb2Zmc2V0X2NdLCBwYXJhbXMpOwotICAgICAgICAgICAgICBpbnB1dDFfb2Zmc2V0X2MgKz0gZGVzYzEuc3RyaWRlc1s1XTsKLSAgICAgICAgICAgICAgaW5wdXQyX29mZnNldF9jICs9IGRlc2MyLnN0cmlkZXNbNV07Ci0gICAgICAgICAgICAgICsrb3V0cHV0X29mZnNldF9jOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5wdXQxX29mZnNldF94ICs9IGRlc2MxLnN0cmlkZXNbNF07Ci0gICAgICAgICAgICBpbnB1dDJfb2Zmc2V0X3ggKz0gZGVzYzIuc3RyaWRlc1s0XTsKLSAgICAgICAgICAgIG91dHB1dF9vZmZzZXRfeCArPSBleHRlbmRlZF9vdXRwdXRfc2hhcGUuRGltcyg1KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaW5wdXQxX29mZnNldF95ICs9IGRlc2MxLnN0cmlkZXNbM107Ci0gICAgICAgICAgaW5wdXQyX29mZnNldF95ICs9IGRlc2MyLnN0cmlkZXNbM107Ci0gICAgICAgICAgb3V0cHV0X29mZnNldF95ICs9Ci0gICAgICAgICAgICAgIGV4dGVuZGVkX291dHB1dF9zaGFwZS5EaW1zKDQpICogZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoNSk7Ci0gICAgICAgIH0KLSAgICAgICAgaW5wdXQxX29mZnNldF9iICs9IGRlc2MxLnN0cmlkZXNbMl07Ci0gICAgICAgIGlucHV0Ml9vZmZzZXRfYiArPSBkZXNjMi5zdHJpZGVzWzJdOwotICAgICAgICBvdXRwdXRfb2Zmc2V0X2IgKz0gZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoMykgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoNCkgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoNSk7Ci0gICAgICB9Ci0gICAgICBpbnB1dDFfb2Zmc2V0X2QgKz0gZGVzYzEuc3RyaWRlc1sxXTsKLSAgICAgIGlucHV0Ml9vZmZzZXRfZCArPSBkZXNjMi5zdHJpZGVzWzFdOwotICAgICAgb3V0cHV0X29mZnNldF9kICs9Ci0gICAgICAgICAgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoMikgKiBleHRlbmRlZF9vdXRwdXRfc2hhcGUuRGltcygzKSAqCi0gICAgICAgICAgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoNCkgKiBleHRlbmRlZF9vdXRwdXRfc2hhcGUuRGltcyg1KTsKLSAgICB9Ci0gICAgaW5wdXQxX29mZnNldF9hICs9IGRlc2MxLnN0cmlkZXNbMF07Ci0gICAgaW5wdXQyX29mZnNldF9hICs9IGRlc2MyLnN0cmlkZXNbMF07Ci0gICAgb3V0cHV0X29mZnNldF9hICs9Ci0gICAgICAgIGV4dGVuZGVkX291dHB1dF9zaGFwZS5EaW1zKDEpICogZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoMikgKgotICAgICAgICBleHRlbmRlZF9vdXRwdXRfc2hhcGUuRGltcygzKSAqIGV4dGVuZGVkX291dHB1dF9zaGFwZS5EaW1zKDQpICoKLSAgICAgICAgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoNSk7CisgIHNpemVfdCBjb21wcmVzc2VkX2lucHV0MV9zdHJpZGVba01heEJyb2FkY2FzdERpbV07CisgIHNpemVfdCBjb21wcmVzc2VkX2lucHV0Ml9zdHJpZGVba01heEJyb2FkY2FzdERpbV07CisgIHNpemVfdCBjb21wcmVzc2VkX291dHB1dF9zaGFwZVtrTWF4QnJvYWRjYXN0RGltXTsKKyAgYm9vbCBicm9hZGNhc3RhYmxlX3NoYXBlID0gUmVkdWNlRGltZW5zaW9uc0ZvckJyb2FkY2FzdDxrTWF4QnJvYWRjYXN0RGltPigKKyAgICAgIGlucHV0MV9zaGFwZSwgaW5wdXQyX3NoYXBlLCBjb21wcmVzc2VkX2lucHV0MV9zdHJpZGUsCisgICAgICBjb21wcmVzc2VkX2lucHV0Ml9zdHJpZGUsIGNvbXByZXNzZWRfb3V0cHV0X3NoYXBlKTsKKyAgLy8gU2tpcCBicm9hZGNhc3RpbmcgZm9yIGRlZ2VuZXJhdGUgc2hhcGVzLgorICBpZiAoIWJyb2FkY2FzdGFibGVfc2hhcGUpIHsKKyAgICByZXR1cm47CiAgIH0KKworICBzaXplX3QgaW5wdXQxX29mZnNldCA9IDA7CisgIHNpemVfdCBpbnB1dDJfb2Zmc2V0ID0gMDsKKyAgc2l6ZV90IG91dHB1dF9vZmZzZXQgPSAwOworICBCcm9hZGNhc3RBZGRSZWN1cnNpdmVEaW1lbnNpb25zKAorICAgICAgcGFyYW1zLCBrTWF4QnJvYWRjYXN0RGltIC0gMSwgJmlucHV0MV9vZmZzZXQsICZpbnB1dDJfb2Zmc2V0LAorICAgICAgJm91dHB1dF9vZmZzZXQsIGNvbXByZXNzZWRfaW5wdXQxX3N0cmlkZSwgY29tcHJlc3NlZF9pbnB1dDJfc3RyaWRlLAorICAgICAgY29tcHJlc3NlZF9vdXRwdXRfc2hhcGUsIGlucHV0MV9kYXRhLCBpbnB1dDJfZGF0YSwgb3V0cHV0X2RhdGEsCisgICAgICBjaGVja19hcml0aG1ldGljX3BhcmFtcywgYmluYXJ5X2Z1bmMpOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3JlZmVyZW5jZS9pbnRlZ2VyX29wcy9tdWwuaCBiL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3JlZmVyZW5jZS9pbnRlZ2VyX29wcy9tdWwuaAppbmRleCAwNTA2NjE4Li5hNTcwNTZkIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9yZWZlcmVuY2UvaW50ZWdlcl9vcHMvbXVsLmgKKysrIGIvdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvcmVmZXJlbmNlL2ludGVnZXJfb3BzL211bC5oCkBAIC0yNCw2ICsyNCw5IEBACiBuYW1lc3BhY2UgdGZsaXRlIHsKIG5hbWVzcGFjZSByZWZlcmVuY2VfaW50ZWdlcl9vcHMgewogCisvLyBNYXhpbXVtIGRpbWVuc2lvbiBzdXBwb3J0ZWQgYnkgdGhlIGJyb2FkY2FzdCBtdWwgb3BlcmF0aW9uLgorY29uc3RleHByIGludCBrTWF4TXVsQnJvYWRjYXN0RGltID0gNjsKKwogdGVtcGxhdGUgPHR5cGVuYW1lIElucHV0VHlwZSwgdHlwZW5hbWUgT3V0cHV0VHlwZT4KIHZvaWQgTXVsRWxlbWVudHdpc2UoaW50IHNpemUsIGNvbnN0IEFyaXRobWV0aWNQYXJhbXMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5wdXRUeXBlKiBpbnB1dDFfZGF0YSwgY29uc3QgSW5wdXRUeXBlKiBpbnB1dDJfZGF0YSwKQEAgLTg4LDQ2ICs5MSwxMDQgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1pbmxpbmUgdm9pZCBCcm9hZGNhc3RNdWw0RFNsb3coCitpbmxpbmUgdm9pZCBCcm9hZGNhc3RNdWw2RFNsb3coCiAgICAgY29uc3QgQXJpdGhtZXRpY1BhcmFtcyYgcGFyYW1zLCBjb25zdCBSdW50aW1lU2hhcGUmIGlucHV0MV9zaGFwZSwKICAgICBjb25zdCBUKiBpbnB1dDFfZGF0YSwgY29uc3QgUnVudGltZVNoYXBlJiBpbnB1dDJfc2hhcGUsCiAgICAgY29uc3QgVCogaW5wdXQyX2RhdGEsIGNvbnN0IFJ1bnRpbWVTaGFwZSYgb3V0cHV0X3NoYXBlLCBUKiBvdXRwdXRfZGF0YSkgewotICBydXk6OnByb2ZpbGVyOjpTY29wZUxhYmVsIGxhYmVsKCJCcm9hZGNhc3RNdWw0RFNsb3ciKTsKKyAgcnV5Ojpwcm9maWxlcjo6U2NvcGVMYWJlbCBsYWJlbCgiQnJvYWRjYXN0TXVsNkRTbG93Iik7CiAKLSAgTmRBcnJheURlc2M8ND4gZGVzYzE7Ci0gIE5kQXJyYXlEZXNjPDQ+IGRlc2MyOworICBOZEFycmF5RGVzYzxrTWF4TXVsQnJvYWRjYXN0RGltPiBkZXNjMTsKKyAgTmRBcnJheURlc2M8a01heE11bEJyb2FkY2FzdERpbT4gZGVzYzI7CiAgIC8vIFRoZSBpbnB1dCBzaGFwZXMgYXJlIGV4dGVuZGVkIGFzIHBhcnQgb2YgTmRBcnJheURlc2MgaW5pdGlhbGl6YXRpb24uCiAgIE5kQXJyYXlEZXNjc0ZvckVsZW1lbnR3aXNlQnJvYWRjYXN0KGlucHV0MV9zaGFwZSwgaW5wdXQyX3NoYXBlLCAmZGVzYzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjMik7CiAgIGNvbnN0IFJ1bnRpbWVTaGFwZSBleHRlbmRlZF9vdXRwdXRfc2hhcGUgPQotICAgICAgUnVudGltZVNoYXBlOjpFeHRlbmRlZFNoYXBlKDQsIG91dHB1dF9zaGFwZSk7CisgICAgICBSdW50aW1lU2hhcGU6OkV4dGVuZGVkU2hhcGUoa01heE11bEJyb2FkY2FzdERpbSwgb3V0cHV0X3NoYXBlKTsKKyAgLy8gQ2FjaGUgb3V0cHV0IHNoYXBlIGRpbWVuc2lvbnMuCisgIGludDMyX3QgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlX2RpbXNba01heE11bEJyb2FkY2FzdERpbV07CisgIHN0ZDo6bWVtY3B5KGV4dGVuZGVkX291dHB1dF9zaGFwZV9kaW1zLCBleHRlbmRlZF9vdXRwdXRfc2hhcGUuRGltc0RhdGEoKSwKKyAgICAgICAgICAgICAgc2l6ZW9mKGV4dGVuZGVkX291dHB1dF9zaGFwZV9kaW1zKSk7CiAKLSAgZm9yIChpbnQgYiA9IDA7IGIgPCBleHRlbmRlZF9vdXRwdXRfc2hhcGUuRGltcygwKTsgKytiKSB7Ci0gICAgZm9yIChpbnQgeSA9IDA7IHkgPCBleHRlbmRlZF9vdXRwdXRfc2hhcGUuRGltcygxKTsgKyt5KSB7Ci0gICAgICBmb3IgKGludCB4ID0gMDsgeCA8IGV4dGVuZGVkX291dHB1dF9zaGFwZS5EaW1zKDIpOyArK3gpIHsKLSAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBleHRlbmRlZF9vdXRwdXRfc2hhcGUuRGltcygzKTsgKytjKSB7Ci0gICAgICAgICAgY29uc3QgaW50MzJfdCBpbnB1dDFfdmFsID0KLSAgICAgICAgICAgICAgcGFyYW1zLmlucHV0MV9vZmZzZXQgKwotICAgICAgICAgICAgICBpbnB1dDFfZGF0YVtTdWJzY3JpcHRUb0luZGV4KGRlc2MxLCBiLCB5LCB4LCBjKV07Ci0gICAgICAgICAgY29uc3QgaW50MzJfdCBpbnB1dDJfdmFsID0KLSAgICAgICAgICAgICAgcGFyYW1zLmlucHV0Ml9vZmZzZXQgKwotICAgICAgICAgICAgICBpbnB1dDJfZGF0YVtTdWJzY3JpcHRUb0luZGV4KGRlc2MyLCBiLCB5LCB4LCBjKV07Ci0gICAgICAgICAgY29uc3QgaW50MzJfdCB1bmNsYW1wZWRfcmVzdWx0ID0KLSAgICAgICAgICAgICAgcGFyYW1zLm91dHB1dF9vZmZzZXQgKwotICAgICAgICAgICAgICBNdWx0aXBseUJ5UXVhbnRpemVkTXVsdGlwbGllcihpbnB1dDFfdmFsICogaW5wdXQyX3ZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm91dHB1dF9tdWx0aXBsaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMub3V0cHV0X3NoaWZ0KTsKLSAgICAgICAgICBjb25zdCBpbnQzMl90IGNsYW1wZWRfb3V0cHV0ID0gc3RkOjptaW4oCi0gICAgICAgICAgICAgIHBhcmFtcy5xdWFudGl6ZWRfYWN0aXZhdGlvbl9tYXgsCi0gICAgICAgICAgICAgIHN0ZDo6bWF4KHBhcmFtcy5xdWFudGl6ZWRfYWN0aXZhdGlvbl9taW4sIHVuY2xhbXBlZF9yZXN1bHQpKTsKLSAgICAgICAgICBvdXRwdXRfZGF0YVtPZmZzZXQoZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLCBiLCB5LCB4LCBjKV0gPQotICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxUPihjbGFtcGVkX291dHB1dCk7CisgIHNpemVfdCBpbnB1dDFfb2Zmc2V0X2EgPSAwOworICBzaXplX3QgaW5wdXQyX29mZnNldF9hID0gMDsKKyAgc2l6ZV90IG91dHB1dF9vZmZzZXRfYSA9IDA7CisgIGZvciAoaW50IGEgPSAwOyBhIDwgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlX2RpbXNbMF07ICsrYSkgeworICAgIHNpemVfdCBpbnB1dDFfb2Zmc2V0X2QgPSBpbnB1dDFfb2Zmc2V0X2E7CisgICAgc2l6ZV90IGlucHV0Ml9vZmZzZXRfZCA9IGlucHV0Ml9vZmZzZXRfYTsKKyAgICBzaXplX3Qgb3V0cHV0X29mZnNldF9kID0gb3V0cHV0X29mZnNldF9hOworICAgIGZvciAoaW50IGQgPSAwOyBkIDwgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlX2RpbXNbMV07ICsrZCkgeworICAgICAgc2l6ZV90IGlucHV0MV9vZmZzZXRfYiA9IGlucHV0MV9vZmZzZXRfZDsKKyAgICAgIHNpemVfdCBpbnB1dDJfb2Zmc2V0X2IgPSBpbnB1dDJfb2Zmc2V0X2Q7CisgICAgICBzaXplX3Qgb3V0cHV0X29mZnNldF9iID0gb3V0cHV0X29mZnNldF9kOworICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCBleHRlbmRlZF9vdXRwdXRfc2hhcGVfZGltc1syXTsgKytiKSB7CisgICAgICAgIHNpemVfdCBpbnB1dDFfb2Zmc2V0X3kgPSBpbnB1dDFfb2Zmc2V0X2I7CisgICAgICAgIHNpemVfdCBpbnB1dDJfb2Zmc2V0X3kgPSBpbnB1dDJfb2Zmc2V0X2I7CisgICAgICAgIHNpemVfdCBvdXRwdXRfb2Zmc2V0X3kgPSBvdXRwdXRfb2Zmc2V0X2I7CisgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlX2RpbXNbM107ICsreSkgeworICAgICAgICAgIHNpemVfdCBpbnB1dDFfb2Zmc2V0X3ggPSBpbnB1dDFfb2Zmc2V0X3k7CisgICAgICAgICAgc2l6ZV90IGlucHV0Ml9vZmZzZXRfeCA9IGlucHV0Ml9vZmZzZXRfeTsKKyAgICAgICAgICBzaXplX3Qgb3V0cHV0X29mZnNldF94ID0gb3V0cHV0X29mZnNldF95OworICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlX2RpbXNbNF07ICsreCkgeworICAgICAgICAgICAgc2l6ZV90IGlucHV0MV9vZmZzZXRfYyA9IGlucHV0MV9vZmZzZXRfeDsKKyAgICAgICAgICAgIHNpemVfdCBpbnB1dDJfb2Zmc2V0X2MgPSBpbnB1dDJfb2Zmc2V0X3g7CisgICAgICAgICAgICBzaXplX3Qgb3V0cHV0X29mZnNldF9jID0gb3V0cHV0X29mZnNldF94OworICAgICAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBleHRlbmRlZF9vdXRwdXRfc2hhcGVfZGltc1s1XTsgKytjKSB7CisgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgaW5wdXQxX3ZhbCA9CisgICAgICAgICAgICAgICAgICBwYXJhbXMuaW5wdXQxX29mZnNldCArIGlucHV0MV9kYXRhW2lucHV0MV9vZmZzZXRfY107CisgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgaW5wdXQyX3ZhbCA9CisgICAgICAgICAgICAgICAgICBwYXJhbXMuaW5wdXQyX29mZnNldCArIGlucHV0Ml9kYXRhW2lucHV0Ml9vZmZzZXRfY107CisgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdW5jbGFtcGVkX3Jlc3VsdCA9CisgICAgICAgICAgICAgICAgICBwYXJhbXMub3V0cHV0X29mZnNldCArCisgICAgICAgICAgICAgICAgICBNdWx0aXBseUJ5UXVhbnRpemVkTXVsdGlwbGllcihpbnB1dDFfdmFsICogaW5wdXQyX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5vdXRwdXRfbXVsdGlwbGllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5vdXRwdXRfc2hpZnQpOworICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGNsYW1wZWRfb3V0cHV0ID0gc3RkOjptaW4oCisgICAgICAgICAgICAgICAgICBwYXJhbXMucXVhbnRpemVkX2FjdGl2YXRpb25fbWF4LAorICAgICAgICAgICAgICAgICAgc3RkOjptYXgocGFyYW1zLnF1YW50aXplZF9hY3RpdmF0aW9uX21pbiwgdW5jbGFtcGVkX3Jlc3VsdCkpOworICAgICAgICAgICAgICBvdXRwdXRfZGF0YVtvdXRwdXRfb2Zmc2V0X2NdID0gc3RhdGljX2Nhc3Q8VD4oY2xhbXBlZF9vdXRwdXQpOworICAgICAgICAgICAgICBpbnB1dDFfb2Zmc2V0X2MgKz0gZGVzYzEuc3RyaWRlc1s1XTsKKyAgICAgICAgICAgICAgaW5wdXQyX29mZnNldF9jICs9IGRlc2MyLnN0cmlkZXNbNV07CisgICAgICAgICAgICAgICsrb3V0cHV0X29mZnNldF9jOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5wdXQxX29mZnNldF94ICs9IGRlc2MxLnN0cmlkZXNbNF07CisgICAgICAgICAgICBpbnB1dDJfb2Zmc2V0X3ggKz0gZGVzYzIuc3RyaWRlc1s0XTsKKyAgICAgICAgICAgIG91dHB1dF9vZmZzZXRfeCArPSBleHRlbmRlZF9vdXRwdXRfc2hhcGVfZGltc1s1XTsKKyAgICAgICAgICB9CisgICAgICAgICAgaW5wdXQxX29mZnNldF95ICs9IGRlc2MxLnN0cmlkZXNbM107CisgICAgICAgICAgaW5wdXQyX29mZnNldF95ICs9IGRlc2MyLnN0cmlkZXNbM107CisgICAgICAgICAgb3V0cHV0X29mZnNldF95ICs9CisgICAgICAgICAgICAgIGV4dGVuZGVkX291dHB1dF9zaGFwZV9kaW1zWzRdICogZXh0ZW5kZWRfb3V0cHV0X3NoYXBlX2RpbXNbNV07CiAgICAgICAgIH0KKyAgICAgICAgaW5wdXQxX29mZnNldF9iICs9IGRlc2MxLnN0cmlkZXNbMl07CisgICAgICAgIGlucHV0Ml9vZmZzZXRfYiArPSBkZXNjMi5zdHJpZGVzWzJdOworICAgICAgICBvdXRwdXRfb2Zmc2V0X2IgKz0gZXh0ZW5kZWRfb3V0cHV0X3NoYXBlX2RpbXNbM10gKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlX2RpbXNbNF0gKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlX2RpbXNbNV07CiAgICAgICB9CisgICAgICBpbnB1dDFfb2Zmc2V0X2QgKz0gZGVzYzEuc3RyaWRlc1sxXTsKKyAgICAgIGlucHV0Ml9vZmZzZXRfZCArPSBkZXNjMi5zdHJpZGVzWzFdOworICAgICAgb3V0cHV0X29mZnNldF9kICs9CisgICAgICAgICAgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlX2RpbXNbMl0gKiBleHRlbmRlZF9vdXRwdXRfc2hhcGVfZGltc1szXSAqCisgICAgICAgICAgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlX2RpbXNbNF0gKiBleHRlbmRlZF9vdXRwdXRfc2hhcGVfZGltc1s1XTsKICAgICB9CisgICAgaW5wdXQxX29mZnNldF9hICs9IGRlc2MxLnN0cmlkZXNbMF07CisgICAgaW5wdXQyX29mZnNldF9hICs9IGRlc2MyLnN0cmlkZXNbMF07CisgICAgb3V0cHV0X29mZnNldF9hICs9CisgICAgICAgIGV4dGVuZGVkX291dHB1dF9zaGFwZV9kaW1zWzFdICogZXh0ZW5kZWRfb3V0cHV0X3NoYXBlX2RpbXNbMl0gKgorICAgICAgICBleHRlbmRlZF9vdXRwdXRfc2hhcGVfZGltc1szXSAqIGV4dGVuZGVkX291dHB1dF9zaGFwZV9kaW1zWzRdICoKKyAgICAgICAgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlX2RpbXNbNV07CiAgIH0KIH0KIAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbmxpbmUgdm9pZCBCcm9hZGNhc3RNdWw0RFNsb3coCisgICAgY29uc3QgQXJpdGhtZXRpY1BhcmFtcyYgcGFyYW1zLCBjb25zdCBSdW50aW1lU2hhcGUmIGlucHV0MV9zaGFwZSwKKyAgICBjb25zdCBUKiBpbnB1dDFfZGF0YSwgY29uc3QgUnVudGltZVNoYXBlJiBpbnB1dDJfc2hhcGUsCisgICAgY29uc3QgVCogaW5wdXQyX2RhdGEsIGNvbnN0IFJ1bnRpbWVTaGFwZSYgb3V0cHV0X3NoYXBlLCBUKiBvdXRwdXRfZGF0YSkgeworICBCcm9hZGNhc3RNdWw2RFNsb3cocGFyYW1zLCBpbnB1dDFfc2hhcGUsIGlucHV0MV9kYXRhLCBpbnB1dDJfc2hhcGUsCisgICAgICAgICAgICAgICAgICAgICBpbnB1dDJfZGF0YSwgb3V0cHV0X3NoYXBlLCBvdXRwdXRfZGF0YSk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSByZWZlcmVuY2VfaW50ZWdlcl9vcHMKIH0gIC8vIG5hbWVzcGFjZSB0ZmxpdGUKICNlbmRpZiAgLy8gVEVOU09SRkxPV19MSVRFX0tFUk5FTFNfSU5URVJOQUxfUkVGRVJFTkNFX0lOVEVHRVJfT1BTX01VTF9IXwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvcmVmZXJlbmNlL211bC5oIGIvdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvcmVmZXJlbmNlL211bC5oCmluZGV4IDI3NjdmZWYuLmZjYTc0YTMgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3JlZmVyZW5jZS9tdWwuaAorKysgYi90ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9yZWZlcmVuY2UvbXVsLmgKQEAgLTI0LDYgKzI0LDkgQEAKIAogbmFtZXNwYWNlIHJlZmVyZW5jZV9vcHMgewogCisvLyBNYXhpbXVtIGRpbWVuc2lvbiBzdXBwb3J0ZWQgYnkgdGhlIGJyb2FkY2FzdCBtdWwgb3BlcmF0aW9uLgorY29uc3RleHByIGludCBrTWF4TXVsQnJvYWRjYXN0RGltID0gNjsKKwogLy8gRWxlbWVudC13aXNlIG11bCB0aGF0IGNhbiBvZnRlbiBiZSB1c2VkIGZvciBpbm5lciBsb29wIG9mIGJyb2FkY2FzdCBNdWwgYXMKIC8vIHdlbGwgYXMgdGhlIG5vbi1icm9hZGNhc3QgTXVsLgogaW5saW5lIHZvaWQgTXVsRWxlbWVudHdpc2UoaW50IHNpemUsIGNvbnN0IEFyaXRobWV0aWNQYXJhbXMmIHBhcmFtcywKQEAgLTg4LDEyOCArOTEsMTc0IEBACiAgIE11bEVsZW1lbnR3aXNlKGZsYXRfc2l6ZSwgcGFyYW1zLCBpbnB1dDFfZGF0YSwgaW5wdXQyX2RhdGEsIG91dHB1dF9kYXRhKTsKIH0KIAotaW5saW5lIHZvaWQgQnJvYWRjYXN0TXVsNERTbG93KGNvbnN0IEFyaXRobWV0aWNQYXJhbXMmIHBhcmFtcywKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBGPgordm9pZCBCcm9hZGNhc3RNdWxSZWN1cnNpdmVEaW1lbnNpb25zKAorICAgIGNvbnN0IEFyaXRobWV0aWNQYXJhbXMmIHBhcmFtcywgaW50IGRpbWVuc2lvbiwgY29uc3QgVCogaW5wdXQxX2RhdGEsCisgICAgY29uc3QgVCogaW5wdXQyX2RhdGEsIFQqIG91dHB1dF9kYXRhLCBzaXplX3QqIGlucHV0MV9vZmZzZXRfcCwKKyAgICBzaXplX3QqIGlucHV0Ml9vZmZzZXRfcCwgc2l6ZV90KiBvdXRwdXRfb2Zmc2V0LAorICAgIGNvbnN0IE5kQXJyYXlEZXNjPGtNYXhNdWxCcm9hZGNhc3REaW0+JiBkZXNjMSwKKyAgICBjb25zdCBOZEFycmF5RGVzYzxrTWF4TXVsQnJvYWRjYXN0RGltPiYgZGVzYzIsCisgICAgY29uc3QgaW50MzJfdCBleHRlbmRlZF9vdXRwdXRfc2hhcGVfZGltc1trTWF4TXVsQnJvYWRjYXN0RGltXSwKKyAgICBGIGJpbmFyeV9mdW5jKSB7CisgIGlmIChkaW1lbnNpb24gPT0ga01heE11bEJyb2FkY2FzdERpbSAtIDEpIHsKKyAgICBmb3IgKGludCBjID0gMDsgYyA8IGV4dGVuZGVkX291dHB1dF9zaGFwZV9kaW1zW2RpbWVuc2lvbl07ICsrYykgeworICAgICAgY29uc3QgVCBpbnB1dDFfdmFsID0gaW5wdXQxX2RhdGFbKmlucHV0MV9vZmZzZXRfcF07CisgICAgICBjb25zdCBUIGlucHV0Ml92YWwgPSBpbnB1dDJfZGF0YVsqaW5wdXQyX29mZnNldF9wXTsKKyAgICAgIG91dHB1dF9kYXRhWypvdXRwdXRfb2Zmc2V0XSA9IGJpbmFyeV9mdW5jKHBhcmFtcywgaW5wdXQxX3ZhbCwgaW5wdXQyX3ZhbCk7CisgICAgICAqaW5wdXQxX29mZnNldF9wICs9IGRlc2MxLnN0cmlkZXNbZGltZW5zaW9uXTsKKyAgICAgICppbnB1dDJfb2Zmc2V0X3AgKz0gZGVzYzIuc3RyaWRlc1tkaW1lbnNpb25dOworICAgICAgKysoKm91dHB1dF9vZmZzZXQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCBhID0gMDsgYSA8IGV4dGVuZGVkX291dHB1dF9zaGFwZV9kaW1zW2RpbWVuc2lvbl07ICsrYSkgeworICAgICAgc2l6ZV90IGlucHV0MV9vZmZzZXRfYyA9ICppbnB1dDFfb2Zmc2V0X3A7CisgICAgICBzaXplX3QgaW5wdXQyX29mZnNldF9jID0gKmlucHV0Ml9vZmZzZXRfcDsKKyAgICAgIEJyb2FkY2FzdE11bFJlY3Vyc2l2ZURpbWVuc2lvbnMoCisgICAgICAgICAgcGFyYW1zLCBkaW1lbnNpb24gKyAxLCBpbnB1dDFfZGF0YSwgaW5wdXQyX2RhdGEsIG91dHB1dF9kYXRhLAorICAgICAgICAgICZpbnB1dDFfb2Zmc2V0X2MsICZpbnB1dDJfb2Zmc2V0X2MsIG91dHB1dF9vZmZzZXQsIGRlc2MxLCBkZXNjMiwKKyAgICAgICAgICBleHRlbmRlZF9vdXRwdXRfc2hhcGVfZGltcywgYmluYXJ5X2Z1bmMpOworICAgICAgKmlucHV0MV9vZmZzZXRfcCArPSBkZXNjMS5zdHJpZGVzW2RpbWVuc2lvbl07CisgICAgICAqaW5wdXQyX29mZnNldF9wICs9IGRlc2MyLnN0cmlkZXNbZGltZW5zaW9uXTsKKyAgICB9CisgIH0KK30KKworaW5saW5lIHZvaWQgQnJvYWRjYXN0TXVsNkRTbG93KGNvbnN0IEFyaXRobWV0aWNQYXJhbXMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSdW50aW1lU2hhcGUmIGlucHV0MV9zaGFwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBpbnB1dDFfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSdW50aW1lU2hhcGUmIGlucHV0Ml9zaGFwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBpbnB1dDJfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSdW50aW1lU2hhcGUmIG91dHB1dF9zaGFwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXRwdXRfZGF0YSkgewotICBOZEFycmF5RGVzYzw0PiBkZXNjMTsKLSAgTmRBcnJheURlc2M8ND4gZGVzYzI7CisgIE5kQXJyYXlEZXNjPGtNYXhNdWxCcm9hZGNhc3REaW0+IGRlc2MxOworICBOZEFycmF5RGVzYzxrTWF4TXVsQnJvYWRjYXN0RGltPiBkZXNjMjsKICAgTmRBcnJheURlc2NzRm9yRWxlbWVudHdpc2VCcm9hZGNhc3QoaW5wdXQxX3NoYXBlLCBpbnB1dDJfc2hhcGUsICZkZXNjMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MyKTsKICAgY29uc3QgUnVudGltZVNoYXBlIGV4dGVuZGVkX291dHB1dF9zaGFwZSA9Ci0gICAgICBSdW50aW1lU2hhcGU6OkV4dGVuZGVkU2hhcGUoNCwgb3V0cHV0X3NoYXBlKTsKKyAgICAgIFJ1bnRpbWVTaGFwZTo6RXh0ZW5kZWRTaGFwZShrTWF4TXVsQnJvYWRjYXN0RGltLCBvdXRwdXRfc2hhcGUpOworICAvLyBDYWNoZSBvdXRwdXQgc2hhcGUgZGltZW5zaW9ucy4KKyAgaW50MzJfdCBleHRlbmRlZF9vdXRwdXRfc2hhcGVfZGltc1trTWF4TXVsQnJvYWRjYXN0RGltXTsKKyAgc3RkOjptZW1jcHkoZXh0ZW5kZWRfb3V0cHV0X3NoYXBlX2RpbXMsIGV4dGVuZGVkX291dHB1dF9zaGFwZS5EaW1zRGF0YSgpLAorICAgICAgICAgICAgICBzaXplb2YoZXh0ZW5kZWRfb3V0cHV0X3NoYXBlX2RpbXMpKTsKIAotICBmb3IgKGludCBiID0gMDsgYiA8IGV4dGVuZGVkX291dHB1dF9zaGFwZS5EaW1zKDApOyArK2IpIHsKLSAgICBmb3IgKGludCB5ID0gMDsgeSA8IGV4dGVuZGVkX291dHB1dF9zaGFwZS5EaW1zKDEpOyArK3kpIHsKLSAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoMik7ICsreCkgewotICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IGV4dGVuZGVkX291dHB1dF9zaGFwZS5EaW1zKDMpOyArK2MpIHsKLSAgICAgICAgICBjb25zdCBpbnQzMl90IGlucHV0MV92YWwgPQotICAgICAgICAgICAgICBwYXJhbXMuaW5wdXQxX29mZnNldCArCi0gICAgICAgICAgICAgIGlucHV0MV9kYXRhW1N1YnNjcmlwdFRvSW5kZXgoZGVzYzEsIGIsIHksIHgsIGMpXTsKLSAgICAgICAgICBjb25zdCBpbnQzMl90IGlucHV0Ml92YWwgPQotICAgICAgICAgICAgICBwYXJhbXMuaW5wdXQyX29mZnNldCArCi0gICAgICAgICAgICAgIGlucHV0Ml9kYXRhW1N1YnNjcmlwdFRvSW5kZXgoZGVzYzIsIGIsIHksIHgsIGMpXTsKLSAgICAgICAgICBjb25zdCBpbnQzMl90IHVuY2xhbXBlZF9yZXN1bHQgPQotICAgICAgICAgICAgICBwYXJhbXMub3V0cHV0X29mZnNldCArCi0gICAgICAgICAgICAgIE11bHRpcGx5QnlRdWFudGl6ZWRNdWx0aXBsaWVyKGlucHV0MV92YWwgKiBpbnB1dDJfdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMub3V0cHV0X211bHRpcGxpZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5vdXRwdXRfc2hpZnQpOwotICAgICAgICAgIGNvbnN0IGludDMyX3QgY2xhbXBlZF9vdXRwdXQgPSBzdGQ6Om1pbigKLSAgICAgICAgICAgICAgcGFyYW1zLnF1YW50aXplZF9hY3RpdmF0aW9uX21heCwKLSAgICAgICAgICAgICAgc3RkOjptYXgocGFyYW1zLnF1YW50aXplZF9hY3RpdmF0aW9uX21pbiwgdW5jbGFtcGVkX3Jlc3VsdCkpOwotICAgICAgICAgIG91dHB1dF9kYXRhW09mZnNldChleHRlbmRlZF9vdXRwdXRfc2hhcGUsIGIsIHksIHgsIGMpXSA9Ci0gICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNsYW1wZWRfb3V0cHV0KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQorICBzaXplX3QgaW5wdXQxX29mZnNldCA9IDA7CisgIHNpemVfdCBpbnB1dDJfb2Zmc2V0ID0gMDsKKyAgc2l6ZV90IG91dHB1dF9vZmZzZXQgPSAwOworICBCcm9hZGNhc3RNdWxSZWN1cnNpdmVEaW1lbnNpb25zKAorICAgICAgcGFyYW1zLCAwLCBpbnB1dDFfZGF0YSwgaW5wdXQyX2RhdGEsIG91dHB1dF9kYXRhLCAmaW5wdXQxX29mZnNldCwKKyAgICAgICZpbnB1dDJfb2Zmc2V0LCAmb3V0cHV0X29mZnNldCwgZGVzYzEsIGRlc2MyLCBleHRlbmRlZF9vdXRwdXRfc2hhcGVfZGltcywKKyAgICAgIFtdKGNvbnN0IEFyaXRobWV0aWNQYXJhbXMmIHBhcmFtcywgY29uc3QgdWludDhfdCBpbnB1dDFfdmFsLAorICAgICAgICAgY29uc3QgdWludDhfdCBpbnB1dDJfdmFsKSB7CisgICAgICAgIGNvbnN0IGludDMyX3Qgb2Zmc2V0dGVkX2lucHV0MV92YWwgPSBwYXJhbXMuaW5wdXQxX29mZnNldCArIGlucHV0MV92YWw7CisgICAgICAgIGNvbnN0IGludDMyX3Qgb2Zmc2V0dGVkX2lucHV0Ml92YWwgPSBwYXJhbXMuaW5wdXQyX29mZnNldCArIGlucHV0Ml92YWw7CisgICAgICAgIGNvbnN0IGludDMyX3QgdW5jbGFtcGVkX3Jlc3VsdCA9CisgICAgICAgICAgICBwYXJhbXMub3V0cHV0X29mZnNldCArCisgICAgICAgICAgICBNdWx0aXBseUJ5UXVhbnRpemVkTXVsdGlwbGllcigKKyAgICAgICAgICAgICAgICBvZmZzZXR0ZWRfaW5wdXQxX3ZhbCAqIG9mZnNldHRlZF9pbnB1dDJfdmFsLAorICAgICAgICAgICAgICAgIHBhcmFtcy5vdXRwdXRfbXVsdGlwbGllciwgcGFyYW1zLm91dHB1dF9zaGlmdCk7CisgICAgICAgIGNvbnN0IGludDMyX3QgY2xhbXBlZF9vdXRwdXQgPSBzdGQ6Om1pbigKKyAgICAgICAgICAgIHBhcmFtcy5xdWFudGl6ZWRfYWN0aXZhdGlvbl9tYXgsCisgICAgICAgICAgICBzdGQ6Om1heChwYXJhbXMucXVhbnRpemVkX2FjdGl2YXRpb25fbWluLCB1bmNsYW1wZWRfcmVzdWx0KSk7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50OF90PihjbGFtcGVkX291dHB1dCk7CisgICAgICB9KTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQsCi0gICAgICAgICAgLy8gRm9yIHVucXVhbnRpemVkIG11bCBvbiBzbWFsbCBpbnRlZ2VycywgZXhwbGljdGx5IHNldCB0byB0cnVlLgorICAgICAgICAgIC8vIEZvciB1bnF1YW50aXplZCBtdWwgb24gc21hbGwgaW50ZWdlcnMsIGV4cGxpY2l0bHkgc2V0IHRvIHRydWUuCiAgICAgICAgICAgYm9vbCBlbmFibGVfZm9yX3Nob3J0X2ludGVnZXJzID0gZmFsc2U+CiBpbmxpbmUgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CiAgICAgIWlzX3NtYWxsX2ludGVnZXI8VD46OnZhbHVlIHx8IGVuYWJsZV9mb3Jfc2hvcnRfaW50ZWdlcnMsIHZvaWQ+Ojp0eXBlCi1Ccm9hZGNhc3RNdWw0RFNsb3coY29uc3QgQXJpdGhtZXRpY1BhcmFtcyYgcGFyYW1zLAorQnJvYWRjYXN0TXVsNkRTbG93KGNvbnN0IEFyaXRobWV0aWNQYXJhbXMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICBjb25zdCBSdW50aW1lU2hhcGUmIHVuZXh0ZW5kZWRfaW5wdXQxX3NoYXBlLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IFQqIGlucHV0MV9kYXRhLAogICAgICAgICAgICAgICAgICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgdW5leHRlbmRlZF9pbnB1dDJfc2hhcGUsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgVCogaW5wdXQyX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgUnVudGltZVNoYXBlJiB1bmV4dGVuZGVkX291dHB1dF9zaGFwZSwKICAgICAgICAgICAgICAgICAgICBUKiBvdXRwdXRfZGF0YSkgewotICBUIG91dHB1dF9hY3RpdmF0aW9uX21pbjsKLSAgVCBvdXRwdXRfYWN0aXZhdGlvbl9tYXg7Ci0gIEdldEFjdGl2YXRpb25QYXJhbXMocGFyYW1zLCAmb3V0cHV0X2FjdGl2YXRpb25fbWluLCAmb3V0cHV0X2FjdGl2YXRpb25fbWF4KTsKLQotICBURkxJVEVfRENIRUNLX0xFKHVuZXh0ZW5kZWRfaW5wdXQxX3NoYXBlLkRpbWVuc2lvbnNDb3VudCgpLCA0KTsKLSAgVEZMSVRFX0RDSEVDS19MRSh1bmV4dGVuZGVkX2lucHV0Ml9zaGFwZS5EaW1lbnNpb25zQ291bnQoKSwgNCk7Ci0gIFRGTElURV9EQ0hFQ0tfTEUodW5leHRlbmRlZF9vdXRwdXRfc2hhcGUuRGltZW5zaW9uc0NvdW50KCksIDQpOwotICBjb25zdCBSdW50aW1lU2hhcGUgb3V0cHV0X3NoYXBlID0KLSAgICAgIFJ1bnRpbWVTaGFwZTo6RXh0ZW5kZWRTaGFwZSg0LCB1bmV4dGVuZGVkX291dHB1dF9zaGFwZSk7Ci0KLSAgTmRBcnJheURlc2M8ND4gZGVzYzE7Ci0gIE5kQXJyYXlEZXNjPDQ+IGRlc2MyOworICBURkxJVEVfRENIRUNLX0xFKHVuZXh0ZW5kZWRfaW5wdXQxX3NoYXBlLkRpbWVuc2lvbnNDb3VudCgpLCA2KTsKKyAgVEZMSVRFX0RDSEVDS19MRSh1bmV4dGVuZGVkX2lucHV0Ml9zaGFwZS5EaW1lbnNpb25zQ291bnQoKSwgNik7CisgIFRGTElURV9EQ0hFQ0tfTEUodW5leHRlbmRlZF9vdXRwdXRfc2hhcGUuRGltZW5zaW9uc0NvdW50KCksIDYpOworICBOZEFycmF5RGVzYzxrTWF4TXVsQnJvYWRjYXN0RGltPiBkZXNjMTsKKyAgTmRBcnJheURlc2M8a01heE11bEJyb2FkY2FzdERpbT4gZGVzYzI7CiAgIE5kQXJyYXlEZXNjc0ZvckVsZW1lbnR3aXNlQnJvYWRjYXN0KHVuZXh0ZW5kZWRfaW5wdXQxX3NoYXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmV4dGVuZGVkX2lucHV0Ml9zaGFwZSwgJmRlc2MxLCAmZGVzYzIpOworICBjb25zdCBSdW50aW1lU2hhcGUgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlID0KKyAgICAgIFJ1bnRpbWVTaGFwZTo6RXh0ZW5kZWRTaGFwZShrTWF4TXVsQnJvYWRjYXN0RGltLCB1bmV4dGVuZGVkX291dHB1dF9zaGFwZSk7CisgIC8vIENhY2hlIG91dHB1dCBzaGFwZSBkaW1lbnNpb25zLgorICBpbnQzMl90IGV4dGVuZGVkX291dHB1dF9zaGFwZV9kaW1zW2tNYXhNdWxCcm9hZGNhc3REaW1dOworICBzdGQ6Om1lbWNweShleHRlbmRlZF9vdXRwdXRfc2hhcGVfZGltcywgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXNEYXRhKCksCisgICAgICAgICAgICAgIHNpemVvZihleHRlbmRlZF9vdXRwdXRfc2hhcGVfZGltcykpOwogCiAgIC8vIEluIFRlbnNvcmZsb3csIHRoZSBkaW1lbnNpb25zIGFyZSBjYW5vbmljYWxseSBuYW1lZCAoYmF0Y2hfbnVtYmVyLCByb3csCiAgIC8vIGNvbCwgY2hhbm5lbCksIHdpdGggZXh0ZW50cyAoYmF0Y2hlcywgaGVpZ2h0LCB3aWR0aCwgZGVwdGgpLCB3aXRoIHRoZQotICAvLyB0cmFpbGluZyBkaW1lbnNpb24gY2hhbmdpbmcgbW9zdCByYXBpZGx5IChjaGFubmVscyBoYXMgdGhlIHNtYWxsZXN0IHN0cmlkZSwKLSAgLy8gdHlwaWNhbGx5IDEgZWxlbWVudCkuCisgIC8vIHRyYWlsaW5nIGRpbWVuc2lvbiBjaGFuZ2luZyBtb3N0IHJhcGlkbHkgKGNoYW5uZWxzIGhhcyB0aGUgc21hbGxlc3QKKyAgLy8gc3RyaWRlLCB0eXBpY2FsbHkgMSBlbGVtZW50KS4KICAgLy8KICAgLy8gSW4gZ2VuZXJhdGVkIEMgY29kZSwgd2Ugc3RvcmUgYXJyYXlzIHdpdGggdGhlIGRpbWVuc2lvbnMgcmV2ZXJzZWQuIFRoZQogICAvLyBmaXJzdCBkaW1lbnNpb24gaGFzIHNtYWxsZXN0IHN0cmlkZS4KICAgLy8KICAgLy8gV2UgbmFtZSBvdXIgdmFyaWFibGVzIGJ5IHRoZWlyIFRlbnNvcmZsb3cgY29udmVudGlvbiwgYnV0IGdlbmVyYXRlIEMgY29kZQotICAvLyBuZXN0aW5nIGxvb3BzIHN1Y2ggdGhhdCB0aGUgaW5uZXJtb3N0IGxvb3AgaGFzIHRoZSBzbWFsbGVzdCBzdHJpZGUgZm9yIHRoZQotICAvLyBiZXN0IGNhY2hlIGJlaGF2aW9yLgotICBmb3IgKGludCBiID0gMDsgYiA8IG91dHB1dF9zaGFwZS5EaW1zKDApOyArK2IpIHsKLSAgICBmb3IgKGludCB5ID0gMDsgeSA8IG91dHB1dF9zaGFwZS5EaW1zKDEpOyArK3kpIHsKLSAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgb3V0cHV0X3NoYXBlLkRpbXMoMik7ICsreCkgewotICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IG91dHB1dF9zaGFwZS5EaW1zKDMpOyArK2MpIHsKLSAgICAgICAgICBvdXRwdXRfZGF0YVtPZmZzZXQob3V0cHV0X3NoYXBlLCBiLCB5LCB4LCBjKV0gPQotICAgICAgICAgICAgICBBY3RpdmF0aW9uRnVuY3Rpb25XaXRoTWluTWF4PFQ+KAotICAgICAgICAgICAgICAgICAgaW5wdXQxX2RhdGFbU3Vic2NyaXB0VG9JbmRleChkZXNjMSwgYiwgeSwgeCwgYyldICoKLSAgICAgICAgICAgICAgICAgICAgICBpbnB1dDJfZGF0YVtTdWJzY3JpcHRUb0luZGV4KGRlc2MyLCBiLCB5LCB4LCBjKV0sCi0gICAgICAgICAgICAgICAgICBvdXRwdXRfYWN0aXZhdGlvbl9taW4sIG91dHB1dF9hY3RpdmF0aW9uX21heCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KKyAgLy8gbmVzdGluZyBsb29wcyBzdWNoIHRoYXQgdGhlIGlubmVybW9zdCBsb29wIGhhcyB0aGUgc21hbGxlc3Qgc3RyaWRlIGZvcgorICAvLyB0aGUgYmVzdCBjYWNoZSBiZWhhdmlvci4KKyAgc2l6ZV90IGlucHV0MV9vZmZzZXQgPSAwOworICBzaXplX3QgaW5wdXQyX29mZnNldCA9IDA7CisgIHNpemVfdCBvdXRwdXRfb2Zmc2V0ID0gMDsKKyAgQnJvYWRjYXN0TXVsUmVjdXJzaXZlRGltZW5zaW9ucygKKyAgICAgIHBhcmFtcywgMCwgaW5wdXQxX2RhdGEsIGlucHV0Ml9kYXRhLCBvdXRwdXRfZGF0YSwgJmlucHV0MV9vZmZzZXQsCisgICAgICAmaW5wdXQyX29mZnNldCwgJm91dHB1dF9vZmZzZXQsIGRlc2MxLCBkZXNjMiwgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlX2RpbXMsCisgICAgICBbXShjb25zdCBBcml0aG1ldGljUGFyYW1zJiBwYXJhbXMsIGNvbnN0IFQgaW5wdXQxX3ZhbCwKKyAgICAgICAgIGNvbnN0IFQgaW5wdXQyX3ZhbCkgeworICAgICAgICBUIG91dHB1dF9hY3RpdmF0aW9uX21pbjsKKyAgICAgICAgVCBvdXRwdXRfYWN0aXZhdGlvbl9tYXg7CisgICAgICAgIEdldEFjdGl2YXRpb25QYXJhbXMocGFyYW1zLCAmb3V0cHV0X2FjdGl2YXRpb25fbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXRfYWN0aXZhdGlvbl9tYXgpOworICAgICAgICByZXR1cm4gQWN0aXZhdGlvbkZ1bmN0aW9uV2l0aE1pbk1heDxUPihpbnB1dDFfdmFsICogaW5wdXQyX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2FjdGl2YXRpb25fbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfYWN0aXZhdGlvbl9tYXgpOworICAgICAgfSk7CiB9CiAKLWlubGluZSB2b2lkIEJyb2FkY2FzdE11bDREU2xvdyhjb25zdCBBcml0aG1ldGljUGFyYW1zJiBwYXJhbXMsCitpbmxpbmUgdm9pZCBCcm9hZGNhc3RNdWw2RFNsb3coY29uc3QgQXJpdGhtZXRpY1BhcmFtcyYgcGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgdW5leHRlbmRlZF9pbnB1dDFfc2hhcGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpjb21wbGV4PGZsb2F0PiogaW5wdXQxX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUnVudGltZVNoYXBlJiB1bmV4dGVuZGVkX2lucHV0Ml9zaGFwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+KiBpbnB1dDJfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSdW50aW1lU2hhcGUmIHVuZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y29tcGxleDxmbG9hdD4qIG91dHB1dF9kYXRhKSB7Ci0gIFRGTElURV9EQ0hFQ0tfTEUodW5leHRlbmRlZF9pbnB1dDFfc2hhcGUuRGltZW5zaW9uc0NvdW50KCksIDQpOwotICBURkxJVEVfRENIRUNLX0xFKHVuZXh0ZW5kZWRfaW5wdXQyX3NoYXBlLkRpbWVuc2lvbnNDb3VudCgpLCA0KTsKLSAgVEZMSVRFX0RDSEVDS19MRSh1bmV4dGVuZGVkX291dHB1dF9zaGFwZS5EaW1lbnNpb25zQ291bnQoKSwgNCk7Ci0gIGNvbnN0IFJ1bnRpbWVTaGFwZSBvdXRwdXRfc2hhcGUgPQotICAgICAgUnVudGltZVNoYXBlOjpFeHRlbmRlZFNoYXBlKDQsIHVuZXh0ZW5kZWRfb3V0cHV0X3NoYXBlKTsKKyAgVEZMSVRFX0RDSEVDS19MRSh1bmV4dGVuZGVkX2lucHV0MV9zaGFwZS5EaW1lbnNpb25zQ291bnQoKSwgNik7CisgIFRGTElURV9EQ0hFQ0tfTEUodW5leHRlbmRlZF9pbnB1dDJfc2hhcGUuRGltZW5zaW9uc0NvdW50KCksIDYpOworICBURkxJVEVfRENIRUNLX0xFKHVuZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbWVuc2lvbnNDb3VudCgpLCA2KTsKIAotICBOZEFycmF5RGVzYzw0PiBkZXNjMTsKLSAgTmRBcnJheURlc2M8ND4gZGVzYzI7CisgIE5kQXJyYXlEZXNjPGtNYXhNdWxCcm9hZGNhc3REaW0+IGRlc2MxOworICBOZEFycmF5RGVzYzxrTWF4TXVsQnJvYWRjYXN0RGltPiBkZXNjMjsKICAgTmRBcnJheURlc2NzRm9yRWxlbWVudHdpc2VCcm9hZGNhc3QodW5leHRlbmRlZF9pbnB1dDFfc2hhcGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZXh0ZW5kZWRfaW5wdXQyX3NoYXBlLCAmZGVzYzEsICZkZXNjMik7CisgIGNvbnN0IFJ1bnRpbWVTaGFwZSBleHRlbmRlZF9vdXRwdXRfc2hhcGUgPQorICAgICAgUnVudGltZVNoYXBlOjpFeHRlbmRlZFNoYXBlKGtNYXhNdWxCcm9hZGNhc3REaW0sIHVuZXh0ZW5kZWRfb3V0cHV0X3NoYXBlKTsKKyAgLy8gQ2FjaGUgb3V0cHV0IHNoYXBlIGRpbWVuc2lvbnMuCisgIGludDMyX3QgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlX2RpbXNba01heE11bEJyb2FkY2FzdERpbV07CisgIHN0ZDo6bWVtY3B5KGV4dGVuZGVkX291dHB1dF9zaGFwZV9kaW1zLCBleHRlbmRlZF9vdXRwdXRfc2hhcGUuRGltc0RhdGEoKSwKKyAgICAgICAgICAgICAgc2l6ZW9mKGV4dGVuZGVkX291dHB1dF9zaGFwZV9kaW1zKSk7CiAKLSAgZm9yIChpbnQgYiA9IDA7IGIgPCBvdXRwdXRfc2hhcGUuRGltcygwKTsgKytiKSB7Ci0gICAgZm9yIChpbnQgeSA9IDA7IHkgPCBvdXRwdXRfc2hhcGUuRGltcygxKTsgKyt5KSB7Ci0gICAgICBmb3IgKGludCB4ID0gMDsgeCA8IG91dHB1dF9zaGFwZS5EaW1zKDIpOyArK3gpIHsKLSAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBvdXRwdXRfc2hhcGUuRGltcygzKTsgKytjKSB7Ci0gICAgICAgICAgb3V0cHV0X2RhdGFbT2Zmc2V0KG91dHB1dF9zaGFwZSwgYiwgeSwgeCwgYyldID0KLSAgICAgICAgICAgICAgaW5wdXQxX2RhdGFbU3Vic2NyaXB0VG9JbmRleChkZXNjMSwgYiwgeSwgeCwgYyldICoKLSAgICAgICAgICAgICAgaW5wdXQyX2RhdGFbU3Vic2NyaXB0VG9JbmRleChkZXNjMiwgYiwgeSwgeCwgYyldOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9CisgIHNpemVfdCBpbnB1dDFfb2Zmc2V0ID0gMDsKKyAgc2l6ZV90IGlucHV0Ml9vZmZzZXQgPSAwOworICBzaXplX3Qgb3V0cHV0X29mZnNldCA9IDA7CisgIEJyb2FkY2FzdE11bFJlY3Vyc2l2ZURpbWVuc2lvbnMoCisgICAgICBwYXJhbXMsIDAsIGlucHV0MV9kYXRhLCBpbnB1dDJfZGF0YSwgb3V0cHV0X2RhdGEsICZpbnB1dDFfb2Zmc2V0LAorICAgICAgJmlucHV0Ml9vZmZzZXQsICZvdXRwdXRfb2Zmc2V0LCBkZXNjMSwgZGVzYzIsIGV4dGVuZGVkX291dHB1dF9zaGFwZV9kaW1zLAorICAgICAgW10oY29uc3QgQXJpdGhtZXRpY1BhcmFtcyYgcGFyYW1zLCBjb25zdCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IGlucHV0MV92YWwsCisgICAgICAgICBjb25zdCBzdGQ6OmNvbXBsZXg8ZmxvYXQ+IGlucHV0Ml92YWwpIHsKKyAgICAgICAgcmV0dXJuIGlucHV0MV92YWwgKiBpbnB1dDJfdmFsOworICAgICAgfSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lIHZvaWQgQnJvYWRjYXN0TXVsNERTbG93KAorICAgIGNvbnN0IEFyaXRobWV0aWNQYXJhbXMmIHBhcmFtcywgY29uc3QgUnVudGltZVNoYXBlJiBpbnB1dDFfc2hhcGUsCisgICAgY29uc3QgVCogaW5wdXQxX2RhdGEsIGNvbnN0IFJ1bnRpbWVTaGFwZSYgaW5wdXQyX3NoYXBlLAorICAgIGNvbnN0IFQqIGlucHV0Ml9kYXRhLCBjb25zdCBSdW50aW1lU2hhcGUmIG91dHB1dF9zaGFwZSwgVCogb3V0cHV0X2RhdGEpIHsKKyAgcmV0dXJuIEJyb2FkY2FzdE11bDZEU2xvdyhwYXJhbXMsIGlucHV0MV9zaGFwZSwgaW5wdXQxX2RhdGEsIGlucHV0Ml9zaGFwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDJfZGF0YSwgb3V0cHV0X3NoYXBlLCBvdXRwdXRfZGF0YSk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSByZWZlcmVuY2Vfb3BzCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9yZWZlcmVuY2UvcG9ydGFibGVfdGVuc29yX3V0aWxzLmNjIGIvdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvcmVmZXJlbmNlL3BvcnRhYmxlX3RlbnNvcl91dGlscy5jYwppbmRleCBkMzg2MjAzLi5kNTI5NDYzIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9yZWZlcmVuY2UvcG9ydGFibGVfdGVuc29yX3V0aWxzLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3JlZmVyZW5jZS9wb3J0YWJsZV90ZW5zb3JfdXRpbHMuY2MKQEAgLTM3LDYgKzM3LDcgQEAKIGNvbnN0IGludDMyX3Qga0ludDE2TWluID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQxNl90Pjo6bWluKCk7CiB9ICAvLyBuYW1lc3BhY2UKIAorLy8gTElOVC5JZkNoYW5nZShwb3J0YWJsZV9zeW1tZXRyaWNfcXVhbnRpemVfZmxvYXRzKQogdm9pZCBQb3J0YWJsZVN5bW1ldHJpY1F1YW50aXplRmxvYXRzKGNvbnN0IGZsb2F0KiB2YWx1ZXMsIGNvbnN0IGludCBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCogcXVhbnRpemVkX3ZhbHVlcywgZmxvYXQqIG1pbl92YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogbWF4X3ZhbHVlLCBmbG9hdCogc2NhbGluZ19mYWN0b3IpIHsKQEAgLTY4LDYgKzY5LDcgQEAKICAgICAgICAgc3RkOjptaW4oa1NjYWxlLCBzdGQ6Om1heCgta1NjYWxlLCBxdWFudGl6ZWRfdmFsdWUpKSk7CiAgIH0KIH0KKy8vIExJTlQuVGhlbkNoYW5nZSgvL3RlbnNvcmZsb3cvY29tcGlsZXIvbWxpci9saXRlL3F1YW50aXphdGlvbi9saXRlL3RvY29fbGVnYWN5L3BvcnRhYmxlX3RlbnNvcl91dGlscy5jYzpwb3J0YWJsZV9zeW1tZXRyaWNfcXVhbnRpemVfZmxvYXRzKQogCiB2b2lkIFBvcnRhYmxlQXN5bW1ldHJpY1F1YW50aXplRmxvYXRzKGNvbnN0IGZsb2F0KiB2YWx1ZXMsIGNvbnN0IGludCBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QqIHF1YW50aXplZF92YWx1ZXMsCkBAIC0xNTcsNyArMTU5LDcgQEAKICAgICAgICpyZXN1bHQgKz0gZG90cHJvZCAqIGJhdGNoX3NjYWxpbmdfZmFjdG9yOwogICAgICAgKytyZXN1bHQ7CiAgICAgfSAgLy8gZm9yIHJvdwotICB9ICAgIC8vIGZvciBiYXRjaAorICB9ICAvLyBmb3IgYmF0Y2gKIH0KIAogdm9pZCBQb3J0YWJsZU1hdHJpeEJhdGNoVmVjdG9yTXVsdGlwbHlBY2N1bXVsYXRlKApAQCAtMjAwLDcgKzIwMiw3IEBACiAgICAgICAqcmVzdWx0ICs9IGRvdHByb2QgKiBzY2FsZTsKICAgICAgICsrcmVzdWx0OwogICAgIH0gIC8vIGZvciByb3cKLSAgfSAgICAvLyBmb3IgYmF0Y2gKKyAgfSAgLy8gZm9yIGJhdGNoCiB9CiAKIHZvaWQgUG9ydGFibGVTcGFyc2VNYXRyaXhCYXRjaFZlY3Rvck11bHRpcGx5QWNjdW11bGF0ZTF4NCgKQEAgLTIzMiw3ICsyMzQsOCBAQAogICAgIGNvbnN0IGludDMyX3QqIF9fcmVzdHJpY3RfXyBpbmRpY2VzLCBpbnQgbV9yb3dzLCBpbnQgbV9jb2xzLAogICAgIGNvbnN0IGludDhfdCogX19yZXN0cmljdF9fIHZlY3RvciwgY29uc3QgaW50MzJfdCogX19yZXN0cmljdF9fIGJpYXNfdmVjdG9yLAogICAgIGludCBuX2JhdGNoLCBjb25zdCBpbnQzMl90IGlucHV0X29mZnNldCwgY29uc3QgaW50MzJfdCBvdXRwdXRfbXVsdGlwbGllciwKLSAgICBjb25zdCBpbnQzMl90IG91dHB1dF9zaGlmdCwgY29uc3QgaW50MzJfdCBvdXRwdXRfb2Zmc2V0LAorICAgIGNvbnN0IGludDMyX3Qgb3V0cHV0X3NoaWZ0LCBjb25zdCBpbnQzMl90KiBwZXJfY2hhbm5lbF9zY2FsZSwKKyAgICBjb25zdCBpbnQzMl90KiBwZXJfY2hhbm5lbF9zaGlmdCwgY29uc3QgaW50MzJfdCBvdXRwdXRfb2Zmc2V0LAogICAgIGNvbnN0IGludDMyX3Qgb3V0cHV0X2FjdGl2YXRpb25fbWluLCBjb25zdCBpbnQzMl90IG91dHB1dF9hY3RpdmF0aW9uX21heCwKICAgICBpbnQ4X3QqIF9fcmVzdHJpY3RfXyByZXN1bHQpIHsKICAgY29uc3QgaW50IGtCbG9ja1NpemUgPSAxNjsKQEAgLTI1Miw4ICsyNTUsMTAgQEAKICAgICAgICAgfQogICAgICAgfQogICAgICAgY29uc3QgaW50MzJfdCBiaWFzX3ZhbHVlID0gYmlhc192ZWN0b3IgIT0gbnVsbHB0ciA/IGJpYXNfdmVjdG9yW3Jvd10gOiAwOwotICAgICAgZG90X3Byb2QgPSBNdWx0aXBseUJ5UXVhbnRpemVkTXVsdGlwbGllcihkb3RfcHJvZCArIGJpYXNfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9tdWx0aXBsaWVyLCBvdXRwdXRfc2hpZnQpOworICAgICAgZG90X3Byb2QgPSBNdWx0aXBseUJ5UXVhbnRpemVkTXVsdGlwbGllcigKKyAgICAgICAgICBkb3RfcHJvZCArIGJpYXNfdmFsdWUsCisgICAgICAgICAgcGVyX2NoYW5uZWxfc2NhbGUgPyBwZXJfY2hhbm5lbF9zY2FsZVtyb3ddIDogb3V0cHV0X211bHRpcGxpZXIsCisgICAgICAgICAgcGVyX2NoYW5uZWxfc2hpZnQgPyBwZXJfY2hhbm5lbF9zaGlmdFtyb3ddIDogb3V0cHV0X3NoaWZ0KTsKICAgICAgIGRvdF9wcm9kICs9IG91dHB1dF9vZmZzZXQ7CiAgICAgICByZXN1bHRbYmF0Y2ggKiBtX3Jvd3MgKyByb3ddID0KICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ4X3Q+KEFjdGl2YXRpb25GdW5jdGlvbldpdGhNaW5NYXgoCkBAIC0yOTQsNyArMjk5LDggQEAKIHZvaWQgUG9ydGFibGVTcGFyc2VNYXRyaXhCYXRjaFZlY3Rvck11bHRpcGx5QWNjdW11bGF0ZSgKICAgICBjb25zdCBpbnQ4X3QqIF9fcmVzdHJpY3RfXyBtYXRyaXgsIGNvbnN0IHVpbnQ4X3QqIGxlZGdlciwgY29uc3QgaW50IG1fcm93cywKICAgICBjb25zdCBpbnQgbV9jb2xzLCBjb25zdCBpbnQ4X3QqIF9fcmVzdHJpY3RfXyB2ZWN0b3JzLAotICAgIGNvbnN0IGZsb2F0KiBzY2FsaW5nX2ZhY3RvcnMsIGludCBuX2JhdGNoLCBmbG9hdCogX19yZXN0cmljdF9fIHJlc3VsdCkgeworICAgIGNvbnN0IGZsb2F0KiBzY2FsaW5nX2ZhY3RvcnMsIGludCBuX2JhdGNoLCBmbG9hdCogX19yZXN0cmljdF9fIHJlc3VsdCwKKyAgICBjb25zdCBmbG9hdCogcGVyX2NoYW5uZWxfc2NhbGUpIHsKICAgc3RhdGljIGNvbnN0IGludCBrQmxvY2tTaXplID0gMTY7CiAgIFRGTElURV9EQ0hFQ0tfRVEoICAvLyBOT0xJTlQKICAgICAgIG1fY29scyAlIGtCbG9ja1NpemUsIDApOwpAQCAtMzE4LDEwICszMjQsMTQgQEAKICAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBrQmxvY2tTaXplOyBjKyspIHsKICAgICAgICAgICBkb3Rwcm9kICs9ICgqcm93X3B0cisrKSAqICgqdmVjdG9yX2Jsb2NrX3B0cisrKTsKICAgICAgICAgfSAgLy8gZm9yIGJsb2NrCi0gICAgICB9ICAgIC8vIGZvciBudW1fbm9uemVyb19ibG9ja3MKLSAgICAgIHJlc3VsdFtiYXRjaCAqIG1fcm93cyArIHJvd10gKz0gZG90cHJvZCAqIGJhdGNoX3NjYWxpbmdfZmFjdG9yOworICAgICAgfSAgLy8gZm9yIG51bV9ub256ZXJvX2Jsb2NrcworICAgICAgZmxvYXQgc2NhbGluZ19mYWN0b3IgPSBiYXRjaF9zY2FsaW5nX2ZhY3RvcjsKKyAgICAgIGlmIChwZXJfY2hhbm5lbF9zY2FsZSkgeworICAgICAgICBzY2FsaW5nX2ZhY3RvciAqPSBwZXJfY2hhbm5lbF9zY2FsZVtyb3ddOworICAgICAgfQorICAgICAgcmVzdWx0W2JhdGNoICogbV9yb3dzICsgcm93XSArPSBkb3Rwcm9kICogc2NhbGluZ19mYWN0b3I7CiAgICAgfSAgLy8gZm9yIHJvdwotICB9ICAgIC8vIGZvciBiYXRjaAorICB9ICAvLyBmb3IgYmF0Y2gKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9yZWZlcmVuY2UvcG9ydGFibGVfdGVuc29yX3V0aWxzLmggYi90ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9yZWZlcmVuY2UvcG9ydGFibGVfdGVuc29yX3V0aWxzLmgKaW5kZXggMDQxNmRiMC4uN2M2MjNmNyAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvcmVmZXJlbmNlL3BvcnRhYmxlX3RlbnNvcl91dGlscy5oCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3JlZmVyZW5jZS9wb3J0YWJsZV90ZW5zb3JfdXRpbHMuaApAQCAtMTE2LDIzICsxMTYsMjYgQEAKICAgICBjb25zdCBpbnQzMl90KiBfX3Jlc3RyaWN0X18gaW5kaWNlcywgaW50IG1fcm93cywgaW50IG1fY29scywKICAgICBjb25zdCBpbnQ4X3QqIF9fcmVzdHJpY3RfXyB2ZWN0b3IsIGNvbnN0IGludDMyX3QqIF9fcmVzdHJpY3RfXyBiaWFzX3ZlY3RvciwKICAgICBpbnQgbl9iYXRjaCwgY29uc3QgaW50MzJfdCBpbnB1dF9vZmZzZXQsIGNvbnN0IGludDMyX3Qgb3V0cHV0X211bHRpcGxpZXIsCi0gICAgY29uc3QgaW50MzJfdCBvdXRwdXRfc2hpZnQsIGNvbnN0IGludDMyX3Qgb3V0cHV0X29mZnNldCwKKyAgICBjb25zdCBpbnQzMl90IG91dHB1dF9zaGlmdCwgY29uc3QgaW50MzJfdCogcGVyX2NoYW5uZWxfc2NhbGUsCisgICAgY29uc3QgaW50MzJfdCogcGVyX2NoYW5uZWxfc2hpZnQsIGNvbnN0IGludDMyX3Qgb3V0cHV0X29mZnNldCwKICAgICBjb25zdCBpbnQzMl90IG91dHB1dF9hY3RpdmF0aW9uX21pbiwgY29uc3QgaW50MzJfdCBvdXRwdXRfYWN0aXZhdGlvbl9tYXgsCiAKICAgICBpbnQ4X3QqIF9fcmVzdHJpY3RfXyByZXN1bHQpIHsKICAgUG9ydGFibGVTcGFyc2VNYXRyaXhCYXRjaFZlY3Rvck11bHRpcGx5QWNjdW11bGF0ZTF4MTYoCiAgICAgICBtYXRyaXgsIHNlZ21lbnRzLCBpbmRpY2VzLCBtX3Jvd3MsIG1fY29scywgdmVjdG9yLCBiaWFzX3ZlY3Rvciwgbl9iYXRjaCwKLSAgICAgIGlucHV0X29mZnNldCwgb3V0cHV0X211bHRpcGxpZXIsIG91dHB1dF9zaGlmdCwgb3V0cHV0X29mZnNldCwKLSAgICAgIG91dHB1dF9hY3RpdmF0aW9uX21pbiwgb3V0cHV0X2FjdGl2YXRpb25fbWF4LCByZXN1bHQpOworICAgICAgaW5wdXRfb2Zmc2V0LCBvdXRwdXRfbXVsdGlwbGllciwgb3V0cHV0X3NoaWZ0LCBwZXJfY2hhbm5lbF9zY2FsZSwKKyAgICAgIHBlcl9jaGFubmVsX3NoaWZ0LCBvdXRwdXRfb2Zmc2V0LCBvdXRwdXRfYWN0aXZhdGlvbl9taW4sCisgICAgICBvdXRwdXRfYWN0aXZhdGlvbl9tYXgsIHJlc3VsdCk7CiB9CiAKIHZvaWQgU3BhcnNlTWF0cml4QmF0Y2hWZWN0b3JNdWx0aXBseUFjY3VtdWxhdGUoCiAgICAgY29uc3QgaW50OF90KiBfX3Jlc3RyaWN0X18gbWF0cml4LCBjb25zdCB1aW50OF90KiBsZWRnZXIsIGNvbnN0IGludCBtX3Jvd3MsCiAgICAgY29uc3QgaW50IG1fY29scywgY29uc3QgaW50OF90KiBfX3Jlc3RyaWN0X18gdmVjdG9ycywKLSAgICBjb25zdCBmbG9hdCogc2NhbGluZ19mYWN0b3JzLCBpbnQgbl9iYXRjaCwgZmxvYXQqIF9fcmVzdHJpY3RfXyByZXN1bHQpIHsKKyAgICBjb25zdCBmbG9hdCogc2NhbGluZ19mYWN0b3JzLCBpbnQgbl9iYXRjaCwgZmxvYXQqIF9fcmVzdHJpY3RfXyByZXN1bHQsCisgICAgY29uc3QgZmxvYXQqIHBlcl9jaGFubmVsX3NjYWxlKSB7CiAgIFBvcnRhYmxlU3BhcnNlTWF0cml4QmF0Y2hWZWN0b3JNdWx0aXBseUFjY3VtdWxhdGUoCi0gICAgICBtYXRyaXgsIGxlZGdlciwgbV9yb3dzLCBtX2NvbHMsIHZlY3RvcnMsIHNjYWxpbmdfZmFjdG9ycywgbl9iYXRjaCwKLSAgICAgIHJlc3VsdCk7CisgICAgICBtYXRyaXgsIGxlZGdlciwgbV9yb3dzLCBtX2NvbHMsIHZlY3RvcnMsIHNjYWxpbmdfZmFjdG9ycywgbl9iYXRjaCwgcmVzdWx0LAorICAgICAgcGVyX2NoYW5uZWxfc2NhbGUpOwogfQogCiB2b2lkIE1hdHJpeEJhdGNoVmVjdG9yTXVsdGlwbHlBY2N1bXVsYXRlKApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvcmVmZXJlbmNlL3BvcnRhYmxlX3RlbnNvcl91dGlsc19pbXBsLmggYi90ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9yZWZlcmVuY2UvcG9ydGFibGVfdGVuc29yX3V0aWxzX2ltcGwuaAppbmRleCA2YzQwNGQ1Li41ZTIyOGJiIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9yZWZlcmVuY2UvcG9ydGFibGVfdGVuc29yX3V0aWxzX2ltcGwuaAorKysgYi90ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9yZWZlcmVuY2UvcG9ydGFibGVfdGVuc29yX3V0aWxzX2ltcGwuaApAQCAtNDAsNiArNDAsNyBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAorLy8gTElOVC5JZkNoYW5nZShwb3J0YWJsZV9zeW1tZXRyaWNfcXVhbnRpemVfZmxvYXRzKQogdm9pZCBQb3J0YWJsZVN5bW1ldHJpY1F1YW50aXplRmxvYXRzKGNvbnN0IGZsb2F0KiB2YWx1ZXMsIGNvbnN0IGludCBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCogcXVhbnRpemVkX3ZhbHVlcywgZmxvYXQqIG1pbl92YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogbWF4X3ZhbHVlLCBmbG9hdCogc2NhbGluZ19mYWN0b3IpOwpAQCAtNDcsNiArNDgsNyBAQAogdm9pZCBQb3J0YWJsZVN5bW1ldHJpY1F1YW50aXplRmxvYXRzKGNvbnN0IGZsb2F0KiB2YWx1ZXMsIGNvbnN0IGludCBzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCogcXVhbnRpemVkX3ZhbHVlcywgZmxvYXQgbWluX3ZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IG1heF92YWx1ZSwgZmxvYXQqIHNjYWxpbmdfZmFjdG9yKTsKKy8vIExJTlQuVGhlbkNoYW5nZSgvL3RlbnNvcmZsb3cvY29tcGlsZXIvbWxpci9saXRlL3F1YW50aXphdGlvbi9saXRlL3RvY29fbGVnYWN5L3BvcnRhYmxlX3RlbnNvcl91dGlscy5oOnBvcnRhYmxlX3N5bW1ldHJpY19xdWFudGl6ZV9mbG9hdHMpCiAKIHZvaWQgUG9ydGFibGVBc3ltbWV0cmljUXVhbnRpemVGbG9hdHMoY29uc3QgZmxvYXQqIHZhbHVlcywgY29uc3QgaW50IHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCogcXVhbnRpemVkX3ZhbHVlcywKQEAgLTkyLDE0ICs5NCwxNiBAQAogICAgIGNvbnN0IGludDMyX3QqIF9fcmVzdHJpY3RfXyBpbmRpY2VzLCBpbnQgbV9yb3dzLCBpbnQgbV9jb2xzLAogICAgIGNvbnN0IGludDhfdCogX19yZXN0cmljdF9fIHZlY3RvciwgY29uc3QgaW50MzJfdCogX19yZXN0cmljdF9fIGJpYXNfdmVjdG9yLAogICAgIGludCBuX2JhdGNoLCBjb25zdCBpbnQzMl90IGlucHV0X29mZnNldCwgY29uc3QgaW50MzJfdCBvdXRwdXRfbXVsdGlwbGllciwKLSAgICBjb25zdCBpbnQzMl90IG91dHB1dF9zaGlmdCwgY29uc3QgaW50MzJfdCBvdXRwdXRfb2Zmc2V0LAorICAgIGludDMyX3Qgb3V0cHV0X3NoaWZ0LCBjb25zdCBpbnQzMl90KiBwZXJfY2hhbm5lbF9zY2FsZSwKKyAgICBjb25zdCBpbnQzMl90KiBwZXJfY2hhbm5lbF9zaGlmdCwgaW50MzJfdCBvdXRwdXRfb2Zmc2V0LAogICAgIGNvbnN0IGludDMyX3Qgb3V0cHV0X2FjdGl2YXRpb25fbWluLCBjb25zdCBpbnQzMl90IG91dHB1dF9hY3RpdmF0aW9uX21heCwKICAgICBpbnQ4X3QqIF9fcmVzdHJpY3RfXyByZXN1bHQpOwogCiB2b2lkIFBvcnRhYmxlU3BhcnNlTWF0cml4QmF0Y2hWZWN0b3JNdWx0aXBseUFjY3VtdWxhdGUoCiAgICAgY29uc3QgaW50OF90KiBfX3Jlc3RyaWN0X18gbWF0cml4LCBjb25zdCB1aW50OF90KiBsZWRnZXIsIGNvbnN0IGludCBtX3Jvd3MsCiAgICAgY29uc3QgaW50IG1fY29scywgY29uc3QgaW50OF90KiBfX3Jlc3RyaWN0X18gdmVjdG9ycywKLSAgICBjb25zdCBmbG9hdCogc2NhbGluZ19mYWN0b3JzLCBpbnQgbl9iYXRjaCwgZmxvYXQqIF9fcmVzdHJpY3RfXyByZXN1bHQpOworICAgIGNvbnN0IGZsb2F0KiBzY2FsaW5nX2ZhY3RvcnMsIGludCBuX2JhdGNoLCBmbG9hdCogX19yZXN0cmljdF9fIHJlc3VsdCwKKyAgICBjb25zdCBmbG9hdCogcGVyX2NoYW5uZWxfc2NhbGUpOwogCiAvLyBEb3QgcHJvZHVjdCBvZiB0d28gdmVjdG9ycy4KIGZsb2F0IFBvcnRhYmxlVmVjdG9yVmVjdG9yRG90UHJvZHVjdChjb25zdCBmbG9hdCogdmVjdG9yMSwgY29uc3QgZmxvYXQqIHZlY3RvcjIsCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9yZWZlcmVuY2Uvc29mdG1heC5oIGIvdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvcmVmZXJlbmNlL3NvZnRtYXguaAppbmRleCBjMDlhN2VhLi4yOTMwMjE3IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9yZWZlcmVuY2Uvc29mdG1heC5oCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3JlZmVyZW5jZS9zb2Z0bWF4LmgKQEAgLTExNSw2ICsxMTUsOSBAQAogICAgIEZpeGVkUG9pbnQwIHNoaWZ0ZWRfc2NhbGUgPSBGaXhlZFBvaW50MDo6RnJvbVJhdyhHZXRSZWNpcHJvY2FsKAogICAgICAgICBzdW1fb2ZfZXhwcy5yYXcoKSwga0FjY3VtdWxhdGlvbkludGVnZXJCaXRzLCAmbnVtX2JpdHNfb3Zlcl91bml0KSk7CiAKKyAgICBjb25zdCBpbnQgZXhwb25lbnQgPSBudW1fYml0c19vdmVyX3VuaXQgKyAzMSAtIChzaXplb2YoT3V0cHV0VCkgKiA4KTsKKyAgICBURkxJVEVfQ0hFQ0soMCA8PSBleHBvbmVudCAmJiBleHBvbmVudCA8PSAzMSk7CisKICAgICBmb3IgKGludCBjID0gMDsgYyA8IGRlcHRoOyArK2MpIHsKICAgICAgIGludDMyX3QgaW5wdXRfZGlmZiA9CiAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oaW5wdXRfZGF0YVtpICogZGVwdGggKyBjXSkgLSBtYXhfaW5fcm93OwpAQCAtMTI3LDggKzEzMCw3IEBACiAKICAgICAgICAgRml4ZWRQb2ludDAgZXhwX2luXzAgPSBleHBfb25fbmVnYXRpdmVfdmFsdWVzKHNjYWxlZF9kaWZmX2Y4KTsKICAgICAgICAgaW50MzJfdCB1bnNhdF9vdXRwdXQgPSBnZW1tbG93cDo6Um91bmRpbmdEaXZpZGVCeVBPVCgKLSAgICAgICAgICAgIChzaGlmdGVkX3NjYWxlICogZXhwX2luXzApLnJhdygpLAotICAgICAgICAgICAgbnVtX2JpdHNfb3Zlcl91bml0ICsgMzEgLSAoc2l6ZW9mKE91dHB1dFQpICogOCkpOworICAgICAgICAgICAgKHNoaWZ0ZWRfc2NhbGUgKiBleHBfaW5fMCkucmF3KCksIGV4cG9uZW50KTsKIAogICAgICAgICBjb25zdCBpbnQzMl90IHNoaWZ0ZWRfb3V0cHV0ID0KICAgICAgICAgICAgIHVuc2F0X291dHB1dCArCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9yZWZlcmVuY2Uvc3ViLmggYi90ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9yZWZlcmVuY2Uvc3ViLmgKaW5kZXggZDBlYmM5NS4uMWE3NGFlYiAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvcmVmZXJlbmNlL3N1Yi5oCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3JlZmVyZW5jZS9zdWIuaApAQCAtMTgsNiArMTgsNyBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRkZWY+CiAjaW5jbHVkZSA8bGltaXRzPgogCiAjaW5jbHVkZSAicnV5L3Byb2ZpbGVyL2luc3RydW1lbnRhdGlvbi5oIiAgLy8gZnJvbSBAcnV5CkBAIC0yOSwxOTkgKzMwLDI0NSBAQAogCiBuYW1lc3BhY2UgcmVmZXJlbmNlX29wcyB7CiAKLWlubGluZSB2b2lkIFN1Yk5vbkJyb2FkY2FzdChjb25zdCBBcml0aG1ldGljUGFyYW1zJiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUnVudGltZVNoYXBlJiBpbnB1dDFfc2hhcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGlucHV0MV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgaW5wdXQyX3NoYXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBpbnB1dDJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSdW50aW1lU2hhcGUmIG91dHB1dF9zaGFwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogb3V0cHV0X2RhdGEpIHsKLSAgY29uc3QgaW50IGZsYXRfc2l6ZSA9Ci0gICAgICBNYXRjaGluZ0VsZW1lbnRzU2l6ZShpbnB1dDFfc2hhcGUsIGlucHV0Ml9zaGFwZSwgb3V0cHV0X3NoYXBlKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmbGF0X3NpemU7ICsraSkgewotICAgIG91dHB1dF9kYXRhW2ldID0gQWN0aXZhdGlvbkZ1bmN0aW9uV2l0aE1pbk1heCgKLSAgICAgICAgaW5wdXQxX2RhdGFbaV0gLSBpbnB1dDJfZGF0YVtpXSwgcGFyYW1zLmZsb2F0X2FjdGl2YXRpb25fbWluLAotICAgICAgICBwYXJhbXMuZmxvYXRfYWN0aXZhdGlvbl9tYXgpOwordGVtcGxhdGUgPGNsYXNzIFQ+CitzdHJ1Y3QgU3ViSW1wbCB7CisgIHRlbXBsYXRlIDxjbGFzcyBGPgorICBzdGF0aWMgdm9pZCBCcm9hZGNhc3RJbnB1dDEoY29uc3QgQXJpdGhtZXRpY1BhcmFtcyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVCogaW5wdXQxX2RhdGEsIGNvbnN0IFQqIGlucHV0Ml9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCogb3V0cHV0X2RhdGEsIHNpemVfdCBzaXplLCBGIGJpbmFyeV9mdW5jKSB7CisgICAgZm9yIChzaXplX3QgYyA9IDA7IGMgPCBzaXplOyArK2MpIHsKKyAgICAgIG91dHB1dF9kYXRhW2NdID0gYmluYXJ5X2Z1bmMoaW5wdXQxX2RhdGFbMF0sIGlucHV0Ml9kYXRhW2NdLCBwYXJhbXMpOworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBGPgorICBzdGF0aWMgdm9pZCBCcm9hZGNhc3RJbnB1dDIoY29uc3QgQXJpdGhtZXRpY1BhcmFtcyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVCogaW5wdXQxX2RhdGEsIGNvbnN0IFQqIGlucHV0Ml9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCogb3V0cHV0X2RhdGEsIHNpemVfdCBzaXplLCBGIGJpbmFyeV9mdW5jKSB7CisgICAgZm9yIChzaXplX3QgYyA9IDA7IGMgPCBzaXplOyArK2MpIHsKKyAgICAgIG91dHB1dF9kYXRhW2NdID0gYmluYXJ5X2Z1bmMoaW5wdXQxX2RhdGFbY10sIGlucHV0Ml9kYXRhWzBdLCBwYXJhbXMpOworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBGPgorICBzdGF0aWMgdm9pZCBFbGVtZW50V2lzZShjb25zdCBBcml0aG1ldGljUGFyYW1zJiBwYXJhbXMsIGNvbnN0IFQqIGlucHV0MV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUKiBpbnB1dDJfZGF0YSwgVCogb3V0cHV0X2RhdGEsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGIGJpbmFyeV9mdW5jKSB7CisgICAgZm9yIChzaXplX3QgYyA9IDA7IGMgPCBzaXplOyArK2MpIHsKKyAgICAgIG91dHB1dF9kYXRhW2NdID0gYmluYXJ5X2Z1bmMoaW5wdXQxX2RhdGFbY10sIGlucHV0Ml9kYXRhW2NdLCBwYXJhbXMpOworICAgIH0KKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBTdWJJbXBsPGludDMyX3Q+IHsKKyAgdGVtcGxhdGUgPGNsYXNzIEY+CisgIHN0YXRpYyB2b2lkIEJyb2FkY2FzdElucHV0MShjb25zdCBBcml0aG1ldGljUGFyYW1zJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90KiBpbnB1dDFfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QqIGlucHV0Ml9kYXRhLCBpbnQzMl90KiBvdXRwdXRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLCBGIGJpbmFyeV9mdW5jKSB7CisgICAgc2l6ZV90IGMgPSAwOworICAgIGludDMyX3QgYWN0aXZhdGlvbl9taW4sIGFjdGl2YXRpb25fbWF4OworICAgIEdldEFjdGl2YXRpb25QYXJhbXMocGFyYW1zLCAmYWN0aXZhdGlvbl9taW4sICZhY3RpdmF0aW9uX21heCk7CisjaWZkZWYgVVNFX05FT04KKyAgICBjb25zdCBpbnQzMng0X3Qgdm1heCA9IHZkdXBxX25fczMyKGFjdGl2YXRpb25fbWF4KTsKKyAgICBjb25zdCBpbnQzMng0X3Qgdm1pbiA9IHZkdXBxX25fczMyKGFjdGl2YXRpb25fbWluKTsKKyAgICBjb25zdCBpbnQzMng0X3QgdmEgPSB2ZHVwcV9uX3MzMihpbnB1dDFfZGF0YVswXSk7CisgICAgZm9yICg7IGMgKyA0IDw9IHNpemU7IGMgKz0gNCkgeworICAgICAgY29uc3QgaW50MzJ4NF90IHZiID0gdmxkMXFfczMyKCZpbnB1dDJfZGF0YVtjXSk7CisgICAgICBpbnQzMng0X3QgdnJlcyA9IHZzdWJxX3MzMih2YSwgdmIpOworICAgICAgdnJlcyA9IHZtYXhxX3MzMih2bWluLCB2cmVzKTsKKyAgICAgIHZyZXMgPSB2bWlucV9zMzIodm1heCwgdnJlcyk7CisgICAgICB2c3QxcV9zMzIoJm91dHB1dF9kYXRhW2NdLCB2cmVzKTsKKyAgICB9CisjZW5kaWYKKyAgICBmb3IgKDsgYyA8IHNpemU7ICsrYykgeworICAgICAgb3V0cHV0X2RhdGFbY10gPSBiaW5hcnlfZnVuYyhpbnB1dDFfZGF0YVswXSwgaW5wdXQyX2RhdGFbY10sIHBhcmFtcyk7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIEY+CisgIHN0YXRpYyB2b2lkIEJyb2FkY2FzdElucHV0Mihjb25zdCBBcml0aG1ldGljUGFyYW1zJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90KiBpbnB1dDFfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QqIGlucHV0Ml9kYXRhLCBpbnQzMl90KiBvdXRwdXRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLCBGIGJpbmFyeV9mdW5jKSB7CisgICAgc2l6ZV90IGMgPSAwOworICAgIGludDMyX3QgYWN0aXZhdGlvbl9taW4sIGFjdGl2YXRpb25fbWF4OworICAgIEdldEFjdGl2YXRpb25QYXJhbXMocGFyYW1zLCAmYWN0aXZhdGlvbl9taW4sICZhY3RpdmF0aW9uX21heCk7CisjaWZkZWYgVVNFX05FT04KKyAgICBjb25zdCBpbnQzMng0X3Qgdm1heCA9IHZkdXBxX25fczMyKGFjdGl2YXRpb25fbWF4KTsKKyAgICBjb25zdCBpbnQzMng0X3Qgdm1pbiA9IHZkdXBxX25fczMyKGFjdGl2YXRpb25fbWluKTsKKyAgICBjb25zdCBpbnQzMng0X3QgdmIgPSB2ZHVwcV9uX3MzMihpbnB1dDJfZGF0YVswXSk7CisgICAgZm9yICg7IGMgKyA0IDw9IHNpemU7IGMgKz0gNCkgeworICAgICAgY29uc3QgaW50MzJ4NF90IHZhID0gdmxkMXFfczMyKCZpbnB1dDFfZGF0YVtjXSk7CisgICAgICBpbnQzMng0X3QgdnJlcyA9IHZzdWJxX3MzMih2YSwgdmIpOworICAgICAgdnJlcyA9IHZtYXhxX3MzMih2bWluLCB2cmVzKTsKKyAgICAgIHZyZXMgPSB2bWlucV9zMzIodm1heCwgdnJlcyk7CisgICAgICB2c3QxcV9zMzIoJm91dHB1dF9kYXRhW2NdLCB2cmVzKTsKKyAgICB9CisjZW5kaWYKKyAgICBmb3IgKDsgYyA8IHNpemU7ICsrYykgeworICAgICAgb3V0cHV0X2RhdGFbY10gPSBiaW5hcnlfZnVuYyhpbnB1dDFfZGF0YVtjXSwgaW5wdXQyX2RhdGFbMF0sIHBhcmFtcyk7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIEY+CisgIHN0YXRpYyB2b2lkIEVsZW1lbnRXaXNlKGNvbnN0IEFyaXRobWV0aWNQYXJhbXMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCogaW5wdXQxX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QqIGlucHV0Ml9kYXRhLCBpbnQzMl90KiBvdXRwdXRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsIEYgYmluYXJ5X2Z1bmMpIHsKKyAgICBzaXplX3QgYyA9IDA7CisgICAgaW50MzJfdCBhY3RpdmF0aW9uX21pbiwgYWN0aXZhdGlvbl9tYXg7CisgICAgR2V0QWN0aXZhdGlvblBhcmFtcyhwYXJhbXMsICZhY3RpdmF0aW9uX21pbiwgJmFjdGl2YXRpb25fbWF4KTsKKyNpZmRlZiBVU0VfTkVPTgorICAgIGludDMyeDRfdCB2bWF4ID0gdmR1cHFfbl9zMzIoYWN0aXZhdGlvbl9tYXgpOworICAgIGludDMyeDRfdCB2bWluID0gdmR1cHFfbl9zMzIoYWN0aXZhdGlvbl9taW4pOworICAgIGZvciAoOyBjICsgNCA8PSBzaXplOyBjICs9IDQpIHsKKyAgICAgIGNvbnN0IGludDMyeDRfdCB2YSA9IHZsZDFxX3MzMigmaW5wdXQxX2RhdGFbY10pOworICAgICAgY29uc3QgaW50MzJ4NF90IHZiID0gdmxkMXFfczMyKCZpbnB1dDJfZGF0YVtjXSk7CisgICAgICBpbnQzMng0X3QgdnJlcyA9IHZzdWJxX3MzMih2YSwgdmIpOworICAgICAgdnJlcyA9IHZtYXhxX3MzMih2bWluLCB2cmVzKTsKKyAgICAgIHZyZXMgPSB2bWlucV9zMzIodm1heCwgdnJlcyk7CisgICAgICB2c3QxcV9zMzIoJm91dHB1dF9kYXRhW2NdLCB2cmVzKTsKKyAgICB9CisjZW5kaWYKKyAgICBmb3IgKDsgYyA8IHNpemU7ICsrYykgeworICAgICAgb3V0cHV0X2RhdGFbY10gPSBiaW5hcnlfZnVuYyhpbnB1dDFfZGF0YVtjXSwgaW5wdXQyX2RhdGFbY10sIHBhcmFtcyk7CisgICAgfQorICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRj4KK2lubGluZSB2b2lkIEJyb2FkY2FzdFN1YlJlY3Vyc2l2ZURpbWVuc2lvbnMoCisgICAgaW50IGRpbWVuc2lvbiwgY29uc3QgQXJpdGhtZXRpY1BhcmFtcyYgcGFyYW1zLCBjb25zdCBUKiBpbnB1dDFfZGF0YSwKKyAgICBjb25zdCBUKiBpbnB1dDJfZGF0YSwgVCogb3V0cHV0X2RhdGEsIHNpemVfdCogaW5wdXQxX29mZnNldF9wLAorICAgIHNpemVfdCogaW5wdXQyX29mZnNldF9wLCBzaXplX3QqIG91dHB1dF9vZmZzZXQsCisgICAgc2l6ZV90KiBjb21wcmVzc2VkX2lucHV0MV9zdHJpZGUsIHNpemVfdCogY29tcHJlc3NlZF9pbnB1dDJfc3RyaWRlLAorICAgIHNpemVfdCogY29tcHJlc3NlZF9vdXRwdXRfc2hhcGUsIEYgYmluYXJ5X2Z1bmMpIHsKKyAgaWYgKGRpbWVuc2lvbiA+IDApIHsKKyAgICBmb3IgKHNpemVfdCBjID0gMDsgYyA8IGNvbXByZXNzZWRfb3V0cHV0X3NoYXBlW2RpbWVuc2lvbl07ICsrYykgeworICAgICAgc2l6ZV90IGlucHV0MV9vZmZzZXRfYyA9ICppbnB1dDFfb2Zmc2V0X3A7CisgICAgICBzaXplX3QgaW5wdXQyX29mZnNldF9jID0gKmlucHV0Ml9vZmZzZXRfcDsKKyAgICAgIEJyb2FkY2FzdFN1YlJlY3Vyc2l2ZURpbWVuc2lvbnMoCisgICAgICAgICAgZGltZW5zaW9uIC0gMSwgcGFyYW1zLCBpbnB1dDFfZGF0YSwgaW5wdXQyX2RhdGEsIG91dHB1dF9kYXRhLAorICAgICAgICAgICZpbnB1dDFfb2Zmc2V0X2MsICZpbnB1dDJfb2Zmc2V0X2MsIG91dHB1dF9vZmZzZXQsCisgICAgICAgICAgY29tcHJlc3NlZF9pbnB1dDFfc3RyaWRlLCBjb21wcmVzc2VkX2lucHV0Ml9zdHJpZGUsCisgICAgICAgICAgY29tcHJlc3NlZF9vdXRwdXRfc2hhcGUsIGJpbmFyeV9mdW5jKTsKKyAgICAgICppbnB1dDFfb2Zmc2V0X3AgKz0gY29tcHJlc3NlZF9pbnB1dDFfc3RyaWRlW2RpbWVuc2lvbl07CisgICAgICAqaW5wdXQyX29mZnNldF9wICs9IGNvbXByZXNzZWRfaW5wdXQyX3N0cmlkZVtkaW1lbnNpb25dOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBURkxJVEVfRENIRUNLKGRpbWVuc2lvbiA9PSAwKTsKKyAgICBib29sIGlucHV0MV9pc19icm9hZGNhc3QgPSBjb21wcmVzc2VkX2lucHV0MV9zdHJpZGVbZGltZW5zaW9uXSA9PSAwOworICAgIGJvb2wgaW5wdXQyX2lzX2Jyb2FkY2FzdCA9IGNvbXByZXNzZWRfaW5wdXQyX3N0cmlkZVtkaW1lbnNpb25dID09IDA7CisgICAgVEZMSVRFX0RDSEVDSyghKGlucHV0MV9pc19icm9hZGNhc3QgJiYgaW5wdXQyX2lzX2Jyb2FkY2FzdCkpOworICAgIGNvbnN0IFQqIGlucHV0MV9kYXRhX3B0ciA9IGlucHV0MV9kYXRhICsgKmlucHV0MV9vZmZzZXRfcDsKKyAgICBjb25zdCBUKiBpbnB1dDJfZGF0YV9wdHIgPSBpbnB1dDJfZGF0YSArICppbnB1dDJfb2Zmc2V0X3A7CisgICAgVCogb3V0cHV0X2RhdGFfcHRyID0gb3V0cHV0X2RhdGEgKyAqb3V0cHV0X29mZnNldDsKKyAgICBpZiAoaW5wdXQxX2lzX2Jyb2FkY2FzdCkgeworICAgICAgLy8gaW5wdXQxIGlzIGJyb2FkY2FzdC4KKyAgICAgIFN1YkltcGw8VD46OkJyb2FkY2FzdElucHV0MSgKKyAgICAgICAgICBwYXJhbXMsIGlucHV0MV9kYXRhX3B0ciwgaW5wdXQyX2RhdGFfcHRyLCBvdXRwdXRfZGF0YV9wdHIsCisgICAgICAgICAgY29tcHJlc3NlZF9vdXRwdXRfc2hhcGVbZGltZW5zaW9uXSwgYmluYXJ5X2Z1bmMpOworICAgICAgKmlucHV0Ml9vZmZzZXRfcCArPSBjb21wcmVzc2VkX291dHB1dF9zaGFwZVtkaW1lbnNpb25dOworICAgIH0gZWxzZSBpZiAoaW5wdXQyX2lzX2Jyb2FkY2FzdCkgeworICAgICAgLy8gaW5wdXQyIGlzIGJyb2FkY2FzdC4KKyAgICAgIFN1YkltcGw8VD46OkJyb2FkY2FzdElucHV0MigKKyAgICAgICAgICBwYXJhbXMsIGlucHV0MV9kYXRhX3B0ciwgaW5wdXQyX2RhdGFfcHRyLCBvdXRwdXRfZGF0YV9wdHIsCisgICAgICAgICAgY29tcHJlc3NlZF9vdXRwdXRfc2hhcGVbZGltZW5zaW9uXSwgYmluYXJ5X2Z1bmMpOworICAgICAgKmlucHV0MV9vZmZzZXRfcCArPSBjb21wcmVzc2VkX291dHB1dF9zaGFwZVtkaW1lbnNpb25dOworICAgIH0gZWxzZSB7CisgICAgICAvLyBBZGQgZWxlbWVudC13aXNlLgorICAgICAgU3ViSW1wbDxUPjo6RWxlbWVudFdpc2UocGFyYW1zLCBpbnB1dDFfZGF0YV9wdHIsIGlucHV0Ml9kYXRhX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9kYXRhX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzZWRfb3V0cHV0X3NoYXBlW2RpbWVuc2lvbl0sIGJpbmFyeV9mdW5jKTsKKyAgICAgICppbnB1dDFfb2Zmc2V0X3AgKz0gY29tcHJlc3NlZF9vdXRwdXRfc2hhcGVbZGltZW5zaW9uXTsKKyAgICAgICppbnB1dDJfb2Zmc2V0X3AgKz0gY29tcHJlc3NlZF9vdXRwdXRfc2hhcGVbZGltZW5zaW9uXTsKKyAgICB9CisgICAgKm91dHB1dF9vZmZzZXQgKz0gY29tcHJlc3NlZF9vdXRwdXRfc2hhcGVbZGltZW5zaW9uXTsKICAgfQogfQogCi1pbmxpbmUgdm9pZCBTdWJOb25Ccm9hZGNhc3QoY29uc3QgQXJpdGhtZXRpY1BhcmFtcyYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgaW5wdXQxX3NoYXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QqIGlucHV0MV9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgaW5wdXQyX3NoYXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QqIGlucHV0Ml9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgb3V0cHV0X3NoYXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIG91dHB1dF9kYXRhKSB7Ci0gIGNvbnN0IGludCBmbGF0X3NpemUgPQotICAgICAgTWF0Y2hpbmdFbGVtZW50c1NpemUoaW5wdXQxX3NoYXBlLCBpbnB1dDJfc2hhcGUsIG91dHB1dF9zaGFwZSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmxhdF9zaXplOyArK2kpIHsKLSAgICBvdXRwdXRfZGF0YVtpXSA9IEFjdGl2YXRpb25GdW5jdGlvbldpdGhNaW5NYXgoCi0gICAgICAgIGlucHV0MV9kYXRhW2ldIC0gaW5wdXQyX2RhdGFbaV0sIHBhcmFtcy5xdWFudGl6ZWRfYWN0aXZhdGlvbl9taW4sCi0gICAgICAgIHBhcmFtcy5xdWFudGl6ZWRfYWN0aXZhdGlvbl9tYXgpOworLy8gVE9ETzogYi8yOTY1MTAzODAgLSB3ZSBtYXkgYmUgYWJsZSB0byBmYWN0b3Igb3V0IHRoaXMgdG8gY29tbW9uLmggZm9yIGFsbAorLy8gYmluYXJ5IGFyaXRobWV0aWMgb3BzIChhZGQsIHN1YiwgbXVsKS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBGPgoraW5saW5lIHZvaWQgQnJvYWRjYXN0U3ViQ29tbW9uKGNvbnN0IEFyaXRobWV0aWNQYXJhbXMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSdW50aW1lU2hhcGUmIGlucHV0MV9zaGFwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUKiBpbnB1dDFfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSdW50aW1lU2hhcGUmIGlucHV0Ml9zaGFwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUKiBpbnB1dDJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSdW50aW1lU2hhcGUmIG91dHB1dF9zaGFwZSwgVCogb3V0cHV0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRiBiaW5hcnlfZnVuYykgeworICBjb25zdGV4cHIgaW50IGtNYXhCcm9hZGNhc3REaW0gPSA2OworICBURkxJVEVfRENIRUNLX0xFKGlucHV0MV9zaGFwZS5EaW1lbnNpb25zQ291bnQoKSwga01heEJyb2FkY2FzdERpbSk7CisgIFRGTElURV9EQ0hFQ0tfTEUoaW5wdXQyX3NoYXBlLkRpbWVuc2lvbnNDb3VudCgpLCBrTWF4QnJvYWRjYXN0RGltKTsKKyAgVEZMSVRFX0RDSEVDS19MRShvdXRwdXRfc2hhcGUuRGltZW5zaW9uc0NvdW50KCksIGtNYXhCcm9hZGNhc3REaW0pOworCisgIC8vIEluIFRlbnNvcmZsb3csIHRoZSBkaW1lbnNpb25zIGFyZSBjYW5vbmljYWxseSBuYW1lZCAoYmF0Y2hfbnVtYmVyLCByb3csCisgIC8vIGNvbCwgY2hhbm5lbCksIHdpdGggZXh0ZW50cyAoYmF0Y2hlcywgaGVpZ2h0LCB3aWR0aCwgZGVwdGgpLCB3aXRoIHRoZQorICAvLyB0cmFpbGluZyBkaW1lbnNpb24gY2hhbmdpbmcgbW9zdCByYXBpZGx5IChjaGFubmVscyBoYXMgdGhlIHNtYWxsZXN0IHN0cmlkZSwKKyAgLy8gdHlwaWNhbGx5IDEgZWxlbWVudCkuCisgIC8vCisgIC8vIEluIGdlbmVyYXRlZCBDIGNvZGUsIHdlIHN0b3JlIGFycmF5cyB3aXRoIHRoZSBkaW1lbnNpb25zIHJldmVyc2VkLiBUaGUKKyAgLy8gZmlyc3QgZGltZW5zaW9uIGhhcyBzbWFsbGVzdCBzdHJpZGUuCisgIC8vCisgIC8vIFdlIG5hbWUgb3VyIHZhcmlhYmxlcyBieSB0aGVpciBUZW5zb3JmbG93IGNvbnZlbnRpb24sIGJ1dCBnZW5lcmF0ZSBDIGNvZGUKKyAgLy8gbmVzdGluZyBsb29wcyBzdWNoIHRoYXQgdGhlIGlubmVybW9zdCBsb29wIGhhcyB0aGUgc21hbGxlc3Qgc3RyaWRlIGZvciB0aGUKKyAgLy8gYmVzdCBjYWNoZSBiZWhhdmlvci4KKworICAvLyBJbiBUZW5zb3JmbG93LCB0aGUgZGltZW5zaW9ucyBhcmUgY2Fub25pY2FsbHkgbmFtZWQgKGJhdGNoX251bWJlciwgcm93LAorICAvLyBjb2wsIGNoYW5uZWwpLCB3aXRoIGV4dGVudHMgKGJhdGNoZXMsIGhlaWdodCwgd2lkdGgsIGRlcHRoKSwgd2l0aCB0aGUKKyAgLy8gdHJhaWxpbmcgZGltZW5zaW9uIGNoYW5naW5nIG1vc3QgcmFwaWRseSAoY2hhbm5lbHMgaGFzIHRoZSBzbWFsbGVzdCBzdHJpZGUsCisgIC8vIHR5cGljYWxseSAxIGVsZW1lbnQpLgorICAvLworICAvLyBJbiBnZW5lcmF0ZWQgQyBjb2RlLCB3ZSBzdG9yZSBhcnJheXMgd2l0aCB0aGUgZGltZW5zaW9ucyByZXZlcnNlZC4gVGhlCisgIC8vIGZpcnN0IGRpbWVuc2lvbiBoYXMgc21hbGxlc3Qgc3RyaWRlLgorICAvLworICAvLyBXZSBuYW1lIG91ciB2YXJpYWJsZXMgYnkgdGhlaXIgVGVuc29yZmxvdyBjb252ZW50aW9uLCBidXQgZ2VuZXJhdGUgQyBjb2RlCisgIC8vIG5lc3RpbmcgbG9vcHMgc3VjaCB0aGF0IHRoZSBpbm5lcm1vc3QgbG9vcCBoYXMgdGhlIHNtYWxsZXN0IHN0cmlkZSBmb3IgdGhlCisgIC8vIGJlc3QgY2FjaGUgYmVoYXZpb3IuCisKKyAgc2l6ZV90IGNvbXByZXNzZWRfaW5wdXQxX3N0cmlkZVtrTWF4QnJvYWRjYXN0RGltXTsKKyAgc2l6ZV90IGNvbXByZXNzZWRfaW5wdXQyX3N0cmlkZVtrTWF4QnJvYWRjYXN0RGltXTsKKyAgc2l6ZV90IGNvbXByZXNzZWRfb3V0cHV0X3NoYXBlW2tNYXhCcm9hZGNhc3REaW1dOworICBib29sIGJyb2FkY2FzdGFibGVfc2hhcGUgPSBSZWR1Y2VEaW1lbnNpb25zRm9yQnJvYWRjYXN0PGtNYXhCcm9hZGNhc3REaW0+KAorICAgICAgaW5wdXQxX3NoYXBlLCBpbnB1dDJfc2hhcGUsIGNvbXByZXNzZWRfaW5wdXQxX3N0cmlkZSwKKyAgICAgIGNvbXByZXNzZWRfaW5wdXQyX3N0cmlkZSwgY29tcHJlc3NlZF9vdXRwdXRfc2hhcGUpOworICAvLyBTa2lwIGJyb2FkY2FzdGluZyBmb3IgZGVnZW5lcmF0ZSBzaGFwZXMuCisgIGlmICghYnJvYWRjYXN0YWJsZV9zaGFwZSkgeworICAgIHJldHVybjsKICAgfQorCisgIHNpemVfdCBpbnB1dDFfb2Zmc2V0ID0gMDsKKyAgc2l6ZV90IGlucHV0Ml9vZmZzZXQgPSAwOworICBzaXplX3Qgb3V0cHV0X29mZnNldCA9IDA7CisgIEJyb2FkY2FzdFN1YlJlY3Vyc2l2ZURpbWVuc2lvbnMoCisgICAgICBrTWF4QnJvYWRjYXN0RGltIC0gMSwgcGFyYW1zLCBpbnB1dDFfZGF0YSwgaW5wdXQyX2RhdGEsIG91dHB1dF9kYXRhLAorICAgICAgJmlucHV0MV9vZmZzZXQsICZpbnB1dDJfb2Zmc2V0LCAmb3V0cHV0X29mZnNldCwgY29tcHJlc3NlZF9pbnB1dDFfc3RyaWRlLAorICAgICAgY29tcHJlc3NlZF9pbnB1dDJfc3RyaWRlLCBjb21wcmVzc2VkX291dHB1dF9zaGFwZSwgYmluYXJ5X2Z1bmMpOwogfQogCiAvLyBUT0RPKGIvMTUxMzQ1MzA0KTogV2UgY2FuIGltcGxlbWVudCBCcm9hZGNhc3RTdWIgb24gYnVmZmVycyBvZiBhcmJpdHJhcnkKIC8vIGRpbWVuc2lvbmFsaXR5IGlmIHRoZSBydW50aW1lIGNvZGUgZG9lcyBhIHNpbmdsZSBsb29wIG92ZXIgb25lIGRpbWVuc2lvbgogLy8gdGhhdCBoYW5kbGVzIGJyb2FkY2FzdGluZyBhcyB0aGUgYmFzZSBjYXNlLiBUaGUgY29kZSBnZW5lcmF0b3Igd291bGQgdGhlbgogLy8gZ2VuZXJhdGUgbWF4KEQxLCBEMikgbmVzdGVkIGZvciBsb29wcy4KLXRlbXBsYXRlIDxpbnQgTiA9IDU+Ci1pbmxpbmUgdm9pZCBCcm9hZGNhc3RTdWJTbG93KGNvbnN0IEFyaXRobWV0aWNQYXJhbXMmIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUnVudGltZVNoYXBlJiBpbnB1dDFfc2hhcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBpbnB1dDFfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUnVudGltZVNoYXBlJiBpbnB1dDJfc2hhcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBpbnB1dDJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUnVudGltZVNoYXBlJiBvdXRwdXRfc2hhcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBvdXRwdXRfZGF0YSkgewotICBydXk6OnByb2ZpbGVyOjpTY29wZUxhYmVsIGxhYmVsKCJCcm9hZGNhc3RTdWJTbG93L2Zsb2F0Iik7Ci0gIFRGTElURV9EQ0hFQ0tfTEUoaW5wdXQxX3NoYXBlLkRpbWVuc2lvbnNDb3VudCgpLCBOKTsKLSAgVEZMSVRFX0RDSEVDS19MRShpbnB1dDJfc2hhcGUuRGltZW5zaW9uc0NvdW50KCksIE4pOwotICBURkxJVEVfRENIRUNLX0xFKG91dHB1dF9zaGFwZS5EaW1lbnNpb25zQ291bnQoKSwgTik7Ci0gIE5kQXJyYXlEZXNjPE4+IGRlc2MxOwotICBOZEFycmF5RGVzYzxOPiBkZXNjMjsKLSAgTmRBcnJheURlc2M8Tj4gb3V0cHV0X2Rlc2M7Ci0gIE5kQXJyYXlEZXNjc0ZvckVsZW1lbnR3aXNlQnJvYWRjYXN0KGlucHV0MV9zaGFwZSwgaW5wdXQyX3NoYXBlLCAmZGVzYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjMik7Ci0gIENvcHlEaW1zVG9EZXNjKFJ1bnRpbWVTaGFwZTo6RXh0ZW5kZWRTaGFwZShOLCBvdXRwdXRfc2hhcGUpLCAmb3V0cHV0X2Rlc2MpOwotCi0gIC8vIEluIFRlbnNvcmZsb3csIHRoZSBkaW1lbnNpb25zIGFyZSBjYW5vbmljYWxseSBuYW1lZCAoYmF0Y2hfbnVtYmVyLCByb3csCi0gIC8vIGNvbCwgY2hhbm5lbCksIHdpdGggZXh0ZW50cyAoYmF0Y2hlcywgaGVpZ2h0LCB3aWR0aCwgZGVwdGgpLCB3aXRoIHRoZQotICAvLyB0cmFpbGluZyBkaW1lbnNpb24gY2hhbmdpbmcgbW9zdCByYXBpZGx5IChjaGFubmVscyBoYXMgdGhlIHNtYWxsZXN0IHN0cmlkZSwKLSAgLy8gdHlwaWNhbGx5IDEgZWxlbWVudCkuCi0gIC8vCi0gIC8vIEluIGdlbmVyYXRlZCBDIGNvZGUsIHdlIHN0b3JlIGFycmF5cyB3aXRoIHRoZSBkaW1lbnNpb25zIHJldmVyc2VkLiBUaGUKLSAgLy8gZmlyc3QgZGltZW5zaW9uIGhhcyBzbWFsbGVzdCBzdHJpZGUuCi0gIC8vCi0gIC8vIFdlIG5hbWUgb3VyIHZhcmlhYmxlcyBieSB0aGVpciBUZW5zb3JmbG93IGNvbnZlbnRpb24sIGJ1dCBnZW5lcmF0ZSBDIGNvZGUKLSAgLy8gbmVzdGluZyBsb29wcyBzdWNoIHRoYXQgdGhlIGlubmVybW9zdCBsb29wIGhhcyB0aGUgc21hbGxlc3Qgc3RyaWRlIGZvciB0aGUKLSAgLy8gYmVzdCBjYWNoZSBiZWhhdmlvci4KLSAgYXV0byBzdWJfZnVuYyA9IFsmXShpbnQgaW5kZXhlc1tOXSkgewotICAgIG91dHB1dF9kYXRhW1N1YnNjcmlwdFRvSW5kZXgob3V0cHV0X2Rlc2MsIGluZGV4ZXMpXSA9Ci0gICAgICAgIEFjdGl2YXRpb25GdW5jdGlvbldpdGhNaW5NYXgoCi0gICAgICAgICAgICBpbnB1dDFfZGF0YVtTdWJzY3JpcHRUb0luZGV4KGRlc2MxLCBpbmRleGVzKV0gLQotICAgICAgICAgICAgICAgIGlucHV0Ml9kYXRhW1N1YnNjcmlwdFRvSW5kZXgoZGVzYzIsIGluZGV4ZXMpXSwKLSAgICAgICAgICAgIHBhcmFtcy5mbG9hdF9hY3RpdmF0aW9uX21pbiwgcGFyYW1zLmZsb2F0X2FjdGl2YXRpb25fbWF4KTsKLSAgfTsKLSAgTkRPcHNIZWxwZXI8Tj4ob3V0cHV0X2Rlc2MsIHN1Yl9mdW5jKTsKLX0KLQotdGVtcGxhdGUgPGludCBOID0gNT4KLWlubGluZSB2b2lkIEJyb2FkY2FzdFN1YlNsb3coY29uc3QgQXJpdGhtZXRpY1BhcmFtcyYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSdW50aW1lU2hhcGUmIGlucHV0MV9zaGFwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCogaW5wdXQxX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgaW5wdXQyX3NoYXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90KiBpbnB1dDJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUnVudGltZVNoYXBlJiBvdXRwdXRfc2hhcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIG91dHB1dF9kYXRhKSB7Ci0gIHJ1eTo6cHJvZmlsZXI6OlNjb3BlTGFiZWwgbGFiZWwoIkJyb2FkY2FzdFN1YlNsb3cvaW50MzJfdCIpOwotICBURkxJVEVfRENIRUNLX0xFKGlucHV0MV9zaGFwZS5EaW1lbnNpb25zQ291bnQoKSwgTik7Ci0gIFRGTElURV9EQ0hFQ0tfTEUoaW5wdXQyX3NoYXBlLkRpbWVuc2lvbnNDb3VudCgpLCBOKTsKLSAgVEZMSVRFX0RDSEVDS19MRShvdXRwdXRfc2hhcGUuRGltZW5zaW9uc0NvdW50KCksIE4pOwotICBOZEFycmF5RGVzYzxOPiBkZXNjMTsKLSAgTmRBcnJheURlc2M8Tj4gZGVzYzI7Ci0gIE5kQXJyYXlEZXNjPE4+IG91dHB1dF9kZXNjOwotICBOZEFycmF5RGVzY3NGb3JFbGVtZW50d2lzZUJyb2FkY2FzdChpbnB1dDFfc2hhcGUsIGlucHV0Ml9zaGFwZSwgJmRlc2MxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYzIpOwotICBDb3B5RGltc1RvRGVzYyhSdW50aW1lU2hhcGU6OkV4dGVuZGVkU2hhcGUoTiwgb3V0cHV0X3NoYXBlKSwgJm91dHB1dF9kZXNjKTsKLQotICAvLyBJbiBUZW5zb3JmbG93LCB0aGUgZGltZW5zaW9ucyBhcmUgY2Fub25pY2FsbHkgbmFtZWQgKGJhdGNoX251bWJlciwgcm93LAotICAvLyBjb2wsIGNoYW5uZWwpLCB3aXRoIGV4dGVudHMgKGJhdGNoZXMsIGhlaWdodCwgd2lkdGgsIGRlcHRoKSwgd2l0aCB0aGUKLSAgLy8gdHJhaWxpbmcgZGltZW5zaW9uIGNoYW5naW5nIG1vc3QgcmFwaWRseSAoY2hhbm5lbHMgaGFzIHRoZSBzbWFsbGVzdCBzdHJpZGUsCi0gIC8vIHR5cGljYWxseSAxIGVsZW1lbnQpLgotICAvLwotICAvLyBJbiBnZW5lcmF0ZWQgQyBjb2RlLCB3ZSBzdG9yZSBhcnJheXMgd2l0aCB0aGUgZGltZW5zaW9ucyByZXZlcnNlZC4gVGhlCi0gIC8vIGZpcnN0IGRpbWVuc2lvbiBoYXMgc21hbGxlc3Qgc3RyaWRlLgotICAvLwotICAvLyBXZSBuYW1lIG91ciB2YXJpYWJsZXMgYnkgdGhlaXIgVGVuc29yZmxvdyBjb252ZW50aW9uLCBidXQgZ2VuZXJhdGUgQyBjb2RlCi0gIC8vIG5lc3RpbmcgbG9vcHMgc3VjaCB0aGF0IHRoZSBpbm5lcm1vc3QgbG9vcCBoYXMgdGhlIHNtYWxsZXN0IHN0cmlkZSBmb3IgdGhlCi0gIC8vIGJlc3QgY2FjaGUgYmVoYXZpb3IuCi0gIGF1dG8gc3ViX2Z1bmMgPSBbJl0oaW50IGluZGV4ZXNbTl0pIHsKLSAgICBvdXRwdXRfZGF0YVtTdWJzY3JpcHRUb0luZGV4KG91dHB1dF9kZXNjLCBpbmRleGVzKV0gPQotICAgICAgICBBY3RpdmF0aW9uRnVuY3Rpb25XaXRoTWluTWF4KAotICAgICAgICAgICAgaW5wdXQxX2RhdGFbU3Vic2NyaXB0VG9JbmRleChkZXNjMSwgaW5kZXhlcyldIC0KLSAgICAgICAgICAgICAgICBpbnB1dDJfZGF0YVtTdWJzY3JpcHRUb0luZGV4KGRlc2MyLCBpbmRleGVzKV0sCi0gICAgICAgICAgICBwYXJhbXMucXVhbnRpemVkX2FjdGl2YXRpb25fbWluLCBwYXJhbXMucXVhbnRpemVkX2FjdGl2YXRpb25fbWF4KTsKLSAgfTsKLSAgTkRPcHNIZWxwZXI8Tj4ob3V0cHV0X2Rlc2MsIHN1Yl9mdW5jKTsKLX0KLQotdGVtcGxhdGUgPGludCBOID0gNT4KLXZvaWQgQnJvYWRjYXN0U3ViU2xvdyhjb25zdCBBcml0aG1ldGljUGFyYW1zJiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgUnVudGltZVNoYXBlJiBpbnB1dDFfc2hhcGUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCogaW5wdXQxX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgUnVudGltZVNoYXBlJiBpbnB1dDJfc2hhcGUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCogaW5wdXQyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgUnVudGltZVNoYXBlJiBvdXRwdXRfc2hhcGUsIGludDY0X3QqIG91dHB1dF9kYXRhKSB7Ci0gIHJ1eTo6cHJvZmlsZXI6OlNjb3BlTGFiZWwgbGFiZWwoIkJyb2FkY2FzdFN1YlNsb3cvaW50NjRfdCIpOwotICBURkxJVEVfRENIRUNLX0xFKGlucHV0MV9zaGFwZS5EaW1lbnNpb25zQ291bnQoKSwgTik7Ci0gIFRGTElURV9EQ0hFQ0tfTEUoaW5wdXQyX3NoYXBlLkRpbWVuc2lvbnNDb3VudCgpLCBOKTsKLSAgVEZMSVRFX0RDSEVDS19MRShvdXRwdXRfc2hhcGUuRGltZW5zaW9uc0NvdW50KCksIE4pOwotICBOZEFycmF5RGVzYzxOPiBkZXNjMTsKLSAgTmRBcnJheURlc2M8Tj4gZGVzYzI7Ci0gIE5kQXJyYXlEZXNjPE4+IG91dHB1dF9kZXNjOwotICBOZEFycmF5RGVzY3NGb3JFbGVtZW50d2lzZUJyb2FkY2FzdChpbnB1dDFfc2hhcGUsIGlucHV0Ml9zaGFwZSwgJmRlc2MxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGVzYzIpOwotICBDb3B5RGltc1RvRGVzYyhSdW50aW1lU2hhcGU6OkV4dGVuZGVkU2hhcGUoTiwgb3V0cHV0X3NoYXBlKSwgJm91dHB1dF9kZXNjKTsKLQotICAvLyBJbiBUZW5zb3JmbG93LCB0aGUgZGltZW5zaW9ucyBhcmUgY2Fub25pY2FsbHkgbmFtZWQgKGJhdGNoX251bWJlciwgcm93LAotICAvLyBjb2wsIGNoYW5uZWwpLCB3aXRoIGV4dGVudHMgKGJhdGNoZXMsIGhlaWdodCwgd2lkdGgsIGRlcHRoKSwgd2l0aCB0aGUKLSAgLy8gdHJhaWxpbmcgZGltZW5zaW9uIGNoYW5naW5nIG1vc3QgcmFwaWRseSAoY2hhbm5lbHMgaGFzIHRoZSBzbWFsbGVzdCBzdHJpZGUsCi0gIC8vIHR5cGljYWxseSAxIGVsZW1lbnQpLgotICAvLwotICAvLyBJbiBnZW5lcmF0ZWQgQyBjb2RlLCB3ZSBzdG9yZSBhcnJheXMgd2l0aCB0aGUgZGltZW5zaW9ucyByZXZlcnNlZC4gVGhlCi0gIC8vIGZpcnN0IGRpbWVuc2lvbiBoYXMgc21hbGxlc3Qgc3RyaWRlLgotICAvLwotICAvLyBXZSBuYW1lIG91ciB2YXJpYWJsZXMgYnkgdGhlaXIgVGVuc29yZmxvdyBjb252ZW50aW9uLCBidXQgZ2VuZXJhdGUgQyBjb2RlCi0gIC8vIG5lc3RpbmcgbG9vcHMgc3VjaCB0aGF0IHRoZSBpbm5lcm1vc3QgbG9vcCBoYXMgdGhlIHNtYWxsZXN0IHN0cmlkZSBmb3IgdGhlCi0gIC8vIGJlc3QgY2FjaGUgYmVoYXZpb3IuCi0gIGF1dG8gc3ViX2Z1bmMgPSBbJl0oaW50IGluZGV4ZXNbTl0pIHsKLSAgICBvdXRwdXRfZGF0YVtTdWJzY3JpcHRUb0luZGV4KG91dHB1dF9kZXNjLCBpbmRleGVzKV0gPQotICAgICAgICBBY3RpdmF0aW9uRnVuY3Rpb25XaXRoTWluTWF4KAotICAgICAgICAgICAgaW5wdXQxX2RhdGFbU3Vic2NyaXB0VG9JbmRleChkZXNjMSwgaW5kZXhlcyldIC0KLSAgICAgICAgICAgICAgICBpbnB1dDJfZGF0YVtTdWJzY3JpcHRUb0luZGV4KGRlc2MyLCBpbmRleGVzKV0sCi0gICAgICAgICAgICBwYXJhbXMuaW50NjRfYWN0aXZhdGlvbl9taW4sIHBhcmFtcy5pbnQ2NF9hY3RpdmF0aW9uX21heCk7Ci0gIH07Ci0gIE5ET3BzSGVscGVyPE4+KG91dHB1dF9kZXNjLCBzdWJfZnVuYyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBpbnQgTiA9IDU+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIHZvaWQgQnJvYWRjYXN0U3ViU2xvdyhjb25zdCBBcml0aG1ldGljUGFyYW1zJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUnVudGltZVNoYXBlJiBpbnB1dDFfc2hhcGUsIGNvbnN0IFQqIGlucHV0MV9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgaW5wdXQyX3NoYXBlLCBjb25zdCBUKiBpbnB1dDJfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSdW50aW1lU2hhcGUmIG91dHB1dF9zaGFwZSwgVCogb3V0cHV0X2RhdGEpIHsKLSAgcnV5Ojpwcm9maWxlcjo6U2NvcGVMYWJlbCBsYWJlbCgiQnJvYWRjYXN0U3ViU2xvdy90ZW1wbGF0ZWQiKTsKLSAgVEZMSVRFX0RDSEVDS19MRShpbnB1dDFfc2hhcGUuRGltZW5zaW9uc0NvdW50KCksIE4pOwotICBURkxJVEVfRENIRUNLX0xFKGlucHV0Ml9zaGFwZS5EaW1lbnNpb25zQ291bnQoKSwgTik7Ci0gIFRGTElURV9EQ0hFQ0tfTEUob3V0cHV0X3NoYXBlLkRpbWVuc2lvbnNDb3VudCgpLCBOKTsKLSAgTmRBcnJheURlc2M8Tj4gZGVzYzE7Ci0gIE5kQXJyYXlEZXNjPE4+IGRlc2MyOwotICBOZEFycmF5RGVzYzxOPiBvdXRwdXRfZGVzYzsKLSAgTmRBcnJheURlc2NzRm9yRWxlbWVudHdpc2VCcm9hZGNhc3QoaW5wdXQxX3NoYXBlLCBpbnB1dDJfc2hhcGUsICZkZXNjMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2MyKTsKLSAgQ29weURpbXNUb0Rlc2MoUnVudGltZVNoYXBlOjpFeHRlbmRlZFNoYXBlKE4sIG91dHB1dF9zaGFwZSksICZvdXRwdXRfZGVzYyk7Ci0KLSAgLy8gSW4gVGVuc29yZmxvdywgdGhlIGRpbWVuc2lvbnMgYXJlIGNhbm9uaWNhbGx5IG5hbWVkIChiYXRjaF9udW1iZXIsIHJvdywKLSAgLy8gY29sLCBjaGFubmVsKSwgd2l0aCBleHRlbnRzIChiYXRjaGVzLCBoZWlnaHQsIHdpZHRoLCBkZXB0aCksIHdpdGggdGhlCi0gIC8vIHRyYWlsaW5nIGRpbWVuc2lvbiBjaGFuZ2luZyBtb3N0IHJhcGlkbHkgKGNoYW5uZWxzIGhhcyB0aGUgc21hbGxlc3Qgc3RyaWRlLAotICAvLyB0eXBpY2FsbHkgMSBlbGVtZW50KS4KLSAgLy8KLSAgLy8gSW4gZ2VuZXJhdGVkIEMgY29kZSwgd2Ugc3RvcmUgYXJyYXlzIHdpdGggdGhlIGRpbWVuc2lvbnMgcmV2ZXJzZWQuIFRoZQotICAvLyBmaXJzdCBkaW1lbnNpb24gaGFzIHNtYWxsZXN0IHN0cmlkZS4KLSAgLy8KLSAgLy8gV2UgbmFtZSBvdXIgdmFyaWFibGVzIGJ5IHRoZWlyIFRlbnNvcmZsb3cgY29udmVudGlvbiwgYnV0IGdlbmVyYXRlIEMgY29kZQotICAvLyBuZXN0aW5nIGxvb3BzIHN1Y2ggdGhhdCB0aGUgaW5uZXJtb3N0IGxvb3AgaGFzIHRoZSBzbWFsbGVzdCBzdHJpZGUgZm9yIHRoZQotICAvLyBiZXN0IGNhY2hlIGJlaGF2aW9yLgotICBhdXRvIHN1Yl9mdW5jID0gWyZdKGludCBpbmRleGVzW05dKSB7Ci0gICAgb3V0cHV0X2RhdGFbU3Vic2NyaXB0VG9JbmRleChvdXRwdXRfZGVzYywgaW5kZXhlcyldID0KLSAgICAgICAgQWN0aXZhdGlvbkZ1bmN0aW9uV2l0aE1pbk1heCgKLSAgICAgICAgICAgIGlucHV0MV9kYXRhW1N1YnNjcmlwdFRvSW5kZXgoZGVzYzEsIGluZGV4ZXMpXSAtCi0gICAgICAgICAgICAgICAgaW5wdXQyX2RhdGFbU3Vic2NyaXB0VG9JbmRleChkZXNjMiwgaW5kZXhlcyldLAotICAgICAgICAgICAgcGFyYW1zLnF1YW50aXplZF9hY3RpdmF0aW9uX21pbiwgcGFyYW1zLnF1YW50aXplZF9hY3RpdmF0aW9uX21heCk7Ci0gIH07Ci0gIE5ET3BzSGVscGVyPE4+KG91dHB1dF9kZXNjLCBzdWJfZnVuYyk7CisgIHJ1eTo6cHJvZmlsZXI6OlNjb3BlTGFiZWwgbGFiZWwoIkJyb2FkY2FzdFN1YlNsb3cvVCIpOworICBCcm9hZGNhc3RTdWJDb21tb248VD4oCisgICAgICBwYXJhbXMsIGlucHV0MV9zaGFwZSwgaW5wdXQxX2RhdGEsIGlucHV0Ml9zaGFwZSwgaW5wdXQyX2RhdGEsCisgICAgICBvdXRwdXRfc2hhcGUsIG91dHB1dF9kYXRhLAorICAgICAgW10oVCBpbnB1dDFfdmFsLCBUIGlucHV0Ml92YWwsIGNvbnN0IEFyaXRobWV0aWNQYXJhbXMmIHBhcmFtcykgeworICAgICAgICBUIGFjdGl2YXRpb25fbWluLCBhY3RpdmF0aW9uX21heDsKKyAgICAgICAgR2V0QWN0aXZhdGlvblBhcmFtcyhwYXJhbXMsICZhY3RpdmF0aW9uX21pbiwgJmFjdGl2YXRpb25fbWF4KTsKKyAgICAgICAgcmV0dXJuIEFjdGl2YXRpb25GdW5jdGlvbldpdGhNaW5NYXgoaW5wdXQxX3ZhbCAtIGlucHV0Ml92YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2YXRpb25fbWluLCBhY3RpdmF0aW9uX21heCk7CisgICAgICB9KTsKIH0KIAotdGVtcGxhdGUgPGludCBOID0gNT4KIGlubGluZSB2b2lkIEJyb2FkY2FzdFN1YjE2UE9UU2xvdyhjb25zdCBBcml0aG1ldGljUGFyYW1zJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUnVudGltZVNoYXBlJiBpbnB1dDFfc2hhcGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCogaW5wdXQxX2RhdGEsCkBAIC0yMzAsNDIgKzI3NywyNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgb3V0cHV0X3NoYXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QqIG91dHB1dF9kYXRhKSB7CiAgIHJ1eTo6cHJvZmlsZXI6OlNjb3BlTGFiZWwgbGFiZWwoIkJyb2FkY2FzdFN1YjE2UE9UU2xvdy9pbnQxNl90Iik7Ci0gIE5kQXJyYXlEZXNjPE4+IGRlc2MxOwotICBOZEFycmF5RGVzYzxOPiBkZXNjMjsKLSAgTmRBcnJheURlc2M8Tj4gb3V0cHV0X2Rlc2M7Ci0gIE5kQXJyYXlEZXNjc0ZvckVsZW1lbnR3aXNlQnJvYWRjYXN0KGlucHV0MV9zaGFwZSwgaW5wdXQyX3NoYXBlLCAmZGVzYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjMik7Ci0gIENvcHlEaW1zVG9EZXNjKFJ1bnRpbWVTaGFwZTo6RXh0ZW5kZWRTaGFwZShOLCBvdXRwdXRfc2hhcGUpLCAmb3V0cHV0X2Rlc2MpOwotCi0gIC8vIEluIFRlbnNvcmZsb3csIHRoZSBkaW1lbnNpb25zIGFyZSBjYW5vbmljYWxseSBuYW1lZCAoYmF0Y2hfbnVtYmVyLCByb3csCi0gIC8vIGNvbCwgY2hhbm5lbCksIHdpdGggZXh0ZW50cyAoYmF0Y2hlcywgaGVpZ2h0LCB3aWR0aCwgZGVwdGgpLCB3aXRoIHRoZQotICAvLyB0cmFpbGluZyBkaW1lbnNpb24gY2hhbmdpbmcgbW9zdCByYXBpZGx5IChjaGFubmVscyBoYXMgdGhlIHNtYWxsZXN0IHN0cmlkZSwKLSAgLy8gdHlwaWNhbGx5IDEgZWxlbWVudCkuCi0gIC8vCi0gIC8vIEluIGdlbmVyYXRlZCBDIGNvZGUsIHdlIHN0b3JlIGFycmF5cyB3aXRoIHRoZSBkaW1lbnNpb25zIHJldmVyc2VkLiBUaGUKLSAgLy8gZmlyc3QgZGltZW5zaW9uIGhhcyBzbWFsbGVzdCBzdHJpZGUuCi0gIC8vCi0gIC8vIFdlIG5hbWUgb3VyIHZhcmlhYmxlcyBieSB0aGVpciBUZW5zb3JmbG93IGNvbnZlbnRpb24sIGJ1dCBnZW5lcmF0ZSBDIGNvZGUKLSAgLy8gbmVzdGluZyBsb29wcyBzdWNoIHRoYXQgdGhlIGlubmVybW9zdCBsb29wIGhhcyB0aGUgc21hbGxlc3Qgc3RyaWRlIGZvciB0aGUKLSAgLy8gYmVzdCBjYWNoZSBiZWhhdmlvci4KLSAgYXV0byBzdWJfZnVuYyA9IFsmXShpbnQgaW5kZXhlc1tOXSkgewotICAgIGNvbnN0IGludDMyX3QgaW5wdXQxX3ZhbCA9IGlucHV0MV9kYXRhW1N1YnNjcmlwdFRvSW5kZXgoZGVzYzEsIGluZGV4ZXMpXTsKLSAgICBjb25zdCBpbnQzMl90IGlucHV0Ml92YWwgPSBpbnB1dDJfZGF0YVtTdWJzY3JpcHRUb0luZGV4KGRlc2MyLCBpbmRleGVzKV07Ci0gICAgY29uc3QgaW50MzJfdCBzY2FsZWRfaW5wdXQxX3ZhbCA9Ci0gICAgICAgIGdlbW1sb3dwOjpSb3VuZGluZ0RpdmlkZUJ5UE9UKGlucHV0MV92YWwsIC1wYXJhbXMuaW5wdXQxX3NoaWZ0KTsKLSAgICBjb25zdCBpbnQzMl90IHNjYWxlZF9pbnB1dDJfdmFsID0KLSAgICAgICAgZ2VtbWxvd3A6OlJvdW5kaW5nRGl2aWRlQnlQT1QoaW5wdXQyX3ZhbCwgLXBhcmFtcy5pbnB1dDJfc2hpZnQpOwotICAgIGNvbnN0IGludDMyX3QgcmF3X291dHB1dCA9IHNjYWxlZF9pbnB1dDFfdmFsIC0gc2NhbGVkX2lucHV0Ml92YWw7Ci0gICAgY29uc3QgaW50MzJfdCBjbGFtcGVkX291dHB1dCA9Ci0gICAgICAgIHN0ZDo6bWluKHBhcmFtcy5xdWFudGl6ZWRfYWN0aXZhdGlvbl9tYXgsCi0gICAgICAgICAgICAgICAgIHN0ZDo6bWF4KHBhcmFtcy5xdWFudGl6ZWRfYWN0aXZhdGlvbl9taW4sIHJhd19vdXRwdXQpKTsKLSAgICBvdXRwdXRfZGF0YVtTdWJzY3JpcHRUb0luZGV4KG91dHB1dF9kZXNjLCBpbmRleGVzKV0gPQotICAgICAgICBzdGF0aWNfY2FzdDxpbnQxNl90PihjbGFtcGVkX291dHB1dCk7Ci0gIH07Ci0gIE5ET3BzSGVscGVyPE4+KG91dHB1dF9kZXNjLCBzdWJfZnVuYyk7CisgIEJyb2FkY2FzdFN1YkNvbW1vbjxpbnQxNl90PigKKyAgICAgIHBhcmFtcywgaW5wdXQxX3NoYXBlLCBpbnB1dDFfZGF0YSwgaW5wdXQyX3NoYXBlLCBpbnB1dDJfZGF0YSwKKyAgICAgIG91dHB1dF9zaGFwZSwgb3V0cHV0X2RhdGEsCisgICAgICBbXShpbnQxNl90IGlucHV0MV92YWwsIGludDE2X3QgaW5wdXQyX3ZhbCwKKyAgICAgICAgIGNvbnN0IEFyaXRobWV0aWNQYXJhbXMmIHBhcmFtcykgeworICAgICAgICBjb25zdCBpbnQzMl90IHNjYWxlZF9pbnB1dDFfdmFsID0KKyAgICAgICAgICAgIGdlbW1sb3dwOjpSb3VuZGluZ0RpdmlkZUJ5UE9UKGlucHV0MV92YWwsIC1wYXJhbXMuaW5wdXQxX3NoaWZ0KTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBzY2FsZWRfaW5wdXQyX3ZhbCA9CisgICAgICAgICAgICBnZW1tbG93cDo6Um91bmRpbmdEaXZpZGVCeVBPVChpbnB1dDJfdmFsLCAtcGFyYW1zLmlucHV0Ml9zaGlmdCk7CisgICAgICAgIGNvbnN0IGludDMyX3QgcmF3X291dHB1dCA9IHNjYWxlZF9pbnB1dDFfdmFsIC0gc2NhbGVkX2lucHV0Ml92YWw7CisgICAgICAgIGNvbnN0IGludDMyX3QgY2xhbXBlZF9vdXRwdXQgPQorICAgICAgICAgICAgc3RkOjptaW4ocGFyYW1zLnF1YW50aXplZF9hY3RpdmF0aW9uX21heCwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWF4KHBhcmFtcy5xdWFudGl6ZWRfYWN0aXZhdGlvbl9taW4sIHJhd19vdXRwdXQpKTsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDE2X3Q+KGNsYW1wZWRfb3V0cHV0KTsKKyAgICAgIH0pOwogfQogCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgaW50IE4gPSA1PgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiB2b2lkIEJyb2FkY2FzdFF1YW50U3ViU2xvdyhjb25zdCBBcml0aG1ldGljUGFyYW1zJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSdW50aW1lU2hhcGUmIGlucHV0MV9zaGFwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQqIGlucHV0MV9kYXRhLApAQCAtMjczLDUyICszMDIsMzIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQqIGlucHV0Ml9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUnVudGltZVNoYXBlJiBvdXRwdXRfc2hhcGUsIFQqIG91dHB1dF9kYXRhKSB7CiAgIHJ1eTo6cHJvZmlsZXI6OlNjb3BlTGFiZWwgbGFiZWwoIkJyb2FkY2FzdFF1YW50U3ViU2xvdy9UIik7Ci0gIFRGTElURV9EQ0hFQ0tfTEUoaW5wdXQxX3NoYXBlLkRpbWVuc2lvbnNDb3VudCgpLCBOKTsKLSAgVEZMSVRFX0RDSEVDS19MRShpbnB1dDJfc2hhcGUuRGltZW5zaW9uc0NvdW50KCksIE4pOwotICBURkxJVEVfRENIRUNLX0xFKG91dHB1dF9zaGFwZS5EaW1lbnNpb25zQ291bnQoKSwgTik7Ci0gIE5kQXJyYXlEZXNjPE4+IGRlc2MxOwotICBOZEFycmF5RGVzYzxOPiBkZXNjMjsKLSAgTmRBcnJheURlc2M8Tj4gb3V0cHV0X2Rlc2M7Ci0gIE5kQXJyYXlEZXNjc0ZvckVsZW1lbnR3aXNlQnJvYWRjYXN0KGlucHV0MV9zaGFwZSwgaW5wdXQyX3NoYXBlLCAmZGVzYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjMik7Ci0gIENvcHlEaW1zVG9EZXNjKFJ1bnRpbWVTaGFwZTo6RXh0ZW5kZWRTaGFwZShOLCBvdXRwdXRfc2hhcGUpLCAmb3V0cHV0X2Rlc2MpOwotCi0gIC8vIEluIFRlbnNvcmZsb3csIHRoZSBkaW1lbnNpb25zIGFyZSBjYW5vbmljYWxseSBuYW1lZCAoYmF0Y2hfbnVtYmVyLCByb3csCi0gIC8vIGNvbCwgY2hhbm5lbCksIHdpdGggZXh0ZW50cyAoYmF0Y2hlcywgaGVpZ2h0LCB3aWR0aCwgZGVwdGgpLCB3aXRoIHRoZQotICAvLyB0cmFpbGluZyBkaW1lbnNpb24gY2hhbmdpbmcgbW9zdCByYXBpZGx5IChjaGFubmVscyBoYXMgdGhlIHNtYWxsZXN0IHN0cmlkZSwKLSAgLy8gdHlwaWNhbGx5IDEgZWxlbWVudCkuCi0gIC8vCi0gIC8vIEluIGdlbmVyYXRlZCBDIGNvZGUsIHdlIHN0b3JlIGFycmF5cyB3aXRoIHRoZSBkaW1lbnNpb25zIHJldmVyc2VkLiBUaGUKLSAgLy8gZmlyc3QgZGltZW5zaW9uIGhhcyBzbWFsbGVzdCBzdHJpZGUuCi0gIC8vCi0gIC8vIFdlIG5hbWUgb3VyIHZhcmlhYmxlcyBieSB0aGVpciBUZW5zb3JmbG93IGNvbnZlbnRpb24sIGJ1dCBnZW5lcmF0ZSBDIGNvZGUKLSAgLy8gbmVzdGluZyBsb29wcyBzdWNoIHRoYXQgdGhlIGlubmVybW9zdCBsb29wIGhhcyB0aGUgc21hbGxlc3Qgc3RyaWRlIGZvciB0aGUKLSAgLy8gYmVzdCBjYWNoZSBiZWhhdmlvci4KLSAgYXV0byBzdWJfZnVuYyA9IFsmXShpbnQgaW5kZXhlc1tOXSkgewotICAgIGNvbnN0IGludDMyX3QgaW5wdXQxX3ZhbCA9Ci0gICAgICAgIHBhcmFtcy5pbnB1dDFfb2Zmc2V0ICsgaW5wdXQxX2RhdGFbU3Vic2NyaXB0VG9JbmRleChkZXNjMSwgaW5kZXhlcyldOwotICAgIGNvbnN0IGludDMyX3QgaW5wdXQyX3ZhbCA9Ci0gICAgICAgIHBhcmFtcy5pbnB1dDJfb2Zmc2V0ICsgaW5wdXQyX2RhdGFbU3Vic2NyaXB0VG9JbmRleChkZXNjMiwgaW5kZXhlcyldOwotICAgIGNvbnN0IGludDMyX3Qgc2hpZnRlZF9pbnB1dDFfdmFsID0gaW5wdXQxX3ZhbCAqICgxIDw8IHBhcmFtcy5sZWZ0X3NoaWZ0KTsKLSAgICBjb25zdCBpbnQzMl90IHNoaWZ0ZWRfaW5wdXQyX3ZhbCA9IGlucHV0Ml92YWwgKiAoMSA8PCBwYXJhbXMubGVmdF9zaGlmdCk7Ci0gICAgY29uc3QgaW50MzJfdCBzY2FsZWRfaW5wdXQxX3ZhbCA9Ci0gICAgICAgIE11bHRpcGx5QnlRdWFudGl6ZWRNdWx0aXBsaWVyU21hbGxlclRoYW5PbmVFeHAoCi0gICAgICAgICAgICBzaGlmdGVkX2lucHV0MV92YWwsIHBhcmFtcy5pbnB1dDFfbXVsdGlwbGllciwgcGFyYW1zLmlucHV0MV9zaGlmdCk7Ci0gICAgY29uc3QgaW50MzJfdCBzY2FsZWRfaW5wdXQyX3ZhbCA9Ci0gICAgICAgIE11bHRpcGx5QnlRdWFudGl6ZWRNdWx0aXBsaWVyU21hbGxlclRoYW5PbmVFeHAoCi0gICAgICAgICAgICBzaGlmdGVkX2lucHV0Ml92YWwsIHBhcmFtcy5pbnB1dDJfbXVsdGlwbGllciwgcGFyYW1zLmlucHV0Ml9zaGlmdCk7Ci0gICAgY29uc3QgaW50MzJfdCByYXdfc3ViID0gc2NhbGVkX2lucHV0MV92YWwgLSBzY2FsZWRfaW5wdXQyX3ZhbDsKLSAgICBjb25zdCBpbnQzMl90IHJhd19vdXRwdXQgPQotICAgICAgICBNdWx0aXBseUJ5UXVhbnRpemVkTXVsdGlwbGllclNtYWxsZXJUaGFuT25lRXhwKAotICAgICAgICAgICAgcmF3X3N1YiwgcGFyYW1zLm91dHB1dF9tdWx0aXBsaWVyLCBwYXJhbXMub3V0cHV0X3NoaWZ0KSArCi0gICAgICAgIHBhcmFtcy5vdXRwdXRfb2Zmc2V0OwotICAgIGNvbnN0IGludDMyX3QgY2xhbXBlZF9vdXRwdXQgPQotICAgICAgICBzdGQ6Om1pbihwYXJhbXMucXVhbnRpemVkX2FjdGl2YXRpb25fbWF4LAotICAgICAgICAgICAgICAgICBzdGQ6Om1heChwYXJhbXMucXVhbnRpemVkX2FjdGl2YXRpb25fbWluLCByYXdfb3V0cHV0KSk7Ci0gICAgb3V0cHV0X2RhdGFbU3Vic2NyaXB0VG9JbmRleChvdXRwdXRfZGVzYywgaW5kZXhlcyldID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8VD4oY2xhbXBlZF9vdXRwdXQpOwotICB9OwotICBORE9wc0hlbHBlcjxOPihvdXRwdXRfZGVzYywgc3ViX2Z1bmMpOworICBCcm9hZGNhc3RTdWJDb21tb248VD4oCisgICAgICBwYXJhbXMsIGlucHV0MV9zaGFwZSwgaW5wdXQxX2RhdGEsIGlucHV0Ml9zaGFwZSwgaW5wdXQyX2RhdGEsCisgICAgICBvdXRwdXRfc2hhcGUsIG91dHB1dF9kYXRhLAorICAgICAgW10oVCBpbnB1dDFfdmFsLCBUIGlucHV0Ml92YWwsIGNvbnN0IEFyaXRobWV0aWNQYXJhbXMmIHBhcmFtcykgeworICAgICAgICBjb25zdCBpbnQzMl90IHNoaWZ0ZWRfaW5wdXQxX3ZhbCA9CisgICAgICAgICAgICAocGFyYW1zLmlucHV0MV9vZmZzZXQgKyBpbnB1dDFfdmFsKSAqICgxIDw8IHBhcmFtcy5sZWZ0X3NoaWZ0KTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBzaGlmdGVkX2lucHV0Ml92YWwgPQorICAgICAgICAgICAgKHBhcmFtcy5pbnB1dDJfb2Zmc2V0ICsgaW5wdXQyX3ZhbCkgKiAoMSA8PCBwYXJhbXMubGVmdF9zaGlmdCk7CisgICAgICAgIGNvbnN0IGludDMyX3Qgc2NhbGVkX2lucHV0MV92YWwgPQorICAgICAgICAgICAgTXVsdGlwbHlCeVF1YW50aXplZE11bHRpcGxpZXJTbWFsbGVyVGhhbk9uZUV4cCgKKyAgICAgICAgICAgICAgICBzaGlmdGVkX2lucHV0MV92YWwsIHBhcmFtcy5pbnB1dDFfbXVsdGlwbGllciwKKyAgICAgICAgICAgICAgICBwYXJhbXMuaW5wdXQxX3NoaWZ0KTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBzY2FsZWRfaW5wdXQyX3ZhbCA9CisgICAgICAgICAgICBNdWx0aXBseUJ5UXVhbnRpemVkTXVsdGlwbGllclNtYWxsZXJUaGFuT25lRXhwKAorICAgICAgICAgICAgICAgIHNoaWZ0ZWRfaW5wdXQyX3ZhbCwgcGFyYW1zLmlucHV0Ml9tdWx0aXBsaWVyLAorICAgICAgICAgICAgICAgIHBhcmFtcy5pbnB1dDJfc2hpZnQpOworICAgICAgICBjb25zdCBpbnQzMl90IHJhd19zdWIgPSBzY2FsZWRfaW5wdXQxX3ZhbCAtIHNjYWxlZF9pbnB1dDJfdmFsOworICAgICAgICBjb25zdCBpbnQzMl90IHJhd19vdXRwdXQgPQorICAgICAgICAgICAgTXVsdGlwbHlCeVF1YW50aXplZE11bHRpcGxpZXJTbWFsbGVyVGhhbk9uZUV4cCgKKyAgICAgICAgICAgICAgICByYXdfc3ViLCBwYXJhbXMub3V0cHV0X211bHRpcGxpZXIsIHBhcmFtcy5vdXRwdXRfc2hpZnQpICsKKyAgICAgICAgICAgIHBhcmFtcy5vdXRwdXRfb2Zmc2V0OworICAgICAgICBjb25zdCBpbnQzMl90IGNsYW1wZWRfb3V0cHV0ID0KKyAgICAgICAgICAgIHN0ZDo6bWluKHBhcmFtcy5xdWFudGl6ZWRfYWN0aXZhdGlvbl9tYXgsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1heChwYXJhbXMucXVhbnRpemVkX2FjdGl2YXRpb25fbWluLCByYXdfb3V0cHV0KSk7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxUPihjbGFtcGVkX291dHB1dCk7CisgICAgICB9KTsKIH0KIAogLy8gRWxlbWVudC13aXNlIGFkZCB0aGF0IGNhbiBvZnRlbiBiZSB1c2VkIGZvciBpbm5lciBsb29wIG9mIGJyb2FkY2FzdCBhZGQgYXMKQEAgLTQwNSwzNSArNDE0LDEyIEBACiAgICAgICAgICBjb25zdCBUKiBpbnB1dDFfZGF0YSwgY29uc3QgUnVudGltZVNoYXBlJiBpbnB1dDJfc2hhcGUsCiAgICAgICAgICBjb25zdCBUKiBpbnB1dDJfZGF0YSwgY29uc3QgUnVudGltZVNoYXBlJiBvdXRwdXRfc2hhcGUsCiAgICAgICAgICBUKiBvdXRwdXRfZGF0YSkgewotICBOZEFycmF5RGVzYzw0PiBkZXNjMTsKLSAgTmRBcnJheURlc2M8ND4gZGVzYzI7Ci0gIE5kQXJyYXlEZXNjc0ZvckVsZW1lbnR3aXNlQnJvYWRjYXN0KGlucHV0MV9zaGFwZSwgaW5wdXQyX3NoYXBlLCAmZGVzYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXNjMik7Ci0gIGNvbnN0IFJ1bnRpbWVTaGFwZSBleHRlbmRlZF9vdXRwdXRfc2hhcGUgPQotICAgICAgUnVudGltZVNoYXBlOjpFeHRlbmRlZFNoYXBlKDQsIG91dHB1dF9zaGFwZSk7Ci0KLSAgLy8gSW4gVGVuc29yZmxvdywgdGhlIGRpbWVuc2lvbnMgYXJlIGNhbm9uaWNhbGx5IG5hbWVkIChiYXRjaF9udW1iZXIsIHJvdywKLSAgLy8gY29sLCBjaGFubmVsKSwgd2l0aCBleHRlbnRzIChiYXRjaGVzLCBoZWlnaHQsIHdpZHRoLCBkZXB0aCksIHdpdGggdGhlCi0gIC8vIHRyYWlsaW5nIGRpbWVuc2lvbiBjaGFuZ2luZyBtb3N0IHJhcGlkbHkgKGNoYW5uZWxzIGhhcyB0aGUgc21hbGxlc3Qgc3RyaWRlLAotICAvLyB0eXBpY2FsbHkgMSBlbGVtZW50KS4KLSAgLy8KLSAgLy8gSW4gZ2VuZXJhdGVkIEMgY29kZSwgd2Ugc3RvcmUgYXJyYXlzIHdpdGggdGhlIGRpbWVuc2lvbnMgcmV2ZXJzZWQuIFRoZQotICAvLyBmaXJzdCBkaW1lbnNpb24gaGFzIHNtYWxsZXN0IHN0cmlkZS4KLSAgLy8KLSAgLy8gV2UgbmFtZSBvdXIgdmFyaWFibGVzIGJ5IHRoZWlyIFRlbnNvcmZsb3cgY29udmVudGlvbiwgYnV0IGdlbmVyYXRlIEMgY29kZQotICAvLyBuZXN0aW5nIGxvb3BzIHN1Y2ggdGhhdCB0aGUgaW5uZXJtb3N0IGxvb3AgaGFzIHRoZSBzbWFsbGVzdCBzdHJpZGUgZm9yIHRoZQotICAvLyBiZXN0IGNhY2hlIGJlaGF2aW9yLgotICBmb3IgKGludCBiID0gMDsgYiA8IGV4dGVuZGVkX291dHB1dF9zaGFwZS5EaW1zKDApOyArK2IpIHsKLSAgICBmb3IgKGludCB5ID0gMDsgeSA8IGV4dGVuZGVkX291dHB1dF9zaGFwZS5EaW1zKDEpOyArK3kpIHsKLSAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLkRpbXMoMik7ICsreCkgewotICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IGV4dGVuZGVkX291dHB1dF9zaGFwZS5EaW1zKDMpOyArK2MpIHsKLSAgICAgICAgICBvdXRwdXRfZGF0YVtPZmZzZXQoZXh0ZW5kZWRfb3V0cHV0X3NoYXBlLCBiLCB5LCB4LCBjKV0gPQotICAgICAgICAgICAgICBpbnB1dDFfZGF0YVtTdWJzY3JpcHRUb0luZGV4KGRlc2MxLCBiLCB5LCB4LCBjKV0gLQotICAgICAgICAgICAgICBpbnB1dDJfZGF0YVtTdWJzY3JpcHRUb0luZGV4KGRlc2MyLCBiLCB5LCB4LCBjKV07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KKyAgQnJvYWRjYXN0U3ViQ29tbW9uPFQ+KAorICAgICAgcGFyYW1zLCBpbnB1dDFfc2hhcGUsIGlucHV0MV9kYXRhLCBpbnB1dDJfc2hhcGUsIGlucHV0Ml9kYXRhLAorICAgICAgb3V0cHV0X3NoYXBlLCBvdXRwdXRfZGF0YSwKKyAgICAgIFtdKFQgaW5wdXQxX3ZhbCwgVCBpbnB1dDJfdmFsLCBjb25zdCBBcml0aG1ldGljUGFyYW1zJiBwYXJhbXMpIHsKKyAgICAgICAgcmV0dXJuIGlucHV0MV92YWwgLSBpbnB1dDJfdmFsOworICAgICAgfSk7CiB9CiAKIGlubGluZSB2b2lkIFNldEFjdGl2YXRpb25NaW5NYXgoY29uc3QgQXJpdGhtZXRpY1BhcmFtcyYgcGFyYW1zLApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvcmVmZXJlbmNlL3RyYW5zcG9zZV9jb252LmggYi90ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9yZWZlcmVuY2UvdHJhbnNwb3NlX2NvbnYuaAppbmRleCA4YTUxZTBmLi43NDRlZDBmIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9yZWZlcmVuY2UvdHJhbnNwb3NlX2NvbnYuaAorKysgYi90ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9yZWZlcmVuY2UvdHJhbnNwb3NlX2NvbnYuaApAQCAtMjE5LDYgKzIxOSwxMDMgQEAKICAgfQogfQogCitpbmxpbmUgdm9pZCBIeWJyaWRUcmFuc3Bvc2VDb252KAorICAgIGNvbnN0IENvbnZQYXJhbXMmIHBhcmFtcywgZmxvYXQqIHNjYWxpbmdfZmFjdG9yc19wdHIsCisgICAgY29uc3QgUnVudGltZVNoYXBlJiBpbnB1dF9zaGFwZSwgY29uc3QgaW50OF90KiBpbnB1dF9kYXRhLAorICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgZmlsdGVyX3NoYXBlLCBjb25zdCBpbnQ4X3QqIGZpbHRlcl9kYXRhLAorICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgYmlhc19zaGFwZSwgY29uc3QgZmxvYXQqIGJpYXNfZGF0YSwKKyAgICBjb25zdCBSdW50aW1lU2hhcGUmIG91dHB1dF9zaGFwZSwgZmxvYXQqIG91dHB1dF9kYXRhLAorICAgIGNvbnN0IGZsb2F0KiBwZXJfY2hhbm5lbF9zY2FsZSwgaW50MzJfdCogaW5wdXRfb2Zmc2V0KSB7CisgIGNvbnN0IGludCBzdHJpZGVfd2lkdGggPSBwYXJhbXMuc3RyaWRlX3dpZHRoOworICBjb25zdCBpbnQgc3RyaWRlX2hlaWdodCA9IHBhcmFtcy5zdHJpZGVfaGVpZ2h0OworICBjb25zdCBpbnQgcGFkX3dpZHRoID0gcGFyYW1zLnBhZGRpbmdfdmFsdWVzLndpZHRoOworICBjb25zdCBpbnQgcGFkX2hlaWdodCA9IHBhcmFtcy5wYWRkaW5nX3ZhbHVlcy5oZWlnaHQ7CisgIFRGTElURV9EQ0hFQ0tfRVEoaW5wdXRfc2hhcGUuRGltZW5zaW9uc0NvdW50KCksIDQpOworICBURkxJVEVfRENIRUNLX0VRKGZpbHRlcl9zaGFwZS5EaW1lbnNpb25zQ291bnQoKSwgNCk7CisgIFRGTElURV9EQ0hFQ0tfRVEob3V0cHV0X3NoYXBlLkRpbWVuc2lvbnNDb3VudCgpLCA0KTsKKworICBjb25zdCBpbnQgYmF0Y2hlcyA9IE1hdGNoaW5nRGltKGlucHV0X3NoYXBlLCAwLCBvdXRwdXRfc2hhcGUsIDApOworICBjb25zdCBpbnQgaW5wdXRfZGVwdGggPSBNYXRjaGluZ0RpbShpbnB1dF9zaGFwZSwgMywgZmlsdGVyX3NoYXBlLCAzKTsKKyAgY29uc3QgaW50IG91dHB1dF9kZXB0aCA9IE1hdGNoaW5nRGltKGZpbHRlcl9zaGFwZSwgMCwgb3V0cHV0X3NoYXBlLCAzKTsKKyAgY29uc3QgaW50IGlucHV0X2hlaWdodCA9IGlucHV0X3NoYXBlLkRpbXMoMSk7CisgIGNvbnN0IGludCBpbnB1dF93aWR0aCA9IGlucHV0X3NoYXBlLkRpbXMoMik7CisgIGNvbnN0IGludCBmaWx0ZXJfaGVpZ2h0ID0gZmlsdGVyX3NoYXBlLkRpbXMoMSk7CisgIGNvbnN0IGludCBmaWx0ZXJfd2lkdGggPSBmaWx0ZXJfc2hhcGUuRGltcygyKTsKKyAgY29uc3QgaW50IG91dHB1dF9oZWlnaHQgPSBvdXRwdXRfc2hhcGUuRGltcygxKTsKKyAgY29uc3QgaW50IG91dHB1dF93aWR0aCA9IG91dHB1dF9zaGFwZS5EaW1zKDIpOworICBjb25zdCBmbG9hdCBvdXRwdXRfYWN0aXZhdGlvbl9taW4gPSBwYXJhbXMuZmxvYXRfYWN0aXZhdGlvbl9taW47CisgIGNvbnN0IGZsb2F0IG91dHB1dF9hY3RpdmF0aW9uX21heCA9IHBhcmFtcy5mbG9hdF9hY3RpdmF0aW9uX21heDsKKyAgaWYgKGJpYXNfZGF0YSkgeworICAgIFRGTElURV9EQ0hFQ0tfRVEoYmlhc19zaGFwZS5GbGF0U2l6ZSgpLCBvdXRwdXRfZGVwdGgpOworICB9CisKKyAgLy8gQWx0aG91Z2ggdHJhbnNwb3NlIGNvbnZvbHV0aW9uIHNpbXBsaWZpZXMgdG8gY29udm9sdXRpb24gd2l0aCB0cmFuc3Bvc2VkCisgIC8vIHdlaWdodHMgZm9yIHN0cmlkZXMgb2YgMSwgbm9uLXVuaXRhcnkgc3RyaWRpbmcgY29tcGxpY2F0ZXMgbWF0dGVycy4gVG8KKyAgLy8ga2VlcCB0aGlzIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBhcyBjbGVhciBhcyBwb3NzaWJsZSwgd2UgdXNlIGEKKyAgLy8gInNjYXR0ZXIiIGFjY2VzcyBwYXR0ZXJuLCB3aGVyZSB3ZSBsb29wIHRocm91Z2ggYWxsIHRoZSBpbnB1dCBlbGVtZW50cywKKyAgLy8gY29tcHV0aW5nIHRoZWlyIGluZmx1ZW5jZSBvbiB0aGUgb3V0cHV0LCByYXRoZXIgdGhhbiBsb29waW5nIHRocm91Z2ggdGhlCisgIC8vIG91dHB1dCBlbGVtZW50cyBpbiB0aGUgdHlwaWNhbCAiZ2F0aGVyIiBhY2Nlc3MgcGF0dGVybiBvZiBhIGNvbnYuIFdlCisgIC8vIHRoZXJlZm9yZSBtdXN0IGluaXRpYWxpemUgdGhlIG91dHB1dCBhcnJheSB0byB6ZXJvLgorICBjb25zdCBpbnQgbnVtX2VsZW1lbnRzID0gb3V0cHV0X3NoYXBlLkZsYXRTaXplKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2VsZW1lbnRzOyBpKyspIHsKKyAgICBvdXRwdXRfZGF0YVtpXSA9IDAuMGY7CisgIH0KKworICAvLyBMb29wIHRocm91Z2ggaW5wdXQgZWxlbWVudHMgb25lIGF0IGEgdGltZS4KKyAgZm9yIChpbnQgYmF0Y2ggPSAwOyBiYXRjaCA8IGJhdGNoZXM7ICsrYmF0Y2gpIHsKKyAgICBjb25zdCBmbG9hdCBzY2FsaW5nX2ZhY3RvciA9IHNjYWxpbmdfZmFjdG9yc19wdHJbYmF0Y2hdOworICAgIGZvciAoaW50IGluX3kgPSAwOyBpbl95IDwgaW5wdXRfaGVpZ2h0OyArK2luX3kpIHsKKyAgICAgIGZvciAoaW50IGluX3ggPSAwOyBpbl94IDwgaW5wdXRfd2lkdGg7ICsraW5feCkgeworICAgICAgICBmb3IgKGludCBpbl9jaGFubmVsID0gMDsgaW5fY2hhbm5lbCA8IGlucHV0X2RlcHRoOyArK2luX2NoYW5uZWwpIHsKKyAgICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlIG91dHB1dCBlbGVtZW50cyBpdCB3aWxsIGluZmx1ZW5jZQorICAgICAgICAgIGNvbnN0IGludCBvdXRfeF9vcmlnaW4gPSAoaW5feCAqIHN0cmlkZV93aWR0aCkgLSBwYWRfd2lkdGg7CisgICAgICAgICAgY29uc3QgaW50IG91dF95X29yaWdpbiA9IChpbl95ICogc3RyaWRlX2hlaWdodCkgLSBwYWRfaGVpZ2h0OworICAgICAgICAgIGZvciAoaW50IGZpbHRlcl95ID0gMDsgZmlsdGVyX3kgPCBmaWx0ZXJfaGVpZ2h0OyArK2ZpbHRlcl95KSB7CisgICAgICAgICAgICBmb3IgKGludCBmaWx0ZXJfeCA9IDA7IGZpbHRlcl94IDwgZmlsdGVyX3dpZHRoOyArK2ZpbHRlcl94KSB7CisgICAgICAgICAgICAgIGZvciAoaW50IG91dF9jaGFubmVsID0gMDsgb3V0X2NoYW5uZWwgPCBvdXRwdXRfZGVwdGg7CisgICAgICAgICAgICAgICAgICAgKytvdXRfY2hhbm5lbCkgeworICAgICAgICAgICAgICAgIC8vIENvbXB1dGUgb3V0cHV0IGVsZW1lbnQgbG9jYXRpb24KKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgb3V0X3ggPSBvdXRfeF9vcmlnaW4gKyBmaWx0ZXJfeDsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgb3V0X3kgPSBvdXRfeV9vcmlnaW4gKyBmaWx0ZXJfeTsKKyAgICAgICAgICAgICAgICAvLyBXZSBjYW5ub3QgYWNjdW11bGF0ZSBvdXQgb2YgYm91bmRzCisgICAgICAgICAgICAgICAgaWYgKChvdXRfeCA+PSAwKSAmJiAob3V0X3ggPCBvdXRwdXRfd2lkdGgpICYmIChvdXRfeSA+PSAwKSAmJgorICAgICAgICAgICAgICAgICAgICAob3V0X3kgPCBvdXRwdXRfaGVpZ2h0KSkgeworICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbnB1dF92YWx1ZSA9IGlucHV0X2RhdGFbT2Zmc2V0KAorICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3NoYXBlLCBiYXRjaCwgaW5feSwgaW5feCwgaW5fY2hhbm5lbCldOworICAgICAgICAgICAgICAgICAgaW50MzJfdCBmaWx0ZXJfdmFsdWUgPQorICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl9kYXRhW09mZnNldChmaWx0ZXJfc2hhcGUsIG91dF9jaGFubmVsLCBmaWx0ZXJfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX3gsIGluX2NoYW5uZWwpXTsKKyAgICAgICAgICAgICAgICAgIGludDMyX3QgYWNjID0KKyAgICAgICAgICAgICAgICAgICAgICAoaW5wdXRfdmFsdWUgLSBpbnB1dF9vZmZzZXRbYmF0Y2hdKSAqIGZpbHRlcl92YWx1ZTsKKyAgICAgICAgICAgICAgICAgIG91dHB1dF9kYXRhW09mZnNldChvdXRwdXRfc2hhcGUsIGJhdGNoLCBvdXRfeSwgb3V0X3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X2NoYW5uZWwpXSArPQorICAgICAgICAgICAgICAgICAgICAgIGFjYyAqIHBlcl9jaGFubmVsX3NjYWxlW291dF9jaGFubmVsXSAqIHNjYWxpbmdfZmFjdG9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorCisgIGZvciAoaW50IGJhdGNoID0gMDsgYmF0Y2ggPCBiYXRjaGVzOyArK2JhdGNoKSB7CisgICAgZm9yIChpbnQgb3V0X3kgPSAwOyBvdXRfeSA8IG91dHB1dF9oZWlnaHQ7ICsrb3V0X3kpIHsKKyAgICAgIGZvciAoaW50IG91dF94ID0gMDsgb3V0X3ggPCBvdXRwdXRfd2lkdGg7ICsrb3V0X3gpIHsKKyAgICAgICAgZm9yIChpbnQgb3V0X2NoYW5uZWwgPSAwOyBvdXRfY2hhbm5lbCA8IG91dHB1dF9kZXB0aDsgKytvdXRfY2hhbm5lbCkgeworICAgICAgICAgIGZsb2F0IGFjYyA9IG91dHB1dF9kYXRhW09mZnNldChvdXRwdXRfc2hhcGUsIGJhdGNoLCBvdXRfeSwgb3V0X3gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF9jaGFubmVsKV07CisgICAgICAgICAgaWYgKGJpYXNfZGF0YSkgYWNjICs9IGJpYXNfZGF0YVtvdXRfY2hhbm5lbF07CisKKyAgICAgICAgICBvdXRwdXRfZGF0YVtPZmZzZXQob3V0cHV0X3NoYXBlLCBiYXRjaCwgb3V0X3ksIG91dF94LCBvdXRfY2hhbm5lbCldID0KKyAgICAgICAgICAgICAgQWN0aXZhdGlvbkZ1bmN0aW9uV2l0aE1pbk1heChhY2MsIG91dHB1dF9hY3RpdmF0aW9uX21pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfYWN0aXZhdGlvbl9tYXgpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKIH0gIC8vIG5hbWVzcGFjZSByZWZlcmVuY2Vfb3BzCiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCiAKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL3NpbXBsZV9tb2RlbF9zZXR0aW5ncy5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3J1bnRpbWVfc2hhcGUuY2MKc2ltaWxhcml0eSBpbmRleCA2NyUKY29weSBmcm9tIHRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL3NpbXBsZV9tb2RlbF9zZXR0aW5ncy5jYwpjb3B5IHRvIHRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3J1bnRpbWVfc2hhcGUuY2MKaW5kZXggZTJjZjY2MS4uZGQxMjI3OCAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9zaW1wbGVfZmVhdHVyZXMvc2ltcGxlX21vZGVsX3NldHRpbmdzLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3J1bnRpbWVfc2hhcGUuY2MKQEAgLTEsNCArMSw0IEBACi0vKiBDb3B5cmlnaHQgMjAxOCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLyogQ29weXJpZ2h0IDIwMjMgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIAogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xMywxMSArMTMsMTEgQEAKIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL3NpbXBsZV9tb2RlbF9zZXR0aW5ncy5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3J1bnRpbWVfc2hhcGUuaCIKIAotY29uc3QgY2hhcioga0NhdGVnb3J5TGFiZWxzW2tDYXRlZ29yeUNvdW50XSA9IHsKLSAgICAic2lsZW5jZSIsCi0gICAgInVua25vd24iLAotICAgICJ5ZXMiLAotICAgICJubyIsCi19OworbmFtZXNwYWNlIHRmbGl0ZSB7CisKKy8vIERlZmluaW5nIGEgY29uc3RleHByIHN0YXRpYyBjbGFzcyBtZW1iZXIgaXMgbmVjZXNzYXJ5IGluIEMrKzExCitjb25zdGV4cHIgaW50IHRmbGl0ZTo6UnVudGltZVNoYXBlOjprTWF4U21hbGxTaXplOworCit9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9ydW50aW1lX3NoYXBlLmggYi90ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9ydW50aW1lX3NoYXBlLmgKaW5kZXggMGU0ZGYyYy4uYmM3ODZiZCAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvcnVudGltZV9zaGFwZS5oCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3J1bnRpbWVfc2hhcGUuaApAQCAtMTUsNiArMTUsOCBAQAogI2lmbmRlZiBURU5TT1JGTE9XX0xJVEVfS0VSTkVMU19JTlRFUk5BTF9SVU5USU1FX1NIQVBFX0hfCiAjZGVmaW5lIFRFTlNPUkZMT1dfTElURV9LRVJORUxTX0lOVEVSTkFMX1JVTlRJTUVfU0hBUEVfSF8KIAorI2luY2x1ZGUgPGNzdHJpbmc+CisKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9jb21wYXRpYmlsaXR5LmgiCiAKIG5hbWVzcGFjZSB0ZmxpdGUgewpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvdHlwZXMuaCBiL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3R5cGVzLmgKaW5kZXggYjc3NWNhOC4uZjJjYzE2MCAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvdHlwZXMuaAorKysgYi90ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC90eXBlcy5oCkBAIC0xNTcsNyArMTU3LDggQEAKIH07CiAKIC8vIEdldHMgbmV4dCBpbmRleCB0byBpdGVyYXRlIHRocm91Z2ggYSBtdWx0aWRpbWVuc2lvbmFsIGFycmF5LgotaW5saW5lIGJvb2wgTmV4dEluZGV4KGNvbnN0IGludCBudW1fZGltcywgY29uc3QgaW50KiBkaW1zLCBpbnQqIGN1cnJlbnQpIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbmRleFR5cGUgPSBpbnQ+CitpbmxpbmUgYm9vbCBOZXh0SW5kZXgoY29uc3QgaW50IG51bV9kaW1zLCBjb25zdCBpbnQqIGRpbXMsIEluZGV4VHlwZSogY3VycmVudCkgewogICBpZiAobnVtX2RpbXMgPT0gMCkgewogICAgIHJldHVybiBmYWxzZTsKICAgfQpAQCAtMTY1LDcgKzE2Niw3IEBACiAgIFRGTElURV9EQ0hFQ0soY3VycmVudCAhPSBudWxscHRyKTsKICAgaW50IGNhcnJ5ID0gMTsKICAgZm9yIChpbnQgaWR4ID0gbnVtX2RpbXMgLSAxOyBpZHggPj0gMDsgLS1pZHgpIHsKLSAgICBpbnQgY3VycmVudF92YWwgPSBjdXJyZW50W2lkeF0gKyBjYXJyeTsKKyAgICBJbmRleFR5cGUgY3VycmVudF92YWwgPSBjdXJyZW50W2lkeF0gKyBjYXJyeTsKICAgICBURkxJVEVfRENIRUNLX0dFKGRpbXNbaWR4XSwgY3VycmVudF92YWwpOwogICAgIGlmIChkaW1zW2lkeF0gPT0gY3VycmVudF92YWwpIHsKICAgICAgIGN1cnJlbnRbaWR4XSA9IDA7CmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUva2VybmVscy9rZXJuZWxfdXRpbC5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2tlcm5lbF91dGlsLmNjCmluZGV4IDU4ZmQ5OWYuLjM5ZjdiYzcgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2tlcm5lbF91dGlsLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2tlcm5lbF91dGlsLmNjCkBAIC01NzIsMTIgKzU3MiwxMSBAQAogYm9vbCBJc01vYmlsZVBsYXRmb3JtKCkgewogI2lmIGRlZmluZWQoQU5EUk9JRCkgfHwgZGVmaW5lZChfX0FORFJPSURfXykKICAgcmV0dXJuIHRydWU7Ci0jZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykKLSNpZiBUQVJHRVRfSVBIT05FX1NJTVVMQVRPUiB8fCBUQVJHRVRfT1NfSVBIT05FCisjZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykgJiYgKFRBUkdFVF9JUEhPTkVfU0lNVUxBVE9SIHx8IFRBUkdFVF9PU19JUEhPTkUpCiAgIHJldHVybiB0cnVlOwotI2VuZGlmCi0jZW5kaWYKKyNlbHNlCiAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgogfQogCiBib29sIEhhc1Vuc3BlY2lmaWVkRGltZW5zaW9uKGNvbnN0IFRmTGl0ZVRlbnNvciogdGVuc29yKSB7CmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vQlVJTEQgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vQlVJTEQKaW5kZXggMTNjYjhkZS4uNThlYTIyZCAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL0JVSUxECisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9CVUlMRApAQCAtMzksOCArMzksOCBAQAogICAgIGRlcHMgPSBbCiAgICAgICAgICI6bWVtb3J5X2hlbHBlcnMiLAogICAgICAgICAiOm1pY3JvX2FsbG9jYXRvciIsCi0gICAgICAgICI6bWljcm9fY29udGV4dCIsCi0gICAgICAgICI6bWljcm9fZ3JhcGgiLAorICAgICAgICAiOm1pY3JvX2ludGVycHJldGVyX2NvbnRleHQiLAorICAgICAgICAiOm1pY3JvX2ludGVycHJldGVyX2dyYXBoIiwKICAgICAgICAgIjptaWNyb19wcm9maWxlcl9pbnRlcmZhY2UiLAogICAgICAgICAiOm9wX3Jlc29sdmVycyIsCiAgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZTp0eXBlX3RvX3RmbGl0ZXR5cGUiLApAQCAtNjMsOSArNjMsMjcgQEAKICAgICBdLAogICAgIGNvcHRzID0gbWljcm9fY29wdHMoKSwKICAgICBkZXBzID0gWworICAgICAgICAiOm1pY3JvX2NvbW1vbiIsCisgICAgICAgICI6bWljcm9fZ3JhcGgiLAorICAgICAgICAiOm1pY3JvX2xvZyIsCisgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9jOmNvbW1vbiIsCisgICAgXSwKKykKKworY2NfbGlicmFyeSgKKyAgICBuYW1lID0gIm1pY3JvX2ludGVycHJldGVyX2NvbnRleHQiLAorICAgIHNyY3MgPSBbCisgICAgICAgICJtaWNyb19pbnRlcnByZXRlcl9jb250ZXh0LmNjIiwKKyAgICBdLAorICAgIGhkcnMgPSBbCisgICAgICAgICJtaWNyb19pbnRlcnByZXRlcl9jb250ZXh0LmgiLAorICAgIF0sCisgICAgY29wdHMgPSBtaWNyb19jb3B0cygpLAorICAgIGRlcHMgPSBbCiAgICAgICAgICI6bWVtb3J5X2hlbHBlcnMiLAogICAgICAgICAiOm1pY3JvX2FsbG9jYXRvciIsCi0gICAgICAgICI6bWljcm9fZ3JhcGgiLAorICAgICAgICAiOm1pY3JvX2NvbnRleHQiLAorICAgICAgICAiOm1pY3JvX2ludGVycHJldGVyX2dyYXBoIiwKICAgICAgICAgIjptaWNyb19sb2ciLAogICAgICAgICAiOm1pY3JvX3Byb2ZpbGVyX2ludGVyZmFjZSIsCiAgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9jOmNvbW1vbiIsCkBAIC05NCwyMiArMTEyLDM2IEBACiAgICAgY29wdHMgPSBtaWNyb19jb3B0cygpLAogICAgIGRlcHMgPSBbCiAgICAgICAgICI6bWVtb3J5X2hlbHBlcnMiLAotICAgICAgICAiOm1pY3JvX2FsbG9jYXRvciIsCisgICAgICAgICI6bWljcm9fYXJlbmFfY29uc3RhbnRzIiwKICAgICAgICAgIjptaWNyb19jb250ZXh0IiwKICAgICAgICAgIjptaWNyb19sb2ciLAogICAgICAgICAiOm1vY2tfbWljcm9fZ3JhcGgiLAogICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvYzpjb21tb24iLAorICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm8vYXJlbmFfYWxsb2NhdG9yOnNpbXBsZV9tZW1vcnlfYWxsb2NhdG9yIiwKICAgICBdLAogKQogCiBjY19saWJyYXJ5KAogICAgIG5hbWUgPSAibWljcm9fZ3JhcGgiLAotICAgIHNyY3MgPSBbIm1pY3JvX2dyYXBoLmNjIl0sCiAgICAgaGRycyA9IFsibWljcm9fZ3JhcGguaCJdLAorICAgIGNvcHRzID0gbWljcm9fY29wdHMoKSwKKyAgICBkZXBzID0gWworICAgICAgICAiOm1pY3JvX2NvbW1vbiIsCisgICAgICAgICI6bWljcm9fcmVzb3VyY2VfdmFyaWFibGUiLAorICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbDpjb21wYXRpYmlsaXR5IiwKKyAgICBdLAorKQorCitjY19saWJyYXJ5KAorICAgIG5hbWUgPSAibWljcm9faW50ZXJwcmV0ZXJfZ3JhcGgiLAorICAgIHNyY3MgPSBbIm1pY3JvX2ludGVycHJldGVyX2dyYXBoLmNjIl0sCisgICAgaGRycyA9IFsibWljcm9faW50ZXJwcmV0ZXJfZ3JhcGguaCJdLAorICAgIGNvcHRzID0gbWljcm9fY29wdHMoKSwKICAgICBkZXBzID0gWwogICAgICAgICAiOm1lbW9yeV9oZWxwZXJzIiwKICAgICAgICAgIjptaWNyb19hbGxvY2F0b3IiLAogICAgICAgICAiOm1pY3JvX2NvbW1vbiIsCisgICAgICAgICI6bWljcm9fZ3JhcGgiLAogICAgICAgICAiOm1pY3JvX2xvZyIsCiAgICAgICAgICI6bWljcm9fcHJvZmlsZXIiLAogICAgICAgICAiOm1pY3JvX3Jlc291cmNlX3ZhcmlhYmxlIiwKQEAgLTEyNCw2ICsxNTYsNyBAQAogICAgIG5hbWUgPSAibW9ja19taWNyb19ncmFwaCIsCiAgICAgc3JjcyA9IFsibW9ja19taWNyb19ncmFwaC5jYyJdLAogICAgIGhkcnMgPSBbIm1vY2tfbWljcm9fZ3JhcGguaCJdLAorICAgIGNvcHRzID0gbWljcm9fY29wdHMoKSwKICAgICBkZXBzID0gWwogICAgICAgICAiOm1pY3JvX2FsbG9jYXRvciIsCiAgICAgICAgICI6bWljcm9fZ3JhcGgiLApAQCAtMTU4LDYgKzE5MSw3IEBACiAgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9hcmVuYV9hbGxvY2F0b3I6cGVyc2lzdGVudF9hcmVuYV9idWZmZXJfYWxsb2NhdG9yIiwKICAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvL2FyZW5hX2FsbG9jYXRvcjpzaW1wbGVfbWVtb3J5X2FsbG9jYXRvciIsCiAgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9tZW1vcnlfcGxhbm5lcjpncmVlZHlfbWVtb3J5X3BsYW5uZXIiLAorICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWVtb3J5X3BsYW5uZXI6bGluZWFyX21lbW9yeV9wbGFubmVyIiwKICAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvL21lbW9yeV9wbGFubmVyOm1pY3JvX21lbW9yeV9wbGFubmVyIiwKICAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvL3RmbGl0ZV9icmlkZ2U6ZmxhdGJ1ZmZlcl9jb252ZXJzaW9uc19icmlkZ2UiLAogICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvc2NoZW1hOnNjaGVtYV9mYnMiLApAQCAtMTc5LDYgKzIxMyw3IEBACiAgICAgbmFtZSA9ICJmbGF0YnVmZmVyX3V0aWxzIiwKICAgICBzcmNzID0gWyJmbGF0YnVmZmVyX3V0aWxzLmNjIl0sCiAgICAgaGRycyA9IFsiZmxhdGJ1ZmZlcl91dGlscy5oIl0sCisgICAgY29wdHMgPSBtaWNyb19jb3B0cygpLAogICAgIGRlcHMgPSBbCiAgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9jOmNvbW1vbiIsCiAgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9zY2hlbWE6c2NoZW1hX2ZicyIsCkBAIC0xOTAsNiArMjI1LDcgQEAKICAgICBuYW1lID0gIm1lbW9yeV9oZWxwZXJzIiwKICAgICBzcmNzID0gWyJtZW1vcnlfaGVscGVycy5jYyJdLAogICAgIGhkcnMgPSBbIm1lbW9yeV9oZWxwZXJzLmgiXSwKKyAgICBjb3B0cyA9IG1pY3JvX2NvcHRzKCksCiAgICAgZGVwcyA9IFsKICAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL2M6Y29tbW9uIiwKICAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWw6cmVmZXJlbmNlIiwKQEAgLTM2OSw2ICs0MDUsMjEgQEAKICkKIAogY2NfbGlicmFyeSgKKyAgICBuYW1lID0gInNwYW4iLAorICAgIGhkcnMgPSBbInNwYW4uaCJdLAorICAgIGNvcHRzID0gbWljcm9fY29wdHMoKSwKKykKKworY2NfbGlicmFyeSgKKyAgICBuYW1lID0gInN0YXRpY192ZWN0b3IiLAorICAgIGhkcnMgPSBbInN0YXRpY192ZWN0b3IuaCJdLAorICAgIGNvcHRzID0gbWljcm9fY29wdHMoKSwKKyAgICBkZXBzID0gWworICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUva2VybmVsczpvcF9tYWNyb3MiLAorICAgIF0sCispCisKK2NjX2xpYnJhcnkoCiAgICAgbmFtZSA9ICJzeXN0ZW1fc2V0dXAiLAogICAgIHNyY3MgPSBbCiAgICAgICAgICJzeXN0ZW1fc2V0dXAuY2MiLApAQCAtMzg3LDYgKzQzOCw3IEBACiAgICAgZGVwcyA9IFsKICAgICAgICAgIjptaWNyb19sb2ciLAogICAgICAgICAiOnN5c3RlbV9zZXR1cCIsCisgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0aW5nOm1pY3JvX3Rlc3QiLAogICAgIF0sCiApCiAKQEAgLTQwMywxMyArNDU1LDE0IEBACiApCiAKIGNjX3Rlc3QoCi0gICAgbmFtZSA9ICJtaWNyb19jb250ZXh0X3Rlc3QiLAorICAgIG5hbWUgPSAibWljcm9faW50ZXJwcmV0ZXJfY29udGV4dF90ZXN0IiwKICAgICBzcmNzID0gWwotICAgICAgICAibWljcm9fY29udGV4dF90ZXN0LmNjIiwKKyAgICAgICAgIm1pY3JvX2ludGVycHJldGVyX2NvbnRleHRfdGVzdC5jYyIsCiAgICAgXSwKICAgICBkZXBzID0gWwogICAgICAgICAiOm1pY3JvX2FsbG9jYXRvciIsCi0gICAgICAgICI6bWljcm9fY29udGV4dCIsCisgICAgICAgICI6bWljcm9faW50ZXJwcmV0ZXJfY29udGV4dCIsCisgICAgICAgICI6bWljcm9faW50ZXJwcmV0ZXJfZ3JhcGgiLAogICAgICAgICAiOnRlc3RfaGVscGVycyIsCiAgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0aW5nOm1pY3JvX3Rlc3QiLAogICAgIF0sCkBAIC00MjMsNiArNDc2LDcgQEAKICAgICBkZXBzID0gWwogICAgICAgICAiOmZha2VfbWljcm9fY29udGV4dCIsCiAgICAgICAgICI6bWljcm9fYWxsb2NhdG9yIiwKKyAgICAgICAgIjptb2NrX21pY3JvX2dyYXBoIiwKICAgICAgICAgIjp0ZXN0X2hlbHBlcnMiLAogICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm8vdGVzdGluZzptaWNyb190ZXN0IiwKICAgICBdLApAQCAtNTE4LDYgKzU3MiwxOCBAQAogKQogCiBjY190ZXN0KAorICAgIG5hbWUgPSAic3Bhbl90ZXN0IiwKKyAgICBzaXplID0gInNtYWxsIiwKKyAgICBzcmNzID0gWworICAgICAgICAic3Bhbl90ZXN0LmNjIiwKKyAgICBdLAorICAgIGRlcHMgPSBbCisgICAgICAgICI6c3BhbiIsCisgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0aW5nOm1pY3JvX3Rlc3QiLAorICAgIF0sCispCisKK2NjX3Rlc3QoCiAgICAgbmFtZSA9ICJ0ZXN0aW5nX2hlbHBlcnNfdGVzdCIsCiAgICAgc3JjcyA9IFsKICAgICAgICAgInRlc3RpbmdfaGVscGVyc190ZXN0LmNjIiwKQEAgLTU3NCw2ICs2NDAsMTggQEAKICAgICBdLAogKQogCitjY190ZXN0KAorICAgIG5hbWUgPSAic3RhdGljX3ZlY3Rvcl90ZXN0IiwKKyAgICBzaXplID0gInNtYWxsIiwKKyAgICBzcmNzID0gWworICAgICAgICAic3RhdGljX3ZlY3Rvcl90ZXN0LmNjIiwKKyAgICBdLAorICAgIGRlcHMgPSBbCisgICAgICAgICI6c3RhdGljX3ZlY3RvciIsCisgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0aW5nOm1pY3JvX3Rlc3QiLAorICAgIF0sCispCisKIGJ6bF9saWJyYXJ5KAogICAgIG5hbWUgPSAiYnVpbGRfZGVmX2J6bCIsCiAgICAgc3JjcyA9IFsiYnVpbGRfZGVmLmJ6bCJdLApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2FyY19lbXNkcC9kZWJ1Z19sb2cuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vYXJjX2Vtc2RwL2RlYnVnX2xvZy5jYwppbmRleCA1NWNmNDIwLi5hNjFlM2MyIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vYXJjX2Vtc2RwL2RlYnVnX2xvZy5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vYXJjX2Vtc2RwL2RlYnVnX2xvZy5jYwpAQCAtMTIyLDQgKzEyMiwxMiBAQAogICB2c25wcmludGZfKGxvZ19idWZmZXIsIGtNYXhMb2dMZW4sIGZvcm1hdCwgYXJncyk7CiAgIExvZ0RlYnVnU3RyaW5nKGxvZ19idWZmZXIpOwogI2VuZGlmCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQorCisjaWZuZGVmIFRGX0xJVEVfU1RSSVBfRVJST1JfU1RSSU5HUworLy8gT25seSBjYWxsZWQgZnJvbSBNaWNyb1ZzbnByaW50ZiAobWljcm9fbG9nLmgpCitleHRlcm4gIkMiIGludCBEZWJ1Z1ZzbnByaW50ZihjaGFyKiBidWZmZXIsIHNpemVfdCBidWZfc2l6ZSwgY29uc3QgY2hhciogZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCB2bGlzdCkgeworICByZXR1cm4gdnNucHJpbnRmXyhidWZmZXIsIGJ1Zl9zaXplLCBmb3JtYXQsIHZsaXN0KTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2JlbmNobWFya3MvQlVJTEQgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vYmVuY2htYXJrcy9CVUlMRAppbmRleCA4MDhmNmFjLi5kMGY2N2I2IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vYmVuY2htYXJrcy9CVUlMRAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vYmVuY2htYXJrcy9CVUlMRApAQCAtNjUsOSArNjUsNyBAQAogICAgIGhkcnMgPSBbCiAgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9tb2RlbHM6Z2VuZXJhdGVkX2tleXdvcmRfc2NyYW1ibGVkXzhiaXRfbW9kZWxfaGRyIiwKICAgICBdLAotICAgIHZpc2liaWxpdHkgPSBbCi0gICAgICAgICI6bWljcm9fdG9wX2xldmVsIiwKLSAgICBdLAorICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwcml2YXRlIl0sCiApCiAKIGNjX2JpbmFyeSgKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9iZW5jaG1hcmtzL1JFQURNRS5tZCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9iZW5jaG1hcmtzL1JFQURNRS5tZAppbmRleCAxMDMxYTU4Li4xYWM1ZDI1IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vYmVuY2htYXJrcy9SRUFETUUubWQKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2JlbmNobWFya3MvUkVBRE1FLm1kCkBAIC03MCwyOSArNzAsMjAgQEAKIEZvciBtb3JlIGluZm8gYWJvdXQgdGhlIENvcnN0b25lLTMwMCBzb2Z0d2FyZSBzZWU6CiBbdGVuc29yZmxvdy9saXRlL21pY3JvL2NvcnRleF9tX2NvcnN0b25lXzMwMC9SRUFETUUubWRdKC4uL2NvcnRleF9tX2NvcnN0b25lXzMwMC9SRUFETUUubWQpLgogCi1EaXNjbGFpbWVyOiBFeGVjdXRpbmcgdGhlIGJlbmNobWFyayB0ZXN0IG9uIHRoZSBDb3JzdG9uZS0zMDAgc29mdHdhcmUgd2lsbAotcHJvdmlkZSBhIGdlbmVyYWwgbWV0cmljIG9mIGluc3RydWN0aW9ucyBleGVjdXRlZC4gVGhlIGVzdGltYXRlcyBhcmUgbm90IGN5Y2xlCi1hY2N1cmF0ZSwgaG93ZXZlciBpdCBhbGlnbnMgdG8gaW5zdHJ1Y3Rpb24gcGVyIGN5Y2xlLCBhbmQgaXMgYSBjb25zaXN0ZW50Ci1lbnZpcm9ubWVudC4gVGhpcyBtZWFucyBpdCBjYW4gZGV0ZWN0IGlmIGNvZGUgY2hhbmdlcyBjaGFuZ2VkIHBlcmZvcm1hbmNlLgorRGlzY2xhaW1lcjogVGhlIEZWUCBjYW4gbm90IGJlIHVzZWQgdG8gbWVhc3VyZSBDUFUgcGVyZm9ybWFuY2UuCitUaGUgcmVzdWx0cyBhcmUgbm90IHJlbGlhYmxlLCBub3QgZXZlbiBmb3IgcmVsYXRpdmUgbWVhc3VyZW1lbnRzLgorRlZQIG1heSBob3dldmVyIGJlIHVzZWQgZm9yIHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50cyB3aGVuIHJ1bm5pbmcgb24gTlBVIGFuZCBvbmx5IE5QVSBQTVUgbnVtYmVycyBjYW4gYmUgdXNlZC4gVGhlIE5QVSBtb2RlbCBpcyBjeWNsZSBhY2N1cmF0ZSB3aXRoaW4gYXBwcm94aW1hdGVseSArLTEwJS4KIAotVGhlIHBlcnNvbiBkZXRlY3Rpb24gYmVuY2htYXJrIGNhbiBhbHNvIHJ1biB3aXRoIEV0aG9zLVUgZW5hYmxlZCwgYXMgdGhlCi1kb3dubG9hZGVkIG1vZGVsIHdpbGwgYmUgb3B0aW1pemVkIGZvciBFdGhvcy1VLiBGb3IgbW9yZSBpbmZvIHNlZToKK0FzIGFuIGV4YW1wbGUsIHRoZSBwZXJzb24gZGV0ZWN0IGRvd25sb2FkZWQgbW9kZWwgd2lsbCBiZSBvcHRpbWl6ZWQgZm9yIEV0aG9zLVUuIEZvciBtb3JlIGluZm8gc2VlOgogW3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2V0aG9zX3UvUkVBRE1FLm1kXSguLi9rZXJuZWxzL2V0aG9zX3UvUkVBRE1FLm1kKS4KK0FuZCBzaW5jZSBpdCBvbmx5IG1ha2VzIHNlbnNlIHRvIG1lYXN1cmUgcGVyZm9ybWFuY2Ugb24gdGhlIE5QVSwgb25seSB0aGUgcGVyc29uIGRldGVjdGlvbiBiZW5jaG1hcmsgc2hvdWxkIGJlIHJ1biBhbmQgb25seSB3aXRoIEV0aG9zLVUgZW5hYmxlZC4KK1NlZSBhbHNvIG5ldHdvcmsgdGVzdGVyIGV4YW1wbGUsIHdoZXJlIHBlcnNvbiBkZXRlY3QgbW9kZWwgaXMgdXNlZCBpbiB0aGUgc2FtZSB3YXkgd2hlbiBFdGhvcy1VIGlzIGVuYWJsZWQ6CitbdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL25ldHdvcmtfdGVzdGVyL1JFQURNRS5tZF0oLi4vZXhhbXBsZXMvbmV0d29ya190ZXN0ZXIvUkVBRE1FLm1kKS4KIAotVG8gcnVuIHRoZSBrZXl3b3JkIGJlbmNobWFyayBvbiBGVlA6Ci0KLWBgYAotbWFrZSAtaiAtZiB0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9NYWtlZmlsZSBUQVJHRVQ9Y29ydGV4X21fY29yc3RvbmVfMzAwIFRBUkdFVF9BUkNIPWNvcnRleC1tNTUgcnVuX2tleXdvcmRfYmVuY2htYXJrCi1gYGAKLQotVG8gcnVuIHRoZSBwZXJzb24gZGV0ZWN0aW9uIGJlbmNobWFyayBvbiBGVlA6Ci0KLWBgYAotbWFrZSAtaiAtZiB0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9NYWtlZmlsZSBUQVJHRVQ9Y29ydGV4X21fY29yc3RvbmVfMzAwIFRBUkdFVF9BUkNIPWNvcnRleC1tNTUgcnVuX3BlcnNvbl9kZXRlY3Rpb25fYmVuY2htYXJrCi1gYGAKK1RoZSBwZXJzb24gZGV0ZWN0IG1vZGVsIGlzIG5vdCBhbiBvcHRpbWlhbCBtb2RlbCBmb3IgRXRob3MtVSBzaW5jZSBpdCBxdWl0ZSBzbWFsbC4gQWxzbyBub3RlIHRoYXQgb25seSB0aGUgTlBVIFBNVSBjeWNsZXMgYXJlIGxvZ2dlZCBldmVuIHRob3VnaCB0aGUgQ1BVIGlzIHNldHRpbmcgdXAgdGhlIEV0aG9zLVUgZHJpdmVyIGluIGVhY2ggaXRlcmF0aW9uLgogCiBUbyBydW4gdGhlIHBlcnNvbiBkZXRlY3Rpb24gYmVuY2htYXJrIG9uIEZWUCB3aXRoIEV0aG9zLVU6CiAKIGBgYAotbWFrZSAtaiAtZiB0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9NYWtlZmlsZSBDT19QUk9DRVNTT1I9ZXRob3NfdSBUQVJHRVQ9Y29ydGV4X21fY29yc3RvbmVfMzAwIFRBUkdFVF9BUkNIPWNvcnRleC1tNTUgcnVuX3BlcnNvbl9kZXRlY3Rpb25fYmVuY2htYXJrCittYWtlIC1mIHRlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL01ha2VmaWxlIENPX1BST0NFU1NPUj1ldGhvc191IFRBUkdFVD1jb3J0ZXhfbV9jb3JzdG9uZV8zMDAgVEFSR0VUX0FSQ0g9Y29ydGV4LW01NSBydW5fcGVyc29uX2RldGVjdGlvbl9iZW5jaG1hcmsKIGBgYApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2JlbmNobWFya3MvcGVyc29uX2RldGVjdGlvbl9iZW5jaG1hcmsuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vYmVuY2htYXJrcy9wZXJzb25fZGV0ZWN0aW9uX2JlbmNobWFyay5jYwppbmRleCBlMjE3ODliLi4yOWQzMGVlIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vYmVuY2htYXJrcy9wZXJzb25fZGV0ZWN0aW9uX2JlbmNobWFyay5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vYmVuY2htYXJrcy9wZXJzb25fZGV0ZWN0aW9uX2JlbmNobWFyay5jYwpAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgMjAyNCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTM3LDcgKzM3LDExIEBACiAKIG5hbWVzcGFjZSB0ZmxpdGUgewogCisjaWZkZWYgRVRIT1NfVQordXNpbmcgUGVyc29uRGV0ZWN0aW9uT3BSZXNvbHZlciA9IE1pY3JvTXV0YWJsZU9wUmVzb2x2ZXI8MT47CisjZWxzZQogdXNpbmcgUGVyc29uRGV0ZWN0aW9uT3BSZXNvbHZlciA9IE1pY3JvTXV0YWJsZU9wUmVzb2x2ZXI8Nj47CisjZW5kaWYKIHVzaW5nIFBlcnNvbkRldGVjdGlvbkJlbmNobWFya1J1bm5lciA9IE1pY3JvQmVuY2htYXJrUnVubmVyPGludDhfdD47CiAKIC8vIENyZWF0ZSBhbiBhcmVhIG9mIG1lbW9yeSB0byB1c2UgZm9yIGlucHV0LCBvdXRwdXQsIGFuZCBpbnRlcm1lZGlhdGUgYXJyYXlzLgpAQCAtNTcsMTIgKzYxLDE2IEBACiAgIC8vIFBlcnNvbkRldGVjdGlvbkJlbmNobWFya1J1bm5lciBvYmplY3QuCiAgIFBlcnNvbkRldGVjdGlvbk9wUmVzb2x2ZXIqIG9wX3Jlc29sdmVyID0KICAgICAgIG5ldyAob3BfcmVzb2x2ZXJfYnVmZmVyKSBQZXJzb25EZXRlY3Rpb25PcFJlc29sdmVyKCk7CisjaWZkZWYgRVRIT1NfVQorICBvcF9yZXNvbHZlci0+QWRkRXRob3NVKCk7CisjZWxzZQogICBvcF9yZXNvbHZlci0+QWRkRnVsbHlDb25uZWN0ZWQodGZsaXRlOjpSZWdpc3Rlcl9GVUxMWV9DT05ORUNURURfSU5UOCgpKTsKICAgb3BfcmVzb2x2ZXItPkFkZENvbnYyRCh0ZmxpdGU6OlJlZ2lzdGVyX0NPTlZfMkRfSU5UOFJFRigpKTsKICAgb3BfcmVzb2x2ZXItPkFkZERlcHRod2lzZUNvbnYyRCgpOwogICBvcF9yZXNvbHZlci0+QWRkU29mdG1heCgpOwogICBvcF9yZXNvbHZlci0+QWRkQXZlcmFnZVBvb2wyRCh0ZmxpdGU6OlJlZ2lzdGVyX0FWRVJBR0VfUE9PTF8yRF9JTlQ4KCkpOwogICBvcF9yZXNvbHZlci0+QWRkUmVzaGFwZSgpOworI2VuZGlmCiAgIHJldHVybiBuZXcgKGJlbmNobWFya19ydW5uZXJfYnVmZmVyKQogICAgICAgUGVyc29uRGV0ZWN0aW9uQmVuY2htYXJrUnVubmVyKGdfcGVyc29uX2RldGVjdF9tb2RlbF9kYXRhLCBvcF9yZXNvbHZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW5zb3JfYXJlbmEsIGtUZW5zb3JBcmVuYVNpemUsIHByb2ZpbGVyKTsKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9ibHVlcGlsbC9kZWJ1Z19sb2cuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vYmx1ZXBpbGwvZGVidWdfbG9nLmNjCmluZGV4IDZkMGQ1M2IuLjcyMDQxMGIgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9ibHVlcGlsbC9kZWJ1Z19sb2cuY2MKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2JsdWVwaWxsL2RlYnVnX2xvZy5jYwpAQCAtNDUsMyArNDUsMTEgQEAKICAgU3lzV3JpdGVEZWJ1Z0NvbnNvbGUobG9nX2J1ZmZlcik7CiAjZW5kaWYgIC8vIFRGX0xJVEVfU1RSSVBfRVJST1JfU1RSSU5HUwogfQorCisjaWZuZGVmIFRGX0xJVEVfU1RSSVBfRVJST1JfU1RSSU5HUworLy8gT25seSBjYWxsZWQgZnJvbSBNaWNyb1ZzbnByaW50ZiAobWljcm9fbG9nLmgpCitleHRlcm4gIkMiIGludCBEZWJ1Z1ZzbnByaW50ZihjaGFyKiBidWZmZXIsIHNpemVfdCBidWZfc2l6ZSwgY29uc3QgY2hhciogZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCB2bGlzdCkgeworICByZXR1cm4gdnNucHJpbnRmXyhidWZmZXIsIGJ1Zl9zaXplLCBmb3JtYXQsIHZsaXN0KTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2J1aWxkX2RlZi5iemwgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vYnVpbGRfZGVmLmJ6bAppbmRleCBiOWVjZjc3Li44Mjc2OGYxIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vYnVpbGRfZGVmLmJ6bAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vYnVpbGRfZGVmLmJ6bApAQCAtMSw2ICsxLDcgQEAKIGRlZiBtaWNyb19jb3B0cygpOgogICAgIHJldHVybiBbCiAgICAgICAgICItV2FsbCIsCisgICAgICAgICItV25vLXVudXNlZC1wYXJhbWV0ZXIiLAogICAgICAgICAiLVdub24tdmlydHVhbC1kdG9yIiwKICAgICAgICAgIi1ERkxBVEJVRkZFUlNfTE9DQUxFX0lOREVQRU5ERU5UPTAiLAogICAgIF0KZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9jaHJlL2RlYnVnX2xvZy5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9jaHJlL2RlYnVnX2xvZy5jYwppbmRleCBiNTk5ZWJlLi45OWY3YzY3IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vY2hyZS9kZWJ1Z19sb2cuY2MKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2NocmUvZGVidWdfbG9nLmNjCkBAIC0yOSw0ICsyOSwxMiBAQAogICB2c25wcmludGZfKGxvZ19idWZmZXIsIGtNYXhMb2dMZW4sIGZvcm1hdCwgYXJncyk7CiAgIGNocmVMb2coQ0hSRV9MT0dfREVCVUcsICJbVEZMX01JQ1JPXSAlcyIsIGxvZ19idWZmZXIpOwogI2VuZGlmCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQorCisjaWZuZGVmIFRGX0xJVEVfU1RSSVBfRVJST1JfU1RSSU5HUworLy8gT25seSBjYWxsZWQgZnJvbSBNaWNyb1ZzbnByaW50ZiAobWljcm9fbG9nLmgpCitleHRlcm4gIkMiIGludCBEZWJ1Z1ZzbnByaW50ZihjaGFyKiBidWZmZXIsIHNpemVfdCBidWZfc2l6ZSwgY29uc3QgY2hhciogZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCB2bGlzdCkgeworICByZXR1cm4gdnNucHJpbnRmXyhidWZmZXIsIGJ1Zl9zaXplLCBmb3JtYXQsIHZsaXN0KTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2NvbXByZXNzaW9uLmggYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vY29tcHJlc3Npb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Mzk2NWMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2NvbXByZXNzaW9uLmgKQEAgLTAsMCArMSw3MCBAQAorLyogQ29weXJpZ2h0IDIwMjQgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpZm5kZWYgVEVOU09SRkxPV19MSVRFX01JQ1JPX01JQ1JPX0NPTVBSRVNTSU9OX0hfCisjZGVmaW5lIFRFTlNPUkZMT1dfTElURV9NSUNST19NSUNST19DT01QUkVTU0lPTl9IXworCisjaWZkZWYgVVNFX1RGTE1fQ09NUFJFU1NJT04KKworI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9jL2NvbW1vbi5oIgorCituYW1lc3BhY2UgdGZsaXRlIHsKKworLy8KKy8vIENvbXByZXNzZWQgdGVuc29ycworLy8KKworc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBrQ29tcHJlc3Npb25NZXRhZGF0YVN0cmluZyA9ICJURkxNX0NPTVBSRVNTSU9OIjsKKworZW51bSBjbGFzcyBDb21wcmVzc2lvblNjaGVtZSA6IHVpbnQ4X3QgeworICBrQmluUXVhbnQsCit9OworCisvLyBUT0RPKGRkYXZpcy0yMDE1KTogcGFjayBzdHJ1Y3QKK3N0cnVjdCBMb29rdXBUYWJsZURhdGEgeworICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWF4Qml0V2lkdGggPSA3OworICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWF4VmFsdWVUYWJsZUNoYW5uZWxTdHJpZGUgPSAxMjg7CisKKyAgY29uc3Qgdm9pZCogdmFsdWVfdGFibGU7ICAgICAgICAgICAgIC8vIFBvaW50ZXIgaW50byBGbGF0QnVmZmVyIFZhbHVlcy4KKyAgdWludDhfdCB2YWx1ZV90YWJsZV9jaGFubmVsX3N0cmlkZTsgIC8vIGVsZW1lbnRzIHBlciBjaGFubmVsCisgIHVpbnQ4X3QgY29tcHJlc3NlZF9iaXRfd2lkdGggOiAzOyAgICAvLyAxIHRvIDcgYml0cworICBib29sIGlzX3Blcl9jaGFubmVsX3F1YW50aXplZCA6IDE7ICAgLy8gdGVuc29yIGlzIHBlci1jaGFubmVsIHF1YW50aXplZAorICBib29sIHVzZV9hbHRlcm5hdGVfYXhpcyA6IDE7ICAgICAgICAgLy8gc2hhcGUgZGVmYXVsdCBjaGFubmVsOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMCA9IGZpcnN0LCAxID0gbGFzdAorICB1aW50OF90IHJlc2VydmVkIDogMzsKK307CisKK3VuaW9uIENvbXByZXNzaW9uRGF0YSB7CisgIExvb2t1cFRhYmxlRGF0YSogbHV0X2RhdGE7Cit9OworCisvLyBUT0RPKGRkYXZpcy0yMDE1KTogcGFjayBzdHJ1Y3QKK3N0cnVjdCBDb21wcmVzc2lvblRlbnNvckRhdGEgeworICBDb21wcmVzc2lvblNjaGVtZSBzY2hlbWU7CisgIENvbXByZXNzaW9uRGF0YSBkYXRhOworfTsKKworLy8gVE9ETyhkZGF2aXMtMjAxNSk6IHBhY2sgc3RydWN0CitzdHJ1Y3QgQ29tcHJlc3NlZFRlbnNvckxpc3QgeworICAvLyBTcGFyc2VseSBwb3B1bGF0ZWQgYXJyYXkgd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMgYXMgdGhlcmUgYXJlCisgIC8vIHRlbnNvcnMgaW4gdGhlIFN1YmdyYXBoLiBBbiBhbHRlcm5hdGl2ZSB3b3VsZCBpbmNsdWRlIGEgdGVuc29yIGluZGV4IGluCisgIC8vIHRoZSBzdHJ1Y3QgZm9yIGVhY2ggYW5kIHdhbGsgdGhlIGxpc3Qgb24gbG9vayB1cC4gVGhpcyBjb3VsZCBiZSBzbG93LgorICBDb21wcmVzc2lvblRlbnNvckRhdGEqKiB0ZW5zb3JzOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQorCisjZW5kaWYgIC8vIFVTRV9URkxNX0NPTVBSRVNTSU9OCisjZW5kaWYgIC8vIFRFTlNPUkZMT1dfTElURV9NSUNST19NSUNST19DT01QUkVTU0lPTl9IXwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2NvcnRleF9tX2NvcnN0b25lXzMwMC9SRUFETUUubWQgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vY29ydGV4X21fY29yc3RvbmVfMzAwL1JFQURNRS5tZAppbmRleCA5NDkzNWFjLi42NjNmNjM2IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vY29ydGV4X21fY29yc3RvbmVfMzAwL1JFQURNRS5tZAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vY29ydGV4X21fY29yc3RvbmVfMzAwL1JFQURNRS5tZApAQCAtMzcsMTIgKzM3LDEyIEBACiBTb21lIGV4YW1wbGVzOgogCiBgYGAKLW1ha2UgLWogLWYgdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvTWFrZWZpbGUgQ09fUFJPQ0VTU09SPWV0aG9zX3UgVEFSR0VUPWNvcnRleF9tX2NvcnN0b25lXzMwMCBUQVJHRVRfQVJDSD1jb3J0ZXgtbTU1IHRlc3RfbmV0d29ya190ZXN0ZXJfdGVzdAotbWFrZSAtaiAtZiB0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9NYWtlZmlsZSBPUFRJTUlaRURfS0VSTkVMX0RJUj1jbXNpc19ubiBUQVJHRVQ9Y29ydGV4X21fY29yc3RvbmVfMzAwIFRBUkdFVF9BUkNIPWNvcnRleC1tNTUgdGVzdF9uZXR3b3JrX3Rlc3Rlcl90ZXN0Ci1tYWtlIC1qIC1mIHRlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL01ha2VmaWxlIENPX1BST0NFU1NPUj1ldGhvc191IE9QVElNSVpFRF9LRVJORUxfRElSPWNtc2lzX25uIFRBUkdFVD1jb3J0ZXhfbV9jb3JzdG9uZV8zMDAgVEFSR0VUX0FSQ0g9Y29ydGV4LW01NSB0ZXN0X25ldHdvcmtfdGVzdGVyX3Rlc3QKLW1ha2UgLWogLWYgdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvTWFrZWZpbGUgVEFSR0VUPWNvcnRleF9tX2NvcnN0b25lXzMwMCBUQVJHRVRfQVJDSD1jb3J0ZXgtbTU1IHRlc3RfbmV0d29ya190ZXN0ZXJfdGVzdAotbWFrZSAtaiAtZiB0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9NYWtlZmlsZSBUQVJHRVQ9Y29ydGV4X21fY29yc3RvbmVfMzAwIFRBUkdFVF9BUkNIPWNvcnRleC1tNTUgdGVzdF9rZXJuZWxfZnVsbHlfY29ubmVjdGVkX3Rlc3QKLW1ha2UgLWogLWYgdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvTWFrZWZpbGUgT1BUSU1JWkVEX0tFUk5FTF9ESVI9Y21zaXNfbm4gVEFSR0VUPWNvcnRleF9tX2NvcnN0b25lXzMwMCBUQVJHRVRfQVJDSD1jb3J0ZXgtbTcrZnAgdGVzdF9rZXJuZWxfZnVsbHlfY29ubmVjdGVkX3Rlc3QKLW1ha2UgLWogLWYgdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvTWFrZWZpbGUgVEFSR0VUPWNvcnRleF9tX2NvcnN0b25lXzMwMCBUQVJHRVRfQVJDSD1jb3J0ZXgtbTMgdGVzdF9rZXJuZWxfZnVsbHlfY29ubmVjdGVkX3Rlc3QKLW1ha2UgLWogLWYgdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvTWFrZWZpbGUgVEFSR0VUPWNvcnRleF9tX2NvcnN0b25lXzMwMCBUQVJHRVRfQVJDSD1jb3J0ZXgtbTU1IEJVSUxEX1RZUEU9cmVsZWFzZV93aXRoX2xvZ3MgVE9PTENIQUlOPWFybWNsYW5nIHRlc3RfbmV0d29ya190ZXN0ZXJfdGVzdAorbWFrZSAtZiB0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9NYWtlZmlsZSBDT19QUk9DRVNTT1I9ZXRob3NfdSBUQVJHRVQ9Y29ydGV4X21fY29yc3RvbmVfMzAwIFRBUkdFVF9BUkNIPWNvcnRleC1tNTUgdGVzdF9uZXR3b3JrX3Rlc3Rlcl90ZXN0CittYWtlIC1mIHRlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL01ha2VmaWxlIE9QVElNSVpFRF9LRVJORUxfRElSPWNtc2lzX25uIFRBUkdFVD1jb3J0ZXhfbV9jb3JzdG9uZV8zMDAgVEFSR0VUX0FSQ0g9Y29ydGV4LW01NSB0ZXN0X25ldHdvcmtfdGVzdGVyX3Rlc3QKK21ha2UgLWYgdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvTWFrZWZpbGUgQ09fUFJPQ0VTU09SPWV0aG9zX3UgT1BUSU1JWkVEX0tFUk5FTF9ESVI9Y21zaXNfbm4gVEFSR0VUPWNvcnRleF9tX2NvcnN0b25lXzMwMCBUQVJHRVRfQVJDSD1jb3J0ZXgtbTU1IHRlc3RfbmV0d29ya190ZXN0ZXJfdGVzdAorbWFrZSAtZiB0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9NYWtlZmlsZSBUQVJHRVQ9Y29ydGV4X21fY29yc3RvbmVfMzAwIFRBUkdFVF9BUkNIPWNvcnRleC1tNTUgdGVzdF9uZXR3b3JrX3Rlc3Rlcl90ZXN0CittYWtlIC1mIHRlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL01ha2VmaWxlIFRBUkdFVD1jb3J0ZXhfbV9jb3JzdG9uZV8zMDAgVEFSR0VUX0FSQ0g9Y29ydGV4LW01NSB0ZXN0X2tlcm5lbF9mdWxseV9jb25uZWN0ZWRfdGVzdAorbWFrZSAtZiB0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9NYWtlZmlsZSBPUFRJTUlaRURfS0VSTkVMX0RJUj1jbXNpc19ubiBUQVJHRVQ9Y29ydGV4X21fY29yc3RvbmVfMzAwIFRBUkdFVF9BUkNIPWNvcnRleC1tNytmcCB0ZXN0X2tlcm5lbF9mdWxseV9jb25uZWN0ZWRfdGVzdAorbWFrZSAtZiB0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9NYWtlZmlsZSBUQVJHRVQ9Y29ydGV4X21fY29yc3RvbmVfMzAwIFRBUkdFVF9BUkNIPWNvcnRleC1tMyB0ZXN0X2tlcm5lbF9mdWxseV9jb25uZWN0ZWRfdGVzdAorbWFrZSAtZiB0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9NYWtlZmlsZSBUQVJHRVQ9Y29ydGV4X21fY29yc3RvbmVfMzAwIFRBUkdFVF9BUkNIPWNvcnRleC1tNTUgQlVJTERfVFlQRT1yZWxlYXNlX3dpdGhfbG9ncyBUT09MQ0hBSU49YXJtY2xhbmcgdGVzdF9uZXR3b3JrX3Rlc3Rlcl90ZXN0CiBgYGAKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9jb3J0ZXhfbV9jb3JzdG9uZV8zMDAvc3lzdGVtX3NldHVwLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2NvcnRleF9tX2NvcnN0b25lXzMwMC9zeXN0ZW1fc2V0dXAuY2MKaW5kZXggOTVhMTFiMi4uNjQ3MzM0MCAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2NvcnRleF9tX2NvcnN0b25lXzMwMC9zeXN0ZW1fc2V0dXAuY2MKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2NvcnRleF9tX2NvcnN0b25lXzMwMC9zeXN0ZW1fc2V0dXAuY2MKQEAgLTEsNCArMSw0IEBACi0vKiBDb3B5cmlnaHQgMjAyMiBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLyogQ29weXJpZ2h0IDIwMjQgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIAogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCwzMyArMTQsOTAgQEAKID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKICNpZmRlZiBFVEhPU19VCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKwogI2luY2x1ZGUgImV0aG9zdV9kcml2ZXIuaCIKKyNpbmNsdWRlICJwbXVfZXRob3N1LmgiCiAjZW5kaWYKIAogLy8gVGhpcyBpcyBzZXQgaW4gbWljcm8vdG9vbHMvbWFrZS90YXJnZXRzL2NvcnRleF9tX2NvcnN0b25lXzMwMF9tYWtlZmlsZS5pbmMuCi0vLyBJdCBpcyBuZWVkZWQgZm9yIHRoZSBjYWxscyB0byBOVklDX1NldFZlY3RvcigpL05WSUNfRW5hYmxlSVIoKSBhbmQgZm9yIHRoZQotLy8gRFdUIGFuZCBQTVUgY291bnRlcnMuCisvLyBJdCBpcyBuZWVkZWQgZm9yIHRoZSBjYWxscyB0byBOVklDX1NldFZlY3RvcigpL05WSUNfRW5hYmxlSVIoKSwKICNpbmNsdWRlIENNU0lTX0RFVklDRV9BUk1fQ09SVEVYX01fWFhfSEVBREVSX0ZJTEUKIAogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19sb2cuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fdGltZS5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9zeXN0ZW1fc2V0dXAuaCIKIAorI2lmZGVmIEVUSE9TX1UKKworYm9vbCBucHVQbXVDeWNsZUNvdW50ZXJJc1NldDsKK3VpbnQ2NF90IG5wdVBtdUN5Y2xlQ291bnRlcjsKKworZXh0ZXJuICJDIiB7Cit2b2lkIGV0aG9zdV9pbmZlcmVuY2VfYmVnaW4oc3RydWN0IGV0aG9zdV9kcml2ZXIqIGRydiwgdm9pZCogdXNlckFyZykgeworICAvLyBFbmFibGUgUE1VCisgIEVUSE9TVV9QTVVfRW5hYmxlKGRydik7CisKKyAgLy8gRW5hYmxlIGN5Y2xlIGNvdW50ZXIKKyAgRVRIT1NVX1BNVV9QTUNDTlRSX0NGR19TZXRfU3RvcF9FdmVudChkcnYsIEVUSE9TVV9QTVVfTlBVX0lETEUpOworICBFVEhPU1VfUE1VX1BNQ0NOVFJfQ0ZHX1NldF9TdGFydF9FdmVudChkcnYsIEVUSE9TVV9QTVVfTlBVX0FDVElWRSk7CisgIEVUSE9TVV9QTVVfQ05UUl9FbmFibGUoZHJ2LCBFVEhPU1VfUE1VX0NDTlRfTXNrKTsKKyAgRVRIT1NVX1BNVV9DWUNDTlRfUmVzZXQoZHJ2KTsKKworICAvLyBSZXNldCBhbGwgY291bnRlcnMKKyAgRVRIT1NVX1BNVV9FVkNOVFJfQUxMX1Jlc2V0KGRydik7Cit9CisKK3ZvaWQgZXRob3N1X2luZmVyZW5jZV9lbmQoc3RydWN0IGV0aG9zdV9kcml2ZXIqIGRydiwgdm9pZCogdXNlckFyZykgeworICAvLyBTYXZlIGN5Y2xlIGNvdW50ZXIKKyAgbnB1UG11Q3ljbGVDb3VudGVyICs9IEVUSE9TVV9QTVVfR2V0X0NDTlRSKGRydik7CisgIG5wdVBtdUN5Y2xlQ291bnRlcklzU2V0ID0gdHJ1ZTsKKworICAvLyBEaXNhYmxlIFBNVQorICBFVEhPU1VfUE1VX0Rpc2FibGUoZHJ2KTsKK30KK30KKyNlbmRpZgorCiBuYW1lc3BhY2UgdGZsaXRlIHsKIAogbmFtZXNwYWNlIHsKKyNpZmRlZiBFVEhPU19VCitjb25zdGV4cHIgdWludDMyX3Qga0Nsb2Nrc1BlclNlY29uZCA9IDIwMGU2OworI2Vsc2UKIGNvbnN0ZXhwciB1aW50MzJfdCBrQ2xvY2tzUGVyU2Vjb25kID0gMjVlNjsKKyNlbmRpZgogfSAgLy8gbmFtZXNwYWNlCiAKIHVpbnQzMl90IHRpY2tzX3Blcl9zZWNvbmQoKSB7IHJldHVybiBrQ2xvY2tzUGVyU2Vjb25kOyB9CiAKIHVpbnQzMl90IEdldEN1cnJlbnRUaW1lVGlja3MoKSB7Ci0jaWYgKCFkZWZpbmVkKFRGX0xJVEVfU1RSSVBfRVJST1JfU1RSSU5HUykgJiYgIWRlZmluZWQoQVJNQ00wKSkKKyNpZiAoIWRlZmluZWQoVEZfTElURV9TVFJJUF9FUlJPUl9TVFJJTkdTKSkKKyNpZmRlZiBFVEhPU19VCisgIHVpbnQzMl90IHRpY2tzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG5wdVBtdUN5Y2xlQ291bnRlcik7CisKKyAgLy8gTm90ZSBjeWNsZSBjb3VudGVyIHdpbGwgYmUgcmVzZXQgaGVyZSBmb3IgbmV4dCBpdGVyYXRpb24KKyAgaWYgKG5wdVBtdUN5Y2xlQ291bnRlcklzU2V0KSB7CisgICAgbnB1UG11Q3ljbGVDb3VudGVyID0gMDsKKyAgICBucHVQbXVDeWNsZUNvdW50ZXJJc1NldCA9IGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRpY2tzOworI2Vsc2UKKworI2lmIGRlZmluZWQoQVJNQ00wKQorICByZXR1cm4gMDsKKyNlbHNlCiAjaWZkZWYgQVJNQ001NQogICByZXR1cm4gQVJNX1BNVV9HZXRfQ0NOVFIoKTsKICNlbHNlCiAgIHJldHVybiBEV1QtPkNZQ0NOVDsKICNlbmRpZgorI2VuZGlmCisKKyNlbmRpZgogI2Vsc2UKICAgcmV0dXJuIDA7CiAjZW5kaWYKQEAgLTg4LDE0ICsxNDUsMTcgQEAKICNpZmRlZiBFVEhPU19VCiAgIGNvbnN0ZXhwciBpbnQgZXRob3N1X2Jhc2VfYWRkcmVzcyA9IDB4NDgxMDIwMDA7CiAgIGNvbnN0ZXhwciBpbnQgZXRob3N1X2lycSA9IDU2OworICBjb25zdGV4cHIgaW50IGV0aG9zdV9pcnFfcHJpb3JpdHkgPSA1OwogCiAgIC8vIEluaXRpYWxpemUgRXRob3MtVSBOUFUgZHJpdmVyLgogICBpZiAoZXRob3N1X2luaXQoJmV0aG9zdTBfZHJpdmVyLCByZWludGVycHJldF9jYXN0PHZvaWQqPihldGhvc3VfYmFzZV9hZGRyZXNzKSwKICAgICAgICAgICAgICAgICAgIGV0aG9zdTBfc2NyYXRjaCwgRVRIT1NVX0ZBU1RfTUVNT1JZX1NJWkUsIDEsIDEpKSB7CiAgICAgTWljcm9QcmludGYoIkZhaWxlZCB0byBpbml0aWFsaXplIEV0aG9zLVUgZHJpdmVyIik7CisgICAgcmV0dXJuOwogICB9CiAgIE5WSUNfU2V0VmVjdG9yKHN0YXRpY19jYXN0PElSUW5fVHlwZT4oZXRob3N1X2lycSksCiAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkmZXRob3N1SXJxSGFuZGxlcjApOworICBOVklDX1NldFByaW9yaXR5KHN0YXRpY19jYXN0PElSUW5fVHlwZT4oZXRob3N1X2lycSksIGV0aG9zdV9pcnFfcHJpb3JpdHkpOwogICBOVklDX0VuYWJsZUlSUShzdGF0aWNfY2FzdDxJUlFuX1R5cGU+KGV0aG9zdV9pcnEpKTsKICNlbmRpZgogfQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2NvcnRleF9tX2dlbmVyaWMvZGVidWdfbG9nLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2NvcnRleF9tX2dlbmVyaWMvZGVidWdfbG9nLmNjCmluZGV4IDJjMjM3ZmUuLmI3MTgyYTUgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9jb3J0ZXhfbV9nZW5lcmljL2RlYnVnX2xvZy5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vY29ydGV4X21fZ2VuZXJpYy9kZWJ1Z19sb2cuY2MKQEAgLTE2LDE2ICsxNiwxNiBAQAogLy8gSW1wbGVtZW50YXRpb24gZm9yIHRoZSBEZWJ1Z0xvZygpIGZ1bmN0aW9uIHRoYXQgcHJpbnRzIHRvIHRoZSBkZWJ1ZyBsb2dnZXIgb24KIC8vIGFuIGdlbmVyaWMgQ29ydGV4LU0gZGV2aWNlLgogCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2RlYnVnX2xvZy5oIgorCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmICAvLyBfX2NwbHVzcGx1cwogCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2RlYnVnX2xvZy5oIgotCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2NvcnRleF9tX2dlbmVyaWMvZGVidWdfbG9nX2NhbGxiYWNrLmgiCiAKICNpZm5kZWYgVEZfTElURV9TVFJJUF9FUlJPUl9TVFJJTkdTCi0jaW5jbHVkZSAiZXlhbHJvel9wcmludGYvc3JjL3ByaW50Zi9wcmludGYuaCIKKyNpbmNsdWRlIDxzdGRpby5oPgogI2VuZGlmCiAKIHN0YXRpYyBEZWJ1Z0xvZ0NhbGxiYWNrIGRlYnVnX2xvZ19jYWxsYmFjayA9IG51bGxwdHI7CkBAIC00OSwxMSArNDksMTkgQEAKICAgY29uc3RleHByIGludCBrTWF4TG9nTGVuID0gMjU2OwogICBjaGFyIGxvZ19idWZmZXJba01heExvZ0xlbl07CiAKLSAgdnNucHJpbnRmXyhsb2dfYnVmZmVyLCBrTWF4TG9nTGVuLCBmb3JtYXQsIGFyZ3MpOworICB2c25wcmludGYobG9nX2J1ZmZlciwga01heExvZ0xlbiwgZm9ybWF0LCBhcmdzKTsKICAgSW52b2tlRGVidWdMb2dDYWxsYmFjayhsb2dfYnVmZmVyKTsKICNlbmRpZgogfQogCisjaWZuZGVmIFRGX0xJVEVfU1RSSVBfRVJST1JfU1RSSU5HUworLy8gT25seSBjYWxsZWQgZnJvbSBNaWNyb1ZzbnByaW50ZiAobWljcm9fbG9nLmgpCitpbnQgRGVidWdWc25wcmludGYoY2hhciogYnVmZmVyLCBzaXplX3QgYnVmX3NpemUsIGNvbnN0IGNoYXIqIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICB2YV9saXN0IHZsaXN0KSB7CisgIHJldHVybiB2c25wcmludGYoYnVmZmVyLCBidWZfc2l6ZSwgZm9ybWF0LCB2bGlzdCk7Cit9CisjZW5kaWYKKwogI2lmZGVmIF9fY3BsdXNwbHVzCiB9ICAvLyBleHRlcm4gIkMiCiAjZW5kaWYgIC8vIF9fY3BsdXNwbHVzCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZGVidWdfbG9nLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2RlYnVnX2xvZy5jYwppbmRleCBhOGVmMzZiLi45ODIzMTk2IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZGVidWdfbG9nLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9kZWJ1Z19sb2cuY2MKQEAgLTQ0LDMgKzQ0LDExIEBACiAgIHZmcHJpbnRmKHN0ZGVyciwgZm9ybWF0LCBhcmdzKTsKICNlbmRpZgogfQorCisjaWZuZGVmIFRGX0xJVEVfU1RSSVBfRVJST1JfU1RSSU5HUworLy8gT25seSBjYWxsZWQgZnJvbSBNaWNyb1ZzbnByaW50ZiAobWljcm9fbG9nLmgpCitleHRlcm4gIkMiIGludCBEZWJ1Z1ZzbnByaW50ZihjaGFyKiBidWZmZXIsIHNpemVfdCBidWZfc2l6ZSwgY29uc3QgY2hhciogZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCB2bGlzdCkgeworICByZXR1cm4gdnNucHJpbnRmKGJ1ZmZlciwgYnVmX3NpemUsIGZvcm1hdCwgdmxpc3QpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZGVidWdfbG9nLmggYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZGVidWdfbG9nLmgKaW5kZXggYzBjZjY5OS4uNmUyZTY5ZSAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2RlYnVnX2xvZy5oCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9kZWJ1Z19sb2cuaApAQCAtMTcsMTkgKzE3LDIzIEBACiAKICNpZmRlZiBfX2NwbHVzcGx1cwogI2luY2x1ZGUgPGNzdGRhcmc+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KICNlbHNlCiAjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CiAjZW5kaWYgIC8vIF9fY3BsdXNwbHVzCiAKICNpZmRlZiBfX2NwbHVzcGx1cwogZXh0ZXJuICJDIiB7CiAjZW5kaWYgIC8vIF9fY3BsdXNwbHVzCiAKLS8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IGVhY2ggdGFyZ2V0IHBsYXRmb3JtLCBhbmQgcHJvdmlkZSBhCisvLyBUaGVzZSBmdW5jdGlvbnMgc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IGVhY2ggdGFyZ2V0IHBsYXRmb3JtLCBhbmQgcHJvdmlkZSBhCiAvLyB3YXkgZm9yIHN0cmluZ3MgdG8gYmUgb3V0cHV0IHRvIHNvbWUgdGV4dCBzdHJlYW0uIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUKLS8vIHRoZSB0ZW5zb3JmbG93L2xpdGUvbWljcm8vZGVidWdfbG9nLmNjIGZpbGUuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBzdXBwb3J0CisvLyB0aGUgdGVuc29yZmxvdy9saXRlL21pY3JvL2RlYnVnX2xvZy5jYyBmaWxlLiAgVGhlc2UgZnVuY3Rpb25zIHNob3VsZCBzdXBwb3J0CiAvLyBzdGFuZGFyZCBDL0MrKyBzdGRpbyBzdHlsZSBmb3JtYXR0aW5nIG9wZXJhdGlvbnMuCiB2b2lkIERlYnVnTG9nKGNvbnN0IGNoYXIqIGZvcm1hdCwgdmFfbGlzdCBhcmdzKTsKK2ludCBEZWJ1Z1ZzbnByaW50ZihjaGFyKiBidWZmZXIsIHNpemVfdCBidWZfc2l6ZSwgY29uc3QgY2hhciogZm9ybWF0LAorICAgICAgICAgICAgICAgICAgIHZhX2xpc3Qgdmxpc3QpOwogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9kb2NzL25ld19wbGF0Zm9ybV9zdXBwb3J0Lm1kIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2RvY3MvbmV3X3BsYXRmb3JtX3N1cHBvcnQubWQKaW5kZXggNjkyZDk4ZS4uODc1MmM4YiAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2RvY3MvbmV3X3BsYXRmb3JtX3N1cHBvcnQubWQKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2RvY3MvbmV3X3BsYXRmb3JtX3N1cHBvcnQubWQKQEAgLTI1LDcgKzI1LDcgQEAKIFByaW9yIHRvIGludGVncmF0aW5nIFRGTE0gd2l0aCBhIHNwZWNpZmljIGhhcmR3YXJlIGludm9sdmVzIHRhc2tzIHRoYXQgaXMKIG91dHNpZGUgdGhlIHNjb3BlIG9mIHRoZSBURkxNIHByb2plY3QsIGluY2x1ZGluZzoKIAotICogVG9vbGNoYWluIHNldHVwIC0gVEZMTSByZXF1aXJlcyBzdXBwb3J0IGZvciBDKysxMQorICogVG9vbGNoYWluIHNldHVwIC0gVEZMTSByZXF1aXJlcyBzdXBwb3J0IGZvciBDKysxNwogICogU2V0IHVwIGFuZCBpbnN0YWxsYXRpb24gb2YgYm9hcmQtc3BlY2lmaWMgU0RLcyBhbmQgSURFcwogICogQ29tcGlsZXIgZmxhZ3MgYW5kIExpbmtlciBzZXR1cAogICogSW50ZWdyYXRpbmcgcGVyaXBoZXJhbHMgc3VjaCBhcyBjYW1lcmFzLCBtaWNyb3Bob25lcyBhbmQgYWNjZWxlcm9tZXRlcnMgdG8KQEAgLTc3LDcgKzc3LDcgQEAKIHRoYXQgd2hlbiBsaW5raW5nIFRGTE0gaW50byBhIGJpbmFyeSwgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgZnVuY3Rpb25zIGluCiBbZGVidWdcX2xvZy5oXShodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmxpdGUtbWljcm8vYmxvYi9tYWluL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9kZWJ1Z19sb2cuaCksCiBbbWljcm9cX3RpbWUuaF0oaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZsaXRlLW1pY3JvL2Jsb2IvbWFpbi90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fdGltZS5oKQotYW5kIFtzeXN0ZW1cX3NldHVwLmhdKGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmbGl0ZS1taWNyby9ibG9iL21haW4vdGVuc29yZmxvdy9saXRlL21pY3JvL2RlYnVnX2xvZy5oKQorYW5kIFtzeXN0ZW1cX3NldHVwLmhdKGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmbGl0ZS1taWNyby9ibG9iL21haW4vdGVuc29yZmxvdy9saXRlL21pY3JvL3N5c3RlbV9zZXR1cC5oKQogY2FuIGJlIGZvdW5kLgogCiBGb3IgZXhhbXBsZSwgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGVzZSBmdW5jdGlvbnMgZm9yOgpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2RvY3Mvb3B0aW1pemVkX2tlcm5lbF9pbXBsZW1lbnRhdGlvbnMubWQgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZG9jcy9vcHRpbWl6ZWRfa2VybmVsX2ltcGxlbWVudGF0aW9ucy5tZAppbmRleCA0YTVjODFhLi44ZWVmYjU1IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZG9jcy9vcHRpbWl6ZWRfa2VybmVsX2ltcGxlbWVudGF0aW9ucy5tZAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZG9jcy9vcHRpbWl6ZWRfa2VybmVsX2ltcGxlbWVudGF0aW9ucy5tZApAQCAtMTY5LDYgKzE2OSwxMiBAQAogICAgICogICBCdWlsZCBhIHN0YXRpYyBsaWJ0ZW5zb3JmbG93LW1pY3JvbGl0ZS5hIHVzaW5nIHRoZSBURkxNIG1ha2VmaWxlIHdpdGg6CiAgICAgICAgIGBtYWtlIC1mIHRlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL01ha2VmaWxlIFRBUkdFVD08dGFyZ2V0PgogICAgICAgICBPUFRJTUlaRURfS0VSTkVMX0RJUj08b3B0aW1pemVfZGlyPiBtaWNyb2xpdGVgCisgICAgKiAgIE9wdGlvbmFsbHkgYnVpbGQgZm9yIHNpemUgb3Igc3BlZWQuIFRyYW5zbGF0ZWQgdG8gYSB2YWxpZCBtYWtlIGNvbW1hbmQgaXQgd2lsbCBiZSBhbnkgb2YgdGhlc2UgdHdvOgorICAgICAgICBgbWFrZSAtZiB0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9NYWtlZmlsZSBUQVJHRVQ9PHRhcmdldD4KKyAgICAgICAgT1BUSU1JWkVEX0tFUk5FTF9ESVI9PG9wdGltaXplX2Rpcj4gT1BUSU1JWkVfS0VSTkVMU19GT1I9S0VSTkVMU19PUFRJTUlaRURfRk9SX1NJWkUgbWljcm9saXRlYAorICAgICAgICBgbWFrZSAtZiB0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9NYWtlZmlsZSBUQVJHRVQ9PHRhcmdldD4KKyAgICAgICAgT1BUSU1JWkVEX0tFUk5FTF9ESVI9PG9wdGltaXplX2Rpcj4gT1BUSU1JWkVfS0VSTkVMU19GT1I9S0VSTkVMU19PUFRJTUlaRURfRk9SX1NQRUVEIG1pY3JvbGl0ZWAKKyAgICAgICAgQ2hlY2sgcmVsZXZhbnQgUkVBRE1FIGZvciBnaXZlbiBvcHRpbWl6YXRpb24gbGlicmFyeSBpZiB0aGlzIGlzIGFwcGxpY2FibGUuCiAgICAgKiAgIFVzZSB0aGUgc3RhdGljIGxpYnJhcnkgYW5kIGFueSBURkxNIGhlYWRlcnMgYXMgcGFydCBvZiB0aGUgb3ZlcmFsbAogICAgICAgICBhcHBsaWNhdGlvbiAod2l0aCBpdHMgb3duIGJ1aWxkIHN5c3RlbSkuCiAKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9kdGxuL01ha2VmaWxlLmluYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9kdGxuL01ha2VmaWxlLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODhjZjA5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL2R0bG4vTWFrZWZpbGUuaW5jCkBAIC0wLDAgKzEsMzAgQEAKKworRFRMTl9URVNUX1NSQ1MgOj0gXAorJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL2R0bG4vZHRsbl90ZXN0LmNjIFwKKyQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9kdGxuL2R0bG5faW5vdXRfZGF0YS5jYworCitEVExOX1RFU1RfSERSUyA6PSBcCiskKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvZHRsbi9kdGxuX2lub3V0X2RhdGEuaAorCitEVExOX0dFTkVSQVRPUl9JTlBVVFMgOj0gXAorJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL2R0bG4vZHRsbl9ub2lzZV9zdXBwcmVzc2lvbi50ZmxpdGUKKworRFRMTl9HRU5FUkFURURfU1JDUyA6PSBcCiskKEdFTkVSQVRFRF9TUkNTX0RJUikkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvZHRsbi9kdGxuX25vaXNlX3N1cHByZXNzaW9uX21vZGVsX2RhdGEuY2MKKworRFRMTl9HRU5FUkFURURfSERSUyA6PSBcCiskKEdFTkVSQVRFRF9TUkNTX0RJUikkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvZHRsbi9kdGxuX25vaXNlX3N1cHByZXNzaW9uX21vZGVsX2RhdGEuaAorCisjRmluZCBhbnkgcGxhdGZvcm0gLSBzcGVjaWZpYyBydWxlcyBmb3IgdGhpcyBleGFtcGxlLgoraW5jbHVkZSAkKHdpbGRjYXJkICQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9kdGxuLyovTWFrZWZpbGUuaW5jKQorCisjIFRPRE8oYi8xNjE0ODkyNTIpOiBEaXNhYmxpbmcgd2FybmluZ3MgZm9yIHRoaXMgZXhhbXBsZSB1bnRpbCB3ZSBoYXZlIGEgYmV0dGVyCisjIHdheSB0byBidWlsZCB0aGlyZF9wYXJ0eSBjb2RlIHdpdGggYSByZWR1Y2VkIGxpc3Qgb2YgQ0ZMQUdTLgorQ0NGTEFHUyA6PSAkKGZpbHRlci1vdXQgJChDQ19XQVJOSU5HUyksJChDQ0ZMQUdTKSkKKworIyBUZXN0cyBsb2FkaW5nIGFuZCBydW5uaW5nIGEgZHRsbiBtb2RlbC4KKyMgVE9ETyhiLzMxOTcxMjI0Nik6IFJlLWVuYWJsZSB0ZXN0cyBvbmNlIHRoZSBkdGxuX3Rlc3Qgd29ya3Mgb24gSGlGaSBNaW5pICYgVlA2CitpZm5lcSAoJChUQVJHRVRfQVJDSCksICQoZmlsdGVyICQoVEFSR0VUX0FSQ0gpLCBoaWZpbWluaSB2aXNpb25fcDYpKQorICAkKGV2YWwgJChjYWxsIG1pY3JvbGl0ZV90ZXN0LGR0bG5fdGVzdCxcCisgICQoRFRMTl9URVNUX1NSQ1MpLCQoRFRMTl9URVNUX0hEUlMpLCQoRFRMTl9HRU5FUkFUT1JfSU5QVVRTKSkpCitlbmRpZgpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL2R0bG4vUkVBRE1FLm1kIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL2R0bG4vUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViOTZiMGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvZHRsbi9SRUFETUUubWQKQEAgLTAsMCArMSwyMyBAQAorIyBEVExOIGV4YW1wbGUKK1RoZSBEVExOIGV4YW1wbGUgaXMgYSBkZW1vbnN0cmF0aW9uIG9mIERUTE4gbmV0d29yayBydW5uaW5nIG9uIEhpRmkgRFNQIGZvciBOb2lzZSBzdXBwcmVzc2lvbiBpbiBzcGVlY2guCitJdCB1c2VzIGZlYXR1cmVfZGF0YSBhcyBpbnB1dCBhbmQgcHJvdmlkZXMgbm9pc2Ugc3VwcHJlc3NlZCBzcGVlY2ggYXMgb3V0cHV0LgorSXQgaXMgYmFzZWQgb24gdGhlIHBhcGVyKGh0dHBzOi8vZ2l0aHViLmNvbS9icmVpemhuL0RUTE4pLgorV2hpbGUgcGFwZXIgcHJlc2VudHMgMiBwYXJ0cywgb25lIGZvciBub2lzZSBzdXBwcmVzc2lvbiBhbmQgdGhlIG90aGVyIGZvciBzcGVlY2ggZW5oYW5jZW1lbnQsIAordGhlIGV4YW1wbGUgcHJlc2VudGVkIGhlcmUgZm9sbG93cyB0aGUgbm9pc2Ugc3VwcHJlc3Npb24gcGFydCBvbmx5LgorVGhlIG1vZGVsIHdhcyByZS10cmFpbmVkIGJ5IENhZGVuY2UgdXNpbmcgdGhlIEROUyBjaGFsbGVuZ2UgZGF0YSAoaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9ETlMtQ2hhbGxlbmdlKSAKK2FuZCB0aGUgbm9pc2Ugc3VwcHJlc3Npb24gcGFydCB3YXMgOC1iaXQgcXVhbnRpemVkLiAKK1RoaXMgZXhhbXBsZSBpcyBub3QgdG8gYmUgdXNlZCB0byBldmFsdWF0ZSB0aGUgbmV0d29yayBxdWFsaXR5IG9yIHF1YWxpdHkgb2Ygbm9pc2Ugc3VwcHJlc3Npb24sIGJ1dCBvbmx5IGFzIGEgZGVtb25zdHJhdGlvbiBhcyBzdGF0ZWQgYWJvdmUuCisKKyMjIFJ1biB0aGUgdGVzdHMgb24gYSBkZXZlbG9wbWVudCBtYWNoaW5lCisKK2BgYAorbWFrZSAtZiB0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9NYWtlZmlsZSB0aGlyZF9wYXJ0eV9kb3dubG9hZHMKK21ha2UgLWYgdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvTWFrZWZpbGUgdGVzdF9kdGxuX3Rlc3QKK2BgYAorCitZb3Ugc2hvdWxkIHNlZSBhIHNlcmllcyBvZiBmaWxlcyBnZXQgY29tcGlsZWQsIGZvbGxvd2VkIGJ5IHNvbWUgbG9nZ2luZyBvdXRwdXQKK2Zyb20gYSB0ZXN0LCB3aGljaCBzaG91bGQgY29uY2x1ZGUgd2l0aCBgfn5+QUxMIFRFU1RTIFBBU1NFRH5+fmAuIElmIHlvdSBzZWUKK3RoaXMsIGl0IG1lYW5zIHRoYXQgYSBzbWFsbCBwcm9ncmFtIGhhcyBiZWVuIGJ1aWx0IGFuZCBydW4gdGhhdCBsb2FkcyBhIHRyYWluZWQKK1RlbnNvckZsb3cgbW9kZWwsIHJ1bnMgd2l0aCBmZWF0dXJlcyBkYXRhLCBhbmQgZ290IHRoZSBleHBlY3RlZAorb3V0cHV0cy4gVGhpcyBwYXJ0aWN1bGFyIHRlc3QgcnVucyB3aXRoIGEgZmVhdHVyZSBkYXRhIGFzIGlucHV0LAorYW5kIHZhbGlkYXRlIHRoZSBvdXRwdXQgd2l0aCBnb2xkZW4gcmVmZXJlbmNlIG91dHB1dC4KZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9kdGxuL2R0bG5faW5vdXRfZGF0YS5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9kdGxuL2R0bG5faW5vdXRfZGF0YS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDY1MmE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL2R0bG4vZHRsbl9pbm91dF9kYXRhLmNjCkBAIC0wLDAgKzEsNjAgQEAKKy8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2MvY29tbW9uLmgiCisKK2ludDhfdCBmZWF0dXJlX2RhdGFbXSA9IHsKKyAgICAtMTI3LCAtMTI2LCAtMTE1LCAtODIsICAtOTAsICAtMTEzLCAtMTUsICAxMywgICAtODcsICAtMTA1LCAtNzcsICAtMTA2LAorICAgIC0xMTMsIC04MSwgIC05MCwgIC0xMjMsIC0xMTMsIC0xMTIsIC0xMjQsIC0xMjAsIC0xMTQsIC0xMjMsIC0xMjMsIC0xMTIsCisgICAgLTExNSwgLTEyNSwgLTEyMCwgLTEyMCwgLTEyNiwgLTEyNiwgLTEyNiwgLTEyNywgLTEyOCwgLTEyNywgLTEyOCwgLTEyOCwKKyAgICAtMTI3LCAtMTI3LCAtMTI4LCAtMTI2LCAtMTI1LCAtMTI2LCAtMTI3LCAtMTI3LCAtMTI3LCAtMTI4LCAtMTI2LCAtMTI3LAorICAgIC0xMjgsIC0xMjcsIC0xMjcsIC0xMjgsIC0xMjcsIC0xMjYsIC0xMjcsIC0xMjgsIC0xMjcsIC0xMjcsIC0xMjcsIC0xMjQsCisgICAgLTEyNCwgLTEyNywgLTEyNiwgLTEyNiwgLTEyNywgLTEyNiwgLTEyNCwgLTEyNSwgLTEyOCwgLTEyNiwgLTEyNSwgLTEyNywKKyAgICAtMTI2LCAtMTI2LCAtMTI3LCAtMTI3LCAtMTI2LCAtMTI2LCAtMTI3LCAtMTI2LCAtMTI2LCAtMTI3LCAtMTI2LCAtMTI1LAorICAgIC0xMjcsIC0xMjYsIC0xMjMsIC0xMjQsIC0xMjYsIC0xMjYsIC0xMjYsIC0xMjgsIC0xMjcsIC0xMjcsIC0xMjcsIC0xMjgsCisgICAgLTEyNywgLTEyNywgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyNywgLTEyOCwgLTEyOCwgLTEyNywgLTEyOCwKKyAgICAtMTI4LCAtMTI3LCAtMTI3LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAorICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCisgICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKKyAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAorICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCisgICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyNywgLTEyNywgLTEyNywgLTEyNywgLTEyNywKKyAgICAtMTI3LCAtMTI3LCAtMTI3LCAtMTI4LCAtMTI3LCAtMTI3LCAtMTI3LCAtMTI3LCAtMTI2LCAtMTI3LCAtMTI3LCAtMTI3LAorICAgIC0xMjcsIC0xMjcsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCisgICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKKyAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAorICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCisgICAgLTEyOCwgLTEyNywgLTEyOCwgLTEyOCwgLTEyNywgLTEyNywgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKKyAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4fTsKKworaW50OF90IGdvbGRlbl9yZWZbXSA9IHsKKyAgICAxMTksIDgyLCAgNzIsICAxMTYsIC01LCAgMTAsICAtMiwgIDAsICAgLTIsICAzNiwgIDExNiwgMTI1LCAxMjMsIDEyNCwgMTI2LAorICAgIDEyNCwgMTE1LCAxMTYsIDEyNCwgMTI2LCAxMjEsIDEyNCwgMTIxLCAxMDQsIDEwNCwgMTEzLCAxMTMsIDExMCwgMTE1LCAxMDEsCisgICAgOTYsICAxMTksIDEyMCwgMTE3LCAxMTgsIDExNCwgMTA0LCAxMTAsIDExOCwgMTE5LCAxMTEsIDExNCwgMTE5LCAxMTcsIDExNCwKKyAgICAxMTAsIDExNywgMTEyLCAxMTUsIDEyMCwgMTE5LCAxMTgsIDExOSwgMTE2LCAxMTcsIDEyMCwgMTIxLCAxMjEsIDEyMSwgMTE5LAorICAgIDExNywgMTIwLCAxMjEsIDEyMCwgMTE4LCAxMTUsIDExNCwgMTE0LCAxMTcsIDExOSwgMTEzLCAxMDgsIDEwOCwgMTExLCAxMTIsCisgICAgMTE0LCAxMTQsIDExNiwgMTE1LCAxMTIsIDExMCwgMTEzLCAxMTMsIDExMCwgMTA3LCA5OCwgIDEwMiwgMTAxLCAxMDEsIDEwMywKKyAgICA5MiwgIDk4LCAgMTAxLCAxMDIsIDEwMiwgMTAxLCAxMDQsIDEwMiwgMTAxLCAxMDEsIDEwMCwgMTAyLCA5OCwgIDEwNCwgMTAwLAorICAgIDk5LCAgOTIsICA5NiwgIDg3LCAgOTcsICA5NiwgIDk2LCAgOTYsICA5NSwgIDkyLCAgOTgsICA5NSwgIDkwLCAgODUsICA4MiwKKyAgICA4NywgIDgyLCAgODIsICA4OSwgIDkwLCAgODMsICA4NiwgIDg1LCAgODAsICA4NiwgIDg3LCAgOTEsICA4OSwgIDg3LCAgODcsCisgICAgODUsICA4MiwgIDc0LCAgODAsICA4MCwgIDcyLCAgNzksICA3NCwgIDc5LCAgODIsICA4MywgIDc3LCAgODUsICA3MSwgIDc2LAorICAgIDcyLCAgNzYsICA3NiwgIDc3LCAgNTYsICA3NCwgIDc0LCAgNjksICA2OSwgIDY5LCAgNjUsICA1NiwgIDYwLCAgNjcsICA3MSwKKyAgICA2OSwgIDc0LCAgNjcsICA3MSwgIDY1LCAgNzcsICA3NiwgIDc5LCAgNjcsICA3MiwgIDYxLCAgNjAsICA2NywgIDY5LCAgNzEsCisgICAgNzcsICA2MywgIDYzLCAgNjAsICA2MywgIDcxLCAgODAsICA4MCwgIDc0LCAgNzYsICA2NywgIDc0LCAgNjMsICA2NywgIDY5LAorICAgIDcyLCAgNzcsICA3MSwgIDcyLCAgODIsICA2NSwgIDQ5LCAgNjcsICA1OCwgIDcxLCAgNjUsICA2MywgIDY5LCAgNjEsICA3NywKKyAgICA2MywgIDY1LCAgNjUsICA2OSwgIDY5LCAgNjUsICA3MiwgIDc3LCAgODAsICA2MCwgIDc5LCAgNzcsICA3MSwgIDY3LCAgNzksCisgICAgNjksICA2NywgIDY1LCAgNzQsICA2OSwgIDcxLCAgNjcsICA3NiwgIDc3LCAgNzcsICA3NywgIDgzLCAgNjcsICA2NSwgIDc5LAorICAgIDc3LCAgNjAsICA3MSwgIDg2LCAgODYsICA2MywgIDc0LCAgNjMsICA2MywgIDYzLCAgNjksICA3OSwgIDYzLCAgNTIsICA4NSwKKyAgICA4NywgIDg2fTsKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL3NpbXBsZV9tb2RlbF9zZXR0aW5ncy5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9kdGxuL2R0bG5faW5vdXRfZGF0YS5oCnNpbWlsYXJpdHkgaW5kZXggNjklCnJlbmFtZSBmcm9tIHRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL3NpbXBsZV9tb2RlbF9zZXR0aW5ncy5jYwpyZW5hbWUgdG8gdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL2R0bG4vZHRsbl9pbm91dF9kYXRhLmgKaW5kZXggZTJjZjY2MS4uYzVmZGU0NiAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9zaW1wbGVfZmVhdHVyZXMvc2ltcGxlX21vZGVsX3NldHRpbmdzLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9kdGxuL2R0bG5faW5vdXRfZGF0YS5oCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IDIwMTggVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAKIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTMsMTEgKzEzLDcgQEAKIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KIAotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL3NpbXBsZV9tb2RlbF9zZXR0aW5ncy5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9jL2NvbW1vbi5oIgogCi1jb25zdCBjaGFyKiBrQ2F0ZWdvcnlMYWJlbHNba0NhdGVnb3J5Q291bnRdID0gewotICAgICJzaWxlbmNlIiwKLSAgICAidW5rbm93biIsCi0gICAgInllcyIsCi0gICAgIm5vIiwKLX07CitleHRlcm4gaW50OF90IGZlYXR1cmVfZGF0YVtdOworZXh0ZXJuIGludDhfdCBnb2xkZW5fcmVmW107CmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvZHRsbi9kdGxuX25vaXNlX3N1cHByZXNzaW9uLnRmbGl0ZSBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9kdGxuL2R0bG5fbm9pc2Vfc3VwcHJlc3Npb24udGZsaXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0M2VmOGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvZHRsbi9kdGxuX25vaXNlX3N1cHByZXNzaW9uLnRmbGl0ZQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvZHRsbi9kdGxuX3Rlc3QuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvZHRsbi9kdGxuX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA3NzE5NQotLS0gL2Rldi9udWxsCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9kdGxuL2R0bG5fdGVzdC5jYwpAQCAtMCwwICsxLDEwMCBAQAorLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvYy9jb21tb24uaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvZHRsbi9kdGxuX2lub3V0X2RhdGEuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvZHRsbi9kdGxuX25vaXNlX3N1cHByZXNzaW9uX21vZGVsX2RhdGEuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9faW50ZXJwcmV0ZXIuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fbG9nLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX211dGFibGVfb3BfcmVzb2x2ZXIuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vdGVzdGluZy9taWNyb190ZXN0LmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL3NjaGVtYS9zY2hlbWFfZ2VuZXJhdGVkLmgiCisKK1RGX0xJVEVfTUlDUk9fVEVTVFNfQkVHSU4KKworTWljcm9QcmludGYoCisgICAgIlxuVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBMU1RNIGxheWVycyBvbiBIaUZpIERTUCwgTk9UIGZvciBldmFsdWF0aW5nICIKKyAgICAibm9pc2Ugc3VwcHJlc3Npb24gcXVhbGl0eS5cbiIpOworVEZfTElURV9NSUNST19URVNUKFRlc3RJbnZva2UpIHsKKyAgLy8gTWFwIHRoZSBtb2RlbCBpbnRvIGEgdXNhYmxlIGRhdGEgc3RydWN0dXJlLiBUaGlzIGRvZXNuJ3QgaW52b2x2ZSBhbnkKKyAgLy8gY29weWluZyBvciBwYXJzaW5nLCBpdCdzIGEgdmVyeSBsaWdodHdlaWdodCBvcGVyYXRpb24uCisgIGNvbnN0IHRmbGl0ZTo6TW9kZWwqIG1vZGVsID0KKyAgICAgIDo6dGZsaXRlOjpHZXRNb2RlbChnX2R0bG5fbm9pc2Vfc3VwcHJlc3Npb25fbW9kZWxfZGF0YSk7CisgIGlmIChtb2RlbC0+dmVyc2lvbigpICE9IFRGTElURV9TQ0hFTUFfVkVSU0lPTikgeworICAgIE1pY3JvUHJpbnRmKAorICAgICAgICAiTW9kZWwgcHJvdmlkZWQgaXMgc2NoZW1hIHZlcnNpb24gJWQgbm90IGVxdWFsICIKKyAgICAgICAgInRvIHN1cHBvcnRlZCB2ZXJzaW9uICVkLlxuIiwKKyAgICAgICAgbW9kZWwtPnZlcnNpb24oKSwgVEZMSVRFX1NDSEVNQV9WRVJTSU9OKTsKKyAgfQorCisgIC8vIFB1bGwgaW4gb25seSB0aGUgb3BlcmF0aW9uIGltcGxlbWVudGF0aW9ucyB3ZSBuZWVkLgorICAvLyBUaGlzIHJlbGllcyBvbiBhIGNvbXBsZXRlIGxpc3Qgb2YgYWxsIHRoZSBvcHMgbmVlZGVkIGJ5IHRoaXMgZ3JhcGguCisKKyAgdGZsaXRlOjpNaWNyb011dGFibGVPcFJlc29sdmVyPDM+IG1pY3JvX29wX3Jlc29sdmVyOworICBtaWNyb19vcF9yZXNvbHZlci5BZGRVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTSgpOworICBtaWNyb19vcF9yZXNvbHZlci5BZGRGdWxseUNvbm5lY3RlZCgpOworICBtaWNyb19vcF9yZXNvbHZlci5BZGRMb2dpc3RpYygpOworCisgIC8vIENyZWF0ZSBhbiBhcmVhIG9mIG1lbW9yeSB0byB1c2UgZm9yIGlucHV0LCBvdXRwdXQsIGFuZCBpbnRlcm1lZGlhdGUgYXJyYXlzLgorICBjb25zdGV4cHIgaW50IHRlbnNvcl9hcmVuYV9zaXplID0gMTYgKiAxMDI0OworICBhbGlnbmFzKDE2KSB1aW50OF90IHRlbnNvcl9hcmVuYVt0ZW5zb3JfYXJlbmFfc2l6ZV07CisKKyAgLy8gQnVpbGQgYW4gaW50ZXJwcmV0ZXIgdG8gcnVuIHRoZSBtb2RlbCB3aXRoLgorICB0ZmxpdGU6Ok1pY3JvSW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIobW9kZWwsIG1pY3JvX29wX3Jlc29sdmVyLCB0ZW5zb3JfYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW5zb3JfYXJlbmFfc2l6ZSk7CisgIGludGVycHJldGVyLkFsbG9jYXRlVGVuc29ycygpOworCisgIC8vIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVtb3J5IGFyZWEgdG8gdXNlIGZvciB0aGUgbW9kZWwncyBpbnB1dC4KKyAgVGZMaXRlVGVuc29yKiBpbnB1dCA9IGludGVycHJldGVyLmlucHV0KDApOworCisgIC8vIE1ha2Ugc3VyZSB0aGUgaW5wdXQgaGFzIHRoZSBwcm9wZXJ0aWVzIHdlIGV4cGVjdC4KKyAgVEZfTElURV9NSUNST19FWFBFQ1QoaW5wdXQgIT0gbnVsbHB0cik7CisgIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKDMsIGlucHV0LT5kaW1zLT5zaXplKTsKKyAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoMSwgaW5wdXQtPmRpbXMtPmRhdGFbMF0pOworICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUSgxLCBpbnB1dC0+ZGltcy0+ZGF0YVsxXSk7CisgIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKDI1NywgaW5wdXQtPmRpbXMtPmRhdGFbMl0pOworICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUShrVGZMaXRlSW50OCwgaW5wdXQtPnR5cGUpOworCisgIC8vIENvcHkgYSBzcGVjdHJvZ3JhbSBjcmVhdGVkIGZyb20gYSBub2lzeS53YXYgYXVkaW8gZmlsZSwKKyAgLy8gaW50byB0aGUgbWVtb3J5IGFyZWEgdXNlZCBmb3IgdGhlIGlucHV0LgorICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlucHV0LT5ieXRlczsgKytpKSB7CisgICAgaW5wdXQtPmRhdGEuaW50OFtpXSA9IGZlYXR1cmVfZGF0YVtpXTsKKyAgfQorCisgIC8vIFJ1biB0aGUgbW9kZWwgb24gdGhpcyBpbnB1dCBhbmQgbWFrZSBzdXJlIGl0IHN1Y2NlZWRzLgorICBUZkxpdGVTdGF0dXMgaW52b2tlX3N0YXR1cyA9IGludGVycHJldGVyLkludm9rZSgpOworICBpZiAoaW52b2tlX3N0YXR1cyAhPSBrVGZMaXRlT2spIHsKKyAgICBNaWNyb1ByaW50ZigiSW52b2tlIGZhaWxlZFxuIik7CisgIH0KKyAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoa1RmTGl0ZU9rLCBpbnZva2Vfc3RhdHVzKTsKKworICAvLyBHZXQgdGhlIG91dHB1dCBmcm9tIHRoZSBtb2RlbCwgYW5kIG1ha2Ugc3VyZSBpdCdzIHRoZSBleHBlY3RlZCBzaXplIGFuZAorICAvLyB0eXBlLgorICBUZkxpdGVUZW5zb3IqIG91dHB1dCA9IGludGVycHJldGVyLm91dHB1dCgwKTsKKyAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoMywgb3V0cHV0LT5kaW1zLT5zaXplKTsKKyAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoMSwgb3V0cHV0LT5kaW1zLT5kYXRhWzBdKTsKKyAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoMSwgb3V0cHV0LT5kaW1zLT5kYXRhWzFdKTsKKyAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoMjU3LCBvdXRwdXQtPmRpbXMtPmRhdGFbMl0pOworICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUShrVGZMaXRlSW50OCwgb3V0cHV0LT50eXBlKTsKKworICBpbnQgb3V0cHV0X3NpemUgPQorICAgICAgb3V0cHV0LT5kaW1zLT5kYXRhWzBdICogb3V0cHV0LT5kaW1zLT5kYXRhWzFdICogb3V0cHV0LT5kaW1zLT5kYXRhWzJdOworICBmb3IgKGludCBpID0gMDsgaSA8IG91dHB1dF9zaXplOyBpKyspCisgICAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEob3V0cHV0LT5kYXRhLmludDhbaV0sIGdvbGRlbl9yZWZbaV0pOworCisgIE1pY3JvUHJpbnRmKCJSYW4gc3VjY2Vzc2Z1bGx5XG4iKTsKK30KKworVEZfTElURV9NSUNST19URVNUU19FTkQKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9oZWxsb193b3JsZC9CVUlMRCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9oZWxsb193b3JsZC9CVUlMRAppbmRleCBmMmI0MWIzLi45ODhiN2RkIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvaGVsbG9fd29ybGQvQlVJTEQKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL2hlbGxvX3dvcmxkL0JVSUxECkBAIC0xLDUgKzEsNiBAQAogIyBEZXNjcmlwdGlvbjoKICMgICBUZW5zb3JGbG93IExpdGUgZm9yIE1pY3JvY29udHJvbGxlcnMgImhlbGxvIHdvcmxkIiBleGFtcGxlLgorbG9hZCgiQHJ1bGVzX3B5dGhvbi8vcHl0aG9uOmRlZnMuYnpsIiwgInB5X2JpbmFyeSIpCiBsb2FkKCJAdGZsbV9waXBfZGVwcy8vOnJlcXVpcmVtZW50cy5iemwiLCAicmVxdWlyZW1lbnQiKQogbG9hZCgKICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm86YnVpbGRfZGVmLmJ6bCIsCkBAIC01Myw3ICs1NCw3IEBACiAgICAgICAgICJAYWJzbF9weS8vYWJzbC9mbGFncyIsCiAgICAgICAgICJAYWJzbF9weS8vYWJzbC9sb2dnaW5nIiwKICAgICAgICAgcmVxdWlyZW1lbnQoIm51bXB5IiksCi0gICAgICAgIHJlcXVpcmVtZW50KCJ0ZW5zb3JmbG93LWNwdSIpLAorICAgICAgICByZXF1aXJlbWVudCgidGVuc29yZmxvdyIpLAogICAgICAgICAiLy9weXRob24vdGZsaXRlX21pY3JvOnJ1bnRpbWUiLAogICAgIF0sCiApCkBAIC03OCw2ICs3OSw2IEBACiAgICAgc3Jjc192ZXJzaW9uID0gIlBZMyIsCiAgICAgZGVwcyA9IFsKICAgICAgICAgcmVxdWlyZW1lbnQoIm51bXB5IiksCi0gICAgICAgIHJlcXVpcmVtZW50KCJ0ZW5zb3JmbG93LWNwdSIpLAorICAgICAgICByZXF1aXJlbWVudCgidGVuc29yZmxvdyIpLAogICAgIF0sCiApCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvaGVsbG9fd29ybGQvbW9kZWxzL0JVSUxEIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL2hlbGxvX3dvcmxkL21vZGVscy9CVUlMRAppbmRleCA0ZjAyNWIwLi40Yzk0NDFiIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvaGVsbG9fd29ybGQvbW9kZWxzL0JVSUxECisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9oZWxsb193b3JsZC9tb2RlbHMvQlVJTEQKQEAgLTksNyArOSwxMCBAQAogICAgICAgICAiaGVsbG9fd29ybGRfZmxvYXQudGZsaXRlIiwKICAgICAgICAgImhlbGxvX3dvcmxkX2ludDgudGZsaXRlIiwKICAgICBdLAotICAgIHZpc2liaWxpdHkgPSBbIi8vdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL2hlbGxvX3dvcmxkOl9fc3VicGFja2FnZXNfXyJdLAorICAgIHZpc2liaWxpdHkgPSBbCisgICAgICAgICIvL2NvZGVnZW4vZXhhbXBsZXMvaGVsbG9fd29ybGQ6X19zdWJwYWNrYWdlc19fIiwKKyAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL2hlbGxvX3dvcmxkOl9fc3VicGFja2FnZXNfXyIsCisgICAgXSwKICkKIAogZ2VuZXJhdGVfY2NfYXJyYXlzKApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3F1YW50aXphdGlvbi9CVUlMRCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9oZWxsb193b3JsZC9xdWFudGl6YXRpb24vQlVJTEQKaW5kZXggZWNiYTMxNi4uOWEyMDRmMiAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL2hlbGxvX3dvcmxkL3F1YW50aXphdGlvbi9CVUlMRAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvaGVsbG9fd29ybGQvcXVhbnRpemF0aW9uL0JVSUxECkBAIC0xLDMgKzEsNCBAQAorbG9hZCgiQHJ1bGVzX3B5dGhvbi8vcHl0aG9uOmRlZnMuYnpsIiwgInB5X2JpbmFyeSIpCiBsb2FkKCJAdGZsbV9waXBfZGVwcy8vOnJlcXVpcmVtZW50cy5iemwiLCAicmVxdWlyZW1lbnQiKQogCiBweV9iaW5hcnkoCkBAIC0xMSw3ICsxMiw3IEBACiAgICAgICAgICJAYWJzbF9weS8vYWJzbC9mbGFncyIsCiAgICAgICAgICJAYWJzbF9weS8vYWJzbC9sb2dnaW5nIiwKICAgICAgICAgcmVxdWlyZW1lbnQoIm51bXB5IiksCi0gICAgICAgIHJlcXVpcmVtZW50KCJ0ZW5zb3JmbG93LWNwdSIpLAorICAgICAgICByZXF1aXJlbWVudCgidGVuc29yZmxvdyIpLAogICAgICAgICAiLy9weXRob24vdGZsaXRlX21pY3JvOnJ1bnRpbWUiLAogICAgIF0sCiApCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvaGVsbG9fd29ybGQvcXVhbnRpemF0aW9uL3B0cS5weSBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9oZWxsb193b3JsZC9xdWFudGl6YXRpb24vcHRxLnB5CmluZGV4IGJmYWIwZDAuLmYxYzQyMTAgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9oZWxsb193b3JsZC9xdWFudGl6YXRpb24vcHRxLnB5CisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9oZWxsb193b3JsZC9xdWFudGl6YXRpb24vcHRxLnB5CkBAIC0xNiw3ICsxNiw3IEBACiAKIFJ1bjoKIEJ1aWxkIHRoZSB0cmFpbi5weSBzY3JpcHQKLWBiYXplbCBidWlsZCB0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvaGVsbG9fd29ybGQvcXVhbnRpemF0aW9uOnRyYWluYAorYGJhemVsIGJ1aWxkIHRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9oZWxsb193b3JsZDp0cmFpbmAKIAogVGhlIGZvbGxvd2luZyBjb21tYW5kIGZpcnN0IGNyZWF0ZXMgdGhlIHRyYWluZWQgVEYgZmxvYXQgbW9kZWwgdGhhdCB3ZSB3aWxsIHF1YW50aXplIGxhdGVyCiBgYmF6ZWwtYmluL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9oZWxsb193b3JsZC90cmFpbiAtLXNhdmVfdGZfbW9kZWwgLS1zYXZlX2Rpcj0vdG1wL2Zsb2F0X21vZGVsL2AKQEAgLTExMyw0ICsxMTMsNCBAQAogCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0gIGFwcC5ydW4obWFpbikKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgIGFwcC5ydW4obWFpbikKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvQlVJTEQgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL0JVSUxECmluZGV4IDcxNzQxZjMuLjEwZDFjMTAgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvQlVJTEQKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9CVUlMRApAQCAtMSw1ICsxLDcgQEAKICMgRGVzY3JpcHRpb246CiAjICAgVGVuc29yRmxvdyBMaXRlIG1pY3JvY29udHJvbGxlciBleGFtcGxlLgorbG9hZCgiQHJ1bGVzX3B5dGhvbi8vcHl0aG9uOmRlZnMuYnpsIiwgInB5X2JpbmFyeSIsICJweV90ZXN0IikKK2xvYWQoIkB0ZmxtX3BpcF9kZXBzLy86cmVxdWlyZW1lbnRzLmJ6bCIsICJyZXF1aXJlbWVudCIpCiBsb2FkKCIvL3RlbnNvcmZsb3cvbGl0ZS9taWNybzpidWlsZF9kZWYuYnpsIiwgImdlbmVyYXRlX2NjX2FycmF5cyIpCiAKIHBhY2thZ2UoCkBAIC05LDE2ICsxMSw2IEBACiAgICAgbGljZW5zZXMgPSBbIm5vdGljZSJdLAogKQogCi1jY19saWJyYXJ5KAotICAgIG5hbWUgPSAic2ltcGxlX21vZGVsX3NldHRpbmdzIiwKLSAgICBzcmNzID0gWwotICAgICAgICAic2ltcGxlX2ZlYXR1cmVzL3NpbXBsZV9tb2RlbF9zZXR0aW5ncy5jYyIsCi0gICAgXSwKLSAgICBoZHJzID0gWwotICAgICAgICAic2ltcGxlX2ZlYXR1cmVzL3NpbXBsZV9tb2RlbF9zZXR0aW5ncy5oIiwKLSAgICBdLAotKQotCiBnZW5lcmF0ZV9jY19hcnJheXMoCiAgICAgbmFtZSA9ICJnZW5lcmF0ZWRfeWVzXzEwMDBtc193YXZfY2MiLAogICAgIHNyYyA9ICJ0ZXN0ZGF0YS95ZXNfMTAwMG1zLndhdiIsCkBAIC00NCw2ICszNiwzMCBAQAogKQogCiBnZW5lcmF0ZV9jY19hcnJheXMoCisgICAgbmFtZSA9ICJnZW5lcmF0ZWRfbm9pc2VfMTAwMG1zX3dhdl9jYyIsCisgICAgc3JjID0gInRlc3RkYXRhL25vaXNlXzEwMDBtcy53YXYiLAorICAgIG91dCA9ICJ0ZXN0ZGF0YS9ub2lzZV8xMDAwbXNfYXVkaW9fZGF0YS5jYyIsCispCisKK2dlbmVyYXRlX2NjX2FycmF5cygKKyAgICBuYW1lID0gImdlbmVyYXRlZF9ub2lzZV8xMDAwbXNfd2F2X2hkciIsCisgICAgc3JjID0gInRlc3RkYXRhL25vaXNlXzEwMDBtcy53YXYiLAorICAgIG91dCA9ICJ0ZXN0ZGF0YS9ub2lzZV8xMDAwbXNfYXVkaW9fZGF0YS5oIiwKKykKKworZ2VuZXJhdGVfY2NfYXJyYXlzKAorICAgIG5hbWUgPSAiZ2VuZXJhdGVkX3NpbGVuY2VfMTAwMG1zX3dhdl9jYyIsCisgICAgc3JjID0gInRlc3RkYXRhL3NpbGVuY2VfMTAwMG1zLndhdiIsCisgICAgb3V0ID0gInRlc3RkYXRhL3NpbGVuY2VfMTAwMG1zX2F1ZGlvX2RhdGEuY2MiLAorKQorCitnZW5lcmF0ZV9jY19hcnJheXMoCisgICAgbmFtZSA9ICJnZW5lcmF0ZWRfc2lsZW5jZV8xMDAwbXNfd2F2X2hkciIsCisgICAgc3JjID0gInRlc3RkYXRhL3NpbGVuY2VfMTAwMG1zLndhdiIsCisgICAgb3V0ID0gInRlc3RkYXRhL3NpbGVuY2VfMTAwMG1zX2F1ZGlvX2RhdGEuaCIsCispCisKK2dlbmVyYXRlX2NjX2FycmF5cygKICAgICBuYW1lID0gImdlbmVyYXRlZF95ZXNfMzBtc193YXZfY2MiLAogICAgIHNyYyA9ICJ0ZXN0ZGF0YS95ZXNfMzBtcy53YXYiLAogICAgIG91dCA9ICJ0ZXN0ZGF0YS95ZXNfMzBtc19hdWRpb19kYXRhLmNjIiwKQEAgLTY5LDE0ICs4NSwyNiBAQAogCiBnZW5lcmF0ZV9jY19hcnJheXMoCiAgICAgbmFtZSA9ICJnZW5lcmF0ZWRfbWljcm9fc3BlZWNoX21vZGVsX2NjIiwKLSAgICBzcmMgPSAibWljcm9fc3BlZWNoLnRmbGl0ZSIsCi0gICAgb3V0ID0gIm1pY3JvX3NwZWVjaF9tb2RlbF9kYXRhLmNjIiwKKyAgICBzcmMgPSAibW9kZWxzL21pY3JvX3NwZWVjaF9xdWFudGl6ZWQudGZsaXRlIiwKKyAgICBvdXQgPSAibW9kZWxzL21pY3JvX3NwZWVjaF9xdWFudGl6ZWRfbW9kZWxfZGF0YS5jYyIsCiApCiAKIGdlbmVyYXRlX2NjX2FycmF5cygKICAgICBuYW1lID0gImdlbmVyYXRlZF9taWNyb19zcGVlY2hfbW9kZWxfaGRyIiwKLSAgICBzcmMgPSAibWljcm9fc3BlZWNoLnRmbGl0ZSIsCi0gICAgb3V0ID0gIm1pY3JvX3NwZWVjaF9tb2RlbF9kYXRhLmgiLAorICAgIHNyYyA9ICJtb2RlbHMvbWljcm9fc3BlZWNoX3F1YW50aXplZC50ZmxpdGUiLAorICAgIG91dCA9ICJtb2RlbHMvbWljcm9fc3BlZWNoX3F1YW50aXplZF9tb2RlbF9kYXRhLmgiLAorKQorCitnZW5lcmF0ZV9jY19hcnJheXMoCisgICAgbmFtZSA9ICJnZW5lcmF0ZWRfYXVkaW9fcHJlcHJvY2Vzc29yX21vZGVsX2NjIiwKKyAgICBzcmMgPSAibW9kZWxzL2F1ZGlvX3ByZXByb2Nlc3Nvcl9pbnQ4LnRmbGl0ZSIsCisgICAgb3V0ID0gIm1vZGVscy9hdWRpb19wcmVwcm9jZXNzb3JfaW50OF9tb2RlbF9kYXRhLmNjIiwKKykKKworZ2VuZXJhdGVfY2NfYXJyYXlzKAorICAgIG5hbWUgPSAiZ2VuZXJhdGVkX2F1ZGlvX3ByZXByb2Nlc3Nvcl9tb2RlbF9oZHIiLAorICAgIHNyYyA9ICJtb2RlbHMvYXVkaW9fcHJlcHJvY2Vzc29yX2ludDgudGZsaXRlIiwKKyAgICBvdXQgPSAibW9kZWxzL2F1ZGlvX3ByZXByb2Nlc3Nvcl9pbnQ4X21vZGVsX2RhdGEuaCIsCiApCiAKIGNjX2xpYnJhcnkoCkBAIC05MCwzNSArMTE4LDE3IEBACiApCiAKIGNjX2xpYnJhcnkoCi0gICAgbmFtZSA9ICJzaW1wbGVfZmVhdHVyZXNfdGVzdF9kYXRhIiwKKyAgICBuYW1lID0gImF1ZGlvX3ByZXByb2Nlc3Nvcl9tb2RlbF9kYXRhIiwKICAgICBzcmNzID0gWwotICAgICAgICAic2ltcGxlX2ZlYXR1cmVzL25vX3NpbXBsZV9mZWF0dXJlc19kYXRhLmNjIiwKLSAgICAgICAgInNpbXBsZV9mZWF0dXJlcy95ZXNfc2ltcGxlX2ZlYXR1cmVzX2RhdGEuY2MiLAorICAgICAgICAiOmdlbmVyYXRlZF9hdWRpb19wcmVwcm9jZXNzb3JfbW9kZWxfY2MiLAogICAgIF0sCiAgICAgaGRycyA9IFsKLSAgICAgICAgInNpbXBsZV9mZWF0dXJlcy9ub19zaW1wbGVfZmVhdHVyZXNfZGF0YS5oIiwKLSAgICAgICAgInNpbXBsZV9mZWF0dXJlcy95ZXNfc2ltcGxlX2ZlYXR1cmVzX2RhdGEuaCIsCi0gICAgXSwKLSkKLQotY2NfdGVzdCgKLSAgICBuYW1lID0gIm1pY3JvX3NwZWVjaF90ZXN0IiwKLSAgICBzcmNzID0gWwotICAgICAgICAibWljcm9fc3BlZWNoX3Rlc3QuY2MiLAotICAgIF0sCi0gICAgZGVwcyA9IFsKLSAgICAgICAgIjptaWNyb19zcGVlY2hfbW9kZWxfZGF0YSIsCi0gICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNybzptaWNyb19mcmFtZXdvcmsiLAotICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm86bWljcm9fbG9nIiwKLSAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvOm9wX3Jlc29sdmVycyIsCi0gICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXM6bWljcm9fZmVhdHVyZXNfdGVzdF9kYXRhIiwKLSAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvL3Rlc3Rpbmc6bWljcm9fdGVzdCIsCi0gICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9zY2hlbWE6c2NoZW1hX2ZicyIsCisgICAgICAgICI6Z2VuZXJhdGVkX2F1ZGlvX3ByZXByb2Nlc3Nvcl9tb2RlbF9oZHIiLAogICAgIF0sCiApCiAKIGNjX2xpYnJhcnkoCi0gICAgbmFtZSA9ICJhdWRpb19zYW1wbGVfdGVzdF9kYXRhIiwKKyAgICBuYW1lID0gImF1ZGlvX3NhbXBsZV90ZXN0X2RhdGFfMzBtcyIsCiAgICAgc3JjcyA9IFsKICAgICAgICAgIjpnZW5lcmF0ZWRfbm9fMzBtc193YXZfY2MiLAogICAgICAgICAiOmdlbmVyYXRlZF95ZXNfMzBtc193YXZfY2MiLApAQCAtMTMwLDMyNCArMTQwLDEyOCBAQAogKQogCiBjY19saWJyYXJ5KAotICAgIG5hbWUgPSAiYXVkaW9fbGFyZ2Vfc2FtcGxlX3Rlc3RfZGF0YSIsCisgICAgbmFtZSA9ICJhdWRpb19zYW1wbGVfdGVzdF9kYXRhXzEwMDBtcyIsCiAgICAgc3JjcyA9IFsKICAgICAgICAgIjpnZW5lcmF0ZWRfbm9fMTAwMG1zX3dhdl9jYyIsCisgICAgICAgICI6Z2VuZXJhdGVkX25vaXNlXzEwMDBtc193YXZfY2MiLAorICAgICAgICAiOmdlbmVyYXRlZF9zaWxlbmNlXzEwMDBtc193YXZfY2MiLAogICAgICAgICAiOmdlbmVyYXRlZF95ZXNfMTAwMG1zX3dhdl9jYyIsCiAgICAgXSwKICAgICBoZHJzID0gWwogICAgICAgICAiOmdlbmVyYXRlZF9ub18xMDAwbXNfd2F2X2hkciIsCisgICAgICAgICI6Z2VuZXJhdGVkX25vaXNlXzEwMDBtc193YXZfaGRyIiwKKyAgICAgICAgIjpnZW5lcmF0ZWRfc2lsZW5jZV8xMDAwbXNfd2F2X2hkciIsCiAgICAgICAgICI6Z2VuZXJhdGVkX3llc18xMDAwbXNfd2F2X2hkciIsCiAgICAgXSwKICkKIAogY2NfbGlicmFyeSgKLSAgICBuYW1lID0gInNpbXBsZV9mZWF0dXJlc19nZW5lcmF0b3JfdGVzdF9kYXRhIiwKLSAgICBzcmNzID0gWwotICAgICAgICAic2ltcGxlX2ZlYXR1cmVzL25vX3Bvd2VyX3NwZWN0cnVtX2RhdGEuY2MiLAotICAgICAgICAic2ltcGxlX2ZlYXR1cmVzL3llc19wb3dlcl9zcGVjdHJ1bV9kYXRhLmNjIiwKLSAgICBdLAorICAgIG5hbWUgPSAibWljcm9fbW9kZWxfc2V0dGluZ3MiLAogICAgIGhkcnMgPSBbCi0gICAgICAgICJzaW1wbGVfZmVhdHVyZXMvbm9fcG93ZXJfc3BlY3RydW1fZGF0YS5oIiwKLSAgICAgICAgInNpbXBsZV9mZWF0dXJlcy95ZXNfcG93ZXJfc3BlY3RydW1fZGF0YS5oIiwKLSAgICBdLAotKQotCi1jY19saWJyYXJ5KAotICAgIG5hbWUgPSAic2ltcGxlX2ZlYXR1cmVzX2dlbmVyYXRvcl9yZWZlcmVuY2UiLAotICAgIHNyY3MgPSBbCi0gICAgICAgICJzaW1wbGVfZmVhdHVyZXMvc2ltcGxlX2ZlYXR1cmVzX2dlbmVyYXRvci5jYyIsCi0gICAgXSwKLSAgICBoZHJzID0gWwotICAgICAgICAic2ltcGxlX2ZlYXR1cmVzL3NpbXBsZV9mZWF0dXJlc19nZW5lcmF0b3IuaCIsCi0gICAgXSwKLSAgICBkZXBzID0gWwotICAgICAgICAiOnNpbXBsZV9tb2RlbF9zZXR0aW5ncyIsCi0gICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9jOmNvbW1vbiIsCi0gICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNybzptaWNyb19sb2ciLAorICAgICAgICAibWljcm9fbW9kZWxfc2V0dGluZ3MuaCIsCiAgICAgXSwKICkKIAogY2NfdGVzdCgKLSAgICBuYW1lID0gInNpbXBsZV9mZWF0dXJlc19nZW5lcmF0b3JfcmVmZXJlbmNlX3Rlc3QiLAorICAgIG5hbWUgPSAibWljcm9fc3BlZWNoX3Rlc3QiLAogICAgIHNyY3MgPSBbCi0gICAgICAgICJzaW1wbGVfZmVhdHVyZXMvc2ltcGxlX2ZlYXR1cmVzX2dlbmVyYXRvcl90ZXN0LmNjIiwKKyAgICAgICAgIm1pY3JvX3NwZWVjaF90ZXN0LmNjIiwKICAgICBdLAogICAgIGRlcHMgPSBbCi0gICAgICAgICI6YXVkaW9fc2FtcGxlX3Rlc3RfZGF0YSIsCi0gICAgICAgICI6c2ltcGxlX2ZlYXR1cmVzX2dlbmVyYXRvcl9yZWZlcmVuY2UiLAotICAgICAgICAiOnNpbXBsZV9mZWF0dXJlc19nZW5lcmF0b3JfdGVzdF9kYXRhIiwKLSAgICAgICAgIjpzaW1wbGVfbW9kZWxfc2V0dGluZ3MiLAotICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvYzpjb21tb24iLAotICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm86bWljcm9fZnJhbWV3b3JrIiwKLSAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvOm1pY3JvX2xvZyIsCi0gICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0aW5nOm1pY3JvX3Rlc3QiLAotICAgIF0sCi0pCi0KLWNjX2xpYnJhcnkoCi0gICAgbmFtZSA9ICJzaW1wbGVfZmVhdHVyZXNfZ2VuZXJhdG9yX2ZpeGVkIiwKLSAgICBzcmNzID0gWwotICAgICAgICAic2ltcGxlX2ZlYXR1cmVzL2ZpeGVkX3BvaW50L3NpbXBsZV9mZWF0dXJlc19nZW5lcmF0b3IuY2MiLAotICAgIF0sCi0gICAgaGRycyA9IFsKLSAgICAgICAgInNpbXBsZV9mZWF0dXJlcy9zaW1wbGVfZmVhdHVyZXNfZ2VuZXJhdG9yLmgiLAotICAgIF0sCi0gICAgZGVwcyA9IFsKLSAgICAgICAgIjpzaW1wbGVfbW9kZWxfc2V0dGluZ3MiLAotICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvYzpjb21tb24iLAotICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm86bWljcm9fbG9nIiwKLSAgICBdLAotKQotCi1jY190ZXN0KAotICAgIG5hbWUgPSAic2ltcGxlX2ZlYXR1cmVzX2dlbmVyYXRvcl9maXhlZF90ZXN0IiwKLSAgICBzcmNzID0gWwotICAgICAgICAic2ltcGxlX2ZlYXR1cmVzL3NpbXBsZV9mZWF0dXJlc19nZW5lcmF0b3JfdGVzdC5jYyIsCi0gICAgXSwKLSAgICBkZXBzID0gWwotICAgICAgICAiOmF1ZGlvX3NhbXBsZV90ZXN0X2RhdGEiLAotICAgICAgICAiOnNpbXBsZV9mZWF0dXJlc19nZW5lcmF0b3JfZml4ZWQiLAotICAgICAgICAiOnNpbXBsZV9mZWF0dXJlc19nZW5lcmF0b3JfdGVzdF9kYXRhIiwKLSAgICAgICAgIjpzaW1wbGVfbW9kZWxfc2V0dGluZ3MiLAotICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvYzpjb21tb24iLAotICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm86bWljcm9fZnJhbWV3b3JrIiwKLSAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvOm1pY3JvX2xvZyIsCi0gICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0aW5nOm1pY3JvX3Rlc3QiLAotICAgIF0sCi0pCi0KLWNjX2xpYnJhcnkoCi0gICAgbmFtZSA9ICJhdWRpb19wcm92aWRlciIsCi0gICAgc3JjcyA9IFsKLSAgICAgICAgImF1ZGlvX3Byb3ZpZGVyLmNjIiwKLSAgICBdLAotICAgIGhkcnMgPSBbCi0gICAgICAgICJhdWRpb19wcm92aWRlci5oIiwKLSAgICBdLAotICAgIGRlcHMgPSBbCi0gICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9jOmNvbW1vbiIsCi0gICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXM6bWljcm9fbW9kZWxfc2V0dGluZ3MiLAotICAgIF0sCi0pCi0KLWNjX2xpYnJhcnkoCi0gICAgbmFtZSA9ICJhdWRpb19wcm92aWRlcl9tb2NrIiwKLSAgICBzcmNzID0gWwotICAgICAgICAiYXVkaW9fcHJvdmlkZXJfbW9jay5jYyIsCi0gICAgXSwKLSAgICBoZHJzID0gWwotICAgICAgICAiYXVkaW9fcHJvdmlkZXIuaCIsCi0gICAgXSwKLSAgICBkZXBzID0gWwotICAgICAgICAiOmF1ZGlvX2xhcmdlX3NhbXBsZV90ZXN0X2RhdGEiLAotICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvYzpjb21tb24iLAotICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzOm1pY3JvX21vZGVsX3NldHRpbmdzIiwKLSAgICBdLAotKQotCi1jY190ZXN0KAotICAgIG5hbWUgPSAiYXVkaW9fcHJvdmlkZXJfdGVzdCIsCi0gICAgc3JjcyA9IFsKLSAgICAgICAgImF1ZGlvX3Byb3ZpZGVyX3Rlc3QuY2MiLAotICAgIF0sCi0gICAgZGVwcyA9IFsKLSAgICAgICAgIjphdWRpb19wcm92aWRlciIsCi0gICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9jOmNvbW1vbiIsCi0gICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNybzptaWNyb19mcmFtZXdvcmsiLAotICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzOm1pY3JvX21vZGVsX3NldHRpbmdzIiwKLSAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvL3Rlc3Rpbmc6bWljcm9fdGVzdCIsCi0gICAgXSwKLSkKLQotY2NfdGVzdCgKLSAgICBuYW1lID0gImF1ZGlvX3Byb3ZpZGVyX21vY2tfdGVzdCIsCi0gICAgc3JjcyA9IFsKLSAgICAgICAgImF1ZGlvX3Byb3ZpZGVyX21vY2tfdGVzdC5jYyIsCi0gICAgXSwKLSAgICBkZXBzID0gWwotICAgICAgICAiOmF1ZGlvX2xhcmdlX3NhbXBsZV90ZXN0X2RhdGEiLAotICAgICAgICAiOmF1ZGlvX3Byb3ZpZGVyX21vY2siLAotICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvYzpjb21tb24iLAotICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm86bWljcm9fZnJhbWV3b3JrIiwKLSAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlczptaWNyb19tb2RlbF9zZXR0aW5ncyIsCi0gICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0aW5nOm1pY3JvX3Rlc3QiLAotICAgIF0sCi0pCi0KLWNjX2xpYnJhcnkoCi0gICAgbmFtZSA9ICJmZWF0dXJlX3Byb3ZpZGVyIiwKLSAgICBzcmNzID0gWwotICAgICAgICAiZmVhdHVyZV9wcm92aWRlci5jYyIsCi0gICAgXSwKLSAgICBoZHJzID0gWwotICAgICAgICAiZmVhdHVyZV9wcm92aWRlci5oIiwKLSAgICBdLAotICAgIGRlcHMgPSBbCi0gICAgICAgICI6YXVkaW9fcHJvdmlkZXIiLAotICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvYzpjb21tb24iLAotICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm86bWljcm9fbG9nIiwKLSAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlczptaWNyb19mZWF0dXJlc19nZW5lcmF0b3IiLAotICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzOm1pY3JvX21vZGVsX3NldHRpbmdzIiwKLSAgICBdLAotKQotCi1jY190ZXN0KAotICAgIG5hbWUgPSAiZmVhdHVyZV9wcm92aWRlcl90ZXN0IiwKLSAgICBzcmNzID0gWwotICAgICAgICAiZmVhdHVyZV9wcm92aWRlcl90ZXN0LmNjIiwKLSAgICBdLAotICAgIGRlcHMgPSBbCi0gICAgICAgICI6YXVkaW9fcHJvdmlkZXIiLAotICAgICAgICAiOmZlYXR1cmVfcHJvdmlkZXIiLAotICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvYzpjb21tb24iLAotICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm86bWljcm9fZnJhbWV3b3JrIiwKLSAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlczptaWNyb19tb2RlbF9zZXR0aW5ncyIsCi0gICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0aW5nOm1pY3JvX3Rlc3QiLAotICAgIF0sCi0pCi0KLWNjX2xpYnJhcnkoCi0gICAgbmFtZSA9ICJmZWF0dXJlX3Byb3ZpZGVyX21vY2siLAotICAgIHNyY3MgPSBbCi0gICAgICAgICJmZWF0dXJlX3Byb3ZpZGVyLmNjIiwKLSAgICBdLAotICAgIGhkcnMgPSBbCi0gICAgICAgICJmZWF0dXJlX3Byb3ZpZGVyLmgiLAotICAgIF0sCi0gICAgZGVwcyA9IFsKLSAgICAgICAgIjphdWRpb19wcm92aWRlcl9tb2NrIiwKLSAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL2M6Y29tbW9uIiwKLSAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvOm1pY3JvX2xvZyIsCi0gICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXM6bWljcm9fZmVhdHVyZXNfZ2VuZXJhdG9yIiwKLSAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlczptaWNyb19tb2RlbF9zZXR0aW5ncyIsCi0gICAgXSwKLSkKLQotY2NfdGVzdCgKLSAgICBuYW1lID0gImZlYXR1cmVfcHJvdmlkZXJfbW9ja190ZXN0IiwKLSAgICBzaXplID0gInNtYWxsIiwKLSAgICBzcmNzID0gWwotICAgICAgICAiZmVhdHVyZV9wcm92aWRlcl9tb2NrX3Rlc3QuY2MiLAotICAgIF0sCi0gICAgdGFncyA9IFsKLSAgICAgICAgIm5vYXNhbiIsICAjIFRPRE8oYi8xNzk5MzA2MDcpOiBGaXggd2l0aCBhc2FuLgotICAgIF0sCi0gICAgZGVwcyA9IFsKLSAgICAgICAgIjpmZWF0dXJlX3Byb3ZpZGVyX21vY2siLAotICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvYzpjb21tb24iLAotICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm86bWljcm9fZnJhbWV3b3JrIiwKLSAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlczptaWNyb19mZWF0dXJlc190ZXN0X2RhdGEiLAotICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzOm1pY3JvX21vZGVsX3NldHRpbmdzIiwKLSAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvL3Rlc3Rpbmc6bWljcm9fdGVzdCIsCi0gICAgXSwKLSkKLQotY2NfbGlicmFyeSgKLSAgICBuYW1lID0gInJlY29nbml6ZV9jb21tYW5kcyIsCi0gICAgc3JjcyA9IFsKLSAgICAgICAgInJlY29nbml6ZV9jb21tYW5kcy5jYyIsCi0gICAgXSwKLSAgICBoZHJzID0gWwotICAgICAgICAicmVjb2duaXplX2NvbW1hbmRzLmgiLAotICAgIF0sCi0gICAgZGVwcyA9IFsKLSAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL2M6Y29tbW9uIiwKLSAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvOm1pY3JvX2xvZyIsCi0gICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXM6bWljcm9fbW9kZWxfc2V0dGluZ3MiLAotICAgIF0sCi0pCi0KLWNjX3Rlc3QoCi0gICAgbmFtZSA9ICJyZWNvZ25pemVfY29tbWFuZHNfdGVzdCIsCi0gICAgc3JjcyA9IFsKLSAgICAgICAgInJlY29nbml6ZV9jb21tYW5kc190ZXN0LmNjIiwKLSAgICBdLAotICAgIHRhZ3MgPSBbCi0gICAgICAgICJub19vc3MiLCAgIyBUT0RPKDEyMjg1MzAyMyk6IFJlc29sdmUgaXNzdWVzIGFuZCByZS1lbmFibGUuCi0gICAgXSwKLSAgICBkZXBzID0gWwotICAgICAgICAiOnJlY29nbml6ZV9jb21tYW5kcyIsCi0gICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9jOmNvbW1vbiIsCi0gICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNybzptaWNyb19mcmFtZXdvcmsiLAotICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm86bWljcm9fbG9nIiwKLSAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvOnRlc3RfaGVscGVycyIsCi0gICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0aW5nOm1pY3JvX3Rlc3QiLAotICAgIF0sCi0pCi0KLWNjX2xpYnJhcnkoCi0gICAgbmFtZSA9ICJjb21tYW5kX3Jlc3BvbmRlciIsCi0gICAgc3JjcyA9IFsKLSAgICAgICAgImNvbW1hbmRfcmVzcG9uZGVyLmNjIiwKLSAgICBdLAotICAgIGhkcnMgPSBbCi0gICAgICAgICJjb21tYW5kX3Jlc3BvbmRlci5oIiwKLSAgICBdLAotICAgIGRlcHMgPSBbCi0gICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9jOmNvbW1vbiIsCi0gICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNybzptaWNyb19sb2ciLAotICAgIF0sCi0pCi0KLWNjX3Rlc3QoCi0gICAgbmFtZSA9ICJjb21tYW5kX3Jlc3BvbmRlcl90ZXN0IiwKLSAgICBzcmNzID0gWwotICAgICAgICAiY29tbWFuZF9yZXNwb25kZXJfdGVzdC5jYyIsCi0gICAgXSwKLSAgICBkZXBzID0gWwotICAgICAgICAiOmNvbW1hbmRfcmVzcG9uZGVyIiwKLSAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL2M6Y29tbW9uIiwKLSAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvOm1pY3JvX2ZyYW1ld29yayIsCi0gICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0aW5nOm1pY3JvX3Rlc3QiLAotICAgIF0sCi0pCi0KLWNjX2JpbmFyeSgKLSAgICBuYW1lID0gIm1pY3JvX3NwZWVjaCIsCi0gICAgc3JjcyA9IFsKLSAgICAgICAgIm1haW4uY2MiLAotICAgICAgICAibWFpbl9mdW5jdGlvbnMuY2MiLAotICAgICAgICAibWFpbl9mdW5jdGlvbnMuaCIsCi0gICAgXSwKLSAgICBkZXBzID0gWwotICAgICAgICAiOmF1ZGlvX3Byb3ZpZGVyIiwKLSAgICAgICAgIjpjb21tYW5kX3Jlc3BvbmRlciIsCi0gICAgICAgICI6ZmVhdHVyZV9wcm92aWRlciIsCisgICAgICAgICI6YXVkaW9fcHJlcHJvY2Vzc29yX21vZGVsX2RhdGEiLAorICAgICAgICAiOmF1ZGlvX3NhbXBsZV90ZXN0X2RhdGFfMTAwMG1zIiwKKyAgICAgICAgIjphdWRpb19zYW1wbGVfdGVzdF9kYXRhXzMwbXMiLAorICAgICAgICAiOm1pY3JvX21vZGVsX3NldHRpbmdzIiwKICAgICAgICAgIjptaWNyb19zcGVlY2hfbW9kZWxfZGF0YSIsCi0gICAgICAgICI6cmVjb2duaXplX2NvbW1hbmRzIiwKICAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvOm1pY3JvX2ZyYW1ld29yayIsCiAgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNybzptaWNyb19sb2ciLAogICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm86b3BfcmVzb2x2ZXJzIiwKLSAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvOnN5c3RlbV9zZXR1cCIsCi0gICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXM6bWljcm9fbW9kZWxfc2V0dGluZ3MiLAorICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm8vdGVzdGluZzptaWNyb190ZXN0IiwKICAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL3NjaGVtYTpzY2hlbWFfZmJzIiwKICAgICBdLAogKQogCi1jY19iaW5hcnkoCi0gICAgbmFtZSA9ICJtaWNyb19zcGVlY2hfbW9jayIsCi0gICAgc3JjcyA9IFsKLSAgICAgICAgIm1haW4uY2MiLAotICAgICAgICAibWFpbl9mdW5jdGlvbnMuY2MiLAotICAgICAgICAibWFpbl9mdW5jdGlvbnMuaCIsCitmaWxlZ3JvdXAoCisgICAgbmFtZSA9ICJzYW1wbGVzXzMwbXMiLAorICAgIHNyY3MgPSBnbG9iKFsidGVzdGRhdGEvKl8zMG1zLndhdiJdKSwKKykKKworZmlsZWdyb3VwKAorICAgIG5hbWUgPSAic2FtcGxlc18xMDAwbXMiLAorICAgIHNyY3MgPSBnbG9iKFsidGVzdGRhdGEvKl8xMDAwbXMud2F2Il0pLAorKQorCitmaWxlZ3JvdXAoCisgICAgbmFtZSA9ICJtb2RlbHNfdGZsaXRlIiwKKyAgICBzcmNzID0gZ2xvYihbIm1vZGVscy8qLnRmbGl0ZSJdKSwKKykKKworcHlfYmluYXJ5KAorICAgIG5hbWUgPSAiYXVkaW9fcHJlcHJvY2Vzc29yIiwKKyAgICBzcmNzID0gWyJhdWRpb19wcmVwcm9jZXNzb3IucHkiXSwKKyAgICBkYXRhID0gWworICAgICAgICAiOnNhbXBsZXNfMzBtcyIsCiAgICAgXSwKKyAgICBweXRob25fdmVyc2lvbiA9ICJQWTMiLAorICAgIHNyY3NfdmVyc2lvbiA9ICJQWTMiLAogICAgIGRlcHMgPSBbCi0gICAgICAgICI6YXVkaW9fcHJvdmlkZXJfbW9jayIsCi0gICAgICAgICI6Y29tbWFuZF9yZXNwb25kZXIiLAotICAgICAgICAiOmZlYXR1cmVfcHJvdmlkZXIiLAotICAgICAgICAiOm1pY3JvX3NwZWVjaF9tb2RlbF9kYXRhIiwKLSAgICAgICAgIjpyZWNvZ25pemVfY29tbWFuZHMiLAotICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm86bWljcm9fZnJhbWV3b3JrIiwKLSAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvOm9wX3Jlc29sdmVycyIsCi0gICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNybzpzeXN0ZW1fc2V0dXAiLAotICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzOm1pY3JvX21vZGVsX3NldHRpbmdzIiwKLSAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL3NjaGVtYTpzY2hlbWFfZmJzIiwKKyAgICAgICAgIkBhYnNsX3B5Ly9hYnNsOmFwcCIsCisgICAgICAgICJAYWJzbF9weS8vYWJzbC9mbGFncyIsCisgICAgICAgIHJlcXVpcmVtZW50KCJudW1weSIpLAorICAgICAgICByZXF1aXJlbWVudCgidGVuc29yZmxvdyIpLAorICAgICAgICAiLy9weXRob24vdGZsaXRlX21pY3JvOnJ1bnRpbWUiLAorICAgICAgICAiLy9weXRob24vdGZsaXRlX21pY3JvL3NpZ25hbDpvcHMiLAorICAgICAgICAiLy9weXRob24vdGZsaXRlX21pY3JvL3NpZ25hbC91dGlsczp1dGlsIiwKICAgICBdLAogKQogCi1zaF90ZXN0KAotICAgIG5hbWUgPSAibWljcm9fc3BlZWNoX2JpbmFyeV9tb2NrX3Rlc3QiLAotICAgIHNyY3MgPSBbIm1pY3JvX3NwZWVjaF9iaW5hcnlfbW9ja190ZXN0LnNoIl0sCi0gICAgZGF0YSA9IFsiOm1pY3JvX3NwZWVjaF9tb2NrIl0sCitweV9iaW5hcnkoCisgICAgbmFtZSA9ICJldmFsdWF0ZSIsCisgICAgc3JjcyA9IFsiZXZhbHVhdGUucHkiXSwKKyAgICBkYXRhID0gWworICAgICAgICAiOm1vZGVsc190ZmxpdGUiLAorICAgIF0sCisgICAgcHl0aG9uX3ZlcnNpb24gPSAiUFkzIiwKKyAgICBzcmNzX3ZlcnNpb24gPSAiUFkzIiwKKyAgICBkZXBzID0gWworICAgICAgICAiOmF1ZGlvX3ByZXByb2Nlc3NvciIsCisgICAgXSwKKykKKworcHlfdGVzdCgKKyAgICBuYW1lID0gImV2YWx1YXRlX3Rlc3QiLAorICAgIHNyY3MgPSBbImV2YWx1YXRlX3Rlc3QucHkiXSwKKyAgICBkYXRhID0gWworICAgICAgICAiOm1vZGVsc190ZmxpdGUiLAorICAgICAgICAiOnNhbXBsZXNfMTAwMG1zIiwKKyAgICBdLAorICAgIG1haW4gPSAiZXZhbHVhdGVfdGVzdC5weSIsCisgICAgcHl0aG9uX3ZlcnNpb24gPSAiUFkzIiwKKyAgICB0YWdzID0gWworICAgICAgICAibm9hc2FuIiwKKyAgICAgICAgIm5vbXNhbiIsICAjIFB5dGhvbiBkb2Vzbid0IGxpa2UgdGhlc2Ugc3ltYm9scworICAgICAgICAibm91YnNhbiIsCisgICAgXSwKKyAgICBkZXBzID0gWworICAgICAgICAiOmV2YWx1YXRlIiwKKyAgICBdLAorKQorCitweV90ZXN0KAorICAgIG5hbWUgPSAiYXVkaW9fcHJlcHJvY2Vzc29yX3Rlc3QiLAorICAgIHNyY3MgPSBbImF1ZGlvX3ByZXByb2Nlc3Nvcl90ZXN0LnB5Il0sCisgICAgZGF0YSA9IFsKKyAgICAgICAgIjptb2RlbHNfdGZsaXRlIiwKKyAgICAgICAgIjpzYW1wbGVzXzMwbXMiLAorICAgIF0sCisgICAgbWFpbiA9ICJhdWRpb19wcmVwcm9jZXNzb3JfdGVzdC5weSIsCisgICAgcHl0aG9uX3ZlcnNpb24gPSAiUFkzIiwKKyAgICB0YWdzID0gWworICAgICAgICAibm9hc2FuIiwKKyAgICAgICAgIm5vbXNhbiIsICAjIFB5dGhvbiBkb2Vzbid0IGxpa2UgdGhlc2Ugc3ltYm9scworICAgICAgICAibm91YnNhbiIsCisgICAgXSwKKyAgICBkZXBzID0gWworICAgICAgICAiOmF1ZGlvX3ByZXByb2Nlc3NvciIsCisgICAgXSwKICkKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvTWFrZWZpbGUuaW5jIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9NYWtlZmlsZS5pbmMKaW5kZXggZDJjZWFiNS4uYTFiNWI1NiAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9NYWtlZmlsZS5pbmMKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9NYWtlZmlsZS5pbmMKQEAgLTEsMjk5ICsxLDY0IEBACiAKLUlOQ0xVREVTICs9IFwKLSAtSSQoTUFLRUZJTEVfRElSKS9kb3dubG9hZHMva2lzc2ZmdAotCi1LSVNTRkZUX0xJQl9TUkNTIDo9Ci0KLUtJU1NGRlRfTElCX0hEUlMgOj0gXAotJChNQUtFRklMRV9ESVIpL2Rvd25sb2Fkcy9raXNzZmZ0L0NPUFlJTkcgXAotJChNQUtFRklMRV9ESVIpL2Rvd25sb2Fkcy9raXNzZmZ0L2tpc3NfZmZ0LmMgXAotJChNQUtFRklMRV9ESVIpL2Rvd25sb2Fkcy9raXNzZmZ0L2tpc3NfZmZ0LmggXAotJChNQUtFRklMRV9ESVIpL2Rvd25sb2Fkcy9raXNzZmZ0L19raXNzX2ZmdF9ndXRzLmggXAotJChNQUtFRklMRV9ESVIpL2Rvd25sb2Fkcy9raXNzZmZ0L3Rvb2xzL2tpc3NfZmZ0ci5jIFwKLSQoTUFLRUZJTEVfRElSKS9kb3dubG9hZHMva2lzc2ZmdC90b29scy9raXNzX2ZmdHIuaAotCiBNSUNST19TUEVFQ0hfVEVTVF9TUkNTIDo9IFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fc3BlZWNoX3Rlc3QuY2MgXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlcy9ub19taWNyb19mZWF0dXJlc19kYXRhLmNjIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMveWVzX21pY3JvX2ZlYXR1cmVzX2RhdGEuY2MKKyQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fc3BlZWNoX3Rlc3QuY2MKIAogTUlDUk9fU1BFRUNIX1RFU1RfSERSUyA6PSBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzL25vX21pY3JvX2ZlYXR1cmVzX2RhdGEuaCBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzL3llc19taWNyb19mZWF0dXJlc19kYXRhLmggXAorJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19tb2RlbF9zZXR0aW5ncy5oIFwKKyQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0aW5nL21pY3JvX3Rlc3QuaAogCi1TSU1QTEVfRkVBVFVSRVNfR0VORVJBVE9SX1RFU1RfU1JDUyA6PSBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy9zaW1wbGVfZmVhdHVyZXNfZ2VuZXJhdG9yLmNjIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL3NpbXBsZV9mZWF0dXJlc19nZW5lcmF0b3JfdGVzdC5jYyBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy9ub19wb3dlcl9zcGVjdHJ1bV9kYXRhLmNjIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL3llc19wb3dlcl9zcGVjdHJ1bV9kYXRhLmNjCitNSUNST19TUEVFQ0hfU1JDUyA6PSAkKE1JQ1JPX1NQRUVDSF9URVNUX1NSQ1MpCiAKLVNJTVBMRV9GRUFUVVJFU19HRU5FUkFUT1JfVEVTVF9IRFJTIDo9IFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL3NpbXBsZV9tb2RlbF9zZXR0aW5ncy5oIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL3NpbXBsZV9mZWF0dXJlc19nZW5lcmF0b3IuaCBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy9ub19wb3dlcl9zcGVjdHJ1bV9kYXRhLmggXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9zaW1wbGVfZmVhdHVyZXMveWVzX3Bvd2VyX3NwZWN0cnVtX2RhdGEuaAotCi1NSUNST19GRUFUVVJFU19MSUJfU1JDUyA6PSBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvZXhwZXJpbWVudGFsL21pY3JvZnJvbnRlbmQvbGliL2ZmdC5jYyBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvZXhwZXJpbWVudGFsL21pY3JvZnJvbnRlbmQvbGliL2ZmdF91dGlsLmNjIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9leHBlcmltZW50YWwvbWljcm9mcm9udGVuZC9saWIvZmlsdGVyYmFuay5jIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9leHBlcmltZW50YWwvbWljcm9mcm9udGVuZC9saWIvZmlsdGVyYmFua191dGlsLmMgXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL2V4cGVyaW1lbnRhbC9taWNyb2Zyb250ZW5kL2xpYi9mcm9udGVuZC5jIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9leHBlcmltZW50YWwvbWljcm9mcm9udGVuZC9saWIvZnJvbnRlbmRfdXRpbC5jIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9leHBlcmltZW50YWwvbWljcm9mcm9udGVuZC9saWIva2lzc19mZnRfaW50MTYuY2MgXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL2V4cGVyaW1lbnRhbC9taWNyb2Zyb250ZW5kL2xpYi9sb2dfbHV0LmMgXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL2V4cGVyaW1lbnRhbC9taWNyb2Zyb250ZW5kL2xpYi9sb2dfc2NhbGUuYyBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvZXhwZXJpbWVudGFsL21pY3JvZnJvbnRlbmQvbGliL2xvZ19zY2FsZV91dGlsLmMgXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL2V4cGVyaW1lbnRhbC9taWNyb2Zyb250ZW5kL2xpYi9ub2lzZV9yZWR1Y3Rpb24uYyBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvZXhwZXJpbWVudGFsL21pY3JvZnJvbnRlbmQvbGliL25vaXNlX3JlZHVjdGlvbl91dGlsLmMgXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL2V4cGVyaW1lbnRhbC9taWNyb2Zyb250ZW5kL2xpYi9wY2FuX2dhaW5fY29udHJvbC5jIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9leHBlcmltZW50YWwvbWljcm9mcm9udGVuZC9saWIvcGNhbl9nYWluX2NvbnRyb2xfdXRpbC5jIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9leHBlcmltZW50YWwvbWljcm9mcm9udGVuZC9saWIvd2luZG93LmMgXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL2V4cGVyaW1lbnRhbC9taWNyb2Zyb250ZW5kL2xpYi93aW5kb3dfdXRpbC5jIFwKLSQoS0lTU0ZGVF9MSUJfU1JDUykKLQotTUlDUk9fRkVBVFVSRVNfTElCX0hEUlMgOj0gXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL2V4cGVyaW1lbnRhbC9taWNyb2Zyb250ZW5kL2xpYi9iaXRzLmggXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL2V4cGVyaW1lbnRhbC9taWNyb2Zyb250ZW5kL2xpYi9mZnQuaCBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvZXhwZXJpbWVudGFsL21pY3JvZnJvbnRlbmQvbGliL2ZmdF91dGlsLmggXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL2V4cGVyaW1lbnRhbC9taWNyb2Zyb250ZW5kL2xpYi9maWx0ZXJiYW5rLmggXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL2V4cGVyaW1lbnRhbC9taWNyb2Zyb250ZW5kL2xpYi9maWx0ZXJiYW5rX3V0aWwuaCBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvZXhwZXJpbWVudGFsL21pY3JvZnJvbnRlbmQvbGliL2Zyb250ZW5kLmggXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL2V4cGVyaW1lbnRhbC9taWNyb2Zyb250ZW5kL2xpYi9mcm9udGVuZF91dGlsLmggXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL2V4cGVyaW1lbnRhbC9taWNyb2Zyb250ZW5kL2xpYi9raXNzX2ZmdF9jb21tb24uaCBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvZXhwZXJpbWVudGFsL21pY3JvZnJvbnRlbmQvbGliL2tpc3NfZmZ0X2ludDE2LmggXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL2V4cGVyaW1lbnRhbC9taWNyb2Zyb250ZW5kL2xpYi9sb2dfbHV0LmggXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL2V4cGVyaW1lbnRhbC9taWNyb2Zyb250ZW5kL2xpYi9sb2dfc2NhbGUuaCBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvZXhwZXJpbWVudGFsL21pY3JvZnJvbnRlbmQvbGliL2xvZ19zY2FsZV91dGlsLmggXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL2V4cGVyaW1lbnRhbC9taWNyb2Zyb250ZW5kL2xpYi9ub2lzZV9yZWR1Y3Rpb24uaCBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvZXhwZXJpbWVudGFsL21pY3JvZnJvbnRlbmQvbGliL25vaXNlX3JlZHVjdGlvbl91dGlsLmggXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL2V4cGVyaW1lbnRhbC9taWNyb2Zyb250ZW5kL2xpYi9wY2FuX2dhaW5fY29udHJvbC5oIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9leHBlcmltZW50YWwvbWljcm9mcm9udGVuZC9saWIvcGNhbl9nYWluX2NvbnRyb2xfdXRpbC5oIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9leHBlcmltZW50YWwvbWljcm9mcm9udGVuZC9saWIvd2luZG93LmggXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL2V4cGVyaW1lbnRhbC9taWNyb2Zyb250ZW5kL2xpYi93aW5kb3dfdXRpbC5oIFwKLSQoS0lTU0ZGVF9MSUJfSERSUykKLQotTUlDUk9fRkVBVFVSRVNfR0VORVJBVE9SX1NSQ1MgOj0gXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlcy9taWNyb19mZWF0dXJlc19nZW5lcmF0b3IuY2MgXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlcy9taWNyb19tb2RlbF9zZXR0aW5ncy5jYyBcCi0kKE1JQ1JPX0ZFQVRVUkVTX0xJQl9TUkNTKQotCi1NSUNST19GRUFUVVJFU19HRU5FUkFUT1JfSERSUyA6PSBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzL21pY3JvX2ZlYXR1cmVzX2dlbmVyYXRvci5oIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMvbWljcm9fbW9kZWxfc2V0dGluZ3MuaCBcCi0kKE1JQ1JPX0ZFQVRVUkVTX0xJQl9IRFJTKQotCi1NSUNST19GRUFUVVJFU19HRU5FUkFUT1JfVEVTVF9TUkNTIDo9IFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMvbWljcm9fZmVhdHVyZXNfZ2VuZXJhdG9yX3Rlc3QuY2MgXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlcy9ub19mZWF0dXJlX2RhdGFfc2xpY2UuY2MgXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlcy95ZXNfZmVhdHVyZV9kYXRhX3NsaWNlLmNjIFwKLSQoTUlDUk9fRkVBVFVSRVNfR0VORVJBVE9SX1NSQ1MpCi0KLU1JQ1JPX0ZFQVRVUkVTX0dFTkVSQVRPUl9URVNUX0hEUlMgOj0gXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlcy9ub19mZWF0dXJlX2RhdGFfc2xpY2UuaCBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzL3llc19mZWF0dXJlX2RhdGFfc2xpY2UuaCBcCi0kKE1JQ1JPX0ZFQVRVUkVTX0dFTkVSQVRPUl9IRFJTKQotCi1BVURJT19QUk9WSURFUl9URVNUX1NSQ1MgOj0gXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9hdWRpb19wcm92aWRlcl90ZXN0LmNjIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMvbWljcm9fbW9kZWxfc2V0dGluZ3MuY2MgXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9hdWRpb19wcm92aWRlci5jYwotCi1BVURJT19QUk9WSURFUl9URVNUX0hEUlMgOj0gXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlcy9taWNyb19tb2RlbF9zZXR0aW5ncy5oIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvYXVkaW9fcHJvdmlkZXIuaCBcCi0KLUFVRElPX1BST1ZJREVSX01PQ0tfVEVTVF9TUkNTIDo9IFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvYXVkaW9fcHJvdmlkZXJfbW9ja190ZXN0LmNjIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMvbWljcm9fbW9kZWxfc2V0dGluZ3MuY2MgXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9hdWRpb19wcm92aWRlcl9tb2NrLmNjCi0KLUFVRElPX1BST1ZJREVSX01PQ0tfVEVTVF9IRFJTIDo9IFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMvbWljcm9fbW9kZWxfc2V0dGluZ3MuaCBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL2F1ZGlvX3Byb3ZpZGVyLmggXAotCi1GRUFUVVJFX1BST1ZJREVSX1RFU1RfU1JDUyA6PSBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL2ZlYXR1cmVfcHJvdmlkZXJfdGVzdC5jYyBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL2F1ZGlvX3Byb3ZpZGVyLmNjIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvZmVhdHVyZV9wcm92aWRlci5jYyBcCi0kKE1JQ1JPX0ZFQVRVUkVTX0dFTkVSQVRPUl9TUkNTKQotCi1GRUFUVVJFX1BST1ZJREVSX1RFU1RfSERSUyA6PSBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL2F1ZGlvX3Byb3ZpZGVyLmggXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9mZWF0dXJlX3Byb3ZpZGVyLmggXAotJChNSUNST19GRUFUVVJFU19HRU5FUkFUT1JfSERSUykKLQotRkVBVFVSRV9QUk9WSURFUl9NT0NLX1RFU1RfU1JDUyA6PSBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL2ZlYXR1cmVfcHJvdmlkZXJfdGVzdC5jYyBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL2F1ZGlvX3Byb3ZpZGVyX21vY2suY2MgXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9mZWF0dXJlX3Byb3ZpZGVyLmNjIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMvbm9fbWljcm9fZmVhdHVyZXNfZGF0YS5jYyBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzL3llc19taWNyb19mZWF0dXJlc19kYXRhLmNjIFwKLSQoTUlDUk9fRkVBVFVSRVNfR0VORVJBVE9SX1NSQ1MpCi0KLUZFQVRVUkVfUFJPVklERVJfTU9DS19URVNUX0hEUlMgOj0gXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9hdWRpb19wcm92aWRlci5oIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvZmVhdHVyZV9wcm92aWRlci5oIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMvbm9fbWljcm9fZmVhdHVyZXNfZGF0YS5oIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMveWVzX21pY3JvX2ZlYXR1cmVzX2RhdGEuaCBcCi0kKE1JQ1JPX0ZFQVRVUkVTX0dFTkVSQVRPUl9IRFJTKQotCi1SRUNPR05JWkVfQ09NTUFORFNfVEVTVF9TUkNTIDo9IFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvcmVjb2duaXplX2NvbW1hbmRzX3Rlc3QuY2MgXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlcy9taWNyb19tb2RlbF9zZXR0aW5ncy5jYyBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3JlY29nbml6ZV9jb21tYW5kcy5jYwotCi1SRUNPR05JWkVfQ09NTUFORFNfVEVTVF9IRFJTIDo9IFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMvbWljcm9fbW9kZWxfc2V0dGluZ3MuaCBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3JlY29nbml6ZV9jb21tYW5kcy5oCi0KLUNPTU1BTkRfUkVTUE9OREVSX1RFU1RfU1JDUyA6PSBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL2NvbW1hbmRfcmVzcG9uZGVyX3Rlc3QuY2MgXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9jb21tYW5kX3Jlc3BvbmRlci5jYwotCi1DT01NQU5EX1JFU1BPTkRFUl9URVNUX0hEUlMgOj0gXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9jb21tYW5kX3Jlc3BvbmRlci5oCi0KLU1JQ1JPX1NQRUVDSF9TUkNTIDo9IFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWFpbi5jYyBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21haW5fZnVuY3Rpb25zLmNjIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvYXVkaW9fcHJvdmlkZXIuY2MgXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9mZWF0dXJlX3Byb3ZpZGVyLmNjIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMvbm9fbWljcm9fZmVhdHVyZXNfZGF0YS5jYyBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzL3llc19taWNyb19mZWF0dXJlc19kYXRhLmNjIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvcmVjb2duaXplX2NvbW1hbmRzLmNjIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvY29tbWFuZF9yZXNwb25kZXIuY2MgXAotJChNSUNST19GRUFUVVJFU19HRU5FUkFUT1JfU1JDUykKLQotTUlDUk9fU1BFRUNIX0hEUlMgOj0gXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9hdWRpb19wcm92aWRlci5oIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvZmVhdHVyZV9wcm92aWRlci5oIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMvbm9fbWljcm9fZmVhdHVyZXNfZGF0YS5oIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMveWVzX21pY3JvX2ZlYXR1cmVzX2RhdGEuaCBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3JlY29nbml6ZV9jb21tYW5kcy5oIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvY29tbWFuZF9yZXNwb25kZXIuaCBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21haW5fZnVuY3Rpb25zLmggXAotJChNSUNST19GRUFUVVJFU19HRU5FUkFUT1JfSERSUykKLQotTUlDUk9fU1BFRUNIX01PQ0tfU1JDUyA6PSBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21haW4uY2MgXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9tYWluX2Z1bmN0aW9ucy5jYyBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL2F1ZGlvX3Byb3ZpZGVyX21vY2suY2MgXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9mZWF0dXJlX3Byb3ZpZGVyLmNjIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMvbm9fbWljcm9fZmVhdHVyZXNfZGF0YS5jYyBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzL3llc19taWNyb19mZWF0dXJlc19kYXRhLmNjIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvcmVjb2duaXplX2NvbW1hbmRzLmNjIFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvY29tbWFuZF9yZXNwb25kZXIuY2MgXAotJChNSUNST19GRUFUVVJFU19HRU5FUkFUT1JfU1JDUykKLQotTUlDUk9fU1BFRUNIX01PQ0tfSERSUyA6PSBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL2F1ZGlvX3Byb3ZpZGVyLmggXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9mZWF0dXJlX3Byb3ZpZGVyLmggXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlcy9taWNyb19mZWF0dXJlc19nZW5lcmF0b3IuaCBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzL25vX21pY3JvX2ZlYXR1cmVzX2RhdGEuaCBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzL3llc19taWNyb19mZWF0dXJlc19kYXRhLmggXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9yZWNvZ25pemVfY29tbWFuZHMuaCBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL2NvbW1hbmRfcmVzcG9uZGVyLmggXAotJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9tYWluX2Z1bmN0aW9ucy5oIFwKLSQoTUlDUk9fRkVBVFVSRVNfR0VORVJBVE9SX0hEUlMpCitNSUNST19TUEVFQ0hfSERSUyA6PSAkKE1JQ1JPX1NQRUVDSF9URVNUX0hEUlMpCiAKIE1JQ1JPX1NQRUVDSF9HRU5FUkFUT1JfSU5QVVRTIDo9IFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fc3BlZWNoLnRmbGl0ZSBcCiskKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21vZGVscy9taWNyb19zcGVlY2hfcXVhbnRpemVkLnRmbGl0ZSBcCiskKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21vZGVscy9hdWRpb19wcmVwcm9jZXNzb3JfaW50OC50ZmxpdGUgXAogJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC90ZXN0ZGF0YS9ub18xMDAwbXMud2F2IFwKLSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvdGVzdGRhdGEvbm9fMzBtcy53YXYgXAogJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC90ZXN0ZGF0YS95ZXNfMTAwMG1zLndhdiBcCiskKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3Rlc3RkYXRhL3NpbGVuY2VfMTAwMG1zLndhdiBcCiskKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3Rlc3RkYXRhL25vaXNlXzEwMDBtcy53YXYgXAorJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC90ZXN0ZGF0YS9ub18zMG1zLndhdiBcCiAkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3Rlc3RkYXRhL3llc18zMG1zLndhdgogCiBNSUNST19TUEVFQ0hfR0VORVJBVEVEX1NSQ1MgOj0gXAotJChHRU5FUkFURURfU1JDU19ESVIpJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19zcGVlY2hfbW9kZWxfZGF0YS5jYyBcCiskKEdFTkVSQVRFRF9TUkNTX0RJUikkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21vZGVscy9taWNyb19zcGVlY2hfcXVhbnRpemVkX21vZGVsX2RhdGEuY2MgXAorJChHRU5FUkFURURfU1JDU19ESVIpJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9tb2RlbHMvYXVkaW9fcHJlcHJvY2Vzc29yX2ludDhfbW9kZWxfZGF0YS5jYyBcCiAkKEdFTkVSQVRFRF9TUkNTX0RJUikkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3Rlc3RkYXRhL25vXzEwMDBtc19hdWRpb19kYXRhLmNjIFwKLSQoR0VORVJBVEVEX1NSQ1NfRElSKSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvdGVzdGRhdGEvbm9fMzBtc19hdWRpb19kYXRhLmNjIFwKICQoR0VORVJBVEVEX1NSQ1NfRElSKSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvdGVzdGRhdGEveWVzXzEwMDBtc19hdWRpb19kYXRhLmNjIFwKKyQoR0VORVJBVEVEX1NSQ1NfRElSKSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvdGVzdGRhdGEvc2lsZW5jZV8xMDAwbXNfYXVkaW9fZGF0YS5jYyBcCiskKEdFTkVSQVRFRF9TUkNTX0RJUikkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3Rlc3RkYXRhL25vaXNlXzEwMDBtc19hdWRpb19kYXRhLmNjIFwKKyQoR0VORVJBVEVEX1NSQ1NfRElSKSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvdGVzdGRhdGEvbm9fMzBtc19hdWRpb19kYXRhLmNjIFwKICQoR0VORVJBVEVEX1NSQ1NfRElSKSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvdGVzdGRhdGEveWVzXzMwbXNfYXVkaW9fZGF0YS5jYwogCiBNSUNST19TUEVFQ0hfR0VORVJBVEVEX0hEUlMgOj0gXAotJChHRU5FUkFURURfU1JDU19ESVIpJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19zcGVlY2hfbW9kZWxfZGF0YS5oIFwKKyQoR0VORVJBVEVEX1NSQ1NfRElSKSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbW9kZWxzL21pY3JvX3NwZWVjaF9xdWFudGl6ZWRfbW9kZWxfZGF0YS5oIFwKKyQoR0VORVJBVEVEX1NSQ1NfRElSKSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbW9kZWxzL2F1ZGlvX3ByZXByb2Nlc3Nvcl9pbnQ4X21vZGVsX2RhdGEuaCBcCiAkKEdFTkVSQVRFRF9TUkNTX0RJUikkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3Rlc3RkYXRhL25vXzEwMDBtc19hdWRpb19kYXRhLmggXAotJChHRU5FUkFURURfU1JDU19ESVIpJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC90ZXN0ZGF0YS9ub18zMG1zX2F1ZGlvX2RhdGEuaCBcCiAkKEdFTkVSQVRFRF9TUkNTX0RJUikkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3Rlc3RkYXRhL3llc18xMDAwbXNfYXVkaW9fZGF0YS5oIFwKKyQoR0VORVJBVEVEX1NSQ1NfRElSKSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvdGVzdGRhdGEvc2lsZW5jZV8xMDAwbXNfYXVkaW9fZGF0YS5oIFwKKyQoR0VORVJBVEVEX1NSQ1NfRElSKSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvdGVzdGRhdGEvbm9pc2VfMTAwMG1zX2F1ZGlvX2RhdGEuaCBcCiskKEdFTkVSQVRFRF9TUkNTX0RJUikkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3Rlc3RkYXRhL25vXzMwbXNfYXVkaW9fZGF0YS5oIFwKICQoR0VORVJBVEVEX1NSQ1NfRElSKSQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvdGVzdGRhdGEveWVzXzMwbXNfYXVkaW9fZGF0YS5oCiAKLSNGaW5kIGFueSBwbGF0Zm9ybSAtIHNwZWNpZmljIHJ1bGVzIGZvciB0aGlzIGV4YW1wbGUuCi1pbmNsdWRlICQod2lsZGNhcmQgJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC8qL01ha2VmaWxlLmluYykKLQogIyBUT0RPKGIvMTYxNDg5MjUyKTogRGlzYWJsaW5nIHdhcm5pbmdzIGZvciB0aGlzIGV4YW1wbGUgdW50aWwgd2UgaGF2ZSBhIGJldHRlcgogIyB3YXkgdG8gYnVpbGQgdGhpcmRfcGFydHkgY29kZSB3aXRoIGEgcmVkdWNlZCBsaXN0IG9mIENGTEFHUy4KKyMgWHRlbnNhIGhpZmk1L2hpZmk0IHhhX25ubGliCiBDQ0ZMQUdTIDo9ICQoZmlsdGVyLW91dCAkKENDX1dBUk5JTkdTKSwkKENDRkxBR1MpKQogCi0jIFRlc3QgdGhlIGNvZGUgZm9yIGZlYXR1cmUgZ2VuZXJhdGlvbi4KLWlmbmVxICgkKFRBUkdFVF9BUkNIKSwgJChmaWx0ZXIgJChUQVJHRVRfQVJDSCksIGhpZmk1IGhpZmkzeikpCi0gICQoZXZhbCAkKGNhbGwgbWljcm9saXRlX3Rlc3QsbWljcm9fZmVhdHVyZXNfZ2VuZXJhdG9yX3Rlc3QsXAotICAkKE1JQ1JPX0ZFQVRVUkVTX0dFTkVSQVRPUl9URVNUX1NSQ1MpLCQoTUlDUk9fRkVBVFVSRVNfR0VORVJBVE9SX1RFU1RfSERSUyksJChNSUNST19TUEVFQ0hfR0VORVJBVE9SX0lOUFVUUykpKQotZW5kaWYKLQogIyBUZXN0cyBsb2FkaW5nIGFuZCBydW5uaW5nIGEgc3BlZWNoIG1vZGVsLgogJChldmFsICQoY2FsbCBtaWNyb2xpdGVfdGVzdCxtaWNyb19zcGVlY2hfdGVzdCxcCiAkKE1JQ1JPX1NQRUVDSF9URVNUX1NSQ1MpLCQoTUlDUk9fU1BFRUNIX1RFU1RfSERSUyksJChNSUNST19TUEVFQ0hfR0VORVJBVE9SX0lOUFVUUykpKQogCi0jIFRPRE8oYi8yNjg1NjgwODkpOiBUaGlzIHRlc3QgaXMgdGFraW5nIHZlcnkgbG9uZyB0aW1lIHRvIGZpbmlzaDsgY2F1c2luZyB0aGUKLSMgQ0kgdG8gcnVuIGZvciBhIGxvbmcgdGltZSB0byBmaW5pc2guCi1pZm5lcSAoJChUQVJHRVRfQVJDSCksICQoZmlsdGVyICQoVEFSR0VUX0FSQ0gpLCBoaWZpbWluaSBoaWZpNSBoaWZpM3opKQotICAjIFRlc3QgdGhlIGNvZGUgZm9yIGZlYXR1cmUgZ2VuZXJhdGlvbi4KLSAgJChldmFsICQoY2FsbCBtaWNyb2xpdGVfdGVzdCxzaW1wbGVfZmVhdHVyZXNfZ2VuZXJhdG9yX3Rlc3QsXAotICAkKFNJTVBMRV9GRUFUVVJFU19HRU5FUkFUT1JfVEVTVF9TUkNTKSwkKFNJTVBMRV9GRUFUVVJFU19HRU5FUkFUT1JfVEVTVF9IRFJTKSwkKE1JQ1JPX1NQRUVDSF9HRU5FUkFUT1JfSU5QVVRTKSkpCi1lbmRpZgotCi0jIFRlc3RzIHRoZSBhdWRpbyBwcm92aWRlciBtb2R1bGUuCi0kKGV2YWwgJChjYWxsIG1pY3JvbGl0ZV90ZXN0LGF1ZGlvX3Byb3ZpZGVyX3Rlc3QsXAotJChBVURJT19QUk9WSURFUl9URVNUX1NSQ1MpLCQoQVVESU9fUFJPVklERVJfVEVTVF9IRFJTKSkpCi0KLSMgVGVzdHMgdGhlIGF1ZGlvIHByb3ZpZGVyIG1vY2sgbW9kdWxlLgotJChldmFsICQoY2FsbCBtaWNyb2xpdGVfdGVzdCxhdWRpb19wcm92aWRlcl9tb2NrX3Rlc3QsXAotJChBVURJT19QUk9WSURFUl9NT0NLX1RFU1RfU1JDUyksJChBVURJT19QUk9WSURFUl9NT0NLX1RFU1RfSERSUyksJChNSUNST19TUEVFQ0hfR0VORVJBVE9SX0lOUFVUUykpKQotCi0jIFRlc3RzIHRoZSBmZWF0dXJlIHByb3ZpZGVyIG1vZHVsZS4KLWlmbmVxICgkKFRBUkdFVF9BUkNIKSwgaGlmaTN6KQotICAkKGV2YWwgJChjYWxsIG1pY3JvbGl0ZV90ZXN0LGZlYXR1cmVfcHJvdmlkZXJfdGVzdCxcCi0gICQoRkVBVFVSRV9QUk9WSURFUl9URVNUX1NSQ1MpLCQoRkVBVFVSRV9QUk9WSURFUl9URVNUX0hEUlMpKSkKLWVuZGlmCi0KLSMgVGVzdHMgdGhlIGZlYXR1cmUgcHJvdmlkZXIgbW9kdWxlIHVzaW5nIHRoZSBtb2NrIGF1ZGlvIHByb3ZpZGVyLgotaWZuZXEgKCQoVEFSR0VUX0FSQ0gpLCBoaWZpM3opCi0gICQoZXZhbCAkKGNhbGwgbWljcm9saXRlX3Rlc3QsZmVhdHVyZV9wcm92aWRlcl9tb2NrX3Rlc3QsXAotICAkKEZFQVRVUkVfUFJPVklERVJfTU9DS19URVNUX1NSQ1MpLCQoRkVBVFVSRV9QUk9WSURFUl9NT0NLX1RFU1RfSERSUyksJChNSUNST19TUEVFQ0hfR0VORVJBVE9SX0lOUFVUUykpKQotZW5kaWYKLQotIyBUZXN0cyB0aGUgY29tbWFuZCByZWNvZ25pemVyIG1vZHVsZS4KLSQoZXZhbCAkKGNhbGwgbWljcm9saXRlX3Rlc3QscmVjb2duaXplX2NvbW1hbmRzX3Rlc3QsXAotJChSRUNPR05JWkVfQ09NTUFORFNfVEVTVF9TUkNTKSwkKFJFQ09HTklaRV9DT01NQU5EU19URVNUX0hEUlMpKSkKLQotIyBUZXN0cyByZXNwb25kaW5nIHRvIGEgY29tbWFuZC4KLSQoZXZhbCAkKGNhbGwgbWljcm9saXRlX3Rlc3QsY29tbWFuZF9yZXNwb25kZXJfdGVzdCxcCi0kKENPTU1BTkRfUkVTUE9OREVSX1RFU1RfU1JDUyksJChDT01NQU5EX1JFU1BPTkRFUl9URVNUX0hEUlMpKSkKLQotIyBCdWlsZHMgYSBzdGFuZGFsb25lIHNwZWVjaCBjb21tYW5kIHJlY29nbml6ZXIgYmluYXJ5LgorIyBCdWlsZHMgYSBzdGFuZGFsb25lIGJpbmFyeS4KICQoZXZhbCAkKGNhbGwgbWljcm9saXRlX3Rlc3QsbWljcm9fc3BlZWNoLFwKICQoTUlDUk9fU1BFRUNIX1NSQ1MpLCQoTUlDUk9fU1BFRUNIX0hEUlMpLCQoTUlDUk9fU1BFRUNIX0dFTkVSQVRPUl9JTlBVVFMpKSkKIAotIyBCdWlsZHMgYSBzdGFuZGFsb25lIHNwZWVjaCBjb21tYW5kIHJlY29nbml6ZXIgYmluYXJ5IHVzaW5nIGZha2UgYXVkaW8gaW5wdXQuCi0kKGV2YWwgJChjYWxsIG1pY3JvbGl0ZV90ZXN0LG1pY3JvX3NwZWVjaF9tb2NrLFwKLSQoTUlDUk9fU1BFRUNIX01PQ0tfU1JDUyksJChNSUNST19TUEVFQ0hfTU9DS19IRFJTKSwkKE1JQ1JPX1NQRUVDSF9HRU5FUkFUT1JfSU5QVVRTKSkpCi0KICMgQWRkIHNvdXJjZXMgYW5kIGhlYWRlcnMgZ2VuZXJhdGVkIGZyb20gJChNSUNST19TUEVFQ0hfR0VORVJBVE9SX0lOUFVUUykuCiBNSUNST19TUEVFQ0hfU1JDUyArPSAkKE1JQ1JPX1NQRUVDSF9HRU5FUkFURURfU1JDUykKIE1JQ1JPX1NQRUVDSF9IRFJTICs9ICQoTUlDUk9fU1BFRUNIX0dFTkVSQVRFRF9IRFJTKQogCi1NSUNST19TUEVFQ0hfTU9DS19TUkNTICs9ICQoTUlDUk9fU1BFRUNIX0dFTkVSQVRFRF9TUkNTKQotTUlDUk9fU1BFRUNIX01PQ0tfSERSUyArPSAkKE1JQ1JPX1NQRUVDSF9HRU5FUkFURURfSERSUykKLQogbGlzdF9taWNyb19zcGVlY2hfZXhhbXBsZV9zb3VyY2VzOgogCUBlY2hvICQoTUlDUk9fU1BFRUNIX1NSQ1MpCiAKIGxpc3RfbWljcm9fc3BlZWNoX2V4YW1wbGVfaGVhZGVyczoKIAlAZWNobyAkKE1JQ1JPX1NQRUVDSF9IRFJTKQotCi1saXN0X21pY3JvX3NwZWVjaF9tb2NrX2V4YW1wbGVfc291cmNlczoKLQlAZWNobyAkKE1JQ1JPX1NQRUVDSF9NT0NLX1NSQ1MpCi0KLWxpc3RfbWljcm9fc3BlZWNoX21vY2tfZXhhbXBsZV9oZWFkZXJzOgotCUBlY2hvICQoTUlDUk9fU1BFRUNIX01PQ0tfSERSUykKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvUkVBRE1FLm1kIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9SRUFETUUubWQKaW5kZXggOGE0YWE3Ny4uODRhYWVjMSAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9SRUFETUUubWQKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9SRUFETUUubWQKQEAgLTIsMzIxICsyLDI3NSBAQAogCiAjIE1pY3JvIFNwZWVjaCBFeGFtcGxlCiAKLVRoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gcnVuIGEgMjAga0IgbW9kZWwgdGhhdCBjYW4gcmVjb2duaXplIDIga2V5d29yZHMsCi0ieWVzIiBhbmQgIm5vIiwgZnJvbSBzcGVlY2ggZGF0YS4KK1RoaXMgZXhhbXBsZSBzaG93cyBob3cgdG8gcnVuIGluZmVyZW5jZSB1c2luZyBUZW5zb3JGbG93IExpdGUgTWljcm8gKFRGTE0pCitvbiB0d28gbW9kZWxzIGZvciB3YWtlLXdvcmQgcmVjb2duaXRpb24uCitUaGUgZmlyc3QgbW9kZWwgaXMgYW4gYXVkaW8gcHJlcHJvY2Vzc29yIHRoYXQgZ2VuZXJhdGVzIHNwZWN0cm9ncmFtIGRhdGEKK2Zyb20gcmF3IGF1ZGlvIHNhbXBsZXMuCitUaGUgc2Vjb25kIGlzIHRoZSBNaWNybyBTcGVlY2ggbW9kZWwsIGEgbGVzcyB0aGFuIDIwIGtCIG1vZGVsCit0aGF0IGNhbiByZWNvZ25pemUgMiBrZXl3b3JkcywgInllcyIgYW5kICJubyIsIGZyb20gc3BlZWNoIGRhdGEuCitUaGUgTWljcm8gU3BlZWNoIG1vZGVsIHRha2VzIHRoZSBzcGVjdHJvZ3JhbSBkYXRhIGFzIGlucHV0IGFuZCBwcm9kdWNlcworY2F0ZWdvcnkgcHJvYmFiaWxpdGllcy4KIAotVGhlIGFwcGxpY2F0aW9uIGxpc3RlbnMgdG8gaXRzIHN1cnJvdW5kaW5ncyB3aXRoIGEgbWljcm9waG9uZSBhbmQgaW5kaWNhdGVzCi13aGVuIGl0IGhhcyBkZXRlY3RlZCBhIHdvcmQgYnkgbGlnaHRpbmcgYW4gTEVEIG9yIGRpc3BsYXlpbmcgZGF0YSBvbiBhCi1zY3JlZW4sIGRlcGVuZGluZyBvbiB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBkZXZpY2UuCi0KLSFbQW5pbWF0aW9uIG9uIEFyZHVpbm9dKGltYWdlcy9hbmltYXRpb25fb25fYXJkdWluby5naWYpCi0KLVRoZSBjb2RlIGhhcyBhIHNtYWxsIGZvb3RwcmludCAoZm9yIGV4YW1wbGUsIGFyb3VuZCAyMiBraWxvYnl0ZXMgb24gYSBDb3J0ZXgKLU0zKSBhbmQgb25seSB1c2VzIGFib3V0IDEwIGtpbG9ieXRlcyBvZiBSQU0gZm9yIHdvcmtpbmcgbWVtb3J5LCBzbyBpdCdzIGFibGUgdG8KLXJ1biBvbiBzeXN0ZW1zIGxpa2UgYW4gU1RNMzJGMTAzIHdpdGggb25seSAyMCBraWxvYnl0ZXMgb2YgdG90YWwgU1JBTSBhbmQgNjQKLWtpbG9ieXRlcyBvZiBGbGFzaC4KIAogIyMgVGFibGUgb2YgY29udGVudHMKIAotLSAgIFtEZXBsb3kgdG8gU1RNMzJGNzQ2XSgjZGVwbG95LXRvLVNUTTMyRjc0NikKLS0gICBbRGVwbG95IHRvIE5YUCBGUkRNIEs2NkZdKCNkZXBsb3ktdG8tbnhwLWZyZG0tazY2ZikKLS0gICBbRGVwbG95IHRvIENFVkEgQlgxL1NQNTAwXSgjZGVwbG95LXRvLWNldmEtYngxKQotLSAgIFtSdW4gb24gbWFjT1NdKCNydW4tb24tbWFjb3MpCi0tICAgW1J1biB0aGUgdGVzdHMgb24gYSBkZXZlbG9wbWVudCBtYWNoaW5lXSgjcnVuLXRoZS10ZXN0cy1vbi1hLWRldmVsb3BtZW50LW1hY2hpbmUpCistICAgW0F1ZGlvIFByZXByb2Nlc3Nvcl0oI2F1ZGlvLXByZXByb2Nlc3NvcikKKy0gICBbTWljcm8gU3BlZWNoIE1vZGVsIEFyY2hpdGVjdHVyZV0oI21pY3JvLXNwZWVjaC1tb2RlbC1hcmNoaXRlY3R1cmUpCistICAgW1J1biB0aGUgQysrIHRlc3RzIG9uIGEgZGV2ZWxvcG1lbnQgbWFjaGluZV0oI3J1bi10aGUtYy10ZXN0cy1vbi1hLWRldmVsb3BtZW50LW1hY2hpbmUpCistICAgW1J1biB0aGUgZXZhbHVhdGUucHkgc2NyaXB0IG9uIGEgZGV2ZWxvcG1lbnQgbWFjaGluZV0oI3J1bi10aGUtZXZhbHVhdGVweS1zY3JpcHQtb24tYS1kZXZlbG9wbWVudC1tYWNoaW5lKQorLSAgIFtSdW4gdGhlIGV2YWx1YXRlX3Rlc3QucHkgc2NyaXB0IG9uIGEgZGV2ZWxvcG1lbnQgbWFjaGluZV0oI3J1bi10aGUtZXZhbHVhdGVfdGVzdHB5LXNjcmlwdC1vbi1hLWRldmVsb3BtZW50LW1hY2hpbmUpCistICAgW0NvbnZlcnRpbmcgbW9kZWxzIG9yIGF1ZGlvIHNhbXBsZXMgdG8gQysrXSgjY29udmVydGluZy1tb2RlbHMtb3ItYXVkaW8tc2FtcGxlcy10by1jKQogLSAgIFtUcmFpbiB5b3VyIG93biBtb2RlbF0oI3RyYWluLXlvdXItb3duLW1vZGVsKQogCi0jIyBEZXBsb3kgdG8gU1RNMzJGNzQ2CisjIyBBdWRpbyBQcmVwcm9jZXNzb3IKIAotVGhlIGZvbGxvd2luZyBpbnN0cnVjdGlvbnMgd2lsbCBoZWxwIHlvdSBidWlsZCBhbmQgZGVwbG95IHRoZSBleGFtcGxlIHRvIHRoZQotW1NUTTMyRjcgZGlzY292ZXJ5IGtpdF0oaHR0cHM6Ly9vcy5tYmVkLmNvbS9wbGF0Zm9ybXMvU1QtRGlzY292ZXJ5LUY3NDZORy8pCi11c2luZyBbQVJNIE1iZWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9BUk1tYmVkL21iZWQtY2xpKS4KK1RoZSBBdWRpbyBQcmVwcm9jZXNzb3IgbW9kZWwgY29udmVydHMgcmF3IGF1ZGlvIHNhbXBsZXMgaW50byBhIHNwZWN0cm9ncmFwaGljIGZlYXR1cmUuCitBdWRpbyBzYW1wbGVzIGFyZSBpbnB1dCB0byB0aGUgbW9kZWwgaW4gd2luZG93ZWQgZnJhbWVzLCBlYWNoIHdpbmRvdyBvdmVybGFwcGluZwordGhlIHByZXZpb3VzLiAgV2hlbiBzdWZmaWNpZW50IGZlYXR1cmVzIGhhdmUgYmVlbiBhY2N1bXVsYXRlZCwgdGhvc2UgZmVhdHVyZXMgY2FuCitiZSBwcm92aWRlZCBhcyBpbnB1dCB0byB0aGUgTWljcm8gU3BlZWNoIG1vZGVsLgogCi1CZWZvcmUgd2UgYmVnaW4sIHlvdSdsbCBuZWVkIHRoZSBmb2xsb3dpbmc6CitUaGlzIG1vZGVsIHByb3ZpZGVzIGEgcmVwbGljYXRpb24gb2YgdGhlIGxlZ2FjeSBwcmVwcm9jZXNzaW5nIHVzZWQgZHVyaW5nIHRyYWluaW5nCitvZiB0aGUgTWljcm8gU3BlZWNoIG1vZGVsLiAgRm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gb24gYXVkaW8gcHJlcHJvY2Vzc2luZyBkdXJpbmcgdHJhaW5pbmcsCitwbGVhc2UgcmVmZXIgdG8gdGhlIFt0cmFpbmluZyBSRUFETUVdKHRyYWluL1JFQURNRS5tZCNwcmVwcm9jZXNzaW5nLXNwZWVjaC1pbnB1dCkgZG9jdW1lbnRhdGlvbi4KIAotLSBTVE0zMkY3IGRpc2NvdmVyeSBraXQgYm9hcmQKLS0gTWluaS1VU0IgY2FibGUKLS0gQVJNIE1iZWQgQ0xJIChbaW5zdGFsbGF0aW9uIGluc3RydWN0aW9uc10oaHR0cHM6Ly9vcy5tYmVkLmNvbS9kb2NzL21iZWQtb3MvdjYuOS9xdWljay1zdGFydC9idWlsZC13aXRoLW1iZWQtY2xpLmh0bWwpLiBDaGVjayBpdCBvdXQgZm9yIE1hY09TIENhdGFsaW5hIC0gW21iZWQtY2xpIGlzIGJyb2tlbiBvbiBNYWNPUyBDYXRhbGluYSAjOTMwXShodHRwczovL2dpdGh1Yi5jb20vQVJNbWJlZC9tYmVkLWNsaS9pc3N1ZXMvOTMwI2lzc3VlY29tbWVudC02NjA1NTA3MzQpKQotLSBQeXRob24gMyBhbmQgcGlwMworQXVkaW8gUHJlcHJvY2Vzc2luZyBtb2RlbHMgcHJvdmlkaW5nIGBpbnQ4YCBhbmQgYGZsb2F0MzJgIG91dHB1dCwgcmVhZHkgZm9yIHVzZQord2l0aCB0aGUgTWljcm8gU3BlZWNoIG1vZGVsLCBhcmUgcHJvdmlkZWQgaW4gdGhlIFttb2RlbHNdKG1vZGVscy8pIGRpcmVjdG9yeS4KK1RoZXNlIG1vZGVscyBleHBlY3QgdGhlIGF1ZGlvIGlucHV0IHRvIGNvbmZvcm0gdG86CisqIDMwbXMgd2luZG93IGZyYW1lCisqIDIwbXMgd2luZG93IHN0cmlkZQorKiAxNktIeiBzYW1wbGUgcmF0ZQorKiAxNi1iaXQgc2lnbmVkIFBDTSBkYXRhCisqIHNpbmdsZSBjaGFubmVsIChtb25vKQogCi1TaW5jZSBNYmVkIHJlcXVpcmVzIGEgc3BlY2lhbCBmb2xkZXIgc3RydWN0dXJlIGZvciBwcm9qZWN0cywgd2UnbGwgZmlyc3QgcnVuIGEKLWNvbW1hbmQgdG8gZ2VuZXJhdGUgYSBzdWJmb2xkZXIgY29udGFpbmluZyB0aGUgcmVxdWlyZWQgc291cmNlIGZpbGVzIGluIHRoaXMKLXN0cnVjdHVyZToKKyMjIyBNb2RlbCBBcmNoaXRlY3R1cmUKIAotYGBgCi1tYWtlIC1mIHRlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL01ha2VmaWxlIFRBUkdFVD1kaXNjb19mNzQ2bmcgT1BUSU1JWkVEX0tFUk5FTF9ESVI9Y21zaXNfbm4gZ2VuZXJhdGVfbWljcm9fc3BlZWNoX21iZWRfcHJvamVjdAotYGBgCitUaGlzIG1vZGVsIGNvbnNpc3RzIHByaW1hcmlseSBvZiBbU2lnbmFsIExpYnJhcnldKGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmbGl0ZS1taWNyby9ibG9iL21haW4vcHl0aG9uL3RmbGl0ZV9taWNyby9zaWduYWwpIG9wZXJhdGlvbnMuCitUaGUgbGlicmFyeSBpcyBhIHNldCBvZiBQeXRob24gbWV0aG9kcywgYW5kIGJpbmRpbmdzIHRvIGBDKytgIGxpYnJhcnkgY29kZS4KK1RvIGFsbG93IGZvciB1c2Ugd2l0aCB0aGUgYFRGTE0gTWljcm9JbnRlcnByZXRlcmAsIGEgc2V0IG9mIFtTaWduYWwgTGlicmFyeSBrZXJuZWxzXShodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmxpdGUtbWljcm8vYmxvYi9tYWluL3NpZ25hbC9taWNyby9rZXJuZWxzKQoraXMgYWxzbyBwcm92aWRlZC4KIAotUnVubmluZyB0aGUgbWFrZSBjb21tYW5kIHdpbGwgcmVzdWx0IGluIHRoZSBjcmVhdGlvbiBvZiBhIG5ldyBmb2xkZXI6CitUaGUgW2F1ZGlvX3ByZXByb2Nlc3Nvci5weV0oYXVkaW9fcHJlcHJvY2Vzc29yLnB5KSBzY3JpcHQgcHJvdmlkZXMgYSBjb21wbGV0ZSBleGFtcGxlCitvZiBob3cgdG8gdXNlIHRoZSBgU2lnbmFsIExpYnJhcnlgIHdpdGhpbiB5b3VyIG93biBQeXRob24gYXBwbGljYXRpb24uICBUaGlzIHNjcmlwdAoraGFzIHN1cHBvcnQgZm9yIFRlbnNvckZsb3cgZWFnZXItZXhlY3V0aW9uIG1vZGUsIGdyYXBoLWV4ZWN1dGlvbiBtb2RlLCBhbmQKK2BURkxNIE1pY3JvSW50ZXJwcmV0ZXJgIGluZmVyZW5jZSBvcGVyYXRpb25zLgogCi1gYGAKLWdlbi9kaXNjb19mNzQ2bmdfY29ydGV4LW00X2RlZmF1bHQvcHJqL21pY3JvX3NwZWVjaC9tYmVkCi1gYGAKK1s8aW1nIHNyYz0iaW1hZ2VzL2F1ZGlvX3ByZXByb2Nlc3Nvcl9pbnQ4LnBuZyIgd2lkdGg9IjkwMCIgYWx0PSJtb2RlbCBhcmNoaXRlY3R1cmUiLz5dKGltYWdlcy9hdWRpb19wcmVwcm9jZXNzb3JfaW50OC5wbmcpCiAKLVRoaXMgZm9sZGVyIGNvbnRhaW5zIGFsbCBvZiB0aGUgZXhhbXBsZSdzIGRlcGVuZGVuY2llcyBzdHJ1Y3R1cmVkIGluIHRoZSBjb3JyZWN0Ci13YXkgZm9yIE1iZWQgdG8gYmUgYWJsZSB0byBidWlsZCBpdC4KKypUaGlzIGltYWdlIHdhcyBkZXJpdmVkIGZyb20gdmlzdWFsaXppbmcgdGhlICdtb2RlbHMvYXVkaW9fcHJlcHJvY2Vzc29yX2ludDgudGZsaXRlJyBmaWxlIGluCitbTmV0cm9uXShodHRwczovL2dpdGh1Yi5jb20vbHV0enJvZWRlci9uZXRyb24pKgogCi1DaGFuZ2UgaW50byB0aGUgZGlyZWN0b3J5IGFuZCBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kcy4KK0VhY2ggb2YgdGhlIHN0ZXBzIHBlcmZvcm1lZCBieSB0aGUgbW9kZWwgYXJlIG91dGxpbmVkIGFzIGZvbGxvd3M6CisxKSBBdWRpbyBmcmFtZSBpbnB1dCB3aXRoIHNoYXBlIGAoMSwgNDgwKWAKKzEpIEFwcGx5IGBIYW5uIFdpbmRvd2Agc21vb3RoaW5nIHVzaW5nIGBTaWduYWxXaW5kb3dgCisxKSBSZXNoYXBlIHRlbnNvciB0byBtYXRjaCB0aGUgaW5wdXQgb2YgYFNpZ25hbEZmdEF1dG9TY2FsZWAKKzEpIFJlc2NhbGUgdGVuc29yIGRhdGEgdXNpbmcgYFNpZ25hbEZmdEF1dG9TY2FsZWAgYW5kIGNhbGN1bGF0ZSBvbmUgb2YgdGhlIGlucHV0CitwYXJhbWV0ZXJzIHRvIGBTaWduYWxGaWx0ZXJCYW5rU3F1YXJlUm9vdGAKKzEpIENvbXB1dGUgRkZUIHVzaW5nIGBTaWduYWxSZmZ0YAorMSkgQ29tcHV0ZSBwb3dlciBzcGVjdHJ1bSB1c2luZyBgU2lnbmFsRW5lcmd5YC4gIFRoZSB0ZW5zb3IgZGF0YSBpcyBvbmx5IHVwZGF0ZWQKK2ZvciBlbGVtZW50cyBiZXR3ZWVuIGBbc3RhcnRfaW5kZXgsIGVuZF9pbmRleClgLgorMSkgVGhlIGBDYXN0YCwgYFN0cmlkZWRTbGljZWAsIGFuZCBgQ29uY2F0ZW5hdGlvbmAgb3BlcmF0aW9ucyBhcmUgdXNlZCB0byBmaWxsCit0aGUgdGVuc29yIGRhdGEgd2l0aCB6ZXJvcywgZm9yIGVsZW1lbnRzIG91dHNpZGUgb2YgYFtzdGFydF9pbmRleCwgZW5kX2luZGV4KWAKKzEpIENvbXByZXNzIHRoZSBwb3dlciBzcGVjdHJ1bSB0ZW5zb3IgZGF0YSBpbnRvIGp1c3QgNDAgY2hhbm5lbHMgKGZyZXF1ZW5jeSBiYW5kcykKK3VzaW5nIGBTaWduYWxGaWx0ZXJCYW5rYAorMSkgU2NhbGUgZG93biB0aGUgdGVuc29yIGRhdGEgdXNpbmcgYFNpZ25hbEZpbHRlckJhbmtTcXVhcmVSb290YAorMSkgQXBwbHkgbm9pc2UgcmVkdWN0aW9uIHVzaW5nIGBTaWduYWxGaWx0ZXJCYW5rU3BlY3RyYWxTdWJ0cmFjdGlvbmAKKzEpIEFwcGx5IGdhaW4gY29udHJvbCB1c2luZyBgU2lnbmFsUENBTmAKKzEpIFNjYWxlIGRvd24gdGhlIHRlbnNvciBkYXRhIHVzaW5nIGBTaWduYWxGaWx0ZXJCYW5rTG9nYAorMSkgVGhlIHJlbWFpbmluZyBvcGVyYXRpb25zIHBlcmZvcm0gYWRkaXRpb25hbCBsZWdhY3kgZG93bi1zY2FsaW5nIGFuZCBjb252ZXJ0Cit0aGUgdGVuc29yIGRhdGEgdG8gYGludDhgCisxKSBNb2RlbCBvdXRwdXQgaGFzIHNoYXBlIGAoNDAsKWAKIAotRmlyc3QsIHRlbGwgTWJlZCB0aGF0IHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyB0aGUgcm9vdCBvZiBhbiBNYmVkIHByb2plY3Q6CisjIyMgVGhlIGBGZWF0dXJlUGFyYW1zYCBQeXRob24gQ2xhc3MKIAotYGBgCi1tYmVkIGNvbmZpZyByb290IC4KLWBgYAorVGhlIGBGZWF0dXJlUGFyYW1zYCBjbGFzcyBpcyBsb2NhdGVkIHdpdGhpbiB0aGUgW2F1ZGlvX3ByZXByb2Nlc3Nvci5weV0oYXVkaW9fcHJlcHJvY2Vzc29yLnB5I0wyNjApCitzY3JpcHQuICBUaGlzIGNsYXNzIGFsbG93cyBmb3IgY3VzdG9tIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGBBdWRpb1ByZXByb2Nlc3NvcmAgY2xhc3MuCitQYXJhbWV0ZXJzIHN1Y2ggYXMgc2FtcGxlIHJhdGUsIHdpbmRvdyBzaXplLCB3aW5kb3cgc3RyaWRlLCBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzLAorYW5kIG1hbnkgbW9yZSBjYW4gYmUgY29uZmlndXJlZC4gIFRoZSBwYXJhbWV0ZXJzIHRvIGJlIGNoYW5nZWQgbXVzdCBiZSBzZXQgZHVyaW5nCitjbGFzcyBpbnN0YW50aWF0aW9uLCBhbmQgYXJlIGZyb3plbiB0aGVyZWFmdGVyLiAgVGhlIGRlZmF1bHRzIGZvciBgRmVhdHVyZVBhcmFtc2AKK21hdGNoIHRob3NlIG9mIHRoZSBsZWdhY3kgYXVkaW8gcHJlcHJvY2Vzc2luZyB1c2VkIGR1cmluZyBNaWNybyBTcGVlY2ggbW9kZWwgdHJhaW5pbmcuCiAKLU5leHQsIHRlbGwgTWJlZCB0byBkb3dubG9hZCB0aGUgZGVwZW5kZW5jaWVzIGFuZCBwcmVwYXJlIHRvIGJ1aWxkOgorIyMjIFRoZSBgQXVkaW9QcmVwcm9jZXNzb3JgIFB5dGhvbiBDbGFzcwogCi1gYGAKLW1iZWQgZGVwbG95Ci1gYGAKK1RoZSBgQXVkaW9QcmVwcm9jZXNzb3JgIGNsYXNzIGluIHRoZSBbYXVkaW9fcHJlcHJvY2Vzc29yLnB5XShhdWRpb19wcmVwcm9jZXNzb3IucHkjTDMzOCkKK3NjcmlwdCBwcm92aWRlcyBlYXN5IHRvIHVzZSBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBjcmVhdGluZworYW5kIHVzaW5nIGFuIGF1ZGlvIHByZXByb2Nlc3NpbmcgbW9kZWwuICBUaGlzIGNsYXNzIGlzIGNvbmZpZ3VyZWQgdGhyb3VnaCB1c2Ugb2YKK2EgYEZlYXR1cmVQYXJhbXNgIG9iamVjdCwgYWxsb3dpbmcgc29tZSBmbGV4aWJpbGl0eSBpbiBob3cgdGhlIGF1ZGlvIHByZXByb2Nlc3NpbmcKK21vZGVsIHdvcmtzLgogCi1PbGRlciB2ZXJzaW9ucyBvZiBNYmVkIHdpbGwgYnVpbGQgdGhlIHByb2plY3QgdXNpbmcgQysrOTguIEhvd2V2ZXIsIFRlbnNvckZsb3cgTGl0ZQotcmVxdWlyZXMgQysrMTEuIElmIG5lZWRlZCwgcnVuIHRoZSBmb2xsb3dpbmcgUHl0aG9uIHNuaXBwZXQgdG8gbW9kaWZ5IHRoZSBNYmVkCi1jb25maWd1cmF0aW9uIGZpbGVzIHNvIHRoYXQgaXQgdXNlcyBDKysxMToKK0Egc2hvcnQgc3VtbWFyeSBvZiB0aGUgYXZhaWxhYmxlIG1ldGhvZHMgYW5kIHByb3BlcnRpZXM6CisqIGBsb2FkX3NhbXBsZXNgOiBsb2FkIGF1ZGlvIHNhbXBsZXMgZnJvbSBhIGBXQVZgIGZvcm1hdCBmaWxlIGFuZCBwcmVwYXJlCit0aGUgc2FtcGxlcyBmb3IgdXNlIGJ5IG90aGVyIGBBdWRpb1ByZXByb2Nlc3NvcmAgbWV0aG9kcworKiBgc2FtcGxlc2A6IHRlbnNvciBjb250YWluaW5nIHByZXZpb3VzbHkgbG9hZGVkIGF1ZGlvIHNhbXBsZXMKKyogYHBhcmFtc2A6IHRoZSBgRmVhdHVyZVBhcmFtc2Agb2JqZWN0IHRoZSBjbGFzcyB3YXMgaW5zdGFudGlhdGVkIHdpdGgKKyogYGdlbmVyYXRlX2ZlYXR1cmVgOiBnZW5lcmF0ZSBhIHNpbmdsZSBmZWF0dXJlIHVzaW5nIFRlbnNvckZsb3cgZWFnZXItZXhlY3V0aW9uCisqIGBnZW5lcmF0ZV9mZWF0dXJlX3VzaW5nX2dyYXBoYDogZ2VuZXJhdGUgYSBzaW5nbGUgZmVhdHVyZSB1c2luZyBUZW5zb3JGbG93IGdyYXBoLWV4ZWN1dGlvbgorKiBgZ2VuZXJhdGVfZmVhdHVyZV91c2luZ190ZmxtYDogZ2VuZXJhdGUgYSBzaW5nbGUgZmVhdHVyZSB1c2luZyB0aGUgYFRGTE0gTWljcm9JbnRlcnByZXRlcmAKKyogYHJlc2V0X3RmbG1gOiByZXNldCB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGBURkxNIE1pY3JvSW50ZXJwcmV0ZXJgIGFuZCB0aGUKK2BTaWduYWwgTGlicmFyeWAgb3BlcmF0aW9ucworKiBgZ2VuZXJhdGVfdGZsaXRlX2ZpbGVgOiBjcmVhdGUgYSBgLnRmbGl0ZWAgZm9ybWF0IGZpbGUgZm9yIHRoZSBwcmVwcm9jZXNzb3IgbW9kZWwKIAotYGBgCi1weXRob24gLWMgJ2ltcG9ydCBmaWxlaW5wdXQsIGdsb2I7Ci1mb3IgZmlsZW5hbWUgaW4gZ2xvYi5nbG9iKCJtYmVkLW9zL3Rvb2xzL3Byb2ZpbGVzLyouanNvbiIpOgotICBmb3IgbGluZSBpbiBmaWxlaW5wdXQuaW5wdXQoZmlsZW5hbWUsIGlucGxhY2U9VHJ1ZSk6Ci0gICAgcHJpbnQobGluZS5yZXBsYWNlKCJcIi1zdGQ9Z251Kys5OFwiIiwiXCItc3RkPWMrKzExXCIsIFwiLWZwZXJtaXNzaXZlXCIiKSknCi1gYGAKKyMjIyBSdW4gdGhlIGF1ZGlvX3ByZXByb2Nlc3Nvci5weSBzY3JpcHQgb24gYSBkZXZlbG9wbWVudCBtYWNoaW5lCiAKLU5vdGU6IE1iZWQgaGFzIGEgZGVwZW5kZW5jeSB0byBhbiBvbGQgdmVyc2lvbiBvZiBhcm1fbWF0aC5oIGFuZCBjbXNpc19nY2MuaCAoYWRhcHRlZCBmcm9tIHRoZSBnZW5lcmFsIFtDTVNJUy1OTiBNQkVEIGV4YW1wbGVdKGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmbGl0ZS1taWNyby9ibG9iL21haW4vdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvY21zaXNfbm4jZXhhbXBsZS0yLS0tbWJlZCkpLiBUaGVyZWZvcmUgeW91IG5lZWQgdG8gY29weSB0aGUgbmV3ZXIgdmVyc2lvbiBhcyBmb2xsb3dzOgorVGhlIFthdWRpb19wcmVwcm9jZXNzb3IucHldKGF1ZGlvX3ByZXByb2Nlc3Nvci5weSNMNTMyKSBzY3JpcHQgZ2VuZXJhdGVzIGEgYC50ZmxpdGVgCitmaWxlIGZvciB0aGUgcHJlcHJvY2Vzc2luZyBtb2RlbCwgcmVhZHkgZm9yIHVzZSB3aXRoIHRoZSBNaWNybyBTcGVlY2ggbW9kZWwuCisKK1RvIGdlbmVyYXRlIGEgYC50ZmxpdGVgIG1vZGVsIGZpbGUgd2l0aCBgaW50OGAgb3V0cHV0OgogYGBgYmFzaAotY3AgdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvZG93bmxvYWRzL2Ntc2lzL0NNU0lTL0RTUC9JbmNsdWRlL1wKLWFybV9tYXRoLmggbWJlZC1vcy9jbXNpcy9UQVJHRVRfQ09SVEVYX00vYXJtX21hdGguaAotY3AgdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvZG93bmxvYWRzL2Ntc2lzL0NNU0lTL0NvcmUvSW5jbHVkZS9cCi1jbXNpc19nY2MuaCBtYmVkLW9zL2Ntc2lzL1RBUkdFVF9DT1JURVhfTS9jbXNpc19nY2MuaAorYmF6ZWwgYnVpbGQgdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaDphdWRpb19wcmVwcm9jZXNzb3IKK2JhemVsLWJpbi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL2F1ZGlvX3ByZXByb2Nlc3NvciAtLW91dHB1dF90eXBlPWludDgKIGBgYAogCi1GaW5hbGx5LCBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kIHRvIGNvbXBpbGU6Ci0KLWBgYAotbWJlZCBjb21waWxlIC1tIERJU0NPX0Y3NDZORyAtdCBHQ0NfQVJNCitUbyBnZW5lcmF0ZSBhIGAudGZsaXRlYCBtb2RlbCBmaWxlIHdpdGggYGZsb2F0MzJgIG91dHB1dDoKK2BgYGJhc2gKK2JhemVsIGJ1aWxkIHRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2g6YXVkaW9fcHJlcHJvY2Vzc29yCitiYXplbC1iaW4vdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9hdWRpb19wcmVwcm9jZXNzb3IgLS1vdXRwdXRfdHlwZT1mbG9hdDMyCiBgYGAKIAotVGhpcyBzaG91bGQgcmVzdWx0IGluIGEgYmluYXJ5IGF0IHRoZSBmb2xsb3dpbmcgcGF0aDoKKyMjIyBSdW4gdGhlIGF1ZGlvX3ByZXByb2Nlc3Nvcl90ZXN0LnB5IHNjcmlwdCBvbiBhIGRldmVsb3BtZW50IG1hY2hpbmUKIAotYGBgCi0uL0JVSUxEL0RJU0NPX0Y3NDZORy9HQ0NfQVJNL21iZWQuYmluCitUaGUgW2F1ZGlvX3ByZXByb2Nlc3Nvcl90ZXN0LnB5XShhdWRpb19wcmVwcm9jZXNzb3JfdGVzdC5weSkgc2NyaXB0IHBlcmZvcm1zCitzZXZlcmFsIHRlc3RzIHRvIGVuc3VyZSBjb3JyZWN0IGluZmVyZW5jZSBvcGVyYXRpb25zIG9jY3VyIGFjcm9zcyBhbGwgZXhlY3V0aW9uIG1vZGVzLgorVGhlIHRlc3RzIGFyZToKKyogY3Jvc3MtY2hlY2sgaW5mZXJlbmNlIHJlc3VsdHMgYmV0d2VlbiBlYWdlciwgZ3JhcGgsIGFuZCBgVEZMTSBNaWNyb0ludGVycHJldGVyYAorZXhlY3V0aW9uIG1vZGVzCisqIGNoZWNrIHRoZSBgeWVzYCBhbmQgYG5vYCAzMG1zIHNhbXBsZXMgaW4gdGhlIFt0ZXN0ZGF0YV0odGVzdGRhdGEvKSBkaXJlY3RvcnkgZm9yCitjb3JyZWN0IGdlbmVyYXRpb24gb2YgdGhlIGZlYXR1cmUgdGVuc29yCisqIGNvbXBhcmUgdGhlIHByZXByb2Nlc3NvciBgaW50OGAgbW9kZWwgYWdhaW5zdCB0aGUgc2FtZSBtb2RlbCBpbiB0aGUgW21vZGVsc10obW9kZWxzLykgZGlyZWN0b3J5CisqIGNvbXBhcmUgdGhlIHByZXByb2Nlc3NvciBgZmxvYXQzMmAgbW9kZWwgYWdhaW5zdCB0aGUgc2FtZSBtb2RlbCBpbiB0aGUgW21vZGVsc10obW9kZWxzLykgZGlyZWN0b3J5CisKK2BgYGJhc2gKK2JhemVsIGJ1aWxkIHRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2g6YXVkaW9fcHJlcHJvY2Vzc29yX3Rlc3QKK2JhemVsLWJpbi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL2F1ZGlvX3ByZXByb2Nlc3Nvcl90ZXN0CiBgYGAKIAotVG8gZGVwbG95LCBwbHVnIGluIHlvdXIgU1RNIGJvYXJkIGFuZCBjb3B5IHRoZSBmaWxlIHRvIGl0LiBPbiBtYWNPUywgeW91IGNhbiBkbwotdGhpcyB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKyMjIE1pY3JvIFNwZWVjaCBNb2RlbCBBcmNoaXRlY3R1cmUKIAotYGBgCi1jcCAuL0JVSUxEL0RJU0NPX0Y3NDZORy9HQ0NfQVJNL21iZWQuYmluIC9Wb2x1bWVzL0RJU19GNzQ2TkcvCitUaGlzIGlzIGEgc2ltcGxlIG1vZGVsIGNvbXByaXNlZCBvZiBhIENvbnZvbHV0aW9uYWwgMkQgbGF5ZXIsIGEgRnVsbHkgQ29ubmVjdGVkCitMYXllciBvciBhIE1hdE11bCBMYXllciAob3V0cHV0OiBsb2dpdHMpIGFuZCBhIFNvZnRtYXggbGF5ZXIKKyhvdXRwdXQ6IHByb2JhYmlsaXRpZXMpIGFzIHNob3duIGJlbG93LiBSZWZlciB0byB0aGUgW2B0aW55X2NvbnZgXShodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3JmbG93L2Jsb2IvbWFzdGVyL3RlbnNvcmZsb3cvZXhhbXBsZXMvc3BlZWNoX2NvbW1hbmRzL21vZGVscy5weSNMNjczKQorbW9kZWwgYXJjaGl0ZWN0dXJlLiBUaGUgb3V0cHV0IHByb2JhYmlsaXRpZXMgYXJlIGluIGZvdXIgY2F0ZWdvcmllczoKK2BzaWxlbmNlYCwgYHVua25vd25gLCBgeWVzYCwgYG5vYC4KKworVGhlIGlucHV0IHRvIHRoZSBtb2RlbCBpcyA0OSBzcGVjdHJvZ3JhcGhpYyBmZWF0dXJlcywgZWFjaCBmZWF0dXJlCitjb25zaXN0aW5nIG9mIDQwIGNoYW5uZWxzIG9mIGRhdGEuICBUaGUgZmVhdHVyZXMgYXJlIGdlbmVyYXRlZCBieSB0aGUKK0F1ZGlvIFByZXByb2Nlc3NvciBtb2RlbC4gIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2Ugc2VlIHRoZQorW3RyYWluaW5nIFJFQURNRV0odHJhaW4vUkVBRE1FLm1kI3ByZXByb2Nlc3Npbmctc3BlZWNoLWlucHV0KSBkb2N1bWVudGF0aW9uLgorCitbPGltZyBzcmM9ImltYWdlcy9taWNyb19zcGVlY2hfcXVhbnRpemVkLnBuZyIgd2lkdGg9IjkwMCIgYWx0PSJtb2RlbCBhcmNoaXRlY3R1cmUiLz5dKGltYWdlcy9taWNyb19zcGVlY2hfcXVhbnRpemVkLnBuZykKKworKlRoaXMgaW1hZ2Ugd2FzIGRlcml2ZWQgZnJvbSB2aXN1YWxpemluZyB0aGUgJ21vZGVscy9taWNyb19zcGVlY2hfcXVhbnRpemVkLnRmbGl0ZScgZmlsZSBpbgorW05ldHJvbl0oaHR0cHM6Ly9naXRodWIuY29tL2x1dHpyb2VkZXIvbmV0cm9uKSoKKworIyMgUnVuIHRoZSBDKysgdGVzdHMgb24gYSBkZXZlbG9wbWVudCBtYWNoaW5lCisKK1RvIGNvbXBpbGUgYW5kIHRlc3QgdGhpcyBleGFtcGxlIG9uIGEgZGVza3RvcCBMaW51eCBvciBtYWNPUyBtYWNoaW5lLCBkb3dubG9hZCB0aGUKK1tURkxNIHNvdXJjZSBjb2RlXShodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmxpdGUtbWljcm8pLiBUaGVuIHN3aXRjaAoraW50byB0aGUgc291cmNlIGRpcmVjdG9yeSBmcm9tIGEgdGVybWluYWwgdXNpbmcgdGhlIGBjZGAgY29tbWFuZC4KKworQ29tcGlsZSBhbmQgcnVuIGEgbmF0aXZlIGJpbmFyeSB1c2luZyBCYXplbDoKK2BgYGJhc2gKK2JhemVsIHJ1biB0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoOm1pY3JvX3NwZWVjaF90ZXN0CiBgYGAKIAotQ29weWluZyB0aGUgZmlsZSB3aWxsIGluaXRpYXRlIHRoZSBmbGFzaGluZyBwcm9jZXNzLgotCi1UaGUgaW5mZXJlbmNlIHJlc3VsdHMgYXJlIGxvZ2dlZCBieSB0aGUgYm9hcmQgd2hpbGUgdGhlIHByb2dyYW0gaXMgcnVubmluZy4KLVRvIHZpZXcgaXQsIGVzdGFibGlzaCBhIHNlcmlhbCBjb25uZWN0aW9uIHRvIHRoZSBib2FyZAotdXNpbmcgYSBiYXVkIHJhdGUgb2YgYDk2MDBgLiBPbiBPU1ggYW5kIExpbnV4LCB0aGUgZm9sbG93aW5nIGNvbW1hbmQgc2hvdWxkCi13b3JrLCByZXBsYWNpbmcgYC9kZXYvdHR5LmRldmljZW5hbWVgIHdpdGggdGhlIG5hbWUgb2YgeW91ciBkZXZpY2UgYXMgaXQgYXBwZWFycwotaW4gYC9kZXZgOgotCi1gYGAKLXNjcmVlbiAvZGV2L3R0eS5kZXZpY2VuYW1lIDk2MDAKLWBgYAotCi1Zb3Ugd2lsbCBzZWUgYSBsaW5lIG91dHB1dCBmb3IgZXZlcnkgd29yZCB0aGF0IGlzIGRldGVjdGVkOgotCi1gYGAKLUhlYXJkIHllcyAoMjAxKSBANDA1Nm1zCi1IZWFyZCBubyAoMjA1KSBANjQ0OG1zCi1IZWFyZCB1bmtub3duICgyMDEpIEAxMzY5Nm1zCi1IZWFyZCB5ZXMgKDIwNSkgQDE1MDAwbXMKLWBgYAotCi1UaGUgbnVtYmVyIGFmdGVyIGVhY2ggZGV0ZWN0ZWQgd29yZCBpcyBpdHMgc2NvcmUuIEJ5IGRlZmF1bHQsIHRoZSBwcm9ncmFtIG9ubHkKLWNvbnNpZGVycyBtYXRjaGVzIGFzIHZhbGlkIGlmIHRoZWlyIHNjb3JlIGlzIG92ZXIgMjAwLCBzbyBhbGwgb2YgdGhlIHNjb3JlcyB5b3UKLXNlZSB3aWxsIGJlIGF0IGxlYXN0IDIwMC4KLQotVG8gc3RvcCB2aWV3aW5nIHRoZSBkZWJ1ZyBvdXRwdXQgd2l0aCBgc2NyZWVuYCwgaGl0IGBDdHJsK0FgLCBpbW1lZGlhdGVseQotZm9sbG93ZWQgYnkgdGhlIGBLYCBrZXksIHRoZW4gaGl0IHRoZSBgWWAga2V5LgotCi0jIyBEZXBsb3kgdG8gTlhQIEZSRE0gSzY2RgotCi1UaGUgZm9sbG93aW5nIGluc3RydWN0aW9ucyB3aWxsIGhlbHAgeW91IGJ1aWxkIGFuZCBkZXBsb3kgdGhlIGV4YW1wbGUgdG8gdGhlCi1bTlhQIEZSRE0gSzY2Rl0oaHR0cHM6Ly93d3cubnhwLmNvbS9kZXNpZ24vZGV2ZWxvcG1lbnQtYm9hcmRzL2ZyZWVkb20tZGV2ZWxvcG1lbnQtYm9hcmRzL21jdS1ib2FyZHMvZnJlZWRvbS1kZXZlbG9wbWVudC1wbGF0Zm9ybS1mb3Ita2luZXRpcy1rNjYtazY1LWFuZC1rMjYtbWN1czpGUkRNLUs2NkYpCi11c2luZyBbQVJNIE1iZWRdKGh0dHBzOi8vZ2l0aHViLmNvbS9BUk1tYmVkL21iZWQtY2xpKS4KLQotMS4gIERvd25sb2FkCi0gICAgW3RoZSBUZW5zb3JGbG93IHNvdXJjZSBjb2RlXShodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3JmbG93KS4KLTIuICBGb2xsb3cgaW5zdHJ1Y3Rpb25zIGZyb20KLSAgICBbbWJlZCB3ZWJzaXRlXShodHRwczovL29zLm1iZWQuY29tL2RvY3MvbWJlZC1vcy92NS4xMy90b29scy9pbnN0YWxsYXRpb24tYW5kLXNldHVwLmh0bWwpCi0gICAgdG8gc2V0dXAgYW5kIGluc3RhbGwgbWJlZCBDTEkuCi0zLiAgQ29tcGlsZSBUZW5zb3JGbG93IHdpdGggdGhlIGZvbGxvd2luZyBjb21tYW5kIHRvIGdlbmVyYXRlIG1iZWQgcHJvamVjdDoKLQotICAgIGBgYAotICAgIG1ha2UgLWYgdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvTWFrZWZpbGUgVEFSR0VUPW1iZWQgVEFHUz0ibnhwX2s2NmYiIGdlbmVyYXRlX21pY3JvX3NwZWVjaF9tYmVkX3Byb2plY3QKLSAgICBgYGAKLQotNC4gIENoYW5nZSBpbnRvIHRoZSBmb2xsb3dpbmcgZGlyZWN0b3J5IHRoYXQgaGFzIGJlZW4gZ2VuZXJhdGVkOgotICAgIGBnZW4vbWJlZF9jb3J0ZXgtbTQvcHJqL21pY3JvX3NwZWVjaC9tYmVkYAotCi01LiAgQ3JlYXRlIGFuIE1iZWQgcHJvamVjdCB1c2luZyB0aGUgZ2VuZXJhdGVkIGZpbGVzLCBydW4gZW5zdXJpbmcgeW91cgotICAgIGVudmlyb25tZW50IGlzIHVzaW5nIFB5dGhvbiAyLjc6IGBtYmVkIGNvbmZpZyByb290IC5gCi0KLTYuICBOZXh0LCB0ZWxsIE1iZWQgdG8gZG93bmxvYWQgdGhlIGRlcGVuZGVuY2llcyBhbmQgcHJlcGFyZSB0byBidWlsZDogYG1iZWQKLSAgICBkZXBsb3lgCi0KLTcuICBGaW5hbGx5LCB3ZSBjYW4gcnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZCB0byBjb21waWxlIHRoZSBjb2RlOiBgbWJlZCBjb21waWxlCi0gICAgLW0gSzY2RiAtdCBHQ0NfQVJNYAotCi04LiAgRm9yIHNvbWUgTWJlZCBjb21waWxlcnMgKHN1Y2ggYXMgR0NDKSwgeW91IG1heSBnZXQgY29tcGlsZSBlcnJvciBpbgotICAgIG1iZWRfcnRjX3RpbWUuY3BwLiBHbyB0byBgbWJlZC1vcy9wbGF0Zm9ybS9tYmVkX3J0Y190aW1lLmhgIGFuZCBjb21tZW50IGxpbmUKLSAgICAzMiBhbmQgbGluZSAzNzoKLQotICAgIGBgYAotICAgIC8vI2lmICFkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fQ0NfQVJNKSB8fCBkZWZpbmVkKF9fY2xhbmdfXykKLSAgICBzdHJ1Y3QgdGltZXZhbCB7Ci0gICAgdGltZV90IHR2X3NlYzsKLSAgICBpbnQzMl90IHR2X3VzZWM7Ci0gICAgfTsKLSAgICAvLyNlbmRpZgotICAgIGBgYAotCi05LiAgSWYgeW91ciBzeXN0ZW0gZG9lcyBub3QgcmVjb2duaXplIHRoZSBib2FyZCB3aXRoIHRoZSBgbWJlZCBkZXRlY3RgIGNvbW1hbmQuCi0gICAgRm9sbG93IHRoZSBpbnN0cnVjdGlvbnMgZm9yIHNldHRpbmcgdXAKLSAgICBbREFQTGlua10oaHR0cHM6Ly9hcm1tYmVkLmdpdGh1Yi5pby9EQVBMaW5rLz9ib2FyZD1GUkRNLUs2NkYpIGZvciB0aGUKLSAgICBbSzY2Rl0oaHR0cHM6Ly9vcy5tYmVkLmNvbS9wbGF0Zm9ybXMvRlJETS1LNjZGLykuCi0KLTEwLiBDb25uZWN0IHRoZSBVU0IgY2FibGUgdG8gdGhlIG1pY3JvIFVTQiBwb3J0LiBXaGVuIHRoZSBFdGhlcm5ldCBwb3J0IGlzCi0gICAgZmFjaW5nIHRvd2FyZHMgeW91LCB0aGUgbWljcm8gVVNCIHBvcnQgaXMgbGVmdCBvZiB0aGUgRXRoZXJuZXQgcG9ydC4KLQotMTEuIFRvIGNvbXBpbGUgYW5kIGZsYXNoIGluIGEgc2luZ2xlIHN0ZXAsIGFkZCB0aGUgYC0tZmxhc2hgIG9wdGlvbjoKLQotICAgIGBgYAotICAgIG1iZWQgY29tcGlsZSAtbSBLNjZGIC10IEdDQ19BUk0gLS1mbGFzaAotICAgIGBgYAotCi0xMi4gRGlzY29ubmVjdCBVU0IgY2FibGUgZnJvbSB0aGUgZGV2aWNlIHRvIHBvd2VyIGRvd24gdGhlIGRldmljZSBhbmQgY29ubmVjdAotICAgIGJhY2sgdGhlIHBvd2VyIGNhYmxlIHRvIHN0YXJ0IHJ1bm5pbmcgdGhlIG1vZGVsLgotCi0xMy4gQ29ubmVjdCB0byBzZXJpYWwgcG9ydCB3aXRoIGJhdWQgcmF0ZSBvZiA5NjAwIGFuZCBjb3JyZWN0IHNlcmlhbCBkZXZpY2UgdG8KLSAgICB2aWV3IHRoZSBvdXRwdXQgZnJvbSB0aGUgTUNVLiBJbiBsaW51eCwgeW91IGNhbiBydW4gdGhlIGZvbGxvd2luZyBzY3JlZW4KLSAgICBjb21tYW5kIGlmIHRoZSBzZXJpYWwgZGV2aWNlIGlzIGAvZGV2L3R0eUFDTTBgOgotCi0gICAgYGBgCi0gICAgc3VkbyBzY3JlZW4gL2Rldi90dHlBQ00wIDk2MDAKLSAgICBgYGAKLQotMTQuIFNheWluZyAiWWVzIiB3aWxsIHByaW50ICJZZXMiIGFuZCAiTm8iIHdpbGwgcHJpbnQgIk5vIiBvbiB0aGUgc2VyaWFsIHBvcnQuCi0KLTE1LiBBIGxvb3BiYWNrIHBhdGggZnJvbSBtaWNyb3Bob25lIHRvIGhlYWRzZXQgamFjayBpcyBlbmFibGVkLiBIZWFkc2V0IGphY2sgaXMKLSAgICBpbiBibGFjayBjb2xvci4gSWYgdGhlcmUgaXMgbm8gb3V0cHV0IG9uIHRoZSBzZXJpYWwgcG9ydCwgeW91IGNhbiBjb25uZWN0Ci0gICAgaGVhZHBob25lIHRvIGhlYWRwaG9uZSBwb3J0IHRvIGNoZWNrIGlmIGF1ZGlvIGxvb3BiYWNrIHBhdGggaXMgd29ya2luZy4KLQotIyMgRGVwbG95IHRvIENFVkEtQlgxCi0KLVRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIHdpbGwgaGVscCB5b3UgYnVpbGQgYW5kIGRlcGxveSB0aGUgc2FtcGxlIHRvIHRoZQotW0NFVkEtQlgxXShodHRwczovL3d3dy5jZXZhLWRzcC5jb20vcHJvZHVjdC9jZXZhLWJ4MS1zb3VuZC8pIG9yIFtDRVZBLVNQNTAwXShodHRwczovL3d3dy5jZXZhLWRzcC5jb20vcHJvZHVjdC9jZXZhLXNlbnNwcm8vKQotCi0xLiAgQ29udGFjdCBDRVZBIGF0IFtzYWxlc0BjZXZhLWRzcC5jb21dKG1haWx0bzpzYWxlc0BjZXZhLWRzcC5jb20pCi0yLiAgRm9yIEJYMToKLTIuMS4gRG93bmxvYWQgYW5kIGluc3RhbGwgQ0VWQS1CWCBUb29sYm94IHYxOC4wLjIKLTIuMi4gIFNldCB0aGUgVEFSR0VUX1RPT0xDSEFJTl9ST09UIHZhcmlhYmxlIGluCi0gICAgL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL3RlbXBsYXRlcy9jZXZhX2J4MS9jZXZhX2FwcF9tYWtlZmlsZS50cGwKLSAgICBUbyB5b3VyIGluc3RhbGxhdGlvbiBsb2NhdGlvbi4gRm9yIGV4YW1wbGU6IFRBUkdFVF9UT09MQ0hBSU5fUk9PVCA6PQotICAgIC9ob21lL215dXNlci93b3JrL0NFVkEtVG9vbEJveC9WMTgvQlgKLTIuMy4gIEdlbmVyYXRlIHRoZSBNYWtlZmlsZSBmb3IgdGhlIHByb2plY3Q6IC90ZW5zb3JmbG93JCBtYWtlIC1mCi0gICAgdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvTWFrZWZpbGUgVEFSR0VUPWNldmEgVEFSR0VUX0FSQ0g9Q0VWQV9CWDEKLSAgICBnZW5lcmF0ZV9taWNyb19zcGVlY2hfbWFrZV9wcm9qZWN0Ci0zLiBGb3IgU2Vuc1BybyAoU1A1MDApOgotMy4xLiBEb3dubG9hZCBhbmQgaW5zdGFsbCBDRVZBLVNQIFRvb2xib3ggdjIwCi0zLjIuIFNldCB0aGUgVEFSR0VUX1RPT0xDSEFJTl9ST09UIHZhcmlhYmxlIGluCi0gICAgL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL3RlbXBsYXRlcy9jZXZhX1NQNTAwL2NldmFfYXBwX21ha2VmaWxlLnRwbAotICAgIFRvIHlvdXIgaW5zdGFsbGF0aW9uIGxvY2F0aW9uLiBGb3IgZXhhbXBsZTogVEFSR0VUX1RPT0xDSEFJTl9ST09UIDo9Ci0gICAgL2hvbWUvbXl1c2VyL3dvcmsvQ0VWQS1Ub29sQm94L1YyMC9TZW5zUHJvCi0zLjMuIEdlbmVyYXRlIHRoZSBNYWtlZmlsZSBmb3IgdGhlIHByb2plY3Q6IC90ZW5zb3JmbG93JCBtYWtlIC1mCi0gICAgdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvTWFrZWZpbGUgVEFSR0VUPWNldmEgVEFSR0VUX0FSQ0g9Q0VWQV9TUDUwMAotICAgIGdlbmVyYXRlX21pY3JvX3NwZWVjaF9tYWtlX3Byb2plY3QgCQotNS4gIEJ1aWxkIHRoZSBwcm9qZWN0OgotICAgIC9nZW4vY2V2YV9ieDEvcHJqL21pY3JvX3NwZWVjaC9tYWtlJCBtYWtlCi02LiAgVGhpcyBzaG91bGQgYnVpbGQgdGhlIHByb2plY3QgYW5kIGNyZWF0ZSBhIGZpbGUgY2FsbGVkIG1pY3JvX3NwZWVjaC5lbGYuCi03LiAgVGhlIHN1cHBsaWVkIGNvbmZpZ3VyYXRpb24gcmVhZHMgaW5wdXQgZnJvbSBhIGZpbGVzIGFuZCBleHBlY3RzIGEgZmlsZQotICAgIGNhbGxlZCBpbnB1dC53YXYgKGVhc2lseSBjaGFuZ2VkIGluIGF1ZGlvX3Byb3ZpZGVyLmNjKSB0byBiZSBwbGFjZWQgaW4gdGhlCi0gICAgc2FtZSBkaXJlY3Rvcnkgb2YgdGhlIC5lbGYgZmlsZQotOC4gIFdlIHVzZWQgR29vZ2xlJ3Mgc3BlZWNoIGNvbW1hbmQgZGF0YXNldDogVjAuMC4yOgotICAgIGh0dHA6Ly9kb3dubG9hZC50ZW5zb3JmbG93Lm9yZy9kYXRhL3NwZWVjaF9jb21tYW5kc192MC4wMi50YXIuZ3ogVjAuMC4xOgotICAgIGh0dHA6Ly9kb3dubG9hZC50ZW5zb3JmbG93Lm9yZy9kYXRhL3NwZWVjaF9jb21tYW5kc192MC4wMS50YXIuZ3oKLTkuICBGb2xsb3cgQ0VWQSBUb29sYm94IGluc3RydWN0aW9ucyBmb3IgY3JlYXRpbmcgYSBkZWJ1ZyB0YXJnZXQgYW5kIHJ1bm5pbmcgdGhlCi0gICAgcHJvamVjdC4KLTEwLiBPdXRwdXQgc2hvdWxkIGxvb2sgbGlrZTogSGVhcmQgc2lsZW5jZSAoMjA4KSBAMzUybXMgSGVhcmQgbm8gKDIwMSkgQDE2OTZtcwotICAgIEhlYXJkIHllcyAoMjAzKSBAMzkwNG1zCi0KLSMjIFJ1biBvbiBtYWNPUwotCi1UaGUgZXhhbXBsZSBjb250YWlucyBhbiBhdWRpbyBwcm92aWRlciBjb21wYXRpYmxlIHdpdGggbWFjT1MuIElmIHlvdSBoYXZlIGFjY2VzcwotdG8gYSBNYWMsIHlvdSBjYW4gcnVuIHRoZSBleGFtcGxlIG9uIHlvdXIgZGV2ZWxvcG1lbnQgbWFjaGluZS4KLQotRmlyc3QsIHVzZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQgdG8gYnVpbGQgaXQ6Ci0KLWBgYAotbWFrZSAtZiB0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9NYWtlZmlsZSBtaWNyb19zcGVlY2gKLWBgYAotCi1PbmNlIHRoZSBidWlsZCBjb21wbGV0ZXMsIHlvdSBjYW4gcnVuIHRoZSBleGFtcGxlIHdpdGggdGhlIGZvbGxvd2luZyBjb21tYW5kOgotCi1gYGAKLWdlbi9vc3hfeDg2XzY0L2Jpbi9taWNyb19zcGVlY2gKLWBgYAotCi1Zb3UgbWlnaHQgc2VlIGEgcG9wLXVwIGFza2luZyBmb3IgbWljcm9waG9uZSBhY2Nlc3MuIElmIHNvLCBncmFudCBpdCwgYW5kIHRoZQotcHJvZ3JhbSB3aWxsIHN0YXJ0LgotCi1Ucnkgc2F5aW5nICJ5ZXMiIGFuZCAibm8iLiBZb3Ugc2hvdWxkIHNlZSBvdXRwdXQgdGhhdCBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmc6Ci0KLWBgYAotSGVhcmQgeWVzICgyMDEpIEA0MDU2bXMKLUhlYXJkIG5vICgyMDUpIEA2NDQ4bXMKLUhlYXJkIHVua25vd24gKDIwMSkgQDEzNjk2bXMKLUhlYXJkIHllcyAoMjA1KSBAMTUwMDBtcwotSGVhcmQgeWVzICgyMDUpIEAxNjg1Nm1zCi1IZWFyZCB1bmtub3duICgyMDQpIEAxODcwNG1zCi1IZWFyZCBubyAoMjA2KSBAMjEwMDBtcwotYGBgCi0KLVRoZSBudW1iZXIgYWZ0ZXIgZWFjaCBkZXRlY3RlZCB3b3JkIGlzIGl0cyBzY29yZS4gQnkgZGVmYXVsdCwgdGhlIHJlY29nbml6ZQotY29tbWFuZHMgY29tcG9uZW50IG9ubHkgY29uc2lkZXJzIG1hdGNoZXMgYXMgdmFsaWQgaWYgdGhlaXIgc2NvcmUgaXMgb3ZlciAyMDAsCi1zbyBhbGwgb2YgdGhlIHNjb3JlcyB5b3Ugc2VlIHdpbGwgYmUgYXQgbGVhc3QgMjAwLgotCi1UaGUgbnVtYmVyIGFmdGVyIHRoZSBzY29yZSBpcyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBzaW5jZSB0aGUgcHJvZ3JhbSB3YXMKLXN0YXJ0ZWQuCi0KLUlmIHlvdSBkb24ndCBzZWUgYW55IG91dHB1dCwgbWFrZSBzdXJlIHlvdXIgTWFjJ3MgaW50ZXJuYWwgbWljcm9waG9uZSBpcwotc2VsZWN0ZWQgaW4gdGhlIE1hYydzICpTb3VuZCogbWVudSwgYW5kIHRoYXQgaXRzIGlucHV0IHZvbHVtZSBpcyB0dXJuZWQgdXAgaGlnaAotZW5vdWdoLgotCi0jIyBSdW4gdGhlIHRlc3RzIG9uIGEgZGV2ZWxvcG1lbnQgbWFjaGluZQotCi1UbyBjb21waWxlIGFuZCB0ZXN0IHRoaXMgZXhhbXBsZSBvbiBhIGRlc2t0b3AgTGludXggb3IgbWFjT1MgbWFjaGluZSwgZG93bmxvYWQKLVt0aGUgVGVuc29yRmxvdyBzb3VyY2UgY29kZV0oaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdyksIGBjZGAKLWludG8gdGhlIHNvdXJjZSBkaXJlY3RvcnkgZnJvbSBhIHRlcm1pbmFsLCBhbmQgdGhlbiBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kOgotCi1gYGAKK0ZvciBhIG5hdGl2ZSBiaW5hcnkgdXNpbmcgYG1ha2VgLCBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kOgorYGBgYmFzaAogbWFrZSAtZiB0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9NYWtlZmlsZSB0ZXN0X21pY3JvX3NwZWVjaF90ZXN0CiBgYGAKIAorRm9yIGFuIEFybSBDb3J0ZXgtTTAgYmluYXJ5IHJ1bm5pbmcgaW4gdGhlIFFFTVUgZW11bGF0b3I6CitgYGBiYXNoCittYWtlIC1mIHRlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL01ha2VmaWxlIFRBUkdFVD1jb3J0ZXhfbV9xZW11IFRBUkdFVF9BUkNIPWNvcnRleC1tMCBPUFRJTUlaRURfS0VSTkVMX0RJUj1jbXNpc19ubiBCVUlMRF9UWVBFPWRlZmF1bHQgdGVzdF9taWNyb19zcGVlY2hfdGVzdAorYGBgCisKIFRoaXMgd2lsbCB0YWtlIGEgZmV3IG1pbnV0ZXMsIGFuZCBkb3dubG9hZHMgZnJhbWV3b3JrcyB0aGUgY29kZSB1c2VzIGxpa2UKIFtDTVNJU10oaHR0cHM6Ly9kZXZlbG9wZXIuYXJtLmNvbS9lbWJlZGRlZC9jbXNpcykgYW5kCiBbZmxhdGJ1ZmZlcnNdKGh0dHBzOi8vZ29vZ2xlLmdpdGh1Yi5pby9mbGF0YnVmZmVycy8pLiBPbmNlIHRoYXQgcHJvY2VzcyBoYXMKIGZpbmlzaGVkLCB5b3Ugc2hvdWxkIHNlZSBhIHNlcmllcyBvZiBmaWxlcyBnZXQgY29tcGlsZWQsIGZvbGxvd2VkIGJ5IHNvbWUKIGxvZ2dpbmcgb3V0cHV0IGZyb20gYSB0ZXN0LCB3aGljaCBzaG91bGQgY29uY2x1ZGUgd2l0aCBgfn5+QUxMIFRFU1RTIFBBU1NFRH5+fmAuCiAKLUlmIHlvdSBzZWUgdGhpcywgaXQgbWVhbnMgdGhhdCBhIHNtYWxsIHByb2dyYW0gaGFzIGJlZW4gYnVpbHQgYW5kIHJ1biB0aGF0IGxvYWRzCi10aGUgdHJhaW5lZCBUZW5zb3JGbG93IG1vZGVsLCBydW5zIHNvbWUgZXhhbXBsZSBpbnB1dHMgdGhyb3VnaCBpdCwgYW5kIGdvdCB0aGUKK0lmIHlvdSBzZWUgdGhpcywgaXQgbWVhbnMgdGhhdCBhIHNtYWxsIHByb2dyYW0gaGFzIGJlZW4gYnVpbHQgYW5kIGV4ZWN1dGVkIHRoYXQgbG9hZHMKK3RoZSB0cmFpbmVkIFRlbnNvckZsb3cgTGl0ZSBtb2RlbCwgcnVucyBzb21lIGV4YW1wbGUgaW5wdXRzIHRocm91Z2ggaXQsIGFuZCBnb3QgdGhlCiBleHBlY3RlZCBvdXRwdXRzLgogCi1UbyB1bmRlcnN0YW5kIGhvdyBUZW5zb3JGbG93IExpdGUgZG9lcyB0aGlzLCB5b3UgY2FuIGxvb2sgYXQgdGhlIHNvdXJjZSBpbgotW21pY3JvX3NwZWVjaF90ZXN0LmNjXShtaWNyb19zcGVlY2hfdGVzdC5jYykuCi1JdCdzIGEgZmFpcmx5IHNtYWxsIGFtb3VudCBvZiBjb2RlIHRoYXQgY3JlYXRlcyBhbiBpbnRlcnByZXRlciwgZ2V0cyBhIGhhbmRsZSB0bwotYSBtb2RlbCB0aGF0J3MgYmVlbiBjb21waWxlZCBpbnRvIHRoZSBwcm9ncmFtLCBhbmQgdGhlbiBpbnZva2VzIHRoZSBpbnRlcnByZXRlcgotd2l0aCB0aGUgbW9kZWwgYW5kIHNhbXBsZSBpbnB1dHMuCitUbyB1bmRlcnN0YW5kIGhvdyBURkxNIGRvZXMgdGhpcywgeW91IGNhbiBsb29rIGF0IHRoZSBzb3VyY2UgaW4gdGhlCitbbWljcm9fc3BlZWNoX3Rlc3QuY2NdKG1pY3JvX3NwZWVjaF90ZXN0LmNjKSBmaWxlLgorSXQncyBhIGZhaXJseSBzbWFsbCBhbW91bnQgb2YgY29kZSB0aGF0IGV4ZWN1dGVzIHRoZSBmb2xsb3dpbmcgc3RlcHM6CisxKSBDcmVhdGUgYSBgVEZMTSBNaWNyb0ludGVycHJldGVyYCB3aXRoIGEgaGFuZGxlIHRvIHRoZSBBdWRpbyBQcmVwcm9jZXNzb3IgbW9kZWwKK3RoYXQgaGFzIGJlZW4gY29tcGlsZWQgaW50byB0aGUgcHJvZ3JhbQorMSkgUmVwZWF0ZWRseSBleGVjdXRlIGluZmVyZW5jZSBvcGVyYXRpb25zIHVzaW5nIGBNaWNyb0ludGVycHJldGVyOjppbnZva2VgLAord2l0aCBhdWRpbyBzYW1wbGVzIGFzIGlucHV0LCBhbmQgc3BlY3Ryb2dyYW0gZmVhdHVyZXMgYXMgb3V0cHV0CisxKSBDcmVhdGUgYSBuZXcgYFRGTE0gTWljcm9JbnRlcnByZXRlcmAgd2l0aCBhIGhhbmRsZSB0byB0aGUgTWljcm8gU3BlZWNoIG1vZGVsCit0aGF0IGhhcyBiZWVuIGNvbXBpbGVkIGludG8gdGhlIHByb2dyYW0KKzEpIEV4ZWN1dGUgYSBzaW5nbGUgaW5mZXJlbmNlIG9wZXJhdGlvbiB1c2luZyBgTWljcm9JbnRlcnByZXRlcjo6aW52b2tlYCwKK3dpdGggdGhlIHNwZWN0cm9ncmFtIGZlYXR1cmVzIGFzIGlucHV0LCBhbmQgY2F0ZWdvcnkgcHJvYmFiaWxpdGllcyBhcyBvdXRwdXQKKzEpIENoZWNrIHRoZSBsYXJnZXN0IGNhdGVnb3J5IHByb2JhYmlsaXR5IGZvciBhIG1hdGNoIHdpdGggdGhlIHNwZWVjaCBzYW1wbGUgbGFiZWwuCisKKyMjIFJ1biB0aGUgZXZhbHVhdGUucHkgc2NyaXB0IG9uIGEgZGV2ZWxvcG1lbnQgbWFjaGluZQorVGhlIFtldmFsdWF0ZS5weV0oZXZhbHVhdGUucHkjTDE2Nikgc2NyaXB0IHByZWRpY3RzIHRoZSBjYXRlZ29yeSBvZiBhIHNpbmdsZSBhdWRpbyBzYW1wbGUKK2dpdmVuIGJ5IHRoZSBgc2FtcGxlX3BhdGhgIGFyZ3VtZW50LiAgVGhlIG91dHB1dCBjb25zaXN0cyBvZiB0aGUgcHJlZGljdGlvbnMgZm9yCit0aGUgYWNjdW11bGF0ZWQgc3BlY3Ryb2dyYW0gZmVhdHVyZXMgYWNyb3NzIChhdCBtb3N0KSA0OSBhdWRpbyBzYW1wbGUgd2luZG93IGZyYW1lcy4KKworYGBgYmFzaAorYmF6ZWwgYnVpbGQgdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaDpldmFsdWF0ZQorYmF6ZWwtYmluL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvZXZhbHVhdGUgLS1zYW1wbGVfcGF0aD10ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3Rlc3RkYXRhL25vXzEwMDBtcy53YXYKK2BgYAorCitUaGUgb3V0cHV0IGxvb2tzIGxpa2UgdGhpczoKK2BgYGJhc2gKK0ZyYW1lICMwOiBbMC4wMDAwLCAwLjAyNzMsIDAuMDMxMiwgMC45NDE0XQorRnJhbWUgIzE6IFswLjAwMDAsIDAuMDI3MywgMC4wMzEyLCAwLjk0MTRdCitGcmFtZSAjMjogWzAuMDAwMCwgMC4wMjczLCAwLjAzMTIsIDAuOTQxNF0KK0ZyYW1lICMzOiBbMC4wMDAwLCAwLjAyNzMsIDAuMDI3MywgMC45NDE0XQorRnJhbWUgIzQ6IFswLjAwMDAsIDAuMDI3MywgMC4wMjczLCAwLjk0MTRdCitGcmFtZSAjNTogWzAuMDAwMCwgMC4wMjczLCAwLjAyNzMsIDAuOTQxNF0KK0ZyYW1lICM2OiBbMC4wMDAwLCAwLjAyNzMsIDAuMDI3MywgMC45NDUzXQorRnJhbWUgIzc6IFswLjAwMDAsIDAuMDI3MywgMC4wMjczLCAwLjk0NTNdCitGcmFtZSAjODogWzAuMDAwMCwgMC4wMjczLCAwLjAyNzMsIDAuOTQ1M10KKworLi4uCisKK0ZyYW1lICM0MDogWzAuMDAwMCwgMC4wMzEyLCAwLjAwMDAsIDAuOTY0OF0KK0ZyYW1lICM0MTogWzAuMDAwMCwgMC4wMjczLCAwLjAwMDAsIDAuOTcyN10KK0ZyYW1lICM0MjogWzAuMDAwMCwgMC4wMzEyLCAwLjAwMDAsIDAuOTY4OF0KK0ZyYW1lICM0MzogWzAuMDAwMCwgMC4wMjczLCAwLjAwMDAsIDAuOTcyN10KK0ZyYW1lICM0NDogWzAuMDAwMCwgMC4wMjczLCAwLjAwMDAsIDAuOTcyN10KK0ZyYW1lICM0NTogWzAuMDAwMCwgMC4wMzUyLCAwLjAwMDAsIDAuOTY0OF0KK0ZyYW1lICM0NjogWzAuMDAwMCwgMC4wMzkxLCAwLjAwMDAsIDAuOTYwOV0KK0ZyYW1lICM0NzogWzAuMDAwMCwgMC4wNDY5LCAwLjAwMDAsIDAuOTUzMV0KK0ZyYW1lICM0ODogWzAuMDAwMCwgMC4wNTQ3LCAwLjAwMDAsIDAuOTQ1M10KK01vZGVsIHByZWRpY3RzIHRoZSBhdWRpbyBzYW1wbGUgYXMgPG5vPiB3aXRoIHByb2JhYmlsaXR5IDAuOTUKK2BgYAorCisjIyBSdW4gdGhlIGV2YWx1YXRlX3Rlc3QucHkgc2NyaXB0IG9uIGEgZGV2ZWxvcG1lbnQgbWFjaGluZQorVGhlIFtldmFsdWF0ZV90ZXN0LnB5XShldmFsdWF0ZV90ZXN0LnB5KSBzY3JpcHQgdmVyaWZpZXMgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZQorQXVkaW8gUHJlcHJvY2Vzc29yIG1vZGVsIGFuZCB0aGUgTWljcm8gU3BlZWNoIG1vZGVsIHRvIGdlbmVyYXRlIGNvcnJlY3QgaW5mZXJlbmNlIHJlc3VsdHMuCitGb3VyIGF1ZGlvIHNhbXBsZXMgZnJvbSB0aGUgW3Rlc3RkYXRhXSh0ZXN0ZGF0YS8pIGRpcmVjdG9yeSBhcmUgdXNlZCBhcyBpbnB1dCB0bwordGhlIEF1ZGlvIFByZXByb2Nlc3NvciBtb2RlbC4KK1RoZSBBdWRpbyBQcmVwcm9jZXNzb3IgbW9kZWwgaXMgdGVzdGVkIHdpdGggYm90aCBgaW50OGAgYW5kIGBmbG9hdDMyYCBvdXRwdXRzLgorVGhlIHJlc3VsdHMgb2YgdGhlIGF1ZGlvIHByZXByb2Nlc3NpbmcgYXJlIHRoZW4gdXNlZCB0byBjaGVjayBwcmVkaWN0aW9ucyBieSB0aGUKK01pY3JvIFNwZWVjaCBtb2RlbC4KKworYGBgYmFzaAorYmF6ZWwgYnVpbGQgdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaDpldmFsdWF0ZV90ZXN0CitiYXplbC1iaW4vdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9ldmFsdWF0ZV90ZXN0CitgYGAKKworIyMgQ29udmVydGluZyBtb2RlbHMgb3IgYXVkaW8gc2FtcGxlcyB0byBDKysKK0EgdG9vbCBpcyBhdmFpbGFibGUgdG8gY29udmVydCB5b3VyIGN1c3RvbSBtb2RlbCBvciBhdWRpbyBzYW1wbGVzIGludG8gYEMrK2AgZGF0YQorc3RydWN0dXJlcyB0aGF0IHlvdSBjYW4gdGhlbiB1c2UgaW4geW91ciBvd24gd2FrZS13b3JkIGFwcGxpY2F0aW9uLgorS2VlcCBpbiBtaW5kIHRoYXQgYXVkaW8gc2FtcGxlcyBmb3IgdXNlIHdpdGggQXVkaW8gUHJlcHJvY2Vzc29yIGFuZCBNaWNybyBTcGVlY2ggbW9kZWxzCittdXN0IGJlIDEwMDBtcyBpbiBsZW5ndGgsIDE2LWJpdCBQQ00gc2FtcGxlcywgYW5kIHNpbmdsZSBjaGFubmVsIChtb25vKS4KK1RoZSB0b29sIGNhbiBiZSBmb3VuZCBoZXJlOiBbZ2VuZXJhdGVfY2NfYXJyYXlzLnB5XSguLi8uLi90b29scy9nZW5lcmF0ZV9jY19hcnJheXMucHkpCisKK1RoZSBmb2xsb3dpbmcgY29tbWFuZHMgc2hvdyBob3cgdG8gdXNlIHRoZSB0b29sOgorYGBgYmFzaAorYmF6ZWwgYnVpbGQgdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzOmdlbmVyYXRlX2NjX2FycmF5cworYmF6ZWwtYmluL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9nZW5lcmF0ZV9jY19hcnJheXMgL3RtcC9kYXRhLmNjIHBhdGhfdG9fY3VzdG9tX3NhbXBsZS53YXYKK2JhemVsLWJpbi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvZ2VuZXJhdGVfY2NfYXJyYXlzIC90bXAvaGVhZGVyLmggcGF0aF90b19jdXN0b21fc2FtcGxlLndhdgorYGBgCiAKICMjIFRyYWluIHlvdXIgb3duIG1vZGVsCiAKIFNvIGZhciB5b3UgaGF2ZSB1c2VkIGFuIGV4aXN0aW5nIHRyYWluZWQgbW9kZWwgdG8gcnVuIGluZmVyZW5jZSBvbgogbWljcm9jb250cm9sbGVycy4gSWYgeW91IHdpc2ggdG8gdHJhaW4geW91ciBvd24gbW9kZWwsIGZvbGxvdyB0aGUgaW5zdHJ1Y3Rpb25zCi1naXZlbiBpbiB0aGUgW3RyYWluL10odHJhaW4vKSBkaXJlY3RvcnkuCitnaXZlbiBpbiB0aGUgW3RyYWluXSh0cmFpbi9SRUFETUUubWQpIGRpcmVjdG9yeS4KZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvYXVkaW9fcHJlcHJvY2Vzc29yLnB5IGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9hdWRpb19wcmVwcm9jZXNzb3IucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM3OWVjNgotLS0gL2Rldi9udWxsCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvYXVkaW9fcHJlcHJvY2Vzc29yLnB5CkBAIC0wLDAgKzEsNTUxIEBACisjIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisiIiIKK0F1ZGlvIFNhbXBsZSBQcmVwcm9jZXNzb3IKKworV2hlbiB0aGlzIG1vZHVsZSBpcyBydW4sIGZlYXR1cmUgZ2VuZXJhdGlvbiBtb2RlbHMgYXJlIGNyZWF0ZWQgaW4gdGhlIC50ZmxpdGUKK2Zvcm1hdC4KKworUnVuOgorYmF6ZWwgYnVpbGQgdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaDphdWRpb19wcmVwcm9jZXNzb3IKK2JhemVsLWJpbi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL2F1ZGlvX3ByZXByb2Nlc3NvcgorIiIiCisKK2Zyb20gX19mdXR1cmVfXyBpbXBvcnQgYW5ub3RhdGlvbnMKK2Zyb20gcGF0aGxpYiBpbXBvcnQgUGF0aAorZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzCitpbXBvcnQgdGVtcGZpbGUKKworZnJvbSBhYnNsIGltcG9ydCBhcHAKK2Zyb20gYWJzbCBpbXBvcnQgZmxhZ3MKKworaW1wb3J0IHRlbnNvcmZsb3cgYXMgdGYKK2Zyb20gdGVuc29yZmxvdy5weXRob24ucGxhdGZvcm0gaW1wb3J0IHJlc291cmNlX2xvYWRlcgorZnJvbSB0ZmxpdGVfbWljcm8ucHl0aG9uLnRmbGl0ZV9taWNyby5zaWduYWwub3BzIGltcG9ydCB3aW5kb3dfb3AKK2Zyb20gdGZsaXRlX21pY3JvLnB5dGhvbi50ZmxpdGVfbWljcm8uc2lnbmFsLm9wcyBpbXBvcnQgZmZ0X29wcworZnJvbSB0ZmxpdGVfbWljcm8ucHl0aG9uLnRmbGl0ZV9taWNyby5zaWduYWwub3BzIGltcG9ydCBlbmVyZ3lfb3AKK2Zyb20gdGZsaXRlX21pY3JvLnB5dGhvbi50ZmxpdGVfbWljcm8uc2lnbmFsLm9wcyBpbXBvcnQgZmlsdGVyX2Jhbmtfb3BzCitmcm9tIHRmbGl0ZV9taWNyby5weXRob24udGZsaXRlX21pY3JvLnNpZ25hbC5vcHMgaW1wb3J0IHBjYW5fb3AKK2Zyb20gdGZsaXRlX21pY3JvLnB5dGhvbi50ZmxpdGVfbWljcm8gaW1wb3J0IHJ1bnRpbWUKKworX0VOQUJMRV9ERUJVRyA9IGZsYWdzLkRFRklORV9lbnVtKAorICAgICdkZWJ1Z19tb2RlJywKKyAgICAnb2ZmJywKKyAgICBbJ29mZicsICdhbGwnXSwKKyAgICAnRW5hYmxlIGRlYnVnIG91dHB1dCcsCispCisKK19GSUxFX1RPX1RFU1QgPSBmbGFncy5ERUZJTkVfZW51bSgnZmlsZV90b190ZXN0JywgJ25vJywgWydubycsICd5ZXMnXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRmlsZSB0byB0ZXN0JykKKworX09VVFBVVF9UWVBFID0gZmxhZ3MuREVGSU5FX2VudW0oCisgICAgJ291dHB1dF90eXBlJywgJ2ludDgnLCBbJ2ludDgnLCAnZmxvYXQzMiddLAorICAgICdUeXBlIG9mIFRmTGl0ZSBvdXRwdXQgZmlsZSAoLnRmbGl0ZSkgdG8gZ2VuZXJhdGUnKQorCisKK2RlZiBfZGVidWdfcHJpbnQoKmFyZ3MpOgorICBpZiBfRU5BQkxFX0RFQlVHLnZhbHVlICE9ICdvZmYnOgorICAgIHByaW50KCphcmdzKQorCisKK2NsYXNzIF9HZW5lcmF0ZUZlYXR1cmUodGYuTW9kdWxlKToKKyAgIiIiR2VuZXJhdGUgZmVhdHVyZSB0ZW5zb3IgZnJvbSBhdWRpbyB3aW5kb3cgc2FtcGxlcyIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lOiBzdHIsIHBhcmFtczogRmVhdHVyZVBhcmFtcywgZGV0YWlsOiBzdHIpOgorICAgIHN1cGVyKCkuX19pbml0X18obmFtZT1uYW1lKQorICAgIHNlbGYuX3BhcmFtcyA9IHBhcmFtcworICAgIHdpbmRvd19zYW1wbGVfY291bnQ6IGludCA9IGludChwYXJhbXMud2luZG93X3NpemVfbXMgKiBwYXJhbXMuc2FtcGxlX3JhdGUgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwKQorICAgIGhhbm5fd2luZG93X3dlaWdodHMgPSB3aW5kb3dfb3AuaGFubl93aW5kb3dfd2VpZ2h0cygKKyAgICAgICAgd2luZG93X3NhbXBsZV9jb3VudCwgcGFyYW1zLndpbmRvd19zY2FsaW5nX2JpdHMpCisgICAgc2VsZi5faGFubl93aW5kb3dfd2VpZ2h0c190ZW5zb3IgPSB0Zi5jb25zdGFudChoYW5uX3dpbmRvd193ZWlnaHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0naGFubl93aW5kb3dfd2VpZ2h0cycpCisgICAgc2VsZi5fZmZ0X3NpemUsIHNlbGYuX2ZmdF9zaXplX2xvZzIgPSBmZnRfb3BzLmdldF9wb3cyX2ZmdF9sZW5ndGgoCisgICAgICAgIHdpbmRvd19zYW1wbGVfY291bnQpCisgICAgc2VsZi5fZmlsdGVyX2JhbmtfaW5kZXhfc3RhcnQsIHNlbGYuX2ZpbHRlcl9iYW5rX2luZGV4X2VuZCA9IFwKKyAgICAgICAgZmlsdGVyX2Jhbmtfb3BzLmNhbGNfc3RhcnRfZW5kX2luZGljZXMoCisgICAgICAgICAgICBzZWxmLl9mZnRfc2l6ZSwKKyAgICAgICAgICAgIHBhcmFtcy5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgIHBhcmFtcy5maWx0ZXJfYmFua19udW1iZXJfb2ZfY2hhbm5lbHMsCisgICAgICAgICAgICBwYXJhbXMuZmlsdGVyX2JhbmtfbG93ZXJfYmFuZF9saW1pdF9oeiwKKyAgICAgICAgICAgIHBhcmFtcy5maWx0ZXJfYmFua191cHBlcl9iYW5kX2xpbWl0X2h6KQorICAgIHNlbGYuX2RldGFpbCA9IGRldGFpbAorCisgIGRlZiBnZW5lcmF0ZV9mZWF0dXJlX2Zvcl9mcmFtZShzZWxmLCBhdWRpb19mcmFtZTogdGYuVGVuc29yKSAtPiB0Zi5UZW5zb3I6CisgICAgIyBHcmFwaCBleGVjdXRpb24gZG9lcyBub3QgaGFuZGxlIGdsb2JhbCB2YXJpYWJsZXMuICBJbnN0ZWFkLCBjYXB0dXJlIHRoZQorICAgICMgZ2xvYmFsIHZhcmlhYmxlKHMpIHdpdGhpbiBhIGNsb3N1cmUgKF9kZWJ1Z19wcmludF9pbnRlcm5hbCkuCisgICAgZGVmIF9kZWJ1Z19wcmludF9pbnRlcm5hbCgqYXJncyk6CisgICAgICBpZiBfRU5BQkxFX0RFQlVHLnZhbHVlICE9ICdvZmYnIGFuZCB0Zi5leGVjdXRpbmdfZWFnZXJseSgpOgorICAgICAgICBwcmludCgqYXJncykKKworICAgIF9kZWJ1Z19wcmludCgnKioqIGdlbmVyYXRlX2ZlYXR1cmVfZm9yX2ZyYW1lICoqKicpCisgICAgcGFyYW1zID0gc2VsZi5fcGFyYW1zCisgICAgZGV0YWlsID0gc2VsZi5fZGV0YWlsCisKKyAgICAjIHVwZGF0ZSBmaWx0ZXJfYmFua19vcHMgY29uc3RhbnRzCisgICAgZmlsdGVyX2Jhbmtfb3BzLkZJTFRFUl9CQU5LX1dFSUdIVF9TQ0FMSU5HX0JJVFMgPSBcCisgICAgICAgIHBhcmFtcy5maWx0ZXJfYmFua19zY2FsaW5nX2JpdHMKKyAgICBmaWx0ZXJfYmFua19vcHMuRklMVEVSX0JBTktfQUxJR05NRU5UID0gcGFyYW1zLmZpbHRlcl9iYW5rX2FsaWdubWVudAorICAgIGZpbHRlcl9iYW5rX29wcy5GSUxURVJfQkFOS19DSEFOTkVMX0JMT0NLX1NJWkUgPSBcCisgICAgICAgIHBhcmFtcy5maWx0ZXJfYmFua19jaGFubmVsX2Jsb2NrX3NpemUKKworICAgIF9kZWJ1Z19wcmludF9pbnRlcm5hbChmJ2F1ZGlvIGZyYW1lIG91dHB1dCBbe2RldGFpbH1dOiB7YXVkaW9fZnJhbWUhcn0nKQorCisgICAgIyBhcHBseSB3aW5kb3cgdG8gYXVkaW8gZnJhbWUKKyAgICB3ZWlnaHRzID0gc2VsZi5faGFubl93aW5kb3dfd2VpZ2h0c190ZW5zb3IKKyAgICBfZGVidWdfcHJpbnRfaW50ZXJuYWwoZid3aW5kb3cgd2VpZ2h0cyBvdXRwdXQgW3tkZXRhaWx9XToge3dlaWdodHMhcn0nKQorICAgIHdpbmRvd19vdXRwdXQ6IHRmLlRlbnNvciA9IHdpbmRvd19vcC53aW5kb3coYXVkaW9fZnJhbWUsIHdlaWdodHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMud2luZG93X3NjYWxpbmdfYml0cykKKyAgICBfZGVidWdfcHJpbnRfaW50ZXJuYWwoZid3aW5kb3cgb3V0cHV0IFt7ZGV0YWlsfV06IHt3aW5kb3dfb3V0cHV0IXJ9JykKKworICAgICMgcHJlLXNjYWxlIHdpbmRvdyBvdXRwdXQKKyAgICB3aW5kb3dfb3V0cHV0ID0gdGYucmVzaGFwZSh3aW5kb3dfb3V0cHV0LCBbLTFdKQorICAgIHdpbmRvd19zY2FsZWRfb3V0cHV0LCBzY2FsaW5nX3NoaWZ0ID0gZmZ0X29wcy5mZnRfYXV0b19zY2FsZSh3aW5kb3dfb3V0cHV0KQorICAgIF9kZWJ1Z19wcmludF9pbnRlcm5hbChmJ3NjYWxpbmcgc2hpZnQgW3tkZXRhaWx9XToge3NjYWxpbmdfc2hpZnQhcn0nKQorCisgICAgIyBjb21wdXRlIEZGVCBvbiBzY2FsZWQgd2luZG93IG91dHB1dAorICAgIF9kZWJ1Z19wcmludF9pbnRlcm5hbCgKKyAgICAgICAgZidmZnQgc2l6ZSwgbG9nMiBbe2RldGFpbH1dOiB7c2VsZi5fZmZ0X3NpemV9LCB7c2VsZi5fZmZ0X3NpemVfbG9nMn0nKQorICAgIGZmdF9vdXRwdXQ6IHRmLlRlbnNvciA9IGZmdF9vcHMucmZmdCh3aW5kb3dfc2NhbGVkX291dHB1dCwgc2VsZi5fZmZ0X3NpemUpCisgICAgX2RlYnVnX3ByaW50X2ludGVybmFsKGYnZmZ0IG91dHB1dCBbe2RldGFpbH1dOiB7ZmZ0X291dHB1dCFyfScpCisKKyAgICBpbmRleF9zdGFydCA9IHNlbGYuX2ZpbHRlcl9iYW5rX2luZGV4X3N0YXJ0CisgICAgaW5kZXhfZW5kID0gc2VsZi5fZmlsdGVyX2JhbmtfaW5kZXhfZW5kCisgICAgIyBjb252ZXJ0IGZmdCBvdXRwdXQgY29tcGxleCBudW1iZXJzIHRvIGVuZXJneSB2YWx1ZXMKKyAgICBfZGVidWdfcHJpbnRfaW50ZXJuYWwoCisgICAgICAgIGYnaW5kZXggc3RhcnQsIGVuZCBbe2RldGFpbH1dOiB7aW5kZXhfc3RhcnR9LCB7aW5kZXhfZW5kfScpCisgICAgZW5lcmd5X291dHB1dDogdGYuVGVuc29yID0gZW5lcmd5X29wLmVuZXJneShmZnRfb3V0cHV0LCBpbmRleF9zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4X2VuZCkKKyAgICAjIEVuZXJneSBvcCBkb2VzIG5vdCB6ZXJvIGluZGljZXMgb3V0c2lkZSBbaW5kZXhfc3RhcnQsaW5kZXhfZW5kKS4KKyAgICAjIFRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucyB0byB6ZXJvIHBvcnRpb25zIG9mIHRoZSBlbmVyZ3kgb3Agb3V0cHV0CisgICAgIyBjb3VsZCBiZSBtdWNoIG1vcmUgZWZmaWNpZW50bHkgcGVyZm9ybWVkIGluc2lkZSB0aGUgZW5lcmd5IG9wIEMrKworICAgICMgY29kZS4KKyAgICAjIE5lZWQgdG8gY29udmVydCB0byB0Zi5pbnQzMiBvciB0aGUgVGZMaXRlIGNvbnZlcnRlciB3aWxsIG5vdCB1c2UKKyAgICAjIHRoZSBjb3JyZWN0IG9wcy4KKyAgICBlbmVyZ3lfb3V0cHV0ID0gdGYuY2FzdChlbmVyZ3lfb3V0cHV0LCB0Zi5pbnQzMikgICMgdHlwZTogaWdub3JlCisgICAgemVyb3NfaGVhZCA9IHRmLnplcm9zKGluZGV4X3N0YXJ0LCBkdHlwZT10Zi5pbnQzMikKKyAgICBudW1iZXJfb2ZfZWxlbWVudHMgPSBlbmVyZ3lfb3V0cHV0LnNoYXBlLm51bV9lbGVtZW50cygpCisgICAgemVyb3NfdGFpbCA9IHRmLnplcm9zKAorICAgICAgICBudW1iZXJfb2ZfZWxlbWVudHMgLSBpbmRleF9lbmQsICAjIHR5cGU6IGlnbm9yZQorICAgICAgICBkdHlwZT10Zi5pbnQzMikKKyAgICBlbmVyZ3lfc2xpY2UgPSBlbmVyZ3lfb3V0cHV0W2luZGV4X3N0YXJ0OmluZGV4X2VuZF0KKyAgICBlbmVyZ3lfb3V0cHV0ID0gdGYuY29uY2F0KFt6ZXJvc19oZWFkLCBlbmVyZ3lfc2xpY2UsIHplcm9zX3RhaWxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCkgICMgdHlwZTogaWdub3JlCisgICAgZW5lcmd5X291dHB1dCA9IHRmLmNhc3QoZW5lcmd5X291dHB1dCwgZHR5cGU9dGYudWludDMyKSAgIyB0eXBlOiBpZ25vcmUKKyAgICBfZGVidWdfcHJpbnRfaW50ZXJuYWwoZidlbmVyZ3kgb3V0cHV0IFt7ZGV0YWlsfV06IHtlbmVyZ3lfb3V0cHV0IXJ9JykKKworICAgICMgY29tcHJlc3MgZW5lcmd5IG91dHB1dCBpbnRvIDQwIGNoYW5uZWxzCisgICAgZmlsdGVyX291dHB1dDogdGYuVGVuc29yID0gZmlsdGVyX2Jhbmtfb3BzLmZpbHRlcl9iYW5rKAorICAgICAgICBlbmVyZ3lfb3V0cHV0LCBwYXJhbXMuc2FtcGxlX3JhdGUsCisgICAgICAgIHBhcmFtcy5maWx0ZXJfYmFua19udW1iZXJfb2ZfY2hhbm5lbHMsCisgICAgICAgIHBhcmFtcy5maWx0ZXJfYmFua19sb3dlcl9iYW5kX2xpbWl0X2h6LAorICAgICAgICBwYXJhbXMuZmlsdGVyX2JhbmtfdXBwZXJfYmFuZF9saW1pdF9oeikKKyAgICBfZGVidWdfcHJpbnRfaW50ZXJuYWwoZidmaWx0ZXJiYW5rIG91dHB1dCBbe2RldGFpbH1dOiB7ZmlsdGVyX291dHB1dCFyfScpCisKKyAgICAjIHNjYWxlIGRvd24gZmlsdGVyX291dHB1dAorICAgIGZpbHRlcl9zY2FsZWRfb3V0cHV0OiB0Zi5UZW5zb3IgPSBmaWx0ZXJfYmFua19vcHMuZmlsdGVyX2Jhbmtfc3F1YXJlX3Jvb3QoCisgICAgICAgIGZpbHRlcl9vdXRwdXQsIHNjYWxpbmdfc2hpZnQpCisgICAgX2RlYnVnX3ByaW50X2ludGVybmFsKAorICAgICAgICBmJ3NjYWxlZCBmaWx0ZXJiYW5rIG91dHB1dCBbe2RldGFpbH1dOiB7ZmlsdGVyX3NjYWxlZF9vdXRwdXQhcn0nKQorCisgICAgIyBub2lzZSByZWR1Y3Rpb24KKyAgICBzcGVjdHJhbF9zdWJfYml0czogaW50ID0gcGFyYW1zLmZpbHRlcl9iYW5rX3NwZWN0cmFsX3N1YnRyYWN0aW9uX2JpdHMKKyAgICBmaWx0ZXJfbm9pc2Vfb3V0cHV0OiB0Zi5UZW5zb3IKKyAgICBmaWx0ZXJfbm9pc2VfZXN0aW1hdGU6IHRmLlRlbnNvcgorICAgIGZpbHRlcl9ub2lzZV9vdXRwdXQsIGZpbHRlcl9ub2lzZV9lc3RpbWF0ZSA9IFwKKyAgICAgICAgZmlsdGVyX2Jhbmtfb3BzLmZpbHRlcl9iYW5rX3NwZWN0cmFsX3N1YnRyYWN0aW9uKAorICAgICAgICAgICAgZmlsdGVyX3NjYWxlZF9vdXRwdXQsCisgICAgICAgICAgICBudW1fY2hhbm5lbHM9cGFyYW1zLmZpbHRlcl9iYW5rX251bWJlcl9vZl9jaGFubmVscywKKyAgICAgICAgICAgIHNtb290aGluZz1wYXJhbXMuZmlsdGVyX2JhbmtfZXZlbl9zbW9vdGhpbmcsCisgICAgICAgICAgICBhbHRlcm5hdGVfc21vb3RoaW5nPXBhcmFtcy5maWx0ZXJfYmFua19vZGRfc21vb3RoaW5nLAorICAgICAgICAgICAgc21vb3RoaW5nX2JpdHM9cGFyYW1zLmZpbHRlcl9iYW5rX3Ntb290aGluZ19iaXRzLAorICAgICAgICAgICAgbWluX3NpZ25hbF9yZW1haW5pbmc9cGFyYW1zLmZpbHRlcl9iYW5rX21pbl9zaWduYWxfcmVtYWluaW5nLAorICAgICAgICAgICAgY2xhbXBpbmc9cGFyYW1zLmZpbHRlcl9iYW5rX2NsYW1waW5nLAorICAgICAgICAgICAgc3BlY3RyYWxfc3VidHJhY3Rpb25fYml0cz1zcGVjdHJhbF9zdWJfYml0cywKKyAgICAgICAgKQorICAgIF9kZWJ1Z19wcmludF9pbnRlcm5hbChmJ25vaXNlIG91dHB1dCBbe2RldGFpbH1dOiB7ZmlsdGVyX25vaXNlX291dHB1dCFyfScpCisKKyAgICAjIGF1dG9tYXRpYyBnYWluIGNvbnRyb2wgKFBDQU4pCisgICAgY29ycmVjdGlvbl9iaXRzOiBpbnQgPSBzZWxmLl9mZnRfc2l6ZV9sb2cyIC0gXAorICAgICAgICBpbnQocGFyYW1zLmZpbHRlcl9iYW5rX3NjYWxpbmdfYml0cyAvIDIpCisgICAgZmlsdGVyX2FnY19vdXRwdXQ6IHRmLlRlbnNvciA9IHBjYW5fb3AucGNhbigKKyAgICAgICAgZmlsdGVyX25vaXNlX291dHB1dCwKKyAgICAgICAgZmlsdGVyX25vaXNlX2VzdGltYXRlLAorICAgICAgICBzdHJlbmd0aD1wYXJhbXMucGNhbl9zdHJlbmd0aCwKKyAgICAgICAgb2Zmc2V0PXBhcmFtcy5wY2FuX29mZnNldCwKKyAgICAgICAgZ2Fpbl9iaXRzPXBhcmFtcy5wY2FuX2dhaW5fYml0cywKKyAgICAgICAgc21vb3RoaW5nX2JpdHM9cGFyYW1zLnBjYW5fc21vb3RoaW5nX2JpdHMsCisgICAgICAgIGlucHV0X2NvcnJlY3Rpb25fYml0cz1jb3JyZWN0aW9uX2JpdHMpCisgICAgX2RlYnVnX3ByaW50X2ludGVybmFsKAorICAgICAgICBmJ0FHQyBOb2lzZSBvdXRwdXQgW3tkZXRhaWx9XToge2ZpbHRlcl9hZ2Nfb3V0cHV0IXJ9JykKKworICAgICMgcmUtc2NhbGUgZmVhdHVyZXMgZnJvbSBVSU5UMzIgdG8gSU5UMTYKKyAgICBmZWF0dXJlX3Bvc3Rfc2NhbGU6IGludCA9IDEgPDwgcGFyYW1zLmZpbHRlcl9iYW5rX3Bvc3Rfc2NhbGluZ19iaXRzCisgICAgZmVhdHVyZV9wcmVfc2NhbGVfc2hpZnQ6IGludCA9IGNvcnJlY3Rpb25fYml0cworICAgIGZlYXR1cmVfcmVzY2FsZWRfb3V0cHV0OiB0Zi5UZW5zb3IgPSBmaWx0ZXJfYmFua19vcHMuZmlsdGVyX2JhbmtfbG9nKAorICAgICAgICBmaWx0ZXJfYWdjX291dHB1dCwKKyAgICAgICAgb3V0cHV0X3NjYWxlPWZlYXR1cmVfcG9zdF9zY2FsZSwKKyAgICAgICAgaW5wdXRfY29ycmVjdGlvbl9iaXRzPWZlYXR1cmVfcHJlX3NjYWxlX3NoaWZ0KQorICAgIF9kZWJ1Z19wcmludF9pbnRlcm5hbCgKKyAgICAgICAgZidzY2FsZWQgbm9pc2Ugb3V0cHV0IFt7ZGV0YWlsfV06IHtmZWF0dXJlX3Jlc2NhbGVkX291dHB1dCFyfScpCisKKyAgICAjIFRoZXNlIHNjYWxpbmcgdmFsdWVzIGFyZSBkZXJpdmVkIGZyb20gdGhvc2UgdXNlZCBpbiBpbnB1dF9kYXRhLnB5IGluIHRoZQorICAgICMgdHJhaW5pbmcgcGlwZWxpbmUuCisgICAgIyBUaGUgZmVhdHVyZSBwaXBlbGluZSBvdXRwdXRzIDE2LWJpdCBzaWduZWQgaW50ZWdlcnMgaW4gcm91Z2hseSBhIDAgdG8gNjcwCisgICAgIyByYW5nZS4gSW4gdHJhaW5pbmcsIHRoZXNlIGFyZSB0aGVuIGFyYml0cmFyaWx5IGRpdmlkZWQgYnkgMjUuNiB0byBnZXQKKyAgICAjIGZsb2F0IHZhbHVlcyBpbiB0aGUgcm91Z2ggcmFuZ2Ugb2YgMC4wIHRvIDI2LjAuIFRoaXMgc2NhbGluZyBpcyBwZXJmb3JtZWQKKyAgICAjIGZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIHRvIG1hdGNoIHVwIHdpdGggdGhlIG91dHB1dCBvZiBvdGhlciBmZWF0dXJlCisgICAgIyBnZW5lcmF0b3JzLgorICAgICMgVGhlIHByb2Nlc3MgaXMgdGhlbiBmdXJ0aGVyIGNvbXBsaWNhdGVkIHdoZW4gd2UgcXVhbnRpemUgdGhlIG1vZGVsLiBUaGlzCisgICAgIyBtZWFucyB3ZSBoYXZlIHRvIHNjYWxlIHRoZSAwLjAgdG8gMjYuMCByZWFsIHZhbHVlcyB0byB0aGUgLTEyOCB0byAxMjcKKyAgICAjIHNpZ25lZCBpbnRlZ2VyIG51bWJlcnMuCisgICAgIyBBbGwgdGhpcyBtZWFucyB0aGF0IHRvIGdldCBtYXRjaGluZyB2YWx1ZXMgZnJvbSBvdXIgaW50ZWdlciBmZWF0dXJlCisgICAgIyBvdXRwdXQgaW50byB0aGUgdGVuc29yIGlucHV0LCB3ZSBoYXZlIHRvIHBlcmZvcm06CisgICAgIyBpbnB1dCA9ICgoKGZlYXR1cmUgLyAyNS42KSAvIDI2LjApICogMjU2KSAtIDEyOAorICAgICMgVG8gc2ltcGxpZnkgdGhpcyBhbmQgcGVyZm9ybSBpdCBpbiAzMi1iaXQgaW50ZWdlciBtYXRoLCB3ZSByZWFycmFuZ2UgdG86CisgICAgIyBpbnB1dCA9IChmZWF0dXJlICogMjU2KSAvICgyNS42ICogMjYuMCkgLSAxMjgKKyAgICAjIGNvbnN0ZXhwciBpbnQzMl90IHZhbHVlX3NjYWxlID0gMjU2OworICAgICMgY29uc3RleHByIGludDMyX3QgdmFsdWVfZGl2ID0KKyAgICAjICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PigoMjUuNmYgKiAyNi4wZikgKyAwLjVmKTsKKyAgICAjIGludDMyX3QgdmFsdWUgPQorICAgICMgICAgICgoZnJvbnRlbmRfb3V0cHV0LnZhbHVlc1tpXSAqIHZhbHVlX3NjYWxlKSArICh2YWx1ZV9kaXYgLyAyKSkgLworICAgICMgICAgIHZhbHVlX2RpdjsKKyAgICAjIHZhbHVlIC09IDEyODsKKyAgICAjIGlmICh2YWx1ZSA8IC0xMjgpIHsKKyAgICAjICAgdmFsdWUgPSAtMTI4OworICAgICMgfQorICAgICMgaWYgKHZhbHVlID4gMTI3KSB7CisgICAgIyAgIHZhbHVlID0gMTI3OworICAgICMgfQorICAgICMgb3V0cHV0W2ldID0gdmFsdWU7CisKKyAgICBmZWF0dXJlX291dHB1dDogdGYuVGVuc29yCisgICAgaWYgc2VsZi5fcGFyYW1zLnVzZV9mbG9hdF9vdXRwdXQ6CisgICAgICAjIGZlYXR1cmVfcmVzY2FsZWRfb3V0cHV0IGlzIElOVDE2LCBjYXN0IHRvIEZMT0FUMzIKKyAgICAgIGZlYXR1cmVfb3V0cHV0ID0gdGYuY2FzdChmZWF0dXJlX3Jlc2NhbGVkX291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Zi5mbG9hdDMyKSAgIyB0eXBlOiBpZ25vcmUKKyAgICAgICMgZmVhdHVyZV9vdXRwdXQgd2lsbCBiZSBGTE9BVDMyCisgICAgICBmZWF0dXJlX291dHB1dCAvPSBzZWxmLl9wYXJhbXMubGVnYWN5X291dHB1dF9zY2FsaW5nCisgICAgZWxzZToKKyAgICAgIHZhbHVlX3NjYWxlID0gdGYuY29uc3RhbnQoMjU2LCBkdHlwZT10Zi5pbnQzMikKKyAgICAgIHZhbHVlX2RpdiA9IHRmLmNvbnN0YW50KGludCgoMjUuNiAqIDI2KSArIDAuNSksIGR0eXBlPXRmLmludDMyKQorICAgICAgZmVhdHVyZV9vdXRwdXQgPSB0Zi5jYXN0KGZlYXR1cmVfcmVzY2FsZWRfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmLmludDMyKSAgIyB0eXBlOiBpZ25vcmUKKyAgICAgIGZlYXR1cmVfb3V0cHV0ID0gKGZlYXR1cmVfb3V0cHV0ICogdmFsdWVfc2NhbGUpICsgaW50KHZhbHVlX2RpdiAvIDIpCisgICAgICBmZWF0dXJlX291dHB1dCA9IHRmLnRydW5jYXRlZGl2KGZlYXR1cmVfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9kaXYpICAjIHR5cGU6IGlnbm9yZQorICAgICAgZmVhdHVyZV9vdXRwdXQgKz0gdGYuY29uc3RhbnQoLTEyOCwgZHR5cGU9dGYuaW50MzIpCisgICAgICBmZWF0dXJlX291dHB1dCA9IHRmLmNsaXBfYnlfdmFsdWUoZmVhdHVyZV9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcF92YWx1ZV9taW49LTEyOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwX3ZhbHVlX21heD0xMjcpICAjIHR5cGU6IGlnbm9yZQorICAgICAgZmVhdHVyZV9vdXRwdXQgPSB0Zi5jYXN0KGZlYXR1cmVfb3V0cHV0LCB0Zi5pbnQ4KSAgIyB0eXBlOiBpZ25vcmUKKworICAgIF9kZWJ1Z19wcmludF9pbnRlcm5hbChmJ2ZlYXR1cmUgb3V0cHV0IFt7ZGV0YWlsfV06IHtmZWF0dXJlX291dHB1dCFyfScpCisKKyAgICByZXR1cm4gZmVhdHVyZV9vdXRwdXQKKworCitAZGF0YWNsYXNzKGt3X29ubHk9VHJ1ZSwgZnJvemVuPVRydWUpCitjbGFzcyBGZWF0dXJlUGFyYW1zOgorICAiIiIKKyAgRmVhdHVyZSBnZW5lcmF0b3IgcGFyYW1ldGVycworCisgIERlZmF1bHRzIGFyZSBjb25maWd1cmVkIHRvIHdvcmsgd2l0aCB0aGUgbWljcm9fc3BlZWNoX3F1YW50aXplZC50ZmxpdGUgbW9kZWwKKyAgIiIiCisKKyAgc2FtcGxlX3JhdGU6IGludCA9IDE2MDAwCisgICIiImF1ZGlvIHNhbXBsZSByYXRlIiIiCisKKyAgd2luZG93X3NpemVfbXM6IGludCA9IDMwCisgICIiImlucHV0IHdpbmRvdyBzaXplIGluIG1pbGxpc2Vjb25kcyIiIgorCisgIHdpbmRvd19zdHJpZGVfbXM6IGludCA9IDIwCisgICIiImlucHV0IHdpbmRvdyBzdHJpZGUgaW4gbWlsbGlzZWNvbmRzIiIiCisKKyAgd2luZG93X3NjYWxpbmdfYml0czogaW50ID0gMTIKKyAgIiIiaW5wdXQgd2luZG93IHNoYXBpbmc6IHNjYWxpbmcgYml0cyIiIgorCisgIGZpbHRlcl9iYW5rX251bWJlcl9vZl9jaGFubmVsczogaW50ID0gNDAKKyAgIiIiZmlsdGVyIGJhbmsgY2hhbm5lbCBjb3VudCIiIgorCisgIGZpbHRlcl9iYW5rX2xvd2VyX2JhbmRfbGltaXRfaHo6IGZsb2F0ID0gMTI1LjAKKyAgIiIiZmlsdGVyIGJhbmsgbG93ZXIgYmFuZCBsaW1pdCIiIgorCisgIGZpbHRlcl9iYW5rX3VwcGVyX2JhbmRfbGltaXRfaHo6IGZsb2F0ID0gNzUwMC4wCisgICIiImZpbHRlciBiYW5rIHVwcGVyIGJhbmQgbGltaXQiIiIKKworICBmaWx0ZXJfYmFua19zY2FsaW5nX2JpdHM6IGludCA9IFwKKyAgICAgIGZpbHRlcl9iYW5rX29wcy5GSUxURVJfQkFOS19XRUlHSFRfU0NBTElOR19CSVRTCisgICIiImZpbHRlciBiYW5rIHdlaWdodCBzY2FsaW5nIGJpdHMsIHVwZGF0ZXMgZmlsdGVyIGJhbmsgY29uc3RhbnQiIiIKKworICBmaWx0ZXJfYmFua19hbGlnbm1lbnQ6IGludCA9IDQKKyAgIiIiZmlsdGVyIGJhbmsgYWxpZ25tZW50LCB1cGRhdGVzIGZpbHRlciBiYW5rIGNvbnN0YW50IiIiCisKKyAgZmlsdGVyX2JhbmtfY2hhbm5lbF9ibG9ja19zaXplOiBpbnQgPSA0CisgICIiImZpbHRlciBiYW5rIGNoYW5uZWwgYmxvY2sgc2l6ZSwgdXBkYXRlcyBmaWx0ZXIgYmFuayBjb25zdGFudCIiIgorCisgIGZpbHRlcl9iYW5rX3Bvc3Rfc2NhbGluZ19iaXRzOiBpbnQgPSA2CisgICIiImZpbHRlciBiYW5rIG91dHB1dCBsb2ctc2NhbGluZyBiaXRzIiIiCisKKyAgZmlsdGVyX2Jhbmtfc3BlY3RyYWxfc3VidHJhY3Rpb25fYml0czogaW50ID0gMTQKKyAgIiIiZmlsdGVyIGJhbmsgbm9pc2UgcmVkdWN0aW9uIHNwZWN0cmFsIHN1YnRyYXRpb24gYml0cyIiIgorCisgIGZpbHRlcl9iYW5rX3Ntb290aGluZ19iaXRzOiBpbnQgPSAxMAorICAiIiJmaWx0ZXIgYmFuayBub2lzZSByZWR1Y3Rpb24gc21vb3RoaW5nIGJpdHMiIiIKKworICBmaWx0ZXJfYmFua19ldmVuX3Ntb290aGluZzogZmxvYXQgPSAwLjAyNQorICAiIiJmaWx0ZXIgYmFuayBub2lzZSByZWR1Y3Rpb24gZXZlbiBzbW9vdGhpbmciIiIKKworICBmaWx0ZXJfYmFua19vZGRfc21vb3RoaW5nOiBmbG9hdCA9IDAuMDYKKyAgIiIiZmlsdGVyIGJhbmsgbm9pc2UgcmVkdWN0aW9uIG9kZCBzbW9vdGhpbmciIiIKKworICBmaWx0ZXJfYmFua19taW5fc2lnbmFsX3JlbWFpbmluZzogZmxvYXQgPSAwLjA1CisgICIiImZpbHRlciBiYW5rIG5vaXNlIHJlZHVjdGlvbiBtaW5pbXVtIHNpZ25hbCByZW1haW5pbmciIiIKKworICBmaWx0ZXJfYmFua19jbGFtcGluZzogYm9vbCA9IEZhbHNlCisgICIiImZpbHRlciBiYW5rIG5vaXNlIHJlZHVjdGlvbiBjbGFtcGluZyIiIgorCisgIHBjYW5fc3RyZW5ndGg6IGZsb2F0ID0gMC45NQorICAiIiJQQ0FOIGdhaW4gY29udHJvbCBzdHJlbmd0aCIiIgorCisgIHBjYW5fb2Zmc2V0OiBmbG9hdCA9IDgwLjAKKyAgIiIiUENBTiBnYWluIGNvbnRyb2wgb2Zmc2V0IiIiCisKKyAgcGNhbl9nYWluX2JpdHM6IGludCA9IDIxCisgICIiIlBDQU4gZ2FpbiBjb250cm9sIGJpdHMiIiIKKworICBwY2FuX3Ntb290aGluZ19iaXRzID0gMTAKKyAgIiIiUENBTiBnYWluIGNvbnRyb2wgc21vb3RoaW5nIGJpdHMiIiIKKworICBsZWdhY3lfb3V0cHV0X3NjYWxpbmc6IGZsb2F0ID0gMjUuNgorICAiIiJGaW5hbCBvdXRwdXQgc2NhbGluZywgbGVnYWN5IGZyb20gdHJhaW5pbmciIiIKKworICB1c2VfZmxvYXRfb3V0cHV0OiBib29sID0gRmFsc2UKKyAgIiIiVXNlIGZsb2F0IG91dHB1dCBpZiBUcnVlLCBvdGhlcndpc2UgaW50OCBvdXRwdXQiIiIKKworCitjbGFzcyBBdWRpb1ByZXByb2Nlc3NvcjoKKyAgIiIiCisgIEF1ZGlvIFByZXByb2Nlc3NvcgorCisgIEFyZ3M6CisgICAgcGFyYW1zOiBGZWF0dXJlUGFyYW1zLCBhbiBpbW11dGFibGUgb2JqZWN0IHN1cHBseWluZyBwYXJhbWV0ZXJzIGZvcgorICAgIHRoZSBBdWRpb1ByZXByb2Nlc3NvciBpbnN0YW5jZQorICAgIGRldGFpbDogc3RyLCB1c2VkIGZvciBkZWJ1ZyBvdXRwdXQgKG9wdGlvbmFsLCBmb3IgZGVidWdnaW5nIG9ubHkpCisgICIiIgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJhbXM6IEZlYXR1cmVQYXJhbXMsIGRldGFpbDogc3RyID0gJ3Vua25vd24nKToKKyAgICBzZWxmLl9kZXRhaWwgPSBkZXRhaWwKKyAgICBzZWxmLl9wYXJhbXMgPSBwYXJhbXMKKyAgICBzZWxmLl9zYW1wbGVzX3Blcl93aW5kb3cgPSBpbnQocGFyYW1zLndpbmRvd19zaXplX21zICogcGFyYW1zLnNhbXBsZV9yYXRlIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMCkKKyAgICBzZWxmLl90ZmxtX2ludGVycHJldGVyID0gTm9uZQorICAgIHNlbGYuX2ZlYXR1cmVfZ2VuZXJhdG9yID0gTm9uZQorICAgIHNlbGYuX2ZlYXR1cmVfZ2VuZXJhdG9yX2NvbmNyZXRlX2Z1bmN0aW9uID0gTm9uZQorICAgIHNlbGYuX21vZGVsID0gTm9uZQorICAgIHNlbGYuX3NhbXBsZXMgPSBOb25lCisKKyAgZGVmIF9nZXRfZmVhdHVyZV9nZW5lcmF0b3Ioc2VsZik6CisgICAgaWYgc2VsZi5fZmVhdHVyZV9nZW5lcmF0b3IgaXMgTm9uZToKKyAgICAgIHNlbGYuX2ZlYXR1cmVfZ2VuZXJhdG9yID0gX0dlbmVyYXRlRmVhdHVyZShuYW1lPSdHZW5lcmF0ZUZlYXR1cmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcz1zZWxmLl9wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsPXNlbGYuX2RldGFpbCkKKyAgICByZXR1cm4gc2VsZi5fZmVhdHVyZV9nZW5lcmF0b3IKKworICBkZWYgX2dldF9jb25jcmV0ZV9mdW5jdGlvbihzZWxmKToKKyAgICBpZiBzZWxmLl9mZWF0dXJlX2dlbmVyYXRvcl9jb25jcmV0ZV9mdW5jdGlvbiBpcyBOb25lOgorICAgICAgc2hhcGUgPSBbMSwgc2VsZi5fc2FtcGxlc19wZXJfd2luZG93XQorICAgICAgZmcgPSBzZWxmLl9nZXRfZmVhdHVyZV9nZW5lcmF0b3IoKQorICAgICAgZnVuYyA9IHRmLmZ1bmN0aW9uKGZ1bmM9ZmcuZ2VuZXJhdGVfZmVhdHVyZV9mb3JfZnJhbWUpCisgICAgICBzZWxmLl9mZWF0dXJlX2dlbmVyYXRvcl9jb25jcmV0ZV9mdW5jdGlvbiA9IGZ1bmMuZ2V0X2NvbmNyZXRlX2Z1bmN0aW9uKAorICAgICAgICAgIHRmLlRlbnNvclNwZWMoc2hhcGU9c2hhcGUsIGR0eXBlPXRmLmludDE2KSkgICMgdHlwZTogaWdub3JlCisgICAgcmV0dXJuIHNlbGYuX2ZlYXR1cmVfZ2VuZXJhdG9yX2NvbmNyZXRlX2Z1bmN0aW9uCisKKyAgZGVmIF9nZXRfbW9kZWwoc2VsZik6CisgICAgaWYgc2VsZi5fbW9kZWwgaXMgTm9uZToKKyAgICAgIGNmID0gc2VsZi5fZ2V0X2NvbmNyZXRlX2Z1bmN0aW9uKCkKKyAgICAgIGNvbnZlcnRlciA9IHRmLmxpdGUuVEZMaXRlQ29udmVydGVyLmZyb21fY29uY3JldGVfZnVuY3Rpb25zKAorICAgICAgICAgIFtjZl0sIHNlbGYuX2dldF9mZWF0dXJlX2dlbmVyYXRvcigpKQorICAgICAgY29udmVydGVyLmFsbG93X2N1c3RvbV9vcHMgPSBUcnVlCisgICAgICBzZWxmLl9tb2RlbCA9IGNvbnZlcnRlci5jb252ZXJ0KCkKKyAgICAgIGlmIF9FTkFCTEVfREVCVUcudmFsdWUgIT0gJ29mZic6CisgICAgICAgIHRmLmxpdGUuZXhwZXJpbWVudGFsLkFuYWx5emVyLmFuYWx5emUobW9kZWxfY29udGVudD1zZWxmLl9tb2RlbCkKKyAgICByZXR1cm4gc2VsZi5fbW9kZWwKKworICBkZWYgbG9hZF9zYW1wbGVzKHNlbGYsIGZpbGVuYW1lOiBQYXRoLCB1c2Vfcm91bmRpbmc6IGJvb2wgPSBGYWxzZSk6CisgICAgIiIiCisgICAgTG9hZCBhdWRpbyBzYW1wbGVzIGZyb20gZmlsZS4KKworICAgIExvYWRzIElOVDE2IGF1ZGlvIHNhbXBsZXMgZnJvbSBhIFdBViBmaWxlLgorICAgIFN1cHBvcnRzIHNpbmdsZSBjaGFubmVsIGF0IDE2S0h6LgorICAgIFRoZSBhdWRpbyBzYW1wbGVzIGFyZSBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlICdzYW1wbGVzJyBwcm9wZXJ0eS4KKworICAgIEFyZ3M6CisgICAgICBmaWxlbmFtZTogYSBQYXRoIG9iamVjdAorICAgICAgdXNlX3JvdW5kaW5nOiBib29sLCBpZiBUcnVlLCBjb252ZXJ0IHRoZSBub3JtYWxpemVkIEZMT0FUIGRhdGEgdGhhdAorICAgICAgaGFzIGJlZW4gbG9hZGVkIGludG8gSU5UMTYsIHVzaW5nIGEgc3RhbmRhcmQgcm91bmRpbmcgYWxnb3JpdGhtLgorICAgICAgT3RoZXJ3aXNlIHVzZSBhIHNpbXBsZSBjb252ZXJzaW9uIHRvIElOVDE2LgorICAgICIiIgorICAgIGZpbGVfZGF0YSA9IHRmLmlvLnJlYWRfZmlsZShzdHIoZmlsZW5hbWUpKQorICAgIHNhbXBsZXM6IHRmLlRlbnNvcgorICAgIHNhbXBsZXMsIHNhbXBsZV9yYXRlID0gdGYuYXVkaW8uZGVjb2RlX3dhdihmaWxlX2RhdGEsIGRlc2lyZWRfY2hhbm5lbHM9MSkKKyAgICBzYW1wbGVfcmF0ZSA9IGludChzYW1wbGVfcmF0ZSkKKyAgICBfZGVidWdfcHJpbnQoZidMb2FkZWQge2ZpbGVuYW1lLm5hbWV9JworICAgICAgICAgICAgICAgICBmJyBzYW1wbGUtcmF0ZT17c2FtcGxlX3JhdGV9JworICAgICAgICAgICAgICAgICBmJyBzYW1wbGUtY291bnQ9e2xlbihzYW1wbGVzKX0nKQorICAgIGFzc2VydCBzYW1wbGVfcmF0ZSA9PSBzZWxmLl9wYXJhbXMuc2FtcGxlX3JhdGUsICdtaXNtYXRjaGVkIHNhbXBsZSByYXRlJworICAgICMgY29udmVydCBzYW1wbGVzIHRvIElOVDE2CisgICAgIyBpID0gKCgoaW50KSAoKHggKiAzMjc2NykgKyAzMjc2OC41ZikpIC0gMzI3NjgpOworICAgIG1heF92YWx1ZSA9IHRmLmR0eXBlcy5pbnQxNi5tYXgKKyAgICBtaW5fdmFsdWUgPSB0Zi5kdHlwZXMuaW50MTYubWluCisgICAgaWYgdXNlX3JvdW5kaW5nOgorICAgICAgc2FtcGxlcyA9ICgoc2FtcGxlcyAqIG1heF92YWx1ZSkgKyAoLW1pbl92YWx1ZSArIDAuNSkpICsgbWluX3ZhbHVlCisgICAgZWxzZToKKyAgICAgIHNhbXBsZXMgKj0gLW1pbl92YWx1ZQorICAgIHNhbXBsZXMgPSB0Zi5jYXN0KHNhbXBsZXMsIHRmLmludDE2KSAgIyB0eXBlOiBpZ25vcmUKKyAgICBzYW1wbGVzID0gdGYucmVzaGFwZShzYW1wbGVzLCBbMSwgLTFdKQorCisgICAgc2VsZi5fc2FtcGxlcyA9IHNhbXBsZXMKKworICBAcHJvcGVydHkKKyAgZGVmIHNhbXBsZXMoc2VsZikgLT4gdGYuVGVuc29yOgorICAgICIiIgorICAgIEF1ZGlvIFNhbXBsZXMgcHJldmlvdXNseSBkZWNvZGVkIHVzaW5nIGxvYWRfc2FtcGxlcyBtZXRob2QuCisKKyAgICBSZXR1cm5zOgorICAgICAgdGYuVGVuc29yIGNvbnRhaW5pbmcgSU5UMTYgYXVkaW8gc2FtcGxlcworICAgICIiIgorICAgIHJldHVybiBzZWxmLl9zYW1wbGVzCisKKyAgQHByb3BlcnR5CisgIGRlZiBwYXJhbXMoc2VsZikgLT4gRmVhdHVyZVBhcmFtczoKKyAgICAiIiIKKyAgICBGZWF0dXJlIFBhcmFtdGVycyBiZWluZyB1c2VkIGJ5IHRoZSBBdWRpb1ByZXByb2Nlc3NvciBvYmplY3QKKworICAgIFJldHVybnM6CisgICAgICBGZWF0dXJlUGFyYW1zIG9iamVjdCB3aGljaCBpcyBpbW11dGFibGUKKyAgICAiIiIKKyAgICByZXR1cm4gc2VsZi5fcGFyYW1zCisKKyAgZGVmIGdlbmVyYXRlX2ZlYXR1cmUoc2VsZiwgYXVkaW9fZnJhbWU6IHRmLlRlbnNvcikgLT4gdGYuVGVuc29yOgorICAgICIiIgorICAgIEdlbmVyYXRlIGEgc2luZ2xlIGZlYXR1cmUgZm9yIGEgc2luZ2xlIGF1ZGlvIGZyYW1lLiAgVXNlcyBUZW5zb3JGbG93CisgICAgZWFnZXIgZXhlY3V0aW9uLgorCisgICAgQXJnczoKKyAgICAgIGF1ZGlvX2ZyYW1lOiB0Zi5UZW5zb3IsIGEgc2luZ2xlIGF1ZGlvIGZyYW1lIChzZWxmLnBhcmFtcy53aW5kb3dfc2l6ZV9tcykKKyAgICAgIHdpdGggc2hhcGUgKDEsIGF1ZGlvX3NhbXBsZXNfY291bnQpCisKKyAgICBSZXR1cm5zOgorICAgICAgdGYuVGVuc29yLCBhIHRlbnNvciBjb250YWluaW5nIGEgc2luZ2xlIGF1ZGlvIGZlYXR1cmUgd2l0aCBzaGFwZQorICAgICAgKHNlbGYucGFyYW1zLmZpbHRlcl9iYW5rX251bWJlcl9vZl9jaGFubmVscywpCisgICAgIiIiCisgICAgZmcgPSBzZWxmLl9nZXRfZmVhdHVyZV9nZW5lcmF0b3IoKQorICAgIGZlYXR1cmUgPSBmZy5nZW5lcmF0ZV9mZWF0dXJlX2Zvcl9mcmFtZShhdWRpb19mcmFtZT1hdWRpb19mcmFtZSkKKyAgICByZXR1cm4gZmVhdHVyZQorCisgIGRlZiBnZW5lcmF0ZV9mZWF0dXJlX3VzaW5nX2dyYXBoKHNlbGYsIGF1ZGlvX2ZyYW1lOiB0Zi5UZW5zb3IpIC0+IHRmLlRlbnNvcjoKKyAgICAiIiIKKyAgICBHZW5lcmF0ZSBhIHNpbmdsZSBmZWF0dXJlIGZvciBhIHNpbmdsZSBhdWRpbyBmcmFtZS4gIFVzZXMgVGVuc29yRmxvdworICAgIGdyYXBoIGV4ZWN1dGlvbi4KKworICAgIEFyZ3M6CisgICAgICBhdWRpb19mcmFtZTogdGYuVGVuc29yLCBhIHNpbmdsZSBhdWRpbyBmcmFtZSAoc2VsZi5wYXJhbXMud2luZG93X3NpemVfbXMpCisgICAgICB3aXRoIHNoYXBlICgxLCBhdWRpb19zYW1wbGVzX2NvdW50KQorCisgICAgUmV0dXJuczoKKyAgICAgIHRmLlRlbnNvciwgYSB0ZW5zb3IgY29udGFpbmluZyBhIHNpbmdsZSBhdWRpbyBmZWF0dXJlIHdpdGggc2hhcGUKKyAgICAgIChzZWxmLnBhcmFtcy5maWx0ZXJfYmFua19udW1iZXJfb2ZfY2hhbm5lbHMsKQorICAgICIiIgorICAgIGNmID0gc2VsZi5fZ2V0X2NvbmNyZXRlX2Z1bmN0aW9uKCkKKyAgICBmZWF0dXJlOiB0Zi5UZW5zb3IgPSBjZihhdWRpb19mcmFtZT1hdWRpb19mcmFtZSkgICMgdHlwZTogaWdub3JlCisgICAgcmV0dXJuIGZlYXR1cmUKKworICBkZWYgZ2VuZXJhdGVfZmVhdHVyZV91c2luZ190ZmxtKHNlbGYsIGF1ZGlvX2ZyYW1lOiB0Zi5UZW5zb3IpIC0+IHRmLlRlbnNvcjoKKyAgICAiIiIKKyAgICBHZW5lcmF0ZSBhIHNpbmdsZSBmZWF0dXJlIGZvciBhIHNpbmdsZSBhdWRpbyBmcmFtZS4gIFVzZXMgVGVuc29yRmxvdworICAgIGdyYXBoIGV4ZWN1dGlvbiBhbmQgdGhlIFRlbnNvckZsb3cgbW9kZWwgY29udmVydGVyIHRvIGdlbmVyYXRlIGEKKyAgICBURkxNIGNvbXBhdGlibGUgbW9kZWwuICBUaGlzIG1vZGVsIGlzIHRoZW4gdXNlZCBieSB0aGUgVEZMTQorICAgIE1pY3JvSW50ZXJwcmV0ZXIgdG8gZXhlY3V0ZSBhIHNpbmdsZSBpbmZlcmVuY2Ugb3BlcmF0aW9uLgorCisgICAgQXJnczoKKyAgICAgIGF1ZGlvX2ZyYW1lOiB0Zi5UZW5zb3IsIGEgc2luZ2xlIGF1ZGlvIGZyYW1lIChzZWxmLnBhcmFtcy53aW5kb3dfc2l6ZV9tcykKKyAgICAgIHdpdGggc2hhcGUgKDEsIGF1ZGlvX3NhbXBsZXNfY291bnQpCisKKyAgICBSZXR1cm5zOgorICAgICAgdGYuVGVuc29yLCBhIHRlbnNvciBjb250YWluaW5nIGEgc2luZ2xlIGF1ZGlvIGZlYXR1cmUgd2l0aCBzaGFwZQorICAgICAgKHNlbGYucGFyYW1zLmZpbHRlcl9iYW5rX251bWJlcl9vZl9jaGFubmVscywpCisgICAgIiIiCisgICAgaWYgc2VsZi5fdGZsbV9pbnRlcnByZXRlciBpcyBOb25lOgorICAgICAgbW9kZWwgPSBzZWxmLl9nZXRfbW9kZWwoKQorICAgICAgc2VsZi5fdGZsbV9pbnRlcnByZXRlciA9IHJ1bnRpbWUuSW50ZXJwcmV0ZXIuZnJvbV9ieXRlcyhtb2RlbCkKKworICAgIHNlbGYuX3RmbG1faW50ZXJwcmV0ZXIuc2V0X2lucHV0KGF1ZGlvX2ZyYW1lLCAwKQorICAgIHNlbGYuX3RmbG1faW50ZXJwcmV0ZXIuaW52b2tlKCkKKyAgICByZXN1bHQgPSBzZWxmLl90ZmxtX2ludGVycHJldGVyLmdldF9vdXRwdXQoMCkKKyAgICByZXR1cm4gdGYuY29udmVydF90b190ZW5zb3IocmVzdWx0KQorCisgIGRlZiByZXNldF90ZmxtKHNlbGYpOgorICAgICIiIgorICAgIFJlc2V0IFRGTE0gaW50ZXJwcmV0ZXIgc3RhdGUKKworICAgIFJlLWluaXRpYWxpemVzIFRGTE0gaW50ZXJwcmV0ZXIgc3RhdGUgYW5kIHRoZSBpbnRlcm5hbCBzdGF0ZQorICAgIG9mIGFsbCBURkxNIGtlcm5lbCBvcGVyYXRvcnMuICBVc2VmdWwgZm9yIHJlc2V0dGluZyBTaWduYWwKKyAgICBsaWJyYXJ5IG9wZXJhdG9yIG5vaXNlIGVzdGltYXRpb24gYW5kIG90aGVyIGludGVybmFsIHN0YXRlLgorICAgICIiIgorICAgIGlmIHNlbGYuX3RmbG1faW50ZXJwcmV0ZXIgaXMgbm90IE5vbmU6CisgICAgICBzZWxmLl90ZmxtX2ludGVycHJldGVyLnJlc2V0KCkKKworICBkZWYgZ2VuZXJhdGVfdGZsaXRlX2ZpbGUoc2VsZikgLT4gUGF0aDoKKyAgICAiIiIKKyAgICBDcmVhdGUgYSAudGZsaXRlIG1vZGVsIGZpbGUKKworICAgIFRoZSBtb2RlbCBvdXRwdXQgdGVuc29yIHR5cGUgd2lsbCBkZXBlbmQgb24gdGhlCisgICAgJ0ZlYXR1cmVQYXJhbXMudXNlX2Zsb2F0X291dHB1dCcgcGFyYW1ldGVyLgorCisgICAgUmV0dXJuczoKKyAgICAgIFBhdGggb2JqZWN0IGZvciB0aGUgY3JlYXRlZCBtb2RlbCBmaWxlCisgICAgIiIiCisgICAgbW9kZWwgPSBzZWxmLl9nZXRfbW9kZWwoKQorICAgIGlmIHNlbGYuX3BhcmFtcy51c2VfZmxvYXRfb3V0cHV0OgorICAgICAgdHlwZV9uYW1lID0gJ2Zsb2F0JworICAgIGVsc2U6CisgICAgICB0eXBlX25hbWUgPSAnaW50OCcKKyAgICBmbmFtZSA9IFBhdGgodGVtcGZpbGUuZ2V0dGVtcGRpcigpLAorICAgICAgICAgICAgICAgICAnYXVkaW9fcHJlcHJvY2Vzc29yXycgKyB0eXBlX25hbWUgKyAnLnRmbGl0ZScpCisgICAgd2l0aCBvcGVuKGZuYW1lLCBtb2RlPSd3YicpIGFzIGZpbGVfaGFuZGxlOgorICAgICAgZmlsZV9oYW5kbGUud3JpdGUobW9kZWwpCisgICAgcmV0dXJuIGZuYW1lCisKKworZGVmIF9tYWluKF8pOgorICBwcmVmaXhfcGF0aCA9IHJlc291cmNlX2xvYWRlci5nZXRfcGF0aF90b19kYXRhZmlsZSgndGVzdGRhdGEnKQorCisgIGZuYW1lID0gX0ZJTEVfVE9fVEVTVC52YWx1ZQorICBhdWRpb18zMG1zX3BhdGggPSBQYXRoKHByZWZpeF9wYXRoLCBmJ3tmbmFtZX1fMzBtcy53YXYnKQorCisgIHVzZV9mbG9hdF9vdXRwdXQgPSBfT1VUUFVUX1RZUEUudmFsdWUgPT0gJ2Zsb2F0MzInCisgIHBhcmFtcyA9IEZlYXR1cmVQYXJhbXModXNlX2Zsb2F0X291dHB1dD11c2VfZmxvYXRfb3V0cHV0KQorICBwcCA9IEF1ZGlvUHJlcHJvY2Vzc29yKHBhcmFtcz1wYXJhbXMsIGRldGFpbD1mbmFtZSkKKworICBpZiBfRU5BQkxFX0RFQlVHLnZhbHVlICE9ICdvZmYnOgorICAgIHBwLmxvYWRfc2FtcGxlcyhhdWRpb18zMG1zX3BhdGgpCisgICAgXyA9IHBwLmdlbmVyYXRlX2ZlYXR1cmUocHAuc2FtcGxlcykKKworICBvdXRwdXRfZmlsZV9wYXRoOiBQYXRoID0gcHAuZ2VuZXJhdGVfdGZsaXRlX2ZpbGUoKQorICBwcmludCgnXG5PdXRwdXQgZmlsZTonLCBzdHIob3V0cHV0X2ZpbGVfcGF0aCksICdcbicpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgYXBwLnJ1bihfbWFpbikKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvYXVkaW9fcHJlcHJvY2Vzc29yX3Rlc3QucHkgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL2F1ZGlvX3ByZXByb2Nlc3Nvcl90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MjNhNzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL2F1ZGlvX3ByZXByb2Nlc3Nvcl90ZXN0LnB5CkBAIC0wLDAgKzEsMTAyIEBACisjIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisiIiIKK0F1ZGlvIGZlYXR1cmUgZ2VuZXJhdGlvbiB0ZXN0aW5nLCB1c2luZyB0aGUgQXVkaW9QcmVwcm9jZXNzb3IgY2xhc3MKKworUnVuOgorYmF6ZWwgYnVpbGQgdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaDphdWRpb19wcmVwcm9jZXNzb3JfdGVzdAorYmF6ZWwtYmluL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvYXVkaW9fcHJlcHJvY2Vzc29yX3Rlc3QKKyIiIgorCitmcm9tIHBhdGhsaWIgaW1wb3J0IFBhdGgKK2ltcG9ydCBmaWxlY21wCisKK2Zyb20gdGVuc29yZmxvdy5weXRob24uZnJhbWV3b3JrIGltcG9ydCB0ZXN0X3V0aWwKK2Zyb20gdGVuc29yZmxvdy5weXRob24ucGxhdGZvcm0gaW1wb3J0IHJlc291cmNlX2xvYWRlcgorZnJvbSB0ZW5zb3JmbG93LnB5dGhvbi5wbGF0Zm9ybSBpbXBvcnQgdGVzdAorCitpbXBvcnQgdGVuc29yZmxvdyBhcyB0ZgorZnJvbSB0ZmxpdGVfbWljcm8udGVuc29yZmxvdy5saXRlLm1pY3JvLmV4YW1wbGVzLm1pY3JvX3NwZWVjaCBpbXBvcnQgYXVkaW9fcHJlcHJvY2Vzc29yCisKKworY2xhc3MgQXVkaW9QcmVwcm9jZXNzb3JUZXN0KHRlc3RfdXRpbC5UZW5zb3JGbG93VGVzdENhc2UpOgorCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICBzZWxmLnNhbXBsZV9wcmVmaXhfcGF0aCA9IHJlc291cmNlX2xvYWRlci5nZXRfcGF0aF90b19kYXRhZmlsZSgndGVzdGRhdGEnKQorCisgIGRlZiB0ZXN0RmVhdHVyZUdlbmVyYXRpb24oc2VsZik6CisgICAgZmVhdHVyZV9wYXJhbXMgPSBhdWRpb19wcmVwcm9jZXNzb3IuRmVhdHVyZVBhcmFtcygpCisgICAgYXVkaW9fcHAgPSBhdWRpb19wcmVwcm9jZXNzb3IuQXVkaW9QcmVwcm9jZXNzb3IoZmVhdHVyZV9wYXJhbXMpCisgICAgd2luZG93X3NpemUgPSBpbnQoZmVhdHVyZV9wYXJhbXMud2luZG93X3NpemVfbXMgKgorICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVfcGFyYW1zLnNhbXBsZV9yYXRlIC8gMTAwMCkKKyAgICBkYXRhOiB0Zi5UZW5zb3IgPSB0Zi5yYW5kb20udW5pZm9ybShtaW52YWw9aW50KHRmLmR0eXBlcy5pbnQxNi5taW4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heHZhbD10Zi5kdHlwZXMuaW50MTYubWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZWQ9NDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGU9KDEsIHdpbmRvd19zaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT10Zi5pbnQzMikKKyAgICBkYXRhID0gdGYuY2FzdChkYXRhLCBkdHlwZT10Zi5pbnQxNikgICMgdHlwZTogaWdub3JlCisKKyAgICAjIHRlc3Qgc2lnbmFsIG9wcyBpbnRlcm5hbCBzdGF0ZSByZXRhaW5lZCBhbmQgZmVhdHVyZXMgZG8gbm90IG1hdGNoCisgICAgZmVhdHVyZV9lYWdlcjEgPSBhdWRpb19wcC5nZW5lcmF0ZV9mZWF0dXJlKGRhdGEpCisgICAgZmVhdHVyZV9lYWdlcjIgPSBhdWRpb19wcC5nZW5lcmF0ZV9mZWF0dXJlKGRhdGEpCisgICAgc2VsZi5hc3NlcnROb3RBbGxFcXVhbChmZWF0dXJlX2VhZ2VyMSwgZmVhdHVyZV9lYWdlcjIpCisKKyAgICAjIHRlc3QgZWFnZXIgdnMgZ3JhcGggZXhlY3V0aW9uIGZlYXR1cmUgbWF0Y2gKKyAgICBfID0gYXVkaW9fcHAuZ2VuZXJhdGVfZmVhdHVyZV91c2luZ19ncmFwaChkYXRhKQorICAgIGZlYXR1cmVfZ3JhcGggPSBhdWRpb19wcC5nZW5lcmF0ZV9mZWF0dXJlX3VzaW5nX2dyYXBoKGRhdGEpCisgICAgc2VsZi5hc3NlcnRBbGxFcXVhbChmZWF0dXJlX2dyYXBoLCBmZWF0dXJlX2VhZ2VyMikKKworICAgICMgdGVzdCBlYWdlciB2cyBNaWNyb0ludGVycHJldGVyIGV4ZWN1dGlvbiBmZWF0dXJlIG1hdGNoCisgICAgZmVhdHVyZV90ZmxtID0gYXVkaW9fcHAuZ2VuZXJhdGVfZmVhdHVyZV91c2luZ190ZmxtKGRhdGEpCisgICAgc2VsZi5hc3NlcnRBbGxFcXVhbChmZWF0dXJlX3RmbG0sIGZlYXR1cmVfZWFnZXIxKQorCisgICAgIyB0ZXN0IHNpZ25hbCBvcHMgaW50ZXJuYWwgc3RhdGUgcmVzZXQKKyAgICBhdWRpb19wcC5yZXNldF90ZmxtKCkKKyAgICBmZWF0dXJlX3RmbG0gPSBhdWRpb19wcC5nZW5lcmF0ZV9mZWF0dXJlX3VzaW5nX3RmbG0oZGF0YSkKKyAgICBzZWxmLmFzc2VydEFsbEVxdWFsKGZlYXR1cmVfdGZsbSwgZmVhdHVyZV9lYWdlcjEpCisKKyAgICAjIHRlc3Qgc2lnbmFsIG9wcyBpbnRlcm5hbCBzdGF0ZSByZXRhaW5lZAorICAgIGZlYXR1cmVfdGZsbSA9IGF1ZGlvX3BwLmdlbmVyYXRlX2ZlYXR1cmVfdXNpbmdfdGZsbShkYXRhKQorICAgIHNlbGYuYXNzZXJ0QWxsRXF1YWwoZmVhdHVyZV90ZmxtLCBmZWF0dXJlX2VhZ2VyMikKKworICBkZWYgdGVzdEZlYXR1cmVPdXRwdXRZZXMoc2VsZik6CisgICAgZmVhdHVyZV9wYXJhbXMgPSBhdWRpb19wcmVwcm9jZXNzb3IuRmVhdHVyZVBhcmFtcygpCisgICAgYXVkaW9fcHAgPSBhdWRpb19wcmVwcm9jZXNzb3IuQXVkaW9QcmVwcm9jZXNzb3IoZmVhdHVyZV9wYXJhbXMpCisgICAgYXVkaW9fcHAubG9hZF9zYW1wbGVzKFBhdGgoc2VsZi5zYW1wbGVfcHJlZml4X3BhdGgsICd5ZXNfMzBtcy53YXYnKSkKKyAgICBmZWF0dXJlID0gYXVkaW9fcHAuZ2VuZXJhdGVfZmVhdHVyZV91c2luZ190ZmxtKGF1ZGlvX3BwLnNhbXBsZXMpCisgICAgZmVhdHVyZV9saXN0ID0gZmVhdHVyZS5udW1weSgpLnRvbGlzdCgpCisgICAgZXhwZWN0ZWQgPSBbCisgICAgICAgIDEyNCwgMTA1LCAxMjYsIDEwMywgMTI1LCAxMDEsIDEyMywgMTAwLCAxMTYsIDk4LCAxMTUsIDk3LCAxMTMsIDkwLCA5MSwKKyAgICAgICAgODIsIDEwNCwgOTYsIDExNywgOTcsIDEyMSwgMTAzLCAxMjYsIDEwMSwgMTI1LCAxMDQsIDEyNiwgMTA0LCAxMjUsIDEwMSwKKyAgICAgICAgMTE2LCA5MCwgODEsIDc0LCA4MCwgNzEsIDgzLCA3NiwgODIsIDcxCisgICAgXQorICAgIHNlbGYuYXNzZXJ0U2VxdWVuY2VFcXVhbChmZWF0dXJlX2xpc3QsIGV4cGVjdGVkKQorCisgIGRlZiB0ZXN0RmVhdHVyZU91dHB1dE5vKHNlbGYpOgorICAgIGZlYXR1cmVfcGFyYW1zID0gYXVkaW9fcHJlcHJvY2Vzc29yLkZlYXR1cmVQYXJhbXMoKQorICAgIGF1ZGlvX3BwID0gYXVkaW9fcHJlcHJvY2Vzc29yLkF1ZGlvUHJlcHJvY2Vzc29yKGZlYXR1cmVfcGFyYW1zKQorICAgIGF1ZGlvX3BwLmxvYWRfc2FtcGxlcyhQYXRoKHNlbGYuc2FtcGxlX3ByZWZpeF9wYXRoLCAnbm9fMzBtcy53YXYnKSkKKyAgICBmZWF0dXJlID0gYXVkaW9fcHAuZ2VuZXJhdGVfZmVhdHVyZV91c2luZ190ZmxtKGF1ZGlvX3BwLnNhbXBsZXMpCisgICAgZmVhdHVyZV9saXN0ID0gZmVhdHVyZS5udW1weSgpLnRvbGlzdCgpCisgICAgZXhwZWN0ZWQgPSBbCisgICAgICAgIDEyNiwgMTAzLCAxMjQsIDEwMiwgMTI0LCAxMDIsIDEyMywgMTAwLCAxMTgsIDk3LCAxMTgsIDEwMCwgMTE4LCA5OCwKKyAgICAgICAgMTIxLCAxMDAsIDEyMSwgOTgsIDExNywgOTEsIDk2LCA3NCwgNTQsIDg3LCAxMDAsIDg3LCAxMDksIDkyLCA5MSwgODAsCisgICAgICAgIDY0LCA1NSwgODMsIDc0LCA3NCwgNzgsIDExNCwgOTUsIDEwMSwgODEKKyAgICBdCisgICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKGZlYXR1cmVfbGlzdCwgZXhwZWN0ZWQpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgdGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvYXVkaW9fcHJvdmlkZXIuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL2F1ZGlvX3Byb3ZpZGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2E0MjVkLi4wMDAwMDAwCi0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvYXVkaW9fcHJvdmlkZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAxOCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi1MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLXlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLVlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvYXVkaW9fcHJvdmlkZXIuaCIKLQotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMvbWljcm9fbW9kZWxfc2V0dGluZ3MuaCIKLQotbmFtZXNwYWNlIHsKLWludDE2X3QgZ19kdW1teV9hdWRpb19kYXRhW2tNYXhBdWRpb1NhbXBsZVNpemVdOwotaW50MzJfdCBnX2xhdGVzdF9hdWRpb190aW1lc3RhbXAgPSAwOwotfSAgLy8gbmFtZXNwYWNlCi0KLVRmTGl0ZVN0YXR1cyBHZXRBdWRpb1NhbXBsZXMoaW50IHN0YXJ0X21zLCBpbnQgZHVyYXRpb25fbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogYXVkaW9fc2FtcGxlc19zaXplLCBpbnQxNl90KiogYXVkaW9fc2FtcGxlcykgewotICBmb3IgKGludCBpID0gMDsgaSA8IGtNYXhBdWRpb1NhbXBsZVNpemU7ICsraSkgewotICAgIGdfZHVtbXlfYXVkaW9fZGF0YVtpXSA9IDA7Ci0gIH0KLSAgKmF1ZGlvX3NhbXBsZXNfc2l6ZSA9IGtNYXhBdWRpb1NhbXBsZVNpemU7Ci0gICphdWRpb19zYW1wbGVzID0gZ19kdW1teV9hdWRpb19kYXRhOwotICByZXR1cm4ga1RmTGl0ZU9rOwotfQotCi1pbnQzMl90IExhdGVzdEF1ZGlvVGltZXN0YW1wKCkgewotICBnX2xhdGVzdF9hdWRpb190aW1lc3RhbXAgKz0gMTAwOwotICByZXR1cm4gZ19sYXRlc3RfYXVkaW9fdGltZXN0YW1wOwotfQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9hdWRpb19wcm92aWRlci5oIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9hdWRpb19wcm92aWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkM2FhYjJjLi4wMDAwMDAwCi0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvYXVkaW9fcHJvdmlkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDE4IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoteW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0jaWZuZGVmIFRFTlNPUkZMT1dfTElURV9NSUNST19FWEFNUExFU19NSUNST19TUEVFQ0hfQVVESU9fUFJPVklERVJfSF8KLSNkZWZpbmUgVEVOU09SRkxPV19MSVRFX01JQ1JPX0VYQU1QTEVTX01JQ1JPX1NQRUVDSF9BVURJT19QUk9WSURFUl9IXwotCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2MvY29tbW9uLmgiCi0KLS8vIFRoaXMgaXMgYW4gYWJzdHJhY3Rpb24gYXJvdW5kIGFuIGF1ZGlvIHNvdXJjZSBsaWtlIGEgbWljcm9waG9uZSwgYW5kIGlzCi0vLyBleHBlY3RlZCB0byByZXR1cm4gMTYtYml0IFBDTSBzYW1wbGUgZGF0YSBmb3IgYSBnaXZlbiBwb2ludCBpbiB0aW1lLiBUaGUKLS8vIHNhbXBsZSBkYXRhIGl0c2VsZiBzaG91bGQgYmUgdXNlZCBhcyBxdWlja2x5IGFzIHBvc3NpYmxlIGJ5IHRoZSBjYWxsZXIsIHNpbmNlCi0vLyB0byBhbGxvdyBtZW1vcnkgb3B0aW1pemF0aW9ucyB0aGVyZSBhcmUgbm8gZ3VhcmFudGVlcyB0aGF0IHRoZSBzYW1wbGVzIHdvbid0Ci0vLyBiZSBvdmVyd3JpdHRlbiBieSBuZXcgZGF0YSBpbiB0aGUgZnV0dXJlLiBJbiBwcmFjdGljZSwgaW1wbGVtZW50YXRpb25zIHNob3VsZAotLy8gZW5zdXJlIHRoYXQgdGhlcmUncyBhIHJlYXNvbmFibGUgdGltZSBhbGxvd2VkIGZvciBjbGllbnRzIHRvIGFjY2VzcyB0aGUgZGF0YQotLy8gYmVmb3JlIGFueSByZXVzZS4KLS8vIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gY2FuIGhhdmUgbm8gcGxhdGZvcm0tc3BlY2lmaWMgZGVwZW5kZW5jaWVzLCBzbwotLy8gaXQganVzdCByZXR1cm5zIGFuIGFycmF5IGZpbGxlZCB3aXRoIHplcm9zLiBGb3IgcmVhbCBhcHBsaWNhdGlvbnMsIHlvdSBzaG91bGQKLS8vIGVuc3VyZSB0aGVyZSdzIGEgc3BlY2lhbGl6ZWQgaW1wbGVtZW50YXRpb24gdGhhdCBhY2Nlc3NlcyBoYXJkd2FyZSBBUElzLgotVGZMaXRlU3RhdHVzIEdldEF1ZGlvU2FtcGxlcyhpbnQgc3RhcnRfbXMsIGludCBkdXJhdGlvbl9tcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBhdWRpb19zYW1wbGVzX3NpemUsIGludDE2X3QqKiBhdWRpb19zYW1wbGVzKTsKLQotLy8gUmV0dXJucyB0aGUgdGltZSB0aGF0IGF1ZGlvIGRhdGEgd2FzIGxhc3QgY2FwdHVyZWQgaW4gbWlsbGlzZWNvbmRzLiBUaGVyZSdzCi0vLyBubyBjb250cmFjdCBhYm91dCB3aGF0IHRpbWUgemVybyByZXByZXNlbnRzLCB0aGUgYWNjdXJhY3ksIG9yIHRoZSBncmFudWxhcml0eQotLy8gb2YgdGhlIHJlc3VsdC4gU3Vic2VxdWVudCBjYWxscyB3aWxsIGdlbmVyYWxseSBub3QgcmV0dXJuIGEgbG93ZXIgdmFsdWUsIGJ1dAotLy8gZXZlbiB0aGF0J3Mgbm90IGd1YXJhbnRlZWQgaWYgdGhlcmUncyBhbiBvdmVyZmxvdyB3cmFwYXJvdW5kLgotLy8gVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGp1c3QgcmV0dXJucyBhIGNvbnN0YW50bHkKLS8vIGluY3JlbWVudGluZyB2YWx1ZSBmb3IgZWFjaCBjYWxsLCBzaW5jZSBpdCB3b3VsZCBuZWVkIGEgbm9uLXBvcnRhYmxlIHBsYXRmb3JtCi0vLyBjYWxsIHRvIGFjY2VzcyB0aW1lIGluZm9ybWF0aW9uLiBGb3IgcmVhbCBhcHBsaWNhdGlvbnMsIHlvdSdsbCBuZWVkIHRvIHdyaXRlCi0vLyB5b3VyIG93biBwbGF0Zm9ybS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbi4KLWludDMyX3QgTGF0ZXN0QXVkaW9UaW1lc3RhbXAoKTsKLQotI2VuZGlmICAvLyBURU5TT1JGTE9XX0xJVEVfTUlDUk9fRVhBTVBMRVNfTUlDUk9fU1BFRUNIX0FVRElPX1BST1ZJREVSX0hfCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL2F1ZGlvX3Byb3ZpZGVyX21vY2suY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL2F1ZGlvX3Byb3ZpZGVyX21vY2suY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlM2FkMTYuLjAwMDAwMDAKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9hdWRpb19wcm92aWRlcl9tb2NrLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMTggVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci15b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL2F1ZGlvX3Byb3ZpZGVyLmgiCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlcy9taWNyb19tb2RlbF9zZXR0aW5ncy5oIgotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvdGVzdGRhdGEvbm9fMTAwMG1zX2F1ZGlvX2RhdGEuaCIKLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3Rlc3RkYXRhL3llc18xMDAwbXNfYXVkaW9fZGF0YS5oIgotCi1uYW1lc3BhY2UgewotaW50MTZfdCBnX2R1bW15X2F1ZGlvX2RhdGFba01heEF1ZGlvU2FtcGxlU2l6ZV07Ci1pbnQzMl90IGdfbGF0ZXN0X2F1ZGlvX3RpbWVzdGFtcCA9IDA7Ci19ICAvLyBuYW1lc3BhY2UKLQotVGZMaXRlU3RhdHVzIEdldEF1ZGlvU2FtcGxlcyhpbnQgc3RhcnRfbXMsIGludCBkdXJhdGlvbl9tcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBhdWRpb19zYW1wbGVzX3NpemUsIGludDE2X3QqKiBhdWRpb19zYW1wbGVzKSB7Ci0gIGNvbnN0IGludCB5ZXNfc3RhcnQgPSAoMCAqIGtBdWRpb1NhbXBsZUZyZXF1ZW5jeSkgLyAxMDAwOwotICBjb25zdCBpbnQgeWVzX2VuZCA9ICgxMDAwICoga0F1ZGlvU2FtcGxlRnJlcXVlbmN5KSAvIDEwMDA7Ci0gIGNvbnN0IGludCBub19zdGFydCA9ICg0MDAwICoga0F1ZGlvU2FtcGxlRnJlcXVlbmN5KSAvIDEwMDA7Ci0gIGNvbnN0IGludCBub19lbmQgPSAoNTAwMCAqIGtBdWRpb1NhbXBsZUZyZXF1ZW5jeSkgLyAxMDAwOwotICBjb25zdCBpbnQgd3JhcGFyb3VuZCA9ICg4MDAwICoga0F1ZGlvU2FtcGxlRnJlcXVlbmN5KSAvIDEwMDA7Ci0gIGNvbnN0IGludCBzdGFydF9zYW1wbGUgPSAoc3RhcnRfbXMgKiBrQXVkaW9TYW1wbGVGcmVxdWVuY3kpIC8gMTAwMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTWF4QXVkaW9TYW1wbGVTaXplOyArK2kpIHsKLSAgICBjb25zdCBpbnQgc2FtcGxlX2luZGV4ID0gKHN0YXJ0X3NhbXBsZSArIGkpICUgd3JhcGFyb3VuZDsKLSAgICBpbnQxNl90IHNhbXBsZTsKLSAgICBpZiAoKHNhbXBsZV9pbmRleCA+PSB5ZXNfc3RhcnQpICYmIChzYW1wbGVfaW5kZXggPCB5ZXNfZW5kKSkgewotICAgICAgc2FtcGxlID0gZ195ZXNfMTAwMG1zX2F1ZGlvX2RhdGFbc2FtcGxlX2luZGV4IC0geWVzX3N0YXJ0XTsKLSAgICB9IGVsc2UgaWYgKChzYW1wbGVfaW5kZXggPj0gbm9fc3RhcnQpICYmIChzYW1wbGVfaW5kZXggPCBub19lbmQpKSB7Ci0gICAgICBzYW1wbGUgPSBnX25vXzEwMDBtc19hdWRpb19kYXRhW3NhbXBsZV9pbmRleCAtIG5vX3N0YXJ0XTsKLSAgICB9IGVsc2UgewotICAgICAgc2FtcGxlID0gMDsKLSAgICB9Ci0gICAgZ19kdW1teV9hdWRpb19kYXRhW2ldID0gc2FtcGxlOwotICB9Ci0gICphdWRpb19zYW1wbGVzX3NpemUgPSBrTWF4QXVkaW9TYW1wbGVTaXplOwotICAqYXVkaW9fc2FtcGxlcyA9IGdfZHVtbXlfYXVkaW9fZGF0YTsKLSAgcmV0dXJuIGtUZkxpdGVPazsKLX0KLQotaW50MzJfdCBMYXRlc3RBdWRpb1RpbWVzdGFtcCgpIHsKLSAgZ19sYXRlc3RfYXVkaW9fdGltZXN0YW1wICs9IDEwMDsKLSAgcmV0dXJuIGdfbGF0ZXN0X2F1ZGlvX3RpbWVzdGFtcDsKLX0KZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvYXVkaW9fcHJvdmlkZXJfbW9ja190ZXN0LmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9hdWRpb19wcm92aWRlcl9tb2NrX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxNTc0OWUuLjAwMDAwMDAKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9hdWRpb19wcm92aWRlcl9tb2NrX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAxOCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi1MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLXlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLVlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotI2luY2x1ZGUgPGxpbWl0cz4KLQotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9jL2NvbW1vbi5oIgotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvYXVkaW9fcHJvdmlkZXIuaCIKLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzL21pY3JvX21vZGVsX3NldHRpbmdzLmgiCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC90ZXN0ZGF0YS9ub18xMDAwbXNfYXVkaW9fZGF0YS5oIgotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvdGVzdGRhdGEveWVzXzEwMDBtc19hdWRpb19kYXRhLmgiCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL3Rlc3RpbmcvbWljcm9fdGVzdC5oIgotCi1URl9MSVRFX01JQ1JPX1RFU1RTX0JFR0lOCi0KLVRGX0xJVEVfTUlDUk9fVEVTVChUZXN0QXVkaW9Qcm92aWRlck1vY2spIHsKLSAgaW50IGF1ZGlvX3NhbXBsZXNfc2l6ZSA9IDA7Ci0gIGludDE2X3QqIGF1ZGlvX3NhbXBsZXMgPSBudWxscHRyOwotICBUZkxpdGVTdGF0dXMgZ2V0X3N0YXR1cyA9IEdldEF1ZGlvU2FtcGxlcygKLSAgICAgIDAsIGtGZWF0dXJlU2xpY2VEdXJhdGlvbk1zLCAmYXVkaW9fc2FtcGxlc19zaXplLCAmYXVkaW9fc2FtcGxlcyk7Ci0gIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKGtUZkxpdGVPaywgZ2V0X3N0YXR1cyk7Ci0gIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0xFKGF1ZGlvX3NhbXBsZXNfc2l6ZSwga01heEF1ZGlvU2FtcGxlU2l6ZSk7Ci0gIFRGX0xJVEVfTUlDUk9fRVhQRUNUKGF1ZGlvX3NhbXBsZXMgIT0gbnVsbHB0cik7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgYXVkaW9fc2FtcGxlc19zaXplOyArK2kpIHsKLSAgICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUShnX3llc18xMDAwbXNfYXVkaW9fZGF0YVtpXSwgYXVkaW9fc2FtcGxlc1tpXSk7Ci0gIH0KLQotICBnZXRfc3RhdHVzID0gR2V0QXVkaW9TYW1wbGVzKDUwMCwga0ZlYXR1cmVTbGljZUR1cmF0aW9uTXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1ZGlvX3NhbXBsZXNfc2l6ZSwgJmF1ZGlvX3NhbXBsZXMpOwotICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUShrVGZMaXRlT2ssIGdldF9zdGF0dXMpOwotICBURl9MSVRFX01JQ1JPX0VYUEVDVF9MRShhdWRpb19zYW1wbGVzX3NpemUsIGtNYXhBdWRpb1NhbXBsZVNpemUpOwotICBURl9MSVRFX01JQ1JPX0VYUEVDVChhdWRpb19zYW1wbGVzICE9IG51bGxwdHIpOwotICBmb3IgKGludCBpID0gMDsgaSA8IGF1ZGlvX3NhbXBsZXNfc2l6ZTsgKytpKSB7Ci0gICAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoZ195ZXNfMTAwMG1zX2F1ZGlvX2RhdGFbaSArIDgwMDBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NhbXBsZXNbaV0pOwotICB9Ci0KLSAgZ2V0X3N0YXR1cyA9IEdldEF1ZGlvU2FtcGxlcygxNTAwLCBrRmVhdHVyZVNsaWNlRHVyYXRpb25NcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXVkaW9fc2FtcGxlc19zaXplLCAmYXVkaW9fc2FtcGxlcyk7Ci0gIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKGtUZkxpdGVPaywgZ2V0X3N0YXR1cyk7Ci0gIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0xFKGF1ZGlvX3NhbXBsZXNfc2l6ZSwga01heEF1ZGlvU2FtcGxlU2l6ZSk7Ci0gIFRGX0xJVEVfTUlDUk9fRVhQRUNUKGF1ZGlvX3NhbXBsZXMgIT0gbnVsbHB0cik7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgYXVkaW9fc2FtcGxlc19zaXplOyArK2kpIHsKLSAgICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUSgwLCBhdWRpb19zYW1wbGVzW2ldKTsKLSAgfQotCi0gIGdldF9zdGF0dXMgPSBHZXRBdWRpb1NhbXBsZXMoMTIyNTAsIGtGZWF0dXJlU2xpY2VEdXJhdGlvbk1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhdWRpb19zYW1wbGVzX3NpemUsICZhdWRpb19zYW1wbGVzKTsKLSAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoa1RmTGl0ZU9rLCBnZXRfc3RhdHVzKTsKLSAgVEZfTElURV9NSUNST19FWFBFQ1RfTEUoYXVkaW9fc2FtcGxlc19zaXplLCBrTWF4QXVkaW9TYW1wbGVTaXplKTsKLSAgVEZfTElURV9NSUNST19FWFBFQ1QoYXVkaW9fc2FtcGxlcyAhPSBudWxscHRyKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdWRpb19zYW1wbGVzX3NpemU7ICsraSkgewotICAgIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKGdfbm9fMTAwMG1zX2F1ZGlvX2RhdGFbaSArIDQwMDBdLCBhdWRpb19zYW1wbGVzW2ldKTsKLSAgfQotfQotCi1URl9MSVRFX01JQ1JPX1RFU1RTX0VORApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9hdWRpb19wcm92aWRlcl90ZXN0LmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9hdWRpb19wcm92aWRlcl90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjQwM2MwLi4wMDAwMDAwCi0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvYXVkaW9fcHJvdmlkZXJfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDIyIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoteW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9hdWRpb19wcm92aWRlci5oIgotCi0jaW5jbHVkZSA8bGltaXRzPgotCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2MvY29tbW9uLmgiCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlcy9taWNyb19tb2RlbF9zZXR0aW5ncy5oIgotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0aW5nL21pY3JvX3Rlc3QuaCIKLQotVEZfTElURV9NSUNST19URVNUU19CRUdJTgotCi1URl9MSVRFX01JQ1JPX1RFU1QoVGVzdEF1ZGlvUHJvdmlkZXIpIHsKLSAgaW50IGF1ZGlvX3NhbXBsZXNfc2l6ZSA9IDA7Ci0gIGludDE2X3QqIGF1ZGlvX3NhbXBsZXMgPSBudWxscHRyOwotICBUZkxpdGVTdGF0dXMgZ2V0X3N0YXR1cyA9IEdldEF1ZGlvU2FtcGxlcygKLSAgICAgIDAsIGtGZWF0dXJlU2xpY2VEdXJhdGlvbk1zLCAmYXVkaW9fc2FtcGxlc19zaXplLCAmYXVkaW9fc2FtcGxlcyk7Ci0gIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKGtUZkxpdGVPaywgZ2V0X3N0YXR1cyk7Ci0gIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0xFKGF1ZGlvX3NhbXBsZXNfc2l6ZSwga01heEF1ZGlvU2FtcGxlU2l6ZSk7Ci0gIFRGX0xJVEVfTUlDUk9fRVhQRUNUKGF1ZGlvX3NhbXBsZXMgIT0gbnVsbHB0cik7Ci0KLSAgLy8gTWFrZSBzdXJlIHdlIGNhbiByZWFkIGFsbCBvZiB0aGUgcmV0dXJuZWQgbWVtb3J5IGxvY2F0aW9ucy4KLSAgaW50IHRvdGFsID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBhdWRpb19zYW1wbGVzX3NpemU7ICsraSkgewotICAgIHRvdGFsICs9IGF1ZGlvX3NhbXBsZXNbaV07Ci0gIH0KLSAgKHZvaWQpdG90YWw7Ci19Ci0KLVRGX0xJVEVfTUlDUk9fVEVTVChUZXN0VGltZXIpIHsKLSAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHRlY2huaWNhbGx5LXVuZGVmaW5lZCBvdmVyZmxvdyBiZWhhdmlvciB3ZSByZWx5IG9uIGJlbG93Ci0gIC8vIHdvcmtzIG9uIHRoaXMgcGxhdGZvcm0uIEl0J3Mgc3RpbGwgbm90IGd1YXJhbnRlZWQsIGJ1dCBhdCBsZWFzdCB0aGlzIGlzIGEKLSAgLy8gc21va2UgY2hlY2suICBUdXJuIG9mZiB3aGVuIHJ1bm5pbmcgd2l0aCBBU2FuLCBhcyBpdCB3aWxsIGNvbXBsYWluIGFib3V0Ci0gIC8vIHRoZSBmb2xsb3dpbmcgdW5kZWZpbmVkIGJlaGF2aW9yLgotI2lmbmRlZiBBRERSRVNTX1NBTklUSVpFUgotICBpbnQzMl90IG92ZXJmbG93X3ZhbHVlID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KCk7Ci0gIG92ZXJmbG93X3ZhbHVlICs9IDE7Ci0gIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbigpLCBvdmVyZmxvd192YWx1ZSk7Ci0jZW5kaWYKLQotICBjb25zdCBpbnQzMl90IGZpcnN0X3RpbWUgPSBMYXRlc3RBdWRpb1RpbWVzdGFtcCgpOwotICBjb25zdCBpbnQzMl90IHNlY29uZF90aW1lID0gTGF0ZXN0QXVkaW9UaW1lc3RhbXAoKTsKLQotICAvLyBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlIHRpbWVyIG1heSBoYXZlIHdyYXBwZWQgYXJvdW5kIGZyb20gK0JJR19OVU0gdG8KLSAgLy8gLUJJR19OVU0gYmV0d2VlbiB0aGUgZmlyc3QgYW5kIHNlY29uZCBjYWxscywgc2luY2Ugd2UncmUgc3RvcmluZwotICAvLyBtaWxsaXNlY29uZHMgaW4gYSAzMi1iaXQgaW50ZWdlci4gSXQncyBub3QgcmVhc29uYWJsZSB0aGF0IHRoZSBjYWxsIGl0c2VsZgotICAvLyB3b3VsZCBoYXZlIHRha2VuIG1vcmUgdGhhbiAyXjMxIG1pbGxpc2Vjb25kcyB0aG91Z2gsIHNvIGxvb2sgYXQgdGhlCi0gIC8vIGRpZmZlcmVuY2UgYW5kIHJlbHkgb24gaW50ZWdlciBvdmVyZmxvdyB0byBlbnN1cmUgaXQncyBhY2N1cmF0ZS4KLSAgY29uc3QgaW50MzJfdCB0aW1lX2RlbHRhID0gKHNlY29uZF90aW1lIC0gZmlyc3RfdGltZSk7Ci0gIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0xFKDAsIHRpbWVfZGVsdGEpOwotfQotCi1URl9MSVRFX01JQ1JPX1RFU1RTX0VORApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9jb21tYW5kX3Jlc3BvbmRlci5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvY29tbWFuZF9yZXNwb25kZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxODQ0NzguLjAwMDAwMDAKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9jb21tYW5kX3Jlc3BvbmRlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDE5IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoteW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9jb21tYW5kX3Jlc3BvbmRlci5oIgotCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2xvZy5oIgotCi0vLyBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB3cml0ZXMgb3V0IHRoZSBuYW1lIG9mIHRoZSByZWNvZ25pemVkIGNvbW1hbmQKLS8vIHRvIHRoZSBlcnJvciBjb25zb2xlLiBSZWFsIGFwcGxpY2F0aW9ucyB3aWxsIHdhbnQgdG8gdGFrZSBzb21lIGN1c3RvbQotLy8gYWN0aW9uIGluc3RlYWQsIGFuZCBzaG91bGQgaW1wbGVtZW50IHRoZWlyIG93biB2ZXJzaW9ucyBvZiB0aGlzIGZ1bmN0aW9uLgotdm9pZCBSZXNwb25kVG9Db21tYW5kKGludDMyX3QgY3VycmVudF90aW1lLCBjb25zdCBjaGFyKiBmb3VuZF9jb21tYW5kLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2NvcmUsIGJvb2wgaXNfbmV3X2NvbW1hbmQpIHsKLSAgaWYgKGlzX25ld19jb21tYW5kKSB7Ci0gICAgTWljcm9QcmludGYoIkhlYXJkICVzICglZCkgQCVkbXMiLCBmb3VuZF9jb21tYW5kLCBzY29yZSwgY3VycmVudF90aW1lKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9jb21tYW5kX3Jlc3BvbmRlci5oIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9jb21tYW5kX3Jlc3BvbmRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWFjYjk5Li4wMDAwMDAwCi0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvY29tbWFuZF9yZXNwb25kZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDE5IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoteW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0vLyBQcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gdGFrZSBhbiBhY3Rpb24gYmFzZWQgb24gYW4gYXVkaW8gY29tbWFuZC4KLQotI2lmbmRlZiBURU5TT1JGTE9XX0xJVEVfTUlDUk9fRVhBTVBMRVNfTUlDUk9fU1BFRUNIX0NPTU1BTkRfUkVTUE9OREVSX0hfCi0jZGVmaW5lIFRFTlNPUkZMT1dfTElURV9NSUNST19FWEFNUExFU19NSUNST19TUEVFQ0hfQ09NTUFORF9SRVNQT05ERVJfSF8KLQotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9jL2NvbW1vbi5oIgotCi0vLyBDYWxsZWQgZXZlcnkgdGltZSB0aGUgcmVzdWx0cyBvZiBhbiBhdWRpbyByZWNvZ25pdGlvbiBydW4gYXJlIGF2YWlsYWJsZS4gVGhlCi0vLyBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIGFueSByZWNvZ25pemVkIGNvbW1hbmQgaXMgaW4gdGhlIGBmb3VuZF9jb21tYW5kYAotLy8gYXJndW1lbnQsIGBzY29yZWAgaGFzIHRoZSBudW1lcmljYWwgY29uZmlkZW5jZSwgYW5kIGBpc19uZXdfY29tbWFuZGAgaXMgc2V0Ci0vLyBpZiB0aGUgcHJldmlvdXMgY29tbWFuZCB3YXMgZGlmZmVyZW50IHRvIHRoaXMgb25lLgotdm9pZCBSZXNwb25kVG9Db21tYW5kKGludDMyX3QgY3VycmVudF90aW1lLCBjb25zdCBjaGFyKiBmb3VuZF9jb21tYW5kLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgc2NvcmUsIGJvb2wgaXNfbmV3X2NvbW1hbmQpOwotCi0jZW5kaWYgIC8vIFRFTlNPUkZMT1dfTElURV9NSUNST19FWEFNUExFU19NSUNST19TUEVFQ0hfQ09NTUFORF9SRVNQT05ERVJfSF8KZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvY29tbWFuZF9yZXNwb25kZXJfdGVzdC5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvY29tbWFuZF9yZXNwb25kZXJfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTAyZjdhZS4uMDAwMDAwMAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL2NvbW1hbmRfcmVzcG9uZGVyX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAxOSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi1MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLXlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLVlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvY29tbWFuZF9yZXNwb25kZXIuaCIKLQotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0aW5nL21pY3JvX3Rlc3QuaCIKLQotVEZfTElURV9NSUNST19URVNUU19CRUdJTgotCi1URl9MSVRFX01JQ1JPX1RFU1QoVGVzdENhbGxhYmlsaXR5KSB7Ci0gIC8vIFRoaXMgd2lsbCBoYXZlIGV4dGVybmFsIHNpZGUtZWZmZWN0cyAobGlrZSBwcmludGluZyB0byB0aGUgZGVidWcgY29uc29sZQotICAvLyBvciBsaWdodGluZyBhbiBMRUQpIHRoYXQgYXJlIGhhcmQgdG8gb2JzZXJ2ZSwgc28gdGhlIG1vc3Qgd2UgY2FuIGRvIGlzCi0gIC8vIG1ha2Ugc3VyZSB0aGUgY2FsbCBkb2Vzbid0IGNyYXNoLgotICBSZXNwb25kVG9Db21tYW5kKDAsICJmb28iLCAwLCB0cnVlKTsKLX0KLQotVEZfTElURV9NSUNST19URVNUU19FTkQKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvZXZhbHVhdGUucHkgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL2V2YWx1YXRlLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZjc0YjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL2V2YWx1YXRlLnB5CkBAIC0wLDAgKzEsMjAzIEBACisjIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisiIiIKK1dha2Utd29yZCBtb2RlbCBldmFsdWF0aW9uLCB3aXRoIGF1ZGlvIHByZXByb2Nlc3NpbmcgdXNpbmcgTWljcm9JbnRlcnByZXRlcgorCitSdW46CitiYXplbCBidWlsZCB0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoOmV2YWx1YXRlCitiYXplbC1iaW4vdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9ldmFsdWF0ZQorICAtLXNhbXBsZV9wYXRoPSJwYXRoIHRvIDEgc2Vjb25kIGF1ZGlvIHNhbXBsZSBpbiBXQVYgZm9ybWF0IgorIiIiCisKK2Zyb20gYWJzbCBpbXBvcnQgYXBwCitmcm9tIGFic2wgaW1wb3J0IGZsYWdzCitpbXBvcnQgbnVtcHkgYXMgbnAKK2Zyb20gcGF0aGxpYiBpbXBvcnQgUGF0aAorCitmcm9tIHRmbGl0ZV9taWNyby5weXRob24udGZsaXRlX21pY3JvIGltcG9ydCBydW50aW1lCitmcm9tIHRlbnNvcmZsb3cucHl0aG9uLnBsYXRmb3JtIGltcG9ydCByZXNvdXJjZV9sb2FkZXIKK2ltcG9ydCB0ZW5zb3JmbG93IGFzIHRmCitmcm9tIHRmbGl0ZV9taWNyby50ZW5zb3JmbG93LmxpdGUubWljcm8uZXhhbXBsZXMubWljcm9fc3BlZWNoIGltcG9ydCBhdWRpb19wcmVwcm9jZXNzb3IKKworX1NBTVBMRV9QQVRIID0gZmxhZ3MuREVGSU5FX3N0cmluZygKKyAgICBuYW1lPSdzYW1wbGVfcGF0aCcsCisgICAgZGVmYXVsdD0nJywKKyAgICBoZWxwPSdwYXRoIGZvciB0aGUgYXVkaW8gc2FtcGxlIHRvIGJlIHByZWRpY3RlZC4nLAorKQorCitfRkVBVFVSRVNfU0hBUEUgPSAoNDksIDQwKQorCisKK2RlZiBxdWFudGl6ZV9pbnB1dF9kYXRhKGRhdGEsIGlucHV0X2RldGFpbHMpOgorICAiIiJxdWFudGl6ZSB0aGUgaW5wdXQgZGF0YSB1c2luZyBzY2FsZSBhbmQgemVybyBwb2ludAorCisgIEFyZ3M6CisgICAgICBkYXRhIChucC5hcnJheSBpbiBmbG9hdCk6IGlucHV0IGRhdGEgZm9yIHRoZSBpbnRlcnByZXRlcgorICAgICAgaW5wdXRfZGV0YWlscyA6IG91dHB1dCBvZiBnZXRfaW5wdXRfZGV0YWlscyBmcm9tIHRoZSB0ZmxtIGludGVycHJldGVyLgorCisgIFJldHVybnM6CisgICAgbnAubmRhcnJheTogcXVhbnRpemVkIGRhdGEgYXMgaW50OCBkdHlwZQorICAiIiIKKyAgIyBHZXQgaW5wdXQgcXVhbnRpemF0aW9uIHBhcmFtZXRlcnMKKyAgZGF0YV90eXBlID0gaW5wdXRfZGV0YWlsc1snZHR5cGUnXQorICBpbnB1dF9xdWFudGl6YXRpb25fcGFyYW1ldGVycyA9IGlucHV0X2RldGFpbHNbJ3F1YW50aXphdGlvbl9wYXJhbWV0ZXJzJ10KKyAgaW5wdXRfc2NhbGUsIGlucHV0X3plcm9fcG9pbnQgPSBpbnB1dF9xdWFudGl6YXRpb25fcGFyYW1ldGVyc1snc2NhbGVzJ11bCisgICAgICAwXSwgaW5wdXRfcXVhbnRpemF0aW9uX3BhcmFtZXRlcnNbJ3plcm9fcG9pbnRzJ11bMF0KKyAgIyBxdWFudGl6ZSB0aGUgaW5wdXQgZGF0YQorICBkYXRhID0gZGF0YSAvIGlucHV0X3NjYWxlICsgaW5wdXRfemVyb19wb2ludAorICByZXR1cm4gZGF0YS5hc3R5cGUoZGF0YV90eXBlKQorCisKK2RlZiBkZXF1YW50aXplX291dHB1dF9kYXRhKGRhdGE6IG5wLm5kYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGV0YWlsczogZGljdCkgLT4gbnAubmRhcnJheToKKyAgIiIiRGVxdWFudGl6ZSB0aGUgbW9kZWwgb3V0cHV0CisKKyAgQXJnczoKKyAgICAgIGRhdGE6IGludGVnZXIgZGF0YSB0byBiZSBkZXF1YW50aXplZAorICAgICAgb3V0cHV0X2RldGFpbHM6IFRGTE0gaW50ZXJwcmV0ZXIgbW9kZWwgb3V0cHV0IGRldGFpbHMKKworICBSZXR1cm5zOgorICAgICAgbnAubmRhcnJheTogZGVxdWFudGl6ZWQgZGF0YSBhcyBmbG9hdDMyIGR0eXBlCisgICIiIgorICBvdXRwdXRfcXVhbnRpemF0aW9uX3BhcmFtZXRlcnMgPSBvdXRwdXRfZGV0YWlsc1sncXVhbnRpemF0aW9uX3BhcmFtZXRlcnMnXQorICBvdXRwdXRfc2NhbGUgPSBvdXRwdXRfcXVhbnRpemF0aW9uX3BhcmFtZXRlcnNbJ3NjYWxlcyddWzBdCisgIG91dHB1dF96ZXJvX3BvaW50ID0gb3V0cHV0X3F1YW50aXphdGlvbl9wYXJhbWV0ZXJzWyd6ZXJvX3BvaW50cyddWzBdCisgICMgQ2F2ZWF0OiB0ZmxtX291dHB1dF9xdWFudCBuZWVkIHRvIGJlIGNvbnZlcnRlZCB0byBmbG9hdCB0byBhdm9pZCBpbnRlZ2VyCisgICMgb3ZlcmZsb3cgZHVyaW5nIGRlcXVhbnRpemF0aW9uCisgICMgZS5nLiwgKHRmbG1fb3V0cHV0X3F1YW50IC1vdXRwdXRfemVyb19wb2ludCkgYW5kCisgICMgKHRmbG1fb3V0cHV0X3F1YW50ICsgKC1vdXRwdXRfemVyb19wb2ludCkpCisgICMgY2FuIHByb2R1Y2UgZGlmZmVyZW50IHJlc3VsdHMgKGludDggY2FsY3VsYXRpb24pCisgIHJldHVybiBvdXRwdXRfc2NhbGUgKiAoZGF0YS5hc3R5cGUobnAuZmxvYXQzMikgLSBvdXRwdXRfemVyb19wb2ludCkKKworCitkZWYgcHJlZGljdChpbnRlcnByZXRlcjogcnVudGltZS5JbnRlcnByZXRlciwKKyAgICAgICAgICAgIGZlYXR1cmVzOiBucC5uZGFycmF5KSAtPiBucC5uZGFycmF5OgorICAiIiIKKyAgVXNlIFRGTE0gaW50ZXJwcmV0ZXIgdG8gcHJlZGljdCB3YWtlLXdvcmQgZnJvbSBhdWRpbyBzYW1wbGUgZmVhdHVyZXMKKworICBBcmdzOgorICAgICAgaW50ZXJwcmV0ZXI6IFRGTE0gcHl0aG9uIGludGVycHJldGVyIGluc3RhbmNlCisgICAgICBmZWF0dXJlczogd2FrZS13b3JkIG1vZGVsIGZlYXR1cmUgZGF0YSwgd2l0aCBzaGFwZSBfRkVBVFVSRVNfU0hBUEUKKworICBSZXR1cm5zOgorICAgICAgbnAubmRhcnJheTogcHJlZGljdGVkIHByb2JhYmlsaXR5IChzb2Z0bWF4KSBmb3IgZWFjaCBtb2RlbCBjYXRlZ29yeQorICAiIiIKKworICBpbnB1dF9kZXRhaWxzID0gaW50ZXJwcmV0ZXIuZ2V0X2lucHV0X2RldGFpbHMoMCkKKyAgIyBRdWFudGl6ZSB0aGUgaW5wdXQgaWYgdGhlIG1vZGVsIGlzIHF1YW50aXplZAorICAjIGFuZCBvdXIgZmVhdHVyZXMgYXJlIG5wLmZsb2F0MzIKKyAgaWYgaW5wdXRfZGV0YWlsc1snZHR5cGUnXSAhPSBucC5mbG9hdDMyIGFuZCBmZWF0dXJlcy5kdHlwZSA9PSBucC5mbG9hdDMyOgorICAgIGZlYXR1cmVzID0gcXVhbnRpemVfaW5wdXRfZGF0YShmZWF0dXJlcywgaW5wdXRfZGV0YWlscykKKyAgZmxhdHRlbmVkX2ZlYXR1cmVzID0gZmVhdHVyZXMuZmxhdHRlbigpLnJlc2hhcGUoWzEsIC0xXSkKKyAgaW50ZXJwcmV0ZXIuc2V0X2lucHV0KGZsYXR0ZW5lZF9mZWF0dXJlcywgMCkKKyAgaW50ZXJwcmV0ZXIuaW52b2tlKCkKKyAgdGZsbV9vdXRwdXQgPSBpbnRlcnByZXRlci5nZXRfb3V0cHV0KDApCisKKyAgb3V0cHV0X2RldGFpbHMgPSBpbnRlcnByZXRlci5nZXRfb3V0cHV0X2RldGFpbHMoMCkKKyAgaWYgb3V0cHV0X2RldGFpbHNbJ2R0eXBlJ10gPT0gbnAuZmxvYXQzMjoKKyAgICByZXR1cm4gdGZsbV9vdXRwdXRbMF0uYXN0eXBlKG5wLmZsb2F0MzIpCisgICMgRGVxdWFudGl6ZSB0aGUgb3V0cHV0IGZvciBxdWFudGl6ZWQgbW9kZWwKKyAgcmV0dXJuIGRlcXVhbnRpemVfb3V0cHV0X2RhdGEodGZsbV9vdXRwdXRbMF0sIG91dHB1dF9kZXRhaWxzKQorCisKK2RlZiBnZW5lcmF0ZV9mZWF0dXJlcygKKyAgICBhdWRpb19wcDogYXVkaW9fcHJlcHJvY2Vzc29yLkF1ZGlvUHJlcHJvY2Vzc29yKSAtPiBucC5uZGFycmF5OgorICAiIiIKKyAgR2VuZXJhdGUgYXVkaW8gc2FtcGxlIGZlYXR1cmVzCisKKyAgQXJnczoKKyAgICAgIGF1ZGlvX3BwOiBBdWRpb1ByZXByb2Nlc3NvciBpbnN0YW5jZQorCisgIFJldHVybnM6CisgICAgICBucC5uZGFycmF5OiBnZW5lcmF0ZWQgYXVkaW8gc2FtcGxlIGZlYXR1cmVzIHdpdGggc2hhcGUgX0ZFQVRVUkVTX1NIQVBFCisgICIiIgorICBpZiBhdWRpb19wcC5wYXJhbXMudXNlX2Zsb2F0X291dHB1dDoKKyAgICBkdHlwZSA9IG5wLmZsb2F0MzIKKyAgZWxzZToKKyAgICBkdHlwZSA9IG5wLmludDgKKyAgZmVhdHVyZXMgPSBucC56ZXJvcyhfRkVBVFVSRVNfU0hBUEUsIGR0eXBlPWR0eXBlKQorICBzdGFydF9pbmRleCA9IDAKKyAgd2luZG93X3NpemUgPSBpbnQoYXVkaW9fcHAucGFyYW1zLndpbmRvd19zaXplX21zICoKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fcHAucGFyYW1zLnNhbXBsZV9yYXRlIC8gMTAwMCkKKyAgd2luZG93X3N0cmlkZSA9IGludChhdWRpb19wcC5wYXJhbXMud2luZG93X3N0cmlkZV9tcyAqCisgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcHAucGFyYW1zLnNhbXBsZV9yYXRlIC8gMTAwMCkKKyAgc2FtcGxlcyA9IGF1ZGlvX3BwLnNhbXBsZXNbMF0KKyAgZnJhbWVfbnVtYmVyID0gMAorICBlbmRfaW5kZXggPSBzdGFydF9pbmRleCArIHdpbmRvd19zaXplCisKKyAgIyByZXNldCBhdWRpbyBwcmVwcm9jZXNzb3Igbm9pc2UgZXN0aW1hdGVzCisgIGF1ZGlvX3BwLnJlc2V0X3RmbG0oKQorCisgIHdoaWxlIGVuZF9pbmRleCA8PSBsZW4oc2FtcGxlcyk6CisgICAgZnJhbWVfdGVuc29yOiB0Zi5UZW5zb3IgPSB0Zi5jb252ZXJ0X3RvX3RlbnNvcigKKyAgICAgICAgc2FtcGxlc1tzdGFydF9pbmRleDplbmRfaW5kZXhdKQorICAgIGZyYW1lX3RlbnNvciA9IHRmLnJlc2hhcGUoZnJhbWVfdGVuc29yLCBbMSwgLTFdKQorICAgIGZlYXR1cmVfdGVuc29yID0gYXVkaW9fcHAuZ2VuZXJhdGVfZmVhdHVyZV91c2luZ190ZmxtKGZyYW1lX3RlbnNvcikKKyAgICBmZWF0dXJlc1tmcmFtZV9udW1iZXJdID0gZmVhdHVyZV90ZW5zb3IubnVtcHkoKQorICAgIHN0YXJ0X2luZGV4ICs9IHdpbmRvd19zdHJpZGUKKyAgICBlbmRfaW5kZXggKz0gd2luZG93X3N0cmlkZQorICAgIGZyYW1lX251bWJlciArPSAxCisKKyAgcmV0dXJuIGZlYXR1cmVzCisKKworZGVmIGdldF9jYXRlZ29yeV9uYW1lcygpIC0+IGxpc3Rbc3RyXToKKyAgIiIiCisgIEdldCB0aGUgbGlzdCBvZiBtb2RlbCBvdXRwdXQgY2F0ZWdvcnkgbmFtZXMKKworICBSZXR1cm5zOgorICAgICAgbGlzdFtzdHJdOiBtb2RlbCBvdXRwdXQgY2F0ZWdvcnkgbmFtZXMKKyAgIiIiCisgIHJldHVybiBbJ3NpbGVuY2UnLCAndW5rbm93bicsICd5ZXMnLCAnbm8nXQorCisKK2RlZiBfbWFpbihfKToKKyAgc2FtcGxlX3BhdGggPSBQYXRoKF9TQU1QTEVfUEFUSC52YWx1ZSkKKyAgYXNzZXJ0IHNhbXBsZV9wYXRoLmV4aXN0cygpIGFuZCBzYW1wbGVfcGF0aC5pc19maWxlKCksIFwKKyAgICAgICdBdWRpbyBzYW1wbGUgZmlsZSBkb2VzIG5vdCBleGlzdC4gUGxlYXNlIGNoZWNrIHRoZSBwYXRoLicKKyAgbW9kZWxfcHJlZml4X3BhdGggPSByZXNvdXJjZV9sb2FkZXIuZ2V0X3BhdGhfdG9fZGF0YWZpbGUoJ21vZGVscycpCisgIG1vZGVsX3BhdGggPSBQYXRoKG1vZGVsX3ByZWZpeF9wYXRoLCAnbWljcm9fc3BlZWNoX3F1YW50aXplZC50ZmxpdGUnKQorCisgIGZlYXR1cmVfcGFyYW1zID0gYXVkaW9fcHJlcHJvY2Vzc29yLkZlYXR1cmVQYXJhbXMoKQorICBhdWRpb19wcCA9IGF1ZGlvX3ByZXByb2Nlc3Nvci5BdWRpb1ByZXByb2Nlc3NvcihmZWF0dXJlX3BhcmFtcykKKyAgYXVkaW9fcHAubG9hZF9zYW1wbGVzKHNhbXBsZV9wYXRoKQorICBmZWF0dXJlcyA9IGdlbmVyYXRlX2ZlYXR1cmVzKGF1ZGlvX3BwKQorCisgIHRmbG1faW50ZXJwcmV0ZXIgPSBydW50aW1lLkludGVycHJldGVyLmZyb21fZmlsZShtb2RlbF9wYXRoKQorCisgIGZyYW1lX251bWJlciA9IDAKKyAgdGVzdF9mZWF0dXJlcyA9IG5wLnplcm9zKF9GRUFUVVJFU19TSEFQRSwgZHR5cGU9bnAuaW50OCkKKyAgZm9yIGZlYXR1cmUgaW4gZmVhdHVyZXM6CisgICAgdGVzdF9mZWF0dXJlc1tmcmFtZV9udW1iZXJdID0gZmVhdHVyZQorICAgIGNhdGVnb3J5X3Byb2JhYmlsaXRpZXMgPSBwcmVkaWN0KHRmbG1faW50ZXJwcmV0ZXIsIHRlc3RfZmVhdHVyZXMpCisgICAgY2F0ZWdvcnlfcHJvYmFiaWxpdGllc19zdHIgPSAnWycKKyAgICBmb3IgaSBpbiByYW5nZShsZW4oY2F0ZWdvcnlfcHJvYmFiaWxpdGllcykpOgorICAgICAgaWYgaSA+IDA6CisgICAgICAgIGNhdGVnb3J5X3Byb2JhYmlsaXRpZXNfc3RyICs9ICcsICcKKyAgICAgIGNhdGVnb3J5X3Byb2JhYmlsaXRpZXNfc3RyICs9IGYne2NhdGVnb3J5X3Byb2JhYmlsaXRpZXNbaV06LjRmfScKKyAgICBjYXRlZ29yeV9wcm9iYWJpbGl0aWVzX3N0ciArPSAnXScKKyAgICBwcmludChmJ0ZyYW1lICN7ZnJhbWVfbnVtYmVyfToge2NhdGVnb3J5X3Byb2JhYmlsaXRpZXNfc3RyfScpCisgICAgZnJhbWVfbnVtYmVyICs9IDEKKworICBjYXRlZ29yeV9wcm9iYWJpbGl0aWVzID0gcHJlZGljdCh0ZmxtX2ludGVycHJldGVyLCBmZWF0dXJlcykKKyAgcHJlZGljdGVkX2NhdGVnb3J5ID0gbnAuYXJnbWF4KGNhdGVnb3J5X3Byb2JhYmlsaXRpZXMpCisgIGNhdGVnb3J5X25hbWVzID0gZ2V0X2NhdGVnb3J5X25hbWVzKCkKKyAgcHJpbnQoJ01vZGVsIHByZWRpY3RzIHRoZSBhdWRpbyBzYW1wbGUgYXMnCisgICAgICAgIGYnIDx7Y2F0ZWdvcnlfbmFtZXNbcHJlZGljdGVkX2NhdGVnb3J5XX0+JworICAgICAgICBmJyB3aXRoIHByb2JhYmlsaXR5IHtjYXRlZ29yeV9wcm9iYWJpbGl0aWVzW3ByZWRpY3RlZF9jYXRlZ29yeV06LjJmfScpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgYXBwLnJ1bihfbWFpbikKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvZXZhbHVhdGVfdGVzdC5weSBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvZXZhbHVhdGVfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWQ2YWMwCi0tLSAvZGV2L251bGwKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9ldmFsdWF0ZV90ZXN0LnB5CkBAIC0wLDAgKzEsOTYgQEAKKyMgQ29weXJpZ2h0IDIwMjMgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyIiIgorV2FrZS13b3JkIG1vZGVsIHRlc3RpbmcsIHdpdGggYXVkaW8gcHJlcHJvY2Vzc2luZyB1c2luZyBNaWNyb0ludGVycHJldGVyCisKK1J1bjoKK2JhemVsIGJ1aWxkIHRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2g6ZXZhbHVhdGVfdGVzdAorYmF6ZWwtYmluL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvZXZhbHVhdGVfdGVzdAorIiIiCisKK2ltcG9ydCBudW1weSBhcyBucAorZnJvbSBwYXRobGliIGltcG9ydCBQYXRoCisKK2Zyb20gdGVuc29yZmxvdy5weXRob24uZnJhbWV3b3JrIGltcG9ydCB0ZXN0X3V0aWwKK2Zyb20gdGVuc29yZmxvdy5weXRob24ucGxhdGZvcm0gaW1wb3J0IHJlc291cmNlX2xvYWRlcgorZnJvbSB0ZW5zb3JmbG93LnB5dGhvbi5wbGF0Zm9ybSBpbXBvcnQgdGVzdAorZnJvbSB0ZmxpdGVfbWljcm8ucHl0aG9uLnRmbGl0ZV9taWNybyBpbXBvcnQgcnVudGltZQorZnJvbSB0ZmxpdGVfbWljcm8udGVuc29yZmxvdy5saXRlLm1pY3JvLmV4YW1wbGVzLm1pY3JvX3NwZWVjaCBpbXBvcnQgYXVkaW9fcHJlcHJvY2Vzc29yCitmcm9tIHRmbGl0ZV9taWNyby50ZW5zb3JmbG93LmxpdGUubWljcm8uZXhhbXBsZXMubWljcm9fc3BlZWNoIGltcG9ydCBldmFsdWF0ZQorCisKK2NsYXNzIE1pY3JvU3BlZWNoVGVzdCh0ZXN0X3V0aWwuVGVuc29yRmxvd1Rlc3RDYXNlKToKKworICBkZWYgc2V0VXAoc2VsZik6CisgICAgbW9kZWxfcHJlZml4X3BhdGggPSByZXNvdXJjZV9sb2FkZXIuZ2V0X3BhdGhfdG9fZGF0YWZpbGUoJ21vZGVscycpCisgICAgc2VsZi5zYW1wbGVfcHJlZml4X3BhdGggPSByZXNvdXJjZV9sb2FkZXIuZ2V0X3BhdGhfdG9fZGF0YWZpbGUoJ3Rlc3RkYXRhJykKKyAgICBtb2RlbF9wYXRoID0gUGF0aChtb2RlbF9wcmVmaXhfcGF0aCwgJ21pY3JvX3NwZWVjaF9xdWFudGl6ZWQudGZsaXRlJykKKyAgICBzZWxmLnRmbG1faW50ZXJwcmV0ZXIgPSBydW50aW1lLkludGVycHJldGVyLmZyb21fZmlsZShtb2RlbF9wYXRoKQorICAgIHNlbGYudGVzdF9kYXRhID0gWworICAgICAgICAoJ25vJywgJ25vXzEwMDBtcy53YXYnKSwKKyAgICAgICAgKCd5ZXMnLCAneWVzXzEwMDBtcy53YXYnKSwKKyAgICAgICAgKCdzaWxlbmNlJywgJ25vaXNlXzEwMDBtcy53YXYnKSwKKyAgICAgICAgKCdzaWxlbmNlJywgJ3NpbGVuY2VfMTAwMG1zLndhdicpLAorICAgIF0KKworICBkZWYgdGVzdE1vZGVsQWNjdXJhY3lXaXRoSW50OEZlYXR1cmVzKHNlbGYpOgorICAgIGZlYXR1cmVfcGFyYW1zID0gYXVkaW9fcHJlcHJvY2Vzc29yLkZlYXR1cmVQYXJhbXMoKQorICAgIGF1ZGlvX3BwID0gYXVkaW9fcHJlcHJvY2Vzc29yLkF1ZGlvUHJlcHJvY2Vzc29yKGZlYXR1cmVfcGFyYW1zKQorICAgIGZvciBsYWJlbCwgc2FtcGxlX25hbWUgaW4gc2VsZi50ZXN0X2RhdGE6CisgICAgICAjIExvYWQgYXVkaW8gc2FtcGxlIGRhdGEKKyAgICAgIHNhbXBsZV9wYXRoID0gUGF0aChzZWxmLnNhbXBsZV9wcmVmaXhfcGF0aCwgc2FtcGxlX25hbWUpCisgICAgICBhdWRpb19wcC5sb2FkX3NhbXBsZXMoc2FtcGxlX3BhdGgpCisKKyAgICAgICMgR2VuZXJhdGUgZmVhdHVyZSBkYXRhIGZyb20gYXVkaW8gc2FtcGxlcy4KKyAgICAgICMgTm90ZSB0aGF0IHRoZSBub2lzZSBlc3RpbWF0ZSBpcyByZXNldCBlYWNoIHRpbWUgZ2VuZXJhdGVfZmVhdHVyZXMoKQorICAgICAgIyBpcyBjYWxsZWQuCisgICAgICBmZWF0dXJlcyA9IGV2YWx1YXRlLmdlbmVyYXRlX2ZlYXR1cmVzKGF1ZGlvX3BwKQorCisgICAgICAjIFJ1biBtb2RlbCBpbmZlcmVuY2UgKHF1YW50aXplZCkgb24gdGhlIGZlYXR1cmUgZGF0YQorICAgICAgY2F0ZWdvcnlfcHJvYmFiaWxpdGllcyA9IGV2YWx1YXRlLnByZWRpY3Qoc2VsZi50ZmxtX2ludGVycHJldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMpCisKKyAgICAgICMgQ2hlY2sgdGhlIHByZWRpY3Rpb24gcmVzdWx0CisgICAgICBwcmVkaWN0ZWRfY2F0ZWdvcnkgPSBucC5hcmdtYXgoY2F0ZWdvcnlfcHJvYmFiaWxpdGllcykKKyAgICAgIGNhdGVnb3J5X25hbWVzID0gZXZhbHVhdGUuZ2V0X2NhdGVnb3J5X25hbWVzKCkKKyAgICAgICMgQ2hlY2sgdGhlIHByZWRpY3Rpb24KKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY2F0ZWdvcnlfbmFtZXNbcHJlZGljdGVkX2NhdGVnb3J5XSwgbGFiZWwpCisKKyAgZGVmIHRlc3RNb2RlbEFjY3VyYWN5V2l0aEZsb2F0RmVhdHVyZXMoc2VsZik6CisgICAgZmVhdHVyZV9wYXJhbXMgPSBhdWRpb19wcmVwcm9jZXNzb3IuRmVhdHVyZVBhcmFtcyh1c2VfZmxvYXRfb3V0cHV0PVRydWUpCisgICAgYXVkaW9fcHAgPSBhdWRpb19wcmVwcm9jZXNzb3IuQXVkaW9QcmVwcm9jZXNzb3IoZmVhdHVyZV9wYXJhbXMpCisgICAgZm9yIGxhYmVsLCBzYW1wbGVfbmFtZSBpbiBzZWxmLnRlc3RfZGF0YToKKyAgICAgICMgTG9hZCBhdWRpbyBzYW1wbGUgZGF0YQorICAgICAgc2FtcGxlX3BhdGggPSBQYXRoKHNlbGYuc2FtcGxlX3ByZWZpeF9wYXRoLCBzYW1wbGVfbmFtZSkKKyAgICAgIGF1ZGlvX3BwLmxvYWRfc2FtcGxlcyhzYW1wbGVfcGF0aCkKKworICAgICAgIyBHZW5lcmF0ZSBmZWF0dXJlIGRhdGEgZnJvbSBhdWRpbyBzYW1wbGVzLgorICAgICAgIyBOb3RlIHRoYXQgdGhlIG5vaXNlIGVzdGltYXRlIGlzIHJlc2V0IGVhY2ggdGltZSBnZW5lcmF0ZV9mZWF0dXJlcygpCisgICAgICAjIGlzIGNhbGxlZC4KKyAgICAgIGZlYXR1cmVzID0gZXZhbHVhdGUuZ2VuZXJhdGVfZmVhdHVyZXMoYXVkaW9fcHApCisKKyAgICAgICMgUnVuIG1vZGVsIGluZmVyZW5jZSAocXVhbnRpemVkKSBvbiB0aGUgZmVhdHVyZSBkYXRhCisgICAgICBjYXRlZ29yeV9wcm9iYWJpbGl0aWVzID0gZXZhbHVhdGUucHJlZGljdChzZWxmLnRmbG1faW50ZXJwcmV0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlcykKKworICAgICAgIyBDaGVjayB0aGUgcHJlZGljdGlvbiByZXN1bHQKKyAgICAgIHByZWRpY3RlZF9jYXRlZ29yeSA9IG5wLmFyZ21heChjYXRlZ29yeV9wcm9iYWJpbGl0aWVzKQorICAgICAgY2F0ZWdvcnlfbmFtZXMgPSBldmFsdWF0ZS5nZXRfY2F0ZWdvcnlfbmFtZXMoKQorICAgICAgIyBDaGVjayB0aGUgcHJlZGljdGlvbgorICAgICAgc2VsZi5hc3NlcnRFcXVhbChjYXRlZ29yeV9uYW1lc1twcmVkaWN0ZWRfY2F0ZWdvcnldLCBsYWJlbCkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICB0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9mZWF0dXJlX3Byb3ZpZGVyLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9mZWF0dXJlX3Byb3ZpZGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGE2NjM1Li4wMDAwMDAwCi0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvZmVhdHVyZV9wcm92aWRlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAxOCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi1MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLXlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLVlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvZmVhdHVyZV9wcm92aWRlci5oIgotCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9hdWRpb19wcm92aWRlci5oIgotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMvbWljcm9fZmVhdHVyZXNfZ2VuZXJhdG9yLmgiCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlcy9taWNyb19tb2RlbF9zZXR0aW5ncy5oIgotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19sb2cuaCIKLQotRmVhdHVyZVByb3ZpZGVyOjpGZWF0dXJlUHJvdmlkZXIoaW50IGZlYXR1cmVfc2l6ZSwgaW50OF90KiBmZWF0dXJlX2RhdGEpCi0gICAgOiBmZWF0dXJlX3NpemVfKGZlYXR1cmVfc2l6ZSksCi0gICAgICBmZWF0dXJlX2RhdGFfKGZlYXR1cmVfZGF0YSksCi0gICAgICBpc19maXJzdF9ydW5fKHRydWUpIHsKLSAgLy8gSW5pdGlhbGl6ZSB0aGUgZmVhdHVyZSBkYXRhIHRvIGRlZmF1bHQgdmFsdWVzLgotICBmb3IgKGludCBuID0gMDsgbiA8IGZlYXR1cmVfc2l6ZV87ICsrbikgewotICAgIGZlYXR1cmVfZGF0YV9bbl0gPSAwOwotICB9Ci19Ci0KLUZlYXR1cmVQcm92aWRlcjo6fkZlYXR1cmVQcm92aWRlcigpIHt9Ci0KLVRmTGl0ZVN0YXR1cyBGZWF0dXJlUHJvdmlkZXI6OlBvcHVsYXRlRmVhdHVyZURhdGEoaW50MzJfdCBsYXN0X3RpbWVfaW5fbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdGltZV9pbl9tcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBob3dfbWFueV9uZXdfc2xpY2VzKSB7Ci0gIGlmIChmZWF0dXJlX3NpemVfICE9IGtGZWF0dXJlRWxlbWVudENvdW50KSB7Ci0gICAgTWljcm9QcmludGYoIlJlcXVlc3RlZCBmZWF0dXJlX2RhdGFfIHNpemUgJWQgZG9lc24ndCBtYXRjaCAlZCIsCi0gICAgICAgICAgICAgICAgZmVhdHVyZV9zaXplXywga0ZlYXR1cmVFbGVtZW50Q291bnQpOwotICAgIHJldHVybiBrVGZMaXRlRXJyb3I7Ci0gIH0KLQotICAvLyBRdWFudGl6ZSB0aGUgdGltZSBpbnRvIHN0ZXBzIGFzIGxvbmcgYXMgZWFjaCB3aW5kb3cgc3RyaWRlLCBzbyB3ZSBjYW4KLSAgLy8gZmlndXJlIG91dCB3aGljaCBhdWRpbyBkYXRhIHdlIG5lZWQgdG8gZmV0Y2guCi0gIGNvbnN0IGludCBsYXN0X3N0ZXAgPSAobGFzdF90aW1lX2luX21zIC8ga0ZlYXR1cmVTbGljZVN0cmlkZU1zKTsKLSAgY29uc3QgaW50IGN1cnJlbnRfc3RlcCA9ICh0aW1lX2luX21zIC8ga0ZlYXR1cmVTbGljZVN0cmlkZU1zKTsKLQotICBpbnQgc2xpY2VzX25lZWRlZCA9IGN1cnJlbnRfc3RlcCAtIGxhc3Rfc3RlcDsKLSAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCwgbWFrZSBzdXJlIHdlIGRvbid0IHVzZSBhbnkgY2FjaGVkIGluZm9ybWF0aW9uLgotICBpZiAoaXNfZmlyc3RfcnVuXykgewotICAgIFRmTGl0ZVN0YXR1cyBpbml0X3N0YXR1cyA9IEluaXRpYWxpemVNaWNyb0ZlYXR1cmVzKCk7Ci0gICAgaWYgKGluaXRfc3RhdHVzICE9IGtUZkxpdGVPaykgewotICAgICAgcmV0dXJuIGluaXRfc3RhdHVzOwotICAgIH0KLSAgICBpc19maXJzdF9ydW5fID0gZmFsc2U7Ci0gICAgc2xpY2VzX25lZWRlZCA9IGtGZWF0dXJlU2xpY2VDb3VudDsKLSAgfQotICBpZiAoc2xpY2VzX25lZWRlZCA+IGtGZWF0dXJlU2xpY2VDb3VudCkgewotICAgIHNsaWNlc19uZWVkZWQgPSBrRmVhdHVyZVNsaWNlQ291bnQ7Ci0gIH0KLSAgKmhvd19tYW55X25ld19zbGljZXMgPSBzbGljZXNfbmVlZGVkOwotCi0gIGNvbnN0IGludCBzbGljZXNfdG9fa2VlcCA9IGtGZWF0dXJlU2xpY2VDb3VudCAtIHNsaWNlc19uZWVkZWQ7Ci0gIGNvbnN0IGludCBzbGljZXNfdG9fZHJvcCA9IGtGZWF0dXJlU2xpY2VDb3VudCAtIHNsaWNlc190b19rZWVwOwotICAvLyBJZiB3ZSBjYW4gYXZvaWQgcmVjYWxjdWxhdGluZyBzb21lIHNsaWNlcywganVzdCBtb3ZlIHRoZSBleGlzdGluZyBkYXRhCi0gIC8vIHVwIGluIHRoZSBzcGVjdHJvZ3JhbSwgdG8gcGVyZm9ybSBzb21ldGhpbmcgbGlrZSB0aGlzOgotICAvLyBsYXN0IHRpbWUgPSA4MG1zICAgICAgICAgIGN1cnJlbnQgdGltZSA9IDEyMG1zCi0gIC8vICstLS0tLS0tLS0tLSsgICAgICAgICAgICAgKy0tLS0tLS0tLS0tKwotICAvLyB8IGRhdGFAMjBtcyB8ICAgICAgICAgLS0+IHwgZGF0YUA2MG1zIHwKLSAgLy8gKy0tLS0tLS0tLS0tKyAgICAgICAtLSAgICArLS0tLS0tLS0tLS0rCi0gIC8vIHwgZGF0YUA0MG1zIHwgICAgIC0tICAtLT4gfCBkYXRhQDgwbXMgfAotICAvLyArLS0tLS0tLS0tLS0rICAgLS0gIC0tICAgICstLS0tLS0tLS0tLSsKLSAgLy8gfCBkYXRhQDYwbXMgfCAtLSAgLS0gICAgICB8ICA8ZW1wdHk+ICB8Ci0gIC8vICstLS0tLS0tLS0tLSsgICAtLSAgICAgICAgKy0tLS0tLS0tLS0tKwotICAvLyB8IGRhdGFAODBtcyB8IC0tICAgICAgICAgIHwgIDxlbXB0eT4gIHwKLSAgLy8gKy0tLS0tLS0tLS0tKyAgICAgICAgICAgICArLS0tLS0tLS0tLS0rCi0gIGlmIChzbGljZXNfdG9fa2VlcCA+IDApIHsKLSAgICBmb3IgKGludCBkZXN0X3NsaWNlID0gMDsgZGVzdF9zbGljZSA8IHNsaWNlc190b19rZWVwOyArK2Rlc3Rfc2xpY2UpIHsKLSAgICAgIGludDhfdCogZGVzdF9zbGljZV9kYXRhID0KLSAgICAgICAgICBmZWF0dXJlX2RhdGFfICsgKGRlc3Rfc2xpY2UgKiBrRmVhdHVyZVNsaWNlU2l6ZSk7Ci0gICAgICBjb25zdCBpbnQgc3JjX3NsaWNlID0gZGVzdF9zbGljZSArIHNsaWNlc190b19kcm9wOwotICAgICAgY29uc3QgaW50OF90KiBzcmNfc2xpY2VfZGF0YSA9Ci0gICAgICAgICAgZmVhdHVyZV9kYXRhXyArIChzcmNfc2xpY2UgKiBrRmVhdHVyZVNsaWNlU2l6ZSk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtGZWF0dXJlU2xpY2VTaXplOyArK2kpIHsKLSAgICAgICAgZGVzdF9zbGljZV9kYXRhW2ldID0gc3JjX3NsaWNlX2RhdGFbaV07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIC8vIEFueSBzbGljZXMgdGhhdCBuZWVkIHRvIGJlIGZpbGxlZCBpbiB3aXRoIGZlYXR1cmUgZGF0YSBoYXZlIHRoZWlyCi0gIC8vIGFwcHJvcHJpYXRlIGF1ZGlvIGRhdGEgcHVsbGVkLCBhbmQgZmVhdHVyZXMgY2FsY3VsYXRlZCBmb3IgdGhhdCBzbGljZS4KLSAgaWYgKHNsaWNlc19uZWVkZWQgPiAwKSB7Ci0gICAgZm9yIChpbnQgbmV3X3NsaWNlID0gc2xpY2VzX3RvX2tlZXA7IG5ld19zbGljZSA8IGtGZWF0dXJlU2xpY2VDb3VudDsKLSAgICAgICAgICsrbmV3X3NsaWNlKSB7Ci0gICAgICBjb25zdCBpbnQgbmV3X3N0ZXAgPSAoY3VycmVudF9zdGVwIC0ga0ZlYXR1cmVTbGljZUNvdW50ICsgMSkgKyBuZXdfc2xpY2U7Ci0gICAgICBjb25zdCBpbnQzMl90IHNsaWNlX3N0YXJ0X21zID0gKG5ld19zdGVwICoga0ZlYXR1cmVTbGljZVN0cmlkZU1zKTsKLSAgICAgIGludDE2X3QqIGF1ZGlvX3NhbXBsZXMgPSBudWxscHRyOwotICAgICAgaW50IGF1ZGlvX3NhbXBsZXNfc2l6ZSA9IDA7Ci0gICAgICAvLyBUT0RPKHBldGV3YXJkZW4pOiBGaXggYnVnIHRoYXQgbGVhZHMgdG8gbm9uLXplcm8gc2xpY2Vfc3RhcnRfbXMKLSAgICAgIEdldEF1ZGlvU2FtcGxlcygoc2xpY2Vfc3RhcnRfbXMgPiAwID8gc2xpY2Vfc3RhcnRfbXMgOiAwKSwKLSAgICAgICAgICAgICAgICAgICAgICBrRmVhdHVyZVNsaWNlRHVyYXRpb25NcywgJmF1ZGlvX3NhbXBsZXNfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAmYXVkaW9fc2FtcGxlcyk7Ci0gICAgICBpZiAoYXVkaW9fc2FtcGxlc19zaXplIDwga01heEF1ZGlvU2FtcGxlU2l6ZSkgewotICAgICAgICBNaWNyb1ByaW50ZigiQXVkaW8gZGF0YSBzaXplICVkIHRvbyBzbWFsbCwgd2FudCAlZCIsIGF1ZGlvX3NhbXBsZXNfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAga01heEF1ZGlvU2FtcGxlU2l6ZSk7Ci0gICAgICAgIHJldHVybiBrVGZMaXRlRXJyb3I7Ci0gICAgICB9Ci0gICAgICBpbnQ4X3QqIG5ld19zbGljZV9kYXRhID0gZmVhdHVyZV9kYXRhXyArIChuZXdfc2xpY2UgKiBrRmVhdHVyZVNsaWNlU2l6ZSk7Ci0gICAgICBzaXplX3QgbnVtX3NhbXBsZXNfcmVhZDsKLSAgICAgIFRmTGl0ZVN0YXR1cyBnZW5lcmF0ZV9zdGF0dXMgPSBHZW5lcmF0ZU1pY3JvRmVhdHVyZXMoCi0gICAgICAgICAgYXVkaW9fc2FtcGxlcywgYXVkaW9fc2FtcGxlc19zaXplLCBrRmVhdHVyZVNsaWNlU2l6ZSwgbmV3X3NsaWNlX2RhdGEsCi0gICAgICAgICAgJm51bV9zYW1wbGVzX3JlYWQpOwotICAgICAgaWYgKGdlbmVyYXRlX3N0YXR1cyAhPSBrVGZMaXRlT2spIHsKLSAgICAgICAgcmV0dXJuIGdlbmVyYXRlX3N0YXR1czsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGtUZkxpdGVPazsKLX0KZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvZmVhdHVyZV9wcm92aWRlci5oIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9mZWF0dXJlX3Byb3ZpZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhMmVmOGYuLjAwMDAwMDAKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9mZWF0dXJlX3Byb3ZpZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAxOCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi1MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLXlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLVlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotI2lmbmRlZiBURU5TT1JGTE9XX0xJVEVfTUlDUk9fRVhBTVBMRVNfTUlDUk9fU1BFRUNIX0ZFQVRVUkVfUFJPVklERVJfSF8KLSNkZWZpbmUgVEVOU09SRkxPV19MSVRFX01JQ1JPX0VYQU1QTEVTX01JQ1JPX1NQRUVDSF9GRUFUVVJFX1BST1ZJREVSX0hfCi0KLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvYy9jb21tb24uaCIKLQotLy8gQmluZHMgaXRzZWxmIHRvIGFuIGFyZWEgb2YgbWVtb3J5IGludGVuZGVkIHRvIGhvbGQgdGhlIGlucHV0IGZlYXR1cmVzIGZvciBhbgotLy8gYXVkaW8tcmVjb2duaXRpb24gbmV1cmFsIG5ldHdvcmsgbW9kZWwsIGFuZCBmaWxscyB0aGF0IGRhdGEgYXJlYSB3aXRoIHRoZQotLy8gZmVhdHVyZXMgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IGF1ZGlvIGlucHV0LCBmb3IgZXhhbXBsZSBmcm9tIGEgbWljcm9waG9uZS4KLS8vIFRoZSBhdWRpbyBmZWF0dXJlcyB0aGVtc2VsdmVzIGFyZSBhIHR3by1kaW1lbnNpb25hbCBhcnJheSwgbWFkZSB1cCBvZgotLy8gaG9yaXpvbnRhbCBzbGljZXMgcmVwcmVzZW50aW5nIHRoZSBmcmVxdWVuY2llcyBhdCBvbmUgcG9pbnQgaW4gdGltZSwgc3RhY2tlZAotLy8gb24gdG9wIG9mIGVhY2ggb3RoZXIgdG8gZm9ybSBhIHNwZWN0cm9ncmFtIHNob3dpbmcgaG93IHRob3NlIGZyZXF1ZW5jaWVzCi0vLyBjaGFuZ2VkIG92ZXIgdGltZS4KLWNsYXNzIEZlYXR1cmVQcm92aWRlciB7Ci0gcHVibGljOgotICAvLyBDcmVhdGUgdGhlIHByb3ZpZGVyLCBhbmQgYmluZCBpdCB0byBhbiBhcmVhIG9mIG1lbW9yeS4gVGhpcyBtZW1vcnkgc2hvdWxkCi0gIC8vIHJlbWFpbiBhY2Nlc3NpYmxlIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHByb3ZpZGVyIG9iamVjdCwgc2luY2Ugc3Vic2VxdWVudAotICAvLyBjYWxscyB3aWxsIGZpbGwgaXQgd2l0aCBmZWF0dXJlIGRhdGEuIFRoZSBwcm92aWRlciBkb2VzIG5vIG1lbW9yeQotICAvLyBtYW5hZ2VtZW50IG9mIHRoaXMgZGF0YS4KLSAgRmVhdHVyZVByb3ZpZGVyKGludCBmZWF0dXJlX3NpemUsIGludDhfdCogZmVhdHVyZV9kYXRhKTsKLSAgfkZlYXR1cmVQcm92aWRlcigpOwotCi0gIC8vIEZpbGxzIHRoZSBmZWF0dXJlIGRhdGEgd2l0aCBpbmZvcm1hdGlvbiBmcm9tIGF1ZGlvIGlucHV0cywgYW5kIHJldHVybnMgaG93Ci0gIC8vIG1hbnkgZmVhdHVyZSBzbGljZXMgd2VyZSB1cGRhdGVkLgotICBUZkxpdGVTdGF0dXMgUG9wdWxhdGVGZWF0dXJlRGF0YShpbnQzMl90IGxhc3RfdGltZV9pbl9tcywgaW50MzJfdCB0aW1lX2luX21zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGhvd19tYW55X25ld19zbGljZXMpOwotCi0gcHJpdmF0ZToKLSAgaW50IGZlYXR1cmVfc2l6ZV87Ci0gIGludDhfdCogZmVhdHVyZV9kYXRhXzsKLSAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IHRyeSB0byB1c2UgY2FjaGVkIGluZm9ybWF0aW9uIGlmIHRoaXMgaXMgdGhlIGZpcnN0IGNhbGwKLSAgLy8gaW50byB0aGUgcHJvdmlkZXIuCi0gIGJvb2wgaXNfZmlyc3RfcnVuXzsKLX07Ci0KLSNlbmRpZiAgLy8gVEVOU09SRkxPV19MSVRFX01JQ1JPX0VYQU1QTEVTX01JQ1JPX1NQRUVDSF9GRUFUVVJFX1BST1ZJREVSX0hfCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL2ZlYXR1cmVfcHJvdmlkZXJfbW9ja190ZXN0LmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9mZWF0dXJlX3Byb3ZpZGVyX21vY2tfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZlNWU0My4uMDAwMDAwMAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL2ZlYXR1cmVfcHJvdmlkZXJfbW9ja190ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMTkgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci15b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvYy9jb21tb24uaCIKLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL2ZlYXR1cmVfcHJvdmlkZXIuaCIKLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzL21pY3JvX21vZGVsX3NldHRpbmdzLmgiCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlcy9ub19taWNyb19mZWF0dXJlc19kYXRhLmgiCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlcy95ZXNfbWljcm9fZmVhdHVyZXNfZGF0YS5oIgotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0aW5nL21pY3JvX3Rlc3QuaCIKLQotVEZfTElURV9NSUNST19URVNUU19CRUdJTgotCi1URl9MSVRFX01JQ1JPX1RFU1QoVGVzdEZlYXR1cmVQcm92aWRlck1vY2tZZXMpIHsKLSAgaW50OF90IGZlYXR1cmVfZGF0YVtrRmVhdHVyZUVsZW1lbnRDb3VudF07Ci0gIEZlYXR1cmVQcm92aWRlciBmZWF0dXJlX3Byb3ZpZGVyKGtGZWF0dXJlRWxlbWVudENvdW50LCBmZWF0dXJlX2RhdGEpOwotCi0gIGludCBob3dfbWFueV9uZXdfc2xpY2VzID0gMDsKLSAgVGZMaXRlU3RhdHVzIHBvcHVsYXRlX3N0YXR1cyA9IGZlYXR1cmVfcHJvdmlkZXIuUG9wdWxhdGVGZWF0dXJlRGF0YSgKLSAgICAgIC8qIGxhc3RfdGltZV9pbl9tcz0gKi8gMCwgLyogdGltZV9pbl9tcz0gKi8gOTcwLCAmaG93X21hbnlfbmV3X3NsaWNlcyk7Ci0gIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKGtUZkxpdGVPaywgcG9wdWxhdGVfc3RhdHVzKTsKLSAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoa0ZlYXR1cmVTbGljZUNvdW50LCBob3dfbWFueV9uZXdfc2xpY2VzKTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IGtGZWF0dXJlRWxlbWVudENvdW50OyArK2kpIHsKLSAgICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUShnX3llc19taWNyb19mMmU1OWZlYV9ub2hhc2hfMV9kYXRhW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVfZGF0YVtpXSk7Ci0gIH0KLX0KLQotVEZfTElURV9NSUNST19URVNUKFRlc3RGZWF0dXJlUHJvdmlkZXJNb2NrTm8pIHsKLSAgaW50OF90IGZlYXR1cmVfZGF0YVtrRmVhdHVyZUVsZW1lbnRDb3VudF07Ci0gIEZlYXR1cmVQcm92aWRlciBmZWF0dXJlX3Byb3ZpZGVyKGtGZWF0dXJlRWxlbWVudENvdW50LCBmZWF0dXJlX2RhdGEpOwotCi0gIGludCBob3dfbWFueV9uZXdfc2xpY2VzID0gMDsKLSAgVGZMaXRlU3RhdHVzIHBvcHVsYXRlX3N0YXR1cyA9IGZlYXR1cmVfcHJvdmlkZXIuUG9wdWxhdGVGZWF0dXJlRGF0YSgKLSAgICAgIC8qIGxhc3RfdGltZV9pbl9tcz0gKi8gNDAwMCwKLSAgICAgIC8qIHRpbWVfaW5fbXM9ICovIDQ5NzAsICZob3dfbWFueV9uZXdfc2xpY2VzKTsKLSAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoa1RmTGl0ZU9rLCBwb3B1bGF0ZV9zdGF0dXMpOwotICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUShrRmVhdHVyZVNsaWNlQ291bnQsIGhvd19tYW55X25ld19zbGljZXMpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwga0ZlYXR1cmVFbGVtZW50Q291bnQ7ICsraSkgewotICAgIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKGdfbm9fbWljcm9fZjk2NDNkNDJfbm9oYXNoXzRfZGF0YVtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlX2RhdGFbaV0pOwotICB9Ci19Ci0KLVRGX0xJVEVfTUlDUk9fVEVTVFNfRU5ECmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL2ZlYXR1cmVfcHJvdmlkZXJfdGVzdC5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvZmVhdHVyZV9wcm92aWRlcl90ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTgyZThjLi4wMDAwMDAwCi0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvZmVhdHVyZV9wcm92aWRlcl90ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMTggVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci15b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL2ZlYXR1cmVfcHJvdmlkZXIuaCIKLQotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9jL2NvbW1vbi5oIgotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMvbWljcm9fbW9kZWxfc2V0dGluZ3MuaCIKLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vdGVzdGluZy9taWNyb190ZXN0LmgiCi0KLVRGX0xJVEVfTUlDUk9fVEVTVFNfQkVHSU4KLQotVEZfTElURV9NSUNST19URVNUKFRlc3RGZWF0dXJlUHJvdmlkZXIpIHsKLSAgaW50OF90IGZlYXR1cmVfZGF0YVtrRmVhdHVyZUVsZW1lbnRDb3VudF07Ci0gIEZlYXR1cmVQcm92aWRlciBmZWF0dXJlX3Byb3ZpZGVyKGtGZWF0dXJlRWxlbWVudENvdW50LCBmZWF0dXJlX2RhdGEpOwotCi0gIGludCBob3dfbWFueV9uZXdfc2xpY2VzID0gMDsKLSAgVGZMaXRlU3RhdHVzIHBvcHVsYXRlX3N0YXR1cyA9IGZlYXR1cmVfcHJvdmlkZXIuUG9wdWxhdGVGZWF0dXJlRGF0YSgKLSAgICAgIC8qIGxhc3RfdGltZV9pbl9tcz0gKi8gMCwgLyogdGltZV9pbl9tcz0gKi8gMTAwMDAsICZob3dfbWFueV9uZXdfc2xpY2VzKTsKLSAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoa1RmTGl0ZU9rLCBwb3B1bGF0ZV9zdGF0dXMpOwotICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUShrRmVhdHVyZVNsaWNlQ291bnQsIGhvd19tYW55X25ld19zbGljZXMpOwotfQotCi1URl9MSVRFX01JQ1JPX1RFU1RTX0VORApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9pbWFnZXMvYW5pbWF0aW9uX29uX2FyZHVpbm8uZ2lmIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9pbWFnZXMvYW5pbWF0aW9uX29uX2FyZHVpbm8uZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmFiOWMxLi4wMDAwMDAwCi0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvaW1hZ2VzL2FuaW1hdGlvbl9vbl9hcmR1aW5vLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvaW1hZ2VzL2F1ZGlvX3ByZXByb2Nlc3Nvcl9pbnQ4LnBuZyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvaW1hZ2VzL2F1ZGlvX3ByZXByb2Nlc3Nvcl9pbnQ4LnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWM5MWZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9pbWFnZXMvYXVkaW9fcHJlcHJvY2Vzc29yX2ludDgucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvaW1hZ2VzL21pY3JvX3NwZWVjaF9xdWFudGl6ZWQucG5nIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9pbWFnZXMvbWljcm9fc3BlZWNoX3F1YW50aXplZC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTllOThjNgotLS0gL2Rldi9udWxsCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvaW1hZ2VzL21pY3JvX3NwZWVjaF9xdWFudGl6ZWQucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvaW1hZ2VzL21vZGVsX2FyY2hpdGVjdHVyZS5wbmcgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL2ltYWdlcy9tb2RlbF9hcmNoaXRlY3R1cmUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTkxZmFkLi4wMDAwMDAwCi0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvaW1hZ2VzL21vZGVsX2FyY2hpdGVjdHVyZS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21haW4uY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21haW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNWM0NzIuLjAwMDAwMDAKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9tYWluLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMTkgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci15b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21haW5fZnVuY3Rpb25zLmgiCi0KLS8vIFRoaXMgaXMgdGhlIGRlZmF1bHQgbWFpbiB1c2VkIG9uIHN5c3RlbXMgdGhhdCBoYXZlIHRoZSBzdGFuZGFyZCBDIGVudHJ5Ci0vLyBwb2ludC4gT3RoZXIgZGV2aWNlcyAoZm9yIGV4YW1wbGUgRnJlZVJUT1Mgb3IgRVNQMzIpIHRoYXQgaGF2ZSBkaWZmZXJlbnQKLS8vIHJlcXVpcmVtZW50cyBmb3IgZW50cnkgY29kZSAobGlrZSBhbiBhcHBfbWFpbiBmdW5jdGlvbikgc2hvdWxkIHNwZWNpYWxpemUKLS8vIHRoaXMgbWFpbi5jYyBmaWxlIGluIGEgdGFyZ2V0LXNwZWNpZmljIHN1YmZvbGRlci4KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKLSAgc2V0dXAoKTsKLSAgd2hpbGUgKHRydWUpIHsKLSAgICBsb29wKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWFpbl9mdW5jdGlvbnMuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21haW5fZnVuY3Rpb25zLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTI2MzZhLi4wMDAwMDAwCi0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWFpbl9mdW5jdGlvbnMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNjMgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci15b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21haW5fZnVuY3Rpb25zLmgiCi0KLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL2F1ZGlvX3Byb3ZpZGVyLmgiCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9jb21tYW5kX3Jlc3BvbmRlci5oIgotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvZmVhdHVyZV9wcm92aWRlci5oIgotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMvbWljcm9fbW9kZWxfc2V0dGluZ3MuaCIKLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX3NwZWVjaF9tb2RlbF9kYXRhLmgiCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9yZWNvZ25pemVfY29tbWFuZHMuaCIKLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9faW50ZXJwcmV0ZXIuaCIKLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fbG9nLmgiCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX211dGFibGVfb3BfcmVzb2x2ZXIuaCIKLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vc3lzdGVtX3NldHVwLmgiCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL3NjaGVtYS9zY2hlbWFfZ2VuZXJhdGVkLmgiCi0KLS8vIEdsb2JhbHMsIHVzZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBBcmR1aW5vLXN0eWxlIHNrZXRjaGVzLgotbmFtZXNwYWNlIHsKLWNvbnN0IHRmbGl0ZTo6TW9kZWwqIG1vZGVsID0gbnVsbHB0cjsKLXRmbGl0ZTo6TWljcm9JbnRlcnByZXRlciogaW50ZXJwcmV0ZXIgPSBudWxscHRyOwotVGZMaXRlVGVuc29yKiBtb2RlbF9pbnB1dCA9IG51bGxwdHI7Ci1GZWF0dXJlUHJvdmlkZXIqIGZlYXR1cmVfcHJvdmlkZXIgPSBudWxscHRyOwotUmVjb2duaXplQ29tbWFuZHMqIHJlY29nbml6ZXIgPSBudWxscHRyOwotaW50MzJfdCBwcmV2aW91c190aW1lID0gMDsKLQotLy8gQ3JlYXRlIGFuIGFyZWEgb2YgbWVtb3J5IHRvIHVzZSBmb3IgaW5wdXQsIG91dHB1dCwgYW5kIGludGVybWVkaWF0ZSBhcnJheXMuCi0vLyBUaGUgc2l6ZSBvZiB0aGlzIHdpbGwgZGVwZW5kIG9uIHRoZSBtb2RlbCB5b3UncmUgdXNpbmcsIGFuZCBtYXkgbmVlZCB0byBiZQotLy8gZGV0ZXJtaW5lZCBieSBleHBlcmltZW50YXRpb24uCi1jb25zdGV4cHIgaW50IGtUZW5zb3JBcmVuYVNpemUgPSAxMCAqIDEwMjQ7Ci11aW50OF90IHRlbnNvcl9hcmVuYVtrVGVuc29yQXJlbmFTaXplXTsKLWludDhfdCBmZWF0dXJlX2J1ZmZlcltrRmVhdHVyZUVsZW1lbnRDb3VudF07Ci1pbnQ4X3QqIG1vZGVsX2lucHV0X2J1ZmZlciA9IG51bGxwdHI7Ci19ICAvLyBuYW1lc3BhY2UKLQotLy8gVGhlIG5hbWUgb2YgdGhpcyBmdW5jdGlvbiBpcyBpbXBvcnRhbnQgZm9yIEFyZHVpbm8gY29tcGF0aWJpbGl0eS4KLXZvaWQgc2V0dXAoKSB7Ci0gIHRmbGl0ZTo6SW5pdGlhbGl6ZVRhcmdldCgpOwotCi0gIC8vIE1hcCB0aGUgbW9kZWwgaW50byBhIHVzYWJsZSBkYXRhIHN0cnVjdHVyZS4gVGhpcyBkb2Vzbid0IGludm9sdmUgYW55Ci0gIC8vIGNvcHlpbmcgb3IgcGFyc2luZywgaXQncyBhIHZlcnkgbGlnaHR3ZWlnaHQgb3BlcmF0aW9uLgotICBtb2RlbCA9IHRmbGl0ZTo6R2V0TW9kZWwoZ19taWNyb19zcGVlY2hfbW9kZWxfZGF0YSk7Ci0gIGlmIChtb2RlbC0+dmVyc2lvbigpICE9IFRGTElURV9TQ0hFTUFfVkVSU0lPTikgewotICAgIE1pY3JvUHJpbnRmKAotICAgICAgICAiTW9kZWwgcHJvdmlkZWQgaXMgc2NoZW1hIHZlcnNpb24gJWQgbm90IGVxdWFsICIKLSAgICAgICAgInRvIHN1cHBvcnRlZCB2ZXJzaW9uICVkLiIsCi0gICAgICAgIG1vZGVsLT52ZXJzaW9uKCksIFRGTElURV9TQ0hFTUFfVkVSU0lPTik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gUHVsbCBpbiBvbmx5IHRoZSBvcGVyYXRpb24gaW1wbGVtZW50YXRpb25zIHdlIG5lZWQuCi0gIC8vIFRoaXMgcmVsaWVzIG9uIGEgY29tcGxldGUgbGlzdCBvZiBhbGwgdGhlIG9wcyBuZWVkZWQgYnkgdGhpcyBncmFwaC4KLQotICAvLyBOT0xJTlRORVhUTElORShydW50aW1lLWdsb2JhbC12YXJpYWJsZXMpCi0gIHN0YXRpYyB0ZmxpdGU6Ok1pY3JvTXV0YWJsZU9wUmVzb2x2ZXI8ND4gbWljcm9fb3BfcmVzb2x2ZXI7Ci0gIGlmIChtaWNyb19vcF9yZXNvbHZlci5BZGREZXB0aHdpc2VDb252MkQoKSAhPSBrVGZMaXRlT2spIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKG1pY3JvX29wX3Jlc29sdmVyLkFkZEZ1bGx5Q29ubmVjdGVkKCkgIT0ga1RmTGl0ZU9rKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChtaWNyb19vcF9yZXNvbHZlci5BZGRTb2Z0bWF4KCkgIT0ga1RmTGl0ZU9rKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChtaWNyb19vcF9yZXNvbHZlci5BZGRSZXNoYXBlKCkgIT0ga1RmTGl0ZU9rKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gQnVpbGQgYW4gaW50ZXJwcmV0ZXIgdG8gcnVuIHRoZSBtb2RlbCB3aXRoLgotICBzdGF0aWMgdGZsaXRlOjpNaWNyb0ludGVycHJldGVyIHN0YXRpY19pbnRlcnByZXRlcigKLSAgICAgIG1vZGVsLCBtaWNyb19vcF9yZXNvbHZlciwgdGVuc29yX2FyZW5hLCBrVGVuc29yQXJlbmFTaXplKTsKLSAgaW50ZXJwcmV0ZXIgPSAmc3RhdGljX2ludGVycHJldGVyOwotCi0gIC8vIEFsbG9jYXRlIG1lbW9yeSBmcm9tIHRoZSB0ZW5zb3JfYXJlbmEgZm9yIHRoZSBtb2RlbCdzIHRlbnNvcnMuCi0gIFRmTGl0ZVN0YXR1cyBhbGxvY2F0ZV9zdGF0dXMgPSBpbnRlcnByZXRlci0+QWxsb2NhdGVUZW5zb3JzKCk7Ci0gIGlmIChhbGxvY2F0ZV9zdGF0dXMgIT0ga1RmTGl0ZU9rKSB7Ci0gICAgTWljcm9QcmludGYoIkFsbG9jYXRlVGVuc29ycygpIGZhaWxlZCIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIEdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWVtb3J5IGFyZWEgdG8gdXNlIGZvciB0aGUgbW9kZWwncyBpbnB1dC4KLSAgbW9kZWxfaW5wdXQgPSBpbnRlcnByZXRlci0+aW5wdXQoMCk7Ci0gIGlmICgobW9kZWxfaW5wdXQtPmRpbXMtPnNpemUgIT0gMikgfHwgKG1vZGVsX2lucHV0LT5kaW1zLT5kYXRhWzBdICE9IDEpIHx8Ci0gICAgICAobW9kZWxfaW5wdXQtPmRpbXMtPmRhdGFbMV0gIT0KLSAgICAgICAoa0ZlYXR1cmVTbGljZUNvdW50ICoga0ZlYXR1cmVTbGljZVNpemUpKSB8fAotICAgICAgKG1vZGVsX2lucHV0LT50eXBlICE9IGtUZkxpdGVJbnQ4KSkgewotICAgIE1pY3JvUHJpbnRmKCJCYWQgaW5wdXQgdGVuc29yIHBhcmFtZXRlcnMgaW4gbW9kZWwiKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgbW9kZWxfaW5wdXRfYnVmZmVyID0gbW9kZWxfaW5wdXQtPmRhdGEuaW50ODsKLQotICAvLyBQcmVwYXJlIHRvIGFjY2VzcyB0aGUgYXVkaW8gc3BlY3Ryb2dyYW1zIGZyb20gYSBtaWNyb3Bob25lIG9yIG90aGVyIHNvdXJjZQotICAvLyB0aGF0IHdpbGwgcHJvdmlkZSB0aGUgaW5wdXRzIHRvIHRoZSBuZXVyYWwgbmV0d29yay4KLSAgLy8gTk9MSU5UTkVYVExJTkUocnVudGltZS1nbG9iYWwtdmFyaWFibGVzKQotICBzdGF0aWMgRmVhdHVyZVByb3ZpZGVyIHN0YXRpY19mZWF0dXJlX3Byb3ZpZGVyKGtGZWF0dXJlRWxlbWVudENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVfYnVmZmVyKTsKLSAgZmVhdHVyZV9wcm92aWRlciA9ICZzdGF0aWNfZmVhdHVyZV9wcm92aWRlcjsKLQotICBzdGF0aWMgUmVjb2duaXplQ29tbWFuZHMgc3RhdGljX3JlY29nbml6ZXI7Ci0gIHJlY29nbml6ZXIgPSAmc3RhdGljX3JlY29nbml6ZXI7Ci0KLSAgcHJldmlvdXNfdGltZSA9IDA7Ci19Ci0KLS8vIFRoZSBuYW1lIG9mIHRoaXMgZnVuY3Rpb24gaXMgaW1wb3J0YW50IGZvciBBcmR1aW5vIGNvbXBhdGliaWxpdHkuCi12b2lkIGxvb3AoKSB7Ci0gIC8vIEZldGNoIHRoZSBzcGVjdHJvZ3JhbSBmb3IgdGhlIGN1cnJlbnQgdGltZS4KLSAgY29uc3QgaW50MzJfdCBjdXJyZW50X3RpbWUgPSBMYXRlc3RBdWRpb1RpbWVzdGFtcCgpOwotICBpbnQgaG93X21hbnlfbmV3X3NsaWNlcyA9IDA7Ci0gIFRmTGl0ZVN0YXR1cyBmZWF0dXJlX3N0YXR1cyA9IGZlYXR1cmVfcHJvdmlkZXItPlBvcHVsYXRlRmVhdHVyZURhdGEoCi0gICAgICBwcmV2aW91c190aW1lLCBjdXJyZW50X3RpbWUsICZob3dfbWFueV9uZXdfc2xpY2VzKTsKLSAgaWYgKGZlYXR1cmVfc3RhdHVzICE9IGtUZkxpdGVPaykgewotICAgIE1pY3JvUHJpbnRmKCJGZWF0dXJlIGdlbmVyYXRpb24gZmFpbGVkIik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHByZXZpb3VzX3RpbWUgPSBjdXJyZW50X3RpbWU7Ci0gIC8vIElmIG5vIG5ldyBhdWRpbyBzYW1wbGVzIGhhdmUgYmVlbiByZWNlaXZlZCBzaW5jZSBsYXN0IHRpbWUsIGRvbid0IGJvdGhlcgotICAvLyBydW5uaW5nIHRoZSBuZXR3b3JrIG1vZGVsLgotICBpZiAoaG93X21hbnlfbmV3X3NsaWNlcyA9PSAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gQ29weSBmZWF0dXJlIGJ1ZmZlciB0byBpbnB1dCB0ZW5zb3IKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrRmVhdHVyZUVsZW1lbnRDb3VudDsgaSsrKSB7Ci0gICAgbW9kZWxfaW5wdXRfYnVmZmVyW2ldID0gZmVhdHVyZV9idWZmZXJbaV07Ci0gIH0KLQotICAvLyBSdW4gdGhlIG1vZGVsIG9uIHRoZSBzcGVjdHJvZ3JhbSBpbnB1dCBhbmQgbWFrZSBzdXJlIGl0IHN1Y2NlZWRzLgotICBUZkxpdGVTdGF0dXMgaW52b2tlX3N0YXR1cyA9IGludGVycHJldGVyLT5JbnZva2UoKTsKLSAgaWYgKGludm9rZV9zdGF0dXMgIT0ga1RmTGl0ZU9rKSB7Ci0gICAgTWljcm9QcmludGYoIkludm9rZSBmYWlsZWQiKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBPYnRhaW4gYSBwb2ludGVyIHRvIHRoZSBvdXRwdXQgdGVuc29yCi0gIFRmTGl0ZVRlbnNvciogb3V0cHV0ID0gaW50ZXJwcmV0ZXItPm91dHB1dCgwKTsKLSAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgYSBjb21tYW5kIHdhcyByZWNvZ25pemVkIGJhc2VkIG9uIHRoZSBvdXRwdXQgb2YgaW5mZXJlbmNlCi0gIGNvbnN0IGNoYXIqIGZvdW5kX2NvbW1hbmQgPSBudWxscHRyOwotICB1aW50OF90IHNjb3JlID0gMDsKLSAgYm9vbCBpc19uZXdfY29tbWFuZCA9IGZhbHNlOwotICBUZkxpdGVTdGF0dXMgcHJvY2Vzc19zdGF0dXMgPSByZWNvZ25pemVyLT5Qcm9jZXNzTGF0ZXN0UmVzdWx0cygKLSAgICAgIG91dHB1dCwgY3VycmVudF90aW1lLCAmZm91bmRfY29tbWFuZCwgJnNjb3JlLCAmaXNfbmV3X2NvbW1hbmQpOwotICBpZiAocHJvY2Vzc19zdGF0dXMgIT0ga1RmTGl0ZU9rKSB7Ci0gICAgTWljcm9QcmludGYoIlJlY29nbml6ZUNvbW1hbmRzOjpQcm9jZXNzTGF0ZXN0UmVzdWx0cygpIGZhaWxlZCIpOwotICAgIHJldHVybjsKLSAgfQotICAvLyBEbyBzb21ldGhpbmcgYmFzZWQgb24gdGhlIHJlY29nbml6ZWQgY29tbWFuZC4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLSAgLy8ganVzdCBwcmludHMgdG8gdGhlIGVycm9yIGNvbnNvbGUsIGJ1dCB5b3Ugc2hvdWxkIHJlcGxhY2UgdGhpcyB3aXRoIHlvdXIKLSAgLy8gb3duIGZ1bmN0aW9uIGZvciBhIHJlYWwgYXBwbGljYXRpb24uCi0gIFJlc3BvbmRUb0NvbW1hbmQoY3VycmVudF90aW1lLCBmb3VuZF9jb21tYW5kLCBzY29yZSwgaXNfbmV3X2NvbW1hbmQpOwotfQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9tYWluX2Z1bmN0aW9ucy5oIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9tYWluX2Z1bmN0aW9ucy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWMwNjc3Li4wMDAwMDAwCi0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWFpbl9mdW5jdGlvbnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDE5IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoteW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0jaWZuZGVmIFRFTlNPUkZMT1dfTElURV9NSUNST19FWEFNUExFU19NSUNST19TUEVFQ0hfTUFJTl9GVU5DVElPTlNfSF8KLSNkZWZpbmUgVEVOU09SRkxPV19MSVRFX01JQ1JPX0VYQU1QTEVTX01JQ1JPX1NQRUVDSF9NQUlOX0ZVTkNUSU9OU19IXwotCi0vLyBFeHBvc2UgYSBDIGZyaWVuZGx5IGludGVyZmFjZSBmb3IgbWFpbiBmdW5jdGlvbnMuCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8vIEluaXRpYWxpemVzIGFsbCBkYXRhIG5lZWRlZCBmb3IgdGhlIGV4YW1wbGUuIFRoZSBuYW1lIGlzIGltcG9ydGFudCwgYW5kIG5lZWRzCi0vLyB0byBiZSBzZXR1cCgpIGZvciBBcmR1aW5vIGNvbXBhdGliaWxpdHkuCi12b2lkIHNldHVwKCk7Ci0KLS8vIFJ1bnMgb25lIGl0ZXJhdGlvbiBvZiBkYXRhIGdhdGhlcmluZyBhbmQgaW5mZXJlbmNlLiBUaGlzIHNob3VsZCBiZSBjYWxsZWQKLS8vIHJlcGVhdGVkbHkgZnJvbSB0aGUgYXBwbGljYXRpb24gY29kZS4gVGhlIG5hbWUgbmVlZHMgdG8gYmUgbG9vcCgpIGZvciBBcmR1aW5vCi0vLyBjb21wYXRpYmlsaXR5Lgotdm9pZCBsb29wKCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmCi0KLSNlbmRpZiAgLy8gVEVOU09SRkxPV19MSVRFX01JQ1JPX0VYQU1QTEVTX01JQ1JPX1NQRUVDSF9NQUlOX0ZVTkNUSU9OU19IXwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlcy9CVUlMRCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMvQlVJTEQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNzc0MzUuLjAwMDAwMDAKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlcy9CVUlMRAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLSMgTGlicmFyeSBmb3IgZ2VuZXJhdGluZyBmZWF0dXJlIHZlY3RvcnMgZnJvbSBhdWRpbyBkYXRhCi1wYWNrYWdlKAotICAgIGRlZmF1bHRfdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdLAotICAgICMgRGlzYWJsaW5nIGxheWVyaW5nX2NoZWNrIGJlY2F1c2Ugb2YgaHR0cDovL2IvMTc3MjU3MzMyCi0gICAgZmVhdHVyZXMgPSBbIi1sYXllcmluZ19jaGVjayJdLAotICAgIGxpY2Vuc2VzID0gWyJub3RpY2UiXSwKLSkKLQotY2NfbGlicmFyeSgKLSAgICBuYW1lID0gIm1pY3JvX21vZGVsX3NldHRpbmdzIiwKLSAgICBzcmNzID0gWwotICAgICAgICAibWljcm9fbW9kZWxfc2V0dGluZ3MuY2MiLAotICAgIF0sCi0gICAgaGRycyA9IFsKLSAgICAgICAgIm1pY3JvX21vZGVsX3NldHRpbmdzLmgiLAotICAgIF0sCi0pCi0KLWNjX2xpYnJhcnkoCi0gICAgbmFtZSA9ICJtaWNyb19mZWF0dXJlc190ZXN0X2RhdGEiLAotICAgIHNyY3MgPSBbCi0gICAgICAgICJub19taWNyb19mZWF0dXJlc19kYXRhLmNjIiwKLSAgICAgICAgInllc19taWNyb19mZWF0dXJlc19kYXRhLmNjIiwKLSAgICBdLAotICAgIGhkcnMgPSBbCi0gICAgICAgICJub19taWNyb19mZWF0dXJlc19kYXRhLmgiLAotICAgICAgICAieWVzX21pY3JvX2ZlYXR1cmVzX2RhdGEuaCIsCi0gICAgXSwKLSkKLQotY2NfbGlicmFyeSgKLSAgICBuYW1lID0gIm1pY3JvX2ZlYXR1cmVzX2dlbmVyYXRvciIsCi0gICAgc3JjcyA9IFsKLSAgICAgICAgIm1pY3JvX2ZlYXR1cmVzX2dlbmVyYXRvci5jYyIsCi0gICAgXSwKLSAgICBoZHJzID0gWwotICAgICAgICAibWljcm9fZmVhdHVyZXNfZ2VuZXJhdG9yLmgiLAotICAgIF0sCi0gICAgZGVwcyA9IFsKLSAgICAgICAgIjptaWNyb19tb2RlbF9zZXR0aW5ncyIsCi0gICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9jOmNvbW1vbiIsCi0gICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9leHBlcmltZW50YWwvbWljcm9mcm9udGVuZC9saWI6ZnJvbnRlbmQiLAotICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm86bWljcm9fbG9nIiwKLSAgICBdLAotKQotCi1jY19saWJyYXJ5KAotICAgIG5hbWUgPSAibWljcm9fZmVhdHVyZXNfZ2VuZXJhdG9yX3Rlc3RfZGF0YSIsCi0gICAgc3JjcyA9IFsKLSAgICAgICAgIm5vX2ZlYXR1cmVfZGF0YV9zbGljZS5jYyIsCi0gICAgICAgICJ5ZXNfZmVhdHVyZV9kYXRhX3NsaWNlLmNjIiwKLSAgICBdLAotICAgIGhkcnMgPSBbCi0gICAgICAgICJub19mZWF0dXJlX2RhdGFfc2xpY2UuaCIsCi0gICAgICAgICJ5ZXNfZmVhdHVyZV9kYXRhX3NsaWNlLmgiLAotICAgIF0sCi0pCi0KLWNjX3Rlc3QoCi0gICAgbmFtZSA9ICJtaWNyb19mZWF0dXJlc19nZW5lcmF0b3JfdGVzdCIsCi0gICAgc2l6ZSA9ICJzbWFsbCIsCi0gICAgc3JjcyA9IFsKLSAgICAgICAgIm1pY3JvX2ZlYXR1cmVzX2dlbmVyYXRvcl90ZXN0LmNjIiwKLSAgICBdLAotICAgIHRhZ3MgPSBbCi0gICAgICAgICJub2FzYW4iLCAgIyBUT0RPKGIvMTc5OTMwNjA3KTogRml4IHdpdGggYXNhbi4KLSAgICBdLAotICAgIGRlcHMgPSBbCi0gICAgICAgICI6bWljcm9fZmVhdHVyZXNfZ2VuZXJhdG9yIiwKLSAgICAgICAgIjptaWNyb19mZWF0dXJlc19nZW5lcmF0b3JfdGVzdF9kYXRhIiwKLSAgICAgICAgIjptaWNyb19tb2RlbF9zZXR0aW5ncyIsCi0gICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9jOmNvbW1vbiIsCi0gICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNybzptaWNyb19mcmFtZXdvcmsiLAotICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm86bWljcm9fbG9nIiwKLSAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaDphdWRpb19zYW1wbGVfdGVzdF9kYXRhIiwKLSAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvL3Rlc3Rpbmc6bWljcm9fdGVzdCIsCi0gICAgXSwKLSkKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMvbWljcm9fZmVhdHVyZXNfZ2VuZXJhdG9yLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlcy9taWNyb19mZWF0dXJlc19nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNkYmI1ZDMuLjAwMDAwMDAKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlcy9taWNyb19mZWF0dXJlc19nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMTkgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci15b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzL21pY3JvX2ZlYXR1cmVzX2dlbmVyYXRvci5oIgotCi0jaW5jbHVkZSA8Y21hdGg+Ci0jaW5jbHVkZSA8Y3N0cmluZz4KLQotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9leHBlcmltZW50YWwvbWljcm9mcm9udGVuZC9saWIvZnJvbnRlbmQuaCIKLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvZXhwZXJpbWVudGFsL21pY3JvZnJvbnRlbmQvbGliL2Zyb250ZW5kX3V0aWwuaCIKLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzL21pY3JvX21vZGVsX3NldHRpbmdzLmgiCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2xvZy5oIgotCi1uYW1lc3BhY2UgewotCi1Gcm9udGVuZFN0YXRlIGdfbWljcm9fZmVhdHVyZXNfc3RhdGU7Ci1ib29sIGdfaXNfZmlyc3RfdGltZSA9IHRydWU7Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1UZkxpdGVTdGF0dXMgSW5pdGlhbGl6ZU1pY3JvRmVhdHVyZXMoKSB7Ci0gIEZyb250ZW5kQ29uZmlnIGNvbmZpZzsKLSAgY29uZmlnLndpbmRvdy5zaXplX21zID0ga0ZlYXR1cmVTbGljZUR1cmF0aW9uTXM7Ci0gIGNvbmZpZy53aW5kb3cuc3RlcF9zaXplX21zID0ga0ZlYXR1cmVTbGljZVN0cmlkZU1zOwotICBjb25maWcubm9pc2VfcmVkdWN0aW9uLnNtb290aGluZ19iaXRzID0gMTA7Ci0gIGNvbmZpZy5maWx0ZXJiYW5rLm51bV9jaGFubmVscyA9IGtGZWF0dXJlU2xpY2VTaXplOwotICBjb25maWcuZmlsdGVyYmFuay5sb3dlcl9iYW5kX2xpbWl0ID0gMTI1LjA7Ci0gIGNvbmZpZy5maWx0ZXJiYW5rLnVwcGVyX2JhbmRfbGltaXQgPSA3NTAwLjA7Ci0gIGNvbmZpZy5ub2lzZV9yZWR1Y3Rpb24uc21vb3RoaW5nX2JpdHMgPSAxMDsKLSAgY29uZmlnLm5vaXNlX3JlZHVjdGlvbi5ldmVuX3Ntb290aGluZyA9IDAuMDI1OwotICBjb25maWcubm9pc2VfcmVkdWN0aW9uLm9kZF9zbW9vdGhpbmcgPSAwLjA2OwotICBjb25maWcubm9pc2VfcmVkdWN0aW9uLm1pbl9zaWduYWxfcmVtYWluaW5nID0gMC4wNTsKLSAgY29uZmlnLnBjYW5fZ2Fpbl9jb250cm9sLmVuYWJsZV9wY2FuID0gMTsKLSAgY29uZmlnLnBjYW5fZ2Fpbl9jb250cm9sLnN0cmVuZ3RoID0gMC45NTsKLSAgY29uZmlnLnBjYW5fZ2Fpbl9jb250cm9sLm9mZnNldCA9IDgwLjA7Ci0gIGNvbmZpZy5wY2FuX2dhaW5fY29udHJvbC5nYWluX2JpdHMgPSAyMTsKLSAgY29uZmlnLmxvZ19zY2FsZS5lbmFibGVfbG9nID0gMTsKLSAgY29uZmlnLmxvZ19zY2FsZS5zY2FsZV9zaGlmdCA9IDY7Ci0gIGlmICghRnJvbnRlbmRQb3B1bGF0ZVN0YXRlKCZjb25maWcsICZnX21pY3JvX2ZlYXR1cmVzX3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQXVkaW9TYW1wbGVGcmVxdWVuY3kpKSB7Ci0gICAgTWljcm9QcmludGYoIkZyb250ZW5kUG9wdWxhdGVTdGF0ZSgpIGZhaWxlZCIpOwotICAgIHJldHVybiBrVGZMaXRlRXJyb3I7Ci0gIH0KLSAgZ19pc19maXJzdF90aW1lID0gdHJ1ZTsKLSAgcmV0dXJuIGtUZkxpdGVPazsKLX0KLQotLy8gVGhpcyBpcyBub3QgZXhwb3NlZCBpbiBhbnkgaGVhZGVyLCBhbmQgaXMgb25seSB1c2VkIGZvciB0ZXN0aW5nLCB0byBlbnN1cmUKLS8vIHRoYXQgdGhlIHN0YXRlIGlzIGNvcnJlY3RseSBzZXQgdXAgYmVmb3JlIGdlbmVyYXRpbmcgcmVzdWx0cy4KLXZvaWQgU2V0TWljcm9GZWF0dXJlc05vaXNlRXN0aW1hdGVzKGNvbnN0IHVpbnQzMl90KiBlc3RpbWF0ZV9wcmVzZXRzKSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZ19taWNyb19mZWF0dXJlc19zdGF0ZS5maWx0ZXJiYW5rLm51bV9jaGFubmVsczsgKytpKSB7Ci0gICAgZ19taWNyb19mZWF0dXJlc19zdGF0ZS5ub2lzZV9yZWR1Y3Rpb24uZXN0aW1hdGVbaV0gPSBlc3RpbWF0ZV9wcmVzZXRzW2ldOwotICB9Ci19Ci0KLVRmTGl0ZVN0YXR1cyBHZW5lcmF0ZU1pY3JvRmVhdHVyZXMoY29uc3QgaW50MTZfdCogaW5wdXQsIGludCBpbnB1dF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0cHV0X3NpemUsIGludDhfdCogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIG51bV9zYW1wbGVzX3JlYWQpIHsKLSAgY29uc3QgaW50MTZfdCogZnJvbnRlbmRfaW5wdXQ7Ci0gIGlmIChnX2lzX2ZpcnN0X3RpbWUpIHsKLSAgICBmcm9udGVuZF9pbnB1dCA9IGlucHV0OwotICAgIGdfaXNfZmlyc3RfdGltZSA9IGZhbHNlOwotICB9IGVsc2UgewotICAgIGZyb250ZW5kX2lucHV0ID0gaW5wdXQgKyAxNjA7Ci0gIH0KLSAgRnJvbnRlbmRPdXRwdXQgZnJvbnRlbmRfb3V0cHV0ID0gRnJvbnRlbmRQcm9jZXNzU2FtcGxlcygKLSAgICAgICZnX21pY3JvX2ZlYXR1cmVzX3N0YXRlLCBmcm9udGVuZF9pbnB1dCwgaW5wdXRfc2l6ZSwgbnVtX3NhbXBsZXNfcmVhZCk7Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmcm9udGVuZF9vdXRwdXQuc2l6ZTsgKytpKSB7Ci0gICAgLy8gVGhlc2Ugc2NhbGluZyB2YWx1ZXMgYXJlIGRlcml2ZWQgZnJvbSB0aG9zZSB1c2VkIGluIGlucHV0X2RhdGEucHkgaW4gdGhlCi0gICAgLy8gdHJhaW5pbmcgcGlwZWxpbmUuCi0gICAgLy8gVGhlIGZlYXR1cmUgcGlwZWxpbmUgb3V0cHV0cyAxNi1iaXQgc2lnbmVkIGludGVnZXJzIGluIHJvdWdobHkgYSAwIHRvIDY3MAotICAgIC8vIHJhbmdlLiBJbiB0cmFpbmluZywgdGhlc2UgYXJlIHRoZW4gYXJiaXRyYXJpbHkgZGl2aWRlZCBieSAyNS42IHRvIGdldAotICAgIC8vIGZsb2F0IHZhbHVlcyBpbiB0aGUgcm91Z2ggcmFuZ2Ugb2YgMC4wIHRvIDI2LjAuIFRoaXMgc2NhbGluZyBpcyBwZXJmb3JtZWQKLSAgICAvLyBmb3IgaGlzdG9yaWNhbCByZWFzb25zLCB0byBtYXRjaCB1cCB3aXRoIHRoZSBvdXRwdXQgb2Ygb3RoZXIgZmVhdHVyZQotICAgIC8vIGdlbmVyYXRvcnMuCi0gICAgLy8gVGhlIHByb2Nlc3MgaXMgdGhlbiBmdXJ0aGVyIGNvbXBsaWNhdGVkIHdoZW4gd2UgcXVhbnRpemUgdGhlIG1vZGVsLiBUaGlzCi0gICAgLy8gbWVhbnMgd2UgaGF2ZSB0byBzY2FsZSB0aGUgMC4wIHRvIDI2LjAgcmVhbCB2YWx1ZXMgdG8gdGhlIC0xMjggdG8gMTI3Ci0gICAgLy8gc2lnbmVkIGludGVnZXIgbnVtYmVycy4KLSAgICAvLyBBbGwgdGhpcyBtZWFucyB0aGF0IHRvIGdldCBtYXRjaGluZyB2YWx1ZXMgZnJvbSBvdXIgaW50ZWdlciBmZWF0dXJlCi0gICAgLy8gb3V0cHV0IGludG8gdGhlIHRlbnNvciBpbnB1dCwgd2UgaGF2ZSB0byBwZXJmb3JtOgotICAgIC8vIGlucHV0ID0gKCgoZmVhdHVyZSAvIDI1LjYpIC8gMjYuMCkgKiAyNTYpIC0gMTI4Ci0gICAgLy8gVG8gc2ltcGxpZnkgdGhpcyBhbmQgcGVyZm9ybSBpdCBpbiAzMi1iaXQgaW50ZWdlciBtYXRoLCB3ZSByZWFycmFuZ2UgdG86Ci0gICAgLy8gaW5wdXQgPSAoZmVhdHVyZSAqIDI1NikgLyAoMjUuNiAqIDI2LjApIC0gMTI4Ci0gICAgY29uc3RleHByIGludDMyX3QgdmFsdWVfc2NhbGUgPSAyNTY7Ci0gICAgY29uc3RleHByIGludDMyX3QgdmFsdWVfZGl2ID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oKDI1LjZmICogMjYuMGYpICsgMC41Zik7Ci0gICAgaW50MzJfdCB2YWx1ZSA9Ci0gICAgICAgICgoZnJvbnRlbmRfb3V0cHV0LnZhbHVlc1tpXSAqIHZhbHVlX3NjYWxlKSArICh2YWx1ZV9kaXYgLyAyKSkgLwotICAgICAgICB2YWx1ZV9kaXY7Ci0gICAgdmFsdWUgLT0gMTI4OwotICAgIGlmICh2YWx1ZSA8IC0xMjgpIHsKLSAgICAgIHZhbHVlID0gLTEyODsKLSAgICB9Ci0gICAgaWYgKHZhbHVlID4gMTI3KSB7Ci0gICAgICB2YWx1ZSA9IDEyNzsKLSAgICB9Ci0gICAgb3V0cHV0W2ldID0gdmFsdWU7Ci0gIH0KLQotICByZXR1cm4ga1RmTGl0ZU9rOwotfQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlcy9taWNyb19mZWF0dXJlc19nZW5lcmF0b3IuaCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMvbWljcm9fZmVhdHVyZXNfZ2VuZXJhdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlZTBkMmIuLjAwMDAwMDAKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlcy9taWNyb19mZWF0dXJlc19nZW5lcmF0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDE5IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoteW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0jaWZuZGVmIFRFTlNPUkZMT1dfTElURV9NSUNST19FWEFNUExFU19NSUNST19TUEVFQ0hfTUlDUk9fRkVBVFVSRVNfTUlDUk9fRkVBVFVSRVNfR0VORVJBVE9SX0hfCi0jZGVmaW5lIFRFTlNPUkZMT1dfTElURV9NSUNST19FWEFNUExFU19NSUNST19TUEVFQ0hfTUlDUk9fRkVBVFVSRVNfTUlDUk9fRkVBVFVSRVNfR0VORVJBVE9SX0hfCi0KLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvYy9jb21tb24uaCIKLQotLy8gU2V0cyB1cCBhbnkgcmVzb3VyY2VzIG5lZWRlZCBmb3IgdGhlIGZlYXR1cmUgZ2VuZXJhdGlvbiBwaXBlbGluZS4KLVRmTGl0ZVN0YXR1cyBJbml0aWFsaXplTWljcm9GZWF0dXJlcygpOwotCi0vLyBDb252ZXJ0cyBhdWRpbyBzYW1wbGUgZGF0YSBpbnRvIGEgbW9yZSBjb21wYWN0IGZvcm0gdGhhdCdzIGFwcHJvcHJpYXRlIGZvcgotLy8gZmVlZGluZyBpbnRvIGEgbmV1cmFsIG5ldHdvcmsuCi1UZkxpdGVTdGF0dXMgR2VuZXJhdGVNaWNyb0ZlYXR1cmVzKGNvbnN0IGludDE2X3QqIGlucHV0LCBpbnQgaW5wdXRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dHB1dF9zaXplLCBpbnQ4X3QqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiBudW1fc2FtcGxlc19yZWFkKTsKLQotI2VuZGlmICAvLyBURU5TT1JGTE9XX0xJVEVfTUlDUk9fRVhBTVBMRVNfTUlDUk9fU1BFRUNIX01JQ1JPX0ZFQVRVUkVTX01JQ1JPX0ZFQVRVUkVTX0dFTkVSQVRPUl9IXwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlcy9taWNyb19mZWF0dXJlc19nZW5lcmF0b3JfdGVzdC5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMvbWljcm9fZmVhdHVyZXNfZ2VuZXJhdG9yX3Rlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0MWM0NGYuLjAwMDAwMDAKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlcy9taWNyb19mZWF0dXJlc19nZW5lcmF0b3JfdGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDk1ICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDE5IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoteW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlcy9taWNyb19mZWF0dXJlc19nZW5lcmF0b3IuaCIKLQotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9jL2NvbW1vbi5oIgotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMvbm9fZmVhdHVyZV9kYXRhX3NsaWNlLmgiCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlcy95ZXNfZmVhdHVyZV9kYXRhX3NsaWNlLmgiCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC90ZXN0ZGF0YS9ub18zMG1zX2F1ZGlvX2RhdGEuaCIKLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3Rlc3RkYXRhL3llc18zMG1zX2F1ZGlvX2RhdGEuaCIKLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fbG9nLmgiCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL3Rlc3RpbmcvbWljcm9fdGVzdC5oIgotCi0vLyBUaGlzIGlzIGEgdGVzdC1vbmx5IEFQSSwgbm90IGV4cG9zZWQgaW4gYW55IHB1YmxpYyBoZWFkZXJzLCBzbyBkZWNsYXJlIGl0Lgotdm9pZCBTZXRNaWNyb0ZlYXR1cmVzTm9pc2VFc3RpbWF0ZXMoY29uc3QgdWludDMyX3QqIGVzdGltYXRlX3ByZXNldHMpOwotCi1URl9MSVRFX01JQ1JPX1RFU1RTX0JFR0lOCi0KLVRGX0xJVEVfTUlDUk9fVEVTVChUZXN0TWljcm9GZWF0dXJlc0dlbmVyYXRvclllcykgewotICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUShrVGZMaXRlT2ssIEluaXRpYWxpemVNaWNyb0ZlYXR1cmVzKCkpOwotCi0gIC8vIFRoZSBtaWNybyBmZWF0dXJlcyBwaXBlbGluZSByZXRhaW5zIHN0YXRlIGZyb20gcHJldmlvdXMgY2FsbHMgdG8gaGVscAotICAvLyBlc3RpbWF0ZSB0aGUgYmFja2dyb3VuZCBub2lzZS4gVW5mb3J0dW5hdGVseSB0aGlzIG1ha2VzIGl0IGhhcmRlciB0bwotICAvLyBleGFjdGx5IHJlcHJvZHVjZSByZXN1bHRzIGluIGEgdGVzdCBlbnZpcm9ubWVudCwgc28gdXNlIGEga25vd24gc25hcHNob3QKLSAgLy8gb2YgdGhlIHBhcmFtZXRlcnMgYXQgdGhlIHBvaW50IHRoYXQgdGhlIGdvbGRlbiBmZWF0dXJlIHZhbHVlcyB3ZXJlCi0gIC8vIGNyZWF0ZWQuCi0gIGNvbnN0IHVpbnQzMl90IHllc19lc3RpbWF0ZV9wcmVzZXRzW10gPSB7Ci0gICAgICAxMDYyODk4LCAyNjQ0NDc3LCAxMjU3NjQyLCAxODY0NzE4LCA0MTI3MjIsIDcyNTcwMywgMzk1NzIxLCA0NzQwODIsCi0gICAgICAxNzMwNDYsICAyNTU4NTYsICAxNTg5NjYsICAxNTM3MzYsICA2OTE4MSwgIDE5OTEwMCwgMTQ0NDkzLCAyMjc3NDAsCi0gICAgICAxMTA1NzMsICAxNjQzMzAsICA3OTY2NiwgICAxNDQ2NTAsICAxMjI5NDcsIDQ3Njc5OSwgMzk4NTUzLCA0OTc0OTMsCi0gICAgICAzMjIxNTIsICAxMTQwMDA1LCA1NjY3MTYsICA2OTA2MDUsICAzMDg5MDIsIDM0NzQ4MSwgMTA5ODkxLCAxNzA0NTcsCi0gICAgICA3MzkwMSwgICAxMDA5NzUsICA0Mjk2MywgICA3MjMyNSwgICAzNDE4MywgIDIwMjA3LCAgNjY0MCwgICA5NDY4LAotICB9OwotICBTZXRNaWNyb0ZlYXR1cmVzTm9pc2VFc3RpbWF0ZXMoeWVzX2VzdGltYXRlX3ByZXNldHMpOwotCi0gIGludDhfdCB5ZXNfY2FsY3VsYXRlZF9kYXRhW2dfeWVzX2ZlYXR1cmVfZGF0YV9zbGljZV9zaXplXSA9IHt9OwotICBzaXplX3QgbnVtX3NhbXBsZXNfcmVhZCA9IDA7Ci0gIFRmTGl0ZVN0YXR1cyB5ZXNfc3RhdHVzID0gR2VuZXJhdGVNaWNyb0ZlYXR1cmVzKAotICAgICAgZ195ZXNfMzBtc19hdWRpb19kYXRhLCBnX3llc18zMG1zX2F1ZGlvX2RhdGFfc2l6ZSwKLSAgICAgIGdfeWVzX2ZlYXR1cmVfZGF0YV9zbGljZV9zaXplLCB5ZXNfY2FsY3VsYXRlZF9kYXRhLCAmbnVtX3NhbXBsZXNfcmVhZCk7Ci0gIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKGtUZkxpdGVPaywgeWVzX3N0YXR1cyk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBnX3llc19mZWF0dXJlX2RhdGFfc2xpY2Vfc2l6ZTsgKytpKSB7Ci0gICAgY29uc3QgaW50IGV4cGVjdGVkID0gZ195ZXNfZmVhdHVyZV9kYXRhX3NsaWNlW2ldOwotICAgIGNvbnN0IGludCBhY3R1YWwgPSB5ZXNfY2FsY3VsYXRlZF9kYXRhW2ldOwotICAgIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKGV4cGVjdGVkLCBhY3R1YWwpOwotICAgIGlmIChleHBlY3RlZCAhPSBhY3R1YWwpIHsKLSAgICAgIE1pY3JvUHJpbnRmKCJFeHBlY3RlZCB2YWx1ZSAlZCBidXQgZm91bmQgJWQiLCBleHBlY3RlZCwgYWN0dWFsKTsKLSAgICB9Ci0gIH0KLX0KLQotVEZfTElURV9NSUNST19URVNUKFRlc3RNaWNyb0ZlYXR1cmVzR2VuZXJhdG9yTm8pIHsKLSAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoa1RmTGl0ZU9rLCBJbml0aWFsaXplTWljcm9GZWF0dXJlcygpKTsKLSAgLy8gQXMgd2UgZGlkIGZvciB0aGUgcHJldmlvdXMgZmVhdHVyZXMsIHNldCBrbm93biBnb29kIG5vaXNlIHN0YXRlCi0gIC8vIHBhcmFtZXRlcnMuCi0gIGNvbnN0IHVpbnQzMl90IG5vX2VzdGltYXRlX3ByZXNldHNbXSA9IHsKLSAgICAgIDI1NjM5NjQsIDE5MDkzOTMsIDU1OTgwMSwgNTM4NjcwLCAyMDM2NDMsIDE3NTk1OSwgNzUwODgsIDEzOTQ5MSwKLSAgICAgIDU5NjkxLCAgIDk1MzA3LCAgIDQzODY1LCAgMTI5MjYzLCA1MjUxNywgIDgwMDU4LCAgNTEzMzAsIDEwMDczMSwKLSAgICAgIDc2Njc0LCAgIDc2MjYyLCAgIDE1NDk3LCAgMjI1OTgsICAxMzc3OCwgIDIxNDYwLCAgODk0NiwgIDE3ODA2LAotICAgICAgMTAwMjMsICAgMTg4MTAsICAgODAwMiwgICAxMDg0MiwgIDc1NzgsICAgOTk4MywgICA2MjY3LCAgMTA3NTksCi0gICAgICA4OTQ2LCAgICAxODQ4OCwgICA5NjkxLCAgIDM5Nzg1LCAgOTkzOSwgICAxNzgzNSwgIDk2NzEsICAxODUxMiwKLSAgfTsKLSAgU2V0TWljcm9GZWF0dXJlc05vaXNlRXN0aW1hdGVzKG5vX2VzdGltYXRlX3ByZXNldHMpOwotCi0gIGludDhfdCBub19jYWxjdWxhdGVkX2RhdGFbZ19ub19mZWF0dXJlX2RhdGFfc2xpY2Vfc2l6ZV0gPSB7fTsKLSAgc2l6ZV90IG51bV9zYW1wbGVzX3JlYWQgPSAwOwotICBUZkxpdGVTdGF0dXMgbm9fc3RhdHVzID0gR2VuZXJhdGVNaWNyb0ZlYXR1cmVzKAotICAgICAgZ19ub18zMG1zX2F1ZGlvX2RhdGEsIGdfbm9fMzBtc19hdWRpb19kYXRhX3NpemUsCi0gICAgICBnX25vX2ZlYXR1cmVfZGF0YV9zbGljZV9zaXplLCBub19jYWxjdWxhdGVkX2RhdGEsICZudW1fc2FtcGxlc19yZWFkKTsKLSAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoa1RmTGl0ZU9rLCBub19zdGF0dXMpOwotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZ19ub19mZWF0dXJlX2RhdGFfc2xpY2Vfc2l6ZTsgKytpKSB7Ci0gICAgY29uc3QgaW50IGV4cGVjdGVkID0gZ19ub19mZWF0dXJlX2RhdGFfc2xpY2VbaV07Ci0gICAgY29uc3QgaW50IGFjdHVhbCA9IG5vX2NhbGN1bGF0ZWRfZGF0YVtpXTsKLSAgICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUShleHBlY3RlZCwgYWN0dWFsKTsKLSAgICBpZiAoZXhwZWN0ZWQgIT0gYWN0dWFsKSB7Ci0gICAgICBNaWNyb1ByaW50ZigiRXhwZWN0ZWQgdmFsdWUgJWQgYnV0IGZvdW5kICVkIiwgZXhwZWN0ZWQsIGFjdHVhbCk7Ci0gICAgfQotICB9Ci19Ci0KLVRGX0xJVEVfTUlDUk9fVEVTVFNfRU5ECmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzL21pY3JvX21vZGVsX3NldHRpbmdzLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlcy9taWNyb19tb2RlbF9zZXR0aW5ncy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdkMTJiYS4uMDAwMDAwMAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzL21pY3JvX21vZGVsX3NldHRpbmdzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMTggVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci15b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzL21pY3JvX21vZGVsX3NldHRpbmdzLmgiCi0KLWNvbnN0IGNoYXIqIGtDYXRlZ29yeUxhYmVsc1trQ2F0ZWdvcnlDb3VudF0gPSB7Ci0gICAgInNpbGVuY2UiLAotICAgICJ1bmtub3duIiwKLSAgICAieWVzIiwKLSAgICAibm8iLAotfTsKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMvbWljcm9fbW9kZWxfc2V0dGluZ3MuaCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMvbWljcm9fbW9kZWxfc2V0dGluZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU0MjIxMy4uMDAwMDAwMAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzL21pY3JvX21vZGVsX3NldHRpbmdzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi1MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLXlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLVlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotI2lmbmRlZiBURU5TT1JGTE9XX0xJVEVfTUlDUk9fRVhBTVBMRVNfTUlDUk9fU1BFRUNIX01JQ1JPX0ZFQVRVUkVTX01JQ1JPX01PREVMX1NFVFRJTkdTX0hfCi0jZGVmaW5lIFRFTlNPUkZMT1dfTElURV9NSUNST19FWEFNUExFU19NSUNST19TUEVFQ0hfTUlDUk9fRkVBVFVSRVNfTUlDUk9fTU9ERUxfU0VUVElOR1NfSF8KLQotLy8gS2VlcGluZyB0aGVzZSBhcyBjb25zdGFudCBleHByZXNzaW9ucyBhbGxvdyB1cyB0byBhbGxvY2F0ZSBmaXhlZC1zaXplZCBhcnJheXMKLS8vIG9uIHRoZSBzdGFjayBmb3Igb3VyIHdvcmtpbmcgbWVtb3J5LgotCi0vLyBUaGUgc2l6ZSBvZiB0aGUgaW5wdXQgdGltZSBzZXJpZXMgZGF0YSB3ZSBwYXNzIHRvIHRoZSBGRlQgdG8gcHJvZHVjZSB0aGUKLS8vIGZyZXF1ZW5jeSBpbmZvcm1hdGlvbi4gVGhpcyBoYXMgdG8gYmUgYSBwb3dlciBvZiB0d28sIGFuZCBzaW5jZSB3ZSdyZSBkZWFsaW5nCi0vLyB3aXRoIDMwbXMgb2YgMTZLSHogaW5wdXRzLCB3aGljaCBtZWFucyA0ODAgc2FtcGxlcywgdGhpcyBpcyB0aGUgbmV4dCB2YWx1ZS4KLWNvbnN0ZXhwciBpbnQga01heEF1ZGlvU2FtcGxlU2l6ZSA9IDUxMjsKLWNvbnN0ZXhwciBpbnQga0F1ZGlvU2FtcGxlRnJlcXVlbmN5ID0gMTYwMDA7Ci0KLS8vIFRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBkZXJpdmVkIGZyb20gdmFsdWVzIHVzZWQgZHVyaW5nIG1vZGVsIHRyYWluaW5nLgotLy8gSWYgeW91IGNoYW5nZSB0aGUgd2F5IHlvdSBwcmVwcm9jZXNzIHRoZSBpbnB1dCwgdXBkYXRlIGFsbCB0aGVzZSBjb25zdGFudHMuCi1jb25zdGV4cHIgaW50IGtGZWF0dXJlU2xpY2VTaXplID0gNDA7Ci1jb25zdGV4cHIgaW50IGtGZWF0dXJlU2xpY2VDb3VudCA9IDQ5OwotY29uc3RleHByIGludCBrRmVhdHVyZUVsZW1lbnRDb3VudCA9IChrRmVhdHVyZVNsaWNlU2l6ZSAqIGtGZWF0dXJlU2xpY2VDb3VudCk7Ci1jb25zdGV4cHIgaW50IGtGZWF0dXJlU2xpY2VTdHJpZGVNcyA9IDIwOwotY29uc3RleHByIGludCBrRmVhdHVyZVNsaWNlRHVyYXRpb25NcyA9IDMwOwotCi0vLyBWYXJpYWJsZXMgZm9yIHRoZSBtb2RlbCdzIG91dHB1dCBjYXRlZ29yaWVzLgotY29uc3RleHByIGludCBrU2lsZW5jZUluZGV4ID0gMDsKLWNvbnN0ZXhwciBpbnQga1Vua25vd25JbmRleCA9IDE7Ci0vLyBJZiB5b3UgbW9kaWZ5IHRoZSBvdXRwdXQgY2F0ZWdvcmllcywgeW91IG5lZWQgdG8gdXBkYXRlIHRoZSBmb2xsb3dpbmcgdmFsdWVzLgotY29uc3RleHByIGludCBrQ2F0ZWdvcnlDb3VudCA9IDQ7Ci1leHRlcm4gY29uc3QgY2hhcioga0NhdGVnb3J5TGFiZWxzW2tDYXRlZ29yeUNvdW50XTsKLQotI2VuZGlmICAvLyBURU5TT1JGTE9XX0xJVEVfTUlDUk9fRVhBTVBMRVNfTUlDUk9fU1BFRUNIX01JQ1JPX0ZFQVRVUkVTX01JQ1JPX01PREVMX1NFVFRJTkdTX0hfCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzL25vX2ZlYXR1cmVfZGF0YV9zbGljZS5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMvbm9fZmVhdHVyZV9kYXRhX3NsaWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ODRmNzAyLi4wMDAwMDAwCi0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMvbm9fZmVhdHVyZV9kYXRhX3NsaWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMTkgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci15b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLS8vIFNlZSB0aGUgaGVhZGVyIGZvciBkb2N1bWVudGF0aW9uIG9uIHRoZSBtZWFuaW5nIG9mIHRoaXMgZGF0YS4KLQotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMvbm9fZmVhdHVyZV9kYXRhX3NsaWNlLmgiCi0KLWFsaWduYXMoMTYpIGNvbnN0IGludDhfdAotICAgIGdfbm9fZmVhdHVyZV9kYXRhX3NsaWNlW2dfbm9fZmVhdHVyZV9kYXRhX3NsaWNlX3NpemVdID0gewotICAgICAgICA4OSwgIDY4LCA5NiwgIDgzLCAxMTEsIDk2LCAxMTUsIDg3LCA5OSwgIDc2LCAxMDUsIDg0LCAxMDUsIDg2LAotICAgICAgICAxMTMsIDkxLCAxMDgsIDg3LCAxMTAsIDc4LCA4MCwgIDQ2LCAyMiwgIDc0LCA4OCwgIDcyLCAxMDMsIDg2LAotICAgICAgICA4MCwgIDY4LCA0OCwgIDI0LCA2OCwgIDQ4LCA1NSwgIDM2LCAxMDgsIDkwLCA5MCwgIDYzLAotfTsKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMvbm9fZmVhdHVyZV9kYXRhX3NsaWNlLmggYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzL25vX2ZlYXR1cmVfZGF0YV9zbGljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWU2NjA1Li4wMDAwMDAwCi0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMvbm9fZmVhdHVyZV9kYXRhX3NsaWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAxOSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi1MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLXlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLVlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotLy8gVGhpcyBkYXRhIHdhcyBleHRyYWN0ZWQgZnJvbSB0aGUgbGFyZ2VyIGZlYXR1cmUgZGF0YSBoZWxkIGluCi0vLyBub19mZWF0dXJlc19kYXRhLmNjIGFuZCBjb25zaXN0cyBvZiB0aGUgMjl0aCBzcGVjdHJvZ3JhbSBzbGljZSBvZiA0MyB2YWx1ZXMuCi0vLyBUaGlzIGlzIHRoZSBleHBlY3RlZCByZXN1bHQgb2YgcnVubmluZyB0aGUgc2FtcGxlIGRhdGEgaW4KLS8vIG5vXzMwbXNfc2FtcGxlX2RhdGEuY2MgdGhyb3VnaCB0aGUgcHJlcHJvY2Vzc2luZyBwaXBlbGluZS4KLQotI2lmbmRlZiBURU5TT1JGTE9XX0xJVEVfTUlDUk9fRVhBTVBMRVNfTUlDUk9fU1BFRUNIX01JQ1JPX0ZFQVRVUkVTX05PX0ZFQVRVUkVfREFUQV9TTElDRV9IXwotI2RlZmluZSBURU5TT1JGTE9XX0xJVEVfTUlDUk9fRVhBTVBMRVNfTUlDUk9fU1BFRUNIX01JQ1JPX0ZFQVRVUkVTX05PX0ZFQVRVUkVfREFUQV9TTElDRV9IXwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotY29uc3RleHByIGludCBnX25vX2ZlYXR1cmVfZGF0YV9zbGljZV9zaXplID0gNDA7Ci1leHRlcm4gY29uc3QgaW50OF90IGdfbm9fZmVhdHVyZV9kYXRhX3NsaWNlW107Ci0KLSNlbmRpZiAgLy8gVEVOU09SRkxPV19MSVRFX01JQ1JPX0VYQU1QTEVTX01JQ1JPX1NQRUVDSF9NSUNST19GRUFUVVJFU19OT19GRUFUVVJFX0RBVEFfU0xJQ0VfSF8KZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMvbm9fbWljcm9fZmVhdHVyZXNfZGF0YS5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMvbm9fbWljcm9fZmVhdHVyZXNfZGF0YS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ4MTQ4Ni4uMDAwMDAwMAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzL25vX21pY3JvX2ZlYXR1cmVzX2RhdGEuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMTkgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci15b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzL25vX21pY3JvX2ZlYXR1cmVzX2RhdGEuaCIKLQotLy8gR29sZGVuIHRlc3QgdmFsdWVzIGZvciB0aGUgZXhwZWN0ZWQgc3BlY3Ryb2dyYW0gZnJvbSBhICJubyIgc2FtcGxlIGZpbGUKLS8vIHNwZWVjaF9jb21tYW5kc190ZXN0X3NldF92MC4wMi9uby9mOTY0M2Q0Ml9ub2hhc2hfNC53YXYuCi0KLWNvbnN0IGludCBnX25vX21pY3JvX2Y5NjQzZDQyX25vaGFzaF80X3dpZHRoID0gNDA7Ci1jb25zdCBpbnQgZ19ub19taWNyb19mOTY0M2Q0Ml9ub2hhc2hfNF9oZWlnaHQgPSA0OTsKLWFsaWduYXMoMTYpIGNvbnN0IHNpZ25lZCBjaGFyIGdfbm9fbWljcm9fZjk2NDNkNDJfbm9oYXNoXzRfZGF0YVtdID0gewotICAgIDEwMywgIDc4LCAgIDY0LCAgIDc2LCAgIDc1LCAgIDU0LCAgIDUzLCAgIDY3LCAgIDc3LCAgIDYwLCAgIDU2LCAgIDcwLAotICAgIDc2LCAgIDcxLCAgIDY4LCAgIDU4LCAgIDc0LCAgIDMyLCAgIDIzLCAgIC0yLCAgIC0xOCwgIDExLCAgIDEzLCAgIDE1LAotICAgIDksICAgIDIwLCAgIDUsICAgIC03LCAgIC0xOCwgIC0yLCAgIC0xMCwgIC0xOCwgIC0xMCwgIC0xMiwgIDksICAgIDcsCi0gICAgLTMzLCAgLTEyLCAgLTQsICAgLTE4LCAgNTcsICAgMTcsICAgNTUsICAgNjIsICAgNzAsICAgNDUsICAgNjEsICAgMzcsCi0gICAgNjcsICAgNTIsICAgNDgsICAgNDcsICAgNTUsICAgNDYsICAgNTcsICAgNDcsICAgNzMsICAgMTcsICAgMjcsICAgMjAsCi0gICAgMTksICAgOCwgICAgMTUsICAgLTYsICAgLTEsICAgMTAsICAgLTEyLCAgLTI5LCAgLTYsICAgLTIzLCAgLTE4LCAgLTMsCi0gICAgLTEsICAgNSwgICAgMywgICAgLTQsICAgLTEyLCAgLTgsICAgLTEsICAgLTE0LCAgNjUsICAgNDgsICAgNTgsICAgNDMsCi0gICAgNDgsICAgMTksICAgMzksICAgMzksICAgNTcsICAgNTcsICAgNTgsICAgNTUsICAgNjcsICAgNTgsICAgNDksICAgNTAsCi0gICAgNzAsICAgMjcsICAgOSwgICAgMTYsICAgMzcsICAgNCwgICAgMjUsICAgNCwgICAgMTEsICAgOSwgICAgNywgICAgLTMzLAotICAgIC03LCAgIC0xMiwgIDMsICAgIC02LCAgIC0yOSwgIC03LCAgIC03LCAgIC0xOCwgIC0xMiwgIC0xOCwgIC0yLCAgIC0xLAotICAgIDAsICAgIDMxLCAgIDYwLCAgIC04LCAgIDUxLCAgIDU5LCAgIDcwLCAgIDQwLCAgIDcxLCAgIDU3LCAgIDUyLCAgIDM4LAotICAgIDY2LCAgIDQ4LCAgIDE3LCAgIDYsICAgIDU5LCAgIDgsICAgIDE1LCAgIDcsICAgIDE4LCAgIDQsICAgIDE4LCAgIC0yMywKLSAgICAtOCwgICAtNCwgICAtMywgICAtMTIsICAtMywgICAtMjYsICAxLCAgICAxMCwgICAyLCAgICAtMjksICAtMjksICAtMzcsCi0gICAgLTcsICAgLTQsICAgNiwgICAgLTMzLCAgNjcsICAgNDQsICAgNTksICAgLTQsICAgNjQsICAgNTEsICAgNjgsICAgNTUsCi0gICAgNzQsICAgOSwgICAgNDAsICAgMTUsICAgNTcsICAgMzMsICAgNjAsICAgMTgsICAgNDAsICAgMjUsICAgMjcsICAgLTIwLAotICAgIDI1LCAgIC0xNiwgIDYsICAgIDE3LCAgIC0xMCwgIC0xMiwgIC0yMywgIC00MywgIC0yMywgIC0yMywgIC0yOSwgIC0zNywKLSAgICAtNCwgICAtMTYsICAtMTYsICAtNjAsICAtMjAsICAtMjMsICAtMTAsICAtMjksICAtMTIsICAxNSwgICAxMiwgICAtMzcsCi0gICAgMjcsICAgMTUsICAgNjEsICAgNDQsICAgNTAsICAgOCwgICAgNDgsICAgMjIsICAgNDksICAgLTE4LCAgNDYsICAgMzMsCi0gICAgNDIsICAgMzQsICAgNDYsICAgLTgsICAgNCwgICAgLTE4LCAgLTQzLCAgLTQzLCAgLTEwLCAgMSwgICAgLTEwLCAgLTE2LAotICAgIC0xMCwgIC03NywgIC0xNiwgIC0zMywgIDExLCAgIC0yNiwgIC0yMywgIC0zNywgIDAsICAgIC04LCAgIC0xNiwgIC0yOSwKLSAgICA0MiwgICA0MCwgICA2OCwgICAyNCwgICA0NywgICA0NiwgICA1MywgICAtMTI4LCAzMCwgICAyLCAgICA0MiwgICAyMSwKLSAgICAyMSwgICAtNCwgICA0MywgICAyLCAgICA0MywgICA1LCAgICAzMiwgICAtMjYsICA3LCAgICAtMzcsICAtNDMsICAtMjMsCi0gICAgLTIsICAgLTgsICAgMiwgICAgLTM3LCAgLTUwLCAgLTYwLCAgLTEsICAgLTcsICAgLTMzLCAgLTc3LCAgLTYsICAgLTE4LAotICAgIC0xNiwgIC01MCwgIC0xMiwgIC0zMywgIDUzLCAgIDgsICAgIDUyLCAgIDE4LCAgIDUxLCAgIDM1LCAgIDY5LCAgIDI2LAotICAgIDQ0LCAgIDgsICAgIDI3LCAgIC0xMjgsIDIxLCAgIC0zMywgIDE3LCAgIC0xNCwgIDM4LCAgIC0xMjgsIC0xNCwgIC0xOCwKLSAgICAxNywgICAtMjAsICAtMTQsICAtMzcsICA4LCAgICAtNjAsICAtMzMsICAtMzMsICAtMzMsICAtNDMsICAtMTIsICAtMjksCi0gICAgLTEyLCAgLTEyOCwgLTMzLCAgLTYwLCAgLTI2LCAgLTc3LCAgLTI2LCAgLTUwLCAgNTcsICAgMjksICAgMTEsICAgMzAsCi0gICAgNTMsICAgLTEwLCAgNDUsICAgMTUsICAgMTgsICAgLTEwLCAgNDIsICAgMiwgICAgMzEsICAgLTI5LCAgMTAsICAgLTQsCi0gICAgNDIsICAgLTM3LCAgLTUwLCAgLTEyOCwgLTQsICAgLTQzLCAgLTIwLCAgLTc3LCAgLTE0LCAgLTI2LCAgLTMzLCAgLTEyOCwKLSAgICAtMTIsICAtNDMsICAtOCwgICAtMzMsICAtMzMsICAtNjAsICAtNDMsICAtNzcsICAtMTIsICAtNjAsICAtMjYsICAtNTAsCi0gICAgNDAsICAgLTIzLCAgMzYsICAgMzUsICAgNTAsICAgLTIsICAgMzcsICAgMjcsICAgMjYsICAgLTc3LCAgNDksICAgLTcsCi0gICAgMjgsICAgLTQzLCAgNiwgICAgMTEsICAgNDEsICAgLTM3LCAgMzMsICAgLTI2LCAgLTE0LCAgLTEyLCAgLTYsICAgLTMzLAotICAgIC0xNiwgIC0yNiwgIC0yMCwgIC03NywgIC0xNCwgIC00MywgIC04LCAgIC01MCwgIC0xNCwgIC0zNywgIC0yNiwgIC03NywKLSAgICAtMjYsICAtNzcsICAtMTQsICAtMjksICA1MCwgICAtNjAsICAyNSwgICAtMjYsICA1NywgICAzOCwgICA1MSwgICAxLAotICAgIDUwLCAgIDEsICAgIDUzLCAgIC0xOCwgIDMwLCAgIC0yMywgIDExLCAgIC0xMjgsIDE4LCAgIC00MywgIDIwLCAgIC0yNiwKLSAgICAtMTAsICAtMjYsICAtMTIsICAtMTI4LCAtNTAsICAtNjAsICAtMzcsICAtNzcsICAtMjAsICAtNDMsICAtNTAsICAtMTI4LAotICAgIC03NywgIC0xMjgsIC03NywgIC0xMjgsIC0zMywgIC03NywgIC0yMCwgIC02MCwgIDUzLCAgIC0xMCwgIC0zNywgIC0xMjgsCi0gICAgMTAsICAgLTEyOCwgNjAsICAgMTgsICAgLTgsICAgMTMsICAgMzcsICAgLTM3LCAgOCwgICAgLTEyOCwgMywgICAgLTc3LAotICAgIDMyLCAgIC0yOSwgIDE0LCAgIDEwLCAgIC0xMiwgIC03NywgIC0zNywgIC03NywgIC0zNywgIC02MCwgIC0yMywgIC0xMjgsCi0gICAgLTQzLCAgLTUwLCAgLTE2LCAgLTc3LCAgLTYsICAgLTMzLCAgMCwgICAgLTYwLCAgLTQzLCAgLTEyOCwgLTE2LCAgLTYwLAotICAgIDIwLCAgIC0yLCAgIDUxLCAgIDE5LCAgIDQzLCAgIDIsICAgIDYzLCAgIDIwLCAgIDYwLCAgIC00LCAgIDQyLCAgIC01MCwKLSAgICA0LCAgICAtMTI4LCAyLCAgICAtMywgICAzMiwgICAtMzMsICAtMjYsICAtMTI4LCAtMTgsICAtMTI4LCAtMzMsICAtNDMsCi0gICAgLTcsICAgLTYwLCAgLTUwLCAgLTc3LCAgLTI5LCAgLTc3LCAgLTIzLCAgLTEyOCwgLTE2LCAgLTI2LCAgLTIzLCAgLTYwLAotICAgIC0zNywgIC03NywgIC0zNywgIC0xMjgsIC0xLCAgIC0zMywgIDM5LCAgIDQ4LCAgIDYwLCAgIDUsICAgIDgsICAgIC0xMjgsCi0gICAgNDQsICAgMTEsICAgNCwgICAgMCwgICAgMTMsICAgLTc3LCAgLTIsICAgLTIwLCAgMzMsICAgLTEyOCwgLTMzLCAgLTc3LAotICAgIC04LCAgIC0xMjgsIC0xNCwgIC0xMjgsIC0zMywgIC0xOCwgIC0xMiwgIC03NywgIC0xNiwgIC0xMjgsIC0zNywgIC0xMjgsCi0gICAgLTEyLCAgLTc3LCAgLTYwLCAgLTEyOCwgLTIzLCAgLTYwLCAgLTIzLCAgLTEyOCwgMzYsICAgLTUwLCAgNDYsICAgLTEyOCwKLSAgICA2NiwgICAzOSwgICAxOCwgICAtMTQsICAtMTIsICAtNzcsICAtMjAsICAtNiwgICAyNCwgICAtMTI4LCAyOCwgICAtMjYsCi0gICAgMjEsICAgLTc3LCAgLTYsICAgLTMzLCAgMSwgICAgLTEyOCwgLTQzLCAgLTEyOCwgLTEsICAgLTUwLCAgLTM3LCAgLTEyOCwKLSAgICAtNTAsICAtMTI4LCAtMzMsICAtMTI4LCAtMTgsICAtMTI4LCAtNjAsICAtOCwgICAtNywgICAtNjAsICAtNjAsICAtMTI4LAotICAgIC02LCAgIC0yOSwgIDIwLCAgIC0xLCAgIDczLCAgIDQwLCAgIC00MywgIC0xNCwgIDMzLCAgIC00MywgIDMzLCAgIC0zLAotICAgIDE1LCAgIC0yOSwgIDI5LCAgIC00MywgIDIwLCAgIC02MCwgIC0yOSwgIC0xMjgsIC0yMCwgIC0yNiwgIDQsICAgIC03NywKLSAgICAtMTYsICAtNjAsICAtMzMsICAtNTAsICAtMjksICAtMTI4LCAtNjAsICAtMTI4LCAtNzcsICAtMTI4LCAtMzcsICAtNTAsCi0gICAgMCwgICAgLTc3LCAgLTMzLCAgLTEyOCwgMzksICAgOCwgICAgNDcsICAgMTAsICAgNjIsICAgMTYsICAgMiwgICAgMSwKLSAgICAxMCwgICA3LCAgICA0LCAgICAtNywgICA2LCAgICAtMTI4LCAtNzcsICAtNTAsICAxOSwgICAtNzcsICAtNzcsICAtMTI4LAotICAgIC03NywgIC0xMjgsIC01MCwgIC0xMjgsIC02MCwgIC02MCwgIC0zMywgIC01MCwgIC0zNywgIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTYwLCAgLTEyOCwgLTM3LCAgLTYwLCAgLTE4LCAgLTEyOCwgLTMzLCAgLTc3LCAgMzcsICAgMjMsICAgMjksICAgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTYsICAtMTI4LCAtMTYsICAtMzMsICAyMSwgICAtMjAsICAtOCwgICAtNjAsICAtMiwgICAtNjAsCi0gICAgMTEsICAgLTEyOCwgLTUwLCAgLTEyOCwgLTUwLCAgLTEyOCwgLTI5LCAgLTc3LCAgLTE2LCAgLTEyOCwgLTI2LCAgLTEyOCwKLSAgICAtNTAsICAtNzcsICAtNDMsICAtMTI4LCAtMTI4LCAtMTI4LCAtNTAsICAtMTI4LCAtMzMsICAtMTI4LCAtMzMsICAtNTAsCi0gICAgLTIzLCAgLTEyOCwgMjQsICAgLTEyOCwgLTEyOCwgLTc3LCAgNCwgICAgLTIzLCAgMzIsICAgLTEyOCwgMSwgICAgLTI2LAotICAgIC0xNCwgIC0xMjgsIDEwLCAgIC03NywgIC00LCAgIC0xMjgsIDEsICAgIC01MCwgIC04LCAgIC03NywgIC03NywgIC03NywKLSAgICAtMjMsICAtMTI4LCAtNTAsICAtNDMsICAtMzMsICAtMTI4LCAtNDMsICAtMTI4LCAtMTI4LCAtMTI4LCAtNDMsICAtMTI4LAotICAgIC01MCwgIC0xMjgsIC0xMjgsIC0xMjgsIDQ0LCAgIDE1LCAgIDE0LCAgIC0xMjgsIDksICAgIC0xMjgsIDIxLCAgIDAsCi0gICAgMjksICAgLTcsICAgMTgsICAgLTcsICAgLTcsICAgLTEyOCwgLTMzLCAgLTUwLCAgMTQsICAgLTYwLCAgLTYwLCAgLTEyOCwKLSAgICAtNjAsICAtMTI4LCAtMzcsICAtMTI4LCAtNDMsICAtMTI4LCAtMjAsICAtMTI4LCAtNTAsICAtMTI4LCAtNDMsICAtNzcsCi0gICAgLTI2LCAgLTEyOCwgLTYwLCAgLTUwLCAgLTYwLCAgLTEyOCwgLTc3LCAgLTEyOCwgLTMsICAgLTEyOCwgMTQsICAgLTc3LAotICAgIC0yNiwgIDExLCAgIDQ3LCAgIC03NywgIC03LCAgIC03NywgIDQ1LCAgIC00MywgIC0xMiwgIDE0LCAgIDM3LCAgIC02MCwKLSAgICAyMiwgICAtNCwgICA1LCAgICAtNzcsICAtMTQsICAtMTI4LCAtMTAsICAtNjAsICAyMiwgICAtNzcsICAtMTIsICAtNjAsCi0gICAgLTUwLCAgLTEyOCwgLTYwLCAgLTEyOCwgLTYwLCAgLTEyOCwgLTQzLCAgLTEyOCwgLTUwLCAgLTEyOCwgLTc3LCAgLTUwLAotICAgIDI3LCAgIC0zNywgIDMzLCAgIC0xMjgsIDQsICAgIC0yOSwgIC00LCAgIC01MCwgIC0yMCwgIC0xMjgsIDYsICAgIC0zNywKLSAgICAtMzMsICAtMTI4LCAtNTAsICAtMTI4LCAzNCwgICAxNSwgICAtNDMsICAtMTI4LCAtMjAsICAtNTAsICAtMywgICAtMzcsCi0gICAgLTM3LCAgLTc3LCAgLTc3LCAgLTEyOCwgLTQzLCAgLTEyOCwgLTEyOCwgLTEyOCwgNCwgICAgLTI2LCAgLTI2LCAgMjcsCi0gICAgMCwgICAgLTEyOCwgLTI5LCAgLTYwLCAgMzUsICAgLTI2LCAgMjMsICAgLTEyOCwgLTI5LCAgLTc3LCAgMTksICAgMTQsCi0gICAgMjgsICAgLTEyOCwgLTE2LCAgLTcsICAgMzEsICAgLTEsICAgMTcsICAgMTEsICAgNjAsICAgNDQsICAgOCwgICAgMTEsCi0gICAgMTgsICAgLTEyOCwgLTMzLCAgLTYwLCAgLTEsICAgLTEyOCwgLTQzLCAgLTEyOCwgLTIzLCAgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICA1OSwgICA0MywgICAzNSwgICA2MSwgICAzNywgICAtNzcsICAtNzcsICAtNTAsICAxMTYsICA4OCwgICA5OCwgICA2OSwKLSAgICA3OCwgICA1MywgICA3OCwgICA0MCwgICA0OCwgICA3LCAgICAyOSwgICAtMTgsICAtMiwgICAtMTQsICA1LCAgICAxMiwKLSAgICA2NSwgICAzNSwgICAzMSwgICAtMTIsICAzMywgICAtMiwgICAtNiwgICAtMSwgICA0NCwgICAtMjksICAtMTQsICAtNjAsCi0gICAgLTQsICAgLTQzLCAgLTM3LCAgLTEyOCwgMjksICAgMTgsICAgMzgsICAgNTEsICAgOCwgICAgLTEyOCwgLTEyLCAgLTM3LAotICAgIDExNSwgIDkxLCAgIDExMywgIDc3LCAgIDg5LCAgIDM2LCAgIDYwLCAgIDQ0LCAgIDQ5LCAgIDM2LCAgIDI3LCAgIDMxLAotICAgIDYzLCAgIDMwLCAgIDYyLCAgIDE0LCAgIDU1LCAgIDQ5LCAgIDQyLCAgIDAsICAgIDQ1LCAgIDE3LCAgIC0yMywgIDEsCi0gICAgMzAsICAgLTM3LCAgLTUwLCAgLTc3LCAgLTgsICAgLTYwLCAgOSwgICAgLTYwLCAgLTEyLCAgLTUwLCAgMTMsICAgNCwKLSAgICAyMywgICAtNiwgICAyOCwgICAxMywgICAxMDcsICA3OCwgICAxMDEsICA3MywgICA4OSwgICA0NiwgICA2MywgICAxNywKLSAgICAzNCwgICAtNDMsICAtNiwgICAzMCwgICA2NywgICA0MCwgICA3NywgICAyMSwgICA1MywgICAzOSwgICAzOCwgICAxMiwKLSAgICAtNiwgICA1LCAgICAyOCwgICAtMiwgICAxOCwgICAtNDMsICAwLCAgICAtMTI4LCAtMjksICAtNzcsICAxOCwgICAtMTI4LAotICAgIC0yLCAgIC03NywgIDM5LCAgIDM1LCAgIDM4LCAgIDM1LCAgIDUwLCAgIDI5LCAgIDEwMCwgIDcwLCAgIDk0LCAgIDY5LAotICAgIDg2LCAgIDUwLCAgIDQ1LCAgIDM4LCAgIDQ1LCAgIDEyLCAgIDU4LCAgIDY0LCAgIDc0LCAgIDM2LCAgIDc3LCAgIDQ1LAotICAgIDc4LCAgIDYyLCAgIDgsICAgIC02MCwgIDM4LCAgIDYsICAgIDIxLCAgIDcsICAgIDgsICAgIC0zNywgIC0xLCAgIC0yMCwKLSAgICA0OCwgICAtMzcsICA4LCAgICAtMTAsICA4LCAgICAxMywgICA0NSwgICAzOSwgICAzOCwgICAyMiwgICA0OSwgICAyNSwKLSAgICA5NCwgICA2MywgICA4NywgICA2NiwgICA4NCwgICAtMTI4LCAyOSwgICAyMCwgICA1NSwgICA1MSwgICA4MCwgICAzNiwKLSAgICA2MiwgICAzMCwgICA4MSwgICA3MiwgICA2OCwgICAzNywgICA1MSwgICAyNywgICA1NCwgICAyMiwgICAxNiwgICAtMjksCi0gICAgNCwgICAgOSwgICAgNTcsICAgMTUsICAgMzUsICAgLTQzLCAgLTc3LCAgLTIwLCAgNCwgICAgNiwgICAgMzcsICAgLTEsCi0gICAgNDAsICAgMzEsICAgNDcsICAgMTQsICAgODksICAgNjgsICAgOTYsICAgODMsICAgMTExLCAgOTYsICAgMTE1LCAgODcsCi0gICAgOTksICAgNzYsICAgMTA1LCAgODQsICAgMTA1LCAgODYsICAgMTEzLCAgOTEsICAgMTA4LCAgODcsICAgMTEwLCAgNzgsCi0gICAgODAsICAgNDYsICAgMjIsICAgNzQsICAgODgsICAgNzIsICAgMTAzLCAgODYsICAgODAsICAgNjgsICAgNDgsICAgMjQsCi0gICAgNjgsICAgNDgsICAgNTUsICAgMzYsICAgMTA4LCAgOTAsICAgOTAsICAgNjMsICAgODMsICAgNjMsICAgODcsICAgNjQsCi0gICAgOTAsICAgOTIsICAgMTEzLCAgODgsICAgMTAyLCAgNzksICAgMTA5LCAgODMsICAgMTAwLCAgODksICAgMTA5LCAgNjAsCi0gICAgNTYsICAgMjEsICAgNzUsICAgNjIsICAgODEsICAgNDUsICAgNjMsICAgNzMsICAgOTMsICAgNjUsICAgOTQsICAgODAsCi0gICAgODksICAgODEsICAgNzMsICAgMywgICAgNDMsICAgNjAsICAgMTAyLCAgNzAsICAgODQsICAgNjcsICAgOTksICAgNzQsCi0gICAgNzgsICAgNTcsICAgNzksICAgNTAsICAgOTMsICAgODIsICAgOTgsICAgNTYsICAgNzcsICAgNzAsICAgOTEsICAgNzEsCi0gICAgODUsICAgODIsICAgODYsICAgMTMsICAgNDUsICAgLTE4LCAgNDgsICAgNDAsICAgNTMsICAgMjgsICAgODUsICAgNjAsCi0gICAgNjUsICAgNTIsICAgODYsICAgNzgsICAgNzYsICAgNDYsICAgNzMsICAgMTksICAgMzUsICAgNTQsICAgNzUsICAgNDAsCi0gICAgNzEsICAgNjAsICAgODIsICAgMzcsICAgNjksICAgNDIsICAgNjIsICAgNDAsICAgOTYsICAgNzAsICAgODUsICAgNzcsCi0gICAgNzAsICAgNjgsICAgMTAzLCAgODQsICAgOTQsICAgNjksICAgODEsICAgLTEyOCwgLTEyOCwgLTEyOCwgLTQzLCAgLTM3LAotICAgIDQwLCAgIDIsICAgIDQ4LCAgIDQ1LCAgIDc2LCAgIDM3LCAgIDY1LCAgIDE2LCAgIDQzLCAgIDE4LCAgIDU4LCAgIDIwLAotICAgIDI3LCAgIDEyLCAgIDcxLCAgIDMxLCAgIDUzLCAgIDQ0LCAgIDg4LCAgIDQ3LCAgIDUwLCAgIDMzLCAgIDM5LCAgIDgsCi0gICAgODksICAgNTcsICAgODgsICAgNjksICAgNzIsICAgNjMsICAgMTAwLCAgNjgsICAgODEsICAgLTc3LCAgLTEwLCAgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAxMywgICAtNzcsICA4LCAgICAyNywgICA2MCwgICAyOCwgICA0MSwgICAtMTI4LAotICAgIC0zNywgIC0xMjgsIDI4LCAgIC00MywgIC0xOCwgIC0xMjgsIDQ3LCAgIC0zNywgIDQ1LCAgIDI3LCAgIDUxLCAgIC0yOSwKLSAgICAxNSwgICAzOSwgICA1MiwgICAzMCwgICA0OSwgICAtMzMsICA2NSwgICAxNSwgICA3NiwgICA3MSwgICA5MCwgICAxOSwKLSAgICA0NiwgICAtMTI4LCAtMTYsICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTgsICAtMTI4LAotICAgIC0yMCwgIC0xMjgsIDMyLCAgIC0xMjgsIDIxLCAgIC0zMywgIDQ1LCAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMiwgIC0xMjgsCi0gICAgLTYsICAgLTE0LCAgNDMsICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgNTIsICAgLTE4LCAgNjksICAgLTQzLAotICAgIDc4LCAgIDU1LCAgIDQyLCAgIC0xMjgsIC0yOSwgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgMTQsICAgLTEyOCwgLTE2LCAgLTEyOCwgLTEyOCwgLTEyOCwgNywgICAgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAxMiwgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTYsCi0gICAgNTksICAgLTUwLCAgMzUsICAgLTEyOCwgNDIsICAgMCwgICAgNDcsICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMzMsICAtMTI4LCAtMjMsICAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0yMywgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0zMywgIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTgsICAgLTEyOCwgMzYsICAgLTUwLCAgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0zNywgIC0xMjgsIC0xMjgsIC02MCwgIC0xMCwgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgMjEsICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTIsICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTc3LCAgLTEyOCwgLTEyOCwgLTEyOCwgLTI5LCAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTI5LCAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTUwLCAgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotfTsKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMvbm9fbWljcm9fZmVhdHVyZXNfZGF0YS5oIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlcy9ub19taWNyb19mZWF0dXJlc19kYXRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMWI2ZDUuLjAwMDAwMDAKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlcy9ub19taWNyb19mZWF0dXJlc19kYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAxOSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi1MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLXlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLVlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotI2lmbmRlZiBURU5TT1JGTE9XX0xJVEVfTUlDUk9fRVhBTVBMRVNfTUlDUk9fU1BFRUNIX01JQ1JPX0ZFQVRVUkVTX05PX01JQ1JPX0ZFQVRVUkVTX0RBVEFfSF8KLSNkZWZpbmUgVEVOU09SRkxPV19MSVRFX01JQ1JPX0VYQU1QTEVTX01JQ1JPX1NQRUVDSF9NSUNST19GRUFUVVJFU19OT19NSUNST19GRUFUVVJFU19EQVRBX0hfCi0KLWV4dGVybiBjb25zdCBpbnQgZ19ub19taWNyb19mOTY0M2Q0Ml9ub2hhc2hfNF93aWR0aDsKLWV4dGVybiBjb25zdCBpbnQgZ19ub19taWNyb19mOTY0M2Q0Ml9ub2hhc2hfNF9oZWlnaHQ7Ci1leHRlcm4gY29uc3Qgc2lnbmVkIGNoYXIgZ19ub19taWNyb19mOTY0M2Q0Ml9ub2hhc2hfNF9kYXRhW107Ci0KLSNlbmRpZiAgLy8gVEVOU09SRkxPV19MSVRFX01JQ1JPX0VYQU1QTEVTX01JQ1JPX1NQRUVDSF9NSUNST19GRUFUVVJFU19OT19NSUNST19GRUFUVVJFU19EQVRBX0hfCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzL3llc19mZWF0dXJlX2RhdGFfc2xpY2UuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzL3llc19mZWF0dXJlX2RhdGFfc2xpY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZDAwNmEuLjAwMDAwMDAKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlcy95ZXNfZmVhdHVyZV9kYXRhX3NsaWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMTkgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci15b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLS8vIFNlZSB0aGUgaGVhZGVyIGZvciBkb2N1bWVudGF0aW9uIG9uIHRoZSBtZWFuaW5nIG9mIHRoaXMgZGF0YS4KLQotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMveWVzX2ZlYXR1cmVfZGF0YV9zbGljZS5oIgotCi1hbGlnbmFzKDE2KSBjb25zdCBpbnQ4X3QKLSAgICBnX3llc19mZWF0dXJlX2RhdGFfc2xpY2VbZ195ZXNfZmVhdHVyZV9kYXRhX3NsaWNlX3NpemVdID0gewotICAgICAgICA4NiwgIDg4LCAgIDEwOCwgNzUsIDEwOCwgNzYsICAgOTgsICA2NCwgIDc1LCAgNjEsIDcxLCAgNjYsIDg1LCAgLTEsCi0gICAgICAgIC03NywgLTEyOCwgNDYsICA2MSwgOTIsICA2OSwgICAxMDAsIDkzLCAgMTEzLCA4MCwgMTA4LCA5MywgMTEzLCA5MSwKLSAgICAgICAgMTEwLCA4MCwgICA4NSwgIDE1LCAtMzMsIC0xMjgsIDEyLCAgLTUwLCAzNCwgIDUwLCA3MCwgIDU1LAotfTsKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMveWVzX2ZlYXR1cmVfZGF0YV9zbGljZS5oIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlcy95ZXNfZmVhdHVyZV9kYXRhX3NsaWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4ZmFhZGMuLjAwMDAwMDAKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlcy95ZXNfZmVhdHVyZV9kYXRhX3NsaWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAxOSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi1MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLXlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLVlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotLy8gVGhpcyBkYXRhIHdhcyBleHRyYWN0ZWQgZnJvbSB0aGUgbGFyZ2VyIGZlYXR1cmUgZGF0YSBoZWxkIGluCi0vLyBub19taWNyb19mZWF0dXJlc19kYXRhLmNjIGFuZCBjb25zaXN0cyBvZiB0aGUgMjZ0aCBzcGVjdHJvZ3JhbSBzbGljZSBvZiA0MAotLy8gdmFsdWVzLiBUaGlzIGlzIHRoZSBleHBlY3RlZCByZXN1bHQgb2YgcnVubmluZyB0aGUgc2FtcGxlIGRhdGEgaW4KLS8vIHllc18zMG1zX3NhbXBsZV9kYXRhLmNjIHRocm91Z2ggdGhlIHByZXByb2Nlc3NpbmcgcGlwZWxpbmUuCi0KLSNpZm5kZWYgVEVOU09SRkxPV19MSVRFX01JQ1JPX0VYQU1QTEVTX01JQ1JPX1NQRUVDSF9NSUNST19GRUFUVVJFU19ZRVNfRkVBVFVSRV9EQVRBX1NMSUNFX0hfCi0jZGVmaW5lIFRFTlNPUkZMT1dfTElURV9NSUNST19FWEFNUExFU19NSUNST19TUEVFQ0hfTUlDUk9fRkVBVFVSRVNfWUVTX0ZFQVRVUkVfREFUQV9TTElDRV9IXwotCi0jaW5jbHVkZSA8Y3N0ZGludD4KLQotY29uc3RleHByIGludCBnX3llc19mZWF0dXJlX2RhdGFfc2xpY2Vfc2l6ZSA9IDQwOwotZXh0ZXJuIGNvbnN0IGludDhfdCBnX3llc19mZWF0dXJlX2RhdGFfc2xpY2VbXTsKLQotI2VuZGlmICAvLyBURU5TT1JGTE9XX0xJVEVfTUlDUk9fRVhBTVBMRVNfTUlDUk9fU1BFRUNIX01JQ1JPX0ZFQVRVUkVTX1lFU19GRUFUVVJFX0RBVEFfU0xJQ0VfSF8KZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMveWVzX21pY3JvX2ZlYXR1cmVzX2RhdGEuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzL3llc19taWNyb19mZWF0dXJlc19kYXRhLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWU1Mzg3Li4wMDAwMDAwCi0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMveWVzX21pY3JvX2ZlYXR1cmVzX2RhdGEuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMTkgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci15b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzL3llc19taWNyb19mZWF0dXJlc19kYXRhLmgiCi0KLS8vIEdvbGRlbiB0ZXN0IHZhbHVlcyBmb3IgdGhlIGV4cGVjdGVkIHNwZWN0cm9ncmFtIGZyb20gYSAieWVzIiBzYW1wbGUgZmlsZQotLy8gc3BlZWNoX2NvbW1hbmRzX3Rlc3Rfc2V0X3YwLjAyL3llcy9mMmU1OWZlYV9ub2hhc2hfMS53YXYuCi0KLWNvbnN0IGludCBnX3llc19taWNyb19mMmU1OWZlYV9ub2hhc2hfMV93aWR0aCA9IDQwOwotY29uc3QgaW50IGdfeWVzX21pY3JvX2YyZTU5ZmVhX25vaGFzaF8xX2hlaWdodCA9IDQ5OwotYWxpZ25hcygxNikgY29uc3Qgc2lnbmVkIGNoYXIgZ195ZXNfbWljcm9fZjJlNTlmZWFfbm9oYXNoXzFfZGF0YVtdID0gewotICAgIDExNiwgIDk4LCAgIDExOCwgIDk1LCAgIDEwNiwgIDg1LCAgIDEwMSwgIDgxLCAgIDY3LCAgIC0xOCwgIC0zMywgIC0xMiwKLSAgICAtMjYsICAtMTI4LCA5LCAgICAzNCwgICA1NiwgICA0NSwgICA5LCAgICAtMTIsICA1LCAgICAzMCwgICAyMywgICAyOCwKLSAgICAwLCAgICAtMTgsICAwLCAgICAtMTI4LCAtNjAsICAtNTAsICAtNTAsICAtMzcsICAtNjAsICAtNjAsICAtNTAsICAtMjYsCi0gICAgLTMzLCAgLTUwLCAgLTMzLCAgLTUwLCAgODMsICAgNjEsICAgODEsICAgNTUsICAgNzYsICAgNjEsICAgNzMsICAgNjQsCi0gICAgMzgsICAgLTgsICAgLTM3LCAgLTIwLCAgLTE4LCAgLTIwLCAgNDgsICAgMjksICAgNTIsICAgNDEsICAgNTUsICAgMTgsCi0gICAgMjUsICAgMzcsICAgNDQsICAgMzcsICAgOCwgICAgMTUsICAgLTYsICAgLTYwLCAgLTEyOCwgLTUwLCAgLTM3LCAgLTM3LAotICAgIC0xOCwgIC0zNywgIC0yNiwgIC0yOSwgIC0zNywgIC02MCwgIC01MCwgIC02MCwgIDk1LCAgIDU5LCAgIDUyLCAgIC00LAotICAgIDU0LCAgIC0xOCwgIDY4LCAgIDQzLCAgIDMxLCAgIC0xOCwgIC0yNiwgIC0zMywgIC0zNywgIC0yOSwgIDMzLCAgIDcsCi0gICAgLTMsICAgOCwgICAgMjYsICAgMjQsICAgMzYsICAgNiwgICAgMzYsICAgMjMsICAgMTQsICAgOCwgICAgLTI5LCAgLTM3LAotICAgIC0zNywgIC0zNywgIC01MCwgIC01MCwgIC0yNiwgIC04LCAgIC0yNiwgIC0zNywgIC0xOCwgIC0zNywgIC02MCwgIC03NywKLSAgICA1MCwgICA0OCwgICA4MywgICA0NCwgICA1NiwgICAtMTI4LCAtMzMsICAtNjAsICAxLCAgICAtMjYsICAtNjAsICAtNDMsCi0gICAgLTE0LCAgLTIzLCAgLTE4LCAgLTQzLCAgLTI2LCAgLTMzLCAgMTMsICAgLTc3LCAgLTQzLCAgLTc3LCAgLTMzLCAgLTM3LAotICAgIDE2LCAgIC0xMiwgIC0zNywgIC01MCwgIC01MCwgIC03NywgIC0yMCwgIC00MywgIC02MCwgIC0xMjgsIC02MCwgIC03NywKLSAgICAtMzcsICAtNzcsICAtNjAsICAtMTI4LCAzNywgICAtMTAsICA2NSwgICAtNywgICAyOCwgICAtMTI4LCAxMCwgICAtNzcsCi0gICAgLTM3LCAgLTEyOCwgLTc3LCAgLTEyOCwgLTc3LCAgLTQzLCAgLTEyOCwgLTEyOCwgLTc3LCAgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTQsICAtMTI4LCAtNDMsICAtNTAsICAtMzcsICAtNzcsICAtMTI4LCAtMTI4LCAtNzcsICAtNDMsCi0gICAgLTI5LCAgLTQzLCAgLTIwLCAgLTYwLCAgLTM3LCAgLTQzLCAgLTUwLCAgLTEyOCwgLTc3LCAgLTEyOCwgLTE4LCAgLTEyOCwKLSAgICAtNjAsICAtMTI4LCAtMTI4LCAtMTI4LCAtNzcsICAtMTI4LCAtNzcsICAtMTI4LCAtMTI4LCAtMTI4LCAtNjAsICAtMzcsCi0gICAgLTIwLCAgLTEyOCwgLTYwLCAgLTEyOCwgLTEyOCwgLTEyOCwgLTYwLCAgLTEyOCwgLTc3LCAgLTYwLCAgLTEyOCwgLTUwLAotICAgIC02MCwgIC0xMjgsIC03NywgIC0xMjgsIC01MCwgIC02MCwgIC0zNywgIC02MCwgIC01MCwgIC03NywgIC03NywgIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTM3LCAgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtNzcsICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC03NywgIC02MCwgIC0xMjgsIC0xMjgsIC01MCwgIC0xMjgsIC01MCwgIC0xMjgsCi0gICAgLTUwLCAgLTEyOCwgLTc3LCAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtNzcsICAtMTI4LCAtNzcsICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTc3LCAgLTEyOCwgLTc3LCAgLTEyOCwgLTc3LCAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC03NywgIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTc3LCAgLTUwLCAgLTEyOCwgLTEyOCwgLTc3LCAgLTc3LCAgLTEyOCwgLTEyOCwgLTEyOCwgLTUwLCAgLTEyOCwKLSAgICA4NSwgICA0MywgICA2NSwgICA1MywgICA2OSwgICA2MCwgICA0NSwgICAzLCAgICA0NiwgICAtMTIsICA5LCAgICAtMjMsCi0gICAgMzIsICAgLTEsICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEsICAgMzcsICAgMzgsICAgMzMsICAgNDMsICAgMzYsCi0gICAgNTgsICAgNzAsICAgNjgsICAgMzksICAgNiwgICAgMTAsICAgMzIsICAgNiwgICAgOCwgICAgLTIzLCAgLTc3LCAgLTEyOCwKLSAgICAtMjksICAtMTI4LCAtNzcsICAtMTI4LCAxMDEsICA4NywgICAxMDIsICA5MSwgICAxMTAsICA4OCwgICAxMDEsICA4MywKLSAgICAxMTAsICA5NSwgICAxMTEsICA4MywgICA4MSwgICA4NCwgICAxMDYsICA5MCwgICA5MywgICA4MiwgICA5OCwgICA5MSwKLSAgICAxMDgsICA5NSwgICAxMTgsICA5NywgICAxMTgsICA5NywgICAxMTYsICA5NiwgICAxMTMsICA5MCwgICAxMTAsICA5NiwKLSAgICAxMDcsICA4NSwgICA5NCwgICA2NiwgICA2OSwgICAzNiwgICAyOSwgICAwLCAgICAxMDAsICA2MCwgICAxMDUsICA2OCwKLSAgICA5MiwgICA5MywgICAxMTMsICA5MiwgICAxMDcsICA4NSwgICAxMDcsICA4MywgICAxMDQsICA5MSwgICAxMDUsICA4NSwKLSAgICAxMTIsICA4OCwgICAxMDEsICA4MCwgICAxMDEsICA3OSwgICA5NiwgICA4MCwgICA5OCwgICA4MCwgICAxMDUsICA4MywKLSAgICA5OCwgICA4MSwgICAxMDMsICA3MSwgICAxMDAsICA3OSwgICA4MywgICA3OCwgICA5MSwgICA0NywgICA1MCwgICAxMywKLSAgICAxMDgsICA4MSwgICA5MywgICA3OCwgICA5OCwgICA3NiwgICAxMDUsICA3NiwgICA5OCwgICA0MCwgICA3NywgICA3MiwKLSAgICA4MSwgICA2MiwgICA5MywgICA3NywgICA5NiwgICA4MCwgICA5OCwgICA2MSwgICA5NywgICA2OSwgICA4OCwgICA2MSwKLSAgICA3MSwgICA1NiwgICA5OCwgICA2OCwgICA5NywgICA3MiwgICA4OSwgICA1MSwgICA4MSwgICA2MSwgICA4OCwgICA3NSwKLSAgICA4NiwgICA1NiwgICA0OCwgICAxMywgICA3MSwgICAyMiwgICA4NCwgICA2NiwgICA3NiwgICAtNywgICA0OCwgICA2MSwKLSAgICA3NywgICA2MiwgICA5MSwgICA2NSwgICA5NSwgICA3NCwgICA4OCwgICA1OSwgICA3NSwgICA1OCwgICA4MywgICA1NSwKLSAgICA4NywgICA1NSwgICA3NiwgICA0MywgICA3NiwgICAtMywgICA1NiwgICA2MCwgICA3OSwgICA1NywgICA3MSwgICA1NCwKLSAgICA4MiwgICAzMywgICA3NCwgICA3MSwgICA5MSwgICA0NSwgICAxOCwgICAtNywgICA2MSwgICA1NiwgICA3NywgICA0MSwKLSAgICA3MywgICA0MiwgICA4MiwgICA0OSwgICA1OSwgICA2MywgICA4MiwgICA2NSwgICA2NiwgICAzOCwgICA4MywgICAzNCwKLSAgICA0OCwgICAtOCwgICA0NiwgICAyMCwgICA1NCwgICAzMywgICA1NCwgICA2LCAgICA0OCwgICAxNiwgICA2MCwgICAzNywKLSAgICA1OCwgICAyMiwgICA1OCwgICAxNCwgICA2NSwgICA1MywgICA3NSwgICAtNCwgICA0MiwgICAxNiwgICAxNiwgICAtNTAsCi0gICAgMjIsICAgLTEyOCwgODAsICAgNTQsICAgNDMsICAgLTUwLCAgNDIsICAgLTEyOCwgLTEwLCAgLTc3LCAgMjgsICAgLTI5LAotICAgIDY4LCAgIDQzLCAgIDczLCAgIDIsICAgIDI1LCAgIC02MCwgIDQ3LCAgIDE0LCAgIDQ1LCAgIDcsICAgIDY2LCAgIDQsCi0gICAgNjIsICAgMzcsICAgNzEsICAgNywgICAgNDYsICAgLTEwLCAgNDQsICAgMjIsICAgNTUsICAgNTMsICAgNTcsICAgLTI5LAotICAgIDI2LCAgIC0xMCwgIC0zLCAgIC0xMjgsIDM4LCAgIC0xMjgsIDQ2LCAgIC0xMCwgIDE2LCAgIC0xMjgsIC0xMCwgIC0yNiwKLSAgICA2MCwgICAtNywgICA2NSwgICAzOCwgICA3MCwgICAtNjAsICAzNSwgICAtOCwgICA0MiwgICAtMjksICA2LCAgICAtMTI4LAotICAgIDM0LCAgIC0xMjgsIDM2LCAgIC02MCwgIDQ0LCAgIC0xMiwgIC0yLCAgIC0xMjgsIC03LCAgIC02MCwgIC02MCwgIC0xMjgsCi0gICAgLTIzLCAgLTEyOCwgMzEsICAgLTMzLCAgMjIsICAgLTc3LCAgLTM3LCAgLTQzLCAgLTEyOCwgLTEyOCwgMywgICAgLTEyOCwKLSAgICAtMjMsICAtMTI4LCAxNywgICAtNzcsICA0MywgICAtNzcsICAtNywgICAtMTI4LCAtMjAsICAtMTI4LCAxNywgICAtNDMsCi0gICAgMzIsICAgLTEyOCwgLTQzLCAgLTEyOCwgLTEyOCwgLTc3LCAgMjEsICAgLTEyOCwgLTUwLCAgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMzcsICAtMTI4LCAtMTYsICAtMTI4LCAtNTAsICAtMjYsICAtNiwgICAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0yMywgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTE2LCAgLTEyOCwgMzYsICAgLTcsICAgMTYsICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtNzcsICAtMTI4LCAtMzcsICAtMTI4LCAtNTAsICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTgsICAtMTI4LAotICAgIDExLCAgIC0xMjgsIC0xNiwgIC03NywgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTI2LCAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0yMCwgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC01MCwgIC0xMjgsIC03NywgIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC03NywgIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEsICAgLTE4LCAgNSwgICAgLTEyOCwKLSAgICA0MCwgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIDQsICAgIC0xMjgsIDYzLCAgIDY2LCAgIDc1LCAgIC0xMjgsCi0gICAgNzAsICAgNjAsICAgMzQsICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICA4NywgICA4NiwgICA5NSwgICA3NiwgICA5MSwgICA2MiwgICA3MiwgICAtNiwgICAtNTAsICAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIDY0LCAgIDgzLCAgIDEwNCwgIDcwLAotICAgIDk4LCAgIDkwLCAgIDExMSwgIDg5LCAgIDEwOSwgIDgwLCAgIDcxLCAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTIwLCAgLTYsICAgMjcsICAgMzMsICAgODYsICAgODgsICAgMTA4LCAgNzUsICAgMTA4LCAgNzYsICAgOTgsICAgNjQsCi0gICAgNzUsICAgNjEsICAgNzEsICAgNjYsICAgODUsICAgLTEsICAgLTc3LCAgLTEyOCwgNDYsICAgNjEsICAgOTIsICAgNjksCi0gICAgMTAwLCAgOTMsICAgMTEzLCAgODAsICAgMTA4LCAgOTMsICAgMTEzLCAgOTEsICAgMTEwLCAgODAsICAgODUsICAgMTUsCi0gICAgLTMzLCAgLTEyOCwgMTIsICAgLTUwLCAgMzQsICAgNTAsICAgNzAsICAgNTUsICAgODQsICAgNzIsICAgMTA4LCAgODEsCi0gICAgMTExLCAgODgsICAgMTAwLCAgODAsICAgODQsICAgNzMsICAgOTcsICAgODYsICAgOTksICAgNjUsICAgODUsICAgNDMsCi0gICAgOTYsICAgNzgsICAgMTA3LCAgOTQsICAgMTE4LCAgOTgsICAgMTE1LCAgOTIsICAgMTE4LCAgOTQsICAgMTExLCAgOTMsCi0gICAgMTExLCAgODYsICAgOTksICAgNTIsICAgMzIsICAgLTE2LCAgNDgsICAgMzEsICAgODEsICAgNzQsICAgODUsICAgNjQsCi0gICAgNzgsICAgNjQsICAgOTgsICAgNzAsICAgMTEwLCAgOTIsICAgOTYsICAgNzMsICAgMTAwLCAgNzIsICAgOTQsICAgNzMsCi0gICAgOTgsICAgNzYsICAgODUsICAgNjcsICAgMTAxLCAgODMsICAgMTAxLCAgODMsICAgMTEyLCAgODksICAgOTgsICAgODUsCi0gICAgMTA1LCAgNzgsICAgOTgsICAgNzIsICAgMTAyLCAgODAsICAgOTUsICAgMjMsICAgMTksICAgLTgsICAgNTIsICAgNTcsCi0gICAgMTAzLCAgOTEsICAgOTUsICAgNjUsICAgNzQsICAgOCwgICAgNzcsICAgNDksICAgOTYsICAgNzYsICAgMTAwLCAgODcsCi0gICAgMTA1LCAgODEsICAgOTQsICAgNjIsICAgOTQsICAgNzgsICAgODEsICAgNzIsICAgOTksICAgODIsICAgMTAxLCAgNzgsCi0gICAgMTA4LCAgNjUsICAgODIsICAgNzAsICAgMTAwLCAgNjMsICAgNzksICAgNTgsICAgODAsICAgNTksICAgODcsICAgNDgsCi0gICAgNTAsICAgNTcsICAgOTMsICAgNjcsICAgODYsICAgODAsICAgMTAzLCAgNTYsICAgNzcsICAgMzEsICAgODEsICAgNTcsCi0gICAgNjIsICAgNDEsICAgOTYsICAgODUsICAgOTEsICAgNzEsICAgMTAxLCAgNzYsICAgODksICAgNzgsICAgOTUsICAgNzYsCi0gICAgOTYsICAgNzksICAgMTAzLCAgODEsICAgMTAzLCAgNDgsICAgNzAsICAgNTcsICAgODgsICAgNjYsICAgODQsICAgMTEsCi0gICAgODUsICAgNjcsICAgMTA0LCAgMzcsICAgMzgsICAgNjcsICAgOTAsICAgNTQsICAgODEsICAgNjIsICAgOTAsICAgNTIsCi0gICAgNzgsICAgLTYwLCAgNTQsICAgLTgsICAgNjgsICAgNDAsICAgNTUsICAgOCwgICAgNzcsICAgNTIsICAgNjYsICAgMzEsCi0gICAgNTUsICAgMTMsICAgNjAsICAgMjYsICAgNjksICAgNDIsICAgNjMsICAgLTI5LCAgNTcsICAgLTEyOCwgLTMsICAgLTEyOCwKLSAgICAzLCAgICAtMTI4LCAtMjksICAtNjAsICA1MiwgICAtNDMsICA2MywgICA1NiwgICA4NiwgICA3NSwgICA5NSwgICA3NSwKLSAgICA4NSwgICA2MywgICA4MiwgICAxMCwgICA1MCwgICAtMTI4LCAzMSwgICAtNzcsICAwLCAgICAtNzcsICAtMjMsICAtMTI4LAotICAgIDEyLCAgIC03NywgIDUxLCAgIC0zLCAgIDU4LCAgIC0xNCwgIDQ0LCAgIDAsICAgIDQ4LCAgIDQsICAgIDUzLCAgIDQ3LAotICAgIDI4LCAgIC0xMjgsIC0xMjgsIC0xMjgsIC0zNywgIC0xMjgsIC0zLCAgIC0xMjgsIDQ5LCAgIDYxLCAgIDEwMCwgIDkwLAotICAgIDExNywgIDg4LCAgIDEwNywgIDk0LCAgIDExMiwgIDY0LCAgIDk2LCAgIDgzLCAgIC0xMjgsIC0xMjgsIDcsICAgIC0xMjgsCi0gICAgLTc3LCAgLTEyOCwgLTIzLCAgLTEyOCwgLTIzLCAgLTEyOCwgMTYsICAgLTM3LCAgNjUsICAgLTgsICAgNDgsICAgMjAsCi0gICAgMTQsICAgLTc3LCAgNTcsICAgLTE4LCAgLTQzLCAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAyNCwgICAxMiwgICA3NCwgICA3NiwgICAxMDUsICA3NiwgICA5OSwgICA4MCwgICAxMDgsICA3OSwgICAxMDMsICA4NSwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIDQyLCAgIC0xMjgsIC04LCAgIC0xMjgsIC01MCwgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTYwLCAgLTEyOCwgLTEyOCwgNSwgICAgNzMsICAgNTMsICAgOTMsICAgNzAsICAgMTAxLCAgNzMsCi0gICAgOTQsICAgNTcsICAgODYsICAgNjYsICAgLTE4LCAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtNTAsICAtMTI4LCAzNiwgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMjAsICAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIDIzLCAgIDM3LAotICAgIDc1LCAgIDU0LCAgIDk3LCAgIDcwLCAgIDgzLCAgIDUyLCAgIDg1LCAgIDY1LCAgIDcsICAgIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTQzLCAgLTEyOCwgMjMsICAgLTEyOCwgLTQzLCAgLTEyOCwKLSAgICAtMzMsICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0yNiwgIC0zNywgIDY1LCAgIDMzLCAgIDc2LCAgIDM3LCAgIDczLCAgIDUwLCAgIDc3LCAgIDQ3LAotICAgIC0xMiwgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC03LCAgIC0xNCwKLSAgICAtNCwgICAtMTI4LCAtMTQsICAtMTI4LCAxOCwgICAtNjAsICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0yNiwgIC02MCwgIDcxLCAgIDQyLCAgIDY4LCAgIDUzLAotICAgIDgxLCAgIDQ5LCAgIDczLCAgIDM2LCAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTE4LCAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAxNSwgICAtMjYsCi0gICAgNDQsICAgLTE4LCAgNTksICAgMzksICAgNTcsICAgMjAsICAgNjIsICAgMjYsICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgNDksICAgLTEyOCwgMzAsICAgOCwgICAgNjksICAgMjcsICAgNjIsICAgMzgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC00MywgIC0xMjgsIDI4LCAgIC0zNywgIDQ4LCAgIC0xMCwKLSAgICA0OCwgICAxMSwgICA3NCwgICAzNywgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtNzcsICAtMTI4LCAxMSwgICAtMTI4LCAtNywgICAtNjAsICAtNzcsICAtNCwgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtOCwgICAtMTI4LCAtNTAsICAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotICAgIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsIC0xMjgsCi0gICAgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwgLTEyOCwKLSAgICAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAotfTsKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMveWVzX21pY3JvX2ZlYXR1cmVzX2RhdGEuaCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fZmVhdHVyZXMveWVzX21pY3JvX2ZlYXR1cmVzX2RhdGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QxYWQxMC4uMDAwMDAwMAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzL3llc19taWNyb19mZWF0dXJlc19kYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAxOSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi1MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLXlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLVlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotI2lmbmRlZiBURU5TT1JGTE9XX0xJVEVfTUlDUk9fRVhBTVBMRVNfTUlDUk9fU1BFRUNIX01JQ1JPX0ZFQVRVUkVTX1lFU19NSUNST19GRUFUVVJFU19EQVRBX0hfCi0jZGVmaW5lIFRFTlNPUkZMT1dfTElURV9NSUNST19FWEFNUExFU19NSUNST19TUEVFQ0hfTUlDUk9fRkVBVFVSRVNfWUVTX01JQ1JPX0ZFQVRVUkVTX0RBVEFfSF8KLQotZXh0ZXJuIGNvbnN0IGludCBnX3llc19taWNyb19mMmU1OWZlYV9ub2hhc2hfMV93aWR0aDsKLWV4dGVybiBjb25zdCBpbnQgZ195ZXNfbWljcm9fZjJlNTlmZWFfbm9oYXNoXzFfaGVpZ2h0OwotZXh0ZXJuIGNvbnN0IHNpZ25lZCBjaGFyIGdfeWVzX21pY3JvX2YyZTU5ZmVhX25vaGFzaF8xX2RhdGFbXTsKLQotI2VuZGlmICAvLyBURU5TT1JGTE9XX0xJVEVfTUlDUk9fRVhBTVBMRVNfTUlDUk9fU1BFRUNIX01JQ1JPX0ZFQVRVUkVTX1lFU19NSUNST19GRUFUVVJFU19EQVRBX0hfCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX21vZGVsX3NldHRpbmdzLmggYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX21vZGVsX3NldHRpbmdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ1YjA0NgotLS0gL2Rldi9udWxsCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fbW9kZWxfc2V0dGluZ3MuaApAQCAtMCwwICsxLDM3IEBACisvKiBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2lmbmRlZiBURU5TT1JGTE9XX0xJVEVfTUlDUk9fRVhBTVBMRVNfTUlDUk9fU1BFRUNIX01JQ1JPX01PREVMX1NFVFRJTkdTX0hfCisjZGVmaW5lIFRFTlNPUkZMT1dfTElURV9NSUNST19FWEFNUExFU19NSUNST19TUEVFQ0hfTUlDUk9fTU9ERUxfU0VUVElOR1NfSF8KKworLy8gVGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGRlcml2ZWQgZnJvbSB2YWx1ZXMgdXNlZCBkdXJpbmcgbW9kZWwgdHJhaW5pbmcuCisvLyBJZiB5b3UgY2hhbmdlIHRoZSB3YXkgeW91IHByZXByb2Nlc3MgdGhlIGlucHV0LCB1cGRhdGUgYWxsIHRoZXNlIGNvbnN0YW50cy4KK2NvbnN0ZXhwciBpbnQga0F1ZGlvU2FtcGxlRnJlcXVlbmN5ID0gMTYwMDA7Citjb25zdGV4cHIgaW50IGtGZWF0dXJlU2l6ZSA9IDQwOworY29uc3RleHByIGludCBrRmVhdHVyZUNvdW50ID0gNDk7Citjb25zdGV4cHIgaW50IGtGZWF0dXJlRWxlbWVudENvdW50ID0gKGtGZWF0dXJlU2l6ZSAqIGtGZWF0dXJlQ291bnQpOworY29uc3RleHByIGludCBrRmVhdHVyZVN0cmlkZU1zID0gMjA7Citjb25zdGV4cHIgaW50IGtGZWF0dXJlRHVyYXRpb25NcyA9IDMwOworCisvLyBWYXJpYWJsZXMgZm9yIHRoZSBtb2RlbCdzIG91dHB1dCBjYXRlZ29yaWVzLgorY29uc3RleHByIGludCBrQ2F0ZWdvcnlDb3VudCA9IDQ7Citjb25zdGV4cHIgY29uc3QgY2hhcioga0NhdGVnb3J5TGFiZWxzW2tDYXRlZ29yeUNvdW50XSA9IHsKKyAgICAic2lsZW5jZSIsCisgICAgInVua25vd24iLAorICAgICJ5ZXMiLAorICAgICJubyIsCit9OworCisjZW5kaWYgIC8vIFRFTlNPUkZMT1dfTElURV9NSUNST19FWEFNUExFU19NSUNST19TUEVFQ0hfTUlDUk9fTU9ERUxfU0VUVElOR1NfSF8KZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fc3BlZWNoX2JpbmFyeV9tb2NrX3Rlc3Quc2ggYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX3NwZWVjaF9iaW5hcnlfbW9ja190ZXN0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwNTE1ZDdjLi4wMDAwMDAwCi0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fc3BlZWNoX2JpbmFyeV9tb2NrX3Rlc3Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0jIS9iaW4vYmFzaAotIyBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMKLSMgQmFzaCB1bml0IHRlc3RzIGZvciB0aGUgZXhhbXBsZSBiaW5hcnkuCi0KLXNldCAtZQotCi1PVVRQVVRfTE9HX0ZJTEU9JHtURVNUX1RNUERJUn0vb3V0cHV0X2xvZy50eHQKLSR7VEVTVF9TUkNESVJ9LyR7VEVTVF9XT1JLU1BBQ0V9L3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fc3BlZWNoX21vY2sgMj4mMSB8IGhlYWQgPiAke09VVFBVVF9MT0dfRklMRX0KLQotaWYgISBncmVwIC1xICdIZWFyZCAnICR7T1VUUFVUX0xPR19GSUxFfTsgdGhlbgotICBlY2hvICJFUlJPUjogRXhwZWN0ZWQgbG9ncyBub3QgZm91bmQgaW4gb3V0cHV0ICcke09VVFBVVF9MT0dfRklMRX0nIgotICBleGl0IDEKLWZpCi0KLWVjaG8KLWVjaG8gIlNVQ0NFU1M6IG1pY3JvX3NwZWVjaF9iaW5hcnlfbW9ja190ZXN0IFBBU1NFRCIKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fc3BlZWNoX3Rlc3QuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX3NwZWVjaF90ZXN0LmNjCmluZGV4IDU2Y2IxNTYuLjAxOTE5NTggMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fc3BlZWNoX3Rlc3QuY2MKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19zcGVlY2hfdGVzdC5jYwpAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgMjAyNCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTEzLDEzMiArMTMsMjY4IEBACiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzL25vX21pY3JvX2ZlYXR1cmVzX2RhdGEuaCIKLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX2ZlYXR1cmVzL3llc19taWNyb19mZWF0dXJlc19kYXRhLmgiCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19zcGVlY2hfbW9kZWxfZGF0YS5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2NvcmUvYy9jb21tb24uaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX21vZGVsX3NldHRpbmdzLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9tb2RlbHMvYXVkaW9fcHJlcHJvY2Vzc29yX2ludDhfbW9kZWxfZGF0YS5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbW9kZWxzL21pY3JvX3NwZWVjaF9xdWFudGl6ZWRfbW9kZWxfZGF0YS5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvdGVzdGRhdGEvbm9fMTAwMG1zX2F1ZGlvX2RhdGEuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3Rlc3RkYXRhL25vXzMwbXNfYXVkaW9fZGF0YS5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvdGVzdGRhdGEvbm9pc2VfMTAwMG1zX2F1ZGlvX2RhdGEuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3Rlc3RkYXRhL3NpbGVuY2VfMTAwMG1zX2F1ZGlvX2RhdGEuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3Rlc3RkYXRhL3llc18xMDAwbXNfYXVkaW9fZGF0YS5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvdGVzdGRhdGEveWVzXzMwbXNfYXVkaW9fZGF0YS5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19pbnRlcnByZXRlci5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19sb2cuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fbXV0YWJsZV9vcF9yZXNvbHZlci5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0aW5nL21pY3JvX3Rlc3QuaCIKLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvc2NoZW1hL3NjaGVtYV9nZW5lcmF0ZWQuaCIKKworbmFtZXNwYWNlIHsKKworLy8gQXJlbmEgc2l6ZSBpcyBhIGd1ZXNzdGltYXRlLCBmb2xsb3dlZCBieSB1c2Ugb2YKKy8vIE1pY3JvSW50ZXJwcmV0ZXI6OmFyZW5hX3VzZWRfYnl0ZXMoKSBvbiBib3RoIHRoZSBBdWRpb1ByZXByb2Nlc3NvciBhbmQKKy8vIE1pY3JvU3BlZWNoIG1vZGVscyBhbmQgdXNpbmcgdGhlIGxhcmdlciBvZiB0aGUgdHdvIHJlc3VsdHMuCitjb25zdGV4cHIgc2l6ZV90IGtBcmVuYVNpemUgPSAyODU4NDsgIC8vIHh0ZW5zYSBwNgorYWxpZ25hcygxNikgdWludDhfdCBnX2FyZW5hW2tBcmVuYVNpemVdOworCit1c2luZyBGZWF0dXJlcyA9IGludDhfdFtrRmVhdHVyZUNvdW50XVtrRmVhdHVyZVNpemVdOworRmVhdHVyZXMgZ19mZWF0dXJlczsKKworY29uc3RleHByIGludCBrQXVkaW9TYW1wbGVEdXJhdGlvbkNvdW50ID0KKyAgICBrRmVhdHVyZUR1cmF0aW9uTXMgKiBrQXVkaW9TYW1wbGVGcmVxdWVuY3kgLyAxMDAwOworY29uc3RleHByIGludCBrQXVkaW9TYW1wbGVTdHJpZGVDb3VudCA9CisgICAga0ZlYXR1cmVTdHJpZGVNcyAqIGtBdWRpb1NhbXBsZUZyZXF1ZW5jeSAvIDEwMDA7CisKK3VzaW5nIE1pY3JvU3BlZWNoT3BSZXNvbHZlciA9IHRmbGl0ZTo6TWljcm9NdXRhYmxlT3BSZXNvbHZlcjw0PjsKK3VzaW5nIEF1ZGlvUHJlcHJvY2Vzc29yT3BSZXNvbHZlciA9IHRmbGl0ZTo6TWljcm9NdXRhYmxlT3BSZXNvbHZlcjwxOD47CisKK1RmTGl0ZVN0YXR1cyBSZWdpc3Rlck9wcyhNaWNyb1NwZWVjaE9wUmVzb2x2ZXImIG9wX3Jlc29sdmVyKSB7CisgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRSZXNoYXBlKCkpOworICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkRnVsbHlDb25uZWN0ZWQoKSk7CisgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGREZXB0aHdpc2VDb252MkQoKSk7CisgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRTb2Z0bWF4KCkpOworICByZXR1cm4ga1RmTGl0ZU9rOworfQorCitUZkxpdGVTdGF0dXMgUmVnaXN0ZXJPcHMoQXVkaW9QcmVwcm9jZXNzb3JPcFJlc29sdmVyJiBvcF9yZXNvbHZlcikgeworICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkUmVzaGFwZSgpKTsKKyAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZENhc3QoKSk7CisgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRTdHJpZGVkU2xpY2UoKSk7CisgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRDb25jYXRlbmF0aW9uKCkpOworICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkTXVsKCkpOworICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkQWRkKCkpOworICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkRGl2KCkpOworICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkTWluaW11bSgpKTsKKyAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZE1heGltdW0oKSk7CisgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRXaW5kb3coKSk7CisgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRGZnRBdXRvU2NhbGUoKSk7CisgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRSZmZ0KCkpOworICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkRW5lcmd5KCkpOworICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkRmlsdGVyQmFuaygpKTsKKyAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZEZpbHRlckJhbmtTcXVhcmVSb290KCkpOworICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkRmlsdGVyQmFua1NwZWN0cmFsU3VidHJhY3Rpb24oKSk7CisgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRQQ0FOKCkpOworICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkRmlsdGVyQmFua0xvZygpKTsKKyAgcmV0dXJuIGtUZkxpdGVPazsKK30KKworVGZMaXRlU3RhdHVzIExvYWRNaWNyb1NwZWVjaE1vZGVsQW5kUGVyZm9ybUluZmVyZW5jZSgKKyAgICBjb25zdCBGZWF0dXJlcyYgZmVhdHVyZXMsIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2xhYmVsKSB7CisgIC8vIE1hcCB0aGUgbW9kZWwgaW50byBhIHVzYWJsZSBkYXRhIHN0cnVjdHVyZS4gVGhpcyBkb2Vzbid0IGludm9sdmUgYW55CisgIC8vIGNvcHlpbmcgb3IgcGFyc2luZywgaXQncyBhIHZlcnkgbGlnaHR3ZWlnaHQgb3BlcmF0aW9uLgorICBjb25zdCB0ZmxpdGU6Ok1vZGVsKiBtb2RlbCA9CisgICAgICB0ZmxpdGU6OkdldE1vZGVsKGdfbWljcm9fc3BlZWNoX3F1YW50aXplZF9tb2RlbF9kYXRhKTsKKyAgVEZfTElURV9NSUNST19FWFBFQ1QobW9kZWwtPnZlcnNpb24oKSA9PSBURkxJVEVfU0NIRU1BX1ZFUlNJT04pOworICBURl9MSVRFX01JQ1JPX0NIRUNLX0ZBSUwoKTsKKworICBNaWNyb1NwZWVjaE9wUmVzb2x2ZXIgb3BfcmVzb2x2ZXI7CisgIFRGX0xJVEVfTUlDUk9fRVhQRUNUKFJlZ2lzdGVyT3BzKG9wX3Jlc29sdmVyKSA9PSBrVGZMaXRlT2spOworICBURl9MSVRFX01JQ1JPX0NIRUNLX0ZBSUwoKTsKKworICB0ZmxpdGU6Ok1pY3JvSW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIobW9kZWwsIG9wX3Jlc29sdmVyLCBnX2FyZW5hLCBrQXJlbmFTaXplKTsKKworICBURl9MSVRFX01JQ1JPX0VYUEVDVChpbnRlcnByZXRlci5BbGxvY2F0ZVRlbnNvcnMoKSA9PSBrVGZMaXRlT2spOworICBURl9MSVRFX01JQ1JPX0NIRUNLX0ZBSUwoKTsKKworICBNaWNyb1ByaW50ZigiTWljcm9TcGVlY2ggbW9kZWwgYXJlbmEgc2l6ZSA9ICV1IiwKKyAgICAgICAgICAgICAgaW50ZXJwcmV0ZXIuYXJlbmFfdXNlZF9ieXRlcygpKTsKKworICBUZkxpdGVUZW5zb3IqIGlucHV0ID0gaW50ZXJwcmV0ZXIuaW5wdXQoMCk7CisgIFRGX0xJVEVfTUlDUk9fRVhQRUNUKGlucHV0ICE9IG51bGxwdHIpOworICBURl9MSVRFX01JQ1JPX0NIRUNLX0ZBSUwoKTsKKyAgLy8gY2hlY2sgaW5wdXQgc2hhcGUgaXMgY29tcGF0aWJsZSB3aXRoIG91ciBmZWF0dXJlIGRhdGEgc2l6ZQorICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUShrRmVhdHVyZUVsZW1lbnRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQtPmRpbXMtPmRhdGFbaW5wdXQtPmRpbXMtPnNpemUgLSAxXSk7CisgIFRGX0xJVEVfTUlDUk9fQ0hFQ0tfRkFJTCgpOworCisgIFRmTGl0ZVRlbnNvciogb3V0cHV0ID0gaW50ZXJwcmV0ZXIub3V0cHV0KDApOworICBURl9MSVRFX01JQ1JPX0VYUEVDVChvdXRwdXQgIT0gbnVsbHB0cik7CisgIFRGX0xJVEVfTUlDUk9fQ0hFQ0tfRkFJTCgpOworICAvLyBjaGVjayBvdXRwdXQgc2hhcGUgaXMgY29tcGF0aWJsZSB3aXRoIG91ciBudW1iZXIgb2YgcHJlZGljdGlvbiBjYXRlZ29yaWVzCisgIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKGtDYXRlZ29yeUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQtPmRpbXMtPmRhdGFbb3V0cHV0LT5kaW1zLT5zaXplIC0gMV0pOworICBURl9MSVRFX01JQ1JPX0NIRUNLX0ZBSUwoKTsKKworICBmbG9hdCBvdXRwdXRfc2NhbGUgPSBvdXRwdXQtPnBhcmFtcy5zY2FsZTsKKyAgaW50IG91dHB1dF96ZXJvX3BvaW50ID0gb3V0cHV0LT5wYXJhbXMuemVyb19wb2ludDsKKworICBzdGQ6OmNvcHlfbigmZmVhdHVyZXNbMF1bMF0sIGtGZWF0dXJlRWxlbWVudENvdW50LAorICAgICAgICAgICAgICB0ZmxpdGU6OkdldFRlbnNvckRhdGE8aW50OF90PihpbnB1dCkpOworICBURl9MSVRFX01JQ1JPX0VYUEVDVChpbnRlcnByZXRlci5JbnZva2UoKSA9PSBrVGZMaXRlT2spOworICBURl9MSVRFX01JQ1JPX0NIRUNLX0ZBSUwoKTsKKworICAvLyBEZXF1YW50aXplIG91dHB1dCB2YWx1ZXMKKyAgZmxvYXQgY2F0ZWdvcnlfcHJlZGljdGlvbnNba0NhdGVnb3J5Q291bnRdOworICBNaWNyb1ByaW50ZigiTWljcm9TcGVlY2ggY2F0ZWdvcnkgcHJlZGljdGlvbnMgZm9yIDwlcz4iLCBleHBlY3RlZF9sYWJlbCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga0NhdGVnb3J5Q291bnQ7IGkrKykgeworICAgIGNhdGVnb3J5X3ByZWRpY3Rpb25zW2ldID0KKyAgICAgICAgKHRmbGl0ZTo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KG91dHB1dClbaV0gLSBvdXRwdXRfemVyb19wb2ludCkgKgorICAgICAgICBvdXRwdXRfc2NhbGU7CisgICAgTWljcm9QcmludGYoIiAgJS40ZiAlcyIsIHN0YXRpY19jYXN0PGRvdWJsZT4oY2F0ZWdvcnlfcHJlZGljdGlvbnNbaV0pLAorICAgICAgICAgICAgICAgIGtDYXRlZ29yeUxhYmVsc1tpXSk7CisgIH0KKyAgaW50IHByZWRpY3Rpb25faW5kZXggPQorICAgICAgc3RkOjpkaXN0YW5jZShzdGQ6OmJlZ2luKGNhdGVnb3J5X3ByZWRpY3Rpb25zKSwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYXhfZWxlbWVudChzdGQ6OmJlZ2luKGNhdGVnb3J5X3ByZWRpY3Rpb25zKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmVuZChjYXRlZ29yeV9wcmVkaWN0aW9ucykpKTsKKyAgVEZfTElURV9NSUNST19FWFBFQ1RfU1RSSU5HX0VRKGV4cGVjdGVkX2xhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NhdGVnb3J5TGFiZWxzW3ByZWRpY3Rpb25faW5kZXhdKTsKKyAgVEZfTElURV9NSUNST19DSEVDS19GQUlMKCk7CisKKyAgcmV0dXJuIGtUZkxpdGVPazsKK30KKworVGZMaXRlU3RhdHVzIEdlbmVyYXRlU2luZ2xlRmVhdHVyZShjb25zdCBpbnQxNl90KiBhdWRpb19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYXVkaW9fZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QqIGZlYXR1cmVfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZmxpdGU6Ok1pY3JvSW50ZXJwcmV0ZXIqIGludGVycHJldGVyKSB7CisgIFRmTGl0ZVRlbnNvciogaW5wdXQgPSBpbnRlcnByZXRlci0+aW5wdXQoMCk7CisgIFRGX0xJVEVfTUlDUk9fRVhQRUNUKGlucHV0ICE9IG51bGxwdHIpOworICBURl9MSVRFX01JQ1JPX0NIRUNLX0ZBSUwoKTsKKyAgLy8gY2hlY2sgaW5wdXQgc2hhcGUgaXMgY29tcGF0aWJsZSB3aXRoIG91ciBhdWRpbyBzYW1wbGUgc2l6ZQorICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUShrQXVkaW9TYW1wbGVEdXJhdGlvbkNvdW50LCBhdWRpb19kYXRhX3NpemUpOworICBURl9MSVRFX01JQ1JPX0NIRUNLX0ZBSUwoKTsKKyAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoa0F1ZGlvU2FtcGxlRHVyYXRpb25Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQtPmRpbXMtPmRhdGFbaW5wdXQtPmRpbXMtPnNpemUgLSAxXSk7CisgIFRGX0xJVEVfTUlDUk9fQ0hFQ0tfRkFJTCgpOworCisgIFRmTGl0ZVRlbnNvciogb3V0cHV0ID0gaW50ZXJwcmV0ZXItPm91dHB1dCgwKTsKKyAgVEZfTElURV9NSUNST19FWFBFQ1Qob3V0cHV0ICE9IG51bGxwdHIpOworICBURl9MSVRFX01JQ1JPX0NIRUNLX0ZBSUwoKTsKKyAgLy8gY2hlY2sgb3V0cHV0IHNoYXBlIGlzIGNvbXBhdGlibGUgd2l0aCBvdXIgZmVhdHVyZSBzaXplCisgIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKGtGZWF0dXJlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5kaW1zLT5kYXRhW291dHB1dC0+ZGltcy0+c2l6ZSAtIDFdKTsKKyAgVEZfTElURV9NSUNST19DSEVDS19GQUlMKCk7CisKKyAgc3RkOjpjb3B5X24oYXVkaW9fZGF0YSwgYXVkaW9fZGF0YV9zaXplLAorICAgICAgICAgICAgICB0ZmxpdGU6OkdldFRlbnNvckRhdGE8aW50MTZfdD4oaW5wdXQpKTsKKyAgVEZfTElURV9NSUNST19FWFBFQ1QoaW50ZXJwcmV0ZXItPkludm9rZSgpID09IGtUZkxpdGVPayk7CisgIFRGX0xJVEVfTUlDUk9fQ0hFQ0tfRkFJTCgpOworICBzdGQ6OmNvcHlfbih0ZmxpdGU6OkdldFRlbnNvckRhdGE8aW50OF90PihvdXRwdXQpLCBrRmVhdHVyZVNpemUsCisgICAgICAgICAgICAgIGZlYXR1cmVfb3V0cHV0KTsKKworICByZXR1cm4ga1RmTGl0ZU9rOworfQorCitUZkxpdGVTdGF0dXMgR2VuZXJhdGVGZWF0dXJlcyhjb25zdCBpbnQxNl90KiBhdWRpb19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGF1ZGlvX2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZlYXR1cmVzKiBmZWF0dXJlc19vdXRwdXQpIHsKKyAgLy8gTWFwIHRoZSBtb2RlbCBpbnRvIGEgdXNhYmxlIGRhdGEgc3RydWN0dXJlLiBUaGlzIGRvZXNuJ3QgaW52b2x2ZSBhbnkKKyAgLy8gY29weWluZyBvciBwYXJzaW5nLCBpdCdzIGEgdmVyeSBsaWdodHdlaWdodCBvcGVyYXRpb24uCisgIGNvbnN0IHRmbGl0ZTo6TW9kZWwqIG1vZGVsID0KKyAgICAgIHRmbGl0ZTo6R2V0TW9kZWwoZ19hdWRpb19wcmVwcm9jZXNzb3JfaW50OF9tb2RlbF9kYXRhKTsKKyAgVEZfTElURV9NSUNST19FWFBFQ1QobW9kZWwtPnZlcnNpb24oKSA9PSBURkxJVEVfU0NIRU1BX1ZFUlNJT04pOworICBURl9MSVRFX01JQ1JPX0NIRUNLX0ZBSUwoKTsKKworICBBdWRpb1ByZXByb2Nlc3Nvck9wUmVzb2x2ZXIgb3BfcmVzb2x2ZXI7CisgIFRGX0xJVEVfTUlDUk9fRVhQRUNUKFJlZ2lzdGVyT3BzKG9wX3Jlc29sdmVyKSA9PSBrVGZMaXRlT2spOworICBURl9MSVRFX01JQ1JPX0NIRUNLX0ZBSUwoKTsKKworICB0ZmxpdGU6Ok1pY3JvSW50ZXJwcmV0ZXIgaW50ZXJwcmV0ZXIobW9kZWwsIG9wX3Jlc29sdmVyLCBnX2FyZW5hLCBrQXJlbmFTaXplKTsKKworICBURl9MSVRFX01JQ1JPX0VYUEVDVChpbnRlcnByZXRlci5BbGxvY2F0ZVRlbnNvcnMoKSA9PSBrVGZMaXRlT2spOworICBURl9MSVRFX01JQ1JPX0NIRUNLX0ZBSUwoKTsKKworICBNaWNyb1ByaW50ZigiQXVkaW9QcmVwcm9jZXNzb3IgbW9kZWwgYXJlbmEgc2l6ZSA9ICV1IiwKKyAgICAgICAgICAgICAgaW50ZXJwcmV0ZXIuYXJlbmFfdXNlZF9ieXRlcygpKTsKKworICBzaXplX3QgcmVtYWluaW5nX3NhbXBsZXMgPSBhdWRpb19kYXRhX3NpemU7CisgIHNpemVfdCBmZWF0dXJlX2luZGV4ID0gMDsKKyAgd2hpbGUgKHJlbWFpbmluZ19zYW1wbGVzID49IGtBdWRpb1NhbXBsZUR1cmF0aW9uQ291bnQgJiYKKyAgICAgICAgIGZlYXR1cmVfaW5kZXggPCBrRmVhdHVyZUNvdW50KSB7CisgICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKAorICAgICAgICBHZW5lcmF0ZVNpbmdsZUZlYXR1cmUoYXVkaW9fZGF0YSwga0F1ZGlvU2FtcGxlRHVyYXRpb25Db3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgqZmVhdHVyZXNfb3V0cHV0KVtmZWF0dXJlX2luZGV4XSwgJmludGVycHJldGVyKSk7CisgICAgZmVhdHVyZV9pbmRleCsrOworICAgIGF1ZGlvX2RhdGEgKz0ga0F1ZGlvU2FtcGxlU3RyaWRlQ291bnQ7CisgICAgcmVtYWluaW5nX3NhbXBsZXMgLT0ga0F1ZGlvU2FtcGxlU3RyaWRlQ291bnQ7CisgIH0KKworICByZXR1cm4ga1RmTGl0ZU9rOworfQorCitUZkxpdGVTdGF0dXMgVGVzdEF1ZGlvU2FtcGxlKGNvbnN0IGNoYXIqIGxhYmVsLCBjb25zdCBpbnQxNl90KiBhdWRpb19kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgYXVkaW9fZGF0YV9zaXplKSB7CisgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUygKKyAgICAgIEdlbmVyYXRlRmVhdHVyZXMoYXVkaW9fZGF0YSwgYXVkaW9fZGF0YV9zaXplLCAmZ19mZWF0dXJlcykpOworICBURl9MSVRFX0VOU1VSRV9TVEFUVVMoCisgICAgICBMb2FkTWljcm9TcGVlY2hNb2RlbEFuZFBlcmZvcm1JbmZlcmVuY2UoZ19mZWF0dXJlcywgbGFiZWwpKTsKKyAgcmV0dXJuIGtUZkxpdGVPazsKK30KKworfSAgLy8gbmFtZXNwYWNlCiAKIFRGX0xJVEVfTUlDUk9fVEVTVFNfQkVHSU4KIAotVEZfTElURV9NSUNST19URVNUKFRlc3RJbnZva2UpIHsKLSAgLy8gTWFwIHRoZSBtb2RlbCBpbnRvIGEgdXNhYmxlIGRhdGEgc3RydWN0dXJlLiBUaGlzIGRvZXNuJ3QgaW52b2x2ZSBhbnkKLSAgLy8gY29weWluZyBvciBwYXJzaW5nLCBpdCdzIGEgdmVyeSBsaWdodHdlaWdodCBvcGVyYXRpb24uCi0gIGNvbnN0IHRmbGl0ZTo6TW9kZWwqIG1vZGVsID0gOjp0ZmxpdGU6OkdldE1vZGVsKGdfbWljcm9fc3BlZWNoX21vZGVsX2RhdGEpOwotICBpZiAobW9kZWwtPnZlcnNpb24oKSAhPSBURkxJVEVfU0NIRU1BX1ZFUlNJT04pIHsKLSAgICBNaWNyb1ByaW50ZigKLSAgICAgICAgIk1vZGVsIHByb3ZpZGVkIGlzIHNjaGVtYSB2ZXJzaW9uICVkIG5vdCBlcXVhbCAiCi0gICAgICAgICJ0byBzdXBwb3J0ZWQgdmVyc2lvbiAlZC5cbiIsCi0gICAgICAgIG1vZGVsLT52ZXJzaW9uKCksIFRGTElURV9TQ0hFTUFfVkVSU0lPTik7CitURl9MSVRFX01JQ1JPX1RFU1QoTm9GZWF0dXJlVGVzdCkgeworICBpbnQ4X3QgZXhwZWN0ZWRfZmVhdHVyZVtrRmVhdHVyZVNpemVdID0geworICAgICAgMTI2LCAxMDMsIDEyNCwgMTAyLCAxMjQsIDEwMiwgMTIzLCAxMDAsIDExOCwgOTcsIDExOCwgMTAwLCAxMTgsIDk4LAorICAgICAgMTIxLCAxMDAsIDEyMSwgOTgsICAxMTcsIDkxLCAgOTYsICA3NCwgIDU0LCAgODcsIDEwMCwgODcsICAxMDksIDkyLAorICAgICAgOTEsICA4MCwgIDY0LCAgNTUsICA4MywgIDc0LCAgNzQsICA3OCwgIDExNCwgOTUsIDEwMSwgODEsCisgIH07CisKKyAgVEZfTElURV9FTlNVUkVfU1RBVFVTKEdlbmVyYXRlRmVhdHVyZXMoCisgICAgICBnX25vXzMwbXNfYXVkaW9fZGF0YSwgZ19ub18zMG1zX2F1ZGlvX2RhdGFfc2l6ZSwgJmdfZmVhdHVyZXMpKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrRmVhdHVyZVNpemU7IGkrKykgeworICAgIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKGdfZmVhdHVyZXNbMF1baV0sIGV4cGVjdGVkX2ZlYXR1cmVbaV0pOworICAgIFRGX0xJVEVfTUlDUk9fQ0hFQ0tfRkFJTCgpOwogICB9Cit9CiAKLSAgLy8gUHVsbCBpbiBvbmx5IHRoZSBvcGVyYXRpb24gaW1wbGVtZW50YXRpb25zIHdlIG5lZWQuCi0gIC8vIFRoaXMgcmVsaWVzIG9uIGEgY29tcGxldGUgbGlzdCBvZiBhbGwgdGhlIG9wcyBuZWVkZWQgYnkgdGhpcyBncmFwaC4KK1RGX0xJVEVfTUlDUk9fVEVTVChZZXNGZWF0dXJlVGVzdCkgeworICBpbnQ4X3QgZXhwZWN0ZWRfZmVhdHVyZVtrRmVhdHVyZVNpemVdID0geworICAgICAgMTI0LCAxMDUsIDEyNiwgMTAzLCAxMjUsIDEwMSwgMTIzLCAxMDAsIDExNiwgOTgsICAxMTUsIDk3LCAgMTEzLCA5MCwKKyAgICAgIDkxLCAgODIsICAxMDQsIDk2LCAgMTE3LCA5NywgIDEyMSwgMTAzLCAxMjYsIDEwMSwgMTI1LCAxMDQsIDEyNiwgMTA0LAorICAgICAgMTI1LCAxMDEsIDExNiwgOTAsICA4MSwgIDc0LCAgODAsICA3MSwgIDgzLCAgNzYsICA4MiwgIDcxLAorICB9OwogCi0gIHRmbGl0ZTo6TWljcm9NdXRhYmxlT3BSZXNvbHZlcjw0PiBtaWNyb19vcF9yZXNvbHZlcjsKLSAgbWljcm9fb3BfcmVzb2x2ZXIuQWRkRGVwdGh3aXNlQ29udjJEKCk7Ci0gIG1pY3JvX29wX3Jlc29sdmVyLkFkZEZ1bGx5Q29ubmVjdGVkKCk7Ci0gIG1pY3JvX29wX3Jlc29sdmVyLkFkZFJlc2hhcGUoKTsKLSAgbWljcm9fb3BfcmVzb2x2ZXIuQWRkU29mdG1heCgpOwotCi0gIC8vIENyZWF0ZSBhbiBhcmVhIG9mIG1lbW9yeSB0byB1c2UgZm9yIGlucHV0LCBvdXRwdXQsIGFuZCBpbnRlcm1lZGlhdGUgYXJyYXlzLgotI2lmIChkZWZpbmVkKFhURU5TQSkgJiYgZGVmaW5lZChWSVNJT05fUDYpKQotICBjb25zdGV4cHIgaW50IHRlbnNvcl9hcmVuYV9zaXplID0gMjggKiAxMDI0OwotI2VsaWYgZGVmaW5lZChYVEVOU0EpCi0gIGNvbnN0ZXhwciBpbnQgdGVuc29yX2FyZW5hX3NpemUgPSAxNSAqIDEwMjQ7Ci0jZWxpZiBkZWZpbmVkKEhFWEFHT04pCi0gIGNvbnN0ZXhwciBpbnQgdGVuc29yX2FyZW5hX3NpemUgPSAyNSAqIDEwMjQ7Ci0jZWxzZQotICBjb25zdGV4cHIgaW50IHRlbnNvcl9hcmVuYV9zaXplID0gMTAgKiAxMDI0OwotI2VuZGlmCi0gIGFsaWduYXMoMTYpIHVpbnQ4X3QgdGVuc29yX2FyZW5hW3RlbnNvcl9hcmVuYV9zaXplXTsKLQotICAvLyBCdWlsZCBhbiBpbnRlcnByZXRlciB0byBydW4gdGhlIG1vZGVsIHdpdGguCi0gIHRmbGl0ZTo6TWljcm9JbnRlcnByZXRlciBpbnRlcnByZXRlcihtb2RlbCwgbWljcm9fb3BfcmVzb2x2ZXIsIHRlbnNvcl9hcmVuYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbnNvcl9hcmVuYV9zaXplKTsKLSAgaW50ZXJwcmV0ZXIuQWxsb2NhdGVUZW5zb3JzKCk7Ci0KLSAgLy8gR2V0IGluZm9ybWF0aW9uIGFib3V0IHRoZSBtZW1vcnkgYXJlYSB0byB1c2UgZm9yIHRoZSBtb2RlbCdzIGlucHV0LgotICBUZkxpdGVUZW5zb3IqIGlucHV0ID0gaW50ZXJwcmV0ZXIuaW5wdXQoMCk7Ci0KLSAgLy8gTWFrZSBzdXJlIHRoZSBpbnB1dCBoYXMgdGhlIHByb3BlcnRpZXMgd2UgZXhwZWN0LgotICBURl9MSVRFX01JQ1JPX0VYUEVDVChpbnB1dCAhPSBudWxscHRyKTsKLSAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoMiwgaW5wdXQtPmRpbXMtPnNpemUpOwotICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUSgxLCBpbnB1dC0+ZGltcy0+ZGF0YVswXSk7Ci0gIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKDE5NjAsIGlucHV0LT5kaW1zLT5kYXRhWzFdKTsKLSAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoa1RmTGl0ZUludDgsIGlucHV0LT50eXBlKTsKLQotICAvLyBDb3B5IGEgc3BlY3Ryb2dyYW0gY3JlYXRlZCBmcm9tIGEgLndhdiBhdWRpbyBmaWxlIG9mIHNvbWVvbmUgc2F5aW5nICJZZXMiLAotICAvLyBpbnRvIHRoZSBtZW1vcnkgYXJlYSB1c2VkIGZvciB0aGUgaW5wdXQuCi0gIGNvbnN0IGludDhfdCogeWVzX2ZlYXR1cmVzX2RhdGEgPSBnX3llc19taWNyb19mMmU1OWZlYV9ub2hhc2hfMV9kYXRhOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlucHV0LT5ieXRlczsgKytpKSB7Ci0gICAgaW5wdXQtPmRhdGEuaW50OFtpXSA9IHllc19mZWF0dXJlc19kYXRhW2ldOworICBURl9MSVRFX0VOU1VSRV9TVEFUVVMoR2VuZXJhdGVGZWF0dXJlcygKKyAgICAgIGdfeWVzXzMwbXNfYXVkaW9fZGF0YSwgZ195ZXNfMzBtc19hdWRpb19kYXRhX3NpemUsICZnX2ZlYXR1cmVzKSk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga0ZlYXR1cmVTaXplOyBpKyspIHsKKyAgICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUShnX2ZlYXR1cmVzWzBdW2ldLCBleHBlY3RlZF9mZWF0dXJlW2ldKTsKKyAgICBURl9MSVRFX01JQ1JPX0NIRUNLX0ZBSUwoKTsKICAgfQorfQogCi0gIC8vIFJ1biB0aGUgbW9kZWwgb24gdGhpcyBpbnB1dCBhbmQgbWFrZSBzdXJlIGl0IHN1Y2NlZWRzLgotICBUZkxpdGVTdGF0dXMgaW52b2tlX3N0YXR1cyA9IGludGVycHJldGVyLkludm9rZSgpOwotICBpZiAoaW52b2tlX3N0YXR1cyAhPSBrVGZMaXRlT2spIHsKLSAgICBNaWNyb1ByaW50ZigiSW52b2tlIGZhaWxlZFxuIik7Ci0gIH0KLSAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoa1RmTGl0ZU9rLCBpbnZva2Vfc3RhdHVzKTsKK1RGX0xJVEVfTUlDUk9fVEVTVChOb1Rlc3QpIHsKKyAgVGVzdEF1ZGlvU2FtcGxlKCJubyIsIGdfbm9fMTAwMG1zX2F1ZGlvX2RhdGEsIGdfbm9fMTAwMG1zX2F1ZGlvX2RhdGFfc2l6ZSk7Cit9CiAKLSAgLy8gR2V0IHRoZSBvdXRwdXQgZnJvbSB0aGUgbW9kZWwsIGFuZCBtYWtlIHN1cmUgaXQncyB0aGUgZXhwZWN0ZWQgc2l6ZSBhbmQKLSAgLy8gdHlwZS4KLSAgVGZMaXRlVGVuc29yKiBvdXRwdXQgPSBpbnRlcnByZXRlci5vdXRwdXQoMCk7Ci0gIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKDIsIG91dHB1dC0+ZGltcy0+c2l6ZSk7Ci0gIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKDEsIG91dHB1dC0+ZGltcy0+ZGF0YVswXSk7Ci0gIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKDQsIG91dHB1dC0+ZGltcy0+ZGF0YVsxXSk7Ci0gIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKGtUZkxpdGVJbnQ4LCBvdXRwdXQtPnR5cGUpOworVEZfTElURV9NSUNST19URVNUKFllc1Rlc3QpIHsKKyAgVGVzdEF1ZGlvU2FtcGxlKCJ5ZXMiLCBnX3llc18xMDAwbXNfYXVkaW9fZGF0YSwgZ195ZXNfMTAwMG1zX2F1ZGlvX2RhdGFfc2l6ZSk7Cit9CiAKLSAgLy8gVGhlcmUgYXJlIGZvdXIgcG9zc2libGUgY2xhc3NlcyBpbiB0aGUgb3V0cHV0LCBlYWNoIHdpdGggYSBzY29yZS4KLSAgY29uc3QgaW50IGtTaWxlbmNlSW5kZXggPSAwOwotICBjb25zdCBpbnQga1Vua25vd25JbmRleCA9IDE7Ci0gIGNvbnN0IGludCBrWWVzSW5kZXggPSAyOwotICBjb25zdCBpbnQga05vSW5kZXggPSAzOworVEZfTElURV9NSUNST19URVNUKFNpbGVuY2VUZXN0KSB7CisgIFRlc3RBdWRpb1NhbXBsZSgic2lsZW5jZSIsIGdfc2lsZW5jZV8xMDAwbXNfYXVkaW9fZGF0YSwKKyAgICAgICAgICAgICAgICAgIGdfc2lsZW5jZV8xMDAwbXNfYXVkaW9fZGF0YV9zaXplKTsKK30KIAotICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZXhwZWN0ZWQgIlllcyIgc2NvcmUgaXMgaGlnaGVyIHRoYW4gdGhlIG90aGVyIGNsYXNzZXMuCi0gIHVpbnQ4X3Qgc2lsZW5jZV9zY29yZSA9IG91dHB1dC0+ZGF0YS5pbnQ4W2tTaWxlbmNlSW5kZXhdICsgMTI4OwotICB1aW50OF90IHVua25vd25fc2NvcmUgPSBvdXRwdXQtPmRhdGEuaW50OFtrVW5rbm93bkluZGV4XSArIDEyODsKLSAgdWludDhfdCB5ZXNfc2NvcmUgPSBvdXRwdXQtPmRhdGEuaW50OFtrWWVzSW5kZXhdICsgMTI4OwotICB1aW50OF90IG5vX3Njb3JlID0gb3V0cHV0LT5kYXRhLmludDhba05vSW5kZXhdICsgMTI4OwotICBURl9MSVRFX01JQ1JPX0VYUEVDVF9HVCh5ZXNfc2NvcmUsIHNpbGVuY2Vfc2NvcmUpOwotICBURl9MSVRFX01JQ1JPX0VYUEVDVF9HVCh5ZXNfc2NvcmUsIHVua25vd25fc2NvcmUpOwotICBURl9MSVRFX01JQ1JPX0VYUEVDVF9HVCh5ZXNfc2NvcmUsIG5vX3Njb3JlKTsKLQotICAvLyBOb3cgdGVzdCB3aXRoIGEgZGlmZmVyZW50IGlucHV0LCBmcm9tIGEgcmVjb3JkaW5nIG9mICJObyIuCi0gIGNvbnN0IGludDhfdCogbm9fZmVhdHVyZXNfZGF0YSA9IGdfbm9fbWljcm9fZjk2NDNkNDJfbm9oYXNoXzRfZGF0YTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbnB1dC0+Ynl0ZXM7ICsraSkgewotICAgIGlucHV0LT5kYXRhLmludDhbaV0gPSBub19mZWF0dXJlc19kYXRhW2ldOwotICB9Ci0KLSAgLy8gUnVuIHRoZSBtb2RlbCBvbiB0aGlzICJObyIgaW5wdXQuCi0gIGludm9rZV9zdGF0dXMgPSBpbnRlcnByZXRlci5JbnZva2UoKTsKLSAgaWYgKGludm9rZV9zdGF0dXMgIT0ga1RmTGl0ZU9rKSB7Ci0gICAgTWljcm9QcmludGYoIkludm9rZSBmYWlsZWRcbiIpOwotICB9Ci0gIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKGtUZkxpdGVPaywgaW52b2tlX3N0YXR1cyk7Ci0KLSAgLy8gR2V0IHRoZSBvdXRwdXQgZnJvbSB0aGUgbW9kZWwsIGFuZCBtYWtlIHN1cmUgaXQncyB0aGUgZXhwZWN0ZWQgc2l6ZSBhbmQKLSAgLy8gdHlwZS4KLSAgb3V0cHV0ID0gaW50ZXJwcmV0ZXIub3V0cHV0KDApOwotICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUSgyLCBvdXRwdXQtPmRpbXMtPnNpemUpOwotICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUSgxLCBvdXRwdXQtPmRpbXMtPmRhdGFbMF0pOwotICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUSg0LCBvdXRwdXQtPmRpbXMtPmRhdGFbMV0pOwotICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUShrVGZMaXRlSW50OCwgb3V0cHV0LT50eXBlKTsKLQotICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgZXhwZWN0ZWQgIk5vIiBzY29yZSBpcyBoaWdoZXIgdGhhbiB0aGUgb3RoZXIgY2xhc3Nlcy4KLSAgc2lsZW5jZV9zY29yZSA9IG91dHB1dC0+ZGF0YS5pbnQ4W2tTaWxlbmNlSW5kZXhdICsgMTI4OwotICB1bmtub3duX3Njb3JlID0gb3V0cHV0LT5kYXRhLmludDhba1Vua25vd25JbmRleF0gKyAxMjg7Ci0gIHllc19zY29yZSA9IG91dHB1dC0+ZGF0YS5pbnQ4W2tZZXNJbmRleF0gKyAxMjg7Ci0gIG5vX3Njb3JlID0gb3V0cHV0LT5kYXRhLmludDhba05vSW5kZXhdICsgMTI4OwotICBURl9MSVRFX01JQ1JPX0VYUEVDVF9HVChub19zY29yZSwgc2lsZW5jZV9zY29yZSk7Ci0gIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0dUKG5vX3Njb3JlLCB1bmtub3duX3Njb3JlKTsKLSAgVEZfTElURV9NSUNST19FWFBFQ1RfR1Qobm9fc2NvcmUsIHllc19zY29yZSk7Ci0KLSAgTWljcm9QcmludGYoIlJhbiBzdWNjZXNzZnVsbHlcbiIpOworVEZfTElURV9NSUNST19URVNUKE5vaXNlVGVzdCkgeworICBUZXN0QXVkaW9TYW1wbGUoInNpbGVuY2UiLCBnX25vaXNlXzEwMDBtc19hdWRpb19kYXRhLAorICAgICAgICAgICAgICAgICAgZ19ub2lzZV8xMDAwbXNfYXVkaW9fZGF0YV9zaXplKTsKIH0KIAogVEZfTElURV9NSUNST19URVNUU19FTkQKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbW9kZWxzL2F1ZGlvX3ByZXByb2Nlc3Nvcl9mbG9hdC50ZmxpdGUgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21vZGVscy9hdWRpb19wcmVwcm9jZXNzb3JfZmxvYXQudGZsaXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmOTFlYzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21vZGVscy9hdWRpb19wcmVwcm9jZXNzb3JfZmxvYXQudGZsaXRlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbW9kZWxzL2F1ZGlvX3ByZXByb2Nlc3Nvcl9pbnQ4LnRmbGl0ZSBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbW9kZWxzL2F1ZGlvX3ByZXByb2Nlc3Nvcl9pbnQ4LnRmbGl0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTAwODdiCi0tLSAvZGV2L251bGwKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9tb2RlbHMvYXVkaW9fcHJlcHJvY2Vzc29yX2ludDgudGZsaXRlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbWljcm9fc3BlZWNoLnRmbGl0ZSBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbW9kZWxzL21pY3JvX3NwZWVjaF9xdWFudGl6ZWQudGZsaXRlCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL21pY3JvX3NwZWVjaC50ZmxpdGUKcmVuYW1lIHRvIHRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvbW9kZWxzL21pY3JvX3NwZWVjaF9xdWFudGl6ZWQudGZsaXRlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvcmVjb2duaXplX2NvbW1hbmRzLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9yZWNvZ25pemVfY29tbWFuZHMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZWRiNDcuLjAwMDAwMDAKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9yZWNvZ25pemVfY29tbWFuZHMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzkgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMTcgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci15b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3JlY29nbml6ZV9jb21tYW5kcy5oIgotCi0jaW5jbHVkZSA8bGltaXRzPgotCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2xvZy5oIgotCi1SZWNvZ25pemVDb21tYW5kczo6UmVjb2duaXplQ29tbWFuZHMoaW50MzJfdCBhdmVyYWdlX3dpbmRvd19kdXJhdGlvbl9tcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGRldGVjdGlvbl90aHJlc2hvbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdXBwcmVzc2lvbl9tcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG1pbmltdW1fY291bnQpCi0gICAgOiBhdmVyYWdlX3dpbmRvd19kdXJhdGlvbl9tc18oYXZlcmFnZV93aW5kb3dfZHVyYXRpb25fbXMpLAotICAgICAgZGV0ZWN0aW9uX3RocmVzaG9sZF8oZGV0ZWN0aW9uX3RocmVzaG9sZCksCi0gICAgICBzdXBwcmVzc2lvbl9tc18oc3VwcHJlc3Npb25fbXMpLAotICAgICAgbWluaW11bV9jb3VudF8obWluaW11bV9jb3VudCksCi0gICAgICBwcmV2aW91c19yZXN1bHRzXygpIHsKLSAgcHJldmlvdXNfdG9wX2xhYmVsXyA9ICJzaWxlbmNlIjsKLSAgcHJldmlvdXNfdG9wX2xhYmVsX3RpbWVfID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWluKCk7Ci19Ci0KLVRmTGl0ZVN0YXR1cyBSZWNvZ25pemVDb21tYW5kczo6UHJvY2Vzc0xhdGVzdFJlc3VsdHMoCi0gICAgY29uc3QgVGZMaXRlVGVuc29yKiBsYXRlc3RfcmVzdWx0cywgY29uc3QgaW50MzJfdCBjdXJyZW50X3RpbWVfbXMsCi0gICAgY29uc3QgY2hhcioqIGZvdW5kX2NvbW1hbmQsIHVpbnQ4X3QqIHNjb3JlLCBib29sKiBpc19uZXdfY29tbWFuZCkgewotICBpZiAoKGxhdGVzdF9yZXN1bHRzLT5kaW1zLT5zaXplICE9IDIpIHx8Ci0gICAgICAobGF0ZXN0X3Jlc3VsdHMtPmRpbXMtPmRhdGFbMF0gIT0gMSkgfHwKLSAgICAgIChsYXRlc3RfcmVzdWx0cy0+ZGltcy0+ZGF0YVsxXSAhPSBrQ2F0ZWdvcnlDb3VudCkpIHsKLSAgICBNaWNyb1ByaW50ZigKLSAgICAgICAgIlRoZSByZXN1bHRzIGZvciByZWNvZ25pdGlvbiBzaG91bGQgY29udGFpbiAlZCBlbGVtZW50cywgYnV0IHRoZXJlIGFyZSAiCi0gICAgICAgICIlZCBpbiBhbiAlZC1kaW1lbnNpb25hbCBzaGFwZSIsCi0gICAgICAgIGtDYXRlZ29yeUNvdW50LCBsYXRlc3RfcmVzdWx0cy0+ZGltcy0+ZGF0YVsxXSwKLSAgICAgICAgbGF0ZXN0X3Jlc3VsdHMtPmRpbXMtPnNpemUpOwotICAgIHJldHVybiBrVGZMaXRlRXJyb3I7Ci0gIH0KLQotICBpZiAobGF0ZXN0X3Jlc3VsdHMtPnR5cGUgIT0ga1RmTGl0ZUludDgpIHsKLSAgICBNaWNyb1ByaW50ZigKLSAgICAgICAgIlRoZSByZXN1bHRzIGZvciByZWNvZ25pdGlvbiBzaG91bGQgYmUgaW50OF90IGVsZW1lbnRzLCBidXQgYXJlICVkIiwKLSAgICAgICAgbGF0ZXN0X3Jlc3VsdHMtPnR5cGUpOwotICAgIHJldHVybiBrVGZMaXRlRXJyb3I7Ci0gIH0KLQotICBpZiAoKCFwcmV2aW91c19yZXN1bHRzXy5lbXB0eSgpKSAmJgotICAgICAgKGN1cnJlbnRfdGltZV9tcyA8IHByZXZpb3VzX3Jlc3VsdHNfLmZyb250KCkudGltZV8pKSB7Ci0gICAgTWljcm9QcmludGYoCi0gICAgICAgICJSZXN1bHRzIG11c3QgYmUgZmVkIGluIGluY3JlYXNpbmcgdGltZSBvcmRlciwgYnV0IHJlY2VpdmVkIGEgIgotICAgICAgICAidGltZXN0YW1wIG9mICVkIHRoYXQgd2FzIGVhcmxpZXIgdGhhbiB0aGUgcHJldmlvdXMgb25lIG9mICVkIiwKLSAgICAgICAgY3VycmVudF90aW1lX21zLCBwcmV2aW91c19yZXN1bHRzXy5mcm9udCgpLnRpbWVfKTsKLSAgICByZXR1cm4ga1RmTGl0ZUVycm9yOwotICB9Ci0KLSAgLy8gQWRkIHRoZSBsYXRlc3QgcmVzdWx0cyB0byB0aGUgaGVhZCBvZiB0aGUgcXVldWUuCi0gIHByZXZpb3VzX3Jlc3VsdHNfLnB1c2hfYmFjayh7Y3VycmVudF90aW1lX21zLCBsYXRlc3RfcmVzdWx0cy0+ZGF0YS5pbnQ4fSk7Ci0KLSAgLy8gUHJ1bmUgYW55IGVhcmxpZXIgcmVzdWx0cyB0aGF0IGFyZSB0b28gb2xkIGZvciB0aGUgYXZlcmFnaW5nIHdpbmRvdy4KLSAgY29uc3QgaW50NjRfdCB0aW1lX2xpbWl0ID0gY3VycmVudF90aW1lX21zIC0gYXZlcmFnZV93aW5kb3dfZHVyYXRpb25fbXNfOwotICB3aGlsZSAoKCFwcmV2aW91c19yZXN1bHRzXy5lbXB0eSgpKSAmJgotICAgICAgICAgcHJldmlvdXNfcmVzdWx0c18uZnJvbnQoKS50aW1lXyA8IHRpbWVfbGltaXQpIHsKLSAgICBwcmV2aW91c19yZXN1bHRzXy5wb3BfZnJvbnQoKTsKLSAgfQotCi0gIC8vIElmIHRoZXJlIGFyZSB0b28gZmV3IHJlc3VsdHMsIGFzc3VtZSB0aGUgcmVzdWx0IHdpbGwgYmUgdW5yZWxpYWJsZSBhbmQKLSAgLy8gYmFpbC4KLSAgY29uc3QgaW50NjRfdCBob3dfbWFueV9yZXN1bHRzID0gcHJldmlvdXNfcmVzdWx0c18uc2l6ZSgpOwotICBjb25zdCBpbnQ2NF90IGVhcmxpZXN0X3RpbWUgPSBwcmV2aW91c19yZXN1bHRzXy5mcm9udCgpLnRpbWVfOwotICBjb25zdCBpbnQ2NF90IHNhbXBsZXNfZHVyYXRpb24gPSBjdXJyZW50X3RpbWVfbXMgLSBlYXJsaWVzdF90aW1lOwotICBpZiAoKGhvd19tYW55X3Jlc3VsdHMgPCBtaW5pbXVtX2NvdW50XykgfHwKLSAgICAgIChzYW1wbGVzX2R1cmF0aW9uIDwgKGF2ZXJhZ2Vfd2luZG93X2R1cmF0aW9uX21zXyAvIDQpKSkgewotICAgICpmb3VuZF9jb21tYW5kID0gcHJldmlvdXNfdG9wX2xhYmVsXzsKLSAgICAqc2NvcmUgPSAwOwotICAgICppc19uZXdfY29tbWFuZCA9IGZhbHNlOwotICAgIHJldHVybiBrVGZMaXRlT2s7Ci0gIH0KLQotICAvLyBDYWxjdWxhdGUgdGhlIGF2ZXJhZ2Ugc2NvcmUgYWNyb3NzIGFsbCB0aGUgcmVzdWx0cyBpbiB0aGUgd2luZG93LgotICBpbnQzMl90IGF2ZXJhZ2Vfc2NvcmVzW2tDYXRlZ29yeUNvdW50XTsKLSAgZm9yIChpbnQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgcHJldmlvdXNfcmVzdWx0c18uc2l6ZSgpOyArK29mZnNldCkgewotICAgIFByZXZpb3VzUmVzdWx0c1F1ZXVlOjpSZXN1bHQgcHJldmlvdXNfcmVzdWx0ID0KLSAgICAgICAgcHJldmlvdXNfcmVzdWx0c18uZnJvbV9mcm9udChvZmZzZXQpOwotICAgIGNvbnN0IGludDhfdCogc2NvcmVzID0gcHJldmlvdXNfcmVzdWx0LnNjb3JlczsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGtDYXRlZ29yeUNvdW50OyArK2kpIHsKLSAgICAgIGlmIChvZmZzZXQgPT0gMCkgewotICAgICAgICBhdmVyYWdlX3Njb3Jlc1tpXSA9IHNjb3Jlc1tpXSArIDEyODsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGF2ZXJhZ2Vfc2NvcmVzW2ldICs9IHNjb3Jlc1tpXSArIDEyODsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQ2F0ZWdvcnlDb3VudDsgKytpKSB7Ci0gICAgYXZlcmFnZV9zY29yZXNbaV0gLz0gaG93X21hbnlfcmVzdWx0czsKLSAgfQotCi0gIC8vIEZpbmQgdGhlIGN1cnJlbnQgaGlnaGVzdCBzY29yaW5nIGNhdGVnb3J5LgotICBpbnQgY3VycmVudF90b3BfaW5kZXggPSAwOwotICBpbnQzMl90IGN1cnJlbnRfdG9wX3Njb3JlID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQ2F0ZWdvcnlDb3VudDsgKytpKSB7Ci0gICAgaWYgKGF2ZXJhZ2Vfc2NvcmVzW2ldID4gY3VycmVudF90b3Bfc2NvcmUpIHsKLSAgICAgIGN1cnJlbnRfdG9wX3Njb3JlID0gYXZlcmFnZV9zY29yZXNbaV07Ci0gICAgICBjdXJyZW50X3RvcF9pbmRleCA9IGk7Ci0gICAgfQotICB9Ci0gIGNvbnN0IGNoYXIqIGN1cnJlbnRfdG9wX2xhYmVsID0ga0NhdGVnb3J5TGFiZWxzW2N1cnJlbnRfdG9wX2luZGV4XTsKLQotICAvLyBJZiB3ZSd2ZSByZWNlbnRseSBoYWQgYW5vdGhlciBsYWJlbCB0cmlnZ2VyLCBhc3N1bWUgb25lIHRoYXQgb2NjdXJzIHRvbwotICAvLyBzb29uIGFmdGVyd2FyZHMgaXMgYSBiYWQgcmVzdWx0LgotICBpbnQ2NF90IHRpbWVfc2luY2VfbGFzdF90b3A7Ci0gIGlmICgocHJldmlvdXNfdG9wX2xhYmVsXyA9PSBrQ2F0ZWdvcnlMYWJlbHNbMF0pIHx8Ci0gICAgICAocHJldmlvdXNfdG9wX2xhYmVsX3RpbWVfID09IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MzJfdD46Om1pbigpKSkgewotICAgIHRpbWVfc2luY2VfbGFzdF90b3AgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+OjptYXgoKTsKLSAgfSBlbHNlIHsKLSAgICB0aW1lX3NpbmNlX2xhc3RfdG9wID0gY3VycmVudF90aW1lX21zIC0gcHJldmlvdXNfdG9wX2xhYmVsX3RpbWVfOwotICB9Ci0gIGlmICgoY3VycmVudF90b3Bfc2NvcmUgPiBkZXRlY3Rpb25fdGhyZXNob2xkXykgJiYKLSAgICAgICgoY3VycmVudF90b3BfbGFiZWwgIT0gcHJldmlvdXNfdG9wX2xhYmVsXykgfHwKLSAgICAgICAodGltZV9zaW5jZV9sYXN0X3RvcCA+IHN1cHByZXNzaW9uX21zXykpKSB7Ci0gICAgcHJldmlvdXNfdG9wX2xhYmVsXyA9IGN1cnJlbnRfdG9wX2xhYmVsOwotICAgIHByZXZpb3VzX3RvcF9sYWJlbF90aW1lXyA9IGN1cnJlbnRfdGltZV9tczsKLSAgICAqaXNfbmV3X2NvbW1hbmQgPSB0cnVlOwotICB9IGVsc2UgewotICAgICppc19uZXdfY29tbWFuZCA9IGZhbHNlOwotICB9Ci0gICpmb3VuZF9jb21tYW5kID0gY3VycmVudF90b3BfbGFiZWw7Ci0gICpzY29yZSA9IGN1cnJlbnRfdG9wX3Njb3JlOwotCi0gIHJldHVybiBrVGZMaXRlT2s7Ci19CmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3JlY29nbml6ZV9jb21tYW5kcy5oIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9yZWNvZ25pemVfY29tbWFuZHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE1YTg5NS4uMDAwMDAwMAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3JlY29nbml6ZV9jb21tYW5kcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDE3IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoteW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0jaWZuZGVmIFRFTlNPUkZMT1dfTElURV9NSUNST19FWEFNUExFU19NSUNST19TUEVFQ0hfUkVDT0dOSVpFX0NPTU1BTkRTX0hfCi0jZGVmaW5lIFRFTlNPUkZMT1dfTElURV9NSUNST19FWEFNUExFU19NSUNST19TUEVFQ0hfUkVDT0dOSVpFX0NPTU1BTkRTX0hfCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2MvY29tbW9uLmgiCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9taWNyb19mZWF0dXJlcy9taWNyb19tb2RlbF9zZXR0aW5ncy5oIgotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19sb2cuaCIKLQotLy8gUGFydGlhbCBpbXBsZW1lbnRhdGlvbiBvZiBzdGQ6OmRlcXVldWUsIGp1c3QgcHJvdmlkaW5nIHRoZSBmdW5jdGlvbmFsaXR5Ci0vLyB0aGF0J3MgbmVlZGVkIHRvIGtlZXAgYSByZWNvcmQgb2YgcHJldmlvdXMgbmV1cmFsIG5ldHdvcmsgcmVzdWx0cyBvdmVyIGEKLS8vIHNob3J0IHRpbWUgcGVyaW9kLCBzbyB0aGV5IGNhbiBiZSBhdmVyYWdlZCB0b2dldGhlciB0byBwcm9kdWNlIGEgbW9yZQotLy8gYWNjdXJhdGUgb3ZlcmFsbCBwcmVkaWN0aW9uLiBUaGlzIGRvZXNuJ3QgdXNlIGFueSBkeW5hbWljIG1lbW9yeSBhbGxvY2F0aW9uCi0vLyBzbyBpdCdzIGEgYmV0dGVyIGZpdCBmb3IgbWljcm9jb250cm9sbGVyIGFwcGxpY2F0aW9ucywgYnV0IHRoaXMgZG9lcyBtZWFuCi0vLyB0aGVyZSBhcmUgaGFyZCBsaW1pdHMgb24gdGhlIG51bWJlciBvZiByZXN1bHRzIGl0IGNhbiBzdG9yZS4KLWNsYXNzIFByZXZpb3VzUmVzdWx0c1F1ZXVlIHsKLSBwdWJsaWM6Ci0gIFByZXZpb3VzUmVzdWx0c1F1ZXVlKCkgOiBmcm9udF9pbmRleF8oMCksIHNpemVfKDApIHt9Ci0KLSAgLy8gRGF0YSBzdHJ1Y3R1cmUgdGhhdCBob2xkcyBhbiBpbmZlcmVuY2UgcmVzdWx0LCBhbmQgdGhlIHRpbWUgd2hlbiBpdAotICAvLyB3YXMgcmVjb3JkZWQuCi0gIHN0cnVjdCBSZXN1bHQgewotICAgIFJlc3VsdCgpIDogdGltZV8oMCksIHNjb3JlcygpIHt9Ci0gICAgUmVzdWx0KGludDMyX3QgdGltZSwgaW50OF90KiBpbnB1dF9zY29yZXMpIDogdGltZV8odGltZSkgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQ2F0ZWdvcnlDb3VudDsgKytpKSB7Ci0gICAgICAgIHNjb3Jlc1tpXSA9IGlucHV0X3Njb3Jlc1tpXTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaW50MzJfdCB0aW1lXzsKLSAgICBpbnQ4X3Qgc2NvcmVzW2tDYXRlZ29yeUNvdW50XTsKLSAgfTsKLQotICBpbnQgc2l6ZSgpIHsgcmV0dXJuIHNpemVfOyB9Ci0gIGJvb2wgZW1wdHkoKSB7IHJldHVybiBzaXplXyA9PSAwOyB9Ci0gIFJlc3VsdCYgZnJvbnQoKSB7IHJldHVybiByZXN1bHRzX1tmcm9udF9pbmRleF9dOyB9Ci0gIFJlc3VsdCYgYmFjaygpIHsKLSAgICBpbnQgYmFja19pbmRleCA9IGZyb250X2luZGV4XyArIChzaXplXyAtIDEpOwotICAgIGlmIChiYWNrX2luZGV4ID49IGtNYXhSZXN1bHRzKSB7Ci0gICAgICBiYWNrX2luZGV4IC09IGtNYXhSZXN1bHRzOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0c19bYmFja19pbmRleF07Ci0gIH0KLQotICB2b2lkIHB1c2hfYmFjayhjb25zdCBSZXN1bHQmIGVudHJ5KSB7Ci0gICAgaWYgKHNpemUoKSA+PSBrTWF4UmVzdWx0cykgewotICAgICAgTWljcm9QcmludGYoIkNvdWxkbid0IHB1c2hfYmFjayBsYXRlc3QgcmVzdWx0LCB0b28gbWFueSBhbHJlYWR5ISIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzaXplXyArPSAxOwotICAgIGJhY2soKSA9IGVudHJ5OwotICB9Ci0KLSAgUmVzdWx0IHBvcF9mcm9udCgpIHsKLSAgICBpZiAoc2l6ZSgpIDw9IDApIHsKLSAgICAgIE1pY3JvUHJpbnRmKCJDb3VsZG4ndCBwb3BfZnJvbnQgcmVzdWx0LCBub25lIHByZXNlbnQhIik7Ci0gICAgICByZXR1cm4gUmVzdWx0KCk7Ci0gICAgfQotICAgIFJlc3VsdCByZXN1bHQgPSBmcm9udCgpOwotICAgIGZyb250X2luZGV4XyArPSAxOwotICAgIGlmIChmcm9udF9pbmRleF8gPj0ga01heFJlc3VsdHMpIHsKLSAgICAgIGZyb250X2luZGV4XyA9IDA7Ci0gICAgfQotICAgIHNpemVfIC09IDE7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8vIE1vc3Qgb2YgdGhlIGZ1bmN0aW9ucyBhcmUgZHVwbGljYXRlcyBvZiBkZXF1ZXVlIGNvbnRhaW5lcnMsIGJ1dCB0aGlzCi0gIC8vIGlzIGEgaGVscGVyIHRoYXQgbWFrZXMgaXQgZWFzeSB0byBpdGVyYXRlIHRocm91Z2ggdGhlIGNvbnRlbnRzIG9mIHRoZQotICAvLyBxdWV1ZS4KLSAgUmVzdWx0JiBmcm9tX2Zyb250KGludCBvZmZzZXQpIHsKLSAgICBpZiAoKG9mZnNldCA8IDApIHx8IChvZmZzZXQgPj0gc2l6ZV8pKSB7Ci0gICAgICBNaWNyb1ByaW50ZigiQXR0ZW1wdCB0byByZWFkIGJleW9uZCB0aGUgZW5kIG9mIHRoZSBxdWV1ZSEiKTsKLSAgICAgIG9mZnNldCA9IHNpemVfIC0gMTsKLSAgICB9Ci0gICAgaW50IGluZGV4ID0gZnJvbnRfaW5kZXhfICsgb2Zmc2V0OwotICAgIGlmIChpbmRleCA+PSBrTWF4UmVzdWx0cykgewotICAgICAgaW5kZXggLT0ga01heFJlc3VsdHM7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHRzX1tpbmRleF07Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBjb25zdGV4cHIgaW50IGtNYXhSZXN1bHRzID0gNTA7Ci0gIFJlc3VsdCByZXN1bHRzX1trTWF4UmVzdWx0c107Ci0KLSAgaW50IGZyb250X2luZGV4XzsKLSAgaW50IHNpemVfOwotfTsKLQotLy8gVGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBhcHBseSBhIHZlcnkgcHJpbWl0aXZlIGRlY29kaW5nIG1vZGVsIG9uIHRvcCBvZiB0aGUKLS8vIGluc3RhbnRhbmVvdXMgcmVzdWx0cyBmcm9tIHJ1bm5pbmcgYW4gYXVkaW8gcmVjb2duaXRpb24gbW9kZWwgb24gYSBzaW5nbGUKLS8vIHdpbmRvdyBvZiBzYW1wbGVzLiBJdCBhcHBsaWVzIHNtb290aGluZyBvdmVyIHRpbWUgc28gdGhhdCBub2lzeSBpbmRpdmlkdWFsCi0vLyBsYWJlbCBzY29yZXMgYXJlIGF2ZXJhZ2VkLCBpbmNyZWFzaW5nIHRoZSBjb25maWRlbmNlIHRoYXQgYXBwYXJlbnQgbWF0Y2hlcwotLy8gYXJlIHJlYWwuCi0vLyBUbyB1c2UgaXQsIHlvdSBzaG91bGQgY3JlYXRlIGEgY2xhc3Mgb2JqZWN0IHdpdGggdGhlIGNvbmZpZ3VyYXRpb24geW91Ci0vLyB3YW50LCBhbmQgdGhlbiBmZWVkIHJlc3VsdHMgZnJvbSBydW5uaW5nIGEgVGVuc29yRmxvdyBtb2RlbCBpbnRvIHRoZQotLy8gcHJvY2Vzc2luZyBtZXRob2QuIFRoZSB0aW1lc3RhbXAgZm9yIGVhY2ggc3Vic2VxdWVudCBjYWxsIHNob3VsZCBiZQotLy8gaW5jcmVhc2luZyBmcm9tIHRoZSBwcmV2aW91cywgc2luY2UgdGhlIGNsYXNzIGlzIGRlc2lnbmVkIHRvIHByb2Nlc3MgYSBzdHJlYW0KLS8vIG9mIGRhdGEgb3ZlciB0aW1lLgotY2xhc3MgUmVjb2duaXplQ29tbWFuZHMgewotIHB1YmxpYzoKLSAgLy8gbGFiZWxzIHNob3VsZCBiZSBhIGxpc3Qgb2YgdGhlIHN0cmluZ3MgYXNzb2NpYXRlZCB3aXRoIGVhY2ggb25lLWhvdCBzY29yZS4KLSAgLy8gVGhlIHdpbmRvdyBkdXJhdGlvbiBjb250cm9scyB0aGUgc21vb3RoaW5nLiBMb25nZXIgZHVyYXRpb25zIHdpbGwgZ2l2ZSBhCi0gIC8vIGhpZ2hlciBjb25maWRlbmNlIHRoYXQgdGhlIHJlc3VsdHMgYXJlIGNvcnJlY3QsIGJ1dCBtYXkgbWlzcyBzb21lIGNvbW1hbmRzLgotICAvLyBUaGUgZGV0ZWN0aW9uIHRocmVzaG9sZCBoYXMgYSBzaW1pbGFyIGVmZmVjdCwgd2l0aCBoaWdoIHZhbHVlcyBpbmNyZWFzaW5nCi0gIC8vIHRoZSBwcmVjaXNpb24gYXQgdGhlIGNvc3Qgb2YgcmVjYWxsLiBUaGUgbWluaW11bSBjb3VudCBjb250cm9scyBob3cgbWFueQotICAvLyByZXN1bHRzIG5lZWQgdG8gYmUgaW4gdGhlIGF2ZXJhZ2luZyB3aW5kb3cgYmVmb3JlIGl0J3Mgc2VlbiBhcyBhIHJlbGlhYmxlCi0gIC8vIGF2ZXJhZ2UuIFRoaXMgcHJldmVudHMgZXJyb25lb3VzIHJlc3VsdHMgd2hlbiB0aGUgYXZlcmFnaW5nIHdpbmRvdyBpcwotICAvLyBpbml0aWFsbHkgYmVpbmcgcG9wdWxhdGVkIGZvciBleGFtcGxlLiBUaGUgc3VwcHJlc3Npb24gYXJndW1lbnQgZGlzYWJsZXMKLSAgLy8gZnVydGhlciByZWNvZ25pdGlvbnMgZm9yIGEgc2V0IHRpbWUgYWZ0ZXIgb25lIGhhcyBiZWVuIHRyaWdnZXJlZCwgd2hpY2ggY2FuCi0gIC8vIGhlbHAgcmVkdWNlIHNwdXJpb3VzIHJlY29nbml0aW9ucy4KLSAgZXhwbGljaXQgUmVjb2duaXplQ29tbWFuZHMoaW50MzJfdCBhdmVyYWdlX3dpbmRvd19kdXJhdGlvbl9tcyA9IDEwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgZGV0ZWN0aW9uX3RocmVzaG9sZCA9IDIwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdXBwcmVzc2lvbl9tcyA9IDE1MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbWluaW11bV9jb3VudCA9IDMpOwotCi0gIC8vIENhbGwgdGhpcyB3aXRoIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmcgYSBtb2RlbCBvbiBzYW1wbGUgZGF0YS4KLSAgVGZMaXRlU3RhdHVzIFByb2Nlc3NMYXRlc3RSZXN1bHRzKGNvbnN0IFRmTGl0ZVRlbnNvciogbGF0ZXN0X3Jlc3VsdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGN1cnJlbnRfdGltZV9tcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiBmb3VuZF9jb21tYW5kLCB1aW50OF90KiBzY29yZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGlzX25ld19jb21tYW5kKTsKLQotIHByaXZhdGU6Ci0gIC8vIENvbmZpZ3VyYXRpb24KLSAgaW50MzJfdCBhdmVyYWdlX3dpbmRvd19kdXJhdGlvbl9tc187Ci0gIHVpbnQ4X3QgZGV0ZWN0aW9uX3RocmVzaG9sZF87Ci0gIGludDMyX3Qgc3VwcHJlc3Npb25fbXNfOwotICBpbnQzMl90IG1pbmltdW1fY291bnRfOwotCi0gIC8vIFdvcmtpbmcgdmFyaWFibGVzCi0gIFByZXZpb3VzUmVzdWx0c1F1ZXVlIHByZXZpb3VzX3Jlc3VsdHNfOwotICBjb25zdCBjaGFyKiBwcmV2aW91c190b3BfbGFiZWxfOwotICBpbnQzMl90IHByZXZpb3VzX3RvcF9sYWJlbF90aW1lXzsKLX07Ci0KLSNlbmRpZiAgLy8gVEVOU09SRkxPV19MSVRFX01JQ1JPX0VYQU1QTEVTX01JQ1JPX1NQRUVDSF9SRUNPR05JWkVfQ09NTUFORFNfSF8KZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvcmVjb2duaXplX2NvbW1hbmRzX3Rlc3QuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3JlY29nbml6ZV9jb21tYW5kc190ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzFlNGM2Li4wMDAwMDAwCi0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvcmVjb2duaXplX2NvbW1hbmRzX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMTcgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci15b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3JlY29nbml6ZV9jb21tYW5kcy5oIgotCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL3Rlc3RfaGVscGVycy5oIgotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0aW5nL21pY3JvX3Rlc3QuaCIKLQotVEZfTElURV9NSUNST19URVNUU19CRUdJTgotCi1URl9MSVRFX01JQ1JPX1RFU1QoUHJldmlvdXNSZXN1bHRzUXVldWVCYXNpYykgewotICBQcmV2aW91c1Jlc3VsdHNRdWV1ZSBxdWV1ZTsKLSAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoMCwgcXVldWUuc2l6ZSgpKTsKLQotICBpbnQ4X3Qgc2NvcmVzX2FbNF0gPSB7MCwgMCwgMCwgMX07Ci0gIHF1ZXVlLnB1c2hfYmFjayh7MCwgc2NvcmVzX2F9KTsKLSAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoMSwgcXVldWUuc2l6ZSgpKTsKLSAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoMCwgcXVldWUuZnJvbnQoKS50aW1lXyk7Ci0gIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKDAsIHF1ZXVlLmJhY2soKS50aW1lXyk7Ci0KLSAgaW50OF90IHNjb3Jlc19iWzRdID0gezAsIDAsIDEsIDB9OwotICBxdWV1ZS5wdXNoX2JhY2soezEsIHNjb3Jlc19ifSk7Ci0gIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKDIsIHF1ZXVlLnNpemUoKSk7Ci0gIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKDAsIHF1ZXVlLmZyb250KCkudGltZV8pOwotICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUSgxLCBxdWV1ZS5iYWNrKCkudGltZV8pOwotCi0gIFByZXZpb3VzUmVzdWx0c1F1ZXVlOjpSZXN1bHQgcG9wX3Jlc3VsdCA9IHF1ZXVlLnBvcF9mcm9udCgpOwotICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUSgwLCBwb3BfcmVzdWx0LnRpbWVfKTsKLSAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoMSwgcXVldWUuc2l6ZSgpKTsKLSAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoMSwgcXVldWUuZnJvbnQoKS50aW1lXyk7Ci0gIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKDEsIHF1ZXVlLmJhY2soKS50aW1lXyk7Ci0KLSAgaW50OF90IHNjb3Jlc19jWzRdID0gezAsIDEsIDAsIDB9OwotICBxdWV1ZS5wdXNoX2JhY2soezIsIHNjb3Jlc19jfSk7Ci0gIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKDIsIHF1ZXVlLnNpemUoKSk7Ci0gIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKDEsIHF1ZXVlLmZyb250KCkudGltZV8pOwotICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUSgyLCBxdWV1ZS5iYWNrKCkudGltZV8pOwotfQotCi1URl9MSVRFX01JQ1JPX1RFU1QoUHJldmlvdXNSZXN1bHRzUXVldWVQdXNoUG9wKSB7Ci0gIFByZXZpb3VzUmVzdWx0c1F1ZXVlIHF1ZXVlOwotICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUSgwLCBxdWV1ZS5zaXplKCkpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTIzOyArK2kpIHsKLSAgICBpbnQ4X3Qgc2NvcmVzWzRdID0gezAsIDAsIDAsIDF9OwotICAgIHF1ZXVlLnB1c2hfYmFjayh7aSwgc2NvcmVzfSk7Ci0gICAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoMSwgcXVldWUuc2l6ZSgpKTsKLSAgICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUShpLCBxdWV1ZS5mcm9udCgpLnRpbWVfKTsKLSAgICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUShpLCBxdWV1ZS5iYWNrKCkudGltZV8pOwotCi0gICAgUHJldmlvdXNSZXN1bHRzUXVldWU6OlJlc3VsdCBwb3BfcmVzdWx0ID0gcXVldWUucG9wX2Zyb250KCk7Ci0gICAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoaSwgcG9wX3Jlc3VsdC50aW1lXyk7Ci0gICAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoMCwgcXVldWUuc2l6ZSgpKTsKLSAgfQotfQotCi1URl9MSVRFX01JQ1JPX1RFU1QoUmVjb2duaXplQ29tbWFuZHNUZXN0QmFzaWMpIHsKLSAgUmVjb2duaXplQ29tbWFuZHMgcmVjb2duaXplX2NvbW1hbmRzOwotCi0gIGNvbnN0IGludDhfdCByZXN1bHRfZGF0YVtdID0gezEyNywgLTEyOCwgLTEyOCwgLTEyOH07Ci0gIGludCByZXN1bHRfZGltc1tdID0gezIsIDEsIDR9OwotICBUZkxpdGVUZW5zb3IgcmVzdWx0cyA9IHRmbGl0ZTo6dGVzdGluZzo6Q3JlYXRlUXVhbnRpemVkVGVuc29yKAotICAgICAgcmVzdWx0X2RhdGEsIHRmbGl0ZTo6dGVzdGluZzo6SW50QXJyYXlGcm9tSW50cyhyZXN1bHRfZGltcyksIC0xMjguMGYsCi0gICAgICAxMjcuMGYpOwotCi0gIGNvbnN0IGNoYXIqIGZvdW5kX2NvbW1hbmQ7Ci0gIHVpbnQ4X3Qgc2NvcmU7Ci0gIGJvb2wgaXNfbmV3X2NvbW1hbmQ7Ci0gIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKAotICAgICAga1RmTGl0ZU9rLCByZWNvZ25pemVfY29tbWFuZHMuUHJvY2Vzc0xhdGVzdFJlc3VsdHMoCi0gICAgICAgICAgICAgICAgICAgICAmcmVzdWx0cywgMCwgJmZvdW5kX2NvbW1hbmQsICZzY29yZSwgJmlzX25ld19jb21tYW5kKSk7Ci19Ci0KLVRGX0xJVEVfTUlDUk9fVEVTVChSZWNvZ25pemVDb21tYW5kc1Rlc3RGaW5kQ29tbWFuZHMpIHsKLSAgUmVjb2duaXplQ29tbWFuZHMgcmVjb2duaXplX2NvbW1hbmRzKDEwMDAsIDUxKTsKLQotICBjb25zdCBpbnQ4X3QgeWVzX2RhdGFbXSA9IHstMTI4LCAtMTI4LCAxMjcsIC0xMjh9OwotICBpbnQgeWVzX2RpbXNbXSA9IHsyLCAxLCA0fTsKLSAgVGZMaXRlVGVuc29yIHllc19yZXN1bHRzID0gdGZsaXRlOjp0ZXN0aW5nOjpDcmVhdGVRdWFudGl6ZWRUZW5zb3IoCi0gICAgICB5ZXNfZGF0YSwgdGZsaXRlOjp0ZXN0aW5nOjpJbnRBcnJheUZyb21JbnRzKHllc19kaW1zKSwgLTEyOC4wZiwgMTI3LjBmKTsKLQotICBib29sIGhhc19mb3VuZF9uZXdfY29tbWFuZCA9IGZhbHNlOwotICBjb25zdCBjaGFyKiBuZXdfY29tbWFuZDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7Ci0gICAgY29uc3QgY2hhciogZm91bmRfY29tbWFuZDsKLSAgICB1aW50OF90IHNjb3JlOwotICAgIGJvb2wgaXNfbmV3X2NvbW1hbmQ7Ci0gICAgaW50MzJfdCBjdXJyZW50X3RpbWVfbXMgPSAwICsgKGkgKiAxMDApOwotICAgIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKAotICAgICAgICBrVGZMaXRlT2ssIHJlY29nbml6ZV9jb21tYW5kcy5Qcm9jZXNzTGF0ZXN0UmVzdWx0cygKLSAgICAgICAgICAgICAgICAgICAgICAgJnllc19yZXN1bHRzLCBjdXJyZW50X3RpbWVfbXMsICZmb3VuZF9jb21tYW5kLCAmc2NvcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICZpc19uZXdfY29tbWFuZCkpOwotICAgIGlmIChpc19uZXdfY29tbWFuZCkgewotICAgICAgVEZfTElURV9NSUNST19FWFBFQ1QoIWhhc19mb3VuZF9uZXdfY29tbWFuZCk7Ci0gICAgICBoYXNfZm91bmRfbmV3X2NvbW1hbmQgPSB0cnVlOwotICAgICAgbmV3X2NvbW1hbmQgPSBmb3VuZF9jb21tYW5kOwotICAgIH0KLSAgfQotICBURl9MSVRFX01JQ1JPX0VYUEVDVChoYXNfZm91bmRfbmV3X2NvbW1hbmQpOwotICBpZiAoaGFzX2ZvdW5kX25ld19jb21tYW5kKSB7Ci0gICAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoMCwgdGZsaXRlOjp0ZXN0aW5nOjpUZXN0U3RyY21wKCJ5ZXMiLCBuZXdfY29tbWFuZCkpOwotICB9Ci0KLSAgY29uc3QgaW50OF90IG5vX2RhdGFbXSA9IHstMTI4LCAtMTI4LCAtMTI4LCAxMjd9OwotICBpbnQgbm9fZGltc1tdID0gezIsIDEsIDR9OwotICBUZkxpdGVUZW5zb3Igbm9fcmVzdWx0cyA9IHRmbGl0ZTo6dGVzdGluZzo6Q3JlYXRlUXVhbnRpemVkVGVuc29yKAotICAgICAgbm9fZGF0YSwgdGZsaXRlOjp0ZXN0aW5nOjpJbnRBcnJheUZyb21JbnRzKG5vX2RpbXMpLCAtMTI4LjBmLCAxMjcuMGYpOwotICBoYXNfZm91bmRfbmV3X2NvbW1hbmQgPSBmYWxzZTsKLSAgbmV3X2NvbW1hbmQgPSAiIjsKLSAgdWludDhfdCBzY29yZTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7Ci0gICAgY29uc3QgY2hhciogZm91bmRfY29tbWFuZDsKLSAgICBib29sIGlzX25ld19jb21tYW5kOwotICAgIGludDMyX3QgY3VycmVudF90aW1lX21zID0gMTAwMCArIChpICogMTAwKTsKLSAgICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUSgKLSAgICAgICAga1RmTGl0ZU9rLCByZWNvZ25pemVfY29tbWFuZHMuUHJvY2Vzc0xhdGVzdFJlc3VsdHMoCi0gICAgICAgICAgICAgICAgICAgICAgICZub19yZXN1bHRzLCBjdXJyZW50X3RpbWVfbXMsICZmb3VuZF9jb21tYW5kLCAmc2NvcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICZpc19uZXdfY29tbWFuZCkpOwotICAgIGlmIChpc19uZXdfY29tbWFuZCkgewotICAgICAgVEZfTElURV9NSUNST19FWFBFQ1QoIWhhc19mb3VuZF9uZXdfY29tbWFuZCk7Ci0gICAgICBoYXNfZm91bmRfbmV3X2NvbW1hbmQgPSB0cnVlOwotICAgICAgbmV3X2NvbW1hbmQgPSBmb3VuZF9jb21tYW5kOwotICAgIH0KLSAgfQotICBURl9MSVRFX01JQ1JPX0VYUEVDVChoYXNfZm91bmRfbmV3X2NvbW1hbmQpOwotICBpZiAoaGFzX2ZvdW5kX25ld19jb21tYW5kKSB7Ci0gICAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoMjMxLCBzY29yZSk7Ci0gICAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoMCwgdGZsaXRlOjp0ZXN0aW5nOjpUZXN0U3RyY21wKCJubyIsIG5ld19jb21tYW5kKSk7Ci0gIH0KLX0KLQotVEZfTElURV9NSUNST19URVNUKFJlY29nbml6ZUNvbW1hbmRzVGVzdEJhZElucHV0TGVuZ3RoKSB7Ci0gIFJlY29nbml6ZUNvbW1hbmRzIHJlY29nbml6ZV9jb21tYW5kcygxMDAwLCA1MSk7Ci0KLSAgY29uc3QgaW50OF90IGJhZF9kYXRhW10gPSB7LTEyOCwgLTEyOCwgMTI3fTsKLSAgaW50IGJhZF9kaW1zW10gPSB7MiwgMSwgM307Ci0gIFRmTGl0ZVRlbnNvciBiYWRfcmVzdWx0cyA9IHRmbGl0ZTo6dGVzdGluZzo6Q3JlYXRlUXVhbnRpemVkVGVuc29yKAotICAgICAgYmFkX2RhdGEsIHRmbGl0ZTo6dGVzdGluZzo6SW50QXJyYXlGcm9tSW50cyhiYWRfZGltcyksIC0xMjguMGYsIDEyNy4wZik7Ci0KLSAgY29uc3QgY2hhciogZm91bmRfY29tbWFuZDsKLSAgdWludDhfdCBzY29yZTsKLSAgYm9vbCBpc19uZXdfY29tbWFuZDsKLSAgVEZfTElURV9NSUNST19FWFBFQ1RfTkUoCi0gICAgICBrVGZMaXRlT2ssIHJlY29nbml6ZV9jb21tYW5kcy5Qcm9jZXNzTGF0ZXN0UmVzdWx0cygKLSAgICAgICAgICAgICAgICAgICAgICZiYWRfcmVzdWx0cywgMCwgJmZvdW5kX2NvbW1hbmQsICZzY29yZSwgJmlzX25ld19jb21tYW5kKSk7Ci19Ci0KLVRGX0xJVEVfTUlDUk9fVEVTVChSZWNvZ25pemVDb21tYW5kc1Rlc3RCYWRJbnB1dFRpbWVzKSB7Ci0gIFJlY29nbml6ZUNvbW1hbmRzIHJlY29nbml6ZV9jb21tYW5kcygxMDAwLCA1MSk7Ci0KLSAgY29uc3QgaW50OF90IHJlc3VsdF9kYXRhW10gPSB7LTEyOCwgLTEyOCwgMTI3LCAtMTI4fTsKLSAgaW50IHJlc3VsdF9kaW1zW10gPSB7MiwgMSwgNH07Ci0gIFRmTGl0ZVRlbnNvciByZXN1bHRzID0gdGZsaXRlOjp0ZXN0aW5nOjpDcmVhdGVRdWFudGl6ZWRUZW5zb3IoCi0gICAgICByZXN1bHRfZGF0YSwgdGZsaXRlOjp0ZXN0aW5nOjpJbnRBcnJheUZyb21JbnRzKHJlc3VsdF9kaW1zKSwgLTEyOC4wZiwKLSAgICAgIDEyNy4wZik7Ci0KLSAgY29uc3QgY2hhciogZm91bmRfY29tbWFuZDsKLSAgdWludDhfdCBzY29yZTsKLSAgYm9vbCBpc19uZXdfY29tbWFuZDsKLSAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoCi0gICAgICBrVGZMaXRlT2ssIHJlY29nbml6ZV9jb21tYW5kcy5Qcm9jZXNzTGF0ZXN0UmVzdWx0cygKLSAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRzLCAxMDAsICZmb3VuZF9jb21tYW5kLCAmc2NvcmUsICZpc19uZXdfY29tbWFuZCkpOwotICBURl9MSVRFX01JQ1JPX0VYUEVDVF9ORSgKLSAgICAgIGtUZkxpdGVPaywgcmVjb2duaXplX2NvbW1hbmRzLlByb2Nlc3NMYXRlc3RSZXN1bHRzKAotICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdHMsIDAsICZmb3VuZF9jb21tYW5kLCAmc2NvcmUsICZpc19uZXdfY29tbWFuZCkpOwotfQotCi1URl9MSVRFX01JQ1JPX1RFU1QoUmVjb2duaXplQ29tbWFuZHNUZXN0VG9vRmV3SW5wdXRzKSB7Ci0gIFJlY29nbml6ZUNvbW1hbmRzIHJlY29nbml6ZV9jb21tYW5kcygxMDAwLCA1MSk7Ci0KLSAgY29uc3QgaW50OF90IHJlc3VsdF9kYXRhW10gPSB7LTEyOCwgLTEyOCwgMTI3LCAtMTI4fTsKLSAgaW50IHJlc3VsdF9kaW1zW10gPSB7MiwgMSwgNH07Ci0gIFRmTGl0ZVRlbnNvciByZXN1bHRzID0gdGZsaXRlOjp0ZXN0aW5nOjpDcmVhdGVRdWFudGl6ZWRUZW5zb3IoCi0gICAgICByZXN1bHRfZGF0YSwgdGZsaXRlOjp0ZXN0aW5nOjpJbnRBcnJheUZyb21JbnRzKHJlc3VsdF9kaW1zKSwgLTEyOC4wZiwKLSAgICAgIDEyNy4wZik7Ci0KLSAgY29uc3QgY2hhciogZm91bmRfY29tbWFuZDsKLSAgdWludDhfdCBzY29yZTsKLSAgYm9vbCBpc19uZXdfY29tbWFuZDsKLSAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoCi0gICAgICBrVGZMaXRlT2ssIHJlY29nbml6ZV9jb21tYW5kcy5Qcm9jZXNzTGF0ZXN0UmVzdWx0cygKLSAgICAgICAgICAgICAgICAgICAgICZyZXN1bHRzLCAxMDAsICZmb3VuZF9jb21tYW5kLCAmc2NvcmUsICZpc19uZXdfY29tbWFuZCkpOwotICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUSgwLCBzY29yZSk7Ci0gIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKGZhbHNlLCBpc19uZXdfY29tbWFuZCk7Ci19Ci0KLVRGX0xJVEVfTUlDUk9fVEVTVFNfRU5ECmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy9DTVNJUy9zaW1wbGVfZmVhdHVyZXNfZ2VuZXJhdG9yLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9zaW1wbGVfZmVhdHVyZXMvQ01TSVMvc2ltcGxlX2ZlYXR1cmVzX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNjMWUyNC4uMDAwMDAwMAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy9DTVNJUy9zaW1wbGVfZmVhdHVyZXNfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMTggVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci15b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy9zaW1wbGVfZmVhdHVyZXNfZ2VuZXJhdG9yLmgiCi0KLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fbG9nLmgiCi0KLWV4dGVybiAiQyIgewotI2RlZmluZSBJRkZUX0ZMQUdfUiAwCi0jZGVmaW5lIEJJVF9SRVZFUlNFX0ZMQUcgMQotI2RlZmluZSBGRlRfU0laRSA1MTIKLSNkZWZpbmUgRkZUX1NJWkVfRElWMiAyNTYKLSNpbmNsdWRlIDxhcm1fbWF0aC5oPgotCi0jaW5jbHVkZSAiYXJtX2NtcGx4X21hZ19zcXVhcmVkX3ExMHA2LmgiCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9DTVNJUy9oYW5uaW5nLmgiCi19Ci0KLXZvaWQgcXVhbnRpemUocTE1X3QqIGJ1ZkEsIHExNV90KiBidWZCLCB1aW50OF90KiBvdXRwdXQpOwotCi1xMTVfdCBidWZBW0ZGVF9TSVpFXTsKLXExNV90IGJ1ZkJbRkZUX1NJWkVdOwotYXJtX3JmZnRfaW5zdGFuY2VfcTE1IFNfYXJtX2ZmdDsKLWFybV9zdGF0dXMgYXJtX21hdGhfc3RhdHVzOwotCi1uYW1lc3BhY2UgewotLy8gVGhlc2UgY29uc3RhbnRzIGFsbG93IHVzIHRvIGFsbG9jYXRlIGZpeGVkLXNpemVkIGFycmF5cyBvbiB0aGUgc3RhY2sgZm9yIG91cgotLy8gd29ya2luZyBtZW1vcnkuCi1jb25zdGV4cHIgaW50IGtJbnB1dFNpemUgPSA1MTI7Ci1jb25zdGV4cHIgaW50IGtBdmVyYWdlV2luZG93U2l6ZSA9IDY7Ci1jb25zdGV4cHIgaW50IGtPdXRwdXRTaXplID0KLSAgICAoKGtJbnB1dFNpemUgLyAyKSArIChrQXZlcmFnZVdpbmRvd1NpemUgLSAxKSkgLyBrQXZlcmFnZVdpbmRvd1NpemU7Ci19ICAvLyBuYW1lc3BhY2UKLQotVGZMaXRlU3RhdHVzIEdlbmVyYXRlU2ltcGxlRmVhdHVyZXMoY29uc3QgaW50MTZfdCogaW5wdXQsIGludCBpbnB1dF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dHB1dF9zaXplLCB1aW50OF90KiBvdXRwdXQpIHsKLSAgaWYgKGlucHV0X3NpemUgPiBrSW5wdXRTaXplKSB7Ci0gICAgTWljcm9QcmludGYoIklucHV0IHNpemUgJWQgbGFyZ2VyIHRoYW4gJWQiLCBpbnB1dF9zaXplLCBrSW5wdXRTaXplKTsKLSAgICByZXR1cm4ga1RmTGl0ZUVycm9yOwotICB9Ci0gIGlmIChvdXRwdXRfc2l6ZSAhPSBrT3V0cHV0U2l6ZSkgewotICAgIE1pY3JvUHJpbnRmKCJSZXF1ZXN0ZWQgb3V0cHV0IHNpemUgJWQgZG9lc24ndCBtYXRjaCAlZCIsIG91dHB1dF9zaXplLAotICAgICAgICAgICAgICAgIGtPdXRwdXRTaXplKTsKLSAgICByZXR1cm4ga1RmTGl0ZUVycm9yOwotICB9Ci0KLSAgLy8gMzBtcyBhdCAxNiBrSHogPSA0ODAgc2FtcGxlcwotICAvLyBXZSB3YW50IHRvIHBhZCB0aGUgcmVzdCBvZiB0aGUgNTEyLXNhbXBsZSBidWZmZXIgd2l0aCB6ZXJvcwotICBhcm1fbXVsdF9xMTUoKHExNV90KilpbnB1dCwgZ19oYW5uaW5nLCBidWZCLCA0ODApOwotICBpbnQgaTsKLSAgZm9yIChpID0gNDgwOyBpIDwgNTEyOyBpKyspIHsKLSAgICBidWZCW2ldID0gMDsKLSAgfQotCi0gIC8vIFNob3VsZCBtb3ZlIGluaXQgY29kZSBvdXRzaWRlIG9mIFByZXByb2Nlc3MoKSBmdW5jdGlvbgotICBhcm1fbWF0aF9zdGF0dXMgPQotICAgICAgYXJtX3JmZnRfaW5pdF9xMTUoJlNfYXJtX2ZmdCwgRkZUX1NJWkUsIElGRlRfRkxBR19SLCBCSVRfUkVWRVJTRV9GTEFHKTsKLSAgYXJtX3JmZnRfcTE1KCZTX2FybV9mZnQsIGJ1ZkIsIGJ1ZkEpOwotCi0gIC8vIFRoZSByZmZ0IGZ1bmN0aW9uIHBhY2tzIGRhdGEgYXMgZm9sbG93czoKLSAgLy8ge3JlYWxbMF0sIHJlYWxbTi8yXSwgcmVhbFsxXSwgaW1hZ1sxXSwgLi4uLCByZWFsW04vMi0xXSwgaW1hZ1tOLzItMV19Ci0gIC8vIEJlbG93IHdlIHBhY2sgYXMgZm9sbG93czoKLSAgLy8ge3JlYWxbMF0sIDAsIHJlYWxbMV0sIGltYWdbMV0sIC4uLiwgcmVhbFtOLzItMV0sIGltYWdbTi8yLTEsIHJlYWxbTi8yXSwgMH0KLSAgYnVmQVtGRlRfU0laRV9ESVYyXSA9IGJ1ZkFbMV07Ci0gIGJ1ZkFbRkZUX1NJWkVfRElWMiArIDFdID0gMDsKLSAgYnVmQVsxXSA9IDA7Ci0gIGFybV9jbXBseF9tYWdfc3F1YXJlZF9xMTBwNihidWZBLCBidWZCLCBGRlRfU0laRV9ESVYyICsgMSk7Ci0KLSAgcXVhbnRpemUoYnVmQSwgYnVmQiwgb3V0cHV0KTsKLQotICByZXR1cm4ga1RmTGl0ZU9rOwotfQotCi12b2lkIHF1YW50aXplKHExNV90KiBidWZBLCBxMTVfdCogYnVmQiwgdWludDhfdCogb3V0cHV0KSB7Ci0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgNDI7IGkrKykgewotICAgIGFybV9tZWFuX3ExNShidWZCICsgNiAqIGksIDYsIGJ1ZkEgKyBpKTsKLSAgfQotICBhcm1fbWVhbl9xMTUoYnVmQiArIDI1MiwgNSwgYnVmQSArIDQyKTsKLQotICBmb3IgKGkgPSAwOyBpIDwgNDM7IGkrKykgewotICAgIG91dHB1dFtpXSA9ICh1aW50OF90KShidWZBW2ldID4+IDUpOwotICB9Ci19CmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy9maXhlZF9wb2ludC9zaW1wbGVfZmVhdHVyZXNfZ2VuZXJhdG9yLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9zaW1wbGVfZmVhdHVyZXMvZml4ZWRfcG9pbnQvc2ltcGxlX2ZlYXR1cmVzX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNlOGIyNy4uMDAwMDAwMAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy9maXhlZF9wb2ludC9zaW1wbGVfZmVhdHVyZXNfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDE4IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoteW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0vLyBSZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gb2YgdGhlIHByZXByb2Nlc3NpbmcgcGlwZWxpbmUsIHdpdGggdGhlIHNhbWUKLS8vIHJlc3VsdHMgYXMgdGhlIGF1ZGlvIHR1dG9yaWFsIGF0Ci0vLyBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy90dXRvcmlhbHMvc2VxdWVuY2VzL2F1ZGlvX3JlY29nbml0aW9uCi0vLyBUaGlzIG1vZHVsZSB0YWtlcyAzMG1zIG9mIFBDTS1lbmNvZGVkIHNpZ25lZCAxNi1iaXQgYXVkaW8gc2FtcGxlcyAoYXQgMTZLSHosCi0vLyBzbyA0ODAgdmFsdWVzKSwgYW5kIGV4dHJhY3RzIGEgcG93ZXIgc3BlY3RydW0gb2YgZnJlcXVlbmNpZXMuIFRoZXJlIGFyZSA0MwotLy8gZnJlcXVlbmN5IGJhbmRzIGluIHRoZSByZXN1bHQsIGRlcml2ZWQgZnJvbSB0aGUgb3JpZ2luYWwgMjU2IG91dHB1dCBmcm9tIHRoZQotLy8gZGlzY3JldGUgRm91cmllciB0cmFuc2Zvcm0sIGFuZCBhdmVyYWdlZCB0b2dldGhlciBpbiBncm91cHMgb2YgNi4KLS8vIEl0J3MgZXhwZWN0ZWQgdGhhdCBtb3N0IHBsYXRmb3JtcyB3aWxsIGhhdmUgb3B0aW1pemVkIHZlcnNpb25zIG9mIHRoZQotLy8gZnVuY3Rpb25zIHVzZWQgaGVyZSwgZm9yIGV4YW1wbGUgcmVwbGFjaW5nIHRoZSBERlQgd2l0aCBhbiBGRlQsIHNvIHRoaXMKLS8vIHZlcnNpb24gc2hvdWxkbid0IGJlIHVzZWQgd2hlcmUgcGVyZm9ybWFuY2UgaXMgY3JpdGljYWwuCi0vLyBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgZml4ZWQgcG9pbnQgZm9yIGFueSBub24tY29uc3RhbnQgY2FsY3VsYXRpb25zLAotLy8gaW5zdGVhZCBvZiBmbG9hdGluZyBwb2ludCwgdG8gaGVscCBzaG93IGhvdyB0aGlzIGNhbiB3b3JrIG9uIHBsYXRmb3JtcyB0aGF0Ci0vLyBkb24ndCBoYXZlIGdvb2QgZmxvYXQgc3VwcG9ydC4KLQotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL3NpbXBsZV9mZWF0dXJlc19nZW5lcmF0b3IuaCIKLQotI2luY2x1ZGUgPGNtYXRoPgotCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9zaW1wbGVfZmVhdHVyZXMvc2ltcGxlX21vZGVsX3NldHRpbmdzLmgiCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2xvZy5oIgotCi1uYW1lc3BhY2UgewotCi0vLyBxIGZvcm1hdCBub3RhdGlvbjogcXgueSA9PiAxIHNpZ24gYml0LCB4LTEgaW50ZWdlciBiaXRzLCB5IGZyYWN0aW9uIGJpdHMuCi0vLyBVc2Ugc3RhbmRhcmQgKG5vbi1zYXR1cmF0aW5nKSBhcml0aG1ldGljIHdpdGggc2lnbmVkIGludHMgb2Ygc2l6ZSB4K3kgYml0cy4KLS8vIFNhY3JpZmljZSBzb21lIHByZWNpc2lvbiB0byBhdm9pZCB1c2Ugb2YgNjQtYml0IGludHMuCi0KLS8vIHExLjE1ICogcTEuMTUgPT4gcTIuMzAKLWlubGluZSBpbnQzMl90IFExXzE1X0ZpeGVkTXVsdGlwbHlfUTJfMzAoaW50MTZfdCBhLCBpbnQxNl90IGIpIHsKLSAgaW50MzJfdCBiaWdfYSA9IGE7Ci0gIGludDMyX3QgYmlnX2IgPSBiOwotICByZXR1cm4gYmlnX2EgKiBiaWdfYjsKLX0KLQotLy8gcTIuMzAgKiBxMi4zMCA9PiBxMTAuMjIKLWlubGluZSBpbnQzMl90IFEyXzMwX0ZpeGVkTXVsdGlwbHlfUTEwXzIyKGludDMyX3QgYSwgaW50MzJfdCBiKSB7Ci0gIC8vIHEyLjMwIHJlc3VsdAotICBpbnQzMl90IHRtcCA9IChhID4+IDE1KSAqIChiID4+IDE1KTsKLSAgLy8gcTEwLjIyIHJlc3VsdAotICByZXR1cm4gdG1wID4+IDg7Ci19Ci0KLS8vIHExMC4yMiAqIHExMC4yMiA9PiBxMTAuMjIKLS8vIFdpbGwgb3ZlcmZsb3cgaWYgcHJvZHVjdCBpcyA+PSA1MTIuCi0vLyBMYXJnZXN0IHByb2R1Y3QgaW4gc21hbGwgdGVzdCBzZXQgaXMgNDY1LjI1Ci1pbmxpbmUgaW50MzJfdCBRMTBfMjJfRml4ZWRNdWx0aXBseV9RMTBfMjIoaW50MzJfdCBhLCBpbnQzMl90IGIpIHsKLSAgLy8gcTEwLjIyIHJlc3VsdAotICByZXR1cm4gKGEgPj4gMTEpICogKGIgPj4gMTEpOwotfQotCi0vLyBmbG9hdCA9PiBxMi4zMAotLy8gTm8gY2hlY2tpbmcgZm9yIHNhdHVyYXRpb24uICBPbmx5IHVzZWQgZm9yIGlucHV0cyBpbiByYW5nZSBbLTEsIDFdLgotaW5saW5lIGludDMyX3QgRmxvYXRUb0ZpeGVkX1EyXzMwKGZsb2F0IGlucHV0KSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90Pihyb3VuZGYoaW5wdXQgKiAoMSA8PCAzMCkpKTsKLX0KLQotLy8gUGVyZm9ybXMgYSBkaXNjcmV0ZSBGb3VyaWVyIHRyYW5zZm9ybSBvbiB0aGUgcmVhbCBpbnB1dHMuIFRoaXMgY29ycmVzcG9uZHMgdG8KLS8vIHJkZnQoKSBpbiB0aGUgRkZUIHBhY2thZ2UgYXQgaHR0cDovL3d3dy5rdXJpbXMua3lvdG8tdS5hYy5qcC9+b291cmEvZmZ0Lmh0bWwsCi0vLyBhbmQgdG8ga2lzc19mZnRyKCkgaW4gS0lTU0ZGVCBhdCBodHRwczovL2dpdGh1Yi5jb20vbWJvcmdlcmRpbmcva2lzc2ZmdC4KLS8vIEl0IHRha2VzIGluIGFuIGFycmF5IG9mIGZsb2F0IHJlYWwgdmFsdWVzLCBhbmQgcmV0dXJucyBhIHJlc3VsdCBvZiB0aGUgc2FtZQotLy8gbGVuZ3RoIHdpdGggcTEwLjIyIGZpeGVkIHBvaW50IHJlYWwgYW5kIGltYWdpbmFyeSBjb21wb25lbnRzIGludGVybGVhdmVkLCBzbwotLy8gZm91cmllcl9vdXRwdXRbMF0gaXMgdGhlIGZpcnN0IHJlYWwgdmFsdWUsIGZvdXJpZXJfb3V0cHV0WzFdIGlzIHRoZSBmaXJzdAotLy8gaW1hZ2luYXJ5LCBmb3VyaWVyX291dHB1dFsyXSBpcyB0aGUgc2Vjb25kIHJlYWwsIGFuZCBzbyBvbi4KLS8vIFRoZSBjYWxsaW5nIGZ1bmN0aW9uIHNob3VsZCBlbnN1cmUgdGhhdCB0aGUgYXJyYXkgcGFzc2VkIGluIGFzIGZvdXJpZXJfb3V0cHV0Ci0vLyBpcyBhdCBsZWFzdCB0aW1lX3Nlcmllc19zaXplIGluIGxlbmd0aC4gTW9zdCBvcHRpbWl6ZWQgRkZUIGltcGxlbWVudGF0aW9ucwotLy8gcmVxdWlyZSB0aGUgbGVuZ3RoIHRvIGJlIGEgcG93ZXIgb2YgdHdvIGFzIHdlbGwsIGJ1dCB0aGlzIHZlcnNpb24gZG9lc24ndAotLy8gZW5mb3JjZSB0aGF0LgotCi0vLyBpbnB1dDogcTIuMzAgZml4ZWQgcG9pbnQuICBvdXRwdXQ6IHExMC4yMiBmaXhlZCBwb2ludC4KLS8vIE91dHB1dHMgaW50ZXJwcmV0ZWQgYXMgcTEwLjIyIGZpeGVkIHBvaW50IGFyZSB1bi1zY2FsZWQuCi12b2lkIENhbGN1bGF0ZURpc2NyZXRlRm91cmllclRyYW5zZm9ybShpbnQzMl90KiB0aW1lX3NlcmllcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aW1lX3Nlcmllc19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogZm91cmllcl9vdXRwdXQpIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aW1lX3Nlcmllc19zaXplIC8gMjsgKytpKSB7Ci0gICAgaW50MzJfdCByZWFsID0gMDsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IHRpbWVfc2VyaWVzX3NpemU7ICsraikgewotICAgICAgY29uc3QgaW50MzJfdCByZWFsX3NjYWxlID0KLSAgICAgICAgICBGbG9hdFRvRml4ZWRfUTJfMzAoY29zKGogKiBpICogTV9QSSAqIDIgLyB0aW1lX3Nlcmllc19zaXplKSk7Ci0gICAgICByZWFsICs9IFEyXzMwX0ZpeGVkTXVsdGlwbHlfUTEwXzIyKHRpbWVfc2VyaWVzW2pdLCByZWFsX3NjYWxlKTsKLSAgICB9Ci0gICAgaW50MzJfdCBpbWFnaW5hcnkgPSAwOwotICAgIGZvciAoaW50IGogPSAwOyBqIDwgdGltZV9zZXJpZXNfc2l6ZTsgKytqKSB7Ci0gICAgICBjb25zdCBpbnQzMl90IGltYWdpbmFyeV9zY2FsZSA9Ci0gICAgICAgICAgRmxvYXRUb0ZpeGVkX1EyXzMwKHNpbihqICogaSAqIE1fUEkgKiAyIC8gdGltZV9zZXJpZXNfc2l6ZSkpOwotICAgICAgaW1hZ2luYXJ5IC09IFEyXzMwX0ZpeGVkTXVsdGlwbHlfUTEwXzIyKHRpbWVfc2VyaWVzW2pdLCBpbWFnaW5hcnlfc2NhbGUpOwotICAgIH0KLSAgICBmb3VyaWVyX291dHB1dFsoaSAqIDIpICsgMF0gPSByZWFsOwotICAgIGZvdXJpZXJfb3V0cHV0WyhpICogMikgKyAxXSA9IGltYWdpbmFyeTsKLSAgfQotfQotCi0vLyBQcm9kdWNlcyBhIHNpbXBsZSBzaW5lIGN1cnZlIHRoYXQgaXMgdXNlZCB0byBlbnN1cmUgZnJlcXVlbmNpZXMgYXQgdGhlIGNlbnRlcgotLy8gb2YgdGhlIGN1cnJlbnQgc2FtcGxlIHdpbmRvdyBhcmUgd2VpZ2h0ZWQgbW9yZSBoZWF2aWx5IHRoYW4gdGhvc2UgYXQgdGhlIGVuZC4KLS8vIHExLjE1IG91dHB1dCBmb3JtYXQuCi12b2lkIENhbGN1bGF0ZVBlcmlvZGljSGFubihpbnQgd2luZG93X2xlbmd0aCwgaW50MTZfdCogd2luZG93X2Z1bmN0aW9uKSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgd2luZG93X2xlbmd0aDsgKytpKSB7Ci0gICAgY29uc3QgZmxvYXQgcmVhbF92YWx1ZSA9ICgwLjUgLSAwLjUgKiBjb3MoKDIgKiBNX1BJICogaSkgLyB3aW5kb3dfbGVuZ3RoKSk7Ci0gICAgaW50IHRtcCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHJvdW5kZihyZWFsX3ZhbHVlICogKDEgPDwgMTUpKSk7Ci0gICAgLy8gU2F0dXJhdGUgdGhlIDB4ODAwMCB2YWx1ZSB0byAweDdmZmYKLSAgICBpZiAodG1wID4gMHg3ZmZmKSB0bXAgPSAweDdmZmY7Ci0gICAgd2luZG93X2Z1bmN0aW9uW2ldID0gdG1wOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1UZkxpdGVTdGF0dXMgR2VuZXJhdGVTaW1wbGVGZWF0dXJlcyhjb25zdCBpbnQxNl90KiBpbnB1dCwgaW50IGlucHV0X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0cHV0X3NpemUsIHVpbnQ4X3QqIG91dHB1dCkgewotICAvLyBFbnN1cmUgb3VyIGlucHV0IGFuZCBvdXRwdXQgZGF0YSBhcnJheXMgYXJlIHZhbGlkLgotICBpZiAoaW5wdXRfc2l6ZSA+IGtNYXhBdWRpb1NhbXBsZVNpemUpIHsKLSAgICBNaWNyb1ByaW50ZigiSW5wdXQgc2l6ZSAlZCBsYXJnZXIgdGhhbiAlZCIsIGlucHV0X3NpemUsCi0gICAgICAgICAgICAgICAga01heEF1ZGlvU2FtcGxlU2l6ZSk7Ci0gICAgcmV0dXJuIGtUZkxpdGVFcnJvcjsKLSAgfQotICBpZiAob3V0cHV0X3NpemUgIT0ga0ZlYXR1cmVTbGljZVNpemUpIHsKLSAgICBNaWNyb1ByaW50ZigiUmVxdWVzdGVkIG91dHB1dCBzaXplICVkIGRvZXNuJ3QgbWF0Y2ggJWQiLCBvdXRwdXRfc2l6ZSwKLSAgICAgICAgICAgICAgICBrRmVhdHVyZVNsaWNlU2l6ZSk7Ci0gICAgcmV0dXJuIGtUZkxpdGVFcnJvcjsKLSAgfQotCi0gIC8vIFByZS1jYWxjdWxhdGUgdGhlIHdpbmRvdyBmdW5jdGlvbiB3ZSdsbCBiZSBhcHBseWluZyB0byB0aGUgaW5wdXQgZGF0YS4KLSAgLy8gSW4gYSByZWFsIGFwcGxpY2F0aW9uLCB3ZSdkIGNhbGN1bGF0ZSB0aGlzIHRhYmxlIG9uY2UgaW4gYW4gaW5pdGlhbGl6YXRpb24KLSAgLy8gZnVuY3Rpb24gYW5kIHN0b3JlIGl0IGZvciByZXBlYXRlZCByZXVzZS4KLSAgLy8gcTEuMTUgZm9ybWF0LgotICBpbnQxNl90IHdpbmRvd19mdW5jdGlvbltrTWF4QXVkaW9TYW1wbGVTaXplXTsKLSAgQ2FsY3VsYXRlUGVyaW9kaWNIYW5uKGlucHV0X3NpemUsIHdpbmRvd19mdW5jdGlvbik7Ci0KLSAgLy8gQXBwbHkgdGhlIHdpbmRvdyBmdW5jdGlvbiB0byBvdXIgdGltZSBzZXJpZXMgaW5wdXQsIGFuZCBwYWQgaXQgd2l0aCB6ZXJvZXMKLSAgLy8gdG8gdGhlIG5leHQgcG93ZXIgb2YgdHdvLgotICBpbnQzMl90IGZpeGVkX2lucHV0W2tNYXhBdWRpb1NhbXBsZVNpemVdOwotICBmb3IgKGludCBpID0gMDsgaSA8IGtNYXhBdWRpb1NhbXBsZVNpemU7ICsraSkgewotICAgIGlmIChpIDwgaW5wdXRfc2l6ZSkgewotICAgICAgLy8gaW5wdXQgaXMgaW50MTZfdC4gIFRyZWF0IGFzIHExLjE1IGZpeGVkIHBvaW50IHZhbHVlIGluIHJhbmdlIFstMSwxKQotICAgICAgLy8gd2luZG93X2Z1bmN0aW9uIGlzIGFsc28gcTEuMTUgZml4ZWQgcG9pbnQgbnVtYmVyCi0gICAgICBmaXhlZF9pbnB1dFtpXSA9IFExXzE1X0ZpeGVkTXVsdGlwbHlfUTJfMzAoaW5wdXRbaV0sIHdpbmRvd19mdW5jdGlvbltpXSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZpeGVkX2lucHV0W2ldID0gMDsKLSAgICB9Ci0gIH0KLQotICAvLyBQdWxsIHRoZSBmcmVxdWVuY3kgZGF0YSBmcm9tIHRoZSB0aW1lIHNlcmllcyBzYW1wbGUuCi0gIC8vIENhbGN1bGF0ZWQgaW4gcTEwLjIyIGZvcm1hdCBmcm9tIHEyLjMwIGlucHV0cy4KLSAgaW50MzJfdCBmb3VyaWVyX3ZhbHVlc1trTWF4QXVkaW9TYW1wbGVTaXplXTsKLSAgQ2FsY3VsYXRlRGlzY3JldGVGb3VyaWVyVHJhbnNmb3JtKGZpeGVkX2lucHV0LCBrTWF4QXVkaW9TYW1wbGVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91cmllcl92YWx1ZXMpOwotCi0gIC8vIFdlIGhhdmUgdGhlIGNvbXBsZXggbnVtYmVycyBnaXZpbmcgdXMgaW5mb3JtYXRpb24gYWJvdXQgZWFjaCBmcmVxdWVuY3kKLSAgLy8gYmFuZCwgYnV0IGFsbCB3ZSB3YW50IHRvIGtub3cgaXMgaG93IHN0cm9uZyBlYWNoIGZyZXF1ZW5jeSBpcywgc28gY2FsY3VsYXRlCi0gIC8vIHRoZSBzcXVhcmVkIG1hZ25pdHVkZSBieSBhZGRpbmcgdG9nZXRoZXIgdGhlIHNxdWFyZXMgb2YgZWFjaCBjb21wb25lbnQuCi0gIGludDMyX3QgcG93ZXJfc3BlY3RydW1ba01heEF1ZGlvU2FtcGxlU2l6ZSAvIDJdOwotICBmb3IgKGludCBpID0gMDsgaSA8IChrTWF4QXVkaW9TYW1wbGVTaXplIC8gMik7ICsraSkgewotICAgIGNvbnN0IGludDMyX3QgcmVhbCA9IGZvdXJpZXJfdmFsdWVzWyhpICogMikgKyAwXTsKLSAgICBjb25zdCBpbnQzMl90IGltYWdpbmFyeSA9IGZvdXJpZXJfdmFsdWVzWyhpICogMikgKyAxXTsKLSAgICAvLyBxMTAuMjIgcmVzdWx0cwotICAgIHBvd2VyX3NwZWN0cnVtW2ldID0gUTEwXzIyX0ZpeGVkTXVsdGlwbHlfUTEwXzIyKHJlYWwsIHJlYWwpICsKLSAgICAgICAgICAgICAgICAgICAgICAgIFExMF8yMl9GaXhlZE11bHRpcGx5X1ExMF8yMihpbWFnaW5hcnksIGltYWdpbmFyeSk7Ci0gIH0KLQotICAvLyBGaW5hbGx5LCByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBieSBhdmVyYWdpbmcgdG9nZXRoZXIgc2l4IGFkamFjZW50Ci0gIC8vIGZyZXF1ZW5jaWVzIGludG8gZWFjaCBzbG90LCBwcm9kdWNpbmcgYW4gYXJyYXkgb2YgNDMgdmFsdWVzLgotICAvLyBQb3dlcl9zcGVjdHJ1bSBudW1iZXJzIGFyZSBxMTAuMjIuICBEaXZpZGUgYnkga0F2ZXJhZ2VXaW5kb3dTaXplIGluc2lkZQotICAvLyBsb29wIHRvIHByZXZlbnQgb3ZlcmZsb3cuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwga0ZlYXR1cmVTbGljZVNpemU7ICsraSkgewotICAgIGludDMyX3QgYXZlcmFnZSA9IDA7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBrQXZlcmFnZVdpbmRvd1NpemU7ICsraikgewotICAgICAgY29uc3QgaW50IGluZGV4ID0gKGkgKiBrQXZlcmFnZVdpbmRvd1NpemUpICsgajsKLSAgICAgIGlmIChpbmRleCA8IChrTWF4QXVkaW9TYW1wbGVTaXplIC8gMikpIHsKLSAgICAgICAgYXZlcmFnZSArPSBwb3dlcl9zcGVjdHJ1bVtpbmRleF0gLyBrQXZlcmFnZVdpbmRvd1NpemU7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIFF1YW50aXplIHRoZSByZXN1bHQgaW50byBlaWdodCBiaXRzLCBlZmZlY3RpdmVseSBtdWx0aXBseWluZyBieSB0d28uCi0gICAgLy8gVGhlIDEyNy41IGNvbnN0YW50IGhlcmUgaGFzIHRvIG1hdGNoIHRoZSBmZWF0dXJlc19tYXggdmFsdWUgZGVmaW5lZCBpbgotICAgIC8vIHRlbnNvcmZsb3cvZXhhbXBsZXMvc3BlZWNoX2NvbW1hbmRzL2lucHV0X2RhdGEucHksIGFuZCB0aGlzIGFsc28gYXNzdW1lcwotICAgIC8vIHRoYXQgZmVhdHVyZXNfbWluIGlzIHplcm8uCi0gICAgLy8KLSAgICAvLyBxMTAuMjIgaW5wdXQKLSAgICAvLyBpbnRlZ2VyIG91dHB1dAotICAgIC8vCi0gICAgLy8gb3V0cHV0ID0gKGlucHV0IC0gZmVhdHVyZXNfbWluKSAqCi0gICAgLy8gICAgIChvdXRwdXRfbWF4IC0gb3V0cHV0X21pbikgLyAoZmVhdHVyZXNfbWF4IC0gZmVhdHVyZXNfbWluKQotICAgIC8vID09IChpbnB1dCkgKiAoMjU1KSAvICgxMjcuNSkKLSAgICAvLyA9PSBpbnB1dCAqIDIKLSAgICAvLyA9PSBpbnB1dCA8PCAxCi0gICAgLy8gQWxzbyB3YW50IHRvIHJvdW5kIHRvIG5lYXJlc3QgaW50ZWdlciBhbmQgb25seSBrZWVwIGludGVnZXIgYml0cwotICAgIC8vID0+ICgoaW5wdXQgPDwgMSkgKyAweDIwMDAwMCkgPj4gMjIKLSAgICAvLyA9PSAoaW5wdXQgKyAweDEwMDAwMCkgPj4gMjEKLSAgICBpbnQzMl90IHF1YW50aXplZF9hdmVyYWdlID0gKGF2ZXJhZ2UgKyAweDEwMDAwMCkgPj4gMjE7Ci0gICAgaWYgKHF1YW50aXplZF9hdmVyYWdlIDwgMCkgewotICAgICAgcXVhbnRpemVkX2F2ZXJhZ2UgPSAwOwotICAgIH0KLSAgICBpZiAocXVhbnRpemVkX2F2ZXJhZ2UgPiAyNTUpIHsKLSAgICAgIHF1YW50aXplZF9hdmVyYWdlID0gMjU1OwotICAgIH0KLSAgICBvdXRwdXRbaV0gPSBxdWFudGl6ZWRfYXZlcmFnZTsKLSAgfQotICByZXR1cm4ga1RmTGl0ZU9rOwotfQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9zaW1wbGVfZmVhdHVyZXMvbW9kZWwuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy9tb2RlbC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThmZWE1Yi4uMDAwMDAwMAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy9tb2RlbC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE2NzQgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci15b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLS8vIFRoaXMgaXMgYSBzdGFuZGFyZCBUZW5zb3JGbG93IExpdGUgRmxhdEJ1ZmZlciBtb2RlbCBmaWxlIHRoYXQgaGFzIGJlZW4KLS8vIGNvbnZlcnRlZCBpbnRvIGEgQyBkYXRhIGFycmF5LCBzbyBpdCBjYW4gYmUgZWFzaWx5IGNvbXBpbGVkIGludG8gYSBiaW5hcnkKLS8vIGZvciBkZXZpY2VzIHRoYXQgZG9uJ3QgaGF2ZSBhIGZpbGUgc3lzdGVtLiBJdCB3YXMgY3JlYXRlZCB1c2luZyB0aGUgY29tbWFuZDoKLS8vIHh4ZCAtaSBtb2RlbC50ZmxpdGUgPiBtb2RlbC5jYwotCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9zaW1wbGVfZmVhdHVyZXMvbW9kZWwuaCIKLQotY29uc3QgdW5zaWduZWQgY2hhciBnX21vZGVsW10gPSB7Ci0gICAgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1NCwgMHg0NiwgMHg0YywgMHgzMywgMHgwMCwgMHgwMCwgMHgwZSwgMHgwMCwKLSAgICAweDE4LCAweDAwLCAweDA0LCAweDAwLCAweDA4LCAweDAwLCAweDBjLCAweDAwLCAweDEwLCAweDAwLCAweDE0LCAweDAwLAotICAgIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4NGQsIDB4MDAsIDB4MDAsCi0gICAgMHgwYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweGY0LCAweDQ3LCAweDAwLCAweDAwLCAweDBmLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4NTQsIDB4NGYsIDB4NDMsIDB4NGYsIDB4MjAsIDB4NDMsIDB4NmYsIDB4NmUsIDB4NzYsIDB4NjUsIDB4NzIsIDB4NzQsCi0gICAgMHg2NSwgMHg2NCwgMHgyZSwgMHgwMCwgMHgwOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhkNCwgMHg0NywgMHgwMCwgMHgwMCwKLSAgICAweGI0LCAweDQ3LCAweDAwLCAweDAwLCAweGU0LCAweDAyLCAweDAwLCAweDAwLCAweGI0LCAweDAyLCAweDAwLCAweDAwLAotICAgIDB4YWMsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MWMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhiOCwgMHhiMywgMHhmZiwgMHhmZiwKLSAgICAweGJjLCAweGIzLCAweGZmLCAweGZmLCAweGMwLCAweGIzLCAweGZmLCAweGZmLCAweDFlLCAweGI0LCAweGZmLCAweGZmLAotICAgIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4ODksIDB4YTUsIDB4ZTgsIDB4YzEsCi0gICAgMHhiMSwgMHg4OSwgMHg1YiwgMHhjNiwgMHg0ZiwgMHg5YiwgMHhkMywgMHg3NCwgMHg5MywgMHg4OCwgMHhmZiwgMHhhZiwKLSAgICAweDg5LCAweGZmLCAweGY0LCAweDcwLCAweGNjLCAweDc1LCAweDc4LCAweGJmLCAweDkyLCAweGNkLCAweGE5LCAweGE4LAotICAgIDB4ZDYsIDB4NmEsIDB4NmYsIDB4N2IsIDB4N2YsIDB4ZDgsIDB4YTgsIDB4YjEsIDB4ZTYsIDB4MzIsIDB4MjEsIDB4NzAsCi0gICAgMHhhMCwgMHg5YywgMHg2ZiwgMHhjOCwgMHhjNiwgMHg1OSwgMHg2NywgMHg5MywgMHg5NywgMHhjYSwgMHgzZiwgMHhkZSwKLSAgICAweGNiLCAweDc0LCAweDdjLCAweGI1LCAweGE0LCAweGQ5LCAweDY2LCAweGM2LCAweDg3LCAweDk4LCAweGE1LCAweGQwLAotICAgIDB4YmIsIDB4YjksIDB4YzIsIDB4YjIsIDB4YWEsIDB4NzksIDB4MjUsIDB4YjksIDB4NmQsIDB4NWEsIDB4YzgsIDB4N2YsCi0gICAgMHg3MCwgMHg4NSwgMHg3OSwgMHhiYywgMHg2YSwgMHg5YiwgMHhkMSwgMHg5YSwgMHg5YywgMHg1MSwgMHg1MywgMHg3MSwKLSAgICAweDg5LCAweGMwLCAweGI0LCAweGFjLCAweGFlLCAweDQ3LCAweDY3LCAweDcwLCAweDc5LCAweGQyLCAweDgxLCAweGE1LAotICAgIDB4ZDIsIDB4MDksIDB4MzgsIDB4ODIsIDB4NzQsIDB4YzksIDB4NWQsIDB4YWYsIDB4YzEsIDB4NGYsIDB4NTMsIDB4OTksCi0gICAgMHhjYiwgMHhiNywgMHgzYSwgMHhiYSwgMHhlOCwgMHg3ZiwgMHg3NiwgMHhiOSwgMHhiMywgMHhkMywgMHg2MCwgMHhjMCwKLSAgICAweDkzLCAweDlmLCAweDg3LCAweGJkLCAweGQwLCAweGI4LCAweGNhLCAweGMxLCAweGI2LCAweDZjLCAweDAxLCAweGMxLAotICAgIDB4NWMsIDB4NWQsIDB4YjIsIDB4ODIsIDB4NzYsIDB4NzcsIDB4MzksIDB4YmMsIDB4NzIsIDB4NmEsIDB4YzMsIDB4YjQsCi0gICAgMHg3OSwgMHgyMSwgMHg0OCwgMHg0MiwgMHg4NiwgMHhhNiwgMHhiZCwgMHhhZiwgMHhhZSwgMHgyMywgMHg5YywgMHg2OSwKLSAgICAweDc4LCAweGMzLCAweDZiLCAweGIzLCAweGFiLCAweDQzLCAweGIyLCAweDg4LCAweDcxLCAweGM2LCAweDZiLCAweGJlLAotICAgIDB4YzMsIDB4NzUsIDB4YzIsIDB4YzMsIDB4YTUsIDB4Y2YsIDB4MzIsIDB4YmUsIDB4Y2IsIDB4YjAsIDB4YjgsIDB4YzEsCi0gICAgMHg5YywgMHhjZiwgMHg2NCwgMHhjNCwgMHhiNCwgMHg5NiwgMHhhOCwgMHhiOSwgMHhjYiwgMHhjMCwgMHhjMCwgMHhiOCwKLSAgICAweGI4LCAweDc3LCAweDY1LCAweGMwLCAweGM0LCAweGIzLCAweGM1LCAweDc3LCAweDliLCAweDYxLCAweGQ0LCAweGFjLAotICAgIDB4N2UsIDB4MzYsIDB4YjEsIDB4YWUsIDB4MzYsIDB4MzYsIDB4YjgsIDB4MzksIDB4NmIsIDB4NzAsIDB4OWMsIDB4YjUsCi0gICAgMHg4OCwgMHg1YywgMHhiMywgMHg2YSwgMHhhZCwgMHhjNSwgMHg3YiwgMHhiNCwgMHhhZCwgMHhhYSwgMHhjNCwgMHg4NCwKLSAgICAweDVlLCAweGM0LCAweDY3LCAweGMxLCAweGRlLCAweGJhLCAweGNmLCAweGJkLCAweGEwLCAweGQzLCAweDM1LCAweGIzLAotICAgIDB4ZTcsIDB4YzgsIDB4YjgsIDB4YjgsIDB4YWYsIDB4YjQsIDB4NTksIDB4YjgsIDB4YjQsIDB4YWMsIDB4YWMsIDB4YWEsCi0gICAgMHhjNywgMHhhZCwgMHhjOCwgMHhiNiwgMHhhYywgMHg5OSwgMHhhMCwgMHhjYiwgMHhjMSwgMHhjOCwgMHhjYiwgMHg4OSwKLSAgICAweGMzLCAweGFjLCAweGNhLCAweDhiLCAweDk3LCAweDFmLCAweGJkLCAweGJmLCAweDEzLCAweGFkLCAweGM4LCAweDQxLAotICAgIDB4NTYsIDB4M2MsIDB4ODYsIDB4YjIsIDB4NjEsIDB4YzQsIDB4YmIsIDB4NzEsIDB4YmEsIDB4OTIsIDB4OGQsIDB4YzMsCi0gICAgMHg4NiwgMHhjYiwgMHhjNSwgMHg4ZCwgMHg4OCwgMHhjOCwgMHg2YSwgMHhiZiwgMHg5YywgMHhjZCwgMHhjZCwgMHhjMCwKLSAgICAweDgxLCAweGIxLCAweDQ3LCAweGI1LCAweGYwLCAweGNlLCAweGIxLCAweGMxLCAweGFhLCAweGE4LCAweDU0LCAweGNiLAotICAgIDB4YmMsIDB4YzcsIDB4YzUsIDB4OGUsIDB4YzMsIDB4Y2UsIDB4YzcsIDB4YjksIDB4YjksIDB4YTEsIDB4YzUsIDB4YmQsCi0gICAgMHhiOCwgMHhiOCwgMHhiNywgMHg4MSwgMHhiNiwgMHhiYSwgMHhkMiwgMHg5MCwgMHhiYywgMHg5NiwgMHhiZSwgMHhiYSwKLSAgICAweDUzLCAweGI1LCAweGM3LCAweDNjLCAweDNjLCAweDFmLCAweDkwLCAweGFhLCAweDVhLCAweGI4LCAweGJhLCAweDdlLAotICAgIDB4YmMsIDB4OWUsIDB4YzIsIDB4YjEsIDB4NmUsIDB4YzAsIDB4YzQsIDB4OTEsIDB4ZjAsIDB4YjUsIDB4NjAsIDB4YWQsCi0gICAgMHg3MywgMHhiYSwgMHhjZCwgMHhiYSwgMHg2ZSwgMHg5NCwgMHgzOSwgMHhiNSwgMHhlNCwgMHhiZSwgMHhiNCwgMHhiNSwKLSAgICAweGEwLCAweGE5LCAweDUxLCAweGFjLCAweGJjLCAweGMyLCAweGIzLCAweDhhLCAweGJkLCAweDlhLCAweGNhLCAweGIzLAotICAgIDB4YmYsIDB4YWYsIDB4YjUsIDB4OWEsIDB4YjksIDB4YzMsIDB4YjYsIDB4OTIsIDB4YjUsIDB4YzEsIDB4YjAsIDB4OTUsCi0gICAgMHhkNiwgMHhjYywgMHhiYiwgMHhiYiwgMHhhOSwgMHhiOSwgMHhhYywgMHg0YSwgMHg2MiwgMHgyNywgMHhhNywgMHhhNywKLSAgICAweDMwLCAweGJkLCAweGIxLCAweDczLCAweGExLCAweDc0LCAweGMyLCAweGI3LCAweDU4LCAweGMwLCAweGFlLCAweDhmLAotICAgIDB4ZTEsIDB4YWMsIDB4NGUsIDB4YjAsIDB4NTUsIDB4YzksIDB4YzgsIDB4OWYsIDB4ODMsIDB4OGUsIDB4M2UsIDB4ZDUsCi0gICAgMHhiNSwgMHhiZSwgMHhjZCwgMHhiMiwgMHhhNiwgMHhjOCwgMHg2NCwgMHhhYywgMHhjMCwgMHhjOCwgMHhhZiwgMHg5OSwKLSAgICAweGM1LCAweDllLCAweGI4LCAweGJkLCAweGE5LCAweGMyLCAweGIzLCAweDgxLCAweGI0LCAweGMyLCAweGI0LCAweDhmLAotICAgIDB4YmMsIDB4YjgsIDB4OWMsIDB4ODgsIDB4YmUsIDB4YzYsIDB4YmYsIDB4YmEsIDB4YzgsIDB4YjQsIDB4YWIsIDB4NWIsCi0gICAgMHg5MiwgMHg1MSwgMHhiMSwgMHg5YSwgMHg0NCwgMHhiOSwgMHhhYiwgMHg4MCwgMHhhNSwgMHgzZSwgMHhjMCwgMHhhNSwKLSAgICAweDVjLCAweGI2LCAweGE4LCAweGEyLCAweGIzLCAweDlhLCAweDZiLCAweGIzLCAweDM0LCAweGM2LCAweDdlLCAweDk2LAotICAgIDB4Y2IsIDB4ODgsIDB4NDgsIDB4YzYsIDB4YTMsIDB4YmIsIDB4ZDIsIDB4YTIsIDB4YWYsIDB4ZDAsIDB4NmUsIDB4YWUsCi0gICAgMHhiNCwgMHhjZSwgMHhjOCwgMHg4ZiwgMHhkNywgMHhhZCwgMHhjOCwgMHhiMCwgMHhhZSwgMHhiNywgMHhiMiwgMHg3MCwKLSAgICAweGI5LCAweGFkLCAweGMxLCAweGEwLCAweGNiLCAweGEyLCAweGIwLCAweDliLCAweGJlLCAweGQzLCAweGNhLCAweGI2LAotICAgIDB4YmQsIDB4YWYsIDB4YTksIDB4ODIsIDB4YTEsIDB4ZDcsIDB4YmMsIDB4OWIsIDB4OGIsIDB4YWMsIDB4YWEsIDB4YWMsCi0gICAgMHhhZCwgMHgzNywgMHhiNywgMHhiNiwgMHg0NiwgMHhhZSwgMHhhOSwgMHhiZCwgMHg2YiwgMHg5MCwgMHg1ZSwgMHhjZCwKLSAgICAweDIzLCAweGE0LCAweDc2LCAweGExLCAweGM0LCAweDk2LCAweDUwLCAweGNjLCAweDk1LCAweDk5LCAweDkzLCAweGE3LAotICAgIDB4YjIsIDB4ZTEsIDB4N2MsIDB4YmQsIDB4YmQsIDB4YjUsIDB4YmYsIDB4OWEsIDB4Y2EsIDB4ODAsIDB4ZDcsIDB4YWUsCi0gICAgMHg3OSwgMHhhOCwgMHhhYSwgMHhiMiwgMHhiYywgMHg1MSwgMHhkYSwgMHhhMywgMHg4MCwgMHg4YiwgMHhhMiwgMHhjOCwKLSAgICAweGQxLCAweDk0LCAweGUxLCAweGM0LCAweGJkLCAweGFlLCAweGFlLCAweGNjLCAweGIzLCAweGNhLCAweGQ1LCAweGExLAotICAgIDB4ZDUsIDB4YTcsIDB4YWYsIDB4ZDIsIDB4YjQsIDB4OGQsIDB4Y2MsIDB4YzgsIDB4NjMsIDB4YTMsIDB4YTQsIDB4ZGYsCi0gICAgMHg2ZiwgMHg3ZSwgMHg5OCwgMHhkZiwgMHgxYiwgMHg3YiwgMHg0MywgMHg5OSwgMHhiMCwgMHg5OSwgMHg3MSwgMHhkYiwKLSAgICAweDYzLCAweDdiLCAweDY5LCAweDljLCAweGJhLCAweGNkLCAweDkwLCAweGQwLCAweGI2LCAweGE2LCAweDllLCAweDk1LAotICAgIDB4NTAsIDB4YjYsIDB4ZmYsIDB4ZmYsIDB4YWUsIDB4YjYsIDB4ZmYsIDB4ZmYsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweGM3LCAweDA1LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NzcsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHhkYSwgMHhiNiwgMHhmZiwgMHhmZiwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhjMCwgMHg0NCwgMHgwMCwgMHgwMCwKLSAgICAweDJjLCAweDMwLCAweDM4LCAweDVhLCAweDNkLCAweDRjLCAweDQ0LCAweDNiLCAweDQ4LCAweDQ4LCAweDQ0LCAweDU3LAotICAgIDB4M2YsIDB4NDMsIDB4NDUsIDB4M2EsIDB4MjQsIDB4MzIsIDB4MjEsIDB4NWMsIDB4M2YsIDB4M2EsIDB4MzgsIDB4M2EsCi0gICAgMHgzNSwgMHgzNSwgMHgyZiwgMHg1MSwgMHgzYywgMHgzYSwgMHg0NSwgMHgzYSwgMHgzYiwgMHg0MSwgMHgzOSwgMHg1NSwKLSAgICAweDNjLCAweDQxLCAweDM5LCAweDQ0LCAweDNhLCAweDQwLCAweDM3LCAweDQ4LCAweDMzLCAweDQ3LCAweDM2LCAweDNlLAotICAgIDB4M2MsIDB4NDEsIDB4M2YsIDB4M2UsIDB4M2UsIDB4NDcsIDB4MzYsIDB4M2UsIDB4NDEsIDB4MzMsIDB4M2UsIDB4M2IsCi0gICAgMHgzYSwgMHg0NiwgMHg0NSwgMHg0MCwgMHg0OCwgMHgzYSwgMHgzNSwgMHg0YiwgMHg0NSwgMHg0ZCwgMHgzYywgMHg0OSwKLSAgICAweDQyLCAweDQ0LCAweDNjLCAweDRjLCAweDNlLCAweDNjLCAweDQ0LCAweDMyLCAweDMzLCAweDQxLCAweDM2LCAweDRiLAotICAgIDB4MzgsIDB4M2IsIDB4M2MsIDB4MzgsIDB4M2IsIDB4NDUsIDB4MzQsIDB4NDYsIDB4NDAsIDB4NGUsIDB4NDQsIDB4MzUsCi0gICAgMHg0MywgMHgzNiwgMHgzZCwgMHg0MCwgMHgzZSwgMHg0OCwgMHg0MCwgMHgzNCwgMHgzYSwgMHg0NiwgMHg0NSwgMHg0MywKLSAgICAweDQ1LCAweDNmLCAweDQ3LCAweDM3LCAweDM2LCAweDM1LCAweDQ0LCAweDNhLCAweDNlLCAweDM3LCAweDM5LCAweDQwLAotICAgIDB4M2EsIDB4M2YsIDB4M2YsIDB4NGMsIDB4M2UsIDB4NDEsIDB4NDMsIDB4MzUsIDB4M2YsIDB4M2QsIDB4M2QsIDB4NGMsCi0gICAgMHgzYywgMHg0YSwgMHg0NiwgMHgzYywgMHgzYSwgMHg0MSwgMHg0MCwgMHg0ZSwgMHgzNiwgMHg0NywgMHg0MCwgMHgzYiwKLSAgICAweDQ3LCAweDQyLCAweDM4LCAweDRkLCAweDQ4LCAweDQ3LCAweDNjLCAweDNjLCAweDMzLCAweDNiLCAweDNlLCAweDQyLAotICAgIDB4M2YsIDB4M2UsIDB4M2EsIDB4M2QsIDB4MzIsIDB4MzksIDB4NDEsIDB4NDYsIDB4M2EsIDB4M2EsIDB4M2UsIDB4M2UsCi0gICAgMHg0NywgMHg0OCwgMHg0ZSwgMHgzNiwgMHg0NCwgMHg0MCwgMHg0MSwgMHg0NSwgMHgzYSwgMHgzYywgMHgzOCwgMHg1NSwKLSAgICAweDJlLCAweDI2LCAweDJmLCAweDMyLCAweDNmLCAweDQxLCAweDNlLCAweDRjLCAweDQ1LCAweDM2LCAweDQwLCAweDMxLAotICAgIDB4MTcsIDB4MmUsIDB4MTQsIDB4NTMsIDB4MzQsIDB4MzAsIDB4MzQsIDB4M2YsIDB4MmUsIDB4NDQsIDB4MmIsIDB4NGUsCi0gICAgMHgzNCwgMHgzZSwgMHgzNCwgMHg0MywgMHgzZCwgMHgzNSwgMHgzZiwgMHg0NiwgMHgzOSwgMHg0MCwgMHgzOCwgMHgzZSwKLSAgICAweDM1LCAweDNiLCAweDM1LCAweDQ1LCAweDNkLCAweDQwLCAweDM4LCAweDM3LCAweDQwLCAweDNlLCAweDMyLCAweDNlLAotICAgIDB4NDEsIDB4MzksIDB4MzAsIDB4NDEsIDB4M2EsIDB4MzIsIDB4M2UsIDB4M2QsIDB4MzksIDB4MzEsIDB4MzMsIDB4M2UsCi0gICAgMHg0MSwgMHg0NywgMHg0MCwgMHg0NywgMHgzNSwgMHgzMywgMHgzYywgMHgzMiwgMHg0MCwgMHgzYywgMHg0MiwgMHg0OSwKLSAgICAweDM0LCAweDM4LCAweDM5LCAweDM3LCAweDM5LCAweDM1LCAweDQwLCAweDRkLCAweDM3LCAweDQzLCAweDQyLCAweDNlLAotICAgIDB4M2YsIDB4M2MsIDB4M2UsIDB4NTEsIDB4MzYsIDB4MzcsIDB4NDIsIDB4NDEsIDB4MzYsIDB4MzEsIDB4NDMsIDB4M2QsCi0gICAgMHg0NiwgMHg0MywgMHgzNywgMHg0NiwgMHgzMiwgMHg0NSwgMHg0MiwgMHgzNiwgMHgzZiwgMHg0MiwgMHg0MiwgMHg0MSwKLSAgICAweDNkLCAweDQ2LCAweDM5LCAweDQxLCAweDNjLCAweDNmLCAweDM4LCAweDNjLCAweDQzLCAweDQzLCAweDNkLCAweDNjLAotICAgIDB4M2QsIDB4NDEsIDB4MzgsIDB4NDIsIDB4M2EsIDB4M2QsIDB4NDMsIDB4NDIsIDB4NDEsIDB4NDAsIDB4MzksIDB4MzYsCi0gICAgMHgzYSwgMHgzYywgMHgzYywgMHg0ZiwgMHg0NCwgMHgzNiwgMHgzOSwgMHgzNSwgMHg0NiwgMHg0NiwgMHgzNiwgMHg0YSwKLSAgICAweDNhLCAweDQyLCAweDQzLCAweDM5LCAweDNmLCAweDNkLCAweDNjLCAweDQ3LCAweDM4LCAweDNmLCAweDQzLCAweDQwLAotICAgIDB4MzYsIDB4M2MsIDB4NDUsIDB4M2IsIDB4MzMsIDB4MzYsIDB4M2IsIDB4MzksIDB4M2MsIDB4MzUsIDB4NDAsIDB4MzgsCi0gICAgMHg0MCwgMHgzZSwgMHgzZiwgMHg0OCwgMHgzZiwgMHgzNCwgMHg0MCwgMHg1MywgMHgyNiwgMHgyYywgMHgyOSwgMHgzOSwKLSAgICAweDJhLCAweDM4LCAweDNmLCAweDQ1LCAweDMyLCAweDMxLCAweDRhLCAweDM3LCAweDFjLCAweDI4LCAweDA5LCAweDQzLAotICAgIDB4MzUsIDB4M2IsIDB4MzMsIDB4M2MsIDB4MzIsIDB4M2YsIDB4MjgsIDB4NDEsIDB4MzYsIDB4MzUsIDB4M2EsIDB4MzcsCi0gICAgMHg0MSwgMHgzOSwgMHgzMiwgMHgzYywgMHg0MCwgMHgzYywgMHgzYywgMHgzMiwgMHgzOCwgMHgzOSwgMHgzNywgMHg0NCwKLSAgICAweDNhLCAweDMzLCAweDQxLCAweDM2LCAweDM3LCAweDNjLCAweDM1LCAweDNhLCAweDNkLCAweDMwLCAweDNkLCAweDQxLAotICAgIDB4MzcsIDB4M2MsIDB4NDUsIDB4M2EsIDB4MzcsIDB4MmYsIDB4MzYsIDB4M2MsIDB4M2EsIDB4M2QsIDB4MzksIDB4NDgsCi0gICAgMHg0NiwgMHgzMywgMHgzYSwgMHgzZSwgMHg0MCwgMHgzZCwgMHgzYiwgMHg1MiwgMHgzOCwgMHg0NSwgMHgzNCwgMHg0NywKLSAgICAweDM5LCAweDM2LCAweDM3LCAweDU2LCAweDQyLCAweDNmLCAweDMzLCAweDM2LCAweDM4LCAweDNmLCAweDQwLCAweDUzLAotICAgIDB4M2UsIDB4MzcsIDB4M2QsIDB4M2MsIDB4NDgsIDB4M2EsIDB4M2QsIDB4MzMsIDB4MzksIDB4NDAsIDB4M2UsIDB4MzUsCi0gICAgMHgzZCwgMHg0NiwgMHgzOCwgMHgzNiwgMHgzNywgMHg0MywgMHgzYSwgMHgzYywgMHg0MCwgMHgzOCwgMHgzOSwgMHgzYiwKLSAgICAweDM5LCAweDNhLCAweDQyLCAweDNkLCAweDM0LCAweDNmLCAweDM1LCAweDQzLCAweDNhLCAweDM1LCAweDQ2LCAweDNhLAotICAgIDB4NDgsIDB4MzgsIDB4M2IsIDB4NDgsIDB4M2MsIDB4MzUsIDB4NDIsIDB4M2QsIDB4M2EsIDB4M2QsIDB4MzgsIDB4NDIsCi0gICAgMHgzZSwgMHgzYywgMHgzMywgMHgzOSwgMHgzNCwgMHgzMCwgMHg0MiwgMHg0NCwgMHg0MSwgMHgzZCwgMHgzYywgMHgzOSwKLSAgICAweDNjLCAweDNhLCAweDM5LCAweDQxLCAweDNkLCAweDQ0LCAweDNjLCAweDQwLCAweDNmLCAweDNlLCAweDQyLCAweDNmLAotICAgIDB4MzcsIDB4NDAsIDB4MzksIDB4M2IsIDB4NDIsIDB4NDMsIDB4NDksIDB4MzcsIDB4MzksIDB4NDYsIDB4MzUsIDB4M2MsCi0gICAgMHgzZSwgMHgzOSwgMHg0NSwgMHg1MiwgMHgyNCwgMHgyZCwgMHgzOCwgMHgzNSwgMHgzYSwgMHgzYSwgMHgzYywgMHg0NCwKLSAgICAweDM5LCAweDMyLCAweDUxLCAweDNmLCAweDE2LCAweDM0LCAweDBhLCAweDQ5LCAweDM5LCAweDM4LCAweDM5LCAweDNlLAotICAgIDB4MmYsIDB4MzYsIDB4MjQsIDB4M2YsIDB4MzcsIDB4MzQsIDB4MzgsIDB4M2IsIDB4MzQsIDB4MzQsIDB4MzAsIDB4M2IsCi0gICAgMHgzZCwgMHgzNiwgMHgzNSwgMHg0MiwgMHgzMywgMHg0MCwgMHgzNywgMHgzNSwgMHg0MywgMHgzZiwgMHgzZiwgMHgzOSwKLSAgICAweDNhLCAweDQzLCAweDM2LCAweDNlLCAweDM5LCAweDNkLCAweDNmLCAweDNkLCAweDQ3LCAweDNiLCAweDM5LCAweDM3LAotICAgIDB4MzUsIDB4NDIsIDB4M2YsIDB4M2IsIDB4NDEsIDB4M2EsIDB4NDIsIDB4NGIsIDB4M2QsIDB4M2YsIDB4M2QsIDB4M2UsCi0gICAgMHgzOCwgMHgzYiwgMHgzNCwgMHg0ZSwgMHgzZiwgMHgzOSwgMHgzNiwgMHg0MywgMHgzOSwgMHgzNSwgMHg0MSwgMHg0ZCwKLSAgICAweDNjLCAweDM5LCAweDQzLCAweDMzLCAweDM3LCAweDNiLCAweDQxLCAweDQ4LCAweDNjLCAweDNmLCAweDM5LCAweDMyLAotICAgIDB4MzUsIDB4M2QsIDB4NDIsIDB4MzUsIDB4M2QsIDB4M2UsIDB4MzcsIDB4M2IsIDB4MzgsIDB4M2EsIDB4NDQsIDB4MzYsCi0gICAgMHg0MiwgMHgzNSwgMHg0OCwgMHg0MCwgMHgzYSwgMHg0NCwgMHg0NCwgMHgzOSwgMHg0MywgMHg0MSwgMHgzYywgMHgzNywKLSAgICAweDQ3LCAweDNiLCAweDQyLCAweDQyLCAweDQ1LCAweDNhLCAweDQwLCAweDQ2LCAweDM1LCAweDNmLCAweDNhLCAweDQ4LAotICAgIDB4MzUsIDB4NDQsIDB4M2YsIDB4MzcsIDB4MzMsIDB4M2UsIDB4NDUsIDB4NDksIDB4MzksIDB4NDMsIDB4NDcsIDB4MzcsCi0gICAgMHgzZiwgMHgzZiwgMHgzYiwgMHg0NCwgMHgzOCwgMHgzZCwgMHgzOSwgMHg0MiwgMHgzNywgMHgzZSwgMHg0MCwgMHg0NSwKLSAgICAweDNiLCAweDNmLCAweDQwLCAweDM0LCAweDQyLCAweDNmLCAweDQzLCAweDNjLCAweDQzLCAweDQxLCAweDM4LCAweDM4LAotICAgIDB4MzgsIDB4NDEsIDB4NTUsIDB4MzMsIDB4MzMsIDB4MzksIDB4MzksIDB4M2MsIDB4MzUsIDB4MzksIDB4MzgsIDB4NDIsCi0gICAgMHgyNywgMHgyNiwgMHgzMiwgMHg0MSwgMHg0MSwgMHgzMiwgMHgzZiwgMHg0NywgMHgzYSwgMHgzOCwgMHg0OCwgMHgzNywKLSAgICAweDExLCAweDI3LCAweDA4LCAweDQ5LCAweDM1LCAweDQyLCAweDNjLCAweDJlLCAweDM0LCAweDQzLCAweDI1LCAweDNiLAotICAgIDB4M2EsIDB4MzMsIDB4MzcsIDB4MzAsIDB4M2MsIDB4MzYsIDB4MmQsIDB4M2MsIDB4M2IsIDB4MzksIDB4M2IsIDB4NDAsCi0gICAgMHg0NiwgMHgzYSwgMHgzMCwgMHg0MiwgMHgzNSwgMHgzMiwgMHgzNiwgMHgzYSwgMHgzYSwgMHgzNCwgMHgzNCwgMHgzMywKLSAgICAweDNkLCAweDMwLCAweDNiLCAweDQyLCAweDQxLCAweDNmLCAweDNkLCAweDNiLCAweDQ0LCAweDNkLCAweDQxLCAweDQxLAotICAgIDB4M2QsIDB4M2YsIDB4NDAsIDB4NTEsIDB4NDIsIDB4NDIsIDB4MzYsIDB4NDUsIDB4MzAsIDB4NDAsIDB4MzIsIDB4NGYsCi0gICAgMHgzYSwgMHgzYywgMHg0MCwgMHgzOSwgMHgzZCwgMHgzYiwgMHgzZSwgMHg0YiwgMHgzZCwgMHgzNywgMHg0MiwgMHg0NiwKLSAgICAweDQwLCAweDQwLCAweDQ3LCAweDNkLCAweDM1LCAweDNjLCAweDNmLCAweDQ2LCAweDM3LCAweDM3LCAweDNhLCAweDJlLAotICAgIDB4M2QsIDB4M2MsIDB4M2EsIDB4NDYsIDB4M2EsIDB4NDQsIDB4M2MsIDB4M2EsIDB4MzIsIDB4NDQsIDB4MzEsIDB4NDEsCi0gICAgMHg0MywgMHgzNiwgMHg0OSwgMHgzOSwgMHgzZCwgMHgzNywgMHgzZiwgMHg0MSwgMHgzYiwgMHgzYiwgMHgzYywgMHg0MiwKLSAgICAweDNjLCAweDM0LCAweDNmLCAweDNiLCAweDQwLCAweDNlLCAweDQ4LCAweDQ3LCAweDNlLCAweDNjLCAweDM4LCAweDM5LAotICAgIDB4M2YsIDB4MzUsIDB4MzksIDB4M2YsIDB4M2UsIDB4M2UsIDB4M2IsIDB4NDMsIDB4NDEsIDB4NDAsIDB4NDMsIDB4NDEsCi0gICAgMHgzZiwgMHgzNywgMHgzOSwgMHg0MSwgMHg0NiwgMHgzMiwgMHgzZCwgMHg0MSwgMHgzNiwgMHgzZiwgMHgzZSwgMHgzZiwKLSAgICAweDM2LCAweDQ4LCAweDQzLCAweDNkLCAweDQzLCAweDNmLCAweDM0LCAweDNkLCAweDM0LCAweDM1LCAweDRmLCAweDMyLAotICAgIDB4M2MsIDB4M2YsIDB4M2QsIDB4M2YsIDB4MzksIDB4M2MsIDB4M2QsIDB4NDcsIDB4MjMsIDB4MzYsIDB4MzMsIDB4NDUsCi0gICAgMHgzNywgMHgyZSwgMHg0MiwgMHg0MiwgMHgzOSwgMHgzNCwgMHg0ZiwgMHgzZiwgMHgxOSwgMHgyYiwgMHgwMSwgMHg1MCwKLSAgICAweDM1LCAweDNmLCAweDM3LCAweDNjLCAweDMzLCAweDM1LCAweDI1LCAweDMyLCAweDM4LCAweDNlLCAweDQwLCAweDQwLAotICAgIDB4MmYsIDB4MzgsIDB4MzUsIDB4M2QsIDB4MzEsIDB4NDIsIDB4NDQsIDB4M2MsIDB4M2EsIDB4M2QsIDB4MmQsIDB4M2UsCi0gICAgMHgzYiwgMHgzZSwgMHgzZCwgMHgzMSwgMHgzYiwgMHgzNywgMHgzNSwgMHgzMSwgMHgzNiwgMHgzNSwgMHgzNCwgMHgzMSwKLSAgICAweDQxLCAweDNhLCAweDMzLCAweDMyLCAweDNjLCAweDMxLCAweDNlLCAweDNkLCAweDQwLCAweDNiLCAweDM0LCAweDQ1LAotICAgIDB4MzYsIDB4MzksIDB4M2UsIDB4M2YsIDB4M2MsIDB4NDUsIDB4MzcsIDB4NGIsIDB4NDIsIDB4M2QsIDB4MzMsIDB4NDMsCi0gICAgMHgzZSwgMHg0MCwgMHgzNSwgMHg0ZSwgMHgzOCwgMHgzNiwgMHgzYSwgMHgzMywgMHgzOCwgMHg0NCwgMHgzZiwgMHgzYywKLSAgICAweDNmLCAweDQwLCAweDNhLCAweDNjLCAweDNjLCAweDNjLCAweDQ0LCAweDI5LCAweDNhLCAweDQwLCAweDM1LCAweDNhLAotICAgIDB4M2QsIDB4NDgsIDB4M2IsIDB4MzAsIDB4NDUsIDB4NDEsIDB4NDUsIDB4NDAsIDB4MzcsIDB4MzIsIDB4M2EsIDB4MzUsCi0gICAgMHgzZiwgMHgzOCwgMHgzYiwgMHg0MywgMHgzYiwgMHgzZiwgMHgzMywgMHg0MCwgMHgzYiwgMHg0MCwgMHgzOCwgMHgzMywKLSAgICAweDM5LCAweDNjLCAweDNjLCAweDNmLCAweDQzLCAweDMzLCAweDQzLCAweDQwLCAweDQzLCAweDNkLCAweDMzLCAweDQyLAotICAgIDB4NDAsIDB4MzIsIDB4M2UsIDB4MzYsIDB4NDAsIDB4MzgsIDB4NDMsIDB4NDAsIDB4NDQsIDB4MzgsIDB4MzQsIDB4M2MsCi0gICAgMHgzZSwgMHgzOSwgMHg0NywgMHg0MywgMHg0MCwgMHgzYiwgMHgzZiwgMHgzZiwgMHgzYywgMHgzYiwgMHg0YiwgMHgzMywKLSAgICAweDM2LCAweDQ5LCAweDMyLCAweDQxLCAweDQ4LCAweDQ1LCAweDU3LCAweDNhLCAweDQwLCAweDQyLCAweDQwLCAweDQ2LAotICAgIDB4MzYsIDB4MzUsIDB4M2MsIDB4NDYsIDB4MjIsIDB4MmUsIDB4MzMsIDB4M2UsIDB4M2MsIDB4MzksIDB4NDQsIDB4NGQsCi0gICAgMHgzZiwgMHg0MSwgMHg1MSwgMHg0NCwgMHgxNSwgMHgyZSwgMHgwMiwgMHg0ZSwgMHgzOSwgMHgzYSwgMHgzYywgMHgzNSwKLSAgICAweDMwLCAweDM4LCAweDFlLCAweDMxLCAweDQwLCAweDNiLCAweDM5LCAweDNkLCAweDNhLCAweDM3LCAweDM1LCAweDM2LAotICAgIDB4NDYsIDB4MzYsIDB4M2MsIDB4M2UsIDB4MzksIDB4M2UsIDB4MzIsIDB4NDAsIDB4M2IsIDB4MzUsIDB4NDIsIDB4NDEsCi0gICAgMHg0MSwgMHgzOCwgMHg0MSwgMHgzNSwgMHg0MiwgMHgzNiwgMHgzYywgMHg0MiwgMHgzZCwgMHg0MSwgMHgzNSwgMHgzMSwKLSAgICAweDNmLCAweDQ0LCAweDNlLCAweDQxLCAweDNmLCAweDM1LCAweDQyLCAweDRiLCAweDNlLCAweDM2LCAweDM3LCAweDM0LAotICAgIDB4MzYsIDB4M2QsIDB4NDAsIDB4NDksIDB4NDEsIDB4M2UsIDB4M2QsIDB4M2IsIDB4MzgsIDB4MzcsIDB4NDAsIDB4NDcsCi0gICAgMHgzNSwgMHgzMiwgMHg0MywgMHgzOCwgMHgzNiwgMHgzYiwgMHgzMywgMHg0NywgMHgzMywgMHgzNCwgMHgzZCwgMHg0NywKLSAgICAweDNjLCAweDM3LCAweDNkLCAweDJiLCAweDNhLCAweDM2LCAweDNiLCAweDNkLCAweDQzLCAweDM4LCAweDM1LCAweDMyLAotICAgIDB4MzIsIDB4MzcsIDB4NDMsIDB4MzYsIDB4M2YsIDB4NDgsIDB4MzgsIDB4MzAsIDB4M2EsIDB4M2MsIDB4NDIsIDB4MzQsCi0gICAgMHgzNywgMHgzYywgMHgzNywgMHg0MCwgMHg0OCwgMHgzZSwgMHgzNSwgMHgzYiwgMHgzZiwgMHgzOCwgMHgzOSwgMHgzZSwKLSAgICAweDM3LCAweDM1LCAweDM2LCAweDNkLCAweDNiLCAweDNjLCAweDQwLCAweDNkLCAweDM0LCAweDQwLCAweDQ2LCAweDQyLAotICAgIDB4M2YsIDB4M2MsIDB4M2MsIDB4M2UsIDB4NDAsIDB4NDAsIDB4M2QsIDB4M2YsIDB4M2YsIDB4NDQsIDB4NDYsIDB4NDEsCi0gICAgMHgzMiwgMHg0MywgMHg0MCwgMHg0MSwgMHgzYywgMHg0MiwgMHgzOSwgMHgzOCwgMHg0OCwgMHg0NCwgMHgzZCwgMHgzOCwKLSAgICAweDM0LCAweDQwLCAweDRlLCAweDMxLCAweDNjLCAweDQyLCAweDM5LCAweDQ4LCAweDNjLCAweDMzLCAweDNlLCAweDQwLAotICAgIDB4MjAsIDB4MjcsIDB4MzksIDB4NDUsIDB4NDUsIDB4MzYsIDB4NDcsIDB4NGMsIDB4MzUsIDB4M2UsIDB4NGEsIDB4MzYsCi0gICAgMHgxNiwgMHgyZiwgMHgwNCwgMHg0ZiwgMHgzYSwgMHgzNSwgMHgzNiwgMHgzYSwgMHgyZCwgMHgzNiwgMHgyMSwgMHgzNCwKLSAgICAweDNiLCAweDMyLCAweDNkLCAweDNjLCAweDNjLCAweDNmLCAweDNiLCAweDNiLCAweDQxLCAweDQ2LCAweDQwLCAweDNkLAotICAgIDB4M2IsIDB4NDQsIDB4MzMsIDB4NDIsIDB4MzQsIDB4MzMsIDB4M2UsIDB4NDUsIDB4M2YsIDB4NDYsIDB4MzksIDB4MzMsCi0gICAgMHgzYiwgMHgzNywgMHgzNywgMHgzNywgMHg0MiwgMHg0NywgMHgzYywgMHgzNSwgMHgzMSwgMHg0MSwgMHg0NCwgMHgzYSwKLSAgICAweDNiLCAweDMzLCAweDM5LCAweDQ0LCAweDQyLCAweDMzLCAweDNkLCAweDNmLCAweDQzLCAweDMzLCAweDQxLCAweDRhLAotICAgIDB4MzUsIDB4NDYsIDB4MzYsIDB4M2UsIDB4MzksIDB4NDEsIDB4NDEsIDB4NGMsIDB4MzQsIDB4M2QsIDB4MzgsIDB4MzMsCi0gICAgMHgzYywgMHgzZiwgMHg0MywgMHg0NCwgMHgzNywgMHgzNSwgMHgzNSwgMHgzYywgMHg0MywgMHgzNCwgMHgzZSwgMHgyZCwKLSAgICAweDNmLCAweDM1LCAweDM4LCAweDNjLCAweDMzLCAweDM1LCAweDQzLCAweDJhLCAweDQwLCAweDMzLCAweDM0LCAweDQwLAotICAgIDB4M2QsIDB4MzgsIDB4MzYsIDB4MmQsIDB4MzYsIDB4M2MsIDB4NDMsIDB4M2QsIDB4MzcsIDB4M2QsIDB4MzksIDB4MzgsCi0gICAgMHgzYiwgMHgzZSwgMHgzYywgMHg0NiwgMHgzNSwgMHgzNSwgMHg0MywgMHg0NCwgMHgzOSwgMHg0MCwgMHgzNCwgMHgzOSwKLSAgICAweDNkLCAweDM0LCAweDQwLCAweDQ1LCAweDM4LCAweDM1LCAweDNlLCAweDM5LCAweDNjLCAweDQ0LCAweDQ4LCAweDQ0LAotICAgIDB4NDEsIDB4M2UsIDB4M2MsIDB4NDUsIDB4M2EsIDB4M2MsIDB4M2MsIDB4NDYsIDB4M2EsIDB4NDAsIDB4MzksIDB4NDMsCi0gICAgMHgzNSwgMHgzNSwgMHgzZSwgMHg0NSwgMHgzYSwgMHgzNCwgMHgzYywgMHgzOSwgMHg0NiwgMHgzYSwgMHg0ZiwgMHgzNSwKLSAgICAweDMyLCAweDNkLCAweDM2LCAweDQxLCAweDMyLCAweDM4LCAweDNmLCAweDQ1LCAweDJkLCAweDM0LCAweDJhLCAweDM1LAotICAgIDB4NDMsIDB4M2YsIDB4NDEsIDB4NDksIDB4NDEsIDB4M2MsIDB4NGIsIDB4M2YsIDB4MTcsIDB4MzEsIDB4MDIsIDB4NGYsCi0gICAgMHgzMCwgMHgzOCwgMHgzOSwgMHg0MCwgMHgzMywgMHgzYSwgMHgyNSwgMHgzOCwgMHgzNSwgMHgzYywgMHgzOSwgMHgzNSwKLSAgICAweDM0LCAweDQxLCAweDM0LCAweDQzLCAweDQwLCAweDQwLCAweDQ2LCAweDNkLCAweDQwLCAweDM4LCAweDNmLCAweDNiLAotICAgIDB4MzUsIDB4MzksIDB4M2MsIDB4MzksIDB4MzQsIDB4MzgsIDB4M2YsIDB4MzYsIDB4M2EsIDB4MzgsIDB4NDQsIDB4M2YsCi0gICAgMHgzZiwgMHgzOCwgMHgzYywgMHgzMywgMHg0MSwgMHg0MiwgMHgzOCwgMHgzMywgMHgzYywgMHgzYiwgMHgzYywgMHg0NiwKLSAgICAweDM4LCAweDNiLCAweDNmLCAweDMzLCAweDNmLCAweDQ4LCAweDNiLCAweDQ5LCAweDNmLCAweDNhLCAweDNkLCAweDNmLAotICAgIDB4NDcsIDB4M2QsIDB4MzAsIDB4NDUsIDB4MzYsIDB4NDIsIDB4M2QsIDB4MzYsIDB4NDMsIDB4MzgsIDB4M2IsIDB4M2QsCi0gICAgMHgzYywgMHgzMCwgMHgzYiwgMHg0MywgMHgzZCwgMHg0MSwgMHgzNCwgMHgyZSwgMHg0MywgMHgzZCwgMHg0MywgMHg0NiwKLSAgICAweDQzLCAweDNjLCAweDNjLCAweDJlLCAweDNjLCAweDQzLCAweDM0LCAweDQzLCAweDNlLCAweDQzLCAweDNmLCAweDJiLAotICAgIDB4NDUsIDB4NDAsIDB4M2EsIDB4NDMsIDB4MzYsIDB4MzksIDB4M2YsIDB4M2QsIDB4M2EsIDB4M2MsIDB4MzUsIDB4M2IsCi0gICAgMHgzNiwgMHgzZiwgMHg0NSwgMHgzZSwgMHg0NSwgMHg0MCwgMHgzZiwgMHgzNiwgMHg0NSwgMHg0MiwgMHgzNSwgMHgzZSwKLSAgICAweDNhLCAweDNhLCAweDNmLCAweDQwLCAweDNlLCAweDNjLCAweDM5LCAweDQ2LCAweDQzLCAweDNlLCAweDNmLCAweDNmLAotICAgIDB4NDAsIDB4M2MsIDB4NDAsIDB4NGIsIDB4NDEsIDB4MzUsIDB4M2IsIDB4M2UsIDB4NDksIDB4MzIsIDB4M2UsIDB4NDEsCi0gICAgMHgzMSwgMHgzNywgMHgzZCwgMHgzYiwgMHgzZiwgMHg0NSwgMHg1MCwgMHgzYSwgMHgzZiwgMHgzYywgMHg0NCwgMHgzNiwKLSAgICAweDQzLCAweDM3LCAweDNkLCAweDRiLCAweDI5LCAweDM5LCAweDJmLCAweDM4LCAweDQ1LCAweDM2LCAweDQwLCAweDRlLAotICAgIDB4MzksIDB4M2YsIDB4NDgsIDB4NDMsIDB4MjMsIDB4M2MsIDB4MDYsIDB4NTEsIDB4MzcsIDB4M2IsIDB4M2UsIDB4M2IsCi0gICAgMHgyOCwgMHg0NSwgMHgyYiwgMHgzNywgMHgzZiwgMHgzMywgMHgzZiwgMHg0MSwgMHgzMSwgMHgzNiwgMHgzMywgMHgzYSwKLSAgICAweDNhLCAweDM1LCAweDNiLCAweDMzLCAweDNlLCAweDM2LCAweDM1LCAweDQwLCAweDNhLCAweDM0LCAweDNhLCAweDM4LAotICAgIDB4MzQsIDB4M2EsIDB4M2EsIDB4MzQsIDB4NDIsIDB4NDUsIDB4NDAsIDB4M2UsIDB4NDAsIDB4MzgsIDB4MzksIDB4MzQsCi0gICAgMHgzOCwgMHgzNywgMHgzZiwgMHgzZSwgMHgzYywgMHgzMiwgMHgzZiwgMHg0NiwgMHgzZiwgMHg0NCwgMHgzYiwgMHgzZSwKLSAgICAweDQ0LCAweDQ1LCAweDM2LCAweDNlLCAweDM2LCAweDNmLCAweDNiLCAweDQwLCAweDM5LCAweDM0LCAweDM4LCAweDQxLAotICAgIDB4NDIsIDB4M2UsIDB4M2QsIDB4NDcsIDB4M2UsIDB4NDUsIDB4MzMsIDB4NDAsIDB4M2UsIDB4M2EsIDB4NDQsIDB4M2QsCi0gICAgMHgzYywgMHgzYSwgMHgzYSwgMHgyYywgMHgzYSwgMHgzZCwgMHgzNSwgMHg0NSwgMHgzYywgMHg0MSwgMHgzNiwgMHgzMCwKLSAgICAweDMyLCAweDMyLCAweDNhLCAweDNiLCAweDM1LCAweDNjLCAweDQzLCAweDJkLCAweDM1LCAweDNmLCAweDQxLCAweDM3LAotICAgIDB4M2YsIDB4NDYsIDB4MzQsIDB4MzksIDB4M2MsIDB4NDMsIDB4NDAsIDB4M2UsIDB4M2UsIDB4MzYsIDB4M2UsIDB4M2MsCi0gICAgMHgzNywgMHgzYSwgMHgzZCwgMHgzYSwgMHgzYywgMHgzOCwgMHg0NCwgMHg0MSwgMHgzZiwgMHgzYiwgMHgzYywgMHg0NywKLSAgICAweDQwLCAweDNiLCAweDQxLCAweDQ3LCAweDNlLCAweDQ1LCAweDM5LCAweDNlLCAweDM3LCAweDQ1LCAweDRiLCAweDRjLAotICAgIDB4MzcsIDB4MzcsIDB4MzcsIDB4M2MsIDB4M2MsIDB4M2QsIDB4NDAsIDB4MzgsIDB4MzksIDB4M2UsIDB4NDMsIDB4M2YsCi0gICAgMHgzOCwgMHg0NSwgMHg1MSwgMHgzYywgMHgzMSwgMHgzNCwgMHgzYiwgMHg0OCwgMHg0NiwgMHg0MSwgMHg0MCwgMHg0MCwKLSAgICAweDJjLCAweDM5LCAweDMyLCAweDQyLCAweDNjLCAweDJlLCAweDQ5LCAweDRkLCAweDNjLCAweDNmLCAweDQ1LCAweDM4LAotICAgIDB4MjAsIDB4MzgsIDB4MDMsIDB4NTUsIDB4MzMsIDB4M2UsIDB4MzIsIDB4MzksIDB4MzIsIDB4M2IsIDB4MjQsIDB4MmIsCi0gICAgMHg0MiwgMHgzNSwgMHg0NSwgMHgzMiwgMHgyZSwgMHgzYiwgMHgyZiwgMHgzZiwgMHgzYywgMHgzNywgMHgzOSwgMHgzYiwKLSAgICAweDM0LCAweDM0LCAweDNkLCAweDM2LCAweDNkLCAweDM5LCAweDNiLCAweDMwLCAweDNjLCAweDNlLCAweDQwLCAweDMyLAotICAgIDB4M2QsIDB4M2MsIDB4M2MsIDB4M2UsIDB4MzMsIDB4MzMsIDB4M2YsIDB4M2EsIDB4MzMsIDB4M2UsIDB4NDYsIDB4MzYsCi0gICAgMHgzYSwgMHgzZCwgMHg0MCwgMHg0MCwgMHgzZiwgMHg0MSwgMHgzYSwgMHg0MiwgMHgzNCwgMHgzMiwgMHgzNCwgMHg0NiwKLSAgICAweDNiLCAweDMxLCAweDQwLCAweDM3LCAweDM3LCAweDMyLCAweDNlLCAweDQ3LCAweDNmLCAweDNiLCAweDNlLCAweDQzLAotICAgIDB4NDksIDB4NDUsIDB4M2EsIDB4M2QsIDB4M2UsIDB4NDQsIDB4NDAsIDB4MzEsIDB4MzksIDB4M2UsIDB4M2IsIDB4MmQsCi0gICAgMHgzYiwgMHgzYSwgMHgzMywgMHgzZCwgMHgzOSwgMHgzNywgMHgzZSwgMHgzMiwgMHg0MSwgMHgzYywgMHgzYSwgMHgzNywKLSAgICAweDNiLCAweDQwLCAweDM5LCAweDJmLCAweDNlLCAweDNmLCAweDQ3LCAweDMyLCAweDNlLCAweDNiLCAweDNlLCAweDNlLAotICAgIDB4NDAsIDB4M2UsIDB4NDAsIDB4M2MsIDB4NDEsIDB4MzksIDB4MzgsIDB4NDYsIDB4NDUsIDB4MzIsIDB4NDcsIDB4MzEsCi0gICAgMHgzNiwgMHg0NywgMHgzNywgMHg0OSwgMHgzYSwgMHgzZiwgMHg0NywgMHgzYSwgMHg0MSwgMHgzYiwgMHgzYywgMHg0ZiwKLSAgICAweDNlLCAweDM2LCAweDNiLCAweDQ3LCAweDM1LCAweDM5LCAweDQxLCAweDRlLCAweDNkLCAweDNlLCAweDNiLCAweDQ2LAotICAgIDB4MzgsIDB4MzksIDB4M2IsIDB4NDUsIDB4M2UsIDB4M2YsIDB4NDQsIDB4NDIsIDB4NDQsIDB4M2YsIDB4NTUsIDB4M2IsCi0gICAgMHg0MSwgMHgzZCwgMHg0MywgMHg0MywgMHgzNywgMHgzZiwgMHgzZCwgMHg0YywgMHgyOCwgMHgzZCwgMHgzNiwgMHgzYywKLSAgICAweDNlLCAweDNlLCAweDQ4LCAweDUwLCAweDNlLCAweDM5LCAweDQ1LCAweDQxLCAweDIyLCAweDM3LCAweDA3LCAweDRmLAotICAgIDB4MmUsIDB4MzMsIDB4MzgsIDB4M2YsIDB4MzEsIDB4M2EsIDB4MWIsIDB4MzYsIDB4MzQsIDB4MzgsIDB4M2MsIDB4MzcsCi0gICAgMHgzNywgMHgzZSwgMHgzNiwgMHgzNSwgMHgzNiwgMHgzYiwgMHgzZCwgMHgzOCwgMHg0MiwgMHg0OCwgMHgzZCwgMHg0MCwKLSAgICAweDQwLCAweDQ0LCAweDNkLCAweDM5LCAweDM3LCAweDNiLCAweDNkLCAweDMzLCAweDNkLCAweDM1LCAweDQyLCAweDNjLAotICAgIDB4MzksIDB4M2UsIDB4NDMsIDB4MmQsIDB4M2MsIDB4NDAsIDB4NDMsIDB4NDMsIDB4NDUsIDB4MzUsIDB4M2MsIDB4NDQsCi0gICAgMHgzNCwgMHgzYywgMHgzZCwgMHgzMSwgMHgzOSwgMHg0MCwgMHgzOSwgMHgzZCwgMHgzZSwgMHgzNCwgMHgzZSwgMHgzYiwKLSAgICAweDQwLCAweDM4LCAweDQyLCAweDRhLCAweDQwLCAweDNiLCAweDM1LCAweDNkLCAweDM2LCAweDM4LCAweDM1LCAweDQyLAotICAgIDB4M2MsIDB4M2MsIDB4M2QsIDB4M2IsIDB4MzgsIDB4MzksIDB4NDUsIDB4MjgsIDB4M2EsIDB4MzcsIDB4MzcsIDB4MzUsCi0gICAgMHgzYSwgMHgzZCwgMHgzNSwgMHgyYSwgMHgzYywgMHgzZiwgMHgzNywgMHgzNCwgMHgzNywgMHgzZiwgMHgzZSwgMHgyYiwKLSAgICAweDM5LCAweDQzLCAweDNiLCAweDQ1LCAweDM1LCAweDM2LCAweDM2LCAweDQyLCAweDMzLCAweDM4LCAweDNiLCAweDM1LAotICAgIDB4MzEsIDB4M2YsIDB4NDEsIDB4NDEsIDB4M2MsIDB4NDEsIDB4NDUsIDB4NDIsIDB4M2IsIDB4M2MsIDB4MzksIDB4NDYsCi0gICAgMHgzYywgMHgzZSwgMHgzYSwgMHg0MSwgMHgzOSwgMHgzZCwgMHg0MSwgMHg0YiwgMHg0MCwgMHgzZiwgMHg0MywgMHgzZCwKLSAgICAweDM5LCAweDM5LCAweDQ0LCAweDQ0LCAweDM3LCAweDQyLCAweDNmLCAweDQ0LCAweDNlLCAweDM3LCAweDQyLCAweDM1LAotICAgIDB4NDQsIDB4M2YsIDB4NDAsIDB4NDIsIDB4M2YsIDB4M2EsIDB4NDcsIDB4M2QsIDB4MzgsIDB4M2EsIDB4M2IsIDB4M2EsCi0gICAgMHg0MiwgMHgzNiwgMHgzYSwgMHg5NywgMHgzMiwgMHgzMSwgMHgzMCwgMHgzNiwgMHg0NywgMHgzZSwgMHg0NiwgMHg1MSwKLSAgICAweDQyLCAweDM0LCAweDUwLCAweDM0LCAweDI2LCAweDNiLCAweDA2LCAweDU1LCAweDNjLCAweDNiLCAweDJkLCAweDNhLAotICAgIDB4MzcsIDB4MzcsIDB4MWIsIDB4MzIsIDB4MzksIDB4M2QsIDB4MzYsIDB4NDAsIDB4M2IsIDB4M2YsIDB4MzMsIDB4MzMsCi0gICAgMHgzZCwgMHgzNywgMHgzNSwgMHgzNywgMHg0NCwgMHgzZiwgMHgzNSwgMHgzOSwgMHgzMywgMHgzYywgMHg0MywgMHgzOSwKLSAgICAweDNmLCAweDQyLCAweDNlLCAweDM0LCAweDM4LCAweDM4LCAweDM5LCAweDNjLCAweDQ4LCAweDNjLCAweDJmLCAweDMwLAotICAgIDB4NDAsIDB4M2MsIDB4NDEsIDB4M2UsIDB4M2YsIDB4M2UsIDB4MzYsIDB4NDMsIDB4NDAsIDB4M2MsIDB4MzYsIDB4NDMsCi0gICAgMHg0MywgMHgzOCwgMHgzYSwgMHg0NywgMHgzZSwgMHgzNywgMHgzOSwgMHgzYSwgMHg0MywgMHg0NSwgMHgzOCwgMHg0MywKLSAgICAweDNiLCAweDQ1LCAweDM3LCAweDQ0LCAweDM2LCAweDQ1LCAweDNhLCAweDNlLCAweDNlLCAweDNlLCAweDNkLCAweDMzLAotICAgIDB4MzksIDB4MzYsIDB4NDgsIDB4MzMsIDB4MzAsIDB4NDIsIDB4MzMsIDB4MzksIDB4MzcsIDB4M2EsIDB4M2YsIDB4MzQsCi0gICAgMHgzNCwgMHg0MCwgMHg0MCwgMHg0MCwgMHgzZiwgMHgzZCwgMHgzZiwgMHgzMywgMHg0MSwgMHg0MCwgMHgzYiwgMHg0MywKLSAgICAweDNiLCAweDNhLCAweDQwLCAweDNhLCAweDM4LCAweDNlLCAweDM4LCAweDNiLCAweDM4LCAweDQyLCAweDQwLCAweDQwLAotICAgIDB4NDEsIDB4MzUsIDB4MzcsIDB4MzgsIDB4M2IsIDB4M2MsIDB4MzksIDB4NGIsIDB4MzIsIDB4MzksIDB4NDIsIDB4M2MsCi0gICAgMHgzNiwgMHgzZCwgMHgzMiwgMHg1MiwgMHgzYSwgMHgzMSwgMHg0MCwgMHg0MCwgMHgzYSwgMHg0MywgMHgzZCwgMHg0NiwKLSAgICAweDNjLCAweDNlLCAweDNlLCAweDMzLCAweDNmLCAweDQxLCAweDRkLCAweDM3LCAweDM5LCAweDM5LCAweDNlLCAweDNiLAotICAgIDB4NDAsIDB4MzksIDB4NTMsIDB4MmQsIDB4NDYsIDB4M2MsIDB4MzIsIDB4NDIsIDB4M2QsIDB4NDAsIDB4NDAsIDB4NGQsCi0gICAgMHgyZSwgMHgzNCwgMHgzOSwgMHgzYiwgMHg0NiwgMHgzYiwgMHg0MiwgMHg0ZiwgMHgzZCwgMHgzOSwgMHg0ZSwgMHgzNiwKLSAgICAweDFhLCAweDMxLCAweDBlLCAweDU2LCAweDM2LCAweDQyLCAweDM4LCAweDQ0LCAweDM2LCAweDNhLCAweDIwLCAweDMwLAotICAgIDB4MzYsIDB4MzQsIDB4MzcsIDB4MzgsIDB4NDAsIDB4NDEsIDB4MmEsIDB4MzUsIDB4M2IsIDB4M2IsIDB4M2EsIDB4MzgsCi0gICAgMHgzMywgMHgzOSwgMHgzNiwgMHg0MSwgMHg0MywgMHgzOSwgMHgzNSwgMHgzZCwgMHgzNywgMHgzZCwgMHgzMywgMHgzMSwKLSAgICAweDQ1LCAweDMzLCAweDNmLCAweDNiLCAweDQ0LCAweDM4LCAweDM5LCAweDM0LCAweDM4LCAweDM5LCAweDM4LCAweDNkLAotICAgIDB4M2EsIDB4M2EsIDB4NDEsIDB4NDAsIDB4NDQsIDB4M2UsIDB4M2YsIDB4NDUsIDB4MzQsIDB4MzEsIDB4MzQsIDB4NDMsCi0gICAgMHgzYiwgMHgzNCwgMHg0MiwgMHgzYywgMHgzYywgMHg0MywgMHgzNSwgMHg0NSwgMHgzNiwgMHgzOCwgMHgzZCwgMHgzYywKLSAgICAweDNmLCAweDNkLCAweDNlLCAweDQ1LCAweDQxLCAweDQzLCAweDM1LCAweDNmLCAweDQwLCAweDNmLCAweDNhLCAweDM0LAotICAgIDB4M2QsIDB4MzIsIDB4NDEsIDB4M2QsIDB4NDgsIDB4NDIsIDB4MzcsIDB4MmEsIDB4M2MsIDB4M2EsIDB4M2UsIDB4NDksCi0gICAgMHgzOCwgMHgzNiwgMHgzOCwgMHgyZSwgMHgzNiwgMHgzNywgMHgzNCwgMHgzZSwgMHgzYywgMHg0MywgMHg0MywgMHgzOSwKLSAgICAweDM5LCAweDNiLCAweDQ0LCAweDQ2LCAweDQ0LCAweDQzLCAweDM3LCAweDQ2LCAweDQzLCAweDM0LCAweDNiLCAweDM1LAotICAgIDB4NDIsIDB4NDEsIDB4M2YsIDB4M2QsIDB4M2QsIDB4M2EsIDB4NDIsIDB4M2UsIDB4MzgsIDB4NDcsIDB4M2QsIDB4NDksCi0gICAgMHg0NSwgMHg0OSwgMHgzYSwgMHgzYywgMHgzZSwgMHgzNywgMHg0MCwgMHg0NiwgMHg0MSwgMHgzMywgMHg0NSwgMHgzNiwKLSAgICAweDM3LCAweDQ0LCAweDQ5LCAweDNiLCAweDQ0LCAweDQwLCAweDMzLCAweDQ2LCAweDM3LCAweDM5LCAweDRlLCAweDNhLAotICAgIDB4NDMsIDB4MzgsIDB4M2EsIDB4NDIsIDB4M2EsIDB4M2QsIDB4NDUsIDB4NTAsIDB4MjYsIDB4MzQsIDB4M2IsIDB4M2MsCi0gICAgMHg0NiwgMHg0NiwgMHg0YywgMHg1NCwgMHgzZiwgMHgzNSwgMHg0ZSwgMHg0NywgMHgyMSwgMHgzOSwgMHgwZSwgMHg1NCwKLSAgICAweDNhLCAweDNhLCAweDJmLCAweDQwLCAweDJkLCAweDNhLCAweDFmLCAweDMxLCAweDMxLCAweDQyLCAweDM0LCAweDQ1LAotICAgIDB4MzcsIDB4MzYsIDB4MzAsIDB4M2IsIDB4M2EsIDB4M2EsIDB4MzYsIDB4NDAsIDB4MzIsIDB4MzYsIDB4M2MsIDB4M2MsCi0gICAgMHgzNywgMHg0MiwgMHgzNSwgMHgzZSwgMHgzOSwgMHg0NywgMHgzNiwgMHgzMiwgMHg0MSwgMHgzMCwgMHg0MiwgMHgzOSwKLSAgICAweDM5LCAweDQ0LCAweDM3LCAweDMwLCAweDQxLCAweDNiLCAweDNkLCAweDNkLCAweDQzLCAweDNiLCAweDM4LCAweDQ1LAotICAgIDB4M2IsIDB4M2EsIDB4MzksIDB4M2EsIDB4MzEsIDB4MzMsIDB4NDMsIDB4NDYsIDB4M2YsIDB4NDEsIDB4NDQsIDB4M2YsCi0gICAgMHgzYiwgMHg0NCwgMHgzYSwgMHg0YywgMHgzMywgMHgzMywgMHgzMywgMHgzZSwgMHgzNywgMHgzZSwgMHg0NSwgMHg0NSwKLSAgICAweDM2LCAweDQyLCAweDNlLCAweDQzLCAweDQwLCAweDM0LCAweDM2LCAweDMxLCAweDM4LCAweDM0LCAweDQxLCAweDNiLAotICAgIDB4MzIsIDB4MzgsIDB4M2UsIDB4MjksIDB4NDcsIDB4MzMsIDB4MzcsIDB4NDUsIDB4M2MsIDB4M2QsIDB4NDMsIDB4MmMsCi0gICAgMHgzNiwgMHgzYSwgMHgzYywgMHg0MCwgMHgzZCwgMHg0NiwgMHgzYywgMHgzNywgMHg0MCwgMHg0NCwgMHgzNywgMHgzOCwKLSAgICAweDNlLCAweDQxLCAweDNjLCAweDQwLCAweDMzLCAweDNmLCAweDQ0LCAweDMyLCAweDQ0LCAweDNhLCAweDQzLCAweDQyLAotICAgIDB4M2UsIDB4MzgsIDB4NDQsIDB4M2IsIDB4NDEsIDB4NDgsIDB4M2YsIDB4NGUsIDB4M2YsIDB4NDQsIDB4MzUsIDB4NDUsCi0gICAgMHgzNCwgMHgzZiwgMHg0MiwgMHg0YiwgMHgzNywgMHgzNywgMHgzZSwgMHg0NSwgMHg0NiwgMHg0NSwgMHg0NiwgMHgzZCwKLSAgICAweDNlLCAweDM5LCAweDNiLCAweDNhLCAweDQ2LCAweDNhLCAweDU2LCAweDM1LCAweDQ2LCAweDNkLCAweDQwLCAweDNiLAotICAgIDB4MzYsIDB4MzksIDB4M2YsIDB4NTQsIDB4MjcsIDB4MmIsIDB4MzQsIDB4M2MsIDB4NDgsIDB4M2QsIDB4NDksIDB4NGMsCi0gICAgMHgzZSwgMHgzZCwgMHg0ZSwgMHg0MiwgMHgyNSwgMHgzYiwgMHgxMCwgMHg0ZCwgMHgzMCwgMHgzNiwgMHgzZSwgMHgzNiwKLSAgICAweDJlLCAweDMxLCAweDFkLCAweDM3LCAweDNhLCAweDM5LCAweDMzLCAweDNmLCAweDM5LCAweDM4LCAweDJlLCAweDM2LAotICAgIDB4NDQsIDB4M2UsIDB4NDEsIDB4MzcsIDB4M2IsIDB4MzAsIDB4M2IsIDB4NDgsIDB4MzEsIDB4MzksIDB4NDEsIDB4M2UsCi0gICAgMHgzNywgMHgzNywgMHgzNCwgMHgyZiwgMHgzNSwgMHgzYiwgMHgzYSwgMHgzZSwgMHg0NSwgMHgzZSwgMHgzZiwgMHgzNSwKLSAgICAweDM5LCAweDM5LCAweDNiLCAweDQ0LCAweDQzLCAweDNjLCAweDNlLCAweDQ2LCAweDQwLCAweDNhLCAweDM2LCAweDQ1LAotICAgIDB4NDEsIDB4NDAsIDB4MzYsIDB4NDQsIDB4M2EsIDB4MzcsIDB4NDcsIDB4NDcsIDB4M2QsIDB4MzYsIDB4NDMsIDB4NGUsCi0gICAgMHgzYiwgMHgzOCwgMHg0MCwgMHg0OCwgMHg0NCwgMHg0MywgMHg0NSwgMHgzZiwgMHg0MywgMHgzYywgMHgzYiwgMHgzNywKLSAgICAweDQzLCAweDQxLCAweDM5LCAweDJmLCAweDNkLCAweDQ1LCAweDNlLCAweDNlLCAweDQyLCAweDQwLCAweDQxLCAweDJmLAotICAgIDB4NDcsIDB4MzgsIDB4M2EsIDB4NDgsIDB4M2UsIDB4MzUsIDB4MzcsIDB4MmEsIDB4MzQsIDB4MzgsIDB4NDEsIDB4M2IsCi0gICAgMHgzZCwgMHgzNywgMHgzYiwgMHgzNSwgMHgzOCwgMHgzZSwgMHg0MSwgMHgzYywgMHg0MSwgMHg0MywgMHgzZCwgMHg0NiwKLSAgICAweDQ3LCAweDQ3LCAweDNkLCAweDM1LCAweDQ4LCAweDQxLCAweDNkLCAweDNlLCAweDM0LCAweDQ3LCAweDM4LCAweDM4LAotICAgIDB4MzksIDB4M2UsIDB4MzgsIDB4NGQsIDB4NDMsIDB4MzYsIDB4NDIsIDB4NDAsIDB4M2UsIDB4NDEsIDB4M2YsIDB4NGMsCi0gICAgMHgzZSwgMHgzZSwgMHgzNywgMHg0NCwgMHgzZSwgMHgzYiwgMHg0NywgMHgzZSwgMHgzZiwgMHgzYiwgMHgzOSwgMHgzYywKLSAgICAweDNjLCAweDNjLCAweDUzLCAweDNiLCAweDNiLCAweDMyLCAweDNlLCAweDNmLCAweDMyLCAweDNjLCAweDM3LCAweDRiLAotICAgIDB4MzMsIDB4MzAsIDB4MmYsIDB4NDEsIDB4NDcsIDB4NDIsIDB4NDksIDB4NGYsIDB4M2IsIDB4NDIsIDB4NGMsIDB4NDQsCi0gICAgMHgxZiwgMHgzNywgMHgxNiwgMHg0ZSwgMHgzYiwgMHgzZiwgMHgzMCwgMHgzNiwgMHgzNSwgMHgzOCwgMHgyNiwgMHgzNiwKLSAgICAweDMyLCAweDNiLCAweDM4LCAweDNjLCAweDMwLCAweDNlLCAweDM0LCAweDNlLCAweDNkLCAweDM0LCAweDM5LCAweDNjLAotICAgIDB4MzYsIDB4NDcsIDB4MzQsIDB4NDEsIDB4MzEsIDB4MzksIDB4NDQsIDB4M2UsIDB4MzksIDB4NDEsIDB4MzIsIDB4MzYsCi0gICAgMHgzYiwgMHgzZiwgMHgzMiwgMHgzZCwgMHgzNiwgMHgzZSwgMHg0MCwgMHgzZCwgMHg0NSwgMHgzMiwgMHg0NSwgMHg0MiwKLSAgICAweDM4LCAweDQzLCAweDQwLCAweDQyLCAweDM0LCAweDNhLCAweDQzLCAweDM4LCAweDQ3LCAweDNmLCAweDQxLCAweDQ3LAotICAgIDB4MzQsIDB4NDQsIDB4NDEsIDB4MzksIDB4M2MsIDB4NDYsIDB4MzYsIDB4NGYsIDB4NDEsIDB4M2UsIDB4MzgsIDB4MzgsCi0gICAgMHgzYSwgMHgzYiwgMHg0MywgMHg0NCwgMHgzNywgMHgzZiwgMHgzNSwgMHg0MywgMHgzNCwgMHgzZCwgMHg0MCwgMHgzMiwKLSAgICAweDNhLCAweDNiLCAweDNkLCAweDM0LCAweDM1LCAweDQzLCAweDMxLCAweDJjLCAweDNiLCAweDM2LCAweDM4LCAweDQxLAotICAgIDB4M2MsIDB4MzgsIDB4M2QsIDB4MzEsIDB4NDUsIDB4NDYsIDB4NDIsIDB4NDEsIDB4MzMsIDB4M2YsIDB4M2YsIDB4M2EsCi0gICAgMHgzNiwgMHgzZiwgMHgzYywgMHgzYywgMHgzYywgMHgzZSwgMHgzOSwgMHgzZSwgMHg0MCwgMHgzNywgMHg0NywgMHgzZSwKLSAgICAweDM1LCAweDM5LCAweDNkLCAweDNkLCAweDM3LCAweDM2LCAweDNlLCAweDQ1LCAweDM4LCAweDNkLCAweDQ1LCAweDQzLAotICAgIDB4M2EsIDB4MzIsIDB4M2IsIDB4M2EsIDB4MzIsIDB4M2MsIDB4M2QsIDB4NDMsIDB4M2QsIDB4MzMsIDB4M2IsIDB4M2QsCi0gICAgMHg0NiwgMHgzYSwgMHg0NCwgMHg0NSwgMHgzYiwgMHgzZSwgMHgzYywgMHg0MiwgMHgzNywgMHgzNywgMHg1MiwgMHgyYSwKLSAgICAweDNhLCAweDM1LCAweDM1LCAweDNmLCAweDQwLCAweDM4LCAweDQwLCAweDViLCAweDM1LCAweDMyLCAweDJiLCAweDNkLAotICAgIDB4NGEsIDB4M2MsIDB4NDYsIDB4NTYsIDB4NDQsIDB4MzAsIDB4NGQsIDB4MzksIDB4MjAsIDB4MzIsIDB4MGYsIDB4NGYsCi0gICAgMHgzMywgMHgzYywgMHgzNSwgMHgzNSwgMHgzYSwgMHg0NSwgMHgyOSwgMHgzYiwgMHgzMSwgMHgzOCwgMHgzNCwgMHgzOCwKLSAgICAweDQyLCAweDQ1LCAweDM3LCAweDNlLCAweDM3LCAweDJlLCAweDM2LCAweDQzLCAweDNmLCAweDM4LCAweDJmLCAweDQxLAotICAgIDB4M2YsIDB4NDEsIDB4M2MsIDB4MzEsIDB4MzcsIDB4MzYsIDB4MzcsIDB4MzksIDB4NDEsIDB4M2EsIDB4M2EsIDB4NDAsCi0gICAgMHgzZSwgMHg0NywgMHgzZCwgMHgzNywgMHgzYywgMHgzOCwgMHgzNSwgMHgzOSwgMHgzYSwgMHg0MywgMHgzZiwgMHg0MiwKLSAgICAweDQyLCAweDM4LCAweDNlLCAweDQwLCAweDNjLCAweDNhLCAweDQ1LCAweDQ4LCAweDM3LCAweDNhLCAweDNlLCAweDM1LAotICAgIDB4M2EsIDB4M2QsIDB4NDUsIDB4NGEsIDB4M2QsIDB4MzcsIDB4MzgsIDB4M2EsIDB4M2QsIDB4NDYsIDB4NDYsIDB4NDEsCi0gICAgMHgzNywgMHg0MSwgMHg0MCwgMHg0OCwgMHgzNywgMHgzNCwgMHgzYiwgMHgyYywgMHgzOSwgMHgzNCwgMHgzNywgMHgzNSwKLSAgICAweDNhLCAweDQzLCAweDM5LCAweDJlLCAweDM5LCAweDNmLCAweDQwLCAweDNlLCAweDQwLCAweDQwLCAweDNjLCAweDJkLAotICAgIDB4M2UsIDB4M2MsIDB4MzcsIDB4MzksIDB4M2MsIDB4M2IsIDB4M2QsIDB4M2YsIDB4NDEsIDB4NDgsIDB4M2IsIDB4M2QsCi0gICAgMHgzYiwgMHg0MSwgMHg0NSwgMHgzZSwgMHgzYSwgMHgzOCwgMHgzZiwgMHgzYywgMHgzZCwgMHgzZSwgMHg0MCwgMHg0MiwKLSAgICAweDQ2LCAweDM4LCAweDQzLCAweDM0LCAweDM1LCAweDQ3LCAweDNkLCAweDQ2LCAweDNmLCAweDNlLCAweDMyLCAweDNmLAotICAgIDB4M2UsIDB4M2QsIDB4NDcsIDB4NDYsIDB4MzgsIDB4NDEsIDB4NDUsIDB4M2YsIDB4MzQsIDB4M2YsIDB4NDEsIDB4NDMsCi0gICAgMHgzZSwgMHgzZSwgMHg0NCwgMHgzYiwgMHgzYiwgMHgzNiwgMHg1MSwgMHgzMiwgMHgzNywgMHgzYywgMHg0MiwgMHg0MywKLSAgICAweDMzLCAweDM5LCAweDQyLCAweDYxLCAweDJjLCAweDNiLCAweDJlLCAweDM5LCAweDQyLCAweDM5LCAweDQyLCAweDU0LAotICAgIDB4M2MsIDB4M2EsIDB4NDgsIDB4MzUsIDB4MjYsIDB4MzQsIDB4MTUsIDB4NTEsIDB4MzUsIDB4NDAsIDB4MzYsIDB4M2MsCi0gICAgMHgyZCwgMHgzNywgMHgyNSwgMHgzOCwgMHgzMywgMHgzZCwgMHgzZCwgMHgzOSwgMHgzZSwgMHgzYiwgMHgyZSwgMHg0YiwKLSAgICAweDNkLCAweDNiLCAweDQyLCAweDM3LCAweDM3LCAweDQwLCAweDM3LCAweDQwLCAweDM1LCAweDQ1LCAweDM3LCAweDM3LAotICAgIDB4M2YsIDB4NDEsIDB4MzYsIDB4MzksIDB4M2MsIDB4MzIsIDB4M2UsIDB4MzgsIDB4NDEsIDB4NDAsIDB4M2UsIDB4M2YsCi0gICAgMHgzYiwgMHgzYywgMHg0MywgMHgzNSwgMHgzZSwgMHgzZCwgMHg0NCwgMHg0NCwgMHgzYSwgMHgzNiwgMHgzOSwgMHgzZiwKLSAgICAweDNhLCAweDMxLCAweDQyLCAweDRkLCAweDQwLCAweDMzLCAweDQwLCAweDQ1LCAweDQ0LCAweDNkLCAweDQwLCAweDQ5LAotICAgIDB4NDEsIDB4M2YsIDB4NDIsIDB4M2EsIDB4MzQsIDB4NDYsIDB4MzgsIDB4NDYsIDB4NDIsIDB4MzQsIDB4M2EsIDB4NDAsCi0gICAgMHg0MCwgMHg0MSwgMHgzZCwgMHgzMiwgMHgzNSwgMHg0OCwgMHgzNSwgMHgzZSwgMHg0NCwgMHg0MSwgMHg0MCwgMHgyYywKLSAgICAweDQ2LCAweDM4LCAweDM4LCAweDNmLCAweDM2LCAweDQwLCAweDM4LCAweDJhLCAweDQzLCAweDQxLCAweDNlLCAweDM1LAotICAgIDB4NDYsIDB4M2EsIDB4NDUsIDB4NDYsIDB4NDYsIDB4NDIsIDB4M2EsIDB4M2IsIDB4NDAsIDB4MzgsIDB4MzUsIDB4NDMsCi0gICAgMHgzOCwgMHgzZCwgMHgzYiwgMHg0MSwgMHgzNiwgMHg0NCwgMHgzZiwgMHgzZiwgMHgzNCwgMHgzZSwgMHgzYywgMHgzZCwKLSAgICAweDQ5LCAweDM2LCAweDM3LCAweDRiLCAweDM4LCAweDNjLCAweDQzLCAweDM3LCAweDNhLCAweDNmLCAweDMxLCAweDQ1LAotICAgIDB4M2IsIDB4MzksIDB4M2YsIDB4NDAsIDB4MzcsIDB4M2MsIDB4NDIsIDB4M2YsIDB4M2MsIDB4MzMsIDB4NDAsIDB4M2IsCi0gICAgMHgzMiwgMHgzYywgMHg1MiwgMHgzMSwgMHgzZCwgMHg0NCwgMHgzYiwgMHgzMSwgMHg0NiwgMHgzOCwgMHg0MCwgMHg2MCwKLSAgICAweDJiLCAweDNjLCAweDM3LCAweDM0LCAweDQzLCAweDM4LCAweDQ1LCAweDU3LCAweDM3LCAweDM5LCAweDQ5LCAweDMzLAotICAgIDB4MmQsIDB4M2YsIDB4MTgsIDB4NGUsIDB4MzksIDB4MzksIDB4MzIsIDB4M2IsIDB4MzQsIDB4M2IsIDB4MmMsIDB4NDUsCi0gICAgMHgzMywgMHgzNywgMHg0NSwgMHg0MiwgMHgzZCwgMHgzNywgMHgyYSwgMHg0YywgMHgzZCwgMHgzZiwgMHgzYywgMHgzNiwKLSAgICAweDM3LCAweDNjLCAweDM5LCAweDQ3LCAweDNkLCAweDQ0LCAweDNkLCAweDQwLCAweDNkLCAweDQxLCAweDM0LCAweDNlLAotICAgIDB4NDAsIDB4MzQsIDB4M2IsIDB4M2EsIDB4NDEsIDB4MzYsIDB4MzcsIDB4NDAsIDB4M2UsIDB4M2YsIDB4M2EsIDB4MzYsCi0gICAgMHgzZSwgMHgzNSwgMHgzYiwgMHg0OCwgMHg0MSwgMHg0MCwgMHgzYywgMHg0MiwgMHgzNCwgMHg0MSwgMHgzZiwgMHg0NCwKLSAgICAweDM0LCAweDM5LCAweDMzLCAweDM5LCAweDM5LCAweDQ3LCAweDQwLCAweDQ4LCAweDM4LCAweDNhLCAweDQzLCAweDQzLAotICAgIDB4NDgsIDB4M2EsIDB4M2YsIDB4NDYsIDB4MzUsIDB4M2EsIDB4MzMsIDB4MzYsIDB4MzIsIDB4M2MsIDB4NDAsIDB4MzQsCi0gICAgMHg0MCwgMHgzYSwgMHg0MiwgMHgzYSwgMHgzOSwgMHgzOCwgMHg0MSwgMHgzNSwgMHgzYSwgMHgzZiwgMHgzNSwgMHg0MCwKLSAgICAweDNmLCAweDM5LCAweDM5LCAweDM2LCAweDM4LCAweDQwLCAweDNlLCAweDNlLCAweDNhLCAweDMxLCAweDMyLCAweDQ0LAotICAgIDB4NDAsIDB4NDcsIDB4M2EsIDB4M2MsIDB4NDMsIDB4NDMsIDB4NDYsIDB4NDgsIDB4NDAsIDB4MzUsIDB4M2QsIDB4MzcsCi0gICAgMHg0NCwgMHgzNywgMHgzMywgMHg0NCwgMHgzYiwgMHgzZSwgMHgzZiwgMHgzNywgMHgzNiwgMHgzYSwgMHgzOCwgMHg0NywKLSAgICAweDNhLCAweDQ0LCAweDM2LCAweDQyLCAweDNlLCAweDQ0LCAweDM0LCAweDQ2LCAweDMzLCAweDQzLCAweDQ0LCAweDNlLAotICAgIDB4MzAsIDB4NDgsIDB4MzcsIDB4MzgsIDB4MzMsIDB4M2MsIDB4NDYsIDB4NDIsIDB4MzgsIDB4M2QsIDB4NTAsIDB4MzksCi0gICAgMHgzMywgMHgzOCwgMHgzZSwgMHg0MCwgMHgzYiwgMHgyYiwgMHgzYiwgMHg1ZiwgMHgyYiwgMHgzMiwgMHgyZiwgMHgzNywKLSAgICAweDNmLCAweDNhLCAweDQwLCAweDRlLCAweDM0LCAweDM4LCAweDQ3LCAweDM3LCAweDI3LCAweDJiLCAweDFiLCAweDRmLAotICAgIDB4MzYsIDB4MzgsIDB4M2EsIDB4M2EsIDB4M2IsIDB4MzgsIDB4MmUsIDB4M2YsIDB4M2YsIDB4NDIsIDB4NDIsIDB4NDIsCi0gICAgMHgzNiwgMHgzZSwgMHgzYywgMHg1NSwgMHgzOSwgMHg0MCwgMHg0NCwgMHg0MywgMHgzZSwgMHgzMywgMHgzYywgMHg0MywKLSAgICAweDM4LCAweDQ0LCAweDNiLCAweDQ2LCAweDNmLCAweDQ1LCAweDM0LCAweDM4LCAweDNjLCAweDQxLCAweDQyLCAweDNkLAotICAgIDB4NDIsIDB4MzYsIDB4NDMsIDB4M2YsIDB4M2MsIDB4MzksIDB4M2UsIDB4MzksIDB4MzksIDB4NDIsIDB4MzMsIDB4NDcsCi0gICAgMHgzNiwgMHgzZCwgMHgzZiwgMHgzYiwgMHg0MCwgMHgzOSwgMHgzYiwgMHg0OSwgMHgzNiwgMHg0MCwgMHgzZCwgMHg0MSwKLSAgICAweDQwLCAweDM0LCAweDNiLCAweDRlLCAweDNiLCAweDM2LCAweDNiLCAweDQ1LCAweDQwLCAweDMyLCAweDNiLCAweDQ5LAotICAgIDB4MzcsIDB4MzgsIDB4M2EsIDB4NDcsIDB4MzcsIDB4NDAsIDB4M2UsIDB4MzgsIDB4NDAsIDB4M2YsIDB4M2MsIDB4M2EsCi0gICAgMHg0NywgMHg0MSwgMHg0MiwgMHgzMCwgMHg0MCwgMHgzYywgMHg0MiwgMHgzZiwgMHgzMSwgMHg0NCwgMHgzOSwgMHgzOCwKLSAgICAweDNiLCAweDM4LCAweDQyLCAweDQzLCAweDQxLCAweDM1LCAweDNhLCAweDM5LCAweDNlLCAweDM4LCAweDM5LCAweDNlLAotICAgIDB4M2MsIDB4NDIsIDB4M2QsIDB4NDksIDB4NDcsIDB4M2MsIDB4M2YsIDB4MzUsIDB4NDEsIDB4M2EsIDB4MzYsIDB4NDMsCi0gICAgMHg0MywgMHgzYiwgMHgzOSwgMHgzYiwgMHgzNiwgMHg0MywgMHg0MywgMHg0ZSwgMHgzZSwgMHgzNSwgMHgzNywgMHgzYiwKLSAgICAweDNmLCAweDM3LCAweDQxLCAweDQ4LCAweDMyLCAweDQ0LCAweDQzLCAweDMyLCAweDM4LCAweDM5LCAweDQ1LCAweDM5LAotICAgIDB4M2UsIDB4M2QsIDB4MzUsIDB4MzksIDB4MzUsIDB4MzksIDB4NTAsIDB4MzcsIDB4MzksIDB4NDAsIDB4NDMsIDB4NDcsCi0gICAgMHgzMiwgMHgyYSwgMHg0MCwgMHg2MiwgMHgyNCwgMHgzMCwgMHgzNiwgMHgzZSwgMHg0MSwgMHgzMiwgMHg0NywgMHg1OCwKLSAgICAweDM5LCAweDM2LCAweDQ0LCAweDM0LCAweDI2LCAweDM0LCAweDFlLCAweDUwLCAweDNjLCAweDNiLCAweDNmLCAweDQyLAotICAgIDB4MzUsIDB4M2QsIDB4MmEsIDB4NGUsIDB4NDAsIDB4MzgsIDB4MzYsIDB4MzEsIDB4M2EsIDB4MzAsIDB4MzcsIDB4NGIsCi0gICAgMHgzYywgMHgzYiwgMHgzYiwgMHg0MSwgMHgzYiwgMHgzYywgMHgyZSwgMHg0NSwgMHg0NCwgMHgzZiwgMHgzYiwgMHgzNSwKLSAgICAweDNlLCAweDMzLCAweDM3LCAweDNkLCAweDQwLCAweDM5LCAweDM5LCAweDM3LCAweDQwLCAweDNlLCAweDNhLCAweDNlLAotICAgIDB4M2MsIDB4M2MsIDB4NDUsIDB4NDAsIDB4M2MsIDB4M2YsIDB4M2EsIDB4NTEsIDB4NDcsIDB4M2EsIDB4MzQsIDB4MzksCi0gICAgMHgzYiwgMHgzNCwgMHg0NCwgMHg0YywgMHgzNiwgMHgzZCwgMHgzYSwgMHgzNSwgMHgzNCwgMHgzNiwgMHgzOCwgMHg0YiwKLSAgICAweDNmLCAweDQwLCAweDNmLCAweDNlLCAweDQwLCAweDQxLCAweDQ3LCAweDQzLCAweDMyLCAweDM4LCAweDQ2LCAweDQ0LAotICAgIDB4NDYsIDB4NDMsIDB4NDMsIDB4MzcsIDB4MzksIDB4NDksIDB4MzcsIDB4MzYsIDB4M2UsIDB4M2QsIDB4MzcsIDB4M2MsCi0gICAgMHgzOSwgMHgzNywgMHgzNCwgMHg0MywgMHg0NSwgMHgzMiwgMHgzYSwgMHgzYSwgMHgzOCwgMHg0MywgMHgzYiwgMHg0MCwKLSAgICAweDNiLCAweDNmLCAweDNkLCAweDQxLCAweDQwLCAweDNkLCAweDNhLCAweDNiLCAweDQ4LCAweDM3LCAweDNkLCAweDQxLAotICAgIDB4NDAsIDB4M2UsIDB4MzgsIDB4NDEsIDB4M2QsIDB4M2EsIDB4MzgsIDB4NDksIDB4NDAsIDB4M2MsIDB4NDIsIDB4NDEsCi0gICAgMHgzYSwgMHgzOCwgMHgzOCwgMHg0YywgMHgzZSwgMHg0MSwgMHg0MCwgMHgzYiwgMHgzZCwgMHgzZSwgMHgzYywgMHg0NiwKLSAgICAweDNlLCAweDQyLCAweDQxLCAweDM4LCAweDQyLCAweDQyLCAweDQxLCAweDNlLCAweDNlLCAweDM3LCAweDNjLCAweDQzLAotICAgIDB4NDMsIDB4M2IsIDB4NTQsIDB4MmIsIDB4NDUsIDB4M2IsIDB4NDMsIDB4NDEsIDB4NDEsIDB4MjYsIDB4M2YsIDB4NjAsCi0gICAgMHgyNSwgMHgyYiwgMHgyZSwgMHgzYSwgMHg0MCwgMHgzMSwgMHg0MCwgMHg0OSwgMHg0MCwgMHgzMSwgMHg0NiwgMHgzYywKLSAgICAweDFlLCAweDJhLCAweDFhLCAweDQ3LCAweDMzLCAweDM3LCAweDM3LCAweDM0LCAweDMxLCAweDM2LCAweDI1LCAweDQxLAotICAgIDB4MmUsIDB4MzYsIDB4MzUsIDB4MzMsIDB4MzMsIDB4MzQsIDB4MzEsIDB4NDUsIDB4M2EsIDB4M2YsIDB4M2QsIDB4NDAsCi0gICAgMHgzYywgMHg0MSwgMHgzMCwgMHgzYywgMHgzZiwgMHg0NiwgMHgzNywgMHgzYywgMHgzYSwgMHgzYywgMHgzNiwgMHgzYSwKLSAgICAweDQ3LCAweDNkLCAweDMxLCAweDNmLCAweDQwLCAweDNlLCAweDM2LCAweDQ0LCAweDQxLCAweDNkLCAweDM2LCAweDNmLAotICAgIDB4MzcsIDB4M2YsIDB4MzQsIDB4NGIsIDB4MzEsIDB4NDcsIDB4NDMsIDB4M2UsIDB4M2UsIDB4M2EsIDB4M2IsIDB4NGIsCi0gICAgMHgzNywgMHgzMiwgMHgzOCwgMHgzZCwgMHgzNywgMHg0NywgMHg0NiwgMHg0ZCwgMHgzNiwgMHgzYywgMHgzZiwgMHgzYSwKLSAgICAweDQxLCAweDMxLCAweDQ3LCAweDQzLCAweDNkLCAweDNkLCAweDNlLCAweDM1LCAweDNkLCAweDQ2LCAweDQ5LCAweDJhLAotICAgIDB4MzcsIDB4M2MsIDB4MzksIDB4M2QsIDB4NDcsIDB4M2MsIDB4MzQsIDB4MmMsIDB4M2UsIDB4MzgsIDB4NDcsIDB4MzIsCi0gICAgMHgzNiwgMHgzNiwgMHg0MSwgMHgzOCwgMHgzNSwgMHg0NCwgMHg0OCwgMHgzYiwgMHgzOSwgMHgzZSwgMHgzOCwgMHgzZSwKLSAgICAweDQwLCAweDM2LCAweDM3LCAweDQ2LCAweDM5LCAweDNiLCAweDM0LCAweDQ1LCAweDQwLCAweDNiLCAweDQ4LCAweDM2LAotICAgIDB4MzQsIDB4NDQsIDB4MzcsIDB4NDYsIDB4M2YsIDB4NDIsIDB4MzMsIDB4MzYsIDB4NDMsIDB4M2MsIDB4NDEsIDB4NDYsCi0gICAgMHgzMSwgMHg0MiwgMHg0MywgMHg0NCwgMHg0NCwgMHgzZSwgMHg0MiwgMHgzYiwgMHgzYiwgMHgzYSwgMHgzYywgMHgzNywKLSAgICAweDQyLCAweDQxLCAweDQ2LCAweDM4LCAweDQxLCAweDNiLCAweDQwLCAweDQ0LCAweDM3LCAweDNjLCAweDRjLCAweDJlLAotICAgIDB4M2EsIDB4M2UsIDB4M2IsIDB4MzYsIDB4MzMsIDB4MjcsIDB4MzcsIDB4NWQsIDB4MjcsIDB4MzQsIDB4MzIsIDB4NDEsCi0gICAgMHg0MSwgMHgzZiwgMHg0MCwgMHg1ZCwgMHg0MCwgMHgzZCwgMHg0OCwgMHgzOSwgMHgyZSwgMHgzMCwgMHgxZiwgMHgzZiwKLSAgICAweDM4LCAweDNmLCAweDQwLCAweDMzLCAweDQwLCAweDM4LCAweDMxLCAweDNmLCAweDQyLCAweDNlLCAweDNiLCAweDNhLAotICAgIDB4NDIsIDB4MzYsIDB4M2EsIDB4NDIsIDB4M2MsIDB4M2IsIDB4M2QsIDB4NDEsIDB4M2QsIDB4NDAsIDB4NDAsIDB4M2UsCi0gICAgMHgzNiwgMHg0MSwgMHg0NywgMHgzZCwgMHgzMywgMHgzMiwgMHgzMywgMHg0NCwgMHgzZSwgMHgzYSwgMHgzZSwgMHgzZCwKLSAgICAweDQ1LCAweDNmLCAweDM4LCAweDNmLCAweDQwLCAweDNhLCAweDNjLCAweDQ2LCAweDMyLCAweDQyLCAweDNjLCAweDUxLAotICAgIDB4MzMsIDB4MzgsIDB4M2EsIDB4MzgsIDB4NDEsIDB4MzQsIDB4NDUsIDB4NGUsIDB4MzUsIDB4M2MsIDB4NDIsIDB4M2UsCi0gICAgMHgzZiwgMHg0NSwgMHg0NCwgMHg0ZSwgMHgzOSwgMHg0NywgMHgzYSwgMHgzMywgMHgzZSwgMHgzYiwgMHg0NSwgMHg0MiwKLSAgICAweDM3LCAweDNhLCAweDNlLCAweDMzLCAweDQxLCAweDQ4LCAweDMyLCAweDJhLCAweDNiLCAweDM3LCAweDNmLCAweDNkLAotICAgIDB4M2EsIDB4NDIsIDB4NDEsIDB4MmYsIDB4MzQsIDB4M2UsIDB4NDksIDB4M2IsIDB4MzgsIDB4M2UsIDB4M2QsIDB4M2EsCi0gICAgMHgzNywgMHgzYywgMHg0NCwgMHg0MSwgMHgzOSwgMHg0MiwgMHgzZiwgMHgzOSwgMHg0MCwgMHgzNSwgMHgzZCwgMHg0MSwKLSAgICAweDNiLCAweDQ1LCAweDQ0LCAweDQ4LCAweDNkLCAweDQyLCAweDM2LCAweDMzLCAweDNlLCAweDQ0LCAweDNmLCAweDQxLAotICAgIDB4NDIsIDB4NDAsIDB4NDksIDB4MzQsIDB4NDgsIDB4NDEsIDB4M2YsIDB4NDAsIDB4M2MsIDB4NDUsIDB4NDcsIDB4MzQsCi0gICAgMHg0MSwgMHgzNywgMHg0NywgMHgzZSwgMHg0MSwgMHg0MSwgMHgzOSwgMHg0MiwgMHgzZiwgMHgzYSwgMHg0NiwgMHgzMywKLSAgICAweDM5LCAweDQxLCAweDM4LCAweDM4LCAweDNlLCAweDQyLCAweDQxLCAweDM4LCAweDM1LCAweDMyLCAweDMzLCAweDM4LAotICAgIDB4M2EsIDB4M2YsIDB4NDUsIDB4NjYsIDB4MzMsIDB4NDcsIDB4MzgsIDB4M2MsIDB4NDEsIDB4MmYsIDB4NDgsIDB4NTUsCi0gICAgMHgzMywgMHgzZSwgMHg0OSwgMHgzYiwgMHgzYywgMHgzMCwgMHgyNCwgMHg0NSwgMHgzYywgMHg0NCwgMHg0MywgMHgzMiwKLSAgICAweDNkLCAweDNmLCAweDM1LCAweDNiLCAweDNlLCAweDM2LCAweDM4LCAweDNhLCAweDM2LCAweDM3LCAweDNiLCAweDQxLAotICAgIDB4MzgsIDB4NDIsIDB4M2UsIDB4NDMsIDB4MzksIDB4M2YsIDB4M2MsIDB4NDAsIDB4MzcsIDB4NDMsIDB4M2UsIDB4M2IsCi0gICAgMHgzZCwgMHgzNSwgMHgzNSwgMHgzZCwgMHg0MywgMHgzZiwgMHgzYSwgMHgzNSwgMHgzNywgMHgzYywgMHgzMSwgMHg0NywKLSAgICAweDQ0LCAweDQ1LCAweDQwLCAweDMyLCAweDQ0LCAweDM2LCAweDM4LCAweDUxLCAweDNjLCAweDQxLCAweDQ1LCAweDM3LAotICAgIDB4MzksIDB4NDQsIDB4M2UsIDB4NGYsIDB4M2MsIDB4M2EsIDB4MzgsIDB4NDAsIDB4M2YsIDB4MzQsIDB4MzksIDB4NGUsCi0gICAgMHgzZCwgMHgzOSwgMHg0NSwgMHgzZiwgMHgzZSwgMHgzYywgMHgzYiwgMHg0MiwgMHgzYiwgMHgzYiwgMHgzNCwgMHgzZCwKLSAgICAweDQxLCAweDQ0LCAweDM5LCAweDJlLCAweDM3LCAweDQ0LCAweDQ1LCAweDM3LCAweDNkLCAweDQxLCAweDNmLCAweDMzLAotICAgIDB4M2YsIDB4M2UsIDB4M2UsIDB4NDAsIDB4NDQsIDB4M2YsIDB4MzcsIDB4MzIsIDB4MzUsIDB4M2UsIDB4NDMsIDB4NDEsCi0gICAgMHgzOSwgMHgzNywgMHgzNSwgMHgzZiwgMHg0OCwgMHgzZCwgMHg0MywgMHg0OSwgMHgzOCwgMHgzNSwgMHgzZiwgMHg0OCwKLSAgICAweDNiLCAweDNhLCAweDM0LCAweDNmLCAweDNjLCAweDQ0LCAweDNhLCAweDQwLCAweDM2LCAweDM1LCAweDQ0LCAweDM2LAotICAgIDB4NDQsIDB4M2IsIDB4M2QsIDB4MzgsIDB4M2MsIDB4NDQsIDB4NDcsIDB4M2EsIDB4M2IsIDB4NDUsIDB4NDEsIDB4M2EsCi0gICAgMHgzOSwgMHgzNSwgMHg0NCwgMHgzYSwgMHg0OSwgMHgzNiwgMHg0OCwgMHgzMSwgMHg0MiwgMHg0MywgMHg0MiwgMHgzNCwKLSAgICAweDQxLCAweDQwLCAweDRkLCAweDM2LCAweDNlLCAweDM1LCAweDM5LCAweDNiLCAweDNmLCAweDQxLCAweDM4LCAweDM5LAotICAgIDB4M2MsIDB4NDQsIDB4M2YsIDB4MzksIDB4M2EsIDB4MzYsIDB4M2QsIDB4MzYsIDB4M2EsIDB4M2EsIDB4MzQsIDB4M2IsCi0gICAgMHgzOCwgMHgyZiwgMHg0MCwgMHgzNCwgMHgzMiwgMHg0ZCwgMHg0MywgMHg0NSwgMHg0ZSwgMHgzZiwgMHg0OCwgMHgzNSwKLSAgICAweDNiLCAweDRkLCAweDRmLCAweDM5LCAweDQyLCAweDM2LCAweDQ2LCAweDM2LCAweDRhLCAweDNjLCAweDM3LCAweDQxLAotICAgIDB4NDAsIDB4NDMsIDB4NTAsIDB4MzYsIDB4M2UsIDB4MzksIDB4NDQsIDB4NDAsIDB4MzYsIDB4NDcsIDB4M2YsIDB4MzYsCi0gICAgMHg0NSwgMHg0MCwgMHg0NSwgMHg0MSwgMHgzYiwgMHgzNywgMHg0MSwgMHgzOSwgMHgzYiwgMHg0OCwgMHgzNywgMHgzNCwKLSAgICAweDQxLCAweDQ1LCAweDQ5LCAweDNmLCAweDM5LCAweDQ5LCAweDNmLCAweDNhLCAweDQyLCAweDM0LCAweDM4LCAweDM3LAotICAgIDB4NDQsIDB4MzQsIDB4M2MsIDB4M2QsIDB4NDAsIDB4NDcsIDB4M2EsIDB4MzYsIDB4M2YsIDB4M2MsIDB4NDEsIDB4M2UsCi0gICAgMHg0NywgMHg0NiwgMHg0NiwgMHg0MywgMHgzZiwgMHgzOCwgMHgzYiwgMHg0MCwgMHgzZiwgMHg0OCwgMHgzYiwgMHg0YywKLSAgICAweDNkLCAweDRiLCAweDM0LCAweDNiLCAweDQ0LCAweDQzLCAweDNjLCAweDQ5LCAweDM4LCAweDQyLCAweDQxLCAweDM2LAotICAgIDB4MzMsIDB4MzYsIDB4NDAsIDB4NDYsIDB4NDAsIDB4M2EsIDB4NDIsIDB4M2MsIDB4M2QsIDB4MzUsIDB4M2MsIDB4NTIsCi0gICAgMHgzZSwgMHg0MCwgMHg0MywgMHg0MywgMHg0MSwgMHgzYiwgMHgzZSwgMHg0NCwgMHgzZiwgMHg0MCwgMHg0MCwgMHg0MywKLSAgICAweDNkLCAweDNmLCAweDM2LCAweDQyLCAweDNmLCAweDNjLCAweDM0LCAweDNkLCAweDMzLCAweDQxLCAweDNjLCAweDM5LAotICAgIDB4MzQsIDB4NDMsIDB4M2YsIDB4MzQsIDB4M2MsIDB4M2EsIDB4M2EsIDB4MzcsIDB4NDIsIDB4NDEsIDB4NDAsIDB4M2UsCi0gICAgMHgzZCwgMHgzYywgMHg0MSwgMHgzYywgMHgzOCwgMHgzMywgMHg0OSwgMHg0NiwgMHg0MCwgMHg0MCwgMHgzYSwgMHg0NiwKLSAgICAweDM4LCAweDNjLCAweDM3LCAweDM0LCAweDNlLCAweDNkLCAweDMyLCAweDM4LCAweDNjLCAweDRjLCAweDNhLCAweDM0LAotICAgIDB4MzUsIDB4MzIsIDB4MzksIDB4NDAsIDB4M2EsIDB4NTgsIDB4NDAsIDB4NDYsIDB4NDIsIDB4MzMsIDB4NDUsIDB4MzksCi0gICAgMHgzNCwgMHg0ZiwgMHg1MywgMHg0NSwgMHg0MywgMHgzZSwgMHg0MSwgMHgzNiwgMHgzZSwgMHgzZiwgMHg0MCwgMHg0NywKLSAgICAweDRlLCAweDNkLCAweDUzLCAweDJiLCAweDQxLCAweDM2LCAweDNlLCAweDM4LCAweDQ3LCAweDQxLCAweDNmLCAweDM0LAotICAgIDB4NDcsIDB4NDAsIDB4MzgsIDB4MzksIDB4M2QsIDB4NDIsIDB4M2YsIDB4M2MsIDB4NDgsIDB4M2EsIDB4MzUsIDB4M2MsCi0gICAgMHg0NSwgMHg0OSwgMHgzYywgMHgzMywgMHgzMywgMHgzZiwgMHgzYywgMHg0NiwgMHg0MywgMHgzZiwgMHg0NSwgMHgzMSwKLSAgICAweDM1LCAweDQzLCAweDQ2LCAweDNhLCAweDQ1LCAweDNjLCAweDM3LCAweDNhLCAweDM3LCAweDM2LCAweDM1LCAweDNmLAotICAgIDB4MzgsIDB4NDksIDB4MzQsIDB4M2YsIDB4M2MsIDB4NDIsIDB4NDksIDB4M2UsIDB4M2UsIDB4M2MsIDB4MzksIDB4NDksCi0gICAgMHgzZSwgMHgzYywgMHgzYiwgMHg0MywgMHg0NCwgMHg0NSwgMHgzOSwgMHg0YiwgMHg0NywgMHg0NywgMHgzZSwgMHgzMywKLSAgICAweDNjLCAweDMxLCAweDM0LCAweDRmLCAweDQ1LCAweDQzLCAweDQwLCAweDNkLCAweDQyLCAweDNiLCAweDQzLCAweDUwLAotICAgIDB4M2MsIDB4M2IsIDB4MzcsIDB4NDIsIDB4NDcsIDB4NDIsIDB4M2UsIDB4NGEsIDB4M2YsIDB4M2EsIDB4NDgsIDB4M2QsCi0gICAgMHg0OCwgMHg0NSwgMHgzZSwgMHg0MCwgMHgzYSwgMHgzYywgMHgzZCwgMHgzOSwgMHg0MSwgMHg0MiwgMHgzYywgMHg0MiwKLSAgICAweDQzLCAweDNjLCAweDNiLCAweDNkLCAweDQ3LCAweDQ5LCAweDM4LCAweDNjLCAweDQ2LCAweDNhLCAweDNjLCAweDNmLAotICAgIDB4M2EsIDB4NDYsIDB4M2EsIDB4M2IsIDB4M2QsIDB4M2EsIDB4NDksIDB4NDYsIDB4MzgsIDB4NDAsIDB4M2UsIDB4MzgsCi0gICAgMHgzNywgMHgzMiwgMHg0MCwgMHgzYywgMHg0MiwgMHgzZCwgMHgzYiwgMHg0MCwgMHgzYSwgMHgzOCwgMHg0OSwgMHgzMywKLSAgICAweDQwLCAweDM4LCAweDJiLCAweDNhLCAweDNjLCAweDRmLCAweDRkLCAweDNlLCAweDM1LCAweDNkLCAweDNiLCAweDQwLAotICAgIDB4M2EsIDB4NTQsIDB4M2UsIDB4M2UsIDB4NDMsIDB4MzAsIDB4NDcsIDB4M2QsIDB4M2IsIDB4NTMsIDB4NTIsIDB4NGEsCi0gICAgMHg0MywgMHg0MSwgMHg0OSwgMHgzNywgMHgzYiwgMHgzNSwgMHg0NCwgMHgzYywgMHg0NSwgMHg0MCwgMHg0ZiwgMHgzNiwKLSAgICAweDRiLCAweDQyLCAweDQxLCAweDNhLCAweDQxLCAweDQ0LCAweDQ3LCAweDMyLCAweDQzLCAweDM1LCAweDNmLCAweDM3LAotICAgIDB4NDMsIDB4NDEsIDB4NDMsIDB4MzYsIDB4M2YsIDB4M2IsIDB4M2QsIDB4MzgsIDB4M2QsIDB4NDAsIDB4NDIsIDB4MzYsCi0gICAgMHg0NCwgMHgzYSwgMHgzOSwgMHg0NywgMHgzNywgMHgzNCwgMHg0MiwgMHgzYSwgMHgzNywgMHgzOCwgMHgzNywgMHgzZiwKLSAgICAweDM2LCAweDNiLCAweDQ1LCAweDNmLCAweDNmLCAweDNkLCAweDM5LCAweDNkLCAweDM5LCAweDQxLCAweDM3LCAweDNmLAotICAgIDB4M2YsIDB4M2QsIDB4M2YsIDB4NDEsIDB4NDMsIDB4NDEsIDB4NDUsIDB4NDMsIDB4NDEsIDB4M2MsIDB4M2UsIDB4NDAsCi0gICAgMHg0MCwgMHgzOSwgMHg0MSwgMHg0ZiwgMHg0NywgMHg0MiwgMHg0NiwgMHg0OCwgMHgzYiwgMHgzYiwgMHgzYywgMHg0NiwKLSAgICAweDQ3LCAweDNlLCAweDQ2LCAweDM3LCAweDM4LCAweDNkLCAweDM4LCAweDUyLCAweDM2LCAweDQ2LCAweDNjLCAweDNhLAotICAgIDB4M2IsIDB4MzcsIDB4NDgsIDB4NGIsIDB4M2YsIDB4NDIsIDB4M2MsIDB4MzYsIDB4NDAsIDB4MzcsIDB4MzMsIDB4NGMsCi0gICAgMHgzOSwgMHgzNCwgMHg0MSwgMHgzNCwgMHgzZiwgMHgzYiwgMHgzNSwgMHg0YiwgMHgzYiwgMHg0NSwgMHg0MywgMHgzMSwKLSAgICAweDNlLCAweDM5LCAweDMwLCAweDNkLCAweDMyLCAweDQzLCAweDQ0LCAweDNjLCAweDNlLCAweDM4LCAweDQzLCAweDQxLAotICAgIDB4M2UsIDB4MzcsIDB4NDEsIDB4MzksIDB4MzksIDB4NDQsIDB4NDMsIDB4MzgsIDB4M2YsIDB4MzcsIDB4NDgsIDB4M2YsCi0gICAgMHgzYiwgMHg0NCwgMHgzNywgMHgzZiwgMHgzYSwgMHgzZiwgMHgzYiwgMHgzMywgMHg0MiwgMHgzZSwgMHgyZiwgMHg0MiwKLSAgICAweDQ0LCAweDRmLCAweDUyLCAweDNjLCAweDM0LCAweDMzLCAweDM5LCAweDQ2LCAweDMxLCAweDU1LCAweDQzLCAweDRlLAotICAgIDB4NDksIDB4MzgsIDB4NGQsIDB4NDgsIDB4MzQsIDB4NGQsIDB4NWMsIDB4NGQsIDB4NDksIDB4MzcsIDB4NGYsIDB4NDAsCi0gICAgMHgzYywgMHgzZCwgMHg0MSwgMHg0MiwgMHgzZiwgMHg1MSwgMHg0YiwgMHgyZiwgMHg0NiwgMHgzNSwgMHgzOSwgMHgzYywKLSAgICAweDQ5LCAweDNkLCAweDRlLCAweDMyLCAweDQzLCAweDQ3LCAweDMxLCAweDNlLCAweDQyLCAweDRhLCAweDRjLCAweDM5LAotICAgIDB4NDMsIDB4NDYsIDB4M2UsIDB4M2YsIDB4NDQsIDB4M2MsIDB4NDIsIDB4MzAsIDB4M2UsIDB4MzQsIDB4M2IsIDB4M2IsCi0gICAgMHgzYSwgMHgzYywgMHg0MiwgMHgzZCwgMHgzZCwgMHg0OCwgMHg0OCwgMHgzNiwgMHgzYSwgMHg0NSwgMHgzOCwgMHg0MCwKLSAgICAweDNjLCAweDQxLCAweDNmLCAweDQ5LCAweDQyLCAweDQxLCAweDM4LCAweDNkLCAweDNkLCAweDQ0LCAweDNiLCAweDNkLAotICAgIDB4MzUsIDB4NDgsIDB4NDMsIDB4M2IsIDB4MzIsIDB4NDEsIDB4M2UsIDB4M2EsIDB4NDYsIDB4NDEsIDB4NDAsIDB4NTQsCi0gICAgMHgzOCwgMHgzZiwgMHgzYywgMHgzNiwgMHgzYiwgMHgzNiwgMHg0MywgMHg1MCwgMHgzOCwgMHgzYywgMHg0NCwgMHgzYiwKLSAgICAweDQzLCAweDQ3LCAweDMyLCAweDUwLCAweDNkLCAweDQ2LCAweDNkLCAweDNiLCAweDM5LCAweDM3LCAweDNiLCAweDRhLAotICAgIDB4NDcsIDB4NDMsIDB4NDYsIDB4M2QsIDB4M2QsIDB4NDEsIDB4NDMsIDB4NDUsIDB4M2IsIDB4M2MsIDB4MzksIDB4NDcsCi0gICAgMHg0MywgMHg0MiwgMHgzOSwgMHg0YywgMHgzNCwgMHg0MSwgMHg0NSwgMHgzYiwgMHgzOCwgMHgzZSwgMHgzNywgMHgzZiwKLSAgICAweDQ1LCAweDQzLCAweDM5LCAweDQyLCAweDNjLCAweDNkLCAweDNkLCAweDNjLCAweDQ4LCAweDM5LCAweDNiLCAweDNhLAotICAgIDB4NDYsIDB4NDUsIDB4M2QsIDB4M2EsIDB4M2YsIDB4M2EsIDB4NDUsIDB4MzYsIDB4M2QsIDB4NDMsIDB4MzYsIDB4NDMsCi0gICAgMHg0MiwgMHgzZCwgMHg0MSwgMHgzZiwgMHgzYSwgMHgzZiwgMHgzMSwgMHgzNywgMHg0OCwgMHg0ZiwgMHg0ZSwgMHgzNiwKLSAgICAweDMwLCAweDNhLCAweDNlLCAweDNlLCAweDM4LCAweDU3LCAweDQwLCAweDQ3LCAweDQ3LCAweDM4LCAweDRmLCAweDQ2LAotICAgIDB4M2QsIDB4NGEsIDB4NTAsIDB4NGMsIDB4NDIsIDB4M2IsIDB4NGQsIDB4M2QsIDB4M2QsIDB4MzMsIDB4NDAsIDB4NDEsCi0gICAgMHg0OCwgMHg0YiwgMHg0NiwgMHgzOSwgMHg0ZCwgMHgzMCwgMHg0NSwgMHgzOCwgMHg0OCwgMHgzYywgMHg0OCwgMHgzYiwKLSAgICAweDRkLCAweDQwLCAweDNiLCAweDQwLCAweDQ2LCAweDQxLCAweDUxLCAweDM0LCAweDQwLCAweDQzLCAweDNmLCAweDQyLAotICAgIDB4NDUsIDB4NDIsIDB4M2UsIDB4MzUsIDB4M2QsIDB4MzgsIDB4MzcsIDB4M2EsIDB4NDIsIDB4NDAsIDB4NDMsIDB4M2MsCi0gICAgMHgzYywgMHgzZCwgMHg0MywgMHg0MCwgMHg0NSwgMHgzYSwgMHgzZSwgMHgzYSwgMHgzZSwgMHg0MCwgMHg0MywgMHgzNSwKLSAgICAweDM3LCAweDNmLCAweDNmLCAweDNlLCAweDM5LCAweDNmLCAweDQ3LCAweDM4LCAweDNlLCAweDQ0LCAweDNiLCAweDNjLAotICAgIDB4M2IsIDB4MzIsIDB4NDAsIDB4M2UsIDB4NDIsIDB4NDUsIDB4M2EsIDB4NTIsIDB4M2EsIDB4M2UsIDB4NDUsIDB4NDAsCi0gICAgMHg0MSwgMHg0OCwgMHgzZiwgMHg0ZSwgMHgzZSwgMHg0MiwgMHgzZCwgMHgzOSwgMHgzYSwgMHgzMywgMHgzZiwgMHg0YiwKLSAgICAweDNlLCAweDM4LCAweDM2LCAweDNlLCAweDMxLCAweDQxLCAweDNhLCAweDQwLCAweDNiLCAweDM3LCAweDNmLCAweDNlLAotICAgIDB4M2UsIDB4M2YsIDB4MzUsIDB4NDQsIDB4M2QsIDB4NDIsIDB4M2QsIDB4NDQsIDB4NDIsIDB4M2YsIDB4M2UsIDB4NDQsCi0gICAgMHgzZSwgMHg0NSwgMHgzNywgMHgzYSwgMHgzYiwgMHg0MiwgMHgzZiwgMHg0MSwgMHgzYiwgMHgzZiwgMHg0MSwgMHg0MSwKLSAgICAweDNlLCAweDM0LCAweDQ3LCAweDM5LCAweDQ2LCAweDQ2LCAweDM3LCAweDM5LCAweDNmLCAweDQ1LCAweDM5LCAweDM5LAotICAgIDB4M2EsIDB4NDAsIDB4MzgsIDB4M2EsIDB4MzEsIDB4MzQsIDB4M2EsIDB4NDEsIDB4MzgsIDB4NDEsIDB4M2EsIDB4NDEsCi0gICAgMHg0NCwgMHgzNywgMHgyZCwgMHg0MSwgMHg0MywgMHg0ZCwgMHg0YiwgMHgzYiwgMHgyYywgMHgzMCwgMHg0MiwgMHgzYiwKLSAgICAweDMxLCAweDU2LCAweDQzLCAweDQ3LCAweDQ3LCAweDM4LCAweDUwLCAweDQ0LCAweDQwLCAweDUyLCAweDVhLCAweDUwLAotICAgIDB4NDQsIDB4M2YsIDB4NGIsIDB4MzUsIDB4M2EsIDB4MzYsIDB4NDEsIDB4NDQsIDB4NDcsIDB4NGUsIDB4NTIsIDB4MzYsCi0gICAgMHg0NSwgMHgzOSwgMHgzOCwgMHgzYywgMHg0MiwgMHg0NCwgMHg0MCwgMHgzYiwgMHg0YiwgMHgzOCwgMHgzNSwgMHgzNSwKLSAgICAweDNmLCAweDQwLCAweDRmLCAweDM5LCAweDNkLCAweDM3LCAweDM0LCAweDNlLCAweDQxLCAweDRjLCAweDQwLCAweDM3LAotICAgIDB4M2QsIDB4M2IsIDB4MzcsIDB4MzcsIDB4NDAsIDB4NDIsIDB4MzUsIDB4MzksIDB4NDEsIDB4NDIsIDB4M2QsIDB4MzQsCi0gICAgMHgzYywgMHgzNywgMHgzYSwgMHgzZCwgMHg0NiwgMHg0NiwgMHg0NiwgMHgzZiwgMHg0NCwgMHgzZCwgMHgzYywgMHg0MCwKLSAgICAweDNjLCAweDNhLCAweDNkLCAweDNiLCAweDNiLCAweDQxLCAweDQ3LCAweDNhLCAweDQzLCAweDQzLCAweDQzLCAweDNiLAotICAgIDB4M2UsIDB4M2UsIDB4NDIsIDB4NDYsIDB4MzYsIDB4MzcsIDB4NDUsIDB4MzUsIDB4M2MsIDB4M2IsIDB4MzEsIDB4NGIsCi0gICAgMHgzYywgMHgzZSwgMHgzYSwgMHgzYSwgMHg0MiwgMHg0MiwgMHgzNCwgMHg0NywgMHgzNywgMHgzNCwgMHg0MSwgMHgzZCwKLSAgICAweDNlLCAweDM5LCAweDQzLCAweDQ3LCAweDMxLCAweDNiLCAweDQwLCAweDNiLCAweDQyLCAweDNkLCAweDQ0LCAweDQ0LAotICAgIDB4MzcsIDB4MzksIDB4NDQsIDB4M2IsIDB4NDAsIDB4M2EsIDB4M2QsIDB4NDQsIDB4M2MsIDB4NDAsIDB4NDIsIDB4M2IsCi0gICAgMHg0MCwgMHgzZSwgMHgzMiwgMHgzZCwgMHgzYywgMHgzZSwgMHg0NCwgMHgzZSwgMHg0NywgMHgzZCwgMHgzZiwgMHgyZSwKLSAgICAweDNlLCAweDNkLCAweDNmLCAweDNiLCAweDNiLCAweDQzLCAweDQzLCAweDNjLCAweDNhLCAweDNjLCAweDNhLCAweDM2LAotICAgIDB4MzgsIDB4NDYsIDB4MzAsIDB4M2UsIDB4M2YsIDB4MzUsIDB4M2UsIDB4MzQsIDB4M2MsIDB4MzQsIDB4MzIsIDB4NGEsCi0gICAgMHg0MSwgMHg0OCwgMHg0OCwgMHgzZiwgMHgzNCwgMHgzNywgMHg0MiwgMHg0MywgMHgzNiwgMHg1OSwgMHg0MiwgMHgzZiwKLSAgICAweDRiLCAweDNkLCAweDVkLCAweDQ1LCAweDNiLCAweDUxLCAweDUxLCAweDRjLCAweDQxLCAweDQwLCAweDRkLCAweDM2LAotICAgIDB4M2YsIDB4MzQsIDB4MzksIDB4M2QsIDB4NGEsIDB4NGIsIDB4NGYsIDB4MzMsIDB4NDgsIDB4MzIsIDB4M2MsIDB4MzIsCi0gICAgMHg0OCwgMHg0YywgMHg0ZCwgMHgzYSwgMHg0OSwgMHgzYSwgMHgzYSwgMHgyZSwgMHg0YiwgMHg0NCwgMHg0ZiwgMHgzMywKLSAgICAweDNhLCAweDQ4LCAweDM0LCAweDQzLCAweDM4LCAweDQ1LCAweDQ0LCAweDM1LCAweDNiLCAweDNmLCAweDQwLCAweDM3LAotICAgIDB4MzUsIDB4MzQsIDB4MzgsIDB4M2UsIDB4NDEsIDB4M2UsIDB4M2IsIDB4NDcsIDB4NDEsIDB4NDcsIDB4M2MsIDB4M2MsCi0gICAgMHgzOSwgMHg0MCwgMHgzZSwgMHg0NSwgMHgzNiwgMHg0MSwgMHgzZiwgMHgzZiwgMHgzYywgMHg0NCwgMHgzZiwgMHg0MywKLSAgICAweDNkLCAweDNjLCAweDQ5LCAweDQyLCAweDNlLCAweDNmLCAweDQ4LCAweDM3LCAweDQzLCAweDM3LCAweDQzLCAweDNkLAotICAgIDB4MzIsIDB4NDIsIDB4NDQsIDB4MzksIDB4MzYsIDB4MzcsIDB4NDAsIDB4NDYsIDB4NDcsIDB4M2QsIDB4M2EsIDB4NDIsCi0gICAgMHgzZiwgMHgzOCwgMHgzNywgMHg0OCwgMHgzOSwgMHg0MCwgMHgzYywgMHgzNywgMHgzMywgMHgzOCwgMHgzOCwgMHg0MCwKLSAgICAweDQxLCAweDNjLCAweDNmLCAweDNiLCAweDQwLCAweDNhLCAweDQ3LCAweDQ2LCAweDNhLCAweDM3LCAweDQyLCAweDQ3LAotICAgIDB4M2IsIDB4M2YsIDB4M2IsIDB4NDAsIDB4MzMsIDB4M2YsIDB4M2EsIDB4M2MsIDB4MzgsIDB4M2EsIDB4MzYsIDB4MzgsCi0gICAgMHgzNiwgMHg0MCwgMHg0OCwgMHg0MiwgMHg0OCwgMHgzYywgMHg0MywgMHgzNiwgMHgzMiwgMHgzYiwgMHgzNCwgMHgzOSwKLSAgICAweDM4LCAweDQ2LCAweDM3LCAweDNiLCAweDQ0LCAweDM0LCAweDM2LCAweDM4LCAweDNjLCAweDQzLCAweDMzLCAweDNjLAotICAgIDB4M2IsIDB4NDUsIDB4MzgsIDB4MzgsIDB4NDQsIDB4MzMsIDB4MzYsIDB4NGEsIDB4NDYsIDB4NGMsIDB4NGEsIDB4MzQsCi0gICAgMHgzNiwgMHgzNywgMHg0MywgMHg0MiwgMHgzMywgMHg1OCwgMHg0MywgMHg0OCwgMHg0NCwgMHgzOCwgMHg1ZiwgMHgzZiwKLSAgICAweDNjLCAweDRkLCAweDUzLCAweDUyLCAweDQzLCAweDQ3LCAweDUyLCAweDNlLCAweDNiLCAweDJkLCAweDNiLCAweDNhLAotICAgIDB4NGIsIDB4NDksIDB4NTMsIDB4MzgsIDB4NGMsIDB4MmYsIDB4MzgsIDB4MzEsIDB4NDIsIDB4NDAsIDB4NDgsIDB4M2YsCi0gICAgMHg0NCwgMHgzYywgMHgzYywgMHgzNCwgMHg0NiwgMHgzZiwgMHg0OSwgMHgzYSwgMHg0MywgMHgzZCwgMHgzNCwgMHg0MiwKLSAgICAweDM2LCAweDQ3LCAweDUxLCAweDNjLCAweDNkLCAweDM5LCAweDM5LCAweDNhLCAweDNiLCAweDM1LCAweDM1LCAweDQxLAotICAgIDB4NDcsIDB4M2MsIDB4M2IsIDB4NDMsIDB4M2YsIDB4NDUsIDB4M2UsIDB4NDAsIDB4M2MsIDB4M2YsIDB4M2MsIDB4NDIsCi0gICAgMHgzYiwgMHgzZSwgMHgzOCwgMHgzZiwgMHgzZiwgMHg0MSwgMHgzOSwgMHgzOSwgMHgzZCwgMHg0MywgMHg0ZiwgMHgzZCwKLSAgICAweDQ4LCAweDNiLCAweDQ0LCAweDQ1LCAweDNkLCAweDNiLCAweDQ5LCAweDQzLCAweDQ0LCAweDNkLCAweDM3LCAweDNiLAotICAgIDB4M2MsIDB4NDUsIDB4NDYsIDB4NDQsIDB4MzUsIDB4M2UsIDB4MzIsIDB4MzUsIDB4MzQsIDB4M2IsIDB4NDAsIDB4NDMsCi0gICAgMHgzZSwgMHg0NSwgMHgzNywgMHgzZCwgMHgzZiwgMHg0MywgMHgzNiwgMHgzZiwgMHgzZiwgMHg0MywgMHgzOSwgMHg0NCwKLSAgICAweDNlLCAweDNlLCAweDQ1LCAweDQwLCAweDNlLCAweDQ0LCAweDNiLCAweDNlLCAweDQyLCAweDQyLCAweDNiLCAweDNkLAotICAgIDB4M2EsIDB4NDAsIDB4MzksIDB4M2EsIDB4MzIsIDB4MzYsIDB4NDEsIDB4MzAsIDB4MzksIDB4NDYsIDB4MzMsIDB4M2YsCi0gICAgMHg0NiwgMHg0MCwgMHgzYywgMHgzMSwgMHg0MSwgMHgzYSwgMHgzZiwgMHgzZiwgMHgzYiwgMHgzNiwgMHgzZiwgMHgzOCwKLSAgICAweDM2LCAweDNlLCAweDM1LCAweDM1LCAweDNiLCAweDNkLCAweDNmLCAweDM5LCAweDQ2LCAweDM3LCAweDNhLCAweDQ3LAotICAgIDB4MzcsIDB4MzksIDB4MmMsIDB4NTUsIDB4NDAsIDB4NGIsIDB4NGEsIDB4MzksIDB4MzUsIDB4NDIsIDB4M2QsIDB4NDAsCi0gICAgMHgzYSwgMHg1NCwgMHg0MSwgMHg0OCwgMHg1MSwgMHgzYiwgMHg2MSwgMHgzZSwgMHgzZSwgMHg0ZCwgMHg1MSwgMHg1MiwKLSAgICAweDNlLCAweDQzLCAweDUyLCAweDQxLCAweDQ4LCAweDJkLCAweDM1LCAweDM1LCAweDRiLCAweDQ0LCAweDRkLCAweDNjLAotICAgIDB4NTQsIDB4MzMsIDB4MzksIDB4MjcsIDB4NGEsIDB4NDQsIDB4NGEsIDB4NDEsIDB4M2MsIDB4M2EsIDB4MzEsIDB4MmYsCi0gICAgMHgzZCwgMHg0MiwgMHg0OCwgMHgzZiwgMHg0MiwgMHg0MCwgMHg0NCwgMHgzYiwgMHg0MCwgMHgzZSwgMHg0OSwgMHgzYSwKLSAgICAweDNjLCAweDM1LCAweDMwLCAweDNlLCAweDNlLCAweDNkLCAweDM2LCAweDNhLCAweDNlLCAweDNhLCAweDRhLCAweDNlLAotICAgIDB4M2QsIDB4NDksIDB4NDAsIDB4NDMsIDB4M2UsIDB4NDUsIDB4M2YsIDB4M2MsIDB4M2IsIDB4NDIsIDB4M2EsIDB4MzksCi0gICAgMHgzYiwgMHg0NywgMHgzZiwgMHgzOSwgMHg0OSwgMHg0NiwgMHgzZCwgMHgzNCwgMHgzMiwgMHg0NCwgMHg0NiwgMHg0MiwKLSAgICAweDQ3LCAweDM5LCAweDQ5LCAweDQ4LCAweDNiLCAweDM4LCAweDQ1LCAweDQ1LCAweDM3LCAweDM4LCAweDQ2LCAweDQ2LAotICAgIDB4MzcsIDB4NDIsIDB4MzUsIDB4MzQsIDB4NDUsIDB4NDIsIDB4MzUsIDB4NDMsIDB4M2IsIDB4M2EsIDB4NDMsIDB4NDMsCi0gICAgMHg0MCwgMHg0MiwgMHgzNSwgMHgzZiwgMHgzOCwgMHgzZiwgMHgzYSwgMHgzYSwgMHgzYiwgMHgzZiwgMHgzZSwgMHgzNiwKLSAgICAweDNmLCAweDNjLCAweDQ4LCAweDNiLCAweDNhLCAweDQxLCAweDQxLCAweDM1LCAweDMzLCAweDNmLCAweDNiLCAweDQ1LAotICAgIDB4NDgsIDB4MzYsIDB4NDAsIDB4MzgsIDB4NDcsIDB4M2QsIDB4MzUsIDB4NDAsIDB4NDEsIDB4NDIsIDB4NDEsIDB4MzcsCi0gICAgMHg0MSwgMHgzZSwgMHgzNiwgMHg0OCwgMHgzZSwgMHgzYywgMHgzMiwgMHgzOSwgMHg0MSwgMHg0MCwgMHgzOCwgMHgzZiwKLSAgICAweDQ2LCAweDQzLCAweDMzLCAweDQwLCAweDQzLCAweDQzLCAweDNhLCAweDQ5LCAweDNmLCAweDM1LCAweDJjLCAweDVkLAotICAgIDB4NDMsIDB4NDksIDB4NTIsIDB4M2IsIDB4M2MsIDB4NDEsIDB4NDAsIDB4NGEsIDB4MzMsIDB4NTAsIDB4NDEsIDB4NDYsCi0gICAgMHg1MiwgMHg0MSwgMHg2OCwgMHg0OCwgMHg0NCwgMHg1MywgMHg1NCwgMHg1NSwgMHg0MiwgMHg0MiwgMHg1NywgMHg0NCwKLSAgICAweDQ3LCAweDM1LCAweDM1LCAweDNlLCAweDRiLCAweDQ0LCAweDRlLCAweDM4LCAweDU1LCAweDJmLCAweDM2LCAweDJkLAotICAgIDB4NDAsIDB4NDgsIDB4NGIsIDB4NDEsIDB4NDgsIDB4MzYsIDB4MzIsIDB4MzIsIDB4NDQsIDB4NDIsIDB4NDcsIDB4NDIsCi0gICAgMHg0OCwgMHgzZCwgMHgzZCwgMHgzOSwgMHgzZSwgMHgzNSwgMHg0YiwgMHgzOSwgMHgzOCwgMHgzYSwgMHgzOSwgMHg0NiwKLSAgICAweDM4LCAweDNmLCAweDNhLCAweDQyLCAweDRiLCAweDQ1LCAweDNlLCAweDMyLCAweDQ2LCAweDQzLCAweDNiLCAweDQwLAotICAgIDB4NDUsIDB4NDEsIDB4M2UsIDB4NDMsIDB4MzcsIDB4M2QsIDB4NDMsIDB4M2IsIDB4NDYsIDB4NDgsIDB4NDIsIDB4M2IsCi0gICAgMHgzZCwgMHg0OCwgMHg0YSwgMHgzYywgMHgzYiwgMHg0MiwgMHg0MCwgMHgzYywgMHgzYSwgMHg0MiwgMHgzOCwgMHg0NywKLSAgICAweDNiLCAweDNiLCAweDNkLCAweDQxLCAweDNmLCAweDM4LCAweDNmLCAweDRhLCAweDQ0LCAweDNmLCAweDQ3LCAweDNhLAotICAgIDB4NDcsIDB4NDQsIDB4NDMsIDB4NDMsIDB4MzQsIDB4M2QsIDB4M2EsIDB4M2MsIDB4NDcsIDB4M2YsIDB4M2UsIDB4MzksCi0gICAgMHg0MiwgMHg0YSwgMHg0MCwgMHgzNiwgMHg0MCwgMHg0MSwgMHg0MiwgMHgzZiwgMHgzZiwgMHg0MywgMHgzOSwgMHgzOCwKLSAgICAweDNjLCAweDNiLCAweDRjLCAweDJmLCAweDQxLCAweDM5LCAweDQwLCAweDQyLCAweDNmLCAweDQyLCAweDQwLCAweDM2LAotICAgIDB4M2IsIDB4NDUsIDB4NDEsIDB4NDEsIDB4NDQsIDB4NDUsIDB4NDIsIDB4MzcsIDB4M2QsIDB4M2EsIDB4MzMsIDB4M2UsCi0gICAgMHgzYiwgMHgzYiwgMHgzYywgMHgzZCwgMHgzOCwgMHg0OSwgMHg0NCwgMHgzOSwgMHgzZiwgMHg0OCwgMHgzZCwgMHg0MSwKLSAgICAweDQyLCAweDQzLCAweDQ0LCAweDNlLCAweDQxLCAweDNkLCAweDMyLCAweDU5LCAweDQ1LCAweDRiLCAweDRiLCAweDM4LAotICAgIDB4MzcsIDB4M2QsIDB4NDgsIDB4NDIsIDB4M2QsIDB4NTIsIDB4NDMsIDB4NDYsIDB4NTQsIDB4NDgsIDB4NjcsIDB4NGQsCi0gICAgMHg0NSwgMHg0ZSwgMHg0OSwgMHg1MiwgMHg0NSwgMHg0NSwgMHg1OCwgMHgzYiwgMHg0MSwgMHgzOCwgMHgzZiwgMHgzZiwKLSAgICAweDQ5LCAweDQ0LCAweDRmLCAweDQ4LCAweDU3LCAweDMxLCAweDNjLCAweDJhLCAweDNlLCAweDRjLCAweDQxLCAweDQwLAotICAgIDB4NDcsIDB4M2YsIDB4MzMsIDB4MzQsIDB4M2YsIDB4NDIsIDB4NDgsIDB4NDMsIDB4NGIsIDB4MzgsIDB4MzksIDB4M2QsCi0gICAgMHgzZiwgMHgzZSwgMHg0YiwgMHgzZiwgMHgzNSwgMHgzNiwgMHgzYywgMHg0NiwgMHgzYywgMHg0NSwgMHgzNywgMHgzYiwKLSAgICAweDNjLCAweDM5LCAweDQxLCAweDQwLCAweDQxLCAweDQzLCAweDQ0LCAweDQxLCAweDQ1LCAweDRmLCAweDQ0LCAweDQzLAotICAgIDB4NDQsIDB4M2MsIDB4NDUsIDB4MzQsIDB4NDIsIDB4NDUsIDB4M2YsIDB4NDYsIDB4M2YsIDB4NDMsIDB4M2QsIDB4M2EsCi0gICAgMHgzOSwgMHg0NywgMHg0NSwgMHgzZCwgMHgzZiwgMHgzYiwgMHgzZCwgMHg0MiwgMHgzOCwgMHg0OCwgMHg0OCwgMHgzYiwKLSAgICAweDNjLCAweDNhLCAweDNmLCAweDQxLCAweDQ0LCAweDRiLCAweDQ0LCAweDQ4LCAweDQxLCAweDNjLCAweDNkLCAweDNjLAotICAgIDB4M2UsIDB4M2EsIDB4NGEsIDB4M2IsIDB4NDksIDB4MzUsIDB4M2EsIDB4M2QsIDB4NDEsIDB4M2YsIDB4NDksIDB4MzksCi0gICAgMHg0NCwgMHgzNywgMHgzZiwgMHgzYywgMHg0MiwgMHg0MCwgMHg0YSwgMHg0NiwgMHgzOSwgMHgzOCwgMHg0NiwgMHgzNywKLSAgICAweDQxLCAweDQ2LCAweDQxLCAweDQ1LCAweDQwLCAweDNiLCAweDNiLCAweDMzLCAweDNiLCAweDM5LCAweDNjLCAweDQzLAotICAgIDB4MzcsIDB4M2MsIDB4NDQsIDB4M2QsIDB4NDYsIDB4MzksIDB4M2MsIDB4M2MsIDB4NDQsIDB4NDgsIDB4NDEsIDB4NDQsCi0gICAgMHg0MSwgMHg0MywgMHg0NiwgMHgzYiwgMHg0NywgMHg0MSwgMHgzMSwgMHg0MSwgMHg0NCwgMHg0MCwgMHg0MywgMHg0MiwKLSAgICAweDNlLCAweDQzLCAweDM0LCAweDY1LCAweDRmLCAweDUwLCAweDRkLCAweDNhLCAweDM3LCAweDQzLCAweDRkLCAweDRhLAotICAgIDB4M2QsIDB4NTQsIDB4NDAsIDB4NDIsIDB4NWIsIDB4M2IsIDB4NzEsIDB4NDksIDB4NDQsIDB4NGYsIDB4NTQsIDB4NTYsCi0gICAgMHg0OCwgMHg0MCwgMHg1MiwgMHg0MSwgMHg0MiwgMHgzOCwgMHgzYywgMHg0OSwgMHg0YSwgMHg0NSwgMHg1MSwgMHgzNSwKLSAgICAweDU0LCAweDJmLCAweDM1LCAweDI1LCAweDRkLCAweDNmLCAweDRkLCAweDQzLCAweDQ5LCAweDMzLCAweDMyLCAweDNhLAotICAgIDB4NDYsIDB4NDgsIDB4NDgsIDB4M2QsIDB4NDMsIDB4M2EsIDB4M2MsIDB4M2EsIDB4NDgsIDB4NDAsIDB4NGIsIDB4M2IsCi0gICAgMHg0NSwgMHgzYiwgMHgzZiwgMHgzOCwgMHgzNywgMHg0MSwgMHgzMSwgMHgzYiwgMHg0MSwgMHg0MywgMHg0MywgMHgzNywKLSAgICAweDQ4LCAweDNmLCAweDQ4LCAweDM3LCAweDQwLCAweDRhLCAweDQzLCAweDQ1LCAweDNkLCAweDM5LCAweDM3LCAweDM3LAotICAgIDB4M2MsIDB4M2YsIDB4NDcsIDB4NDgsIDB4NDMsIDB4M2UsIDB4NDEsIDB4M2YsIDB4M2UsIDB4MzgsIDB4M2UsIDB4MzcsCi0gICAgMHg0NSwgMHg0NSwgMHgzNSwgMHg0NCwgMHgzOCwgMHgzYSwgMHg0OSwgMHg0MywgMHg0MCwgMHg0MSwgMHg0MCwgMHg0NCwKLSAgICAweDNjLCAweDNlLCAweDQwLCAweDM4LCAweDQyLCAweDQxLCAweDNjLCAweDQxLCAweDNhLCAweDNiLCAweDNjLCAweDNhLAotICAgIDB4NDksIDB4M2MsIDB4NDIsIDB4NDQsIDB4M2YsIDB4MzksIDB4NDUsIDB4MzIsIDB4NDUsIDB4NDMsIDB4NDUsIDB4MzksCi0gICAgMHg0MywgMHg0MSwgMHg0YiwgMHgzOSwgMHgzMiwgMHgzYywgMHgzYywgMHgzNiwgMHgzOSwgMHgzZiwgMHg0NiwgMHgzMiwKLSAgICAweDM5LCAweDM1LCAweDRmLCAweDMyLCAweDNlLCAweDQwLCAweDNkLCAweDNlLCAweDNhLCAweDM5LCAweDRjLCAweDM4LAotICAgIDB4NDMsIDB4MzgsIDB4NDksIDB4M2IsIDB4MzMsIDB4MzksIDB4M2IsIDB4MzYsIDB4MzYsIDB4NDMsIDB4M2IsIDB4M2MsCi0gICAgMHgzMiwgMHgzYywgMHgzYSwgMHg0NSwgMHgzMSwgMHgzZCwgMHgzNywgMHg0MCwgMHgzZiwgMHgzZiwgMHgzNSwgMHhmZiwKLSAgICAweDQ5LCAweDRlLCAweDRjLCAweDNjLCAweDM2LCAweDQzLCAweDQ2LCAweDQ1LCAweDQxLCAweDU5LCAweDQ0LCAweDRhLAotICAgIDB4NTMsIDB4NDQsIDB4NzEsIDB4NGEsIDB4MzksIDB4NGYsIDB4NTAsIDB4NGIsIDB4NDcsIDB4NDIsIDB4NWEsIDB4M2MsCi0gICAgMHg0NSwgMHgzOCwgMHgzZSwgMHg0MiwgMHg1MywgMHg0MywgMHg1MiwgMHgzYSwgMHg1MiwgMHgzNCwgMHgzMSwgMHgyMCwKLSAgICAweDQ5LCAweDRlLCAweDQ2LCAweDQzLCAweDRiLCAweDNkLCAweDJiLCAweDI3LCAweDQ2LCAweDQ2LCAweDQ3LCAweDQxLAotICAgIDB4NDIsIDB4MzcsIDB4MzksIDB4MzgsIDB4NDUsIDB4M2YsIDB4NTEsIDB4M2QsIDB4NDgsIDB4M2YsIDB4MzMsIDB4M2YsCi0gICAgMHgzOCwgMHg0NSwgMHgzMSwgMHgzOCwgMHg0MSwgMHgzZCwgMHg0NywgMHgzOSwgMHg0MiwgMHg0MCwgMHg0YywgMHgzZiwKLSAgICAweDQwLCAweDQyLCAweDQxLCAweDQxLCAweDQxLCAweDQyLCAweDM5LCAweDM1LCAweDNmLCAweDQ2LCAweDQ1LCAweDM2LAotICAgIDB4M2YsIDB4NDMsIDB4M2IsIDB4MzksIDB4NDEsIDB4MzgsIDB4NDMsIDB4MzcsIDB4M2QsIDB4NDQsIDB4M2IsIDB4NDAsCi0gICAgMHgzNiwgMHgzZCwgMHg0MiwgMHg0MSwgMHg0MSwgMHgzZCwgMHgzOCwgMHg0YSwgMHg0MCwgMHg0YSwgMHg0YywgMHgzOCwKLSAgICAweDNmLCAweDQwLCAweDQ1LCAweDNjLCAweDNmLCAweDRiLCAweDQzLCAweDQxLCAweDQzLCAweDNlLCAweDQzLCAweDNmLAotICAgIDB4MzYsIDB4NDAsIDB4NDAsIDB4MzksIDB4M2YsIDB4M2EsIDB4M2EsIDB4MzAsIDB4NDEsIDB4M2MsIDB4M2MsIDB4MzQsCi0gICAgMHg0NiwgMHgzOCwgMHg0MywgMHgzNCwgMHgzYSwgMHg0MiwgMHg0MywgMHg0MiwgMHg0MCwgMHg0MSwgMHg0OSwgMHgzNCwKLSAgICAweDM1LCAweDQwLCAweDQ3LCAweDNkLCAweDNkLCAweDNlLCAweDRjLCAweDMzLCAweDNjLCAweDNiLCAweDM5LCAweDQzLAotICAgIDB4M2EsIDB4M2UsIDB4M2IsIDB4MzcsIDB4M2YsIDB4NDIsIDB4MzEsIDB4M2QsIDB4NDEsIDB4M2UsIDB4MzIsIDB4NDcsCi0gICAgMHgzNCwgMHg0MSwgMHgzZCwgMHgzNSwgMHgzOSwgMHg0MCwgMHgzOCwgMHg2OSwgMHg0ZiwgMHg0YSwgMHg0OSwgMHgzNywKLSAgICAweDM3LCAweDQ0LCAweDQzLCAweDQ2LCAweDQwLCAweDU4LCAweDQzLCAweDQ4LCAweDU0LCAweDQ2LCAweDZjLCAweDUwLAotICAgIDB4M2EsIDB4NTAsIDB4NTAsIDB4NTcsIDB4NDcsIDB4NDYsIDB4NWMsIDB4NDAsIDB4NDAsIDB4MzksIDB4M2UsIDB4NDYsCi0gICAgMHg1MywgMHg0NiwgMHg1YywgMHgzNiwgMHg0ZiwgMHgzMiwgMHgzMCwgMHgyZCwgMHg0YSwgMHg0OCwgMHg0MSwgMHg0NSwKLSAgICAweDQ3LCAweDJmLCAweDMyLCAweDJiLCAweDQzLCAweDQwLCAweDQzLCAweDNjLCAweDQwLCAweDQ0LCAweDNlLCAweDM3LAotICAgIDB4MzksIDB4M2UsIDB4NDgsIDB4NDIsIDB4NDUsIDB4MzYsIDB4NDcsIDB4M2YsIDB4M2IsIDB4NDEsIDB4MzUsIDB4MzUsCi0gICAgMHgzYiwgMHgzZSwgMHgzNSwgMHg0MywgMHgzZSwgMHg0MSwgMHgzZCwgMHgzNiwgMHg0MSwgMHgzYywgMHg0MCwgMHg0NCwKLSAgICAweDNkLCAweDQwLCAweDM1LCAweDMyLCAweDQ4LCAweDNlLCAweDM5LCAweDQyLCAweDQ0LCAweDNkLCAweDM5LCAweDNiLAotICAgIDB4M2IsIDB4NDUsIDB4NDAsIDB4NGEsIDB4M2YsIDB4NDEsIDB4NDMsIDB4MzksIDB4NDIsIDB4NDQsIDB4NGMsIDB4M2MsCi0gICAgMHgzZiwgMHgzZSwgMHgzZiwgMHg0MywgMHg0MCwgMHg0MiwgMHg0YywgMHgzYiwgMHgzZSwgMHgzZCwgMHg0OSwgMHg0MiwKLSAgICAweDQwLCAweDQ0LCAweDQwLCAweDM0LCAweDM2LCAweDQwLCAweDQ1LCAweDM5LCAweDQyLCAweDQwLCAweDNlLCAweDQ0LAotICAgIDB4NDUsIDB4MzcsIDB4M2MsIDB4MzgsIDB4M2UsIDB4NDksIDB4M2UsIDB4M2MsIDB4NDEsIDB4M2QsIDB4NDIsIDB4MzIsCi0gICAgMHg0MCwgMHg0NSwgMHgzZSwgMHgzNiwgMHg0NCwgMHgzYSwgMHg0ZSwgMHgzOCwgMHg0MywgMHgzOCwgMHg0MCwgMHgzOCwKLSAgICAweDQ5LCAweDQyLCAweDQwLCAweDNkLCAweDQyLCAweDQ4LCAweDQ4LCAweDNkLCAweDQxLCAweDNhLCAweDNmLCAweDQxLAotICAgIDB4MzgsIDB4M2MsIDB4NDQsIDB4MzksIDB4M2EsIDB4MzIsIDB4M2EsIDB4M2UsIDB4M2QsIDB4M2IsIDB4MzksIDB4MzgsCi0gICAgMHgzYSwgMHg0MywgMHgzYSwgMHg2YiwgMHg0NSwgMHg1MCwgMHg0NywgMHgzMywgMHgzOCwgMHg0OCwgMHg0ZCwgMHg0ZiwKLSAgICAweDM5LCAweDRiLCAweDQ2LCAweDRhLCAweDRmLCAweDQyLCAweDZmLCAweDRiLCAweDQwLCAweDU1LCAweDU0LCAweDUwLAotICAgIDB4NDIsIDB4NDcsIDB4NWUsIDB4NDYsIDB4NDAsIDB4MzQsIDB4NDAsIDB4NDcsIDB4NTIsIDB4NDYsIDB4NTUsIDB4M2IsCi0gICAgMHg0ZiwgMHgyYiwgMHgzNSwgMHgzMywgMHg0YywgMHg0NCwgMHg0NCwgMHg0OCwgMHg0NywgMHgzNywgMHgzNSwgMHgyNywKLSAgICAweDRhLCAweDNiLCAweDQxLCAweDQwLCAweDQwLCAweDNlLCAweDM2LCAweDM5LCAweDNlLCAweDNjLCAweDQ1LCAweDNmLAotICAgIDB4NGQsIDB4NDEsIDB4M2QsIDB4NDgsIDB4NDcsIDB4NDYsIDB4MzMsIDB4M2QsIDB4M2QsIDB4M2UsIDB4MzQsIDB4M2YsCi0gICAgMHgzZSwgMHgzYSwgMHg0MSwgMHgzNSwgMHgzYiwgMHgzZSwgMHg0MiwgMHgzYywgMHg0MiwgMHg0MiwgMHg0MCwgMHgzMSwKLSAgICAweDM3LCAweDQwLCAweDM2LCAweDQyLCAweDQ4LCAweDM5LCAweDNkLCAweDNjLCAweDNhLCAweDQzLCAweDM5LCAweDNkLAotICAgIDB4NDcsIDB4NDksIDB4NDMsIDB4M2QsIDB4NDUsIDB4MzksIDB4NDQsIDB4MzcsIDB4M2UsIDB4NGQsIDB4M2QsIDB4NDAsCi0gICAgMHgzZCwgMHg0YywgMHg0ZCwgMHg0NCwgMHgzYywgMHgzZCwgMHg0NiwgMHg0MSwgMHg0MSwgMHg0MiwgMHg0MCwgMHg0MCwKLSAgICAweDQxLCAweDNhLCAweDNjLCAweDNiLCAweDNjLCAweDQ0LCAweDQwLCAweDM0LCAweDQ0LCAweDM4LCAweDNiLCAweDMzLAotICAgIDB4NDUsIDB4NDUsIDB4NDQsIDB4M2YsIDB4M2UsIDB4M2EsIDB4M2IsIDB4M2IsIDB4NDMsIDB4MzksIDB4M2EsIDB4NDUsCi0gICAgMHgzYiwgMHgzYSwgMHg0YiwgMHgzOSwgMHgzZCwgMHgzOCwgMHg0MSwgMHgzOSwgMHg0MiwgMHg0NSwgMHg0MywgMHg0MCwKLSAgICAweDNlLCAweDM1LCAweDQ0LCAweDNmLCAweDQ1LCAweDQxLCAweDQwLCAweDNlLCAweDQzLCAweDQyLCAweDM3LCAweDNhLAotICAgIDB4MzgsIDB4MzUsIDB4M2EsIDB4NDgsIDB4M2UsIDB4M2IsIDB4NDAsIDB4MzgsIDB4M2MsIDB4M2MsIDB4M2IsIDB4NmEsCi0gICAgMHg0OCwgMHg0ZCwgMHg0ZCwgMHgzNCwgMHgzOCwgMHg0MCwgMHg0YSwgMHg0NSwgMHgzYywgMHg0ZiwgMHg0MSwgMHg0YiwKLSAgICAweDU4LCAweDQ2LCAweDcxLCAweDQ5LCAweDNkLCAweDUzLCAweDQ0LCAweDUyLCAweDQyLCAweDNlLCAweDU3LCAweDRjLAotICAgIDB4NGMsIDB4MzgsIDB4NDAsIDB4M2IsIDB4NWMsIDB4NGMsIDB4NTIsIDB4M2UsIDB4NGMsIDB4MmQsIDB4MzIsIDB4MzcsCi0gICAgMHg0OSwgMHgzZiwgMHg0MSwgMHg0NywgMHg0YSwgMHgzYiwgMHgyZiwgMHgyNiwgMHg0NSwgMHg0MCwgMHg0NywgMHg0MiwKLSAgICAweDNkLCAweDM5LCAweDJkLCAweDJjLCAweDNmLCAweDQ1LCAweDQ2LCAweDQ0LCAweDQ4LCAweDQzLCAweDQyLCAweDQ4LAotICAgIDB4NDAsIDB4NDEsIDB4M2IsIDB4M2IsIDB4NDEsIDB4M2IsIDB4MzksIDB4NDAsIDB4M2IsIDB4NDcsIDB4M2YsIDB4MzgsCi0gICAgMHgzZiwgMHg0OSwgMHgzYiwgMHgzNSwgMHg0MCwgMHg0NSwgMHgzOCwgMHgzNSwgMHgzNiwgMHgzNCwgMHgzZSwgMHgzZCwKLSAgICAweDQ2LCAweDNlLCAweDMzLCAweDM4LCAweDQzLCAweDQ4LCAweDNmLCAweDQ1LCAweDMxLCAweDQ0LCAweDM4LCAweDM1LAotICAgIDB4M2MsIDB4NDEsIDB4NGIsIDB4NDQsIDB4M2QsIDB4NDMsIDB4MzgsIDB4NDgsIDB4M2MsIDB4MzksIDB4NGEsIDB4NDIsCi0gICAgMHgzZCwgMHg0MywgMHgzZiwgMHg0OSwgMHgzZSwgMHg0NywgMHg0OSwgMHg0MSwgMHgzYiwgMHgzYywgMHg0NywgMHgzYSwKLSAgICAweDNkLCAweDQwLCAweDRhLCAweDM4LCAweDNkLCAweDNiLCAweDQ3LCAweDNhLCAweDM2LCAweDQ3LCAweDQyLCAweDQ2LAotICAgIDB4M2MsIDB4M2QsIDB4NDUsIDB4M2IsIDB4NDgsIDB4M2YsIDB4MzgsIDB4MzYsIDB4MzksIDB4NDYsIDB4NDMsIDB4M2EsCi0gICAgMHg0MSwgMHgzZCwgMHgzOSwgMHgzOSwgMHg0NiwgMHgzNywgMHgzZiwgMHgzZiwgMHgzYSwgMHg0NiwgMHgzZiwgMHgzOSwKLSAgICAweDQ5LCAweDQ0LCAweDQyLCAweDNhLCAweDNhLCAweDQzLCAweDNlLCAweDQyLCAweDNkLCAweDNkLCAweDQzLCAweDQwLAotICAgIDB4NDMsIDB4M2MsIDB4M2YsIDB4NDMsIDB4NDAsIDB4NDIsIDB4M2IsIDB4NTcsIDB4NGEsIDB4NGYsIDB4NGEsIDB4MmQsCi0gICAgMHgzYiwgMHg0OCwgMHg0NSwgMHg0MiwgMHgzNCwgMHg0YywgMHgzZSwgMHg0ZiwgMHg0ZCwgMHg0MCwgMHg2YywgMHg0YiwKLSAgICAweDNiLCAweDRkLCAweDRjLCAweDU3LCAweDQ5LCAweDNkLCAweDVkLCAweDQ0LCAweDQzLCAweDI5LCAweDQyLCAweDNmLAotICAgIDB4NWIsIDB4NDcsIDB4NGYsIDB4M2UsIDB4NTQsIDB4MmUsIDB4MzQsIDB4MzQsIDB4NGIsIDB4NDcsIDB4NDYsIDB4NDYsCi0gICAgMHg0YiwgMHgzNCwgMHgzNiwgMHgyOCwgMHgzZSwgMHgzZiwgMHg0MiwgMHg0MCwgMHgzYiwgMHgzOCwgMHgzOSwgMHg0MiwKLSAgICAweDQ5LCAweDNkLCAweDQ5LCAweDQ3LCAweDQ3LCAweDNiLCAweDQzLCAweDM0LCAweDM5LCAweDM2LCAweDQyLCAweDNkLAotICAgIDB4MzcsIDB4NDAsIDB4MzcsIDB4MzgsIDB4NDYsIDB4NDIsIDB4NDksIDB4MzcsIDB4NDQsIDB4M2YsIDB4MzgsIDB4M2UsCi0gICAgMHgzNiwgMHgzMiwgMHgzMywgMHgzOCwgMHg0MCwgMHg0NiwgMHg0MiwgMHgzNCwgMHg0MSwgMHg0MiwgMHgzZSwgMHgzOCwKLSAgICAweDQ0LCAweDNlLCAweDNmLCAweDQzLCAweDNmLCAweDQzLCAweDM1LCAweDNmLCAweDRkLCAweDNiLCAweDQzLCAweDM5LAotICAgIDB4NDAsIDB4NDcsIDB4M2YsIDB4NGEsIDB4M2EsIDB4M2YsIDB4NDUsIDB4NDUsIDB4NDgsIDB4NDIsIDB4M2IsIDB4NDcsCi0gICAgMHg0MiwgMHg0YiwgMHg0NywgMHgzZSwgMHgzYywgMHg0MiwgMHg0NiwgMHgzOSwgMHg0MSwgMHgzZiwgMHg0OCwgMHgzMywKLSAgICAweDQ1LCAweDM0LCAweDNkLCAweDMwLCAweDQwLCAweDRjLCAweDQwLCAweDQwLCAweDM5LCAweDM3LCAweDQwLCAweDMzLAotICAgIDB4NDksIDB4NDIsIDB4NDUsIDB4MzgsIDB4M2MsIDB4NDMsIDB4NDUsIDB4MzUsIDB4MzcsIDB4MzMsIDB4MzQsIDB4M2IsCi0gICAgMHgzYiwgMHgzOCwgMHgzOSwgMHg0MSwgMHg0MiwgMHg0MCwgMHgzZSwgMHgzZSwgMHg0MSwgMHgzMywgMHgzYSwgMHgzNiwKLSAgICAweDQwLCAweDNhLCAweDNjLCAweDQ1LCAweDQzLCAweDNjLCAweDQwLCAweDQxLCAweDQ5LCAweDQ3LCAweDM1LCAweDM0LAotICAgIDB4M2EsIDB4M2QsIDB4M2EsIDB4NjgsIDB4NGYsIDB4NDgsIDB4NDMsIDB4MzYsIDB4MzcsIDB4M2UsIDB4NDUsIDB4NDksCi0gICAgMHgzYSwgMHg0ZCwgMHg0MSwgMHgzZCwgMHg0NiwgMHg0NSwgMHg2NSwgMHg0NiwgMHgzOCwgMHg0ZCwgMHg0YSwgMHg1MywKLSAgICAweDQzLCAweDQxLCAweDVkLCAweDQ3LCAweDQxLCAweDM0LCAweDM5LCAweDQzLCAweDRlLCAweDQ4LCAweDUwLCAweDM4LAotICAgIDB4NTMsIDB4MzIsIDB4MzAsIDB4MmUsIDB4NDksIDB4NGMsIDB4NGQsIDB4M2YsIDB4NDYsIDB4MzgsIDB4MzQsIDB4MmIsCi0gICAgMHg0NCwgMHg0NCwgMHg0MSwgMHg0MSwgMHgzNiwgMHg0MCwgMHgzZiwgMHgzMiwgMHg0NiwgMHgzOCwgMHg1MCwgMHg0NSwKLSAgICAweDNmLCAweDNkLCAweDNiLCAweDM2LCAweDNiLCAweDQzLCAweDNhLCAweDM0LCAweDM2LCAweDNmLCAweDM5LCAweDM1LAotICAgIDB4M2MsIDB4NDAsIDB4NDAsIDB4MzcsIDB4M2MsIDB4MzksIDB4M2QsIDB4MzYsIDB4NDgsIDB4M2QsIDB4NDMsIDB4MzQsCi0gICAgMHgzYiwgMHg0NiwgMHg0MywgMHg0MSwgMHgzMywgMHgzZSwgMHg0NCwgMHgzZCwgMHg0NCwgMHg0NCwgMHg0YywgMHgzYywKLSAgICAweDM3LCAweDQ5LCAweDQyLCAweDM1LCAweDQ1LCAweDNhLCAweDNjLCAweDQxLCAweDNhLCAweDQ1LCAweDQ2LCAweDQxLAotICAgIDB4M2MsIDB4NDgsIDB4NDYsIDB4MzYsIDB4MzYsIDB4NDIsIDB4M2IsIDB4NDYsIDB4NDIsIDB4NDUsIDB4NDQsIDB4NDcsCi0gICAgMHgzZiwgMHg0NCwgMHgzYSwgMHgzNSwgMHgzNywgMHg0NiwgMHg0MCwgMHgzOCwgMHg0MCwgMHgzZCwgMHgzNiwgMHgyYywKLSAgICAweDM0LCAweDQ3LCAweDQwLCAweDM4LCAweDNmLCAweDNmLCAweDQ0LCAweDJkLCAweDNiLCAweDNkLCAweDNlLCAweDQ0LAotICAgIDB4M2MsIDB4NDAsIDB4M2UsIDB4MzMsIDB4M2MsIDB4M2EsIDB4NDksIDB4NDAsIDB4NDIsIDB4NDIsIDB4M2EsIDB4M2IsCi0gICAgMHgzMywgMHgzZCwgMHgzYywgMHg0MywgMHgzZSwgMHgzZCwgMHgzYSwgMHgzYSwgMHg0OCwgMHgzZSwgMHgzYywgMHgzOSwKLSAgICAweDNmLCAweDQ0LCAweDM3LCAweDQwLCAweDNmLCAweDNjLCAweDNlLCAweDNkLCAweDM4LCAweDQyLCAweDM0LCAweDYyLAotICAgIDB4NTEsIDB4NDcsIDB4NDQsIDB4M2YsIDB4MzIsIDB4M2MsIDB4M2YsIDB4NDYsIDB4M2QsIDB4NDYsIDB4M2UsIDB4NDUsCi0gICAgMHg0YSwgMHgzZSwgMHg1ZCwgMHg0MywgMHg0NSwgMHg0OSwgMHg0YSwgMHg1NSwgMHg0MSwgMHgzYywgMHg1YSwgMHg0NCwKLSAgICAweDQzLCAweDNiLCAweDNjLCAweDNhLCAweDRiLCAweDRlLCAweDRkLCAweDQyLCAweDQ5LCAweDMwLCAweDNiLCAweDM4LAotICAgIDB4NDIsIDB4NDQsIDB4NTEsIDB4NDAsIDB4NDgsIDB4MzMsIDB4M2YsIDB4MmIsIDB4M2MsIDB4NDEsIDB4M2MsIDB4NDUsCi0gICAgMHgzNSwgMHgzOSwgMHg0MiwgMHgzNywgMHg0MCwgMHg0NiwgMHg0NiwgMHgzZiwgMHg0MSwgMHg0NSwgMHg0MiwgMHgzZCwKLSAgICAweDQzLCAweDM4LCAweDNlLCAweDM4LCAweDNjLCAweDM5LCAweDQwLCAweDM4LCAweDM3LCAweDM2LCAweDNkLCAweDNkLAotICAgIDB4MzgsIDB4NDcsIDB4NDUsIDB4M2IsIDB4NDUsIDB4NDQsIDB4NDIsIDB4MmUsIDB4MzcsIDB4NDAsIDB4NDIsIDB4NDIsCi0gICAgMHgzYywgMHgzNiwgMHgzYiwgMHgzOSwgMHg0NCwgMHg0ZCwgMHg0MiwgMHgzZiwgMHgzYSwgMHgzZSwgMHg0NSwgMHgzNCwKLSAgICAweDNjLCAweDQzLCAweDQ3LCAweDQzLCAweDNmLCAweDQ4LCAweDNiLCAweDQ0LCAweDNkLCAweDQ0LCAweDQzLCAweDNlLAotICAgIDB4NDAsIDB4NGEsIDB4MzEsIDB4NDIsIDB4NDIsIDB4NDMsIDB4NDgsIDB4NDUsIDB4M2EsIDB4NDIsIDB4MzYsIDB4MmYsCi0gICAgMHgzYywgMHgzZSwgMHgzYiwgMHgzYiwgMHg0NCwgMHgzZiwgMHgzYSwgMHgyYywgMHg0NywgMHgzZiwgMHg0YSwgMHg0MCwKLSAgICAweDQwLCAweDQwLCAweDNjLCAweDJhLCAweDNlLCAweDQ0LCAweDQwLCAweDQzLCAweDNhLCAweDQyLCAweDM5LCAweDM0LAotICAgIDB4NDksIDB4M2UsIDB4MzYsIDB4NDIsIDB4M2YsIDB4NDIsIDB4MzMsIDB4M2IsIDB4M2MsIDB4NDUsIDB4MzksIDB4M2YsCi0gICAgMHgzZSwgMHgzZiwgMHg0MSwgMHgzZCwgMHgzMiwgMHgzYiwgMHgzMSwgMHg0MCwgMHgzZiwgMHg0NCwgMHgzYywgMHgzZiwKLSAgICAweDQwLCAweDQ2LCAweDQ1LCAweDM2LCAweDM2LCAweDQyLCAweDMwLCAweDU3LCAweDQ3LCAweDQ0LCAweDQ4LCAweDNmLAotICAgIDB4MzUsIDB4MzcsIDB4M2YsIDB4M2YsIDB4MzgsIDB4NGEsIDB4NDEsIDB4NDYsIDB4NTAsIDB4M2QsIDB4NWIsIDB4NDEsCi0gICAgMHgzZSwgMHgzYywgMHg0YSwgMHg1NCwgMHg0NSwgMHg0MSwgMHg1YiwgMHg0NiwgMHgzZCwgMHgzYiwgMHg0MywgMHgzMywKLSAgICAweDQ1LCAweDRlLCAweDQzLCAweDNiLCAweDQ0LCAweDM3LCAweDM3LCAweDMyLCAweDRjLCAweDNkLCAweDRjLCAweDNmLAotICAgIDB4NDksIDB4M2IsIDB4MzcsIDB4M2EsIDB4MzMsIDB4NDMsIDB4M2YsIDB4NDAsIDB4NDQsIDB4MzYsIDB4M2IsIDB4NDQsCi0gICAgMHg0NSwgMHg0MCwgMHgzYywgMHgzYywgMHg0MSwgMHg0NCwgMHgzYiwgMHgzZCwgMHgzMywgMHgzNywgMHgzYywgMHgzNSwKLSAgICAweDNkLCAweDNmLCAweDM5LCAweDM4LCAweDMzLCAweDQzLCAweDNlLCAweDM5LCAweDNiLCAweDNlLCAweDQxLCAweDM1LAotICAgIDB4NDAsIDB4NDYsIDB4NDMsIDB4MzUsIDB4NDEsIDB4M2QsIDB4MzIsIDB4MzksIDB4M2MsIDB4NDAsIDB4M2UsIDB4M2YsCi0gICAgMHg0MiwgMHgzOCwgMHgzYiwgMHg0NSwgMHgzYSwgMHgzZCwgMHg0MCwgMHgzNiwgMHgzYSwgMHg0MCwgMHg0NiwgMHg0NCwKLSAgICAweDQ4LCAweDQ1LCAweDNmLCAweDNhLCAweDQ1LCAweDQ1LCAweDNjLCAweDNiLCAweDQwLCAweDRjLCAweDM5LCAweDNhLAotICAgIDB4MzgsIDB4MzksIDB4NDYsIDB4M2EsIDB4M2UsIDB4NGIsIDB4MzQsIDB4MzksIDB4M2QsIDB4M2YsIDB4NDAsIDB4MzksCi0gICAgMHg0NSwgMHgzMSwgMHg0NSwgMHgyOSwgMHgzZiwgMHgzOCwgMHgzYSwgMHgzZiwgMHgzOCwgMHgzYiwgMHgzNiwgMHgyZCwKLSAgICAweDQzLCAweDNkLCAweDQ1LCAweDNjLCAweDQ2LCAweDNmLCAweDQwLCAweDNjLCAweDNhLCAweDNlLCAweDNkLCAweDM4LAotICAgIDB4M2YsIDB4M2MsIDB4M2YsIDB4NDIsIDB4MzUsIDB4M2YsIDB4M2EsIDB4NDMsIDB4M2QsIDB4NDMsIDB4M2QsIDB4MzMsCi0gICAgMHgzZCwgMHg0OCwgMHg0MiwgMHgzZCwgMHg0NSwgMHg0NiwgMHgzZCwgMHgzNSwgMHgzMiwgMHg0NCwgMHg0MiwgMHgzNywKLSAgICAweDNkLCAweDQwLCAweDNjLCAweDQ3LCAweDRhLCAweDQ1LCAweDQ3LCAweDJmLCAweDMzLCAweDM2LCAweDNmLCAweDQyLAotICAgIDB4MzgsIDB4NDMsIDB4M2UsIDB4M2EsIDB4NDEsIDB4M2YsIDB4NWYsIDB4M2YsIDB4NDgsIDB4M2EsIDB4NDQsIDB4NDcsCi0gICAgMHg0MSwgMHgzZSwgMHg1NywgMHg0MiwgMHg0MSwgMHgzMywgMHgzNCwgMHgzOSwgMHg0MiwgMHg0NCwgMHg0MiwgMHgzYywKLSAgICAweDQ5LCAweDM0LCAweDM3LCAweDMzLCAweDQ3LCAweDM4LCAweDQzLCAweDNkLCAweDQzLCAweDNlLCAweDNlLCAweDM2LAotICAgIDB4NDEsIDB4NDEsIDB4MzcsIDB4NDAsIDB4MzksIDB4M2UsIDB4M2IsIDB4M2IsIDB4M2UsIDB4NDEsIDB4M2QsIDB4M2IsCi0gICAgMHg0MywgMHgzZSwgMHgzOSwgMHg0MywgMHgyZiwgMHgzZSwgMHgzMywgMHg0MCwgMHg0NSwgMHg0NywgMHgzMCwgMHg0NiwKLSAgICAweDNmLCAweDNmLCAweDM3LCAweDQyLCAweDNkLCAweDQyLCAweDQzLCAweDM3LCAweDM4LCAweDNjLCAweDM1LCAweDM0LAotICAgIDB4NDEsIDB4NDMsIDB4M2UsIDB4M2UsIDB4M2YsIDB4NDksIDB4MzUsIDB4MzUsIDB4MzgsIDB4MzYsIDB4M2EsIDB4NDMsCi0gICAgMHgzOCwgMHg0NiwgMHg0OCwgMHgzNiwgMHgzZiwgMHgzOSwgMHgzYiwgMHgzZSwgMHg0OCwgMHg0NywgMHg0MSwgMHgzNCwKLSAgICAweDNiLCAweDNjLCAweDM3LCAweDNlLCAweDQwLCAweDQxLCAweDNiLCAweDNkLCAweDQzLCAweDQyLCAweDNhLCAweDM5LAotICAgIDB4M2IsIDB4NDMsIDB4MzgsIDB4MmIsIDB4NDMsIDB4NDEsIDB4NDgsIDB4MzUsIDB4NDQsIDB4NDQsIDB4M2UsIDB4MmMsCi0gICAgMHg0NiwgMHg0MCwgMHgzZSwgMHg0MSwgMHgzOCwgMHgzNCwgMHgzNSwgMHgzNywgMHgzNCwgMHgzZiwgMHgzZCwgMHg0NiwKLSAgICAweDMzLCAweDNjLCAweDNjLCAweDJlLCAweDNiLCAweDQ1LCAweDNkLCAweDNlLCAweDNhLCAweDQyLCAweDNjLCAweDM2LAotICAgIDB4M2EsIDB4NDIsIDB4MzksIDB4NDMsIDB4MzUsIDB4MzksIDB4NDAsIDB4NDQsIDB4NDcsIDB4NDEsIDB4NDQsIDB4M2QsCi0gICAgMHg0MSwgMHgzZSwgMHgzOCwgMHgzOSwgMHg0NSwgMHgzYSwgMHgzNSwgMHg0MywgMHgzZiwgMHg0NCwgMHg0MSwgMHg0OSwKLSAgICAweDQ3LCAweDNmLCAweDQ0LCAweDQwLCAweDM4LCAweDQzLCAweDQwLCAweDNlLCAweDM5LCAweDQyLCAweDMyLCAweDNiLAotICAgIDB4NDIsIDB4NDcsIDB4NTcsIDB4MzcsIDB4MzYsIDB4MzgsIDB4NDMsIDB4NDksIDB4M2IsIDB4MzQsIDB4NTQsIDB4NDIsCi0gICAgMHgzZCwgMHgzZiwgMHgzZSwgMHgzYiwgMHgzOCwgMHg0MSwgMHg0MywgMHgzYSwgMHg0NCwgMHgzOSwgMHgzNCwgMHgyYywKLSAgICAweDM4LCAweDQzLCAweDRiLCAweDNmLCAweDQwLCAweDNlLCAweDMyLCAweDMzLCAweDNkLCAweDQ0LCAweDQ1LCAweDQ0LAotICAgIDB4M2UsIDB4MzUsIDB4MzcsIDB4MzksIDB4NDAsIDB4M2UsIDB4NDAsIDB4M2MsIDB4MzQsIDB4NDMsIDB4MzcsIDB4NDAsCi0gICAgMHgzOSwgMHgzZSwgMHgzZCwgMHg0MywgMHgzYSwgMHg0NCwgMHg0MywgMHg0NCwgMHgzZCwgMHgzYiwgMHg0NSwgMHgzYiwKLSAgICAweDNhLCAweDNhLCAweDNmLCAweDM3LCAweDQzLCAweDNiLCAweDMzLCAweDM1LCAweDQwLCAweDQ3LCAweDNlLCAweDNjLAotICAgIDB4MzksIDB4M2MsIDB4MzQsIDB4MjksIDB4M2MsIDB4M2UsIDB4NDYsIDB4M2UsIDB4M2MsIDB4MzgsIDB4M2YsIDB4MmQsCi0gICAgMHgzZCwgMHgzZCwgMHgzZiwgMHgzZiwgMHgzZCwgMHg0NSwgMHgzYiwgMHgzMiwgMHgzOSwgMHgzZiwgMHg0MSwgMHgzOCwKLSAgICAweDM2LCAweDNlLCAweDNhLCAweDM1LCAweDQwLCAweDNmLCAweDNiLCAweDMyLCAweDNjLCAweDM5LCAweDNlLCAweDM1LAotICAgIDB4M2UsIDB4NDUsIDB4MzQsIDB4MzgsIDB4NDQsIDB4MzksIDB4M2YsIDB4MzEsIDB4MzQsIDB4MzksIDB4M2YsIDB4MzgsCi0gICAgMHg0NCwgMHg0MiwgMHgzZiwgMHgzYiwgMHgzOSwgMHgzZCwgMHgzOSwgMHgzYiwgMHg0NCwgMHg0NiwgMHgzOCwgMHgzZCwKLSAgICAweDQ1LCAweDM3LCAweDQwLCAweDNhLCAweDNhLCAweDM5LCAweDM1LCAweDNjLCAweDM5LCAweDQwLCAweDQ3LCAweDNlLAotICAgIDB4MzgsIDB4NDIsIDB4NDEsIDB4M2IsIDB4NDgsIDB4M2YsIDB4M2EsIDB4M2UsIDB4M2QsIDB4M2YsIDB4MzIsIDB4M2IsCi0gICAgMHgzZiwgMHgzZCwgMHgzZSwgMHg0NCwgMHg0MywgMHg0MSwgMHg0NCwgMHg0NywgMHg0OCwgMHg0MSwgMHg0MSwgMHgzNiwKLSAgICAweDNhLCAweDMzLCAweDNjLCAweDNjLCAweDM3LCAweDNlLCAweDQwLCAweDM0LCAweDNmLCAweDQyLCAweDUzLCAweDQwLAotICAgIDB4M2YsIDB4MzUsIDB4M2UsIDB4NDYsIDB4M2EsIDB4M2UsIDB4NGIsIDB4NDEsIDB4NDYsIDB4MzIsIDB4MzksIDB4MzYsCi0gICAgMHgzYiwgMHg0ZiwgMHgzNiwgMHgzYywgMHg0MCwgMHgzYSwgMHg0MCwgMHg0MCwgMHg0NywgMHgzZSwgMHg0OSwgMHgzNywKLSAgICAweDNmLCAweDMxLCAweDNlLCAweDQwLCAweDNiLCAweDNmLCAweDQzLCAweDQ0LCAweDNhLCAweDNkLCAweDMxLCAweDQxLAotICAgIDB4NDEsIDB4MzMsIDB4NDMsIDB4NDAsIDB4M2MsIDB4M2EsIDB4NDEsIDB4NDAsIDB4MzcsIDB4M2YsIDB4MzQsIDB4M2UsCi0gICAgMHg0NCwgMHg0MiwgMHgzZCwgMHgzZiwgMHgzZiwgMHgzNCwgMHgzNiwgMHgzNCwgMHgzMSwgMHg0MSwgMHgzMiwgMHgzOSwKLSAgICAweDNlLCAweDNkLCAweDQyLCAweDM1LCAweDNlLCAweDNhLCAweDQxLCAweDQ3LCAweDNkLCAweDQyLCAweDMzLCAweDMyLAotICAgIDB4NDMsIDB4NDIsIDB4MzYsIDB4NDEsIDB4M2UsIDB4MzksIDB4NDYsIDB4MzksIDB4MzUsIDB4M2QsIDB4M2QsIDB4NDAsCi0gICAgMHgzOCwgMHg0NCwgMHgzZCwgMHgzMSwgMHg0NCwgMHgzOSwgMHgzYSwgMHg0NSwgMHg0MiwgMHg0MSwgMHgzZCwgMHgzNiwKLSAgICAweDNmLCAweDNjLCAweDM5LCAweDNkLCAweDMyLCAweDM5LCAweDQyLCAweDM0LCAweDNmLCAweDM4LCAweDQ0LCAweDNjLAotICAgIDB4NDMsIDB4NDUsIDB4NDEsIDB4MmQsIDB4NDQsIDB4NDIsIDB4M2QsIDB4M2YsIDB4NDQsIDB4MzgsIDB4M2QsIDB4MzUsCi0gICAgMHgzYSwgMHg0OCwgMHg0MCwgMHgzYiwgMHgzZCwgMHgzNiwgMHgzYiwgMHg0MCwgMHgzZiwgMHgzYSwgMHgzYSwgMHgzZiwKLSAgICAweDNjLCAweDMzLCAweDM5LCAweDNjLCAweDNjLCAweDM4LCAweDQ3LCAweDM2LCAweDNkLCAweDQxLCAweDQ2LCAweDQxLAotICAgIDB4MzQsIDB4NDYsIDB4NDgsIDB4NDYsIDB4M2QsIDB4M2MsIDB4NDAsIDB4NDMsIDB4M2QsIDB4NDEsIDB4MzcsIDB4M2UsCi0gICAgMHgzOSwgMHg0NywgMHgzZiwgMHgzOSwgMHg0NiwgMHg0MywgMHgzZiwgMHg0MSwgMHg0NSwgMHgzNywgMHg0MCwgMHgzYSwKLSAgICAweDNkLCAweDQ0LCAweDNmLCAweDNiLCAweDNiLCAweDQwLCAweDRmLCAweDNkLCAweDNkLCAweDQxLCAweDNjLCAweDQzLAotICAgIDB4M2UsIDB4NDYsIDB4NGUsIDB4NDAsIDB4M2YsIDB4MzQsIDB4NDgsIDB4MjksIDB4NDUsIDB4NDQsIDB4NDYsIDB4NDEsCi0gICAgMHg0NSwgMHgzMiwgMHgzZSwgMHgzOCwgMHgzOSwgMHgzYSwgMHgzZSwgMHgzZSwgMHg0YywgMHgzNCwgMHgzYywgMHg0MCwKLSAgICAweDRhLCAweDQ0LCAweDNkLCAweDQ2LCAweDNiLCAweDNlLCAweDQyLCAweDQyLCAweDNhLCAweDQxLCAweDQzLCAweDQxLAotICAgIDB4MzksIDB4M2YsIDB4M2UsIDB4M2MsIDB4MzYsIDB4NDgsIDB4M2YsIDB4M2UsIDB4M2UsIDB4MzcsIDB4M2YsIDB4M2YsCi0gICAgMHgzYiwgMHg0MCwgMHgzZSwgMHgzNSwgMHgzMiwgMHgzNSwgMHgzZiwgMHgzMywgMHgzZiwgMHgzOCwgMHg0MywgMHgzNywKLSAgICAweDQ5LCAweDM4LCAweDM3LCAweDNjLCAweDNjLCAweDQwLCAweDQwLCAweDNhLCAweDNhLCAweDQ2LCAweDM3LCAweDM0LAotICAgIDB4MzQsIDB4M2IsIDB4M2QsIDB4MmYsIDB4M2EsIDB4MzgsIDB4M2QsIDB4NDYsIDB4M2QsIDB4M2IsIDB4M2QsIDB4MzgsCi0gICAgMHgzNSwgMHgzNywgMHg0NCwgMHgzYywgMHgzZCwgMHgzZSwgMHg0MCwgMHgzYSwgMHg0MCwgMHgzMywgMHgzZSwgMHgzOCwKLSAgICAweDQwLCAweDNlLCAweDQ1LCAweDM3LCAweDNmLCAweDNiLCAweDNjLCAweDQwLCAweDNiLCAweDNjLCAweDNiLCAweDMzLAotICAgIDB4NDEsIDB4M2YsIDB4M2IsIDB4NDIsIDB4MzEsIDB4M2IsIDB4M2EsIDB4MzksIDB4M2QsIDB4NDEsIDB4MzksIDB4NDAsCi0gICAgMHg0MywgMHg0NSwgMHgzOSwgMHgzYiwgMHgzYSwgMHg0MiwgMHg0MywgMHgzZCwgMHgzZiwgMHg0MCwgMHg0NywgMHgzOSwKLSAgICAweDM3LCAweDNmLCAweDQ3LCAweDNmLCAweDQ1LCAweDQxLCAweDM5LCAweDNhLCAweDQxLCAweDM4LCAweDNjLCAweDNjLAotICAgIDB4MzksIDB4NDAsIDB4MzksIDB4M2IsIDB4M2IsIDB4M2UsIDB4MzgsIDB4M2IsIDB4MzcsIDB4NDgsIDB4NDEsIDB4M2YsCi0gICAgMHgzZSwgMHgzNywgMHgzZCwgMHg0NCwgMHgzYywgMHgzZSwgMHg0MCwgMHgzOSwgMHg0MSwgMHg0MiwgMHgzZCwgMHg0NSwKLSAgICAweDNiLCAweDNlLCAweDRjLCAweDNiLCAweDNhLCAweDNhLCAweDNlLCAweDQ3LCAweDNjLCAweDNmLCAweDQ4LCAweDNmLAotICAgIDB4NDYsIDB4M2YsIDB4MzksIDB4MjUsIDB4NDQsIDB4M2EsIDB4M2IsIDB4NDAsIDB4NDEsIDB4MzksIDB4MzksIDB4NDcsCi0gICAgMHgzYiwgMHgzMiwgMHg0OSwgMHg0MiwgMHg0MSwgMHgzYSwgMHg0MywgMHg0MSwgMHgzZSwgMHgzNSwgMHgzNywgMHgzZCwKLSAgICAweDQ5LCAweDQwLCAweDQ1LCAweDNiLCAweDNjLCAweDM4LCAweDQ4LCAweDNjLCAweDNjLCAweDM1LCAweDNmLCAweDQxLAotICAgIDB4NDEsIDB4NGMsIDB4MzYsIDB4MzksIDB4MzcsIDB4M2QsIDB4M2IsIDB4M2UsIDB4NDQsIDB4MzIsIDB4M2QsIDB4M2YsCi0gICAgMHgzYSwgMHgzYiwgMHgzYSwgMHg0NywgMHgzOCwgMHg0MiwgMHgzNiwgMHgzNCwgMHg0MywgMHgzZiwgMHgzZSwgMHg0MCwKLSAgICAweDM0LCAweDMxLCAweDM2LCAweDMzLCAweDQyLCAweDM3LCAweDQxLCAweDQxLCAweDQwLCAweDNkLCAweDNkLCAweDM3LAotICAgIDB4NDMsIDB4M2EsIDB4M2UsIDB4NDQsIDB4NDMsIDB4M2MsIDB4MzUsIDB4MzgsIDB4MzgsIDB4M2MsIDB4NDMsIDB4MzYsCi0gICAgMHgzYSwgMHgzOCwgMHg0MCwgMHgzZiwgMHgzZCwgMHgzZSwgMHgzNywgMHgzYiwgMHg0MSwgMHgzYSwgMHgzYiwgMHgzZCwKLSAgICAweDNjLCAweDQxLCAweDNjLCAweDQxLCAweDQ3LCAweDNmLCAweDNmLCAweDNiLCAweDNkLCAweDNmLCAweDNiLCAweDQ1LAotICAgIDB4MzgsIDB4MzgsIDB4NDAsIDB4MzgsIDB4NDYsIDB4NDIsIDB4MzksIDB4M2QsIDB4M2QsIDB4M2IsIDB4NDIsIDB4MzYsCi0gICAgMHg0MiwgMHg0MSwgMHgzZSwgMHgzZSwgMHgzNiwgMHgzZiwgMHgzNywgMHgzZiwgMHgzNiwgMHg0OCwgMHgzYiwgMHgzOSwKLSAgICAweDNkLCAweDNmLCAweDQzLCAweDNlLCAweDNjLCAweDQwLCAweDQ4LCAweDQ2LCAweDQzLCAweDM2LCAweDQyLCAweDM5LAotICAgIDB4NDYsIDB4M2MsIDB4MzcsIDB4MzgsIDB4NDksIDB4MzcsIDB4MzYsIDB4MzksIDB4M2UsIDB4NDIsIDB4NDgsIDB4M2EsCi0gICAgMHgzYywgMHgzZSwgMHg0MiwgMHgzMCwgMHgzZSwgMHgzNCwgMHgzOSwgMHgzYiwgMHg0NiwgMHg2MSwgMHg0NiwgMHgxZSwKLSAgICAweDRjLCAweDNiLCAweDQwLCAweDJkLCAweDNjLCAweDQyLCAweDMyLCAweDMwLCAweDQ5LCAweDNlLCAweDM5LCAweDM0LAotICAgIDB4MzAsIDB4NDAsIDB4MzEsIDB4MzgsIDB4NDAsIDB4M2QsIDB4M2MsIDB4MzUsIDB4M2EsIDB4MzYsIDB4NDAsIDB4M2IsCi0gICAgMHg0MSwgMHg0MCwgMHgzYiwgMHgzOSwgMHgzNywgMHgzNywgMHgzZiwgMHgzYiwgMHgzYywgMHgzYSwgMHg0MCwgMHgzYSwKLSAgICAweDM2LCAweDNjLCAweDQyLCAweDM5LCAweDNlLCAweDM2LCAweDQwLCAweDQyLCAweDM5LCAweDQwLCAweDNiLCAweDM0LAotICAgIDB4MzcsIDB4MzMsIDB4MzYsIDB4M2YsIDB4NDMsIDB4MzMsIDB4MzMsIDB4MjcsIDB4M2QsIDB4NDYsIDB4NDAsIDB4MzEsCi0gICAgMHgzOCwgMHgzZSwgMHg0MSwgMHgyMCwgMHgzZiwgMHgzOSwgMHg0MiwgMHgzNSwgMHgzNSwgMHg0NSwgMHg0MCwgMHgxZSwKLSAgICAweDMyLCAweDM1LCAweDMyLCAweDNjLCAweDM1LCAweDQ0LCAweDQ2LCAweDI5LCAweDNhLCAweDNkLCAweDM3LCAweDQyLAotICAgIDB4M2IsIDB4NDUsIDB4M2EsIDB4MjYsIDB4MzgsIDB4NDAsIDB4MzAsIDB4MzcsIDB4NDEsIDB4NDAsIDB4MzksIDB4MmIsCi0gICAgMHg0OSwgMHgzZiwgMHg0MywgMHg0MywgMHg0MCwgMHgzYSwgMHgzOCwgMHgyOSwgMHg0MywgMHgzYSwgMHgzNywgMHg0MCwKLSAgICAweDNmLCAweDM1LCAweDNhLCAweDI4LCAweDM2LCAweDNlLCAweDNmLCAweDQzLCAweDNjLCAweDM5LCAweDQyLCAweDJjLAotICAgIDB4MzgsIDB4NDIsIDB4MzgsIDB4M2QsIDB4NDIsIDB4MzgsIDB4MzUsIDB4MmQsIDB4MzQsIDB4MzgsIDB4M2QsIDB4NDMsCi0gICAgMHg0NiwgMHgzZSwgMHgzYywgMHgyNywgMHgzZSwgMHg0MCwgMHg0NiwgMHgzOSwgMHgzNSwgMHgzZCwgMHg0MiwgMHgzNSwKLSAgICAweDQyLCAweDM2LCAweDQwLCAweDNlLCAweDNhLCAweDNlLCAweDNjLCAweDM3LCAweDNhLCAweDNjLCAweDQ4LCAweDQ4LAotICAgIDB4NDgsIDB4MzcsIDB4M2QsIDB4MzgsIDB4NGIsIDB4NDAsIDB4NDMsIDB4M2IsIDB4NDEsIDB4NDYsIDB4M2MsIDB4MzQsCi0gICAgMHg0NiwgMHgzYywgMHgzYywgMHgzYywgMHg0YiwgMHg2NCwgMHg0YSwgMHgyMiwgMHg1MiwgMHg0MSwgMHg0MiwgMHgzYiwKLSAgICAweDQyLCAweDRhLCAweDM0LCAweDM3LCAweDRiLCAweDQ0LCAweDNiLCAweDRhLCAweDM4LCAweDNmLCAweDM4LCAweDNhLAotICAgIDB4NDAsIDB4NDEsIDB4NDIsIDB4M2MsIDB4MzMsIDB4M2UsIDB4M2MsIDB4NDIsIDB4MmMsIDB4NGUsIDB4NDcsIDB4M2YsCi0gICAgMHgzOCwgMHgzMywgMHgzOSwgMHgzZiwgMHgzYiwgMHg0NSwgMHgzNywgMHgzYSwgMHg0MiwgMHg0MiwgMHg0NCwgMHgzZiwKLSAgICAweDNjLCAweDNjLCAweDNlLCAweDNkLCAweDNjLCAweDNjLCAweDQwLCAweDJjLCAweDNjLCAweDNkLCAweDQyLCAweDM5LAotICAgIDB4M2EsIDB4MzcsIDB4NDMsIDB4MmEsIDB4M2QsIDB4NDAsIDB4NDEsIDB4NDEsIDB4NDYsIDB4NDYsIDB4NDIsIDB4MjgsCi0gICAgMHgzOSwgMHgzYywgMHgzNywgMHg0NCwgMHg0NiwgMHg0MSwgMHg0NywgMHgyYiwgMHg0NCwgMHgzMywgMHgzOSwgMHgzZiwKLSAgICAweDNmLCAweDQzLCAweDNkLCAweDIzLCAweDNhLCAweDQzLCAweDQxLCAweDNiLCAweDQxLCAweDQyLCAweDMzLCAweDFmLAotICAgIDB4NDMsIDB4M2UsIDB4M2QsIDB4NDAsIDB4MzcsIDB4MzMsIDB4NDIsIDB4MjgsIDB4M2IsIDB4MzgsIDB4MzcsIDB4M2MsCi0gICAgMHgzNCwgMHg0MCwgMHg0NCwgMHgyYSwgMHgzYywgMHgzYSwgMHg0MSwgMHgzNywgMHg0NSwgMHgzZiwgMHgzZSwgMHgyNiwKLSAgICAweDQxLCAweDQwLCAweDM1LCAweDNkLCAweDQ1LCAweDNlLCAweDNkLCAweDI5LCAweDNjLCAweDM5LCAweDNmLCAweDNjLAotICAgIDB4M2QsIDB4MzksIDB4MzgsIDB4MmQsIDB4MzksIDB4MzgsIDB4MzgsIDB4NDQsIDB4M2MsIDB4M2UsIDB4MzgsIDB4MjYsCi0gICAgMHg0MCwgMHgzNiwgMHgzOSwgMHgzOCwgMHgzZiwgMHgzMiwgMHgzOSwgMHgzNSwgMHgzZCwgMHgzZSwgMHgzNSwgMHgzYSwKLSAgICAweDNmLCAweDNmLCAweDMxLCAweDM1LCAweDM0LCAweDQ1LCAweDNlLCAweDQzLCAweDQ4LCAweDNiLCAweDM3LCAweDM5LAotICAgIDB4NGQsIDB4NDYsIDB4NTQsIDB4NDAsIDB4NDEsIDB4NGUsIDB4M2QsIDB4MzgsIDB4NGQsIDB4MzgsIDB4M2EsIDB4M2IsCi0gICAgMHg0OSwgMHg1YSwgMHg0YSwgMHgxZSwgMHg1ZSwgMHgzOSwgMHgzOCwgMHgzNywgMHgzYSwgMHg1MSwgMHgzYSwgMHgzYywKLSAgICAweDUwLCAweDNmLCAweDQwLCAweDQyLCAweDMzLCAweDNiLCAweDJlLCAweDRhLCAweDNmLCAweDRhLCAweDNiLCAweDQzLAotICAgIDB4MzYsIDB4M2UsIDB4M2QsIDB4NDIsIDB4MzksIDB4NDYsIDB4NGIsIDB4M2MsIDB4M2IsIDB4M2IsIDB4MzUsIDB4M2UsCi0gICAgMHgzZCwgMHg0YiwgMHgzZiwgMHg0MSwgMHgzZiwgMHgzYiwgMHg0MiwgMHg0MiwgMHgzOCwgMHgzYSwgMHg0MSwgMHgzZCwKLSAgICAweDM2LCAweDQxLCAweDM3LCAweDJmLCAweDM4LCAweDM3LCAweDNmLCAweDM0LCAweDM1LCAweDM1LCAweDQ1LCAweDMwLAotICAgIDB4MzEsIDB4NDIsIDB4MzEsIDB4M2EsIDB4M2EsIDB4M2UsIDB4M2QsIDB4MjMsIDB4M2YsIDB4NDMsIDB4M2IsIDB4NDEsCi0gICAgMHgzNSwgMHgzYiwgMHg0MCwgMHgyNSwgMHg0NSwgMHgzZSwgMHg0MiwgMHgzYiwgMHgzMSwgMHg0MCwgMHgzNiwgMHgyOCwKLSAgICAweDQzLCAweDQyLCAweDMwLCAweDQyLCAweDMyLCAweDMyLCAweDM2LCAweDJjLCAweDM1LCAweDNhLCAweDNkLCAweDNhLAotICAgIDB4M2MsIDB4MzYsIDB4M2UsIDB4MzAsIDB4NDEsIDB4NDIsIDB4MzgsIDB4NDEsIDB4NDEsIDB4M2UsIDB4M2MsIDB4MjMsCi0gICAgMHgzNywgMHg0MCwgMHgzYywgMHgzZSwgMHgzZSwgMHgzYSwgMHgzNywgMHgyYiwgMHgzNiwgMHg0MCwgMHg0MSwgMHg0MiwKLSAgICAweDNlLCAweDM4LCAweDQ0LCAweDIyLCAweDQ2LCAweDM4LCAweDMzLCAweDNiLCAweDNhLCAweDNhLCAweDNhLCAweDI0LAotICAgIDB4MzYsIDB4M2IsIDB4MzgsIDB4NDQsIDB4MzQsIDB4MzgsIDB4NDAsIDB4MjgsIDB4MzgsIDB4M2QsIDB4MzYsIDB4NDQsCi0gICAgMHgzMSwgMHgzZSwgMHgzNywgMHgzNywgMHgzNiwgMHgzZiwgMHg0NywgMHgzOCwgMHgzYiwgMHgzZSwgMHgyYywgMHg0YywKLSAgICAweDM2LCAweDNjLCAweDNiLCAweDQxLCAweDRjLCAweDNkLCAweDNkLCAweDQwLCAweDQ5LCAweDQ0LCAweDUyLCAweDNmLAotICAgIDB4M2IsIDB4NGQsIDB4M2MsIDB4M2EsIDB4NGYsIDB4M2IsIDB4MzYsIDB4M2IsIDB4NGEsIDB4NWYsIDB4NGUsIDB4MWYsCi0gICAgMHg1NywgMHgzYywgMHgzZCwgMHgzZCwgMHg0NiwgMHg1OSwgMHg0MiwgMHg0NSwgMHg1MiwgMHgzZCwgMHgzYSwgMHg0MSwKLSAgICAweDMxLCAweDM5LCAweDM5LCAweDRmLCAweDQzLCAweDRlLCAweDNlLCAweDM3LCAweDNhLCAweDM3LCAweDMzLCAweDQ3LAotICAgIDB4MzIsIDB4NDUsIDB4NDcsIDB4NDMsIDB4MzEsIDB4MzMsIDB4MzgsIDB4NDMsIDB4M2UsIDB4NDcsIDB4M2QsIDB4MzIsCi0gICAgMHgzYiwgMHgzOSwgMHgzYywgMHg0MiwgMHgzZCwgMHg0NywgMHg0MiwgMHg0MCwgMHgzZCwgMHgzZiwgMHgzYywgMHgzNCwKLSAgICAweDNiLCAweDNlLCAweDQyLCAweDNkLCAweDQzLCAweDM1LCAweDQyLCAweDJjLCAweDM1LCAweDNkLCAweDNjLCAweDNkLAotICAgIDB4M2EsIDB4M2MsIDB4NDYsIDB4MjUsIDB4NDMsIDB4MzUsIDB4M2QsIDB4MzksIDB4M2EsIDB4M2MsIDB4NDAsIDB4MmIsCi0gICAgMHgzMywgMHg0MCwgMHgzZCwgMHg0NiwgMHg0NSwgMHgzNywgMHgzYywgMHgzNiwgMHg0MywgMHgzNywgMHgzZSwgMHgzYSwKLSAgICAweDNjLCAweDQ3LCAweDNmLCAweDM4LCAweDM2LCAweDNlLCAweDNhLCAweDQyLCAweDNjLCAweDQyLCAweDMzLCAweDM5LAotICAgIDB4M2MsIDB4M2EsIDB4M2MsIDB4NDAsIDB4NDgsIDB4M2IsIDB4NDAsIDB4MzIsIDB4MzcsIDB4NDcsIDB4MzQsIDB4MzgsCi0gICAgMHgzMywgMHgzZCwgMHg0OSwgMHgyZCwgMHgzNiwgMHg0MiwgMHgzZCwgMHgzZSwgMHg0NywgMHgzYywgMHg0MiwgMHgyYywKLSAgICAweDNiLCAweDMxLCAweDNmLCAweDNjLCAweDNkLCAweDNjLCAweDNmLCAweDJiLCAweDQxLCAweDM1LCAweDMzLCAweDQzLAotICAgIDB4NDcsIDB4MzksIDB4MzQsIDB4MmEsIDB4M2EsIDB4M2EsIDB4NDAsIDB4M2QsIDB4NDQsIDB4M2MsIDB4MzksIDB4MzQsCi0gICAgMHg0MywgMHg0MCwgMHgzMywgMHgzYSwgMHgzYiwgMHg0MiwgMHgzOCwgMHgzYiwgMHgzNCwgMHgzNSwgMHg0MCwgMHg0MywKLSAgICAweDRiLCAweDQxLCAweDNkLCAweDM4LCAweDQ5LCAweDQ0LCAweDRkLCAweDM3LCAweDNhLCAweDRiLCAweDQwLCAweDM5LAotICAgIDB4NGUsIDB4M2IsIDB4MzAsIDB4MzgsIDB4NDcsIDB4NWQsIDB4NTAsIDB4MWYsIDB4NTQsIDB4MzUsIDB4M2EsIDB4MzksCi0gICAgMHg0MCwgMHg0YywgMHg0NiwgMHg0MiwgMHg1MiwgMHgzOSwgMHgzOSwgMHg0NSwgMHg0MSwgMHgzYywgMHgzMCwgMHg1YiwKLSAgICAweDQzLCAweDRkLCAweDRhLCAweDNlLCAweDMxLCAweDM5LCAweDQxLCAweDRjLCAweDM2LCAweDQ0LCAweDRjLCAweDM5LAotICAgIDB4MzIsIDB4NDEsIDB4NDcsIDB4M2UsIDB4MzQsIDB4NDksIDB4NDUsIDB4M2IsIDB4MzQsIDB4M2EsIDB4M2IsIDB4NDcsCi0gICAgMHg0MywgMHgzZSwgMHg0MywgMHgzMiwgMHg0MCwgMHgzZSwgMHgzZSwgMHgzOCwgMHgzNywgMHgzZSwgMHgzNywgMHgzYSwKLSAgICAweDNhLCAweDQwLCAweDQ4LCAweDJmLCAweDNlLCAweDNlLCAweDQ2LCAweDNhLCAweDNlLCAweDM1LCAweDQ5LCAweDMwLAotICAgIDB4M2EsIDB4NDEsIDB4M2UsIDB4MzksIDB4MzQsIDB4NDUsIDB4M2QsIDB4MzQsIDB4NDgsIDB4NDMsIDB4NDMsIDB4NDIsCi0gICAgMHgzMywgMHgzOSwgMHgzYiwgMHgzZiwgMHgzMCwgMHg0NiwgMHg0MSwgMHgzOSwgMHg0OCwgMHgzYSwgMHgzYywgMHgzZSwKLSAgICAweDNmLCAweDM2LCAweDQwLCAweDNkLCAweDQzLCAweDQwLCAweDNlLCAweDM5LCAweDQ0LCAweDQwLCAweDQ0LCAweDNiLAotICAgIDB4NDMsIDB4NDIsIDB4MzksIDB4MzgsIDB4M2EsIDB4M2YsIDB4M2IsIDB4M2YsIDB4MzgsIDB4M2QsIDB4MzQsIDB4MzAsCi0gICAgMHgzNCwgMHgzZCwgMHgzZiwgMHg0MiwgMHg0NCwgMHgzZSwgMHgzNCwgMHgzMiwgMHgzNywgMHg0NiwgMHg0NCwgMHgzOCwKLSAgICAweDNjLCAweDQ1LCAweDM5LCAweDJiLCAweDQxLCAweDNjLCAweDQwLCAweDQwLCAweDNhLCAweDNhLCAweDNjLCAweDMyLAotICAgIDB4NDUsIDB4NDIsIDB4M2QsIDB4NDYsIDB4MzgsIDB4M2IsIDB4MzQsIDB4MzUsIDB4MzgsIDB4NDMsIDB4M2QsIDB4MzQsCi0gICAgMHg0MiwgMHgzYiwgMHgzOCwgMHgzZCwgMHgzNywgMHg0MywgMHgzZiwgMHgzOSwgMHg0ZSwgMHgzOSwgMHg0MCwgMHgzZiwKLSAgICAweDRkLCAweDQzLCAweDQ5LCAweDNmLCAweDM2LCAweDQxLCAweDQ0LCAweDM5LCAweDQ4LCAweDNhLCAweDM1LCAweDM5LAotICAgIDB4NDgsIDB4NTksIDB4NGUsIDB4MjUsIDB4NTgsIDB4MzksIDB4NDIsIDB4MzUsIDB4NDMsIDB4NGUsIDB4NDIsIDB4M2YsCi0gICAgMHg0YSwgMHg0MywgMHgzYiwgMHgzZiwgMHgzYiwgMHgzNywgMHgyYiwgMHg1YSwgMHgzZCwgMHg0NCwgMHgzYiwgMHg0MCwKLSAgICAweDMxLCAweDM4LCAweDM3LCAweDQ0LCAweDMyLCAweDNlLCAweDQxLCAweDNkLCAweDJjLCAweDQyLCAweDQyLCAweDNjLAotICAgIDB4MzcsIDB4NDUsIDB4NDEsIDB4NDEsIDB4M2QsIDB4MzksIDB4NDEsIDB4NDAsIDB4M2EsIDB4NDYsIDB4NDEsIDB4NDAsCi0gICAgMHg0MCwgMHgzZCwgMHgzOCwgMHgzMSwgMHgzNywgMHgzZiwgMHg0MiwgMHgzOCwgMHgzZiwgMHgzYywgMHg0OCwgMHgzMCwKLSAgICAweDNlLCAweDM5LCAweDNmLCAweDNkLCAweDNkLCAweDQ0LCAweDUyLCAweDM1LCAweDNiLCAweDMyLCAweDQyLCAweDMyLAotICAgIDB4M2EsIDB4NDMsIDB4MzksIDB4M2IsIDB4MzEsIDB4NDMsIDB4MzYsIDB4M2MsIDB4M2MsIDB4M2MsIDB4NDEsIDB4NDUsCi0gICAgMHg0MiwgMHg0OSwgMHg0MSwgMHgzYiwgMHg0MiwgMHgzZSwgMHg0MSwgMHg0NCwgMHgzNiwgMHg0MSwgMHgzZiwgMHgzYywKLSAgICAweDNlLCAweDQ3LCAweDQ1LCAweDQxLCAweDM4LCAweDQxLCAweDNmLCAweDQzLCAweDM1LCAweDMyLCAweDQxLCAweDM5LAotICAgIDB4MzYsIDB4NDcsIDB4MzUsIDB4NDIsIDB4NDQsIDB4M2IsIDB4M2YsIDB4MzQsIDB4NDgsIDB4NDEsIDB4NDMsIDB4NDIsCi0gICAgMHgzNiwgMHgzZSwgMHgzYywgMHgzZCwgMHgzZCwgMHgzYiwgMHg0MiwgMHg0NCwgMHgzYSwgMHg0NCwgMHgzNiwgMHgyYSwKLSAgICAweDQxLCAweDM5LCAweDNhLCAweDQxLCAweDQ2LCAweDNjLCAweDQ0LCAweDJmLCAweDM2LCAweDM5LCAweDNiLCAweDNmLAotICAgIDB4MzgsIDB4NDUsIDB4M2MsIDB4M2MsIDB4M2UsIDB4NDEsIDB4M2MsIDB4MzksIDB4M2UsIDB4NDAsIDB4MmYsIDB4NDUsCi0gICAgMHgzYiwgMHg0MSwgMHg0MCwgMHgzYywgMHg0ZSwgMHgzOCwgMHgzZSwgMHg0OCwgMHg0NiwgMHg0MCwgMHg0OCwgMHg0NCwKLSAgICAweDQwLCAweDRhLCAweDQ1LCAweDNjLCAweDRmLCAweDM5LCAweDM3LCAweDNhLCAweDRlLCAweDU5LCAweDVjLCAweDIyLAotICAgIDB4NTgsIDB4MzIsIDB4MzgsIDB4MzQsIDB4NDAsIDB4NGIsIDB4NDMsIDB4NDMsIDB4NGYsIDB4M2UsIDB4MzksIDB4NDAsCi0gICAgMHgzNywgMHgzZSwgMHgyZiwgMHg1NSwgMHgzZiwgMHg0MCwgMHgzOCwgMHgzZiwgMHgzYSwgMHgzMywgMHgzNywgMHgzZCwKLSAgICAweDM0LCAweDRjLCAweDM3LCAweDNmLCAweDMyLCAweDM5LCAweDQ1LCAweDM0LCAweDQ0LCAweDRjLCAweDNmLCAweDNiLAotICAgIDB4M2MsIDB4MzYsIDB4MzYsIDB4NDMsIDB4MzYsIDB4NDcsIDB4NDEsIDB4NDYsIDB4NDEsIDB4M2UsIDB4NDEsIDB4M2EsCi0gICAgMHg0MywgMHgzYSwgMHg0OCwgMHg0MiwgMHg0MiwgMHgzZSwgMHg0YywgMHgzNiwgMHgzZCwgMHgzOSwgMHg0MywgMHg0NiwKLSAgICAweDNkLCAweDQyLCAweDQyLCAweDNiLCAweDQ1LCAweDQzLCAweDNjLCAweDQwLCAweDM5LCAweDM3LCAweDM0LCAweDQ1LAotICAgIDB4M2YsIDB4NDAsIDB4MzQsIDB4MzgsIDB4NDMsIDB4M2YsIDB4MzYsIDB4NDcsIDB4M2YsIDB4M2IsIDB4NDksIDB4M2MsCi0gICAgMHgzYSwgMHgzYSwgMHg0MiwgMHg0YywgMHgzNywgMHgzZSwgMHgzYiwgMHgzMiwgMHg0NywgMHg0MCwgMHg0NSwgMHg0ZCwKLSAgICAweDM5LCAweDNiLCAweDM5LCAweDQwLCAweDNlLCAweDNjLCAweDNkLCAweDNhLCAweDNkLCAweDNiLCAweDNlLCAweDQzLAotICAgIDB4M2UsIDB4M2YsIDB4M2EsIDB4M2MsIDB4NDEsIDB4NDAsIDB4MzksIDB4M2MsIDB4M2EsIDB4MzgsIDB4MzksIDB4MzcsCi0gICAgMHgzNiwgMHgzMywgMHg0MywgMHg0NSwgMHgzZiwgMHg0NSwgMHg0MSwgMHgzMCwgMHgzYiwgMHgzNCwgMHgzYywgMHgzOSwKLSAgICAweDNiLCAweDQ1LCAweDM3LCAweDJlLCAweDM2LCAweDM0LCAweDM2LCAweDQ0LCAweDNkLCAweDQwLCAweDNhLCAweDNjLAotICAgIDB4M2QsIDB4M2IsIDB4MzgsIDB4NDEsIDB4NDIsIDB4M2EsIDB4MzIsIDB4NGIsIDB4MzgsIDB4M2UsIDB4NDEsIDB4NDYsCi0gICAgMHg1NywgMHgzYSwgMHg0NCwgMHg0OCwgMHg0NywgMHg0NSwgMHg0NywgMHgzZSwgMHg0MywgMHg0MiwgMHg0NSwgMHgzYiwKLSAgICAweDUwLCAweDM5LCAweDM3LCAweDNmLCAweDQ3LCAweDUxLCAweDVlLCAweDIyLCAweDU5LCAweDMzLCAweDNjLCAweDM3LAotICAgIDB4NDMsIDB4NTAsIDB4NDksIDB4NDcsIDB4NDYsIDB4NDIsIDB4MzksIDB4NDQsIDB4NDQsIDB4M2QsIDB4MmYsIDB4NTMsCi0gICAgMHgzNSwgMHg0MSwgMHg0MCwgMHgzZCwgMHgyZCwgMHgzNSwgMHgyZiwgMHgzZSwgMHgzZiwgMHgzNywgMHgzOCwgMHgzZSwKLSAgICAweDMwLCAweDQ1LCAweDQ2LCAweDM4LCAweDMzLCAweDNjLCAweDNlLCAweDNiLCAweDQ0LCAweDQyLCAweDQ3LCAweDQ5LAotICAgIDB4NDMsIDB4NDAsIDB4M2QsIDB4M2MsIDB4MzgsIDB4NDMsIDB4M2UsIDB4MzgsIDB4M2QsIDB4NDAsIDB4MzYsIDB4NDMsCi0gICAgMHg0MywgMHgzZSwgMHg0MCwgMHgzYywgMHg0NCwgMHg0NywgMHg0MywgMHgzZCwgMHg0MSwgMHgzOSwgMHgzZSwgMHg0NSwKLSAgICAweDM5LCAweDNkLCAweDM5LCAweDQwLCAweDQyLCAweDQwLCAweDNiLCAweDRhLCAweDQwLCAweDQxLCAweDNmLCAweDM3LAotICAgIDB4NDMsIDB4NDEsIDB4MzcsIDB4NGMsIDB4M2YsIDB4M2QsIDB4MzgsIDB4M2EsIDB4NDIsIDB4NDYsIDB4NDMsIDB4NGQsCi0gICAgMHgzYywgMHgzYSwgMHg0MywgMHgzZSwgMHgzYiwgMHgzZCwgMHg0NiwgMHg0YSwgMHgzOCwgMHgzZCwgMHgzZCwgMHgzOSwKLSAgICAweDNlLCAweDNjLCAweDNiLCAweDNlLCAweDNhLCAweDQwLCAweDQwLCAweDM0LCAweDQxLCAweDNmLCAweDNlLCAweDNmLAotICAgIDB4NDcsIDB4M2MsIDB4MzIsIDB4M2EsIDB4M2MsIDB4NDQsIDB4M2YsIDB4NDIsIDB4NDEsIDB4NDMsIDB4M2UsIDB4M2EsCi0gICAgMHgzYiwgMHg0MiwgMHg0MSwgMHgzOSwgMHgzOSwgMHgzNywgMHgzOSwgMHgzZSwgMHgzZCwgMHgzMywgMHgzZSwgMHgzNSwKLSAgICAweDQ0LCAweDM3LCAweDQwLCAweDM1LCAweDNmLCAweDQ3LCAweDM3LCAweDQxLCAweDM1LCAweDM4LCAweDQ3LCAweDQwLAotICAgIDB4NDMsIDB4NDQsIDB4MmUsIDB4NDgsIDB4MzUsIDB4NDQsIDB4NDEsIDB4M2MsIDB4NDcsIDB4M2QsIDB4M2QsIDB4NTIsCi0gICAgMHg0OCwgMHg0MSwgMHg0NCwgMHg0MSwgMHg0MiwgMHg0YiwgMHgzZSwgMHgzZCwgMHg0ZSwgMHgzMiwgMHgzNCwgMHg0NywKLSAgICAweDU1LCAweDU3LCAweDVmLCAweDIyLCAweDU3LCAweDMzLCAweDQwLCAweDM3LCAweDQwLCAweDRhLCAweDRkLCAweDQ3LAotICAgIDB4NDgsIDB4MzgsIDB4M2UsIDB4NDYsIDB4MzcsIDB4NDIsIDB4MjgsIDB4NTcsIDB4MzgsIDB4NDIsIDB4MzYsIDB4NDMsCi0gICAgMHgzNSwgMHgzNywgMHgzOSwgMHgzOSwgMHg0MiwgMHgzOSwgMHgzOCwgMHgzYywgMHgzNSwgMHgzYywgMHgzYywgMHgzYSwKLSAgICAweDNjLCAweDRjLCAweDQ1LCAweDNmLCAweDQzLCAweDNkLCAweDQ1LCAweDQ1LCAweDQwLCAweDQ3LCAweDNlLCAweDNlLAotICAgIDB4M2QsIDB4NGIsIDB4NDksIDB4MzUsIDB4NDMsIDB4M2MsIDB4MzYsIDB4NDYsIDB4M2MsIDB4NDYsIDB4NDIsIDB4NDQsCi0gICAgMHgzYywgMHg0MiwgMHgzZCwgMHg0MiwgMHg0NCwgMHgzYywgMHg0YSwgMHg0MCwgMHg0MCwgMHgzYywgMHgzYiwgMHgzYywKLSAgICAweDM1LCAweDM0LCAweDJlLCAweDQ2LCAweDM4LCAweDNkLCAweDM4LCAweDQ0LCAweDQxLCAweDQwLCAweDNjLCAweDUyLAotICAgIDB4M2IsIDB4M2QsIDB4M2IsIDB4M2YsIDB4NDIsIDB4NDcsIDB4NDQsIDB4NTIsIDB4NDQsIDB4NDQsIDB4MzksIDB4M2YsCi0gICAgMHg0MywgMHgzNSwgMHgzYywgMHg0ZCwgMHgzOSwgMHgzZCwgMHgzYiwgMHgzNywgMHgzZSwgMHgzOCwgMHgzZSwgMHg0OSwKLSAgICAweDNhLCAweDM3LCAweDNjLCAweDQ5LCAweDQwLCAweDQxLCAweDNjLCAweDQwLCAweDNkLCAweDM4LCAweDM5LCAweDNmLAotICAgIDB4NDQsIDB4M2UsIDB4NDIsIDB4M2UsIDB4NDcsIDB4NDAsIDB4MzQsIDB4NDYsIDB4NDgsIDB4MzcsIDB4NDUsIDB4M2UsCi0gICAgMHg0NiwgMHgzZiwgMHgzNSwgMHgzOSwgMHgzOCwgMHgzZiwgMHgzNiwgMHgyYywgMHg0MCwgMHgzOCwgMHgzZSwgMHgzYywKLSAgICAweDMyLCAweDNjLCAweDQ2LCAweDNhLCAweDNmLCAweDQxLCAweDM2LCAweDQ5LCAweDQyLCAweDM4LCAweDM2LCAweDQzLAotICAgIDB4M2QsIDB4NDEsIDB4NDYsIDB4MzUsIDB4NGYsIDB4M2EsIDB4NDEsIDB4NWMsIDB4NGEsIDB4NDIsIDB4NGUsIDB4NDIsCi0gICAgMHg0NiwgMHg1NCwgMHgzZiwgMHg0NSwgMHg0YywgMHgzMCwgMHgzMywgMHg0NCwgMHg1NiwgMHg1ZCwgMHg2OCwgMHgyNiwKLSAgICAweDYwLCAweDMzLCAweDNlLCAweDNhLCAweDQyLCAweDQ5LCAweDUyLCAweDQ3LCAweDUxLCAweDQ2LCAweDQwLCAweDQ3LAotICAgIDB4NDEsIDB4M2IsIDB4MWIsIDB4NGYsIDB4M2MsIDB4NDUsIDB4M2QsIDB4M2QsIDB4MzIsIDB4MmYsIDB4M2UsIDB4M2MsCi0gICAgMHgzYywgMHgzZiwgMHgzYiwgMHgzYywgMHgyYywgMHgzYSwgMHg0MSwgMHgzYywgMHgzNSwgMHgzZSwgMHgzZSwgMHgzYywKLSAgICAweDNkLCAweDNmLCAweDNlLCAweDQwLCAweDQwLCAweDQ0LCAweDQyLCAweDNjLCAweDNjLCAweDNjLCAweDQxLCAweDNjLAotICAgIDB4M2MsIDB4M2QsIDB4M2UsIDB4M2QsIDB4M2MsIDB4M2QsIDB4NGEsIDB4NDYsIDB4M2YsIDB4MzUsIDB4MzMsIDB4NDMsCi0gICAgMHg0MiwgMHg0MSwgMHg0ZCwgMHg0OCwgMHg0OCwgMHg0NCwgMHgzZSwgMHg0MSwgMHg0MSwgMHgzNiwgMHgzYywgMHg0YywKLSAgICAweDM0LCAweDQ3LCAweDQyLCAweDM5LCAweDNlLCAweDQzLCAweDNhLCAweDUzLCAweDNiLCAweDNiLCAweDQyLCAweDNkLAotICAgIDB4NDEsIDB4M2MsIDB4M2UsIDB4NTIsIDB4M2EsIDB4NDQsIDB4MzQsIDB4NDMsIDB4M2QsIDB4M2QsIDB4M2EsIDB4NTAsCi0gICAgMHgzZSwgMHgzMywgMHg0MSwgMHg0MCwgMHgzZiwgMHgzOCwgMHg0MywgMHg0MiwgMHgzYiwgMHgzNywgMHgzZSwgMHg0MywKLSAgICAweDNmLCAweDNjLCAweDQxLCAweDQ5LCAweDQwLCAweDMyLCAweDQwLCAweDNlLCAweDNiLCAweDNlLCAweDQ0LCAweDNjLAotICAgIDB4MzUsIDB4MzcsIDB4M2QsIDB4NDEsIDB4MzQsIDB4M2YsIDB4M2EsIDB4M2MsIDB4NDcsIDB4MzIsIDB4NDEsIDB4M2QsCi0gICAgMHgzYywgMHgzYSwgMHg0YSwgMHgzMSwgMHg0MywgMHgzOCwgMHg0NSwgMHgzNywgMHg0OSwgMHgzYywgMHgzNCwgMHgzZiwKLSAgICAweDNkLCAweDNkLCAweDNkLCAweDQ1LCAweDQ3LCAweDNlLCAweDM3LCAweDQ4LCAweDQwLCAweDNiLCAweDQ1LCAweDNkLAotICAgIDB4NGUsIDB4NDIsIDB4M2YsIDB4NTcsIDB4NGIsIDB4NDMsIDB4NGIsIDB4M2QsIDB4M2YsIDB4NDcsIDB4NGEsIDB4NDMsCi0gICAgMHg0ZSwgMHgzMCwgMHgzOCwgMHg0NSwgMHg1OSwgMHg2MCwgMHg2NCwgMHgyZCwgMHg1YSwgMHgyZCwgMHgzNCwgMHgzNSwKLSAgICAweDQ3LCAweDU0LCAweDRlLCAweDNmLCAweDQ0LCAweDQ1LCAweDNjLCAweDQzLCAweDNkLCAweDQwLCAweDFjLCAweDVhLAotICAgIDB4MzYsIDB4M2YsIDB4M2EsIDB4MzksIDB4MzcsIDB4M2MsIDB4MzIsIDB4M2IsIDB4MmQsIDB4NGEsIDB4NDIsIDB4MzUsCi0gICAgMHgzMCwgMHg0MSwgMHg0MywgMHgzZCwgMHgzZCwgMHg0NSwgMHgzOCwgMHgzNiwgMHgzZSwgMHg0MCwgMHgzYSwgMHg0YSwKLSAgICAweDM0LCAweDNkLCAweDQ0LCAweDNjLCAweDM5LCAweDNiLCAweDUyLCAweDM4LCAweDQwLCAweDNiLCAweDNmLCAweDNmLAotICAgIDB4MzUsIDB4MzcsIDB4NDYsIDB4NDgsIDB4MzgsIDB4M2IsIDB4NDAsIDB4MzYsIDB4M2QsIDB4M2EsIDB4NGYsIDB4NDUsCi0gICAgMHgzNSwgMHgzYSwgMHgzNSwgMHgzMywgMHgzNywgMHg0MywgMHg0MiwgMHg1MiwgMHgzNywgMHgzYiwgMHgzZCwgMHg0MiwKLSAgICAweDQ0LCAweDNkLCAweDQ4LCAweDU4LCAweDMzLCAweDNmLCAweDQxLCAweDQ0LCAweDQ0LCAweDNmLCAweDNiLCAweDUyLAotICAgIDB4NDcsIDB4MzksIDB4MzIsIDB4M2IsIDB4MzgsIDB4MzUsIDB4NDgsIDB4NTAsIDB4MzQsIDB4MzAsIDB4MzksIDB4NDMsCi0gICAgMHg0MiwgMHg0MCwgMHgzYiwgMHg0YiwgMHg0MywgMHgzZCwgMHgzNCwgMHg0NCwgMHgzMywgMHgzOSwgMHg0NCwgMHg0YiwKLSAgICAweDQ1LCAweDNlLCAweDNjLCAweDNmLCAweDNhLCAweDNlLCAweDNjLCAweDQ1LCAweDM2LCAweDNlLCAweDNkLCAweDQwLAotICAgIDB4NDMsIDB4NDYsIDB4MzcsIDB4M2QsIDB4M2IsIDB4NDIsIDB4NDMsIDB4M2YsIDB4M2EsIDB4NDEsIDB4NDgsIDB4MmYsCi0gICAgMHgzZSwgMHgzOSwgMHgzYSwgMHgzOSwgMHgzZiwgMHgzYSwgMHg0MSwgMHg0MCwgMHg0MCwgMHgzYywgMHgzYiwgMHgzYiwKLSAgICAweDNmLCAweDQwLCAweDNlLCAweDQyLCAweDM4LCAweDNmLCAweDM4LCAweDNjLCAweDQ5LCAweDQ1LCAweDNmLCAweDYyLAotICAgIDB4NTUsIDB4NDcsIDB4NGMsIDB4M2MsIDB4M2MsIDB4NGEsIDB4NGMsIDB4NDYsIDB4NGYsIDB4MzksIDB4M2EsIDB4M2IsCi0gICAgMHg1ZSwgMHg1OCwgMHg2ZiwgMHgyYiwgMHg1YSwgMHgyZiwgMHgzYSwgMHgzNSwgMHg0YiwgMHg0NywgMHg0YSwgMHg0NiwKLSAgICAweDQ1LCAweDNlLCAweDM4LCAweDRmLCAweDNiLCAweDNkLCAweDIxLCAweDRiLCAweDNkLCAweDQwLCAweDM3LCAweDQwLAotICAgIDB4MmQsIDB4MmMsIDB4NDMsIDB4M2YsIDB4MmIsIDB4M2UsIDB4M2QsIDB4MzksIDB4MmYsIDB4MzksIDB4NDQsIDB4M2MsCi0gICAgMHgzOSwgMHgzOSwgMHg0MywgMHgzYiwgMHgzZCwgMHgzYiwgMHg0NCwgMHgzOSwgMHg0MiwgMHg0MiwgMHgzZSwgMHg0MCwKLSAgICAweDNiLCAweDQyLCAweDUzLCAweDQwLCAweDMyLCAweDNkLCAweDM1LCAweDNmLCAweDNkLCAweDQ1LCAweDQ4LCAweDQ2LAotICAgIDB4M2QsIDB4NDMsIDB4M2MsIDB4MzYsIDB4MzUsIDB4MzksIDB4M2QsIDB4NGEsIDB4MzksIDB4MzksIDB4M2UsIDB4NDEsCi0gICAgMHgzOCwgMHgzNiwgMHgzYiwgMHg1MywgMHgzYywgMHgzNiwgMHgzMiwgMHgzYiwgMHg0MywgMHgzZCwgMHg0MiwgMHg1NywKLSAgICAweDM1LCAweDJmLCAweDM4LCAweDQwLCAweDJmLCAweDNkLCAweDNjLCAweDRjLCAweDQwLCAweDJmLCAweDNhLCAweDM2LAotICAgIDB4MzksIDB4M2MsIDB4M2EsIDB4NTEsIDB4M2QsIDB4MzcsIDB4MzksIDB4M2MsIDB4NDIsIDB4NDAsIDB4NDMsIDB4NTIsCi0gICAgMHgzZSwgMHg0MiwgMHgzZSwgMHg0NSwgMHgzNiwgMHgzNCwgMHg0MiwgMHg0YiwgMHgzYSwgMHgzOCwgMHgzNywgMHgzZiwKLSAgICAweDM2LCAweDQxLCAweDNhLCAweDQ1LCAweDNlLCAweDM4LCAweDM1LCAweDQxLCAweDM1LCAweDM0LCAweDM3LCAweDNjLAotICAgIDB4M2YsIDB4MzEsIDB4M2MsIDB4MzUsIDB4MzMsIDB4NDMsIDB4MzYsIDB4MjgsIDB4NDQsIDB4NDIsIDB4M2UsIDB4NDIsCi0gICAgMHgzYSwgMHg0MSwgMHg0MywgMHgzNSwgMHgzZCwgMHgzZiwgMHg0MCwgMHgzZSwgMHgzZCwgMHgzMywgMHgzMSwgMHg0MSwKLSAgICAweDNkLCAweDQwLCAweDNiLCAweDQwLCAweDUxLCAweDQwLCAweDNmLCAweGZiLCAweDUxLCAweDQ5LCAweDRjLCAweDNkLAotICAgIDB4NDQsIDB4NGUsIDB4NDcsIDB4NDIsIDB4NTAsIDB4MzksIDB4MzksIDB4NDAsIDB4NTksIDB4NWQsIDB4NzAsIDB4MmMsCi0gICAgMHg1OSwgMHgzOSwgMHgzOCwgMHgyZiwgMHg0NiwgMHg1MCwgMHg1MSwgMHg0NywgMHg0YywgMHgzYywgMHgzOSwgMHg0OCwKLSAgICAweDQ0LCAweDNhLCAweDFhLCAweDUxLCAweDM1LCAweDNlLCAweDM0LCAweDNhLCAweDNkLCAweDJiLCAweDQxLCAweDM5LAotICAgIDB4MzcsIDB4NGQsIDB4M2UsIDB4NDMsIDB4MzgsIDB4M2IsIDB4M2EsIDB4MzUsIDB4MzYsIDB4M2EsIDB4NDMsIDB4MzksCi0gICAgMHgzOSwgMHgzYSwgMHg0NiwgMHgzYiwgMHgzOSwgMHgzYywgMHg0NiwgMHgzNiwgMHgzZSwgMHgzZCwgMHg0YiwgMHgzZCwKLSAgICAweDNiLCAweDQ2LCAweDNhLCAweDQxLCAweDMxLCAweDNjLCAweDQ0LCAweDRhLCAweDM3LCAweDQyLCAweDM5LCAweDQzLAotICAgIDB4NDMsIDB4M2UsIDB4NDAsIDB4NDcsIDB4M2MsIDB4M2UsIDB4M2IsIDB4NDMsIDB4MzQsIDB4M2EsIDB4NDMsIDB4NTMsCi0gICAgMHgzZiwgMHgzNywgMHgzOSwgMHgzNywgMHgzZSwgMHgzYiwgMHg0NiwgMHg1OSwgMHgzNywgMHgzNywgMHgzMywgMHgzZCwKLSAgICAweDM4LCAweDQyLCAweDM2LCAweDU4LCAweDJlLCAweDMyLCAweDJiLCAweDQ1LCAweDMyLCAweDMzLCAweDM2LCAweDUwLAotICAgIDB4NDEsIDB4M2YsIDB4MzcsIDB4M2QsIDB4M2YsIDB4M2QsIDB4NDYsIDB4NDksIDB4NDEsIDB4MzgsIDB4MzMsIDB4M2QsCi0gICAgMHgzMywgMHgzMiwgMHgzYSwgMHg0OSwgMHg0MSwgMHg0MSwgMHgzZCwgMHgzMywgMHgzYiwgMHgzYiwgMHgzYSwgMHg0NiwKLSAgICAweDM0LCAweDQ0LCAweDNmLCAweDNiLCAweDJmLCAweDNmLCAweDMyLCAweDNjLCAweDNmLCAweDQzLCAweDNlLCAweDQ1LAotICAgIDB4M2EsIDB4M2MsIDB4NDMsIDB4MjYsIDB4NDYsIDB4MzcsIDB4MzgsIDB4M2UsIDB4MzYsIDB4MzEsIDB4M2UsIDB4MzQsCi0gICAgMHgzOSwgMHgzYSwgMHgzOCwgMHg0MiwgMHgzOCwgMHgzZSwgMHgzMiwgMHg0MiwgMHgzNywgMHgzNywgMHgzYywgMHgzYSwKLSAgICAweDQ4LCAweDQ0LCAweDNhLCAweDY4LCAweDU2LCAweDQ2LCAweDRkLCAweDQ3LCAweDQwLCAweDRlLCAweDQyLCAweDQ2LAotICAgIDB4NTEsIDB4NDAsIDB4MzgsIDB4NDMsIDB4NTgsIDB4NWQsIDB4NmEsIDB4MzEsIDB4NTcsIDB4MzIsIDB4M2MsIDB4MzYsCi0gICAgMHg0OSwgMHg1NiwgMHg1MiwgMHg0OCwgMHg0YiwgMHg0MSwgMHgyZiwgMHg0ZCwgMHgzMSwgMHg0MywgMHgxYiwgMHg0YywKLSAgICAweDMwLCAweDQ0LCAweDMzLCAweDM2LCAweDJjLCAweDNkLCAweDQ1LCAweDNhLCAweDM1LCAweDQ2LCAweDNkLCAweDM5LAotICAgIDB4MmUsIDB4MzgsIDB4M2YsIDB4MzcsIDB4NDEsIDB4NDQsIDB4NDYsIDB4MzEsIDB4MzMsIDB4NDYsIDB4MzcsIDB4MzcsCi0gICAgMHgzZiwgMHg0MSwgMHg0NSwgMHgzMCwgMHg0NiwgMHgzYiwgMHg1MCwgMHgzYiwgMHg0MCwgMHgzOSwgMHg0MiwgMHg0MywKLSAgICAweDM1LCAweDM3LCAweDQwLCAweDQ0LCAweDNiLCAweDQxLCAweDNkLCAweDM3LCAweDNhLCAweDQxLCAweDNkLCAweDQ2LAotICAgIDB4MzYsIDB4NDEsIDB4MzgsIDB4NDEsIDB4MzgsIDB4M2QsIDB4NDUsIDB4NTgsIDB4M2QsIDB4M2EsIDB4M2QsIDB4NDQsCi0gICAgMHg0NSwgMHgzOCwgMHg0OCwgMHg1YywgMHgzZCwgMHgzOSwgMHg0MywgMHg0NSwgMHg0MSwgMHgzZSwgMHg0YSwgMHg1NiwKLSAgICAweDQwLCAweDMzLCAweDMwLCAweDMxLCAweDQyLCAweDM5LCAweDM4LCAweDU2LCAweDMwLCAweDNhLCAweDM1LCAweDNlLAotICAgIDB4M2YsIDB4MzgsIDB4MzYsIDB4NDcsIDB4M2MsIDB4M2EsIDB4M2QsIDB4M2YsIDB4MzcsIDB4MzUsIDB4M2IsIDB4NGQsCi0gICAgMHg0MywgMHgzNiwgMHgzOSwgMHgzNywgMHgzZSwgMHg0MiwgMHgzZCwgMHgzZiwgMHg0MCwgMHgzZiwgMHgzNCwgMHgzYiwKLSAgICAweDNmLCAweDNlLCAweDNiLCAweDM5LCAweDNiLCAweDNhLCAweDNhLCAweDNjLCAweDM0LCAweDNmLCAweDNjLCAweDJhLAotICAgIDB4NDksIDB4M2IsIDB4MzYsIDB4M2MsIDB4MzUsIDB4NDYsIDB4MzgsIDB4M2IsIDB4M2MsIDB4MzksIDB4MzgsIDB4NDIsCi0gICAgMHgzOSwgMHgzNiwgMHgyZSwgMHg0YSwgMHgzZCwgMHgzOSwgMHgzZiwgMHgzZiwgMHg0YiwgMHg0NSwgMHgzZSwgMHg2NywKLSAgICAweDRiLCAweDRiLCAweDQ5LCAweDNlLCAweDNmLCAweDUzLCAweDRjLCAweDU1LCAweDQ3LCAweDMyLCAweDNiLCAweDM5LAotICAgIDB4NTQsIDB4NWIsIDB4NmYsIDB4MjksIDB4NWEsIDB4MzQsIDB4M2UsIDB4MjYsIDB4NDUsIDB4NTIsIDB4NTksIDB4NDQsCi0gICAgMHg1OSwgMHgzOSwgMHgzYywgMHg0NywgMHgzNiwgMHg0NiwgMHgxNiwgMHg1MCwgMHgzMiwgMHg0NiwgMHgzNCwgMHgzNSwKLSAgICAweDM1LCAweDJkLCAweDM5LCAweDM4LCAweDJjLCAweDQyLCAweDQzLCAweDNiLCAweDMyLCAweDNmLCAweDM3LCAweDJmLAotICAgIDB4MzQsIDB4NDMsIDB4NDYsIDB4M2IsIDB4M2IsIDB4NDEsIDB4M2MsIDB4MzcsIDB4M2UsIDB4NDMsIDB4NGIsIDB4MzYsCi0gICAgMHgzZSwgMHgzYywgMHg0YywgMHg0MiwgMHg0MCwgMHgzZiwgMHg0OSwgMHg0MCwgMHgzYywgMHg0MCwgMHgzYywgMHg0OCwKLSAgICAweDM1LCAweDQyLCAweDNmLCAweDQyLCAweDQ0LCAweDQwLCAweDQ1LCAweDRmLCAweDNmLCAweDNmLCAweDQwLCAweDQyLAotICAgIDB4M2IsIDB4M2QsIDB4NDksIDB4NTUsIDB4NDIsIDB4MzksIDB4NDEsIDB4M2IsIDB4M2YsIDB4MzgsIDB4NDQsIDB4NjAsCi0gICAgMHgzNCwgMHg0MCwgMHgzYiwgMHgzYiwgMHgzNSwgMHgzZCwgMHg0MSwgMHg0ZSwgMHgzNSwgMHgzMywgMHgzMCwgMHgzYSwKLSAgICAweDNhLCAweDMyLCAweDQyLCAweDRmLCAweDMzLCAweDM0LCAweDJmLCAweDM4LCAweDQ5LCAweDM4LCAweDQwLCAweDRjLAotICAgIDB4MzUsIDB4MzgsIDB4M2UsIDB4NDYsIDB4M2YsIDB4M2EsIDB4M2EsIDB4NDUsIDB4M2IsIDB4MzQsIDB4MmUsIDB4MzksCi0gICAgMHgzMiwgMHgzZSwgMHg0MCwgMHg0OCwgMHgzNSwgMHg0NCwgMHgzYSwgMHgzNCwgMHgzZiwgMHgzNSwgMHgzYiwgMHgzMiwKLSAgICAweDQwLCAweDQzLCAweDNlLCAweDM4LCAweDNiLCAweDQzLCAweDNjLCAweDJiLCAweDQ2LCAweDQzLCAweDQwLCAweDMyLAotICAgIDB4NDIsIDB4M2IsIDB4NDksIDB4MmUsIDB4M2IsIDB4M2EsIDB4M2UsIDB4NDEsIDB4M2MsIDB4M2YsIDB4MzEsIDB4M2IsCi0gICAgMHg0MSwgMHgzMywgMHg0MSwgMHgzYywgMHg0ZCwgMHg0MCwgMHgzOCwgMHg2OCwgMHg0YywgMHg0YywgMHg0ZSwgMHgzZiwKLSAgICAweDNmLCAweDU0LCAweDRhLCAweDNkLCAweDRjLCAweDMzLCAweDNiLCAweDNhLCAweDVkLCAweDYwLCAweDcxLCAweDJiLAotICAgIDB4NTksIDB4MzMsIDB4M2MsIDB4MmMsIDB4NDcsIDB4NTIsIDB4NGYsIDB4NTEsIDB4NTYsIDB4M2QsIDB4MzksIDB4NDQsCi0gICAgMHgzNSwgMHg0MSwgMHgxYiwgMHg0YSwgMHgzNSwgMHg0MSwgMHgzNywgMHgzNSwgMHgyYywgMHgzNSwgMHgzNywgMHgzNSwKLSAgICAweDM4LCAweDQxLCAweDM4LCAweDNlLCAweDNjLCAweDQwLCAweDNjLCAweDJmLCAweDM4LCAweDNlLCAweDNmLCAweDQ1LAotICAgIDB4NDAsIDB4M2QsIDB4M2MsIDB4MzUsIDB4M2MsIDB4NDYsIDB4NDMsIDB4MzksIDB4MzcsIDB4NDIsIDB4NGUsIDB4M2MsCi0gICAgMHg0MiwgMHg0NiwgMHgzNywgMHgzMywgMHg0MywgMHgzZiwgMHg0NywgMHg0YSwgMHgzZCwgMHgzZSwgMHg0MCwgMHg0MCwKLSAgICAweDQwLCAweDNmLCAweDRiLCAweDU0LCAweDM2LCAweDNmLCAweDM3LCAweDQwLCAweDM5LCAweDM5LCAweDQ3LCAweDUxLAotICAgIDB4M2QsIDB4MzksIDB4MzYsIDB4MzYsIDB4NDAsIDB4NDAsIDB4NDEsIDB4NWEsIDB4MzgsIDB4MzksIDB4NDIsIDB4MzgsCi0gICAgMHg0MCwgMHgzOSwgMHg0MywgMHg1MCwgMHgzYSwgMHgzYSwgMHgzMiwgMHgzYywgMHgzYywgMHgzNSwgMHg0NCwgMHg0YSwKLSAgICAweDM3LCAweDM1LCAweDM2LCAweDNjLCAweDM1LCAweDMwLCAweDQ4LCAweDRiLCAweDNjLCAweDMzLCAweDM3LCAweDNlLAotICAgIDB4NDIsIDB4M2MsIDB4NDIsIDB4NGUsIDB4NDEsIDB4MzIsIDB4M2UsIDB4MzMsIDB4NDksIDB4MzksIDB4M2UsIDB4NDIsCi0gICAgMHgzZCwgMHgzOSwgMHgzNywgMHgzNiwgMHgzNSwgMHg0MSwgMHgzZSwgMHgzNywgMHgzNywgMHgzZSwgMHgzZCwgMHgzOCwKLSAgICAweDNhLCAweDNjLCAweDQxLCAweDI5LCAweDNjLCAweDNiLCAweDM5LCAweDQwLCAweDQzLCAweDNkLCAweDNlLCAweDMzLAotICAgIDB4M2YsIDB4M2YsIDB4M2UsIDB4NDMsIDB4NDMsIDB4MzgsIDB4MzgsIDB4NDEsIDB4M2IsIDB4MzgsIDB4MzUsIDB4M2EsCi0gICAgMHg0YiwgMHg0NCwgMHg0NCwgMHg1NSwgMHg0ZSwgMHg0NCwgMHg0ZCwgMHg0OSwgMHgzZSwgMHg1MywgMHg0NSwgMHgzZiwKLSAgICAweDQ1LCAweDNkLCAweDM2LCAweDM2LCAweDRmLCAweDViLCAweDZiLCAweDI4LCAweDU5LCAweDM0LCAweDM5LCAweDM0LAotICAgIDB4NGYsIDB4NGQsIDB4NTIsIDB4M2UsIDB4NTEsIDB4MzQsIDB4MzUsIDB4NGEsIDB4M2IsIDB4M2YsIDB4MjEsIDB4NDUsCi0gICAgMHgzNiwgMHgzZiwgMHgzOCwgMHgzMywgMHgyYywgMHgzNywgMHgzMiwgMHgyZiwgMHgyYiwgMHg0NCwgMHg0NywgMHgzZiwKLSAgICAweDM4LCAweDNhLCAweDNmLCAweDJlLCAweDQxLCAweDNmLCAweDNkLCAweDQxLCAweDM1LCAweDQ4LCAweDQzLCAweDQwLAotICAgIDB4MzMsIDB4NDQsIDB4NDAsIDB4MzgsIDB4NDcsIDB4NDQsIDB4NGMsIDB4M2QsIDB4NDEsIDB4M2IsIDB4MzksIDB4MzYsCi0gICAgMHgzZSwgMHg0NCwgMHg0OSwgMHg0OCwgMHgzYywgMHgzYiwgMHgzNCwgMHgzNCwgMHgzZiwgMHgzYywgMHg0MiwgMHg1MiwKLSAgICAweDQzLCAweDQxLCAweDNjLCAweDNjLCAweDNkLCAweDQzLCAweDQ4LCAweDU0LCAweDM5LCAweDM1LCAweDM5LCAweDNjLAotICAgIDB4NDMsIDB4M2MsIDB4NDQsIDB4NWYsIDB4MzksIDB4M2QsIDB4MzgsIDB4M2YsIDB4MzYsIDB4M2QsIDB4NDMsIDB4NTgsCi0gICAgMHgzMywgMHgzZCwgMHg0MywgMHgzMywgMHgzZiwgMHgzNiwgMHgzOSwgMHg1NCwgMHgzYSwgMHgzNywgMHgyZCwgMHg0NiwKLSAgICAweDQzLCAweDQxLCAweDQ3LCAweDQ2LCAweDNlLCAweDQyLCAweDM0LCAweDQ5LCAweDNhLCAweDNmLCAweDM4LCAweDUwLAotICAgIDB4M2EsIDB4M2IsIDB4NDIsIDB4M2EsIDB4M2UsIDB4M2MsIDB4M2IsIDB4NDAsIDB4NDIsIDB4NDUsIDB4MzcsIDB4M2IsCi0gICAgMHgyZiwgMHgzYiwgMHg0NiwgMHgzMCwgMHg0MiwgMHgzYiwgMHgzYiwgMHg0NCwgMHgzYiwgMHgzZSwgMHg0MCwgMHgxZSwKLSAgICAweDMzLCAweDQwLCAweDQwLCAweDNkLCAweDM5LCAweDNhLCAweDQxLCAweDMzLCAweDQ1LCAweDNlLCAweDNjLCAweDNmLAotICAgIDB4M2YsIDB4MzgsIDB4MzEsIDB4NDYsIDB4M2IsIDB4MzUsIDB4NDIsIDB4MzksIDB4NDksIDB4M2UsIDB4M2QsIDB4NjYsCi0gICAgMHg1MywgMHgzZiwgMHg0NCwgMHg0MCwgMHg0MywgMHg0NSwgMHg0OCwgMHg0NSwgMHg0OSwgMHgyZCwgMHgzZSwgMHgzYSwKLSAgICAweDRmLCAweDVhLCAweDYyLCAweDI3LCAweDU0LCAweDM3LCAweDM1LCAweDM0LCAweDQyLCAweDUwLCAweDU0LCAweDQzLAotICAgIDB4NGQsIDB4MzgsIDB4MzksIDB4NDgsIDB4MzgsIDB4NGMsIDB4MjEsIDB4M2YsIDB4NDAsIDB4M2EsIDB4M2EsIDB4MmYsCi0gICAgMHgzNywgMHgyZiwgMHgyOSwgMHgyYywgMHgzNiwgMHg0NywgMHgzZiwgMHg0MSwgMHgzMSwgMHgzMywgMHgzZSwgMHgzMiwKLSAgICAweDNlLCAweDQwLCAweDQyLCAweDQwLCAweDQyLCAweDNhLCAweDQ2LCAweDMzLCAweDQ0LCAweDQwLCAweDNjLCAweDQzLAotICAgIDB4M2QsIDB4NDEsIDB4NGQsIDB4M2QsIDB4M2MsIDB4NDcsIDB4NDYsIDB4NDMsIDB4NDIsIDB4M2UsIDB4NDQsIDB4NGUsCi0gICAgMHg0MSwgMHgzYSwgMHg0NCwgMHgzOCwgMHg0NSwgMHgzYiwgMHg0OSwgMHg0YywgMHg0MCwgMHgzZiwgMHgzNywgMHgzZSwKLSAgICAweDNlLCAweDQ2LCAweDQxLCAweDUxLCAweDNmLCAweDM5LCAweDMwLCAweDQwLCAweDNlLCAweDM4LCAweDQzLCAweDViLAotICAgIDB4MzMsIDB4M2UsIDB4MzEsIDB4NDIsIDB4M2QsIDB4MmYsIDB4NDksIDB4NTcsIDB4MzcsIDB4MzEsIDB4NDYsIDB4NDQsCi0gICAgMHgzZSwgMHgzNSwgMHg0MCwgMHg1NSwgMHgzNiwgMHgzNSwgMHgzZCwgMHgzYywgMHgzOCwgMHgzMywgMHg0MiwgMHg1MiwKLSAgICAweDNiLCAweDM5LCAweDM0LCAweDMxLCAweDQ1LCAweDM0LCAweDNjLCAweDUxLCAweDMzLCAweDM5LCAweDNjLCAweDQwLAotICAgIDB4MzYsIDB4MzYsIDB4NDIsIDB4M2UsIDB4MzcsIDB4M2UsIDB4M2IsIDB4NDAsIDB4M2QsIDB4MzYsIDB4NDEsIDB4MzAsCi0gICAgMHg0MiwgMHg0NSwgMHg0MCwgMHg0OSwgMHgzZCwgMHgzMiwgMHg0NiwgMHgyNiwgMHg0MCwgMHg0NCwgMHgzYSwgMHgzZiwKLSAgICAweDNkLCAweDQ2LCAweDQ1LCAweDMxLCAweDMzLCAweDM0LCAweDNlLCAweDM3LCAweDQ2LCAweDNiLCAweDMyLCAweDNhLAotICAgIDB4M2QsIDB4MzEsIDB4M2MsIDB4MzYsIDB4NTAsIDB4NDEsIDB4M2IsIDB4NWQsIDB4NTMsIDB4NDIsIDB4NDQsIDB4MzcsCi0gICAgMHgzZSwgMHg0ZCwgMHg0MSwgMHg0YiwgMHg0OSwgMHgyZiwgMHgzNSwgMHgzYSwgMHg0ZSwgMHg1OSwgMHg1ZCwgMHgyNywKLSAgICAweDVjLCAweDMwLCAweDNkLCAweDNhLCAweDQ2LCAweDUwLCAweDU3LCAweDRhLCAweDRjLCAweDM2LCAweDM3LCAweDQ2LAotICAgIDB4NDgsIDB4NDEsIDB4MjQsIDB4NDksIDB4MzYsIDB4M2UsIDB4NDEsIDB4NDUsIDB4MzcsIDB4MzgsIDB4MmUsIDB4MmUsCi0gICAgMHgzNCwgMHgzYywgMHgzOCwgMHg0MSwgMHgzNiwgMHgzZCwgMHg0MywgMHgzNiwgMHgzZSwgMHgzZSwgMHg0MSwgMHgzYiwKLSAgICAweDQyLCAweDNjLCAweDQzLCAweDM4LCAweDNlLCAweDNkLCAweDQxLCAweDQ4LCAweDQ3LCAweDRjLCAweDQ1LCAweDNiLAotICAgIDB4MzcsIDB4NDEsIDB4MzgsIDB4NDEsIDB4M2QsIDB4NDEsIDB4NDYsIDB4NGUsIDB4MzYsIDB4NDUsIDB4MzgsIDB4MzksCi0gICAgMHg0MiwgMHg0MiwgMHgzNywgMHg0YywgMHgzNCwgMHg0NiwgMHgzYywgMHg0NCwgMHg0YSwgMHgzOSwgMHg0NSwgMHg1MywKLSAgICAweDNjLCAweDNmLCAweDQxLCAweDM1LCAweDNjLCAweDQ1LCAweDRjLCAweDVhLCAweDQ0LCAweDQxLCAweDMwLCAweDM1LAotICAgIDB4NDAsIDB4MzksIDB4NDIsIDB4NWEsIDB4MzYsIDB4MzYsIDB4M2EsIDB4M2IsIDB4NDMsIDB4MzUsIDB4M2MsIDB4NTYsCi0gICAgMHgzNSwgMHgzOCwgMHgyYiwgMHg0YSwgMHgzYywgMHg0MCwgMHg0NSwgMHg1NCwgMHgzNywgMHgzNywgMHgzYSwgMHg0NCwKLSAgICAweDQyLCAweDNiLCAweDNkLCAweDRhLCAweDNmLCAweDM3LCAweDNiLCAweDM1LCAweDM0LCAweDNmLCAweDQwLCAweDQ4LAotICAgIDB4NDUsIDB4M2UsIDB4MzcsIDB4MzgsIDB4NDEsIDB4NDEsIDB4M2QsIDB4MzcsIDB4NDMsIDB4M2QsIDB4M2QsIDB4NDUsCi0gICAgMHgzYSwgMHgzOCwgMHgzZiwgMHgyMywgMHg0YSwgMHgzNywgMHg0MiwgMHgzYywgMHgzZiwgMHg0MywgMHg0MiwgMHgzMywKLSAgICAweDM3LCAweDM5LCAweDM1LCAweDNiLCAweDQxLCAweDM2LCAweDJmLCAweDNiLCAweDQxLCAweDNhLCAweDQ0LCAweDNkLAotICAgIDB4M2UsIDB4NDUsIDB4NDQsIDB4NTAsIDB4NDcsIDB4NDcsIDB4NDgsIDB4M2MsIDB4M2YsIDB4NDUsIDB4NDMsIDB4M2YsCi0gICAgMHg0YSwgMHgzMywgMHgzYywgMHgzYSwgMHg1MiwgMHg1MiwgMHg1YSwgMHgyMywgMHg1OCwgMHgzMSwgMHgzYiwgMHgzYiwKLSAgICAweDQ3LCAweDQ0LCAweDU0LCAweDQ1LCAweDQyLCAweDM4LCAweDM4LCAweDQwLCAweDQzLCAweDNmLCAweDJhLCAweDQ2LAotICAgIDB4M2IsIDB4NDYsIDB4M2IsIDB4NDYsIDB4MzUsIDB4MzcsIDB4MjksIDB4MzUsIDB4MzgsIDB4NDEsIDB4M2EsIDB4MzEsCi0gICAgMHg0NCwgMHg0MSwgMHgzOSwgMHgzNiwgMHg0NSwgMHg0MSwgMHg0MCwgMHgzZSwgMHg0MCwgMHg0NCwgMHg0NywgMHgzNywKLSAgICAweDNmLCAweDQyLCAweDQ5LCAweDM0LCAweDQ2LCAweDNkLCAweDRiLCAweDNkLCAweDQyLCAweDNiLCAweDQyLCAweDNlLAotICAgIDB4NDEsIDB4M2IsIDB4M2YsIDB4NDMsIDB4NDcsIDB4NDUsIDB4NDcsIDB4NDEsIDB4NDAsIDB4M2EsIDB4M2QsIDB4NDUsCi0gICAgMHg0MCwgMHgzNiwgMHgzYiwgMHgzYiwgMHg0NCwgMHgzNywgMHg0NiwgMHg1NSwgMHgzNSwgMHg0MiwgMHgzZiwgMHgzYSwKLSAgICAweDQxLCAweDQxLCAweDQ0LCAweDVjLCAweDMxLCAweDQ0LCAweDNkLCAweDQ2LCAweDM5LCAweDM4LCAweDQ2LCAweDU5LAotICAgIDB4NDEsIDB4M2IsIDB4M2QsIDB4MzksIDB4MzMsIDB4M2UsIDB4NDEsIDB4NTgsIDB4MzMsIDB4NDQsIDB4MzQsIDB4MzEsCi0gICAgMHg0OCwgMHgzZSwgMHg0ZCwgMHg1NiwgMHgzNiwgMHgzYywgMHgzNywgMHg0NiwgMHg0NiwgMHgzOCwgMHg0NSwgMHg1MywKLSAgICAweDM1LCAweDNkLCAweDNhLCAweDMxLCAweDQyLCAweDQ4LCAweDQ1LCAweDQ0LCAweDNiLCAweDNiLCAweDNjLCAweDQxLAotICAgIDB4M2QsIDB4NDIsIDB4M2YsIDB4MmYsIDB4MzgsIDB4M2MsIDB4M2UsIDB4NDEsIDB4NDQsIDB4M2EsIDB4NGEsIDB4MjQsCi0gICAgMHgzNywgMHgzZSwgMHgzNywgMHg0OCwgMHg0MCwgMHgzZiwgMHg0NiwgMHgzYywgMHg0NywgMHg0YSwgMHgzOCwgMHg0NywKLSAgICAweDM0LCAweDQ1LCAweDMxLCAweDQyLCAweDQzLCAweDQ0LCAweDNmLCAweDNmLCAweDQ5LCAweDQwLCAweDNjLCAweDQxLAotICAgIDB4NGQsIDB4NDMsIDB4NDIsIDB4MzksIDB4MzksIDB4NDgsIDB4NDEsIDB4MzgsIDB4NDcsIDB4M2MsIDB4M2MsIDB4NDIsCi0gICAgMHg0NCwgMHg1NSwgMHg2MiwgMHgyYSwgMHg1YywgMHgzMiwgMHgzYSwgMHgzNywgMHg0YywgMHg0NCwgMHg0ZiwgMHgzZSwKLSAgICAweDRlLCAweDQyLCAweDNhLCAweDQyLCAweDQxLCAweDRhLCAweDM1LCAweDQ0LCAweDQ1LCAweDNiLCAweDQzLCAweDQxLAotICAgIDB4MzMsIDB4MzgsIDB4MjgsIDB4MzYsIDB4NDAsIDB4NDcsIDB4M2UsIDB4M2UsIDB4M2UsIDB4MzksIDB4M2EsIDB4MzcsCi0gICAgMHg0NCwgMHg0NCwgMHgzZiwgMHgzYiwgMHg0MSwgMHgzYywgMHg0NSwgMHgzNiwgMHgzOCwgMHgzYSwgMHgzYywgMHg0MiwKLSAgICAweDQyLCAweDNmLCAweDU5LCAweDNjLCAweDQ3LCAweDNkLCAweDM4LCAweDNhLCAweDQyLCAweDQ0LCAweDQxLCAweDQ2LAotICAgIDB4M2YsIDB4NDMsIDB4NDgsIDB4NDIsIDB4NDQsIDB4MzUsIDB4M2YsIDB4NDUsIDB4MzYsIDB4M2YsIDB4MzgsIDB4M2EsCi0gICAgMHg0NCwgMHgzZCwgMHgzZCwgMHg0ZSwgMHgzZSwgMHg0NSwgMHg0MCwgMHg0MiwgMHgzYywgMHgzMywgMHg0MywgMHg1YSwKLSAgICAweDM4LCAweDNlLCAweDQ1LCAweDNhLCAweDNlLCAweDQyLCAweDQ1LCAweDUyLCAweDNjLCAweDQyLCAweDNhLCAweDM4LAotICAgIDB4M2QsIDB4M2IsIDB4NGEsIDB4NTcsIDB4MzgsIDB4MzcsIDB4NDcsIDB4NDQsIDB4M2UsIDB4M2MsIDB4MzgsIDB4NDgsCi0gICAgMHgzNiwgMHg0MSwgMHgzZiwgMHg0MSwgMHgzYSwgMHgzYSwgMHg0NiwgMHg0NywgMHg0MiwgMHg0MCwgMHgzMiwgMHgzMywKLSAgICAweDQzLCAweDM3LCAweDQxLCAweDQzLCAweDNlLCAweDQwLCAweDNkLCAweDNhLCAweDNlLCAweDM4LCAweDQyLCAweDMwLAotICAgIDB4M2UsIDB4NDAsIDB4NDYsIDB4NDIsIDB4NDAsIDB4NDQsIDB4NDIsIDB4MjMsIDB4MzEsIDB4NDAsIDB4M2YsIDB4M2QsCi0gICAgMHgzYiwgMHgzMywgMHg0MCwgMHgzMywgMHg0MSwgMHgzMywgMHg0MywgMHg0MSwgMHgzYSwgMHgzZSwgMHgzNiwgMHg0MCwKLSAgICAweDQwLCAweDQ1LCAweDM3LCAweDQyLCAweDQ2LCAweDQyLCAweDM5LCAweDQ4LCAweDQ0LCAweDQwLCAweDQwLCAweDQ1LAotICAgIDB4M2MsIDB4NDksIDB4NDEsIDB4M2YsIDB4NGMsIDB4M2QsIDB4MmYsIDB4M2YsIDB4NDcsIDB4NTIsIDB4NTQsIDB4MmMsCi0gICAgMHg1NSwgMHg0MiwgMHg0NCwgMHgzYiwgMHg0NiwgMHg0ZiwgMHg0OCwgMHgzYywgMHg0NSwgMHgzOSwgMHgzZiwgMHg0YiwKLSAgICAweDNmLCAweDNmLCAweDM2LCAweDQyLCAweDQxLCAweDQ4LCAweDQ0LCAweDQ0LCAweDM2LCAweDNiLCAweDM3LCAweDQwLAotICAgIDB4MzksIDB4NDksIDB4M2EsIDB4MzUsIDB4M2UsIDB4NDgsIDB4MzEsIDB4MzAsIDB4NDQsIDB4MzgsIDB4NGMsIDB4M2MsCi0gICAgMHg0MSwgMHgzZSwgMHg0NiwgMHgzMiwgMHg0NCwgMHgzYiwgMHg0MiwgMHgzYywgMHgzOCwgMHgzYSwgMHg0NywgMHgzZiwKLSAgICAweDNhLCAweDQyLCAweDNhLCAweDQzLCAweDQwLCAweDRiLCAweDQ3LCAweDNjLCAweDQyLCAweDQ2LCAweDQ1LCAweDQyLAotICAgIDB4M2MsIDB4NDYsIDB4M2QsIDB4M2YsIDB4M2UsIDB4MzYsIDB4MzgsIDB4M2UsIDB4NDYsIDB4M2MsIDB4NGQsIDB4NDMsCi0gICAgMHg0OSwgMHg0MSwgMHg0OCwgMHgzYywgMHgzZCwgMHgzOSwgMHg0MywgMHg1OCwgMHgzYSwgMHg0MSwgMHgzZiwgMHgzOCwKLSAgICAweDM3LCAweDNmLCAweDQ2LCAweDVkLCAweDNjLCAweDNjLCAweDM5LCAweDM2LCAweDNkLCAweDQ2LCAweDQzLCAweDUwLAotICAgIDB4M2EsIDB4NDcsIDB4MzksIDB4MzYsIDB4NDEsIDB4M2YsIDB4M2UsIDB4NTEsIDB4MzEsIDB4MzYsIDB4M2UsIDB4M2MsCi0gICAgMHgzYywgMHgzYSwgMHg0OCwgMHg0MSwgMHgzYSwgMHg0MywgMHg0OSwgMHgzZSwgMHg0MiwgMHg0NiwgMHgzZiwgMHg0MSwKLSAgICAweDQ5LCAweDMzLCAweDQyLCAweDQxLCAweDQ1LCAweDQwLCAweDNkLCAweDJiLCAweDNkLCAweDM4LCAweDQwLCAweDM3LAotICAgIDB4M2EsIDB4MzEsIDB4NDUsIDB4MjYsIDB4MzMsIDB4M2QsIDB4M2YsIDB4MzksIDB4MzYsIDB4M2MsIDB4MzgsIDB4MzMsCi0gICAgMHgzNCwgMHgzZiwgMHgzNSwgMHg0NCwgMHgzYSwgMHgzOSwgMHgzMiwgMHg0MSwgMHgzNSwgMHg0MCwgMHgzYywgMHgzYiwKLSAgICAweDRhLCAweDNmLCAweDNlLCAweDNlLCAweDRhLCAweDNlLCAweDQyLCAweDM1LCAweDM4LCAweDQzLCAweDNjLCAweDM3LAotICAgIDB4M2QsIDB4M2MsIDB4MzksIDB4NDMsIDB4M2YsIDB4NGUsIDB4NTQsIDB4MzMsIDB4NGIsIDB4MzcsIDB4NDMsIDB4M2IsCi0gICAgMHg0MywgMHg0OCwgMHg0MywgMHg0MiwgMHgzZCwgMHg0NiwgMHg0NSwgMHg0OSwgMHgzYSwgMHgzOSwgMHgzNiwgMHg0YSwKLSAgICAweDQ4LCAweDQ4LCAweDM3LCAweDRiLCAweDQyLCAweDQ3LCAweDM0LCAweDM0LCAweDQzLCAweDQyLCAweDNhLCAweDNkLAotICAgIDB4M2MsIDB4NDYsIDB4MzQsIDB4MzksIDB4NDAsIDB4M2IsIDB4M2UsIDB4M2UsIDB4MzcsIDB4M2QsIDB4NTMsIDB4M2IsCi0gICAgMHg0OCwgMHgzYywgMHg0MywgMHg0NCwgMHgzYiwgMHgzZiwgMHg1NywgMHgzZCwgMHgzOSwgMHgzYywgMHgzOSwgMHgzYSwKLSAgICAweDNlLCAweDNmLCAweDQzLCAweDNlLCAweDQxLCAweDQ3LCAweDNjLCAweDQxLCAweDQwLCAweDQxLCAweDM3LCAweDNmLAotICAgIDB4M2IsIDB4NDMsIDB4MzUsIDB4M2UsIDB4NDUsIDB4NDAsIDB4NDcsIDB4NTksIDB4NDEsIDB4NDksIDB4M2IsIDB4M2YsCi0gICAgMHg0NywgMHg0OSwgMHg0YiwgMHg2MSwgMHgzOSwgMHg0OCwgMHgzOSwgMHgzZSwgMHg0NCwgMHgzNCwgMHgzYiwgMHg1OSwKLSAgICAweDNjLCAweDQyLCAweDQ1LCAweDM1LCAweDQyLCAweDQxLCAweDM5LCAweDUyLCAweDQyLCAweDNjLCAweDNkLCAweDNlLAotICAgIDB4M2QsIDB4NGEsIDB4NGEsIDB4NGQsIDB4M2MsIDB4MzQsIDB4NDQsIDB4M2MsIDB4NDEsIDB4MzQsIDB4MzgsIDB4NDYsCi0gICAgMHgzOCwgMHg0NSwgMHg0MCwgMHg0NSwgMHg0MCwgMHgzYSwgMHgzZCwgMHg0NCwgMHgzYSwgMHgzNywgMHgzYSwgMHgzYSwKLSAgICAweDNiLCAweDQyLCAweDQwLCAweDM0LCAweDNiLCAweDNjLCAweDQyLCAweDQwLCAweDNkLCAweDMyLCAweDQwLCAweDI3LAotICAgIDB4MzcsIDB4MzksIDB4MzcsIDB4NDYsIDB4NDgsIDB4MzEsIDB4NDAsIDB4MzAsIDB4NDIsIDB4NDIsIDB4M2EsIDB4NDAsCi0gICAgMHgzZCwgMHgzNywgMHgyYSwgMHg0MCwgMHg0MSwgMHgzNywgMHgzYywgMHg0YSwgMHg0NiwgMHg0NSwgMHgzZCwgMHgzNCwKLSAgICAweDQ4LCAweDQxLCAweDQyLCAweDNlLCAweDNmLCAweDM5LCAweDNjLCAweDNhLCAweDRmLCAweDNiLCAweDMyLCAweDNlLAotICAgIDB4NDMsIDB4NTEsIDB4NGYsIDB4MmEsIDB4NDYsIDB4M2EsIDB4M2QsIDB4M2IsIDB4NDAsIDB4M2QsIDB4NGMsIDB4M2MsCi0gICAgMHg0OCwgMHg0MCwgMHgzNiwgMHg0YSwgMHgzYSwgMHgzOCwgMHg0MiwgMHg0MywgMHg0YywgMHgzZCwgMHg0NywgMHg0NywKLSAgICAweDMzLCAweDNmLCAweDJkLCAweDM3LCAweDRhLCAweDQzLCAweDM4LCAweDNlLCAweDQ5LCAweDQyLCAweDQyLCAweDNkLAotICAgIDB4NDMsIDB4NDcsIDB4NDEsIDB4MzgsIDB4NDYsIDB4MzcsIDB4NDYsIDB4MzgsIDB4NDcsIDB4NDIsIDB4NDksIDB4M2QsCi0gICAgMHgzYiwgMHgzNywgMHg0YywgMHgzYywgMHgzYSwgMHg0NSwgMHgzZiwgMHgzNywgMHgzNiwgMHgzZCwgMHgzYywgMHg0MCwKLSAgICAweDNlLCAweDQ1LCAweDQ2LCAweDQxLCAweDQxLCAweDQwLCAweDNjLCAweDQ0LCAweDQ3LCAweDQzLCAweDM3LCAweDNmLAotICAgIDB4M2UsIDB4M2EsIDB4M2EsIDB4NGIsIDB4M2EsIDB4MzYsIDB4M2QsIDB4M2YsIDB4MzgsIDB4M2YsIDB4M2MsIDB4NTgsCi0gICAgMHg0MCwgMHg0OSwgMHgzZCwgMHg0MiwgMHgzOCwgMHgzYSwgMHg0NywgMHg1MCwgMHgzYiwgMHg0OSwgMHg0MCwgMHg0NCwKLSAgICAweDNlLCAweDNjLCAweDM4LCAweDUyLCAweDNhLCAweDNlLCAweDQ0LCAweDNjLCAweDM1LCAweDQ0LCAweDNhLCAweDQ3LAotICAgIDB4M2UsIDB4NDksIDB4M2YsIDB4NDcsIDB4NDUsIDB4MzksIDB4M2IsIDB4NDYsIDB4NDQsIDB4M2UsIDB4NDEsIDB4NDYsCi0gICAgMHg0MCwgMHg0MSwgMHg0MCwgMHg0MCwgMHgzYSwgMHgzNSwgMHgzZSwgMHgzNiwgMHgzZSwgMHgzZSwgMHgzZCwgMHgzNSwKLSAgICAweDNiLCAweDNjLCAweDM4LCAweDQ2LCAweDNiLCAweDNjLCAweDQxLCAweDJjLCAweDNmLCAweDQyLCAweDM4LCAweDNiLAotICAgIDB4MzYsIDB4M2IsIDB4MzksIDB4NDAsIDB4NDAsIDB4MzgsIDB4MzYsIDB4MzMsIDB4MzQsIDB4NDIsIDB4MmYsIDB4NDQsCi0gICAgMHg0MSwgMHg0MCwgMHgzOSwgMHgzNSwgMHgzYiwgMHg0NCwgMHg0MiwgMHgyYywgMHg0MSwgMHgzYiwgMHg0NCwgMHg0MSwKLSAgICAweDM1LCAweDQ0LCAweDNiLCAweDM0LCAweDQ0LCAweDQ5LCAweDM2LCAweDM5LCAweDNhLCAweDUyLCAweDRkLCAweDJiLAotICAgIDB4NDAsIDB4NDAsIDB4M2UsIDB4MzksIDB4NDgsIDB4NDIsIDB4M2MsIDB4NDQsIDB4NDYsIDB4NDksIDB4M2YsIDB4NTQsCi0gICAgMHg0MywgMHg0MCwgMHgyZSwgMHg0MCwgMHg0ZiwgMHgzNiwgMHgzZSwgMHgzZiwgMHgzOCwgMHg0OCwgMHg0NCwgMHgzYywKLSAgICAweDQ0LCAweDQzLCAweDQxLCAweDQ3LCAweDQwLCAweDQ2LCAweDQwLCAweDM3LCAweDQxLCAweDM0LCAweDNhLCAweDQxLAotICAgIDB4NDEsIDB4M2IsIDB4NDksIDB4MzksIDB4NDIsIDB4MzgsIDB4M2QsIDB4MzksIDB4MzQsIDB4MzUsIDB4NDMsIDB4MzYsCi0gICAgMHgzZSwgMHg0NCwgMHgzZiwgMHg0MCwgMHg0MywgMHg0MCwgMHg0MCwgMHgzYSwgMHg0NywgMHg0MiwgMHgzZSwgMHg0MiwKLSAgICAweDQ2LCAweDM1LCAweDNhLCAweDQ2LCAweDNjLCAweDNjLCAweDNjLCAweDNkLCAweDNmLCAweDQwLCAweDQzLCAweDRjLAotICAgIDB4M2EsIDB4MzcsIDB4M2YsIDB4NDMsIDB4NDcsIDB4MzgsIDB4NDIsIDB4NTgsIDB4NDIsIDB4M2IsIDB4MzQsIDB4MzcsCi0gICAgMHgzZSwgMHg0OCwgMHgzYywgMHg1NywgMHg0NCwgMHgzYywgMHgzZCwgMHgzYSwgMHgzNiwgMHg0OCwgMHgzYywgMHg1MSwKLSAgICAweDNkLCAweDQ4LCAweDQ1LCAweDQ1LCAweDM4LCAweDQ1LCAweDQwLCAweDNmLCAweDNiLCAweDM1LCAweDNkLCAweDNmLAotICAgIDB4MzgsIDB4NDcsIDB4MzksIDB4M2IsIDB4MzYsIDB4NDksIDB4NDMsIDB4NDAsIDB4M2YsIDB4NDYsIDB4MzgsIDB4NDAsCi0gICAgMHgzZiwgMHgzZSwgMHgzOSwgMHgzMiwgMHg0NywgMHg0MiwgMHgzNSwgMHgzMywgMHgzOSwgMHg0NywgMHgzYywgMHgzNiwKLSAgICAweDNiLCAweDM3LCAweDQzLCAweDM1LCAweDNiLCAweDNiLCAweDM0LCAweDNiLCAweDM4LCAweDNkLCAweDNlLCAweDNhLAotICAgIDB4MzUsIDB4NDksIDB4MzgsIDB4NDAsIDB4M2YsIDB4M2YsIDB4M2UsIDB4MzcsIDB4NDMsIDB4M2IsIDB4M2UsIDB4M2UsCi0gICAgMHgzYiwgMHg0MCwgMHg0NCwgMHgzOSwgMHgzZCwgMHgzZiwgMHgzMSwgMHg0MiwgMHg0MiwgMHgzYiwgMHg0MSwgMHgzZCwKLSAgICAweDNlLCAweDNjLCAweDM3LCAweDM0LCAweDQ4LCAweDNkLCAweDQ5LCAweDRhLCAweDQ3LCAweDM2LCAweDNhLCAweDM0LAotICAgIDB4MzcsIDB4MzYsIDB4M2UsIDB4MzgsIDB4MzMsIDB4NDUsIDB4MzksIDB4NDQsIDB4MzQsIDB4NDksIDB4M2EsIDB4M2QsCi0gICAgMHgzNCwgMHgzMSwgMHgzMSwgMHgzZCwgMHgzNCwgMHgzZCwgMHg0MSwgMHgzZSwgMHg0OSwgMHg0MSwgMHgzNCwgMHgzZiwKLSAgICAweDNhLCAweDQyLCAweDNlLCAweDQwLCAweDNmLCAweDMzLCAweDQ2LCAweDNmLCAweDM0LCAweDM5LCAweDM3LCAweDQ2LAotICAgIDB4M2UsIDB4MzIsIDB4M2YsIDB4NDUsIDB4NDUsIDB4NDEsIDB4M2IsIDB4NGIsIDB4MzUsIDB4MzUsIDB4M2IsIDB4NGEsCi0gICAgMHgzZCwgMHg0MywgMHgzYiwgMHg0NCwgMHgzYywgMHgzOCwgMHgzMSwgMHg0MywgMHgzOSwgMHgzNSwgMHg0MSwgMHg0NSwKLSAgICAweDM3LCAweDNlLCAweDQzLCAweDQ3LCAweDM5LCAweDQwLCAweDQxLCAweDQxLCAweDQwLCAweDMyLCAweDM3LCAweDNlLAotICAgIDB4M2QsIDB4MzksIDB4M2IsIDB4NDksIDB4MzMsIDB4MzUsIDB4MzgsIDB4NDEsIDB4NDUsIDB4MzcsIDB4M2MsIDB4NDksCi0gICAgMHgzYiwgMHgzNCwgMHgzNCwgMHg0MSwgMHgzYSwgMHgzZiwgMHgzZSwgMHg0NywgMHgzOSwgMHgzYywgMHgzNCwgMHgzYSwKLSAgICAweDM4LCAweDQ0LCAweDQwLCAweDUxLCAweDNhLCAweDM3LCAweDNiLCAweDNmLCAweDNkLCAweDNhLCAweDQ1LCAweDQ4LAotICAgIDB4M2YsIDB4NDYsIDB4MzUsIDB4NDMsIDB4MzgsIDB4NDMsIDB4MzUsIDB4NGMsIDB4NDIsIDB4NDcsIDB4NDQsIDB4M2QsCi0gICAgMHg0MCwgMHgzYSwgMHgzOSwgMHg0ZSwgMHgzZCwgMHgzNywgMHgzYywgMHg0MiwgMHg0MCwgMHg0OCwgMHg0NCwgMHg0YywKLSAgICAweDMxLCAweDQwLCAweDQyLCAweDNiLCAweDQ1LCAweDQ1LCAweDNmLCAweDNlLCAweDNkLCAweDQ0LCAweDNmLCAweDMxLAotICAgIDB4M2YsIDB4NDQsIDB4NDUsIDB4MzcsIDB4M2UsIDB4M2QsIDB4MzUsIDB4M2IsIDB4MmQsIDB4NDQsIDB4NGEsIDB4M2EsCi0gICAgMHgyYiwgMHgzNywgMHgzOCwgMHg0NiwgMHg0MSwgMHgzOSwgMHgzYywgMHgzYywgMHg0NiwgMHgzMywgMHgzNiwgMHgzYywKLSAgICAweDRiLCAweDM0LCAweDQ5LCAweDUwLCAweDMwLCAweDNjLCAweDMzLCAweDQxLCAweDQ0LCAweDMzLCAweDQzLCAweDM5LAotICAgIDB4MzYsIDB4NDUsIDB4MzMsIDB4M2IsIDB4M2QsIDB4MzYsIDB4NDcsIDB4MzAsIDB4NDIsIDB4MzcsIDB4NDksIDB4M2UsCi0gICAgMHgzYiwgMHg0OSwgMHgzZCwgMHgzYiwgMHgzYSwgMHg0MSwgMHgzOCwgMHg0NCwgMHg0MiwgMHgzYiwgMHgzZiwgMHg0MCwKLSAgICAweDQ2LCAweDM1LCAweDM4LCAweDNjLCAweDQ4LCAweDNhLCAweDQ2LCAweDQxLCAweDM2LCAweDM2LCAweDQxLCAweDNlLAotICAgIDB4NDMsIDB4M2UsIDB4MzIsIDB4MzksIDB4M2EsIDB4NDEsIDB4MzAsIDB4M2UsIDB4NDAsIDB4M2UsIDB4MzYsIDB4M2EsCi0gICAgMHg0NSwgMHg0NSwgMHgzYSwgMHgzYywgMHgzMSwgMHgzYiwgMHg0NywgMHgzZiwgMHgzNiwgMHgzYSwgMHgzYywgMHg0MSwKLSAgICAweDNiLCAweDQxLCAweDM5LCAweDQ2LCAweDNmLCAweDNjLCAweDM0LCAweDNlLCAweDQxLCAweDQ1LCAweDQxLCAweDQyLAotICAgIDB4MzksIDB4NDAsIDB4NDAsIDB4NDQsIDB4NDUsIDB4NDIsIDB4MzQsIDB4M2YsIDB4M2UsIDB4MzEsIDB4M2IsIDB4NDEsCi0gICAgMHgzMywgMHg0MywgMHgzNywgMHg0NCwgMHg0NCwgMHgzYSwgMHgzNiwgMHgzNiwgMHg0OCwgMHgzYywgMHgzNywgMHg0NywKLSAgICAweDM5LCAweDNlLCAweDNlLCAweDNjLCAweDNjLCAweDQxLCAweDNjLCAweDQ0LCAweDNiLCAweDQyLCAweDNmLCAweDNhLAotICAgIDB4NDMsIDB4M2IsIDB4M2UsIDB4NDgsIDB4MzYsIDB4M2YsIDB4M2QsIDB4MzQsIDB4NDAsIDB4NDMsIDB4MzUsIDB4NGYsCi0gICAgMHgzNCwgMHgzOSwgMHgzYiwgMHg0MSwgMHg0MCwgMHgzOSwgMHgzNywgMHg0YywgMHgzOSwgMHgzNiwgMHgzOSwgMHgzOSwKLSAgICAweDQ3LCAweDQxLCAweDQzLCAweDNmLCAweDNmLCAweDMzLCAweDQyLCAweDNmLCAweDQyLCAweDQwLCAweDM3LCAweDQwLAotICAgIDB4M2YsIDB4MzQsIDB4NDUsIDB4M2QsIDB4MmQsIDB4M2MsIDB4NDQsIDB4M2IsIDB4NDMsIDB4MzcsIDB4MjYsIDB4NTAsCi0gICAgMHg0MywgMHg0NCwgMHgzZCwgMHg0MywgMHg0MiwgMHgyZCwgMHgzYywgMHgzMywgMHg0YSwgMHgzMiwgMHg0YSwgMHg1MywKLSAgICAweDMzLCAweDM4LCAweDI3LCAweDM2LCAweDQyLCAweDMwLCAweDQ3LCAweDNkLCAweDM2LCAweDQ1LCAweDQ2LCAweDM2LAotICAgIDB4M2IsIDB4M2IsIDB4NDAsIDB4MzMsIDB4MzcsIDB4MzYsIDB4NDQsIDB4NDYsIDB4M2QsIDB4MzUsIDB4NDAsIDB4MzgsCi0gICAgMHgzYiwgMHg0MCwgMHgzNiwgMHgzYywgMHgzZCwgMHgzNywgMHgzMSwgMHg0MSwgMHgzMywgMHgzYywgMHgzOCwgMHgzZiwKLSAgICAweDQzLCAweDNhLCAweDQwLCAweDQ5LCAweDM4LCAweDM5LCAweDM4LCAweDNkLCAweDQzLCAweDNkLCAweDM5LCAweDNiLAotICAgIDB4M2QsIDB4M2YsIDB4MzgsIDB4NDIsIDB4MzQsIDB4NDMsIDB4MzMsIDB4M2UsIDB4NDMsIDB4M2UsIDB4NDAsIDB4NDIsCi0gICAgMHgzYiwgMHg0NSwgMHgzNywgMHg0NCwgMHg0MywgMHgzOSwgMHgzYywgMHgzZCwgMHgzNywgMHg0NCwgMHgzYSwgMHgzYiwKLSAgICAweDQ3LCAweDNmLCAweDNhLCAweDNjLCAweDNhLCAweDNiLCAweDNmLCAweDQzLCAweDNlLCAweDNkLCAweDQ2LCAweDNlLAotICAgIDB4MzcsIDB4MzYsIDB4M2YsIDB4NDAsIDB4NDIsIDB4NDIsIDB4MzcsIDB4MzYsIDB4NDgsIDB4MzUsIDB4NDQsIDB4NDQsCi0gICAgMHgzOSwgMHgzYywgMHgzYiwgMHg0MSwgMHg0NCwgMHg0OSwgMHgzYSwgMHg0MCwgMHg0MSwgMHgzNiwgMHgzMywgMHgzYSwKLSAgICAweDNjLCAweDNkLCAweDQwLCAweDNmLCAweDQzLCAweDM2LCAweDNjLCAweDNhLCAweDNmLCAweDRiLCAweDMyLCAweDQ5LAotICAgIDB4NDksIDB4M2UsIDB4M2EsIDB4M2UsIDB4M2YsIDB4NDEsIDB4M2MsIDB4NDcsIDB4NDAsIDB4NDEsIDB4NDUsIDB4M2UsCi0gICAgMHg0NywgMHg0NywgMHgzZiwgMHg0NywgMHg0NSwgMHgzZSwgMHgzMSwgMHg0MywgMHg0YSwgMHg0NCwgMHgzNiwgMHg0MCwKLSAgICAweDQxLCAweDQ3LCAweDNlLCAweDQyLCAweDM3LCAweDQwLCAweDNiLCAweDQ2LCAweDM3LCAweDQxLCAweDNlLCAweDNjLAotICAgIDB4MjcsIDB4NDAsIDB4NDksIDB4NDIsIDB4NDIsIDB4MzksIDB4MzAsIDB4NDksIDB4NDMsIDB4MzgsIDB4M2QsIDB4NDIsCi0gICAgMHg0MywgMHgyZiwgMHgzYiwgMHgzNywgMHg0YiwgMHgyZCwgMHg0ZiwgMHg1MiwgMHgzMCwgMHgzMSwgMHgyZiwgMHgzYSwKLSAgICAweDQ5LCAweDM4LCAweDRmLCAweDQ1LCAweDJlLCAweDQ3LCAweDNhLCAweDMyLCAweDMzLCAweDNmLCAweDRhLCAweDJlLAotICAgIDB4MzMsIDB4M2IsIDB4M2UsIDB4M2UsIDB4NDksIDB4NDUsIDB4NDQsIDB4MzgsIDB4M2MsIDB4MzUsIDB4NDUsIDB4NDcsCi0gICAgMHg0MSwgMHgzYiwgMHgzYywgMHg0OCwgMHg0NiwgMHgzOSwgMHgzOSwgMHgzYiwgMHgzZiwgMHg0MSwgMHgzOCwgMHg0MiwKLSAgICAweDNkLCAweDQ2LCAweDMzLCAweDQxLCAweDM2LCAweDNmLCAweDNmLCAweDNjLCAweDMzLCAweDNlLCAweDNlLCAweDQwLAotICAgIDB4NDQsIDB4NDAsIDB4M2MsIDB4MzgsIDB4NDYsIDB4M2EsIDB4NDAsIDB4MzYsIDB4NDIsIDB4MzUsIDB4M2YsIDB4M2IsCi0gICAgMHgzYiwgMHg0MywgMHgzYywgMHg0MCwgMHg0MCwgMHg0OSwgMHgyZSwgMHgzOSwgMHg0MCwgMHgzZiwgMHg0NSwgMHg0MSwKLSAgICAweDNmLCAweDMwLCAweDQyLCAweDNkLCAweDQwLCAweDNjLCAweDNhLCAweDNiLCAweDNiLCAweDQwLCAweDM5LCAweDQyLAotICAgIDB4M2EsIDB4M2YsIDB4M2YsIDB4M2UsIDB4MzUsIDB4M2IsIDB4MzgsIDB4NDUsIDB4NDcsIDB4MzUsIDB4NDQsIDB4M2UsCi0gICAgMHgzYiwgMHgzZiwgMHgzZiwgMHg0MCwgMHgzYSwgMHgzNSwgMHgzMCwgMHg0OSwgMHg0NSwgMHgzNSwgMHgzYiwgMHgzOSwKLSAgICAweDNiLCAweDQ4LCAweDNmLCAweDM3LCAweDM5LCAweDQwLCAweDQzLCAweDQ1LCAweDNkLCAweDQwLCAweDQxLCAweDNhLAotICAgIDB4MzMsIDB4M2QsIDB4M2EsIDB4NGIsIDB4NDAsIDB4NDIsIDB4NDAsIDB4NDIsIDB4NDMsIDB4MzksIDB4M2MsIDB4NDksCi0gICAgMHgzZSwgMHg0NywgMHgzZSwgMHg0NCwgMHgzZiwgMHgzYSwgMHg0MCwgMHg0MSwgMHgzZiwgMHg0MiwgMHg0MiwgMHgzNywKLSAgICAweDNlLCAweDNiLCAweDM2LCAweDNlLCAweDNiLCAweDNjLCAweDQ4LCAweDQzLCAweDJkLCAweDQ2LCAweDRhLCAweDM4LAotICAgIDB4NDUsIDB4M2EsIDB4MjksIDB4NDYsIDB4NDAsIDB4M2MsIDB4NDAsIDB4NDQsIDB4NDAsIDB4MzMsIDB4MmYsIDB4MzMsCi0gICAgMHg0OCwgMHgyZSwgMHg1MSwgMHg0ZiwgMHgyYiwgMHgzMiwgMHgyZSwgMHgyZCwgMHg0NSwgMHgzMywgMHg0ZCwgMHg0MSwKLSAgICAweDI5LCAweDRiLCAweDQxLCAweDM5LCAweDJmLCAweDNhLCAweDQ5LCAweDMxLCAweDM3LCAweDQwLCAweDQ3LCAweDRjLAotICAgIDB4M2UsIDB4MzEsIDB4NDEsIDB4M2YsIDB4NDMsIDB4MzcsIDB4NDUsIDB4NGYsIDB4NDEsIDB4M2MsIDB4MzAsIDB4NGEsCi0gICAgMHgzNywgMHgzNywgMHgzNiwgMHgzOSwgMHgzMSwgMHgzZCwgMHgzNiwgMHg0YiwgMHgzNywgMHg0NCwgMHgzYywgMHg0MywKLSAgICAweDQ0LCAweDM2LCAweDNmLCAweDNiLCAweDM0LCAweDNlLCAweDNhLCAweDM1LCAweDM4LCAweDNmLCAweDMzLCAweDM3LAotICAgIDB4M2IsIDB4M2QsIDB4NDYsIDB4MzgsIDB4M2IsIDB4MzcsIDB4MzgsIDB4M2IsIDB4MzEsIDB4M2UsIDB4M2QsIDB4M2IsCi0gICAgMHgzZCwgMHgzOSwgMHgzNSwgMHgzMywgMHgzMywgMHgzYywgMHgzOSwgMHgzOSwgMHg0OCwgMHgzOSwgMHgzOSwgMHgzZiwKLSAgICAweDNlLCAweDM2LCAweDQ3LCAweDNhLCAweDQ0LCAweDQwLCAweDMyLCAweDNjLCAweDM3LCAweDM1LCAweDQwLCAweDNmLAotICAgIDB4M2EsIDB4MzgsIDB4M2IsIDB4M2QsIDB4NDYsIDB4NDUsIDB4MzYsIDB4NDMsIDB4NDAsIDB4M2QsIDB4NDEsIDB4NDEsCi0gICAgMHg0NywgMHgzYSwgMHgzZCwgMHgzZSwgMHg0MywgMHg0MiwgMHgzMiwgMHgzNiwgMHg0MSwgMHgzNywgMHgzYiwgMHgzNSwKLSAgICAweDM2LCAweDQ0LCAweDM2LCAweDNjLCAweDQzLCAweDMyLCAweDNlLCAweDNlLCAweDQyLCAweDQ1LCAweDMyLCAweDNjLAotICAgIDB4M2EsIDB4M2IsIDB4MzUsIDB4NDMsIDB4NDEsIDB4M2QsIDB4NDQsIDB4NTAsIDB4NDMsIDB4MzEsIDB4M2UsIDB4NDQsCi0gICAgMHg0NCwgMHg0MSwgMHgzYSwgMHg0NCwgMHgzNiwgMHgzOSwgMHgzYiwgMHgzYywgMHgzMiwgMHgzOCwgMHgzYiwgMHg0NSwKLSAgICAweDM4LCAweDQzLCAweDQwLCAweDQyLCAweDMzLCAweDNlLCAweDRhLCAweDQyLCAweDQ1LCAweDM5LCAweDJmLCAweDQyLAotICAgIDB4MzksIDB4MzUsIDB4NDQsIDB4M2UsIDB4MzksIDB4MmYsIDB4MzQsIDB4MzMsIDB4NDksIDB4MjksIDB4NTAsIDB4NGYsCi0gICAgMHgyYiwgMHgzNiwgMHgzNCwgMHgyZCwgMHg0NywgMHgzMywgMHg0OSwgMHgzYywgMHgzMywgMHg1MSwgMHg0OSwgMHgzZiwKLSAgICAweDM0LCAweDM5LCAweDRhLCAweDJjLCAweDM0LCAweDQ1LCAweDRmLCAweDQ3LCAweDM0LCAweDQyLCAweDNhLCAweDNkLAotICAgIDB4MzYsIDB4NGEsIDB4M2IsIDB4NDMsIDB4MzYsIDB4M2YsIDB4MzksIDB4NGIsIDB4MzgsIDB4M2EsIDB4MzEsIDB4M2QsCi0gICAgMHgzMiwgMHg0MiwgMHgzYSwgMHg0NywgMHg0OCwgMHgzZSwgMHg0NCwgMHgzZiwgMHgzOSwgMHgzZSwgMHg0NCwgMHgzNSwKLSAgICAweDQxLCAweDNjLCAweDQ1LCAweDNhLCAweDNlLCAweDNiLCAweDNkLCAweDJmLCAweDM3LCAweDQwLCAweDNlLCAweDQzLAotICAgIDB4MzksIDB4MzksIDB4MzMsIDB4M2IsIDB4MzcsIDB4M2IsIDB4MzcsIDB4MzcsIDB4MzcsIDB4MzksIDB4MzYsIDB4MzEsCi0gICAgMHgzOSwgMHgzYiwgMHg0MSwgMHgzOSwgMHgzYiwgMHg0MCwgMHgzNiwgMHgzNywgMHg0MiwgMHgzOSwgMHgzYSwgMHg0NiwKLSAgICAweDNmLCAweDMwLCAweDM4LCAweDM5LCAweDM1LCAweDMyLCAweDNlLCAweDNhLCAweDQzLCAweDQzLCAweDNlLCAweDMzLAotICAgIDB4NDIsIDB4M2YsIDB4NDEsIDB4M2MsIDB4NDYsIDB4MzQsIDB4MzQsIDB4NDAsIDB4NDMsIDB4MzcsIDB4MzIsIDB4NDMsCi0gICAgMHgzYywgMHgzNywgMHgzNiwgMHgzMywgMHgzZCwgMHgzNiwgMHgzYSwgMHg0MCwgMHgzOSwgMHgzOCwgMHgzMiwgMHgzZSwKLSAgICAweDMyLCAweDNkLCAweDM3LCAweDQ5LCAweDQyLCAweDQ3LCAweDQxLCAweDNiLCAweDNkLCAweDNjLCAweDNhLCAweDM3LAotICAgIDB4M2MsIDB4NDUsIDB4M2EsIDB4NDUsIDB4MzYsIDB4NDQsIDB4M2EsIDB4M2EsIDB4M2EsIDB4M2MsIDB4NDMsIDB4M2IsCi0gICAgMHgzYiwgMHgzNSwgMHgzOCwgMHg0NywgMHgzNiwgMHg0MCwgMHgzMiwgMHg0MywgMHgzZSwgMHgzOSwgMHg0MiwgMHg0MCwKLSAgICAweDJjLCAweDNjLCAweDRjLCAweDRjLCAweDQzLCAweDNiLCAweDM3LCAweDRhLCAweDNmLCAweDNjLCAweDQ1LCAweDQ0LAotICAgIDB4M2YsIDB4MzAsIDB4MzYsIDB4MzEsIDB4NGYsIDB4MmYsIDB4NWQsIDB4NGIsIDB4MzQsIDB4MzQsIDB4MmQsIDB4MmIsCi0gICAgMHg0NCwgMHgzMSwgMHg0ZSwgMHg0MCwgMHgyZSwgMHg0ZCwgMHg0OCwgMHgzZSwgMHgzNywgMHgyYiwgMHg0OSwgMHgyNSwKLSAgICAweDMxLCAweDQ5LCAweDQ0LCAweDQ5LCAweDM5LCAweDM5LCAweDRiLCAweDNhLCAweDNhLCAweDQxLCAweDNlLCAweDQyLAotICAgIDB4M2MsIDB4MzYsIDB4MzYsIDB4NGEsIDB4MzIsIDB4NDQsIDB4M2UsIDB4NDgsIDB4M2UsIDB4M2MsIDB4MzcsIDB4NDksCi0gICAgMHgzZCwgMHgzNCwgMHgzZiwgMHgzNywgMHgzMywgMHgzNiwgMHg0NiwgMHgzYSwgMHgzYSwgMHgzMSwgMHg0NSwgMHgzZiwKLSAgICAweDNhLCAweDMxLCAweDNiLCAweDMzLCAweDQxLCAweDQyLCAweDM1LCAweDM5LCAweDM4LCAweDQ0LCAweDM2LCAweDNhLAotICAgIDB4M2YsIDB4M2IsIDB4MzcsIDB4M2UsIDB4M2IsIDB4MzgsIDB4MmYsIDB4MzIsIDB4NDQsIDB4M2QsIDB4NDQsIDB4NDEsCi0gICAgMHgzOSwgMHgzNiwgMHgzYSwgMHgzNCwgMHgzOSwgMHgzOCwgMHgzNCwgMHgzZiwgMHgzYiwgMHgzNywgMHgzNCwgMHgzNCwKLSAgICAweDQwLCAweDNkLCAweDM0LCAweDNhLCAweDQ2LCAweDQyLCAweDNmLCAweDM0LCAweDM4LCAweDMzLCAweDM5LCAweDQ0LAotICAgIDB4M2YsIDB4NDEsIDB4M2MsIDB4MzEsIDB4NDAsIDB4MzIsIDB4M2YsIDB4MzcsIDB4MzcsIDB4NDEsIDB4M2UsIDB4MzUsCi0gICAgMHgzNywgMHg0OCwgMHgzYiwgMHg0MSwgMHgzZCwgMHgzYSwgMHgzZiwgMHgzNSwgMHgzMywgMHgzYywgMHgzNiwgMHgzYiwKLSAgICAweDNhLCAweDQ4LCAweDMzLCAweDQyLCAweDM3LCAweDMzLCAweDM5LCAweDQxLCAweDNjLCAweDNkLCAweDNiLCAweDRkLAotICAgIDB4MzksIDB4M2EsIDB4M2UsIDB4NDQsIDB4M2QsIDB4NDEsIDB4M2IsIDB4MzgsIDB4NDksIDB4NDEsIDB4M2EsIDB4MzgsCi0gICAgMHgzNCwgMHgzOCwgMHgzOCwgMHgzYywgMHg0NSwgMHgzYywgMHgzNywgMHgzYiwgMHgzNiwgMHgzZSwgMHg0YSwgMHg0YiwKLSAgICAweDQyLCAweDNmLCAweDMyLCAweDQ1LCAweDQ2LCAweDM1LCAweDQ2LCAweDQxLCAweDM4LCAweDMzLCAweDM5LCAweDM3LAotICAgIDB4NDQsIDB4MmIsIDB4NjAsIDB4NGEsIDB4MmEsIDB4MmUsIDB4MzUsIDB4MmQsIDB4NDMsIDB4MzcsIDB4NTEsIDB4NDcsCi0gICAgMHgyZiwgMHg0ZCwgMHg1MCwgMHgzZSwgMHgzYSwgMHgzMywgMHg0ZiwgMHgyYSwgMHgzNSwgMHg0NSwgMHg0YSwgMHg0YywKLSAgICAweDNiLCAweDNkLCAweDQzLCAweDQ0LCAweDNkLCAweDNmLCAweDRhLCAweDNlLCAweDQ5LCAweDM3LCAweDJlLCAweDRmLAotICAgIDB4MzksIDB4M2YsIDB4MzIsIDB4M2MsIDB4MzcsIDB4M2IsIDB4MzksIDB4NGQsIDB4MzQsIDB4M2YsIDB4NDYsIDB4NDQsCi0gICAgMHgzZCwgMHg0MCwgMHgzZiwgMHg0MCwgMHgzOSwgMHgzMywgMHgzOSwgMHgzZSwgMHgzZCwgMHg0MCwgMHgzMSwgMHgzMCwKLSAgICAweDM1LCAweDNkLCAweDNlLCAweDNhLCAweDNlLCAweDMyLCAweDMxLCAweDNlLCAweDQ4LCAweDNjLCAweDQwLCAweDQzLAotICAgIDB4M2YsIDB4M2YsIDB4MzQsIDB4MmUsIDB4M2EsIDB4M2UsIDB4M2IsIDB4NDMsIDB4NDUsIDB4MzIsIDB4M2EsIDB4MzEsCi0gICAgMHgzNywgMHgzOCwgMHgzMSwgMHgzNSwgMHgzNCwgMHgzZCwgMHg0MiwgMHgzNiwgMHg0NiwgMHgzNywgMHgzMiwgMHg0NywKLSAgICAweDQxLCAweDNjLCAweDM1LCAweDM1LCAweDM2LCAweDQxLCAweDNhLCAweDNiLCAweDQyLCAweDQ0LCAweDM2LCAweDMxLAotICAgIDB4M2MsIDB4M2QsIDB4MzQsIDB4MzQsIDB4M2IsIDB4NDAsIDB4NDAsIDB4MmUsIDB4NDAsIDB4NDYsIDB4M2IsIDB4NDMsCi0gICAgMHgzZiwgMHg0MCwgMHgzYiwgMHgzYSwgMHgzMiwgMHg0MCwgMHg0NiwgMHgzOSwgMHgzYywgMHg0OSwgMHgyZiwgMHgzZCwKLSAgICAweDQ5LCAweDNlLCAweDQ0LCAweDNjLCAweDNlLCAweDM1LCAweDNmLCAweDQ0LCAweDQxLCAweDQwLCAweDNlLCAweDQ3LAotICAgIDB4M2QsIDB4NDAsIDB4M2YsIDB4NDEsIDB4M2IsIDB4NDEsIDB4NDEsIDB4M2YsIDB4NDAsIDB4M2YsIDB4M2UsIDB4M2UsCi0gICAgMHgzZiwgMHg0MywgMHgzNSwgMHg0MCwgMHgyYiwgMHg0MiwgMHg0NSwgMHg1NiwgMHg0MCwgMHgzYywgMHgyZiwgMHg0NCwKLSAgICAweDQ0LCAweDNkLCAweDNlLCAweDNkLCAweDQwLCAweDJkLCAweDM5LCAweDMxLCAweDU0LCAweDJmLCAweDYxLCAweDQ4LAotICAgIDB4MmUsIDB4MzcsIDB4MzcsIDB4MzIsIDB4M2UsIDB4MmQsIDB4NTIsIDB4NGQsIDB4MmQsIDB4NGQsIDB4NGMsIDB4M2EsCi0gICAgMHgzYSwgMHgzMSwgMHg0ZSwgMHgyZCwgMHgzMSwgMHg0OCwgMHg0NywgMHg1NCwgMHg0NSwgMHgzOCwgMHgzYiwgMHgzZCwKLSAgICAweDQyLCAweDQxLCAweDQ0LCAweDRhLCAweDQ4LCAweDQyLCAweDJmLCAweDRkLCAweDMxLCAweDM0LCAweDNhLCAweDQ2LAotICAgIDB4MzcsIDB4NDQsIDB4MmMsIDB4NDUsIDB4NDYsIDB4NDMsIDB4NDAsIDB4M2YsIDB4MzQsIDB4MzMsIDB4NDAsIDB4MzksCi0gICAgMHgzMiwgMHgzNSwgMHgzYSwgMHg0MCwgMHgzZiwgMHgzZiwgMHgzNiwgMHgzMiwgMHgzZiwgMHgzZCwgMHgzNSwgMHg0OCwKLSAgICAweDNjLCAweDQ4LCAweDM3LCAweDM5LCAweDM1LCAweDNmLCAweDM3LCAweDNkLCAweDQ0LCAweDQ2LCAweDJkLCAweDJhLAotICAgIDB4NDcsIDB4MzgsIDB4M2EsIDB4MzksIDB4NDUsIDB4M2IsIDB4NDAsIDB4MmQsIDB4MzcsIDB4MzMsIDB4NDEsIDB4M2MsCi0gICAgMHg0MCwgMHgzNSwgMHgzZiwgMHgzMiwgMHgzYSwgMHgzNiwgMHg0MCwgMHg0MSwgMHgzYSwgMHgzYywgMHgzMywgMHgzMSwKLSAgICAweDQyLCAweDNmLCAweDQxLCAweDNhLCAweDQxLCAweDQ2LCAweDM4LCAweDJmLCAweDNjLCAweDNkLCAweDNkLCAweDM5LAotICAgIDB4M2IsIDB4NDYsIDB4NDEsIDB4MzEsIDB4NDYsIDB4MzYsIDB4NDAsIDB4NDgsIDB4M2MsIDB4MzMsIDB4NDIsIDB4MzIsCi0gICAgMHgzYiwgMHg0MCwgMHgzZiwgMHgzNiwgMHgzNywgMHg0NCwgMHgzNCwgMHgzNSwgMHgzMiwgMHgzMiwgMHgzNywgMHgzOCwKLSAgICAweDMzLCAweDNiLCAweDM3LCAweDRhLCAweDNmLCAweDQ2LCAweDNhLCAweDQxLCAweDMyLCAweDM3LCAweDMwLCAweDNlLAotICAgIDB4NDAsIDB4MzUsIDB4NDEsIDB4NDAsIDB4MzcsIDB4NDEsIDB4MmIsIDB4NDAsIDB4M2QsIDB4M2QsIDB4MzIsIDB4MzgsCi0gICAgMHgzNCwgMHgzZSwgMHg0NywgMHg2MSwgMHg0MywgMHgzYiwgMHgzYywgMHg0MiwgMHg0NiwgMHgzZCwgMHg0MCwgMHg0YSwKLSAgICAweDNjLCAweDJkLCAweDMzLCAweDM1LCAweDU1LCAweDM4LCAweDY5LCAweDRmLCAweDMzLCAweDM3LCAweDMwLCAweDM5LAotICAgIDB4NDQsIDB4MmUsIDB4NTgsIDB4NGIsIDB4MmEsIDB4NTEsIDB4NGIsIDB4M2MsIDB4MzksIDB4MmUsIDB4NTEsIDB4MmQsCi0gICAgMHgzMCwgMHg0YSwgMHg0MiwgMHg1MywgMHgzZiwgMHgzOSwgMHgzZSwgMHg0NCwgMHgzYiwgMHg0MCwgMHg0NywgMHg0NCwKLSAgICAweDQ3LCAweDNlLCAweDM5LCAweDRiLCAweDQwLCAweDNkLCAweDQyLCAweDM5LCAweDNiLCAweDM5LCAweDMyLCAweDQyLAotICAgIDB4MzYsIDB4MzYsIDB4MzYsIDB4NDIsIDB4NDQsIDB4MzQsIDB4MzMsIDB4NDAsIDB4NDAsIDB4NDAsIDB4M2EsIDB4M2EsCi0gICAgMHg0MSwgMHgzZiwgMHgzMSwgMHgzMCwgMHgzZiwgMHgzMSwgMHgzMCwgMHgzOSwgMHg0NiwgMHgzNiwgMHgzNSwgMHgzNCwKLSAgICAweDQwLCAweDQzLCAweDNjLCAweDQxLCAweDMxLCAweDQ2LCAweDM1LCAweDI2LCAweDQ0LCAweDMyLCAweDNkLCAweDM1LAotICAgIDB4M2QsIDB4M2MsIDB4MzYsIDB4MzIsIDB4MzksIDB4M2EsIDB4MzAsIDB4NDAsIDB4NDgsIDB4M2UsIDB4MzgsIDB4MzcsCi0gICAgMHg0NCwgMHgzYiwgMHgzZCwgMHg0MiwgMHgzZCwgMHgzYywgMHgzMiwgMHgyYiwgMHgzZiwgMHg0MSwgMHgzOSwgMHgzZCwKLSAgICAweDNlLCAweDNmLCAweDM1LCAweDJmLCAweDQ2LCAweDNkLCAweDNkLCAweDNiLCAweDQ1LCAweDM3LCAweDMxLCAweDM1LAotICAgIDB4NDQsIDB4NDAsIDB4M2EsIDB4NDUsIDB4M2EsIDB4M2MsIDB4MzksIDB4MzEsIDB4M2IsIDB4M2QsIDB4M2IsIDB4M2EsCi0gICAgMHg0MywgMHg0NCwgMHgzOSwgMHg0NywgMHg0NCwgMHgzNiwgMHgzZSwgMHgzOSwgMHg0OCwgMHgzZiwgMHgzOSwgMHg0YiwKLSAgICAweDNjLCAweDM2LCAweDNkLCAweDQ0LCAweDQ0LCAweDNmLCAweDM5LCAweDQzLCAweDNmLCAweDM3LCAweDNmLCAweDM3LAotICAgIDB4M2IsIDB4M2IsIDB4MzgsIDB4M2IsIDB4M2YsIDB4NDAsIDB4MzEsIDB4NDQsIDB4MzAsIDB4NDQsIDB4NDYsIDB4NWIsCi0gICAgMHg0NiwgMHgzZiwgMHgzOSwgMHg0MCwgMHg0MCwgMHgzNywgMHg0YSwgMHg0NiwgMHgzZiwgMHgzNiwgMHg0MCwgMHgzOSwKLSAgICAweDU5LCAweDNlLCAweDY2LCAweDU3LCAweDMyLCAweDM0LCAweDJlLCAweDMzLCAweDQ2LCAweDMxLCAweDU4LCAweDQ0LAotICAgIDB4MjYsIDB4NGMsIDB4NGIsIDB4M2MsIDB4MzksIDB4MmUsIDB4NGQsIDB4MzUsIDB4MzIsIDB4NDYsIDB4NTIsIDB4NTIsCi0gICAgMHgzZSwgMHg0MCwgMHgzOSwgMHgzYywgMHgzOSwgMHgzZCwgMHg1MywgMHg0OCwgMHg0MSwgMHgzYywgMHgzYiwgMHg0ZCwKLSAgICAweDNjLCAweDNlLCAweDM4LCAweDQ0LCAweDNhLCAweDNhLCAweDI5LCAweDRhLCAweDNjLCAweDM3LCAweDM2LCAweDM4LAotICAgIDB4M2EsIDB4MzEsIDB4MzcsIDB4MzksIDB4M2EsIDB4NDAsIDB4NDYsIDB4MzIsIDB4NDIsIDB4MzgsIDB4MzIsIDB4MmUsCi0gICAgMHgzYSwgMHg0NSwgMHg0NCwgMHgzNCwgMHgzNCwgMHgzOCwgMHgzMiwgMHgyZSwgMHgzNSwgMHg0MCwgMHgzYSwgMHg0MSwKLSAgICAweDQyLCAweDNkLCAweDM3LCAweDJjLCAweDNmLCAweDM3LCAweDNjLCAweDNkLCAweDNhLCAweDM2LCAweDMzLCAweDM1LAotICAgIDB4M2MsIDB4MzQsIDB4M2MsIDB4MzksIDB4M2MsIDB4M2EsIDB4MzcsIDB4MzAsIDB4MzAsIDB4M2UsIDB4M2QsIDB4M2EsCi0gICAgMHg0NCwgMHgzNywgMHgzNiwgMHgzMiwgMHgzNiwgMHgzNywgMHgzNiwgMHgzYSwgMHgzYywgMHg0MSwgMHgzYSwgMHgzNSwKLSAgICAweDM2LCAweDNhLCAweDM0LCAweDQwLCAweDM5LCAweDQwLCAweDNlLCAweDMyLCAweDM0LCAweDQ2LCAweDMzLCAweDNmLAotICAgIDB4MzYsIDB4NDUsIDB4M2UsIDB4MzUsIDB4M2YsIDB4MzgsIDB4M2YsIDB4M2UsIDB4M2IsIDB4M2EsIDB4MzYsIDB4M2IsCi0gICAgMHgzNiwgMHgzOCwgMHgzMiwgMHgzZiwgMHg0NCwgMHgzYywgMHgzNSwgMHg0OCwgMHgzOCwgMHgzOSwgMHgzMSwgMHg0OSwKLSAgICAweDNkLCAweDQzLCAweDM2LCAweDNmLCAweDMxLCAweDQzLCAweDM2LCAweDNlLCAweDNlLCAweDQxLCAweDM5LCAweDNiLAotICAgIDB4NDAsIDB4NDIsIDB4M2MsIDB4NDMsIDB4MzYsIDB4NGEsIDB4NDgsIDB4NjcsIDB4NGUsIDB4NDMsIDB4MzYsIDB4NDYsCi0gICAgMHg0NCwgMHgzZiwgMHg0YiwgMHg0YiwgMHgzZiwgMHgzOCwgMHgzYywgMHgzYywgMHg1ZSwgMHgzOCwgMHg3MCwgMHg1MiwKLSAgICAweDM4LCAweDMyLCAweDNiLCAweDM2LCAweDRhLCAweDJjLCAweDUyLCAweDQ2LCAweDI5LCAweDRmLCAweDQ4LCAweDQyLAotICAgIDB4MmQsIDB4MmUsIDB4NGYsIDB4MjgsIDB4MjgsIDB4NDUsIDB4NGQsIDB4NTIsIDB4NDIsIDB4M2UsIDB4M2YsIDB4NDEsCi0gICAgMHgzYywgMHgzYSwgMHg0NywgMHg1MCwgMHg0NCwgMHg0NSwgMHgzMywgMHg0YiwgMHgzZSwgMHgzZiwgMHg0MiwgMHgzZCwKLSAgICAweDQzLCAweDM0LCAweDI3LCAweDNmLCAweDQyLCAweDNlLCAweDQzLCAweDNlLCAweDNhLCAweDNjLCAweDM3LCAweDNiLAotICAgIDB4M2YsIDB4MzAsIDB4M2EsIDB4M2UsIDB4M2MsIDB4MzQsIDB4MzcsIDB4MjQsIDB4M2QsIDB4NDMsIDB4NDAsIDB4NDQsCi0gICAgMHg0MCwgMHg0NiwgMHgzMSwgMHgyZiwgMHg0MywgMHgzOCwgMHgzOCwgMHgzOSwgMHgzYywgMHgzNCwgMHgyZCwgMHgyYSwKLSAgICAweDM4LCAweDMxLCAweDQzLCAweDNiLCAweDM5LCAweDNiLCAweDMyLCAweDM0LCAweDNlLCAweDM5LCAweDQxLCAweDNiLAotICAgIDB4M2UsIDB4MzMsIDB4M2EsIDB4MmEsIDB4NDEsIDB4M2YsIDB4M2MsIDB4NDMsIDB4M2IsIDB4M2UsIDB4MzUsIDB4MmMsCi0gICAgMHgzOCwgMHg0MSwgMHgzMywgMHgzMSwgMHgzZSwgMHgzZiwgMHgzYSwgMHgzYywgMHgzYiwgMHgzNSwgMHgzZiwgMHgzZCwKLSAgICAweDQyLCAweDNhLCAweDNjLCAweDM1LCAweDNmLCAweDQwLCAweDNjLCAweDNlLCAweDM3LCAweDQxLCAweDNkLCAweDM4LAotICAgIDB4MzQsIDB4MzEsIDB4MzYsIDB4M2QsIDB4M2QsIDB4NDcsIDB4MzYsIDB4NDQsIDB4M2YsIDB4NDUsIDB4M2MsIDB4M2MsCi0gICAgMHgzNSwgMHgzNiwgMHgzMSwgMHg0ZiwgMHg0NiwgMHgzYSwgMHg0MSwgMHg0MiwgMHg0MCwgMHgzMiwgMHgzMywgMHg0MSwKLSAgICAweDM0LCAweDQwLCAweDNkLCAweDQzLCAweDNiLCAweDNhLCAweDMyLCAweDNjLCAweDQyLCAweDQyLCAweDNkLCAweDQzLAotICAgIDB4MzcsIDB4NDUsIDB4NDUsIDB4ZmYsIDB4NGIsIDB4NDUsIDB4M2IsIDB4NDAsIDB4NDMsIDB4M2UsIDB4NDcsIDB4NDksCi0gICAgMHgzZCwgMHgzYiwgMHgzZSwgMHgzMywgMHg1OCwgMHgzNSwgMHg3MSwgMHg1NCwgMHgyZiwgMHgzOCwgMHgzOCwgMHgzMywKLSAgICAweDQ3LCAweDM1LCAweDViLCAweDQ2LCAweDJjLCAweDRjLCAweDQzLCAweDM3LCAweDM2LCAweDM5LCAweDRmLCAweDMwLAotICAgIDB4MjYsIDB4NDgsIDB4NTEsIDB4NDgsIDB4NDYsIDB4NDUsIDB4M2IsIDB4MzksIDB4NDIsIDB4NTAsIDB4NDcsIDB4NGMsCi0gICAgMHg0YiwgMHgzYiwgMHgzZCwgMHg0ZCwgMHg0MSwgMHgzNCwgMHg0MCwgMHg0NCwgMHgzOCwgMHgzMiwgMHgyZCwgMHg0MywKLSAgICAweDM5LCAweDM2LCAweDNiLCAweDNiLCAweDQwLCAweDNkLCAweDM3LCAweDNjLCAweDQ0LCAweDM5LCAweDQyLCAweDM3LAotICAgIDB4MzgsIDB4MzgsIDB4MzIsIDB4MmYsIDB4NDEsIDB4NDAsIDB4M2YsIDB4M2EsIDB4MzcsIDB4MzUsIDB4M2IsIDB4MmEsCi0gICAgMHgzNywgMHgzMCwgMHgzYywgMHgzNywgMHg0MCwgMHgzOCwgMHgzYSwgMHgyNywgMHg0NCwgMHgzZCwgMHg0MywgMHg0MCwKLSAgICAweDM1LCAweDNmLCAweDNlLCAweDMyLCAweDNlLCAweDNjLCAweDQwLCAweDM5LCAweDM5LCAweDNhLCAweDQxLCAweDMxLAotICAgIDB4M2IsIDB4M2YsIDB4MzQsIDB4NDMsIDB4M2EsIDB4MzgsIDB4NDIsIDB4MmEsIDB4NDcsIDB4NDYsIDB4M2IsIDB4MzgsCi0gICAgMHg0NywgMHg0NSwgMHgzOSwgMHgzMSwgMHg0MywgMHg0MCwgMHgzNywgMHgzYSwgMHgzZCwgMHgzZSwgMHgzOSwgMHgzMCwKLSAgICAweDM2LCAweDM3LCAweDNhLCAweDQzLCAweDNmLCAweDMyLCAweDMxLCAweDQxLCAweDQ1LCAweDNlLCAweDQzLCAweDM4LAotICAgIDB4M2YsIDB4MzcsIDB4M2MsIDB4NDksIDB4M2IsIDB4MzMsIDB4M2QsIDB4M2EsIDB4MzcsIDB4NDQsIDB4MzIsIDB4NTAsCi0gICAgMHgzOSwgMHg0NCwgMHgzZSwgMHgzZiwgMHgzZCwgMHg0MSwgMHgzZSwgMHgzZSwgMHg0MiwgMHg0NCwgMHg0NSwgMHgzZiwKLSAgICAweDM2LCAweDNmLCAweDM3LCAweDM5LCAweDNiLCAweDNkLCAweDNiLCAweDNiLCAweDJmLCAweDQ2LCAweDQwLCAweDZkLAotICAgIDB4NTAsIDB4NDUsIDB4M2IsIDB4NDUsIDB4NDYsIDB4M2IsIDB4NDIsIDB4NDgsIDB4NDIsIDB4M2MsIDB4MzksIDB4MzcsCi0gICAgMHg1NywgMHgzYiwgMHg2YywgMHg1YiwgMHgzMiwgMHgzNSwgMHgzZCwgMHgzOSwgMHg0OCwgMHgzMSwgMHg1YywgMHg0NiwKLSAgICAweDI5LCAweDRjLCAweDNmLCAweDNlLCAweDM3LCAweDMzLCAweDU4LCAweDMyLCAweDJhLCAweDQzLCAweDRjLCAweDUwLAotICAgIDB4M2IsIDB4NDQsIDB4M2MsIDB4NDEsIDB4MzksIDB4NDgsIDB4NTUsIDB4NGMsIDB4NDIsIDB4MzgsIDB4M2IsIDB4NTEsCi0gICAgMHgzZiwgMHgzOCwgMHg0NCwgMHg0NiwgMHgzNiwgMHgzYiwgMHgzOCwgMHg0YSwgMHgzZiwgMHgzNywgMHgzNiwgMHgzYywKLSAgICAweDMxLCAweDNkLCAweDMyLCAweDM5LCAweDNiLCAweDNmLCAweDNlLCAweDM1LCAweDM4LCAweDNmLCAweDM0LCAweDJiLAotICAgIDB4MzcsIDB4MzYsIDB4MzksIDB4NDAsIDB4MzcsIDB4NDEsIDB4MzIsIDB4MjcsIDB4MzYsIDB4MzMsIDB4NDAsIDB4M2EsCi0gICAgMHgzZiwgMHg0NCwgMHgzZiwgMHgyNSwgMHgzOCwgMHgzNCwgMHg0MiwgMHgzYywgMHgzYSwgMHg0MCwgMHgzOCwgMHgzMSwKLSAgICAweDQ5LCAweDNlLCAweDMzLCAweDNkLCAweDMxLCAweDM2LCAweDM5LCAweDJiLCAweDQ0LCAweDJmLCAweDQzLCAweDM0LAotICAgIDB4MzQsIDB4MzcsIDB4MzksIDB4MzMsIDB4M2IsIDB4MzQsIDB4NDIsIDB4M2MsIDB4NDAsIDB4NDUsIDB4MzYsIDB4MzEsCi0gICAgMHg0MywgMHg0NywgMHgzZSwgMHgzZiwgMHg0MCwgMHgzYSwgMHgzMywgMHgzNCwgMHg0MSwgMHg0NCwgMHgzYSwgMHg0MywKLSAgICAweDNlLCAweDM4LCAweDM2LCAweDMxLCAweDQyLCAweDQ0LCAweDQwLCAweDQxLCAweDQ0LCAweDQzLCAweDMzLCAweDQyLAotICAgIDB4M2QsIDB4NDEsIDB4M2QsIDB4M2UsIDB4M2MsIDB4MzksIDB4M2UsIDB4NGYsIDB4M2YsIDB4MzcsIDB4MzEsIDB4NDAsCi0gICAgMHgzYiwgMHgzOCwgMHgzNSwgMHgzYiwgMHg0NCwgMHg0MSwgMHg0MSwgMHgzNywgMHg0MCwgMHg0MiwgMHgyZCwgMHgzZCwKLSAgICAweDM5LCAweDQ4LCAweDQ0LCAweDNlLCAweDM0LCAweDQ4LCAweDQ5LCAweDZkLCAweDQ1LCAweDRiLCAweDNhLCAweDQ0LAotICAgIDB4NDksIDB4NDAsIDB4NGQsIDB4NTEsIDB4M2YsIDB4MzQsIDB4M2IsIDB4NDAsIDB4NTIsIDB4MzQsIDB4NmYsIDB4NTYsCi0gICAgMHgzMywgMHgzZSwgMHg0MCwgMHgzOSwgMHg0MSwgMHgzMiwgMHg1ZCwgMHg0NSwgMHgyZSwgMHg1MSwgMHg0OCwgMHgzYywKLSAgICAweDJlLCAweDJlLCAweDUxLCAweDM5LCAweDMyLCAweDQ1LCAweDRhLCAweDRjLCAweDNiLCAweDQwLCAweDQwLCAweDNiLAotICAgIDB4MzYsIDB4NDEsIDB4NTQsIDB4NGUsIDB4NGEsIDB4NDksIDB4M2IsIDB4NGQsIDB4M2MsIDB4NDEsIDB4MzgsIDB4NDcsCi0gICAgMHgzZCwgMHgzYywgMHgzNywgMHg0OCwgMHgzZiwgMHg0MiwgMHgzZSwgMHgzNiwgMHgzOSwgMHg0NiwgMHgzNywgMHgzZSwKLSAgICAweDNiLCAweDM4LCAweDQwLCAweDNiLCAweDM5LCAweDMyLCAweDNlLCAweDI5LCAweDM3LCAweDM1LCAweDNjLCAweDNkLAotICAgIDB4MzcsIDB4M2IsIDB4MzUsIDB4MmYsIDB4MzIsIDB4M2IsIDB4MzcsIDB4M2MsIDB4NDAsIDB4M2UsIDB4MzksIDB4MjcsCi0gICAgMHgzYiwgMHgzOCwgMHgzNywgMHgzNiwgMHgzOSwgMHgzNywgMHgzNywgMHgzNSwgMHg0MiwgMHgzZSwgMHgzYiwgMHg0MywKLSAgICAweDQxLCAweDNjLCAweDM3LCAweDJhLCAweDNhLCAweDNlLCAweDM4LCAweDQwLCAweDM2LCAweDNlLCAweDQ0LCAweDJlLAotICAgIDB4M2UsIDB4M2EsIDB4MzcsIDB4M2IsIDB4M2UsIDB4NDEsIDB4M2QsIDB4MzAsIDB4M2IsIDB4M2YsIDB4NDEsIDB4NDUsCi0gICAgMHgzYSwgMHg0OCwgMHgzNywgMHgyZiwgMHgzYSwgMHgzNywgMHgzNCwgMHg0MywgMHg0MiwgMHgzZCwgMHgzOCwgMHg0MSwKLSAgICAweDNiLCAweDNjLCAweDM5LCAweDNjLCAweDM5LCAweDQ3LCAweDJlLCAweDQxLCAweDQyLCAweDQwLCAweDMyLCAweDM2LAotICAgIDB4NDMsIDB4NDAsIDB4M2QsIDB4NGMsIDB4MzgsIDB4M2UsIDB4M2IsIDB4NDEsIDB4M2QsIDB4M2IsIDB4MzQsIDB4NDMsCi0gICAgMHg0MywgMHgzZiwgMHg0NCwgMHgzYywgMHgzYSwgMHgzMywgMHgzOSwgMHg0MiwgMHg0MywgMHgzZiwgMHgzMywgMHgzZCwKLSAgICAweDMzLCAweDNlLCAweDQ4LCAweDZiLCAweDQ4LCAweDQzLCAweDM2LCAweDQ3LCAweDQ5LCAweDQ0LCAweDRhLCAweDQ5LAotICAgIDB4M2MsIDB4MzEsIDB4MzUsIDB4M2UsIDB4NWMsIDB4MzQsIDB4NzMsIDB4NTMsIDB4MzMsIDB4M2MsIDB4MzIsIDB4M2IsCi0gICAgMHg0MywgMHgyNywgMHg1OSwgMHg0ZSwgMHgyYiwgMHg1MSwgMHg0ZiwgMHgzNywgMHgzNiwgMHgzNCwgMHg1NiwgMHgzNCwKLSAgICAweDMyLCAweDRmLCAweDQ2LCAweDUwLCAweDQwLCAweDQwLCAweDNjLCAweDNlLCAweDM0LCAweDM3LCAweDUwLCAweDQ5LAotICAgIDB4NDMsIDB4NDcsIDB4M2UsIDB4NTIsIDB4NDQsIDB4MzgsIDB4M2IsIDB4NGYsIDB4M2EsIDB4M2QsIDB4MmIsIDB4NGMsCi0gICAgMHg0MCwgMHgzOCwgMHgzYSwgMHgzNSwgMHgzYSwgMHgzYSwgMHgzZCwgMHgzOCwgMHgzZCwgMHgzYiwgMHgzNywgMHg0OCwKLSAgICAweDNkLCAweDNkLCAweDMyLCAweDMwLCAweDNhLCAweDM0LCAweDNmLCAweDNhLCAweDNiLCAweDNlLCAweDM1LCAweDJmLAotICAgIDB4M2IsIDB4M2EsIDB4NDUsIDB4M2QsIDB4NDIsIDB4MzMsIDB4MzMsIDB4MjQsIDB4NDQsIDB4MzksIDB4M2MsIDB4M2QsCi0gICAgMHg0MSwgMHgzYywgMHgzNywgMHgyYywgMHgzYiwgMHgzNiwgMHgzNCwgMHg0MSwgMHgzZCwgMHgzZiwgMHgzOSwgMHgzMiwKLSAgICAweDNjLCAweDQwLCAweDQ0LCAweDNkLCAweDQxLCAweDNkLCAweDNhLCAweDI5LCAweDNlLCAweDNlLCAweDQzLCAweDMzLAotICAgIDB4M2YsIDB4M2UsIDB4M2UsIDB4MzEsIDB4MzgsIDB4M2EsIDB4MzQsIDB4M2QsIDB4M2YsIDB4M2UsIDB4M2EsIDB4M2QsCi0gICAgMHgzZSwgMHg0OCwgMHg0NSwgMHgzZCwgMHg0NCwgMHgzNywgMHgzMywgMHgzZCwgMHg0NSwgMHgzOSwgMHg0MCwgMHg0MCwKLSAgICAweDQyLCAweDNmLCAweDNmLCAweDNkLCAweDNhLCAweDNiLCAweDQxLCAweDMzLCAweDQxLCAweDNjLCAweDMyLCAweDU1LAotICAgIDB4NDMsIDB4M2EsIDB4MzIsIDB4NDAsIDB4M2MsIDB4M2UsIDB4NDAsIDB4NDMsIDB4MzcsIDB4M2YsIDB4NDAsIDB4MzgsCi0gICAgMHg0MywgMHg0MSwgMHgzNiwgMHg0MiwgMHg0NCwgMHgzYywgMHgzMiwgMHgzZiwgMHgzOCwgMHg0MiwgMHg0NiwgMHg1OSwKLSAgICAweDRjLCAweDQxLCAweDM5LCAweDQ3LCAweDQ2LCAweDQ2LCAweDQ0LCAweDQ0LCAweDM1LCAweDQyLCAweDMyLCAweDM5LAotICAgIDB4NGYsIDB4MzQsIDB4NmQsIDB4NTUsIDB4MzEsIDB4M2IsIDB4M2EsIDB4M2YsIDB4NDQsIDB4MmMsIDB4NWQsIDB4NDMsCi0gICAgMHgyNiwgMHg0YSwgMHg0ZiwgMHg0MCwgMHgzNiwgMHgzMiwgMHg0ZCwgMHgzMywgMHgyZiwgMHg1MCwgMHg0ZCwgMHg1NywKLSAgICAweDNiLCAweDQwLCAweDQyLCAweDQ0LCAweDQxLCAweDNmLCAweDUyLCAweDRlLCAweDM1LCAweDQxLCAweDQ0LCAweDUyLAotICAgIDB4NDAsIDB4MzUsIDB4MzksIDB4NGIsIDB4NDUsIDB4MzQsIDB4MmMsIDB4NGEsIDB4M2IsIDB4NDEsIDB4MzEsIDB4MzMsCi0gICAgMHgzZiwgMHgzYSwgMHgzNiwgMHgzYywgMHgzYywgMHgzMywgMHgzMCwgMHgzOCwgMHg0MywgMHgzZiwgMHgzMiwgMHgyZCwKLSAgICAweDNmLCAweDNhLCAweDM4LCAweDQxLCAweDM5LCAweDQ1LCAweDM2LCAweDJlLCAweDNjLCAweDM4LCAweDQ1LCAweDNmLAotICAgIDB4NDAsIDB4M2YsIDB4M2UsIDB4MjYsIDB4NDEsIDB4MzcsIDB4M2MsIDB4NDQsIDB4M2YsIDB4M2YsIDB4MzUsIDB4MzcsCi0gICAgMHg0NiwgMHgzNCwgMHgzNywgMHgzZSwgMHg0OCwgMHgzOCwgMHgzNiwgMHgzNCwgMHgzMywgMHgzOSwgMHg0MCwgMHgzYywKLSAgICAweDQyLCAweDNkLCAweDNiLCAweDMxLCAweDM4LCAweDNiLCAweDQ0LCAweDQyLCAweDQ1LCAweDM4LCAweDQxLCAweDMwLAotICAgIDB4M2QsIDB4NDIsIDB4MzYsIDB4M2YsIDB4M2IsIDB4NDUsIDB4MzcsIDB4MzIsIDB4M2MsIDB4MzcsIDB4M2QsIDB4NDIsCi0gICAgMHgzOCwgMHgzZCwgMHgyZiwgMHgzMSwgMHgzOSwgMHg0MCwgMHgzZiwgMHg0NCwgMHgzYSwgMHg0MSwgMHg0NCwgMHg0NiwKLSAgICAweDNkLCAweDNhLCAweDMyLCAweDNiLCAweDM0LCAweDQ3LCAweDM2LCAweDRjLCAweDQ3LCAweDM1LCAweDNjLCAweDMzLAotICAgIDB4M2IsIDB4M2MsIDB4MzAsIDB4NDMsIDB4NDMsIDB4M2YsIDB4MzEsIDB4NDAsIDB4M2EsIDB4MzcsIDB4MzAsIDB4NDYsCi0gICAgMHgzOSwgMHgzYiwgMHg0MiwgMHg0MCwgMHgyZCwgMHgzZiwgMHgzZSwgMHg2YSwgMHg1MCwgMHgzYiwgMHgzMSwgMHg1NCwKLSAgICAweDQ3LCAweDNkLCAweDQ4LCAweDRlLCAweDNiLCAweDQxLCAweDNhLCAweDM5LCAweDQ5LCAweDM2LCAweDY0LCAweDRlLAotICAgIDB4MzIsIDB4MzksIDB4M2QsIDB4MzcsIDB4NDIsIDB4MmMsIDB4NWMsIDB4NDMsIDB4MmEsIDB4NGIsIDB4NGIsIDB4NDYsCi0gICAgMHgzMCwgMHgyOSwgMHg1MiwgMHgzMSwgMHgzNSwgMHg0NCwgMHg0YSwgMHg0YiwgMHgzZCwgMHgzYiwgMHg0ZSwgMHg0MiwKLSAgICAweDNkLCAweDM5LCAweDQyLCAweDUyLCAweDNmLCAweDM2LCAweDNlLCAweDUwLCAweDNmLCAweDMyLCAweDM1LCAweDNhLAotICAgIDB4NDAsIDB4MzksIDB4MzUsIDB4NDgsIDB4M2IsIDB4M2UsIDB4NDEsIDB4NDMsIDB4NDMsIDB4NDUsIDB4MmYsIDB4MzYsCi0gICAgMHgzOCwgMHgzNCwgMHgzZiwgMHg0NCwgMHgzMiwgMHgzZiwgMHgzNywgMHgzMywgMHgzMywgMHgzNSwgMHgyZSwgMHg0MSwKLSAgICAweDM3LCAweDNlLCAweDM4LCAweDI4LCAweDQ5LCAweDMwLCAweDQ2LCAweDM5LCAweDNiLCAweDMwLCAweDM4LCAweDI4LAotICAgIDB4M2IsIDB4M2QsIDB4M2EsIDB4NDMsIDB4M2YsIDB4MzQsIDB4NDMsIDB4MzYsIDB4MzksIDB4M2MsIDB4M2UsIDB4M2UsCi0gICAgMHgzOSwgMHgzYiwgMHgzOSwgMHgzMiwgMHgzYywgMHgzNiwgMHgzZSwgMHgzOCwgMHgzNCwgMHgzYywgMHgzYSwgMHgyYSwKLSAgICAweDQ2LCAweDNkLCAweDQwLCAweDM3LCAweDNiLCAweDM5LCAweDNiLCAweDM0LCAweDM4LCAweDMxLCAweDQzLCAweDQ2LAotICAgIDB4M2IsIDB4NDMsIDB4MzksIDB4MmIsIDB4MzgsIDB4NDAsIDB4M2UsIDB4MzksIDB4MzUsIDB4M2QsIDB4MmMsIDB4MzYsCi0gICAgMHgzNywgMHg0MCwgMHgzNiwgMHg0MCwgMHg0MSwgMHgzOCwgMHgzMiwgMHgzZiwgMHgzNiwgMHg0NiwgMHgzNCwgMHgzMSwKLSAgICAweDQwLCAweDNlLCAweDNjLCAweDRlLCAweDQyLCAweDNkLCAweDM2LCAweDNmLCAweDQyLCAweDNmLCAweDMzLCAweDQwLAotICAgIDB4MzQsIDB4MzcsIDB4M2MsIDB4M2IsIDB4MzEsIDB4NDcsIDB4MzIsIDB4M2MsIDB4MzQsIDB4M2QsIDB4NDIsIDB4M2IsCi0gICAgMHgzNywgMHg0MSwgMHgzYiwgMHg2NCwgMHg1MiwgMHg0MCwgMHgzNiwgMHg0ZSwgMHg0NiwgMHgzZiwgMHgzZiwgMHg0NywKLSAgICAweDNjLCAweDNhLCAweDNhLCAweDQxLCAweDRhLCAweDMyLCAweDVlLCAweDUwLCAweDJkLCAweDM5LCAweDNhLCAweDM4LAotICAgIDB4M2QsIDB4MmMsIDB4NWEsIDB4M2UsIDB4MmUsIDB4NDcsIDB4M2UsIDB4M2UsIDB4MzMsIDB4MjksIDB4NGMsIDB4MzUsCi0gICAgMHgzMCwgMHg0ZCwgMHg0ZCwgMHg0ZCwgMHgzOCwgMHg0MiwgMHg1MSwgMHg0NywgMHgzOSwgMHgzYywgMHg0MywgMHg0YiwKLSAgICAweDQyLCAweDNmLCAweDNhLCAweDRiLCAweDQ0LCAweDNmLCAweDNhLCAweDQ0LCAweDNlLCAweDM3LCAweDMwLCAweDQ1LAotICAgIDB4M2QsIDB4MzYsIDB4MzQsIDB4M2YsIDB4MzYsIDB4MzUsIDB4MzcsIDB4MzYsIDB4NDMsIDB4M2IsIDB4MzcsIDB4M2UsCi0gICAgMHgzNSwgMHgzZSwgMHgzMiwgMHgzNCwgMHgzMiwgMHgzOCwgMHgzYywgMHgzYSwgMHgzYSwgMHgzYywgMHgzMCwgMHgyYiwKLSAgICAweDMxLCAweDM3LCAweDMwLCAweDQyLCAweDM2LCAweDM3LCAweDM2LCAweDJjLCAweDNjLCAweDMxLCAweDQxLCAweDM3LAotICAgIDB4NDQsIDB4NDEsIDB4M2IsIDB4MzcsIDB4NDEsIDB4M2YsIDB4MzgsIDB4M2IsIDB4M2EsIDB4M2EsIDB4M2MsIDB4MmYsCi0gICAgMHg0NywgMHg0MSwgMHgzZSwgMHgzMywgMHg0MiwgMHgzYSwgMHgzMiwgMHgzNCwgMHg0NCwgMHg0MCwgMHg0MywgMHgzZCwKLSAgICAweDM0LCAweDQxLCAweDM4LCAweDM1LCAweDM1LCAweDNiLCAweDQ1LCAweDM4LCAweDMyLCAweDM3LCAweDNjLCAweDJlLAotICAgIDB4MzksIDB4NDAsIDB4MzAsIDB4M2UsIDB4NDIsIDB4MzUsIDB4M2QsIDB4MzYsIDB4M2UsIDB4M2QsIDB4MzksIDB4NDYsCi0gICAgMHgzZiwgMHgzNiwgMHgzNywgMHg0OSwgMHg0MSwgMHgzOSwgMHgzZCwgMHgzZCwgMHgzMywgMHg0NCwgMHg0MiwgMHg1MCwKLSAgICAweDNkLCAweDNjLCAweDNlLCAweDNmLCAweDQyLCAweDQyLCAweDNiLCAweDNkLCAweDQxLCAweDMxLCAweDM5LCAweDNhLAotICAgIDB4NDQsIDB4MzQsIDB4MzgsIDB4NDcsIDB4NDQsIDB4MzgsIDB4M2IsIDB4NDIsIDB4MzAsIDB4NDIsIDB4NDQsIDB4NTcsCi0gICAgMHg0OSwgMHgzYSwgMHgzOSwgMHg0ZiwgMHg0MSwgMHgzZSwgMHg0MCwgMHg0MywgMHgzNywgMHg0MiwgMHgzYiwgMHg0OCwKLSAgICAweDUwLCAweDI5LCAweDViLCAweDQ0LCAweDJjLCAweDQwLCAweDNmLCAweDNjLCAweDQ2LCAweDM0LCAweDVjLCAweDQxLAotICAgIDB4MmMsIDB4NDgsIDB4NDYsIDB4NDYsIDB4MzUsIDB4MzIsIDB4NGMsIDB4MzUsIDB4MmYsIDB4M2IsIDB4NDgsIDB4NDQsCi0gICAgMHg0MSwgMHg0MSwgMHg0OSwgMHg0NSwgMHgzNCwgMHgzNywgMHg0NCwgMHg0NSwgMHg0MywgMHgzYiwgMHg0MiwgMHg0NCwKLSAgICAweDNhLCAweDM3LCAweDQ4LCAweDQ5LCAweDM0LCAweDM5LCAweDMzLCAweDRhLCAweDQwLCAweDNkLCAweDMzLCAweDM5LAotICAgIDB4MzksIDB4M2IsIDB4MzAsIDB4MzEsIDB4M2QsIDB4NDcsIDB4M2MsIDB4M2EsIDB4MzQsIDB4M2MsIDB4M2EsIDB4MmIsCi0gICAgMHgzYSwgMHgzNCwgMHg0MSwgMHg0MCwgMHg0MiwgMHgzNiwgMHg0NCwgMHgyYywgMHg0MCwgMHg0NywgMHgzYiwgMHgzNywKLSAgICAweDM4LCAweDQyLCAweDQ0LCAweDI5LCAweDM2LCAweDNkLCAweDNkLCAweDM2LCAweDQyLCAweDNiLCAweDM1LCAweDM2LAotICAgIDB4NDMsIDB4MzksIDB4NDEsIDB4M2QsIDB4NDUsIDB4NDEsIDB4MzEsIDB4MzIsIDB4NDAsIDB4M2QsIDB4M2MsIDB4NDEsCi0gICAgMHgzZSwgMHgzZCwgMHgzNSwgMHgzNCwgMHgzMiwgMHgzOCwgMHgzNiwgMHgzZiwgMHgzYiwgMHgzZCwgMHgzOSwgMHgzNiwKLSAgICAweDQwLCAweDNlLCAweDNkLCAweDNhLCAweDNhLCAweDNiLCAweDNjLCAweDMyLCAweDQwLCAweDM0LCAweDNhLCAweDM2LAotICAgIDB4NDIsIDB4NDcsIDB4M2UsIDB4MzMsIDB4M2EsIDB4NDQsIDB4MzAsIDB4MzksIDB4NDAsIDB4M2EsIDB4MzYsIDB4NDQsCi0gICAgMHgzYywgMHgzYiwgMHgzZiwgMHgzMywgMHgzZSwgMHgzYywgMHgzNSwgMHg1MywgMHg0MywgMHgzYywgMHgzZiwgMHg0MywKLSAgICAweDNkLCAweDQ0LCAweDMzLCAweDQ3LCAweDQyLCAweDQwLCAweDM3LCAweDNiLCAweDQzLCAweDNmLCAweDMzLCAweDQxLAotICAgIDB4MzgsIDB4NDIsIDB4NDQsIDB4M2QsIDB4MmQsIDB4M2YsIDB4NDYsIDB4NDksIDB4NGUsIDB4M2YsIDB4MzYsIDB4NDUsCi0gICAgMHg0NSwgMHgzOSwgMHg0MCwgMHg0MiwgMHgzOSwgMHgzOSwgMHgzYSwgMHg0MiwgMHg0NSwgMHgyYywgMHg2MSwgMHg0NCwKLSAgICAweDMwLCAweDQ1LCAweDM4LCAweDNhLCAweDQwLCAweDM3LCAweDU4LCAweDM5LCAweDMxLCAweDNlLCAweDNhLCAweDNlLAotICAgIDB4MzcsIDB4MzIsIDB4NGEsIDB4MzksIDB4MmUsIDB4NDcsIDB4M2UsIDB4NGUsIDB4M2YsIDB4M2UsIDB4NDgsIDB4NDUsCi0gICAgMHgzZiwgMHg0OCwgMHgzYSwgMHgzZiwgMHg0MCwgMHgzNiwgMHgzYSwgMHg0NCwgMHgzNiwgMHgzZSwgMHgzZCwgMHg0MSwKLSAgICAweDQ1LCAweDM2LCAweDM2LCAweDRiLCAweDNhLCAweDNkLCAweDQ1LCAweDQ4LCAweDM4LCAweDQ1LCAweDM5LCAweDM4LAotICAgIDB4MzgsIDB4M2EsIDB4NDIsIDB4MzQsIDB4M2YsIDB4MzQsIDB4MzksIDB4MzQsIDB4MzIsIDB4M2YsIDB4M2MsIDB4M2QsCi0gICAgMHgzZCwgMHg0NywgMHgzYSwgMHgyZiwgMHgzYywgMHgzZSwgMHgzZiwgMHgzOSwgMHgzNSwgMHg0MiwgMHgzYywgMHgyYSwKLSAgICAweDNiLCAweDM1LCAweDQyLCAweDQ0LCAweDQ2LCAweDM5LCAweDM4LCAweDM5LCAweDQzLCAweDNhLCAweDM4LCAweDQyLAotICAgIDB4M2QsIDB4M2EsIDB4NDAsIDB4MzUsIDB4MzQsIDB4MzksIDB4M2EsIDB4MzgsIDB4NDMsIDB4NDIsIDB4NDIsIDB4MmQsCi0gICAgMHgzMSwgMHgzYiwgMHgzMywgMHg0MCwgMHgzYiwgMHg0NywgMHgzNSwgMHgzMCwgMHgzYSwgMHgzYywgMHgzYiwgMHg0NywKLSAgICAweDNhLCAweDNjLCAweDM4LCAweDM1LCAweDNjLCAweDM1LCAweDNlLCAweDNlLCAweDM5LCAweDNkLCAweDM5LCAweDQwLAotICAgIDB4MzcsIDB4MzMsIDB4NDksIDB4MzgsIDB4M2MsIDB4NDMsIDB4MzQsIDB4NDAsIDB4MzksIDB4NDIsIDB4M2MsIDB4M2IsCi0gICAgMHgzZSwgMHg0NSwgMHgzZSwgMHg1MSwgMHgzZCwgMHgzZiwgMHgzYiwgMHgzNCwgMHgzNywgMHgzYywgMHg0MCwgMHg0NywKLSAgICAweDNjLCAweDQxLCAweDNmLCAweDQxLCAweDM3LCAweDNlLCAweDM2LCAweDNjLCAweDQyLCAweDQwLCAweDNmLCAweDNhLAotICAgIDB4M2IsIDB4NDIsIDB4NDQsIDB4NGIsIDB4NGIsIDB4MzcsIDB4NDEsIDB4NGQsIDB4NDEsIDB4NDUsIDB4NDAsIDB4NDEsCi0gICAgMHg0MCwgMHgzOCwgMHgzNywgMHg0MCwgMHg0MiwgMHgyYywgMHg1NywgMHg0MywgMHgyZCwgMHg0OSwgMHgzYSwgMHgzZSwKLSAgICAweDM3LCAweDJmLCAweDUyLCAweDM3LCAweDMxLCAweDQyLCAweDNiLCAweDNmLCAweDM5LCAweDM4LCAweDQ4LCAweDNjLAotICAgIDB4MzcsIDB4M2QsIDB4M2EsIDB4MzksIDB4M2EsIDB4NDUsIDB4NGIsIDB4NDksIDB4M2UsIDB4NDQsIDB4NDgsIDB4NDksCi0gICAgMHgzZCwgMHgzOSwgMHgzYywgMHg0MSwgMHg0MSwgMHgzOCwgMHg0NSwgMHgzOCwgMHgzMywgMHgzZCwgMHgzNywgMHg0NywKLSAgICAweDM0LCAweDNmLCAweDNiLCAweDNkLCAweDM5LCAweDM0LCAweDMwLCAweDM5LCAweDQ0LCAweDM2LCAweDM0LCAweDNjLAotICAgIDB4MzcsIDB4MzgsIDB4NDUsIDB4MzQsIDB4NDAsIDB4MzMsIDB4NDEsIDB4M2EsIDB4M2UsIDB4M2MsIDB4M2IsIDB4M2EsCi0gICAgMHg0MCwgMHgzZiwgMHgzYiwgMHgzZCwgMHgzYiwgMHg0NiwgMHg0MSwgMHgyYSwgMHgzYSwgMHgzYywgMHg0MiwgMHg0NiwKLSAgICAweDMzLCAweDNmLCAweDJkLCAweDNhLCAweDQ1LCAweDQ1LCAweDM4LCAweDNiLCAweDQ0LCAweDM0LCAweDM1LCAweDNmLAotICAgIDB4MzQsIDB4NDMsIDB4MzgsIDB4M2UsIDB4NDEsIDB4M2IsIDB4NDIsIDB4MzgsIDB4M2QsIDB4M2YsIDB4MzgsIDB4NDUsCi0gICAgMHgzYiwgMHgzNSwgMHgzOSwgMHgzYywgMHg0MywgMHg0MywgMHgzOCwgMHgzNCwgMHg0NCwgMHg0MywgMHgyZSwgMHgzOSwKLSAgICAweDM5LCAweDQwLCAweDM5LCAweDQxLCAweDQxLCAweDM0LCAweDNlLCAweDQ0LCAweDNkLCAweDQzLCAweDNhLCAweDNhLAotICAgIDB4M2IsIDB4M2IsIDB4MzYsIDB4NDUsIDB4M2MsIDB4NDMsIDB4M2QsIDB4NDgsIDB4MzYsIDB4MzYsIDB4MzksIDB4NTUsCi0gICAgMHgzNSwgMHg0MCwgMHgzZSwgMHg0OSwgMHg0MCwgMHgzYSwgMHgzZCwgMHgzZCwgMHgzNCwgMHg0NywgMHg0MCwgMHg0MSwKLSAgICAweDQwLCAweDQ3LCAweDM5LCAweDNlLCAweDNiLCAweDM4LCAweDNjLCAweDNhLCAweDM1LCAweDNlLCAweDQxLCAweDRhLAotICAgIDB4NGIsIDB4M2YsIDB4MzYsIDB4M2QsIDB4NDAsIDB4M2MsIDB4MzksIDB4MzIsIDB4MzMsIDB4MzYsIDB4MzAsIDB4NDIsCi0gICAgMHg0MiwgMHgzNiwgMHg1NCwgMHg0OCwgMHgyZSwgMHg0YywgMHgzNCwgMHgzYywgMHgzOSwgMHgzNiwgMHg0ZSwgMHgzNywKLSAgICAweDJmLCAweDNlLCAweDMwLCAweDNkLCAweDM2LCAweDNiLCAweDQ1LCAweDM2LCAweDM3LCAweDNlLCAweDQxLCAweDRiLAotICAgIDB4M2IsIDB4MzYsIDB4NDUsIDB4M2IsIDB4MzgsIDB4NDUsIDB4M2UsIDB4NDMsIDB4NDgsIDB4NDYsIDB4NDQsIDB4NDQsCi0gICAgMHgzZSwgMHgzYiwgMHgzNywgMHgzYiwgMHgzYSwgMHgzZiwgMHgzZCwgMHg0NCwgMHgzOSwgMHgzOCwgMHg0NSwgMHg0MywKLSAgICAweDNkLCAweDM1LCAweDM5LCAweDJjLCAweDQ0LCAweDQxLCAweDM2LCAweDQwLCAweDNkLCAweDM5LCAweDNkLCAweDJmLAotICAgIDB4M2QsIDB4MzksIDB4NDIsIDB4M2QsIDB4MzYsIDB4NDYsIDB4NDMsIDB4MmMsIDB4NDEsIDB4M2EsIDB4MzAsIDB4NDUsCi0gICAgMHgzZiwgMHg0MSwgMHgzNSwgMHgyYiwgMHgzYiwgMHgzOCwgMHgzYSwgMHg0NCwgMHgzMiwgMHgzMiwgMHgzOSwgMHgzYywKLSAgICAweDNhLCAweDNhLCAweDNjLCAweDNhLCAweDM1LCAweDQwLCAweDNiLCAweDMxLCAweDM2LCAweDMzLCAweDM1LCAweDM0LAotICAgIDB4M2MsIDB4M2IsIDB4M2QsIDB4MzYsIDB4NDgsIDB4M2IsIDB4M2YsIDB4NDIsIDB4M2UsIDB4MzMsIDB4MmYsIDB4M2EsCi0gICAgMHg0OSwgMHg0MSwgMHgzOSwgMHgzZSwgMHgzYywgMHg0NCwgMHgzYywgMHgzOSwgMHgzMywgMHgzOSwgMHgzNiwgMHgzNSwKLSAgICAweDNkLCAweDQyLCAweDM0LCAweDNlLCAweDM4LCAweDQ1LCAweDQwLCAweDQ1LCAweDNkLCAweDQ4LCAweDQyLCAweDRhLAotICAgIDB4M2YsIDB4NDUsIDB4MzgsIDB4NDIsIDB4NDQsIDB4NDAsIDB4MzQsIDB4NDksIDB4NDQsIDB4M2QsIDB4M2EsIDB4MzksCi0gICAgMHgzZSwgMHgzYSwgMHg0MiwgMHgzZSwgMHg0OCwgMHg0MiwgMHgzZSwgMHgzYSwgMHgzZiwgMHgzZiwgMHgzMiwgMHgzYiwKLSAgICAweDM4LCAweDQxLCAweDNjLCAweDM5LCAweDMzLCAweDQ1LCAweDQ0LCAweDNjLCAweDQ4LCAweDQxLCAweDQxLCAweDNkLAotICAgIDB4M2EsIDB4M2MsIDB4MzcsIDB4MzMsIDB4NDEsIDB4M2YsIDB4MzgsIDB4M2EsIDB4M2YsIDB4MzcsIDB4NTEsIDB4M2MsCi0gICAgMHgzNywgMHgzYSwgMHg0MywgMHgzNywgMHg0MCwgMHgzMSwgMHg0ZiwgMHgzNCwgMHgzYiwgMHg0NCwgMHg0NSwgMHgzOSwKLSAgICAweDQwLCAweDMzLCAweDQ5LCAweDMzLCAweDNlLCAweDM1LCAweDQ0LCAweDNkLCAweDNiLCAweDNmLCAweDQzLCAweDQxLAotICAgIDB4NDMsIDB4NDMsIDB4NDgsIDB4NDQsIDB4NDYsIDB4M2IsIDB4NDMsIDB4M2YsIDB4M2MsIDB4M2YsIDB4M2UsIDB4M2QsCi0gICAgMHgzYiwgMHg0MSwgMHgzYywgMHg0MywgMHgzMCwgMHgzNCwgMHgzOSwgMHgzMywgMHgzZiwgMHgzOCwgMHgzNiwgMHgyZSwKLSAgICAweDMzLCAweDNmLCAweDNjLCAweDQwLCAweDNkLCAweDNiLCAweDNiLCAweDMxLCAweDM2LCAweDQxLCAweDNiLCAweDM4LAotICAgIDB4NDYsIDB4MzYsIDB4MzQsIDB4MzEsIDB4NDIsIDB4NDQsIDB4MzMsIDB4MzUsIDB4M2YsIDB4MzYsIDB4M2MsIDB4MzAsCi0gICAgMHgzZiwgMHgzMSwgMHgzOSwgMHgzZSwgMHgzZiwgMHg0NywgMHgzZSwgMHgzNCwgMHgzNiwgMHgzNiwgMHgzNCwgMHgzOSwKLSAgICAweDM3LCAweDQ2LCAweDQwLCAweDMzLCAweDNiLCAweDNhLCAweDNmLCAweDQxLCAweDM3LCAweDQ0LCAweDNhLCAweDNmLAotICAgIDB4MzQsIDB4NDUsIDB4MzcsIDB4MzMsIDB4M2YsIDB4NDcsIDB4NDEsIDB4MzYsIDB4MzksIDB4M2UsIDB4NDAsIDB4MzgsCi0gICAgMHg0MSwgMHgzZCwgMHgzZCwgMHgzNiwgMHg0MCwgMHgzYSwgMHgzYiwgMHgzYiwgMHg0MSwgMHgzYiwgMHgzYSwgMHgzZiwKLSAgICAweDNmLCAweDNiLCAweDM1LCAweDQyLCAweDQ2LCAweDNhLCAweDMwLCAweDQ1LCAweDQwLCAweDM3LCAweDM5LCAweDM5LAotICAgIDB4M2QsIDB4MzgsIDB4M2YsIDB4NDUsIDB4M2YsIDB4MzEsIDB4MzIsIDB4M2IsIDB4MzUsIDB4M2UsIDB4M2IsIDB4MzgsCi0gICAgMHgzYiwgMHg0NCwgMHgzNywgMHgzOSwgMHgzNywgMHg0MiwgMHgzZiwgMHg0NCwgMHgzOCwgMHgzNiwgMHgzNywgMHg0NCwKLSAgICAweDQ1LCAweDQ2LCAweDQxLCAweDNiLCAweDQ2LCAweDQyLCAweDQzLCAweDQzLCAweDNhLCAweDRiLCAweDM3LCAweDM1LAotICAgIDB4M2IsIDB4NDAsIDB4MzIsIDB4MzgsIDB4NDEsIDB4MzgsIDB4NGYsIDB4M2UsIDB4MzYsIDB4M2YsIDB4NDcsIDB4M2IsCi0gICAgMHg0NywgMHgzYiwgMHg0YSwgMHgyZSwgMHgzZCwgMHg0NSwgMHgzYiwgMHg0NiwgMHgzZSwgMHgzOCwgMHg0MywgMHgzOCwKLSAgICAweDQxLCAweDQ4LCAweDNhLCAweDM5LCAweDQwLCAweDQ1LCAweDNiLCAweDQzLCAweDQwLCAweDNlLCAweDQzLCAweDQxLAotICAgIDB4NDEsIDB4M2UsIDB4MzksIDB4M2YsIDB4MzUsIDB4NDIsIDB4MzMsIDB4M2YsIDB4M2QsIDB4MzIsIDB4NDUsIDB4M2MsCi0gICAgMHg0MSwgMHgzMSwgMHg0NSwgMHgzOCwgMHg0MywgMHg0NSwgMHg0MSwgMHgzNSwgMHgzNSwgMHg0MCwgMHg0NCwgMHgzNiwKLSAgICAweDNhLCAweDNiLCAweDNjLCAweDJjLCAweDNlLCAweDQxLCAweDMzLCAweDNkLCAweDQ2LCAweDM0LCAweDNiLCAweDMwLAotICAgIDB4MzAsIDB4NDIsIDB4NDMsIDB4M2QsIDB4M2QsIDB4M2QsIDB4NDMsIDB4MzEsIDB4M2YsIDB4NDAsIDB4M2EsIDB4M2YsCi0gICAgMHg0OCwgMHgzZSwgMHgzYiwgMHgzOSwgMHg0NCwgMHg0MywgMHgzYiwgMHgzYSwgMHg0MiwgMHgzOCwgMHgzOCwgMHgzYiwKLSAgICAweDNmLCAweDQ0LCAweDM3LCAweDNlLCAweDQ1LCAweDQwLCAweDQxLCAweDNiLCAweDNjLCAweDNhLCAweDM4LCAweDM3LAotICAgIDB4M2IsIDB4MzMsIDB4M2YsIDB4MzUsIDB4NDMsIDB4M2QsIDB4MzMsIDB4NDEsIDB4M2IsIDB4NDYsIDB4MzksIDB4MzIsCi0gICAgMHgzOSwgMHgzZiwgMHgzYiwgMHgzOSwgMHg0NywgMHgzYywgMHgzZiwgMHgzOSwgMHgzNCwgMHgzZCwgMHgzYywgMHg0NiwKLSAgICAweDNmLCAweDNlLCAweDNlLCAweDQ0LCAweDM0LCAweDQwLCAweDNmLCAweDM5LCAweDNjLCAweDM4LCAweDM2LCAweDQ1LAotICAgIDB4NDIsIDB4NDYsIDB4M2IsIDB4NDQsIDB4M2EsIDB4M2QsIDB4M2IsIDB4NDIsIDB4M2IsIDB4M2IsIDB4M2MsIDB4NDUsCi0gICAgMHg0MiwgMHgzZCwgMHgzNiwgMHgzNywgMHgzZCwgMHg0MywgMHgzZiwgMHg0OCwgMHhhNiwgMHhmYiwgMHhmZiwgMHhmZiwKLSAgICAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLCAweGIzLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MzksIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4ZTUsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHg2OCwgMHhmYiwgMHhmZiwgMHhmZiwgMHhiYywgMHhmYywgMHhmZiwgMHhmZiwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDE0LCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweGU4LCAweDAzLCAweDAwLCAweDAwLAotICAgIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg3MCwgMHgwMiwgMHgwMCwgMHgwMCwKLSAgICAweDcwLCAweDAzLCAweDAwLCAweDAwLCAweGYwLCAweDAwLCAweDAwLCAweDAwLCAweGYwLCAweDAxLCAweDAwLCAweDAwLAotICAgIDB4ODAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NTAsIDB4MDEsIDB4MDAsIDB4MDAsCi0gICAgMHhhNCwgMHgwMiwgMHgwMCwgMHgwMCwgMHhiYSwgMHhmYywgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywKLSAgICAweDI0LCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NmMsIDB4NjEsIDB4NjIsIDB4NjUsCi0gICAgMHg2YywgMHg3MywgMHg1ZiwgMHg3MywgMHg2ZiwgMHg2NiwgMHg3NCwgMHg2ZCwgMHg2MSwgMHg3OCwgMHgwMCwgMHgwMCwKLSAgICAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4M2MsIDB4ZmQsIDB4ZmYsIDB4ZmYsIDB4MmMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4ODAsIDB4M2IsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4N2YsIDB4M2YsCi0gICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgyYSwgMHhmZCwgMHhmZiwgMHhmZiwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDFjLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MWMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHg2MSwgMHg2NCwgMHg2NCwgMHg1ZiwgMHgzMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweGE0LCAweGZkLCAweGZmLCAweGZmLAotICAgIDB4MmMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1OCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDA5LCAweDk3LCAweGY1LCAweDNmLAotICAgIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODcsIDB4MzUsIDB4YTAsIDB4NDMsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHhkNiwgMHhkNywgMHgyOCwgMHhjMywgMHg5MiwgMHhmZCwgMHhmZiwgMHhmZiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywKLSAgICAweDFjLCAweDAwLCAweDAwLCAweDAwLCAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NTIsIDB4NjUsIDB4NmMsIDB4NzUsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDE5LCAweDAwLCAweDAwLCAweDAwLCAweDE2LCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MTQsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4MmMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDUsIDB4ODAsIDB4YmYsIDB4M2YsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ODUsIDB4YzAsIDB4YmUsIDB4NDMsCi0gICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHhmZSwgMHhmZiwgMHhmZiwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDNjLCAweDAwLCAweDAwLCAweDAwLCAweDA1LCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4NDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjUsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHg3NywgMHg2NSwgMHg2OSwgMHg2NywgMHg2OCwgMHg3NCwgMHg3MywgMHg1ZiwgMHg3MSwgMHg3NSwgMHg2MSwgMHg2ZSwKLSAgICAweDc0LCAweDJmLCAweDQ2LCAweDYxLCAweDZiLCAweDY1LCAweDUxLCAweDc1LCAweDYxLCAweDZlLCAweDc0LCAweDU3LAotICAgIDB4NjksIDB4NzQsIDB4NjgsIDB4NGQsIDB4NjksIDB4NmUsIDB4NGQsIDB4NjEsIDB4NzgsIDB4NTYsIDB4NjEsIDB4NzIsCi0gICAgMHg3MywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDBhLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4YTQsIDB4ZmUsIDB4ZmYsIDB4ZmYsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweGFlLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTcsIDB4YWMsIDB4NmUsIDB4M2EsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgyMCwgMHg0ZSwgMHg5NywgMHgzZCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHhhZiwgMHgyNywgMHgyMSwgMHhiZSwKLSAgICAweDk2LCAweGZlLCAweGZmLCAweGZmLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDIwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwOSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1MiwgMHg2NSwgMHg3MywgMHg2OCwgMHg2MSwgMHg3MCwgMHg2NSwgMHg1ZiwKLSAgICAweDMxLCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MzEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MmIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgxYywgMHhmZiwgMHhmZiwgMHhmZiwgMHgyYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDE0LCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgzZiwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmZiwgMHg0MiwKLSAgICAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDBhLCAweGZmLCAweGZmLCAweGZmLAotICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsIDB4MjAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwYiwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDQzLCAweDZmLCAweDZlLCAweDc2LCAweDMyLCAweDQ0LCAweDVmLCAweDYyLCAweDY5LCAweDYxLCAweDczLCAweDAwLAotICAgIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4ZmMsIDB4ZmUsIDB4ZmYsIDB4ZmYsCi0gICAgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MTcsIDB4YWMsIDB4ZWUsIDB4MzksIDB4NWEsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsCi0gICAgMHg0OCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDU0LCAweDAwLCAweDAwLCAweDAwLCAweDMxLCAweDAwLCAweDAwLCAweDAwLCAweDc3LCAweDY1LCAweDY5LCAweDY3LAotICAgIDB4NjgsIDB4NzQsIDB4NzMsIDB4NWYsIDB4NzEsIDB4NzUsIDB4NjEsIDB4NmUsIDB4NzQsIDB4NWYsIDB4MzEsIDB4MmYsCi0gICAgMHg0NiwgMHg2MSwgMHg2YiwgMHg2NSwgMHg1MSwgMHg3NSwgMHg2MSwgMHg2ZSwgMHg3NCwgMHg1NywgMHg2OSwgMHg3NCwKLSAgICAweDY4LCAweDRkLCAweDY5LCAweDZlLCAweDRkLCAweDYxLCAweDc4LCAweDU2LCAweDYxLCAweDcyLCAweDczLCAweDJmLAotICAgIDB4NzQsIDB4NzIsIDB4NjEsIDB4NmUsIDB4NzMsIDB4NzAsIDB4NmYsIDB4NzMsIDB4NjUsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgzMCwgMHgxMSwgMHgwMCwgMHgwMCwKLSAgICAweDBjLCAweDAwLCAweDE0LCAweDAwLCAweDA0LCAweDAwLCAweDA4LCAweDAwLCAweDBjLCAweDAwLCAweDEwLCAweDAwLAotICAgIDB4MGMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgxOCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDNkLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4OWQsIDB4YWYsIDB4ZDAsIDB4M2EsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHhlNywgMHgyOSwgMHg5ZSwgMHgzZSwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg1YiwgMHg5MSwgMHhjMywgMHhiZCwKLSAgICAweDAwLCAweDAwLCAweDBlLCAweDAwLCAweDE4LCAweDAwLCAweDA4LCAweDAwLCAweDA3LCAweDAwLCAweDBjLCAweDAwLAotICAgIDB4MTAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MGUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDIsCi0gICAgMHgyMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDI4LCAweDAwLCAweDAwLCAweDAwLCAweDBiLCAweDAwLCAweDAwLCAweDAwLCAweDRkLCAweDYxLCAweDc0LCAweDRkLAotICAgIDB4NzUsIDB4NmMsIDB4NWYsIDB4NjIsIDB4NjksIDB4NjEsIDB4NzMsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwYywgMHgwMCwgMHgwYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDA0LCAweDAwLCAweDA4LCAweDAwLCAweDBjLCAweDAwLCAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHg2MiwgMHgxYiwgMHgxYywgMHgzYiwKLSAgICAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweGI0LCAweDAwLCAweDAwLCAweDAwLCAweDVjLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4YzAsIDB4ZmYsIDB4ZmYsIDB4ZmYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDksCi0gICAgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgxYywgMHgwMCwgMHgwMCwgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDI0LCAweDAwLCAweDAwLCAweDAwLCAweDA0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDUsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNiwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwNCwgMHgwMCwKLSAgICAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwLCAweDNmLCAweDE0LCAweDAwLCAweDFjLCAweDAwLAotICAgIDB4MDgsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgxOCwgMHgwMCwgMHgxNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwOCwKLSAgICAweDAxLCAweDAwLCAweDAwLCAweDAwLCAweDFjLCAweDAwLCAweDAwLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MjgsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDA3LCAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDQsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MTgsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwYywgMHgwMCwgMHgwNywgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAwLCAweDAwLCAweDE0LCAweDAwLCAweDE0LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAyLAotICAgIDB4MWMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MzAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MGMsIDB4MDAsIDB4MTAsIDB4MDAsCi0gICAgMHgwMCwgMHgwMCwgMHgwNCwgMHgwMCwgMHgwOCwgMHgwMCwgMHgwYywgMHgwMCwgMHgwYywgMHgwMCwgMHgwMCwgMHgwMCwKLSAgICAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwLCAweDA4LCAweDAwLCAweDAwLCAweDAwLAotICAgIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MjQsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MTQsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgMHgwNCwgMHgwMCwgMHgwMCwgMHgwMCwgMHhmYSwgMHhmZiwgMHhmZiwgMHhmZiwgMHgwMCwgMHgxOSwgMHgwNiwgMHgwMCwKLSAgICAweDA2LCAweDAwLCAweDA1LCAweDAwLCAweDA2LCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDA5LCAweDA2LCAweDAwLAotICAgIDB4MDgsIDB4MDAsIDB4MDcsIDB4MDAsIDB4MDYsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDR9OwotY29uc3QgaW50IGdfbW9kZWxfbGVuID0gMTk4MDA7CmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy9tb2RlbC5oIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9zaW1wbGVfZmVhdHVyZXMvbW9kZWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNlNzA1ZS4uMDAwMDAwMAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy9tb2RlbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci15b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLS8vIFRoaXMgaXMgYSBzdGFuZGFyZCBUZW5zb3JGbG93IExpdGUgRmxhdEJ1ZmZlciBtb2RlbCBmaWxlIHRoYXQgaGFzIGJlZW4KLS8vIGNvbnZlcnRlZCBpbnRvIGEgQyBkYXRhIGFycmF5LCBzbyBpdCBjYW4gYmUgZWFzaWx5IGNvbXBpbGVkIGludG8gYSBiaW5hcnkKLS8vIGZvciBkZXZpY2VzIHRoYXQgZG9uJ3QgaGF2ZSBhIGZpbGUgc3lzdGVtLiBJdCB3YXMgY3JlYXRlZCB1c2luZyB0aGUgY29tbWFuZDoKLS8vIHh4ZCAtaSBtb2RlbC50ZmxpdGUgPiBtb2RlbC5jYwotCi0jaWZuZGVmIFRFTlNPUkZMT1dfTElURV9NSUNST19FWEFNUExFU19NSUNST19TUEVFQ0hfU0lNUExFX0ZFQVRVUkVTX01PREVMX0hfCi0jZGVmaW5lIFRFTlNPUkZMT1dfTElURV9NSUNST19FWEFNUExFU19NSUNST19TUEVFQ0hfU0lNUExFX0ZFQVRVUkVTX01PREVMX0hfCi0KLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfbW9kZWxbXTsKLWV4dGVybiBjb25zdCBpbnQgZ19tb2RlbF9sZW47Ci0KLSNlbmRpZiAgLy8gVEVOU09SRkxPV19MSVRFX01JQ1JPX0VYQU1QTEVTX01JQ1JPX1NQRUVDSF9TSU1QTEVfRkVBVFVSRVNfTU9ERUxfSF8KZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL25vX3Bvd2VyX3NwZWN0cnVtX2RhdGEuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy9ub19wb3dlcl9zcGVjdHJ1bV9kYXRhLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmYwMjQyLi4wMDAwMDAwCi0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL25vX3Bvd2VyX3NwZWN0cnVtX2RhdGEuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAxOCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi1MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLXlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLVlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotLy8gU2VlIHRoZSBoZWFkZXIgZm9yIGRvY3VtZW50YXRpb24gb24gdGhlIG1lYW5pbmcgb2YgdGhpcyBkYXRhLgotCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9zaW1wbGVfZmVhdHVyZXMvbm9fcG93ZXJfc3BlY3RydW1fZGF0YS5oIgotCi1jb25zdCB1aW50OF90IGdfbm9fcG93ZXJfc3BlY3RydW1fZGF0YVtnX25vX3Bvd2VyX3NwZWN0cnVtX2RhdGFfc2l6ZV0gPSB7Ci0gICAgMjU1LCA3LCA2LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLX07CmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy9ub19wb3dlcl9zcGVjdHJ1bV9kYXRhLmggYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy9ub19wb3dlcl9zcGVjdHJ1bV9kYXRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMDM2MjMuLjAwMDAwMDAKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9zaW1wbGVfZmVhdHVyZXMvbm9fcG93ZXJfc3BlY3RydW1fZGF0YS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMTggVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci15b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLS8vIFRoaXMgZGF0YSB3YXMgZXh0cmFjdGVkIGZyb20gdGhlIGxhcmdlciBmZWF0dXJlIGRhdGEgaGVsZCBpbgotLy8gbm9fZmVhdHVyZXNfZGF0YS5jYyBhbmQgY29uc2lzdHMgb2YgdGhlIDI5dGggc3BlY3Ryb2dyYW0gc2xpY2Ugb2YgNDMgdmFsdWVzLgotLy8gVGhpcyBpcyB0aGUgZXhwZWN0ZWQgcmVzdWx0IG9mIHJ1bm5pbmcgdGhlIHNhbXBsZSBkYXRhIGluCi0vLyBub18zMG1zX3NhbXBsZV9kYXRhLmNjIHRocm91Z2ggdGhlIHByZXByb2Nlc3NpbmcgcGlwZWxpbmUuCi0KLSNpZm5kZWYgVEVOU09SRkxPV19MSVRFX01JQ1JPX0VYQU1QTEVTX01JQ1JPX1NQRUVDSF9TSU1QTEVfRkVBVFVSRVNfTk9fUE9XRVJfU1BFQ1RSVU1fREFUQV9IXwotI2RlZmluZSBURU5TT1JGTE9XX0xJVEVfTUlDUk9fRVhBTVBMRVNfTUlDUk9fU1BFRUNIX1NJTVBMRV9GRUFUVVJFU19OT19QT1dFUl9TUEVDVFJVTV9EQVRBX0hfCi0KLSNpbmNsdWRlIDxjc3RkaW50PgotCi1jb25zdGV4cHIgaW50IGdfbm9fcG93ZXJfc3BlY3RydW1fZGF0YV9zaXplID0gNDM7Ci1leHRlcm4gY29uc3QgdWludDhfdCBnX25vX3Bvd2VyX3NwZWN0cnVtX2RhdGFbXTsKLQotI2VuZGlmICAvLyBURU5TT1JGTE9XX0xJVEVfTUlDUk9fRVhBTVBMRVNfTUlDUk9fU1BFRUNIX1NJTVBMRV9GRUFUVVJFU19OT19QT1dFUl9TUEVDVFJVTV9EQVRBX0hfCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy9ub19zaW1wbGVfZmVhdHVyZXNfZGF0YS5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL25vX3NpbXBsZV9mZWF0dXJlc19kYXRhLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDdhZTYyLi4wMDAwMDAwCi0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL25vX3NpbXBsZV9mZWF0dXJlc19kYXRhLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDE4IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoteW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9zaW1wbGVfZmVhdHVyZXMvbm9fc2ltcGxlX2ZlYXR1cmVzX2RhdGEuaCIKLQotLyogRmlsZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkKLSAqIHRlbnNvcmZsb3cvZXhhbXBsZXMvc3BlZWNoX2NvbW1hbmRzL3dhdl90b19mZWF0dXJlcy5weSBcCi0gKiAtLXNhbXBsZV9yYXRlPTE2MDAwIFwKLSAqIC0tY2xpcF9kdXJhdGlvbl9tcz0xMDAwIFwKLSAqIC0td2luZG93X3NpemVfbXM9MzAgXAotICogLS13aW5kb3dfc3RyaWRlX21zPTIwIFwKLSAqIC0tZmVhdHVyZV9iaW5fY291bnQ9NDAgXAotICogLS1xdWFudGl6ZT0xIFwKLSAqIC0tcHJlcHJvY2Vzcz0iYXZlcmFnZSIgXAotICogLS1pbnB1dF93YXY9InNwZWVjaF9jb21tYW5kc190ZXN0X3NldF92MC4wMi9uby9mOTY0M2Q0Ml9ub2hhc2hfNC53YXYiIFwKLSAqIC0tb3V0cHV0X2NfZmlsZT0ibm9fc2ltcGxlX2ZlYXR1cmVzX2RhdGEuY2MiIFwKLSAqLwotCi1jb25zdCBpbnQgZ19ub19zaW1wbGVfZjk2NDNkNDJfbm9oYXNoXzRfd2lkdGggPSA0MzsKLWNvbnN0IGludCBnX25vX3NpbXBsZV9mOTY0M2Q0Ml9ub2hhc2hfNF9oZWlnaHQgPSA0OTsKLWNvbnN0IHVuc2lnbmVkIGNoYXIgZ19ub19zaW1wbGVfZjk2NDNkNDJfbm9oYXNoXzRfZGF0YVtdID0gewotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICA1LAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICA2NywgMiwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAxMzksIDIsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMTk1LCAyLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMjMwLCAyLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMjU1LCA3LAotICAgIDYsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMjU1LCA3LCAgMTYsIDEsICAgMSwgICAwLCAgMiwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMjU1LCA3LCAgIDIyLCAwLCAgMSwgICAwLAotICAgIDEsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDIzOCwgNSwgICAyMCwgMywgNCwgICAxLCAgMSwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDE0NCwgNCwgICAxOSwgMywgNSwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICA0MiwgNiwgICAzLAotICAgIDEsIDMsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMywgMSwgICA1LCAgMCwgIDEsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgNSwgMSwgICAzLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDEsIDAsICAgMSwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLAotICAgIDAsCi19OwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9zaW1wbGVfZmVhdHVyZXMvbm9fc2ltcGxlX2ZlYXR1cmVzX2RhdGEuaCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL25vX3NpbXBsZV9mZWF0dXJlc19kYXRhLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNDYxMzQuLjAwMDAwMDAKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9zaW1wbGVfZmVhdHVyZXMvbm9fc2ltcGxlX2ZlYXR1cmVzX2RhdGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDE4IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoteW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0jaWZuZGVmIFRFTlNPUkZMT1dfTElURV9NSUNST19FWEFNUExFU19NSUNST19TUEVFQ0hfU0lNUExFX0ZFQVRVUkVTX05PX1NJTVBMRV9GRUFUVVJFU19EQVRBX0hfCi0jZGVmaW5lIFRFTlNPUkZMT1dfTElURV9NSUNST19FWEFNUExFU19NSUNST19TUEVFQ0hfU0lNUExFX0ZFQVRVUkVTX05PX1NJTVBMRV9GRUFUVVJFU19EQVRBX0hfCi0KLWV4dGVybiBjb25zdCBpbnQgZ19ub19zaW1wbGVfZjk2NDNkNDJfbm9oYXNoXzRfd2lkdGg7Ci1leHRlcm4gY29uc3QgaW50IGdfbm9fc2ltcGxlX2Y5NjQzZDQyX25vaGFzaF80X2hlaWdodDsKLWV4dGVybiBjb25zdCB1bnNpZ25lZCBjaGFyIGdfbm9fc2ltcGxlX2Y5NjQzZDQyX25vaGFzaF80X2RhdGFbXTsKLQotI2VuZGlmICAvLyBURU5TT1JGTE9XX0xJVEVfTUlDUk9fRVhBTVBMRVNfTUlDUk9fU1BFRUNIX1NJTVBMRV9GRUFUVVJFU19OT19TSU1QTEVfRkVBVFVSRVNfREFUQV9IXwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9zaW1wbGVfZmVhdHVyZXMvc2ltcGxlX2ZlYXR1cmVzX2dlbmVyYXRvci5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL3NpbXBsZV9mZWF0dXJlc19nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3MzM5MTIuLjAwMDAwMDAKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9zaW1wbGVfZmVhdHVyZXMvc2ltcGxlX2ZlYXR1cmVzX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAxOCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi1MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLXlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLVlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotLy8gUmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBwcmVwcm9jZXNzaW5nIHBpcGVsaW5lLCB3aXRoIHRoZSBzYW1lCi0vLyByZXN1bHRzIGFzIHRoZSBhdWRpbyB0dXRvcmlhbCBhdAotLy8gaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvdHV0b3JpYWxzL3NlcXVlbmNlcy9hdWRpb19yZWNvZ25pdGlvbgotLy8gVGhpcyBtb2R1bGUgdGFrZXMgMzBtcyBvZiBQQ00tZW5jb2RlZCBzaWduZWQgMTYtYml0IGF1ZGlvIHNhbXBsZXMgKGF0IDE2S0h6LAotLy8gc28gNDgwIHZhbHVlcyksIGFuZCBleHRyYWN0cyBhIHBvd2VyIHNwZWN0cnVtIG9mIGZyZXF1ZW5jaWVzLiBUaGVyZSBhcmUgNDMKLS8vIGZyZXF1ZW5jeSBiYW5kcyBpbiB0aGUgcmVzdWx0LCBkZXJpdmVkIGZyb20gdGhlIG9yaWdpbmFsIDI1NiBvdXRwdXQgZnJvbSB0aGUKLS8vIGRpc2NyZXRlIEZvdXJpZXIgdHJhbnNmb3JtLCBhbmQgYXZlcmFnZWQgdG9nZXRoZXIgaW4gZ3JvdXBzIG9mIDYuCi0vLyBJdCdzIGV4cGVjdGVkIHRoYXQgbW9zdCBwbGF0Zm9ybXMgd2lsbCBoYXZlIG9wdGltaXplZCB2ZXJzaW9ucyBvZiB0aGUKLS8vIGZ1bmN0aW9ucyB1c2VkIGhlcmUsIGZvciBleGFtcGxlIHJlcGxhY2luZyB0aGUgREZUIHdpdGggYW4gRkZULCBzbyB0aGlzCi0vLyB2ZXJzaW9uIHNob3VsZG4ndCBiZSB1c2VkIHdoZXJlIHBlcmZvcm1hbmNlIGlzIGNyaXRpY2FsLgotCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9zaW1wbGVfZmVhdHVyZXMvc2ltcGxlX2ZlYXR1cmVzX2dlbmVyYXRvci5oIgotCi0jaW5jbHVkZSA8Y21hdGg+Ci0KLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy9zaW1wbGVfbW9kZWxfc2V0dGluZ3MuaCIKLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fbG9nLmgiCi0KLW5hbWVzcGFjZSB7Ci0KLS8vIE5lZWRlZCBiZWNhdXNlIHNvbWUgcGxhdGZvcm1zIGRvbid0IGhhdmUgTV9QSSBkZWZpbmVkLgotY29uc3RleHByIGZsb2F0IGtQaSA9IDMuMTQxNTkyNjUzNTg5NzkzMjM4NDZmOwotCi0vLyBQZXJmb3JtcyBhIGRpc2NyZXRlIEZvdXJpZXIgdHJhbnNmb3JtIG9uIHRoZSByZWFsIGlucHV0cy4gVGhpcyBjb3JyZXNwb25kcyB0bwotLy8gcmRmdCgpIGluIHRoZSBGRlQgcGFja2FnZSBhdCBodHRwOi8vd3d3Lmt1cmltcy5reW90by11LmFjLmpwL35vb3VyYS9mZnQuaHRtbCwKLS8vIGFuZCB0byBraXNzX2ZmdHIoKSBpbiBLSVNTRkZUIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9tYm9yZ2VyZGluZy9raXNzZmZ0LgotLy8gSXQgdGFrZXMgaW4gYW4gYXJyYXkgb2YgZmxvYXQgcmVhbCB2YWx1ZXMsIGFuZCByZXR1cm5zIGEgcmVzdWx0IG9mIHRoZSBzYW1lCi0vLyBsZW5ndGggd2l0aCBmbG9hdCByZWFsIGFuZCBpbWFnaW5hcnkgY29tcG9uZW50cyBpbnRlcmxlYXZlZCwgc28KLS8vIGZvdXJpZXJfb3V0cHV0WzBdIGlzIHRoZSBmaXJzdCByZWFsIHZhbHVlLCBmb3VyaWVyX291dHB1dFsxXSBpcyB0aGUgZmlyc3QKLS8vIGltYWdpbmFyeSwgZm91cmllcl9vdXRwdXRbMl0gaXMgdGhlIHNlY29uZCByZWFsLCBhbmQgc28gb24uCi0vLyBUaGUgY2FsbGluZyBmdW5jdGlvbiBzaG91bGQgZW5zdXJlIHRoYXQgdGhlIGFycmF5IHBhc3NlZCBpbiBhcyBmb3VyaWVyX291dHB1dAotLy8gaXMgYXQgbGVhc3QgdGltZV9zZXJpZXNfc2l6ZSBpbiBsZW5ndGguIE1vc3Qgb3B0aW1pemVkIEZGVCBpbXBsZW1lbnRhdGlvbnMKLS8vIHJlcXVpcmUgdGhlIGxlbmd0aCB0byBiZSBhIHBvd2VyIG9mIHR3byBhcyB3ZWxsLCBidXQgdGhpcyB2ZXJzaW9uIGRvZXNuJ3QKLS8vIGVuZm9yY2UgdGhhdC4KLXZvaWQgQ2FsY3VsYXRlRGlzY3JldGVGb3VyaWVyVHJhbnNmb3JtKGZsb2F0KiB0aW1lX3NlcmllcywgaW50IHRpbWVfc2VyaWVzX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZm91cmllcl9vdXRwdXQpIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aW1lX3Nlcmllc19zaXplIC8gMjsgKytpKSB7Ci0gICAgZmxvYXQgcmVhbCA9IDA7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCB0aW1lX3Nlcmllc19zaXplOyArK2opIHsKLSAgICAgIHJlYWwgKz0gdGltZV9zZXJpZXNbal0gKiBzdGQ6OmNvcyhqICogaSAqIGtQaSAqIDIgLyB0aW1lX3Nlcmllc19zaXplKTsKLSAgICB9Ci0gICAgZmxvYXQgaW1hZ2luYXJ5ID0gMDsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IHRpbWVfc2VyaWVzX3NpemU7ICsraikgewotICAgICAgaW1hZ2luYXJ5IC09Ci0gICAgICAgICAgdGltZV9zZXJpZXNbal0gKiBzdGQ6OnNpbihqICogaSAqIGtQaSAqIDIgLyB0aW1lX3Nlcmllc19zaXplKTsKLSAgICB9Ci0gICAgZm91cmllcl9vdXRwdXRbKGkgKiAyKSArIDBdID0gcmVhbDsKLSAgICBmb3VyaWVyX291dHB1dFsoaSAqIDIpICsgMV0gPSBpbWFnaW5hcnk7Ci0gIH0KLX0KLQotLy8gUHJvZHVjZXMgYSBzaW1wbGUgc2luZSBjdXJ2ZSB0aGF0IGlzIHVzZWQgdG8gZW5zdXJlIGZyZXF1ZW5jaWVzIGF0IHRoZSBjZW50ZXIKLS8vIG9mIHRoZSBjdXJyZW50IHNhbXBsZSB3aW5kb3cgYXJlIHdlaWdodGVkIG1vcmUgaGVhdmlseSB0aGFuIHRob3NlIGF0IHRoZSBlbmQuCi12b2lkIENhbGN1bGF0ZVBlcmlvZGljSGFubihpbnQgd2luZG93X2xlbmd0aCwgZmxvYXQqIHdpbmRvd19mdW5jdGlvbikgewotICBmb3IgKGludCBpID0gMDsgaSA8IHdpbmRvd19sZW5ndGg7ICsraSkgewotICAgIHdpbmRvd19mdW5jdGlvbltpXSA9IDAuNWYgLSAwLjVmICogc3RkOjpjb3MoKDIgKiBrUGkgKiBpKSAvIHdpbmRvd19sZW5ndGgpOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1UZkxpdGVTdGF0dXMgR2VuZXJhdGVTaW1wbGVGZWF0dXJlcyhjb25zdCBpbnQxNl90KiBpbnB1dCwgaW50IGlucHV0X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0cHV0X3NpemUsIHVpbnQ4X3QqIG91dHB1dCkgewotICAvLyBFbnN1cmUgb3VyIGlucHV0IGFuZCBvdXRwdXQgZGF0YSBhcnJheXMgYXJlIHZhbGlkLgotICBpZiAoaW5wdXRfc2l6ZSA+IGtNYXhBdWRpb1NhbXBsZVNpemUpIHsKLSAgICBNaWNyb1ByaW50ZigiSW5wdXQgc2l6ZSAlZCBsYXJnZXIgdGhhbiAlZCIsIGlucHV0X3NpemUsCi0gICAgICAgICAgICAgICAga01heEF1ZGlvU2FtcGxlU2l6ZSk7Ci0gICAgcmV0dXJuIGtUZkxpdGVFcnJvcjsKLSAgfQotICBpZiAob3V0cHV0X3NpemUgIT0ga0ZlYXR1cmVTbGljZVNpemUpIHsKLSAgICBNaWNyb1ByaW50ZigiUmVxdWVzdGVkIG91dHB1dCBzaXplICVkIGRvZXNuJ3QgbWF0Y2ggJWQiLCBvdXRwdXRfc2l6ZSwKLSAgICAgICAgICAgICAgICBrRmVhdHVyZVNsaWNlU2l6ZSk7Ci0gICAgcmV0dXJuIGtUZkxpdGVFcnJvcjsKLSAgfQotCi0gIC8vIFByZS1jYWxjdWxhdGUgdGhlIHdpbmRvdyBmdW5jdGlvbiB3ZSdsbCBiZSBhcHBseWluZyB0byB0aGUgaW5wdXQgZGF0YS4KLSAgLy8gSW4gYSByZWFsIGFwcGxpY2F0aW9uLCB3ZSdkIGNhbGN1bGF0ZSB0aGlzIHRhYmxlIG9uY2UgaW4gYW4gaW5pdGlhbGl6YXRpb24KLSAgLy8gZnVuY3Rpb24gYW5kIHN0b3JlIGl0IGZvciByZXBlYXRlZCByZXVzZS4KLSAgZmxvYXQgd2luZG93X2Z1bmN0aW9uW2tNYXhBdWRpb1NhbXBsZVNpemVdOwotICBDYWxjdWxhdGVQZXJpb2RpY0hhbm4oaW5wdXRfc2l6ZSwgd2luZG93X2Z1bmN0aW9uKTsKLQotICAvLyBBcHBseSB0aGUgd2luZG93IGZ1bmN0aW9uIHRvIG91ciB0aW1lIHNlcmllcyBpbnB1dCwgYW5kIHBhZCBpdCB3aXRoIHplcm9lcwotICAvLyB0byB0aGUgbmV4dCBwb3dlciBvZiB0d28uCi0gIGZsb2F0IGZsb2F0X2lucHV0W2tNYXhBdWRpb1NhbXBsZVNpemVdOwotICBmb3IgKGludCBpID0gMDsgaSA8IGtNYXhBdWRpb1NhbXBsZVNpemU7ICsraSkgewotICAgIGlmIChpIDwgaW5wdXRfc2l6ZSkgewotICAgICAgZmxvYXRfaW5wdXRbaV0gPQotICAgICAgICAgIChpbnB1dFtpXSAqIHdpbmRvd19mdW5jdGlvbltpXSkgLyBzdGF0aWNfY2FzdDxmbG9hdD4oMSA8PCAxNSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZsb2F0X2lucHV0W2ldID0gMC4wZjsKLSAgICB9Ci0gIH0KLQotICAvLyBQdWxsIHRoZSBmcmVxdWVuY3kgZGF0YSBmcm9tIHRoZSB0aW1lIHNlcmllcyBzYW1wbGUuCi0gIGZsb2F0IGZvdXJpZXJfdmFsdWVzW2tNYXhBdWRpb1NhbXBsZVNpemVdOwotICBDYWxjdWxhdGVEaXNjcmV0ZUZvdXJpZXJUcmFuc2Zvcm0oZmxvYXRfaW5wdXQsIGtNYXhBdWRpb1NhbXBsZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VyaWVyX3ZhbHVlcyk7Ci0KLSAgLy8gV2UgaGF2ZSB0aGUgY29tcGxleCBudW1iZXJzIGdpdmluZyB1cyBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIGZyZXF1ZW5jeQotICAvLyBiYW5kLCBidXQgYWxsIHdlIHdhbnQgdG8ga25vdyBpcyBob3cgc3Ryb25nIGVhY2ggZnJlcXVlbmN5IGlzLCBzbyBjYWxjdWxhdGUKLSAgLy8gdGhlIHNxdWFyZWQgbWFnbml0dWRlIGJ5IGFkZGluZyB0b2dldGhlciB0aGUgc3F1YXJlcyBvZiBlYWNoIGNvbXBvbmVudC4KLSAgZmxvYXQgcG93ZXJfc3BlY3RydW1ba01heEF1ZGlvU2FtcGxlU2l6ZSAvIDJdOwotICBmb3IgKGludCBpID0gMDsgaSA8IChrTWF4QXVkaW9TYW1wbGVTaXplIC8gMik7ICsraSkgewotICAgIGNvbnN0IGZsb2F0IHJlYWwgPSBmb3VyaWVyX3ZhbHVlc1soaSAqIDIpICsgMF07Ci0gICAgY29uc3QgZmxvYXQgaW1hZ2luYXJ5ID0gZm91cmllcl92YWx1ZXNbKGkgKiAyKSArIDFdOwotICAgIHBvd2VyX3NwZWN0cnVtW2ldID0gKHJlYWwgKiByZWFsKSArIChpbWFnaW5hcnkgKiBpbWFnaW5hcnkpOwotICB9Ci0KLSAgLy8gRmluYWxseSwgcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgYnkgYXZlcmFnaW5nIHRvZ2V0aGVyIHNpeCBhZGphY2VudAotICAvLyBmcmVxdWVuY2llcyBpbnRvIGVhY2ggc2xvdCwgcHJvZHVjaW5nIGFuIGFycmF5IG9mIDQzIHZhbHVlcy4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrRmVhdHVyZVNsaWNlU2l6ZTsgKytpKSB7Ci0gICAgZmxvYXQgdG90YWwgPSAwLjBmOwotICAgIGZvciAoaW50IGogPSAwOyBqIDwga0F2ZXJhZ2VXaW5kb3dTaXplOyArK2opIHsKLSAgICAgIGNvbnN0IGludCBpbmRleCA9IChpICoga0F2ZXJhZ2VXaW5kb3dTaXplKSArIGo7Ci0gICAgICBpZiAoaW5kZXggPCAoa01heEF1ZGlvU2FtcGxlU2l6ZSAvIDIpKSB7Ci0gICAgICAgIHRvdGFsICs9IHBvd2VyX3NwZWN0cnVtW2luZGV4XTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY29uc3QgZmxvYXQgYXZlcmFnZSA9IHRvdGFsIC8ga0F2ZXJhZ2VXaW5kb3dTaXplOwotICAgIC8vIFF1YW50aXplIHRoZSByZXN1bHQgaW50byBlaWdodCBiaXRzLCBlZmZlY3RpdmVseSBtdWx0aXBseWluZyBieSB0d28uCi0gICAgLy8gVGhlIDEyNy41IGNvbnN0YW50IGhlcmUgaGFzIHRvIG1hdGNoIHRoZSBmZWF0dXJlc19tYXggdmFsdWUgZGVmaW5lZCBpbgotICAgIC8vIHRlbnNvcmZsb3cvZXhhbXBsZXMvc3BlZWNoX2NvbW1hbmRzL2lucHV0X2RhdGEucHksIGFuZCB0aGlzIGFsc28gYXNzdW1lcwotICAgIC8vIHRoYXQgZmVhdHVyZXNfbWluIGlzIHplcm8uIElmIGl0IHdhc24ndCwgd2UnZCBoYXZlIHRvIHN1YnRyYWN0IGl0IGZpcnN0LgotICAgIGludCBxdWFudGl6ZWRfYXZlcmFnZSA9IHJvdW5kZihhdmVyYWdlICogKDI1NS4wZiAvIDEyNy41ZikpOwotICAgIGlmIChxdWFudGl6ZWRfYXZlcmFnZSA8IDApIHsKLSAgICAgIHF1YW50aXplZF9hdmVyYWdlID0gMDsKLSAgICB9Ci0gICAgaWYgKHF1YW50aXplZF9hdmVyYWdlID4gMjU1KSB7Ci0gICAgICBxdWFudGl6ZWRfYXZlcmFnZSA9IDI1NTsKLSAgICB9Ci0gICAgb3V0cHV0W2ldID0gcXVhbnRpemVkX2F2ZXJhZ2U7Ci0gIH0KLSAgcmV0dXJuIGtUZkxpdGVPazsKLX0KZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL3NpbXBsZV9mZWF0dXJlc19nZW5lcmF0b3IuaCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL3NpbXBsZV9mZWF0dXJlc19nZW5lcmF0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JlY2NlYS4uMDAwMDAwMAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy9zaW1wbGVfZmVhdHVyZXNfZ2VuZXJhdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAxOCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi1MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLXlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLVlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotI2lmbmRlZiBURU5TT1JGTE9XX0xJVEVfTUlDUk9fRVhBTVBMRVNfTUlDUk9fU1BFRUNIX1NJTVBMRV9GRUFUVVJFU19TSU1QTEVfRkVBVFVSRVNfR0VORVJBVE9SX0hfCi0jZGVmaW5lIFRFTlNPUkZMT1dfTElURV9NSUNST19FWEFNUExFU19NSUNST19TUEVFQ0hfU0lNUExFX0ZFQVRVUkVTX1NJTVBMRV9GRUFUVVJFU19HRU5FUkFUT1JfSF8KLQotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9jL2NvbW1vbi5oIgotCi0vLyBDb252ZXJ0cyBhdWRpbyBzYW1wbGUgZGF0YSBpbnRvIGEgbW9yZSBjb21wYWN0IGZvcm0gdGhhdCdzIGFwcHJvcHJpYXRlIGZvcgotLy8gZmVlZGluZyBpbnRvIGEgbmV1cmFsIG5ldHdvcmsuIFRoZXJlIGFyZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb25zIHRoYXQgdXNlCi0vLyBib3RoIGZsb2F0aW5nIHBvaW50IGFuZCBmaXhlZCBwb2ludCBhdmFpbGFibGUsIGJ1dCBiZWNhdXNlIHRoZSBjYWxjdWxhdGlvbnMKLS8vIGludm9sdmVkIGNhbiBiZSB0aW1lLWNvbnN1bWluZywgaXQncyByZWNvbW1lbmRlZCB0aGF0IHlvdSB1c2Ugb3Igd3JpdGUKLS8vIHNwZWNpYWxpemVkIHZlcnNpb25zIGZvciB5b3VyIHBsYXRmb3JtLgotVGZMaXRlU3RhdHVzIEdlbmVyYXRlU2ltcGxlRmVhdHVyZXMoY29uc3QgaW50MTZfdCogaW5wdXQsIGludCBpbnB1dF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dHB1dF9zaXplLCB1aW50OF90KiBvdXRwdXQpOwotCi0jZW5kaWYgIC8vIFRFTlNPUkZMT1dfTElURV9NSUNST19FWEFNUExFU19NSUNST19TUEVFQ0hfU0lNUExFX0ZFQVRVUkVTX1NJTVBMRV9GRUFUVVJFU19HRU5FUkFUT1JfSF8KZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL3NpbXBsZV9mZWF0dXJlc19nZW5lcmF0b3JfdGVzdC5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL3NpbXBsZV9mZWF0dXJlc19nZW5lcmF0b3JfdGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNiYWJkMS4uMDAwMDAwMAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy9zaW1wbGVfZmVhdHVyZXNfZ2VuZXJhdG9yX3Rlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAxOCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi1MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLXlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLVlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL3NpbXBsZV9mZWF0dXJlc19nZW5lcmF0b3IuaCIKLQotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9jL2NvbW1vbi5oIgotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL25vX3Bvd2VyX3NwZWN0cnVtX2RhdGEuaCIKLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy95ZXNfcG93ZXJfc3BlY3RydW1fZGF0YS5oIgotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvdGVzdGRhdGEvbm9fMzBtc19hdWRpb19kYXRhLmgiCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC90ZXN0ZGF0YS95ZXNfMzBtc19hdWRpb19kYXRhLmgiCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2xvZy5oIgotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0aW5nL21pY3JvX3Rlc3QuaCIKLQotVEZfTElURV9NSUNST19URVNUU19CRUdJTgotCi1URl9MSVRFX01JQ1JPX1RFU1QoVGVzdFNpbXBsZUZlYXR1cmVzR2VuZXJhdG9yKSB7Ci0gIHVpbnQ4X3QgeWVzX2NhbGN1bGF0ZWRfZGF0YVtnX3llc19wb3dlcl9zcGVjdHJ1bV9kYXRhX3NpemVdOwotICBUZkxpdGVTdGF0dXMgeWVzX3N0YXR1cyA9IEdlbmVyYXRlU2ltcGxlRmVhdHVyZXMoCi0gICAgICBnX3llc18zMG1zX2F1ZGlvX2RhdGEsIGdfeWVzXzMwbXNfYXVkaW9fZGF0YV9zaXplLAotICAgICAgZ195ZXNfcG93ZXJfc3BlY3RydW1fZGF0YV9zaXplLCB5ZXNfY2FsY3VsYXRlZF9kYXRhKTsKLSAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoa1RmTGl0ZU9rLCB5ZXNfc3RhdHVzKTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IGdfeWVzX3Bvd2VyX3NwZWN0cnVtX2RhdGFfc2l6ZTsgKytpKSB7Ci0gICAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoZ195ZXNfcG93ZXJfc3BlY3RydW1fZGF0YVtpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXNfY2FsY3VsYXRlZF9kYXRhW2ldKTsKLSAgICBpZiAoZ195ZXNfcG93ZXJfc3BlY3RydW1fZGF0YVtpXSAhPSB5ZXNfY2FsY3VsYXRlZF9kYXRhW2ldKSB7Ci0gICAgICBNaWNyb1ByaW50ZigiRXhwZWN0ZWQgdmFsdWUgJWQgYnV0IGZvdW5kICVkIiwKLSAgICAgICAgICAgICAgICAgIGdfeWVzX3Bvd2VyX3NwZWN0cnVtX2RhdGFbaV0sIHllc19jYWxjdWxhdGVkX2RhdGFbaV0pOwotICAgIH0KLSAgfQotCi0gIHVpbnQ4X3Qgbm9fY2FsY3VsYXRlZF9kYXRhW2dfeWVzX3Bvd2VyX3NwZWN0cnVtX2RhdGFfc2l6ZV07Ci0gIFRmTGl0ZVN0YXR1cyBub19zdGF0dXMgPQotICAgICAgR2VuZXJhdGVTaW1wbGVGZWF0dXJlcyhnX25vXzMwbXNfYXVkaW9fZGF0YSwgZ19ub18zMG1zX2F1ZGlvX2RhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ19ub19wb3dlcl9zcGVjdHJ1bV9kYXRhX3NpemUsIG5vX2NhbGN1bGF0ZWRfZGF0YSk7Ci0gIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKGtUZkxpdGVPaywgbm9fc3RhdHVzKTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IGdfbm9fcG93ZXJfc3BlY3RydW1fZGF0YV9zaXplOyArK2kpIHsKLSAgICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUShnX25vX3Bvd2VyX3NwZWN0cnVtX2RhdGFbaV0sIG5vX2NhbGN1bGF0ZWRfZGF0YVtpXSk7Ci0gICAgaWYgKGdfbm9fcG93ZXJfc3BlY3RydW1fZGF0YVtpXSAhPSBub19jYWxjdWxhdGVkX2RhdGFbaV0pIHsKLSAgICAgIE1pY3JvUHJpbnRmKCJFeHBlY3RlZCB2YWx1ZSAlZCBidXQgZm91bmQgJWQiLCBnX25vX3Bvd2VyX3NwZWN0cnVtX2RhdGFbaV0sCi0gICAgICAgICAgICAgICAgICBub19jYWxjdWxhdGVkX2RhdGFbaV0pOwotICAgIH0KLSAgfQotfQotCi1URl9MSVRFX01JQ1JPX1RFU1RTX0VORApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9zaW1wbGVfZmVhdHVyZXMvc2ltcGxlX21vZGVsX3NldHRpbmdzLmggYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy9zaW1wbGVfbW9kZWxfc2V0dGluZ3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQxMjljOC4uMDAwMDAwMAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy9zaW1wbGVfbW9kZWxfc2V0dGluZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDE4IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoteW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0jaWZuZGVmIFRFTlNPUkZMT1dfTElURV9NSUNST19FWEFNUExFU19NSUNST19TUEVFQ0hfU0lNUExFX0ZFQVRVUkVTX1NJTVBMRV9NT0RFTF9TRVRUSU5HU19IXwotI2RlZmluZSBURU5TT1JGTE9XX0xJVEVfTUlDUk9fRVhBTVBMRVNfTUlDUk9fU1BFRUNIX1NJTVBMRV9GRUFUVVJFU19TSU1QTEVfTU9ERUxfU0VUVElOR1NfSF8KLQotLy8gS2VlcGluZyB0aGVzZSBhcyBjb25zdGFudCBleHByZXNzaW9ucyBhbGxvdyB1cyB0byBhbGxvY2F0ZSBmaXhlZC1zaXplZCBhcnJheXMKLS8vIG9uIHRoZSBzdGFjayBmb3Igb3VyIHdvcmtpbmcgbWVtb3J5LgotCi0vLyBUaGUgc2l6ZSBvZiB0aGUgaW5wdXQgdGltZSBzZXJpZXMgZGF0YSB3ZSBwYXNzIHRvIHRoZSBGRlQgdG8gcHJvZHVjZSB0aGUKLS8vIGZyZXF1ZW5jeSBpbmZvcm1hdGlvbi4gVGhpcyBoYXMgdG8gYmUgYSBwb3dlciBvZiB0d28sIGFuZCBzaW5jZSB3ZSdyZSBkZWFsaW5nCi0vLyB3aXRoIDMwbXMgb2YgMTZLSHogaW5wdXRzLCB3aGljaCBtZWFucyA0ODAgc2FtcGxlcywgdGhpcyBpcyB0aGUgbmV4dCB2YWx1ZS4KLWNvbnN0ZXhwciBpbnQga01heEF1ZGlvU2FtcGxlU2l6ZSA9IDUxMjsKLWNvbnN0ZXhwciBpbnQga0F1ZGlvU2FtcGxlRnJlcXVlbmN5ID0gMTYwMDA7Ci0KLS8vIEFsbCBvZiB0aGVzZSB2YWx1ZXMgYXJlIGRlcml2ZWQgZnJvbSB0aGUgdmFsdWVzIHVzZWQgZHVyaW5nIG1vZGVsIHRyYWluaW5nLAotLy8gaWYgeW91IGNoYW5nZSB5b3VyIG1vZGVsIHlvdSdsbCBuZWVkIHRvIHVwZGF0ZSB0aGVzZSBjb25zdGFudHMuCi1jb25zdGV4cHIgaW50IGtBdmVyYWdlV2luZG93U2l6ZSA9IDY7Ci1jb25zdGV4cHIgaW50IGtGZWF0dXJlU2xpY2VTaXplID0KLSAgICAoKGtNYXhBdWRpb1NhbXBsZVNpemUgLyAyKSArIChrQXZlcmFnZVdpbmRvd1NpemUgLSAxKSkgLyBrQXZlcmFnZVdpbmRvd1NpemU7Ci1jb25zdGV4cHIgaW50IGtGZWF0dXJlU2xpY2VDb3VudCA9IDQ5OwotY29uc3RleHByIGludCBrRmVhdHVyZUVsZW1lbnRDb3VudCA9IChrRmVhdHVyZVNsaWNlU2l6ZSAqIGtGZWF0dXJlU2xpY2VDb3VudCk7Ci1jb25zdGV4cHIgaW50IGtGZWF0dXJlU2xpY2VTdHJpZGVNcyA9IDIwOwotY29uc3RleHByIGludCBrRmVhdHVyZVNsaWNlRHVyYXRpb25NcyA9IDMwOwotCi1jb25zdGV4cHIgaW50IGtDYXRlZ29yeUNvdW50ID0gNDsKLWNvbnN0ZXhwciBpbnQga1NpbGVuY2VJbmRleCA9IDA7Ci1jb25zdGV4cHIgaW50IGtVbmtub3duSW5kZXggPSAxOwotZXh0ZXJuIGNvbnN0IGNoYXIqIGtDYXRlZ29yeUxhYmVsc1trQ2F0ZWdvcnlDb3VudF07Ci0KLSNlbmRpZiAgLy8gVEVOU09SRkxPV19MSVRFX01JQ1JPX0VYQU1QTEVTX01JQ1JPX1NQRUVDSF9TSU1QTEVfRkVBVFVSRVNfU0lNUExFX01PREVMX1NFVFRJTkdTX0hfCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy95ZXNfcG93ZXJfc3BlY3RydW1fZGF0YS5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL3llc19wb3dlcl9zcGVjdHJ1bV9kYXRhLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmE3YzlhLi4wMDAwMDAwCi0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL3llc19wb3dlcl9zcGVjdHJ1bV9kYXRhLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMTggVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci15b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLS8vIFNlZSB0aGUgaGVhZGVyIGZvciBkb2N1bWVudGF0aW9uIG9uIHRoZSBtZWFuaW5nIG9mIHRoaXMgZGF0YS4KLQotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL3llc19wb3dlcl9zcGVjdHJ1bV9kYXRhLmgiCi0KLWNvbnN0IHVpbnQ4X3QgZ195ZXNfcG93ZXJfc3BlY3RydW1fZGF0YVtnX3llc19wb3dlcl9zcGVjdHJ1bV9kYXRhX3NpemVdID0gewotICAgIDgsIDg5LCA4LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCA0LCAxMywgMSwgNiwgMjMsIDIwLCA2LCA0LCAwLCAwLCAwLAotICAgIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgIDAsICAwLCAwLCAwLCAwLAotfTsKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL3llc19wb3dlcl9zcGVjdHJ1bV9kYXRhLmggYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy95ZXNfcG93ZXJfc3BlY3RydW1fZGF0YS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjY0ZTYyLi4wMDAwMDAwCi0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL3llc19wb3dlcl9zcGVjdHJ1bV9kYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAxOCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi1MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLXlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLVlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotLy8gVGhpcyBkYXRhIHdhcyBleHRyYWN0ZWQgZnJvbSB0aGUgbGFyZ2VyIGZlYXR1cmUgZGF0YSBoZWxkIGluCi0vLyBub19mZWF0dXJlc19kYXRhLmNjIGFuZCBjb25zaXN0cyBvZiB0aGUgMjZ0aCBzcGVjdHJvZ3JhbSBzbGljZSBvZiA0MyB2YWx1ZXMuCi0vLyBUaGlzIGlzIHRoZSBleHBlY3RlZCByZXN1bHQgb2YgcnVubmluZyB0aGUgc2FtcGxlIGRhdGEgaW4KLS8vIHllc18zMG1zX3NhbXBsZV9kYXRhLmNjIHRocm91Z2ggdGhlIHByZXByb2Nlc3NpbmcgcGlwZWxpbmUuCi0KLSNpZm5kZWYgVEVOU09SRkxPV19MSVRFX01JQ1JPX0VYQU1QTEVTX01JQ1JPX1NQRUVDSF9TSU1QTEVfRkVBVFVSRVNfWUVTX1BPV0VSX1NQRUNUUlVNX0RBVEFfSF8KLSNkZWZpbmUgVEVOU09SRkxPV19MSVRFX01JQ1JPX0VYQU1QTEVTX01JQ1JPX1NQRUVDSF9TSU1QTEVfRkVBVFVSRVNfWUVTX1BPV0VSX1NQRUNUUlVNX0RBVEFfSF8KLQotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KLWNvbnN0ZXhwciBpbnQgZ195ZXNfcG93ZXJfc3BlY3RydW1fZGF0YV9zaXplID0gNDM7Ci1leHRlcm4gY29uc3QgdWludDhfdCBnX3llc19wb3dlcl9zcGVjdHJ1bV9kYXRhW107Ci0KLSNlbmRpZiAgLy8gVEVOU09SRkxPV19MSVRFX01JQ1JPX0VYQU1QTEVTX01JQ1JPX1NQRUVDSF9TSU1QTEVfRkVBVFVSRVNfWUVTX1BPV0VSX1NQRUNUUlVNX0RBVEFfSF8KZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL3llc19zaW1wbGVfZmVhdHVyZXNfZGF0YS5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9taWNyb19zcGVlY2gvc2ltcGxlX2ZlYXR1cmVzL3llc19zaW1wbGVfZmVhdHVyZXNfZGF0YS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc4Zjc4ZC4uMDAwMDAwMAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy95ZXNfc2ltcGxlX2ZlYXR1cmVzX2RhdGEuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTggKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMTggVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci15b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy95ZXNfc2ltcGxlX2ZlYXR1cmVzX2RhdGEuaCIKLQotLyogRmlsZSBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkKLSAqIHRlbnNvcmZsb3cvZXhhbXBsZXMvc3BlZWNoX2NvbW1hbmRzL3dhdl90b19mZWF0dXJlcy5weSBcCi0gKiAtLXNhbXBsZV9yYXRlPTE2MDAwIFwKLSAqIC0tY2xpcF9kdXJhdGlvbl9tcz0xMDAwIFwKLSAqIC0td2luZG93X3NpemVfbXM9MzAgXAotICogLS13aW5kb3dfc3RyaWRlX21zPTIwIFwKLSAqIC0tZmVhdHVyZV9iaW5fY291bnQ9NDAgXAotICogLS1xdWFudGl6ZT0xIFwKLSAqIC0tcHJlcHJvY2Vzcz0iYXZlcmFnZSIgXAotICogLS1pbnB1dF93YXY9InNwZWVjaF9jb21tYW5kc190ZXN0X3NldF92MC4wMi95ZXMvZjJlNTlmZWFfbm9oYXNoXzEud2F2IiBcCi0gKiAtLW91dHB1dF9jX2ZpbGU9Inllc19zaW1wbGVfZmVhdHVyZXNfZGF0YS5jYyIgXAotICovCi0KLWNvbnN0IGludCBnX3llc19zaW1wbGVfZjJlNTlmZWFfbm9oYXNoXzFfd2lkdGggPSA0MzsKLWNvbnN0IGludCBnX3llc19zaW1wbGVfZjJlNTlmZWFfbm9oYXNoXzFfaGVpZ2h0ID0gNDk7Ci1jb25zdCB1bnNpZ25lZCBjaGFyIGdfeWVzX3NpbXBsZV9mMmU1OWZlYV9ub2hhc2hfMV9kYXRhW10gPSB7Ci0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAxLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMSwgICAxLCAgMSwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgNCwgICA1LCAgIDEsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDEsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAyLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDEsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDEsICAxOSwgMSwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDEsICAgMCwgIDEsICAzLCAgIDMsICAgMSwgIDEsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgOCwgICA4OSwgOCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICA0LCAgMTMsCi0gICAgMSwgIDYsICAyMywgIDIwLCAgNiwgICA0LCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDE5LCAxNzcsIDQyLCAxLAotICAgIDEsICAwLCAgMCwgICAwLCAgIDAsICAgMiwgIDMsICAgMTE5LCA1MSwgNSwgIDEzOSwgOTIsICA1OCwgNTgsIDE1LCAgMiwgIDEsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDEzLCAxNjUsIDE3NiwgMywgIDEsICAxLCAgIDAsICAgMCwgIDEsICAxLCAgIDMyLCAyMTQsCi0gICAgMjYsIDE5LCAxMTMsIDEwMywgMjgsICAyMiwgMjcsICAzLCAgIDEsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAxMiwgIDU1LCAxMjgsCi0gICAgMjcsIDEsICAxLCAgIDAsICAgMSwgICA0LCAgMiwgICA1MiwgIDkzLCAxMCwgMjgsICAxNTYsIDEwLCAyMSwgMjEsICAzLCAgMywKLSAgICAxLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDE0LCAgOTksICAzMiwgNjUsIDcsICAgMSwgICAyLCAgMiwgIDYsICAgMTMsIDEyMSwKLSAgICAzNiwgMTUsIDExLCAgMTEyLCAxMjUsIDE0LCA1LCAgIDEzLCAgNCwgIDQsICAyLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMjQsIDI1LAotICAgIDMyLCA1LCAgMSwgICAwLCAgIDAsICAgMCwgIDEsICAgMCwgICA3LCAgNSwgIDEsICAgMSwgICAzLCAgMywgIDAsICAgMywgIDMsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDEzLCAgMTMsIDUsICAxLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAzLAotICAgIDQsICAxLCAgMCwgICAxLCAgIDIsICAgMywgIDEsICAgMSwgICAxLCAgNCwgIDgsICAgMSwgICAyLCAgMSwgIDMsICAgMSwgIDEsCi0gICAgMCwgIDEsICAxLCAgIDMsICAgMSwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMSwKLSAgICA4LCAgMiwgIDEsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMSwgIDEsICAwLCAgIDAsICAgMSwgIDEsICAyLCAgIDAsICAyLAotICAgIDEsICAwLCAgMiwgICAwLCAgIDIsICAgMiwgIDMsICAgMSwgICAxLCAgMCwgIDEsICAgMSwgICA0LCAgNSwgIDEsICAgMCwgIDEsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAxLCAgIDEsICAgMSwgIDAsICAxLCAgIDIsICAgMSwgIDAsICAxLCAgIDMsICAxLAotICAgIDEsICAzLCAgMSwgICAxLCAgIDYsICAgMiwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDIsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAxLCAgIDEsICAgMCwgIDEsICAyLCAgIDYsICAgMiwgIDQsICAyLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDMsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMSwKLSAgICAwLCAgMCwgIDEsICAgMiwgICAxLCAgIDEsICAyLCAgIDEsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgNCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDIsICAxLCAgMCwgICAwLCAgIDIsICAzLCAgNSwgICAyLCAgMCwKLSAgICAxLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDEsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMSwgICAyLCAgMiwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMSwgIDAsICAgMCwgICAwLCAgMCwgIDEsICAgMiwgIDMsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMSwgIDEsICAgMSwgICAxLCAgMCwgIDAsICAgMCwgICAxLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAwLAotICAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgMCwgIDAsICAgMCwgIDAsCi0gICAgMCwgIDAsICAwLCAgIDAsICAgMCwgICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgIDAsICAwLCAgMCwgICAwLCAgMCwKLSAgICAwLCAgMCwgIDAsICAgMCwgICAwLCAgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsICAgMCwgIDAsICAwLCAgIDAsCi19OwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9zaW1wbGVfZmVhdHVyZXMveWVzX3NpbXBsZV9mZWF0dXJlc19kYXRhLmggYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy95ZXNfc2ltcGxlX2ZlYXR1cmVzX2RhdGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThjN2U0Mi4uMDAwMDAwMAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy95ZXNfc2ltcGxlX2ZlYXR1cmVzX2RhdGEuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qIENvcHlyaWdodCAyMDE4IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLUxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwoteW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLVdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi0jaWZuZGVmIFRFTlNPUkZMT1dfTElURV9NSUNST19FWEFNUExFU19NSUNST19TUEVFQ0hfU0lNUExFX0ZFQVRVUkVTX1lFU19TSU1QTEVfRkVBVFVSRVNfREFUQV9IXwotI2RlZmluZSBURU5TT1JGTE9XX0xJVEVfTUlDUk9fRVhBTVBMRVNfTUlDUk9fU1BFRUNIX1NJTVBMRV9GRUFUVVJFU19ZRVNfU0lNUExFX0ZFQVRVUkVTX0RBVEFfSF8KLQotZXh0ZXJuIGNvbnN0IGludCBnX3llc19zaW1wbGVfZjJlNTlmZWFfbm9oYXNoXzFfd2lkdGg7Ci1leHRlcm4gY29uc3QgaW50IGdfeWVzX3NpbXBsZV9mMmU1OWZlYV9ub2hhc2hfMV9oZWlnaHQ7Ci1leHRlcm4gY29uc3QgdW5zaWduZWQgY2hhciBnX3llc19zaW1wbGVfZjJlNTlmZWFfbm9oYXNoXzFfZGF0YVtdOwotCi0jZW5kaWYgIC8vIFRFTlNPUkZMT1dfTElURV9NSUNST19FWEFNUExFU19NSUNST19TUEVFQ0hfU0lNUExFX0ZFQVRVUkVTX1lFU19TSU1QTEVfRkVBVFVSRVNfREFUQV9IXwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC90ZXN0ZGF0YS9ub2lzZV8xMDAwbXMud2F2IGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC90ZXN0ZGF0YS9ub2lzZV8xMDAwbXMud2F2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMDg5NmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3Rlc3RkYXRhL25vaXNlXzEwMDBtcy53YXYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC90ZXN0ZGF0YS9zaWxlbmNlXzEwMDBtcy53YXYgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3Rlc3RkYXRhL3NpbGVuY2VfMTAwMG1zLndhdgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTRkZmM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC90ZXN0ZGF0YS9zaWxlbmNlXzEwMDBtcy53YXYKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC90cmFpbi9SRUFETUUubWQgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3RyYWluL1JFQURNRS5tZAppbmRleCAxOGE2ODQ2Li42MzZmNzBjIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3RyYWluL1JFQURNRS5tZAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3RyYWluL1JFQURNRS5tZApAQCAtMSw3ICsxLDcgQEAKIAogIyBNaWNybyBTcGVlY2ggVHJhaW5pbmcKIAotVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byB0cmFpbiBhIDIwIGtCIG1vZGVsIHRoYXQgY2FuIHJlY29nbml6ZSAyIGtleXdvcmRzLAorVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byB0cmFpbiBhIGxlc3MgdGhhbiAyMCBrQiBtb2RlbCB0aGF0IGNhbiByZWNvZ25pemUgMiBrZXl3b3JkcywKICJ5ZXMiIGFuZCAibm8iLCBmcm9tIHNwZWVjaCBkYXRhLgogCiBJZiB0aGUgaW5wdXQgZG9lcyBub3QgYmVsb25nIHRvIGVpdGhlciBjYXRlZ29yaWVzLCBpdCBpcyBjbGFzc2lmaWVkIGFzICJ1bmtub3duIgpAQCAtODksMTkgKzg5LDE3IEBACiAKICoqRnVsbHkgcXVhbnRpemVkIGltcGxpZXMgdGhhdCB0aGUgbW9kZWwgaXMgKipzdHJpY3RseSBpbnQ4KiogcXVhbnRpemVkCiAqKmluY2x1ZGluZyoqIHRoZSBpbnB1dChzKSBhbmQgb3V0cHV0KHMpLioKLTwhLS0gKipGdWxseSBxdWFudGl6ZWQgaW1wbGllcyB0aGF0IHRoZSBtb2RlbCBpcyAqKnN0cmljdGx5IGludDgqKiBleGNlcHQgdGhlCi1pbnB1dChzKSBhbmQgb3V0cHV0KHMpIHdoaWNoIHJlbWFpbiBmbG9hdC4qIC0tPgogCiAjIyBNb2RlbCBBcmNoaXRlY3R1cmUKIAotVGhpcyBpcyBhIHNpbXBsZSBtb2RlbCBjb21wcmlzaW5nIG9mIGEgQ29udm9sdXRpb25hbCAyRCBsYXllciwgYSBGdWxseSBDb25uZWN0ZWQKK1RoaXMgaXMgYSBzaW1wbGUgbW9kZWwgY29tcHJpc2VkIG9mIGEgQ29udm9sdXRpb25hbCAyRCBsYXllciwgYSBGdWxseSBDb25uZWN0ZWQKIExheWVyIG9yIGEgTWF0TXVsIExheWVyIChvdXRwdXQ6IGxvZ2l0cykgYW5kIGEgU29mdG1heCBsYXllcgotKG91dHB1dDogcHJvYmFiaWxpdGllcykgYXMgc2hvd24gYmVsb3cuIFJlZmVyIHRvIHRoZSBbYHRpbnlfY29udmBdKGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmbGl0ZS1taWNyby9ibG9iL21haW4vdGVuc29yZmxvdy9leGFtcGxlcy9zcGVlY2hfY29tbWFuZHMvbW9kZWxzLnB5I0w2NzMpCisob3V0cHV0OiBwcm9iYWJpbGl0aWVzKSBhcyBzaG93biBiZWxvdy4gUmVmZXIgdG8gdGhlIFtgdGlueV9jb252YF0oaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9ibG9iL21hc3Rlci90ZW5zb3JmbG93L2V4YW1wbGVzL3NwZWVjaF9jb21tYW5kcy9tb2RlbHMucHkjTDY3MykKIG1vZGVsIGFyY2hpdGVjdHVyZS4KIAotIVttb2RlbF9hcmNoaXRlY3R1cmUucG5nXSguLi9pbWFnZXMvbW9kZWxfYXJjaGl0ZWN0dXJlLnBuZykKK1s8aW1nIHNyYz0iLi4vaW1hZ2VzL21pY3JvX3NwZWVjaF9xdWFudGl6ZWQucG5nIiB3aWR0aD0iOTAwIiBhbHQ9Im1vZGVsIGFyY2hpdGVjdHVyZSIvPl0oLi4vaW1hZ2VzL21pY3JvX3NwZWVjaF9xdWFudGl6ZWQucG5nKQogCi0qVGhpcyBpbWFnZSB3YXMgZGVyaXZlZCBmcm9tIHZpc3VhbGl6aW5nIHRoZSAnbW9kZWwudGZsaXRlJyBmaWxlIGluCisqVGhpcyBpbWFnZSB3YXMgZGVyaXZlZCBmcm9tIHZpc3VhbGl6aW5nIHRoZSAnbW9kZWxzL21pY3JvX3NwZWVjaF9xdWFudGl6ZWQudGZsaXRlJyBmaWxlIGluCiBbTmV0cm9uXShodHRwczovL2dpdGh1Yi5jb20vbHV0enJvZWRlci9uZXRyb24pKgogCiBUaGlzIGRvZXNuJ3QgcHJvZHVjZSBhIGhpZ2hseSBhY2N1cmF0ZSBtb2RlbCwgYnV0IGl0J3MgZGVzaWduZWQgdG8gYmUgdXNlZCBhcwpAQCAtMTA5LDcgKzEwNyw3IEBACiBjYW4gYWx3YXlzIGJlIG9uLCBhbmQgdGhlbiB3YWtlIGhpZ2hlci1wb3dlciBjaGlwcyB3aGVuIGEgcG9zc2libGUgdXR0ZXJhbmNlIGhhcwogYmVlbiBmb3VuZCwgc28gdGhhdCBtb3JlIGFjY3VyYXRlIGFuYWx5c2lzIGNhbiBiZSBkb25lLiBBZGRpdGlvbmFsbHksIHRoZSBtb2RlbAogdGFrZXMgaW4gcHJlcHJvY2Vzc2VkIHNwZWVjaCBpbnB1dCBhcyBhIHJlc3VsdCBvZiB3aGljaCB3ZSBjYW4gbGV2ZXJhZ2UgYQotc2ltcGxlciBtb2RlbCBmb3IgYWNjdXJhdGUgcmVzdWx0cy4KK3NpbXBsZXIgbW9kZWwgZm9yIGluZmVyZW5jZSByZXN1bHRzLgogCiAjIyBEYXRhc2V0CiAKQEAgLTEyNCw0OSArMTIyLDMyIEBACiAjIyBQcmVwcm9jZXNzaW5nIFNwZWVjaCBJbnB1dAogCiBJbiB0aGlzIHNlY3Rpb24gd2UgZGlzY3VzcyBzcGVjdHJvZ3JhbXMsIHRoZSBwcmVwcm9jZXNzZWQgc3BlZWNoIGlucHV0IHRvIHRoZQotbW9kZWwuIEhlcmUncyBhbiBpbGx1c3RyYXRpb24gb2YgdGhlIHByb2Nlc3M6Ci0KLSFbc3BlY3Ryb2dyYW0gZGlhZ3JhbV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2Rvd25sb2FkLnRlbnNvcmZsb3cub3JnL2V4YW1wbGVfaW1hZ2VzL3NwZWN0cm9ncmFtX2RpYWdyYW0ucG5nKQorbW9kZWwuCiAKIFRoZSBtb2RlbCBkb2Vzbid0IHRha2UgaW4gcmF3IGF1ZGlvIHNhbXBsZSBkYXRhLCBpbnN0ZWFkIGl0IHdvcmtzIHdpdGgKIHNwZWN0cm9ncmFtcyB3aGljaCBhcmUgdHdvIGRpbWVuc2lvbmFsIGFycmF5cyB0aGF0IGFyZSBtYWRlIHVwIG9mIHNsaWNlcyBvZgogZnJlcXVlbmN5IGluZm9ybWF0aW9uLCBlYWNoIHRha2VuIGZyb20gYSBkaWZmZXJlbnQgdGltZSB3aW5kb3cuCiAKIFRoZSByZWNpcGUgZm9yIGNyZWF0aW5nIHRoZSBzcGVjdHJvZ3JhbSBkYXRhIGlzIHRoYXQgZWFjaCBmcmVxdWVuY3kgc2xpY2UgaXMKLWNyZWF0ZWQgYnkgcnVubmluZyBhbiBGRlQgYWNyb3NzIGEgMzBtcyBzZWN0aW9uIG9mIHRoZSBhdWRpbyBzYW1wbGUgZGF0YS4gVGhlCitjcmVhdGVkIGJ5IHJ1bm5pbmcgYW4gRkZUIGFjcm9zcyBhIDMwbXMgd2luZG93IG9mIHRoZSBhdWRpbyBzYW1wbGUgZGF0YS4gVGhlCiBpbnB1dCBzYW1wbGVzIGFyZSB0cmVhdGVkIGFzIGJlaW5nIGJldHdlZW4gLTEgYW5kICsxIGFzIHJlYWwgdmFsdWVzIChlbmNvZGVkIGFzCi0tMzIsNzY4IGFuZCAzMiw3NjcgaW4gMTYtYml0IHNpZ25lZCBpbnRlZ2VyIHNhbXBsZXMpLgorLTMyLDc2OCBhbmQgMzIsNzY3IGluIDE2LWJpdCBzaWduZWQgaW50ZWdlciBzYW1wbGVzKS4gIFRoZSBhdWRpbyBzYW1wbGluZyB3aW5kb3cKK3N0cmlkZSBpcyAyMG1zLCB0aHVzIGV2ZXJ5IHdpbmRvdyBvdmVybGFwcyBieSAxMG1zLgogCi1UaGlzIHJlc3VsdHMgaW4gYW4gRkZUIHdpdGggMjU2IGVudHJpZXMuIEV2ZXJ5IHNlcXVlbmNlIG9mIHNpeCBlbnRyaWVzIGlzCi1hdmVyYWdlZCB0b2dldGhlciwgZ2l2aW5nIGEgdG90YWwgb2YgNDMgZnJlcXVlbmN5IGJ1Y2tldHMgaW4gdGhlIGZpbmFsIHNsaWNlLgotVGhlIHJlc3VsdHMgYXJlIHN0b3JlZCBhcyB1bnNpZ25lZCBlaWdodC1iaXQgdmFsdWVzLCB3aGVyZSAwIHJlcHJlc2VudHMgYSByZWFsCi1udW1iZXIgb2YgemVybywgYW5kIDI1NSByZXByZXNlbnRzIDEyNy41IGFzIGEgcmVhbCBudW1iZXIuCitUaGlzIHJlc3VsdHMgaW4gYW4gRkZUIHdpdGggMjU3IGVudHJpZXMuIEV2ZXJ5IHNlcXVlbmNlIG9mIGFwcHJveGltYXRlbHkgc2l4IGVudHJpZXMgaXMKK2F2ZXJhZ2VkIHRvZ2V0aGVyLCBnaXZpbmcgYSB0b3RhbCBvZiA0MCBmcmVxdWVuY3kgYnVja2V0cyBpbiB0aGUgc2xpY2UuCitUaGUgcmVzdWx0cyBhcmUgZnVydGhlciBwcm9jZXNzZWQgYnkgZG93bi1zY2FsaW5nLCBub2lzZSByZWR1Y3Rpb24sIGF1dG9tYXRpYworZ2FpbiBjb250cm9sLCBhbmQgYSBmaW5hbCBkb3duLXNjYWxpbmcuCiAKIEVhY2ggYWRqYWNlbnQgZnJlcXVlbmN5IGVudHJ5IGlzIHN0b3JlZCBpbiBhc2NlbmRpbmcgbWVtb3J5IG9yZGVyIChmcmVxdWVuY3kKIGJ1Y2tldCAwIGF0IGRhdGFbMF0sIGJ1Y2tldCAxIGF0IGRhdGFbMV0sIGV0YykuIFRoZSB3aW5kb3cgZm9yIHRoZSBmcmVxdWVuY3kKIGFuYWx5c2lzIGlzIHRoZW4gbW92ZWQgZm9yd2FyZCBieSAyMG1zLCBhbmQgdGhlIHByb2Nlc3MgcmVwZWF0ZWQsIHN0b3JpbmcgdGhlCi1yZXN1bHRzIGluIHRoZSBuZXh0IG1lbW9yeSByb3cgKGZvciBleGFtcGxlIGJ1Y2tldCAwIGluIHRoaXMgbW92ZWQgd2luZG93IHdvdWxkCi1iZSBpbiBkYXRhWzQzICsgMF0sIGV0YykuIFRoaXMgcHJvY2VzcyBoYXBwZW5zIDQ5IHRpbWVzIGluIHRvdGFsLCBwcm9kdWNpbmcgYQotc2luZ2xlIGNoYW5uZWwgaW1hZ2UgdGhhdCBpcyA0MyBwaXhlbHMgd2lkZSwgYW5kIDQ5IHJvd3MgaGlnaC4KLQotSW4gYSBjb21wbGV0ZSBhcHBsaWNhdGlvbiB0aGVzZSBzcGVjdHJvZ3JhbXMgd291bGQgYmUgY2FsY3VsYXRlZCBhdCBydW50aW1lIGZyb20KLW1pY3JvcGhvbmUgaW5wdXRzLCBidXQgdGhlIGNvZGUgZm9yIGRvaW5nIHRoYXQgaXMgbm90IHlldCBpbmNsdWRlZCBpbiB0aGlzCi1zYW1wbGUgY29kZS4gVGhlIHRlc3QgdXNlcyBzcGVjdHJvZ3JhbXMgdGhhdCBoYXZlIGJlZW4gcHJlLWNhbGN1bGF0ZWQgZnJvbQotb25lLXNlY29uZCBXQVYgZmlsZXMgaW4gdGhlIHRlc3QgZGF0YXNldCBnZW5lcmF0ZWQgYnkgcnVubmluZyB0aGUgZm9sbG93aW5nCi1jb21tYW5kczoKLQotYGBgCi1weXRob24gdGVuc29yZmxvdy90ZW5zb3JmbG93L2V4YW1wbGVzL3NwZWVjaF9jb21tYW5kcy93YXZfdG9fZmVhdHVyZXMucHkgXAotLS1pbnB1dF93YXY9L3RtcC9zcGVlY2hfZGF0YXNldC95ZXMvZjJlNTlmZWFfbm9oYXNoXzEud2F2IFwKLS0tb3V0cHV0X2NfZmlsZT0vdG1wL3llc19mZWF0dXJlc19kYXRhLmNjIFwKLS0td2luZG93X3N0cmlkZT0yMCAtLXByZXByb2Nlc3M9YXZlcmFnZSAtLXF1YW50aXplPTEKLQotcHl0aG9uIHRlbnNvcmZsb3cvdGVuc29yZmxvdy9leGFtcGxlcy9zcGVlY2hfY29tbWFuZHMvd2F2X3RvX2ZlYXR1cmVzLnB5IFwKLS0taW5wdXRfd2F2PS90bXAvc3BlZWNoX2RhdGFzZXQvbm8vZjk2NDNkNDJfbm9oYXNoXzQud2F2IFwKLS0tb3V0cHV0X2NfZmlsZT0vdG1wL25vX2ZlYXR1cmVzX2RhdGEuY2MgXAotLS13aW5kb3dfc3RyaWRlPTIwIC0tcHJlcHJvY2Vzcz1hdmVyYWdlIC0tcXVhbnRpemU9MQotYGBgCi0KK3Jlc3VsdHMgb2YgdGhlIG5ldyBmcmVxdWVuY3kgc2xpY2UgaW4gdGhlIG5leHQgbWVtb3J5IHJvdy4KK1RoZSB0cmFpbmluZyBpcyBjb25maWd1cmVkIGZvciByYXcgYXVkaW8gc2FtcGxlcyBvZiAxMDAwbXMgaW4gbGVuZ3RoLgorV2l0aCBhIHdpbmRvdyBzaXplIG9mIDMwbXMgYW5kIHN0cmlkZSBvZiAyMG1zLCBzb21lIDQ5IGZyZXF1ZW5jeSBzbGljZXMgY2FuCitiZSBjcmVhdGVkIGZyb20gMTAwMG1zIG9mIGF1ZGlvIGRhdGEuCitUaHVzLCB0aGUgcHJlcHJvY2Vzc2luZyBwcm9kdWNlcyBhCitzaW5nbGUgY2hhbm5lbCBpbWFnZSB0aGF0IGlzIDQwIHBpeGVscyB3aWRlLCBhbmQgNDkgcm93cyBoaWdoLgogCiAjIyBPdGhlciBUcmFpbmluZyBNZXRob2RzCiAKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9tbmlzdF9sc3RtL0JVSUxEIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21uaXN0X2xzdG0vQlVJTEQKaW5kZXggNmRmMmVlZi4uN2Q4MThiMiAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21uaXN0X2xzdG0vQlVJTEQKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21uaXN0X2xzdG0vQlVJTEQKQEAgLTEsMyArMSw0IEBACitsb2FkKCJAcnVsZXNfcHl0aG9uLy9weXRob246ZGVmcy5iemwiLCAicHlfYmluYXJ5IiwgInB5X3Rlc3QiKQogbG9hZCgiQHRmbG1fcGlwX2RlcHMvLzpyZXF1aXJlbWVudHMuYnpsIiwgInJlcXVpcmVtZW50IikKIAogcHlfYmluYXJ5KApAQCAtNiw3ICs3LDcgQEAKICAgICBzcmNzX3ZlcnNpb24gPSAiUFkzIiwKICAgICBkZXBzID0gWwogICAgICAgICByZXF1aXJlbWVudCgibnVtcHkiKSwKLSAgICAgICAgcmVxdWlyZW1lbnQoInRlbnNvcmZsb3ctY3B1IiksCisgICAgICAgIHJlcXVpcmVtZW50KCJ0ZW5zb3JmbG93IiksCiAgICAgXSwKICkKIApAQCAtMTcsNiArMTgsNyBAQAogICAgIGRlcHMgPSBbCiAgICAgICAgICIvL3B5dGhvbi90ZmxpdGVfbWljcm86cnVudGltZSIsCiAgICAgICAgICJAYWJzbF9weS8vYWJzbDphcHAiLAorICAgICAgICByZXF1aXJlbWVudCgicGlsbG93IiksCiAgICAgXSwKICkKIApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL25ldHdvcmtfdGVzdGVyL25ldHdvcmtfdGVzdGVyX3Rlc3QuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbmV0d29ya190ZXN0ZXIvbmV0d29ya190ZXN0ZXJfdGVzdC5jYwppbmRleCBlNjJlMGM0Li4yM2U1MGM5IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbmV0d29ya190ZXN0ZXIvbmV0d29ya190ZXN0ZXJfdGVzdC5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbmV0d29ya190ZXN0ZXIvbmV0d29ya190ZXN0ZXJfdGVzdC5jYwpAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgMjAyNCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTQwLDcgKzQwLDcgQEAKICNkZWZpbmUgTlVNX0lORkVSRU5DRVMgMQogI2VuZGlmCiAKLXVpbnQ4X3QgdGVuc29yX2FyZW5hW1RFTlNPUl9BUkVOQV9TSVpFXTsKK2FsaWduYXMoMTYpIHVpbnQ4X3QgdGVuc29yX2FyZW5hW1RFTlNPUl9BUkVOQV9TSVpFXTsKIAogI2lmZGVmIE5VTV9CWVRFU19UT19QUklOVAogaW5saW5lIHZvaWQgcHJpbnRfb3V0cHV0X2RhdGEoVGZMaXRlVGVuc29yKiBvdXRwdXQpIHsKQEAgLTkyLDE1ICs5MiwxOSBAQAogICAgICAgICBtb2RlbC0+dmVyc2lvbigpLCBURkxJVEVfU0NIRU1BX1ZFUlNJT04pOwogICAgIHJldHVybiBrVGZMaXRlRXJyb3I7CiAgIH0KKyNpZmRlZiBFVEhPU19VCisgIHRmbGl0ZTo6TWljcm9NdXRhYmxlT3BSZXNvbHZlcjwxPiByZXNvbHZlcjsKKyAgcmVzb2x2ZXIuQWRkRXRob3NVKCk7CiAKLSAgdGZsaXRlOjpNaWNyb011dGFibGVPcFJlc29sdmVyPDY+IHJlc29sdmVyOworI2Vsc2UKKyAgdGZsaXRlOjpNaWNyb011dGFibGVPcFJlc29sdmVyPDU+IHJlc29sdmVyOwogICByZXNvbHZlci5BZGRBdmVyYWdlUG9vbDJEKHRmbGl0ZTo6UmVnaXN0ZXJfQVZFUkFHRV9QT09MXzJEX0lOVDgoKSk7CiAgIHJlc29sdmVyLkFkZENvbnYyRCh0ZmxpdGU6OlJlZ2lzdGVyX0NPTlZfMkRfSU5UOCgpKTsKICAgcmVzb2x2ZXIuQWRkRGVwdGh3aXNlQ29udjJEKHRmbGl0ZTo6UmVnaXN0ZXJfREVQVEhXSVNFX0NPTlZfMkRfSU5UOCgpKTsKLSAgcmVzb2x2ZXIuQWRkRXRob3NVKCk7CiAgIHJlc29sdmVyLkFkZFJlc2hhcGUoKTsKICAgcmVzb2x2ZXIuQWRkU29mdG1heCh0ZmxpdGU6OlJlZ2lzdGVyX1NPRlRNQVhfSU5UOCgpKTsKIAorI2VuZGlmCiAgIHRmbGl0ZTo6TWljcm9JbnRlcnByZXRlciBpbnRlcnByZXRlcihtb2RlbCwgcmVzb2x2ZXIsIHRlbnNvcl9hcmVuYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFTlNPUl9BUkVOQV9TSVpFKTsKIApAQCAtMTUyLDcgKzE1Niw4IEBACiAgICAgfQogI2VuZGlmCiAgIH0KLSAgTWljcm9QcmludGYoIlJhbiBzdWNjZXNzZnVsbHlcbiIpOworCisgIE1pY3JvUHJpbnRmKCJ+fn5BTEwgVEVTVFMgUEFTU0VEfn5+XG4iKTsKIH0KIAogVEZfTElURV9NSUNST19URVNUU19FTkQKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9wZXJzb25fZGV0ZWN0aW9uL1JFQURNRS5tZCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9wZXJzb25fZGV0ZWN0aW9uL1JFQURNRS5tZAppbmRleCBhNDkwNjI5Li4yYjMzMzM0IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvcGVyc29uX2RldGVjdGlvbi9SRUFETUUubWQKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL3BlcnNvbl9kZXRlY3Rpb24vUkVBRE1FLm1kCkBAIC03LDYgKzcsNyBAQAogCiAtICAgW1J1biB0aGUgdGVzdHMgb24gYSBkZXZlbG9wbWVudCBtYWNoaW5lXSgjcnVuLXRoZS10ZXN0cy1vbi1hLWRldmVsb3BtZW50LW1hY2hpbmUpCiAtICAgW1RyYWluaW5nIHlvdXIgb3duIG1vZGVsXSgjdHJhaW5pbmcteW91ci1vd24tbW9kZWwpCistICAgW0FkZGl0aW9uYWwgbWFrZWZpbGUgdGFyZ2V0c10oI2FkZGl0aW9uYWwtbWFrZWZpbGUtdGFyZ2V0cykKIAogCiAjIyBSdW4gdGhlIHRlc3RzIG9uIGEgZGV2ZWxvcG1lbnQgbWFjaGluZQpAQCAtMjYsNiArMjcsMTkgQEAKIFRvIHVuZGVyc3RhbmQgaG93IFRlbnNvckZsb3cgTGl0ZSBkb2VzIHRoaXMsIHlvdSBjYW4gbG9vayBhdAogW3BlcnNvbl9kZXRlY3Rpb25fdGVzdC5jY10ocGVyc29uX2RldGVjdGlvbl90ZXN0LmNjKS4KIAorIyMgQWRkaXRpb25hbCBtYWtlZmlsZSB0YXJnZXRzCitgYGAKK21ha2UgLWYgdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvTWFrZWZpbGUgcGVyc29uX2RldGVjdGlvbgorbWFrZSAtZiB0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9NYWtlZmlsZSBwZXJzb25fZGV0ZWN0aW9uX2JpbgorbWFrZSAtZiB0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9NYWtlZmlsZSBydW5fcGVyc29uX2RldGVjdGlvbgorYGBgCisKK1RoZSBgcnVuX3BlcnNvbl9kZXRlY3Rpb25gIHRhcmdldCB3aWxsIHByb2R1Y2UgY29udGludW91cyBvdXRwdXQgc2ltaWxhcgordG8gdGhlIGZvbGxvd2luZzoKK2BgYAorcGVyc29uIHNjb3JlOi03MiBubyBwZXJzb24gc2NvcmUgNzIKK2BgYAorCiAjIyBUcmFpbmluZyB5b3VyIG93biBtb2RlbAogCiBZb3UgY2FuIHRyYWluIHlvdXIgb3duIG1vZGVsIHdpdGggc29tZSBlYXN5LXRvLXVzZSBzY3JpcHRzLiBTZWUKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9wZXJzb25fZGV0ZWN0aW9uL3V0aWxzL0JVSUxEIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL3BlcnNvbl9kZXRlY3Rpb24vdXRpbHMvQlVJTEQKaW5kZXggOTgwZDgwMy4uN2Y1YzgxNSAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL3BlcnNvbl9kZXRlY3Rpb24vdXRpbHMvQlVJTEQKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL3BlcnNvbl9kZXRlY3Rpb24vdXRpbHMvQlVJTEQKQEAgLTEsNCArMSw1IEBACiBsb2FkKCJAdGZsbV9waXBfZGVwcy8vOnJlcXVpcmVtZW50cy5iemwiLCAicmVxdWlyZW1lbnQiKQorbG9hZCgiQHJ1bGVzX3B5dGhvbi8vcHl0aG9uOmRlZnMuYnpsIiwgInB5X2JpbmFyeSIsICJweV9saWJyYXJ5IiwgInB5X3Rlc3QiKQogCiBwYWNrYWdlKAogICAgIGZlYXR1cmVzID0gWyItbGF5ZXJpbmdfY2hlY2siXSwKQEAgLTM2LDcgKzM3LDcgQEAKICAgICBdLAogICAgIGRlcHMgPSBbCiAgICAgICAgICI6cmF3X3RvX2JpdG1hcF9saWIiLAotICAgICAgICByZXF1aXJlbWVudCgidGVuc29yZmxvdy1jcHUiKSwKKyAgICAgICAgcmVxdWlyZW1lbnQoInRlbnNvcmZsb3ciKSwKICAgICAgICAgcmVxdWlyZW1lbnQoIm51bXB5IiksCiAgICAgXSwKICkKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9yZWNpcGVzL0JVSUxEIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL3JlY2lwZXMvQlVJTEQKaW5kZXggNDc1ZTU1Mi4uMzU3MmZkYiAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL3JlY2lwZXMvQlVJTEQKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL3JlY2lwZXMvQlVJTEQKQEAgLTEsMyArMSw0IEBACitsb2FkKCJAcnVsZXNfcHl0aG9uLy9weXRob246ZGVmcy5iemwiLCAicHlfbGlicmFyeSIsICJweV90ZXN0IikKIGxvYWQoIkB0ZmxtX3BpcF9kZXBzLy86cmVxdWlyZW1lbnRzLmJ6bCIsICJyZXF1aXJlbWVudCIpCiAKIHBhY2thZ2UoCkBAIC01LDEzICs2LDI0IEBACiApCiAKIHB5X2xpYnJhcnkoCisgICAgbmFtZSA9ICJhZGRfZm91cl9udW1iZXJzIiwKKyAgICBzcmNzID0gWyJhZGRfZm91cl9udW1iZXJzLnB5Il0sCisgICAgc3Jjc192ZXJzaW9uID0gIlBZMyIsCisgICAgdmlzaWJpbGl0eSA9IFsiLy86X19zdWJwYWNrYWdlc19fIl0sCisgICAgZGVwcyA9IFsKKyAgICAgICAgcmVxdWlyZW1lbnQoIm51bXB5IiksCisgICAgICAgIHJlcXVpcmVtZW50KCJ0ZW5zb3JmbG93IiksCisgICAgXSwKKykKKworcHlfbGlicmFyeSgKICAgICBuYW1lID0gInJlc291cmNlX3ZhcmlhYmxlc19saWIiLAogICAgIHNyY3MgPSBbInJlc291cmNlX3ZhcmlhYmxlc19saWIucHkiXSwKICAgICBzcmNzX3ZlcnNpb24gPSAiUFkzIiwKICAgICB2aXNpYmlsaXR5ID0gWyIvLzpfX3N1YnBhY2thZ2VzX18iXSwKICAgICBkZXBzID0gWwogICAgICAgICByZXF1aXJlbWVudCgibnVtcHkiKSwKLSAgICAgICAgcmVxdWlyZW1lbnQoInRlbnNvcmZsb3ctY3B1IiksCisgICAgICAgIHJlcXVpcmVtZW50KCJ0ZW5zb3JmbG93IiksCiAgICAgXSwKICkKIApAQCAtMjYsOCArMzgsNiBAQAogICAgIF0sCiAgICAgZGVwcyA9IFsKICAgICAgICAgIjpyZXNvdXJjZV92YXJpYWJsZXNfbGliIiwKLSAgICAgICAgIyBUT0RPKGIvMjg2NDU2Mzc4KTogdXBkYXRlIHRmbG1fcnVudGltZSB0byBydW50aW1lIHdoZW4gd2UgYXJlIHJlYWR5IHRvCi0gICAgICAgICMgcmVtb3ZlIHRoZSBhbGlhcy4KLSAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvL3B5dGhvbi9pbnRlcnByZXRlci9zcmM6dGZsbV9ydW50aW1lIiwKKyAgICAgICAgIi8vcHl0aG9uL3RmbGl0ZV9taWNybzpydW50aW1lIiwKICAgICBdLAogKQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL3JlY2lwZXMvYWRkX2ZvdXJfbnVtYmVycy5weSBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9yZWNpcGVzL2FkZF9mb3VyX251bWJlcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU2NDE0MQotLS0gL2Rldi9udWxsCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9yZWNpcGVzL2FkZF9mb3VyX251bWJlcnMucHkKQEAgLTAsMCArMSw2MiBAQAorIyBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIiIiU2ltcGxlIFRGIG1vZGVsIGNyZWF0aW9uIHVzaW5nIHJlc291cmNlIHZhcmlhYmxlcy4iIiIKKworaW1wb3J0IG51bXB5IGFzIG5wCitpbXBvcnQgdGVuc29yZmxvdyBhcyB0ZgorCisKKyIiIgorR2VuZXJhdGVzIGEgc2ltcGxlIFRmTGl0ZSBtb2RlbCB0aGF0IGFkZHMgNCBudW1iZXJzLgorCitCYXNpYyBVc2FnZToKKworICBtb2RlbCA9IGdlbmVyYXRlX21vZGVsKEZhbHNlKQorCitVc2FnZSB3aGVyZSB5b3Ugd2FudCBtb2RlbCB3cml0dGVuIHRvIGZpbGU6CisKKyAgZmlsZV9wYXRoID0gInNvbWUgZmlsZSBwYXRoIgorICBtb2RlbCA9IGdlbmVyYXRlX21vZGVsKFRydWUsIGZpbGVfcGF0aCkKKyIiIgorCitjbGFzcyBBZGRGb3VyTnVtYmVycyh0Zi5Nb2R1bGUpOgorICBAdGYuZnVuY3Rpb24oCisgICAgICBpbnB1dF9zaWduYXR1cmU9WworICAgICAgICAgIHRmLlRlbnNvclNwZWMoc2hhcGU9WzFdLCBkdHlwZT10Zi5mbG9hdDMyLCBuYW1lPSJhIiksCisgICAgICAgICAgdGYuVGVuc29yU3BlYyhzaGFwZT1bMV0sIGR0eXBlPXRmLmZsb2F0MzIsIG5hbWU9ImIiKSwKKyAgICAgICAgICB0Zi5UZW5zb3JTcGVjKHNoYXBlPVsxXSwgZHR5cGU9dGYuZmxvYXQzMiwgbmFtZT0iYyIpLAorICAgICAgICAgIHRmLlRlbnNvclNwZWMoc2hhcGU9WzFdLCBkdHlwZT10Zi5mbG9hdDMyLCBuYW1lPSJkIiksCisgICAgICBdCisgICkKKyAgZGVmIF9fY2FsbF9fKHNlbGYsIGEsIGIsIGMsIGQpOgorICAgIHJldHVybiBhICsgYiArIGMgKyBkCisKKworZGVmIGdldF9tb2RlbF9mcm9tX2NvbmNyZXRlX2Z1bmN0aW9uKCk6CisgICIiIkFjY3VtdWxhdG9yIG1vZGVsIGJ1aWx0IHZpYSBURiBjb25jcmV0ZSBmdW5jdGlvbnMuIiIiCisgIG1vZGVsID0gQWRkRm91ck51bWJlcnMoIkFkZEZvdXJOdW1iZXJzIikKKyAgY29uY3JldGVfZnVuYyA9IG1vZGVsLl9fY2FsbF9fLmdldF9jb25jcmV0ZV9mdW5jdGlvbigpCisgIGNvbnZlcnRlciA9IHRmLmxpdGUuVEZMaXRlQ29udmVydGVyLmZyb21fY29uY3JldGVfZnVuY3Rpb25zKAorICAgICAgW2NvbmNyZXRlX2Z1bmNdLCBtb2RlbAorICApCisgIHJldHVybiBjb252ZXJ0ZXIuY29udmVydCgpCisKKworZGVmIGdlbmVyYXRlX21vZGVsKHdyaXRlX2ZpbGU9VHJ1ZSwgZmlsZW5hbWU9Ii90bXAvYWRkLnRmbGl0ZSIpOgorICBtb2RlbCA9IGdldF9tb2RlbF9mcm9tX2NvbmNyZXRlX2Z1bmN0aW9uKCkKKyAgaWYgd3JpdGVfZmlsZToKKyAgICB3aXRoIG9wZW4oZmlsZW5hbWUsICJ3YiIpIGFzIGY6CisgICAgICBmLndyaXRlKG1vZGVsKQorICByZXR1cm4gbW9kZWwKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9leGFtcGxlcy9yZWNpcGVzL3Jlc291cmNlX3ZhcmlhYmxlc190ZXN0LnB5IGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL3JlY2lwZXMvcmVzb3VyY2VfdmFyaWFibGVzX3Rlc3QucHkKaW5kZXggYWQ4Yzc5ZS4uNjg2YTY1MCAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL3JlY2lwZXMvcmVzb3VyY2VfdmFyaWFibGVzX3Rlc3QucHkKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL3JlY2lwZXMvcmVzb3VyY2VfdmFyaWFibGVzX3Rlc3QucHkKQEAgLTE4LDkgKzE4LDcgQEAKIGZyb20gdGVuc29yZmxvdy5weXRob24ucGxhdGZvcm0gaW1wb3J0IHRlc3QKIGZyb20gdGZsaXRlX21pY3JvLnRlbnNvcmZsb3cubGl0ZS5taWNyby5leGFtcGxlcy5yZWNpcGVzIGltcG9ydCByZXNvdXJjZV92YXJpYWJsZXNfbGliCiAKLSMgVE9ETyhiLzI4NjQ1NjM3OCk6IGNoYW5nZSB0ZmxtX3J1bnRpbWUgdG8gcnVudGltZSB3aGVuIHdlIGFsbCBvdGhlciB1c2FnZSBoYXMKLSMgYmVlbiB1cGRhdGVkLgotZnJvbSB0ZmxpdGVfbWljcm8udGVuc29yZmxvdy5saXRlLm1pY3JvLnB5dGhvbi5pbnRlcnByZXRlci5zcmMgaW1wb3J0IHRmbG1fcnVudGltZQorZnJvbSB0ZmxpdGVfbWljcm8ucHl0aG9uLnRmbGl0ZV9taWNybyBpbXBvcnQgcnVudGltZSBhcyB0ZmxtX3J1bnRpbWUKIAogCiBjbGFzcyBSZXNvdXJjZVZhcmlhYmxlc1Rlc3QodGVzdF91dGlsLlRlbnNvckZsb3dUZXN0Q2FzZSk6CmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZmFrZV9taWNyb19jb250ZXh0LmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2Zha2VfbWljcm9fY29udGV4dC5jYwppbmRleCAwM2VhNmRmLi44ODc0Nzk4IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZmFrZV9taWNyb19jb250ZXh0LmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9mYWtlX21pY3JvX2NvbnRleHQuY2MKQEAgLTEsNCArMSw0IEBACi0vKiBDb3B5cmlnaHQgMjAyMSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLyogQ29weXJpZ2h0IDIwMjQgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIAogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNSwyOCArMTUsMzEgQEAKIAogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9mYWtlX21pY3JvX2NvbnRleHQuaCIKIAorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9jL2NfYXBpX3R5cGVzLmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvY29tcGF0aWJpbGl0eS5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9hcmVuYV9hbGxvY2F0b3Ivc2luZ2xlX2FyZW5hX2J1ZmZlcl9hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fYWxsb2NhdG9yLmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2FyZW5hX2NvbnN0YW50cy5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19sb2cuaCIKIAogbmFtZXNwYWNlIHRmbGl0ZSB7Ci1uYW1lc3BhY2UgewotLy8gRHVtbXkgc3RhdGljIHZhcmlhYmxlcyB0byBhbGxvdyBjcmVhdGlvbiBvZiBkdW1teSBNaWNyb0FsbG9jYXRvci4KLS8vIEFsbCB0ZXN0cyBhcmUgZ3VhcmF0ZWVkIHRvIHJ1biBzZXJpYWxseS4KLXN0YXRpYyBjb25zdGV4cHIgaW50IEtEdW1teVRlbnNvckFyZW5hU2l6ZSA9IDI1NjsKLXN0YXRpYyB1aW50OF90IGR1bW15X3RlbnNvcl9hcmVuYVtLRHVtbXlUZW5zb3JBcmVuYVNpemVdOwotfSAgLy8gbmFtZXNwYWNlCiAKLUZha2VNaWNyb0NvbnRleHQ6OkZha2VNaWNyb0NvbnRleHQoVGZMaXRlVGVuc29yKiB0ZW5zb3JzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW5nbGVBcmVuYUJ1ZmZlckFsbG9jYXRvciogYWxsb2NhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaWNyb0dyYXBoKiBtaWNyb19ncmFwaCkKLSAgICA6IE1pY3JvQ29udGV4dCgKLSAgICAgICAgICBNaWNyb0FsbG9jYXRvcjo6Q3JlYXRlKGR1bW15X3RlbnNvcl9hcmVuYSwgS0R1bW15VGVuc29yQXJlbmFTaXplKSwKLSAgICAgICAgICBudWxscHRyLCBtaWNyb19ncmFwaCksCitGYWtlTWljcm9Db250ZXh0OjpGYWtlTWljcm9Db250ZXh0KAorICAgIFRmTGl0ZVRlbnNvciogdGVuc29ycywgU2luZ2xlQXJlbmFCdWZmZXJBbGxvY2F0b3IqIGFsbG9jYXRvciwKKyAgICBNaWNyb0dyYXBoKiBtaWNyb19ncmFwaAorI2lmZGVmIFVTRV9URkxNX0NPTVBSRVNTSU9OCisgICAgLAorICAgIGNvbnN0IENvbXByZXNzZWRUZW5zb3JMaXN0KiBjb21wcmVzc2VkX3RlbnNvcnMKKyNlbmRpZiAgLy8gVVNFX1RGTE1fQ09NUFJFU1NJT04KKyAgICApCisgICAgOiBncmFwaF8oKm1pY3JvX2dyYXBoKSwKICAgICAgIHRlbnNvcnNfKHRlbnNvcnMpLAotICAgICAgYWxsb2NhdG9yXyhhbGxvY2F0b3IpIHt9CisgICAgICBhbGxvY2F0b3JfKGFsbG9jYXRvcikKKyNpZmRlZiBVU0VfVEZMTV9DT01QUkVTU0lPTgorICAgICAgLAorICAgICAgY29tcHJlc3NlZF90ZW5zb3JzXyhjb21wcmVzc2VkX3RlbnNvcnMpCisjZW5kaWYgIC8vIFVTRV9URkxNX0NPTVBSRVNTSU9OCit7Cit9CiAKIFRmTGl0ZVRlbnNvciogRmFrZU1pY3JvQ29udGV4dDo6QWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKGludCB0ZW5zb3JfaW5kZXgpIHsKICAgYWxsb2NhdGVkX3RlbXBfY291bnRfKys7CkBAIC0xMTMsNCArMTE2LDY5IEBACiAgIHJldHVybiBzY3JhdGNoX2J1ZmZlcnNfW2J1ZmZlcl9pbmRleF07CiB9CiAKK1RmTGl0ZVN0YXR1cyBGYWtlTWljcm9Db250ZXh0OjpzZXRfZXh0ZXJuYWxfY29udGV4dCgKKyAgICB2b2lkKiBleHRlcm5hbF9jb250ZXh0X3BheWxvYWQpIHsKKyAgcmV0dXJuIGtUZkxpdGVFcnJvcjsKK30KKwordm9pZCogRmFrZU1pY3JvQ29udGV4dDo6ZXh0ZXJuYWxfY29udGV4dCgpIHsgcmV0dXJuIG51bGxwdHI7IH0KKworTWljcm9HcmFwaCYgRmFrZU1pY3JvQ29udGV4dDo6Z3JhcGgoKSB7IHJldHVybiBncmFwaF87IH0KKworI2lmZGVmIFVTRV9URkxNX0NPTVBSRVNTSU9OCisKKy8vIEF2YWlsYWJsZSBkdXJpbmcgUHJlcGFyZSAmIEV2YWwuIFJldHVybnMgZmFsc2UgaWYgdGVuc29yIGlzIG5vdAorLy8gY29tcHJlc3NlZC4KK2Jvb2wgRmFrZU1pY3JvQ29udGV4dDo6SXNUZW5zb3JDb21wcmVzc2VkKGNvbnN0IFRmTGl0ZU5vZGUqIG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGVuc29yX2lkeCkgeworICBpZiAoY29tcHJlc3NlZF90ZW5zb3JzXyAhPSBudWxscHRyICYmIHRlbnNvcl9pZHggPCBub2RlLT5pbnB1dHMtPnNpemUpIHsKKyAgICBpbnQgaW5kZXggPSBub2RlLT5pbnB1dHMtPmRhdGFbdGVuc29yX2lkeF07CisgICAgaWYgKGluZGV4ID49IDAgJiYgY29tcHJlc3NlZF90ZW5zb3JzXy0+dGVuc29yc1tpbmRleF0gIT0gbnVsbHB0cikgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBPbmx5IGF2YWlsYWJsZSBkdXJpbmcgUHJlcGFyZS4gVGhlIGtlcm5lbCBpcyByZXNwb25zaWJsZSBmb3Igc3RvcmluZyB0aGUKKy8vIHNjcmF0Y2ggYnVmZmVyIGhhbmRsZS4KK2ludCBGYWtlTWljcm9Db250ZXh0OjpBbGxvY2F0ZURlY29tcHJlc3Npb25TY3JhdGNoQnVmZmVyKGNvbnN0IFRmTGl0ZU5vZGUqIG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGVuc29yX2lkeCkgeworICBpZiAoY29tcHJlc3NlZF90ZW5zb3JzXyA9PSBudWxscHRyIHx8IHRlbnNvcl9pZHggPj0gbm9kZS0+aW5wdXRzLT5zaXplKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGludCBpbmRleCA9IG5vZGUtPmlucHV0cy0+ZGF0YVt0ZW5zb3JfaWR4XTsKKyAgaWYgKGluZGV4IDwgMCB8fCBjb21wcmVzc2VkX3RlbnNvcnNfLT50ZW5zb3JzW2luZGV4XSA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIFRmTGl0ZVRlbnNvciogdGVuc29yID0gJnRlbnNvcnNfW2luZGV4XTsKKyAgaW50IHNjcmF0Y2hfaW5kZXggPSAtMTsKKyAgVGZMaXRlU3RhdHVzIHJlc3VsdCA9CisgICAgICBSZXF1ZXN0U2NyYXRjaEJ1ZmZlckluQXJlbmEodGVuc29yLT5ieXRlcywgJnNjcmF0Y2hfaW5kZXgpOworICBpZiAocmVzdWx0ICE9IGtUZkxpdGVPaykgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIHJldHVybiBzY3JhdGNoX2luZGV4OworfQorCisvLyBBdmFpbGFibGUgZHVyaW5nIFByZXBhcmUgJiBFdmFsLiBSZXR1cm5zIG51bGxwdHIgaWYgdGVuc29yIGlzIG5vdAorLy8gY29tcHJlc3NlZC4KK2NvbnN0IENvbXByZXNzaW9uVGVuc29yRGF0YSogRmFrZU1pY3JvQ29udGV4dDo6R2V0VGVuc29yQ29tcHJlc3Npb25EYXRhKAorICAgIGNvbnN0IFRmTGl0ZU5vZGUqIG5vZGUsIGludCB0ZW5zb3JfaWR4KSB7CisgIGlmIChjb21wcmVzc2VkX3RlbnNvcnNfID09IG51bGxwdHIgfHwgdGVuc29yX2lkeCA+PSBub2RlLT5pbnB1dHMtPnNpemUpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIGludCBpbmRleCA9IG5vZGUtPmlucHV0cy0+ZGF0YVt0ZW5zb3JfaWR4XTsKKyAgaWYgKGluZGV4IDwgMCkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgcmV0dXJuIGNvbXByZXNzZWRfdGVuc29yc18tPnRlbnNvcnNbaW5kZXhdOworfQorCisjZW5kaWYgIC8vIFVTRV9URkxNX0NPTVBSRVNTSU9OCisKIH0gIC8vIG5hbWVzcGFjZSB0ZmxpdGUKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9mYWtlX21pY3JvX2NvbnRleHQuaCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9mYWtlX21pY3JvX2NvbnRleHQuaAppbmRleCBiMDY4ZjMyLi43Y2Y5YzY4IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZmFrZV9taWNyb19jb250ZXh0LmgKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2Zha2VfbWljcm9fY29udGV4dC5oCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IDIwMjEgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8qIENvcHlyaWdodCAyMDI0IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAKIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMjcsOCArMjcsMTUgQEAKIAogY2xhc3MgRmFrZU1pY3JvQ29udGV4dCA6IHB1YmxpYyBNaWNyb0NvbnRleHQgewogIHB1YmxpYzoKKyAgfkZha2VNaWNyb0NvbnRleHQoKSA9IGRlZmF1bHQ7CisKICAgRmFrZU1pY3JvQ29udGV4dChUZkxpdGVUZW5zb3IqIHRlbnNvcnMsIFNpbmdsZUFyZW5hQnVmZmVyQWxsb2NhdG9yKiBhbGxvY2F0b3IsCi0gICAgICAgICAgICAgICAgICAgTWljcm9HcmFwaCogbWljcm9fZ3JhcGgpOworICAgICAgICAgICAgICAgICAgIE1pY3JvR3JhcGgqIG1pY3JvX2dyYXBoCisjaWZkZWYgVVNFX1RGTE1fQ09NUFJFU1NJT04KKyAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tcHJlc3NlZFRlbnNvckxpc3QqIGNvbXByZXNzZWRfdGVuc29ycyA9IG51bGxwdHIKKyNlbmRpZiAgLy8gVVNFX1RGTE1fQ09NUFJFU1NJT04KKyAgKTsKIAogICB2b2lkKiBBbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIoc2l6ZV90IGJ5dGVzKSBvdmVycmlkZTsKICAgVGZMaXRlU3RhdHVzIFJlcXVlc3RTY3JhdGNoQnVmZmVySW5BcmVuYShzaXplX3QgYnl0ZXMsCkBAIC00NCw5ICs1MSwzMiBAQAogCiAgIFRmTGl0ZUV2YWxUZW5zb3IqIEdldEV2YWxUZW5zb3IoaW50IHRlbnNvcl9pbmRleCkgb3ZlcnJpZGU7CiAKKyAgVGZMaXRlU3RhdHVzIHNldF9leHRlcm5hbF9jb250ZXh0KHZvaWQqIGV4dGVybmFsX2NvbnRleHRfcGF5bG9hZCkgb3ZlcnJpZGU7CisgIHZvaWQqIGV4dGVybmFsX2NvbnRleHQoKSBvdmVycmlkZTsKKyAgTWljcm9HcmFwaCYgZ3JhcGgoKSBvdmVycmlkZTsKKworI2lmZGVmIFVTRV9URkxNX0NPTVBSRVNTSU9OCisKKyAgLy8gQXZhaWxhYmxlIGR1cmluZyBQcmVwYXJlICYgRXZhbC4gUmV0dXJucyBmYWxzZSBpZiB0ZW5zb3IgaXMgbm90CisgIC8vIGNvbXByZXNzZWQuCisgIGJvb2wgSXNUZW5zb3JDb21wcmVzc2VkKGNvbnN0IFRmTGl0ZU5vZGUqIG5vZGUsIGludCB0ZW5zb3JfaWR4KSBvdmVycmlkZTsKKworICAvLyBPbmx5IGF2YWlsYWJsZSBkdXJpbmcgUHJlcGFyZS4gVGhlIGtlcm5lbCBpcyByZXNwb25zaWJsZSBmb3Igc3RvcmluZyB0aGUKKyAgLy8gc2NyYXRjaCBidWZmZXIgaGFuZGxlLgorICBpbnQgQWxsb2NhdGVEZWNvbXByZXNzaW9uU2NyYXRjaEJ1ZmZlcihjb25zdCBUZkxpdGVOb2RlKiBub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGVuc29yX2lkeCkgb3ZlcnJpZGU7CisKKyAgLy8gQXZhaWxhYmxlIGR1cmluZyBQcmVwYXJlICYgRXZhbC4gUmV0dXJucyBudWxscHRyIGlmIHRlbnNvciBpcyBub3QKKyAgLy8gY29tcHJlc3NlZC4KKyAgY29uc3QgQ29tcHJlc3Npb25UZW5zb3JEYXRhKiBHZXRUZW5zb3JDb21wcmVzc2lvbkRhdGEoCisgICAgICBjb25zdCBUZkxpdGVOb2RlKiBub2RlLCBpbnQgdGVuc29yX2lkeCkgb3ZlcnJpZGU7CisKKyNlbmRpZiAgLy8gVVNFX1RGTE1fQ09NUFJFU1NJT04KKwogIHByaXZhdGU6CiAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtOdW1TY3JhdGNoQnVmZmVyc18gPSAxMjsKIAorICBNaWNyb0dyYXBoJiBncmFwaF87CiAgIGludCBzY3JhdGNoX2J1ZmZlcl9jb3VudF8gPSAwOwogICB1aW50OF90KiBzY3JhdGNoX2J1ZmZlcnNfW2tOdW1TY3JhdGNoQnVmZmVyc19dOwogCkBAIC01NSw2ICs4NSwxNSBAQAogCiAgIFNpbmdsZUFyZW5hQnVmZmVyQWxsb2NhdG9yKiBhbGxvY2F0b3JfOwogCisjaWZkZWYgVVNFX1RGTE1fQ09NUFJFU1NJT04KKworICAvLworICAvLyBDb21wcmVzc2lvbgorICAvLworICBjb25zdCBDb21wcmVzc2VkVGVuc29yTGlzdCogY29tcHJlc3NlZF90ZW5zb3JzXzsKKworI2VuZGlmICAvLyBVU0VfVEZMTV9DT01QUkVTU0lPTgorCiAgIFRGX0xJVEVfUkVNT1ZFX1ZJUlRVQUxfREVMRVRFCiB9OwogCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vZmFrZV9taWNyb19jb250ZXh0X3Rlc3QuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vZmFrZV9taWNyb19jb250ZXh0X3Rlc3QuY2MKaW5kZXggMjY0YjdlNy4uZTc5MjIzOCAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2Zha2VfbWljcm9fY29udGV4dF90ZXN0LmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9mYWtlX21pY3JvX2NvbnRleHRfdGVzdC5jYwpAQCAtMTgsNiArMTgsNyBAQAogCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2FyZW5hX2FsbG9jYXRvci9zaW5nbGVfYXJlbmFfYnVmZmVyX2FsbG9jYXRvci5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19hbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbW9ja19taWNyb19ncmFwaC5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0X2hlbHBlcnMuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vdGVzdGluZy9taWNyb190ZXN0LmgiCiAKQEAgLTU4LDcgKzU5LDcgQEAKICAgdWludDhfdCBhcmVuYV9idWZmZXJba0FyZW5hU2l6ZV07CiAgIHRmbGl0ZTo6U2luZ2xlQXJlbmFCdWZmZXJBbGxvY2F0b3Igc2ltcGxlX21lbW9yeV9hbGxvY2F0b3IoYXJlbmFfYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtBcmVuYVNpemUpOwotICB0ZmxpdGU6Ok1pY3JvR3JhcGggZHVtbXlfbWljcm9fZ3JhcGgobnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cik7CisgIHRmbGl0ZTo6TW9ja01pY3JvR3JhcGggZHVtbXlfbWljcm9fZ3JhcGh7JnNpbXBsZV9tZW1vcnlfYWxsb2NhdG9yfTsKIAogICB0ZmxpdGU6OkZha2VNaWNyb0NvbnRleHQgbWljcm9fY29udGV4dCA9IHRmbGl0ZTo6Q3JlYXRlRmFrZU1pY3JvQ29udGV4dCgKICAgICAgICZzaW1wbGVfbWVtb3J5X2FsbG9jYXRvciwgJmR1bW15X21pY3JvX2dyYXBoKTsKQEAgLTcxLDcgKzcyLDcgQEAKICAgdWludDhfdCBhcmVuYV9idWZmZXJba0FyZW5hU2l6ZV07CiAgIHRmbGl0ZTo6U2luZ2xlQXJlbmFCdWZmZXJBbGxvY2F0b3Igc2ltcGxlX21lbW9yeV9hbGxvY2F0b3IoYXJlbmFfYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtBcmVuYVNpemUpOwotICB0ZmxpdGU6Ok1pY3JvR3JhcGggZHVtbXlfbWljcm9fZ3JhcGgobnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cik7CisgIHRmbGl0ZTo6TW9ja01pY3JvR3JhcGggZHVtbXlfbWljcm9fZ3JhcGh7JnNpbXBsZV9tZW1vcnlfYWxsb2NhdG9yfTsKIAogICB0ZmxpdGU6OkZha2VNaWNyb0NvbnRleHQgbWljcm9fY29udGV4dCA9IHRmbGl0ZTo6Q3JlYXRlRmFrZU1pY3JvQ29udGV4dCgKICAgICAgICZzaW1wbGVfbWVtb3J5X2FsbG9jYXRvciwgJmR1bW15X21pY3JvX2dyYXBoKTsKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9pbnRlZ3JhdGlvbl90ZXN0cy9CVUlMRCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9pbnRlZ3JhdGlvbl90ZXN0cy9CVUlMRAppbmRleCAxZTk2YmE4Li41YjkwZTVkIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vaW50ZWdyYXRpb25fdGVzdHMvQlVJTEQKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2ludGVncmF0aW9uX3Rlc3RzL0JVSUxECkBAIC0xLDMgKzEsNCBAQAorbG9hZCgiQHJ1bGVzX3B5dGhvbi8vcHl0aG9uOmRlZnMuYnpsIiwgInB5X2JpbmFyeSIpCiBsb2FkKCJAdGZsbV9waXBfZGVwcy8vOnJlcXVpcmVtZW50cy5iemwiLCAicmVxdWlyZW1lbnQiKQogCiBwYWNrYWdlKGxpY2Vuc2VzID0gWyJub3RpY2UiXSkKQEAgLTE4LDcgKzE5LDcgQEAKICAgICAgICAgIkBhYnNsX3B5Ly9hYnNsOmFwcCIsCiAgICAgICAgICJAYWJzbF9weS8vYWJzbC9mbGFncyIsCiAgICAgICAgIHJlcXVpcmVtZW50KCJtYWtvIiksCi0gICAgICAgIHJlcXVpcmVtZW50KCJ0ZW5zb3JmbG93LWNwdSIpLAorICAgICAgICByZXF1aXJlbWVudCgidGVuc29yZmxvdyIpLAogICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHM6Z2VuZXJhdGVfdGVzdF9mb3JfbW9kZWwiLAogICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvcHl0aG9uOnNjaGVtYV9weSIsCiAgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9weXRob246c2NoZW1hX3V0aWwiLApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvQlVJTEQgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9CVUlMRAppbmRleCAwNjVjOGY1Li4yMjI1NGQ5IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9CVUlMRAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9CVUlMRApAQCAtMSw4ICsxLDEwIEBACitsb2FkKCJAYmF6ZWxfc2t5bGliLy9ydWxlczpjb21tb25fc2V0dGluZ3MuYnpsIiwgInN0cmluZ19mbGFnIikKIGxvYWQoIi8vdGVuc29yZmxvdy9saXRlL21pY3JvOmJ1aWxkX2RlZi5iemwiLCAibWljcm9fY29wdHMiLCAidGZsbV9rZXJuZWxfY2NfbGlicmFyeSIpCiBsb2FkKAogICAgICIvL3RlbnNvcmZsb3c6ZXh0cmFfcnVsZXMuYnpsIiwKICAgICAidGZsbV9rZXJuZWxfZnJpZW5kcyIsCiAgICAgInh0ZW5zYV9mdXNpb25fZjFfY29uZmlnIiwKKyAgICAieHRlbnNhX2hpZmlfM19jb25maWciLAogICAgICJ4dGVuc2FfaGlmaV8zel9jb25maWciLAogICAgICJ4dGVuc2FfaGlmaV81X2NvbmZpZyIsCiAgICAgInh0ZW5zYV92aXNpb25fcDZfY29uZmlnIiwKQEAgLTQ0LDYgKzQ2LDcgQEAKIGNjX2xpYnJhcnkoCiAgICAgbmFtZSA9ICJhY3RpdmF0aW9uX3V0aWxzIiwKICAgICBoZHJzID0gWyJhY3RpdmF0aW9uX3V0aWxzLmgiXSwKKyAgICBjb3B0cyA9IG1pY3JvX2NvcHRzKCksCiAgICAgZGVwcyA9IFsKICAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL2M6Y29tbW9uIiwKICAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWw6Y3BwbWF0aCIsCkBAIC01OCw2ICs2MSw3IEBACiAgICAgaGRycyA9IFsKICAgICAgICAgImNpcmN1bGFyX2J1ZmZlcl9mbGV4YnVmZmVyc19nZW5lcmF0ZWRfZGF0YS5oIiwKICAgICBdLAorICAgIGNvcHRzID0gbWljcm9fY29wdHMoKSwKICkKIAogY2NfbGlicmFyeSgKQEAgLTcxLDYgKzc1LDcgQEAKICAgICB2aXNpYmlsaXR5ID0gWwogICAgICAgICAiLy92aXNpYmlsaXR5OnB1YmxpYyIsCiAgICAgXSwKKyAgICBjb3B0cyA9IG1pY3JvX2NvcHRzKCksCiAgICAgZGVwcyA9IFsKICAgICAgICAgIjprZXJuZWxfcnVubmVyIiwKICAgICAgICAgIjptaWNyb19vcHMiLApAQCAtODgsNiArOTMsNyBAQAogICAgIGhkcnMgPSBbCiAgICAgICAgICJkZXRlY3Rpb25fcG9zdHByb2Nlc3NfZmxleGJ1ZmZlcnNfZ2VuZXJhdGVkX2RhdGEuaCIsCiAgICAgXSwKKyAgICBjb3B0cyA9IG1pY3JvX2NvcHRzKCksCiApCiAKIGNjX2xpYnJhcnkoCkBAIC05Niw2ICsxMDIsNyBAQAogICAgICAgICAia2VybmVsX3J1bm5lci5jYyIsCiAgICAgXSwKICAgICBoZHJzID0gWyJrZXJuZWxfcnVubmVyLmgiXSwKKyAgICBjb3B0cyA9IG1pY3JvX2NvcHRzKCksCiAgICAgdmlzaWJpbGl0eSA9IFsKICAgICAgICAgIi8vdmlzaWJpbGl0eTpwdWJsaWMiLAogICAgIF0sCkBAIC0xMTYsNiArMTIzLDcgQEAKICAgICAgICAgImtlcm5lbF91dGlsLmNjIiwKICAgICBdLAogICAgIGhkcnMgPSBbImtlcm5lbF91dGlsLmgiXSwKKyAgICBjb3B0cyA9IG1pY3JvX2NvcHRzKCksCiAgICAgdmlzaWJpbGl0eSA9IFsKICAgICAgICAgIjprZXJuZWxfZnJpZW5kcyIsCiAgICAgICAgICI6dGZsaXRlX21pY3JvIiwKQEAgLTEzNSw2ICsxNDMsNyBAQAogICAgIGhkcnMgPSBbCiAgICAgICAgICJsc3RtX3NoYXJlZC5oIiwKICAgICBdLAorICAgIGNvcHRzID0gbWljcm9fY29wdHMoKSwKICAgICB2aXNpYmlsaXR5ID0gWyIvL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3Rlc3RkYXRhOl9fcGtnX18iXSwKICkKIApAQCAtMTQzLDYgKzE1Miw3IEBACiAgICAgaGRycyA9IFsKICAgICAgICAgImxzdG1fZXZhbF90ZXN0LmgiLAogICAgIF0sCisgICAgY29wdHMgPSBtaWNyb19jb3B0cygpLAogICAgIGRlcHMgPSBbCiAgICAgICAgICI6a2VybmVsX3V0aWwiLAogICAgICAgICAiOm1pY3JvX29wcyIsCkBAIC0xNTgsNiArMTY4LDcgQEAKICAgICAgICAgIm1pY3JvX3RlbnNvcl91dGlscy5jYyIsCiAgICAgXSwKICAgICBoZHJzID0gWyJtaWNyb190ZW5zb3JfdXRpbHMuaCJdLAorICAgIGNvcHRzID0gbWljcm9fY29wdHMoKSwKICAgICBkZXBzID0gWwogICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvYzpjb21tb24iLAogICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvY29yZTptYWNyb3MiLApAQCAtMTY5LDYgKzE4MCwxMSBAQAogICAgIF0sCiApCiAKK0hJRkkzX0NPUFRTID0gWworICAgICItRFhURU5TQT0xIiwKKyAgICAiLURISUZJMz0xIiwKK10KKwogSElGSTRfQ09QVFMgPSBbCiAgICAgIi1EWFRFTlNBPTEiLAogICAgICItREhJRkk0PTEiLApAQCAtMTk3LDYgKzIxMyw3IEBACiAgICAgICAgICJhZGRfbi5jYyIsCiAgICAgICAgICJhcmdfbWluX21heC5jYyIsCiAgICAgICAgICJhc3NpZ25fdmFyaWFibGUuY2MiLAorICAgICAgICAiYmF0Y2hfbWF0bXVsLmNjIiwKICAgICAgICAgImJhdGNoX3RvX3NwYWNlX25kLmNjIiwKICAgICAgICAgImJyb2FkY2FzdF9hcmdzLmNjIiwKICAgICAgICAgImJyb2FkY2FzdF90by5jYyIsCkBAIC0yNzgsNiArMjk1LDcgQEAKICAgICAgICAgInNxdWFyZWRfZGlmZmVyZW5jZS5jYyIsCiAgICAgICAgICJzcXVlZXplLmNjIiwKICAgICAgICAgInN0cmlkZWRfc2xpY2UuY2MiLAorICAgICAgICAic3RyaWRlZF9zbGljZV9jb21tb24uY2MiLAogICAgICAgICAic3ViLmNjIiwKICAgICAgICAgInN1Yl9jb21tb24uY2MiLAogICAgICAgICAic3ZkZi5jYyIsCkBAIC0zMTUsMTAgKzMzMywxMyBAQAogICAgICAgICAicmVkdWNlLmgiLAogICAgICAgICAicmVzaGFwZS5oIiwKICAgICAgICAgInNvZnRtYXguaCIsCisgICAgICAgICJzdHJpZGVkX3NsaWNlLmgiLAogICAgICAgICAic3ViLmgiLAogICAgICAgICAic3ZkZi5oIiwKKyAgICAgICAgInRyYW5zcG9zZV9jb252LmgiLAogICAgIF0gKyBzZWxlY3QoewogICAgICAgICB4dGVuc2FfZnVzaW9uX2YxX2NvbmZpZygpOiBnbG9iKFsieHRlbnNhLyoqLyouaCJdKSwKKyAgICAgICAgeHRlbnNhX2hpZmlfM19jb25maWcoKTogZ2xvYihbInh0ZW5zYS8qKi8qLmgiXSksCiAgICAgICAgIHh0ZW5zYV9oaWZpXzN6X2NvbmZpZygpOiBnbG9iKFsieHRlbnNhLyoqLyouaCJdKSwKICAgICAgICAgeHRlbnNhX2hpZmlfNV9jb25maWcoKTogZ2xvYihbInh0ZW5zYS8qKi8qLmgiXSksCiAgICAgICAgIHh0ZW5zYV92aXNpb25fcDZfY29uZmlnKCk6IGdsb2IoWyJ4dGVuc2EvKiovKi5oIl0pLApAQCAtMzI3LDYgKzM0OCw3IEBACiAgICAgfSksCiAgICAgYWNjZWxlcmF0ZWRfc3JjcyA9IHsKICAgICAgICAgeHRlbnNhX2Z1c2lvbl9mMV9jb25maWcoKTogZ2xvYihbInh0ZW5zYS8qKi8qLmNjIl0pLAorICAgICAgICB4dGVuc2FfaGlmaV8zX2NvbmZpZygpOiBnbG9iKFsieHRlbnNhLyoqLyouY2MiXSksCiAgICAgICAgIHh0ZW5zYV9oaWZpXzN6X2NvbmZpZygpOiBnbG9iKFsieHRlbnNhLyoqLyouY2MiXSksCiAgICAgICAgIHh0ZW5zYV9oaWZpXzVfY29uZmlnKCk6IGdsb2IoWyJ4dGVuc2EvKiovKi5jYyJdKSwKICAgICAgICAgeHRlbnNhX3Zpc2lvbl9wNl9jb25maWcoKTogZ2xvYihbInh0ZW5zYS8qKi8qLmNjIl0pLApAQCAtMzM0LDYgKzM1Niw3IEBACiAgICAgfSwKICAgICBjb3B0cyA9IG1pY3JvX2NvcHRzKCkgKyBzZWxlY3QoewogICAgICAgICB4dGVuc2FfZnVzaW9uX2YxX2NvbmZpZygpOiBISUZJNF9DT1BUUywKKyAgICAgICAgeHRlbnNhX2hpZmlfM19jb25maWcoKTogSElGSTNfQ09QVFMsCiAgICAgICAgIHh0ZW5zYV9oaWZpXzN6X2NvbmZpZygpOiBISUZJNF9DT1BUUywKICAgICAgICAgeHRlbnNhX2hpZmlfNV9jb25maWcoKTogSElGSTVfQ09QVFMsCiAgICAgICAgIHh0ZW5zYV92aXNpb25fcDZfY29uZmlnKCk6IFZQNl9DT1BUUywKQEAgLTM3MCw2ICszOTMsNyBAQAogICAgICAgICAiQGZsYXRidWZmZXJzLy86cnVudGltZV9jYyIsCiAgICAgXSArIHNlbGVjdCh7CiAgICAgICAgIHh0ZW5zYV9mdXNpb25fZjFfY29uZmlnKCk6IFsiLy90aGlyZF9wYXJ0eS94dGVuc2Evbm5saWJfaGlmaTQ6bm5saWJfaGlmaTRfbGliIl0sCisgICAgICAgIHh0ZW5zYV9oaWZpXzNfY29uZmlnKCk6IFsiLy90aGlyZF9wYXJ0eS94dGVuc2Evbm5saWJfaGlmaTQ6bm5saWJfaGlmaTRfbGliIl0sCiAgICAgICAgIHh0ZW5zYV9oaWZpXzN6X2NvbmZpZygpOiBbIi8vdGhpcmRfcGFydHkveHRlbnNhL25ubGliX2hpZmk0Om5ubGliX2hpZmk0X2xpYiJdLAogICAgICAgICB4dGVuc2FfaGlmaV81X2NvbmZpZygpOiBbIi8vdGhpcmRfcGFydHkveHRlbnNhL25ubGliX2hpZmk1Om5ubGliX2hpZmk1X2xpYiJdLAogICAgICAgICB4dGVuc2FfdmlzaW9uX3A2X2NvbmZpZygpOiBbIi8vdGhpcmRfcGFydHkveHRlbnNhL3hpX3RmbG1saWJfdmlzaW9uX3A2OnhpX3RmbG1saWJfdmlzaW9uX3A2X2xpYiJdLApAQCAtNDQwLDYgKzQ2NCwyMCBAQAogKQogCiBjY190ZXN0KAorICAgIG5hbWUgPSAiYmF0Y2hfbWF0bXVsX3Rlc3QiLAorICAgIHNyY3MgPSBbCisgICAgICAgICJiYXRjaF9tYXRtdWxfdGVzdC5jYyIsCisgICAgXSwKKyAgICBkZXBzID0gWworICAgICAgICAiOmtlcm5lbF9ydW5uZXIiLAorICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvYzpjb21tb24iLAorICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm86b3BfcmVzb2x2ZXJzIiwKKyAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvOnRlc3RfaGVscGVycyIsCisgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0aW5nOm1pY3JvX3Rlc3QiLAorICAgIF0sCispCisKK2NjX3Rlc3QoCiAgICAgbmFtZSA9ICJiYXRjaF90b19zcGFjZV9uZF90ZXN0IiwKICAgICBzcmNzID0gWwogICAgICAgICAiYmF0Y2hfdG9fc3BhY2VfbmRfdGVzdC5jYyIsCkBAIC0xNDQyLDMxICsxNDgwLDU1IEBACiAjIEJhemVsIGNvbmZpZyBzZXR0aW5ncy4KICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCisjIENvbW1hbmQgbGluZSBmbGFnIHRvIHNlbGVjdCB3aGljaCBzZXQgb2Ygb3B0aW1pemVkIGtlcm5lbHMgdG8gdXNlLgorIyBFYWNoIHZhbHVlIHNob3VsZCBoYXZlIGEgYGNvbmZpZ19zZXR0aW5nYCB3aGljaCBpcyBzZWxlY3RlZCBvbiBpbiB0aGUKKyMgYG1pY3JvX29wc2AgdGFyZ2V0IHRvIHBpY2t1cCBvcHRpbWl6ZWQga2VybmVsIHNvdXJjZXMuIEFuIGVtcHR5IHZhbHVlCisjIGluZGljYXRlcyBvbmx5IHJlZmVyZW5jZSBrZXJuZWxzIHNob3VsZCBiZSB1c2VkLgorc3RyaW5nX2ZsYWcoCisgICAgbmFtZSA9ICJvcHRpbWl6ZWRfa2VybmVscyIsCisgICAgYnVpbGRfc2V0dGluZ19kZWZhdWx0ID0gIiIsCisgICAgdmFsdWVzID0gWworICAgICAgICAiIiwKKyAgICAgICAgInh0ZW5zYV9mdXNpb25fZjEiLAorICAgICAgICAieHRlbnNhX2hpZmlfMyIsCisgICAgICAgICJ4dGVuc2FfaGlmaV8zeiIsCisgICAgICAgICJ4dGVuc2FfaGlmaV81IiwKKyAgICAgICAgInh0ZW5zYV92aXNpb25fcDYiLAorICAgIF0sCispCisKIGNvbmZpZ19zZXR0aW5nKAogICAgIG5hbWUgPSAieHRlbnNhX2Z1c2lvbl9mMV9kZWZhdWx0IiwKLSAgICB2YWx1ZXMgPSB7Ci0gICAgICAgICJjcHUiOiAiRjFfMTkwMzA1X3N3dXBncmFkZSIsCisgICAgZmxhZ192YWx1ZXMgPSB7CisgICAgICAgICI6b3B0aW1pemVkX2tlcm5lbHMiOiAieHRlbnNhX2Z1c2lvbl9mMSIsCisgICAgfSwKKykKKworY29uZmlnX3NldHRpbmcoCisgICAgbmFtZSA9ICJ4dGVuc2FfaGlmaV8zX2RlZmF1bHQiLAorICAgIGZsYWdfdmFsdWVzID0geworICAgICAgICAiOm9wdGltaXplZF9rZXJuZWxzIjogInh0ZW5zYV9oaWZpXzMiLAogICAgIH0sCiApCiAKIGNvbmZpZ19zZXR0aW5nKAogICAgIG5hbWUgPSAieHRlbnNhX2hpZmlfM3pfZGVmYXVsdCIsCi0gICAgdmFsdWVzID0gewotICAgICAgICAiY3B1IjogIkhJRklfMTkwMzA0X3N3dXBncmFkZSIsCisgICAgZmxhZ192YWx1ZXMgPSB7CisgICAgICAgICI6b3B0aW1pemVkX2tlcm5lbHMiOiAieHRlbnNhX2hpZmlfM3oiLAogICAgIH0sCiApCiAKIGNvbmZpZ19zZXR0aW5nKAogICAgIG5hbWUgPSAieHRlbnNhX2hpZmlfNV9kZWZhdWx0IiwKLSAgICB2YWx1ZXMgPSB7Ci0gICAgICAgICJjcHUiOiAiQUVfSGlGaTVfTEU1X0FPX0ZQX1hDIiwKKyAgICBmbGFnX3ZhbHVlcyA9IHsKKyAgICAgICAgIjpvcHRpbWl6ZWRfa2VybmVscyI6ICJ4dGVuc2FfaGlmaV81IiwKICAgICB9LAogKQogCiBjb25maWdfc2V0dGluZygKICAgICBuYW1lID0gInh0ZW5zYV92aXNpb25fcDZfZGVmYXVsdCIsCi0gICAgdmFsdWVzID0gewotICAgICAgICAiY3B1IjogIlA2XzIwMDUyOCIsCisgICAgZmxhZ192YWx1ZXMgPSB7CisgICAgICAgICI6b3B0aW1pemVkX2tlcm5lbHMiOiAieHRlbnNhX3Zpc2lvbl9wNiIsCiAgICAgfSwKICkKIApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvTWFrZWZpbGUuaW5jIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvTWFrZWZpbGUuaW5jCmluZGV4IDM4NGZjYjMuLjBiZDg0NmIgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL01ha2VmaWxlLmluYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9NYWtlZmlsZS5pbmMKQEAgLTEsNCArMSw0IEBACi0jIENvcHlyaWdodCAyMDIxIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC05Miw2ICs5MiwxMSBAQAogICAkKFRFTlNPUkZMT1dfUk9PVClzaWduYWwvbWljcm8va2VybmVscy9vdmVybGFwX2FkZF9mbGV4YnVmZmVyc19nZW5lcmF0ZWRfZGF0YS5jYywgXAogICAkKFRFTlNPUkZMT1dfUk9PVClzaWduYWwvbWljcm8va2VybmVscy9vdmVybGFwX2FkZF9mbGV4YnVmZmVyc19nZW5lcmF0ZWRfZGF0YS5oKSkKIAorJChldmFsICQoY2FsbCBtaWNyb2xpdGVfdGVzdCxrZXJuZWxfc2lnbmFsX3BjYW5fdGVzdCxcCisgICQoVEVOU09SRkxPV19ST09UKXNpZ25hbC9taWNyby9rZXJuZWxzL3BjYW5fdGVzdC5jYyBcCisgICQoVEVOU09SRkxPV19ST09UKXNpZ25hbC9taWNyby9rZXJuZWxzL3BjYW5fZmxleGJ1ZmZlcnNfZ2VuZXJhdGVkX2RhdGEuY2MsIFwKKyAgJChURU5TT1JGTE9XX1JPT1Qpc2lnbmFsL21pY3JvL2tlcm5lbHMvcGNhbl9mbGV4YnVmZmVyc19nZW5lcmF0ZWRfZGF0YS5oKSkKKwogJChldmFsICQoY2FsbCBtaWNyb2xpdGVfdGVzdCxrZXJuZWxfc2lnbmFsX3N0YWNrZXJfdGVzdCxcCiAgICQoVEVOU09SRkxPV19ST09UKXNpZ25hbC9taWNyby9rZXJuZWxzL3N0YWNrZXJfdGVzdC5jYyBcCiAgICQoVEVOU09SRkxPV19ST09UKXNpZ25hbC9taWNyby9rZXJuZWxzL3N0YWNrZXJfZmxleGJ1ZmZlcnNfZ2VuZXJhdGVkX2RhdGEuY2MsIFwKQEAgLTEwOSw2ICsxMTQsNyBAQAogJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvYWRkX3Rlc3QuY2MgXAogJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvYWRkX25fdGVzdC5jYyBcCiAkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9hcmdfbWluX21heF90ZXN0LmNjIFwKKyQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2JhdGNoX21hdG11bF90ZXN0LmNjIFwKICQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2JhdGNoX3RvX3NwYWNlX25kX3Rlc3QuY2MgXAogJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvYnJvYWRjYXN0X2FyZ3NfdGVzdC5jYyBcCiAkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9icm9hZGNhc3RfdG9fdGVzdC5jYyBcCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9hZGQuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9hZGQuY2MKaW5kZXggYjI3MjA2Yy4uZmRlMDQ3YSAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvYWRkLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2FkZC5jYwpAQCAtMzgsNyArMzgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXQyLCBUZkxpdGVFdmFsVGVuc29yKiBvdXRwdXQpIHsKICAgc3dpdGNoIChvdXRwdXQtPnR5cGUpIHsKICAgICBjYXNlIGtUZkxpdGVGbG9hdDMyOiB7Ci0gICAgICB0ZmxpdGU6OkFyaXRobWV0aWNQYXJhbXMgb3BfcGFyYW1zOworICAgICAgdGZsaXRlOjpBcml0aG1ldGljUGFyYW1zIG9wX3BhcmFtcyA9IHt9OwogICAgICAgU2V0QWN0aXZhdGlvblBhcmFtcyhkYXRhLT5vdXRwdXRfYWN0aXZhdGlvbl9taW5fZjMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5vdXRwdXRfYWN0aXZhdGlvbl9tYXhfZjMyLCAmb3BfcGFyYW1zKTsKICAgICAgIGlmIChkYXRhLT5yZXF1aXJlc19icm9hZGNhc3QpIHsKQEAgLTU5LDcgKzU5LDcgQEAKICAgICAgIH0KICAgICB9IGJyZWFrOwogICAgIGNhc2Uga1RmTGl0ZUludDMyOiB7Ci0gICAgICB0ZmxpdGU6OkFyaXRobWV0aWNQYXJhbXMgb3BfcGFyYW1zOworICAgICAgdGZsaXRlOjpBcml0aG1ldGljUGFyYW1zIG9wX3BhcmFtcyA9IHt9OwogICAgICAgU2V0QWN0aXZhdGlvblBhcmFtcyhzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyX3Q+Ojpsb3dlc3QoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMl90Pjo6bWF4KCksICZvcF9wYXJhbXMpOwogICAgICAgaWYgKGRhdGEtPnJlcXVpcmVzX2Jyb2FkY2FzdCkgewpAQCAtOTMsNyArOTMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXQxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXQyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGZMaXRlRXZhbFRlbnNvciogb3V0cHV0KSB7Ci0gIHRmbGl0ZTo6QXJpdGhtZXRpY1BhcmFtcyBvcF9wYXJhbXM7CisgIHRmbGl0ZTo6QXJpdGhtZXRpY1BhcmFtcyBvcF9wYXJhbXMgPSB7fTsKICAgb3BfcGFyYW1zLmxlZnRfc2hpZnQgPSBkYXRhLT5sZWZ0X3NoaWZ0OwogICBvcF9wYXJhbXMuaW5wdXQxX29mZnNldCA9IGRhdGEtPmlucHV0MV9vZmZzZXQ7CiAgIG9wX3BhcmFtcy5pbnB1dDFfbXVsdGlwbGllciA9IGRhdGEtPmlucHV0MV9tdWx0aXBsaWVyOwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvYmF0Y2hfbWF0bXVsLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvYmF0Y2hfbWF0bXVsLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNjIxZjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9iYXRjaF9tYXRtdWwuY2MKQEAgLTAsMCArMSw1NTggQEAKKy8qIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvcmVmZXJlbmNlL2JhdGNoX21hdG11bC5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bGltaXRzPgorCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2NvcmUvYy9jb21tb24uaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9xdWFudGl6YXRpb25fdXRpbC5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3JlZmVyZW5jZS90cmFuc3Bvc2UuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC90ZW5zb3JfY3R5cGVzLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvdHlwZXMuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9rZXJuZWxfdXRpbC5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2tlcm5lbF91dGlsLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2xvZy5oIgorCituYW1lc3BhY2UgdGZsaXRlIHsKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciBpbnQga0lucHV0TGhzVGVuc29yID0gMDsKK2NvbnN0ZXhwciBpbnQga0lucHV0UmhzVGVuc29yID0gMTsKK2NvbnN0ZXhwciBpbnQga091dHB1dFRlbnNvciA9IDA7CisKK3N0cnVjdCBRdWFudGl6YXRpb25PcERhdGEgeworICAvLyBUaGUgc2NhbGluZyBmYWN0b3IgZnJvbSBpbnB1dCB0byBvdXRwdXQgKGFrYSB0aGUgJ3JlYWwgbXVsdGlwbGllcicpIGNhbgorICAvLyBiZSByZXByZXNlbnRlZCBhcyBhIGZpeGVkIHBvaW50IG11bHRpcGxpZXIgcGx1cyBhIGxlZnQgc2hpZnQuCisgIGludDMyX3Qgb3V0cHV0X211bHRpcGxpZXI7CisgIGludCBvdXRwdXRfc2hpZnQ7ICAvLyBleHBvbmVudAorCisgIC8vIFRoZSByYW5nZSBvZiB0aGUgZnVzZWQgYWN0aXZhdGlvbiBsYXllci4gRm9yIGV4YW1wbGUgZm9yIGtOb25lIGFuZAorICAvLyBpbnQ4X3QgdGhlc2Ugd291bGQgYmUgLTEyOCBhbmQgMTI3LgorICBpbnQzMl90IG91dHB1dF9hY3RpdmF0aW9uX21pbjsKKyAgaW50MzJfdCBvdXRwdXRfYWN0aXZhdGlvbl9tYXg7CisKKyAgaW50MzJfdCBsaHNfemVyb19wb2ludDsKKyAgaW50MzJfdCByaHNfemVyb19wb2ludDsKKyAgaW50MzJfdCBvdXRwdXRfemVyb19wb2ludDsKK307CisKK3N0cnVjdCBPcERhdGEgeworICBRdWFudGl6YXRpb25PcERhdGEqIHF1YW50aXphdGlvbjsKKworICAvLyBUcmFuc3Bvc2UgdGVuc29ycyBhbmQgc3RhdGUKKyAgVGZMaXRlRXZhbFRlbnNvciogbGhzX3RyYW5zcG9zZWRfdGVuc29yOworICBUZkxpdGVFdmFsVGVuc29yKiByaHNfdHJhbnNwb3NlZF90ZW5zb3I7CisgIGJvb2wgcmhzX2lzX3RyYW5zcG9zZWQ7CisgIGJvb2wgbGhzX2lzX2NvbnN0YW50X3RlbnNvcjsKKyAgYm9vbCByaHNfaXNfY29uc3RhbnRfdGVuc29yOworfTsKKworc3RydWN0IE9wQ29udGV4dCB7CisgIE9wQ29udGV4dChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKQorICAgICAgOiBwYXJhbXMoc3RhdGljX2Nhc3Q8VGZMaXRlQmF0Y2hNYXRNdWxQYXJhbXMqPihub2RlLT5idWlsdGluX2RhdGEpKSwKKyAgICAgICAgb3BfZGF0YShzdGF0aWNfY2FzdDxPcERhdGEqPihub2RlLT51c2VyX2RhdGEpKSB7fQorCisgIFRmTGl0ZUJhdGNoTWF0TXVsUGFyYW1zKiBwYXJhbXM7CisgIE9wRGF0YSogb3BfZGF0YTsKK307CisKK3N0cnVjdCBQcmVwYXJlT3BDb250ZXh0IDogT3BDb250ZXh0IHsKKyAgUHJlcGFyZU9wQ29udGV4dChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKQorICAgICAgOiBPcENvbnRleHQoY29udGV4dCwgbm9kZSksCisgICAgICAgIG1pY3JvX2NvbnRleHRfKEdldE1pY3JvQ29udGV4dChjb250ZXh0KSksCisgICAgICAgIGxocyhtaWNyb19jb250ZXh0Xy0+QWxsb2NhdGVUZW1wSW5wdXRUZW5zb3Iobm9kZSwga0lucHV0TGhzVGVuc29yKSksCisgICAgICAgIHJocyhtaWNyb19jb250ZXh0Xy0+QWxsb2NhdGVUZW1wSW5wdXRUZW5zb3Iobm9kZSwga0lucHV0UmhzVGVuc29yKSksCisgICAgICAgIG91dHB1dChtaWNyb19jb250ZXh0Xy0+QWxsb2NhdGVUZW1wT3V0cHV0VGVuc29yKG5vZGUsIGtPdXRwdXRUZW5zb3IpKSB7fQorCisgIH5QcmVwYXJlT3BDb250ZXh0KCkgeworICAgIGlmIChsaHMgIT0gbnVsbHB0cikgeworICAgICAgbWljcm9fY29udGV4dF8tPkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKGxocyk7CisgICAgfQorICAgIGlmIChyaHMgIT0gbnVsbHB0cikgeworICAgICAgbWljcm9fY29udGV4dF8tPkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKHJocyk7CisgICAgfQorICAgIGlmIChvdXRwdXQgIT0gbnVsbHB0cikgeworICAgICAgbWljcm9fY29udGV4dF8tPkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKG91dHB1dCk7CisgICAgfQorICB9CisKKyBwcml2YXRlOgorICBNaWNyb0NvbnRleHQqIG1pY3JvX2NvbnRleHRfOworCisgcHVibGljOgorICBUZkxpdGVUZW5zb3IqIGxoczsKKyAgVGZMaXRlVGVuc29yKiByaHM7CisgIFRmTGl0ZVRlbnNvciogb3V0cHV0OworfTsKKworc3RydWN0IEV2YWxPcENvbnRleHQgOiBPcENvbnRleHQgeworICBFdmFsT3BDb250ZXh0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpCisgICAgICA6IE9wQ29udGV4dChjb250ZXh0LCBub2RlKSwKKyAgICAgICAgbGhzKHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dChjb250ZXh0LCBub2RlLCBrSW5wdXRMaHNUZW5zb3IpKSwKKyAgICAgICAgcmhzKHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dChjb250ZXh0LCBub2RlLCBrSW5wdXRSaHNUZW5zb3IpKSwKKyAgICAgICAgb3V0cHV0KHRmbGl0ZTo6bWljcm86OkdldEV2YWxPdXRwdXQoY29udGV4dCwgbm9kZSwga091dHB1dFRlbnNvcikpIHt9CisKKyAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogbGhzOworICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiByaHM7CisgIFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dDsKK307CisKK1RmTGl0ZVN0YXR1cyBSZXNoYXBlT3V0cHV0VGVuc29yKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSdW50aW1lU2hhcGUmIGV4dGVuZGVkX2xoc19zaGFwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgZXh0ZW5kZWRfcmhzX3NoYXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhZGpfeCwgYm9vbCBhZGpfeSwgaW50IG91dHB1dF9yYW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGZMaXRlVGVuc29yKiBvdXRwdXQpIHsKKyAgaW50NjRfdCBvcmlnX3NpemUgPSBOdW1FbGVtZW50cyhvdXRwdXQpOworCisgIC8vIG1ha2Ugc3VyZSB0aGUgbmV3IG91dHB1dCBkaW1zIHJhbmsgZG9lcyBub3QgZXhjZWVkIHRoZSBvcmlnaW5hbCByYW5rCisgIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIG91dHB1dF9yYW5rIDw9IE51bURpbWVuc2lvbnMob3V0cHV0KSk7CisKKyAgLy8gbWFrZSBzdXJlIG91dHB1dCB0ZW5zb3IgZGltcyBhcmUgbm90IGluIHRoZSBGbGF0QnVmZmVyCisgIFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dF9ldmFsID0KKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldEV2YWxPdXRwdXQoY29udGV4dCwgbm9kZSwga091dHB1dFRlbnNvcik7CisgIFRGX0xJVEVfRU5TVVJFX09LKGNvbnRleHQsIHRmbGl0ZTo6bWljcm86OkNyZWF0ZVdyaXRhYmxlVGVuc29yRGltc1dpdGhDb3B5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCwgb3V0cHV0LCBvdXRwdXRfZXZhbCkpOworCisgIC8vIEZpbGwgaW4gYW55IGJyb2FkY2FzdCBkaW1lbnNpb25zLgorICBmb3IgKGludCBpID0gMDsgaSA8IG91dHB1dF9yYW5rIC0gMjsgKytpKSB7CisgICAgY29uc3QgaW50IGxoc19kaW0gPSBleHRlbmRlZF9saHNfc2hhcGUuRGltcyhpKTsKKyAgICBjb25zdCBpbnQgcmhzX2RpbSA9IGV4dGVuZGVkX3Joc19zaGFwZS5EaW1zKGkpOworICAgIGludCBicm9hZGNhc3RfZGltID0gbGhzX2RpbTsKKyAgICBpZiAoKGxoc19kaW0gIT0gcmhzX2RpbSkgJiYgKGxoc19kaW0gPT0gMSkpIHsKKyAgICAgIGJyb2FkY2FzdF9kaW0gPSByaHNfZGltOworICAgIH0KKyAgICBvdXRwdXQtPmRpbXMtPmRhdGFbaV0gPSBicm9hZGNhc3RfZGltOworICB9CisgIC8vIEZpbGwgaW4gdGhlIG1hdG11bCBkaW1lbnNpb25zLgorICBpbnQgbGhzX3Jvd3NfaW5kZXggPSBhZGpfeCA/IG91dHB1dF9yYW5rIC0gMSA6IG91dHB1dF9yYW5rIC0gMjsKKyAgaW50IHJoc19jb2xzX2luZGV4ID0gYWRqX3kgPyBvdXRwdXRfcmFuayAtIDIgOiBvdXRwdXRfcmFuayAtIDE7CisKKyAgb3V0cHV0LT5kaW1zLT5kYXRhW291dHB1dF9yYW5rIC0gMl0gPSBleHRlbmRlZF9saHNfc2hhcGUuRGltcyhsaHNfcm93c19pbmRleCk7CisgIG91dHB1dC0+ZGltcy0+ZGF0YVtvdXRwdXRfcmFuayAtIDFdID0gZXh0ZW5kZWRfcmhzX3NoYXBlLkRpbXMocmhzX2NvbHNfaW5kZXgpOworICBvdXRwdXQtPmRpbXMtPnNpemUgPSBvdXRwdXRfcmFuazsKKworICAvLyBDaGVjayB0aGF0IG91dHB1dCB0ZW5zb3IgaGFzIG5vdCBiZWVuIHJlc2l6ZWQKKyAgLy8gc2luY2UgVEZMTSBkb2Vzbid0IHN1cHBvcnQgdGVuc29yIHJlc2l6aW5nLgorICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBvcmlnX3NpemUsIE51bUVsZW1lbnRzKG91dHB1dCkpOworCisgIHJldHVybiBrVGZMaXRlT2s7Cit9CisKK1RmTGl0ZUV2YWxUZW5zb3IqIEFsbG9jSW5pdFRyYW5zcG9zZVRlbnNvckZyb21UZkxpdGVUZW5zb3IoCisgICAgVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgVGZMaXRlVGVuc29yJiB0ZW5zb3IpIHsKKyAgTWljcm9Db250ZXh0KiBtaWNyb19jb250ZXh0ID0gR2V0TWljcm9Db250ZXh0KGNvbnRleHQpOworICBUZkxpdGVFdmFsVGVuc29yKiBldmFsX3RlbnNvciA9IHN0YXRpY19jYXN0PFRmTGl0ZUV2YWxUZW5zb3IqPigKKyAgICAgIG1pY3JvX2NvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlcihzaXplb2YoVGZMaXRlRXZhbFRlbnNvcikpKTsKKyAgaWYgKGV2YWxfdGVuc29yID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIGV2YWxfdGVuc29yLT50eXBlID0gdGVuc29yLnR5cGU7CisKKyAgY29uc3QgaW50IHRlbnNvcl9yYW5rID0gTnVtRGltZW5zaW9ucygmdGVuc29yKTsKKyAgY29uc3Qgc2l6ZV90IGV2YWxfZGltc19zaXplID0gVGZMaXRlSW50QXJyYXlHZXRTaXplSW5CeXRlcyh0ZW5zb3JfcmFuayk7CisgIGV2YWxfdGVuc29yLT5kaW1zID0gc3RhdGljX2Nhc3Q8VGZMaXRlSW50QXJyYXkqPigKKyAgICAgIG1pY3JvX2NvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlcihldmFsX2RpbXNfc2l6ZSkpOworICBpZiAoZXZhbF90ZW5zb3ItPmRpbXMgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIGV2YWxfdGVuc29yLT5kaW1zLT5zaXplID0gdGVuc29yX3Jhbms7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVuc29yX3JhbmsgLSAyOyArK2kpIHsKKyAgICBldmFsX3RlbnNvci0+ZGltcy0+ZGF0YVtpXSA9IHRlbnNvci5kaW1zLT5kYXRhW2ldOworICB9CisgIC8vIFN3YXAgbGFzdCB0d28gZGltZW5zaW9ucy4KKyAgZXZhbF90ZW5zb3ItPmRpbXMtPmRhdGFbdGVuc29yX3JhbmsgLSAyXSA9IHRlbnNvci5kaW1zLT5kYXRhW3RlbnNvcl9yYW5rIC0gMV07CisgIGV2YWxfdGVuc29yLT5kaW1zLT5kYXRhW3RlbnNvcl9yYW5rIC0gMV0gPSB0ZW5zb3IuZGltcy0+ZGF0YVt0ZW5zb3JfcmFuayAtIDJdOworCisgIGNvbnN0IHNpemVfdCBldmFsX2RhdGFfc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oTnVtRWxlbWVudHMoJnRlbnNvcikpICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGZMaXRlVHlwZUdldFNpemUodGVuc29yLnR5cGUpOworICBldmFsX3RlbnNvci0+ZGF0YS5kYXRhID0KKyAgICAgIG1pY3JvX2NvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlcihldmFsX2RhdGFfc2l6ZSk7CisgIGlmIChldmFsX3RlbnNvci0+ZGF0YS5kYXRhID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIHJldHVybiBldmFsX3RlbnNvcjsKK30KKworLy8gSW5pdGlhbGl6ZXMgdGVuc29ycyB0byBzdG9yZSB0cmFuc3Bvc2VkIG9wZXJhbmRzLgorLy8gQWxsb2NhdGUgc3RvcmFnZSBmb3IgaHlicmlkIHF1YW50aXphdGlvbiBpZiBuZWVkZWQuCisvLyBBbGxvY2F0ZSBub3JtYWwgcXVhbnRpemF0aW9uIGRhdGEgaWYgbmVlZGVkLgorVGZMaXRlU3RhdHVzIEluaXRpYWxpemVUZW1wb3JhcmllcyhUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmVwYXJlT3BDb250ZXh0JiBvcF9jb250ZXh0KSB7CisgIE9wRGF0YSogb3BfZGF0YSA9IG9wX2NvbnRleHQub3BfZGF0YTsKKyAgY29uc3QgVGZMaXRlVGVuc29yKiBsaHMgPSBvcF9jb250ZXh0LmxoczsKKyAgY29uc3QgVGZMaXRlVGVuc29yKiByaHMgPSBvcF9jb250ZXh0LnJoczsKKyAgTWljcm9Db250ZXh0KiBtaWNyb19jb250ZXh0ID0gR2V0TWljcm9Db250ZXh0KGNvbnRleHQpOworCisgIG9wX2RhdGEtPnF1YW50aXphdGlvbiA9IG51bGxwdHI7CisgIG9wX2RhdGEtPmxoc190cmFuc3Bvc2VkX3RlbnNvciA9IG51bGxwdHI7CisgIG9wX2RhdGEtPnJoc190cmFuc3Bvc2VkX3RlbnNvciA9IG51bGxwdHI7CisKKyAgaWYgKGxocy0+dHlwZSA9PSBrVGZMaXRlSW50OCB8fCBsaHMtPnR5cGUgPT0ga1RmTGl0ZUludDE2KSB7CisgICAgb3BfZGF0YS0+cXVhbnRpemF0aW9uID0gc3RhdGljX2Nhc3Q8ZGVjbHR5cGUob3BfZGF0YS0+cXVhbnRpemF0aW9uKT4oCisgICAgICAgIG1pY3JvX2NvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlcigKKyAgICAgICAgICAgIHNpemVvZigqb3BfZGF0YS0+cXVhbnRpemF0aW9uKSkpOworICAgIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIG9wX2RhdGEtPnF1YW50aXphdGlvbiAhPSBudWxscHRyKTsKKyAgfQorCisgIC8vIHRlbnNvciBmb3IgVHJhbnNwb3NlZCBMSFM7CisgIGlmIChvcF9jb250ZXh0LnBhcmFtcy0+YWRqX3gpIHsKKyAgICBvcF9kYXRhLT5saHNfdHJhbnNwb3NlZF90ZW5zb3IgPQorICAgICAgICBBbGxvY0luaXRUcmFuc3Bvc2VUZW5zb3JGcm9tVGZMaXRlVGVuc29yKGNvbnRleHQsICpsaHMpOworICAgIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIG9wX2RhdGEtPmxoc190cmFuc3Bvc2VkX3RlbnNvciAhPSBudWxscHRyKTsKKyAgfQorCisgIC8vIFdlIG5lZWQgYSBidWZmZXIgZm9yIHRoZSBSSFMgaWYgd2UgbmVlZCB0byB0cmFuc3Bvc2UgdGhlIFJIUy4gV2UKKyAgLy8gdHJhbnNwb3NlIGJ5IGRlZmF1bHQsIHNvIHRoYXQgdGhlIHR3byBpbnB1dHMgKExIUyBhbmQgUkhTKSBhcmUgaW4gYSBwcm9wZXIKKyAgLy8gbGF5b3V0IGZvciBvdXIgZmFzdCBtYXRyaXggbXVsdGlwbGljYXRpb24gcm91dGluZXMuIElmIHRoZSB0cmFuc3Bvc2UgZmxhZworICAvLyBpcyBzZXQgYnkgdGhlIGNhbGxlciwgdGhlIGRhdGEgaXMgYWxyZWFkeSBpbiB0aGUgZGVzaXJlZCBsYXlvdXQuCisgIGlmICghb3BfY29udGV4dC5wYXJhbXMtPmFkal95KSB7CisgICAgb3BfZGF0YS0+cmhzX3RyYW5zcG9zZWRfdGVuc29yID0KKyAgICAgICAgQWxsb2NJbml0VHJhbnNwb3NlVGVuc29yRnJvbVRmTGl0ZVRlbnNvcihjb250ZXh0LCAqcmhzKTsKKyAgICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCBvcF9kYXRhLT5yaHNfdHJhbnNwb3NlZF90ZW5zb3IgIT0gbnVsbHB0cik7CisgIH0KKworICByZXR1cm4ga1RmTGl0ZU9rOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyPgordm9pZCBUcmFuc3Bvc2VSb3dzQ29sdW1uc0ltcGwoY29uc3QgVGZMaXRlRXZhbFRlbnNvciYgdGVuc29yX2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGZMaXRlRXZhbFRlbnNvciogdGVuc29yX291dCkgeworICBjb25zdCBTY2FsYXIqIGlucHV0ID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxTY2FsYXI+KCZ0ZW5zb3JfaW4pOworICBTY2FsYXIqIG91dHB1dCA9IHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8U2NhbGFyPih0ZW5zb3Jfb3V0KTsKKyAgUnVudGltZVNoYXBlIHRyYW5zcG9zZWRfc2hhcGUodGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoJnRlbnNvcl9pbikpOworICBSdW50aW1lU2hhcGUgc2hhcGUodHJhbnNwb3NlZF9zaGFwZSk7CisgIFRyYW5zcG9zZVBhcmFtcyBwYXJhbXM7CisgIGNvbnN0IGludCByYW5rID0gc2hhcGUuRGltZW5zaW9uc0NvdW50KCk7CisgIHBhcmFtcy5wZXJtX2NvdW50ID0gcmFuazsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCByYW5rIC0gMjsgKytpKSB7CisgICAgcGFyYW1zLnBlcm1baV0gPSBpOworICB9CisgIC8vIFRyYW5zcG9zZSB0aGUgbGFzdCB0d28gZGltZW5zaW9ucy4KKyAgcGFyYW1zLnBlcm1bcmFuayAtIDJdID0gcmFuayAtIDE7CisgIHBhcmFtcy5wZXJtW3JhbmsgLSAxXSA9IHJhbmsgLSAyOworICB0cmFuc3Bvc2VkX3NoYXBlLlNldERpbShyYW5rIC0gMSwgc2hhcGUuRGltcyhyYW5rIC0gMikpOworICB0cmFuc3Bvc2VkX3NoYXBlLlNldERpbShyYW5rIC0gMiwgc2hhcGUuRGltcyhyYW5rIC0gMSkpOworICByZWZlcmVuY2Vfb3BzOjpUcmFuc3Bvc2UocGFyYW1zLCBzaGFwZSwgaW5wdXQsIHRyYW5zcG9zZWRfc2hhcGUsIG91dHB1dCk7Cit9CisKK1RmTGl0ZVN0YXR1cyBUcmFuc3Bvc2VSb3dzQ29sdW1ucyhjb25zdCBUZkxpdGVFdmFsVGVuc29yJiB0ZW5zb3JfaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGZMaXRlRXZhbFRlbnNvciogdGVuc29yX291dCkgeworICBpZiAodGVuc29yX2luLnR5cGUgPT0ga1RmTGl0ZUZsb2F0MzIpIHsKKyAgICBUcmFuc3Bvc2VSb3dzQ29sdW1uc0ltcGw8ZmxvYXQ+KHRlbnNvcl9pbiwgdGVuc29yX291dCk7CisgICAgcmV0dXJuIGtUZkxpdGVPazsKKyAgfSBlbHNlIGlmICh0ZW5zb3JfaW4udHlwZSA9PSBrVGZMaXRlSW50OCkgeworICAgIFRyYW5zcG9zZVJvd3NDb2x1bW5zSW1wbDxpbnQ4X3Q+KHRlbnNvcl9pbiwgdGVuc29yX291dCk7CisgICAgcmV0dXJuIGtUZkxpdGVPazsKKyAgfSBlbHNlIGlmICh0ZW5zb3JfaW4udHlwZSA9PSBrVGZMaXRlSW50MTYpIHsKKyAgICBUcmFuc3Bvc2VSb3dzQ29sdW1uc0ltcGw8aW50MTZfdD4odGVuc29yX2luLCB0ZW5zb3Jfb3V0KTsKKyAgICByZXR1cm4ga1RmTGl0ZU9rOworICB9IGVsc2UgeworICAgIE1pY3JvUHJpbnRmKAorICAgICAgICAiQkFUQ0hfTUFUTVVMIGNhbiBvbmx5IHRyYW5zcG9zZSB0ZW5zb3JzIHdpdGggRkxPQVQzMiwgSU5UOCwgSU5UMTYgIgorICAgICAgICAidHlwZS4iKTsKKyAgfQorICByZXR1cm4ga1RmTGl0ZUVycm9yOworfQorCitSdW50aW1lU2hhcGUgU3dhcFJvd0NvbHVtbkRpbXMoY29uc3QgUnVudGltZVNoYXBlJiBzaGFwZSkgeworICBSdW50aW1lU2hhcGUgc3dhcHBlZF9zaGFwZShzaGFwZSk7CisgIGNvbnN0IGludDMyX3QgZGltcyA9IHNoYXBlLkRpbWVuc2lvbnNDb3VudCgpOworICBzd2FwcGVkX3NoYXBlLlNldERpbShkaW1zIC0gMiwgc2hhcGUuRGltcyhkaW1zIC0gMSkpOworICBzd2FwcGVkX3NoYXBlLlNldERpbShkaW1zIC0gMSwgc2hhcGUuRGltcyhkaW1zIC0gMikpOworICByZXR1cm4gc3dhcHBlZF9zaGFwZTsKK30KKwordm9pZCogQmF0Y2hNYXRNdWxJbml0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKSB7CisgIC8vIFRoaXMgaXMgYSBidWlsdGluIG9wLCBzbyB3ZSBkb24ndCB1c2UgdGhlIGNvbnRlbnRzIGluICdidWZmZXInLCBpZiBhbnkuCisgIC8vIEluc3RlYWQsIHdlIGFsbG9jYXRlIGEgbmV3IG9iamVjdCB0byBjYXJyeSBpbmZvcm1hdGlvbiBmcm9tIFByZXBhcmUoKSB0bworICAvLyBFdmFsKCkuCisgIFRGTElURV9EQ0hFQ0soY29udGV4dC0+QWxsb2NhdGVQZXJzaXN0ZW50QnVmZmVyICE9IG51bGxwdHIpOworICBNaWNyb0NvbnRleHQqIG1pY3JvX2NvbnRleHQgPSBHZXRNaWNyb0NvbnRleHQoY29udGV4dCk7CisgIHJldHVybiBtaWNyb19jb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIoc2l6ZW9mKE9wRGF0YSkpOworfQorCitUZkxpdGVTdGF0dXMgQmF0Y2hNYXRNdWxQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKKyAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgTnVtSW5wdXRzKG5vZGUpLCAyKTsKKyAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgTnVtT3V0cHV0cyhub2RlKSwgMSk7CisKKyAgUHJlcGFyZU9wQ29udGV4dCBvcF9jb250ZXh0KGNvbnRleHQsIG5vZGUpOworICBjb25zdCBUZkxpdGVUZW5zb3IqIGxoc19kYXRhID0gb3BfY29udGV4dC5saHM7CisgIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIGxoc19kYXRhICE9IG51bGxwdHIpOworICBjb25zdCBUZkxpdGVUZW5zb3IqIHJoc19kYXRhID0gb3BfY29udGV4dC5yaHM7CisgIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIHJoc19kYXRhICE9IG51bGxwdHIpOworICBUZkxpdGVUZW5zb3IqIG91dHB1dCA9IG9wX2NvbnRleHQub3V0cHV0OworICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCBvdXRwdXQgIT0gbnVsbHB0cik7CisKKyAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgbGhzX2RhdGEtPnR5cGUgPT0ga1RmTGl0ZUZsb2F0MzIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxoc19kYXRhLT50eXBlID09IGtUZkxpdGVJbnQ4IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaHNfZGF0YS0+dHlwZSA9PSBrVGZMaXRlSW50MTYpOworICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCByaHNfZGF0YS0+dHlwZSA9PSBrVGZMaXRlRmxvYXQzMiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmhzX2RhdGEtPnR5cGUgPT0ga1RmTGl0ZUludDggfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJoc19kYXRhLT50eXBlID09IGtUZkxpdGVJbnQxNik7CisgIC8vIEJvdGggaW5wdXRzIHNob3VsZCBiZSBvZiB0aGUgc2FtZSB0eXBlLgorICAvLyBIeWJyaWQgaW5wdXQgKEZMT0FUMzIgTEhTLCBJTlQ4IFJIUykgaXMgbm90IHN1cHBvcnRlZC4KKyAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgbGhzX2RhdGEtPnR5cGUgPT0gcmhzX2RhdGEtPnR5cGUpOworICAvLyBMSFMgaW5wdXQgbXVzdCBtYXRjaCBvdXRwdXQgdHlwZS4gIElOVDMyIG91dHB1dCBub3Qgc3VwcG9ydGVkLgorICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCBsaHNfZGF0YS0+dHlwZSA9PSBvdXRwdXQtPnR5cGUpOworCisgIGNvbnN0IGludCBsaHNfcmFuayA9IE51bURpbWVuc2lvbnMobGhzX2RhdGEpOworICBjb25zdCBpbnQgcmhzX3JhbmsgPSBOdW1EaW1lbnNpb25zKHJoc19kYXRhKTsKKyAgLy8gU3VwcG9ydCBkaW1lbnNpb25zIGJldHdlZW4gMiBhbmQgNSwgaW5jbHVzaXZlLgorICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCBsaHNfcmFuayA+PSAyKTsKKyAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgbGhzX3JhbmsgPD0gNSk7CisgIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIHJoc19yYW5rID49IDIpOworICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCByaHNfcmFuayA8PSA1KTsKKworICBURl9MSVRFX0VOU1VSRV9PSyhjb250ZXh0LCBJbml0aWFsaXplVGVtcG9yYXJpZXMoY29udGV4dCwgbm9kZSwgb3BfY29udGV4dCkpOworCisgIE9wRGF0YSogb3BfZGF0YSA9IG9wX2NvbnRleHQub3BfZGF0YTsKKyAgLy8gSWYgdGhlIFJIUyBpcyBjb25zdGFudCwgd2Ugb25seSB0cmFuc3Bvc2Ugb25jZS4KKyAgb3BfZGF0YS0+cmhzX2lzX3RyYW5zcG9zZWQgPSBmYWxzZTsKKyAgb3BfZGF0YS0+bGhzX2lzX2NvbnN0YW50X3RlbnNvciA9IElzQ29uc3RhbnRUZW5zb3IobGhzX2RhdGEpOworICBvcF9kYXRhLT5yaHNfaXNfY29uc3RhbnRfdGVuc29yID0gSXNDb25zdGFudFRlbnNvcihyaHNfZGF0YSk7CisKKyAgLy8gTm90ZSB0aGF0IHF1YW50aXplZCBpbmZlcmVuY2UgcmVxdWlyZXMgdGhhdCBhbGwgdGVuc29ycyBoYXZlIHRoZWlyCisgIC8vIHBhcmFtZXRlcnMgc2V0LiBUaGlzIGlzIHVzdWFsbHkgZG9uZSBkdXJpbmcgcXVhbnRpemVkIHRyYWluaW5nLgorICBpZiAobGhzX2RhdGEtPnR5cGUgPT0ga1RmTGl0ZUludDggfHwgbGhzX2RhdGEtPnR5cGUgPT0ga1RmTGl0ZUludDE2KSB7CisgICAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgb3BfZGF0YS0+cXVhbnRpemF0aW9uICE9IG51bGxwdHIpOworICAgIGRvdWJsZSByZWFsX211bHRpcGxpZXIgPSAwLjA7CisgICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKEdldFF1YW50aXplZENvbnZvbHV0aW9uTXVsdGlwbGVyKAorICAgICAgICBjb250ZXh0LCBsaHNfZGF0YSwgcmhzX2RhdGEsIG91dHB1dCwgJnJlYWxfbXVsdGlwbGllcikpOworICAgIFF1YW50aXplTXVsdGlwbGllcihyZWFsX211bHRpcGxpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICZvcF9kYXRhLT5xdWFudGl6YXRpb24tPm91dHB1dF9tdWx0aXBsaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAmb3BfZGF0YS0+cXVhbnRpemF0aW9uLT5vdXRwdXRfc2hpZnQpOworICAgIC8vIEJhdGNoTWF0TXVsIGhhcyBubyBmdXNlZCBhY3RpdmF0aW9uIGZ1bmN0aW9ucy4gVGhlcmVmb3JlLCBzZXQKKyAgICAvLyBvdXRwdXQgYWN0aXZhdGlvbiBtaW4gYW5kIG1heCB0byBtaW4gYW5kIG1heCBvZiBpbnQ4X3Qgb3IgaW50MTZfdCB0eXBlLgorICAgIGlmIChsaHNfZGF0YS0+dHlwZSA9PSBrVGZMaXRlSW50OCkgeworICAgICAgb3BfZGF0YS0+cXVhbnRpemF0aW9uLT5vdXRwdXRfYWN0aXZhdGlvbl9taW4gPQorICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50OF90Pjo6bWluKCk7CisgICAgICBvcF9kYXRhLT5xdWFudGl6YXRpb24tPm91dHB1dF9hY3RpdmF0aW9uX21heCA9CisgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxpbnQ4X3Q+OjptYXgoKTsKKyAgICB9IGVsc2UgeworICAgICAgb3BfZGF0YS0+cXVhbnRpemF0aW9uLT5vdXRwdXRfYWN0aXZhdGlvbl9taW4gPQorICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MTZfdD46Om1pbigpOworICAgICAgb3BfZGF0YS0+cXVhbnRpemF0aW9uLT5vdXRwdXRfYWN0aXZhdGlvbl9tYXggPQorICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MTZfdD46Om1heCgpOworCisgICAgICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBsaHNfZGF0YS0+cGFyYW1zLnplcm9fcG9pbnQsIDApOworICAgICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgcmhzX2RhdGEtPnBhcmFtcy56ZXJvX3BvaW50LCAwKTsKKyAgICAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIG91dHB1dC0+cGFyYW1zLnplcm9fcG9pbnQsIDApOworICAgIH0KKworICAgIG9wX2RhdGEtPnF1YW50aXphdGlvbi0+bGhzX3plcm9fcG9pbnQgPSBsaHNfZGF0YS0+cGFyYW1zLnplcm9fcG9pbnQ7CisgICAgb3BfZGF0YS0+cXVhbnRpemF0aW9uLT5yaHNfemVyb19wb2ludCA9IHJoc19kYXRhLT5wYXJhbXMuemVyb19wb2ludDsKKyAgICBvcF9kYXRhLT5xdWFudGl6YXRpb24tPm91dHB1dF96ZXJvX3BvaW50ID0gb3V0cHV0LT5wYXJhbXMuemVyb19wb2ludDsKKyAgfQorCisgIGNvbnN0IGludCBvdXRwdXRfcmFuayA9IHN0ZDo6bWF4KGxoc19yYW5rLCByaHNfcmFuayk7CisgIGNvbnN0IFJ1bnRpbWVTaGFwZSBleHRlbmRlZF9saHNfc2hhcGUgPQorICAgICAgUnVudGltZVNoYXBlOjpFeHRlbmRlZFNoYXBlKG91dHB1dF9yYW5rLCBHZXRUZW5zb3JTaGFwZShsaHNfZGF0YSkpOworICBjb25zdCBSdW50aW1lU2hhcGUgZXh0ZW5kZWRfcmhzX3NoYXBlID0KKyAgICAgIFJ1bnRpbWVTaGFwZTo6RXh0ZW5kZWRTaGFwZShvdXRwdXRfcmFuaywgR2V0VGVuc29yU2hhcGUocmhzX2RhdGEpKTsKKworICAvLyBFbnN1cmUgYW55IGJhdGNoIGRpbWVuc2lvbnMgb2JleSBicm9hY2FzdGluZyBydWxlcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBvdXRwdXRfcmFuayAtIDI7ICsraSkgeworICAgIGNvbnN0IGludCBsaHNfZGltID0gZXh0ZW5kZWRfbGhzX3NoYXBlLkRpbXMoaSk7CisgICAgY29uc3QgaW50IHJoc19kaW0gPSBleHRlbmRlZF9yaHNfc2hhcGUuRGltcyhpKTsKKyAgICBpZiAobGhzX2RpbSAhPSByaHNfZGltKSB7CisgICAgICBpZiAobGhzX2RpbSAhPSAxKSB7CisgICAgICAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIHJoc19kaW0sIDEpOworICAgICAgfQorICAgIH0KKyAgfQorICBib29sIGFkal94ID0gb3BfY29udGV4dC5wYXJhbXMtPmFkal94OworICBib29sIGFkal95ID0gb3BfY29udGV4dC5wYXJhbXMtPmFkal95OworICAvLyBFbnN1cmUgb3RoZXIgZGltZW5zaW9ucyB3b3JrIGZvciBtYXRyaXggbXVsdGlwbGljYXRpb24uCisgIGludCBhY2N1bV9kaW1fbGhzID0gYWRqX3ggPyBleHRlbmRlZF9saHNfc2hhcGUuRGltcyhvdXRwdXRfcmFuayAtIDIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBleHRlbmRlZF9saHNfc2hhcGUuRGltcyhvdXRwdXRfcmFuayAtIDEpOworICBpbnQgYWNjdW1fZGltX3JocyA9IGFkal95ID8gZXh0ZW5kZWRfcmhzX3NoYXBlLkRpbXMob3V0cHV0X3JhbmsgLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZXh0ZW5kZWRfcmhzX3NoYXBlLkRpbXMob3V0cHV0X3JhbmsgLSAyKTsKKworICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBhY2N1bV9kaW1fbGhzLCBhY2N1bV9kaW1fcmhzKTsKKyAgVGZMaXRlU3RhdHVzIHN0YXR1cyA9CisgICAgICBSZXNoYXBlT3V0cHV0VGVuc29yKGNvbnRleHQsIG5vZGUsIGV4dGVuZGVkX2xoc19zaGFwZSwgZXh0ZW5kZWRfcmhzX3NoYXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhZGpfeCwgYWRqX3ksIG91dHB1dF9yYW5rLCBvdXRwdXQpOworICByZXR1cm4gc3RhdHVzOworfQorCitUZkxpdGVTdGF0dXMgRXZhbEludDgoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgT3BEYXRhJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgbGhzX3NoYXBlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3ImIGxocywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSdW50aW1lU2hhcGUmIHJoc19zaGFwZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yJiByaHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUnVudGltZVNoYXBlJiBvdXRwdXRfc2hhcGUsCisgICAgICAgICAgICAgICAgICAgICAgVGZMaXRlRXZhbFRlbnNvciogb3V0cHV0KSB7CisgIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIGRhdGEucXVhbnRpemF0aW9uICE9IG51bGxwdHIpOworICAvLyBSZXVzZSBwYXJhbXMgc3RydWN0IGZyb20gRnVsbHlDb25uZWN0ZWQgT3AuCisgIEZ1bGx5Q29ubmVjdGVkUGFyYW1zIG9wX3BhcmFtczsKKyAgb3BfcGFyYW1zLmlucHV0X29mZnNldCA9IC1kYXRhLnF1YW50aXphdGlvbi0+bGhzX3plcm9fcG9pbnQ7CisgIG9wX3BhcmFtcy53ZWlnaHRzX29mZnNldCA9CisgICAgICAtZGF0YS5xdWFudGl6YXRpb24tPnJoc196ZXJvX3BvaW50OyAgLy8gZmlsdGVyIG9mZnNldAorICBvcF9wYXJhbXMub3V0cHV0X29mZnNldCA9IGRhdGEucXVhbnRpemF0aW9uLT5vdXRwdXRfemVyb19wb2ludDsKKyAgb3BfcGFyYW1zLm91dHB1dF9tdWx0aXBsaWVyID0gZGF0YS5xdWFudGl6YXRpb24tPm91dHB1dF9tdWx0aXBsaWVyOworICBvcF9wYXJhbXMub3V0cHV0X3NoaWZ0ID0gZGF0YS5xdWFudGl6YXRpb24tPm91dHB1dF9zaGlmdDsKKyAgb3BfcGFyYW1zLnF1YW50aXplZF9hY3RpdmF0aW9uX21pbiA9IGRhdGEucXVhbnRpemF0aW9uLT5vdXRwdXRfYWN0aXZhdGlvbl9taW47CisgIG9wX3BhcmFtcy5xdWFudGl6ZWRfYWN0aXZhdGlvbl9tYXggPSBkYXRhLnF1YW50aXphdGlvbi0+b3V0cHV0X2FjdGl2YXRpb25fbWF4OworICBvcF9wYXJhbXMubGhzX2NhY2hlYWJsZSA9IGRhdGEubGhzX2lzX2NvbnN0YW50X3RlbnNvcjsKKyAgb3BfcGFyYW1zLnJoc19jYWNoZWFibGUgPSBkYXRhLnJoc19pc19jb25zdGFudF90ZW5zb3I7CisKKyAgLy8gTm90ZSB3ZSBwYXNzIFJIUyBhcmdzIGZpcnN0LCBMSFMgYXJncyBzZWNvbmQuIFNlZSBub3RlIGZvciBFdmFsLgorICByZWZlcmVuY2Vfb3BzOjpCYXRjaE1hdE11bDxpbnQ4X3QsIGludDMyX3Q+KAorICAgICAgb3BfcGFyYW1zLCByaHNfc2hhcGUsIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PigmcmhzKSwKKyAgICAgIGxoc19zaGFwZSwgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KCZsaHMpLCBvdXRwdXRfc2hhcGUsCisgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4ob3V0cHV0KSk7CisKKyAgcmV0dXJuIGtUZkxpdGVPazsKK30KKworVGZMaXRlU3RhdHVzIEV2YWxJbnQxNihUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBPcERhdGEmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgbGhzX3NoYXBlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yJiBsaHMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgcmhzX3NoYXBlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yJiByaHMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgb3V0cHV0X3NoYXBlLAorICAgICAgICAgICAgICAgICAgICAgICBUZkxpdGVFdmFsVGVuc29yKiBvdXRwdXQpIHsKKyAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgZGF0YS5xdWFudGl6YXRpb24gIT0gbnVsbHB0cik7CisgIC8vIFJldXNlIHBhcmFtcyBzdHJ1Y3QgZnJvbSBGdWxseUNvbm5lY3RlZCBPcC4KKyAgRnVsbHlDb25uZWN0ZWRQYXJhbXMgb3BfcGFyYW1zOworICBvcF9wYXJhbXMuaW5wdXRfb2Zmc2V0ID0gLWRhdGEucXVhbnRpemF0aW9uLT5saHNfemVyb19wb2ludDsKKyAgb3BfcGFyYW1zLndlaWdodHNfb2Zmc2V0ID0KKyAgICAgIC1kYXRhLnF1YW50aXphdGlvbi0+cmhzX3plcm9fcG9pbnQ7ICAvLyBmaWx0ZXIgb2Zmc2V0CisgIG9wX3BhcmFtcy5vdXRwdXRfb2Zmc2V0ID0gZGF0YS5xdWFudGl6YXRpb24tPm91dHB1dF96ZXJvX3BvaW50OworICBvcF9wYXJhbXMub3V0cHV0X211bHRpcGxpZXIgPSBkYXRhLnF1YW50aXphdGlvbi0+b3V0cHV0X211bHRpcGxpZXI7CisgIG9wX3BhcmFtcy5vdXRwdXRfc2hpZnQgPSBkYXRhLnF1YW50aXphdGlvbi0+b3V0cHV0X3NoaWZ0OworICBvcF9wYXJhbXMucXVhbnRpemVkX2FjdGl2YXRpb25fbWluID0gZGF0YS5xdWFudGl6YXRpb24tPm91dHB1dF9hY3RpdmF0aW9uX21pbjsKKyAgb3BfcGFyYW1zLnF1YW50aXplZF9hY3RpdmF0aW9uX21heCA9IGRhdGEucXVhbnRpemF0aW9uLT5vdXRwdXRfYWN0aXZhdGlvbl9tYXg7CisgIG9wX3BhcmFtcy5saHNfY2FjaGVhYmxlID0gZGF0YS5saHNfaXNfY29uc3RhbnRfdGVuc29yOworICBvcF9wYXJhbXMucmhzX2NhY2hlYWJsZSA9IGRhdGEucmhzX2lzX2NvbnN0YW50X3RlbnNvcjsKKworICAvLyBOb3RlIHdlIHBhc3MgUkhTIGFyZ3MgZmlyc3QsIExIUyBhcmdzIHNlY29uZC4gU2VlIG5vdGUgZm9yIEV2YWwuCisgIHJlZmVyZW5jZV9vcHM6OkJhdGNoTWF0TXVsPGludDE2X3QsIGludDY0X3Q+KAorICAgICAgb3BfcGFyYW1zLCByaHNfc2hhcGUsIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50MTZfdD4oJnJocyksCisgICAgICBsaHNfc2hhcGUsIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50MTZfdD4oJmxocyksIG91dHB1dF9zaGFwZSwKKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50MTZfdD4ob3V0cHV0KSk7CisKKyAgcmV0dXJuIGtUZkxpdGVPazsKK30KKworLy8gUGVyZm9ybSBhIGJhdGNoIG1hdHJpeCBtdWx0aXBseSBvbgorLy8gTEhTIDwuLi4sIEEsIEI+ICBYICBSSFM8Li4uLCBCLCBDPgorLy8gd2hlcmUgdGhlIGxlYWRpbmcgZGltZW5zaW9ucyBvZiBMSFMgYW5kIFJIUyBvYmV5IGJyb2FkY2FzdGluZyBydWxlcworLy8gKHRoaXMgT3Agd2lsbCBhcHBseSBicm9hZGNhc3RpbmcgcnVsZXMpLgorLy8gV2UgYXNzdW1lIHRoYXQgTEhTIGFuZCBSSFMgYXJlIGJvdGggcm93IG9yaWVudGVkIChhZGphY2VudCB2YWx1ZXMgaW4gbWVtb3J5CisvLyBhcmUgaW4gdGhlIHNhbWUgcm93KSBhbmQgd2lsbCBvdXRwdXQgaW4gdGhlIHNhbWUgbWVtb3J5IGxheW91dC4gSG93ZXZlciwKKy8vIG91ciBmYXN0IEdFTU0gbGlicmFyaWVzIGFzc3VtZSBSQ0MgbGF5b3V0IChMSFMgcm93IG9yaWVudGVkLAorLy8gUkhTIGNvbHVtbiBvcmllbnRlZCwgb3V0cHV0IGNvbHVtbiBvcmllbnRlZCkuIFRoZXJlZm9yZSwgd2UgcGVyZm9ybQorLy8gUkhTIDwuLi4sIEMsIEI+IFggTEhTIDwuLi4sIEIsIEE+CisvLyB3aGVyZSBvdXRwdXQgaXMgYSBDIFggQSBjb2x1bW4tb3JpZW50ZWQsIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8KKy8vIEEgWCBDIHJvdy1vcmllbnRlZC4KK1RmTGl0ZVN0YXR1cyBCYXRjaE1hdE11bEV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworICBFdmFsT3BDb250ZXh0IG9wX2NvbnRleHQoY29udGV4dCwgbm9kZSk7CisgIE9wRGF0YSogb3BfZGF0YSA9IG9wX2NvbnRleHQub3BfZGF0YTsKKyAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogbGhzID0gb3BfY29udGV4dC5saHM7CisgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIHJocyA9IG9wX2NvbnRleHQucmhzOworICBUZkxpdGVFdmFsVGVuc29yKiBvdXRwdXQgPSBvcF9jb250ZXh0Lm91dHB1dDsKKyAgUnVudGltZVNoYXBlIG9yaWdfbGhzX3NoYXBlID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUobGhzKTsKKyAgUnVudGltZVNoYXBlIG9yaWdfcmhzX3NoYXBlID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUocmhzKTsKKworICBib29sIGFkal95ID0gb3BfY29udGV4dC5wYXJhbXMtPmFkal95OworICBib29sIGFkal94ID0gb3BfY29udGV4dC5wYXJhbXMtPmFkal94OworCisgIC8vIENvbXByZXNzIEJhdGNoTWF0TXVsIHdoZW4gdGhpcmQgZnJvbSBsYXN0IFJIUyBkaW1lbnNpb24gaXMgb25lLgorICBpbnQzMl90IHJoc19kaW1zX2NvdW50ID0gb3JpZ19yaHNfc2hhcGUuRGltZW5zaW9uc0NvdW50KCk7CisgIGludDMyX3QgbGhzX2RpbXNfY291bnQgPSBvcmlnX2xoc19zaGFwZS5EaW1lbnNpb25zQ291bnQoKTsKKyAgLy8gQ29tcHJlc3Mgb3BzIHdoZXJlIHJocyBzaGFwZSBpcyBbLi4uLCAxLCBYLCBZXSBhbmQgbGhzIHNoYXBlIGlzCisgIC8vIFsuLi4sIFEsIFIsIFNdIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gcmhzOiBbLi4uLCBYLCBZXSBhbmQKKyAgLy8gbGhzOiBbLi4uLCBRICogUiwgU10uCisgIGlmIChyaHNfZGltc19jb3VudCA+IDIgJiYgbGhzX2RpbXNfY291bnQgPiAyKSB7CisgICAgaW50IHJoc19vbmUgPSBvcmlnX3Joc19zaGFwZS5EaW1zRGF0YSgpW3Joc19kaW1zX2NvdW50IC0gM107CisgICAgaWYgKHJoc19vbmUgPT0gMSkgeworICAgICAgaW50MzJfdCogbGhzX2RpbXMgPSBvcmlnX2xoc19zaGFwZS5EaW1zRGF0YSgpOworICAgICAgaW50MzJfdCogcmhzX2RpbXMgPSBvcmlnX3Joc19zaGFwZS5EaW1zRGF0YSgpOworICAgICAgUnVudGltZVNoYXBlIHRtcF9sKGxoc19kaW1zX2NvdW50IC0gMSwgbGhzX2RpbXMpOworICAgICAgdG1wX2wuU2V0RGltKGxoc19kaW1zX2NvdW50IC0gMywKKyAgICAgICAgICAgICAgICAgICBsaHNfZGltc1tsaHNfZGltc19jb3VudCAtIDNdICogbGhzX2RpbXNbbGhzX2RpbXNfY291bnQgLSAyXSk7CisgICAgICB0bXBfbC5TZXREaW0obGhzX2RpbXNfY291bnQgLSAyLCBsaHNfZGltc1tsaHNfZGltc19jb3VudCAtIDFdKTsKKyAgICAgIG9yaWdfbGhzX3NoYXBlLlJlcGxhY2VXaXRoKHRtcF9sLkRpbWVuc2lvbnNDb3VudCgpLCB0bXBfbC5EaW1zRGF0YSgpKTsKKyAgICAgIFJ1bnRpbWVTaGFwZSB0bXBfcihyaHNfZGltc19jb3VudCAtIDEsIG9yaWdfcmhzX3NoYXBlLkRpbXNEYXRhKCkpOworICAgICAgdG1wX3IuU2V0RGltKHJoc19kaW1zX2NvdW50IC0gMywgcmhzX2RpbXNbcmhzX2RpbXNfY291bnQgLSAyXSk7CisgICAgICB0bXBfci5TZXREaW0ocmhzX2RpbXNfY291bnQgLSAyLCByaHNfZGltc1tyaHNfZGltc19jb3VudCAtIDFdKTsKKyAgICAgIG9yaWdfcmhzX3NoYXBlLlJlcGxhY2VXaXRoKHRtcF9yLkRpbWVuc2lvbnNDb3VudCgpLCB0bXBfci5EaW1zRGF0YSgpKTsKKyAgICAgIHJoc19kaW1zX2NvdW50ID0gb3JpZ19yaHNfc2hhcGUuRGltZW5zaW9uc0NvdW50KCk7CisgICAgICBsaHNfZGltc19jb3VudCA9IG9yaWdfbGhzX3NoYXBlLkRpbWVuc2lvbnNDb3VudCgpOworICAgIH0KKyAgfQorCisgIFRmTGl0ZUV2YWxUZW5zb3IqIHJoc190ZW5zb3IgPSBhZGpfeSA/IGNvbnN0X2Nhc3Q8VGZMaXRlRXZhbFRlbnNvcio+KHJocykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogb3BfZGF0YS0+cmhzX3RyYW5zcG9zZWRfdGVuc29yOworICBUZkxpdGVFdmFsVGVuc29yKiBsaHNfdGVuc29yID0gYWRqX3ggPyBvcF9kYXRhLT5saHNfdHJhbnNwb3NlZF90ZW5zb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY29uc3RfY2FzdDxUZkxpdGVFdmFsVGVuc29yKj4obGhzKTsKKyAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgcmhzX3RlbnNvciAhPSBudWxscHRyKTsKKyAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgbGhzX3RlbnNvciAhPSBudWxscHRyKTsKKyAgaWYgKCFhZGpfeSkgeworICAgIC8vIFRPRE8oYi8xNTQ3NjAzNDEpOiBDb25zdGFudCB0ZW5zb3JzIHNob3VsZCBhbHJlYWR5IGJlIHRyYW5zcG9zZWQsIGJ1dAorICAgIC8vIHdlIHRyYW5zcG9zZSBvbmNlIGlmIG5lY2Vzc2FyeSBmb3Igbm93LgorICAgIGlmICghKG9wX2RhdGEtPnJoc19pc19jb25zdGFudF90ZW5zb3IgJiYgb3BfZGF0YS0+cmhzX2lzX3RyYW5zcG9zZWQpKSB7CisgICAgICBUcmFuc3Bvc2VSb3dzQ29sdW1ucygqcmhzLCByaHNfdGVuc29yKTsKKyAgICAgIG9wX2RhdGEtPnJoc19pc190cmFuc3Bvc2VkID0gdHJ1ZTsKKyAgICB9CisgIH0KKyAgaWYgKGFkal94KSB7CisgICAgVHJhbnNwb3NlUm93c0NvbHVtbnMoKmxocywgbGhzX3RlbnNvcik7CisgIH0KKyAgUnVudGltZVNoYXBlIHJoc19zaGFwZSA9CisgICAgICBhZGpfeSA/IG9yaWdfcmhzX3NoYXBlIDogU3dhcFJvd0NvbHVtbkRpbXMob3JpZ19yaHNfc2hhcGUpOworICBSdW50aW1lU2hhcGUgbGhzX3NoYXBlID0KKyAgICAgIGFkal94ID8gb3JpZ19saHNfc2hhcGUgOiBTd2FwUm93Q29sdW1uRGltcyhvcmlnX2xoc19zaGFwZSk7CisKKyAgc3dpdGNoIChsaHMtPnR5cGUpIHsKKyAgICBjYXNlIGtUZkxpdGVGbG9hdDMyOgorICAgICAgLy8gTm90ZSB3ZSBwYXNzIFJIUyBhcmdzIGZpcnN0LCBMSFMgYXJncyBzZWNvbmQuIFNlZSBub3RlIGFib3ZlLgorICAgICAgcmVmZXJlbmNlX29wczo6QmF0Y2hNYXRNdWwoCisgICAgICAgICAgcmhzX3NoYXBlLCB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGZsb2F0PihyaHNfdGVuc29yKSwgbGhzX3NoYXBlLAorICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8ZmxvYXQ+KGxoc190ZW5zb3IpLAorICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKG91dHB1dCksCisgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxmbG9hdD4ob3V0cHV0KSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGtUZkxpdGVJbnQ4OgorICAgICAgcmV0dXJuIEV2YWxJbnQ4KGNvbnRleHQsICpvcF9kYXRhLCBsaHNfc2hhcGUsICpsaHNfdGVuc29yLCByaHNfc2hhcGUsCisgICAgICAgICAgICAgICAgICAgICAgKnJoc190ZW5zb3IsIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKG91dHB1dCksCisgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0KTsKKyAgICBjYXNlIGtUZkxpdGVJbnQxNjoKKyAgICAgIHJldHVybiBFdmFsSW50MTYoY29udGV4dCwgKm9wX2RhdGEsIGxoc19zaGFwZSwgKmxoc190ZW5zb3IsIHJoc19zaGFwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgKnJoc190ZW5zb3IsIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKG91dHB1dCksCisgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCk7CisgICAgZGVmYXVsdDoKKyAgICAgIE1pY3JvUHJpbnRmKCJCQVRDSF9NQVRNVUwgZG9lc24ndCBzdXBwb3J0IGlucHV0IHR5cGUgJXMiLAorICAgICAgICAgICAgICAgICAgVGZMaXRlVHlwZUdldE5hbWUobGhzLT50eXBlKSk7CisgICAgICByZXR1cm4ga1RmTGl0ZUVycm9yOworICB9CisgIHJldHVybiBrVGZMaXRlT2s7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX0JBVENIX01BVE1VTCgpIHsKKyAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoQmF0Y2hNYXRNdWxJbml0LCBCYXRjaE1hdE11bFByZXBhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhdGNoTWF0TXVsRXZhbCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZmxpdGUKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2JhdGNoX21hdG11bF90ZXN0LmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvYmF0Y2hfbWF0bXVsX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJiYTc1NwotLS0gL2Rldi9udWxsCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2JhdGNoX21hdG11bF90ZXN0LmNjCkBAIC0wLDAgKzEsNzM2IEBACisvKiBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxudW1lcmljPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2MvYnVpbHRpbl9vcF9kYXRhLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2MvY29tbW9uLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMva2VybmVsX3J1bm5lci5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0X2hlbHBlcnMuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vdGVzdGluZy9taWNyb190ZXN0LmgiCisKK25hbWVzcGFjZSB0ZmxpdGUgeworbmFtZXNwYWNlIHRlc3RpbmcgeworbmFtZXNwYWNlIHsKKworY29uc3RleHByIGZsb2F0IGtGbG9hdFRvbGVyYW5jZSA9IDFlLTU7CisKK2NvbnN0ZXhwciBpbnQga051bUlucHV0cyA9IDI7Citjb25zdGV4cHIgaW50IGtOdW1PdXRwdXRzID0gMTsKK2NvbnN0ZXhwciBpbnQga0xoc0lucHV0VGVuc29ySW5kZXggPSAwOworY29uc3RleHByIGludCBrUmhzSW5wdXRUZW5zb3JJbmRleCA9IDE7Citjb25zdGV4cHIgaW50IGtPdXRwdXRUZW5zb3JJbmRleCA9IDI7CisKKy8vIGRhdGFfbWluL2RhdGFfbWF4IGFyZSB1c2VkIHRvIGNvbXB1dGUgc3ltbWV0cmljIHNjYWxlLCB6ZXJvLXBvaW50IGlzIDAKKy8vIHNjYWxlIHNob3VsZCBiZSAwIHRvIHVzZSBkYXRhX21pbi9kYXRhX21heAordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBrTnVtRWxlbWVudHM+CitzdHJ1Y3QgVGVzdFF1YW50aXphdGlvblBhcmFtcyB7CisgIC8vIHF1YW50aXphdGlvbiBwYXJhbWV0ZXJzCisgIGZsb2F0IHNjYWxlOyAgLy8gaWYgMCwgdXNlIGRhdGFfbWluIGFuZCBkYXRhX21heAorICBpbnQgemVyb19wb2ludDsKKyAgZmxvYXQgZGF0YV9taW47ICAvLyBpbnB1dCBkYXRhIG1pbmltdW0gdmFsdWUKKyAgZmxvYXQgZGF0YV9tYXg7ICAvLyBpbnB1dCBkYXRhIG1heGltdW0gdmFsdWUKKworICBUIHF1YW50aXplZF9kYXRhW2tOdW1FbGVtZW50c107ICAvLyBxdWFudGl6ZWQgc3RvcmFnZQorfTsKKworbWljcm86Oktlcm5lbFJ1bm5lciogR2V0S2VybmVsUnVubmVySW5zdGFuY2UoCisgICAgVGZMaXRlVGVuc29yKiB0ZW5zb3JzLCBpbnQgdGVuc29yc19jb3VudCwKKyAgICBjb25zdCBUZkxpdGVCYXRjaE1hdE11bFBhcmFtcyYgcGFyYW1zLCBib29sIG5lZWRfaW5pdF9wcmVwYXJlKSB7CisgIHN0YXRpYyBpbnQga0lucHV0QXJyYXlEYXRhW10gPSB7a051bUlucHV0cywga0xoc0lucHV0VGVuc29ySW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1Joc0lucHV0VGVuc29ySW5kZXh9OworICBUZkxpdGVJbnRBcnJheSogaW5wdXRzX2FycmF5ID0gSW50QXJyYXlGcm9tSW50cyhrSW5wdXRBcnJheURhdGEpOworICBzdGF0aWMgaW50IGtPdXRwdXRBcnJheURhdGFbXSA9IHtrTnVtT3V0cHV0cywga091dHB1dFRlbnNvckluZGV4fTsKKyAgVGZMaXRlSW50QXJyYXkqIG91dHB1dHNfYXJyYXkgPSBJbnRBcnJheUZyb21JbnRzKGtPdXRwdXRBcnJheURhdGEpOworCisgIHN0YXRpYyBjb25zdCBURkxNUmVnaXN0cmF0aW9uIHJlZ2lzdHJhdGlvbiA9IHRmbGl0ZTo6UmVnaXN0ZXJfQkFUQ0hfTUFUTVVMKCk7CisKKyAgYWxpZ25hcyhtaWNybzo6S2VybmVsUnVubmVyKSBzdGF0aWMgY2hhcgorICAgICAga2VybmVsX3J1bm5lcl9idWZmZXJbc2l6ZW9mKG1pY3JvOjpLZXJuZWxSdW5uZXIpXSA9IHt9OworCisgIHN0YXRpYyBtaWNybzo6S2VybmVsUnVubmVyKiBydW5uZXIgPSBudWxscHRyOworICBpZiAocnVubmVyID09IG51bGxwdHIgfHwgbmVlZF9pbml0X3ByZXBhcmUpIHsKKyAgICBydW5uZXIgPSBuZXcgKGtlcm5lbF9ydW5uZXJfYnVmZmVyKQorICAgICAgICBtaWNybzo6S2VybmVsUnVubmVyKHJlZ2lzdHJhdGlvbiwgdGVuc29ycywgdGVuc29yc19jb3VudCwgaW5wdXRzX2FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHNfYXJyYXksICZwYXJhbXMpOworCisgICAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoa1RmTGl0ZU9rLCBydW5uZXItPkluaXRBbmRQcmVwYXJlKCkpOworICB9CisKKyAgcmV0dXJuIHJ1bm5lcjsKK30KKwordm9pZCBUZXN0QmF0Y2hNYXRNdWxGbG9hdChjb25zdCBUZkxpdGVCYXRjaE1hdE11bFBhcmFtcyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQqIGlucHV0X2RpbXNfZGF0YVtrTnVtSW5wdXRzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGlucHV0X2RhdGFfbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogaW5wdXRfZGF0YV9yaHMsIGNvbnN0IGludCogZXhwZWN0ZWRfZGltcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGV4cGVjdGVkX2RhdGEsIGZsb2F0KiBvdXRwdXRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkX2NvbnN0YW50X3JocyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRfaW5pdF9wcmVwYXJlID0gdHJ1ZSkgeworICBUZkxpdGVJbnRBcnJheSogaW5wdXRfZGltc19saHMgPSBJbnRBcnJheUZyb21JbnRzKGlucHV0X2RpbXNfZGF0YVswXSk7CisgIFRmTGl0ZUludEFycmF5KiBpbnB1dF9kaW1zX3JocyA9IEludEFycmF5RnJvbUludHMoaW5wdXRfZGltc19kYXRhWzFdKTsKKyAgVGZMaXRlSW50QXJyYXkqIG91dHB1dF9kaW1zID0gSW50QXJyYXlGcm9tSW50cyhleHBlY3RlZF9kaW1zKTsKKyAgY29uc3QgaW50IGtPdXRwdXRDb3VudCA9IEVsZW1lbnRDb3VudCgqb3V0cHV0X2RpbXMpOworCisgIHN0YXRpYyBUZkxpdGVUZW5zb3IgdGVuc29yc1trTnVtSW5wdXRzICsga051bU91dHB1dHNdOworCisgIGlmIChuZWVkX2luaXRfcHJlcGFyZSkgeworICAgIHRlbnNvcnNba0xoc0lucHV0VGVuc29ySW5kZXhdID0KKyAgICAgICAgQ3JlYXRlVGVuc29yKGlucHV0X2RhdGFfbGhzLCBpbnB1dF9kaW1zX2xocyk7CisgICAgdGVuc29yc1trUmhzSW5wdXRUZW5zb3JJbmRleF0gPQorICAgICAgICBDcmVhdGVUZW5zb3IoaW5wdXRfZGF0YV9yaHMsIGlucHV0X2RpbXNfcmhzKTsKKyAgICBpZiAobmVlZF9jb25zdGFudF9yaHMpIHsKKyAgICAgIHRlbnNvcnNba1Joc0lucHV0VGVuc29ySW5kZXhdLmFsbG9jYXRpb25fdHlwZSA9IGtUZkxpdGVNbWFwUm87CisgICAgfQorICAgIHRlbnNvcnNba091dHB1dFRlbnNvckluZGV4XSA9IENyZWF0ZVRlbnNvcihvdXRwdXRfZGF0YSwgb3V0cHV0X2RpbXMpOworICB9CisKKyAgY29uc3RleHByIGludCBrVGVuc29yQ291bnQgPSBzdGQ6OmV4dGVudDxkZWNsdHlwZSh0ZW5zb3JzKT46OnZhbHVlOworICBtaWNybzo6S2VybmVsUnVubmVyKiBydW5uZXIgPQorICAgICAgR2V0S2VybmVsUnVubmVySW5zdGFuY2UodGVuc29ycywga1RlbnNvckNvdW50LCBwYXJhbXMsIG5lZWRfaW5pdF9wcmVwYXJlKTsKKyAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoa1RmTGl0ZU9rLCBydW5uZXItPkludm9rZSgpKTsKKworICAvLyBjaGVjayBvdXRwdXQgZGF0YSBhZ2FpbnN0IGV4cGVjdGVkCisgIGZvciAoaW50IGkgPSAwOyBpIDwga091dHB1dENvdW50OyBpKyspIHsKKyAgICBURl9MSVRFX01JQ1JPX0VYUEVDVF9ORUFSKGV4cGVjdGVkX2RhdGFbaV0sIG91dHB1dF9kYXRhW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0Zsb2F0VG9sZXJhbmNlKTsKKyAgfQorCisgIC8vIGNoZWNrIG91dHB1dCBkaW1lbnNpb25zIChyZWxvY2F0ZWQpIGFnYWluc3Qgb3JpZ2luYWwgZGltZW5zaW9ucworICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUShvdXRwdXRfZGltcy0+c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGVuc29yc1trT3V0cHV0VGVuc29ySW5kZXhdLmRpbXMtPnNpemUpOworICBmb3IgKGludCBpID0gMDsgaSA8IG91dHB1dF9kaW1zLT5zaXplOyBpKyspIHsKKyAgICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUShvdXRwdXRfZGltcy0+ZGF0YVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW5zb3JzW2tPdXRwdXRUZW5zb3JJbmRleF0uZGltcy0+ZGF0YVtpXSk7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBrTnVtRWxlbWVudHM+Cit2b2lkIFNldFNjYWxlQW5kWmVyb1BvaW50KFRlc3RRdWFudGl6YXRpb25QYXJhbXM8VCwga051bUVsZW1lbnRzPiogcV9wYXJhbXMpIHsKKyAgaWYgKHFfcGFyYW1zLT5zY2FsZSA9PSAwLjBmIHx8IHFfcGFyYW1zLT5kYXRhX21heCAhPSAwIHx8CisgICAgICBxX3BhcmFtcy0+ZGF0YV9taW4gIT0gMCkgeworICAgIHFfcGFyYW1zLT5zY2FsZSA9CisgICAgICAgIFNjYWxlRnJvbU1pbk1heDxUPihxX3BhcmFtcy0+ZGF0YV9taW4sIHFfcGFyYW1zLT5kYXRhX21heCk7CisgICAgcV9wYXJhbXMtPnplcm9fcG9pbnQgPQorICAgICAgICBaZXJvUG9pbnRGcm9tTWluTWF4PFQ+KHFfcGFyYW1zLT5kYXRhX21pbiwgcV9wYXJhbXMtPmRhdGFfbWF4KTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IGtOdW1MaHMsIHNpemVfdCBrTnVtUmhzLCBzaXplX3Qga051bU91dHB1dD4KK3ZvaWQgVGVzdEJhdGNoTWF0TXVsUXVhbnRpemVkKAorICAgIGNvbnN0IFRmTGl0ZUJhdGNoTWF0TXVsUGFyYW1zJiBwYXJhbXMsCisgICAgVGVzdFF1YW50aXphdGlvblBhcmFtczxULCBrTnVtTGhzPiogcXVhbnRpemF0aW9uX2xocywKKyAgICBUZXN0UXVhbnRpemF0aW9uUGFyYW1zPFQsIGtOdW1SaHM+KiBxdWFudGl6YXRpb25fcmhzLAorICAgIFRlc3RRdWFudGl6YXRpb25QYXJhbXM8VCwga051bU91dHB1dD4qIHF1YW50aXphdGlvbl9vdXRwdXQsCisgICAgY29uc3QgaW50KiBpbnB1dF9kaW1zX2RhdGFba051bUlucHV0c10sIGNvbnN0IGZsb2F0KiBpbnB1dF9kYXRhX2xocywKKyAgICBjb25zdCBmbG9hdCogaW5wdXRfZGF0YV9yaHMsIGNvbnN0IGludCogZXhwZWN0ZWRfZGltcywKKyAgICBjb25zdCBUKiBleHBlY3RlZF9kYXRhLCBjb25zdCBmbG9hdCogb3V0cHV0X2RhdGEpIHsKKyAgVGZMaXRlSW50QXJyYXkqIGlucHV0X2RpbXNfbGhzID0gSW50QXJyYXlGcm9tSW50cyhpbnB1dF9kaW1zX2RhdGFbMF0pOworICBUZkxpdGVJbnRBcnJheSogaW5wdXRfZGltc19yaHMgPSBJbnRBcnJheUZyb21JbnRzKGlucHV0X2RpbXNfZGF0YVsxXSk7CisgIFRmTGl0ZUludEFycmF5KiBvdXRwdXRfZGltcyA9IEludEFycmF5RnJvbUludHMoZXhwZWN0ZWRfZGltcyk7CisgIGNvbnN0IGludCBrT3V0cHV0Q291bnQgPSBFbGVtZW50Q291bnQoKm91dHB1dF9kaW1zKTsKKworICBzdGF0aWMgVGZMaXRlVGVuc29yIHRlbnNvcnNba051bUlucHV0cyArIGtOdW1PdXRwdXRzXTsKKworICBTZXRTY2FsZUFuZFplcm9Qb2ludDxULCBrTnVtTGhzPihxdWFudGl6YXRpb25fbGhzKTsKKyAgdGVuc29yc1trTGhzSW5wdXRUZW5zb3JJbmRleF0gPSBDcmVhdGVRdWFudGl6ZWRUZW5zb3IoCisgICAgICBpbnB1dF9kYXRhX2xocywgcXVhbnRpemF0aW9uX2xocy0+cXVhbnRpemVkX2RhdGEsIGlucHV0X2RpbXNfbGhzLAorICAgICAgcXVhbnRpemF0aW9uX2xocy0+c2NhbGUsIHF1YW50aXphdGlvbl9saHMtPnplcm9fcG9pbnQpOworICBTZXRTY2FsZUFuZFplcm9Qb2ludDxULCBrTnVtUmhzPihxdWFudGl6YXRpb25fcmhzKTsKKyAgdGVuc29yc1trUmhzSW5wdXRUZW5zb3JJbmRleF0gPSBDcmVhdGVRdWFudGl6ZWRUZW5zb3IoCisgICAgICBpbnB1dF9kYXRhX3JocywgcXVhbnRpemF0aW9uX3Jocy0+cXVhbnRpemVkX2RhdGEsIGlucHV0X2RpbXNfcmhzLAorICAgICAgcXVhbnRpemF0aW9uX3Jocy0+c2NhbGUsIHF1YW50aXphdGlvbl9yaHMtPnplcm9fcG9pbnQpOworICBTZXRTY2FsZUFuZFplcm9Qb2ludDxULCBrTnVtT3V0cHV0PihxdWFudGl6YXRpb25fb3V0cHV0KTsKKyAgdGVuc29yc1trT3V0cHV0VGVuc29ySW5kZXhdID0gQ3JlYXRlUXVhbnRpemVkVGVuc29yKAorICAgICAgcXVhbnRpemF0aW9uX291dHB1dC0+cXVhbnRpemVkX2RhdGEsIG91dHB1dF9kaW1zLAorICAgICAgcXVhbnRpemF0aW9uX291dHB1dC0+c2NhbGUsIHF1YW50aXphdGlvbl9vdXRwdXQtPnplcm9fcG9pbnQpOworCisgIGNvbnN0ZXhwciBpbnQga1RlbnNvckNvdW50ID0gc3RkOjpleHRlbnQ8ZGVjbHR5cGUodGVuc29ycyk+Ojp2YWx1ZTsKKyAgbWljcm86Oktlcm5lbFJ1bm5lciogcnVubmVyID0KKyAgICAgIEdldEtlcm5lbFJ1bm5lckluc3RhbmNlKHRlbnNvcnMsIGtUZW5zb3JDb3VudCwgcGFyYW1zLCB0cnVlKTsKKyAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoa1RmTGl0ZU9rLCBydW5uZXItPkludm9rZSgpKTsKKworICAvLyBjaGVjayBvdXRwdXQgZGF0YSBhZ2FpbnN0IGV4cGVjdGVkCisgIGZvciAoaW50IGkgPSAwOyBpIDwga091dHB1dENvdW50OyBpKyspIHsKKyAgICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUShleHBlY3RlZF9kYXRhW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YW50aXphdGlvbl9vdXRwdXQtPnF1YW50aXplZF9kYXRhW2ldKTsKKyAgfQorICAvLyBjaGVjayBkZXF1YW50aXplZCBvdXRwdXQgZGF0YSBhZ2FpbnN0IGV4cGVjdGVkCisgIGZvciAoaW50IGkgPSAwOyBpIDwga091dHB1dENvdW50OyBpKyspIHsKKyAgICBmbG9hdCBkZXF1YW50aXplZF92YWx1ZSA9IChxdWFudGl6YXRpb25fb3V0cHV0LT5xdWFudGl6ZWRfZGF0YVtpXSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpemF0aW9uX291dHB1dC0+emVyb19wb2ludCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbnRpemF0aW9uX291dHB1dC0+c2NhbGU7CisgICAgVEZfTElURV9NSUNST19FWFBFQ1RfTkVBUihvdXRwdXRfZGF0YVtpXSwgZGVxdWFudGl6ZWRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRmxvYXRUb2xlcmFuY2UpOworICB9CisKKyAgLy8gY2hlY2sgb3V0cHV0IGRpbWVuc2lvbnMgKHJlbG9jYXRlZCkgYWdhaW5zdCBvcmlnaW5hbCBkaW1lbnNpb25zCisgIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKG91dHB1dF9kaW1zLT5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW5zb3JzW2tPdXRwdXRUZW5zb3JJbmRleF0uZGltcy0+c2l6ZSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgb3V0cHV0X2RpbXMtPnNpemU7IGkrKykgeworICAgIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKG91dHB1dF9kaW1zLT5kYXRhW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbnNvcnNba091dHB1dFRlbnNvckluZGV4XS5kaW1zLT5kYXRhW2ldKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCisKK1RGX0xJVEVfTUlDUk9fVEVTVFNfQkVHSU4KKworVEZfTElURV9NSUNST19URVNUKEJhdGNoTWF0TXVsT3BUZXN0RmxvYXQzMlRlc3RfT25lcykgeworICBjb25zdGV4cHIgaW50IGtMaHNJbnB1dERpbXNbXSA9IHs0LCAzLCAyLCAxLCA0fTsKKyAgY29uc3RleHByIGludCBrUmhzSW5wdXREaW1zW10gPSB7NCwgMywgMSwgNCwgMX07CisgIGNvbnN0IGludCoga0lucHV0RGltc1t0ZmxpdGU6OnRlc3Rpbmc6OmtOdW1JbnB1dHNdID0ge2tMaHNJbnB1dERpbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSaHNJbnB1dERpbXN9OworCisgIGNvbnN0ZXhwciBzaXplX3Qga0xoc0lucHV0U2l6ZSA9IDI0OworICBmbG9hdCBsaHNfaW5wdXRba0xoc0lucHV0U2l6ZV07CisgIHN0ZDo6aW90YShzdGQ6OmJlZ2luKGxoc19pbnB1dCksIHN0ZDo6ZW5kKGxoc19pbnB1dCksIDEpOworCisgIGNvbnN0ZXhwciBzaXplX3Qga1Joc0lucHV0U2l6ZSA9IDEyOworICBmbG9hdCByaHNfaW5wdXRba1Joc0lucHV0U2l6ZV07CisgIHN0ZDo6aW90YShzdGQ6OmJlZ2luKHJoc19pbnB1dCksIHN0ZDo6ZW5kKHJoc19pbnB1dCksIDEpOworCisgIGNvbnN0ZXhwciBmbG9hdCBrRXhwZWN0W10gPSB7MzAsIDcwLCAyNzgsIDM4MiwgNzgyLCA5NTB9OworICBjb25zdGV4cHIgaW50IGtPdXRwdXREaW1zW10gPSB7NCwgMywgMiwgMSwgMX07CisgIGNvbnN0ZXhwciBpbnQga091dHB1dENvdW50ID0gc3RkOjpleHRlbnQ8ZGVjbHR5cGUoa0V4cGVjdCk+Ojp2YWx1ZTsKKyAgZmxvYXQgb3V0cHV0X2RhdGFba091dHB1dENvdW50XTsKKworICBjb25zdGV4cHIgVGZMaXRlQmF0Y2hNYXRNdWxQYXJhbXMgcGFyYW1zID0geworICAgICAgZmFsc2UsICAvLyBhZGpfeAorICAgICAgZmFsc2UsICAvLyBhZGpfeQorICAgICAgZmFsc2UgICAvLyBhc3ltbWV0cmljX3F1YW50aXplX2lucHV0cworICB9OworCisgIHRmbGl0ZTo6dGVzdGluZzo6VGVzdEJhdGNoTWF0TXVsRmxvYXQocGFyYW1zLCBrSW5wdXREaW1zLCBsaHNfaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmhzX2lucHV0LCBrT3V0cHV0RGltcywga0V4cGVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGF0YSk7Cit9CisKK1RGX0xJVEVfTUlDUk9fVEVTVChCYXRjaE1hdE11bE9wVGVzdEZsb2F0MzJUZXN0X0ZsYXR0ZW4pIHsKKyAgY29uc3RleHByIGludCBrTGhzSW5wdXREaW1zW10gPSB7NCwgMywgMiwgMiwgNH07CisgIGNvbnN0ZXhwciBpbnQga1Joc0lucHV0RGltc1tdID0gezQsIDMsIDEsIDQsIDF9OworICBjb25zdCBpbnQqIGtJbnB1dERpbXNbdGZsaXRlOjp0ZXN0aW5nOjprTnVtSW5wdXRzXSA9IHtrTGhzSW5wdXREaW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmhzSW5wdXREaW1zfTsKKworICBjb25zdGV4cHIgc2l6ZV90IGtMaHNJbnB1dFNpemUgPSA0ODsKKyAgZmxvYXQgbGhzX2lucHV0W2tMaHNJbnB1dFNpemVdOworICBzdGQ6OmlvdGEoc3RkOjpiZWdpbihsaHNfaW5wdXQpLCBzdGQ6OmVuZChsaHNfaW5wdXQpLCAxKTsKKworICBjb25zdGV4cHIgc2l6ZV90IGtSaHNJbnB1dFNpemUgPSAxMjsKKyAgZmxvYXQgcmhzX2lucHV0W2tSaHNJbnB1dFNpemVdOworICBzdGQ6OmlvdGEoc3RkOjpiZWdpbihyaHNfaW5wdXQpLCBzdGQ6OmVuZChyaHNfaW5wdXQpLCAxKTsKKworICBjb25zdGV4cHIgZmxvYXQga0V4cGVjdFtdID0gezMwLCAgNzAsICAxMTAsICAxNTAsICA0ODYsICA1OTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjk0LCA3OTgsIDE0NTQsIDE2MjIsIDE3OTAsIDE5NTh9OworICBjb25zdGV4cHIgaW50IGtPdXRwdXREaW1zW10gPSB7NCwgMywgMiwgMiwgMX07CisgIGNvbnN0ZXhwciBpbnQga091dHB1dENvdW50ID0gc3RkOjpleHRlbnQ8ZGVjbHR5cGUoa0V4cGVjdCk+Ojp2YWx1ZTsKKyAgZmxvYXQgb3V0cHV0X2RhdGFba091dHB1dENvdW50XTsKKworICBjb25zdGV4cHIgVGZMaXRlQmF0Y2hNYXRNdWxQYXJhbXMgcGFyYW1zID0geworICAgICAgZmFsc2UsICAvLyBhZGpfeAorICAgICAgZmFsc2UsICAvLyBhZGpfeQorICAgICAgZmFsc2UgICAvLyBhc3ltbWV0cmljX3F1YW50aXplX2lucHV0cworICB9OworCisgIHRmbGl0ZTo6dGVzdGluZzo6VGVzdEJhdGNoTWF0TXVsRmxvYXQocGFyYW1zLCBrSW5wdXREaW1zLCBsaHNfaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmhzX2lucHV0LCBrT3V0cHV0RGltcywga0V4cGVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGF0YSk7Cit9CisKK1RGX0xJVEVfTUlDUk9fVEVTVChCYXRjaE1hdE11bE9wVGVzdEZsb2F0MzJUZXN0X1NpbXBsZSkgeworICBjb25zdGV4cHIgaW50IGtMaHNJbnB1dERpbXNbXSA9IHszLCAxLCAyLCAzfTsKKyAgY29uc3RleHByIGludCBrUmhzSW5wdXREaW1zW10gPSB7MywgMSwgMywgNH07CisgIGNvbnN0IGludCoga0lucHV0RGltc1t0ZmxpdGU6OnRlc3Rpbmc6OmtOdW1JbnB1dHNdID0ge2tMaHNJbnB1dERpbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSaHNJbnB1dERpbXN9OworCisgIGNvbnN0ZXhwciBzaXplX3Qga0xoc0lucHV0U2l6ZSA9IDY7CisgIGZsb2F0IGxoc19pbnB1dFtrTGhzSW5wdXRTaXplXTsKKyAgc3RkOjppb3RhKHN0ZDo6YmVnaW4obGhzX2lucHV0KSwgc3RkOjplbmQobGhzX2lucHV0KSwgMSk7CisKKyAgY29uc3RleHByIHNpemVfdCBrUmhzSW5wdXRTaXplID0gMTI7CisgIGZsb2F0IHJoc19pbnB1dFtrUmhzSW5wdXRTaXplXTsKKyAgc3RkOjppb3RhKHN0ZDo6YmVnaW4ocmhzX2lucHV0KSwgc3RkOjplbmQocmhzX2lucHV0KSwgNyk7CisKKyAgY29uc3RleHByIGZsb2F0IGtFeHBlY3RbXSA9IHs3NC4sIDgwLiwgODYuLCA5Mi4sIDE3My4sIDE4OC4sIDIwMy4sIDIxOC59OworICBjb25zdGV4cHIgaW50IGtPdXRwdXREaW1zW10gPSB7MywgMSwgMiwgNH07CisgIGNvbnN0ZXhwciBpbnQga091dHB1dENvdW50ID0gc3RkOjpleHRlbnQ8ZGVjbHR5cGUoa0V4cGVjdCk+Ojp2YWx1ZTsKKyAgZmxvYXQgb3V0cHV0X2RhdGFba091dHB1dENvdW50XTsKKworICBjb25zdGV4cHIgVGZMaXRlQmF0Y2hNYXRNdWxQYXJhbXMgcGFyYW1zID0geworICAgICAgZmFsc2UsICAvLyBhZGpfeAorICAgICAgZmFsc2UsICAvLyBhZGpfeQorICAgICAgZmFsc2UgICAvLyBhc3ltbWV0cmljX3F1YW50aXplX2lucHV0cworICB9OworCisgIHRmbGl0ZTo6dGVzdGluZzo6VGVzdEJhdGNoTWF0TXVsRmxvYXQocGFyYW1zLCBrSW5wdXREaW1zLCBsaHNfaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmhzX2lucHV0LCBrT3V0cHV0RGltcywga0V4cGVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGF0YSk7Cit9CisKK1RGX0xJVEVfTUlDUk9fVEVTVChCYXRjaE1hdE11bE9wVGVzdEZsb2F0MzJUZXN0X1NpbXBsZVJIU0Fkam9pbnQpIHsKKyAgY29uc3RleHByIGludCBrTGhzSW5wdXREaW1zW10gPSB7MywgMSwgMiwgM307CisgIGNvbnN0ZXhwciBpbnQga1Joc0lucHV0RGltc1tdID0gezMsIDEsIDQsIDN9OworICBjb25zdCBpbnQqIGtJbnB1dERpbXNbdGZsaXRlOjp0ZXN0aW5nOjprTnVtSW5wdXRzXSA9IHtrTGhzSW5wdXREaW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmhzSW5wdXREaW1zfTsKKworICBjb25zdGV4cHIgc2l6ZV90IGtMaHNJbnB1dFNpemUgPSA2OworICBmbG9hdCBsaHNfaW5wdXRba0xoc0lucHV0U2l6ZV07CisgIHN0ZDo6aW90YShzdGQ6OmJlZ2luKGxoc19pbnB1dCksIHN0ZDo6ZW5kKGxoc19pbnB1dCksIDEpOworCisgIGNvbnN0ZXhwciBmbG9hdCBrUmhzSW5wdXRbXSA9IHs3LCAxMSwgMTUsIDgsIDEyLCAxNiwgOSwgMTMsIDE3LCAxMCwgMTQsIDE4fTsKKworICBjb25zdGV4cHIgZmxvYXQga0V4cGVjdFtdID0gezc0LiwgODAuLCA4Ni4sIDkyLiwgMTczLiwgMTg4LiwgMjAzLiwgMjE4Ln07CisgIGNvbnN0ZXhwciBpbnQga091dHB1dERpbXNbXSA9IHszLCAxLCAyLCA0fTsKKyAgY29uc3RleHByIGludCBrT3V0cHV0Q291bnQgPSBzdGQ6OmV4dGVudDxkZWNsdHlwZShrRXhwZWN0KT46OnZhbHVlOworICBmbG9hdCBvdXRwdXRfZGF0YVtrT3V0cHV0Q291bnRdOworCisgIGNvbnN0ZXhwciBUZkxpdGVCYXRjaE1hdE11bFBhcmFtcyBwYXJhbXMgPSB7CisgICAgICBmYWxzZSwgIC8vIGFkal94CisgICAgICB0cnVlLCAgIC8vIGFkal95CisgICAgICBmYWxzZSAgIC8vIGFzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzCisgIH07CisKKyAgdGZsaXRlOjp0ZXN0aW5nOjpUZXN0QmF0Y2hNYXRNdWxGbG9hdChwYXJhbXMsIGtJbnB1dERpbXMsIGxoc19pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmhzSW5wdXQsIGtPdXRwdXREaW1zLCBrRXhwZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9kYXRhKTsKK30KKworVEZfTElURV9NSUNST19URVNUKEJhdGNoTWF0TXVsT3BUZXN0RmxvYXQzMlRlc3RfU2ltcGxlTEhTQWRqb2ludCkgeworICBjb25zdGV4cHIgaW50IGtMaHNJbnB1dERpbXNbXSA9IHszLCAxLCAzLCAyfTsKKyAgY29uc3RleHByIGludCBrUmhzSW5wdXREaW1zW10gPSB7MywgMSwgMywgNH07CisgIGNvbnN0IGludCoga0lucHV0RGltc1t0ZmxpdGU6OnRlc3Rpbmc6OmtOdW1JbnB1dHNdID0ge2tMaHNJbnB1dERpbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSaHNJbnB1dERpbXN9OworICBjb25zdGV4cHIgZmxvYXQga0xoc0lucHV0W10gPSB7MSwgNCwgMiwgNSwgMywgNn07CisKKyAgY29uc3RleHByIHNpemVfdCBrUmhzSW5wdXRTaXplID0gMTI7CisgIGZsb2F0IHJoc19pbnB1dFtrUmhzSW5wdXRTaXplXTsKKyAgc3RkOjppb3RhKHN0ZDo6YmVnaW4ocmhzX2lucHV0KSwgc3RkOjplbmQocmhzX2lucHV0KSwgNyk7CisKKyAgY29uc3RleHByIGZsb2F0IGtFeHBlY3RbXSA9IHs3NC4sIDgwLiwgODYuLCA5Mi4sIDE3My4sIDE4OC4sIDIwMy4sIDIxOC59OworICBjb25zdGV4cHIgaW50IGtPdXRwdXREaW1zW10gPSB7MywgMSwgMiwgNH07CisgIGNvbnN0ZXhwciBpbnQga091dHB1dENvdW50ID0gc3RkOjpleHRlbnQ8ZGVjbHR5cGUoa0V4cGVjdCk+Ojp2YWx1ZTsKKyAgZmxvYXQgb3V0cHV0X2RhdGFba091dHB1dENvdW50XTsKKworICBjb25zdGV4cHIgVGZMaXRlQmF0Y2hNYXRNdWxQYXJhbXMgcGFyYW1zID0geworICAgICAgdHJ1ZSwgICAvLyBhZGpfeAorICAgICAgZmFsc2UsICAvLyBhZGpfeQorICAgICAgZmFsc2UgICAvLyBhc3ltbWV0cmljX3F1YW50aXplX2lucHV0cworICB9OworCisgIHRmbGl0ZTo6dGVzdGluZzo6VGVzdEJhdGNoTWF0TXVsRmxvYXQocGFyYW1zLCBrSW5wdXREaW1zLCBrTGhzSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmhzX2lucHV0LCBrT3V0cHV0RGltcywga0V4cGVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGF0YSk7Cit9CisKK1RGX0xJVEVfTUlDUk9fVEVTVChCYXRjaE1hdE11bE9wVGVzdEZsb2F0MzJUZXN0X0JhdGNoU2l6ZVR3bykgeworICBjb25zdGV4cHIgaW50IGtMaHNJbnB1dERpbXNbXSA9IHszLCAyLCAyLCAzfTsKKyAgY29uc3RleHByIGludCBrUmhzSW5wdXREaW1zW10gPSB7MywgMiwgMywgNH07CisgIGNvbnN0IGludCoga0lucHV0RGltc1t0ZmxpdGU6OnRlc3Rpbmc6OmtOdW1JbnB1dHNdID0ge2tMaHNJbnB1dERpbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSaHNJbnB1dERpbXN9OworICBjb25zdGV4cHIgc2l6ZV90IGtMaHNJbnB1dFNpemUgPSAxMjsKKyAgZmxvYXQgbGhzX2lucHV0W2tMaHNJbnB1dFNpemVdOworICBzdGQ6OmlvdGEoc3RkOjpiZWdpbihsaHNfaW5wdXQpLCBzdGQ6OmVuZChsaHNfaW5wdXQpLCAxKTsKKworICBjb25zdGV4cHIgc2l6ZV90IGtSaHNJbnB1dFNpemUgPSAyNDsKKyAgZmxvYXQgcmhzX2lucHV0W2tSaHNJbnB1dFNpemVdOworICBzdGQ6OmlvdGEoc3RkOjpiZWdpbihyaHNfaW5wdXQpLCBzdGQ6OmVuZChyaHNfaW5wdXQpLCA3KTsKKworICBjb25zdGV4cHIgZmxvYXQga0V4cGVjdFtdID0gezc0LiwgIDgwLiwgIDg2LiwgIDkyLiwgIDE3My4sIDE4OC4sIDIwMy4sIDIxOC4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTYwLiwgNTg0LiwgNjA4LiwgNjMyLiwgNzY3LiwgODAwLiwgODMzLiwgODY2Ln07CisgIGNvbnN0ZXhwciBpbnQga091dHB1dERpbXNbXSA9IHszLCAyLCAyLCA0fTsKKyAgY29uc3RleHByIGludCBrT3V0cHV0Q291bnQgPSBzdGQ6OmV4dGVudDxkZWNsdHlwZShrRXhwZWN0KT46OnZhbHVlOworICBmbG9hdCBvdXRwdXRfZGF0YVtrT3V0cHV0Q291bnRdOworCisgIGNvbnN0ZXhwciBUZkxpdGVCYXRjaE1hdE11bFBhcmFtcyBwYXJhbXMgPSB7CisgICAgICBmYWxzZSwgIC8vIGFkal94CisgICAgICBmYWxzZSwgIC8vIGFkal95CisgICAgICBmYWxzZSAgIC8vIGFzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzCisgIH07CisKKyAgdGZsaXRlOjp0ZXN0aW5nOjpUZXN0QmF0Y2hNYXRNdWxGbG9hdChwYXJhbXMsIGtJbnB1dERpbXMsIGxoc19pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaHNfaW5wdXQsIGtPdXRwdXREaW1zLCBrRXhwZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9kYXRhKTsKK30KKworVEZfTElURV9NSUNST19URVNUKEJhdGNoTWF0TXVsT3BUZXN0RmxvYXQzMlRlc3RfQnJvYWRjYXN0KSB7CisgIGNvbnN0ZXhwciBpbnQga0xoc0lucHV0RGltc1tdID0gezMsIDIsIDIsIDN9OworICBjb25zdGV4cHIgaW50IGtSaHNJbnB1dERpbXNbXSA9IHsyLCAzLCA0fTsKKyAgY29uc3QgaW50KiBrSW5wdXREaW1zW3RmbGl0ZTo6dGVzdGluZzo6a051bUlucHV0c10gPSB7a0xoc0lucHV0RGltcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1Joc0lucHV0RGltc307CisgIGNvbnN0ZXhwciBzaXplX3Qga0xoc0lucHV0U2l6ZSA9IDEyOworICBmbG9hdCBsaHNfaW5wdXRba0xoc0lucHV0U2l6ZV07CisgIHN0ZDo6aW90YShzdGQ6OmJlZ2luKGxoc19pbnB1dCksIHN0ZDo6ZW5kKGxoc19pbnB1dCksIDEpOworCisgIGNvbnN0ZXhwciBzaXplX3Qga1Joc0lucHV0U2l6ZSA9IDEyOworICBmbG9hdCByaHNfaW5wdXRba1Joc0lucHV0U2l6ZV07CisgIHN0ZDo6aW90YShzdGQ6OmJlZ2luKHJoc19pbnB1dCksIHN0ZDo6ZW5kKHJoc19pbnB1dCksIDcpOworCisgIGNvbnN0ZXhwciBmbG9hdCBrRXhwZWN0W10gPSB7NzQuLCAgODAuLCAgODYuLCAgOTIuLCAgMTczLiwgMTg4LiwgMjAzLiwgMjE4LiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzIuLCAyOTYuLCAzMjAuLCAzNDQuLCAzNzEuLCA0MDQuLCA0MzcuLCA0NzAufTsKKyAgY29uc3RleHByIGludCBrT3V0cHV0RGltc1tdID0gezMsIDIsIDIsIDR9OworICBjb25zdGV4cHIgaW50IGtPdXRwdXRDb3VudCA9IHN0ZDo6ZXh0ZW50PGRlY2x0eXBlKGtFeHBlY3QpPjo6dmFsdWU7CisgIGZsb2F0IG91dHB1dF9kYXRhW2tPdXRwdXRDb3VudF07CisKKyAgY29uc3RleHByIFRmTGl0ZUJhdGNoTWF0TXVsUGFyYW1zIHBhcmFtcyA9IHsKKyAgICAgIGZhbHNlLCAgLy8gYWRqX3gKKyAgICAgIGZhbHNlLCAgLy8gYWRqX3kKKyAgICAgIGZhbHNlICAgLy8gYXN5bW1ldHJpY19xdWFudGl6ZV9pbnB1dHMKKyAgfTsKKworICB0ZmxpdGU6OnRlc3Rpbmc6OlRlc3RCYXRjaE1hdE11bEZsb2F0KHBhcmFtcywga0lucHV0RGltcywgbGhzX2lucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJoc19pbnB1dCwga091dHB1dERpbXMsIGtFeHBlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2RhdGEpOworfQorCitURl9MSVRFX01JQ1JPX1RFU1QoQmF0Y2hNYXRNdWxPcFRlc3RGbG9hdDMyVGVzdF9Ccm9hZGNhc3RMSFNBZGpvaW50KSB7CisgIGNvbnN0ZXhwciBpbnQga0xoc0lucHV0RGltc1tdID0gezMsIDIsIDMsIDJ9OworICBjb25zdGV4cHIgaW50IGtSaHNJbnB1dERpbXNbXSA9IHsyLCAzLCA0fTsKKyAgY29uc3QgaW50KiBrSW5wdXREaW1zW3RmbGl0ZTo6dGVzdGluZzo6a051bUlucHV0c10gPSB7a0xoc0lucHV0RGltcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1Joc0lucHV0RGltc307CisKKyAgY29uc3RleHByIGZsb2F0IGtMaHNJbnB1dFtdID0gezEsIDQsIDIsIDUsIDMsIDYsIDcsIDEwLCA4LCAxMSwgOSwgMTJ9OworCisgIGNvbnN0ZXhwciBzaXplX3Qga1Joc0lucHV0U2l6ZSA9IDEyOworICBmbG9hdCByaHNfaW5wdXRba1Joc0lucHV0U2l6ZV07CisgIHN0ZDo6aW90YShzdGQ6OmJlZ2luKHJoc19pbnB1dCksIHN0ZDo6ZW5kKHJoc19pbnB1dCksIDcpOworCisgIGNvbnN0ZXhwciBmbG9hdCBrRXhwZWN0W10gPSB7NzQuLCAgODAuLCAgODYuLCAgOTIuLCAgMTczLiwgMTg4LiwgMjAzLiwgMjE4LiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzIuLCAyOTYuLCAzMjAuLCAzNDQuLCAzNzEuLCA0MDQuLCA0MzcuLCA0NzAufTsKKyAgY29uc3RleHByIGludCBrT3V0cHV0RGltc1tdID0gezMsIDIsIDIsIDR9OworICBjb25zdGV4cHIgaW50IGtPdXRwdXRDb3VudCA9IHN0ZDo6ZXh0ZW50PGRlY2x0eXBlKGtFeHBlY3QpPjo6dmFsdWU7CisgIGZsb2F0IG91dHB1dF9kYXRhW2tPdXRwdXRDb3VudF07CisKKyAgY29uc3RleHByIFRmTGl0ZUJhdGNoTWF0TXVsUGFyYW1zIHBhcmFtcyA9IHsKKyAgICAgIHRydWUsICAgLy8gYWRqX3gKKyAgICAgIGZhbHNlLCAgLy8gYWRqX3kKKyAgICAgIGZhbHNlICAgLy8gYXN5bW1ldHJpY19xdWFudGl6ZV9pbnB1dHMKKyAgfTsKKworICB0ZmxpdGU6OnRlc3Rpbmc6OlRlc3RCYXRjaE1hdE11bEZsb2F0KHBhcmFtcywga0lucHV0RGltcywga0xoc0lucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJoc19pbnB1dCwga091dHB1dERpbXMsIGtFeHBlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2RhdGEpOworfQorCitURl9MSVRFX01JQ1JPX1RFU1QoQmF0Y2hNYXRNdWxPcFRlc3RGbG9hdDMyVGVzdF9Ccm9hZGNhc3QyKSB7CisgIGNvbnN0ZXhwciBpbnQga0xoc0lucHV0RGltc1tdID0gezQsIDIsIDEsIDMsIDJ9OworICBjb25zdGV4cHIgaW50IGtSaHNJbnB1dERpbXNbXSA9IHszLCAzLCAyLCA0fTsKKyAgY29uc3QgaW50KiBrSW5wdXREaW1zW3RmbGl0ZTo6dGVzdGluZzo6a051bUlucHV0c10gPSB7a0xoc0lucHV0RGltcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1Joc0lucHV0RGltc307CisKKyAgY29uc3RleHByIHNpemVfdCBrTGhzSW5wdXRTaXplID0gMTI7CisgIGZsb2F0IGxoc19pbnB1dFtrTGhzSW5wdXRTaXplXTsKKyAgc3RkOjppb3RhKHN0ZDo6YmVnaW4obGhzX2lucHV0KSwgc3RkOjplbmQobGhzX2lucHV0KSwgMSk7CisKKyAgY29uc3RleHByIHNpemVfdCBrUmhzSW5wdXRTaXplID0gMjQ7CisgIGZsb2F0IHJoc19pbnB1dFtrUmhzSW5wdXRTaXplXTsKKyAgc3RkOjppb3RhKHN0ZDo6YmVnaW4ocmhzX2lucHV0KSwgc3RkOjplbmQocmhzX2lucHV0KSwgNyk7CisKKyAgY29uc3RleHByIGZsb2F0IGtFeHBlY3RbXSA9IHsKKyAgICAgIDI5LiwgIDMyLiwgIDM1LiwgIDM4LiwgIDY1LiwgIDcyLiwgIDc5LiwgIDg2LiwgIDEwMS4sIDExMi4sIDEyMy4sIDEzNC4sCisgICAgICA1My4sICA1Ni4sICA1OS4sICA2Mi4sICAxMjEuLCAxMjguLCAxMzUuLCAxNDIuLCAxODkuLCAyMDAuLCAyMTEuLCAyMjIuLAorICAgICAgNzcuLCAgODAuLCAgODMuLCAgODYuLCAgMTc3LiwgMTg0LiwgMTkxLiwgMTk4LiwgMjc3LiwgMjg4LiwgMjk5LiwgMzEwLiwKKyAgICAgIDEzNy4sIDE1Mi4sIDE2Ny4sIDE4Mi4sIDE3My4sIDE5Mi4sIDIxMS4sIDIzMC4sIDIwOS4sIDIzMi4sIDI1NS4sIDI3OC4sCisgICAgICAyNTcuLCAyNzIuLCAyODcuLCAzMDIuLCAzMjUuLCAzNDQuLCAzNjMuLCAzODIuLCAzOTMuLCA0MTYuLCA0MzkuLCA0NjIuLAorICAgICAgMzc3LiwgMzkyLiwgNDA3LiwgNDIyLiwgNDc3LiwgNDk2LiwgNTE1LiwgNTM0LiwgNTc3LiwgNjAwLiwgNjIzLiwgNjQ2Ln07CisgIGNvbnN0ZXhwciBpbnQga091dHB1dERpbXNbXSA9IHs0LCAyLCAzLCAzLCA0fTsKKyAgY29uc3RleHByIGludCBrT3V0cHV0Q291bnQgPSBzdGQ6OmV4dGVudDxkZWNsdHlwZShrRXhwZWN0KT46OnZhbHVlOworICBmbG9hdCBvdXRwdXRfZGF0YVtrT3V0cHV0Q291bnRdOworCisgIGNvbnN0ZXhwciBUZkxpdGVCYXRjaE1hdE11bFBhcmFtcyBwYXJhbXMgPSB7CisgICAgICBmYWxzZSwgIC8vIGFkal94CisgICAgICBmYWxzZSwgIC8vIGFkal95CisgICAgICBmYWxzZSAgIC8vIGFzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzCisgIH07CisKKyAgdGZsaXRlOjp0ZXN0aW5nOjpUZXN0QmF0Y2hNYXRNdWxGbG9hdChwYXJhbXMsIGtJbnB1dERpbXMsIGxoc19pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaHNfaW5wdXQsIGtPdXRwdXREaW1zLCBrRXhwZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9kYXRhKTsKK30KKworVEZfTElURV9NSUNST19URVNUKEJhdGNoTWF0TXVsT3BUZXN0RmxvYXQzMlRlc3RfQnJvYWRjYXN0MkxIU0Fkam9pbnQpIHsKKyAgY29uc3RleHByIGludCBrTGhzSW5wdXREaW1zW10gPSB7NCwgMiwgMSwgMiwgM307CisgIGNvbnN0ZXhwciBpbnQga1Joc0lucHV0RGltc1tdID0gezMsIDMsIDIsIDR9OworICBjb25zdCBpbnQqIGtJbnB1dERpbXNbdGZsaXRlOjp0ZXN0aW5nOjprTnVtSW5wdXRzXSA9IHtrTGhzSW5wdXREaW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmhzSW5wdXREaW1zfTsKKworICBjb25zdGV4cHIgZmxvYXQga0xoc0lucHV0W10gPSB7MSwgMywgNSwgMiwgNCwgNiwgNywgOSwgMTEsIDgsIDEwLCAxMn07CisKKyAgY29uc3RleHByIHNpemVfdCBrUmhzSW5wdXRTaXplID0gMjQ7CisgIGZsb2F0IHJoc19pbnB1dFtrUmhzSW5wdXRTaXplXTsKKyAgc3RkOjppb3RhKHN0ZDo6YmVnaW4ocmhzX2lucHV0KSwgc3RkOjplbmQocmhzX2lucHV0KSwgNyk7CisKKyAgY29uc3RleHByIGZsb2F0IGtFeHBlY3RbXSA9IHsKKyAgICAgIDI5LiwgIDMyLiwgIDM1LiwgIDM4LiwgIDY1LiwgIDcyLiwgIDc5LiwgIDg2LiwgIDEwMS4sIDExMi4sIDEyMy4sIDEzNC4sCisgICAgICA1My4sICA1Ni4sICA1OS4sICA2Mi4sICAxMjEuLCAxMjguLCAxMzUuLCAxNDIuLCAxODkuLCAyMDAuLCAyMTEuLCAyMjIuLAorICAgICAgNzcuLCAgODAuLCAgODMuLCAgODYuLCAgMTc3LiwgMTg0LiwgMTkxLiwgMTk4LiwgMjc3LiwgMjg4LiwgMjk5LiwgMzEwLiwKKyAgICAgIDEzNy4sIDE1Mi4sIDE2Ny4sIDE4Mi4sIDE3My4sIDE5Mi4sIDIxMS4sIDIzMC4sIDIwOS4sIDIzMi4sIDI1NS4sIDI3OC4sCisgICAgICAyNTcuLCAyNzIuLCAyODcuLCAzMDIuLCAzMjUuLCAzNDQuLCAzNjMuLCAzODIuLCAzOTMuLCA0MTYuLCA0MzkuLCA0NjIuLAorICAgICAgMzc3LiwgMzkyLiwgNDA3LiwgNDIyLiwgNDc3LiwgNDk2LiwgNTE1LiwgNTM0LiwgNTc3LiwgNjAwLiwgNjIzLiwgNjQ2Ln07CisgIGNvbnN0ZXhwciBpbnQga091dHB1dERpbXNbXSA9IHs0LCAyLCAzLCAzLCA0fTsKKyAgY29uc3RleHByIGludCBrT3V0cHV0Q291bnQgPSBzdGQ6OmV4dGVudDxkZWNsdHlwZShrRXhwZWN0KT46OnZhbHVlOworICBmbG9hdCBvdXRwdXRfZGF0YVtrT3V0cHV0Q291bnRdOworCisgIGNvbnN0ZXhwciBUZkxpdGVCYXRjaE1hdE11bFBhcmFtcyBwYXJhbXMgPSB7CisgICAgICB0cnVlLCAgIC8vIGFkal94CisgICAgICBmYWxzZSwgIC8vIGFkal95CisgICAgICBmYWxzZSAgIC8vIGFzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzCisgIH07CisKKyAgdGZsaXRlOjp0ZXN0aW5nOjpUZXN0QmF0Y2hNYXRNdWxGbG9hdChwYXJhbXMsIGtJbnB1dERpbXMsIGtMaHNJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaHNfaW5wdXQsIGtPdXRwdXREaW1zLCBrRXhwZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9kYXRhKTsKK30KKworVEZfTElURV9NSUNST19URVNUKEJhdGNoTWF0TXVsT3BUZXN0RmxvYXQzMlRlc3RfQnJvYWRjYXN0MlJIU0Fkam9pbnQpIHsKKyAgY29uc3RleHByIGludCBrTGhzSW5wdXREaW1zW10gPSB7NCwgMiwgMSwgMywgMn07CisgIGNvbnN0ZXhwciBpbnQga1Joc0lucHV0RGltc1tdID0gezMsIDMsIDQsIDJ9OworICBjb25zdCBpbnQqIGtJbnB1dERpbXNbdGZsaXRlOjp0ZXN0aW5nOjprTnVtSW5wdXRzXSA9IHtrTGhzSW5wdXREaW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmhzSW5wdXREaW1zfTsKKworICBjb25zdGV4cHIgc2l6ZV90IGtMaHNJbnB1dFNpemUgPSAxMjsKKyAgZmxvYXQgbGhzX2lucHV0W2tMaHNJbnB1dFNpemVdOworICBzdGQ6OmlvdGEoc3RkOjpiZWdpbihsaHNfaW5wdXQpLCBzdGQ6OmVuZChsaHNfaW5wdXQpLCAxKTsKKworICBjb25zdGV4cHIgZmxvYXQga1Joc0lucHV0W10gPSB7NywgIDExLCA4LCAgMTIsIDksICAxMywgMTAsIDE0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUsIDE5LCAxNiwgMjAsIDE3LCAyMSwgMTgsIDIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjMsIDI3LCAyNCwgMjgsIDI1LCAyOSwgMjYsIDMwfTsKKworICBjb25zdGV4cHIgZmxvYXQga0V4cGVjdFtdID0geworICAgICAgMjkuLCAgMzIuLCAgMzUuLCAgMzguLCAgNjUuLCAgNzIuLCAgNzkuLCAgODYuLCAgMTAxLiwgMTEyLiwgMTIzLiwgMTM0LiwKKyAgICAgIDUzLiwgIDU2LiwgIDU5LiwgIDYyLiwgIDEyMS4sIDEyOC4sIDEzNS4sIDE0Mi4sIDE4OS4sIDIwMC4sIDIxMS4sIDIyMi4sCisgICAgICA3Ny4sICA4MC4sICA4My4sICA4Ni4sICAxNzcuLCAxODQuLCAxOTEuLCAxOTguLCAyNzcuLCAyODguLCAyOTkuLCAzMTAuLAorICAgICAgMTM3LiwgMTUyLiwgMTY3LiwgMTgyLiwgMTczLiwgMTkyLiwgMjExLiwgMjMwLiwgMjA5LiwgMjMyLiwgMjU1LiwgMjc4LiwKKyAgICAgIDI1Ny4sIDI3Mi4sIDI4Ny4sIDMwMi4sIDMyNS4sIDM0NC4sIDM2My4sIDM4Mi4sIDM5My4sIDQxNi4sIDQzOS4sIDQ2Mi4sCisgICAgICAzNzcuLCAzOTIuLCA0MDcuLCA0MjIuLCA0NzcuLCA0OTYuLCA1MTUuLCA1MzQuLCA1NzcuLCA2MDAuLCA2MjMuLCA2NDYufTsKKyAgY29uc3RleHByIGludCBrT3V0cHV0RGltc1tdID0gezQsIDIsIDMsIDMsIDR9OworICBjb25zdGV4cHIgaW50IGtPdXRwdXRDb3VudCA9IHN0ZDo6ZXh0ZW50PGRlY2x0eXBlKGtFeHBlY3QpPjo6dmFsdWU7CisgIGZsb2F0IG91dHB1dF9kYXRhW2tPdXRwdXRDb3VudF07CisKKyAgY29uc3RleHByIFRmTGl0ZUJhdGNoTWF0TXVsUGFyYW1zIHBhcmFtcyA9IHsKKyAgICAgIGZhbHNlLCAgLy8gYWRqX3gKKyAgICAgIHRydWUsICAgLy8gYWRqX3kKKyAgICAgIGZhbHNlICAgLy8gYXN5bW1ldHJpY19xdWFudGl6ZV9pbnB1dHMKKyAgfTsKKworICB0ZmxpdGU6OnRlc3Rpbmc6OlRlc3RCYXRjaE1hdE11bEZsb2F0KHBhcmFtcywga0lucHV0RGltcywgbGhzX2lucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSaHNJbnB1dCwga091dHB1dERpbXMsIGtFeHBlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2RhdGEpOworfQorCitURl9MSVRFX01JQ1JPX1RFU1QoQmF0Y2hNYXRNdWxPcFRlc3RGbG9hdDMyVGVzdF9Ccm9hZGNhc3QyQm90aEFkam9pbnQpIHsKKyAgY29uc3RleHByIGludCBrTGhzSW5wdXREaW1zW10gPSB7NCwgMiwgMSwgMiwgM307CisgIGNvbnN0ZXhwciBpbnQga1Joc0lucHV0RGltc1tdID0gezMsIDMsIDQsIDJ9OworICBjb25zdCBpbnQqIGtJbnB1dERpbXNbdGZsaXRlOjp0ZXN0aW5nOjprTnVtSW5wdXRzXSA9IHtrTGhzSW5wdXREaW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmhzSW5wdXREaW1zfTsKKworICBjb25zdGV4cHIgZmxvYXQga0xoc0lucHV0W10gPSB7MSwgMywgNSwgMiwgNCwgNiwgNywgOSwgMTEsIDgsIDEwLCAxMn07CisKKyAgY29uc3RleHByIGZsb2F0IGtSaHNJbnB1dFtdID0gezcsICAxMSwgOCwgIDEyLCA5LCAgMTMsIDEwLCAxNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1LCAxOSwgMTYsIDIwLCAxNywgMjEsIDE4LCAyMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzLCAyNywgMjQsIDI4LCAyNSwgMjksIDI2LCAzMH07CisKKyAgY29uc3RleHByIGZsb2F0IGtFeHBlY3RbXSA9IHsKKyAgICAgIDI5LiwgIDMyLiwgIDM1LiwgIDM4LiwgIDY1LiwgIDcyLiwgIDc5LiwgIDg2LiwgIDEwMS4sIDExMi4sIDEyMy4sIDEzNC4sCisgICAgICA1My4sICA1Ni4sICA1OS4sICA2Mi4sICAxMjEuLCAxMjguLCAxMzUuLCAxNDIuLCAxODkuLCAyMDAuLCAyMTEuLCAyMjIuLAorICAgICAgNzcuLCAgODAuLCAgODMuLCAgODYuLCAgMTc3LiwgMTg0LiwgMTkxLiwgMTk4LiwgMjc3LiwgMjg4LiwgMjk5LiwgMzEwLiwKKyAgICAgIDEzNy4sIDE1Mi4sIDE2Ny4sIDE4Mi4sIDE3My4sIDE5Mi4sIDIxMS4sIDIzMC4sIDIwOS4sIDIzMi4sIDI1NS4sIDI3OC4sCisgICAgICAyNTcuLCAyNzIuLCAyODcuLCAzMDIuLCAzMjUuLCAzNDQuLCAzNjMuLCAzODIuLCAzOTMuLCA0MTYuLCA0MzkuLCA0NjIuLAorICAgICAgMzc3LiwgMzkyLiwgNDA3LiwgNDIyLiwgNDc3LiwgNDk2LiwgNTE1LiwgNTM0LiwgNTc3LiwgNjAwLiwgNjIzLiwgNjQ2Ln07CisgIGNvbnN0ZXhwciBpbnQga091dHB1dERpbXNbXSA9IHs0LCAyLCAzLCAzLCA0fTsKKyAgY29uc3RleHByIGludCBrT3V0cHV0Q291bnQgPSBzdGQ6OmV4dGVudDxkZWNsdHlwZShrRXhwZWN0KT46OnZhbHVlOworICBmbG9hdCBvdXRwdXRfZGF0YVtrT3V0cHV0Q291bnRdOworCisgIGNvbnN0ZXhwciBUZkxpdGVCYXRjaE1hdE11bFBhcmFtcyBwYXJhbXMgPSB7CisgICAgICB0cnVlLCAgLy8gYWRqX3gKKyAgICAgIHRydWUsICAvLyBhZGpfeQorICAgICAgZmFsc2UgIC8vIGFzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzCisgIH07CisKKyAgdGZsaXRlOjp0ZXN0aW5nOjpUZXN0QmF0Y2hNYXRNdWxGbG9hdChwYXJhbXMsIGtJbnB1dERpbXMsIGtMaHNJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmhzSW5wdXQsIGtPdXRwdXREaW1zLCBrRXhwZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9kYXRhKTsKK30KKworVEZfTElURV9NSUNST19URVNUKEJhdGNoTWF0TXVsT3BUZXN0RmxvYXQzMlRlc3RfQnJvYWRjYXN0RnJvbVJIUykgeworICBjb25zdGV4cHIgaW50IGtMaHNJbnB1dERpbXNbXSA9IHsyLCA0LCA1fTsKKyAgY29uc3RleHByIGludCBrUmhzSW5wdXREaW1zW10gPSB7NCwgMywgMSwgNSwgMn07CisgIGNvbnN0IGludCoga0lucHV0RGltc1t0ZmxpdGU6OnRlc3Rpbmc6OmtOdW1JbnB1dHNdID0ge2tMaHNJbnB1dERpbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSaHNJbnB1dERpbXN9OworCisgIGNvbnN0ZXhwciBzaXplX3Qga0xoc0lucHV0U2l6ZSA9IDIwOworICBmbG9hdCBsaHNfaW5wdXRba0xoc0lucHV0U2l6ZV07CisgIHN0ZDo6aW90YShzdGQ6OmJlZ2luKGxoc19pbnB1dCksIHN0ZDo6ZW5kKGxoc19pbnB1dCksIDEpOworCisgIGNvbnN0ZXhwciBzaXplX3Qga1Joc0lucHV0U2l6ZSA9IDMwOworICBmbG9hdCByaHNfaW5wdXRba1Joc0lucHV0U2l6ZV07CisgIHN0ZDo6aW90YShzdGQ6OmJlZ2luKHJoc19pbnB1dCksIHN0ZDo6ZW5kKHJoc19pbnB1dCksIDcpOworCisgIGNvbnN0ZXhwciBmbG9hdCBrRXhwZWN0W10gPSB7MTg1LiwgIDIwMC4sICA0NjAuLCAgNTAwLiwgIDczNS4sICA4MDAuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMTAuLCAxMTAwLiwgMzM1LiwgIDM1MC4sICA4NjAuLCAgOTAwLiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzg1LiwgMTQ1MC4sIDE5MTAuLCAyMDAwLiwgNDg1LiwgIDUwMC4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI2MC4sIDEzMDAuLCAyMDM1LiwgMjEwMC4sIDI4MTAuLCAyOTAwLn07CisgIGNvbnN0ZXhwciBpbnQga091dHB1dERpbXNbXSA9IHs0LCAzLCAxLCA0LCAyfTsKKyAgY29uc3RleHByIGludCBrT3V0cHV0Q291bnQgPSBzdGQ6OmV4dGVudDxkZWNsdHlwZShrRXhwZWN0KT46OnZhbHVlOworICBmbG9hdCBvdXRwdXRfZGF0YVtrT3V0cHV0Q291bnRdOworCisgIGNvbnN0ZXhwciBUZkxpdGVCYXRjaE1hdE11bFBhcmFtcyBwYXJhbXMgPSB7CisgICAgICBmYWxzZSwgIC8vIGFkal94CisgICAgICBmYWxzZSwgIC8vIGFkal95CisgICAgICBmYWxzZSAgIC8vIGFzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzCisgIH07CisKKyAgdGZsaXRlOjp0ZXN0aW5nOjpUZXN0QmF0Y2hNYXRNdWxGbG9hdChwYXJhbXMsIGtJbnB1dERpbXMsIGxoc19pbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaHNfaW5wdXQsIGtPdXRwdXREaW1zLCBrRXhwZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9kYXRhKTsKK30KKworVEZfTElURV9NSUNST19URVNUKENvbnN0UkhTQmF0Y2hNYXRNdWxPcE1vZGVsUkhTTm90QWRqb2ludCkgeworICBjb25zdGV4cHIgaW50IGtMaHNJbnB1dERpbXNbXSA9IHszLCAxLCA2LCAyfTsKKyAgY29uc3RleHByIGludCBrUmhzSW5wdXREaW1zW10gPSB7MiwgMiwgM307CisgIGNvbnN0IGludCoga0lucHV0RGltc1t0ZmxpdGU6OnRlc3Rpbmc6OmtOdW1JbnB1dHNdID0ge2tMaHNJbnB1dERpbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSaHNJbnB1dERpbXN9OworCisgIGNvbnN0ZXhwciBmbG9hdCBrTGhzSW5wdXRbXSA9IHs2LCAzLCA3LCA0LCA2LCA5LCAyLCA2LCA3LCA0LCAzLCA3fTsKKworICBjb25zdGV4cHIgZmxvYXQga1Joc0lucHV0W10gPSB7NiwgMywgNywgNCwgNiwgOX07CisKKyAgY29uc3RleHByIGZsb2F0IGtFeHBlY3RbXSA9IHs0OCwgMzYsIDY5LCA1OCwgNDUsIDg1LCA3MiwgNzIsIDEyMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNiwgNDIsIDY4LCA1OCwgNDUsIDg1LCA0NiwgNTEsIDg0fTsKKyAgY29uc3RleHByIGludCBrT3V0cHV0RGltc1tdID0gezMsIDEsIDYsIDN9OworICBjb25zdGV4cHIgaW50IGtPdXRwdXRDb3VudCA9IHN0ZDo6ZXh0ZW50PGRlY2x0eXBlKGtFeHBlY3QpPjo6dmFsdWU7CisgIGZsb2F0IG91dHB1dF9kYXRhW2tPdXRwdXRDb3VudF07CisKKyAgY29uc3RleHByIFRmTGl0ZUJhdGNoTWF0TXVsUGFyYW1zIHBhcmFtcyA9IHsKKyAgICAgIGZhbHNlLCAgLy8gYWRqX3gKKyAgICAgIGZhbHNlLCAgLy8gYWRqX3kKKyAgICAgIGZhbHNlICAgLy8gYXN5bW1ldHJpY19xdWFudGl6ZV9pbnB1dHMKKyAgfTsKKworICB0ZmxpdGU6OnRlc3Rpbmc6OlRlc3RCYXRjaE1hdE11bEZsb2F0KHBhcmFtcywga0lucHV0RGltcywga0xoc0lucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSaHNJbnB1dCwga091dHB1dERpbXMsIGtFeHBlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2RhdGEsIHRydWUpOworICAvLyBFdmFsIHR3aWNlIHRvIG1ha2Ugc3VyZSBjb25zdGFudCB0cmFuc3Bvc2VkIFJIUyBpcyBwZXJzaXN0ZW50LgorICB0ZmxpdGU6OnRlc3Rpbmc6OlRlc3RCYXRjaE1hdE11bEZsb2F0KHBhcmFtcywga0lucHV0RGltcywga0xoc0lucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSaHNJbnB1dCwga091dHB1dERpbXMsIGtFeHBlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2RhdGEsIHRydWUsIGZhbHNlKTsKK30KKworVEZfTElURV9NSUNST19URVNUKFF1YW50aXplZEJhdGNoTWF0TXVsT3BUZXN0U2ltcGxlVGVzdFF1YW50aXplZEludDgpIHsKKyAgY29uc3RleHByIGludCBrTGhzSW5wdXREaW1zW10gPSB7MiwgMiwgMTB9OworICBjb25zdGV4cHIgaW50IGtSaHNJbnB1dERpbXNbXSA9IHsyLCAxMCwgM307CisgIGNvbnN0IGludCoga0lucHV0RGltc1t0ZmxpdGU6OnRlc3Rpbmc6OmtOdW1JbnB1dHNdID0ge2tMaHNJbnB1dERpbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSaHNJbnB1dERpbXN9OworCisgIGNvbnN0ZXhwciBmbG9hdCBrTGhzSW5wdXRbXSA9IHsKKyAgICAgIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsICAtOSwgLTEwLCAgLy8gYiA9IDAKKyAgICAgIDEsIDIsIDMsIDQsIDUsIDYsIDcsIC04LCA5LCAgLTEwLCAgLy8gYiA9IDEKKyAgfTsKKyAgY29uc3RleHByIGludCBrTGhzSW5wdXRDb3VudCA9IHN0ZDo6ZXh0ZW50PGRlY2x0eXBlKGtMaHNJbnB1dCk+Ojp2YWx1ZTsKKworICBjb25zdGV4cHIgZmxvYXQga1Joc0lucHV0W10gPSB7CisgICAgICAxLCAxLCAxLCAyLCAyLCAyLCAzLCAzLCAzLCA0LCA0LCA0LCA1LCAgNSwgIDUsCisgICAgICA2LCA2LCA2LCA3LCA3LCA3LCA4LCA4LCA4LCA5LCA5LCA5LCAxMCwgMTAsIDEwLAorICB9OworICBjb25zdGV4cHIgaW50IGtSaHNJbnB1dENvdW50ID0gc3RkOjpleHRlbnQ8ZGVjbHR5cGUoa1Joc0lucHV0KT46OnZhbHVlOworCisgIGNvbnN0ZXhwciBpbnQ4X3Qga0V4cGVjdFtdID0gezIyLCAyMiwgMjIsIDU2LCA1NiwgNTZ9OworICBjb25zdGV4cHIgaW50IGtPdXRwdXREaW1zW10gPSB7MiwgMiwgM307CisgIGNvbnN0ZXhwciBpbnQga091dHB1dENvdW50ID0gc3RkOjpleHRlbnQ8ZGVjbHR5cGUoa0V4cGVjdCk+Ojp2YWx1ZTsKKyAgY29uc3RleHByIGZsb2F0IG91dHB1dF9kYXRhW2tPdXRwdXRDb3VudF0gPSB7MjMsIDIzLCAyMywgNTcsIDU3LCA1N307CisKKyAgY29uc3RleHByIFRmTGl0ZUJhdGNoTWF0TXVsUGFyYW1zIHBhcmFtcyA9IHsKKyAgICAgIGZhbHNlLCAgLy8gYWRqX3gKKyAgICAgIGZhbHNlLCAgLy8gYWRqX3kKKyAgICAgIGZhbHNlICAgLy8gYXN5bW1ldHJpY19xdWFudGl6ZV9pbnB1dHMKKyAgfTsKKworICB0ZmxpdGU6OnRlc3Rpbmc6OlRlc3RRdWFudGl6YXRpb25QYXJhbXM8aW50OF90LCBrTGhzSW5wdXRDb3VudD4KKyAgICAgIHF1YW50aXphdGlvbl9wYXJhbXNfbGhzID0gezAuMGYsICAgIC8vIHNjYWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAvLyB6ZXJvX3BvaW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNjMuNWYsICAvLyBkYXRhX21pbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQuMGYsICAgLy8gZGF0YV9tYXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt9fTsKKyAgdGZsaXRlOjp0ZXN0aW5nOjpUZXN0UXVhbnRpemF0aW9uUGFyYW1zPGludDhfdCwga1Joc0lucHV0Q291bnQ+CisgICAgICBxdWFudGl6YXRpb25fcGFyYW1zX3JocyA9IHswLjBmLCAgICAvLyBzY2FsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgLy8gemVyb19wb2ludAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYzLjVmLCAgLy8gZGF0YV9taW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0LjBmLCAgIC8vIGRhdGFfbWF4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7fX07CisgIHRmbGl0ZTo6dGVzdGluZzo6VGVzdFF1YW50aXphdGlvblBhcmFtczxpbnQ4X3QsIGtPdXRwdXRDb3VudD4KKyAgICAgIHF1YW50aXphdGlvbl9wYXJhbXNfb3V0cHV0ID0gezAuMGYsICAgICAvLyBzY2FsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgICAgICAgIC8vIHplcm9fcG9pbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMjcuMGYsICAvLyBkYXRhX21pbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI4LjBmLCAgIC8vIGRhdGFfbWF4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7fX07CisKKyAgdGZsaXRlOjp0ZXN0aW5nOjpUZXN0QmF0Y2hNYXRNdWxRdWFudGl6ZWQ8aW50OF90PigKKyAgICAgIHBhcmFtcywgJnF1YW50aXphdGlvbl9wYXJhbXNfbGhzLCAmcXVhbnRpemF0aW9uX3BhcmFtc19yaHMsCisgICAgICAmcXVhbnRpemF0aW9uX3BhcmFtc19vdXRwdXQsIGtJbnB1dERpbXMsIGtMaHNJbnB1dCwga1Joc0lucHV0LAorICAgICAga091dHB1dERpbXMsIGtFeHBlY3QsIG91dHB1dF9kYXRhKTsKK30KKworVEZfTElURV9NSUNST19URVNUKFF1YW50aXplZEJhdGNoTWF0TXVsT3BUZXN0U2ltcGxlVGVzdFF1YW50aXplZEludDE2KSB7CisgIGNvbnN0ZXhwciBpbnQga0xoc0lucHV0RGltc1tdID0gezIsIDIsIDEwfTsKKyAgY29uc3RleHByIGludCBrUmhzSW5wdXREaW1zW10gPSB7MiwgMTAsIDN9OworICBjb25zdCBpbnQqIGtJbnB1dERpbXNbdGZsaXRlOjp0ZXN0aW5nOjprTnVtSW5wdXRzXSA9IHtrTGhzSW5wdXREaW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmhzSW5wdXREaW1zfTsKKworICBjb25zdGV4cHIgZmxvYXQga0xoc0lucHV0W10gPSB7CisgICAgICAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCAgLTksIC0xMCwgIC8vIGIgPSAwCisgICAgICAxLCAyLCAzLCA0LCA1LCA2LCA3LCAtOCwgOSwgIC0xMCwgIC8vIGIgPSAxCisgIH07CisgIGNvbnN0ZXhwciBpbnQga0xoc0lucHV0Q291bnQgPSBzdGQ6OmV4dGVudDxkZWNsdHlwZShrTGhzSW5wdXQpPjo6dmFsdWU7CisKKyAgY29uc3RleHByIGZsb2F0IGtSaHNJbnB1dFtdID0geworICAgICAgMSwgMSwgMSwgMiwgMiwgMiwgMywgMywgMywgNCwgNCwgNCwgNSwgIDUsICA1LAorICAgICAgNiwgNiwgNiwgNywgNywgNywgOCwgOCwgOCwgOSwgOSwgOSwgMTAsIDEwLCAxMCwKKyAgfTsKKyAgY29uc3RleHByIGludCBrUmhzSW5wdXRDb3VudCA9IHN0ZDo6ZXh0ZW50PGRlY2x0eXBlKGtSaHNJbnB1dCk+Ojp2YWx1ZTsKKworICBjb25zdGV4cHIgaW50MTZfdCBrRXhwZWN0W10gPSB7MjMsIDIzLCAyMywgNTcsIDU3LCA1N307CisgIGNvbnN0ZXhwciBpbnQga091dHB1dERpbXNbXSA9IHsyLCAyLCAzfTsKKyAgY29uc3RleHByIGludCBrT3V0cHV0Q291bnQgPSBzdGQ6OmV4dGVudDxkZWNsdHlwZShrRXhwZWN0KT46OnZhbHVlOworICBjb25zdGV4cHIgZmxvYXQgb3V0cHV0X2RhdGFba091dHB1dENvdW50XSA9IHsyMywgMjMsIDIzLCA1NywgNTcsIDU3fTsKKworICBjb25zdGV4cHIgVGZMaXRlQmF0Y2hNYXRNdWxQYXJhbXMgcGFyYW1zID0geworICAgICAgZmFsc2UsICAvLyBhZGpfeAorICAgICAgZmFsc2UsICAvLyBhZGpfeQorICAgICAgZmFsc2UgICAvLyBhc3ltbWV0cmljX3F1YW50aXplX2lucHV0cworICB9OworCisgIHRmbGl0ZTo6dGVzdGluZzo6VGVzdFF1YW50aXphdGlvblBhcmFtczxpbnQxNl90LCBrTGhzSW5wdXRDb3VudD4KKyAgICAgIHF1YW50aXphdGlvbl9wYXJhbXNfbGhzID0ge307CisgIHF1YW50aXphdGlvbl9wYXJhbXNfbGhzLnNjYWxlID0gMTAuMGYgLyBzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptYXgoKTsKKyAgdGZsaXRlOjp0ZXN0aW5nOjpUZXN0UXVhbnRpemF0aW9uUGFyYW1zPGludDE2X3QsIGtSaHNJbnB1dENvdW50PgorICAgICAgcXVhbnRpemF0aW9uX3BhcmFtc19yaHMgPSB7fTsKKyAgcXVhbnRpemF0aW9uX3BhcmFtc19yaHMuc2NhbGUgPSAxMC4wZiAvIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MTZfdD46Om1heCgpOworCisgIHRmbGl0ZTo6dGVzdGluZzo6VGVzdFF1YW50aXphdGlvblBhcmFtczxpbnQxNl90LCBrT3V0cHV0Q291bnQ+CisgICAgICBxdWFudGl6YXRpb25fcGFyYW1zX291dHB1dCA9IHt9OworICBxdWFudGl6YXRpb25fcGFyYW1zX291dHB1dC5zY2FsZSA9IDEuMGY7CisKKyAgdGZsaXRlOjp0ZXN0aW5nOjpUZXN0QmF0Y2hNYXRNdWxRdWFudGl6ZWQ8aW50MTZfdD4oCisgICAgICBwYXJhbXMsICZxdWFudGl6YXRpb25fcGFyYW1zX2xocywgJnF1YW50aXphdGlvbl9wYXJhbXNfcmhzLAorICAgICAgJnF1YW50aXphdGlvbl9wYXJhbXNfb3V0cHV0LCBrSW5wdXREaW1zLCBrTGhzSW5wdXQsIGtSaHNJbnB1dCwKKyAgICAgIGtPdXRwdXREaW1zLCBrRXhwZWN0LCBvdXRwdXRfZGF0YSk7Cit9CisKK1RGX0xJVEVfTUlDUk9fVEVTVFNfRU5ECmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9iYXRjaF90b19zcGFjZV9uZC5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2JhdGNoX3RvX3NwYWNlX25kLmNjCmluZGV4IDA5MGEwNDAuLjMxYTFjMjggMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2JhdGNoX3RvX3NwYWNlX25kLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2JhdGNoX3RvX3NwYWNlX25kLmNjCkBAIC0zOCw3ICszOCw3IEBACiBjb25zdCBpbnQga0lucHV0T3V0cHV0TWluRGltZW5zaW9uTnVtID0gMzsKIGNvbnN0IGludCBrSW5wdXRPdXRwdXRNYXhEaW1lbnNpb25OdW0gPSA0OwogCi1UZkxpdGVTdGF0dXMgUHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgQmF0Y2hUb1NwYWNlTkRQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgTnVtSW5wdXRzKG5vZGUpLCAzKTsKICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgTnVtT3V0cHV0cyhub2RlKSwgMSk7CiAKQEAgLTYyLDcgKzYyLDcgQEAKICAgcmV0dXJuIGtUZkxpdGVPazsKIH0KIAotVGZMaXRlU3RhdHVzIEV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworVGZMaXRlU3RhdHVzIEJhdGNoVG9TcGFjZU5ERXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0ID0KICAgICAgIHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dChjb250ZXh0LCBub2RlLCBrSW5wdXRUZW5zb3IpOwogICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBibG9ja19zaGFwZSA9CkBAIC0xMDYsNyArMTA2LDggQEAKIH0gIC8vIG5hbWVzcGFjZS4KIAogVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9CQVRDSF9UT19TUEFDRV9ORCgpIHsKLSAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AobnVsbHB0ciwgUHJlcGFyZSwgRXZhbCk7CisgIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKG51bGxwdHIsIEJhdGNoVG9TcGFjZU5EUHJlcGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmF0Y2hUb1NwYWNlTkRFdmFsKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvY2FsbF9vbmNlLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvY2FsbF9vbmNlLmNjCmluZGV4IDhhZDFjMjAuLjY1ODU3ZWYgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2NhbGxfb25jZS5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jYWxsX29uY2UuY2MKQEAgLTM2LDEyICszNiwxMiBAQAogICBib29sIGhhc19ydW47CiB9OwogCi12b2lkKiBJbml0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgewordm9pZCogQ2FsbE9uY2VJbml0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgewogICBURkxJVEVfRENIRUNLKGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlciAhPSBudWxscHRyKTsKICAgcmV0dXJuIGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlcihjb250ZXh0LCBzaXplb2YoT3BEYXRhKSk7CiB9CiAKLVRmTGl0ZVN0YXR1cyBQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBDYWxsT25jZVByZXBhcmUoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBPcERhdGEqIG9wX2RhdGEgPSByZWludGVycHJldF9jYXN0PE9wRGF0YSo+KG5vZGUtPnVzZXJfZGF0YSk7CiAgIGNvbnN0IGF1dG8qIHBhcmFtcyA9CiAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IFRmTGl0ZUNhbGxPbmNlUGFyYW1zKj4obm9kZS0+YnVpbHRpbl9kYXRhKTsKQEAgLTYwLDcgKzYwLDcgQEAKICAgcmV0dXJuIGtUZkxpdGVPazsKIH0KIAotVGZMaXRlU3RhdHVzIEV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworVGZMaXRlU3RhdHVzIENhbGxPbmNlRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIE9wRGF0YSogb3BfZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8T3BEYXRhKj4obm9kZS0+dXNlcl9kYXRhKTsKIAogICAvLyBDYWxsIG9uY2Ugb25seSBydW5zIG9uZSB0aW1lIHRoZW4gaXMgYSBuby1vcCBmb3IgZXZlcnkgc3Vic2VxdWVudCBjYWxsLgpAQCAtODIsNyArODIsNyBAQAogfSAgLy8gbmFtZXNwYWNlLgogCiBURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX0NBTExfT05DRSgpIHsKLSAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoSW5pdCwgUHJlcGFyZSwgRXZhbCk7CisgIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKENhbGxPbmNlSW5pdCwgQ2FsbE9uY2VQcmVwYXJlLCBDYWxsT25jZUV2YWwpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jYXN0LmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvY2FzdC5jYwppbmRleCBhNDkzNjE4Li4wYjQ1MGQ2IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jYXN0LmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2Nhc3QuY2MKQEAgLTEsNCArMSw0IEBACi0vKiBDb3B5cmlnaHQgMjAyMSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLyogQ29weXJpZ2h0IDIwMjMgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIAogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0yNSw3ICsyNSw3IEBACiBjb25zdGV4cHIgaW50IGtJbnB1dFRlbnNvciA9IDA7CiBjb25zdGV4cHIgaW50IGtPdXRwdXRUZW5zb3IgPSAwOwogCi1UZkxpdGVTdGF0dXMgUHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgQ2FzdFByZXBhcmUoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBOdW1JbnB1dHMobm9kZSksIDEpOwogICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBOdW1PdXRwdXRzKG5vZGUpLCAxKTsKIApAQCAtNjMsNiArNjMsOSBAQAogICAgIGNhc2Uga1RmTGl0ZUludDMyOgogICAgICAgY29weUNhc3QoaW4sIG91dC0+ZGF0YS5pMzIsIG51bV9lbGVtZW50cyk7CiAgICAgICBicmVhazsKKyAgICBjYXNlIGtUZkxpdGVVSW50MzI6CisgICAgICBjb3B5Q2FzdChpbiwgb3V0LT5kYXRhLnUzMiwgbnVtX2VsZW1lbnRzKTsKKyAgICAgIGJyZWFrOwogICAgIGNhc2Uga1RmTGl0ZUZsb2F0MzI6CiAgICAgICBjb3B5Q2FzdChpbiwgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxmbG9hdD4ob3V0KSwgbnVtX2VsZW1lbnRzKTsKICAgICAgIGJyZWFrOwpAQCAtNzQsNyArNzcsNyBAQAogICByZXR1cm4ga1RmTGl0ZU9rOwogfQogCi1UZkxpdGVTdGF0dXMgRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgQ2FzdEV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dCA9CiAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsSW5wdXQoY29udGV4dCwgbm9kZSwga0lucHV0VGVuc29yKTsKICAgVGZMaXRlRXZhbFRlbnNvciogb3V0cHV0ID0KQEAgLTk4LDYgKzEwMSw5IEBACiAgICAgY2FzZSBrVGZMaXRlRmxvYXQzMjoKICAgICAgIHJldHVybiBjb3B5VG9UZW5zb3IoY29udGV4dCwgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxmbG9hdD4oaW5wdXQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsIG51bV9lbGVtZW50cyk7CisgICAgY2FzZSBrVGZMaXRlQm9vbDoKKyAgICAgIHJldHVybiBjb3B5VG9UZW5zb3IoY29udGV4dCwgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxib29sPihpbnB1dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwgbnVtX2VsZW1lbnRzKTsKICAgICBkZWZhdWx0OgogICAgICAgLy8gVW5zdXBwb3J0ZWQgdHlwZS4KICAgICAgIE1pY3JvUHJpbnRmKCJJbnB1dCB0eXBlICVzICglZCkgbm90IHN1cHBvcnRlZC4iLApAQCAtMTA4LDcgKzExNCw3IEBACiB9ICAvLyBuYW1lc3BhY2UKIAogVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9DQVNUKCkgewotICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChudWxscHRyLCBQcmVwYXJlLCBFdmFsKTsKKyAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AobnVsbHB0ciwgQ2FzdFByZXBhcmUsIENhc3RFdmFsKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvY2FzdF90ZXN0LmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvY2FzdF90ZXN0LmNjCmluZGV4IGY1YWI2NjAuLjg2MjU1NzIgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2Nhc3RfdGVzdC5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jYXN0X3Rlc3QuY2MKQEAgLTEsNCArMSw0IEBACi0vKiBDb3B5cmlnaHQgMjAyMSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLyogQ29weXJpZ2h0IDIwMjMgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIAogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xMTMsNCArMTEzLDI4IEBACiAgIHRmbGl0ZTo6dGVzdGluZzo6VGVzdENhc3QoaW5wdXRfZGltcywgaW5wdXRfdmFsdWVzLCBnb2xkZW4sIG91dHB1dF9kYXRhKTsKIH0KIAorVEZfTElURV9NSUNST19URVNUKENhc3RVSW50MzJUb0ludDMyKSB7CisgIGludDMyX3Qgb3V0cHV0X2RhdGFbNl07CisgIGludCBpbnB1dF9kaW1zW10gPSB7MiwgMiwgM307CisgIGNvbnN0IHVpbnQzMl90IGlucHV0X3ZhbHVlc1tdID0gezEwMCwgMjAwLCAzMDAsIDQwMCwgNTAwLCA2MDB9OworICBjb25zdCBpbnQzMl90IGdvbGRlbltdID0gezEwMCwgMjAwLCAzMDAsIDQwMCwgNTAwLCA2MDB9OworICB0ZmxpdGU6OnRlc3Rpbmc6OlRlc3RDYXN0KGlucHV0X2RpbXMsIGlucHV0X3ZhbHVlcywgZ29sZGVuLCBvdXRwdXRfZGF0YSk7Cit9CisKK1RGX0xJVEVfTUlDUk9fVEVTVChDYXN0VUludDMyVG9JbnQzMikgeworICB1aW50MzJfdCBvdXRwdXRfZGF0YVs2XTsKKyAgaW50IGlucHV0X2RpbXNbXSA9IHsyLCAyLCAzfTsKKyAgY29uc3QgaW50MzJfdCBpbnB1dF92YWx1ZXNbXSA9IHsxMDAsIDIwMCwgMzAwLCA0MDAsIDUwMCwgNjAwfTsKKyAgY29uc3QgdWludDMyX3QgZ29sZGVuW10gPSB7MTAwLCAyMDAsIDMwMCwgNDAwLCA1MDAsIDYwMH07CisgIHRmbGl0ZTo6dGVzdGluZzo6VGVzdENhc3QoaW5wdXRfZGltcywgaW5wdXRfdmFsdWVzLCBnb2xkZW4sIG91dHB1dF9kYXRhKTsKK30KKworVEZfTElURV9NSUNST19URVNUKENhc3RCb29sVG9GbG9hdCkgeworICBmbG9hdCBvdXRwdXRfZGF0YVs2XTsKKyAgaW50IGlucHV0X2RpbXNbXSA9IHsyLCAyLCAzfTsKKyAgY29uc3QgYm9vbCBpbnB1dF92YWx1ZXNbXSA9IHt0cnVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWV9OworICBjb25zdCBmbG9hdCBnb2xkZW5bXSA9IHsxLmYsIDEuMGYsIDAuZiwgMS4wZiwgMC4wZiwgMS4wZn07CisgIHRmbGl0ZTo6dGVzdGluZzo6VGVzdENhc3QoaW5wdXRfZGltcywgaW5wdXRfdmFsdWVzLCBnb2xkZW4sIG91dHB1dF9kYXRhKTsKK30KKwogVEZfTElURV9NSUNST19URVNUU19FTkQKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2NlaWwuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jZWlsLmNjCmluZGV4IDQ2YjU1ZTcuLjM2MTM5ZjkgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2NlaWwuY2MKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvY2VpbC5jYwpAQCAtMjcsNyArMjcsNyBAQAogY29uc3RleHByIGludCBrSW5wdXRUZW5zb3IgPSAwOwogY29uc3RleHByIGludCBrT3V0cHV0VGVuc29yID0gMDsKIAotVGZMaXRlU3RhdHVzIFByZXBhcmUoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworVGZMaXRlU3RhdHVzIENlaWxQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgTWljcm9Db250ZXh0KiBtaWNyb19jb250ZXh0ID0gR2V0TWljcm9Db250ZXh0KGNvbnRleHQpOwogCiAgIFRmTGl0ZVRlbnNvciogaW5wdXQgPQpAQCAtNTAsNyArNTAsNyBAQAogICByZXR1cm4ga1RmTGl0ZU9rOwogfQogCi1UZkxpdGVTdGF0dXMgRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgQ2VpbEV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dCA9CiAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsSW5wdXQoY29udGV4dCwgbm9kZSwga0lucHV0VGVuc29yKTsKICAgVGZMaXRlRXZhbFRlbnNvciogb3V0cHV0ID0KQEAgLTY3LDcgKzY3LDcgQEAKIH0gIC8vIG5hbWVzcGFjZQogCiBURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX0NFSUwoKSB7Ci0gIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKG51bGxwdHIsIFByZXBhcmUsIEV2YWwpOworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChudWxscHRyLCBDZWlsUHJlcGFyZSwgQ2VpbEV2YWwpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jbXNpc19ubi9SRUFETUUubWQgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jbXNpc19ubi9SRUFETUUubWQKaW5kZXggZTRhNGRlMy4uZGM1MzFiNyAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvY21zaXNfbm4vUkVBRE1FLm1kCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2Ntc2lzX25uL1JFQURNRS5tZApAQCAtMSwxMiArMSwxNCBAQAogPCEtLSBtZGZvcm1hdCBvZmYoYi8xNjk5NDg2MjEjY29tbWVudDIpIC0tPgogCi0jIEluZm8KKyMgR2VuZXJhbCBJbmZvCiBDTVNJUy1OTiBpcyBhIGxpYnJhcnkgY29udGFpbmluZyBrZXJuZWwgb3B0aW1pemF0aW9ucyBmb3IgQXJtKFIpIENvcnRleChSKS1NCiBwcm9jZXNzb3JzLiBUbyB1c2UgQ01TSVMtTk4gb3B0aW1pemVkIGtlcm5lbHMgaW5zdGVhZCBvZiByZWZlcmVuY2Uga2VybmVscywgYWRkCiBgT1BUSU1JWkVEX0tFUk5FTF9ESVI9Y21zaXNfbm5gIHRvIHRoZSBtYWtlIGNvbW1hbmQgbGluZS4gU2VlIGV4YW1wbGVzIGJlbG93LgogCiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3B0aW1pemF0aW9ucywgY2hlY2sgb3V0Ci1bQ01TSVMtTk4gZG9jdW1lbnRhdGlvbl0oaHR0cHM6Ly9naXRodWIuY29tL0FSTS1zb2Z0d2FyZS9DTVNJU181L2Jsb2IvZGV2ZWxvcC9DTVNJUy9OTi9SRUFETUUubWQpLgorW0NNU0lTLU5OIGRvY3VtZW50YXRpb25dKGh0dHBzOi8vZ2l0aHViLmNvbS9BUk0tc29mdHdhcmUvQ01TSVMtTk4vYmxvYi9tYWluL1JFQURNRS5tZCksCisKKyMgU3BlY2lmeWluZyBwYXRoIHRvIENNU0lTLU5OCiAKIEJ5IGRlZmF1bHQgQ01TSVMtTk4gaXMgYnVpbHQgYnkgY29kZSB0aGF0IGlzIGRvd25sb2FkZWQgdG8gdGhlIFRGTE0gdHJlZS4KIEl0IGFsc28gcG9zc2libGUgdG8gYnVpbGQgQ01TSVMtTk4gY29kZSBmcm9tIGFuIGV4dGVybmFsIHBhdGggYnkgc3BlY2lmeWluZwpAQCAtMTQsNyArMTYsNyBAQAogc2luY2UgQ01TSVMtTk4gaGFzIGEgZGVwZW5kZW5jeSB0byBDTVNJUy1Db3JlLiBBcyBhIHRoaXJkIG9wdGlvbiBDTVNJUy1OTiBjYW4gYmUgcHJvdmlkZWQgbWFudWFsbHkgYXMgYW4gZXh0ZXJuYWwgbGlicmFyeS4KIFRoZSBleGFtcGxlcyBiZWxvdyB3aWxsIGlsbHVzdHJhdGUgdGhpcy4KIAotIyBFeGFtcGxlIC0gRlZQIGJhc2VkIG9uIEFybSBDb3JzdG9uZS0zMDAgc29mdHdhcmUuCisjIyBFeGFtcGxlIC0gRlZQIGJhc2VkIG9uIEFybSBDb3JzdG9uZS0zMDAgc29mdHdhcmUuCiBJbiB0aGlzIGV4YW1wbGUsIHRoZSBrZXJuZWwgY29udiB1bml0IHRlc3QgaXMgYnVpbHQuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0CiB0aGlzIHNwZWNpZmljIHRhcmdldCwgY2hlY2sgb3V0IHRoZSBbQ29yc3RvbmUtMzAwIHJlYWRtZV0oaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZsaXRlLW1pY3JvL3RyZWUvbWFpbi90ZW5zb3JmbG93L2xpdGUvbWljcm8vY29ydGV4X21fY29yc3RvbmVfMzAwL1JFQURNRS5tZCkuCiAKQEAgLTM5LDMgKzQxLDIyIEBACiBBbHNvIG5vdGUgdGhhdCBpZiBzcGVjaWZ5aW5nIENNU0lTX05OX0xJQlMgYnV0IG5vdCBDTVNJU19QQVRIIGFuZCBvciBDTVNJU19OTl9QQVRILCBoZWFkZXJzIGFuZAogc3lzdGVtL3N0YXJ0dXAgY29kZSBmcm9tIHRoZSBkZWZhdWx0IGRvd25sb2FkZWQgcGF0aCBvZiBDTVNJUyB3b3VsZCBiZSB1c2VkLgogU28gQ01TSVNfTk5fTElCUywgQ01TSVNfTk5fUEFUSCBhbmQgQ01TSVNfUEFUSCBzaG91bGQgaGF2ZSB0aGUgc2FtZSBiYXNlIHBhdGggYW5kIGlmIG5vdCB0aGVyZSB3aWxsIGJlIGEgYnVpbGQgZXJyb3IuCisKKyMgQnVpbGQgZm9yIHNwZWVkIG9yIHNpemUKK0l0IGlzIHBvc3NpYmxlIHRvIGJ1aWxkIGZvciBzcGVlZCBvciBzaXplLiBUaGUgc2l6ZSBvcHRpb24gbWF5IGJlIHJlcXVpcmVkIGZvciBhIGxhcmdlIG1vZGVsIG9uIGFuIGVtYmVkZGVkIHN5c3RlbSB3aXRoIGxpbWl0ZWQgbWVtb3J5LiBXaGVyZSBhcHBsaWNhYmxlLCBidWlsZGluZyBmb3Igc2l6ZSB3b3VsZCByZXN1bHQgaW4gaGlnaGVyIGxhdGVuY3kgcGFpcmVkIHdpdGggYSBzbWFsbGVyIHNjcmF0Y2ggYnVmZmVyLCB3aGVyZWFzIGJ1aWxkaW5nIGZvciBzcGVlZCB3b3VsZCByZXN1bHQgaW4gbG93ZXIgbGF0ZW5jeSB3aXRoIGEgbGFyZ2VyIHNjcmF0Y2ggYnVmZmVyLiBDdXJyZW50bHkgb25seSB0cmFuc3Bvc2UgY29udiBzdXBwb3J0cyB0aGlzLiAgU2VlIGV4YW1wbGVzIGJlbG93LgorCisjIyBFeGFtcGxlIC0gYnVpbGRpbmcgYSBzdGF0aWMgbGlicmFyeSB3aXRoIENNU0lTLU5OIG9wdGltaXplZCBrZXJuZWxzCitNb3JlIGluZm8gb24gdGhlIHRhcmdldCB1c2VkIGluIHRoaXMgZXhhbXBsZTogaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZsaXRlLW1pY3JvL2Jsb2IvbWFpbi90ZW5zb3JmbG93L2xpdGUvbWljcm8vY29ydGV4X21fZ2VuZXJpYy9SRUFETUUubWQKKworQnVsZGluZyBmb3Igc3BlZWQgKGRlZmF1bHQpOgorTm90ZSB0aGF0IHNwZWVkIGlzIGRlZmF1bHQgc28gaWYgbGVhdmluZyBvdXQgT1BUSU1JWkVfS0VSTkVMU19GT1IgY29tcGxldGVseSB0aGF0IHdpbGwgYmUgdGhlIGRlZmF1bHQuCitgYGAKK21ha2UgLWYgdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvTWFrZWZpbGUgVEFSR0VUPWNvcnRleF9tX2dlbmVyaWMgVEFSR0VUX0FSQ0g9Y29ydGV4LW01NSBPUFRJTUlaRURfS0VSTkVMX0RJUj1jbXNpc19ubiBPUFRJTUlaRV9LRVJORUxTX0ZPUj1LRVJORUxTX09QVElNSVpFRF9GT1JfU1BFRUQgbWljcm9saXRlCisKK2BgYAorCitCdWxkaW5nIGZvciBzaXplOgorYGBgCittYWtlIC1mIHRlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL01ha2VmaWxlIFRBUkdFVD1jb3J0ZXhfbV9nZW5lcmljIFRBUkdFVF9BUkNIPWNvcnRleC1tNTUgT1BUSU1JWkVEX0tFUk5FTF9ESVI9Y21zaXNfbm4gT1BUSU1JWkVfS0VSTkVMU19GT1I9S0VSTkVMU19PUFRJTUlaRURfRk9SX1NJWkUgbWljcm9saXRlCisKK2BgYApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvY21zaXNfbm4vYWRkLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvY21zaXNfbm4vYWRkLmNjCmluZGV4IDg5ODQxMGEuLmZiMTY2YTEgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2Ntc2lzX25uL2FkZC5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jbXNpc19ubi9hZGQuY2MKQEAgLTEsNCArMSw0IEBACi0vKiBDb3B5cmlnaHQgMjAyMiBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLyogQ29weXJpZ2h0IDIwMjQgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIAogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0zMDEsNiArMzAxLDE1IEBACiAgICAgICBtaWNyb19jb250ZXh0LT5BbGxvY2F0ZVRlbXBPdXRwdXRUZW5zb3Iobm9kZSwga091dHB1dFRlbnNvcik7CiAgIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIG91dHB1dCAhPSBudWxscHRyKTsKIAorICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBpbnB1dDEtPnR5cGUsIG91dHB1dC0+dHlwZSk7CisgIFRGX0xJVEVfRU5TVVJFX01TRygKKyAgICAgIGNvbnRleHQsCisgICAgICBpbnB1dDEtPnR5cGUgPT0ga1RmTGl0ZUZsb2F0MzIgfHwgaW5wdXQxLT50eXBlID09IGtUZkxpdGVJbnQzMiB8fAorICAgICAgICAgIGlucHV0MS0+dHlwZSA9PSBrVGZMaXRlSW50MTYgfHwgaW5wdXQxLT50eXBlID09IGtUZkxpdGVJbnQ4LAorICAgICAgIklucHV0IGRhdGEgdHlwZSBub3Qgc3VwcG9ydGVkIik7CisgIFRGX0xJVEVfRU5TVVJFX01TRyhjb250ZXh0LCBpbnB1dDEtPnR5cGUgPT0gaW5wdXQyLT50eXBlLAorICAgICAgICAgICAgICAgICAgICAgIkh5YnJpZCBtb2RlbHMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gVEZMaXRlIE1pY3JvLiIpOworCiAgIGlmIChpbnB1dDEtPnR5cGUgPT0ga1RmTGl0ZUludDE2KSB7CiAgICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgaW5wdXQxLT5wYXJhbXMuemVyb19wb2ludCwgMCk7CiAgICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgaW5wdXQyLT5wYXJhbXMuemVyb19wb2ludCwgMCk7CmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jbXNpc19ubi9jb252LmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvY21zaXNfbm4vY29udi5jYwppbmRleCA4YjY5MjhiLi5jYWU2OGM3IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jbXNpc19ubi9jb252LmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2Ntc2lzX25uL2NvbnYuY2MKQEAgLTEsNCArMSw0IEBACi0vKiBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLyogQ29weXJpZ2h0IDIwMjQgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIAogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvY29tbW9uLmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvcXVhbnRpemF0aW9uX3V0aWwuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9yZWZlcmVuY2UvY29udi5oIgotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3JlZmVyZW5jZS9pbnRlZ2VyX29wcy9jb252LmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvdGVuc29yX2N0eXBlcy5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2tlcm5lbF91dGlsLmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMvcGFkZGluZy5oIgpAQCAtNjMsMzkgKzYyLDYyIEBACiAgIFRmTGl0ZVRlbnNvciogb3V0cHV0ID0KICAgICAgIG1pY3JvX2NvbnRleHQtPkFsbG9jYXRlVGVtcE91dHB1dFRlbnNvcihub2RlLCBrQ29udk91dHB1dFRlbnNvcik7CiAgIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIG91dHB1dCAhPSBudWxscHRyKTsKKyAgVGZMaXRlVGVuc29yKiBiaWFzID0KKyAgICAgIG1pY3JvX2NvbnRleHQtPkFsbG9jYXRlVGVtcE91dHB1dFRlbnNvcihub2RlLCBrQ29udkJpYXNUZW5zb3IpOworICBUZkxpdGVUeXBlIGJpYXNfdHlwZSA9IGJpYXMgIT0gbnVsbHB0ciA/IGJpYXMtPnR5cGUgOiBrVGZMaXRlTm9UeXBlOwogCi0gIFJ1bnRpbWVTaGFwZSBpbnB1dF9zaGFwZSA9IEdldFRlbnNvclNoYXBlKGlucHV0KTsKLSAgUnVudGltZVNoYXBlIG91dHB1dF9zaGFwZSA9IEdldFRlbnNvclNoYXBlKG91dHB1dCk7CisgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIGlucHV0LT50eXBlLCBvdXRwdXQtPnR5cGUpOworICBURl9MSVRFX0VOU1VSRV9NU0coY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgIGlucHV0LT50eXBlID09IGtUZkxpdGVGbG9hdDMyIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQtPnR5cGUgPT0ga1RmTGl0ZUludDE2IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQtPnR5cGUgPT0ga1RmTGl0ZUludDgsCisgICAgICAgICAgICAgICAgICAgICAiSW5wdXQgZGF0YSB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKKyAgVEZfTElURV9FTlNVUkVfTVNHKAorICAgICAgY29udGV4dCwKKyAgICAgIChpbnB1dC0+dHlwZSA9PSBrVGZMaXRlRmxvYXQzMiAmJiBmaWx0ZXItPnR5cGUgPT0ga1RmTGl0ZUZsb2F0MzIpIHx8CisgICAgICAgICAgKGlucHV0LT50eXBlID09IGtUZkxpdGVJbnQxNiAmJiBmaWx0ZXItPnR5cGUgPT0ga1RmTGl0ZUludDgpIHx8CisgICAgICAgICAgKGlucHV0LT50eXBlID09IGtUZkxpdGVJbnQ4ICYmCisgICAgICAgICAgIChmaWx0ZXItPnR5cGUgPT0ga1RmTGl0ZUludDQgfHwgZmlsdGVyLT50eXBlID09IGtUZkxpdGVJbnQ4KSksCisgICAgICAiSHlicmlkIG1vZGVscyBhcmUgbm90IHN1cHBvcnRlZCBvbiBURkxpdGUgTWljcm8uIik7CiAKLSAgLy8gSW5pdGlhbGl6ZSBjbXNpc19ubiBpbnB1dCBkaW1lbnNpb25zCisgIC8vIENvbnNpc3RlbmN5IGNoZWNrIHRlbnNvciBkaW1zCisgIC8vIERpbWVuc2lvbmFsaXR5CisgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIGlucHV0LT5kaW1zLT5zaXplLCA0KTsKKyAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgZmlsdGVyLT5kaW1zLT5zaXplLCA0KTsKKyAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgb3V0cHV0LT5kaW1zLT5zaXplLCA0KTsKKyAgLy8gRXF1YWwgYmF0Y2ggc2l6ZSBpbiBpbnB1dCBhbmQgb3V0cHV0CisgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIGlucHV0LT5kaW1zLT5kYXRhWzBdLCBvdXRwdXQtPmRpbXMtPmRhdGFbMF0pOworICAvLyBJbnB1dCBjaGFubmVscyBzaG91bGQgYmUgYW4gZXZlbiBtdWx0aXBsZSBvZiBmaWx0ZXIgY2hhbm5lbHMKKyAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgZmlsdGVyLT5kaW1zLT5kYXRhWzNdID4gMCk7CisgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIGlucHV0LT5kaW1zLT5kYXRhWzNdICUgZmlsdGVyLT5kaW1zLT5kYXRhWzNdLCAwKTsKKyAgLy8gT3V0cHV0IGNoYW5uZWxzIHNob3VsZCBiZSBhbiBldmVuIG11bHRpcGxlIG9mIHRoZSBudW1iZXIgb2YgZ3JvdXBzCisgIGNvbnN0IGludCBncm91cHMgPSBpbnB1dC0+ZGltcy0+ZGF0YVszXSAvIGZpbHRlci0+ZGltcy0+ZGF0YVszXTsKKyAgVEZMSVRFX0RDSEVDS19FUShvdXRwdXQtPmRpbXMtPmRhdGFbM10gJSBncm91cHMsIDApOworICAvLyBCaWFzIHNpemUgZXF1YWwgdG8gb3V0cHV0IGNoYW5uZWxzCisgIGlmIChiaWFzICE9IG51bGxwdHIpIHsKKyAgICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBiaWFzLT5kaW1zLT5zaXplLCA0KTsKKyAgICBjb25zdCBpbnQgYmlhc19zaXplID0gTnVtRWxlbWVudHMoYmlhcy0+ZGltcyk7CisgICAgVEZMSVRFX0RDSEVDS19FUShiaWFzX3NpemUsIG91dHB1dC0+ZGltcy0+ZGF0YVszXSk7CisgIH0KKworICAvLyBJbml0aWFsaXplIGNtc2lzX25uIGRpbWVuc2lvbnMKICAgY21zaXNfbm5fZGltcyBpbnB1dF9kaW1zOwotICBpbnB1dF9kaW1zLm4gPSBNYXRjaGluZ0RpbShpbnB1dF9zaGFwZSwgMCwgb3V0cHV0X3NoYXBlLCAwKTsKKyAgaW5wdXRfZGltcy5uID0gaW5wdXQtPmRpbXMtPmRhdGFbMF07CiAgIGlucHV0X2RpbXMuaCA9IGlucHV0LT5kaW1zLT5kYXRhWzFdOwogICBpbnB1dF9kaW1zLncgPSBpbnB1dC0+ZGltcy0+ZGF0YVsyXTsKLSAgaW5wdXRfZGltcy5jID0gaW5wdXRfc2hhcGUuRGltcygzKTsKKyAgaW5wdXRfZGltcy5jID0gaW5wdXQtPmRpbXMtPmRhdGFbM107CiAKLSAgLy8gSW5pdGlhbGl6ZSBjbXNpc19ubiBmaWx0ZXIgZGltZW5zaW9ucwogICBjbXNpc19ubl9kaW1zIGZpbHRlcl9kaW1zOwotICBmaWx0ZXJfZGltcy5uID0gb3V0cHV0X3NoYXBlLkRpbXMoMyk7CisgIGZpbHRlcl9kaW1zLm4gPSAxOwogICBmaWx0ZXJfZGltcy5oID0gZmlsdGVyLT5kaW1zLT5kYXRhWzFdOwogICBmaWx0ZXJfZGltcy53ID0gZmlsdGVyLT5kaW1zLT5kYXRhWzJdOwotICBmaWx0ZXJfZGltcy5jID0gaW5wdXRfZGltcy5jOworICBmaWx0ZXJfZGltcy5jID0gZmlsdGVyLT5kaW1zLT5kYXRhWzNdOwogCi0gIC8vIEluaXRpYWxpemUgY21zaXNfbm4gb3V0cHV0IGRpbWVuc2lvbnMKICAgY21zaXNfbm5fZGltcyBvdXRwdXRfZGltczsKLSAgb3V0cHV0X2RpbXMubiA9IGlucHV0X2RpbXMubjsKKyAgb3V0cHV0X2RpbXMubiA9IG91dHB1dC0+ZGltcy0+ZGF0YVswXTsKICAgb3V0cHV0X2RpbXMuaCA9IG91dHB1dC0+ZGltcy0+ZGF0YVsxXTsKICAgb3V0cHV0X2RpbXMudyA9IG91dHB1dC0+ZGltcy0+ZGF0YVsyXTsKLSAgb3V0cHV0X2RpbXMuYyA9IG91dHB1dF9zaGFwZS5EaW1zKDMpOwotCi0gIGlmIChmaWx0ZXItPnR5cGUgPT0ga1RmTGl0ZUludDQpIHsKLSAgICBpbnQgZmlsdGVyX3NpemUgPQotICAgICAgICBSdW50aW1lU2hhcGUoZmlsdGVyLT5kaW1zLT5zaXplLAotICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQzMl90Kj4oZmlsdGVyLT5kaW1zLT5kYXRhKSkKLSAgICAgICAgICAgIC5GbGF0U2l6ZSgpOwotICAgIGNvbnRleHQtPlJlcXVlc3RTY3JhdGNoQnVmZmVySW5BcmVuYSgKLSAgICAgICAgY29udGV4dCwgZmlsdGVyX3NpemUsICZkYXRhLT5yZWZlcmVuY2Vfb3BfZGF0YS5maWx0ZXJfYnVmZmVyX2luZGV4KTsKLSAgfQorICBvdXRwdXRfZGltcy5jID0gb3V0cHV0LT5kaW1zLT5kYXRhWzNdOwogCiAgIGlmIChpbnB1dC0+dHlwZSA9PSBrVGZMaXRlSW50OCB8fCBpbnB1dC0+dHlwZSA9PSBrVGZMaXRlSW50MTYpIHsKICAgICBjb25zdCBpbnQgbnVtX2NoYW5uZWxzID0gZmlsdGVyLT5kaW1zLT5kYXRhW2tDb252UXVhbnRpemVkRGltZW5zaW9uXTsKQEAgLTExMiw3ICsxMzQsMTAgQEAKICAgICAgIGZpbHRlcl9kaW1zLmgsIG91dHB1dF9kaW1zLncsIG91dHB1dF9kaW1zLmgsIGlucHV0LT50eXBlLAogICAgICAgJmRhdGEtPnJlZmVyZW5jZV9vcF9kYXRhKSk7CiAKLSAgaWYgKGlucHV0LT50eXBlID09IGtUZkxpdGVJbnQ4IHx8IGlucHV0LT50eXBlID09IGtUZkxpdGVJbnQxNikgeworICAvLyBDTVNJU19OTiBhbGxvd3MgSU5UNjQgb3IgbnVsbHB0ciBiaWFzIGRhdGEgcG9pbnRlcgorICBpZiAoaW5wdXQtPnR5cGUgPT0ga1RmTGl0ZUludDggfHwKKyAgICAgIChpbnB1dC0+dHlwZSA9PSBrVGZMaXRlSW50MTYgJiYKKyAgICAgICAoYmlhc190eXBlID09IGtUZkxpdGVJbnQ2NCB8fCBiaWFzX3R5cGUgPT0ga1RmTGl0ZU5vVHlwZSkpKSB7CiAgICAgLy8gSW5pdGlhbGl6ZSBjbXNpc19ubiBjb252b2x1dGlvbiBwYXJhbWV0ZXJzCiAgICAgY21zaXNfbm5fY29udl9wYXJhbXMgY29udl9wYXJhbXM7CiAgICAgY29udl9wYXJhbXMuaW5wdXRfb2Zmc2V0ID0gLWlucHV0LT5wYXJhbXMuemVyb19wb2ludDsKQEAgLTE0NywxMCArMTcyLDc2IEBACiAgIG1pY3JvX2NvbnRleHQtPkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKG91dHB1dCk7CiAgIG1pY3JvX2NvbnRleHQtPkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKGlucHV0KTsKICAgbWljcm9fY29udGV4dC0+RGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3IoZmlsdGVyKTsKKyAgaWYgKGJpYXMgIT0gbnVsbHB0cikgeworICAgIG1pY3JvX2NvbnRleHQtPkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKGJpYXMpOworICB9CiAKICAgcmV0dXJuIGtUZkxpdGVPazsKIH0KIAordGVtcGxhdGUgPGNsYXNzIEFjdFR5cGUsIGNsYXNzIEJpYXNUeXBlLCBjbGFzcyBXZWlndGhzVHlwZT4KK2FybV9jbXNpc19ubl9zdGF0dXMgY29udm9sdmVfd3JhcHBlcigKKyAgICBjb25zdCBjbXNpc19ubl9jb250ZXh0KiBjdHgsIGNvbnN0IGNtc2lzX25uX2NvbnZfcGFyYW1zKiBjb252X3BhcmFtcywKKyAgICBjb25zdCBjbXNpc19ubl9wZXJfY2hhbm5lbF9xdWFudF9wYXJhbXMqIHF1YW50X3BhcmFtcywKKyAgICBjb25zdCBjbXNpc19ubl9kaW1zKiBpbnB1dF9kaW1zLCBjb25zdCBBY3RUeXBlKiBpbnB1dCwKKyAgICBjb25zdCBjbXNpc19ubl9kaW1zKiBmaWx0ZXJfZGltcywgY29uc3QgaW50OF90KiBmaWx0ZXIsCisgICAgY29uc3QgY21zaXNfbm5fZGltcyogYmlhc19kaW1zLCBjb25zdCBCaWFzVHlwZSogYmlhcywKKyAgICBjb25zdCBjbXNpc19ubl9kaW1zKiBvdXRwdXRfZGltcywgQWN0VHlwZSogb3V0cHV0LCBXZWlndGhzVHlwZSB3ZWlnaHRzVCkgeworICByZXR1cm4gQVJNX0NNU0lTX05OX0FSR19FUlJPUjsKK30KKwordGVtcGxhdGUgPD4KK2FybV9jbXNpc19ubl9zdGF0dXMgY29udm9sdmVfd3JhcHBlcigKKyAgICBjb25zdCBjbXNpc19ubl9jb250ZXh0KiBjdHgsIGNvbnN0IGNtc2lzX25uX2NvbnZfcGFyYW1zKiBjb252X3BhcmFtcywKKyAgICBjb25zdCBjbXNpc19ubl9wZXJfY2hhbm5lbF9xdWFudF9wYXJhbXMqIHF1YW50X3BhcmFtcywKKyAgICBjb25zdCBjbXNpc19ubl9kaW1zKiBpbnB1dF9kaW1zLCBjb25zdCBpbnQ4X3QqIGlucHV0LAorICAgIGNvbnN0IGNtc2lzX25uX2RpbXMqIGZpbHRlcl9kaW1zLCBjb25zdCBpbnQ4X3QqIGZpbHRlciwKKyAgICBjb25zdCBjbXNpc19ubl9kaW1zKiBiaWFzX2RpbXMsIGNvbnN0IGludDMyX3QqIGJpYXMsCisgICAgY29uc3QgY21zaXNfbm5fZGltcyogb3V0cHV0X2RpbXMsIGludDhfdCogb3V0cHV0LCBUZkxpdGVUeXBlIHdlaWdodHNUKSB7CisgIGlmICh3ZWlnaHRzVCA9PSBrVGZMaXRlSW50OCkgeworICAgIHJldHVybiBhcm1fY29udm9sdmVfd3JhcHBlcl9zOChjdHgsIGNvbnZfcGFyYW1zLCBxdWFudF9wYXJhbXMsIGlucHV0X2RpbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBmaWx0ZXJfZGltcywgZmlsdGVyLCBiaWFzX2RpbXMsIGJpYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9kaW1zLCBvdXRwdXQpOworICB9IGVsc2UgaWYgKHdlaWdodHNUID09IGtUZkxpdGVJbnQ0KSB7CisgICAgcmV0dXJuIGFybV9jb252b2x2ZV93cmFwcGVyX3M0KGN0eCwgY29udl9wYXJhbXMsIHF1YW50X3BhcmFtcywgaW5wdXRfZGltcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsIGZpbHRlcl9kaW1zLCBmaWx0ZXIsIGJpYXNfZGltcywgYmlhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2RpbXMsIG91dHB1dCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIEFSTV9DTVNJU19OTl9BUkdfRVJST1I7CisgIH0KK30KKwordGVtcGxhdGUgPD4KK2FybV9jbXNpc19ubl9zdGF0dXMgY29udm9sdmVfd3JhcHBlcigKKyAgICBjb25zdCBjbXNpc19ubl9jb250ZXh0KiBjdHgsIGNvbnN0IGNtc2lzX25uX2NvbnZfcGFyYW1zKiBjb252X3BhcmFtcywKKyAgICBjb25zdCBjbXNpc19ubl9wZXJfY2hhbm5lbF9xdWFudF9wYXJhbXMqIHF1YW50X3BhcmFtcywKKyAgICBjb25zdCBjbXNpc19ubl9kaW1zKiBpbnB1dF9kaW1zLCBjb25zdCBpbnQxNl90KiBpbnB1dCwKKyAgICBjb25zdCBjbXNpc19ubl9kaW1zKiBmaWx0ZXJfZGltcywgY29uc3QgaW50OF90KiBmaWx0ZXIsCisgICAgY29uc3QgY21zaXNfbm5fZGltcyogYmlhc19kaW1zLCBjb25zdCBpbnQ2NF90KiBiaWFzLAorICAgIGNvbnN0IGNtc2lzX25uX2RpbXMqIG91dHB1dF9kaW1zLCBpbnQxNl90KiBvdXRwdXQsIFRmTGl0ZVR5cGUgd2VpZ2h0c1QpIHsKKyAgY29uc3QgY21zaXNfbm5fYmlhc19kYXRhIGJpYXNfZGF0YSA9IHtiaWFzLCBmYWxzZX07CisKKyAgcmV0dXJuIGFybV9jb252b2x2ZV93cmFwcGVyX3MxNihjdHgsIGNvbnZfcGFyYW1zLCBxdWFudF9wYXJhbXMsIGlucHV0X2RpbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsIGZpbHRlcl9kaW1zLCBmaWx0ZXIsIGJpYXNfZGltcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYmlhc19kYXRhLCBvdXRwdXRfZGltcywgb3V0cHV0KTsKK30KKwordGVtcGxhdGUgPD4KK2FybV9jbXNpc19ubl9zdGF0dXMgY29udm9sdmVfd3JhcHBlcigKKyAgICBjb25zdCBjbXNpc19ubl9jb250ZXh0KiBjdHgsIGNvbnN0IGNtc2lzX25uX2NvbnZfcGFyYW1zKiBjb252X3BhcmFtcywKKyAgICBjb25zdCBjbXNpc19ubl9wZXJfY2hhbm5lbF9xdWFudF9wYXJhbXMqIHF1YW50X3BhcmFtcywKKyAgICBjb25zdCBjbXNpc19ubl9kaW1zKiBpbnB1dF9kaW1zLCBjb25zdCBpbnQxNl90KiBpbnB1dCwKKyAgICBjb25zdCBjbXNpc19ubl9kaW1zKiBmaWx0ZXJfZGltcywgY29uc3QgaW50OF90KiBmaWx0ZXIsCisgICAgY29uc3QgY21zaXNfbm5fZGltcyogYmlhc19kaW1zLCBjb25zdCBpbnQzMl90KiBiaWFzLAorICAgIGNvbnN0IGNtc2lzX25uX2RpbXMqIG91dHB1dF9kaW1zLCBpbnQxNl90KiBvdXRwdXQsIFRmTGl0ZVR5cGUgd2VpZ2h0c1QpIHsKKyAgY29uc3QgY21zaXNfbm5fYmlhc19kYXRhIGJpYXNfZGF0YSA9IHtiaWFzLCB0cnVlfTsKKworICByZXR1cm4gYXJtX2NvbnZvbHZlX3dyYXBwZXJfczE2KGN0eCwgY29udl9wYXJhbXMsIHF1YW50X3BhcmFtcywgaW5wdXRfZGltcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgZmlsdGVyX2RpbXMsIGZpbHRlciwgYmlhc19kaW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZiaWFzX2RhdGEsIG91dHB1dF9kaW1zLCBvdXRwdXQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQWN0VHlwZSwgdHlwZW5hbWUgQmlhc1R5cGUsIFRmTGl0ZVR5cGUgdHlwZT4KIFRmTGl0ZVN0YXR1cyBFdmFsUXVhbnRpemVkUGVyQ2hhbm5lbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZUNvbnZQYXJhbXMmIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcERhdGEmIGRhdGEsCkBAIC0xNzksNTEgKzI3MCwzMSBAQAogICBxdWFudF9wYXJhbXMuc2hpZnQgPQogICAgICAgY29uc3RfY2FzdDxpbnQzMl90Kj4oZGF0YS5yZWZlcmVuY2Vfb3BfZGF0YS5wZXJfY2hhbm5lbF9vdXRwdXRfc2hpZnQpOwogCi0gIFJ1bnRpbWVTaGFwZSBmaWx0ZXJfc2hhcGUgPSB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShmaWx0ZXIpOwotICBSdW50aW1lU2hhcGUgaW5wdXRfc2hhcGUgPSB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShpbnB1dCk7Ci0gIFJ1bnRpbWVTaGFwZSBvdXRwdXRfc2hhcGUgPSB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShvdXRwdXQpOwotICBSdW50aW1lU2hhcGUgYmlhc19zaGFwZSA9IHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGJpYXMpOwotCi0gIC8vIENvbnNpc3RlbmN5IGNoZWNrLgotICBURkxJVEVfRENIRUNLX0xFKGNvbnZfcGFyYW1zLmFjdGl2YXRpb24ubWluLCBjb252X3BhcmFtcy5hY3RpdmF0aW9uLm1heCk7Ci0gIFRGTElURV9EQ0hFQ0tfRVEoaW5wdXRfc2hhcGUuRGltZW5zaW9uc0NvdW50KCksIDQpOwotICBURkxJVEVfRENIRUNLX0VRKGZpbHRlcl9zaGFwZS5EaW1lbnNpb25zQ291bnQoKSwgNCk7Ci0gIFRGTElURV9EQ0hFQ0tfRVEob3V0cHV0X3NoYXBlLkRpbWVuc2lvbnNDb3VudCgpLCA0KTsKLSAgY29uc3QgaW50IGJhdGNoX3NpemUgPSBNYXRjaGluZ0RpbShpbnB1dF9zaGFwZSwgMCwgb3V0cHV0X3NoYXBlLCAwKTsKLSAgY29uc3QgaW50IGlucHV0X2RlcHRoID0gTWF0Y2hpbmdEaW0oaW5wdXRfc2hhcGUsIDMsIGZpbHRlcl9zaGFwZSwgMyk7Ci0gIGNvbnN0IGludCBvdXRwdXRfZGVwdGggPSBNYXRjaGluZ0RpbShmaWx0ZXJfc2hhcGUsIDAsIG91dHB1dF9zaGFwZSwgMyk7Ci0gIGlmICh0ZmxpdGU6Om1pY3JvOjpHZXRPcHRpb25hbFRlbnNvckRhdGE8aW50OF90PihiaWFzKSkgewotICAgIFRGTElURV9EQ0hFQ0tfRVEoYmlhc19zaGFwZS5GbGF0U2l6ZSgpLCBvdXRwdXRfZGVwdGgpOwotICB9Ci0KLSAgLy8gSW5pdGlhbGl6ZSBjbXNpc19ubiBkaW1lbnNpb25zCi0gIC8vIElucHV0CisgIC8vIEluaXRpYWxpemUgY21zaXNfbm4gZGltZW5zaW9uIHN0cnVjdHMsIGNvbnNpc3RlbmN5IGlzIGNoZWNrZWQgaW4gdGhlCisgIC8vIHByZXBhcmUgc3RhZ2UKICAgY21zaXNfbm5fZGltcyBpbnB1dF9kaW1zOwotICBpbnB1dF9kaW1zLm4gPSBiYXRjaF9zaXplOwotICBpbnB1dF9kaW1zLmggPSBpbnB1dF9zaGFwZS5EaW1zKDEpOwotICBpbnB1dF9kaW1zLncgPSBpbnB1dF9zaGFwZS5EaW1zKDIpOwotICBpbnB1dF9kaW1zLmMgPSBpbnB1dF9kZXB0aDsKKyAgaW5wdXRfZGltcy5uID0gaW5wdXQtPmRpbXMtPmRhdGFbMF07CisgIGlucHV0X2RpbXMuaCA9IGlucHV0LT5kaW1zLT5kYXRhWzFdOworICBpbnB1dF9kaW1zLncgPSBpbnB1dC0+ZGltcy0+ZGF0YVsyXTsKKyAgaW5wdXRfZGltcy5jID0gaW5wdXQtPmRpbXMtPmRhdGFbM107CiAKLSAgLy8gRmlsdGVyCiAgIGNtc2lzX25uX2RpbXMgZmlsdGVyX2RpbXM7Ci0gIGZpbHRlcl9kaW1zLm4gPSBvdXRwdXRfZGVwdGg7Ci0gIGZpbHRlcl9kaW1zLmggPSBmaWx0ZXJfc2hhcGUuRGltcygxKTsKLSAgZmlsdGVyX2RpbXMudyA9IGZpbHRlcl9zaGFwZS5EaW1zKDIpOwotICBmaWx0ZXJfZGltcy5jID0gaW5wdXRfZGVwdGg7CisgIGZpbHRlcl9kaW1zLm4gPSAxOworICBmaWx0ZXJfZGltcy5oID0gZmlsdGVyLT5kaW1zLT5kYXRhWzFdOworICBmaWx0ZXJfZGltcy53ID0gZmlsdGVyLT5kaW1zLT5kYXRhWzJdOworICBmaWx0ZXJfZGltcy5jID0gZmlsdGVyLT5kaW1zLT5kYXRhWzNdOwogCi0gIC8vIEJpYXMKICAgY21zaXNfbm5fZGltcyBiaWFzX2RpbXM7CiAgIGJpYXNfZGltcy5uID0gMTsKICAgYmlhc19kaW1zLmggPSAxOwogICBiaWFzX2RpbXMudyA9IDE7Ci0gIGJpYXNfZGltcy5jID0gb3V0cHV0X2RlcHRoOworICBiaWFzX2RpbXMuYyA9IG91dHB1dC0+ZGltcy0+ZGF0YVszXTsKIAotICAvLyBPdXRwdXQKICAgY21zaXNfbm5fZGltcyBvdXRwdXRfZGltczsKLSAgb3V0cHV0X2RpbXMubiA9IGJhdGNoX3NpemU7Ci0gIG91dHB1dF9kaW1zLmggPSBvdXRwdXRfc2hhcGUuRGltcygxKTsKLSAgb3V0cHV0X2RpbXMudyA9IG91dHB1dF9zaGFwZS5EaW1zKDIpOwotICBvdXRwdXRfZGltcy5jID0gb3V0cHV0X2RlcHRoOworICBvdXRwdXRfZGltcy5uID0gb3V0cHV0LT5kaW1zLT5kYXRhWzBdOworICBvdXRwdXRfZGltcy5oID0gb3V0cHV0LT5kaW1zLT5kYXRhWzFdOworICBvdXRwdXRfZGltcy53ID0gb3V0cHV0LT5kaW1zLT5kYXRhWzJdOworICBvdXRwdXRfZGltcy5jID0gb3V0cHV0LT5kaW1zLT5kYXRhWzNdOwogCiAgIC8vIEluaXRpYWxpemUgY21zaXNfbm4gY29udGV4dAogICBjbXNpc19ubl9jb250ZXh0IGN0eDsKQEAgLTIzMywxMTggKzMwNCw0NCBAQAogICBpZiAoZGF0YS5idWZmZXJfaWR4ID4gLTEpIHsKICAgICBjdHguYnVmID0gY29udGV4dC0+R2V0U2NyYXRjaEJ1ZmZlcihjb250ZXh0LCBkYXRhLmJ1ZmZlcl9pZHgpOwogICAgIC8vIE5vdGU6IGN0eC5zaXplIGlzIGN1cnJlbnRseSBub3QgdXNlZCBpbiBjbXNpc19ubi4KLSAgICAvLyBUaGUgYnVmZmVyIHNob3VsZCBiZSBhbGxvY2F0ZWQgaW4gdGhlIFByZXBhcmUgZnVuY3Rpb24gdGhyb3VnaAotICAgIC8vIGFybV9jb252b2x2ZV93cmFwcGVyX3M4X2dldF9idWZmZXJfc2l6ZQorICAgIC8vIFRoZSBidWZmZXIgc2hvdWxkIGJlIGFsbG9jYXRlZCBpbiB0aGUgcHJlcGFyZSBmdW5jdGlvbiB0aHJvdWdoCisgICAgLy8gdGhlIGNvcnJlc3BvbmRpbmcgYXJtX2NvbnZvbHZlX3dyYXBwZXJfW3R5cGVdX2dldF9idWZmZXJfc2l6ZQogICB9CiAKLSAgLy8gYXJtX2NvbnZvbHZlX3dyYXBwZXJfczggZGlzcGF0Y2hlcyB0aGUgb3B0aW1pemVkIGtlcm5lbCBhY2NvcmRpbmdseSB3aXRoCi0gIC8vIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZAorICAvLyBhcm1fY29udm9sdmVfd3JhcHBlcl9bdHlwZV0gZGlzcGF0Y2hlcyB0aGUgb3B0aW1pemVkIGtlcm5lbCBhY2NvcmRpbmdseQorICAvLyB3aXRoIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZAogICBURkxJVEVfRENIRUNLX0VRKAotICAgICAgYXJtX2NvbnZvbHZlX3dyYXBwZXJfczgoCisgICAgICBjb252b2x2ZV93cmFwcGVyKAogICAgICAgICAgICZjdHgsICZjb252X3BhcmFtcywgJnF1YW50X3BhcmFtcywgJmlucHV0X2RpbXMsCi0gICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KGlucHV0KSwgJmZpbHRlcl9kaW1zLAorICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8QWN0VHlwZT4oaW5wdXQpLCAmZmlsdGVyX2RpbXMsCiAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KGZpbHRlciksICZiaWFzX2RpbXMsCi0gICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0T3B0aW9uYWxUZW5zb3JEYXRhPGludDMyX3Q+KGJpYXMpLCAmb3V0cHV0X2RpbXMsCi0gICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KG91dHB1dCkpLAorICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldE9wdGlvbmFsVGVuc29yRGF0YTxCaWFzVHlwZT4oYmlhcyksICZvdXRwdXRfZGltcywKKyAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPEFjdFR5cGU+KG91dHB1dCksIHR5cGUpLAogICAgICAgQVJNX0NNU0lTX05OX1NVQ0NFU1MpOwogCiAgIHJldHVybiBrVGZMaXRlT2s7CiB9CiAKLVRmTGl0ZVN0YXR1cyBFdmFsUXVhbnRpemVkUGVyQ2hhbm5lbDE2eDgoCi0gICAgVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSwgY29uc3QgVGZMaXRlQ29udlBhcmFtcyYgcGFyYW1zLAotICAgIGNvbnN0IE9wRGF0YSYgZGF0YSwgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXQsCi0gICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogZmlsdGVyLCBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBiaWFzLAotICAgIFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dCkgewotICBjbXNpc19ubl9jb252X3BhcmFtcyBjb252X3BhcmFtczsKLSAgY29udl9wYXJhbXMuZGlsYXRpb24uaCA9IHBhcmFtcy5kaWxhdGlvbl9oZWlnaHRfZmFjdG9yOwotICBjb252X3BhcmFtcy5kaWxhdGlvbi53ID0gcGFyYW1zLmRpbGF0aW9uX3dpZHRoX2ZhY3RvcjsKK1RmTGl0ZVN0YXR1cyBFdmFsSW50NChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CisgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0ID0KKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dChjb250ZXh0LCBub2RlLCBrQ29udklucHV0VGVuc29yKTsKKyAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogZmlsdGVyID0KKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dChjb250ZXh0LCBub2RlLCBrQ29udldlaWdodHNUZW5zb3IpOworICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBiaWFzID0KKyAgICAgIChOdW1JbnB1dHMobm9kZSkgPT0gMykKKyAgICAgICAgICA/IHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dChjb250ZXh0LCBub2RlLCBrQ29udkJpYXNUZW5zb3IpCisgICAgICAgICAgOiBudWxscHRyOworICBUZkxpdGVFdmFsVGVuc29yKiBvdXRwdXQgPQorICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbE91dHB1dChjb250ZXh0LCBub2RlLCBrQ29udk91dHB1dFRlbnNvcik7CiAKLSAgLy8gSW5pdGlhbGl6ZSBjbXNpc19ubiBjb252b2x1dGlvbiBwYXJhbWV0ZXJzCi0gIGNvbnZfcGFyYW1zLmlucHV0X29mZnNldCA9IC1kYXRhLnJlZmVyZW5jZV9vcF9kYXRhLmlucHV0X3plcm9fcG9pbnQ7Ci0gIGNvbnZfcGFyYW1zLm91dHB1dF9vZmZzZXQgPSBkYXRhLnJlZmVyZW5jZV9vcF9kYXRhLm91dHB1dF96ZXJvX3BvaW50OwotICBjb252X3BhcmFtcy5zdHJpZGUuaCA9IHBhcmFtcy5zdHJpZGVfaGVpZ2h0OwotICBjb252X3BhcmFtcy5zdHJpZGUudyA9IHBhcmFtcy5zdHJpZGVfd2lkdGg7Ci0gIGNvbnZfcGFyYW1zLnBhZGRpbmcuaCA9IGRhdGEucmVmZXJlbmNlX29wX2RhdGEucGFkZGluZy5oZWlnaHQ7Ci0gIGNvbnZfcGFyYW1zLnBhZGRpbmcudyA9IGRhdGEucmVmZXJlbmNlX29wX2RhdGEucGFkZGluZy53aWR0aDsKLSAgY29udl9wYXJhbXMuYWN0aXZhdGlvbi5taW4gPSBkYXRhLnJlZmVyZW5jZV9vcF9kYXRhLm91dHB1dF9hY3RpdmF0aW9uX21pbjsKLSAgY29udl9wYXJhbXMuYWN0aXZhdGlvbi5tYXggPSBkYXRhLnJlZmVyZW5jZV9vcF9kYXRhLm91dHB1dF9hY3RpdmF0aW9uX21heDsKKyAgVEZMSVRFX0RDSEVDSyhub2RlLT5idWlsdGluX2RhdGEgIT0gbnVsbHB0cik7CisgIGNvbnN0IGF1dG8mIHBhcmFtcyA9CisgICAgICAqKHJlaW50ZXJwcmV0X2Nhc3Q8VGZMaXRlQ29udlBhcmFtcyo+KG5vZGUtPmJ1aWx0aW5fZGF0YSkpOworICBURkxJVEVfRENIRUNLKG5vZGUtPnVzZXJfZGF0YSAhPSBudWxscHRyKTsKKyAgY29uc3QgT3BEYXRhJiBkYXRhID0gKihzdGF0aWNfY2FzdDxjb25zdCBPcERhdGEqPihub2RlLT51c2VyX2RhdGEpKTsKIAotICAvLyBJbml0aWFsaXplIGNtc2lzX25uIHBlciBjaGFubmVsIHF1YW50aXphdGlvbiBwYXJhbWV0ZXJzCi0gIGNtc2lzX25uX3Blcl9jaGFubmVsX3F1YW50X3BhcmFtcyBxdWFudF9wYXJhbXM7Ci0gIHF1YW50X3BhcmFtcy5tdWx0aXBsaWVyID0gY29uc3RfY2FzdDxpbnQzMl90Kj4oCi0gICAgICBkYXRhLnJlZmVyZW5jZV9vcF9kYXRhLnBlcl9jaGFubmVsX291dHB1dF9tdWx0aXBsaWVyKTsKLSAgcXVhbnRfcGFyYW1zLnNoaWZ0ID0KLSAgICAgIGNvbnN0X2Nhc3Q8aW50MzJfdCo+KGRhdGEucmVmZXJlbmNlX29wX2RhdGEucGVyX2NoYW5uZWxfb3V0cHV0X3NoaWZ0KTsKLQotICBSdW50aW1lU2hhcGUgZmlsdGVyX3NoYXBlID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoZmlsdGVyKTsKLSAgUnVudGltZVNoYXBlIGlucHV0X3NoYXBlID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoaW5wdXQpOwotICBSdW50aW1lU2hhcGUgb3V0cHV0X3NoYXBlID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUob3V0cHV0KTsKLSAgUnVudGltZVNoYXBlIGJpYXNfc2hhcGUgPSB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShiaWFzKTsKLQotICAvLyBDb25zaXN0ZW5jeSBjaGVjay4KLSAgVEZMSVRFX0RDSEVDS19MRShjb252X3BhcmFtcy5hY3RpdmF0aW9uLm1pbiwgY29udl9wYXJhbXMuYWN0aXZhdGlvbi5tYXgpOwotICBURkxJVEVfRENIRUNLX0VRKGlucHV0X3NoYXBlLkRpbWVuc2lvbnNDb3VudCgpLCA0KTsKLSAgVEZMSVRFX0RDSEVDS19FUShmaWx0ZXJfc2hhcGUuRGltZW5zaW9uc0NvdW50KCksIDQpOwotICBURkxJVEVfRENIRUNLX0VRKG91dHB1dF9zaGFwZS5EaW1lbnNpb25zQ291bnQoKSwgNCk7Ci0gIGNvbnN0IGludCBiYXRjaF9zaXplID0gTWF0Y2hpbmdEaW0oaW5wdXRfc2hhcGUsIDAsIG91dHB1dF9zaGFwZSwgMCk7Ci0gIGNvbnN0IGludCBpbnB1dF9kZXB0aCA9IE1hdGNoaW5nRGltKGlucHV0X3NoYXBlLCAzLCBmaWx0ZXJfc2hhcGUsIDMpOwotICBjb25zdCBpbnQgb3V0cHV0X2RlcHRoID0gTWF0Y2hpbmdEaW0oZmlsdGVyX3NoYXBlLCAwLCBvdXRwdXRfc2hhcGUsIDMpOwotICBpZiAodGZsaXRlOjptaWNybzo6R2V0T3B0aW9uYWxUZW5zb3JEYXRhPGludDhfdD4oYmlhcykpIHsKLSAgICBURkxJVEVfRENIRUNLX0VRKGJpYXNfc2hhcGUuRmxhdFNpemUoKSwgb3V0cHV0X2RlcHRoKTsKLSAgfQotCi0gIC8vIEluaXRpYWxpemUgY21zaXNfbm4gZGltZW5zaW9ucwotICAvLyBJbnB1dAotICBjbXNpc19ubl9kaW1zIGlucHV0X2RpbXM7Ci0gIGlucHV0X2RpbXMubiA9IGJhdGNoX3NpemU7Ci0gIGlucHV0X2RpbXMuaCA9IGlucHV0X3NoYXBlLkRpbXMoMSk7Ci0gIGlucHV0X2RpbXMudyA9IGlucHV0X3NoYXBlLkRpbXMoMik7Ci0gIGlucHV0X2RpbXMuYyA9IGlucHV0X2RlcHRoOwotCi0gIC8vIEZpbHRlcgotICBjbXNpc19ubl9kaW1zIGZpbHRlcl9kaW1zOwotICBmaWx0ZXJfZGltcy5uID0gb3V0cHV0X2RlcHRoOwotICBmaWx0ZXJfZGltcy5oID0gZmlsdGVyX3NoYXBlLkRpbXMoMSk7Ci0gIGZpbHRlcl9kaW1zLncgPSBmaWx0ZXJfc2hhcGUuRGltcygyKTsKLSAgZmlsdGVyX2RpbXMuYyA9IGlucHV0X2RlcHRoOwotCi0gIC8vIEJpYXMKLSAgY21zaXNfbm5fZGltcyBiaWFzX2RpbXM7Ci0gIGJpYXNfZGltcy5uID0gMTsKLSAgYmlhc19kaW1zLmggPSAxOwotICBiaWFzX2RpbXMudyA9IDE7Ci0gIGJpYXNfZGltcy5jID0gb3V0cHV0X2RlcHRoOwotCi0gIC8vIE91dHB1dAotICBjbXNpc19ubl9kaW1zIG91dHB1dF9kaW1zOwotICBvdXRwdXRfZGltcy5uID0gYmF0Y2hfc2l6ZTsKLSAgb3V0cHV0X2RpbXMuaCA9IG91dHB1dF9zaGFwZS5EaW1zKDEpOwotICBvdXRwdXRfZGltcy53ID0gb3V0cHV0X3NoYXBlLkRpbXMoMik7Ci0gIG91dHB1dF9kaW1zLmMgPSBvdXRwdXRfZGVwdGg7Ci0KLSAgLy8gSW5pdGlhbGl6ZSBjbXNpc19ubiBjb250ZXh0Ci0gIGNtc2lzX25uX2NvbnRleHQgY3R4OwotICBjdHguYnVmID0gbnVsbHB0cjsKLSAgY3R4LnNpemUgPSAwOwotCi0gIGlmIChkYXRhLmJ1ZmZlcl9pZHggPiAtMSkgewotICAgIGN0eC5idWYgPSBjb250ZXh0LT5HZXRTY3JhdGNoQnVmZmVyKGNvbnRleHQsIGRhdGEuYnVmZmVyX2lkeCk7Ci0gICAgLy8gTm90ZTogY3R4LnNpemUgaXMgY3VycmVudGx5IG5vdCB1c2VkIGluIGNtc2lzX25uLgotICAgIC8vIFRoZSBidWZmZXIgc2hvdWxkIGJlIGFsbG9jYXRlZCBpbiB0aGUgUHJlcGFyZSBmdW5jdGlvbiB0aHJvdWdoCi0gICAgLy8gYXJtX2NvbnZvbHZlX3dyYXBwZXJfczhfZ2V0X2J1ZmZlcl9zaXplCi0gIH0KLQotICBURkxJVEVfRENIRUNLX0VRKAotICAgICAgYXJtX2NvbnZvbHZlX3dyYXBwZXJfczE2KAotICAgICAgICAgICZjdHgsICZjb252X3BhcmFtcywgJnF1YW50X3BhcmFtcywgJmlucHV0X2RpbXMsCi0gICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90PihpbnB1dCksICZmaWx0ZXJfZGltcywKLSAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4oZmlsdGVyKSwgJmJpYXNfZGltcywKLSAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRPcHRpb25hbFRlbnNvckRhdGE8aW50NjRfdD4oYmlhcyksICZvdXRwdXRfZGltcywKLSAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KG91dHB1dCkpLAotICAgICAgQVJNX0NNU0lTX05OX1NVQ0NFU1MpOwotCi0gIHJldHVybiBrVGZMaXRlT2s7CisgIHJldHVybiBFdmFsUXVhbnRpemVkUGVyQ2hhbm5lbDxpbnQ4X3QsIGludDMyX3QsIGtUZkxpdGVJbnQ0PigKKyAgICAgIGNvbnRleHQsIG5vZGUsIHBhcmFtcywgZGF0YSwgaW5wdXQsIGZpbHRlciwgYmlhcywgb3V0cHV0KTsKIH0KIAogVGZMaXRlU3RhdHVzIEV2YWxJbnQ4KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKQEAgLTM2NCwxMSArMzYxLDkgQEAKICAgICAgICoocmVpbnRlcnByZXRfY2FzdDxUZkxpdGVDb252UGFyYW1zKj4obm9kZS0+YnVpbHRpbl9kYXRhKSk7CiAgIFRGTElURV9EQ0hFQ0sobm9kZS0+dXNlcl9kYXRhICE9IG51bGxwdHIpOwogICBjb25zdCBPcERhdGEmIGRhdGEgPSAqKHN0YXRpY19jYXN0PGNvbnN0IE9wRGF0YSo+KG5vZGUtPnVzZXJfZGF0YSkpOwotICBUZkxpdGVFdmFsVGVuc29yIGZpbHRlcl9pbnQ4ID0gdGZsaXRlOjptaWNybzo6TWFrZVVucGFja2VkSW50NFRlbnNvcigKLSAgICAgIGNvbnRleHQsIGRhdGEucmVmZXJlbmNlX29wX2RhdGEuZmlsdGVyX2J1ZmZlcl9pbmRleCwgZmlsdGVyKTsKIAotICByZXR1cm4gRXZhbFF1YW50aXplZFBlckNoYW5uZWwoY29udGV4dCwgbm9kZSwgcGFyYW1zLCBkYXRhLCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWx0ZXJfaW50OCwgYmlhcywgb3V0cHV0KTsKKyAgcmV0dXJuIEV2YWxRdWFudGl6ZWRQZXJDaGFubmVsPGludDhfdCwgaW50MzJfdCwga1RmTGl0ZUludDg+KAorICAgICAgY29udGV4dCwgbm9kZSwgcGFyYW1zLCBkYXRhLCBpbnB1dCwgZmlsdGVyLCBiaWFzLCBvdXRwdXQpOwogfQogCiBUZkxpdGVTdGF0dXMgRXZhbEludDE2eDgoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewpAQCAtMzg5LDggKzM4NCwxNyBAQAogICBURkxJVEVfRENIRUNLKG5vZGUtPnVzZXJfZGF0YSAhPSBudWxscHRyKTsKICAgY29uc3QgT3BEYXRhJiBkYXRhID0gKihzdGF0aWNfY2FzdDxjb25zdCBPcERhdGEqPihub2RlLT51c2VyX2RhdGEpKTsKIAotICByZXR1cm4gRXZhbFF1YW50aXplZFBlckNoYW5uZWwxNng4KGNvbnRleHQsIG5vZGUsIHBhcmFtcywgZGF0YSwgaW5wdXQsIGZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWFzLCBvdXRwdXQpOworICBpZiAoYmlhcyA9PSBudWxscHRyIHx8IGJpYXMtPnR5cGUgPT0ga1RmTGl0ZUludDMyKSB7CisgICAgcmV0dXJuIEV2YWxRdWFudGl6ZWRQZXJDaGFubmVsPGludDE2X3QsIGludDMyX3QsIGtUZkxpdGVJbnQxNj4oCisgICAgICAgIGNvbnRleHQsIG5vZGUsIHBhcmFtcywgZGF0YSwgaW5wdXQsIGZpbHRlciwgYmlhcywgb3V0cHV0KTsKKyAgfSBlbHNlIGlmIChiaWFzLT50eXBlID09IGtUZkxpdGVJbnQ2NCkgeworICAgIHJldHVybiBFdmFsUXVhbnRpemVkUGVyQ2hhbm5lbDxpbnQxNl90LCBpbnQ2NF90LCBrVGZMaXRlSW50MTY+KAorICAgICAgICBjb250ZXh0LCBub2RlLCBwYXJhbXMsIGRhdGEsIGlucHV0LCBmaWx0ZXIsIGJpYXMsIG91dHB1dCk7CisgIH0gZWxzZSB7CisgICAgTWljcm9QcmludGYoIkJpYXMgdHlwZSAlcyAoJWQpIG5vdCBzdXBwb3J0ZWQuIiwKKyAgICAgICAgICAgICAgICBUZkxpdGVUeXBlR2V0TmFtZShiaWFzLT50eXBlKSwgYmlhcy0+dHlwZSk7CisgICAgcmV0dXJuIGtUZkxpdGVFcnJvcjsKKyAgfQogfQogCiBUZkxpdGVTdGF0dXMgRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CkBAIC00MTksOSArNDIzLDYgQEAKICAgICAgICAgICAoaW5wdXQtPnR5cGUgPT0ga1RmTGl0ZUludDggJiYgZmlsdGVyLT50eXBlID09IGtUZkxpdGVJbnQ0KSwKICAgICAgICJIeWJyaWQgbW9kZWxzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIFRGTGl0ZSBNaWNyby4iKTsKIAotICBUZkxpdGVFdmFsVGVuc29yIGZpbHRlcl9pbnQ4ID0gdGZsaXRlOjptaWNybzo6TWFrZVVucGFja2VkSW50NFRlbnNvcigKLSAgICAgIGNvbnRleHQsIGRhdGEucmVmZXJlbmNlX29wX2RhdGEuZmlsdGVyX2J1ZmZlcl9pbmRleCwgZmlsdGVyKTsKLQogICBzd2l0Y2ggKGlucHV0LT50eXBlKSB7ICAvLyBBbHJlYWR5IGtub3cgaW4vb3V0IHR5cGVzIGFyZSBzYW1lLgogICAgIGNhc2Uga1RmTGl0ZUZsb2F0MzI6IHsKICAgICAgIHRmbGl0ZTo6cmVmZXJlbmNlX29wczo6Q29udigKQEAgLTQzNywzMCArNDM4LDQ0IEBACiAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUobnVsbHB0ciksIG51bGxwdHIpOwogICAgICAgYnJlYWs7CiAgICAgfQotICAgIGNhc2Uga1RmTGl0ZUludDg6Ci0gICAgICBzd2l0Y2ggKGZpbHRlcl9pbnQ4LnR5cGUpIHsKLSAgICAgICAgY2FzZSBrVGZMaXRlSW50ODogewotICAgICAgICAgIHJldHVybiBFdmFsUXVhbnRpemVkUGVyQ2hhbm5lbChjb250ZXh0LCBub2RlLCBwYXJhbXMsIGRhdGEsIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsdGVyX2ludDgsIGJpYXMsIG91dHB1dCk7CisgICAgY2FzZSBrVGZMaXRlSW50ODogeworICAgICAgc3dpdGNoIChmaWx0ZXItPnR5cGUpIHsKKyAgICAgICAgY2FzZSBrVGZMaXRlSW50NDogeworICAgICAgICAgIHJldHVybiBFdmFsUXVhbnRpemVkUGVyQ2hhbm5lbDxpbnQ4X3QsIGludDMyX3QsIGtUZkxpdGVJbnQ0PigKKyAgICAgICAgICAgICAgY29udGV4dCwgbm9kZSwgcGFyYW1zLCBkYXRhLCBpbnB1dCwgZmlsdGVyLCBiaWFzLCBvdXRwdXQpOwogICAgICAgICB9Ci0KKyAgICAgICAgY2FzZSBrVGZMaXRlSW50ODogeworICAgICAgICAgIHJldHVybiBFdmFsUXVhbnRpemVkUGVyQ2hhbm5lbDxpbnQ4X3QsIGludDMyX3QsIGtUZkxpdGVJbnQ4PigKKyAgICAgICAgICAgICAgY29udGV4dCwgbm9kZSwgcGFyYW1zLCBkYXRhLCBpbnB1dCwgZmlsdGVyLCBiaWFzLCBvdXRwdXQpOworICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6IHsKICAgICAgICAgICBNaWNyb1ByaW50ZigiRmlsdGVyIHR5cGUgJXMgKCVkKSBub3Qgc3VwcG9ydGVkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgVGZMaXRlVHlwZUdldE5hbWUoZmlsdGVyLT50eXBlKSwgZmlsdGVyLT50eXBlKTsKICAgICAgICAgICByZXR1cm4ga1RmTGl0ZUVycm9yOwogICAgICAgICB9CiAgICAgICB9Ci0KICAgICAgIGJyZWFrOwotICAgIGNhc2Uga1RmTGl0ZUludDE2OgotICAgICAgcmV0dXJuIEV2YWxRdWFudGl6ZWRQZXJDaGFubmVsMTZ4OChjb250ZXh0LCBub2RlLCBwYXJhbXMsIGRhdGEsIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIsIGJpYXMsIG91dHB1dCk7CisgICAgfQorICAgIGNhc2Uga1RmTGl0ZUludDE2OiB7CisgICAgICBpZiAoYmlhcyA9PSBudWxscHRyIHx8IGJpYXMtPnR5cGUgPT0ga1RmTGl0ZUludDMyKSB7CisgICAgICAgIHJldHVybiBFdmFsUXVhbnRpemVkUGVyQ2hhbm5lbDxpbnQxNl90LCBpbnQzMl90LCBrVGZMaXRlSW50MTY+KAorICAgICAgICAgICAgY29udGV4dCwgbm9kZSwgcGFyYW1zLCBkYXRhLCBpbnB1dCwgZmlsdGVyLCBiaWFzLCBvdXRwdXQpOworICAgICAgfSBlbHNlIGlmIChiaWFzLT50eXBlID09IGtUZkxpdGVJbnQ2NCkgeworICAgICAgICByZXR1cm4gRXZhbFF1YW50aXplZFBlckNoYW5uZWw8aW50MTZfdCwgaW50NjRfdCwga1RmTGl0ZUludDE2PigKKyAgICAgICAgICAgIGNvbnRleHQsIG5vZGUsIHBhcmFtcywgZGF0YSwgaW5wdXQsIGZpbHRlciwgYmlhcywgb3V0cHV0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIE1pY3JvUHJpbnRmKCJCaWFzIHR5cGUgJXMgKCVkKSBub3Qgc3VwcG9ydGVkLiIsCisgICAgICAgICAgICAgICAgICAgIFRmTGl0ZVR5cGVHZXROYW1lKGJpYXMtPnR5cGUpLCBiaWFzLT50eXBlKTsKKyAgICAgICAgcmV0dXJuIGtUZkxpdGVFcnJvcjsKKyAgICAgIH0KICAgICAgIGJyZWFrOworICAgIH0KICAgICBkZWZhdWx0OgogICAgICAgTWljcm9QcmludGYoIlR5cGUgJXMgKCVkKSBub3Qgc3VwcG9ydGVkLiIsIFRmTGl0ZVR5cGVHZXROYW1lKGlucHV0LT50eXBlKSwKICAgICAgICAgICAgICAgICAgIGlucHV0LT50eXBlKTsKICAgICAgIHJldHVybiBrVGZMaXRlRXJyb3I7CiAgIH0KKwogICByZXR1cm4ga1RmTGl0ZU9rOwogfQogCkBAIC00NzAsNiArNDg1LDEwIEBACiAgIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKEluaXQsIFByZXBhcmUsIEV2YWwpOwogfQogCitURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX0NPTlZfMkRfSU5UNCgpIHsKKyAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoSW5pdCwgUHJlcGFyZSwgRXZhbEludDQpOworfQorCiBURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX0NPTlZfMkRfSU5UOCgpIHsKICAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoSW5pdCwgUHJlcGFyZSwgRXZhbEludDgpOwogfQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvY21zaXNfbm4vZGVwdGh3aXNlX2NvbnYuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jbXNpc19ubi9kZXB0aHdpc2VfY29udi5jYwppbmRleCA3YjczM2I3Li43MTgzYTI4IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jbXNpc19ubi9kZXB0aHdpc2VfY29udi5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jbXNpc19ubi9kZXB0aHdpc2VfY29udi5jYwpAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAyMDIyIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgMjAyNCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTc1LDYgKzc1LDIwIEBACiAgICAgICBtaWNyb19jb250ZXh0LT5BbGxvY2F0ZVRlbXBPdXRwdXRUZW5zb3Iobm9kZSwga0RlcHRod2lzZUNvbnZPdXRwdXRUZW5zb3IpOwogICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCBvdXRwdXQgIT0gbnVsbHB0cik7CiAKKyAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgaW5wdXQtPnR5cGUsIG91dHB1dC0+dHlwZSk7CisgIFRGX0xJVEVfRU5TVVJFX01TRyhjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXQtPnR5cGUgPT0ga1RmTGl0ZUZsb2F0MzIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC0+dHlwZSA9PSBrVGZMaXRlSW50MTYgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC0+dHlwZSA9PSBrVGZMaXRlSW50OCwKKyAgICAgICAgICAgICAgICAgICAgICJJbnB1dCBkYXRhIHR5cGUgbm90IHN1cHBvcnRlZCIpOworICBURl9MSVRFX0VOU1VSRV9NU0coCisgICAgICBjb250ZXh0LAorICAgICAgKGlucHV0LT50eXBlID09IGtUZkxpdGVGbG9hdDMyICYmIGZpbHRlci0+dHlwZSA9PSBrVGZMaXRlRmxvYXQzMikgfHwKKyAgICAgICAgICAoaW5wdXQtPnR5cGUgPT0ga1RmTGl0ZUludDE2ICYmIGZpbHRlci0+dHlwZSA9PSBrVGZMaXRlSW50OCkgfHwKKyAgICAgICAgICAoaW5wdXQtPnR5cGUgPT0ga1RmTGl0ZUludDggJiYKKyAgICAgICAgICAgKGZpbHRlci0+dHlwZSA9PSBrVGZMaXRlSW50NCB8fCBmaWx0ZXItPnR5cGUgPT0ga1RmTGl0ZUludDgpKSwKKyAgICAgICJIeWJyaWQgbW9kZWxzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIFRGTGl0ZSBNaWNyby4iKTsKKwogICBjb25zdCBUZkxpdGVUeXBlIGRhdGFfdHlwZSA9IGlucHV0LT50eXBlOwogICBpbnQgaW5wdXRfd2lkdGggPSBTaXplT2ZEaW1lbnNpb24oaW5wdXQsIDIpOwogICBpbnQgaW5wdXRfaGVpZ2h0ID0gU2l6ZU9mRGltZW5zaW9uKGlucHV0LCAxKTsKQEAgLTExOCwxNSArMTMyLDYgQEAKICAgICAgICAgICAgIGNvbnRleHQsIG51bV9jaGFubmVscyAqIHNpemVvZihpbnQzMl90KSkpOwogICB9CiAKLSAgaWYgKGZpbHRlci0+dHlwZSA9PSBrVGZMaXRlSW50NCkgewotICAgIGludCBmaWx0ZXJfc2l6ZSA9Ci0gICAgICAgIFJ1bnRpbWVTaGFwZShmaWx0ZXItPmRpbXMtPnNpemUsCi0gICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGludDMyX3QqPihmaWx0ZXItPmRpbXMtPmRhdGEpKQotICAgICAgICAgICAgLkZsYXRTaXplKCk7Ci0gICAgY29udGV4dC0+UmVxdWVzdFNjcmF0Y2hCdWZmZXJJbkFyZW5hKAotICAgICAgICBjb250ZXh0LCBmaWx0ZXJfc2l6ZSwgJmRhdGEtPnJlZmVyZW5jZV9vcF9kYXRhLmZpbHRlcl9idWZmZXJfaW5kZXgpOwotICB9Ci0KICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKENhbGN1bGF0ZU9wRGF0YURlcHRod2lzZUNvbnYoCiAgICAgICBjb250ZXh0LCBub2RlLCBwYXJhbXMsIGlucHV0X3dpZHRoLCBpbnB1dF9oZWlnaHQsIGZpbHRlcl93aWR0aCwKICAgICAgIGZpbHRlcl9oZWlnaHQsIG91dHB1dF93aWR0aCwgb3V0cHV0X2hlaWdodCwgZGF0YV90eXBlLApAQCAtMTY4LDggKzE3MywxOCBAQAogICAgIGR3X2NvbnZfcGFyYW1zLmRpbGF0aW9uLmggPSBwYXJhbXMuZGlsYXRpb25faGVpZ2h0X2ZhY3RvcjsKICAgICBkd19jb252X3BhcmFtcy5kaWxhdGlvbi53ID0gcGFyYW1zLmRpbGF0aW9uX3dpZHRoX2ZhY3RvcjsKIAotICAgIGNvbnN0IGludDMyX3QgYnVmX3NpemUgPSBhcm1fZGVwdGh3aXNlX2NvbnZfd3JhcHBlcl9zOF9nZXRfYnVmZmVyX3NpemUoCi0gICAgICAgICZkd19jb252X3BhcmFtcywgJmlucHV0X2RpbXMsICZmaWx0ZXJfZGltcywgJm91dHB1dF9kaW1zKTsKKyAgICBpbnQzMl90IGJ1Zl9zaXplID0gMDsKKyAgICBpZiAoZmlsdGVyLT50eXBlID09IGtUZkxpdGVJbnQ4KSB7CisgICAgICBidWZfc2l6ZSA9IGFybV9kZXB0aHdpc2VfY29udl93cmFwcGVyX3M4X2dldF9idWZmZXJfc2l6ZSgKKyAgICAgICAgICAmZHdfY29udl9wYXJhbXMsICZpbnB1dF9kaW1zLCAmZmlsdGVyX2RpbXMsICZvdXRwdXRfZGltcyk7CisgICAgfSBlbHNlIGlmIChmaWx0ZXItPnR5cGUgPT0ga1RmTGl0ZUludDQpIHsKKyAgICAgIGJ1Zl9zaXplID0gYXJtX2RlcHRod2lzZV9jb252X3dyYXBwZXJfczRfZ2V0X2J1ZmZlcl9zaXplKAorICAgICAgICAgICZkd19jb252X3BhcmFtcywgJmlucHV0X2RpbXMsICZmaWx0ZXJfZGltcywgJm91dHB1dF9kaW1zKTsKKyAgICB9IGVsc2UgeworICAgICAgTWljcm9QcmludGYoIkZpbHRlciB0eXBlICVzICglZCkgbm90IHN1cHBvcnRlZC4iLAorICAgICAgICAgICAgICAgICAgVGZMaXRlVHlwZUdldE5hbWUoZmlsdGVyLT50eXBlKSwgZmlsdGVyLT50eXBlKTsKKyAgICAgIHJldHVybiBrVGZMaXRlRXJyb3I7CisgICAgfQogCiAgICAgaWYgKGJ1Zl9zaXplID4gMCkgewogICAgICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKGNvbnRleHQtPlJlcXVlc3RTY3JhdGNoQnVmZmVySW5BcmVuYSgKQEAgLTI4NSw2ICszMDAsNDMgQEAKICAgICAgIEFSTV9DTVNJU19OTl9TVUNDRVNTKTsKIH0KIAordm9pZCBFdmFsUXVhbnRpemVkUGVyQ2hhbm5lbEludDQoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZURlcHRod2lzZUNvbnZQYXJhbXMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wRGF0YSYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogYmlhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dCkgeworICBjbXNpc19ubl9kd19jb252X3BhcmFtcyBkd19jb252X3BhcmFtczsKKyAgY21zaXNfbm5fcGVyX2NoYW5uZWxfcXVhbnRfcGFyYW1zIHF1YW50X3BhcmFtczsKKyAgY21zaXNfbm5fZGltcyBpbnB1dF9kaW1zOworICBjbXNpc19ubl9kaW1zIGZpbHRlcl9kaW1zOworICBjbXNpc19ubl9kaW1zIGJpYXNfZGltczsKKyAgY21zaXNfbm5fZGltcyBvdXRwdXRfZGltczsKKworICBQb3B1bGF0ZUR3Q29udlBhcmFtcygmZHdfY29udl9wYXJhbXMsICZxdWFudF9wYXJhbXMsICZpbnB1dF9kaW1zLAorICAgICAgICAgICAgICAgICAgICAgICAmZmlsdGVyX2RpbXMsICZiaWFzX2RpbXMsICZvdXRwdXRfZGltcywgcGFyYW1zLCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgZmlsdGVyLCBiaWFzLCBvdXRwdXQpOworCisgIGNtc2lzX25uX2NvbnRleHQgY3R4OworICBjdHguYnVmID0gbnVsbHB0cjsKKyAgLyogJ3NpemUnIGlzIHVudXNlZCAqLworICBjdHguc2l6ZSA9IDA7CisKKyAgaWYgKGRhdGEuYnVmZmVyX2lkeCA+IC0xKSB7CisgICAgY3R4LmJ1ZiA9IGNvbnRleHQtPkdldFNjcmF0Y2hCdWZmZXIoY29udGV4dCwgZGF0YS5idWZmZXJfaWR4KTsKKyAgfQorCisgIFRGTElURV9EQ0hFQ0tfRVEoCisgICAgICBhcm1fZGVwdGh3aXNlX2NvbnZfd3JhcHBlcl9zNCgKKyAgICAgICAgICAmY3R4LCAmZHdfY29udl9wYXJhbXMsICZxdWFudF9wYXJhbXMsICZpbnB1dF9kaW1zLAorICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihpbnB1dCksICZmaWx0ZXJfZGltcywKKyAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4oZmlsdGVyKSwgJmJpYXNfZGltcywKKyAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRPcHRpb25hbFRlbnNvckRhdGE8aW50MzJfdD4oYmlhcyksICZvdXRwdXRfZGltcywKKyAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4ob3V0cHV0KSksCisgICAgICBBUk1fQ01TSVNfTk5fU1VDQ0VTUyk7Cit9CisKIHZvaWQgRXZhbFF1YW50aXplZFBlckNoYW5uZWwxNng4KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZkxpdGVEZXB0aHdpc2VDb252UGFyYW1zJiBwYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcERhdGEmIGRhdGEsCkBAIC0zMzcsOSArMzg5LDYgQEAKICAgICAgICAgICA/IHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dChjb250ZXh0LCBub2RlLCBrRGVwdGh3aXNlQ29udkJpYXNUZW5zb3IpCiAgICAgICAgICAgOiBudWxscHRyOwogCi0gIFRmTGl0ZUV2YWxUZW5zb3IgZmlsdGVyX2ludDggPSB0ZmxpdGU6Om1pY3JvOjpNYWtlVW5wYWNrZWRJbnQ0VGVuc29yKAotICAgICAgY29udGV4dCwgZGF0YS5yZWZlcmVuY2Vfb3BfZGF0YS5maWx0ZXJfYnVmZmVyX2luZGV4LCBmaWx0ZXIpOwotCiAgIHN3aXRjaCAoaW5wdXQtPnR5cGUpIHsgIC8vIEFscmVhZHkga25vdyBpbi9vdXQgdHlwZXMgYXJlIHNhbWUuCiAgICAgY2FzZSBrVGZMaXRlRmxvYXQzMjogewogICAgICAgdGZsaXRlOjpyZWZlcmVuY2Vfb3BzOjpEZXB0aHdpc2VDb252KApAQCAtMzU1LDEwICs0MDQsMTUgQEAKICAgICAgIGJyZWFrOwogICAgIH0KICAgICBjYXNlIGtUZkxpdGVJbnQ4OgotICAgICAgc3dpdGNoIChmaWx0ZXJfaW50OC50eXBlKSB7CisgICAgICBzd2l0Y2ggKGZpbHRlci0+dHlwZSkgewogICAgICAgICBjYXNlIGtUZkxpdGVJbnQ4OiB7Ci0gICAgICAgICAgRXZhbFF1YW50aXplZFBlckNoYW5uZWwoY29udGV4dCwgbm9kZSwgcGFyYW1zLCBkYXRhLCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsdGVyX2ludDgsIGJpYXMsIG91dHB1dCk7CisgICAgICAgICAgRXZhbFF1YW50aXplZFBlckNoYW5uZWwoY29udGV4dCwgbm9kZSwgcGFyYW1zLCBkYXRhLCBpbnB1dCwgZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpYXMsIG91dHB1dCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrVGZMaXRlSW50NDogeworICAgICAgICAgIEV2YWxRdWFudGl6ZWRQZXJDaGFubmVsSW50NChjb250ZXh0LCBub2RlLCBwYXJhbXMsIGRhdGEsIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIsIGJpYXMsIG91dHB1dCk7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDogewpAQCAtMzk5LDExICs0NTMsOCBAQAogICAgICAgICAgID8gdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KGNvbnRleHQsIG5vZGUsIGtEZXB0aHdpc2VDb252Qmlhc1RlbnNvcikKICAgICAgICAgICA6IG51bGxwdHI7CiAKLSAgVGZMaXRlRXZhbFRlbnNvciBmaWx0ZXJfaW50OCA9IHRmbGl0ZTo6bWljcm86Ok1ha2VVbnBhY2tlZEludDRUZW5zb3IoCi0gICAgICBjb250ZXh0LCBkYXRhLnJlZmVyZW5jZV9vcF9kYXRhLmZpbHRlcl9idWZmZXJfaW5kZXgsIGZpbHRlcik7Ci0KLSAgRXZhbFF1YW50aXplZFBlckNoYW5uZWwoY29udGV4dCwgbm9kZSwgcGFyYW1zLCBkYXRhLCBpbnB1dCwgJmZpbHRlcl9pbnQ4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBiaWFzLCBvdXRwdXQpOworICBFdmFsUXVhbnRpemVkUGVyQ2hhbm5lbChjb250ZXh0LCBub2RlLCBwYXJhbXMsIGRhdGEsIGlucHV0LCBmaWx0ZXIsIGJpYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCk7CiAgIHJldHVybiBrVGZMaXRlT2s7CiB9CiAKQEAgLTQzMSw2ICs0ODIsMzAgQEAKICAgcmV0dXJuIGtUZkxpdGVPazsKIH0KIAorVGZMaXRlU3RhdHVzIEV2YWxJbnQ0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKKyAgVEZMSVRFX0RDSEVDSyhub2RlLT51c2VyX2RhdGEgIT0gbnVsbHB0cik7CisgIFRGTElURV9EQ0hFQ0sobm9kZS0+YnVpbHRpbl9kYXRhICE9IG51bGxwdHIpOworCisgIGNvbnN0IGF1dG8mIHBhcmFtcyA9CisgICAgICAqKHJlaW50ZXJwcmV0X2Nhc3Q8VGZMaXRlRGVwdGh3aXNlQ29udlBhcmFtcyo+KG5vZGUtPmJ1aWx0aW5fZGF0YSkpOworICBjb25zdCBPcERhdGEmIGRhdGEgPSAqKHN0YXRpY19jYXN0PE9wRGF0YSo+KG5vZGUtPnVzZXJfZGF0YSkpOworCisgIFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dCA9CisgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsT3V0cHV0KGNvbnRleHQsIG5vZGUsIGtEZXB0aHdpc2VDb252T3V0cHV0VGVuc29yKTsKKyAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXQgPQorICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KGNvbnRleHQsIG5vZGUsIGtEZXB0aHdpc2VDb252SW5wdXRUZW5zb3IpOworICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBmaWx0ZXIgPQorICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KGNvbnRleHQsIG5vZGUsIGtEZXB0aHdpc2VDb252V2VpZ2h0c1RlbnNvcik7CisgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGJpYXMgPQorICAgICAgKE51bUlucHV0cyhub2RlKSA9PSAzKQorICAgICAgICAgID8gdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KGNvbnRleHQsIG5vZGUsIGtEZXB0aHdpc2VDb252Qmlhc1RlbnNvcikKKyAgICAgICAgICA6IG51bGxwdHI7CisKKyAgRXZhbFF1YW50aXplZFBlckNoYW5uZWxJbnQ0KGNvbnRleHQsIG5vZGUsIHBhcmFtcywgZGF0YSwgaW5wdXQsIGZpbHRlciwgYmlhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCk7CisgIHJldHVybiBrVGZMaXRlT2s7Cit9CisKIH0gIC8vIG5hbWVzcGFjZQogCiBURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX0RFUFRIV0lTRV9DT05WXzJEKCkgewpAQCAtNDQ1LDQgKzUyMCw4IEBACiAgIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKEluaXQsIFByZXBhcmUsIEV2YWxJbnQxNng4KTsKIH0KIAorVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9ERVBUSFdJU0VfQ09OVl8yRF9JTlQ0KCkgeworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChJbml0LCBQcmVwYXJlLCBFdmFsSW50NCk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSB0ZmxpdGUKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2Ntc2lzX25uL2Z1bGx5X2Nvbm5lY3RlZC5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2Ntc2lzX25uL2Z1bGx5X2Nvbm5lY3RlZC5jYwppbmRleCBhN2FiOGYxLi43YzM3M2I1IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jbXNpc19ubi9mdWxseV9jb25uZWN0ZWQuY2MKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvY21zaXNfbm4vZnVsbHlfY29ubmVjdGVkLmNjCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IDIwMjIgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8qIENvcHlyaWdodCAyMDI0IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAKIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3RlbnNvcl9jdHlwZXMuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9rZXJuZWxfdXRpbC5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2tlcm5lbF91dGlsLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2FyZW5hX2NvbnN0YW50cy5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19sb2cuaCIKIAogbmFtZXNwYWNlIHRmbGl0ZSB7CkBAIC00Miw2ICs0Myw4IEBACiAgIC8vIEluZGV4IHRvIGJ1ZmZlciBmb3Igb3B0aW1pemF0aW9ucyBpZiBhcHBsaWNhYmxlLgogICBpbnQgYnVmZmVyX2lkeDsKIAorICBpbnQzMl90KiBrZXJuZWxfc3VtczsKKwogICBpbnQzMl90IGJhdGNoZXM7CiAgIGludDMyX3QgYWNjdW1fZGVwdGg7CiAgIGludDMyX3Qgb3V0cHV0X2RlcHRoOwpAQCAtNzMsNyArNzYsMTkgQEAKICAgICAgIG5vZGUsIGtGdWxseUNvbm5lY3RlZE91dHB1dFRlbnNvcik7CiAgIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIG91dHB1dCAhPSBudWxscHRyKTsKIAotICBURl9MSVRFX0VOU1VSRV9UWVBFU19FUShjb250ZXh0LCBpbnB1dC0+dHlwZSwgb3V0cHV0LT50eXBlKTsKKyAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgaW5wdXQtPnR5cGUsIG91dHB1dC0+dHlwZSk7CisgIFRGX0xJVEVfRU5TVVJFX01TRyhjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgaW5wdXQtPnR5cGUgPT0ga1RmTGl0ZUZsb2F0MzIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC0+dHlwZSA9PSBrVGZMaXRlSW50MTYgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC0+dHlwZSA9PSBrVGZMaXRlSW50OCwKKyAgICAgICAgICAgICAgICAgICAgICJJbnB1dCBkYXRhIHR5cGUgbm90IHN1cHBvcnRlZCIpOworICBURl9MSVRFX0VOU1VSRV9NU0coCisgICAgICBjb250ZXh0LAorICAgICAgKGlucHV0LT50eXBlID09IGtUZkxpdGVGbG9hdDMyICYmIGZpbHRlci0+dHlwZSA9PSBrVGZMaXRlRmxvYXQzMikgfHwKKyAgICAgICAgICAoaW5wdXQtPnR5cGUgPT0ga1RmTGl0ZUludDE2ICYmIGZpbHRlci0+dHlwZSA9PSBrVGZMaXRlSW50OCkgfHwKKyAgICAgICAgICAoaW5wdXQtPnR5cGUgPT0ga1RmTGl0ZUludDggJiYKKyAgICAgICAgICAgKGZpbHRlci0+dHlwZSA9PSBrVGZMaXRlSW50NCB8fCBmaWx0ZXItPnR5cGUgPT0ga1RmTGl0ZUludDgpKSwKKyAgICAgICJIeWJyaWQgbW9kZWxzIGFyZSBub3Qgc3VwcG9ydGVkIG9uIFRGTGl0ZSBNaWNyby4iKTsKIAogICBjb25zdCBSdW50aW1lU2hhcGUgZmlsdGVyX3NoYXBlID0gR2V0VGVuc29yU2hhcGUoZmlsdGVyKTsKICAgY29uc3QgUnVudGltZVNoYXBlIG91dHB1dF9zaGFwZSA9IEdldFRlbnNvclNoYXBlKG91dHB1dCk7CkBAIC0xMDEsNyArMTE2LDcgQEAKICAgICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBpbnB1dC0+cGFyYW1zLnplcm9fcG9pbnQsIDApOwogICAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIG91dHB1dC0+cGFyYW1zLnplcm9fcG9pbnQsIDApOwogICAgIGJ1Zl9zaXplID0gYXJtX2Z1bGx5X2Nvbm5lY3RlZF9zMTZfZ2V0X2J1ZmZlcl9zaXplKCZmaWx0ZXJfZGltcyk7Ci0gIH0gZWxzZSBpZiAoaW5wdXQtPnR5cGUgPT0ga1RmTGl0ZUludDgpIHsKKyAgfSBlbHNlIGlmIChpbnB1dC0+dHlwZSA9PSBrVGZMaXRlSW50OCAmJiBmaWx0ZXItPnR5cGUgIT0ga1RmTGl0ZUludDQpIHsKICAgICBjb25zdCBSdW50aW1lU2hhcGUgaW5wdXRfc2hhcGUgPSBHZXRUZW5zb3JTaGFwZShpbnB1dCk7CiAKICAgICBURkxJVEVfRENIRUNLX0dFKG91dHB1dF9kaW1fY291bnQsIDIpOwpAQCAtMTIyLDE4ICsxMzcsMjMgQEAKICAgICAgIGlucHV0X2RpbXMuYyA9IGRhdGEtPmFjY3VtX2RlcHRoOwogCiAgICAgICBidWZfc2l6ZSA9IGFybV9jb252b2x2ZV8xeDFfczhfZmFzdF9nZXRfYnVmZmVyX3NpemUoJmlucHV0X2RpbXMpOwotICAgIH0gZWxzZSB7CisgICAgfSBlbHNlIGlmIChpbnB1dC0+dHlwZSA9PSBrVGZMaXRlSW50OCkgewogICAgICAgYnVmX3NpemUgPSBhcm1fZnVsbHlfY29ubmVjdGVkX3M4X2dldF9idWZmZXJfc2l6ZSgmZmlsdGVyX2RpbXMpOwotICAgIH0KLSAgfQogCi0gIGlmIChmaWx0ZXItPnR5cGUgPT0ga1RmTGl0ZUludDQpIHsKLSAgICBpbnQgZmlsdGVyX3NpemUgPQotICAgICAgICBSdW50aW1lU2hhcGUoZmlsdGVyLT5kaW1zLT5zaXplLAotICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQzMl90Kj4oZmlsdGVyLT5kaW1zLT5kYXRhKSkKLSAgICAgICAgICAgIC5GbGF0U2l6ZSgpOwotICAgIGNvbnRleHQtPlJlcXVlc3RTY3JhdGNoQnVmZmVySW5BcmVuYSgKLSAgICAgICAgY29udGV4dCwgZmlsdGVyX3NpemUsICZkYXRhLT5yZWZlcmVuY2Vfb3BfZGF0YS5maWx0ZXJfYnVmZmVyX2luZGV4KTsKKyAgICAgIGludDhfdCogZmlsdGVyX2RhdGEgPSBHZXRUZW5zb3JEYXRhPGludDhfdD4oZmlsdGVyKTsKKyAgICAgIGRhdGEtPmtlcm5lbF9zdW1zID0gbnVsbHB0cjsKKworICAgICAgaWYgKGJ1Zl9zaXplID4gMCAmJiBmaWx0ZXJfZGF0YSAhPSBudWxscHRyKSB7CisgICAgICAgIGRhdGEtPmtlcm5lbF9zdW1zID0gc3RhdGljX2Nhc3Q8aW50MzJfdCo+KAorICAgICAgICAgICAgY29udGV4dC0+QWxsb2NhdGVQZXJzaXN0ZW50QnVmZmVyKGNvbnRleHQsIGJ1Zl9zaXplKSk7CisKKyAgICAgICAgYXJtX3ZlY3Rvcl9zdW1fczgoZGF0YS0+a2VybmVsX3N1bXMsIGZpbHRlcl9kaW1zLm4sIGRhdGEtPm91dHB1dF9kZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyX2RhdGEsIDEsIG51bGxwdHIpOworCisgICAgICAgIC8vIERvIG5vdCByZXF1ZXN0IGEgc2NyYXRjaCBidWZmZXIgc2luY2UgdXNpbmcgcGVyc2lzdGVudCBtZW1vcnkKKyAgICAgICAgYnVmX3NpemUgPSAwOworICAgICAgfQorICAgIH0KICAgfQogCiAgIGlmIChidWZfc2l6ZSA+IDApIHsKQEAgLTE4OCw2ICsyMDgsNDkgQEAKICAgfQogfQogCitUZkxpdGVTdGF0dXMgRXZhbFF1YW50aXplZEludDQoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcERhdGEmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGJpYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGZMaXRlRXZhbFRlbnNvciogb3V0cHV0KSB7CisgIGNvbnN0IFJ1bnRpbWVTaGFwZSBvdXRwdXRfc2hhcGUgPSB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShvdXRwdXQpOworICBjb25zdCBpbnQgb3V0cHV0X2RpbV9jb3VudCA9IG91dHB1dF9zaGFwZS5EaW1lbnNpb25zQ291bnQoKTsKKyAgVEZMSVRFX0RDSEVDS19HRShvdXRwdXRfZGltX2NvdW50LCAyKTsKKyAgVEZMSVRFX0RDSEVDS19MRShvdXRwdXRfZGltX2NvdW50LCA0KTsKKworICBjbXNpc19ubl9wZXJfdGVuc29yX3F1YW50X3BhcmFtcyBxdWFudF9wYXJhbXM7CisgIGNtc2lzX25uX2RpbXMgaW5wdXRfZGltczsKKyAgY21zaXNfbm5fZGltcyBmaWx0ZXJfZGltczsKKyAgY21zaXNfbm5fZGltcyBiaWFzX2RpbXM7CisgIGNtc2lzX25uX2RpbXMgb3V0cHV0X2RpbXM7CisgIGNtc2lzX25uX2NvbnRleHQgY3R4OworCisgIFBvcHVsYXRlQ29tbW9uUGFyYW1zKGNvbnRleHQsICZxdWFudF9wYXJhbXMsICZpbnB1dF9kaW1zLCAmZmlsdGVyX2RpbXMsCisgICAgICAgICAgICAgICAgICAgICAgICZiaWFzX2RpbXMsICZvdXRwdXRfZGltcywgJmN0eCwgZGF0YSk7CisKKyAgY29uc3QgaW50MzJfdCogYmlhc19kYXRhID0KKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldE9wdGlvbmFsVGVuc29yRGF0YTxpbnQzMl90PihiaWFzKTsKKworICBjbXNpc19ubl9mY19wYXJhbXMgZmNfcGFyYW1zOworICBmY19wYXJhbXMuaW5wdXRfb2Zmc2V0ID0gLWRhdGEucmVmZXJlbmNlX29wX2RhdGEuaW5wdXRfemVyb19wb2ludDsKKyAgZmNfcGFyYW1zLm91dHB1dF9vZmZzZXQgPSBkYXRhLnJlZmVyZW5jZV9vcF9kYXRhLm91dHB1dF96ZXJvX3BvaW50OworICBmY19wYXJhbXMuZmlsdGVyX29mZnNldCA9IDA7CisgIGZjX3BhcmFtcy5hY3RpdmF0aW9uLm1pbiA9IGRhdGEucmVmZXJlbmNlX29wX2RhdGEub3V0cHV0X2FjdGl2YXRpb25fbWluOworICBmY19wYXJhbXMuYWN0aXZhdGlvbi5tYXggPSBkYXRhLnJlZmVyZW5jZV9vcF9kYXRhLm91dHB1dF9hY3RpdmF0aW9uX21heDsKKworICBURl9MSVRFX0VOU1VSRV9FUSgKKyAgICAgIGNvbnRleHQsCisgICAgICBhcm1fZnVsbHlfY29ubmVjdGVkX3M0KAorICAgICAgICAgICZjdHgsICZmY19wYXJhbXMsICZxdWFudF9wYXJhbXMsICZpbnB1dF9kaW1zLAorICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihpbnB1dCksICZmaWx0ZXJfZGltcywKKyAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4oZmlsdGVyKSwgJmJpYXNfZGltcywgYmlhc19kYXRhLAorICAgICAgICAgICZvdXRwdXRfZGltcywgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KG91dHB1dCkpLAorICAgICAgQVJNX0NNU0lTX05OX1NVQ0NFU1MpOworCisgIHJldHVybiBrVGZMaXRlT2s7Cit9CisKIFRmTGl0ZVN0YXR1cyBFdmFsUXVhbnRpemVkSW50OChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wRGF0YSYgZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dCwKQEAgLTI0NywxMSArMzEwLDIwIEBACiAgIH0gZWxzZSB7CiAgICAgY21zaXNfbm5fZmNfcGFyYW1zIGZjX3BhcmFtczsKICAgICBmY19wYXJhbXMuaW5wdXRfb2Zmc2V0ID0gLWRhdGEucmVmZXJlbmNlX29wX2RhdGEuaW5wdXRfemVyb19wb2ludDsKKyAgICBmY19wYXJhbXMuZmlsdGVyX29mZnNldCA9IC1kYXRhLnJlZmVyZW5jZV9vcF9kYXRhLmZpbHRlcl96ZXJvX3BvaW50OwogICAgIGZjX3BhcmFtcy5vdXRwdXRfb2Zmc2V0ID0gZGF0YS5yZWZlcmVuY2Vfb3BfZGF0YS5vdXRwdXRfemVyb19wb2ludDsKLSAgICBmY19wYXJhbXMuZmlsdGVyX29mZnNldCA9IDA7CiAgICAgZmNfcGFyYW1zLmFjdGl2YXRpb24ubWluID0gZGF0YS5yZWZlcmVuY2Vfb3BfZGF0YS5vdXRwdXRfYWN0aXZhdGlvbl9taW47CiAgICAgZmNfcGFyYW1zLmFjdGl2YXRpb24ubWF4ID0gZGF0YS5yZWZlcmVuY2Vfb3BfZGF0YS5vdXRwdXRfYWN0aXZhdGlvbl9tYXg7CiAKKyAgICBpZiAoZGF0YS5rZXJuZWxfc3VtcyAhPSBudWxscHRyKSB7CisgICAgICBjdHguYnVmID0gZGF0YS5rZXJuZWxfc3VtczsKKyAgICB9IGVsc2UgaWYgKGN0eC5idWYgIT0gbnVsbHB0cikgeworICAgICAgLy8gSWYgYmVoYXZpbmcgbGlrZSBiYXRjaCBtYXRtdWwgd2UgY2FsY3VsYXRlIGtlcm5lbCBzdW1zIGluIGV2YWwuCisgICAgICBhcm1fdmVjdG9yX3N1bV9zOCgKKyAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90Kj4oY3R4LmJ1ZiksIGZpbHRlcl9kaW1zLm4sIGRhdGEub3V0cHV0X2RlcHRoLAorICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihmaWx0ZXIpLCAxLCBudWxscHRyKTsKKyAgICB9CisKICAgICBURl9MSVRFX0VOU1VSRV9FUSgKICAgICAgICAgY29udGV4dCwKICAgICAgICAgYXJtX2Z1bGx5X2Nvbm5lY3RlZF9zOCgKQEAgLTMxOSw5ICszOTEsNiBAQAogICBURkxJVEVfRENIRUNLKG5vZGUtPnVzZXJfZGF0YSAhPSBudWxscHRyKTsKICAgY29uc3QgT3BEYXRhJiBkYXRhID0gKihzdGF0aWNfY2FzdDxjb25zdCBPcERhdGEqPihub2RlLT51c2VyX2RhdGEpKTsKIAotICBUZkxpdGVFdmFsVGVuc29yIGZpbHRlcl9pbnQ4ID0gdGZsaXRlOjptaWNybzo6TWFrZVVucGFja2VkSW50NFRlbnNvcigKLSAgICAgIGNvbnRleHQsIGRhdGEucmVmZXJlbmNlX29wX2RhdGEuZmlsdGVyX2J1ZmZlcl9pbmRleCwgZmlsdGVyKTsKLQogICAvLyBDaGVja3MgaW4gUHJlcGFyZSBlbnN1cmUgaW5wdXQsIG91dHB1dCBhbmQgZmlsdGVyIHR5cGVzIGFyZSBhbGwgdGhlIHNhbWUuCiAgIHN3aXRjaCAoaW5wdXQtPnR5cGUpIHsKICAgICBjYXNlIGtUZkxpdGVGbG9hdDMyOiB7CkBAIC0zMzksMTAgKzQwOCwxMyBAQAogICAgICAgYnJlYWs7CiAgICAgfQogICAgIGNhc2Uga1RmTGl0ZUludDg6IHsKLSAgICAgIHN3aXRjaCAoZmlsdGVyX2ludDgudHlwZSkgeworICAgICAgc3dpdGNoIChmaWx0ZXItPnR5cGUpIHsKKyAgICAgICAgY2FzZSBrVGZMaXRlSW50NDoKKyAgICAgICAgICByZXR1cm4gRXZhbFF1YW50aXplZEludDQoY29udGV4dCwgbm9kZSwgZGF0YSwgaW5wdXQsIGZpbHRlciwgYmlhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0KTsKICAgICAgICAgY2FzZSBrVGZMaXRlSW50ODoKLSAgICAgICAgICByZXR1cm4gRXZhbFF1YW50aXplZEludDgoY29udGV4dCwgbm9kZSwgZGF0YSwgaW5wdXQsICZmaWx0ZXJfaW50OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlhcywgb3V0cHV0KTsKKyAgICAgICAgICByZXR1cm4gRXZhbFF1YW50aXplZEludDgoY29udGV4dCwgbm9kZSwgZGF0YSwgaW5wdXQsIGZpbHRlciwgYmlhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0KTsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICBNaWNyb1ByaW50ZigiRmlsdGVyIFR5cGUgJXMgKCVkKSBub3Qgc3VwcG9ydGVkLiIsCiAgICAgICAgICAgICAgICAgICAgICAgVGZMaXRlVHlwZUdldE5hbWUoZmlsdGVyLT50eXBlKSwgZmlsdGVyLT50eXBlKTsKQEAgLTM2Myw2ICs0MzUsMjkgQEAKICAgcmV0dXJuIGtUZkxpdGVPazsKIH0KIAorVGZMaXRlU3RhdHVzIEV2YWxJbnQ0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKKyAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXQgPQorICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KGNvbnRleHQsIG5vZGUsIGtGdWxseUNvbm5lY3RlZElucHV0VGVuc29yKTsKKyAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogZmlsdGVyID0KKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dChjb250ZXh0LCBub2RlLCBrRnVsbHlDb25uZWN0ZWRXZWlnaHRzVGVuc29yKTsKKyAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogYmlhcyA9CisgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsSW5wdXQoY29udGV4dCwgbm9kZSwga0Z1bGx5Q29ubmVjdGVkQmlhc1RlbnNvcik7CisgIFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dCA9CisgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsT3V0cHV0KGNvbnRleHQsIG5vZGUsIGtGdWxseUNvbm5lY3RlZE91dHB1dFRlbnNvcik7CisKKyAgVEZMSVRFX0RDSEVDSyhub2RlLT51c2VyX2RhdGEgIT0gbnVsbHB0cik7CisgIGNvbnN0IE9wRGF0YSYgZGF0YSA9ICooc3RhdGljX2Nhc3Q8Y29uc3QgT3BEYXRhKj4obm9kZS0+dXNlcl9kYXRhKSk7CisKKyAgLy8gQ2hlY2tzIGluIFByZXBhcmUgZW5zdXJlIGlucHV0LCBvdXRwdXQgYW5kIGZpbHRlciB0eXBlcyBhcmUgYWxsIHRoZSBzYW1lLgorICBpZiAoaW5wdXQtPnR5cGUgIT0ga1RmTGl0ZUludDggJiYgZmlsdGVyLT50eXBlICE9IGtUZkxpdGVJbnQ0KSB7CisgICAgTWljcm9QcmludGYoIlR5cGUgJXMgKCVkKSBub3Qgc3VwcG9ydGVkLiIsIFRmTGl0ZVR5cGVHZXROYW1lKGlucHV0LT50eXBlKSwKKyAgICAgICAgICAgICAgICBpbnB1dC0+dHlwZSk7CisgICAgcmV0dXJuIGtUZkxpdGVFcnJvcjsKKyAgfQorCisgIHJldHVybiBFdmFsUXVhbnRpemVkSW50NChjb250ZXh0LCBub2RlLCBkYXRhLCBpbnB1dCwgZmlsdGVyLCBiaWFzLCBvdXRwdXQpOworfQorCiAvLyBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgZnVuY3Rpb24gbmFtZXMgYXJlIG5vdCBpZGVhbCBhdCBhbGwgKHRoaXMgRXZhbEludDgKIC8vIGZ1bmN0aW9uIGludGVybmFsbHkgY2FsbHMgRXZhbFF1YW50aXplZEludDgsIGFuZCB0aGVyZSBpcyBzaW1pbGFyIG5hbWUKIC8vIGFsaWFzaW5nIGluIHRoZSBFdmFsIGZ1bmN0aW9uIHRvbykuIFdlIHdpbGwgYmUgYXR0ZW1wdGluZyB0byBoYXZlIGEgbW9yZQpAQCAtMzg5LDExICs0ODQsNyBAQAogICAgIHJldHVybiBrVGZMaXRlRXJyb3I7CiAgIH0KIAotICBUZkxpdGVFdmFsVGVuc29yIGZpbHRlcl9pbnQ4ID0gdGZsaXRlOjptaWNybzo6TWFrZVVucGFja2VkSW50NFRlbnNvcigKLSAgICAgIGNvbnRleHQsIGRhdGEucmVmZXJlbmNlX29wX2RhdGEuZmlsdGVyX2J1ZmZlcl9pbmRleCwgZmlsdGVyKTsKLQotICByZXR1cm4gRXZhbFF1YW50aXplZEludDgoY29udGV4dCwgbm9kZSwgZGF0YSwgaW5wdXQsICZmaWx0ZXJfaW50OCwgYmlhcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCk7CisgIHJldHVybiBFdmFsUXVhbnRpemVkSW50OChjb250ZXh0LCBub2RlLCBkYXRhLCBpbnB1dCwgZmlsdGVyLCBiaWFzLCBvdXRwdXQpOwogfQogCiBUZkxpdGVTdGF0dXMgRXZhbEludDE2KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKQEAgLTQyNSw2ICs1MTYsMTAgQEAKICAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoSW5pdCwgUHJlcGFyZSwgRXZhbCk7CiB9CiAKK1RGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfRlVMTFlfQ09OTkVDVEVEX0lOVDQoKSB7CisgIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKEluaXQsIFByZXBhcmUsIEV2YWxJbnQ0KTsKK30KKwogVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9GVUxMWV9DT05ORUNURURfSU5UOCgpIHsKICAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoSW5pdCwgUHJlcGFyZSwgRXZhbEludDgpOwogfQpAQCAtNDMzLDQgKzUyOCw4IEBACiAgIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKEluaXQsIFByZXBhcmUsIEV2YWxJbnQxNik7CiB9CiAKK1RGTE1JbmZlcmVuY2VSZWdpc3RyYXRpb24gUmVnaXN0ZXJJbmZlcmVuY2VfRlVMTFlfQ09OTkVDVEVEKCkgeworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChFdmFsKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvY21zaXNfbm4vc29mdG1heC5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2Ntc2lzX25uL3NvZnRtYXguY2MKaW5kZXggZjgzYTA5MC4uNjUxNTY5MSAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvY21zaXNfbm4vc29mdG1heC5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jbXNpc19ubi9zb2Z0bWF4LmNjCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IDIwMjIgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8qIENvcHlyaWdodCAyMDI0IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAKIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtNTIsNiArNTIsMTcgQEAKICAgVGZMaXRlVGVuc29yKiBvdXRwdXQgPSBtaWNyb19jb250ZXh0LT5BbGxvY2F0ZVRlbXBPdXRwdXRUZW5zb3Iobm9kZSwgMCk7CiAgIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIG91dHB1dCAhPSBudWxscHRyKTsKIAorICBURl9MSVRFX0VOU1VSRV9NU0coCisgICAgICBjb250ZXh0LAorICAgICAgaW5wdXQtPnR5cGUgPT0gb3V0cHV0LT50eXBlIHx8CisgICAgICAgICAgKGlucHV0LT50eXBlID09IGtUZkxpdGVJbnQ4ICYmIG91dHB1dC0+dHlwZSA9PSBrVGZMaXRlSW50MTYpLAorICAgICAgIklucHV0IGFuZCBvdXRwdXQgZGF0YSB0eXBlcyBhcmUgbm90IHN1cHBvcnRlZCB0b2dldGhlci4iKTsKKyAgVEZfTElURV9FTlNVUkVfTVNHKGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICBpbnB1dC0+dHlwZSA9PSBrVGZMaXRlRmxvYXQzMiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LT50eXBlID09IGtUZkxpdGVJbnQxNiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LT50eXBlID09IGtUZkxpdGVJbnQ4LAorICAgICAgICAgICAgICAgICAgICAgIklucHV0IGRhdGEgdHlwZSBub3Qgc3VwcG9ydGVkIik7CisKICAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgbm9kZS0+dXNlcl9kYXRhICE9IG51bGxwdHIpOwogICBDTVNJU05OU29mdG1heFBhcmFtcyogb3BfZGF0YSA9CiAgICAgICBzdGF0aWNfY2FzdDxDTVNJU05OU29mdG1heFBhcmFtcyo+KG5vZGUtPnVzZXJfZGF0YSk7CmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jbXNpc19ubi9zdmRmLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvY21zaXNfbm4vc3ZkZi5jYwppbmRleCAwM2RiYWVlLi5iZjY0MDE2IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jbXNpc19ubi9zdmRmLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2Ntc2lzX25uL3N2ZGYuY2MKQEAgLTEsNCArMSw0IEBACi0vKiBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLyogQ29weXJpZ2h0IDIwMjQgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIAogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0zMSw5ICszMSwxOTUgQEAKIG5hbWVzcGFjZSB0ZmxpdGUgewogbmFtZXNwYWNlIHsKIAorc3RydWN0IENtc2lzTm5PcERhdGFTdmRmIHsKKyAgaW50MzJfdCBlZmZlY3RpdmVfc2NhbGVfMV9hOworICBpbnQzMl90IGVmZmVjdGl2ZV9zY2FsZV8yX2E7CisgIC8vIGIgdmVyc2lvbnMgb2YgZWFjaCBzY2FsZSBhcmUga2VwdCBhdCBpbnQgc2luY2UgdGhlIG51bWJlcnMgYXJlIGp1c3QgdGhlCisgIC8vIHNoaWZ0IHZhbHVlIC0gdHlwaWNhbGx5IGJldHdlZW4gWy0zMiwgMzJdLgorICBpbnQgZWZmZWN0aXZlX3NjYWxlXzFfYjsKKyAgaW50IGVmZmVjdGl2ZV9zY2FsZV8yX2I7CisgIGludCBzY3JhdGNoX3RlbnNvcl9pbmRleDsKKyAgaW50IHNjcmF0Y2hfb3V0cHV0X3RlbnNvcl9pbmRleDsKKworICAvLyBDYWNoZWQgdGVuc29yIHplcm8gcG9pbnQgdmFsdWVzIGZvciBxdWFudGl6ZWQgb3BlcmF0aW9ucy4KKyAgaW50IGlucHV0X3plcm9fcG9pbnQ7CisgIGludCBvdXRwdXRfemVyb19wb2ludDsKKyAgaW50IGFjdGl2YXRpb25fc3RhdGVfemVyb19wb2ludDsKKyAgaW50MzJfdCoga2VybmVsX3N1bXM7Cit9OworCiB2b2lkKiBJbml0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgewogICBURkxJVEVfRENIRUNLKGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlciAhPSBudWxscHRyKTsKLSAgcmV0dXJuIGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlcihjb250ZXh0LCBzaXplb2YoT3BEYXRhU3ZkZikpOworICByZXR1cm4gY29udGV4dC0+QWxsb2NhdGVQZXJzaXN0ZW50QnVmZmVyKGNvbnRleHQsIHNpemVvZihDbXNpc05uT3BEYXRhU3ZkZikpOworfQorCitUZkxpdGVTdGF0dXMgQ21zaXNOblByZXBhcmVTdmRmKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKKyAgVEZMSVRFX0RDSEVDSyhub2RlLT5idWlsdGluX2RhdGEgIT0gbnVsbHB0cik7CisKKyAgY29uc3QgYXV0byogcGFyYW1zID0gc3RhdGljX2Nhc3Q8Y29uc3QgVGZMaXRlU1ZERlBhcmFtcyo+KG5vZGUtPmJ1aWx0aW5fZGF0YSk7CisKKyAgTWljcm9Db250ZXh0KiBtaWNyb19jb250ZXh0ID0gR2V0TWljcm9Db250ZXh0KGNvbnRleHQpOworCisgIC8vIFZhbGlkYXRlIFRlbnNvciBJbnB1dHMgKGR0eXBlIGRlcGVuZHMgb24gcXVhbnRpemF0aW9uKToKKyAgLy8gWzBdID0gSW5wdXQsIHsyLCBiYXRjaF9zaXplLCBpbnB1dF9zaXplfQorICAvLyBbMV0gPSBXZWlnaHRzIEZlYXR1cmUsIHsyLCBudW1fZmlsdGVycywgaW5wdXRfc2l6ZX0KKyAgLy8gWzJdID0gV2VpZ2h0cyBUaW1lLCB7MiwgbnVtX2ZpbHRlcnMsIG1lbW9yeV9zaXplfQorICAvLyBbM10gPSBCaWFzIChvcHRpb25hbCksIHsxLCBudW1fdW5pdHN9CisgIC8vIFs0XSA9IEFjdGl2YXRpb24gU3RhdGUgKHZhcmlhYmxlKSwKKyAgLy8gICAgICAgICB7MiwgYmF0Y2hfc2l6ZSwgbWVtb3J5X3NpemUgKiBudW1fZmlsdGVyc30KKyAgVGZMaXRlVGVuc29yKiBpbnB1dCA9CisgICAgICBtaWNyb19jb250ZXh0LT5BbGxvY2F0ZVRlbXBJbnB1dFRlbnNvcihub2RlLCBrU3ZkZklucHV0VGVuc29yKTsKKyAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgaW5wdXQgIT0gbnVsbHB0cik7CisgIFRmTGl0ZVRlbnNvciogd2VpZ2h0c19mZWF0dXJlID0KKyAgICAgIG1pY3JvX2NvbnRleHQtPkFsbG9jYXRlVGVtcElucHV0VGVuc29yKG5vZGUsIGtTdmRmV2VpZ2h0c0ZlYXR1cmVUZW5zb3IpOworICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCB3ZWlnaHRzX2ZlYXR1cmUgIT0gbnVsbHB0cik7CisgIFRmTGl0ZVRlbnNvciogd2VpZ2h0c190aW1lID0KKyAgICAgIG1pY3JvX2NvbnRleHQtPkFsbG9jYXRlVGVtcElucHV0VGVuc29yKG5vZGUsIGtTdmRmV2VpZ2h0c1RpbWVUZW5zb3IpOworICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCB3ZWlnaHRzX3RpbWUgIT0gbnVsbHB0cik7CisgIFRmTGl0ZVRlbnNvciogYmlhcyA9CisgICAgICBtaWNyb19jb250ZXh0LT5BbGxvY2F0ZVRlbXBJbnB1dFRlbnNvcihub2RlLCBrU3ZkZkJpYXNUZW5zb3IpOworICBUZkxpdGVUZW5zb3IqIGFjdGl2YXRpb25fc3RhdGUgPSBtaWNyb19jb250ZXh0LT5BbGxvY2F0ZVRlbXBJbnB1dFRlbnNvcigKKyAgICAgIG5vZGUsIGtTdmRmSW5wdXRBY3RpdmF0aW9uU3RhdGVUZW5zb3IpOworICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCBhY3RpdmF0aW9uX3N0YXRlICE9IG51bGxwdHIpOworCisgIC8vIERlZmluZSBpbnB1dCBjb25zdGFudHMgYmFzZWQgb24gaW5wdXQgdGVuc29yIGRlZmluaXRpb24gYWJvdmU6CisgIGNvbnN0IGludCByYW5rID0gcGFyYW1zLT5yYW5rOworICBjb25zdCBpbnQgaW5wdXRfc2l6ZSA9IGlucHV0LT5kaW1zLT5kYXRhWzFdOworICBjb25zdCBpbnQgYmF0Y2hfc2l6ZSA9IGlucHV0LT5kaW1zLT5kYXRhWzBdOworICBjb25zdCBpbnQgbnVtX2ZpbHRlcnMgPSB3ZWlnaHRzX2ZlYXR1cmUtPmRpbXMtPmRhdGFbMF07CisgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIG51bV9maWx0ZXJzICUgcmFuaywgMCk7CisgIGNvbnN0IGludCBudW1fdW5pdHMgPSBudW1fZmlsdGVycyAvIHJhbms7CisgIGNvbnN0IGludCBtZW1vcnlfc2l6ZSA9IHdlaWdodHNfdGltZS0+ZGltcy0+ZGF0YVsxXTsKKworICAvLyBWYWxpZGF0ZSBJbnB1dCBUZW5zb3I6CisgIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsCisgICAgICAgICAgICAgICAgIGlucHV0LT50eXBlID09IGtUZkxpdGVGbG9hdDMyIHx8IGlucHV0LT50eXBlID09IGtUZkxpdGVJbnQ4KTsKKyAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgTnVtRGltZW5zaW9ucyhpbnB1dCksIDIpOworCisgIC8vIFZhbGlkYXRlIFRlbnNvciBPdXRwdXQ6CisgIC8vIFswXSA9IGZsb2F0L2ludDhfdCwgezIsIGJhdGNoX3NpemUsIG51bV91bml0c30KKyAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgbm9kZS0+b3V0cHV0cy0+c2l6ZSwgMSk7CisgIFRmTGl0ZVRlbnNvciogb3V0cHV0ID0KKyAgICAgIG1pY3JvX2NvbnRleHQtPkFsbG9jYXRlVGVtcE91dHB1dFRlbnNvcihub2RlLCBrU3ZkZk91dHB1dFRlbnNvcik7CisgIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIG91dHB1dCAhPSBudWxscHRyKTsKKyAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgTnVtRGltZW5zaW9ucyhvdXRwdXQpLCAyKTsKKyAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgb3V0cHV0LT5kaW1zLT5kYXRhWzBdLCBiYXRjaF9zaXplKTsKKyAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgb3V0cHV0LT5kaW1zLT5kYXRhWzFdLCBudW1fdW5pdHMpOworCisgIC8vIFZhbGlkYXRlIFdlaWdodHMgRmVhdHVyZSBJbnB1dCBUZW5zb3I6CisgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bURpbWVuc2lvbnMod2VpZ2h0c19mZWF0dXJlKSwgMik7CisgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIHdlaWdodHNfZmVhdHVyZS0+ZGltcy0+ZGF0YVsxXSwgaW5wdXRfc2l6ZSk7CisKKyAgLy8gVmFsaWRhdGUgV2VpZ2h0cyBUaW1lIElucHV0IFRlbnNvcjoKKyAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgTnVtRGltZW5zaW9ucyh3ZWlnaHRzX3RpbWUpLCAyKTsKKyAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgd2VpZ2h0c190aW1lLT5kaW1zLT5kYXRhWzBdLCBudW1fZmlsdGVycyk7CisgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIHdlaWdodHNfdGltZS0+ZGltcy0+ZGF0YVsxXSwgbWVtb3J5X3NpemUpOworCisgIC8vIFZhbGlkYXRlIE9wdGlvbmFsIEJpYXMgSW5wdXQgVGVuc29yOgorICBpZiAoYmlhcyAhPSBudWxscHRyKSB7CisgICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgYmlhcy0+ZGltcy0+ZGF0YVswXSwgbnVtX3VuaXRzKTsKKyAgfQorCisgIC8vIFZhbGlkYXRlIEFjdGl2YXRpb24gU3RhdGUgSW5wdXQgVGVuc29yOgorICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBOdW1EaW1lbnNpb25zKGFjdGl2YXRpb25fc3RhdGUpLCAyKTsKKyAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgYWN0aXZhdGlvbl9zdGF0ZS0+ZGltcy0+ZGF0YVswXSwgYmF0Y2hfc2l6ZSk7CisgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIGFjdGl2YXRpb25fc3RhdGUtPmRpbXMtPmRhdGFbMV0sCisgICAgICAgICAgICAgICAgICAgIG1lbW9yeV9zaXplICogbnVtX2ZpbHRlcnMpOworICAvLyBTaW5jZSBpc192YXJpYWJsZSBpcyBub3QgcGFydCBvZiBURkxpdGVFdmFsVGVuc29yLCBjaGVjayBpc192YXJpYWJsZSBoZXJlLgorICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBhY3RpdmF0aW9uX3N0YXRlLT5pc192YXJpYWJsZSwgdHJ1ZSk7CisKKyAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgbm9kZS0+aW5wdXRzLT5zaXplLCA1KTsKKworICBURkxJVEVfRENIRUNLKG5vZGUtPnVzZXJfZGF0YSAhPSBudWxscHRyKTsKKyAgQ21zaXNObk9wRGF0YVN2ZGYqIGRhdGEgPSBzdGF0aWNfY2FzdDxDbXNpc05uT3BEYXRhU3ZkZio+KG5vZGUtPnVzZXJfZGF0YSk7CisKKyAgaWYgKGlucHV0LT50eXBlID09IGtUZkxpdGVJbnQ4KSB7CisgICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgd2VpZ2h0c19mZWF0dXJlLT50eXBlLCBrVGZMaXRlSW50OCk7CisgICAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgKHdlaWdodHNfdGltZS0+dHlwZSA9PSBrVGZMaXRlSW50MTYpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3ZWlnaHRzX3RpbWUtPnR5cGUgPT0ga1RmTGl0ZUludDgpKTsKKyAgICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCAoYWN0aXZhdGlvbl9zdGF0ZS0+dHlwZSA9PSBrVGZMaXRlSW50MTYpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhY3RpdmF0aW9uX3N0YXRlLT50eXBlID09IGtUZkxpdGVJbnQ4KSk7CisgICAgaWYgKGJpYXMgIT0gbnVsbHB0cikgeworICAgICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgYmlhcy0+dHlwZSwga1RmTGl0ZUludDMyKTsKKyAgICB9CisKKyAgICBURl9MSVRFX0VOU1VSRV9UWVBFU19FUShjb250ZXh0LCBvdXRwdXQtPnR5cGUsIGtUZkxpdGVJbnQ4KTsKKworICAgIGNvbnN0IGRvdWJsZSBlZmZlY3RpdmVfc2NhbGVfMSA9IHN0YXRpY19jYXN0PGRvdWJsZT4oCisgICAgICAgIGlucHV0LT5wYXJhbXMuc2NhbGUgKiB3ZWlnaHRzX2ZlYXR1cmUtPnBhcmFtcy5zY2FsZSAvCisgICAgICAgIGFjdGl2YXRpb25fc3RhdGUtPnBhcmFtcy5zY2FsZSk7CisgICAgY29uc3QgZG91YmxlIGVmZmVjdGl2ZV9zY2FsZV8yID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8ZG91YmxlPihhY3RpdmF0aW9uX3N0YXRlLT5wYXJhbXMuc2NhbGUgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodHNfdGltZS0+cGFyYW1zLnNjYWxlIC8gb3V0cHV0LT5wYXJhbXMuc2NhbGUpOworCisgICAgLy8gVE9ETyhiLzE2MjAxODA5OCk6IFVzZSBURl9MSVRFX0VOU1VSRV9ORUFSIHdoZW4gaXQgaXMgcmVhZHkuCisgICAgLy8gVE9ETygjMTc1MSk6IGFjY291bnQgZm9yIG9wdGlvbmFsIGJpYXMgdGVuc29yCisgICAgVEZfTElURV9FTlNVUkUoCisgICAgICAgIGNvbnRleHQsCisgICAgICAgIHN0ZDo6YWJzKHN0YXRpY19jYXN0PGRvdWJsZT4oYmlhcy0+cGFyYW1zLnNjYWxlKSAtCisgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGRvdWJsZT4oYWN0aXZhdGlvbl9zdGF0ZS0+cGFyYW1zLnNjYWxlICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRzX3RpbWUtPnBhcmFtcy5zY2FsZSkpIDwgMWUtNSk7CisKKyAgICBRdWFudGl6ZU11bHRpcGxpZXIoZWZmZWN0aXZlX3NjYWxlXzEsICYoZGF0YS0+ZWZmZWN0aXZlX3NjYWxlXzFfYSksCisgICAgICAgICAgICAgICAgICAgICAgICYoZGF0YS0+ZWZmZWN0aXZlX3NjYWxlXzFfYikpOworICAgIFF1YW50aXplTXVsdGlwbGllcihlZmZlY3RpdmVfc2NhbGVfMiwgJihkYXRhLT5lZmZlY3RpdmVfc2NhbGVfMl9hKSwKKyAgICAgICAgICAgICAgICAgICAgICAgJihkYXRhLT5lZmZlY3RpdmVfc2NhbGVfMl9iKSk7CisKKyAgICBkYXRhLT5pbnB1dF96ZXJvX3BvaW50ID0gaW5wdXQtPnBhcmFtcy56ZXJvX3BvaW50OworICAgIGRhdGEtPm91dHB1dF96ZXJvX3BvaW50ID0gb3V0cHV0LT5wYXJhbXMuemVyb19wb2ludDsKKyAgICBkYXRhLT5hY3RpdmF0aW9uX3N0YXRlX3plcm9fcG9pbnQgPSBhY3RpdmF0aW9uX3N0YXRlLT5wYXJhbXMuemVyb19wb2ludDsKKworICAgIFRGTElURV9EQ0hFQ0soY29udGV4dC0+UmVxdWVzdFNjcmF0Y2hCdWZmZXJJbkFyZW5hICE9IG51bGxwdHIpOworCisgICAgY29uc3QgVGZMaXRlU3RhdHVzIHNjcmF0Y2hfc3RhdHVzID0gY29udGV4dC0+UmVxdWVzdFNjcmF0Y2hCdWZmZXJJbkFyZW5hKAorICAgICAgICBjb250ZXh0LCBiYXRjaF9zaXplICogbnVtX2ZpbHRlcnMgKiBzaXplb2YoaW50MzJfdCksCisgICAgICAgICYoZGF0YS0+c2NyYXRjaF90ZW5zb3JfaW5kZXgpKTsKKyAgICBURl9MSVRFX0VOU1VSRV9PSyhjb250ZXh0LCBzY3JhdGNoX3N0YXR1cyk7CisKKyAgICBjb25zdCBUZkxpdGVTdGF0dXMgc2NyYXRjaF9vdXRwdXRfc3RhdHVzID0KKyAgICAgICAgY29udGV4dC0+UmVxdWVzdFNjcmF0Y2hCdWZmZXJJbkFyZW5hKAorICAgICAgICAgICAgY29udGV4dCwgYmF0Y2hfc2l6ZSAqIG51bV91bml0cyAqIHNpemVvZihpbnQzMl90KSwKKyAgICAgICAgICAgICYoZGF0YS0+c2NyYXRjaF9vdXRwdXRfdGVuc29yX2luZGV4KSk7CisgICAgVEZfTElURV9FTlNVUkVfT0soY29udGV4dCwgc2NyYXRjaF9vdXRwdXRfc3RhdHVzKTsKKworICAgIGNtc2lzX25uX2RpbXMgd2VpZ2h0c19mZWF0dXJlX2RpbXM7CisgICAgd2VpZ2h0c19mZWF0dXJlX2RpbXMubiA9IG51bV9maWx0ZXJzOworICAgIHdlaWdodHNfZmVhdHVyZV9kaW1zLmggPSBpbnB1dF9zaXplOworCisgICAgY29uc3QgaW50MzJfdCBidWZfc2l6ZSA9IGFybV9zdmRmX3M4X2dldF9idWZmZXJfc2l6ZSgmd2VpZ2h0c19mZWF0dXJlX2RpbXMpOworCisgICAgaWYgKGJ1Zl9zaXplID4gMCkgeworICAgICAgZGF0YS0+a2VybmVsX3N1bXMgPSBzdGF0aWNfY2FzdDxpbnQzMl90Kj4oCisgICAgICAgICAgY29udGV4dC0+QWxsb2NhdGVQZXJzaXN0ZW50QnVmZmVyKGNvbnRleHQsIGJ1Zl9zaXplKSk7CisKKyAgICAgIGFybV92ZWN0b3Jfc3VtX3M4KGRhdGEtPmtlcm5lbF9zdW1zLCBpbnB1dF9zaXplLCBudW1fZmlsdGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgIEdldFRlbnNvckRhdGE8aW50OF90Pih3ZWlnaHRzX2ZlYXR1cmUpLCAxLCBudWxscHRyKTsKKyAgICB9CisKKyAgfSBlbHNlIHsKKyAgICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCB3ZWlnaHRzX2ZlYXR1cmUtPnR5cGUsIGtUZkxpdGVGbG9hdDMyKTsKKyAgICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCB3ZWlnaHRzX3RpbWUtPnR5cGUsIGtUZkxpdGVGbG9hdDMyKTsKKyAgICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBhY3RpdmF0aW9uX3N0YXRlLT50eXBlLCBrVGZMaXRlRmxvYXQzMik7CisgICAgaWYgKGJpYXMgIT0gbnVsbHB0cikgeworICAgICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgYmlhcy0+dHlwZSwga1RmTGl0ZUZsb2F0MzIpOworICAgIH0KKyAgICBURl9MSVRFX0VOU1VSRV9UWVBFU19FUShjb250ZXh0LCBvdXRwdXQtPnR5cGUsIGtUZkxpdGVGbG9hdDMyKTsKKworICAgIFRGTElURV9EQ0hFQ0soY29udGV4dC0+UmVxdWVzdFNjcmF0Y2hCdWZmZXJJbkFyZW5hICE9IG51bGxwdHIpOworICAgIGNvbnN0IFRmTGl0ZVN0YXR1cyBzY3JhdGNoX3N0YXR1cyA9IGNvbnRleHQtPlJlcXVlc3RTY3JhdGNoQnVmZmVySW5BcmVuYSgKKyAgICAgICAgY29udGV4dCwgYmF0Y2hfc2l6ZSAqIG51bV9maWx0ZXJzICogc2l6ZW9mKGZsb2F0KSwKKyAgICAgICAgJihkYXRhLT5zY3JhdGNoX3RlbnNvcl9pbmRleCkpOworICAgIFRGX0xJVEVfRU5TVVJFX09LKGNvbnRleHQsIHNjcmF0Y2hfc3RhdHVzKTsKKyAgfQorCisgIG1pY3JvX2NvbnRleHQtPkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKGlucHV0KTsKKyAgbWljcm9fY29udGV4dC0+RGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3Iod2VpZ2h0c19mZWF0dXJlKTsKKyAgbWljcm9fY29udGV4dC0+RGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3Iod2VpZ2h0c190aW1lKTsKKyAgbWljcm9fY29udGV4dC0+RGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3IoYWN0aXZhdGlvbl9zdGF0ZSk7CisgIG1pY3JvX2NvbnRleHQtPkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKG91dHB1dCk7CisgIC8vIFRPRE8oIzE3NTEpOiBhY2NvdW50IGZvciBvcHRpb25hbCBiaWFzIHRlbnNvcgorICBtaWNyb19jb250ZXh0LT5EZWFsbG9jYXRlVGVtcFRmTGl0ZVRlbnNvcihiaWFzKTsKKyAgcmV0dXJuIGtUZkxpdGVPazsKIH0KIAogVGZMaXRlU3RhdHVzIEV2YWxJbnRlZ2VyU1ZERihUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlLApAQCAtNDQsNyArMjMwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGZMaXRlU1ZERlBhcmFtcyogcGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZkxpdGVFdmFsVGVuc29yKiBhY3RpdmF0aW9uX3N0YXRlX3RlbnNvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGZMaXRlRXZhbFRlbnNvciogb3V0cHV0X3RlbnNvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3BEYXRhU3ZkZiYgZGF0YSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDbXNpc05uT3BEYXRhU3ZkZiYgZGF0YSkgewogICBjbXNpc19ubl9kaW1zIGlucHV0X2RpbXM7CiAgIGlucHV0X2RpbXMubiA9IGlucHV0X3RlbnNvci0+ZGltcy0+ZGF0YVswXTsKICAgaW5wdXRfZGltcy5oID0gaW5wdXRfdGVuc29yLT5kaW1zLT5kYXRhWzFdOwpAQCAtMTAyLDkgKzI4OCwxMiBAQAogCiAgIHN3aXRjaCAod2VpZ2h0c190aW1lX3RlbnNvci0+dHlwZSkgewogICAgIGNhc2Uga1RmTGl0ZUludDg6IHsKKyAgICAgIGNtc2lzX25uX2NvbnRleHQgY3R4OworICAgICAgY3R4LmJ1ZiA9IGRhdGEua2VybmVsX3N1bXM7CisKICAgICAgIGFybV9zdmRmX3M4KAotICAgICAgICAgICZzY3JhdGNoX2N0eCwgJnNjcmF0Y2hfb3V0cHV0X2N0eCwgJnN2ZGZfcGFyYW1zLCAmaW5fcXVhbnRfcGFyYW1zLAotICAgICAgICAgICZvdXRfcXVhbnRfcGFyYW1zLCAmaW5wdXRfZGltcywKKyAgICAgICAgICAmY3R4LCAmc2NyYXRjaF9jdHgsICZzY3JhdGNoX291dHB1dF9jdHgsICZzdmRmX3BhcmFtcywKKyAgICAgICAgICAmaW5fcXVhbnRfcGFyYW1zLCAmb3V0X3F1YW50X3BhcmFtcywgJmlucHV0X2RpbXMsCiAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KGlucHV0X3RlbnNvciksICZzdGF0ZV9kaW1zLAogICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihhY3RpdmF0aW9uX3N0YXRlX3RlbnNvciksCiAgICAgICAgICAgJndlaWdodHNfZmVhdHVyZV9kaW1zLApAQCAtMTQxLDcgKzMzMCw4IEBACiBUZkxpdGVTdGF0dXMgRXZhbFN2ZGYoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBhdXRvKiBwYXJhbXMgPSByZWludGVycHJldF9jYXN0PFRmTGl0ZVNWREZQYXJhbXMqPihub2RlLT5idWlsdGluX2RhdGEpOwogICBURkxJVEVfRENIRUNLKG5vZGUtPnVzZXJfZGF0YSAhPSBudWxscHRyKTsKLSAgY29uc3QgT3BEYXRhU3ZkZiYgZGF0YSA9ICooc3RhdGljX2Nhc3Q8Y29uc3QgT3BEYXRhU3ZkZio+KG5vZGUtPnVzZXJfZGF0YSkpOworICBjb25zdCBDbXNpc05uT3BEYXRhU3ZkZiYgZGF0YSA9CisgICAgICAqKHN0YXRpY19jYXN0PGNvbnN0IENtc2lzTm5PcERhdGFTdmRmKj4obm9kZS0+dXNlcl9kYXRhKSk7CiAKICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXQgPQogICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KGNvbnRleHQsIG5vZGUsIGtTdmRmSW5wdXRUZW5zb3IpOwpAQCAtMTg0LDcgKzM3NCw4IEBACiBUZkxpdGVTdGF0dXMgRXZhbFN2ZGZJbnQ4KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgYXV0byogcGFyYW1zID0gcmVpbnRlcnByZXRfY2FzdDxUZkxpdGVTVkRGUGFyYW1zKj4obm9kZS0+YnVpbHRpbl9kYXRhKTsKICAgVEZMSVRFX0RDSEVDSyhub2RlLT51c2VyX2RhdGEgIT0gbnVsbHB0cik7Ci0gIGNvbnN0IE9wRGF0YVN2ZGYmIGRhdGEgPSAqKHN0YXRpY19jYXN0PGNvbnN0IE9wRGF0YVN2ZGYqPihub2RlLT51c2VyX2RhdGEpKTsKKyAgY29uc3QgQ21zaXNObk9wRGF0YVN2ZGYmIGRhdGEgPQorICAgICAgKihzdGF0aWNfY2FzdDxjb25zdCBDbXNpc05uT3BEYXRhU3ZkZio+KG5vZGUtPnVzZXJfZGF0YSkpOwogCiAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0ID0KICAgICAgIHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dChjb250ZXh0LCBub2RlLCBrU3ZkZklucHV0VGVuc29yKTsKQEAgLTIxMywxMSArNDA0LDExIEBACiB9ICAvLyBuYW1lc3BhY2UKIAogVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9TVkRGKCkgewotICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChJbml0LCBQcmVwYXJlU3ZkZiwgRXZhbFN2ZGYpOworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChJbml0LCBDbXNpc05uUHJlcGFyZVN2ZGYsIEV2YWxTdmRmKTsKIH0KIAogVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9TVkRGX0lOVDgoKSB7Ci0gIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKEluaXQsIFByZXBhcmVTdmRmLCBFdmFsU3ZkZkludDgpOworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChJbml0LCBDbXNpc05uUHJlcGFyZVN2ZGYsIEV2YWxTdmRmSW50OCk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSB0ZmxpdGUKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2Ntc2lzX25uL3RyYW5zcG9zZV9jb252LmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvY21zaXNfbm4vdHJhbnNwb3NlX2NvbnYuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBjZjBlMQotLS0gL2Rldi9udWxsCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2Ntc2lzX25uL3RyYW5zcG9zZV9jb252LmNjCkBAIC0wLDAgKzEsNTU2IEBACisvKiBDb3B5cmlnaHQgMjAyNCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3RyYW5zcG9zZV9jb252LmgiCisKKyNpbmNsdWRlICJJbmNsdWRlL2FybV9ubmZ1bmN0aW9ucy5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9jL2J1aWx0aW5fb3BfZGF0YS5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9jL2NvbW1vbi5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL2NvbW1vbi5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3F1YW50aXphdGlvbl91dGlsLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvcmVmZXJlbmNlL2ludGVnZXJfb3BzL3RyYW5zcG9zZV9jb252LmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvcmVmZXJlbmNlL3RyYW5zcG9zZV9jb252LmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvdGVuc29yX2N0eXBlcy5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2tlcm5lbF91dGlsLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMvcGFkZGluZy5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2tlcm5lbF91dGlsLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2xvZy5oIgorCituYW1lc3BhY2UgdGZsaXRlIHsKK25hbWVzcGFjZSB7CisKKy8vIEZvciB0aGUgVGZMaXRlIHRyYW5zcG9zZV9jb252IGltcGxlbWVudGF0aW9uLCBpbnB1dCB0ZW5zb3IgMCBjb3JyZXNwb25kcyB0bworLy8gdGhlIE91dHB1dFNoYXBlVGVuc29yLiBIb3dldmVyLCBzaW5jZSBURkxNIGRvZXMgbm90IHN1cHBvcnQgZHluYW1pYyB0ZW5zb3JzLAorLy8gdGhlIFRGTE0gaW1wbGVtZW50YXRpb24gaWdub3JlcyBpbnB1dCB0ZW5zb3IgMCBhbmQgdGhlIG9ubHkgaW5wdXRzIHdlIGNhcmUKKy8vIGFib3V0IGFyZSBrRmlsdGVyVGVuc29yLCBrSW5wdXRUZW5zb3IgYW5kIGtCaWFzVGVuc29yLgorY29uc3RleHByIGludCBrRmlsdGVyVGVuc29yID0gMTsKK2NvbnN0ZXhwciBpbnQga0lucHV0VGVuc29yID0gMjsKK2NvbnN0ZXhwciBpbnQga0JpYXNUZW5zb3IgPSAzOworY29uc3RleHByIGludCBrT3V0cHV0VGVuc29yID0gMDsKKworLy8gQ29udiBpcyBxdWFudGl6ZWQgYWxvbmcgZGltZW5zaW9uIDA6CisvLyBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9saXRlL3BlcmZvcm1hbmNlL3F1YW50aXphdGlvbl9zcGVjCitjb25zdGV4cHIgaW50IGtDb252UXVhbnRpemVkRGltZW5zaW9uID0gMDsKKworc3RydWN0IE9wRGF0YSB7CisgIENvbnZQYXJhbXMgcGFyYW1zOworCisgIC8vIFNjcmF0Y2ggYnVmZmVycyBhcmUgcmVxdWlyZWQgZm9yIHF1YW50aXplZCBpbXBsZW1lbnRhdGlvbnMuCisgIGludCBzY3JhdGNoX2J1ZmZlcl9pbmRleDsKKyAgaW50IHNjcmF0Y2hfYnVmZmVyX291dHB1dF9pbmRleDsKKworICAvLyBUT0RPKGIvMTkyMDkwNTMxKTogUmVtb3ZlIHRoaXMgb25jZSBhbGwgOHgxNiB0cmFuc3Bvc2UgY29udiBtb2RlbHMgdXNlCisgIC8vIDY0LWJpdCBiaWFzZXMuCisgIGludCBiaWFzX2NvbnZlcnRlZF9idWZmZXJfaW5kZXg7CisKKyAgLy8gTXVsdGlwbGllciBhbmQgc2hpZnQgYXJyYXlzIGFyZSByZXF1aXJlZCBmb3IgdGhlIGludDggaW1wbGVtZW50YXRpb24uCisgIGludDMyX3QqIHBlcl9jaGFubmVsX291dHB1dF9tdWx0aXBsaWVyOworICBpbnQzMl90KiBwZXJfY2hhbm5lbF9vdXRwdXRfc2hpZnQ7Cit9OworCitpbmxpbmUgUGFkZGluZ1R5cGUgUnVudGltZVBhZGRpbmdUeXBlKFRmTGl0ZVBhZGRpbmcgcGFkZGluZykgeworICBzd2l0Y2ggKHBhZGRpbmcpIHsKKyAgICBjYXNlIFRmTGl0ZVBhZGRpbmc6OmtUZkxpdGVQYWRkaW5nU2FtZToKKyAgICAgIHJldHVybiBQYWRkaW5nVHlwZTo6a1NhbWU7CisgICAgY2FzZSBUZkxpdGVQYWRkaW5nOjprVGZMaXRlUGFkZGluZ1ZhbGlkOgorICAgICAgcmV0dXJuIFBhZGRpbmdUeXBlOjprVmFsaWQ7CisgICAgY2FzZSBUZkxpdGVQYWRkaW5nOjprVGZMaXRlUGFkZGluZ1Vua25vd246CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBQYWRkaW5nVHlwZTo6a05vbmU7CisgIH0KK30KKworVGZMaXRlU3RhdHVzIENhbGN1bGF0ZU9wRGF0YShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZkxpdGVUcmFuc3Bvc2VDb252UGFyYW1zKiBwYXJhbXMsIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IGZpbHRlcl93aWR0aCwgaW50IGZpbHRlcl9oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZVR5cGUgZGF0YV90eXBlLCBPcERhdGEqIGRhdGEpIHsKKyAgYm9vbCBoYXNfYmlhcyA9IG5vZGUtPmlucHV0cy0+c2l6ZSA9PSA0OworICAvLyBDaGVjayBudW1iZXIgb2YgaW5wdXRzL291dHB1dHMKKyAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgaGFzX2JpYXMgfHwgbm9kZS0+aW5wdXRzLT5zaXplID09IDMpOworICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBub2RlLT5vdXRwdXRzLT5zaXplLCAxKTsKKworICAvLyBNYXRjaGluZyBHZXRXaW5kb3dlZE91dHB1dFNpemUgaW4gVGVuc29yRmxvdy4KKyAgYXV0byBwYWRkaW5nID0gcGFyYW1zLT5wYWRkaW5nOworICBpbnQgcGFkX291dHB1dF93aWR0aDsKKyAgaW50IHBhZF9vdXRwdXRfaGVpZ2h0OworCisgIFRmTGl0ZVBhZGRpbmdWYWx1ZXMgcGFkZGluZ192YWx1ZXMgPSBDb21wdXRlUGFkZGluZ0hlaWdodFdpZHRoKAorICAgICAgcGFyYW1zLT5zdHJpZGVfaGVpZ2h0LCBwYXJhbXMtPnN0cmlkZV93aWR0aCwgMSwKKyAgICAgIDEsICAvLyBEaWxhdGlvbiBoZWlnaHQgYW5kIHdpZHRoIGFyZSBhbHdheXMgMSBmb3IgdHJhbnNwb3NlX2NvbnYuCisgICAgICBoZWlnaHQsIHdpZHRoLCBmaWx0ZXJfaGVpZ2h0LCBmaWx0ZXJfd2lkdGgsIHBhZGRpbmcsICZwYWRfb3V0cHV0X2hlaWdodCwKKyAgICAgICZwYWRfb3V0cHV0X3dpZHRoKTsKKworICBkYXRhLT5wYXJhbXMucGFkZGluZ190eXBlID0gUnVudGltZVBhZGRpbmdUeXBlKHBhZGRpbmcpOworICBkYXRhLT5wYXJhbXMucGFkZGluZ192YWx1ZXMud2lkdGggPSBwYWRkaW5nX3ZhbHVlcy53aWR0aDsKKyAgZGF0YS0+cGFyYW1zLnBhZGRpbmdfdmFsdWVzLmhlaWdodCA9IHBhZGRpbmdfdmFsdWVzLmhlaWdodDsKKyAgZGF0YS0+cGFyYW1zLnBhZGRpbmdfdmFsdWVzLndpZHRoX29mZnNldCA9CisgICAgICBwYWRkaW5nX3ZhbHVlcy53aWR0aF9vZmZzZXQgKyBwYWRkaW5nX3ZhbHVlcy53aWR0aDsKKyAgZGF0YS0+cGFyYW1zLnBhZGRpbmdfdmFsdWVzLmhlaWdodF9vZmZzZXQgPQorICAgICAgcGFkZGluZ192YWx1ZXMuaGVpZ2h0X29mZnNldCArIHBhZGRpbmdfdmFsdWVzLmhlaWdodDsKKworICAvLyBOb3RlIHRoYXQgcXVhbnRpemVkIGluZmVyZW5jZSByZXF1aXJlcyB0aGF0IGFsbCB0ZW5zb3JzIGhhdmUgdGhlaXIKKyAgLy8gcGFyYW1ldGVycyBzZXQuIFRoaXMgaXMgdXN1YWxseSBkb25lIGR1cmluZyBxdWFudGl6ZWQgdHJhaW5pbmcuCisgIGlmIChkYXRhX3R5cGUgIT0ga1RmTGl0ZUZsb2F0MzIpIHsKKyAgICBNaWNyb0NvbnRleHQqIG1pY3JvX2NvbnRleHQgPSBHZXRNaWNyb0NvbnRleHQoY29udGV4dCk7CisKKyAgICBUZkxpdGVUZW5zb3IqIGlucHV0ID0KKyAgICAgICAgbWljcm9fY29udGV4dC0+QWxsb2NhdGVUZW1wSW5wdXRUZW5zb3Iobm9kZSwga0lucHV0VGVuc29yKTsKKyAgICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCBpbnB1dCAhPSBudWxscHRyKTsKKyAgICBUZkxpdGVUZW5zb3IqIGZpbHRlciA9CisgICAgICAgIG1pY3JvX2NvbnRleHQtPkFsbG9jYXRlVGVtcElucHV0VGVuc29yKG5vZGUsIGtGaWx0ZXJUZW5zb3IpOworICAgIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIGZpbHRlciAhPSBudWxscHRyKTsKKyAgICBUZkxpdGVUZW5zb3IqIGJpYXMgPQorICAgICAgICBtaWNyb19jb250ZXh0LT5BbGxvY2F0ZVRlbXBJbnB1dFRlbnNvcihub2RlLCBrQmlhc1RlbnNvcik7CisgICAgVGZMaXRlVGVuc29yKiBvdXRwdXQgPQorICAgICAgICBtaWNyb19jb250ZXh0LT5BbGxvY2F0ZVRlbXBPdXRwdXRUZW5zb3Iobm9kZSwga091dHB1dFRlbnNvcik7CisgICAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgb3V0cHV0ICE9IG51bGxwdHIpOworICAgIGludCBvdXRwdXRfY2hhbm5lbHMgPSBmaWx0ZXItPmRpbXMtPmRhdGFba0NvbnZRdWFudGl6ZWREaW1lbnNpb25dOworCisgICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKHRmbGl0ZTo6UG9wdWxhdGVDb252b2x1dGlvblF1YW50aXphdGlvblBhcmFtcygKKyAgICAgICAgY29udGV4dCwgaW5wdXQsIGZpbHRlciwgYmlhcywgb3V0cHV0LCBrVGZMaXRlQWN0Tm9uZSwKKyAgICAgICAgJmRhdGEtPnBhcmFtcy5vdXRwdXRfbXVsdGlwbGllciwgJmRhdGEtPnBhcmFtcy5vdXRwdXRfc2hpZnQsCisgICAgICAgICZkYXRhLT5wYXJhbXMucXVhbnRpemVkX2FjdGl2YXRpb25fbWluLAorICAgICAgICAmZGF0YS0+cGFyYW1zLnF1YW50aXplZF9hY3RpdmF0aW9uX21heCwKKyAgICAgICAgZGF0YS0+cGVyX2NoYW5uZWxfb3V0cHV0X211bHRpcGxpZXIsIGRhdGEtPnBlcl9jaGFubmVsX291dHB1dF9zaGlmdCwKKyAgICAgICAgb3V0cHV0X2NoYW5uZWxzKSk7CisKKyAgICAvLyBUT0RPKGIvMTkyMDkwNTMxKTogUmVtb3ZlIHRoaXMgb25jZSBhbGwgOHgxNiB0cmFuc3Bvc2UgY29udiBtb2RlbHMgdXNlCisgICAgLy8gNjQtYml0IGJpYXNlcy4KKyAgICBpZiAoaW5wdXQtPnR5cGUgPT0ga1RmTGl0ZUludDE2KSB7CisgICAgICBURkxJVEVfRENIRUNLKGZpbHRlci0+dHlwZSA9PSBrVGZMaXRlSW50OCk7CisgICAgICBURkxJVEVfRENIRUNLKG91dHB1dC0+dHlwZSA9PSBrVGZMaXRlSW50MTYpOworICAgICAgaWYgKGJpYXMtPnR5cGUgPT0ga1RmTGl0ZUludDE2KSB7CisgICAgICAgIFRGTElURV9EQ0hFQ0soCisgICAgICAgICAgICBjb250ZXh0LT5SZXF1ZXN0U2NyYXRjaEJ1ZmZlckluQXJlbmEoCisgICAgICAgICAgICAgICAgY29udGV4dCwgR2V0VGVuc29yU2hhcGUoYmlhcykuRmxhdFNpemUoKSAqIHNpemVvZihzdGQ6OmludDY0X3QpLAorICAgICAgICAgICAgICAgICYoZGF0YS0+Ymlhc19jb252ZXJ0ZWRfYnVmZmVyX2luZGV4KSkgPT0ga1RmTGl0ZU9rKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBtaWNyb19jb250ZXh0LT5EZWFsbG9jYXRlVGVtcFRmTGl0ZVRlbnNvcihpbnB1dCk7CisgICAgbWljcm9fY29udGV4dC0+RGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3IoZmlsdGVyKTsKKyAgICBtaWNyb19jb250ZXh0LT5EZWFsbG9jYXRlVGVtcFRmTGl0ZVRlbnNvcihvdXRwdXQpOworICAgIGlmIChiaWFzICE9IG51bGxwdHIpIHsKKyAgICAgIG1pY3JvX2NvbnRleHQtPkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKGJpYXMpOworICAgIH0KKyAgfQorICByZXR1cm4ga1RmTGl0ZU9rOworfQorCit2b2lkKiBJbml0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgeworICBURkxJVEVfRENIRUNLKGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlciAhPSBudWxscHRyKTsKKyAgcmV0dXJuIGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlcihjb250ZXh0LCBzaXplb2YoT3BEYXRhKSk7Cit9CisKK1RmTGl0ZVN0YXR1cyBQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKKyAgVEZMSVRFX0RDSEVDSyhub2RlLT51c2VyX2RhdGEgIT0gbnVsbHB0cik7CisgIFRGTElURV9EQ0hFQ0sobm9kZS0+YnVpbHRpbl9kYXRhICE9IG51bGxwdHIpOworCisgIE9wRGF0YSogZGF0YSA9IHN0YXRpY19jYXN0PE9wRGF0YSo+KG5vZGUtPnVzZXJfZGF0YSk7CisgIGNvbnN0IGF1dG8gcGFyYW1zID0KKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IFRmTGl0ZVRyYW5zcG9zZUNvbnZQYXJhbXMqPihub2RlLT5idWlsdGluX2RhdGEpOworCisgIE1pY3JvQ29udGV4dCogbWljcm9fY29udGV4dCA9IEdldE1pY3JvQ29udGV4dChjb250ZXh0KTsKKworICBUZkxpdGVUZW5zb3IqIG91dHB1dCA9CisgICAgICBtaWNyb19jb250ZXh0LT5BbGxvY2F0ZVRlbXBPdXRwdXRUZW5zb3Iobm9kZSwga091dHB1dFRlbnNvcik7CisgIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIG91dHB1dCAhPSBudWxscHRyKTsKKyAgVGZMaXRlVGVuc29yKiBpbnB1dCA9CisgICAgICBtaWNyb19jb250ZXh0LT5BbGxvY2F0ZVRlbXBJbnB1dFRlbnNvcihub2RlLCBrSW5wdXRUZW5zb3IpOworICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCBpbnB1dCAhPSBudWxscHRyKTsKKyAgVGZMaXRlVGVuc29yKiBmaWx0ZXIgPQorICAgICAgbWljcm9fY29udGV4dC0+QWxsb2NhdGVUZW1wSW5wdXRUZW5zb3Iobm9kZSwga0ZpbHRlclRlbnNvcik7CisgIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIGZpbHRlciAhPSBudWxscHRyKTsKKworICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBpbnB1dC0+dHlwZSwgb3V0cHV0LT50eXBlKTsKKyAgVEZfTElURV9FTlNVUkVfTVNHKGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICBpbnB1dC0+dHlwZSA9PSBrVGZMaXRlRmxvYXQzMiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LT50eXBlID09IGtUZkxpdGVJbnQxNiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LT50eXBlID09IGtUZkxpdGVJbnQ4LAorICAgICAgICAgICAgICAgICAgICAgIklucHV0IGRhdGEgdHlwZSBub3Qgc3VwcG9ydGVkIik7CisgIFRGX0xJVEVfRU5TVVJFX01TRygKKyAgICAgIGNvbnRleHQsCisgICAgICAoaW5wdXQtPnR5cGUgPT0ga1RmTGl0ZUZsb2F0MzIgJiYgZmlsdGVyLT50eXBlID09IGtUZkxpdGVGbG9hdDMyKSB8fAorICAgICAgICAgIChpbnB1dC0+dHlwZSA9PSBrVGZMaXRlSW50MTYgJiYgZmlsdGVyLT50eXBlID09IGtUZkxpdGVJbnQ4KSB8fAorICAgICAgICAgIChpbnB1dC0+dHlwZSA9PSBrVGZMaXRlSW50OCAmJiBmaWx0ZXItPnR5cGUgPT0ga1RmTGl0ZUludDgpLAorICAgICAgIkh5YnJpZCBtb2RlbHMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gVEZMaXRlIE1pY3JvLiIpOworCisgIC8vIEdldCBoZWlnaHQgYW5kIHdpZHRoIG9mIHRoZSBvdXRwdXQuCisgIGNvbnN0IGludCB3aWR0aCA9IFNpemVPZkRpbWVuc2lvbihvdXRwdXQsIDIpOworICBjb25zdCBpbnQgaGVpZ2h0ID0gU2l6ZU9mRGltZW5zaW9uKG91dHB1dCwgMSk7CisgIGNvbnN0IGludCBmaWx0ZXJfd2lkdGggPSBTaXplT2ZEaW1lbnNpb24oZmlsdGVyLCAyKTsKKyAgY29uc3QgaW50IGZpbHRlcl9oZWlnaHQgPSBTaXplT2ZEaW1lbnNpb24oZmlsdGVyLCAxKTsKKworICAvLyBEeW5hbWljYWxseSBhbGxvY2F0ZSBwZXItY2hhbm5lbCBxdWFudGl6YXRpb24gcGFyYW1ldGVycy4KKyAgY29uc3QgaW50IG51bV9jaGFubmVscyA9IGZpbHRlci0+ZGltcy0+ZGF0YVtrQ29udlF1YW50aXplZERpbWVuc2lvbl07CisgIGRhdGEtPnBlcl9jaGFubmVsX291dHB1dF9tdWx0aXBsaWVyID0KKyAgICAgIHN0YXRpY19jYXN0PGludDMyX3QqPihjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIoCisgICAgICAgICAgY29udGV4dCwgbnVtX2NoYW5uZWxzICogc2l6ZW9mKGludDMyX3QpKSk7CisgIGRhdGEtPnBlcl9jaGFubmVsX291dHB1dF9zaGlmdCA9CisgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90Kj4oY29udGV4dC0+QWxsb2NhdGVQZXJzaXN0ZW50QnVmZmVyKAorICAgICAgICAgIGNvbnRleHQsIG51bV9jaGFubmVscyAqIHNpemVvZihpbnQzMl90KSkpOworCisgIGlmIChpbnB1dC0+dHlwZSA9PSBrVGZMaXRlSW50OCkgeworICAgIFRGTElURV9EQ0hFQ0soY29udGV4dC0+UmVxdWVzdFNjcmF0Y2hCdWZmZXJJbkFyZW5hICE9IG51bGxwdHIpOworCisgICAgUnVudGltZVNoYXBlIGlucHV0X3NoYXBlID0gR2V0VGVuc29yU2hhcGUoaW5wdXQpOworICAgIFJ1bnRpbWVTaGFwZSBvdXRwdXRfc2hhcGUgPSBHZXRUZW5zb3JTaGFwZShvdXRwdXQpOworICAgIFJ1bnRpbWVTaGFwZSBmaWx0ZXJfc2hhcGUgPSBHZXRUZW5zb3JTaGFwZShmaWx0ZXIpOworCisgICAgY29uc3QgaW50IGJhdGNoX3NpemUgPSBNYXRjaGluZ0RpbShpbnB1dF9zaGFwZSwgMCwgb3V0cHV0X3NoYXBlLCAwKTsKKyAgICBjb25zdCBpbnQgb3V0cHV0X2RlcHRoID0gTWF0Y2hpbmdEaW0oZmlsdGVyX3NoYXBlLCAwLCBvdXRwdXRfc2hhcGUsIDMpOworCisgICAgY21zaXNfbm5fZGltcyBvdXRwdXRfZGltczsKKyAgICBvdXRwdXRfZGltcy5uID0gYmF0Y2hfc2l6ZTsKKyAgICBvdXRwdXRfZGltcy5oID0gb3V0cHV0X3NoYXBlLkRpbXMoMSk7CisgICAgb3V0cHV0X2RpbXMudyA9IG91dHB1dF9zaGFwZS5EaW1zKDIpOworICAgIG91dHB1dF9kaW1zLmMgPSBvdXRwdXRfZGVwdGg7CisKKyNpZiBkZWZpbmVkKEtFUk5FTFNfT1BUSU1JWkVEX0ZPUl9TUEVFRCkKKyAgICBjb25zdCBpbnQgaW5wdXRfZGVwdGggPSBNYXRjaGluZ0RpbShpbnB1dF9zaGFwZSwgMywgZmlsdGVyX3NoYXBlLCAzKTsKKworICAgIGNtc2lzX25uX2RpbXMgaW5wdXRfZGltczsKKyAgICBpbnB1dF9kaW1zLm4gPSBiYXRjaF9zaXplOworICAgIGlucHV0X2RpbXMuaCA9IGlucHV0X3NoYXBlLkRpbXMoMSk7CisgICAgaW5wdXRfZGltcy53ID0gaW5wdXRfc2hhcGUuRGltcygyKTsKKyAgICBpbnB1dF9kaW1zLmMgPSBpbnB1dF9kZXB0aDsKKworICAgIGNtc2lzX25uX2RpbXMgZmlsdGVyX2RpbXM7CisgICAgZmlsdGVyX2RpbXMubiA9IG91dHB1dF9kZXB0aDsKKyAgICBmaWx0ZXJfZGltcy5oID0gZmlsdGVyX3NoYXBlLkRpbXMoMSk7CisgICAgZmlsdGVyX2RpbXMudyA9IGZpbHRlcl9zaGFwZS5EaW1zKDIpOworICAgIGZpbHRlcl9kaW1zLmMgPSBpbnB1dF9kZXB0aDsKKworICAgIGNvbnN0IHNpemVfdCBidWZfc2l6ZSA9IGFybV90cmFuc3Bvc2VfY29udl9zOF9nZXRfYnVmZmVyX3NpemUoCisgICAgICAgICZpbnB1dF9kaW1zLCAmZmlsdGVyX2RpbXMsICZvdXRwdXRfZGltcyk7CisgICAgVEZMSVRFX0RDSEVDSyhjb250ZXh0LT5SZXF1ZXN0U2NyYXRjaEJ1ZmZlckluQXJlbmEoCisgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCwgYnVmX3NpemUsICYoZGF0YS0+c2NyYXRjaF9idWZmZXJfaW5kZXgpKSA9PQorICAgICAgICAgICAgICAgICAga1RmTGl0ZU9rKTsKKyNlbmRpZgorCisgICAgLy8gUXVhbnRpemVkIDgtYml0IGtlcm5lbHMgdXNlIGFuIGludDMyIHNjcmF0Y2ggYnVmZmVyLgorICAgIFRGTElURV9EQ0hFQ0soCisgICAgICAgIGNvbnRleHQtPlJlcXVlc3RTY3JhdGNoQnVmZmVySW5BcmVuYSgKKyAgICAgICAgICAgIGNvbnRleHQsCisgICAgICAgICAgICBvdXRwdXRfZGltcy5oICogb3V0cHV0X2RpbXMudyAqIG91dHB1dF9kaW1zLmMgKiBzaXplb2YoaW50MzJfdCksCisgICAgICAgICAgICAmKGRhdGEtPnNjcmF0Y2hfYnVmZmVyX291dHB1dF9pbmRleCkpID09IGtUZkxpdGVPayk7CisgIH0KKworICAvLyBRdWFudGl6ZWQgMTZ4OCBrZXJuZWxzIHVzZSBhbiBpbnQ2NCBzY3JhdGNoIGJ1ZmZlci4KKyAgaWYgKGlucHV0LT50eXBlID09IGtUZkxpdGVJbnQxNikgeworICAgIFRGTElURV9EQ0hFQ0soY29udGV4dC0+UmVxdWVzdFNjcmF0Y2hCdWZmZXJJbkFyZW5hICE9IG51bGxwdHIpOworICAgIFRGTElURV9EQ0hFQ0soY29udGV4dC0+UmVxdWVzdFNjcmF0Y2hCdWZmZXJJbkFyZW5hKAorICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgR2V0VGVuc29yU2hhcGUob3V0cHV0KS5GbGF0U2l6ZSgpICogc2l6ZW9mKHN0ZDo6aW50NjRfdCksCisgICAgICAgICAgICAgICAgICAgICAgJihkYXRhLT5zY3JhdGNoX2J1ZmZlcl9pbmRleCkpID09IGtUZkxpdGVPayk7CisgIH0KKworICAvLyBBbGwgcGVyLWNoYW5uZWwgcXVhbnRpemVkIHRlbnNvcnMgbmVlZCB2YWxpZCB6ZXJvIHBvaW50IGFuZCBzY2FsZSBhcnJheXMuCisgIGlmIChpbnB1dC0+dHlwZSA9PSBrVGZMaXRlSW50OCB8fCBpbnB1dC0+dHlwZSA9PSBrVGZMaXRlSW50MTYpIHsKKyAgICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBmaWx0ZXItPnF1YW50aXphdGlvbi50eXBlLAorICAgICAgICAgICAgICAgICAgICAgIGtUZkxpdGVBZmZpbmVRdWFudGl6YXRpb24pOworCisgICAgY29uc3QgYXV0byogYWZmaW5lX3F1YW50aXphdGlvbiA9CisgICAgICAgIHN0YXRpY19jYXN0PFRmTGl0ZUFmZmluZVF1YW50aXphdGlvbio+KGZpbHRlci0+cXVhbnRpemF0aW9uLnBhcmFtcyk7CisgICAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgYWZmaW5lX3F1YW50aXphdGlvbik7CisgICAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgYWZmaW5lX3F1YW50aXphdGlvbi0+c2NhbGUpOworICAgIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIGFmZmluZV9xdWFudGl6YXRpb24tPnplcm9fcG9pbnQpOworCisgICAgVEZfTElURV9FTlNVUkUoY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICBhZmZpbmVfcXVhbnRpemF0aW9uLT5zY2FsZS0+c2l6ZSA9PSAxIHx8CisgICAgICAgICAgICAgICAgICAgICAgIGFmZmluZV9xdWFudGl6YXRpb24tPnNjYWxlLT5zaXplID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXItPmRpbXMtPmRhdGFba0NvbnZRdWFudGl6ZWREaW1lbnNpb25dKTsKKyAgICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBhZmZpbmVfcXVhbnRpemF0aW9uLT5zY2FsZS0+c2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBhZmZpbmVfcXVhbnRpemF0aW9uLT56ZXJvX3BvaW50LT5zaXplKTsKKyAgfQorCisgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhDYWxjdWxhdGVPcERhdGEoY29udGV4dCwgbm9kZSwgcGFyYW1zLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcl93aWR0aCwgZmlsdGVyX2hlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC0+dHlwZSwgZGF0YSkpOworCisgIC8vIE9mZnNldHMgKHplcm8gcG9pbnRzKQorICBkYXRhLT5wYXJhbXMuaW5wdXRfb2Zmc2V0ID0gLWlucHV0LT5wYXJhbXMuemVyb19wb2ludDsKKyAgZGF0YS0+cGFyYW1zLndlaWdodHNfb2Zmc2V0ID0gLWZpbHRlci0+cGFyYW1zLnplcm9fcG9pbnQ7CisgIGRhdGEtPnBhcmFtcy5vdXRwdXRfb2Zmc2V0ID0gb3V0cHV0LT5wYXJhbXMuemVyb19wb2ludDsKKworICAvLyBTdHJpZGUKKyAgZGF0YS0+cGFyYW1zLnN0cmlkZV93aWR0aCA9IHBhcmFtcy0+c3RyaWRlX3dpZHRoOworICBkYXRhLT5wYXJhbXMuc3RyaWRlX2hlaWdodCA9IHBhcmFtcy0+c3RyaWRlX2hlaWdodDsKKworICBtaWNyb19jb250ZXh0LT5EZWFsbG9jYXRlVGVtcFRmTGl0ZVRlbnNvcihvdXRwdXQpOworICBtaWNyb19jb250ZXh0LT5EZWFsbG9jYXRlVGVtcFRmTGl0ZVRlbnNvcihpbnB1dCk7CisgIG1pY3JvX2NvbnRleHQtPkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKGZpbHRlcik7CisgIHJldHVybiBrVGZMaXRlT2s7Cit9CisKKyNpZiBkZWZpbmVkKEtFUk5FTFNfT1BUSU1JWkVEX0ZPUl9TUEVFRCkKK1RmTGl0ZVN0YXR1cyBFdmFsUXVhbnRpemVkUGVyQ2hhbm5lbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZUNvbnZQYXJhbXMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcERhdGEmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGJpYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGZMaXRlRXZhbFRlbnNvciogb3V0cHV0KSB7CisgIGNtc2lzX25uX3RyYW5zcG9zZV9jb252X3BhcmFtcyBjb252X3BhcmFtczsKKyAgY29udl9wYXJhbXMuZGlsYXRpb24uaCA9IDE7CisgIGNvbnZfcGFyYW1zLmRpbGF0aW9uLncgPSAxOworCisgIC8vIEluaXRpYWxpemUgY21zaXNfbm4gY29udm9sdXRpb24gcGFyYW1ldGVycworICBjb252X3BhcmFtcy5pbnB1dF9vZmZzZXQgPSBkYXRhLnBhcmFtcy5pbnB1dF9vZmZzZXQ7CisgIGNvbnZfcGFyYW1zLm91dHB1dF9vZmZzZXQgPSBkYXRhLnBhcmFtcy5vdXRwdXRfb2Zmc2V0OworICBjb252X3BhcmFtcy5zdHJpZGUuaCA9IHBhcmFtcy5zdHJpZGVfaGVpZ2h0OworICBjb252X3BhcmFtcy5zdHJpZGUudyA9IHBhcmFtcy5zdHJpZGVfd2lkdGg7CisgIGNvbnZfcGFyYW1zLnBhZGRpbmcuaCA9IGRhdGEucGFyYW1zLnBhZGRpbmdfdmFsdWVzLmhlaWdodDsKKyAgY29udl9wYXJhbXMucGFkZGluZy53ID0gZGF0YS5wYXJhbXMucGFkZGluZ192YWx1ZXMud2lkdGg7CisgIGNvbnZfcGFyYW1zLnBhZGRpbmdfb2Zmc2V0cy5oID0gZGF0YS5wYXJhbXMucGFkZGluZ192YWx1ZXMuaGVpZ2h0X29mZnNldDsKKyAgY29udl9wYXJhbXMucGFkZGluZ19vZmZzZXRzLncgPSBkYXRhLnBhcmFtcy5wYWRkaW5nX3ZhbHVlcy53aWR0aF9vZmZzZXQ7CisgIGNvbnZfcGFyYW1zLmFjdGl2YXRpb24ubWluID0gZGF0YS5wYXJhbXMucXVhbnRpemVkX2FjdGl2YXRpb25fbWluOworICBjb252X3BhcmFtcy5hY3RpdmF0aW9uLm1heCA9IGRhdGEucGFyYW1zLnF1YW50aXplZF9hY3RpdmF0aW9uX21heDsKKworICAvLyBJbml0aWFsaXplIGNtc2lzX25uIHBlciBjaGFubmVsIHF1YW50aXphdGlvbiBwYXJhbWV0ZXJzCisgIGNtc2lzX25uX3Blcl9jaGFubmVsX3F1YW50X3BhcmFtcyBxdWFudF9wYXJhbXM7CisgIHF1YW50X3BhcmFtcy5tdWx0aXBsaWVyID0KKyAgICAgIGNvbnN0X2Nhc3Q8aW50MzJfdCo+KGRhdGEucGVyX2NoYW5uZWxfb3V0cHV0X211bHRpcGxpZXIpOworICBxdWFudF9wYXJhbXMuc2hpZnQgPSBjb25zdF9jYXN0PGludDMyX3QqPihkYXRhLnBlcl9jaGFubmVsX291dHB1dF9zaGlmdCk7CisKKyAgUnVudGltZVNoYXBlIGZpbHRlcl9zaGFwZSA9IHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGZpbHRlcik7CisgIFJ1bnRpbWVTaGFwZSBpbnB1dF9zaGFwZSA9IHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGlucHV0KTsKKyAgUnVudGltZVNoYXBlIG91dHB1dF9zaGFwZSA9IHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKG91dHB1dCk7CisgIFJ1bnRpbWVTaGFwZSBiaWFzX3NoYXBlID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoYmlhcyk7CisKKyAgLy8gQ29uc2lzdGVuY3kgY2hlY2suCisgIFRGTElURV9EQ0hFQ0tfTEUoY29udl9wYXJhbXMuYWN0aXZhdGlvbi5taW4sIGNvbnZfcGFyYW1zLmFjdGl2YXRpb24ubWF4KTsKKyAgVEZMSVRFX0RDSEVDS19FUShpbnB1dF9zaGFwZS5EaW1lbnNpb25zQ291bnQoKSwgNCk7CisgIFRGTElURV9EQ0hFQ0tfRVEoZmlsdGVyX3NoYXBlLkRpbWVuc2lvbnNDb3VudCgpLCA0KTsKKyAgVEZMSVRFX0RDSEVDS19FUShvdXRwdXRfc2hhcGUuRGltZW5zaW9uc0NvdW50KCksIDQpOworICBjb25zdCBpbnQgYmF0Y2hfc2l6ZSA9IE1hdGNoaW5nRGltKGlucHV0X3NoYXBlLCAwLCBvdXRwdXRfc2hhcGUsIDApOworICBjb25zdCBpbnQgaW5wdXRfZGVwdGggPSBNYXRjaGluZ0RpbShpbnB1dF9zaGFwZSwgMywgZmlsdGVyX3NoYXBlLCAzKTsKKyAgY29uc3QgaW50IG91dHB1dF9kZXB0aCA9IE1hdGNoaW5nRGltKGZpbHRlcl9zaGFwZSwgMCwgb3V0cHV0X3NoYXBlLCAzKTsKKyAgaWYgKHRmbGl0ZTo6bWljcm86OkdldE9wdGlvbmFsVGVuc29yRGF0YTxpbnQzMl90PihiaWFzKSkgeworICAgIFRGTElURV9EQ0hFQ0tfRVEoYmlhc19zaGFwZS5GbGF0U2l6ZSgpLCBvdXRwdXRfZGVwdGgpOworICB9CisKKyAgY21zaXNfbm5fZGltcyBpbnB1dF9kaW1zOworICBpbnB1dF9kaW1zLm4gPSBiYXRjaF9zaXplOworICBpbnB1dF9kaW1zLmggPSBpbnB1dF9zaGFwZS5EaW1zKDEpOworICBpbnB1dF9kaW1zLncgPSBpbnB1dF9zaGFwZS5EaW1zKDIpOworICBpbnB1dF9kaW1zLmMgPSBpbnB1dF9kZXB0aDsKKworICBjbXNpc19ubl9kaW1zIGZpbHRlcl9kaW1zOworICBmaWx0ZXJfZGltcy5uID0gb3V0cHV0X2RlcHRoOworICBmaWx0ZXJfZGltcy5oID0gZmlsdGVyX3NoYXBlLkRpbXMoMSk7CisgIGZpbHRlcl9kaW1zLncgPSBmaWx0ZXJfc2hhcGUuRGltcygyKTsKKyAgZmlsdGVyX2RpbXMuYyA9IGlucHV0X2RlcHRoOworCisgIGNtc2lzX25uX2RpbXMgYmlhc19kaW1zOworICBiaWFzX2RpbXMubiA9IDE7CisgIGJpYXNfZGltcy5oID0gMTsKKyAgYmlhc19kaW1zLncgPSAxOworICBiaWFzX2RpbXMuYyA9IG91dHB1dF9kZXB0aDsKKworICBjbXNpc19ubl9kaW1zIG91dHB1dF9kaW1zOworICBvdXRwdXRfZGltcy5uID0gYmF0Y2hfc2l6ZTsKKyAgb3V0cHV0X2RpbXMuaCA9IG91dHB1dF9zaGFwZS5EaW1zKDEpOworICBvdXRwdXRfZGltcy53ID0gb3V0cHV0X3NoYXBlLkRpbXMoMik7CisgIG91dHB1dF9kaW1zLmMgPSBvdXRwdXRfZGVwdGg7CisKKyAgY21zaXNfbm5fY29udGV4dCBjdHg7CisgIGN0eC5zaXplID0gMDsgIC8vIE5vdGU6IGN0eC5zaXplIGlzIGN1cnJlbnRseSBub3QgdXNlZCBpbiBjbXNpc19ubi4KKyAgY3R4LmJ1ZiA9IGNvbnRleHQtPkdldFNjcmF0Y2hCdWZmZXIoY29udGV4dCwgZGF0YS5zY3JhdGNoX2J1ZmZlcl9pbmRleCk7CisKKyAgY21zaXNfbm5fY29udGV4dCBzY3JhdGNoX291dHB1dF9jdHg7CisgIHNjcmF0Y2hfb3V0cHV0X2N0eC5zaXplID0KKyAgICAgIDA7ICAvLyBOb3RlOiBjdHguc2l6ZSBpcyBjdXJyZW50bHkgbm90IHVzZWQgaW4gY21zaXNfbm4uCisgIHNjcmF0Y2hfb3V0cHV0X2N0eC5idWYgPQorICAgICAgY29udGV4dC0+R2V0U2NyYXRjaEJ1ZmZlcihjb250ZXh0LCBkYXRhLnNjcmF0Y2hfYnVmZmVyX291dHB1dF9pbmRleCk7CisKKyAgVEZMSVRFX0RDSEVDS19FUSgKKyAgICAgIGFybV90cmFuc3Bvc2VfY29udl9zOCgKKyAgICAgICAgICAmY3R4LCAmc2NyYXRjaF9vdXRwdXRfY3R4LCAmY29udl9wYXJhbXMsICZxdWFudF9wYXJhbXMsICZpbnB1dF9kaW1zLAorICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihpbnB1dCksICZmaWx0ZXJfZGltcywKKyAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4oZmlsdGVyKSwgJmJpYXNfZGltcywKKyAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRPcHRpb25hbFRlbnNvckRhdGE8aW50MzJfdD4oYmlhcyksICZvdXRwdXRfZGltcywKKyAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4ob3V0cHV0KSksCisgICAgICBBUk1fQ01TSVNfTk5fU1VDQ0VTUyk7CisKKyAgcmV0dXJuIGtUZkxpdGVPazsKK30KKyNlbmRpZgorCitUZkxpdGVTdGF0dXMgRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CisgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0ID0KKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dChjb250ZXh0LCBub2RlLCBrSW5wdXRUZW5zb3IpOworICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBmaWx0ZXIgPQorICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KGNvbnRleHQsIG5vZGUsIGtGaWx0ZXJUZW5zb3IpOworICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBiaWFzID0KKyAgICAgIChOdW1JbnB1dHMobm9kZSkgPT0gNCkKKyAgICAgICAgICA/IHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dChjb250ZXh0LCBub2RlLCBrQmlhc1RlbnNvcikKKyAgICAgICAgICA6IG51bGxwdHI7CisgIFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dCA9CisgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsT3V0cHV0KGNvbnRleHQsIG5vZGUsIGtPdXRwdXRUZW5zb3IpOworCisgIFRGTElURV9EQ0hFQ0sobm9kZS0+dXNlcl9kYXRhICE9IG51bGxwdHIpOworICBjb25zdCBPcERhdGEmIGRhdGEgPSAqKHN0YXRpY19jYXN0PGNvbnN0IE9wRGF0YSo+KG5vZGUtPnVzZXJfZGF0YSkpOworCisgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIGlucHV0LT50eXBlLCBvdXRwdXQtPnR5cGUpOworICBjb25zdCBhdXRvJiBwYXJhbXMgPQorICAgICAgKihyZWludGVycHJldF9jYXN0PFRmTGl0ZUNvbnZQYXJhbXMqPihub2RlLT5idWlsdGluX2RhdGEpKTsKKworICBzd2l0Y2ggKGlucHV0LT50eXBlKSB7ICAvLyBBbHJlYWR5IGtub3cgaW4vb3V0IHR5cGVzIGFyZSBzYW1lLgorICAgIGNhc2Uga1RmTGl0ZUZsb2F0MzI6IHsKKyAgICAgIENvbnZQYXJhbXMgb3BfcGFyYW1zID0gZGF0YS5wYXJhbXM7CisgICAgICBDYWxjdWxhdGVBY3RpdmF0aW9uUmFuZ2UocGFyYW1zLmFjdGl2YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wX3BhcmFtcy5mbG9hdF9hY3RpdmF0aW9uX21pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3BfcGFyYW1zLmZsb2F0X2FjdGl2YXRpb25fbWF4KTsKKworICAgICAgcmVmZXJlbmNlX29wczo6VHJhbnNwb3NlQ29udigKKyAgICAgICAgICBvcF9wYXJhbXMsIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGlucHV0KSwKKyAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGZsb2F0PihpbnB1dCksCisgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoZmlsdGVyKSwKKyAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGZsb2F0PihmaWx0ZXIpLAorICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGJpYXMpLAorICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldE9wdGlvbmFsVGVuc29yRGF0YTxmbG9hdD4oYmlhcyksCisgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUob3V0cHV0KSwKKyAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGZsb2F0PihvdXRwdXQpLAorICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIGtUZkxpdGVJbnQ4OiB7CisjaWYgZGVmaW5lZChLRVJORUxTX09QVElNSVpFRF9GT1JfU0laRSkKKyAgICAgIGludDMyX3QqIHNjcmF0Y2hfYnVmZmVyID0gc3RhdGljX2Nhc3Q8aW50MzJfdCo+KAorICAgICAgICAgIGNvbnRleHQtPkdldFNjcmF0Y2hCdWZmZXIoY29udGV4dCwgZGF0YS5zY3JhdGNoX2J1ZmZlcl9pbmRleCkpOworICAgICAgcmVmZXJlbmNlX2ludGVnZXJfb3BzOjpUcmFuc3Bvc2VDb252KAorICAgICAgICAgIGRhdGEucGFyYW1zLCBkYXRhLnBlcl9jaGFubmVsX291dHB1dF9tdWx0aXBsaWVyLAorICAgICAgICAgIGRhdGEucGVyX2NoYW5uZWxfb3V0cHV0X3NoaWZ0LCB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShpbnB1dCksCisgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KGlucHV0KSwKKyAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShmaWx0ZXIpLAorICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihmaWx0ZXIpLAorICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGJpYXMpLAorICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldE9wdGlvbmFsVGVuc29yRGF0YTxpbnQzMl90PihiaWFzKSwKKyAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShvdXRwdXQpLAorICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihvdXRwdXQpLAorICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKG51bGxwdHIpLCBudWxscHRyLCBzY3JhdGNoX2J1ZmZlcik7CisjZWxpZiBkZWZpbmVkKEtFUk5FTFNfT1BUSU1JWkVEX0ZPUl9TUEVFRCkKKyAgICAgIHJldHVybiBFdmFsUXVhbnRpemVkUGVyQ2hhbm5lbChjb250ZXh0LCBub2RlLCBwYXJhbXMsIGRhdGEsIGlucHV0LCBmaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlhcywgb3V0cHV0KTsKKyNlbHNlCisgICAgICBNaWNyb1ByaW50ZigKKyAgICAgICAgICAiRWl0aGVyIEtFUk5FTFNfT1BUSU1JWkVEX0ZPUl9TSVpFIG9yIEtFUk5FTFNfT1BUSU1JWkVEX0ZPUl9TUEVFRCAiCisgICAgICAgICAgIm11c3QgYmUgZGVmaW5lZCIpOworICAgICAgcmV0dXJuIGtUZkxpdGVFcnJvcjsKKyNlbmRpZgorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2Uga1RmTGl0ZUludDE2OiB7CisgICAgICBzdGQ6OmludDY0X3QqIHNjcmF0Y2hfYnVmZmVyID0gc3RhdGljX2Nhc3Q8aW50NjRfdCo+KAorICAgICAgICAgIGNvbnRleHQtPkdldFNjcmF0Y2hCdWZmZXIoY29udGV4dCwgZGF0YS5zY3JhdGNoX2J1ZmZlcl9pbmRleCkpOworICAgICAgLy8gVE9ETyhiLzE5MjA5MDUzMSk6IFJlbW92ZSB0aGlzIG9uY2UgYWxsIDh4MTYgdHJhbnNwb3NlIGNvbnYgbW9kZWxzIHVzZQorICAgICAgLy8gNjQtYml0IGJpYXNlcy4KKyAgICAgIGlmIChiaWFzICE9IG51bGxwdHIgJiYgYmlhcy0+dHlwZSA9PSBrVGZMaXRlSW50MTYpIHsKKyAgICAgICAgc3RkOjppbnQ2NF90KiBiaWFzX2NvbnZlcnRlZF9idWZmZXIgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50NjRfdCo+KGNvbnRleHQtPkdldFNjcmF0Y2hCdWZmZXIoCisgICAgICAgICAgICAgICAgY29udGV4dCwgZGF0YS5iaWFzX2NvbnZlcnRlZF9idWZmZXJfaW5kZXgpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShiaWFzKS5GbGF0U2l6ZSgpOworICAgICAgICAgICAgIGkrKykgeworICAgICAgICAgIGJpYXNfY29udmVydGVkX2J1ZmZlcltpXSA9IGJpYXMtPmRhdGEuaTE2W2ldOworICAgICAgICB9CisgICAgICAgIHJlZmVyZW5jZV9pbnRlZ2VyX29wczo6VHJhbnNwb3NlQ29udigKKyAgICAgICAgICAgIGRhdGEucGFyYW1zLCBkYXRhLnBlcl9jaGFubmVsX291dHB1dF9tdWx0aXBsaWVyLAorICAgICAgICAgICAgZGF0YS5wZXJfY2hhbm5lbF9vdXRwdXRfc2hpZnQsIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGlucHV0KSwKKyAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50MTZfdD4oaW5wdXQpLAorICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoZmlsdGVyKSwKKyAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihmaWx0ZXIpLAorICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoYmlhcyksIGJpYXNfY29udmVydGVkX2J1ZmZlciwKKyAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKG91dHB1dCksCisgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KG91dHB1dCksCisgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShudWxscHRyKSwgbnVsbHB0ciwgc2NyYXRjaF9idWZmZXIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVmZXJlbmNlX2ludGVnZXJfb3BzOjpUcmFuc3Bvc2VDb252KAorICAgICAgICAgICAgZGF0YS5wYXJhbXMsIGRhdGEucGVyX2NoYW5uZWxfb3V0cHV0X211bHRpcGxpZXIsCisgICAgICAgICAgICBkYXRhLnBlcl9jaGFubmVsX291dHB1dF9zaGlmdCwgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoaW5wdXQpLAorICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90PihpbnB1dCksCisgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShmaWx0ZXIpLAorICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KGZpbHRlciksCisgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShiaWFzKSwKKyAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldE9wdGlvbmFsVGVuc29yRGF0YTxzdGQ6OmludDY0X3Q+KGJpYXMpLAorICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUob3V0cHV0KSwKKyAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50MTZfdD4ob3V0cHV0KSwKKyAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKG51bGxwdHIpLCBudWxscHRyLCBzY3JhdGNoX2J1ZmZlcik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIE1pY3JvUHJpbnRmKCJUeXBlICVzICglZCkgbm90IHN1cHBvcnRlZC4iLCBUZkxpdGVUeXBlR2V0TmFtZShpbnB1dC0+dHlwZSksCisgICAgICAgICAgICAgICAgICBpbnB1dC0+dHlwZSk7CisgICAgICByZXR1cm4ga1RmTGl0ZUVycm9yOworICB9CisgIHJldHVybiBrVGZMaXRlT2s7Cit9CisKK1RmTGl0ZVN0YXR1cyBFdmFsSW50OChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CisgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0ID0KKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dChjb250ZXh0LCBub2RlLCBrSW5wdXRUZW5zb3IpOworICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBmaWx0ZXIgPQorICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KGNvbnRleHQsIG5vZGUsIGtGaWx0ZXJUZW5zb3IpOworICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBiaWFzID0KKyAgICAgIChOdW1JbnB1dHMobm9kZSkgPT0gNCkKKyAgICAgICAgICA/IHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dChjb250ZXh0LCBub2RlLCBrQmlhc1RlbnNvcikKKyAgICAgICAgICA6IG51bGxwdHI7CisgIFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dCA9CisgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsT3V0cHV0KGNvbnRleHQsIG5vZGUsIGtPdXRwdXRUZW5zb3IpOworCisgIFRGTElURV9EQ0hFQ0sobm9kZS0+dXNlcl9kYXRhICE9IG51bGxwdHIpOworICBjb25zdCBPcERhdGEmIGRhdGEgPSAqKHN0YXRpY19jYXN0PGNvbnN0IE9wRGF0YSo+KG5vZGUtPnVzZXJfZGF0YSkpOworCisjaWYgZGVmaW5lZChLRVJORUxTX09QVElNSVpFRF9GT1JfU0laRSkKKyAgaW50MzJfdCogc2NyYXRjaF9idWZmZXIgPSBzdGF0aWNfY2FzdDxpbnQzMl90Kj4oCisgICAgICBjb250ZXh0LT5HZXRTY3JhdGNoQnVmZmVyKGNvbnRleHQsIGRhdGEuc2NyYXRjaF9idWZmZXJfaW5kZXgpKTsKKyAgcmVmZXJlbmNlX2ludGVnZXJfb3BzOjpUcmFuc3Bvc2VDb252KAorICAgICAgZGF0YS5wYXJhbXMsIGRhdGEucGVyX2NoYW5uZWxfb3V0cHV0X211bHRpcGxpZXIsCisgICAgICBkYXRhLnBlcl9jaGFubmVsX291dHB1dF9zaGlmdCwgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoaW5wdXQpLAorICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KGlucHV0KSwKKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGZpbHRlciksCisgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4oZmlsdGVyKSwKKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGJpYXMpLAorICAgICAgdGZsaXRlOjptaWNybzo6R2V0T3B0aW9uYWxUZW5zb3JEYXRhPGludDMyX3Q+KGJpYXMpLAorICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUob3V0cHV0KSwKKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihvdXRwdXQpLAorICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUobnVsbHB0ciksIG51bGxwdHIsIHNjcmF0Y2hfYnVmZmVyKTsKKyNlbGlmIGRlZmluZWQoS0VSTkVMU19PUFRJTUlaRURfRk9SX1NQRUVEKQorICBjb25zdCBhdXRvJiBwYXJhbXMgPQorICAgICAgKihyZWludGVycHJldF9jYXN0PFRmTGl0ZUNvbnZQYXJhbXMqPihub2RlLT5idWlsdGluX2RhdGEpKTsKKworICByZXR1cm4gRXZhbFF1YW50aXplZFBlckNoYW5uZWwoY29udGV4dCwgbm9kZSwgcGFyYW1zLCBkYXRhLCBpbnB1dCwgZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmlhcywgb3V0cHV0KTsKKyNlbHNlCisgIE1pY3JvUHJpbnRmKAorICAgICAgIkVpdGhlciBLRVJORUxTX09QVElNSVpFRF9GT1JfU0laRSBvciBLRVJORUxTX09QVElNSVpFRF9GT1JfU1BFRUQgbXVzdCAiCisgICAgICAiYmUgZGVmaW5lZCIpOworICByZXR1cm4ga1RmTGl0ZUVycm9yOworI2VuZGlmCisgIHJldHVybiBrVGZMaXRlT2s7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX1RSQU5TUE9TRV9DT05WKCkgeworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChJbml0LCBQcmVwYXJlLCBFdmFsKTsKK30KKworVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9UUkFOU1BPU0VfQ09OVl9JTlQ4KCkgeworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChJbml0LCBQcmVwYXJlLCBFdmFsSW50OCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZmxpdGUKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2Ntc2lzX25uL3VuaWRpcmVjdGlvbmFsX3NlcXVlbmNlX2xzdG0uY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jbXNpc19ubi91bmlkaXJlY3Rpb25hbF9zZXF1ZW5jZV9sc3RtLmNjCmluZGV4IGY2NmNlODAuLjQ5ZGE0ZDkgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2Ntc2lzX25uL3VuaWRpcmVjdGlvbmFsX3NlcXVlbmNlX2xzdG0uY2MKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvY21zaXNfbm4vdW5pZGlyZWN0aW9uYWxfc2VxdWVuY2VfbHN0bS5jYwpAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgMjAyNCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTI4LDQ3NyArMjgsMzAwIEBACiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvbHN0bV9ldmFsLmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvbHN0bV9zaGFyZWQuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9taWNyb190ZW5zb3JfdXRpbHMuaCIKLQogbmFtZXNwYWNlIHRmbGl0ZSB7CiAKIG5hbWVzcGFjZSB7CiAKIHN0cnVjdCBPcERhdGEgewotICBPcERhdGFMU1RNIHBhcmFtc19yZWY7Ci0gIGNtc2lzX25uX2xzdG1fcGFyYW1zIHBhcmFtc19jbXNpc19ubjsKKyAgT3BEYXRhTFNUTSBwYXJhbXNfcmVmOyAgICAgICAgICAgICAgICAgLy8gVXNlZCBmb3IgZmFsbGJhY2sgaW1wbGVtZW50YXRpb24KKyAgY21zaXNfbm5fbHN0bV9wYXJhbXMgcGFyYW1zX2Ntc2lzX25uOyAgLy8gVXNlZCBmb3IgIENNU0lTLU5OIGltcGxlbWVudGF0aW9uCiB9OwogCi0vKkhlbHBlciBGdW5jdGlvbnMqLwotVGZMaXRlU3RhdHVzIFByZWNvbXB1dGVaZXJvUG9pbnRUaW1lc1dlaWdodFdpdGhCaWFzKAotICAgIFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGludDMyX3QgemVyb19wb2ludCwKLSAgICBjb25zdCBUZkxpdGVUZW5zb3IqIHdlaWdodF90ZW5zb3IsIGNvbnN0IFRmTGl0ZVRlbnNvciogYmlhc190ZW5zb3IsCi0gICAgaW50MzJfdCoqIG91dHB1dCkgewotICBpZiAod2VpZ2h0X3RlbnNvciA9PSBudWxscHRyKSB7Ci0gICAgcmV0dXJuIGtUZkxpdGVPazsKLSAgfQorTFNUTUJ1ZmZlcnM8aW50MTZfdD4gQ01TSVNfTk5fQ3JlYXRlTFNUTUJ1ZmZlcnMoVGZMaXRlQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCogYnVmZmVyX2luZGljZXMpIHsKKyAgTFNUTUJ1ZmZlcnM8aW50MTZfdD4gYnVmZmVyczsKKyAgYnVmZmVycy5idWZmZXIwID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4oCisgICAgICBjb250ZXh0LT5HZXRTY3JhdGNoQnVmZmVyKGNvbnRleHQsIGJ1ZmZlcl9pbmRpY2VzWzBdKSk7CisgIGJ1ZmZlcnMuYnVmZmVyMSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCo+KAorICAgICAgY29udGV4dC0+R2V0U2NyYXRjaEJ1ZmZlcihjb250ZXh0LCBidWZmZXJfaW5kaWNlc1sxXSkpOworICBidWZmZXJzLmJ1ZmZlcjIgPSByZWludGVycHJldF9jYXN0PGludDE2X3QqPigKKyAgICAgIGNvbnRleHQtPkdldFNjcmF0Y2hCdWZmZXIoY29udGV4dCwgYnVmZmVyX2luZGljZXNbMl0pKTsKIAotICBjb25zdCBSdW50aW1lU2hhcGUmIHdlaWdodF9zaGFwZSA9IEdldFRlbnNvclNoYXBlKHdlaWdodF90ZW5zb3IpOwotICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCB3ZWlnaHRfc2hhcGUuRGltZW5zaW9uc0NvdW50KCksIDIpOwotICBjb25zdCBpbnQgcm93ID0gd2VpZ2h0X3NoYXBlLkRpbXMoMCk7Ci0gIGNvbnN0IGludCBjb2wgPSB3ZWlnaHRfc2hhcGUuRGltcygxKTsKLSAgVEZMSVRFX0RDSEVDSyhjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIgIT0gbnVsbHB0cik7Ci0gICpvdXRwdXQgPSBzdGF0aWNfY2FzdDxpbnQzMl90Kj4oCi0gICAgICBjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIoY29udGV4dCwgcm93ICogc2l6ZW9mKGludDMyX3QpKSk7Ci0KLSAgaWYgKGJpYXNfdGVuc29yID09IG51bGxwdHIpIHsKLSAgICBtZW1zZXQoKm91dHB1dCwgMCwgcm93ICogc2l6ZW9mKGludDMyX3QpKTsKLSAgfSBlbHNlIHsKLSAgICBjb25zdCBpbnQzMl90KiBiaWFzID0gR2V0VGVuc29yRGF0YTxpbnQzMl90PihiaWFzX3RlbnNvcik7Ci0gICAgbWVtY3B5KCpvdXRwdXQsIGJpYXMsIHJvdyAqIHNpemVvZihpbnQzMl90KSk7Ci0gIH0KLQotICBpZiAoemVyb19wb2ludCAhPSAwKSB7Ci0gICAgY29uc3QgaW50OF90KiB3ZWlnaHQgPSBHZXRUZW5zb3JEYXRhPGludDhfdD4od2VpZ2h0X3RlbnNvcik7Ci0gICAgdGZsaXRlOjp0ZW5zb3JfdXRpbHM6Ok1hdHJpeFNjYWxhck11bHRpcGx5QWNjdW11bGF0ZSh3ZWlnaHQsIHplcm9fcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3csIGNvbCwgKm91dHB1dCk7Ci0gIH0KLSAgcmV0dXJuIGtUZkxpdGVPazsKKyAgcmV0dXJuIGJ1ZmZlcnM7CiB9CiAKLVRmTGl0ZVN0YXR1cyBDYWxjdWxhdGVPcERhdGEoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTHN0bVRlbnNvcnMmIGxzdG1fdGVuc29ycywgT3BEYXRhKiBvcF9kYXRhKSB7Ci0gIGNvbnN0IFRmTGl0ZVRlbnNvciogaW5wdXQgPSBsc3RtX3RlbnNvcnMuR2V0SW50ZXJuYWxUZW5zb3Ioa0xzdG1JbnB1dFRlbnNvcik7Ci0gIGNvbnN0IFRmTGl0ZVRlbnNvciogb3V0cHV0X3N0YXRlID0KLSAgICAgIGxzdG1fdGVuc29ycy5HZXRJbnRlcm5hbFRlbnNvcih0ZmxpdGU6OmtMc3RtT3V0cHV0U3RhdGVUZW5zb3IpOwordm9pZCBDTVNJU19OTl9WZWN0b3JTdW0oaW50MzJfdCoga2VybmVsX3N1bSwgY29uc3QgaW50MzJfdCBzaXplMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2l6ZTIsIGNvbnN0IGludDhfdCogd2VpZ2h0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgb2Zmc2V0LCBjb25zdCBpbnQzMl90KiBiaWFzZXMpIHsKKyAgYXJtX3ZlY3Rvcl9zdW1fczgoa2VybmVsX3N1bSwgc2l6ZTEsIHNpemUyLCB3ZWlnaHRzLCBvZmZzZXQsIGJpYXNlcyk7Cit9CiAKLSAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgaW5wdXQtPnR5cGUgPT0ga1RmTGl0ZUludDgpOwordm9pZCBDTVNJU19OTl9WZWN0b3JTdW0oaW50NjRfdCoga2VybmVsX3N1bSwgY29uc3QgaW50MzJfdCBzaXplMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc2l6ZTIsIGNvbnN0IGludDhfdCogd2VpZ2h0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgb2Zmc2V0LCBjb25zdCBpbnQ2NF90KiBiaWFzZXMpIHsKKyAgYXJtX3ZlY3Rvcl9zdW1fczhfczY0KGtlcm5lbF9zdW0sIHNpemUxLCBzaXplMiwgd2VpZ2h0cywgb2Zmc2V0LCBiaWFzZXMpOworfQogCi0gIG9wX2RhdGEtPnBhcmFtc19jbXNpc19ubi5vdXRwdXRfc3RhdGVfb2Zmc2V0ID0KLSAgICAgIG91dHB1dF9zdGF0ZS0+cGFyYW1zLnplcm9fcG9pbnQ7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgQmlhc1R5cGU+CitUZkxpdGVTdGF0dXMgQ01TSVNfTk5fUG9ydE9wRGF0YShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBPcERhdGFMU1RNKiBwYXJhbXNfcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFNUTUtlcm5lbENvbnRlbnRzJiBrZXJuZWxfY29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtc2lzX25uX2xzdG1fcGFyYW1zKiBwYXJhbXNfY21zaXNfbm4pIHsKKyAgLy8gVW53cmFwIHBvaW50ZXJzCisgIGNvbnN0IEJpYXNUeXBlKiBpbnB1dF9nYXRlX2JpYXMgPQorICAgICAgdGZsaXRlOjptaWNybzo6R2V0T3B0aW9uYWxUZW5zb3JEYXRhPEJpYXNUeXBlPigKKyAgICAgICAgICBrZXJuZWxfY29udGVudC5HZXRJbnRlcm5hbFRlbnNvcih0ZmxpdGU6OmtMc3RtSW5wdXRHYXRlQmlhc1RlbnNvcikpOworICBjb25zdCBCaWFzVHlwZSogZm9yZ2V0X2dhdGVfYmlhcyA9CisgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRPcHRpb25hbFRlbnNvckRhdGE8Qmlhc1R5cGU+KAorICAgICAgICAgIGtlcm5lbF9jb250ZW50LkdldEludGVybmFsVGVuc29yKHRmbGl0ZTo6a0xzdG1Gb3JnZXRHYXRlQmlhc1RlbnNvcikpOworICBjb25zdCBCaWFzVHlwZSogY2VsbF9nYXRlX2JpYXMgPQorICAgICAgdGZsaXRlOjptaWNybzo6R2V0T3B0aW9uYWxUZW5zb3JEYXRhPEJpYXNUeXBlPigKKyAgICAgICAgICBrZXJuZWxfY29udGVudC5HZXRJbnRlcm5hbFRlbnNvcih0ZmxpdGU6OmtMc3RtQ2VsbEdhdGVCaWFzVGVuc29yKSk7CisgIGNvbnN0IEJpYXNUeXBlKiBvdXRwdXRfZ2F0ZV9iaWFzID0KKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldE9wdGlvbmFsVGVuc29yRGF0YTxCaWFzVHlwZT4oCisgICAgICAgICAga2VybmVsX2NvbnRlbnQuR2V0SW50ZXJuYWxUZW5zb3IodGZsaXRlOjprTHN0bU91dHB1dEdhdGVCaWFzVGVuc29yKSk7CiAKLSAgY29uc3QgVGZMaXRlVGVuc29yKiBpbnB1dF90b19mb3JnZXRfd2VpZ2h0cyA9Ci0gICAgICBsc3RtX3RlbnNvcnMuR2V0SW50ZXJuYWxUZW5zb3Ioa0xzdG1JbnB1dFRvRm9yZ2V0V2VpZ2h0c1RlbnNvcik7Ci0gIGNvbnN0IFRmTGl0ZVRlbnNvciogaW5wdXRfdG9faW5wdXRfd2VpZ2h0cyA9Ci0gICAgICBsc3RtX3RlbnNvcnMuR2V0SW50ZXJuYWxUZW5zb3Ioa0xzdG1JbnB1dFRvSW5wdXRXZWlnaHRzVGVuc29yKTsKLSAgY29uc3QgVGZMaXRlVGVuc29yKiBpbnB1dF90b19vdXRwdXRfd2VpZ2h0cyA9Ci0gICAgICBsc3RtX3RlbnNvcnMuR2V0SW50ZXJuYWxUZW5zb3Ioa0xzdG1JbnB1dFRvT3V0cHV0V2VpZ2h0c1RlbnNvcik7Ci0gIGNvbnN0IFRmTGl0ZVRlbnNvciogaW5wdXRfdG9fY2VsbF93ZWlnaHRzID0KLSAgICAgIGxzdG1fdGVuc29ycy5HZXRJbnRlcm5hbFRlbnNvcihrTHN0bUlucHV0VG9DZWxsV2VpZ2h0c1RlbnNvcik7Ci0gIGNvbnN0IFRmTGl0ZVRlbnNvciogZm9yZ2V0X2dhdGVfYmlhcyA9Ci0gICAgICBsc3RtX3RlbnNvcnMuR2V0SW50ZXJuYWxUZW5zb3Ioa0xzdG1Gb3JnZXRHYXRlQmlhc1RlbnNvcik7Ci0gIGNvbnN0IFRmTGl0ZVRlbnNvciogY2VsbF9zdGF0ZSA9Ci0gICAgICBsc3RtX3RlbnNvcnMuR2V0SW50ZXJuYWxUZW5zb3Ioa0xzdG1DZWxsU3RhdGVUZW5zb3IpOworICBjb25zdCBpbnQ4X3QqIGlucHV0X3RvX2lucHV0X3dlaWdodHMgPQorICAgICAgdGZsaXRlOjptaWNybzo6R2V0T3B0aW9uYWxUZW5zb3JEYXRhPGludDhfdD4oCisgICAgICAgICAga2VybmVsX2NvbnRlbnQuR2V0SW50ZXJuYWxUZW5zb3IoCisgICAgICAgICAgICAgIHRmbGl0ZTo6a0xzdG1JbnB1dFRvSW5wdXRXZWlnaHRzVGVuc29yKSk7CisgIGNvbnN0IGludDhfdCogaW5wdXRfdG9fZm9yZ2V0X3dlaWdodHMgPQorICAgICAgdGZsaXRlOjptaWNybzo6R2V0T3B0aW9uYWxUZW5zb3JEYXRhPGludDhfdD4oCisgICAgICAgICAga2VybmVsX2NvbnRlbnQuR2V0SW50ZXJuYWxUZW5zb3IoCisgICAgICAgICAgICAgIHRmbGl0ZTo6a0xzdG1JbnB1dFRvRm9yZ2V0V2VpZ2h0c1RlbnNvcikpOworICBjb25zdCBpbnQ4X3QqIGlucHV0X3RvX2NlbGxfd2VpZ2h0cyA9CisgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRPcHRpb25hbFRlbnNvckRhdGE8aW50OF90PigKKyAgICAgICAgICBrZXJuZWxfY29udGVudC5HZXRJbnRlcm5hbFRlbnNvcigKKyAgICAgICAgICAgICAgdGZsaXRlOjprTHN0bUlucHV0VG9DZWxsV2VpZ2h0c1RlbnNvcikpOworICBjb25zdCBpbnQ4X3QqIGlucHV0X3RvX291dHB1dF93ZWlnaHRzID0KKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldE9wdGlvbmFsVGVuc29yRGF0YTxpbnQ4X3Q+KAorICAgICAgICAgIGtlcm5lbF9jb250ZW50LkdldEludGVybmFsVGVuc29yKAorICAgICAgICAgICAgICB0ZmxpdGU6OmtMc3RtSW5wdXRUb091dHB1dFdlaWdodHNUZW5zb3IpKTsKIAotICBjb25zdCBUZkxpdGVUZW5zb3IqIGNlbGxfZ2F0ZV9iaWFzID0KLSAgICAgIGxzdG1fdGVuc29ycy5HZXRJbnRlcm5hbFRlbnNvcihrTHN0bUNlbGxHYXRlQmlhc1RlbnNvcik7Ci0gIGNvbnN0IFRmTGl0ZVRlbnNvciogb3V0cHV0X2dhdGVfYmlhcyA9Ci0gICAgICBsc3RtX3RlbnNvcnMuR2V0SW50ZXJuYWxUZW5zb3Ioa0xzdG1PdXRwdXRHYXRlQmlhc1RlbnNvcik7Ci0gIGNvbnN0IFRmTGl0ZVRlbnNvciogaW5wdXRfZ2F0ZV9iaWFzID0KLSAgICAgIGxzdG1fdGVuc29ycy5HZXRJbnRlcm5hbFRlbnNvcihrTHN0bUlucHV0R2F0ZUJpYXNUZW5zb3IpOwotICBjb25zdCBUZkxpdGVUZW5zb3IqIHJlY3VycmVudF90b19mb3JnZXRfd2VpZ2h0cyA9Ci0gICAgICBsc3RtX3RlbnNvcnMuR2V0SW50ZXJuYWxUZW5zb3Ioa0xzdG1SZWN1cnJlbnRUb0ZvcmdldFdlaWdodHNUZW5zb3IpOwotICBjb25zdCBUZkxpdGVUZW5zb3IqIHJlY3VycmVudF90b19jZWxsX3dlaWdodHMgPQotICAgICAgbHN0bV90ZW5zb3JzLkdldEludGVybmFsVGVuc29yKGtMc3RtUmVjdXJyZW50VG9DZWxsV2VpZ2h0c1RlbnNvcik7Ci0gIGNvbnN0IFRmTGl0ZVRlbnNvciogcmVjdXJyZW50X3RvX291dHB1dF93ZWlnaHRzID0KLSAgICAgIGxzdG1fdGVuc29ycy5HZXRJbnRlcm5hbFRlbnNvcihrTHN0bVJlY3VycmVudFRvT3V0cHV0V2VpZ2h0c1RlbnNvcik7Ci0gIGNvbnN0IFRmTGl0ZVRlbnNvciogcmVjdXJyZW50X3RvX2lucHV0X3dlaWdodHMgPQotICAgICAgbHN0bV90ZW5zb3JzLkdldEludGVybmFsVGVuc29yKGtMc3RtUmVjdXJyZW50VG9JbnB1dFdlaWdodHNUZW5zb3IpOwotICBjb25zdCBUZkxpdGVUZW5zb3IqIGNlbGxfdG9fb3V0cHV0X3dlaWdodHMgPQotICAgICAgbHN0bV90ZW5zb3JzLkdldEludGVybmFsVGVuc29yKGtMc3RtQ2VsbFRvT3V0cHV0V2VpZ2h0c1RlbnNvcik7Ci0gIGNvbnN0IFRmTGl0ZVRlbnNvciogZm9yZ2V0X2xheWVyX25vcm1fY29lZmZpY2llbnRzID0KLSAgICAgIGxzdG1fdGVuc29ycy5HZXRJbnRlcm5hbFRlbnNvcihrTHN0bUZvcmdldExheWVyTm9ybUNvZWZmaWNpZW50c1RlbnNvcik7Ci0gIGNvbnN0IFRmTGl0ZVRlbnNvciogcHJvamVjdGlvbl93ZWlnaHRzID0KLSAgICAgIGxzdG1fdGVuc29ycy5HZXRJbnRlcm5hbFRlbnNvcihrTHN0bVByb2plY3Rpb25XZWlnaHRzVGVuc29yKTsKKyAgY29uc3QgaW50OF90KiByZWN1cnJlbnRfdG9faW5wdXRfd2VpZ2h0cyA9CisgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRPcHRpb25hbFRlbnNvckRhdGE8aW50OF90PigKKyAgICAgICAgICBrZXJuZWxfY29udGVudC5HZXRJbnRlcm5hbFRlbnNvcigKKyAgICAgICAgICAgICAgdGZsaXRlOjprTHN0bVJlY3VycmVudFRvSW5wdXRXZWlnaHRzVGVuc29yKSk7CisgIGNvbnN0IGludDhfdCogcmVjdXJyZW50X3RvX2ZvcmdldF93ZWlnaHRzID0KKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldE9wdGlvbmFsVGVuc29yRGF0YTxpbnQ4X3Q+KAorICAgICAgICAgIGtlcm5lbF9jb250ZW50LkdldEludGVybmFsVGVuc29yKAorICAgICAgICAgICAgICB0ZmxpdGU6OmtMc3RtUmVjdXJyZW50VG9Gb3JnZXRXZWlnaHRzVGVuc29yKSk7CisgIGNvbnN0IGludDhfdCogcmVjdXJyZW50X3RvX2NlbGxfd2VpZ2h0cyA9CisgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRPcHRpb25hbFRlbnNvckRhdGE8aW50OF90PigKKyAgICAgICAgICBrZXJuZWxfY29udGVudC5HZXRJbnRlcm5hbFRlbnNvcigKKyAgICAgICAgICAgICAgdGZsaXRlOjprTHN0bVJlY3VycmVudFRvQ2VsbFdlaWdodHNUZW5zb3IpKTsKKyAgY29uc3QgaW50OF90KiByZWN1cnJlbnRfdG9fb3V0cHV0X3dlaWdodHMgPQorICAgICAgdGZsaXRlOjptaWNybzo6R2V0T3B0aW9uYWxUZW5zb3JEYXRhPGludDhfdD4oCisgICAgICAgICAga2VybmVsX2NvbnRlbnQuR2V0SW50ZXJuYWxUZW5zb3IoCisgICAgICAgICAgICAgIHRmbGl0ZTo6a0xzdG1SZWN1cnJlbnRUb091dHB1dFdlaWdodHNUZW5zb3IpKTsKIAotICBjb25zdCBib29sIHVzZV9sYXllcl9ub3JtID0gKGZvcmdldF9sYXllcl9ub3JtX2NvZWZmaWNpZW50cyAhPSBudWxscHRyKTsKLSAgY29uc3QgYm9vbCB1c2VfcGVlcGhvbGUgPSAoY2VsbF90b19vdXRwdXRfd2VpZ2h0cyAhPSBudWxscHRyKTsKLSAgY29uc3QgYm9vbCB1c2VfcHJvamVjdGlvbiA9IChwcm9qZWN0aW9uX3dlaWdodHMgIT0gbnVsbHB0cik7Ci0gIGNvbnN0IGJvb2wgdXNlX2NpZmcgPSAoaW5wdXRfdG9faW5wdXRfd2VpZ2h0cyA9PSBudWxscHRyKTsKLSAgY29uc3QgYm9vbCBsc3RtX3Vuc3VwcG9ydGVkX2NvbmZpZyA9Ci0gICAgICB1c2VfbGF5ZXJfbm9ybSB8fCB1c2VfcGVlcGhvbGUgfHwgdXNlX3Byb2plY3Rpb24gfHwgdXNlX2NpZmc7Ci0gIFRGTElURV9EQ0hFQ0soIWxzdG1fdW5zdXBwb3J0ZWRfY29uZmlnKTsKKyAgaW50MzJfdCBzaXplX2RhdGEgPSBwYXJhbXNfcmVmLT5zaXplX2luZm8uaW5wdXRfZGltZW5zaW9uOworICBpbnQzMl90IHNpemVfaGlkZGVuID0gcGFyYW1zX3JlZi0+c2l6ZV9pbmZvLnN0YXRlX2RpbWVuc2lvbjsKIAotICAvLyBQcmUtY2FsY3VsYXRlIGJpYXMgKyB6ZXJvX3BvaW50ICogd2VpZ2h0LgotICBpbnQzMl90KiBpbnB1dF90b19mb3JnZXRfZWZmZWN0aXZlX2JpYXMgPSBudWxscHRyOwotICBpbnQzMl90KiByZWN1cnJlbnRfdG9fZm9yZ2V0X2VmZmVjdGl2ZV9iaWFzID0gbnVsbHB0cjsKLSAgaW50MzJfdCogaW5wdXRfdG9fY2VsbF9lZmZlY3RpdmVfYmlhcyA9IG51bGxwdHI7Ci0gIGludDMyX3QqIHJlY3VycmVudF90b19jZWxsX2VmZmVjdGl2ZV9iaWFzID0gbnVsbHB0cjsKLSAgaW50MzJfdCogaW5wdXRfdG9fb3V0cHV0X2VmZmVjdGl2ZV9iaWFzID0gbnVsbHB0cjsKLSAgaW50MzJfdCogcmVjdXJyZW50X3RvX291dHB1dF9lZmZlY3RpdmVfYmlhcyA9IG51bGxwdHI7Ci0gIGludDMyX3QqIGlucHV0X3RvX2lucHV0X2VmZmVjdGl2ZV9iaWFzID0gbnVsbHB0cjsKLSAgaW50MzJfdCogcmVjdXJyZW50X3RvX2lucHV0X2VmZmVjdGl2ZV9iaWFzID0gbnVsbHB0cjsKKyAgQmlhc1R5cGUqIGlucHV0X2RhdGFfa2VybmVsX3N1bXsKKyAgICAgIHN0YXRpY19jYXN0PEJpYXNUeXBlKj4oY29udGV4dC0+QWxsb2NhdGVQZXJzaXN0ZW50QnVmZmVyKAorICAgICAgICAgIGNvbnRleHQsIHNpemVfaGlkZGVuICogc2l6ZW9mKEJpYXNUeXBlKSkpfTsKKyAgQmlhc1R5cGUqIGZvcmdldF9kYXRhX2tlcm5lbF9zdW17CisgICAgICBzdGF0aWNfY2FzdDxCaWFzVHlwZSo+KGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlcigKKyAgICAgICAgICBjb250ZXh0LCBzaXplX2hpZGRlbiAqIHNpemVvZihCaWFzVHlwZSkpKX07CisgIEJpYXNUeXBlKiBjZWxsX2RhdGFfa2VybmVsX3N1bXsKKyAgICAgIHN0YXRpY19jYXN0PEJpYXNUeXBlKj4oY29udGV4dC0+QWxsb2NhdGVQZXJzaXN0ZW50QnVmZmVyKAorICAgICAgICAgIGNvbnRleHQsIHNpemVfaGlkZGVuICogc2l6ZW9mKEJpYXNUeXBlKSkpfTsKKyAgQmlhc1R5cGUqIG91dHB1dF9kYXRhX2tlcm5lbF9zdW17CisgICAgICBzdGF0aWNfY2FzdDxCaWFzVHlwZSo+KGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlcigKKyAgICAgICAgICBjb250ZXh0LCBzaXplX2hpZGRlbiAqIHNpemVvZihCaWFzVHlwZSkpKX07CiAKLSAgY29uc3QgaW50MzJfdCBvdXRwdXRfc3RhdGVfemVyb19wb2ludCA9Ci0gICAgICAtb3BfZGF0YS0+cGFyYW1zX2Ntc2lzX25uLm91dHB1dF9zdGF0ZV9vZmZzZXQ7Ci0gIGNvbnN0IGludDMyX3QgaW5wdXRfemVyb19wb2ludCA9IC1pbnB1dC0+cGFyYW1zLnplcm9fcG9pbnQ7CisgIEJpYXNUeXBlKiBpbnB1dF9oaWRkZW5fa2VybmVsX3N1bXsKKyAgICAgIHN0YXRpY19jYXN0PEJpYXNUeXBlKj4oY29udGV4dC0+QWxsb2NhdGVQZXJzaXN0ZW50QnVmZmVyKAorICAgICAgICAgIGNvbnRleHQsIHNpemVfaGlkZGVuICogc2l6ZW9mKEJpYXNUeXBlKSkpfTsKKyAgQmlhc1R5cGUqIGZvcmdldF9oaWRkZW5fa2VybmVsX3N1bXsKKyAgICAgIHN0YXRpY19jYXN0PEJpYXNUeXBlKj4oY29udGV4dC0+QWxsb2NhdGVQZXJzaXN0ZW50QnVmZmVyKAorICAgICAgICAgIGNvbnRleHQsIHNpemVfaGlkZGVuICogc2l6ZW9mKEJpYXNUeXBlKSkpfTsKKyAgQmlhc1R5cGUqIGNlbGxfaGlkZGVuX2tlcm5lbF9zdW0gPSB7CisgICAgICBzdGF0aWNfY2FzdDxCaWFzVHlwZSo+KGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlcigKKyAgICAgICAgICBjb250ZXh0LCBzaXplX2hpZGRlbiAqIHNpemVvZihCaWFzVHlwZSkpKX07CisgIEJpYXNUeXBlKiBvdXRwdXRfaGlkZGVuX2tlcm5lbF9zdW0gPSB7CisgICAgICBzdGF0aWNfY2FzdDxCaWFzVHlwZSo+KGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlcigKKyAgICAgICAgICBjb250ZXh0LCBzaXplX2hpZGRlbiAqIHNpemVvZihCaWFzVHlwZSkpKX07CiAKLSAgVEZfTElURV9FTlNVUkVfT0soY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgUHJlY29tcHV0ZVplcm9Qb2ludFRpbWVzV2VpZ2h0V2l0aEJpYXMoCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBpbnB1dF96ZXJvX3BvaW50LCBpbnB1dF90b19mb3JnZXRfd2VpZ2h0cywKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcmdldF9nYXRlX2JpYXMsICZpbnB1dF90b19mb3JnZXRfZWZmZWN0aXZlX2JpYXMpKTsKKyAgLy8gQ29tcHV0ZSBlZmZlY3RpdmUgYmlhc2VzCisgIENNU0lTX05OX1ZlY3RvclN1bSgKKyAgICAgIGlucHV0X2RhdGFfa2VybmVsX3N1bSwgc2l6ZV9kYXRhLCBzaXplX2hpZGRlbiwgaW5wdXRfdG9faW5wdXRfd2VpZ2h0cywKKyAgICAgIHBhcmFtc19yZWYtPmlucHV0X2dhdGVfcGFyYW1ldGVycy5pbnB1dF9mY19wYXJhbXMuaW5wdXRfb2Zmc2V0LAorICAgICAgaW5wdXRfZ2F0ZV9iaWFzKTsKIAotICBURl9MSVRFX0VOU1VSRV9PSyhjb250ZXh0LCBQcmVjb21wdXRlWmVyb1BvaW50VGltZXNXZWlnaHRXaXRoQmlhcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsIG91dHB1dF9zdGF0ZV96ZXJvX3BvaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdXJyZW50X3RvX2ZvcmdldF93ZWlnaHRzLCBudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY3VycmVudF90b19mb3JnZXRfZWZmZWN0aXZlX2JpYXMpKTsKKyAgQ01TSVNfTk5fVmVjdG9yU3VtKAorICAgICAgZm9yZ2V0X2RhdGFfa2VybmVsX3N1bSwgc2l6ZV9kYXRhLCBzaXplX2hpZGRlbiwgaW5wdXRfdG9fZm9yZ2V0X3dlaWdodHMsCisgICAgICBwYXJhbXNfcmVmLT5mb3JnZXRfZ2F0ZV9wYXJhbWV0ZXJzLmlucHV0X2ZjX3BhcmFtcy5pbnB1dF9vZmZzZXQsCisgICAgICBmb3JnZXRfZ2F0ZV9iaWFzKTsKIAotICAvLyBNb2R1bGF0aW9uIGdhdGUuCi0gIFRGX0xJVEVfRU5TVVJFX09LKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIFByZWNvbXB1dGVaZXJvUG9pbnRUaW1lc1dlaWdodFdpdGhCaWFzKAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCwgaW5wdXRfemVyb19wb2ludCwgaW5wdXRfdG9fY2VsbF93ZWlnaHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgY2VsbF9nYXRlX2JpYXMsICZpbnB1dF90b19jZWxsX2VmZmVjdGl2ZV9iaWFzKSk7Ci0gIFRGX0xJVEVfRU5TVVJFX09LKAotICAgICAgY29udGV4dCwgUHJlY29tcHV0ZVplcm9Qb2ludFRpbWVzV2VpZ2h0V2l0aEJpYXMoCi0gICAgICAgICAgICAgICAgICAgY29udGV4dCwgb3V0cHV0X3N0YXRlX3plcm9fcG9pbnQsIHJlY3VycmVudF90b19jZWxsX3dlaWdodHMsCi0gICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgJnJlY3VycmVudF90b19jZWxsX2VmZmVjdGl2ZV9iaWFzKSk7CisgIENNU0lTX05OX1ZlY3RvclN1bSgKKyAgICAgIGNlbGxfZGF0YV9rZXJuZWxfc3VtLCBzaXplX2RhdGEsIHNpemVfaGlkZGVuLCBpbnB1dF90b19jZWxsX3dlaWdodHMsCisgICAgICBwYXJhbXNfcmVmLT5jZWxsX2dhdGVfcGFyYW1ldGVycy5pbnB1dF9mY19wYXJhbXMuaW5wdXRfb2Zmc2V0LAorICAgICAgY2VsbF9nYXRlX2JpYXMpOwogCi0gIC8vIE91dHB1dCBnYXRlLgotICBURl9MSVRFX0VOU1VSRV9PSyhjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBQcmVjb21wdXRlWmVyb1BvaW50VGltZXNXZWlnaHRXaXRoQmlhcygKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGlucHV0X3plcm9fcG9pbnQsIGlucHV0X3RvX291dHB1dF93ZWlnaHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2dhdGVfYmlhcywgJmlucHV0X3RvX291dHB1dF9lZmZlY3RpdmVfYmlhcykpOworICBDTVNJU19OTl9WZWN0b3JTdW0oCisgICAgICBvdXRwdXRfZGF0YV9rZXJuZWxfc3VtLCBzaXplX2RhdGEsIHNpemVfaGlkZGVuLCBpbnB1dF90b19vdXRwdXRfd2VpZ2h0cywKKyAgICAgIHBhcmFtc19yZWYtPm91dHB1dF9nYXRlX3BhcmFtZXRlcnMuaW5wdXRfZmNfcGFyYW1zLmlucHV0X29mZnNldCwKKyAgICAgIG91dHB1dF9nYXRlX2JpYXMpOwogCi0gIFRGX0xJVEVfRU5TVVJFX09LKGNvbnRleHQsIFByZWNvbXB1dGVaZXJvUG9pbnRUaW1lc1dlaWdodFdpdGhCaWFzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCwgb3V0cHV0X3N0YXRlX3plcm9fcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWN1cnJlbnRfdG9fb3V0cHV0X3dlaWdodHMsIG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjdXJyZW50X3RvX291dHB1dF9lZmZlY3RpdmVfYmlhcykpOworICBDTVNJU19OTl9WZWN0b3JTdW0oCisgICAgICBpbnB1dF9oaWRkZW5fa2VybmVsX3N1bSwgc2l6ZV9oaWRkZW4sIHNpemVfaGlkZGVuLAorICAgICAgcmVjdXJyZW50X3RvX2lucHV0X3dlaWdodHMsCisgICAgICAtcGFyYW1zX3JlZi0+aW50ZXJfZ2F0ZV9wYXJhbWV0ZXJzLm91dHB1dF9tdWxfcGFyYW1zLm91dHB1dF9vZmZzZXQsCisgICAgICBudWxscHRyKTsKIAotICAvLyBJbnB1dCBnYXRlLiBUaGUgY2FsY3VsYXRpb24gaXMgb25seSBtZWFuaW5nZnVsIGZvciBub24tY2lmZyBjYXNlLgotICBURl9MSVRFX0VOU1VSRV9PSyhjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBQcmVjb21wdXRlWmVyb1BvaW50VGltZXNXZWlnaHRXaXRoQmlhcygKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGlucHV0X3plcm9fcG9pbnQsIGlucHV0X3RvX2lucHV0X3dlaWdodHMsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9nYXRlX2JpYXMsICZpbnB1dF90b19pbnB1dF9lZmZlY3RpdmVfYmlhcykpOwotICBURl9MSVRFX0VOU1VSRV9PSygKLSAgICAgIGNvbnRleHQsIFByZWNvbXB1dGVaZXJvUG9pbnRUaW1lc1dlaWdodFdpdGhCaWFzKAotICAgICAgICAgICAgICAgICAgIGNvbnRleHQsIG91dHB1dF9zdGF0ZV96ZXJvX3BvaW50LCByZWN1cnJlbnRfdG9faW5wdXRfd2VpZ2h0cywKLSAgICAgICAgICAgICAgICAgICBudWxscHRyLCAmcmVjdXJyZW50X3RvX2lucHV0X2VmZmVjdGl2ZV9iaWFzKSk7CisgIENNU0lTX05OX1ZlY3RvclN1bSgKKyAgICAgIGZvcmdldF9oaWRkZW5fa2VybmVsX3N1bSwgc2l6ZV9oaWRkZW4sIHNpemVfaGlkZGVuLAorICAgICAgcmVjdXJyZW50X3RvX2ZvcmdldF93ZWlnaHRzLAorICAgICAgLXBhcmFtc19yZWYtPmludGVyX2dhdGVfcGFyYW1ldGVycy5vdXRwdXRfbXVsX3BhcmFtcy5vdXRwdXRfb2Zmc2V0LAorICAgICAgbnVsbHB0cik7CiAKLSAgb3BfZGF0YS0+cGFyYW1zX2Ntc2lzX25uLmkyZl9lZmZlY3RpdmVfYmlhcyA9IGlucHV0X3RvX2ZvcmdldF9lZmZlY3RpdmVfYmlhczsKLSAgb3BfZGF0YS0+cGFyYW1zX2Ntc2lzX25uLnIyZl9lZmZlY3RpdmVfYmlhcyA9Ci0gICAgICByZWN1cnJlbnRfdG9fZm9yZ2V0X2VmZmVjdGl2ZV9iaWFzOwotICBvcF9kYXRhLT5wYXJhbXNfY21zaXNfbm4uaTJjX2VmZmVjdGl2ZV9iaWFzID0gaW5wdXRfdG9fY2VsbF9lZmZlY3RpdmVfYmlhczsKLSAgb3BfZGF0YS0+cGFyYW1zX2Ntc2lzX25uLnIyY19lZmZlY3RpdmVfYmlhcyA9Ci0gICAgICByZWN1cnJlbnRfdG9fY2VsbF9lZmZlY3RpdmVfYmlhczsKLSAgb3BfZGF0YS0+cGFyYW1zX2Ntc2lzX25uLmkyb19lZmZlY3RpdmVfYmlhcyA9IGlucHV0X3RvX291dHB1dF9lZmZlY3RpdmVfYmlhczsKLSAgb3BfZGF0YS0+cGFyYW1zX2Ntc2lzX25uLnIyb19lZmZlY3RpdmVfYmlhcyA9Ci0gICAgICByZWN1cnJlbnRfdG9fb3V0cHV0X2VmZmVjdGl2ZV9iaWFzOwotICBvcF9kYXRhLT5wYXJhbXNfY21zaXNfbm4uaTJpX2VmZmVjdGl2ZV9iaWFzID0gaW5wdXRfdG9faW5wdXRfZWZmZWN0aXZlX2JpYXM7Ci0gIG9wX2RhdGEtPnBhcmFtc19jbXNpc19ubi5yMmlfZWZmZWN0aXZlX2JpYXMgPQotICAgICAgcmVjdXJyZW50X3RvX2lucHV0X2VmZmVjdGl2ZV9iaWFzOworICBDTVNJU19OTl9WZWN0b3JTdW0oCisgICAgICBjZWxsX2hpZGRlbl9rZXJuZWxfc3VtLCBzaXplX2hpZGRlbiwgc2l6ZV9oaWRkZW4sCisgICAgICByZWN1cnJlbnRfdG9fY2VsbF93ZWlnaHRzLAorICAgICAgLXBhcmFtc19yZWYtPmludGVyX2dhdGVfcGFyYW1ldGVycy5vdXRwdXRfbXVsX3BhcmFtcy5vdXRwdXRfb2Zmc2V0LAorICAgICAgbnVsbHB0cik7CiAKLSAgLy8gR2V0IGludGVybWVkaWF0ZSBzY2FsZXMgYW5kIHplcm8gcG9pbnRzLgotICBmbG9hdCBpbnRlcm1lZGlhdGVfc2NhbGVbNV07Ci0gIGludDMyX3QgaW50ZXJtZWRpYXRlX3pwWzVdOwotICBmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkgewotICAgIC8vIFEzLjEyIGZvciBhY3RpdmF0aW9uIGZ1bmN0aW9ucy4KLSAgICBpbnRlcm1lZGlhdGVfc2NhbGVbaV0gPSBzdGQ6OnBvdygyLjBmLCAtMTIuMGYpOwotICAgIGludGVybWVkaWF0ZV96cFtpXSA9IDA7Ci0gIH0KKyAgQ01TSVNfTk5fVmVjdG9yU3VtKAorICAgICAgb3V0cHV0X2hpZGRlbl9rZXJuZWxfc3VtLCBzaXplX2hpZGRlbiwgc2l6ZV9oaWRkZW4sCisgICAgICByZWN1cnJlbnRfdG9fb3V0cHV0X3dlaWdodHMsCisgICAgICAtcGFyYW1zX3JlZi0+aW50ZXJfZ2F0ZV9wYXJhbWV0ZXJzLm91dHB1dF9tdWxfcGFyYW1zLm91dHB1dF9vZmZzZXQsCisgICAgICBudWxscHRyKTsKIAotICBNaWNyb0NvbnRleHQqIG1pY3JvX2NvbnRleHQgPSBHZXRNaWNyb0NvbnRleHQoY29udGV4dCk7Ci0gIC8vIEluIHRoZSBhYnNlbmNlIG9mIHByb2plY3Rpb24sIGhpZGRlbiBiZWNvbWVzIG90dXB1dCBhbmQgdGhpcyBpbnRlcm1lZGlhdGUKLSAgLy8gaXMgaWdub3JlZC4KLSAgVGZMaXRlVGVuc29yKiBoaWRkZW4gPSBtaWNyb19jb250ZXh0LT5BbGxvY2F0ZVRlbXBJbnRlcm1lZGlhdGVUZW5zb3Iobm9kZSwgNCk7Ci0gIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIGhpZGRlbi0+cXVhbnRpemF0aW9uLnR5cGUgIT0ga1RmTGl0ZU5vUXVhbnRpemF0aW9uKTsKLSAgYXV0byogaGlkZGVuX3BhcmFtcyA9Ci0gICAgICBzdGF0aWNfY2FzdDxUZkxpdGVBZmZpbmVRdWFudGl6YXRpb24qPihoaWRkZW4tPnF1YW50aXphdGlvbi5wYXJhbXMpOwotICBpbnRlcm1lZGlhdGVfc2NhbGVbNF0gPSBoaWRkZW5fcGFyYW1zLT5zY2FsZS0+ZGF0YVswXTsKLSAgaW50ZXJtZWRpYXRlX3pwWzRdID0gaGlkZGVuX3BhcmFtcy0+emVyb19wb2ludC0+ZGF0YVswXTsKLSAgaWYgKGhpZGRlbiAhPSBudWxscHRyKSB7Ci0gICAgbWljcm9fY29udGV4dC0+RGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3IoaGlkZGVuKTsKLSAgfQorICAvLyBDcmVhdGUgaW5wdXQgZ2F0ZSBwYXJhbWV0ZXJzCisgIGNtc2lzX25uX2xzdG1fZ2F0ZSBnYXRlX2lucHV0eworICAgICAgcGFyYW1zX3JlZi0+aW5wdXRfZ2F0ZV9wYXJhbWV0ZXJzLmlucHV0X2ZjX3BhcmFtcy5vdXRwdXRfbXVsdGlwbGllciwKKyAgICAgIHBhcmFtc19yZWYtPmlucHV0X2dhdGVfcGFyYW1ldGVycy5pbnB1dF9mY19wYXJhbXMub3V0cHV0X3NoaWZ0LAorICAgICAgaW5wdXRfdG9faW5wdXRfd2VpZ2h0cywKKyAgICAgIGlucHV0X2RhdGFfa2VybmVsX3N1bSwKKyAgICAgIHBhcmFtc19yZWYtPmlucHV0X2dhdGVfcGFyYW1ldGVycy5yZWN1cnJlbnRfZmNfcGFyYW1zLm91dHB1dF9tdWx0aXBsaWVyLAorICAgICAgcGFyYW1zX3JlZi0+aW5wdXRfZ2F0ZV9wYXJhbWV0ZXJzLnJlY3VycmVudF9mY19wYXJhbXMub3V0cHV0X3NoaWZ0LAorICAgICAgcmVjdXJyZW50X3RvX2lucHV0X3dlaWdodHMsCisgICAgICBpbnB1dF9oaWRkZW5fa2VybmVsX3N1bSwKKyAgICAgIGlucHV0X2dhdGVfYmlhcywKKyAgICAgIEFSTV9TSUdNT0lEfTsKIAotICAvLyBTY2FsZXMuCi0gIGNvbnN0IGZsb2F0IGRlZmF1bHRfc2NhbGUgPSAxLjA7Ci0gIGZsb2F0IGlucHV0X3NjYWxlID0gZGVmYXVsdF9zY2FsZTsKLSAgZmxvYXQgaW5wdXRfdG9faW5wdXRfd2VpZ2h0X3NjYWxlID0gZGVmYXVsdF9zY2FsZTsKLSAgZmxvYXQgcmVjdXJyZW50X3RvX2lucHV0X3dlaWdodF9zY2FsZSA9IGRlZmF1bHRfc2NhbGU7Ci0gIGZsb2F0IGlucHV0X3RvX2ZvcmdldF93ZWlnaHRfc2NhbGUgPSBkZWZhdWx0X3NjYWxlOwotICBmbG9hdCByZWN1cnJlbnRfdG9fZm9yZ2V0X3dlaWdodF9zY2FsZSA9IGRlZmF1bHRfc2NhbGU7Ci0gIGZsb2F0IGlucHV0X3RvX2NlbGxfd2VpZ2h0X3NjYWxlID0gZGVmYXVsdF9zY2FsZTsKLSAgZmxvYXQgcmVjdXJyZW50X3RvX2NlbGxfd2VpZ2h0X3NjYWxlID0gZGVmYXVsdF9zY2FsZTsKLSAgZmxvYXQgaW5wdXRfdG9fb3V0cHV0X3dlaWdodF9zY2FsZSA9IGRlZmF1bHRfc2NhbGU7Ci0gIGZsb2F0IHJlY3VycmVudF90b19vdXRwdXRfd2VpZ2h0X3NjYWxlID0gZGVmYXVsdF9zY2FsZTsKLSAgZmxvYXQgb3V0cHV0X3N0YXRlX3NjYWxlID0gZGVmYXVsdF9zY2FsZTsKLSAgaW50IGNlbGxfc2NhbGUgPSAxOworICAvLyBDcmVhdGUgZm9yZ2V0IGdhdGUgcGFyYW1ldGVycworICBjbXNpc19ubl9sc3RtX2dhdGUgZ2F0ZV9mb3JnZXR7CisgICAgICBwYXJhbXNfcmVmLT5mb3JnZXRfZ2F0ZV9wYXJhbWV0ZXJzLmlucHV0X2ZjX3BhcmFtcy5vdXRwdXRfbXVsdGlwbGllciwKKyAgICAgIHBhcmFtc19yZWYtPmZvcmdldF9nYXRlX3BhcmFtZXRlcnMuaW5wdXRfZmNfcGFyYW1zLm91dHB1dF9zaGlmdCwKKyAgICAgIGlucHV0X3RvX2ZvcmdldF93ZWlnaHRzLAorICAgICAgZm9yZ2V0X2RhdGFfa2VybmVsX3N1bSwKKyAgICAgIHBhcmFtc19yZWYtPmZvcmdldF9nYXRlX3BhcmFtZXRlcnMucmVjdXJyZW50X2ZjX3BhcmFtcy5vdXRwdXRfbXVsdGlwbGllciwKKyAgICAgIHBhcmFtc19yZWYtPmZvcmdldF9nYXRlX3BhcmFtZXRlcnMucmVjdXJyZW50X2ZjX3BhcmFtcy5vdXRwdXRfc2hpZnQsCisgICAgICByZWN1cnJlbnRfdG9fZm9yZ2V0X3dlaWdodHMsCisgICAgICBmb3JnZXRfaGlkZGVuX2tlcm5lbF9zdW0sCisgICAgICBmb3JnZXRfZ2F0ZV9iaWFzLAorICAgICAgQVJNX1NJR01PSUR9OwogCi0gIC8vIEVmZmVjdGl2ZSBzY2FsZXMuCi0gIGZsb2F0IGVmZmVjdGl2ZV9pbnB1dF90b19pbnB1dF9zY2FsZSA9IGRlZmF1bHRfc2NhbGU7Ci0gIGZsb2F0IGVmZmVjdGl2ZV9yZWN1cnJlbnRfdG9faW5wdXRfc2NhbGUgPSBkZWZhdWx0X3NjYWxlOwotICBmbG9hdCBlZmZlY3RpdmVfY2VsbF90b19pbnB1dF9zY2FsZSA9IGRlZmF1bHRfc2NhbGU7Ci0gIGZsb2F0IGVmZmVjdGl2ZV9pbnB1dF90b19mb3JnZXRfc2NhbGUgPSBkZWZhdWx0X3NjYWxlOwotICBmbG9hdCBlZmZlY3RpdmVfcmVjdXJyZW50X3RvX2ZvcmdldF9zY2FsZSA9IGRlZmF1bHRfc2NhbGU7Ci0gIGZsb2F0IGVmZmVjdGl2ZV9jZWxsX3RvX2ZvcmdldF9zY2FsZSA9IGRlZmF1bHRfc2NhbGU7Ci0gIGZsb2F0IGVmZmVjdGl2ZV9pbnB1dF90b19jZWxsX3NjYWxlID0gZGVmYXVsdF9zY2FsZTsKLSAgZmxvYXQgZWZmZWN0aXZlX3JlY3VycmVudF90b19jZWxsX3NjYWxlID0gZGVmYXVsdF9zY2FsZTsKLSAgZmxvYXQgZWZmZWN0aXZlX2lucHV0X3RvX291dHB1dF9zY2FsZSA9IGRlZmF1bHRfc2NhbGU7Ci0gIGZsb2F0IGVmZmVjdGl2ZV9yZWN1cnJlbnRfdG9fb3V0cHV0X3NjYWxlID0gZGVmYXVsdF9zY2FsZTsKLSAgZmxvYXQgZWZmZWN0aXZlX2NlbGxfdG9fb3V0cHV0X3NjYWxlID0gZGVmYXVsdF9zY2FsZTsKLSAgZmxvYXQgZWZmZWN0aXZlX2hpZGRlbl9zY2FsZSA9IGRlZmF1bHRfc2NhbGU7CisgIGF1dG8gY2VsbF9nYXRlX25vbmxpbmVhcl90eXBlID0KKyAgICAgIChwYXJhbXNfcmVmLT5jZWxsX2dhdGVfbm9ubGluZWFyX3R5cGUgPT0ga1RmTGl0ZUFjdFRhbmgpID8gQVJNX1RBTkgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVJNX1NJR01PSUQ7CisgIC8vIENyZWF0ZSBjZWxsIGdhdGUgcGFyYW1ldGVycworICBjbXNpc19ubl9sc3RtX2dhdGUgZ2F0ZV9jZWxseworICAgICAgcGFyYW1zX3JlZi0+Y2VsbF9nYXRlX3BhcmFtZXRlcnMuaW5wdXRfZmNfcGFyYW1zLm91dHB1dF9tdWx0aXBsaWVyLAorICAgICAgcGFyYW1zX3JlZi0+Y2VsbF9nYXRlX3BhcmFtZXRlcnMuaW5wdXRfZmNfcGFyYW1zLm91dHB1dF9zaGlmdCwKKyAgICAgIGlucHV0X3RvX2NlbGxfd2VpZ2h0cywKKyAgICAgIGNlbGxfZGF0YV9rZXJuZWxfc3VtLAorICAgICAgcGFyYW1zX3JlZi0+Y2VsbF9nYXRlX3BhcmFtZXRlcnMucmVjdXJyZW50X2ZjX3BhcmFtcy5vdXRwdXRfbXVsdGlwbGllciwKKyAgICAgIHBhcmFtc19yZWYtPmNlbGxfZ2F0ZV9wYXJhbWV0ZXJzLnJlY3VycmVudF9mY19wYXJhbXMub3V0cHV0X3NoaWZ0LAorICAgICAgcmVjdXJyZW50X3RvX2NlbGxfd2VpZ2h0cywKKyAgICAgIGNlbGxfaGlkZGVuX2tlcm5lbF9zdW0sCisgICAgICBjZWxsX2dhdGVfYmlhcywKKyAgICAgIGNlbGxfZ2F0ZV9ub25saW5lYXJfdHlwZX07CiAKLSAgLy8gUG9wdWxhdGUgc2NhbGVzLgotICBpbnB1dF90b19pbnB1dF93ZWlnaHRfc2NhbGUgPSBpbnB1dF90b19pbnB1dF93ZWlnaHRzLT5wYXJhbXMuc2NhbGU7Ci0gIHJlY3VycmVudF90b19pbnB1dF93ZWlnaHRfc2NhbGUgPSByZWN1cnJlbnRfdG9faW5wdXRfd2VpZ2h0cy0+cGFyYW1zLnNjYWxlOworICAvLyBDcmVhdGUgb3V0cHV0IGdhdGUgcGFyYW1ldGVycworICBjbXNpc19ubl9sc3RtX2dhdGUgZ2F0ZV9vdXRwdXR7CisgICAgICBwYXJhbXNfcmVmLT5vdXRwdXRfZ2F0ZV9wYXJhbWV0ZXJzLmlucHV0X2ZjX3BhcmFtcy5vdXRwdXRfbXVsdGlwbGllciwKKyAgICAgIHBhcmFtc19yZWYtPm91dHB1dF9nYXRlX3BhcmFtZXRlcnMuaW5wdXRfZmNfcGFyYW1zLm91dHB1dF9zaGlmdCwKKyAgICAgIGlucHV0X3RvX291dHB1dF93ZWlnaHRzLAorICAgICAgb3V0cHV0X2RhdGFfa2VybmVsX3N1bSwKKyAgICAgIHBhcmFtc19yZWYtPm91dHB1dF9nYXRlX3BhcmFtZXRlcnMucmVjdXJyZW50X2ZjX3BhcmFtcy5vdXRwdXRfbXVsdGlwbGllciwKKyAgICAgIHBhcmFtc19yZWYtPm91dHB1dF9nYXRlX3BhcmFtZXRlcnMucmVjdXJyZW50X2ZjX3BhcmFtcy5vdXRwdXRfc2hpZnQsCisgICAgICByZWN1cnJlbnRfdG9fb3V0cHV0X3dlaWdodHMsCisgICAgICBvdXRwdXRfaGlkZGVuX2tlcm5lbF9zdW0sCisgICAgICBvdXRwdXRfZ2F0ZV9iaWFzLAorICAgICAgQVJNX1NJR01PSUR9OwogCi0gIG91dHB1dF9zdGF0ZV9zY2FsZSA9IG91dHB1dF9zdGF0ZS0+cGFyYW1zLnNjYWxlOwotCi0gIGlucHV0X3RvX2ZvcmdldF93ZWlnaHRfc2NhbGUgPSBpbnB1dF90b19mb3JnZXRfd2VpZ2h0cy0+cGFyYW1zLnNjYWxlOwotICBpbnB1dF90b19jZWxsX3dlaWdodF9zY2FsZSA9IGlucHV0X3RvX2NlbGxfd2VpZ2h0cy0+cGFyYW1zLnNjYWxlOwotICBpbnB1dF90b19vdXRwdXRfd2VpZ2h0X3NjYWxlID0gaW5wdXRfdG9fb3V0cHV0X3dlaWdodHMtPnBhcmFtcy5zY2FsZTsKLSAgcmVjdXJyZW50X3RvX2ZvcmdldF93ZWlnaHRfc2NhbGUgPSByZWN1cnJlbnRfdG9fZm9yZ2V0X3dlaWdodHMtPnBhcmFtcy5zY2FsZTsKLSAgcmVjdXJyZW50X3RvX2NlbGxfd2VpZ2h0X3NjYWxlID0gcmVjdXJyZW50X3RvX2NlbGxfd2VpZ2h0cy0+cGFyYW1zLnNjYWxlOwotICByZWN1cnJlbnRfdG9fb3V0cHV0X3dlaWdodF9zY2FsZSA9IHJlY3VycmVudF90b19vdXRwdXRfd2VpZ2h0cy0+cGFyYW1zLnNjYWxlOwotCi0gIC8vIENoZWNrIGNlbGwgc3RhdGUgKGFscmVhZHkgdXNlZCBhYm92ZSkKLSAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgQ2hlY2tlZExvZzIoY2VsbF9zdGF0ZS0+cGFyYW1zLnNjYWxlLCAmY2VsbF9zY2FsZSkpOwotICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCBjZWxsX3NjYWxlIDw9IC05KTsKLQotICBvcF9kYXRhLT5wYXJhbXNfY21zaXNfbm4uY2VsbF9zdGF0ZV9zaGlmdCA9IGNlbGxfc2NhbGU7Ci0gIGlucHV0X3NjYWxlID0gaW5wdXQtPnBhcmFtcy5zY2FsZTsKLQotICAvLyBDYWxjdWxhdGUgZWZmZWN0aXZlIHNjYWxlcy4KLSAgZWZmZWN0aXZlX2lucHV0X3RvX2lucHV0X3NjYWxlID0KLSAgICAgIGlucHV0X3RvX2lucHV0X3dlaWdodF9zY2FsZSAqIGlucHV0X3NjYWxlIC8gaW50ZXJtZWRpYXRlX3NjYWxlWzBdOwotICBlZmZlY3RpdmVfcmVjdXJyZW50X3RvX2lucHV0X3NjYWxlID0gcmVjdXJyZW50X3RvX2lucHV0X3dlaWdodF9zY2FsZSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfc3RhdGVfc2NhbGUgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlX3NjYWxlWzBdOwotCi0gIGVmZmVjdGl2ZV9pbnB1dF90b19mb3JnZXRfc2NhbGUgPQotICAgICAgaW5wdXRfdG9fZm9yZ2V0X3dlaWdodF9zY2FsZSAqIGlucHV0X3NjYWxlIC8gaW50ZXJtZWRpYXRlX3NjYWxlWzFdOwotICBlZmZlY3RpdmVfcmVjdXJyZW50X3RvX2ZvcmdldF9zY2FsZSA9IHJlY3VycmVudF90b19mb3JnZXRfd2VpZ2h0X3NjYWxlICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfc3RhdGVfc2NhbGUgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybWVkaWF0ZV9zY2FsZVsxXTsKLQotICBlZmZlY3RpdmVfaW5wdXRfdG9fY2VsbF9zY2FsZSA9Ci0gICAgICBpbnB1dF90b19jZWxsX3dlaWdodF9zY2FsZSAqIGlucHV0X3NjYWxlIC8gaW50ZXJtZWRpYXRlX3NjYWxlWzJdOwotICBlZmZlY3RpdmVfcmVjdXJyZW50X3RvX2NlbGxfc2NhbGUgPSByZWN1cnJlbnRfdG9fY2VsbF93ZWlnaHRfc2NhbGUgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfc3RhdGVfc2NhbGUgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm1lZGlhdGVfc2NhbGVbMl07Ci0KLSAgZWZmZWN0aXZlX2lucHV0X3RvX291dHB1dF9zY2FsZSA9Ci0gICAgICBpbnB1dF90b19vdXRwdXRfd2VpZ2h0X3NjYWxlICogaW5wdXRfc2NhbGUgLyBpbnRlcm1lZGlhdGVfc2NhbGVbM107Ci0gIGVmZmVjdGl2ZV9yZWN1cnJlbnRfdG9fb3V0cHV0X3NjYWxlID0gcmVjdXJyZW50X3RvX291dHB1dF93ZWlnaHRfc2NhbGUgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9zdGF0ZV9zY2FsZSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlX3NjYWxlWzNdOwotCi0gIGVmZmVjdGl2ZV9oaWRkZW5fc2NhbGUgPQotICAgICAgc3RkOjpwb3coMi4wZiwgLTE1LjBmKSAvIGludGVybWVkaWF0ZV9zY2FsZVs0XSAqIHN0ZDo6cG93KDIuMGYsIC0xNS4wZik7Ci0KLSAgLy8gRGVjb21wb3NlIHNjYWxlcy4KLSAgaW50IHNoaWZ0X291dHB1dDsKLSAgUXVhbnRpemVNdWx0aXBsaWVyKAotICAgICAgc3RhdGljX2Nhc3Q8ZG91YmxlPihlZmZlY3RpdmVfaW5wdXRfdG9faW5wdXRfc2NhbGUpLAotICAgICAgJm9wX2RhdGEtPnBhcmFtc19jbXNpc19ubi5pbnB1dF90b19pbnB1dF9zY2FsaW5nLm11bHRpcGxpZXIsCi0gICAgICAmc2hpZnRfb3V0cHV0KTsKLSAgb3BfZGF0YS0+cGFyYW1zX2Ntc2lzX25uLmlucHV0X3RvX2lucHV0X3NjYWxpbmcuc2hpZnQgPQotICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oc2hpZnRfb3V0cHV0KTsKLQotICBRdWFudGl6ZU11bHRpcGxpZXIoCi0gICAgICBzdGF0aWNfY2FzdDxkb3VibGU+KGVmZmVjdGl2ZV9yZWN1cnJlbnRfdG9faW5wdXRfc2NhbGUpLAotICAgICAgJm9wX2RhdGEtPnBhcmFtc19jbXNpc19ubi5yZWN1cnJlbnRfdG9faW5wdXRfc2NhbGluZy5tdWx0aXBsaWVyLAotICAgICAgJnNoaWZ0X291dHB1dCk7Ci0gIG9wX2RhdGEtPnBhcmFtc19jbXNpc19ubi5yZWN1cnJlbnRfdG9faW5wdXRfc2NhbGluZy5zaGlmdCA9Ci0gICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihzaGlmdF9vdXRwdXQpOwotICBRdWFudGl6ZU11bHRpcGxpZXIoc3RhdGljX2Nhc3Q8ZG91YmxlPihlZmZlY3RpdmVfY2VsbF90b19pbnB1dF9zY2FsZSksCi0gICAgICAgICAgICAgICAgICAgICAmb3BfZGF0YS0+cGFyYW1zX2Ntc2lzX25uLmNlbGxfdG9faW5wdXRfc2NhbGluZy5tdWx0aXBsaWVyLAotICAgICAgICAgICAgICAgICAgICAgJnNoaWZ0X291dHB1dCk7Ci0gIG9wX2RhdGEtPnBhcmFtc19jbXNpc19ubi5jZWxsX3RvX2lucHV0X3NjYWxpbmcuc2hpZnQgPQotICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oc2hpZnRfb3V0cHV0KTsKLSAgUXVhbnRpemVNdWx0aXBsaWVyKAotICAgICAgc3RhdGljX2Nhc3Q8ZG91YmxlPihlZmZlY3RpdmVfaW5wdXRfdG9fZm9yZ2V0X3NjYWxlKSwKLSAgICAgICZvcF9kYXRhLT5wYXJhbXNfY21zaXNfbm4uaW5wdXRfdG9fZm9yZ2V0X3NjYWxpbmcubXVsdGlwbGllciwKLSAgICAgICZzaGlmdF9vdXRwdXQpOwotICBvcF9kYXRhLT5wYXJhbXNfY21zaXNfbm4uaW5wdXRfdG9fZm9yZ2V0X3NjYWxpbmcuc2hpZnQgPQotICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oc2hpZnRfb3V0cHV0KTsKLSAgUXVhbnRpemVNdWx0aXBsaWVyKAotICAgICAgc3RhdGljX2Nhc3Q8ZG91YmxlPihlZmZlY3RpdmVfcmVjdXJyZW50X3RvX2ZvcmdldF9zY2FsZSksCi0gICAgICAmb3BfZGF0YS0+cGFyYW1zX2Ntc2lzX25uLnJlY3VycmVudF90b19mb3JnZXRfc2NhbGluZy5tdWx0aXBsaWVyLAotICAgICAgJnNoaWZ0X291dHB1dCk7Ci0gIG9wX2RhdGEtPnBhcmFtc19jbXNpc19ubi5yZWN1cnJlbnRfdG9fZm9yZ2V0X3NjYWxpbmcuc2hpZnQgPQotICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oc2hpZnRfb3V0cHV0KTsKLSAgUXVhbnRpemVNdWx0aXBsaWVyKAotICAgICAgc3RhdGljX2Nhc3Q8ZG91YmxlPihlZmZlY3RpdmVfY2VsbF90b19mb3JnZXRfc2NhbGUpLAotICAgICAgJm9wX2RhdGEtPnBhcmFtc19jbXNpc19ubi5jZWxsX3RvX2ZvcmdldF9zY2FsaW5nLm11bHRpcGxpZXIsCi0gICAgICAmc2hpZnRfb3V0cHV0KTsKLSAgLy8gb2sKLSAgb3BfZGF0YS0+cGFyYW1zX2Ntc2lzX25uLmNlbGxfdG9fZm9yZ2V0X3NjYWxpbmcuc2hpZnQgPQotICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oc2hpZnRfb3V0cHV0KTsKLSAgUXVhbnRpemVNdWx0aXBsaWVyKHN0YXRpY19jYXN0PGRvdWJsZT4oZWZmZWN0aXZlX2lucHV0X3RvX2NlbGxfc2NhbGUpLAotICAgICAgICAgICAgICAgICAgICAgJm9wX2RhdGEtPnBhcmFtc19jbXNpc19ubi5pbnB1dF90b19jZWxsX3NjYWxpbmcubXVsdGlwbGllciwKLSAgICAgICAgICAgICAgICAgICAgICZzaGlmdF9vdXRwdXQpOwotICBvcF9kYXRhLT5wYXJhbXNfY21zaXNfbm4uaW5wdXRfdG9fY2VsbF9zY2FsaW5nLnNoaWZ0ID0KLSAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHNoaWZ0X291dHB1dCk7Ci0gIFF1YW50aXplTXVsdGlwbGllcigKLSAgICAgIHN0YXRpY19jYXN0PGRvdWJsZT4oZWZmZWN0aXZlX3JlY3VycmVudF90b19jZWxsX3NjYWxlKSwKLSAgICAgICZvcF9kYXRhLT5wYXJhbXNfY21zaXNfbm4ucmVjdXJyZW50X3RvX2NlbGxfc2NhbGluZy5tdWx0aXBsaWVyLAotICAgICAgJnNoaWZ0X291dHB1dCk7Ci0gIG9wX2RhdGEtPnBhcmFtc19jbXNpc19ubi5yZWN1cnJlbnRfdG9fY2VsbF9zY2FsaW5nLnNoaWZ0ID0KLSAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHNoaWZ0X291dHB1dCk7Ci0gIFF1YW50aXplTXVsdGlwbGllcigKLSAgICAgIHN0YXRpY19jYXN0PGRvdWJsZT4oZWZmZWN0aXZlX2lucHV0X3RvX291dHB1dF9zY2FsZSksCi0gICAgICAmb3BfZGF0YS0+cGFyYW1zX2Ntc2lzX25uLmlucHV0X3RvX291dHB1dF9zY2FsaW5nLm11bHRpcGxpZXIsCi0gICAgICAmc2hpZnRfb3V0cHV0KTsKLSAgb3BfZGF0YS0+cGFyYW1zX2Ntc2lzX25uLmlucHV0X3RvX291dHB1dF9zY2FsaW5nLnNoaWZ0ID0KLSAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHNoaWZ0X291dHB1dCk7Ci0gIFF1YW50aXplTXVsdGlwbGllcigKLSAgICAgIHN0YXRpY19jYXN0PGRvdWJsZT4oZWZmZWN0aXZlX3JlY3VycmVudF90b19vdXRwdXRfc2NhbGUpLAotICAgICAgJm9wX2RhdGEtPnBhcmFtc19jbXNpc19ubi5yZWN1cnJlbnRfdG9fb3V0cHV0X3NjYWxpbmcubXVsdGlwbGllciwKLSAgICAgICZzaGlmdF9vdXRwdXQpOwotICBvcF9kYXRhLT5wYXJhbXNfY21zaXNfbm4ucmVjdXJyZW50X3RvX291dHB1dF9zY2FsaW5nLnNoaWZ0ID0KLSAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHNoaWZ0X291dHB1dCk7Ci0gIFF1YW50aXplTXVsdGlwbGllcigKLSAgICAgIHN0YXRpY19jYXN0PGRvdWJsZT4oZWZmZWN0aXZlX2NlbGxfdG9fb3V0cHV0X3NjYWxlKSwKLSAgICAgICZvcF9kYXRhLT5wYXJhbXNfY21zaXNfbm4uY2VsbF90b19vdXRwdXRfc2NhbGluZy5tdWx0aXBsaWVyLAotICAgICAgJnNoaWZ0X291dHB1dCk7Ci0gIG9wX2RhdGEtPnBhcmFtc19jbXNpc19ubi5jZWxsX3RvX291dHB1dF9zY2FsaW5nLnNoaWZ0ID0KLSAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHNoaWZ0X291dHB1dCk7Ci0KLSAgb3BfZGF0YS0+cGFyYW1zX2Ntc2lzX25uLnByb2plY3Rpb25fc2NhbGluZy5zaGlmdCA9Ci0gICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihzaGlmdF9vdXRwdXQpOwotCi0gIFF1YW50aXplTXVsdGlwbGllcihzdGF0aWNfY2FzdDxkb3VibGU+KGVmZmVjdGl2ZV9oaWRkZW5fc2NhbGUpLAotICAgICAgICAgICAgICAgICAgICAgJm9wX2RhdGEtPnBhcmFtc19jbXNpc19ubi5oaWRkZW5fc2NhbGluZy5tdWx0aXBsaWVyLAotICAgICAgICAgICAgICAgICAgICAgJnNoaWZ0X291dHB1dCk7Ci0gIG9wX2RhdGEtPnBhcmFtc19jbXNpc19ubi5oaWRkZW5fc2NhbGluZy5zaGlmdCA9Ci0gICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihzaGlmdF9vdXRwdXQpOwotCi0gIG9wX2RhdGEtPnBhcmFtc19jbXNpc19ubi5oaWRkZW5fb2Zmc2V0ID0gaW50ZXJtZWRpYXRlX3pwWzRdOwotCi0gIG9wX2RhdGEtPnBhcmFtc19jbXNpc19ubi5hY3RpdmF0aW9uLm1pbiA9IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50MTZfdD46Om1pbigpOwotICBvcF9kYXRhLT5wYXJhbXNfY21zaXNfbm4uYWN0aXZhdGlvbi5tYXggPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptYXgoKTsKKyAgLy8gQ3JlYXRlIHRoZSBjb21wbGV0ZSBsc3RtIGRhdGEgc3RydWN0CisgICpwYXJhbXNfY21zaXNfbm4gPSB7CisgICAgICBwYXJhbXNfcmVmLT5zaXplX2luZm8udGltZV9tYWpvciwKKyAgICAgIHBhcmFtc19yZWYtPnNpemVfaW5mby5iYXRjaF9zaXplLAorICAgICAgcGFyYW1zX3JlZi0+c2l6ZV9pbmZvLnRpbWVfc3RlcHMsCisgICAgICBwYXJhbXNfcmVmLT5zaXplX2luZm8uaW5wdXRfZGltZW5zaW9uLAorICAgICAgcGFyYW1zX3JlZi0+c2l6ZV9pbmZvLnN0YXRlX2RpbWVuc2lvbiwKKyAgICAgIHBhcmFtc19yZWYtPmZvcmdldF9nYXRlX3BhcmFtZXRlcnMuaW5wdXRfZmNfcGFyYW1zLmlucHV0X29mZnNldCwKKyAgICAgIHBhcmFtc19yZWYtPmludGVyX2dhdGVfcGFyYW1ldGVycy5mb3JnZXRfY2VsbF9tdWxfcGFyYW1zCisgICAgICAgICAgLm91dHB1dF9tdWx0aXBsaWVyLAorICAgICAgcGFyYW1zX3JlZi0+aW50ZXJfZ2F0ZV9wYXJhbWV0ZXJzLmZvcmdldF9jZWxsX211bF9wYXJhbXMub3V0cHV0X3NoaWZ0LAorICAgICAgcGFyYW1zX3JlZi0+aW50ZXJfZ2F0ZV9wYXJhbWV0ZXJzLmlucHV0X211bF9wYXJhbXMub3V0cHV0X211bHRpcGxpZXIsCisgICAgICBwYXJhbXNfcmVmLT5pbnRlcl9nYXRlX3BhcmFtZXRlcnMuaW5wdXRfbXVsX3BhcmFtcy5vdXRwdXRfc2hpZnQsCisgICAgICBwYXJhbXNfcmVmLT5jZWxsX3N0YXRlX2luZm8ucXVhbnRpemVkX2NlbGxfY2xpcCwKKyAgICAgIHBhcmFtc19yZWYtPmNlbGxfc3RhdGVfaW5mby5jZWxsX3N0YXRlX3NjYWxlX3Bvd2VyLAorICAgICAgcGFyYW1zX3JlZi0+aW50ZXJfZ2F0ZV9wYXJhbWV0ZXJzLm91dHB1dF9tdWxfcGFyYW1zLm91dHB1dF9tdWx0aXBsaWVyLAorICAgICAgcGFyYW1zX3JlZi0+aW50ZXJfZ2F0ZV9wYXJhbWV0ZXJzLm91dHB1dF9tdWxfcGFyYW1zLm91dHB1dF9zaGlmdCwKKyAgICAgIHBhcmFtc19yZWYtPmludGVyX2dhdGVfcGFyYW1ldGVycy5vdXRwdXRfbXVsX3BhcmFtcy5vdXRwdXRfb2Zmc2V0LAorICAgICAgZ2F0ZV9mb3JnZXQsCisgICAgICBnYXRlX2lucHV0LAorICAgICAgZ2F0ZV9jZWxsLAorICAgICAgZ2F0ZV9vdXRwdXR9OwogCiAgIHJldHVybiBrVGZMaXRlT2s7CiB9CiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBDZWxsVHlwZT4KIFRmTGl0ZVN0YXR1cyBDTVNJU19OTl9FdmFsSW50ZWdlcjh4OF8xNkxzdG0oCiAgICAgY29uc3QgT3BEYXRhJiBvcF9kYXRhLCBjb25zdCBMU1RNS2VybmVsQ29udGVudHMmIGtlcm5lbF9jb250ZW50LAotICAgIGNvbnN0IExTVE1CdWZmZXJzPENlbGxUeXBlPiYgYnVmZmVycykgewotICBjb25zdCBPcERhdGFMU1RNJiBvcF9kYXRhX2xzdG0gPSBvcF9kYXRhLnBhcmFtc19yZWY7Ci0gIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0ID0KLSAgICAgIGtlcm5lbF9jb250ZW50LkdldEludGVybmFsVGVuc29yKHRmbGl0ZTo6a0xzdG1JbnB1dFRlbnNvcik7Ci0gIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0X2dhdGVfYmlhcyA9Ci0gICAgICBrZXJuZWxfY29udGVudC5HZXRJbnRlcm5hbFRlbnNvcih0ZmxpdGU6OmtMc3RtSW5wdXRHYXRlQmlhc1RlbnNvcik7Ci0gIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGZvcmdldF9nYXRlX2JpYXMgPQotICAgICAga2VybmVsX2NvbnRlbnQuR2V0SW50ZXJuYWxUZW5zb3IodGZsaXRlOjprTHN0bUZvcmdldEdhdGVCaWFzVGVuc29yKTsKLSAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogY2VsbF9nYXRlX2JpYXMgPQotICAgICAga2VybmVsX2NvbnRlbnQuR2V0SW50ZXJuYWxUZW5zb3IodGZsaXRlOjprTHN0bUNlbGxHYXRlQmlhc1RlbnNvcik7Ci0gIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dF9nYXRlX2JpYXMgPQotICAgICAga2VybmVsX2NvbnRlbnQuR2V0SW50ZXJuYWxUZW5zb3IodGZsaXRlOjprTHN0bU91dHB1dEdhdGVCaWFzVGVuc29yKTsKLSAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXRfdG9fb3V0cHV0X3dlaWdodHMgPQotICAgICAga2VybmVsX2NvbnRlbnQuR2V0SW50ZXJuYWxUZW5zb3IodGZsaXRlOjprTHN0bUlucHV0VG9PdXRwdXRXZWlnaHRzVGVuc29yKTsKLSAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogcmVjdXJyZW50X3RvX291dHB1dF93ZWlnaHRzID0KLSAgICAgIGtlcm5lbF9jb250ZW50LkdldEludGVybmFsVGVuc29yKAotICAgICAgICAgIHRmbGl0ZTo6a0xzdG1SZWN1cnJlbnRUb091dHB1dFdlaWdodHNUZW5zb3IpOwotICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dF90b19pbnB1dF93ZWlnaHRzID0KLSAgICAgIGtlcm5lbF9jb250ZW50LkdldEludGVybmFsVGVuc29yKHRmbGl0ZTo6a0xzdG1JbnB1dFRvSW5wdXRXZWlnaHRzVGVuc29yKTsKLSAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXRfdG9fZm9yZ2V0X3dlaWdodHMgPQotICAgICAga2VybmVsX2NvbnRlbnQuR2V0SW50ZXJuYWxUZW5zb3IodGZsaXRlOjprTHN0bUlucHV0VG9Gb3JnZXRXZWlnaHRzVGVuc29yKTsKLSAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXRfdG9fY2VsbF93ZWlnaHRzID0KLSAgICAgIGtlcm5lbF9jb250ZW50LkdldEludGVybmFsVGVuc29yKHRmbGl0ZTo6a0xzdG1JbnB1dFRvQ2VsbFdlaWdodHNUZW5zb3IpOwotICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiByZWN1cnJlbnRfdG9faW5wdXRfd2VpZ2h0cyA9Ci0gICAgICBrZXJuZWxfY29udGVudC5HZXRJbnRlcm5hbFRlbnNvcigKLSAgICAgICAgICB0ZmxpdGU6OmtMc3RtUmVjdXJyZW50VG9JbnB1dFdlaWdodHNUZW5zb3IpOwotICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiByZWN1cnJlbnRfdG9fZm9yZ2V0X3dlaWdodHMgPQotICAgICAga2VybmVsX2NvbnRlbnQuR2V0SW50ZXJuYWxUZW5zb3IoCi0gICAgICAgICAgdGZsaXRlOjprTHN0bVJlY3VycmVudFRvRm9yZ2V0V2VpZ2h0c1RlbnNvcik7Ci0gIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIHJlY3VycmVudF90b19jZWxsX3dlaWdodHMgPQotICAgICAga2VybmVsX2NvbnRlbnQuR2V0SW50ZXJuYWxUZW5zb3IoCi0gICAgICAgICAgdGZsaXRlOjprTHN0bVJlY3VycmVudFRvQ2VsbFdlaWdodHNUZW5zb3IpOwotICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBjZWxsX3RvX2lucHV0X3dlaWdodHMgPQotICAgICAga2VybmVsX2NvbnRlbnQuR2V0SW50ZXJuYWxUZW5zb3IodGZsaXRlOjprTHN0bUNlbGxUb0lucHV0V2VpZ2h0c1RlbnNvcik7Ci0gIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGNlbGxfdG9fZm9yZ2V0X3dlaWdodHMgPQotICAgICAga2VybmVsX2NvbnRlbnQuR2V0SW50ZXJuYWxUZW5zb3IodGZsaXRlOjprTHN0bUNlbGxUb0ZvcmdldFdlaWdodHNUZW5zb3IpOwotICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBjZWxsX3RvX291dHB1dF93ZWlnaHRzID0KLSAgICAgIGtlcm5lbF9jb250ZW50LkdldEludGVybmFsVGVuc29yKHRmbGl0ZTo6a0xzdG1DZWxsVG9PdXRwdXRXZWlnaHRzVGVuc29yKTsKLSAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogY2VsbF9zdGF0ZSA9Ci0gICAgICBrZXJuZWxfY29udGVudC5HZXRJbnRlcm5hbFRlbnNvcih0ZmxpdGU6OmtMc3RtQ2VsbFN0YXRlVGVuc29yKTsKLSAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogb3V0cHV0X3N0YXRlID0KLSAgICAgIGtlcm5lbF9jb250ZW50LkdldEludGVybmFsVGVuc29yKHRmbGl0ZTo6a0xzdG1PdXRwdXRTdGF0ZVRlbnNvcik7Ci0gIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dCA9IGtlcm5lbF9jb250ZW50Lm91dHB1dF90ZW5zb3I7CisgICAgY29uc3QgTFNUTUJ1ZmZlcnM8aW50MTZfdD4mIGJ1ZmZlcnMpIHsKKyAgVEZMSVRFX0RDSEVDSygKKyAgICAgIGtlcm5lbF9jb250ZW50LkdldEludGVybmFsVGVuc29yKHRmbGl0ZTo6a0xzdG1JbnB1dFRlbnNvciktPmRpbXMtPnNpemUgPj0KKyAgICAgICAgICAyICYmCisgICAgICBrZXJuZWxfY29udGVudC5HZXRJbnRlcm5hbFRlbnNvcih0ZmxpdGU6OmtMc3RtSW5wdXRUZW5zb3IpLT5kaW1zLT5zaXplIDw9CisgICAgICAgICAgMyk7CiAKLSAgVEZMSVRFX0RDSEVDSyhpbnB1dC0+ZGltcy0+c2l6ZSA+PSAyICYmIGlucHV0LT5kaW1zLT5zaXplIDw9IDMpOworICBjb25zdCBpbnQ4X3QqIGlucHV0ID0gdGZsaXRlOjptaWNybzo6R2V0T3B0aW9uYWxUZW5zb3JEYXRhPGludDhfdD4oCisgICAgICBrZXJuZWxfY29udGVudC5HZXRJbnRlcm5hbFRlbnNvcih0ZmxpdGU6OmtMc3RtSW5wdXRUZW5zb3IpKTsKKyAgaW50OF90KiBvdXRwdXQgPQorICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KGtlcm5lbF9jb250ZW50Lm91dHB1dF90ZW5zb3IpOwogCi0gIGNtc2lzX25uX2xzdG1fY29udGV4dCBzY3JhdGNoX2J1ZmZlcnM7Ci0gIHNjcmF0Y2hfYnVmZmVycy5pbnB1dF9nYXRlID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4oYnVmZmVycy5idWZmZXIwKTsKLSAgc2NyYXRjaF9idWZmZXJzLmZvcmdldF9nYXRlID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4oYnVmZmVycy5idWZmZXIxKTsKLSAgc2NyYXRjaF9idWZmZXJzLmNlbGxfZ2F0ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCo+KGJ1ZmZlcnMuYnVmZmVyMik7Ci0gIHNjcmF0Y2hfYnVmZmVycy5vdXRwdXRfZ2F0ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCo+KGJ1ZmZlcnMuYnVmZmVyMyk7CisgIC8vIENyZWF0ZSBsc3RtIGJ1ZmZlciBzdHJ1Y3QKKyAgY21zaXNfbm5fbHN0bV9jb250ZXh0IGNtc2lzX2J1ZmZlcnM7CisgIGNtc2lzX2J1ZmZlcnMudGVtcDEgPSByZWludGVycHJldF9jYXN0PGludDE2X3QqPihidWZmZXJzLmJ1ZmZlcjApOworICBjbXNpc19idWZmZXJzLnRlbXAyID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4oYnVmZmVycy5idWZmZXIxKTsKKyAgY21zaXNfYnVmZmVycy5jZWxsX3N0YXRlID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4oYnVmZmVycy5idWZmZXIyKTsKIAotICBjbXNpc19ubl9sc3RtX3BhcmFtcyBjbXNpc19sc3RtX3BhcmFtcyA9IG9wX2RhdGEucGFyYW1zX2Ntc2lzX25uOwotICBjbXNpc19sc3RtX3BhcmFtcy50aW1lX21ham9yID0gb3BfZGF0YV9sc3RtLnNpemVfaW5mby50aW1lX21ham9yOwotICBjbXNpc19sc3RtX3BhcmFtcy5jbGlwLmNlbGwgPQotICAgICAgb3BfZGF0YV9sc3RtLmNlbGxfc3RhdGVfaW5mby5xdWFudGl6ZWRfY2VsbF9jbGlwOworICBhcm1fbHN0bV91bmlkaXJlY3Rpb25hbF9zOChpbnB1dCwgb3V0cHV0LCAmb3BfZGF0YS5wYXJhbXNfY21zaXNfbm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbXNpc19idWZmZXJzKTsKIAotICBjbXNpc19sc3RtX3BhcmFtcy5pbnB1dF9nYXRlX2JpYXMgPSBjb25zdF9jYXN0PGludDMyX3QqPigKLSAgICAgIHRmbGl0ZTo6bWljcm86OkdldE9wdGlvbmFsVGVuc29yRGF0YTxpbnQzMl90PihpbnB1dF9nYXRlX2JpYXMpKTsKLSAgY21zaXNfbHN0bV9wYXJhbXMuZm9yZ2V0X2dhdGVfYmlhcyA9IGNvbnN0X2Nhc3Q8aW50MzJfdCo+KAotICAgICAgdGZsaXRlOjptaWNybzo6R2V0T3B0aW9uYWxUZW5zb3JEYXRhPGludDMyX3Q+KGZvcmdldF9nYXRlX2JpYXMpKTsKLSAgY21zaXNfbHN0bV9wYXJhbXMuY2VsbF9nYXRlX2JpYXMgPSBjb25zdF9jYXN0PGludDMyX3QqPigKLSAgICAgIHRmbGl0ZTo6bWljcm86OkdldE9wdGlvbmFsVGVuc29yRGF0YTxpbnQzMl90PihjZWxsX2dhdGVfYmlhcykpOwotICBjbXNpc19sc3RtX3BhcmFtcy5vdXRwdXRfZ2F0ZV9iaWFzID0gY29uc3RfY2FzdDxpbnQzMl90Kj4oCi0gICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRPcHRpb25hbFRlbnNvckRhdGE8aW50MzJfdD4ob3V0cHV0X2dhdGVfYmlhcykpOworICByZXR1cm4ga1RmTGl0ZU9rOworfQogCi0gIGNvbnN0IGJvb2wgdGltZV9tYWpvciA9IG9wX2RhdGFfbHN0bS5zaXplX2luZm8udGltZV9tYWpvcjsKLSAgY29uc3QgaW50IG5faW5wdXQgPSBpbnB1dC0+ZGltcy0+ZGF0YVtpbnB1dC0+ZGltcy0+c2l6ZSAtIDFdOwotICBjb25zdCBpbnQgbl9vdXRwdXQgPSByZWN1cnJlbnRfdG9fb3V0cHV0X3dlaWdodHMtPmRpbXMtPmRhdGFbMV07CitUZkxpdGVTdGF0dXMgQ01TSVNfTk5fRXZhbEludGVnZXIxNng4XzE2THN0bSgKKyAgICBjb25zdCBPcERhdGEmIG9wX2RhdGEsIGNvbnN0IExTVE1LZXJuZWxDb250ZW50cyYga2VybmVsX2NvbnRlbnQsCisgICAgY29uc3QgTFNUTUJ1ZmZlcnM8aW50MTZfdD4mIGJ1ZmZlcnMpIHsKKyAgVEZMSVRFX0RDSEVDSygKKyAgICAgIGtlcm5lbF9jb250ZW50LkdldEludGVybmFsVGVuc29yKHRmbGl0ZTo6a0xzdG1JbnB1dFRlbnNvciktPmRpbXMtPnNpemUgPj0KKyAgICAgICAgICAyICYmCisgICAgICBrZXJuZWxfY29udGVudC5HZXRJbnRlcm5hbFRlbnNvcih0ZmxpdGU6OmtMc3RtSW5wdXRUZW5zb3IpLT5kaW1zLT5zaXplIDw9CisgICAgICAgICAgMyk7CiAKLSAgaW50IG1heF90aW1lLCBuX2JhdGNoOwotICBpZiAoaW5wdXQtPmRpbXMtPnNpemUgPT0gMikgewotICAgIG1heF90aW1lID0gMTsKLSAgICBuX2JhdGNoID0gaW5wdXQtPmRpbXMtPmRhdGFbMF07Ci0gIH0gZWxzZSB7Ci0gICAgbWF4X3RpbWUgPSAodGltZV9tYWpvcikgPyBpbnB1dC0+ZGltcy0+ZGF0YVswXSA6IGlucHV0LT5kaW1zLT5kYXRhWzFdOwotICAgIG5fYmF0Y2ggPSAodGltZV9tYWpvcikgPyBpbnB1dC0+ZGltcy0+ZGF0YVsxXSA6IGlucHV0LT5kaW1zLT5kYXRhWzBdOwotICB9CisgIGNvbnN0IGludDE2X3QqIGlucHV0ID0gdGZsaXRlOjptaWNybzo6R2V0T3B0aW9uYWxUZW5zb3JEYXRhPGludDE2X3Q+KAorICAgICAga2VybmVsX2NvbnRlbnQuR2V0SW50ZXJuYWxUZW5zb3IodGZsaXRlOjprTHN0bUlucHV0VGVuc29yKSk7CisgIGludDE2X3QqIG91dHB1dCA9CisgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KGtlcm5lbF9jb250ZW50Lm91dHB1dF90ZW5zb3IpOwogCi0gIGNtc2lzX25uX2xzdG1fZGltcyBsc3RtX2RpbXM7Ci0gIGxzdG1fZGltcy5udW1faW5wdXRzID0gbl9pbnB1dDsKLSAgbHN0bV9kaW1zLm51bV9vdXRwdXRzID0gbl9vdXRwdXQ7Ci0gIGxzdG1fZGltcy5udW1fYmF0Y2hlcyA9IG5fYmF0Y2g7Ci0gIGxzdG1fZGltcy5tYXhfdGltZSA9IG1heF90aW1lOworICAvLyBDcmVhdGUgbHN0bSBidWZmZXIgc3RydWN0CisgIGNtc2lzX25uX2xzdG1fY29udGV4dCBjbXNpc19idWZmZXJzOworICBjbXNpc19idWZmZXJzLnRlbXAxID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4oYnVmZmVycy5idWZmZXIwKTsKKyAgY21zaXNfYnVmZmVycy50ZW1wMiA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCo+KGJ1ZmZlcnMuYnVmZmVyMSk7CisgIGNtc2lzX2J1ZmZlcnMuY2VsbF9zdGF0ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCo+KGJ1ZmZlcnMuYnVmZmVyMik7CiAKLSAgYXJtX2xzdG1fdW5pZGlyZWN0aW9uYWxfczE2X3M4KAotICAgICAgJnNjcmF0Y2hfYnVmZmVycywKLSAgICAgIGNvbnN0X2Nhc3Q8aW50OF90Kj4odGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KGlucHV0KSksCi0gICAgICAmbHN0bV9kaW1zLAotICAgICAgY29uc3RfY2FzdDxpbnQ4X3QqPigKLSAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRPcHRpb25hbFRlbnNvckRhdGE8aW50OF90PihpbnB1dF90b19pbnB1dF93ZWlnaHRzKSksCi0gICAgICBjb25zdF9jYXN0PGludDhfdCo+KHRmbGl0ZTo6bWljcm86OkdldE9wdGlvbmFsVGVuc29yRGF0YTxpbnQ4X3Q+KAotICAgICAgICAgIGlucHV0X3RvX2ZvcmdldF93ZWlnaHRzKSksCi0gICAgICBjb25zdF9jYXN0PGludDhfdCo+KAotICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldE9wdGlvbmFsVGVuc29yRGF0YTxpbnQ4X3Q+KGlucHV0X3RvX2NlbGxfd2VpZ2h0cykpLAotICAgICAgY29uc3RfY2FzdDxpbnQ4X3QqPih0ZmxpdGU6Om1pY3JvOjpHZXRPcHRpb25hbFRlbnNvckRhdGE8aW50OF90PigKLSAgICAgICAgICBpbnB1dF90b19vdXRwdXRfd2VpZ2h0cykpLAotICAgICAgY29uc3RfY2FzdDxpbnQ4X3QqPih0ZmxpdGU6Om1pY3JvOjpHZXRPcHRpb25hbFRlbnNvckRhdGE8aW50OF90PigKLSAgICAgICAgICByZWN1cnJlbnRfdG9faW5wdXRfd2VpZ2h0cykpLAotICAgICAgY29uc3RfY2FzdDxpbnQ4X3QqPih0ZmxpdGU6Om1pY3JvOjpHZXRPcHRpb25hbFRlbnNvckRhdGE8aW50OF90PigKLSAgICAgICAgICByZWN1cnJlbnRfdG9fZm9yZ2V0X3dlaWdodHMpKSwKLSAgICAgIGNvbnN0X2Nhc3Q8aW50OF90Kj4odGZsaXRlOjptaWNybzo6R2V0T3B0aW9uYWxUZW5zb3JEYXRhPGludDhfdD4oCi0gICAgICAgICAgcmVjdXJyZW50X3RvX2NlbGxfd2VpZ2h0cykpLAotICAgICAgY29uc3RfY2FzdDxpbnQ4X3QqPih0ZmxpdGU6Om1pY3JvOjpHZXRPcHRpb25hbFRlbnNvckRhdGE8aW50OF90PigKLSAgICAgICAgICByZWN1cnJlbnRfdG9fb3V0cHV0X3dlaWdodHMpKSwKLSAgICAgIGNvbnN0X2Nhc3Q8aW50MTZfdCo+KAotICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldE9wdGlvbmFsVGVuc29yRGF0YTxpbnQxNl90PihjZWxsX3RvX2lucHV0X3dlaWdodHMpKSwKLSAgICAgIGNvbnN0X2Nhc3Q8aW50MTZfdCo+KHRmbGl0ZTo6bWljcm86OkdldE9wdGlvbmFsVGVuc29yRGF0YTxpbnQxNl90PigKLSAgICAgICAgICBjZWxsX3RvX2ZvcmdldF93ZWlnaHRzKSksCi0gICAgICBjb25zdF9jYXN0PGludDE2X3QqPih0ZmxpdGU6Om1pY3JvOjpHZXRPcHRpb25hbFRlbnNvckRhdGE8aW50MTZfdD4oCi0gICAgICAgICAgY2VsbF90b19vdXRwdXRfd2VpZ2h0cykpLAotICAgICAgbnVsbHB0ciwgJmNtc2lzX2xzdG1fcGFyYW1zLAotICAgICAgY29uc3RfY2FzdDxpbnQ4X3QqPih0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4ob3V0cHV0X3N0YXRlKSksCi0gICAgICBjb25zdF9jYXN0PGludDE2X3QqPih0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KGNlbGxfc3RhdGUpKSwKLSAgICAgIGNvbnN0X2Nhc3Q8aW50OF90Kj4odGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KG91dHB1dCkpKTsKKyAgYXJtX2xzdG1fdW5pZGlyZWN0aW9uYWxfczE2KGlucHV0LCBvdXRwdXQsICZvcF9kYXRhLnBhcmFtc19jbXNpc19ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbXNpc19idWZmZXJzKTsKIAogICByZXR1cm4ga1RmTGl0ZU9rOwogfQogCiAvKktlcm5lbCBmdW5jdGlvbnMqLwotCiB2b2lkKiBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTHN0bUluaXQoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpIHsKICAgVEZMSVRFX0RDSEVDSyhjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIgIT0gbnVsbHB0cik7CkBAIC01MzEsMTUgKzM1NCw5IEBACiAgIGNvbnN0IFRmTGl0ZVRlbnNvciogaW5wdXQgPSBsc3RtX3RlbnNvcnMuR2V0SW50ZXJuYWxUZW5zb3Ioa0xzdG1JbnB1dFRlbnNvcik7CiAgIGNvbnN0IGF1dG8gYWN0aXZhdGlvbl90eXBlID0gaW5wdXQtPnR5cGU7CiAKLSAgaWYgKGtUZkxpdGVJbnQ4ID09IGFjdGl2YXRpb25fdHlwZSkgewotICAgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUygKLSAgICAgICAgQ2FsY3VsYXRlT3BEYXRhKGNvbnRleHQsIG5vZGUsIGxzdG1fdGVuc29ycywgb3BfZGF0YSkpOwotICB9Ci0KICAgVEZfTElURV9FTlNVUkVfT0soY29udGV4dCwgVmFsaWRhdGVUZW5zb3JTaXplKGNvbnRleHQsIGxzdG1fdGVuc29ycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2RhdGFfbHN0bS0+c2l6ZV9pbmZvKSk7CiAKLSAgLy8gQ3JlYXRlIGNlbGwgc3RhdGUgaW5mb3JtYXRpb24gYW5kIGdhdGUgcGFyYW1ldGVycyAoRnVsbHkgQ29ubmVjdGVkIGFuZCBNdWwpCiAgIGF1dG8gY2VsbF9zdGF0ZV90eXBlID0KICAgICAgIGxzdG1fdGVuc29ycy5HZXRJbnRlcm5hbFRlbnNvcihrTHN0bUNlbGxTdGF0ZVRlbnNvciktPnR5cGU7CiAgIGlmIChjZWxsX3N0YXRlX3R5cGUgPT0ga1RmTGl0ZUZsb2F0MzIpIHsKQEAgLTU1OSw4ICszNzYsMjQgQEAKICAgICAgICAgVGZMaXRlVHlwZUdldE5hbWUoY2VsbF9zdGF0ZV90eXBlKSwgY2VsbF9zdGF0ZV90eXBlKTsKICAgICByZXR1cm4ga1RmTGl0ZUVycm9yOwogICB9Ci0gIC8vIHJlcXVlc3QgYnVmZmVycyAoZm91ciBidWZmZXJzKQotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDQ7IGkrKykgeworCisgIHNpemVfdCBudW1iZXJfb2ZfYnVmZmVyczsKKyAgaWYgKGFjdGl2YXRpb25fdHlwZSA9PSBrVGZMaXRlSW50OCAmJiBjZWxsX3N0YXRlX3R5cGUgPT0ga1RmTGl0ZUludDE2KSB7CisgICAgYXV0byBrZXJuZWxfY29udGVudCA9IENyZWF0ZUxTVE1LZXJuZWxDb250ZW50KGNvbnRleHQsIG5vZGUpOworICAgIG51bWJlcl9vZl9idWZmZXJzID0gMzsKKyAgICBDTVNJU19OTl9Qb3J0T3BEYXRhPGludDMyX3Q+KGNvbnRleHQsIG9wX2RhdGFfbHN0bSwga2VybmVsX2NvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3BfZGF0YS0+cGFyYW1zX2Ntc2lzX25uKTsKKyAgfSBlbHNlIGlmIChhY3RpdmF0aW9uX3R5cGUgPT0ga1RmTGl0ZUludDE2ICYmCisgICAgICAgICAgICAgY2VsbF9zdGF0ZV90eXBlID09IGtUZkxpdGVJbnQxNikgeworICAgIGF1dG8ga2VybmVsX2NvbnRlbnQgPSBDcmVhdGVMU1RNS2VybmVsQ29udGVudChjb250ZXh0LCBub2RlKTsKKyAgICBudW1iZXJfb2ZfYnVmZmVycyA9IDM7CisgICAgQ01TSVNfTk5fUG9ydE9wRGF0YTxpbnQ2NF90Pihjb250ZXh0LCBvcF9kYXRhX2xzdG0sIGtlcm5lbF9jb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wX2RhdGEtPnBhcmFtc19jbXNpc19ubik7CisgIH0gZWxzZSB7CisgICAgbnVtYmVyX29mX2J1ZmZlcnMgPSA0OworICB9CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1iZXJfb2ZfYnVmZmVyczsgaSsrKSB7CiAgICAgVEZfTElURV9FTlNVUkVfT0soY29udGV4dCwgY29udGV4dC0+UmVxdWVzdFNjcmF0Y2hCdWZmZXJJbkFyZW5hKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9kYXRhX2xzdG0tPnNpemVfaW5mby5iYXRjaF9zaXplICoKQEAgLTU5OCw5ICs0MzEsOCBAQAogICAgICAgICBjYXNlIGtUZkxpdGVJbnQ4OiB7CiAgICAgICAgICAgLy8gOChhY3RpdmF0aW9uKXg4KHdlaWdodCktPjE2KGNlbGwpIExTVE0gd2l0aCAzMiBiaXRzIGJpYXMKICAgICAgICAgICBMU1RNQnVmZmVyczxpbnQxNl90PiBidWZmZXJzID0KLSAgICAgICAgICAgICAgQ3JlYXRlTFNUTUJ1ZmZlcnM8aW50MTZfdD4oY29udGV4dCwgb3BfZGF0YV9sc3RtLmJ1ZmZlcl9pbmRpY2VzKTsKLSAgICAgICAgICByZXR1cm4gQ01TSVNfTk5fRXZhbEludGVnZXI4eDhfMTZMc3RtPGludDE2X3Q+KAotICAgICAgICAgICAgICBvcF9kYXRhLCBrZXJuZWxfY29udGVudCwgYnVmZmVycyk7CisgICAgICAgICAgICAgIENNU0lTX05OX0NyZWF0ZUxTVE1CdWZmZXJzKGNvbnRleHQsIG9wX2RhdGFfbHN0bS5idWZmZXJfaW5kaWNlcyk7CisgICAgICAgICAgQ01TSVNfTk5fRXZhbEludGVnZXI4eDhfMTZMc3RtKG9wX2RhdGEsIGtlcm5lbF9jb250ZW50LCBidWZmZXJzKTsKICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBkZWZhdWx0OiB7CkBAIC02MTYsOSArNDQ4LDggQEAKICAgICAgICAgY2FzZSBrVGZMaXRlSW50ODogewogICAgICAgICAgIC8vIDE2KGFjdGl2YXRpb24peDgod2VpZ2h0KS0+MTYoY2VsbCkgTFNUTSB3aXRoIDY0IGJpdHMgYmlhcwogICAgICAgICAgIExTVE1CdWZmZXJzPGludDE2X3Q+IGJ1ZmZlcnMgPQotICAgICAgICAgICAgICBDcmVhdGVMU1RNQnVmZmVyczxpbnQxNl90Pihjb250ZXh0LCBvcF9kYXRhX2xzdG0uYnVmZmVyX2luZGljZXMpOwotICAgICAgICAgIEV2YWxMc3RtPGludDE2X3QsIGludDhfdCwgaW50MTZfdCwgaW50NjRfdD4ob3BfZGF0YV9sc3RtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2VybmVsX2NvbnRlbnQsIGJ1ZmZlcnMpOworICAgICAgICAgICAgICBDTVNJU19OTl9DcmVhdGVMU1RNQnVmZmVycyhjb250ZXh0LCBvcF9kYXRhX2xzdG0uYnVmZmVyX2luZGljZXMpOworICAgICAgICAgIENNU0lTX05OX0V2YWxJbnRlZ2VyMTZ4OF8xNkxzdG0ob3BfZGF0YSwga2VybmVsX2NvbnRlbnQsIGJ1ZmZlcnMpOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6IHsKQEAgLTY1NCwxMCArNDg1LDM2IEBACiAKICAgaWYgKGFjdGl2YXRpb25fdHlwZSA9PSBrVGZMaXRlSW50OCkgewogICAgIExTVE1CdWZmZXJzPGludDE2X3Q+IGJ1ZmZlcnMgPQotICAgICAgICBDcmVhdGVMU1RNQnVmZmVyczxpbnQxNl90Pihjb250ZXh0LCBvcF9kYXRhX2xzdG0uYnVmZmVyX2luZGljZXMpOworICAgICAgICBDTVNJU19OTl9DcmVhdGVMU1RNQnVmZmVycyhjb250ZXh0LCBvcF9kYXRhX2xzdG0uYnVmZmVyX2luZGljZXMpOwogCi0gICAgcmV0dXJuIENNU0lTX05OX0V2YWxJbnRlZ2VyOHg4XzE2THN0bTxpbnQxNl90PihvcF9kYXRhLCBrZXJuZWxfY29udGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnMpOworICAgIHJldHVybiBDTVNJU19OTl9FdmFsSW50ZWdlcjh4OF8xNkxzdG0ob3BfZGF0YSwga2VybmVsX2NvbnRlbnQsIGJ1ZmZlcnMpOworICB9IGVsc2UgeworICAgIE1pY3JvUHJpbnRmKCJJbnB1dCB0eXBlICVzICglZCkgbm90IHN1cHBvcnRlZC4iLAorICAgICAgICAgICAgICAgIFRmTGl0ZVR5cGVHZXROYW1lKGFjdGl2YXRpb25fdHlwZSksIGFjdGl2YXRpb25fdHlwZSk7CisgICAgcmV0dXJuIGtUZkxpdGVFcnJvcjsKKyAgfQorICByZXR1cm4ga1RmTGl0ZU9rOworfQorCitUZkxpdGVTdGF0dXMgVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxzdG1FdmFsSW50MTYoVGZMaXRlQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZkxpdGVOb2RlKiBub2RlKSB7CisgIFRGTElURV9EQ0hFQ0sobm9kZS0+dXNlcl9kYXRhICE9IG51bGxwdHIpOworICBjb25zdCBPcERhdGEmIG9wX2RhdGEgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBPcERhdGEqPihub2RlLT51c2VyX2RhdGEpOworICBjb25zdCBPcERhdGFMU1RNJiBvcF9kYXRhX2xzdG0gPSBvcF9kYXRhLnBhcmFtc19yZWY7CisgIGF1dG8ga2VybmVsX2NvbnRlbnQgPSBDcmVhdGVMU1RNS2VybmVsQ29udGVudChjb250ZXh0LCBub2RlKTsKKyAgY29uc3QgYXV0byBhY3RpdmF0aW9uX3R5cGUgPQorICAgICAga2VybmVsX2NvbnRlbnQuaW50ZXJuYWxfdGVuc29yc1trTHN0bUlucHV0VGVuc29yXS0+dHlwZTsKKyAgY29uc3QgYXV0byB3ZWlnaHRfdHlwZSA9CisgICAgICBrZXJuZWxfY29udGVudC5pbnRlcm5hbF90ZW5zb3JzW2tMc3RtSW5wdXRUb0lucHV0V2VpZ2h0c1RlbnNvcl0tPnR5cGU7CisKKyAgVEZMSVRFX0RDSEVDSyh3ZWlnaHRfdHlwZSA9PSBrVGZMaXRlSW50MTYgJiYKKyAgICAgICAgICAgICAgICAiT25seSBpbnQxNiBmaWx0ZXIgdHlwZSBzdXBwb3J0ZWQuIik7CisKKyAgaWYgKGFjdGl2YXRpb25fdHlwZSA9PSBrVGZMaXRlSW50MTYpIHsKKyAgICBMU1RNQnVmZmVyczxpbnQxNl90PiBidWZmZXJzID0KKyAgICAgICAgQ01TSVNfTk5fQ3JlYXRlTFNUTUJ1ZmZlcnMoY29udGV4dCwgb3BfZGF0YV9sc3RtLmJ1ZmZlcl9pbmRpY2VzKTsKKworICAgIHJldHVybiBDTVNJU19OTl9FdmFsSW50ZWdlcjE2eDhfMTZMc3RtKG9wX2RhdGEsIGtlcm5lbF9jb250ZW50LCBidWZmZXJzKTsKICAgfSBlbHNlIHsKICAgICBNaWNyb1ByaW50ZigiSW5wdXQgdHlwZSAlcyAoJWQpIG5vdCBzdXBwb3J0ZWQuIiwKICAgICAgICAgICAgICAgICBUZkxpdGVUeXBlR2V0TmFtZShhY3RpdmF0aW9uX3R5cGUpLCBhY3RpdmF0aW9uX3R5cGUpOwpAQCAtNjgwLDQgKzUzNywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTHN0bUV2YWxJbnQ4KTsKIH0KIAorVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9VTklESVJFQ1RJT05BTF9TRVFVRU5DRV9MU1RNX0lOVDE2KCkgeworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTHN0bUluaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMc3RtUHJlcGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxzdG1FdmFsSW50MTYpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jb21wYXJpc29ucy5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2NvbXBhcmlzb25zLmNjCmluZGV4IDQwNTYzMTYuLjY5YjNjNjEgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2NvbXBhcmlzb25zLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2NvbXBhcmlzb25zLmNjCkBAIC01MzMsNyArNTMzLDcgQEAKICAgcmV0dXJuIGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlcihjb250ZXh0LCBzaXplb2YoT3BEYXRhKSk7CiB9CiAKLVRmTGl0ZVN0YXR1cyBQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBDb21wYXJpc29uc1ByZXBhcmUoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBURkxJVEVfRENIRUNLKG5vZGUtPnVzZXJfZGF0YSAhPSBudWxscHRyKTsKICAgT3BEYXRhKiBkYXRhID0gc3RhdGljX2Nhc3Q8T3BEYXRhKj4obm9kZS0+dXNlcl9kYXRhKTsKIApAQCAtNTgwLDI3ICs1ODAsMjcgQEAKIH0gIC8vIG5hbWVzcGFjZQogCiBURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX0VRVUFMKCkgewotICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChJbml0LCBQcmVwYXJlLCBFcXVhbEV2YWwpOworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChJbml0LCBDb21wYXJpc29uc1ByZXBhcmUsIEVxdWFsRXZhbCk7CiB9CiAKIFRGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfTk9UX0VRVUFMKCkgewotICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChJbml0LCBQcmVwYXJlLCBOb3RFcXVhbEV2YWwpOworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChJbml0LCBDb21wYXJpc29uc1ByZXBhcmUsIE5vdEVxdWFsRXZhbCk7CiB9CiAKIFRGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfR1JFQVRFUigpIHsKLSAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoSW5pdCwgUHJlcGFyZSwgR3JlYXRlckV2YWwpOworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChJbml0LCBDb21wYXJpc29uc1ByZXBhcmUsIEdyZWF0ZXJFdmFsKTsKIH0KIAogVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9HUkVBVEVSX0VRVUFMKCkgewotICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChJbml0LCBQcmVwYXJlLCBHcmVhdGVyRXF1YWxFdmFsKTsKKyAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoSW5pdCwgQ29tcGFyaXNvbnNQcmVwYXJlLCBHcmVhdGVyRXF1YWxFdmFsKTsKIH0KIAogVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9MRVNTKCkgewotICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChJbml0LCBQcmVwYXJlLCBMZXNzRXZhbCk7CisgIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKEluaXQsIENvbXBhcmlzb25zUHJlcGFyZSwgTGVzc0V2YWwpOwogfQogCiBURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX0xFU1NfRVFVQUwoKSB7Ci0gIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKEluaXQsIFByZXBhcmUsIExlc3NFcXVhbEV2YWwpOworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChJbml0LCBDb21wYXJpc29uc1ByZXBhcmUsIExlc3NFcXVhbEV2YWwpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jb25jYXRlbmF0aW9uLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvY29uY2F0ZW5hdGlvbi5jYwppbmRleCBiNGE4MzhmLi41N2Q2M2E5IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jb25jYXRlbmF0aW9uLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2NvbmNhdGVuYXRpb24uY2MKQEAgLTEwMywxMiArMTAzLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxkYXRhX3R5cGU+KG91dHB1dCkpOwogfQogCi12b2lkKiBJbml0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgewordm9pZCogQ29uY2F0ZW5hdGlvbkluaXQoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCkgewogICBURkxJVEVfRENIRUNLKGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlciAhPSBudWxscHRyKTsKICAgcmV0dXJuIGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlcihjb250ZXh0LCBzaXplb2YoT3BEYXRhKSk7CiB9CiAKLVRmTGl0ZVN0YXR1cyBQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBDb25jYXRlbmF0aW9uUHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIC8vIFRoaXMgZnVuY3Rpb24gb25seSBjaGVja3MgdGhlIHR5cGVzLiBBZGRpdGlvbmFsIHNoYXBlIHZhbGlkYXRpb25zIGFyZQogICAvLyBwZXJmb3JtZWQgaW4gdGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBjYWxsZWQgZHVyaW5nIEV2YWwoKS4KICAgY29uc3QgVGZMaXRlQ29uY2F0ZW5hdGlvblBhcmFtcyogcGFyYW1zID0KQEAgLTIxNCw3ICsyMTUsNyBAQAogICByZXR1cm4ga1RmTGl0ZU9rOwogfQogCi1UZkxpdGVTdGF0dXMgRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgQ29uY2F0ZW5hdGlvbkV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBvdXRwdXRfdGVuc29yID0KICAgICAgIHRmbGl0ZTo6bWljcm86OkdldEV2YWxPdXRwdXQoY29udGV4dCwgbm9kZSwga091dHB1dFRlbnNvcik7CiAgIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIG91dHB1dF90ZW5zb3IgIT0gbnVsbHB0cik7CkBAIC0yNTIsNyArMjUzLDggQEAKIH0gIC8vIG5hbWVzcGFjZQogCiBURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX0NPTkNBVEVOQVRJT04oKSB7Ci0gIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKEluaXQsIFByZXBhcmUsIEV2YWwpOworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChDb25jYXRlbmF0aW9uSW5pdCwgQ29uY2F0ZW5hdGlvblByZXBhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmNhdGVuYXRpb25FdmFsKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvY29udi5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2NvbnYuY2MKaW5kZXggNTUwZjViMC4uMGRmMzVmYyAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvY29udi5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jb252LmNjCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IDIwMTkgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8qIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAKIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMjcsMTIgKzI3LDcgQEAKIG5hbWVzcGFjZSB0ZmxpdGUgewogbmFtZXNwYWNlIHsKIAotdm9pZCogSW5pdChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpIHsKLSAgVEZMSVRFX0RDSEVDSyhjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIgIT0gbnVsbHB0cik7Ci0gIHJldHVybiBjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIoY29udGV4dCwgc2l6ZW9mKE9wRGF0YUNvbnYpKTsKLX0KLQotVGZMaXRlU3RhdHVzIEV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworVGZMaXRlU3RhdHVzIENvbnZFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXQgPQogICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KGNvbnRleHQsIG5vZGUsIGtDb252SW5wdXRUZW5zb3IpOwogICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBmaWx0ZXIgPQpAQCAtNTAsMTQgKzQ1LDYgQEAKICAgVEZMSVRFX0RDSEVDSyhub2RlLT51c2VyX2RhdGEgIT0gbnVsbHB0cik7CiAgIGNvbnN0IGF1dG8mIGRhdGEgPSAqKHN0YXRpY19jYXN0PGNvbnN0IE9wRGF0YUNvbnYqPihub2RlLT51c2VyX2RhdGEpKTsKIAotICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBpbnB1dC0+dHlwZSwgb3V0cHV0LT50eXBlKTsKLSAgVEZfTElURV9FTlNVUkVfTVNHKAotICAgICAgY29udGV4dCwKLSAgICAgIGlucHV0LT50eXBlID09IGZpbHRlci0+dHlwZSB8fAotICAgICAgICAgIChpbnB1dC0+dHlwZSA9PSBrVGZMaXRlSW50MTYgJiYgZmlsdGVyLT50eXBlID09IGtUZkxpdGVJbnQ4KSB8fAotICAgICAgICAgIChpbnB1dC0+dHlwZSA9PSBrVGZMaXRlSW50OCAmJiBmaWx0ZXItPnR5cGUgPT0ga1RmTGl0ZUludDQpLAotICAgICAgIkh5YnJpZCBtb2RlbHMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gVEZMaXRlIE1pY3JvLiIpOwotCiAgIHN3aXRjaCAoaW5wdXQtPnR5cGUpIHsgIC8vIEFscmVhZHkga25vdyBpbi9vdXQgdHlwZXMgYXJlIHNhbWUuCiAgICAgY2FzZSBrVGZMaXRlRmxvYXQzMjogewogICAgICAgdGZsaXRlOjpyZWZlcmVuY2Vfb3BzOjpDb252KApAQCAtNzMsMzkgKzYwLDM0IEBACiAgICAgICBicmVhazsKICAgICB9CiAgICAgY2FzZSBrVGZMaXRlSW50MTY6IHsKLSAgICAgIHN3aXRjaCAoYmlhcy0+dHlwZSkgewotICAgICAgICBjYXNlIGtUZkxpdGVJbnQzMjogewotICAgICAgICAgIHJlZmVyZW5jZV9pbnRlZ2VyX29wczo6Q29udlBlckNoYW5uZWwoCi0gICAgICAgICAgICAgIENvbnZQYXJhbXNRdWFudGl6ZWQocGFyYW1zLCBkYXRhKSwKLSAgICAgICAgICAgICAgZGF0YS5wZXJfY2hhbm5lbF9vdXRwdXRfbXVsdGlwbGllciwgZGF0YS5wZXJfY2hhbm5lbF9vdXRwdXRfc2hpZnQsCi0gICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGlucHV0KSwKLSAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90PihpbnB1dCksCi0gICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGZpbHRlciksCi0gICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihmaWx0ZXIpLAotICAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShiaWFzKSwKLSAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0T3B0aW9uYWxUZW5zb3JEYXRhPHN0ZDo6aW50MzJfdD4oYmlhcyksCi0gICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKG91dHB1dCksCi0gICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50MTZfdD4ob3V0cHV0KSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBrVGZMaXRlSW50NjQ6IHsKLSAgICAgICAgICByZWZlcmVuY2VfaW50ZWdlcl9vcHM6OkNvbnZQZXJDaGFubmVsKAotICAgICAgICAgICAgICBDb252UGFyYW1zUXVhbnRpemVkKHBhcmFtcywgZGF0YSksCi0gICAgICAgICAgICAgIGRhdGEucGVyX2NoYW5uZWxfb3V0cHV0X211bHRpcGxpZXIsIGRhdGEucGVyX2NoYW5uZWxfb3V0cHV0X3NoaWZ0LAotICAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShpbnB1dCksCi0gICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50MTZfdD4oaW5wdXQpLAotICAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShmaWx0ZXIpLAotICAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4oZmlsdGVyKSwKLSAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoYmlhcyksCi0gICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldE9wdGlvbmFsVGVuc29yRGF0YTxzdGQ6OmludDY0X3Q+KGJpYXMpLAotICAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShvdXRwdXQpLAotICAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KG91dHB1dCkpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgTWljcm9QcmludGYoIkJpYXMgdHlwZSAlcyAoJWQpIG5vdCBzdXBwb3J0ZWQuIiwKLSAgICAgICAgICAgICAgICAgICAgICBUZkxpdGVUeXBlR2V0TmFtZShiaWFzLT50eXBlKSwgYmlhcy0+dHlwZSk7Ci0gICAgICAgICAgcmV0dXJuIGtUZkxpdGVFcnJvcjsKKyAgICAgIGlmIChiaWFzID09IG51bGxwdHIgfHwgYmlhcy0+dHlwZSA9PSBrVGZMaXRlSW50MzIpIHsKKyAgICAgICAgcmVmZXJlbmNlX2ludGVnZXJfb3BzOjpDb252UGVyQ2hhbm5lbCgKKyAgICAgICAgICAgIENvbnZQYXJhbXNRdWFudGl6ZWQocGFyYW1zLCBkYXRhKSwKKyAgICAgICAgICAgIGRhdGEucGVyX2NoYW5uZWxfb3V0cHV0X211bHRpcGxpZXIsIGRhdGEucGVyX2NoYW5uZWxfb3V0cHV0X3NoaWZ0LAorICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoaW5wdXQpLAorICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90PihpbnB1dCksCisgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShmaWx0ZXIpLAorICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KGZpbHRlciksCisgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShiaWFzKSwKKyAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldE9wdGlvbmFsVGVuc29yRGF0YTxzdGQ6OmludDMyX3Q+KGJpYXMpLAorICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUob3V0cHV0KSwKKyAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50MTZfdD4ob3V0cHV0KSk7CisgICAgICB9IGVsc2UgaWYgKGJpYXMtPnR5cGUgPT0ga1RmTGl0ZUludDY0KSB7CisgICAgICAgIHJlZmVyZW5jZV9pbnRlZ2VyX29wczo6Q29udlBlckNoYW5uZWwoCisgICAgICAgICAgICBDb252UGFyYW1zUXVhbnRpemVkKHBhcmFtcywgZGF0YSksCisgICAgICAgICAgICBkYXRhLnBlcl9jaGFubmVsX291dHB1dF9tdWx0aXBsaWVyLCBkYXRhLnBlcl9jaGFubmVsX291dHB1dF9zaGlmdCwKKyAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGlucHV0KSwKKyAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50MTZfdD4oaW5wdXQpLAorICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoZmlsdGVyKSwKKyAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihmaWx0ZXIpLAorICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoYmlhcyksCisgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRPcHRpb25hbFRlbnNvckRhdGE8c3RkOjppbnQ2NF90PihiaWFzKSwKKyAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKG91dHB1dCksCisgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KG91dHB1dCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTWljcm9QcmludGYoIkJpYXMgdHlwZSAlcyAoJWQpIG5vdCBzdXBwb3J0ZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgVGZMaXRlVHlwZUdldE5hbWUoYmlhcy0+dHlwZSksIGJpYXMtPnR5cGUpOworICAgICAgICByZXR1cm4ga1RmTGl0ZUVycm9yOwogICAgICAgfQogICAgICAgYnJlYWs7CiAgICAgfQpAQCAtMTYyLDcgKzE0NCw3IEBACiB9ICAvLyBuYW1lc3BhY2UKIAogVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9DT05WXzJEKCkgewotICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChJbml0LCBDb252UHJlcGFyZSwgRXZhbCk7CisgIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKENvbnZJbml0LCBDb252UHJlcGFyZSwgQ29udkV2YWwpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jb252LmggYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jb252LmgKaW5kZXggM2IxMjJhZC4uMGM4MDczZiAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvY29udi5oCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2NvbnYuaApAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAyMDIyIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTc0LDYgKzc0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRfaGVpZ2h0LCBjb25zdCBUZkxpdGVUeXBlIGRhdGFfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wRGF0YUNvbnYqIGRhdGEpOwogCit2b2lkKiBDb252SW5pdChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpOworCiBUZkxpdGVTdGF0dXMgQ29udlByZXBhcmUoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSk7CiAKIC8vIFRoaXMgaXMgdGhlIG1vc3QgZ2VuZXJpYyBURkxNUmVnaXN0cmF0aW9uLiBUaGUgYWN0dWFsIHN1cHBvcnRlZCB0eXBlcwpAQCAtODYsMTQgKzg4LDI0IEBACiAvLyBpbnQ4IGFjdGl2YXRpb25zIGFuZCBpbnQ4IHdlaWdodHMgYW5kIGFsd2F5cyBjYWxscyB0aGUgcmVmZXJlbmNlCiAvLyBpbXBsZW1lbnRhdGlvbi4KIFRGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfQ09OVl8yRF9JTlQ4UkVGKCk7CisKICNlbHNlCiBpbmxpbmUgVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9DT05WXzJEX0lOVDhSRUYoKSB7CiAgIHJldHVybiBSZWdpc3Rlcl9DT05WXzJEKCk7CiB9Ci0jZW5kaWYKKyNlbmRpZiAgLy8gZGVmaW5lZChYVEVOU0EpCiAKICNpZiBkZWZpbmVkKENNU0lTX05OKQogLy8gUmV0dXJucyBhIFRGTE1SZWdpc3RyYXRpb24gc3RydWN0IGZvciBrZXJuZWwgdmFyaWFudCB0aGF0IG9ubHkgc3VwcG9ydHMKKy8vIGludDggYWN0aXZhdGlvbnMgYW5kIGludDQgd2VpZ2h0cyBhbmQgdXNlcyB0aGUgbGF0ZW5jeSBvcHRpbWl6ZWQKKy8vIGltcGxlbWVudGF0aW9ucy4KK1RGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfQ09OVl8yRF9JTlQ0KCk7CisjZWxzZQoraW5saW5lIFRGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfQ09OVl8yRF9JTlQ0KCkgeyByZXR1cm4gUmVnaXN0ZXJfQ09OVl8yRCgpOyB9CisjZW5kaWYgIC8vIGRlZmluZWQoQ01TSVNfTk4pCisKKyNpZiBkZWZpbmVkKENNU0lTX05OKSB8fCBkZWZpbmVkKFhURU5TQSkKKy8vIFJldHVybnMgYSBURkxNUmVnaXN0cmF0aW9uIHN0cnVjdCBmb3Iga2VybmVsIHZhcmlhbnQgdGhhdCBvbmx5IHN1cHBvcnRzCiAvLyBpbnQ4IGFjdGl2YXRpb25zIGFuZCBpbnQ4IHdlaWdodHMgYW5kIHVzZXMgdGhlIGxhdGVuY3kgb3B0aW1pemVkCiAvLyBpbXBsZW1lbnRhdGlvbnMuCiBURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX0NPTlZfMkRfSU5UOCgpOwpAQCAtMTA3LDcgKzExOSw3IEBACiBpbmxpbmUgVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9DT05WXzJEX0lOVDgoKSB7IHJldHVybiBSZWdpc3Rlcl9DT05WXzJEKCk7IH0KIAogaW5saW5lIFRGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfQ09OVl8yRF9JTlQxNigpIHsgcmV0dXJuIFJlZ2lzdGVyX0NPTlZfMkQoKTsgfQotI2VuZGlmCisjZW5kaWYgIC8vIGRlZmluZWQoQ01TSVNfTk4pIHx8IGRlZmluZWQoWFRFTlNBKQogCiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCiAKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2NvbnZfY29tbW9uLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvY29udl9jb21tb24uY2MKaW5kZXggYzU0OGM5My4uNTFjN2E2ZiAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvY29udl9jb21tb24uY2MKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvY29udl9jb21tb24uY2MKQEAgLTEsNCArMSw0IEBACi0vKiBDb3B5cmlnaHQgMjAyMSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLyogQ29weXJpZ2h0IDIwMjMgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIAogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC03MSw2ICs3MSwxMSBAQAogICByZXR1cm4gb3BfcGFyYW1zOwogfQogCit2b2lkKiBDb252SW5pdChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpIHsKKyAgVEZMSVRFX0RDSEVDSyhjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIgIT0gbnVsbHB0cik7CisgIHJldHVybiBjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIoY29udGV4dCwgc2l6ZW9mKE9wRGF0YUNvbnYpKTsKK30KKwogVGZMaXRlU3RhdHVzIENhbGN1bGF0ZU9wRGF0YUNvbnYoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZUNvbnZQYXJhbXMmIHBhcmFtcywgaW50IHdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IGZpbHRlcl93aWR0aCwKQEAgLTEyMCwxMCArMTI1LDEyIEBACiAgIGRhdGEtPmZpbHRlcl96ZXJvX3BvaW50ID0gZmlsdGVyLT5wYXJhbXMuemVyb19wb2ludDsKICAgZGF0YS0+b3V0cHV0X3plcm9fcG9pbnQgPSBvdXRwdXQtPnBhcmFtcy56ZXJvX3BvaW50OwogCisgIG1pY3JvX2NvbnRleHQtPkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKG91dHB1dCk7CiAgIG1pY3JvX2NvbnRleHQtPkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKGlucHV0KTsKICAgbWljcm9fY29udGV4dC0+RGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3IoZmlsdGVyKTsKLSAgbWljcm9fY29udGV4dC0+RGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3Iob3V0cHV0KTsKLSAgbWljcm9fY29udGV4dC0+RGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3IoYmlhcyk7CisgIGlmIChiaWFzICE9IG51bGxwdHIpIHsKKyAgICBtaWNyb19jb250ZXh0LT5EZWFsbG9jYXRlVGVtcFRmTGl0ZVRlbnNvcihiaWFzKTsKKyAgfQogCiAgIHJldHVybiBrVGZMaXRlT2s7CiB9CkBAIC0xNDcsNiArMTU0LDE1IEBACiAgICAgICBtaWNyb19jb250ZXh0LT5BbGxvY2F0ZVRlbXBJbnB1dFRlbnNvcihub2RlLCBrQ29udldlaWdodHNUZW5zb3IpOwogICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCBmaWx0ZXIgIT0gbnVsbHB0cik7CiAKKyAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgaW5wdXQtPnR5cGUsIG91dHB1dC0+dHlwZSk7CisgIFRGX0xJVEVfRU5TVVJFX01TRygKKyAgICAgIGNvbnRleHQsCisgICAgICAoaW5wdXQtPnR5cGUgPT0ga1RmTGl0ZUZsb2F0MzIgJiYgZmlsdGVyLT50eXBlID09IGtUZkxpdGVGbG9hdDMyKSB8fAorICAgICAgICAgIChpbnB1dC0+dHlwZSA9PSBrVGZMaXRlSW50MTYgJiYgZmlsdGVyLT50eXBlID09IGtUZkxpdGVJbnQ4KSB8fAorICAgICAgICAgIChpbnB1dC0+dHlwZSA9PSBrVGZMaXRlSW50OCAmJgorICAgICAgICAgICAoZmlsdGVyLT50eXBlID09IGtUZkxpdGVJbnQ0IHx8IGZpbHRlci0+dHlwZSA9PSBrVGZMaXRlSW50OCkpLAorICAgICAgIkh5YnJpZCBtb2RlbHMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gVEZMaXRlIE1pY3JvLiIpOworCiAgIGNvbnN0IGludCBpbnB1dF93aWR0aCA9IGlucHV0LT5kaW1zLT5kYXRhWzJdOwogICBjb25zdCBpbnQgaW5wdXRfaGVpZ2h0ID0gaW5wdXQtPmRpbXMtPmRhdGFbMV07CiAgIGNvbnN0IGludCBmaWx0ZXJfd2lkdGggPSBmaWx0ZXItPmRpbXMtPmRhdGFbMl07CkBAIC0xOTYsNyArMjEyLDYgQEAKICAgbWljcm9fY29udGV4dC0+RGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3IoZmlsdGVyKTsKICAgbWljcm9fY29udGV4dC0+RGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3IoaW5wdXQpOwogICBtaWNyb19jb250ZXh0LT5EZWFsbG9jYXRlVGVtcFRmTGl0ZVRlbnNvcihvdXRwdXQpOwotCiAgIHJldHVybiBrVGZMaXRlT2s7CiB9CiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jb252X3Rlc3QuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jb252X3Rlc3QuY2MKaW5kZXggOThjMjYxNS4uMGZiOTQxMSAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvY29udl90ZXN0LmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2NvbnZfdGVzdC5jYwpAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTUzLDYgKzUzLDcgQEAKICAgICBrVGZMaXRlQWN0Tm9uZSwgICAgICAgLy8gYWN0aXZhdGlvbgogICAgIDEsICAgICAgICAgICAgICAgICAgICAvLyBkaWxhdGlvbl93aWR0aF9mYWN0b3IKICAgICAxLCAgICAgICAgICAgICAgICAgICAgLy8gZGlsYXRpb25faGVpZ2h0X2ZhY3RvcgorICAgIGtUZkxpdGVOb1R5cGUgICAgICAgICAvLyBxdWFudGl6ZWRfYmlhc190eXBlCiB9OwogCiB9ICAvLyBuYW1lc3BhY2UKQEAgLTYxLDEwICs2Miw2IEBACiAKIFRGX0xJVEVfTUlDUk9fVEVTVFNfQkVHSU4KIAotI2lmICFkZWZpbmVkKFZJU0lPTl9QNikgIC8vIFRPRE8oYi8yNzA3MjA2MjUpOiBkaXNhYmxlZCBpbnQ4IGFuZCBpbnQ0IHRlc3QgZm9yCi0vLyBjb252IGZvciBmdWxseSBjb25uZWN0ZWQgdmlzaW9uIHA2IGtlcm5lbHMsIGJlY2F1c2UgdmlzaW9uIHA2IGNvbnYgZG9lc24ndAotLy8gd29yayB3aXRoIHBlciBjaGFubmVsIHF1YW50aXphdGlvbgotCiBURl9MSVRFX01JQ1JPX1RFU1QoU2ltcGxlVGVzdFF1YW50aXplZDRiaXRQZXJDaGFubmVsKSB7CiAgIGNvbnN0IGludCBvdXRwdXRfZGltc19jb3VudCA9IDEyOwogICBpbnQ4X3Qgb3V0cHV0X2RhdGFbb3V0cHV0X2RpbXNfY291bnRdOwpAQCAtMTI1LDEyICsxMjIsNiBAQAogICAgICAgICAgIG91dHB1dF9kYXRhKSk7CiB9CiAKLSNlbmRpZiAgLy8gIWRlZmluZWQoVklTSU9OX1A2KQotCi0jaWYgIWRlZmluZWQoWFRFTlNBKSAgLy8gVE9ETyhiLzE3MDMyMTIwNik6IHh0ZW5zYSBrZXJuZWxzIGFyZSBsZXNzIGdlbmVyYWwgdGhhbgotICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBrZXJuZWxzIGFuZCB3ZSBpZmRlZiBvdXQgdGVzdCBjYXNlcyB0aGF0IGFyZQotICAgICAgICAgICAgICAgICAgICAgIC8vIGN1cnJlbnRseSBrbm93biB0byBmYWlsLgotCiBURl9MSVRFX01JQ1JPX1RFU1QoU2ltcGxlVGVzdEZsb2F0KSB7CiAgIGZsb2F0IG91dHB1dF9kYXRhW3RmbGl0ZTo6dGVzdGluZzo6a091dHB1dEVsZW1lbnRzXTsKIApAQCAtMjU1LDcgKzI0Niw2IEBACiAgICAgICAgICAgb3V0cHV0X2RhdGEpKTsKIH0KIAotI2lmICFkZWZpbmVkKENNU0lTX05OKQogVEZfTElURV9NSUNST19URVNUKFNpbXBsZVRlc3RRdWFudGl6ZWQxNng4UGVyQ2hhbm5lbDMyYkJpYXMpIHsKICAgY29uc3QgaW50IG91dHB1dF9kaW1zX2NvdW50ID0gMTI7CiAgIGludDE2X3Qgb3V0cHV0X2RhdGFbb3V0cHV0X2RpbXNfY291bnRdOwpAQCAtMjg1LDcgKzI3NSw2IEBACiAgICAgICAgICAgJnRmbGl0ZTo6dGVzdGluZzo6Y29tbW9uX2NvbnZfcGFyYW1zLCB0ZmxpdGU6OlJlZ2lzdGVyX0NPTlZfMkQoKSwKICAgICAgICAgICBvdXRwdXRfZGF0YSkpOwogfQotI2VuZGlmCiAKIFRGX0xJVEVfTUlDUk9fVEVTVChTaW1wbGVUZXN0RGlsYXRlZFF1YW50aXplZFBlckNoYW5uZWwpIHsKICAgY29uc3QgaW50IG91dHB1dF9kaW1zX2NvdW50ID0gMjQ7CkBAIC0zOTYsNyArMzg1LDYgQEAKICAgICAgICAgICAmY29udl9wYXJhbXMsIHRmbGl0ZTo6UmVnaXN0ZXJfQ09OVl8yRCgpLCBvdXRwdXRfZGF0YSkpOwogfQogCi0jaWYgIWRlZmluZWQoQ01TSVNfTk4pCiBURl9MSVRFX01JQ1JPX1RFU1QoU2ltcGxlVGVzdFF1YW50aXplZDE2eDhQZXJDaGFubmVsUmVsdTYzMmJCaWFzKSB7CiAgIGNvbnN0IGludCBvdXRwdXRfZGltc19jb3VudCA9IDEyOwogICBpbnQxNl90IG91dHB1dF9kYXRhW291dHB1dF9kaW1zX2NvdW50XTsKQEAgLTQyOSwxMyArNDE3LDEyIEBACiAgICAgICAgICAgZ29sZGVuX2RhdGEsIGdvbGRlbl9xdWFudGl6ZWQsIG91dHB1dF9zY2FsZSwgb3V0cHV0X3plcm9fcG9pbnQsCiAgICAgICAgICAgJmNvbnZfcGFyYW1zLCB0ZmxpdGU6OlJlZ2lzdGVyX0NPTlZfMkQoKSwgb3V0cHV0X2RhdGEpKTsKIH0KLSNlbmRpZgogCiBURl9MSVRFX01JQ1JPX1RFU1QoS2VybmVsMXgxUXVhbnRpemVkUGVyQ2hhbm5lbCkgewogICAvLyBjb252IHBhcmFtczoKICAgLy8gcGFkZGluZywgc3RyaWRlXzx3aWR0aCxoZWlnaHQ+LCBhY3RpdmF0aW9uLCBkaWxhdGlvbl88d2lkdGgsIGhlaWdodD4KLSAgVGZMaXRlQ29udlBhcmFtcyBjb252X3BhcmFtcyA9IHtrVGZMaXRlUGFkZGluZ1ZhbGlkLCAxLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUZkxpdGVBY3ROb25lLCAgICAgIDEsIDF9OworICBUZkxpdGVDb252UGFyYW1zIGNvbnZfcGFyYW1zID0geworICAgICAga1RmTGl0ZVBhZGRpbmdWYWxpZCwgMSwgMSwga1RmTGl0ZUFjdE5vbmUsIDEsIDEsIGtUZkxpdGVOb1R5cGV9OwogCiAgIGludCBpbnB1dF9zaGFwZVtdID0gezQsIDEsIDIsIDIsIDR9OyAgLy8gW2xlbixOLEgsVyxDXQogICBjb25zdGV4cHIgaW50IGlucHV0X2VsZW1lbnRzID0KQEAgLTQ4Nyw4ICs0NzQsOCBAQAogVEZfTElURV9NSUNST19URVNUKEtlcm5lbDF4MVF1YW50aXplZFBlckNoYW5uZWxSZWx1NikgewogICAvLyBjb252IHBhcmFtczoKICAgLy8gcGFkZGluZywgc3RyaWRlXzx3aWR0aCxoZWlnaHQ+LCBhY3RpdmF0aW9uLCBkaWxhdGlvbl88d2lkdGgsIGhlaWdodD4KLSAgVGZMaXRlQ29udlBhcmFtcyBjb252X3BhcmFtcyA9IHtrVGZMaXRlUGFkZGluZ1ZhbGlkLCAxLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUZkxpdGVBY3RSZWx1NiwgICAgIDEsIDF9OworICBUZkxpdGVDb252UGFyYW1zIGNvbnZfcGFyYW1zID0geworICAgICAga1RmTGl0ZVBhZGRpbmdWYWxpZCwgMSwgMSwga1RmTGl0ZUFjdFJlbHU2LCAxLCAxLCBrVGZMaXRlTm9UeXBlfTsKIAogICBpbnQgaW5wdXRfc2hhcGVbXSA9IHs0LCAxLCAyLCAyLCA0fTsgIC8vIFtsZW4sTixILFcsQ10KICAgY29uc3RleHByIGludCBpbnB1dF9lbGVtZW50cyA9CkBAIC01NDAsOCArNTI3LDggQEAKIFRGX0xJVEVfTUlDUk9fVEVTVChLZXJuZWwxeDFRdWFudGl6ZWQxNng4UGVyQ2hhbm5lbFJlbHU2KSB7CiAgIC8vIGNvbnYgcGFyYW1zOgogICAvLyBwYWRkaW5nLCBzdHJpZGVfPHdpZHRoLGhlaWdodD4sIGFjdGl2YXRpb24sIGRpbGF0aW9uXzx3aWR0aCwgaGVpZ2h0PgotICBUZkxpdGVDb252UGFyYW1zIGNvbnZfcGFyYW1zID0ge2tUZkxpdGVQYWRkaW5nVmFsaWQsIDEsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1RmTGl0ZUFjdFJlbHU2LCAgICAgMSwgMX07CisgIFRmTGl0ZUNvbnZQYXJhbXMgY29udl9wYXJhbXMgPSB7CisgICAgICBrVGZMaXRlUGFkZGluZ1ZhbGlkLCAxLCAxLCBrVGZMaXRlQWN0UmVsdTYsIDEsIDEsIGtUZkxpdGVOb1R5cGV9OwogCiAgIGludCBpbnB1dF9zaGFwZVtdID0gezQsIDEsIDIsIDIsIDR9OyAgLy8gW2xlbixOLEgsVyxDXQogICBjb25zdCBpbnQgaW5wdXRfZWxlbWVudHMgPSAxICogMiAqIDIgKiA0OwpAQCAtNjczLDggKzY2MCw2IEBACiAgICAgICAgICAgICAgICAgICAgICB0ZmxpdGU6OlJlZ2lzdGVyX0NPTlZfMkQoKSwgb3V0cHV0X2RhdGEpKTsKIH0KIAotI2VuZGlmICAvLyAhZGVmaW5lZChYVEVOU0EpCi0KIFRGX0xJVEVfTUlDUk9fVEVTVChJbnQ4RmlsdGVyMXgzeDN4MVNob3VsZE1hdGNoR29sZGVuRXZlbklucHV0UGFkZGluZ1NhbWUpIHsKICAgdXNpbmcgdGZsaXRlOjpFbGVtZW50Q291bnQ7CiAgIHVzaW5nIHRmbGl0ZTo6a0NvbnZGaWx0ZXIxeDN4M3gxOwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvY29udl90ZXN0LmggYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jb252X3Rlc3QuaAppbmRleCAzOWQzZmE3Li5jNjU1ZjA0IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jb252X3Rlc3QuaAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jb252X3Rlc3QuaApAQCAtMzQsMTAgKzM0LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRwdXRfbGVuZ3RoLCBUZkxpdGVDb252UGFyYW1zKiBjb252X3BhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgIFRGTE1SZWdpc3RyYXRpb24gcmVnaXN0cmF0aW9uLCBpbnQ4X3QqIG91dHB1dF9kYXRhKTsKIAotVGZMaXRlU3RhdHVzIEludm9rZUNvbnYoVGZMaXRlVGVuc29yKiB0ZW5zb3JzLCBpbnQgdGVuc29yc19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dHB1dF9sZW5ndGgsIFRmTGl0ZUNvbnZQYXJhbXMqIGNvbnZfcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgVEZMTVJlZ2lzdHJhdGlvbiByZWdpc3RyYXRpb24sIHVpbnQ4X3QqIG91dHB1dF9kYXRhKTsKLQogVGZMaXRlU3RhdHVzIFZhbGlkYXRlQ29udkdvbGRlbnMoVGZMaXRlVGVuc29yKiB0ZW5zb3JzLCBpbnQgdGVuc29yc19zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGV4cGVjdGVkX291dHB1dF9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dHB1dF9sZW5ndGgsCkBAIC01MiwxMyArNDgsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEZMTVJlZ2lzdHJhdGlvbiByZWdpc3RyYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ4X3QqIG91dHB1dF9kYXRhLCBmbG9hdCB0b2xlcmFuY2UgPSAxZS01KTsKIAotVGZMaXRlU3RhdHVzIFZhbGlkYXRlQ29udkdvbGRlbnMoVGZMaXRlVGVuc29yKiB0ZW5zb3JzLCBpbnQgdGVuc29yc19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZXhwZWN0ZWRfb3V0cHV0X2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0cHV0X2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRmTGl0ZUNvbnZQYXJhbXMqIGNvbnZfcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEZMTVJlZ2lzdHJhdGlvbiByZWdpc3RyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXRwdXRfZGF0YSwgZmxvYXQgdG9sZXJhbmNlID0gMWUtNSk7Ci0KIFRmTGl0ZVN0YXR1cyBUZXN0Q29udkZsb2F0KGludCogaW5wdXRfZGltc19kYXRhLCBjb25zdCBmbG9hdCogaW5wdXRfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZmlsdGVyX2RpbXNfZGF0YSwgY29uc3QgZmxvYXQqIGZpbHRlcl9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBiaWFzX2RpbXNfZGF0YSwgY29uc3QgZmxvYXQqIGJpYXNfZGF0YSwKQEAgLTY3LDE1ICs1Niw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZkxpdGVDb252UGFyYW1zKiBjb252X3BhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRGTE1SZWdpc3RyYXRpb24gcmVnaXN0cmF0aW9uLCBmbG9hdCogb3V0cHV0X2RhdGEpOwogCi1UZkxpdGVTdGF0dXMgVGVzdENvbnZRdWFudGl6ZWRQZXJMYXllcigKLSAgICBpbnQqIGlucHV0X2RpbXNfZGF0YSwgY29uc3QgZmxvYXQqIGlucHV0X2RhdGEsIHVpbnQ4X3QqIGlucHV0X3F1YW50aXplZCwKLSAgICBmbG9hdCBpbnB1dF9zY2FsZSwgaW50KiBmaWx0ZXJfZGltc19kYXRhLCBjb25zdCBmbG9hdCogZmlsdGVyX2RhdGEsCi0gICAgdWludDhfdCogZmlsdGVyX3F1YW50aXplZCwgZmxvYXQgZmlsdGVyX3NjYWxlLCBpbnQqIGJpYXNfZGltc19kYXRhLAotICAgIGNvbnN0IGZsb2F0KiBiaWFzX2RhdGEsIGludDMyX3QqIGJpYXNfcXVhbnRpemVkLCBpbnQqIG91dHB1dF9kaW1zX2RhdGEsCi0gICAgY29uc3QgZmxvYXQqIGV4cGVjdGVkX291dHB1dF9kYXRhLCB1aW50OF90KiBleHBlY3RlZF9vdXRwdXRfcXVhbnRpemVkLAotICAgIGZsb2F0IG91dHB1dF9zY2FsZSwgVGZMaXRlQ29udlBhcmFtcyogY29udl9wYXJhbXMsCi0gICAgVEZMTVJlZ2lzdHJhdGlvbiByZWdpc3RyYXRpb24sIHVpbnQ4X3QqIG91dHB1dF9kYXRhKTsKLQogVGZMaXRlU3RhdHVzIFRlc3RDb252UXVhbnRpemVkUGVyQ2hhbm5lbCgKICAgICBpbnQqIGlucHV0X2RpbXNfZGF0YSwgY29uc3QgZmxvYXQqIGlucHV0X2RhdGEsIGludDhfdCogaW5wdXRfcXVhbnRpemVkLAogICAgIGZsb2F0IGlucHV0X3NjYWxlLCBpbnQgaW5wdXRfemVyb19wb2ludCwgaW50KiBmaWx0ZXJfZGltc19kYXRhLApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvY29udl90ZXN0X2NvbW1vbi5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2NvbnZfdGVzdF9jb21tb24uY2MKaW5kZXggYmRjOTQ2Ni4uYTBmNzMzYiAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvY29udl90ZXN0X2NvbW1vbi5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jb252X3Rlc3RfY29tbW9uLmNjCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8qIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAKIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQ1LDggKzE0NSw4IEBACiAgICAgICBpbnB1dF9kYXRhLCBpbnB1dF9xdWFudGl6ZWQsIGlucHV0X2RpbXMsIGlucHV0X3NjYWxlLCBpbnB1dF96ZXJvX3BvaW50KTsKICAgVGZMaXRlVGVuc29yIGZpbHRlcl90ZW5zb3IgPSBDcmVhdGVTeW1tZXRyaWNQZXJDaGFubmVsUXVhbnRpemVkVGVuc29yKAogICAgICAgZmlsdGVyX2RhdGEsIGZpbHRlcl9kYXRhX3F1YW50aXplZCwgZmlsdGVyX2RpbXMsIGZpbHRlcl9zY2FsZXMsCi0gICAgICBmaWx0ZXJfemVyb19wb2ludHMsICZmaWx0ZXJfcXVhbnQsIDAsIGZhbHNlLAotICAgICAgdGVuc29yX3dlaWdodF90eXBlIC8qIHF1YW50aXplZCBkaW1lbnNpb24gKi8pOworICAgICAgZmlsdGVyX3plcm9fcG9pbnRzLCAmZmlsdGVyX3F1YW50LCAwIC8qIHF1YW50aXplZCBkaW1lbnNpb24gKi8sIGZhbHNlLAorICAgICAgdGVuc29yX3dlaWdodF90eXBlKTsKICAgVGZMaXRlVGVuc29yIGJpYXNfdGVuc29yID0gQ3JlYXRlUGVyQ2hhbm5lbFF1YW50aXplZEJpYXNUZW5zb3IoCiAgICAgICBiaWFzX2RhdGEsIGJpYXNfZGF0YV9xdWFudGl6ZWQsIGJpYXNfZGltcywgaW5wdXRfc2NhbGUsICZmaWx0ZXJfc2NhbGVzWzFdLAogICAgICAgYmlhc19zY2FsZXMsIGJpYXNfemVyb19wb2ludHMsICZiaWFzX3F1YW50LCAwIC8qIHF1YW50aXplZCBkaW1lbnNpb24gKi8pOwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvY3Vtc3VtLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvY3Vtc3VtLmNjCmluZGV4IGY2MmYyYTUuLjI1OGNmOGQgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2N1bXN1bS5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jdW1zdW0uY2MKQEAgLTEwNCwxMSArMTA0LDExIEBACiAgIHJldHVybiBrVGZMaXRlT2s7CiB9CiAKLVRmTGl0ZVN0YXR1cyBQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBDdW1TdW1QcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgcmV0dXJuIENhbGN1bGF0ZU9wRGF0YShjb250ZXh0LCBub2RlKTsKIH0KIAotVGZMaXRlU3RhdHVzIEV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworVGZMaXRlU3RhdHVzIEN1bVN1bUV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dCA9CiAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsSW5wdXQoY29udGV4dCwgbm9kZSwga0lucHV0VGVuc29yKTsKICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogYXhpc190ZW5zb3IgPQpAQCAtMTY5LDcgKzE2OSw3IEBACiB9ICAvLyBuYW1lc3BhY2UKIAogVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9DVU1TVU0oKSB7Ci0gIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKG51bGxwdHIsIFByZXBhcmUsIEV2YWwpOworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChudWxscHRyLCBDdW1TdW1QcmVwYXJlLCBDdW1TdW1FdmFsKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvZGVwdGhfdG9fc3BhY2UuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9kZXB0aF90b19zcGFjZS5jYwppbmRleCA3ZTBhOGZhLi5kNGZhZjdjIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9kZXB0aF90b19zcGFjZS5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9kZXB0aF90b19zcGFjZS5jYwpAQCAtOTMsMTEgKzkzLDExIEBACiAgIHJldHVybiBrVGZMaXRlT2s7CiB9CiAKLVRmTGl0ZVN0YXR1cyBQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBEZXB0aFRvU3BhY2VQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgcmV0dXJuIENhbGN1bGF0ZU9wRGF0YShjb250ZXh0LCBub2RlKTsKIH0KIAotVGZMaXRlU3RhdHVzIEV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworVGZMaXRlU3RhdHVzIERlcHRoVG9TcGFjZUV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBhdXRvKiBwYXJhbXMgPQogICAgICAgcmVpbnRlcnByZXRfY2FzdDxUZkxpdGVEZXB0aFRvU3BhY2VQYXJhbXMqPihub2RlLT5idWlsdGluX2RhdGEpOwogCkBAIC0xMzYsNyArMTM2LDggQEAKIH0gIC8vIG5hbWVzcGFjZQogCiBURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX0RFUFRIX1RPX1NQQUNFKCkgewotICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChudWxscHRyLCBQcmVwYXJlLCBFdmFsKTsKKyAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AobnVsbHB0ciwgRGVwdGhUb1NwYWNlUHJlcGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwdGhUb1NwYWNlRXZhbCk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSB0ZmxpdGUKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2RlcHRod2lzZV9jb252LmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvZGVwdGh3aXNlX2NvbnYuY2MKaW5kZXggMzk4ZjhjZC4uZmE1NWE3MCAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvZGVwdGh3aXNlX2NvbnYuY2MKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvZGVwdGh3aXNlX2NvbnYuY2MKQEAgLTI3LDEyICsyNywxMyBAQAogbmFtZXNwYWNlIHRmbGl0ZSB7CiBuYW1lc3BhY2UgewogCi12b2lkKiBJbml0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgewordm9pZCogRGVwdGh3aXNlQ29udkluaXQoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCkgewogICBURkxJVEVfRENIRUNLKGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlciAhPSBudWxscHRyKTsKICAgcmV0dXJuIGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlcihjb250ZXh0LCBzaXplb2YoT3BEYXRhQ29udikpOwogfQogCi1UZkxpdGVTdGF0dXMgRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgRGVwdGh3aXNlQ29udkV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBURkxJVEVfRENIRUNLKG5vZGUtPnVzZXJfZGF0YSAhPSBudWxscHRyKTsKICAgVEZMSVRFX0RDSEVDSyhub2RlLT5idWlsdGluX2RhdGEgIT0gbnVsbHB0cik7CiAKQEAgLTE0Myw3ICsxNDQsOCBAQAogfSAgLy8gbmFtZXNwYWNlCiAKIFRGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfREVQVEhXSVNFX0NPTlZfMkQoKSB7Ci0gIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKEluaXQsIERlcHRod2lzZUNvbnZQcmVwYXJlLCBFdmFsKTsKKyAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoRGVwdGh3aXNlQ29udkluaXQsIERlcHRod2lzZUNvbnZQcmVwYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXB0aHdpc2VDb252RXZhbCk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSB0ZmxpdGUKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2RlcHRod2lzZV9jb252LmggYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9kZXB0aHdpc2VfY29udi5oCmluZGV4IGQ4Y2M3OGQuLjVmMmQ4N2UgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2RlcHRod2lzZV9jb252LmgKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvZGVwdGh3aXNlX2NvbnYuaApAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAyMDIyIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTY1LDYgKzY1LDExIEBACiAvLyBpbXBsZW1lbnRhdGlvbnMuCiBURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX0RFUFRIV0lTRV9DT05WXzJEX0lOVDE2KCk7CiAKKy8vIFJldHVybnMgYSBURkxNUmVnaXN0cmF0aW9uIHN0cnVjdCBmb3Iga2VybmVsIHZhcmlhbnQgdGhhdCBvbmx5IHN1cHBvcnRzCisvLyBpbnQ4IGFjdGl2YXRpb25zIGFuZCBpbnQ0IHdlaWdodHMgYW5kIHVzZXMgdGhlIGxhdGVuY3kgb3B0aW1pemVkCisvLyBpbXBsZW1lbnRhdGlvbnMuCitURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX0RFUFRIV0lTRV9DT05WXzJEX0lOVDQoKTsKKwogI2Vsc2UKIGlubGluZSBURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX0RFUFRIV0lTRV9DT05WXzJEX0lOVDgoKSB7CiAgIHJldHVybiBSZWdpc3Rlcl9ERVBUSFdJU0VfQ09OVl8yRCgpOwpAQCAtNzMsNiArNzgsMTEgQEAKIGlubGluZSBURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX0RFUFRIV0lTRV9DT05WXzJEX0lOVDE2KCkgewogICByZXR1cm4gUmVnaXN0ZXJfREVQVEhXSVNFX0NPTlZfMkQoKTsKIH0KKworaW5saW5lIFRGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfREVQVEhXSVNFX0NPTlZfMkRfSU5UNCgpIHsKKyAgcmV0dXJuIFJlZ2lzdGVyX0RFUFRIV0lTRV9DT05WXzJEKCk7Cit9CisKICNlbmRpZgogCiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9kZXRlY3Rpb25fcG9zdHByb2Nlc3MuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9kZXRlY3Rpb25fcG9zdHByb2Nlc3MuY2MKaW5kZXggZTgwN2YzNS4uZmEyZDRjYSAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvZGV0ZWN0aW9uX3Bvc3Rwcm9jZXNzLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2RldGVjdGlvbl9wb3N0cHJvY2Vzcy5jYwpAQCAtMTE3LDcgKzExNyw4IEBACiAgIFRmTGl0ZVF1YW50aXphdGlvblBhcmFtcyBpbnB1dF9hbmNob3JzOwogfTsKIAotdm9pZCogSW5pdChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpIHsKK3ZvaWQqIERldGVjdGlvblBvc3RQcm9jZXNzSW5pdChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCkgewogICBURkxJVEVfRENIRUNLKGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlciAhPSBudWxscHRyKTsKICAgT3BEYXRhKiBvcF9kYXRhID0gbnVsbHB0cjsKIApAQCAtMTQ5LDcgKzE1MCw4IEBACiAgIHJldHVybiBvcF9kYXRhOwogfQogCi1UZkxpdGVTdGF0dXMgUHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgRGV0ZWN0aW9uUG9zdFByb2Nlc3NQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgYXV0byogb3BfZGF0YSA9IHN0YXRpY19jYXN0PE9wRGF0YSo+KG5vZGUtPnVzZXJfZGF0YSk7CiAKICAgTWljcm9Db250ZXh0KiBtaWNyb19jb250ZXh0ID0gR2V0TWljcm9Db250ZXh0KGNvbnRleHQpOwpAQCAtNzc0LDcgKzc3Niw4IEBACiAgIHJldHVybiBrVGZMaXRlT2s7CiB9CiAKLVRmTGl0ZVN0YXR1cyBFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBEZXRlY3Rpb25Qb3N0UHJvY2Vzc0V2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGZMaXRlTm9kZSogbm9kZSkgewogICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCAoa0JhdGNoU2l6ZSA9PSAxKSk7CiAgIGF1dG8qIG9wX2RhdGEgPSBzdGF0aWNfY2FzdDxPcERhdGEqPihub2RlLT51c2VyX2RhdGEpOwogCkBAIC04MDAsNyArODAzLDkgQEAKIH0gIC8vIG5hbWVzcGFjZQogCiBURkxNUmVnaXN0cmF0aW9uKiBSZWdpc3Rlcl9ERVRFQ1RJT05fUE9TVFBST0NFU1MoKSB7Ci0gIHN0YXRpYyBURkxNUmVnaXN0cmF0aW9uIHIgPSB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKEluaXQsIFByZXBhcmUsIEV2YWwpOworICBzdGF0aWMgVEZMTVJlZ2lzdHJhdGlvbiByID0gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcCgKKyAgICAgIERldGVjdGlvblBvc3RQcm9jZXNzSW5pdCwgRGV0ZWN0aW9uUG9zdFByb2Nlc3NQcmVwYXJlLAorICAgICAgRGV0ZWN0aW9uUG9zdFByb2Nlc3NFdmFsKTsKICAgcmV0dXJuICZyOwogfQogCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9kaXYuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9kaXYuY2MKaW5kZXggY2M5MGUyMi4uYTgwYjNmMiAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvZGl2LmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2Rpdi5jYwpAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAyMDIyIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTY1LDEyICs2NSwxMiBAQAogICByZXR1cm4ga1RmTGl0ZU9rOwogfQogCi12b2lkKiBJbml0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgewordm9pZCogRGl2SW5pdChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpIHsKICAgVEZMSVRFX0RDSEVDSyhjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIgIT0gbnVsbHB0cik7CiAgIHJldHVybiBjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIoY29udGV4dCwgc2l6ZW9mKE9wRGF0YURpdikpOwogfQogCi1UZkxpdGVTdGF0dXMgUHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgRGl2UHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIFRGTElURV9EQ0hFQ0sobm9kZS0+dXNlcl9kYXRhICE9IG51bGxwdHIpOwogICBURkxJVEVfRENIRUNLKG5vZGUtPmJ1aWx0aW5fZGF0YSAhPSBudWxscHRyKTsKIApAQCAtOTEsMTIgKzkxLDIxIEBACiAgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUygKICAgICAgIENhbGN1bGF0ZU9wRGF0YURpdihjb250ZXh0LCBpbnB1dDEsIGlucHV0Miwgb3V0cHV0LCBwYXJhbXMsIGRhdGEpKTsKIAorICBpZiAob3V0cHV0LT50eXBlID09IGtUZkxpdGVJbnQzMikgeworICAgIC8vIE9ubHkgc3VwcG9ydCBpbnQzMiB1bnF1YW50aXplZCBESVYgZm9yIG5vdy4KKyAgICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBpbnB1dDEtPnF1YW50aXphdGlvbi50eXBlLAorICAgICAgICAgICAgICAgICAgICAgIGtUZkxpdGVOb1F1YW50aXphdGlvbik7CisgICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgaW5wdXQyLT5xdWFudGl6YXRpb24udHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBrVGZMaXRlTm9RdWFudGl6YXRpb24pOworICB9CisKICAgbWljcm9fY29udGV4dC0+RGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3IoaW5wdXQxKTsKICAgbWljcm9fY29udGV4dC0+RGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3IoaW5wdXQyKTsKICAgbWljcm9fY29udGV4dC0+RGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3Iob3V0cHV0KTsKICAgcmV0dXJuIGtUZkxpdGVPazsKIH0KIAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiB2b2lkIEV2YWxEaXYoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSwgVGZMaXRlRGl2UGFyYW1zKiBwYXJhbXMsCiAgICAgICAgICAgICAgY29uc3QgT3BEYXRhRGl2KiBkYXRhLCBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dDEsCiAgICAgICAgICAgICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXQyLCBUZkxpdGVFdmFsVGVuc29yKiBvdXRwdXQpIHsKQEAgLTEyMCw5ICsxMjksOSBAQAogICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoaW5wdXQyKSwgJm9wX3BhcmFtcyk7CiAKICAgaWYgKHJlcXVpcmVzX2Jyb2FkY2FzdCkgewotICAgIFRGX0xJVEVfRElWKHJlZmVyZW5jZV9vcHMsIEJyb2FkY2FzdERpdlNsb3csIGZsb2F0KTsKKyAgICBURl9MSVRFX0RJVihyZWZlcmVuY2Vfb3BzLCBCcm9hZGNhc3REaXZTbG93LCBUKTsKICAgfSBlbHNlIHsKLSAgICBURl9MSVRFX0RJVihyZWZlcmVuY2Vfb3BzLCBEaXYsIGZsb2F0KTsKKyAgICBURl9MSVRFX0RJVihyZWZlcmVuY2Vfb3BzLCBEaXYsIFQpOwogICB9CiAjdW5kZWYgVEZfTElURV9ESVYKIH0KQEAgLTE3MCw3ICsxNzksNyBAQAogICByZXR1cm4ga1RmTGl0ZU9rOwogfQogCi1UZkxpdGVTdGF0dXMgRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgRGl2RXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIFRGTElURV9EQ0hFQ0sobm9kZS0+YnVpbHRpbl9kYXRhICE9IG51bGxwdHIpOwogICBhdXRvKiBwYXJhbXMgPSBzdGF0aWNfY2FzdDxUZkxpdGVEaXZQYXJhbXMqPihub2RlLT5idWlsdGluX2RhdGEpOwogICBURkxJVEVfRENIRUNLKG5vZGUtPnVzZXJfZGF0YSAhPSBudWxscHRyKTsKQEAgLTE4NCwxMyArMTkzLDE1IEBACiAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsT3V0cHV0KGNvbnRleHQsIG5vZGUsIGtPdXRwdXRUZW5zb3IpOwogCiAgIGlmIChvdXRwdXQtPnR5cGUgPT0ga1RmTGl0ZUZsb2F0MzIpIHsKLSAgICBFdmFsRGl2KGNvbnRleHQsIG5vZGUsIHBhcmFtcywgZGF0YSwgaW5wdXQxLCBpbnB1dDIsIG91dHB1dCk7CisgICAgRXZhbERpdjxmbG9hdD4oY29udGV4dCwgbm9kZSwgcGFyYW1zLCBkYXRhLCBpbnB1dDEsIGlucHV0Miwgb3V0cHV0KTsKKyAgfSBlbHNlIGlmIChvdXRwdXQtPnR5cGUgPT0ga1RmTGl0ZUludDMyKSB7CisgICAgRXZhbERpdjxpbnQzMl90Pihjb250ZXh0LCBub2RlLCBwYXJhbXMsIGRhdGEsIGlucHV0MSwgaW5wdXQyLCBvdXRwdXQpOwogICB9IGVsc2UgaWYgKG91dHB1dC0+dHlwZSA9PSBrVGZMaXRlSW50OCkgewogICAgIFRGX0xJVEVfRU5TVVJFX09LKGNvbnRleHQsIEV2YWxRdWFudGl6ZWQoY29udGV4dCwgbm9kZSwgcGFyYW1zLCBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQxLCBpbnB1dDIsIG91dHB1dCkpOwogICB9IGVsc2UgewogICAgIE1pY3JvUHJpbnRmKAotICAgICAgICAiRElWIG9ubHkgc3VwcG9ydHMgRkxPQVQzMiwgcXVhbnRpemVkIElOVDggIgorICAgICAgICAiRElWIG9ubHkgc3VwcG9ydHMgRkxPQVQzMiwgSU5UMzIsIHF1YW50aXplZCBJTlQ4ICIKICAgICAgICAgIm5vdywgZ290IHR5cGUgJXMgKCVkKS4iLAogICAgICAgICBUZkxpdGVUeXBlR2V0TmFtZShvdXRwdXQtPnR5cGUpLCBvdXRwdXQtPnR5cGUpOwogICAgIHJldHVybiBrVGZMaXRlRXJyb3I7CkBAIC0yMDIsNyArMjEzLDcgQEAKIH0gIC8vIG5hbWVzcGFjZQogCiBURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX0RJVigpIHsKLSAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoSW5pdCwgUHJlcGFyZSwgRXZhbCk7CisgIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKERpdkluaXQsIERpdlByZXBhcmUsIERpdkV2YWwpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9kaXZfdGVzdC5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2Rpdl90ZXN0LmNjCmluZGV4IGUwMjAyNTUuLmVmMzVkMGMgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2Rpdl90ZXN0LmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2Rpdl90ZXN0LmNjCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8qIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAKIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMzc0LDQgKzM3NCw2NSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUZkxpdGVBY3ROb25lLCAmcGFyYW1zKTsKIH0KIAorVEZfTElURV9NSUNST19URVNUKEludGVnZXJEaXZPcFRlc3ROb0FjdGl2YXRpb24pIHsKKyAgaW50IGtEaW1zW10gPSB7NCwgMSwgMiwgMiwgMX07CisgIGNvbnN0ZXhwciBpbnQzMl90IGtJbnB1dDFbXSA9IHstMiwgMiwgLTE1LCA4fTsKKyAgY29uc3RleHByIGludDMyX3Qga0lucHV0MltdID0gezUsIC0yLCAtMywgNX07CisgIGNvbnN0ZXhwciBpbnQzMl90IGtFeHBlY3RbXSA9IHswLCAtMSwgNSwgMX07CisgIGNvbnN0ZXhwciBpbnQga091dHB1dENvdW50ID0gc3RkOjpleHRlbnQ8ZGVjbHR5cGUoa0V4cGVjdCk+Ojp2YWx1ZTsKKyAgaW50MzJfdCBvdXRwdXRfZGF0YVtrT3V0cHV0Q291bnRdOworCisgIHRmbGl0ZTo6dGVzdGluZzo6VGVzdERpdihrRGltcywga0lucHV0MSwga0RpbXMsIGtJbnB1dDIsIGtEaW1zLCBrRXhwZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2RhdGEsIGtUZkxpdGVBY3ROb25lKTsKK30KKworVEZfTElURV9NSUNST19URVNUKEludGVnZXJEaXZPcFRlc3RBY3RpdmF0aW9uUkVMVV9OMV9UT18xKSB7CisgIGludCBrRGltc1tdID0gezQsIDEsIDIsIDIsIDF9OworICBjb25zdGV4cHIgaW50MzJfdCBrSW5wdXQxW10gPSB7LTIsIDIsIC0xMiwgOH07CisgIGNvbnN0ZXhwciBpbnQzMl90IGtJbnB1dDJbXSA9IHsxLCAyLCAtMTUsIDV9OworICBjb25zdGV4cHIgaW50MzJfdCBrRXhwZWN0W10gPSB7LTEsIDEsIDAsIDF9OworICBjb25zdGV4cHIgaW50IGtPdXRwdXRDb3VudCA9IHN0ZDo6ZXh0ZW50PGRlY2x0eXBlKGtFeHBlY3QpPjo6dmFsdWU7CisgIGludDMyX3Qgb3V0cHV0X2RhdGFba091dHB1dENvdW50XTsKKworICB0ZmxpdGU6OnRlc3Rpbmc6OlRlc3REaXYoa0RpbXMsIGtJbnB1dDEsIGtEaW1zLCBrSW5wdXQyLCBrRGltcywga0V4cGVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9kYXRhLCBrVGZMaXRlQWN0UmVsdU4xVG8xKTsKK30KKworVEZfTElURV9NSUNST19URVNUKEludGVnZXJEaXZPcFRlc3RWYXJpb3VzSW5wdXRTaGFwZXMpIHsKKyAgaW50IGtTaGFwZTFbXSA9IHsxLCA2fTsKKyAgaW50IGtTaGFwZTJbXSA9IHsyLCAyLCAzfTsKKyAgaW50IGtTaGFwZTNbXSA9IHszLCAyLCAxLCAzfTsKKyAgaW50IGtTaGFwZTRbXSA9IHs0LCAxLCAzLCAxLCAyfTsKKyAgaW50KiBrRGltc1tdID0ge2tTaGFwZTEsIGtTaGFwZTIsIGtTaGFwZTMsIGtTaGFwZTR9OworICBjb25zdGV4cHIgaW50IGtEaW1zQ291bnQgPSBzdGQ6OmV4dGVudDxkZWNsdHlwZShrRGltcyk+Ojp2YWx1ZTsKKworICBjb25zdGV4cHIgaW50MzJfdCBrSW5wdXQxW10gPSB7LTIwLCAyLCAzLCA4LCAxMSwgLTIwfTsKKyAgY29uc3RleHByIGludDMyX3Qga0lucHV0MltdID0gezEsIDIsIDYsIDUsIC0xMSwgLTF9OworICBjb25zdGV4cHIgaW50MzJfdCBrRXhwZWN0W10gPSB7LTIwLCAxLCAwLCAxLCAtMSwgMjB9OworICBjb25zdGV4cHIgaW50IGtPdXRwdXRDb3VudCA9IHN0ZDo6ZXh0ZW50PGRlY2x0eXBlKGtFeHBlY3QpPjo6dmFsdWU7CisgIGludDMyX3Qgb3V0cHV0X2RhdGFba091dHB1dENvdW50XTsKKworICB0ZmxpdGU6OnRlc3Rpbmc6OlRlc3REaXZNdWx0aVNoYXBlKGtEaW1zLCBrRGltc0NvdW50LCBrSW5wdXQxLCBrSW5wdXQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtFeHBlY3QsIG91dHB1dF9kYXRhLCBrVGZMaXRlQWN0Tm9uZSk7Cit9CisKK1RGX0xJVEVfTUlDUk9fVEVTVChJbnRlZ2VyRGl2T3BUZXN0V2l0aEJyb2FkY2FzdCkgeworICBpbnQga1NoYXBlMVtdID0gezEsIDh9OworICBpbnQga1NoYXBlMltdID0gezIsIDIsIDR9OworICBpbnQga1NoYXBlM1tdID0gezMsIDIsIDEsIDR9OworICBpbnQga1NoYXBlNFtdID0gezQsIDEsIDQsIDEsIDJ9OworICBpbnQga1NoYXBlNVtdID0gezUsIDEsIDIsIDEsIDIsIDJ9OworICBpbnQqIGtEaW1zW10gPSB7a1NoYXBlMSwga1NoYXBlMiwga1NoYXBlMywga1NoYXBlNCwga1NoYXBlNX07CisgIGNvbnN0ZXhwciBpbnQga0RpbXNDb3VudCA9IHN0ZDo6ZXh0ZW50PGRlY2x0eXBlKGtEaW1zKT46OnZhbHVlOworCisgIGNvbnN0ZXhwciBpbnQzMl90IGtJbnB1dDFbXSA9IHstMjAsIDIxLCA3LCA4LCAxMSwgLTEyMywgLTQyLCAtNDh9OworICBjb25zdGV4cHIgaW50MzJfdCBrSW5wdXQyW10gPSB7M307CisgIGNvbnN0ZXhwciBpbnQzMl90IGtFeHBlY3RbXSA9IHstNiwgNywgMiwgMiwgMywgLTQxLCAtMTQsIC0xNn07CisgIGNvbnN0ZXhwciBpbnQga091dHB1dENvdW50ID0gc3RkOjpleHRlbnQ8ZGVjbHR5cGUoa0V4cGVjdCk+Ojp2YWx1ZTsKKyAgaW50MzJfdCBvdXRwdXRfZGF0YVtrT3V0cHV0Q291bnRdOworCisgIHRmbGl0ZTo6dGVzdGluZzo6VGVzdERpdk11bHRpQnJvYWRjYXN0KGtEaW1zLCBrRGltc0NvdW50LCBrSW5wdXQxLCBrSW5wdXQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrRXhwZWN0LCBvdXRwdXRfZGF0YSwga1RmTGl0ZUFjdE5vbmUpOworfQorCiBURl9MSVRFX01JQ1JPX1RFU1RTX0VORApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvZW1iZWRkaW5nX2xvb2t1cC5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2VtYmVkZGluZ19sb29rdXAuY2MKaW5kZXggNzdhYzBlMC4uNmE0YmU4NyAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvZW1iZWRkaW5nX2xvb2t1cC5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9lbWJlZGRpbmdfbG9va3VwLmNjCkBAIC02NSw3ICs2NSw3IEBACiAgIHJldHVybiBrVGZMaXRlT2s7CiB9CiAKLVRmTGl0ZVN0YXR1cyBQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBFbWJlZGRpbmdMb29rVXBQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgTnVtSW5wdXRzKG5vZGUpLCAyKTsKICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgTnVtT3V0cHV0cyhub2RlKSwgMSk7CiAKQEAgLTE3OCw3ICsxNzgsNyBAQAogICByZXR1cm4ga1RmTGl0ZU9rOwogfQogCi1UZkxpdGVTdGF0dXMgRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgRW1iZWRkaW5nTG9va1VwRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGxvb2t1cCA9CiAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsSW5wdXQoY29udGV4dCwgbm9kZSwga0lucHV0VGVuc29yXzApOwogICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiB2YWx1ZSA9CkBAIC0yMDcsNyArMjA3LDggQEAKIH0gIC8vIG5hbWVzcGFjZQogCiBURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX0VNQkVERElOR19MT09LVVAoKSB7Ci0gIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKG51bGxwdHIsIFByZXBhcmUsIEV2YWwpOworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChudWxscHRyLCBFbWJlZGRpbmdMb29rVXBQcmVwYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbWJlZGRpbmdMb29rVXBFdmFsKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvZXhwLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvZXhwLmNjCmluZGV4IDFhMmUwMGMuLjhkMWRhOGYgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2V4cC5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9leHAuY2MKQEAgLTI3LDcgKzI3LDcgQEAKIGNvbnN0ZXhwciBpbnQga0lucHV0VGVuc29yID0gMDsKIGNvbnN0ZXhwciBpbnQga091dHB1dFRlbnNvciA9IDA7CiAKLVRmTGl0ZVN0YXR1cyBQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBFeHBQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgTWljcm9Db250ZXh0KiBtaWNyb19jb250ZXh0ID0gR2V0TWljcm9Db250ZXh0KGNvbnRleHQpOwogCiAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bUlucHV0cyhub2RlKSwgMSk7CkBAIC01MSw3ICs1MSw3IEBACiAgIHJldHVybiBrVGZMaXRlT2s7CiB9CiAKLVRmTGl0ZVN0YXR1cyBFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBFeHBFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXQgPQogICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KGNvbnRleHQsIG5vZGUsIGtJbnB1dFRlbnNvcik7CiAgIFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dCA9CkBAIC03Myw3ICs3Myw3IEBACiB9ICAvLyBuYW1lc3BhY2UKIAogVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9FWFAoKSB7Ci0gIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKG51bGxwdHIsIFByZXBhcmUsIEV2YWwpOworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChudWxscHRyLCBFeHBQcmVwYXJlLCBFeHBFdmFsKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvZXhwYW5kX2RpbXMuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9leHBhbmRfZGltcy5jYwppbmRleCAwYzRjNmZmLi5kNDdiNDJjIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9leHBhbmRfZGltcy5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9leHBhbmRfZGltcy5jYwpAQCAtMTMsNiArMTMsOCBAQAogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCisjaW5jbHVkZSA8Y3N0ZGludD4KKwogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9jL2NvbW1vbi5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3RlbnNvcl9jdHlwZXMuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9rZXJuZWxfdXRpbC5oIgpAQCAtODIsNyArODQsNyBAQAogICByZXR1cm4ga1RmTGl0ZU9rOwogfQogCi1UZkxpdGVTdGF0dXMgUHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgRXhwYW5kRGltc1ByZXBhcmUoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBNaWNyb0NvbnRleHQqIG1pY3JvX2NvbnRleHQgPSBHZXRNaWNyb0NvbnRleHQoY29udGV4dCk7CiAKICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgTnVtSW5wdXRzKG5vZGUpLCAyKTsKQEAgLTExNiw3ICsxMTgsNyBAQAogICB9CiB9CiAKLVRmTGl0ZVN0YXR1cyBFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBFeHBhbmREaW1zRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0ID0KICAgICAgIHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dChjb250ZXh0LCBub2RlLCBrSW5wdXRUZW5zb3IpOwogICBUZkxpdGVFdmFsVGVuc29yKiBvdXRwdXQgPQpAQCAtMTI4LDEzICsxMzAsMTggQEAKICAgICAgIG1lbUNvcHlOKHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8ZmxvYXQ+KG91dHB1dCksCiAgICAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGZsb2F0PihpbnB1dCksIGZsYXRfc2l6ZSk7CiAgICAgfSBicmVhazsKKyAgICBjYXNlIGtUZkxpdGVJbnQxNjogeworICAgICAgbWVtQ29weU4odGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90PihvdXRwdXQpLAorICAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90PihpbnB1dCksIGZsYXRfc2l6ZSk7CisgICAgfSBicmVhazsKICAgICBjYXNlIGtUZkxpdGVJbnQ4OiB7CiAgICAgICBtZW1Db3B5Tih0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4ob3V0cHV0KSwKICAgICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihpbnB1dCksIGZsYXRfc2l6ZSk7CiAgICAgfSBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgTWljcm9QcmludGYoCi0gICAgICAgICAgIkV4cGFuZF9EaW1zIG9ubHkgY3VycmVudGx5IHN1cHBvcnRzIGludDggYW5kIGZsb2F0MzIsIGdvdCAlZC4iLAorICAgICAgICAgICJFeHBhbmRfRGltcyBvbmx5IGN1cnJlbnRseSBzdXBwb3J0cyBpbnQ4LCBpbnQxNiBhbmQgZmxvYXQzMiwgZ290ICIKKyAgICAgICAgICAiJWQuIiwKICAgICAgICAgICBpbnB1dC0+dHlwZSk7CiAgICAgICByZXR1cm4ga1RmTGl0ZUVycm9yOwogICB9CkBAIC0xNDMsNyArMTUwLDcgQEAKIH0gIC8vIG5hbWVzcGFjZQogCiBURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX0VYUEFORF9ESU1TKCkgewotICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChudWxscHRyLCBQcmVwYXJlLCBFdmFsKTsKKyAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AobnVsbHB0ciwgRXhwYW5kRGltc1ByZXBhcmUsIEV4cGFuZERpbXNFdmFsKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvZXhwYW5kX2RpbXNfdGVzdC5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2V4cGFuZF9kaW1zX3Rlc3QuY2MKaW5kZXggZDhlMjE3ZS4uMzlhODNiNSAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvZXhwYW5kX2RpbXNfdGVzdC5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9leHBhbmRfZGltc190ZXN0LmNjCkBAIC0xMyw2ICsxMyw4IEBACiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKKyNpbmNsdWRlIDxjc3RkaW50PgorCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2MvYnVpbHRpbl9vcF9kYXRhLmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2MvY29tbW9uLmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMva2VybmVsX3J1bm5lci5oIgpAQCAtMTM4LDYgKzE0MCwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ29sZGVuX2RhdGEsIG91dHB1dF9kYXRhKTsKIH0KIAorVEZfTElURV9NSUNST19URVNUKEV4cGFuZERpbXNQb3NpdGl2ZUF4aXNUZXN0MykgeworICBpbnQxNl90IG91dHB1dF9kYXRhWzZdOworICBpbnQgaW5wdXRfZGltc1tdID0gezMsIDMsIDEsIDJ9OworICBjb25zdCBpbnQxNl90IGlucHV0X2RhdGFbXSA9IHstMSwgMSwgMiwgLTIsIDAsIDN9OworICBjb25zdCBpbnQxNl90IGdvbGRlbl9kYXRhW10gPSB7LTEsIDEsIDIsIC0yLCAwLCAzfTsKKyAgaW50IGF4aXNfZGltc1tdID0gezEsIDF9OworICBjb25zdCBpbnQzMl90IGF4aXNfZGF0YVtdID0gezN9OworICBpbnQgZ29sZGVuX2RpbXNbXSA9IHsxLCAzLCAxLCAyfTsKKyAgaW50IG91dHB1dF9kaW1zW10gPSB7NCwgMywgMSwgMiwgMX07CisgIHRmbGl0ZTo6dGVzdGluZzo6VGVzdEV4cGFuZERpbXM8aW50MTZfdD4oaW5wdXRfZGltcywgaW5wdXRfZGF0YSwgYXhpc19kaW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aXNfZGF0YSwgZ29sZGVuX2RpbXMsIG91dHB1dF9kaW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvbGRlbl9kYXRhLCBvdXRwdXRfZGF0YSk7Cit9CisKIFRGX0xJVEVfTUlDUk9fVEVTVChFeHBhbmREaW1zTmVnYXRpdmVBeGlzVGVzdDQpIHsKICAgaW50OF90IG91dHB1dF9kYXRhWzZdOwogICBpbnQgaW5wdXRfZGltc1tdID0gezMsIDMsIDEsIDJ9OwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvZmlsbC5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2ZpbGwuY2MKaW5kZXggYjFiMzY2ZS4uMTQ4NmZjYiAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvZmlsbC5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9maWxsLmNjCkBAIC02NCw3ICs2NCw3IEBACiBjb25zdGV4cHIgaW50IGtWYWx1ZVRlbnNvciA9IDE7CiBjb25zdGV4cHIgaW50IGtPdXRwdXRUZW5zb3IgPSAwOwogCi1UZkxpdGVTdGF0dXMgUHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgRmlsbFByZXBhcmUoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBNaWNyb0NvbnRleHQqIG1pY3JvX2NvbnRleHQgPSBHZXRNaWNyb0NvbnRleHQoY29udGV4dCk7CiAKICAgLy8gRW5zdXJlIGlucHV0cyBhbmQgb3V0cHV0cyBleGlzdC4KQEAgLTEwNyw3ICsxMDcsNyBAQAogICAgICAgbWljcm86OkdldFRlbnNvclNoYXBlKG91dHB1dCksIG1pY3JvOjpHZXRUZW5zb3JEYXRhPFQ+KG91dHB1dCkpOwogfQogCi1UZkxpdGVTdGF0dXMgRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgRmlsbEV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiB2YWx1ZSA9CiAgICAgICBtaWNybzo6R2V0RXZhbElucHV0KGNvbnRleHQsIG5vZGUsIGtWYWx1ZVRlbnNvcik7CiAgIFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dCA9IG1pY3JvOjpHZXRFdmFsT3V0cHV0KGNvbnRleHQsIG5vZGUsIGtPdXRwdXRUZW5zb3IpOwpAQCAtMTM0LDcgKzEzNCw3IEBACiB9ICAvLyBuYW1lc3BhY2UKIAogVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9GSUxMKCkgewotICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChudWxscHRyLCBQcmVwYXJlLCBFdmFsKTsKKyAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AobnVsbHB0ciwgRmlsbFByZXBhcmUsIEZpbGxFdmFsKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvZmxvb3IuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9mbG9vci5jYwppbmRleCAwOTRjOGI1Li5mOTJiN2UwIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9mbG9vci5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9mbG9vci5jYwpAQCAtMjYsNyArMjYsNyBAQAogY29uc3RleHByIGludCBrSW5wdXRUZW5zb3IgPSAwOwogY29uc3RleHByIGludCBrT3V0cHV0VGVuc29yID0gMDsKIAotVGZMaXRlU3RhdHVzIEV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworVGZMaXRlU3RhdHVzIEZsb29yRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0ID0KICAgICAgIHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dChjb250ZXh0LCBub2RlLCBrSW5wdXRUZW5zb3IpOwogICBURl9MSVRFX0VOU1VSRV9UWVBFU19FUShjb250ZXh0LCBpbnB1dC0+dHlwZSwga1RmTGl0ZUZsb2F0MzIpOwpAQCAtNDIsNyArNDIsNyBAQAogfSAgLy8gbmFtZXNwYWNlCiAKIFRGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfRkxPT1IoKSB7Ci0gIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKG51bGxwdHIsIG51bGxwdHIsIEV2YWwpOworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChudWxscHRyLCBudWxscHRyLCBGbG9vckV2YWwpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9mbG9vcl9kaXYuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9mbG9vcl9kaXYuY2MKaW5kZXggNWMwMDgwOC4uOWFkZjYxNCAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvZmxvb3JfZGl2LmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2Zsb29yX2Rpdi5jYwpAQCAtNTcsMTEgKzU3LDExIEBACiAgIHJldHVybiBrVGZMaXRlT2s7CiB9CiAKLXZvaWQqIEluaXQoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogYnVmZmVyLCBzaXplX3QgbGVuZ3RoKSB7Cit2b2lkKiBGbG9vckRpdkluaXQoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogYnVmZmVyLCBzaXplX3QgbGVuZ3RoKSB7CiAgIHJldHVybiBudWxscHRyOwogfQogCi1UZkxpdGVTdGF0dXMgUHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgRmxvb3JEaXZQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgcmV0dXJuIENhbGN1bGF0ZU9wRGF0YShjb250ZXh0LCBub2RlKTsKIH0KIApAQCAtMTAxLDcgKzEwMSw3IEBACiAgIHJldHVybiBrVGZMaXRlT2s7CiB9CiAKLVRmTGl0ZVN0YXR1cyBFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBGbG9vckRpdkV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dDEgPQogICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KGNvbnRleHQsIG5vZGUsIGtJbnB1dFRlbnNvcjEpOwogICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dDIgPQpAQCAtMTI0LDcgKzEyNCw3IEBACiB9ICAvLyBuYW1lc3BhY2UKIAogVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9GTE9PUl9ESVYoKSB7Ci0gIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKEluaXQsIFByZXBhcmUsIEV2YWwpOworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChGbG9vckRpdkluaXQsIEZsb29yRGl2UHJlcGFyZSwgRmxvb3JEaXZFdmFsKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvZmxvb3JfbW9kLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvZmxvb3JfbW9kLmNjCmluZGV4IGY0NTk4OTIuLmRhMmE3YzkgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2Zsb29yX21vZC5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9mbG9vcl9tb2QuY2MKQEAgLTYyLDExICs2MiwxMSBAQAogICByZXR1cm4ga1RmTGl0ZU9rOwogfQogCi12b2lkKiBJbml0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgewordm9pZCogRmxvb3JNb2RJbml0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgewogICByZXR1cm4gbnVsbHB0cjsKIH0KIAotVGZMaXRlU3RhdHVzIFByZXBhcmUoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworVGZMaXRlU3RhdHVzIEZsb29yTW9kUHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIHJldHVybiBDYWxjdWxhdGVPcERhdGEoY29udGV4dCwgbm9kZSk7CiB9CiAKQEAgLTk2LDcgKzk2LDcgQEAKICAgcmV0dXJuIGtUZkxpdGVPazsKIH0KIAotVGZMaXRlU3RhdHVzIEV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworVGZMaXRlU3RhdHVzIEZsb29yTW9kRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0MSA9CiAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsSW5wdXQoY29udGV4dCwgbm9kZSwga0lucHV0VGVuc29yMSk7CiAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0MiA9CkBAIC0xMjIsNyArMTIyLDcgQEAKIH0gIC8vIG5hbWVzcGFjZQogCiBURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX0ZMT09SX01PRCgpIHsKLSAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoSW5pdCwgUHJlcGFyZSwgRXZhbCk7CisgIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKEZsb29yTW9kSW5pdCwgRmxvb3JNb2RQcmVwYXJlLCBGbG9vck1vZEV2YWwpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9mdWxseV9jb25uZWN0ZWQuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9mdWxseV9jb25uZWN0ZWQuY2MKaW5kZXggZjczMmIyOS4uNjVjODM3OSAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvZnVsbHlfY29ubmVjdGVkLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2Z1bGx5X2Nvbm5lY3RlZC5jYwpAQCAtMjYsMTMgKzI2LDE0IEBACiBuYW1lc3BhY2UgdGZsaXRlIHsKIG5hbWVzcGFjZSB7CiAKLXZvaWQqIEluaXQoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogYnVmZmVyLCBzaXplX3QgbGVuZ3RoKSB7Cit2b2lkKiBGdWxseUNvbm5lY3RlZEluaXQoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpIHsKICAgVEZMSVRFX0RDSEVDSyhjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIgIT0gbnVsbHB0cik7CiAgIHJldHVybiBjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIoY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoT3BEYXRhRnVsbHlDb25uZWN0ZWQpKTsKIH0KIAotVGZMaXRlU3RhdHVzIFByZXBhcmUoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworVGZMaXRlU3RhdHVzIEZ1bGx5Q29ubmVjdGVkUHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIE1pY3JvQ29udGV4dCogbWljcm9fY29udGV4dCA9IEdldE1pY3JvQ29udGV4dChjb250ZXh0KTsKIAogICBURkxJVEVfRENIRUNLKG5vZGUtPnVzZXJfZGF0YSAhPSBudWxscHRyKTsKQEAgLTg3LDcgKzg4LDcgQEAKICAgcmV0dXJuIGtUZkxpdGVPazsKIH0KIAotVGZMaXRlU3RhdHVzIEV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworVGZMaXRlU3RhdHVzIEZ1bGx5Q29ubmVjdGVkRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIFRGTElURV9EQ0hFQ0sobm9kZS0+YnVpbHRpbl9kYXRhICE9IG51bGxwdHIpOwogICBjb25zdCBhdXRvKiBwYXJhbXMgPQogICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgVGZMaXRlRnVsbHlDb25uZWN0ZWRQYXJhbXMqPihub2RlLT5idWlsdGluX2RhdGEpOwpAQCAtMjAwLDcgKzIwMSwxMiBAQAogfSAgLy8gbmFtZXNwYWNlCiAKIFRGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfRlVMTFlfQ09OTkVDVEVEKCkgewotICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChJbml0LCBQcmVwYXJlLCBFdmFsKTsKKyAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoRnVsbHlDb25uZWN0ZWRJbml0LCBGdWxseUNvbm5lY3RlZFByZXBhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bGx5Q29ubmVjdGVkRXZhbCk7Cit9CisKK1RGTE1JbmZlcmVuY2VSZWdpc3RyYXRpb24gUmVnaXN0ZXJJbmZlcmVuY2VfRlVMTFlfQ09OTkVDVEVEKCkgeworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChGdWxseUNvbm5lY3RlZEV2YWwpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9mdWxseV9jb25uZWN0ZWQuaCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2Z1bGx5X2Nvbm5lY3RlZC5oCmluZGV4IDNmYTYwNjAuLjgzMDg4MzggMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2Z1bGx5X2Nvbm5lY3RlZC5oCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2Z1bGx5X2Nvbm5lY3RlZC5oCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IDIwMjIgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8qIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAKIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtOTUsNiArOTUsMTAgQEAKIC8vIGludDE2LgogVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9GVUxMWV9DT05ORUNURURfSU5UMTYoKTsKIAorLy8gUmV0dXJucyBhIFRGTE1SZWdpc3RyYXRpb24gc3RydWN0IGZvciBrZXJuZWwgdmFyaWFudCB0aGF0IG9ubHkgc3VwcG9ydHMKKy8vIGludDggYW5kIGludDQgcGFja2VkIGtlcm5lbHMuCitURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX0ZVTExZX0NPTk5FQ1RFRF9JTlQ0KCk7CisKICNlbHNlCiAvLyBOb3RlIHRoYXQgd2hpbGUgdGhpcyBibG9jayBnZXRzIHVzZWQgZm9yIGJvdGggcmVmZXJlbmNlIGFuZCBvcHRpbWl6ZWQga2VybmVscwogLy8gdGhhdCBkbyBub3QgaGF2ZSBhbnkgc3BlY2lhbGl6ZWQgaW1wbGVtZW50YXRpb25zLCB0aGUgb25seSBnb2FsIGhlcmUgaXMgdG8KQEAgLTEwNSw2ICsxMDksMTAgQEAKICAgcmV0dXJuIFJlZ2lzdGVyX0ZVTExZX0NPTk5FQ1RFRCgpOwogfQogCitpbmxpbmUgVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9GVUxMWV9DT05ORUNURURfSU5UNCgpIHsKKyAgcmV0dXJuIFJlZ2lzdGVyX0ZVTExZX0NPTk5FQ1RFRCgpOworfQorCiAjZW5kaWYKIAogfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvZnVsbHlfY29ubmVjdGVkX2NvbW1vbi5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2Z1bGx5X2Nvbm5lY3RlZF9jb21tb24uY2MKaW5kZXggNWE4ZDMxMi4uNjZmODc4NyAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvZnVsbHlfY29ubmVjdGVkX2NvbW1vbi5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9mdWxseV9jb25uZWN0ZWRfY29tbW9uLmNjCkBAIC01Nyw2ICs1NywyNCBAQAogICAgIFRmTGl0ZVR5cGUgZGF0YV90eXBlLCBjb25zdCBUZkxpdGVUZW5zb3IqIGlucHV0LCBjb25zdCBUZkxpdGVUZW5zb3IqIGZpbHRlciwKICAgICBjb25zdCBUZkxpdGVUZW5zb3IqIGJpYXMsIFRmTGl0ZVRlbnNvciogb3V0cHV0LAogICAgIE9wRGF0YUZ1bGx5Q29ubmVjdGVkKiBkYXRhKSB7CisgIC8vIFRPRE8oYi8zMjQzODU4MDIpOiBTdXBwb3J0IHBlci1jaGFubmVsIHF1YW50aXphdGlvbiBmb3IgRnVsbHlDb25uZWN0ZWQuCisgIC8vIElmIHlvdSBoYXZlIGhpdCB0aGlzIGZhaWx1cmUgbWVzc2FnZSwgeW91IHdpbGwgbmVlZCB0byBkaXNhYmxlIHRoaXMKKyAgLy8gYmVoYXZpb3IuIFRoaXMgY2FuIGJlIGRvbmUgYnkgc2V0dGluZyB0aGUgZm9sbG93aW5nIGZsYWcgdG8gdHJ1ZToKKyAgLy8gVGZMaXRlQ29udmVydGVyLl9leHBlcmltZW50YWxfZGlzYWJsZV9wZXJfY2hhbm5lbF9xdWFudGl6YXRpb25fZm9yX2RlbnNlX2xheWVycworICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3JmbG93L2Jsb2IvMzc3ZjQ3Njk0ZmE3OTBlOThkYjY2NjViOWFkZWNkZTAwYjVlMGQ2OC90ZW5zb3JmbG93L2xpdGUvcHl0aG9uL2xpdGUucHkjTDY3NAorICBpZiAoZmlsdGVyLT5xdWFudGl6YXRpb24udHlwZSA9PSBrVGZMaXRlQWZmaW5lUXVhbnRpemF0aW9uICYmCisgICAgICBmaWx0ZXItPnF1YW50aXphdGlvbi5wYXJhbXMgIT0gbnVsbHB0cikgeworICAgIFRmTGl0ZUFmZmluZVF1YW50aXphdGlvbiogYWZmaW5lX3F1YW50aXphdGlvbiA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8VGZMaXRlQWZmaW5lUXVhbnRpemF0aW9uKj4oCisgICAgICAgICAgICBmaWx0ZXItPnF1YW50aXphdGlvbi5wYXJhbXMpOworICAgIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIGFmZmluZV9xdWFudGl6YXRpb24tPnNjYWxlKTsKKyAgICBURl9MSVRFX0VOU1VSRV9NU0coCisgICAgICAgIGNvbnRleHQsIGFmZmluZV9xdWFudGl6YXRpb24tPnNjYWxlLT5zaXplID09IDEsCisgICAgICAgICJGdWxseUNvbm5lY3RlZCBwZXItY2hhbm5lbCBxdWFudGl6YXRpb24gbm90IHlldCBzdXBwb3J0ZWQuIFBsZWFzZSBzZXQgIgorICAgICAgICAiY29udmVydGVyLl9leHBlcmltZW50YWxfZGlzYWJsZV9wZXJfY2hhbm5lbF9xdWFudGl6YXRpb25fZm9yX2RlbnNlXyIKKyAgICAgICAgImxheWVycyA9IFRydWUuIik7CisgIH0KKwogICBpZiAoZGF0YV90eXBlICE9IGtUZkxpdGVGbG9hdDMyKSB7CiAgICAgZG91YmxlIHJlYWxfbXVsdGlwbGllciA9IDAuMDsKICAgICBURl9MSVRFX0VOU1VSRV9TVEFUVVMoR2V0UXVhbnRpemVkQ29udm9sdXRpb25NdWx0aXBsZXIoCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9mdWxseV9jb25uZWN0ZWRfdGVzdC5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2Z1bGx5X2Nvbm5lY3RlZF90ZXN0LmNjCmluZGV4IDJlOTIwNmEuLjJhZDEzMjAgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2Z1bGx5X2Nvbm5lY3RlZF90ZXN0LmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2Z1bGx5X2Nvbm5lY3RlZF90ZXN0LmNjCkBAIC0yNDcsNyArMjQ3LDggQEAKICAgICBjb25zdCBUZkxpdGVGdXNlZEFjdGl2YXRpb24gYWN0aXZhdGlvbiwgY29uc3QgZmxvYXQgdG9sZXJhbmNlLAogICAgIGNvbnN0IGludCBvdXRwdXRfbGVuLCBjb25zdCBUKiBnb2xkZW4sIFQqIG91dHB1dF9kYXRhKSB7CiAgIFRmTGl0ZUZ1bGx5Q29ubmVjdGVkUGFyYW1zIGJ1aWx0aW5fZGF0YSA9IHsKLSAgICAgIGFjdGl2YXRpb24sIGtUZkxpdGVGdWxseUNvbm5lY3RlZFdlaWdodHNGb3JtYXREZWZhdWx0LCBmYWxzZSwgZmFsc2V9OworICAgICAgYWN0aXZhdGlvbiwga1RmTGl0ZUZ1bGx5Q29ubmVjdGVkV2VpZ2h0c0Zvcm1hdERlZmF1bHQsIGZhbHNlLCBmYWxzZSwKKyAgICAgIGtUZkxpdGVOb1R5cGV9OwogCiAgIC8vIEF2b2lkIHZhcmlhYmxlIGxlbmd0aCBhcnJheSB3YXJuaW5nLgogICBjb25zdGV4cHIgaW50IGlucHV0c19hcnJheV9sZW4gPSA0OwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvZ2F0aGVyLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvZ2F0aGVyLmNjCmluZGV4IDk5NTU2MDEuLmEwYWY0YzAgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2dhdGhlci5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9nYXRoZXIuY2MKQEAgLTk3LDcgKzk3LDcgQEAKICAgcmV0dXJuIGtUZkxpdGVPazsKIH0KIAotVGZMaXRlU3RhdHVzIFByZXBhcmUoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworVGZMaXRlU3RhdHVzIEdhdGhlclByZXBhcmUoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBNaWNyb0NvbnRleHQqIG1pY3JvX2NvbnRleHQgPSBHZXRNaWNyb0NvbnRleHQoY29udGV4dCk7CiAKICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgTnVtSW5wdXRzKG5vZGUpLCAyKTsKQEAgLTE4OCw3ICsxODgsNyBAQAogICByZXR1cm4ga1RmTGl0ZU9rOwogfQogCi1UZkxpdGVTdGF0dXMgRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgR2F0aGVyRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIGNvbnN0IGF1dG8qIHBhcmFtcyA9CiAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IFRmTGl0ZUdhdGhlclBhcmFtcyo+KG5vZGUtPmJ1aWx0aW5fZGF0YSk7CiAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0ID0KQEAgLTIxOCw3ICsyMTgsNyBAQAogfSAgLy8gbmFtZXNwYWNlCiAKIFRGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfR0FUSEVSKCkgewotICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChudWxscHRyLCBQcmVwYXJlLCBFdmFsKTsKKyAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AobnVsbHB0ciwgR2F0aGVyUHJlcGFyZSwgR2F0aGVyRXZhbCk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSB0ZmxpdGUKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2dhdGhlcl9uZC5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2dhdGhlcl9uZC5jYwppbmRleCAzNzc0ZGRkLi5kMDFhZjdjIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9nYXRoZXJfbmQuY2MKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvZ2F0aGVyX25kLmNjCkBAIC0yOCw3ICsyOCw3IEBACiBjb25zdGV4cHIgaW50IGtPdXRwdXRUZW5zb3IgPSAwOwogY29uc3RleHByIGludCBNQVhfSU5ESUNFU19ORCA9IDU7CiAKLVRmTGl0ZVN0YXR1cyBQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBHYXRoZXJOZFByZXBhcmUoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBNaWNyb0NvbnRleHQqIG1pY3JvX2NvbnRleHQgPSBHZXRNaWNyb0NvbnRleHQoY29udGV4dCk7CiAKICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgTnVtSW5wdXRzKG5vZGUpLCAyKTsKQEAgLTE4NSw3ICsxODUsNyBAQAogICByZXR1cm4gc3RhdHVzOwogfQogCi1UZkxpdGVTdGF0dXMgRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgR2F0aGVyTmRFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogcGFyYW1zID0KICAgICAgIHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dChjb250ZXh0LCBub2RlLCBrUGFyYW1zKTsKICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5kaWNlcyA9CkBAIC0yMDYsNyArMjA2LDcgQEAKIH0gIC8vIG5hbWVzcGFjZQogCiBURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX0dBVEhFUl9ORCgpIHsKLSAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AobnVsbHB0ciwgUHJlcGFyZSwgRXZhbCk7CisgIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKG51bGxwdHIsIEdhdGhlck5kUHJlcGFyZSwgR2F0aGVyTmRFdmFsKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvaWYuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9pZi5jYwppbmRleCA5MTQzYzljLi4wMjk4NDZiIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9pZi5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9pZi5jYwpAQCAtMzgsMTIgKzM4LDEyIEBACiAgIGludCBlbHNlX3N1YmdyYXBoX2luZGV4OwogfTsKIAotdm9pZCogSW5pdChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpIHsKK3ZvaWQqIElmSW5pdChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpIHsKICAgVEZMSVRFX0RDSEVDSyhjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIgIT0gbnVsbHB0cik7CiAgIHJldHVybiBjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIoY29udGV4dCwgc2l6ZW9mKE9wRGF0YSkpOwogfQogCi1UZkxpdGVTdGF0dXMgUHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgSWZQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgT3BEYXRhKiBvcF9kYXRhID0gcmVpbnRlcnByZXRfY2FzdDxPcERhdGEqPihub2RlLT51c2VyX2RhdGEpOwogICBjb25zdCBhdXRvKiBwYXJhbXMgPQogICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUZkxpdGVJZlBhcmFtcyo+KG5vZGUtPmJ1aWx0aW5fZGF0YSk7CkBAIC02Nyw3ICs2Nyw3IEBACiAgIC8vIHBhc3NlZCB0byB0aGUgYnJhbmNoIHN1YmdyYXBocy4gVGhlcmVmb3JlLCB0aGUgbnVtYmVyIG9mIHN1YmdyYXBoIGlucHV0cwogICAvLyB3aWxsIGJlIHRoZSBudW1iZXIgb2Ygbm9kZSBpbnB1dHMgLSAxLgogICBzaXplX3QgbnVtX2lucHV0cyA9IG5vZGUtPmlucHV0cy0+c2l6ZSAtIDE7Ci0gIHNpemVfdCBudW1fb3V0cHV0cyA9IG5vZGUtPm91dHB1dHMtPnNpemU7CisgIHNpemVfdCBudW1fb3V0cHV0cyA9IE51bU91dHB1dHMobm9kZSk7CiAKICAgTWljcm9HcmFwaCYgZ3JhcGhfaW5mbyA9IG1pY3JvX2NvbnRleHQtPmdyYXBoKCk7CiAKQEAgLTg1LDcgKzg1LDcgQEAKICAgcmV0dXJuIGtUZkxpdGVPazsKIH0KIAotVGZMaXRlU3RhdHVzIEV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworVGZMaXRlU3RhdHVzIElmRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIGNvbnN0IE9wRGF0YSogb3BfZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8T3BEYXRhKj4obm9kZS0+dXNlcl9kYXRhKTsKIAogICB0ZmxpdGU6Ok1pY3JvQ29udGV4dCogbWljcm9fY29udGV4dCA9IHRmbGl0ZTo6R2V0TWljcm9Db250ZXh0KGNvbnRleHQpOwpAQCAtMTE3LDcgKzExNyw3IEBACiB9ICAvLyBuYW1lc3BhY2UuCiAKIFRGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfSUYoKSB7Ci0gIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKEluaXQsIFByZXBhcmUsIEV2YWwpOworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChJZkluaXQsIElmUHJlcGFyZSwgSWZFdmFsKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMva2VybmVsX3J1bm5lci5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2tlcm5lbF9ydW5uZXIuY2MKaW5kZXggZDUxMTJhMS4uNzk4MjRlZiAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMva2VybmVsX3J1bm5lci5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9rZXJuZWxfcnVubmVyLmNjCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8qIENvcHlyaWdodCAyMDI0IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAKIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTgsNyArMTgsNiBAQAogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9hcmVuYV9hbGxvY2F0b3Ivc2luZ2xlX2FyZW5hX2J1ZmZlcl9hbGxvY2F0b3IuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fYXJlbmFfY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2xvZy5oIgotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0X2hlbHBlcnMuaCIKIAogbmFtZXNwYWNlIHRmbGl0ZSB7CiBuYW1lc3BhY2UgbWljcm8gewpAQCAtMzcsMTIgKzM2LDIzIEBACiBLZXJuZWxSdW5uZXI6Oktlcm5lbFJ1bm5lcihjb25zdCBURkxNUmVnaXN0cmF0aW9uJiByZWdpc3RyYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZkxpdGVUZW5zb3IqIHRlbnNvcnMsIGludCB0ZW5zb3JzX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZkxpdGVJbnRBcnJheSogaW5wdXRzLCBUZkxpdGVJbnRBcnJheSogb3V0cHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGJ1aWx0aW5fZGF0YSwgVGZMaXRlSW50QXJyYXkqIGludGVybWVkaWF0ZXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBidWlsdGluX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUZkxpdGVJbnRBcnJheSogaW50ZXJtZWRpYXRlcworI2lmZGVmIFVTRV9URkxNX0NPTVBSRVNTSU9OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21wcmVzc2VkVGVuc29yTGlzdCogY29tcHJlc3NlZF90ZW5zb3JzCisjZW5kaWYgIC8vIFVTRV9URkxNX0NPTVBSRVNTSU9OCisgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgOiByZWdpc3RyYXRpb25fKHJlZ2lzdHJhdGlvbiksCiAgICAgICBhbGxvY2F0b3JfKFNpbmdsZUFyZW5hQnVmZmVyQWxsb2NhdG9yOjpDcmVhdGUoa0tlcm5lbFJ1bm5lckJ1ZmZlcl8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tlcm5lbFJ1bm5lckJ1ZmZlclNpemVfKSksCiAgICAgICBtb2NrX21pY3JvX2dyYXBoXyhhbGxvY2F0b3JfKSwKLSAgICAgIGZha2VfbWljcm9fY29udGV4dF8odGVuc29ycywgYWxsb2NhdG9yXywgJm1vY2tfbWljcm9fZ3JhcGhfKSB7CisgICAgICBmYWtlX21pY3JvX2NvbnRleHRfKHRlbnNvcnMsIGFsbG9jYXRvcl8sICZtb2NrX21pY3JvX2dyYXBoXworI2lmZGVmIFVTRV9URkxNX0NPTVBSRVNTSU9OCisgICAgICAgICAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3NlZF90ZW5zb3JzCisjZW5kaWYgIC8vIFVTRV9URkxNX0NPTVBSRVNTSU9OCisgICAgICApIHsKICAgLy8gUHJlcGFyZSBUZkxpdGVDb250ZXh0OgogICBjb250ZXh0Xy5pbXBsXyA9IHN0YXRpY19jYXN0PHZvaWQqPigmZmFrZV9taWNyb19jb250ZXh0Xyk7CiAgIGNvbnRleHRfLlJlcG9ydEVycm9yID0gTWljcm9Db250ZXh0UmVwb3J0T3BFcnJvcjsKQEAgLTU3LDcgKzY3LDcgQEAKICAgLy8gUHJlcGFyZSBUZkxpdGVOb2RlOgogICBub2RlXy5pbnB1dHMgPSBpbnB1dHM7CiAgIG5vZGVfLm91dHB1dHMgPSBvdXRwdXRzOwotICBub2RlXy5idWlsdGluX2RhdGEgPSBidWlsdGluX2RhdGE7CisgIG5vZGVfLmJ1aWx0aW5fZGF0YSA9IGNvbnN0X2Nhc3Q8dm9pZCo+KGJ1aWx0aW5fZGF0YSk7CiAgIG5vZGVfLmludGVybWVkaWF0ZXMgPSBpbnRlcm1lZGlhdGVzOwogfQogCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9rZXJuZWxfcnVubmVyLmggYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9rZXJuZWxfcnVubmVyLmgKaW5kZXggZDYxN2M0NC4uOGRiZDdmOCAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMva2VybmVsX3J1bm5lci5oCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2tlcm5lbF9ydW5uZXIuaApAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgMjAyNCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTM1LDggKzM1LDEzIEBACiAgcHVibGljOgogICBLZXJuZWxSdW5uZXIoY29uc3QgVEZMTVJlZ2lzdHJhdGlvbiYgcmVnaXN0cmF0aW9uLCBUZkxpdGVUZW5zb3IqIHRlbnNvcnMsCiAgICAgICAgICAgICAgICBpbnQgdGVuc29yc19zaXplLCBUZkxpdGVJbnRBcnJheSogaW5wdXRzLAotICAgICAgICAgICAgICAgVGZMaXRlSW50QXJyYXkqIG91dHB1dHMsIHZvaWQqIGJ1aWx0aW5fZGF0YSwKLSAgICAgICAgICAgICAgIFRmTGl0ZUludEFycmF5KiBpbnRlcm1lZGlhdGVzID0gbnVsbHB0cik7CisgICAgICAgICAgICAgICBUZkxpdGVJbnRBcnJheSogb3V0cHV0cywgY29uc3Qgdm9pZCogYnVpbHRpbl9kYXRhLAorICAgICAgICAgICAgICAgVGZMaXRlSW50QXJyYXkqIGludGVybWVkaWF0ZXMgPSBudWxscHRyCisjaWZkZWYgVVNFX1RGTE1fQ09NUFJFU1NJT04KKyAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgIGNvbnN0IENvbXByZXNzZWRUZW5zb3JMaXN0KiBjb21wcmVzc2VkX3RlbnNvcnMgPSBudWxscHRyCisjZW5kaWYgIC8vIFVTRV9URkxNX0NPTVBSRVNTSU9OCisgICk7CiAKICAgLy8gQ2FsbHMgaW5pdCBhbmQgcHJlcGFyZSBvbiB0aGUga2VybmVsIChpLmUuIFRGTE1SZWdpc3RyYXRpb24pIHN0cnVjdC4KICAgLy8gQW55IGV4Y2VwdGlvbnMgd2lsbCBiZSBEZWJ1Z0xvZydkIGFuZCByZXR1cm5lZCBhcyBhIHN0YXR1cyBjb2RlLgpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMva2VybmVsX3V0aWwuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9rZXJuZWxfdXRpbC5jYwppbmRleCBmZmZmYTA4Li5hNTA5ZjVkIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9rZXJuZWxfdXRpbC5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9rZXJuZWxfdXRpbC5jYwpAQCAtNTMsNiArNTMsMTUgQEAKICAgICAgICAgICAvKmN1c3RvbV9uYW1lPSovbnVsbHB0cn07CiB9CiAKK1RGTE1JbmZlcmVuY2VSZWdpc3RyYXRpb24gUmVnaXN0ZXJPcCgKKyAgICBUZkxpdGVTdGF0dXMgKCppbnZva2UpKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpLAorICAgIHZvaWQgKCpyZXNldCkoVGZMaXRlQ29udGV4dCogY29udGV4dCwgdm9pZCogYnVmZmVyKSkgeworICByZXR1cm4geworICAgICAgLyppbnZva2U9Ki9pbnZva2UsCisgICAgICAvKnJlc2V0Ki8gcmVzZXQsCisgIH07Cit9CisKIC8vIFJldHVybnMgYSBtdXRhYmxlIHRlbnNvciBmb3IgYSBnaXZlbiBpbnB1dCBpbmRleC4gaXNfdmFyaWFibGUgbXVzdCBiZSBjaGVja2VkCiAvLyBkdXJpbmcgcHJlcGFyZSB3aGVuIHRoZSBmdWxsIFRmTGl0ZVRlbnNvciBpcyBhdmFpbGFibGUuCiBUZkxpdGVFdmFsVGVuc29yKiBHZXRNdXRhYmxlRXZhbElucHV0KGNvbnN0IFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsCkBAIC0yNDMsNiArMjUyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGZMaXRlTm9kZSogbm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWljcm9HcmFwaCogZ3JhcGhfaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1YmdyYXBoX2lkeCkgeworICBpZiAoZ3JhcGhfaW5mby0+TnVtU3ViZ3JhcGhPdXRwdXRzKHN1YmdyYXBoX2lkeCkgPT0gMCkgcmV0dXJuIGtUZkxpdGVPazsKICAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgc3RhdGljX2Nhc3Q8c2l6ZV90Pihub2RlLT5vdXRwdXRzLT5zaXplKSA9PQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGhfaW5mby0+TnVtU3ViZ3JhcGhPdXRwdXRzKHN1YmdyYXBoX2lkeCkpOwogICBmb3IgKGludCBpID0gMDsgaSA8IG5vZGUtPm91dHB1dHMtPnNpemU7IGkrKykgewpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMva2VybmVsX3V0aWwuaCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2tlcm5lbF91dGlsLmgKaW5kZXggMDgwYTBiMy4uOTc3ZWQ5NSAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMva2VybmVsX3V0aWwuaAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9rZXJuZWxfdXRpbC5oCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IDIwMjEgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8qIENvcHlyaWdodCAyMDI0IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAKIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMzUsNiArMzUsMTAgQEAKICAgICB2b2lkICgqZnJlZSkoVGZMaXRlQ29udGV4dCogY29udGV4dCwgdm9pZCogYnVmZmVyKSA9IG51bGxwdHIsCiAgICAgdm9pZCAoKnJlc2V0KShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCB2b2lkKiBidWZmZXIpID0gbnVsbHB0cik7CiAKK1RGTE1JbmZlcmVuY2VSZWdpc3RyYXRpb24gUmVnaXN0ZXJPcCgKKyAgICBUZkxpdGVTdGF0dXMgKCppbnZva2UpKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpLAorICAgIHZvaWQgKCpyZXNldCkoVGZMaXRlQ29udGV4dCogY29udGV4dCwgdm9pZCogYnVmZmVyKSA9IG51bGxwdHIpOworCiAvLyBQcmludHMgb3V0IG4gYnl0ZXMgaW4gYSBpbnQ4X3QgYnVmZmVyIGFzIGhleAogdm9pZCBQcmludE5CeXRlcyhjb25zdCBpbnQ4X3QqIHRlbnNvcl9kYXRhLCBpbnQgbl9ieXRlcywKICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcHJlZml4ID0gbnVsbHB0cik7CkBAIC04Nyw2ICs5MSwzMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByZWludGVycHJldF9jYXN0PGNvbnN0IFQqPih0ZW5zb3ItPmRhdGEucmF3KTsKIH0KIAorI2lmZGVmIFVTRV9URkxNX0NPTVBSRVNTSU9OCisKKy8vIE92ZXJsb2FkcyBleGlzdGluZyBHZXRUZW5zb3JEYXRhLiBJZiBub3QgY29tcHJlc3NlZCwgdGhpcyB3aWxsIHJldHVybgorLy8gdGVuc29yLT5kYXRhLgorLy8KKy8vIFRPRE8oZGRhdmlzLTIwMTUpOiBtYWtlIG1pY3JvX2NvbnRleHQgYSBjb25zdCBwb2ludGVyCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NvbnN0IFQqIEdldFRlbnNvckRhdGEoTWljcm9Db250ZXh0KiBtaWNyb19jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiB0ZW5zb3IsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbXByZXNzaW9uVGVuc29yRGF0YSogY29tcHJlc3Npb25fZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IHNjcmF0Y2hfYnVmZmVyX2hhbmRsZSkgeworICBpZiAodGVuc29yID09IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICBpZiAoY29tcHJlc3Npb25fZGF0YSA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCo+KHRlbnNvci0+ZGF0YS5kYXRhKTsKKyAgfQorCisgIHZvaWQqIHVuY29tcHJlc3NlZF9kYXRhID0gbWljcm9fY29udGV4dC0+RGVjb21wcmVzc1RlbnNvclRvU2NyYXRjaEJ1ZmZlcigKKyAgICAgICp0ZW5zb3IsICpjb21wcmVzc2lvbl9kYXRhLCBzY3JhdGNoX2J1ZmZlcl9oYW5kbGUpOworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUKj4odW5jb21wcmVzc2VkX2RhdGEpOworfQorCisjZW5kaWYgIC8vIFVTRV9URkxNX0NPTVBSRVNTSU9OCisKIC8vIFJldHVybnMgdGhlIHNoYXBlIG9mIGEgVGZMaXRlRXZhbFRlbnNvciBzdHJ1Y3QuCiBjb25zdCBSdW50aW1lU2hhcGUgR2V0VGVuc29yU2hhcGUoY29uc3QgVGZMaXRlRXZhbFRlbnNvciogdGVuc29yKTsKIApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvbDJub3JtLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvbDJub3JtLmNjCmluZGV4IGZhMzYwMWIuLmJkZTM4ZGUgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2wybm9ybS5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9sMm5vcm0uY2MKQEAgLTMzLDcgKzMzLDcgQEAKIGNvbnN0ZXhwciBpbnQga0lucHV0VGVuc29yID0gMDsKIGNvbnN0ZXhwciBpbnQga091dHB1dFRlbnNvciA9IDA7CiAKLVRmTGl0ZVN0YXR1cyBQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBMMk5vcm1QcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgVEZMSVRFX0RDSEVDSyhub2RlLT51c2VyX2RhdGEgIT0gbnVsbHB0cik7CiAgIFRGTElURV9EQ0hFQ0sobm9kZS0+YnVpbHRpbl9kYXRhICE9IG51bGxwdHIpOwogCkBAIC03MiwxMyArNzIsMTMgQEAKICAgcmV0dXJuIGtUZkxpdGVPazsKIH0KIAotdm9pZCogSW5pdChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpIHsKK3ZvaWQqIEwyTm9ybUluaXQoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogYnVmZmVyLCBzaXplX3QgbGVuZ3RoKSB7CiAgIFRGTElURV9EQ0hFQ0soY29udGV4dC0+QWxsb2NhdGVQZXJzaXN0ZW50QnVmZmVyICE9IG51bGxwdHIpOwogICByZXR1cm4gY29udGV4dC0+QWxsb2NhdGVQZXJzaXN0ZW50QnVmZmVyKGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEwyTm9ybWFsaXphdGlvblBhcmFtcykpOwogfQogCi1UZkxpdGVTdGF0dXMgRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgTDJOb3JtRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIFRGTElURV9EQ0hFQ0sobm9kZS0+dXNlcl9kYXRhICE9IG51bGxwdHIpOwogICBjb25zdCBMMk5vcm1hbGl6YXRpb25QYXJhbXMmIGRhdGEgPQogICAgICAgKihzdGF0aWNfY2FzdDxjb25zdCBMMk5vcm1hbGl6YXRpb25QYXJhbXMqPihub2RlLT51c2VyX2RhdGEpKTsKQEAgLTEzMiw3ICsxMzIsNyBAQAogfSAgLy8gbmFtZXNwYWNlCiAKIFRGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfTDJOT1JNX1JFRigpIHsKLSAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoSW5pdCwgUHJlcGFyZSwgRXZhbCk7CisgIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKEwyTm9ybUluaXQsIEwyTm9ybVByZXBhcmUsIEwyTm9ybUV2YWwpOwogfQogCiBURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX0wyX05PUk1BTElaQVRJT04oKSB7IHJldHVybiBSZWdpc3Rlcl9MMk5PUk1fUkVGKCk7IH0KZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2xzdG1fZXZhbF90ZXN0LmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvbHN0bV9ldmFsX3Rlc3QuY2MKaW5kZXggNTNjMGQ3Yy4uZWFiYTJjNCAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvbHN0bV9ldmFsX3Rlc3QuY2MKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvbHN0bV9ldmFsX3Rlc3QuY2MKQEAgLTQ1NCw2ICs0NTQsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbF9zdGF0ZV90b2xlcmFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl9ub2RlX2NvbnRlbnRzKTsKIH0KLQogI2VuZGlmICAvLyAhZGVmaW5lZChYVEVOU0EpCisKIFRGX0xJVEVfTUlDUk9fVEVTVFNfRU5ECmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9taWNyb19vcHMuaCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL21pY3JvX29wcy5oCmluZGV4IDViZmZhMDkuLjJlMzNhNjcgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL21pY3JvX29wcy5oCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL21pY3JvX29wcy5oCkBAIC00MCw2ICs0MCw3IEBACiBURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX0FSR19NSU4oKTsKIFRGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfQVNTSUdOX1ZBUklBQkxFKCk7CiBURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX0FWRVJBR0VfUE9PTF8yRCgpOworVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9CQVRDSF9NQVRNVUwoKTsKIFRGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfQkFUQ0hfVE9fU1BBQ0VfTkQoKTsKIFRGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfQlJPQURDQVNUX0FSR1MoKTsKIFRGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfQlJPQURDQVNUX1RPKCk7CkBAIC0xMzMsNiArMTM0LDkgQEAKIFRGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfV0hJTEUoKTsKIFRGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfWkVST1NfTElLRSgpOwogCisvLyBUT0RPKGIvMjk1MTc0Mzg4KTogQWRkIHRoZSByZXN0IG9mIGluZmVyZW5jZSBvbmx5IHJlZ2lzdHJhdGlvbiBmdW5jdGlvbnMuCitURkxNSW5mZXJlbmNlUmVnaXN0cmF0aW9uIFJlZ2lzdGVySW5mZXJlbmNlX0ZVTExZX0NPTk5FQ1RFRCgpOworCiAvLyBUT0RPKGIvMTYwMjM0MTc5KTogQ2hhbmdlIGN1c3RvbSBPUHMgdG8gYWxzbyByZXR1cm4gYnkgdmFsdWUuCiBuYW1lc3BhY2UgdGZsbV9zaWduYWwgewogVEZMTVJlZ2lzdHJhdGlvbiogUmVnaXN0ZXJfREVMQVkoKTsKQEAgLTE0NCw2ICsxNDgsNyBAQAogVEZMTVJlZ2lzdHJhdGlvbiogUmVnaXN0ZXJfRU5FUkdZKCk7CiBURkxNUmVnaXN0cmF0aW9uKiBSZWdpc3Rlcl9GUkFNRVIoKTsKIFRGTE1SZWdpc3RyYXRpb24qIFJlZ2lzdGVyX09WRVJMQVBfQUREKCk7CitURkxNUmVnaXN0cmF0aW9uKiBSZWdpc3Rlcl9QQ0FOKCk7CiBURkxNUmVnaXN0cmF0aW9uKiBSZWdpc3Rlcl9TVEFDS0VSKCk7CiBURkxNUmVnaXN0cmF0aW9uKiBSZWdpc3Rlcl9XSU5ET1coKTsKIH0gIC8vIG5hbWVzcGFjZSB0ZmxtX3NpZ25hbApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvbWlycm9yX3BhZC5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL21pcnJvcl9wYWQuY2MKaW5kZXggNGNiYWY1Mi4uYWE5NGUxYiAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvbWlycm9yX3BhZC5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9taXJyb3JfcGFkLmNjCkBAIC0xMDAsNyArMTAwLDcgQEAKICAgfQogfQogCi1UZkxpdGVTdGF0dXMgRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgTWlycm9yUGFkRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIFRGTElURV9EQ0hFQ0sobm9kZS0+dXNlcl9kYXRhICE9IG51bGxwdHIpOwogICBUZkxpdGVTdGF0dXMgc3RhdHVzID0ga1RmTGl0ZU9rOwogICBjb25zdCBPcERhdGFNaXJyb3JQYWQqIGRhdGEgPQpAQCAtMTYxLDEyICsxNjEsMTIgQEAKICAgcmV0dXJuIHN0YXR1czsKIH0KIAotdm9pZCogSW5pdChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpIHsKK3ZvaWQqIE1pcnJvclBhZEluaXQoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogYnVmZmVyLCBzaXplX3QgbGVuZ3RoKSB7CiAgIFRGTElURV9EQ0hFQ0soY29udGV4dC0+QWxsb2NhdGVQZXJzaXN0ZW50QnVmZmVyICE9IG51bGxwdHIpOwogICByZXR1cm4gY29udGV4dC0+QWxsb2NhdGVQZXJzaXN0ZW50QnVmZmVyKGNvbnRleHQsIHNpemVvZihPcERhdGFNaXJyb3JQYWQpKTsKIH0KIAotVGZMaXRlU3RhdHVzIFByZXBhcmUoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworVGZMaXRlU3RhdHVzIE1pcnJvclBhZFByZXBhcmUoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBNaWNyb0NvbnRleHQqIG1pY3JvX2NvbnRleHQgPSBHZXRNaWNyb0NvbnRleHQoY29udGV4dCk7CiAKICAgVEZMSVRFX0RDSEVDSyhub2RlLT51c2VyX2RhdGEgIT0gbnVsbHB0cik7CkBAIC0yMDksNyArMjA5LDggQEAKIH0gIC8vIG5hbWVzcGFjZQogCiBURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX01JUlJPUl9QQUQoKSB7Ci0gIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKEluaXQsIFByZXBhcmUsIEV2YWwpOworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChNaXJyb3JQYWRJbml0LCBNaXJyb3JQYWRQcmVwYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaXJyb3JQYWRFdmFsKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvbmVnLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvbmVnLmNjCmluZGV4IGM4MGE4MDkuLmE3NmFjMDEgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL25lZy5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9uZWcuY2MKQEAgLTI3LDcgKzI3LDcgQEAKIGNvbnN0ZXhwciBpbnQga0lucHV0VGVuc29yID0gMDsKIGNvbnN0ZXhwciBpbnQga091dHB1dFRlbnNvciA9IDA7CiAKLVRmTGl0ZVN0YXR1cyBFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBOZWdFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXQgPQogICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KGNvbnRleHQsIG5vZGUsIGtJbnB1dFRlbnNvcik7CiAgIFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dCA9CkBAIC01MSw3ICs1MSw3IEBACiB9ICAvLyBuYW1lc3BhY2UKIAogVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9ORUcoKSB7Ci0gIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKG51bGxwdHIsIG51bGxwdHIsIEV2YWwpOworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChudWxscHRyLCBudWxscHRyLCBOZWdFdmFsKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvcGFjay5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3BhY2suY2MKaW5kZXggNWVlMjc1OS4uMGNmZDkxYiAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvcGFjay5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9wYWNrLmNjCkBAIC02OSw3ICs2OSw3IEBACiAgIHJldHVybiBrVGZMaXRlT2s7CiB9CiAKLVRmTGl0ZVN0YXR1cyBFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBQYWNrRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIGNvbnN0IFRmTGl0ZVBhY2tQYXJhbXMqIGRhdGEgPQogICAgICAgcmVpbnRlcnByZXRfY2FzdDxUZkxpdGVQYWNrUGFyYW1zKj4obm9kZS0+YnVpbHRpbl9kYXRhKTsKIApAQCAtMTA5LDcgKzEwOSw3IEBACiB9ICAvLyBuYW1lc3BhY2UKIAogVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9QQUNLKCkgewotICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChudWxscHRyLCBudWxscHRyLCBFdmFsKTsKKyAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AobnVsbHB0ciwgbnVsbHB0ciwgUGFja0V2YWwpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9wYWQuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9wYWQuY2MKaW5kZXggZjhkNDBhZC4uMjlmMDhmYSAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvcGFkLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3BhZC5jYwpAQCAtMzIsMTIgKzMyLDEyIEBACiAgIGludDMyX3Qgb3V0cHV0X3plcm9fcG9pbnQ7CiB9OwogCi12b2lkKiBJbml0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgewordm9pZCogUGFkSW5pdChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpIHsKICAgVEZMSVRFX0RDSEVDSyhjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIgIT0gbnVsbHB0cik7CiAgIHJldHVybiBjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIoY29udGV4dCwgc2l6ZW9mKE9wRGF0YSkpOwogfQogCi1UZkxpdGVTdGF0dXMgRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgUGFkRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIFRGTElURV9EQ0hFQ0sobm9kZS0+dXNlcl9kYXRhICE9IG51bGxwdHIpOwogICBjb25zdCBPcERhdGEqIGRhdGEgPSBzdGF0aWNfY2FzdDxjb25zdCBPcERhdGEqPihub2RlLT51c2VyX2RhdGEpOwogCkBAIC0yMTgsMTIgKzIxOCwxMiBAQAogfQogCiBURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX1BBRCgpIHsKLSAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoSW5pdCwgUGFkUHJlcGFyZSwgRXZhbCk7CisgIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKFBhZEluaXQsIFBhZFByZXBhcmUsIFBhZEV2YWwpOwogfQogCiAvLyBBbHNvIHJlZ2lzdGVyIFBhZCBhcyBQYWRWMi4KIFRGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfUEFEVjIoKSB7Ci0gIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKEluaXQsIFBhZFByZXBhcmUsIEV2YWwpOworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChQYWRJbml0LCBQYWRQcmVwYXJlLCBQYWRFdmFsKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvcG9vbGluZy5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3Bvb2xpbmcuY2MKaW5kZXggZTAzZjcyZS4uYzE3OGQ5YiAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvcG9vbGluZy5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9wb29saW5nLmNjCkBAIC05MSw3ICs5MSw3IEBACiAgIHJldHVybiBrVGZMaXRlT2s7CiB9CiAKLXZvaWQqIEluaXQoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogYnVmZmVyLCBzaXplX3QgbGVuZ3RoKSB7Cit2b2lkKiBQb29sSW5pdChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpIHsKICAgVEZMSVRFX0RDSEVDSyhjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIgIT0gbnVsbHB0cik7CiAgIHJldHVybiBjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIoY29udGV4dCwgc2l6ZW9mKE9wRGF0YVBvb2xpbmcpKTsKIH0KQEAgLTk5LDExICs5OSwxMSBAQAogfSAgLy8gbmFtZXNwYWNlCiAKIFRGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfQVZFUkFHRV9QT09MXzJEKCkgewotICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChJbml0LCBQb29saW5nUHJlcGFyZSwgQXZlcmFnZUV2YWwpOworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChQb29sSW5pdCwgUG9vbGluZ1ByZXBhcmUsIEF2ZXJhZ2VFdmFsKTsKIH0KIAogVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9NQVhfUE9PTF8yRCgpIHsKLSAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoSW5pdCwgUG9vbGluZ1ByZXBhcmUsIE1heEV2YWwpOworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChQb29sSW5pdCwgUG9vbGluZ1ByZXBhcmUsIE1heEV2YWwpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9xdWFudGl6ZS5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3F1YW50aXplLmNjCmluZGV4IDFhYzY5NDIuLmJhMTFmMTkgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3F1YW50aXplLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3F1YW50aXplLmNjCkBAIC0yNSw3ICsyNSw4IEBACiBuYW1lc3BhY2UgdGZsaXRlIHsKIG5hbWVzcGFjZSB7CiAKLXZvaWQqIEluaXQoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogYnVmZmVyLCBzaXplX3QgbGVuZ3RoKSB7Cit2b2lkKiBJbml0UXVhbnRpemVSZWZlcmVuY2UoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpIHsKICAgVEZMSVRFX0RDSEVDSyhjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIgIT0gbnVsbHB0cik7CiAgIHJldHVybiBjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIoY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoT3BEYXRhUXVhbnRpemVSZWZlcmVuY2UpKTsKQEAgLTM0LDggKzM1LDggQEAKIH0gIC8vIG5hbWVzcGFjZQogCiBURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX1FVQU5USVpFKCkgewotICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChJbml0LCBQcmVwYXJlUXVhbnRpemVSZWZlcmVuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2YWxRdWFudGl6ZVJlZmVyZW5jZSk7CisgIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKAorICAgICAgSW5pdFF1YW50aXplUmVmZXJlbmNlLCBQcmVwYXJlUXVhbnRpemVSZWZlcmVuY2UsIEV2YWxRdWFudGl6ZVJlZmVyZW5jZSk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSB0ZmxpdGUKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3JlZHVjZS5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3JlZHVjZS5jYwppbmRleCBhYjI0YTgyLi5hNjg5ZDNiIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9yZWR1Y2UuY2MKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvcmVkdWNlLmNjCkBAIC0yOSw3ICsyOSw5IEBACiBuYW1lc3BhY2UgdGZsaXRlIHsKIAogdm9pZCogSW5pdFJlZHVjZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpIHsKLSAgcmV0dXJuIGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlcihjb250ZXh0LCBzaXplb2YoT3BEYXRhUmVkdWNlKSk7CisgIHZvaWQqIG9wX2RhdGEgPQorICAgICAgY29udGV4dC0+QWxsb2NhdGVQZXJzaXN0ZW50QnVmZmVyKGNvbnRleHQsIHNpemVvZihPcERhdGFSZWR1Y2UpKTsKKyAgcmV0dXJuIG5ldyAob3BfZGF0YSkgT3BEYXRhUmVkdWNlKCk7CiB9CiAKIFRmTGl0ZVN0YXR1cyBQcmVwYXJlTWF4KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3JlZHVjZV9jb21tb24uY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9yZWR1Y2VfY29tbW9uLmNjCmluZGV4IDBkYWI0OWMuLjJjMWE5MmEgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3JlZHVjZV9jb21tb24uY2MKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvcmVkdWNlX2NvbW1vbi5jYwpAQCAtNzQsNyArNzQsOSBAQAogICBUZkxpdGVUZW5zb3IqIG91dHB1dCA9IG1pY3JvX2NvbnRleHQtPkFsbG9jYXRlVGVtcE91dHB1dFRlbnNvcihub2RlLCAwKTsKICAgVGZMaXRlVGVuc29yKiBheGlzID0gbWljcm9fY29udGV4dC0+QWxsb2NhdGVUZW1wSW5wdXRUZW5zb3Iobm9kZSwgMSk7CiAKKyAgb3BfZGF0YS0+aW5wdXRfenAgPSBpbnB1dC0+cGFyYW1zLnplcm9fcG9pbnQ7CiAgIG9wX2RhdGEtPmlucHV0X3NjYWxlID0gaW5wdXQtPnBhcmFtcy5zY2FsZTsKKyAgb3BfZGF0YS0+b3V0cHV0X3pwID0gb3V0cHV0LT5wYXJhbXMuemVyb19wb2ludDsKICAgb3BfZGF0YS0+b3V0cHV0X3NjYWxlID0gb3V0cHV0LT5wYXJhbXMuc2NhbGU7CiAgIG9wX2RhdGEtPm51bV9vdXRwdXRfZWxlbWVudHMgPSBOdW1FbGVtZW50cyhvdXRwdXQpOwogCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9yZXNoYXBlLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvcmVzaGFwZS5jYwppbmRleCA0ZTZjNTMwLi41NTI3Nzk4IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9yZXNoYXBlLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3Jlc2hhcGUuY2MKQEAgLTI5LDcgKzI5LDcgQEAKIG5hbWVzcGFjZSB0ZmxpdGUgewogbmFtZXNwYWNlIHsKIAotVGZMaXRlU3RhdHVzIEV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworVGZMaXRlU3RhdHVzIEV2YWxSZXNoYXBlUmVmZXJlbmNlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXQgPQogICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KGNvbnRleHQsIG5vZGUsIGtSZXNoYXBlSW5wdXRUZW5zb3IpOwogICBUZkxpdGVFdmFsVGVuc29yKiBvdXRwdXQgPQpAQCAtNTIsNyArNTIsOCBAQAogfSAgLy8gbmFtZXNwYWNlCiAKIFRGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfUkVTSEFQRSgpIHsKLSAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AobnVsbHB0ciwgUHJlcGFyZVJlc2hhcGVSZWZlcmVuY2UsIEV2YWwpOworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChudWxscHRyLCBQcmVwYXJlUmVzaGFwZVJlZmVyZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZhbFJlc2hhcGVSZWZlcmVuY2UpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9yZXNpemVfYmlsaW5lYXIuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9yZXNpemVfYmlsaW5lYXIuY2MKaW5kZXggZTcwMWUwMy4uYWI1NGU4MSAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvcmVzaXplX2JpbGluZWFyLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3Jlc2l6ZV9iaWxpbmVhci5jYwpAQCAtMzAsNyArMzAsNyBAQAogY29uc3RleHByIGludCBrU2l6ZVRlbnNvciA9IDE7CiBjb25zdGV4cHIgaW50IGtPdXRwdXRUZW5zb3IgPSAwOwogCi1UZkxpdGVTdGF0dXMgUHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgUmVzaXplQmlsaW5lYXJQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgTWljcm9Db250ZXh0KiBtaWNyb19jb250ZXh0ID0gR2V0TWljcm9Db250ZXh0KGNvbnRleHQpOwogCiAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bUlucHV0cyhub2RlKSwgMik7CkBAIC02Niw3ICs2Niw3IEBACiAgIHJldHVybiBrVGZMaXRlT2s7CiB9CiAKLVRmTGl0ZVN0YXR1cyBFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBSZXNpemVCaWxpbmVhckV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBhdXRvKiBwYXJhbXMgPQogICAgICAgcmVpbnRlcnByZXRfY2FzdDxUZkxpdGVSZXNpemVCaWxpbmVhclBhcmFtcyo+KG5vZGUtPmJ1aWx0aW5fZGF0YSk7CiAKQEAgLTExMCw3ICsxMTAsOCBAQAogfSAgLy8gbmFtZXNwYWNlCiAKIFRGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfUkVTSVpFX0JJTElORUFSKCkgewotICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChudWxscHRyLCBQcmVwYXJlLCBFdmFsKTsKKyAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AobnVsbHB0ciwgUmVzaXplQmlsaW5lYXJQcmVwYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNpemVCaWxpbmVhckV2YWwpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9yZXNpemVfbmVhcmVzdF9uZWlnaGJvci5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3Jlc2l6ZV9uZWFyZXN0X25laWdoYm9yLmNjCmluZGV4IDQ2YjZlYTEuLmVmMmQzNWQgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3Jlc2l6ZV9uZWFyZXN0X25laWdoYm9yLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3Jlc2l6ZV9uZWFyZXN0X25laWdoYm9yLmNjCkBAIC0zMSw3ICszMSw4IEBACiBjb25zdGV4cHIgaW50IGtTaXplVGVuc29yID0gMTsKIGNvbnN0ZXhwciBpbnQga091dHB1dFRlbnNvciA9IDA7CiAKLVRmTGl0ZVN0YXR1cyBQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBSZXNpemVOZWFyZXN0TmVpZ2hib3JQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIE1pY3JvQ29udGV4dCogbWljcm9fY29udGV4dCA9IEdldE1pY3JvQ29udGV4dChjb250ZXh0KTsKIAogICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBOdW1JbnB1dHMobm9kZSksIDIpOwpAQCAtNjUsNyArNjYsOCBAQAogICByZXR1cm4ga1RmTGl0ZU9rOwogfQogCi1UZkxpdGVTdGF0dXMgRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgUmVzaXplTmVhcmVzdE5laWdoYm9yRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGZMaXRlTm9kZSogbm9kZSkgewogICBhdXRvKiBwYXJhbXMgPQogICAgICAgcmVpbnRlcnByZXRfY2FzdDxUZkxpdGVSZXNpemVOZWFyZXN0TmVpZ2hib3JQYXJhbXMqPihub2RlLT5idWlsdGluX2RhdGEpOwogCkBAIC0xMTcsNyArMTE5LDggQEAKIH0gIC8vIG5hbWVzcGFjZQogCiBURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX1JFU0laRV9ORUFSRVNUX05FSUdIQk9SKCkgewotICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChudWxscHRyLCBQcmVwYXJlLCBFdmFsKTsKKyAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AobnVsbHB0ciwgUmVzaXplTmVhcmVzdE5laWdoYm9yUHJlcGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzaXplTmVhcmVzdE5laWdoYm9yRXZhbCk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSB0ZmxpdGUKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3JvdW5kLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvcm91bmQuY2MKaW5kZXggYTQyMzQ5ZS4uYWU4ZTM1NCAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvcm91bmQuY2MKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvcm91bmQuY2MKQEAgLTI2LDcgKzI2LDcgQEAKIGNvbnN0ZXhwciBpbnQga0lucHV0VGVuc29yID0gMDsKIGNvbnN0ZXhwciBpbnQga091dHB1dFRlbnNvciA9IDA7CiAKLVRmTGl0ZVN0YXR1cyBQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBSb3VuZFByZXBhcmUoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBNaWNyb0NvbnRleHQqIG1pY3JvX2NvbnRleHQgPSBHZXRNaWNyb0NvbnRleHQoY29udGV4dCk7CiAKICAgVGZMaXRlVGVuc29yKiBpbnB1dCA9CkBAIC01MCw3ICs1MCw3IEBACiAgIHJldHVybiBrVGZMaXRlT2s7CiB9CiAKLVRmTGl0ZVN0YXR1cyBFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBSb3VuZEV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dCA9CiAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsSW5wdXQoY29udGV4dCwgbm9kZSwga0lucHV0VGVuc29yKTsKICAgVGZMaXRlRXZhbFRlbnNvciogb3V0cHV0ID0KQEAgLTY2LDcgKzY2LDcgQEAKIH0gIC8vIG5hbWVzcGFjZQogCiBURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX1JPVU5EKCkgewotICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChudWxscHRyLCBQcmVwYXJlLCBFdmFsKTsKKyAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AobnVsbHB0ciwgUm91bmRQcmVwYXJlLCBSb3VuZEV2YWwpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9zaGFwZS5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3NoYXBlLmNjCmluZGV4IGEzOWJmYzAuLmQ5NWU0NTAgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3NoYXBlLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3NoYXBlLmNjCkBAIC0zNSwxNCArMzUsMTQgQEAKICAgfQogfQogCi1UZkxpdGVTdGF0dXMgUHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgU2hhcGVQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgTnVtSW5wdXRzKG5vZGUpLCAxKTsKICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgTnVtT3V0cHV0cyhub2RlKSwgMSk7CiAKICAgcmV0dXJuIGtUZkxpdGVPazsKIH0KIAotVGZMaXRlU3RhdHVzIEV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworVGZMaXRlU3RhdHVzIFNoYXBlRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0ID0KICAgICAgIHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dChjb250ZXh0LCBub2RlLCBrSW5wdXRUZW5zb3IpOwogICBUZkxpdGVFdmFsVGVuc29yKiBvdXRwdXQgPQpAQCAtNjEsNyArNjEsNyBAQAogfSAgLy8gbmFtZXNwYWNlCiAKIFRGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfU0hBUEUoKSB7Ci0gIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKG51bGxwdHIsIFByZXBhcmUsIEV2YWwpOworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChudWxscHRyLCBTaGFwZVByZXBhcmUsIFNoYXBlRXZhbCk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSB0ZmxpdGUKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3NsaWNlLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvc2xpY2UuY2MKaW5kZXggOTczZGExOC4uNzk2MzQyNSAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvc2xpY2UuY2MKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvc2xpY2UuY2MKQEAgLTQ0LDcgKzQ0LDcgQEAKICAgfQogfQogCi1UZkxpdGVTdGF0dXMgUHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgU2xpY2VQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgTWljcm9Db250ZXh0KiBtaWNyb19jb250ZXh0ID0gR2V0TWljcm9Db250ZXh0KGNvbnRleHQpOwogCiAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bUlucHV0cyhub2RlKSwgMyk7CkBAIC04MSw3ICs4MSw3IEBACiAgIHJldHVybiBrVGZMaXRlT2s7CiB9CiAKLVRmTGl0ZVN0YXR1cyBFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBTbGljZUV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dCA9CiAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsSW5wdXQoY29udGV4dCwgbm9kZSwga0lucHV0VGVuc29yKTsKICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogYmVnaW4gPQpAQCAtMTU4LDcgKzE1OCw3IEBACiB9ICAvLyBuYW1lc3BhY2UKIAogVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9TTElDRSgpIHsKLSAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AobnVsbHB0ciwgUHJlcGFyZSwgRXZhbCk7CisgIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKG51bGxwdHIsIFNsaWNlUHJlcGFyZSwgU2xpY2VFdmFsKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvc3BhY2VfdG9fYmF0Y2hfbmQuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9zcGFjZV90b19iYXRjaF9uZC5jYwppbmRleCA2YjUzNmVlLi5mOGRmMTQ5IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9zcGFjZV90b19iYXRjaF9uZC5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9zcGFjZV90b19iYXRjaF9uZC5jYwpAQCAtMzksMTIgKzM5LDEzIEBACiBjb25zdCBpbnQga0lucHV0T3V0cHV0TWluRGltZW5zaW9uTnVtID0gMzsKIGNvbnN0IGludCBrSW5wdXRPdXRwdXRNYXhEaW1lbnNpb25OdW0gPSA0OwogCi12b2lkKiBJbml0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgewordm9pZCogU3BhY2VUb0JhdGNoTkRJbml0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKSB7CiAgIFRGTElURV9EQ0hFQ0soY29udGV4dC0+QWxsb2NhdGVQZXJzaXN0ZW50QnVmZmVyICE9IG51bGxwdHIpOwogICByZXR1cm4gY29udGV4dC0+QWxsb2NhdGVQZXJzaXN0ZW50QnVmZmVyKGNvbnRleHQsIHNpemVvZihTcGFjZVRvQmF0Y2hQYXJhbXMpKTsKIH0KIAotVGZMaXRlU3RhdHVzIFByZXBhcmUoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworVGZMaXRlU3RhdHVzIFNwYWNlVG9CYXRjaE5EUHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIE1pY3JvQ29udGV4dCogbWljcm9fY29udGV4dCA9IEdldE1pY3JvQ29udGV4dChjb250ZXh0KTsKIAogICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBOdW1JbnB1dHMobm9kZSksIDMpOwpAQCAtNjcsNyArNjgsNyBAQAogICByZXR1cm4ga1RmTGl0ZU9rOwogfQogCi1UZkxpdGVTdGF0dXMgRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgU3BhY2VUb0JhdGNoTkRFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgVEZMSVRFX0RDSEVDSyhub2RlLT51c2VyX2RhdGEgIT0gbnVsbHB0cik7CiAgIGNvbnN0IFNwYWNlVG9CYXRjaFBhcmFtcyYgcGFyYW1zID0KICAgICAgICooc3RhdGljX2Nhc3Q8Y29uc3QgU3BhY2VUb0JhdGNoUGFyYW1zKj4obm9kZS0+dXNlcl9kYXRhKSk7CkBAIC0xMTUsNyArMTE2LDggQEAKIH0gIC8vIG5hbWVzcGFjZS4KIAogVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9TUEFDRV9UT19CQVRDSF9ORCgpIHsKLSAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoSW5pdCwgUHJlcGFyZSwgRXZhbCk7CisgIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKFNwYWNlVG9CYXRjaE5ESW5pdCwgU3BhY2VUb0JhdGNoTkRQcmVwYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGFjZVRvQmF0Y2hOREV2YWwpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9zcGxpdC5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3NwbGl0LmNjCmluZGV4IGFhODc3MjAuLmNhZTcwNzQgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3NwbGl0LmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3NwbGl0LmNjCkBAIC02Nyw3ICs2Nyw3IEBACiAgIHJldHVybiBrVGZMaXRlT2s7CiB9CiAKLVRmTGl0ZVN0YXR1cyBQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBTcGxpdFByZXBhcmUoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBNaWNyb0NvbnRleHQqIG1pY3JvX2NvbnRleHQgPSBHZXRNaWNyb0NvbnRleHQoY29udGV4dCk7CiAgIFRmTGl0ZVRlbnNvciogYXhpcyA9IG1pY3JvX2NvbnRleHQtPkFsbG9jYXRlVGVtcElucHV0VGVuc29yKG5vZGUsIDApOwogICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCBheGlzICE9IG51bGxwdHIpOwpAQCAtODIsNyArODIsNyBAQAogICByZXR1cm4ga1RmTGl0ZU9rOwogfQogCi1UZkxpdGVTdGF0dXMgRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgU3BsaXRFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogYXhpcyA9IHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dChjb250ZXh0LCBub2RlLCAwKTsKICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXQgPSB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsSW5wdXQoY29udGV4dCwgbm9kZSwgMSk7CiAKQEAgLTExOSw3ICsxMTksNyBAQAogfSAgLy8gbmFtZXNwYWNlCiAKIFRGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfU1BMSVQoKSB7Ci0gIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKG51bGxwdHIsIFByZXBhcmUsIEV2YWwpOworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChudWxscHRyLCBTcGxpdFByZXBhcmUsIFNwbGl0RXZhbCk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSB0ZmxpdGUKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3NwbGl0X3YuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9zcGxpdF92LmNjCmluZGV4IDZhZWQ2ZjcuLmFkOTZhMjAgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3NwbGl0X3YuY2MKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvc3BsaXRfdi5jYwpAQCAtNzEsNyArNzEsNyBAQAogICByZXR1cm4ga1RmTGl0ZU9rOw0KIH0NCiANCi1UZkxpdGVTdGF0dXMgUHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7DQorVGZMaXRlU3RhdHVzIFNwbGl0VlByZXBhcmUoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgew0KICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgTnVtSW5wdXRzKG5vZGUpLCAzKTsNCiANCiAgIE1pY3JvQ29udGV4dCogbWljcm9fY29udGV4dCA9IEdldE1pY3JvQ29udGV4dChjb250ZXh0KTsNCkBAIC04NSw3ICs4NSw3IEBACiAgIHJldHVybiBrVGZMaXRlT2s7DQogfQ0KIA0KLVRmTGl0ZVN0YXR1cyBFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsNCitUZkxpdGVTdGF0dXMgU3BsaXRWRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7DQogICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dCA9IHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dChjb250ZXh0LCBub2RlLCAwKTsNCiAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGF4aXMgPSB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsSW5wdXQoY29udGV4dCwgbm9kZSwgMik7DQogDQpAQCAtMTIxLDcgKzEyMSw3IEBACiB9ICAvLyBuYW1lc3BhY2UNCiANCiBURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX1NQTElUX1YoKSB7DQotICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChudWxscHRyLCBQcmVwYXJlLCBFdmFsKTsNCisgIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKG51bGxwdHIsIFNwbGl0VlByZXBhcmUsIFNwbGl0VkV2YWwpOw0KIH0NCiANCiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlDQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvc3F1ZWV6ZS5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3NxdWVlemUuY2MKaW5kZXggZTUyY2NhYi4uM2RmMTM2MyAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvc3F1ZWV6ZS5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9zcXVlZXplLmNjCkBAIC00NCw3ICs0NCw3IEBACiAgIFRmTGl0ZVRlbnNvciogb3V0cHV0OwogfTsKIAotVGZMaXRlU3RhdHVzIFByZXBhcmUoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworVGZMaXRlU3RhdHVzIFNxdWVlemVQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgTnVtSW5wdXRzKG5vZGUpLCAxKTsKICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgTnVtT3V0cHV0cyhub2RlKSwgMSk7CiAKQEAgLTU1LDcgKzU1LDcgQEAKICAgLy8gRGV0ZXJtaW5lcyBudW1iZXIgb2YgZGltZW5zaW9ucyBvZiBvdXRwdXQgdGVuc29yIGFmdGVyIHNxdWVlemUuCiAgIGNvbnN0IFRmTGl0ZUludEFycmF5KiBpbnB1dF9kaW1zID0gb3BfY29udGV4dC5pbnB1dC0+ZGltczsKICAgY29uc3QgVGZMaXRlSW50QXJyYXkqIG91dHB1dF9kaW1zID0gb3BfY29udGV4dC5vdXRwdXQtPmRpbXM7Ci0gIGNvbnN0IGludCogc3F1ZWV6ZV9kaW1zID0gb3BfY29udGV4dC5wYXJhbXMtPnNxdWVlemVfZGltczsKKyAgY29uc3QgaW50MzJfdCogc3F1ZWV6ZV9kaW1zID0gb3BfY29udGV4dC5wYXJhbXMtPnNxdWVlemVfZGltczsKIAogICBjb25zdGV4cHIgaW50IG1heF9zcXVlZXplX2RpbXMgPSA4OwogICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCBpbnB1dF9udW1fZGltcyA8PSBtYXhfc3F1ZWV6ZV9kaW1zKTsKQEAgLTg3LDcgKzg3LDcgQEAKICAgcmV0dXJuIGtUZkxpdGVPazsKIH0KIAotVGZMaXRlU3RhdHVzIEV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworVGZMaXRlU3RhdHVzIFNxdWVlemVFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXQgPSB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsSW5wdXQoY29udGV4dCwgbm9kZSwgMCk7CiAKICAgaWYgKGlucHV0LT50eXBlID09IGtUZkxpdGVTdHJpbmcpIHsKQEAgLTExMiw3ICsxMTIsNyBAQAogfSAgLy8gbmFtZXNwYWNlCiAKIFRGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfU1FVRUVaRSgpIHsKLSAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AobnVsbHB0ciwgUHJlcGFyZSwgRXZhbCk7CisgIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKG51bGxwdHIsIFNxdWVlemVQcmVwYXJlLCBTcXVlZXplRXZhbCk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSB0ZmxpdGUKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3N0cmlkZWRfc2xpY2UuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9zdHJpZGVkX3NsaWNlLmNjCmluZGV4IDRlNjBlNmIuLjc4NTA3YTcgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3N0cmlkZWRfc2xpY2UuY2MKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvc3RyaWRlZF9zbGljZS5jYwpAQCAtMTQsMTQ2ICsxNCwzMCBAQAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9yZWZlcmVuY2Uvc3RyaWRlZF9zbGljZS5oIgogCi0jaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8Y3N0ZGludD4KICNpbmNsdWRlIDxjc3RyaW5nPgogCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2MvYnVpbHRpbl9vcF9kYXRhLmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2MvY29tbW9uLmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvdGVuc29yX2N0eXBlcy5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2tlcm5lbF91dGlsLmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMvb3BfbWFjcm9zLmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMva2VybmVsX3V0aWwuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9zdHJpZGVkX3NsaWNlLmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2xvZy5oIgogCiBuYW1lc3BhY2UgdGZsaXRlIHsKIAogbmFtZXNwYWNlIHsKIAotY29uc3RleHByIGludCBrSW5wdXRUZW5zb3IgPSAwOwotY29uc3RleHByIGludCBrQmVnaW5UZW5zb3IgPSAxOwotY29uc3RleHByIGludCBrRW5kVGVuc29yID0gMjsKLWNvbnN0ZXhwciBpbnQga1N0cmlkZXNUZW5zb3IgPSAzOwotY29uc3RleHByIGludCBrT3V0cHV0VGVuc29yID0gMDsKLQotc3RydWN0IFN0cmlkZWRTbGljZUNvbnRleHQgewotICBTdHJpZGVkU2xpY2VDb250ZXh0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKLSAgICBwYXJhbXMgPSByZWludGVycHJldF9jYXN0PFRmTGl0ZVN0cmlkZWRTbGljZVBhcmFtcyo+KG5vZGUtPmJ1aWx0aW5fZGF0YSk7Ci0gICAgbWljcm9fY29udGV4dCA9IEdldE1pY3JvQ29udGV4dChjb250ZXh0KTsKLSAgICBpbnB1dCA9IG1pY3JvX2NvbnRleHQtPkFsbG9jYXRlVGVtcElucHV0VGVuc29yKG5vZGUsIGtJbnB1dFRlbnNvcik7Ci0gICAgYmVnaW4gPSBtaWNyb19jb250ZXh0LT5BbGxvY2F0ZVRlbXBJbnB1dFRlbnNvcihub2RlLCBrQmVnaW5UZW5zb3IpOwotICAgIGVuZCA9IG1pY3JvX2NvbnRleHQtPkFsbG9jYXRlVGVtcElucHV0VGVuc29yKG5vZGUsIGtFbmRUZW5zb3IpOwotICAgIHN0cmlkZXMgPSBtaWNyb19jb250ZXh0LT5BbGxvY2F0ZVRlbXBJbnB1dFRlbnNvcihub2RlLCBrU3RyaWRlc1RlbnNvcik7Ci0gICAgb3V0cHV0ID0gbWljcm9fY29udGV4dC0+QWxsb2NhdGVUZW1wT3V0cHV0VGVuc29yKG5vZGUsIGtPdXRwdXRUZW5zb3IpOwotICAgIGRpbXMgPSBOdW1EaW1lbnNpb25zKGlucHV0KTsKLSAgfQotICB+U3RyaWRlZFNsaWNlQ29udGV4dCgpIHsKLSAgICBtaWNyb19jb250ZXh0LT5EZWFsbG9jYXRlVGVtcFRmTGl0ZVRlbnNvcihpbnB1dCk7Ci0gICAgbWljcm9fY29udGV4dC0+RGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3IoYmVnaW4pOwotICAgIG1pY3JvX2NvbnRleHQtPkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKGVuZCk7Ci0gICAgbWljcm9fY29udGV4dC0+RGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3Ioc3RyaWRlcyk7Ci0gICAgbWljcm9fY29udGV4dC0+RGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3Iob3V0cHV0KTsKLSAgfQotICBjb25zdCBUZkxpdGVTdHJpZGVkU2xpY2VQYXJhbXMqIHBhcmFtczsKLSAgTWljcm9Db250ZXh0KiBtaWNyb19jb250ZXh0OwotICBUZkxpdGVUZW5zb3IqIGlucHV0OwotICBUZkxpdGVUZW5zb3IqIGJlZ2luOwotICBUZkxpdGVUZW5zb3IqIGVuZDsKLSAgVGZMaXRlVGVuc29yKiBzdHJpZGVzOwotICBUZkxpdGVUZW5zb3IqIG91dHB1dDsKLSAgaW50IGRpbXM7Ci19OwotCi0vLyBUaGlzIE9wIG9ubHkgc3VwcG9ydHMgMS00RCBjYXNlcyBhbmQgc2luY2Ugd2UgdXNlIHRoZSByZWZlcmVuY2UgNEQKLS8vIGltcGxlbWVudGF0aW9uLCB0aGUgMS0zRCB0ZW5zb3JzIGFyZSBtYXBwZWQgdG8gNEQuCi1jb25zdCBpbnQga01heERpbSA9IDQ7Ci0KLXRmbGl0ZTo6U3RyaWRlZFNsaWNlUGFyYW1zIEJ1aWxkU3RyaWRlZFNsaWNlUGFyYW1zKAotICAgIFN0cmlkZWRTbGljZUNvbnRleHQqIG9wX2NvbnRleHQpIHsKLSAgdGZsaXRlOjpTdHJpZGVkU2xpY2VQYXJhbXMgb3BfcGFyYW1ze307Ci0gIG9wX3BhcmFtcy5zdGFydF9pbmRpY2VzX2NvdW50ID0gb3BfY29udGV4dC0+ZGltczsKLSAgb3BfcGFyYW1zLnN0b3BfaW5kaWNlc19jb3VudCA9IG9wX2NvbnRleHQtPmRpbXM7Ci0gIG9wX3BhcmFtcy5zdHJpZGVzX2NvdW50ID0gb3BfY29udGV4dC0+ZGltczsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IG9wX2NvbnRleHQtPmRpbXM7ICsraSkgewotICAgIG9wX3BhcmFtcy5zdGFydF9pbmRpY2VzW2ldID0gR2V0VGVuc29yRGF0YTxpbnQzMl90PihvcF9jb250ZXh0LT5iZWdpbilbaV07Ci0gICAgb3BfcGFyYW1zLnN0b3BfaW5kaWNlc1tpXSA9IEdldFRlbnNvckRhdGE8aW50MzJfdD4ob3BfY29udGV4dC0+ZW5kKVtpXTsKLSAgICBvcF9wYXJhbXMuc3RyaWRlc1tpXSA9IEdldFRlbnNvckRhdGE8aW50MzJfdD4ob3BfY29udGV4dC0+c3RyaWRlcylbaV07Ci0gIH0KLQotICBvcF9wYXJhbXMuYmVnaW5fbWFzayA9IG9wX2NvbnRleHQtPnBhcmFtcy0+YmVnaW5fbWFzazsKLSAgb3BfcGFyYW1zLmVsbGlwc2lzX21hc2sgPSAwOwotICBvcF9wYXJhbXMuZW5kX21hc2sgPSBvcF9jb250ZXh0LT5wYXJhbXMtPmVuZF9tYXNrOwotICBvcF9wYXJhbXMubmV3X2F4aXNfbWFzayA9IDA7Ci0gIG9wX3BhcmFtcy5zaHJpbmtfYXhpc19tYXNrID0gb3BfY29udGV4dC0+cGFyYW1zLT5zaHJpbmtfYXhpc19tYXNrOwotICByZXR1cm4gb3BfcGFyYW1zOwotfQotCi0vLyBQcm9jZXNzZXMgdGhlIGluZGV4aW5nIHRlbnNvcnMgKGJlZ2luLCBlbmQgYW5kIHN0cmlkZXMpIHRvIHJlc2l6ZSB0aGUKLS8vIG91dHB1dCB0ZW5zb3IuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGFibGUgZnJvbSBib3RoIFByZXBhcmUoKSBhbmQgRXZhbCgpIGFzCi0vLyBsb25nIGFzIHRoZSBjYWxsZXIgZW5zdXJlcyB0aGUgaW5kZXhpbmcgdGVuc29ycyBhcmUgcHJlc2VudC4KLVRmTGl0ZVN0YXR1cyBDaGVja091dHB1dFNpemUoVGZMaXRlQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaWRlZFNsaWNlQ29udGV4dCogb3BfY29udGV4dCkgewotICB1c2luZyA6OnRmbGl0ZTo6c3RyaWRlZF9zbGljZTo6U3RhcnRGb3JBeGlzOwotICB1c2luZyA6OnRmbGl0ZTo6c3RyaWRlZF9zbGljZTo6U3RvcEZvckF4aXM7Ci0gIFRmTGl0ZUludEFycmF5KiBvdXRwdXRfc2hhcGUgPSBvcF9jb250ZXh0LT5vdXRwdXQtPmRpbXM7Ci0gIGludCBzaGFwZV9zaXplID0gMDsKLSAgYXV0byBvcF9wYXJhbXMgPSBCdWlsZFN0cmlkZWRTbGljZVBhcmFtcyhvcF9jb250ZXh0KTsKLSAgYXV0byBpbnB1dF9zaGFwZSA9IEdldFRlbnNvclNoYXBlKG9wX2NvbnRleHQtPmlucHV0KTsKLSAgZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgb3BfY29udGV4dC0+ZGltczsgKytpZHgpIHsKLSAgICBpbnQzMl90IHN0cmlkZSA9IEdldFRlbnNvckRhdGE8aW50MzJfdD4ob3BfY29udGV4dC0+c3RyaWRlcylbaWR4XTsKLSAgICBURl9MSVRFX0VOU1VSRV9NU0coY29udGV4dCwgc3RyaWRlICE9IDAsICJzdHJpZGUgdmFsdWUgaGFzIHRvIGJlIG5vbi16ZXJvIik7Ci0gICAgaW50MzJfdCBiZWdpbiA9IFN0YXJ0Rm9yQXhpcyhvcF9wYXJhbXMsIGlucHV0X3NoYXBlLCBpZHgpOwotICAgIGludDMyX3QgZW5kID0gU3RvcEZvckF4aXMob3BfcGFyYW1zLCBpbnB1dF9zaGFwZSwgaWR4LCBiZWdpbik7Ci0KLSAgICAvLyBXaGVuIHNocmlua2luZyBhbiBheGlzLCB0aGUgZW5kIHBvc2l0aW9uIGRvZXMgbm90IG1hdHRlciAoYW5kIGNhbiBiZQotICAgIC8vIGluY29ycmVjdCB3aGVuIG5lZ2F0aXZlIGluZGV4aW5nIGlzIHVzZWQsIHNlZSBJc3N1ZSAjMTkyNjApLiBBbHdheXMgdXNlCi0gICAgLy8gYmVnaW4gKyAxIHRvIGdlbmVyYXRlIGEgbGVuZ3RoIDEgc2xpY2UsIHNpbmNlIGJlZ2luIGhhcwotICAgIC8vIGFscmVhZHkgYmVlbiBhZGp1c3RlZCBmb3IgbmVnYXRpdmUgaW5kaWNlcyBieSBTdGFydEZvckF4aXMuCi0gICAgY29uc3QgYm9vbCBzaHJpbmtfYXhpcyA9IG9wX2NvbnRleHQtPnBhcmFtcy0+c2hyaW5rX2F4aXNfbWFzayAmICgxIDw8IGlkeCk7Ci0gICAgaWYgKHNocmlua19heGlzKSB7Ci0gICAgICBlbmQgPSBiZWdpbiArIDE7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBpcyB2YWxpZCBmb3IgYm90aCBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgc3RyaWRlcwotICAgIGludDMyX3QgZGltX3NoYXBlID0gc3RkOjpjZWlsKChlbmQgLSBiZWdpbikgLyBzdGF0aWNfY2FzdDxmbG9hdD4oc3RyaWRlKSk7Ci0gICAgZGltX3NoYXBlID0gZGltX3NoYXBlIDwgMCA/IDAgOiBkaW1fc2hhcGU7Ci0gICAgaWYgKCFzaHJpbmtfYXhpcykgewotICAgICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgb3V0cHV0X3NoYXBlLT5kYXRhW3NoYXBlX3NpemVdLCBkaW1fc2hhcGUpOwotICAgICAgc2hhcGVfc2l6ZSsrOwotICAgIH0KLSAgfQotICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBvdXRwdXRfc2hhcGUtPnNpemUsIHNoYXBlX3NpemUpOwotICByZXR1cm4ga1RmTGl0ZU9rOwotfQotCi12b2lkKiBJbml0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgewotICBURkxJVEVfRENIRUNLKGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlciAhPSBudWxscHRyKTsKLSAgcmV0dXJuIGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlcihjb250ZXh0LCBzaXplb2YoU3RyaWRlZFNsaWNlUGFyYW1zKSk7Ci19Ci0KLVRmTGl0ZVN0YXR1cyBQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKLSAgVEZMSVRFX0RDSEVDSyhub2RlLT51c2VyX2RhdGEgIT0gbnVsbHB0cik7Ci0gIFN0cmlkZWRTbGljZVBhcmFtcyogb3BfcGFyYW1zID0KLSAgICAgIHN0YXRpY19jYXN0PFN0cmlkZWRTbGljZVBhcmFtcyo+KG5vZGUtPnVzZXJfZGF0YSk7Ci0gIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bUlucHV0cyhub2RlKSwgNCk7Ci0gIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bU91dHB1dHMobm9kZSksIDEpOwotICBTdHJpZGVkU2xpY2VDb250ZXh0IG9wX2NvbnRleHQoY29udGV4dCwgbm9kZSk7Ci0gIFRGX0xJVEVfRU5TVVJFX01TRyhjb250ZXh0LCBvcF9jb250ZXh0LmRpbXMgPD0ga01heERpbSwKLSAgICAgICAgICAgICAgICAgICAgICJpbnB1dCBkaW0gc2hvdWxkIG5vdCBleGNlZWQgNCIpOwotICBhdXRvIHBhcmFtcyA9IEJ1aWxkU3RyaWRlZFNsaWNlUGFyYW1zKCZvcF9jb250ZXh0KTsKLSAgbWVtY3B5KG9wX3BhcmFtcywgJnBhcmFtcywgc2l6ZW9mKFN0cmlkZWRTbGljZVBhcmFtcykpOwotICByZXR1cm4gQ2hlY2tPdXRwdXRTaXplKGNvbnRleHQsICZvcF9jb250ZXh0KTsKLX0KLQotVGZMaXRlU3RhdHVzIEV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworVGZMaXRlU3RhdHVzIFN0cmlkZWRTbGljZUV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBURkxJVEVfRENIRUNLKG5vZGUtPnVzZXJfZGF0YSAhPSBudWxscHRyKTsKICAgY29uc3QgU3RyaWRlZFNsaWNlUGFyYW1zJiBvcF9wYXJhbXMgPQogICAgICAgKihzdGF0aWNfY2FzdDxjb25zdCBTdHJpZGVkU2xpY2VQYXJhbXMqPihub2RlLT51c2VyX2RhdGEpKTsKIAogICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dCA9Ci0gICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsSW5wdXQoY29udGV4dCwgbm9kZSwga0lucHV0VGVuc29yKTsKKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dChjb250ZXh0LCBub2RlLCBrU3RyaWRlZFNsaWNlSW5wdXRUZW5zb3IpOwogICBUZkxpdGVFdmFsVGVuc29yKiBvdXRwdXQgPQotICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbE91dHB1dChjb250ZXh0LCBub2RlLCBrT3V0cHV0VGVuc29yKTsKKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldEV2YWxPdXRwdXQoY29udGV4dCwgbm9kZSwga1N0cmlkZWRTbGljZU91dHB1dFRlbnNvcik7CiAgIHN3aXRjaCAob3V0cHV0LT50eXBlKSB7CiAgICAgY2FzZSBrVGZMaXRlRmxvYXQzMjoKICAgICAgIHJlZmVyZW5jZV9vcHM6OlN0cmlkZWRTbGljZShvcF9wYXJhbXMsCkBAIC0yMDEsNyArODUsOCBAQAogfSAgLy8gbmFtZXNwYWNlCiAKIFRGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfU1RSSURFRF9TTElDRSgpIHsKLSAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoSW5pdCwgUHJlcGFyZSwgRXZhbCk7CisgIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKFN0cmlkZWRTbGljZUluaXQsIFN0cmlkZWRTbGljZVByZXBhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmlkZWRTbGljZUV2YWwpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9zdHJpZGVkX3NsaWNlLmggYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9zdHJpZGVkX3NsaWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE5NDEzZgotLS0gL2Rldi9udWxsCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3N0cmlkZWRfc2xpY2UuaApAQCAtMCwwICsxLDQwIEBACisvKiBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2lmbmRlZiBURU5TT1JGTE9XX0xJVEVfTUlDUk9fS0VSTkVMU19TVFJJREVEX1NMSUNFX0hfCisjZGVmaW5lIFRFTlNPUkZMT1dfTElURV9NSUNST19LRVJORUxTX1NUUklERURfU0xJQ0VfSF8KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvYy9idWlsdGluX29wX2RhdGEuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvYy9jb21tb24uaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fY29tbW9uLmgiCisKK25hbWVzcGFjZSB0ZmxpdGUgeworCitjb25zdGV4cHIgaW50IGtTdHJpZGVkU2xpY2VJbnB1dFRlbnNvciA9IDA7Citjb25zdGV4cHIgaW50IGtTdHJpZGVkU2xpY2VCZWdpblRlbnNvciA9IDE7Citjb25zdGV4cHIgaW50IGtTdHJpZGVkU2xpY2VFbmRUZW5zb3IgPSAyOworY29uc3RleHByIGludCBrU3RyaWRlZFNsaWNlU3RyaWRlc1RlbnNvciA9IDM7Citjb25zdGV4cHIgaW50IGtTdHJpZGVkU2xpY2VPdXRwdXRUZW5zb3IgPSAwOworCit2b2lkKiBTdHJpZGVkU2xpY2VJbml0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCk7CisKK1RmTGl0ZVN0YXR1cyBTdHJpZGVkU2xpY2VQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpOworCit9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCisKKyNlbmRpZiAgLy8gVEVOU09SRkxPV19MSVRFX01JQ1JPX0tFUk5FTFNfU1RSSURFRF9TTElDRV9IXwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvc3RyaWRlZF9zbGljZV9jb21tb24uY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9zdHJpZGVkX3NsaWNlX2NvbW1vbi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjVlMWYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvc3RyaWRlZF9zbGljZV9jb21tb24uY2MKQEAgLTAsMCArMSwxNDkgQEAKKy8qIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGNzdHJpbmc+CisKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvYy9idWlsdGluX29wX2RhdGEuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvYy9jb21tb24uaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9yZWZlcmVuY2Uvc3RyaWRlZF9zbGljZS5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3RlbnNvcl9jdHlwZXMuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9rZXJuZWxfdXRpbC5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL29wX21hY3Jvcy5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2tlcm5lbF91dGlsLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvc3RyaWRlZF9zbGljZS5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19sb2cuaCIKKworbmFtZXNwYWNlIHRmbGl0ZSB7CisKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBTdHJpZGVkU2xpY2VDb250ZXh0IHsKKyAgU3RyaWRlZFNsaWNlQ29udGV4dChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CisgICAgcGFyYW1zID0gcmVpbnRlcnByZXRfY2FzdDxUZkxpdGVTdHJpZGVkU2xpY2VQYXJhbXMqPihub2RlLT5idWlsdGluX2RhdGEpOworICAgIG1pY3JvX2NvbnRleHQgPSBHZXRNaWNyb0NvbnRleHQoY29udGV4dCk7CisgICAgaW5wdXQgPQorICAgICAgICBtaWNyb19jb250ZXh0LT5BbGxvY2F0ZVRlbXBJbnB1dFRlbnNvcihub2RlLCBrU3RyaWRlZFNsaWNlSW5wdXRUZW5zb3IpOworICAgIGJlZ2luID0KKyAgICAgICAgbWljcm9fY29udGV4dC0+QWxsb2NhdGVUZW1wSW5wdXRUZW5zb3Iobm9kZSwga1N0cmlkZWRTbGljZUJlZ2luVGVuc29yKTsKKyAgICBlbmQgPSBtaWNyb19jb250ZXh0LT5BbGxvY2F0ZVRlbXBJbnB1dFRlbnNvcihub2RlLCBrU3RyaWRlZFNsaWNlRW5kVGVuc29yKTsKKyAgICBzdHJpZGVzID0gbWljcm9fY29udGV4dC0+QWxsb2NhdGVUZW1wSW5wdXRUZW5zb3IoCisgICAgICAgIG5vZGUsIGtTdHJpZGVkU2xpY2VTdHJpZGVzVGVuc29yKTsKKyAgICBvdXRwdXQgPSBtaWNyb19jb250ZXh0LT5BbGxvY2F0ZVRlbXBPdXRwdXRUZW5zb3Iobm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1N0cmlkZWRTbGljZU91dHB1dFRlbnNvcik7CisgICAgZGltcyA9IE51bURpbWVuc2lvbnMoaW5wdXQpOworICB9CisgIH5TdHJpZGVkU2xpY2VDb250ZXh0KCkgeworICAgIG1pY3JvX2NvbnRleHQtPkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKGlucHV0KTsKKyAgICBtaWNyb19jb250ZXh0LT5EZWFsbG9jYXRlVGVtcFRmTGl0ZVRlbnNvcihiZWdpbik7CisgICAgbWljcm9fY29udGV4dC0+RGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3IoZW5kKTsKKyAgICBtaWNyb19jb250ZXh0LT5EZWFsbG9jYXRlVGVtcFRmTGl0ZVRlbnNvcihzdHJpZGVzKTsKKyAgICBtaWNyb19jb250ZXh0LT5EZWFsbG9jYXRlVGVtcFRmTGl0ZVRlbnNvcihvdXRwdXQpOworICB9CisgIGNvbnN0IFRmTGl0ZVN0cmlkZWRTbGljZVBhcmFtcyogcGFyYW1zOworICBNaWNyb0NvbnRleHQqIG1pY3JvX2NvbnRleHQ7CisgIFRmTGl0ZVRlbnNvciogaW5wdXQ7CisgIFRmTGl0ZVRlbnNvciogYmVnaW47CisgIFRmTGl0ZVRlbnNvciogZW5kOworICBUZkxpdGVUZW5zb3IqIHN0cmlkZXM7CisgIFRmTGl0ZVRlbnNvciogb3V0cHV0OworICBpbnQgZGltczsKK307CisKKy8vIFRoaXMgT3Agb25seSBzdXBwb3J0cyAxLTREIGNhc2VzIGFuZCBzaW5jZSB3ZSB1c2UgdGhlIHJlZmVyZW5jZSA0RAorLy8gaW1wbGVtZW50YXRpb24sIHRoZSAxLTNEIHRlbnNvcnMgYXJlIG1hcHBlZCB0byA0RC4KK2NvbnN0IGludCBrTWF4RGltID0gNDsKKwordGZsaXRlOjpTdHJpZGVkU2xpY2VQYXJhbXMgQnVpbGRTdHJpZGVkU2xpY2VQYXJhbXMoCisgICAgU3RyaWRlZFNsaWNlQ29udGV4dCogb3BfY29udGV4dCkgeworICB0ZmxpdGU6OlN0cmlkZWRTbGljZVBhcmFtcyBvcF9wYXJhbXN7fTsKKyAgb3BfcGFyYW1zLnN0YXJ0X2luZGljZXNfY291bnQgPSBvcF9jb250ZXh0LT5kaW1zOworICBvcF9wYXJhbXMuc3RvcF9pbmRpY2VzX2NvdW50ID0gb3BfY29udGV4dC0+ZGltczsKKyAgb3BfcGFyYW1zLnN0cmlkZXNfY291bnQgPSBvcF9jb250ZXh0LT5kaW1zOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgb3BfY29udGV4dC0+ZGltczsgKytpKSB7CisgICAgb3BfcGFyYW1zLnN0YXJ0X2luZGljZXNbaV0gPSBHZXRUZW5zb3JEYXRhPGludDMyX3Q+KG9wX2NvbnRleHQtPmJlZ2luKVtpXTsKKyAgICBvcF9wYXJhbXMuc3RvcF9pbmRpY2VzW2ldID0gR2V0VGVuc29yRGF0YTxpbnQzMl90PihvcF9jb250ZXh0LT5lbmQpW2ldOworICAgIG9wX3BhcmFtcy5zdHJpZGVzW2ldID0gR2V0VGVuc29yRGF0YTxpbnQzMl90PihvcF9jb250ZXh0LT5zdHJpZGVzKVtpXTsKKyAgfQorCisgIG9wX3BhcmFtcy5iZWdpbl9tYXNrID0gb3BfY29udGV4dC0+cGFyYW1zLT5iZWdpbl9tYXNrOworICBvcF9wYXJhbXMuZWxsaXBzaXNfbWFzayA9IDA7CisgIG9wX3BhcmFtcy5lbmRfbWFzayA9IG9wX2NvbnRleHQtPnBhcmFtcy0+ZW5kX21hc2s7CisgIG9wX3BhcmFtcy5uZXdfYXhpc19tYXNrID0gMDsKKyAgb3BfcGFyYW1zLnNocmlua19heGlzX21hc2sgPSBvcF9jb250ZXh0LT5wYXJhbXMtPnNocmlua19heGlzX21hc2s7CisgIHJldHVybiBvcF9wYXJhbXM7Cit9CisKKy8vIFByb2Nlc3NlcyB0aGUgaW5kZXhpbmcgdGVuc29ycyAoYmVnaW4sIGVuZCBhbmQgc3RyaWRlcykgdG8gcmVzaXplIHRoZQorLy8gb3V0cHV0IHRlbnNvci4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsYWJsZSBmcm9tIGJvdGggUHJlcGFyZSgpIGFuZCBFdmFsKCkgYXMKKy8vIGxvbmcgYXMgdGhlIGNhbGxlciBlbnN1cmVzIHRoZSBpbmRleGluZyB0ZW5zb3JzIGFyZSBwcmVzZW50LgorVGZMaXRlU3RhdHVzIENoZWNrT3V0cHV0U2l6ZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpZGVkU2xpY2VDb250ZXh0KiBvcF9jb250ZXh0KSB7CisgIHVzaW5nIDo6dGZsaXRlOjpzdHJpZGVkX3NsaWNlOjpTdGFydEZvckF4aXM7CisgIHVzaW5nIDo6dGZsaXRlOjpzdHJpZGVkX3NsaWNlOjpTdG9wRm9yQXhpczsKKyAgVGZMaXRlSW50QXJyYXkqIG91dHB1dF9zaGFwZSA9IG9wX2NvbnRleHQtPm91dHB1dC0+ZGltczsKKyAgaW50IHNoYXBlX3NpemUgPSAwOworICBhdXRvIG9wX3BhcmFtcyA9IEJ1aWxkU3RyaWRlZFNsaWNlUGFyYW1zKG9wX2NvbnRleHQpOworICBhdXRvIGlucHV0X3NoYXBlID0gR2V0VGVuc29yU2hhcGUob3BfY29udGV4dC0+aW5wdXQpOworICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBvcF9jb250ZXh0LT5kaW1zOyArK2lkeCkgeworICAgIGludDMyX3Qgc3RyaWRlID0gR2V0VGVuc29yRGF0YTxpbnQzMl90PihvcF9jb250ZXh0LT5zdHJpZGVzKVtpZHhdOworICAgIFRGX0xJVEVfRU5TVVJFX01TRyhjb250ZXh0LCBzdHJpZGUgIT0gMCwgInN0cmlkZSB2YWx1ZSBoYXMgdG8gYmUgbm9uLXplcm8iKTsKKyAgICBpbnQzMl90IGJlZ2luID0gU3RhcnRGb3JBeGlzKG9wX3BhcmFtcywgaW5wdXRfc2hhcGUsIGlkeCk7CisgICAgaW50MzJfdCBlbmQgPSBTdG9wRm9yQXhpcyhvcF9wYXJhbXMsIGlucHV0X3NoYXBlLCBpZHgsIGJlZ2luKTsKKworICAgIC8vIFdoZW4gc2hyaW5raW5nIGFuIGF4aXMsIHRoZSBlbmQgcG9zaXRpb24gZG9lcyBub3QgbWF0dGVyIChhbmQgY2FuIGJlCisgICAgLy8gaW5jb3JyZWN0IHdoZW4gbmVnYXRpdmUgaW5kZXhpbmcgaXMgdXNlZCwgc2VlIElzc3VlICMxOTI2MCkuIEFsd2F5cyB1c2UKKyAgICAvLyBiZWdpbiArIDEgdG8gZ2VuZXJhdGUgYSBsZW5ndGggMSBzbGljZSwgc2luY2UgYmVnaW4gaGFzCisgICAgLy8gYWxyZWFkeSBiZWVuIGFkanVzdGVkIGZvciBuZWdhdGl2ZSBpbmRpY2VzIGJ5IFN0YXJ0Rm9yQXhpcy4KKyAgICBjb25zdCBib29sIHNocmlua19heGlzID0gb3BfY29udGV4dC0+cGFyYW1zLT5zaHJpbmtfYXhpc19tYXNrICYgKDEgPDwgaWR4KTsKKyAgICBpZiAoc2hyaW5rX2F4aXMpIHsKKyAgICAgIGVuZCA9IGJlZ2luICsgMTsKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIHZhbGlkIGZvciBib3RoIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBzdHJpZGVzCisgICAgaW50MzJfdCBkaW1fc2hhcGUgPSBzdGQ6OmNlaWwoKGVuZCAtIGJlZ2luKSAvIHN0YXRpY19jYXN0PGZsb2F0PihzdHJpZGUpKTsKKyAgICBkaW1fc2hhcGUgPSBkaW1fc2hhcGUgPCAwID8gMCA6IGRpbV9zaGFwZTsKKyAgICBpZiAoIXNocmlua19heGlzKSB7CisgICAgICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBvdXRwdXRfc2hhcGUtPmRhdGFbc2hhcGVfc2l6ZV0sIGRpbV9zaGFwZSk7CisgICAgICBzaGFwZV9zaXplKys7CisgICAgfQorICB9CisgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIG91dHB1dF9zaGFwZS0+c2l6ZSwgc2hhcGVfc2l6ZSk7CisgIHJldHVybiBrVGZMaXRlT2s7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCit2b2lkKiBTdHJpZGVkU2xpY2VJbml0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCkgeworICBURkxJVEVfRENIRUNLKGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlciAhPSBudWxscHRyKTsKKyAgcmV0dXJuIGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlcihjb250ZXh0LCBzaXplb2YoU3RyaWRlZFNsaWNlUGFyYW1zKSk7Cit9CisKK1RmTGl0ZVN0YXR1cyBTdHJpZGVkU2xpY2VQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKKyAgVEZMSVRFX0RDSEVDSyhub2RlLT51c2VyX2RhdGEgIT0gbnVsbHB0cik7CisgIFN0cmlkZWRTbGljZVBhcmFtcyogb3BfcGFyYW1zID0KKyAgICAgIHN0YXRpY19jYXN0PFN0cmlkZWRTbGljZVBhcmFtcyo+KG5vZGUtPnVzZXJfZGF0YSk7CisgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bUlucHV0cyhub2RlKSwgNCk7CisgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bU91dHB1dHMobm9kZSksIDEpOworICBTdHJpZGVkU2xpY2VDb250ZXh0IG9wX2NvbnRleHQoY29udGV4dCwgbm9kZSk7CisgIFRGX0xJVEVfRU5TVVJFX01TRyhjb250ZXh0LCBvcF9jb250ZXh0LmRpbXMgPD0ga01heERpbSwKKyAgICAgICAgICAgICAgICAgICAgICJpbnB1dCBkaW0gc2hvdWxkIG5vdCBleGNlZWQgNCIpOworICBhdXRvIHBhcmFtcyA9IEJ1aWxkU3RyaWRlZFNsaWNlUGFyYW1zKCZvcF9jb250ZXh0KTsKKyAgbWVtY3B5KG9wX3BhcmFtcywgJnBhcmFtcywgc2l6ZW9mKFN0cmlkZWRTbGljZVBhcmFtcykpOworICByZXR1cm4gQ2hlY2tPdXRwdXRTaXplKGNvbnRleHQsICZvcF9jb250ZXh0KTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvc3ZkZi5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3N2ZGYuY2MKaW5kZXggMGZmYjRiMC4uOWU4NWM2YiAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvc3ZkZi5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9zdmRmLmNjCkBAIC0zMiwxMiArMzIsMTIgQEAKIG5hbWVzcGFjZSB0ZmxpdGUgewogbmFtZXNwYWNlIHsKIAotdm9pZCogSW5pdChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpIHsKK3ZvaWQqIEluaXRTdmRmKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgewogICBURkxJVEVfRENIRUNLKGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlciAhPSBudWxscHRyKTsKICAgcmV0dXJuIGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlcihjb250ZXh0LCBzaXplb2YoT3BEYXRhU3ZkZikpOwogfQogCi1UZkxpdGVTdGF0dXMgRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgRXZhbFN2ZGYoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBhdXRvKiBwYXJhbXMgPSByZWludGVycHJldF9jYXN0PFRmTGl0ZVNWREZQYXJhbXMqPihub2RlLT5idWlsdGluX2RhdGEpOwogICBURkxJVEVfRENIRUNLKG5vZGUtPnVzZXJfZGF0YSAhPSBudWxscHRyKTsKICAgY29uc3QgT3BEYXRhU3ZkZiYgZGF0YSA9ICooc3RhdGljX2Nhc3Q8Y29uc3QgT3BEYXRhU3ZkZio+KG5vZGUtPnVzZXJfZGF0YSkpOwpAQCAtOTksNyArOTksNyBAQAogfSAgLy8gbmFtZXNwYWNlCiAKIFRGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfU1ZERigpIHsKLSAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoSW5pdCwgUHJlcGFyZVN2ZGYsIEV2YWwpOworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChJbml0U3ZkZiwgUHJlcGFyZVN2ZGYsIEV2YWxTdmRmKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvdGVzdGRhdGEvQlVJTEQgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy90ZXN0ZGF0YS9CVUlMRAppbmRleCAxNmRmNzEyLi5jOTNiYzdkIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy90ZXN0ZGF0YS9CVUlMRAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy90ZXN0ZGF0YS9CVUlMRApAQCAtMSwzICsxLDQgQEAKK2xvYWQoIkBydWxlc19weXRob24vL3B5dGhvbjpkZWZzLmJ6bCIsICJweV9iaW5hcnkiLCAicHlfdGVzdCIpCiBsb2FkKCJAdGZsbV9waXBfZGVwcy8vOnJlcXVpcmVtZW50cy5iemwiLCAicmVxdWlyZW1lbnQiKQogCiBwYWNrYWdlKApAQCAtNDUsNyArNDYsNyBAQAogICAgIGRlcHMgPSBbCiAgICAgICAgICJAYWJzbF9weS8vYWJzbDphcHAiLAogICAgICAgICByZXF1aXJlbWVudCgibnVtcHkiKSwKLSAgICAgICAgcmVxdWlyZW1lbnQoInRlbnNvcmZsb3ctY3B1IiksCisgICAgICAgIHJlcXVpcmVtZW50KCJ0ZW5zb3JmbG93IiksCiAgICAgXSwKICkKIApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvdGVzdGRhdGEvbHN0bV90ZXN0X2RhdGEuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy90ZXN0ZGF0YS9sc3RtX3Rlc3RfZGF0YS5jYwppbmRleCA0ZDdkOWQ5Li4wZmMwMTBiIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy90ZXN0ZGF0YS9sc3RtX3Rlc3RfZGF0YS5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy90ZXN0ZGF0YS9sc3RtX3Rlc3RfZGF0YS5jYwpAQCAtMjUxLDExICsyNTEsMTIgQEAKIAogICAvLyBzdGF0ZSBxdWFudGl6YXRpb24gcGFyYW1ldGVycwogICBxdWFudGl6YXRpb25fc2V0dGluZ3MuaW5wdXQgPSB7LypzY2FsZT0qLzMuMDUxODA0NGUtNSwgLyp6cD0qLzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnN5bW1ldHJ5PSovZmFsc2V9OwotICBxdWFudGl6YXRpb25fc2V0dGluZ3Mub3V0cHV0ID0gey8qc2NhbGU9Ki8xLjgzMTA4MjZlLTUsIC8qenA9Ki8tNTQ2MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnN5bW1ldHJ5PSovZmFsc2V9OwotICBxdWFudGl6YXRpb25fc2V0dGluZ3MuaGlkZGVuX3N0YXRlID0gey8qc2NhbGU9Ki8xLjgzMTA4MjZlLTUsIC8qenA9Ki8tNTQ2MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnN5bW1ldHJ5PSovZmFsc2V9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypzeW1tZXRyeT0qL3RydWV9OworICBxdWFudGl6YXRpb25fc2V0dGluZ3Mub3V0cHV0ID0gey8qc2NhbGU9Ki8yLjEzNjI5NTY2MzMxOTgwMzVlLTA1LCAvKnpwPSovMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnN5bW1ldHJ5PSovdHJ1ZX07CisgIHF1YW50aXphdGlvbl9zZXR0aW5ncy5oaWRkZW5fc3RhdGUgPSB7LypzY2FsZT0qLzIuMTM2Mjk1NjYzMzE5ODAzNWUtMDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp6cD0qLzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypzeW1tZXRyeT0qL3RydWV9OwogICBxdWFudGl6YXRpb25fc2V0dGluZ3MuY2VsbF9zdGF0ZSA9IHsvKnNjYWxlPSovMC4wMDAyNDQxNDA2MiwgLyp6cD0qLzAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qc3ltbWV0cnk9Ki90cnVlfTsKIApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvdGVzdGRhdGEvbHN0bV90ZXN0X2RhdGEuaCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3Rlc3RkYXRhL2xzdG1fdGVzdF9kYXRhLmgKaW5kZXggM2VkZjQyMC4uOTMyYjgzMiAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvdGVzdGRhdGEvbHN0bV90ZXN0X2RhdGEuaAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy90ZXN0ZGF0YS9sc3RtX3Rlc3RfZGF0YS5oCkBAIC0zOTAsOSArMzkwLDkgQEAKICAgaW50IHN0YXRlX3NpemVfWzNdID0gezIsIGJhdGNoX3NpemUsIHN0YXRlX2RpbWVuc2lvbn07CiAKICAgLy8gc2VlIGxzdG1fc2hhcmVkLmggZm9yIHRlbnNvciBuYW1lcywgdGhlIGxhc3QgdGVuc29yIGlzIHRoZSBvdXRwdXQgdGVuc29yCi0gIFRmTGl0ZVRlbnNvciB0ZW5zb3JzX1syNCArIDFdOworICBUZkxpdGVUZW5zb3IgdGVuc29yc19bMjQgKyAxXSA9IHt9OwogICAvLyBVc2UgZm9yIGludGVybmVsIGtlcm5lbCB0ZXN0aW5nCi0gIFRmTGl0ZUV2YWxUZW5zb3IgZXZhbF90ZW5zb3JzX1syNCArIDFdOworICBUZkxpdGVFdmFsVGVuc29yIGV2YWxfdGVuc29yc19bMjQgKyAxXSA9IHt9OwogICAvLyBpbmRpY2VzIGZvciB0aGUgdGVuc29ycyBpbnNpZGUgdGhlIG5vZGUgKHJlcXVpcmVkIGJ5IGtlcm5lbCBydW5uZXIpCiAgIGludCBpbnB1dF90ZW5zb3JfaW5kaWNlc19bMSArIDI0XSA9IHt9OwogICAvLyBzaW5nbGUgb3V0cHV0IChsYXN0IGluIHRoZSB0ZW5zb3JzIGFycmF5KQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvdGVzdGRhdGEvbHN0bV90ZXN0X2RhdGFfZ2VuZXJhdG9yLnB5IGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvdGVzdGRhdGEvbHN0bV90ZXN0X2RhdGFfZ2VuZXJhdG9yLnB5CmluZGV4IDk3Yzg3OTguLmM2NTUzZmUgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3Rlc3RkYXRhL2xzdG1fdGVzdF9kYXRhX2dlbmVyYXRvci5weQorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy90ZXN0ZGF0YS9sc3RtX3Rlc3RfZGF0YV9nZW5lcmF0b3IucHkKQEAgLTE3LDE1ICsxNywxNSBAQAogMi4gUHJpbnQgdGhlIGludGVybWVkaWF0ZSBzdGVwIG91dHB1dHMgaW5zaWRlIHRoZSBMU1RNIGZvciBhIHNpbmdsZSBzdGVwIExTVE0gaW52b2NhdGlvbiAoR2V0MlgyR2F0ZU91dHB1dENoZWNrRGF0YSBpbiAuY2MpCiAzLiBQcmludCB0aGUgb3V0cHV0cyBmb3IgbXVsdGktc3RlcCBMU1RNIGludm9jYXRpb24gKEdldDJYMkxzdG1FdmFsQ2hlY2tEYXRhIGluIC5jYykKIAotRXZlcnkgaW52b2NhdGlvbiBnaXZlcyB0aHJlZSB0eXBlcyBpbmZvcm1hdGlvbjogCi0xLiBRdWFudGl6ZWQgb3V0cHV0OiBrZXJuZWwgb3V0cHV0IGluIGludGVnZXIgCitFdmVyeSBpbnZvY2F0aW9uIGdpdmVzIHRocmVlIHR5cGVzIGluZm9ybWF0aW9uOgorMS4gUXVhbnRpemVkIG91dHB1dDoga2VybmVsIG91dHB1dCBpbiBpbnRlZ2VyCiAyLiBEZXF1YW50aXplZCBvdXRwdXQ6IFF1YW50aXplZCBvdXRwdXQgaW4gZmxvYXRpbmcgcG9pbnQgcmVwcmVzZW50YXRpb24KIDMuIEZsb2F0IG91dHB1dDogb3V0cHV0IGZyb20gdGhlIGZsb2F0aW5nIHBvaW50IGNvbXB1dGF0aW9uIChpLmUuLCBmbG9hdCBrZXJuZWwpCiAKLU5vdGU6IAorTm90ZToKIDEuIENoYW5nZSBxdWFudGl6YXRpb24gc2V0dGluZ3MgaW4gX0tFUk5FTF9DT05GSUcgdG8gc2VlIHRoZSBvdXRjb21lcyBmcm9tIHZhcmlvdXMgcXVhbnRpemF0aW9uIHNjaGVtYSAoZS5nLiwgOHg4IFZzLiAxNng4KQogMi4gT25seSBzaW5nbGUgYmF0Y2ggaW5mZXJlbmNlIGlzIHN1cHBvcnRlIGhlcmUuIENoYW5nZSBfR0FURV9URVNUX0RBVEEgb3IgX01VTFRJU1RFUF9URVNUX0RBVEEgdG8gc2VlIGtlcm5lbCBvdXRwdXRzIG9uIGRpZmZlcmVudCBpbnB1dCBkYXRhCi0zLiBUaGUgcXVhbnRpemF0aW9uIGNvbXB1dGF0aW9uIGhlcmUgaXMgbm90IHRoZSBleGFjdCBhcyB0aGUgYysrIGltcGxlbWVudGF0aW9uLiBUaGUgaW50ZWdlciBjYWxjdWxhdGlvbiBpcyBtaW1pY2VkIGhlcmUgdXNpbmcgZmxvYXRpbmcgcG9pbnQuIAorMy4gVGhlIHF1YW50aXphdGlvbiBjb21wdXRhdGlvbiBoZXJlIGlzIG5vdCB0aGUgZXhhY3QgYXMgdGhlIGMrKyBpbXBsZW1lbnRhdGlvbi4gVGhlIGludGVnZXIgY2FsY3VsYXRpb24gaXMgZW11bGF0ZWQgaGVyZSB1c2luZyBmbG9hdGluZyBwb2ludC4KIE5vIGZpeGVkIHBvaW50IG1hdGggaXMgaW1wbGVtZW50ZWQgaGVyZS4gVGhlIHB1cnBvc2UgaXMgdG8gaWxsdXN0cmF0ZSB0aGUgY29tcHV0YXRpb24gcHJvY2VkdXJlIGFuZCBwb3NzaWJsZSBxdWFudGl6YXRpb24gZXJyb3IgYWNjdW11bGF0aW9uLCBub3QgZm9yIGJpdCBleGFjdG5lc3MuCiAiIiIKIGZyb20gYWJzbCBpbXBvcnQgYXBwCkBAIC04OCw3ICs4OCw3IEBACiBfTVVMVElTVEVQX1RFU1RfREFUQSA9IHsKICAgICAnaW5pdF9oaWRkZW5fc3RhdGVfdmFscyc6IFswLCAwXSwKICAgICAnaW5pdF9jZWxsX3N0YXRlX3ZhbHMnOiBbMCwgMF0sCi0gICAgJ2lucHV0X2RhdGEnOiBbMC4yLCAwLjMsIDAuMiwgMC4zLCAwLjIsIDAuM10sICAjIHRocmVlIHRpbWUgc3RlcHMgCisgICAgJ2lucHV0X2RhdGEnOiBbMC4yLCAwLjMsIDAuMiwgMC4zLCAwLjIsIDAuM10sICAjIHRocmVlIHRpbWUgc3RlcHMKICAgICAnaGlkZGVuX3N0YXRlX3JhbmdlJzogKC0wLjUsIDAuNyksCiAgICAgJ2NlbGxfc3RhdGVfcmFuZ2UnOiBbLTgsIDhdLAogICAgICdpbnB1dF9kYXRhX3JhbmdlJzogWy0xLCAxXQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvdGVzdGRhdGEvbHN0bV90ZXN0X2RhdGFfdXRpbHMucHkgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy90ZXN0ZGF0YS9sc3RtX3Rlc3RfZGF0YV91dGlscy5weQppbmRleCAzNDViMTQzLi4xNDJhNThjIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy90ZXN0ZGF0YS9sc3RtX3Rlc3RfZGF0YV91dGlscy5weQorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy90ZXN0ZGF0YS9sc3RtX3Rlc3RfZGF0YV91dGlscy5weQpAQCAtOTIsMTQgKzkyLDE0IEBACiAKIAogZGVmIHF1YW50aXplZF9zaWdtb2lkKGlucHV0LCBpbnB1dF9zY2FsZSwgb3V0cHV0X3NjYWxlLCBudW1fYml0cz0xNik6Ci0gICIiIlNpZ21vaWQgKGludGVyZ2VyKSIiIgorICAiIiJTaWdtb2lkIChpbnRlZ2VyKSIiIgogICBmbG9hdF9pbnB1dCA9IGlucHV0ICogaW5wdXRfc2NhbGUKICAgZmxvYXRfcmVzdWx0ID0gc2lnbW9pZChmbG9hdF9pbnB1dCkKICAgcmV0dXJuIHF1YW50aXplX2RhdGEoZmxvYXRfcmVzdWx0LCBvdXRwdXRfc2NhbGUsIGJpdF93aWR0aD1udW1fYml0cykKIAogCiBkZWYgcXVhbnRpemVkX3RhbmgoaW5wdXQsIGlucHV0X3NjYWxlLCBvdXRwdXRfc2NhbGUsIG51bV9iaXRzPTE2KToKLSAgIiIiVGFuaCAoaW50ZXJnZXIpIiIiCisgICIiIlRhbmggKGludGVnZXIpIiIiCiAgIGZsb2F0X2lucHV0ID0gaW5wdXQgKiBpbnB1dF9zY2FsZQogICBmbG9hdF9yZXN1bHQgPSBucC50YW5oKGZsb2F0X2lucHV0KQogICByZXR1cm4gcXVhbnRpemVfZGF0YShmbG9hdF9yZXN1bHQsIG91dHB1dF9zY2FsZSwgYml0X3dpZHRoPW51bV9iaXRzKQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvdHJhbnNwb3NlLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvdHJhbnNwb3NlLmNjCmluZGV4IGM1NzgxMmIuLjkxNWRlZjUgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3RyYW5zcG9zZS5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy90cmFuc3Bvc2UuY2MKQEAgLTQ2LDcgKzQ2LDcgQEAKICAgVGZMaXRlVGVuc29yKiBvdXRwdXQ7CiB9OwogCi1UZkxpdGVTdGF0dXMgUHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgVHJhbnNwb3NlUHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bUlucHV0cyhub2RlKSwgMik7CiAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bU91dHB1dHMobm9kZSksIDEpOwogCkBAIC03Miw3ICs3Miw3IEBACiAgIHJldHVybiBrVGZMaXRlT2s7CiB9CiAKLVRmTGl0ZVN0YXR1cyBFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBUcmFuc3Bvc2VFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogcGVybV90ZW5zb3IgPQogICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KGNvbnRleHQsIG5vZGUsIGtQZXJtVGVuc29yKTsKICAgY29uc3QgaW50MzJfdCogcGVybV9kYXRhID0gcGVybV90ZW5zb3ItPmRhdGEuaTMyOwpAQCAtMTIzLDYgKzEyMyw2IEBACiB9ICAvLyBuYW1lc3BhY2UKIAogVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9UUkFOU1BPU0UoKSB7Ci0gIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKG51bGxwdHIsIFByZXBhcmUsIEV2YWwpOworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChudWxscHRyLCBUcmFuc3Bvc2VQcmVwYXJlLCBUcmFuc3Bvc2VFdmFsKTsKIH0KIH0gIC8vIG5hbWVzcGFjZSB0ZmxpdGUKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3RyYW5zcG9zZV9jb252LmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvdHJhbnNwb3NlX2NvbnYuY2MKaW5kZXggYTJhYzJiNC4uZWEwZWZhZSAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvdHJhbnNwb3NlX2NvbnYuY2MKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvdHJhbnNwb3NlX2NvbnYuY2MKQEAgLTE1LDYgKzE1LDkgQEAKIAogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3JlZmVyZW5jZS90cmFuc3Bvc2VfY29udi5oIgogCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2MvYnVpbHRpbl9vcF9kYXRhLmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2MvY29tbW9uLmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvY29tbW9uLmgiCkBAIC00OCw4ICs1MSw5IEBACiAgIC8vIEEgc2NyYXRjaCBidWZmZXIgaXMgcmVxdWlyZWQgZm9yIHF1YW50aXplZCBpbXBsZW1lbnRhdGlvbnMuCiAgIGludCBzY3JhdGNoX2J1ZmZlcl9pbmRleDsKIAotICAvLyBUT0RPKGIvMTkyMDkwNTMxKTogUmVtb3ZlIHRoaXMgb25jZSBhbGwgOHgxNiB0cmFuc3Bvc2UgY29udiBtb2RlbHMgdXNlCi0gIC8vIDY0LWJpdCBiaWFzZXMuCisgIC8vIEluZGV4IHRvIHRoZSBjb252ZXJ0ZWQgNjQtYml0IGJpYXMgYnVmZmVyIGZyb20gMTYtYml0IGJpYXMuIFRoaXMgaXMKKyAgLy8gcmVxdWlyZWQgdG8gaGFuZGxlIDE2eDggdHJhbnNwb3NlIGNvbnZvbHV0aW9ucyB3aGVyZSBhIDE2LWJpdCBiaWFzIGlzCisgIC8vIHByb3ZpZGVkLCB3aGVyZWFzIHRoZSBrZXJuZWwgZXhwZWN0cyA2NC1iaXQgYmlhc2VzLgogICBpbnQgYmlhc19jb252ZXJ0ZWRfYnVmZmVyX2luZGV4OwogCiAgIC8vIE11bHRpcGxpZXIgYW5kIHNoaWZ0IGFycmF5cyBhcmUgcmVxdWlyZWQgZm9yIHRoZSBpbnQ4IGltcGxlbWVudGF0aW9uLgpAQCAtMTIzLDcgKzEyNyw5IEBACiAgICAgaWYgKGlucHV0LT50eXBlID09IGtUZkxpdGVJbnQxNikgewogICAgICAgVEZMSVRFX0RDSEVDSyhmaWx0ZXItPnR5cGUgPT0ga1RmTGl0ZUludDgpOwogICAgICAgVEZMSVRFX0RDSEVDSyhvdXRwdXQtPnR5cGUgPT0ga1RmTGl0ZUludDE2KTsKLSAgICAgIGlmIChiaWFzLT50eXBlID09IGtUZkxpdGVJbnQxNikgeworICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBiaWFzIGlzIDE2IGJpdHMgZm9yIDE2eDggdHJhbnNwb3NlCisgICAgICAvLyBjb252b2x1dGlvbiB3aGVyZSB0aGUga2VybmVsIGFjdHVhbGx5IGV4cGVjdHMgNjQtYml0IGJpYXNlcy4KKyAgICAgIGlmIChiaWFzICE9IG51bGxwdHIgJiYgYmlhcy0+dHlwZSA9PSBrVGZMaXRlSW50MTYpIHsKICAgICAgICAgVEZMSVRFX0RDSEVDSygKICAgICAgICAgICAgIGNvbnRleHQtPlJlcXVlc3RTY3JhdGNoQnVmZmVySW5BcmVuYSgKICAgICAgICAgICAgICAgICBjb250ZXh0LCBHZXRUZW5zb3JTaGFwZShiaWFzKS5GbGF0U2l6ZSgpICogc2l6ZW9mKHN0ZDo6aW50NjRfdCksCkBAIC0xNDEsMTIgKzE0NywxMyBAQAogICByZXR1cm4ga1RmTGl0ZU9rOwogfQogCi12b2lkKiBJbml0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgewordm9pZCogVHJhbnNwb3NlQ29udkluaXQoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCkgewogICBURkxJVEVfRENIRUNLKGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlciAhPSBudWxscHRyKTsKICAgcmV0dXJuIGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlcihjb250ZXh0LCBzaXplb2YoT3BEYXRhKSk7CiB9CiAKLVRmTGl0ZVN0YXR1cyBQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBUcmFuc3Bvc2VDb252UHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIFRGTElURV9EQ0hFQ0sobm9kZS0+dXNlcl9kYXRhICE9IG51bGxwdHIpOwogICBURkxJVEVfRENIRUNLKG5vZGUtPmJ1aWx0aW5fZGF0YSAhPSBudWxscHRyKTsKIApAQCAtMjQzLDcgKzI1MCw3IEBACiAgIHJldHVybiBrVGZMaXRlT2s7CiB9CiAKLVRmTGl0ZVN0YXR1cyBFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBUcmFuc3Bvc2VDb252RXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0ID0KICAgICAgIHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dChjb250ZXh0LCBub2RlLCBrSW5wdXRUZW5zb3IpOwogICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBmaWx0ZXIgPQpAQCAtMjk4LDEyICszMDUsMTAgQEAKICAgICAgIGJyZWFrOwogICAgIH0KICAgICBjYXNlIGtUZkxpdGVJbnQxNjogewotICAgICAgc3RkOjppbnQ2NF90KiBzY3JhdGNoX2J1ZmZlciA9IHN0YXRpY19jYXN0PGludDY0X3QqPigKKyAgICAgIGF1dG8qIHNjcmF0Y2hfYnVmZmVyID0gc3RhdGljX2Nhc3Q8aW50NjRfdCo+KAogICAgICAgICAgIGNvbnRleHQtPkdldFNjcmF0Y2hCdWZmZXIoY29udGV4dCwgZGF0YS5zY3JhdGNoX2J1ZmZlcl9pbmRleCkpOwotICAgICAgLy8gVE9ETyhiLzE5MjA5MDUzMSk6IFJlbW92ZSB0aGlzIG9uY2UgYWxsIDh4MTYgdHJhbnNwb3NlIGNvbnYgbW9kZWxzIHVzZQotICAgICAgLy8gNjQtYml0IGJpYXNlcy4KICAgICAgIGlmIChiaWFzICE9IG51bGxwdHIgJiYgYmlhcy0+dHlwZSA9PSBrVGZMaXRlSW50MTYpIHsKLSAgICAgICAgc3RkOjppbnQ2NF90KiBiaWFzX2NvbnZlcnRlZF9idWZmZXIgPQorICAgICAgICBhdXRvKiBiaWFzX2NvbnZlcnRlZF9idWZmZXIgPQogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50NjRfdCo+KGNvbnRleHQtPkdldFNjcmF0Y2hCdWZmZXIoCiAgICAgICAgICAgICAgICAgY29udGV4dCwgZGF0YS5iaWFzX2NvbnZlcnRlZF9idWZmZXJfaW5kZXgpKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShiaWFzKS5GbGF0U2l6ZSgpOwpAQCAtMzQ2LDcgKzM1MSw4IEBACiB9ICAvLyBuYW1lc3BhY2UKIAogVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9UUkFOU1BPU0VfQ09OVigpIHsKLSAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoSW5pdCwgUHJlcGFyZSwgRXZhbCk7CisgIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKFRyYW5zcG9zZUNvbnZJbml0LCBUcmFuc3Bvc2VDb252UHJlcGFyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNwb3NlQ29udkV2YWwpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy90cmFuc3Bvc2VfY29udi5oIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvdHJhbnNwb3NlX2NvbnYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTk5Y2NiCi0tLSAvZGV2L251bGwKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvdHJhbnNwb3NlX2NvbnYuaApAQCAtMCwwICsxLDUwIEBACisvKiBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKyNpZm5kZWYgVEVOU09SRkxPV19MSVRFX01JQ1JPX0tFUk5FTFNfVFJBTlNQT1NFX0NPTlZfSF8KKyNkZWZpbmUgVEVOU09SRkxPV19MSVRFX01JQ1JPX0tFUk5FTFNfVFJBTlNQT1NFX0NPTlZfSF8KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvYy9idWlsdGluX29wX2RhdGEuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC90eXBlcy5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19jb21tb24uaCIKKworbmFtZXNwYWNlIHRmbGl0ZSB7CisKKy8vIFRoaXMgaXMgdGhlIG1vc3QgZ2VuZXJpYyBURkxNUmVnaXN0cmF0aW9uLiBUaGUgYWN0dWFsIHN1cHBvcnRlZCB0eXBlcworLy8gbWF5IHN0aWxsIGJlIHRhcmdldCBkZXBlbmRlbnQuIFRoZSBvbmx5IHJlcXVpcmVtZW50IGlzIHRoYXQgZXZlcnkKKy8vIGltcGxlbWVudGF0aW9uIChyZWZlcmVuY2Ugb3Igb3B0aW1pemVkKSBtdXN0IGRlZmluZSB0aGlzIGZ1bmN0aW9uLgorVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9UUkFOU1BPU0VfQ09OVigpOworCisjaWYgZGVmaW5lZChDTVNJU19OTikKKy8vIFJldHVybnMgYSBURkxNUmVnaXN0cmF0aW9uIHN0cnVjdCBmb3Iga2VybmVsIHZhcmlhbnQgdGhhdCBvbmx5IHN1cHBvcnRzCisvLyBpbnQ4LgorVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9UUkFOU1BPU0VfQ09OVl9JTlQ4KCk7CisKKyNlbHNlCisvLyBOb3RlIHRoYXQgd2hpbGUgdGhpcyBibG9jayBnZXRzIHVzZWQgZm9yIGJvdGggcmVmZXJlbmNlIGFuZCBvcHRpbWl6ZWQga2VybmVscworLy8gdGhhdCBkbyBub3QgaGF2ZSBhbnkgc3BlY2lhbGl6ZWQgaW1wbGVtZW50YXRpb25zLCB0aGUgb25seSBnb2FsIGhlcmUgaXMgdG8KKy8vIGRlZmluZSBmYWxsYmFjayBpbXBsZW1lbnRhdGlvbiB0aGF0IGFsbG93IHJlZmVyZW5jZSBrZXJuZWxzIHRvIHN0aWxsIGJlIHVzZWQKKy8vIGZyb20gYXBwbGljYXRpb25zIHRoYXQgY2FsbCBhIG1vcmUgc3BlY2lmaWMga2VybmVsIHZhcmlhbnQuCisKK2lubGluZSBURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX1RSQU5TUE9TRV9DT05WX0lOVDgoKSB7CisgIHJldHVybiBSZWdpc3Rlcl9UUkFOU1BPU0VfQ09OVigpOworfQorCisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQorCisjZW5kaWYgIC8vIFRFTlNPUkZMT1dfTElURV9NSUNST19LRVJORUxTX1RSQU5TUE9TRV9DT05WX0hfCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy90cmFuc3Bvc2VfY29udl90ZXN0LmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvdHJhbnNwb3NlX2NvbnZfdGVzdC5jYwppbmRleCAwZGRiM2IyLi40OWQyYzkwIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy90cmFuc3Bvc2VfY29udl90ZXN0LmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3RyYW5zcG9zZV9jb252X3Rlc3QuY2MKQEAgLTUzLDcgKzUzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAgLy8gc3RyaWRlX2hlaWdodAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUZkxpdGVBY3ROb25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMX07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVGZMaXRlTm9UeXBlfTsKIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiBUZkxpdGVTdGF0dXMgSW52b2tlVHJhbnNwb3NlQ29udihUZkxpdGVUZW5zb3IqIHRlbnNvcnMsIGludCB0ZW5zb3JzX3NpemUsCkBAIC0yNTMsNyArMjU0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAvLyBzdHJpZGVfaGVpZ2h0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1RmTGl0ZUFjdFJlbHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUZkxpdGVOb1R5cGV9OwogCiAgIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKAogICAgICAga1RmTGl0ZU9rLCB0ZmxpdGU6OnRlc3Rpbmc6OlRlc3RUcmFuc3Bvc2VDb252RmxvYXQoCkBAIC0yNzYsNyArMjc4LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLCAgICAgICAgICAgICAgICAgICAvLyBzdHJpZGVfaGVpZ2h0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1RmTGl0ZUFjdFJlbHUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUZkxpdGVOb1R5cGV9OwogCiAgIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKAogICAgICAga1RmTGl0ZU9rLCB0ZmxpdGU6OnRlc3Rpbmc6OlRlc3RUcmFuc3Bvc2VDb252RmxvYXQoCkBAIC0zMDQsNyArMzA3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgLy8gc3RyaWRlX2hlaWdodAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUZkxpdGVBY3RSZWx1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMX07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVGZMaXRlTm9UeXBlfTsKIAogICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUSgKICAgICAgIGtUZkxpdGVPaywKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3VuaWRpcmVjdGlvbmFsX3NlcXVlbmNlX2xzdG0uaCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3VuaWRpcmVjdGlvbmFsX3NlcXVlbmNlX2xzdG0uaAppbmRleCAxNmFhMjNiLi40NmY2YjJkIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy91bmlkaXJlY3Rpb25hbF9zZXF1ZW5jZV9sc3RtLmgKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvdW5pZGlyZWN0aW9uYWxfc2VxdWVuY2VfbHN0bS5oCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IDIwMjMgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8qIENvcHlyaWdodCAyMDI0IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAKIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMzYsMTAgKzM2LDE5IEBACiAvLyBpbXBsZW1lbnRhdGlvbnMuCiBURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX1VOSURJUkVDVElPTkFMX1NFUVVFTkNFX0xTVE1fSU5UOCgpOwogCisvLyBSZXR1cm5zIGEgVEZMTVJlZ2lzdHJhdGlvbiBzdHJ1Y3QgZm9yIGtlcm5lbCB2YXJpYW50IHRoYXQgb25seSBzdXBwb3J0cworLy8gaW50MTYgYWN0aXZhdGlvbnMgYW5kIGludDggd2VpZ2h0cyBhbmQgdXNlcyB0aGUgbGF0ZW5jeSBvcHRpbWl6ZWQKKy8vIGltcGxlbWVudGF0aW9ucy4KK1RGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfVU5JRElSRUNUSU9OQUxfU0VRVUVOQ0VfTFNUTV9JTlQxNigpOworCiAjZWxzZQogaW5saW5lIFRGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfVU5JRElSRUNUSU9OQUxfU0VRVUVOQ0VfTFNUTV9JTlQ4KCkgewogICByZXR1cm4gUmVnaXN0ZXJfVU5JRElSRUNUSU9OQUxfU0VRVUVOQ0VfTFNUTSgpOwogfQorCitpbmxpbmUgVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9VTklESVJFQ1RJT05BTF9TRVFVRU5DRV9MU1RNX0lOVDE2KCkgeworICByZXR1cm4gUmVnaXN0ZXJfVU5JRElSRUNUSU9OQUxfU0VRVUVOQ0VfTFNUTSgpOworfQogI2VuZGlmCiAKIH0gIC8vIG5hbWVzcGFjZSB0ZmxpdGUKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3VuaWRpcmVjdGlvbmFsX3NlcXVlbmNlX2xzdG1fdGVzdC5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3VuaWRpcmVjdGlvbmFsX3NlcXVlbmNlX2xzdG1fdGVzdC5jYwppbmRleCBjODVlNTZmLi4xZTVhODY4IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy91bmlkaXJlY3Rpb25hbF9zZXF1ZW5jZV9sc3RtX3Rlc3QuY2MKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvdW5pZGlyZWN0aW9uYWxfc2VxdWVuY2VfbHN0bV90ZXN0LmNjCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IDIwMjMgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8qIENvcHlyaWdodCAyMDI0IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAKIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMjgsNyArMjgsNiBAQAogbmFtZXNwYWNlIHsKIAogY29uc3RleHByIGludCBrTHN0bU1heE51bUlucHV0T3V0cHV0VGVuc29ycyA9IDI0ICsgMTsKLWNvbnN0ZXhwciBpbnQga0xzdG1JbnRlcm1lZGlhdGVUZW5zb3JCYXNlID0ga0xzdG1NYXhOdW1JbnB1dE91dHB1dFRlbnNvcnMgKyAxOwogCiAvLyBWYWxpZGF0ZSB0aGUgb3V0cHV0IHJlc3VsdCBhcnJheSB3aXRoIGdvbGRlbiB2YWx1ZXMKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgpAQCAtNTAsNDIgKzQ5LDIwIEBACiAgICAgTHN0bU5vZGVDb250ZW50PEFjdGl2YXRpb25UeXBlLCBXZWlnaHRUeXBlLCBCaWFzVHlwZSwgQ2VsbFR5cGUsIGJhdGNoX3NpemUsCiAgICAgICAgICAgICAgICAgICAgIHRpbWVfc3RlcHMsIGlucHV0X2RpbWVuc2lvbiwgc3RhdGVfZGltZW5zaW9uPiYKICAgICAgICAgbm9kZV9jb250ZW50cykgewotICBUZkxpdGVUZW5zb3IgdGVuc29yc1trTHN0bU1heE51bUlucHV0T3V0cHV0VGVuc29ycyArIDEgKyA1XTsKLSAgbWVtY3B5KHRlbnNvcnMsIG5vZGVfY29udGVudHMuR2V0VGVuc29ycygpLAotICAgICAgICAga0xzdG1NYXhOdW1JbnB1dE91dHB1dFRlbnNvcnMgKiBzaXplb2YoVGZMaXRlVGVuc29yKSk7Ci0KLSAgLy8gUHJvdmlkZSBhbHNvIGludGVybWVkaWF0ZSB0ZW5zb3JzIG5lZWRlZCBieSBvbGRlciBMU1RNIGltcGxlbWVudGF0aW9ucwotICBpbnQgaW50ZXJtZWRpYXRlX2FycmF5X2RhdGFbNl0gPSB7NSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtMc3RtSW50ZXJtZWRpYXRlVGVuc29yQmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtMc3RtSW50ZXJtZWRpYXRlVGVuc29yQmFzZSArIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTHN0bUludGVybWVkaWF0ZVRlbnNvckJhc2UgKyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0xzdG1JbnRlcm1lZGlhdGVUZW5zb3JCYXNlICsgMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtMc3RtSW50ZXJtZWRpYXRlVGVuc29yQmFzZSArIDR9OwotICBpbnQgaW5wdXRfemVyb19wb2ludHNbMl0gPSB7MSwgLTIxfTsKLSAgZmxvYXQgaW5wdXRfc2NhbGVzWzJdID0gezEsIDAuMDA0NzA1ODgyMTY1NTgwOTg4fTsKLSAgVGZMaXRlQWZmaW5lUXVhbnRpemF0aW9uIGlucHV0X3F1YW50ID0gewotICAgICAgdGZsaXRlOjp0ZXN0aW5nOjpGbG9hdEFycmF5RnJvbUZsb2F0cyhpbnB1dF9zY2FsZXMpLAotICAgICAgdGZsaXRlOjp0ZXN0aW5nOjpJbnRBcnJheUZyb21JbnRzKGlucHV0X3plcm9fcG9pbnRzKSwgMH07Ci0gIGludCBpbnRlcm1lZGlhdGVfZGltWzJdID0gezEsIDB9OwotICBmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgewotICAgIHRlbnNvcnNba0xzdG1JbnRlcm1lZGlhdGVUZW5zb3JCYXNlICsgaV0gPQotICAgICAgICBDcmVhdGVUZW5zb3I8aW50MTZfdD4obnVsbHB0ciwgSW50QXJyYXlGcm9tSW50cyhpbnRlcm1lZGlhdGVfZGltKSk7Ci0gICAgdGVuc29yc1trTHN0bUludGVybWVkaWF0ZVRlbnNvckJhc2UgKyBpXS5xdWFudGl6YXRpb24gPSB7Ci0gICAgICAgIGtUZkxpdGVBZmZpbmVRdWFudGl6YXRpb24sICZpbnB1dF9xdWFudH07Ci0gIH0KLQogICBjb25zdCBURkxNUmVnaXN0cmF0aW9uIHJlZ2lzdHJhdGlvbiA9IFJlZ2lzdGVyX1VOSURJUkVDVElPTkFMX1NFUVVFTkNFX0xTVE0oKTsKICAgYXV0byBidWlsZGluX2RhdGEgPSBub2RlX2NvbnRlbnRzLkJ1aWx0aW5EYXRhKCk7CiAgIG1pY3JvOjpLZXJuZWxSdW5uZXIgcnVubmVyKAotICAgICAgcmVnaXN0cmF0aW9uLCB0ZW5zb3JzLCBrTHN0bU1heE51bUlucHV0T3V0cHV0VGVuc29ycyArIDEgKyA1LAorICAgICAgcmVnaXN0cmF0aW9uLCBub2RlX2NvbnRlbnRzLkdldFRlbnNvcnMoKSwga0xzdG1NYXhOdW1JbnB1dE91dHB1dFRlbnNvcnMsCiAgICAgICBub2RlX2NvbnRlbnRzLktlcm5lbElucHV0cygpLCBub2RlX2NvbnRlbnRzLktlcm5lbE91dHB1dHMoKSwKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KCZidWlsZGluX2RhdGEpLAotICAgICAgSW50QXJyYXlGcm9tSW50cyhpbnRlcm1lZGlhdGVfYXJyYXlfZGF0YSkpOworICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oJmJ1aWxkaW5fZGF0YSkpOwogICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUShrVGZMaXRlT2ssIHJ1bm5lci5Jbml0QW5kUHJlcGFyZSgpKTsKICAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoa1RmTGl0ZU9rLCBydW5uZXIuSW52b2tlKCkpOwogCiAgIGNvbnN0IGF1dG8mIHF1YW50aXphdGlvbl9zZXR0aW5ncyA9IG5vZGVfY29udGVudHMuUXVhbnRpemF0aW9uU2V0dGluZ3MoKTsKIAorLy8gQ01TSVMtTk4gZG9lcyBub3QgdXNlIHRoZSBoaWRkZW4gc3RhdGUgYW5kIGNlbGwgc3RhdGUgdGVuc29ycyBzbyB0aGVzZSB0ZXN0cworLy8gZmFpbC4KKyNpZiAhZGVmaW5lZChDTVNJU19OTikKICAgZmxvYXQgZGVxdWFudGl6ZWRfaGlkZGVuX3N0YXRlW2JhdGNoX3NpemUgKiBzdGF0ZV9kaW1lbnNpb25dID0ge307CiAgIERlcXVhbnRpemUobm9kZV9jb250ZW50cy5HZXRIaWRkZW5TdGF0ZURhdGEoKSwgYmF0Y2hfc2l6ZSAqIHN0YXRlX2RpbWVuc2lvbiwKICAgICAgICAgICAgICBxdWFudGl6YXRpb25fc2V0dGluZ3MuaGlkZGVuX3N0YXRlLnNjYWxlLApAQCAtMTA0LDYgKzgxLDcgQEAKICAgVmFsaWRhdGVSZXN1bHRHb2xkZW5zKGV2YWxfY2hlY2tfZGF0YS5leHBlY3RlZF9jZWxsX3N0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgZGVxdWFudGl6ZWRfY2VsbF9zdGF0ZSwgYmF0Y2hfc2l6ZSAqIHN0YXRlX2RpbWVuc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxfc3RhdGVfdG9sZXJhbmNlKTsKKyNlbmRpZgogCiAgIGZsb2F0IGRlcXVhbnRpemVkX291dHB1dFtiYXRjaF9zaXplICogc3RhdGVfZGltZW5zaW9uICogdGltZV9zdGVwc10gPSB7fTsKICAgRGVxdWFudGl6ZShub2RlX2NvbnRlbnRzLkdldE91dHB1dERhdGEoKSwKQEAgLTE1MCw3ICsxMjgsNiBAQAogVEZfTElURV9NSUNST19URVNUU19CRUdJTgogLy8gVE9ETyhiLzIzMDY2NjA3OSkgZW5hYmxlIGJlbG93IHRlc3RzIGZvciB4dGVuc2Egd2hlbiB0aGUgeHRlbnNhCiAvLyBrZXJuZWwgaXMgcmVjb25jaWxlZCB3aXRoIHJlZmVyZW5jZSBrZXJuZWwKLSNpZiAhZGVmaW5lZChYVEVOU0EpCiBURl9MSVRFX01JQ1JPX1RFU1QoVGVzdFVuaWRpcmVjdGlvbmFsTFNUTUZsb2F0KSB7CiAgIGNvbnN0IHRmbGl0ZTo6dGVzdGluZzo6THN0bUV2YWxDaGVja0RhdGE8MTIsIDQsIDEyPiBrZXJuZWxfZXZhbF9kYXRhID0KICAgICAgIHRmbGl0ZTo6dGVzdGluZzo6R2V0MlgyTHN0bUV2YWxDaGVja0RhdGEoKTsKQEAgLTE5Myw1ICsxNzAsNCBAQAogICAgICAga2VybmVsX2V2YWxfZGF0YSwgaGlkZGVuX3N0YXRlX3RvbGVyYW5jZSwgY2VsbF9zdGF0ZV90b2xlcmFuY2UsCiAgICAgICBpbnQxNl9ub2RlX2NvbnRlbnRzKTsKIH0KLSNlbmRpZiAgLy8gIWRlZmluZWQoWFRFTlNBKQogVEZfTElURV9NSUNST19URVNUU19FTkQKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3VucGFjay5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3VucGFjay5jYwppbmRleCAzY2U0YzMzLi45Y2UxNjgzIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy91bnBhY2suY2MKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvdW5wYWNrLmNjCkBAIC03Miw3ICs3Miw3IEBACiAgIHJldHVybiBrVGZMaXRlT2s7CiB9CiAKLVRmTGl0ZVN0YXR1cyBFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBVbnBhY2tFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgVGZMaXRlVW5wYWNrUGFyYW1zKiBkYXRhID0KICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8VGZMaXRlVW5wYWNrUGFyYW1zKj4obm9kZS0+YnVpbHRpbl9kYXRhKTsKIApAQCAtMTAyLDcgKzEwMiw3IEBACiB9ICAvLyBuYW1lc3BhY2UKIAogVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9VTlBBQ0soKSB7Ci0gIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKG51bGxwdHIsIG51bGxwdHIsIEV2YWwpOworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChudWxscHRyLCBudWxscHRyLCBVbnBhY2tFdmFsKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvdmFyX2hhbmRsZS5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3Zhcl9oYW5kbGUuY2MKaW5kZXggMDYwODdmNy4uMGVmYjI4YyAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvdmFyX2hhbmRsZS5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy92YXJfaGFuZGxlLmNjCkBAIC0zNiwxMiArMzYsMTIgQEAKICAgaW50MzJfdCByZXNvdXJjZV9pZDsKIH07CiAKLXZvaWQqIEluaXQoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogYnVmZmVyLCBzaXplX3QgbGVuZ3RoKSB7Cit2b2lkKiBWYXJIYW5kbGVJbml0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgewogICBURkxJVEVfRENIRUNLKGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlciAhPSBudWxscHRyKTsKICAgcmV0dXJuIGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlcihjb250ZXh0LCBzaXplb2YoT3BEYXRhKSk7CiB9CiAKLVRmTGl0ZVN0YXR1cyBQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBWYXJIYW5kbGVQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgT3BEYXRhKiBvcF9kYXRhID0gcmVpbnRlcnByZXRfY2FzdDxPcERhdGEqPihub2RlLT51c2VyX2RhdGEpOwogICBjb25zdCBhdXRvKiBwYXJhbXMgPQogICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUZkxpdGVWYXJIYW5kbGVQYXJhbXMqPihub2RlLT5idWlsdGluX2RhdGEpOwpAQCAtNzIsNyArNzIsNyBAQAogICByZXR1cm4ga1RmTGl0ZU9rOwogfQogCi1UZkxpdGVTdGF0dXMgRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgVmFySGFuZGxlRXZhbChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIE9wRGF0YSogb3BfZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8T3BEYXRhKj4obm9kZS0+dXNlcl9kYXRhKTsKIAogICBUZkxpdGVFdmFsVGVuc29yKiBvdXRwdXQgPSB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsT3V0cHV0KGNvbnRleHQsIG5vZGUsIDApOwpAQCAtODcsNyArODcsOCBAQAogfSAgLy8gbmFtZXNwYWNlLgogCiBURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX1ZBUl9IQU5ETEUoKSB7Ci0gIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKEluaXQsIFByZXBhcmUsIEV2YWwpOworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChWYXJIYW5kbGVJbml0LCBWYXJIYW5kbGVQcmVwYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJIYW5kbGVFdmFsKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvd2hpbGUuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy93aGlsZS5jYwppbmRleCAwOTdhMzQyLi5hMTFhZGViIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy93aGlsZS5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy93aGlsZS5jYwpAQCAtMzYsMTIgKzM2LDEyIEBACiAgIGludCBib2R5X3N1YmdyYXBoX2luZGV4OwogfTsKIAotdm9pZCogSW5pdChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpIHsKK3ZvaWQqIFdoaWxlSW5pdChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpIHsKICAgVEZMSVRFX0RDSEVDSyhjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIgIT0gbnVsbHB0cik7CiAgIHJldHVybiBjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIoY29udGV4dCwgc2l6ZW9mKE9wRGF0YSkpOwogfQogCi1UZkxpdGVTdGF0dXMgUHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CitUZkxpdGVTdGF0dXMgV2hpbGVQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgT3BEYXRhKiBvcF9kYXRhID0gcmVpbnRlcnByZXRfY2FzdDxPcERhdGEqPihub2RlLT51c2VyX2RhdGEpOwogICBjb25zdCBhdXRvKiBwYXJhbXMgPQogICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUZkxpdGVXaGlsZVBhcmFtcyo+KG5vZGUtPmJ1aWx0aW5fZGF0YSk7CkBAIC03NCw3ICs3NCw3IEBACiAgIHJldHVybiBrVGZMaXRlT2s7CiB9CiAKLVRmTGl0ZVN0YXR1cyBFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBXaGlsZUV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBjb25zdCBPcERhdGEqIG9wX2RhdGEgPSByZWludGVycHJldF9jYXN0PE9wRGF0YSo+KG5vZGUtPnVzZXJfZGF0YSk7CiAKICAgdGZsaXRlOjpNaWNyb0NvbnRleHQqIG1pY3JvX2NvbnRleHQgPSB0ZmxpdGU6OkdldE1pY3JvQ29udGV4dChjb250ZXh0KTsKQEAgLTEyNyw3ICsxMjcsNyBAQAogfSAgLy8gbmFtZXNwYWNlLgogCiBURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX1dISUxFKCkgewotICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChJbml0LCBQcmVwYXJlLCBFdmFsKTsKKyAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoV2hpbGVJbml0LCBXaGlsZVByZXBhcmUsIFdoaWxlRXZhbCk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSB0ZmxpdGUKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9hZGQuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvYWRkLmNjCmluZGV4IDRlNGY4MDUuLmQzYzIzNzEgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9hZGQuY2MKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL2FkZC5jYwpAQCAtMTEzLDExICsxMTMsMTEgQEAKICAgb3BfcGFyYW1zLm91dHB1dF9zaGlmdCA9IGRhdGEtPm91dHB1dF9zaGlmdDsKICAgU2V0QWN0aXZhdGlvblBhcmFtcyhkYXRhLT5vdXRwdXRfYWN0aXZhdGlvbl9taW4sIGRhdGEtPm91dHB1dF9hY3RpdmF0aW9uX21heCwKICAgICAgICAgICAgICAgICAgICAgICAmb3BfcGFyYW1zKTsKLSNpZiAhKGRlZmluZWQoSElGSTQpKQorI2lmICEoZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkpCiAgIGJvb2wgbmVlZF9icm9hZGNhc3QgPSByZWZlcmVuY2Vfb3BzOjpQcm9jZXNzQnJvYWRjYXN0U2hhcGVzKAogICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoaW5wdXQxKSwKICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGlucHV0MiksICZvcF9wYXJhbXMpOwotI2VuZGlmICAvLyAhZGVmaW5lZChISUZJNCkKKyNlbmRpZiAgLy8gIWRlZmluZWQoSElGSTMpICYmICFkZWZpbmVkKEhJRkk0KSAmJiAhZGVmaW5lZChISUZJNSkKIAogICBzd2l0Y2ggKG91dHB1dC0+dHlwZSkgewogICAgIGNhc2Uga1RmTGl0ZUludDg6IHsKQEAgLTEyNiw3ICsxMjYsNyBAQAogICAgICAgICAgICoocmVpbnRlcnByZXRfY2FzdDxYdGVuc2FBZGRPcERhdGEqPihub2RlLT51c2VyX2RhdGEpKTsKICAgICAgIEFkZEV2YWxRdWFudGl6ZWRWaXNpb24oY29udGV4dCwgbm9kZSwgKnBhcmFtcywgb3BfZGF0YSwgaW5wdXQxLCBpbnB1dDIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCk7Ci0jZWxpZiBkZWZpbmVkKEhJRkk0KSAgLy8gZGVmaW5lZChWSVNJT05fUDYpCisjZWxpZiBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KSAgLy8gZGVmaW5lZChWSVNJT05fUDYpCiAgICAgICBpbnQgZXJyOwogICAgICAgY29uc3QgUnVudGltZVNoYXBlIGV4dGVuZGVkX2lucHV0MV9zaGFwZSA9CiAgICAgICAgICAgUnVudGltZVNoYXBlOjpFeHRlbmRlZFNoYXBlKDQsIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGlucHV0MSkpOwpAQCAtMTUwLDcgKzE1MCw3IEBACiAgICAgICAgICAgb3BfcGFyYW1zLmxlZnRfc2hpZnQpOwogCiAgICAgICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCBlcnIgPT0gMCk7Ci0jZWxzZSAgICAgICAgICAgICAgICAgLy8gZGVmaW5lZChWSVNJT05fUDYpCisjZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmaW5lZChWSVNJT05fUDYpCiAgICAgICBpZiAobmVlZF9icm9hZGNhc3QpIHsKICAgICAgICAgcmVmZXJlbmNlX2ludGVnZXJfb3BzOjpCcm9hZGNhc3RBZGQ0RFNsb3coCiAgICAgICAgICAgICBvcF9wYXJhbXMsIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGlucHV0MSksCkBAIC0xNjgsMTEgKzE2OCwxMSBAQAogICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUob3V0cHV0KSwKICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihvdXRwdXQpKTsKICAgICAgIH0KLSNlbmRpZiAgICAgICAgICAgICAgICAvLyBkZWZpbmVkKFZJU0lPTl9QNikKKyNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZpbmVkKFZJU0lPTl9QNikKICAgICAgIGJyZWFrOwogICAgIH0KICAgICBjYXNlIGtUZkxpdGVJbnQxNjogewotI2lmIGRlZmluZWQoSElGSTQpCisjaWYgZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKICAgICAgIGludCBlcnI7CiAgICAgICBjb25zdCBSdW50aW1lU2hhcGUgZXh0ZW5kZWRfaW5wdXQxX3NoYXBlID0KICAgICAgICAgICBSdW50aW1lU2hhcGU6OkV4dGVuZGVkU2hhcGUoNCwgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoaW5wdXQxKSk7CkBAIC0xOTYsNyArMTk2LDcgQEAKICAgICAgICAgICBvcF9wYXJhbXMubGVmdF9zaGlmdCk7CiAKICAgICAgIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIGVyciA9PSAwKTsKLSNlbHNlICAgLy8gZGVmaW5lZChISUZJNCkKKyNlbHNlICAgLy8gZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKICAgICAgIGlmIChuZWVkX2Jyb2FkY2FzdCkgewogICAgICAgICByZWZlcmVuY2Vfb3BzOjpCcm9hZGNhc3RBZGQ0RFNsb3coCiAgICAgICAgICAgICBvcF9wYXJhbXMsIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGlucHV0MSksCkBAIC0yMTQsNyArMjE0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50MTZfdD4ob3V0cHV0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKICAgICAgIH0KLSNlbmRpZiAgLy8gZGVmaW5lZChISUZJNCkKKyNlbmRpZiAgLy8gZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKICAgICAgIGJyZWFrOwogICAgIH0KICAgICBkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL2NvbnYuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvY29udi5jYwppbmRleCA1OWU1NzZjLi4zODRkYmE5IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvY29udi5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvY29udi5jYwpAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAyMDIxIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTMyLDMxICszMiw2IEBACiBuYW1lc3BhY2UgdGZsaXRlIHsKIG5hbWVzcGFjZSB7CiAKLXZvaWQqIEluaXQoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogYnVmZmVyLCBzaXplX3QgbGVuZ3RoKSB7Ci0gIFRGTElURV9EQ0hFQ0soY29udGV4dC0+QWxsb2NhdGVQZXJzaXN0ZW50QnVmZmVyICE9IG51bGxwdHIpOwotICB2b2lkKiBkYXRhID0KLSAgICAgIGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlcihjb250ZXh0LCBzaXplb2YoWHRlbnNhQ29udk9wRGF0YSkpOwotI2lmIGRlZmluZWQoVklTSU9OX1A2KQotICBpZiAoSW5pdFh0ZW5zYUNvbnRleHQoKSkgewotICAgIHJldHVybiBudWxscHRyOwotICB9Ci0jZW5kaWYgIC8vIGRlZmluZWQoVklTSU9OX1A2KQotCi0gIHJldHVybiBkYXRhOwotfQotCi1UZkxpdGVTdGF0dXMgUHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7Ci0gIFRGX0xJVEVfRU5TVVJFX09LKGNvbnRleHQsIENvbnZQcmVwYXJlKGNvbnRleHQsIG5vZGUpKTsKLQotI2lmIGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCi0gIFRGX0xJVEVfRU5TVVJFX09LKGNvbnRleHQsIENvbnZQcmVwYXJlSGlmaShjb250ZXh0LCBub2RlKSk7Ci0jZW5kaWYKLSNpZiBkZWZpbmVkKFZJU0lPTl9QNikKLSAgVEZfTElURV9FTlNVUkVfT0soY29udGV4dCwgQ29udlByZXBhcmVWaXNpb24oY29udGV4dCwgbm9kZSkpOwotI2VuZGlmICAvLyBWSVNJT05fUDYKLSAgcmV0dXJuIGtUZkxpdGVPazsKLX0KLQogVGZMaXRlU3RhdHVzIEV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBURkxJVEVfRENIRUNLKG5vZGUtPnVzZXJfZGF0YSAhPSBudWxscHRyKTsKICAgVEZMSVRFX0RDSEVDSyhub2RlLT5idWlsdGluX2RhdGEgIT0gbnVsbHB0cik7CkBAIC03Myw2OCArNDgsNzYgQEAKICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogZmlsdGVyID0KICAgICAgIHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dChjb250ZXh0LCBub2RlLCBrQ29udldlaWdodHNUZW5zb3IpOwogICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBiaWFzID0KLSAgICAgIChOdW1JbnB1dHMobm9kZSkgPT0gMykKLSAgICAgICAgICA/IHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dChjb250ZXh0LCBub2RlLCBrQ29udkJpYXNUZW5zb3IpCi0gICAgICAgICAgOiBudWxscHRyOwotCi0gIFRmTGl0ZUV2YWxUZW5zb3IgZmlsdGVyX2ludDggPSB0ZmxpdGU6Om1pY3JvOjpNYWtlVW5wYWNrZWRJbnQ0VGVuc29yKAotICAgICAgY29udGV4dCwgb3BfZGF0YS5yZWZlcmVuY2Vfb3BfZGF0YS5maWx0ZXJfYnVmZmVyX2luZGV4LCBmaWx0ZXIpOworICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KGNvbnRleHQsIG5vZGUsIGtDb252Qmlhc1RlbnNvcik7CiAKICAgc3dpdGNoIChpbnB1dC0+dHlwZSkgeworICAgIGNhc2Uga1RmTGl0ZUZsb2F0MzI6IHsKKyAgICAgIHRmbGl0ZTo6cmVmZXJlbmNlX29wczo6Q29udigKKyAgICAgICAgICBDb252UGFyYW1zRmxvYXQocGFyYW1zLCBvcF9kYXRhLnJlZmVyZW5jZV9vcF9kYXRhKSwKKyAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShpbnB1dCksCisgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxmbG9hdD4oaW5wdXQpLAorICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGZpbHRlciksCisgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxmbG9hdD4oZmlsdGVyKSwKKyAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShiaWFzKSwKKyAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRPcHRpb25hbFRlbnNvckRhdGE8ZmxvYXQ+KGJpYXMpLAorICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKG91dHB1dCksCisgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxmbG9hdD4ob3V0cHV0KSwKKyAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShudWxscHRyKSwgbnVsbHB0cik7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgY2FzZSBrVGZMaXRlSW50ODogewotICAgICAgc3dpdGNoIChmaWx0ZXJfaW50OC50eXBlKSB7Ci0gICAgICAgIGNhc2Uga1RmTGl0ZUludDg6IHsKLSNpZiBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQotICAgICAgICAgIENvbnZFdmFsSGlmaShjb250ZXh0LCBub2RlLCBwYXJhbXMsIG9wX2RhdGEsIGlucHV0LCAmZmlsdGVyX2ludDgsCi0gICAgICAgICAgICAgICAgICAgICAgIGJpYXMsIG91dHB1dCk7Ci0jZWxpZiBkZWZpbmVkKFZJU0lPTl9QNikKLSAgICAgICAgICByZXR1cm4gQ29udkV2YWxWaXNpb24oY29udGV4dCwgbm9kZSwgcGFyYW1zLCBvcF9kYXRhLCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbHRlcl9pbnQ4LCBiaWFzLCBvdXRwdXQpOwotI2Vsc2UKLSAgICAgICAgICByZWZlcmVuY2VfaW50ZWdlcl9vcHM6OkNvbnZQZXJDaGFubmVsKAotICAgICAgICAgICAgICBDb252UGFyYW1zUXVhbnRpemVkKHBhcmFtcywgb3BfZGF0YS5yZWZlcmVuY2Vfb3BfZGF0YSksCi0gICAgICAgICAgICAgIG9wX2RhdGEucmVmZXJlbmNlX29wX2RhdGEucGVyX2NoYW5uZWxfb3V0cHV0X211bHRpcGxpZXIsCi0gICAgICAgICAgICAgIG9wX2RhdGEucmVmZXJlbmNlX29wX2RhdGEucGVyX2NoYW5uZWxfb3V0cHV0X3NoaWZ0LAotICAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShpbnB1dCksCi0gICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihpbnB1dCksCi0gICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGZpbHRlciksCi0gICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PigmZmlsdGVyX2ludDgpLAotICAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShiaWFzKSwKLSAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0T3B0aW9uYWxUZW5zb3JEYXRhPGludDMyX3Q+KGJpYXMpLAotICAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShvdXRwdXQpLAotICAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4ob3V0cHV0KSk7Ci0gICAgICAgICAgcmV0dXJuIGtUZkxpdGVPazsKLSNlbmRpZgotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBNaWNyb1ByaW50ZigiRmlsdGVyIHR5cGUgJXMgKCVkKSBub3Qgc3VwcG9ydGVkLiIsCi0gICAgICAgICAgICAgICAgICAgICAgVGZMaXRlVHlwZUdldE5hbWUoZmlsdGVyLT50eXBlKSwgZmlsdGVyLT50eXBlKTsKLSAgICAgICAgICByZXR1cm4ga1RmTGl0ZUVycm9yOworI2lmIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCisgICAgICBpZiAocGFyYW1zLmRpbGF0aW9uX3dpZHRoX2ZhY3RvciA9PSAxICYmCisgICAgICAgICAgcGFyYW1zLmRpbGF0aW9uX2hlaWdodF9mYWN0b3IgPT0gMSkgeworICAgICAgICByZXR1cm4gQ29udkV2YWxIaWZpSW50OChjb250ZXh0LCBub2RlLCBwYXJhbXMsIG9wX2RhdGEsIGlucHV0LCBmaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpYXMsIG91dHB1dCk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQ29udlJlZmVyZW5jZUV2YWxJbnQ4KGNvbnRleHQsIG5vZGUpOwogICAgICAgfQotICAgICAgcmV0dXJuIGtUZkxpdGVPazsKKyNlbGlmIGRlZmluZWQoVklTSU9OX1A2KQorICAgICAgLy8gQXQgdGhpcyB0aW1lIHRoZSBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb24gaXMgZmFpbGluZyB0aGUgdW5pdCB0ZXN0cyBpbgorICAgICAgLy8gd2F5cyB0aGF0IGFyZSBub3QgZW50aXJlbHkgY2xlYXIgd2h5LiBGb3Igbm93LCB3ZSBoYXZlIGlkZW50aWZpZWQgc29tZQorICAgICAgLy8gb2YgdGhlIHByb2JsZW0gY2FzZXMgYW5kIGFyZSBtYW51YWxseSBpbnNlcnRpbmcgYSByZWZlcmVuY2UgZmFsbGJhY2suCisgICAgICAvLyBTZWUgaHR0cDovL2IvMjcwNzIwNjI1IGZvciBtb3JlIGRldGFpbHMuCisgICAgICBpZiAob3BfZGF0YS5pc19wZXJfY2hhbm5lbF9xdWFudGl6ZWQgfHwKKyAgICAgICAgICBpbnB1dC0+ZGltcy0+ZGF0YVsxXSAhPSBpbnB1dC0+ZGltcy0+ZGF0YVsyXSkgeworICAgICAgICByZXR1cm4gQ29udlJlZmVyZW5jZUV2YWxJbnQ4KGNvbnRleHQsIG5vZGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIENvbnZFdmFsVmlzaW9uKGNvbnRleHQsIG5vZGUsIHBhcmFtcywgb3BfZGF0YSwgaW5wdXQsIGZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpYXMsIG91dHB1dCk7CisgICAgICB9CisjZWxzZQorICAgICAgcmV0dXJuIENvbnZSZWZlcmVuY2VFdmFsSW50OChjb250ZXh0LCBub2RlKTsKKyNlbmRpZgogICAgIH0KICAgICBjYXNlIGtUZkxpdGVJbnQxNjogewotI2lmIGRlZmluZWQoSElGSTQpCi0gICAgICBDb252RXZhbEhpZmkxNihjb250ZXh0LCBub2RlLCBwYXJhbXMsIG9wX2RhdGEsIGlucHV0LCBmaWx0ZXIsIGJpYXMsCi0gICAgICAgICAgICAgICAgICAgICBvdXRwdXQpOworI2lmIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCisgICAgICAvLyBOb3RlIHRoYXQgaW50MzIgYmlhcyBpcyBub3Qgd2lkZWx5IHN1cHBvcnRlZCBhbmQgbWlnaHQgYmUgcmlza3kgKGUuZy4KKyAgICAgIC8vIGh0dHA6Ly9iLzI2MjAwMzc1MCkuIEFzIHN1Y2gsIHdoaWxlIHdlIGhhdmUgYSBmYWxsYmFjayB0byB0aGUgcmVmZXJlbmNlCisgICAgICAvLyBpbXBsZW1lbnRhdGlvbiwgcHJvZHVjdGlvbiB1c2UtY2FzZXMgc2hvdWxkIG9ubHkgaGF2ZSBpbnQ2NCBiaWFzLgorICAgICAgaWYgKGJpYXMtPnR5cGUgPT0ga1RmTGl0ZUludDMyKSB7CisgICAgICAgIHJldHVybiBDb252UmVmZXJlbmNlRXZhbEludDE2KGNvbnRleHQsIG5vZGUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIENvbnZFdmFsSGlmaUludDE2KGNvbnRleHQsIG5vZGUsIHBhcmFtcywgb3BfZGF0YSwgaW5wdXQsIGZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpYXMsIG91dHB1dCk7CisgICAgICB9CiAjZWxzZQogICAgICAgcmV0dXJuIENvbnZSZWZlcmVuY2VFdmFsSW50MTYoY29udGV4dCwgbm9kZSk7Ci0jZW5kaWYgIC8vIGRlZmluZWQoSElGSTQpCi0gICAgICBicmVhazsKKyNlbmRpZgogICAgIH0KICAgICBkZWZhdWx0OgogICAgICAgTWljcm9QcmludGYoIlR5cGUgJXMgKCVkKSBub3Qgc3VwcG9ydGVkLiIsIFRmTGl0ZVR5cGVHZXROYW1lKGlucHV0LT50eXBlKSwKICAgICAgICAgICAgICAgICAgIGlucHV0LT50eXBlKTsKICAgICAgIHJldHVybiBrVGZMaXRlRXJyb3I7CiAgIH0KKwogICByZXR1cm4ga1RmTGl0ZU9rOwogfQorCiB9ICAvLyBuYW1lc3BhY2UKIAogVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9DT05WXzJEKCkgewotICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChJbml0LCBQcmVwYXJlLCBFdmFsKTsKKyAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoQ29udkluaXRYdGVuc2EsIENvbnZQcmVwYXJlWHRlbnNhLCBFdmFsKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL2NvbnZfY29tbW9uX3h0ZW5zYS5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9jb252X2NvbW1vbl94dGVuc2EuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA2M2U3NwotLS0gL2Rldi9udWxsCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9jb252X2NvbW1vbl94dGVuc2EuY2MKQEAgLTAsMCArMSw1NiBAQAorLyogQ29weXJpZ2h0IDIwMjMgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvYy9idWlsdGluX29wX2RhdGEuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvYy9jb21tb24uaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9jb21tb24uaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC90ZW5zb3JfY3R5cGVzLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMva2VybmVsX3V0aWwuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jb252LmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMva2VybmVsX3V0aWwuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EveHRlbnNhLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL3h0ZW5zYV9jb252LmgiCisKK25hbWVzcGFjZSB0ZmxpdGUgeworCit2b2lkKiBDb252SW5pdFh0ZW5zYShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKSB7CisgIFRGTElURV9EQ0hFQ0soY29udGV4dC0+QWxsb2NhdGVQZXJzaXN0ZW50QnVmZmVyICE9IG51bGxwdHIpOworICB2b2lkKiBkYXRhID0KKyAgICAgIGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlcihjb250ZXh0LCBzaXplb2YoWHRlbnNhQ29udk9wRGF0YSkpOworI2lmIGRlZmluZWQoVklTSU9OX1A2KQorICBpZiAoSW5pdFh0ZW5zYUNvbnRleHQoKSkgeworICAgIHJldHVybiBudWxscHRyOworICB9CisjZW5kaWYgIC8vIGRlZmluZWQoVklTSU9OX1A2KQorCisgIHJldHVybiBkYXRhOworfQorCitUZkxpdGVTdGF0dXMgQ29udlByZXBhcmVYdGVuc2EoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworICBURl9MSVRFX0VOU1VSRV9PSyhjb250ZXh0LCBDb252UHJlcGFyZShjb250ZXh0LCBub2RlKSk7CisKKyNpZiBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQorICBURl9MSVRFX0VOU1VSRV9PSyhjb250ZXh0LCBDb252UHJlcGFyZUhpZmkoY29udGV4dCwgbm9kZSkpOworI2VuZGlmICAvLyBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQorCisjaWYgZGVmaW5lZChWSVNJT05fUDYpCisgIFRGX0xJVEVfRU5TVVJFX09LKGNvbnRleHQsIENvbnZQcmVwYXJlVmlzaW9uKGNvbnRleHQsIG5vZGUpKTsKKyNlbmRpZiAgLy8gZGVmaW5lZChWSVNJT05fUDYpCisKKyAgcmV0dXJuIGtUZkxpdGVPazsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL2NvbnZfaGlmaS5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9jb252X2hpZmkuY2MKaW5kZXggNDg3Yzg0YS4uMWQyZDdlYyAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL2NvbnZfaGlmaS5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvY29udl9oaWZpLmNjCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IDIwMjEgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8qIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAKIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTMsMTQgKzEzLDE0IEBACiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAKLSNpZiBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQorI2lmIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCiAKICNpbmNsdWRlIDxjc3RkaW50PgogCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2MvYnVpbHRpbl9vcF9kYXRhLmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2MvY29tbW9uLmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvY29tbW9uLmgiCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvcmVmZXJlbmNlL2ludGVnZXJfb3BzL2NvbnYuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9wb3J0YWJsZV90ZW5zb3JfdXRpbHMuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC90ZW5zb3JfY3R5cGVzLmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMva2VybmVsX3V0aWwuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jb252LmgiCkBAIC0zOSwxNyArMzksNDMgQEAKICAgLy8gQ2FsY3VsYXRlIHNjcmF0Y2ggbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgcmVxdWVzdCBzY3JhdGNoIGJ1ZmZlcgogICBUZkxpdGVUZW5zb3IqIG91dHB1dCA9CiAgICAgICBtaWNyb19jb250ZXh0LT5BbGxvY2F0ZVRlbXBPdXRwdXRUZW5zb3Iobm9kZSwga0NvbnZPdXRwdXRUZW5zb3IpOwotICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCBvdXRwdXQgIT0gbnVsbHB0cik7CiAgIFRmTGl0ZVRlbnNvciogaW5wdXQgPQogICAgICAgbWljcm9fY29udGV4dC0+QWxsb2NhdGVUZW1wSW5wdXRUZW5zb3Iobm9kZSwga0NvbnZJbnB1dFRlbnNvcik7Ci0gIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIGlucHV0ICE9IG51bGxwdHIpOwogICBUZkxpdGVUZW5zb3IqIGZpbHRlciA9CiAgICAgICBtaWNyb19jb250ZXh0LT5BbGxvY2F0ZVRlbXBJbnB1dFRlbnNvcihub2RlLCBrQ29udldlaWdodHNUZW5zb3IpOwotICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCBmaWx0ZXIgIT0gbnVsbHB0cik7CisgIFRmTGl0ZVRlbnNvciogYmlhcyA9CisgICAgICBtaWNyb19jb250ZXh0LT5BbGxvY2F0ZVRlbXBJbnB1dFRlbnNvcihub2RlLCBrQ29udkJpYXNUZW5zb3IpOwogCiAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgaW5wdXRfc2hhcGUgPSBHZXRUZW5zb3JTaGFwZShpbnB1dCk7CiAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgZmlsdGVyX3NoYXBlID0gR2V0VGVuc29yU2hhcGUoZmlsdGVyKTsKICAgY29uc3QgUnVudGltZVNoYXBlJiBvdXRwdXRfc2hhcGUgPSBHZXRUZW5zb3JTaGFwZShvdXRwdXQpOworCisgIC8vIENoZWNrIGlmIHRoZSBYdGVuc2Egb3B0aW1pemVkIGNvZGUgY2FuIGJlIHVzZWQKKyAgLy8gSElGSTQgYW5kIEhJRkk1IGRvIG5vdCBhbGxvdyBiaWFzIGRhdGEgcG9pbnRlciB0byBiZSBudWxscHRyCisgIC8qIFRPRE8oYi8yNzcxMTI1MTYpOiBEaWxhdGlvbiBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCBvbiBIaUZpIDQgTk4gTGlicmFyeQorICAgKi8KKyAgYm9vbCBpbnB1dHNfYW5kX2JpYXNfb2sgPSBiaWFzICE9IG51bGxwdHI7CisjaWYgZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKKyAgaW5wdXRzX2FuZF9iaWFzX29rID0KKyAgICAgIGlucHV0c19hbmRfYmlhc19vayAmJgorICAgICAgKGlucHV0LT50eXBlID09IGtUZkxpdGVJbnQ4IHx8CisgICAgICAgKGlucHV0LT50eXBlID09IGtUZkxpdGVJbnQxNiAmJiBiaWFzLT50eXBlID09IGtUZkxpdGVJbnQ2NCkpOworI2Vsc2UKKyAgaW5wdXRzX2FuZF9iaWFzX29rID0gaW5wdXRzX2FuZF9iaWFzX29rICYmIChpbnB1dC0+dHlwZSA9PSBrVGZMaXRlSW50OCk7CisjZW5kaWYgIC8vIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCisgIGlmICghKGlucHV0c19hbmRfYmlhc19vayAmJiBwYXJhbXMtPmRpbGF0aW9uX3dpZHRoX2ZhY3RvciA9PSAxICYmCisgICAgICAgIHBhcmFtcy0+ZGlsYXRpb25faGVpZ2h0X2ZhY3RvciA9PSAxICYmCisgICAgICAgIGlucHV0X3NoYXBlLkRpbXMoMSkgPj0gZmlsdGVyX3NoYXBlLkRpbXMoMSkgJiYKKyAgICAgICAgaW5wdXRfc2hhcGUuRGltcygyKSA+PSBmaWx0ZXJfc2hhcGUuRGltcygyKSkpIHsKKyAgICBtaWNyb19jb250ZXh0LT5EZWFsbG9jYXRlVGVtcFRmTGl0ZVRlbnNvcihpbnB1dCk7CisgICAgbWljcm9fY29udGV4dC0+RGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3IoZmlsdGVyKTsKKyAgICBtaWNyb19jb250ZXh0LT5EZWFsbG9jYXRlVGVtcFRmTGl0ZVRlbnNvcihvdXRwdXQpOworICAgIGlmIChiaWFzICE9IG51bGxwdHIpIHsKKyAgICAgIG1pY3JvX2NvbnRleHQtPkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKGJpYXMpOworICAgIH0KKyAgICByZXR1cm4ga1RmTGl0ZU9rOworICB9CisKICAgY29uc3QgaW50IGlucHV0X2hlaWdodCA9IGlucHV0X3NoYXBlLkRpbXMoMSk7CiAgIGNvbnN0IGludCBpbnB1dF9kZXB0aCA9IE1hdGNoaW5nRGltKGlucHV0X3NoYXBlLCAzLCBmaWx0ZXJfc2hhcGUsIDMpOwogICBjb25zdCBpbnQgZmlsdGVyX2hlaWdodCA9IGZpbHRlcl9zaGFwZS5EaW1zKDEpOwpAQCAtNjAsNyArODYsNyBAQAogICBjb25zdCBpbnQgcGFkX2hlaWdodCA9IGRhdGEtPnJlZmVyZW5jZV9vcF9kYXRhLnBhZGRpbmcuaGVpZ2h0OwogCiAgIGludCByZXF1aXJlZF9zY3JhdGNoID0gMDsKLSAgLy8gRGlsYXRpb24gaXMgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgb24gSGlGaSA0IE5OIExpYnJhcnkKKyAgLy8gVE9ETyhiLzI3NzExMjUxNik6IERpbGF0aW9uIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkIG9uIEhpRmkgNCBOTiBMaWJyYXJ5CiAgIGlmICgocGFyYW1zLT5kaWxhdGlvbl93aWR0aF9mYWN0b3IgPT0gMSkgJiYKICAgICAgIChwYXJhbXMtPmRpbGF0aW9uX2hlaWdodF9mYWN0b3IgPT0gMSkpIHsKICAgICBpZiAoaW5wdXQtPnR5cGUgPT0ga1RmTGl0ZUludDgpIHsKQEAgLTgzLDI0NSArMTA5LDIyMCBAQAogICBtaWNyb19jb250ZXh0LT5EZWFsbG9jYXRlVGVtcFRmTGl0ZVRlbnNvcihpbnB1dCk7CiAgIG1pY3JvX2NvbnRleHQtPkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKGZpbHRlcik7CiAgIG1pY3JvX2NvbnRleHQtPkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKG91dHB1dCk7CisgIGlmIChiaWFzICE9IG51bGxwdHIpIHsKKyAgICBtaWNyb19jb250ZXh0LT5EZWFsbG9jYXRlVGVtcFRmTGl0ZVRlbnNvcihiaWFzKTsKKyAgfQogICByZXR1cm4ga1RmTGl0ZU9rOwogfQogCi0jaWYgZGVmaW5lZChISUZJNCkKLVRmTGl0ZVN0YXR1cyBDb252RXZhbEhpZmkxNihUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZUNvbnZQYXJhbXMmIHBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYdGVuc2FDb252T3BEYXRhJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGZpbHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBiaWFzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dCkgeworI2lmIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCitUZkxpdGVTdGF0dXMgQ29udkV2YWxIaWZpSW50MTYoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZkxpdGVDb252UGFyYW1zJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWHRlbnNhQ29udk9wRGF0YSYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBmaWx0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogYmlhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZkxpdGVFdmFsVGVuc29yKiBvdXRwdXQpIHsKICAgY29uc3QgUnVudGltZVNoYXBlJiBpbnB1dF9zaGFwZSA9IHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGlucHV0KTsKICAgY29uc3QgUnVudGltZVNoYXBlJiBmaWx0ZXJfc2hhcGUgPSB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShmaWx0ZXIpOwotICAvKiBUT0RPKGIvMjc3MTEyNTE2KTpEaWxhdGlvbiBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCBvbiBIaUZpIDQgTk4gTGlicmFyeQotICAgKi8KLSAgaWYgKChwYXJhbXMuZGlsYXRpb25fd2lkdGhfZmFjdG9yID09IDEpICYmCi0gICAgICAocGFyYW1zLmRpbGF0aW9uX2hlaWdodF9mYWN0b3IgPT0gMSkgJiYKLSAgICAgIGlucHV0X3NoYXBlLkRpbXMoMSkgPj0gZmlsdGVyX3NoYXBlLkRpbXMoMSkgJiYKLSAgICAgIGlucHV0X3NoYXBlLkRpbXMoMikgPj0gZmlsdGVyX3NoYXBlLkRpbXMoMikpIHsKLSAgICBjb25zdCBpbnQgc3RyaWRlX3dpZHRoID0gcGFyYW1zLnN0cmlkZV93aWR0aDsKLSAgICBjb25zdCBpbnQgc3RyaWRlX2hlaWdodCA9IHBhcmFtcy5zdHJpZGVfaGVpZ2h0OwotICAgIGNvbnN0IGludCBwYWRfd2lkdGggPSBkYXRhLnJlZmVyZW5jZV9vcF9kYXRhLnBhZGRpbmcud2lkdGg7Ci0gICAgY29uc3QgaW50IHBhZF9oZWlnaHQgPSBkYXRhLnJlZmVyZW5jZV9vcF9kYXRhLnBhZGRpbmcuaGVpZ2h0OwotICAgIGNvbnN0IGludDMyX3Qgb3V0cHV0X2FjdGl2YXRpb25fbWluID0KLSAgICAgICAgZGF0YS5yZWZlcmVuY2Vfb3BfZGF0YS5vdXRwdXRfYWN0aXZhdGlvbl9taW47Ci0gICAgY29uc3QgaW50MzJfdCBvdXRwdXRfYWN0aXZhdGlvbl9tYXggPQotICAgICAgICBkYXRhLnJlZmVyZW5jZV9vcF9kYXRhLm91dHB1dF9hY3RpdmF0aW9uX21heDsKKyAgY29uc3QgaW50IHN0cmlkZV93aWR0aCA9IHBhcmFtcy5zdHJpZGVfd2lkdGg7CisgIGNvbnN0IGludCBzdHJpZGVfaGVpZ2h0ID0gcGFyYW1zLnN0cmlkZV9oZWlnaHQ7CisgIGNvbnN0IGludCBwYWRfd2lkdGggPSBkYXRhLnJlZmVyZW5jZV9vcF9kYXRhLnBhZGRpbmcud2lkdGg7CisgIGNvbnN0IGludCBwYWRfaGVpZ2h0ID0gZGF0YS5yZWZlcmVuY2Vfb3BfZGF0YS5wYWRkaW5nLmhlaWdodDsKKyAgY29uc3QgaW50MzJfdCBvdXRwdXRfYWN0aXZhdGlvbl9taW4gPQorICAgICAgZGF0YS5yZWZlcmVuY2Vfb3BfZGF0YS5vdXRwdXRfYWN0aXZhdGlvbl9taW47CisgIGNvbnN0IGludDMyX3Qgb3V0cHV0X2FjdGl2YXRpb25fbWF4ID0KKyAgICAgIGRhdGEucmVmZXJlbmNlX29wX2RhdGEub3V0cHV0X2FjdGl2YXRpb25fbWF4OwogCi0gICAgY29uc3QgUnVudGltZVNoYXBlJiBvdXRwdXRfc2hhcGUgPSB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShvdXRwdXQpOwotICAgIGNvbnN0IGludCBiYXRjaGVzID0gTWF0Y2hpbmdEaW0oaW5wdXRfc2hhcGUsIDAsIG91dHB1dF9zaGFwZSwgMCk7Ci0gICAgY29uc3QgaW50IGlucHV0X2RlcHRoID0gTWF0Y2hpbmdEaW0oaW5wdXRfc2hhcGUsIDMsIGZpbHRlcl9zaGFwZSwgMyk7Ci0gICAgY29uc3QgaW50IG91dHB1dF9kZXB0aCA9IE1hdGNoaW5nRGltKGZpbHRlcl9zaGFwZSwgMCwgb3V0cHV0X3NoYXBlLCAzKTsKLSAgICBjb25zdCBpbnQgaW5wdXRfaGVpZ2h0ID0gaW5wdXRfc2hhcGUuRGltcygxKTsKLSAgICBjb25zdCBpbnQgaW5wdXRfd2lkdGggPSBpbnB1dF9zaGFwZS5EaW1zKDIpOwotICAgIGNvbnN0IGludCBmaWx0ZXJfaGVpZ2h0ID0gZmlsdGVyX3NoYXBlLkRpbXMoMSk7Ci0gICAgY29uc3QgaW50IGZpbHRlcl93aWR0aCA9IGZpbHRlcl9zaGFwZS5EaW1zKDIpOwotICAgIGNvbnN0IGludCBvdXRwdXRfaGVpZ2h0ID0gb3V0cHV0X3NoYXBlLkRpbXMoMSk7Ci0gICAgY29uc3QgaW50IG91dHB1dF93aWR0aCA9IG91dHB1dF9zaGFwZS5EaW1zKDIpOworICBjb25zdCBSdW50aW1lU2hhcGUmIG91dHB1dF9zaGFwZSA9IHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKG91dHB1dCk7CisgIGNvbnN0IGludCBiYXRjaGVzID0gTWF0Y2hpbmdEaW0oaW5wdXRfc2hhcGUsIDAsIG91dHB1dF9zaGFwZSwgMCk7CisgIGNvbnN0IGludCBpbnB1dF9kZXB0aCA9IE1hdGNoaW5nRGltKGlucHV0X3NoYXBlLCAzLCBmaWx0ZXJfc2hhcGUsIDMpOworICBjb25zdCBpbnQgb3V0cHV0X2RlcHRoID0gTWF0Y2hpbmdEaW0oZmlsdGVyX3NoYXBlLCAwLCBvdXRwdXRfc2hhcGUsIDMpOworICBjb25zdCBpbnQgaW5wdXRfaGVpZ2h0ID0gaW5wdXRfc2hhcGUuRGltcygxKTsKKyAgY29uc3QgaW50IGlucHV0X3dpZHRoID0gaW5wdXRfc2hhcGUuRGltcygyKTsKKyAgY29uc3QgaW50IGZpbHRlcl9oZWlnaHQgPSBmaWx0ZXJfc2hhcGUuRGltcygxKTsKKyAgY29uc3QgaW50IGZpbHRlcl93aWR0aCA9IGZpbHRlcl9zaGFwZS5EaW1zKDIpOworICBjb25zdCBpbnQgb3V0cHV0X2hlaWdodCA9IG91dHB1dF9zaGFwZS5EaW1zKDEpOworICBjb25zdCBpbnQgb3V0cHV0X3dpZHRoID0gb3V0cHV0X3NoYXBlLkRpbXMoMik7CiAKLSAgICBjb25zdCBpbnQxNl90KiBpbnB1dF9kYXRhID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90PihpbnB1dCk7Ci0gICAgY29uc3QgaW50OF90KiBmaWx0ZXJfZGF0YSA9IHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihmaWx0ZXIpOwotICAgIGNvbnN0IGludDY0X3QqIGJpYXNfZGF0YSA9IHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50NjRfdD4oYmlhcyk7Ci0gICAgaW50MTZfdCogb3V0cHV0X2RhdGEgPSB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KG91dHB1dCk7CisgIGNvbnN0IGludDE2X3QqIGlucHV0X2RhdGEgPSB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KGlucHV0KTsKKyAgY29uc3QgaW50OF90KiBmaWx0ZXJfZGF0YSA9IHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihmaWx0ZXIpOworICBjb25zdCBpbnQ2NF90KiBiaWFzX2RhdGEgPSB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDY0X3Q+KGJpYXMpOworICBpbnQxNl90KiBvdXRwdXRfZGF0YSA9IHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50MTZfdD4ob3V0cHV0KTsKIAotICAgIGludCBvdXRwdXRfZGF0YV9mb3JtYXQgPSAwOwotICAgIGludCBvdXRfbGVuZ3RoID0gb3V0cHV0X2hlaWdodCAqIG91dHB1dF93aWR0aCAqIG91dHB1dF9kZXB0aDsKLSAgICBpZiAoZmlsdGVyX2hlaWdodCA9PSAxICYmIGZpbHRlcl93aWR0aCA9PSAxKSB7Ci0gICAgICBmb3IgKGludCBiYXRjaCA9IDA7IGJhdGNoIDwgYmF0Y2hlczsgKytiYXRjaCkgewotICAgICAgICBpbnQxNl90KiBwX291dF90ZW1wOwotICAgICAgICBwX291dF90ZW1wID0gJm91dHB1dF9kYXRhW2JhdGNoICogb3V0X2xlbmd0aF07CisgIGludCBvdXRwdXRfZGF0YV9mb3JtYXQgPSAwOworICBpbnQgb3V0X2xlbmd0aCA9IG91dHB1dF9oZWlnaHQgKiBvdXRwdXRfd2lkdGggKiBvdXRwdXRfZGVwdGg7CisgIGlmIChmaWx0ZXJfaGVpZ2h0ID09IDEgJiYgZmlsdGVyX3dpZHRoID09IDEpIHsKKyAgICBmb3IgKGludCBiYXRjaCA9IDA7IGJhdGNoIDwgYmF0Y2hlczsgKytiYXRjaCkgeworICAgICAgaW50MTZfdCogcF9vdXRfdGVtcDsKKyAgICAgIHBfb3V0X3RlbXAgPSAmb3V0cHV0X2RhdGFbYmF0Y2ggKiBvdXRfbGVuZ3RoXTsKIAorICAgICAgVEZfTElURV9FTlNVUkVfRVEoCisgICAgICAgICAgY29udGV4dCwKKyAgICAgICAgICB4YV9ubl9jb252MmRfcG9pbnR3aXNlX3Blcl9jaGFuX3N5bThzeHN5bTE2cygKKyAgICAgICAgICAgICAgcF9vdXRfdGVtcCwgY29uc3RfY2FzdDxXT1JEOCo+KGZpbHRlcl9kYXRhKSwKKyAgICAgICAgICAgICAgY29uc3RfY2FzdDxXT1JEMTYqPigmaW5wdXRfZGF0YVtiYXRjaCAqIGlucHV0X2hlaWdodCAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfd2lkdGggKiBpbnB1dF9kZXB0aF0pLAorICAgICAgICAgICAgICBjb25zdF9jYXN0PFdPUkQ2NCo+KGJpYXNfZGF0YSksIGlucHV0X2hlaWdodCwgaW5wdXRfd2lkdGgsCisgICAgICAgICAgICAgIGlucHV0X2RlcHRoLCBvdXRwdXRfZGVwdGgsIDAsCisgICAgICAgICAgICAgIGRhdGEucmVmZXJlbmNlX29wX2RhdGEucGVyX2NoYW5uZWxfb3V0cHV0X211bHRpcGxpZXIsCisgICAgICAgICAgICAgIGRhdGEucmVmZXJlbmNlX29wX2RhdGEucGVyX2NoYW5uZWxfb3V0cHV0X3NoaWZ0LCAwLAorICAgICAgICAgICAgICBvdXRwdXRfZGF0YV9mb3JtYXQpLAorICAgICAgICAgIDApOworCisgICAgICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgeGFfbm5fdmVjX2FjdGl2YXRpb25fbWluX21heF8xNl8xNigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX291dF90ZW1wLCBwX291dF90ZW1wLCBvdXRwdXRfYWN0aXZhdGlvbl9taW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2FjdGl2YXRpb25fbWF4LCBvdXRfbGVuZ3RoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB2b2lkKiBwX3NjcmF0Y2ggPSBzdGF0aWNfY2FzdDx2b2lkKj4oCisgICAgICAgIGNvbnRleHQtPkdldFNjcmF0Y2hCdWZmZXIoY29udGV4dCwgZGF0YS5zY3JhdGNoX3RlbnNvcl9pbmRleCkpOworCisgICAgZm9yIChpbnQgYmF0Y2ggPSAwOyBiYXRjaCA8IGJhdGNoZXM7ICsrYmF0Y2gpIHsKKyAgICAgIGludDE2X3QqIHBfb3V0X3RlbXA7CisgICAgICBwX291dF90ZW1wID0gJm91dHB1dF9kYXRhW2JhdGNoICogb3V0X2xlbmd0aF07CisKKyAgICAgIHsKICAgICAgICAgVEZfTElURV9FTlNVUkVfRVEoCiAgICAgICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgeGFfbm5fY29udjJkX3BvaW50d2lzZV9wZXJfY2hhbl9zeW04c3hzeW0xNnMoCi0gICAgICAgICAgICAgICAgcF9vdXRfdGVtcCwgY29uc3RfY2FzdDxXT1JEOCo+KGZpbHRlcl9kYXRhKSwKLSAgICAgICAgICAgICAgICBjb25zdF9jYXN0PFdPUkQxNio+KCZpbnB1dF9kYXRhW2JhdGNoICogaW5wdXRfaGVpZ2h0ICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3dpZHRoICogaW5wdXRfZGVwdGhdKSwKLSAgICAgICAgICAgICAgICBjb25zdF9jYXN0PFdPUkQ2NCo+KGJpYXNfZGF0YSksIGlucHV0X2hlaWdodCwgaW5wdXRfd2lkdGgsCi0gICAgICAgICAgICAgICAgaW5wdXRfZGVwdGgsIG91dHB1dF9kZXB0aCwgMCwKKyAgICAgICAgICAgIHhhX25uX2NvbnYyZF9zdGRfcGVyX2NoYW5fc3ltOHN4c3ltMTZzKAorICAgICAgICAgICAgICAgIHBfb3V0X3RlbXAsCisgICAgICAgICAgICAgICAgJmlucHV0X2RhdGFbYmF0Y2ggKiBpbnB1dF9oZWlnaHQgKiBpbnB1dF93aWR0aCAqIGlucHV0X2RlcHRoXSwKKyAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGludDhfdCo+KGZpbHRlcl9kYXRhKSwgIC8vIGZpbHRlcl9kYXRhLAorICAgICAgICAgICAgICAgIGJpYXNfZGF0YSwgaW5wdXRfaGVpZ2h0LCBpbnB1dF93aWR0aCwgaW5wdXRfZGVwdGgsCisgICAgICAgICAgICAgICAgZmlsdGVyX2hlaWdodCwgZmlsdGVyX3dpZHRoLCBvdXRwdXRfZGVwdGgsIHN0cmlkZV93aWR0aCwKKyAgICAgICAgICAgICAgICBzdHJpZGVfaGVpZ2h0LCBwYWRfd2lkdGgsIHBhZF9oZWlnaHQsIG91dHB1dF9oZWlnaHQsCisgICAgICAgICAgICAgICAgb3V0cHV0X3dpZHRoLCAwLAogICAgICAgICAgICAgICAgIGRhdGEucmVmZXJlbmNlX29wX2RhdGEucGVyX2NoYW5uZWxfb3V0cHV0X211bHRpcGxpZXIsCiAgICAgICAgICAgICAgICAgZGF0YS5yZWZlcmVuY2Vfb3BfZGF0YS5wZXJfY2hhbm5lbF9vdXRwdXRfc2hpZnQsIDAsCi0gICAgICAgICAgICAgICAgb3V0cHV0X2RhdGFfZm9ybWF0KSwKKyAgICAgICAgICAgICAgICBvdXRwdXRfZGF0YV9mb3JtYXQsIHN0YXRpY19jYXN0PHZvaWQqPihwX3NjcmF0Y2gpKSwKICAgICAgICAgICAgIDApOwotCi0gICAgICAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHhhX25uX3ZlY19hY3RpdmF0aW9uX21pbl9tYXhfMTZfMTYoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX291dF90ZW1wLCBwX291dF90ZW1wLCBvdXRwdXRfYWN0aXZhdGlvbl9taW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfYWN0aXZhdGlvbl9tYXgsIG91dF9sZW5ndGgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgdm9pZCogcF9zY3JhdGNoID0gc3RhdGljX2Nhc3Q8dm9pZCo+KAotICAgICAgICAgIGNvbnRleHQtPkdldFNjcmF0Y2hCdWZmZXIoY29udGV4dCwgZGF0YS5zY3JhdGNoX3RlbnNvcl9pbmRleCkpOwotCi0gICAgICBmb3IgKGludCBiYXRjaCA9IDA7IGJhdGNoIDwgYmF0Y2hlczsgKytiYXRjaCkgewotICAgICAgICBpbnQxNl90KiBwX291dF90ZW1wOwotICAgICAgICBwX291dF90ZW1wID0gJm91dHB1dF9kYXRhW2JhdGNoICogb3V0X2xlbmd0aF07Ci0KLSAgICAgICAgewotICAgICAgICAgIFRGX0xJVEVfRU5TVVJFX0VRKAotICAgICAgICAgICAgICBjb250ZXh0LAotICAgICAgICAgICAgICB4YV9ubl9jb252MmRfc3RkX3Blcl9jaGFuX3N5bThzeHN5bTE2cygKLSAgICAgICAgICAgICAgICAgIHBfb3V0X3RlbXAsCi0gICAgICAgICAgICAgICAgICAmaW5wdXRfZGF0YVtiYXRjaCAqIGlucHV0X2hlaWdodCAqIGlucHV0X3dpZHRoICogaW5wdXRfZGVwdGhdLAotICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxpbnQ4X3QqPihmaWx0ZXJfZGF0YSksICAvLyBmaWx0ZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgIGJpYXNfZGF0YSwgaW5wdXRfaGVpZ2h0LCBpbnB1dF93aWR0aCwgaW5wdXRfZGVwdGgsCi0gICAgICAgICAgICAgICAgICBmaWx0ZXJfaGVpZ2h0LCBmaWx0ZXJfd2lkdGgsIG91dHB1dF9kZXB0aCwgc3RyaWRlX3dpZHRoLAotICAgICAgICAgICAgICAgICAgc3RyaWRlX2hlaWdodCwgcGFkX3dpZHRoLCBwYWRfaGVpZ2h0LCBvdXRwdXRfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgb3V0cHV0X3dpZHRoLCAwLAotICAgICAgICAgICAgICAgICAgZGF0YS5yZWZlcmVuY2Vfb3BfZGF0YS5wZXJfY2hhbm5lbF9vdXRwdXRfbXVsdGlwbGllciwKLSAgICAgICAgICAgICAgICAgIGRhdGEucmVmZXJlbmNlX29wX2RhdGEucGVyX2NoYW5uZWxfb3V0cHV0X3NoaWZ0LCAwLAotICAgICAgICAgICAgICAgICAgb3V0cHV0X2RhdGFfZm9ybWF0LCBzdGF0aWNfY2FzdDx2b2lkKj4ocF9zY3JhdGNoKSksCi0gICAgICAgICAgICAgIDApOwotICAgICAgICB9Ci0gICAgICAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHhhX25uX3ZlY19hY3RpdmF0aW9uX21pbl9tYXhfMTZfMTYoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX291dF90ZW1wLCBwX291dF90ZW1wLCBvdXRwdXRfYWN0aXZhdGlvbl9taW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfYWN0aXZhdGlvbl9tYXgsIG91dF9sZW5ndGgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgIH0KKyAgICAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICB4YV9ubl92ZWNfYWN0aXZhdGlvbl9taW5fbWF4XzE2XzE2KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfb3V0X3RlbXAsIHBfb3V0X3RlbXAsIG91dHB1dF9hY3RpdmF0aW9uX21pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfYWN0aXZhdGlvbl9tYXgsIG91dF9sZW5ndGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgMCk7CiAgICAgfQotICAgIHJldHVybiBrVGZMaXRlT2s7CiAgIH0KLSAgcmVmZXJlbmNlX2ludGVnZXJfb3BzOjpDb252UGVyQ2hhbm5lbCgKLSAgICAgIENvbnZQYXJhbXNRdWFudGl6ZWQocGFyYW1zLCBkYXRhLnJlZmVyZW5jZV9vcF9kYXRhKSwKLSAgICAgIGRhdGEucmVmZXJlbmNlX29wX2RhdGEucGVyX2NoYW5uZWxfb3V0cHV0X211bHRpcGxpZXIsCi0gICAgICBkYXRhLnJlZmVyZW5jZV9vcF9kYXRhLnBlcl9jaGFubmVsX291dHB1dF9zaGlmdCwKLSAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGlucHV0KSwKLSAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50MTZfdD4oaW5wdXQpLAotICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoZmlsdGVyKSwKLSAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihmaWx0ZXIpLAotICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoYmlhcyksCi0gICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDY0X3Q+KGJpYXMpLAotICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUob3V0cHV0KSwKLSAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50MTZfdD4ob3V0cHV0KSk7CisKICAgcmV0dXJuIGtUZkxpdGVPazsKIH0KLSNlbmRpZiAgLy8gZGVmaW5lZChISUZJNCkKKyNlbmRpZiAgLy8gZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKIAotVGZMaXRlU3RhdHVzIENvbnZFdmFsSGlmaShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZkxpdGVDb252UGFyYW1zJiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFh0ZW5zYUNvbnZPcERhdGEmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGJpYXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dCkgeworVGZMaXRlU3RhdHVzIENvbnZFdmFsSGlmaUludDgoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZUNvbnZQYXJhbXMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFh0ZW5zYUNvbnZPcERhdGEmIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGJpYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZkxpdGVFdmFsVGVuc29yKiBvdXRwdXQpIHsKICAgY29uc3QgUnVudGltZVNoYXBlJiBpbnB1dF9zaGFwZSA9IHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGlucHV0KTsKICAgY29uc3QgUnVudGltZVNoYXBlJiBmaWx0ZXJfc2hhcGUgPSB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShmaWx0ZXIpOwotICAvKiBUT0RPKGIvMjc3MTEyNTE2KTpEaWxhdGlvbiBpcyBjdXJyZW50bHkgbm90IHN1cHBvcnRlZCBvbiBIaUZpIDQgTk4KLSAgTGlicmFyeSAqLwotICBpZiAoKHBhcmFtcy5kaWxhdGlvbl93aWR0aF9mYWN0b3IgPT0gMSkgJiYKLSAgICAgIChwYXJhbXMuZGlsYXRpb25faGVpZ2h0X2ZhY3RvciA9PSAxKSAmJgotICAgICAgaW5wdXRfc2hhcGUuRGltcygxKSA+PSBmaWx0ZXJfc2hhcGUuRGltcygxKSAmJgotICAgICAgaW5wdXRfc2hhcGUuRGltcygyKSA+PSBmaWx0ZXJfc2hhcGUuRGltcygyKSkgewotICAgIGNvbnN0IGludDMyX3QgaW5wdXRfb2Zmc2V0ID0gLWRhdGEucmVmZXJlbmNlX29wX2RhdGEuaW5wdXRfemVyb19wb2ludDsKLSAgICBjb25zdCBpbnQzMl90IG91dHB1dF9vZmZzZXQgPSBkYXRhLnJlZmVyZW5jZV9vcF9kYXRhLm91dHB1dF96ZXJvX3BvaW50OwotICAgIGNvbnN0IGludCBzdHJpZGVfd2lkdGggPSBwYXJhbXMuc3RyaWRlX3dpZHRoOwotICAgIGNvbnN0IGludCBzdHJpZGVfaGVpZ2h0ID0gcGFyYW1zLnN0cmlkZV9oZWlnaHQ7Ci0gICAgY29uc3QgaW50IHBhZF93aWR0aCA9IGRhdGEucmVmZXJlbmNlX29wX2RhdGEucGFkZGluZy53aWR0aDsKLSAgICBjb25zdCBpbnQgcGFkX2hlaWdodCA9IGRhdGEucmVmZXJlbmNlX29wX2RhdGEucGFkZGluZy5oZWlnaHQ7Ci0gICAgY29uc3QgaW50MzJfdCBvdXRwdXRfYWN0aXZhdGlvbl9taW4gPQotICAgICAgICBkYXRhLnJlZmVyZW5jZV9vcF9kYXRhLm91dHB1dF9hY3RpdmF0aW9uX21pbjsKLSAgICBjb25zdCBpbnQzMl90IG91dHB1dF9hY3RpdmF0aW9uX21heCA9Ci0gICAgICAgIGRhdGEucmVmZXJlbmNlX29wX2RhdGEub3V0cHV0X2FjdGl2YXRpb25fbWF4OworICBjb25zdCBpbnQzMl90IGlucHV0X29mZnNldCA9IC1kYXRhLnJlZmVyZW5jZV9vcF9kYXRhLmlucHV0X3plcm9fcG9pbnQ7CisgIGNvbnN0IGludDMyX3Qgb3V0cHV0X29mZnNldCA9IGRhdGEucmVmZXJlbmNlX29wX2RhdGEub3V0cHV0X3plcm9fcG9pbnQ7CisgIGNvbnN0IGludCBzdHJpZGVfd2lkdGggPSBwYXJhbXMuc3RyaWRlX3dpZHRoOworICBjb25zdCBpbnQgc3RyaWRlX2hlaWdodCA9IHBhcmFtcy5zdHJpZGVfaGVpZ2h0OworICBjb25zdCBpbnQgcGFkX3dpZHRoID0gZGF0YS5yZWZlcmVuY2Vfb3BfZGF0YS5wYWRkaW5nLndpZHRoOworICBjb25zdCBpbnQgcGFkX2hlaWdodCA9IGRhdGEucmVmZXJlbmNlX29wX2RhdGEucGFkZGluZy5oZWlnaHQ7CisgIGNvbnN0IGludDMyX3Qgb3V0cHV0X2FjdGl2YXRpb25fbWluID0KKyAgICAgIGRhdGEucmVmZXJlbmNlX29wX2RhdGEub3V0cHV0X2FjdGl2YXRpb25fbWluOworICBjb25zdCBpbnQzMl90IG91dHB1dF9hY3RpdmF0aW9uX21heCA9CisgICAgICBkYXRhLnJlZmVyZW5jZV9vcF9kYXRhLm91dHB1dF9hY3RpdmF0aW9uX21heDsKIAotICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgb3V0cHV0X3NoYXBlID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUob3V0cHV0KTsKLSAgICBjb25zdCBpbnQgYmF0Y2hlcyA9IE1hdGNoaW5nRGltKGlucHV0X3NoYXBlLCAwLCBvdXRwdXRfc2hhcGUsIDApOwotICAgIGNvbnN0IGludCBpbnB1dF9kZXB0aCA9IE1hdGNoaW5nRGltKGlucHV0X3NoYXBlLCAzLCBmaWx0ZXJfc2hhcGUsIDMpOwotICAgIGNvbnN0IGludCBvdXRwdXRfZGVwdGggPSBNYXRjaGluZ0RpbShmaWx0ZXJfc2hhcGUsIDAsIG91dHB1dF9zaGFwZSwgMyk7Ci0gICAgY29uc3QgaW50IGlucHV0X2hlaWdodCA9IGlucHV0X3NoYXBlLkRpbXMoMSk7Ci0gICAgY29uc3QgaW50IGlucHV0X3dpZHRoID0gaW5wdXRfc2hhcGUuRGltcygyKTsKLSAgICBjb25zdCBpbnQgZmlsdGVyX2hlaWdodCA9IGZpbHRlcl9zaGFwZS5EaW1zKDEpOwotICAgIGNvbnN0IGludCBmaWx0ZXJfd2lkdGggPSBmaWx0ZXJfc2hhcGUuRGltcygyKTsKLSAgICBjb25zdCBpbnQgb3V0cHV0X2hlaWdodCA9IG91dHB1dF9zaGFwZS5EaW1zKDEpOwotICAgIGNvbnN0IGludCBvdXRwdXRfd2lkdGggPSBvdXRwdXRfc2hhcGUuRGltcygyKTsKKyAgY29uc3QgUnVudGltZVNoYXBlJiBvdXRwdXRfc2hhcGUgPSB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShvdXRwdXQpOworICBjb25zdCBpbnQgYmF0Y2hlcyA9IE1hdGNoaW5nRGltKGlucHV0X3NoYXBlLCAwLCBvdXRwdXRfc2hhcGUsIDApOworICBjb25zdCBpbnQgaW5wdXRfZGVwdGggPSBNYXRjaGluZ0RpbShpbnB1dF9zaGFwZSwgMywgZmlsdGVyX3NoYXBlLCAzKTsKKyAgY29uc3QgaW50IG91dHB1dF9kZXB0aCA9IE1hdGNoaW5nRGltKGZpbHRlcl9zaGFwZSwgMCwgb3V0cHV0X3NoYXBlLCAzKTsKKyAgY29uc3QgaW50IGlucHV0X2hlaWdodCA9IGlucHV0X3NoYXBlLkRpbXMoMSk7CisgIGNvbnN0IGludCBpbnB1dF93aWR0aCA9IGlucHV0X3NoYXBlLkRpbXMoMik7CisgIGNvbnN0IGludCBmaWx0ZXJfaGVpZ2h0ID0gZmlsdGVyX3NoYXBlLkRpbXMoMSk7CisgIGNvbnN0IGludCBmaWx0ZXJfd2lkdGggPSBmaWx0ZXJfc2hhcGUuRGltcygyKTsKKyAgY29uc3QgaW50IG91dHB1dF9oZWlnaHQgPSBvdXRwdXRfc2hhcGUuRGltcygxKTsKKyAgY29uc3QgaW50IG91dHB1dF93aWR0aCA9IG91dHB1dF9zaGFwZS5EaW1zKDIpOwogCi0gICAgY29uc3QgaW50OF90KiBpbnB1dF9kYXRhID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KGlucHV0KTsKLSAgICBjb25zdCBpbnQ4X3QqIGZpbHRlcl9kYXRhID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KGZpbHRlcik7Ci0gICAgY29uc3QgaW50MzJfdCogYmlhc19kYXRhID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQzMl90PihiaWFzKTsKLSAgICBpbnQ4X3QqIG91dHB1dF9kYXRhID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KG91dHB1dCk7CisgIGNvbnN0IGludDhfdCogaW5wdXRfZGF0YSA9IHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihpbnB1dCk7CisgIGNvbnN0IGludDMyX3QqIGJpYXNfZGF0YSA9IHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50MzJfdD4oYmlhcyk7CisgIGludDhfdCogb3V0cHV0X2RhdGEgPSB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4ob3V0cHV0KTsKIAotICAgIGludCBvdXRwdXRfZGF0YV9mb3JtYXQgPSAwOwotICAgIGludCBvdXRfbGVuZ3RoID0gb3V0cHV0X2hlaWdodCAqIG91dHB1dF93aWR0aCAqIG91dHB1dF9kZXB0aDsKLQotICAgIGlmIChmaWx0ZXJfaGVpZ2h0ID09IDEgJiYgZmlsdGVyX3dpZHRoID09IDEpIHsKLSAgICAgIGZvciAoaW50IGJhdGNoID0gMDsgYmF0Y2ggPCBiYXRjaGVzOyArK2JhdGNoKSB7Ci0gICAgICAgIGludDhfdCogcF9vdXRfdGVtcDsKLSAgICAgICAgcF9vdXRfdGVtcCA9ICZvdXRwdXRfZGF0YVtiYXRjaCAqIG91dF9sZW5ndGhdOwotCi0gICAgICAgIFRGX0xJVEVfRU5TVVJFX0VRKAotICAgICAgICAgICAgY29udGV4dCwKLQotICAgICAgICAgICAgeGFfbm5fY29udjJkX3BvaW50d2lzZV9wZXJfY2hhbl9zeW04c3hhc3ltOHMoCi0gICAgICAgICAgICAgICAgcF9vdXRfdGVtcCwgY29uc3RfY2FzdDxXT1JEOCo+KGZpbHRlcl9kYXRhKSwKLSAgICAgICAgICAgICAgICBjb25zdF9jYXN0PFdPUkQ4Kj4oJmlucHV0X2RhdGFbYmF0Y2ggKiBpbnB1dF9oZWlnaHQgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF93aWR0aCAqIGlucHV0X2RlcHRoXSksCi0gICAgICAgICAgICAgICAgY29uc3RfY2FzdDxXT1JEMzIqPihiaWFzX2RhdGEpLCBpbnB1dF9oZWlnaHQsIGlucHV0X3dpZHRoLAotICAgICAgICAgICAgICAgIGlucHV0X2RlcHRoLCBvdXRwdXRfZGVwdGgsIGlucHV0X29mZnNldCwKLSAgICAgICAgICAgICAgICBkYXRhLnJlZmVyZW5jZV9vcF9kYXRhLnBlcl9jaGFubmVsX291dHB1dF9tdWx0aXBsaWVyLAotICAgICAgICAgICAgICAgIGRhdGEucmVmZXJlbmNlX29wX2RhdGEucGVyX2NoYW5uZWxfb3V0cHV0X3NoaWZ0LCBvdXRwdXRfb2Zmc2V0LAotICAgICAgICAgICAgICAgIG91dHB1dF9kYXRhX2Zvcm1hdCksCi0gICAgICAgICAgICAwKTsKLQotICAgICAgICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICB4YV9ubl92ZWNfYWN0aXZhdGlvbl9taW5fbWF4XzhfOCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfb3V0X3RlbXAsIHBfb3V0X3RlbXAsIG91dHB1dF9hY3RpdmF0aW9uX21pbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9hY3RpdmF0aW9uX21heCwgb3V0X2xlbmd0aCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICB2b2lkKiBwX3NjcmF0Y2ggPSBzdGF0aWNfY2FzdDx2b2lkKj4oCi0gICAgICAgICAgY29udGV4dC0+R2V0U2NyYXRjaEJ1ZmZlcihjb250ZXh0LCBkYXRhLnNjcmF0Y2hfdGVuc29yX2luZGV4KSk7Ci0KLSAgICAgIGZvciAoaW50IGJhdGNoID0gMDsgYmF0Y2ggPCBiYXRjaGVzOyArK2JhdGNoKSB7Ci0gICAgICAgIGludDhfdCogcF9vdXRfdGVtcDsKLSAgICAgICAgcF9vdXRfdGVtcCA9ICZvdXRwdXRfZGF0YVtiYXRjaCAqIG91dF9sZW5ndGhdOwotCi0gICAgICAgIHsKLSAgICAgICAgICBURl9MSVRFX0VOU1VSRV9FUSgKLSAgICAgICAgICAgICAgY29udGV4dCwKLSAgICAgICAgICAgICAgeGFfbm5fY29udjJkX3N0ZF9wZXJfY2hhbl9zeW04c3hhc3ltOHMoCi0gICAgICAgICAgICAgICAgICBwX291dF90ZW1wLAotICAgICAgICAgICAgICAgICAgJmlucHV0X2RhdGFbYmF0Y2ggKiBpbnB1dF9oZWlnaHQgKiBpbnB1dF93aWR0aCAqIGlucHV0X2RlcHRoXSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8aW50OF90Kj4oZmlsdGVyX2RhdGEpLCAgLy8gZmlsdGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICBiaWFzX2RhdGEsIGlucHV0X2hlaWdodCwgaW5wdXRfd2lkdGgsIGlucHV0X2RlcHRoLAotICAgICAgICAgICAgICAgICAgZmlsdGVyX2hlaWdodCwgZmlsdGVyX3dpZHRoLCBvdXRwdXRfZGVwdGgsIHN0cmlkZV93aWR0aCwKLSAgICAgICAgICAgICAgICAgIHN0cmlkZV9oZWlnaHQsIHBhZF93aWR0aCwgcGFkX2hlaWdodCwgb3V0cHV0X2hlaWdodCwKLSAgICAgICAgICAgICAgICAgIG91dHB1dF93aWR0aCwgaW5wdXRfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgZGF0YS5yZWZlcmVuY2Vfb3BfZGF0YS5wZXJfY2hhbm5lbF9vdXRwdXRfbXVsdGlwbGllciwKLSAgICAgICAgICAgICAgICAgIGRhdGEucmVmZXJlbmNlX29wX2RhdGEucGVyX2NoYW5uZWxfb3V0cHV0X3NoaWZ0LAotICAgICAgICAgICAgICAgICAgb3V0cHV0X29mZnNldCwgb3V0cHV0X2RhdGFfZm9ybWF0LAotICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZCo+KHBfc2NyYXRjaCkpLAotICAgICAgICAgICAgICAwKTsKLSAgICAgICAgfQotCi0gICAgICAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHhhX25uX3ZlY19hY3RpdmF0aW9uX21pbl9tYXhfOF84KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9vdXRfdGVtcCwgcF9vdXRfdGVtcCwgb3V0cHV0X2FjdGl2YXRpb25fbWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2FjdGl2YXRpb25fbWF4LCBvdXRfbGVuZ3RoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBrVGZMaXRlT2s7CisgIGNvbnN0IGludDhfdCogZmlsdGVyX2RhdGE7CisgIGlmIChmaWx0ZXItPnR5cGUgPT0ga1RmTGl0ZUludDQpIHsKKyAgICBpbnQ4X3QqIHVucGFja2VkX2ZpbHRlcl9kYXRhID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8aW50OF90Kj4oY29udGV4dC0+R2V0U2NyYXRjaEJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnRleHQsIGRhdGEucmVmZXJlbmNlX29wX2RhdGEuZmlsdGVyX2J1ZmZlcl9pbmRleCkpOworICAgIHRmbGl0ZTo6dGVuc29yX3V0aWxzOjpVbnBhY2tEZW5zZUludDRJbnRvSW50OCgKKyAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KGZpbHRlciksCisgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGZpbHRlcikuRmxhdFNpemUoKSwgdW5wYWNrZWRfZmlsdGVyX2RhdGEpOworICAgIGZpbHRlcl9kYXRhID0gdW5wYWNrZWRfZmlsdGVyX2RhdGE7CisgIH0gZWxzZSB7CisgICAgZmlsdGVyX2RhdGEgPSB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4oZmlsdGVyKTsKICAgfQogCi0gIHJlZmVyZW5jZV9pbnRlZ2VyX29wczo6Q29udlBlckNoYW5uZWwoCi0gICAgICBDb252UGFyYW1zUXVhbnRpemVkKHBhcmFtcywgZGF0YS5yZWZlcmVuY2Vfb3BfZGF0YSksCi0gICAgICBkYXRhLnJlZmVyZW5jZV9vcF9kYXRhLnBlcl9jaGFubmVsX291dHB1dF9tdWx0aXBsaWVyLAotICAgICAgZGF0YS5yZWZlcmVuY2Vfb3BfZGF0YS5wZXJfY2hhbm5lbF9vdXRwdXRfc2hpZnQsCi0gICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShpbnB1dCksCi0gICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4oaW5wdXQpLAotICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoZmlsdGVyKSwKLSAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihmaWx0ZXIpLAotICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoYmlhcyksCi0gICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDMyX3Q+KGJpYXMpLAotICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUob3V0cHV0KSwKLSAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihvdXRwdXQpKTsKKyAgaW50IG91dHB1dF9kYXRhX2Zvcm1hdCA9IDA7CisgIGludCBvdXRfbGVuZ3RoID0gb3V0cHV0X2hlaWdodCAqIG91dHB1dF93aWR0aCAqIG91dHB1dF9kZXB0aDsKKworICBpZiAoZmlsdGVyX2hlaWdodCA9PSAxICYmIGZpbHRlcl93aWR0aCA9PSAxKSB7CisgICAgZm9yIChpbnQgYmF0Y2ggPSAwOyBiYXRjaCA8IGJhdGNoZXM7ICsrYmF0Y2gpIHsKKyAgICAgIGludDhfdCogcF9vdXRfdGVtcDsKKyAgICAgIHBfb3V0X3RlbXAgPSAmb3V0cHV0X2RhdGFbYmF0Y2ggKiBvdXRfbGVuZ3RoXTsKKworICAgICAgVEZfTElURV9FTlNVUkVfRVEoCisgICAgICAgICAgY29udGV4dCwKKworICAgICAgICAgIHhhX25uX2NvbnYyZF9wb2ludHdpc2VfcGVyX2NoYW5fc3ltOHN4YXN5bThzKAorICAgICAgICAgICAgICBwX291dF90ZW1wLCBjb25zdF9jYXN0PFdPUkQ4Kj4oZmlsdGVyX2RhdGEpLAorICAgICAgICAgICAgICBjb25zdF9jYXN0PFdPUkQ4Kj4oJmlucHV0X2RhdGFbYmF0Y2ggKiBpbnB1dF9oZWlnaHQgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfd2lkdGggKiBpbnB1dF9kZXB0aF0pLAorICAgICAgICAgICAgICBjb25zdF9jYXN0PFdPUkQzMio+KGJpYXNfZGF0YSksIGlucHV0X2hlaWdodCwgaW5wdXRfd2lkdGgsCisgICAgICAgICAgICAgIGlucHV0X2RlcHRoLCBvdXRwdXRfZGVwdGgsIGlucHV0X29mZnNldCwKKyAgICAgICAgICAgICAgZGF0YS5yZWZlcmVuY2Vfb3BfZGF0YS5wZXJfY2hhbm5lbF9vdXRwdXRfbXVsdGlwbGllciwKKyAgICAgICAgICAgICAgZGF0YS5yZWZlcmVuY2Vfb3BfZGF0YS5wZXJfY2hhbm5lbF9vdXRwdXRfc2hpZnQsIG91dHB1dF9vZmZzZXQsCisgICAgICAgICAgICAgIG91dHB1dF9kYXRhX2Zvcm1hdCksCisgICAgICAgICAgMCk7CisKKyAgICAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICB4YV9ubl92ZWNfYWN0aXZhdGlvbl9taW5fbWF4XzhfOCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX291dF90ZW1wLCBwX291dF90ZW1wLCBvdXRwdXRfYWN0aXZhdGlvbl9taW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2FjdGl2YXRpb25fbWF4LCBvdXRfbGVuZ3RoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB2b2lkKiBwX3NjcmF0Y2ggPSBzdGF0aWNfY2FzdDx2b2lkKj4oCisgICAgICAgIGNvbnRleHQtPkdldFNjcmF0Y2hCdWZmZXIoY29udGV4dCwgZGF0YS5zY3JhdGNoX3RlbnNvcl9pbmRleCkpOworCisgICAgZm9yIChpbnQgYmF0Y2ggPSAwOyBiYXRjaCA8IGJhdGNoZXM7ICsrYmF0Y2gpIHsKKyAgICAgIGludDhfdCogcF9vdXRfdGVtcDsKKyAgICAgIHBfb3V0X3RlbXAgPSAmb3V0cHV0X2RhdGFbYmF0Y2ggKiBvdXRfbGVuZ3RoXTsKKworICAgICAgeworICAgICAgICBURl9MSVRFX0VOU1VSRV9FUSgKKyAgICAgICAgICAgIGNvbnRleHQsCisgICAgICAgICAgICB4YV9ubl9jb252MmRfc3RkX3Blcl9jaGFuX3N5bThzeGFzeW04cygKKyAgICAgICAgICAgICAgICBwX291dF90ZW1wLAorICAgICAgICAgICAgICAgICZpbnB1dF9kYXRhW2JhdGNoICogaW5wdXRfaGVpZ2h0ICogaW5wdXRfd2lkdGggKiBpbnB1dF9kZXB0aF0sCisgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxpbnQ4X3QqPihmaWx0ZXJfZGF0YSksICAvLyBmaWx0ZXJfZGF0YSwKKyAgICAgICAgICAgICAgICBiaWFzX2RhdGEsIGlucHV0X2hlaWdodCwgaW5wdXRfd2lkdGgsIGlucHV0X2RlcHRoLAorICAgICAgICAgICAgICAgIGZpbHRlcl9oZWlnaHQsIGZpbHRlcl93aWR0aCwgb3V0cHV0X2RlcHRoLCBzdHJpZGVfd2lkdGgsCisgICAgICAgICAgICAgICAgc3RyaWRlX2hlaWdodCwgcGFkX3dpZHRoLCBwYWRfaGVpZ2h0LCBvdXRwdXRfaGVpZ2h0LAorICAgICAgICAgICAgICAgIG91dHB1dF93aWR0aCwgaW5wdXRfb2Zmc2V0LAorICAgICAgICAgICAgICAgIGRhdGEucmVmZXJlbmNlX29wX2RhdGEucGVyX2NoYW5uZWxfb3V0cHV0X211bHRpcGxpZXIsCisgICAgICAgICAgICAgICAgZGF0YS5yZWZlcmVuY2Vfb3BfZGF0YS5wZXJfY2hhbm5lbF9vdXRwdXRfc2hpZnQsIG91dHB1dF9vZmZzZXQsCisgICAgICAgICAgICAgICAgb3V0cHV0X2RhdGFfZm9ybWF0LCBzdGF0aWNfY2FzdDx2b2lkKj4ocF9zY3JhdGNoKSksCisgICAgICAgICAgICAwKTsKKyAgICAgIH0KKworICAgICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHhhX25uX3ZlY19hY3RpdmF0aW9uX21pbl9tYXhfOF84KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfb3V0X3RlbXAsIHBfb3V0X3RlbXAsIG91dHB1dF9hY3RpdmF0aW9uX21pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfYWN0aXZhdGlvbl9tYXgsIG91dF9sZW5ndGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgfQorICB9CisKICAgcmV0dXJuIGtUZkxpdGVPazsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQotI2VuZGlmICAvLyBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQorI2VuZGlmICAvLyBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL2NvbnZfaW50MTZfcmVmZXJlbmNlLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL2NvbnZfaW50MTZfcmVmZXJlbmNlLmNjCmluZGV4IDBkM2M0YTMuLjI0OTJkNGIgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9jb252X2ludDE2X3JlZmVyZW5jZS5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvY29udl9pbnQxNl9yZWZlcmVuY2UuY2MKQEAgLTEsNCArMSw0IEBACi0vKiBDb3B5cmlnaHQgMjAyMSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLyogQ29weXJpZ2h0IDIwMjMgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIAogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0yMywxNiArMjMsOSBAQAogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL3BhZGRpbmcuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9jb252LmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMva2VybmVsX3V0aWwuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fbG9nLmgiCiAKIG5hbWVzcGFjZSB0ZmxpdGUgewotbmFtZXNwYWNlIHsKLQotdm9pZCogSW5pdChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpIHsKLSAgVEZMSVRFX0RDSEVDSyhjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIgIT0gbnVsbHB0cik7Ci0gIHJldHVybiBjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIoY29udGV4dCwgc2l6ZW9mKE9wRGF0YUNvbnYpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlLgogCiBUZkxpdGVTdGF0dXMgQ29udlJlZmVyZW5jZUV2YWxJbnQxNihUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CiAgIFRGTElURV9EQ0hFQ0sobm9kZS0+dXNlcl9kYXRhICE9IG51bGxwdHIpOwpAQCAtNTIsMjUgKzQ1LDM3IEBACiAgICAgICAgICAgPyB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsSW5wdXQoY29udGV4dCwgbm9kZSwga0NvbnZCaWFzVGVuc29yKQogICAgICAgICAgIDogbnVsbHB0cjsKIAotICByZWZlcmVuY2VfaW50ZWdlcl9vcHM6OkNvbnZQZXJDaGFubmVsKAotICAgICAgQ29udlBhcmFtc1F1YW50aXplZChwYXJhbXMsIG9wX2RhdGEpLAotICAgICAgb3BfZGF0YS5wZXJfY2hhbm5lbF9vdXRwdXRfbXVsdGlwbGllciwgb3BfZGF0YS5wZXJfY2hhbm5lbF9vdXRwdXRfc2hpZnQsCi0gICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShpbnB1dCksCi0gICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KGlucHV0KSwKLSAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGZpbHRlciksCi0gICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4oZmlsdGVyKSwKLSAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGJpYXMpLAotICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxzdGQ6OmludDY0X3Q+KGJpYXMpLAotICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUob3V0cHV0KSwKLSAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50MTZfdD4ob3V0cHV0KSk7Ci0gIHJldHVybiBrVGZMaXRlT2s7Ci19CisgIGlmIChiaWFzID09IG51bGxwdHIgfHwgYmlhcy0+dHlwZSA9PSBrVGZMaXRlSW50MzIpIHsKKyAgICByZWZlcmVuY2VfaW50ZWdlcl9vcHM6OkNvbnZQZXJDaGFubmVsKAorICAgICAgICBDb252UGFyYW1zUXVhbnRpemVkKHBhcmFtcywgb3BfZGF0YSksCisgICAgICAgIG9wX2RhdGEucGVyX2NoYW5uZWxfb3V0cHV0X211bHRpcGxpZXIsIG9wX2RhdGEucGVyX2NoYW5uZWxfb3V0cHV0X3NoaWZ0LAorICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShpbnB1dCksCisgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50MTZfdD4oaW5wdXQpLAorICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShmaWx0ZXIpLAorICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4oZmlsdGVyKSwKKyAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoYmlhcyksCisgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldE9wdGlvbmFsVGVuc29yRGF0YTxzdGQ6OmludDMyX3Q+KGJpYXMpLAorICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShvdXRwdXQpLAorICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KG91dHB1dCkpOworICB9IGVsc2UgaWYgKGJpYXMtPnR5cGUgPT0ga1RmTGl0ZUludDY0KSB7CisgICAgcmVmZXJlbmNlX2ludGVnZXJfb3BzOjpDb252UGVyQ2hhbm5lbCgKKyAgICAgICAgQ29udlBhcmFtc1F1YW50aXplZChwYXJhbXMsIG9wX2RhdGEpLAorICAgICAgICBvcF9kYXRhLnBlcl9jaGFubmVsX291dHB1dF9tdWx0aXBsaWVyLCBvcF9kYXRhLnBlcl9jaGFubmVsX291dHB1dF9zaGlmdCwKKyAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoaW5wdXQpLAorICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KGlucHV0KSwKKyAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoZmlsdGVyKSwKKyAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KGZpbHRlciksCisgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGJpYXMpLAorICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRPcHRpb25hbFRlbnNvckRhdGE8c3RkOjppbnQ2NF90PihiaWFzKSwKKyAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUob3V0cHV0KSwKKyAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90PihvdXRwdXQpKTsKKyAgfSBlbHNlIHsKKyAgICBNaWNyb1ByaW50ZigiQmlhcyB0eXBlICVzICglZCkgbm90IHN1cHBvcnRlZC4iLAorICAgICAgICAgICAgICAgIFRmTGl0ZVR5cGVHZXROYW1lKGJpYXMtPnR5cGUpLCBiaWFzLT50eXBlKTsKKyAgICByZXR1cm4ga1RmTGl0ZUVycm9yOworICB9CiAKLS8vIFRPRE8oYi8xODk5ODE5NDMpOiBUaGlzIHZhcmlhbnQgY2FuIGJlIHVzZWQgZm9yIGEgc21hbGxlciBiaW5hcnkKLS8vIHNpbmNlIHRoZSBvcHRpbWl6ZWQgY29udiBpbXBsZW1lbnRhdGlvbiBjdXJyZW50bHkgYWRkcyBhIGxvdCB0bwotLy8gdGhlIGJpbmFyeSBzaXplICh+MzBLQiB0byB0ZXh0IHNlY3Rpb24pLgotVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9DT05WXzJEX0lOVDE2UkVGKCkgewotICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChJbml0LCBDb252UHJlcGFyZSwgQ29udlJlZmVyZW5jZUV2YWxJbnQxNik7CisgIHJldHVybiBrVGZMaXRlT2s7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSB0ZmxpdGUKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9jb252X2ludDhfaW50MTYuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvY29udl9pbnQ4X2ludDE2LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNjRmMDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvY29udl9pbnQ4X2ludDE2LmNjCkBAIC0wLDAgKzEsODkgQEAKKy8qIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2MvYnVpbHRpbl9vcF9kYXRhLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2MvY29tbW9uLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvY29tbW9uLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvdGVuc29yX2N0eXBlcy5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2tlcm5lbF91dGlsLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMva2VybmVsX3V0aWwuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EveHRlbnNhLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL3h0ZW5zYV9jb252LmgiCisKK25hbWVzcGFjZSB0ZmxpdGUgeworbmFtZXNwYWNlIHsKKworVGZMaXRlU3RhdHVzIEV2YWxJbnQ4KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKKyNpZiBkZWZpbmVkKEhJRklNSU5JKQorICByZXR1cm4gQ29udlJlZmVyZW5jZUV2YWxJbnQ4KGNvbnRleHQsIG5vZGUpOworI2Vsc2UKKyAgY29uc3QgYXV0byYgb3BfZGF0YSA9ICoocmVpbnRlcnByZXRfY2FzdDxYdGVuc2FDb252T3BEYXRhKj4obm9kZS0+dXNlcl9kYXRhKSk7CisgIGNvbnN0IGF1dG8mIHBhcmFtcyA9CisgICAgICAqKHJlaW50ZXJwcmV0X2Nhc3Q8VGZMaXRlQ29udlBhcmFtcyo+KG5vZGUtPmJ1aWx0aW5fZGF0YSkpOworCisgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0ID0KKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dChjb250ZXh0LCBub2RlLCBrQ29udklucHV0VGVuc29yKTsKKyAgVGZMaXRlRXZhbFRlbnNvciogb3V0cHV0ID0KKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldEV2YWxPdXRwdXQoY29udGV4dCwgbm9kZSwga0NvbnZPdXRwdXRUZW5zb3IpOworICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBmaWx0ZXIgPQorICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KGNvbnRleHQsIG5vZGUsIGtDb252V2VpZ2h0c1RlbnNvcik7CisgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGJpYXMgPQorICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KGNvbnRleHQsIG5vZGUsIGtDb252Qmlhc1RlbnNvcik7CisKKyNpZiBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQorICByZXR1cm4gQ29udkV2YWxIaWZpSW50OChjb250ZXh0LCBub2RlLCBwYXJhbXMsIG9wX2RhdGEsIGlucHV0LCBmaWx0ZXIsIGJpYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCk7CisjZWxpZiBkZWZpbmVkKFZJU0lPTl9QNikKKyAgcmV0dXJuIENvbnZFdmFsVmlzaW9uKGNvbnRleHQsIG5vZGUsIHBhcmFtcywgb3BfZGF0YSwgaW5wdXQsIGZpbHRlciwgYmlhcywKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCk7CisjZW5kaWYKKworI2VuZGlmICAvLyBkZWZpbmVkKEhJRklNSU5JKQorfQorCitUZkxpdGVTdGF0dXMgRXZhbEludDE2KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKKyNpZiBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQorICBjb25zdCBhdXRvJiBvcF9kYXRhID0gKihyZWludGVycHJldF9jYXN0PFh0ZW5zYUNvbnZPcERhdGEqPihub2RlLT51c2VyX2RhdGEpKTsKKyAgY29uc3QgYXV0byYgcGFyYW1zID0KKyAgICAgICoocmVpbnRlcnByZXRfY2FzdDxUZkxpdGVDb252UGFyYW1zKj4obm9kZS0+YnVpbHRpbl9kYXRhKSk7CisKKyAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXQgPQorICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KGNvbnRleHQsIG5vZGUsIGtDb252SW5wdXRUZW5zb3IpOworICBUZkxpdGVFdmFsVGVuc29yKiBvdXRwdXQgPQorICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbE91dHB1dChjb250ZXh0LCBub2RlLCBrQ29udk91dHB1dFRlbnNvcik7CisgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGZpbHRlciA9CisgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsSW5wdXQoY29udGV4dCwgbm9kZSwga0NvbnZXZWlnaHRzVGVuc29yKTsKKyAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogYmlhcyA9CisgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsSW5wdXQoY29udGV4dCwgbm9kZSwga0NvbnZCaWFzVGVuc29yKTsKKworICByZXR1cm4gQ29udkV2YWxIaWZpSW50MTYoY29udGV4dCwgbm9kZSwgcGFyYW1zLCBvcF9kYXRhLCBpbnB1dCwgZmlsdGVyLCBiaWFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0KTsKKyNlbHNlCisgIHJldHVybiBDb252UmVmZXJlbmNlRXZhbEludDE2KGNvbnRleHQsIG5vZGUpOworI2VuZGlmCit9CisKK30gIC8vIG5hbWVzcGFjZQorCitURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX0NPTlZfMkRfSU5UOCgpIHsKKyAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoQ29udkluaXRYdGVuc2EsIENvbnZQcmVwYXJlWHRlbnNhLCBFdmFsSW50OCk7Cit9CisKK1RGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfQ09OVl8yRF9JTlQxNigpIHsKKyAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoQ29udkluaXRYdGVuc2EsIENvbnZQcmVwYXJlWHRlbnNhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmFsSW50MTYpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvY29udl9pbnQ4X3JlZmVyZW5jZS5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9jb252X2ludDhfcmVmZXJlbmNlLmNjCmluZGV4IDgwYTQyZDkuLjZhYzA3YmEgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9jb252X2ludDhfcmVmZXJlbmNlLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9jb252X2ludDhfcmVmZXJlbmNlLmNjCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IDIwMjEgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8qIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAKIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTYsNiArMTYsNyBAQAogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9jL2J1aWx0aW5fb3BfZGF0YS5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9jL2NvbW1vbi5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL2NvbW1vbi5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3BvcnRhYmxlX3RlbnNvcl91dGlscy5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3F1YW50aXphdGlvbl91dGlsLmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvcmVmZXJlbmNlL2ludGVnZXJfb3BzL2NvbnYuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC90ZW5zb3JfY3R5cGVzLmgiCkBAIC0yNSwxNCArMjYsNiBAQAogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2tlcm5lbF91dGlsLmgiCiAKIG5hbWVzcGFjZSB0ZmxpdGUgewotbmFtZXNwYWNlIHsKLQotdm9pZCogSW5pdChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpIHsKLSAgVEZMSVRFX0RDSEVDSyhjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIgIT0gbnVsbHB0cik7Ci0gIHJldHVybiBjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIoY29udGV4dCwgc2l6ZW9mKE9wRGF0YUNvbnYpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlLgogCiBUZkxpdGVTdGF0dXMgQ29udlJlZmVyZW5jZUV2YWxJbnQ4KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgVEZMSVRFX0RDSEVDSyhub2RlLT51c2VyX2RhdGEgIT0gbnVsbHB0cik7CkBAIC01MiwxNyArNDUsMjkgQEAKICAgICAgICAgICA/IHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dChjb250ZXh0LCBub2RlLCBrQ29udkJpYXNUZW5zb3IpCiAgICAgICAgICAgOiBudWxscHRyOwogCisgIGNvbnN0IGludDhfdCogZmlsdGVyX2RhdGE7CisgIGlmIChmaWx0ZXItPnR5cGUgPT0ga1RmTGl0ZUludDQpIHsKKyAgICBpbnQ4X3QqIHVucGFja2VkX2ZpbHRlcl9kYXRhID0gc3RhdGljX2Nhc3Q8aW50OF90Kj4oCisgICAgICAgIGNvbnRleHQtPkdldFNjcmF0Y2hCdWZmZXIoY29udGV4dCwgb3BfZGF0YS5maWx0ZXJfYnVmZmVyX2luZGV4KSk7CisgICAgdGZsaXRlOjp0ZW5zb3JfdXRpbHM6OlVucGFja0RlbnNlSW50NEludG9JbnQ4KAorICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4oZmlsdGVyKSwKKyAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoZmlsdGVyKS5GbGF0U2l6ZSgpLCB1bnBhY2tlZF9maWx0ZXJfZGF0YSk7CisgICAgZmlsdGVyX2RhdGEgPSB1bnBhY2tlZF9maWx0ZXJfZGF0YTsKKyAgfSBlbHNlIHsKKyAgICBmaWx0ZXJfZGF0YSA9IHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihmaWx0ZXIpOworICB9CisKICAgcmVmZXJlbmNlX2ludGVnZXJfb3BzOjpDb252UGVyQ2hhbm5lbCgKICAgICAgIENvbnZQYXJhbXNRdWFudGl6ZWQocGFyYW1zLCBvcF9kYXRhKSwKICAgICAgIG9wX2RhdGEucGVyX2NoYW5uZWxfb3V0cHV0X211bHRpcGxpZXIsIG9wX2RhdGEucGVyX2NoYW5uZWxfb3V0cHV0X3NoaWZ0LAogICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoaW5wdXQpLAogICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KGlucHV0KSwKLSAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGZpbHRlciksCi0gICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4oZmlsdGVyKSwKKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGZpbHRlciksIGZpbHRlcl9kYXRhLAogICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoYmlhcyksCi0gICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDMyX3Q+KGJpYXMpLAorICAgICAgdGZsaXRlOjptaWNybzo6R2V0T3B0aW9uYWxUZW5zb3JEYXRhPGludDMyX3Q+KGJpYXMpLAogICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUob3V0cHV0KSwKICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihvdXRwdXQpKTsKKwogICByZXR1cm4ga1RmTGl0ZU9rOwogfQogCkBAIC03MCw3ICs3NSw4IEBACiAvLyBzaW5jZSB0aGUgb3B0aW1pemVkIGNvbnYgaW1wbGVtZW50YXRpb24gY3VycmVudGx5IGFkZHMgYSBsb3QgdG8KIC8vIHRoZSBiaW5hcnkgc2l6ZSAofjMwS0IgdG8gdGV4dCBzZWN0aW9uKS4KIFRGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfQ09OVl8yRF9JTlQ4UkVGKCkgewotICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChJbml0LCBDb252UHJlcGFyZSwgQ29udlJlZmVyZW5jZUV2YWxJbnQ4KTsKKyAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoQ29udkluaXQsIENvbnZQcmVwYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252UmVmZXJlbmNlRXZhbEludDgpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvY29udl92aXNpb24uY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvY29udl92aXNpb24uY2MKaW5kZXggZTRmMGQ0OS4uODEyYWI2MCAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL2NvbnZfdmlzaW9uLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9jb252X3Zpc2lvbi5jYwpAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAyMDIxIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvYy9jb21tb24uaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9jb21tb24uaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9wb3J0YWJsZV90ZW5zb3JfdXRpbHMuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9yZWZlcmVuY2UvaW50ZWdlcl9vcHMvY29udi5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3RlbnNvcl9jdHlwZXMuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9rZXJuZWxfdXRpbC5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2NvbnYuaCIKQEAgLTMyLDI5ICszMywyMiBAQAogbmFtZXNwYWNlIHRmbGl0ZSB7CiAKIFRmTGl0ZVN0YXR1cyBDb252UHJlcGFyZVZpc2lvbihUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7Ci0gIFRGTElURV9EQ0hFQ0sobm9kZS0+dXNlcl9kYXRhICE9IG51bGxwdHIpOwotICBURkxJVEVfRENIRUNLKG5vZGUtPmJ1aWx0aW5fZGF0YSAhPSBudWxscHRyKTsKKyAgTWljcm9Db250ZXh0KiBtaWNyb19jb250ZXh0ID0gR2V0TWljcm9Db250ZXh0KGNvbnRleHQpOworICBUZkxpdGVUZW5zb3IqIGlucHV0ID0KKyAgICAgIG1pY3JvX2NvbnRleHQtPkFsbG9jYXRlVGVtcElucHV0VGVuc29yKG5vZGUsIGtDb252SW5wdXRUZW5zb3IpOworICBUZkxpdGVUZW5zb3IqIGJpYXMgPQorICAgICAgbWljcm9fY29udGV4dC0+QWxsb2NhdGVUZW1wSW5wdXRUZW5zb3Iobm9kZSwga0NvbnZCaWFzVGVuc29yKTsKKyAgY29uc3QgdWludDMyX3QgaW5wdXRfaGVpZ2h0ID0gU2l6ZU9mRGltZW5zaW9uKGlucHV0LCAxKTsKKyAgY29uc3QgdWludDMyX3QgaW5wdXRfd2lkdGggPSBTaXplT2ZEaW1lbnNpb24oaW5wdXQsIDIpOwogCiAgIFh0ZW5zYUNvbnZPcERhdGEqIGRhdGEgPSByZWludGVycHJldF9jYXN0PFh0ZW5zYUNvbnZPcERhdGEqPihub2RlLT51c2VyX2RhdGEpOwogICBjb25zdCBhdXRvJiBwYXJhbXMgPQogICAgICAgKihyZWludGVycHJldF9jYXN0PGNvbnN0IFRmTGl0ZUNvbnZQYXJhbXMqPihub2RlLT5idWlsdGluX2RhdGEpKTsKIAotICBNaWNyb0NvbnRleHQqIG1pY3JvX2NvbnRleHQgPSBHZXRNaWNyb0NvbnRleHQoY29udGV4dCk7CiAgIFRmTGl0ZVRlbnNvciogb3V0cHV0ID0KICAgICAgIG1pY3JvX2NvbnRleHQtPkFsbG9jYXRlVGVtcE91dHB1dFRlbnNvcihub2RlLCBrQ29udk91dHB1dFRlbnNvcik7Ci0gIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIG91dHB1dCAhPSBudWxscHRyKTsKLSAgVGZMaXRlVGVuc29yKiBpbnB1dCA9Ci0gICAgICBtaWNyb19jb250ZXh0LT5BbGxvY2F0ZVRlbXBJbnB1dFRlbnNvcihub2RlLCBrQ29udklucHV0VGVuc29yKTsKLSAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgaW5wdXQgIT0gbnVsbHB0cik7CiAgIFRmTGl0ZVRlbnNvciogZmlsdGVyID0KICAgICAgIG1pY3JvX2NvbnRleHQtPkFsbG9jYXRlVGVtcElucHV0VGVuc29yKG5vZGUsIGtDb252V2VpZ2h0c1RlbnNvcik7Ci0gIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIGZpbHRlciAhPSBudWxscHRyKTsKLSAgVGZMaXRlVGVuc29yKiBiaWFzID0KLSAgICAgIG1pY3JvX2NvbnRleHQtPkFsbG9jYXRlVGVtcElucHV0VGVuc29yKG5vZGUsIGtDb252Qmlhc1RlbnNvcik7Ci0gIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIGJpYXMgIT0gbnVsbHB0cik7Ci0KLSAgY29uc3QgdWludDMyX3QgaW5wdXRfaGVpZ2h0ID0gU2l6ZU9mRGltZW5zaW9uKGlucHV0LCAxKTsKLSAgY29uc3QgdWludDMyX3QgaW5wdXRfd2lkdGggPSBTaXplT2ZEaW1lbnNpb24oaW5wdXQsIDIpOwogCiAgIGNvbnN0IHVpbnQzMl90IG91dHB1dF9oZWlnaHQgPSBTaXplT2ZEaW1lbnNpb24ob3V0cHV0LCAxKTsKICAgY29uc3QgdWludDMyX3Qgb3V0cHV0X3dpZHRoID0gU2l6ZU9mRGltZW5zaW9uKG91dHB1dCwgMik7CkBAIC02Miw2ICs1NiwxNSBAQAogICBjb25zdCB1aW50MzJfdCBmaWx0ZXJfaGVpZ2h0ID0gU2l6ZU9mRGltZW5zaW9uKGZpbHRlciwgMSk7CiAgIGNvbnN0IHVpbnQzMl90IGZpbHRlcl93aWR0aCA9IFNpemVPZkRpbWVuc2lvbihmaWx0ZXIsIDIpOwogCisgIC8vIEF0IHRoaXMgdGltZSBpdCBpcyB1bmNsZWFyIGlmIHBlciBjaGFubmVsIHF1YW50aXphdGlvbiBpcyBjb3JyZWN0bHkKKyAgLy8gc3VwcG9ydGVkIGJ5IHRoZSBvcHRpbWl6ZWQgdmlzaW9uIFA2IGltcGxlbWVudGF0aW9uIG9yIG5vdC4gRm9yIG5vdywgd2UgYXJlCisgIC8vIG1hbnVhbGx5IGFkZGluZyBhIGZsYWcgdG8gc3dpdGNoIHRvIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gZm9yCisgIC8vIHBlci1jaGFubmVsIGNvbnYuCisgIC8vIFNlZSBodHRwOi8vYi8yNzA3MjA2MjUgZm9yIG1vcmUgZGV0YWlscy4KKyAgZGF0YS0+aXNfcGVyX2NoYW5uZWxfcXVhbnRpemVkID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8VGZMaXRlQWZmaW5lUXVhbnRpemF0aW9uKj4oZmlsdGVyLT5xdWFudGl6YXRpb24ucGFyYW1zKQorICAgICAgICAgIC0+c2NhbGUtPnNpemUgPiAxOworCiAgIC8vIER5bmFtaWNhbGx5IGFsbG9jYXRlIHBlci1jaGFubmVsIHF1YW50aXphdGlvbiBwYXJhbWV0ZXJzLgogICBjb25zdCBpbnQgbnVtX2NoYW5uZWxzID0gU2l6ZU9mRGltZW5zaW9uKGZpbHRlciwga0NvbnZRdWFudGl6ZWREaW1lbnNpb24pOwogICBkYXRhLT5wZXJfY2hhbm5lbF9vdXRwdXRfc2hpZnRfaW50OCA9IHN0YXRpY19jYXN0PGludDhfdCo+KApAQCAtOTcsNyArMTAwLDYgQEAKICAgICB0ZmxpdGU6OnRlbnNvcl91dGlsczo6VW5wYWNrRGVuc2VJbnQ0SW50b0ludDgoCiAgICAgICAgIEdldFRlbnNvckRhdGE8aW50OF90PihmaWx0ZXIpLCBHZXRUZW5zb3JTaGFwZShmaWx0ZXIpLkZsYXRTaXplKCksCiAgICAgICAgIEdldFRlbnNvckRhdGE8aW50OF90PigmZmlsdGVyX2ludDgpKTsKLQogICB9IGVsc2UgewogICAgIGZpbHRlcl9pbnQ4ID0gKmZpbHRlcjsKICAgfQpAQCAtMTQyLDE0ICsxNDQsMTcgQEAKICAgaWYgKHN0YXR1cykgewogICAgIHJldHVybiBrVGZMaXRlRXJyb3I7CiAgIH0KKwogICBpZiAoZmlsdGVyLT50eXBlID09IGtUZkxpdGVJbnQ0KSB7CiAgICAgbWljcm9fY29udGV4dC0+RGVhbGxvY2F0ZVRlbXBCdWZmZXIoR2V0VGVuc29yRGF0YTx1aW50OF90PigmZmlsdGVyX2ludDgpKTsKICAgfQorCiAgIG1pY3JvX2NvbnRleHQtPkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKG91dHB1dCk7CiAgIG1pY3JvX2NvbnRleHQtPkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKGlucHV0KTsKICAgbWljcm9fY29udGV4dC0+RGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3IoZmlsdGVyKTsKLSAgbWljcm9fY29udGV4dC0+RGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3IoYmlhcyk7Ci0KKyAgaWYgKGJpYXMgIT0gbnVsbHB0cikgeworICAgIG1pY3JvX2NvbnRleHQtPkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKGJpYXMpOworICB9CiAgIHJldHVybiBrVGZMaXRlT2s7CiB9CiAKQEAgLTE3MCw3ICsxNzUsOSBAQAogICAgICAgICAgZGF0YS5yZW9yZGVyX2NvZWZmaWNpZW50X2JpYXMsIGRhdGEucmVvcmRlcl9jb2VmZmljaWVudF9iaWFzX3NpemUsCiAgICAgICAgICBkYXRhLnJlZmVyZW5jZV9vcF9kYXRhLnBlcl9jaGFubmVsX291dHB1dF9tdWx0aXBsaWVyLAogICAgICAgICAgZGF0YS5wZXJfY2hhbm5lbF9vdXRwdXRfc2hpZnRfaW50OCwgbnVtX2NoYW5uZWxzKTsKKwogICByZXR1cm4ga1RmTGl0ZU9rOwogfQorCiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCiAjZW5kaWYgIC8vIGRlZmluZWQoVklTSU9OX1A2KQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL2RlcHRod2lzZV9jb252LmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL2RlcHRod2lzZV9jb252LmNjCmluZGV4IGYzYWNiOGQuLjg1MzZmZjcgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9kZXB0aHdpc2VfY29udi5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvZGVwdGh3aXNlX2NvbnYuY2MKQEAgLTYxLDkgKzYxLDkgQEAKICAgfQogICBtaWNyb19jb250ZXh0LT5EZWFsbG9jYXRlVGVtcFRmTGl0ZVRlbnNvcihpbnB1dCk7CiAKLSNpZiBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQorI2lmIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCiAgIFRGX0xJVEVfRU5TVVJFX09LKGNvbnRleHQsIERlcHRod2lzZUNvbnZQcmVwYXJlSGlmaShjb250ZXh0LCBub2RlKSk7Ci0jZW5kaWYgIC8vIGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCisjZW5kaWYgIC8vIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCiAKICNpZiBkZWZpbmVkKFZJU0lPTl9QNikKICAgVEZfTElURV9FTlNVUkVfT0soY29udGV4dCwgRGVwdGh3aXNlQ29udlByZXBhcmVWaXNpb24oY29udGV4dCwgbm9kZSkpOwpAQCAtOTcsNyArOTcsNyBAQAogICAgIGNhc2Uga1RmTGl0ZUludDg6IHsKICAgICAgIHN3aXRjaCAoZmlsdGVyX2ludDgudHlwZSkgewogICAgICAgICBjYXNlIGtUZkxpdGVJbnQ4OiB7Ci0jaWYgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKKyNpZiBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQogICAgICAgICAgIERlcHRod2lzZUNvbnZFdmFsSGlmaShjb250ZXh0LCBub2RlLCBwYXJhbXMsIG9wX2RhdGEsIGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsdGVyX2ludDgsIGJpYXMsIG91dHB1dCk7CiAjZWxpZiBkZWZpbmVkKFZJU0lPTl9QNikKQEAgLTExNiw3ICsxMTYsNyBAQAogICAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRPcHRpb25hbFRlbnNvckRhdGE8aW50MzJfdD4oYmlhcyksCiAgICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKG91dHB1dCksCiAgICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihvdXRwdXQpKTsKLSNlbmRpZiAgLy8gZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKKyNlbmRpZiAgLy8gZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL2RlcHRod2lzZV9jb252X2hpZmkuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvZGVwdGh3aXNlX2NvbnZfaGlmaS5jYwppbmRleCAwNWRhYjQ4Li44YzIwNTJiIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvZGVwdGh3aXNlX2NvbnZfaGlmaS5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvZGVwdGh3aXNlX2NvbnZfaGlmaS5jYwpAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS94dGVuc2EuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EveHRlbnNhX2RlcHRod2lzZV9jb252LmgiCiAKLSNpZiBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQorI2lmIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCiBuYW1lc3BhY2UgdGZsaXRlIHsKIFRmTGl0ZVN0YXR1cyBEZXB0aHdpc2VDb252UHJlcGFyZUhpZmkoVGZMaXRlQ29udGV4dCogY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGZMaXRlTm9kZSogbm9kZSkgewpAQCAtMTg3LDQgKzE4Nyw0IEBACiAgIHJldHVybiBrVGZMaXRlT2s7CiB9CiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCi0jZW5kaWYgIC8vIGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCisjZW5kaWYgIC8vIGRlZmluZWQoSElGSTMpIHx8ZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9kZXF1YW50aXplLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL2RlcXVhbnRpemUuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmNGE3ZAotLS0gL2Rldi9udWxsCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9kZXF1YW50aXplLmNjCkBAIC0wLDAgKzEsMTE4IEBACisvKiBDb3B5cmlnaHQgMjAyMSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3JlZmVyZW5jZS9kZXF1YW50aXplLmgiCisKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvYy9idWlsdGluX29wX2RhdGEuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvYy9jb21tb24uaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9xdWFudGl6YXRpb25fdXRpbC5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3JlZmVyZW5jZS9xdWFudGl6ZS5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3JlZmVyZW5jZS9yZXF1YW50aXplLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvdGVuc29yX2N0eXBlcy5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2tlcm5lbF91dGlsLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvZGVxdWFudGl6ZS5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2tlcm5lbF91dGlsLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL3h0ZW5zYS5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19sb2cuaCIKKworbmFtZXNwYWNlIHRmbGl0ZSB7CisKK3ZvaWQqIERlcXVhbnRpemVJbml0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgpIHsKKyAgVEZMSVRFX0RDSEVDSyhjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIgIT0gbnVsbHB0cik7CisgIHJldHVybiBjb250ZXh0LT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIoY29udGV4dCwgc2l6ZW9mKERlcXVhbnRpemVPcERhdGEpKTsKK30KKworVGZMaXRlU3RhdHVzIERlcXVhbnRpemVFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKKyAgVEZMSVRFX0RDSEVDSyhub2RlLT51c2VyX2RhdGEgIT0gbnVsbHB0cik7CisgIERlcXVhbnRpemVPcERhdGEqIGRhdGEgPSBzdGF0aWNfY2FzdDxEZXF1YW50aXplT3BEYXRhKj4obm9kZS0+dXNlcl9kYXRhKTsKKworICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dCA9IHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dChjb250ZXh0LCBub2RlLCAwKTsKKyAgVGZMaXRlRXZhbFRlbnNvciogb3V0cHV0ID0gdGZsaXRlOjptaWNybzo6R2V0RXZhbE91dHB1dChjb250ZXh0LCBub2RlLCAwKTsKKworICAvLyBPdXRwdXQgdHlwZSBlbnN1cmVkIHRvIGJlIGtUZkxpdGVGbG9hdDMyIGF0IHRoZSBQcmVwYXJlIHN0YWdlCisgIFRGTElURV9EQ0hFQ0sob3V0cHV0LT50eXBlID09IGtUZkxpdGVGbG9hdDMyKTsKKworICBzd2l0Y2ggKGlucHV0LT50eXBlKSB7CisgICAgY2FzZSBrVGZMaXRlSW50ODogeworI2lmIEhJRklfVkZQVSAmJiAoZGVmaW5lZChISUZJNSkgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJMykpCisgICAgICBpbnQgZXJyOworICAgICAgY29uc3QgaW50OF90KiBpbnB1dF9kYXRhX3B0cjsKKyAgICAgIGZsb2F0KiBvdXRwdXRfZGF0YV9wdHI7CisgICAgICBjb25zdCBpbnQgZmxhdF9zaXplID0KKyAgICAgICAgICBNYXRjaGluZ0ZsYXRTaXplKHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGlucHV0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKG91dHB1dCkpOworICAgICAgaW5wdXRfZGF0YV9wdHIgPSB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4oaW5wdXQpOworICAgICAgb3V0cHV0X2RhdGFfcHRyID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxmbG9hdD4ob3V0cHV0KTsKKworICAgICAgZXJyID0geGFfbm5fZWxtX2RlcXVhbnRpemVfYXN5bThzX2YzMigKKyAgICAgICAgICBvdXRwdXRfZGF0YV9wdHIsIGlucHV0X2RhdGFfcHRyLCBkYXRhLT5xdWFudGl6YXRpb25fcGFyYW1zLnplcm9fcG9pbnQsCisgICAgICAgICAgZGF0YS0+cXVhbnRpemF0aW9uX3BhcmFtcy5zY2FsZSwgZmxhdF9zaXplKTsKKyAgICAgIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIChlcnIgPT0gMCkpOworI2Vsc2UgICAvLyAgSElGSV9WRlBVICYmIChkZWZpbmVkKEhJRkk1KSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkkzKSkKKyAgICAgIHJlZmVyZW5jZV9vcHM6OkRlcXVhbnRpemUoZGF0YS0+cXVhbnRpemF0aW9uX3BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoaW5wdXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4oaW5wdXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShvdXRwdXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGZsb2F0PihvdXRwdXQpKTsKKyNlbmRpZiAgLy8gIEhJRklfVkZQVSAmJiAoZGVmaW5lZChISUZJNSkgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJMykpCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBrVGZMaXRlSW50MTY6IHsKKyNpZiBISUZJX1ZGUFUgJiYgKGRlZmluZWQoSElGSTUpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTMpKQorICAgICAgaW50IGVycjsKKyAgICAgIGNvbnN0IGludDE2X3QqIGlucHV0X2RhdGFfcHRyOworICAgICAgZmxvYXQqIG91dHB1dF9kYXRhX3B0cjsKKyAgICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgaW5wdXRfc2hhcGUgPSB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShpbnB1dCk7CisgICAgICBjb25zdCBSdW50aW1lU2hhcGUmIG91dHB1dF9zaGFwZSA9IHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKG91dHB1dCk7CisgICAgICBjb25zdCBpbnQgZmxhdF9zaXplID0gTWF0Y2hpbmdGbGF0U2l6ZShpbnB1dF9zaGFwZSwgb3V0cHV0X3NoYXBlKTsKKyAgICAgIGlucHV0X2RhdGFfcHRyID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90PihpbnB1dCk7CisgICAgICBvdXRwdXRfZGF0YV9wdHIgPSB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGZsb2F0PihvdXRwdXQpOworICAgICAgZXJyID0geGFfbm5fZWxtX2RlcXVhbnRpemVfYXN5bTE2c19mMzIoCisgICAgICAgICAgb3V0cHV0X2RhdGFfcHRyLCBpbnB1dF9kYXRhX3B0ciwgZGF0YS0+cXVhbnRpemF0aW9uX3BhcmFtcy56ZXJvX3BvaW50LAorICAgICAgICAgIGRhdGEtPnF1YW50aXphdGlvbl9wYXJhbXMuc2NhbGUsIGZsYXRfc2l6ZSk7CisgICAgICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCAoZXJyID09IDApKTsKKyNlbHNlICAgLy8gSElGSV9WRlBVICYmIChkZWZpbmVkKEhJRkk1KSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkkzKSkKKyAgICAgIHJlZmVyZW5jZV9vcHM6OkRlcXVhbnRpemUoZGF0YS0+cXVhbnRpemF0aW9uX3BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoaW5wdXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KGlucHV0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUob3V0cHV0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxmbG9hdD4ob3V0cHV0KSk7CisjZW5kaWYgIC8vIEhJRklfVkZQVSAmJiAoZGVmaW5lZChISUZJNSkgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJMykpCisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBrVGZMaXRlVUludDg6CisgICAgICByZWZlcmVuY2Vfb3BzOjpEZXF1YW50aXplKGRhdGEtPnF1YW50aXphdGlvbl9wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGlucHV0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTx1aW50OF90PihpbnB1dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKG91dHB1dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8ZmxvYXQ+KG91dHB1dCkpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIE1pY3JvUHJpbnRmKCJJbnB1dCAlcywgb3V0cHV0ICVzIG5vdCBzdXBwb3J0ZWQuIiwKKyAgICAgICAgICAgICAgICAgIFRmTGl0ZVR5cGVHZXROYW1lKGlucHV0LT50eXBlKSwKKyAgICAgICAgICAgICAgICAgIFRmTGl0ZVR5cGVHZXROYW1lKG91dHB1dC0+dHlwZSkpOworICAgICAgcmV0dXJuIGtUZkxpdGVFcnJvcjsKKyAgfQorCisgIHJldHVybiBrVGZMaXRlT2s7Cit9CisKK1RGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfREVRVUFOVElaRSgpIHsKKyAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoRGVxdWFudGl6ZUluaXQsIERlcXVhbnRpemVQcmVwYXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXF1YW50aXplRXZhbCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB0ZmxpdGUKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9mdWxseV9jb25uZWN0ZWQuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvZnVsbHlfY29ubmVjdGVkLmNjCmluZGV4IDEzOTVmYzMuLmRmNTQ1ODAgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9mdWxseV9jb25uZWN0ZWQuY2MKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL2Z1bGx5X2Nvbm5lY3RlZC5jYwpAQCAtMTI1LDQgKzEyNSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFh0ZW5zYVByZXBhcmVGdWxseUNvbm5lY3RlZCwgRXZhbCk7CiB9CiAKK1RGTE1JbmZlcmVuY2VSZWdpc3RyYXRpb24gUmVnaXN0ZXJJbmZlcmVuY2VfRlVMTFlfQ09OTkVDVEVEKCkgeworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChFdmFsKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL2Z1bGx5X2Nvbm5lY3RlZF9pbnQ4LmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL2Z1bGx5X2Nvbm5lY3RlZF9pbnQ4LmNjCmluZGV4IGI1M2FmYTQuLmY4NTBjMGMgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9mdWxseV9jb25uZWN0ZWRfaW50OC5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvZnVsbHlfY29ubmVjdGVkX2ludDguY2MKQEAgLTU3LDcgKzU3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoYmlhcyksIGJpYXNfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUob3V0cHV0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KG91dHB1dCkpOwotI2VsaWYgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKKyNlbGlmIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCiAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgb3V0cHV0X3NoYXBlID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUob3V0cHV0KTsKICAgY29uc3QgaW50IG51bV9iYXRjaGVzID0KICAgICAgIEZsYXRTaXplU2tpcERpbShvdXRwdXRfc2hhcGUsIG91dHB1dF9zaGFwZS5EaW1lbnNpb25zQ291bnQoKSAtIDEpOwpAQCAtMTAzLDcgKzEwMyw3IEBACiAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShiaWFzKSwgYmlhc19kYXRhLAogICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUob3V0cHV0KSwKICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihvdXRwdXQpKTsKLSNlbmRpZiAgLy8gZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKKyNlbmRpZiAgLy8gZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKIAogICByZXR1cm4ga1RmTGl0ZU9rOwogfQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL2xlYWt5X3JlbHUuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvbGVha3lfcmVsdS5jYwppbmRleCA4NTdhNDg4Li5jMWVkMWQ2IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvbGVha3lfcmVsdS5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvbGVha3lfcmVsdS5jYwpAQCAtNzYsNyArNzYsNyBAQAogICAgICAgcmV0dXJuIGtUZkxpdGVPazsKICAgICB9IGJyZWFrOwogICAgIGNhc2Uga1RmTGl0ZUludDE2OiB7Ci0jaWYgZGVmaW5lZChISUZJNCkKKyNpZiBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQogICAgICAgY29uc3QgUnVudGltZVNoYXBlJiBpbnB1dF9zaGFwZSA9IHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGlucHV0KTsKICAgICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgb3V0cHV0X3NoYXBlID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUob3V0cHV0KTsKICAgICAgIGNvbnN0IGludCBmbGF0X3NpemUgPSBNYXRjaGluZ0ZsYXRTaXplKGlucHV0X3NoYXBlLCBvdXRwdXRfc2hhcGUpOwpAQCAtODksNyArODksNyBAQAogICAgICAgaWYgKGVyciAhPSAwKSByZXR1cm4ga1RmTGl0ZUVycm9yOwogI2Vsc2UKICAgICAgIFF1YW50aXplTGVha3lSZWx1PGludDE2X3Q+KGRhdGEsIGlucHV0LCBvdXRwdXQpOwotI2VuZGlmICAvLyBkZWZpbmVkKEhJRkk0KQorI2VuZGlmICAvLyBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQogICAgICAgcmV0dXJuIGtUZkxpdGVPazsKICAgICB9IGJyZWFrOwogICAgIGRlZmF1bHQ6CmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvbG9naXN0aWMuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvbG9naXN0aWMuY2MKaW5kZXggNDFlNmYzZC4uMmRkZjgyZSAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL2xvZ2lzdGljLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9sb2dpc3RpYy5jYwpAQCAtNTQsNyArNTQsNyBAQAogCiAgIHN3aXRjaCAoaW5wdXQtPnR5cGUpIHsKICAgICBjYXNlIGtUZkxpdGVGbG9hdDMyOiB7Ci0jaWYgSElGSV9WRlBVICYmIChkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KSkKKyNpZiBISUZJX1ZGUFUgJiYgKGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpKQogICAgICAgY29uc3QgUnVudGltZVNoYXBlJiBpbnB1dF9zaGFwZSA9IHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGlucHV0KTsKICAgICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgb3V0cHV0X3NoYXBlID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUob3V0cHV0KTsKICAgICAgIGNvbnN0IGludCBmbGF0X3NpemUgPSBNYXRjaGluZ0ZsYXRTaXplKGlucHV0X3NoYXBlLCBvdXRwdXRfc2hhcGUpOwpAQCAtNzAsMTEgKzcwLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGZsb2F0PihpbnB1dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShvdXRwdXQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxmbG9hdD4ob3V0cHV0KSk7Ci0jZW5kaWYgIC8vIEhJRklfVkZQVSAmJiAoZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkpCisjZW5kaWYgIC8vIEhJRklfVkZQVSAmJiAoZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkpCiAgICAgICBicmVhazsKICAgICB9CiAgICAgY2FzZSBrVGZMaXRlSW50ODogewotI2lmIGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCisjaWYgZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKICAgICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgaW5wdXRfc2hhcGUgPSB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShpbnB1dCk7CiAgICAgICBjb25zdCBSdW50aW1lU2hhcGUmIG91dHB1dF9zaGFwZSA9IHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKG91dHB1dCk7CiAgICAgICBjb25zdCBpbnQgZmxhdF9zaXplID0gTWF0Y2hpbmdGbGF0U2l6ZShpbnB1dF9zaGFwZSwgb3V0cHV0X3NoYXBlKTsKQEAgLTk2LDcgKzk2LDcgQEAKICAgICAgICAgICBkYXRhLT5pbnB1dF9tdWx0aXBsaWVyLCBkYXRhLT5pbnB1dF9sZWZ0X3NoaWZ0LAogICAgICAgICAgIE51bUVsZW1lbnRzKGlucHV0LT5kaW1zKSwgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KGlucHV0KSwKICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4ob3V0cHV0KSk7Ci0jZW5kaWYgIC8vIGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCisjZW5kaWYgIC8vIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCiAgICAgICBicmVhazsKICAgICB9CiAgICAgY2FzZSBrVGZMaXRlSW50MTY6IHsKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9sc3RtX2V2YWwuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvbHN0bV9ldmFsLmNjCmluZGV4IDkwNjUzODguLjk0ZTc2YTEgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9sc3RtX2V2YWwuY2MKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL2xzdG1fZXZhbC5jYwpAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAyMDIxIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE0LDEyMDQgKzE0LDQ2OSBAQAogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvbHN0bV9ldmFsLmgiCiAKLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bGltaXRzPgogCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9jL2J1aWx0aW5fb3BfZGF0YS5oIgotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9jL2NvbW1vbi5oIgotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL2NvbXBhdGliaWxpdHkuaCIKLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9wb3J0YWJsZV90ZW5zb3JfdXRpbHMuaCIKLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC90ZW5zb3JfY3R5cGVzLmgiCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMvb3BfbWFjcm9zLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvcmVmZXJlbmNlL2Z1bGx5X2Nvbm5lY3RlZC5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3JlZmVyZW5jZS9pbnRlZ2VyX29wcy9mdWxseV9jb25uZWN0ZWQuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9yZWZlcmVuY2UvaW50ZWdlcl9vcHMvbG9naXN0aWMuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9yZWZlcmVuY2UvaW50ZWdlcl9vcHMvbXVsLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvcmVmZXJlbmNlL2ludGVnZXJfb3BzL3RhbmguaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9yZWZlcmVuY2UvbG9naXN0aWMuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9yZWZlcmVuY2UvbXVsLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvcmVmZXJlbmNlL3RhbmguaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC90eXBlcy5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS94dGVuc2EuaCIKIAogbmFtZXNwYWNlIHRmbGl0ZSB7Ci1uYW1lc3BhY2Ugb3BzIHsKLW5hbWVzcGFjZSBtaWNybyB7Ci1uYW1lc3BhY2UgbHN0bV9ldmFsIHsKLW5hbWVzcGFjZSB7CiAKLS8vIENhbGN1bGF0ZXMgYSBzaW5nbGUgTFNUTSBnYXRlLCBpbnQ4eDhfMTYgdmVyc2lvbi4KLS8vIEltcGxlbWVudHMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBDYWxjdWxhdGVMc3RtR2F0ZUZsb2F0Lgotdm9pZCBDYWxjdWxhdGVMc3RtR2F0ZUludGVnZXI4eDhfMTYoCi0gICAgLy8gSW5wdXQgYW5kIHdlaWdodHMKLSAgICBjb25zdCBpbnQ4X3QqIGlucHV0LCBjb25zdCBpbnQ4X3QqIGlucHV0X3RvX2dhdGVfd2VpZ2h0cywKLSAgICBjb25zdCBpbnQzMl90KiBpbnB1dF90b19nYXRlX2JpYXMsIGNvbnN0IGludDMyX3QgaW5wdXRfdG9fZ2F0ZV9zY2FsZV9hLAotICAgIGNvbnN0IGludDMyX3QgaW5wdXRfdG9fZ2F0ZV9zY2FsZV9iLAotICAgIC8vIE91dHB1dCBzdGF0ZSBhbmQgd2VpZ2h0cwotICAgIGNvbnN0IGludDhfdCogb3V0cHV0X3N0YXRlLCBjb25zdCBpbnQ4X3QqIHJlY3VycmVudF90b19nYXRlX3dlaWdodHMsCi0gICAgY29uc3QgaW50MzJfdCogcmVjdXJyZW50X3RvX2dhdGVfYmlhcywKLSAgICBjb25zdCBpbnQzMl90IHJlY3VycmVudF90b19nYXRlX3NjYWxlX2EsCi0gICAgY29uc3QgaW50MzJfdCByZWN1cnJlbnRfdG9fZ2F0ZV9zY2FsZV9iLAotICAgIC8vIENlbGwgc3RhdGUgYW5kIHdlaWdodHMKLSAgICBjb25zdCBpbnQxNl90KiBjZWxsX3N0YXRlLCBjb25zdCBpbnQxNl90KiBjZWxsX3RvX2dhdGVfd2VpZ2h0cywKLSAgICBjb25zdCBpbnQzMl90IGNlbGxfdG9fZ2F0ZV9zY2FsZV9hLCBjb25zdCBpbnQzMl90IGNlbGxfdG9fZ2F0ZV9zY2FsZV9iLAotICAgIC8vIExheWVyIG5vcm1hbGl6YXRpb24gcGFyYW1ldGVycyAobGF5ZXIgbm9ybSBMU1RNKQotICAgIGNvbnN0IGludDE2X3QqIGxheWVyX25vcm1fY29lZmZpY2llbnRzLCBjb25zdCBpbnQzMl90KiBsYXllcl9ub3JtX2JpYXMsCi0gICAgY29uc3QgaW50MzJfdCBsYXllcl9ub3JtX2lucHV0X3NjYWxlX2EsCi0gICAgY29uc3QgaW50MzJfdCBsYXllcl9ub3JtX2lucHV0X3NjYWxlX2IsCi0gICAgY29uc3QgaW50MzJfdCBsYXllcl9ub3JtX3ZhcmlhbmNlX2d1YXJkLAotICAgIC8vIEFycmF5IHNpemVzCi0gICAgY29uc3QgaW50IG5fYmF0Y2gsIGNvbnN0IGludCBuX2lucHV0LCBjb25zdCBpbnQgbl9vdXRwdXQsIGNvbnN0IGludCBuX2NlbGwsCi0gICAgY29uc3QgVGZMaXRlRnVzZWRBY3RpdmF0aW9uIGFjdGl2YXRpb24sCi0gICAgLy8gT3V0cHV0Ci0gICAgaW50MTZfdCogZ2F0ZSwKLSAgICAvLyBQYXJhbWV0ZXJzIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zCi0gICAgLy8gQ3B1QmFja2VuZENvbnRleHQqIGNvbnRleHQsCi0gICAgLy8gU2NyYXRjaCBhcnJheXMKLSAgICBpbnQzMl90KiBzY3JhdGNoNSkgewotICBjb25zdCBib29sIHVzZV9wZWVwaG9sZSA9IChjZWxsX3RvX2dhdGVfd2VpZ2h0cyAhPSBudWxscHRyKTsKLSAgY29uc3QgYm9vbCB1c2VfbGF5ZXJfbm9ybSA9IChsYXllcl9ub3JtX2NvZWZmaWNpZW50cyAhPSBudWxscHRyKTsKLQotICAvLyBJbml0aWFsaXplIHNjcmF0Y2ggYnVmZmVycyB3aXRoIHplcm9zLiBOb3RlIHRoYXQgdW5saWtlIGZsb2F0IGFuZCBoeWJyaWQKLSAgLy8gdmVyc2lvbnMsIGJpYXMgaXMgb25seSB1c2VkIGluIGxheWVyIG5vcm1hbGl6YXRpb24uCi0gIHN0ZDo6ZmlsbF9uKGdhdGUsIG5fYmF0Y2ggKiBuX2NlbGwsIDApOwotI2lmICFkZWZpbmVkKEhJRkk1KQotICAvLyBGb3IgZWFjaCBiYXRjaCBhbmQgY2VsbDogY29tcHV0ZSBpbnB1dF93ZWlnaHQgKiBpbnB1dC4KLSAgdGVuc29yX3V0aWxzOjpQb3J0YWJsZU1hdHJpeEJhdGNoVmVjdG9yTXVsdGlwbHlBY2N1bXVsYXRlKAotICAgICAgaW5wdXQsIGlucHV0X3RvX2dhdGVfYmlhcywgaW5wdXRfdG9fZ2F0ZV93ZWlnaHRzLCBpbnB1dF90b19nYXRlX3NjYWxlX2EsCi0gICAgICBpbnB1dF90b19nYXRlX3NjYWxlX2IsIG5fYmF0Y2gsIG5faW5wdXQsIG5fY2VsbCwgMCwgc2NyYXRjaDUsIGdhdGUsIE5VTEwpOwotI2Vsc2UKLSAgewotICAgIHhhX25uX21hdFh2ZWNfYWNjX2JhdGNoX3N5bThzeDhfYXN5bTE2cygKLSAgICAgICAgZ2F0ZSwgaW5wdXRfdG9fZ2F0ZV93ZWlnaHRzLCBpbnB1dCwgaW5wdXRfdG9fZ2F0ZV9iaWFzLCBuX2NlbGwsIG5faW5wdXQsCi0gICAgICAgIG5faW5wdXQsIGlucHV0X3RvX2dhdGVfc2NhbGVfYSwgaW5wdXRfdG9fZ2F0ZV9zY2FsZV9iLCAwLCBuX2JhdGNoKTsKK0xzdG1UZW5zb3JzOjpMc3RtVGVuc29ycyhUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7CisgIG1pY3JvX2NvbnRleHRfID0gR2V0TWljcm9Db250ZXh0KGNvbnRleHQpOworICAvLyAyNCBpbnRlcm5hbCB0ZW5zb3JzLiBzZWUgbHN0bV9zaGFyZWQuaCBmb3IgdGVuc29yIG5hbWVzCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMjQ7IGkrKykgeworICAgIGludGVybmFsX3RlbnNvcnNfW2ldID0gbWljcm9fY29udGV4dF8tPkFsbG9jYXRlVGVtcElucHV0VGVuc29yKG5vZGUsIGkpOwogICB9Ci0jZW5kaWYgIC8vICFkZWZpbmVkKEhJRkk1KQotLy8gTm90ZTogbm8gYXV4X2lucHV0LgotCi0vLyBGb3IgZWFjaCBiYXRjaCBhbmQgY2VsbDogY29tcHV0ZSByZWN1cnJlbnRfd2VpZ2h0ICogb3V0cHV0X3N0YXRlLgotI2lmICFkZWZpbmVkKEhJRkk1KQotICB0ZW5zb3JfdXRpbHM6OlBvcnRhYmxlTWF0cml4QmF0Y2hWZWN0b3JNdWx0aXBseUFjY3VtdWxhdGUoCi0gICAgICBvdXRwdXRfc3RhdGUsIHJlY3VycmVudF90b19nYXRlX2JpYXMsIHJlY3VycmVudF90b19nYXRlX3dlaWdodHMsCi0gICAgICByZWN1cnJlbnRfdG9fZ2F0ZV9zY2FsZV9hLCByZWN1cnJlbnRfdG9fZ2F0ZV9zY2FsZV9iLCBuX2JhdGNoLCBuX291dHB1dCwKLSAgICAgIG5fY2VsbCwgMCwgc2NyYXRjaDUsIGdhdGUsIE5VTEwpOwotI2Vsc2UKLSAgewotICAgIHhhX25uX21hdFh2ZWNfYWNjX2JhdGNoX3N5bThzeDhfYXN5bTE2cygKLSAgICAgICAgZ2F0ZSwgcmVjdXJyZW50X3RvX2dhdGVfd2VpZ2h0cywgb3V0cHV0X3N0YXRlLCByZWN1cnJlbnRfdG9fZ2F0ZV9iaWFzLAotICAgICAgICBuX2NlbGwsIG5fb3V0cHV0LCBuX291dHB1dCwgcmVjdXJyZW50X3RvX2dhdGVfc2NhbGVfYSwKLSAgICAgICAgcmVjdXJyZW50X3RvX2dhdGVfc2NhbGVfYiwgMCwgbl9iYXRjaCk7Ci0gIH0KLSNlbmRpZiAgLy8gIWRlZmluZWQoSElGSTUpCi0gIC8vIEZvciBlYWNoIGJhdGNoIGFuZCBjZWxsOiBjb21wdXRlIGNlbGxfd2VpZ2h0ICogY2VsbF9zdGF0ZSAocGVlcGhvbGUgTFNUTSkKLSAgaWYgKHVzZV9wZWVwaG9sZSkgewotICAgIHRlbnNvcl91dGlsczo6UG9ydGFibGVWZWN0b3JCYXRjaFZlY3RvckN3aXNlUHJvZHVjdEFjY3VtdWxhdGUoCi0gICAgICAgIGNlbGxfdG9fZ2F0ZV93ZWlnaHRzLCBuX291dHB1dCwgY2VsbF9zdGF0ZSwgbl9iYXRjaCwKLSAgICAgICAgY2VsbF90b19nYXRlX3NjYWxlX2EsIGNlbGxfdG9fZ2F0ZV9zY2FsZV9iLCBnYXRlKTsKLSAgfQotICAvLyBEbyBsYXllciBub3JtYWxpemF0aW9uIChpZiBsYXllciBub3JtIExTVE0pCi0gIGlmICh1c2VfbGF5ZXJfbm9ybSkgewotICAgIHRlbnNvcl91dGlsczo6UG9ydGFibGVBcHBseUxheWVyTm9ybSgKLSAgICAgICAgZ2F0ZSwgbGF5ZXJfbm9ybV9jb2VmZmljaWVudHMsIGxheWVyX25vcm1fYmlhcywKLSAgICAgICAgbGF5ZXJfbm9ybV9pbnB1dF9zY2FsZV9hLCBsYXllcl9ub3JtX2lucHV0X3NjYWxlX2IsCi0gICAgICAgIGxheWVyX25vcm1fdmFyaWFuY2VfZ3VhcmQsIG5fYmF0Y2gsIG5fY2VsbCwgZ2F0ZSk7Ci0gIH0KLSAgLy8gQXBwbHkgYWN0aXZhdGlvbgotICBzd2l0Y2ggKGFjdGl2YXRpb24pIHsKLSAgICBjYXNlIGtUZkxpdGVBY3RTaWdtb2lkOgotI2lmICFkZWZpbmVkKEhJRkk1KQotICAgICAgdGVuc29yX3V0aWxzOjpQb3J0YWJsZUFwcGx5U2lnbW9pZChnYXRlLCBuX2JhdGNoLCBuX2NlbGwsIGdhdGUpOwotI2Vsc2UKLSAgICAgIHhhX25uX3ZlY19zaWdtb2lkXzE2XzE2KGdhdGUsIGdhdGUsIG5fYmF0Y2ggKiBuX2NlbGwpOwotI2VuZGlmICAvLyAhZGVmaW5lZChISUZJNSkKLSAgICAgIGJyZWFrOwotICAgIGNhc2Uga1RmTGl0ZUFjdFRhbmg6Ci0jaWYgIWRlZmluZWQoSElGSTUpCi0gICAgICB0ZW5zb3JfdXRpbHM6OlBvcnRhYmxlQXBwbHlUYW5oKDMsIGdhdGUsIG5fYmF0Y2gsIG5fY2VsbCwgZ2F0ZSk7Ci0jZWxzZQotICAgICAgeGFfbm5fdmVjX3RhbmhfMTZfMTYoZ2F0ZSwgZ2F0ZSwgMywgbl9iYXRjaCAqIG5fY2VsbCk7Ci0jZW5kaWYgIC8vICFkZWZpbmVkKEhJRkk1KQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIC8vIE9ubHkgU2lnbW9pZCBvciBUYW5oIGlzIHVzZWQuCi0gICAgICBURkxJVEVfQVNTRVJUX0ZBTFNFOwotICB9CisgIG91dHB1dF90ZW5zb3JfID0KKyAgICAgIG1pY3JvX2NvbnRleHRfLT5BbGxvY2F0ZVRlbXBPdXRwdXRUZW5zb3Iobm9kZSwga0xzdG1PdXRwdXRUZW5zb3IpOwogfQogCi0vLyBVcGRhdGVzIHRoZSBMU1RNIGNlbGwgc3RhdGUsIHVzZWQgYnkgYm90aCBpbnRlZ2VyIExTVE0gdmVyc2lvbnMuCi0vLyBBbHNvIHNlZSBVcGRhdGVMc3RtQ2VsbEZsb2F0LgotLy8KLS8vIFBhcmFtZXRlcnM6Ci0vLyAgLSBuX2JhdGNoLCBuX2NlbGw6IHNpemVzIG9mIHZlY3RvcnMKLS8vICAtIGNlbGxfc3RhdGU6IGlucHV0L291dHB1dCB2ZWN0b3IsIHNpemUgbl9iYXRjaCpuX2NlbGwKLS8vICAtIGNlbGxfc3RhdGVfc2NhbGU6IHNjYWxpbmcgZmFjdG9yIG9mIGNlbGwgc3RhdGUuCi0vLyAgLSBpbnB1dF9nYXRlOiBpbnB1dCB2ZWN0b3IsIHNpemUgbl9iYXRjaCpuX2NlbGwuCi0vLyAgLSBmb3JnZXRfZ2F0ZTogaW5wdXQvc2NyYXRjaCB2ZWN0b3IsIHNpemUgbl9iYXRjaCpuX2NlbGwsIGFsd2F5cyBtb2RpZmllZC4KLS8vICAtIGNlbGxfZ2F0ZTogaW5wdXQgdmVjdG9yLCBzaXplIG5fYmF0Y2gqbl9jZWxsLgotLy8gIC0gdXNlX2NpZmc6IHVzZSAxLWZvcmdldF9nYXRlIGluc3RlYWQgb2YgaW5wdXRfZ2F0ZS4KLS8vICAtIGNsaXA6IGlmID4gMCwgY2xpcCB0aGUgcmVzdWx0aW5nIGNlbGwgc3RhdGUgdG8gWy1jbGlwLCArY2xpcF0uCi12b2lkIFVwZGF0ZUxzdG1DZWxsSW50ZWdlcihpbnQgbl9iYXRjaCwgaW50IG5fY2VsbCwgaW50MTZfdCogY2VsbF9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2VsbF9zdGF0ZV9zY2FsZSwgY29uc3QgaW50MTZfdCogaW5wdXRfZ2F0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QqIGZvcmdldF9nYXRlLCBjb25zdCBpbnQxNl90KiBjZWxsX2dhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZV9jaWZnLCBpbnQxNl90IGNsaXApIHsKLSNpZiAhZGVmaW5lZChISUZJNSkKLSAgLy8gVXNlIHRoZSBmb3JnZXRfZ2F0ZSBhcnJheSBhcyBzY3JhdGNoLCBhcyBpbnB1dF9nYXRlIGFycmF5IGlzIG5vdCBhbGxvY2F0ZWQKLSAgLy8gaW4gQ0lGRyBjYXNlLiAoQmUgY2FyZWZ1bCBub3QgdG8gd3JpdGUgdG8gdGhlIHNjcmF0Y2ggYmVmb3JlIHJlYWRpbmcgdGhlCi0gIC8vIGZvcmdldCBnYXRlIGRhdGEuKQotICBpbnQxNl90KiBzY3JhdGNoID0gZm9yZ2V0X2dhdGU7Ci0KLSAgdGVuc29yX3V0aWxzOjpQb3J0YWJsZUN3aXNlTXVsKGZvcmdldF9nYXRlLCBjZWxsX3N0YXRlLCBuX2JhdGNoLCBuX2NlbGwsIDE1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VsbF9zdGF0ZSk7Ci0gIGlmICh1c2VfY2lmZykgewotICAgIHRlbnNvcl91dGlsczo6UG9ydGFibGVTdWIxVmVjdG9yKGZvcmdldF9nYXRlLCBuX2JhdGNoICogbl9jZWxsLCBzY3JhdGNoKTsKLSAgICB0ZW5zb3JfdXRpbHM6OlBvcnRhYmxlQ3dpc2VNdWwoc2NyYXRjaCwgY2VsbF9nYXRlLCBuX2JhdGNoLCBuX2NlbGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwICsgY2VsbF9zdGF0ZV9zY2FsZSwgc2NyYXRjaCk7Ci0gIH0gZWxzZSB7Ci0gICAgdGVuc29yX3V0aWxzOjpQb3J0YWJsZUN3aXNlTXVsKGlucHV0X2dhdGUsIGNlbGxfZ2F0ZSwgbl9iYXRjaCwgbl9jZWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCArIGNlbGxfc3RhdGVfc2NhbGUsIHNjcmF0Y2gpOwotICB9Ci0gIHRlbnNvcl91dGlsczo6UG9ydGFibGVDd2lzZUFkZChjZWxsX3N0YXRlLCBzY3JhdGNoLCBuX2JhdGNoLCBuX2NlbGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsX3N0YXRlKTsKLQotICBpZiAoY2xpcCA+IDApIHsKLSAgICB0ZW5zb3JfdXRpbHM6OlBvcnRhYmxlQ3dpc2VDbGlwcGluZyhjZWxsX3N0YXRlLCBuX2JhdGNoICogbl9jZWxsLCBjbGlwKTsKLSAgfQotI2Vsc2UKLSAgaWYgKHVzZV9jaWZnKSB7Ci0gICAgY2FsY19jZWxsX3N0YXRlX3dpdGhfY2lmZyhjZWxsX3N0YXRlLCBmb3JnZXRfZ2F0ZSwgY2VsbF9nYXRlLCAxNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwICsgY2VsbF9zdGF0ZV9zY2FsZSwgY2xpcCwgbl9iYXRjaCAqIG5fY2VsbCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2FsY19jZWxsX3N0YXRlX3dpdGhvdXRfY2lmZyhjZWxsX3N0YXRlLCBmb3JnZXRfZ2F0ZSwgY2VsbF9nYXRlLCBpbnB1dF9nYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUsIDMwICsgY2VsbF9zdGF0ZV9zY2FsZSwgY2xpcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fYmF0Y2ggKiBuX2NlbGwpOwotICB9Ci0KLSNlbmRpZiAgLy8gIWRlZmluZWQoSElGSTUpCi19Ci0KLS8vIENhbGN1bGF0ZXMgdGhlIG91dHB1dCBzdGF0ZSB0ZW5zb3Igb2YgYW4gTFNUTSBzdGVwLiBTZWUgRmxvYXQgYW5kIGh5YnJpZAotLy8gdmVyc2lvbnMgYXMgd2VsbC4KLS8vCi0vLyBQYXJhbWV0ZXJzOgotLy8gIC0gbl9iYXRjaDogYmF0Y2hlczogdGhlIG51bWJlciBvZiBkaXN0aW5jdCB2ZWN0b3JzIGluIGVhY2ggYXJyYXkuCi0vLyAgLSBuX2NlbGwsIG5fb3V0cHV0OiBzaXplcyBvZiB2ZWN0b3JzLgotLy8gIC0gY2VsbF9zdGF0ZSwgb3V0cHV0X2dhdGU6IGlucHV0IHZlY3RvcnMsIHNpemUgbl9iYXRjaCpuX2NlbGwuCi0vLyAgLSBjZWxsX3N0YXRlX3NjYWxlOiBzY2FsaW5nIG9mIGNlbGxfc3RhdGUuCi0vLyAgLSBoaWRkZW5fc2NhbGVfW2F8Yl06IGVmZmVjdGl2ZSBzY2FsZSBvZiBjZWxsX3N0YXRlLipvdXRwdXRfZ2F0ZQotLy8gIC0gaGlkZGVuX3pwOiB6ZXJvX3BvaW50IGZvciBjZWxsX3N0YXRlLipvdXRwdXRfZ2F0ZQotLy8gIC0gcHJvamVjdGlvbl93ZWlnaHRzLCBwcm9qX3NjYWxlX1thfGJdLCBwcm9qZWN0aW9uX2JpYXM6Ci0vLyAgICAgIGNvbnN0YW50IGlucHV0cywgZGVzY3JpYmluZyBwcm9qZWN0aW9uIG1hdHJpeCBhbmQgYmlhcy4KLS8vICAtIG91dHB1dF9zdGF0ZV96cDogemVybyBwb2ludCBvZiBvdXRwdXRfc3RhdGUuIChJbnB1dCwgY2FsaWJyYXRlZCB2YWx1ZS4pCi0vLyAgLSBxdWFudGl6ZWRfcHJval9jbGlwOiBpZiA+IDAsIGNsaXAgdGhlIG91dHB1dCBvZiB0aGUgcHJvamVjdGlvbi4KLS8vICAtIG91dHB1dF9zdGF0ZTogb3V0cHV0IHZlY3Rvciwgc2l6ZSBuX2JhdGNoKm5fb3V0cHV0LiBNdXN0IGJlIGNvbnRpZ3VvdXMuCi0vLyAgLSBjb250ZXh0OiBkYXRhIGZvciBvcHRpbWl6ZWQgTWF0cml4QmF0Y2hWZWN0b3JNdWx0aXBseUFjY3VtdWxhdGUuCi0vLyAgLSBzY3JhdGNoMDogc2NyYXRjaCBhcmVhIG9mIHNpemUgbl9iYXRjaCpuX2NlbGwKLS8vICAtIHNjcmF0Y2gxOiBzY3JhdGNoIGFyZWEgb2Ygc2l6ZSBuX2JhdGNoKm5fY2VsbAotLy8gIC0gc2NyYXRjaDI6IHNjcmF0Y2ggYXJlYSB1c2VkIGJ5IE1hdHJpeEJhdGNoVmVjdG9yTXVsdGlwbHlBY2N1bXVsYXRlCi12b2lkIENhbGN1bGF0ZUxzdG1PdXRwdXRJbnRlZ2VyOHg4XzE2KAotICAgIGludCBuX2JhdGNoLCBpbnQgbl9jZWxsLCBpbnQgbl9vdXRwdXQsIGNvbnN0IGludDE2X3QqIGNlbGxfc3RhdGUsCi0gICAgaW50MzJfdCBjZWxsX3N0YXRlX3NjYWxlLCBjb25zdCBpbnQxNl90KiBvdXRwdXRfZ2F0ZSwKLSAgICBpbnQzMl90IGhpZGRlbl9zY2FsZV9hLCBpbnQzMl90IGhpZGRlbl9zY2FsZV9iLCBpbnQzMl90IGhpZGRlbl96cCwKLSAgICBjb25zdCBpbnQ4X3QqIHByb2plY3Rpb25fd2VpZ2h0cywgaW50MzJfdCBwcm9qX3NjYWxlX2EsCi0gICAgaW50MzJfdCBwcm9qX3NjYWxlX2IsIGNvbnN0IGludDMyX3QqIHByb2plY3Rpb25fYmlhcywKLSAgICBpbnQzMl90IG91dHB1dF9zdGF0ZV96cCwgaW50OF90IHF1YW50aXplZF9wcm9qX2NsaXAsIGludDhfdCogb3V0cHV0X3N0YXRlLAotICAgIGludDE2X3QqIHNjcmF0Y2gwLCBpbnQ4X3QqIHNjcmF0Y2gxLCBpbnQzMl90KiBzY3JhdGNoMikgewotLy8gTm90ZTogdW5saWtlIGZsb2F0L2h5YnJpZCwgdGhlIGFjdGl2YXRpb24gaXMgYWx3YXlzIFRhbmguCi0jaWYgIWRlZmluZWQoSElGSTUpCi0gIHRlbnNvcl91dGlsczo6UG9ydGFibGVBcHBseVRhbmgoMTUgKyBjZWxsX3N0YXRlX3NjYWxlLCBjZWxsX3N0YXRlLCBuX2JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fY2VsbCwgc2NyYXRjaDApOwotI2Vsc2UKLSAgeGFfbm5fdmVjX3RhbmhfMTZfMTYoc2NyYXRjaDAsIGNlbGxfc3RhdGUsICgxNSArIGNlbGxfc3RhdGVfc2NhbGUpLAotICAgICAgICAgICAgICAgICAgICAgICBuX2JhdGNoICogbl9jZWxsKTsKLSNlbmRpZiAgLy8gIWRlZmluZWQoSElGSTUpCi0KLSNpZiAhZGVmaW5lZChISUZJNSkKLSAgdGVuc29yX3V0aWxzOjpQb3J0YWJsZUN3aXNlTXVsKG91dHB1dF9nYXRlLCBzY3JhdGNoMCwgaGlkZGVuX3NjYWxlX2EsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRkZW5fc2NhbGVfYiwgbl9iYXRjaCwgbl9jZWxsLCBoaWRkZW5fenAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JhdGNoMSk7Ci0jZWxzZQotICB4YV9ubl9lbG1fbXVsXzE2eDE2X2FzeW04cyhzY3JhdGNoMSwgb3V0cHV0X2dhdGUsIHNjcmF0Y2gwLCBoaWRkZW5fc2NhbGVfYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkZGVuX3NjYWxlX2IsIGhpZGRlbl96cCwgbl9iYXRjaCAqIG5fY2VsbCk7Ci0jZW5kaWYgIC8vICFkZWZpbmVkKEhJRkk1KQotCi0gIGNvbnN0IGJvb2wgdXNlX3Byb2plY3Rpb24gPSAocHJvamVjdGlvbl93ZWlnaHRzICE9IG51bGxwdHIpOwotCi0gIGlmICh1c2VfcHJvamVjdGlvbikgewotICAgIC8vIE5vdGU6IG5vIGJpYXMgbGlrZSBpbiBmbG9hdC9oeWJyaWQKLSAgICBzdGQ6OmZpbGxfbihvdXRwdXRfc3RhdGUsIG5fYmF0Y2ggKiBuX291dHB1dCwgMCk7Ci0gICAgdGVuc29yX3V0aWxzOjpQb3J0YWJsZU1hdHJpeEJhdGNoVmVjdG9yTXVsdGlwbHlBY2N1bXVsYXRlKAotICAgICAgICBzY3JhdGNoMSwgcHJvamVjdGlvbl9iaWFzLCBwcm9qZWN0aW9uX3dlaWdodHMsIHByb2pfc2NhbGVfYSwKLSAgICAgICAgcHJval9zY2FsZV9iLCBuX2JhdGNoLCBuX2NlbGwsIG5fb3V0cHV0LCBvdXRwdXRfc3RhdGVfenAsIHNjcmF0Y2gyLAotICAgICAgICBvdXRwdXRfc3RhdGUsIE5VTEwpOwotICAgIGlmIChxdWFudGl6ZWRfcHJval9jbGlwID4gMCkgewotICAgICAgdGVuc29yX3V0aWxzOjpQb3J0YWJsZUN3aXNlQ2xpcHBpbmcob3V0cHV0X3N0YXRlLCBuX2JhdGNoICogbl9vdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFudGl6ZWRfcHJval9jbGlwKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgc3RkOjpjb3B5X24oc2NyYXRjaDEsIG5fYmF0Y2ggKiBuX291dHB1dCwgb3V0cHV0X3N0YXRlKTsKLSAgfQotfQotCi0vLyBDYWxjdWxhdGVzIGEgc2luZ2xlIExTVE0gZ2F0ZSwgaW50OHg4XzggdmVyc2lvbi4KLS8vIEltcGxlbWVudHMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBDYWxjdWxhdGVMc3RtR2F0ZUZsb2F0Lgotdm9pZCBDYWxjdWxhdGVMc3RtR2F0ZUludGVnZXI4eDhfOCgKLSAgICAvLyBJbnB1dHMgYW5kIHdlaWdodHMKLSAgICBjb25zdCBpbnQ4X3QqIGlucHV0LCBpbnQzMl90IGlucHV0X3pwLCBjb25zdCBpbnQ4X3QqIGlucHV0X3RvX2dhdGVfd2VpZ2h0LAotICAgIGNvbnN0IGludDMyX3QgaW5wdXRfdG9fZ2F0ZV9zY2FsZV9hLCBjb25zdCBpbnQzMl90IGlucHV0X3RvX2dhdGVfc2NhbGVfYiwKLSAgICBjb25zdCBpbnQzMl90IGlucHV0X3RpbWVzX3dlaWdodHNfc2NhbGVfYSwKLSAgICBjb25zdCBpbnQzMl90IGlucHV0X3RpbWVzX3dlaWdodHNfc2NhbGVfYiwKLSAgICBjb25zdCBpbnQzMl90IGlucHV0X3RpbWVzX3dlaWdodHNfenAsCi0gICAgLy8gT3V0cHV0IHN0YXRlIGFuZCB3ZWlnaHRzCi0gICAgY29uc3QgaW50OF90KiBvdXRwdXRfc3RhdGUsIGNvbnN0IGludDMyX3Qgb3V0cHV0X3N0YXRlX3pwLAotICAgIGNvbnN0IGludDhfdCogcmVjdXJyZW50X3RvX2dhdGVfd2VpZ2h0LAotICAgIGNvbnN0IGludDMyX3QgcmVjdXJyZW50X3RvX2dhdGVfc2NhbGVfYSwKLSAgICBjb25zdCBpbnQzMl90IHJlY3VycmVudF90b19nYXRlX3NjYWxlX2IsCi0gICAgY29uc3QgaW50MzJfdCBvdXRwdXRfc3RhdGVfdGltZXNfd2VpZ2h0c19zY2FsZV9hLAotICAgIGNvbnN0IGludDMyX3Qgb3V0cHV0X3N0YXRlX3RpbWVzX3dlaWdodHNfc2NhbGVfYiwKLSAgICBjb25zdCBpbnQzMl90IG91dHB1dF9zdGF0ZV90aW1lc193ZWlnaHRzX3pwLAotICAgIC8vIExheWVyIG5vcm1hbGl6YXRpb24gcGFyYW1ldGVycyAobGF5ZXIgbm9ybSBMU1RNKQotICAgIGNvbnN0IGludDE2X3QqIGxheWVyX25vcm1fZ2F0ZV93ZWlnaHQsCi0gICAgY29uc3QgaW50MzJfdCBsYXllcl9ub3JtX2dhdGVfc2NhbGVfYSwKLSAgICBjb25zdCBpbnQzMl90IGxheWVyX25vcm1fZ2F0ZV9zY2FsZV9iLCBjb25zdCBpbnQzMl90KiBnYXRlX2JpYXMsCi0gICAgLy8gQXJyYXkgc2l6ZXMKLSAgICBjb25zdCBpbnQgbl9iYXRjaCwgY29uc3QgaW50IG5faW5wdXQsIGNvbnN0IGludCBuX291dHB1dCwgY29uc3QgaW50IG5fY2VsbCwKLSAgICBjb25zdCBUZkxpdGVGdXNlZEFjdGl2YXRpb24gYWN0aXZhdGlvbiwKLSAgICAvLyBPdXRwdXQKLSAgICBpbnQxNl90KiBnYXRlLAotICAgIC8vIFNjcmF0Y2ggYXJyYXlzLCBib3RoIHNpemVkIG5fYmF0Y2gqbl9jZWxsCi0gICAgaW50OF90KiBzY3JhdGNoMCwgaW50OF90KiBzY3JhdGNoMSkgewotICAvLyBNdWx0aXBseSBpbnB1dCAqIGlucHV0X3dlaWdodHMgPT4gc2NyYXRjaDAKLSAgdGVuc29yX3V0aWxzOjpQb3J0YWJsZU1hdHJpeEJhdGNoVmVjdG9yTXVsdGlwbHkoCi0gICAgICBpbnB1dCwgaW5wdXRfenAsIGlucHV0X3RvX2dhdGVfd2VpZ2h0LCBpbnB1dF90b19nYXRlX3NjYWxlX2EsCi0gICAgICBpbnB1dF90b19nYXRlX3NjYWxlX2IsIG5fYmF0Y2gsIG5faW5wdXQsIG5fY2VsbCwgc2NyYXRjaDAsCi0gICAgICBpbnB1dF90aW1lc193ZWlnaHRzX3pwKTsKLSAgLy8gTXVsdGlwbHkgb3V0cHV0X3N0YXRlICogcmVjdXJyZW50X3dlaWdodHMgPT4gc2NyYXRjaDEKLSAgdGVuc29yX3V0aWxzOjpQb3J0YWJsZU1hdHJpeEJhdGNoVmVjdG9yTXVsdGlwbHkoCi0gICAgICBvdXRwdXRfc3RhdGUsIG91dHB1dF9zdGF0ZV96cCwgcmVjdXJyZW50X3RvX2dhdGVfd2VpZ2h0LAotICAgICAgcmVjdXJyZW50X3RvX2dhdGVfc2NhbGVfYSwgcmVjdXJyZW50X3RvX2dhdGVfc2NhbGVfYiwgbl9iYXRjaCwgbl9vdXRwdXQsCi0gICAgICBuX2NlbGwsIHNjcmF0Y2gxLCBvdXRwdXRfc3RhdGVfdGltZXNfd2VpZ2h0c196cCk7Ci0gIC8vIEFkZCBzY3JhdGNoMCArIHNjcmF0Y2gxID0+IGdhdGUKLSAgdGVuc29yX3V0aWxzOjpQb3J0YWJsZVR3b0dhdGVTYXR1cmF0aW5nQWRkKAotICAgICAgc2NyYXRjaDAsIGlucHV0X3RpbWVzX3dlaWdodHNfenAsIHNjcmF0Y2gxLCBvdXRwdXRfc3RhdGVfdGltZXNfd2VpZ2h0c196cCwKLSAgICAgIGlucHV0X3RpbWVzX3dlaWdodHNfc2NhbGVfYSwgaW5wdXRfdGltZXNfd2VpZ2h0c19zY2FsZV9iLAotICAgICAgb3V0cHV0X3N0YXRlX3RpbWVzX3dlaWdodHNfc2NhbGVfYSwgb3V0cHV0X3N0YXRlX3RpbWVzX3dlaWdodHNfc2NhbGVfYiwKLSAgICAgIG5fYmF0Y2gsIG5fY2VsbCwgZ2F0ZSk7Ci0gIC8vIEFwcGx5IGxheWVyIG5vcm1hbGl6YXRpb24uCi0gIHRlbnNvcl91dGlsczo6UG9ydGFibGVBcHBseUxheWVyTm9ybUZsb2F0KAotICAgICAgZ2F0ZSwgbGF5ZXJfbm9ybV9nYXRlX3dlaWdodCwgbGF5ZXJfbm9ybV9nYXRlX3NjYWxlX2EsCi0gICAgICBsYXllcl9ub3JtX2dhdGVfc2NhbGVfYiwgZ2F0ZV9iaWFzLCBuX2JhdGNoLCBuX2NlbGwsIGdhdGUpOwotICAvLyBBcHBseSBhY3RpdmF0aW9uLgotICBzd2l0Y2ggKGFjdGl2YXRpb24pIHsKLSAgICBjYXNlIGtUZkxpdGVBY3RTaWdtb2lkOgotICAgICAgdGVuc29yX3V0aWxzOjpQb3J0YWJsZUFwcGx5U2lnbW9pZEZsb2F0KGdhdGUsIG5fYmF0Y2gsIG5fY2VsbCwgZ2F0ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtUZkxpdGVBY3RUYW5oOgotICAgICAgdGVuc29yX3V0aWxzOjpQb3J0YWJsZUFwcGx5VGFuaEZsb2F0KGdhdGUsIG5fYmF0Y2gsIG5fY2VsbCwgLTEyLCBnYXRlKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAvLyBPbmx5IFNpZ21vaWQgb3IgVGFuaCBpcyB1c2VkLgotICAgICAgVEZMSVRFX0FTU0VSVF9GQUxTRTsKLSAgfQotfQotCi0vLyBDYWxjdWxhdGVzIHRoZSBvdXRwdXQgc3RhdGUgdGVuc29yIG9mIGFuIExTVE0gc3RlcC4gU2VlIEZsb2F0IGFuZCBoeWJyaWQKLS8vIHZlcnNpb25zIGFzIHdlbGwuCi0vLwotLy8gUGFyYW1ldGVyczoKLS8vICAtIG5fYmF0Y2g6IGJhdGNoZXM6IHRoZSBudW1iZXIgb2YgZGlzdGluY3QgdmVjdG9ycyBpbiBlYWNoIGFycmF5LgotLy8gIC0gbl9jZWxsLCBuX291dHB1dDogc2l6ZXMgb2YgdmVjdG9ycy4KLS8vICAtIGNlbGxfc3RhdGUsIG91dHB1dF9nYXRlOiBpbnB1dCB2ZWN0b3JzLCBzaXplIG5fYmF0Y2gqbl9jZWxsLgotLy8gIC0gcHJvamVjdGlvbl93ZWlnaHRzLCBwcm9qX3NjYWxlX1thfGJdLCBwcm9qZWN0aW9uX2JpYXM6Ci0vLyAgICAgIGNvbnN0YW50IGlucHV0cywgZGVzY3JpYmluZyBwcm9qZWN0aW9uIG1hdHJpeCBhbmQgYmlhcy4KLS8vICAtIG91dHB1dF9zdGF0ZV96cDogemVybyBwb2ludCBvZiB0aGUgb3V0cHV0IHN0YXRlLgotLy8gIC0gcXVhbnRpemVkX3Byb2pfY2xpcDogaWYgPiAwLCBjbGlwIHRoZSBvdXRwdXQgb2YgdGhlIHByb2plY3Rpb24uCi0vLyAgLSBvdXRwdXRfc3RhdGU6IG91dHB1dCB2ZWN0b3IsIHNpemUgbl9iYXRjaCpuX291dHB1dC4gTXVzdCBiZSBjb250aWd1b3VzLgotLy8gIC0gc2NyYXRjaDogc2NyYXRjaCBhcmVhIG9mIHNpemUgbl9iYXRjaCpuX2NlbGwKLXZvaWQgQ2FsY3VsYXRlTHN0bU91dHB1dEludGVnZXI4eDhfOCgKLSAgICBpbnQgbl9iYXRjaCwgaW50IG5fY2VsbCwgaW50IG5fb3V0cHV0LCBjb25zdCBpbnQxNl90KiBjZWxsX3N0YXRlLAotICAgIGNvbnN0IGludDE2X3QqIG91dHB1dF9nYXRlLCBjb25zdCBpbnQ4X3QqIHByb2plY3Rpb25fd2VpZ2h0cywKLSAgICBpbnQzMl90IHByb2pfc2NhbGVfYSwgaW50MzJfdCBwcm9qX3NjYWxlX2IsIGNvbnN0IGludDMyX3QqIHByb2plY3Rpb25fYmlhcywKLSAgICBpbnQzMl90IG91dHB1dF9zdGF0ZV96cCwgaW50MzJfdCBxdWFudGl6ZWRfcHJval9jbGlwLCBpbnQ4X3QqIG91dHB1dF9zdGF0ZSwKLSAgICBpbnQxNl90KiBzY3JhdGNoKSB7Ci0gIC8vIE5vdGU6IHVubGlrZSBmbG9hdC9oeWJyaWQsIHRoZSBhY3RpdmF0aW9uIGlzIGFsd2F5cyBUYW5oLgotICB0ZW5zb3JfdXRpbHM6OlBvcnRhYmxlQXBwbHlUYW5oRmxvYXQoY2VsbF9zdGF0ZSwgbl9iYXRjaCwgbl9jZWxsLCAtMTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JhdGNoKTsKLSAgdGVuc29yX3V0aWxzOjpQb3J0YWJsZUN3aXNlTXVsKG91dHB1dF9nYXRlLCBzY3JhdGNoLCBuX2JhdGNoLCBuX2NlbGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSArIDE1IC0gMTUsIHNjcmF0Y2gpOwotICAvLyBOb3RlOiBubyBiaWFzIGxpa2UgaW4gZmxvYXQvaHlicmlkCi0gIHRlbnNvcl91dGlsczo6UG9ydGFibGVNYXRyaXhCYXRjaFZlY3Rvck11bHRpcGx5KAotICAgICAgc2NyYXRjaCwgcHJvamVjdGlvbl93ZWlnaHRzLCBwcm9qX3NjYWxlX2EsIHByb2pfc2NhbGVfYiwgcHJvamVjdGlvbl9iaWFzLAotICAgICAgbl9iYXRjaCwgbl9jZWxsLCBuX291dHB1dCwgb3V0cHV0X3N0YXRlX3pwLCBvdXRwdXRfc3RhdGUpOwotICBpZiAocXVhbnRpemVkX3Byb2pfY2xpcCA+IDApIHsKLSAgICB0ZW5zb3JfdXRpbHM6OlBvcnRhYmxlQ3dpc2VDbGlwcGluZyhvdXRwdXRfc3RhdGUsIG5fYmF0Y2ggKiBuX291dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50OF90KXF1YW50aXplZF9wcm9qX2NsaXApOwotICB9Ci19Ci0KLS8vIEZ1bGx5IHF1YW50aXplZCBsc3RtIGtlcm5lbCBmb3IgMTYgYml0IGdhdGUgbWF0bXVsIG91dHB1dC4KLS8vCi0vLyBJbnB1dCB0ZW5zb3Igb2Ygc2l6ZSBuX2JhdGNoICogbl9pbnB1dDoKLS8vICAgaW5wdXRfcHRyCi0vLwotLy8gTFNUTSB3ZWlnaHRzOgotLy8gUXVhbnRpemVkIGlucHV0IHdlaWdodHMgb2Ygc2l6ZSAnbl9jZWxsICogbl9pbnB1dCc6Ci0vLyAgIGlucHV0X3RvX2lucHV0X3dlaWdodF9wdHIgICAgICAgICAgICAtIG9wdGlvbmFsCi0vLyAgIGlucHV0X3RvX2ZvcmdldF93ZWlnaHRfcHRyICAgICAgICAgICAtIG9wdGlvbmFsCi0vLyAgIGlucHV0X3RvX2NlbGxfd2VpZ2h0X3B0ciAgICAgICAgICAgICAtIG9wdGlvbmFsCi0vLyAgIGlucHV0X3RvX291dHB1dF93ZWlnaHRfcHRyICAgICAgICAgICAtIG9wdGlvbmFsCi0vLwotLy8gUXVhbnRpemVkIHJlY3VycmVudCB3ZWlnaHRzIG9mIHNpemUgJ25fY2VsbCAqIG5fb3V0cHV0JzoKLS8vICAgcmVjdXJyZW50X3RvX2lucHV0X3dlaWdodF9wdHIgICAgICAgIC0gb3B0aW9uYWwKLS8vICAgcmVjdXJyZW50X3RvX2ZvcmdldF93ZWlnaHRzX3B0cgotLy8gICByZWN1cnJlbnRfdG9fY2VsbF93ZWlnaHRzX3B0cgotLy8gICByZWN1cnJlbnRfdG9faW5wdXRfd2VpZ2h0c19wdHIKLS8vCi0vLyBRdWFudGl6ZWQgcGVlcGhvbGUgd2VpZ2h0cyBvZiBzaXplICduX2NlbGwnLCByZXByZXNlbnRpbmcgZGlhZ29uYWwgbWF0cmljZXMuCi0vLyAgIGNlbGxfdG9faW5wdXRfd2VpZ2h0cyAgICAgICAgICAgICAgIC0gb3B0aW9uYWwKLS8vICAgY2VsbF90b19jZWxsX3dlaWdodHMgICAgICAgICAgICAgICAgLSBvcHRpb25hbAotLy8gICBjZWxsX3RvX291dHB1dF93ZWlnaHRzICAgICAgICAgICAgICAtIG9wdGlvbmFsCi0vLwotLy8gUXVhbnRpemVkIHByb2plY3Rpb24gd2VpZ2h0cyBvZiBzaXplICduX291dHB1dCAqIG5fY2VsbCcKLS8vICAgcHJvamVjdGlvbl93ZWlnaHRfcHRyICAgICAgICAgICAgICAgICAgICAgLSBvcHRpb25hbAotLy8KLS8vIFdlaWdodCBzY2FsZXMgKHNjYWxhcnMpIGZvciBlYWNoIG9mIHRoZSB3ZWlnaHRzIGFib3ZlLgotLy8gICBlZmZlY3RpdmVfaW5wdXRfdG9faW5wdXRfc2NhbGVfYSAgICAtIG9wdGlvbmFsCi0vLyAgIGVmZmVjdGl2ZV9pbnB1dF90b19pbnB1dF9zY2FsZV9iICAgIC0gb3B0aW9uYWwKLS8vICAgZWZmZWN0aXZlX2lucHV0X3RvX2ZvcmdldF9zY2FsZV9hCi0vLyAgIGVmZmVjdGl2ZV9pbnB1dF90b19mb3JnZXRfc2NhbGVfYgotLy8gICBlZmZlY3RpdmVfaW5wdXRfdG9fY2VsbF9zY2FsZV9hCi0vLyAgIGVmZmVjdGl2ZV9pbnB1dF90b19jZWxsX3NjYWxlX2IKLS8vICAgZWZmZWN0aXZlX2lucHV0X3RvX291dHB1dF9zY2FsZV9hCi0vLyAgIGVmZmVjdGl2ZV9pbnB1dF90b19vdXRwdXRfc2NhbGVfYgotLy8gICBlZmZlY3RpdmVfcmVjdXJyZW50X3RvX2lucHV0X3NjYWxlX2EgICAgLSBvcHRpb25hbAotLy8gICBlZmZlY3RpdmVfcmVjdXJyZW50X3RvX2lucHV0X3NjYWxlX2IgICAgLSBvcHRpb25hbAotLy8gICBlZmZlY3RpdmVfcmVjdXJyZW50X3RvX2ZvcmdldF9zY2FsZV9hCi0vLyAgIGVmZmVjdGl2ZV9yZWN1cnJlbnRfdG9fZm9yZ2V0X3NjYWxlX2IKLS8vICAgZWZmZWN0aXZlX3JlY3VycmVudF90b19jZWxsX3NjYWxlX2EKLS8vICAgZWZmZWN0aXZlX3JlY3VycmVudF90b19jZWxsX3NjYWxlX2IKLS8vICAgZWZmZWN0aXZlX3JlY3VycmVudF90b19vdXRwdXRfc2NhbGVfYQotLy8gICBlZmZlY3RpdmVfcmVjdXJyZW50X3RvX291dHB1dF9zY2FsZV9iCi0vLyAgIGVmZmVjdGl2ZV9wcm9qX3NjYWxlX2EgICAgICAgICAgICAgICAgICAtIG9wdGlvbmFsCi0vLyAgIGVmZmVjdGl2ZV9wcm9qX3NjYWxlX2IgICAgICAgICAgICAgICAgICAtIG9wdGlvbmFsCi0vLwotLy8gR2F0ZSBiaWFzZXMgb2Ygc2l6ZSAnbl9jZWxsJzoKLS8vICAgaW5wdXRfZ2F0ZV9iaWFzX3B0ciAgICAgICAgICAgICAgICAgLSBvcHRpb25hbAotLy8gICBmb3JnZXRfZ2F0ZV9iaWFzX3B0cgotLy8gICBjZWxsX2dhdGVfYmlhc19wdHIKLS8vICAgb3V0cHV0X2dhdGVfYmlhc19wdHIKLS8vCi0vLyBMYXllciBub3JtIGNvZWZmaWNpZW50cyBvZiBzaXplICduX2NlbGwnLCByZXByZXNlbnRpbmcgZGlhZ29uYWwgbWF0cmljZXMuCi0vLyAgIGxheWVyX25vcm1faW5wdXRfd2VpZ2h0X3B0ciAgICAtIG9wdGlvbmFsCi0vLyAgIGxheWVyX25vcm1fZm9yZ2V0X3dlaWdodF9wdHIgICAtIG9wdGlvbmFsCi0vLyAgIGxheWVyX25vcm1fY2VsbF93ZWlnaHRfcHRyICAgICAtIG9wdGlvbmFsCi0vLyAgIGxheWVyX25vcm1fb3V0cHV0X3dlaWdodF9wdHIgICAtIG9wdGlvbmFsCi0vLwotLy8gTGF5ZXIgbm9ybSBzY2FsZXMgb2Ygc2l6ZSAnbl9jZWxsJy4KLS8vICAgbGF5ZXJfbm9ybV9pbnB1dF9zY2FsZV9hICAgICAtIG9wdGlvbmFsCi0vLyAgIGxheWVyX25vcm1faW5wdXRfc2NhbGVfYiAgICAgLSBvcHRpb25hbAotLy8gICBsYXllcl9ub3JtX2ZvcmdldF9zY2FsZV9hICAgIC0gb3B0aW9uYWwKLS8vICAgbGF5ZXJfbm9ybV9mb3JnZXRfc2NhbGVfYiAgICAtIG9wdGlvbmFsCi0vLyAgIGxheWVyX25vcm1fY2VsbF9zY2FsZV9hICAgICAgLSBvcHRpb25hbAotLy8gICBsYXllcl9ub3JtX2NlbGxfc2NhbGVfYiAgICAgIC0gb3B0aW9uYWwKLS8vICAgbGF5ZXJfbm9ybV9vdXRwdXRfc2NhbGVfYSAgICAtIG9wdGlvbmFsCi0vLyAgIGxheWVyX25vcm1fb3V0cHV0X3NjYWxlX2IgICAgLSBvcHRpb25hbAotLy8KLS8vIFNjYWxhciB2YWx1ZXM6Ci0vLyAgIHF1YW50aXplZF9jZWxsX2NsaXA6IHF1YW50aXplZCBjbGlwIHZhbHVlIGZvciBjZWxsLgotLy8gICBxdWFudGl6ZWRfcHJval9jbGlwOiBxdWFudGl6ZWQgY2xpcCB2YWx1ZSBmb3IgcHJvamVjdGlvbi4KLS8vICAgY2VsbF9zdGF0ZV9zY2FsZTogdGhlIHBvd2VyIG9mIHR3byBzY2FsZSBmb3IgY2VsbCBzdGF0ZS4KLS8vCi0vLyBaZXJvIHBvaW50czoKLS8vICAgb3V0cHV0X3N0YXRlX3pwOiB6ZXJvIHBvaW50IG9mIG91dHB1dCBzdGF0ZQotLy8gICBoaWRkZW5fenA6IHplcm8gcG9pbnQgZm9yIGhpZGRlbiBzdGF0ZS4KLS8vCi0vLyBUZW1wb3JhcnkgcHJlLWFsbG9jYXRlZCBzdG9yYWdlIGZvciB0aGUgY2FsY3VsYXRpb24uIEVhY2ggaXMgb2Ygc2l6ZSBuX2NlbGwgKgotLy8gbl9iYXRjaC4KLS8vICAgc2NyYXRjaDAKLS8vICAgc2NyYXRjaDEKLS8vICAgc2NyYXRjaDIKLS8vICAgc2NyYXRjaDMKLS8vICAgc2NyYXRjaDQKLS8vICAgc2NyYXRjaDU6IHRoaXMgc2NyYXRjaCBidWZmZXIgaXMgY3JlYXRlZCBwdXJlbHkgZm9yIG9wdGltaXppbmcgdGhlCi0vLyAgICAgICAgICAgICAgTWF0cml4QmF0Y2hWZWN0b3JNdWx0aXBseUFjY3VtdWxhdGUuCi0vLwotLy8gT3V0cHV0czoKLS8vICAgb3V0cHV0X3N0YXRlX3B0ciAtIHNpemUgJ25fYmF0Y2ggKiBuX291dHB1dCcKLS8vICAgY2VsbF9zdGF0ZV9wdHIgICAtIHNpemUgJ25fYmF0Y2ggKiBuX2NlbGwnCi0vLyAgIG91dHB1dF9wdHIgICAgICAgLSBzaXplICduX2JhdGNoICogbl9vdXRwdXQnCi0vLyBUT0RPKGIvMTU5OTQ3MDIzKTogc2NyYXRjaDAgaXMgbm90IHVzZWQgaWYgKCFjaWZnKS4gRG9uJ3QgYWxsb2NhdGUgdGhlbi4KLWlubGluZSB2b2lkIExzdG1TdGVwSW50ZWdlcjh4OF8xNigKLSAgICBjb25zdCBpbnQ4X3QqIGlucHV0X3B0ciwgY29uc3QgaW50OF90KiBpbnB1dF90b19pbnB1dF93ZWlnaHRfcHRyLAotICAgIGludDMyX3QgZWZmZWN0aXZlX2lucHV0X3RvX2lucHV0X3NjYWxlX2EsCi0gICAgaW50MzJfdCBlZmZlY3RpdmVfaW5wdXRfdG9faW5wdXRfc2NhbGVfYiwKLSAgICBjb25zdCBpbnQ4X3QqIGlucHV0X3RvX2ZvcmdldF93ZWlnaHRfcHRyLAotICAgIGludDMyX3QgZWZmZWN0aXZlX2lucHV0X3RvX2ZvcmdldF9zY2FsZV9hLAotICAgIGludDMyX3QgZWZmZWN0aXZlX2lucHV0X3RvX2ZvcmdldF9zY2FsZV9iLAotICAgIGNvbnN0IGludDhfdCogaW5wdXRfdG9fY2VsbF93ZWlnaHRfcHRyLAotICAgIGludDMyX3QgZWZmZWN0aXZlX2lucHV0X3RvX2NlbGxfc2NhbGVfYSwKLSAgICBpbnQzMl90IGVmZmVjdGl2ZV9pbnB1dF90b19jZWxsX3NjYWxlX2IsCi0gICAgY29uc3QgaW50OF90KiBpbnB1dF90b19vdXRwdXRfd2VpZ2h0X3B0ciwKLSAgICBpbnQzMl90IGVmZmVjdGl2ZV9pbnB1dF90b19vdXRwdXRfc2NhbGVfYSwKLSAgICBpbnQzMl90IGVmZmVjdGl2ZV9pbnB1dF90b19vdXRwdXRfc2NhbGVfYiwKLSAgICBjb25zdCBpbnQ4X3QqIHJlY3VycmVudF90b19pbnB1dF93ZWlnaHRfcHRyLAotICAgIGludDMyX3QgZWZmZWN0aXZlX3JlY3VycmVudF90b19pbnB1dF9zY2FsZV9hLAotICAgIGludDMyX3QgZWZmZWN0aXZlX3JlY3VycmVudF90b19pbnB1dF9zY2FsZV9iLAotICAgIGNvbnN0IGludDhfdCogcmVjdXJyZW50X3RvX2ZvcmdldF93ZWlnaHRfcHRyLAotICAgIGludDMyX3QgZWZmZWN0aXZlX3JlY3VycmVudF90b19mb3JnZXRfc2NhbGVfYSwKLSAgICBpbnQzMl90IGVmZmVjdGl2ZV9yZWN1cnJlbnRfdG9fZm9yZ2V0X3NjYWxlX2IsCi0gICAgY29uc3QgaW50OF90KiByZWN1cnJlbnRfdG9fY2VsbF93ZWlnaHRfcHRyLAotICAgIGludDMyX3QgZWZmZWN0aXZlX3JlY3VycmVudF90b19jZWxsX3NjYWxlX2EsCi0gICAgaW50MzJfdCBlZmZlY3RpdmVfcmVjdXJyZW50X3RvX2NlbGxfc2NhbGVfYiwKLSAgICBjb25zdCBpbnQ4X3QqIHJlY3VycmVudF90b19vdXRwdXRfd2VpZ2h0X3B0ciwKLSAgICBpbnQzMl90IGVmZmVjdGl2ZV9yZWN1cnJlbnRfdG9fb3V0cHV0X3NjYWxlX2EsCi0gICAgaW50MzJfdCBlZmZlY3RpdmVfcmVjdXJyZW50X3RvX291dHB1dF9zY2FsZV9iLAotICAgIGNvbnN0IGludDE2X3QqIGNlbGxfdG9faW5wdXRfd2VpZ2h0X3B0ciwKLSAgICBpbnQzMl90IGVmZmVjdGl2ZV9jZWxsX3RvX2lucHV0X3NjYWxlX2EsCi0gICAgaW50MzJfdCBlZmZlY3RpdmVfY2VsbF90b19pbnB1dF9zY2FsZV9iLAotICAgIGNvbnN0IGludDE2X3QqIGNlbGxfdG9fZm9yZ2V0X3dlaWdodF9wdHIsCi0gICAgaW50MzJfdCBlZmZlY3RpdmVfY2VsbF90b19mb3JnZXRfc2NhbGVfYSwKLSAgICBpbnQzMl90IGVmZmVjdGl2ZV9jZWxsX3RvX2ZvcmdldF9zY2FsZV9iLAotICAgIGNvbnN0IGludDE2X3QqIGNlbGxfdG9fb3V0cHV0X3dlaWdodF9wdHIsCi0gICAgaW50MzJfdCBlZmZlY3RpdmVfY2VsbF90b19vdXRwdXRfc2NhbGVfYSwKLSAgICBpbnQzMl90IGVmZmVjdGl2ZV9jZWxsX3RvX291dHB1dF9zY2FsZV9iLAotICAgIGNvbnN0IGludDhfdCogcHJvamVjdGlvbl93ZWlnaHRfcHRyLCBpbnQzMl90IGVmZmVjdGl2ZV9wcm9qX3NjYWxlX2EsCi0gICAgaW50MzJfdCBlZmZlY3RpdmVfcHJval9zY2FsZV9iLCBpbnQzMl90IGhpZGRlbl96cCwKLSAgICBpbnQzMl90IGVmZmVjdGl2ZV9oaWRkZW5fc2NhbGVfYSwgaW50MzJfdCBlZmZlY3RpdmVfaGlkZGVuX3NjYWxlX2IsCi0gICAgY29uc3QgaW50MTZfdCogbGF5ZXJfbm9ybV9pbnB1dF93ZWlnaHRfcHRyLAotICAgIGludDMyX3QgbGF5ZXJfbm9ybV9pbnB1dF9zY2FsZV9hLCBpbnQzMl90IGxheWVyX25vcm1faW5wdXRfc2NhbGVfYiwKLSAgICBjb25zdCBpbnQxNl90KiBsYXllcl9ub3JtX2ZvcmdldF93ZWlnaHRfcHRyLAotICAgIGludDMyX3QgbGF5ZXJfbm9ybV9mb3JnZXRfc2NhbGVfYSwgaW50MzJfdCBsYXllcl9ub3JtX2ZvcmdldF9zY2FsZV9iLAotICAgIGNvbnN0IGludDE2X3QqIGxheWVyX25vcm1fY2VsbF93ZWlnaHRfcHRyLCBpbnQzMl90IGxheWVyX25vcm1fY2VsbF9zY2FsZV9hLAotICAgIGludDMyX3QgbGF5ZXJfbm9ybV9jZWxsX3NjYWxlX2IsCi0gICAgY29uc3QgaW50MTZfdCogbGF5ZXJfbm9ybV9vdXRwdXRfd2VpZ2h0X3B0ciwKLSAgICBpbnQzMl90IGxheWVyX25vcm1fb3V0cHV0X3NjYWxlX2EsIGludDMyX3QgbGF5ZXJfbm9ybV9vdXRwdXRfc2NhbGVfYiwKLSAgICBjb25zdCBpbnQzMl90KiBpbnB1dF9nYXRlX2JpYXNfcHRyLCBjb25zdCBpbnQzMl90KiBmb3JnZXRfZ2F0ZV9iaWFzX3B0ciwKLSAgICBjb25zdCBpbnQzMl90KiBjZWxsX2dhdGVfYmlhc19wdHIsIGNvbnN0IGludDMyX3QqIG91dHB1dF9nYXRlX2JpYXNfcHRyLAotICAgIGludDE2X3QgcXVhbnRpemVkX2NlbGxfY2xpcCwgaW50OF90IHF1YW50aXplZF9wcm9qX2NsaXAsCi0gICAgaW50MzJfdCBjZWxsX3N0YXRlX3NjYWxlLCBpbnQzMl90IGlucHV0X3ZhcmlhbmNlX2d1YXJkLAotICAgIGludDMyX3QgZm9yZ2V0X3ZhcmlhbmNlX2d1YXJkLCBpbnQzMl90IGNlbGxfdmFyaWFuY2VfZ3VhcmQsCi0gICAgaW50MzJfdCBvdXRwdXRfdmFyaWFuY2VfZ3VhcmQsCi0gICAgY29uc3QgaW50MzJfdCogaW5wdXRfdG9fZm9yZ2V0X2VmZmVjdGl2ZV9iaWFzLAotICAgIGNvbnN0IGludDMyX3QqIHJlY3VycmVudF90b19mb3JnZXRfZWZmZWN0aXZlX2JpYXMsCi0gICAgY29uc3QgaW50MzJfdCogaW5wdXRfdG9fY2VsbF9lZmZlY3RpdmVfYmlhcywKLSAgICBjb25zdCBpbnQzMl90KiByZWN1cnJlbnRfdG9fY2VsbF9lZmZlY3RpdmVfYmlhcywKLSAgICBjb25zdCBpbnQzMl90KiBpbnB1dF90b19vdXRwdXRfZWZmZWN0aXZlX2JpYXMsCi0gICAgY29uc3QgaW50MzJfdCogcmVjdXJyZW50X3RvX291dHB1dF9lZmZlY3RpdmVfYmlhcywKLSAgICBjb25zdCBpbnQzMl90KiBpbnB1dF90b19pbnB1dF9lZmZlY3RpdmVfYmlhcywKLSAgICBjb25zdCBpbnQzMl90KiByZWN1cnJlbnRfdG9faW5wdXRfZWZmZWN0aXZlX2JpYXMsCi0gICAgY29uc3QgaW50MzJfdCogcHJvamVjdGlvbl9lZmZlY3RpdmVfYmlhcywgaW50IG5fYmF0Y2gsIGludCBuX2NlbGwsCi0gICAgaW50IG5faW5wdXQsIGludCBuX291dHB1dCwgaW50OF90KiBvdXRwdXRfc3RhdGVfcHRyLAotICAgIGludDMyX3Qgb3V0cHV0X3N0YXRlX3pwLCBpbnQxNl90KiBjZWxsX3N0YXRlX3B0ciwgaW50OF90KiBvdXRwdXRfcHRyLAotICAgIGludDE2X3QqIHNjcmF0Y2gwLCBpbnQxNl90KiBzY3JhdGNoMSwgaW50MTZfdCogc2NyYXRjaDIsIGludDE2X3QqIHNjcmF0Y2gzLAotICAgIGludDhfdCogc2NyYXRjaDQsIGludDMyX3QqIHNjcmF0Y2g1KSB7Ci0gIC8vIHJ1eTo6cHJvZmlsZXI6OlNjb3BlTGFiZWwgbGFiZWwoIkxzdG1TdGVwSW50ZWdlcjh4OF8xNiIpOwotICAvLyBNYWtlIG5hbWVkIHNjcmF0Y2ggYnVmZmVycyBmb3IgdGhlIGRpZmZlcmVudCBnYXRlcy4KLSAgaW50MTZfdCogaW5wdXRfZ2F0ZV9zY3JhdGNoID0gc2NyYXRjaDA7Ci0gIGludDE2X3QqIGZvcmdldF9nYXRlX3NjcmF0Y2ggPSBzY3JhdGNoMTsKLSAgaW50MTZfdCogY2VsbF9nYXRlX3NjcmF0Y2ggPSBzY3JhdGNoMjsKLSAgaW50MTZfdCogb3V0cHV0X2dhdGVfc2NyYXRjaCA9IHNjcmF0Y2gzOwotCi0gIC8vIFNpbmNlIHdlIGhhdmUgYWxyZWFkeSBjaGVja2VkIHRoYXQgd2VpZ2h0cyBhcmUgYWxsIHRoZXJlIG9yIG5vbmUsIHdlCi0gIC8vIGNhbiBjaGVjayB0aGUgZXhpc3RlbmNlIG9mIG9ubHkgb25lIHRvIHRoZSBnZXQgdGhlIGNvbmRpdGlvbi4KLSAgY29uc3QgYm9vbCB1c2VfY2lmZyA9IChpbnB1dF90b19pbnB1dF93ZWlnaHRfcHRyID09IG51bGxwdHIpOwotCi0gIC8vIENoZWNrIGZvciBudWxscHRycy4KLSAgVEZMSVRFX0RDSEVDSyhpbnB1dF90b19mb3JnZXRfZWZmZWN0aXZlX2JpYXMpOwotICBURkxJVEVfRENIRUNLKHJlY3VycmVudF90b19mb3JnZXRfZWZmZWN0aXZlX2JpYXMpOwotICBURkxJVEVfRENIRUNLKGlucHV0X3RvX2NlbGxfZWZmZWN0aXZlX2JpYXMpOwotICBURkxJVEVfRENIRUNLKHJlY3VycmVudF90b19jZWxsX2VmZmVjdGl2ZV9iaWFzKTsKLSAgVEZMSVRFX0RDSEVDSyhpbnB1dF90b19vdXRwdXRfZWZmZWN0aXZlX2JpYXMpOwotICBURkxJVEVfRENIRUNLKHJlY3VycmVudF90b19vdXRwdXRfZWZmZWN0aXZlX2JpYXMpOwotICBpZiAoIXVzZV9jaWZnKSB7Ci0gICAgVEZMSVRFX0RDSEVDSyhpbnB1dF90b19pbnB1dF9lZmZlY3RpdmVfYmlhcyk7Ci0gICAgVEZMSVRFX0RDSEVDSyhyZWN1cnJlbnRfdG9faW5wdXRfZWZmZWN0aXZlX2JpYXMpOwotICB9Ci0gIGNvbnN0IGJvb2wgdXNlX3Byb2plY3Rpb24gPSAocHJvamVjdGlvbl93ZWlnaHRfcHRyICE9IG51bGxwdHIpOwotICBpZiAodXNlX3Byb2plY3Rpb24pIHsKLSAgICBURkxJVEVfRENIRUNLKHByb2plY3Rpb25fZWZmZWN0aXZlX2JpYXMpOwotICB9Ci0gIGlmICghdXNlX2NpZmcpIHsKLSAgICAvLyBDYWxjdWxhdGUgdGhlIGlucHV0IGdhdGUuIChJZiBub3QgQ0lGRy4pCi0gICAgQ2FsY3VsYXRlTHN0bUdhdGVJbnRlZ2VyOHg4XzE2KAotICAgICAgICBpbnB1dF9wdHIsIGlucHV0X3RvX2lucHV0X3dlaWdodF9wdHIsIGlucHV0X3RvX2lucHV0X2VmZmVjdGl2ZV9iaWFzLAotICAgICAgICBlZmZlY3RpdmVfaW5wdXRfdG9faW5wdXRfc2NhbGVfYSwgZWZmZWN0aXZlX2lucHV0X3RvX2lucHV0X3NjYWxlX2IsCi0gICAgICAgIG91dHB1dF9zdGF0ZV9wdHIsIHJlY3VycmVudF90b19pbnB1dF93ZWlnaHRfcHRyLAotICAgICAgICByZWN1cnJlbnRfdG9faW5wdXRfZWZmZWN0aXZlX2JpYXMsIGVmZmVjdGl2ZV9yZWN1cnJlbnRfdG9faW5wdXRfc2NhbGVfYSwKLSAgICAgICAgZWZmZWN0aXZlX3JlY3VycmVudF90b19pbnB1dF9zY2FsZV9iLCBjZWxsX3N0YXRlX3B0ciwKLSAgICAgICAgY2VsbF90b19pbnB1dF93ZWlnaHRfcHRyLCBlZmZlY3RpdmVfY2VsbF90b19pbnB1dF9zY2FsZV9hLAotICAgICAgICBlZmZlY3RpdmVfY2VsbF90b19pbnB1dF9zY2FsZV9iLCBsYXllcl9ub3JtX2lucHV0X3dlaWdodF9wdHIsCi0gICAgICAgIGlucHV0X2dhdGVfYmlhc19wdHIsIGxheWVyX25vcm1faW5wdXRfc2NhbGVfYSwgbGF5ZXJfbm9ybV9pbnB1dF9zY2FsZV9iLAotICAgICAgICBpbnB1dF92YXJpYW5jZV9ndWFyZCwgbl9iYXRjaCwgbl9pbnB1dCwgbl9vdXRwdXQsIG5fY2VsbCwKLSAgICAgICAga1RmTGl0ZUFjdFNpZ21vaWQsIGlucHV0X2dhdGVfc2NyYXRjaCwgc2NyYXRjaDUpOwotICB9Ci0gIC8vIENhbGN1bGF0ZSB0aGUgZm9yZ2V0IGdhdGUuCi0gIENhbGN1bGF0ZUxzdG1HYXRlSW50ZWdlcjh4OF8xNigKLSAgICAgIGlucHV0X3B0ciwgaW5wdXRfdG9fZm9yZ2V0X3dlaWdodF9wdHIsIGlucHV0X3RvX2ZvcmdldF9lZmZlY3RpdmVfYmlhcywKLSAgICAgIGVmZmVjdGl2ZV9pbnB1dF90b19mb3JnZXRfc2NhbGVfYSwgZWZmZWN0aXZlX2lucHV0X3RvX2ZvcmdldF9zY2FsZV9iLAotICAgICAgb3V0cHV0X3N0YXRlX3B0ciwgcmVjdXJyZW50X3RvX2ZvcmdldF93ZWlnaHRfcHRyLAotICAgICAgcmVjdXJyZW50X3RvX2ZvcmdldF9lZmZlY3RpdmVfYmlhcywgZWZmZWN0aXZlX3JlY3VycmVudF90b19mb3JnZXRfc2NhbGVfYSwKLSAgICAgIGVmZmVjdGl2ZV9yZWN1cnJlbnRfdG9fZm9yZ2V0X3NjYWxlX2IsIGNlbGxfc3RhdGVfcHRyLAotICAgICAgY2VsbF90b19mb3JnZXRfd2VpZ2h0X3B0ciwgZWZmZWN0aXZlX2NlbGxfdG9fZm9yZ2V0X3NjYWxlX2EsCi0gICAgICBlZmZlY3RpdmVfY2VsbF90b19mb3JnZXRfc2NhbGVfYiwgbGF5ZXJfbm9ybV9mb3JnZXRfd2VpZ2h0X3B0ciwKLSAgICAgIGZvcmdldF9nYXRlX2JpYXNfcHRyLCBsYXllcl9ub3JtX2ZvcmdldF9zY2FsZV9hLAotICAgICAgbGF5ZXJfbm9ybV9mb3JnZXRfc2NhbGVfYiwgZm9yZ2V0X3ZhcmlhbmNlX2d1YXJkLCBuX2JhdGNoLCBuX2lucHV0LAotICAgICAgbl9vdXRwdXQsIG5fY2VsbCwga1RmTGl0ZUFjdFNpZ21vaWQsIGZvcmdldF9nYXRlX3NjcmF0Y2gsIHNjcmF0Y2g1KTsKLSAgLy8gQ2FsY3VsYXRlIHRoZSBjZWxsIHVwZGF0ZSBnYXRlLgotICBDYWxjdWxhdGVMc3RtR2F0ZUludGVnZXI4eDhfMTYoCi0gICAgICBpbnB1dF9wdHIsIGlucHV0X3RvX2NlbGxfd2VpZ2h0X3B0ciwgaW5wdXRfdG9fY2VsbF9lZmZlY3RpdmVfYmlhcywKLSAgICAgIGVmZmVjdGl2ZV9pbnB1dF90b19jZWxsX3NjYWxlX2EsIGVmZmVjdGl2ZV9pbnB1dF90b19jZWxsX3NjYWxlX2IsCi0gICAgICBvdXRwdXRfc3RhdGVfcHRyLCByZWN1cnJlbnRfdG9fY2VsbF93ZWlnaHRfcHRyLAotICAgICAgcmVjdXJyZW50X3RvX2NlbGxfZWZmZWN0aXZlX2JpYXMsIGVmZmVjdGl2ZV9yZWN1cnJlbnRfdG9fY2VsbF9zY2FsZV9hLAotICAgICAgZWZmZWN0aXZlX3JlY3VycmVudF90b19jZWxsX3NjYWxlX2IsIGNlbGxfc3RhdGVfcHRyLAotICAgICAgLypjZWxsX3RvX2dhdGVfd2VpZ2h0cz0qL251bGxwdHIsIC8qY2VsbF90b19nYXRlX3NjYWxlX2E9Ki8wLAotICAgICAgLypjZWxsX3RvX2dhdGVfc2NhbGVfYj0qLzAsIGxheWVyX25vcm1fY2VsbF93ZWlnaHRfcHRyLAotICAgICAgY2VsbF9nYXRlX2JpYXNfcHRyLCBsYXllcl9ub3JtX2NlbGxfc2NhbGVfYSwgbGF5ZXJfbm9ybV9jZWxsX3NjYWxlX2IsCi0gICAgICBjZWxsX3ZhcmlhbmNlX2d1YXJkLCBuX2JhdGNoLCBuX2lucHV0LCBuX291dHB1dCwgbl9jZWxsLCBrVGZMaXRlQWN0VGFuaCwKLSAgICAgIGNlbGxfZ2F0ZV9zY3JhdGNoLCBzY3JhdGNoNSk7Ci0gIC8vIFVwZGF0ZSB0aGUgY2VsbCBzdGF0ZS4KLSAgVXBkYXRlTHN0bUNlbGxJbnRlZ2VyKG5fYmF0Y2gsIG5fY2VsbCwgY2VsbF9zdGF0ZV9wdHIsIGNlbGxfc3RhdGVfc2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9nYXRlX3NjcmF0Y2gsIGZvcmdldF9nYXRlX3NjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICBjZWxsX2dhdGVfc2NyYXRjaCwgdXNlX2NpZmcsIHF1YW50aXplZF9jZWxsX2NsaXApOwotICAvLyBDYWxjdWxhdGUgdGhlIG91dHB1dCBnYXRlLgotICBDYWxjdWxhdGVMc3RtR2F0ZUludGVnZXI4eDhfMTYoCi0gICAgICBpbnB1dF9wdHIsIGlucHV0X3RvX291dHB1dF93ZWlnaHRfcHRyLCBpbnB1dF90b19vdXRwdXRfZWZmZWN0aXZlX2JpYXMsCi0gICAgICBlZmZlY3RpdmVfaW5wdXRfdG9fb3V0cHV0X3NjYWxlX2EsIGVmZmVjdGl2ZV9pbnB1dF90b19vdXRwdXRfc2NhbGVfYiwKLSAgICAgIG91dHB1dF9zdGF0ZV9wdHIsIHJlY3VycmVudF90b19vdXRwdXRfd2VpZ2h0X3B0ciwKLSAgICAgIHJlY3VycmVudF90b19vdXRwdXRfZWZmZWN0aXZlX2JpYXMsIGVmZmVjdGl2ZV9yZWN1cnJlbnRfdG9fb3V0cHV0X3NjYWxlX2EsCi0gICAgICBlZmZlY3RpdmVfcmVjdXJyZW50X3RvX291dHB1dF9zY2FsZV9iLCBjZWxsX3N0YXRlX3B0ciwKLSAgICAgIGNlbGxfdG9fb3V0cHV0X3dlaWdodF9wdHIsIGVmZmVjdGl2ZV9jZWxsX3RvX291dHB1dF9zY2FsZV9hLAotICAgICAgZWZmZWN0aXZlX2NlbGxfdG9fb3V0cHV0X3NjYWxlX2IsIGxheWVyX25vcm1fb3V0cHV0X3dlaWdodF9wdHIsCi0gICAgICBvdXRwdXRfZ2F0ZV9iaWFzX3B0ciwgbGF5ZXJfbm9ybV9vdXRwdXRfc2NhbGVfYSwKLSAgICAgIGxheWVyX25vcm1fb3V0cHV0X3NjYWxlX2IsIG91dHB1dF92YXJpYW5jZV9ndWFyZCwgbl9iYXRjaCwgbl9pbnB1dCwKLSAgICAgIG5fb3V0cHV0LCBuX2NlbGwsIGtUZkxpdGVBY3RTaWdtb2lkLCBvdXRwdXRfZ2F0ZV9zY3JhdGNoLCBzY3JhdGNoNSk7Ci0gIC8vIFVwZGF0ZSB0aGUgb3V0cHV0IHN0YXRlLgotICBDYWxjdWxhdGVMc3RtT3V0cHV0SW50ZWdlcjh4OF8xNigKLSAgICAgIG5fYmF0Y2gsIG5fY2VsbCwgbl9vdXRwdXQsIGNlbGxfc3RhdGVfcHRyLCBjZWxsX3N0YXRlX3NjYWxlLAotICAgICAgb3V0cHV0X2dhdGVfc2NyYXRjaCwgZWZmZWN0aXZlX2hpZGRlbl9zY2FsZV9hLCBlZmZlY3RpdmVfaGlkZGVuX3NjYWxlX2IsCi0gICAgICBoaWRkZW5fenAsIHByb2plY3Rpb25fd2VpZ2h0X3B0ciwgZWZmZWN0aXZlX3Byb2pfc2NhbGVfYSwKLSAgICAgIGVmZmVjdGl2ZV9wcm9qX3NjYWxlX2IsIHByb2plY3Rpb25fZWZmZWN0aXZlX2JpYXMsIG91dHB1dF9zdGF0ZV96cCwKLSAgICAgIHF1YW50aXplZF9wcm9qX2NsaXAsIG91dHB1dF9zdGF0ZV9wdHIsIHNjcmF0Y2gwLCBzY3JhdGNoNCwgc2NyYXRjaDUpOwotICAvLyBDb3B5IG91dHB1dCBzdGF0ZSB0byB0aGUgb3V0cHV0LiBOb3RlIHRoYXQgdW5saWtlIGZsb2F0IG9yIGh5YnJpZCwgb3V0cHV0Ci0gIC8vIGlzIGFsd2F5cyBjb250aWd1b3VzLgotICBzdGQ6OmNvcHlfbihvdXRwdXRfc3RhdGVfcHRyLCBuX2JhdGNoICogbl9vdXRwdXQsIG91dHB1dF9wdHIpOwotfQotCi0vLyBGdWxseSBxdWFudGl6ZWQgbHN0bSBrZXJuZWwgZm9yIDggYml0IGdhdGUgbWF0bXVsIG91dHB1dC4KLS8vCi0vLyBJbnB1dCB0ZW5zb3Igb2Ygc2l6ZSBuX2JhdGNoICogbl9pbnB1dDoKLS8vICAgaW5wdXRfcHRyCi0vLwotLy8gTFNUTSB3ZWlnaHRzOgotLy8gUXVhbnRpemVkIGlucHV0IHdlaWdodHMgb2Ygc2l6ZSAnbl9jZWxsICogbl9pbnB1dCc6Ci0vLyAgIGlucHV0X3RvX2lucHV0X3dlaWdodF9wdHIgICAgICAgICAgICAtIG9wdGlvbmFsCi0vLyAgIGlucHV0X3RvX2ZvcmdldF93ZWlnaHRfcHRyICAgICAgICAgICAtIG9wdGlvbmFsCi0vLyAgIGlucHV0X3RvX2NlbGxfd2VpZ2h0X3B0ciAgICAgICAgICAgICAtIG9wdGlvbmFsCi0vLyAgIGlucHV0X3RvX291dHB1dF93ZWlnaHRfcHRyICAgICAgICAgICAtIG9wdGlvbmFsCi0vLwotLy8gUXVhbnRpemVkIHJlY3VycmVudCB3ZWlnaHRzIG9mIHNpemUgJ25fY2VsbCAqIG5fb3V0cHV0JzoKLS8vICAgcmVjdXJyZW50X3RvX2lucHV0X3dlaWdodF9wdHIgICAgICAgIC0gb3B0aW9uYWwKLS8vICAgcmVjdXJyZW50X3RvX2ZvcmdldF93ZWlnaHRzX3B0cgotLy8gICByZWN1cnJlbnRfdG9fY2VsbF93ZWlnaHRzX3B0cgotLy8gICByZWN1cnJlbnRfdG9faW5wdXRfd2VpZ2h0c19wdHIKLS8vCi0vLyBRdWFudGl6ZWQgcGVlcGhvbGUgd2VpZ2h0cyBvZiBzaXplICduX2NlbGwnLCByZXByZXNlbnRpbmcgZGlhZ29uYWwgbWF0cmljZXMuCi0vLyAgIGNlbGxfdG9faW5wdXRfd2VpZ2h0cyAgICAgICAgICAgICAgIC0gb3B0aW9uYWwKLS8vICAgY2VsbF90b19jZWxsX3dlaWdodHMgICAgICAgICAgICAgICAgLSBvcHRpb25hbAotLy8gICBjZWxsX3RvX291dHB1dF93ZWlnaHRzICAgICAgICAgICAgICAtIG9wdGlvbmFsCi0vLwotLy8gUXVhbnRpemVkIHByb2plY3Rpb24gd2VpZ2h0cyBvZiBzaXplICduX291dHB1dCAqIG5fY2VsbCcKLS8vICAgcHJvamVjdGlvbl93ZWlnaHRfcHRyICAgICAgICAgICAgICAgICAgICAgLSBvcHRpb25hbAotLy8KLS8vIFdlaWdodCBzY2FsZXMgKHNjYWxhcnMpIGZvciBlYWNoIG9mIHRoZSB3ZWlnaHRzIGFib3ZlLgotLy8gICBlZmZlY3RpdmVfaW5wdXRfdG9faW5wdXRfc2NhbGVfYSAgICAtIG9wdGlvbmFsCi0vLyAgIGVmZmVjdGl2ZV9pbnB1dF90b19pbnB1dF9zY2FsZV9iICAgIC0gb3B0aW9uYWwKLS8vICAgZWZmZWN0aXZlX2lucHV0X3RvX2ZvcmdldF9zY2FsZV9hCi0vLyAgIGVmZmVjdGl2ZV9pbnB1dF90b19mb3JnZXRfc2NhbGVfYgotLy8gICBlZmZlY3RpdmVfaW5wdXRfdG9fY2VsbF9zY2FsZV9hCi0vLyAgIGVmZmVjdGl2ZV9pbnB1dF90b19jZWxsX3NjYWxlX2IKLS8vICAgZWZmZWN0aXZlX2lucHV0X3RvX291dHB1dF9zY2FsZV9hCi0vLyAgIGVmZmVjdGl2ZV9pbnB1dF90b19vdXRwdXRfc2NhbGVfYgotLy8gICBlZmZlY3RpdmVfcmVjdXJyZW50X3RvX2lucHV0X3NjYWxlX2EgICAgLSBvcHRpb25hbAotLy8gICBlZmZlY3RpdmVfcmVjdXJyZW50X3RvX2lucHV0X3NjYWxlX2IgICAgLSBvcHRpb25hbAotLy8gICBlZmZlY3RpdmVfcmVjdXJyZW50X3RvX2ZvcmdldF9zY2FsZV9hCi0vLyAgIGVmZmVjdGl2ZV9yZWN1cnJlbnRfdG9fZm9yZ2V0X3NjYWxlX2IKLS8vICAgZWZmZWN0aXZlX3JlY3VycmVudF90b19jZWxsX3NjYWxlX2EKLS8vICAgZWZmZWN0aXZlX3JlY3VycmVudF90b19jZWxsX3NjYWxlX2IKLS8vICAgZWZmZWN0aXZlX3JlY3VycmVudF90b19vdXRwdXRfc2NhbGVfYQotLy8gICBlZmZlY3RpdmVfcmVjdXJyZW50X3RvX291dHB1dF9zY2FsZV9iCi0vLyAgIGVmZmVjdGl2ZV9wcm9qX3NjYWxlX2EgICAgICAgICAgICAgICAgICAtIG9wdGlvbmFsCi0vLyAgIGVmZmVjdGl2ZV9wcm9qX3NjYWxlX2IgICAgICAgICAgICAgICAgICAtIG9wdGlvbmFsCi0vLwotLy8gR2F0ZSBiaWFzZXMgb2Ygc2l6ZSAnbl9jZWxsJzoKLS8vICAgaW5wdXRfZ2F0ZV9iaWFzX3B0ciAgICAgICAgICAgICAgICAgLSBvcHRpb25hbAotLy8gICBmb3JnZXRfZ2F0ZV9iaWFzX3B0cgotLy8gICBjZWxsX2dhdGVfYmlhc19wdHIKLS8vICAgb3V0cHV0X2dhdGVfYmlhc19wdHIKLS8vCi0vLyBMYXllciBub3JtIGNvZWZmaWNpZW50cyBvZiBzaXplICduX2NlbGwnLCByZXByZXNlbnRpbmcgZGlhZ29uYWwgbWF0cmljZXMuCi0vLyAgIGxheWVyX25vcm1faW5wdXRfd2VpZ2h0X3B0ciAgICAtIG9wdGlvbmFsCi0vLyAgIGxheWVyX25vcm1fZm9yZ2V0X3dlaWdodF9wdHIgICAtIG9wdGlvbmFsCi0vLyAgIGxheWVyX25vcm1fY2VsbF93ZWlnaHRfcHRyICAgICAtIG9wdGlvbmFsCi0vLyAgIGxheWVyX25vcm1fb3V0cHV0X3dlaWdodF9wdHIgICAtIG9wdGlvbmFsCi0vLwotLy8gTGF5ZXIgbm9ybSBzY2FsZXMgb2Ygc2l6ZSAnbl9jZWxsJy4KLS8vICAgbGF5ZXJfbm9ybV9pbnB1dF9zY2FsZV9hICAgICAtIG9wdGlvbmFsCi0vLyAgIGxheWVyX25vcm1faW5wdXRfc2NhbGVfYiAgICAgLSBvcHRpb25hbAotLy8gICBsYXllcl9ub3JtX2ZvcmdldF9zY2FsZV9hICAgIC0gb3B0aW9uYWwKLS8vICAgbGF5ZXJfbm9ybV9mb3JnZXRfc2NhbGVfYiAgICAtIG9wdGlvbmFsCi0vLyAgIGxheWVyX25vcm1fY2VsbF9zY2FsZV9hICAgICAgLSBvcHRpb25hbAotLy8gICBsYXllcl9ub3JtX2NlbGxfc2NhbGVfYiAgICAgIC0gb3B0aW9uYWwKLS8vICAgbGF5ZXJfbm9ybV9vdXRwdXRfc2NhbGVfYSAgICAtIG9wdGlvbmFsCi0vLyAgIGxheWVyX25vcm1fb3V0cHV0X3NjYWxlX2IgICAgLSBvcHRpb25hbAotLy8KLS8vIFNjYWxhciB2YWx1ZXM6Ci0vLyAgIHF1YW50aXplZF9jZWxsX2NsaXA6IHF1YW50aXplZCBjbGlwIHZhbHVlIGZvciBjZWxsLgotLy8gICBxdWFudGl6ZWRfcHJval9jbGlwOiBxdWFudGl6ZWQgY2xpcCB2YWx1ZSBmb3IgcHJvamVjdGlvbi4KLS8vICAgY2VsbF9zdGF0ZV9zY2FsZTogdGhlIHBvd2VyIG9mIHR3byBzY2FsZSBmb3IgY2VsbCBzdGF0ZS4KLS8vCi0vLyBaZXJvIHBvaW50czoKLS8vICAgb3V0cHV0X3N0YXRlX3pwOiB6ZXJvIHBvaW50IG9mIG91dHB1dCBzdGF0ZS4KLS8vICAgaGlkZGVuX3pwOiB6ZXJvIHBvaW50IGZvciBoaWRkZW4gc3RhdGUuCi0vLwotLy8gVGVtcG9yYXJ5IHByZS1hbGxvY2F0ZWQgc3RvcmFnZSBmb3IgdGhlIGNhbGN1bGF0aW9uLiBFYWNoIGlzIG9mIHNpemUgbl9jZWxsICoKLS8vIG5fYmF0Y2guCi0vLyAgIHNjcmF0Y2gwCi0vLyAgIHNjcmF0Y2gxCi0vLyAgIHNjcmF0Y2gyCi0vLyAgIHNjcmF0Y2gzCi0vLyAgIHNjcmF0Y2g0Ci0vLyAgIHNjcmF0Y2g1Ci0vLyAgIHNjcmF0Y2g2Ci0vLyAgIHNjcmF0Y2g3Ci0vLwotLy8gT3V0cHV0czoKLS8vICAgb3V0cHV0X3N0YXRlX3B0ciAtIHNpemUgJ25fYmF0Y2ggKiBuX291dHB1dCcKLS8vICAgY2VsbF9zdGF0ZV9wdHIgICAtIHNpemUgJ25fYmF0Y2ggKiBuX2NlbGwnCi0vLyAgIG91dHB1dF9wdHIgICAgICAgLSBzaXplICduX2JhdGNoICogbl9vdXRwdXQnCi0vLyBUT0RPKGIvMTQ4Njg4Njk4KTogTW92ZSB6ZXJvIHBvaW50IGNhbGN1bGF0aW9uIGludG8gUHJlcGFyZSgpLgotLy8gVE9ETyhiLzE1OTk0NzAyMyk6IHNjcmF0Y2g1IGlzIHVudXNlZCwgcmVtb3ZlLgotaW5saW5lIHZvaWQgTHN0bVN0ZXBJbnRlZ2VyOHg4XzgoCi0gICAgY29uc3QgaW50OF90KiBpbnB1dF9wdHIsIGludDMyX3QgaW5wdXRfenAsCi0gICAgY29uc3QgaW50OF90KiBpbnB1dF90b19pbnB1dF93ZWlnaHRfcHRyLAotICAgIGludDMyX3QgZWZmZWN0aXZlX2lucHV0X3RvX2lucHV0X3NjYWxlX2EsCi0gICAgaW50MzJfdCBlZmZlY3RpdmVfaW5wdXRfdG9faW5wdXRfc2NhbGVfYiwKLSAgICBjb25zdCBpbnQ4X3QqIGlucHV0X3RvX2ZvcmdldF93ZWlnaHRfcHRyLAotICAgIGludDMyX3QgZWZmZWN0aXZlX2lucHV0X3RvX2ZvcmdldF9zY2FsZV9hLAotICAgIGludDMyX3QgZWZmZWN0aXZlX2lucHV0X3RvX2ZvcmdldF9zY2FsZV9iLAotICAgIGNvbnN0IGludDhfdCogaW5wdXRfdG9fY2VsbF93ZWlnaHRfcHRyLAotICAgIGludDMyX3QgZWZmZWN0aXZlX2lucHV0X3RvX2NlbGxfc2NhbGVfYSwKLSAgICBpbnQzMl90IGVmZmVjdGl2ZV9pbnB1dF90b19jZWxsX3NjYWxlX2IsCi0gICAgY29uc3QgaW50OF90KiBpbnB1dF90b19vdXRwdXRfd2VpZ2h0X3B0ciwKLSAgICBpbnQzMl90IGVmZmVjdGl2ZV9pbnB1dF90b19vdXRwdXRfc2NhbGVfYSwKLSAgICBpbnQzMl90IGVmZmVjdGl2ZV9pbnB1dF90b19vdXRwdXRfc2NhbGVfYiwKLSAgICBjb25zdCBpbnQ4X3QqIHJlY3VycmVudF90b19pbnB1dF93ZWlnaHRfcHRyLAotICAgIGludDMyX3QgZWZmZWN0aXZlX3JlY3VycmVudF90b19pbnB1dF9zY2FsZV9hLAotICAgIGludDMyX3QgZWZmZWN0aXZlX3JlY3VycmVudF90b19pbnB1dF9zY2FsZV9iLAotICAgIGNvbnN0IGludDhfdCogcmVjdXJyZW50X3RvX2ZvcmdldF93ZWlnaHRfcHRyLAotICAgIGludDMyX3QgZWZmZWN0aXZlX3JlY3VycmVudF90b19mb3JnZXRfc2NhbGVfYSwKLSAgICBpbnQzMl90IGVmZmVjdGl2ZV9yZWN1cnJlbnRfdG9fZm9yZ2V0X3NjYWxlX2IsCi0gICAgY29uc3QgaW50OF90KiByZWN1cnJlbnRfdG9fY2VsbF93ZWlnaHRfcHRyLAotICAgIGludDMyX3QgZWZmZWN0aXZlX3JlY3VycmVudF90b19jZWxsX3NjYWxlX2EsCi0gICAgaW50MzJfdCBlZmZlY3RpdmVfcmVjdXJyZW50X3RvX2NlbGxfc2NhbGVfYiwKLSAgICBjb25zdCBpbnQ4X3QqIHJlY3VycmVudF90b19vdXRwdXRfd2VpZ2h0X3B0ciwKLSAgICBpbnQzMl90IGVmZmVjdGl2ZV9yZWN1cnJlbnRfdG9fb3V0cHV0X3NjYWxlX2EsCi0gICAgaW50MzJfdCBlZmZlY3RpdmVfcmVjdXJyZW50X3RvX291dHB1dF9zY2FsZV9iLAotICAgIGNvbnN0IGludDhfdCogY2VsbF90b19pbnB1dF93ZWlnaHRfcHRyLAotICAgIGludDMyX3QgZWZmZWN0aXZlX2NlbGxfdG9faW5wdXRfc2NhbGVfYSwKLSAgICBpbnQzMl90IGVmZmVjdGl2ZV9jZWxsX3RvX2lucHV0X3NjYWxlX2IsCi0gICAgY29uc3QgaW50OF90KiBjZWxsX3RvX2ZvcmdldF93ZWlnaHRfcHRyLAotICAgIGludDMyX3QgZWZmZWN0aXZlX2NlbGxfdG9fZm9yZ2V0X3NjYWxlX2EsCi0gICAgaW50MzJfdCBlZmZlY3RpdmVfY2VsbF90b19mb3JnZXRfc2NhbGVfYiwKLSAgICBjb25zdCBpbnQ4X3QqIGNlbGxfdG9fb3V0cHV0X3dlaWdodF9wdHIsCi0gICAgaW50MzJfdCBlZmZlY3RpdmVfY2VsbF90b19vdXRwdXRfc2NhbGVfYSwKLSAgICBpbnQzMl90IGVmZmVjdGl2ZV9jZWxsX3RvX291dHB1dF9zY2FsZV9iLAotICAgIGNvbnN0IGludDhfdCogcHJvamVjdGlvbl93ZWlnaHRfcHRyLCBpbnQzMl90IGVmZmVjdGl2ZV9wcm9qX3NjYWxlX2EsCi0gICAgaW50MzJfdCBlZmZlY3RpdmVfcHJval9zY2FsZV9iLCBjb25zdCBpbnQxNl90KiBsYXllcl9ub3JtX2lucHV0X3dlaWdodF9wdHIsCi0gICAgaW50MzJfdCBsYXllcl9ub3JtX2lucHV0X3NjYWxlX2EsIGludDMyX3QgbGF5ZXJfbm9ybV9pbnB1dF9zY2FsZV9iLAotICAgIGNvbnN0IGludDE2X3QqIGxheWVyX25vcm1fZm9yZ2V0X3dlaWdodF9wdHIsCi0gICAgaW50MzJfdCBsYXllcl9ub3JtX2ZvcmdldF9zY2FsZV9hLCBpbnQzMl90IGxheWVyX25vcm1fZm9yZ2V0X3NjYWxlX2IsCi0gICAgY29uc3QgaW50MTZfdCogbGF5ZXJfbm9ybV9jZWxsX3dlaWdodF9wdHIsIGludDMyX3QgbGF5ZXJfbm9ybV9jZWxsX3NjYWxlX2EsCi0gICAgaW50MzJfdCBsYXllcl9ub3JtX2NlbGxfc2NhbGVfYiwKLSAgICBjb25zdCBpbnQxNl90KiBsYXllcl9ub3JtX291dHB1dF93ZWlnaHRfcHRyLAotICAgIGludDMyX3QgbGF5ZXJfbm9ybV9vdXRwdXRfc2NhbGVfYSwgaW50MzJfdCBsYXllcl9ub3JtX291dHB1dF9zY2FsZV9iLAotICAgIGNvbnN0IGludDMyX3QqIGlucHV0X2dhdGVfYmlhc19wdHIsIGNvbnN0IGludDMyX3QqIGZvcmdldF9nYXRlX2JpYXNfcHRyLAotICAgIGNvbnN0IGludDMyX3QqIGNlbGxfZ2F0ZV9iaWFzX3B0ciwgY29uc3QgaW50MzJfdCogb3V0cHV0X2dhdGVfYmlhc19wdHIsCi0gICAgY29uc3QgaW50MzJfdCogcHJvamVjdGlvbl9iaWFzX3B0ciwgY29uc3QgVGZMaXRlTFNUTVBhcmFtcyogcGFyYW1zLAotICAgIGNvbnN0IGludDMyX3QqIGludGVybWVkaWF0ZV9zY2FsZV9hLCBjb25zdCBpbnQzMl90KiBpbnRlcm1lZGlhdGVfc2NhbGVfYiwKLSAgICBjb25zdCBpbnQzMl90KiBpbnRlcm1lZGlhdGVfenAsIGludDE2X3QgcXVhbnRpemVkX2NlbGxfY2xpcCwKLSAgICBpbnQ4X3QgcXVhbnRpemVkX3Byb2pfY2xpcCwgaW50IG5fYmF0Y2gsIGludCBuX2NlbGwsIGludCBuX2lucHV0LAotICAgIGludCBuX291dHB1dCwgaW50IG91dHB1dF9iYXRjaF9sZWFkaW5nX2RpbSwgaW50OF90KiBvdXRwdXRfc3RhdGVfcHRyLAotICAgIGludDMyX3Qgb3V0cHV0X3N0YXRlX3pwLCBpbnQxNl90KiBjZWxsX3N0YXRlX3B0ciwgaW50OF90KiBvdXRwdXRfcHRyLAotICAgIGludDhfdCogc2NyYXRjaDAsIGludDhfdCogc2NyYXRjaDEsIGludDE2X3QqIHNjcmF0Y2gyLCBpbnQxNl90KiBzY3JhdGNoMywKLSAgICBpbnQxNl90KiBzY3JhdGNoNCwgaW50MTZfdCogc2NyYXRjaDUsIGludDE2X3QqIHNjcmF0Y2g2LAotICAgIGludDE2X3QqIHNjcmF0Y2g3KSB7Ci0gIC8vIFRPRE8oYi8xNTkwNjYxMTMpOiBzY3JhdGNoNSBpcyB1bnVzZWQsIHJlbW92ZS4KLQotICAvLyBydXk6OnByb2ZpbGVyOjpTY29wZUxhYmVsIGxhYmVsKCJMc3RtU3RlcEludGVnZXI4eDhfOCIpOwotICAvLyBNYWtlIG5hbWVkIHNjcmF0Y2ggYnVmZmVycyBmb3IgdGhlIGRpZmZlcmVudCBnYXRlcy4KLSAgaW50MTZfdCogZm9yZ2V0X2dhdGVfc2NyYXRjaCA9IHNjcmF0Y2gyOwotICBpbnQxNl90KiBjZWxsX2dhdGVfc2NyYXRjaCA9IHNjcmF0Y2gzOwotICBpbnQxNl90KiBvdXRwdXRfZ2F0ZV9zY3JhdGNoID0gc2NyYXRjaDQ7Ci0gIC8vIG5vLUNJRkcgaXMgbm90IHN1cHBvcnRlZCBoZXJlCi0KLSAgLy8gQ2FsY3VsYXRlIHRoZSBmb3JnZXQgZ2F0ZS4KLSAgQ2FsY3VsYXRlTHN0bUdhdGVJbnRlZ2VyOHg4XzgoCi0gICAgICBpbnB1dF9wdHIsIGlucHV0X3pwLCBpbnB1dF90b19mb3JnZXRfd2VpZ2h0X3B0ciwKLSAgICAgIGVmZmVjdGl2ZV9pbnB1dF90b19mb3JnZXRfc2NhbGVfYSwgZWZmZWN0aXZlX2lucHV0X3RvX2ZvcmdldF9zY2FsZV9iLAotICAgICAgaW50ZXJtZWRpYXRlX3NjYWxlX2FbMl0sIGludGVybWVkaWF0ZV9zY2FsZV9iWzJdLCBpbnRlcm1lZGlhdGVfenBbNF0sCi0gICAgICBvdXRwdXRfc3RhdGVfcHRyLCBvdXRwdXRfc3RhdGVfenAsIHJlY3VycmVudF90b19mb3JnZXRfd2VpZ2h0X3B0ciwKLSAgICAgIGVmZmVjdGl2ZV9yZWN1cnJlbnRfdG9fZm9yZ2V0X3NjYWxlX2EsCi0gICAgICBlZmZlY3RpdmVfcmVjdXJyZW50X3RvX2ZvcmdldF9zY2FsZV9iLCBpbnRlcm1lZGlhdGVfc2NhbGVfYVszXSwKLSAgICAgIGludGVybWVkaWF0ZV9zY2FsZV9iWzNdLCBpbnRlcm1lZGlhdGVfenBbNV0sIGxheWVyX25vcm1fZm9yZ2V0X3dlaWdodF9wdHIsCi0gICAgICBsYXllcl9ub3JtX2ZvcmdldF9zY2FsZV9hLCBsYXllcl9ub3JtX2ZvcmdldF9zY2FsZV9iLAotICAgICAgZm9yZ2V0X2dhdGVfYmlhc19wdHIsIG5fYmF0Y2gsIG5faW5wdXQsIG5fb3V0cHV0LCBuX2NlbGwsCi0gICAgICBrVGZMaXRlQWN0U2lnbW9pZCwgZm9yZ2V0X2dhdGVfc2NyYXRjaCwgc2NyYXRjaDAsIHNjcmF0Y2gxKTsKLSAgLy8gQ2FsY3VsYXRlIHRoZSBjZWxsIHVwZGF0ZSBnYXRlLgotICBDYWxjdWxhdGVMc3RtR2F0ZUludGVnZXI4eDhfOCgKLSAgICAgIGlucHV0X3B0ciwgaW5wdXRfenAsIGlucHV0X3RvX2NlbGxfd2VpZ2h0X3B0ciwKLSAgICAgIGVmZmVjdGl2ZV9pbnB1dF90b19jZWxsX3NjYWxlX2EsIGVmZmVjdGl2ZV9pbnB1dF90b19jZWxsX3NjYWxlX2IsCi0gICAgICBpbnRlcm1lZGlhdGVfc2NhbGVfYVs0XSwgaW50ZXJtZWRpYXRlX3NjYWxlX2JbNF0sIGludGVybWVkaWF0ZV96cFs3XSwKLSAgICAgIG91dHB1dF9zdGF0ZV9wdHIsIG91dHB1dF9zdGF0ZV96cCwgcmVjdXJyZW50X3RvX2NlbGxfd2VpZ2h0X3B0ciwKLSAgICAgIGVmZmVjdGl2ZV9yZWN1cnJlbnRfdG9fY2VsbF9zY2FsZV9hLCBlZmZlY3RpdmVfcmVjdXJyZW50X3RvX2NlbGxfc2NhbGVfYiwKLSAgICAgIGludGVybWVkaWF0ZV9zY2FsZV9hWzVdLCBpbnRlcm1lZGlhdGVfc2NhbGVfYls1XSwgaW50ZXJtZWRpYXRlX3pwWzhdLAotICAgICAgbGF5ZXJfbm9ybV9jZWxsX3dlaWdodF9wdHIsIGxheWVyX25vcm1fY2VsbF9zY2FsZV9hLAotICAgICAgbGF5ZXJfbm9ybV9jZWxsX3NjYWxlX2IsIGNlbGxfZ2F0ZV9iaWFzX3B0ciwgbl9iYXRjaCwgbl9pbnB1dCwgbl9vdXRwdXQsCi0gICAgICBuX2NlbGwsIGtUZkxpdGVBY3RUYW5oLCBjZWxsX2dhdGVfc2NyYXRjaCwgc2NyYXRjaDAsIHNjcmF0Y2gxKTsKLSAgLy8gVXBkYXRlIHRoZSBjZWxsIHN0YXRlLgotICBVcGRhdGVMc3RtQ2VsbEludGVnZXIobl9iYXRjaCwgbl9jZWxsLCBjZWxsX3N0YXRlX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qY2VsbF9zdGF0ZV9zY2FsZT0qLy0xNSwgLyppbnB1dF9nYXRlPSovbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcmdldF9nYXRlX3NjcmF0Y2gsIGNlbGxfZ2F0ZV9zY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgLyp1c2VfY2lmZz0qL3RydWUsIHF1YW50aXplZF9jZWxsX2NsaXApOwotICAvLyBDYWxjdWxhdGUgdGhlIG91dHB1dCBnYXRlLgotICBDYWxjdWxhdGVMc3RtR2F0ZUludGVnZXI4eDhfOCgKLSAgICAgIGlucHV0X3B0ciwgaW5wdXRfenAsIGlucHV0X3RvX291dHB1dF93ZWlnaHRfcHRyLAotICAgICAgZWZmZWN0aXZlX2lucHV0X3RvX291dHB1dF9zY2FsZV9hLCBlZmZlY3RpdmVfaW5wdXRfdG9fb3V0cHV0X3NjYWxlX2IsCi0gICAgICBpbnRlcm1lZGlhdGVfc2NhbGVfYVs2XSwgaW50ZXJtZWRpYXRlX3NjYWxlX2JbNl0sIGludGVybWVkaWF0ZV96cFsxMF0sCi0gICAgICBvdXRwdXRfc3RhdGVfcHRyLCBvdXRwdXRfc3RhdGVfenAsIHJlY3VycmVudF90b19vdXRwdXRfd2VpZ2h0X3B0ciwKLSAgICAgIGVmZmVjdGl2ZV9yZWN1cnJlbnRfdG9fb3V0cHV0X3NjYWxlX2EsCi0gICAgICBlZmZlY3RpdmVfcmVjdXJyZW50X3RvX291dHB1dF9zY2FsZV9iLCBpbnRlcm1lZGlhdGVfc2NhbGVfYVsxMV0sCi0gICAgICBpbnRlcm1lZGlhdGVfc2NhbGVfYls3XSwgaW50ZXJtZWRpYXRlX3pwWzddLCBsYXllcl9ub3JtX291dHB1dF93ZWlnaHRfcHRyLAotICAgICAgbGF5ZXJfbm9ybV9vdXRwdXRfc2NhbGVfYSwgbGF5ZXJfbm9ybV9vdXRwdXRfc2NhbGVfYiwKLSAgICAgIG91dHB1dF9nYXRlX2JpYXNfcHRyLCBuX2JhdGNoLCBuX2lucHV0LCBuX291dHB1dCwgbl9jZWxsLAotICAgICAga1RmTGl0ZUFjdFNpZ21vaWQsIG91dHB1dF9nYXRlX3NjcmF0Y2gsIHNjcmF0Y2gwLCBzY3JhdGNoMSk7Ci0gIC8vIFVwZGF0ZSB0aGUgb3V0cHV0IHN0YXRlLgotICBDYWxjdWxhdGVMc3RtT3V0cHV0SW50ZWdlcjh4OF84KAotICAgICAgbl9iYXRjaCwgbl9jZWxsLCBuX291dHB1dCwgY2VsbF9zdGF0ZV9wdHIsIG91dHB1dF9nYXRlX3NjcmF0Y2gsCi0gICAgICBwcm9qZWN0aW9uX3dlaWdodF9wdHIsIGVmZmVjdGl2ZV9wcm9qX3NjYWxlX2EsIGVmZmVjdGl2ZV9wcm9qX3NjYWxlX2IsCi0gICAgICBwcm9qZWN0aW9uX2JpYXNfcHRyLCBvdXRwdXRfc3RhdGVfenAsIHF1YW50aXplZF9wcm9qX2NsaXAsCi0gICAgICBvdXRwdXRfc3RhdGVfcHRyLCBzY3JhdGNoMik7Ci0gIC8vIENvcHkgb3V0cHV0IHN0YXRlIHRvIHRoZSBvdXRwdXQuIE5vdGUgdGhhdCB1bmxpa2UgZmxvYXQgb3IgaHlicmlkLCBvdXRwdXQKLSAgLy8gaXMgYWx3YXlzIGNvbnRpZ3VvdXMuCi0gIHN0ZDo6Y29weV9uKG91dHB1dF9zdGF0ZV9wdHIsIG5fYmF0Y2ggKiBuX291dHB1dCwgb3V0cHV0X3B0cik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBMSU5ULlRoZW5DaGFuZ2UoLy90ZW5zb3JmbG93L2xpdGUvdG9vbHMvb3B0aW1pemUvY2FsaWJyYXRpb24vYnVpbHRpbl9sb2dnaW5nX29wcy9sc3RtLmNjKQotVGZMaXRlU3RhdHVzIEV2YWxJbnRlZ2VyOHg4XzE2KAotICAgIFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUsIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0LAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0X3RvX2lucHV0X3dlaWdodHMsCi0gICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXRfdG9fZm9yZ2V0X3dlaWdodHMsCi0gICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXRfdG9fY2VsbF93ZWlnaHRzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0X3RvX291dHB1dF93ZWlnaHRzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIHJlY3VycmVudF90b19pbnB1dF93ZWlnaHRzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIHJlY3VycmVudF90b19mb3JnZXRfd2VpZ2h0cywKLSAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiByZWN1cnJlbnRfdG9fY2VsbF93ZWlnaHRzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIHJlY3VycmVudF90b19vdXRwdXRfd2VpZ2h0cywKLSAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBjZWxsX3RvX2lucHV0X3dlaWdodHMsCi0gICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogY2VsbF90b19mb3JnZXRfd2VpZ2h0cywKLSAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBjZWxsX3RvX291dHB1dF93ZWlnaHRzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0X2xheWVyX25vcm1fY29lZmZpY2llbnRzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGZvcmdldF9sYXllcl9ub3JtX2NvZWZmaWNpZW50cywKLSAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBjZWxsX2xheWVyX25vcm1fY29lZmZpY2llbnRzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dF9sYXllcl9ub3JtX2NvZWZmaWNpZW50cywKLSAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dF9nYXRlX2JpYXMsCi0gICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogZm9yZ2V0X2dhdGVfYmlhcywKLSAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBjZWxsX2dhdGVfYmlhcywKLSAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBvdXRwdXRfZ2F0ZV9iaWFzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIHByb2plY3Rpb25fd2VpZ2h0cywKLSAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBwcm9qZWN0aW9uX2JpYXMsIGNvbnN0IFRmTGl0ZUxTVE1QYXJhbXMqIHBhcmFtcywKLSAgICBib29sIGZvcndhcmRfc2VxdWVuY2UsIGJvb2wgdGltZV9tYWpvciwKLSAgICBjb25zdCBsc3RtX2V2YWw6OkludGVnZXJMc3RtUGFyYW1ldGVyKiBpbnRlZ2VyX2xzdG1fcGFyYW0sCi0gICAgVGZMaXRlRXZhbFRlbnNvciogb3V0cHV0X3N0YXRlLCBUZkxpdGVFdmFsVGVuc29yKiBjZWxsX3N0YXRlLAotICAgIFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dCwgVGZMaXRlRXZhbFRlbnNvciogc2NyYXRjaDAsCi0gICAgVGZMaXRlRXZhbFRlbnNvciogc2NyYXRjaDEsIFRmTGl0ZUV2YWxUZW5zb3IqIHNjcmF0Y2gyLAotICAgIFRmTGl0ZUV2YWxUZW5zb3IqIHNjcmF0Y2gzLCBUZkxpdGVFdmFsVGVuc29yKiBzY3JhdGNoNCwKLSAgICBUZkxpdGVFdmFsVGVuc29yKiBzY3JhdGNoNSkgewotICBURkxJVEVfRENIRUNLKGlucHV0LT5kaW1zLT5zaXplID49IDIgJiYgaW5wdXQtPmRpbXMtPnNpemUgPD0gMyk7Ci0gIGNvbnN0IGludCBuX2lucHV0ID0gaW5wdXQtPmRpbXMtPmRhdGFbaW5wdXQtPmRpbXMtPnNpemUgLSAxXTsKLSAgaW50IG1heF90aW1lLCBuX2JhdGNoOwotICBpZiAoaW5wdXQtPmRpbXMtPnNpemUgPT0gMikgewotICAgIG1heF90aW1lID0gMTsKLSAgICBuX2JhdGNoID0gaW5wdXQtPmRpbXMtPmRhdGFbMF07Ci0gIH0gZWxzZSB7Ci0gICAgbWF4X3RpbWUgPSAodGltZV9tYWpvcikgPyBpbnB1dC0+ZGltcy0+ZGF0YVswXSA6IGlucHV0LT5kaW1zLT5kYXRhWzFdOwotICAgIG5fYmF0Y2ggPSAodGltZV9tYWpvcikgPyBpbnB1dC0+ZGltcy0+ZGF0YVsxXSA6IGlucHV0LT5kaW1zLT5kYXRhWzBdOwotICB9Ci0KLSAgLy8gbl9jZWxsIGFuZCBuX291dHB1dCB3aWxsIGJlIHRoZSBzYW1lIHNpemUgd2hlbiB0aGVyZSBpcyBubyBwcm9qZWN0aW9uLgotICBjb25zdCBpbnQgbl9jZWxsID0gaW5wdXRfdG9fb3V0cHV0X3dlaWdodHMtPmRpbXMtPmRhdGFbMF07Ci0gIGNvbnN0IGludCBuX291dHB1dCA9IHJlY3VycmVudF90b19vdXRwdXRfd2VpZ2h0cy0+ZGltcy0+ZGF0YVsxXTsKLQotICAvLyBBY3RpdmF0aW9uIHplcm8gcG9pbnQKLSAgLy8gIFRPRE9AaXMgZGF0YS5vdXRwdXRfemVyb19wb2ludCBlcXVhbCB0byBvdXRwdXRfc3RhdGUtPnBhcmFtcy56ZXJvX3BvaW50Ci0gIC8vIGludCBvdXRwdXRfc3RhdGVfenAgPSBvdXRwdXRfc3RhdGUtPnBhcmFtcy56ZXJvX3BvaW50OwotICBpbnQgb3V0cHV0X3N0YXRlX3pwID0gMDsKLQotICAvLyBHZXQgcGFyYW1zIGZvciB0aW1lL2JhdGNoL3NlcXVlbmNlLgotICBjb25zdCBpbnQgb3V0cHV0X2JhdGNoX2xlYWRpbmdfZGltID0KLSAgICAgIG91dHB1dC0+ZGltcy0+ZGF0YVtvdXRwdXQtPmRpbXMtPnNpemUgLSAxXTsKLQotICBpZiAodGltZV9tYWpvcikgewotICAgIGNvbnN0IGludCBpbnB1dF9zdGVwID0gbl9iYXRjaCAqIG5faW5wdXQ7Ci0gICAgY29uc3QgaW50IG91dHB1dF9zdGVwID0gbl9iYXRjaCAqIG91dHB1dF9iYXRjaF9sZWFkaW5nX2RpbTsKLSAgICBmb3IgKGludCB0ID0gMDsgdCA8IG1heF90aW1lOyB0KyspIHsKLSAgICAgIGNvbnN0IGludCB0X3JlbCA9IHQ7Ci0gICAgICBpbnQ4X3QqIG91dHB1dF9wdHIgPQotICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihvdXRwdXQpICsgdF9yZWwgKiBvdXRwdXRfc3RlcDsKLSAgICAgIGNvbnN0IGludDhfdCogaW5wdXRfcHRyID0KLSAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4oaW5wdXQpICsgdF9yZWwgKiBpbnB1dF9zdGVwOwotICAgICAgTHN0bVN0ZXBJbnRlZ2VyOHg4XzE2KAotICAgICAgICAgIGlucHV0X3B0ciwKLSAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4oaW5wdXRfdG9faW5wdXRfd2VpZ2h0cyksCi0gICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5lZmZlY3RpdmVfaW5wdXRfdG9faW5wdXRfc2NhbGVfYSwKLSAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9pbnB1dF90b19pbnB1dF9zY2FsZV9iLAotICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihpbnB1dF90b19mb3JnZXRfd2VpZ2h0cyksCi0gICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5lZmZlY3RpdmVfaW5wdXRfdG9fZm9yZ2V0X3NjYWxlX2EsCi0gICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5lZmZlY3RpdmVfaW5wdXRfdG9fZm9yZ2V0X3NjYWxlX2IsCi0gICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KGlucHV0X3RvX2NlbGxfd2VpZ2h0cyksCi0gICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5lZmZlY3RpdmVfaW5wdXRfdG9fY2VsbF9zY2FsZV9hLAotICAgICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX2lucHV0X3RvX2NlbGxfc2NhbGVfYiwKLSAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4oaW5wdXRfdG9fb3V0cHV0X3dlaWdodHMpLAotICAgICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX2lucHV0X3RvX291dHB1dF9zY2FsZV9hLAotICAgICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX2lucHV0X3RvX291dHB1dF9zY2FsZV9iLAotICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihyZWN1cnJlbnRfdG9faW5wdXRfd2VpZ2h0cyksCi0gICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5lZmZlY3RpdmVfcmVjdXJyZW50X3RvX2lucHV0X3NjYWxlX2EsCi0gICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5lZmZlY3RpdmVfcmVjdXJyZW50X3RvX2lucHV0X3NjYWxlX2IsCi0gICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KHJlY3VycmVudF90b19mb3JnZXRfd2VpZ2h0cyksCi0gICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5lZmZlY3RpdmVfcmVjdXJyZW50X3RvX2ZvcmdldF9zY2FsZV9hLAotICAgICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX3JlY3VycmVudF90b19mb3JnZXRfc2NhbGVfYiwKLSAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4ocmVjdXJyZW50X3RvX2NlbGxfd2VpZ2h0cyksCi0gICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5lZmZlY3RpdmVfcmVjdXJyZW50X3RvX2NlbGxfc2NhbGVfYSwKLSAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9yZWN1cnJlbnRfdG9fY2VsbF9zY2FsZV9iLAotICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihyZWN1cnJlbnRfdG9fb3V0cHV0X3dlaWdodHMpLAotICAgICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX3JlY3VycmVudF90b19vdXRwdXRfc2NhbGVfYSwKLSAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9yZWN1cnJlbnRfdG9fb3V0cHV0X3NjYWxlX2IsCi0gICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90PihjZWxsX3RvX2lucHV0X3dlaWdodHMpLAotICAgICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX2NlbGxfdG9faW5wdXRfc2NhbGVfYSwKLSAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9jZWxsX3RvX2lucHV0X3NjYWxlX2IsCi0gICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90PihjZWxsX3RvX2ZvcmdldF93ZWlnaHRzKSwKLSAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9jZWxsX3RvX2ZvcmdldF9zY2FsZV9hLAotICAgICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX2NlbGxfdG9fZm9yZ2V0X3NjYWxlX2IsCi0gICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90PihjZWxsX3RvX291dHB1dF93ZWlnaHRzKSwKLSAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9jZWxsX3RvX291dHB1dF9zY2FsZV9hLAotICAgICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX2NlbGxfdG9fb3V0cHV0X3NjYWxlX2IsCi0gICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KHByb2plY3Rpb25fd2VpZ2h0cyksCi0gICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5lZmZlY3RpdmVfcHJval9zY2FsZV9hLAotICAgICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX3Byb2pfc2NhbGVfYiwKLSAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmhpZGRlbl96cCwKLSAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9oaWRkZW5fc2NhbGVfYSwKLSAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9oaWRkZW5fc2NhbGVfYiwKLSAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KGlucHV0X2xheWVyX25vcm1fY29lZmZpY2llbnRzKSwKLSAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmxheWVyX25vcm1faW5wdXRfc2NhbGVfYSwKLSAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmxheWVyX25vcm1faW5wdXRfc2NhbGVfYiwKLSAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KGZvcmdldF9sYXllcl9ub3JtX2NvZWZmaWNpZW50cyksCi0gICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5sYXllcl9ub3JtX2ZvcmdldF9zY2FsZV9hLAotICAgICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+bGF5ZXJfbm9ybV9mb3JnZXRfc2NhbGVfYiwKLSAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KGNlbGxfbGF5ZXJfbm9ybV9jb2VmZmljaWVudHMpLAotICAgICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+bGF5ZXJfbm9ybV9jZWxsX3NjYWxlX2EsCi0gICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5sYXllcl9ub3JtX2NlbGxfc2NhbGVfYiwKLSAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KG91dHB1dF9sYXllcl9ub3JtX2NvZWZmaWNpZW50cyksCi0gICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5sYXllcl9ub3JtX291dHB1dF9zY2FsZV9hLAotICAgICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+bGF5ZXJfbm9ybV9vdXRwdXRfc2NhbGVfYiwKLSAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDMyX3Q+KGlucHV0X2dhdGVfYmlhcyksCi0gICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQzMl90Pihmb3JnZXRfZ2F0ZV9iaWFzKSwKLSAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDMyX3Q+KGNlbGxfZ2F0ZV9iaWFzKSwKLSAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDMyX3Q+KG91dHB1dF9nYXRlX2JpYXMpLAotICAgICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+cXVhbnRpemVkX2NlbGxfY2xpcCwKLSAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPnF1YW50aXplZF9wcm9qX2NsaXAsCi0gICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5jZWxsX3NjYWxlLAotICAgICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+aW5wdXRfdmFyaWFuY2VfZ3VhcmQsCi0gICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5mb3JnZXRfdmFyaWFuY2VfZ3VhcmQsCi0gICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5jZWxsX3ZhcmlhbmNlX2d1YXJkLAotICAgICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+b3V0cHV0X3ZhcmlhbmNlX2d1YXJkLAotICAgICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+aW5wdXRfdG9fZm9yZ2V0X2VmZmVjdGl2ZV9iaWFzLmdldCgpLAotICAgICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+cmVjdXJyZW50X3RvX2ZvcmdldF9lZmZlY3RpdmVfYmlhcy5nZXQoKSwKLSAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmlucHV0X3RvX2NlbGxfZWZmZWN0aXZlX2JpYXMuZ2V0KCksCi0gICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5yZWN1cnJlbnRfdG9fY2VsbF9lZmZlY3RpdmVfYmlhcy5nZXQoKSwKLSAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmlucHV0X3RvX291dHB1dF9lZmZlY3RpdmVfYmlhcy5nZXQoKSwKLSAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPnJlY3VycmVudF90b19vdXRwdXRfZWZmZWN0aXZlX2JpYXMuZ2V0KCksCi0gICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5pbnB1dF90b19pbnB1dF9lZmZlY3RpdmVfYmlhcy5nZXQoKSwKLSAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPnJlY3VycmVudF90b19pbnB1dF9lZmZlY3RpdmVfYmlhcy5nZXQoKSwKLSAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPnByb2plY3Rpb25fZWZmZWN0aXZlX2JpYXMuZ2V0KCksIG5fYmF0Y2gsIG5fY2VsbCwKLSAgICAgICAgICBuX2lucHV0LCBuX291dHB1dCwgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KG91dHB1dF9zdGF0ZSksCi0gICAgICAgICAgb3V0cHV0X3N0YXRlX3pwLCB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KGNlbGxfc3RhdGUpLAotICAgICAgICAgIG91dHB1dF9wdHIsIChpbnQxNl90Kikoc2NyYXRjaDApLCAoaW50MTZfdCopKHNjcmF0Y2gxKSwKLSAgICAgICAgICAoaW50MTZfdCopKHNjcmF0Y2gyKSwgKGludDE2X3QqKShzY3JhdGNoMyksIChpbnQ4X3QqKShzY3JhdGNoNCksCi0gICAgICAgICAgKGludDMyX3QqKShzY3JhdGNoNSkpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBmb3IgKGludCBiID0gMDsgYiA8IG5fYmF0Y2g7IGIrKykgewotICAgICAgY29uc3QgaW50IGlucHV0X3N0ZXAgPSBuX2lucHV0OwotICAgICAgY29uc3QgaW50IG91dHB1dF9zdGVwID0gb3V0cHV0X2JhdGNoX2xlYWRpbmdfZGltOwotICAgICAgZm9yIChpbnQgdCA9IDA7IHQgPCBtYXhfdGltZTsgdCsrKSB7Ci0gICAgICAgIC8vIElmIHRoaXMgaXMgdGhlIGZvcndhcmRfc2VxdWVuY2UsIHN0ZXAgZm9yd2FyZCwgb3RoZXJ3aXNlIHN0ZXAKLSAgICAgICAgLy8gYmFja3dhcmRzLgotICAgICAgICBjb25zdCBpbnQgdF9yZWwgPSBmb3J3YXJkX3NlcXVlbmNlID8gdCA6IG1heF90aW1lIC0gdCAtIDE7Ci0gICAgICAgIGNvbnN0IGludCB0aW1lX29mZnNldCA9IGIgKiBtYXhfdGltZSArIHRfcmVsOwotICAgICAgICBjb25zdCBpbnQ4X3QqIGlucHV0X3B0ciA9IHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihpbnB1dCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfb2Zmc2V0ICogaW5wdXRfc3RlcDsKLSAgICAgICAgaW50OF90KiBvdXRwdXRfcHRyID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KG91dHB1dCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX29mZnNldCAqIG91dHB1dF9zdGVwOwotCi0gICAgICAgIC8vIE9mZnNldCB0aGUge291dHB1dCxjZWxsfV9zdGF0ZSBwb2ludGVycyB0byB0aGUgcmlnaHQgYmF0Y2guCi0gICAgICAgIGludDhfdCogb3V0cHV0X3N0YXRlX3B0ciA9Ci0gICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4ob3V0cHV0X3N0YXRlKSArCi0gICAgICAgICAgICBiICogb3V0cHV0X2JhdGNoX2xlYWRpbmdfZGltOwotICAgICAgICBpbnQxNl90KiBjZWxsX3N0YXRlX3B0ciA9Ci0gICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KGNlbGxfc3RhdGUpICsgYiAqIG5fY2VsbDsKLQotICAgICAgICBMc3RtU3RlcEludGVnZXI4eDhfMTYoCi0gICAgICAgICAgICBpbnB1dF9wdHIsCi0gICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4oaW5wdXRfdG9faW5wdXRfd2VpZ2h0cyksCi0gICAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9pbnB1dF90b19pbnB1dF9zY2FsZV9hLAotICAgICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5lZmZlY3RpdmVfaW5wdXRfdG9faW5wdXRfc2NhbGVfYiwKLSAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihpbnB1dF90b19mb3JnZXRfd2VpZ2h0cyksCi0gICAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9pbnB1dF90b19mb3JnZXRfc2NhbGVfYSwKLSAgICAgICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX2lucHV0X3RvX2ZvcmdldF9zY2FsZV9iLAotICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KGlucHV0X3RvX2NlbGxfd2VpZ2h0cyksCi0gICAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9pbnB1dF90b19jZWxsX3NjYWxlX2EsCi0gICAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9pbnB1dF90b19jZWxsX3NjYWxlX2IsCi0gICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4oaW5wdXRfdG9fb3V0cHV0X3dlaWdodHMpLAotICAgICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5lZmZlY3RpdmVfaW5wdXRfdG9fb3V0cHV0X3NjYWxlX2EsCi0gICAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9pbnB1dF90b19vdXRwdXRfc2NhbGVfYiwKLSAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihyZWN1cnJlbnRfdG9faW5wdXRfd2VpZ2h0cyksCi0gICAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9yZWN1cnJlbnRfdG9faW5wdXRfc2NhbGVfYSwKLSAgICAgICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX3JlY3VycmVudF90b19pbnB1dF9zY2FsZV9iLAotICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KHJlY3VycmVudF90b19mb3JnZXRfd2VpZ2h0cyksCi0gICAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9yZWN1cnJlbnRfdG9fZm9yZ2V0X3NjYWxlX2EsCi0gICAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9yZWN1cnJlbnRfdG9fZm9yZ2V0X3NjYWxlX2IsCi0gICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4ocmVjdXJyZW50X3RvX2NlbGxfd2VpZ2h0cyksCi0gICAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9yZWN1cnJlbnRfdG9fY2VsbF9zY2FsZV9hLAotICAgICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5lZmZlY3RpdmVfcmVjdXJyZW50X3RvX2NlbGxfc2NhbGVfYiwKLSAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihyZWN1cnJlbnRfdG9fb3V0cHV0X3dlaWdodHMpLAotICAgICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5lZmZlY3RpdmVfcmVjdXJyZW50X3RvX291dHB1dF9zY2FsZV9hLAotICAgICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5lZmZlY3RpdmVfcmVjdXJyZW50X3RvX291dHB1dF9zY2FsZV9iLAotICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90PihjZWxsX3RvX2lucHV0X3dlaWdodHMpLAotICAgICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5lZmZlY3RpdmVfY2VsbF90b19pbnB1dF9zY2FsZV9hLAotICAgICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5lZmZlY3RpdmVfY2VsbF90b19pbnB1dF9zY2FsZV9iLAotICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90PihjZWxsX3RvX2ZvcmdldF93ZWlnaHRzKSwKLSAgICAgICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX2NlbGxfdG9fZm9yZ2V0X3NjYWxlX2EsCi0gICAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9jZWxsX3RvX2ZvcmdldF9zY2FsZV9iLAotICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90PihjZWxsX3RvX291dHB1dF93ZWlnaHRzKSwKLSAgICAgICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX2NlbGxfdG9fb3V0cHV0X3NjYWxlX2EsCi0gICAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9jZWxsX3RvX291dHB1dF9zY2FsZV9iLAotICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KHByb2plY3Rpb25fd2VpZ2h0cyksCi0gICAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9wcm9qX3NjYWxlX2EsCi0gICAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9wcm9qX3NjYWxlX2IsCi0gICAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmhpZGRlbl96cCwKLSAgICAgICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX2hpZGRlbl9zY2FsZV9hLAotICAgICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5lZmZlY3RpdmVfaGlkZGVuX3NjYWxlX2IsCi0gICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KAotICAgICAgICAgICAgICAgIGlucHV0X2xheWVyX25vcm1fY29lZmZpY2llbnRzKSwKLSAgICAgICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+bGF5ZXJfbm9ybV9pbnB1dF9zY2FsZV9hLAotICAgICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5sYXllcl9ub3JtX2lucHV0X3NjYWxlX2IsCi0gICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KAotICAgICAgICAgICAgICAgIGZvcmdldF9sYXllcl9ub3JtX2NvZWZmaWNpZW50cyksCi0gICAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmxheWVyX25vcm1fZm9yZ2V0X3NjYWxlX2EsCi0gICAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmxheWVyX25vcm1fZm9yZ2V0X3NjYWxlX2IsCi0gICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KGNlbGxfbGF5ZXJfbm9ybV9jb2VmZmljaWVudHMpLAotICAgICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5sYXllcl9ub3JtX2NlbGxfc2NhbGVfYSwKLSAgICAgICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+bGF5ZXJfbm9ybV9jZWxsX3NjYWxlX2IsCi0gICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KAotICAgICAgICAgICAgICAgIG91dHB1dF9sYXllcl9ub3JtX2NvZWZmaWNpZW50cyksCi0gICAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmxheWVyX25vcm1fb3V0cHV0X3NjYWxlX2EsCi0gICAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmxheWVyX25vcm1fb3V0cHV0X3NjYWxlX2IsCi0gICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDMyX3Q+KGlucHV0X2dhdGVfYmlhcyksCi0gICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDMyX3Q+KGZvcmdldF9nYXRlX2JpYXMpLAotICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQzMl90PihjZWxsX2dhdGVfYmlhcyksCi0gICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDMyX3Q+KG91dHB1dF9nYXRlX2JpYXMpLAotICAgICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5xdWFudGl6ZWRfY2VsbF9jbGlwLAotICAgICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5xdWFudGl6ZWRfcHJval9jbGlwLAotICAgICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5jZWxsX3NjYWxlLAotICAgICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5pbnB1dF92YXJpYW5jZV9ndWFyZCwKLSAgICAgICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+Zm9yZ2V0X3ZhcmlhbmNlX2d1YXJkLAotICAgICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5jZWxsX3ZhcmlhbmNlX2d1YXJkLAotICAgICAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5vdXRwdXRfdmFyaWFuY2VfZ3VhcmQsCi0gICAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmlucHV0X3RvX2ZvcmdldF9lZmZlY3RpdmVfYmlhcy5nZXQoKSwKLSAgICAgICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+cmVjdXJyZW50X3RvX2ZvcmdldF9lZmZlY3RpdmVfYmlhcy5nZXQoKSwKLSAgICAgICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+aW5wdXRfdG9fY2VsbF9lZmZlY3RpdmVfYmlhcy5nZXQoKSwKLSAgICAgICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+cmVjdXJyZW50X3RvX2NlbGxfZWZmZWN0aXZlX2JpYXMuZ2V0KCksCi0gICAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmlucHV0X3RvX291dHB1dF9lZmZlY3RpdmVfYmlhcy5nZXQoKSwKLSAgICAgICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+cmVjdXJyZW50X3RvX291dHB1dF9lZmZlY3RpdmVfYmlhcy5nZXQoKSwKLSAgICAgICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+aW5wdXRfdG9faW5wdXRfZWZmZWN0aXZlX2JpYXMuZ2V0KCksCi0gICAgICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPnJlY3VycmVudF90b19pbnB1dF9lZmZlY3RpdmVfYmlhcy5nZXQoKSwKLSAgICAgICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+cHJvamVjdGlvbl9lZmZlY3RpdmVfYmlhcy5nZXQoKSwgLypuX2JhdGNoPSovMSwKLSAgICAgICAgICAgIG5fY2VsbCwgbl9pbnB1dCwgbl9vdXRwdXQsIG91dHB1dF9zdGF0ZV9wdHIsIG91dHB1dF9zdGF0ZV96cCwKLSAgICAgICAgICAgIGNlbGxfc3RhdGVfcHRyLCBvdXRwdXRfcHRyLCAoaW50MTZfdCopKHNjcmF0Y2gwKSwKLSAgICAgICAgICAgIChpbnQxNl90Kikoc2NyYXRjaDEpLCAoaW50MTZfdCopKHNjcmF0Y2gyKSwgKGludDE2X3QqKShzY3JhdGNoMyksCi0gICAgICAgICAgICAoaW50OF90Kikoc2NyYXRjaDQpLCAoaW50MzJfdCopKHNjcmF0Y2g1KSk7Ci0gICAgICB9CitMc3RtVGVuc29yczo6fkxzdG1UZW5zb3JzKCkgeworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDI0OyBpKyspIHsKKyAgICBpZiAoaW50ZXJuYWxfdGVuc29yc19baV0gIT0gbnVsbHB0cikgeworICAgICAgbWljcm9fY29udGV4dF8tPkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKGludGVybmFsX3RlbnNvcnNfW2ldKTsKICAgICB9CiAgIH0KKyAgbWljcm9fY29udGV4dF8tPkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKG91dHB1dF90ZW5zb3JfKTsKK30KIAorLy8gVmVyaWZ5IHRoZSBMU1RNIGludGVybmFsIHRlbnNvciBwcm9wZXJ0aWVzIChlLmcuLCB0eXBlIGNoZWNrcykKKy8vIElucHV0L291dHB1dC9zdGF0ZXMvZmMgd2VpZ2h0cyB0ZW5zb3JzIGFyZSByZXF1aXJlZCBmb3Iga2VybmVsIGV2YXVsYXRpb24uCisvLyBUaGUgc3RhdGUgdGVuc29ycyBzaG91bGQgYmUgdmFyaWFibGVzLiBWYXJpYW50cyBvZiB0aGUgc3RhbmRhcmQgTFNUTQorLy8gYXJlIG5vdCBzdXBwb3J0ZWQgaGVyZSwgdGhlcmVmb3JlIHRoZWlyIGNvcnJlc3BvbmRpbmcgdGVuc29ycyBzaG91bGQgYmUKKy8vIGludmFsaWQKK1RmTGl0ZVN0YXR1cyBMc3RtVGVuc29yczo6VmFsaWRhdGVUZW5zb3JTdGF0dXMoVGZMaXRlQ29udGV4dCogY29udGV4dCkgY29uc3QgeworICAvLyBWZXJpZnkgY2VydGFpbiB0ZW5zb3IgcHJvcGVydGllcworICAvLyBpbnB1dCB0ZW5zb3IKKyAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgaW50ZXJuYWxfdGVuc29yc19ba0xzdG1JbnB1dFRlbnNvcl0gIT0gbnVsbHB0cik7CisgIC8vIGhpZGRlbiBzdGF0ZQorICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCBpbnRlcm5hbF90ZW5zb3JzX1trTHN0bU91dHB1dFN0YXRlVGVuc29yXSAhPSBudWxscHRyKTsKKyAgVEZfTElURV9FTlNVUkUoY29udGV4dCwKKyAgICAgICAgICAgICAgICAgaW50ZXJuYWxfdGVuc29yc19ba0xzdG1PdXRwdXRTdGF0ZVRlbnNvcl0tPmlzX3ZhcmlhYmxlKTsKKyAgLy8gaGlkZGVuIHN0YXRlIGJlY29tZXMgaW5wdXQgc28gdGhleSBtdXN0IGhhdmUgdGhlIHNhbWUgdHlwZQorICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBpbnRlcm5hbF90ZW5zb3JzX1trTHN0bU91dHB1dFN0YXRlVGVuc29yXS0+dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxfdGVuc29yc19ba0xzdG1JbnB1dFRlbnNvcl0tPnR5cGUpOworICAvLyBjZWxsIHN0YXRlCisgIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIGludGVybmFsX3RlbnNvcnNfW2tMc3RtQ2VsbFN0YXRlVGVuc29yXSAhPSBudWxscHRyKTsKKyAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgaW50ZXJuYWxfdGVuc29yc19ba0xzdG1DZWxsU3RhdGVUZW5zb3JdLT5pc192YXJpYWJsZSk7CisgIC8vIG91dHB1dAorICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCBvdXRwdXRfdGVuc29yXyAhPSBudWxscHRyKTsKKyAgLy8gb3V0cHV0IHR5cGUgaXMgdGhlIHNhbWUgYXMgdGhlIGlucHV0IHR5cGUgKGFjdGl2YXRpb25zKQorICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBvdXRwdXRfdGVuc29yXy0+dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxfdGVuc29yc19ba0xzdG1JbnB1dFRlbnNvcl0tPnR5cGUpOworCisgIC8vIHdlaWdodCB0ZW5zb3JzICgxLTksIHNlZSBsc3RtX3NoYXJlZCBmb3IgaW5kZXggZGVmaW5pdGlvbikKKyAgY29uc3QgYXV0byB3ZWlnaHRfdHlwZSA9CisgICAgICBpbnRlcm5hbF90ZW5zb3JzX1trTHN0bUlucHV0VG9Gb3JnZXRXZWlnaHRzVGVuc29yXS0+dHlwZTsKKyAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCA5OyBpKyspIHsKKyAgICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCBpbnRlcm5hbF90ZW5zb3JzX1tpXSAhPSBudWxscHRyKTsKKyAgICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBpbnRlcm5hbF90ZW5zb3JzX1tpXS0+dHlwZSwgd2VpZ2h0X3R5cGUpOworICB9CisKKyAgLy8gYmlhcyB0ZW5zb3JzICgxMi0xNSwgc2VlIGxzdG1fc2hhcmVkIGZvciBpbmRleCBkZWZpbml0aW9uKQorICBjb25zdCBhdXRvIGJpYXNfdHlwZSA9IGludGVybmFsX3RlbnNvcnNfW2tMc3RtRm9yZ2V0R2F0ZUJpYXNUZW5zb3JdLT50eXBlOworICBmb3IgKHNpemVfdCBpID0gMTI7IGkgPCAxNjsgaSsrKSB7CisgICAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgaW50ZXJuYWxfdGVuc29yc19baV0gIT0gbnVsbHB0cik7CisgICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgaW50ZXJuYWxfdGVuc29yc19baV0tPnR5cGUsIGJpYXNfdHlwZSk7CisgIH0KKyAgLy8gVGVuc29ycyBmcm9tIExTVE0gdmFyaWFudHMgYXJlIGludmFsaWQKKyAgLy8gTm8gcGVlcGhvbGUKKyAgZm9yIChzaXplX3QgaSA9IDk7IGkgPCAxMjsgaSsrKSB7CisgICAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgaW50ZXJuYWxfdGVuc29yc19baV0gPT0gbnVsbHB0cik7CisgIH0KKyAgLy8gTm8gcHJvamVjdGlvbgorICBmb3IgKHNpemVfdCBpID0gMTY7IGkgPCAxODsgaSsrKSB7CisgICAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgaW50ZXJuYWxfdGVuc29yc19baV0gPT0gbnVsbHB0cik7CisgIH0KKyAgLy8gTm8gaW50ZXJuYWwgbGF5ZXIgbm9ybQorICBmb3IgKHNpemVfdCBpID0gMjA7IGkgPCAyNDsgaSsrKSB7CisgICAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgaW50ZXJuYWxfdGVuc29yc19baV0gPT0gbnVsbHB0cik7CisgIH0KICAgcmV0dXJuIGtUZkxpdGVPazsKIH0KIAotVGZMaXRlU3RhdHVzIEV2YWxJbnRlZ2VyOHg4XzgoCi0gICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXQsCi0gICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXRfdG9faW5wdXRfd2VpZ2h0cywKLSAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dF90b19mb3JnZXRfd2VpZ2h0cywKLSAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dF90b19jZWxsX3dlaWdodHMsCi0gICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXRfdG9fb3V0cHV0X3dlaWdodHMsCi0gICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogcmVjdXJyZW50X3RvX2lucHV0X3dlaWdodHMsCi0gICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogcmVjdXJyZW50X3RvX2ZvcmdldF93ZWlnaHRzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIHJlY3VycmVudF90b19jZWxsX3dlaWdodHMsCi0gICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogcmVjdXJyZW50X3RvX291dHB1dF93ZWlnaHRzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGNlbGxfdG9faW5wdXRfd2VpZ2h0cywKLSAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBjZWxsX3RvX2ZvcmdldF93ZWlnaHRzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGNlbGxfdG9fb3V0cHV0X3dlaWdodHMsCi0gICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXRfbGF5ZXJfbm9ybV9jb2VmZmljaWVudHMsCi0gICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogZm9yZ2V0X2xheWVyX25vcm1fY29lZmZpY2llbnRzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGNlbGxfbGF5ZXJfbm9ybV9jb2VmZmljaWVudHMsCi0gICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogb3V0cHV0X2xheWVyX25vcm1fY29lZmZpY2llbnRzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0X2dhdGVfYmlhcywKLSAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBmb3JnZXRfZ2F0ZV9iaWFzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGNlbGxfZ2F0ZV9iaWFzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dF9nYXRlX2JpYXMsCi0gICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogcHJvamVjdGlvbl93ZWlnaHRzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIHByb2plY3Rpb25fYmlhcywgY29uc3QgVGZMaXRlTFNUTVBhcmFtcyogcGFyYW1zLAotICAgIFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dF9zdGF0ZSwgVGZMaXRlRXZhbFRlbnNvciogY2VsbF9zdGF0ZSwKLSAgICBUZkxpdGVFdmFsVGVuc29yKiBvdXRwdXQsCi0gICAgY29uc3QgbHN0bV9ldmFsOjpJbnRlZ2VyTHN0bVBhcmFtZXRlciogaW50ZWdlcl9sc3RtX3BhcmFtLAotICAgIFRmTGl0ZUV2YWxUZW5zb3IqIHNjcmF0Y2gwLCBUZkxpdGVFdmFsVGVuc29yKiBzY3JhdGNoMSwKLSAgICBUZkxpdGVFdmFsVGVuc29yKiBzY3JhdGNoMiwgVGZMaXRlRXZhbFRlbnNvciogc2NyYXRjaDMsCi0gICAgVGZMaXRlRXZhbFRlbnNvciogc2NyYXRjaDQsIFRmTGl0ZUV2YWxUZW5zb3IqIHNjcmF0Y2g1LAotICAgIFRmTGl0ZUV2YWxUZW5zb3IqIHNjcmF0Y2g2LCBUZkxpdGVFdmFsVGVuc29yKiBzY3JhdGNoNykgewotICBURkxJVEVfRENIRUNLKGlucHV0LT5kaW1zLT5zaXplID49IDIgJiYgaW5wdXQtPmRpbXMtPnNpemUgPD0gMyk7Ci0gIGNvbnN0IGludCBuX2lucHV0ID0gaW5wdXQtPmRpbXMtPmRhdGFbaW5wdXQtPmRpbXMtPnNpemUgLSAxXTsKLSAgaW50IG1heF90aW1lLCBuX2JhdGNoOwotICBpZiAoaW5wdXQtPmRpbXMtPnNpemUgPT0gMikgewotICAgIG1heF90aW1lID0gMTsKLSAgICBuX2JhdGNoID0gaW5wdXQtPmRpbXMtPmRhdGFbMF07Ci0gIH0gZWxzZSB7Ci0gICAgbWF4X3RpbWUgPSBpbnB1dC0+ZGltcy0+ZGF0YVswXTsKLSAgICBuX2JhdGNoID0gaW5wdXQtPmRpbXMtPmRhdGFbMV07CituYW1lc3BhY2UgbHN0bV9pbnRlcm5hbCB7CisKKyNpZiAhKGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpKQorY29uc3QgaW50MzJfdCBrSW50MTZNYXggPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2X3Q+OjptYXgoKTsKK2NvbnN0IGludDMyX3Qga0ludDE2TWluID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQxNl90Pjo6bWluKCk7CisjZW5kaWYKKwordm9pZCBBZGRFbGVtZW50V2lzZShjb25zdCBpbnQxNl90KiBpbnB1dF8xLCBjb25zdCBpbnQxNl90KiBpbnB1dF8yLCBpbnQgbl9iYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgaW50IG5faW5wdXQsIGludDE2X3QqIG91dHB1dCkgeworI2lmICEoZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkpCisgIGZvciAoaW50IGJhdGNoID0gMDsgYmF0Y2ggPCBuX2JhdGNoOyArK2JhdGNoKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuX2lucHV0OyArK2kpIHsKKyAgICAgIGNvbnN0IGludCBpbmRleCA9IGJhdGNoICogbl9pbnB1dCArIGk7CisgICAgICBpbnQzMl90IHN1bSA9IGlucHV0XzFbaW5kZXhdICsgaW5wdXRfMltpbmRleF07CisgICAgICBjb25zdCBpbnQzMl90IHN1bV9jbGFtcGVkID0gc3RkOjptaW4oa0ludDE2TWF4LCBzdGQ6Om1heChrSW50MTZNaW4sIHN1bSkpOworICAgICAgb3V0cHV0W2luZGV4XSA9IHN0YXRpY19jYXN0PGludDE2X3Q+KHN1bV9jbGFtcGVkKTsKKyAgICB9CiAgIH0KLQotICAvLyBuX2NlbGwgYW5kIG5fb3V0cHV0IHdpbGwgYmUgdGhlIHNhbWUgc2l6ZSB3aGVuIHRoZXJlIGlzIG5vIHByb2plY3Rpb24uCi0gIGNvbnN0IGludCBuX2NlbGwgPSBpbnB1dF90b19vdXRwdXRfd2VpZ2h0cy0+ZGltcy0+ZGF0YVswXTsKLSAgY29uc3QgaW50IG5fb3V0cHV0ID0gcmVjdXJyZW50X3RvX291dHB1dF93ZWlnaHRzLT5kaW1zLT5kYXRhWzFdOwotICAvL0BUT0RPIGlucHV0IHplcm8gcG9pbnQgYW5kIG91dHB1dCB6ZXJvcG9pbnQKLSAgLy8gY29uc3QgaW50MzJfdCBpbnB1dF96cCA9IGlucHV0LT5wYXJhbXMuemVyb19wb2ludDsKLSAgLy8vIGNvbnN0IGludDMyX3Qgb3V0cHV0X3N0YXRlX3pwID0gb3V0cHV0X3N0YXRlLT5wYXJhbXMuemVyb19wb2ludDsKLSAgY29uc3QgaW50MzJfdCBpbnB1dF96cCA9IDA7Ci0gIGNvbnN0IGludDMyX3Qgb3V0cHV0X3N0YXRlX3pwID0gMDsKLQotICAvLyBHZXQgcGFyYW1zIGZvciB0aW1lL2JhdGNoL3NlcXVlbmNlLgotICBjb25zdCBpbnQgb3V0cHV0X2JhdGNoX2xlYWRpbmdfZGltID0KLSAgICAgIG91dHB1dC0+ZGltcy0+ZGF0YVtvdXRwdXQtPmRpbXMtPnNpemUgLSAxXTsKLSAgY29uc3QgaW50IGlucHV0X3N0ZXAgPSBuX2JhdGNoICogbl9pbnB1dDsKLSAgY29uc3QgaW50IG91dHB1dF9zdGVwID0gbl9iYXRjaCAqIG91dHB1dF9iYXRjaF9sZWFkaW5nX2RpbTsKLQotICBmb3IgKGludCB0ID0gMDsgdCA8IG1heF90aW1lOyB0KyspIHsKLSAgICBjb25zdCBpbnQgdF9yZWwgPSB0OwotICAgIGludDhfdCogb3V0cHV0X3B0ciA9Ci0gICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihvdXRwdXQpICsgdF9yZWwgKiBvdXRwdXRfc3RlcDsKLSAgICAvLyBJbnB1dCBjYW4gYmUgaW50OCBhc3ltbWV0cmljIG9yIGludDE2IHN5bW1ldHJpYy4KLSAgICBjb25zdCBpbnQ4X3QqIGlucHV0X3B0ciA9Ci0gICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihpbnB1dCkgKyB0X3JlbCAqIGlucHV0X3N0ZXA7Ci0gICAgbHN0bV9ldmFsOjpMc3RtU3RlcEludGVnZXI4eDhfOCgKLSAgICAgICAgaW5wdXRfcHRyLCBpbnB1dF96cCwKLQotICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4oaW5wdXRfdG9faW5wdXRfd2VpZ2h0cyksCi0gICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX2lucHV0X3RvX2lucHV0X3NjYWxlX2EsCi0gICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX2lucHV0X3RvX2lucHV0X3NjYWxlX2IsCi0KLSAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KGlucHV0X3RvX2ZvcmdldF93ZWlnaHRzKSwKLSAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5lZmZlY3RpdmVfaW5wdXRfdG9fZm9yZ2V0X3NjYWxlX2EsCi0gICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX2lucHV0X3RvX2ZvcmdldF9zY2FsZV9iLAotCi0gICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihpbnB1dF90b19jZWxsX3dlaWdodHMpLAotICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9pbnB1dF90b19jZWxsX3NjYWxlX2EsCi0gICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX2lucHV0X3RvX2NlbGxfc2NhbGVfYiwKLQotICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4oaW5wdXRfdG9fb3V0cHV0X3dlaWdodHMpLAotICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9pbnB1dF90b19vdXRwdXRfc2NhbGVfYSwKLSAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5lZmZlY3RpdmVfaW5wdXRfdG9fb3V0cHV0X3NjYWxlX2IsCi0KLSAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KHJlY3VycmVudF90b19pbnB1dF93ZWlnaHRzKSwKLSAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5lZmZlY3RpdmVfcmVjdXJyZW50X3RvX2lucHV0X3NjYWxlX2EsCi0gICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX3JlY3VycmVudF90b19pbnB1dF9zY2FsZV9iLAotCi0gICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihyZWN1cnJlbnRfdG9fZm9yZ2V0X3dlaWdodHMpLAotICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9yZWN1cnJlbnRfdG9fZm9yZ2V0X3NjYWxlX2EsCi0gICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX3JlY3VycmVudF90b19mb3JnZXRfc2NhbGVfYiwKLQotICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4ocmVjdXJyZW50X3RvX2NlbGxfd2VpZ2h0cyksCi0gICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX3JlY3VycmVudF90b19jZWxsX3NjYWxlX2EsCi0gICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX3JlY3VycmVudF90b19jZWxsX3NjYWxlX2IsCi0KLSAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KHJlY3VycmVudF90b19vdXRwdXRfd2VpZ2h0cyksCi0gICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX3JlY3VycmVudF90b19vdXRwdXRfc2NhbGVfYSwKLSAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5lZmZlY3RpdmVfcmVjdXJyZW50X3RvX291dHB1dF9zY2FsZV9iLAotCi0gICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihjZWxsX3RvX2lucHV0X3dlaWdodHMpLAotICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9jZWxsX3RvX2lucHV0X3NjYWxlX2EsCi0gICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX2NlbGxfdG9faW5wdXRfc2NhbGVfYiwKLQotICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4oY2VsbF90b19mb3JnZXRfd2VpZ2h0cyksCi0gICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX2NlbGxfdG9fZm9yZ2V0X3NjYWxlX2EsCi0gICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX2NlbGxfdG9fZm9yZ2V0X3NjYWxlX2IsCi0KLSAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KGNlbGxfdG9fb3V0cHV0X3dlaWdodHMpLAotICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9jZWxsX3RvX291dHB1dF9zY2FsZV9hLAotICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9jZWxsX3RvX291dHB1dF9zY2FsZV9iLAotCi0gICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90Pihwcm9qZWN0aW9uX3dlaWdodHMpLAotICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9wcm9qX3NjYWxlX2EsCi0gICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX3Byb2pfc2NhbGVfYiwKLQotICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KGlucHV0X2xheWVyX25vcm1fY29lZmZpY2llbnRzKSwKLSAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5sYXllcl9ub3JtX2lucHV0X3NjYWxlX2EsCi0gICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+bGF5ZXJfbm9ybV9pbnB1dF9zY2FsZV9iLAotCi0gICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50MTZfdD4oZm9yZ2V0X2xheWVyX25vcm1fY29lZmZpY2llbnRzKSwKLSAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5sYXllcl9ub3JtX2ZvcmdldF9zY2FsZV9hLAotICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmxheWVyX25vcm1fZm9yZ2V0X3NjYWxlX2IsCi0KLSAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90PihjZWxsX2xheWVyX25vcm1fY29lZmZpY2llbnRzKSwKLSAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5sYXllcl9ub3JtX2NlbGxfc2NhbGVfYSwKLSAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5sYXllcl9ub3JtX2NlbGxfc2NhbGVfYiwKLQotICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KG91dHB1dF9sYXllcl9ub3JtX2NvZWZmaWNpZW50cyksCi0gICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+bGF5ZXJfbm9ybV9vdXRwdXRfc2NhbGVfYSwKLSAgICAgICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5sYXllcl9ub3JtX291dHB1dF9zY2FsZV9iLAotCi0gICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50MzJfdD4oaW5wdXRfZ2F0ZV9iaWFzKSwKLSAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQzMl90Pihmb3JnZXRfZ2F0ZV9iaWFzKSwKLSAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQzMl90PihjZWxsX2dhdGVfYmlhcyksCi0gICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50MzJfdD4ob3V0cHV0X2dhdGVfYmlhcyksCi0gICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50MzJfdD4ocHJvamVjdGlvbl9iaWFzKSwKLQotICAgICAgICBwYXJhbXMsIGludGVnZXJfbHN0bV9wYXJhbS0+aW50ZXJtZWRpYXRlX3NjYWxlX2EsCi0gICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+aW50ZXJtZWRpYXRlX3NjYWxlX2IsCi0gICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+aW50ZXJtZWRpYXRlX3pwLAotICAgICAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPnF1YW50aXplZF9jZWxsX2NsaXAsCi0gICAgICAgIGludGVnZXJfbHN0bV9wYXJhbS0+cXVhbnRpemVkX3Byb2pfY2xpcCwgbl9iYXRjaCwgbl9jZWxsLCBuX2lucHV0LAotICAgICAgICBuX291dHB1dCwgb3V0cHV0X2JhdGNoX2xlYWRpbmdfZGltLAotICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4ob3V0cHV0X3N0YXRlKSwgb3V0cHV0X3N0YXRlX3pwLAotICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KGNlbGxfc3RhdGUpLCBvdXRwdXRfcHRyLAotICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4oc2NyYXRjaDApLAotICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4oc2NyYXRjaDEpLAotICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KHNjcmF0Y2gyKSwKLSAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90PihzY3JhdGNoMyksCi0gICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50MTZfdD4oc2NyYXRjaDQpLAotICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KHNjcmF0Y2g1KSwKLSAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90PihzY3JhdGNoNiksCi0gICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50MTZfdD4oc2NyYXRjaDcpKTsKLSAgfQotCi0gIHJldHVybiBrVGZMaXRlT2s7CisjZWxzZQorICB4YV9ubl9lbG1fYWRkXzE2eDE2XzE2KG91dHB1dCwgaW5wdXRfMSwgaW5wdXRfMiwgbl9iYXRjaCAqIG5faW5wdXQpOworI2VuZGlmCiB9CiAKLX0gIC8vIG5hbWVzcGFjZSBsc3RtX2V2YWwKLX0gIC8vIG5hbWVzcGFjZSBtaWNybwotfSAgLy8gbmFtZXNwYWNlIG9wcwordm9pZCBBZGRFbGVtZW50V2lzZShjb25zdCBmbG9hdCogaW5wdXRfMSwgY29uc3QgZmxvYXQqIGlucHV0XzIsIGludCBuX2JhdGNoLAorICAgICAgICAgICAgICAgICAgICBpbnQgbl9pbnB1dCwgZmxvYXQqIG91dHB1dCkgeworICBmb3IgKGludCBiYXRjaCA9IDA7IGJhdGNoIDwgbl9iYXRjaDsgKytiYXRjaCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbl9pbnB1dDsgKytpKSB7CisgICAgICBjb25zdCBpbnQgaW5kZXggPSBiYXRjaCAqIG5faW5wdXQgKyBpOworICAgICAgb3V0cHV0W2luZGV4XSA9IGlucHV0XzFbaW5kZXhdICsgaW5wdXRfMltpbmRleF07CisgICAgfQorICB9Cit9CisKKyNpZiAhKGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpKQordm9pZCBTaWdtb2lkKGNvbnN0IFJ1bnRpbWVTaGFwZSYgZGF0YV9zaGFwZSwgaW50MTZfdCogZGF0YSkgeworICByZWZlcmVuY2VfaW50ZWdlcl9vcHM6OkxvZ2lzdGljKAorICAgICAgMCAvKmRhdGEtPmlucHV0X211bHRpcGxpZXIqLywgMCAvKmRhdGEtPmlucHV0X2xlZnRfc2hpZnQgKi8sCisgICAgICBkYXRhX3NoYXBlLkZsYXRTaXplKCkgLypOdW1FbGVtZW50cyhpbnB1dC0+ZGltcykqLywKKyAgICAgIGRhdGEgLyogdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90PihpbnB1dCkgKi8sCisgICAgICBkYXRhIC8qdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90PihvdXRwdXQpICovKTsKK30KKwordm9pZCBTaWdtb2lkKGNvbnN0IFJ1bnRpbWVTaGFwZSYgZGF0YV9zaGFwZSwgZmxvYXQqIGRhdGEpIHsKKyAgcmVmZXJlbmNlX29wczo6TG9naXN0aWMoZGF0YV9zaGFwZSwgZGF0YSwgZGF0YV9zaGFwZSwgZGF0YSk7Cit9CisKK3ZvaWQgVGFuaChpbnQzMl90IGNlbGxfc3RhdGVfc2NhbGVfcG93ZXIsIGNvbnN0IFJ1bnRpbWVTaGFwZSYgaW5wdXRfZGF0YV9zaGFwZSwKKyAgICAgICAgICBpbnQxNl90KiBpbnB1dF9kYXRhLCBjb25zdCBSdW50aW1lU2hhcGUmIG91dHB1dF9kYXRhX3NoYXBlLAorICAgICAgICAgIGludDE2X3QqIG91dHB1dF9kYXRhKSB7CisgIGludDMyX3QgdGFuaF9pbnB1dF9sZWZ0X3NoaWZ0ID0gKDE1ICsgY2VsbF9zdGF0ZV9zY2FsZV9wb3dlcikgLSAzOworICBpbnQzMl90IGlucHV0X211bHRpcGxpZXIgPSAwOworICBpZiAodGFuaF9pbnB1dF9sZWZ0X3NoaWZ0IDwgMCkgLyogaGFuZGxpbmcgbmVnYXRpdmUgc2hpZnQgdmFsdWUgKi8KKyAgeworICAgIHRhbmhfaW5wdXRfbGVmdF9zaGlmdCA9IC10YW5oX2lucHV0X2xlZnRfc2hpZnQ7CisgICAgaW5wdXRfbXVsdGlwbGllciA9IDM7CisgIH0KKyAgcmVmZXJlbmNlX2ludGVnZXJfb3BzOjpUYW5oKGlucHV0X211bHRpcGxpZXIsIHRhbmhfaW5wdXRfbGVmdF9zaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2RhdGFfc2hhcGUsIGlucHV0X2RhdGEsIG91dHB1dF9kYXRhX3NoYXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2RhdGEpOworfQorCit2b2lkIFRhbmgoaW50MzJfdCBjZWxsX3N0YXRlX3NjYWxlX3Bvd2VyLCBjb25zdCBSdW50aW1lU2hhcGUmIGlucHV0X2RhdGFfc2hhcGUsCisgICAgICAgICAgZmxvYXQqIGlucHV0X2RhdGEsIGNvbnN0IFJ1bnRpbWVTaGFwZSYgb3V0cHV0X2RhdGFfc2hhcGUsCisgICAgICAgICAgZmxvYXQqIG91dHB1dF9kYXRhKSB7CisgIHJlZmVyZW5jZV9vcHM6OlRhbmgoaW5wdXRfZGF0YV9zaGFwZSwgaW5wdXRfZGF0YSwgb3V0cHV0X2RhdGFfc2hhcGUsCisgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2RhdGEpOworfQorCisvLyBJbnB1dCBhbmQgb3V0cHV0IGhhdmUgdGhlIHNhbWUgc2hhcGUgaW4gTFNUTQordm9pZCBNdWwoY29uc3QgUnVudGltZVNoYXBlJiBzaGFwZSwgY29uc3QgQXJpdGhtZXRpY1BhcmFtcyYgcGFyYW1zLAorICAgICAgICAgY29uc3QgaW50MTZfdCogaW5wdXQxX2RhdGEsIGNvbnN0IGludDE2X3QqIGlucHV0Ml9kYXRhLAorICAgICAgICAgaW50OF90KiBvdXRwdXRfZGF0YSkgeworICByZXR1cm4gcmVmZXJlbmNlX2ludGVnZXJfb3BzOjpNdWxFbGVtZW50d2lzZSgKKyAgICAgIHNoYXBlLkZsYXRTaXplKCksIHBhcmFtcywgaW5wdXQxX2RhdGEsIGlucHV0Ml9kYXRhLCBvdXRwdXRfZGF0YSk7Cit9CisKKy8vIElucHV0IGFuZCBvdXRwdXQgaGF2ZSB0aGUgc2FtZSBzaGFwZSBpbiBMU1RNCit2b2lkIE11bChjb25zdCBSdW50aW1lU2hhcGUmIHNoYXBlLCBjb25zdCBBcml0aG1ldGljUGFyYW1zJiBwYXJhbXMsCisgICAgICAgICBjb25zdCBpbnQxNl90KiBpbnB1dDFfZGF0YSwgY29uc3QgaW50MTZfdCogaW5wdXQyX2RhdGEsCisgICAgICAgICBpbnQxNl90KiBvdXRwdXRfZGF0YSkgeworICByZXR1cm4gcmVmZXJlbmNlX2ludGVnZXJfb3BzOjpNdWxFbGVtZW50d2lzZSgKKyAgICAgIHNoYXBlLkZsYXRTaXplKCksIHBhcmFtcywgaW5wdXQxX2RhdGEsIGlucHV0Ml9kYXRhLCBvdXRwdXRfZGF0YSk7Cit9CisKKy8vIElucHV0IGFuZCBvdXRwdXQgaGF2ZSB0aGUgc2FtZSBzaGFwZSBpbiBMU1RNCit2b2lkIE11bChjb25zdCBSdW50aW1lU2hhcGUmIHNoYXBlLCBjb25zdCBBcml0aG1ldGljUGFyYW1zJiBwYXJhbXMsCisgICAgICAgICBjb25zdCBmbG9hdCogaW5wdXQxX2RhdGEsIGNvbnN0IGZsb2F0KiBpbnB1dDJfZGF0YSwKKyAgICAgICAgIGZsb2F0KiBvdXRwdXRfZGF0YSkgeworICByZXR1cm4gcmVmZXJlbmNlX29wczo6TXVsKHBhcmFtcywgc2hhcGUsIGlucHV0MV9kYXRhLCBzaGFwZSwgaW5wdXQyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcGUsIG91dHB1dF9kYXRhKTsKK30KKwordm9pZCBGdWxseUNvbm5lY3RlZChjb25zdCBGdWxseUNvbm5lY3RlZFBhcmFtcyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBSdW50aW1lU2hhcGUmIGlucHV0X3NoYXBlLCBjb25zdCBpbnQ4X3QqIGlucHV0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgZmlsdGVyX3NoYXBlLCBjb25zdCBpbnQ4X3QqIGZpbHRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBSdW50aW1lU2hhcGUmIGJpYXNfc2hhcGUsIGNvbnN0IGludDMyX3QqIGJpYXNfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgUnVudGltZVNoYXBlJiBvdXRwdXRfc2hhcGUsIGludDE2X3QqIG91dHB1dF9kYXRhKSB7CisgIHJldHVybiB0ZmxpdGU6OnJlZmVyZW5jZV9pbnRlZ2VyX29wczo6RnVsbHlDb25uZWN0ZWQoCisgICAgICBwYXJhbXMsIGlucHV0X3NoYXBlLCBpbnB1dF9kYXRhLCBmaWx0ZXJfc2hhcGUsIGZpbHRlcl9kYXRhLCBiaWFzX3NoYXBlLAorICAgICAgYmlhc19kYXRhLCBvdXRwdXRfc2hhcGUsIG91dHB1dF9kYXRhKTsKK30KKwordm9pZCBGdWxseUNvbm5lY3RlZChjb25zdCBGdWxseUNvbm5lY3RlZFBhcmFtcyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBSdW50aW1lU2hhcGUmIGlucHV0X3NoYXBlLCBjb25zdCBpbnQxNl90KiBpbnB1dF9kYXRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBSdW50aW1lU2hhcGUmIGZpbHRlcl9zaGFwZSwgY29uc3QgaW50OF90KiBmaWx0ZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgUnVudGltZVNoYXBlJiBiaWFzX3NoYXBlLCBjb25zdCBpbnQ2NF90KiBiaWFzX2RhdGEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgb3V0cHV0X3NoYXBlLCBpbnQxNl90KiBvdXRwdXRfZGF0YSkgeworICByZXR1cm4gdGZsaXRlOjpyZWZlcmVuY2VfaW50ZWdlcl9vcHM6OkZ1bGx5Q29ubmVjdGVkKAorICAgICAgcGFyYW1zLCBpbnB1dF9zaGFwZSwgaW5wdXRfZGF0YSwgZmlsdGVyX3NoYXBlLCBmaWx0ZXJfZGF0YSwgYmlhc19zaGFwZSwKKyAgICAgIGJpYXNfZGF0YSwgb3V0cHV0X3NoYXBlLCBvdXRwdXRfZGF0YSk7Cit9CisKK3ZvaWQgRnVsbHlDb25uZWN0ZWQoY29uc3QgRnVsbHlDb25uZWN0ZWRQYXJhbXMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgUnVudGltZVNoYXBlJiBpbnB1dF9zaGFwZSwgY29uc3QgZmxvYXQqIGlucHV0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgZmlsdGVyX3NoYXBlLCBjb25zdCBmbG9hdCogZmlsdGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgYmlhc19zaGFwZSwgY29uc3QgZmxvYXQqIGJpYXNfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgUnVudGltZVNoYXBlJiBvdXRwdXRfc2hhcGUsIGZsb2F0KiBvdXRwdXRfZGF0YSkgeworICByZXR1cm4gdGZsaXRlOjpyZWZlcmVuY2Vfb3BzOjpGdWxseUNvbm5lY3RlZCgKKyAgICAgIHBhcmFtcywgaW5wdXRfc2hhcGUsIGlucHV0X2RhdGEsIGZpbHRlcl9zaGFwZSwgZmlsdGVyX2RhdGEsIGJpYXNfc2hhcGUsCisgICAgICBiaWFzX2RhdGEsIG91dHB1dF9zaGFwZSwgb3V0cHV0X2RhdGEpOworfQorI2Vsc2UgIC8vICNpZiAhKGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpKQordm9pZCBTaWdtb2lkKGludDE2X3QqIGRhdGEsIGludDMyX3QgZGF0YV9zaXplKSB7CisgIHhhX25uX3ZlY19zaWdtb2lkX3N5bTE2c19zeW0xNnMoZGF0YSwgZGF0YSwgMCwgMCwgZGF0YV9zaXplKTsKK30KKwordm9pZCBTaWdtb2lkKGZsb2F0KiBkYXRhLCBpbnQzMl90IGRhdGFfc2l6ZSkgeworICBpbnQgZGF0YV9kaW1zWzJdID0gezEsIGRhdGFfc2l6ZX07CisgIFJ1bnRpbWVTaGFwZSBkYXRhX3NoYXBlKDIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50MzJfdCo+KGRhdGFfZGltcykpOworICByZWZlcmVuY2Vfb3BzOjpMb2dpc3RpYyhkYXRhX3NoYXBlLCBkYXRhLCBkYXRhX3NoYXBlLCBkYXRhKTsKK30KKwordm9pZCBUYW5oKGludDMyX3QgY2VsbF9zdGF0ZV9zY2FsZV9wb3dlciwgaW50MTZfdCogaW5wdXRfZGF0YSwKKyAgICAgICAgICBpbnQxNl90KiBvdXRwdXRfZGF0YSwgaW50MzJfdCBkYXRhX3NpemUpIHsKKyAgaW50MzJfdCB0YW5oX2lucHV0X2xlZnRfc2hpZnQgPSAoMTUgKyBjZWxsX3N0YXRlX3NjYWxlX3Bvd2VyKSAtIDM7CisgIGludDMyX3QgaW5wdXRfbXVsdGlwbGllciA9IDA7CisgIGlmICh0YW5oX2lucHV0X2xlZnRfc2hpZnQgPCAwKSAvKiBoYW5kbGluZyBuZWdhdGl2ZSBzaGlmdCB2YWx1ZSAqLworICB7CisgICAgdGFuaF9pbnB1dF9sZWZ0X3NoaWZ0ID0gLXRhbmhfaW5wdXRfbGVmdF9zaGlmdDsKKyNpZiAoZGVmaW5lZChVU0VfSElGSV9BQ1RfVElFKSAmJiBcCisgICAgIChkZWZpbmVkKEFFX1RBTkgxNlg0WDIpIHx8IGRlZmluZWQoQUVfVEFOSDE2WDQpKSkKKyAgICBpbnB1dF9tdWx0aXBsaWVyID0gMTsKKyNlbHNlCisgICAgaW5wdXRfbXVsdGlwbGllciA9IDM7CisjZW5kaWYKKyAgfQorICB4YV9ubl92ZWNfdGFuaF9zeW0xNnNfc3ltMTZzKG91dHB1dF9kYXRhLCBpbnB1dF9kYXRhLCBpbnB1dF9tdWx0aXBsaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhbmhfaW5wdXRfbGVmdF9zaGlmdCwgZGF0YV9zaXplKTsKK30KKwordm9pZCBUYW5oKGludDMyX3QgY2VsbF9zdGF0ZV9zY2FsZV9wb3dlciwgZmxvYXQqIGlucHV0X2RhdGEsIGZsb2F0KiBvdXRwdXRfZGF0YSwKKyAgICAgICAgICBpbnQzMl90IGRhdGFfc2l6ZSkgeworICBpbnQgZGF0YV9kaW1zWzJdID0gezEsIGRhdGFfc2l6ZX07CisgIFJ1bnRpbWVTaGFwZSBkYXRhX3NoYXBlKDIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50MzJfdCo+KGRhdGFfZGltcykpOworICByZWZlcmVuY2Vfb3BzOjpUYW5oKGRhdGFfc2hhcGUsIGlucHV0X2RhdGEsIGRhdGFfc2hhcGUsIG91dHB1dF9kYXRhKTsKK30KKworLy8gSW5wdXQgYW5kIG91dHB1dCBoYXZlIHRoZSBzYW1lIHNoYXBlIGluIExTVE0KK3ZvaWQgTXVsKGNvbnN0IEFyaXRobWV0aWNQYXJhbXMmIHBhcmFtcywgY29uc3QgaW50MTZfdCogaW5wdXQxX2RhdGEsCisgICAgICAgICBjb25zdCBpbnQxNl90KiBpbnB1dDJfZGF0YSwgaW50OF90KiBvdXRwdXRfZGF0YSwgaW50MzJfdCBkYXRhX3NpemUpIHsKKyAgeGFfbm5fZWxtX211bF9zeW0xNnN4c3ltMTZzX2FzeW04cygKKyAgICAgIG91dHB1dF9kYXRhLCBwYXJhbXMub3V0cHV0X29mZnNldCwgcGFyYW1zLm91dHB1dF9zaGlmdCwKKyAgICAgIHBhcmFtcy5vdXRwdXRfbXVsdGlwbGllciwgcGFyYW1zLnF1YW50aXplZF9hY3RpdmF0aW9uX21pbiwKKyAgICAgIHBhcmFtcy5xdWFudGl6ZWRfYWN0aXZhdGlvbl9tYXgsIGlucHV0MV9kYXRhLCBpbnB1dDJfZGF0YSwgZGF0YV9zaXplKTsKK30KKworLy8gSW5wdXQgYW5kIG91dHB1dCBoYXZlIHRoZSBzYW1lIHNoYXBlIGluIExTVE0KK3ZvaWQgTXVsKGNvbnN0IEFyaXRobWV0aWNQYXJhbXMmIHBhcmFtcywgY29uc3QgaW50MTZfdCogaW5wdXQxX2RhdGEsCisgICAgICAgICBjb25zdCBpbnQxNl90KiBpbnB1dDJfZGF0YSwgaW50MTZfdCogb3V0cHV0X2RhdGEsIGludDMyX3QgZGF0YV9zaXplKSB7CisgIGludCBkaW1zXzREWzRdID0gezEsIDEsIDEsIGRhdGFfc2l6ZX07CisgIHhhX25uX2VsbV9tdWxfYnJvYWRjYXN0XzREX3N5bTE2c3hzeW0xNnNfc3ltMTZzKAorICAgICAgb3V0cHV0X2RhdGEsIGRpbXNfNEQsIHBhcmFtcy5vdXRwdXRfc2hpZnQsIHBhcmFtcy5vdXRwdXRfbXVsdGlwbGllciwKKyAgICAgIHBhcmFtcy5xdWFudGl6ZWRfYWN0aXZhdGlvbl9taW4sIHBhcmFtcy5xdWFudGl6ZWRfYWN0aXZhdGlvbl9tYXgsCisgICAgICBpbnB1dDFfZGF0YSwgZGltc180RCwgaW5wdXQyX2RhdGEsIGRpbXNfNEQpOworICByZXR1cm47Cit9CisKKy8vIElucHV0IGFuZCBvdXRwdXQgaGF2ZSB0aGUgc2FtZSBzaGFwZSBpbiBMU1RNCit2b2lkIE11bChjb25zdCBBcml0aG1ldGljUGFyYW1zJiBwYXJhbXMsIGNvbnN0IGZsb2F0KiBpbnB1dDFfZGF0YSwKKyAgICAgICAgIGNvbnN0IGZsb2F0KiBpbnB1dDJfZGF0YSwgZmxvYXQqIG91dHB1dF9kYXRhLCBpbnQzMl90IGRhdGFfc2l6ZSkgeworICBpbnQgZGltc18yRFsyXSA9IHsxLCBkYXRhX3NpemV9OworICBSdW50aW1lU2hhcGUgZGF0YV9zaGFwZSgyLCByZWludGVycHJldF9jYXN0PGNvbnN0IGludDMyX3QqPihkaW1zXzJEKSk7CisgIHJldHVybiByZWZlcmVuY2Vfb3BzOjpNdWwocGFyYW1zLCBkYXRhX3NoYXBlLCBpbnB1dDFfZGF0YSwgZGF0YV9zaGFwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDJfZGF0YSwgZGF0YV9zaGFwZSwgb3V0cHV0X2RhdGEpOworfQorCit2b2lkIEZ1bGx5Q29ubmVjdGVkKGNvbnN0IEZ1bGx5Q29ubmVjdGVkUGFyYW1zJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDhfdCogaW5wdXRfZGF0YSwgY29uc3QgaW50OF90KiBmaWx0ZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCogYmlhc19kYXRhLCBpbnQxNl90KiBvdXRwdXRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG51bV9iYXRjaGVzLCBjb25zdCBpbnQgb3V0cHV0X2RlcHRoLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYWNjdW1fZGVwdGgpIHsKKyNwcmFnbWEgbG9vcF9jb3VudCBtaW4gPSAxCisgIGZvciAoaW50IGIgPSAwOyBiIDwgbnVtX2JhdGNoZXM7IGIrKykgeworICAgIHhhX25uX21hdFh2ZWNfb3V0X3N0cmlkZV9zeW04c3hhc3ltOHNfMTYoCisgICAgICAgIG91dHB1dF9kYXRhICsgYiAqIG91dHB1dF9kZXB0aCwgZmlsdGVyX2RhdGEsCisgICAgICAgIGlucHV0X2RhdGEgKyBiICogYWNjdW1fZGVwdGgsIGJpYXNfZGF0YSwgb3V0cHV0X2RlcHRoLCBhY2N1bV9kZXB0aCwKKyAgICAgICAgYWNjdW1fZGVwdGgsIDEsIHBhcmFtcy5pbnB1dF9vZmZzZXQsIHBhcmFtcy5vdXRwdXRfbXVsdGlwbGllciwKKyAgICAgICAgcGFyYW1zLm91dHB1dF9zaGlmdCk7CisgIH0KKyAgcmV0dXJuOworfQorCit2b2lkIEZ1bGx5Q29ubmVjdGVkKGNvbnN0IEZ1bGx5Q29ubmVjdGVkUGFyYW1zJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QqIGlucHV0X2RhdGEsIGNvbnN0IGludDhfdCogZmlsdGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QqIGJpYXNfZGF0YSwgaW50MTZfdCogb3V0cHV0X2RhdGEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBudW1fYmF0Y2hlcywgY29uc3QgaW50IG91dHB1dF9kZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGFjY3VtX2RlcHRoKSB7CisgIHhhX25uX21hdG11bF9zeW04c3hzeW0xNnNfc3ltMTZzKAorICAgICAgb3V0cHV0X2RhdGEsIGZpbHRlcl9kYXRhLCBpbnB1dF9kYXRhLCBiaWFzX2RhdGEsIG91dHB1dF9kZXB0aCwKKyAgICAgIGFjY3VtX2RlcHRoLCBhY2N1bV9kZXB0aCwgbnVtX2JhdGNoZXMsIGFjY3VtX2RlcHRoLCBvdXRwdXRfZGVwdGgsIDEsCisgICAgICBwYXJhbXMuaW5wdXRfb2Zmc2V0LCBwYXJhbXMub3V0cHV0X211bHRpcGxpZXIsIHBhcmFtcy5vdXRwdXRfc2hpZnQsCisgICAgICBwYXJhbXMub3V0cHV0X29mZnNldCk7CisgIHJldHVybjsKK30KKwordm9pZCBGdWxseUNvbm5lY3RlZChjb25zdCBGdWxseUNvbm5lY3RlZFBhcmFtcyYgcGFyYW1zLCBjb25zdCBmbG9hdCogaW5wdXRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGZpbHRlcl9kYXRhLCBjb25zdCBmbG9hdCogYmlhc19kYXRhLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCogb3V0cHV0X2RhdGEsIGNvbnN0IGludCBudW1fYmF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG91dHB1dF9kZXB0aCwgY29uc3QgaW50IGFjY3VtX2RlcHRoKSB7CisgIGludCBpbnB1dF9kaW1zWzJdID0ge251bV9iYXRjaGVzLCBvdXRwdXRfZGVwdGh9OworICBSdW50aW1lU2hhcGUgaW5wdXRfc2hhcGUoMiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQzMl90Kj4oaW5wdXRfZGltcykpOworICBSdW50aW1lU2hhcGUgYmlhc19zaGFwZSgxLCBiaWFzX2RhdGEgPT0gTlVMTCA/IDAgOiBvdXRwdXRfZGVwdGgpOworICBpbnQgZmlsdGVyX2RpbXNbMl0gPSB7b3V0cHV0X2RlcHRoLCBhY2N1bV9kZXB0aH07CisgIFJ1bnRpbWVTaGFwZSBmaWx0ZXJfc2hhcGUoMiwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQzMl90Kj4oZmlsdGVyX2RpbXMpKTsKKyAgaW50IG91dHB1dF9kaW1zWzJdID0ge251bV9iYXRjaGVzLCBvdXRwdXRfZGVwdGh9OworICBSdW50aW1lU2hhcGUgb3V0cHV0X3NoYXBlKDIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50MzJfdCo+KG91dHB1dF9kaW1zKSk7CisgIHJldHVybiB0ZmxpdGU6OnJlZmVyZW5jZV9vcHM6OkZ1bGx5Q29ubmVjdGVkKAorICAgICAgcGFyYW1zLCBpbnB1dF9zaGFwZSwgaW5wdXRfZGF0YSwgZmlsdGVyX3NoYXBlLCBmaWx0ZXJfZGF0YSwgYmlhc19zaGFwZSwKKyAgICAgIGJpYXNfZGF0YSwgb3V0cHV0X3NoYXBlLCBvdXRwdXRfZGF0YSk7Cit9CisjZW5kaWYgIC8vICNpZiAhKGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpKQorCit2b2lkIENsaXBwaW5nKGNvbnN0IGludCB2X3NpemUsIGNvbnN0IENlbGxTdGF0ZUluZm8mIGNlbGxfc3RhdGVfaW5mbywKKyAgICAgICAgICAgICAgaW50MTZfdCogdmVjdG9yKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdl9zaXplOyBpKyspIHsKKyAgICB2ZWN0b3JbaV0gPQorICAgICAgICBzdGQ6Om1heChzdGQ6Om1pbihjZWxsX3N0YXRlX2luZm8ucXVhbnRpemVkX2NlbGxfY2xpcCwgdmVjdG9yW2ldKSwKKyAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MTZfdD4oLWNlbGxfc3RhdGVfaW5mby5xdWFudGl6ZWRfY2VsbF9jbGlwKSk7CisgIH0KK30KKwordm9pZCBDbGlwcGluZyhjb25zdCBpbnQgdl9zaXplLCBjb25zdCBDZWxsU3RhdGVJbmZvJiBjZWxsX3N0YXRlX2luZm8sCisgICAgICAgICAgICAgIGZsb2F0KiB2ZWN0b3IpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB2X3NpemU7IGkrKykgeworICAgIHZlY3RvcltpXSA9IHN0ZDo6bWF4KHN0ZDo6bWluKGNlbGxfc3RhdGVfaW5mby5jZWxsX2NsaXAsIHZlY3RvcltpXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgLWNlbGxfc3RhdGVfaW5mby5jZWxsX2NsaXApOworICB9Cit9CisKKyNpZiBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQordm9pZCBVcGRhdGVMc3RtQ2VsbChjb25zdCBMc3RtU3RlcE1hbmFnZXImIHN0ZXBfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgVGZMaXRlRXZhbFRlbnNvciogY2VsbF9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgLy8gR2F0ZSBvdXRwdXRzCisgICAgICAgICAgICAgICAgICAgIGludDE2X3QqIGZvcmdldF9nYXRlX291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCogaW5wdXRfZ2F0ZV9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QqIGNlbGxfZ2F0ZV9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgIC8vIE11bCBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyaXRobWV0aWNQYXJhbXMmIGZvcmdldF9jZWxsX211bF9wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyaXRobWV0aWNQYXJhbXMmIGlucHV0X211bF9wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENlbGxTdGF0ZUluZm8mIGNlbGxfc3RhdGVfaW5mbywgaW50MTZfdCogYnVmZmVyKSB7CisgIGF1dG8gY2VsbF9zdGF0ZV9zaGFwZSA9IHN0ZXBfaW5mby5TdGF0ZVNoYXBlKCk7CisgIC8vIENoZWNrIG9mZnNldCB2YWxpZGl0eSB0byBhdm9pZCBtZW1vcnkgb3ZlcmZsb3cKKyAgVEZMSVRFX0RDSEVDS19MRShzdGVwX2luZm8uQ2VsbFN0YXRlT2Zmc2V0KCkgKyBjZWxsX3N0YXRlX3NoYXBlLkZsYXRTaXplKCksCisgICAgICAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoY2VsbF9zdGF0ZSkuRmxhdFNpemUoKSk7CisKKyAgLy8gTXVsdGlwbGllciBpcyBlcXVpdmFsZW50IHRvIDAuNSBoZXJlIHNvIGFkZGluZyAxIHRvIHNoaWZ0cworICB4YV9ubl9sc3RtX2NlbGxfc3RhdGVfdXBkYXRlXzE2KAorICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90PihjZWxsX3N0YXRlKSArCisgICAgICAgICAgc3RlcF9pbmZvLkNlbGxTdGF0ZU9mZnNldCgpLAorICAgICAgZm9yZ2V0X2dhdGVfb3V0cHV0LCBjZWxsX2dhdGVfb3V0cHV0LCBpbnB1dF9nYXRlX291dHB1dCwKKyAgICAgIGZvcmdldF9jZWxsX211bF9wYXJhbXMub3V0cHV0X3NoaWZ0IC0gMSwKKyAgICAgIGlucHV0X211bF9wYXJhbXMub3V0cHV0X3NoaWZ0IC0gMSwgY2VsbF9zdGF0ZV9pbmZvLnF1YW50aXplZF9jZWxsX2NsaXAsCisgICAgICBjZWxsX3N0YXRlX3NoYXBlLkZsYXRTaXplKCkpOworfQorCit2b2lkIFVwZGF0ZUxzdG1DZWxsKGNvbnN0IExzdG1TdGVwTWFuYWdlciYgc3RlcF9pbmZvLAorICAgICAgICAgICAgICAgICAgICBUZkxpdGVFdmFsVGVuc29yKiBjZWxsX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAvLyBHYXRlIG91dHB1dHMKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGZvcmdldF9nYXRlX291dHB1dCwgY29uc3QgZmxvYXQqIGlucHV0X2dhdGVfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogY2VsbF9nYXRlX291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgLy8gTXVsIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJpdGhtZXRpY1BhcmFtcyYgZm9yZ2V0X2NlbGxfbXVsX3BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJpdGhtZXRpY1BhcmFtcyYgaW5wdXRfbXVsX3BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2VsbFN0YXRlSW5mbyYgY2VsbF9zdGF0ZV9pbmZvLCBmbG9hdCogYnVmZmVyKSB7CisgIC8vIENoZWNrIG9mZnNldCB2YWxpZGl0eSB0byBhdm9pZCBtZW1vcnkgb3ZlcmZsb3cKKyAgVEZMSVRFX0RDSEVDS19MRSgKKyAgICAgIHN0ZXBfaW5mby5DZWxsU3RhdGVPZmZzZXQoKSArIHN0ZXBfaW5mby5TdGF0ZVNoYXBlKCkuRmxhdFNpemUoKSwKKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGNlbGxfc3RhdGUpLkZsYXRTaXplKCkpOworCisgIGF1dG8gY2VsbF9zdGF0ZV9zaGFwZSA9IHN0ZXBfaW5mby5TdGF0ZVNoYXBlKCk7CisgIC8vIEZvcmdldCBHYXRlIHggQ2VsbCBTdGF0ZQorICBNdWwoZm9yZ2V0X2NlbGxfbXVsX3BhcmFtcywgZm9yZ2V0X2dhdGVfb3V0cHV0LAorICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxmbG9hdD4oY2VsbF9zdGF0ZSkgKworICAgICAgICAgIHN0ZXBfaW5mby5DZWxsU3RhdGVPZmZzZXQoKSwKKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8ZmxvYXQ+KGNlbGxfc3RhdGUpICsKKyAgICAgICAgICBzdGVwX2luZm8uQ2VsbFN0YXRlT2Zmc2V0KCksCisgICAgICBjZWxsX3N0YXRlX3NoYXBlLkZsYXRTaXplKCkpOworICAvLyBJbnB1dCBHYXRlIHggQ2VsbCBHYXRlCisgIE11bChpbnB1dF9tdWxfcGFyYW1zLCBpbnB1dF9nYXRlX291dHB1dCwgY2VsbF9nYXRlX291dHB1dCwgYnVmZmVyLAorICAgICAgY2VsbF9zdGF0ZV9zaGFwZS5GbGF0U2l6ZSgpKTsKKworICAvLyBVcGRhdGUgdGhlIGNlbGwgc3RhdGUKKyAgQWRkRWxlbWVudFdpc2UodGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxmbG9hdD4oY2VsbF9zdGF0ZSkgKworICAgICAgICAgICAgICAgICAgICAgc3RlcF9pbmZvLkNlbGxTdGF0ZU9mZnNldCgpLAorICAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgIC8qbl9iYXRjaD0qL2NlbGxfc3RhdGVfc2hhcGUuRGltc0RhdGEoKVswXSwKKyAgICAgICAgICAgICAgICAgLypuX3N0YXRlPSovY2VsbF9zdGF0ZV9zaGFwZS5EaW1zRGF0YSgpWzFdLAorICAgICAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGZsb2F0PihjZWxsX3N0YXRlKSArCisgICAgICAgICAgICAgICAgICAgICBzdGVwX2luZm8uQ2VsbFN0YXRlT2Zmc2V0KCkpOworCisgIGlmIChjZWxsX3N0YXRlX2luZm8uY2VsbF9jbGlwID4gMCkgeworICAgIENsaXBwaW5nKGNlbGxfc3RhdGVfc2hhcGUuRmxhdFNpemUoKSwgY2VsbF9zdGF0ZV9pbmZvLAorICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8ZmxvYXQ+KGNlbGxfc3RhdGUpICsKKyAgICAgICAgICAgICAgICAgc3RlcF9pbmZvLkNlbGxTdGF0ZU9mZnNldCgpKTsKKyAgfQorfQorI2VuZGlmICAvLyAjaWYgZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKKworLy8gSW5jcmVtZW50IHRoZSBkYXRhIG9mZnNldCBzbyB0aGUgc2lnbGUgdGltZSBzdGVwIGludm9jYXRpb24gY2FsbCBjYW4gYWNjZXNzCisvLyB0aGUgY29ycmVzcG9uZGluZyBpbnB1dC9vdXRwdXQgdGVuc29yIGRhdGEgYXQgdGhlIHRpbWUgc3RlcAordm9pZCBMc3RtU3RlcE1hbmFnZXI6OlVwZGF0ZVRpbWUoKSB7CisgIGN1cnJlbnRfdGltZV8gKz0gMTsKKyAgVEZMSVRFX0RDSEVDS19MRShjdXJyZW50X3RpbWVfLCBzaXplX2luZm9fLnRpbWVfc3RlcHMpOworICAvLyBkZWZhdWx0IGFzIG9uZSBiYXRjaCBwZXIgaW5mZXJlbmNlCisgIGludCBpbnB1dF9zdGVwID0gc2l6ZV9pbmZvXy5pbnB1dF9kaW1lbnNpb247CisgIGludCBvdXRwdXRfc3RlcCA9IHNpemVfaW5mb18uc3RhdGVfZGltZW5zaW9uOworICAvLyB0aW1lIG1ham9yOiBiYXRjaCBpbmZlcmVuY2UKKyAgaWYgKHNpemVfaW5mb18udGltZV9tYWpvcikgeworICAgIGlucHV0X3N0ZXAgPSBpbnB1dF9zdGVwICogc2l6ZV9pbmZvXy5iYXRjaF9zaXplOworICAgIG91dHB1dF9zdGVwID0gb3V0cHV0X3N0ZXAgKiBzaXplX2luZm9fLmJhdGNoX3NpemU7CisgIH0KKworICBpbnB1dF9vZmZzZXRfICs9IGlucHV0X3N0ZXA7CisgIG91dHB1dF9vZmZzZXRfICs9IG91dHB1dF9zdGVwOworfQorCisvLyBJbmNyZW1lbnQgdGhlIGRhdGEgb2Zmc2V0IHNvIHRoZSBzaWdsZSB0aW1lIHN0ZXAgaW52b2NhdGlvbiBjYWxsIGNhbiBhY2Nlc3MKKy8vIHRoZSBjb3JyZXNwb25kaW5nIGhpZGRlbi9jZWxsIHN0YXRlIHRlbnNvciBkYXRhIGF0IHRoZSB0aW1lIHN0ZXAgKGZvciBzaW5nbGUKKy8vIGJhdGNoIGluZmVyZW5jZSBvbmx5KQordm9pZCBMc3RtU3RlcE1hbmFnZXI6OlVwZGF0ZUJhdGNoKCkgeworICBjdXJyZW50X2JhdGNoXyArPSAxOworICBURkxJVEVfRENIRUNLX0xFKGN1cnJlbnRfYmF0Y2hfLCBzaXplX2luZm9fLmJhdGNoX3NpemUpOworICAvLyBiYXRjaCBpbmZlcmVuY2UgZm9yIHRpbWUgbWFqb3I6IG5vIGFjdGlvbiBuZWVkZWQKKyAgaWYgKHNpemVfaW5mb18udGltZV9tYWpvcikgeworICAgIHJldHVybjsKKyAgfQorICAvLyBvdGhlcndpc2U6IHNpbmdlIGJhdGNoIGluZmVyZW5jZSwgZ28gdG8gdGhlIG5leHQgYmF0Y2gKKyAgaGlkZGVuX3N0YXRlX29mZnNldF8gKz0gc2l6ZV9pbmZvXy5zdGF0ZV9kaW1lbnNpb247CisgIGNlbGxfc3RhdGVfb2Zmc2V0XyArPSBzaXplX2luZm9fLnN0YXRlX2RpbWVuc2lvbjsKK30KKworLy8gSW5wdXQgc2hhcGUgZm9yIGVhY2ggc2luZ2xlIHRpbWUgTFNUTSBpbnZvY2F0aW9uLgorLy8gTXVsdGktYmF0Y2ggZm9yIHRpbWVfbWFqb3IgaW5wdXQKK1J1bnRpbWVTaGFwZSBMc3RtU3RlcE1hbmFnZXI6OklucHV0U2hhcGUoKSBjb25zdCB7CisgIGludCBiYXRjaF9zaXplID0gMTsKKyAgaWYgKHNpemVfaW5mb18udGltZV9tYWpvcikgeworICAgIGJhdGNoX3NpemUgPSBzaXplX2luZm9fLmJhdGNoX3NpemU7CisgIH0KKyAgY29uc3QgaW50IGRpbXNbMl0gPSB7YmF0Y2hfc2l6ZSwgc2l6ZV9pbmZvXy5pbnB1dF9kaW1lbnNpb259OworICBjb25zdCBpbnQzMl90KiBkaW1zX2RhdGEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGludDMyX3QqPihkaW1zKTsKKyAgcmV0dXJuIFJ1bnRpbWVTaGFwZSgyLCBkaW1zX2RhdGEpOworfQorCisvLyBTdGF0ZSBzaGFwZSAoYm90aCBoaWRkZW4gYW5kIGNlbGwpIGZvciBlYWNoIHNpbmdsZSB0aW1lIExTVE0gaW52b2NhdGlvbi4KKy8vIE11bHRpLWJhdGNoIGZvciB0aW1lX21ham9yIGlucHV0CitSdW50aW1lU2hhcGUgTHN0bVN0ZXBNYW5hZ2VyOjpTdGF0ZVNoYXBlKCkgY29uc3QgeworICBpbnQgYmF0Y2hfc2l6ZSA9IDE7CisgIGlmIChzaXplX2luZm9fLnRpbWVfbWFqb3IpIHsKKyAgICBiYXRjaF9zaXplID0gc2l6ZV9pbmZvXy5iYXRjaF9zaXplOworICB9CisgIGNvbnN0IGludCBkaW1zWzJdID0ge2JhdGNoX3NpemUsIHNpemVfaW5mb18uc3RhdGVfZGltZW5zaW9ufTsKKyAgY29uc3QgaW50MzJfdCogZGltc19kYXRhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQzMl90Kj4oZGltcyk7CisgIHJldHVybiBSdW50aW1lU2hhcGUoMiwgZGltc19kYXRhKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGxzdG1faW50ZXJuYWwKIH0gIC8vIG5hbWVzcGFjZSB0ZmxpdGUKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9sc3RtX2V2YWwuaCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9sc3RtX2V2YWwuaAppbmRleCA1ZGQ3NDZhLi4wYmE1ZTIyIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvbHN0bV9ldmFsLmgKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL2xzdG1fZXZhbC5oCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IDIwMjEgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8qIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAKIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTIsMjA1ICsxMiw4MTMgQEAKIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLSNpZm5kZWYgVEVOU09SRkxPV19MSVRFX0tFUk5FTFNfTFNUTV9FVkFMX0hfCi0jZGVmaW5lIFRFTlNPUkZMT1dfTElURV9LRVJORUxTX0xTVE1fRVZBTF9IXwogCisvLyBGdW5jdGlvbnMgdG8gcGVyZm9ybSBpbnRlZ2VyIGV2YXVsYXRpb24gZm9yIHN0YW5kYXJkIExTVE0gKGUuZy4sIGRlZmluZWQgaW4KKy8vIHRoZSBrZXJhcyBsc3RtIGxheWVyLCBubyBwZWVwaG9sZSBldGMuKS4gQ3VycmVudGx5IHVzZWQgYnkgdGhlIDE2IGJpdHMKKy8vIGFjdGl2YXRpb24gY2FzZSBvbmx5CisKKyNpZm5kZWYgVEVOU09SRkxPV19MSVRFX01JQ1JPX0tFUk5FTFNfTFNUTV9FVkFMX0dFTkVSQUxfSF8KKyNkZWZpbmUgVEVOU09SRkxPV19MSVRFX01JQ1JPX0tFUk5FTFNfTFNUTV9FVkFMX0dFTkVSQUxfSF8KKyNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8Y3N0ZGludD4KLSNpbmNsdWRlIDxtZW1vcnk+CiAKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvYy9idWlsdGluX29wX2RhdGEuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvYy9jb21tb24uaCIKLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9wb3J0YWJsZV90ZW5zb3JfdXRpbHMuaCIKLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9yZWZlcmVuY2UvcG9ydGFibGVfdGVuc29yX3V0aWxzX2ltcGwuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9rZXJuZWxfdXRpbC5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2xzdG1fc2hhcmVkLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL3h0ZW5zYS5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19sb2cuaCIKIAogbmFtZXNwYWNlIHRmbGl0ZSB7Ci1uYW1lc3BhY2Ugb3BzIHsKLW5hbWVzcGFjZSBtaWNybyB7Ci1uYW1lc3BhY2UgbHN0bV9ldmFsIHsKIAotI2lmIGRlZmluZWQoSElGSTUpCi12b2lkIGNhbGNfY2VsbF9zdGF0ZV93aXRob3V0X2NpZmcoaW50MTZfdCogY2VsbF9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90KiBmb3JnZXRfZ2F0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90KiBjZWxsX2dhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCogaW5wdXRfZ2F0ZSwgaW50IHNoaWZ0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2hpZnQyLCBpbnQgY2xpcCwgaW50IG51bV9lbG1zKTsKKy8vIEludGVyZmFjZSB0byBhY2Nlc3MgYWxsIHRoZSBUZW1wVGZMaXRlVGVuc29ycyBvZiB0aGUgTFNUTSBrZXJuZWwgZHVyaW5nIHRoZQorLy8gcHJlcGFyYXRpb24gcGhhc2UuIENhbiBvbmx5IGJlIGNvbnN0cnVjdGVkIHRocm91Z2ggdGhlIGNvbnN0cnVjdG9yIHRvIGF2b2lkCisvLyBtZW1vcnkgbGVha2FnZS4gQWxsIFRlbXBUZkxpdGVUZW5zb3JzIHdpbGwgYmUgZGVhbGxvY2F0ZWQgdGhyb3VnaCB0aGUKKy8vIGRlc3RydWN0b3IuCitjbGFzcyBMc3RtVGVuc29ycyB7CisgcHVibGljOgorICBMc3RtVGVuc29ycyhjb25zdCBMc3RtVGVuc29ycyYgb3RoZXIpID0gZGVsZXRlOworICBMc3RtVGVuc29ycyYgb3BlcmF0b3I9KGNvbnN0IExzdG1UZW5zb3JzJiBvdGhlcikgPSBkZWxldGU7CiAKLXZvaWQgY2FsY19jZWxsX3N0YXRlX3dpdGhfY2lmZyhpbnQxNl90KiBjZWxsX3N0YXRlLCBjb25zdCBpbnQxNl90KiBmb3JnZXRfZ2F0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90KiBjZWxsX2dhdGUsIGludCBzaGlmdDEsIGludCBzaGlmdDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXAsIGludCBudW1fZWxtcyk7CisgIExzdG1UZW5zb3JzKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpOworICB+THN0bVRlbnNvcnMoKTsKIAotdm9pZCB4YV9ubl9lbG1fbXVsXzE2eDE2X2FzeW04cyhpbnQ4X3QqIG91dHB1dCwgY29uc3QgaW50MTZfdCogaW5wdXRfMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCogaW5wdXRfMiwgaW50MzJfdCBtdWx0aXBsaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNoaWZ0LCBpbnQzMl90IHplcm9fcG9pbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1fZWxtcyk7Ci0jZW5kaWYgIC8vIGRlZmluZWQoSElGSTUpCisgIC8vIFZlcmlmeSB0aGUgTFNUTSBpbnRlcm5hbCB0ZW5zb3IgcHJvcGVydGllcyAoZS5nLiwgdHlwZSBjaGVja3MpCisgIC8vIElucHV0L291dHB1dC9zdGF0ZXMvZmMgd2VpZ2h0cyB0ZW5zb3JzIGFyZSByZXF1aXJlZCBmb3Iga2VybmVsIGV2YXVsYXRpb24uCisgIC8vIFRoZSBzdGF0ZSB0ZW5zb3JzIHNob3VsZCBiZSB2YXJpYWJsZXMuIFZhcmlhbnRzIG9mIHRoZSBzdGFuZGFyZCBMU1RNCisgIC8vIGFyZSBub3Qgc3VwcG9ydGVkIGhlcmUsIHRoZXJlZm9yZSB0aGVpciBjb3JyZXNwb25kaW5nIHRlbnNvcnMgc2hvdWxkIGJlCisgIC8vIGludmFsaWQKKyAgVGZMaXRlU3RhdHVzIFZhbGlkYXRlVGVuc29yU3RhdHVzKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQpIGNvbnN0OwogCi0vLyBQYW1hbWV0ZXJzIGZvciBpbnRlZ2VyIExTVE0uCi0vLyBDb25zaWRlciBzcGxpdCB0aGlzIGludG8gdHdvIEludGVnZXIgUGFyYW1ldGVycyBpZiBtb3JlIGZpZWxkcyBhcmUgYWRkZWQuCi1zdHJ1Y3QgSW50ZWdlckxzdG1QYXJhbWV0ZXIgewotICBpbnQzMl90IGVmZmVjdGl2ZV9pbnB1dF90b19pbnB1dF9zY2FsZV9hOwotICBpbnQgZWZmZWN0aXZlX2lucHV0X3RvX2lucHV0X3NjYWxlX2I7Ci0gIGludDMyX3QgZWZmZWN0aXZlX3JlY3VycmVudF90b19pbnB1dF9zY2FsZV9hOwotICBpbnQgZWZmZWN0aXZlX3JlY3VycmVudF90b19pbnB1dF9zY2FsZV9iOwotICBpbnQzMl90IGVmZmVjdGl2ZV9jZWxsX3RvX2lucHV0X3NjYWxlX2E7Ci0gIGludCBlZmZlY3RpdmVfY2VsbF90b19pbnB1dF9zY2FsZV9iOwotICBpbnQzMl90IGVmZmVjdGl2ZV9pbnB1dF90b19mb3JnZXRfc2NhbGVfYTsKLSAgaW50IGVmZmVjdGl2ZV9pbnB1dF90b19mb3JnZXRfc2NhbGVfYjsKLSAgaW50MzJfdCBlZmZlY3RpdmVfcmVjdXJyZW50X3RvX2ZvcmdldF9zY2FsZV9hOwotICBpbnQgZWZmZWN0aXZlX3JlY3VycmVudF90b19mb3JnZXRfc2NhbGVfYjsKLSAgaW50MzJfdCBlZmZlY3RpdmVfY2VsbF90b19mb3JnZXRfc2NhbGVfYTsKLSAgaW50IGVmZmVjdGl2ZV9jZWxsX3RvX2ZvcmdldF9zY2FsZV9iOwotICBpbnQzMl90IGVmZmVjdGl2ZV9pbnB1dF90b19jZWxsX3NjYWxlX2E7Ci0gIGludCBlZmZlY3RpdmVfaW5wdXRfdG9fY2VsbF9zY2FsZV9iOwotICBpbnQzMl90IGVmZmVjdGl2ZV9yZWN1cnJlbnRfdG9fY2VsbF9zY2FsZV9hOwotICBpbnQgZWZmZWN0aXZlX3JlY3VycmVudF90b19jZWxsX3NjYWxlX2I7Ci0gIGludDMyX3QgZWZmZWN0aXZlX2lucHV0X3RvX291dHB1dF9zY2FsZV9hOwotICBpbnQgZWZmZWN0aXZlX2lucHV0X3RvX291dHB1dF9zY2FsZV9iOwotICBpbnQzMl90IGVmZmVjdGl2ZV9yZWN1cnJlbnRfdG9fb3V0cHV0X3NjYWxlX2E7Ci0gIGludCBlZmZlY3RpdmVfcmVjdXJyZW50X3RvX291dHB1dF9zY2FsZV9iOwotICBpbnQzMl90IGVmZmVjdGl2ZV9jZWxsX3RvX291dHB1dF9zY2FsZV9hOwotICBpbnQgZWZmZWN0aXZlX2NlbGxfdG9fb3V0cHV0X3NjYWxlX2I7Ci0gIGludDMyX3QgZWZmZWN0aXZlX3Byb2pfc2NhbGVfYTsKLSAgaW50IGVmZmVjdGl2ZV9wcm9qX3NjYWxlX2I7Ci0gIGludDMyX3QgZWZmZWN0aXZlX2hpZGRlbl9zY2FsZV9hOwotICBpbnQgZWZmZWN0aXZlX2hpZGRlbl9zY2FsZV9iOwotICBpbnQzMl90IGxheWVyX25vcm1faW5wdXRfc2NhbGVfYTsKLSAgaW50IGxheWVyX25vcm1faW5wdXRfc2NhbGVfYjsKLSAgaW50MzJfdCBsYXllcl9ub3JtX2ZvcmdldF9zY2FsZV9hOwotICBpbnQgbGF5ZXJfbm9ybV9mb3JnZXRfc2NhbGVfYjsKLSAgaW50MzJfdCBsYXllcl9ub3JtX2NlbGxfc2NhbGVfYTsKLSAgaW50IGxheWVyX25vcm1fY2VsbF9zY2FsZV9iOwotICBpbnQzMl90IGxheWVyX25vcm1fb3V0cHV0X3NjYWxlX2E7Ci0gIGludCBsYXllcl9ub3JtX291dHB1dF9zY2FsZV9iOwotICAvLyBRdWFudGl6ZWQgY2xpcCB2YWx1ZSBmb3IgY2VsbCBhbmQgcHJvamVjdGlvbi4gWmVybyB2YWx1ZSBtZWFucyBubyBjbGlwcGluZy4KLSAgaW50MTZfdCBxdWFudGl6ZWRfY2VsbF9jbGlwOwotICBpbnQ4X3QgcXVhbnRpemVkX3Byb2pfY2xpcDsKLSAgaW50MzJfdCBoaWRkZW5fenA7Ci0gIGludDMyX3QgY2VsbF9zY2FsZTsKKyAgLy8gSW50ZXJuYWwgdGVuc29ycy4gc2VlIGxzdG1fc2hhcmVkLmggZm9yIHRlbnNvciBuYW1lcworICBjb25zdCBUZkxpdGVUZW5zb3IqIEdldEludGVybmFsVGVuc29yKGNvbnN0IGludCB0ZW5zb3JfaW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWxfdGVuc29yc19bdGVuc29yX2luZGV4XTsKKyAgfQogCi0gIGludDMyX3QgaW5wdXRfdmFyaWFuY2VfZ3VhcmQ7Ci0gIGludDMyX3QgZm9yZ2V0X3ZhcmlhbmNlX2d1YXJkOwotICBpbnQzMl90IGNlbGxfdmFyaWFuY2VfZ3VhcmQ7Ci0gIGludDMyX3Qgb3V0cHV0X3ZhcmlhbmNlX2d1YXJkOworICBjb25zdCBUZkxpdGVUZW5zb3IqIEhpZGRlblN0YXRlVGVuc29yKCkgY29uc3QgeworICAgIHJldHVybiBpbnRlcm5hbF90ZW5zb3JzX1trTHN0bU91dHB1dFN0YXRlVGVuc29yXTsKKyAgfQorICBjb25zdCBUZkxpdGVUZW5zb3IqIENlbGxTdGF0ZVRlbnNvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gaW50ZXJuYWxfdGVuc29yc19ba0xzdG1DZWxsU3RhdGVUZW5zb3JdOworICB9CisgIGNvbnN0IFRmTGl0ZVRlbnNvciogT3V0cHV0VGVuc29yKCkgY29uc3QgeyByZXR1cm4gb3V0cHV0X3RlbnNvcl87IH0KIAotICAvLyBQcmUtY2FsY3VsYXRlIGJpYXMgKyB6ZXJvX3BvaW50ICogd2VpZ2h0LgotICAvLyBVbmFibGVkIHRvIHVzZSB0ZW1wb3JhcnkgdGVuc29ycyBzaW5jZSB0aG9zZSBhcmUgdXNlZCBpbiBQcmVwYXJlKCkgYW5kCi0gIC8vIHNjcmF0Y2ggYnVmZmVyIGlzIG9ubHkgYWxsb2NhdGVkIGFmdGVyIFByZWFwcmUoKS4KLSAgc3RkOjp1bmlxdWVfcHRyPGludDMyX3RbXT4gaW5wdXRfdG9fZm9yZ2V0X2VmZmVjdGl2ZV9iaWFzOwotICBzdGQ6OnVuaXF1ZV9wdHI8aW50MzJfdFtdPiByZWN1cnJlbnRfdG9fZm9yZ2V0X2VmZmVjdGl2ZV9iaWFzOwotICBzdGQ6OnVuaXF1ZV9wdHI8aW50MzJfdFtdPiBpbnB1dF90b19jZWxsX2VmZmVjdGl2ZV9iaWFzOwotICBzdGQ6OnVuaXF1ZV9wdHI8aW50MzJfdFtdPiByZWN1cnJlbnRfdG9fY2VsbF9lZmZlY3RpdmVfYmlhczsKLSAgc3RkOjp1bmlxdWVfcHRyPGludDMyX3RbXT4gaW5wdXRfdG9fb3V0cHV0X2VmZmVjdGl2ZV9iaWFzOwotICBzdGQ6OnVuaXF1ZV9wdHI8aW50MzJfdFtdPiByZWN1cnJlbnRfdG9fb3V0cHV0X2VmZmVjdGl2ZV9iaWFzOwotICBzdGQ6OnVuaXF1ZV9wdHI8aW50MzJfdFtdPiBpbnB1dF90b19pbnB1dF9lZmZlY3RpdmVfYmlhczsKLSAgc3RkOjp1bmlxdWVfcHRyPGludDMyX3RbXT4gcmVjdXJyZW50X3RvX2lucHV0X2VmZmVjdGl2ZV9iaWFzOwotICBzdGQ6OnVuaXF1ZV9wdHI8aW50MzJfdFtdPiBwcm9qZWN0aW9uX2VmZmVjdGl2ZV9iaWFzOwotCi0gIC8vIFNjYWxlIGFuZCB6ZXJvIHBvaW50IGZvciBpbnRlcm1lZGlhdGUgdGVuc29ycy4KLSAgLy8gVXNlZCBvbmx5IGluIHRoZSA4eDhfOCBjYXNlLgotICBpbnQzMl90IGludGVybWVkaWF0ZV9zY2FsZV9hWzhdOwotICBpbnQzMl90IGludGVybWVkaWF0ZV9zY2FsZV9iWzhdOwotICBpbnQzMl90IGludGVybWVkaWF0ZV96cFsxMl07CisgcHJpdmF0ZToKKyAgLy8gc2VlIGxzdG1fc2hhcmVkLmggZm9yIHRlbnNvciBuYW1lcworICBNaWNyb0NvbnRleHQqIG1pY3JvX2NvbnRleHRfOworICBUZkxpdGVUZW5zb3IqIGludGVybmFsX3RlbnNvcnNfWzI0XTsKKyAgVGZMaXRlVGVuc29yKiBvdXRwdXRfdGVuc29yXzsKIH07CiAKLVRmTGl0ZVN0YXR1cyBFdmFsRmxvYXQoY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0X3RvX2lucHV0X3dlaWdodHMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0X3RvX2ZvcmdldF93ZWlnaHRzLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dF90b19jZWxsX3dlaWdodHMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0X3RvX291dHB1dF93ZWlnaHRzLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiByZWN1cnJlbnRfdG9faW5wdXRfd2VpZ2h0cywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogcmVjdXJyZW50X3RvX2ZvcmdldF93ZWlnaHRzLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiByZWN1cnJlbnRfdG9fY2VsbF93ZWlnaHRzLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiByZWN1cnJlbnRfdG9fb3V0cHV0X3dlaWdodHMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGNlbGxfdG9faW5wdXRfd2VpZ2h0cywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogY2VsbF90b19mb3JnZXRfd2VpZ2h0cywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogY2VsbF90b19vdXRwdXRfd2VpZ2h0cywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXRfbGF5ZXJfbm9ybV9jb2VmZmljaWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGZvcmdldF9sYXllcl9ub3JtX2NvZWZmaWNpZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogY2VsbF9sYXllcl9ub3JtX2NvZWZmaWNpZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogb3V0cHV0X2xheWVyX25vcm1fY29lZmZpY2llbnRzLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBhdXhfaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGF1eF9pbnB1dF90b19pbnB1dF93ZWlnaHRzLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBhdXhfaW5wdXRfdG9fZm9yZ2V0X3dlaWdodHMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGF1eF9pbnB1dF90b19jZWxsX3dlaWdodHMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGF1eF9pbnB1dF90b19vdXRwdXRfd2VpZ2h0cywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXRfZ2F0ZV9iaWFzLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBmb3JnZXRfZ2F0ZV9iaWFzLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBjZWxsX2dhdGVfYmlhcywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogb3V0cHV0X2dhdGVfYmlhcywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogcHJvamVjdGlvbl93ZWlnaHRzLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBwcm9qZWN0aW9uX2JpYXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZUxTVE1QYXJhbXMqIHBhcmFtcywgYm9vbCBmb3J3YXJkX3NlcXVlbmNlLAotICAgICAgICAgICAgICAgICAgICAgICBib29sIHRpbWVfbWFqb3IsIGludCBvdXRwdXRfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICBUZkxpdGVFdmFsVGVuc29yKiBzY3JhdGNoX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgVGZMaXRlRXZhbFRlbnNvciogb3V0cHV0X3N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICBUZkxpdGVFdmFsVGVuc29yKiBjZWxsX3N0YXRlLCBUZkxpdGVFdmFsVGVuc29yKiBvdXRwdXQpOworLy8gRGVkdWNlIHRoZSBzaXplIGluZm9ybWF0aW9uIChCYXRjaCAoQiksIFRpbWUgU3RlcHMgKFQpLCBJbnB1dCBkaW1lbnNpb24gKEkpLAorLy8gU3RhdGUgZGltZW5zaW9uIChTKSkgdGhhdCBkZWZpbmVzIHRoZSBMU1RNIHVzaW5nIHRoZSBpbnB1dCBhbmQgaGlkZGVuIHN0YXRlCisvLyB0ZW5zb3IKK0xzdG1TaXplSW5mbyBDcmVhdGVMc3RtU2l6ZUluZm8oCisgICAgY29uc3QgYm9vbCB0aW1lX21ham9yLCBjb25zdCBUZkxpdGVJbnRBcnJheSogaW5wdXRfdGVuc29yX3NoYXBlLAorICAgIGNvbnN0IFRmTGl0ZUludEFycmF5KiBoaWRkZW5fc3RhdGVfdGVuc29yX3NoYXBlKTsKIAotVGZMaXRlU3RhdHVzIEV2YWxJbnRlZ2VyOHg4XzE2KAotICAgIFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUsIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0LAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0X3RvX2lucHV0X3dlaWdodHMsCi0gICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXRfdG9fZm9yZ2V0X3dlaWdodHMsCi0gICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXRfdG9fY2VsbF93ZWlnaHRzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0X3RvX291dHB1dF93ZWlnaHRzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIHJlY3VycmVudF90b19pbnB1dF93ZWlnaHRzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIHJlY3VycmVudF90b19mb3JnZXRfd2VpZ2h0cywKLSAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiByZWN1cnJlbnRfdG9fY2VsbF93ZWlnaHRzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIHJlY3VycmVudF90b19vdXRwdXRfd2VpZ2h0cywKLSAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBjZWxsX3RvX2lucHV0X3dlaWdodHMsCi0gICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogY2VsbF90b19mb3JnZXRfd2VpZ2h0cywKLSAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBjZWxsX3RvX291dHB1dF93ZWlnaHRzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0X2xheWVyX25vcm1fY29lZmZpY2llbnRzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGZvcmdldF9sYXllcl9ub3JtX2NvZWZmaWNpZW50cywKLSAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBjZWxsX2xheWVyX25vcm1fY29lZmZpY2llbnRzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dF9sYXllcl9ub3JtX2NvZWZmaWNpZW50cywKLSAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dF9nYXRlX2JpYXMsCi0gICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogZm9yZ2V0X2dhdGVfYmlhcywKLSAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBjZWxsX2dhdGVfYmlhcywKLSAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBvdXRwdXRfZ2F0ZV9iaWFzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIHByb2plY3Rpb25fd2VpZ2h0cywKLSAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBwcm9qZWN0aW9uX2JpYXMsIGNvbnN0IFRmTGl0ZUxTVE1QYXJhbXMqIHBhcmFtcywKLSAgICBib29sIGZvcndhcmRfc2VxdWVuY2UsIGJvb2wgdGltZV9tYWpvciwKLSAgICBjb25zdCBsc3RtX2V2YWw6OkludGVnZXJMc3RtUGFyYW1ldGVyKiBpbnRlZ2VyX2xzdG1fcGFyYW0sCi0gICAgVGZMaXRlRXZhbFRlbnNvciogb3V0cHV0X3N0YXRlLCBUZkxpdGVFdmFsVGVuc29yKiBjZWxsX3N0YXRlLAotICAgIFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dCwgVGZMaXRlRXZhbFRlbnNvciogc2NyYXRjaDAsCi0gICAgVGZMaXRlRXZhbFRlbnNvciogc2NyYXRjaDEsIFRmTGl0ZUV2YWxUZW5zb3IqIHNjcmF0Y2gyLAotICAgIFRmTGl0ZUV2YWxUZW5zb3IqIHNjcmF0Y2gzLCBUZkxpdGVFdmFsVGVuc29yKiBzY3JhdGNoNCwKLSAgICBUZkxpdGVFdmFsVGVuc29yKiBzY3JhdGNoNSk7CitUZkxpdGVTdGF0dXMgVmFsaWRhdGVXZWlnaHRUZW5zb3JTaXplKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZVRlbnNvciogdGVuc29yLCBpbnQgZGltMV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGltMl9zaXplKTsKIAotVGZMaXRlU3RhdHVzIEV2YWxJbnRlZ2VyOHg4XzgoCi0gICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXQsCi0gICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXRfdG9faW5wdXRfd2VpZ2h0cywKLSAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dF90b19mb3JnZXRfd2VpZ2h0cywKLSAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dF90b19jZWxsX3dlaWdodHMsCi0gICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXRfdG9fb3V0cHV0X3dlaWdodHMsCi0gICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogcmVjdXJyZW50X3RvX2lucHV0X3dlaWdodHMsCi0gICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogcmVjdXJyZW50X3RvX2ZvcmdldF93ZWlnaHRzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIHJlY3VycmVudF90b19jZWxsX3dlaWdodHMsCi0gICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogcmVjdXJyZW50X3RvX291dHB1dF93ZWlnaHRzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGNlbGxfdG9faW5wdXRfd2VpZ2h0cywKLSAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBjZWxsX3RvX2ZvcmdldF93ZWlnaHRzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGNlbGxfdG9fb3V0cHV0X3dlaWdodHMsCi0gICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXRfbGF5ZXJfbm9ybV9jb2VmZmljaWVudHMsCi0gICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogZm9yZ2V0X2xheWVyX25vcm1fY29lZmZpY2llbnRzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGNlbGxfbGF5ZXJfbm9ybV9jb2VmZmljaWVudHMsCi0gICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogb3V0cHV0X2xheWVyX25vcm1fY29lZmZpY2llbnRzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0X2dhdGVfYmlhcywKLSAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBmb3JnZXRfZ2F0ZV9iaWFzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGNlbGxfZ2F0ZV9iaWFzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dF9nYXRlX2JpYXMsCi0gICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogcHJvamVjdGlvbl93ZWlnaHRzLAotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIHByb2plY3Rpb25fYmlhcywgY29uc3QgVGZMaXRlTFNUTVBhcmFtcyogcGFyYW1zLAotICAgIFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dF9zdGF0ZSwgVGZMaXRlRXZhbFRlbnNvciogY2VsbF9zdGF0ZSwKLSAgICBUZkxpdGVFdmFsVGVuc29yKiBvdXRwdXQsCi0gICAgY29uc3QgbHN0bV9ldmFsOjpJbnRlZ2VyTHN0bVBhcmFtZXRlciogaW50ZWdlcl9sc3RtX3BhcmFtLAotICAgIFRmTGl0ZUV2YWxUZW5zb3IqIHNjcmF0Y2gwLCBUZkxpdGVFdmFsVGVuc29yKiBzY3JhdGNoMSwKLSAgICBUZkxpdGVFdmFsVGVuc29yKiBzY3JhdGNoMiwgVGZMaXRlRXZhbFRlbnNvciogc2NyYXRjaDMsCi0gICAgVGZMaXRlRXZhbFRlbnNvciogc2NyYXRjaDQsIFRmTGl0ZUV2YWxUZW5zb3IqIHNjcmF0Y2g1LAotICAgIFRmTGl0ZUV2YWxUZW5zb3IqIHNjcmF0Y2g2LCBUZkxpdGVFdmFsVGVuc29yKiBzY3JhdGNoNyk7CitUZkxpdGVTdGF0dXMgVmFsaWRhdGVCaWFzVGVuc29yU2l6ZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGZMaXRlVGVuc29yKiB0ZW5zb3IsIGludCBzaXplKTsKIAotfSAgLy8gbmFtZXNwYWNlIGxzdG1fZXZhbAotfSAgLy8gbmFtZXNwYWNlIG1pY3JvCi19ICAvLyBuYW1lc3BhY2Ugb3BzCisvLyBHbyB0aHJvdWdoIGV2ZXJ5IHRlbnNvcnMgYW5kIG1ha2Ugc3VyZSB0aGVpciBzaGFwZSBtYXRjaCB0aGUga2VybmVsCisvLyBjb25maWd1cmF0aW9uCitUZkxpdGVTdGF0dXMgVmFsaWRhdGVUZW5zb3JTaXplKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExzdG1UZW5zb3JzJiB0ZW5zb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMc3RtU2l6ZUluZm8mIHNpemVfaW5mbyk7CisKKy8vIFdyYXBwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGdhdGUgcGFyYW1ldGVycyBmb3IgdGhlIGZvdXIgaW50ZXJuYWwgTFNUTSBnYXRlcworVGZMaXRlU3RhdHVzIENyZWF0ZUdhdGVQYXJhbXMoCisgICAgVGZMaXRlQ29udGV4dCogY29udGV4dCwKKyAgICAvKklucHV0IHRlbnNvcnMqLworICAgIGNvbnN0IFRmTGl0ZVRlbnNvciogaW5wdXQsIGNvbnN0IFRmTGl0ZVRlbnNvciogaW5wdXRfd2VpZ2h0LAorICAgIGNvbnN0IFRmTGl0ZVRlbnNvciogaW5wdXRfYmlhcywKKyAgICAvKkhpZGRlbiBzdGF0ZSB0ZW5zb3JzKi8KKyAgICBjb25zdCBUZkxpdGVUZW5zb3IqIGhpZGRlbl9zdGF0ZSwgY29uc3QgVGZMaXRlVGVuc29yKiBoaWRkZW5fc3RhdGVfd2VpZ2h0LAorICAgIGNvbnN0IFRmTGl0ZVRlbnNvciogaGlkZGVuX3N0YXRlX2JpYXMsCisgICAgLypTY2FsZSBvZiB0aGUgZmMgb3V0cHV0IChpbnB1dCB0byBub24tbGluZWFyIGFjdGl2YXRpb24pKi8KKyAgICBjb25zdCBmbG9hdCBub25saW5lYXJfYWN0aXZhdGlvbl9pbnB1dF9zY2FsZSwgY29uc3QgVGZMaXRlVHlwZSBjZWxsX3R5cGUsCisgICAgY29uc3QgdGZsaXRlOjpHYXRlUGFyYW1ldGVycyYgZ2F0ZV9wYXJhbXMpOworCisvLyBDcmVhdGUgcGFyYW1ldGVycyBmb3IgZWxlbWVudCB3aXNlIG11bHRpcGxpY2F0aW9uIHRoYXQgaGFwcGVucyBpbiBhKSBjZWxsCisvLyBzdGF0ZSB1cGRhdGUgOyBiKSBoaWRkZW4gc3RhdGUgdXBkYXRlCisvLyBOb3RlIHRoYXQgYWxsIHRoZSBvdXRwdXQgb2YgZ2F0ZXMgYXJlIHN5bW1ldHJpY2FsbHkgcXVhbnRpemVkIHNvIG9ubHkgc2NhbGVzCisvLyBhcmUgcmVxdWlyZWQgZm9yIGlucHV0LiBIb3dldmVyLCBkdXJpbmcgdGhlIGhpZGRlbiBzdGF0ZSB1cGRhdGUgcGhhc2UsIHRoZQorLy8gb3V0cHV0IGlzIHRoZSB1cGRhdGVkIGhpZGRlbiBzdGF0ZSwgd2hpY2ggaXMgYXN5bW1ldHJpY2FsbHkgcXVhbnRpemVkLiBUaHVzCisvLyBvdXRwdXQgbWF5IHJlcXVpcmUgemVybyBwb2ludAordGZsaXRlOjpBcml0aG1ldGljUGFyYW1zIENyZWF0ZUludGVyR2F0ZU11bFBhcmFtcyhjb25zdCBmbG9hdCBpbnB1dDFfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IGlucHV0Ml9zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgb3V0cHV0X3NjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZkxpdGVUeXBlIG91dHB1dF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgb3V0cHV0X3pwID0gMCk7CisKKy8vIENyZWF0ZSB0aGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2VsbCBzdGF0ZSwgd2hpY2ggaW5jbHVkZToKKy8vIGNlbGxfc3RhdGVfc2NhbGVfcG93ZXI6IHVzZWQgaW4gaW50ZWdlciBub25saW5lYXIgZnVuY3Rpb24gKGUuZy4sIHRhbmgpCisvLyBxdWFudGl6ZWRfY2VsbF9jbGlwOiBxdWFudGl6ZWQgY2VsbCBjbGlwIHJhbmdlCitDZWxsU3RhdGVJbmZvIENyZWF0ZUxzdG1DZWxsU3RhdGVJbmZvKGNvbnN0IGZsb2F0IGNlbGxfc3RhdGVfc2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IGNlbGxfY2xpcCk7CisKK0NlbGxTdGF0ZUluZm8gQ3JlYXRlTHN0bUNlbGxTdGF0ZUluZm9GbG9hdChjb25zdCBmbG9hdCBjZWxsX2NsaXApOwordGZsaXRlOjpGdWxseUNvbm5lY3RlZFBhcmFtcyBDcmVhdGVGQ1BhcmFtc0Zsb2F0KCk7CisKK3RmbGl0ZTo6R2F0ZVBhcmFtZXRlcnMgQ3JlYXRlR2F0ZVBhcmFtc0Zsb2F0KCk7CisKK3RmbGl0ZTo6QXJpdGhtZXRpY1BhcmFtcyBDcmVhdGVJbnRlckdhdGVNdWxQYXJhbXNGbG9hdCgpOworCitUZkxpdGVTdGF0dXMgUHJlcGFyZUdhdGVQYXJhbWV0ZXJzRmxvYXQoVGZMaXRlQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMc3RtVGVuc29ycyYgbHN0bV90ZW5zb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wRGF0YUxTVE0qIG9wX2RhdGFfbHN0bSk7CisKK1RmTGl0ZVN0YXR1cyBQcmVwYXJlR2F0ZVBhcmFtZXRlcnNJbnRlZ2VyKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMc3RtVGVuc29ycyYgbHN0bV90ZW5zb3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BEYXRhTFNUTSogb3BfZGF0YV9sc3RtKTsKKworTFNUTUtlcm5lbENvbnRlbnRzIENyZWF0ZUxTVE1LZXJuZWxDb250ZW50KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGZMaXRlTm9kZSogbm9kZSk7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDZWxsVHlwZT4KK0xTVE1CdWZmZXJzPENlbGxUeXBlPiBDcmVhdGVMU1RNQnVmZmVycyhUZkxpdGVDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCogYnVmZmVyX2luZGljZXMpIHsKKyAgTFNUTUJ1ZmZlcnM8Q2VsbFR5cGU+IGJ1ZmZlcnM7CisgIGJ1ZmZlcnMuYnVmZmVyMCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2VsbFR5cGUqPigKKyAgICAgIGNvbnRleHQtPkdldFNjcmF0Y2hCdWZmZXIoY29udGV4dCwgYnVmZmVyX2luZGljZXNbMF0pKTsKKyAgYnVmZmVycy5idWZmZXIxID0gcmVpbnRlcnByZXRfY2FzdDxDZWxsVHlwZSo+KAorICAgICAgY29udGV4dC0+R2V0U2NyYXRjaEJ1ZmZlcihjb250ZXh0LCBidWZmZXJfaW5kaWNlc1sxXSkpOworICBidWZmZXJzLmJ1ZmZlcjIgPSByZWludGVycHJldF9jYXN0PENlbGxUeXBlKj4oCisgICAgICBjb250ZXh0LT5HZXRTY3JhdGNoQnVmZmVyKGNvbnRleHQsIGJ1ZmZlcl9pbmRpY2VzWzJdKSk7CisgIGJ1ZmZlcnMuYnVmZmVyMyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q2VsbFR5cGUqPigKKyAgICAgIGNvbnRleHQtPkdldFNjcmF0Y2hCdWZmZXIoY29udGV4dCwgYnVmZmVyX2luZGljZXNbM10pKTsKKyAgcmV0dXJuIGJ1ZmZlcnM7Cit9CisKKy8vIFNpbmNlIExTVE0gaW5jbHVkZXMgbXVsdGlwbGUgaW50ZXJtZWRpYXRlIHN0YWdlcywgaW50cm9kdWNpbmcgdGhlIGludGVybmFsCisvLyBuYW1lc3BhY2UgdG8gZXhwb3NlIHRoZW0gZm9yIHRlc3RpbmcKK25hbWVzcGFjZSBsc3RtX2ludGVybmFsIHsKKworI2lmICEoZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkpCit2b2lkIFNpZ21vaWQoY29uc3QgUnVudGltZVNoYXBlJiBkYXRhX3NoYXBlLCBpbnQxNl90KiBkYXRhKTsKKwordm9pZCBTaWdtb2lkKGNvbnN0IFJ1bnRpbWVTaGFwZSYgZGF0YV9zaGFwZSwgZmxvYXQqIGRhdGEpOworCit2b2lkIFRhbmgoaW50MzJfdCBjZWxsX3N0YXRlX3NjYWxlX3Bvd2VyLCBjb25zdCBSdW50aW1lU2hhcGUmIGlucHV0X2RhdGFfc2hhcGUsCisgICAgICAgICAgaW50MTZfdCogaW5wdXRfZGF0YSwgY29uc3QgUnVudGltZVNoYXBlJiBvdXRwdXRfZGF0YV9zaGFwZSwKKyAgICAgICAgICBpbnQxNl90KiBvdXRwdXRfZGF0YSk7CisKK3ZvaWQgVGFuaChpbnQzMl90IGNlbGxfc3RhdGVfc2NhbGVfcG93ZXIsIGNvbnN0IFJ1bnRpbWVTaGFwZSYgaW5wdXRfZGF0YV9zaGFwZSwKKyAgICAgICAgICBmbG9hdCogaW5wdXRfZGF0YSwgY29uc3QgUnVudGltZVNoYXBlJiBvdXRwdXRfZGF0YV9zaGFwZSwKKyAgICAgICAgICBmbG9hdCogb3V0cHV0X2RhdGEpOworCit2b2lkIE11bChjb25zdCBSdW50aW1lU2hhcGUmIHNoYXBlLCBjb25zdCBBcml0aG1ldGljUGFyYW1zJiBwYXJhbXMsCisgICAgICAgICBjb25zdCBpbnQxNl90KiBpbnB1dDFfZGF0YSwgY29uc3QgaW50MTZfdCogaW5wdXQyX2RhdGEsCisgICAgICAgICBpbnQ4X3QqIG91dHB1dF9kYXRhKTsKKwordm9pZCBNdWwoY29uc3QgUnVudGltZVNoYXBlJiBzaGFwZSwgY29uc3QgQXJpdGhtZXRpY1BhcmFtcyYgcGFyYW1zLAorICAgICAgICAgY29uc3QgaW50MTZfdCogaW5wdXQxX2RhdGEsIGNvbnN0IGludDE2X3QqIGlucHV0Ml9kYXRhLAorICAgICAgICAgaW50MTZfdCogb3V0cHV0X2RhdGEpOworCit2b2lkIE11bChjb25zdCBSdW50aW1lU2hhcGUmIHNoYXBlLCBjb25zdCBBcml0aG1ldGljUGFyYW1zJiBwYXJhbXMsCisgICAgICAgICBjb25zdCBmbG9hdCogaW5wdXQxX2RhdGEsIGNvbnN0IGZsb2F0KiBpbnB1dDJfZGF0YSwKKyAgICAgICAgIGZsb2F0KiBvdXRwdXRfZGF0YSk7CisKK3ZvaWQgRnVsbHlDb25uZWN0ZWQoY29uc3QgRnVsbHlDb25uZWN0ZWRQYXJhbXMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgUnVudGltZVNoYXBlJiBpbnB1dF9zaGFwZSwgY29uc3QgaW50OF90KiBpbnB1dF9kYXRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBSdW50aW1lU2hhcGUmIGZpbHRlcl9zaGFwZSwgY29uc3QgaW50OF90KiBmaWx0ZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgUnVudGltZVNoYXBlJiBiaWFzX3NoYXBlLCBjb25zdCBpbnQzMl90KiBiaWFzX2RhdGEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgb3V0cHV0X3NoYXBlLCBpbnQxNl90KiBvdXRwdXRfZGF0YSk7CisKK3ZvaWQgRnVsbHlDb25uZWN0ZWQoY29uc3QgRnVsbHlDb25uZWN0ZWRQYXJhbXMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgUnVudGltZVNoYXBlJiBpbnB1dF9zaGFwZSwgY29uc3QgaW50MTZfdCogaW5wdXRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgUnVudGltZVNoYXBlJiBmaWx0ZXJfc2hhcGUsIGNvbnN0IGludDhfdCogZmlsdGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgYmlhc19zaGFwZSwgY29uc3QgaW50NjRfdCogYmlhc19kYXRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBSdW50aW1lU2hhcGUmIG91dHB1dF9zaGFwZSwgaW50MTZfdCogb3V0cHV0X2RhdGEpOworCit2b2lkIEZ1bGx5Q29ubmVjdGVkKGNvbnN0IEZ1bGx5Q29ubmVjdGVkUGFyYW1zJiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgaW5wdXRfc2hhcGUsIGNvbnN0IGZsb2F0KiBpbnB1dF9kYXRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBSdW50aW1lU2hhcGUmIGZpbHRlcl9zaGFwZSwgY29uc3QgZmxvYXQqIGZpbHRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBSdW50aW1lU2hhcGUmIGJpYXNfc2hhcGUsIGNvbnN0IGZsb2F0KiBiaWFzX2RhdGEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgb3V0cHV0X3NoYXBlLCBmbG9hdCogb3V0cHV0X2RhdGEpOworI2Vsc2UgICAvLyAjaWYgIShkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KSkKK3ZvaWQgU2lnbW9pZChpbnQxNl90KiBkYXRhLCBpbnQzMl90IGRhdGFfc2l6ZSk7CisKK3ZvaWQgU2lnbW9pZChmbG9hdCogZGF0YSwgaW50MzJfdCBkYXRhX3NpemUpOworCit2b2lkIFRhbmgoaW50MzJfdCBjZWxsX3N0YXRlX3NjYWxlX3Bvd2VyLCBpbnQxNl90KiBpbnB1dF9kYXRhLAorICAgICAgICAgIGludDE2X3QqIG91dHB1dF9kYXRhLCBpbnQzMl90IGRhdGFfc2l6ZSk7CisKK3ZvaWQgVGFuaChpbnQzMl90IGNlbGxfc3RhdGVfc2NhbGVfcG93ZXIsIGZsb2F0KiBpbnB1dF9kYXRhLCBmbG9hdCogb3V0cHV0X2RhdGEsCisgICAgICAgICAgaW50MzJfdCBkYXRhX3NpemUpOworCit2b2lkIE11bChjb25zdCBBcml0aG1ldGljUGFyYW1zJiBwYXJhbXMsIGNvbnN0IGludDE2X3QqIGlucHV0MV9kYXRhLAorICAgICAgICAgY29uc3QgaW50MTZfdCogaW5wdXQyX2RhdGEsIGludDhfdCogb3V0cHV0X2RhdGEsIGludDMyX3QgZGF0YV9zaXplKTsKKwordm9pZCBNdWwoY29uc3QgQXJpdGhtZXRpY1BhcmFtcyYgcGFyYW1zLCBjb25zdCBpbnQxNl90KiBpbnB1dDFfZGF0YSwKKyAgICAgICAgIGNvbnN0IGludDE2X3QqIGlucHV0Ml9kYXRhLCBpbnQxNl90KiBvdXRwdXRfZGF0YSwgaW50MzJfdCBkYXRhX3NpemUpOworCit2b2lkIE11bChjb25zdCBBcml0aG1ldGljUGFyYW1zJiBwYXJhbXMsIGNvbnN0IGZsb2F0KiBpbnB1dDFfZGF0YSwKKyAgICAgICAgIGNvbnN0IGZsb2F0KiBpbnB1dDJfZGF0YSwgZmxvYXQqIG91dHB1dF9kYXRhLCBpbnQzMl90IGRhdGFfc2l6ZSk7CisKK3ZvaWQgRnVsbHlDb25uZWN0ZWQoY29uc3QgRnVsbHlDb25uZWN0ZWRQYXJhbXMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50OF90KiBpbnB1dF9kYXRhLCBjb25zdCBpbnQ4X3QqIGZpbHRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90KiBiaWFzX2RhdGEsIGludDE2X3QqIG91dHB1dF9kYXRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgbnVtX2JhdGNoZXMsIGNvbnN0IGludCBvdXRwdXRfZGVwdGgsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBhY2N1bV9kZXB0aCk7CisKK3ZvaWQgRnVsbHlDb25uZWN0ZWQoY29uc3QgRnVsbHlDb25uZWN0ZWRQYXJhbXMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCogaW5wdXRfZGF0YSwgY29uc3QgaW50OF90KiBmaWx0ZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCogYmlhc19kYXRhLCBpbnQxNl90KiBvdXRwdXRfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG51bV9iYXRjaGVzLCBjb25zdCBpbnQgb3V0cHV0X2RlcHRoLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgYWNjdW1fZGVwdGgpOworCit2b2lkIEZ1bGx5Q29ubmVjdGVkKGNvbnN0IEZ1bGx5Q29ubmVjdGVkUGFyYW1zJiBwYXJhbXMsIGNvbnN0IGZsb2F0KiBpbnB1dF9kYXRhLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogZmlsdGVyX2RhdGEsIGNvbnN0IGZsb2F0KiBiaWFzX2RhdGEsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0KiBvdXRwdXRfZGF0YSwgY29uc3QgaW50IG51bV9iYXRjaGVzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgb3V0cHV0X2RlcHRoLCBjb25zdCBpbnQgYWNjdW1fZGVwdGgpOworI2VuZGlmICAvLyAjaWYgIShkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KSkKKwordm9pZCBBZGRFbGVtZW50V2lzZShjb25zdCBpbnQxNl90KiBpbnB1dF8xLCBjb25zdCBpbnQxNl90KiBpbnB1dF8yLCBpbnQgbl9iYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgaW50IG5faW5wdXQsIGludDE2X3QqIG91dHB1dCk7CisKK3ZvaWQgQWRkRWxlbWVudFdpc2UoY29uc3QgZmxvYXQqIGlucHV0XzEsIGNvbnN0IGZsb2F0KiBpbnB1dF8yLCBpbnQgbl9iYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgaW50IG5faW5wdXQsIGZsb2F0KiBvdXRwdXQpOworCit2b2lkIENsaXBwaW5nKGNvbnN0IGludCB2X3NpemUsIGNvbnN0IENlbGxTdGF0ZUluZm8mIGNlbGxfc3RhdGVfaW5mbywKKyAgICAgICAgICAgICAgaW50MTZfdCogdmVjdG9yKTsKKwordm9pZCBDbGlwcGluZyhjb25zdCBpbnQgdl9zaXplLCBjb25zdCBDZWxsU3RhdGVJbmZvJiBjZWxsX3N0YXRlX2luZm8sCisgICAgICAgICAgICAgIGZsb2F0KiB2ZWN0b3IpOworCisvLyBNYW5hZ2VzIHRoZSBzbGljZSBwb3NpdGlvbiAob2Zmc2V0KSwgc2xpY2UgbGVuZ3RoIChzbGljZWQgdGVuc29yIHNoYXBlKSwKKy8vIGFuZCB1cGRhdGUgcnVsZXMgZm9yIGlucHV0L291dHB1dC9oaWRkZW4gc3RhdGUvY2VsbCBzdGF0ZSB0ZW5zb3JzIGF0IGVhY2gKKy8vIHRpbWUgc3RlcC4KK2NsYXNzIExzdG1TdGVwTWFuYWdlciB7CisgcHVibGljOgorICBMc3RtU3RlcE1hbmFnZXIoKSA9IGRlbGV0ZTsKKyAgLy8gRG9lcyBub3QgdGFrZSBhbnkgb3duZXJzaGlwLCBhbmQgYWxsIHBvaW50ZXJzIG11c3QgcmVmZXIgdG8gdmFsaWQgb2JqZWN0cworICAvLyB0aGF0IG91dGxpdmUgdGhlIG9uZSBjb25zdHJ1Y3RlZC4KKyAgZXhwbGljaXQgTHN0bVN0ZXBNYW5hZ2VyKGNvbnN0IExzdG1TaXplSW5mbyogc2l6ZV9pbmZvKQorICAgICAgOiBzaXplX2luZm9fKCpzaXplX2luZm8pIHt9CisKKyAgdm9pZCBVcGRhdGVUaW1lKCk7CisgIHZvaWQgVXBkYXRlQmF0Y2goKTsKKworICB2b2lkIFJlc2V0VGltZSgpIHsgY3VycmVudF90aW1lXyA9IDA7IH0KKyAgUnVudGltZVNoYXBlIElucHV0U2hhcGUoKSBjb25zdDsKKyAgUnVudGltZVNoYXBlIFN0YXRlU2hhcGUoKSBjb25zdDsKKworICBpbnQgSW5wdXRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBpbnB1dF9vZmZzZXRfOyB9CisgIGludCBPdXRwdXRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBvdXRwdXRfb2Zmc2V0XzsgfQorICBpbnQgSGlkZGVuU3RhdGVPZmZzZXQoKSBjb25zdCB7IHJldHVybiBoaWRkZW5fc3RhdGVfb2Zmc2V0XzsgfQorICBpbnQgQ2VsbFN0YXRlT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gY2VsbF9zdGF0ZV9vZmZzZXRfOyB9CisjaWYgZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKKyAgaW50IHRpbWVfbWFqb3IoKSBjb25zdCB7IHJldHVybiBzaXplX2luZm9fLnRpbWVfbWFqb3I7IH0KKworICBpbnQgYmF0Y2hfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNpemVfaW5mb18uYmF0Y2hfc2l6ZTsgfQorCisgIGludCBpbnB1dF9kaW1lbnNpb24oKSBjb25zdCB7IHJldHVybiBzaXplX2luZm9fLmlucHV0X2RpbWVuc2lvbjsgfQorCisgIGludCBzdGF0ZV9kaW1lbnNpb24oKSBjb25zdCB7IHJldHVybiBzaXplX2luZm9fLnN0YXRlX2RpbWVuc2lvbjsgfQorI2VuZGlmCisKKyBwcml2YXRlOgorICBpbnQgY3VycmVudF90aW1lXyA9IDA7CisgIGludCBjdXJyZW50X2JhdGNoXyA9IDA7CisgIGludCBpbnB1dF9vZmZzZXRfID0gMDsKKyAgaW50IG91dHB1dF9vZmZzZXRfID0gMDsKKyAgaW50IGhpZGRlbl9zdGF0ZV9vZmZzZXRfID0gMDsKKyAgaW50IGNlbGxfc3RhdGVfb2Zmc2V0XyA9IDA7CisgIC8vIFNpemVpbmZvIGlzIGZyb20gTHN0bU9wRGF0YSwgd2hpY2ggcmVzaWRlIGluIHRoZSBtZW1vcnkgYXJlbmEKKyAgLy8gKGd1YXJhbnRlIHRvIG91dGxhc3QgTFNUTVN0ZXBNYW5hZ2VyLCB3aGljaCByZXNpZGUgaW4gc3RhY2spCisgIGNvbnN0IExzdG1TaXplSW5mbyYgc2l6ZV9pbmZvXzsKK307CisKKy8vIENhbGN1bGF0ZXMgYSBzaW5nbGUgTFNUTSBnYXRlLgorLy8gSW1wbGVtZW50cyB0aGUgZm9sbG93aW5nIGZvcm11bGE6CisvLyAgIGdhdGUgPSBhY3RpdmF0ZShGQyhpbnB1dCkgKyBGQyhyZWN1cnJlbnQpKQorLy8gQWN0aXZhdGlvbiBpcyBzaWdtb2lkIGV4Y2VwdCBmb3IgdGhlICJjZWxsIiBnYXRlIChjb25maWd1cmFibGUsIHVzdWFsbHkgdGFuaCkKKyNpZiAhKGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpKQordGVtcGxhdGUgPHR5cGVuYW1lIEFjdGl2YXRpb25UeXBlLCB0eXBlbmFtZSBXZWlnaHRUeXBlLCB0eXBlbmFtZSBDZWxsVHlwZSwKKyAgICAgICAgICB0eXBlbmFtZSBCaWFzVHlwZT4KK3ZvaWQgQ2FsY3VsYXRlTHN0bUdhdGUoCisgICAgY29uc3QgTHN0bVN0ZXBNYW5hZ2VyJiBzdGVwX2luZm8sIGNvbnN0IEdhdGVQYXJhbWV0ZXJzJiBnYXRlX3BhcmFtcywKKyAgICAvLyBJbnB1dCBGQworICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0LCBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dF93ZWlnaHQsCisgICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXRfYmlhcywKKyAgICAvLyBSZWN1cnJlbnQgRkMKKyAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiByZWN1cnJlbnQsIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIHJlY3VycmVudF93ZWlnaHQsCisgICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogcmVjdXJyZW50X2JpYXMsCisgICAgLy8gT3V0cHV0CisgICAgQ2VsbFR5cGUqIGdhdGVfb3V0cHV0LAorICAgIC8vIFNjcmF0Y2ggYXJyYXlzCisgICAgQ2VsbFR5cGUqIGZjX291dHB1dF9idWZmZXIsIGNvbnN0IFRmTGl0ZUZ1c2VkQWN0aXZhdGlvbiBhY3RpdmF0aW9uKSB7CisgIGNvbnN0IGF1dG8gZ2F0ZV9vdXRwdXRfc2hhcGUgPSBzdGVwX2luZm8uU3RhdGVTaGFwZSgpOworICAvLyBDaGVjayBvZmZzZXQgdmFsaWRpdHkgdG8gYXZvaWQgbWVtb3J5IG92ZXJmbG93CisgIFRGTElURV9EQ0hFQ0tfTEUoc3RlcF9pbmZvLklucHV0T2Zmc2V0KCkgKyBzdGVwX2luZm8uSW5wdXRTaGFwZSgpLkZsYXRTaXplKCksCisgICAgICAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoaW5wdXQpLkZsYXRTaXplKCkpOworICBURkxJVEVfRENIRUNLX0xFKAorICAgICAgc3RlcF9pbmZvLkhpZGRlblN0YXRlT2Zmc2V0KCkgKyBzdGVwX2luZm8uU3RhdGVTaGFwZSgpLkZsYXRTaXplKCksCisgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShyZWN1cnJlbnQpLkZsYXRTaXplKCkpOworCisgIC8vIElucHV0IEZDCisgIEZ1bGx5Q29ubmVjdGVkKGdhdGVfcGFyYW1zLmlucHV0X2ZjX3BhcmFtcywgc3RlcF9pbmZvLklucHV0U2hhcGUoKSwKKyAgICAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxBY3RpdmF0aW9uVHlwZT4oaW5wdXQpICsKKyAgICAgICAgICAgICAgICAgICAgIHN0ZXBfaW5mby5JbnB1dE9mZnNldCgpLAorICAgICAgICAgICAgICAgICBtaWNybzo6R2V0VGVuc29yU2hhcGUoaW5wdXRfd2VpZ2h0KSwKKyAgICAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxXZWlnaHRUeXBlPihpbnB1dF93ZWlnaHQpLAorICAgICAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShpbnB1dF9iaWFzKSwKKyAgICAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0T3B0aW9uYWxUZW5zb3JEYXRhPEJpYXNUeXBlPihpbnB1dF9iaWFzKSwKKyAgICAgICAgICAgICAgICAgZ2F0ZV9vdXRwdXRfc2hhcGUsIGdhdGVfb3V0cHV0KTsKKworICAvLyBSZWN1cnJlbnQgRkMKKyAgRnVsbHlDb25uZWN0ZWQoZ2F0ZV9wYXJhbXMucmVjdXJyZW50X2ZjX3BhcmFtcywgc3RlcF9pbmZvLlN0YXRlU2hhcGUoKSwKKyAgICAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxBY3RpdmF0aW9uVHlwZT4ocmVjdXJyZW50KSArCisgICAgICAgICAgICAgICAgICAgICBzdGVwX2luZm8uSGlkZGVuU3RhdGVPZmZzZXQoKSwKKyAgICAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUocmVjdXJyZW50X3dlaWdodCksCisgICAgICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8V2VpZ2h0VHlwZT4ocmVjdXJyZW50X3dlaWdodCksCisgICAgICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKHJlY3VycmVudF9iaWFzKSwKKyAgICAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0T3B0aW9uYWxUZW5zb3JEYXRhPEJpYXNUeXBlPihyZWN1cnJlbnRfYmlhcyksCisgICAgICAgICAgICAgICAgIGdhdGVfb3V0cHV0X3NoYXBlLCBmY19vdXRwdXRfYnVmZmVyKTsKKworICBBZGRFbGVtZW50V2lzZShnYXRlX291dHB1dCwgZmNfb3V0cHV0X2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgLypuX2JhdGNoPSovZ2F0ZV9vdXRwdXRfc2hhcGUuRGltc0RhdGEoKVswXSwKKyAgICAgICAgICAgICAgICAgLypuX3N0YXRlPSovZ2F0ZV9vdXRwdXRfc2hhcGUuRGltc0RhdGEoKVsxXSwgZ2F0ZV9vdXRwdXQpOworICAvLyBBcHBseSBhY3RpdmF0aW9uCisgIHN3aXRjaCAoYWN0aXZhdGlvbikgeworICAgIGNhc2Uga1RmTGl0ZUFjdFNpZ21vaWQ6CisgICAgICBTaWdtb2lkKGdhdGVfb3V0cHV0X3NoYXBlLCBnYXRlX291dHB1dCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGtUZkxpdGVBY3RUYW5oOiB7CisgICAgICAvLyBTZXQgdGhlIHNjYWxlIHBvd2VyIHRvIC0xMiB0byBhdm9pZCBzaGlmdAorICAgICAgVGFuaCgvKmNlbGxfc3RhdGVfc2NhbGVfcG93ZXI9Ki8tMTIsIGdhdGVfb3V0cHV0X3NoYXBlLCBnYXRlX291dHB1dCwKKyAgICAgICAgICAgZ2F0ZV9vdXRwdXRfc2hhcGUsIGdhdGVfb3V0cHV0KTsKKyAgICB9IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAvLyBPbmx5IFNpZ21vaWQgb3IgVGFuaCBpcyB1c2VkLgorICAgICAgVEZMSVRFX0FTU0VSVF9GQUxTRTsKKyAgfQorfQorCisvLyBVcGRhdGUgdGhlIGNlbGwgc3RhdGUgdXNpbmcgdGhlIG91dHB1dCBmcm9tIHRoZSBmb3JnZXQgZ2F0ZSwgaW5wdXQgZ2F0ZSwgYW5kCisvLyBjZWxsIGdhdGUgRm9ybXVsYTogdXBkYXRlZF9jZWxsX3N0YXRlID0gZm9yZ2V0X2dhdGVfb3V0cHV0KmNlbGxfc3RhdGUgKworLy8gaW5wdXRfZ2F0ZV9vdXRwdXQgKiBjZWxsX2dhdGVfb3V0cHV0LCB3aGVyZSAqIGRlbm90ZXMgZWxlbWVudCB3aXNlCisvLyBtdWx0aXBsaWNhdGlvbgordGVtcGxhdGUgPHR5cGVuYW1lIENlbGxUeXBlPgordm9pZCBVcGRhdGVMc3RtQ2VsbChjb25zdCBMc3RtU3RlcE1hbmFnZXImIHN0ZXBfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgVGZMaXRlRXZhbFRlbnNvciogY2VsbF9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgLy8gR2F0ZSBvdXRwdXRzCisgICAgICAgICAgICAgICAgICAgIENlbGxUeXBlKiBmb3JnZXRfZ2F0ZV9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENlbGxUeXBlKiBpbnB1dF9nYXRlX291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2VsbFR5cGUqIGNlbGxfZ2F0ZV9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgIC8vIE11bCBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyaXRobWV0aWNQYXJhbXMmIGZvcmdldF9jZWxsX211bF9wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyaXRobWV0aWNQYXJhbXMmIGlucHV0X211bF9wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENlbGxTdGF0ZUluZm8mIGNlbGxfc3RhdGVfaW5mbywgQ2VsbFR5cGUqIGJ1ZmZlcikgeworICAvLyBDaGVjayBvZmZzZXQgdmFsaWRpdHkgdG8gYXZvaWQgbWVtb3J5IG92ZXJmbG93CisgIFRGTElURV9EQ0hFQ0tfTEUoCisgICAgICBzdGVwX2luZm8uQ2VsbFN0YXRlT2Zmc2V0KCkgKyBzdGVwX2luZm8uU3RhdGVTaGFwZSgpLkZsYXRTaXplKCksCisgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShjZWxsX3N0YXRlKS5GbGF0U2l6ZSgpKTsKKworICBhdXRvIGNlbGxfc3RhdGVfc2hhcGUgPSBzdGVwX2luZm8uU3RhdGVTaGFwZSgpOworICAvLyBGb3JnZXQgR2F0ZSB4IENlbGwgU3RhdGUKKyAgTXVsKGNlbGxfc3RhdGVfc2hhcGUsIGZvcmdldF9jZWxsX211bF9wYXJhbXMsIGZvcmdldF9nYXRlX291dHB1dCwKKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8Q2VsbFR5cGU+KGNlbGxfc3RhdGUpICsKKyAgICAgICAgICBzdGVwX2luZm8uQ2VsbFN0YXRlT2Zmc2V0KCksCisgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPENlbGxUeXBlPihjZWxsX3N0YXRlKSArCisgICAgICAgICAgc3RlcF9pbmZvLkNlbGxTdGF0ZU9mZnNldCgpKTsKKyAgLy8gSW5wdXQgR2F0ZSB4IENlbGwgR2F0ZQorICBNdWwoY2VsbF9zdGF0ZV9zaGFwZSwgaW5wdXRfbXVsX3BhcmFtcywgaW5wdXRfZ2F0ZV9vdXRwdXQsIGNlbGxfZ2F0ZV9vdXRwdXQsCisgICAgICBidWZmZXIpOworCisgIC8vIFVwZGF0ZSB0aGUgY2VsbCBzdGF0ZQorICBBZGRFbGVtZW50V2lzZSh0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPENlbGxUeXBlPihjZWxsX3N0YXRlKSArCisgICAgICAgICAgICAgICAgICAgICBzdGVwX2luZm8uQ2VsbFN0YXRlT2Zmc2V0KCksCisgICAgICAgICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgLypuX2JhdGNoPSovY2VsbF9zdGF0ZV9zaGFwZS5EaW1zRGF0YSgpWzBdLAorICAgICAgICAgICAgICAgICAvKm5fc3RhdGU9Ki9jZWxsX3N0YXRlX3NoYXBlLkRpbXNEYXRhKClbMV0sCisgICAgICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8Q2VsbFR5cGU+KGNlbGxfc3RhdGUpICsKKyAgICAgICAgICAgICAgICAgICAgIHN0ZXBfaW5mby5DZWxsU3RhdGVPZmZzZXQoKSk7CisKKyAgaWYgKGNlbGxfc3RhdGVfaW5mby5jZWxsX2NsaXAgPiAwKSB7CisgICAgQ2xpcHBpbmcoY2VsbF9zdGF0ZV9zaGFwZS5GbGF0U2l6ZSgpLCBjZWxsX3N0YXRlX2luZm8sCisgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxDZWxsVHlwZT4oY2VsbF9zdGF0ZSkgKworICAgICAgICAgICAgICAgICBzdGVwX2luZm8uQ2VsbFN0YXRlT2Zmc2V0KCkpOworICB9Cit9CisjZWxzZSAgIC8vICNpZiAhKGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpKQordGVtcGxhdGUgPHR5cGVuYW1lIEFjdGl2YXRpb25UeXBlLCB0eXBlbmFtZSBXZWlnaHRUeXBlLCB0eXBlbmFtZSBDZWxsVHlwZSwKKyAgICAgICAgICB0eXBlbmFtZSBCaWFzVHlwZT4KK3ZvaWQgQ2FsY3VsYXRlTHN0bUdhdGUoCisgICAgY29uc3QgTHN0bVN0ZXBNYW5hZ2VyJiBzdGVwX2luZm8sIGNvbnN0IEdhdGVQYXJhbWV0ZXJzJiBnYXRlX3BhcmFtcywKKyAgICAvLyBJbnB1dCBGQworICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0LCBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dF93ZWlnaHQsCisgICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXRfYmlhcywKKyAgICAvLyBSZWN1cnJlbnQgRkMKKyAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiByZWN1cnJlbnQsIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIHJlY3VycmVudF93ZWlnaHQsCisgICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogcmVjdXJyZW50X2JpYXMsCisgICAgLy8gT3V0cHV0CisgICAgQ2VsbFR5cGUqIGdhdGVfb3V0cHV0LAorICAgIC8vIFNjcmF0Y2ggYXJyYXlzCisgICAgQ2VsbFR5cGUqIGZjX291dHB1dF9idWZmZXIsIGNvbnN0IFRmTGl0ZUZ1c2VkQWN0aXZhdGlvbiBhY3RpdmF0aW9uLAorICAgIGNvbnN0IGludCBudW1fYmF0Y2hlcywgY29uc3QgaW50IGlucHV0X2RpbWVuc2lvbiwKKyAgICBjb25zdCBpbnQgc3RhdGVfZGltZW5zaW9uKSB7CisgIC8vIFJ1bnRpbWVTaGFwZSBzdGVwX2lucHV0X3NoYXBlID0gc3RlcF9pbmZvLklucHV0U2hhcGUoKTsKKyAgLy8gUnVudGltZVNoYXBlIGlucHV0X3NoYXBlID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoaW5wdXQpOworICAvLyBSdW50aW1lU2hhcGUgc3RlcF9zdGF0ZV9zaGFwZSA9IHN0ZXBfaW5mby5TdGF0ZVNoYXBlKCk7CisgIC8vIFJ1bnRpbWVTaGFwZSByZWN1cnJlbnRfc2hhcGUgPSB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShyZWN1cnJlbnQpOworCisgIC8vIE1vdmVkIHRoZXNlIHRvIExzdG1TdGVwIGZ1bmN0aW9uCisgIC8vIENoZWNrIG9mZnNldCB2YWxpZGl0eSB0byBhdm9pZCBtZW1vcnkgb3ZlcmZsb3cKKyAgLy8gVEZMSVRFX0RDSEVDS19MRShzdGVwX2luZm8uSW5wdXRPZmZzZXQoKSArIHN0ZXBfaW5wdXRfc2hhcGUuRmxhdFNpemUoKSwKKyAgLy8gaW5wdXRfc2hhcGUuRmxhdFNpemUoKSk7CisgIC8vIFRGTElURV9EQ0hFQ0tfTEUoCisgIC8vIHN0ZXBfaW5mby5IaWRkZW5TdGF0ZU9mZnNldCgpICsgc3RlcF9zdGF0ZV9zaGFwZS5GbGF0U2l6ZSgpLAorICAvLyByZWN1cnJlbnRfc2hhcGUuRmxhdFNpemUoKSk7CisKKyAgLy8gSW5wdXQgRkMKKyAgRnVsbHlDb25uZWN0ZWQoZ2F0ZV9wYXJhbXMuaW5wdXRfZmNfcGFyYW1zLAorICAgICAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPEFjdGl2YXRpb25UeXBlPihpbnB1dCkgKworICAgICAgICAgICAgICAgICAgICAgc3RlcF9pbmZvLklucHV0T2Zmc2V0KCksCisgICAgICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8V2VpZ2h0VHlwZT4oaW5wdXRfd2VpZ2h0KSwKKyAgICAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0T3B0aW9uYWxUZW5zb3JEYXRhPEJpYXNUeXBlPihpbnB1dF9iaWFzKSwKKyAgICAgICAgICAgICAgICAgZ2F0ZV9vdXRwdXQsIG51bV9iYXRjaGVzLCBzdGF0ZV9kaW1lbnNpb24sIGlucHV0X2RpbWVuc2lvbik7CisKKyAgLy8gUmVjdXJyZW50IEZDCisgIEZ1bGx5Q29ubmVjdGVkKGdhdGVfcGFyYW1zLnJlY3VycmVudF9mY19wYXJhbXMsCisgICAgICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8QWN0aXZhdGlvblR5cGU+KHJlY3VycmVudCkgKworICAgICAgICAgICAgICAgICAgICAgc3RlcF9pbmZvLkhpZGRlblN0YXRlT2Zmc2V0KCksCisgICAgICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8V2VpZ2h0VHlwZT4ocmVjdXJyZW50X3dlaWdodCksCisgICAgICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldE9wdGlvbmFsVGVuc29yRGF0YTxCaWFzVHlwZT4ocmVjdXJyZW50X2JpYXMpLAorICAgICAgICAgICAgICAgICBmY19vdXRwdXRfYnVmZmVyLCBudW1fYmF0Y2hlcywgc3RhdGVfZGltZW5zaW9uLAorICAgICAgICAgICAgICAgICBzdGF0ZV9kaW1lbnNpb24pOworCisgIEFkZEVsZW1lbnRXaXNlKGdhdGVfb3V0cHV0LCBmY19vdXRwdXRfYnVmZmVyLAorICAgICAgICAgICAgICAgICAvKm5fYmF0Y2g9Ki9udW1fYmF0Y2hlcywKKyAgICAgICAgICAgICAgICAgLypuX3N0YXRlPSovc3RhdGVfZGltZW5zaW9uLCBnYXRlX291dHB1dCk7CisgIC8vIEFwcGx5IGFjdGl2YXRpb24KKyAgc3dpdGNoIChhY3RpdmF0aW9uKSB7CisgICAgY2FzZSBrVGZMaXRlQWN0U2lnbW9pZDoKKyAgICAgIFNpZ21vaWQoZ2F0ZV9vdXRwdXQsIG51bV9iYXRjaGVzICogc3RhdGVfZGltZW5zaW9uKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2Uga1RmTGl0ZUFjdFRhbmg6IHsKKyAgICAgIC8vIFNldCB0aGUgc2NhbGUgcG93ZXIgdG8gLTEyIHRvIGF2b2lkIHNoaWZ0CisgICAgICBUYW5oKC8qY2VsbF9zdGF0ZV9zY2FsZV9wb3dlcj0qLy0xMiwgZ2F0ZV9vdXRwdXQsIGdhdGVfb3V0cHV0LAorICAgICAgICAgICBudW1fYmF0Y2hlcyAqIHN0YXRlX2RpbWVuc2lvbik7CisgICAgfSBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgLy8gT25seSBTaWdtb2lkIG9yIFRhbmggaXMgdXNlZC4KKyAgICAgIFRGTElURV9BU1NFUlRfRkFMU0U7CisgIH0KK30KKworLy8gVXBkYXRlIHRoZSBjZWxsIHN0YXRlIHVzaW5nIHRoZSBvdXRwdXQgZnJvbSB0aGUgZm9yZ2V0IGdhdGUsIGlucHV0IGdhdGUsIGFuZAorLy8gY2VsbCBnYXRlIEZvcm11bGE6IHVwZGF0ZWRfY2VsbF9zdGF0ZSA9IGZvcmdldF9nYXRlX291dHB1dCpjZWxsX3N0YXRlICsKKy8vIGlucHV0X2dhdGVfb3V0cHV0ICogY2VsbF9nYXRlX291dHB1dCwgd2hlcmUgKiBkZW5vdGVzIGVsZW1lbnQgd2lzZQorLy8gbXVsdGlwbGljYXRpb24KK3ZvaWQgVXBkYXRlTHN0bUNlbGwoY29uc3QgTHN0bVN0ZXBNYW5hZ2VyJiBzdGVwX2luZm8sCisgICAgICAgICAgICAgICAgICAgIFRmTGl0ZUV2YWxUZW5zb3IqIGNlbGxfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgIC8vIEdhdGUgb3V0cHV0cworICAgICAgICAgICAgICAgICAgICBpbnQxNl90KiBmb3JnZXRfZ2F0ZV9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QqIGlucHV0X2dhdGVfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90KiBjZWxsX2dhdGVfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAvLyBNdWwgcGFyYW1ldGVycworICAgICAgICAgICAgICAgICAgICBjb25zdCBBcml0aG1ldGljUGFyYW1zJiBmb3JnZXRfY2VsbF9tdWxfcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBBcml0aG1ldGljUGFyYW1zJiBpbnB1dF9tdWxfcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDZWxsU3RhdGVJbmZvJiBjZWxsX3N0YXRlX2luZm8sIGludDE2X3QqIGJ1ZmZlcik7CisKK3ZvaWQgVXBkYXRlTHN0bUNlbGwoY29uc3QgTHN0bVN0ZXBNYW5hZ2VyJiBzdGVwX2luZm8sCisgICAgICAgICAgICAgICAgICAgIFRmTGl0ZUV2YWxUZW5zb3IqIGNlbGxfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgIC8vIEdhdGUgb3V0cHV0cworICAgICAgICAgICAgICAgICAgICBmbG9hdCogZm9yZ2V0X2dhdGVfb3V0cHV0LCBjb25zdCBmbG9hdCogaW5wdXRfZ2F0ZV9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBjZWxsX2dhdGVfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAvLyBNdWwgcGFyYW1ldGVycworICAgICAgICAgICAgICAgICAgICBjb25zdCBBcml0aG1ldGljUGFyYW1zJiBmb3JnZXRfY2VsbF9tdWxfcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBBcml0aG1ldGljUGFyYW1zJiBpbnB1dF9tdWxfcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDZWxsU3RhdGVJbmZvJiBjZWxsX3N0YXRlX2luZm8sIGZsb2F0KiBidWZmZXIpOworI2VuZGlmICAvLyAjaWYgIShkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KSkKKworLy8gVXBkYXRlIHRoZSBoaWRkZW4gc3RhdGUgb2YgdGhlIExTVE0ga2VybmVsIHVzaW5nIHRoZSBmb2xsb3dpbmcgZm9ybXVsYToKKy8vIHVwZGF0ZWRfaGlkZGVuX3N0YXRlID0gVGFuaCh1cGRhdGVkX2NlbGxfc3RhdGUpICogb3V0cHV0X2dhdGVfb3V0cHV0LCAqIG1lYW5zCisvLyBlbGVtZW50IHdpc2UgbXVsdGlwbGljYXRpb24KK3RlbXBsYXRlIDx0eXBlbmFtZSBDZWxsVHlwZSwgdHlwZW5hbWUgQWN0aXZhdGlvblR5cGU+Cit2b2lkIFVwZGF0ZUxzdG1IaWRkZW4oY29uc3QgTHN0bVN0ZXBNYW5hZ2VyJiBzdGVwX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgVGZMaXRlRXZhbFRlbnNvciogY2VsbF9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICBUZkxpdGVFdmFsVGVuc29yKiBoaWRkZW5fc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2VsbFR5cGUqIG91dHB1dF9nYXRlX291dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcml0aG1ldGljUGFyYW1zJiBtdWxfcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2VsbF9zdGF0ZV9zY2FsZV9wb3dlciwgQ2VsbFR5cGUqIGJ1ZmZlcikgeworICAvLyBDaGVjayBvZmZzZXQgdmFsaWRpdHkgdG8gYXZvaWQgbWVtb3J5IG92ZXJmbG93CisgIFRGTElURV9EQ0hFQ0tfTEUoCisgICAgICBzdGVwX2luZm8uQ2VsbFN0YXRlT2Zmc2V0KCkgKyBzdGVwX2luZm8uU3RhdGVTaGFwZSgpLkZsYXRTaXplKCksCisgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShjZWxsX3N0YXRlKS5GbGF0U2l6ZSgpKTsKKyAgVEZMSVRFX0RDSEVDS19MRSgKKyAgICAgIHN0ZXBfaW5mby5IaWRkZW5TdGF0ZU9mZnNldCgpICsgc3RlcF9pbmZvLlN0YXRlU2hhcGUoKS5GbGF0U2l6ZSgpLAorICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoaGlkZGVuX3N0YXRlKS5GbGF0U2l6ZSgpKTsKKworICBhdXRvIGNlbGxfc3RhdGVfc2hhcGUgPSBzdGVwX2luZm8uU3RhdGVTaGFwZSgpOworICBDZWxsVHlwZSogY2VsbF9zdGF0ZV9kYXRhID0KKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8Q2VsbFR5cGU+KGNlbGxfc3RhdGUpICsKKyAgICAgIHN0ZXBfaW5mby5DZWxsU3RhdGVPZmZzZXQoKTsKKyAgLy8gVGFuaChjZWxsX3N0YXRlKQorI2lmICEoZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkpCisgIFRhbmgoY2VsbF9zdGF0ZV9zY2FsZV9wb3dlciwgY2VsbF9zdGF0ZV9zaGFwZSwgY2VsbF9zdGF0ZV9kYXRhLAorICAgICAgIGNlbGxfc3RhdGVfc2hhcGUsIGJ1ZmZlcik7CisgIC8vIFVwZGF0ZSB0aGUgaGlkZGVuIHN0YXRlCisgIE11bChjZWxsX3N0YXRlX3NoYXBlLCBtdWxfcGFyYW1zLCBidWZmZXIsIG91dHB1dF9nYXRlX291dHB1dCwKKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8QWN0aXZhdGlvblR5cGU+KGhpZGRlbl9zdGF0ZSkgKworICAgICAgICAgIHN0ZXBfaW5mby5IaWRkZW5TdGF0ZU9mZnNldCgpKTsKKyNlbHNlCisgIGludDMyX3QgY2VsbF9zdGF0ZV9zaXplID0gY2VsbF9zdGF0ZV9zaGFwZS5GbGF0U2l6ZSgpOworICBUYW5oKGNlbGxfc3RhdGVfc2NhbGVfcG93ZXIsIGNlbGxfc3RhdGVfZGF0YSwgYnVmZmVyLCBjZWxsX3N0YXRlX3NpemUpOworICAvLyBVcGRhdGUgdGhlIGhpZGRlbiBzdGF0ZQorICBNdWwobXVsX3BhcmFtcywgYnVmZmVyLCBvdXRwdXRfZ2F0ZV9vdXRwdXQsCisgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPEFjdGl2YXRpb25UeXBlPihoaWRkZW5fc3RhdGUpICsKKyAgICAgICAgICBzdGVwX2luZm8uSGlkZGVuU3RhdGVPZmZzZXQoKSwKKyAgICAgIGNlbGxfc3RhdGVfc2l6ZSk7CisjZW5kaWYKK30KKworI2lmICEoZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkpCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQWN0aXZhdGlvblR5cGUsIHR5cGVuYW1lIFdlaWdodFR5cGUsIHR5cGVuYW1lIENlbGxUeXBlLAorICAgICAgICAgIHR5cGVuYW1lIEJpYXNUeXBlPgordm9pZCBMc3RtU3RlcChjb25zdCBMc3RtU3RlcE1hbmFnZXImIHN0ZXBfaW5mbywgY29uc3QgT3BEYXRhTFNUTSYgb3BfZGF0YSwKKyAgICAgICAgICAgICAgTFNUTUtlcm5lbENvbnRlbnRzJiBrZXJuZWxfY29udGVudCwKKyAgICAgICAgICAgICAgY29uc3QgTFNUTUJ1ZmZlcnM8Q2VsbFR5cGU+JiBidWZmZXJzKSB7CisgIC8qU3RlcDE6IENhbGN1bGF0ZSBnYXRlIG91dHB1dHMgdG8gcHJlcGFyZSBjZWxsIHN0YXRlIHVwZGF0ZSovCisgIENlbGxUeXBlKiBnYXRlX2ludGVybmFsX2J1ZmZlciA9IGJ1ZmZlcnMuYnVmZmVyMzsKKyAgQ2VsbFR5cGUqIGZvcmdldF9nYXRlX291dHB1dCA9IGJ1ZmZlcnMuYnVmZmVyMDsKKyAgQ2FsY3VsYXRlTHN0bUdhdGU8QWN0aXZhdGlvblR5cGUsIFdlaWdodFR5cGUsIENlbGxUeXBlLCBCaWFzVHlwZT4oCisgICAgICBzdGVwX2luZm8sIG9wX2RhdGEuZm9yZ2V0X2dhdGVfcGFyYW1ldGVycywKKyAgICAgIC8vIElucHV0IEZDCisgICAgICBrZXJuZWxfY29udGVudC5HZXRJbnRlcm5hbFRlbnNvcih0ZmxpdGU6OmtMc3RtSW5wdXRUZW5zb3IpLAorICAgICAga2VybmVsX2NvbnRlbnQuR2V0SW50ZXJuYWxUZW5zb3IodGZsaXRlOjprTHN0bUlucHV0VG9Gb3JnZXRXZWlnaHRzVGVuc29yKSwKKyAgICAgIGtlcm5lbF9jb250ZW50LkdldEludGVybmFsVGVuc29yKHRmbGl0ZTo6a0xzdG1Gb3JnZXRHYXRlQmlhc1RlbnNvciksCisgICAgICAvLyBSZWN1cnJlbnQgRkMKKyAgICAgIGtlcm5lbF9jb250ZW50LkhpZGRlblN0YXRlVGVuc29yKCksCisgICAgICBrZXJuZWxfY29udGVudC5HZXRJbnRlcm5hbFRlbnNvcigKKyAgICAgICAgICB0ZmxpdGU6OmtMc3RtUmVjdXJyZW50VG9Gb3JnZXRXZWlnaHRzVGVuc29yKSwKKyAgICAgIC8qcmVjdXJyZW50X2JpYXMqLyBudWxscHRyLAorICAgICAgLy8gT3V0cHV0CisgICAgICBmb3JnZXRfZ2F0ZV9vdXRwdXQsCisgICAgICAvLyBTY3JhdGNoIGFycmF5cworICAgICAgZ2F0ZV9pbnRlcm5hbF9idWZmZXIsIGtUZkxpdGVBY3RTaWdtb2lkKTsKKworICAvLyBJbnB1dCBHYXRlIGNhbGN1bGF0aW9uOworICBDZWxsVHlwZSogaW5wdXRfZ2F0ZV9vdXRwdXQgPSBidWZmZXJzLmJ1ZmZlcjE7CisgIENhbGN1bGF0ZUxzdG1HYXRlPEFjdGl2YXRpb25UeXBlLCBXZWlnaHRUeXBlLCBDZWxsVHlwZSwgQmlhc1R5cGU+KAorICAgICAgc3RlcF9pbmZvLCBvcF9kYXRhLmlucHV0X2dhdGVfcGFyYW1ldGVycywKKyAgICAgIC8vIElucHV0IEZDCisgICAgICBrZXJuZWxfY29udGVudC5HZXRJbnRlcm5hbFRlbnNvcih0ZmxpdGU6OmtMc3RtSW5wdXRUZW5zb3IpLAorICAgICAga2VybmVsX2NvbnRlbnQuR2V0SW50ZXJuYWxUZW5zb3IodGZsaXRlOjprTHN0bUlucHV0VG9JbnB1dFdlaWdodHNUZW5zb3IpLAorICAgICAga2VybmVsX2NvbnRlbnQuR2V0SW50ZXJuYWxUZW5zb3IodGZsaXRlOjprTHN0bUlucHV0R2F0ZUJpYXNUZW5zb3IpLAorICAgICAgLy8gUmVjdXJyZW50IEZDCisgICAgICBrZXJuZWxfY29udGVudC5IaWRkZW5TdGF0ZVRlbnNvcigpLAorICAgICAga2VybmVsX2NvbnRlbnQuR2V0SW50ZXJuYWxUZW5zb3IoCisgICAgICAgICAgdGZsaXRlOjprTHN0bVJlY3VycmVudFRvSW5wdXRXZWlnaHRzVGVuc29yKSwKKyAgICAgIC8qcmVjdXJyZW50X2JpYXMqLyBudWxscHRyLAorICAgICAgLy8gT3V0cHV0CisgICAgICBpbnB1dF9nYXRlX291dHB1dCwKKyAgICAgIC8vIFNjcmF0Y2ggYXJyYXlzCisgICAgICBnYXRlX2ludGVybmFsX2J1ZmZlciwga1RmTGl0ZUFjdFNpZ21vaWQpOworCisgIC8vIENlbGwgR2F0ZSBjYWxjdWxhdGlvbgorICBDZWxsVHlwZSogY2VsbF9nYXRlX291dHB1dCA9IGJ1ZmZlcnMuYnVmZmVyMjsKKyAgQ2FsY3VsYXRlTHN0bUdhdGU8QWN0aXZhdGlvblR5cGUsIFdlaWdodFR5cGUsIENlbGxUeXBlLCBCaWFzVHlwZT4oCisgICAgICBzdGVwX2luZm8sIG9wX2RhdGEuY2VsbF9nYXRlX3BhcmFtZXRlcnMsCisgICAgICAvLyBJbnB1dCBGQworICAgICAga2VybmVsX2NvbnRlbnQuR2V0SW50ZXJuYWxUZW5zb3IodGZsaXRlOjprTHN0bUlucHV0VGVuc29yKSwKKyAgICAgIGtlcm5lbF9jb250ZW50LkdldEludGVybmFsVGVuc29yKHRmbGl0ZTo6a0xzdG1JbnB1dFRvQ2VsbFdlaWdodHNUZW5zb3IpLAorICAgICAga2VybmVsX2NvbnRlbnQuR2V0SW50ZXJuYWxUZW5zb3IodGZsaXRlOjprTHN0bUNlbGxHYXRlQmlhc1RlbnNvciksCisgICAgICAvLyBSZWN1cnJlbnQgRkMKKyAgICAgIGtlcm5lbF9jb250ZW50LkhpZGRlblN0YXRlVGVuc29yKCksCisgICAgICBrZXJuZWxfY29udGVudC5HZXRJbnRlcm5hbFRlbnNvcigKKyAgICAgICAgICB0ZmxpdGU6OmtMc3RtUmVjdXJyZW50VG9DZWxsV2VpZ2h0c1RlbnNvciksCisgICAgICAvKnJlY3VycmVudF9iaWFzKi8gbnVsbHB0ciwKKyAgICAgIC8vIE91dHB1dAorICAgICAgY2VsbF9nYXRlX291dHB1dCwKKyAgICAgIC8vIFNjcmF0Y2ggYXJyYXlzCisgICAgICBnYXRlX2ludGVybmFsX2J1ZmZlciwgb3BfZGF0YS5jZWxsX2dhdGVfbm9ubGluZWFyX3R5cGUpOworCisgIC8qU3RlcDI6IHVwZGF0ZSB0aGUgY2VsbCBzdGF0ZSAqLworICBjb25zdCBJbnRlckdhdGVQYXJhbWV0ZXJzJiBpbnRlcl9nYXRlX3BhcmFtcyA9IG9wX2RhdGEuaW50ZXJfZ2F0ZV9wYXJhbWV0ZXJzOworICBDZWxsVHlwZSogdXBkYXRlZF9pbnB1dF9idWZmZXIgPSBidWZmZXJzLmJ1ZmZlcjE7ICAvLyByZXVzZSBidWZmZXIKKworICBVcGRhdGVMc3RtQ2VsbDxDZWxsVHlwZT4oc3RlcF9pbmZvLCBrZXJuZWxfY29udGVudC5DZWxsU3RhdGVUZW5zb3IoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmdldF9nYXRlX291dHB1dCwgaW5wdXRfZ2F0ZV9vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsX2dhdGVfb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJfZ2F0ZV9wYXJhbXMuZm9yZ2V0X2NlbGxfbXVsX3BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyX2dhdGVfcGFyYW1zLmlucHV0X211bF9wYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9kYXRhLmNlbGxfc3RhdGVfaW5mbywgdXBkYXRlZF9pbnB1dF9idWZmZXIpOworCisgIC8qU3RlcDM6IHVwZGF0ZSB0aGUgaGlkZGVuIHN0YXRlICovCisgIENlbGxUeXBlKiBvdXRwdXRfZ2F0ZV9vdXRwdXQgPSBidWZmZXJzLmJ1ZmZlcjE7ICAvLyByZXVzZSBidWZmZXIKKyAgQ2FsY3VsYXRlTHN0bUdhdGU8QWN0aXZhdGlvblR5cGUsIFdlaWdodFR5cGUsIENlbGxUeXBlLCBCaWFzVHlwZT4oCisgICAgICBzdGVwX2luZm8sIG9wX2RhdGEub3V0cHV0X2dhdGVfcGFyYW1ldGVycywKKyAgICAgIC8vIElucHV0IEZDCisgICAgICBrZXJuZWxfY29udGVudC5HZXRJbnRlcm5hbFRlbnNvcih0ZmxpdGU6OmtMc3RtSW5wdXRUZW5zb3IpLAorICAgICAga2VybmVsX2NvbnRlbnQuR2V0SW50ZXJuYWxUZW5zb3IodGZsaXRlOjprTHN0bUlucHV0VG9PdXRwdXRXZWlnaHRzVGVuc29yKSwKKyAgICAgIGtlcm5lbF9jb250ZW50LkdldEludGVybmFsVGVuc29yKHRmbGl0ZTo6a0xzdG1PdXRwdXRHYXRlQmlhc1RlbnNvciksCisgICAgICAvLyBSZWN1cnJlbnQgRkMKKyAgICAgIGtlcm5lbF9jb250ZW50LkhpZGRlblN0YXRlVGVuc29yKCksCisgICAgICBrZXJuZWxfY29udGVudC5HZXRJbnRlcm5hbFRlbnNvcigKKyAgICAgICAgICB0ZmxpdGU6OmtMc3RtUmVjdXJyZW50VG9PdXRwdXRXZWlnaHRzVGVuc29yKSwKKyAgICAgIC8qcmVjdXJyZW50X2JpYXMqLyBudWxscHRyLAorICAgICAgLy8gT3V0cHV0CisgICAgICBvdXRwdXRfZ2F0ZV9vdXRwdXQsCisgICAgICAvLyBTY3JhdGNoIGFycmF5cworICAgICAgZ2F0ZV9pbnRlcm5hbF9idWZmZXIsIGtUZkxpdGVBY3RTaWdtb2lkKTsKKworICBDZWxsVHlwZSogdGFuaF9hY3RpdmF0ZWRfY2VsbF9idWZmZXIgPSBidWZmZXJzLmJ1ZmZlcjA7ICAvLyByZXVzZSBidWZmZXIKKyAgdGZsaXRlOjpsc3RtX2ludGVybmFsOjpVcGRhdGVMc3RtSGlkZGVuPENlbGxUeXBlLCBBY3RpdmF0aW9uVHlwZT4oCisgICAgICBzdGVwX2luZm8sIGtlcm5lbF9jb250ZW50LkNlbGxTdGF0ZVRlbnNvcigpLAorICAgICAga2VybmVsX2NvbnRlbnQuSGlkZGVuU3RhdGVUZW5zb3IoKSwgb3V0cHV0X2dhdGVfb3V0cHV0LAorICAgICAgaW50ZXJfZ2F0ZV9wYXJhbXMub3V0cHV0X211bF9wYXJhbXMsCisgICAgICBvcF9kYXRhLmNlbGxfc3RhdGVfaW5mby5jZWxsX3N0YXRlX3NjYWxlX3Bvd2VyLAorICAgICAgdGFuaF9hY3RpdmF0ZWRfY2VsbF9idWZmZXIpOworCisgIC8qU3RlcDQ6IGNvcHkgdGhlIHVwZGF0ZSB0aGUgaGlkZGVuIHN0YXRlIHRvIG91dHB1dCovCisgIC8vIENoZWNrIG9mZnNldCB2YWxpZGl0eSB0byBhdm9pZCBtZW1vcnkgb3ZlcmZsb3cKKyAgVEZMSVRFX0RDSEVDS19MRSgKKyAgICAgIHN0ZXBfaW5mby5PdXRwdXRPZmZzZXQoKSArIHN0ZXBfaW5mby5TdGF0ZVNoYXBlKCkuRmxhdFNpemUoKSwKKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGtlcm5lbF9jb250ZW50Lm91dHB1dF90ZW5zb3IpLkZsYXRTaXplKCkpOworICAvLyByZWNvcmQgdGhlIG91dHB1dCAoZnJvbSB0aGUgdXBkYXRlZCBoaWRkZW4gc3RhdGUpCisgIEFjdGl2YXRpb25UeXBlKiBvdXRwdXRfcHRyID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxBY3RpdmF0aW9uVHlwZT4oCisgICAgICBrZXJuZWxfY29udGVudC5vdXRwdXRfdGVuc29yKTsKKyAgY29uc3QgYXV0byogaGlkZGVuX3N0YXRlID0ga2VybmVsX2NvbnRlbnQuSGlkZGVuU3RhdGVUZW5zb3IoKTsKKyAgc3RkOjptZW1jcHkob3V0cHV0X3B0ciArIHN0ZXBfaW5mby5PdXRwdXRPZmZzZXQoKSwKKyAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxBY3RpdmF0aW9uVHlwZT4oaGlkZGVuX3N0YXRlKSArCisgICAgICAgICAgICAgICAgICBzdGVwX2luZm8uSGlkZGVuU3RhdGVPZmZzZXQoKSwKKyAgICAgICAgICAgICAgc3RlcF9pbmZvLlN0YXRlU2hhcGUoKS5GbGF0U2l6ZSgpICogc2l6ZW9mKEFjdGl2YXRpb25UeXBlKSk7Cit9CisjZWxzZSAgIC8vICNpZiAhKGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpKQordGVtcGxhdGUgPHR5cGVuYW1lIEFjdGl2YXRpb25UeXBlLCB0eXBlbmFtZSBXZWlnaHRUeXBlLCB0eXBlbmFtZSBDZWxsVHlwZSwKKyAgICAgICAgICB0eXBlbmFtZSBCaWFzVHlwZT4KK3ZvaWQgTHN0bVN0ZXAoY29uc3QgTHN0bVN0ZXBNYW5hZ2VyJiBzdGVwX2luZm8sIGNvbnN0IE9wRGF0YUxTVE0mIG9wX2RhdGEsCisgICAgICAgICAgICAgIExTVE1LZXJuZWxDb250ZW50cyYga2VybmVsX2NvbnRlbnQsCisgICAgICAgICAgICAgIGNvbnN0IExTVE1CdWZmZXJzPENlbGxUeXBlPiYgYnVmZmVycykgeworICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dCA9CisgICAgICBrZXJuZWxfY29udGVudC5HZXRJbnRlcm5hbFRlbnNvcih0ZmxpdGU6OmtMc3RtSW5wdXRUZW5zb3IpOworICBUZkxpdGVFdmFsVGVuc29yKiByZWN1cnJlbnQgPSBrZXJuZWxfY29udGVudC5IaWRkZW5TdGF0ZVRlbnNvcigpOworCisgIGludCB0aW1lX21ham9yID0gc3RlcF9pbmZvLnRpbWVfbWFqb3IoKTsKKyAgaW50IG51bV9iYXRjaGVzID0gdGltZV9tYWpvciA9PSAwID8gMSA6IHN0ZXBfaW5mby5iYXRjaF9zaXplKCk7CisgIGludCBpbnB1dF9kaW1lbnNpb24gPSBzdGVwX2luZm8uaW5wdXRfZGltZW5zaW9uKCk7CisgIGludCBzdGF0ZV9kaW1lbnNpb24gPSBzdGVwX2luZm8uc3RhdGVfZGltZW5zaW9uKCk7CisKKyAgLy8gQ2hlY2sgb2Zmc2V0IHZhbGlkaXR5IHRvIGF2b2lkIG1lbW9yeSBvdmVyZmxvdworICBURkxJVEVfRENIRUNLX0xFKHN0ZXBfaW5mby5JbnB1dE9mZnNldCgpICsgbnVtX2JhdGNoZXMgKiBpbnB1dF9kaW1lbnNpb24sCisgICAgICAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoaW5wdXQpLkZsYXRTaXplKCkpOworICBURkxJVEVfRENIRUNLX0xFKAorICAgICAgc3RlcF9pbmZvLkhpZGRlblN0YXRlT2Zmc2V0KCkgKyBudW1fYmF0Y2hlcyAqIHN0YXRlX2RpbWVuc2lvbiwKKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKHJlY3VycmVudCkuRmxhdFNpemUoKSk7CisKKyAgLypTdGVwMTogQ2FsY3VsYXRlIGdhdGUgb3V0cHV0cyB0byBwcmVwYXJlIGNlbGwgc3RhdGUgdXBkYXRlKi8KKyAgQ2VsbFR5cGUqIGdhdGVfaW50ZXJuYWxfYnVmZmVyID0gYnVmZmVycy5idWZmZXIzOworICBDZWxsVHlwZSogZm9yZ2V0X2dhdGVfb3V0cHV0ID0gYnVmZmVycy5idWZmZXIwOworICBDYWxjdWxhdGVMc3RtR2F0ZTxBY3RpdmF0aW9uVHlwZSwgV2VpZ2h0VHlwZSwgQ2VsbFR5cGUsIEJpYXNUeXBlPigKKyAgICAgIHN0ZXBfaW5mbywgb3BfZGF0YS5mb3JnZXRfZ2F0ZV9wYXJhbWV0ZXJzLAorICAgICAgLy8gSW5wdXQgRkMKKyAgICAgIGlucHV0LCAgLy8ga2VybmVsX2NvbnRlbnQuR2V0SW50ZXJuYWxUZW5zb3IodGZsaXRlOjprTHN0bUlucHV0VGVuc29yKSwKKyAgICAgIGtlcm5lbF9jb250ZW50LkdldEludGVybmFsVGVuc29yKHRmbGl0ZTo6a0xzdG1JbnB1dFRvRm9yZ2V0V2VpZ2h0c1RlbnNvciksCisgICAgICBrZXJuZWxfY29udGVudC5HZXRJbnRlcm5hbFRlbnNvcih0ZmxpdGU6OmtMc3RtRm9yZ2V0R2F0ZUJpYXNUZW5zb3IpLAorICAgICAgLy8gUmVjdXJyZW50IEZDCisgICAgICByZWN1cnJlbnQsICAvLyBrZXJuZWxfY29udGVudC5IaWRkZW5TdGF0ZVRlbnNvcigpLAorICAgICAga2VybmVsX2NvbnRlbnQuR2V0SW50ZXJuYWxUZW5zb3IoCisgICAgICAgICAgdGZsaXRlOjprTHN0bVJlY3VycmVudFRvRm9yZ2V0V2VpZ2h0c1RlbnNvciksCisgICAgICAvKnJlY3VycmVudF9iaWFzKi8gbnVsbHB0ciwKKyAgICAgIC8vIE91dHB1dAorICAgICAgZm9yZ2V0X2dhdGVfb3V0cHV0LAorICAgICAgLy8gU2NyYXRjaCBhcnJheXMKKyAgICAgIGdhdGVfaW50ZXJuYWxfYnVmZmVyLCBrVGZMaXRlQWN0U2lnbW9pZCwgbnVtX2JhdGNoZXMsIGlucHV0X2RpbWVuc2lvbiwKKyAgICAgIHN0YXRlX2RpbWVuc2lvbik7CisKKyAgLy8gSW5wdXQgR2F0ZSBjYWxjdWxhdGlvbjsKKyAgQ2VsbFR5cGUqIGlucHV0X2dhdGVfb3V0cHV0ID0gYnVmZmVycy5idWZmZXIxOworICBDYWxjdWxhdGVMc3RtR2F0ZTxBY3RpdmF0aW9uVHlwZSwgV2VpZ2h0VHlwZSwgQ2VsbFR5cGUsIEJpYXNUeXBlPigKKyAgICAgIHN0ZXBfaW5mbywgb3BfZGF0YS5pbnB1dF9nYXRlX3BhcmFtZXRlcnMsCisgICAgICAvLyBJbnB1dCBGQworICAgICAgaW5wdXQsICAvLyBrZXJuZWxfY29udGVudC5HZXRJbnRlcm5hbFRlbnNvcih0ZmxpdGU6OmtMc3RtSW5wdXRUZW5zb3IpLAorICAgICAga2VybmVsX2NvbnRlbnQuR2V0SW50ZXJuYWxUZW5zb3IodGZsaXRlOjprTHN0bUlucHV0VG9JbnB1dFdlaWdodHNUZW5zb3IpLAorICAgICAga2VybmVsX2NvbnRlbnQuR2V0SW50ZXJuYWxUZW5zb3IodGZsaXRlOjprTHN0bUlucHV0R2F0ZUJpYXNUZW5zb3IpLAorICAgICAgLy8gUmVjdXJyZW50IEZDCisgICAgICByZWN1cnJlbnQsICAvLyBrZXJuZWxfY29udGVudC5IaWRkZW5TdGF0ZVRlbnNvcigpLAorICAgICAga2VybmVsX2NvbnRlbnQuR2V0SW50ZXJuYWxUZW5zb3IoCisgICAgICAgICAgdGZsaXRlOjprTHN0bVJlY3VycmVudFRvSW5wdXRXZWlnaHRzVGVuc29yKSwKKyAgICAgIC8qcmVjdXJyZW50X2JpYXMqLyBudWxscHRyLAorICAgICAgLy8gT3V0cHV0CisgICAgICBpbnB1dF9nYXRlX291dHB1dCwKKyAgICAgIC8vIFNjcmF0Y2ggYXJyYXlzCisgICAgICBnYXRlX2ludGVybmFsX2J1ZmZlciwga1RmTGl0ZUFjdFNpZ21vaWQsIG51bV9iYXRjaGVzLCBpbnB1dF9kaW1lbnNpb24sCisgICAgICBzdGF0ZV9kaW1lbnNpb24pOworCisgIC8vIENlbGwgR2F0ZSBjYWxjdWxhdGlvbgorICBDZWxsVHlwZSogY2VsbF9nYXRlX291dHB1dCA9IGJ1ZmZlcnMuYnVmZmVyMjsKKyAgQ2FsY3VsYXRlTHN0bUdhdGU8QWN0aXZhdGlvblR5cGUsIFdlaWdodFR5cGUsIENlbGxUeXBlLCBCaWFzVHlwZT4oCisgICAgICBzdGVwX2luZm8sIG9wX2RhdGEuY2VsbF9nYXRlX3BhcmFtZXRlcnMsCisgICAgICAvLyBJbnB1dCBGQworICAgICAgaW5wdXQsICAvLyBrZXJuZWxfY29udGVudC5HZXRJbnRlcm5hbFRlbnNvcih0ZmxpdGU6OmtMc3RtSW5wdXRUZW5zb3IpLAorICAgICAga2VybmVsX2NvbnRlbnQuR2V0SW50ZXJuYWxUZW5zb3IodGZsaXRlOjprTHN0bUlucHV0VG9DZWxsV2VpZ2h0c1RlbnNvciksCisgICAgICBrZXJuZWxfY29udGVudC5HZXRJbnRlcm5hbFRlbnNvcih0ZmxpdGU6OmtMc3RtQ2VsbEdhdGVCaWFzVGVuc29yKSwKKyAgICAgIC8vIFJlY3VycmVudCBGQworICAgICAgcmVjdXJyZW50LCAgLy8ga2VybmVsX2NvbnRlbnQuSGlkZGVuU3RhdGVUZW5zb3IoKSwKKyAgICAgIGtlcm5lbF9jb250ZW50LkdldEludGVybmFsVGVuc29yKAorICAgICAgICAgIHRmbGl0ZTo6a0xzdG1SZWN1cnJlbnRUb0NlbGxXZWlnaHRzVGVuc29yKSwKKyAgICAgIC8qcmVjdXJyZW50X2JpYXMqLyBudWxscHRyLAorICAgICAgLy8gT3V0cHV0CisgICAgICBjZWxsX2dhdGVfb3V0cHV0LAorICAgICAgLy8gU2NyYXRjaCBhcnJheXMKKyAgICAgIGdhdGVfaW50ZXJuYWxfYnVmZmVyLCBvcF9kYXRhLmNlbGxfZ2F0ZV9ub25saW5lYXJfdHlwZSwgbnVtX2JhdGNoZXMsCisgICAgICBpbnB1dF9kaW1lbnNpb24sIHN0YXRlX2RpbWVuc2lvbik7CisKKyAgLypTdGVwMjogdXBkYXRlIHRoZSBjZWxsIHN0YXRlICovCisgIGNvbnN0IEludGVyR2F0ZVBhcmFtZXRlcnMmIGludGVyX2dhdGVfcGFyYW1zID0gb3BfZGF0YS5pbnRlcl9nYXRlX3BhcmFtZXRlcnM7CisgIENlbGxUeXBlKiB1cGRhdGVkX2lucHV0X2J1ZmZlciA9IGJ1ZmZlcnMuYnVmZmVyMTsgIC8vIHJldXNlIGJ1ZmZlcgorCisgIFVwZGF0ZUxzdG1DZWxsKHN0ZXBfaW5mbywga2VybmVsX2NvbnRlbnQuQ2VsbFN0YXRlVGVuc29yKCksCisgICAgICAgICAgICAgICAgIGZvcmdldF9nYXRlX291dHB1dCwgaW5wdXRfZ2F0ZV9vdXRwdXQsIGNlbGxfZ2F0ZV9vdXRwdXQsCisgICAgICAgICAgICAgICAgIGludGVyX2dhdGVfcGFyYW1zLmZvcmdldF9jZWxsX211bF9wYXJhbXMsCisgICAgICAgICAgICAgICAgIGludGVyX2dhdGVfcGFyYW1zLmlucHV0X211bF9wYXJhbXMsIG9wX2RhdGEuY2VsbF9zdGF0ZV9pbmZvLAorICAgICAgICAgICAgICAgICB1cGRhdGVkX2lucHV0X2J1ZmZlcik7CisKKyAgLypTdGVwMzogdXBkYXRlIHRoZSBoaWRkZW4gc3RhdGUgKi8KKyAgQ2VsbFR5cGUqIG91dHB1dF9nYXRlX291dHB1dCA9IGJ1ZmZlcnMuYnVmZmVyMTsgIC8vIHJldXNlIGJ1ZmZlcgorICBDYWxjdWxhdGVMc3RtR2F0ZTxBY3RpdmF0aW9uVHlwZSwgV2VpZ2h0VHlwZSwgQ2VsbFR5cGUsIEJpYXNUeXBlPigKKyAgICAgIHN0ZXBfaW5mbywgb3BfZGF0YS5vdXRwdXRfZ2F0ZV9wYXJhbWV0ZXJzLAorICAgICAgLy8gSW5wdXQgRkMKKyAgICAgIGlucHV0LCAgLy8ga2VybmVsX2NvbnRlbnQuR2V0SW50ZXJuYWxUZW5zb3IodGZsaXRlOjprTHN0bUlucHV0VGVuc29yKSwKKyAgICAgIGtlcm5lbF9jb250ZW50LkdldEludGVybmFsVGVuc29yKHRmbGl0ZTo6a0xzdG1JbnB1dFRvT3V0cHV0V2VpZ2h0c1RlbnNvciksCisgICAgICBrZXJuZWxfY29udGVudC5HZXRJbnRlcm5hbFRlbnNvcih0ZmxpdGU6OmtMc3RtT3V0cHV0R2F0ZUJpYXNUZW5zb3IpLAorICAgICAgLy8gUmVjdXJyZW50IEZDCisgICAgICByZWN1cnJlbnQsICAvLyBrZXJuZWxfY29udGVudC5IaWRkZW5TdGF0ZVRlbnNvcigpLAorICAgICAga2VybmVsX2NvbnRlbnQuR2V0SW50ZXJuYWxUZW5zb3IoCisgICAgICAgICAgdGZsaXRlOjprTHN0bVJlY3VycmVudFRvT3V0cHV0V2VpZ2h0c1RlbnNvciksCisgICAgICAvKnJlY3VycmVudF9iaWFzKi8gbnVsbHB0ciwKKyAgICAgIC8vIE91dHB1dAorICAgICAgb3V0cHV0X2dhdGVfb3V0cHV0LAorICAgICAgLy8gU2NyYXRjaCBhcnJheXMKKyAgICAgIGdhdGVfaW50ZXJuYWxfYnVmZmVyLCBrVGZMaXRlQWN0U2lnbW9pZCwgbnVtX2JhdGNoZXMsIGlucHV0X2RpbWVuc2lvbiwKKyAgICAgIHN0YXRlX2RpbWVuc2lvbik7CisKKyAgQ2VsbFR5cGUqIHRhbmhfYWN0aXZhdGVkX2NlbGxfYnVmZmVyID0gYnVmZmVycy5idWZmZXIwOyAgLy8gcmV1c2UgYnVmZmVyCisgIHRmbGl0ZTo6bHN0bV9pbnRlcm5hbDo6VXBkYXRlTHN0bUhpZGRlbjxDZWxsVHlwZSwgQWN0aXZhdGlvblR5cGU+KAorICAgICAgc3RlcF9pbmZvLCBrZXJuZWxfY29udGVudC5DZWxsU3RhdGVUZW5zb3IoKSwgcmVjdXJyZW50LAorICAgICAgLyoga2VybmVsX2NvbnRlbnQuSGlkZGVuU3RhdGVUZW5zb3IoKSwgKi8gb3V0cHV0X2dhdGVfb3V0cHV0LAorICAgICAgaW50ZXJfZ2F0ZV9wYXJhbXMub3V0cHV0X211bF9wYXJhbXMsCisgICAgICBvcF9kYXRhLmNlbGxfc3RhdGVfaW5mby5jZWxsX3N0YXRlX3NjYWxlX3Bvd2VyLAorICAgICAgdGFuaF9hY3RpdmF0ZWRfY2VsbF9idWZmZXIpOworCisgIC8qU3RlcDQ6IGNvcHkgdGhlIHVwZGF0ZSB0aGUgaGlkZGVuIHN0YXRlIHRvIG91dHB1dCovCisgIC8vIENoZWNrIG9mZnNldCB2YWxpZGl0eSB0byBhdm9pZCBtZW1vcnkgb3ZlcmZsb3cKKyAgVEZMSVRFX0RDSEVDS19MRSgKKyAgICAgIHN0ZXBfaW5mby5PdXRwdXRPZmZzZXQoKSArIHN0ZXBfaW5mby5TdGF0ZVNoYXBlKCkuRmxhdFNpemUoKSwKKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGtlcm5lbF9jb250ZW50Lm91dHB1dF90ZW5zb3IpLkZsYXRTaXplKCkpOworICAvLyByZWNvcmQgdGhlIG91dHB1dCAoZnJvbSB0aGUgdXBkYXRlZCBoaWRkZW4gc3RhdGUpCisgIEFjdGl2YXRpb25UeXBlKiBvdXRwdXRfcHRyID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxBY3RpdmF0aW9uVHlwZT4oCisgICAgICBrZXJuZWxfY29udGVudC5vdXRwdXRfdGVuc29yKTsKKyAgLy8gY29uc3QgYXV0byogaGlkZGVuX3N0YXRlID0ga2VybmVsX2NvbnRlbnQuSGlkZGVuU3RhdGVUZW5zb3IoKTsKKyAgc3RkOjptZW1jcHkob3V0cHV0X3B0ciArIHN0ZXBfaW5mby5PdXRwdXRPZmZzZXQoKSwKKyAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxBY3RpdmF0aW9uVHlwZT4ocmVjdXJyZW50KSArCisgICAgICAgICAgICAgICAgICBzdGVwX2luZm8uSGlkZGVuU3RhdGVPZmZzZXQoKSwKKyAgICAgICAgICAgICAgc3RlcF9pbmZvLlN0YXRlU2hhcGUoKS5GbGF0U2l6ZSgpICogc2l6ZW9mKEFjdGl2YXRpb25UeXBlKSk7Cit9CisjZW5kaWYgIC8vICNpZiAhKGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpKQorCit9ICAvLyBuYW1lc3BhY2UgbHN0bV9pbnRlcm5hbAorCisvLyBFdmF1bGF0ZSB0aGUgTFNUTSBrZXJuZWwgd2l0aCAocG90ZW50aWFsKSBtdWx0aS1zdGVwcyBhbmQgbXVsdGktYmF0Y2ggaW5wdXQKKy8vIFNpbmNlCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQWN0aXZhdGlvblR5cGUsIHR5cGVuYW1lIFdlaWdodFR5cGUsIHR5cGVuYW1lIENlbGxUeXBlLAorICAgICAgICAgIHR5cGVuYW1lIEJpYXNUeXBlPgorVGZMaXRlU3RhdHVzIEV2YWxMc3RtKGNvbnN0IE9wRGF0YUxTVE0mIG9wX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgTFNUTUtlcm5lbENvbnRlbnRzJiBrZXJuZWxfY29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMU1RNQnVmZmVyczxDZWxsVHlwZT4mIGJ1ZmZlcnMpIHsKKyAgbHN0bV9pbnRlcm5hbDo6THN0bVN0ZXBNYW5hZ2VyIHN0ZXBfaW5mbygmb3BfZGF0YS5zaXplX2luZm8pOworICBjb25zdCBhdXRvJiBzaXplX2luZm8gPSBvcF9kYXRhLnNpemVfaW5mbzsKKyAgLy8gdGltZSBpcyB0aGUgZmlyc3QgZGltZW50aW9uLCBlbmFibGUgYmF0Y2ggY29tcHV0YXRpb24KKyAgaWYgKHNpemVfaW5mby50aW1lX21ham9yKSB7CisgICAgZm9yIChpbnQgdCA9IDA7IHQgPCBzaXplX2luZm8udGltZV9zdGVwczsgdCsrKSB7CisgICAgICBsc3RtX2ludGVybmFsOjpMc3RtU3RlcDxBY3RpdmF0aW9uVHlwZSwgV2VpZ2h0VHlwZSwgQ2VsbFR5cGUsIEJpYXNUeXBlPigKKyAgICAgICAgICBzdGVwX2luZm8sIG9wX2RhdGEsIGtlcm5lbF9jb250ZW50LCBidWZmZXJzKTsKKyAgICAgIC8vIHByZXBhcmUgZm9yIHRoZSBuZXh0IHRpbWUgc3RlcAorICAgICAgc3RlcF9pbmZvLlVwZGF0ZVRpbWUoKTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gYmF0Y2ggZmlyc3QsIHVuYWJsZSB0byBzaXplIHRoZSBpbnB1dCBkYXRhLiBzaW5nbGUgYmF0Y2ggaW5mZXJlbmNlCisgICAgZm9yIChpbnQgYiA9IDA7IGIgPCBzaXplX2luZm8uYmF0Y2hfc2l6ZTsgYisrKSB7CisgICAgICBmb3IgKGludCB0ID0gMDsgdCA8IHNpemVfaW5mby50aW1lX3N0ZXBzOyB0KyspIHsKKyAgICAgICAgbHN0bV9pbnRlcm5hbDo6THN0bVN0ZXA8QWN0aXZhdGlvblR5cGUsIFdlaWdodFR5cGUsIENlbGxUeXBlLCBCaWFzVHlwZT4oCisgICAgICAgICAgICBzdGVwX2luZm8sIG9wX2RhdGEsIGtlcm5lbF9jb250ZW50LCBidWZmZXJzKTsKKyAgICAgICAgLy8gcHJlcGFyZSBmb3IgdGhlIG5leHQgdGltZSBzdGVwCisgICAgICAgIHN0ZXBfaW5mby5VcGRhdGVUaW1lKCk7CisgICAgICB9CisgICAgICAvLyBwcmVwYXJlIGZvciB0aGUgbmV4dCBiYXRjaAorICAgICAgc3RlcF9pbmZvLlVwZGF0ZUJhdGNoKCk7CisgICAgICBzdGVwX2luZm8uUmVzZXRUaW1lKCk7CisgICAgfQorICB9CisgIHJldHVybiBrVGZMaXRlT2s7Cit9CiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCi0jZW5kaWYgIC8vIFRFTlNPUkZMT1dfTElURV9LRVJORUxTX0xTVE1fRVZBTF9IXworCisjZW5kaWYgIC8vIFRFTlNPUkZMT1dfTElURV9NSUNST19LRVJORUxTX0xTVE1fRVZBTF8xNkFDVF9IXwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL2xzdG1fZXZhbF9oaWZpLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL2xzdG1fZXZhbF9oaWZpLmNjCmluZGV4IDJiNDlmMjYuLmY4YjZmZDggMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9sc3RtX2V2YWxfaGlmaS5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvbHN0bV9ldmFsX2hpZmkuY2MKQEAgLTEyLDE3ICsxMiw2NSBAQAogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworI2lmIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCisKKyNpbmNsdWRlIDx4dGVuc2EvdGllL3h0X2hpZmkyLmg+CisKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvYy9idWlsdGluX29wX2RhdGEuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvYy9jb21tb24uaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvbHN0bV9ldmFsLmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL3h0ZW5zYS5oIgogCiBuYW1lc3BhY2UgdGZsaXRlIHsKLW5hbWVzcGFjZSBvcHMgewotbmFtZXNwYWNlIG1pY3JvIHsKLW5hbWVzcGFjZSBsc3RtX2V2YWwgewogCiAjaWYgZGVmaW5lZChISUZJNSkKKyNpZiBURkxJVEVfU0lOR0xFX1JPVU5ESU5HCisjZGVmaW5lIE1QWV9CWV9RVUFOVF9NVUxUX1gyX09VVDMyKG91dCwgaW5wLCBtdWx0aXBsaWVyLCBsZWZ0X3NoaWZ0LCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodF9zaGlmdCkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYWVfaW50NjQgb3V0NjRfMCwgb3V0NjRfMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFlX2ludDY0IElOVDY0X09ORSA9IEFFX01PVklOVDY0X0ZST01JTlQzMlgyKEFFX01PVkRBMzJYMigwLCAxKSk7IFwKKyAgICBhZV9pbnQ2NCByb3VuZF92YWwgPSBBRV9TTEFBNjRTKElOVDY0X09ORSwgMzAgLSBsZWZ0X3NoaWZ0KTsgICAgICBcCisgICAgQUVfTVVMMzJYMlNfSEhfTEwob3V0NjRfMCwgb3V0NjRfMSwgaW5wLCBBRV9NT1ZEQTMyKG11bHRpcGxpZXIpKTsgXAorICAgIG91dDY0XzAgPSBBRV9BREQ2NFMob3V0NjRfMCwgcm91bmRfdmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvdXQ2NF8xID0gQUVfQURENjRTKG91dDY0XzEsIHJvdW5kX3ZhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgb3V0ID0gQUVfVFJVTkNBMzJYMkY2NFMob3V0NjRfMCwgb3V0NjRfMSwgMSArIGxlZnRfc2hpZnQpOyAgICAgICAgXAorICB9CisKKyNkZWZpbmUgTVBZX0JZX1FVQU5UX01VTFRfWDJYMl9PVVQzMihvdXQxLCBvdXQyLCBpbnAxLCBpbnAyLCBtdWx0aXBsaWVyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdF9zaGlmdCwgcmlnaHRfc2hpZnQpICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhZV9pbnQ2NCBvdXQ2NF8wLCBvdXQ2NF8xLCBvdXQ2NF8yLCBvdXQ2NF8zOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYWVfaW50NjQgSU5UNjRfT05FID0gQUVfTU9WSU5UNjRfRlJPTUlOVDMyWDIoQUVfTU9WREEzMlgyKDAsIDEpKTsgICAgXAorICAgIGFlX2ludDY0IHJvdW5kX3ZhbCA9IEFFX1NMQUE2NFMoSU5UNjRfT05FLCAzMCAtIGxlZnRfc2hpZnQpOyAgICAgICAgIFwKKyAgICBBRV9NVUwzMlgyU19ISF9MTChvdXQ2NF8wLCBvdXQ2NF8xLCBpbnAxLCBBRV9NT1ZEQTMyKG11bHRpcGxpZXIpKTsgICBcCisgICAgQUVfTVVMMzJYMlNfSEhfTEwob3V0NjRfMiwgb3V0NjRfMywgaW5wMiwgQUVfTU9WREEzMihtdWx0aXBsaWVyKSk7ICAgXAorICAgIG91dDY0XzAgPSBBRV9BREQ2NFMob3V0NjRfMCwgcm91bmRfdmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvdXQ2NF8xID0gQUVfQURENjRTKG91dDY0XzEsIHJvdW5kX3ZhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgb3V0NjRfMiA9IEFFX0FERDY0UyhvdXQ2NF8yLCByb3VuZF92YWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG91dDY0XzMgPSBBRV9BREQ2NFMob3V0NjRfMywgcm91bmRfdmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvdXQxID0gQUVfVFJVTkNBMzJYMkY2NFMob3V0NjRfMCwgb3V0NjRfMSwgMSArIGxlZnRfc2hpZnQpOyAgICAgICAgICBcCisgICAgb3V0MiA9IEFFX1RSVU5DQTMyWDJGNjRTKG91dDY0XzIsIG91dDY0XzMsIDEgKyBsZWZ0X3NoaWZ0KTsgICAgICAgICAgXAorICB9CisjZWxzZSAvKiAjaWYgVEZMSVRFX1NJTkdMRV9ST1VORElORyAqLworI2RlZmluZSBNUFlfQllfUVVBTlRfTVVMVF9YMl9PVVQzMihvdXQsIGlucCwgbXVsdGlwbGllciwgbGVmdF9zaGlmdCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodF9zaGlmdCkgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQgPSBBRV9TTEFBMzIoaW5wLCBsZWZ0X3NoaWZ0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBvdXQgPSBBRV9NVUxGUDMyWDJSQVMob3V0LCBBRV9NT1ZEQTMyKG11bHRpcGxpZXIpKTsgICAgICAgICAgICAgICAgXAorICBvdXQgPSBBRV9TUkFBMzJTWU1TKG91dCwgcmlnaHRfc2hpZnQpOworCisjZGVmaW5lIE1QWV9CWV9RVUFOVF9NVUxUX1gyWDJfT1VUMzIob3V0MSwgb3V0MiwgaW5wMSwgaW5wMiwgbXVsdGlwbGllciwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnRfc2hpZnQsIHJpZ2h0X3NoaWZ0KSAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYWVfaW50MzJ4MiBkX2xzID0gQUVfTU9WREEzMigxIDw8IGxlZnRfc2hpZnQpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFFX01VTDJQMzJYNChvdXQxLCBvdXQyLCBpbnAxLCBpbnAyLCBkX2xzLCBkX2xzKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBBRV9NVUxGMlAzMlg0UkFTKG91dDEsIG91dDIsIG91dDEsIG91dDIsIEFFX01PVkRBMzIobXVsdGlwbGllciksICAgICBcCisgICAgICAgICAgICAgICAgICAgICBBRV9NT1ZEQTMyKG11bHRpcGxpZXIpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG91dDEgPSBBRV9TUkFBMzJTWU1TKG91dDEsIHJpZ2h0X3NoaWZ0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvdXQyID0gQUVfU1JBQTMyU1lNUyhvdXQyLCByaWdodF9zaGlmdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNlbmRpZiAvKiAjaWYgVEZMSVRFX1NJTkdMRV9ST1VORElORyAqLworCiB2b2lkIGNhbGNfY2VsbF9zdGF0ZV93aXRob3V0X2NpZmcoaW50MTZfdCogY2VsbF9zdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90KiBmb3JnZXRfZ2F0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90KiBjZWxsX2dhdGUsCkBAIC0xMjQsNyArMTcyLDcgQEAKIAogICAgICAgQUVfTVVMMTZYNChkX211bF8wLCBkX211bF8xLCBkX2NnXzAsIGRfaWdfMCk7CiAgICAgICBkX211bF8wID0gQUVfU1JBQTMyU1lNUyhkX211bF8wLCBzaGlmdDIpOwotICAgICAgZF9jZ18wID0gQUVfU0FUMTZYNChkX211bF8wLCBkX211bF8xKTsKKyAgICAgIGRfY2dfMCA9IEFFX1NBVDE2WDQoZF9tdWxfMCwgZF9tdWxfMCk7CiAKICAgICAgIGRfY3Nfd18wID0gQUVfQUREMTZTKGRfY3Nfd18wLCBkX2NnXzApOwogICAgICAgQUVfTUlOTUFYMTYoZF9jc193XzAsIGRfbWluLCBkX21heCk7CkBAIC0xODcsMTEgKzIzNSwxMSBAQAogCiAgICAgICBBRV9NVUwxNlg0KGRfbXVsXzAsIGRfbXVsXzEsIGRfY3Nfcl8wLCBkX2ZnXzApOwogICAgICAgZF9tdWxfMCA9IEFFX1NSQUEzMlNZTVMoZF9tdWxfMCwgc2hpZnQxKTsKLSAgICAgIGRfY3Nfd18wID0gQUVfU0FUMTZYNChkX211bF8wLCBkX211bF8xKTsKKyAgICAgIGRfY3Nfd18wID0gQUVfU0FUMTZYNChkX211bF8wLCBkX211bF8wKTsKIAogICAgICAgQUVfTVVMMTZYNChkX211bF8wLCBkX211bF8xLCBkX2NnXzAsIGRfaWdfMCk7CiAgICAgICBkX211bF8wID0gQUVfU1JBQTMyU1lNUyhkX211bF8wLCBzaGlmdDIpOwotICAgICAgZF9jZ18wID0gQUVfU0FUMTZYNChkX211bF8wLCBkX211bF8xKTsKKyAgICAgIGRfY2dfMCA9IEFFX1NBVDE2WDQoZF9tdWxfMCwgZF9tdWxfMCk7CiAKICAgICAgIGRfY3Nfd18wID0gQUVfQUREMTZTKGRfY3Nfd18wLCBkX2NnXzApOwogICAgICAgQUVfTUlOTUFYMTYoZF9jc193XzAsIGRfbWluLCBkX21heCk7CkBAIC0yOTgsNyArMzQ2LDcgQEAKICAgICAgIGRfMW1mZ18wID0gQUVfU1VCMTZTKGRfb25lLCBkX2ZnXzApOwogICAgICAgQUVfTVVMMTZYNChkX211bF8wLCBkX211bF8xLCBkX2NnXzAsIGRfMW1mZ18wKTsKICAgICAgIGRfbXVsXzAgPSBBRV9TUkFBMzJTWU1TKGRfbXVsXzAsIHNoaWZ0Mik7Ci0gICAgICBkX2NnXzAgPSBBRV9TQVQxNlg0KGRfbXVsXzAsIGRfbXVsXzEpOworICAgICAgZF9jZ18wID0gQUVfU0FUMTZYNChkX211bF8wLCBkX211bF8wKTsKIAogICAgICAgZF9jc193XzAgPSBBRV9BREQxNlMoZF9jc193XzAsIGRfY2dfMCk7CiAgICAgICBBRV9NSU5NQVgxNihkX2NzX3dfMCwgZF9taW4sIGRfbWF4KTsKQEAgLTM2MCwxMiArNDA4LDEyIEBACiAKICAgICAgIEFFX01VTDE2WDQoZF9tdWxfMCwgZF9tdWxfMSwgZF9jc19yXzAsIGRfZmdfMCk7CiAgICAgICBkX211bF8wID0gQUVfU1JBQTMyU1lNUyhkX211bF8wLCBzaGlmdDEpOwotICAgICAgZF9jc193XzAgPSBBRV9TQVQxNlg0KGRfbXVsXzAsIGRfbXVsXzEpOworICAgICAgZF9jc193XzAgPSBBRV9TQVQxNlg0KGRfbXVsXzAsIGRfbXVsXzApOwogCiAgICAgICBkXzFtZmdfMCA9IEFFX1NVQjE2UyhkX29uZSwgZF9mZ18wKTsKICAgICAgIEFFX01VTDE2WDQoZF9tdWxfMCwgZF9tdWxfMSwgZF9jZ18wLCBkXzFtZmdfMCk7CiAgICAgICBkX211bF8wID0gQUVfU1JBQTMyU1lNUyhkX211bF8wLCBzaGlmdDIpOwotICAgICAgZF9jZ18wID0gQUVfU0FUMTZYNChkX211bF8wLCBkX211bF8xKTsKKyAgICAgIGRfY2dfMCA9IEFFX1NBVDE2WDQoZF9tdWxfMCwgZF9tdWxfMCk7CiAKICAgICAgIGRfY3Nfd18wID0gQUVfQUREMTZTKGRfY3Nfd18wLCBkX2NnXzApOwogICAgICAgQUVfTUlOTUFYMTYoZF9jc193XzAsIGRfbWluLCBkX21heCk7CkBAIC0zODcsNyArNDM1LDYgQEAKICAgYWVfaW50MTZ4NCBkYXRhX2FfMCwgZGF0YV9hXzE7CiAgIGFlX2ludDE2eDQgZGF0YV9iXzAsIGRhdGFfYl8xOwogICBhZV9pbnQzMngyIGRhdGFfYWJfMCwgZGF0YV9hYl8xLCBkYXRhX2FiXzIsIGRhdGFfYWJfMzsKLSAgYWVfaW50MzJ4MiBkX211bHRpcGxpZXIsIGRfbGVmdF9zaGlmdDsKICAgYWVfaW50MTZ4NCBkX3pwOwogICBhZV9pbnQxNng0IGRhdGFfY18wLCBkYXRhX2NfMTsKICAgYWVfaW50OHg4IGRhdGFfYzsKQEAgLTQwMSwxMyArNDQ4LDE1IEBACiAgIGFsaWduX3NyY19pbnB1dF8yID0gQUVfTEExMjhfUFAoKGFlX2ludDE2eDgqKXRtcF9pbnB1dF8yKTsKICAgYWxpZ25fZHN0X291dHB1dCA9IEFFX1pBTElHTjY0KCk7ICAvLyB6ZXJvIGFsaWdubWVudCByZWcKIAotICBkX211bHRpcGxpZXIgPSBBRV9NT1ZEQTMyKG11bHRpcGxpZXIpOwogICBkX3pwID0gQUVfTU9WREExNih6ZXJvX3BvaW50KTsKIAorI2lmIFRGTElURV9TSU5HTEVfUk9VTkRJTkcKKyAgbGVmdF9zaGlmdCA9IHNoaWZ0OworICAodm9pZClyaWdodF9zaGlmdDsKKyNlbHNlICAvKiAjaWYgVEZMSVRFX1NJTkdMRV9ST1VORElORyAqLwogICBsZWZ0X3NoaWZ0ID0gc2hpZnQgPCAwID8gMCA6IHNoaWZ0OwogICByaWdodF9zaGlmdCA9IHNoaWZ0ID4gMCA/IDAgOiAtc2hpZnQ7Ci0KLSAgZF9sZWZ0X3NoaWZ0ID0gQUVfTU9WREEzMigxIDw8IGxlZnRfc2hpZnQpOworI2VuZGlmIC8qICNpZiBURkxJVEVfU0lOR0xFX1JPVU5ESU5HICovCiAjcHJhZ21hIGNvbmN1cnJlbnQKICAgZm9yIChpID0gMDsgaSA8IChudW1fZWxtcyA+PiAzKTsgaSsrKSB7CiAgICAgQUVfTEExNlg0WDJfSVAoZGF0YV9hXzAsIGRhdGFfYV8xLCBhbGlnbl9zcmNfaW5wdXRfMSwgdG1wX2lucHV0XzEpOwpAQCAtNDE1LDE4ICs0NjQsMTAgQEAKIAogICAgIEFFX01VTDE2WDQoZGF0YV9hYl8wLCBkYXRhX2FiXzEsIGRhdGFfYV8wLCBkYXRhX2JfMCk7CiAgICAgQUVfTVVMMTZYNChkYXRhX2FiXzIsIGRhdGFfYWJfMywgZGF0YV9hXzEsIGRhdGFfYl8xKTsKLSAgICBBRV9NVUwyUDMyWDQoZGF0YV9hYl8wLCBkYXRhX2FiXzEsIGRhdGFfYWJfMCwgZGF0YV9hYl8xLCBkX2xlZnRfc2hpZnQsCi0gICAgICAgICAgICAgICAgIGRfbGVmdF9zaGlmdCk7Ci0gICAgQUVfTVVMMlAzMlg0KGRhdGFfYWJfMiwgZGF0YV9hYl8zLCBkYXRhX2FiXzIsIGRhdGFfYWJfMywgZF9sZWZ0X3NoaWZ0LAotICAgICAgICAgICAgICAgICBkX2xlZnRfc2hpZnQpOwotICAgIEFFX01VTEYyUDMyWDRSQVMoZGF0YV9hYl8wLCBkYXRhX2FiXzEsIGRhdGFfYWJfMCwgZGF0YV9hYl8xLCBkX211bHRpcGxpZXIsCi0gICAgICAgICAgICAgICAgICAgICBkX211bHRpcGxpZXIpOwotICAgIEFFX01VTEYyUDMyWDRSQVMoZGF0YV9hYl8yLCBkYXRhX2FiXzMsIGRhdGFfYWJfMiwgZGF0YV9hYl8zLCBkX211bHRpcGxpZXIsCi0gICAgICAgICAgICAgICAgICAgICBkX211bHRpcGxpZXIpOwotICAgIGRhdGFfYWJfMCA9IEFFX1NSQUEzMlNZTVMoZGF0YV9hYl8wLCByaWdodF9zaGlmdCk7Ci0gICAgZGF0YV9hYl8xID0gQUVfU1JBQTMyU1lNUyhkYXRhX2FiXzEsIHJpZ2h0X3NoaWZ0KTsKLSAgICBkYXRhX2FiXzIgPSBBRV9TUkFBMzJTWU1TKGRhdGFfYWJfMiwgcmlnaHRfc2hpZnQpOwotICAgIGRhdGFfYWJfMyA9IEFFX1NSQUEzMlNZTVMoZGF0YV9hYl8zLCByaWdodF9zaGlmdCk7CisgICAgTVBZX0JZX1FVQU5UX01VTFRfWDJYMl9PVVQzMihkYXRhX2FiXzAsIGRhdGFfYWJfMSwgZGF0YV9hYl8wLCBkYXRhX2FiXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsaWVyLCBsZWZ0X3NoaWZ0LCByaWdodF9zaGlmdCk7CisgICAgTVBZX0JZX1FVQU5UX01VTFRfWDJYMl9PVVQzMihkYXRhX2FiXzIsIGRhdGFfYWJfMywgZGF0YV9hYl8yLCBkYXRhX2FiXzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsaWVyLCBsZWZ0X3NoaWZ0LCByaWdodF9zaGlmdCk7CiAgICAgZGF0YV9jXzAgPSBBRV9TQVQxNlg0KGRhdGFfYWJfMCwgZGF0YV9hYl8xKTsKICAgICBkYXRhX2NfMSA9IEFFX1NBVDE2WDQoZGF0YV9hYl8yLCBkYXRhX2FiXzMpOwogICAgIGRhdGFfY18wID0gQUVfU1VCMTZTKGRhdGFfY18wLCBkX3pwKTsKQEAgLTQ0NSwxOCArNDg2LDUzMiBAQAogICAgIEFFX0wxNl9JUChkYXRhX2JfMCwgKGFlX2ludDE2Kil0bXBfaW5wdXRfMiwgMik7CiAKICAgICBBRV9NVUwxNlg0KGRhdGFfYWJfMCwgZGF0YV9hYl8xLCBkYXRhX2FfMCwgZGF0YV9iXzApOwotICAgIGRhdGFfYWJfMCA9IEFFX01VTFAzMlgyKGRhdGFfYWJfMCwgZF9sZWZ0X3NoaWZ0KTsKLSAgICBkYXRhX2FiXzAgPSBBRV9NVUxGUDMyWDJSQVMoZGF0YV9hYl8wLCBkX211bHRpcGxpZXIpOwotICAgIGRhdGFfYWJfMCA9IEFFX1NSQUEzMlNZTVMoZGF0YV9hYl8wLCByaWdodF9zaGlmdCk7Ci0gICAgZGF0YV9jXzAgPSBBRV9TQVQxNlg0KGRhdGFfYWJfMCwgZGF0YV9hYl8xKTsKKyAgICBNUFlfQllfUVVBTlRfTVVMVF9YMl9PVVQzMihkYXRhX2FiXzAsIGRhdGFfYWJfMCwgbXVsdGlwbGllciwgbGVmdF9zaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodF9zaGlmdCk7CisgICAgZGF0YV9jXzAgPSBBRV9TQVQxNlg0KGRhdGFfYWJfMCwgZGF0YV9hYl8wKTsKICAgICBkYXRhX2NfMCA9IEFFX1NVQjE2UyhkYXRhX2NfMCwgZF96cCk7CiAgICAgZGF0YV9jID0gQUVfU0FUOFg4WDE2KGRhdGFfY18wLCBkYXRhX2NfMCk7CiAgICAgQUVfUzhfMF9JUChkYXRhX2MsIChhZV9pbnQ4KilvdXRwdXQsIDEpOwogICB9CiB9CisjZWxpZiBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KQorI2lmIFRGTElURV9TSU5HTEVfUk9VTkRJTkcKKyNkZWZpbmUgTVBZX0JZX1FVQU5UX01VTFRfWDJfT1VUMzIob3V0LCBpbnAsIG11bHRpcGxpZXIsIGxfc2hpZnQsIHJfc2hpZnQpIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhZV9pbnQ2NCBvdXQ2NF8wLCBvdXQ2NF8xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvdXQ2NF8wID0gQUVfTVVMMzJfSEgoaW5wLCBBRV9NT1ZEQTMyKG11bHRpcGxpZXIpKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvdXQ2NF8xID0gQUVfTVVMMzJfTEwoaW5wLCBBRV9NT1ZEQTMyKG11bHRpcGxpZXIpKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvdXQ2NF8wID0gQUVfU0xBQTY0UyhvdXQ2NF8wLCAxICsgbF9zaGlmdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvdXQ2NF8xID0gQUVfU0xBQTY0UyhvdXQ2NF8xLCAxICsgbF9zaGlmdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvdXQgPSBBRV9ST1VORDMyWDJGNjRTQVNZTShvdXQ2NF8wLCBvdXQ2NF8xKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIE1QWV9CWV9RVUFOVF9NVUxUX1gyWDJfT1VUMzIob3V0MSwgb3V0MiwgaW5wMSwgaW5wMiwgbXVsdGlwbGllciwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxfc2hpZnQsIHJfc2hpZnQpICAgICAgICAgICAgICAgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgYWVfaW50NjQgb3V0NjRfMCwgb3V0NjRfMSwgb3V0NjRfMiwgb3V0NjRfMzsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG91dDY0XzAgPSBBRV9NVUwzMl9ISChpbnAxLCBBRV9NT1ZEQTMyKG11bHRpcGxpZXIpKTsgICAgICAgICAgICAgICAgIFwKKyAgICBvdXQ2NF8xID0gQUVfTVVMMzJfTEwoaW5wMSwgQUVfTU9WREEzMihtdWx0aXBsaWVyKSk7ICAgICAgICAgICAgICAgICBcCisgICAgb3V0NjRfMiA9IEFFX01VTDMyX0hIKGlucDIsIEFFX01PVkRBMzIobXVsdGlwbGllcikpOyAgICAgICAgICAgICAgICAgXAorICAgIG91dDY0XzMgPSBBRV9NVUwzMl9MTChpbnAyLCBBRV9NT1ZEQTMyKG11bHRpcGxpZXIpKTsgICAgICAgICAgICAgICAgIFwKKyAgICBvdXQ2NF8wID0gQUVfU0xBQTY0UyhvdXQ2NF8wLCAxICsgbF9zaGlmdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgb3V0NjRfMSA9IEFFX1NMQUE2NFMob3V0NjRfMSwgMSArIGxfc2hpZnQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG91dDY0XzIgPSBBRV9TTEFBNjRTKG91dDY0XzIsIDEgKyBsX3NoaWZ0KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvdXQ2NF8zID0gQUVfU0xBQTY0UyhvdXQ2NF8zLCAxICsgbF9zaGlmdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgb3V0MSA9IEFFX1JPVU5EMzJYMkY2NFNBU1lNKG91dDY0XzAsIG91dDY0XzEpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG91dDIgPSBBRV9ST1VORDMyWDJGNjRTQVNZTShvdXQ2NF8yLCBvdXQ2NF8zKTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorI2Vsc2UgLyogI2lmIFRGTElURV9TSU5HTEVfUk9VTkRJTkcgKi8KKyNkZWZpbmUgTVBZX0JZX1FVQU5UX01VTFRfWDJfT1VUMzIob3V0LCBpbnAsIG11bHRpcGxpZXIsIGxfc2hpZnQsIHJfc2hpZnQpIFwKKyAgb3V0ID0gQUVfU0xBQTMyKGlucCwgbF9zaGlmdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0ID0gQUVfTVVMRlAzMlgyUkFTKG91dCwgQUVfTU9WREEzMihtdWx0aXBsaWVyKSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgb3V0ID0gQUVfUk9VTkQzMlgyRjY0U1NZTShBRV9TUkFBNjQoQUVfQ1ZUNjRGMzJfSChvdXQpLCByX3NoaWZ0KSwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRV9TUkFBNjQoQUVfQ1ZUNjRGMzJfTChvdXQpLCByX3NoaWZ0KSk7CisKKyNkZWZpbmUgTVBZX0JZX1FVQU5UX01VTFRfWDJYMl9PVVQzMihvdXQxLCBvdXQyLCBpbnAxLCBpbnAyLCBtdWx0aXBsaWVyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbF9zaGlmdCwgcl9zaGlmdCkgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhZV9pbnQzMngyIGRfbHMgPSBBRV9NT1ZEQTMyKDEgPDwgbF9zaGlmdCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgb3V0MSA9IEFFX01VTFAzMlgyKGlucDEsIGRfbHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG91dDIgPSBBRV9NVUxQMzJYMihpbnAyLCBkX2xzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBvdXQxID0gQUVfTVVMRlAzMlgyUkFTKG91dDEsIEFFX01PVkRBMzIobXVsdGlwbGllcikpOyAgICAgICAgICAgICAgICBcCisgICAgb3V0MiA9IEFFX01VTEZQMzJYMlJBUyhvdXQyLCBBRV9NT1ZEQTMyKG11bHRpcGxpZXIpKTsgICAgICAgICAgICAgICAgXAorICAgIG91dDEgPSBBRV9ST1VORDMyWDJGNjRTU1lNKEFFX1NSQUE2NChBRV9DVlQ2NEYzMl9IKG91dDEpLCByX3NoaWZ0KSwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBRV9TUkFBNjQoQUVfQ1ZUNjRGMzJfTChvdXQxKSwgcl9zaGlmdCkpOyBcCisgICAgb3V0MiA9IEFFX1JPVU5EMzJYMkY2NFNTWU0oQUVfU1JBQTY0KEFFX0NWVDY0RjMyX0gob3V0MiksIHJfc2hpZnQpLCAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFFX1NSQUE2NChBRV9DVlQ2NEYzMl9MKG91dDIpLCByX3NoaWZ0KSk7IFwKKyAgfQorI2VuZGlmIC8qICNpZiBURkxJVEVfU0lOR0xFX1JPVU5ESU5HICovCisKKyNpZm5kZWYgQUVfTVVMRlAxNlg0UlMKK3N0YXRpYyBpbmxpbmUgYWVfZjE2eDQgQUVfTVVMRlAxNlg0UlMoYWVfZjE2eDQgZDAsIGFlX2YxNng0IGQxKSB7CisgIGFlX2YxNng0IG91dHB1dDsKKyAgYWVfZjMyeDIgZDBfMzJfMCwgZDBfMzJfMSwgb3V0MzJfMCwgb3V0MzJfMTsKKyAgYWVfZjE2eDQgb25lX2QgPSBBRV9NT1ZEQTE2KDEpOworICBBRV9NVUwxNlg0KGQwXzMyXzAsIGQwXzMyXzEsIGQwLCBvbmVfZCk7CisgIG91dDMyXzAgPSBBRV9NVUxGUDMyWDE2WDJSU19IKGQwXzMyXzAsIGQxKTsKKyAgb3V0MzJfMSA9IEFFX01VTEZQMzJYMTZYMlJTX0woZDBfMzJfMSwgZDEpOworICBvdXRwdXQgPSBBRV9TRUwxNl82NDIwKEFFX01PVkYxNlg0X0ZST01GMzJYMihvdXQzMl8wKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBRV9NT1ZGMTZYNF9GUk9NRjMyWDIob3V0MzJfMSkpOworICByZXR1cm4gb3V0cHV0OworfQorI2VuZGlmCisKKyNpZm5kZWYgQUVfTUlOTUFYMTYKKyNkZWZpbmUgQUVfTUlOTUFYMTYoZGlub3V0LCBkX21pbiwgZF9tYXgpIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB4dGJvb2w0IGIwID0gQUVfTFQxNihkaW5vdXQsIGRfbWluKTsgIFwKKyAgICBBRV9NT1ZUMTZYNChkaW5vdXQsIGRfbWluLCBiMCk7ICAgICAgIFwKKyAgICBiMCA9IEFFX0xUMTYoZF9tYXgsIGRpbm91dCk7ICAgICAgICAgIFwKKyAgICBBRV9NT1ZUMTZYNChkaW5vdXQsIGRfbWF4LCBiMCk7ICAgICAgIFwKKyAgfQorI2VuZGlmCisKKyNpZm5kZWYgQUVfU1JBQTMyU1lNUworI2RlZmluZSBBRV9TUkFBMzJTWU1TKGlucCwgcmlnaHRfc2hpZnQpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBBRV9ST1VORDMyWDJGNjRTU1lNKEFFX1NSQUE2NChBRV9DVlQ2NEYzMl9IKGlucCksIHJpZ2h0X3NoaWZ0KSwgXAorICAgICAgICAgICAgICAgICAgICAgIEFFX1NSQUE2NChBRV9DVlQ2NEYzMl9MKGlucCksIHJpZ2h0X3NoaWZ0KSkKKyNlbmRpZgorCit2b2lkIGNhbGNfY2VsbF9zdGF0ZV93aXRob3V0X2NpZmcoaW50MTZfdCogY2VsbF9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90KiBmb3JnZXRfZ2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90KiBjZWxsX2dhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCogaW5wdXRfZ2F0ZSwgaW50IHNoaWZ0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2hpZnQyLCBpbnQgY2xpcCwgaW50IG51bV9lbG1zKSB7CisgIGNvbnN0IGFlX2ludDE2eDQgKnAxNng0X2NzX3IsICpwMTZ4NF9mZ19yOworICBjb25zdCBhZV9pbnQxNng0ICpwMTZ4NF9jZ19yLCAqcDE2eDRfaWdfcjsKKworICBhZV9pbnQxNng0KiBwMTZ4NF9jc193OworCisgIGFlX3ZhbGlnbiBhbGlnbl9jc19yLCBhbGlnbl9mZ19yOworICBhZV92YWxpZ24gYWxpZ25fY2dfciwgYWxpZ25faWdfcjsKKyAgYWVfdmFsaWduIGFsaWduX2NzX3c7CisKKyAgYWVfaW50MTZ4NCBkX2NzX3JfMCwgZF9jc19yXzE7CisgIGFlX2ludDE2eDQgZF9mZ18wLCBkX2ZnXzE7CisgIGFlX2ludDE2eDQgZF9jZ18wLCBkX2NnXzE7CisgIGFlX2ludDE2eDQgZF9pZ18wLCBkX2lnXzE7CisgIGFlX2ludDE2eDQgZF9jc193XzAsIGRfY3Nfd18xOworICBhZV9pbnQzMngyIGRfbXVsXzAsIGRfbXVsXzEsIGRfbXVsXzIsIGRfbXVsXzM7CisgIGFlX2ludDMyeDIgZF9tdWxfNCwgZF9tdWxfNSwgZF9tdWxfNiwgZF9tdWxfNzsKKworICBhZV9pbnQxNng0IGRfbWluLCBkX21heDsKKworICBpbnQgaSA9IDA7CisgIHAxNng0X2NzX3IgPSAoY29uc3QgYWVfaW50MTZ4NCopY2VsbF9zdGF0ZTsKKyAgcDE2eDRfZmdfciA9IChjb25zdCBhZV9pbnQxNng0Kilmb3JnZXRfZ2F0ZTsKKyAgcDE2eDRfY2dfciA9IChjb25zdCBhZV9pbnQxNng0KiljZWxsX2dhdGU7CisgIHAxNng0X2lnX3IgPSAoY29uc3QgYWVfaW50MTZ4NCopaW5wdXRfZ2F0ZTsKKworICBwMTZ4NF9jc193ID0gKGFlX2ludDE2eDQqKWNlbGxfc3RhdGU7CisKKyAgYWxpZ25fY3NfciA9IEFFX0xBNjRfUFAocDE2eDRfY3Nfcik7CisgIGFsaWduX2ZnX3IgPSBBRV9MQTY0X1BQKHAxNng0X2ZnX3IpOworICBhbGlnbl9jZ19yID0gQUVfTEE2NF9QUChwMTZ4NF9jZ19yKTsKKyAgYWxpZ25faWdfciA9IEFFX0xBNjRfUFAocDE2eDRfaWdfcik7CisKKyAgYWxpZ25fY3NfdyA9IEFFX1pBTElHTjY0KCk7CisKKyAgaWYgKGNsaXAgPiAwKSB7CisgICAgZF9taW4gPSBBRV9NT1ZEQTE2KC1jbGlwKTsKKyAgICBkX21heCA9IEFFX01PVkRBMTYoY2xpcCk7CisgIH0gZWxzZSB7CisgICAgZF9taW4gPSBBRV9NT1ZEQTE2KC0zMjc2OCk7CisgICAgZF9tYXggPSBBRV9NT1ZEQTE2KDMyNzY3KTsKKyAgfQorCisjcHJhZ21hIGNvbmN1cnJlbnQKKyAgaWYgKHNoaWZ0MSA9PSAxNSkgeworICAgIGZvciAoaSA9IDA7IGkgPCAobnVtX2VsbXMgPj4gMyk7IGkrKykgeworICAgICAgQUVfTEExNlg0X0lQKGRfY3Nfcl8wLCBhbGlnbl9jc19yLCBwMTZ4NF9jc19yKTsKKyAgICAgIEFFX0xBMTZYNF9JUChkX2NzX3JfMSwgYWxpZ25fY3NfciwgcDE2eDRfY3Nfcik7CisgICAgICBBRV9MQTE2WDRfSVAoZF9mZ18wLCBhbGlnbl9mZ19yLCBwMTZ4NF9mZ19yKTsKKyAgICAgIEFFX0xBMTZYNF9JUChkX2ZnXzEsIGFsaWduX2ZnX3IsIHAxNng0X2ZnX3IpOworICAgICAgQUVfTEExNlg0X0lQKGRfY2dfMCwgYWxpZ25fY2dfciwgcDE2eDRfY2dfcik7CisgICAgICBBRV9MQTE2WDRfSVAoZF9jZ18xLCBhbGlnbl9jZ19yLCBwMTZ4NF9jZ19yKTsKKyAgICAgIEFFX0xBMTZYNF9JUChkX2lnXzAsIGFsaWduX2lnX3IsIHAxNng0X2lnX3IpOworICAgICAgQUVfTEExNlg0X0lQKGRfaWdfMSwgYWxpZ25faWdfciwgcDE2eDRfaWdfcik7CisKKyAgICAgIGRfY3Nfd18wID0gQUVfTVVMRlAxNlg0UlMoZF9jc19yXzAsIGRfZmdfMCk7CisgICAgICBkX2NzX3dfMSA9IEFFX01VTEZQMTZYNFJTKGRfY3Nfcl8xLCBkX2ZnXzEpOworCisgICAgICBBRV9NVUwxNlg0KGRfbXVsXzQsIGRfbXVsXzUsIGRfY2dfMCwgZF9pZ18wKTsKKyAgICAgIEFFX01VTDE2WDQoZF9tdWxfNiwgZF9tdWxfNywgZF9jZ18xLCBkX2lnXzEpOworICAgICAgZF9tdWxfNCA9IEFFX1NSQUEzMlNZTVMoZF9tdWxfNCwgc2hpZnQyKTsKKyAgICAgIGRfbXVsXzUgPSBBRV9TUkFBMzJTWU1TKGRfbXVsXzUsIHNoaWZ0Mik7CisgICAgICBkX211bF82ID0gQUVfU1JBQTMyU1lNUyhkX211bF82LCBzaGlmdDIpOworICAgICAgZF9tdWxfNyA9IEFFX1NSQUEzMlNZTVMoZF9tdWxfNywgc2hpZnQyKTsKKworICAgICAgZF9jZ18wID0gQUVfU0FUMTZYNChkX211bF80LCBkX211bF81KTsKKyAgICAgIGRfY2dfMSA9IEFFX1NBVDE2WDQoZF9tdWxfNiwgZF9tdWxfNyk7CisgICAgICBkX2NzX3dfMCA9IEFFX0FERDE2UyhkX2NzX3dfMCwgZF9jZ18wKTsKKyAgICAgIGRfY3Nfd18xID0gQUVfQUREMTZTKGRfY3Nfd18xLCBkX2NnXzEpOworICAgICAgQUVfTUlOTUFYMTYoZF9jc193XzAsIGRfbWluLCBkX21heCk7CisgICAgICBBRV9NSU5NQVgxNihkX2NzX3dfMSwgZF9taW4sIGRfbWF4KTsKKworICAgICAgQUVfU0ExNlg0X0lQKGRfY3Nfd18wLCBhbGlnbl9jc193LCBwMTZ4NF9jc193KTsKKyAgICAgIEFFX1NBMTZYNF9JUChkX2NzX3dfMSwgYWxpZ25fY3NfdywgcDE2eDRfY3Nfdyk7CisgICAgfQorICAgIEFFX1NBNjRQT1NfRlAoYWxpZ25fY3NfdywgcDE2eDRfY3Nfdyk7ICAvLyBmaW5hbGl6ZSB0aGUgc3RyZWFtCisKKyAgICBjb25zdCBhZV9pbnQxNiAqcDE2X2NzX3IsICpwMTZfZmdfcjsKKyAgICBjb25zdCBhZV9pbnQxNiAqcDE2X2NnX3IsICpwMTZfaWdfcjsKKworICAgIGFlX2ludDE2KiBwMTZfY3NfdzsKKworICAgIHAxNl9jc19yID0gKGNvbnN0IGFlX2ludDE2KilwMTZ4NF9jc19yOworICAgIHAxNl9mZ19yID0gKGNvbnN0IGFlX2ludDE2KilwMTZ4NF9mZ19yOworICAgIHAxNl9jZ19yID0gKGNvbnN0IGFlX2ludDE2KilwMTZ4NF9jZ19yOworICAgIHAxNl9pZ19yID0gKGNvbnN0IGFlX2ludDE2KilwMTZ4NF9pZ19yOworCisgICAgcDE2X2NzX3cgPSAoYWVfaW50MTYqKXAxNng0X2NzX3c7CisgICAgLy8gcmVzaWR1ZSBpdGVyYXRpb25zCisjcHJhZ21hIGNvbmN1cnJlbnQKKyNwcmFnbWEgbG9vcF9jb3VudCBtYXggPSA3CisgICAgZm9yIChpID0gMDsgaSA8ICgobnVtX2VsbXMpJjcpOyBpKyspIHsKKyAgICAgIGRfY3Nfcl8wID0gcDE2X2NzX3JbaV07CisgICAgICBkX2ZnXzAgPSBwMTZfZmdfcltpXTsKKyAgICAgIGRfY2dfMCA9IHAxNl9jZ19yW2ldOworICAgICAgZF9pZ18wID0gcDE2X2lnX3JbaV07CisKKyAgICAgIGRfY3Nfd18wID0gQUVfTVVMRlAxNlg0UlMoZF9jc19yXzAsIGRfZmdfMCk7CisKKyAgICAgIEFFX01VTDE2WDQoZF9tdWxfMCwgZF9tdWxfMSwgZF9jZ18wLCBkX2lnXzApOworICAgICAgZF9tdWxfMCA9IEFFX1NSQUEzMlNZTVMoZF9tdWxfMCwgc2hpZnQyKTsKKyAgICAgIGRfY2dfMCA9IEFFX1NBVDE2WDQoZF9tdWxfMCwgZF9tdWxfMCk7CisKKyAgICAgIGRfY3Nfd18wID0gQUVfQUREMTZTKGRfY3Nfd18wLCBkX2NnXzApOworICAgICAgQUVfTUlOTUFYMTYoZF9jc193XzAsIGRfbWluLCBkX21heCk7CisgICAgICBwMTZfY3Nfd1tpXSA9IGRfY3Nfd18wOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKG51bV9lbG1zID4+IDMpOyBpKyspIHsKKyAgICAgIEFFX0xBMTZYNF9JUChkX2NzX3JfMCwgYWxpZ25fY3NfciwgcDE2eDRfY3Nfcik7CisgICAgICBBRV9MQTE2WDRfSVAoZF9jc19yXzEsIGFsaWduX2NzX3IsIHAxNng0X2NzX3IpOworICAgICAgQUVfTEExNlg0X0lQKGRfZmdfMCwgYWxpZ25fZmdfciwgcDE2eDRfZmdfcik7CisgICAgICBBRV9MQTE2WDRfSVAoZF9mZ18xLCBhbGlnbl9mZ19yLCBwMTZ4NF9mZ19yKTsKKyAgICAgIEFFX0xBMTZYNF9JUChkX2NnXzAsIGFsaWduX2NnX3IsIHAxNng0X2NnX3IpOworICAgICAgQUVfTEExNlg0X0lQKGRfY2dfMSwgYWxpZ25fY2dfciwgcDE2eDRfY2dfcik7CisgICAgICBBRV9MQTE2WDRfSVAoZF9pZ18wLCBhbGlnbl9pZ19yLCBwMTZ4NF9pZ19yKTsKKyAgICAgIEFFX0xBMTZYNF9JUChkX2lnXzEsIGFsaWduX2lnX3IsIHAxNng0X2lnX3IpOworCisgICAgICBBRV9NVUwxNlg0KGRfbXVsXzAsIGRfbXVsXzEsIGRfY3Nfcl8wLCBkX2ZnXzApOworICAgICAgQUVfTVVMMTZYNChkX211bF8yLCBkX211bF8zLCBkX2NzX3JfMSwgZF9mZ18xKTsKKyAgICAgIGRfbXVsXzAgPSBBRV9TUkFBMzJTWU1TKGRfbXVsXzAsIHNoaWZ0MSk7CisgICAgICBkX211bF8xID0gQUVfU1JBQTMyU1lNUyhkX211bF8xLCBzaGlmdDEpOworICAgICAgZF9tdWxfMiA9IEFFX1NSQUEzMlNZTVMoZF9tdWxfMiwgc2hpZnQxKTsKKyAgICAgIGRfbXVsXzMgPSBBRV9TUkFBMzJTWU1TKGRfbXVsXzMsIHNoaWZ0MSk7CisKKyAgICAgIGRfY3Nfd18wID0gQUVfU0FUMTZYNChkX211bF8wLCBkX211bF8xKTsKKyAgICAgIGRfY3Nfd18xID0gQUVfU0FUMTZYNChkX211bF8yLCBkX211bF8zKTsKKworICAgICAgQUVfTVVMMTZYNChkX211bF80LCBkX211bF81LCBkX2NnXzAsIGRfaWdfMCk7CisgICAgICBBRV9NVUwxNlg0KGRfbXVsXzYsIGRfbXVsXzcsIGRfY2dfMSwgZF9pZ18xKTsKKyAgICAgIGRfbXVsXzQgPSBBRV9TUkFBMzJTWU1TKGRfbXVsXzQsIHNoaWZ0Mik7CisgICAgICBkX211bF81ID0gQUVfU1JBQTMyU1lNUyhkX211bF81LCBzaGlmdDIpOworICAgICAgZF9tdWxfNiA9IEFFX1NSQUEzMlNZTVMoZF9tdWxfNiwgc2hpZnQyKTsKKyAgICAgIGRfbXVsXzcgPSBBRV9TUkFBMzJTWU1TKGRfbXVsXzcsIHNoaWZ0Mik7CisKKyAgICAgIGRfY2dfMCA9IEFFX1NBVDE2WDQoZF9tdWxfNCwgZF9tdWxfNSk7CisgICAgICBkX2NnXzEgPSBBRV9TQVQxNlg0KGRfbXVsXzYsIGRfbXVsXzcpOworICAgICAgZF9jc193XzAgPSBBRV9BREQxNlMoZF9jc193XzAsIGRfY2dfMCk7CisgICAgICBkX2NzX3dfMSA9IEFFX0FERDE2UyhkX2NzX3dfMSwgZF9jZ18xKTsKKyAgICAgIEFFX01JTk1BWDE2KGRfY3Nfd18wLCBkX21pbiwgZF9tYXgpOworICAgICAgQUVfTUlOTUFYMTYoZF9jc193XzEsIGRfbWluLCBkX21heCk7CisKKyAgICAgIEFFX1NBMTZYNF9JUChkX2NzX3dfMCwgYWxpZ25fY3NfdywgcDE2eDRfY3Nfdyk7CisgICAgICBBRV9TQTE2WDRfSVAoZF9jc193XzEsIGFsaWduX2NzX3csIHAxNng0X2NzX3cpOworICAgIH0KKyAgICBBRV9TQTY0UE9TX0ZQKGFsaWduX2NzX3csIHAxNng0X2NzX3cpOyAgLy8gZmluYWxpemUgdGhlIHN0cmVhbQorCisgICAgY29uc3QgYWVfaW50MTYgKnAxNl9jc19yLCAqcDE2X2ZnX3I7CisgICAgY29uc3QgYWVfaW50MTYgKnAxNl9jZ19yLCAqcDE2X2lnX3I7CisKKyAgICBhZV9pbnQxNiogcDE2X2NzX3c7CisKKyAgICBwMTZfY3NfciA9IChjb25zdCBhZV9pbnQxNiopcDE2eDRfY3NfcjsKKyAgICBwMTZfZmdfciA9IChjb25zdCBhZV9pbnQxNiopcDE2eDRfZmdfcjsKKyAgICBwMTZfY2dfciA9IChjb25zdCBhZV9pbnQxNiopcDE2eDRfY2dfcjsKKyAgICBwMTZfaWdfciA9IChjb25zdCBhZV9pbnQxNiopcDE2eDRfaWdfcjsKKworICAgIHAxNl9jc193ID0gKGFlX2ludDE2KilwMTZ4NF9jc193OworICAgIC8vIHJlc2lkdWUgaXRlcmF0aW9ucworI3ByYWdtYSBjb25jdXJyZW50CisjcHJhZ21hIGxvb3BfY291bnQgbWF4ID0gNworICAgIGZvciAoaSA9IDA7IGkgPCAoKG51bV9lbG1zKSY3KTsgaSsrKSB7CisgICAgICBkX2NzX3JfMCA9IHAxNl9jc19yW2ldOworICAgICAgZF9mZ18wID0gcDE2X2ZnX3JbaV07CisgICAgICBkX2NnXzAgPSBwMTZfY2dfcltpXTsKKyAgICAgIGRfaWdfMCA9IHAxNl9pZ19yW2ldOworCisgICAgICBBRV9NVUwxNlg0KGRfbXVsXzAsIGRfbXVsXzEsIGRfY3Nfcl8wLCBkX2ZnXzApOworICAgICAgZF9tdWxfMCA9IEFFX1NSQUEzMlNZTVMoZF9tdWxfMCwgc2hpZnQxKTsKKyAgICAgIGRfY3Nfd18wID0gQUVfU0FUMTZYNChkX211bF8wLCBkX211bF8wKTsKKworICAgICAgQUVfTVVMMTZYNChkX211bF8wLCBkX211bF8xLCBkX2NnXzAsIGRfaWdfMCk7CisgICAgICBkX211bF8wID0gQUVfU1JBQTMyU1lNUyhkX211bF8wLCBzaGlmdDIpOworICAgICAgZF9jZ18wID0gQUVfU0FUMTZYNChkX211bF8wLCBkX211bF8wKTsKKworICAgICAgZF9jc193XzAgPSBBRV9BREQxNlMoZF9jc193XzAsIGRfY2dfMCk7CisgICAgICBBRV9NSU5NQVgxNihkX2NzX3dfMCwgZF9taW4sIGRfbWF4KTsKKyAgICAgIHAxNl9jc193W2ldID0gZF9jc193XzA7CisgICAgfQorICB9Cit9CisKK3ZvaWQgY2FsY19jZWxsX3N0YXRlX3dpdGhfY2lmZyhpbnQxNl90KiBjZWxsX3N0YXRlLCBjb25zdCBpbnQxNl90KiBmb3JnZXRfZ2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90KiBjZWxsX2dhdGUsIGludCBzaGlmdDEsIGludCBzaGlmdDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNsaXAsIGludCBudW1fZWxtcykgeworICBjb25zdCBhZV9pbnQxNng0ICpwMTZ4NF9jc19yLCAqcDE2eDRfZmdfcjsKKyAgY29uc3QgYWVfaW50MTZ4NCogcDE2eDRfY2dfcjsKKworICBhZV9pbnQxNng0KiBwMTZ4NF9jc193OworCisgIGFlX3ZhbGlnbiBhbGlnbl9jc19yLCBhbGlnbl9mZ19yOworICBhZV92YWxpZ24gYWxpZ25fY2dfcjsKKyAgYWVfdmFsaWduIGFsaWduX2NzX3c7CisKKyAgYWVfaW50MTZ4NCBkX2NzX3JfMCwgZF9jc19yXzE7CisgIGFlX2ludDE2eDQgZF9mZ18wLCBkX2ZnXzE7CisgIGFlX2ludDE2eDQgZF9jZ18wLCBkX2NnXzE7CisgIGFlX2ludDE2eDQgZF8xbWZnXzAsIGRfMW1mZ18xOworICBhZV9pbnQxNng0IGRfY3Nfd18wLCBkX2NzX3dfMTsKKyAgYWVfaW50MzJ4MiBkX211bF8wLCBkX211bF8xLCBkX211bF8yLCBkX211bF8zOworICBhZV9pbnQzMngyIGRfbXVsXzQsIGRfbXVsXzUsIGRfbXVsXzYsIGRfbXVsXzc7CisKKyAgYWVfaW50MTZ4NCBkX21pbiwgZF9tYXgsIGRfb25lOworCisgIGludCBpID0gMDsKKyAgcDE2eDRfY3NfciA9IChjb25zdCBhZV9pbnQxNng0KiljZWxsX3N0YXRlOworICBwMTZ4NF9mZ19yID0gKGNvbnN0IGFlX2ludDE2eDQqKWZvcmdldF9nYXRlOworICBwMTZ4NF9jZ19yID0gKGNvbnN0IGFlX2ludDE2eDQqKWNlbGxfZ2F0ZTsKKworICBwMTZ4NF9jc193ID0gKGFlX2ludDE2eDQqKWNlbGxfc3RhdGU7CisKKyAgYWxpZ25fY3NfciA9IEFFX0xBNjRfUFAocDE2eDRfY3Nfcik7CisgIGFsaWduX2ZnX3IgPSBBRV9MQTY0X1BQKHAxNng0X2ZnX3IpOworICBhbGlnbl9jZ19yID0gQUVfTEE2NF9QUChwMTZ4NF9jZ19yKTsKKworICBhbGlnbl9jc193ID0gQUVfWkFMSUdONjQoKTsKKworICBpZiAoY2xpcCA+IDApIHsKKyAgICBkX21pbiA9IEFFX01PVkRBMTYoLWNsaXApOworICAgIGRfbWF4ID0gQUVfTU9WREExNihjbGlwKTsKKyAgfSBlbHNlIHsKKyAgICBkX21pbiA9IEFFX01PVkRBMTYoLTMyNzY4KTsKKyAgICBkX21heCA9IEFFX01PVkRBMTYoMzI3NjcpOworICB9CisgIGRfb25lID0gQUVfTU9WREExNigzMjc2Nyk7CisKKyNwcmFnbWEgY29uY3VycmVudAorICBpZiAoc2hpZnQxID09IDE1KSB7CisgICAgZm9yIChpID0gMDsgaSA8IChudW1fZWxtcyA+PiAzKTsgaSsrKSB7CisgICAgICBBRV9MQTE2WDRfSVAoZF9jc19yXzAsIGFsaWduX2NzX3IsIHAxNng0X2NzX3IpOworICAgICAgQUVfTEExNlg0X0lQKGRfY3Nfcl8xLCBhbGlnbl9jc19yLCBwMTZ4NF9jc19yKTsKKyAgICAgIEFFX0xBMTZYNF9JUChkX2ZnXzAsIGFsaWduX2ZnX3IsIHAxNng0X2ZnX3IpOworICAgICAgQUVfTEExNlg0X0lQKGRfZmdfMSwgYWxpZ25fZmdfciwgcDE2eDRfZmdfcik7CisgICAgICBBRV9MQTE2WDRfSVAoZF9jZ18wLCBhbGlnbl9jZ19yLCBwMTZ4NF9jZ19yKTsKKyAgICAgIEFFX0xBMTZYNF9JUChkX2NnXzEsIGFsaWduX2NnX3IsIHAxNng0X2NnX3IpOworCisgICAgICBkX2NzX3dfMCA9IEFFX01VTEZQMTZYNFJTKGRfY3Nfcl8wLCBkX2ZnXzApOworICAgICAgZF9jc193XzEgPSBBRV9NVUxGUDE2WDRSUyhkX2NzX3JfMSwgZF9mZ18xKTsKKworICAgICAgZF8xbWZnXzAgPSBBRV9TVUIxNlMoZF9vbmUsIGRfZmdfMCk7CisgICAgICBkXzFtZmdfMSA9IEFFX1NVQjE2UyhkX29uZSwgZF9mZ18xKTsKKyAgICAgIEFFX01VTDE2WDQoZF9tdWxfNCwgZF9tdWxfNSwgZF9jZ18wLCBkXzFtZmdfMCk7CisgICAgICBBRV9NVUwxNlg0KGRfbXVsXzYsIGRfbXVsXzcsIGRfY2dfMSwgZF8xbWZnXzEpOworICAgICAgZF9tdWxfNCA9IEFFX1NSQUEzMlNZTVMoZF9tdWxfNCwgc2hpZnQyKTsKKyAgICAgIGRfbXVsXzUgPSBBRV9TUkFBMzJTWU1TKGRfbXVsXzUsIHNoaWZ0Mik7CisgICAgICBkX211bF82ID0gQUVfU1JBQTMyU1lNUyhkX211bF82LCBzaGlmdDIpOworICAgICAgZF9tdWxfNyA9IEFFX1NSQUEzMlNZTVMoZF9tdWxfNywgc2hpZnQyKTsKKyAgICAgIGRfY2dfMCA9IEFFX1NBVDE2WDQoZF9tdWxfNCwgZF9tdWxfNSk7CisgICAgICBkX2NnXzEgPSBBRV9TQVQxNlg0KGRfbXVsXzYsIGRfbXVsXzcpOworCisgICAgICBkX2NzX3dfMCA9IEFFX0FERDE2UyhkX2NzX3dfMCwgZF9jZ18wKTsKKyAgICAgIGRfY3Nfd18xID0gQUVfQUREMTZTKGRfY3Nfd18xLCBkX2NnXzEpOworCisgICAgICBBRV9NSU5NQVgxNihkX2NzX3dfMCwgZF9taW4sIGRfbWF4KTsKKyAgICAgIEFFX01JTk1BWDE2KGRfY3Nfd18xLCBkX21pbiwgZF9tYXgpOworCisgICAgICBBRV9TQTE2WDRfSVAoZF9jc193XzAsIGFsaWduX2NzX3csIHAxNng0X2NzX3cpOworICAgICAgQUVfU0ExNlg0X0lQKGRfY3Nfd18xLCBhbGlnbl9jc193LCBwMTZ4NF9jc193KTsKKyAgICB9CisgICAgQUVfU0E2NFBPU19GUChhbGlnbl9jc193LCBwMTZ4NF9jc193KTsgIC8vIGZpbmFsaXplIHRoZSBzdHJlYW0KKworICAgIGNvbnN0IGFlX2ludDE2ICpwMTZfY3NfciwgKnAxNl9mZ19yOworICAgIGNvbnN0IGFlX2ludDE2KiBwMTZfY2dfcjsKKworICAgIGFlX2ludDE2KiBwMTZfY3NfdzsKKworICAgIHAxNl9jc19yID0gKGNvbnN0IGFlX2ludDE2KilwMTZ4NF9jc19yOworICAgIHAxNl9mZ19yID0gKGNvbnN0IGFlX2ludDE2KilwMTZ4NF9mZ19yOworICAgIHAxNl9jZ19yID0gKGNvbnN0IGFlX2ludDE2KilwMTZ4NF9jZ19yOworCisgICAgcDE2X2NzX3cgPSAoYWVfaW50MTYqKXAxNng0X2NzX3c7CisgICAgLy8gcmVzaWR1ZSBpdGVyYXRpb25zCisjcHJhZ21hIGNvbmN1cnJlbnQKKyNwcmFnbWEgbG9vcF9jb3VudCBtYXggPSA3CisgICAgZm9yIChpID0gMDsgaSA8ICgobnVtX2VsbXMpJjcpOyBpKyspIHsKKyAgICAgIGRfY3Nfcl8wID0gcDE2X2NzX3JbaV07CisgICAgICBkX2ZnXzAgPSBwMTZfZmdfcltpXTsKKyAgICAgIGRfY2dfMCA9IHAxNl9jZ19yW2ldOworCisgICAgICBkX2NzX3dfMCA9IEFFX01VTEZQMTZYNFJTKGRfY3Nfcl8wLCBkX2ZnXzApOworCisgICAgICBkXzFtZmdfMCA9IEFFX1NVQjE2UyhkX29uZSwgZF9mZ18wKTsKKyAgICAgIEFFX01VTDE2WDQoZF9tdWxfMCwgZF9tdWxfMSwgZF9jZ18wLCBkXzFtZmdfMCk7CisgICAgICBkX211bF8wID0gQUVfU1JBQTMyU1lNUyhkX211bF8wLCBzaGlmdDIpOworICAgICAgZF9jZ18wID0gQUVfU0FUMTZYNChkX211bF8wLCBkX211bF8wKTsKKworICAgICAgZF9jc193XzAgPSBBRV9BREQxNlMoZF9jc193XzAsIGRfY2dfMCk7CisgICAgICBBRV9NSU5NQVgxNihkX2NzX3dfMCwgZF9taW4sIGRfbWF4KTsKKyAgICAgIHAxNl9jc193W2ldID0gZF9jc193XzA7CisgICAgfQorICB9IGVsc2UgeworICAgIGZvciAoaSA9IDA7IGkgPCAobnVtX2VsbXMgPj4gMyk7IGkrKykgeworICAgICAgQUVfTEExNlg0X0lQKGRfY3Nfcl8wLCBhbGlnbl9jc19yLCBwMTZ4NF9jc19yKTsKKyAgICAgIEFFX0xBMTZYNF9JUChkX2NzX3JfMSwgYWxpZ25fY3NfciwgcDE2eDRfY3Nfcik7CisgICAgICBBRV9MQTE2WDRfSVAoZF9mZ18wLCBhbGlnbl9mZ19yLCBwMTZ4NF9mZ19yKTsKKyAgICAgIEFFX0xBMTZYNF9JUChkX2ZnXzEsIGFsaWduX2ZnX3IsIHAxNng0X2ZnX3IpOworICAgICAgQUVfTEExNlg0X0lQKGRfY2dfMCwgYWxpZ25fY2dfciwgcDE2eDRfY2dfcik7CisgICAgICBBRV9MQTE2WDRfSVAoZF9jZ18xLCBhbGlnbl9jZ19yLCBwMTZ4NF9jZ19yKTsKKworICAgICAgQUVfTVVMMTZYNChkX211bF8wLCBkX211bF8xLCBkX2NzX3JfMCwgZF9mZ18wKTsKKyAgICAgIEFFX01VTDE2WDQoZF9tdWxfMiwgZF9tdWxfMywgZF9jc19yXzEsIGRfZmdfMSk7CisgICAgICBkX211bF8wID0gQUVfU1JBQTMyU1lNUyhkX211bF8wLCBzaGlmdDEpOworICAgICAgZF9tdWxfMSA9IEFFX1NSQUEzMlNZTVMoZF9tdWxfMSwgc2hpZnQxKTsKKyAgICAgIGRfbXVsXzIgPSBBRV9TUkFBMzJTWU1TKGRfbXVsXzIsIHNoaWZ0MSk7CisgICAgICBkX211bF8zID0gQUVfU1JBQTMyU1lNUyhkX211bF8zLCBzaGlmdDEpOworICAgICAgZF9jc193XzAgPSBBRV9TQVQxNlg0KGRfbXVsXzAsIGRfbXVsXzEpOworICAgICAgZF9jc193XzEgPSBBRV9TQVQxNlg0KGRfbXVsXzIsIGRfbXVsXzMpOworCisgICAgICBkXzFtZmdfMCA9IEFFX1NVQjE2UyhkX29uZSwgZF9mZ18wKTsKKyAgICAgIGRfMW1mZ18xID0gQUVfU1VCMTZTKGRfb25lLCBkX2ZnXzEpOworICAgICAgQUVfTVVMMTZYNChkX211bF80LCBkX211bF81LCBkX2NnXzAsIGRfMW1mZ18wKTsKKyAgICAgIEFFX01VTDE2WDQoZF9tdWxfNiwgZF9tdWxfNywgZF9jZ18xLCBkXzFtZmdfMSk7CisgICAgICBkX211bF80ID0gQUVfU1JBQTMyU1lNUyhkX211bF80LCBzaGlmdDIpOworICAgICAgZF9tdWxfNSA9IEFFX1NSQUEzMlNZTVMoZF9tdWxfNSwgc2hpZnQyKTsKKyAgICAgIGRfbXVsXzYgPSBBRV9TUkFBMzJTWU1TKGRfbXVsXzYsIHNoaWZ0Mik7CisgICAgICBkX211bF83ID0gQUVfU1JBQTMyU1lNUyhkX211bF83LCBzaGlmdDIpOworICAgICAgZF9jZ18wID0gQUVfU0FUMTZYNChkX211bF80LCBkX211bF81KTsKKyAgICAgIGRfY2dfMSA9IEFFX1NBVDE2WDQoZF9tdWxfNiwgZF9tdWxfNyk7CisKKyAgICAgIGRfY3Nfd18wID0gQUVfQUREMTZTKGRfY3Nfd18wLCBkX2NnXzApOworICAgICAgZF9jc193XzEgPSBBRV9BREQxNlMoZF9jc193XzEsIGRfY2dfMSk7CisKKyAgICAgIEFFX01JTk1BWDE2KGRfY3Nfd18wLCBkX21pbiwgZF9tYXgpOworICAgICAgQUVfTUlOTUFYMTYoZF9jc193XzEsIGRfbWluLCBkX21heCk7CisKKyAgICAgIEFFX1NBMTZYNF9JUChkX2NzX3dfMCwgYWxpZ25fY3NfdywgcDE2eDRfY3Nfdyk7CisgICAgICBBRV9TQTE2WDRfSVAoZF9jc193XzEsIGFsaWduX2NzX3csIHAxNng0X2NzX3cpOworICAgIH0KKyAgICBBRV9TQTY0UE9TX0ZQKGFsaWduX2NzX3csIHAxNng0X2NzX3cpOyAgLy8gZmluYWxpemUgdGhlIHN0cmVhbQorCisgICAgY29uc3QgYWVfaW50MTYgKnAxNl9jc19yLCAqcDE2X2ZnX3I7CisgICAgY29uc3QgYWVfaW50MTYqIHAxNl9jZ19yOworCisgICAgYWVfaW50MTYqIHAxNl9jc193OworCisgICAgcDE2X2NzX3IgPSAoY29uc3QgYWVfaW50MTYqKXAxNng0X2NzX3I7CisgICAgcDE2X2ZnX3IgPSAoY29uc3QgYWVfaW50MTYqKXAxNng0X2ZnX3I7CisgICAgcDE2X2NnX3IgPSAoY29uc3QgYWVfaW50MTYqKXAxNng0X2NnX3I7CisKKyAgICBwMTZfY3NfdyA9IChhZV9pbnQxNiopcDE2eDRfY3NfdzsKKyAgICAvLyByZXNpZHVlIGl0ZXJhdGlvbnMKKyNwcmFnbWEgY29uY3VycmVudAorI3ByYWdtYSBsb29wX2NvdW50IG1heCA9IDcKKyAgICBmb3IgKGkgPSAwOyBpIDwgKChudW1fZWxtcykmNyk7IGkrKykgeworICAgICAgZF9jc19yXzAgPSBwMTZfY3NfcltpXTsKKyAgICAgIGRfZmdfMCA9IHAxNl9mZ19yW2ldOworICAgICAgZF9jZ18wID0gcDE2X2NnX3JbaV07CisKKyAgICAgIEFFX01VTDE2WDQoZF9tdWxfMCwgZF9tdWxfMSwgZF9jc19yXzAsIGRfZmdfMCk7CisgICAgICBkX211bF8wID0gQUVfU1JBQTMyU1lNUyhkX211bF8wLCBzaGlmdDEpOworICAgICAgZF9jc193XzAgPSBBRV9TQVQxNlg0KGRfbXVsXzAsIGRfbXVsXzApOworCisgICAgICBkXzFtZmdfMCA9IEFFX1NVQjE2UyhkX29uZSwgZF9mZ18wKTsKKyAgICAgIEFFX01VTDE2WDQoZF9tdWxfMCwgZF9tdWxfMSwgZF9jZ18wLCBkXzFtZmdfMCk7CisgICAgICBkX211bF8wID0gQUVfU1JBQTMyU1lNUyhkX211bF8wLCBzaGlmdDIpOworICAgICAgZF9jZ18wID0gQUVfU0FUMTZYNChkX211bF8wLCBkX211bF8wKTsKKworICAgICAgZF9jc193XzAgPSBBRV9BREQxNlMoZF9jc193XzAsIGRfY2dfMCk7CisgICAgICBBRV9NSU5NQVgxNihkX2NzX3dfMCwgZF9taW4sIGRfbWF4KTsKKyAgICAgIHAxNl9jc193W2ldID0gZF9jc193XzA7CisgICAgfQorICB9Cit9CisKK3ZvaWQgeGFfbm5fZWxtX211bF8xNngxNl9hc3ltOHMoaW50OF90KiBvdXRwdXQsIGNvbnN0IGludDE2X3QqIGlucHV0XzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QqIGlucHV0XzIsIGludDMyX3QgbXVsdGlwbGllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzaGlmdCwgaW50MzJfdCB6ZXJvX3BvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2VsbXMpIHsKKyAgYWVfaW50MTZ4NCogdG1wX2lucHV0XzE7CisgIGFlX2ludDE2eDQqIHRtcF9pbnB1dF8yOworCisgIGFlX3ZhbGlnbiBhbGlnbl9zcmNfaW5wdXRfMSwgYWxpZ25fc3JjX2lucHV0XzI7CisKKyAgYWVfaW50MTZ4NCBkYXRhX2FfMCwgZGF0YV9iXzA7CisgIGFlX2ludDMyeDIgZGF0YV9hYl8wLCBkYXRhX2FiXzE7CisgIGFlX2ludDE2eDQgZF96cDsKKyAgYWVfaW50MTZ4NCBkYXRhX2NfMDsKKyAgYWVfaW50MTZ4NCBkX21pbjggPSBBRV9NT1ZEQTE2KC0xMjgpOworICBhZV9pbnQxNng0IGRfbWF4OCA9IEFFX01PVkRBMTYoMTI3KTsKKworICBpbnQgaSA9IDA7CisgIGludCBsZWZ0X3NoaWZ0LCByaWdodF9zaGlmdDsKKyAgdG1wX2lucHV0XzEgPSAoYWVfaW50MTZ4NCopKGlucHV0XzEpOworICB0bXBfaW5wdXRfMiA9IChhZV9pbnQxNng0KikoaW5wdXRfMik7CisKKyAgYWxpZ25fc3JjX2lucHV0XzEgPSBBRV9MQTY0X1BQKChhZV9pbnQxNng0Kil0bXBfaW5wdXRfMSk7CisgIGFsaWduX3NyY19pbnB1dF8yID0gQUVfTEE2NF9QUCgoYWVfaW50MTZ4NCopdG1wX2lucHV0XzIpOworCisgIGRfenAgPSBBRV9NT1ZEQTE2KHplcm9fcG9pbnQpOworCisjaWYgVEZMSVRFX1NJTkdMRV9ST1VORElORworICBsZWZ0X3NoaWZ0ID0gc2hpZnQ7CisgICh2b2lkKXJpZ2h0X3NoaWZ0OworI2Vsc2UgIC8qICNpZiBURkxJVEVfU0lOR0xFX1JPVU5ESU5HICovCisgIGxlZnRfc2hpZnQgPSBzaGlmdCA8IDAgPyAwIDogc2hpZnQ7CisgIHJpZ2h0X3NoaWZ0ID0gc2hpZnQgPiAwID8gMCA6IC1zaGlmdDsKKyNlbmRpZiAvKiAjaWYgVEZMSVRFX1NJTkdMRV9ST1VORElORyAqLworCisjcHJhZ21hIGNvbmN1cnJlbnQKKyAgZm9yIChpID0gMDsgaSA8IChudW1fZWxtcyA+PiAyKTsgaSsrKSB7CisgICAgQUVfTEExNlg0X0lQKGRhdGFfYV8wLCBhbGlnbl9zcmNfaW5wdXRfMSwgdG1wX2lucHV0XzEpOworICAgIEFFX0xBMTZYNF9JUChkYXRhX2JfMCwgYWxpZ25fc3JjX2lucHV0XzIsIHRtcF9pbnB1dF8yKTsKKworICAgIEFFX01VTDE2WDQoZGF0YV9hYl8wLCBkYXRhX2FiXzEsIGRhdGFfYV8wLCBkYXRhX2JfMCk7CisgICAgTVBZX0JZX1FVQU5UX01VTFRfWDJYMl9PVVQzMihkYXRhX2FiXzAsIGRhdGFfYWJfMSwgZGF0YV9hYl8wLCBkYXRhX2FiXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsaWVyLCBsZWZ0X3NoaWZ0LCByaWdodF9zaGlmdCk7CisgICAgZGF0YV9jXzAgPSBBRV9TQVQxNlg0KGRhdGFfYWJfMCwgZGF0YV9hYl8xKTsKKyAgICBkYXRhX2NfMCA9IEFFX1NVQjE2UyhkYXRhX2NfMCwgZF96cCk7CisgICAgQUVfTUlOTUFYMTYoZGF0YV9jXzAsIGRfbWluOCwgZF9tYXg4KTsKKworICAgICpvdXRwdXQrKyA9IEFFX01PVkFEMTZfMyhkYXRhX2NfMCk7CisgICAgKm91dHB1dCsrID0gQUVfTU9WQUQxNl8yKGRhdGFfY18wKTsKKyAgICAqb3V0cHV0KysgPSBBRV9NT1ZBRDE2XzEoZGF0YV9jXzApOworICAgICpvdXRwdXQrKyA9IEFFX01PVkFEMTZfMChkYXRhX2NfMCk7CisgIH0KKworICAvLyByZXNpZHVlIGl0ZXJhdGlvbnMKKyNwcmFnbWEgY29uY3VycmVudAorI3ByYWdtYSBsb29wX2NvdW50IG1heCA9IDMKKyAgZm9yIChpbnQgaiA9IDA7IGogPCAoKG51bV9lbG1zKSYzKTsgaisrKSB7CisgICAgQUVfTDE2X0lQKGRhdGFfYV8wLCAoYWVfaW50MTYqKXRtcF9pbnB1dF8xLCAyKTsKKyAgICBBRV9MMTZfSVAoZGF0YV9iXzAsIChhZV9pbnQxNiopdG1wX2lucHV0XzIsIDIpOworCisgICAgQUVfTVVMMTZYNChkYXRhX2FiXzAsIGRhdGFfYWJfMSwgZGF0YV9hXzAsIGRhdGFfYl8wKTsKKyAgICBNUFlfQllfUVVBTlRfTVVMVF9YMl9PVVQzMihkYXRhX2FiXzAsIGRhdGFfYWJfMCwgbXVsdGlwbGllciwgbGVmdF9zaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodF9zaGlmdCk7CisgICAgZGF0YV9jXzAgPSBBRV9TQVQxNlg0KGRhdGFfYWJfMCwgZGF0YV9hYl8wKTsKKyAgICBkYXRhX2NfMCA9IEFFX1NVQjE2UyhkYXRhX2NfMCwgZF96cCk7CisgICAgQUVfTUlOTUFYMTYoZGF0YV9jXzAsIGRfbWluOCwgZF9tYXg4KTsKKworICAgICpvdXRwdXQrKyA9IEFFX01PVkFEMTZfMChkYXRhX2NfMCk7CisgIH0KK30KICNlbmRpZiAgLy8gZGVmaW5lZChISUZJNSkKIAotfSAgLy8gbmFtZXNwYWNlIGxzdG1fZXZhbAotfSAgLy8gbmFtZXNwYWNlIG1pY3JvCi19ICAvLyBuYW1lc3BhY2Ugb3BzCiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCisKKyNlbmRpZiAgLy8gZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9sc3RtX3NoYXJlZC5oIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL2xzdG1fc2hhcmVkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiY2ZmMWEuLjAwMDAwMDAKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL2xzdG1fc2hhcmVkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAyMSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi1MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLXlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLVlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLSNpZm5kZWYgVEVOU09SRkxPV19MSVRFX0tFUk5FTFNfTFNUTV9TSEFSRURfSF8KLSNkZWZpbmUgVEVOU09SRkxPV19MSVRFX0tFUk5FTFNfTFNUTV9TSEFSRURfSF8KLQotbmFtZXNwYWNlIHRmbGl0ZSB7Ci1uYW1lc3BhY2Ugb3BzIHsKLW5hbWVzcGFjZSBtaWNybyB7Ci1uYW1lc3BhY2UgbHN0bSB7Ci0vLyBGb3IgZnVsbCBpbnB1dHMga2VybmVsICgyNC1pbnB1dHMpLgotLy8gUGxlYXNlIG5vdGUgdGhlIDIwLWlucHV0IGZ1bGwga2VybmVsIGlzIGRlcHJlY2F0ZWQgYW5kIG9ubHkga2VwdAotLy8gaGVyZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KLW5hbWVzcGFjZSBmdWxsIHsKLQotLy8gSW5wdXQgVGVuc29ycyBvZiBzaXplIHtuX2JhdGNoLCBuX2lucHV0fQotY29uc3RleHByIGludCBrSW5wdXRUZW5zb3IgPSAwOwotCi0vLyBJbnB1dCB3ZWlnaHQgdGVuc29ycyBvZiBzaXplOiB7bl9jZWxsLCBuX2lucHV0fQotY29uc3RleHByIGludCBrSW5wdXRUb0lucHV0V2VpZ2h0c1RlbnNvciA9IDE7ICAvLyBPcHRpb25hbAotY29uc3RleHByIGludCBrSW5wdXRUb0ZvcmdldFdlaWdodHNUZW5zb3IgPSAyOwotY29uc3RleHByIGludCBrSW5wdXRUb0NlbGxXZWlnaHRzVGVuc29yID0gMzsKLWNvbnN0ZXhwciBpbnQga0lucHV0VG9PdXRwdXRXZWlnaHRzVGVuc29yID0gNDsKLQotLy8gUmVjdXJyZW50IHdlaWdodCB0ZW5zb3JzIG9mIHNpemUge25fY2VsbCwgbl9vdXRwdXR9Ci1jb25zdGV4cHIgaW50IGtSZWN1cnJlbnRUb0lucHV0V2VpZ2h0c1RlbnNvciA9IDU7ICAvLyBPcHRpb25hbAotY29uc3RleHByIGludCBrUmVjdXJyZW50VG9Gb3JnZXRXZWlnaHRzVGVuc29yID0gNjsKLWNvbnN0ZXhwciBpbnQga1JlY3VycmVudFRvQ2VsbFdlaWdodHNUZW5zb3IgPSA3OwotY29uc3RleHByIGludCBrUmVjdXJyZW50VG9PdXRwdXRXZWlnaHRzVGVuc29yID0gODsKLQotLy8gUGVlcGhvbGUgd2VpZ2h0cyB0ZW5zb3JzIG9mIHNpemUge25fY2VsbH0sIHJlcHJlc2VudGluZyBhIGRpYWdvbmFsIG1hdHJpeC4KLWNvbnN0ZXhwciBpbnQga0NlbGxUb0lucHV0V2VpZ2h0c1RlbnNvciA9IDk7ICAgIC8vIE9wdGlvbmFsCi1jb25zdGV4cHIgaW50IGtDZWxsVG9Gb3JnZXRXZWlnaHRzVGVuc29yID0gMTA7ICAvLyBPcHRpb25hbAotY29uc3RleHByIGludCBrQ2VsbFRvT3V0cHV0V2VpZ2h0c1RlbnNvciA9IDExOyAgLy8gT3B0aW9uYWwKLQotLy8gR2F0ZXMgYmlhcyB0ZW5zb3JzIG9mIHNpemUge25fY2VsbH0KLWNvbnN0ZXhwciBpbnQga0lucHV0R2F0ZUJpYXNUZW5zb3IgPSAxMjsgIC8vIE9wdGlvbmFsCi1jb25zdGV4cHIgaW50IGtGb3JnZXRHYXRlQmlhc1RlbnNvciA9IDEzOwotY29uc3RleHByIGludCBrQ2VsbEdhdGVCaWFzVGVuc29yID0gMTQ7Ci1jb25zdGV4cHIgaW50IGtPdXRwdXRHYXRlQmlhc1RlbnNvciA9IDE1OwotCi0vLyBQcm9qZWN0aW9uIHdlaWdodCB0ZW5zb3Igb2Ygc2l6ZSB7bl9vdXRwdXQsIG5fY2VsbH0KLWNvbnN0ZXhwciBpbnQga1Byb2plY3Rpb25XZWlnaHRzVGVuc29yID0gMTY7ICAvLyBPcHRpb25hbAotLy8gUHJvamVjdGlvbiBiaWFzIHRlbnNvciBvZiBzaXplIHtuX291dHB1dH0KLWNvbnN0ZXhwciBpbnQga1Byb2plY3Rpb25CaWFzVGVuc29yID0gMTc7ICAvLyBPcHRpb25hbAotCi0vLyBUaGVzZSBzdGF0ZSB0ZW5zb3JzIGFyZSBkZWZpbmVkIGFzIHZhcmlhYmxlIHRlbnNvcnMsIGFuZCB3aWxsIGJlIG1vZGlmaWVkIGJ5Ci0vLyB0aGlzIG9wLgotY29uc3RleHByIGludCBrT3V0cHV0U3RhdGVUZW5zb3IgPSAxODsKLWNvbnN0ZXhwciBpbnQga0NlbGxTdGF0ZVRlbnNvciA9IDE5OwotCi0vLyBMYXllciBub3JtIGNvZWZmaWNpZW50IHRlbnNvcnMgb2Ygc2l6ZSB7bl9jZWxsfSwgcmVwcmVzZW50aW5nIGEgZGlhZ29uYWwKLS8vIG1hdHJpeC4KLWNvbnN0ZXhwciBpbnQga0lucHV0TGF5ZXJOb3JtQ29lZmZpY2llbnRzVGVuc29yID0gMjA7ICAgLy8gT3B0aW9uYWwKLWNvbnN0ZXhwciBpbnQga0ZvcmdldExheWVyTm9ybUNvZWZmaWNpZW50c1RlbnNvciA9IDIxOyAgLy8gT3B0aW9uYWwKLWNvbnN0ZXhwciBpbnQga0NlbGxMYXllck5vcm1Db2VmZmljaWVudHNUZW5zb3IgPSAyMjsgICAgLy8gT3B0aW9uYWwKLWNvbnN0ZXhwciBpbnQga091dHB1dExheWVyTm9ybUNvZWZmaWNpZW50c1RlbnNvciA9IDIzOyAgLy8gT3B0aW9uYWwKLQotLy8gT3V0cHV0IHRlbnNvcnMuCi1jb25zdGV4cHIgaW50IGtPdXRwdXRUZW5zb3IgPSAwOwotfSAgLy8gbmFtZXNwYWNlIGZ1bGwKLQotfSAgLy8gbmFtZXNwYWNlIGxzdG0KLX0gIC8vIG5hbWVzcGFjZSBtaWNybwotfSAgLy8gbmFtZXNwYWNlIG9wcwotfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQotI2VuZGlmICAvLyBURU5TT1JGTE9XX0xJVEVfS0VSTkVMU19MU1RNX1NIQVJFRF9IXwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL3BhZC5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9wYWQuY2MKaW5kZXggYmIwMGVkYi4uZDgyMmMyOCAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL3BhZC5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvcGFkLmNjCkBAIC0yMTUsNyArMjE1LDcgQEAKICAgICAgICAgICBjb25zdGFudF92YWx1ZXMgPT0gbnVsbHB0cgogICAgICAgICAgICAgICA/IDAKICAgICAgICAgICAgICAgOiAqdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90Pihjb25zdGFudF92YWx1ZXMpOwotI2lmIGRlZmluZWQoSElGSTQpCisjaWYgZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKICAgICAgIC8qIE5OTGliIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIHVwIHRvIDREIGlucHV0IHRlbnNvcnMgKi8KICAgICAgIGlmICh0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShpbnB1dCkuRGltZW5zaW9uc0NvdW50KCkgPT0gNCkgewogICAgICAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBwYWRkaW5ncyA9CkBAIC0yMzMsMTQgKzIzMywxNCBAQAogICAgICAgICAgICAgcGFkX3ZhbHVlKTsKICAgICAgICAgaWYgKGVyciAhPSAwKSByZXR1cm4ga1RmTGl0ZUVycm9yOwogICAgICAgfSBlbHNlIHsKLSNlbmRpZiAgLy8gZGVmaW5lZChISUZJNCkKKyNlbmRpZiAgLy8gZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKICAgICAgICAgcmVmZXJlbmNlX29wczo6UGFkKGRhdGEtPnBhcmFtcywgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoaW5wdXQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90PihpbnB1dCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFkX3ZhbHVlLCB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShvdXRwdXQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90PihvdXRwdXQpKTsKLSNpZiBkZWZpbmVkKEhJRkk0KQorI2lmIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCiAgICAgICB9Ci0jZW5kaWYgIC8vIGRlZmluZWQoSElGSTQpCisjZW5kaWYgIC8vIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCiAgICAgfSBicmVhazsKICAgICBjYXNlIGtUZkxpdGVJbnQzMjogewogICAgICAgaW50MzJfdCBwYWRfdmFsdWUgPQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL3F1YW50aXplLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL3F1YW50aXplLmNjCmluZGV4IGU4NDkxMDguLjA2ZDRmYmIgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9xdWFudGl6ZS5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvcXVhbnRpemUuY2MKQEAgLTI5LDcgKzI5LDcgQEAKIG5hbWVzcGFjZSB0ZmxpdGUgewogbmFtZXNwYWNlIHsKIAotI2lmIGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCisjaWYgZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKIFRmTGl0ZVN0YXR1cyBFdmFsWHRlbnNhKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgVEZMSVRFX0RDSEVDSyhub2RlLT51c2VyX2RhdGEgIT0gbnVsbHB0cik7CiAgIGF1dG8qIG9wX2RhdGEgPSBzdGF0aWNfY2FzdDxPcERhdGFRdWFudGl6ZVJlZmVyZW5jZSo+KG5vZGUtPnVzZXJfZGF0YSk7CkBAIC03NSwxMiArNzUsMTkgQEAKIAogICAgICAgICBjYXNlIGtUZkxpdGVJbnQ4OiB7CiAgICAgICAgICAgaW50IHNpemUgPSBFbGVtZW50Q291bnQoKmlucHV0LT5kaW1zKTsKLSAgICAgICAgICByZWZlcmVuY2Vfb3BzOjpSZXF1YW50aXplKAotICAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4oaW5wdXQpLCBzaXplLAotICAgICAgICAgICAgICBvcF9kYXRhLT5yZXF1YW50aXplX291dHB1dF9tdWx0aXBsaWVyLAotICAgICAgICAgICAgICBvcF9kYXRhLT5yZXF1YW50aXplX291dHB1dF9zaGlmdCwgb3BfZGF0YS0+aW5wdXRfemVyb19wb2ludCwKLSAgICAgICAgICAgICAgb3BfZGF0YS0+cXVhbnRpemF0aW9uX3BhcmFtcy56ZXJvX3BvaW50LAotICAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4ob3V0cHV0KSk7CisgICAgICAgICAgaW50MzJfdCB6ZXJvX3BvaW50ID0gb3BfZGF0YS0+cXVhbnRpemF0aW9uX3BhcmFtcy56ZXJvX3BvaW50OworICAgICAgICAgIGNvbnN0IGludDhfdCogaW5wdXRfZGF0YV9wdHI7CisgICAgICAgICAgaW50OF90KiBvdXRwdXRfZGF0YV9wdHI7CisgICAgICAgICAgaW5wdXRfZGF0YV9wdHIgPSB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4oaW5wdXQpOworICAgICAgICAgIG91dHB1dF9kYXRhX3B0ciA9IHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihvdXRwdXQpOworCisgICAgICAgICAgVEZfTElURV9FTlNVUkVfRVEoCisgICAgICAgICAgICAgIGNvbnRleHQsCisgICAgICAgICAgICAgIHhhX25uX2VsbV9yZXF1YW50aXplX2FzeW04c19hc3ltOHMoCisgICAgICAgICAgICAgICAgICBvdXRwdXRfZGF0YV9wdHIsIGlucHV0X2RhdGFfcHRyLCBvcF9kYXRhLT5pbnB1dF96ZXJvX3BvaW50LAorICAgICAgICAgICAgICAgICAgemVyb19wb2ludCwgb3BfZGF0YS0+cmVxdWFudGl6ZV9vdXRwdXRfc2hpZnQsCisgICAgICAgICAgICAgICAgICBvcF9kYXRhLT5yZXF1YW50aXplX291dHB1dF9tdWx0aXBsaWVyLCBzaXplKSwKKyAgICAgICAgICAgICAgMCk7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtOTgsNyArMTA1LDYgQEAKICAgICAgICAgY2FzZSBrVGZMaXRlSW50MzI6IHsKICAgICAgICAgICBpbnQgc2l6ZSA9IEVsZW1lbnRDb3VudCgqaW5wdXQtPmRpbXMpOwogICAgICAgICAgIGludDMyX3QgemVyb19wb2ludCA9IG9wX2RhdGEtPnF1YW50aXphdGlvbl9wYXJhbXMuemVyb19wb2ludDsKLSNpZiBkZWZpbmVkKEhJRkk1KQogICAgICAgICAgIGNvbnN0IGludDhfdCogaW5wdXRfZGF0YV9wdHI7CiAgICAgICAgICAgaW50MzJfdCogb3V0cHV0X2RhdGFfcHRyOwogICAgICAgICAgIGlucHV0X2RhdGFfcHRyID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KGlucHV0KTsKQEAgLTExMSwxMyArMTE3LDYgQEAKICAgICAgICAgICAgICAgICAgIHplcm9fcG9pbnQsIG9wX2RhdGEtPnJlcXVhbnRpemVfb3V0cHV0X3NoaWZ0LAogICAgICAgICAgICAgICAgICAgb3BfZGF0YS0+cmVxdWFudGl6ZV9vdXRwdXRfbXVsdGlwbGllciwgc2l6ZSksCiAgICAgICAgICAgICAgIDApOwotI2Vsc2UKLSAgICAgICAgICByZWZlcmVuY2Vfb3BzOjpSZXF1YW50aXplKAotICAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4oaW5wdXQpLCBzaXplLAotICAgICAgICAgICAgICBvcF9kYXRhLT5yZXF1YW50aXplX291dHB1dF9tdWx0aXBsaWVyLAotICAgICAgICAgICAgICBvcF9kYXRhLT5yZXF1YW50aXplX291dHB1dF9zaGlmdCwgb3BfZGF0YS0+aW5wdXRfemVyb19wb2ludCwKLSAgICAgICAgICAgICAgemVyb19wb2ludCwgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQzMl90PihvdXRwdXQpKTsKLSNlbmRpZiAgLy8gZGVmaW5lZChISUZJNSkKICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xNDksMTggKzE0OCwyMCBAQAogCiAgICAgICAgIGNhc2Uga1RmTGl0ZUludDE2OiB7CiAgICAgICAgICAgaW50IHNpemUgPSBFbGVtZW50Q291bnQoKmlucHV0LT5kaW1zKTsKLSAgICAgICAgICByZWZlcmVuY2Vfb3BzOjpSZXF1YW50aXplKAotICAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KGlucHV0KSwgc2l6ZSwKLSAgICAgICAgICAgICAgb3BfZGF0YS0+cmVxdWFudGl6ZV9vdXRwdXRfbXVsdGlwbGllciwKLSAgICAgICAgICAgICAgb3BfZGF0YS0+cmVxdWFudGl6ZV9vdXRwdXRfc2hpZnQsIG9wX2RhdGEtPmlucHV0X3plcm9fcG9pbnQsCi0gICAgICAgICAgICAgIG9wX2RhdGEtPnF1YW50aXphdGlvbl9wYXJhbXMuemVyb19wb2ludCwKLSAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90PihvdXRwdXQpKTsKKyAgICAgICAgICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhhX25uX2VsbV9yZXF1YW50aXplX2FzeW0xNnNfYXN5bTE2cygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90PihvdXRwdXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KGlucHV0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfZGF0YS0+aW5wdXRfemVyb19wb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfZGF0YS0+cXVhbnRpemF0aW9uX3BhcmFtcy56ZXJvX3BvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9kYXRhLT5yZXF1YW50aXplX291dHB1dF9zaGlmdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfZGF0YS0+cmVxdWFudGl6ZV9vdXRwdXRfbXVsdGlwbGllciwgc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIGtUZkxpdGVJbnQzMjogewogICAgICAgICAgIGludCBzaXplID0gRWxlbWVudENvdW50KCppbnB1dC0+ZGltcyk7Ci0jaWYgZGVmaW5lZChISUZJNSkKICAgICAgICAgICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhhX25uX2VsbV9yZXF1YW50aXplX2FzeW0xNnNfYXN5bTMycygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQzMl90PihvdXRwdXQpLApAQCAtMTcwLDE0ICsxNzEsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcF9kYXRhLT5yZXF1YW50aXplX291dHB1dF9zaGlmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BfZGF0YS0+cmVxdWFudGl6ZV9vdXRwdXRfbXVsdGlwbGllciwgc2l6ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0jZWxzZQotICAgICAgICAgIGludDMyX3QgemVyb19wb2ludCA9IG9wX2RhdGEtPnF1YW50aXphdGlvbl9wYXJhbXMuemVyb19wb2ludDsKLSAgICAgICAgICByZWZlcmVuY2Vfb3BzOjpSZXF1YW50aXplKAotICAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KGlucHV0KSwgc2l6ZSwKLSAgICAgICAgICAgICAgb3BfZGF0YS0+cmVxdWFudGl6ZV9vdXRwdXRfbXVsdGlwbGllciwKLSAgICAgICAgICAgICAgb3BfZGF0YS0+cmVxdWFudGl6ZV9vdXRwdXRfc2hpZnQsIG9wX2RhdGEtPmlucHV0X3plcm9fcG9pbnQsCi0gICAgICAgICAgICAgIHplcm9fcG9pbnQsIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50MzJfdD4ob3V0cHV0KSk7Ci0jZW5kaWYgIC8vIGRlZmluZWQoSElGSTUpCiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMjI4LDIyICsyMjEsNTYgQEAKICAgICBjYXNlIGtUZkxpdGVGbG9hdDMyOiB7CiAgICAgICBzd2l0Y2ggKG91dHB1dC0+dHlwZSkgewogICAgICAgICBjYXNlIGtUZkxpdGVJbnQ4OiB7CisjaWYgSElGSV9WRlBVCisgICAgICAgICAgaW50IHNpemUgPSBFbGVtZW50Q291bnQoKmlucHV0LT5kaW1zKTsKKyAgICAgICAgICBpbnQzMl90IHplcm9fcG9pbnQgPSBvcF9kYXRhLT5xdWFudGl6YXRpb25fcGFyYW1zLnplcm9fcG9pbnQ7CisgICAgICAgICAgY29uc3QgZmxvYXQqIGlucHV0X2RhdGFfcHRyOworICAgICAgICAgIGludDhfdCogb3V0cHV0X2RhdGFfcHRyOworICAgICAgICAgIGlucHV0X2RhdGFfcHRyID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxmbG9hdD4oaW5wdXQpOworICAgICAgICAgIG91dHB1dF9kYXRhX3B0ciA9IHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihvdXRwdXQpOworCisgICAgICAgICAgVEZfTElURV9FTlNVUkVfRVEoCisgICAgICAgICAgICAgIGNvbnRleHQsCisgICAgICAgICAgICAgIHhhX25uX2VsbV9xdWFudGl6ZV9mMzJfYXN5bThzKAorICAgICAgICAgICAgICAgICAgb3V0cHV0X2RhdGFfcHRyLCBpbnB1dF9kYXRhX3B0ciwKKyAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihvcF9kYXRhLT5xdWFudGl6YXRpb25fcGFyYW1zLnNjYWxlKSwKKyAgICAgICAgICAgICAgICAgIHplcm9fcG9pbnQsIHNpemUpLAorICAgICAgICAgICAgICAwKTsKKyNlbHNlICAgLy8gI2lmIEhJRklfVkZQVQogICAgICAgICAgIHJlZmVyZW5jZV9vcHM6OkFmZmluZVF1YW50aXplKAogICAgICAgICAgICAgICBvcF9kYXRhLT5xdWFudGl6YXRpb25fcGFyYW1zLAogICAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShpbnB1dCksCiAgICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8ZmxvYXQ+KGlucHV0KSwKICAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUob3V0cHV0KSwKICAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KG91dHB1dCkpOworI2VuZGlmICAvLyAjaWYgSElGSV9WRlBVCiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIGtUZkxpdGVJbnQxNjogeworI2lmIEhJRklfVkZQVQorICAgICAgICAgIGludCBzaXplID0gRWxlbWVudENvdW50KCppbnB1dC0+ZGltcyk7CisgICAgICAgICAgaW50MzJfdCB6ZXJvX3BvaW50ID0gb3BfZGF0YS0+cXVhbnRpemF0aW9uX3BhcmFtcy56ZXJvX3BvaW50OworICAgICAgICAgIGNvbnN0IGZsb2F0KiBpbnB1dF9kYXRhX3B0cjsKKyAgICAgICAgICBpbnQxNl90KiBvdXRwdXRfZGF0YV9wdHI7CisgICAgICAgICAgaW5wdXRfZGF0YV9wdHIgPSB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGZsb2F0PihpbnB1dCk7CisgICAgICAgICAgb3V0cHV0X2RhdGFfcHRyID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90PihvdXRwdXQpOworCisgICAgICAgICAgVEZfTElURV9FTlNVUkVfRVEoCisgICAgICAgICAgICAgIGNvbnRleHQsCisgICAgICAgICAgICAgIHhhX25uX2VsbV9xdWFudGl6ZV9mMzJfYXN5bTE2cygKKyAgICAgICAgICAgICAgICAgIG91dHB1dF9kYXRhX3B0ciwgaW5wdXRfZGF0YV9wdHIsCisgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4ob3BfZGF0YS0+cXVhbnRpemF0aW9uX3BhcmFtcy5zY2FsZSksCisgICAgICAgICAgICAgICAgICB6ZXJvX3BvaW50LCBzaXplKSwKKyAgICAgICAgICAgICAgMCk7CisjZWxzZSAgIC8vICNpZiBISUZJX1ZGUFUKICAgICAgICAgICByZWZlcmVuY2Vfb3BzOjpBZmZpbmVRdWFudGl6ZSgKICAgICAgICAgICAgICAgb3BfZGF0YS0+cXVhbnRpemF0aW9uX3BhcmFtcywKICAgICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoaW5wdXQpLAogICAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGZsb2F0PihpbnB1dCksCiAgICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKG91dHB1dCksCiAgICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50MTZfdD4ob3V0cHV0KSk7CisjZW5kaWYgIC8vICNpZiBISUZJX1ZGUFUKICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0yNjcsNyArMjk0LDcgQEAKIAogICByZXR1cm4ga1RmTGl0ZU9rOwogfQotI2VuZGlmICAvLyBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQorI2VuZGlmICAvLyBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQogCiB2b2lkKiBJbml0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgewogICBURkxJVEVfRENIRUNLKGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlciAhPSBudWxscHRyKTsKQEAgLTMwMSwxMSArMzI4LDExIEBACiB9CiAKIFRmTGl0ZVN0YXR1cyBFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKLSNpZiBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQorI2lmIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCiAgIHJldHVybiBFdmFsWHRlbnNhKGNvbnRleHQsIG5vZGUpOwogI2Vsc2UKICAgcmV0dXJuIEV2YWxRdWFudGl6ZVJlZmVyZW5jZShjb250ZXh0LCBub2RlKTsKLSNlbmRpZiAgLy8gZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKKyNlbmRpZiAgLy8gZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKIH0KIAogfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvcmVkdWNlX3Zpc2lvbi5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9yZWR1Y2VfdmlzaW9uLmNjCmluZGV4IGM3NjUyNWUuLmU1MzljMjkgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9yZWR1Y2VfdmlzaW9uLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9yZWR1Y2VfdmlzaW9uLmNjCkBAIC03Miw2ICs3Miw3IEBACiAgIH0KICAgcmV0dXJuIHRydWU7CiB9CisKIFRmTGl0ZVN0YXR1cyBSZWR1Y2VQcmVwYXJlVmlzaW9uKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgVEZMSVRFX0RDSEVDSyhub2RlLT51c2VyX2RhdGEgIT0gbnVsbHB0cik7CiAgIFRGTElURV9EQ0hFQ0sobm9kZS0+YnVpbHRpbl9kYXRhICE9IG51bGxwdHIpOwpAQCAtODMsMTQgKzg0LDE0IEBACiAgIFRmTGl0ZVRlbnNvciogb3V0cHV0ID0gbWljcm9fY29udGV4dC0+QWxsb2NhdGVUZW1wT3V0cHV0VGVuc29yKG5vZGUsIDApOwogICBUZkxpdGVUZW5zb3IqIGF4aXMgPSBtaWNyb19jb250ZXh0LT5BbGxvY2F0ZVRlbXBJbnB1dFRlbnNvcihub2RlLCAxKTsKIAotICB1aW50MzJfdCBpbnB1dERpbXNbNF0gPSB7MSwgMSwgMSwgMX07Ci0gIHVpbnQzMl90IG91dHB1dERpbXNbNF0gPSB7MSwgMSwgMSwgMX07Ci0gIHVpbnQzMl90IHNob3VsZFJlZHVjZVJbNF0gPSB7MCwgMCwgMCwgMH07CisgIHVpbnQzMl90IGlucHV0X2RpbXNbNF0gPSB7MSwgMSwgMSwgMX07CisgIHVpbnQzMl90IG91dHB1dF9kaW1zWzRdID0gezEsIDEsIDEsIDF9OworICB1aW50MzJfdCBzaG91bGRfcmVkdWNlX3JbNF0gPSB7MCwgMCwgMCwgMH07CiAgIGludDMyX3QgcmVzb2x2ZWRfYXhpc1s0XSA9IHswLCAwLCAwLCAwfTsKLSAgT3BlcmFuZERpbXM0RChpbnB1dERpbXMsIGlucHV0KTsKLSAgT3BlcmFuZERpbXM0RChvdXRwdXREaW1zLCBvdXRwdXQpOworICBPcGVyYW5kRGltczREKGlucHV0X2RpbXMsIGlucHV0KTsKKyAgT3BlcmFuZERpbXM0RChvdXRwdXRfZGltcywgb3V0cHV0KTsKIAotICB1aW50MzJfdCBpbnB1dFJhbmsgPSBOdW1EaW1lbnNpb25zKGlucHV0KTsKKyAgY29uc3QgaW50IGlucHV0X3JhbmsgPSBOdW1EaW1lbnNpb25zKGlucHV0KTsKICAgLy8gSW50ZXJwcmV0IGFuIGF4aXMgdGVuc29yIHdpdGggbnVsbCBkaW1lbnNpb25zIGFzIGEgc2NhbGFyCiAgIGludCBudW1fYXhpcyA9IHN0YXRpY19jYXN0PGludD4oRWxlbWVudENvdW50KCpheGlzLT5kaW1zKSk7CiAgIC8vIFJlc29sdmUgYXhpcy4KQEAgLTk5LDE2ICsxMDAsMjIgQEAKICAgICAgICAgICAgICAgICAgICAmbnVtX3Jlc29sdmVkX2F4aXMpKSB7CiAgICAgcmV0dXJuIGtUZkxpdGVFcnJvcjsKICAgfQotICBzdGQ6OnZlY3Rvcjxib29sPiBzaG91bGRSZWR1Y2UoaW5wdXRSYW5rKTsKIAotICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1fYXhpczsgKytpKSB7Ci0gICAgaW50MzJfdCBheGlzRCA9IHJlc29sdmVkX2F4aXNbaV07Ci0gICAgc2hvdWxkUmVkdWNlW2F4aXNEXSA9IHRydWU7CisgIC8vIFJlc29sdmVBeGlzIHNob3VsZCBlbGltaW5hdGUgZHVwZXMgYW5kIG5lZ2F0aXZlIGF4aXMsIHNvIHRoZSBudW1iZXIgb2YgYXhpcworICAvLyBzaG91bGQgYmUgbm8gZ3JlYXRlciB0aGFuIHRoZSBpbnB1dCByYW5rLgorICBURkxJVEVfRENIRUNLKG51bV9yZXNvbHZlZF9heGlzIDw9IGlucHV0X3JhbmspOworCisgIGJvb2wgc2hvdWxkX3JlZHVjZVs0XSA9IHtmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZX07CisKKyAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbnVtX3Jlc29sdmVkX2F4aXM7ICsraSkgeworICAgIGludDMyX3QgYXhpc19kID0gcmVzb2x2ZWRfYXhpc1tpXTsKKyAgICBzaG91bGRfcmVkdWNlW2F4aXNfZF0gPSB0cnVlOwogICB9CiAKICAgLy8gcmV2ZXJzZSBheGVzIGFuZCBhbGlnbiBpdCB0byBkaW1lbnNpb24gMCBhcyBPcGVyYW5kRGltczRECi0gIGZvciAodWludDMyX3QgYXhpc0kgPSAwOyBheGlzSSA8IGlucHV0UmFuazsgKytheGlzSSkgewotICAgIHNob3VsZFJlZHVjZVJbaW5wdXRSYW5rIC0gMSAtIGF4aXNJXSA9ICh1aW50MzJfdClzaG91bGRSZWR1Y2VbYXhpc0ldOworICBmb3IgKGludCBheGlzX2kgPSAwOyBheGlzX2kgPCBpbnB1dF9yYW5rOyArK2F4aXNfaSkgeworICAgIHNob3VsZF9yZWR1Y2VfcltpbnB1dF9yYW5rIC0gMSAtIGF4aXNfaV0gPQorICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2hvdWxkX3JlZHVjZVtheGlzX2ldKTsKICAgfQogCiAgIHVpbnQzMl90IGNvbnRleHRfc2l6ZSA9IDA7CkBAIC0xMjMsOCArMTMwLDggQEAKICAgICBkYXRhLT5jb250ZXh0X3NpemUgPSBjb250ZXh0X3NpemU7CiAgIH0KIAotICBzdGF0dXMgPSB4aVJlZHVjZVNldENvbnRleHQoZGF0YS0+cF9jb250ZXh0LCBkYXRhLT5jb250ZXh0X3NpemUsIGlucHV0RGltcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERpbXMsIHNob3VsZFJlZHVjZVIpOworICBzdGF0dXMgPSB4aVJlZHVjZVNldENvbnRleHQoZGF0YS0+cF9jb250ZXh0LCBkYXRhLT5jb250ZXh0X3NpemUsIGlucHV0X2RpbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGltcywgc2hvdWxkX3JlZHVjZV9yKTsKIAogICBpZiAoc3RhdHVzKSB7CiAgICAgcmV0dXJuIGtUZkxpdGVFcnJvcjsKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9zb2Z0bWF4LmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL3NvZnRtYXguY2MKaW5kZXggNzZjMzgwZi4uYzI0OGZjNSAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL3NvZnRtYXguY2MKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL3NvZnRtYXguY2MKQEAgLTMxLDcgKzMxLDcgQEAKIG5hbWVzcGFjZSB0ZmxpdGUgewogbmFtZXNwYWNlIHsKIAotI2lmIGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCisjaWYgZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKIFRmTGl0ZVN0YXR1cyBFdmFsSGlmaUludDgoY29uc3QgWHRlbnNhU29mdG1heE9wRGF0YSogb3BfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dCwgVGZMaXRlQ29udGV4dCogY29udGV4dCkgewpAQCAtNTYsNyArNTYsNyBAQAogICB9CiAgIHJldHVybiBrVGZMaXRlT2s7CiB9Ci0jZW5kaWYgIC8vIGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCisjZW5kaWYgIC8vIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCiAKIFRmTGl0ZVN0YXR1cyBFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXQgPSB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsSW5wdXQoY29udGV4dCwgbm9kZSwgMCk7CkBAIC02OCw3ICs2OCw3IEBACiAKICAgVEZMSVRFX0RDSEVDSyhub2RlLT51c2VyX2RhdGEgIT0gbnVsbHB0cik7CiAKLSNpZiBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQorI2lmIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCiAgIFh0ZW5zYVNvZnRtYXhPcERhdGEgb3BfZGF0YSA9CiAgICAgICAqc3RhdGljX2Nhc3Q8WHRlbnNhU29mdG1heE9wRGF0YSo+KG5vZGUtPnVzZXJfZGF0YSk7CiAgIFNvZnRtYXhQYXJhbXMgcGFyYW1zID0gb3BfZGF0YS5wYXJhbXM7CkBAIC03Nyw3ICs3Nyw3IEBACiAjZW5kaWYKIAogICBpZiAoaW5wdXQtPnR5cGUgPT0ga1RmTGl0ZUludDggJiYgb3V0cHV0LT50eXBlID09IGtUZkxpdGVJbnQ4KSB7Ci0jaWYgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKKyNpZiBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQogICAgIHJldHVybiBFdmFsSGlmaUludDgoc3RhdGljX2Nhc3Q8WHRlbnNhU29mdG1heE9wRGF0YSo+KG5vZGUtPnVzZXJfZGF0YSksCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgb3V0cHV0LCBjb250ZXh0KTsKICNlbGlmIGRlZmluZWQoVklTSU9OX1A2KQpAQCAtOTEsNyArOTEsNyBAQAogICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShvdXRwdXQpLAogICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4ob3V0cHV0KSk7CiAgICAgcmV0dXJuIGtUZkxpdGVPazsKLSNlbmRpZiAgLy8gZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKKyNlbmRpZiAgLy8gZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKICAgfQogCiAgIGlmIChpbnB1dC0+dHlwZSA9PSBrVGZMaXRlSW50MTYgJiYgb3V0cHV0LT50eXBlID09IGtUZkxpdGVJbnQxNikgewpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL3NvZnRtYXhfaW50OF9pbnQxNi5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9zb2Z0bWF4X2ludDhfaW50MTYuY2MKaW5kZXggYjIzYTlmNy4uZDM3YTJmNSAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL3NvZnRtYXhfaW50OF9pbnQxNi5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2Evc29mdG1heF9pbnQ4X2ludDE2LmNjCkBAIC0zMCw3ICszMCw3IEBACiBuYW1lc3BhY2UgdGZsaXRlIHsKIG5hbWVzcGFjZSB7CiAKLSNpZiBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQorI2lmIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCiBUZkxpdGVTdGF0dXMgUHJlcGFyZUhpZmkoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBURl9MSVRFX0VOU1VSRV9PSyhjb250ZXh0LCBTb2Z0bWF4UHJlcGFyZShjb250ZXh0LCBub2RlKSk7CiAKQEAgLTg2LDEzICs4NiwxMyBAQAogICB9CiAgIHJldHVybiBrVGZMaXRlT2s7CiB9Ci0jZW5kaWYgIC8vIGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCisjZW5kaWYgIC8vIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCiAKIH0gIC8vIG5hbWVzcGFjZQogCiB2b2lkKiBYdGVuc2FJbml0U29mdG1heChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKSB7Ci0jaWYgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKKyNpZiBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQogICBURkxJVEVfRENIRUNLKGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlciAhPSBudWxscHRyKTsKICAgcmV0dXJuIGNvbnRleHQtPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlcihjb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihYdGVuc2FTb2Z0bWF4T3BEYXRhKSk7CkBAIC0xMDUsMTEgKzEwNSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihYdGVuc2FTb2Z0bWF4T3BEYXRhKSk7CiAjZWxzZQogICByZXR1cm4gU29mdG1heEluaXQoY29udGV4dCwgYnVmZmVyLCBsZW5ndGgpOwotI2VuZGlmICAvLyBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQorI2VuZGlmICAvLyBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQogfQogCiBUZkxpdGVTdGF0dXMgWHRlbnNhUHJlcGFyZVNvZnRtYXgoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewotI2lmIGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCisjaWYgZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKICAgcmV0dXJuIFByZXBhcmVIaWZpKGNvbnRleHQsIG5vZGUpOwogI2Vsc2UKICAgVEZfTElURV9FTlNVUkVfT0soY29udGV4dCwgU29mdG1heFByZXBhcmUoY29udGV4dCwgbm9kZSkpOwpAQCAtMTE3LDcgKzExNyw3IEBACiAgIFRGX0xJVEVfRU5TVVJFX09LKGNvbnRleHQsIFNvZnRtYXhQcmVwYXJlVmlzaW9uKGNvbnRleHQsIG5vZGUpKTsKICNlbmRpZgogICByZXR1cm4ga1RmTGl0ZU9rOwotI2VuZGlmICAvLyBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQorI2VuZGlmICAvLyBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQogfQogCiBUZkxpdGVTdGF0dXMgWHRlbnNhRXZhbFNvZnRtYXhJbnQ4SW50MTYoVGZMaXRlQ29udGV4dCogY29udGV4dCwKQEAgLTEyNyw3ICsxMjcsNyBAQAogICBURkxJVEVfRENIRUNLKG5vZGUtPnVzZXJfZGF0YSAhPSBudWxscHRyKTsKIAogICBpZiAoaW5wdXQtPnR5cGUgPT0ga1RmTGl0ZUludDggJiYgb3V0cHV0LT50eXBlID09IGtUZkxpdGVJbnQxNikgewotI2lmIGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCisjaWYgZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKICAgICByZXR1cm4gRXZhbEhpZmkoc3RhdGljX2Nhc3Q8WHRlbnNhU29mdG1heE9wRGF0YSo+KG5vZGUtPnVzZXJfZGF0YSksIGlucHV0LAogICAgICAgICAgICAgICAgICAgICBvdXRwdXQsIGNvbnRleHQpOwogI2Vsc2UKQEAgLTEzOCw3ICsxMzgsNyBAQAogICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShvdXRwdXQpLAogICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KG91dHB1dCkpOwogICAgIHJldHVybiBrVGZMaXRlT2s7Ci0jZW5kaWYgIC8vIGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCisjZW5kaWYgIC8vIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCiAgIH0gZWxzZSB7CiAgICAgTWljcm9QcmludGYoIlR5cGUgJXMgKCVkKSBub3Qgc3VwcG9ydGVkLiIsIFRmTGl0ZVR5cGVHZXROYW1lKGlucHV0LT50eXBlKSwKICAgICAgICAgICAgICAgICBpbnB1dC0+dHlwZSk7CmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2Evc3RyaWRlZF9zbGljZS5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9zdHJpZGVkX3NsaWNlLmNjCmluZGV4IDA0NDBjZmMuLjhlYmY3MjQgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9zdHJpZGVkX3NsaWNlLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9zdHJpZGVkX3NsaWNlLmNjCkBAIC0yMywxMjkgKzIzLDE0IEBACiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMva2VybmVsX3V0aWwuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9vcF9tYWNyb3MuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9rZXJuZWxfdXRpbC5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3N0cmlkZWRfc2xpY2UuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EveHRlbnNhLmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2xvZy5oIgogCiBuYW1lc3BhY2UgdGZsaXRlIHsKIG5hbWVzcGFjZSB7CiAKLWNvbnN0ZXhwciBpbnQga0lucHV0VGVuc29yID0gMDsKLWNvbnN0ZXhwciBpbnQga0JlZ2luVGVuc29yID0gMTsKLWNvbnN0ZXhwciBpbnQga0VuZFRlbnNvciA9IDI7Ci1jb25zdGV4cHIgaW50IGtTdHJpZGVzVGVuc29yID0gMzsKLWNvbnN0ZXhwciBpbnQga091dHB1dFRlbnNvciA9IDA7Ci0KLXN0cnVjdCBTdHJpZGVkU2xpY2VDb250ZXh0IHsKLSAgU3RyaWRlZFNsaWNlQ29udGV4dChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7Ci0gICAgcGFyYW1zID0gcmVpbnRlcnByZXRfY2FzdDxUZkxpdGVTdHJpZGVkU2xpY2VQYXJhbXMqPihub2RlLT5idWlsdGluX2RhdGEpOwotICAgIG1pY3JvX2NvbnRleHQgPSBHZXRNaWNyb0NvbnRleHQoY29udGV4dCk7Ci0gICAgaW5wdXQgPSBtaWNyb19jb250ZXh0LT5BbGxvY2F0ZVRlbXBJbnB1dFRlbnNvcihub2RlLCBrSW5wdXRUZW5zb3IpOwotICAgIGJlZ2luID0gbWljcm9fY29udGV4dC0+QWxsb2NhdGVUZW1wSW5wdXRUZW5zb3Iobm9kZSwga0JlZ2luVGVuc29yKTsKLSAgICBlbmQgPSBtaWNyb19jb250ZXh0LT5BbGxvY2F0ZVRlbXBJbnB1dFRlbnNvcihub2RlLCBrRW5kVGVuc29yKTsKLSAgICBzdHJpZGVzID0gbWljcm9fY29udGV4dC0+QWxsb2NhdGVUZW1wSW5wdXRUZW5zb3Iobm9kZSwga1N0cmlkZXNUZW5zb3IpOwotICAgIG91dHB1dCA9IG1pY3JvX2NvbnRleHQtPkFsbG9jYXRlVGVtcE91dHB1dFRlbnNvcihub2RlLCBrT3V0cHV0VGVuc29yKTsKLSAgICBkaW1zID0gTnVtRGltZW5zaW9ucyhpbnB1dCk7Ci0gIH0KLSAgflN0cmlkZWRTbGljZUNvbnRleHQoKSB7Ci0gICAgbWljcm9fY29udGV4dC0+RGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3IoaW5wdXQpOwotICAgIG1pY3JvX2NvbnRleHQtPkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKGJlZ2luKTsKLSAgICBtaWNyb19jb250ZXh0LT5EZWFsbG9jYXRlVGVtcFRmTGl0ZVRlbnNvcihlbmQpOwotICAgIG1pY3JvX2NvbnRleHQtPkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKHN0cmlkZXMpOwotICAgIG1pY3JvX2NvbnRleHQtPkRlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKG91dHB1dCk7Ci0gIH0KLSAgY29uc3QgVGZMaXRlU3RyaWRlZFNsaWNlUGFyYW1zKiBwYXJhbXM7Ci0gIE1pY3JvQ29udGV4dCogbWljcm9fY29udGV4dDsKLSAgVGZMaXRlVGVuc29yKiBpbnB1dDsKLSAgVGZMaXRlVGVuc29yKiBiZWdpbjsKLSAgVGZMaXRlVGVuc29yKiBlbmQ7Ci0gIFRmTGl0ZVRlbnNvciogc3RyaWRlczsKLSAgVGZMaXRlVGVuc29yKiBvdXRwdXQ7Ci0gIGludCBkaW1zOwotfTsKLQotLy8gVGhpcyBPcCBvbmx5IHN1cHBvcnRzIDEtNEQgY2FzZXMgYW5kIHNpbmNlIHdlIHVzZSB0aGUgcmVmZXJlbmNlIDRECi0vLyBpbXBsZW1lbnRhdGlvbiwgdGhlIDEtM0QgdGVuc29ycyBhcmUgbWFwcGVkIHRvIDRELgotY29uc3QgaW50IGtNYXhEaW0gPSA0OwotCi10ZmxpdGU6OlN0cmlkZWRTbGljZVBhcmFtcyBCdWlsZFN0cmlkZWRTbGljZVBhcmFtcygKLSAgICBTdHJpZGVkU2xpY2VDb250ZXh0KiBvcF9jb250ZXh0KSB7Ci0gIHRmbGl0ZTo6U3RyaWRlZFNsaWNlUGFyYW1zIG9wX3BhcmFtczsKLSAgb3BfcGFyYW1zLnN0YXJ0X2luZGljZXNfY291bnQgPSBvcF9jb250ZXh0LT5kaW1zOwotICBvcF9wYXJhbXMuc3RvcF9pbmRpY2VzX2NvdW50ID0gb3BfY29udGV4dC0+ZGltczsKLSAgb3BfcGFyYW1zLnN0cmlkZXNfY291bnQgPSBvcF9jb250ZXh0LT5kaW1zOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgb3BfY29udGV4dC0+ZGltczsgKytpKSB7Ci0gICAgb3BfcGFyYW1zLnN0YXJ0X2luZGljZXNbaV0gPSBHZXRUZW5zb3JEYXRhPGludDMyX3Q+KG9wX2NvbnRleHQtPmJlZ2luKVtpXTsKLSAgICBvcF9wYXJhbXMuc3RvcF9pbmRpY2VzW2ldID0gR2V0VGVuc29yRGF0YTxpbnQzMl90PihvcF9jb250ZXh0LT5lbmQpW2ldOwotICAgIG9wX3BhcmFtcy5zdHJpZGVzW2ldID0gR2V0VGVuc29yRGF0YTxpbnQzMl90PihvcF9jb250ZXh0LT5zdHJpZGVzKVtpXTsKLSAgfQotCi0gIG9wX3BhcmFtcy5iZWdpbl9tYXNrID0gb3BfY29udGV4dC0+cGFyYW1zLT5iZWdpbl9tYXNrOwotICBvcF9wYXJhbXMuZWxsaXBzaXNfbWFzayA9IDA7Ci0gIG9wX3BhcmFtcy5lbmRfbWFzayA9IG9wX2NvbnRleHQtPnBhcmFtcy0+ZW5kX21hc2s7Ci0gIG9wX3BhcmFtcy5uZXdfYXhpc19tYXNrID0gMDsKLSAgb3BfcGFyYW1zLnNocmlua19heGlzX21hc2sgPSBvcF9jb250ZXh0LT5wYXJhbXMtPnNocmlua19heGlzX21hc2s7Ci0gIHJldHVybiBvcF9wYXJhbXM7Ci19Ci0KLS8vIFByb2Nlc3NlcyB0aGUgaW5kZXhpbmcgdGVuc29ycyAoYmVnaW4sIGVuZCBhbmQgc3RyaWRlcykgdG8gcmVzaXplIHRoZQotLy8gb3V0cHV0IHRlbnNvci4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsYWJsZSBmcm9tIGJvdGggUHJlcGFyZSgpIGFuZCBFdmFsKCkgYXMKLS8vIGxvbmcgYXMgdGhlIGNhbGxlciBlbnN1cmVzIHRoZSBpbmRleGluZyB0ZW5zb3JzIGFyZSBwcmVzZW50LgotVGZMaXRlU3RhdHVzIENoZWNrT3V0cHV0U2l6ZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpZGVkU2xpY2VDb250ZXh0KiBvcF9jb250ZXh0KSB7Ci0gIHVzaW5nIDo6dGZsaXRlOjpzdHJpZGVkX3NsaWNlOjpTdGFydEZvckF4aXM7Ci0gIHVzaW5nIDo6dGZsaXRlOjpzdHJpZGVkX3NsaWNlOjpTdG9wRm9yQXhpczsKLSAgVGZMaXRlSW50QXJyYXkqIG91dHB1dF9zaGFwZSA9IG9wX2NvbnRleHQtPm91dHB1dC0+ZGltczsKLSAgaW50IHNoYXBlX3NpemUgPSAwOwotICBhdXRvIG9wX3BhcmFtcyA9IEJ1aWxkU3RyaWRlZFNsaWNlUGFyYW1zKG9wX2NvbnRleHQpOwotICBhdXRvIGlucHV0X3NoYXBlID0gR2V0VGVuc29yU2hhcGUob3BfY29udGV4dC0+aW5wdXQpOwotICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBvcF9jb250ZXh0LT5kaW1zOyArK2lkeCkgewotICAgIGludDMyX3Qgc3RyaWRlID0gR2V0VGVuc29yRGF0YTxpbnQzMl90PihvcF9jb250ZXh0LT5zdHJpZGVzKVtpZHhdOwotICAgIFRGX0xJVEVfRU5TVVJFX01TRyhjb250ZXh0LCBzdHJpZGUgIT0gMCwgInN0cmlkZSB2YWx1ZSBoYXMgdG8gYmUgbm9uLXplcm8iKTsKLSAgICBpbnQzMl90IGJlZ2luID0gU3RhcnRGb3JBeGlzKG9wX3BhcmFtcywgaW5wdXRfc2hhcGUsIGlkeCk7Ci0gICAgaW50MzJfdCBlbmQgPSBTdG9wRm9yQXhpcyhvcF9wYXJhbXMsIGlucHV0X3NoYXBlLCBpZHgsIGJlZ2luKTsKLQotICAgIC8vIFdoZW4gc2hyaW5raW5nIGFuIGF4aXMsIHRoZSBlbmQgcG9zaXRpb24gZG9lcyBub3QgbWF0dGVyIChhbmQgY2FuIGJlCi0gICAgLy8gaW5jb3JyZWN0IHdoZW4gbmVnYXRpdmUgaW5kZXhpbmcgaXMgdXNlZCwgc2VlIElzc3VlICMxOTI2MCkuIEFsd2F5cyB1c2UKLSAgICAvLyBiZWdpbiArIDEgdG8gZ2VuZXJhdGUgYSBsZW5ndGggMSBzbGljZSwgc2luY2UgYmVnaW4gaGFzCi0gICAgLy8gYWxyZWFkeSBiZWVuIGFkanVzdGVkIGZvciBuZWdhdGl2ZSBpbmRpY2VzIGJ5IFN0YXJ0Rm9yQXhpcy4KLSAgICBjb25zdCBib29sIHNocmlua19heGlzID0gb3BfY29udGV4dC0+cGFyYW1zLT5zaHJpbmtfYXhpc19tYXNrICYgKDEgPDwgaWR4KTsKLSAgICBpZiAoc2hyaW5rX2F4aXMpIHsKLSAgICAgIGVuZCA9IGJlZ2luICsgMTsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIGlzIHZhbGlkIGZvciBib3RoIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBzdHJpZGVzCi0gICAgaW50MzJfdCBkaW1fc2hhcGUgPSBzdGQ6OmNlaWwoKGVuZCAtIGJlZ2luKSAvIHN0YXRpY19jYXN0PGZsb2F0PihzdHJpZGUpKTsKLSAgICBkaW1fc2hhcGUgPSBkaW1fc2hhcGUgPCAwID8gMCA6IGRpbV9zaGFwZTsKLSAgICBpZiAoIXNocmlua19heGlzKSB7Ci0gICAgICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBvdXRwdXRfc2hhcGUtPmRhdGFbc2hhcGVfc2l6ZV0sIGRpbV9zaGFwZSk7Ci0gICAgICBzaGFwZV9zaXplKys7Ci0gICAgfQotICB9Ci0gIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIG91dHB1dF9zaGFwZS0+c2l6ZSwgc2hhcGVfc2l6ZSk7Ci0gIHJldHVybiBrVGZMaXRlT2s7Ci19Ci0KLXZvaWQqIEluaXQoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogYnVmZmVyLCBzaXplX3QgbGVuZ3RoKSB7Ci0gIFRGTElURV9EQ0hFQ0soY29udGV4dC0+QWxsb2NhdGVQZXJzaXN0ZW50QnVmZmVyICE9IG51bGxwdHIpOwotICByZXR1cm4gY29udGV4dC0+QWxsb2NhdGVQZXJzaXN0ZW50QnVmZmVyKGNvbnRleHQsIHNpemVvZihTdHJpZGVkU2xpY2VQYXJhbXMpKTsKLX0KLQotVGZMaXRlU3RhdHVzIFByZXBhcmUoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewotICBURkxJVEVfRENIRUNLKG5vZGUtPnVzZXJfZGF0YSAhPSBudWxscHRyKTsKLSAgU3RyaWRlZFNsaWNlUGFyYW1zKiBvcF9wYXJhbXMgPQotICAgICAgc3RhdGljX2Nhc3Q8U3RyaWRlZFNsaWNlUGFyYW1zKj4obm9kZS0+dXNlcl9kYXRhKTsKLSAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgTnVtSW5wdXRzKG5vZGUpLCA0KTsKLSAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgTnVtT3V0cHV0cyhub2RlKSwgMSk7Ci0gIFN0cmlkZWRTbGljZUNvbnRleHQgb3BfY29udGV4dChjb250ZXh0LCBub2RlKTsKLSAgVEZfTElURV9FTlNVUkVfTVNHKGNvbnRleHQsIG9wX2NvbnRleHQuZGltcyA8PSBrTWF4RGltLAotICAgICAgICAgICAgICAgICAgICAgImlucHV0IGRpbSBzaG91bGQgbm90IGV4Y2VlZCA0Iik7Ci0gIGF1dG8gcGFyYW1zID0gQnVpbGRTdHJpZGVkU2xpY2VQYXJhbXMoJm9wX2NvbnRleHQpOwotICBtZW1jcHkob3BfcGFyYW1zLCAmcGFyYW1zLCBzaXplb2YoU3RyaWRlZFNsaWNlUGFyYW1zKSk7Ci0gIHJldHVybiBDaGVja091dHB1dFNpemUoY29udGV4dCwgJm9wX2NvbnRleHQpOwotfQotCi0jaWYgZGVmaW5lZChISUZJNCkKKyNpZiBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQogdm9pZCBTdHJpZGVkU2xpY2VfaW50MTZfaGlmaTRvcHQoY29uc3QgdGZsaXRlOjpTdHJpZGVkU2xpY2VQYXJhbXMmIG9wX3BhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSYgdW5leHRlbmRlZF9pbnB1dF9zaGFwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QqIGlucHV0X2RhdGEsCkBAIC0xOTIsNyArNzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3NoYXBlLkRpbXMoMSksIGlucHV0X3NoYXBlLkRpbXMoMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfc2hhcGUuRGltcygzKSwgaW5wdXRfc2hhcGUuRGltcyg0KSk7CiB9Ci0jZW5kaWYgIC8vIGRlZmluZWQoSElGSTQpCisjZW5kaWYgIC8vIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCiAKIFRmTGl0ZVN0YXR1cyBFdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgVEZMSVRFX0RDSEVDSyhub2RlLT51c2VyX2RhdGEgIT0gbnVsbHB0cik7CkBAIC0yMDAsOSArODUsOSBAQAogICAgICAgKihzdGF0aWNfY2FzdDxjb25zdCBTdHJpZGVkU2xpY2VQYXJhbXMqPihub2RlLT51c2VyX2RhdGEpKTsKIAogICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dCA9Ci0gICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsSW5wdXQoY29udGV4dCwgbm9kZSwga0lucHV0VGVuc29yKTsKKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dChjb250ZXh0LCBub2RlLCBrU3RyaWRlZFNsaWNlSW5wdXRUZW5zb3IpOwogICBUZkxpdGVFdmFsVGVuc29yKiBvdXRwdXQgPQotICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbE91dHB1dChjb250ZXh0LCBub2RlLCBrT3V0cHV0VGVuc29yKTsKKyAgICAgIHRmbGl0ZTo6bWljcm86OkdldEV2YWxPdXRwdXQoY29udGV4dCwgbm9kZSwga1N0cmlkZWRTbGljZU91dHB1dFRlbnNvcik7CiAgIHN3aXRjaCAob3V0cHV0LT50eXBlKSB7CiAgICAgY2FzZSBrVGZMaXRlRmxvYXQzMjoKICAgICAgIHJlZmVyZW5jZV9vcHM6OlN0cmlkZWRTbGljZShvcF9wYXJhbXMsCkBAIC0yMTksNyArMTA0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4ob3V0cHV0KSk7CiAgICAgICBicmVhazsKICAgICBjYXNlIGtUZkxpdGVJbnQxNjoKLSNpZiBkZWZpbmVkKEhJRkk0KQorI2lmIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCiAgICAgICBTdHJpZGVkU2xpY2VfaW50MTZfaGlmaTRvcHQoCiAgICAgICAgICAgb3BfcGFyYW1zLCB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShpbnB1dCksCiAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQxNl90PihpbnB1dCksCkBAIC0yMzEsNyArMTE2LDcgQEAKICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KGlucHV0KSwKICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShvdXRwdXQpLAogICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50MTZfdD4ob3V0cHV0KSk7Ci0jZW5kaWYgIC8vIGRlZmluZWQoSElGSTQpCisjZW5kaWYgIC8vIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCiAgICAgICBicmVhazsKICAgICBjYXNlIGtUZkxpdGVJbnQzMjoKICAgICAgIHJlZmVyZW5jZV9vcHM6OlN0cmlkZWRTbGljZSgKQEAgLTI1Nyw3ICsxNDIsNyBAQAogfSAgLy8gbmFtZXNwYWNlCiAKIFRGTE1SZWdpc3RyYXRpb24gUmVnaXN0ZXJfU1RSSURFRF9TTElDRSgpIHsKLSAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoSW5pdCwgUHJlcGFyZSwgRXZhbCk7CisgIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKFN0cmlkZWRTbGljZUluaXQsIFN0cmlkZWRTbGljZVByZXBhcmUsIEV2YWwpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2Evc3ViLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL3N1Yi5jYwppbmRleCBjNGYwOTg0Li5iODMwOGM5IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2Evc3ViLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9zdWIuY2MKQEAgLTgzLDE1ICs4MywxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICZvcF9wYXJhbXMpOwogICAvLyBUT0RPKGIvMjU5NzI0NTcyKTogdmlzaW9uX3A2IGFuZCBoaWZpIGNvZGUgcGF0aCBpcyBnZXR0aW5nIHZlcnkgY29uZnVzaW5nLgogICAvLyBMZXQncyBzZXBhcmF0ZSB0aGVtIGludG8gdHdvIGRpZmZlcmVudCBmaWxlcy4KLSNpZiAhKGRlZmluZWQoSElGSTQpKQorI2lmICEoZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkpCiAgIGJvb2wgbmVlZF9icm9hZGNhc3QgPSByZWZlcmVuY2Vfb3BzOjpQcm9jZXNzQnJvYWRjYXN0U2hhcGVzKAogICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoaW5wdXQxKSwKICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGlucHV0MiksICZvcF9wYXJhbXMpOwotI2VuZGlmICAvLyAhKGRlZmluZWQoSElGSTQpKQorI2VuZGlmICAvLyAhKGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpKQogCiAgIHN3aXRjaCAob3V0cHV0LT50eXBlKSB7CiAgICAgY2FzZSBrVGZMaXRlSW50ODogewotI2lmIGRlZmluZWQoSElGSTQpCisjaWYgZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKICAgICAgIGludCBlcnI7CiAgICAgICBjb25zdCBSdW50aW1lU2hhcGUgZXh0ZW5kZWRfaW5wdXQxX3NoYXBlID0KICAgICAgICAgICBSdW50aW1lU2hhcGU6OkV4dGVuZGVkU2hhcGUoNSwgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoaW5wdXQxKSk7CkBAIC0xMDUsNyArMTA1LDYgQEAKICAgICAgIC8vIFRPRE8oYi8yNTk3MjQ1NzIpOiBSZWZhY3RvciB0aGUgZm9sbG93aW5nIGJsb2NrIG9mIGNvZGUuCiAgICAgICBpbnQgYjsKICAgICAgIGludCBpbnAxX29mZiA9IDA7Ci0gICAgICBpbnQgaW5wMl9vZmYgPSAwOwogICAgICAgaW50IG91dF9vZmY7CiAgICAgICBvdXRfb2ZmID0KICAgICAgICAgICBvdXRwdXRfZGltc1sxXSAqIG91dHB1dF9kaW1zWzJdICogb3V0cHV0X2RpbXNbM10gKiBvdXRwdXRfZGltc1s0XTsKQEAgLTExMywxMCArMTEyLDYgQEAKICAgICAgICAgaW5wMV9vZmYgPQogICAgICAgICAgICAgaW5wdXQxX2RpbXNbMV0gKiBpbnB1dDFfZGltc1syXSAqIGlucHV0MV9kaW1zWzNdICogaW5wdXQxX2RpbXNbNF07CiAgICAgICB9Ci0gICAgICBpZiAoaW5wdXQyX2RpbXNbMF0gPiAxKSB7Ci0gICAgICAgIGlucDJfb2ZmID0KLSAgICAgICAgICAgIGlucHV0Ml9kaW1zWzFdICogaW5wdXQyX2RpbXNbMl0gKiBpbnB1dDJfZGltc1szXSAqIGlucHV0Ml9kaW1zWzRdOwotICAgICAgfQogCiAgICAgICBmb3IgKGIgPSAwOyBiIDwgb3V0cHV0X2RpbXNbMF07IGIrKykgewogICAgICAgICBlcnIgPSB4YV9ubl9lbG1fc3ViX2Jyb2FkY2FzdF80RF9hc3ltOHN4YXN5bThzX2FzeW04cygKQEAgLTEzMyw3ICsxMjgsNyBAQAogCiAgICAgICAgIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIGVyciA9PSAwKTsKICAgICAgIH0KLSNlbHNlICAgLy8gZGVmaW5lZChISUZJNCkKKyNlbHNlICAgLy8gZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKICAgICAgIGlmIChuZWVkX2Jyb2FkY2FzdCkgewogICAgICAgICB0ZmxpdGU6OnJlZmVyZW5jZV9vcHM6OkJyb2FkY2FzdFF1YW50U3ViU2xvdygKICAgICAgICAgICAgIG9wX3BhcmFtcywgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoaW5wdXQxKSwKQEAgLTE1MSwxMSArMTQ2LDExIEBACiAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShvdXRwdXQpLAogICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KG91dHB1dCkpOwogICAgICAgfQotI2VuZGlmICAvLyBkZWZpbmVkKEhJRkk0KQorI2VuZGlmICAvLyBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQogICAgICAgYnJlYWs7CiAgICAgfQogICAgIGNhc2Uga1RmTGl0ZUludDE2OiB7Ci0jaWYgZGVmaW5lZChISUZJNCkKKyNpZiBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQogICAgICAgaW50IGVycjsKICAgICAgIGNvbnN0IFJ1bnRpbWVTaGFwZSBleHRlbmRlZF9pbnB1dDFfc2hhcGUgPQogICAgICAgICAgIFJ1bnRpbWVTaGFwZTo6RXh0ZW5kZWRTaGFwZSg1LCB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShpbnB1dDEpKTsKQEAgLTE2OCw3ICsxNjMsNiBAQAogICAgICAgY29uc3QgaW50KiBvdXRwdXRfZGltcyA9IGV4dGVuZGVkX291dHB1dF9zaGFwZS5EaW1zRGF0YSgpOwogICAgICAgaW50IGI7CiAgICAgICBpbnQgaW5wMV9vZmYgPSAwOwotICAgICAgaW50IGlucDJfb2ZmID0gMDsKICAgICAgIGludCBvdXRfb2ZmOwogICAgICAgb3V0X29mZiA9CiAgICAgICAgICAgb3V0cHV0X2RpbXNbMV0gKiBvdXRwdXRfZGltc1syXSAqIG91dHB1dF9kaW1zWzNdICogb3V0cHV0X2RpbXNbNF07CkBAIC0xNzYsMTAgKzE3MCw2IEBACiAgICAgICAgIGlucDFfb2ZmID0KICAgICAgICAgICAgIGlucHV0MV9kaW1zWzFdICogaW5wdXQxX2RpbXNbMl0gKiBpbnB1dDFfZGltc1szXSAqIGlucHV0MV9kaW1zWzRdOwogICAgICAgfQotICAgICAgaWYgKGlucHV0Ml9kaW1zWzBdID4gMSkgewotICAgICAgICBpbnAyX29mZiA9Ci0gICAgICAgICAgICBpbnB1dDJfZGltc1sxXSAqIGlucHV0Ml9kaW1zWzJdICogaW5wdXQyX2RpbXNbM10gKiBpbnB1dDJfZGltc1s0XTsKLSAgICAgIH0KIAogICAgICAgZm9yIChiID0gMDsgYiA8IG91dHB1dF9kaW1zWzBdOyBiKyspIHsKICAgICAgICAgZXJyID0geGFfbm5fZWxtX3N1Yl9icm9hZGNhc3RfNERfYXN5bTE2c3hhc3ltMTZzX2FzeW0xNnMoCkBAIC0xOTYsNyArMTg2LDcgQEAKIAogICAgICAgICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCBlcnIgPT0gMCk7CiAgICAgICB9Ci0jZWxzZSAgIC8vIGRlZmluZWQoSElGSTQpCisjZWxzZSAgIC8vIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCiAgICAgICBpZiAobmVlZF9icm9hZGNhc3QpIHsKICAgICAgICAgdGZsaXRlOjpyZWZlcmVuY2Vfb3BzOjpCcm9hZGNhc3RRdWFudFN1YlNsb3coCiAgICAgICAgICAgICBvcF9wYXJhbXMsIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGlucHV0MSksCkBAIC0yMTQsNyArMjA0LDcgQEAKICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKG91dHB1dCksCiAgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDE2X3Q+KG91dHB1dCkpOwogICAgICAgfQotI2VuZGlmICAvLyBkZWZpbmVkKEhJRkk0KQorI2VuZGlmICAvLyBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQogICAgICAgYnJlYWs7CiAgICAgfQogICAgIGRlZmF1bHQ6CkBAIC0yNTYsNCArMjQ2LDQgQEAKICAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoU3ViSW5pdCwgU3ViUHJlcGFyZSwgU3ViRXZhbCk7CiB9CiAKLX0gIC8vIG5hbWVzcGFjZSB0ZmxpdGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2Evc3ZkZi5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9zdmRmLmNjCmluZGV4IGMxZGFjM2IuLmRhMzRlMDkgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9zdmRmLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9zdmRmLmNjCkBAIC0zMyw3ICszMyw3IEBACiBuYW1lc3BhY2UgdGZsaXRlIHsKIG5hbWVzcGFjZSB7CiAKLSNpZiBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQorI2lmIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCiAKIFRmTGl0ZVN0YXR1cyBFdmFsSW50ZWdlclN2ZGZIaWZpKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dF90ZW5zb3IsCkBAIC02Myw3ICs2Myw3IEBACiAjaWYgZGVmaW5lZChISUZJNSkKICAgbWVtY3B5KHN0YXRlX3B0ciwgc3RhdGVfcHRyICsgMSwgbnVtX2J5dGVzKTsKICNlbHNlCi0gIHhhX25uX21lbW1vdmVfMTYoc3RhdGVfcHRyLCBzdGF0ZV9wdHIgKyAxLCBudW1fYnl0ZXMpOworICB4YV9ubl9tZW1tb3ZlXzE2KHN0YXRlX3B0ciwgc3RhdGVfcHRyICsgMSwgKG51bV9ieXRlcyA+PiAxKSk7CiAjZW5kaWYgIC8vIGRlZmluZWQoSElGSTUpCiAKICAgLy8gTm90ZTogbm8gbmVlZCB0byBjbGVhciB0aGUgbGF0ZXN0IGFjdGl2YXRpb24sIG1hdG11bCBpcyBub3QgYWNjdW11bGF0aXZlLgpAQCAtMTA4LDcgKzEwOCw3IEBACiAgIH0KICAgcmV0dXJuIGtUZkxpdGVPazsKIH0KLSNlbmRpZiAgLy8gZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKKyNlbmRpZiAgLy8gZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKIAogdm9pZCogSW5pdChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpIHsKICAgVEZMSVRFX0RDSEVDSyhjb250ZXh0ICE9IG51bGxwdHIpOwpAQCAtMTE2LDcgKzExNiw3IEBACiB9CiAKIFRmTGl0ZVN0YXR1cyBQcmVwYXJlSW50OChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKSB7Ci0jaWYgZGVmaW5lZChISUZJTUlOSSkgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKKyNpZiBkZWZpbmVkKEhJRklNSU5JKSB8fCBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQogICBURkxJVEVfRENIRUNLKG5vZGUtPmJ1aWx0aW5fZGF0YSAhPSBudWxscHRyKTsKICAgY29uc3QgYXV0byogcGFyYW1zID0gc3RhdGljX2Nhc3Q8Y29uc3QgVGZMaXRlU1ZERlBhcmFtcyo+KG5vZGUtPmJ1aWx0aW5fZGF0YSk7CiAKQEAgLTI1MiwxMSArMjUyLDEyIEBACiAgIHJldHVybiBrVGZMaXRlT2s7CiAjZWxzZQogICByZXR1cm4gUHJlcGFyZVN2ZGYoY29udGV4dCwgbm9kZSk7Ci0jZW5kaWYgIC8vIGRlZmluZWQoSElGSU1JTkkpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCisjZW5kaWYgIC8vIGRlZmluZWQoSElGSU1JTkkpIHx8IGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8CisgICAgICAgIC8vIGRlZmluZWQoSElGSTUpCiB9CiAKIFRmTGl0ZVN0YXR1cyBQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKLSNpZiBkZWZpbmVkKEhJRklNSU5JKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQorI2lmIGRlZmluZWQoSElGSU1JTkkpIHx8IGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCiAKICAgTWljcm9Db250ZXh0KiBtaWNyb19jb250ZXh0ID0gR2V0TWljcm9Db250ZXh0KGNvbnRleHQpOwogICBUZkxpdGVUZW5zb3IqIGlucHV0ID0KQEAgLTI3Nyw3ICsyNzgsOCBAQAogICByZXR1cm4gc3RhdHVzOwogI2Vsc2UKICAgcmV0dXJuIFByZXBhcmVTdmRmKGNvbnRleHQsIG5vZGUpOwotI2VuZGlmICAvLyBkZWZpbmVkKEhJRklNSU5JKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQorI2VuZGlmICAvLyBkZWZpbmVkKEhJRklNSU5JKSB8fCBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fAorICAgICAgICAvLyBkZWZpbmVkKEhJRkk1KQogfQogCiBUZkxpdGVTdGF0dXMgRXZhbEludDgoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewpAQCAtMzA2LDcgKzMwOCw3IEBACiAgIHJldHVybiBFdmFsSW50ZWdlclN2ZGZIaWZpbWluaShjb250ZXh0LCBub2RlLCBpbnB1dCwgd2VpZ2h0c19mZWF0dXJlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0c190aW1lLCBiaWFzLCBwYXJhbXMsIGFjdGl2YXRpb25fc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsIGRhdGEpOwotI2VsaWYgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKKyNlbGlmIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCiAgIHJldHVybiBFdmFsSW50ZWdlclN2ZGZIaWZpKGNvbnRleHQsIG5vZGUsIGlucHV0LCB3ZWlnaHRzX2ZlYXR1cmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlaWdodHNfdGltZSwgYmlhcywgcGFyYW1zLCBhY3RpdmF0aW9uX3N0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsIGRhdGEpOwpAQCAtMzE0LDcgKzMxNiw3IEBACiAgIEV2YWxJbnQxNlN2ZGZSZWZlcmVuY2UoY29udGV4dCwgbm9kZSwgaW5wdXQsIHdlaWdodHNfZmVhdHVyZSwgd2VpZ2h0c190aW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJpYXMsIHBhcmFtcywgYWN0aXZhdGlvbl9zdGF0ZSwgb3V0cHV0LCBkYXRhKTsKICAgcmV0dXJuIGtUZkxpdGVPazsKLSNlbmRpZiAgLy8gZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKKyNlbmRpZiAgLy8gZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKIH0KIAogVGZMaXRlU3RhdHVzIEV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL3RyYW5zcG9zZV9jb252LmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL3RyYW5zcG9zZV9jb252LmNjCmluZGV4IDgyNmUxNjguLjQ0YTlmODYgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS90cmFuc3Bvc2VfY29udi5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvdHJhbnNwb3NlX2NvbnYuY2MKQEAgLTE4MywxOSArMTgzLDU3IEBACiAgIC8vIFF1YW50aXplZCBrZXJuZWxzIHVzZSBhbiBpbnQzMiBzY3JhdGNoIGJ1ZmZlci4KICAgaWYgKGlucHV0LT50eXBlID09IGtUZkxpdGVJbnQ4KSB7CiAgICAgVEZMSVRFX0RDSEVDSyhjb250ZXh0LT5SZXF1ZXN0U2NyYXRjaEJ1ZmZlckluQXJlbmEgIT0gbnVsbHB0cik7CisjaWYgZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKKyAgICBjb25zdCBpbnQgc3RyaWRlX3dpZHRoID0gcGFyYW1zLT5zdHJpZGVfd2lkdGg7CisgICAgY29uc3QgaW50IHN0cmlkZV9oZWlnaHQgPSBwYXJhbXMtPnN0cmlkZV9oZWlnaHQ7CisKKyAgICBjb25zdCBpbnQgaW5wdXRfaGVpZ2h0ID0gU2l6ZU9mRGltZW5zaW9uKGlucHV0LCAxKTsKKyAgICBjb25zdCBpbnQgaW5wdXRfd2lkdGggPSBTaXplT2ZEaW1lbnNpb24oaW5wdXQsIDIpOworICAgIGNvbnN0IGludCBpbnB1dF9kZXB0aCA9IFNpemVPZkRpbWVuc2lvbihpbnB1dCwgMyk7CisgICAgY29uc3QgaW50IG91dHB1dF9oZWlnaHQgPSBoZWlnaHQ7CisgICAgY29uc3QgaW50IG91dHB1dF93aWR0aCA9IHdpZHRoOworICAgIGludDMyX3Qgc2NyYXRjaF9idWZmZXJfc2l6ZSA9IDA7CisgICAgc2NyYXRjaF9idWZmZXJfc2l6ZSA9IHhhX25uX3RyYW5zcG9zZV9jb252X2dldHNpemUoCisgICAgICAgIGlucHV0X2hlaWdodCwgaW5wdXRfd2lkdGgsIGlucHV0X2RlcHRoLCBmaWx0ZXJfaGVpZ2h0LCBmaWx0ZXJfd2lkdGgsCisgICAgICAgIHN0cmlkZV93aWR0aCwgc3RyaWRlX2hlaWdodCwgb3V0cHV0X2hlaWdodCwgb3V0cHV0X3dpZHRoLCBudW1fY2hhbm5lbHMsCisgICAgICAgIFBSRUNfU1lNOFMsIFBSRUNfQVNZTThTKTsKKyAgICBURkxJVEVfRENIRUNLKGNvbnRleHQtPlJlcXVlc3RTY3JhdGNoQnVmZmVySW5BcmVuYSgKKyAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBzY3JhdGNoX2J1ZmZlcl9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICYoZGF0YS0+c2NyYXRjaF9idWZmZXJfaW5kZXgpKSA9PSBrVGZMaXRlT2spOworI2Vsc2UgIC8vICNpZiBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQogICAgIFRGTElURV9EQ0hFQ0soY29udGV4dC0+UmVxdWVzdFNjcmF0Y2hCdWZmZXJJbkFyZW5hKAogICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgR2V0VGVuc29yU2hhcGUob3V0cHV0KS5GbGF0U2l6ZSgpICogc2l6ZW9mKGludDMyX3QpLAogICAgICAgICAgICAgICAgICAgICAgICYoZGF0YS0+c2NyYXRjaF9idWZmZXJfaW5kZXgpKSA9PSBrVGZMaXRlT2spOworI2VuZGlmCiAgIH0KIAogICAvLyBRdWFudGl6ZWQgMTZ4OCBrZXJuZWxzIHVzZSBhbiBpbnQ2NCBzY3JhdGNoIGJ1ZmZlci4KICAgaWYgKGlucHV0LT50eXBlID09IGtUZkxpdGVJbnQxNikgewogICAgIFRGTElURV9EQ0hFQ0soY29udGV4dC0+UmVxdWVzdFNjcmF0Y2hCdWZmZXJJbkFyZW5hICE9IG51bGxwdHIpOworI2lmIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCisgICAgY29uc3QgaW50IHN0cmlkZV93aWR0aCA9IHBhcmFtcy0+c3RyaWRlX3dpZHRoOworICAgIGNvbnN0IGludCBzdHJpZGVfaGVpZ2h0ID0gcGFyYW1zLT5zdHJpZGVfaGVpZ2h0OworCisgICAgY29uc3QgaW50IGlucHV0X2hlaWdodCA9IFNpemVPZkRpbWVuc2lvbihpbnB1dCwgMSk7CisgICAgY29uc3QgaW50IGlucHV0X3dpZHRoID0gU2l6ZU9mRGltZW5zaW9uKGlucHV0LCAyKTsKKyAgICBjb25zdCBpbnQgaW5wdXRfZGVwdGggPSBTaXplT2ZEaW1lbnNpb24oaW5wdXQsIDMpOworICAgIGNvbnN0IGludCBvdXRwdXRfaGVpZ2h0ID0gaGVpZ2h0OworICAgIGNvbnN0IGludCBvdXRwdXRfd2lkdGggPSB3aWR0aDsKKyAgICBpbnQzMl90IHNjcmF0Y2hfYnVmZmVyX3NpemUgPSAwOworICAgIHNjcmF0Y2hfYnVmZmVyX3NpemUgPSB4YV9ubl90cmFuc3Bvc2VfY29udl9nZXRzaXplKAorICAgICAgICBpbnB1dF9oZWlnaHQsIGlucHV0X3dpZHRoLCBpbnB1dF9kZXB0aCwgZmlsdGVyX2hlaWdodCwgZmlsdGVyX3dpZHRoLAorICAgICAgICBzdHJpZGVfd2lkdGgsIHN0cmlkZV9oZWlnaHQsIG91dHB1dF9oZWlnaHQsIG91dHB1dF93aWR0aCwgbnVtX2NoYW5uZWxzLAorICAgICAgICBQUkVDX1NZTThTLCBQUkVDX1NZTTE2Uyk7CisgICAgVEZMSVRFX0RDSEVDSyhjb250ZXh0LT5SZXF1ZXN0U2NyYXRjaEJ1ZmZlckluQXJlbmEoCisgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCwgc2NyYXRjaF9idWZmZXJfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAmKGRhdGEtPnNjcmF0Y2hfYnVmZmVyX2luZGV4KSkgPT0ga1RmTGl0ZU9rKTsKKyNlbHNlICAgLy8gI2lmIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCiAgICAgVEZMSVRFX0RDSEVDSyhjb250ZXh0LT5SZXF1ZXN0U2NyYXRjaEJ1ZmZlckluQXJlbmEoCiAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICBHZXRUZW5zb3JTaGFwZShvdXRwdXQpLkZsYXRTaXplKCkgKiBzaXplb2Yoc3RkOjppbnQ2NF90KSwKICAgICAgICAgICAgICAgICAgICAgICAmKGRhdGEtPnNjcmF0Y2hfYnVmZmVyX2luZGV4KSkgPT0ga1RmTGl0ZU9rKTsKKyNlbmRpZiAgLy8gI2lmIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCiAgIH0KIAogICAvLyBBbGwgcGVyLWNoYW5uZWwgcXVhbnRpemVkIHRlbnNvcnMgbmVlZCB2YWxpZCB6ZXJvIHBvaW50IGFuZCBzY2FsZSBhcnJheXMuCkBAIC0yODIsNiArMzIwLDYzIEBACiAgICAgY2FzZSBrVGZMaXRlSW50ODogewogICAgICAgaW50MzJfdCogc2NyYXRjaF9idWZmZXIgPSBzdGF0aWNfY2FzdDxpbnQzMl90Kj4oCiAgICAgICAgICAgY29udGV4dC0+R2V0U2NyYXRjaEJ1ZmZlcihjb250ZXh0LCBkYXRhLnNjcmF0Y2hfYnVmZmVyX2luZGV4KSk7CisjaWYgZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKKyAgICAgIGlmIChiaWFzLT50eXBlID09IGtUZkxpdGVJbnQzMikgeworICAgICAgICBjb25zdCBSdW50aW1lU2hhcGUmIGlucHV0X3NoYXBlID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoaW5wdXQpOworICAgICAgICBjb25zdCBSdW50aW1lU2hhcGUmIGZpbHRlcl9zaGFwZSA9CisgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShmaWx0ZXIpOworICAgICAgICBjb25zdCBSdW50aW1lU2hhcGUmIG91dHB1dF9zaGFwZSA9CisgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShvdXRwdXQpOworICAgICAgICBjb25zdCBpbnQgc3RyaWRlX3dpZHRoID0gZGF0YS5wYXJhbXMuc3RyaWRlX3dpZHRoOworICAgICAgICBjb25zdCBpbnQgc3RyaWRlX2hlaWdodCA9IGRhdGEucGFyYW1zLnN0cmlkZV9oZWlnaHQ7CisgICAgICAgIGNvbnN0IGludCBwYWRfd2lkdGggPSBkYXRhLnBhcmFtcy5wYWRkaW5nX3ZhbHVlcy53aWR0aDsKKyAgICAgICAgY29uc3QgaW50IHBhZF9oZWlnaHQgPSBkYXRhLnBhcmFtcy5wYWRkaW5nX3ZhbHVlcy5oZWlnaHQ7CisKKyAgICAgICAgY29uc3QgaW50IGJhdGNoZXMgPSBNYXRjaGluZ0RpbShpbnB1dF9zaGFwZSwgMCwgb3V0cHV0X3NoYXBlLCAwKTsKKyAgICAgICAgY29uc3QgaW50IGlucHV0X2RlcHRoID0gTWF0Y2hpbmdEaW0oaW5wdXRfc2hhcGUsIDMsIGZpbHRlcl9zaGFwZSwgMyk7CisgICAgICAgIGNvbnN0IGludCBvdXRwdXRfZGVwdGggPSBNYXRjaGluZ0RpbShmaWx0ZXJfc2hhcGUsIDAsIG91dHB1dF9zaGFwZSwgMyk7CisKKyAgICAgICAgY29uc3QgaW50IGlucHV0X2hlaWdodCA9IGlucHV0X3NoYXBlLkRpbXMoMSk7CisgICAgICAgIGNvbnN0IGludCBpbnB1dF93aWR0aCA9IGlucHV0X3NoYXBlLkRpbXMoMik7CisgICAgICAgIGNvbnN0IGludCBmaWx0ZXJfaGVpZ2h0ID0gZmlsdGVyX3NoYXBlLkRpbXMoMSk7CisgICAgICAgIGNvbnN0IGludCBmaWx0ZXJfd2lkdGggPSBmaWx0ZXJfc2hhcGUuRGltcygyKTsKKyAgICAgICAgY29uc3QgaW50IG91dHB1dF9oZWlnaHQgPSBvdXRwdXRfc2hhcGUuRGltcygxKTsKKyAgICAgICAgY29uc3QgaW50IG91dHB1dF93aWR0aCA9IG91dHB1dF9zaGFwZS5EaW1zKDIpOworICAgICAgICBjb25zdCBpbnQ4X3QqIGlucHV0X2RhdGEgPSB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4oaW5wdXQpOworICAgICAgICBjb25zdCBpbnQ4X3QqIGZpbHRlcl9kYXRhID0KKyAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihmaWx0ZXIpOworICAgICAgICBjb25zdCBpbnQzMl90KiBiaWFzX2RhdGEgPSB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDMyX3Q+KGJpYXMpOworICAgICAgICBpbnQ4X3QqIG91dHB1dF9kYXRhID0gdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KG91dHB1dCk7CisKKyAgICAgICAgY29uc3QgaW50IG51bV9lbGVtZW50cyA9IG91dHB1dF9zaGFwZS5GbGF0U2l6ZSgpOworCisgICAgICAgIGZvciAoaW50IGIgPSAwOyBiIDwgYmF0Y2hlczsgYisrKSB7CisgICAgICAgICAgeGFfbm5fdHJhbnNwb3NlX2NvbnZfc3ltOHN4YXN5bThzKAorICAgICAgICAgICAgICAmb3V0cHV0X2RhdGFbYiAqIG91dHB1dF9oZWlnaHQgKiBvdXRwdXRfd2lkdGggKiBvdXRwdXRfZGVwdGhdLAorICAgICAgICAgICAgICBjb25zdF9jYXN0PFdPUkQ4Kj4oCisgICAgICAgICAgICAgICAgICAmaW5wdXRfZGF0YVtiICogaW5wdXRfaGVpZ2h0ICogaW5wdXRfd2lkdGggKiBpbnB1dF9kZXB0aF0pLAorICAgICAgICAgICAgICBjb25zdF9jYXN0PFdPUkQ4Kj4oZmlsdGVyX2RhdGEpLCBjb25zdF9jYXN0PFdPUkQzMio+KGJpYXNfZGF0YSksCisgICAgICAgICAgICAgIHN0cmlkZV93aWR0aCwgc3RyaWRlX2hlaWdodCwgcGFkX3dpZHRoLCBwYWRfaGVpZ2h0LCBpbnB1dF9kZXB0aCwKKyAgICAgICAgICAgICAgb3V0cHV0X2RlcHRoLCBpbnB1dF9oZWlnaHQsIGlucHV0X3dpZHRoLCBmaWx0ZXJfaGVpZ2h0LAorICAgICAgICAgICAgICBmaWx0ZXJfd2lkdGgsIG91dHB1dF9oZWlnaHQsIG91dHB1dF93aWR0aCwgbnVtX2VsZW1lbnRzIC8gYmF0Y2hlcywKKyAgICAgICAgICAgICAgZGF0YS5wYXJhbXMuaW5wdXRfb2Zmc2V0LCBkYXRhLnBhcmFtcy5vdXRwdXRfb2Zmc2V0LAorICAgICAgICAgICAgICBkYXRhLnBlcl9jaGFubmVsX291dHB1dF9zaGlmdCwgZGF0YS5wZXJfY2hhbm5lbF9vdXRwdXRfbXVsdGlwbGllciwKKyAgICAgICAgICAgICAgc2NyYXRjaF9idWZmZXIpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICByZWZlcmVuY2VfaW50ZWdlcl9vcHM6OlRyYW5zcG9zZUNvbnYoCisgICAgICAgICAgICBkYXRhLnBhcmFtcywgZGF0YS5wZXJfY2hhbm5lbF9vdXRwdXRfbXVsdGlwbGllciwKKyAgICAgICAgICAgIGRhdGEucGVyX2NoYW5uZWxfb3V0cHV0X3NoaWZ0LCB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JTaGFwZShpbnB1dCksCisgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDhfdD4oaW5wdXQpLAorICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoZmlsdGVyKSwKKyAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihmaWx0ZXIpLAorICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoYmlhcyksCisgICAgICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRUZW5zb3JEYXRhPGludDMyX3Q+KGJpYXMpLAorICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUob3V0cHV0KSwKKyAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50OF90PihvdXRwdXQpLAorICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUobnVsbHB0ciksIG51bGxwdHIsIHNjcmF0Y2hfYnVmZmVyKTsKKyAgICAgIH0KKyNlbHNlCiAgICAgICByZWZlcmVuY2VfaW50ZWdlcl9vcHM6OlRyYW5zcG9zZUNvbnYoCiAgICAgICAgICAgZGF0YS5wYXJhbXMsIGRhdGEucGVyX2NoYW5uZWxfb3V0cHV0X211bHRpcGxpZXIsCiAgICAgICAgICAgZGF0YS5wZXJfY2hhbm5lbF9vdXRwdXRfc2hpZnQsIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGlucHV0KSwKQEAgLTI5Myw2ICszODgsNyBAQAogICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKG91dHB1dCksCiAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yRGF0YTxpbnQ4X3Q+KG91dHB1dCksCiAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUobnVsbHB0ciksIG51bGxwdHIsIHNjcmF0Y2hfYnVmZmVyKTsKKyNlbmRpZgogICAgICAgYnJlYWs7CiAgICAgfQogICAgIGNhc2Uga1RmTGl0ZUludDE2OiB7CkBAIC0zMTksNyArNDE1LDcgQEAKICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50MTZfdD4ob3V0cHV0KSwKICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKG51bGxwdHIpLCBudWxscHRyLCBzY3JhdGNoX2J1ZmZlcik7CiAgICAgICB9IGVsc2UgewotI2lmIGRlZmluZWQoSElGSTQpCisjaWYgZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKICAgICAgICAgY29uc3QgUnVudGltZVNoYXBlJiBpbnB1dF9zaGFwZSA9IHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGlucHV0KTsKICAgICAgICAgY29uc3QgUnVudGltZVNoYXBlJiBmaWx0ZXJfc2hhcGUgPQogICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUoZmlsdGVyKTsKQEAgLTM1OSw5ICs0NTUsOSBAQAogICAgICAgICAgICAgICBvdXRwdXRfZGVwdGgsIGlucHV0X2hlaWdodCwgaW5wdXRfd2lkdGgsIGZpbHRlcl9oZWlnaHQsCiAgICAgICAgICAgICAgIGZpbHRlcl93aWR0aCwgb3V0cHV0X2hlaWdodCwgb3V0cHV0X3dpZHRoLCBudW1fZWxlbWVudHMgLyBiYXRjaGVzLAogICAgICAgICAgICAgICBkYXRhLnBlcl9jaGFubmVsX291dHB1dF9zaGlmdCwgZGF0YS5wZXJfY2hhbm5lbF9vdXRwdXRfbXVsdGlwbGllciwKLSAgICAgICAgICAgICAgJnNjcmF0Y2hfYnVmZmVyW2IgKiBvdXRwdXRfaGVpZ2h0ICogb3V0cHV0X3dpZHRoICogb3V0cHV0X2RlcHRoXSk7CisgICAgICAgICAgICAgIHNjcmF0Y2hfYnVmZmVyKTsKICAgICAgICAgfQotI2Vsc2UKKyNlbHNlICAgLy8gI2lmIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCiAgICAgICAgIHJlZmVyZW5jZV9pbnRlZ2VyX29wczo6VHJhbnNwb3NlQ29udigKICAgICAgICAgICAgIGRhdGEucGFyYW1zLCBkYXRhLnBlcl9jaGFubmVsX291dHB1dF9tdWx0aXBsaWVyLAogICAgICAgICAgICAgZGF0YS5wZXJfY2hhbm5lbF9vdXRwdXRfc2hpZnQsIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKGlucHV0KSwKQEAgLTM3Myw3ICs0NjksNyBAQAogICAgICAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0VGVuc29yU2hhcGUob3V0cHV0KSwKICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvckRhdGE8aW50MTZfdD4ob3V0cHV0KSwKICAgICAgICAgICAgIHRmbGl0ZTo6bWljcm86OkdldFRlbnNvclNoYXBlKG51bGxwdHIpLCBudWxscHRyLCBzY3JhdGNoX2J1ZmZlcik7Ci0jZW5kaWYgIC8vIGRlZmluZWQoSElGSTQpCisjZW5kaWYgIC8vICNpZiBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQogICAgICAgfQogICAgICAgYnJlYWs7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL3VuaWRpcmVjdGlvbmFsX3NlcXVlbmNlX2xzdG0uY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvdW5pZGlyZWN0aW9uYWxfc2VxdWVuY2VfbHN0bS5jYwppbmRleCBjYmNlMWUxLi4wZjZhMDJlIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvdW5pZGlyZWN0aW9uYWxfc2VxdWVuY2VfbHN0bS5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvdW5pZGlyZWN0aW9uYWxfc2VxdWVuY2VfbHN0bS5jYwpAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAyMDIxIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTEzLDExMDkgKzEzLDE1NiBAQAogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCi0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+CisvLyBJbnRlZ2VyIHZlcnNpb24gb2YgdW5pZGlyZWN0aW9uYWwgc2VxdWVuY2UgbHN0bS4gT25seSB0aGUgc3RhbmRhcmQgTFNUTQorLy8gKGRlZmluZWQgaW4gdGhlIGtlcmFzIExTVE0gbGF5ZXIsIGUuZy4sIG5vIHBlZXBob2xlIGV0Yy4pIGlzIHN1cHBvcnRlZCBoZXJlLgorLy8gQ3VycmVudGx5IHVzZWQgYnkgdGhlIDE2IGJpdHMgYWN0aXZhdGlvbiBjYXNlIG9ubHkKIAotI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGxpbWl0cz4KIAotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9jL2J1aWx0aW5fb3BfZGF0YS5oIgotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9jL2NvbW1vbi5oIgotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL2NvbXBhdGliaWxpdHkuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9pbnRlcm5hbC9xdWFudGl6YXRpb25fdXRpbC5oIgotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3RlbnNvcl9jdHlwZXMuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUva2VybmVscy9rZXJuZWxfdXRpbC5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2Z1bGx5X2Nvbm5lY3RlZC5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2tlcm5lbF91dGlsLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvbHN0bV9zaGFyZWQuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvbHN0bV9ldmFsLmgiCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL2xzdG1fc2hhcmVkLmgiCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2xvZy5oIgogCi0vLyBUT0RPKGIvMjMwNjY2MDc5KTogRmxhdHRlbiB0aGUgbmFtZXNwYWNlIHRvIG1hdGNoIHRoZSBidWlsdGluIGtlcm5lbAotLy8gaW1wbGVtZW50YXRpb24KIG5hbWVzcGFjZSB0ZmxpdGUgewotbmFtZXNwYWNlIG9wcyB7Ci1uYW1lc3BhY2UgbWljcm8gewotLy8gbmFtZXNwYWNlIHVuaWRpcmVjdGlvbmFsX3NlcXVlbmNlX2xzdG0geworCiBuYW1lc3BhY2UgeworLypIZWxwZXIgRnVuY3Rpb25zKi8KIAotc3RydWN0IE9wRGF0YSB7Ci0gIC8vIElmIHRoZSBsc3RtIGlzIGxheWVyIG5vcm0uCi0gIGJvb2wgdXNlX2xheWVyX25vcm07Ci0gIC8vIFRoZSBzY3JhdGNoIHRlbnNvciBpbmRleC4KLSAgaW50IHNjcmF0Y2hfdGVuc29yX2luZGV4OwotICBib29sIGNvbXB1dGVfcm93X3N1bXMgPSBmYWxzZTsKKy8qS2VybmVsIGZ1bmN0aW9ucyovCiAKLSAgbHN0bV9ldmFsOjpJbnRlZ2VyTHN0bVBhcmFtZXRlciBpbnRlZ2VyX2xzdG1fcGFyYW07Ci19Owordm9pZCogVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxzdG1Jbml0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoKSB7CisgIFRGTElURV9EQ0hFQ0soY29udGV4dC0+QWxsb2NhdGVQZXJzaXN0ZW50QnVmZmVyICE9IG51bGxwdHIpOworICByZXR1cm4gY29udGV4dC0+QWxsb2NhdGVQZXJzaXN0ZW50QnVmZmVyKGNvbnRleHQsIHNpemVvZihPcERhdGFMU1RNKSk7Cit9CiAKLVRmTGl0ZVN0YXR1cyBQb3B1bGF0ZVF1YW50aXplZExzdG1QYXJhbXM4eDhfMTYoCi0gICAgVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSwKLSAgICBsc3RtX2V2YWw6OkludGVnZXJMc3RtUGFyYW1ldGVyKiBpbnRlZ2VyX2xzdG1fcGFyYW0pIHsKLSAgLy8gQ2FsY3VsYXRlIHF1YW50aXplZCBjbGlwIGZvciBwcm9qZWN0aW9uIGFuZCBjZWxsLgotICBjb25zdCBhdXRvKiBwYXJhbXMgPQorVGZMaXRlU3RhdHVzIFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMc3RtUHJlcGFyZShUZkxpdGVDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZkxpdGVOb2RlKiBub2RlKSB7CisgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIG5vZGUtPm91dHB1dHMtPnNpemUsIDEpOworICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBub2RlLT5pbnB1dHMtPnNpemUsIDI0KTsKKworICBURkxJVEVfRENIRUNLKG5vZGUtPmJ1aWx0aW5fZGF0YSAhPSBudWxscHRyKTsKKyAgVEZMSVRFX0RDSEVDSyhub2RlLT51c2VyX2RhdGEgIT0gbnVsbHB0cik7CisKKyAgT3BEYXRhTFNUTSogb3BfZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8T3BEYXRhTFNUTSo+KG5vZGUtPnVzZXJfZGF0YSk7CisgIGNvbnN0IGF1dG8qIGJ1aWx0aW5fZGF0YSA9CiAgICAgICBzdGF0aWNfY2FzdDxUZkxpdGVVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTVBhcmFtcyo+KG5vZGUtPmJ1aWx0aW5fZGF0YSk7Ci0gIGNvbnN0IGZsb2F0IGNlbGxfY2xpcCA9IHN0YXRpY19jYXN0PGZsb2F0PihwYXJhbXMtPmNlbGxfY2xpcCk7Ci0gIGNvbnN0IGZsb2F0IHByb2pfY2xpcCA9IHN0YXRpY19jYXN0PGZsb2F0PihwYXJhbXMtPnByb2pfY2xpcCk7CisgIC8vIEFsbCBUZW1wVGZMaXRlVGVuc29ycyB3aWxsIGJlIGRlYWxsb2NhdGVkIHRocm91Z2ggdGhlIGRlc3RydWN0b3IuCisgIExzdG1UZW5zb3JzIGxzdG1fdGVuc29ycyhjb250ZXh0LCBub2RlKTsKKyAgVEZfTElURV9FTlNVUkVfT0soY29udGV4dCwgbHN0bV90ZW5zb3JzLlZhbGlkYXRlVGVuc29yU3RhdHVzKGNvbnRleHQpKTsKIAotICBjb25zdCBUZkxpdGVUZW5zb3IqIGNlbGxfc3RhdGUgPQotICAgICAgR2V0VmFyaWFibGVJbnB1dChjb250ZXh0LCBub2RlLCBtaWNybzo6bHN0bTo6ZnVsbDo6a0NlbGxTdGF0ZVRlbnNvcik7Ci0gIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIGNlbGxfc3RhdGUgIT0gbnVsbHB0cik7Ci0gIFRmTGl0ZVRlbnNvciogb3V0cHV0X3RlbnNvcjsKKyAgb3BfZGF0YS0+Y2VsbF9nYXRlX25vbmxpbmVhcl90eXBlID0gYnVpbHRpbl9kYXRhLT5hY3RpdmF0aW9uOworICBvcF9kYXRhLT5zaXplX2luZm8gPQorICAgICAgQ3JlYXRlTHN0bVNpemVJbmZvKGJ1aWx0aW5fZGF0YS0+dGltZV9tYWpvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsc3RtX3RlbnNvcnMuR2V0SW50ZXJuYWxUZW5zb3Ioa0xzdG1JbnB1dFRlbnNvciktPmRpbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgbHN0bV90ZW5zb3JzLkhpZGRlblN0YXRlVGVuc29yKCktPmRpbXMpOwogICBURl9MSVRFX0VOU1VSRV9PSygKLSAgICAgIGNvbnRleHQsIEdldE91dHB1dFNhZmUoY29udGV4dCwgbm9kZSwgbWljcm86OmxzdG06OmZ1bGw6OmtPdXRwdXRUZW5zb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXRfdGVuc29yKSk7CisgICAgICBjb250ZXh0LCBWYWxpZGF0ZVRlbnNvclNpemUoY29udGV4dCwgbHN0bV90ZW5zb3JzLCBvcF9kYXRhLT5zaXplX2luZm8pKTsKIAotICBhdXRvKiBjZWxsX3N0YXRlX3BhcmFtcyA9Ci0gICAgICBzdGF0aWNfY2FzdDxUZkxpdGVBZmZpbmVRdWFudGl6YXRpb24qPihjZWxsX3N0YXRlLT5xdWFudGl6YXRpb24ucGFyYW1zKTsKLSAgYXV0byogcHJval9wYXJhbXMgPSBzdGF0aWNfY2FzdDxUZkxpdGVBZmZpbmVRdWFudGl6YXRpb24qPigKLSAgICAgIG91dHB1dF90ZW5zb3ItPnF1YW50aXphdGlvbi5wYXJhbXMpOwotICBpZiAoY2VsbF9jbGlwID4gc3RhdGljX2Nhc3Q8ZmxvYXQ+KDAuMCkpIHsKLSAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPnF1YW50aXplZF9jZWxsX2NsaXAgPSBzdGF0aWNfY2FzdDxpbnQxNl90PihzdGQ6Om1pbigKLSAgICAgICAgc3RkOjptYXgoY2VsbF9jbGlwIC8gY2VsbF9zdGF0ZV9wYXJhbXMtPnNjYWxlLT5kYXRhWzBdLCAtMzI3NjguMGYpLAotICAgICAgICAzMjc2Ny4wZikpOworICAvLyBDcmVhdGUgY2VsbCBzdGF0ZSBpbmZvcm1hdGlvbiBhbmQgZ2F0ZSBwYXJhbWV0ZXJzIChGdWxseSBDb25uZWN0ZWQgYW5kIE11bCkKKyAgYXV0byBjZWxsX3N0YXRlX3R5cGUgPQorICAgICAgbHN0bV90ZW5zb3JzLkdldEludGVybmFsVGVuc29yKGtMc3RtQ2VsbFN0YXRlVGVuc29yKS0+dHlwZTsKKyAgaWYgKGNlbGxfc3RhdGVfdHlwZSA9PSBrVGZMaXRlRmxvYXQzMikgeworICAgIG9wX2RhdGEtPmNlbGxfc3RhdGVfaW5mbyA9CisgICAgICAgIENyZWF0ZUxzdG1DZWxsU3RhdGVJbmZvRmxvYXQoYnVpbHRpbl9kYXRhLT5jZWxsX2NsaXApOworICAgIFRGX0xJVEVfRU5TVVJFX09LKAorICAgICAgICBjb250ZXh0LCBQcmVwYXJlR2F0ZVBhcmFtZXRlcnNGbG9hdChjb250ZXh0LCBsc3RtX3RlbnNvcnMsIG9wX2RhdGEpKTsKKyAgfSBlbHNlIGlmIChjZWxsX3N0YXRlX3R5cGUgPT0ga1RmTGl0ZUludDE2KSB7CisgICAgb3BfZGF0YS0+Y2VsbF9zdGF0ZV9pbmZvID0gQ3JlYXRlTHN0bUNlbGxTdGF0ZUluZm8oCisgICAgICAgIGxzdG1fdGVuc29ycy5DZWxsU3RhdGVUZW5zb3IoKS0+cGFyYW1zLnNjYWxlLCBidWlsdGluX2RhdGEtPmNlbGxfY2xpcCk7CisgICAgVEZfTElURV9FTlNVUkVfT0soCisgICAgICAgIGNvbnRleHQsIFByZXBhcmVHYXRlUGFyYW1ldGVyc0ludGVnZXIoY29udGV4dCwgbHN0bV90ZW5zb3JzLCBvcF9kYXRhKSk7CiAgIH0gZWxzZSB7Ci0gICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5xdWFudGl6ZWRfY2VsbF9jbGlwID0gMDsKKyAgICBNaWNyb1ByaW50ZigKKyAgICAgICAgIkNlbGwgc3RhdGUgdHlwZSAlcyAoJWQpIG5vdCBzdXBwb3J0ZWQuIFRoZSBxdWFudGl6ZWQgVW5pZGlyZWN0aW9uYWwgIgorICAgICAgICAiU2VxdWVuY2UgTFNUTSBPcCBvbmx5IHN1cHBvcnQgaW50MTYgY2VsbCBzdGF0ZSIsCisgICAgICAgIFRmTGl0ZVR5cGVHZXROYW1lKGNlbGxfc3RhdGVfdHlwZSksIGNlbGxfc3RhdGVfdHlwZSk7CisgICAgcmV0dXJuIGtUZkxpdGVFcnJvcjsKICAgfQotICBpZiAocHJval9jbGlwID4gc3RhdGljX2Nhc3Q8ZmxvYXQ+KDAuMCkpIHsKLSAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPnF1YW50aXplZF9wcm9qX2NsaXAgPSBzdGF0aWNfY2FzdDxpbnQ4X3Q+KHN0ZDo6bWluKAotICAgICAgICBzdGQ6Om1heChwcm9qX2NsaXAgLyBwcm9qX3BhcmFtcy0+c2NhbGUtPmRhdGFbMF0sIC0xMjguMGYpLCAxMjcuMGYpKTsKLSAgfSBlbHNlIHsKLSAgICBpbnRlZ2VyX2xzdG1fcGFyYW0tPnF1YW50aXplZF9wcm9qX2NsaXAgPSAwOworICAvLyByZXF1ZXN0IGJ1ZmZlcnMgKGZvdXIgYnVmZmVycykKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICBURl9MSVRFX0VOU1VSRV9PSyhjb250ZXh0LCBjb250ZXh0LT5SZXF1ZXN0U2NyYXRjaEJ1ZmZlckluQXJlbmEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2RhdGEtPnNpemVfaW5mby5iYXRjaF9zaXplICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2RhdGEtPnNpemVfaW5mby5zdGF0ZV9kaW1lbnNpb24gKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGZMaXRlVHlwZUdldFNpemUoY2VsbF9zdGF0ZV90eXBlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihvcF9kYXRhLT5idWZmZXJfaW5kaWNlc1tpXSkpKTsKICAgfQorICByZXR1cm4ga1RmTGl0ZU9rOworfQogCi0gIC8vIENhbGN1bGF0ZSBlZmZlY3RpdmUgc2NhbGVzLgotICBPcERhdGEqIG9wX2RhdGEgPSBzdGF0aWNfY2FzdDxPcERhdGEqPihub2RlLT51c2VyX2RhdGEpOwotICBjb25zdCBib29sIHVzZV9sYXllcl9ub3JtID0gb3BfZGF0YS0+dXNlX2xheWVyX25vcm07CitUZkxpdGVTdGF0dXMgVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxzdG1FdmFsKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRmTGl0ZU5vZGUqIG5vZGUpIHsKKyAgVEZMSVRFX0RDSEVDSyhub2RlLT51c2VyX2RhdGEgIT0gbnVsbHB0cik7CisgIGNvbnN0IE9wRGF0YUxTVE0mIG9wX2RhdGEgPSAqcmVpbnRlcnByZXRfY2FzdDxPcERhdGFMU1RNKj4obm9kZS0+dXNlcl9kYXRhKTsKKyAgYXV0byBrZXJuZWxfY29udGVudCA9IENyZWF0ZUxTVE1LZXJuZWxDb250ZW50KGNvbnRleHQsIG5vZGUpOwogCi0gIGNvbnN0IFRmTGl0ZVRlbnNvciogaW5wdXQ7Ci0gIFRGX0xJVEVfRU5TVVJFX09LKAotICAgICAgY29udGV4dCwKLSAgICAgIEdldElucHV0U2FmZShjb250ZXh0LCBub2RlLCBtaWNybzo6bHN0bTo6ZnVsbDo6a0lucHV0VGVuc29yLCAmaW5wdXQpKTsKKyAgY29uc3QgYXV0byBhY3RpdmF0aW9uX3R5cGUgPQorICAgICAga2VybmVsX2NvbnRlbnQuaW50ZXJuYWxfdGVuc29yc1trTHN0bUlucHV0VGVuc29yXS0+dHlwZTsKKyAgY29uc3QgYXV0byB3ZWlnaHRfdHlwZSA9CisgICAgICBrZXJuZWxfY29udGVudC5pbnRlcm5hbF90ZW5zb3JzW2tMc3RtSW5wdXRUb0lucHV0V2VpZ2h0c1RlbnNvcl0tPnR5cGU7CiAKLSAgY29uc3QgVGZMaXRlVGVuc29yKiBpbnB1dF90b19pbnB1dF93ZWlnaHRzID0gR2V0T3B0aW9uYWxJbnB1dFRlbnNvcigKLSAgICAgIGNvbnRleHQsIG5vZGUsIG1pY3JvOjpsc3RtOjpmdWxsOjprSW5wdXRUb0lucHV0V2VpZ2h0c1RlbnNvcik7Ci0gIGNvbnN0IFRmTGl0ZVRlbnNvciogaW5wdXRfdG9fZm9yZ2V0X3dlaWdodHM7Ci0gIFRGX0xJVEVfRU5TVVJFX09LKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIEdldElucHV0U2FmZShjb250ZXh0LCBub2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWljcm86OmxzdG06OmZ1bGw6OmtJbnB1dFRvRm9yZ2V0V2VpZ2h0c1RlbnNvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dF90b19mb3JnZXRfd2VpZ2h0cykpOwotICBjb25zdCBUZkxpdGVUZW5zb3IqIGlucHV0X3RvX2NlbGxfd2VpZ2h0czsKLSAgVEZfTElURV9FTlNVUkVfT0soCi0gICAgICBjb250ZXh0LAotICAgICAgR2V0SW5wdXRTYWZlKGNvbnRleHQsIG5vZGUsIG1pY3JvOjpsc3RtOjpmdWxsOjprSW5wdXRUb0NlbGxXZWlnaHRzVGVuc29yLAotICAgICAgICAgICAgICAgICAgICZpbnB1dF90b19jZWxsX3dlaWdodHMpKTsKLSAgY29uc3QgVGZMaXRlVGVuc29yKiBpbnB1dF90b19vdXRwdXRfd2VpZ2h0czsKLSAgVEZfTElURV9FTlNVUkVfT0soY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgR2V0SW5wdXRTYWZlKGNvbnRleHQsIG5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWNybzo6bHN0bTo6ZnVsbDo6a0lucHV0VG9PdXRwdXRXZWlnaHRzVGVuc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0X3RvX291dHB1dF93ZWlnaHRzKSk7Ci0KLSAgY29uc3QgVGZMaXRlVGVuc29yKiByZWN1cnJlbnRfdG9faW5wdXRfd2VpZ2h0cyA9IEdldE9wdGlvbmFsSW5wdXRUZW5zb3IoCi0gICAgICBjb250ZXh0LCBub2RlLCBtaWNybzo6bHN0bTo6ZnVsbDo6a1JlY3VycmVudFRvSW5wdXRXZWlnaHRzVGVuc29yKTsKLSAgY29uc3QgVGZMaXRlVGVuc29yKiByZWN1cnJlbnRfdG9fZm9yZ2V0X3dlaWdodHM7Ci0gIFRGX0xJVEVfRU5TVVJFX09LKAotICAgICAgY29udGV4dCwgR2V0SW5wdXRTYWZlKGNvbnRleHQsIG5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWljcm86OmxzdG06OmZ1bGw6OmtSZWN1cnJlbnRUb0ZvcmdldFdlaWdodHNUZW5zb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY3VycmVudF90b19mb3JnZXRfd2VpZ2h0cykpOwotICBjb25zdCBUZkxpdGVUZW5zb3IqIHJlY3VycmVudF90b19jZWxsX3dlaWdodHM7Ci0gIFRGX0xJVEVfRU5TVVJFX09LKAotICAgICAgY29udGV4dCwgR2V0SW5wdXRTYWZlKGNvbnRleHQsIG5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWljcm86OmxzdG06OmZ1bGw6OmtSZWN1cnJlbnRUb0NlbGxXZWlnaHRzVGVuc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWN1cnJlbnRfdG9fY2VsbF93ZWlnaHRzKSk7Ci0gIGNvbnN0IFRmTGl0ZVRlbnNvciogcmVjdXJyZW50X3RvX291dHB1dF93ZWlnaHRzOwotICBURl9MSVRFX0VOU1VSRV9PSygKLSAgICAgIGNvbnRleHQsIEdldElucHV0U2FmZShjb250ZXh0LCBub2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pY3JvOjpsc3RtOjpmdWxsOjprUmVjdXJyZW50VG9PdXRwdXRXZWlnaHRzVGVuc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWN1cnJlbnRfdG9fb3V0cHV0X3dlaWdodHMpKTsKLQotICBjb25zdCBUZkxpdGVUZW5zb3IqIGNlbGxfdG9faW5wdXRfd2VpZ2h0cyA9IEdldE9wdGlvbmFsSW5wdXRUZW5zb3IoCi0gICAgICBjb250ZXh0LCBub2RlLCBtaWNybzo6bHN0bTo6ZnVsbDo6a0NlbGxUb0lucHV0V2VpZ2h0c1RlbnNvcik7Ci0gIGNvbnN0IFRmTGl0ZVRlbnNvciogY2VsbF90b19mb3JnZXRfd2VpZ2h0cyA9IEdldE9wdGlvbmFsSW5wdXRUZW5zb3IoCi0gICAgICBjb250ZXh0LCBub2RlLCBtaWNybzo6bHN0bTo6ZnVsbDo6a0NlbGxUb0ZvcmdldFdlaWdodHNUZW5zb3IpOwotICBjb25zdCBUZkxpdGVUZW5zb3IqIGNlbGxfdG9fb3V0cHV0X3dlaWdodHMgPSBHZXRPcHRpb25hbElucHV0VGVuc29yKAotICAgICAgY29udGV4dCwgbm9kZSwgbWljcm86OmxzdG06OmZ1bGw6OmtDZWxsVG9PdXRwdXRXZWlnaHRzVGVuc29yKTsKLQotICBjb25zdCBUZkxpdGVUZW5zb3IqIGlucHV0X2xheWVyX25vcm1fY29lZmZpY2llbnRzID0gR2V0T3B0aW9uYWxJbnB1dFRlbnNvcigKLSAgICAgIGNvbnRleHQsIG5vZGUsIG1pY3JvOjpsc3RtOjpmdWxsOjprSW5wdXRMYXllck5vcm1Db2VmZmljaWVudHNUZW5zb3IpOwotICBjb25zdCBUZkxpdGVUZW5zb3IqIGZvcmdldF9sYXllcl9ub3JtX2NvZWZmaWNpZW50cyA9IEdldE9wdGlvbmFsSW5wdXRUZW5zb3IoCi0gICAgICBjb250ZXh0LCBub2RlLCBtaWNybzo6bHN0bTo6ZnVsbDo6a0ZvcmdldExheWVyTm9ybUNvZWZmaWNpZW50c1RlbnNvcik7Ci0gIGNvbnN0IFRmTGl0ZVRlbnNvciogY2VsbF9sYXllcl9ub3JtX2NvZWZmaWNpZW50cyA9IEdldE9wdGlvbmFsSW5wdXRUZW5zb3IoCi0gICAgICBjb250ZXh0LCBub2RlLCBtaWNybzo6bHN0bTo6ZnVsbDo6a0NlbGxMYXllck5vcm1Db2VmZmljaWVudHNUZW5zb3IpOwotICBjb25zdCBUZkxpdGVUZW5zb3IqIG91dHB1dF9sYXllcl9ub3JtX2NvZWZmaWNpZW50cyA9IEdldE9wdGlvbmFsSW5wdXRUZW5zb3IoCi0gICAgICBjb250ZXh0LCBub2RlLCBtaWNybzo6bHN0bTo6ZnVsbDo6a091dHB1dExheWVyTm9ybUNvZWZmaWNpZW50c1RlbnNvcik7Ci0KLSAgY29uc3QgVGZMaXRlVGVuc29yKiBwcm9qZWN0aW9uX3dlaWdodHMgPSBHZXRPcHRpb25hbElucHV0VGVuc29yKAotICAgICAgY29udGV4dCwgbm9kZSwgbWljcm86OmxzdG06OmZ1bGw6OmtQcm9qZWN0aW9uV2VpZ2h0c1RlbnNvcik7Ci0KLSAgVGZMaXRlVGVuc29yKiBvdXRwdXRfc3RhdGUgPQotICAgICAgR2V0VmFyaWFibGVJbnB1dChjb250ZXh0LCBub2RlLCBtaWNybzo6bHN0bTo6ZnVsbDo6a091dHB1dFN0YXRlVGVuc29yKTsKLSAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgb3V0cHV0X3N0YXRlICE9IG51bGxwdHIpOwotCi0gIC8vIFNpbmNlIHdlIGhhdmUgYWxyZWFkeSBjaGVja2VkIHRoYXQgd2VpZ2h0cyBhcmUgYWxsIHRoZXJlIG9yIG5vbmUsIHdlIGNhbgotICAvLyBjaGVjayB0aGUgZXhpc3RlbmNlIG9mIG9ubHkgb25lIHRvIGdldCB0aGUgY29uZGl0aW9uLgotICBjb25zdCBib29sIHVzZV9jaWZnID0gKGlucHV0X3RvX2lucHV0X3dlaWdodHMgPT0gbnVsbHB0cik7Ci0gIGNvbnN0IGJvb2wgdXNlX3BlZXBob2xlID0gKGNlbGxfdG9fb3V0cHV0X3dlaWdodHMgIT0gbnVsbHB0cik7Ci0gIGNvbnN0IGJvb2wgdXNlX3Byb2plY3Rpb24gPSAocHJvamVjdGlvbl93ZWlnaHRzICE9IG51bGxwdHIpOwotCi0gIC8vIEdldCBpbnRlcm1lZGlhdGUgc2NhbGVzIGFuZCB6ZXJvIHBvaW50cy4KLSAgY29uc3RleHByIHNpemVfdCBrSW50ZXJtZWRpYXRlQ291bnQgPSA1OwotICBmbG9hdCBpbnRlcm1lZGlhdGVfc2NhbGVba0ludGVybWVkaWF0ZUNvdW50XTsKLSAgaW50MzJfdCBpbnRlcm1lZGlhdGVfenBba0ludGVybWVkaWF0ZUNvdW50XTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpIHsKLSAgICBpZiAodXNlX2xheWVyX25vcm0pIHsKLSAgICAgIFRmTGl0ZVRlbnNvciogaW50ZXJtZWRpYXRlID0KLSAgICAgICAgICBjb250ZXh0LT5HZXRUZW5zb3IoY29udGV4dCwgbm9kZS0+aW50ZXJtZWRpYXRlcy0+ZGF0YVtpXSk7Ci0gICAgICBhdXRvKiB0bXBfcGFyYW1zID0gc3RhdGljX2Nhc3Q8VGZMaXRlQWZmaW5lUXVhbnRpemF0aW9uKj4oCi0gICAgICAgICAgaW50ZXJtZWRpYXRlLT5xdWFudGl6YXRpb24ucGFyYW1zKTsKLSAgICAgIGludGVybWVkaWF0ZV9zY2FsZVtpXSA9IHRtcF9wYXJhbXMtPnNjYWxlLT5kYXRhWzBdOwotICAgICAgaW50ZXJtZWRpYXRlX3pwW2ldID0gdG1wX3BhcmFtcy0+emVyb19wb2ludC0+ZGF0YVswXTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gUTMuMTIgZm9yIGFjdGl2YXRpb24gZnVuY3Rpb25zLgotICAgICAgaW50ZXJtZWRpYXRlX3NjYWxlW2ldID0gc3RkOjpwb3coMiwgLTEyKTsKLSAgICAgIGludGVybWVkaWF0ZV96cFtpXSA9IDA7CisgIHN3aXRjaCAoYWN0aXZhdGlvbl90eXBlKSB7CisgICAgY2FzZSBrVGZMaXRlRmxvYXQzMjogeworICAgICAgTFNUTUJ1ZmZlcnM8ZmxvYXQ+IGJ1ZmZlcnMgPQorICAgICAgICAgIENyZWF0ZUxTVE1CdWZmZXJzPGZsb2F0Pihjb250ZXh0LCBvcF9kYXRhLmJ1ZmZlcl9pbmRpY2VzKTsKKyAgICAgIEV2YWxMc3RtPGZsb2F0LCBmbG9hdCwgZmxvYXQsIGZsb2F0PihvcF9kYXRhLCBrZXJuZWxfY29udGVudCwgYnVmZmVycyk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBrVGZMaXRlSW50ODogeworICAgICAgc3dpdGNoICh3ZWlnaHRfdHlwZSkgeworICAgICAgICBjYXNlIGtUZkxpdGVJbnQ4OiB7CisgICAgICAgICAgLy8gOChhY3RpdmF0aW9uKXg4KHdlaWdodCktPjE2KGNlbGwpIExTVE0gd2l0aCAzMiBiaXRzIGJpYXMKKyAgICAgICAgICBMU1RNQnVmZmVyczxpbnQxNl90PiBidWZmZXJzID0KKyAgICAgICAgICAgICAgQ3JlYXRlTFNUTUJ1ZmZlcnM8aW50MTZfdD4oY29udGV4dCwgb3BfZGF0YS5idWZmZXJfaW5kaWNlcyk7CisgICAgICAgICAgRXZhbExzdG08aW50OF90LCBpbnQ4X3QsIGludDE2X3QsIGludDMyX3Q+KG9wX2RhdGEsIGtlcm5lbF9jb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJzKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgTWljcm9QcmludGYoIkZpbHRlciB0eXBlICVzICglZCkgbm90IHN1cHBvcnRlZC4iLAorICAgICAgICAgICAgICAgICAgICAgIFRmTGl0ZVR5cGVHZXROYW1lKHdlaWdodF90eXBlKSwgYWN0aXZhdGlvbl90eXBlKTsKKyAgICAgICAgICByZXR1cm4ga1RmTGl0ZUVycm9yOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBrVGZMaXRlSW50MTY6IHsKKyAgICAgIHN3aXRjaCAod2VpZ2h0X3R5cGUpIHsKKyAgICAgICAgY2FzZSBrVGZMaXRlSW50ODogeworICAgICAgICAgIC8vIDE2KGFjdGl2YXRpb24peDgod2VpZ2h0KS0+MTYoY2VsbCkgTFNUTSB3aXRoIDY0IGJpdHMgYmlhcworICAgICAgICAgIExTVE1CdWZmZXJzPGludDE2X3Q+IGJ1ZmZlcnMgPQorICAgICAgICAgICAgICBDcmVhdGVMU1RNQnVmZmVyczxpbnQxNl90Pihjb250ZXh0LCBvcF9kYXRhLmJ1ZmZlcl9pbmRpY2VzKTsKKyAgICAgICAgICBFdmFsTHN0bTxpbnQxNl90LCBpbnQ4X3QsIGludDE2X3QsIGludDY0X3Q+KG9wX2RhdGEsIGtlcm5lbF9jb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVycyk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgIE1pY3JvUHJpbnRmKCJGaWx0ZXIgdHlwZSAlcyAoJWQpIG5vdCBzdXBwb3J0ZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICBUZkxpdGVUeXBlR2V0TmFtZSh3ZWlnaHRfdHlwZSksIHdlaWdodF90eXBlKTsKKyAgICAgICAgICByZXR1cm4ga1RmTGl0ZUVycm9yOworICAgICAgICB9CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgTWljcm9QcmludGYoIklucHV0IHR5cGUgJXMgKCVkKSBub3Qgc3VwcG9ydGVkLiIsCisgICAgICAgICAgICAgICAgICBUZkxpdGVUeXBlR2V0TmFtZShhY3RpdmF0aW9uX3R5cGUpLCBhY3RpdmF0aW9uX3R5cGUpOworICAgICAgcmV0dXJuIGtUZkxpdGVFcnJvcjsKICAgICB9CiAgIH0KLSAgLy8gSW4gdGhlIGFic2VuY2Ugb2YgcHJvamVjdGlvbiwgaGlkZGVuIGJlY29tZXMgb3R1cHV0IGFuZCB0aGlzIGludGVybWVkaWF0ZQotICAvLyBpcyBpZ25vcmVkLgotICBUZkxpdGVUZW5zb3IqIGhpZGRlbiA9Ci0gICAgICBjb250ZXh0LT5HZXRUZW5zb3IoY29udGV4dCwgbm9kZS0+aW50ZXJtZWRpYXRlcy0+ZGF0YVs0XSk7Ci0gIGF1dG8qIGhpZGRlbl9wYXJhbXMgPQotICAgICAgc3RhdGljX2Nhc3Q8VGZMaXRlQWZmaW5lUXVhbnRpemF0aW9uKj4oaGlkZGVuLT5xdWFudGl6YXRpb24ucGFyYW1zKTsKLSAgaW50ZXJtZWRpYXRlX3NjYWxlWzRdID0gaGlkZGVuX3BhcmFtcy0+c2NhbGUtPmRhdGFbMF07Ci0gIGludGVybWVkaWF0ZV96cFs0XSA9IGhpZGRlbl9wYXJhbXMtPnplcm9fcG9pbnQtPmRhdGFbMF07Ci0KLSAgLy8gU2NhbGVzLgotICBjb25zdCBmbG9hdCBkZWZhdWx0X3NjYWxlID0gMS4wOwotICBmbG9hdCBpbnB1dF9zY2FsZSA9IGRlZmF1bHRfc2NhbGU7Ci0gIGZsb2F0IGlucHV0X3RvX2lucHV0X3dlaWdodF9zY2FsZSA9IGRlZmF1bHRfc2NhbGU7Ci0gIGZsb2F0IHJlY3VycmVudF90b19pbnB1dF93ZWlnaHRfc2NhbGUgPSBkZWZhdWx0X3NjYWxlOwotICBmbG9hdCBjZWxsX3RvX2lucHV0X3dlaWdodF9zY2FsZSA9IGRlZmF1bHRfc2NhbGU7Ci0gIGZsb2F0IGlucHV0X3RvX2ZvcmdldF93ZWlnaHRfc2NhbGUgPSBkZWZhdWx0X3NjYWxlOwotICBmbG9hdCByZWN1cnJlbnRfdG9fZm9yZ2V0X3dlaWdodF9zY2FsZSA9IGRlZmF1bHRfc2NhbGU7Ci0gIGZsb2F0IGNlbGxfdG9fZm9yZ2V0X3dlaWdodF9zY2FsZSA9IGRlZmF1bHRfc2NhbGU7Ci0gIGZsb2F0IGlucHV0X3RvX2NlbGxfd2VpZ2h0X3NjYWxlID0gZGVmYXVsdF9zY2FsZTsKLSAgZmxvYXQgcmVjdXJyZW50X3RvX2NlbGxfd2VpZ2h0X3NjYWxlID0gZGVmYXVsdF9zY2FsZTsKLSAgZmxvYXQgaW5wdXRfdG9fb3V0cHV0X3dlaWdodF9zY2FsZSA9IGRlZmF1bHRfc2NhbGU7Ci0gIGZsb2F0IHJlY3VycmVudF90b19vdXRwdXRfd2VpZ2h0X3NjYWxlID0gZGVmYXVsdF9zY2FsZTsKLSAgZmxvYXQgY2VsbF90b19vdXRwdXRfd2VpZ2h0X3NjYWxlID0gZGVmYXVsdF9zY2FsZTsKLSAgZmxvYXQgcHJvamVjdGlvbl93ZWlnaHRfc2NhbGUgPSBkZWZhdWx0X3NjYWxlOwotICBmbG9hdCBsYXllcl9ub3JtX2lucHV0X3NjYWxlID0gZGVmYXVsdF9zY2FsZTsKLSAgZmxvYXQgbGF5ZXJfbm9ybV9mb3JnZXRfc2NhbGUgPSBkZWZhdWx0X3NjYWxlOwotICBmbG9hdCBsYXllcl9ub3JtX2NlbGxfc2NhbGUgPSBkZWZhdWx0X3NjYWxlOwotICBmbG9hdCBsYXllcl9ub3JtX291dHB1dF9zY2FsZSA9IGRlZmF1bHRfc2NhbGU7Ci0gIGZsb2F0IG91dHB1dF9zdGF0ZV9zY2FsZSA9IGRlZmF1bHRfc2NhbGU7Ci0gIGludCBjZWxsX3NjYWxlID0gMTsKLQotICAvLyBFZmZlY3RpdmUgc2NhbGVzLgotICBmbG9hdCBlZmZlY3RpdmVfaW5wdXRfdG9faW5wdXRfc2NhbGUgPSBkZWZhdWx0X3NjYWxlOwotICBmbG9hdCBlZmZlY3RpdmVfcmVjdXJyZW50X3RvX2lucHV0X3NjYWxlID0gZGVmYXVsdF9zY2FsZTsKLSAgZmxvYXQgZWZmZWN0aXZlX2NlbGxfdG9faW5wdXRfc2NhbGUgPSBkZWZhdWx0X3NjYWxlOwotICBmbG9hdCBlZmZlY3RpdmVfaW5wdXRfdG9fZm9yZ2V0X3NjYWxlID0gZGVmYXVsdF9zY2FsZTsKLSAgZmxvYXQgZWZmZWN0aXZlX3JlY3VycmVudF90b19mb3JnZXRfc2NhbGUgPSBkZWZhdWx0X3NjYWxlOwotICBmbG9hdCBlZmZlY3RpdmVfY2VsbF90b19mb3JnZXRfc2NhbGUgPSBkZWZhdWx0X3NjYWxlOwotICBmbG9hdCBlZmZlY3RpdmVfaW5wdXRfdG9fY2VsbF9zY2FsZSA9IGRlZmF1bHRfc2NhbGU7Ci0gIGZsb2F0IGVmZmVjdGl2ZV9yZWN1cnJlbnRfdG9fY2VsbF9zY2FsZSA9IGRlZmF1bHRfc2NhbGU7Ci0gIGZsb2F0IGVmZmVjdGl2ZV9pbnB1dF90b19vdXRwdXRfc2NhbGUgPSBkZWZhdWx0X3NjYWxlOwotICBmbG9hdCBlZmZlY3RpdmVfcmVjdXJyZW50X3RvX291dHB1dF9zY2FsZSA9IGRlZmF1bHRfc2NhbGU7Ci0gIGZsb2F0IGVmZmVjdGl2ZV9jZWxsX3RvX291dHB1dF9zY2FsZSA9IGRlZmF1bHRfc2NhbGU7Ci0gIGZsb2F0IGVmZmVjdGl2ZV9wcm9qX3NjYWxlID0gZGVmYXVsdF9zY2FsZTsKLSAgZmxvYXQgZWZmZWN0aXZlX2hpZGRlbl9zY2FsZSA9IGRlZmF1bHRfc2NhbGU7Ci0KLSAgLy8gUG9wdWxhdGUgc2NhbGVzLgotICBpZiAoIXVzZV9jaWZnKSB7Ci0gICAgaW5wdXRfdG9faW5wdXRfd2VpZ2h0X3NjYWxlID0gaW5wdXRfdG9faW5wdXRfd2VpZ2h0cy0+cGFyYW1zLnNjYWxlOwotICAgIHJlY3VycmVudF90b19pbnB1dF93ZWlnaHRfc2NhbGUgPSByZWN1cnJlbnRfdG9faW5wdXRfd2VpZ2h0cy0+cGFyYW1zLnNjYWxlOwotICB9Ci0KLSAgaWYgKHVzZV9wZWVwaG9sZSkgewotICAgIGlmICghdXNlX2NpZmcpIHsKLSAgICAgIGNlbGxfdG9faW5wdXRfd2VpZ2h0X3NjYWxlID0gY2VsbF90b19pbnB1dF93ZWlnaHRzLT5wYXJhbXMuc2NhbGU7Ci0gICAgfQotICAgIGNlbGxfdG9fZm9yZ2V0X3dlaWdodF9zY2FsZSA9IGNlbGxfdG9fZm9yZ2V0X3dlaWdodHMtPnBhcmFtcy5zY2FsZTsKLSAgICBjZWxsX3RvX291dHB1dF93ZWlnaHRfc2NhbGUgPSBjZWxsX3RvX291dHB1dF93ZWlnaHRzLT5wYXJhbXMuc2NhbGU7Ci0gIH0KLQotICBpZiAodXNlX2xheWVyX25vcm0pIHsKLSAgICBpZiAoIXVzZV9jaWZnKSB7Ci0gICAgICBsYXllcl9ub3JtX2lucHV0X3NjYWxlID0gaW5wdXRfbGF5ZXJfbm9ybV9jb2VmZmljaWVudHMtPnBhcmFtcy5zY2FsZTsKLSAgICB9Ci0gICAgbGF5ZXJfbm9ybV9mb3JnZXRfc2NhbGUgPSBmb3JnZXRfbGF5ZXJfbm9ybV9jb2VmZmljaWVudHMtPnBhcmFtcy5zY2FsZTsKLSAgICBsYXllcl9ub3JtX2NlbGxfc2NhbGUgPSBjZWxsX2xheWVyX25vcm1fY29lZmZpY2llbnRzLT5wYXJhbXMuc2NhbGU7Ci0gICAgbGF5ZXJfbm9ybV9vdXRwdXRfc2NhbGUgPSBvdXRwdXRfbGF5ZXJfbm9ybV9jb2VmZmljaWVudHMtPnBhcmFtcy5zY2FsZTsKLSAgfQotCi0gIGlmICh1c2VfcHJvamVjdGlvbikgewotICAgIHByb2plY3Rpb25fd2VpZ2h0X3NjYWxlID0gcHJvamVjdGlvbl93ZWlnaHRzLT5wYXJhbXMuc2NhbGU7Ci0gIH0KLSAgb3V0cHV0X3N0YXRlX3NjYWxlID0gb3V0cHV0X3N0YXRlLT5wYXJhbXMuc2NhbGU7Ci0KLSAgaW5wdXRfdG9fZm9yZ2V0X3dlaWdodF9zY2FsZSA9IGlucHV0X3RvX2ZvcmdldF93ZWlnaHRzLT5wYXJhbXMuc2NhbGU7Ci0gIGlucHV0X3RvX2NlbGxfd2VpZ2h0X3NjYWxlID0gaW5wdXRfdG9fY2VsbF93ZWlnaHRzLT5wYXJhbXMuc2NhbGU7Ci0gIGlucHV0X3RvX291dHB1dF93ZWlnaHRfc2NhbGUgPSBpbnB1dF90b19vdXRwdXRfd2VpZ2h0cy0+cGFyYW1zLnNjYWxlOwotICByZWN1cnJlbnRfdG9fZm9yZ2V0X3dlaWdodF9zY2FsZSA9IHJlY3VycmVudF90b19mb3JnZXRfd2VpZ2h0cy0+cGFyYW1zLnNjYWxlOwotICByZWN1cnJlbnRfdG9fY2VsbF93ZWlnaHRfc2NhbGUgPSByZWN1cnJlbnRfdG9fY2VsbF93ZWlnaHRzLT5wYXJhbXMuc2NhbGU7Ci0gIHJlY3VycmVudF90b19vdXRwdXRfd2VpZ2h0X3NjYWxlID0gcmVjdXJyZW50X3RvX291dHB1dF93ZWlnaHRzLT5wYXJhbXMuc2NhbGU7Ci0KLSAgLy8gQ2hlY2sgY2VsbCBzdGF0ZSAoYWxyZWFkeSB1c2VkIGFib3ZlKQotICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCBDaGVja2VkTG9nMihjZWxsX3N0YXRlLT5wYXJhbXMuc2NhbGUsICZjZWxsX3NjYWxlKSk7Ci0gIC8vIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIGNlbGxfc2NhbGUgPD0gLTkpOwotICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmNlbGxfc2NhbGUgPSBjZWxsX3NjYWxlOwotICBpbnB1dF9zY2FsZSA9IGlucHV0LT5wYXJhbXMuc2NhbGU7Ci0KLSAgLy8gQ2FsY3VsYXRlIGVmZmVjdGl2ZSBzY2FsZXMuCi0gIGlmICghdXNlX2NpZmcpIHsKLSAgICBlZmZlY3RpdmVfaW5wdXRfdG9faW5wdXRfc2NhbGUgPQotICAgICAgICBpbnB1dF90b19pbnB1dF93ZWlnaHRfc2NhbGUgKiBpbnB1dF9zY2FsZSAvIGludGVybWVkaWF0ZV9zY2FsZVswXTsKLSAgICBlZmZlY3RpdmVfcmVjdXJyZW50X3RvX2lucHV0X3NjYWxlID0gcmVjdXJyZW50X3RvX2lucHV0X3dlaWdodF9zY2FsZSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9zdGF0ZV9zY2FsZSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybWVkaWF0ZV9zY2FsZVswXTsKLSAgfQotICBlZmZlY3RpdmVfaW5wdXRfdG9fZm9yZ2V0X3NjYWxlID0KLSAgICAgIGlucHV0X3RvX2ZvcmdldF93ZWlnaHRfc2NhbGUgKiBpbnB1dF9zY2FsZSAvIGludGVybWVkaWF0ZV9zY2FsZVsxXTsKLSAgZWZmZWN0aXZlX3JlY3VycmVudF90b19mb3JnZXRfc2NhbGUgPSByZWN1cnJlbnRfdG9fZm9yZ2V0X3dlaWdodF9zY2FsZSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3N0YXRlX3NjYWxlIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm1lZGlhdGVfc2NhbGVbMV07Ci0KLSAgZWZmZWN0aXZlX2lucHV0X3RvX2NlbGxfc2NhbGUgPQotICAgICAgaW5wdXRfdG9fY2VsbF93ZWlnaHRfc2NhbGUgKiBpbnB1dF9zY2FsZSAvIGludGVybWVkaWF0ZV9zY2FsZVsyXTsKLSAgZWZmZWN0aXZlX3JlY3VycmVudF90b19jZWxsX3NjYWxlID0gcmVjdXJyZW50X3RvX2NlbGxfd2VpZ2h0X3NjYWxlICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X3N0YXRlX3NjYWxlIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlX3NjYWxlWzJdOwotCi0gIGVmZmVjdGl2ZV9pbnB1dF90b19vdXRwdXRfc2NhbGUgPQotICAgICAgaW5wdXRfdG9fb3V0cHV0X3dlaWdodF9zY2FsZSAqIGlucHV0X3NjYWxlIC8gaW50ZXJtZWRpYXRlX3NjYWxlWzNdOwotICBlZmZlY3RpdmVfcmVjdXJyZW50X3RvX291dHB1dF9zY2FsZSA9IHJlY3VycmVudF90b19vdXRwdXRfd2VpZ2h0X3NjYWxlICoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfc3RhdGVfc2NhbGUgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybWVkaWF0ZV9zY2FsZVszXTsKLQotICBlZmZlY3RpdmVfaGlkZGVuX3NjYWxlID0gc3RkOjpwb3coKGZsb2F0KTIsIChmbG9hdCktMTUpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybWVkaWF0ZV9zY2FsZVs0XSAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBvdygoZmxvYXQpMiwgKGZsb2F0KS0xNSk7Ci0KLSAgZWZmZWN0aXZlX3Byb2pfc2NhbGUgPQotICAgICAgcHJvamVjdGlvbl93ZWlnaHRfc2NhbGUgKiBpbnRlcm1lZGlhdGVfc2NhbGVbNF0gLyBvdXRwdXRfc3RhdGVfc2NhbGU7Ci0KLSAgaWYgKHVzZV9wZWVwaG9sZSkgewotICAgIGlmICghdXNlX2NpZmcpIHsKLSAgICAgIGVmZmVjdGl2ZV9jZWxsX3RvX2lucHV0X3NjYWxlID0KLSAgICAgICAgICBzdGQ6OnBvdygoZmxvYXQpKDIpLCAoZmxvYXQpY2VsbF9zY2FsZSkgKiAgLy8gTk9MSU5UCi0gICAgICAgICAgKGZsb2F0KShjZWxsX3RvX2lucHV0X3dlaWdodF9zY2FsZSkgLyBpbnRlcm1lZGlhdGVfc2NhbGVbMF07Ci0gICAgfQotICAgIGVmZmVjdGl2ZV9jZWxsX3RvX2ZvcmdldF9zY2FsZSA9Ci0gICAgICAgIHN0ZDo6cG93KChmbG9hdCkyLCAoZmxvYXQpY2VsbF9zY2FsZSkgKiAgLy8gTk9MSU5UCi0gICAgICAgIChmbG9hdCljZWxsX3RvX2ZvcmdldF93ZWlnaHRfc2NhbGUgLyBpbnRlcm1lZGlhdGVfc2NhbGVbMV07Ci0gICAgZWZmZWN0aXZlX2NlbGxfdG9fb3V0cHV0X3NjYWxlID0KLSAgICAgICAgc3RkOjpwb3coKGZsb2F0KTIsIChmbG9hdCljZWxsX3NjYWxlKSAqICAvLyBOT0xJTlQKLSAgICAgICAgKGZsb2F0KWNlbGxfdG9fb3V0cHV0X3dlaWdodF9zY2FsZSAvIGludGVybWVkaWF0ZV9zY2FsZVszXTsKLSAgfQotCi0gIC8vIERlY29tcG9zZSBzY2FsZXMuCi0gIFF1YW50aXplTXVsdGlwbGllcihzdGF0aWNfY2FzdDxkb3VibGU+KGVmZmVjdGl2ZV9pbnB1dF90b19pbnB1dF9zY2FsZSksCi0gICAgICAgICAgICAgICAgICAgICAmaW50ZWdlcl9sc3RtX3BhcmFtLT5lZmZlY3RpdmVfaW5wdXRfdG9faW5wdXRfc2NhbGVfYSwKLSAgICAgICAgICAgICAgICAgICAgICZpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9pbnB1dF90b19pbnB1dF9zY2FsZV9iKTsKLSAgUXVhbnRpemVNdWx0aXBsaWVyKHN0YXRpY19jYXN0PGRvdWJsZT4oZWZmZWN0aXZlX3JlY3VycmVudF90b19pbnB1dF9zY2FsZSksCi0gICAgICAgICAgICAgICAgICAgICAmaW50ZWdlcl9sc3RtX3BhcmFtLT5lZmZlY3RpdmVfcmVjdXJyZW50X3RvX2lucHV0X3NjYWxlX2EsCi0gICAgICAgICAgICAgICAgICAgICAmaW50ZWdlcl9sc3RtX3BhcmFtLT5lZmZlY3RpdmVfcmVjdXJyZW50X3RvX2lucHV0X3NjYWxlX2IpOwotICBRdWFudGl6ZU11bHRpcGxpZXIoc3RhdGljX2Nhc3Q8ZG91YmxlPihlZmZlY3RpdmVfY2VsbF90b19pbnB1dF9zY2FsZSksCi0gICAgICAgICAgICAgICAgICAgICAmaW50ZWdlcl9sc3RtX3BhcmFtLT5lZmZlY3RpdmVfY2VsbF90b19pbnB1dF9zY2FsZV9hLAotICAgICAgICAgICAgICAgICAgICAgJmludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX2NlbGxfdG9faW5wdXRfc2NhbGVfYik7Ci0gIFF1YW50aXplTXVsdGlwbGllcihzdGF0aWNfY2FzdDxkb3VibGU+KGVmZmVjdGl2ZV9pbnB1dF90b19mb3JnZXRfc2NhbGUpLAotICAgICAgICAgICAgICAgICAgICAgJmludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX2lucHV0X3RvX2ZvcmdldF9zY2FsZV9hLAotICAgICAgICAgICAgICAgICAgICAgJmludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX2lucHV0X3RvX2ZvcmdldF9zY2FsZV9iKTsKLSAgUXVhbnRpemVNdWx0aXBsaWVyKAotICAgICAgc3RhdGljX2Nhc3Q8ZG91YmxlPihlZmZlY3RpdmVfcmVjdXJyZW50X3RvX2ZvcmdldF9zY2FsZSksCi0gICAgICAmaW50ZWdlcl9sc3RtX3BhcmFtLT5lZmZlY3RpdmVfcmVjdXJyZW50X3RvX2ZvcmdldF9zY2FsZV9hLAotICAgICAgJmludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX3JlY3VycmVudF90b19mb3JnZXRfc2NhbGVfYik7Ci0gIFF1YW50aXplTXVsdGlwbGllcihzdGF0aWNfY2FzdDxkb3VibGU+KGVmZmVjdGl2ZV9jZWxsX3RvX2ZvcmdldF9zY2FsZSksCi0gICAgICAgICAgICAgICAgICAgICAmaW50ZWdlcl9sc3RtX3BhcmFtLT5lZmZlY3RpdmVfY2VsbF90b19mb3JnZXRfc2NhbGVfYSwKLSAgICAgICAgICAgICAgICAgICAgICZpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9jZWxsX3RvX2ZvcmdldF9zY2FsZV9iKTsKLSAgUXVhbnRpemVNdWx0aXBsaWVyKHN0YXRpY19jYXN0PGRvdWJsZT4oZWZmZWN0aXZlX2lucHV0X3RvX2NlbGxfc2NhbGUpLAotICAgICAgICAgICAgICAgICAgICAgJmludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX2lucHV0X3RvX2NlbGxfc2NhbGVfYSwKLSAgICAgICAgICAgICAgICAgICAgICZpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9pbnB1dF90b19jZWxsX3NjYWxlX2IpOwotICBRdWFudGl6ZU11bHRpcGxpZXIoc3RhdGljX2Nhc3Q8ZG91YmxlPihlZmZlY3RpdmVfcmVjdXJyZW50X3RvX2NlbGxfc2NhbGUpLAotICAgICAgICAgICAgICAgICAgICAgJmludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX3JlY3VycmVudF90b19jZWxsX3NjYWxlX2EsCi0gICAgICAgICAgICAgICAgICAgICAmaW50ZWdlcl9sc3RtX3BhcmFtLT5lZmZlY3RpdmVfcmVjdXJyZW50X3RvX2NlbGxfc2NhbGVfYik7Ci0gIFF1YW50aXplTXVsdGlwbGllcihzdGF0aWNfY2FzdDxkb3VibGU+KGVmZmVjdGl2ZV9pbnB1dF90b19vdXRwdXRfc2NhbGUpLAotICAgICAgICAgICAgICAgICAgICAgJmludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX2lucHV0X3RvX291dHB1dF9zY2FsZV9hLAotICAgICAgICAgICAgICAgICAgICAgJmludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX2lucHV0X3RvX291dHB1dF9zY2FsZV9iKTsKLSAgUXVhbnRpemVNdWx0aXBsaWVyKAotICAgICAgc3RhdGljX2Nhc3Q8ZG91YmxlPihlZmZlY3RpdmVfcmVjdXJyZW50X3RvX291dHB1dF9zY2FsZSksCi0gICAgICAmaW50ZWdlcl9sc3RtX3BhcmFtLT5lZmZlY3RpdmVfcmVjdXJyZW50X3RvX291dHB1dF9zY2FsZV9hLAotICAgICAgJmludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX3JlY3VycmVudF90b19vdXRwdXRfc2NhbGVfYik7Ci0gIFF1YW50aXplTXVsdGlwbGllcihzdGF0aWNfY2FzdDxkb3VibGU+KGVmZmVjdGl2ZV9jZWxsX3RvX291dHB1dF9zY2FsZSksCi0gICAgICAgICAgICAgICAgICAgICAmaW50ZWdlcl9sc3RtX3BhcmFtLT5lZmZlY3RpdmVfY2VsbF90b19vdXRwdXRfc2NhbGVfYSwKLSAgICAgICAgICAgICAgICAgICAgICZpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9jZWxsX3RvX291dHB1dF9zY2FsZV9iKTsKLSAgUXVhbnRpemVNdWx0aXBsaWVyKHN0YXRpY19jYXN0PGRvdWJsZT4oZWZmZWN0aXZlX3Byb2pfc2NhbGUpLAotICAgICAgICAgICAgICAgICAgICAgJmludGVnZXJfbHN0bV9wYXJhbS0+ZWZmZWN0aXZlX3Byb2pfc2NhbGVfYSwKLSAgICAgICAgICAgICAgICAgICAgICZpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9wcm9qX3NjYWxlX2IpOwotICBRdWFudGl6ZU11bHRpcGxpZXIoc3RhdGljX2Nhc3Q8ZG91YmxlPihlZmZlY3RpdmVfaGlkZGVuX3NjYWxlKSwKLSAgICAgICAgICAgICAgICAgICAgICZpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9oaWRkZW5fc2NhbGVfYSwKLSAgICAgICAgICAgICAgICAgICAgICZpbnRlZ2VyX2xzdG1fcGFyYW0tPmVmZmVjdGl2ZV9oaWRkZW5fc2NhbGVfYik7Ci0gIFF1YW50aXplTXVsdGlwbGllcihzdGF0aWNfY2FzdDxkb3VibGU+KGxheWVyX25vcm1faW5wdXRfc2NhbGUpLAotICAgICAgICAgICAgICAgICAgICAgJmludGVnZXJfbHN0bV9wYXJhbS0+bGF5ZXJfbm9ybV9pbnB1dF9zY2FsZV9hLAotICAgICAgICAgICAgICAgICAgICAgJmludGVnZXJfbHN0bV9wYXJhbS0+bGF5ZXJfbm9ybV9pbnB1dF9zY2FsZV9iKTsKLSAgUXVhbnRpemVNdWx0aXBsaWVyKHN0YXRpY19jYXN0PGRvdWJsZT4obGF5ZXJfbm9ybV9mb3JnZXRfc2NhbGUpLAotICAgICAgICAgICAgICAgICAgICAgJmludGVnZXJfbHN0bV9wYXJhbS0+bGF5ZXJfbm9ybV9mb3JnZXRfc2NhbGVfYSwKLSAgICAgICAgICAgICAgICAgICAgICZpbnRlZ2VyX2xzdG1fcGFyYW0tPmxheWVyX25vcm1fZm9yZ2V0X3NjYWxlX2IpOwotICBRdWFudGl6ZU11bHRpcGxpZXIoc3RhdGljX2Nhc3Q8ZG91YmxlPihsYXllcl9ub3JtX2NlbGxfc2NhbGUpLAotICAgICAgICAgICAgICAgICAgICAgJmludGVnZXJfbHN0bV9wYXJhbS0+bGF5ZXJfbm9ybV9jZWxsX3NjYWxlX2EsCi0gICAgICAgICAgICAgICAgICAgICAmaW50ZWdlcl9sc3RtX3BhcmFtLT5sYXllcl9ub3JtX2NlbGxfc2NhbGVfYik7Ci0gIFF1YW50aXplTXVsdGlwbGllcihzdGF0aWNfY2FzdDxkb3VibGU+KGxheWVyX25vcm1fb3V0cHV0X3NjYWxlKSwKLSAgICAgICAgICAgICAgICAgICAgICZpbnRlZ2VyX2xzdG1fcGFyYW0tPmxheWVyX25vcm1fb3V0cHV0X3NjYWxlX2EsCi0gICAgICAgICAgICAgICAgICAgICAmaW50ZWdlcl9sc3RtX3BhcmFtLT5sYXllcl9ub3JtX291dHB1dF9zY2FsZV9iKTsKLQotICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmhpZGRlbl96cCA9IGludGVybWVkaWF0ZV96cFs0XTsKLQotICAvLyAxMDAwMCBpcyB1c2VkIHRvIG1ha2Ugc3VyZSB0aGUga2VybmVsIGxvZ2ljIGRvZXMgbm90IG92ZXJmbG93LgotICBpZiAoIXVzZV9jaWZnKSB7Ci0gICAgaW50ZWdlcl9sc3RtX3BhcmFtLT5pbnB1dF92YXJpYW5jZV9ndWFyZCA9Ci0gICAgICAgIHN0ZDo6bWF4KHN0YXRpY19jYXN0PGludDMyX3Q+KDEpLAotICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PigxMDAwMCAqIGxheWVyX25vcm1faW5wdXRfc2NhbGUpKTsKLSAgfQotICBpbnRlZ2VyX2xzdG1fcGFyYW0tPmZvcmdldF92YXJpYW5jZV9ndWFyZCA9Ci0gICAgICBzdGQ6Om1heChzdGF0aWNfY2FzdDxpbnQzMl90PigxKSwKLSAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KDEwMDAwICogbGF5ZXJfbm9ybV9mb3JnZXRfc2NhbGUpKTsKLSAgaW50ZWdlcl9sc3RtX3BhcmFtLT5jZWxsX3ZhcmlhbmNlX2d1YXJkID0KLSAgICAgIHN0ZDo6bWF4KHN0YXRpY19jYXN0PGludDMyX3Q+KDEpLAotICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oMTAwMDAgKiBsYXllcl9ub3JtX2NlbGxfc2NhbGUpKTsKLSAgaW50ZWdlcl9sc3RtX3BhcmFtLT5vdXRwdXRfdmFyaWFuY2VfZ3VhcmQgPQotICAgICAgc3RkOjptYXgoc3RhdGljX2Nhc3Q8aW50MzJfdD4oMSksCi0gICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PigxMDAwMCAqIGxheWVyX25vcm1fb3V0cHV0X3NjYWxlKSk7Ci0KICAgcmV0dXJuIGtUZkxpdGVPazsKIH0KIAogfSAgLy8gbmFtZXNwYWNlCiAKLS8vIFRlbXBvcmFyeSB0ZW5zb3JzCi1lbnVtIFRlbXBvcmFyeVRlbnNvciB7Ci0gIGtTY3JhdGNoQnVmZmVyID0gMCwKLSAga0lucHV0UXVhbnRpemVkID0gMSwKLSAga091dHB1dFN0YXRlUXVhbnRpemVkID0gMiwKLSAga0NlbGxTdGF0ZVF1YW50aXplZCA9IDMsCi0gIGtJbnB1dFNjYWxpbmdGYWN0b3JzID0gNCwKLSAga091dHB1dFN0YXRlU2NhbGluZ0ZhY3RvcnMgPSA1LAotICBrUHJvZHVjdFNjYWxpbmdGYWN0b3JzID0gNiwKLSAga1JlY292ZXJlZENlbGxXZWlnaHRzID0gNywKLSAga0FjY3VtU2NyYXRjaCA9IDgsCi0gIGtJbnB1dFplcm9Qb2ludHMgPSA5LAotICBrT3V0cHV0U3RhdGVaZXJvUG9pbnRzID0gMTAsCi0gIGtSb3dTdW1zID0gMTEsCi0gIGtOdW1UZW1wb3JhcnlUZW5zb3JzID0gMTIsCi19OwotCi12b2lkKiBJbml0KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCkgewotICBPcERhdGEqIG9wX2RhdGEgPSByZWludGVycHJldF9jYXN0PE9wRGF0YSo+KAotICAgICAgY29udGV4dC0+QWxsb2NhdGVQZXJzaXN0ZW50QnVmZmVyKGNvbnRleHQsIHNpemVvZihPcERhdGEpKSk7Ci0KLSAgcmV0dXJuIG9wX2RhdGE7Ci19Ci0KLS8vIENoZWNrIHRoYXQgaW5wdXQgdGVuc29yIGRpbWVuc2lvbnMgbWF0Y2hlcyB3aXRoIGVhY2ggb3RoZXIuCi1UZkxpdGVTdGF0dXMgQ2hlY2tJbnB1dFRlbnNvckRpbWVuc2lvbnMoVGZMaXRlQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZkxpdGVOb2RlKiBub2RlLCBpbnQgbl9pbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbl9vdXRwdXQsIGludCBuX2NlbGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfbGF5ZXJfbm9ybSwgYm9vbCBpc19pbnRlZ2VyKSB7Ci0gIGNvbnN0IGF1dG8qIHBhcmFtcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8VGZMaXRlTFNUTVBhcmFtcyo+KG5vZGUtPmJ1aWx0aW5fZGF0YSk7Ci0KLSAgLy8gTWFraW5nIHN1cmUgY2xpcHBpbmcgcGFyYW1ldGVycyBoYXZlIHZhbGlkIHZhbHVlcy4KLSAgLy8gPT0gMCBtZWFucyBubyBjbGlwcGluZwotICAvLyAgPiAwIG1lYW5zIGNsaXBwaW5nCi0gIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIHBhcmFtcy0+Y2VsbF9jbGlwID49IDApOwotICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCBwYXJhbXMtPnByb2pfY2xpcCA+PSAwKTsKLSAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXRfdG9faW5wdXRfd2VpZ2h0cyA9IHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dCgKLSAgICAgIGNvbnRleHQsIG5vZGUsIG1pY3JvOjpsc3RtOjpmdWxsOjprSW5wdXRUb0lucHV0V2VpZ2h0c1RlbnNvcik7Ci0gIGlmIChpbnB1dF90b19pbnB1dF93ZWlnaHRzICE9IG51bGxwdHIpIHsKLSAgICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBpbnB1dF90b19pbnB1dF93ZWlnaHRzLT5kaW1zLT5zaXplLCAyKTsKLSAgICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBpbnB1dF90b19pbnB1dF93ZWlnaHRzLT5kaW1zLT5kYXRhWzBdLCBuX2NlbGwpOwotICAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIGlucHV0X3RvX2lucHV0X3dlaWdodHMtPmRpbXMtPmRhdGFbMV0sIG5faW5wdXQpOwotICB9Ci0gIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0X3RvX2ZvcmdldF93ZWlnaHRzID0gdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KAotICAgICAgY29udGV4dCwgbm9kZSwgbWljcm86OmxzdG06OmZ1bGw6OmtJbnB1dFRvRm9yZ2V0V2VpZ2h0c1RlbnNvcik7Ci0KLSAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgaW5wdXRfdG9fZm9yZ2V0X3dlaWdodHMtPmRpbXMtPnNpemUsIDIpOwotICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBpbnB1dF90b19mb3JnZXRfd2VpZ2h0cy0+ZGltcy0+ZGF0YVswXSwgbl9jZWxsKTsKLSAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgaW5wdXRfdG9fZm9yZ2V0X3dlaWdodHMtPmRpbXMtPmRhdGFbMV0sIG5faW5wdXQpOwotICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dF90b19jZWxsX3dlaWdodHMgPSB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsSW5wdXQoCi0gICAgICBjb250ZXh0LCBub2RlLCBtaWNybzo6bHN0bTo6ZnVsbDo6a0lucHV0VG9DZWxsV2VpZ2h0c1RlbnNvcik7Ci0KLSAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgaW5wdXRfdG9fY2VsbF93ZWlnaHRzLT5kaW1zLT5zaXplLCAyKTsKLSAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgaW5wdXRfdG9fY2VsbF93ZWlnaHRzLT5kaW1zLT5kYXRhWzBdLCBuX2NlbGwpOwotICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBpbnB1dF90b19jZWxsX3dlaWdodHMtPmRpbXMtPmRhdGFbMV0sIG5faW5wdXQpOwotICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiByZWN1cnJlbnRfdG9faW5wdXRfd2VpZ2h0cyA9Ci0gICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsSW5wdXQoCi0gICAgICAgICAgY29udGV4dCwgbm9kZSwgbWljcm86OmxzdG06OmZ1bGw6OmtSZWN1cnJlbnRUb0lucHV0V2VpZ2h0c1RlbnNvcik7Ci0gIGlmIChyZWN1cnJlbnRfdG9faW5wdXRfd2VpZ2h0cyAhPSBudWxscHRyKSB7Ci0gICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgcmVjdXJyZW50X3RvX2lucHV0X3dlaWdodHMtPmRpbXMtPnNpemUsIDIpOwotICAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIHJlY3VycmVudF90b19pbnB1dF93ZWlnaHRzLT5kaW1zLT5kYXRhWzBdLAotICAgICAgICAgICAgICAgICAgICAgIG5fY2VsbCk7Ci0gICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgcmVjdXJyZW50X3RvX2lucHV0X3dlaWdodHMtPmRpbXMtPmRhdGFbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgbl9vdXRwdXQpOwotICB9Ci0gIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIHJlY3VycmVudF90b19mb3JnZXRfd2VpZ2h0cyA9Ci0gICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsSW5wdXQoCi0gICAgICAgICAgY29udGV4dCwgbm9kZSwgbWljcm86OmxzdG06OmZ1bGw6OmtSZWN1cnJlbnRUb0ZvcmdldFdlaWdodHNUZW5zb3IpOwotCi0gIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIHJlY3VycmVudF90b19mb3JnZXRfd2VpZ2h0cy0+ZGltcy0+c2l6ZSwgMik7Ci0gIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIHJlY3VycmVudF90b19mb3JnZXRfd2VpZ2h0cy0+ZGltcy0+ZGF0YVswXSwKLSAgICAgICAgICAgICAgICAgICAgbl9jZWxsKTsKLSAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgcmVjdXJyZW50X3RvX2ZvcmdldF93ZWlnaHRzLT5kaW1zLT5kYXRhWzFdLAotICAgICAgICAgICAgICAgICAgICBuX291dHB1dCk7Ci0gIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIHJlY3VycmVudF90b19jZWxsX3dlaWdodHMgPQotICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KAotICAgICAgICAgIGNvbnRleHQsIG5vZGUsIG1pY3JvOjpsc3RtOjpmdWxsOjprUmVjdXJyZW50VG9DZWxsV2VpZ2h0c1RlbnNvcik7Ci0KLSAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgcmVjdXJyZW50X3RvX2NlbGxfd2VpZ2h0cy0+ZGltcy0+c2l6ZSwgMik7Ci0gIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIHJlY3VycmVudF90b19jZWxsX3dlaWdodHMtPmRpbXMtPmRhdGFbMF0sIG5fY2VsbCk7Ci0gIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIHJlY3VycmVudF90b19jZWxsX3dlaWdodHMtPmRpbXMtPmRhdGFbMV0sCi0gICAgICAgICAgICAgICAgICAgIG5fb3V0cHV0KTsKLQotICAvLyBXZSBtYWtlIHN1cmUgdGhlIGlucHV0LWdhdGUncyBwYXJhbWV0ZXJzIGFyZSBlaXRoZXIgYm90aCBwcmVzZW50IChyZWd1bGFyCi0gIC8vIExTVE0pIG9yIG5vdCBhdCBhbGwgKENJRkctTFNUTSkuCi0gIGNvbnN0IGJvb2wgY2lmZ193ZWlnaHRzX2FsbF9vcl9ub25lID0KLSAgICAgICgoaW5wdXRfdG9faW5wdXRfd2VpZ2h0cyAhPSBudWxscHRyKSAmJgotICAgICAgIChyZWN1cnJlbnRfdG9faW5wdXRfd2VpZ2h0cyAhPSBudWxscHRyKSkgfHwKLSAgICAgICgoaW5wdXRfdG9faW5wdXRfd2VpZ2h0cyA9PSBudWxscHRyKSAmJgotICAgICAgIChyZWN1cnJlbnRfdG9faW5wdXRfd2VpZ2h0cyA9PSBudWxscHRyKSk7Ci0gIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIGNpZmdfd2VpZ2h0c19hbGxfb3Jfbm9uZSA9PSB0cnVlKTsKLQotICBjb25zdCBUZkxpdGVUZW5zb3IqIGNlbGxfdG9faW5wdXRfd2VpZ2h0cyA9IEdldE9wdGlvbmFsSW5wdXRUZW5zb3IoCi0gICAgICBjb250ZXh0LCBub2RlLCBtaWNybzo6bHN0bTo6ZnVsbDo6a0NlbGxUb0lucHV0V2VpZ2h0c1RlbnNvcik7Ci0gIGlmIChjZWxsX3RvX2lucHV0X3dlaWdodHMgIT0gbnVsbHB0cikgewotICAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIGNlbGxfdG9faW5wdXRfd2VpZ2h0cy0+ZGltcy0+c2l6ZSwgMSk7Ci0gICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgY2VsbF90b19pbnB1dF93ZWlnaHRzLT5kaW1zLT5kYXRhWzBdLCBuX2NlbGwpOwotICAgIFRGX0xJVEVfRU5TVVJFX1RZUEVTX0VRKAotICAgICAgICBjb250ZXh0LCBjZWxsX3RvX2lucHV0X3dlaWdodHMtPnR5cGUsCi0gICAgICAgIGlzX2ludGVnZXIgPyBrVGZMaXRlSW50MTYgOiBpbnB1dF90b19mb3JnZXRfd2VpZ2h0cy0+dHlwZSk7Ci0gIH0KLQotICBjb25zdCBUZkxpdGVUZW5zb3IqIGNlbGxfdG9fZm9yZ2V0X3dlaWdodHMgPSBHZXRPcHRpb25hbElucHV0VGVuc29yKAotICAgICAgY29udGV4dCwgbm9kZSwgbHN0bTo6ZnVsbDo6a0NlbGxUb0ZvcmdldFdlaWdodHNUZW5zb3IpOwotICBpZiAoY2VsbF90b19mb3JnZXRfd2VpZ2h0cyAhPSBudWxscHRyKSB7Ci0gICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgY2VsbF90b19mb3JnZXRfd2VpZ2h0cy0+ZGltcy0+c2l6ZSwgMSk7Ci0gICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgY2VsbF90b19mb3JnZXRfd2VpZ2h0cy0+ZGltcy0+ZGF0YVswXSwgbl9jZWxsKTsKLSAgICBURl9MSVRFX0VOU1VSRV9UWVBFU19FUSgKLSAgICAgICAgY29udGV4dCwgY2VsbF90b19mb3JnZXRfd2VpZ2h0cy0+dHlwZSwKLSAgICAgICAgaXNfaW50ZWdlciA/IGtUZkxpdGVJbnQxNiA6IGlucHV0X3RvX2ZvcmdldF93ZWlnaHRzLT50eXBlKTsKLSAgfQotCi0gIGNvbnN0IFRmTGl0ZVRlbnNvciogY2VsbF90b19vdXRwdXRfd2VpZ2h0cyA9IEdldE9wdGlvbmFsSW5wdXRUZW5zb3IoCi0gICAgICBjb250ZXh0LCBub2RlLCBtaWNybzo6bHN0bTo6ZnVsbDo6a0NlbGxUb091dHB1dFdlaWdodHNUZW5zb3IpOwotICBpZiAoY2VsbF90b19vdXRwdXRfd2VpZ2h0cyAhPSBudWxscHRyKSB7Ci0gICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgY2VsbF90b19vdXRwdXRfd2VpZ2h0cy0+ZGltcy0+c2l6ZSwgMSk7Ci0gICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgY2VsbF90b19vdXRwdXRfd2VpZ2h0cy0+ZGltcy0+ZGF0YVswXSwgbl9jZWxsKTsKLSAgICBURl9MSVRFX0VOU1VSRV9UWVBFU19FUSgKLSAgICAgICAgY29udGV4dCwgY2VsbF90b19vdXRwdXRfd2VpZ2h0cy0+dHlwZSwKLSAgICAgICAgaXNfaW50ZWdlciA/IGtUZkxpdGVJbnQxNiA6IGlucHV0X3RvX2ZvcmdldF93ZWlnaHRzLT50eXBlKTsKLSAgfQotCi0gIC8vIE1ha2luZyBzdXJlIHRoZSBwZWVwaG9sZSB3ZWlnaHRzIGFyZSB0aGVyZSBhbGwgb3Igbm9uZS4KLSAgY29uc3QgYm9vbCB1c2VfY2lmZyA9IChpbnB1dF90b19pbnB1dF93ZWlnaHRzID09IG51bGxwdHIpOwotICBjb25zdCBib29sIHBlZXBob2xlX3dlaWdodHNfYWxsX29yX25vbmUgPQotICAgICAgKChjZWxsX3RvX2lucHV0X3dlaWdodHMgIT0gbnVsbHB0ciB8fCB1c2VfY2lmZykgJiYKLSAgICAgICAoY2VsbF90b19mb3JnZXRfd2VpZ2h0cyAhPSBudWxscHRyKSAmJgotICAgICAgIChjZWxsX3RvX291dHB1dF93ZWlnaHRzICE9IG51bGxwdHIpKSB8fAotICAgICAgKChjZWxsX3RvX2lucHV0X3dlaWdodHMgPT0gbnVsbHB0cikgJiYKLSAgICAgICAoY2VsbF90b19mb3JnZXRfd2VpZ2h0cyA9PSBudWxscHRyKSAmJgotICAgICAgIChjZWxsX3RvX291dHB1dF93ZWlnaHRzID09IG51bGxwdHIpKTsKLSAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgcGVlcGhvbGVfd2VpZ2h0c19hbGxfb3Jfbm9uZSA9PSB0cnVlKTsKLSAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXRfZ2F0ZV9iaWFzID0gdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KAotICAgICAgY29udGV4dCwgbm9kZSwgbWljcm86OmxzdG06OmZ1bGw6OmtJbnB1dEdhdGVCaWFzVGVuc29yKTsKLQotICBpZiAodXNlX2NpZmcpIHsKLSAgICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBpbnB1dF9nYXRlX2JpYXMsIG51bGxwdHIpOwotICB9IGVsc2UgewotICAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIGlucHV0X2dhdGVfYmlhcy0+ZGltcy0+c2l6ZSwgMSk7Ci0gICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgaW5wdXRfZ2F0ZV9iaWFzLT5kaW1zLT5kYXRhWzBdLCBuX2NlbGwpOwotICAgIGlmIChpc19pbnRlZ2VyKSB7Ci0gICAgICBURl9MSVRFX0VOU1VSRV9UWVBFU19FUShjb250ZXh0LCBpbnB1dF9nYXRlX2JpYXMtPnR5cGUsIGtUZkxpdGVJbnQzMik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFRGX0xJVEVfRU5TVVJFX1RZUEVTX0VRKGNvbnRleHQsIGlucHV0X2dhdGVfYmlhcy0+dHlwZSwga1RmTGl0ZUZsb2F0MzIpOwotICAgIH0KLSAgfQotICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBmb3JnZXRfZ2F0ZV9iaWFzID0gdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KAotICAgICAgY29udGV4dCwgbm9kZSwgbWljcm86OmxzdG06OmZ1bGw6OmtGb3JnZXRHYXRlQmlhc1RlbnNvcik7Ci0KLSAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgZm9yZ2V0X2dhdGVfYmlhcy0+ZGltcy0+c2l6ZSwgMSk7Ci0gIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIGZvcmdldF9nYXRlX2JpYXMtPmRpbXMtPmRhdGFbMF0sIG5fY2VsbCk7Ci0gIGlmIChpc19pbnRlZ2VyKSB7Ci0gICAgVEZfTElURV9FTlNVUkVfVFlQRVNfRVEoY29udGV4dCwgZm9yZ2V0X2dhdGVfYmlhcy0+dHlwZSwga1RmTGl0ZUludDMyKTsKLSAgfSBlbHNlIHsKLSAgICBURl9MSVRFX0VOU1VSRV9UWVBFU19FUShjb250ZXh0LCBmb3JnZXRfZ2F0ZV9iaWFzLT50eXBlLCBrVGZMaXRlRmxvYXQzMik7Ci0gIH0KLSAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogY2VsbF9nYXRlX2JpYXMgPSB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsSW5wdXQoCi0gICAgICBjb250ZXh0LCBub2RlLCBtaWNybzo6bHN0bTo6ZnVsbDo6a0NlbGxHYXRlQmlhc1RlbnNvcik7Ci0KLSAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgY2VsbF9nYXRlX2JpYXMtPmRpbXMtPnNpemUsIDEpOwotICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBjZWxsX2dhdGVfYmlhcy0+ZGltcy0+ZGF0YVswXSwgbl9jZWxsKTsKLSAgaWYgKGlzX2ludGVnZXIpIHsKLSAgICBURl9MSVRFX0VOU1VSRV9UWVBFU19FUShjb250ZXh0LCBjZWxsX2dhdGVfYmlhcy0+dHlwZSwga1RmTGl0ZUludDMyKTsKLSAgfSBlbHNlIHsKLSAgICBURl9MSVRFX0VOU1VSRV9UWVBFU19FUShjb250ZXh0LCBjZWxsX2dhdGVfYmlhcy0+dHlwZSwga1RmTGl0ZUZsb2F0MzIpOwotICB9Ci0gIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dF9nYXRlX2JpYXMgPSB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsSW5wdXQoCi0gICAgICBjb250ZXh0LCBub2RlLCBtaWNybzo6bHN0bTo6ZnVsbDo6a091dHB1dEdhdGVCaWFzVGVuc29yKTsKLSAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgb3V0cHV0X2dhdGVfYmlhcy0+ZGltcy0+c2l6ZSwgMSk7Ci0gIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIG91dHB1dF9nYXRlX2JpYXMtPmRpbXMtPmRhdGFbMF0sIG5fY2VsbCk7Ci0gIGlmIChpc19pbnRlZ2VyKSB7Ci0gICAgVEZfTElURV9FTlNVUkVfVFlQRVNfRVEoY29udGV4dCwgb3V0cHV0X2dhdGVfYmlhcy0+dHlwZSwga1RmTGl0ZUludDMyKTsKLSAgfSBlbHNlIHsKLSAgICBURl9MSVRFX0VOU1VSRV9UWVBFU19FUShjb250ZXh0LCBvdXRwdXRfZ2F0ZV9iaWFzLT50eXBlLCBrVGZMaXRlRmxvYXQzMik7Ci0gIH0KLQotICBjb25zdCBUZkxpdGVUZW5zb3IqIHByb2plY3Rpb25fd2VpZ2h0cyA9IEdldE9wdGlvbmFsSW5wdXRUZW5zb3IoCi0gICAgICBjb250ZXh0LCBub2RlLCBtaWNybzo6bHN0bTo6ZnVsbDo6a1Byb2plY3Rpb25XZWlnaHRzVGVuc29yKTsKLSAgaWYgKHByb2plY3Rpb25fd2VpZ2h0cyAhPSBudWxscHRyKSB7Ci0gICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgcHJvamVjdGlvbl93ZWlnaHRzLT5kaW1zLT5zaXplLCAyKTsKLSAgICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBwcm9qZWN0aW9uX3dlaWdodHMtPmRpbXMtPmRhdGFbMF0sIG5fb3V0cHV0KTsKLSAgICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBwcm9qZWN0aW9uX3dlaWdodHMtPmRpbXMtPmRhdGFbMV0sIG5fY2VsbCk7Ci0gIH0KLQotICBjb25zdCBUZkxpdGVUZW5zb3IqIHByb2plY3Rpb25fYmlhcyA9IEdldE9wdGlvbmFsSW5wdXRUZW5zb3IoCi0gICAgICBjb250ZXh0LCBub2RlLCBtaWNybzo6bHN0bTo6ZnVsbDo6a1Byb2plY3Rpb25CaWFzVGVuc29yKTsKLSAgaWYgKHByb2plY3Rpb25fYmlhcyAhPSBudWxscHRyKSB7Ci0gICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgcHJvamVjdGlvbl9iaWFzLT5kaW1zLT5zaXplLCAxKTsKLSAgICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBwcm9qZWN0aW9uX2JpYXMtPmRpbXMtPmRhdGFbMF0sIG5fb3V0cHV0KTsKLSAgICBpZiAoaXNfaW50ZWdlcikgewotICAgICAgVEZfTElURV9FTlNVUkVfVFlQRVNfRVEoY29udGV4dCwgcHJvamVjdGlvbl9iaWFzLT50eXBlLCBrVGZMaXRlSW50MzIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBURl9MSVRFX0VOU1VSRV9UWVBFU19FUShjb250ZXh0LCBwcm9qZWN0aW9uX2JpYXMtPnR5cGUsIGtUZkxpdGVGbG9hdDMyKTsKLSAgICB9Ci0gIH0KLQotICAvLyBNYWtpbmcgc3VyZSB0aGUgcHJvamVjdGlvbiB0ZW5zb3JzIGFyZSBjb25zaXN0ZW50OgotICAvLyAxKSBJZiBwcm9qZWN0aW9uIHdlaWdodCBpcyBub3QgcHJlc2VudCwgdGhlbiBwcm9qZWN0aW9uIGJpYXMgc2hvdWxkIG5vdCBiZQotICAvLyBwcmVzZW50LgotICAvLyAyKSBJZiBwcm9qZWN0aW9uIHdlaWdodCBpcyBwcmVzZW50LCB0aGVuIHByb2plY3Rpb24gYmlhcyBpcyBvcHRpb25hbC4KLSAgY29uc3QgYm9vbCBwcm9qZWN0b25fdGVuc29yc19jb25zaXN0ZW50ID0KLSAgICAgICgocHJvamVjdGlvbl93ZWlnaHRzICE9IG51bGxwdHIpIHx8IChwcm9qZWN0aW9uX2JpYXMgPT0gbnVsbHB0cikpOwotICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCBwcm9qZWN0b25fdGVuc29yc19jb25zaXN0ZW50ID09IHRydWUpOwotCi0gIGlmICh1c2VfbGF5ZXJfbm9ybSkgewotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0X2xheWVyX25vcm1fY29lZmZpY2llbnRzID0KLSAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KAotICAgICAgICAgICAgY29udGV4dCwgbm9kZSwKLSAgICAgICAgICAgIG1pY3JvOjpsc3RtOjpmdWxsOjprSW5wdXRMYXllck5vcm1Db2VmZmljaWVudHNUZW5zb3IpOwotICAgIGlmICh1c2VfY2lmZykgewotICAgICAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgaW5wdXRfbGF5ZXJfbm9ybV9jb2VmZmljaWVudHMsIG51bGxwdHIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCBpbnB1dF9sYXllcl9ub3JtX2NvZWZmaWNpZW50cyAhPSBudWxscHRyKTsKLSAgICAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIGlucHV0X2xheWVyX25vcm1fY29lZmZpY2llbnRzLT5kaW1zLT5zaXplLCAxKTsKLSAgICAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIGlucHV0X2xheWVyX25vcm1fY29lZmZpY2llbnRzLT5kaW1zLT5kYXRhWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgbl9jZWxsKTsKLSAgICAgIGlmIChpc19pbnRlZ2VyKSB7Ci0gICAgICAgIFRGX0xJVEVfRU5TVVJFX1RZUEVTX0VRKGNvbnRleHQsIGlucHV0X2xheWVyX25vcm1fY29lZmZpY2llbnRzLT50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVGZMaXRlSW50MTYpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgVEZfTElURV9FTlNVUkVfVFlQRVNfRVEoY29udGV4dCwgaW5wdXRfbGF5ZXJfbm9ybV9jb2VmZmljaWVudHMtPnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUZkxpdGVGbG9hdDMyKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogZm9yZ2V0X2xheWVyX25vcm1fY29lZmZpY2llbnRzID0KLSAgICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KAotICAgICAgICAgICAgY29udGV4dCwgbm9kZSwKLSAgICAgICAgICAgIG1pY3JvOjpsc3RtOjpmdWxsOjprRm9yZ2V0TGF5ZXJOb3JtQ29lZmZpY2llbnRzVGVuc29yKTsKLSAgICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBmb3JnZXRfbGF5ZXJfbm9ybV9jb2VmZmljaWVudHMtPmRpbXMtPnNpemUsIDEpOwotICAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIGZvcmdldF9sYXllcl9ub3JtX2NvZWZmaWNpZW50cy0+ZGltcy0+ZGF0YVswXSwKLSAgICAgICAgICAgICAgICAgICAgICBuX2NlbGwpOwotICAgIGlmIChpc19pbnRlZ2VyKSB7Ci0gICAgICBURl9MSVRFX0VOU1VSRV9UWVBFU19FUShjb250ZXh0LCBmb3JnZXRfbGF5ZXJfbm9ybV9jb2VmZmljaWVudHMtPnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVGZMaXRlSW50MTYpOwotICAgIH0gZWxzZSB7Ci0gICAgICBURl9MSVRFX0VOU1VSRV9UWVBFU19FUShjb250ZXh0LCBmb3JnZXRfbGF5ZXJfbm9ybV9jb2VmZmljaWVudHMtPnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVGZMaXRlRmxvYXQzMik7Ci0gICAgfQotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGNlbGxfbGF5ZXJfbm9ybV9jb2VmZmljaWVudHMgPQotICAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsSW5wdXQoCi0gICAgICAgICAgICBjb250ZXh0LCBub2RlLCBtaWNybzo6bHN0bTo6ZnVsbDo6a0NlbGxMYXllck5vcm1Db2VmZmljaWVudHNUZW5zb3IpOwotICAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIGNlbGxfbGF5ZXJfbm9ybV9jb2VmZmljaWVudHMtPmRpbXMtPnNpemUsIDEpOwotICAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIGNlbGxfbGF5ZXJfbm9ybV9jb2VmZmljaWVudHMtPmRpbXMtPmRhdGFbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgbl9jZWxsKTsKLSAgICBpZiAoaXNfaW50ZWdlcikgewotICAgICAgVEZfTElURV9FTlNVUkVfVFlQRVNfRVEoY29udGV4dCwgY2VsbF9sYXllcl9ub3JtX2NvZWZmaWNpZW50cy0+dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUZkxpdGVJbnQxNik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFRGX0xJVEVfRU5TVVJFX1RZUEVTX0VRKGNvbnRleHQsIGNlbGxfbGF5ZXJfbm9ybV9jb2VmZmljaWVudHMtPnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVGZMaXRlRmxvYXQzMik7Ci0gICAgfQotICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dF9sYXllcl9ub3JtX2NvZWZmaWNpZW50cyA9Ci0gICAgICAgIHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dCgKLSAgICAgICAgICAgIGNvbnRleHQsIG5vZGUsCi0gICAgICAgICAgICBtaWNybzo6bHN0bTo6ZnVsbDo6a091dHB1dExheWVyTm9ybUNvZWZmaWNpZW50c1RlbnNvcik7Ci0KLSAgICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBvdXRwdXRfbGF5ZXJfbm9ybV9jb2VmZmljaWVudHMtPmRpbXMtPnNpemUsIDEpOwotICAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIG91dHB1dF9sYXllcl9ub3JtX2NvZWZmaWNpZW50cy0+ZGltcy0+ZGF0YVswXSwKLSAgICAgICAgICAgICAgICAgICAgICBuX2NlbGwpOwotICAgIGlmIChpc19pbnRlZ2VyKSB7Ci0gICAgICBURl9MSVRFX0VOU1VSRV9UWVBFU19FUShjb250ZXh0LCBvdXRwdXRfbGF5ZXJfbm9ybV9jb2VmZmljaWVudHMtPnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVGZMaXRlSW50MTYpOwotICAgIH0gZWxzZSB7Ci0gICAgICBURl9MSVRFX0VOU1VSRV9UWVBFU19FUShjb250ZXh0LCBvdXRwdXRfbGF5ZXJfbm9ybV9jb2VmZmljaWVudHMtPnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVGZMaXRlRmxvYXQzMik7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGtUZkxpdGVPazsKLX0KLQotVGZMaXRlU3RhdHVzIFByZWNvbXB1dGVaZXJvUG9pbnRUaW1lc1dlaWdodFdpdGhCaWFzKAotICAgIFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGludDMyX3QgemVyb19wb2ludCwKLSAgICBjb25zdCBUZkxpdGVUZW5zb3IqIHdlaWdodF90ZW5zb3IsIGNvbnN0IFRmTGl0ZVRlbnNvciogYmlhc190ZW5zb3IsCi0gICAgc3RkOjp1bmlxdWVfcHRyPGludDMyX3RbXT4qIG91dHB1dCkgewotICBpZiAod2VpZ2h0X3RlbnNvciA9PSBudWxscHRyKSB7Ci0gICAgcmV0dXJuIGtUZkxpdGVPazsKLSAgfQotCi0gIGNvbnN0IFJ1bnRpbWVTaGFwZSYgd2VpZ2h0X3NoYXBlID0gR2V0VGVuc29yU2hhcGUod2VpZ2h0X3RlbnNvcik7Ci0gIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIHdlaWdodF9zaGFwZS5EaW1lbnNpb25zQ291bnQoKSwgMik7Ci0gIGNvbnN0IGludCByb3cgPSB3ZWlnaHRfc2hhcGUuRGltcygwKTsKLSAgY29uc3QgaW50IGNvbCA9IHdlaWdodF9zaGFwZS5EaW1zKDEpOwotICBvdXRwdXQtPnJlc2V0KG5ldyBpbnQzMl90W3Jvd10pOwotICBpZiAoYmlhc190ZW5zb3IgPT0gbnVsbHB0cikgewotICAgIG1lbXNldChvdXRwdXQtPmdldCgpLCAwLCByb3cgKiBzaXplb2YoaW50MzJfdCkpOwotICB9IGVsc2UgewotICAgIGNvbnN0IGludDMyX3QqIGJpYXMgPSBHZXRUZW5zb3JEYXRhPGludDMyX3Q+KGJpYXNfdGVuc29yKTsKLSAgICBtZW1jcHkob3V0cHV0LT5nZXQoKSwgYmlhcywgcm93ICogc2l6ZW9mKGludDMyX3QpKTsKLSAgfQotICBpZiAoemVyb19wb2ludCAhPSAwKSB7Ci0gICAgY29uc3QgaW50OF90KiB3ZWlnaHQgPSBHZXRUZW5zb3JEYXRhPGludDhfdD4od2VpZ2h0X3RlbnNvcik7Ci0gICAgdGVuc29yX3V0aWxzOjpQb3J0YWJsZU1hdHJpeFNjYWxhck11bHRpcGx5QWNjdW11bGF0ZSgKLSAgICAgICAgd2VpZ2h0LCB6ZXJvX3BvaW50LCByb3csIGNvbCwgb3V0cHV0LT5nZXQoKSk7Ci0gIH0KLSAgcmV0dXJuIGtUZkxpdGVPazsKLX0KLQotVGZMaXRlU3RhdHVzIFBvcHVsYXRlUHJlY29tcHV0ZWRaUFRpbWVzV2VpZ2h0c1dpdGhCaWFzKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BEYXRhKiBvcF9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRmTGl0ZU5vZGUqIG5vZGUpIHsKLSAgY29uc3QgVGZMaXRlVGVuc29yKiBpbnB1dDsKLSAgVEZfTElURV9FTlNVUkVfT0soCi0gICAgICBjb250ZXh0LAotICAgICAgR2V0SW5wdXRTYWZlKGNvbnRleHQsIG5vZGUsIG1pY3JvOjpsc3RtOjpmdWxsOjprSW5wdXRUZW5zb3IsICZpbnB1dCkpOwotICBjb25zdCBUZkxpdGVUZW5zb3IqIG91dHB1dF9zdGF0ZSA9Ci0gICAgICBHZXRWYXJpYWJsZUlucHV0KGNvbnRleHQsIG5vZGUsIG1pY3JvOjpsc3RtOjpmdWxsOjprT3V0cHV0U3RhdGVUZW5zb3IpOwotICBURl9MSVRFX0VOU1VSRShjb250ZXh0LCBvdXRwdXRfc3RhdGUgIT0gbnVsbHB0cik7Ci0KLSAgY29uc3QgaW50MzJfdCBpbnB1dF96ZXJvX3BvaW50ID0gLWlucHV0LT5wYXJhbXMuemVyb19wb2ludDsKLSAgY29uc3QgaW50MzJfdCBvdXRwdXRfc3RhdGVfemVyb19wb2ludCA9IC1vdXRwdXRfc3RhdGUtPnBhcmFtcy56ZXJvX3BvaW50OwotCi0gIGNvbnN0IFRmTGl0ZVRlbnNvciogaW5wdXRfdG9faW5wdXRfd2VpZ2h0cyA9IEdldE9wdGlvbmFsSW5wdXRUZW5zb3IoCi0gICAgICBjb250ZXh0LCBub2RlLCBtaWNybzo6bHN0bTo6ZnVsbDo6a0lucHV0VG9JbnB1dFdlaWdodHNUZW5zb3IpOwotICBjb25zdCBUZkxpdGVUZW5zb3IqIGlucHV0X3RvX2ZvcmdldF93ZWlnaHRzOwotICBURl9MSVRFX0VOU1VSRV9PSyhjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBHZXRJbnB1dFNhZmUoY29udGV4dCwgbm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pY3JvOjpsc3RtOjpmdWxsOjprSW5wdXRUb0ZvcmdldFdlaWdodHNUZW5zb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXRfdG9fZm9yZ2V0X3dlaWdodHMpKTsKLSAgY29uc3QgVGZMaXRlVGVuc29yKiBpbnB1dF90b19jZWxsX3dlaWdodHM7Ci0gIFRGX0xJVEVfRU5TVVJFX09LKAotICAgICAgY29udGV4dCwKLSAgICAgIEdldElucHV0U2FmZShjb250ZXh0LCBub2RlLCBtaWNybzo6bHN0bTo6ZnVsbDo6a0lucHV0VG9DZWxsV2VpZ2h0c1RlbnNvciwKLSAgICAgICAgICAgICAgICAgICAmaW5wdXRfdG9fY2VsbF93ZWlnaHRzKSk7Ci0gIGNvbnN0IFRmTGl0ZVRlbnNvciogaW5wdXRfdG9fb3V0cHV0X3dlaWdodHM7Ci0gIFRGX0xJVEVfRU5TVVJFX09LKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIEdldElucHV0U2FmZShjb250ZXh0LCBub2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWljcm86OmxzdG06OmZ1bGw6OmtJbnB1dFRvT3V0cHV0V2VpZ2h0c1RlbnNvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dF90b19vdXRwdXRfd2VpZ2h0cykpOwotCi0gIGNvbnN0IFRmTGl0ZVRlbnNvciogcmVjdXJyZW50X3RvX2lucHV0X3dlaWdodHMgPSBHZXRPcHRpb25hbElucHV0VGVuc29yKAotICAgICAgY29udGV4dCwgbm9kZSwgbWljcm86OmxzdG06OmZ1bGw6OmtSZWN1cnJlbnRUb0lucHV0V2VpZ2h0c1RlbnNvcik7Ci0gIGNvbnN0IFRmTGl0ZVRlbnNvciogcmVjdXJyZW50X3RvX2ZvcmdldF93ZWlnaHRzOwotICBURl9MSVRFX0VOU1VSRV9PSygKLSAgICAgIGNvbnRleHQsIEdldElucHV0U2FmZShjb250ZXh0LCBub2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pY3JvOjpsc3RtOjpmdWxsOjprUmVjdXJyZW50VG9Gb3JnZXRXZWlnaHRzVGVuc29yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWN1cnJlbnRfdG9fZm9yZ2V0X3dlaWdodHMpKTsKLSAgY29uc3QgVGZMaXRlVGVuc29yKiByZWN1cnJlbnRfdG9fY2VsbF93ZWlnaHRzOwotICBURl9MSVRFX0VOU1VSRV9PSygKLSAgICAgIGNvbnRleHQsIEdldElucHV0U2FmZShjb250ZXh0LCBub2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pY3JvOjpsc3RtOjpmdWxsOjprUmVjdXJyZW50VG9DZWxsV2VpZ2h0c1RlbnNvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjdXJyZW50X3RvX2NlbGxfd2VpZ2h0cykpOwotICBjb25zdCBUZkxpdGVUZW5zb3IqIHJlY3VycmVudF90b19vdXRwdXRfd2VpZ2h0czsKLSAgVEZfTElURV9FTlNVUkVfT0soCi0gICAgICBjb250ZXh0LCBHZXRJbnB1dFNhZmUoY29udGV4dCwgbm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWNybzo6bHN0bTo6ZnVsbDo6a1JlY3VycmVudFRvT3V0cHV0V2VpZ2h0c1RlbnNvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjdXJyZW50X3RvX291dHB1dF93ZWlnaHRzKSk7Ci0KLSAgY29uc3QgVGZMaXRlVGVuc29yKiBwcm9qZWN0aW9uX3dlaWdodHMgPSBHZXRPcHRpb25hbElucHV0VGVuc29yKAotICAgICAgY29udGV4dCwgbm9kZSwgbHN0bTo6ZnVsbDo6a1Byb2plY3Rpb25XZWlnaHRzVGVuc29yKTsKLSAgY29uc3QgVGZMaXRlVGVuc29yKiBwcm9qZWN0aW9uX2JpYXMgPSBHZXRPcHRpb25hbElucHV0VGVuc29yKAotICAgICAgY29udGV4dCwgbm9kZSwgbWljcm86OmxzdG06OmZ1bGw6OmtQcm9qZWN0aW9uQmlhc1RlbnNvcik7Ci0KLSAgbHN0bV9ldmFsOjpJbnRlZ2VyTHN0bVBhcmFtZXRlciogaW50ZWdlcl9sc3RtX3BhcmFtcyA9Ci0gICAgICAmb3BfZGF0YS0+aW50ZWdlcl9sc3RtX3BhcmFtOwotCi0gIFRmTGl0ZVRlbnNvciogaW50ZXJtZWRpYXRlID0KLSAgICAgIGNvbnRleHQtPkdldFRlbnNvcihjb250ZXh0LCBub2RlLT5pbnRlcm1lZGlhdGVzLT5kYXRhWzRdKTsKLSAgY29uc3QgYXV0byogcGFyYW1zID0KLSAgICAgIHN0YXRpY19jYXN0PFRmTGl0ZUFmZmluZVF1YW50aXphdGlvbio+KGludGVybWVkaWF0ZS0+cXVhbnRpemF0aW9uLnBhcmFtcyk7Ci0gIGNvbnN0IGludDMyX3QgaGlkZGVuX3pwID0gcGFyYW1zLT56ZXJvX3BvaW50LT5kYXRhWzBdOwotCi0gIC8vIEdldCBiaWFzIGFuZCBwZXJmb3JtIHplcm8gcG9pbnQgY2FsY3VsYXRpb24uCi0gIC8vIFdoZW4gdGhlcmUgaXMgbGF5ZXIgbm9ybWFsaXphdGlvbiwgdGhlIGdhdGUgYmlhcyBkb2VzIG5vdCBhcHBseSB0byBtYXRtdWwKLSAgLy8gZGlyZWN0bHk6Ci0gIC8vICAgICAgeSA9IGxuKHcgKiB4ICsgdyAqIHIgKyB3ICogYykgKyBiLgotICBjb25zdCBib29sIGlzX2xheWVyX25vcm0gPSBvcF9kYXRhLT51c2VfbGF5ZXJfbm9ybTsKLQotICAvLyBGb3JnZXQgZ2F0ZS4KLSAgY29uc3QgVGZMaXRlVGVuc29yKiBmb3JnZXRfZ2F0ZV9iaWFzID0KLSAgICAgIGlzX2xheWVyX25vcm0KLSAgICAgICAgICA/IG51bGxwdHIKLSAgICAgICAgICA6IEdldElucHV0KGNvbnRleHQsIG5vZGUsIG1pY3JvOjpsc3RtOjpmdWxsOjprRm9yZ2V0R2F0ZUJpYXNUZW5zb3IpOwotICBURl9MSVRFX0VOU1VSRV9PSygKLSAgICAgIGNvbnRleHQsCi0gICAgICBQcmVjb21wdXRlWmVyb1BvaW50VGltZXNXZWlnaHRXaXRoQmlhcygKLSAgICAgICAgICBjb250ZXh0LCBpbnB1dF96ZXJvX3BvaW50LCBpbnB1dF90b19mb3JnZXRfd2VpZ2h0cywgZm9yZ2V0X2dhdGVfYmlhcywKLSAgICAgICAgICAmKGludGVnZXJfbHN0bV9wYXJhbXMtPmlucHV0X3RvX2ZvcmdldF9lZmZlY3RpdmVfYmlhcykpKTsKLQotICBURl9MSVRFX0VOU1VSRV9PSygKLSAgICAgIGNvbnRleHQsCi0gICAgICBQcmVjb21wdXRlWmVyb1BvaW50VGltZXNXZWlnaHRXaXRoQmlhcygKLSAgICAgICAgICBjb250ZXh0LCBvdXRwdXRfc3RhdGVfemVyb19wb2ludCwgcmVjdXJyZW50X3RvX2ZvcmdldF93ZWlnaHRzLAotICAgICAgICAgIG51bGxwdHIsICYoaW50ZWdlcl9sc3RtX3BhcmFtcy0+cmVjdXJyZW50X3RvX2ZvcmdldF9lZmZlY3RpdmVfYmlhcykpKTsKLQotICAvLyBNb2R1bGF0aW9uIGdhdGUuCi0gIGNvbnN0IFRmTGl0ZVRlbnNvciogY2VsbF9nYXRlX2JpYXMgPQotICAgICAgaXNfbGF5ZXJfbm9ybQotICAgICAgICAgID8gbnVsbHB0cgotICAgICAgICAgIDogR2V0SW5wdXQoY29udGV4dCwgbm9kZSwgbWljcm86OmxzdG06OmZ1bGw6OmtDZWxsR2F0ZUJpYXNUZW5zb3IpOwotICBURl9MSVRFX0VOU1VSRV9PSygKLSAgICAgIGNvbnRleHQsCi0gICAgICBQcmVjb21wdXRlWmVyb1BvaW50VGltZXNXZWlnaHRXaXRoQmlhcygKLSAgICAgICAgICBjb250ZXh0LCBpbnB1dF96ZXJvX3BvaW50LCBpbnB1dF90b19jZWxsX3dlaWdodHMsIGNlbGxfZ2F0ZV9iaWFzLAotICAgICAgICAgICYoaW50ZWdlcl9sc3RtX3BhcmFtcy0+aW5wdXRfdG9fY2VsbF9lZmZlY3RpdmVfYmlhcykpKTsKLSAgVEZfTElURV9FTlNVUkVfT0soCi0gICAgICBjb250ZXh0LAotICAgICAgUHJlY29tcHV0ZVplcm9Qb2ludFRpbWVzV2VpZ2h0V2l0aEJpYXMoCi0gICAgICAgICAgY29udGV4dCwgb3V0cHV0X3N0YXRlX3plcm9fcG9pbnQsIHJlY3VycmVudF90b19jZWxsX3dlaWdodHMsIG51bGxwdHIsCi0gICAgICAgICAgJihpbnRlZ2VyX2xzdG1fcGFyYW1zLT5yZWN1cnJlbnRfdG9fY2VsbF9lZmZlY3RpdmVfYmlhcykpKTsKLQotICAvLyBPdXRwdXQgZ2F0ZS4KLSAgY29uc3QgVGZMaXRlVGVuc29yKiBvdXRwdXRfZ2F0ZV9iaWFzID0KLSAgICAgIGlzX2xheWVyX25vcm0KLSAgICAgICAgICA/IG51bGxwdHIKLSAgICAgICAgICA6IEdldElucHV0KGNvbnRleHQsIG5vZGUsIG1pY3JvOjpsc3RtOjpmdWxsOjprT3V0cHV0R2F0ZUJpYXNUZW5zb3IpOwotICBURl9MSVRFX0VOU1VSRV9PSygKLSAgICAgIGNvbnRleHQsCi0gICAgICBQcmVjb21wdXRlWmVyb1BvaW50VGltZXNXZWlnaHRXaXRoQmlhcygKLSAgICAgICAgICBjb250ZXh0LCBpbnB1dF96ZXJvX3BvaW50LCBpbnB1dF90b19vdXRwdXRfd2VpZ2h0cywgb3V0cHV0X2dhdGVfYmlhcywKLSAgICAgICAgICAmKGludGVnZXJfbHN0bV9wYXJhbXMtPmlucHV0X3RvX291dHB1dF9lZmZlY3RpdmVfYmlhcykpKTsKLQotICBURl9MSVRFX0VOU1VSRV9PSygKLSAgICAgIGNvbnRleHQsCi0gICAgICBQcmVjb21wdXRlWmVyb1BvaW50VGltZXNXZWlnaHRXaXRoQmlhcygKLSAgICAgICAgICBjb250ZXh0LCBvdXRwdXRfc3RhdGVfemVyb19wb2ludCwgcmVjdXJyZW50X3RvX291dHB1dF93ZWlnaHRzLAotICAgICAgICAgIG51bGxwdHIsICYoaW50ZWdlcl9sc3RtX3BhcmFtcy0+cmVjdXJyZW50X3RvX291dHB1dF9lZmZlY3RpdmVfYmlhcykpKTsKLQotICAvLyBJbnB1dCBnYXRlLiBUaGUgY2FsY3VsYXRpb24gaXMgb25seSBtZWFuaW5nZnVsIGZvciBub24tY2lmZyBjYXNlLgotICBjb25zdCBUZkxpdGVUZW5zb3IqIGlucHV0X2dhdGVfYmlhcyA9Ci0gICAgICBpc19sYXllcl9ub3JtCi0gICAgICAgICAgPyBudWxscHRyCi0gICAgICAgICAgOiBHZXRJbnB1dChjb250ZXh0LCBub2RlLCBtaWNybzo6bHN0bTo6ZnVsbDo6a0lucHV0R2F0ZUJpYXNUZW5zb3IpOwotICBURl9MSVRFX0VOU1VSRV9PSygKLSAgICAgIGNvbnRleHQsCi0gICAgICBQcmVjb21wdXRlWmVyb1BvaW50VGltZXNXZWlnaHRXaXRoQmlhcygKLSAgICAgICAgICBjb250ZXh0LCBpbnB1dF96ZXJvX3BvaW50LCBpbnB1dF90b19pbnB1dF93ZWlnaHRzLCBpbnB1dF9nYXRlX2JpYXMsCi0gICAgICAgICAgJihpbnRlZ2VyX2xzdG1fcGFyYW1zLT5pbnB1dF90b19pbnB1dF9lZmZlY3RpdmVfYmlhcykpKTsKLSAgVEZfTElURV9FTlNVUkVfT0soCi0gICAgICBjb250ZXh0LAotICAgICAgUHJlY29tcHV0ZVplcm9Qb2ludFRpbWVzV2VpZ2h0V2l0aEJpYXMoCi0gICAgICAgICAgY29udGV4dCwgb3V0cHV0X3N0YXRlX3plcm9fcG9pbnQsIHJlY3VycmVudF90b19pbnB1dF93ZWlnaHRzLCBudWxscHRyLAotICAgICAgICAgICYoaW50ZWdlcl9sc3RtX3BhcmFtcy0+cmVjdXJyZW50X3RvX2lucHV0X2VmZmVjdGl2ZV9iaWFzKSkpOwotCi0gIC8vIFByb2plY3Rpb24gYmlhcy4gVGhlIGNhbGN1bGF0aW9uIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3Igd2l0aCBwcm9qZWN0aW9uLgotICBURl9MSVRFX0VOU1VSRV9PSyhjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBQcmVjb21wdXRlWmVyb1BvaW50VGltZXNXZWlnaHRXaXRoQmlhcygKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGhpZGRlbl96cCwgcHJvamVjdGlvbl93ZWlnaHRzLCBwcm9qZWN0aW9uX2JpYXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAmKGludGVnZXJfbHN0bV9wYXJhbXMtPnByb2plY3Rpb25fZWZmZWN0aXZlX2JpYXMpKSk7Ci0gIHJldHVybiBrVGZMaXRlT2s7Ci19Ci0KLS8vIFJlc2l6ZSB0aGUgb3V0cHV0IGFuZCAgc3RhdGUgdGVuc29ycyBiYXNlZCBvbiB0aGUgc2l6ZXMgb2YgdGhlIGlucHV0IHRlbnNvcnMuCi0vLyBBbGxvY2F0ZSBhIHRlbXBvcmFyeSBzY3JhdGNoIHRlbnNvci4gQWxzbyBjaGVjayB0aGF0IHRoZSBzaXplcyBvZiB0aGUgaW5wdXQKLS8vIHRlbnNvcnMgbWF0Y2ggZWFjaCBvdGhlci4KLVRmTGl0ZVN0YXR1cyBQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKLSAgT3BEYXRhKiBvcF9kYXRhID0gcmVpbnRlcnByZXRfY2FzdDxPcERhdGEqPihub2RlLT51c2VyX2RhdGEpOwotICAvLyBjb25zdCBpbnQgc2NyYXRjaF90ZW5zb3JfaW5kZXggPSBvcF9kYXRhLT5zY3JhdGNoX3RlbnNvcl9pbmRleDsKLQotICAvLyBDaGVjayB3ZSBoYXZlIGFsbCB0aGUgaW5wdXRzIGFuZCBvdXRwdXRzIHdlIG5lZWQuCi0gIGJvb2wgdXNlX2xheWVyX25vcm0gPSBmYWxzZTsKLSAgaWYgKG5vZGUtPmlucHV0cy0+c2l6ZSA9PSAyNCkgewotICAgIGNvbnN0IFRmTGl0ZVRlbnNvciogZm9yZ2V0X2xheWVyX25vcm1fY29lZmZpY2llbnRzID0gR2V0T3B0aW9uYWxJbnB1dFRlbnNvcigKLSAgICAgICAgY29udGV4dCwgbm9kZSwgbWljcm86OmxzdG06OmZ1bGw6OmtGb3JnZXRMYXllck5vcm1Db2VmZmljaWVudHNUZW5zb3IpOwotICAgIGlmIChmb3JnZXRfbGF5ZXJfbm9ybV9jb2VmZmljaWVudHMgPT0gbnVsbHB0cikgewotICAgICAgdXNlX2xheWVyX25vcm0gPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgdXNlX2xheWVyX25vcm0gPSB0cnVlOwotICAgIH0KLSAgfSBlbHNlIGlmIChub2RlLT5pbnB1dHMtPnNpemUgPT0gMjApIHsKLSAgICAvLyBUaGlzIGlzIGRlcHJlY2F0ZWQgYW5kIGlzIG9ubHkga2VwdCBoZXJlIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotICAgIHVzZV9sYXllcl9ub3JtID0gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgTWljcm9QcmludGYoIlRoZSBMU1RNIEZ1bGwga2VybmVsIGV4cGVjdHMgMjAgb3IgMjQgaW5wdXRzLiBHb3QgJWQgaW5wdXRzIiwKLSAgICAgICAgICAgICAgICBub2RlLT5pbnB1dHMtPnNpemUpOwotICAgIHJldHVybiBrVGZMaXRlRXJyb3I7Ci0gIH0KLSAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgbm9kZS0+b3V0cHV0cy0+c2l6ZSwgMSk7Ci0gIG9wX2RhdGEtPnVzZV9sYXllcl9ub3JtID0gdXNlX2xheWVyX25vcm07Ci0KLSAgLy8gSW5mZXJyaW5nIGJhdGNoIHNpemUsIG51bWJlciBvZiBvdXRwdXRzIGFuZCBzZXF1ZW5jZSBsZW5ndGggYW5kCi0gIC8vIG51bWJlciBvZiBjZWxscyBmcm9tIHRoZSBpbnB1dCB0ZW5zb3JzLgotICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dCA9IHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dCgKLSAgICAgIGNvbnRleHQsIG5vZGUsIG1pY3JvOjpsc3RtOjpmdWxsOjprSW5wdXRUZW5zb3IpOwotICBjb25zdCBib29sIGlzX2ludGVnZXIgPSBpbnB1dC0+dHlwZSA9PSBrVGZMaXRlSW50ODsKLSAgVEZfTElURV9FTlNVUkUoY29udGV4dCwgaW5wdXQtPmRpbXMtPnNpemUgPiAxKTsKLSAgY29uc3QgYXV0byogcGFyYW1zID0KLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8VGZMaXRlVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1QYXJhbXMqPigKLSAgICAgICAgICBub2RlLT5idWlsdGluX2RhdGEpOwotICBjb25zdCBib29sIHRpbWVfbWFqb3IgPSBwYXJhbXMtPnRpbWVfbWFqb3I7Ci0gIGNvbnN0IGludCBuX2JhdGNoID0gdGltZV9tYWpvciA/IGlucHV0LT5kaW1zLT5kYXRhWzFdIDogaW5wdXQtPmRpbXMtPmRhdGFbMF07Ci0gIGNvbnN0IGludCBuX2lucHV0ID0gaW5wdXQtPmRpbXMtPmRhdGFbMl07Ci0gIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0X3RvX291dHB1dF93ZWlnaHRzID0gdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KAotICAgICAgY29udGV4dCwgbm9kZSwgbWljcm86OmxzdG06OmZ1bGw6OmtJbnB1dFRvT3V0cHV0V2VpZ2h0c1RlbnNvcik7Ci0gIGNvbnN0IGludCBuX2NlbGwgPSBpbnB1dF90b19vdXRwdXRfd2VpZ2h0cy0+ZGltcy0+ZGF0YVswXTsKLSAgVEZfTElURV9FTlNVUkVfRVEoY29udGV4dCwgaW5wdXRfdG9fb3V0cHV0X3dlaWdodHMtPmRpbXMtPnNpemUsIDIpOwotICBURl9MSVRFX0VOU1VSRV9FUShjb250ZXh0LCBpbnB1dF90b19vdXRwdXRfd2VpZ2h0cy0+ZGltcy0+ZGF0YVsxXSwgbl9pbnB1dCk7Ci0gIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIHJlY3VycmVudF90b19vdXRwdXRfd2VpZ2h0cyA9Ci0gICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsSW5wdXQoCi0gICAgICAgICAgY29udGV4dCwgbm9kZSwgbWljcm86OmxzdG06OmZ1bGw6OmtSZWN1cnJlbnRUb091dHB1dFdlaWdodHNUZW5zb3IpOwotCi0gIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIHJlY3VycmVudF90b19vdXRwdXRfd2VpZ2h0cy0+ZGltcy0+c2l6ZSwgMik7Ci0gIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIHJlY3VycmVudF90b19vdXRwdXRfd2VpZ2h0cy0+ZGltcy0+ZGF0YVswXSwKLSAgICAgICAgICAgICAgICAgICAgbl9jZWxsKTsKLSAgY29uc3QgaW50IG5fb3V0cHV0ID0gcmVjdXJyZW50X3RvX291dHB1dF93ZWlnaHRzLT5kaW1zLT5kYXRhWzFdOwotCi0gIC8vIENoZWNrIHRoYXQgaW5wdXQgdGVuc29yIGRpbWVuc2lvbnMgbWF0Y2hlcyB3aXRoIGVhY2ggb3RoZXIuCi0gIFRGX0xJVEVfRU5TVVJFX09LKAotICAgICAgY29udGV4dCwgQ2hlY2tJbnB1dFRlbnNvckRpbWVuc2lvbnMoY29udGV4dCwgbm9kZSwgbl9pbnB1dCwgbl9vdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuX2NlbGwsIHVzZV9sYXllcl9ub3JtLCBpc19pbnRlZ2VyKSk7Ci0gIC8vIEdldCB0aGUgcG9pbnRlciB0byBvdXRwdXQsIG91dHB1dF9zdGF0ZSBhbmQgY2VsbF9zdGF0ZSBidWZmZXIgdGVuc29ycy4KLSAgLy8gIFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dCA9Ci0gIC8vICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbE91dHB1dChjb250ZXh0LCBub2RlLAotICAvLyAgICAgIG1pY3JvOjpsc3RtOjpmdWxsOjprT3V0cHV0VGVuc29yKTsKLSAgVGZMaXRlRXZhbFRlbnNvciogb3V0cHV0X3N0YXRlID0gdGZsaXRlOjptaWNybzo6R2V0TXV0YWJsZUV2YWxJbnB1dCgKLSAgICAgIGNvbnRleHQsIG5vZGUsIG1pY3JvOjpsc3RtOjpmdWxsOjprT3V0cHV0U3RhdGVUZW5zb3IpOwotICBURkxJVEVfRENIRUNLKG91dHB1dF9zdGF0ZSAhPSBudWxscHRyKTsKLSAgVGZMaXRlRXZhbFRlbnNvciogY2VsbF9zdGF0ZSA9IHRmbGl0ZTo6bWljcm86OkdldE11dGFibGVFdmFsSW5wdXQoCi0gICAgICBjb250ZXh0LCBub2RlLCBtaWNybzo6bHN0bTo6ZnVsbDo6a0NlbGxTdGF0ZVRlbnNvcik7Ci0gIFRGTElURV9EQ0hFQ0soY2VsbF9zdGF0ZSAhPSBudWxscHRyKTsKLSAgLy8gQ2hlY2sgdGhlIHNoYXBlIG9mIGlucHV0IHN0YXRlIHRlbnNvcnMuCi0gIC8vIFRoZXNlIHRlbnNvciBtYXkgYmUgMUQgb3IgMkQuIEl0J3MgZmluZSBhcyBsb25nIGFzIHRoZSB0b3RhbCBzaXplIGlzCi0gIC8vIGNvcnJlY3QuCi0gIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bUVsZW1lbnRzKG91dHB1dF9zdGF0ZS0+ZGltcyksCi0gICAgICAgICAgICAgICAgICAgIG5fYmF0Y2ggKiBuX291dHB1dCk7Ci0gIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bUVsZW1lbnRzKGNlbGxfc3RhdGUtPmRpbXMpLCBuX2JhdGNoICogbl9jZWxsKTsKLQotICBpZiAoaXNfaW50ZWdlcikgewotICAgIGNvbnN0IGludCBudW1faW50ZXJtZWRpYXRlX3RlbnNvcnMgPSBub2RlLT5pbnRlcm1lZGlhdGVzLT5zaXplOwotICAgIFRGX0xJVEVfRU5TVVJFKGNvbnRleHQsIG51bV9pbnRlcm1lZGlhdGVfdGVuc29ycyA9PSA1KTsKLSAgfQotCi0gIGlmIChpc19pbnRlZ2VyKSB7Ci0gICAgLy8gSW50ZWdlciBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTSBwcmVwYXJlIGZ1bmN0aW9uIGZvciA4eDgtPjE2LgotICAgIC8vIFRoaXMgY29kZSBwYXRoIG5lZWRzIDUgaW50ZXJtZWRpYXRlIHRlbnNvcnMgcGVyIE9wLgotICAgIC8vIFBvcHVsYXRlIHF1YW50aXphdGlvbiBwYXJhbWV0ZXJzLgotICAgIFBvcHVsYXRlUXVhbnRpemVkTHN0bVBhcmFtczh4OF8xNihjb250ZXh0LCBub2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3BfZGF0YS0+aW50ZWdlcl9sc3RtX3BhcmFtKTsKLSAgICAvLyBBbGxvY2F0ZSBzY3JhdGNoIGJ1ZmZlci4gTmVlZCA2IDE2Yml0IGJ1ZmZlciB3aXRoIHNpemUgbl9iYXRjaCAqIG5fY2VsbAotICAgIC8vIGFuZCAxIDhiaXQgYnVmZmVyIHdpdGggc2l6ZSBuX2JhdGNoICogbl9jZWxsLiBXZSBhbHNvIG5lZWQgMSAzMiBiaXQKLSAgICAvLyBidWZmZXIgd2l0aCBzaXplIG5fYmF0Y2ggKiBuX2NlbGwuCi0gICAgLy8KLSAgICAvLyBIYW5kbGUgY2lmZyBjYXNlIGFzIHdlbGwsIHdoaWNoIG1pZ2h0IHNhdmUgb25lIGJ1ZmZlci4KLQotICAgIGludCBzY3JhdGNoX2lkeCA9IDA7Ci0KLSAgICBjb250ZXh0LT5SZXF1ZXN0U2NyYXRjaEJ1ZmZlckluQXJlbmEoCi0gICAgICAgIGNvbnRleHQsIG5fYmF0Y2ggKiBuX2NlbGwgKiBzaXplb2YoaW50MzJfdCksICYoc2NyYXRjaF9pZHgpKTsKLSAgICBvcF9kYXRhLT5zY3JhdGNoX3RlbnNvcl9pbmRleCA9IHNjcmF0Y2hfaWR4OwotCi0gICAgZm9yIChpbnQgc2NyYXRjaF9pbmRleCA9IDE7IHNjcmF0Y2hfaW5kZXggPCA2OyArK3NjcmF0Y2hfaW5kZXgpIHsKLSAgICAgIC8vIG5vZGUtPnRlbXBvcmFyaWVzLT5kYXRhW3NjcmF0Y2hfaW5kZXhdID0gb3BfZGF0YS0+c2NyYXRjaF90ZW5zb3JfaW5kZXgKLSAgICAgIC8vICsgc2NyYXRjaF9pbmRleDsKLSAgICAgIGNvbnRleHQtPlJlcXVlc3RTY3JhdGNoQnVmZmVySW5BcmVuYSgKLSAgICAgICAgICBjb250ZXh0LCBuX2JhdGNoICogbl9jZWxsICogc2l6ZW9mKGludDMyX3QpLCAmKHNjcmF0Y2hfaWR4KSk7Ci0gICAgICBURkxJVEVfRENIRUNLKHNjcmF0Y2hfaWR4ID09Ci0gICAgICAgICAgICAgICAgICAgIChvcF9kYXRhLT5zY3JhdGNoX3RlbnNvcl9pbmRleCArIHNjcmF0Y2hfaW5kZXgpKTsKLSAgICB9Ci0KLSAgICAvLyBQb3B1bGF0ZSBwcmVjb21wdXRlZCB6cCAqIHdlaWdodC4KLSAgICBURl9MSVRFX0VOU1VSRV9PSyhjb250ZXh0LCBQb3B1bGF0ZVByZWNvbXB1dGVkWlBUaW1lc1dlaWdodHNXaXRoQmlhcygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCwgb3BfZGF0YSwgbm9kZSkpOwotICB9Ci0KLSAgcmV0dXJuIGtUZkxpdGVPazsKLX0KLQotVGZMaXRlU3RhdHVzIEV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewotICBjb25zdCBhdXRvKiBwYXJhbXMgPQotICAgICAgcmVpbnRlcnByZXRfY2FzdDxUZkxpdGVVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTVBhcmFtcyo+KAotICAgICAgICAgIG5vZGUtPmJ1aWx0aW5fZGF0YSk7Ci0gIGNvbnN0IE9wRGF0YSogb3BfZGF0YSA9IHJlaW50ZXJwcmV0X2Nhc3Q8T3BEYXRhKj4obm9kZS0+dXNlcl9kYXRhKTsKLSAgLy8gIGNvbnN0IGJvb2wgdXNlX2xheWVyX25vcm0gPSBvcF9kYXRhLT51c2VfbGF5ZXJfbm9ybTsKLSAgLy8gIGNvbnN0IGJvb2wgdGltZV9tYWpvciA9IHBhcmFtcy0+dGltZV9tYWpvcjsKLQotICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dCA9IHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dCgKLSAgICAgIGNvbnRleHQsIG5vZGUsIG1pY3JvOjpsc3RtOjpmdWxsOjprSW5wdXRUZW5zb3IpOwotICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dF90b19pbnB1dF93ZWlnaHRzID0gdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KAotICAgICAgY29udGV4dCwgbm9kZSwgbWljcm86OmxzdG06OmZ1bGw6OmtJbnB1dFRvSW5wdXRXZWlnaHRzVGVuc29yKTsKLSAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXRfdG9fZm9yZ2V0X3dlaWdodHMgPSB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsSW5wdXQoCi0gICAgICBjb250ZXh0LCBub2RlLCBtaWNybzo6bHN0bTo6ZnVsbDo6a0lucHV0VG9Gb3JnZXRXZWlnaHRzVGVuc29yKTsKLSAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXRfdG9fY2VsbF93ZWlnaHRzID0gdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KAotICAgICAgY29udGV4dCwgbm9kZSwgbWljcm86OmxzdG06OmZ1bGw6OmtJbnB1dFRvQ2VsbFdlaWdodHNUZW5zb3IpOwotICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dF90b19vdXRwdXRfd2VpZ2h0cyA9IHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dCgKLSAgICAgIGNvbnRleHQsIG5vZGUsIG1pY3JvOjpsc3RtOjpmdWxsOjprSW5wdXRUb091dHB1dFdlaWdodHNUZW5zb3IpOwotICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiByZWN1cnJlbnRfdG9faW5wdXRfd2VpZ2h0cyA9Ci0gICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsSW5wdXQoCi0gICAgICAgICAgY29udGV4dCwgbm9kZSwgbWljcm86OmxzdG06OmZ1bGw6OmtSZWN1cnJlbnRUb0lucHV0V2VpZ2h0c1RlbnNvcik7Ci0gIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIHJlY3VycmVudF90b19mb3JnZXRfd2VpZ2h0cyA9Ci0gICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsSW5wdXQoCi0gICAgICAgICAgY29udGV4dCwgbm9kZSwgbWljcm86OmxzdG06OmZ1bGw6OmtSZWN1cnJlbnRUb0ZvcmdldFdlaWdodHNUZW5zb3IpOwotICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiByZWN1cnJlbnRfdG9fY2VsbF93ZWlnaHRzID0KLSAgICAgIHRmbGl0ZTo6bWljcm86OkdldEV2YWxJbnB1dCgKLSAgICAgICAgICBjb250ZXh0LCBub2RlLCBtaWNybzo6bHN0bTo6ZnVsbDo6a1JlY3VycmVudFRvQ2VsbFdlaWdodHNUZW5zb3IpOwotICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiByZWN1cnJlbnRfdG9fb3V0cHV0X3dlaWdodHMgPQotICAgICAgdGZsaXRlOjptaWNybzo6R2V0RXZhbElucHV0KAotICAgICAgICAgIGNvbnRleHQsIG5vZGUsIG1pY3JvOjpsc3RtOjpmdWxsOjprUmVjdXJyZW50VG9PdXRwdXRXZWlnaHRzVGVuc29yKTsKLSAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogY2VsbF90b19pbnB1dF93ZWlnaHRzID0gY29udGV4dC0+R2V0RXZhbFRlbnNvcigKLSAgICAgIGNvbnRleHQsCi0gICAgICBub2RlLT5pbnB1dHMtPmRhdGFbbWljcm86OmxzdG06OmZ1bGw6OmtDZWxsVG9JbnB1dFdlaWdodHNUZW5zb3JdKTsKLSAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogY2VsbF90b19mb3JnZXRfd2VpZ2h0cyA9IGNvbnRleHQtPkdldEV2YWxUZW5zb3IoCi0gICAgICBjb250ZXh0LAotICAgICAgbm9kZS0+aW5wdXRzLT5kYXRhW21pY3JvOjpsc3RtOjpmdWxsOjprQ2VsbFRvRm9yZ2V0V2VpZ2h0c1RlbnNvcl0pOwotICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBjZWxsX3RvX291dHB1dF93ZWlnaHRzID0gY29udGV4dC0+R2V0RXZhbFRlbnNvcigKLSAgICAgIGNvbnRleHQsCi0gICAgICBub2RlLT5pbnB1dHMtPmRhdGFbbWljcm86OmxzdG06OmZ1bGw6OmtDZWxsVG9PdXRwdXRXZWlnaHRzVGVuc29yXSk7Ci0gIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0X2dhdGVfYmlhcyA9IGNvbnRleHQtPkdldEV2YWxUZW5zb3IoCi0gICAgICBjb250ZXh0LCBub2RlLT5pbnB1dHMtPmRhdGFbbWljcm86OmxzdG06OmZ1bGw6OmtJbnB1dEdhdGVCaWFzVGVuc29yXSk7Ci0KLSAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogZm9yZ2V0X2dhdGVfYmlhcyA9IGNvbnRleHQtPkdldEV2YWxUZW5zb3IoCi0gICAgICBjb250ZXh0LCBub2RlLT5pbnB1dHMtPmRhdGFbbWljcm86OmxzdG06OmZ1bGw6OmtGb3JnZXRHYXRlQmlhc1RlbnNvcl0pOwotICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBjZWxsX2dhdGVfYmlhcyA9IGNvbnRleHQtPkdldEV2YWxUZW5zb3IoCi0gICAgICBjb250ZXh0LCBub2RlLT5pbnB1dHMtPmRhdGFbbWljcm86OmxzdG06OmZ1bGw6OmtDZWxsR2F0ZUJpYXNUZW5zb3JdKTsKLSAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogb3V0cHV0X2dhdGVfYmlhcyA9IGNvbnRleHQtPkdldEV2YWxUZW5zb3IoCi0gICAgICBjb250ZXh0LCBub2RlLT5pbnB1dHMtPmRhdGFbbWljcm86OmxzdG06OmZ1bGw6OmtPdXRwdXRHYXRlQmlhc1RlbnNvcl0pOwotCi0gIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIHByb2plY3Rpb25fd2VpZ2h0cyA9IGNvbnRleHQtPkdldEV2YWxUZW5zb3IoCi0gICAgICBjb250ZXh0LCBub2RlLT5pbnB1dHMtPmRhdGFbbWljcm86OmxzdG06OmZ1bGw6OmtQcm9qZWN0aW9uV2VpZ2h0c1RlbnNvcl0pOwotICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBwcm9qZWN0aW9uX2JpYXMgPSBjb250ZXh0LT5HZXRFdmFsVGVuc29yKAotICAgICAgY29udGV4dCwgbm9kZS0+aW5wdXRzLT5kYXRhW21pY3JvOjpsc3RtOjpmdWxsOjprUHJvamVjdGlvbkJpYXNUZW5zb3JdKTsKLQotICBUZkxpdGVFdmFsVGVuc29yKiBvdXRwdXRfc3RhdGUgPSBjb250ZXh0LT5HZXRFdmFsVGVuc29yKAotICAgICAgY29udGV4dCwgbm9kZS0+aW5wdXRzLT5kYXRhW21pY3JvOjpsc3RtOjpmdWxsOjprT3V0cHV0U3RhdGVUZW5zb3JdKTsKLSAgVEZMSVRFX0RDSEVDSyhvdXRwdXRfc3RhdGUgIT0gbnVsbHB0cik7Ci0gIFRmTGl0ZUV2YWxUZW5zb3IqIGNlbGxfc3RhdGUgPSBjb250ZXh0LT5HZXRFdmFsVGVuc29yKAotICAgICAgY29udGV4dCwgbm9kZS0+aW5wdXRzLT5kYXRhW21pY3JvOjpsc3RtOjpmdWxsOjprQ2VsbFN0YXRlVGVuc29yXSk7Ci0gIFRGTElURV9EQ0hFQ0soY2VsbF9zdGF0ZSAhPSBudWxscHRyKTsKLSAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXRfbGF5ZXJfbm9ybV9jb2VmZmljaWVudHMgPQotICAgICAgY29udGV4dC0+R2V0RXZhbFRlbnNvcigKLSAgICAgICAgICBjb250ZXh0LAotICAgICAgICAgIG5vZGUtPmlucHV0cwotICAgICAgICAgICAgICAtPmRhdGFbbWljcm86OmxzdG06OmZ1bGw6OmtJbnB1dExheWVyTm9ybUNvZWZmaWNpZW50c1RlbnNvcl0pOwotCi0gIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGZvcmdldF9sYXllcl9ub3JtX2NvZWZmaWNpZW50cyA9Ci0gICAgICBjb250ZXh0LT5HZXRFdmFsVGVuc29yKAotICAgICAgICAgIGNvbnRleHQsCi0gICAgICAgICAgbm9kZS0+aW5wdXRzCi0gICAgICAgICAgICAgIC0+ZGF0YVttaWNybzo6bHN0bTo6ZnVsbDo6a0ZvcmdldExheWVyTm9ybUNvZWZmaWNpZW50c1RlbnNvcl0pOwotICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBjZWxsX2xheWVyX25vcm1fY29lZmZpY2llbnRzID0gY29udGV4dC0+R2V0RXZhbFRlbnNvcigKLSAgICAgIGNvbnRleHQsCi0gICAgICBub2RlLT5pbnB1dHMtPmRhdGFbbWljcm86OmxzdG06OmZ1bGw6OmtDZWxsTGF5ZXJOb3JtQ29lZmZpY2llbnRzVGVuc29yXSk7Ci0KLSAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogb3V0cHV0X2xheWVyX25vcm1fY29lZmZpY2llbnRzID0KLSAgICAgIGNvbnRleHQtPkdldEV2YWxUZW5zb3IoCi0gICAgICAgICAgY29udGV4dCwKLSAgICAgICAgICBub2RlLT5pbnB1dHMKLSAgICAgICAgICAgICAgLT5kYXRhW21pY3JvOjpsc3RtOjpmdWxsOjprT3V0cHV0TGF5ZXJOb3JtQ29lZmZpY2llbnRzVGVuc29yXSk7Ci0KLSAgVGZMaXRlRXZhbFRlbnNvciogb3V0cHV0ID0gdGZsaXRlOjptaWNybzo6R2V0RXZhbE91dHB1dCgKLSAgICAgIGNvbnRleHQsIG5vZGUsIG1pY3JvOjpsc3RtOjpmdWxsOjprT3V0cHV0VGVuc29yKTsKLQotICAvLyBDb3B5IG91dCB0aGUgTFNUTSBzcGVjaWZpYyBwYXJhbXMgc28gdGhleSBjYW4gYmUgcGFzc2VkIGluIHRoZSBmdW5jdGlvbi4KLSAgVGZMaXRlTFNUTVBhcmFtcyBsc3RtX3BhcmFtczsKLSAgbHN0bV9wYXJhbXMuYWN0aXZhdGlvbiA9IHBhcmFtcy0+YWN0aXZhdGlvbjsKLSAgbHN0bV9wYXJhbXMuY2VsbF9jbGlwID0gcGFyYW1zLT5jZWxsX2NsaXA7Ci0gIGxzdG1fcGFyYW1zLnByb2pfY2xpcCA9IHBhcmFtcy0+cHJval9jbGlwOwotICBsc3RtX3BhcmFtcy5hc3ltbWV0cmljX3F1YW50aXplX2lucHV0cyA9IHBhcmFtcy0+YXN5bW1ldHJpY19xdWFudGl6ZV9pbnB1dHM7Ci0gIHN3aXRjaCAoaW5wdXRfdG9fb3V0cHV0X3dlaWdodHMtPnR5cGUpIHsKLSAgICBjYXNlIGtUZkxpdGVJbnQ4OiB7Ci0gICAgICBjb25zdCBib29sIGlzX2h5YnJpZCA9IGlucHV0LT50eXBlID09IGtUZkxpdGVGbG9hdDMyOwotICAgICAgaWYgKGlzX2h5YnJpZCkgewotICAgICAgICBNaWNyb1ByaW50ZigiIGh5YnJpZCB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQuIik7Ci0gICAgICAgIHJldHVybiBrVGZMaXRlRXJyb3I7Ci0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFRmTGl0ZUV2YWxUZW5zb3IqIHNjcmF0Y2hbNl07Ci0gICAgICAgIC8vIEFsbG9jYXRlIHNjcmF0Y2ggYnVmZmVyLiBOZWVkIDYgMTZiaXQgYnVmZmVyIHdpdGggc2l6ZSBuX2JhdGNoICoKLSAgICAgICAgLy8gbl9jZWxsCi0gICAgICAgIC8vIGFuZCAxIDhiaXQgYnVmZmVyIHdpdGggc2l6ZSBuX2JhdGNoICogbl9jZWxsLiBXZSBhbHNvIG5lZWQgMSAzMiBiaXQKLSAgICAgICAgLy8gYnVmZmVyIHdpdGggc2l6ZSBuX2JhdGNoICogbl9jZWxsLgotICAgICAgICAvLwotICAgICAgICAvLyBIYW5kbGUgY2lmZyBjYXNlIGFzIHdlbGwsIHdoaWNoIG1pZ2h0IHNhdmUgb25lIGJ1ZmZlci4KLQotICAgICAgICBjb25zdCBhdXRvKiB0bXBfcGFyYW1zID0KLSAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8VGZMaXRlVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1QYXJhbXMqPigKLSAgICAgICAgICAgICAgICBub2RlLT5idWlsdGluX2RhdGEpOwotICAgICAgICBjb25zdCBib29sIHRpbWVfbWFqb3IgPSB0bXBfcGFyYW1zLT50aW1lX21ham9yOwotICAgICAgICBmb3IgKGludCBzY3JhdGNoX2luZGV4ID0gMDsgc2NyYXRjaF9pbmRleCA8IDY7ICsrc2NyYXRjaF9pbmRleCkgewotICAgICAgICAgIFRGTElURV9EQ0hFQ0soY29udGV4dCAhPSBudWxscHRyKTsKLSAgICAgICAgICBURkxJVEVfRENIRUNLKGNvbnRleHQtPkdldFNjcmF0Y2hCdWZmZXIgIT0gbnVsbHB0cik7Ci0gICAgICAgICAgaW50MzJfdCogc2NyYXRjaF90ZW5zb3IgPQotICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90Kj4oY29udGV4dC0+R2V0U2NyYXRjaEJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgIGNvbnRleHQsIG9wX2RhdGEtPnNjcmF0Y2hfdGVuc29yX2luZGV4ICsgc2NyYXRjaF9pbmRleCkpOwotICAgICAgICAgIHNjcmF0Y2hbc2NyYXRjaF9pbmRleF0gPSAoVGZMaXRlRXZhbFRlbnNvciopc2NyYXRjaF90ZW5zb3I7Ci0gICAgICAgIH0KLSAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEZfTElURV9FTlNVUkVfT0soY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFNjcmF0Y2hTYWZlKGNvbnRleHQsIG5vZGUsIDAsCi0gICAgICAgICAgICZzY3JhdGNoMCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRGX0xJVEVfRU5TVVJFX09LKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRTY3JhdGNoU2FmZShjb250ZXh0LCBub2RlLCAxLAotICAgICAgICAgICAmc2NyYXRjaDEpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURl9MSVRFX0VOU1VSRV9PSyhjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0U2NyYXRjaFNhZmUoY29udGV4dCwgbm9kZSwgMiwKLSAgICAgICAgICAgJnNjcmF0Y2gyKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEZfTElURV9FTlNVUkVfT0soY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldFNjcmF0Y2hTYWZlKGNvbnRleHQsIG5vZGUsIDMsCi0gICAgICAgICAgICZzY3JhdGNoMykpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRGX0xJVEVfRU5TVVJFX09LKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRTY3JhdGNoU2FmZShjb250ZXh0LCBub2RlLCA0LAotICAgICAgICAgICAmc2NyYXRjaDQpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURl9MSVRFX0VOU1VSRV9PSyhjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0U2NyYXRjaFNhZmUoY29udGV4dCwgbm9kZSwgNSwKLSAgICAgICAgICAgJnNjcmF0Y2g1KSk7Ci0gICAgICAgICovCi0gICAgICAgIHJldHVybiBsc3RtX2V2YWw6OkV2YWxJbnRlZ2VyOHg4XzE2KAotICAgICAgICAgICAgY29udGV4dCwgbm9kZSwgaW5wdXQsIGlucHV0X3RvX2lucHV0X3dlaWdodHMsCi0gICAgICAgICAgICBpbnB1dF90b19mb3JnZXRfd2VpZ2h0cywgaW5wdXRfdG9fY2VsbF93ZWlnaHRzLAotICAgICAgICAgICAgaW5wdXRfdG9fb3V0cHV0X3dlaWdodHMsIHJlY3VycmVudF90b19pbnB1dF93ZWlnaHRzLAotICAgICAgICAgICAgcmVjdXJyZW50X3RvX2ZvcmdldF93ZWlnaHRzLCByZWN1cnJlbnRfdG9fY2VsbF93ZWlnaHRzLAotICAgICAgICAgICAgcmVjdXJyZW50X3RvX291dHB1dF93ZWlnaHRzLCBjZWxsX3RvX2lucHV0X3dlaWdodHMsCi0gICAgICAgICAgICBjZWxsX3RvX2ZvcmdldF93ZWlnaHRzLCBjZWxsX3RvX291dHB1dF93ZWlnaHRzLAotICAgICAgICAgICAgaW5wdXRfbGF5ZXJfbm9ybV9jb2VmZmljaWVudHMsIGZvcmdldF9sYXllcl9ub3JtX2NvZWZmaWNpZW50cywKLSAgICAgICAgICAgIGNlbGxfbGF5ZXJfbm9ybV9jb2VmZmljaWVudHMsIG91dHB1dF9sYXllcl9ub3JtX2NvZWZmaWNpZW50cywKLSAgICAgICAgICAgIGlucHV0X2dhdGVfYmlhcywgZm9yZ2V0X2dhdGVfYmlhcywgY2VsbF9nYXRlX2JpYXMsIG91dHB1dF9nYXRlX2JpYXMsCi0gICAgICAgICAgICBwcm9qZWN0aW9uX3dlaWdodHMsIHByb2plY3Rpb25fYmlhcywgJmxzdG1fcGFyYW1zLAotICAgICAgICAgICAgLypmb3J3YXJkX3NlcXVlbmNlPSovdHJ1ZSwgdGltZV9tYWpvciwgJm9wX2RhdGEtPmludGVnZXJfbHN0bV9wYXJhbSwKLSAgICAgICAgICAgIG91dHB1dF9zdGF0ZSwgY2VsbF9zdGF0ZSwgb3V0cHV0LCBzY3JhdGNoWzBdLCBzY3JhdGNoWzFdLAotICAgICAgICAgICAgc2NyYXRjaFsyXSwgc2NyYXRjaFszXSwgc2NyYXRjaFs0XSwgc2NyYXRjaFs1XSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZGVmYXVsdDoKLSAgICAgIE1pY3JvUHJpbnRmKCJUeXBlICVzIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLiIsCi0gICAgICAgICAgICAgICAgICBUZkxpdGVUeXBlR2V0TmFtZShpbnB1dF90b19vdXRwdXRfd2VpZ2h0cy0+dHlwZSkpOwotICAgICAgcmV0dXJuIGtUZkxpdGVFcnJvcjsKLSAgfQotICByZXR1cm4ga1RmTGl0ZU9rOwotfQotLy99ICAvLyBuYW1lc3BhY2UgdW5pZGlyZWN0aW9uYWxfc2VxdWVuY2VfbHN0bQotCi19ICAvLyBuYW1lc3BhY2UgbWljcm8KLX0gIC8vIG5hbWVzcGFjZSBvcHMKLQogVEZMTVJlZ2lzdHJhdGlvbiBSZWdpc3Rlcl9VTklESVJFQ1RJT05BTF9TRVFVRU5DRV9MU1RNKCkgewotICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChvcHM6Om1pY3JvOjpJbml0LCBvcHM6Om1pY3JvOjpQcmVwYXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHM6Om1pY3JvOjpFdmFsKTsKKyAgcmV0dXJuIHRmbGl0ZTo6bWljcm86OlJlZ2lzdGVyT3AoVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxzdG1Jbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTHN0bVByZXBhcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMc3RtRXZhbCk7CiB9CiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EveHRlbnNhLmggYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EveHRlbnNhLmgKaW5kZXggNDc4MjBkMy4uNjA0NzM2ZCAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL3h0ZW5zYS5oCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS94dGVuc2EuaApAQCAtMjIsMTMgKzIyLDEzIEBACiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL2hpZmltaW5pL2ZpeGVkcG9pbnRfdXRpbHMuaCIKICNlbmRpZiAgLy8gZGVmaW5lZChISUZNSU5JKQogCi0jaWYgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKKyNpZiBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQogI2luY2x1ZGUgImluY2x1ZGUvbm5saWIveGFfbm5saWJfYXBpLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9ubmxpYi94YV9ubmxpYl9zdGFuZGFyZHMuaCIKIAogI2RlZmluZSBBTElHTkVEX1NJWkUoeCwgYnl0ZXMpICgoKHgpICsgKGJ5dGVzIC0gMSkpICYgKH4oYnl0ZXMgLSAxKSkpCiAjZGVmaW5lIEFMSUdOX1BUUih4LCBieXRlcykgKCgoKHVuc2lnbmVkKSh4KSkgKyAoYnl0ZXMgLSAxKSkgJiAofihieXRlcyAtIDEpKSkKLSNlbmRpZiAgLy8gZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKKyNlbmRpZiAgLy8gZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKIAogI2lmIGRlZmluZWQoVklTSU9OX1A2KQogI2luY2x1ZGUgInV0aWxzLmgiCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EveHRlbnNhX2NvbnYuaCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS94dGVuc2FfY29udi5oCmluZGV4IDM1NWYwMjIuLmY4MDRhNmQgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS94dGVuc2FfY29udi5oCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS94dGVuc2FfY29udi5oCkBAIC0yNSw5ICsyNSw5IEBACiBzdHJ1Y3QgWHRlbnNhQ29udk9wRGF0YSB7CiAgIE9wRGF0YUNvbnYgcmVmZXJlbmNlX29wX2RhdGE7CiAKLSNpZiBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQorI2lmIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCiAgIGludCBzY3JhdGNoX3RlbnNvcl9pbmRleDsKLSNlbmRpZiAgLy8gZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKKyNlbmRpZiAgLy8gZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKIAogI2lmIGRlZmluZWQoVklTSU9OX1A2KQogICBpbnQ4X3QqIHJlb3JkZXJfY29lZmZpY2llbnRfYmlhczsgIC8vIGJ1ZmZlcnMgdXNlZCB0byBrZWVwIHJlb3JkZXJlZCBjb2VmZiBhbmQKQEAgLTM2LDMwICszNiwzMCBAQAogICBpbnQ4X3QqIHBlcl9jaGFubmVsX291dHB1dF9zaGlmdF9pbnQ4OwogICB1aW50OF90KiBwX2NvbnRleHQ7ICAvLyBwZXJzaXN0ZW50IGxpYiBjb250ZXh0IGZvciB0aGlzIGluc3RhbmNlIHNhdmVkIGhlcmUKICAgdWludDMyX3QgY29udGV4dF9zaXplOworICBib29sIGlzX3Blcl9jaGFubmVsX3F1YW50aXplZDsKICNlbmRpZiAgLy8gVklTSU9OX1A2CiB9OwogCi0jaWYgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKKyNpZiBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQogVGZMaXRlU3RhdHVzIENvbnZQcmVwYXJlSGlmaShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlKTsKIAotVGZMaXRlU3RhdHVzIENvbnZFdmFsSGlmaShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZkxpdGVDb252UGFyYW1zJiBwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFh0ZW5zYUNvbnZPcERhdGEmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGJpYXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dCk7Ci0jZW5kaWYgIC8vIGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCitUZkxpdGVTdGF0dXMgQ29udkV2YWxIaWZpSW50OChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGZMaXRlQ29udlBhcmFtcyYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgWHRlbnNhQ29udk9wRGF0YSYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogZmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogYmlhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dCk7CiAKLSNpZiBkZWZpbmVkKEhJRkk0KQotVGZMaXRlU3RhdHVzIENvbnZFdmFsSGlmaTE2KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGZMaXRlQ29udlBhcmFtcyYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFh0ZW5zYUNvbnZPcERhdGEmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciogZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGJpYXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGZMaXRlRXZhbFRlbnNvciogb3V0cHV0KTsKLSNlbmRpZiAgLy8gZGVmaW5lZChISUZJNCkKK1RmTGl0ZVN0YXR1cyBDb252RXZhbEhpZmlJbnQxNihUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBUZkxpdGVOb2RlKiBub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZUNvbnZQYXJhbXMmIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBYdGVuc2FDb252T3BEYXRhJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIGZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBiaWFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRmTGl0ZUV2YWxUZW5zb3IqIG91dHB1dCk7CisKKyNlbmRpZiAgLy8gZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKIAogI2lmIGRlZmluZWQoVklTSU9OX1A2KQogCkBAIC03OSw2ICs3OSw5IEBACiAKIFRmTGl0ZVN0YXR1cyBDb252UmVmZXJlbmNlRXZhbEludDE2KFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpOwogCit2b2lkKiBDb252SW5pdFh0ZW5zYShUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBidWZmZXIsIHNpemVfdCBsZW5ndGgpOworVGZMaXRlU3RhdHVzIENvbnZQcmVwYXJlWHRlbnNhKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpOworCiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCiAKICNlbmRpZiAgLy8gVEVOU09SRkxPV19MSVRFX01JQ1JPX0tFUk5FTFNfWFRFTlNBX1hURU5TQV9DT05WX0hfCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EveHRlbnNhX2RlcHRod2lzZV9jb252LmggYi90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EveHRlbnNhX2RlcHRod2lzZV9jb252LmgKaW5kZXggY2ExNTcxOS4uN2QwZDc2NSAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL3h0ZW5zYV9kZXB0aHdpc2VfY29udi5oCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS94dGVuc2FfZGVwdGh3aXNlX2NvbnYuaApAQCAtMjUsOSArMjUsOSBAQAogc3RydWN0IFh0ZW5zYURlcHRod2lzZUNvbnZPcERhdGEgewogICBPcERhdGFDb252IHJlZmVyZW5jZV9vcF9kYXRhOwogCi0jaWYgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKKyNpZiBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQogICBpbnQgc2NyYXRjaF90ZW5zb3JfaW5kZXg7Ci0jZW5kaWYgIC8vIGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCisjZW5kaWYgIC8vIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCiAKICNpZiBkZWZpbmVkKFZJU0lPTl9QNikKICAgaW50OF90KiByZW9yZGVyX2NvZWZmaWNpZW50X2JpYXM7ICAvLyBidWZmZXJzIHVzZWQgdG8ga2VlcCByZW9yZGVyZWQgY29lZmYgYW5kCkBAIC0zOSw3ICszOSw3IEBACiAjZW5kaWYgIC8vIFZJU0lPTl9QNgogfTsKIAotI2lmIGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCisjaWYgZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKIFRmTGl0ZVN0YXR1cyBEZXB0aHdpc2VDb252UHJlcGFyZUhpZmkoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSk7CiAKIFRmTGl0ZVN0YXR1cyBEZXB0aHdpc2VDb252RXZhbEhpZmkoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSwKQEAgLTUyLDcgKzUyLDcgQEAKIAogVGZMaXRlU3RhdHVzIERlcHRod2lzZUNvbnZSZWZlcmVuY2VFdmFsSW50OChUZkxpdGVDb250ZXh0KiBjb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZkxpdGVOb2RlKiBub2RlKTsKLSNlbmRpZiAgLy8gZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKKyNlbmRpZiAgLy8gZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKIAogI2lmIGRlZmluZWQoVklTSU9OX1A2KQogCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EveHRlbnNhX3NvZnRtYXguaCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS94dGVuc2Ffc29mdG1heC5oCmluZGV4IDdkMGQ0NjEuLmQ3ZTZhMTQgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS94dGVuc2Ffc29mdG1heC5oCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS94dGVuc2Ffc29mdG1heC5oCkBAIC0yMiwxMiArMjIsMTIgQEAKIAogbmFtZXNwYWNlIHRmbGl0ZSB7CiAKLSNpZiBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQorI2lmIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCiBzdHJ1Y3QgWHRlbnNhU29mdG1heE9wRGF0YSB7CiAgIFNvZnRtYXhQYXJhbXMgcGFyYW1zOwogICBpbnQgc2NyYXRjaF90ZW5zb3JfaW5kZXg7CiB9OwotI2VuZGlmICAvLyBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQorI2VuZGlmICAvLyBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KQogCiAjaWYgZGVmaW5lZChWSVNJT05fUDYpCiBzdHJ1Y3QgWHRlbnNhU29mdG1heE9wRGF0YSB7CmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy96ZXJvc19saWtlLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvemVyb3NfbGlrZS5jYwppbmRleCA1OTdlNTBlLi5lYjFmOWM2IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy96ZXJvc19saWtlLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3plcm9zX2xpa2UuY2MKQEAgLTI1LDcgKzI1LDcgQEAKIGNvbnN0ZXhwciBpbnQga0lucHV0VGVuc29yID0gMDsKIGNvbnN0ZXhwciBpbnQga091dHB1dFRlbnNvciA9IDA7CiAKLVRmTGl0ZVN0YXR1cyBQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKK1RmTGl0ZVN0YXR1cyBaZXJvc0xpa2VQcmVwYXJlKFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIFRmTGl0ZU5vZGUqIG5vZGUpIHsKICAgTWljcm9Db250ZXh0KiBtaWNyb19jb250ZXh0ID0gR2V0TWljcm9Db250ZXh0KGNvbnRleHQpOwogCiAgIFRGX0xJVEVfRU5TVVJFX0VRKGNvbnRleHQsIE51bUlucHV0cyhub2RlKSwgMSk7CkBAIC01MCw3ICs1MCw3IEBACiAgIH0KIH0KIAotVGZMaXRlU3RhdHVzIEV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgeworVGZMaXRlU3RhdHVzIFplcm9zTGlrZUV2YWwoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSkgewogICBjb25zdCBUZkxpdGVFdmFsVGVuc29yKiBpbnB1dCA9CiAgICAgICB0ZmxpdGU6Om1pY3JvOjpHZXRFdmFsSW5wdXQoY29udGV4dCwgbm9kZSwga0lucHV0VGVuc29yKTsKICAgVGZMaXRlRXZhbFRlbnNvciogb3V0cHV0ID0KQEAgLTgyLDcgKzgyLDcgQEAKIH0gIC8vIG5hbWVzcGFjZQogCiBURkxNUmVnaXN0cmF0aW9uIFJlZ2lzdGVyX1pFUk9TX0xJS0UoKSB7Ci0gIHJldHVybiB0ZmxpdGU6Om1pY3JvOjpSZWdpc3Rlck9wKG51bGxwdHIsIFByZXBhcmUsIEV2YWwpOworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChudWxscHRyLCBaZXJvc0xpa2VQcmVwYXJlLCBaZXJvc0xpa2VFdmFsKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL21lbW9yeV9hcmVuYV90aHJlc2hvbGRfdGVzdC5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9tZW1vcnlfYXJlbmFfdGhyZXNob2xkX3Rlc3QuY2MKaW5kZXggZjZiYjI0Zi4uMzAxN2Y1NiAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL21lbW9yeV9hcmVuYV90aHJlc2hvbGRfdGVzdC5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWVtb3J5X2FyZW5hX3RocmVzaG9sZF90ZXN0LmNjCkBAIC05Nyw3ICs5Nyw3IEBACiAvLyBUYWlsIHNpemUgY29udHJpYnV0ZWQgYnkgdGhlIGNvbnYgbW9kZWwgZXhjbHVkaW5nIHRoZQogLy8gUmVjb3JkaW5nTWljcm9BbGxvY2F0b3IncyBvdmVyaGVhZAogLy8gVE9ETyhiLzIwNzE1NzYxMCk6IHJlcGxhY2UgbWFnaWMgbnVtYmVyIHRoYXQgZGVwZW5kcyBvbiBPUHMKLWNvbnN0ZXhwciBpbnQga1Rlc3RDb252TW9kZWxPbmx5VGFpbFNpemUgPSAxNzQ0OworY29uc3RleHByIGludCBrVGVzdENvbnZNb2RlbE9ubHlUYWlsU2l6ZSA9IDE4MTY7CiBjb25zdGV4cHIgaW50IGtUZXN0Q29udk1vZGVsUGVyc2lzdGVudFRmTGl0ZVRlbnNvckRhdGFTaXplID0gMTI4OwogY29uc3RleHByIGludCBrVGVzdENvbnZNb2RlbFBlcnNpc3RlbnRCdWZmZXJEYXRhU2l6ZSA9IDcyODsKICNlbHNlCkBAIC0xMDgsNyArMTA4LDcgQEAKIC8vIFRhaWwgc2l6ZSBjb250cmlidXRlZCBieSB0aGUgY29udiBtb2RlbCBleGNsdWRpbmcgdGhlCiAvLyBSZWNvcmRpbmdNaWNyb0FsbG9jYXRvcidzIG92ZXJoZWFkCiAvLyBUT0RPKGIvMjA3MTU3NjEwKTogcmVwbGFjZSBtYWdpYyBudW1iZXIgdGhhdCBkZXBlbmRzIG9uIE9QcwotY29uc3RleHByIGludCBrVGVzdENvbnZNb2RlbE9ubHlUYWlsU2l6ZSA9IDIwMTY7Citjb25zdGV4cHIgaW50IGtUZXN0Q29udk1vZGVsT25seVRhaWxTaXplID0gMjA4ODsKIGNvbnN0ZXhwciBpbnQga1Rlc3RDb252TW9kZWxQZXJzaXN0ZW50VGZMaXRlVGVuc29yRGF0YVNpemUgPSAyMjQ7CiBjb25zdGV4cHIgaW50IGtUZXN0Q29udk1vZGVsUGVyc2lzdGVudEJ1ZmZlckRhdGFTaXplID0gNzIwOwogI2VuZGlmCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWVtb3J5X2hlbHBlcnMuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWVtb3J5X2hlbHBlcnMuY2MKaW5kZXggNjg1ZjA0Yi4uOTRhNmZlMyAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL21lbW9yeV9oZWxwZXJzLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9tZW1vcnlfaGVscGVycy5jYwpAQCAtNTAsNiArNTAsOSBAQAogICAgIGNhc2Uga1RmTGl0ZUZsb2F0MTY6CiAgICAgICAqc2l6ZSA9IHNpemVvZihpbnQxNl90KTsKICAgICAgIGJyZWFrOworICAgIGNhc2Uga1RmTGl0ZUJGbG9hdDE2OgorICAgICAgKnNpemUgPSBzaXplb2YoaW50MTZfdCk7CisgICAgICBicmVhazsKICAgICBjYXNlIGtUZkxpdGVGbG9hdDMyOgogICAgICAgKnNpemUgPSBzaXplb2YoZmxvYXQpOwogICAgICAgYnJlYWs7CmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWVtb3J5X2hlbHBlcnNfdGVzdC5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9tZW1vcnlfaGVscGVyc190ZXN0LmNjCmluZGV4IGU0NGM1ODYuLjlkYTI5NDAgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9tZW1vcnlfaGVscGVyc190ZXN0LmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9tZW1vcnlfaGVscGVyc190ZXN0LmNjCkBAIC0xODAsOCArMTgwLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZsaXRlOjpUZkxpdGVUeXBlU2l6ZU9mKGtUZkxpdGVDb21wbGV4MTI4LCAmc2l6ZSkpOwogICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUShzaXplb2YoZG91YmxlKSAqIDIsIHNpemUpOwogCi0gIFRGX0xJVEVfTUlDUk9fRVhQRUNUX05FKAotICAgICAga1RmTGl0ZU9rLCB0ZmxpdGU6OlRmTGl0ZVR5cGVTaXplT2Yoc3RhdGljX2Nhc3Q8VGZMaXRlVHlwZT4oLTEpLCAmc2l6ZSkpOworICBURl9MSVRFX01JQ1JPX0VYUEVDVF9ORShrVGZMaXRlT2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRmbGl0ZTo6VGZMaXRlVHlwZVNpemVPZihrVGZMaXRlTm9UeXBlLCAmc2l6ZSkpOwogfQogCiBURl9MSVRFX01JQ1JPX1RFU1QoVGVzdEJ5dGVzUmVxdWlyZWRGb3JUZW5zb3IpIHsKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9tZW1vcnlfcGxhbm5lci9ncmVlZHlfbWVtb3J5X3BsYW5uZXIuaCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9tZW1vcnlfcGxhbm5lci9ncmVlZHlfbWVtb3J5X3BsYW5uZXIuaAppbmRleCBhZTM3MDVkLi5iMmNkYjYxIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWVtb3J5X3BsYW5uZXIvZ3JlZWR5X21lbW9yeV9wbGFubmVyLmgKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL21lbW9yeV9wbGFubmVyL2dyZWVkeV9tZW1vcnlfcGxhbm5lci5oCkBAIC0xMDcsNiArMTA3LDExIEBACiAgICAgcmV0dXJuIHBlcl9idWZmZXJfc2l6ZTsKICAgfQogCisgIC8vIFJldHVybnMgRmFsc2UgYmVjYXVzZSB0aGUgR3JlZWR5TWVtb3J5UGxhbm5lciBkb2Vzbid0IHByZXNlcnZlcyBhbGwgdGVuc29ycworICAvLyBhZnRlciBpbnZvY2F0aW9uLiBEbyB0byB0aGUgZmFjdCB0aGF0IHRlbnNvcnMgdGhhdCB0ZW5zb3IgZGF0YSBmb3IgdGVuc29ycworICAvLyB0aGF0IGFyZW4ndCBiZWluZyB1c2VkIGR1cmluZyBhIHBoYXNlIG9mIGludm9jYXRpb24gYXJlIG92ZXJ3cml0dGVuLgorICBib29sIHByZXNlcnZlc19hbGxfdGVuc29ycygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CisKICBwcml2YXRlOgogICAvLyBXaGV0aGVyIGEgYnVmZmVyIGlzIGFjdGl2ZSBpbiBhIGdpdmVuIHRpbWUgcmFuZ2UuCiAgIGJvb2wgRG9lc0VudHJ5T3ZlcmxhcEluVGltZShjb25zdCBMaXN0RW50cnkqIGVudHJ5LCBjb25zdCBpbnQgZmlyc3RfdGltZV91c2VkLApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL21lbW9yeV9wbGFubmVyL2xpbmVhcl9tZW1vcnlfcGxhbm5lci5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9tZW1vcnlfcGxhbm5lci9saW5lYXJfbWVtb3J5X3BsYW5uZXIuY2MKaW5kZXggNWM2YWZiNS4uMDBkNzA3YSAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL21lbW9yeV9wbGFubmVyL2xpbmVhcl9tZW1vcnlfcGxhbm5lci5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWVtb3J5X3BsYW5uZXIvbGluZWFyX21lbW9yeV9wbGFubmVyLmNjCkBAIC0xOSw2ICsxOSw5IEBACiAKIG5hbWVzcGFjZSB0ZmxpdGUgewogCisvLyBDKysxMSByZXF1aXJlcyBkZWZpbmluZyBhIGNvbnN0ZXhwciBzdGF0aWMgY2xhc3MgbWVtYmVyIGluIGEgLmNjIGZpbGUKK2NvbnN0ZXhwciBpbnQgdGZsaXRlOjpMaW5lYXJNZW1vcnlQbGFubmVyOjprTWF4QnVmZmVyQ291bnQ7CisKIExpbmVhck1lbW9yeVBsYW5uZXI6OkxpbmVhck1lbW9yeVBsYW5uZXIoKQogICAgIDogY3VycmVudF9idWZmZXJfY291bnRfKDApLCBuZXh0X2ZyZWVfb2Zmc2V0XygwKSB7fQogTGluZWFyTWVtb3J5UGxhbm5lcjo6fkxpbmVhck1lbW9yeVBsYW5uZXIoKSB7fQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL21lbW9yeV9wbGFubmVyL2xpbmVhcl9tZW1vcnlfcGxhbm5lci5oIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL21lbW9yeV9wbGFubmVyL2xpbmVhcl9tZW1vcnlfcGxhbm5lci5oCmluZGV4IGQ0OTM4ZGQuLjk4NTA1NjkgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9tZW1vcnlfcGxhbm5lci9saW5lYXJfbWVtb3J5X3BsYW5uZXIuaAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWVtb3J5X3BsYW5uZXIvbGluZWFyX21lbW9yeV9wbGFubmVyLmgKQEAgLTM1LDYgKzM1LDEwIEBACiAgIGludCBHZXRCdWZmZXJDb3VudCgpIG92ZXJyaWRlOwogICBUZkxpdGVTdGF0dXMgR2V0T2Zmc2V0Rm9yQnVmZmVyKGludCBidWZmZXJfaW5kZXgsIGludCogb2Zmc2V0KSBvdmVycmlkZTsKIAorICAvLyBSZXR1cm5zIFRydWUgYmVjYXVzZSB0aGUgTGluZWFyTWVtb3J5UGxhbm5lciBwcmVzZXJ2ZXMgYWxsIHRlbnNvcnMgYWZ0ZXIKKyAgLy8gaW52b2NhdGlvbi4KKyAgYm9vbCBwcmVzZXJ2ZXNfYWxsX3RlbnNvcnMoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisKICBwcml2YXRlOgogICBzdGF0aWMgY29uc3RleHByIGludCBrTWF4QnVmZmVyQ291bnQgPSAxMDI0OwogICBzaXplX3QgYnVmZmVyX29mZnNldHNfW2tNYXhCdWZmZXJDb3VudF07CmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWVtb3J5X3BsYW5uZXIvbWljcm9fbWVtb3J5X3BsYW5uZXIuaCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9tZW1vcnlfcGxhbm5lci9taWNyb19tZW1vcnlfcGxhbm5lci5oCmluZGV4IDBiZmU2OTMuLjAzNWY0NjcgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9tZW1vcnlfcGxhbm5lci9taWNyb19tZW1vcnlfcGxhbm5lci5oCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9tZW1vcnlfcGxhbm5lci9taWNyb19tZW1vcnlfcGxhbm5lci5oCkBAIC04MSw2ICs4MSwxMCBAQAogICAgIHJldHVybiBrVGZMaXRlT2s7CiAgIH0KIAorICAvLyBNZXRob2Qgd2lsbCByZXR1cm4gVHJ1ZSBpZiB0aGUgTWljcm9NZW1vcnlQbGFubmVyIHByZXNlcnZlcyBhbGwgdGVuc29ycworICAvLyBhZnRlciBpbnZvY2F0aW9uLCBhbmQgRmFsc2UgaWYgaXQgZG9lc24ndC4KKyAgdmlydHVhbCBib29sIHByZXNlcnZlc19hbGxfdGVuc29ycygpIGNvbnN0ID0gMDsKKwogICB2aXJ0dWFsIHZvaWQgUHJpbnRNZW1vcnlQbGFuKCkgewogICAgIC8vIERlZmF1bHQgZG9lcyBub3RoaW5nLgogICB9CmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWVtb3J5X3BsYW5uZXIvbm9uX3BlcnNpc3RlbnRfYnVmZmVyX3BsYW5uZXJfc2hpbS5oIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL21lbW9yeV9wbGFubmVyL25vbl9wZXJzaXN0ZW50X2J1ZmZlcl9wbGFubmVyX3NoaW0uaAppbmRleCA4ZjliYjI2Li4xM2EzZmFkIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWVtb3J5X3BsYW5uZXIvbm9uX3BlcnNpc3RlbnRfYnVmZmVyX3BsYW5uZXJfc2hpbS5oCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9tZW1vcnlfcGxhbm5lci9ub25fcGVyc2lzdGVudF9idWZmZXJfcGxhbm5lcl9zaGltLmgKQEAgLTExNSw2ICsxMTUsMTAgQEAKICAgc2l6ZV90IEdldE1heGltdW1NZW1vcnlTaXplKCkgb3ZlcnJpZGU7CiAgIGludCBHZXRCdWZmZXJDb3VudCgpIG92ZXJyaWRlOwogCisgIC8vIFJldHVybnMgRmFsc2UgYmVjYXVzZSB0aGUgTm9uUGVyc2lzdGVudE1lbW9yeVBsYW5uZXJTaGltIGRvZXNuJ3QgcHJlc2VydmVzCisgIC8vIGFsbCB0ZW5zb3JzIGFmdGVyIGludm9jYXRpb24uCisgIGJvb2wgcHJlc2VydmVzX2FsbF90ZW5zb3JzKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKwogIHByaXZhdGU6CiAgIGNvbnN0IEJ1ZmZlclBsYW4qIGJ1ZmZlcl9wbGFuXzsgIC8vIG5vdCBvd25lZCwgY2FuJ3QgYmUgbnVsbAogCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fYWxsb2NhdGlvbl9pbmZvLmggYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fYWxsb2NhdGlvbl9pbmZvLmgKaW5kZXggNjg4ZDA0ZS4uYzBjN2JkNSAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2FsbG9jYXRpb25faW5mby5oCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19hbGxvY2F0aW9uX2luZm8uaApAQCAtMTI5LDcgKzEyOSw4IEBACiAKICAgY29uc3QgdGZsaXRlOjpNb2RlbCogbW9kZWxfID0gbnVsbHB0cjsKICAgSU5vblBlcnNpc3RlbnRCdWZmZXJBbGxvY2F0b3IqIG5vbl9wZXJzaXN0ZW50X2FsbG9jYXRvcl8gPSBudWxscHRyOwotICBHcmFwaEFsbG9jYXRpb25JbmZvIGluZm9fOworICBHcmFwaEFsbG9jYXRpb25JbmZvIGluZm9fID0KKyAgICAgIHt9OyAgLy8gUHJldmVudHMgcHJvYmxlbXMgY2F1c2VkIGJ5IGFjY2Vzc2luZyB1bmluaXRpYWxpemVkIG1lbW9yeS4KICAgaW50IGFsbG9jYXRpb25fc2NvcGVfY291bnRfID0gMDsKIH07CiAKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19hbGxvY2F0b3IuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fYWxsb2NhdG9yLmNjCmluZGV4IGJhN2NiNjYuLjkzMGRhNzUgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19hbGxvY2F0b3IuY2MKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2FsbG9jYXRvci5jYwpAQCAtMjgsMTMgKzI4LDEzIEBACiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2ZsYXRidWZmZXJfdXRpbHMuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWVtb3J5X2hlbHBlcnMuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWVtb3J5X3BsYW5uZXIvZ3JlZWR5X21lbW9yeV9wbGFubmVyLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21lbW9yeV9wbGFubmVyL2xpbmVhcl9tZW1vcnlfcGxhbm5lci5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9tZW1vcnlfcGxhbm5lci9taWNyb19tZW1vcnlfcGxhbm5lci5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19hbGxvY2F0aW9uX2luZm8uaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fYXJlbmFfY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2xvZy5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby90ZmxpdGVfYnJpZGdlL2ZsYXRidWZmZXJfY29udmVyc2lvbnNfYnJpZGdlLmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL3NjaGVtYS9zY2hlbWFfZ2VuZXJhdGVkLmgiCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL3NjaGVtYS9zY2hlbWFfdXRpbHMuaCIKIAogbmFtZXNwYWNlIHRmbGl0ZSB7CiAKQEAgLTcxLDYgKzcxLDI5IEBACiAgIElQZXJzaXN0ZW50QnVmZmVyQWxsb2NhdG9yKiBwZXJzaXN0ZW50X2FsbG9jYXRvcl87CiB9OwogCitNaWNyb01lbW9yeVBsYW5uZXIqIENyZWF0ZU1lbW9yeVBsYW5uZXIoCisgICAgTWVtb3J5UGxhbm5lclR5cGUgbWVtb3J5X3BsYW5uZXJfdHlwZSwKKyAgICBJUGVyc2lzdGVudEJ1ZmZlckFsbG9jYXRvciogbWVtb3J5X2FsbG9jYXRvcikgeworICBNaWNyb01lbW9yeVBsYW5uZXIqIG1lbW9yeV9wbGFubmVyID0gbnVsbHB0cjsKKyAgdWludDhfdCogbWVtb3J5X3BsYW5uZXJfYnVmZmVyID0gbnVsbHB0cjsKKworICBzd2l0Y2ggKG1lbW9yeV9wbGFubmVyX3R5cGUpIHsKKyAgICBjYXNlIE1lbW9yeVBsYW5uZXJUeXBlOjprTGluZWFyOiB7CisgICAgICBtZW1vcnlfcGxhbm5lcl9idWZmZXIgPSBtZW1vcnlfYWxsb2NhdG9yLT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIoCisgICAgICAgICAgc2l6ZW9mKExpbmVhck1lbW9yeVBsYW5uZXIpLCBhbGlnbm9mKExpbmVhck1lbW9yeVBsYW5uZXIpKTsKKyAgICAgIG1lbW9yeV9wbGFubmVyID0gbmV3IChtZW1vcnlfcGxhbm5lcl9idWZmZXIpIExpbmVhck1lbW9yeVBsYW5uZXIoKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIE1lbW9yeVBsYW5uZXJUeXBlOjprR3JlZWR5OiB7CisgICAgICBtZW1vcnlfcGxhbm5lcl9idWZmZXIgPSBtZW1vcnlfYWxsb2NhdG9yLT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIoCisgICAgICAgICAgc2l6ZW9mKEdyZWVkeU1lbW9yeVBsYW5uZXIpLCBhbGlnbm9mKEdyZWVkeU1lbW9yeVBsYW5uZXIpKTsKKyAgICAgIG1lbW9yeV9wbGFubmVyID0gbmV3IChtZW1vcnlfcGxhbm5lcl9idWZmZXIpIEdyZWVkeU1lbW9yeVBsYW5uZXIoKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gbWVtb3J5X3BsYW5uZXI7Cit9CisKIFRmTGl0ZVN0YXR1cyBDcmVhdGVQbGFuKE1pY3JvTWVtb3J5UGxhbm5lciogcGxhbm5lciwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFsbG9jYXRpb25JbmZvKiBhbGxvY2F0aW9uX2luZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYWxsb2NhdGlvbl9pbmZvX3NpemUpIHsKQEAgLTM3NCw4ICszOTcsOCBAQAogICByZXR1cm4gQ3JlYXRlKG1lbW9yeV9hbGxvY2F0b3IsIG1lbW9yeV9wbGFubmVyKTsKIH0KIAotTWljcm9BbGxvY2F0b3IqIE1pY3JvQWxsb2NhdG9yOjpDcmVhdGUodWludDhfdCogdGVuc29yX2FyZW5hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGFyZW5hX3NpemUpIHsKK01pY3JvQWxsb2NhdG9yKiBNaWNyb0FsbG9jYXRvcjo6Q3JlYXRlKHVpbnQ4X3QqIHRlbnNvcl9hcmVuYSwgc2l6ZV90IGFyZW5hX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1vcnlQbGFubmVyVHlwZSBtZW1vcnlfcGxhbm5lcl90eXBlKSB7CiAgIHVpbnQ4X3QqIGFsaWduZWRfYXJlbmEgPQogICAgICAgQWxpZ25Qb2ludGVyVXAodGVuc29yX2FyZW5hLCBNaWNyb0FyZW5hQnVmZmVyQWxpZ25tZW50KCkpOwogICBzaXplX3QgYWxpZ25lZF9hcmVuYV9zaXplID0gdGVuc29yX2FyZW5hICsgYXJlbmFfc2l6ZSAtIGFsaWduZWRfYXJlbmE7CkBAIC0zODQsMTAgKzQwNyw4IEBACiAKICAgLy8gQnkgZGVmYXVsdCBjcmVhdGUgR3JlZWR5TWVtb3J5UGxhbm5lci4KICAgLy8gSWYgYSBkaWZmZXJlbnQgTWVtb3J5UGxhbm5lciBpcyBuZWVkZWQsIHVzZSB0aGUgb3RoZXIgYXBpLgotICB1aW50OF90KiBtZW1vcnlfcGxhbm5lcl9idWZmZXIgPSBtZW1vcnlfYWxsb2NhdG9yLT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIoCi0gICAgICBzaXplb2YoR3JlZWR5TWVtb3J5UGxhbm5lciksIGFsaWdub2YoR3JlZWR5TWVtb3J5UGxhbm5lcikpOwotICBHcmVlZHlNZW1vcnlQbGFubmVyKiBtZW1vcnlfcGxhbm5lciA9Ci0gICAgICBuZXcgKG1lbW9yeV9wbGFubmVyX2J1ZmZlcikgR3JlZWR5TWVtb3J5UGxhbm5lcigpOworICBNaWNyb01lbW9yeVBsYW5uZXIqIG1lbW9yeV9wbGFubmVyID0KKyAgICAgIENyZWF0ZU1lbW9yeVBsYW5uZXIobWVtb3J5X3BsYW5uZXJfdHlwZSwgbWVtb3J5X2FsbG9jYXRvcik7CiAKICAgcmV0dXJuIENyZWF0ZShtZW1vcnlfYWxsb2NhdG9yLCBtZW1vcnlfcGxhbm5lcik7CiB9CkBAIC00MDgsNyArNDI5LDggQEAKIE1pY3JvQWxsb2NhdG9yKiBNaWNyb0FsbG9jYXRvcjo6Q3JlYXRlKHVpbnQ4X3QqIHBlcnNpc3RlbnRfdGVuc29yX2FyZW5hLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHBlcnNpc3RlbnRfYXJlbmFfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG5vbl9wZXJzaXN0ZW50X3RlbnNvcl9hcmVuYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBub25fcGVyc2lzdGVudF9hcmVuYV9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgbm9uX3BlcnNpc3RlbnRfYXJlbmFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbW9yeVBsYW5uZXJUeXBlIG1lbW9yeV9wbGFubmVyX3R5cGUpIHsKICAgVEZMSVRFX0RDSEVDSyhwZXJzaXN0ZW50X3RlbnNvcl9hcmVuYSAhPSBudWxscHRyKTsKICAgVEZMSVRFX0RDSEVDSyhub25fcGVyc2lzdGVudF90ZW5zb3JfYXJlbmEgIT0gbnVsbHB0cik7CiAgIFRGTElURV9EQ0hFQ0socGVyc2lzdGVudF90ZW5zb3JfYXJlbmEgIT0gbm9uX3BlcnNpc3RlbnRfdGVuc29yX2FyZW5hKTsKQEAgLTQyMSwxMSArNDQzLDIyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9uX3BlcnNpc3RlbnRfYXJlbmFfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJzaXN0ZW50X2J1ZmZlcl9hbGxvY2F0b3IpOwogCi0gIHVpbnQ4X3QqIG1lbW9yeV9wbGFubmVyX2J1ZmZlciA9Ci0gICAgICBwZXJzaXN0ZW50X2J1ZmZlcl9hbGxvY2F0b3ItPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlcigKLSAgICAgICAgICBzaXplb2YoR3JlZWR5TWVtb3J5UGxhbm5lciksIGFsaWdub2YoR3JlZWR5TWVtb3J5UGxhbm5lcikpOwotICBHcmVlZHlNZW1vcnlQbGFubmVyKiBtZW1vcnlfcGxhbm5lciA9Ci0gICAgICBuZXcgKG1lbW9yeV9wbGFubmVyX2J1ZmZlcikgR3JlZWR5TWVtb3J5UGxhbm5lcigpOworICAvLyBUT0RPKGIvMjk3ODIxNzM4KTogdGhpcyBzaG91bGQgYmUgY2hhbmdlZCB0byBDcmVhdGVNZW1vcnlQbGFubmVyIGlmCisgIC8vIHBvc3NpYmxlIG9uY2UgIGl0J3MgZmlndXJlZCBvdXQgd2h5IGl0IGJyZWFrcyB0aGUgSGlmaU1pbmkgQnVpbGQKKyAgdWludDhfdCogbWVtb3J5X3BsYW5uZXJfYnVmZmVyID0gbnVsbHB0cjsKKyAgTWljcm9NZW1vcnlQbGFubmVyKiBtZW1vcnlfcGxhbm5lciA9IG51bGxwdHI7CisKKyAgaWYgKG1lbW9yeV9wbGFubmVyX3R5cGUgPT0gTWVtb3J5UGxhbm5lclR5cGU6OmtHcmVlZHkpIHsKKyAgICBtZW1vcnlfcGxhbm5lcl9idWZmZXIgPQorICAgICAgICBwZXJzaXN0ZW50X2J1ZmZlcl9hbGxvY2F0b3ItPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlcigKKyAgICAgICAgICAgIHNpemVvZihHcmVlZHlNZW1vcnlQbGFubmVyKSwgYWxpZ25vZihHcmVlZHlNZW1vcnlQbGFubmVyKSk7CisgICAgbWVtb3J5X3BsYW5uZXIgPSBuZXcgKG1lbW9yeV9wbGFubmVyX2J1ZmZlcikgR3JlZWR5TWVtb3J5UGxhbm5lcigpOworICB9IGVsc2UgaWYgKG1lbW9yeV9wbGFubmVyX3R5cGUgPT0gTWVtb3J5UGxhbm5lclR5cGU6OmtMaW5lYXIpIHsKKyAgICBtZW1vcnlfcGxhbm5lcl9idWZmZXIgPQorICAgICAgICBwZXJzaXN0ZW50X2J1ZmZlcl9hbGxvY2F0b3ItPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlcigKKyAgICAgICAgICAgIHNpemVvZihMaW5lYXJNZW1vcnlQbGFubmVyKSwgYWxpZ25vZihMaW5lYXJNZW1vcnlQbGFubmVyKSk7CisgICAgbWVtb3J5X3BsYW5uZXIgPSBuZXcgKG1lbW9yeV9wbGFubmVyX2J1ZmZlcikgTGluZWFyTWVtb3J5UGxhbm5lcigpOworICB9CiAKICAgdWludDhfdCogbWljcm9fYWxsb2NhdG9yX2J1ZmZlciA9CiAgICAgICBwZXJzaXN0ZW50X2J1ZmZlcl9hbGxvY2F0b3ItPkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlcigKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19hbGxvY2F0b3IuaCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19hbGxvY2F0b3IuaAppbmRleCAzNTMyNTc3Li4wMjMxNzIyIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fYWxsb2NhdG9yLmgKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2FsbG9jYXRvci5oCkBAIC02Niw2ICs2NiwxMyBAQAogCiB9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKIAorLy8gRW51bSB1c2VkIHRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggTWVtb3J5UGxhbm5lciBpcyBiZWluZyB1c2VkIGZvcgorLy8gTWljcm9BbGxvY2F0ZXI6OkNyZWF0ZSgpOworZW51bSBjbGFzcyBNZW1vcnlQbGFubmVyVHlwZSB7CisgIGtHcmVlZHksCisgIGtMaW5lYXIsCit9OworCiBzdHJ1Y3QgTm9kZUFuZFJlZ2lzdHJhdGlvbiB7CiAgIFRmTGl0ZU5vZGUgbm9kZTsKICAgY29uc3QgVEZMTVJlZ2lzdHJhdGlvbiogcmVnaXN0cmF0aW9uOwpAQCAtMTE3LDcgKzEyNCw5IEBACiAgIC8vIE5vdGU6IFBsZWFzZSB1c2UgYWxpZ25hcygxNikgdG8gbWFrZSBzdXJlIHRlbnNvcl9hcmVuYSBpcyAxNgogICAvLyBieXRlcyBhbGlnbmVkLCBvdGhlcndpc2Ugc29tZSBoZWFkIHJvb20gd2lsbCBiZSB3YXN0ZWQuCiAgIC8vIFRPRE8oYi8xNTc2MTUxOTcpOiBDbGVhbnVwIGNvbnN0cnVjdG9yICsgZmFjdG9yeSB1c2FnZS4KLSAgc3RhdGljIE1pY3JvQWxsb2NhdG9yKiBDcmVhdGUodWludDhfdCogdGVuc29yX2FyZW5hLCBzaXplX3QgYXJlbmFfc2l6ZSk7CisgIHN0YXRpYyBNaWNyb0FsbG9jYXRvciogQ3JlYXRlKAorICAgICAgdWludDhfdCogdGVuc29yX2FyZW5hLCBzaXplX3QgYXJlbmFfc2l6ZSwKKyAgICAgIE1lbW9yeVBsYW5uZXJUeXBlIG1lbW9yeV9wbGFubmVyX3R5cGUgPSBNZW1vcnlQbGFubmVyVHlwZTo6a0dyZWVkeSk7CiAKICAgLy8gQ3JlYXRlcyBhIE1pY3JvQWxsb2NhdG9yIGluc3RhbmNlIGZyb20gYSBnaXZlbiB0ZW5zb3IgYXJlbmEgYW5kIGEgZ2l2ZW4KICAgLy8gTWVtb3J5UGxhbm5lci4gVGhpcyBhcmVuYSB3aWxsIGJlIG1hbmFnZWQgYnkgdGhlIGNyZWF0ZWQgaW5zdGFuY2UuIE5vdGU6CkBAIC0xMzcsMTQgKzE0NiwyMCBAQAogICAvLyBTaW5nbGVBcmVuYUJ1ZmZlckFsbG9jYXRvciBpbnN0YW5jZSBhbmQgdGhlIE1lbW9yeVBsYW5uZXIuIFRoaXMgYWxsb2NhdG9yCiAgIC8vIGluc3RhbmNlIHdpbGwgdXNlIHRoZSBTaW5nbGVBcmVuYUJ1ZmZlckFsbG9jYXRvciBpbnN0YW5jZSB0byBtYW5hZ2UKICAgLy8gYWxsb2NhdGlvbnMgaW50ZXJuYWxseS4KLSAgc3RhdGljIE1pY3JvQWxsb2NhdG9yKiBDcmVhdGUodWludDhfdCogcGVyc2lzdGVudF90ZW5zb3JfYXJlbmEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwZXJzaXN0ZW50X2FyZW5hX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG5vbl9wZXJzaXN0ZW50X3RlbnNvcl9hcmVuYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5vbl9wZXJzaXN0ZW50X2FyZW5hX3NpemUpOworICBzdGF0aWMgTWljcm9BbGxvY2F0b3IqIENyZWF0ZSgKKyAgICAgIHVpbnQ4X3QqIHBlcnNpc3RlbnRfdGVuc29yX2FyZW5hLCBzaXplX3QgcGVyc2lzdGVudF9hcmVuYV9zaXplLAorICAgICAgdWludDhfdCogbm9uX3BlcnNpc3RlbnRfdGVuc29yX2FyZW5hLCBzaXplX3Qgbm9uX3BlcnNpc3RlbnRfYXJlbmFfc2l6ZSwKKyAgICAgIE1lbW9yeVBsYW5uZXJUeXBlIG1lbW9yeV9wbGFubmVyX3R5cGUgPSBNZW1vcnlQbGFubmVyVHlwZTo6a0dyZWVkeSk7CiAKICAgLy8gUmV0dXJucyB0aGUgZml4ZWQgYW1vdW50IG9mIG1lbW9yeSBvdmVyaGVhZCBvZiBNaWNyb0FsbG9jYXRvci4KICAgc3RhdGljIHNpemVfdCBHZXREZWZhdWx0VGFpbFVzYWdlKGJvb2wgaXNfbWVtb3J5X3BsYW5uZXJfZ2l2ZW4pOwogCisgIC8vIFJldHVybnMgVHJ1ZSBpZiB0aGUgTWljcm9BbGxvY2F0b3IgdXNlcyBhIExpbmVhck1lbW9yeVBsYW5uZXIoaXMgY29tcGF0aWJsZQorICAvLyB3aXRoIHRoZSBQZXJzZXJ2ZUFsbFRlbnNvcnMgZmxhZyAvIGZlYXR1cmUgKSBhbmQgRmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIHByZXNlcnZlc19hbGxfdGVuc29yKCkgY29uc3QgeworICAgIHJldHVybiBtZW1vcnlfcGxhbm5lcl8tPnByZXNlcnZlc19hbGxfdGVuc29ycygpOworICB9OworCiAgIC8vIEFsbG9jYXRlcyBpbnRlcm5hbCByZXNvdXJjZXMgcmVxdWlyZWQgZm9yIG1vZGVsIGluZmVyZW5jZSBmb3IgZWFjaCBzdWJncmFwaAogICAvLyBmcm9tIHRoZSBhcmVuYS4KICAgLy8KQEAgLTMwNyw3ICszMjIsOSBAQAogICBJUGVyc2lzdGVudEJ1ZmZlckFsbG9jYXRvciogcGVyc2lzdGVudF9idWZmZXJfYWxsb2NhdG9yXzsKIAogICAvLyBBbGxvY2F0b3IgdXNlZCB0byBhbGxvY2F0ZSBwZXJzaXN0ZW50IGJ1aWx0aW4gZGF0YS4KLSAgVGZMaXRlQnJpZGdlQnVpbHRpbkRhdGFBbGxvY2F0b3IqIGJ1aWx0aW5fZGF0YV9hbGxvY2F0b3JfOworICBUZkxpdGVCcmlkZ2VCdWlsdGluRGF0YUFsbG9jYXRvciogYnVpbHRpbl9kYXRhX2FsbG9jYXRvcl8gPQorICAgICAgbnVsbHB0cjsgIC8vIEluaXRpYWxpemVkIGFzIG51bGxwdHIgdG8gcHJldmVudCBhbnkgcG9zc2libGUgaXNzdWVzIHJlbGF0ZWQKKyAgICAgICAgICAgICAgICAvLyB0byBhY2Nlc3NpbmcgdW5pbml0aWFsaXplZCBtZW1vcnkuCiAKICAgLy8gQWN0aXZhdGlvbiBidWZmZXIgbWVtb3J5IHBsYW5uZXIuCiAgIE1pY3JvTWVtb3J5UGxhbm5lciogbWVtb3J5X3BsYW5uZXJfOwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2NvbW1vbi5oIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2NvbW1vbi5oCmluZGV4IGRjMGJjMDguLjlhYjQyN2YgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19jb21tb24uaAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fY29tbW9uLmgKQEAgLTMwLDQgKzMwLDkgQEAKICAgY29uc3QgY2hhciogY3VzdG9tX25hbWU7CiB9OwogCitzdHJ1Y3QgVEZMTUluZmVyZW5jZVJlZ2lzdHJhdGlvbiB7CisgIFRmTGl0ZVN0YXR1cyAoKmludm9rZSkoVGZMaXRlQ29udGV4dCogY29udGV4dCwgVGZMaXRlTm9kZSogbm9kZSk7CisgIHZvaWQgKCpyZXNldCkoVGZMaXRlQ29udGV4dCogY29udGV4dCwgdm9pZCogYnVmZmVyKTsKK307CisKICNlbmRpZiAgLy8gVEhJUkRfUEFSVFlfVEZMSVRFX01JQ1JPX1RFTlNPUkZMT1dfTElURV9NSUNST19NSUNST19DT01NT05fSF8KZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19jb250ZXh0LmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2NvbnRleHQuY2MKaW5kZXggMzUyZDJjMC4uNjgwZGVlOCAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2NvbnRleHQuY2MKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2NvbnRleHQuY2MKQEAgLTEsNCArMSw0IEBACi0vKiBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLyogQ29weXJpZ2h0IDIwMjQgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIAogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNyw0OCArMTcsMTYgQEAKIAogI2luY2x1ZGUgPGNzdGRhcmc+CiAjaW5jbHVkZSA8Y3N0ZGRlZj4KLSNpbmNsdWRlIDxjc3RkaW50PgogCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWwvY29tcGF0aWJpbGl0eS5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19jb21tb24uaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fbG9nLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX3V0aWxzLmgiCiAKIG5hbWVzcGFjZSB0ZmxpdGUgewotTWljcm9Db250ZXh0OjpNaWNyb0NvbnRleHQoTWljcm9BbGxvY2F0b3IqIGFsbG9jYXRvciwgY29uc3QgTW9kZWwqIG1vZGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTWljcm9HcmFwaCogZ3JhcGgpCi0gICAgOiBhbGxvY2F0b3JfKCphbGxvY2F0b3IpLAotICAgICAgZ3JhcGhfKCpncmFwaCksCi0gICAgICBtb2RlbF8obW9kZWwpLAotICAgICAgc3RhdGVfKEludGVycHJldGVyU3RhdGU6OmtJbml0KSB7fQorbmFtZXNwYWNlIHsKIAotTWljcm9Db250ZXh0Ojp+TWljcm9Db250ZXh0KCkge30KLQotdm9pZCogTWljcm9Db250ZXh0OjpBbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIoc2l6ZV90IGJ5dGVzKSB7Ci0gIFRGTElURV9EQ0hFQ0soc3RhdGVfID09IEludGVycHJldGVyU3RhdGU6OmtQcmVwYXJlIHx8Ci0gICAgICAgICAgICAgICAgc3RhdGVfID09IEludGVycHJldGVyU3RhdGU6OmtJbml0KTsKLSAgcmV0dXJuIGFsbG9jYXRvcl8uQWxsb2NhdGVQZXJzaXN0ZW50QnVmZmVyKGJ5dGVzKTsKLX0KLQotVGZMaXRlU3RhdHVzIE1pY3JvQ29udGV4dDo6UmVxdWVzdFNjcmF0Y2hCdWZmZXJJbkFyZW5hKHNpemVfdCBieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGJ1ZmZlcl9pZHgpIHsKLSAgVEZMSVRFX0RDSEVDSyhzdGF0ZV8gPT0gSW50ZXJwcmV0ZXJTdGF0ZTo6a1ByZXBhcmUpOwotICByZXR1cm4gYWxsb2NhdG9yXy5SZXF1ZXN0U2NyYXRjaEJ1ZmZlckluQXJlbmEoCi0gICAgICBieXRlcywgZ3JhcGhfLkdldEN1cnJlbnRTdWJncmFwaEluZGV4KCksIGJ1ZmZlcl9pZHgpOwotfQotCi12b2lkKiBNaWNyb0NvbnRleHQ6OkdldFNjcmF0Y2hCdWZmZXIoaW50IGJ1ZmZlcl9pZHgpIHsKLSAgVEZMSVRFX0RDSEVDSyhzdGF0ZV8gPT0gSW50ZXJwcmV0ZXJTdGF0ZTo6a0ludm9rZSk7Ci0gIFNjcmF0Y2hCdWZmZXJIYW5kbGUqIGhhbmRsZSA9IHNjcmF0Y2hfYnVmZmVyX2hhbmRsZXNfICsgYnVmZmVyX2lkeDsKLSAgcmV0dXJuIGhhbmRsZS0+ZGF0YTsKLX0KLQotVGZMaXRlVGVuc29yKiBNaWNyb0NvbnRleHQ6OkFsbG9jYXRlVGVtcFRmTGl0ZVRlbnNvcihpbnQgdGVuc29yX2lkeCkgewotICByZXR1cm4gYWxsb2NhdG9yXy5BbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3IobW9kZWxfLCBncmFwaF8uR2V0QWxsb2NhdGlvbnMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbnNvcl9pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFwaF8uR2V0Q3VycmVudFN1YmdyYXBoSW5kZXgoKSk7Ci19Ci0KLWludCBNaWNyb0NvbnRleHQ6OkdldFRlbnNvckluZGV4KGludCBpbmRleCwgaW50IG1heF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50KiB0ZW5zb3JfaW5kaWNlcykgeworaW50IEdldFRlbnNvckluZGV4KGludCBpbmRleCwgaW50IG1heF9zaXplLCBjb25zdCBpbnQqIHRlbnNvcl9pbmRpY2VzKSB7CiAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgbWF4X3NpemUpIHsKICAgICBjb25zdCBpbnQgdGVuc29yX2luZGV4ID0gdGVuc29yX2luZGljZXNbaW5kZXhdOwogICAgIGlmICh0ZW5zb3JfaW5kZXggIT0ga1RmTGl0ZU9wdGlvbmFsVGVuc29yKSB7CkBAIC02OCw2ICszNiwxMDUgQEAKICAgcmV0dXJuIC0xOwogfQogCisjaWZkZWYgVVNFX1RGTE1fQ09NUFJFU1NJT04KKworc3RydWN0IERlY29tcHJlc3Npb25TdGF0ZSB7CisgIERlY29tcHJlc3Npb25TdGF0ZSgpID0gZGVsZXRlOworCisgIERlY29tcHJlc3Npb25TdGF0ZShjb25zdCB1aW50OF90KiBjb21wcmVzc2VkX2luZGljZXMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgY291bnRfaW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbXByZXNzaW9uVGVuc29yRGF0YSYgY29tcF9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bV9jaGFubmVscykKKyAgICAgIDogY29tcHJlc3NlZF9pbmRpY2VzXyhjb21wcmVzc2VkX2luZGljZXMpLAorICAgICAgICBjb3VudF9pbmRpY2VzXyhjb3VudF9pbmRpY2VzKSwKKyAgICAgICAgY29tcF9kYXRhXyhjb21wX2RhdGEpLAorICAgICAgICBudW1fY2hhbm5lbHNfKG51bV9jaGFubmVscykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgVCogRGVjb21wcmVzc1RvQnVmZmVyKHZvaWQqIGJ1ZmZlcik7CisKKyAgc2l6ZV90IEdldE5leHRUYWJsZUluZGV4KCk7CisgIHZvaWQgVXBkYXRlQnVmZmVyQW5kQ2hhbm5lbEluZGV4KCk7CisKKyBwcml2YXRlOgorICBjb25zdCB1aW50OF90KiBjb21wcmVzc2VkX2luZGljZXNfOworICBjb25zdCBzaXplX3QgY291bnRfaW5kaWNlc187CisgIGNvbnN0IENvbXByZXNzaW9uVGVuc29yRGF0YSYgY29tcF9kYXRhXzsKKyAgY29uc3Qgc2l6ZV90IG51bV9jaGFubmVsc187CisgIGNvbnN0IHNpemVfdCBjb21wcmVzc2VkX2JpdF93aWR0aF8gPQorICAgICAgY29tcF9kYXRhXy5kYXRhLmx1dF9kYXRhLT5jb21wcmVzc2VkX2JpdF93aWR0aDsKKyAgc2l6ZV90IGNoYW5uZWxfID0gMDsKKyAgc2l6ZV90IGluZGV4X2luX2NoYW5uZWxfID0gMDsKKyAgY29uc3Qgc2l6ZV90IGVsZW1lbnRzX3Blcl9jaGFubmVsXyA9CisgICAgICBjb21wX2RhdGFfLmRhdGEubHV0X2RhdGEtPnVzZV9hbHRlcm5hdGVfYXhpcworICAgICAgICAgID8gMQorICAgICAgICAgIDogY291bnRfaW5kaWNlc18gLyBudW1fY2hhbm5lbHNfOworICBzaXplX3QgYnVmZmVyX2luZGV4XyA9IDA7CisgIHNpemVfdCBjdXJyZW50X29mZnNldF8gPSAwOworICBzaXplX3QgY3VycmVudF9iaXRzX3JlbWFpbmluZ18gPSA4OworICB1aW50OF90IGN1cnJlbnRfYnl0ZV8gPSBjb21wcmVzc2VkX2luZGljZXNfWzBdOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUKiBEZWNvbXByZXNzaW9uU3RhdGU6OkRlY29tcHJlc3NUb0J1ZmZlcih2b2lkKiBidWZmZXIpIHsKKyAgd2hpbGUgKGJ1ZmZlcl9pbmRleF8gPCBjb3VudF9pbmRpY2VzXykgeworICAgIGNvbnN0IHNpemVfdCB0YWJsZV9pbmRleCA9IEdldE5leHRUYWJsZUluZGV4KCk7CisgICAgc3RhdGljX2Nhc3Q8VCo+KGJ1ZmZlcilbYnVmZmVyX2luZGV4X10gPQorICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBUKj4oY29tcF9kYXRhXy5kYXRhLmx1dF9kYXRhLT52YWx1ZV90YWJsZSkKKyAgICAgICAgICAgIFt0YWJsZV9pbmRleCArCisgICAgICAgICAgICAgKGNoYW5uZWxfICogY29tcF9kYXRhXy5kYXRhLmx1dF9kYXRhLT52YWx1ZV90YWJsZV9jaGFubmVsX3N0cmlkZSldOworICAgIFVwZGF0ZUJ1ZmZlckFuZENoYW5uZWxJbmRleCgpOworICB9CisKKyAgcmV0dXJuIHN0YXRpY19jYXN0PFQqPihidWZmZXIpOworfQorCitzaXplX3QgRGVjb21wcmVzc2lvblN0YXRlOjpHZXROZXh0VGFibGVJbmRleCgpIHsKKyAgVEZMSVRFX0RDSEVDSyhjb21wcmVzc2VkX2JpdF93aWR0aF8gPD0gTG9va3VwVGFibGVEYXRhOjprTWF4Qml0V2lkdGgpOworICBURkxJVEVfRENIRUNLKGNvbXByZXNzZWRfYml0X3dpZHRoXyA+IDApOworCisgIHNpemVfdCB0YWJsZV9pbmRleF9iaXRzX3RvX2ZpbGwgPSBjb21wcmVzc2VkX2JpdF93aWR0aF87CisgIHNpemVfdCB0YWJsZV9pbmRleCA9IDA7CisKKyAgd2hpbGUgKHRhYmxlX2luZGV4X2JpdHNfdG9fZmlsbCA+IDApIHsKKyAgICBpZiAoY3VycmVudF9iaXRzX3JlbWFpbmluZ18gPT0gMCkgeworICAgICAgY3VycmVudF9vZmZzZXRfKys7CisgICAgICBjdXJyZW50X2J5dGVfID0gY29tcHJlc3NlZF9pbmRpY2VzX1tjdXJyZW50X29mZnNldF9dOworICAgICAgY3VycmVudF9iaXRzX3JlbWFpbmluZ18gPSA4OworICAgIH0KKworICAgIGNvbnN0IHVpbnQ4X3QgbWFza19iaXRfY291bnQgPQorICAgICAgICBzdGQ6Om1pbih0YWJsZV9pbmRleF9iaXRzX3RvX2ZpbGwsCisgICAgICAgICAgICAgICAgIHN0ZDo6bWluKGNvbXByZXNzZWRfYml0X3dpZHRoXywgY3VycmVudF9iaXRzX3JlbWFpbmluZ18pKTsKKyAgICBjb25zdCB1aW50OF90IGN1cnJlbnRfYnl0ZV9tYXNrID0gKDEgPDwgbWFza19iaXRfY291bnQpIC0gMTsKKyAgICB0YWJsZV9pbmRleCA8PD0gbWFza19iaXRfY291bnQ7CisgICAgdGFibGVfaW5kZXggfD0KKyAgICAgICAgKGN1cnJlbnRfYnl0ZV8gPj4gKGN1cnJlbnRfYml0c19yZW1haW5pbmdfIC0gbWFza19iaXRfY291bnQpKSAmCisgICAgICAgIGN1cnJlbnRfYnl0ZV9tYXNrOworCisgICAgdGFibGVfaW5kZXhfYml0c190b19maWxsIC09IG1hc2tfYml0X2NvdW50OworICAgIGN1cnJlbnRfYml0c19yZW1haW5pbmdfIC09IG1hc2tfYml0X2NvdW50OworICB9CisKKyAgcmV0dXJuIHRhYmxlX2luZGV4OworfQorCit2b2lkIERlY29tcHJlc3Npb25TdGF0ZTo6VXBkYXRlQnVmZmVyQW5kQ2hhbm5lbEluZGV4KCkgeworICBidWZmZXJfaW5kZXhfKys7CisgIGluZGV4X2luX2NoYW5uZWxfKys7CisgIGlmIChpbmRleF9pbl9jaGFubmVsXyA9PSBlbGVtZW50c19wZXJfY2hhbm5lbF8pIHsKKyAgICBpbmRleF9pbl9jaGFubmVsXyA9IDA7CisgICAgY2hhbm5lbF8rKzsKKyAgICBpZiAoY2hhbm5lbF8gPT0gbnVtX2NoYW5uZWxzXykgeworICAgICAgY2hhbm5lbF8gPSAwOworICAgIH0KKyAgfQorfQorCisjZW5kaWYgIC8vIFVTRV9URkxNX0NPTVBSRVNTSU9OCisKK30gIC8vIG5hbWVzcGFjZQorCiBUZkxpdGVUZW5zb3IqIE1pY3JvQ29udGV4dDo6QWxsb2NhdGVUZW1wSW5wdXRUZW5zb3IoY29uc3QgVGZMaXRlTm9kZSogbm9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIHsKICAgY29uc3QgaW50IHRlbnNvcl9pbmRleCA9CkBAIC05OCw0NiArMTY1LDYgQEAKICAgcmV0dXJuIEFsbG9jYXRlVGVtcFRmTGl0ZVRlbnNvcih0ZW5zb3JfaW5kZXgpOwogfQogCi12b2lkIE1pY3JvQ29udGV4dDo6RGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3IoVGZMaXRlVGVuc29yKiB0ZW5zb3IpIHsKLSAgcmV0dXJuIGFsbG9jYXRvcl8uRGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3IodGVuc29yKTsKLX0KLQotdWludDhfdCogTWljcm9Db250ZXh0OjpBbGxvY2F0ZVRlbXBCdWZmZXIoc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbm1lbnQpIHsKLSAgVEZMSVRFX0RDSEVDSyhzdGF0ZV8gPT0gSW50ZXJwcmV0ZXJTdGF0ZTo6a1ByZXBhcmUpOwotICByZXR1cm4gYWxsb2NhdG9yXy5BbGxvY2F0ZVRlbXBCdWZmZXIoc2l6ZSwgYWxpZ25tZW50KTsKLX0KLQotdm9pZCBNaWNyb0NvbnRleHQ6OkRlYWxsb2NhdGVUZW1wQnVmZmVyKHVpbnQ4X3QqIGJ1ZmZlcikgewotICBURkxJVEVfRENIRUNLKHN0YXRlXyA9PSBJbnRlcnByZXRlclN0YXRlOjprUHJlcGFyZSk7Ci0gIGFsbG9jYXRvcl8uRGVhbGxvY2F0ZVRlbXBCdWZmZXIoYnVmZmVyKTsKLX0KLQotVGZMaXRlRXZhbFRlbnNvciogTWljcm9Db250ZXh0OjpHZXRFdmFsVGVuc29yKGludCB0ZW5zb3JfaWR4KSB7Ci0gIHJldHVybiAmZ3JhcGhfLkdldEFsbG9jYXRpb25zKClbZ3JhcGhfLkdldEN1cnJlbnRTdWJncmFwaEluZGV4KCldCi0gICAgICAgICAgICAgIC50ZW5zb3JzW3RlbnNvcl9pZHhdOwotfQotCi12b2lkIE1pY3JvQ29udGV4dDo6U2V0U2NyYXRjaEJ1ZmZlckhhbmRsZXMoCi0gICAgU2NyYXRjaEJ1ZmZlckhhbmRsZSogc2NyYXRjaF9idWZmZXJfaGFuZGxlcykgewotICBzY3JhdGNoX2J1ZmZlcl9oYW5kbGVzXyA9IHNjcmF0Y2hfYnVmZmVyX2hhbmRsZXM7Ci19Ci0KLVRmTGl0ZVN0YXR1cyBNaWNyb0NvbnRleHQ6OnNldF9leHRlcm5hbF9jb250ZXh0KAotICAgIHZvaWQqIGV4dGVybmFsX2NvbnRleHRfcGF5bG9hZCkgewotICBURkxJVEVfRENIRUNLKHN0YXRlXyA9PSBJbnRlcnByZXRlclN0YXRlOjprUHJlcGFyZSB8fAotICAgICAgICAgICAgICAgIHN0YXRlXyA9PSBJbnRlcnByZXRlclN0YXRlOjprSW52b2tlKTsKLSAgaWYgKGV4dGVybmFsX2NvbnRleHRfcGF5bG9hZCA9PSBudWxscHRyIHx8Ci0gICAgICBleHRlcm5hbF9jb250ZXh0X3BheWxvYWRfICE9IG51bGxwdHIpIHsKLSAgICBNaWNyb1ByaW50ZigKLSAgICAgICAgIkF0dGVtcHRpbmcgdG8gc2V0IGV4dGVybmFsIGNvbnRleHQgdG8gJXggYnV0IGl0IHdhcyAleCBhbHJlYWR5IiwKLSAgICAgICAgZXh0ZXJuYWxfY29udGV4dF9wYXlsb2FkLCBleHRlcm5hbF9jb250ZXh0X3BheWxvYWRfKTsKLSAgICByZXR1cm4ga1RmTGl0ZUVycm9yOwotICB9Ci0KLSAgZXh0ZXJuYWxfY29udGV4dF9wYXlsb2FkXyA9IGV4dGVybmFsX2NvbnRleHRfcGF5bG9hZDsKLSAgcmV0dXJuIGtUZkxpdGVPazsKLX0KLQogdm9pZCBNaWNyb0NvbnRleHRSZXBvcnRPcEVycm9yKHN0cnVjdCBUZkxpdGVDb250ZXh0KiBjb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZvcm1hdCwgLi4uKSB7CiAgIHZhX2xpc3QgYXJnczsKQEAgLTE0NiwxMiArMTczLDU2IEBACiAgIHZhX2VuZChhcmdzKTsKIH0KIAotdm9pZCBNaWNyb0NvbnRleHQ6OlNldEludGVycHJldGVyU3RhdGUoTWljcm9Db250ZXh0OjpJbnRlcnByZXRlclN0YXRlIHN0YXRlKSB7Ci0gIHN0YXRlXyA9IHN0YXRlOworI2lmZGVmIFVTRV9URkxNX0NPTVBSRVNTSU9OCisKK3ZvaWQqIE1pY3JvQ29udGV4dDo6RGVjb21wcmVzc1RlbnNvclRvU2NyYXRjaEJ1ZmZlcigKKyAgICBjb25zdCBUZkxpdGVFdmFsVGVuc29yJiB0ZW5zb3IsCisgICAgY29uc3QgQ29tcHJlc3Npb25UZW5zb3JEYXRhJiBjb21wcmVzc2lvbl9kYXRhLCBpbnQgc2NyYXRjaF9idWZmZXJfaGFuZGxlKSB7CisgIFRGTElURV9EQ0hFQ0soY29tcHJlc3Npb25fZGF0YS5zY2hlbWUgPT0gQ29tcHJlc3Npb25TY2hlbWU6OmtCaW5RdWFudCk7CisgIFRGTElURV9EQ0hFQ0soc2NyYXRjaF9idWZmZXJfaGFuZGxlICE9IC0xKTsKKyAgdm9pZCogc2NyYXRjaF9idWZmZXIgPSBHZXRTY3JhdGNoQnVmZmVyKHNjcmF0Y2hfYnVmZmVyX2hhbmRsZSk7CisgIFRGTElURV9EQ0hFQ0soc2NyYXRjaF9idWZmZXIgIT0gbnVsbHB0cik7CisgIHNpemVfdCBjb3VudCA9IEVsZW1lbnRDb3VudCgqdGVuc29yLmRpbXMpOworICBzaXplX3QgbnVtX2NoYW5uZWxzID0gMTsKKworICBpZiAoY29tcHJlc3Npb25fZGF0YS5kYXRhLmx1dF9kYXRhLT5pc19wZXJfY2hhbm5lbF9xdWFudGl6ZWQpIHsKKyAgICBjb25zdCBzaXplX3QgY2hhbm5lbF9heGlzID0KKyAgICAgICAgY29tcHJlc3Npb25fZGF0YS5kYXRhLmx1dF9kYXRhLT51c2VfYWx0ZXJuYXRlX2F4aXMKKyAgICAgICAgICAgID8gdGVuc29yLmRpbXMtPnNpemUgLSAxCisgICAgICAgICAgICA6IDA7CisgICAgbnVtX2NoYW5uZWxzID0gdGVuc29yLmRpbXMtPmRhdGFbY2hhbm5lbF9heGlzXTsKKyAgfQorCisgIERlY29tcHJlc3Npb25TdGF0ZSBkcyhzdGF0aWNfY2FzdDx1aW50OF90Kj4odGVuc29yLmRhdGEuZGF0YSksIGNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb25fZGF0YSwgbnVtX2NoYW5uZWxzKTsKKworICBzd2l0Y2ggKHRlbnNvci50eXBlKSB7CisgICAgY2FzZSBrVGZMaXRlQm9vbDogeworICAgICAgcmV0dXJuIGRzLkRlY29tcHJlc3NUb0J1ZmZlcjxib29sPihzY3JhdGNoX2J1ZmZlcik7CisgICAgfSBicmVhazsKKyAgICBjYXNlIGtUZkxpdGVJbnQ4OiB7CisgICAgICByZXR1cm4gZHMuRGVjb21wcmVzc1RvQnVmZmVyPGludDhfdD4oc2NyYXRjaF9idWZmZXIpOworICAgIH0gYnJlYWs7CisgICAgY2FzZSBrVGZMaXRlSW50MTY6IHsKKyAgICAgIHJldHVybiBkcy5EZWNvbXByZXNzVG9CdWZmZXI8aW50MTZfdD4oc2NyYXRjaF9idWZmZXIpOworICAgIH0gYnJlYWs7CisgICAgY2FzZSBrVGZMaXRlSW50MzI6IHsKKyAgICAgIHJldHVybiBkcy5EZWNvbXByZXNzVG9CdWZmZXI8aW50MzJfdD4oc2NyYXRjaF9idWZmZXIpOworICAgIH0gYnJlYWs7CisgICAgY2FzZSBrVGZMaXRlSW50NjQ6IHsKKyAgICAgIHJldHVybiBkcy5EZWNvbXByZXNzVG9CdWZmZXI8aW50NjRfdD4oc2NyYXRjaF9idWZmZXIpOworICAgIH0gYnJlYWs7CisgICAgY2FzZSBrVGZMaXRlRmxvYXQzMjogeworICAgICAgcmV0dXJuIGRzLkRlY29tcHJlc3NUb0J1ZmZlcjxmbG9hdD4oc2NyYXRjaF9idWZmZXIpOworICAgIH0gYnJlYWs7CisgICAgZGVmYXVsdDogeworICAgICAgTWljcm9QcmludGYoIlVuc3VwcG9ydGVkIGRlY29tcHJlc3Npb24gdGVuc29yIHR5cGUgJWQiLCB0ZW5zb3IudHlwZSk7CisgICAgfSBicmVhazsKKyAgfQorCisgIHJldHVybiBudWxscHRyOwogfQogCi1NaWNyb0NvbnRleHQ6OkludGVycHJldGVyU3RhdGUgTWljcm9Db250ZXh0OjpHZXRJbnRlcnByZXRlclN0YXRlKCkgY29uc3QgewotICByZXR1cm4gc3RhdGVfOwotfQorI2VuZGlmICAvLyBVU0VfVEZMTV9DT01QUkVTU0lPTgogCiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fY29udGV4dC5oIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2NvbnRleHQuaAppbmRleCA3M2RmOWU2Li4zM2NhZDg5IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fY29udGV4dC5oCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19jb250ZXh0LmgKQEAgLTEsNCArMSw0IEBACi0vKiBDb3B5cmlnaHQgMjAyMSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLyogQ29weXJpZ2h0IDIwMjQgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIAogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNyw5ICsxNywxNCBAQAogI2RlZmluZSBURU5TT1JGTE9XX0xJVEVfTUlDUk9fTUlDUk9fQ09OVEVYVF9IXwogCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2MvY29tbW9uLmgiCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2FsbG9jYXRvci5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19ncmFwaC5oIgogCisjaWZkZWYgVVNFX1RGTE1fQ09NUFJFU1NJT04KKworI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9jb21wcmVzc2lvbi5oIgorCisjZW5kaWYgIC8vIFVTRV9URkxNX0NPTVBSRVNTSU9OCisKIG5hbWVzcGFjZSB0ZmxpdGUgewogLy8gVE9ETyhiLzE0OTc5NTc2Mik6IGtUZkxpdGVBYm9ydCBjYW5ub3QgYmUgcGFydCBvZiB0aGUgdGZsaXRlIFRmTGl0ZVN0YXR1cy4KIGNvbnN0IFRmTGl0ZVN0YXR1cyBrVGZMaXRlQWJvcnQgPSBzdGF0aWNfY2FzdDxUZkxpdGVTdGF0dXM+KDE1KTsKQEAgLTMyLDExNyArMzcsOTUgQEAKIC8vIG1pY3JvX2NvbnRleHQtPjxURkxNIGtlcm5lbCBBUEk+CiBjbGFzcyBNaWNyb0NvbnRleHQgewogIHB1YmxpYzoKLSAgLy8gRW51bSB0aGF0IGFsbG93cyBNaWNyb0NvbnRleHQgdG8ga2VlcCB0cmFjayBvZiB0aGUgc3RhZ2VzIGRpZmZlcmVudCBtZW1vcnkKLSAgLy8gcGxhbm5pbmcgQVBJcyBhcmUgYXZhaWxhYmxlIHRvIGtlcm5lbHMuCi0gIGVudW0gY2xhc3MgSW50ZXJwcmV0ZXJTdGF0ZSB7Ci0gICAga0luaXQsCi0gICAga1ByZXBhcmUsCi0gICAga01lbW9yeVBsYW5uaW5nLAotICAgIGtJbnZva2UsCi0gIH07Ci0KLSAgLy8gRG9lcyBub3QgdGFrZSBhbnkgb3duZXJzaGlwLCBhbmQgYWxsIHBvaW50ZXJzIG11c3QgcmVmZXIgdG8gdmFsaWQgb2JqZWN0cwotICAvLyB0aGF0IG91dGxpdmUgdGhlIG9uZSBjb25zdHJ1Y3RlZC4KLSAgZXhwbGljaXQgTWljcm9Db250ZXh0KE1pY3JvQWxsb2NhdG9yKiBhbGxvY2F0b3IsIGNvbnN0IE1vZGVsKiBtb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1pY3JvR3JhcGgqIGdyYXBoKTsKLSAgdmlydHVhbCB+TWljcm9Db250ZXh0KCk7CisgIHZpcnR1YWwgfk1pY3JvQ29udGV4dCgpID0gZGVmYXVsdDsKIAogICAvLyBBbGxvY2F0ZSBwZXJzaXN0ZW50IGJ1ZmZlciB3aGljaCBoYXMgdGhlIHNhbWUgbGlmZSB0aW1lIGFzIHRoZSBpbnRlcnByZXRlci4KICAgLy8gUmV0dXJucyBudWxscHRyIG9uIGZhaWx1cmUuCiAgIC8vIFRoZSBtZW1vcnkgaXMgYWxsb2NhdGVkIGZyb20gdGhlIHRhaWwuCiAgIC8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgYXZhaWxhYmxlIGluIEluaXQgb3IgUHJlcGFyZSBzdGFnZS4KLSAgLy8gVmlydHVhbCBzbyB0aGF0IGl0IGNhbiBiZSBmYWtlZCBmb3Iga2VybmVsIHRlc3RzLgotICB2aXJ0dWFsIHZvaWQqIEFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlcihzaXplX3QgYnl0ZXMpOworICB2aXJ0dWFsIHZvaWQqIEFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlcihzaXplX3QgYnl0ZXMpID0gMDsKIAogICAvLyBSZXF1ZXN0IGEgc2NyYXRjaCBidWZmZXIgaW4gdGhlIGFyZW5hIHRocm91Z2ggc3RhdGljIG1lbW9yeSBwbGFubmluZy4KICAgLy8gVGhpcyBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgaW4gUHJlcGFyZSBzdGFnZSBhbmQgdGhlIGJ1ZmZlciBpcyBhbGxvY2F0ZWQKICAgLy8gYnkgdGhlIGludGVycHJldGVyIGJldHdlZW4gUHJlcGFyZSBhbmQgRXZhbCBzdGFnZS4gSW4gRXZhbCBzdGFnZSwKICAgLy8gR2V0U2NyYXRjaEJ1ZmZlciBBUEkgY2FuIGJlIHVzZWQgdG8gZmV0Y2ggdGhlIGFkZHJlc3MuCi0gIC8vIFZpcnR1YWwgc28gdGhhdCBpdCBjYW4gYmUgZmFrZWQgZm9yIGtlcm5lbCB0ZXN0cy4KICAgdmlydHVhbCBUZkxpdGVTdGF0dXMgUmVxdWVzdFNjcmF0Y2hCdWZmZXJJbkFyZW5hKHNpemVfdCBieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogYnVmZmVyX2lkeCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGJ1ZmZlcl9pZHgpID0gMDsKIAogICAvLyBHZXQgdGhlIHNjcmF0Y2ggYnVmZmVyIHBvaW50ZXIuCiAgIC8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgYXZhaWxhYmxlIGluIEV2YWwgc3RhZ2UuCi0gIC8vIFZpcnR1YWwgc28gdGhhdCBpdCBjYW4gYmUgZmFrZWQgZm9yIGtlcm5lbCB0ZXN0cy4KLSAgdmlydHVhbCB2b2lkKiBHZXRTY3JhdGNoQnVmZmVyKGludCBidWZmZXJfaWR4KTsKKyAgdmlydHVhbCB2b2lkKiBHZXRTY3JhdGNoQnVmZmVyKGludCBidWZmZXJfaWR4KSA9IDA7CiAKICAgLy8gUmV0dXJucyBhIHRlbXBvcmFyeSBUZkxpdGVUZW5zb3Igc3RydWN0IGZvciBhIGdpdmVuIGluZGV4LgotICAvLyBWaXJ0dWFsIHNvIHRoYXQgaXQgY2FuIGJlIGZha2VkIGZvciBrZXJuZWwgdGVzdHMuCi0gIHZpcnR1YWwgVGZMaXRlVGVuc29yKiBBbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3IoaW50IHRlbnNvcl9pZHgpOworICB2aXJ0dWFsIFRmTGl0ZVRlbnNvciogQWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKGludCB0ZW5zb3JfaWR4KSA9IDA7CiAKICAgLy8gUmV0dXJucyBhIHRlbXBvcmFyeSBUZkxpdGVUZW5zb3Igc3RydWN0IGZvciB0aGUgc3BlY2lmaWVkIGlucHV0IHRlbnNvciBvZiBhCiAgIC8vIGdpdmVuIG1vZGUuIFRoaXMgaXMgdGhlIHJlY29tbWVuZGVkIEFQSSBvdmVyIHRoZSBkZXByZWNhdGVkCiAgIC8vIEdldElucHV0L0dldElucHV0U2FmZSB0byBnZXQgYSB0ZW1wIGlucHV0IHRlbnNvci4gVGhlIHJldHVybmVkIHRlbnNvciBzaGFsbAogICAvLyBiZSBmcmVlZCB2aWEgY2FsbGluZyBEZWFsbG9jYXRlVGVtcFRmTGl0ZVRlbnNvci4KLSAgdmlydHVhbCBUZkxpdGVUZW5zb3IqIEFsbG9jYXRlVGVtcElucHV0VGVuc29yKGNvbnN0IFRmTGl0ZU5vZGUqIG5vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpOworICBUZkxpdGVUZW5zb3IqIEFsbG9jYXRlVGVtcElucHV0VGVuc29yKGNvbnN0IFRmTGl0ZU5vZGUqIG5vZGUsIGludCBpbmRleCk7CiAKICAgLy8gUmV0dXJucyBhIHRlbXBvcmFyeSBUZkxpdGVUZW5zb3Igc3RydWN0IGZvciB0aGUgc3BlY2lmaWVkIG91dHB1dCB0ZW5zb3Igb2YKICAgLy8gYSBnaXZlbiBtb2RlLiBUaGlzIGlzIHRoZSByZWNvbW1lbmRlZCBBUEkgb3ZlciB0aGUgZGVwcmVjYXRlZAogICAvLyBHZXRPdXRwdXQvR2V0T3V0cHV0U2FmZSB0byBnZXQgYSB0ZW1wIG91dHB1dCB0ZW5zb3IuIFRoZSByZXR1cm5lZCB0ZW5zb3IKICAgLy8gc2hhbGwgYmUgZnJlZWQgdmlhIGNhbGxpbmcgRGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3IuCi0gIHZpcnR1YWwgVGZMaXRlVGVuc29yKiBBbGxvY2F0ZVRlbXBPdXRwdXRUZW5zb3IoY29uc3QgVGZMaXRlTm9kZSogbm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpOworICBUZkxpdGVUZW5zb3IqIEFsbG9jYXRlVGVtcE91dHB1dFRlbnNvcihjb25zdCBUZkxpdGVOb2RlKiBub2RlLCBpbnQgaW5kZXgpOwogCiAgIC8vIFJldHVybnMgYSB0ZW1wb3JhcnkgVGZMaXRlVGVuc29yIHN0cnVjdCBmb3IgdGhlIHNwZWNpZmllZCBpbnRlcm1lZGlhdGUKICAgLy8gdGVuc29yIG9mIGEgZ2l2ZW4gbW9kZS4gVGhpcyBpcyB0aGUgcmVjb21tZW5kZWQgQVBJIG92ZXIgdGhlIGRlcHJlY2F0ZWQKICAgLy8gR2V0SW50ZXJtZWRpYXRlcy9HZXRJbnRlcm1lZGlhdGVzU2FmZSB0byBnZXQgYSB0ZW1wIGludGVybWVkaWF0ZSB0ZW5zb3IuCiAgIC8vIFRoZSByZXR1cm5lZCB0ZW5zb3Igc2hhbGwgYmUgZnJlZWQgdmlhIGNhbGxpbmcgRGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3IuCi0gIHZpcnR1YWwgVGZMaXRlVGVuc29yKiBBbGxvY2F0ZVRlbXBJbnRlcm1lZGlhdGVUZW5zb3IoY29uc3QgVGZMaXRlTm9kZSogbm9kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpOworICBUZkxpdGVUZW5zb3IqIEFsbG9jYXRlVGVtcEludGVybWVkaWF0ZVRlbnNvcihjb25zdCBUZkxpdGVOb2RlKiBub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpOwogCiAgIC8vIERlYWxsb2NhdGVzIGEgdGVtcCBUZkxpdGVUZW5zb3IuCi0gIC8vIFZpcnR1YWwgc28gdGhhdCBpdCBjYW4gYmUgZmFrZWQgZm9yIGtlcm5lbCB0ZXN0cy4KLSAgdmlydHVhbCB2b2lkIERlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKFRmTGl0ZVRlbnNvciogdGVuc29yKTsKKyAgdmlydHVhbCB2b2lkIERlYWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKFRmTGl0ZVRlbnNvciogdGVuc29yKSA9IDA7CiAKICAgLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gYSB0ZW1wb3JhcnkgYnVmZmVyIChmcm9tIHRoZSBhcmVuYSkuCiAgIC8vIFRoaXMgQVBJIGlzIG9ubHkgdmFsaWQgZnJvbSB0aGUga2VybmVsJ3MgUHJlcGFyZSBmdW5jdGlvbiBhbmQKICAgLy8gdGhlIGJ1ZmZlcidzIGxpZmV0aW1lIGlzIGFsc28gdGhhdCBvZiB0aGUgUHJlcGFyZSBmdW5jdGlvbi4KLSAgLy8gVmlydHVhbCBzbyB0aGF0IGl0IGNhbiBiZSBmYWtlZCBmb3Iga2VybmVsIHRlc3RzLgotICB2aXJ0dWFsIHVpbnQ4X3QqIEFsbG9jYXRlVGVtcEJ1ZmZlcihzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWdubWVudCk7CisgIHZpcnR1YWwgdWludDhfdCogQWxsb2NhdGVUZW1wQnVmZmVyKHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ25tZW50KSA9IDA7CiAKICAgLy8gU2lnbmFscyB0aGF0IHRoZSB0ZW1wb3JhcnkgYnVmZmVyIGlzIG5vIGxvbmdlciBuZWVkZWQuCi0gIC8vIFZpcnR1YWwgc28gdGhhdCBpdCBjYW4gYmUgZmFrZWQgZm9yIGtlcm5lbCB0ZXN0cy4KLSAgdmlydHVhbCB2b2lkIERlYWxsb2NhdGVUZW1wQnVmZmVyKHVpbnQ4X3QqIGJ1ZmZlcik7CisgIHZpcnR1YWwgdm9pZCBEZWFsbG9jYXRlVGVtcEJ1ZmZlcih1aW50OF90KiBidWZmZXIpID0gMDsKIAogICAvLyBSZXR1cm5zIGEgVGZMaXRlRXZhbFRlbnNvciBzdHJ1Y3QgZm9yIGEgZ2l2ZW4gaW5kZXguCi0gIC8vIFZpcnR1YWwgc28gdGhhdCBpdCBjYW4gYmUgZmFrZWQgZm9yIGtlcm5lbCB0ZXN0cy4KLSAgdmlydHVhbCBUZkxpdGVFdmFsVGVuc29yKiBHZXRFdmFsVGVuc29yKGludCB0ZW5zb3JfaWR4KTsKLQotICAvLyBTZXRzIHRoZSBTdGF0ZSBvZiBNZW1vcnlQbGFubmluZyBNaWNyb0NvbnRleHQKLSAgdm9pZCBTZXRJbnRlcnByZXRlclN0YXRlKE1pY3JvQ29udGV4dDo6SW50ZXJwcmV0ZXJTdGF0ZSBzdGF0ZSk7Ci0KLSAgLy8gU2V0cyB0aGUgU3RhdGUgb2YgTWVtb3J5UGxhbm5pbmcgTWljcm9Db250ZXh0Ci0gIE1pY3JvQ29udGV4dDo6SW50ZXJwcmV0ZXJTdGF0ZSBHZXRJbnRlcnByZXRlclN0YXRlKCkgY29uc3Q7CisgIHZpcnR1YWwgVGZMaXRlRXZhbFRlbnNvciogR2V0RXZhbFRlbnNvcihpbnQgdGVuc29yX2lkeCkgPSAwOwogCiAgIC8vIERvZXMgbm90IHRha2Ugb3duZXJzaGlwIG9mIHRoZSBwb2ludGVyIGFuZCB0aGUgcG9pbnRlciBtdXN0IHJlZmVyIHRvIHZhbGlkCiAgIC8vIGFuIG9iamVjdCB0aGF0IG91dGxpdmUgdGhpcyBjbGFzcyBpbnN0YW5jZS4KICAgLy8gVGhpcyBjYW4gb25seSBiZSBjYWxsZWQgb25jZSB0byBzZXQgb25lIGV4dGVybmFsIGNvbnRleHQuCi0gIFRmTGl0ZVN0YXR1cyBzZXRfZXh0ZXJuYWxfY29udGV4dCh2b2lkKiBleHRlcm5hbF9jb250ZXh0X3BheWxvYWQpOworICB2aXJ0dWFsIFRmTGl0ZVN0YXR1cyBzZXRfZXh0ZXJuYWxfY29udGV4dCh2b2lkKiBleHRlcm5hbF9jb250ZXh0X3BheWxvYWQpID0gMDsKIAotICB2b2lkKiBleHRlcm5hbF9jb250ZXh0KCkgeyByZXR1cm4gZXh0ZXJuYWxfY29udGV4dF9wYXlsb2FkXzsgfQorICB2aXJ0dWFsIHZvaWQqIGV4dGVybmFsX2NvbnRleHQoKSA9IDA7CiAKLSAgTWljcm9HcmFwaCYgZ3JhcGgoKSB7IHJldHVybiBncmFwaF87IH0KKyAgdmlydHVhbCBNaWNyb0dyYXBoJiBncmFwaCgpID0gMDsKIAotICAvLyBTZXRzIHRoZSBwb2ludGVyIHRvIGEgbGlzdCBvZiBTY3JhdGNoQnVmZmVySGFuZGxlIGluc3RhbmNlcy4KLSAgLy8gTm90IEFQSSBiZXR3ZWVuIFRGTE0gYW5kIGtlcm5lbHMuIFByaW1hcmlseSB1c2VkIGJ5IHRoZSBmcmFtZXdvcmsgZm9yCi0gIC8vIGhvdXNla2VlcGluZyBpbiBNaWNyb0NvbnRleHQuCi0gIHZvaWQgU2V0U2NyYXRjaEJ1ZmZlckhhbmRsZXMoU2NyYXRjaEJ1ZmZlckhhbmRsZSogc2NyYXRjaF9idWZmZXJfaGFuZGxlcyk7CisjaWZkZWYgVVNFX1RGTE1fQ09NUFJFU1NJT04KKworICAvLyBBdmFpbGFibGUgZHVyaW5nIFByZXBhcmUgJiBFdmFsLiBSZXR1cm5zIGZhbHNlIGlmIHRlbnNvciBpcyBub3QKKyAgLy8gY29tcHJlc3NlZC4KKyAgdmlydHVhbCBib29sIElzVGVuc29yQ29tcHJlc3NlZChjb25zdCBUZkxpdGVOb2RlKiBub2RlLCBpbnQgdGVuc29yX2lkeCkgPSAwOworCisgIC8vIE9ubHkgYXZhaWxhYmxlIGR1cmluZyBQcmVwYXJlLiBUaGUga2VybmVsIGlzIHJlc3BvbnNpYmxlIGZvciBzdG9yaW5nIHRoZQorICAvLyBzY3JhdGNoIGJ1ZmZlciBoYW5kbGUuCisgIHZpcnR1YWwgaW50IEFsbG9jYXRlRGVjb21wcmVzc2lvblNjcmF0Y2hCdWZmZXIoY29uc3QgVGZMaXRlTm9kZSogbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGVuc29yX2lkeCkgPSAwOworCisgIC8vIEF2YWlsYWJsZSBkdXJpbmcgUHJlcGFyZSAmIEV2YWwuIFJldHVybnMgbnVsbHB0ciBpZiB0ZW5zb3IgaXMgbm90CisgIC8vIGNvbXByZXNzZWQuCisgIHZpcnR1YWwgY29uc3QgQ29tcHJlc3Npb25UZW5zb3JEYXRhKiBHZXRUZW5zb3JDb21wcmVzc2lvbkRhdGEoCisgICAgICBjb25zdCBUZkxpdGVOb2RlKiBub2RlLCBpbnQgdGVuc29yX2lkeCkgPSAwOworCisgIC8vIE9ubHkgYXZhaWxhYmxlIGR1cmluZyBFdmFsLiBSZXR1cm5zIG51bGxwdHIgb24gZmFpbHVyZSwgb3RoZXJ3aXNlIHJldHVybnMgYQorICAvLyBwb2ludGVyIHRvIHRoZSBzY3JhdGNoIGJ1ZmZlci4KKyAgdmlydHVhbCB2b2lkKiBEZWNvbXByZXNzVGVuc29yVG9TY3JhdGNoQnVmZmVyKAorICAgICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciYgdGVuc29yLAorICAgICAgY29uc3QgQ29tcHJlc3Npb25UZW5zb3JEYXRhJiBjb21wcmVzc2lvbl9kYXRhLCBpbnQgc2NyYXRjaF9idWZmZXJfaGFuZGxlKTsKKworI2VuZGlmICAvLyBVU0VfVEZMTV9DT01QUkVTU0lPTgogCiAgcHJpdmF0ZToKLSAgLy8gUmV0dXJuIHRoZSB0ZW5zb3IgaW5kZXggYXMgdGVuc29yX2luZGljZXNbaW5kZXhdLiB0ZW5zb3JfaW5kaWNlcyBpcyBvZgotICAvLyBtYXhfc2l6ZS4gUmV0dXJuIC0xIGlmIGluZGV4IGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgdGVuc29yX2luZGljZXMuCi0gIGludCBHZXRUZW5zb3JJbmRleChpbnQgaW5kZXgsIGludCBtYXhfc2l6ZSwgY29uc3QgaW50KiB0ZW5zb3JfaW5kaWNlcyk7Ci0KLSAgTWljcm9BbGxvY2F0b3ImIGFsbG9jYXRvcl87Ci0gIE1pY3JvR3JhcGgmIGdyYXBoXzsKLSAgY29uc3QgTW9kZWwqIG1vZGVsXzsKLSAgSW50ZXJwcmV0ZXJTdGF0ZSBzdGF0ZV87Ci0KLSAgU2NyYXRjaEJ1ZmZlckhhbmRsZSogc2NyYXRjaF9idWZmZXJfaGFuZGxlc18gPSBudWxscHRyOwotICB2b2lkKiBleHRlcm5hbF9jb250ZXh0X3BheWxvYWRfID0gbnVsbHB0cjsKLQogICBURl9MSVRFX1JFTU9WRV9WSVJUVUFMX0RFTEVURQogfTsKIApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2dyYXBoLmggYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fZ3JhcGguaAppbmRleCBjYThjNDBlLi43OWIzNjQ5IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fZ3JhcGguaAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fZ3JhcGguaApAQCAtMTYsOTAgKzE2LDQ0IEBACiAjaWZuZGVmIFRFTlNPUkZMT1dfTElURV9NSUNST19NSUNST19HUkFQSF9IXwogI2RlZmluZSBURU5TT1JGTE9XX0xJVEVfTUlDUk9fTUlDUk9fR1JBUEhfSF8KIAotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19hbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vY29tcGF0aWJpbGl0eS5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19jb21tb24uaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fcmVzb3VyY2VfdmFyaWFibGUuaCIKLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvc2NoZW1hL3NjaGVtYV9nZW5lcmF0ZWQuaCIKIAogbmFtZXNwYWNlIHRmbGl0ZSB7CiAKLS8vIEFic3RyYWN0cyB0aGUgZGV0YWlscyBvZiBpbnRlcmFjdGluZyB3aXRoIHRoZSB0ZmxpdGU6Ok1vZGVsLgorLy8gQWJzdHJhY3RzIHRoZSBkZXRhaWxzIG9mIGludGVyYWN0aW5nIHdpdGggdGhlIGdyYXBoIGZyb20gdGhlIGtlcm5lbHMKIC8vCi0vLyBQcm92aWRlcyBtZXRob2RzIHRvIGFjY2VzcywgaW5pdGlhbGl6ZSwgcHJlcGFyZSwgaW52b2tlIGFuZCBmcmVlIGFueQotLy8gc3ViZ3JhcGggaW4gdGhlIHRmbGl0ZTo6R3JhcGguCisvLyBQcm92aWRlcyBtZXRob2RzIHRvIGludm9rZSBhbnkgc3ViZ3JhcGggaW4gdGhlIHRmbGl0ZTo6R3JhcGguCiBjbGFzcyBNaWNyb0dyYXBoIHsKICBwdWJsaWM6Ci0gIC8vIFRoZSBsaWZldGltZSBvZiB0aGUgY29udGV4dCwgbW9kZWwsIGFsbG9jYXRvciBhbmQgcmVzb3VyY2VfdmFyaWFibGVzIG11c3QKLSAgLy8gYmUgYXQgbGVhc3QgYXMgbG9uZyBhcyB0aGF0IG9mIHRoZSBncmFwaCBvYmplY3QsIHNpbmNlIHRoZSB0aGlzIGNsYXNzIG1heQotICAvLyBuZWVkIHRvIGFjY2VzcyB0aGVtIGF0IGFueSB0aW1lLiBJZiByZXNvdXJjZV92YXJpYWJsZXMgaXMgYSBudWxscHRyLAotICAvLyBHZXRSZXNvdXJjZVZhcmlhYmxlcyB3aWxsIHJldHVybiBhIG51bGxwdHIuCi0gIE1pY3JvR3JhcGgoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgTW9kZWwqIG1vZGVsLAotICAgICAgICAgICAgIE1pY3JvQWxsb2NhdG9yKiBhbGxvY2F0b3IsCi0gICAgICAgICAgICAgTWljcm9SZXNvdXJjZVZhcmlhYmxlcyogcmVzb3VyY2VfdmFyaWFibGVzKTsKLSAgdmlydHVhbCB+TWljcm9HcmFwaCgpOwotCi0gIC8vIFNldHMgdXAgYnVpbHRpbiBkYXRhIGFuZCBjYWxscyBURkxNUmVnaXN0cmF0aW9uLT5Jbml0IGZvciBldmVyeQotICAvLyBvcGVyYXRvciBpbiBldmVyeSBzdWJncmFwaCBpbiB0aGUgbW9kZWwuCi0gIHZpcnR1YWwgVGZMaXRlU3RhdHVzIEluaXRTdWJncmFwaHMoKTsKLQotICAvLyBDYWxscyBURkxNUmVnaXN0cmF0aW9uLT5QcmVwYXJlIGZvciBldmVyeSBvcGVyYXRvciBpbiBldmVyeSBzdWJncmFwaAotICAvLyBpbiB0aGUgbW9kZWwuCi0gIHZpcnR1YWwgVGZMaXRlU3RhdHVzIFByZXBhcmVTdWJncmFwaHMoKTsKLQotICAvLyBDYWxscyBURkxNUmVnaXN0cmF0aW9uLT5SZXNldCBmb3IgZXZlcnkgb3BlcmF0b3IgaW4gZXZlcnkgc3ViZ3JhcGggaW4KLSAgLy8gdGhlIG1vZGVsLgotICB2aXJ0dWFsIFRmTGl0ZVN0YXR1cyBSZXNldFN1YmdyYXBocygpOwotCi0gIC8vIENhbGxzIFRGTE1SZWdpc3RyYXRpb24tPkZyZWUgZm9yIGV2ZXJ5IG9wZXJhdG9yIGluIGV2ZXJ5IHN1YmdyYXBoIGluCi0gIC8vIHRoZSBtb2RlbC4KLSAgdmlydHVhbCBUZkxpdGVTdGF0dXMgRnJlZVN1YmdyYXBocygpOworICB2aXJ0dWFsIH5NaWNyb0dyYXBoKCkgPSBkZWZhdWx0OwogCiAgIC8vIENhbGxzIFRGTE1SZWdpc3RyYXRpb24tPkludm9rZSBmb3IgZXZlcnkgb3BlcmF0b3IgaW4gYSBzaW5nbGUgc3ViZ3JhcGgKICAgLy8gaW4gdGhlIG1vZGVsLgotICB2aXJ0dWFsIFRmTGl0ZVN0YXR1cyBJbnZva2VTdWJncmFwaChpbnQgc3ViZ3JhcGhfaWR4KTsKLQotICAvLyBaZXJvcyBvdXQgYWxsIHZhcmlhYmxlIHRlbnNvcnMgaW4gYWxsIHN1YmdyYXBocyBpbiB0aGUgbW9kZWwuCi0gIHZpcnR1YWwgVGZMaXRlU3RhdHVzIFJlc2V0VmFyaWFibGVUZW5zb3JzKCk7CisgIHZpcnR1YWwgVGZMaXRlU3RhdHVzIEludm9rZVN1YmdyYXBoKGludCBzdWJncmFwaF9pZHgpID0gMDsKIAogICAvLyBOdW1iZXIgb2YgdGVuc29yIGlucHV0cyB0byBhIHNwZWNpZmllZCBzdWJncmFwaCBpbiB0aGUgbW9kZWwuCi0gIHZpcnR1YWwgc2l6ZV90IE51bVN1YmdyYXBoSW5wdXRzKGludCBzdWJncmFwaF9pZHgpOworICB2aXJ0dWFsIHNpemVfdCBOdW1TdWJncmFwaElucHV0cyhpbnQgc3ViZ3JhcGhfaWR4KSA9IDA7CiAKICAgLy8gR2V0IHRoZSBzcGVjaWZpZWQgaW5wdXQgdGVuc29yIG9mIGEgc3BlY2lmaWVkIHN1YmdyYXBoIGluIHRoZSBtb2RlbC4KLSAgdmlydHVhbCBUZkxpdGVFdmFsVGVuc29yKiBHZXRTdWJncmFwaElucHV0KGludCBzdWJncmFwaF9pZHgsIGludCBpbnB1dF9pZHgpOworICB2aXJ0dWFsIFRmTGl0ZUV2YWxUZW5zb3IqIEdldFN1YmdyYXBoSW5wdXQoaW50IHN1YmdyYXBoX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnB1dF9pZHgpID0gMDsKIAogICAvLyBOdW1iZXIgb2YgdGVuc29yIG91dHB1dHMgZnJvbSBhIHNwZWNpZmllZCBzdWJncmFwaCBpbiB0aGUgbW9kZWwuCi0gIHZpcnR1YWwgc2l6ZV90IE51bVN1YmdyYXBoT3V0cHV0cyhpbnQgc3ViZ3JhcGhfaWR4KTsKKyAgdmlydHVhbCBzaXplX3QgTnVtU3ViZ3JhcGhPdXRwdXRzKGludCBzdWJncmFwaF9pZHgpID0gMDsKIAogICAvLyBHZXQgdGhlIHNwZWNpZmllZCBvdXRwdXQgdGVuc29yIG9mIGEgc3BlY2lmaWVkIHN1YmdyYXBoIGluIHRoZSBtb2RlbC4KLSAgdmlydHVhbCBUZkxpdGVFdmFsVGVuc29yKiBHZXRTdWJncmFwaE91dHB1dChpbnQgc3ViZ3JhcGhfaWR4LCBpbnQgb3V0cHV0X2lkeCk7CisgIHZpcnR1YWwgVGZMaXRlRXZhbFRlbnNvciogR2V0U3ViZ3JhcGhPdXRwdXQoaW50IHN1YmdyYXBoX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0cHV0X2lkeCkgPSAwOwogCiAgIC8vIE51bWJlciBvZiBzdWJncmFwaHMgaW4gdGhlIG1vZGVsLgotICB2aXJ0dWFsIGludCBOdW1TdWJncmFwaHMoKTsKLQotICAvLyBIb29rIHRvIHBhc3MgaW4gc3ViZ3JhcGggYWxsb2NhdGlvbnMgdHJhY2tlZCB3aXRoaW4gdGhlIGludGVycHJldGVyLAotICAvLyBhbGxvd2luZyBNaWNyb0dyYXBoIHRvIGluaXQgLyBwcmVwYXJlIC8gaW52b2tlIHN1YmdyYXBocyBpbiB0aGUgbW9kZWwuCi0gIHZvaWQgU2V0U3ViZ3JhcGhBbGxvY2F0aW9ucyhTdWJncmFwaEFsbG9jYXRpb25zKiBzdWJncmFwaF9hbGxvY2F0aW9ucyk7Ci0KLSAgLy8gR2V0IHRoZSBjdXJyZW50IHN1YmdyYXBoIGluZGV4LiBXaXRoaW4gYW4gb24gb3BlcmF0b3IsIHRoaXMgaXMgZ3VhcmFudGVlZAotICAvLyB0byBiZSB0aGUgc3ViZ3JhcGggb2YgdGhhdCBvcGVyYXRvci4KLSAgaW50IEdldEN1cnJlbnRTdWJncmFwaEluZGV4KCkgeyByZXR1cm4gY3VycmVudF9zdWJncmFwaF9pbmRleF87IH0KLQotICAvLyBHZXRzIHRoZSBsaXN0IG9mIGFsbG9jdGlvbnMgZm9yIGVhY2ggc3ViZ3JhcGguIFRoaXMgaXMgdGhlIHNvdXJjZSBvZiB0cnV0aAotICAvLyBmb3IgYWxsIHBlci1zdWJncmFwaCBhbGxvY2F0aW9uIGRhdGEuCi0gIFN1YmdyYXBoQWxsb2NhdGlvbnMqIEdldEFsbG9jYXRpb25zKCkgeyByZXR1cm4gc3ViZ3JhcGhfYWxsb2NhdGlvbnNfOyB9CisgIHZpcnR1YWwgaW50IE51bVN1YmdyYXBocygpID0gMDsKIAogICAvLyBHZXQgdGhlIHJlc291cmNlIHZhcmlhYmxlcyBmb3IgdGhpcyBURkxNIGdyYXBoLgotICBNaWNyb1Jlc291cmNlVmFyaWFibGVzKiBHZXRSZXNvdXJjZVZhcmlhYmxlcygpIHsgcmV0dXJuIHJlc291cmNlX3ZhcmlhYmxlc187IH0KKyAgdmlydHVhbCBNaWNyb1Jlc291cmNlVmFyaWFibGVzKiBHZXRSZXNvdXJjZVZhcmlhYmxlcygpID0gMDsKIAogIHByaXZhdGU6Ci0gIFRmTGl0ZUNvbnRleHQqIGNvbnRleHRfOwotICBjb25zdCBNb2RlbCogbW9kZWxfOwotICBNaWNyb0FsbG9jYXRvciogYWxsb2NhdG9yXzsKLSAgU3ViZ3JhcGhBbGxvY2F0aW9ucyogc3ViZ3JhcGhfYWxsb2NhdGlvbnNfID0gbnVsbHB0cjsKLSAgaW50IGN1cnJlbnRfc3ViZ3JhcGhfaW5kZXhfOwotICBNaWNyb1Jlc291cmNlVmFyaWFibGVzKiByZXNvdXJjZV92YXJpYWJsZXNfOwotICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8U3ViR3JhcGg+Piogc3ViZ3JhcGhzXzsKLQogICBURl9MSVRFX1JFTU9WRV9WSVJUVUFMX0RFTEVURQogfTsKIApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2ludGVycHJldGVyLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2ludGVycHJldGVyLmNjCmluZGV4IGM2OTE3YjQuLjdmNDU2NWUgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19pbnRlcnByZXRlci5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9faW50ZXJwcmV0ZXIuY2MKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vZmxhdGJ1ZmZlcl91dGlscy5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9tZW1vcnlfaGVscGVycy5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19hbGxvY2F0b3IuaCIKLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fY29udGV4dC5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19pbnRlcnByZXRlcl9jb250ZXh0LmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2xvZy5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19vcF9yZXNvbHZlci5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19wcm9maWxlcl9pbnRlcmZhY2UuaCIKQEAgLTMzLDE3ICszMywyOCBAQAogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9zY2hlbWEvc2NoZW1hX3V0aWxzLmgiCiAKIG5hbWVzcGFjZSB0ZmxpdGUgeworbmFtZXNwYWNlIHsKK01lbW9yeVBsYW5uZXJUeXBlIEZsYWdUb01lbW9yeVBsYW5uZXJUeXBlKGJvb2wgcHJlc2VydmVfYWxsX3RlbnNvcnMpIHsKKyAgaWYgKHByZXNlcnZlX2FsbF90ZW5zb3JzKSB7CisgICAgcmV0dXJuIE1lbW9yeVBsYW5uZXJUeXBlOjprTGluZWFyOworICB9IGVsc2UgeworICAgIHJldHVybiBNZW1vcnlQbGFubmVyVHlwZTo6a0dyZWVkeTsKKyAgfQorfQorfSAgLy8gbmFtZXNwYWNlCiAKIE1pY3JvSW50ZXJwcmV0ZXI6Ok1pY3JvSW50ZXJwcmV0ZXIoY29uc3QgTW9kZWwqIG1vZGVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNaWNyb09wUmVzb2x2ZXImIG9wX3Jlc29sdmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB0ZW5zb3JfYXJlbmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB0ZW5zb3JfYXJlbmFfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWljcm9SZXNvdXJjZVZhcmlhYmxlcyogcmVzb3VyY2VfdmFyaWFibGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNaWNyb1Byb2ZpbGVySW50ZXJmYWNlKiBwcm9maWxlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWljcm9Qcm9maWxlckludGVyZmFjZSogcHJvZmlsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJlc2VydmVfYWxsX3RlbnNvcnMpCiAgICAgOiBtb2RlbF8obW9kZWwpLAogICAgICAgb3BfcmVzb2x2ZXJfKG9wX3Jlc29sdmVyKSwKLSAgICAgIGFsbG9jYXRvcl8oKk1pY3JvQWxsb2NhdG9yOjpDcmVhdGUodGVuc29yX2FyZW5hLCB0ZW5zb3JfYXJlbmFfc2l6ZSkpLAotCisgICAgICBhbGxvY2F0b3JfKCpNaWNyb0FsbG9jYXRvcjo6Q3JlYXRlKAorICAgICAgICAgIHRlbnNvcl9hcmVuYSwgdGVuc29yX2FyZW5hX3NpemUsCisgICAgICAgICAgRmxhZ1RvTWVtb3J5UGxhbm5lclR5cGUocHJlc2VydmVfYWxsX3RlbnNvcnMpKSksCiAgICAgICBncmFwaF8oJmNvbnRleHRfLCBtb2RlbCwgJmFsbG9jYXRvcl8sIHJlc291cmNlX3ZhcmlhYmxlcyksCiAgICAgICB0ZW5zb3JzX2FsbG9jYXRlZF8oZmFsc2UpLAogICAgICAgaW5pdGlhbGl6YXRpb25fc3RhdHVzXyhrVGZMaXRlRXJyb3IpLApAQCAtNzcsNyArODgsOCBAQAogfQogCiB2b2lkIE1pY3JvSW50ZXJwcmV0ZXI6OkluaXQoTWljcm9Qcm9maWxlckludGVyZmFjZSogcHJvZmlsZXIpIHsKLSAgbWljcm9fY29udGV4dF8uU2V0SW50ZXJwcmV0ZXJTdGF0ZShNaWNyb0NvbnRleHQ6OkludGVycHJldGVyU3RhdGU6OmtJbml0KTsKKyAgbWljcm9fY29udGV4dF8uU2V0SW50ZXJwcmV0ZXJTdGF0ZSgKKyAgICAgIE1pY3JvSW50ZXJwcmV0ZXJDb250ZXh0OjpJbnRlcnByZXRlclN0YXRlOjprSW5pdCk7CiAgIGNvbnRleHRfLmltcGxfID0gc3RhdGljX2Nhc3Q8dm9pZCo+KCZtaWNyb19jb250ZXh0Xyk7CiAgIGNvbnRleHRfLlJlcG9ydEVycm9yID0gTWljcm9Db250ZXh0UmVwb3J0T3BFcnJvcjsKICAgY29udGV4dF8uR2V0VGVuc29yID0gTWljcm9Db250ZXh0R2V0VGVuc29yOwpAQCAtMTk4LDE1ICsyMTAsMTcgQEAKIAogICBURl9MSVRFX0VOU1VSRV9TVEFUVVMoUHJlcGFyZU5vZGVBbmRSZWdpc3RyYXRpb25EYXRhRnJvbUZsYXRidWZmZXIoKSk7CiAKLSAgbWljcm9fY29udGV4dF8uU2V0SW50ZXJwcmV0ZXJTdGF0ZShNaWNyb0NvbnRleHQ6OkludGVycHJldGVyU3RhdGU6OmtJbml0KTsKKyAgbWljcm9fY29udGV4dF8uU2V0SW50ZXJwcmV0ZXJTdGF0ZSgKKyAgICAgIE1pY3JvSW50ZXJwcmV0ZXJDb250ZXh0OjpJbnRlcnByZXRlclN0YXRlOjprSW5pdCk7CiAgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhncmFwaF8uSW5pdFN1YmdyYXBocygpKTsKIAotICBtaWNyb19jb250ZXh0Xy5TZXRJbnRlcnByZXRlclN0YXRlKE1pY3JvQ29udGV4dDo6SW50ZXJwcmV0ZXJTdGF0ZTo6a1ByZXBhcmUpOworICBtaWNyb19jb250ZXh0Xy5TZXRJbnRlcnByZXRlclN0YXRlKAorICAgICAgTWljcm9JbnRlcnByZXRlckNvbnRleHQ6OkludGVycHJldGVyU3RhdGU6OmtQcmVwYXJlKTsKIAogICBURl9MSVRFX0VOU1VSRV9TVEFUVVMoZ3JhcGhfLlByZXBhcmVTdWJncmFwaHMoKSk7CiAKICAgbWljcm9fY29udGV4dF8uU2V0SW50ZXJwcmV0ZXJTdGF0ZSgKLSAgICAgIE1pY3JvQ29udGV4dDo6SW50ZXJwcmV0ZXJTdGF0ZTo6a01lbW9yeVBsYW5uaW5nKTsKKyAgICAgIE1pY3JvSW50ZXJwcmV0ZXJDb250ZXh0OjpJbnRlcnByZXRlclN0YXRlOjprTWVtb3J5UGxhbm5pbmcpOwogCiAgIFRGX0xJVEVfRU5TVVJFX09LKCZjb250ZXh0XywgYWxsb2NhdG9yXy5GaW5pc2hNb2RlbEFsbG9jYXRpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsXywgZ3JhcGhfLkdldEFsbG9jYXRpb25zKCksCkBAIC0yNjEsNyArMjc1LDggQEAKICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKFJlc2V0KCkpOwogCiAgIHRlbnNvcnNfYWxsb2NhdGVkXyA9IHRydWU7Ci0gIG1pY3JvX2NvbnRleHRfLlNldEludGVycHJldGVyU3RhdGUoTWljcm9Db250ZXh0OjpJbnRlcnByZXRlclN0YXRlOjprSW52b2tlKTsKKyAgbWljcm9fY29udGV4dF8uU2V0SW50ZXJwcmV0ZXJTdGF0ZSgKKyAgICAgIE1pY3JvSW50ZXJwcmV0ZXJDb250ZXh0OjpJbnRlcnByZXRlclN0YXRlOjprSW52b2tlKTsKICAgcmV0dXJuIGtUZkxpdGVPazsKIH0KIApAQCAtMzA1LDYgKzMyMCwxNSBAQAogICByZXR1cm4gZ3JhcGhfLlJlc2V0VmFyaWFibGVUZW5zb3JzKCk7CiB9CiAKK1RmTGl0ZUV2YWxUZW5zb3IqIE1pY3JvSW50ZXJwcmV0ZXI6OkdldFRlbnNvcihpbnQgdGVuc29yX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJncmFwaF9pbmRleCkgeworICBpZiAoIWFsbG9jYXRvcl8ucHJlc2VydmVzX2FsbF90ZW5zb3IoKSkgeworICAgIE1pY3JvUHJpbnRmKCJHZXRUZW5zb3IgcmVxdWlyZXMgYWxsIHRlbnNvcnMgdG8gYmUgcHJlc2VydmVkIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgcmV0dXJuICZncmFwaF8uR2V0QWxsb2NhdGlvbnMoKVtzdWJncmFwaF9pbmRleF0udGVuc29yc1t0ZW5zb3JfaW5kZXhdOworfQorCiBUZkxpdGVTdGF0dXMgTWljcm9JbnRlcnByZXRlcjo6U2V0TWljcm9FeHRlcm5hbENvbnRleHQoCiAgICAgdm9pZCogZXh0ZXJuYWxfY29udGV4dF9wYXlsb2FkKSB7CiAgIHJldHVybiBtaWNyb19jb250ZXh0Xy5zZXRfZXh0ZXJuYWxfY29udGV4dChleHRlcm5hbF9jb250ZXh0X3BheWxvYWQpOwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2ludGVycHJldGVyLmggYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9faW50ZXJwcmV0ZXIuaAppbmRleCBhNzdiMGUwLi4xYzQxOTk2IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9faW50ZXJwcmV0ZXIuaAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9faW50ZXJwcmV0ZXIuaApAQCAtMjQsOCArMjQsOCBAQAogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9jb3JlL2FwaS9lcnJvcl9yZXBvcnRlci5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL3RlbnNvcl9jdHlwZXMuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fYWxsb2NhdG9yLmgiCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2NvbnRleHQuaCIKLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fZ3JhcGguaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9faW50ZXJwcmV0ZXJfY29udGV4dC5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19pbnRlcnByZXRlcl9ncmFwaC5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19vcF9yZXNvbHZlci5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19wcm9maWxlcl9pbnRlcmZhY2UuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvcG9ydGFibGVfdHlwZV90b190ZmxpdGV0eXBlLmgiCkBAIC01MCw3ICs1MCw4IEBACiAgIE1pY3JvSW50ZXJwcmV0ZXIoY29uc3QgTW9kZWwqIG1vZGVsLCBjb25zdCBNaWNyb09wUmVzb2x2ZXImIG9wX3Jlc29sdmVyLAogICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHRlbnNvcl9hcmVuYSwgc2l6ZV90IHRlbnNvcl9hcmVuYV9zaXplLAogICAgICAgICAgICAgICAgICAgIE1pY3JvUmVzb3VyY2VWYXJpYWJsZXMqIHJlc291cmNlX3ZhcmlhYmxlcyA9IG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgTWljcm9Qcm9maWxlckludGVyZmFjZSogcHJvZmlsZXIgPSBudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICBNaWNyb1Byb2ZpbGVySW50ZXJmYWNlKiBwcm9maWxlciA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgYm9vbCBwcmVzZXJ2ZV9hbGxfdGVuc29ycyA9IGZhbHNlKTsKIAogICAvLyBDcmVhdGUgYW4gaW50ZXJwcmV0ZXIgaW5zdGFuY2UgdXNpbmcgYW4gZXhpc3RpbmcgTWljcm9BbGxvY2F0b3IgaW5zdGFuY2UuCiAgIC8vIFRoaXMgY29uc3RydWN0b3Igc2hvdWxkIGJlIHVzZWQgd2hlbiBjcmVhdGluZyBhbiBhbGxvY2F0b3IgdGhhdCBuZWVkcyB0bwpAQCAtMTE1LDYgKzExNiw5IEBACiAgICAgcmV0dXJuIG51bGxwdHI7CiAgIH0KIAorICAvLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgdGVuc29yIGZvciB0aGUgY29ycmVzcG9uZGluZyB0ZW5zb3JfaW5kZXgKKyAgVGZMaXRlRXZhbFRlbnNvciogR2V0VGVuc29yKGludCB0ZW5zb3JfaW5kZXgsIGludCBzdWJncmFwaF9pbmRleCA9IDApOworCiAgIC8vIFJlc2V0IHRoZSBzdGF0ZSB0byBiZSB3aGF0IHlvdSB3b3VsZCBleHBlY3Qgd2hlbiB0aGUgaW50ZXJwcmV0ZXIgaXMgZmlyc3QKICAgLy8gY3JlYXRlZC4gaS5lLiBhZnRlciBJbml0IGFuZCBQcmVwYXJlIGlzIGNhbGxlZCBmb3IgdGhlIHZlcnkgZmlyc3QgdGltZS4KICAgVGZMaXRlU3RhdHVzIFJlc2V0KCk7CkBAIC0xMzUsNiArMTM5LDEzIEBACiAgIC8vIGFyZW5hX3VzZWRfYnl0ZXMoKSArIDE2LgogICBzaXplX3QgYXJlbmFfdXNlZF9ieXRlcygpIGNvbnN0IHsgcmV0dXJuIGFsbG9jYXRvcl8udXNlZF9ieXRlcygpOyB9CiAKKyAgLy8gUmV0dXJucyBUcnVlIGlmIGFsbCBUZW5zb3JzIGFyZSBiZWluZyBwcmVzZXJ2ZXMKKyAgLy8gVE9ETyhiLzI5NzEwNjA3NCkgOiByZXZpc2l0IG1ha2luZyBDKysgZXhhbXBsZSBvciB0ZXN0IGZvcgorICAvLyBwcmVzZXJ2ZV9hbGxfdGVzbm9ycworICBib29sIHByZXNlcnZlX2FsbF90ZW5zb3JzKCkgY29uc3QgeworICAgIHJldHVybiBhbGxvY2F0b3JfLnByZXNlcnZlc19hbGxfdGVuc29yKCk7CisgIH0KKwogIHByb3RlY3RlZDoKICAgY29uc3QgTWljcm9BbGxvY2F0b3ImIGFsbG9jYXRvcigpIGNvbnN0IHsgcmV0dXJuIGFsbG9jYXRvcl87IH0KICAgY29uc3QgVGZMaXRlQ29udGV4dCYgY29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIGNvbnRleHRfOyB9CkBAIC0xNTEsNyArMTYyLDcgQEAKICAgY29uc3QgTWljcm9PcFJlc29sdmVyJiBvcF9yZXNvbHZlcl87CiAgIFRmTGl0ZUNvbnRleHQgY29udGV4dF8gPSB7fTsKICAgTWljcm9BbGxvY2F0b3ImIGFsbG9jYXRvcl87Ci0gIE1pY3JvR3JhcGggZ3JhcGhfOworICBNaWNyb0ludGVycHJldGVyR3JhcGggZ3JhcGhfOwogICBib29sIHRlbnNvcnNfYWxsb2NhdGVkXzsKIAogICBUZkxpdGVTdGF0dXMgaW5pdGlhbGl6YXRpb25fc3RhdHVzXzsKQEAgLTE2Myw3ICsxNzQsNyBAQAogICBUZkxpdGVUZW5zb3IqKiBpbnB1dF90ZW5zb3JzXzsKICAgVGZMaXRlVGVuc29yKiogb3V0cHV0X3RlbnNvcnNfOwogCi0gIE1pY3JvQ29udGV4dCBtaWNyb19jb250ZXh0XzsKKyAgTWljcm9JbnRlcnByZXRlckNvbnRleHQgbWljcm9fY29udGV4dF87CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9faW50ZXJwcmV0ZXJfY29udGV4dC5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19pbnRlcnByZXRlcl9jb250ZXh0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYTQ2MWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9faW50ZXJwcmV0ZXJfY29udGV4dC5jYwpAQCAtMCwwICsxLDIwOCBAQAorLyogQ29weXJpZ2h0IDIwMjQgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9faW50ZXJwcmV0ZXJfY29udGV4dC5oIgorCisjaW5jbHVkZSA8Y3N0ZGludD4KKworI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL2NvbXBhdGliaWxpdHkuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fdXRpbHMuaCIKKworbmFtZXNwYWNlIHRmbGl0ZSB7CisKK25hbWVzcGFjZSB7CisKKyNpZmRlZiBVU0VfVEZMTV9DT01QUkVTU0lPTgorCitpbnQgR2V0SW5wdXRUZW5zb3JJbmRleChjb25zdCBUZkxpdGVOb2RlKiBub2RlLCBjb25zdCBpbnQgaW5kZXgpIHsKKyAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBub2RlLT5pbnB1dHMtPnNpemUpIHsKKyAgICBjb25zdCBpbnQgdGVuc29yX2luZGV4ID0gbm9kZS0+aW5wdXRzLT5kYXRhW2luZGV4XTsKKyAgICBpZiAodGVuc29yX2luZGV4ICE9IGtUZkxpdGVPcHRpb25hbFRlbnNvcikgeworICAgICAgcmV0dXJuIHRlbnNvcl9pbmRleDsKKyAgICB9CisgIH0KKyAgcmV0dXJuIC0xOworfQorCisjZW5kaWYgIC8vIFVTRV9URkxNX0NPTVBSRVNTSU9OCisKK30gIC8vIG5hbWVzcGFjZQorCitNaWNyb0ludGVycHJldGVyQ29udGV4dDo6TWljcm9JbnRlcnByZXRlckNvbnRleHQoTWljcm9BbGxvY2F0b3IqIGFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2RlbCogbW9kZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWljcm9JbnRlcnByZXRlckdyYXBoKiBncmFwaCkKKyAgICA6IGFsbG9jYXRvcl8oKmFsbG9jYXRvciksCisgICAgICBncmFwaF8oKmdyYXBoKSwKKyAgICAgIG1vZGVsXyhtb2RlbCksCisgICAgICBzdGF0ZV8oSW50ZXJwcmV0ZXJTdGF0ZTo6a0luaXQpIHt9CisKK01pY3JvSW50ZXJwcmV0ZXJDb250ZXh0Ojp+TWljcm9JbnRlcnByZXRlckNvbnRleHQoKSB7fQorCit2b2lkKiBNaWNyb0ludGVycHJldGVyQ29udGV4dDo6QWxsb2NhdGVQZXJzaXN0ZW50QnVmZmVyKHNpemVfdCBieXRlcykgeworICBURkxJVEVfRENIRUNLKHN0YXRlXyA9PSBJbnRlcnByZXRlclN0YXRlOjprUHJlcGFyZSB8fAorICAgICAgICAgICAgICAgIHN0YXRlXyA9PSBJbnRlcnByZXRlclN0YXRlOjprSW5pdCk7CisgIHJldHVybiBhbGxvY2F0b3JfLkFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlcihieXRlcyk7Cit9CisKK1RmTGl0ZVN0YXR1cyBNaWNyb0ludGVycHJldGVyQ29udGV4dDo6UmVxdWVzdFNjcmF0Y2hCdWZmZXJJbkFyZW5hKAorICAgIHNpemVfdCBieXRlcywgaW50KiBidWZmZXJfaWR4KSB7CisgIFRGTElURV9EQ0hFQ0soc3RhdGVfID09IEludGVycHJldGVyU3RhdGU6OmtQcmVwYXJlKTsKKyAgcmV0dXJuIGFsbG9jYXRvcl8uUmVxdWVzdFNjcmF0Y2hCdWZmZXJJbkFyZW5hKAorICAgICAgYnl0ZXMsIGdyYXBoXy5HZXRDdXJyZW50U3ViZ3JhcGhJbmRleCgpLCBidWZmZXJfaWR4KTsKK30KKwordm9pZCogTWljcm9JbnRlcnByZXRlckNvbnRleHQ6OkdldFNjcmF0Y2hCdWZmZXIoaW50IGJ1ZmZlcl9pZHgpIHsKKyAgVEZMSVRFX0RDSEVDSyhzdGF0ZV8gPT0gSW50ZXJwcmV0ZXJTdGF0ZTo6a0ludm9rZSk7CisgIFNjcmF0Y2hCdWZmZXJIYW5kbGUqIGhhbmRsZSA9IHNjcmF0Y2hfYnVmZmVyX2hhbmRsZXNfICsgYnVmZmVyX2lkeDsKKyAgcmV0dXJuIGhhbmRsZS0+ZGF0YTsKK30KKworVGZMaXRlVGVuc29yKiBNaWNyb0ludGVycHJldGVyQ29udGV4dDo6QWxsb2NhdGVUZW1wVGZMaXRlVGVuc29yKAorICAgIGludCB0ZW5zb3JfaWR4KSB7CisgIHJldHVybiBhbGxvY2F0b3JfLkFsbG9jYXRlVGVtcFRmTGl0ZVRlbnNvcihtb2RlbF8sIGdyYXBoXy5HZXRBbGxvY2F0aW9ucygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVuc29yX2lkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBoXy5HZXRDdXJyZW50U3ViZ3JhcGhJbmRleCgpKTsKK30KKwordm9pZCBNaWNyb0ludGVycHJldGVyQ29udGV4dDo6RGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3IoVGZMaXRlVGVuc29yKiB0ZW5zb3IpIHsKKyAgcmV0dXJuIGFsbG9jYXRvcl8uRGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3IodGVuc29yKTsKK30KKwordWludDhfdCogTWljcm9JbnRlcnByZXRlckNvbnRleHQ6OkFsbG9jYXRlVGVtcEJ1ZmZlcihzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGFsaWdubWVudCkgeworICBURkxJVEVfRENIRUNLKHN0YXRlXyA9PSBJbnRlcnByZXRlclN0YXRlOjprUHJlcGFyZSk7CisgIHJldHVybiBhbGxvY2F0b3JfLkFsbG9jYXRlVGVtcEJ1ZmZlcihzaXplLCBhbGlnbm1lbnQpOworfQorCit2b2lkIE1pY3JvSW50ZXJwcmV0ZXJDb250ZXh0OjpEZWFsbG9jYXRlVGVtcEJ1ZmZlcih1aW50OF90KiBidWZmZXIpIHsKKyAgVEZMSVRFX0RDSEVDSyhzdGF0ZV8gPT0gSW50ZXJwcmV0ZXJTdGF0ZTo6a1ByZXBhcmUpOworICBhbGxvY2F0b3JfLkRlYWxsb2NhdGVUZW1wQnVmZmVyKGJ1ZmZlcik7Cit9CisKK1RmTGl0ZUV2YWxUZW5zb3IqIE1pY3JvSW50ZXJwcmV0ZXJDb250ZXh0OjpHZXRFdmFsVGVuc29yKGludCB0ZW5zb3JfaWR4KSB7CisgIHJldHVybiAmZ3JhcGhfLkdldEFsbG9jYXRpb25zKClbZ3JhcGhfLkdldEN1cnJlbnRTdWJncmFwaEluZGV4KCldCisgICAgICAgICAgICAgIC50ZW5zb3JzW3RlbnNvcl9pZHhdOworfQorCit2b2lkIE1pY3JvSW50ZXJwcmV0ZXJDb250ZXh0OjpTZXRTY3JhdGNoQnVmZmVySGFuZGxlcygKKyAgICBTY3JhdGNoQnVmZmVySGFuZGxlKiBzY3JhdGNoX2J1ZmZlcl9oYW5kbGVzKSB7CisgIHNjcmF0Y2hfYnVmZmVyX2hhbmRsZXNfID0gc2NyYXRjaF9idWZmZXJfaGFuZGxlczsKK30KKworVGZMaXRlU3RhdHVzIE1pY3JvSW50ZXJwcmV0ZXJDb250ZXh0OjpzZXRfZXh0ZXJuYWxfY29udGV4dCgKKyAgICB2b2lkKiBleHRlcm5hbF9jb250ZXh0X3BheWxvYWQpIHsKKyAgVEZMSVRFX0RDSEVDSyhzdGF0ZV8gPT0gSW50ZXJwcmV0ZXJTdGF0ZTo6a1ByZXBhcmUgfHwKKyAgICAgICAgICAgICAgICBzdGF0ZV8gPT0gSW50ZXJwcmV0ZXJTdGF0ZTo6a0ludm9rZSk7CisgIGlmIChleHRlcm5hbF9jb250ZXh0X3BheWxvYWQgPT0gbnVsbHB0ciB8fAorICAgICAgZXh0ZXJuYWxfY29udGV4dF9wYXlsb2FkXyAhPSBudWxscHRyKSB7CisgICAgTWljcm9QcmludGYoCisgICAgICAgICJBdHRlbXB0aW5nIHRvIHNldCBleHRlcm5hbCBjb250ZXh0IHRvICV4IGJ1dCBpdCB3YXMgJXggYWxyZWFkeSIsCisgICAgICAgIGV4dGVybmFsX2NvbnRleHRfcGF5bG9hZCwgZXh0ZXJuYWxfY29udGV4dF9wYXlsb2FkXyk7CisgICAgcmV0dXJuIGtUZkxpdGVFcnJvcjsKKyAgfQorCisgIGV4dGVybmFsX2NvbnRleHRfcGF5bG9hZF8gPSBleHRlcm5hbF9jb250ZXh0X3BheWxvYWQ7CisgIHJldHVybiBrVGZMaXRlT2s7Cit9CisKK3ZvaWQgTWljcm9JbnRlcnByZXRlckNvbnRleHQ6OlNldEludGVycHJldGVyU3RhdGUoSW50ZXJwcmV0ZXJTdGF0ZSBzdGF0ZSkgeworICBzdGF0ZV8gPSBzdGF0ZTsKK30KKworTWljcm9JbnRlcnByZXRlckNvbnRleHQ6OkludGVycHJldGVyU3RhdGUKK01pY3JvSW50ZXJwcmV0ZXJDb250ZXh0OjpHZXRJbnRlcnByZXRlclN0YXRlKCkgY29uc3QgeworICByZXR1cm4gc3RhdGVfOworfQorCisjaWZkZWYgVVNFX1RGTE1fQ09NUFJFU1NJT04KKworLy8gQXZhaWxhYmxlIGR1cmluZyBQcmVwYXJlICYgRXZhbC4gUmV0dXJucyBmYWxzZSBpZiB0ZW5zb3IgaXMgbm90CisvLyBjb21wcmVzc2VkLgorYm9vbCBNaWNyb0ludGVycHJldGVyQ29udGV4dDo6SXNUZW5zb3JDb21wcmVzc2VkKGNvbnN0IFRmTGl0ZU5vZGUqIG5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRlbnNvcl9pZHgpIHsKKyAgVEZMSVRFX0RDSEVDSyhzdGF0ZV8gPT0gSW50ZXJwcmV0ZXJTdGF0ZTo6a1ByZXBhcmUgfHwKKyAgICAgICAgICAgICAgICBzdGF0ZV8gPT0gSW50ZXJwcmV0ZXJTdGF0ZTo6a0ludm9rZSk7CisKKyAgY29uc3QgU3ViZ3JhcGhBbGxvY2F0aW9ucyogYWxsb2NhdGlvbnMgPQorICAgICAgJmdyYXBoXy5HZXRBbGxvY2F0aW9ucygpW2dyYXBoXy5HZXRDdXJyZW50U3ViZ3JhcGhJbmRleCgpXTsKKyAgaWYgKGFsbG9jYXRpb25zLT5jb21wcmVzc2VkLnRlbnNvcnMgPT0gbnVsbHB0cikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpbnQgaW5kZXggPSBHZXRJbnB1dFRlbnNvckluZGV4KG5vZGUsIHRlbnNvcl9pZHgpOworICBpZiAoaW5kZXggPT0gLTEpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIGFsbG9jYXRpb25zLT5jb21wcmVzc2VkLnRlbnNvcnNbaW5kZXhdICE9IG51bGxwdHI7Cit9CisKKy8vIE9ubHkgYXZhaWxhYmxlIGR1cmluZyBQcmVwYXJlLiBUaGUga2VybmVsIGlzIHJlc3BvbnNpYmxlIGZvciBzdG9yaW5nIHRoZQorLy8gc2NyYXRjaCBidWZmZXIgaGFuZGxlLgoraW50IE1pY3JvSW50ZXJwcmV0ZXJDb250ZXh0OjpBbGxvY2F0ZURlY29tcHJlc3Npb25TY3JhdGNoQnVmZmVyKAorICAgIGNvbnN0IFRmTGl0ZU5vZGUqIG5vZGUsIGludCB0ZW5zb3JfaWR4KSB7CisgIFRGTElURV9EQ0hFQ0soc3RhdGVfID09IEludGVycHJldGVyU3RhdGU6OmtQcmVwYXJlKTsKKworICBjb25zdCBTdWJncmFwaEFsbG9jYXRpb25zKiBhbGxvY2F0aW9ucyA9CisgICAgICAmZ3JhcGhfLkdldEFsbG9jYXRpb25zKClbZ3JhcGhfLkdldEN1cnJlbnRTdWJncmFwaEluZGV4KCldOworICBpZiAoYWxsb2NhdGlvbnMtPmNvbXByZXNzZWQudGVuc29ycyA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGludCBpbmRleCA9IEdldElucHV0VGVuc29ySW5kZXgobm9kZSwgdGVuc29yX2lkeCk7CisgIGlmIChpbmRleCA9PSAtMSB8fCBhbGxvY2F0aW9ucy0+Y29tcHJlc3NlZC50ZW5zb3JzW2luZGV4XSA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3IqIHRlbnNvciA9ICZhbGxvY2F0aW9ucy0+dGVuc29yc1tpbmRleF07CisgIGNvbnN0IHNpemVfdCBieXRlX2NvdW50ID0gRXZhbFRlbnNvckJ5dGVzKHRlbnNvcik7CisgIGludCBzY3JhdGNoX2luZGV4ID0gLTE7CisgIFRmTGl0ZVN0YXR1cyByZXN1bHQgPSBSZXF1ZXN0U2NyYXRjaEJ1ZmZlckluQXJlbmEoYnl0ZV9jb3VudCwgJnNjcmF0Y2hfaW5kZXgpOworICBpZiAocmVzdWx0ICE9IGtUZkxpdGVPaykgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIHJldHVybiBzY3JhdGNoX2luZGV4OworfQorCisvLyBBdmFpbGFibGUgZHVyaW5nIFByZXBhcmUgJiBFdmFsLiBSZXR1cm5zIG51bGxwdHIgaWYgdGVuc29yIGlzIG5vdAorLy8gY29tcHJlc3NlZC4KK2NvbnN0IENvbXByZXNzaW9uVGVuc29yRGF0YSogTWljcm9JbnRlcnByZXRlckNvbnRleHQ6OkdldFRlbnNvckNvbXByZXNzaW9uRGF0YSgKKyAgICBjb25zdCBUZkxpdGVOb2RlKiBub2RlLCBpbnQgdGVuc29yX2lkeCkgeworICBURkxJVEVfRENIRUNLKHN0YXRlXyA9PSBJbnRlcnByZXRlclN0YXRlOjprUHJlcGFyZSB8fAorICAgICAgICAgICAgICAgIHN0YXRlXyA9PSBJbnRlcnByZXRlclN0YXRlOjprSW52b2tlKTsKKworICBjb25zdCBTdWJncmFwaEFsbG9jYXRpb25zKiBhbGxvY2F0aW9ucyA9CisgICAgICAmZ3JhcGhfLkdldEFsbG9jYXRpb25zKClbZ3JhcGhfLkdldEN1cnJlbnRTdWJncmFwaEluZGV4KCldOworICBpZiAoYWxsb2NhdGlvbnMtPmNvbXByZXNzZWQudGVuc29ycyA9PSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgaW50IGluZGV4ID0gR2V0SW5wdXRUZW5zb3JJbmRleChub2RlLCB0ZW5zb3JfaWR4KTsKKyAgaWYgKGluZGV4ID09IC0xKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgcmV0dXJuIGFsbG9jYXRpb25zLT5jb21wcmVzc2VkLnRlbnNvcnNbaW5kZXhdOworfQorCisvLyBPbmx5IGF2YWlsYWJsZSBkdXJpbmcgRXZhbC4gUmV0dXJucyBudWxscHRyIG9uIGZhaWx1cmUsIG90aGVyd2lzZSByZXR1cm5zIGEKKy8vIHBvaW50ZXIgdG8gdGhlIHNjcmF0Y2ggYnVmZmVyLgordm9pZCogTWljcm9JbnRlcnByZXRlckNvbnRleHQ6OkRlY29tcHJlc3NUZW5zb3JUb1NjcmF0Y2hCdWZmZXIoCisgICAgY29uc3QgVGZMaXRlRXZhbFRlbnNvciYgdGVuc29yLAorICAgIGNvbnN0IENvbXByZXNzaW9uVGVuc29yRGF0YSYgY29tcHJlc3Npb25fZGF0YSwgaW50IHNjcmF0Y2hfYnVmZmVyX2hhbmRsZSkgeworICBURkxJVEVfRENIRUNLKHN0YXRlXyA9PSBJbnRlcnByZXRlclN0YXRlOjprSW52b2tlKTsKKworICByZXR1cm4gTWljcm9Db250ZXh0OjpEZWNvbXByZXNzVGVuc29yVG9TY3JhdGNoQnVmZmVyKHRlbnNvciwgY29tcHJlc3Npb25fZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JhdGNoX2J1ZmZlcl9oYW5kbGUpOworfQorCisjZW5kaWYgIC8vIFVTRV9URkxNX0NPTVBSRVNTSU9OCisKK30gIC8vIG5hbWVzcGFjZSB0ZmxpdGUKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19pbnRlcnByZXRlcl9jb250ZXh0LmggYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9faW50ZXJwcmV0ZXJfY29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMzM2YWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9faW50ZXJwcmV0ZXJfY29udGV4dC5oCkBAIC0wLDAgKzEsMTQ4IEBACisvKiBDb3B5cmlnaHQgMjAyNCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2lmbmRlZiBURU5TT1JGTE9XX0xJVEVfTUlDUk9fTUlDUk9fSU5URVJQUkVURVJfQ09OVEVYVF9IXworI2RlZmluZSBURU5TT1JGTE9XX0xJVEVfTUlDUk9fTUlDUk9fSU5URVJQUkVURVJfQ09OVEVYVF9IXworCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2MvY29tbW9uLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2FsbG9jYXRvci5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19jb250ZXh0LmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2ludGVycHJldGVyX2dyYXBoLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2xvZy5oIgorCituYW1lc3BhY2UgdGZsaXRlIHsKKworLy8gQSBmdWxsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBNaWNyb0NvbnRleHQsIHRvIGJlIHVzZWQgYnkgdGhlCisvLyBNaWNyb0ludGVycHJldGVyLiBLZXJuZWxzIHNob3VsZCBub3QgZGVwZW5kIG9uIHRoaXMgZGlyZWN0bHkuIEluc3RlYWQgdGhleQorLy8gc2hvdWxkIG9ubHkgZGVwZW5kIG9uIHRoZSBNaWNyb0NvbnRleHQuCitjbGFzcyBNaWNyb0ludGVycHJldGVyQ29udGV4dCA6IHB1YmxpYyBNaWNyb0NvbnRleHQgeworIHB1YmxpYzoKKyAgLy8gRW51bSB0aGF0IGFsbG93cyBNaWNyb0NvbnRleHQgdG8ga2VlcCB0cmFjayBvZiB0aGUgc3RhZ2VzIGRpZmZlcmVudCBtZW1vcnkKKyAgLy8gcGxhbm5pbmcgQVBJcyBhcmUgYXZhaWxhYmxlIHRvIGtlcm5lbHMuCisgIGVudW0gY2xhc3MgSW50ZXJwcmV0ZXJTdGF0ZSB7CisgICAga0luaXQsCisgICAga1ByZXBhcmUsCisgICAga01lbW9yeVBsYW5uaW5nLAorICAgIGtJbnZva2UsCisgIH07CisKKyAgLy8gRG9lcyBub3QgdGFrZSBhbnkgb3duZXJzaGlwLCBhbmQgYWxsIHBvaW50ZXJzIG11c3QgcmVmZXIgdG8gdmFsaWQgb2JqZWN0cworICAvLyB0aGF0IG91dGxpdmUgdGhlIG9uZSBjb25zdHJ1Y3RlZC4KKyAgTWljcm9JbnRlcnByZXRlckNvbnRleHQoTWljcm9BbGxvY2F0b3IqIGFsbG9jYXRvciwgY29uc3QgTW9kZWwqIG1vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNaWNyb0ludGVycHJldGVyR3JhcGgqIGdyYXBoKTsKKyAgdmlydHVhbCB+TWljcm9JbnRlcnByZXRlckNvbnRleHQoKTsKKworICAvLyBBbGxvY2F0ZSBwZXJzaXN0ZW50IGJ1ZmZlciB3aGljaCBoYXMgdGhlIHNhbWUgbGlmZSB0aW1lIGFzIHRoZSBpbnRlcnByZXRlci4KKyAgLy8gUmV0dXJucyBudWxscHRyIG9uIGZhaWx1cmUuCisgIC8vIFRoZSBtZW1vcnkgaXMgYWxsb2NhdGVkIGZyb20gdGhlIHRhaWwuCisgIC8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgYXZhaWxhYmxlIGluIEluaXQgb3IgUHJlcGFyZSBzdGFnZS4KKyAgLy8gVmlydHVhbCBzbyB0aGF0IGl0IGNhbiBiZSBmYWtlZCBmb3Iga2VybmVsIHRlc3RzLgorICB2aXJ0dWFsIHZvaWQqIEFsbG9jYXRlUGVyc2lzdGVudEJ1ZmZlcihzaXplX3QgYnl0ZXMpIG92ZXJyaWRlOworCisgIC8vIFJlcXVlc3QgYSBzY3JhdGNoIGJ1ZmZlciBpbiB0aGUgYXJlbmEgdGhyb3VnaCBzdGF0aWMgbWVtb3J5IHBsYW5uaW5nLgorICAvLyBUaGlzIG1ldGhvZCBpcyBvbmx5IGF2YWlsYWJsZSBpbiBQcmVwYXJlIHN0YWdlIGFuZCB0aGUgYnVmZmVyIGlzIGFsbG9jYXRlZAorICAvLyBieSB0aGUgaW50ZXJwcmV0ZXIgYmV0d2VlbiBQcmVwYXJlIGFuZCBFdmFsIHN0YWdlLiBJbiBFdmFsIHN0YWdlLAorICAvLyBHZXRTY3JhdGNoQnVmZmVyIEFQSSBjYW4gYmUgdXNlZCB0byBmZXRjaCB0aGUgYWRkcmVzcy4KKyAgLy8gVmlydHVhbCBzbyB0aGF0IGl0IGNhbiBiZSBmYWtlZCBmb3Iga2VybmVsIHRlc3RzLgorICB2aXJ0dWFsIFRmTGl0ZVN0YXR1cyBSZXF1ZXN0U2NyYXRjaEJ1ZmZlckluQXJlbmEoc2l6ZV90IGJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBidWZmZXJfaWR4KSBvdmVycmlkZTsKKworICAvLyBHZXQgdGhlIHNjcmF0Y2ggYnVmZmVyIHBvaW50ZXIuCisgIC8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgYXZhaWxhYmxlIGluIEV2YWwgc3RhZ2UuCisgIC8vIFZpcnR1YWwgc28gdGhhdCBpdCBjYW4gYmUgZmFrZWQgZm9yIGtlcm5lbCB0ZXN0cy4KKyAgdmlydHVhbCB2b2lkKiBHZXRTY3JhdGNoQnVmZmVyKGludCBidWZmZXJfaWR4KSBvdmVycmlkZTsKKworICAvLyBSZXR1cm5zIGEgdGVtcG9yYXJ5IFRmTGl0ZVRlbnNvciBzdHJ1Y3QgZm9yIGEgZ2l2ZW4gaW5kZXguCisgIC8vIFZpcnR1YWwgc28gdGhhdCBpdCBjYW4gYmUgZmFrZWQgZm9yIGtlcm5lbCB0ZXN0cy4KKyAgdmlydHVhbCBUZkxpdGVUZW5zb3IqIEFsbG9jYXRlVGVtcFRmTGl0ZVRlbnNvcihpbnQgdGVuc29yX2lkeCkgb3ZlcnJpZGU7CisKKyAgLy8gRGVhbGxvY2F0ZXMgYSB0ZW1wIFRmTGl0ZVRlbnNvci4KKyAgLy8gVmlydHVhbCBzbyB0aGF0IGl0IGNhbiBiZSBmYWtlZCBmb3Iga2VybmVsIHRlc3RzLgorICB2aXJ0dWFsIHZvaWQgRGVhbGxvY2F0ZVRlbXBUZkxpdGVUZW5zb3IoVGZMaXRlVGVuc29yKiB0ZW5zb3IpIG92ZXJyaWRlOworCisgIC8vIFJldHVybnMgYSBwb2ludGVyIHRvIGEgdGVtcG9yYXJ5IGJ1ZmZlciAoZnJvbSB0aGUgYXJlbmEpLgorICAvLyBUaGlzIEFQSSBpcyBvbmx5IHZhbGlkIGZyb20gdGhlIGtlcm5lbCdzIFByZXBhcmUgZnVuY3Rpb24gYW5kCisgIC8vIHRoZSBidWZmZXIncyBsaWZldGltZSBpcyBhbHNvIHRoYXQgb2YgdGhlIFByZXBhcmUgZnVuY3Rpb24uCisgIC8vIFZpcnR1YWwgc28gdGhhdCBpdCBjYW4gYmUgZmFrZWQgZm9yIGtlcm5lbCB0ZXN0cy4KKyAgdmlydHVhbCB1aW50OF90KiBBbGxvY2F0ZVRlbXBCdWZmZXIoc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbm1lbnQpIG92ZXJyaWRlOworCisgIC8vIFNpZ25hbHMgdGhhdCB0aGUgdGVtcG9yYXJ5IGJ1ZmZlciBpcyBubyBsb25nZXIgbmVlZGVkLgorICAvLyBWaXJ0dWFsIHNvIHRoYXQgaXQgY2FuIGJlIGZha2VkIGZvciBrZXJuZWwgdGVzdHMuCisgIHZpcnR1YWwgdm9pZCBEZWFsbG9jYXRlVGVtcEJ1ZmZlcih1aW50OF90KiBidWZmZXIpIG92ZXJyaWRlOworCisgIC8vIFJldHVybnMgYSBUZkxpdGVFdmFsVGVuc29yIHN0cnVjdCBmb3IgYSBnaXZlbiBpbmRleC4KKyAgLy8gVmlydHVhbCBzbyB0aGF0IGl0IGNhbiBiZSBmYWtlZCBmb3Iga2VybmVsIHRlc3RzLgorICB2aXJ0dWFsIFRmTGl0ZUV2YWxUZW5zb3IqIEdldEV2YWxUZW5zb3IoaW50IHRlbnNvcl9pZHgpIG92ZXJyaWRlOworCisgIC8vIFNldHMgdGhlIFN0YXRlIG9mIE1lbW9yeVBsYW5uaW5nIE1pY3JvSW50ZXJwcmV0ZXJDb250ZXh0CisgIHZvaWQgU2V0SW50ZXJwcmV0ZXJTdGF0ZShJbnRlcnByZXRlclN0YXRlIHN0YXRlKTsKKworICAvLyBTZXRzIHRoZSBTdGF0ZSBvZiBNZW1vcnlQbGFubmluZyBNaWNyb0ludGVycHJldGVyQ29udGV4dAorICBJbnRlcnByZXRlclN0YXRlIEdldEludGVycHJldGVyU3RhdGUoKSBjb25zdDsKKworICAvLyBEb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiB0aGUgcG9pbnRlciBhbmQgdGhlIHBvaW50ZXIgbXVzdCByZWZlciB0byB2YWxpZAorICAvLyBhbiBvYmplY3QgdGhhdCBvdXRsaXZlIHRoaXMgY2xhc3MgaW5zdGFuY2UuCisgIC8vIFRoaXMgY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UgdG8gc2V0IG9uZSBleHRlcm5hbCBjb250ZXh0LgorICBUZkxpdGVTdGF0dXMgc2V0X2V4dGVybmFsX2NvbnRleHQodm9pZCogZXh0ZXJuYWxfY29udGV4dF9wYXlsb2FkKSBvdmVycmlkZTsKKworICB2b2lkKiBleHRlcm5hbF9jb250ZXh0KCkgb3ZlcnJpZGUgeyByZXR1cm4gZXh0ZXJuYWxfY29udGV4dF9wYXlsb2FkXzsgfQorCisgIE1pY3JvR3JhcGgmIGdyYXBoKCkgb3ZlcnJpZGUgeyByZXR1cm4gZ3JhcGhfOyB9CisKKyAgLy8gU2V0cyB0aGUgcG9pbnRlciB0byBhIGxpc3Qgb2YgU2NyYXRjaEJ1ZmZlckhhbmRsZSBpbnN0YW5jZXMuCisgIC8vIE5vdCBBUEkgYmV0d2VlbiBURkxNIGFuZCBrZXJuZWxzLiBQcmltYXJpbHkgdXNlZCBieSB0aGUgZnJhbWV3b3JrIGZvcgorICAvLyBob3VzZWtlZXBpbmcgaW4gTWljcm9JbnRlcnByZXRlckNvbnRleHQuCisgIHZvaWQgU2V0U2NyYXRjaEJ1ZmZlckhhbmRsZXMoU2NyYXRjaEJ1ZmZlckhhbmRsZSogc2NyYXRjaF9idWZmZXJfaGFuZGxlcyk7CisKKyNpZmRlZiBVU0VfVEZMTV9DT01QUkVTU0lPTgorCisgIC8vIEF2YWlsYWJsZSBkdXJpbmcgUHJlcGFyZSAmIEV2YWwuIFJldHVybnMgZmFsc2UgaWYgdGVuc29yIGlzIG5vdAorICAvLyBjb21wcmVzc2VkLgorICBib29sIElzVGVuc29yQ29tcHJlc3NlZChjb25zdCBUZkxpdGVOb2RlKiBub2RlLCBpbnQgdGVuc29yX2lkeCkgb3ZlcnJpZGU7CisKKyAgLy8gT25seSBhdmFpbGFibGUgZHVyaW5nIFByZXBhcmUuIFRoZSBrZXJuZWwgaXMgcmVzcG9uc2libGUgZm9yIHN0b3JpbmcgdGhlCisgIC8vIHNjcmF0Y2ggYnVmZmVyIGhhbmRsZS4KKyAgaW50IEFsbG9jYXRlRGVjb21wcmVzc2lvblNjcmF0Y2hCdWZmZXIoY29uc3QgVGZMaXRlTm9kZSogbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRlbnNvcl9pZHgpIG92ZXJyaWRlOworCisgIC8vIEF2YWlsYWJsZSBkdXJpbmcgUHJlcGFyZSAmIEV2YWwuIFJldHVybnMgbnVsbHB0ciBpZiB0ZW5zb3IgaXMgbm90CisgIC8vIGNvbXByZXNzZWQuCisgIGNvbnN0IENvbXByZXNzaW9uVGVuc29yRGF0YSogR2V0VGVuc29yQ29tcHJlc3Npb25EYXRhKAorICAgICAgY29uc3QgVGZMaXRlTm9kZSogbm9kZSwgaW50IHRlbnNvcl9pZHgpIG92ZXJyaWRlOworCisgIC8vIE9ubHkgYXZhaWxhYmxlIGR1cmluZyBFdmFsLiBSZXR1cm5zIG51bGxwdHIgb24gZmFpbHVyZSwgb3RoZXJ3aXNlIHJldHVybnMgYQorICAvLyBwb2ludGVyIHRvIHRoZSBzY3JhdGNoIGJ1ZmZlci4KKyAgdm9pZCogRGVjb21wcmVzc1RlbnNvclRvU2NyYXRjaEJ1ZmZlcigKKyAgICAgIGNvbnN0IFRmTGl0ZUV2YWxUZW5zb3ImIHRlbnNvciwKKyAgICAgIGNvbnN0IENvbXByZXNzaW9uVGVuc29yRGF0YSYgY29tcHJlc3Npb25fZGF0YSwKKyAgICAgIGludCBzY3JhdGNoX2J1ZmZlcl9oYW5kbGUpIG92ZXJyaWRlOworCisjZW5kaWYgIC8vIFVTRV9URkxNX0NPTVBSRVNTSU9OCisKKyBwcml2YXRlOgorICBNaWNyb0FsbG9jYXRvciYgYWxsb2NhdG9yXzsKKyAgTWljcm9JbnRlcnByZXRlckdyYXBoJiBncmFwaF87CisgIGNvbnN0IE1vZGVsKiBtb2RlbF87CisgIEludGVycHJldGVyU3RhdGUgc3RhdGVfOworCisgIFNjcmF0Y2hCdWZmZXJIYW5kbGUqIHNjcmF0Y2hfYnVmZmVyX2hhbmRsZXNfID0gbnVsbHB0cjsKKyAgdm9pZCogZXh0ZXJuYWxfY29udGV4dF9wYXlsb2FkXyA9IG51bGxwdHI7CisKKyAgVEZfTElURV9SRU1PVkVfVklSVFVBTF9ERUxFVEUKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZmxpdGUKKworI2VuZGlmICAvLyBURU5TT1JGTE9XX0xJVEVfTUlDUk9fTUlDUk9fSU5URVJQUkVURVJfQ09OVEVYVF9IXwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2NvbnRleHRfdGVzdC5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19pbnRlcnByZXRlcl9jb250ZXh0X3Rlc3QuY2MKc2ltaWxhcml0eSBpbmRleCA3OCUKcmVuYW1lIGZyb20gdGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2NvbnRleHRfdGVzdC5jYwpyZW5hbWUgdG8gdGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2ludGVycHJldGVyX2NvbnRleHRfdGVzdC5jYwppbmRleCBlMDFkMzg3Li4zYWYxMjNmIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fY29udGV4dF90ZXN0LmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19pbnRlcnByZXRlcl9jb250ZXh0X3Rlc3QuY2MKQEAgLTEyLDEyICsxMiwxMyBAQAogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19jb250ZXh0LmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2ludGVycHJldGVyX2NvbnRleHQuaCIKIAogI2luY2x1ZGUgPGNzdGRpbnQ+CiAKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fYWxsb2NhdG9yLmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2FyZW5hX2NvbnN0YW50cy5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19pbnRlcnByZXRlcl9ncmFwaC5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0X2hlbHBlcnMuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vdGVzdGluZy9taWNyb190ZXN0LmgiCiAKQEAgLTI2LDIzICsyNywyMCBAQAogbmFtZXNwYWNlIHRmbGl0ZSB7CiBuYW1lc3BhY2UgewogCi10ZmxpdGU6Ok1pY3JvQ29udGV4dCBDcmVhdGVNaWNyb0NvbnRleHQoKSB7Cit0ZmxpdGU6Ok1pY3JvSW50ZXJwcmV0ZXJDb250ZXh0IENyZWF0ZU1pY3JvSW50ZXJwcmV0ZXJDb250ZXh0KCkgewogICAvLyBTb21lIHRhcmdldHMgZG8gbm90IHN1cHBvcnQgZHluYW1pYyBtZW1vcnkgKGkuZS4sIG5vIG1hbGxvYyBvciBuZXcpLCB0aHVzLAogICAvLyB0aGUgdGVzdCBuZWVkIHRvIHBsYWNlIG5vbi10cmFuc2llbnQgbWVtb3JpZXMgaW4gc3RhdGljIHZhcmlhYmxlcy4gVGhpcyBpcwogICAvLyBzYWZlIGJlY2F1c2UgdGVzdHMgYXJlIGd1YXJhbnRlZWQgdG8gcnVuIHNlcmlhbGx5LgotICBjb25zdGV4cHIgc2l6ZV90IGtNaWNyb0dyYXBoUGxhY2VtZW50QnVmZmVyU2l6ZSA9IDEwMjQ7Ci0gIGFsaWduYXMoNCkgc3RhdGljIHVpbnQ4X3QKLSAgICAgIG1pY3JvX2dyYXBoX3BsYWNlbWVudF9idWZmZXJba01pY3JvR3JhcGhQbGFjZW1lbnRCdWZmZXJTaXplXTsKICAgY29uc3RleHByIHNpemVfdCBrQXJlbmFTaXplID0gMTAyNDsKICAgc3RhdGljIHVpbnQ4X3QgdGVuc29yX2FyZW5hW2tBcmVuYVNpemVdOwogCiAgIGNvbnN0IHRmbGl0ZTo6TW9kZWwqIG1vZGVsID0gdGZsaXRlOjp0ZXN0aW5nOjpHZXRTaW1wbGVNb2NrTW9kZWwoKTsKICAgTWljcm9BbGxvY2F0b3IqIG1pY3JvX2FsbG9jYXRvciA9CiAgICAgICBNaWNyb0FsbG9jYXRvcjo6Q3JlYXRlKHRlbnNvcl9hcmVuYSwga0FyZW5hU2l6ZSk7Ci0gIE1pY3JvR3JhcGgqIG1pY3JvX2dyYXBoID0gbmV3IChtaWNyb19ncmFwaF9wbGFjZW1lbnRfYnVmZmVyKQotICAgICAgTWljcm9HcmFwaChudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKTsKKyAgc3RhdGljIE1pY3JvSW50ZXJwcmV0ZXJHcmFwaCBtaWNyb19ncmFwaChudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKTsKIAotICB0ZmxpdGU6Ok1pY3JvQ29udGV4dCBtaWNyb19jb250ZXh0KG1pY3JvX2FsbG9jYXRvciwgbW9kZWwsIG1pY3JvX2dyYXBoKTsKKyAgdGZsaXRlOjpNaWNyb0ludGVycHJldGVyQ29udGV4dCBtaWNyb19jb250ZXh0KG1pY3JvX2FsbG9jYXRvciwgbW9kZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWljcm9fZ3JhcGgpOwogICByZXR1cm4gbWljcm9fY29udGV4dDsKIH0KIApAQCAtNTgsOSArNTYsMTAgQEAKIAogLy8gRW5zdXJlcyB0aGF0IGEgcmVndWxhciBzZXQgYW5kIGdldCBwYWlyIHdvcmtzIG9rLgogVEZfTElURV9NSUNST19URVNUKFRlc3RTZXRHZXRFeHRlcm5hbENvbnRleHRTdWNjZXNzKSB7Ci0gIHRmbGl0ZTo6TWljcm9Db250ZXh0IG1pY3JvX2NvbnRleHQgPSB0ZmxpdGU6OkNyZWF0ZU1pY3JvQ29udGV4dCgpOworICB0ZmxpdGU6Ok1pY3JvSW50ZXJwcmV0ZXJDb250ZXh0IG1pY3JvX2NvbnRleHQgPQorICAgICAgdGZsaXRlOjpDcmVhdGVNaWNyb0ludGVycHJldGVyQ29udGV4dCgpOwogICBtaWNyb19jb250ZXh0LlNldEludGVycHJldGVyU3RhdGUoCi0gICAgICB0ZmxpdGU6Ok1pY3JvQ29udGV4dDo6SW50ZXJwcmV0ZXJTdGF0ZTo6a0ludm9rZSk7CisgICAgICB0ZmxpdGU6Ok1pY3JvSW50ZXJwcmV0ZXJDb250ZXh0OjpJbnRlcnByZXRlclN0YXRlOjprSW52b2tlKTsKIAogICB0ZmxpdGU6OlRlc3RFeHRlcm5hbENvbnRleHRQYXlsb2FkRGF0YSBwYXlsb2FkOwogICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUShrVGZMaXRlT2ssCkBAIC03NSw3ICs3NCw4IEBACiB9CiAKIFRGX0xJVEVfTUlDUk9fVEVTVChUZXN0R2V0RXh0ZXJuYWxDb250ZXh0V2l0aG91dFNldFNob3VsZFJldHVybk51bGwpIHsKLSAgdGZsaXRlOjpNaWNyb0NvbnRleHQgbWljcm9fY29udGV4dCA9IHRmbGl0ZTo6Q3JlYXRlTWljcm9Db250ZXh0KCk7CisgIHRmbGl0ZTo6TWljcm9JbnRlcnByZXRlckNvbnRleHQgbWljcm9fY29udGV4dCA9CisgICAgICB0ZmxpdGU6OkNyZWF0ZU1pY3JvSW50ZXJwcmV0ZXJDb250ZXh0KCk7CiAKICAgdGZsaXRlOjpUZXN0RXh0ZXJuYWxDb250ZXh0UGF5bG9hZERhdGEqIHJldHVybmVkX2V4dGVybmFsX2NvbnRleHQgPQogICAgICAgcmVpbnRlcnByZXRfY2FzdDx0ZmxpdGU6OlRlc3RFeHRlcm5hbENvbnRleHRQYXlsb2FkRGF0YSo+KApAQCAtODYsOSArODYsMTAgQEAKIH0KIAogVEZfTElURV9NSUNST19URVNUKFRlc3RTZXRFeHRlcm5hbENvbnRleHRDYW5Pbmx5QmVDYWxsZWRPbmNlKSB7Ci0gIHRmbGl0ZTo6TWljcm9Db250ZXh0IG1pY3JvX2NvbnRleHQgPSB0ZmxpdGU6OkNyZWF0ZU1pY3JvQ29udGV4dCgpOworICB0ZmxpdGU6Ok1pY3JvSW50ZXJwcmV0ZXJDb250ZXh0IG1pY3JvX2NvbnRleHQgPQorICAgICAgdGZsaXRlOjpDcmVhdGVNaWNyb0ludGVycHJldGVyQ29udGV4dCgpOwogICBtaWNyb19jb250ZXh0LlNldEludGVycHJldGVyU3RhdGUoCi0gICAgICB0ZmxpdGU6Ok1pY3JvQ29udGV4dDo6SW50ZXJwcmV0ZXJTdGF0ZTo6a1ByZXBhcmUpOworICAgICAgdGZsaXRlOjpNaWNyb0ludGVycHJldGVyQ29udGV4dDo6SW50ZXJwcmV0ZXJTdGF0ZTo6a1ByZXBhcmUpOwogICB0ZmxpdGU6OlRlc3RFeHRlcm5hbENvbnRleHRQYXlsb2FkRGF0YSBwYXlsb2FkOwogCiAgIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKGtUZkxpdGVPaywKQEAgLTEwMCwxNSArMTAxLDE3IEBACiB9CiAKIFRGX0xJVEVfTUlDUk9fVEVTVChUZXN0U2V0RXh0ZXJuYWxDb250ZXh0VG9OdWxsU2hvdWxkRmFpbCkgewotICB0ZmxpdGU6Ok1pY3JvQ29udGV4dCBtaWNyb19jb250ZXh0ID0gdGZsaXRlOjpDcmVhdGVNaWNyb0NvbnRleHQoKTsKKyAgdGZsaXRlOjpNaWNyb0ludGVycHJldGVyQ29udGV4dCBtaWNyb19jb250ZXh0ID0KKyAgICAgIHRmbGl0ZTo6Q3JlYXRlTWljcm9JbnRlcnByZXRlckNvbnRleHQoKTsKICAgbWljcm9fY29udGV4dC5TZXRJbnRlcnByZXRlclN0YXRlKAotICAgICAgdGZsaXRlOjpNaWNyb0NvbnRleHQ6OkludGVycHJldGVyU3RhdGU6OmtQcmVwYXJlKTsKKyAgICAgIHRmbGl0ZTo6TWljcm9JbnRlcnByZXRlckNvbnRleHQ6OkludGVycHJldGVyU3RhdGU6OmtQcmVwYXJlKTsKICAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEoa1RmTGl0ZUVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICBtaWNyb19jb250ZXh0LnNldF9leHRlcm5hbF9jb250ZXh0KG51bGxwdHIpKTsKIH0KIAogVEZfTElURV9NSUNST19URVNUKFRlc3RHZXRUZW1wSW5wdXRUZW5zb3IpIHsKLSAgdGZsaXRlOjpNaWNyb0NvbnRleHQgbWljcm9fY29udGV4dCA9IHRmbGl0ZTo6Q3JlYXRlTWljcm9Db250ZXh0KCk7CisgIHRmbGl0ZTo6TWljcm9JbnRlcnByZXRlckNvbnRleHQgbWljcm9fY29udGV4dCA9CisgICAgICB0ZmxpdGU6OkNyZWF0ZU1pY3JvSW50ZXJwcmV0ZXJDb250ZXh0KCk7CiAKICAgVGZMaXRlTm9kZSBub2RlOwogICBpbnQgaW5wdXRfZGF0YVtdID0gezIsIDAsIDF9OwpAQCAtMTI3LDcgKzEzMCw4IEBACiB9CiAKIFRGX0xJVEVfTUlDUk9fVEVTVChUZXN0R2V0VGVtcE91dHB1dFRlbnNvcikgewotICB0ZmxpdGU6Ok1pY3JvQ29udGV4dCBtaWNyb19jb250ZXh0ID0gdGZsaXRlOjpDcmVhdGVNaWNyb0NvbnRleHQoKTsKKyAgdGZsaXRlOjpNaWNyb0ludGVycHJldGVyQ29udGV4dCBtaWNyb19jb250ZXh0ID0KKyAgICAgIHRmbGl0ZTo6Q3JlYXRlTWljcm9JbnRlcnByZXRlckNvbnRleHQoKTsKIAogICBUZkxpdGVOb2RlIG5vZGU7CiAgIGludCBvdXRwdXRfZGF0YVtdID0gezEsIDB9OwpAQCAtMTQzLDE2ICsxNDcsMTggQEAKIH0KIAogVEZfTElURV9NSUNST19URVNUKFRlc3RBbGxvY2F0ZVRlbXBCdWZmZXIpIHsKLSAgdGZsaXRlOjpNaWNyb0NvbnRleHQgbWljcm9fY29udGV4dCA9IHRmbGl0ZTo6Q3JlYXRlTWljcm9Db250ZXh0KCk7CisgIHRmbGl0ZTo6TWljcm9JbnRlcnByZXRlckNvbnRleHQgbWljcm9fY29udGV4dCA9CisgICAgICB0ZmxpdGU6OkNyZWF0ZU1pY3JvSW50ZXJwcmV0ZXJDb250ZXh0KCk7CiAgIG1pY3JvX2NvbnRleHQuU2V0SW50ZXJwcmV0ZXJTdGF0ZSgKLSAgICAgIHRmbGl0ZTo6TWljcm9Db250ZXh0OjpJbnRlcnByZXRlclN0YXRlOjprUHJlcGFyZSk7CisgICAgICB0ZmxpdGU6Ok1pY3JvSW50ZXJwcmV0ZXJDb250ZXh0OjpJbnRlcnByZXRlclN0YXRlOjprUHJlcGFyZSk7CiAgIHVpbnQ4X3QqIGJ1ZmZlcjEgPQogICAgICAgbWljcm9fY29udGV4dC5BbGxvY2F0ZVRlbXBCdWZmZXIoMTAsIHRmbGl0ZTo6TWljcm9BcmVuYUJ1ZmZlckFsaWdubWVudCgpKTsKICAgVEZfTElURV9NSUNST19FWFBFQ1QoYnVmZmVyMSAhPSBudWxscHRyKTsKIH0KIAogVEZfTElURV9NSUNST19URVNUKFRlc3RHZXRUZW1wSW50ZXJtZWRpYXRlVGVuc29yKSB7Ci0gIHRmbGl0ZTo6TWljcm9Db250ZXh0IG1pY3JvX2NvbnRleHQgPSB0ZmxpdGU6OkNyZWF0ZU1pY3JvQ29udGV4dCgpOworICB0ZmxpdGU6Ok1pY3JvSW50ZXJwcmV0ZXJDb250ZXh0IG1pY3JvX2NvbnRleHQgPQorICAgICAgdGZsaXRlOjpDcmVhdGVNaWNyb0ludGVycHJldGVyQ29udGV4dCgpOwogCiAgIFRmTGl0ZU5vZGUgbm9kZTsKICAgaW50IGludGVybWVkaWF0ZV9kYXRhW10gPSB7MSwgMH07CmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fZ3JhcGguY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9faW50ZXJwcmV0ZXJfZ3JhcGguY2MKc2ltaWxhcml0eSBpbmRleCA2MCUKcmVuYW1lIGZyb20gdGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2dyYXBoLmNjCnJlbmFtZSB0byB0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9faW50ZXJwcmV0ZXJfZ3JhcGguY2MKaW5kZXggMzVjNmMxZi4uN2YwOTZhZSAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2dyYXBoLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19pbnRlcnByZXRlcl9ncmFwaC5jYwpAQCAtMTMsNyArMTMsNyBAQAogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2dyYXBoLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2ludGVycHJldGVyX2dyYXBoLmgiCiAKICNpbmNsdWRlICJmbGF0YnVmZmVycy9mbGF0YnVmZmVycy5oIiAgLy8gZnJvbSBAZmxhdGJ1ZmZlcnMKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvYy9jb21tb24uaCIKQEAgLTM3LDM0ICszNywzOSBAQAogCiB9ICAvLyBuYW1lc3BhY2UKIAotTWljcm9HcmFwaDo6TWljcm9HcmFwaChUZkxpdGVDb250ZXh0KiBjb250ZXh0LCBjb25zdCBNb2RlbCogbW9kZWwsCi0gICAgICAgICAgICAgICAgICAgICAgIE1pY3JvQWxsb2NhdG9yKiBhbGxvY2F0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgIE1pY3JvUmVzb3VyY2VWYXJpYWJsZXMqIHJlc291cmNlX3ZhcmlhYmxlcykKK01pY3JvSW50ZXJwcmV0ZXJHcmFwaDo6TWljcm9JbnRlcnByZXRlckdyYXBoKAorICAgIFRmTGl0ZUNvbnRleHQqIGNvbnRleHQsIGNvbnN0IE1vZGVsKiBtb2RlbCwgTWljcm9BbGxvY2F0b3IqIGFsbG9jYXRvciwKKyAgICBNaWNyb1Jlc291cmNlVmFyaWFibGVzKiByZXNvdXJjZV92YXJpYWJsZXMpCiAgICAgOiBjb250ZXh0Xyhjb250ZXh0KSwKICAgICAgIG1vZGVsXyhtb2RlbCksCiAgICAgICBhbGxvY2F0b3JfKGFsbG9jYXRvciksCiAgICAgICBjdXJyZW50X3N1YmdyYXBoX2luZGV4XygwKSwKKyAgICAgIGN1cnJlbnRfb3BlcmF0b3JfaW5kZXhfKDApLAogICAgICAgcmVzb3VyY2VfdmFyaWFibGVzXyhyZXNvdXJjZV92YXJpYWJsZXMpIHsKICAgaWYgKG1vZGVsICE9IG51bGxwdHIpIHsKICAgICBzdWJncmFwaHNfID0gbW9kZWwtPnN1YmdyYXBocygpOwogICB9CiB9CiAKLU1pY3JvR3JhcGg6On5NaWNyb0dyYXBoKCkge30KK01pY3JvSW50ZXJwcmV0ZXJHcmFwaDo6fk1pY3JvSW50ZXJwcmV0ZXJHcmFwaCgpIHt9CiAKLVRmTGl0ZVN0YXR1cyBNaWNyb0dyYXBoOjpJbml0U3ViZ3JhcGhzKCkgeworVGZMaXRlU3RhdHVzIE1pY3JvSW50ZXJwcmV0ZXJHcmFwaDo6SW5pdFN1YmdyYXBocygpIHsKICAgaW50IHByZXZpb3VzX3N1YmdyYXBoX2lkeCA9IGN1cnJlbnRfc3ViZ3JhcGhfaW5kZXhfOworICB1aW50MzJfdCBwcmV2aW91c19vcGVyYXRvcl9pZHggPSBjdXJyZW50X29wZXJhdG9yX2luZGV4XzsKIAogICBmb3IgKHNpemVfdCBzdWJncmFwaF9pZHggPSAwOyBzdWJncmFwaF9pZHggPCBzdWJncmFwaHNfLT5zaXplKCk7CiAgICAgICAgc3ViZ3JhcGhfaWR4KyspIHsKICAgICBjdXJyZW50X3N1YmdyYXBoX2luZGV4XyA9IHN1YmdyYXBoX2lkeDsKICAgICB1aW50MzJfdCBvcGVyYXRvcnNfc2l6ZSA9IE51bVN1YmdyYXBoT3BlcmF0b3JzKG1vZGVsXywgc3ViZ3JhcGhfaWR4KTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG9wZXJhdG9yc19zaXplOyArK2kpIHsKLSAgICAgIFRmTGl0ZU5vZGUqIG5vZGUgPQotICAgICAgICAgICYoc3ViZ3JhcGhfYWxsb2NhdGlvbnNfW3N1YmdyYXBoX2lkeF0ubm9kZV9hbmRfcmVnaXN0cmF0aW9uc1tpXS5ub2RlKTsKLSAgICAgIGNvbnN0IFRGTE1SZWdpc3RyYXRpb24qIHJlZ2lzdHJhdGlvbiA9IHN1YmdyYXBoX2FsbG9jYXRpb25zX1tzdWJncmFwaF9pZHhdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5vZGVfYW5kX3JlZ2lzdHJhdGlvbnNbaV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVnaXN0cmF0aW9uOworICAgIGZvciAoY3VycmVudF9vcGVyYXRvcl9pbmRleF8gPSAwOyBjdXJyZW50X29wZXJhdG9yX2luZGV4XyA8IG9wZXJhdG9yc19zaXplOworICAgICAgICAgKytjdXJyZW50X29wZXJhdG9yX2luZGV4XykgeworICAgICAgVGZMaXRlTm9kZSogbm9kZSA9ICYoc3ViZ3JhcGhfYWxsb2NhdGlvbnNfW3N1YmdyYXBoX2lkeF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubm9kZV9hbmRfcmVnaXN0cmF0aW9uc1tjdXJyZW50X29wZXJhdG9yX2luZGV4X10KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubm9kZSk7CisgICAgICBjb25zdCBURkxNUmVnaXN0cmF0aW9uKiByZWdpc3RyYXRpb24gPQorICAgICAgICAgIHN1YmdyYXBoX2FsbG9jYXRpb25zX1tzdWJncmFwaF9pZHhdCisgICAgICAgICAgICAgIC5ub2RlX2FuZF9yZWdpc3RyYXRpb25zW2N1cnJlbnRfb3BlcmF0b3JfaW5kZXhfXQorICAgICAgICAgICAgICAucmVnaXN0cmF0aW9uOwogICAgICAgc2l6ZV90IGluaXRfZGF0YV9zaXplOwogICAgICAgY29uc3QgY2hhciogaW5pdF9kYXRhOwogICAgICAgaWYgKHJlZ2lzdHJhdGlvbi0+YnVpbHRpbl9jb2RlID09IEJ1aWx0aW5PcGVyYXRvcl9DVVNUT00pIHsKQEAgLTgxLDUyICs4Niw2MiBAQAogICAgIH0KICAgfQogICBjdXJyZW50X3N1YmdyYXBoX2luZGV4XyA9IHByZXZpb3VzX3N1YmdyYXBoX2lkeDsKKyAgY3VycmVudF9vcGVyYXRvcl9pbmRleF8gPSBwcmV2aW91c19vcGVyYXRvcl9pZHg7CiAKICAgcmV0dXJuIGtUZkxpdGVPazsKIH0KIAotVGZMaXRlU3RhdHVzIE1pY3JvR3JhcGg6OlByZXBhcmVTdWJncmFwaHMoKSB7CitUZkxpdGVTdGF0dXMgTWljcm9JbnRlcnByZXRlckdyYXBoOjpQcmVwYXJlU3ViZ3JhcGhzKCkgewogICBpbnQgcHJldmlvdXNfc3ViZ3JhcGhfaWR4ID0gY3VycmVudF9zdWJncmFwaF9pbmRleF87Ci0KKyAgdWludDMyX3QgcHJldmlvdXNfb3BlcmF0b3JfaWR4ID0gY3VycmVudF9vcGVyYXRvcl9pbmRleF87CiAgIGZvciAoc2l6ZV90IHN1YmdyYXBoX2lkeCA9IDA7IHN1YmdyYXBoX2lkeCA8IHN1YmdyYXBoc18tPnNpemUoKTsKICAgICAgICBzdWJncmFwaF9pZHgrKykgewogICAgIGN1cnJlbnRfc3ViZ3JhcGhfaW5kZXhfID0gc3ViZ3JhcGhfaWR4OwogICAgIHVpbnQzMl90IG9wZXJhdG9yc19zaXplID0gTnVtU3ViZ3JhcGhPcGVyYXRvcnMobW9kZWxfLCBzdWJncmFwaF9pZHgpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3BlcmF0b3JzX3NpemU7ICsraSkgewotICAgICAgVGZMaXRlTm9kZSogbm9kZSA9Ci0gICAgICAgICAgJihzdWJncmFwaF9hbGxvY2F0aW9uc19bc3ViZ3JhcGhfaWR4XS5ub2RlX2FuZF9yZWdpc3RyYXRpb25zW2ldLm5vZGUpOwotICAgICAgY29uc3QgVEZMTVJlZ2lzdHJhdGlvbiogcmVnaXN0cmF0aW9uID0gc3ViZ3JhcGhfYWxsb2NhdGlvbnNfW3N1YmdyYXBoX2lkeF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubm9kZV9hbmRfcmVnaXN0cmF0aW9uc1tpXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RyYXRpb247CisgICAgZm9yIChjdXJyZW50X29wZXJhdG9yX2luZGV4XyA9IDA7IGN1cnJlbnRfb3BlcmF0b3JfaW5kZXhfIDwgb3BlcmF0b3JzX3NpemU7CisgICAgICAgICArK2N1cnJlbnRfb3BlcmF0b3JfaW5kZXhfKSB7CisgICAgICBUZkxpdGVOb2RlKiBub2RlID0gJihzdWJncmFwaF9hbGxvY2F0aW9uc19bc3ViZ3JhcGhfaWR4XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ub2RlX2FuZF9yZWdpc3RyYXRpb25zW2N1cnJlbnRfb3BlcmF0b3JfaW5kZXhfXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ub2RlKTsKKyAgICAgIGNvbnN0IFRGTE1SZWdpc3RyYXRpb24qIHJlZ2lzdHJhdGlvbiA9CisgICAgICAgICAgc3ViZ3JhcGhfYWxsb2NhdGlvbnNfW3N1YmdyYXBoX2lkeF0KKyAgICAgICAgICAgICAgLm5vZGVfYW5kX3JlZ2lzdHJhdGlvbnNbY3VycmVudF9vcGVyYXRvcl9pbmRleF9dCisgICAgICAgICAgICAgIC5yZWdpc3RyYXRpb247CiAgICAgICBpZiAocmVnaXN0cmF0aW9uLT5wcmVwYXJlICE9IG51bGxwdHIpIHsKICAgICAgICAgVGZMaXRlU3RhdHVzIHByZXBhcmVfc3RhdHVzID0gcmVnaXN0cmF0aW9uLT5wcmVwYXJlKGNvbnRleHRfLCBub2RlKTsKICAgICAgICAgaWYgKHByZXBhcmVfc3RhdHVzICE9IGtUZkxpdGVPaykgewogICAgICAgICAgIE1pY3JvUHJpbnRmKCJOb2RlICVzIChudW1iZXIgJWRmKSBmYWlsZWQgdG8gcHJlcGFyZSB3aXRoIHN0YXR1cyAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgT3BOYW1lRnJvbVJlZ2lzdHJhdGlvbihyZWdpc3RyYXRpb24pLCBpLCBwcmVwYXJlX3N0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgICAgT3BOYW1lRnJvbVJlZ2lzdHJhdGlvbihyZWdpc3RyYXRpb24pLAorICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRfb3BlcmF0b3JfaW5kZXhfLCBwcmVwYXJlX3N0YXR1cyk7CiAgICAgICAgICAgcmV0dXJuIGtUZkxpdGVFcnJvcjsKICAgICAgICAgfQogICAgICAgfQotICAgICAgYWxsb2NhdG9yXy0+RmluaXNoUHJlcGFyZU5vZGVBbGxvY2F0aW9ucygvKm5vZGVfaWQ9Ki9pKTsKKyAgICAgIGFsbG9jYXRvcl8tPkZpbmlzaFByZXBhcmVOb2RlQWxsb2NhdGlvbnMoCisgICAgICAgICAgLypub2RlX2lkPSovY3VycmVudF9vcGVyYXRvcl9pbmRleF8pOwogICAgIH0KICAgfQogICBjdXJyZW50X3N1YmdyYXBoX2luZGV4XyA9IHByZXZpb3VzX3N1YmdyYXBoX2lkeDsKLQorICBjdXJyZW50X29wZXJhdG9yX2luZGV4XyA9IHByZXZpb3VzX29wZXJhdG9yX2lkeDsKICAgcmV0dXJuIGtUZkxpdGVPazsKIH0KIAotVGZMaXRlU3RhdHVzIE1pY3JvR3JhcGg6OlJlc2V0U3ViZ3JhcGhzKCkgeworVGZMaXRlU3RhdHVzIE1pY3JvSW50ZXJwcmV0ZXJHcmFwaDo6UmVzZXRTdWJncmFwaHMoKSB7CiAgIGludCBwcmV2aW91c19zdWJncmFwaF9pZHggPSBjdXJyZW50X3N1YmdyYXBoX2luZGV4XzsKKyAgdWludDMyX3QgcHJldmlvdXNfb3BlcmF0b3JfaWR4ID0gY3VycmVudF9vcGVyYXRvcl9pbmRleF87CiAKICAgZm9yIChzaXplX3Qgc3ViZ3JhcGhfaWR4ID0gMDsgc3ViZ3JhcGhfaWR4IDwgc3ViZ3JhcGhzXy0+c2l6ZSgpOwogICAgICAgIHN1YmdyYXBoX2lkeCsrKSB7CiAgICAgY3VycmVudF9zdWJncmFwaF9pbmRleF8gPSBzdWJncmFwaF9pZHg7CiAgICAgdWludDMyX3Qgb3BlcmF0b3JzX3NpemUgPSBOdW1TdWJncmFwaE9wZXJhdG9ycyhtb2RlbF8sIHN1YmdyYXBoX2lkeCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvcGVyYXRvcnNfc2l6ZTsgKytpKSB7Ci0gICAgICBUZkxpdGVOb2RlKiBub2RlID0KLSAgICAgICAgICAmKHN1YmdyYXBoX2FsbG9jYXRpb25zX1tzdWJncmFwaF9pZHhdLm5vZGVfYW5kX3JlZ2lzdHJhdGlvbnNbaV0ubm9kZSk7Ci0gICAgICBjb25zdCBURkxNUmVnaXN0cmF0aW9uKiByZWdpc3RyYXRpb24gPSBzdWJncmFwaF9hbGxvY2F0aW9uc19bc3ViZ3JhcGhfaWR4XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ub2RlX2FuZF9yZWdpc3RyYXRpb25zW2ldCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdHJhdGlvbjsKKyAgICBmb3IgKGN1cnJlbnRfb3BlcmF0b3JfaW5kZXhfID0gMDsgY3VycmVudF9vcGVyYXRvcl9pbmRleF8gPCBvcGVyYXRvcnNfc2l6ZTsKKyAgICAgICAgICsrY3VycmVudF9vcGVyYXRvcl9pbmRleF8pIHsKKyAgICAgIFRmTGl0ZU5vZGUqIG5vZGUgPSAmKHN1YmdyYXBoX2FsbG9jYXRpb25zX1tzdWJncmFwaF9pZHhdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5vZGVfYW5kX3JlZ2lzdHJhdGlvbnNbY3VycmVudF9vcGVyYXRvcl9pbmRleF9dCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5vZGUpOworICAgICAgY29uc3QgVEZMTVJlZ2lzdHJhdGlvbiogcmVnaXN0cmF0aW9uID0KKyAgICAgICAgICBzdWJncmFwaF9hbGxvY2F0aW9uc19bc3ViZ3JhcGhfaWR4XQorICAgICAgICAgICAgICAubm9kZV9hbmRfcmVnaXN0cmF0aW9uc1tjdXJyZW50X29wZXJhdG9yX2luZGV4X10KKyAgICAgICAgICAgICAgLnJlZ2lzdHJhdGlvbjsKICAgICAgIC8vIHJlZ2lzdHJhdGlvbiBpcyBhbGxvY2F0ZWQgb3V0c2lkZSB0aGUgaW50ZXJwcmV0ZXIsIHNvIGRvdWJsZSBjaGVjayB0bwogICAgICAgLy8gbWFrZSBzdXJlIGl0J3Mgbm90IG51bGxwdHI7CiAgICAgICBpZiAocmVnaXN0cmF0aW9uICE9IG51bGxwdHIgJiYgcmVnaXN0cmF0aW9uLT5yZXNldCAhPSBudWxscHRyKSB7CkBAIC0xMzUsMjMgKzE1MCwyOCBAQAogICAgIH0KICAgfQogICBjdXJyZW50X3N1YmdyYXBoX2luZGV4XyA9IHByZXZpb3VzX3N1YmdyYXBoX2lkeDsKKyAgY3VycmVudF9vcGVyYXRvcl9pbmRleF8gPSBwcmV2aW91c19vcGVyYXRvcl9pZHg7CiAKICAgcmV0dXJuIGtUZkxpdGVPazsKIH0KIAotVGZMaXRlU3RhdHVzIE1pY3JvR3JhcGg6OkZyZWVTdWJncmFwaHMoKSB7CitUZkxpdGVTdGF0dXMgTWljcm9JbnRlcnByZXRlckdyYXBoOjpGcmVlU3ViZ3JhcGhzKCkgewogICBpbnQgcHJldmlvdXNfc3ViZ3JhcGhfaWR4ID0gY3VycmVudF9zdWJncmFwaF9pbmRleF87CisgIHVpbnQzMl90IHByZXZpb3VzX29wZXJhdG9yX2lkeCA9IGN1cnJlbnRfb3BlcmF0b3JfaW5kZXhfOwogCiAgIGZvciAoc2l6ZV90IHN1YmdyYXBoX2lkeCA9IDA7IHN1YmdyYXBoX2lkeCA8IHN1YmdyYXBoc18tPnNpemUoKTsKICAgICAgICBzdWJncmFwaF9pZHgrKykgewogICAgIGN1cnJlbnRfc3ViZ3JhcGhfaW5kZXhfID0gc3ViZ3JhcGhfaWR4OwogICAgIHVpbnQzMl90IG9wZXJhdG9yc19zaXplID0gTnVtU3ViZ3JhcGhPcGVyYXRvcnMobW9kZWxfLCBzdWJncmFwaF9pZHgpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3BlcmF0b3JzX3NpemU7ICsraSkgewotICAgICAgVGZMaXRlTm9kZSogbm9kZSA9Ci0gICAgICAgICAgJihzdWJncmFwaF9hbGxvY2F0aW9uc19bc3ViZ3JhcGhfaWR4XS5ub2RlX2FuZF9yZWdpc3RyYXRpb25zW2ldLm5vZGUpOwotICAgICAgY29uc3QgVEZMTVJlZ2lzdHJhdGlvbiogcmVnaXN0cmF0aW9uID0gc3ViZ3JhcGhfYWxsb2NhdGlvbnNfW3N1YmdyYXBoX2lkeF0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubm9kZV9hbmRfcmVnaXN0cmF0aW9uc1tpXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RyYXRpb247CisgICAgZm9yIChjdXJyZW50X29wZXJhdG9yX2luZGV4XyA9IDA7IGN1cnJlbnRfb3BlcmF0b3JfaW5kZXhfIDwgb3BlcmF0b3JzX3NpemU7CisgICAgICAgICArK2N1cnJlbnRfb3BlcmF0b3JfaW5kZXhfKSB7CisgICAgICBUZkxpdGVOb2RlKiBub2RlID0gJihzdWJncmFwaF9hbGxvY2F0aW9uc19bc3ViZ3JhcGhfaWR4XQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ub2RlX2FuZF9yZWdpc3RyYXRpb25zW2N1cnJlbnRfb3BlcmF0b3JfaW5kZXhfXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ub2RlKTsKKyAgICAgIGNvbnN0IFRGTE1SZWdpc3RyYXRpb24qIHJlZ2lzdHJhdGlvbiA9CisgICAgICAgICAgc3ViZ3JhcGhfYWxsb2NhdGlvbnNfW3N1YmdyYXBoX2lkeF0KKyAgICAgICAgICAgICAgLm5vZGVfYW5kX3JlZ2lzdHJhdGlvbnNbY3VycmVudF9vcGVyYXRvcl9pbmRleF9dCisgICAgICAgICAgICAgIC5yZWdpc3RyYXRpb247CiAgICAgICAvLyByZWdpc3RyYXRpb24gaXMgYWxsb2NhdGVkIG91dHNpZGUgdGhlIGludGVycHJldGVyLCBzbyBkb3VibGUgY2hlY2sgdG8KICAgICAgIC8vIG1ha2Ugc3VyZSBpdCdzIG5vdCBudWxscHRyOwogICAgICAgaWYgKHJlZ2lzdHJhdGlvbiAhPSBudWxscHRyICYmIHJlZ2lzdHJhdGlvbi0+ZnJlZSAhPSBudWxscHRyKSB7CkBAIC0xNjAsMTIgKzE4MCwxNCBAQAogICAgIH0KICAgfQogICBjdXJyZW50X3N1YmdyYXBoX2luZGV4XyA9IHByZXZpb3VzX3N1YmdyYXBoX2lkeDsKKyAgY3VycmVudF9vcGVyYXRvcl9pbmRleF8gPSBwcmV2aW91c19vcGVyYXRvcl9pZHg7CiAKICAgcmV0dXJuIGtUZkxpdGVPazsKIH0KIAotVGZMaXRlU3RhdHVzIE1pY3JvR3JhcGg6Okludm9rZVN1YmdyYXBoKGludCBzdWJncmFwaF9pZHgpIHsKK1RmTGl0ZVN0YXR1cyBNaWNyb0ludGVycHJldGVyR3JhcGg6Okludm9rZVN1YmdyYXBoKGludCBzdWJncmFwaF9pZHgpIHsKICAgaW50IHByZXZpb3VzX3N1YmdyYXBoX2lkeCA9IGN1cnJlbnRfc3ViZ3JhcGhfaW5kZXhfOworICB1aW50MzJfdCBwcmV2aW91c19vcGVyYXRvcl9pZHggPSBjdXJyZW50X29wZXJhdG9yX2luZGV4XzsKICAgY3VycmVudF9zdWJncmFwaF9pbmRleF8gPSBzdWJncmFwaF9pZHg7CiAKICAgaWYgKHN0YXRpY19jYXN0PHNpemVfdD4oc3ViZ3JhcGhfaWR4KSA+PSBzdWJncmFwaHNfLT5zaXplKCkpIHsKQEAgLTE3NCwxMiArMTk2LDE1IEBACiAgICAgcmV0dXJuIGtUZkxpdGVFcnJvcjsKICAgfQogICB1aW50MzJfdCBvcGVyYXRvcnNfc2l6ZSA9IE51bVN1YmdyYXBoT3BlcmF0b3JzKG1vZGVsXywgc3ViZ3JhcGhfaWR4KTsKLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvcGVyYXRvcnNfc2l6ZTsgKytpKSB7Ci0gICAgVGZMaXRlTm9kZSogbm9kZSA9Ci0gICAgICAgICYoc3ViZ3JhcGhfYWxsb2NhdGlvbnNfW3N1YmdyYXBoX2lkeF0ubm9kZV9hbmRfcmVnaXN0cmF0aW9uc1tpXS5ub2RlKTsKLSAgICBjb25zdCBURkxNUmVnaXN0cmF0aW9uKiByZWdpc3RyYXRpb24gPSBzdWJncmFwaF9hbGxvY2F0aW9uc19bc3ViZ3JhcGhfaWR4XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubm9kZV9hbmRfcmVnaXN0cmF0aW9uc1tpXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVnaXN0cmF0aW9uOworICBmb3IgKGN1cnJlbnRfb3BlcmF0b3JfaW5kZXhfID0gMDsgY3VycmVudF9vcGVyYXRvcl9pbmRleF8gPCBvcGVyYXRvcnNfc2l6ZTsKKyAgICAgICArK2N1cnJlbnRfb3BlcmF0b3JfaW5kZXhfKSB7CisgICAgVGZMaXRlTm9kZSogbm9kZSA9ICYoc3ViZ3JhcGhfYWxsb2NhdGlvbnNfW3N1YmdyYXBoX2lkeF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5vZGVfYW5kX3JlZ2lzdHJhdGlvbnNbY3VycmVudF9vcGVyYXRvcl9pbmRleF9dCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ub2RlKTsKKyAgICBjb25zdCBURkxNUmVnaXN0cmF0aW9uKiByZWdpc3RyYXRpb24gPQorICAgICAgICBzdWJncmFwaF9hbGxvY2F0aW9uc19bc3ViZ3JhcGhfaWR4XQorICAgICAgICAgICAgLm5vZGVfYW5kX3JlZ2lzdHJhdGlvbnNbY3VycmVudF9vcGVyYXRvcl9pbmRleF9dCisgICAgICAgICAgICAucmVnaXN0cmF0aW9uOwogCiAvLyBUaGlzIGlmZGVmIGlzIG5lZWRlZCAoZXZlbiB0aG91Z2ggU2NvcGVkTWljcm9Qcm9maWxlciBpdHNlbGYgaXMgYSBuby1vcCB3aXRoCiAvLyAtRFRGX0xJVEVfU1RSSVBfRVJST1JfU1RSSU5HUykgYmVjYXVzZSB0aGUgZnVuY3Rpb24gT3BOYW1lRnJvbVJlZ2lzdHJhdGlvbiBpcwpAQCAtMjAxLDE3ICsyMjYsMTkgQEAKIAogICAgIGlmIChpbnZva2Vfc3RhdHVzID09IGtUZkxpdGVFcnJvcikgewogICAgICAgTWljcm9QcmludGYoIk5vZGUgJXMgKG51bWJlciAlZCkgZmFpbGVkIHRvIGludm9rZSB3aXRoIHN0YXR1cyAlZCIsCi0gICAgICAgICAgICAgICAgICBPcE5hbWVGcm9tUmVnaXN0cmF0aW9uKHJlZ2lzdHJhdGlvbiksIGksIGludm9rZV9zdGF0dXMpOworICAgICAgICAgICAgICAgICAgT3BOYW1lRnJvbVJlZ2lzdHJhdGlvbihyZWdpc3RyYXRpb24pLCBjdXJyZW50X29wZXJhdG9yX2luZGV4XywKKyAgICAgICAgICAgICAgICAgIGludm9rZV9zdGF0dXMpOwogICAgICAgcmV0dXJuIGtUZkxpdGVFcnJvcjsKICAgICB9IGVsc2UgaWYgKGludm9rZV9zdGF0dXMgIT0ga1RmTGl0ZU9rKSB7CiAgICAgICByZXR1cm4gaW52b2tlX3N0YXR1czsKICAgICB9CiAgIH0KICAgY3VycmVudF9zdWJncmFwaF9pbmRleF8gPSBwcmV2aW91c19zdWJncmFwaF9pZHg7CisgIGN1cnJlbnRfb3BlcmF0b3JfaW5kZXhfID0gcHJldmlvdXNfb3BlcmF0b3JfaWR4OwogICByZXR1cm4ga1RmTGl0ZU9rOwogfQogCi1UZkxpdGVTdGF0dXMgTWljcm9HcmFwaDo6UmVzZXRWYXJpYWJsZVRlbnNvcnMoKSB7CitUZkxpdGVTdGF0dXMgTWljcm9JbnRlcnByZXRlckdyYXBoOjpSZXNldFZhcmlhYmxlVGVuc29ycygpIHsKICAgZm9yIChzaXplX3Qgc3ViZ3JhcGhfaWR4ID0gMDsgc3ViZ3JhcGhfaWR4IDwgc3ViZ3JhcGhzXy0+c2l6ZSgpOwogICAgICAgIHN1YmdyYXBoX2lkeCsrKSB7CiAgICAgY29uc3QgU3ViR3JhcGgqIHN1YmdyYXBoID0gKCpzdWJncmFwaHNfKVtzdWJncmFwaF9pZHhdOwpAQCAtMjM4LDMwICsyNjUsMzQgQEAKICAgcmV0dXJuIGtUZkxpdGVPazsKIH0KIAotaW50IE1pY3JvR3JhcGg6Ok51bVN1YmdyYXBocygpIHsgcmV0dXJuIG1vZGVsXy0+c3ViZ3JhcGhzKCktPnNpemUoKTsgfQoraW50IE1pY3JvSW50ZXJwcmV0ZXJHcmFwaDo6TnVtU3ViZ3JhcGhzKCkgeworICByZXR1cm4gbW9kZWxfLT5zdWJncmFwaHMoKS0+c2l6ZSgpOworfQogCi12b2lkIE1pY3JvR3JhcGg6OlNldFN1YmdyYXBoQWxsb2NhdGlvbnMoCit2b2lkIE1pY3JvSW50ZXJwcmV0ZXJHcmFwaDo6U2V0U3ViZ3JhcGhBbGxvY2F0aW9ucygKICAgICBTdWJncmFwaEFsbG9jYXRpb25zKiBzdWJncmFwaF9hbGxvY2F0aW9ucykgewogICBzdWJncmFwaF9hbGxvY2F0aW9uc18gPSBzdWJncmFwaF9hbGxvY2F0aW9uczsKIH0KIAotc2l6ZV90IE1pY3JvR3JhcGg6Ok51bVN1YmdyYXBoSW5wdXRzKGludCBzdWJncmFwaF9pZHgpIHsKK3NpemVfdCBNaWNyb0ludGVycHJldGVyR3JhcGg6Ok51bVN1YmdyYXBoSW5wdXRzKGludCBzdWJncmFwaF9pZHgpIHsKICAgcmV0dXJuIG1vZGVsXy0+c3ViZ3JhcGhzKCktPkdldChzdWJncmFwaF9pZHgpLT5pbnB1dHMoKS0+c2l6ZSgpOwogfQogCi1UZkxpdGVFdmFsVGVuc29yKiBNaWNyb0dyYXBoOjpHZXRTdWJncmFwaElucHV0KGludCBzdWJncmFwaF9pZHgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnB1dF9pZHgpIHsKK1RmTGl0ZUV2YWxUZW5zb3IqIE1pY3JvSW50ZXJwcmV0ZXJHcmFwaDo6R2V0U3ViZ3JhcGhJbnB1dChpbnQgc3ViZ3JhcGhfaWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbnB1dF9pZHgpIHsKICAgaW50IHRlbnNvcl9pZHggPQogICAgICAgbW9kZWxfLT5zdWJncmFwaHMoKS0+R2V0KHN1YmdyYXBoX2lkeCktPmlucHV0cygpLT5HZXQoaW5wdXRfaWR4KTsKICAgcmV0dXJuICZzdWJncmFwaF9hbGxvY2F0aW9uc19bc3ViZ3JhcGhfaWR4XS50ZW5zb3JzW3RlbnNvcl9pZHhdOwogfQogCi1zaXplX3QgTWljcm9HcmFwaDo6TnVtU3ViZ3JhcGhPdXRwdXRzKGludCBzdWJncmFwaF9pZHgpIHsKLSAgcmV0dXJuIG1vZGVsXy0+c3ViZ3JhcGhzKCktPkdldChzdWJncmFwaF9pZHgpLT5vdXRwdXRzKCktPnNpemUoKTsKK3NpemVfdCBNaWNyb0ludGVycHJldGVyR3JhcGg6Ok51bVN1YmdyYXBoT3V0cHV0cyhpbnQgc3ViZ3JhcGhfaWR4KSB7CisgIHJldHVybiBtb2RlbF8tPnN1YmdyYXBocygpLT5HZXQoc3ViZ3JhcGhfaWR4KS0+b3V0cHV0cygpID09IG51bGxwdHIKKyAgICAgICAgICAgICA/IDAKKyAgICAgICAgICAgICA6IG1vZGVsXy0+c3ViZ3JhcGhzKCktPkdldChzdWJncmFwaF9pZHgpLT5vdXRwdXRzKCktPnNpemUoKTsKIH0KIAotVGZMaXRlRXZhbFRlbnNvciogTWljcm9HcmFwaDo6R2V0U3ViZ3JhcGhPdXRwdXQoaW50IHN1YmdyYXBoX2lkeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRwdXRfaWR4KSB7CitUZkxpdGVFdmFsVGVuc29yKiBNaWNyb0ludGVycHJldGVyR3JhcGg6OkdldFN1YmdyYXBoT3V0cHV0KGludCBzdWJncmFwaF9pZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRwdXRfaWR4KSB7CiAgIGludCB0ZW5zb3JfaWR4ID0KICAgICAgIG1vZGVsXy0+c3ViZ3JhcGhzKCktPkdldChzdWJncmFwaF9pZHgpLT5vdXRwdXRzKCktPkdldChvdXRwdXRfaWR4KTsKICAgcmV0dXJuICZzdWJncmFwaF9hbGxvY2F0aW9uc19bc3ViZ3JhcGhfaWR4XS50ZW5zb3JzW3RlbnNvcl9pZHhdOwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2ludGVycHJldGVyX2dyYXBoLmggYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9faW50ZXJwcmV0ZXJfZ3JhcGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmMzYjRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2ludGVycHJldGVyX2dyYXBoLmgKQEAgLTAsMCArMSwxMTggQEAKKy8qIENvcHlyaWdodCAyMDIxIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaWZuZGVmIFRFTlNPUkZMT1dfTElURV9NSUNST19NSUNST19JTlRFUlBSRVRFUl9HUkFQSF9IXworI2RlZmluZSBURU5TT1JGTE9XX0xJVEVfTUlDUk9fTUlDUk9fSU5URVJQUkVURVJfR1JBUEhfSF8KKworI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19hbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fY29tbW9uLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2dyYXBoLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX3Jlc291cmNlX3ZhcmlhYmxlLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL3NjaGVtYS9zY2hlbWFfZ2VuZXJhdGVkLmgiCisKK25hbWVzcGFjZSB0ZmxpdGUgeworCisvLyBBYnN0cmFjdHMgdGhlIGRldGFpbHMgb2YgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgdGZsaXRlOjpNb2RlbC4KKy8vCisvLyBQcm92aWRlcyBtZXRob2RzIHRvIGFjY2VzcywgaW5pdGlhbGl6ZSwgcHJlcGFyZSwgaW52b2tlIGFuZCBmcmVlIGFueQorLy8gc3ViZ3JhcGggaW4gdGhlIHRmbGl0ZTo6R3JhcGguCitjbGFzcyBNaWNyb0ludGVycHJldGVyR3JhcGggOiBwdWJsaWMgTWljcm9HcmFwaCB7CisgcHVibGljOgorICAvLyBUaGUgbGlmZXRpbWUgb2YgdGhlIGNvbnRleHQsIG1vZGVsLCBhbGxvY2F0b3IgYW5kIHJlc291cmNlX3ZhcmlhYmxlcyBtdXN0CisgIC8vIGJlIGF0IGxlYXN0IGFzIGxvbmcgYXMgdGhhdCBvZiB0aGUgZ3JhcGggb2JqZWN0LCBzaW5jZSB0aGUgdGhpcyBjbGFzcyBtYXkKKyAgLy8gbmVlZCB0byBhY2Nlc3MgdGhlbSBhdCBhbnkgdGltZS4gSWYgcmVzb3VyY2VfdmFyaWFibGVzIGlzIGEgbnVsbHB0ciwKKyAgLy8gR2V0UmVzb3VyY2VWYXJpYWJsZXMgd2lsbCByZXR1cm4gYSBudWxscHRyLgorICBNaWNyb0ludGVycHJldGVyR3JhcGgoVGZMaXRlQ29udGV4dCogY29udGV4dCwgY29uc3QgTW9kZWwqIG1vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgTWljcm9BbGxvY2F0b3IqIGFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1pY3JvUmVzb3VyY2VWYXJpYWJsZXMqIHJlc291cmNlX3ZhcmlhYmxlcyk7CisgIHZpcnR1YWwgfk1pY3JvSW50ZXJwcmV0ZXJHcmFwaCgpOworCisgIC8vIFNldHMgdXAgYnVpbHRpbiBkYXRhIGFuZCBjYWxscyBURkxNUmVnaXN0cmF0aW9uLT5Jbml0IGZvciBldmVyeQorICAvLyBvcGVyYXRvciBpbiBldmVyeSBzdWJncmFwaCBpbiB0aGUgbW9kZWwuCisgIHZpcnR1YWwgVGZMaXRlU3RhdHVzIEluaXRTdWJncmFwaHMoKTsKKworICAvLyBDYWxscyBURkxNUmVnaXN0cmF0aW9uLT5QcmVwYXJlIGZvciBldmVyeSBvcGVyYXRvciBpbiBldmVyeSBzdWJncmFwaAorICAvLyBpbiB0aGUgbW9kZWwuCisgIHZpcnR1YWwgVGZMaXRlU3RhdHVzIFByZXBhcmVTdWJncmFwaHMoKTsKKworICAvLyBDYWxscyBURkxNUmVnaXN0cmF0aW9uLT5SZXNldCBmb3IgZXZlcnkgb3BlcmF0b3IgaW4gZXZlcnkgc3ViZ3JhcGggaW4KKyAgLy8gdGhlIG1vZGVsLgorICB2aXJ0dWFsIFRmTGl0ZVN0YXR1cyBSZXNldFN1YmdyYXBocygpOworCisgIC8vIENhbGxzIFRGTE1SZWdpc3RyYXRpb24tPkZyZWUgZm9yIGV2ZXJ5IG9wZXJhdG9yIGluIGV2ZXJ5IHN1YmdyYXBoIGluCisgIC8vIHRoZSBtb2RlbC4KKyAgdmlydHVhbCBUZkxpdGVTdGF0dXMgRnJlZVN1YmdyYXBocygpOworCisgIC8vIENhbGxzIFRGTE1SZWdpc3RyYXRpb24tPkludm9rZSBmb3IgZXZlcnkgb3BlcmF0b3IgaW4gYSBzaW5nbGUgc3ViZ3JhcGgKKyAgLy8gaW4gdGhlIG1vZGVsLgorICB2aXJ0dWFsIFRmTGl0ZVN0YXR1cyBJbnZva2VTdWJncmFwaChpbnQgc3ViZ3JhcGhfaWR4KTsKKworICAvLyBaZXJvcyBvdXQgYWxsIHZhcmlhYmxlIHRlbnNvcnMgaW4gYWxsIHN1YmdyYXBocyBpbiB0aGUgbW9kZWwuCisgIHZpcnR1YWwgVGZMaXRlU3RhdHVzIFJlc2V0VmFyaWFibGVUZW5zb3JzKCk7CisKKyAgLy8gTnVtYmVyIG9mIHRlbnNvciBpbnB1dHMgdG8gYSBzcGVjaWZpZWQgc3ViZ3JhcGggaW4gdGhlIG1vZGVsLgorICB2aXJ0dWFsIHNpemVfdCBOdW1TdWJncmFwaElucHV0cyhpbnQgc3ViZ3JhcGhfaWR4KTsKKworICAvLyBHZXQgdGhlIHNwZWNpZmllZCBpbnB1dCB0ZW5zb3Igb2YgYSBzcGVjaWZpZWQgc3ViZ3JhcGggaW4gdGhlIG1vZGVsLgorICB2aXJ0dWFsIFRmTGl0ZUV2YWxUZW5zb3IqIEdldFN1YmdyYXBoSW5wdXQoaW50IHN1YmdyYXBoX2lkeCwgaW50IGlucHV0X2lkeCk7CisKKyAgLy8gTnVtYmVyIG9mIHRlbnNvciBvdXRwdXRzIGZyb20gYSBzcGVjaWZpZWQgc3ViZ3JhcGggaW4gdGhlIG1vZGVsLgorICB2aXJ0dWFsIHNpemVfdCBOdW1TdWJncmFwaE91dHB1dHMoaW50IHN1YmdyYXBoX2lkeCk7CisKKyAgLy8gR2V0IHRoZSBzcGVjaWZpZWQgb3V0cHV0IHRlbnNvciBvZiBhIHNwZWNpZmllZCBzdWJncmFwaCBpbiB0aGUgbW9kZWwuCisgIHZpcnR1YWwgVGZMaXRlRXZhbFRlbnNvciogR2V0U3ViZ3JhcGhPdXRwdXQoaW50IHN1YmdyYXBoX2lkeCwgaW50IG91dHB1dF9pZHgpOworCisgIC8vIE51bWJlciBvZiBzdWJncmFwaHMgaW4gdGhlIG1vZGVsLgorICB2aXJ0dWFsIGludCBOdW1TdWJncmFwaHMoKTsKKworICAvLyBIb29rIHRvIHBhc3MgaW4gc3ViZ3JhcGggYWxsb2NhdGlvbnMgdHJhY2tlZCB3aXRoaW4gdGhlIGludGVycHJldGVyLAorICAvLyBhbGxvd2luZyBNaWNyb0ludGVycHJldGVyR3JhcGggdG8gaW5pdCAvIHByZXBhcmUgLyBpbnZva2Ugc3ViZ3JhcGhzIGluIHRoZQorICAvLyBtb2RlbC4KKyAgdm9pZCBTZXRTdWJncmFwaEFsbG9jYXRpb25zKFN1YmdyYXBoQWxsb2NhdGlvbnMqIHN1YmdyYXBoX2FsbG9jYXRpb25zKTsKKworICAvLyBHZXQgdGhlIGN1cnJlbnQgc3ViZ3JhcGggaW5kZXguIFdpdGhpbiBhbiBvbiBvcGVyYXRvciwgdGhpcyBpcyBndWFyYW50ZWVkCisgIC8vIHRvIGJlIHRoZSBzdWJncmFwaCBvZiB0aGF0IG9wZXJhdG9yLgorICBpbnQgR2V0Q3VycmVudFN1YmdyYXBoSW5kZXgoKSB7IHJldHVybiBjdXJyZW50X3N1YmdyYXBoX2luZGV4XzsgfQorCisgIC8vIEdldCB0aGUgY3VycmVudCBvcGVyYXRvciBpbmRleCBpbnNpZGUgYSBzdWJncmFwaC4KKyAgLy8gVGhlIGNvdXBsZSBHZXRDdXJyZW50U3ViZ3JhcGhJbmRleCBHZXRDdXJyZW50U3ViZ3JhcGhJbmRleCBjcmVhdGVzIGEgdW5pcXVlCisgIC8vIGlkZW50aWZpZXIgb2YgdGhlIG9wZXJhdG9yIGluc2lkZSB0aGUgc3ViZ3JhcGgKKyAgaW50IEdldEN1cnJlbnRPcGVyYXRvckluZGV4KCkgeyByZXR1cm4gY3VycmVudF9vcGVyYXRvcl9pbmRleF87IH0KKworICAvLyBHZXRzIHRoZSBsaXN0IG9mIGFsbG9jYXRpb25zIGZvciBlYWNoIHN1YmdyYXBoLiBUaGlzIGlzIHRoZSBzb3VyY2Ugb2YgdHJ1dGgKKyAgLy8gZm9yIGFsbCBwZXItc3ViZ3JhcGggYWxsb2NhdGlvbiBkYXRhLgorICBTdWJncmFwaEFsbG9jYXRpb25zKiBHZXRBbGxvY2F0aW9ucygpIHsgcmV0dXJuIHN1YmdyYXBoX2FsbG9jYXRpb25zXzsgfQorCisgIC8vIEdldCB0aGUgcmVzb3VyY2UgdmFyaWFibGVzIGZvciB0aGlzIFRGTE0gZ3JhcGguCisgIE1pY3JvUmVzb3VyY2VWYXJpYWJsZXMqIEdldFJlc291cmNlVmFyaWFibGVzKCkgeyByZXR1cm4gcmVzb3VyY2VfdmFyaWFibGVzXzsgfQorCisgcHJpdmF0ZToKKyAgVGZMaXRlQ29udGV4dCogY29udGV4dF87CisgIGNvbnN0IE1vZGVsKiBtb2RlbF87CisgIE1pY3JvQWxsb2NhdG9yKiBhbGxvY2F0b3JfOworICBTdWJncmFwaEFsbG9jYXRpb25zKiBzdWJncmFwaF9hbGxvY2F0aW9uc18gPSBudWxscHRyOworICBpbnQgY3VycmVudF9zdWJncmFwaF9pbmRleF87CisgIHVpbnQzMl90IGN1cnJlbnRfb3BlcmF0b3JfaW5kZXhfOworICBNaWNyb1Jlc291cmNlVmFyaWFibGVzKiByZXNvdXJjZV92YXJpYWJsZXNfOworICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8U3ViR3JhcGg+Piogc3ViZ3JhcGhzXyA9CisgICAgICBudWxscHRyOyAgLy8gSW5pdGlhbGl6ZWQgYXMgbnVsbHB0ciB0byBwcmV2ZW50IGFueSBwb3NzaWJsZSBpc3N1ZXMKKyAgICAgICAgICAgICAgICAvLyByZWxhdGVkIHRvIGFjY2Vzc2luZyB1bmluaXRpYWxpemVkIG1lbW9yeS4KKworICBURl9MSVRFX1JFTU9WRV9WSVJUVUFMX0RFTEVURQorfTsKKworfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQorCisjZW5kaWYgIC8vIFRFTlNPUkZMT1dfTElURV9NSUNST19NSUNST19JTlRFUlBSRVRFUl9HUkFQSF9IXwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2ludGVycHJldGVyX3Rlc3QuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9faW50ZXJwcmV0ZXJfdGVzdC5jYwppbmRleCAwYmEzMWM0Li5lNDRkZTZiIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9faW50ZXJwcmV0ZXJfdGVzdC5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9faW50ZXJwcmV0ZXJfdGVzdC5jYwpAQCAtNTQ4LDQgKzU0OCwyMyBAQAogICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUShpbnRlcnByZXRlcjIuSW52b2tlKCksIGtUZkxpdGVPayk7CiB9CiAKK1RGX0xJVEVfTUlDUk9fVEVTVChUZXN0R2V0VGVuc29yRmFpbHNOb0xpbmVhck1lbW9yeVBsYW5uZXIpIHsKKyAgY29uc3QgdGZsaXRlOjpNb2RlbCogbW9kZWwgPSB0ZmxpdGU6OnRlc3Rpbmc6OkdldE1vZGVsV2l0aDI1NngyNTZUZW5zb3IoKTsKKyAgVEZfTElURV9NSUNST19FWFBFQ1QobW9kZWwgIT0gbnVsbHB0cik7CisKKyAgdGZsaXRlOjp0ZXN0aW5nOjpUZXN0aW5nT3BSZXNvbHZlciBvcF9yZXNvbHZlcjsKKyAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEodGZsaXRlOjp0ZXN0aW5nOjpHZXRUZXN0aW5nT3BSZXNvbHZlcihvcF9yZXNvbHZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGtUZkxpdGVPayk7CisgIHRmbGl0ZTo6TWljcm9JbnRlcnByZXRlciBpbnRlcnByZXRlcihtb2RlbCwgb3BfcmVzb2x2ZXIsIHRmbGl0ZTo6YXJlbmFfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGZsaXRlOjpidWZmZXJfYXJlbmFfc2l6ZSk7CisgIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKGludGVycHJldGVyLkFsbG9jYXRlVGVuc29ycygpLCBrVGZMaXRlT2spOworCisgIFRGX0xJVEVfTUlDUk9fRVhQRUNUX0VRKGludGVycHJldGVyLkludm9rZSgpLCBrVGZMaXRlT2spOworCisgIC8vIEdldFRlbnNvciBTaG91bGQgcmV0dXJuIGEgbnVsbF9wdHIgd2hlbiBhIGxpbmVhciBtZW1vcnkgcGxhbm5lciBpc24ndCB1c2VkCisgIC8vIHRvIGluaXRpYWxpemUgaXQuIHByZXNlcnZlX2FsbF90ZW5zb3JzKCkgZ2V0dGVyIHNob3VsZCBhbHNvIHJldHVybiBmYWxzZQorICBURl9MSVRFX01JQ1JPX0VYUEVDVF9FUShpbnRlcnByZXRlci5wcmVzZXJ2ZV9hbGxfdGVuc29ycygpLCBmYWxzZSk7CisgIFRGX0xJVEVfTUlDUk9fRVhQRUNUKGludGVycHJldGVyLkdldFRlbnNvcigwKSA9PSBudWxscHRyKTsKK30KKwogVEZfTElURV9NSUNST19URVNUU19FTkQKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19sb2cuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fbG9nLmNjCmluZGV4IDQ1ZjcwNTEuLmEwOGEwN2QgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19sb2cuY2MKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2xvZy5jYwpAQCAtNDYsNCArNDYsMTcgQEAKICAgVk1pY3JvUHJpbnRmKGZvcm1hdCwgYXJncyk7CiAgIHZhX2VuZChhcmdzKTsKIH0KKworaW50IE1pY3JvU25wcmludGYoY2hhciogYnVmZmVyLCBzaXplX3QgYnVmX3NpemUsIGNvbnN0IGNoYXIqIGZvcm1hdCwgLi4uKSB7CisgIHZhX2xpc3QgYXJnczsKKyAgdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKyAgaW50IHJlc3VsdCA9IE1pY3JvVnNucHJpbnRmKGJ1ZmZlciwgYnVmX3NpemUsIGZvcm1hdCwgYXJncyk7CisgIHZhX2VuZChhcmdzKTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IE1pY3JvVnNucHJpbnRmKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGJ1Zl9zaXplLCBjb25zdCBjaGFyKiBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgdmFfbGlzdCB2bGlzdCkgeworICByZXR1cm4gRGVidWdWc25wcmludGYoYnVmZmVyLCBidWZfc2l6ZSwgZm9ybWF0LCB2bGlzdCk7Cit9CiAjZW5kaWYgIC8vICFkZWZpbmVkKFRGX0xJVEVfU1RSSVBfRVJST1JfU1RSSU5HUykKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19sb2cuaCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19sb2cuaAppbmRleCA2NjllOWU2Li5hZjNjMjRhIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fbG9nLmgKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2xvZy5oCkBAIC0xNywxNSArMTcsMjEgQEAKIAogI2lmICFkZWZpbmVkKFRGX0xJVEVfU1RSSVBfRVJST1JfU1RSSU5HUykKICNpbmNsdWRlIDxjc3RkYXJnPgorI2luY2x1ZGUgPGNzdGRkZWY+CiAvLyBUaGVzZSBmdW5jdGlvbnMgY2FuIGJlIHVzZWQgaW5kZXBlbmRlbnQgb2YgdGhlIE1pY3JvRXJyb3JSZXBvcnRlciB0byBnZXQKIC8vIHByaW50Zi1saWtlIGZ1bmN0aW9uYWxpdHlzIGFuZCBhcmUgY29tbW9uIHRvIGFsbCB0YXJnZXQgcGxhdGZvcm1zLgogdm9pZCBNaWNyb1ByaW50Zihjb25zdCBjaGFyKiBmb3JtYXQsIC4uLik7CiB2b2lkIFZNaWNyb1ByaW50Zihjb25zdCBjaGFyKiBmb3JtYXQsIHZhX2xpc3QgYXJncyk7CitpbnQgTWljcm9TbnByaW50ZihjaGFyKiBidWZmZXIsIHNpemVfdCBidWZfc2l6ZSwgY29uc3QgY2hhciogZm9ybWF0LCAuLi4pOworaW50IE1pY3JvVnNucHJpbnRmKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IGJ1Zl9zaXplLCBjb25zdCBjaGFyKiBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgdmFfbGlzdCB2bGlzdCk7CiAjZWxzZQogLy8gV2UgdXNlIGEgI2RlZmluZSB0byBlbnN1cmUgdGhhdCB0aGUgc3RyaW5ncyBhcmUgY29tcGxldGVseSBzdHJpcHBlZCwgdG8KIC8vIHByZXZlbnQgYW4gdW5uZWNlc3NhcnkgaW5jcmVhc2UgaW4gdGhlIGJpbmFyeSBzaXplLgogI2RlZmluZSBNaWNyb1ByaW50ZiguLi4pIHRmbGl0ZTo6VW51c2VkKF9fVkFfQVJHU19fKQogI2RlZmluZSBWTWljcm9QcmludGYoLi4uKSB0ZmxpdGU6OlVudXNlZChfX1ZBX0FSR1NfXykKKyNkZWZpbmUgTWljcm9TbnByaW50ZiguLi4pIHRmbGl0ZTo6VW51c2VkPGludD4oX19WQV9BUkdTX18pCisjZGVmaW5lIE1pY3JvVnNucHJpbnRmKC4uLikgdGZsaXRlOjpVbnVzZWQ8aW50PihfX1ZBX0FSR1NfXykKICNlbmRpZgogCiBuYW1lc3BhY2UgdGZsaXRlIHsKQEAgLTM3LDYgKzQzLDEyIEBACiAgICh2b2lkKShzaXplb2YuLi4oYXJncykpOwogfQogCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gQXJncz4KK1QgVW51c2VkKEFyZ3MmJi4uLiBhcmdzKSB7CisgICh2b2lkKShzaXplb2YuLi4oYXJncykpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8VD4oMCk7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSB0ZmxpdGUKIAogI2VuZGlmICAvLyBURU5TT1JGTE9XX0xJVEVfTUlDUk9fTUlDUk9fTE9HX0hfCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fbG9nX3Rlc3QuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fbG9nX3Rlc3QuY2MKaW5kZXggOTdhYzhiZS4uNzAyN2UwMSAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2xvZ190ZXN0LmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19sb2dfdGVzdC5jYwpAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAyMDIxIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTE1LDE4ICsxNSw0MiBAQAogCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2xvZy5oIgogCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL3N5c3RlbV9zZXR1cC5oIgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0cmluZz4KIAotbmFtZXNwYWNlIHRmbGl0ZSB7Ci1pbmxpbmUgdm9pZCBJbml0aWFsaXplVGVzdCgpIHsgSW5pdGlhbGl6ZVRhcmdldCgpOyB9Ci19ICAvLyBuYW1lc3BhY2UgdGZsaXRlCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL3Rlc3RpbmcvbWljcm9fdGVzdC5oIgogCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgdGZsaXRlOjpJbml0aWFsaXplVGVzdCgpOwotI2lmbmRlZiBURl9MSVRFX1NUUklQX0VSUk9SX1NUUklOR1MKLSAgTWljcm9QcmludGYoIk51bWJlcjogJWQiLCA0Mik7Ci0gIE1pY3JvUHJpbnRmKCJCYWRseS1mb3JtZWQgZm9ybWF0IHN0cmluZyAlIik7Ci0gIE1pY3JvUHJpbnRmKCJBbm90aGVyICUgYmFkbHktZm9ybWVkICUlIGZvcm1hdCBzdHJpbmciKTsKLSAgTWljcm9QcmludGYoIn5+fiVzfn5+IiwgIkFMTCBURVNUUyBQQVNTRUQiKTsKK25hbWVzcGFjZSB7CisKKyNpZiAhZGVmaW5lZChURl9MSVRFX1NUUklQX0VSUk9SX1NUUklOR1MpCitjb25zdGV4cHIgaW50IGtNYXhCdWZmZXJTaXplID0gMTI4OworY29uc3QgY2hhcioga0Zvcm1hdCA9ICIlMmQlNi4yZiUjNXglNXMiOworY29uc3QgY2hhcioga0V4cGVjdCA9ICI0MiA0Mi40MiAweDQyIFwiNDJcIiI7CiAjZW5kaWYgIC8vICFkZWZpbmVkKFRGX0xJVEVfU1RSSVBfRVJST1JfU1RSSU5HUykKKworfSAgLy8gbmFtZXNwYWNlCisKK1RGX0xJVEVfTUlDUk9fVEVTVFNfQkVHSU4KKworI2lmICFkZWZpbmVkKFRGX0xJVEVfU1RSSVBfRVJST1JfU1RSSU5HUykKKworVEZfTElURV9NSUNST19URVNUKE1pY3JvUHJpbnRmVGVzdCkgeworICBNaWNyb1ByaW50ZigiSW50ZWdlciA0MjogJWQiLCA0Mik7CisgIE1pY3JvUHJpbnRmKCJGbG9hdCA0Mi40MjogJTIuMmYiLCA0Mi40Mik7CisgIE1pY3JvUHJpbnRmKCJTdHJpbmcgXCJIZWxsbyBXb3JsZCFcIjogJXMiLCAiXCJIZWxsbyBXb3JsZCFcIiIpOworICBNaWNyb1ByaW50ZigiQmFkbHktZm9ybWVkIGZvcm1hdCBzdHJpbmcgJSIpOworICBNaWNyb1ByaW50ZigiQW5vdGhlciAlIyBiYWRseS1mb3JtZWQgJSUgZm9ybWF0IHN0cmluZyIpOwogfQorCitURl9MSVRFX01JQ1JPX1RFU1QoTWljcm9TbnByaW50ZikgeworICBjaGFyIGJ1ZmZlcltrTWF4QnVmZmVyU2l6ZV07CisgIGJ1ZmZlclswXSA9ICdcMCc7CisgIHNpemVfdCByZXN1bHQgPQorICAgICAgTWljcm9TbnByaW50ZihidWZmZXIsIGtNYXhCdWZmZXJTaXplLCBrRm9ybWF0LCA0MiwgNDIuNDIsIDB4NDIsICJcIjQyXCIiKTsKKyAgVEZfTElURV9NSUNST19FWFBFQ1RfRVEocmVzdWx0LCBzdHJsZW4oYnVmZmVyKSk7CisgIFRGX0xJVEVfTUlDUk9fRVhQRUNUX1NUUklOR19FUShrRXhwZWN0LCBidWZmZXIpOworfQorCisjZW5kaWYgIC8vICFkZWZpbmVkKFRGX0xJVEVfU1RSSVBfRVJST1JfU1RSSU5HUykKKworVEZfTElURV9NSUNST19URVNUU19FTkQKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19tdXRhYmxlX29wX3Jlc29sdmVyLmggYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fbXV0YWJsZV9vcF9yZXNvbHZlci5oCmluZGV4IGZlNGY1ZmIuLmY1ZjZlMzggMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19tdXRhYmxlX29wX3Jlc29sdmVyLmgKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX211dGFibGVfb3BfcmVzb2x2ZXIuaApAQCAtMjksOSArMjksMTEgQEAKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9ldGhvc3UuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9mdWxseV9jb25uZWN0ZWQuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9taWNyb19vcHMuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9tdWwuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9wb29saW5nLmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvcmVkdWNlLmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvc29mdG1heC5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3RyYW5zcG9zZV9jb252LmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2xvZy5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19vcF9yZXNvbHZlci5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9zY2hlbWEvc2NoZW1hX2dlbmVyYXRlZC5oIgpAQCAtMTQzLDYgKzE0NSwxMSBAQAogICAgIHJldHVybiBBZGRCdWlsdGluKEJ1aWx0aW5PcGVyYXRvcl9BVkVSQUdFX1BPT0xfMkQsIHJlZ2lzdHJhdGlvbiwgUGFyc2VQb29sKTsKICAgfQogCisgIFRmTGl0ZVN0YXR1cyBBZGRCYXRjaE1hdE11bCgpIHsKKyAgICByZXR1cm4gQWRkQnVpbHRpbihCdWlsdGluT3BlcmF0b3JfQkFUQ0hfTUFUTVVMLAorICAgICAgICAgICAgICAgICAgICAgIHRmbGl0ZTo6UmVnaXN0ZXJfQkFUQ0hfTUFUTVVMKCksIFBhcnNlQmF0Y2hNYXRNdWwpOworICB9CisKICAgVGZMaXRlU3RhdHVzIEFkZEJhdGNoVG9TcGFjZU5kKCkgewogICAgIHJldHVybiBBZGRCdWlsdGluKEJ1aWx0aW5PcGVyYXRvcl9CQVRDSF9UT19TUEFDRV9ORCwKICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3Rlcl9CQVRDSF9UT19TUEFDRV9ORCgpLCBQYXJzZUJhdGNoVG9TcGFjZU5kKTsKQEAgLTQ2Miw2ICs0NjksMTEgQEAKICAgICByZXR1cm4gQWRkQnVpbHRpbihCdWlsdGluT3BlcmF0b3JfUEFEVjIsIFJlZ2lzdGVyX1BBRFYyKCksIFBhcnNlUGFkVjIpOwogICB9CiAKKyAgVGZMaXRlU3RhdHVzIEFkZFBDQU4oKSB7CisgICAgLy8gVE9ETyhiLzI4NjI1MDQ3Myk6IGNoYW5nZSBiYWNrIG5hbWUgdG8gIlBDQU4iIGFuZCByZW1vdmUgbmFtZXNwYWNlCisgICAgcmV0dXJuIEFkZEN1c3RvbSgiU2lnbmFsUENBTiIsIHRmbGl0ZTo6dGZsbV9zaWduYWw6OlJlZ2lzdGVyX1BDQU4oKSk7CisgIH0KKwogICBUZkxpdGVTdGF0dXMgQWRkUHJlbHUoKSB7CiAgICAgcmV0dXJuIEFkZEJ1aWx0aW4oQnVpbHRpbk9wZXJhdG9yX1BSRUxVLCB0ZmxpdGU6OlJlZ2lzdGVyX1BSRUxVKCksCiAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VQcmVsdSk7CkBAIC02MDYsOSArNjE4LDEwIEBACiAgICAgcmV0dXJuIEFkZEJ1aWx0aW4oQnVpbHRpbk9wZXJhdG9yX1RBTkgsIFJlZ2lzdGVyX1RBTkgoKSwgUGFyc2VUYW5oKTsKICAgfQogCi0gIFRmTGl0ZVN0YXR1cyBBZGRUcmFuc3Bvc2VDb252KCkgewotICAgIHJldHVybiBBZGRCdWlsdGluKEJ1aWx0aW5PcGVyYXRvcl9UUkFOU1BPU0VfQ09OViwKLSAgICAgICAgICAgICAgICAgICAgICB0ZmxpdGU6OlJlZ2lzdGVyX1RSQU5TUE9TRV9DT05WKCksIFBhcnNlVHJhbnNwb3NlQ29udik7CisgIFRmTGl0ZVN0YXR1cyBBZGRUcmFuc3Bvc2VDb252KAorICAgICAgY29uc3QgVEZMTVJlZ2lzdHJhdGlvbiYgcmVnaXN0cmF0aW9uID0gUmVnaXN0ZXJfVFJBTlNQT1NFX0NPTlYoKSkgeworICAgIHJldHVybiBBZGRCdWlsdGluKEJ1aWx0aW5PcGVyYXRvcl9UUkFOU1BPU0VfQ09OViwgcmVnaXN0cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIFBhcnNlVHJhbnNwb3NlQ29udik7CiAgIH0KIAogICBUZkxpdGVTdGF0dXMgQWRkVHJhbnNwb3NlKCkgewpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX3Byb2ZpbGVyLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX3Byb2ZpbGVyLmNjCmluZGV4IGU3NzQzYWEuLmViZWFkNTEgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19wcm9maWxlci5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fcHJvZmlsZXIuY2MKQEAgLTk5LDcgKzk5LDcgQEAKICAgICB9CiAgICAgTWljcm9QcmludGYoIiVzLCAlZCIsIGVhY2hfdGFnX2VudHJ5LnRhZywgZWFjaF90YWdfZW50cnkudGlja3MpOwogICB9Ci0gIE1pY3JvUHJpbnRmKCJ0b3RhbCBudW1iZXIgb2YgdGlja3MsICVkIiwgdG90YWxfdGlja3MpOworICBNaWNyb1ByaW50ZigiXCJ0b3RhbCBudW1iZXIgb2YgdGlja3NcIiwgJWQiLCB0b3RhbF90aWNrcyk7CiAjZW5kaWYKIH0KIApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX3Byb2ZpbGVyLmggYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fcHJvZmlsZXIuaAppbmRleCAxYzM5ZWExLi5iNTJlYmNiIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fcHJvZmlsZXIuaAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fcHJvZmlsZXIuaApAQCAtNDAsNyArNDAsNyBAQAogICAvLyBvbmx5IG9uY2UgcGVyIGV2ZW50X2hhbmRsZS4KICAgLy8KICAgLy8gSWYgRW5kRXZlbnQgaXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIGZvciB0aGUgc2FtZSBldmVudF9oYW5kbGUsIHRoZSBsYXN0Ci0gIC8vIGNhbGwgd2lsbCBiZSB1c2VkIGFzIHRoZSBlbmQgb2YgZXZlbnQgbWFya2VyLklmIEVuZEV2ZW50IGlzIGNhbGxlZCAwIHRpbWVzCisgIC8vIGNhbGwgd2lsbCBiZSB1c2VkIGFzIHRoZSBlbmQgb2YgZXZlbnQgbWFya2VyLiBJZiBFbmRFdmVudCBpcyBjYWxsZWQgMCB0aW1lcwogICAvLyBmb3IgYSBwYXJ0aWN1bGFyIGV2ZW50X2hhbmRsZSwgdGhlIGR1cmF0aW9uIG9mIHRoYXQgZXZlbnQgd2lsbCBiZSAwIHRpY2tzLgogICB2aXJ0dWFsIHZvaWQgRW5kRXZlbnQodWludDMyX3QgZXZlbnRfaGFuZGxlKSBvdmVycmlkZTsKIApAQCAtNjYsOSArNjYsOSBAQAogICB2b2lkIExvZ1RpY2tzUGVyVGFnQ3N2KCk7CiAKICBwcml2YXRlOgotICAvLyBNYXhpbXVtIG51bWJlciBvZiBldmVudHMgdGhhdCB0aGlzIGNsYXNzIGNhbiBrZWVwIHRyYWNrIG9mLiBJZiB3ZSBjYWxsCi0gIC8vIEFkZEV2ZW50IG1vcmUgdGhhbiBrTWF4RXZlbnRzIG51bWJlciBvZiB0aW1lcywgdGhlbiB0aGUgb2xkZXN0IGV2ZW50J3MKLSAgLy8gcHJvZmlsaW5nIGluZm9ybWF0aW9uIHdpbGwgYmUgb3ZlcndyaXR0ZW4uCisgIC8vIE1heGltdW0gbnVtYmVyIG9mIGV2ZW50cyB0aGF0IHRoaXMgY2xhc3MgY2FuIGtlZXAgdHJhY2sgb2YuIFRoZQorICAvLyBNaWNyb1Byb2ZpbGVyIHdpbGwgYWJvcnQgaWYgQWRkRXZlbnQgaXMgY2FsbGVkIG1vcmUgdGhhbiBrTWF4RXZlbnRzIG51bWJlcgorICAvLyBvZiB0aW1lcy4gSW5jcmVhc2UgdGhpcyBudW1iZXIgaWYgeW91IG5lZWQgbW9yZSBldmVudHMuCiAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtNYXhFdmVudHMgPSA0MDk2OwogCiAgIGNvbnN0IGNoYXIqIHRhZ3NfW2tNYXhFdmVudHNdOwpAQCAtODcsNyArODcsNyBAQAogCiAgIGludCBGaW5kRXhpc3RpbmdPck5leHRQb3NpdGlvbihjb25zdCBjaGFyKiB0YWdfbmFtZSk7CiAKLSAgVEZfTElURV9SRU1PVkVfVklSVFVBTF9ERUxFVEU7CisgIFRGX0xJVEVfUkVNT1ZFX1ZJUlRVQUxfREVMRVRFCiB9OwogCiAjaWYgZGVmaW5lZChURl9MSVRFX1NUUklQX0VSUk9SX1NUUklOR1MpCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fdGltZS5oIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX3RpbWUuaAppbmRleCA3YThhYjQ1Li41ZThhZDExIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fdGltZS5oCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb190aW1lLmgKQEAgLTI3LDggKzI3LDExIEBACiB1aW50MzJfdCBHZXRDdXJyZW50VGltZVRpY2tzKCk7CiAKIGlubGluZSB1aW50MzJfdCBUaWNrc1RvTXMoaW50MzJfdCB0aWNrcykgeworICB1aW50MzJfdCBfdGlja3NfcGVyX3NlY29uZCA9IHRpY2tzX3Blcl9zZWNvbmQoKTsKKyAgX3RpY2tzX3Blcl9zZWNvbmQgPQorICAgICAgX3RpY2tzX3Blcl9zZWNvbmQgPiAwID8gX3RpY2tzX3Blcl9zZWNvbmQgOiAxOyAgLy8gemVybyBkaXZpZGUgcHJldmVudGlvbgogICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KDEwMDAuMGYgKiBzdGF0aWNfY2FzdDxmbG9hdD4odGlja3MpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4odGlja3NfcGVyX3NlY29uZCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KF90aWNrc19wZXJfc2Vjb25kKSk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSB0ZmxpdGUKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9tb2NrX21pY3JvX2dyYXBoLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL21vY2tfbWljcm9fZ3JhcGguY2MKaW5kZXggNDM4YTQwNi4uOWM2NTJmYiAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL21vY2tfbWljcm9fZ3JhcGguY2MKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL21vY2tfbWljcm9fZ3JhcGguY2MKQEAgLTIwLDExICsyMCw3IEBACiBuYW1lc3BhY2UgdGZsaXRlIHsKIAogTW9ja01pY3JvR3JhcGg6Ok1vY2tNaWNyb0dyYXBoKFNpbmdsZUFyZW5hQnVmZmVyQWxsb2NhdG9yKiBhbGxvY2F0b3IpCi0gICAgOiBNaWNyb0dyYXBoKG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIpLAotICAgICAgYWxsb2NhdG9yXyhhbGxvY2F0b3IpLAotICAgICAgaW5pdF9jb3VudF8oMCksCi0gICAgICBwcmVwYXJlX2NvdW50XygwKSwKLSAgICAgIGZyZWVfY291bnRfKDApIHsKKyAgICA6IGFsbG9jYXRvcl8oYWxsb2NhdG9yKSwgaW5pdF9jb3VudF8oMCksIHByZXBhcmVfY291bnRfKDApLCBmcmVlX2NvdW50XygwKSB7CiAgIG1lbXNldChpbnZva2VfY291bnRzXywgMCwgc2l6ZW9mKGludm9rZV9jb3VudHNfKSk7CiAgIG1vY2tfdGVuc29yXyA9CiAgICAgICByZWludGVycHJldF9jYXN0PFRmTGl0ZUV2YWxUZW5zb3IqPihhbGxvY2F0b3JfLT5BbGxvY2F0ZVBlcnNpc3RlbnRCdWZmZXIoCkBAIC00NSw4ICs0MSw2IEBACiAgIHJldHVybiBrVGZMaXRlT2s7CiB9CiAKLVRmTGl0ZVN0YXR1cyBNb2NrTWljcm9HcmFwaDo6UmVzZXRWYXJpYWJsZVRlbnNvcnMoKSB7IHJldHVybiBrVGZMaXRlT2s7IH0KLQogc2l6ZV90IE1vY2tNaWNyb0dyYXBoOjpOdW1TdWJncmFwaElucHV0cyhpbnQgc3ViZ3JhcGhfaWR4KSB7IHJldHVybiAxOyB9CiAKIFRmTGl0ZUV2YWxUZW5zb3IqIE1vY2tNaWNyb0dyYXBoOjpHZXRTdWJncmFwaElucHV0KGludCBzdWJncmFwaF9pZHgsCkBAIC02Myw0ICs1Nyw4IEBACiAKIGludCBNb2NrTWljcm9HcmFwaDo6TnVtU3ViZ3JhcGhzKCkgeyByZXR1cm4ga01heFN1YmdyYXBoczsgfQogCitNaWNyb1Jlc291cmNlVmFyaWFibGVzKiBNb2NrTWljcm9HcmFwaDo6R2V0UmVzb3VyY2VWYXJpYWJsZXMoKSB7CisgIHJldHVybiBudWxscHRyOworfQorCiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vbW9ja19taWNyb19ncmFwaC5oIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL21vY2tfbWljcm9fZ3JhcGguaAppbmRleCAzYWU3ZDdjLi43NDVlOGYwIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vbW9ja19taWNyb19ncmFwaC5oCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9tb2NrX21pY3JvX2dyYXBoLmgKQEAgLTMwLDEzICszMCwxMyBAQAogIHB1YmxpYzoKICAgZXhwbGljaXQgTW9ja01pY3JvR3JhcGgoU2luZ2xlQXJlbmFCdWZmZXJBbGxvY2F0b3IqIGFsbG9jYXRvcik7CiAgIFRmTGl0ZVN0YXR1cyBJbnZva2VTdWJncmFwaChpbnQgc3ViZ3JhcGhfaWR4KSBvdmVycmlkZTsKLSAgVGZMaXRlU3RhdHVzIFJlc2V0VmFyaWFibGVUZW5zb3JzKCkgb3ZlcnJpZGU7CiAgIHNpemVfdCBOdW1TdWJncmFwaElucHV0cyhpbnQgc3ViZ3JhcGhfaWR4KSBvdmVycmlkZTsKICAgVGZMaXRlRXZhbFRlbnNvciogR2V0U3ViZ3JhcGhJbnB1dChpbnQgc3ViZ3JhcGhfaWR4LCBpbnQgdGVuc29yX2lkeCkgb3ZlcnJpZGU7CiAgIHNpemVfdCBOdW1TdWJncmFwaE91dHB1dHMoaW50IHN1YmdyYXBoX2lkeCkgb3ZlcnJpZGU7CiAgIFRmTGl0ZUV2YWxUZW5zb3IqIEdldFN1YmdyYXBoT3V0cHV0KGludCBzdWJncmFwaF9pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0ZW5zb3JfaWR4KSBvdmVycmlkZTsKICAgaW50IE51bVN1YmdyYXBocygpIG92ZXJyaWRlOworICBNaWNyb1Jlc291cmNlVmFyaWFibGVzKiBHZXRSZXNvdXJjZVZhcmlhYmxlcygpIG92ZXJyaWRlOwogICBpbnQgZ2V0X2luaXRfY291bnQoKSBjb25zdCB7IHJldHVybiBpbml0X2NvdW50XzsgfQogICBpbnQgZ2V0X3ByZXBhcmVfY291bnQoKSBjb25zdCB7IHJldHVybiBwcmVwYXJlX2NvdW50XzsgfQogICBpbnQgZ2V0X2ZyZWVfY291bnQoKSBjb25zdCB7IHJldHVybiBmcmVlX2NvdW50XzsgfQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL21vZGVscy9wZXJzb25fZGV0ZWN0X3ZlbGEudGZsaXRlIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL21vZGVscy9wZXJzb25fZGV0ZWN0X3ZlbGEudGZsaXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1Y2Y0NzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vbW9kZWxzL3BlcnNvbl9kZXRlY3RfdmVsYS50ZmxpdGUKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3B5dGhvbi9pbnRlcnByZXRlci9zcmMvQlVJTEQgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vcHl0aG9uL2ludGVycHJldGVyL3NyYy9CVUlMRAppbmRleCA2MDFlM2RiLi5mOGJlMGVkIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vcHl0aG9uL2ludGVycHJldGVyL3NyYy9CVUlMRAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vcHl0aG9uL2ludGVycHJldGVyL3NyYy9CVUlMRApAQCAtMTcsMjQgKzE3LDYgQEAKICAgICBwYWNrYWdlcyA9IHRmbG1fcHl0aG9uX29wX3Jlc29sdmVyX2ZyaWVuZHMoKSwKICkKIAotIyB0ZmxtX3J1bnRpbWUgaXMgZGVwcmVjYXRlZCwgcGxlYXNlIHVzZSAvL3B5dGhvbi90ZmxpdGVfbWljcm86cnVudGltZSBpbnN0ZWFkLgotIyBUT0RPKGIvMjg2NDU2Mzc4KTogcmVtb3ZlIG9uY2UgYWxsIHVzYWdlIGlzIGNoYW5nZWQgdG8gdGhlIHJ1bnRpbWUgdGFyZ2V0LgotcHlfbGlicmFyeSgKLSAgICBuYW1lID0gInRmbG1fcnVudGltZSIsCi0gICAgc3JjcyA9IFsidGZsbV9ydW50aW1lLnB5Il0sCi0gICAgdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdLAotICAgIGRlcHMgPSBbIi8vcHl0aG9uL3RmbGl0ZV9taWNybzpydW50aW1lIl0sCi0pCi0KLSMgcnVudGltZSBpcyBkZXByZWNhdGVkLCBwbGVhc2UgdXNlIC8vcHl0aG9uL3RmbGl0ZV9taWNybzpydW50aW1lIGluc3RlYWQuCi0jIFRPRE8oYi8yODY0NTYzNzgpOiByZW1vdmUgb25jZSBhbGwgdXNhZ2UgaXMgY2hhbmdlZCB0byB0aGUgcnVudGltZSB0YXJnZXQuCi1weV9saWJyYXJ5KAotICAgIG5hbWUgPSAicnVudGltZSIsCi0gICAgc3JjcyA9IFsicnVudGltZS5weSJdLAotICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKLSAgICBkZXBzID0gWyIvL3B5dGhvbi90ZmxpdGVfbWljcm86cnVudGltZSJdLAotKQotCiAjIFRPRE8oYi8yODY0NTYzNzgpOiByZW1vdmUgb25jZSBhbGwgaW50ZXJuYWwgdXNhZ2UgaXMgZml4ZWQuCiBjY19saWJyYXJ5KAogICAgIG5hbWUgPSAicHl0aG9uX29wc19yZXNvbHZlciIsCkBAIC00MywxMCArMjUsNyBAQAogICAgICAgICAicHl0aG9uX29wc19yZXNvbHZlci5oIiwKICAgICBdLAogICAgIGNvcHRzID0gbWljcm9fY29wdHMoKSwKLSAgICB2aXNpYmlsaXR5ID0gWwotICAgICAgICAiOm9wX3Jlc29sdmVyX2ZyaWVuZHMiLAotICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm8vaW50ZWdyYXRpb25fdGVzdHM6X19zdWJwYWNrYWdlc19fIiwKLSAgICBdLAorICAgIHZpc2liaWxpdHkgPSBbIjpvcF9yZXNvbHZlcl9mcmllbmRzIl0sCiAgICAgZGVwcyA9IFsKICAgICAgICAgIi8vcHl0aG9uL3RmbGl0ZV9taWNybzpweXRob25fb3BzX3Jlc29sdmVyIiwKICAgICBdLApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3B5dGhvbi90ZmxpdGVfc2l6ZS9zcmMvQlVJTEQgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vcHl0aG9uL3RmbGl0ZV9zaXplL3NyYy9CVUlMRAppbmRleCA2NmQ5YjUwLi5iOGY1M2EyIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vcHl0aG9uL3RmbGl0ZV9zaXplL3NyYy9CVUlMRAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vcHl0aG9uL3RmbGl0ZV9zaXplL3NyYy9CVUlMRApAQCAtMSwzICsxLDQgQEAKK2xvYWQoIkBydWxlc19weXRob24vL3B5dGhvbjpkZWZzLmJ6bCIsICJweV9iaW5hcnkiLCAicHlfbGlicmFyeSIpCiBsb2FkKCJAcHliaW5kMTFfYmF6ZWwvLzpidWlsZF9kZWZzLmJ6bCIsICJweWJpbmRfZXh0ZW5zaW9uIiwgInB5YmluZF9saWJyYXJ5IikKIAogcGFja2FnZSgKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9weXRob24vdGZsaXRlX3NpemUvdGVzdHMvQlVJTEQgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vcHl0aG9uL3RmbGl0ZV9zaXplL3Rlc3RzL0JVSUxECmluZGV4IDFiNGM1YjIuLjA3NmE2YWIgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9weXRob24vdGZsaXRlX3NpemUvdGVzdHMvQlVJTEQKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3B5dGhvbi90ZmxpdGVfc2l6ZS90ZXN0cy9CVUlMRApAQCAtMSwzICsxLDQgQEAKK2xvYWQoIkBydWxlc19weXRob24vL3B5dGhvbjpkZWZzLmJ6bCIsICJweV90ZXN0IikKIGxvYWQoIkB0ZmxtX3BpcF9kZXBzLy86cmVxdWlyZW1lbnRzLmJ6bCIsICJyZXF1aXJlbWVudCIpCiAKIGxpY2Vuc2VzKFsibm90aWNlIl0pCkBAIC0yNSw3ICsyNiw3IEBACiAgICAgICAgICJub3Vic2FuIiwKICAgICBdLAogICAgIGRlcHMgPSBbCi0gICAgICAgIHJlcXVpcmVtZW50KCJ0ZW5zb3JmbG93LWNwdSIpLAorICAgICAgICByZXF1aXJlbWVudCgidGVuc29yZmxvdyIpLAogICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm8vcHl0aG9uL3RmbGl0ZV9zaXplL3NyYzpmbGF0YnVmZmVyX3NpemUiLAogICAgIF0sCiApCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vcmVjb3JkaW5nX21pY3JvX2FsbG9jYXRvci5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9yZWNvcmRpbmdfbWljcm9fYWxsb2NhdG9yLmNjCmluZGV4IGY0MWRiYTYuLmVlNzYxOTYgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9yZWNvcmRpbmdfbWljcm9fYWxsb2NhdG9yLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9yZWNvcmRpbmdfbWljcm9fYWxsb2NhdG9yLmNjCkBAIC03OCw5ICs3OCwxNCBAQAogICAgICAgcmV0dXJuIHJlY29yZGVkX25vZGVfYW5kX3JlZ2lzdHJhdGlvbl9hcnJheV9kYXRhXzsKICAgICBjYXNlIFJlY29yZGVkQWxsb2NhdGlvblR5cGU6OmtPcERhdGE6CiAgICAgICByZXR1cm4gcmVjb3JkZWRfb3BfZGF0YV87CisgICAgLy8gdGhlIGZ1bmN0aW9uIE1pY3JvUHJpbnRmIHdhcyBuZXZlciByZWFjaGVkIG91dHNpZGUgdGhlIHN3aXRjaCwgYmVjYXVzZQorICAgIC8vIGVhY2ggY2FzZSBoYXMgYSByZXR1cm4uIEFzIHRoZSBpbnRlbnRpb24gb2YgdGhlIE1pY3JvUHJpbnRmIGlzIHRvIGJlCisgICAgLy8gY2FsbGVkIHdoZW4gbm8gbWF0Y2hpbmcgY2FzZSBpcyBmb3VuZCwgYSBkZWZhdWx0IGNhc2Ugd2FzIGFkZGVkIHRvCisgICAgLy8gY29udGVtcGxhdGUgYW4gaW52YWxpZCBhbGxvY2F0aW9uIHR5cGUKKyAgICBkZWZhdWx0OgorICAgICAgTWljcm9QcmludGYoIkludmFsaWQgYWxsb2NhdGlvbiB0eXBlIHN1cHBsaWVkOiAlZCIsIGFsbG9jYXRpb25fdHlwZSk7CisgICAgICByZXR1cm4gUmVjb3JkZWRBbGxvY2F0aW9uKCk7CiAgIH0KLSAgTWljcm9QcmludGYoIkludmFsaWQgYWxsb2NhdGlvbiB0eXBlIHN1cHBsaWVkOiAlZCIsIGFsbG9jYXRpb25fdHlwZSk7Ci0gIHJldHVybiBSZWNvcmRlZEFsbG9jYXRpb24oKTsKIH0KIAogY29uc3QgUmVjb3JkaW5nU2luZ2xlQXJlbmFCdWZmZXJBbGxvY2F0b3IqCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vcmlzY3YzMl9nZW5lcmljL2RlYnVnX2xvZy5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9yaXNjdjMyX2dlbmVyaWMvZGVidWdfbG9nLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMzhmZmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vcmlzY3YzMl9nZW5lcmljL2RlYnVnX2xvZy5jYwpAQCAtMCwwICsxLDQwIEBACisvKiBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorCitMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKK3lvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KK1lvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9kZWJ1Z19sb2cuaCIKKworI2luY2x1ZGUgPGNzdGRpbz4KKworI2lmbmRlZiBURl9MSVRFX1NUUklQX0VSUk9SX1NUUklOR1MKKyNpbmNsdWRlICJleWFscm96X3ByaW50Zi9zcmMvcHJpbnRmL3ByaW50Zi5oIgorI2VuZGlmCisKK2V4dGVybiAiQyIgdm9pZCBEZWJ1Z0xvZyhjb25zdCBjaGFyKiBmb3JtYXQsIHZhX2xpc3QgYXJncykgeworI2lmbmRlZiBURl9MSVRFX1NUUklQX0VSUk9SX1NUUklOR1MKKyAgY29uc3RleHByIGludCBrTWF4TG9nTGVuID0gMjU2OworICBjaGFyIGxvZ19idWZmZXJba01heExvZ0xlbl07CisKKyAgdnNucHJpbnRmXyhsb2dfYnVmZmVyLCBrTWF4TG9nTGVuLCBmb3JtYXQsIGFyZ3MpOworICBzdGQ6OmZwdXRzKGxvZ19idWZmZXIsIHN0ZG91dCk7CisjZW5kaWYKK30KKworI2lmbmRlZiBURl9MSVRFX1NUUklQX0VSUk9SX1NUUklOR1MKKy8vIE9ubHkgY2FsbGVkIGZyb20gTWljcm9Wc25wcmludGYgKG1pY3JvX2xvZy5oKQorZXh0ZXJuICJDIiBpbnQgRGVidWdWc25wcmludGYoY2hhciogYnVmZmVyLCBzaXplX3QgYnVmX3NpemUsIGNvbnN0IGNoYXIqIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3Qgdmxpc3QpIHsKKyAgcmV0dXJuIHZzbnByaW50Zl8oYnVmZmVyLCBidWZfc2l6ZSwgZm9ybWF0LCB2bGlzdCk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9zcGFuLmggYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vc3Bhbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzOTlmMWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vc3Bhbi5oCkBAIC0wLDAgKzEsNjkgQEAKKy8qIENvcHlyaWdodCAyMDI0IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaWZuZGVmIFRFTlNPUkZMT1dfTElURV9NSUNST19TUEFOX0hfCisjZGVmaW5lIFRFTlNPUkZMT1dfTElURV9NSUNST19TUEFOX0hfCisKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxjc3RkZGVmPgorCituYW1lc3BhY2UgdGZsaXRlIHsKKworLy8gQSBwb29yIG1hbidzIHN0ZDo6c3Bhbiwgd2Ugc2hvdWxkIGNvbnNpZGVyIHVzaW5nIHRoZSBQaWd3ZWVkIHNwYW4gaW5zdGVhZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgU3BhbiB7CisgcHVibGljOgorICBjb25zdGV4cHIgU3BhbihUKiBkYXRhLCBzaXplX3Qgc2l6ZSkgbm9leGNlcHQgOiBkYXRhXyhkYXRhKSwgc2l6ZV8oc2l6ZSkge30KKworICB0ZW1wbGF0ZSA8c2l6ZV90IE4+CisgIGNvbnN0ZXhwciBTcGFuKFQgKCZkYXRhKVtOXSkgbm9leGNlcHQgOiBkYXRhXyhkYXRhKSwgc2l6ZV8oTikge30KKworICB0ZW1wbGF0ZSA8c2l6ZV90IE4+CisgIGNvbnN0ZXhwciBTcGFuKHN0ZDo6YXJyYXk8VCwgTj4mIGFycmF5KSBub2V4Y2VwdAorICAgICAgOiBkYXRhXyhhcnJheS5kYXRhKCkpLCBzaXplXyhOKSB7fQorCisgIGNvbnN0ZXhwciBUJiBvcGVyYXRvcltdKHNpemVfdCBpZHgpIGNvbnN0IG5vZXhjZXB0IHsgcmV0dXJuICooZGF0YV8gKyBpZHgpOyB9CisKKyAgY29uc3RleHByIFQqIGRhdGEoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiBkYXRhXzsgfQorICBjb25zdGV4cHIgc2l6ZV90IHNpemUoKSBjb25zdCBub2V4Y2VwdCB7IHJldHVybiBzaXplXzsgfQorCisgcHJpdmF0ZToKKyAgVCogZGF0YV87CisgIHNpemVfdCBzaXplXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCPgorYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNwYW48QT4mIGEsIGNvbnN0IFNwYW48Qj4mIGIpIHsKKyAgaWYgKGEuc2l6ZSgpICE9IGIuc2l6ZSgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhLnNpemUoKTsgKytpKSB7CisgICAgaWYgKGFbaV0gIT0gYltpXSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4KK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBTcGFuPEE+JiBhLCBjb25zdCBTcGFuPEI+JiBiKSB7CisgIHJldHVybiAhKGEgPT0gYik7Cit9CisKK30gIC8vIGVuZCBuYW1lc3BhY2UgdGZsaXRlCisKKyNlbmRpZiAgLy8gVEVOU09SRkxPV19MSVRFX01JQ1JPX1NQQU5fSF8KZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9zcGFuX3Rlc3QuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vc3Bhbl90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmOTA2YzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vc3Bhbl90ZXN0LmNjCkBAIC0wLDAgKzEsNTkgQEAKKy8vIENvcHlyaWdodCAyMDI0IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vc3Bhbi5oIgorCisjaW5jbHVkZSA8YXJyYXk+CisKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vdGVzdGluZy9taWNyb190ZXN0LmgiCisKK1RGX0xJVEVfTUlDUk9fVEVTVFNfQkVHSU4KKworVEZfTElURV9NSUNST19URVNUKFRlc3RBcnJheUluaXRpYWxpemF0aW9uKSB7CisgIGludCBhW117MSwgMiwgM307CisgIHRmbGl0ZTo6U3BhbjxpbnQ+IHN7YX07CisgIFRGX0xJVEVfTUlDUk9fRVhQRUNUKHMuZGF0YSgpID09IGEpOworICBURl9MSVRFX01JQ1JPX0VYUEVDVChzLnNpemUoKSA9PSBzaXplb2YoYSkgLyBzaXplb2YoaW50KSk7Cit9CisKK1RGX0xJVEVfTUlDUk9fVEVTVChUZXN0U3RkQXJyYXlJbml0aWFsaXphdGlvbikgeworICBzdGQ6OmFycmF5PGNoYXIsIDIwPiBhOworICB0ZmxpdGU6OlNwYW48Y2hhcj4gc3thfTsKKyAgVEZfTElURV9NSUNST19FWFBFQ1Qocy5kYXRhKCkgPT0gYS5kYXRhKCkpOworICBURl9MSVRFX01JQ1JPX0VYUEVDVChzLnNpemUoKSA9PSBhLnNpemUoKSk7Cit9CisKK1RGX0xJVEVfTUlDUk9fVEVTVChUZXN0RXF1YWxpdHkpIHsKKyAgY29uc3RleHByIGludCBhW117MSwgMiwgM307CisgIGNvbnN0ZXhwciBpbnQgYltdezEsIDIsIDN9OworICBjb25zdGV4cHIgaW50IGNbXXszLCAyLCAxfTsKKyAgdGZsaXRlOjpTcGFuPGNvbnN0IGludD4gc19he2F9OworICB0ZmxpdGU6OlNwYW48Y29uc3QgaW50PiBzX2J7Yn07CisgIHRmbGl0ZTo6U3Bhbjxjb25zdCBpbnQ+IHNfY3tjfTsKKyAgVEZfTElURV9NSUNST19FWFBFQ1RfVFJVRShzX2EgPT0gc19iKTsKKyAgVEZfTElURV9NSUNST19FWFBFQ1RfRkFMU0Uoc19hID09IHNfYyk7Cit9CisKK1RGX0xJVEVfTUlDUk9fVEVTVChUZXN0SW5lcXVhbGl0eSkgeworICBjb25zdGV4cHIgaW50IGFbXXsxLCAyLCAzfTsKKyAgY29uc3RleHByIGludCBiW117MSwgMiwgM307CisgIGNvbnN0ZXhwciBpbnQgY1tdezMsIDIsIDF9OworICB0ZmxpdGU6OlNwYW48Y29uc3QgaW50PiBzX2F7YX07CisgIHRmbGl0ZTo6U3Bhbjxjb25zdCBpbnQ+IHNfYntifTsKKyAgdGZsaXRlOjpTcGFuPGNvbnN0IGludD4gc19je2N9OworICBURl9MSVRFX01JQ1JPX0VYUEVDVF9GQUxTRShzX2EgIT0gc19iKTsKKyAgVEZfTElURV9NSUNST19FWFBFQ1RfVFJVRShzX2EgIT0gc19jKTsKK30KKworVEZfTElURV9NSUNST19URVNUU19FTkQKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby9zdGF0aWNfdmVjdG9yLmggYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vc3RhdGljX3ZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOWUwNjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vc3RhdGljX3ZlY3Rvci5oCkBAIC0wLDAgKzEsODMgQEAKKy8vIENvcHlyaWdodCAyMDI0IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgVEVOU09SRkxPV19MSVRFX01JQ1JPX1NUQVRJQ19WRUNUT1JfSF8KKyNkZWZpbmUgVEVOU09SRkxPV19MSVRFX01JQ1JPX1NUQVRJQ19WRUNUT1JfSF8KKworI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKworI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL29wX21hY3Jvcy5oIiAgLy8gZm9yIFRGX0xJVEVfQVNTRVJUCisKK25hbWVzcGFjZSB0ZmxpdGUgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc3RkOjpzaXplX3QgTWF4U2l6ZT4KK2NsYXNzIFN0YXRpY1ZlY3RvciB7CisgIC8vIEEgc3RhdGljbGx5LWFsbG9jYXRlZCB2ZWN0b3IuIEFkZCB0byB0aGUgaW50ZXJmYWNlIGFzIG5lZWRlZC4KKworIHByaXZhdGU6CisgIHN0ZDo6YXJyYXk8VCwgTWF4U2l6ZT4gYXJyYXlfOworICBzdGQ6OnNpemVfdCBzaXplX3swfTsKKworIHB1YmxpYzoKKyAgdXNpbmcgaXRlcmF0b3IgPSB0eXBlbmFtZSBkZWNsdHlwZShhcnJheV8pOjppdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSB0eXBlbmFtZSBkZWNsdHlwZShhcnJheV8pOjpjb25zdF9pdGVyYXRvcjsKKyAgdXNpbmcgcG9pbnRlciA9IHR5cGVuYW1lIGRlY2x0eXBlKGFycmF5Xyk6OnBvaW50ZXI7CisgIHVzaW5nIHJlZmVyZW5jZSA9IHR5cGVuYW1lIGRlY2x0eXBlKGFycmF5Xyk6OnJlZmVyZW5jZTsKKyAgdXNpbmcgY29uc3RfcmVmZXJlbmNlID0gdHlwZW5hbWUgZGVjbHR5cGUoYXJyYXlfKTo6Y29uc3RfcmVmZXJlbmNlOworCisgIFN0YXRpY1ZlY3RvcigpIHt9CisKKyAgU3RhdGljVmVjdG9yKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiB2YWx1ZXMpIHsKKyAgICBmb3IgKGNvbnN0IFQmIHYgOiB2YWx1ZXMpIHsKKyAgICAgIHB1c2hfYmFjayh2KTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgY29uc3RleHByIHN0ZDo6c2l6ZV90IG1heF9zaXplKCkgeyByZXR1cm4gTWF4U2l6ZTsgfQorICBzdGQ6OnNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV87IH0KKyAgYm9vbCBmdWxsKCkgY29uc3QgeyByZXR1cm4gc2l6ZSgpID09IG1heF9zaXplKCk7IH0KKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBhcnJheV8uYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGFycmF5Xy5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIGJlZ2luKCkgKyBzaXplKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gYmVnaW4oKSArIHNpemUoKTsgfQorICBwb2ludGVyIGRhdGEoKSB7IHJldHVybiBhcnJheV8uZGF0YSgpOyB9CisgIHJlZmVyZW5jZSBvcGVyYXRvcltdKGludCBpKSB7IHJldHVybiBhcnJheV9baV07IH0KKyAgY29uc3RfcmVmZXJlbmNlIG9wZXJhdG9yW10oaW50IGkpIGNvbnN0IHsgcmV0dXJuIGFycmF5X1tpXTsgfQorICB2b2lkIGNsZWFyKCkgeyBzaXplXyA9IDA7IH0KKworICB0ZW1wbGF0ZSA8c3RkOjpzaXplX3QgTj4KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFN0YXRpY1ZlY3RvcjxULCBOPiYgb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjplcXVhbChiZWdpbigpLCBlbmQoKSwgb3RoZXIuYmVnaW4oKSwgb3RoZXIuZW5kKCkpOworICB9CisKKyAgdGVtcGxhdGUgPHN0ZDo6c2l6ZV90IE4+CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTdGF0aWNWZWN0b3I8VCwgTj4mIG90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICB9CisKKyAgdm9pZCBwdXNoX2JhY2soY29uc3QgVCYgdCkgeworICAgIFRGX0xJVEVfQVNTRVJUKCFmdWxsKCkpOworICAgICplbmQoKSA9IHQ7CisgICAgKytzaXplXzsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFU+CitTdGF0aWNWZWN0b3IoVCwgVS4uLikgLT4gU3RhdGljVmVjdG9yPFQsIDEgKyBzaXplb2YuLi4oVSk+OworCit9ICAvLyBlbmQgbmFtZXNwYWNlIHRmbGl0ZQorCisjZW5kaWYgIC8vIFRFTlNPUkZMT1dfTElURV9NSUNST19TVEFUSUNfVkVDVE9SX0hfCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vc3RhdGljX3ZlY3Rvcl90ZXN0LmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3N0YXRpY192ZWN0b3JfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDYwMWJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3N0YXRpY192ZWN0b3JfdGVzdC5jYwpAQCAtMCwwICsxLDgyIEBACisvLyBDb3B5cmlnaHQgMjAyNCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL3N0YXRpY192ZWN0b3IuaCIKKworI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0aW5nL21pY3JvX3Rlc3QuaCIKKwordXNpbmcgdGZsaXRlOjpTdGF0aWNWZWN0b3I7CisKK1RGX0xJVEVfTUlDUk9fVEVTVFNfQkVHSU4KKworVEZfTElURV9NSUNST19URVNUKFN0YXRpY1ZlY3RvclB1c2hCYWNrKSB7CisgIFN0YXRpY1ZlY3RvcjxpbnQsIDQ+IGE7CisgIFRGX0xJVEVfTUlDUk9fRVhQRUNUKGEubWF4X3NpemUoKSA9PSA0KTsKKyAgVEZfTElURV9NSUNST19FWFBFQ1QoYS5zaXplKCkgPT0gMCk7CisKKyAgYS5wdXNoX2JhY2soMSk7CisgIFRGX0xJVEVfTUlDUk9fRVhQRUNUKGEuc2l6ZSgpID09IDEpOworICBURl9MSVRFX01JQ1JPX0VYUEVDVChhWzBdID09IDEpOworCisgIGEucHVzaF9iYWNrKDIpOworICBURl9MSVRFX01JQ1JPX0VYUEVDVChhLnNpemUoKSA9PSAyKTsKKyAgVEZfTElURV9NSUNST19FWFBFQ1QoYVsxXSA9PSAyKTsKKworICBhLnB1c2hfYmFjaygzKTsKKyAgVEZfTElURV9NSUNST19FWFBFQ1QoYS5zaXplKCkgPT0gMyk7CisgIFRGX0xJVEVfTUlDUk9fRVhQRUNUKGFbMl0gPT0gMyk7Cit9CisKK1RGX0xJVEVfTUlDUk9fVEVTVChTdGF0aWNWZWN0b3JJbml0aWFsaXphdGlvblBhcnRpYWwpIHsKKyAgY29uc3QgU3RhdGljVmVjdG9yPGludCwgND4gYXsxLCAyLCAzfTsKKyAgVEZfTElURV9NSUNST19FWFBFQ1QoYS5tYXhfc2l6ZSgpID09IDQpOworICBURl9MSVRFX01JQ1JPX0VYUEVDVChhLnNpemUoKSA9PSAzKTsKKyAgVEZfTElURV9NSUNST19FWFBFQ1QoYVswXSA9PSAxKTsKKyAgVEZfTElURV9NSUNST19FWFBFQ1QoYVsxXSA9PSAyKTsKKyAgVEZfTElURV9NSUNST19FWFBFQ1QoYVsyXSA9PSAzKTsKK30KKworVEZfTElURV9NSUNST19URVNUKFN0YXRpY1ZlY3RvckluaXRpYWxpemF0aW9uRnVsbCkgeworICBjb25zdCBTdGF0aWNWZWN0b3IgYnsxLCAyLCAzfTsKKyAgVEZfTElURV9NSUNST19FWFBFQ1QoYi5tYXhfc2l6ZSgpID09IDMpOworICBURl9MSVRFX01JQ1JPX0VYUEVDVChiLnNpemUoKSA9PSAzKTsKK30KKworVEZfTElURV9NSUNST19URVNUKFN0YXRpY1ZlY3RvckVxdWFsaXR5KSB7CisgIGNvbnN0IFN0YXRpY1ZlY3RvciBhezEsIDIsIDN9OworICBjb25zdCBTdGF0aWNWZWN0b3IgYnsxLCAyLCAzfTsKKyAgVEZfTElURV9NSUNST19FWFBFQ1QoYSA9PSBiKTsKKyAgVEZfTElURV9NSUNST19FWFBFQ1QoIShhICE9IGIpKTsKK30KKworVEZfTElURV9NSUNST19URVNUKFN0YXRpY1ZlY3RvckluZXF1YWxpdHkpIHsKKyAgY29uc3QgU3RhdGljVmVjdG9yIGF7MSwgMiwgM307CisgIGNvbnN0IFN0YXRpY1ZlY3RvciBiezMsIDIsIDF9OworICBURl9MSVRFX01JQ1JPX0VYUEVDVChhICE9IGIpOworICBURl9MSVRFX01JQ1JPX0VYUEVDVCghKGEgPT0gYikpOworfQorCitURl9MSVRFX01JQ1JPX1RFU1QoU3RhdGljVmVjdG9yU2l6ZUluZXF1YWxpdHkpIHsKKyAgY29uc3QgU3RhdGljVmVjdG9yIGF7MSwgMn07CisgIGNvbnN0IFN0YXRpY1ZlY3RvciBiezEsIDIsIDN9OworICBURl9MSVRFX01JQ1JPX0VYUEVDVChhICE9IGIpOworfQorCitURl9MSVRFX01JQ1JPX1RFU1QoU3RhdGljVmVjdG9yUGFydGlhbFNpemVJbmVxdWFsaXR5KSB7CisgIGNvbnN0IFN0YXRpY1ZlY3RvcjxpbnQsIDM+IGF7MSwgMn07CisgIGNvbnN0IFN0YXRpY1ZlY3RvcjxpbnQsIDM+IGJ7MSwgMiwgM307CisgIFRGX0xJVEVfTUlDUk9fRVhQRUNUKGEgIT0gYik7Cit9CisKK1RGX0xJVEVfTUlDUk9fVEVTVFNfRU5ECmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdGVzdF9oZWxwZXJzLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rlc3RfaGVscGVycy5jYwppbmRleCAxNWQyMzgyLi4zZjBmNWVjIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdGVzdF9oZWxwZXJzLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0X2hlbHBlcnMuY2MKQEAgLTE4NzYsOCArMTg3Niw4IEBACiAKIC8vIENyZWF0ZSBhIFRmTGl0ZUludEFycmF5IGZyb20gYW4gYXJyYXkgb2YgaW50cy4gIFRoZSBmaXJzdCBlbGVtZW50IGluIHRoZQogLy8gc3VwcGxpZWQgYXJyYXkgbXVzdCBiZSB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkgZXhwcmVzc2VkIGFzIGFuIGludC4KLVRmTGl0ZUludEFycmF5KiBJbnRBcnJheUZyb21JbnRzKGludCogaW50X2FycmF5KSB7Ci0gIHJldHVybiByZWludGVycHJldF9jYXN0PFRmTGl0ZUludEFycmF5Kj4oaW50X2FycmF5KTsKK1RmTGl0ZUludEFycmF5KiBJbnRBcnJheUZyb21JbnRzKGNvbnN0IGludCogaW50X2FycmF5KSB7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PFRmTGl0ZUludEFycmF5Kj4oY29uc3RfY2FzdDxpbnQqPihpbnRfYXJyYXkpKTsKIH0KIAogLy8gQ3JlYXRlIGEgVGZMaXRlRmxvYXRBcnJheSBmcm9tIGFuIGFycmF5IG9mIGZsb2F0cy4gIFRoZSBmaXJzdCBlbGVtZW50IGluIHRoZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rlc3RfaGVscGVycy5oIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rlc3RfaGVscGVycy5oCmluZGV4IDU3ODI4MmUuLjYzMTViOWYgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0X2hlbHBlcnMuaAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdGVzdF9oZWxwZXJzLmgKQEAgLTEsNCArMSw0IEBACi0vKiBDb3B5cmlnaHQgMjAxOSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLyogQ29weXJpZ2h0IDIwMjMgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIAogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNyw2ICsxNyw3IEBACiAjZGVmaW5lIFRFTlNPUkZMT1dfTElURV9NSUNST19URVNUX0hFTFBFUlNfSF8KIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjbWF0aD4KICNpbmNsdWRlIDxjc3RkaW50PgogI2luY2x1ZGUgPGxpbWl0cz4KICNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KQEAgLTE5NSw3ICsxOTYsNyBAQAogCiAvLyBDcmVhdGUgYSBUZkxpdGVJbnRBcnJheSBmcm9tIGFuIGFycmF5IG9mIGludHMuICBUaGUgZmlyc3QgZWxlbWVudCBpbiB0aGUKIC8vIHN1cHBsaWVkIGFycmF5IG11c3QgYmUgdGhlIHNpemUgb2YgdGhlIGFycmF5IGV4cHJlc3NlZCBhcyBhbiBpbnQuCi1UZkxpdGVJbnRBcnJheSogSW50QXJyYXlGcm9tSW50cyhpbnQqIGludF9hcnJheSk7CitUZkxpdGVJbnRBcnJheSogSW50QXJyYXlGcm9tSW50cyhjb25zdCBpbnQqIGludF9hcnJheSk7CiAKIC8vIENyZWF0ZSBhIFRmTGl0ZUZsb2F0QXJyYXkgZnJvbSBhbiBhcnJheSBvZiBmbG9hdHMuICBUaGUgZmlyc3QgZWxlbWVudCBpbiB0aGUKIC8vIHN1cHBsaWVkIGFycmF5IG11c3QgYmUgdGhlIHNpemUgb2YgdGhlIGFycmF5IGV4cHJlc3NlZCBhcyBhIGZsb2F0LgpAQCAtMzI1LDcgKzMyNiw3IEBACiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIGlubGluZSBpbnQgWmVyb1BvaW50RnJvbU1pbk1heChjb25zdCBmbG9hdCBtaW4sIGNvbnN0IGZsb2F0IG1heCkgewogICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptaW4oKSkgKwotICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PigtbWluIC8gU2NhbGVGcm9tTWluTWF4PFQ+KG1pbiwgbWF4KSArIDAuNWYpOworICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pihyb3VuZGYoLW1pbiAvIFNjYWxlRnJvbU1pbk1heDxUPihtaW4sIG1heCkpKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0aW5nL0JVSUxEIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rlc3RpbmcvQlVJTEQKaW5kZXggNTg5MTRiYy4uN2EyNDY5OSAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rlc3RpbmcvQlVJTEQKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rlc3RpbmcvQlVJTEQKQEAgLTEsMyArMSw0IEBACitsb2FkKCJAcnVsZXNfcHl0aG9uLy9weXRob246ZGVmcy5iemwiLCAicHlfYmluYXJ5IiwgInB5X2xpYnJhcnkiKQogbG9hZCgiQHRmbG1fcGlwX2RlcHMvLzpyZXF1aXJlbWVudHMuYnpsIiwgInJlcXVpcmVtZW50IikKIGxvYWQoCiAgICAgIi8vdGVuc29yZmxvdzpleHRyYV9ydWxlcy5iemwiLApAQCAtMzIsNyArMzMsNiBAQAogICAgIF0sCiAgICAgdmlzaWJpbGl0eSA9IFsKICAgICAgICAgIjprZXJuZWxfdGVzdF9mcmllbmRzIiwKLSAgICAgICAgIjptaWNyb2Zyb250ZW5kIiwKICAgICAgICAgIjp0ZmxpdGVfbWljcm8iLAogICAgIF0sCiAgICAgZGVwcyA9IFsKQEAgLTc3LDcgKzc3LDcgQEAKICAgICBdLAogICAgIGRlcHMgPSBbCiAgICAgICAgIHJlcXVpcmVtZW50KCJudW1weSIpLAotICAgICAgICByZXF1aXJlbWVudCgidGVuc29yZmxvdy1jcHUiKSwKKyAgICAgICAgcmVxdWlyZW1lbnQoInRlbnNvcmZsb3ciKSwKICAgICBdLAogKQogCkBAIC05Myw2ICs5Myw2IEBACiAgICAgZGVwcyA9IFsKICAgICAgICAgIkBhYnNsX3B5Ly9hYnNsOmFwcCIsCiAgICAgICAgIHJlcXVpcmVtZW50KCJudW1weSIpLAotICAgICAgICByZXF1aXJlbWVudCgidGVuc29yZmxvdy1jcHUiKSwKKyAgICAgICAgcmVxdWlyZW1lbnQoInRlbnNvcmZsb3ciKSwKICAgICBdLAogKQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rlc3RpbmcvZ2VuZXJhdGVfdGVzdF9tb2RlbHMucHkgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdGVzdGluZy9nZW5lcmF0ZV90ZXN0X21vZGVscy5weQppbmRleCAyNTkwMmQwLi4yNTkzNjUzIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdGVzdGluZy9nZW5lcmF0ZV90ZXN0X21vZGVscy5weQorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdGVzdGluZy9nZW5lcmF0ZV90ZXN0X21vZGVscy5weQpAQCAtNzEsNiArNzEsMTAgQEAKICAgY29udmVydGVyLmluZmVyZW5jZV9pbnB1dF90eXBlID0gdGYuaW50OAogICBjb252ZXJ0ZXIuaW5mZXJlbmNlX291dHB1dF90eXBlID0gdGYuaW50OAogICBjb252ZXJ0ZXIucmVwcmVzZW50YXRpdmVfZGF0YXNldCA9IHJlcHJlc2VudGF0aXZlX2RhdGFzZXRfZ2VuCisgICMgVE9ETyhiLzMyNDM4NTgwMik6IERpc2FibGUgcGVyIGNoYW5uZWwgcXVhbnRpemF0aW9uIGluIEZDIGxheWVycyAoY3VycmVudGx5CisgICMgZGVmYXVsdCBiZWhhdmlvdXIpIHNpbmNlIGl0J3Mgbm90IHlldCBzdXBwb3J0ZWQgaW4gVEZMTS4KKyAgY29udmVydGVyLl9leHBlcmltZW50YWxfZGlzYWJsZV9wZXJfY2hhbm5lbF9xdWFudGl6YXRpb25fZm9yX2RlbnNlX2xheWVycyA9ICggICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKKyAgICAgIFRydWUpCiAKICAgdGZsaXRlX21vZGVsID0gY29udmVydGVyLmNvbnZlcnQoKQogICBpZiB3cml0ZV90b19maWxlOgpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rlc3RpbmcvbWljcm9fdGVzdC5oIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rlc3RpbmcvbWljcm9fdGVzdC5oCmluZGV4IDJlMTE5ZTEuLjFlMTc1MzEgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0aW5nL21pY3JvX3Rlc3QuaAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdGVzdGluZy9taWNyb190ZXN0LmgKQEAgLTEsNCArMSw0IEBACi0vKiBDb3B5cmlnaHQgMjAxOCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLyogQ29weXJpZ2h0IDIwMjQgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIAogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0yNTksOCArMjU5LDE2IEBACiAgICAgICAgIE1pY3JvUHJpbnRmKCJGQUlMOiAlcyBkaWQgbm90IG1hdGNoICVzIiwgc3RyaW5nMSwgc3RyaW5nMiwgX19GSUxFX18sIFwKICAgICAgICAgICAgICAgICAgICAgX19MSU5FX18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICBtaWNyb190ZXN0OjpkaWRfdGVzdF9mYWlsID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIH0gd2hpbGUgKGZhbHNlKQogCisjZGVmaW5lIFRGX0xJVEVfTUlDUk9fQ0hFQ0tfRkFJTCgpICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAobWljcm9fdGVzdDo6ZGlkX3Rlc3RfZmFpbCkgeyBcCisgICAgICByZXR1cm4ga1RmTGl0ZUVycm9yOyAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoZmFsc2UpCisKICNlbmRpZiAgLy8gVEVOU09SRkxPV19MSVRFX01JQ1JPX1RFU1RJTkdfTUlDUk9fVEVTVF9IXwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rlc3RpbmcvdGVzdF93aXRoX2FybV9jb3JzdG9uZV8zMDAuc2ggYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdGVzdGluZy90ZXN0X3dpdGhfYXJtX2NvcnN0b25lXzMwMC5zaAppbmRleCA5YjM5ZWU0Li4yNzYzNWJhIDEwMDc1NQotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdGVzdGluZy90ZXN0X3dpdGhfYXJtX2NvcnN0b25lXzMwMC5zaAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdGVzdGluZy90ZXN0X3dpdGhfYXJtX2NvcnN0b25lXzMwMC5zaApAQCAtMSw1ICsxLDUgQEAKICMhL2Jpbi9iYXNoIC1lCi0jIENvcHlyaWdodCAyMDIxIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0zNiw3ICszNiw4IEBACiBGVlArPSItQyBtcHMzX2JvYXJkLnRlbG5ldHRlcm1pbmFsMC5zdGFydF90ZWxuZXQ9MCAiCiBGVlArPSctQyBtcHMzX2JvYXJkLnVhcnQwLm91dF9maWxlPSItIiAnCiBGVlArPSctQyBtcHMzX2JvYXJkLnVhcnQwLnVuYnVmZmVyZWRfb3V0cHV0PTEgJwotRlZQKz0nLUMgbXBzM19ib2FyZC51YXJ0MC5zaHV0ZG93bl9vbl9lb3Q9MScKK0ZWUCs9Jy1DIG1wczNfYm9hcmQudWFydDAuc2h1dGRvd25fb25fZW90PTEgJworRlZQKz0nLS1zdGF0JwogJHtGVlB9ICR7QklOQVJZX1RPX1RFU1R9IHwgdGVlICR7TUlDUk9fTE9HX0ZJTEVOQU1FfQogCiBpZiBbWyAkezJ9ICE9ICJub25fdGVzdF9iaW5hcnkiIF1dCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdGZsaXRlX2JyaWRnZS9CVUlMRCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90ZmxpdGVfYnJpZGdlL0JVSUxECmluZGV4IDUxODAxNWEuLmVhNWVmZGYgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90ZmxpdGVfYnJpZGdlL0JVSUxECisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90ZmxpdGVfYnJpZGdlL0JVSUxECkBAIC0zOCw5ICszOCw2IEBACiAgICAgICAgICJtaWNyb19lcnJvcl9yZXBvcnRlci5oIiwKICAgICBdLAogICAgIGNvcHRzID0gbWljcm9fY29wdHMoKSwKLSAgICB2aXNpYmlsaXR5ID0gWwotICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm8vdGZsaXRlX2JyaWRnZTpfX3BrZ19fIiwKLSAgICBdLAogICAgIGRlcHMgPSBbCiAgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9jb3JlL2FwaTplcnJvcl9yZXBvcnRlciIsCiAgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNybzptaWNyb19jb21wYXRpYmlsaXR5IiwKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9CVUlMRCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9CVUlMRAppbmRleCA2MGUzYzNkLi5lM2M2ZjBjIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvQlVJTEQKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL0JVSUxECkBAIC0xLDMgKzEsNSBAQAorbG9hZCgiQHJ1bGVzX3B5dGhvbi8vcHl0aG9uOmRlZnMuYnpsIiwgInB5X2JpbmFyeSIsICJweV9saWJyYXJ5IiwgInB5X3Rlc3QiKQorbG9hZCgiQGZsYXRidWZmZXJzLy86YnVpbGRfZGVmcy5iemwiLCAiZmxhdGJ1ZmZlcl9jY19saWJyYXJ5IiwgImZsYXRidWZmZXJfcHlfbGlicmFyeSIpCiBsb2FkKCJAdGZsbV9waXBfZGVwcy8vOnJlcXVpcmVtZW50cy5iemwiLCAicmVxdWlyZW1lbnQiKQogbG9hZCgiQHB5YmluZDExX2JhemVsLy86YnVpbGRfZGVmcy5iemwiLCAicHliaW5kX2V4dGVuc2lvbiIpCiBsb2FkKCIvL3RlbnNvcmZsb3c6ZXh0cmFfcnVsZXMuYnpsIiwgInRmbG1fYXBwbGljYXRpb25fZnJpZW5kcyIpCkBAIC0yMSw4ICsyMyw4IEBACiAgICAgbmFtZSA9ICJnZW5lcmF0ZV9jY19hcnJheXNfbGliIiwKICAgICBzcmNzID0gWyJnZW5lcmF0ZV9jY19hcnJheXMucHkiXSwKICAgICBkZXBzID0gWwotICAgICAgICByZXF1aXJlbWVudCgibnVtcHkiKSwKICAgICAgICAgcmVxdWlyZW1lbnQoInBpbGxvdyIpLAorICAgICAgICByZXF1aXJlbWVudCgibnVtcHkiKSwKICAgICBdLAogKQogCkBAIC0zOSw4ICs0MSw4IEBACiAgICAgbmFtZSA9ICJnZW5lcmF0ZV9jY19hcnJheXMiLAogICAgIHNyY3MgPSBbImdlbmVyYXRlX2NjX2FycmF5cy5weSJdLAogICAgIGRlcHMgPSBbCi0gICAgICAgIHJlcXVpcmVtZW50KCJudW1weSIpLAogICAgICAgICByZXF1aXJlbWVudCgicGlsbG93IiksCisgICAgICAgIHJlcXVpcmVtZW50KCJudW1weSIpLAogICAgIF0sCiApCiAKQEAgLTcwLDkgKzcyLDkgQEAKICAgICBdLAogICAgIGRlcHMgPSBbCiAgICAgICAgICI6cmVxdWFudGl6ZV9mbGF0YnVmZmVyIiwKLSAgICAgICAgIi8vcHl0aG9uL3RmbGl0ZV9taWNybzpydW50aW1lIiwKICAgICAgICAgcmVxdWlyZW1lbnQoIm51bXB5IiksCi0gICAgICAgIHJlcXVpcmVtZW50KCJ0ZW5zb3JmbG93LWNwdSIpLAorICAgICAgICByZXF1aXJlbWVudCgidGVuc29yZmxvdyIpLAorICAgICAgICAiLy9weXRob24vdGZsaXRlX21pY3JvOnJ1bnRpbWUiLAogICAgIF0sCiApCiAKQEAgLTEzMSwxMSArMTMzLDMzIEBACiAgICAgXSwKICAgICBkZXBzID0gWwogICAgICAgICAiOm1vZGVsX3RyYW5zZm9ybXNfdXRpbHMiLAotICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm8vcHl0aG9uL2ludGVycHJldGVyL3NyYzpydW50aW1lIiwKLSAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL3Rvb2xzOmZsYXRidWZmZXJfdXRpbHMiLAogICAgICAgICAiQGFic2xfcHkvL2Fic2wvbG9nZ2luZyIsCiAgICAgICAgIHJlcXVpcmVtZW50KCJudW1weSIpLAotICAgICAgICByZXF1aXJlbWVudCgidGVuc29yZmxvdy1jcHUiKSwKKyAgICAgICAgcmVxdWlyZW1lbnQoInRlbnNvcmZsb3ciKSwKKyAgICAgICAgIi8vcHl0aG9uL3RmbGl0ZV9taWNybzpydW50aW1lIiwKKyAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL3Rvb2xzOmZsYXRidWZmZXJfdXRpbHMiLAorICAgIF0sCispCisKK2NjX2JpbmFyeSgKKyAgICBuYW1lID0gImxheWVyX2J5X2xheWVyX291dHB1dF90b29sIiwKKyAgICBzcmNzID0gWyJsYXllcl9ieV9sYXllci5jYyJdLAorICAgIGRlcHMgPSBbCisgICAgICAgICI6bGF5ZXJfYnlfbGF5ZXJfc2NoZW1hIiwKKyAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL2M6Y19hcGlfdHlwZXMiLAorICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvYzpjb21tb24iLAorICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUva2VybmVsczpvcF9tYWNyb3MiLAorICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm86bWljcm9fYWxsb2NhdG9yIiwKKyAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvOm1pY3JvX2NvbnRleHQiLAorICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm86bWljcm9fZnJhbWV3b3JrIiwKKyAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvOm1pY3JvX2xvZyIsCisgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNybzptaWNyb19yZXNvdXJjZV92YXJpYWJsZSIsCisgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNybzptaWNyb191dGlscyIsCisgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNybzpvcF9yZXNvbHZlcnMiLAorICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVsczprZXJuZWxfdXRpbCIsCisgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9iZW5jaG1hcmtpbmc6b3BfcmVzb2x2ZXIiLAorICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvc2NoZW1hOnNjaGVtYV9mYnMiLAorICAgICAgICAiQGZsYXRidWZmZXJzIiwKICAgICBdLAogKQogCkBAIC0xNjcsOCArMTkxLDM0IEBACiAgICAgXSwKICAgICBkZXBzID0gWwogICAgICAgICAiOnRmbG1fbW9kZWxfdHJhbnNmb3Jtc19saWIiLAotICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvcmVjaXBlczpyZXNvdXJjZV92YXJpYWJsZXNfbGliIiwKICAgICAgICAgIkBhYnNsX3B5Ly9hYnNsL3Rlc3Rpbmc6cGFyYW1ldGVyaXplZCIsCi0gICAgICAgIHJlcXVpcmVtZW50KCJ0ZW5zb3JmbG93LWNwdSIpLAorICAgICAgICByZXF1aXJlbWVudCgidGVuc29yZmxvdyIpLAorICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvcmVjaXBlczpyZXNvdXJjZV92YXJpYWJsZXNfbGliIiwKICAgICBdLAogKQorCitweV9iaW5hcnkoCisgICAgbmFtZSA9ICJsYXllcl9ieV9sYXllcl9kZWJ1Z2dlciIsCisgICAgc3JjcyA9IFsibGF5ZXJfYnlfbGF5ZXJfZGVidWdnZXIucHkiXSwKKyAgICBweXRob25fdmVyc2lvbiA9ICJQWTMiLAorICAgIHNyY3NfdmVyc2lvbiA9ICJQWTMiLAorICAgIGRlcHMgPSBbCisgICAgICAgICI6bGF5ZXJfYnlfbGF5ZXJfc2NoZW1hX3B5IiwKKyAgICAgICAgIjptb2RlbF90cmFuc2Zvcm1zX3V0aWxzIiwKKyAgICAgICAgIkBhYnNsX3B5Ly9hYnNsOmFwcCIsCisgICAgICAgICJAYWJzbF9weS8vYWJzbC9mbGFncyIsCisgICAgICAgIHJlcXVpcmVtZW50KCJ0ZW5zb3JmbG93IiksCisgICAgICAgICIvL3B5dGhvbi90ZmxpdGVfbWljcm86cnVudGltZSIsCisgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS90b29sczpmbGF0YnVmZmVyX3V0aWxzIiwKKyAgICBdLAorKQorCitmbGF0YnVmZmVyX2NjX2xpYnJhcnkoCisgICAgbmFtZSA9ICJsYXllcl9ieV9sYXllcl9zY2hlbWEiLAorICAgIHNyY3MgPSBbImxheWVyX2J5X2xheWVyX3NjaGVtYS5mYnMiXSwKKykKKworZmxhdGJ1ZmZlcl9weV9saWJyYXJ5KAorICAgIG5hbWUgPSAibGF5ZXJfYnlfbGF5ZXJfc2NoZW1hX3B5IiwKKyAgICBzcmNzID0gWyJsYXllcl9ieV9sYXllcl9zY2hlbWEuZmJzIl0sCispCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvTWFrZWZpbGUuaW5jIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL01ha2VmaWxlLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZGJlNzNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL01ha2VmaWxlLmluYwpAQCAtMCwwICsxLDEyIEBACitNSUNST0xJVEVfVE9PTF9ST09UX0RJUiA6PSAkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvCisKK0xBWUVSX0JZX0xBWUVSX09VUFVUX1NSQ1MgOj0gXAorJChNSUNST0xJVEVfVE9PTF9ST09UX0RJUikvbGF5ZXJfYnlfbGF5ZXIuY2MgXAorCitMQVlFUl9CWV9MQVlFUl9PVVBVVF9IRFJTIDo9IFwKKyQoTUlDUk9MSVRFX1RPT0xfUk9PVF9ESVIpYmVuY2htYXJraW5nL29wX3Jlc29sdmVyLmggXAorCitpZm5lcSAoJChUQVJHRVQpLCBibHVlcGlsbCBjb3J0ZXhfbV9jb3JzdG9uZV8zMDAgcmlzY3YzMl9nZW5lcmljIGhleGFnb24pCisgICAgJChldmFsICQoY2FsbCBtaWNyb2xpdGVfdGVzdCxsYXllcl9ieV9sYXllcl9vdXRwdXRfdG9vbCxcCisgICAgJChMQVlFUl9CWV9MQVlFUl9PVVBVVF9TUkNTKSwkKExBWUVSX0JZX0xBWUVSX09VUFVUX0hEUlMpLCkpCitlbmRpZgpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2JlbmNobWFya2luZy9CVUlMRCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9iZW5jaG1hcmtpbmcvQlVJTEQKaW5kZXggOTc1OTU0Ni4uNjY5MWFjMyAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2JlbmNobWFya2luZy9CVUlMRAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvYmVuY2htYXJraW5nL0JVSUxECkBAIC0xLDYgKzEsNyBAQAogY2NfbGlicmFyeSgKICAgICBuYW1lID0gIm9wX3Jlc29sdmVyIiwKICAgICBoZHJzID0gWyJvcF9yZXNvbHZlci5oIl0sCisgICAgdmlzaWJpbGl0eSA9IFsiLy90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHM6X19zdWJwYWNrYWdlc19fIl0sCiAgICAgZGVwcyA9IFsiLy90ZW5zb3JmbG93L2xpdGUvbWljcm86b3BfcmVzb2x2ZXJzIl0sCiApCiAKQEAgLTksMzEgKzEwLDI0IEBACiAgICAgc3JjcyA9IFsibWV0cmljcy5jYyJdLAogICAgIGhkcnMgPSBbIm1ldHJpY3MuaCJdLAogICAgIGRlcHMgPSBbCi0gICAgICAgICI6bG9nX3V0aWxzIiwKKyAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWw6Y29tcGF0aWJpbGl0eSIsCisgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNybzptaWNyb19sb2ciLAogICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm86bWljcm9fcHJvZmlsZXIiLAogICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm86cmVjb3JkaW5nX2FsbG9jYXRvcnMiLAotICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm8vYXJlbmFfYWxsb2NhdG9yOnJlY29yZGluZ19zaW1wbGVfbWVtb3J5X2FsbG9jYXRvciIsCi0gICAgXSwKLSkKLQotY2NfbGlicmFyeSgKLSAgICBuYW1lID0gImxvZ191dGlscyIsCi0gICAgc3JjcyA9IFsibG9nX3V0aWxzLmNjIl0sCi0gICAgaGRycyA9IFsibG9nX3V0aWxzLmgiXSwKLSAgICBkZXBzID0gWwotICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvbWljcm86bWljcm9fbG9nIiwKICAgICBdLAogKQogCiBjY19saWJyYXJ5KAogICAgIG5hbWUgPSAiZ2VuZXJpY19iZW5jaG1hcmtfbGliIiwKICAgICBzcmNzID0gWyJnZW5lcmljX21vZGVsX2JlbmNobWFyay5jYyJdLAorICAgIGhkcnMgPSBbInNob3dfbWV0YV9kYXRhLmgiXSwKKyAgICBkZWZpbmVzID0gWyJHRU5FUklDX0JFTkNITUFSS19OT19NRVRBX0RBVEEiXSwKICAgICBkZXBzID0gWwotICAgICAgICAiOmxvZ191dGlscyIsCiAgICAgICAgICI6bWV0cmljcyIsCiAgICAgICAgICI6b3BfcmVzb2x2ZXIiLAogICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvYzpjX2FwaV90eXBlcyIsCiAgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9jOmNvbW1vbiIsCisgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNybzptaWNyb19jb250ZXh0IiwKICAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvOm1pY3JvX2xvZyIsCiAgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNybzptaWNyb19wcm9maWxlciIsCiAgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9taWNybzpvcF9yZXNvbHZlcnMiLApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2JlbmNobWFya2luZy9NYWtlZmlsZS5pbmMgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvYmVuY2htYXJraW5nL01ha2VmaWxlLmluYwppbmRleCAxNzhkODhiLi4zOTZlNzAxIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvYmVuY2htYXJraW5nL01ha2VmaWxlLmluYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvYmVuY2htYXJraW5nL01ha2VmaWxlLmluYwpAQCAtMSwxOCArMSw2NCBAQAogTUlDUk9MSVRFX0JFTkNITUFSS19ST09UX0RJUiA6PSAkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvYmVuY2htYXJraW5nCiAKK2lmbmVxICgkKEdFTkVSSUNfQkVOQ0hNQVJLX01PREVMX1BBVEgpLCkKKyAgICBHRU5FUklDX0JFTkNITUFSS19NT0RFTF9ESVIgOj0gJChkaXIgJChHRU5FUklDX0JFTkNITUFSS19NT0RFTF9QQVRIKSkKKyAgICBHRU5FUklDX0JFTkNITUFSS19NT0RFTF9OQU1FIDo9ICQobm90ZGlyICQoYmFzZW5hbWUgJChHRU5FUklDX0JFTkNITUFSS19NT0RFTF9QQVRIKSkpCisgICAgQ1hYRkxBR1MgKz0gLURHRU5FUklDX0JFTkNITUFSS19VU0lOR19CVUlMVElOX01PREVMCisgICAgQ1hYRkxBR1MgKz0gLURHRU5FUklDX0JFTkNITUFSS19NT0RFTF9IRUFERVJfUEFUSD1cIiQoR0VORVJJQ19CRU5DSE1BUktfTU9ERUxfRElSKSQoR0VORVJJQ19CRU5DSE1BUktfTU9ERUxfTkFNRSlfbW9kZWxfZGF0YS5oXCIKKyAgICBDWFhGTEFHUyArPSAtREdFTkVSSUNfQkVOQ0hNQVJLX01PREVMX05BTUU9JChHRU5FUklDX0JFTkNITUFSS19NT0RFTF9OQU1FKQoraWZuZXEgKCQoR0VORVJJQ19CRU5DSE1BUktfQVJFTkFfU0laRSksKQorICAgIENYWEZMQUdTICs9IC1ER0VORVJJQ19CRU5DSE1BUktfVEVOU09SX0FSRU5BX1NJWkU9JChHRU5FUklDX0JFTkNITUFSS19BUkVOQV9TSVpFKQorZW5kaWYKKworICAgICMgbW9kZWwgcGF0aCBpbmNsdWRlcyAkKFRFTlNPUkZMT1dfUk9PVCkgYXMgcGFydCBvZiB0aGUgbWFrZSBpbnZvY2F0aW9uCisgICAgR0VORVJJQ19CRU5DSE1BUktfR0VORVJBVE9SX0lOUFVUUyA6PSAkKEdFTkVSSUNfQkVOQ0hNQVJLX01PREVMX1BBVEgpCisKKyAgICBHRU5FUklDX0JFTkNITUFSS19HRU5FUkFURURfU1JDUyA6PSBcCisgICAgJChHRU5FUkFURURfU1JDU19ESVIpJChHRU5FUklDX0JFTkNITUFSS19NT0RFTF9ESVIpJChHRU5FUklDX0JFTkNITUFSS19NT0RFTF9OQU1FKV9tb2RlbF9kYXRhLmNjCisKKyAgICBHRU5FUklDX0JFTkNITUFSS19HRU5FUkFURURfSERSUyA6PSBcCisgICAgJChHRU5FUkFURURfU1JDU19ESVIpJChHRU5FUklDX0JFTkNITUFSS19NT0RFTF9ESVIpJChHRU5FUklDX0JFTkNITUFSS19NT0RFTF9OQU1FKV9tb2RlbF9kYXRhLmgKK2VuZGlmCisKIEdFTkVSSUNfQkVOQ0hNQVJLX1NSQ1MgOj0gXAogJChNSUNST0xJVEVfQkVOQ0hNQVJLX1JPT1RfRElSKS9nZW5lcmljX21vZGVsX2JlbmNobWFyay5jYyBcCi0kKE1JQ1JPTElURV9CRU5DSE1BUktfUk9PVF9ESVIpL2xvZ191dGlscy5jYyBcCi0kKE1JQ1JPTElURV9CRU5DSE1BUktfUk9PVF9ESVIpL21ldHJpY3MuY2MKKyQoTUlDUk9MSVRFX0JFTkNITUFSS19ST09UX0RJUikvbWV0cmljcy5jYyBcCiskKEdFTkVSQVRFRF9TUkNTX0RJUikkKE1JQ1JPTElURV9CRU5DSE1BUktfUk9PVF9ESVIpL3Nob3dfbWV0YV9kYXRhLmNjCiAKIEdFTkVSSUNfQkVOQ0hNQVJLX0hEUlMgOj0gXAogJChNSUNST0xJVEVfQkVOQ0hNQVJLX1JPT1RfRElSKS9vcF9yZXNvbHZlci5oIFwKLSQoTUlDUk9MSVRFX0JFTkNITUFSS19ST09UX0RJUikvbG9nX3V0aWxzLmggXAotJChNSUNST0xJVEVfQkVOQ0hNQVJLX1JPT1RfRElSKS9tZXRyaWNzLmgKKyQoTUlDUk9MSVRFX0JFTkNITUFSS19ST09UX0RJUikvbWV0cmljcy5oIFwKKyQoTUlDUk9MSVRFX0JFTkNITUFSS19ST09UX0RJUikvc2hvd19tZXRhX2RhdGEuaAorCisjIGFsd2F5cyByZWJ1aWxkIHRoZXNlIHRvIGNhdGNoIE1PREVMX1BBVEggYW5kIEFSRU5BX1NJWkUgY2hhbmdlcyBvbiBjb21tYW5kIGxpbmUKKy5QSE9OWTogJChHRU5FUkFURURfU1JDU19ESVIpJChNSUNST0xJVEVfQkVOQ0hNQVJLX1JPT1RfRElSKS9zaG93X21ldGFfZGF0YS5jYworLlBIT05ZOiAkKE1JQ1JPTElURV9CRU5DSE1BUktfUk9PVF9ESVIpL2dlbmVyaWNfbW9kZWxfYmVuY2htYXJrLmNjCisKKyQoR0VORVJBVEVEX1NSQ1NfRElSKSQoTUlDUk9MSVRFX0JFTkNITUFSS19ST09UX0RJUikvc2hvd19tZXRhX2RhdGEuY2M6CisJQ0M9IiQoQ0MpIiBcCisJQ1hYPSIkKENYWCkiIFwKKwlDQ19GTEFHUz0iJChDQ0ZMQUdTKSIgXAorCUNYWF9GTEFHUz0iJChDWFhGTEFHUykiIFwKKwlLRVJORUxfT1BUSU1JWkFUSU9OPSIkKEtFUk5FTF9PUFRJTUlaQVRJT05fTEVWRUwpIiBcCisJQ09SRV9PUFRJTUlaQVRJT049IiQoQ09SRV9PUFRJTUlaQVRJT05fTEVWRUwpIiBcCisJVEhJUkRfUEFSVFlfS0VSTkVMX09QVElNSVpBVElPTj0iJChUSElSRF9QQVJUWV9LRVJORUxfT1BUSU1JWkFUSU9OX0xFVkVMKSIgXAorCVRBUkdFVD0kKFRBUkdFVCkgXAorCVRBUkdFVF9BUkNIPSQoVEFSR0VUX0FSQ0gpIFwKKwlURU5TT1JGTE9XX1JPT1Q9IiQoVEVOU09SRkxPV19ST09UKSIgXAorCU9QVElNSVpFRF9LRVJORUw9JChPUFRJTUlaRURfS0VSTkVMX0RJUikgXAorCUJVSUxEX1RZUEU9JChCVUlMRF9UWVBFKSBcCisJWFRFTlNBX0NPUkU9JChYVEVOU0FfQ09SRSkgXAorCVhURU5TQV9CQVNFPSQoWFRFTlNBX0JBU0UpIFwKKwlYVEVOU0FfVE9PTFNfVkVSU0lPTj0kKFhURU5TQV9UT09MU19WRVJTSU9OKSBcCisJVEVNUExBVEVfRklMRT0iJChNSUNST0xJVEVfQkVOQ0hNQVJLX1JPT1RfRElSKS9zaG93X21ldGFfZGF0YS5jYy50ZW1wbGF0ZSIgXAorCUdFTkVSQVRFRF9GSUxFPSIkKEdFTkVSQVRFRF9TUkNTX0RJUikkKE1JQ1JPTElURV9CRU5DSE1BUktfUk9PVF9ESVIpL3Nob3dfbWV0YV9kYXRhLmNjIiBcCisJTU9ERUxfRklMRT0iJChHRU5FUklDX0JFTkNITUFSS19NT0RFTF9QQVRIKSIgXAorCSQoTUlDUk9MSVRFX0JFTkNITUFSS19ST09UX0RJUikvY29sbGVjdF9tZXRhX2RhdGEuc2gKIAogaWZuZXEgKCQoVEFSR0VUKSxibHVlcGlsbCkKLWlmbmVxICgkKFRBUkdFVF9BUkNIKSwgJChmaWx0ZXIgJChUQVJHRVRfQVJDSCksIGhpZmk1IGhpZmltaW5pKSkKK2lmbmVxICgkKFRBUkdFVF9BUkNIKSwgJChmaWx0ZXIgJChUQVJHRVRfQVJDSCksIGhpZmltaW5pKSkKICAgICAkKGV2YWwgJChjYWxsIG1pY3JvbGl0ZV90ZXN0LHRmbG1fYmVuY2htYXJrLFwKLSAgICAkKEdFTkVSSUNfQkVOQ0hNQVJLX1NSQ1MpLCQoR0VORVJJQ19CRU5DSE1BUktfSERSUyksKSkKKyAgICAkKEdFTkVSSUNfQkVOQ0hNQVJLX1NSQ1MpLCQoR0VORVJJQ19CRU5DSE1BUktfSERSUyksXAorICAgICQoR0VORVJJQ19CRU5DSE1BUktfR0VORVJBVE9SX0lOUFVUUykpKQogZW5kaWYKLWVuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorZW5kaWYKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9iZW5jaG1hcmtpbmcvUkVBRE1FLm1kIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2JlbmNobWFya2luZy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIwMzgyMAotLS0gL2Rldi9udWxsCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9iZW5jaG1hcmtpbmcvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNDE0IEBACisjIEdlbmVyaWMgQmVuY2htYXJraW5nIFRvb2wgYnVpbGQvcnVuIGluc3RydWN0aW9ucworVGhpcyB0b29sIGNhbiBiZSB1c2VkIHRvIGJlbmNobWFyayBhbnkgVGZMaXRlIGZvcm1hdCBtb2RlbC4gIFRoZSB0b29sIGNhbiBiZQorY29tcGlsZWQgaW4gb25lIG9mIHR3byB3YXlzOgorMS4gU3VjaCB0aGF0IGl0IHRha2VzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMsIGFsbG93aW5nIHRoZSBwYXRoIHRvIHRoZSBtb2RlbAorZmlsZSB0byBiZSBzcGVjaWZpZWQgYXMgYSBwcm9ncmFtIGFyZ3VtZW50CisyLiBXaXRoIGEgbW9kZWwgY29tcGlsZWQgaW50byB0aGUgdG9vbCwgYWxsb3dpbmcgdXNlIGluIGFueSBzaW11bGF0b3Igb3Igb24KK2FueSBoYXJkd2FyZSBwbGF0Zm9ybQorCitCdWlsZGluZyB0aGUgdG9vbCB3aXRoIHRoZSBtb2RlbCBjb21waWxlZCBpbiB1c2VzIHR3byBhZGRpdGlvbmFsIE1ha2VmaWxlCit2YXJpYWJsZXM6CisqIGBHRU5FUklDX0JFTkNITUFSS19NT0RFTF9QQVRIYDogdGhlIHBhdGggdG8gdGhlIFRmTGl0ZSBmb3JtYXQgbW9kZWwgZmlsZS4gIFRoaXMKK2NhbiBiZSBhIHJlbGF0aXZlIG9yIGFic29sdXRlIHBhdGguICBUaGlzIHZhcmlhYmxlIGlzIHJlcXVpcmVkLgorKiBgR0VORVJJQ19CRU5DSE1BUktfQVJFTkFfU0laRWA6IHRoZSBzaXplIG9mIHRoZSBURkxNIGludGVycHJldGVyIGFyZW5hLCBpbiBieXRlcy4KK1RoaXMgdmFyaWFibGUgaXMgb3B0aW9uYWwuCisKKyMjIFRlc3RlZCwgd29ya2luZyB0YXJnZXRzCisqIHg4NgorKiBjb3J0ZXhfbV9xZW11IChubyB0aW1pbmcgZGF0YSkKKyogWHRlbnNhIChwNiwgaGlmaTMpCisqIGNvcnRleF9tX2NvcnN0b25lXzMwMAorCisjIyBUZXN0ZWQsIG5vbi13b3JraW5nIHRhcmdldHMKKyogbm9uZSBjdXJyZW50bHkKKworIyMgQnVpbGQgYW5kIHJ1biBmb3IgeDg2CitCdWlsZCBmb3IgY29tbWFuZCBsaW5lIGFyZ3VtZW50czoKK2BgYAorbWFrZSAtZiB0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9NYWtlZmlsZSB0ZmxtX2JlbmNobWFyayAtaiQobnByb2MpCitgYGAKK1J1biB3aXRoIGNvbW1hbmQgbGluZSBhcmd1bWVudHM6CitgYGAKK2dlbi9saW51eF94ODZfNjRfZGVmYXVsdC9iaW4vdGZsbV9iZW5jaG1hcmsgdGVuc29yZmxvdy9saXRlL21pY3JvL21vZGVscy9wZXJzb25fZGV0ZWN0LnRmbGl0ZQorYGBgCisKK0J1aWxkIGFuZCBydW4gd2l0aCBtb2RlbCBjb21waWxlZCBpbnRvIHRvb2w6CitgYGAKK21ha2UgLWYgdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvTWFrZWZpbGUgQlVJTERfVFlQRT1kZWZhdWx0IHJ1bl90ZmxtX2JlbmNobWFyayAtaiQobnByb2MpIEdFTkVSSUNfQkVOQ0hNQVJLX01PREVMX1BBVEg9dGVuc29yZmxvdy9saXRlL21pY3JvL21vZGVscy9wZXJzb25fZGV0ZWN0LnRmbGl0ZSBHRU5FUklDX0JFTkNITUFSS19BUkVOQV9TSVpFPWBleHByIDE1MCBcKiAxMDI0YAorYGBgCisKKyMjIEJ1aWxkIGFuZCBydW4gZm9yIFh0ZW5zYQorQnVpbGQgYW5kIHJ1biB3aXRoIG1vZGVsIGNvbXBpbGVkIGludG8gdG9vbDoKK2BgYAorbWFrZSAtZiB0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9NYWtlZmlsZSBUQVJHRVQ9eHRlbnNhIFRBUkdFVF9BUkNIPXZpc2lvbl9wNiBPUFRJTUlaRURfS0VSTkVMX0RJUj14dGVuc2EgWFRFTlNBX0NPUkU9UDZfMjAwNTI4IEJVSUxEX1RZUEU9ZGVmYXVsdCBydW5fdGZsbV9iZW5jaG1hcmsgLWokKG5wcm9jKSBHRU5FUklDX0JFTkNITUFSS19NT0RFTF9QQVRIPS90bXAva2V5d29yZF9zY3JhbWJsZWQudGZsaXRlIEdFTkVSSUNfQkVOQ0hNQVJLX0FSRU5BX1NJWkU9YGV4cHIgNTAgXCogMTAyNGAKK2BgYAorCisjIyBCdWlsZCBhbmQgcnVuIGZvciBDb3J0ZXgtTSB1c2luZyBDb3JzdG9uZSAzMDAgc2ltdWxhdG9yCitCdWlsZCBhbmQgcnVuIHdpdGggbW9kZWwgY29tcGlsZWQgaW50byB0b29sOgorYGBgCittYWtlIC1mIHRlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL01ha2VmaWxlICAgVEFSR0VUPWNvcnRleF9tX2NvcnN0b25lXzMwMCBUQVJHRVRfQVJDSD1jb3J0ZXgtbTQgICBPUFRJTUlaRURfS0VSTkVMX0RJUj1jbXNpc19ubiAgIEJVSUxEX1RZUEU9ZGVmYXVsdCBydW5fdGZsbV9iZW5jaG1hcmsgLWokKG5wcm9jKSBHRU5FUklDX0JFTkNITUFSS19NT0RFTF9QQVRIPXRlbnNvcmZsb3cvbGl0ZS9taWNyby9tb2RlbHMvcGVyc29uX2RldGVjdC50ZmxpdGUgR0VORVJJQ19CRU5DSE1BUktfQVJFTkFfU0laRT1gZXhwciAxNTAgXCogMTAyNGAKK2BgYAorCisjIyBCdWlsZCBhbmQgcnVuIHVzaW5nIEJhemVsCisKK1RoaXMgaXMgb25seSBmb3IgdGhlIHg4NiBjb21tYW5kIGxpbmUgYXJndW1lbnQgYnVpbGQsIGFuZCBkb2VzIG5vdCBjb250YWluIG1ldGEtZGF0YToKK2BgYAorYmF6ZWwgYnVpbGQgdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2JlbmNobWFya2luZzp0ZmxtX2JlbmNobWFyaworYmF6ZWwtYmluL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9iZW5jaG1hcmtpbmcvdGZsbV9iZW5jaG1hcmsgdGVuc29yZmxvdy9saXRlL21pY3JvL21vZGVscy9wZXJzb25fZGV0ZWN0LnRmbGl0ZQorYGBgCisKKyMjIEV4YW1wbGUgb3V0cHV0IHdpdGggbWV0YS1kYXRhIGFuZCBidWlsdC1pbiBtb2RlbCBsYXllciBpbmZvcm1hdGlvbgorCitUaGlzIHNhbXBsZSBvdXRwdXQgaXMgZm9yIENvcnRleC1NIHVzaW5nIENvcnN0b25lIDMwMDoKK2BgYAorQ29uZmlndXJlZCBhcmVuYSBzaXplID0gMTUzNjAwCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCitDb21waWxlZCBvbjoKKworRnJpIE1heSAxNyAwMzozNjo1OSBQTSBQRFQgMjAyNAorLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0dpdCBTSEE6IGE0MzkwYTFkNzNlZGY1YThkM2FmZmExZGE2MGUxZWJhODhlMGNiMTMKKworR2l0IHN0YXR1czoKKworT24gYnJhbmNoIG1haW4KK1lvdXIgYnJhbmNoIGlzIHVwIHRvIGRhdGUgd2l0aCAnb3JpZ2luL21haW4nLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0MgY29tcGlsZXI6IHRlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2Rvd25sb2Fkcy9nY2NfZW1iZWRkZWQvYmluL2FybS1ub25lLWVhYmktZ2NjCitWZXJzaW9uOgorCithcm0tbm9uZS1lYWJpLWdjYyAoQXJtIEdOVSBUb29sY2hhaW4gMTMuMi5yZWwxIChCdWlsZCBhcm0tMTMuNykpIDEzLjIuMSAyMDIzMTAwOQorQ29weXJpZ2h0IChDKSAyMDIzIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorVGhpcyBpcyBmcmVlIHNvZnR3YXJlOyBzZWUgdGhlIHNvdXJjZSBmb3IgY29weWluZyBjb25kaXRpb25zLiAgVGhlcmUgaXMgTk8KK3dhcnJhbnR5OyBub3QgZXZlbiBmb3IgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLgorCitGbGFnczoKKworLVdpbXBsaWNpdC1mdW5jdGlvbi1kZWNsYXJhdGlvbiAtc3RkPWMxMSAtV2Vycm9yIC1mbm8tdW53aW5kLXRhYmxlcyAtZmZ1bmN0aW9uLXNlY3Rpb25zIAorLWZkYXRhLXNlY3Rpb25zIC1mbWVzc2FnZS1sZW5ndGg9MCAtRFRGX0xJVEVfU1RBVElDX01FTU9SWSAtRFRGX0xJVEVfRElTQUJMRV9YODZfTkVPTiAKKy1EQ01TSVNfTk4gLURLRVJORUxTX09QVElNSVpFRF9GT1JfU1BFRUQgLW1jcHU9Y29ydGV4LW00K25vZnAgLW1mcHU9YXV0byAKKy1EVEZfTElURV9NQ1VfREVCVUdfTE9HIC1tdGh1bWIgLW1mbG9hdC1hYmk9c29mdCAtZnVuc2lnbmVkLWNoYXIgLW1saXR0bGUtZW5kaWFuIAorLWZvbWl0LWZyYW1lLXBvaW50ZXIgLU1EIC1EQVJNQ000CisKK0MrKyBjb21waWxlcjogdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvZG93bmxvYWRzL2djY19lbWJlZGRlZC9iaW4vYXJtLW5vbmUtZWFiaS1nKysKK1ZlcnNpb246CisKK2FybS1ub25lLWVhYmktZysrIChBcm0gR05VIFRvb2xjaGFpbiAxMy4yLnJlbDEgKEJ1aWxkIGFybS0xMy43KSkgMTMuMi4xIDIwMjMxMDA5CitDb3B5cmlnaHQgKEMpIDIwMjMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCitUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHNlZSB0aGUgc291cmNlIGZvciBjb3B5aW5nIGNvbmRpdGlvbnMuICBUaGVyZSBpcyBOTword2FycmFudHk7IG5vdCBldmVuIGZvciBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisKK0ZsYWdzOgorCistc3RkPWMrKzExIC1mbm8tcnR0aSAtZm5vLWV4Y2VwdGlvbnMgLWZuby10aHJlYWRzYWZlLXN0YXRpY3MgLVdub24tdmlydHVhbC1kdG9yIC1XZXJyb3IgCistZm5vLXVud2luZC10YWJsZXMgLWZmdW5jdGlvbi1zZWN0aW9ucyAtZmRhdGEtc2VjdGlvbnMgLWZtZXNzYWdlLWxlbmd0aD0wIAorLURURl9MSVRFX1NUQVRJQ19NRU1PUlkgLURURl9MSVRFX0RJU0FCTEVfWDg2X05FT04gLVdzaWduLWNvbXBhcmUgLVdkb3VibGUtcHJvbW90aW9uIAorLVd1bnVzZWQtdmFyaWFibGUgLVd1bnVzZWQtZnVuY3Rpb24gLVdzd2l0Y2ggLVd2bGEgLVdhbGwgLVdleHRyYSAKKy1XbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMgLVdzdHJpY3QtYWxpYXNpbmcgLVduby11bnVzZWQtcGFyYW1ldGVyIC1EQ01TSVNfTk4gCistREtFUk5FTFNfT1BUSU1JWkVEX0ZPUl9TUEVFRCAtbWNwdT1jb3J0ZXgtbTQrbm9mcCAtbWZwdT1hdXRvIC1EVEZfTElURV9NQ1VfREVCVUdfTE9HIAorLW10aHVtYiAtbWZsb2F0LWFiaT1zb2Z0IC1mdW5zaWduZWQtY2hhciAtbWxpdHRsZS1lbmRpYW4gLWZvbWl0LWZyYW1lLXBvaW50ZXIgLU1EIAorLURBUk1DTTQgLURDTVNJU19ERVZJQ0VfQVJNX0NPUlRFWF9NX1hYX0hFQURFUl9GSUxFPSJBUk1DTTQuaCIgCistREdFTkVSSUNfQkVOQ0hNQVJLX1VTSU5HX0JVSUxUSU5fTU9ERUwgCistREdFTkVSSUNfQkVOQ0hNQVJLX01PREVMX0hFQURFUl9QQVRIPSJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbW9kZWxzL3BlcnNvbl9kZXRlY3RfbW9kZWxfZGEKK3RhLmgiIC1ER0VORVJJQ19CRU5DSE1BUktfTU9ERUxfTkFNRT1wZXJzb25fZGV0ZWN0IAorLURHRU5FUklDX0JFTkNITUFSS19URU5TT1JfQVJFTkFfU0laRT0xNTM2MDAKKworT3B0aW1pemF0aW9uOiBrZXJuZWw9IC1PMiAgY29yZT0gLU9zICB0aGlyZC1wYXJ0eS1rZXJuZWw9IC1PMgorLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RhcmdldCBpbmZvcm1hdGlvbjoKKworVEFSR0VUPWNvcnRleF9tX2NvcnN0b25lXzMwMAorVEFSR0VUX0FSQ0g9Y29ydGV4LW00CitPUFRJTUlaQVRJT049Y21zaXNfbm4KK0JVSUxEX1RZUEU9ZGVmYXVsdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0KK05OIGxpYnJhcnkgZG93bmxvYWQgVVJMczoKKworaHR0cDovL2dpdGh1Yi5jb20vQVJNLXNvZnR3YXJlL0NNU0lTLU5OL2FyY2hpdmUvMDFkZWUzOGU2ZDZiZmJiZjIwMmYwY2Q0MjViYmVhMTczMTc0N2Q1MS56CitpcAorCitOTiBsaWJyYXJ5IE1ENSBjaGVja3N1bXM6CisKK2YyMGJlOTNlZGVkZjQyYmI3MDRjMTlmNjk5YTI0MzEzCistLS0tLS0tLS0tLS0tLS0tLS0tLQorTW9kZWwgU0hBMToKKworYmNhZmNhYTk5ZDJlYWYwODlmMGNhMjVkNjZmNTZhMjE3N2U5M2Y3NgorCitNb2RlbCBhbmFseXNpczoKKworPT09IHRlbnNvcmZsb3cvbGl0ZS9taWNyby9tb2RlbHMvcGVyc29uX2RldGVjdC50ZmxpdGUgPT09CitZb3VyIFRGTGl0ZSBtb2RlbCBoYXMgJzEnIHN1YmdyYXBoKHMpLiBJbiB0aGUgc3ViZ3JhcGggZGVzY3JpcHRpb24gYmVsb3csCitUIyByZXByZXNlbnRzIHRoZSBUZW5zb3IgbnVtYmVycy4gRm9yIGV4YW1wbGUsIGluIFN1YmdyYXBoIzAsIHRoZSBERVBUSFdJU0VfQ09OVl8yRCBvcCAKK3Rha2VzCit0ZW5zb3IgIzg4IGFuZCB0ZW5zb3IgIzAgYW5kIHRlbnNvciAjMzMgYXMgaW5wdXQgYW5kIHByb2R1Y2VzIHRlbnNvciAjMzQgYXMgb3V0cHV0LgorU3ViZ3JhcGgjMChUIzg4KSAtPiBbVCM4N10KKyAgT3AjMCBERVBUSFdJU0VfQ09OVl8yRChUIzg4LCBUIzAsIFQjMzNbMzc3NCwgLTEwNywgLTg0Mzk0LCAtMTM5MDgsIDIwNjk3LCAuLi5dKSAtPiAKK1tUIzM0XQorICBPcCMxIERFUFRIV0lTRV9DT05WXzJEKFQjMzQsIFQjOSwgVCM1MlszMTEzMiwgMjgsIDI3MywgLTI2OTIsIDc0MDksIC4uLl0pIC0+IFtUIzUxXQorICBPcCMyIENPTlZfMkQoVCM1MSwgVCMxMCwgVCM1M1sxMDA2NCwgMTEzMCwgLTEzMDU2LCAtMzAyODQsIC0yMzM0OSwgLi4uXSkgLT4gW1QjNTRdCisgIE9wIzMgREVQVEhXSVNFX0NPTlZfMkQoVCM1NCwgVCMxMSwgVCM1NlszMDYsIC0xNTgsIDE5MTgxLCAtMzY0LCA2MjM3LCAuLi5dKSAtPiBbVCM1NV0KKyAgT3AjNCBDT05WXzJEKFQjNTUsIFQjMTIsIFQjNTdbLTc2NDksIDEyMjg3LCAtNDQzMywgNTg1MSwgLTE4OCwgLi4uXSkgLT4gW1QjNThdCisgIE9wIzUgREVQVEhXSVNFX0NPTlZfMkQoVCM1OCwgVCMxMywgVCM2MFs3Mjk3LCAtNDk4LCAyNjMsIC0xOTc1LCAyMjYwLCAuLi5dKSAtPiBbVCM1OV0KKyAgT3AjNiBDT05WXzJEKFQjNTksIFQjMTQsIFQjNjFbLTQ3NDIsIC00MTYwLCA2OTg1LCA4NjQ3LCAyOTc3MywgLi4uXSkgLT4gW1QjNjJdCisgIE9wIzcgREVQVEhXSVNFX0NPTlZfMkQoVCM2MiwgVCMxNSwgVCM2NFsyODU4OCwgMzYzLCAyNzU5MiwgMjIyOTQsIC00MzQ0LCAuLi5dKSAtPiBbVCM2M10KKyAgT3AjOCBDT05WXzJEKFQjNjMsIFQjMTYsIFQjNjVbMTI2ODMsIDM2NTgxLCA2MjA2LCAxMjM2LCAxNTgzNCwgLi4uXSkgLT4gW1QjNjZdCisgIE9wIzkgREVQVEhXSVNFX0NPTlZfMkQoVCM2NiwgVCMxNywgVCM2OFstNjM1MywgOTA5MCwgLTMwLCAtMTAxOSwgLTQ5NiwgLi4uXSkgLT4gW1QjNjddCisgIE9wIzEwIENPTlZfMkQoVCM2NywgVCMxOCwgVCM2OVszODk1LCAtNjU2MywgLTg4NDMsIC0yMDY2LCAtMTM3MiwgLi4uXSkgLT4gW1QjNzBdCisgIE9wIzExIERFUFRIV0lTRV9DT05WXzJEKFQjNzAsIFQjMTksIFQjNzJbMjA0MzcsIC0zNjUsIC0yNTE4LCAyMDgyNywgLTkwNCwgLi4uXSkgLT4gCitbVCM3MV0KKyAgT3AjMTIgQ09OVl8yRChUIzcxLCBUIzIwLCBUIzczWy0xMDEyMCwgOTc2OCwgMzUyNCwgMzc5NiwgNjg5NiwgLi4uXSkgLT4gW1QjNzRdCisgIE9wIzEzIERFUFRIV0lTRV9DT05WXzJEKFQjNzQsIFQjMjEsIFQjNzZbLTM5NjksIC0xOTEwLCAtMjQyNSwgLTExNCwgNDQ1NiwgLi4uXSkgLT4gCitbVCM3NV0KKyAgT3AjMTQgQ09OVl8yRChUIzc1LCBUIzIyLCBUIzc3Wy0xMzIwMiwgMTM5MjksIC00MzU3LCAxOTQ5MiwgMTk3MSwgLi4uXSkgLT4gW1QjNzhdCisgIE9wIzE1IERFUFRIV0lTRV9DT05WXzJEKFQjNzgsIFQjMjMsIFQjODBbLTYxNjksIC0xMCwgLTI3ODgsIDE0NDIwLCAtNzQ1NywgLi4uXSkgLT4gCitbVCM3OV0KKyAgT3AjMTYgQ09OVl8yRChUIzc5LCBUIzI0LCBUIzgxWzE1NSwgLTMwNzMsIDI5MSwgLTkwMiwgLTk5NDIsIC4uLl0pIC0+IFtUIzgyXQorICBPcCMxNyBERVBUSFdJU0VfQ09OVl8yRChUIzgyLCBUIzI1LCBUIzg0Wy0yMDYzLCAxMDc1NSwgLTEyMDM3LCAtNjQxNywgMjE0NywgLi4uXSkgLT4gCitbVCM4M10KKyAgT3AjMTggQ09OVl8yRChUIzgzLCBUIzI2LCBUIzg1Wy0xODcyLCAtNzU0OSwgMTM5OTQsIDMxOTEsIC02MTQsIC4uLl0pIC0+IFtUIzg2XQorICBPcCMxOSBERVBUSFdJU0VfQ09OVl8yRChUIzg2LCBUIzEsIFQjMzZbLTY0ODUsIDI5NCwgNjg2LCAtNjAxMSwgLTUxOTYsIC4uLl0pIC0+IFtUIzM1XQorICBPcCMyMCBDT05WXzJEKFQjMzUsIFQjMiwgVCMzN1s3MTE2LCA4MDY2LCAxMTc1NSwgMTE2NzQsIDk5ODMsIC4uLl0pIC0+IFtUIzM4XQorICBPcCMyMSBERVBUSFdJU0VfQ09OVl8yRChUIzM4LCBUIzMsIFQjNDBbNzczNSwgNTIzNSwgNDMzNCwgLTY0ODUsIDkzOTcsIC4uLl0pIC0+IFtUIzM5XQorICBPcCMyMiBDT05WXzJEKFQjMzksIFQjNCwgVCM0MVsyOTQ3LCAxMDE1MiwgLTc4NjUsIC01NTQsIC0xMzc2MCwgLi4uXSkgLT4gW1QjNDJdCisgIE9wIzIzIERFUFRIV0lTRV9DT05WXzJEKFQjNDIsIFQjNSwgVCM0NFstNDc1NSwgNzg5OSwgLTQ4OCwgLTI5NTQsIDI5OTAsIC4uLl0pIC0+IFtUIzQzXQorICBPcCMyNCBDT05WXzJEKFQjNDMsIFQjNiwgVCM0NVstNjI2OSwgLTIyNDU4LCAxMzMzMiwgLTE2MzY4LCA0NDM1LCAuLi5dKSAtPiBbVCM0Nl0KKyAgT3AjMjUgREVQVEhXSVNFX0NPTlZfMkQoVCM0NiwgVCM3LCBUIzQ4WzMzMywgLTQ3NDMsIC0zMTAsIC0yNDcxLCA0ODA0LCAuLi5dKSAtPiBbVCM0N10KKyAgT3AjMjYgQ09OVl8yRChUIzQ3LCBUIzgsIFQjNDlbNjY3NywgLTM1OTMsIDM3NTQsIDI2MzE2LCAtNDc2MSwgLi4uXSkgLT4gW1QjNTBdCisgIE9wIzI3IEFWRVJBR0VfUE9PTF8yRChUIzUwKSAtPiBbVCMyN10KKyAgT3AjMjggQ09OVl8yRChUIzI3LCBUIzMwLCBUIzI5WzE2MjY3LCAtMTcwNzldKSAtPiBbVCMyOF0KKyAgT3AjMjkgUkVTSEFQRShUIzI4LCBUIzMyWzEsIDJdKSAtPiBbVCMzMV0KKyAgT3AjMzAgU09GVE1BWChUIzMxKSAtPiBbVCM4N10KK1RlbnNvcnMgb2YgU3ViZ3JhcGgjMAorICBUIzAoTW9iaWxlbmV0VjEvQ29udjJkXzAvd2VpZ2h0cy9yZWFkKSBzaGFwZTpbMSwgMywgMywgOF0sIHR5cGU6SU5UOCBSTyA3MiBieXRlcywgCitidWZmZXI6IDY4LCBkYXRhOlsuLCB5LCAuLCBnLCAuLCAuLi5dCisgIFQjMShNb2JpbGVuZXRWMS9Db252MmRfMTBfZGVwdGh3aXNlL2RlcHRod2lzZV93ZWlnaHRzL3JlYWQpIHNoYXBlOlsxLCAzLCAzLCAxMjhdLCAKK3R5cGU6SU5UOCBSTyAxMTUyIGJ5dGVzLCBidWZmZXI6IDcyLCBkYXRhOltXLCAuLCBkLCAuLCAuLCAuLi5dCisgIFQjMihNb2JpbGVuZXRWMS9Db252MmRfMTBfcG9pbnR3aXNlL3dlaWdodHMvcmVhZCkgc2hhcGU6WzEyOCwgMSwgMSwgMTI4XSwgdHlwZTpJTlQ4IFJPIAorMTYzODQgYnl0ZXMsIGJ1ZmZlcjogMTQsIGRhdGE6Wy4sIC4sIAorLCAuLCAuLCAuLi5dCisgIFQjMyhNb2JpbGVuZXRWMS9Db252MmRfMTFfZGVwdGh3aXNlL2RlcHRod2lzZV93ZWlnaHRzL3JlYWQpIHNoYXBlOlsxLCAzLCAzLCAxMjhdLCAKK3R5cGU6SU5UOCBSTyAxMTUyIGJ5dGVzLCBidWZmZXI6IDEzLCBkYXRhOlsuLCBgLCAuLCA6LCAuLCAuLi5dCisgIFQjNChNb2JpbGVuZXRWMS9Db252MmRfMTFfcG9pbnR3aXNlL3dlaWdodHMvcmVhZCkgc2hhcGU6WzEyOCwgMSwgMSwgMTI4XSwgdHlwZTpJTlQ4IFJPIAorMTYzODQgYnl0ZXMsIGJ1ZmZlcjogMTIsIGRhdGE6Wy4sIC4sIC4sIC4sIC4sIC4uLl0KKyAgVCM1KE1vYmlsZW5ldFYxL0NvbnYyZF8xMl9kZXB0aHdpc2UvZGVwdGh3aXNlX3dlaWdodHMvcmVhZCkgc2hhcGU6WzEsIDMsIDMsIDEyOF0sIAordHlwZTpJTlQ4IFJPIDExNTIgYnl0ZXMsIGJ1ZmZlcjogMTAsIGRhdGE6W3osIC4sIC4sID8sIC4sIC4uLl0KKyAgVCM2KE1vYmlsZW5ldFYxL0NvbnYyZF8xMl9wb2ludHdpc2Uvd2VpZ2h0cy9yZWFkKSBzaGFwZTpbMjU2LCAxLCAxLCAxMjhdLCB0eXBlOklOVDggUk8gCiszMjc2OCBieXRlcywgYnVmZmVyOiA2OSwgZGF0YTpbLywgLiwgLiwgLiwgIywgLi4uXQorICBUIzcoTW9iaWxlbmV0VjEvQ29udjJkXzEzX2RlcHRod2lzZS9kZXB0aHdpc2Vfd2VpZ2h0cy9yZWFkKSBzaGFwZTpbMSwgMywgMywgMjU2XSwgCit0eXBlOklOVDggUk8gMjMwNCBieXRlcywgYnVmZmVyOiA3LCBkYXRhOlsuLCAuLCB3LCAuLCAuLCAuLi5dCisgIFQjOChNb2JpbGVuZXRWMS9Db252MmRfMTNfcG9pbnR3aXNlL3dlaWdodHMvcmVhZCkgc2hhcGU6WzI1NiwgMSwgMSwgMjU2XSwgdHlwZTpJTlQ4IFJPIAorNjU1MzYgYnl0ZXMsIGJ1ZmZlcjogNSwgZGF0YTpbJiwgLiwgLiwgLiwgLiwgLi4uXQorICBUIzkoTW9iaWxlbmV0VjEvQ29udjJkXzFfZGVwdGh3aXNlL2RlcHRod2lzZV93ZWlnaHRzL3JlYWQpIHNoYXBlOlsxLCAzLCAzLCA4XSwgCit0eXBlOklOVDggUk8gNzIgYnl0ZXMsIGJ1ZmZlcjogNjAsIGRhdGE6Wy4sIC4sIC4sIC4sIC4sIC4uLl0KKyAgVCMxMChNb2JpbGVuZXRWMS9Db252MmRfMV9wb2ludHdpc2Uvd2VpZ2h0cy9yZWFkKSBzaGFwZTpbMTYsIDEsIDEsIDhdLCB0eXBlOklOVDggUk8gMTI4IAorYnl0ZXMsIGJ1ZmZlcjogNjMsIGRhdGE6Wy4sIC4sIC4sIC4sIC4sIC4uLl0KKyAgVCMxMShNb2JpbGVuZXRWMS9Db252MmRfMl9kZXB0aHdpc2UvZGVwdGh3aXNlX3dlaWdodHMvcmVhZCkgc2hhcGU6WzEsIDMsIDMsIDE2XSwgCit0eXBlOklOVDggUk8gMTQ0IGJ5dGVzLCBidWZmZXI6IDU4LCBkYXRhOltPLCAqLCAuLCAhLCAuLCAuLi5dCisgIFQjMTIoTW9iaWxlbmV0VjEvQ29udjJkXzJfcG9pbnR3aXNlL3dlaWdodHMvcmVhZCkgc2hhcGU6WzMyLCAxLCAxLCAxNl0sIHR5cGU6SU5UOCBSTyAKKzUxMiBieXRlcywgYnVmZmVyOiA2MSwgZGF0YTpbLiwgNCwgLiwgLiwgOCwgLi4uXQorICBUIzEzKE1vYmlsZW5ldFYxL0NvbnYyZF8zX2RlcHRod2lzZS9kZXB0aHdpc2Vfd2VpZ2h0cy9yZWFkKSBzaGFwZTpbMSwgMywgMywgMzJdLCAKK3R5cGU6SU5UOCBSTyAyODggYnl0ZXMsIGJ1ZmZlcjogMzUsIGRhdGE6Wy4sIDEsIDssIE0sIC4sIC4uLl0KKyAgVCMxNChNb2JpbGVuZXRWMS9Db252MmRfM19wb2ludHdpc2Uvd2VpZ2h0cy9yZWFkKSBzaGFwZTpbMzIsIDEsIDEsIDMyXSwgdHlwZTpJTlQ4IFJPIAorMTAyNCBieXRlcywgYnVmZmVyOiAzMywgZGF0YTpbLiwgLiwgLiwgLiwgLiwgLi4uXQorICBUIzE1KE1vYmlsZW5ldFYxL0NvbnYyZF80X2RlcHRod2lzZS9kZXB0aHdpc2Vfd2VpZ2h0cy9yZWFkKSBzaGFwZTpbMSwgMywgMywgMzJdLCAKK3R5cGU6SU5UOCBSTyAyODggYnl0ZXMsIGJ1ZmZlcjogMzIsIGRhdGE6Wy4sIDssIC4sIC4sIC4sIC4uLl0KKyAgVCMxNihNb2JpbGVuZXRWMS9Db252MmRfNF9wb2ludHdpc2Uvd2VpZ2h0cy9yZWFkKSBzaGFwZTpbNjQsIDEsIDEsIDMyXSwgdHlwZTpJTlQ4IFJPIAorMjA0OCBieXRlcywgYnVmZmVyOiAzMCwgZGF0YTpbLiwgLiwgLiwgNSwgLiwgLi4uXQorICBUIzE3KE1vYmlsZW5ldFYxL0NvbnYyZF81X2RlcHRod2lzZS9kZXB0aHdpc2Vfd2VpZ2h0cy9yZWFkKSBzaGFwZTpbMSwgMywgMywgNjRdLCAKK3R5cGU6SU5UOCBSTyA1NzYgYnl0ZXMsIGJ1ZmZlcjogNzcsIGRhdGE6W0csIC4sIC4sIC4sIC4sIC4uLl0KKyAgVCMxOChNb2JpbGVuZXRWMS9Db252MmRfNV9wb2ludHdpc2Uvd2VpZ2h0cy9yZWFkKSBzaGFwZTpbNjQsIDEsIDEsIDY0XSwgdHlwZTpJTlQ4IFJPIAorNDA5NiBieXRlcywgYnVmZmVyOiAyOCwgZGF0YTpbLiwgMiwgLiwgJCwgLiwgLi4uXQorICBUIzE5KE1vYmlsZW5ldFYxL0NvbnYyZF82X2RlcHRod2lzZS9kZXB0aHdpc2Vfd2VpZ2h0cy9yZWFkKSBzaGFwZTpbMSwgMywgMywgNjRdLCAKK3R5cGU6SU5UOCBSTyA1NzYgYnl0ZXMsIGJ1ZmZlcjogMjcsIGRhdGE6Wy4sIDEsIHosIC4sIFUsIC4uLl0KKyAgVCMyMChNb2JpbGVuZXRWMS9Db252MmRfNl9wb2ludHdpc2Uvd2VpZ2h0cy9yZWFkKSBzaGFwZTpbMTI4LCAxLCAxLCA2NF0sIHR5cGU6SU5UOCBSTyAKKzgxOTIgYnl0ZXMsIGJ1ZmZlcjogMjUsIGRhdGE6WzUsIC4sIC4sIC4sIFYsIC4uLl0KKyAgVCMyMShNb2JpbGVuZXRWMS9Db252MmRfN19kZXB0aHdpc2UvZGVwdGh3aXNlX3dlaWdodHMvcmVhZCkgc2hhcGU6WzEsIDMsIDMsIDEyOF0sIAordHlwZTpJTlQ4IFJPIDExNTIgYnl0ZXMsIGJ1ZmZlcjogMjMsIGRhdGE6Wy4sIC4sIC4sIC4sIC4sIC4uLl0KKyAgVCMyMihNb2JpbGVuZXRWMS9Db252MmRfN19wb2ludHdpc2Uvd2VpZ2h0cy9yZWFkKSBzaGFwZTpbMTI4LCAxLCAxLCAxMjhdLCB0eXBlOklOVDggUk8gCisxNjM4NCBieXRlcywgYnVmZmVyOiAyMSwgZGF0YTpbLiwgLiwgLiwgLiwgLiwgLi4uXQorICBUIzIzKE1vYmlsZW5ldFYxL0NvbnYyZF84X2RlcHRod2lzZS9kZXB0aHdpc2Vfd2VpZ2h0cy9yZWFkKSBzaGFwZTpbMSwgMywgMywgMTI4XSwgCit0eXBlOklOVDggUk8gMTE1MiBieXRlcywgYnVmZmVyOiA3MSwgZGF0YTpbLiwgLiwgLiwgLiwgUSwgLi4uXQorICBUIzI0KE1vYmlsZW5ldFYxL0NvbnYyZF84X3BvaW50d2lzZS93ZWlnaHRzL3JlYWQpIHNoYXBlOlsxMjgsIDEsIDEsIDEyOF0sIHR5cGU6SU5UOCBSTyAKKzE2Mzg0IGJ5dGVzLCBidWZmZXI6IDIwLCBkYXRhOltALCAuLCAyLCAuLCA4LCAuLi5dCisgIFQjMjUoTW9iaWxlbmV0VjEvQ29udjJkXzlfZGVwdGh3aXNlL2RlcHRod2lzZV93ZWlnaHRzL3JlYWQpIHNoYXBlOlsxLCAzLCAzLCAxMjhdLCAKK3R5cGU6SU5UOCBSTyAxMTUyIGJ5dGVzLCBidWZmZXI6IDgwLCBkYXRhOlteLCAuLCB+LCAuLCAuLCAuLi5dCisgIFQjMjYoTW9iaWxlbmV0VjEvQ29udjJkXzlfcG9pbnR3aXNlL3dlaWdodHMvcmVhZCkgc2hhcGU6WzEyOCwgMSwgMSwgMTI4XSwgdHlwZTpJTlQ4IFJPIAorMTYzODQgYnl0ZXMsIGJ1ZmZlcjogMTYsIGRhdGE6Wy4sIC4sICAsIC4sICUsIC4uLl0KKyAgVCMyNyhNb2JpbGVuZXRWMS9Mb2dpdHMvQXZnUG9vbF8xYS9BdmdQb29sKSBzaGFwZTpbMSwgMSwgMSwgMjU2XSwgdHlwZTpJTlQ4CisgIFQjMjgoTW9iaWxlbmV0VjEvTG9naXRzL0NvbnYyZF8xY18xeDEvQmlhc0FkZCkgc2hhcGU6WzEsIDEsIDEsIDJdLCB0eXBlOklOVDgKKyAgVCMyOShNb2JpbGVuZXRWMS9Mb2dpdHMvQ29udjJkXzFjXzF4MS9Db252MkRfYmlhcykgc2hhcGU6WzJdLCB0eXBlOklOVDMyIFJPIDggYnl0ZXMsIAorYnVmZmVyOiAyLCBkYXRhOlsxNjI2NywgLTE3MDc5XQorICBUIzMwKE1vYmlsZW5ldFYxL0xvZ2l0cy9Db252MmRfMWNfMXgxL3dlaWdodHMvcmVhZCkgc2hhcGU6WzIsIDEsIDEsIDI1Nl0sIHR5cGU6SU5UOCBSTyAKKzUxMiBieXRlcywgYnVmZmVyOiAzLCBkYXRhOlsuLCAlLCAuLCAuLCAuLCAuLi5dCisgIFQjMzEoTW9iaWxlbmV0VjEvTG9naXRzL1NwYXRpYWxTcXVlZXplKSBzaGFwZTpbMSwgMl0sIHR5cGU6SU5UOAorICBUIzMyKE1vYmlsZW5ldFYxL0xvZ2l0cy9TcGF0aWFsU3F1ZWV6ZV9zaGFwZSkgc2hhcGU6WzJdLCB0eXBlOklOVDMyIFJPIDggYnl0ZXMsIGJ1ZmZlcjogCisxLCBkYXRhOlsxLCAyXQorICBUIzMzKE1vYmlsZW5ldFYxL01vYmlsZW5ldFYxL0NvbnYyZF8wL0NvbnYyRF9iaWFzKSBzaGFwZTpbOF0sIHR5cGU6SU5UMzIgUk8gMzIgYnl0ZXMsIAorYnVmZmVyOiA4MiwgZGF0YTpbMzc3NCwgLTEwNywgLTg0Mzk0LCAtMTM5MDgsIDIwNjk3LCAuLi5dCisgIFQjMzQoTW9iaWxlbmV0VjEvTW9iaWxlbmV0VjEvQ29udjJkXzAvUmVsdTYpIHNoYXBlOlsxLCA0OCwgNDgsIDhdLCB0eXBlOklOVDgKKyAgVCMzNShNb2JpbGVuZXRWMS9Nb2JpbGVuZXRWMS9Db252MmRfMTBfZGVwdGh3aXNlL1JlbHU2KSBzaGFwZTpbMSwgNiwgNiwgMTI4XSwgdHlwZTpJTlQ4CisgIFQjMzYoTW9iaWxlbmV0VjEvTW9iaWxlbmV0VjEvQ29udjJkXzEwX2RlcHRod2lzZS9kZXB0aHdpc2VfYmlhcykgc2hhcGU6WzEyOF0sIAordHlwZTpJTlQzMiBSTyA1MTIgYnl0ZXMsIGJ1ZmZlcjogMjIsIGRhdGE6Wy02NDg1LCAyOTQsIDY4NiwgLTYwMTEsIC01MTk2LCAuLi5dCisgIFQjMzcoTW9iaWxlbmV0VjEvTW9iaWxlbmV0VjEvQ29udjJkXzEwX3BvaW50d2lzZS9Db252MkRfYmlhcykgc2hhcGU6WzEyOF0sIHR5cGU6SU5UMzIgCitSTyA1MTIgYnl0ZXMsIGJ1ZmZlcjogNzAsIGRhdGE6WzcxMTYsIDgwNjYsIDExNzU1LCAxMTY3NCwgOTk4MywgLi4uXQorICBUIzM4KE1vYmlsZW5ldFYxL01vYmlsZW5ldFYxL0NvbnYyZF8xMF9wb2ludHdpc2UvUmVsdTYpIHNoYXBlOlsxLCA2LCA2LCAxMjhdLCB0eXBlOklOVDgKKyAgVCMzOShNb2JpbGVuZXRWMS9Nb2JpbGVuZXRWMS9Db252MmRfMTFfZGVwdGh3aXNlL1JlbHU2KSBzaGFwZTpbMSwgNiwgNiwgMTI4XSwgdHlwZTpJTlQ4CisgIFQjNDAoTW9iaWxlbmV0VjEvTW9iaWxlbmV0VjEvQ29udjJkXzExX2RlcHRod2lzZS9kZXB0aHdpc2VfYmlhcykgc2hhcGU6WzEyOF0sIAordHlwZTpJTlQzMiBSTyA1MTIgYnl0ZXMsIGJ1ZmZlcjogMTksIGRhdGE6Wzc3MzUsIDUyMzUsIDQzMzQsIC02NDg1LCA5Mzk3LCAuLi5dCisgIFQjNDEoTW9iaWxlbmV0VjEvTW9iaWxlbmV0VjEvQ29udjJkXzExX3BvaW50d2lzZS9Db252MkRfYmlhcykgc2hhcGU6WzEyOF0sIHR5cGU6SU5UMzIgCitSTyA1MTIgYnl0ZXMsIGJ1ZmZlcjogMTEsIGRhdGE6WzI5NDcsIDEwMTUyLCAtNzg2NSwgLTU1NCwgLTEzNzYwLCAuLi5dCisgIFQjNDIoTW9iaWxlbmV0VjEvTW9iaWxlbmV0VjEvQ29udjJkXzExX3BvaW50d2lzZS9SZWx1Nikgc2hhcGU6WzEsIDYsIDYsIDEyOF0sIHR5cGU6SU5UOAorICBUIzQzKE1vYmlsZW5ldFYxL01vYmlsZW5ldFYxL0NvbnYyZF8xMl9kZXB0aHdpc2UvUmVsdTYpIHNoYXBlOlsxLCAzLCAzLCAxMjhdLCB0eXBlOklOVDgKKyAgVCM0NChNb2JpbGVuZXRWMS9Nb2JpbGVuZXRWMS9Db252MmRfMTJfZGVwdGh3aXNlL2RlcHRod2lzZV9iaWFzKSBzaGFwZTpbMTI4XSwgCit0eXBlOklOVDMyIFJPIDUxMiBieXRlcywgYnVmZmVyOiA5LCBkYXRhOlstNDc1NSwgNzg5OSwgLTQ4OCwgLTI5NTQsIDI5OTAsIC4uLl0KKyAgVCM0NShNb2JpbGVuZXRWMS9Nb2JpbGVuZXRWMS9Db252MmRfMTJfcG9pbnR3aXNlL0NvbnYyRF9iaWFzKSBzaGFwZTpbMjU2XSwgdHlwZTpJTlQzMiAKK1JPIDEwMjQgYnl0ZXMsIGJ1ZmZlcjogOCwgZGF0YTpbLTYyNjksIC0yMjQ1OCwgMTMzMzIsIC0xNjM2OCwgNDQzNSwgLi4uXQorICBUIzQ2KE1vYmlsZW5ldFYxL01vYmlsZW5ldFYxL0NvbnYyZF8xMl9wb2ludHdpc2UvUmVsdTYpIHNoYXBlOlsxLCAzLCAzLCAyNTZdLCB0eXBlOklOVDgKKyAgVCM0NyhNb2JpbGVuZXRWMS9Nb2JpbGVuZXRWMS9Db252MmRfMTNfZGVwdGh3aXNlL1JlbHU2KSBzaGFwZTpbMSwgMywgMywgMjU2XSwgdHlwZTpJTlQ4CisgIFQjNDgoTW9iaWxlbmV0VjEvTW9iaWxlbmV0VjEvQ29udjJkXzEzX2RlcHRod2lzZS9kZXB0aHdpc2VfYmlhcykgc2hhcGU6WzI1Nl0sIAordHlwZTpJTlQzMiBSTyAxMDI0IGJ5dGVzLCBidWZmZXI6IDYsIGRhdGE6WzMzMywgLTQ3NDMsIC0zMTAsIC0yNDcxLCA0ODA0LCAuLi5dCisgIFQjNDkoTW9iaWxlbmV0VjEvTW9iaWxlbmV0VjEvQ29udjJkXzEzX3BvaW50d2lzZS9Db252MkRfYmlhcykgc2hhcGU6WzI1Nl0sIHR5cGU6SU5UMzIgCitSTyAxMDI0IGJ5dGVzLCBidWZmZXI6IDQsIGRhdGE6WzY2NzcsIC0zNTkzLCAzNzU0LCAyNjMxNiwgLTQ3NjEsIC4uLl0KKyAgVCM1MChNb2JpbGVuZXRWMS9Nb2JpbGVuZXRWMS9Db252MmRfMTNfcG9pbnR3aXNlL1JlbHU2KSBzaGFwZTpbMSwgMywgMywgMjU2XSwgdHlwZTpJTlQ4CisgIFQjNTEoTW9iaWxlbmV0VjEvTW9iaWxlbmV0VjEvQ29udjJkXzFfZGVwdGh3aXNlL1JlbHU2KSBzaGFwZTpbMSwgNDgsIDQ4LCA4XSwgdHlwZTpJTlQ4CisgIFQjNTIoTW9iaWxlbmV0VjEvTW9iaWxlbmV0VjEvQ29udjJkXzFfZGVwdGh3aXNlL2RlcHRod2lzZV9iaWFzKSBzaGFwZTpbOF0sIHR5cGU6SU5UMzIgCitSTyAzMiBieXRlcywgYnVmZmVyOiA1NiwgZGF0YTpbMzExMzIsIDI4LCAyNzMsIC0yNjkyLCA3NDA5LCAuLi5dCisgIFQjNTMoTW9iaWxlbmV0VjEvTW9iaWxlbmV0VjEvQ29udjJkXzFfcG9pbnR3aXNlL0NvbnYyRF9iaWFzKSBzaGFwZTpbMTZdLCB0eXBlOklOVDMyIFJPIAorNjQgYnl0ZXMsIGJ1ZmZlcjogMzYsIGRhdGE6WzEwMDY0LCAxMTMwLCAtMTMwNTYsIC0zMDI4NCwgLTIzMzQ5LCAuLi5dCisgIFQjNTQoTW9iaWxlbmV0VjEvTW9iaWxlbmV0VjEvQ29udjJkXzFfcG9pbnR3aXNlL1JlbHU2KSBzaGFwZTpbMSwgNDgsIDQ4LCAxNl0sIHR5cGU6SU5UOAorICBUIzU1KE1vYmlsZW5ldFYxL01vYmlsZW5ldFYxL0NvbnYyZF8yX2RlcHRod2lzZS9SZWx1Nikgc2hhcGU6WzEsIDI0LCAyNCwgMTZdLCB0eXBlOklOVDgKKyAgVCM1NihNb2JpbGVuZXRWMS9Nb2JpbGVuZXRWMS9Db252MmRfMl9kZXB0aHdpc2UvZGVwdGh3aXNlX2JpYXMpIHNoYXBlOlsxNl0sIHR5cGU6SU5UMzIgCitSTyA2NCBieXRlcywgYnVmZmVyOiA0OCwgZGF0YTpbMzA2LCAtMTU4LCAxOTE4MSwgLTM2NCwgNjIzNywgLi4uXQorICBUIzU3KE1vYmlsZW5ldFYxL01vYmlsZW5ldFYxL0NvbnYyZF8yX3BvaW50d2lzZS9Db252MkRfYmlhcykgc2hhcGU6WzMyXSwgdHlwZTpJTlQzMiBSTyAKKzEyOCBieXRlcywgYnVmZmVyOiA2MiwgZGF0YTpbLTc2NDksIDEyMjg3LCAtNDQzMywgNTg1MSwgLTE4OCwgLi4uXQorICBUIzU4KE1vYmlsZW5ldFYxL01vYmlsZW5ldFYxL0NvbnYyZF8yX3BvaW50d2lzZS9SZWx1Nikgc2hhcGU6WzEsIDI0LCAyNCwgMzJdLCB0eXBlOklOVDgKKyAgVCM1OShNb2JpbGVuZXRWMS9Nb2JpbGVuZXRWMS9Db252MmRfM19kZXB0aHdpc2UvUmVsdTYpIHNoYXBlOlsxLCAyNCwgMjQsIDMyXSwgdHlwZTpJTlQ4CisgIFQjNjAoTW9iaWxlbmV0VjEvTW9iaWxlbmV0VjEvQ29udjJkXzNfZGVwdGh3aXNlL2RlcHRod2lzZV9iaWFzKSBzaGFwZTpbMzJdLCB0eXBlOklOVDMyIAorUk8gMTI4IGJ5dGVzLCBidWZmZXI6IDM0LCBkYXRhOls3Mjk3LCAtNDk4LCAyNjMsIC0xOTc1LCAyMjYwLCAuLi5dCisgIFQjNjEoTW9iaWxlbmV0VjEvTW9iaWxlbmV0VjEvQ29udjJkXzNfcG9pbnR3aXNlL0NvbnYyRF9iaWFzKSBzaGFwZTpbMzJdLCB0eXBlOklOVDMyIFJPIAorMTI4IGJ5dGVzLCBidWZmZXI6IDU5LCBkYXRhOlstNDc0MiwgLTQxNjAsIDY5ODUsIDg2NDcsIDI5NzczLCAuLi5dCisgIFQjNjIoTW9iaWxlbmV0VjEvTW9iaWxlbmV0VjEvQ29udjJkXzNfcG9pbnR3aXNlL1JlbHU2KSBzaGFwZTpbMSwgMjQsIDI0LCAzMl0sIHR5cGU6SU5UOAorICBUIzYzKE1vYmlsZW5ldFYxL01vYmlsZW5ldFYxL0NvbnYyZF80X2RlcHRod2lzZS9SZWx1Nikgc2hhcGU6WzEsIDEyLCAxMiwgMzJdLCB0eXBlOklOVDgKKyAgVCM2NChNb2JpbGVuZXRWMS9Nb2JpbGVuZXRWMS9Db252MmRfNF9kZXB0aHdpc2UvZGVwdGh3aXNlX2JpYXMpIHNoYXBlOlszMl0sIHR5cGU6SU5UMzIgCitSTyAxMjggYnl0ZXMsIGJ1ZmZlcjogMzEsIGRhdGE6WzI4NTg4LCAzNjMsIDI3NTkyLCAyMjI5NCwgLTQzNDQsIC4uLl0KKyAgVCM2NShNb2JpbGVuZXRWMS9Nb2JpbGVuZXRWMS9Db252MmRfNF9wb2ludHdpc2UvQ29udjJEX2JpYXMpIHNoYXBlOls2NF0sIHR5cGU6SU5UMzIgUk8gCisyNTYgYnl0ZXMsIGJ1ZmZlcjogNzYsIGRhdGE6WzEyNjgzLCAzNjU4MSwgNjIwNiwgMTIzNiwgMTU4MzQsIC4uLl0KKyAgVCM2NihNb2JpbGVuZXRWMS9Nb2JpbGVuZXRWMS9Db252MmRfNF9wb2ludHdpc2UvUmVsdTYpIHNoYXBlOlsxLCAxMiwgMTIsIDY0XSwgdHlwZTpJTlQ4CisgIFQjNjcoTW9iaWxlbmV0VjEvTW9iaWxlbmV0VjEvQ29udjJkXzVfZGVwdGh3aXNlL1JlbHU2KSBzaGFwZTpbMSwgMTIsIDEyLCA2NF0sIHR5cGU6SU5UOAorICBUIzY4KE1vYmlsZW5ldFYxL01vYmlsZW5ldFYxL0NvbnYyZF81X2RlcHRod2lzZS9kZXB0aHdpc2VfYmlhcykgc2hhcGU6WzY0XSwgdHlwZTpJTlQzMiAKK1JPIDI1NiBieXRlcywgYnVmZmVyOiAyOSwgZGF0YTpbLTYzNTMsIDkwOTAsIC0zMCwgLTEwMTksIC00OTYsIC4uLl0KKyAgVCM2OShNb2JpbGVuZXRWMS9Nb2JpbGVuZXRWMS9Db252MmRfNV9wb2ludHdpc2UvQ29udjJEX2JpYXMpIHNoYXBlOls2NF0sIHR5cGU6SU5UMzIgUk8gCisyNTYgYnl0ZXMsIGJ1ZmZlcjogODQsIGRhdGE6WzM4OTUsIC02NTYzLCAtODg0MywgLTIwNjYsIC0xMzcyLCAuLi5dCisgIFQjNzAoTW9iaWxlbmV0VjEvTW9iaWxlbmV0VjEvQ29udjJkXzVfcG9pbnR3aXNlL1JlbHU2KSBzaGFwZTpbMSwgMTIsIDEyLCA2NF0sIHR5cGU6SU5UOAorICBUIzcxKE1vYmlsZW5ldFYxL01vYmlsZW5ldFYxL0NvbnYyZF82X2RlcHRod2lzZS9SZWx1Nikgc2hhcGU6WzEsIDYsIDYsIDY0XSwgdHlwZTpJTlQ4CisgIFQjNzIoTW9iaWxlbmV0VjEvTW9iaWxlbmV0VjEvQ29udjJkXzZfZGVwdGh3aXNlL2RlcHRod2lzZV9iaWFzKSBzaGFwZTpbNjRdLCB0eXBlOklOVDMyIAorUk8gMjU2IGJ5dGVzLCBidWZmZXI6IDI2LCBkYXRhOlsyMDQzNywgLTM2NSwgLTI1MTgsIDIwODI3LCAtOTA0LCAuLi5dCisgIFQjNzMoTW9iaWxlbmV0VjEvTW9iaWxlbmV0VjEvQ29udjJkXzZfcG9pbnR3aXNlL0NvbnYyRF9iaWFzKSBzaGFwZTpbMTI4XSwgdHlwZTpJTlQzMiBSTyAKKzUxMiBieXRlcywgYnVmZmVyOiAyNCwgZGF0YTpbLTEwMTIwLCA5NzY4LCAzNTI0LCAzNzk2LCA2ODk2LCAuLi5dCisgIFQjNzQoTW9iaWxlbmV0VjEvTW9iaWxlbmV0VjEvQ29udjJkXzZfcG9pbnR3aXNlL1JlbHU2KSBzaGFwZTpbMSwgNiwgNiwgMTI4XSwgdHlwZTpJTlQ4CisgIFQjNzUoTW9iaWxlbmV0VjEvTW9iaWxlbmV0VjEvQ29udjJkXzdfZGVwdGh3aXNlL1JlbHU2KSBzaGFwZTpbMSwgNiwgNiwgMTI4XSwgdHlwZTpJTlQ4CisgIFQjNzYoTW9iaWxlbmV0VjEvTW9iaWxlbmV0VjEvQ29udjJkXzdfZGVwdGh3aXNlL2RlcHRod2lzZV9iaWFzKSBzaGFwZTpbMTI4XSwgdHlwZTpJTlQzMiAKK1JPIDUxMiBieXRlcywgYnVmZmVyOiA3OCwgZGF0YTpbLTM5NjksIC0xOTEwLCAtMjQyNSwgLTExNCwgNDQ1NiwgLi4uXQorICBUIzc3KE1vYmlsZW5ldFYxL01vYmlsZW5ldFYxL0NvbnYyZF83X3BvaW50d2lzZS9Db252MkRfYmlhcykgc2hhcGU6WzEyOF0sIHR5cGU6SU5UMzIgUk8gCis1MTIgYnl0ZXMsIGJ1ZmZlcjogODMsIGRhdGE6Wy0xMzIwMiwgMTM5MjksIC00MzU3LCAxOTQ5MiwgMTk3MSwgLi4uXQorICBUIzc4KE1vYmlsZW5ldFYxL01vYmlsZW5ldFYxL0NvbnYyZF83X3BvaW50d2lzZS9SZWx1Nikgc2hhcGU6WzEsIDYsIDYsIDEyOF0sIHR5cGU6SU5UOAorICBUIzc5KE1vYmlsZW5ldFYxL01vYmlsZW5ldFYxL0NvbnYyZF84X2RlcHRod2lzZS9SZWx1Nikgc2hhcGU6WzEsIDYsIDYsIDEyOF0sIHR5cGU6SU5UOAorICBUIzgwKE1vYmlsZW5ldFYxL01vYmlsZW5ldFYxL0NvbnYyZF84X2RlcHRod2lzZS9kZXB0aHdpc2VfYmlhcykgc2hhcGU6WzEyOF0sIHR5cGU6SU5UMzIgCitSTyA1MTIgYnl0ZXMsIGJ1ZmZlcjogNTUsIGRhdGE6Wy02MTY5LCAtMTAsIC0yNzg4LCAxNDQyMCwgLTc0NTcsIC4uLl0KKyAgVCM4MShNb2JpbGVuZXRWMS9Nb2JpbGVuZXRWMS9Db252MmRfOF9wb2ludHdpc2UvQ29udjJEX2JpYXMpIHNoYXBlOlsxMjhdLCB0eXBlOklOVDMyIFJPIAorNTEyIGJ5dGVzLCBidWZmZXI6IDE4LCBkYXRhOlsxNTUsIC0zMDczLCAyOTEsIC05MDIsIC05OTQyLCAuLi5dCisgIFQjODIoTW9iaWxlbmV0VjEvTW9iaWxlbmV0VjEvQ29udjJkXzhfcG9pbnR3aXNlL1JlbHU2KSBzaGFwZTpbMSwgNiwgNiwgMTI4XSwgdHlwZTpJTlQ4CisgIFQjODMoTW9iaWxlbmV0VjEvTW9iaWxlbmV0VjEvQ29udjJkXzlfZGVwdGh3aXNlL1JlbHU2KSBzaGFwZTpbMSwgNiwgNiwgMTI4XSwgdHlwZTpJTlQ4CisgIFQjODQoTW9iaWxlbmV0VjEvTW9iaWxlbmV0VjEvQ29udjJkXzlfZGVwdGh3aXNlL2RlcHRod2lzZV9iaWFzKSBzaGFwZTpbMTI4XSwgdHlwZTpJTlQzMiAKK1JPIDUxMiBieXRlcywgYnVmZmVyOiAxNywgZGF0YTpbLTIwNjMsIDEwNzU1LCAtMTIwMzcsIC02NDE3LCAyMTQ3LCAuLi5dCisgIFQjODUoTW9iaWxlbmV0VjEvTW9iaWxlbmV0VjEvQ29udjJkXzlfcG9pbnR3aXNlL0NvbnYyRF9iaWFzKSBzaGFwZTpbMTI4XSwgdHlwZTpJTlQzMiBSTyAKKzUxMiBieXRlcywgYnVmZmVyOiAxNSwgZGF0YTpbLTE4NzIsIC03NTQ5LCAxMzk5NCwgMzE5MSwgLTYxNCwgLi4uXQorICBUIzg2KE1vYmlsZW5ldFYxL01vYmlsZW5ldFYxL0NvbnYyZF85X3BvaW50d2lzZS9SZWx1Nikgc2hhcGU6WzEsIDYsIDYsIDEyOF0sIHR5cGU6SU5UOAorICBUIzg3KE1vYmlsZW5ldFYxL1ByZWRpY3Rpb25zL1Jlc2hhcGVfMSkgc2hhcGU6WzEsIDJdLCB0eXBlOklOVDgKKyAgVCM4OChpbnB1dCkgc2hhcGU6WzEsIDk2LCA5NiwgMV0sIHR5cGU6SU5UOAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgIE1vZGVsIHNpemU6ICAgICAzMDA1NjggYnl0ZXMKKyAgICBOb24tZGF0YSBidWZmZXIgc2l6ZTogICAgICA4MTY0MCBieXRlcyAoMjcuMTYgJSkKKyAgVG90YWwgZGF0YSBidWZmZXIgc2l6ZTogICAgIDIxODkyOCBieXRlcyAoNzIuODQgJSkKKyAgICAoWmVybyB2YWx1ZSBidWZmZXJzKTogICAgICAgICAgMCBieXRlcyAoMDAuMDAgJSkKKyogQnVmZmVycyBvZiBURkxpdGUgbW9kZWwgYXJlIG1vc3RseSB1c2VkIGZvciBjb25zdGFudCB0ZW5zb3JzLgorICBBbmQgemVybyB2YWx1ZSBidWZmZXJzIGFyZSBidWZmZXJzIGZpbGxlZCB3aXRoIHplcm9zLgorICBOb24tZGF0YSBidWZmZXJzIGFyZWEgYXJlIHVzZWQgdG8gc3RvcmUgb3BlcmF0b3JzLCBzdWJncmFwaHMgYW5kIGV0Yy4KKyAgWW91IGNhbiBmaW5kIG1vcmUgZGV0YWlscyBmcm9tIAoraHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9ibG9iL21hc3Rlci90ZW5zb3JmbG93L2xpdGUvc2NoZW1hL3NjaGVtYS5mYnMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCitUZmxpdGVHZXRNb2RlbCB0b29rIDQgdGlja3MgKDAgbXMpLgorCitERVBUSFdJU0VfQ09OVl8yRCB0b29rIDIyNDYyMiB0aWNrcyAoOCBtcykuCitERVBUSFdJU0VfQ09OVl8yRCB0b29rIDE3NTkxNyB0aWNrcyAoNyBtcykuCitDT05WXzJEIHRvb2sgMjQ5NTYwIHRpY2tzICg5IG1zKS4KK0RFUFRIV0lTRV9DT05WXzJEIHRvb2sgODQ5NTggdGlja3MgKDMgbXMpLgorQ09OVl8yRCB0b29rIDE0NTgxNyB0aWNrcyAoNSBtcykuCitERVBUSFdJU0VfQ09OVl8yRCB0b29rIDE2NDkxNSB0aWNrcyAoNiBtcykuCitDT05WXzJEIHRvb2sgMTk3MjgzIHRpY2tzICg3IG1zKS4KK0RFUFRIV0lTRV9DT05WXzJEIHRvb2sgNDEzMDQgdGlja3MgKDEgbXMpLgorQ09OVl8yRCB0b29rIDk5NDcyIHRpY2tzICgzIG1zKS4KK0RFUFRIV0lTRV9DT05WXzJEIHRvb2sgNzk5NjkgdGlja3MgKDMgbXMpLgorQ09OVl8yRCB0b29rIDE1MTUwNSB0aWNrcyAoNiBtcykuCitERVBUSFdJU0VfQ09OVl8yRCB0b29rIDIwMDUzIHRpY2tzICgwIG1zKS4KK0NPTlZfMkQgdG9vayA3ODUyMSB0aWNrcyAoMyBtcykuCitERVBUSFdJU0VfQ09OVl8yRCB0b29rIDM4MTI3IHRpY2tzICgxIG1zKS4KK0NPTlZfMkQgdG9vayAxMzI4NjIgdGlja3MgKDUgbXMpLgorREVQVEhXSVNFX0NPTlZfMkQgdG9vayAzODEyNyB0aWNrcyAoMSBtcykuCitDT05WXzJEIHRvb2sgMTMyODY1IHRpY2tzICg1IG1zKS4KK0RFUFRIV0lTRV9DT05WXzJEIHRvb2sgMzgxMjcgdGlja3MgKDEgbXMpLgorQ09OVl8yRCB0b29rIDEzMjg1OSB0aWNrcyAoNSBtcykuCitERVBUSFdJU0VfQ09OVl8yRCB0b29rIDM4MTI3IHRpY2tzICgxIG1zKS4KK0NPTlZfMkQgdG9vayAxMzI4NTEgdGlja3MgKDUgbXMpLgorREVQVEhXSVNFX0NPTlZfMkQgdG9vayAzODEyNyB0aWNrcyAoMSBtcykuCitDT05WXzJEIHRvb2sgMTMyODUzIHRpY2tzICg1IG1zKS4KK0RFUFRIV0lTRV9DT05WXzJEIHRvb2sgOTU4NSB0aWNrcyAoMCBtcykuCitDT05WXzJEIHRvb2sgNzg0NzAgdGlja3MgKDMgbXMpLgorREVQVEhXSVNFX0NPTlZfMkQgdG9vayAxNzQ3MyB0aWNrcyAoMCBtcykuCitDT05WXzJEIHRvb2sgMTQzNjE1IHRpY2tzICg1IG1zKS4KK0FWRVJBR0VfUE9PTF8yRCB0b29rIDIyMjkgdGlja3MgKDAgbXMpLgorQ09OVl8yRCB0b29rIDM4NiB0aWNrcyAoMCBtcykuCitSRVNIQVBFIHRvb2sgMjggdGlja3MgKDAgbXMpLgorU09GVE1BWCB0b29rIDE2MyB0aWNrcyAoMCBtcykuCisKKyJVbmlxdWUgVGFnIiwiVG90YWwgdGlja3MgYWNyb3NzIGFsbCBldmVudHMgd2l0aCB0aGF0IHRhZy4iCitERVBUSFdJU0VfQ09OVl8yRCwgMTAwOTQzMQorQ09OVl8yRCwgMTgwODkxOQorQVZFUkFHRV9QT09MXzJELCAyMjI5CitSRVNIQVBFLCAyOAorU09GVE1BWCwgMTYzCisidG90YWwgbnVtYmVyIG9mIHRpY2tzIiwgMjgyMDc3MAorCitbWyBUYWJsZSBdXTogQXJlbmEKKyAgICAgICAgQXJlbmEgICBCeXRlcyAgICUgQXJlbmEKKyAgICAgICAgVG90YWwgfCA4NDQzNiB8ICAgMTAwLjAwCitOb25QZXJzaXN0ZW50IHwgNTUyOTYgfCAgICA2NS40OQorICAgUGVyc2lzdGVudCB8IDI5MTQwIHwgICAgMzQuNTEKKworW1sgVGFibGUgXV06IEFsbG9jYXRpb25zCisgICAgICAgICAgICAgICAgICBBbGxvY2F0aW9uICAgSWQgICAgVXNlZCAgIFJlcXVlc3RlZCAgIENvdW50ICAgJSBNZW1vcnkKKyAgICAgICAgICAgIEV2YWwgdGVuc29yIGRhdGEgfCAgMCB8ICAxMDY4IHwgICAgICAxMDY4IHwgICAgODkgfCAgICAgIDEuMjYKKyAgICAgIFBlcnNpc3RlbnQgdGVuc29yIGRhdGEgfCAgMSB8ICAgIDY0IHwgICAgICAgIDY0IHwgICAgIDIgfCAgICAgIDAuMDgKK1BlcnNpc3RlbnQgcXVhbnRpemF0aW9uIGRhdGEgfCAgMiB8ICAgIDQwIHwgICAgICAgIDQwIHwgICAgIDQgfCAgICAgIDAuMDUKKyAgICAgIFBlcnNpc3RlbnQgYnVmZmVyIGRhdGEgfCAgMyB8IDI1ODcyIHwgICAgIDI1NzA0IHwgICAgOTAgfCAgICAgMzAuNjQKKyBUZW5zb3IgdmFyaWFibGUgYnVmZmVyIGRhdGEgfCAgNCB8ICAgICAwIHwgICAgICAgICAwIHwgICAgIDAgfCAgICAgIDAuMDAKKyBOb2RlIGFuZCByZWdpc3RyYXRpb24gYXJyYXkgfCAgNSB8ICAgOTkyIHwgICAgICAgOTkyIHwgICAgMzEgfCAgICAgIDEuMTcKKyAgICAgICAgICAgICAgT3BlcmF0aW9uIGRhdGEgfCAgNiB8ICAgICAwIHwgICAgICAgICAwIHwgICAgIDAgfCAgICAgIDAuMDAKKworQXBwbGljYXRpb24gZXhpdCBjb2RlOiAwLgorCitJbmZvOiAvT1NDSS9TeXN0ZW1DOiBTaW11bGF0aW9uIHN0b3BwZWQgYnkgdXNlci4KK1t3YXJuaW5nIF1bbWFpbkAwXVswMSBuc10gU2ltdWxhdGlvbiBzdG9wcGVkIGJ5IHVzZXIKKworLS0tIEZWUF9NUFMzX0NvcnN0b25lX1NTRV8zMDAgc3RhdGlzdGljczogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorU2ltdWxhdGVkIHRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgIDogMi44Nzk5OTNzCitVc2VyIHRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAyLjAyNzEwMHMKK1N5c3RlbSB0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDAuMTM1OTE0cworV2FsbCB0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMi42NjMyMTRzCitQZXJmb3JtYW5jZSBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgOiAxLjA4CitjcHUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgMjcuMDMgTUlQUyAoICAgIDcxOTk5ODQ4IEluc3QpCitNZW1vcnkgaGlnaHdhdGVyIG1hcmsgICAgICAgICAgICAgICAgICAgOiAweDExOTE5MDAwIGJ5dGVzICggMC4yNzUgR0IgKQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorYGBgCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvYmVuY2htYXJraW5nL2FuYWx5emVfbW9kZWwucHkgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvYmVuY2htYXJraW5nL2FuYWx5emVfbW9kZWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmZjAxMwotLS0gL2Rldi9udWxsCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9iZW5jaG1hcmtpbmcvYW5hbHl6ZV9tb2RlbC5weQpAQCAtMCwwICsxLDM1IEBACisjIS91c3IvYmluL2VudiBweXRob24zCisjIENvcHlyaWdodCAyMDI0IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitmcm9tIGFic2wgaW1wb3J0IGFwcAorZnJvbSBhYnNsIGltcG9ydCBmbGFncworCitpbXBvcnQgdGVuc29yZmxvdyBhcyB0ZgorCitfTU9ERUxfUEFUSCA9IGZsYWdzLkRFRklORV9zdHJpbmcoCisgICAgbmFtZT0nbW9kZWxfZmlsZScsCisgICAgZGVmYXVsdD0nJywKKyAgICBoZWxwPSdwYXRoIGZvciB0aGUgLnRmbGl0ZSBtb2RlbCBmaWxlLicsCispCisKKworZGVmIF9tYWluKF8pOgorICAiIiJvdXRwdXRzIG1vZGVsIGFuYWx5c2lzIHRvIHN0ZG91dC9zdGRlcnIiIiIKKyAgdGYubGl0ZS5leHBlcmltZW50YWwuQW5hbHl6ZXIuYW5hbHl6ZShtb2RlbF9wYXRoPV9NT0RFTF9QQVRILnZhbHVlKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIGFwcC5ydW4oX21haW4pCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvYmVuY2htYXJraW5nL2NvbGxlY3RfbWV0YV9kYXRhLnNoIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2JlbmNobWFya2luZy9jb2xsZWN0X21ldGFfZGF0YS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNjBiZGYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2JlbmNobWFya2luZy9jb2xsZWN0X21ldGFfZGF0YS5zaApAQCAtMCwwICsxLDE3NyBAQAorIyEvdXNyL2Jpbi9lbnYgYmFzaAorIyBDb3B5cmlnaHQgMjAyNCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgQ29sbGVjdCBnZW5lcmljIGJlbmNobWFyayBtZXRhIGRhdGEgYW5kIGluc2VydCByZXN1bHRpbmcgc3RyaW5ncyBpbnRvCisjIHRoZSBmaWxlIGRlc2lnbmF0ZWQgYnkgVEVNUExBVEVfRklMRS4KKyMKKyMgVGFrZXMgbm8gYXJndW1lbnRzLgorIworIyBVc2VzIHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzOgorIyBURU1QTEFURV9GSUxFIC0gcGF0aCB0byB0aGUgdGVtcGxhdGUgc291cmNlIGZpbGUKKyMgR0VORVJBVEVEX0ZJTEUgLSBwYXRoIHRvIHRoZSBnZW5lcmF0ZWQgc291cmNlIGZpbGUgd2l0aCBzdWJzdGl0dXRlZCBzdHJpbmdzCisjIFRFTlNPUkZMT1dfUk9PVCAtIHBhdGggdG8gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlCisjIE1PREVMX0ZJTEUgLSBwYXRoIHRvIHRoZSAudGZsaXRlIG1vZGVsIGZpbGUKKyMgQ0MgLSBwYXRoIHRvIEMgY29tcGlsZXIKKyMgQ1hYIC0gcGF0aCB0byBDKysgY29tcGlsZXIKKyMgQ0NfRkxBR1MgLSBDIGNvbXBpbGVyIGZsYWdzCisjIENYWF9GTEFHUyAtIEMrKyBjb21waWxlciBmbGFncworIyBLRVJORUxfT1BUSU1JWkFUSU9OIC0ga2VybmVsIG9wdGltaXphdGlvbiBmbGFncworIyBDT1JFX09QVElNSVpBVElPTiAtIGNvcmUgb3B0aW1pemF0aW9uIGZsYWdzCisjIFRISVJEX1BBUlRZX0tFUk5FTF9PUFRJTUlaQVRJT04gLSB0aGlyZCBwYXJ5IGtlcm5lbCBvcHRpbWl6YXRpb24gZmxhZ3MKKyMgVEFSR0VUIC0gdGFyZ2V0IHBsYXRmb3JtICh4dGVuc2EsIGNvcnRleF9tX2NvcnN0b25lXzMwMCwgZXRjLikKKyMgVEFSR0VUX0FSQ0ggLSB0YXJnZXQgYXJjaGl0ZWN0dXJlIChoaWZpNSwgY29ydGV4LW0wLCBldGMuKQorIyBPUFRJTUlaRURfS0VSTkVMIC0gb3B0aW1pemVkIGtlcm5lbCAoeHRlbnNhLCBjbXNpc19ubiwgZXRjLikKKyMgQlVJTERfVFlQRSAtIHR5cGUgb2YgYnVpbGQgKGRlZmF1bHQsIHJlbGVhc2UsIGV0Yy4pCisjIFhURU5TQV9DT1JFIC0gWHRlbnNhIGNvcmUgc3BlY2lmaWNhdGlvbgorIyBYVEVOU0FfQkFTRSAtIFh0ZW5zYSBiYXNlIGluc3RhbGwgZGlyZWN0b3J5CisjIFhURU5TQV9UT09MU19WRVJTSU9OIC0gWHRlbnNhIHRvb2xpbmcgdmVyc2lvbgorCisKK3NldCAtZQorCitzb3VyY2UgJHtURU5TT1JGTE9XX1JPT1R9dGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2NpX2J1aWxkL2hlbHBlcl9mdW5jdGlvbnMuc2gKKworZnVuY3Rpb24gc3Vic3RpdHV0ZV9zdHJpbmdzKCkgeworICBzZWFyY2g9Ii8vICUlJV8kMV8lJSUiCisgIGxpbmVzPSQoZm9sZCAtdyA5MCAtcyA8PDwgIiQyIikKKyAgU0FWRURfSUZTPSR7SUZTfQorICBJRlM9JCdcbicgbGluZXNfYXJyYXk9KCAke2xpbmVzfSApCisgIElGUz0ke1NBVkVEX0lGU30KKyAgcmVwbGFjZW1lbnQ9KCkKKyAgZm9yIGxpbmUgaW4gIiR7bGluZXNfYXJyYXlbQF19IjsgZG8KKyAgICBsaW5lPSQoc2VkIC1lICdzLyIvXFwiL2cnIDw8PCAiJHtsaW5lfSIpCisgICAgbGluZT0kKHByaW50ZiAnIiVzIixcbiAgICAnICIke2xpbmV9IikKKyAgICByZXBsYWNlbWVudCs9KCAiJHtsaW5lfSIgKQorICBkb25lCisKKyAgdGVtcGZpbGU9JChta3RlbXApCisKKyAgU0VBUkNIX1BBVFRFUk49IiRzZWFyY2giIFJFUExBQ0VNRU5UX1BBVFRFUk49IiR7cmVwbGFjZW1lbnRbQF19IiBhd2sgJworICAgIEJFR0lOIHsKKyAgICAgICAgc2VhcmNoID0gRU5WSVJPTlsiU0VBUkNIX1BBVFRFUk4iXQorICAgICAgICByZXBsYWNlbWVudCA9IEVOVklST05bIlJFUExBQ0VNRU5UX1BBVFRFUk4iXQorICAgIH0KKyAgICBzID0gaW5kZXgoJDAsc2VhcmNoKSB7CisgICAgICAgICQwID0gc3Vic3RyKCQwLDEscy0xKSByZXBsYWNlbWVudCBzdWJzdHIoJDAscytsZW5ndGgoc2VhcmNoKSkKKyAgICB9CisgICAgeyBwcmludCB9CisgICcgIiR7R0VORVJBVEVEX0ZJTEV9IiA+ICR7dGVtcGZpbGV9CisgIG12ICR7dGVtcGZpbGV9ICIke0dFTkVSQVRFRF9GSUxFfSIKK30KKworbWtkaXIgLXAgJChkaXJuYW1lICR7R0VORVJBVEVEX0ZJTEV9KQorY3AgLXAgJHtURU1QTEFURV9GSUxFfSAke0dFTkVSQVRFRF9GSUxFfQorCisjIG1vZGVsIGFuYWx5c2lzIGFuZCBTSEExCitpZiBbWyAke01PREVMX0ZJTEV9IF1dOyB0aGVuCisgIHB5dGhvbjMgLW0gcGlwIGluc3RhbGwgYWJzbC1weSB0ZW5zb3JmbG93CisgIHJlc3VsdD0kKHB5dGhvbjMgXAorICAgICIke1RFTlNPUkZMT1dfUk9PVH10ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvYmVuY2htYXJraW5nL2FuYWx5emVfbW9kZWwucHkiIFwKKyAgICAtLW1vZGVsX2ZpbGU9IiR7TU9ERUxfRklMRX0iIFwKKyAgICApCisgIHN1YnN0aXR1dGVfc3RyaW5ncyBtb2RlbF9hbmFseXNpc19zdHJpbmdzICIke3Jlc3VsdH0iCisKKyAgcmVzdWx0PSQoc2hhc3VtIC1iICIke01PREVMX0ZJTEV9IiB8IGN1dCAtZiAxIC1kICcgJykKKyAgc3Vic3RpdHV0ZV9zdHJpbmdzIG1vZGVsX3NoYTFfc3RyaW5ncyAiJHtyZXN1bHR9IgorZmkKKworIyBjb21waWxlIGRhdGUKK3Jlc3VsdD0kKGRhdGUpCitzdWJzdGl0dXRlX3N0cmluZ3MgY29tcGlsYXRpb25fZGF0ZV9zdHJpbmdzICIke3Jlc3VsdH0iCisKK0dJVF9URU5TT1JGTE9XX1JPT1Q9IiR7VEVOU09SRkxPV19ST09UOi0uL30iCitzZXQgK2UKKyMgR2l0IHJlcG8gY29tbWl0IGluZm9ybWF0aW9uCityZXN1bHQ9JChjZCAke0dJVF9URU5TT1JGTE9XX1JPT1R9ICYmIGdpdCByZXYtcGFyc2UgLS12ZXJpZnkgSEVBRCkKK2lmIFtbICQ/ICE9IDAgXV07IHRoZW4KKyAgcmVzdWx0PSI8Z2l0IGNvbW1pdCBpbmZvcm1hdGlvbiBub3QgYXZhaWxhYmxlPiIKK2ZpCitzdWJzdGl0dXRlX3N0cmluZ3MgZ2l0X2NvbW1pdF9zdHJpbmdzICIke3Jlc3VsdH0iCisKKyMgR2l0IHJlcG8gc3RhdHVzIGluZm9ybWF0aW9uCityZXN1bHQ9JChjZCAke0dJVF9URU5TT1JGTE9XX1JPT1R9ICYmIGdpdCBzdGF0dXMpCitpZiBbWyAkPyAhPSAwIF1dOyB0aGVuCisgIHJlc3VsdD0iPGdpdCBzdGF0dXMgaW5mb3JtYXRpb24gbm90IGF2YWlsYWJsZT4iCitmaQorc3Vic3RpdHV0ZV9zdHJpbmdzIGdpdF9zdGF0dXNfc3RyaW5ncyAiJHtyZXN1bHR9Igorc2V0IC1lCisKKyMgQ29tcGlsZXIgaW5mb3JtYXRpb24KK3Jlc3VsdD0iJHtDQ30iCitzdWJzdGl0dXRlX3N0cmluZ3MgY2NfbmFtZV9zdHJpbmdzICIke3Jlc3VsdH0iCityZXN1bHQ9JCgiJHtDQ30iIC0tdmVyc2lvbikKK3N1YnN0aXR1dGVfc3RyaW5ncyBjY192ZXJzaW9uX3N0cmluZ3MgIiR7cmVzdWx0fSIKK3Jlc3VsdD0iJHtDQ19GTEFHU30iCitzdWJzdGl0dXRlX3N0cmluZ3MgY2NfZmxhZ3Nfc3RyaW5ncyAiJHtyZXN1bHR9IgorCityZXN1bHQ9IiR7Q1hYfSIKK3N1YnN0aXR1dGVfc3RyaW5ncyBjeHhfbmFtZV9zdHJpbmdzICIke3Jlc3VsdH0iCityZXN1bHQ9JCgiJHtDWFh9IiAtLXZlcnNpb24pCitzdWJzdGl0dXRlX3N0cmluZ3MgY3h4X3ZlcnNpb25fc3RyaW5ncyAiJHtyZXN1bHR9IgorcmVzdWx0PSIke0NYWF9GTEFHU30iCitzdWJzdGl0dXRlX3N0cmluZ3MgY3h4X2ZsYWdzX3N0cmluZ3MgIiR7cmVzdWx0fSIKKworcmVzdWx0PSJrZXJuZWw9ICR7S0VSTkVMX09QVElNSVpBVElPTn0iCityZXN1bHQrPSIgIGNvcmU9ICR7Q09SRV9PUFRJTUlaQVRJT059IgorcmVzdWx0Kz0iICB0aGlyZC1wYXJ0eS1rZXJuZWw9ICR7VEhJUkRfUEFSVFlfS0VSTkVMX09QVElNSVpBVElPTn0iCitzdWJzdGl0dXRlX3N0cmluZ3Mgb3B0aW1pemF0aW9uX2ZsYWdfc3RyaW5ncyAiJHtyZXN1bHR9IgorCisjIFRhcmdldCBpbmZvcm1hdGlvbgorVEFSR0VUPSIke1RBUkdFVDotbGludXh9IgorVEFSR0VUX0FSQ0g9IiR7VEFSR0VUX0FSQ0g6LXg4Nn0iCitPUFRJTUlaRURfS0VSTkVMPSIke09QVElNSVpFRF9LRVJORUw6LW5vbmV9IgorQlVJTERfVFlQRT0iJHtCVUlMRF9UWVBFOi1kZWZhdWx0fSIKK3Jlc3VsdD0kKHByaW50ZiAnVEFSR0VUPSVzXG5UQVJHRVRfQVJDSD0lc1xuT1BUSU1JWkFUSU9OPSVzXG5CVUlMRF9UWVBFPSVzXG4nIFwKKyAgIiR7VEFSR0VUfSIgXAorICAiJHtUQVJHRVRfQVJDSH0iIFwKKyAgIiR7T1BUSU1JWkVEX0tFUk5FTH0iIFwKKyAgIiR7QlVJTERfVFlQRX0iIFwKKykKK2lmIFtbICR7WFRFTlNBX0NPUkV9IF1dOyB0aGVuCisgIHJlc3VsdCs9JChwcmludGYgJ1xuWFRFTlNBX0NPUkU9JXMnICIke1hURU5TQV9DT1JFfSIpCisgIHJlc3VsdCs9JChwcmludGYgJ1xuWFRFTlNBX0JBU0U9JXMnICIke1hURU5TQV9CQVNFfSIpCisgIHJlc3VsdCs9JChwcmludGYgJ1xuWFRFTlNBX1RPT0xTX1ZFUlNJT049JXMnICIke1hURU5TQV9UT09MU19WRVJTSU9OfSIpCitmaQorc3Vic3RpdHV0ZV9zdHJpbmdzIHRhcmdldF9pbmZvX3N0cmluZ3MgIiR7cmVzdWx0fSIKKworZG93bmxvYWRfc2NyaXB0cz0oKQorZG93bmxvYWRfc2NyaXB0X2FyZ3M9KCAiLS1uby1kb3dubG9hZHMiICkKK2lmIFtbICR7T1BUSU1JWkVEX0tFUk5FTH0gPT0gImNtc2lzX25uIiBdXTsgdGhlbgorICBkb3dubG9hZF9zY3JpcHRzKz0oICIke1RFTlNPUkZMT1dfUk9PVH10ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9leHRfbGlicy9jbXNpc19ubl9kb3dubG9hZC5zaCIgKQorICBkb3dubG9hZF9zY3JpcHRfYXJncys9KCAiJHtURU5TT1JGTE9XX1JPT1R9IiApCitlbGlmIFtbICR7T1BUSU1JWkVEX0tFUk5FTH0gPT0gInh0ZW5zYSIgXV07IHRoZW4KKyAgZG93bmxvYWRfc2NyaXB0X2FyZ3MrPSggIiR7VEFSR0VUX0FSQ0h9IiAiJHtURU5TT1JGTE9XX1JPT1R9IiApCisgIGlmIFtbICR7VEFSR0VUX0FSQ0h9ID1+IF4odmlzaW9uX3A2KSQgXV07IHRoZW4KKyAgICBkb3dubG9hZF9zY3JpcHRzKz0oICIke1RFTlNPUkZMT1dfUk9PVH10ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9leHRfbGlicy94dGVuc2FfZG93bmxvYWQuc2giICkKKyAgZWxpZiBbWyAke1RBUkdFVF9BUkNIfSA9fiBeKGhpZmkzfGhpZmk0fGhpZmk1KSQgXV07IHRoZW4KKyAgICBkb3dubG9hZF9zY3JpcHRzKz0oICIke1RFTlNPUkZMT1dfUk9PVH10ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9leHRfbGlicy94dGVuc2FfZG93bmxvYWQuc2giICkKKyAgICBkb3dubG9hZF9zY3JpcHRzKz0oICIke1RFTlNPUkZMT1dfUk9PVH10ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9leHRfbGlicy94dGVuc2FfbmRzcF9kb3dubG9hZC5zaCIgKQorICBmaQorZmkKKworaWYgW1sgJHsjZG93bmxvYWRfc2NyaXB0c1tAXX0gLWd0IDAgXV07IHRoZW4KKyAgcmVzdWx0c191cmw9CisgIHJlc3VsdHNfbWQ1PQorICBmb3Igc2NyaXB0IGluICIke2Rvd25sb2FkX3NjcmlwdHNbQF19IjsgZG8KKyAgICByZXN1bHRzPSQoIiR7c2NyaXB0fSIgIiR7ZG93bmxvYWRfc2NyaXB0X2FyZ3NbQF19IiAyPiYxKQorICAgIHVybD0kKHNlZCAtcm4gJ3MvXkxJQlJBUllfVVJMPSguKikkL1wxL3AnIDw8PCAiJHtyZXN1bHRzfSIpCisgICAgcmVzdWx0c191cmwrPSQocHJpbnRmICdcbiVzJyAiJHt1cmx9IikKKyAgICBtZDU9JChzZWQgLXJuICdzL15MSUJSQVJZX01ENT0oLiopJC9cMS9wJyA8PDwgIiR7cmVzdWx0c30iKQorICAgIHJlc3VsdHNfbWQ1Kz0kKHByaW50ZiAnXG4lcycgIiR7bWQ1fSIpCisgIGRvbmUKKyAgc3Vic3RpdHV0ZV9zdHJpbmdzIG5uX2xpYnJhcnlfdXJsX3N0cmluZ3MgIiR7cmVzdWx0c191cmx9IgorICBzdWJzdGl0dXRlX3N0cmluZ3Mgbm5fbGlicmFyeV9tZDVfc3RyaW5ncyAiJHtyZXN1bHRzX21kNX0iCitmaQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2JlbmNobWFya2luZy9nZW5lcmljX21vZGVsX2JlbmNobWFyay5jYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9iZW5jaG1hcmtpbmcvZ2VuZXJpY19tb2RlbF9iZW5jaG1hcmsuY2MKaW5kZXggYzFkYjhmYS4uZjM5ODk2MyAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2JlbmNobWFya2luZy9nZW5lcmljX21vZGVsX2JlbmNobWFyay5jYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvYmVuY2htYXJraW5nL2dlbmVyaWNfbW9kZWxfYmVuY2htYXJrLmNjCkBAIC0xLDQgKzEsNCBAQAotLyogQ29weXJpZ2h0IDIwMjMgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8qIENvcHlyaWdodCAyMDI0IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAKIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTcsMTEgKzE3LDE0IEBACiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAorI2luY2x1ZGUgPGNzdHJpbmc+CiAjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHJhbmRvbT4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KIAogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9jL2NfYXBpX3R5cGVzLmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2MvY29tbW9uLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2NvbnRleHQuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fbG9nLmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX211dGFibGVfb3BfcmVzb2x2ZXIuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fb3BfcmVzb2x2ZXIuaCIKQEAgLTI5LDExICszMiwzMCBAQAogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9yZWNvcmRpbmdfbWljcm9fYWxsb2NhdG9yLmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL3JlY29yZGluZ19taWNyb19pbnRlcnByZXRlci5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby9zeXN0ZW1fc2V0dXAuaCIKLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvYmVuY2htYXJraW5nL2xvZ191dGlscy5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9iZW5jaG1hcmtpbmcvbWV0cmljcy5oIgogI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9iZW5jaG1hcmtpbmcvb3BfcmVzb2x2ZXIuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvYmVuY2htYXJraW5nL3Nob3dfbWV0YV9kYXRhLmgiCiAjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL3NjaGVtYS9zY2hlbWFfZ2VuZXJhdGVkLmgiCiAKKyNpZiBkZWZpbmVkKEdFTkVSSUNfQkVOQ0hNQVJLX1VTSU5HX0JVSUxUSU5fTU9ERUwpCisjaWYgIWRlZmluZWQoR0VORVJJQ19CRU5DSE1BUktfTU9ERUxfSEVBREVSX1BBVEgpCisjZXJyb3IgIkdFTkVSSUNfQkVOQ0hNQVJLX01PREVMX0hFQURFUl9QQVRIIG1pc3NpbmcgZnJvbSBDWFhGTEFHUyIKKyNlbmRpZiAgLy8gIWRlZmluZWQoR0VORVJJQ19CRU5DSE1BUktfTU9ERUxfSEVBREVSX1BBVEgpCisjaWYgIWRlZmluZWQoR0VORVJJQ19CRU5DSE1BUktfTU9ERUxfTkFNRSkKKyNlcnJvciAiR0VORVJJQ19CRU5DSE1BUktfTU9ERUxfTkFNRSBtaXNzaW5nIGZyb20gQ1hYRkxBR1MiCisjZW5kaWYgIC8vICFkZWZpbmVkKEdFTkVSSUNfQkVOQ0hNQVJLX01PREVMX05BTUUpCisKKyNpbmNsdWRlIEdFTkVSSUNfQkVOQ0hNQVJLX01PREVMX0hFQURFUl9QQVRICisKKyNkZWZpbmUgX19NT0RFTF9EQVRBKHgpIGdfIyN4IyNfbW9kZWxfZGF0YQorI2RlZmluZSBfTU9ERUxfREFUQSh4KSBfX01PREVMX0RBVEEoeCkKKyNkZWZpbmUgTU9ERUxfREFUQSBfTU9ERUxfREFUQShHRU5FUklDX0JFTkNITUFSS19NT0RFTF9OQU1FKQorI2RlZmluZSBfX01PREVMX1NJWkUoeCkgZ18jI3gjI19tb2RlbF9kYXRhX3NpemUKKyNkZWZpbmUgX01PREVMX1NJWkUoeCkgX19NT0RFTF9TSVpFKHgpCisjZGVmaW5lIE1PREVMX1NJWkUgX01PREVMX1NJWkUoR0VORVJJQ19CRU5DSE1BUktfTU9ERUxfTkFNRSkKKworI2VuZGlmICAvLyBkZWZpbmQoR0VORVJJQ19CRU5DSE1BUktfVVNJTkdfQlVJTFRJTl9NT0RFTCkKKwogLyoKICAqIEdlbmVyaWMgbW9kZWwgYmVuY2htYXJrLiAgRXZhbHVhdGVzIHJ1bnRpbWUgcGVyZm9ybWFuY2Ugb2YgYSBwcm92aWRlZCBtb2RlbAogICogd2l0aCByYW5kb20gaW5wdXRzLgpAQCAtNDUsMjAgKzY3LDIwIEBACiAKIHVzaW5nIFByb2ZpbGVyID0gOjp0ZmxpdGU6Ok1pY3JvUHJvZmlsZXI7CiAKLXVzaW5nIFRmbG1PcFJlc29sdmVyID0gdGZsaXRlOjpNaWNyb011dGFibGVPcFJlc29sdmVyPDk2PjsKLQotY29uc3RleHByIGludCBrVGZMaXRlQWJvcnQgPSAtOTsKLQogLy8gU2VlZCB1c2VkIGZvciB0aGUgcmFuZG9tIGlucHV0LiBJbnB1dCBkYXRhIHNob3VsZG4ndCBhZmZlY3QgaW52b2NhdGlvbiB0aW1pbmcKIC8vIHNvIHJhbmRvbW5lc3MgaXNuJ3QgcmVhbGx5IG5lZWRlZC4KIGNvbnN0ZXhwciB1aW50MzJfdCBrUmFuZG9tU2VlZCA9IDB4RkI7CiAKLS8vIFdoaWNoIGZvcm1hdCBzaG91bGQgYmUgdXNlZCB0byBvdXRwdXQgZGVidWcgaW5mb3JtYXRpb24uCi1jb25zdGV4cHIgUHJldHR5UHJpbnRUeXBlIGtQcmludFR5cGUgPSBQcmV0dHlQcmludFR5cGU6OmtUYWJsZTsKKyNpZiAhZGVmaW5lZChHRU5FUklDX0JFTkNITUFSS19VU0lOR19CVUlMVElOX01PREVMKQorY29uc3RleHByIHNpemVfdCBrVGVuc29yQXJlbmFTaXplID0gM2U2OworY29uc3RleHByIHNpemVfdCBrTW9kZWxTaXplID0gMmU2OworI2VsaWYgZGVmaW5lZChHRU5FUklDX0JFTkNITUFSS19URU5TT1JfQVJFTkFfU0laRSkKK2NvbnN0ZXhwciBzaXplX3Qga1RlbnNvckFyZW5hU2l6ZSA9IEdFTkVSSUNfQkVOQ0hNQVJLX1RFTlNPUl9BUkVOQV9TSVpFOworI2Vsc2UKK2NvbnN0ZXhwciBzaXplX3Qga1RlbnNvckFyZW5hU2l6ZSA9IDVlNiAtIE1PREVMX1NJWkU7CisjZW5kaWYgIC8vICFkZWZpbmVkKEdFTkVSSUNfQkVOQ0hNQVJLX1VTSU5HX0JVSUxUSU5fTU9ERUwpCiAKLWNvbnN0ZXhwciBzaXplX3Qga1RlbnNvckFyZW5hU2l6ZSA9IDEwMjQgKiAxMDI0OwogY29uc3RleHByIGludCBrTnVtUmVzb3VyY2VWYXJpYWJsZSA9IDEwMDsKLWNvbnN0ZXhwciBzaXplX3Qga01vZGVsU2l6ZSA9IDUxMTQwODsKIAogdm9pZCBTZXRSYW5kb21JbnB1dChjb25zdCB1aW50MzJfdCByYW5kb21fc2VlZCwKICAgICAgICAgICAgICAgICAgICAgdGZsaXRlOjpNaWNyb0ludGVycHJldGVyJiBpbnRlcnByZXRlcikgewpAQCAtNzYsOCArOTgsMTQgQEAKICAgfQogfQogCisjaWYgIWRlZmluZWQoR0VORVJJQ19CRU5DSE1BUktfVVNJTkdfQlVJTFRJTl9NT0RFTCkKKworc3RydWN0IEZpbGVDbG9zZXIgeworICB2b2lkIG9wZXJhdG9yKCkoRklMRSogZmlsZSkgeyBmY2xvc2UoZmlsZSk7IH0KK307CisKIGJvb2wgUmVhZEZpbGUoY29uc3QgY2hhciogZmlsZV9uYW1lLCB2b2lkKiBidWZmZXIsIHNpemVfdCBidWZmZXJfc2l6ZSkgewotICBzdGQ6OnVuaXF1ZV9wdHI8RklMRSwgZGVjbHR5cGUoJmZjbG9zZSk+IGZpbGUoZm9wZW4oZmlsZV9uYW1lLCAicmIiKSwgZmNsb3NlKTsKKyAgc3RkOjp1bmlxdWVfcHRyPEZJTEUsIEZpbGVDbG9zZXI+IGZpbGUoZm9wZW4oZmlsZV9uYW1lLCAicmIiKSk7CiAKICAgY29uc3Qgc2l6ZV90IGJ5dGVzX3JlYWQgPQogICAgICAgZnJlYWQoYnVmZmVyLCBzaXplb2YoY2hhciksIGJ1ZmZlcl9zaXplLCBmaWxlLmdldCgpKTsKQEAgLTg2LDcgKzExNCwxMSBAQAogICAgIHJldHVybiBmYWxzZTsKICAgfQogICBpZiAoIWZlb2YoZmlsZS5nZXQoKSkpIHsKLSAgICBNaWNyb1ByaW50ZigiTW9kZWwgYnVmZmVyIGlzIHRvbyBzbWFsbCBmb3IgdGhlIG1vZGVsLlxuIik7CisgICAgLy8gTm90ZSB0aGF0IGh0dHA6Ly9iLzI5NzU5MjU0NiBjYW4gbWVhbiB0aGF0IHRoaXMgZXJyb3IgbWVzc2FnZSBpcworICAgIC8vIGNvbmZ1c2luZy4KKyAgICBNaWNyb1ByaW50ZigKKyAgICAgICAgIk1vZGVsIGJ1ZmZlciAoJWQgYnl0ZXMpIGlzIHRvbyBzbWFsbCBmb3IgdGhlIG1vZGVsICglZCBieXRlcykuXG4iLAorICAgICAgICBidWZmZXJfc2l6ZSwgYnl0ZXNfcmVhZCk7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAgIGlmIChieXRlc19yZWFkID09IDApIHsKQEAgLTk2LDE3ICsxMjgsMTQgQEAKIAogICByZXR1cm4gdHJ1ZTsKIH0KKyNlbmRpZiAgLy8gIWRlZmluZWQoR0VORVJJQ19CRU5DSE1BUktfVVNJTkdfQlVJTFRJTl9NT0RFTCkKIAotaW50IEJlbmNobWFyayhjb25zdCBjaGFyKiBtb2RlbF9maWxlX25hbWUpIHsKK2ludCBCZW5jaG1hcmsoY29uc3QgdWludDhfdCogbW9kZWxfZGF0YSwgdGZsaXRlOjpQcmV0dHlQcmludFR5cGUgcHJpbnRfdHlwZSkgewogICBQcm9maWxlciBwcm9maWxlcjsKICAgYWxpZ25hcygxNikgc3RhdGljIHVpbnQ4X3QgdGVuc29yX2FyZW5hW2tUZW5zb3JBcmVuYVNpemVdOwotICBhbGlnbmFzKDE2KSB1bnNpZ25lZCBjaGFyIG1vZGVsX2ZpbGVfY29udGVudFtrTW9kZWxTaXplXTsKIAotICBpZiAoIVJlYWRGaWxlKG1vZGVsX2ZpbGVfbmFtZSwgbW9kZWxfZmlsZV9jb250ZW50LCBrTW9kZWxTaXplKSkgewotICAgIHJldHVybiAtMTsKLSAgfQogICB1aW50MzJfdCBldmVudF9oYW5kbGUgPSBwcm9maWxlci5CZWdpbkV2ZW50KCJUZmxpdGVHZXRNb2RlbCIpOwotICBjb25zdCB0ZmxpdGU6Ok1vZGVsKiBtb2RlbCA9IHRmbGl0ZTo6R2V0TW9kZWwobW9kZWxfZmlsZV9jb250ZW50KTsKKyAgY29uc3QgdGZsaXRlOjpNb2RlbCogbW9kZWwgPSB0ZmxpdGU6OkdldE1vZGVsKG1vZGVsX2RhdGEpOwogICBwcm9maWxlci5FbmRFdmVudChldmVudF9oYW5kbGUpOwogCiAgIFRmbG1PcFJlc29sdmVyIG9wX3Jlc29sdmVyOwpAQCAtMTUwLDExICsxNzksNTAgQEAKICAgICB9CiAgIH0KIAotICBMb2dBbGxvY2F0b3JFdmVudHMoKmFsbG9jYXRvciwga1ByaW50VHlwZSk7CisgIExvZ0FsbG9jYXRvckV2ZW50cygqYWxsb2NhdG9yLCBwcmludF90eXBlKTsKIAogICByZXR1cm4gMDsKIH0KIH0gIC8vIG5hbWVzcGFjZQogfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQogCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsgcmV0dXJuIHRmbGl0ZTo6QmVuY2htYXJrKGFyZ3ZbMV0pOyB9CisjaWYgIWRlZmluZWQoR0VORVJJQ19CRU5DSE1BUktfVVNJTkdfQlVJTFRJTl9NT0RFTCkKK3ZvaWQgdXNhZ2UoY29uc3QgY2hhciogcHJvZ19uYW1lKSB7CisgIE1pY3JvUHJpbnRmKCJ1c2FnZTogJXMgZmlsZW5hbWUgWy0tY3N2XSIsIHByb2dfbmFtZSk7Cit9CisjZW5kaWYgIC8vICFkZWZpbmVkKEdFTkVSSUNfQkVOQ0hNQVJLX1VTSU5HX0JVSUxUSU5fTU9ERUwpCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAvLyBXaGljaCBmb3JtYXQgc2hvdWxkIGJlIHVzZWQgdG8gb3V0cHV0IGRlYnVnIGluZm9ybWF0aW9uLgorICB0ZmxpdGU6OlByZXR0eVByaW50VHlwZSBwcmludF90eXBlID0gdGZsaXRlOjpQcmV0dHlQcmludFR5cGU6OmtUYWJsZTsKKyAgdGZsaXRlOjpJbml0aWFsaXplVGFyZ2V0KCk7CisKKyNpZiAhZGVmaW5lZChHRU5FUklDX0JFTkNITUFSS19VU0lOR19CVUlMVElOX01PREVMKQorICBpZiAoYXJnYyA8IDIgfHwgYXJnYyA+IDMpIHsKKyAgICB1c2FnZShhcmd2WzBdKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgY29uc3QgY2hhciogbW9kZWxfZmlsZW5hbWUgPSBhcmd2WzFdOworCisgIGlmIChhcmdjID09IDMpIHsKKyAgICBpZiAoc3RkOjpzdHJjbXAoYXJndlsyXSwgIi0tY3N2IikgPT0gMCkgeworICAgICAgcHJpbnRfdHlwZSA9IHRmbGl0ZTo6UHJldHR5UHJpbnRUeXBlOjprQ3N2OworICAgIH0gZWxzZSB7CisgICAgICB1c2FnZShhcmd2WzBdKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisgIH0KKworICBhbGlnbmFzKDE2KSBzdGF0aWMgdWludDhfdCBtb2RlbF9kYXRhW3RmbGl0ZTo6a01vZGVsU2l6ZV07CisKKyAgaWYgKCF0ZmxpdGU6OlJlYWRGaWxlKG1vZGVsX2ZpbGVuYW1lLCBtb2RlbF9kYXRhLCB0ZmxpdGU6OmtNb2RlbFNpemUpKSB7CisgICAgcmV0dXJuIC0xOworICB9CisjZWxzZQorICBjb25zdCB1aW50OF90KiBtb2RlbF9kYXRhID0gTU9ERUxfREFUQTsKKyNlbmRpZiAgLy8gIWRlZmluZWQoR0VORVJJQ19CRU5DSE1BUktfVVNJTkdfQlVJTFRJTl9NT0RFTCkKKworICBNaWNyb1ByaW50ZigiXG5Db25maWd1cmVkIGFyZW5hIHNpemUgPSAlZFxuIiwgdGZsaXRlOjprVGVuc29yQXJlbmFTaXplKTsKKyAgdGZsaXRlOjpHZW5lcmljQmVuY2htYXJrU2hvd01ldGFEYXRhKCk7CisgIHJldHVybiB0ZmxpdGU6OkJlbmNobWFyayhtb2RlbF9kYXRhLCBwcmludF90eXBlKTsKK30KZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9iZW5jaG1hcmtpbmcvbG9nX3V0aWxzLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2JlbmNobWFya2luZy9sb2dfdXRpbHMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwOGU0NjUuLjAwMDAwMDAKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2JlbmNobWFya2luZy9sb2dfdXRpbHMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLyogQ29weXJpZ2h0IDIwMjMgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLQotTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci15b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi1Zb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi1Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi1kaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi1TZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi1saW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0KLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvYmVuY2htYXJraW5nL2xvZ191dGlscy5oIgotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi1uYW1lc3BhY2UgdGZsaXRlIHsKLQotaW50IEdldExvbmdlc3RTdHJpbmdMZW5ndGgoY29uc3QgY2hhciBzdHJpbmdzW11ba01heFN0cmluZ0xlbmd0aF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgY291bnQpIHsKLSAgaW50IG1heF9sZW5ndGggPSAwOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgIGludCBzaXplID0gc3RybGVuKHN0cmluZ3NbaV0pOwotICAgIGlmIChzaXplID4gbWF4X2xlbmd0aCkgewotICAgICAgbWF4X2xlbmd0aCA9IHNpemU7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIG1heF9sZW5ndGg7Ci19Ci0KLXZvaWQgRmlsbENvbHVtblBhZGRpbmcoY2hhciogc3RyaW5nLCBjb25zdCBpbnQgc2l6ZSwgY29uc3QgaW50IG1heF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcGFkZGluZykgewotICBGaWxsU3RyaW5nKHN0cmluZywgbWF4X3NpemUgLSBzaXplICsgcGFkZGluZywga01heFN0cmluZ0xlbmd0aCk7Ci19Ci0KLXZvaWQgRmlsbFN0cmluZyhjaGFyKiBzdHJpbmcsIGNvbnN0IGludCBzaXplLCBjb25zdCBpbnQgYnVmZmVyX3NpemUsCi0gICAgICAgICAgICAgICAgY29uc3QgY2hhciB2YWx1ZSkgewotICBpZiAoYnVmZmVyX3NpemUgPD0gKHN0YXRpY19jYXN0PGludD4oc3RybGVuKHN0cmluZykpKSkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVmZmVyX3NpemU7ICsraSkgewotICAgICAgc3RyaW5nW2ldID0gKGkgPCBzaXplKSA/IHZhbHVlIDogMDsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBNaWNyb1N0cmNhdChjaGFyKiBvdXRwdXQsIGNvbnN0IGNoYXIqIGlucHV0LCBjb25zdCBpbnQgc2l6ZSkgewotICBpZiAoc2l6ZSA8IDApIHsKLSAgICBzdHJjYXQob3V0cHV0LCBpbnB1dCk7ICAvLyBOT0xJTlQ6IHN0cmNhdCByZXF1aXJlZCBkdWUgdG8gbm8gZHluYW1pYyBtZW1vcnkuCi0gIH0gZWxzZSB7Ci0gICAgc3RybmNhdChvdXRwdXQsIGlucHV0LCBzaXplKTsKLSAgfQotfQotCi12b2lkIE1pY3JvU3RyY3B5KGNoYXIqIG91dHB1dCwgY29uc3QgY2hhciogaW5wdXQpIHsKLSAgc3RyY3B5KG91dHB1dCwgaW5wdXQpOyAgLy8gTk9MSU5UOiBzdHJjcHkgcmVxdWlyZWQgZHVlIHRvIG5vIGR5bmFtaWMgbWVtb3J5LgotfQotCi12b2lkIEZvcm1hdEludGVnZXJEaXZpZGUoY2hhciogb3V0cHV0LCBjb25zdCBpbnQ2NF90IG51bWVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGRlbm9taW5hdG9yLCBjb25zdCBpbnQgZGVjaW1hbF9wbGFjZXMpIHsKLSAgaW50NjRfdCBtdWx0aXBsaWVyID0gMTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZWNpbWFsX3BsYWNlczsgKytpKSB7Ci0gICAgbXVsdGlwbGllciAqPSAxMDsKLSAgfQotCi0gIGNvbnN0IGludDY0X3QgdG90YWwgPSBudW1lcmF0b3IgKiBtdWx0aXBsaWVyIC8gZGVub21pbmF0b3I7Ci0gIGNvbnN0IGludCB3aG9sZSA9IHN0YXRpY19jYXN0PGludD4odG90YWwgLyBtdWx0aXBsaWVyKTsKLSAgY29uc3QgaW50IGZyYWN0aW9uYWwgPSBzdGF0aWNfY2FzdDxpbnQ+KHRvdGFsICUgbXVsdGlwbGllcik7Ci0gIHNwcmludGYob3V0cHV0LCAiJWQuJWQiLCB3aG9sZSwgZnJhY3Rpb25hbCk7ICAvLyBOT0xJTlQ6IHNwcmludGYgaXMgcmVxdWlyZWQuCi19Ci0KLXZvaWQgRm9ybWF0QXNQZXJjZW50YWdlKGNoYXIqIG91dHB1dCwgY29uc3QgaW50NjRfdCBudW1lcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGRlbm9taW5hdG9yLCBjb25zdCBpbnQgZGVjaW1hbF9wbGFjZXMpIHsKLSAgRm9ybWF0SW50ZWdlckRpdmlkZShvdXRwdXQsIG51bWVyYXRvciAqIDEwMCwgZGVub21pbmF0b3IsIGRlY2ltYWxfcGxhY2VzKTsKLX0KLQotdm9pZCBQcmV0dHlQcmludFRhYmxlSGVhZGVyKFByZXR0eVByaW50VHlwZSB0eXBlLCBjb25zdCBjaGFyKiB0YWJsZV9uYW1lKSB7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgUHJldHR5UHJpbnRUeXBlOjprQ3N2OgotICAgICAgTWljcm9QcmludGYoIltbIENTViBdXTogJXMiLCB0YWJsZV9uYW1lKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUHJldHR5UHJpbnRUeXBlOjprVGFibGU6Ci0gICAgICBNaWNyb1ByaW50ZigiW1sgVEFCTEUgXV06ICVzIiwgdGFibGVfbmFtZSk7Ci0gIH0KLX0KLQotdGVtcGxhdGUgPD4KLXZvaWQgRm9ybWF0TnVtYmVyPGludDMyX3Q+KGNoYXIqIG91dHB1dCwgaW50MzJfdCB2YWx1ZSkgewotICBzcHJpbnRmKG91dHB1dCwgIiUiIFBSSWQzMiwgdmFsdWUpOyAgLy8gTk9MSU5UOiBzcHJpbnRmIHJlcXVpcmVkLgotfQotCi10ZW1wbGF0ZSA8Pgotdm9pZCBGb3JtYXROdW1iZXI8c2l6ZV90PihjaGFyKiBvdXRwdXQsIHNpemVfdCB2YWx1ZSkgewotICBzcHJpbnRmKG91dHB1dCwgIiV6dSIsIHZhbHVlKTsgIC8vIE5PTElOVDogc3ByaW50ZiByZXF1aXJlZC4KLX0KLQotdGVtcGxhdGUgPD4KLXZvaWQgRm9ybWF0TnVtYmVyPGZsb2F0PihjaGFyKiBvdXRwdXQsIGZsb2F0IHZhbHVlKSB7Ci0gIGNvbnN0ZXhwciBpbnQ2NF90IGtEZW5vbWluYXRvciA9IDEwMDA7Ci0gIEZvcm1hdEludGVnZXJEaXZpZGUob3V0cHV0LCBzdGF0aWNfY2FzdDxpbnQ2NF90Pih2YWx1ZSAqIGtEZW5vbWluYXRvciksCi0gICAgICAgICAgICAgICAgICAgICAga0Rlbm9taW5hdG9yLCAzKTsKLX0KLQotdGVtcGxhdGUgPD4KLXZvaWQgRm9ybWF0TnVtYmVyPGRvdWJsZT4oY2hhciogb3V0cHV0LCBkb3VibGUgdmFsdWUpIHsKLSAgY29uc3RleHByIGludDY0X3Qga0Rlbm9taW5hdG9yID0gMTAwMDsKLSAgRm9ybWF0SW50ZWdlckRpdmlkZShvdXRwdXQsIHN0YXRpY19jYXN0PGludDY0X3Q+KHZhbHVlICoga0Rlbm9taW5hdG9yKSwKLSAgICAgICAgICAgICAgICAgICAgICBrRGVub21pbmF0b3IsIDMpOwotfQotfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2JlbmNobWFya2luZy9sb2dfdXRpbHMuaCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9iZW5jaG1hcmtpbmcvbG9nX3V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlNzNmNDguLjAwMDAwMDAKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2JlbmNobWFya2luZy9sb2dfdXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vKiBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotCi1MaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLXlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLVlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLVVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi1XSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLVNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLWxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotI2lmbmRlZiBURkxNX0JFTkNITUFSS19JTlRFUk5BTF9MT0dfVVRJTFNfSF8KLSNkZWZpbmUgVEZMTV9CRU5DSE1BUktfSU5URVJOQUxfTE9HX1VUSUxTX0hfCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8Y3N0ZGFyZz4KLSNpbmNsdWRlIDxjc3RkaW50PgotI2luY2x1ZGUgPGNzdHJpbmc+Ci0KLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fbG9nLmgiCi0KLW5hbWVzcGFjZSB0ZmxpdGUgewotCi0vLyBUaGUgbWF4bWltdW0gbGVuZ3RoIG9mIGEgc3RyaW5nLgotc3RhdGljIGNvbnN0ZXhwciBpbnQga01heFN0cmluZ0xlbmd0aCA9IDMyOwotCi0vLyBUaGUgbWF4aW11bSBsZW5ndGggb2YgYSB0YWJsZSByb3csIGFwcGxpZXMgdG8gdGhlIGhlYWRlciBhcyB3ZWxsLgotc3RhdGljIGNvbnN0ZXhwciBpbnQga01heFJvd0xlbmd0aCA9IDEwMDsKLQotLy8gVGhlIGRlZmF1bHQgcGFkZGluZyBiZXR3ZWVuIGNvbHVtbnMgaW4gYSB0YWJsZS4KLXN0YXRpYyBjb25zdGV4cHIgaW50IGtEZWZhdWx0Q29sdW1uUGFkZGluZyA9IDQ7Ci0KLS8vIERlZmluZXMgaG93IGZvcm1hdHRlZCBkYXRhIGlzIHByaW50ZWQgdG8gc3Rkb3V0LgotZW51bSBjbGFzcyBQcmV0dHlQcmludFR5cGUgewotICAvLyBQcmludHMgYXMgYSBDU1YgZmlsZS4KLSAga0NzdiwKLSAgLy8gUHJpbnRzIGFzIGEgZm9ybWF0dGVkIHRhYmxlLgotICBrVGFibGUsCi19OwotCi0vLyBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGxvbmdlc3Qgc3RyaW5nIGluIGFuIGFycmF5LgotLy8gQXJnczoKLS8vIC0gc3RyaW5nczogQW4gYXJyYXkgb2Ygc3RyaW5ncy4KLS8vIC0gY291bnQ6IFRoZSBudW1iZXIgb2Ygc3RyaW5ncyBpbiB0aGUgYXJyYXkuCi1pbnQgR2V0TG9uZ2VzdFN0cmluZ0xlbmd0aChjb25zdCBjaGFyIHN0cmluZ3NbXVtrTWF4U3RyaW5nTGVuZ3RoXSwgaW50IGNvdW50KTsKLQotLy8gQWRkcyBwYWRkaW5nIGJldHdlZW4gdHdvIGNvbHVtbnMgaW4gYSB0YWJsZS4KLS8vIGV4KSAiaGVsbG8iIGlzIGJlaW5nIGluc2VydGVkIGludG8gYSBjb2x1bW4uIFRoZSBsYXJnZXN0IHZhbHVlIGluIHRoYXQgY29sdW1uCi0vLyAgICAgaXMgMTAsIGFuZCB0aGVyZSdzIGEgZ2xvYmFsIHBhZGRpbmcgb2YgNCBzcGFjZXMuIFRoZXJlZm9yZSwgOSBzcGFjZXMgKDEwCi0vLyAgICAgLSA1ICsgNCkgYXJlIGFkZGVkIGFzIHBhZGRpbmcuCi0vLyBBcmdzOgotLy8gLSBzdHJpbmc6IFRoZSBpbnB1dCBwYWRkaW5nIHN0cmluZy4KLS8vIC0gc2l6ZTogVGhlIHNpemUgb2YgdGhlIHN0cmluZyB0aGF0J3MgYmVpbmcgaW5zZXJ0ZWQgaW50byBhIGNvbHVtbi4KLS8vIC0gbWF4X3NpemU6IFRoZSBzaXplIG9mIHRoZSBsYXJnZXN0IHN0cmluZyBpbiB0aGUgY29sdW1uLgotLy8gLSBwYWRkaW5nOiBUaGUgYW1vdW50IG9mIHBhZGRpbmcgdG8gYWRkIHRvIGVhY2ggY29sdW1uIHJlZ2FyZGxlc3Mgb2YgaXRzCi0vLyAgICAgc2l6ZS4KLXZvaWQgRmlsbENvbHVtblBhZGRpbmcoY2hhciogc3RyaW5nLCBpbnQgc2l6ZSwgaW50IG1heF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGFkZGluZyA9IGtEZWZhdWx0Q29sdW1uUGFkZGluZyk7Ci0KLS8vIEZpbGxzIGEgc3RyaW5nIHdpdGggYSBzcGVjaWZpZWQgdmFsdWUuCi0vLyBBcmdzOgotLy8gLSBzdHJpbmc6IFRoZSBpbnB1dCBzdHJpbmcuIFRoaXMgaXMgZmlsbGVkIGluIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS4KLS8vIC0gc2l6ZTogVGhlIHNpemUgb2YgdGhlIHN0cmluZyBhZnRlciBiZWluZyBmaWxsZWQgaW4uIFRoaXMgbXVzdCBiZSBsZXNzIHRoYW4KLS8vICAgICB0aGUgYWxsb2NhdGVkIHNwYWNlIGZvciB0aGUgc3RyaW5nLgotLy8gLSBidWZmZXJfc2l6ZTogVGhlIHNpemUgb2YgdGhlIHN0cmluZydzIGJ1ZmZlci4KLS8vIC0gdmFsdWU6IFRoZSB2YWx1ZSB0byBpbnNlcnQgaW50byB0aGUgc3RyaW5nLiBEZWZhdWx0cyB0byBhIHNwYWNlLgotdm9pZCBGaWxsU3RyaW5nKGNoYXIqIHN0cmluZywgaW50IHNpemUsIGludCBidWZmZXJfc2l6ZSwgY2hhciB2YWx1ZSA9ICcgJyk7Ci0KLS8vIENvbmNhdGVuYXRlcyB0aGUgaW5wdXQgc3RyaW5nIG9udG8gdGhlIGZpcnN0LgotLy8gQXJnczoKLS8vIC0gb3V0cHV0OiBUaGUgZGVzdGluYXRpb24gc3RyaW5nIGZvciB3aGVyZSB0byBhcHBlbmQgaW5wdXQuCi0vLyAtIGlucHV0OiBUaGUgaW5wdXQgc3RyaW5nIHRvIGNvbmNhdGVuYXRlLgotLy8gLSBzaXplOiBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gY29uY2F0ZW5hdGUgZnJvbSB0aGUgZmlyc3Qgc3RyaW5nLiBJZgotLy8gICAgIG5lZ2F0aXZlLCB0aGUgd2hvbGUgaW5wdXQgc3RyaW5nIHdpbGwgYmUgY29uY2F0ZW5hdGVkLgotdm9pZCBNaWNyb1N0cmNhdChjaGFyKiBvdXRwdXQsIGNvbnN0IGNoYXIqIGlucHV0LCBpbnQgc2l6ZSA9IC0xKTsKLQotLy8gQ29waWVzIHRoZSBpbnB1dCBzdHJpbmcgaW50byB0aGUgb3V0cHV0Lgotdm9pZCBNaWNyb1N0cmNweShjaGFyKiBvdXRwdXQsIGNvbnN0IGNoYXIqIGlucHV0KTsKLQotLy8gRm9ybWF0cyBhIGRpdmlzaW9uIG9wZXJhdGlvbiB0byBoYXZlIGEgc3BlY2lmaWVkIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcy4KLS8vIEFyZ3M6Ci0vLyAtIG91dHB1dDogVGhlIG91dHB1dCBzdHJpbmcgdG8gYmUgZm9ybWF0dGVkLgotLy8gLSBudW1lcmF0b3I6IFRoZSBudW1lcmF0b3IgaW4gdGhlIGRpdmlzaW9uIG9wZXJhdGlvbi4KLS8vIC0gZGVub21pbmF0b3I6IFRoZSBkZW5vbWluYXRvciBpbiB0aGUgZGl2aXNpb24gb3BlcmF0aW9uLgotLy8gLSBkZWNpbWFsIHBsYWNlczogVGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0byBwcmludCB0by4KLXZvaWQgRm9ybWF0SW50ZWdlckRpdmlkZShjaGFyKiBvdXRwdXQsIGludDY0X3QgbnVtZXJhdG9yLCBpbnQ2NF90IGRlbm9taW5hdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWNpbWFsX3BsYWNlcyk7Ci0KLS8vIEZvcm1hdHMgYSBkaXZpc2lvbiBvcGVyYXRpb24gYXMgYSBwZXJjZW50YWdlLgotLy8gQXJnczoKLS8vIC0gb3V0cHV0OiBUaGUgb3V0cHV0IHN0cmluZyB0byBiZSBmb3JtYXR0ZWQuCi0vLyAtIG51bWVyYXRvcjogVGhlIG51bWVyYXRvciBpbiB0aGUgZGl2aXNpb24gb3BlcmF0aW9uLgotLy8gLSBkZW5vbWluYXRvcjogVGhlIGRlbm9taW5hdG9yIGluIHRoZSBkaXZpc2lvbiBvcGVyYXRpb24uCi0vLyAtIGRlY2ltYWwgcGxhY2VzOiBUaGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRvIHByaW50IHRvLgotdm9pZCBGb3JtYXRBc1BlcmNlbnRhZ2UoY2hhciogb3V0cHV0LCBpbnQ2NF90IG51bWVyYXRvciwgaW50NjRfdCBkZW5vbWluYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWNpbWFsX3BsYWNlcyk7Ci0KLXZvaWQgUHJldHR5UHJpbnRUYWJsZUhlYWRlcihQcmV0dHlQcmludFR5cGUgdHlwZSwgY29uc3QgY2hhciogdGFibGVfbmFtZSk7Ci0KLS8vIEZvcm1hdHMgYSBudW1iZXIgYXMgYSBzdHJpbmcuCi0vLyBBcmdzOgotLy8gLSBvdXRwdXQ6IFRoZSBsb2NhdGlvbiBvZiB3aGVyZSB0byB3cml0ZSB0aGUgZm9ybWF0dGVkIG51bWJlci4KLS8vIC0gdmFsdWU6IFRoZSB2YWx1ZSB0byB3cml0ZSB0byBhIHN0cmluZy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdm9pZCBGb3JtYXROdW1iZXIoY2hhciogb3V0cHV0LCBUIHZhbHVlKTsKLQotLy8gUHJldHR5IHByaW50cyBhIHRhYmxlIHRvIHN0ZG91dC4KLS8vIE5vdGU6IGtNYXhSb3dzIGFuZCBrQ29sdW1ucyBzaG91bGQgZGVzY3JpYmUgdGhlIGFsbG9jYXRlZCBzaXplIG9mIHRoZSB0YWJsZSwKLS8vICAgICAgIG5vdCB0aGUgYW1vdW50IG9mIGRhdGEgdGhhdCBpcyBwb3B1bGF0ZWQuIEl0IGlzIHJlcXVpcmVkIHRoYXQgYWxsCi0vLyAgICAgICBjb2x1bW5zIGFyZSBmaWxsZWQgb3V0LCBidXQgbm90IGFsbCByb3dzLgotLy8KLS8vIGV4KSBQcmludFRhYmxlPDMsIDI1PihoZWFkZXJzLCBkYXRhLCA0KTsKLS8vICAgICBUaGlzIHdpbGwgcHJpbnQgYSB0YWJsZSB3aXRoIDMgY29sdW1ucyBhbmQgNCByb3dzLiBJbiB0aGlzIGV4YW1wbGUsIGl0Ci0vLyAgICAgaXMgcmVxdWlyZWQgdGhhdCBkYXRhIGlzIGRlZmluZWQgYXMgY2hhclszXVsyNV1ba01heFN0cmluZ0xlbmd0aF0gdG8KLS8vICAgICBwcm9wZXJseSBwcmludC4KLS8vCi0vLyBvcCAgICAgICAgY3ljbGVzICAgIGNwdSAlCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBmb28gICAgIHwgMTAwMCAgICAgfCAxMAotLy8gYmFyICAgICB8IDI1MDAgICAgIHwgMjUKLS8vIGJheiAgICAgfCAxMDAwICAgICB8IDEwCi0vLyBsb3JlbSAgIHwgMjAwMCAgICAgfCAyMAotLy8KLS8vIEFyZ3M6Ci0vLyAtIGhlYWRlcnM6IEEgMUQgYXJyYXkgb2Ygc3RyaW5ncyBjb250YWluaW5nIHRoZSBoZWFkZXJzIG9mIHRoZSB0YWJsZS4gVGhpcwotLy8gICAgIG11c3QgYmUgZXF1YWwgaW4gc2l6ZSB0byBrQ29sdW1ucy4KLS8vIC0gZGF0YTogQSAyRCBhcnJheSBvZiBzdHJpbmcgZGF0YSBvcmdhbml6ZWQgaW4gW2NvbHVtbnMsIHJvd3NdLiBBcyBzdGF0ZWQKLS8vICAgICBhYm92ZSwgaXQgaXMgcmVxdWlyZWQgdGhhdCBhbGwgY29sdW1ucyBhcmUgcG9wdWxhdGVkLCBidXQgbm90IGFsbCByb3dzLgotLy8gLSByb3dzOiBUaGUgbnVtYmVyIG9mIHBvcHVsYXRlZCByb3dzIGluIGBkYXRhYC4KLXRlbXBsYXRlIDxpbnQga01heFJvd3MsIGludCBrQ29sdW1ucz4KLXZvaWQgUHJpbnRUYWJsZShjb25zdCBjaGFyIGhlYWRlcnNba0NvbHVtbnNdW2tNYXhTdHJpbmdMZW5ndGhdLAotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgZGF0YVtrQ29sdW1uc11ba01heFJvd3NdW2tNYXhTdHJpbmdMZW5ndGhdLAotICAgICAgICAgICAgICAgIGNvbnN0IGludCByb3dzKSB7Ci0gIC8vIEdldCB0aGUgbWF4aW11bSB3aWR0aCBmb3IgZWFjaCBjb2x1bW4gaW4gdGhlIHRhYmxlLgotICBpbnQgbWF4X2NvbHVtbl93aWR0aFtrQ29sdW1uc107Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwga0NvbHVtbnM7ICsraSkgewotICAgIG1heF9jb2x1bW5fd2lkdGhbaV0gPSBzdGQ6Om1heChHZXRMb25nZXN0U3RyaW5nTGVuZ3RoKGRhdGFbaV0sIHJvd3MpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHN0cmxlbihoZWFkZXJzW2ldKSkpOwotICB9Ci0KLSAgLy8gQWRkIHBhZGRpbmcgYmV0d2VlbiBlYWNoIGl0ZW0gaW4gdGhlIGhlYWRlciBzbyBpdCBjYW4gYmUgcHJpbnRlZCBvbiBvbmUKLSAgLy8gbGluZS4KLSAgY2hhciBoZWFkZXJfc3BhY2VzW2tDb2x1bW5zXVtrTWF4U3RyaW5nTGVuZ3RoXTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQ29sdW1uczsgKytpKSB7Ci0gICAgRmlsbENvbHVtblBhZGRpbmcoaGVhZGVyX3NwYWNlc1tpXSwgc3RybGVuKGhlYWRlcnNbaV0pLCBtYXhfY29sdW1uX3dpZHRoW2ldLAotICAgICAgICAgICAgICAgICAgICAgIGtEZWZhdWx0Q29sdW1uUGFkZGluZyArIDIpOwotICB9Ci0KLSAgLy8gUHJpbnQgdGhlIGhlYWRlci4KLSAgY2hhciBoZWFkZXJba01heFJvd0xlbmd0aF07Ci0gIG1lbXNldChoZWFkZXIsIDAsIGtNYXhSb3dMZW5ndGgpOwotICBmb3IgKGludCBpID0gMDsgaSA8IGtDb2x1bW5zOyArK2kpIHsKLSAgICBNaWNyb1N0cmNhdChoZWFkZXIsIGhlYWRlcnNbaV0pOwotICAgIE1pY3JvU3RyY2F0KGhlYWRlciwgaGVhZGVyX3NwYWNlc1tpXSk7Ci0gIH0KLSAgTWljcm9QcmludGYoIiVzIiwgaGVhZGVyKTsKLQotICAvLyBQcmludCBhIHNlcGFyYXRvciB0byBzZXBhcmF0ZSB0aGUgaGVhZGVyIGZyb20gdGhlIGRhdGEuCi0gIGNoYXIgc2VwYXJhdG9yW2tNYXhSb3dMZW5ndGhdOwotICBGaWxsU3RyaW5nKHNlcGFyYXRvciwgc3RybGVuKGhlYWRlcikgLSAxLCBrTWF4Um93TGVuZ3RoLCAnLScpOwotICBNaWNyb1ByaW50ZigiJXMiLCBzZXBhcmF0b3IpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgKytpKSB7Ci0gICAgY2hhciBzcGFjZXNba0NvbHVtbnNdW2tNYXhTdHJpbmdMZW5ndGhdOwotICAgIGZvciAoaW50IGogPSAwOyBqIDwga0NvbHVtbnM7ICsraikgewotICAgICAgRmlsbENvbHVtblBhZGRpbmcoc3BhY2VzW2pdLCBzdHJsZW4oZGF0YVtqXVtpXSksIG1heF9jb2x1bW5fd2lkdGhbal0pOwotICAgIH0KLQotICAgIGNoYXIgcm93W2tNYXhSb3dMZW5ndGhdOwotICAgIG1lbXNldChyb3csIDAsIGtNYXhSb3dMZW5ndGgpOwotCi0gICAgLy8gQ29uY2F0ZW5hdGUgZWFjaCBjb2x1bW4gaW4gYSByb3cgd2l0aCB0aGUgZm9ybWF0ICJbZGF0YV1bcGFkZGluZ118ICIKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IGtDb2x1bW5zOyArK2opIHsKLSAgICAgIE1pY3JvU3RyY2F0KHJvdywgZGF0YVtqXVtpXSk7Ci0gICAgICBNaWNyb1N0cmNhdChyb3csIHNwYWNlc1tqXSk7Ci0gICAgICBNaWNyb1N0cmNhdChyb3csICJ8ICIpOwotICAgIH0KLQotICAgIE1pY3JvUHJpbnRmKCIlcyIsIHJvdyk7Ci0gIH0KLQotICBNaWNyb1ByaW50ZihzZXBhcmF0b3IpOwotICBNaWNyb1ByaW50ZigiIik7Ci19Ci0KLS8vIFByZXR0eSBwcmludHMgYSBjc3YgdG8gc3Rkb3V0LgotLy8gTm90ZToga01heFJvd3MgYW5kIGtDb2x1bW5zIHNob3VsZCBkZXNjcmliZSB0aGUgYWxsb2NhdGVkIHNpemUgb2YgdGhlIHRhYmxlLAotLy8gICAgICAgbm90IHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IGlzIHBvcHVsYXRlZC4gSXQgaXMgcmVxdWlyZWQgdGhhdCBhbGwKLS8vICAgICAgIGNvbHVtbnMgYXJlIGZpbGxlZCBvdXQsIGJ1dCBub3QgYWxsIHJvd3MuCi0vLwotLy8gZXgpCi0vLyBvcCxjeWNsZXMsJWNwdQotLy8gZm9vLDEwMDAsMTAKLS8vIGJhciwyNTAwLDI1Ci0vLyBiYXosMTAwMCwxMAotLy8KLS8vIEFyZ3M6Ci0vLyAtIGhlYWRlcnM6IEEgMUQgYXJyYXkgb2Ygc3RyaW5ncyBjb250YWluaW5nIHRoZSBoZWFkZXJzIG9mIHRoZSB0YWJsZS4gVGhpcwotLy8gICAgIG11c3QgYmUgZXF1YWwgaW4gc2l6ZSB0byBrQ29sdW1ucy4KLS8vIC0gZGF0YTogQSAyRCBhcnJheSBvZiBzdHJpbmcgZGF0YSBvcmdhbml6ZWQgaW4gW2NvbHVtbnMsIHJvd3NdLiBBcyBzdGF0ZWQKLS8vICAgICBhYm92ZSwgaXQgaXMgcmVxdWlyZWQgdGhhdCBhbGwgY29sdW1ucyBhcmUgcG9wdWxhdGVkLCBidXQgbm90IGFsbCByb3dzLgotLy8gLSByb3dzOiBUaGUgbnVtYmVyIG9mIHBvcHVsYXRlZCByb3dzIGluIGBkYXRhYC4KLXRlbXBsYXRlIDxpbnQga01heFJvd3MsIGludCBrQ29sdW1ucz4KLXZvaWQgUHJpbnRDc3YoY29uc3QgY2hhciBoZWFkZXJzW2tDb2x1bW5zXVtrTWF4U3RyaW5nTGVuZ3RoXSwKLSAgICAgICAgICAgICAgY29uc3QgY2hhciBkYXRhW2tDb2x1bW5zXVtrTWF4Um93c11ba01heFN0cmluZ0xlbmd0aF0sCi0gICAgICAgICAgICAgIGNvbnN0IGludCByb3dzKSB7Ci0gIGNoYXIgaGVhZGVyW2tNYXhSb3dMZW5ndGhdOwotICBtZW1zZXQoaGVhZGVyLCAwLCBrTWF4Um93TGVuZ3RoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQ29sdW1uczsgKytpKSB7Ci0gICAgTWljcm9TdHJjYXQoaGVhZGVyLCBoZWFkZXJzW2ldKTsKLSAgICBpZiAoaSA8IGtDb2x1bW5zIC0gMSkgewotICAgICAgTWljcm9TdHJjYXQoaGVhZGVyLCAiLCIpOwotICAgIH0KLSAgfQotCi0gIE1pY3JvUHJpbnRmKCIlcyIsIGhlYWRlcik7Ci0KLSAgY2hhciByb3dba01heFJvd0xlbmd0aF07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgcm93czsgKytpKSB7Ci0gICAgbWVtc2V0KHJvdywgMCwga01heFJvd0xlbmd0aCk7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBrQ29sdW1uczsgKytqKSB7Ci0gICAgICBNaWNyb1N0cmNhdChyb3csIGRhdGFbal1baV0pOwotICAgICAgaWYgKGogPCBrQ29sdW1ucyAtIDEpIHsKLSAgICAgICAgTWljcm9TdHJjYXQocm93LCAiLCIpOwotICAgICAgfQotICAgIH0KLQotICAgIE1pY3JvUHJpbnRmKCIlcyIsIHJvdyk7Ci0gIH0KLQotICBNaWNyb1ByaW50ZigiIik7ICAvLyBTZXJ2ZXMgYXMgYSBuZXcgbGluZS4KLX0KLQotLy8gUHJpbnRzIGEgMkQgYXJyYXkgb2Ygc3RyaW5ncyBpbiBhIGZvcm1hdHRlZCBtYW5uZXIgYWxvbmcgd2l0aCBhIHRhYmxlIG5hbWUKLS8vIHRoYXQgaW5jbHVkZXMgdGhlIHRhYmxlIHR5cGUuCi0vLwotLy8gTm90ZToga01heFJvd3MgYW5kIGtDb2x1bW5zIHNob3VsZCBkZXNjcmliZSB0aGUgYWxsb2NhdGVkIHNpemUgb2YgdGhlIHRhYmxlLAotLy8gICAgICAgbm90IHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IGlzIHBvcHVsYXRlZC4gSXQgaXMgcmVxdWlyZWQgdGhhdCBhbGwKLS8vICAgICAgIGNvbHVtbnMgYXJlIGZpbGxlZCBvdXQsIGJ1dCBub3QgYWxsIHJvd3MuCi0vLwotLy8gZXgpIFByZXR0eVByaW50OjprQ3N2IHdpbGwgcHJpbnQgYSBjc3Ygd2l0aCBhIFtbIENTViBdXTogdGFibGVfbmFtZSBoZWFkZXIuCi0vLwotLy8gQXJnczoKLS8vIC0gaGVhZGVyczogQSAxRCBhcnJheSBvZiBzdHJpbmdzIGNvbnRhaW5pbmcgdGhlIGhlYWRlcnMgb2YgdGhlIHRhYmxlLiBUaGlzCi0vLyAgICAgbXVzdCBiZSBlcXVhbCBpbiBzaXplIHRvIGtDb2x1bW5zLgotLy8gLSBkYXRhOiBBIDJEIGFycmF5IG9mIHN0cmluZyBkYXRhIG9yZ2FuaXplZCBpbiBbY29sdW1ucywgcm93c10uIEFzIHN0YXRlZAotLy8gICAgIGFib3ZlLCBpdCBpcyByZXF1aXJlZCB0aGF0IGFsbCBjb2x1bW5zIGFyZSBwb3B1bGF0ZWQsIGJ1dCBub3QgYWxsIHJvd3MuCi0vLyAtIHJvd3M6IFRoZSBudW1iZXIgb2YgcG9wdWxhdGVkIHJvd3MgaW4gYGRhdGFgLgotLy8gLSB0eXBlOiBUaGUgZm9ybWF0IHR5cGUgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBwcmV0dHkgcHJpbnQuCi0vLyAtIHRhYmxlX25hbWU6IFRoZSBuYW1lIG9mIHRoZSB0YWJsZSB0byBiZSBwcmludGVkIGFsb25nc2lkZSB0aGUgZm9ybWF0IHR5cGUuCi10ZW1wbGF0ZSA8aW50IGtNYXhSb3dzLCBpbnQga0NvbHVtbnM+Ci12b2lkIFByaW50Rm9ybWF0dGVkRGF0YShjb25zdCBjaGFyIGhlYWRlcnNba0NvbHVtbnNdW2tNYXhTdHJpbmdMZW5ndGhdLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciBkYXRhW2tDb2x1bW5zXVtrTWF4Um93c11ba01heFN0cmluZ0xlbmd0aF0sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgcm93cywgY29uc3QgUHJldHR5UHJpbnRUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0YWJsZV9uYW1lKSB7Ci0gIFByZXR0eVByaW50VGFibGVIZWFkZXIodHlwZSwgdGFibGVfbmFtZSk7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgUHJldHR5UHJpbnRUeXBlOjprQ3N2OgotICAgICAgUHJpbnRDc3Y8a01heFJvd3MsIGtDb2x1bW5zPihoZWFkZXJzLCBkYXRhLCByb3dzKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUHJldHR5UHJpbnRUeXBlOjprVGFibGU6Ci0gICAgICBQcmludFRhYmxlPGtNYXhSb3dzLCBrQ29sdW1ucz4oaGVhZGVycywgZGF0YSwgcm93cyk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgdGZsaXRlCi0KLSNlbmRpZiAgLy8gVEZMTV9CRU5DSE1BUktfSU5URVJOQUxfTE9HX1VUSUxTX0hfCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvYmVuY2htYXJraW5nL21ldHJpY3MuY2MgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvYmVuY2htYXJraW5nL21ldHJpY3MuY2MKaW5kZXggMTE1ZDg3OS4uM2E0YmY3ZSAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2JlbmNobWFya2luZy9tZXRyaWNzLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9iZW5jaG1hcmtpbmcvbWV0cmljcy5jYwpAQCAtMTUsNDQgKzE1LDcwIEBACiAKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvYmVuY2htYXJraW5nL21ldHJpY3MuaCIKIAotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCiAjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CiAKLSNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvYmVuY2htYXJraW5nL2xvZ191dGlscy5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9rZXJuZWxzL2ludGVybmFsL2NvbXBhdGliaWxpdHkuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fbG9nLmgiCiAKIG5hbWVzcGFjZSB0ZmxpdGUgewogCi12b2lkIExvZ0FyZW5hQWxsb2NhdGlvbnMoCituYW1lc3BhY2UgeworCitzdHJ1Y3QgTG9nQXJlbmFSZWNvcmQgeworICBjb25zdCBjaGFyKiB0aXRsZTsKKyAgaW50IGFsbG9jYXRpb25zOworICBmbG9hdCBwZXJjZW50YWdlOworfTsKKworc3RydWN0IExvZ0FsbG9jYXRpb25SZWNvcmQgeworICBjb25zdCBjaGFyKiB0aXRsZTsKKyAgaW50IHR5cGU7CisgIGludCB1c2VkX2J5dGVzOworICBpbnQgcmVxdWVzdGVkX2J5dGVzOworICBpbnQgY291bnQ7CisgIGZsb2F0IHBlcmNlbnRhZ2U7Cit9OworCitjb25zdGV4cHIgaW50IGtBcmVuYVJvd3MgPSAzOworY29uc3RleHByIGludCBrQXJlbmFDb2x1bW5zID0gMzsKKworY29uc3RleHByIGludCBrQWxsb2NhdGlvblR5cGVzID0gNzsKK2NvbnN0ZXhwciBpbnQga0FsbG9jYXRpb25Db2x1bW5zID0gNjsKKworY29uc3RleHByIGludCBrTWF4QnVmU2l6ZSA9IDEwMDsKKworTG9nQXJlbmFSZWNvcmQgR2V0TG9nQXJlbmFSZWNvcmQoCiAgICAgY29uc3QgdGZsaXRlOjpSZWNvcmRpbmdTaW5nbGVBcmVuYUJ1ZmZlckFsbG9jYXRvciogYWxsb2NhdG9yLAotICAgIGNvbnN0IFByZXR0eVByaW50VHlwZSB0eXBlKSB7Ci0gIGNvbnN0ZXhwciBpbnQga0FyZW5hUm93cyA9IDM7Ci0gIGNvbnN0ZXhwciBpbnQga0FyZW5hQ29scyA9IDM7CisgICAgaW50IHJvd19pbmRleCkgeworICBURkxJVEVfRENIRUNLKHJvd19pbmRleCA8IGtBcmVuYVJvd3MpOwogCiAgIGNvbnN0IHNpemVfdCB0b3RhbF9ieXRlcyA9IGFsbG9jYXRvci0+R2V0VXNlZEJ5dGVzKCk7CisgIGNvbnN0IHNpemVfdCBhbGxvY2F0aW9uc1tdID0ge3RvdGFsX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3ItPkdldE5vblBlcnNpc3RlbnRVc2VkQnl0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yLT5HZXRQZXJzaXN0ZW50VXNlZEJ5dGVzKCl9OworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6ZXh0ZW50PGRlY2x0eXBlKGFsbG9jYXRpb25zKT46OnZhbHVlID09IGtBcmVuYVJvd3MsCisgICAgICAgICAgICAgICAgImtBcmVuYVJvd3MgbWlzbWF0Y2giKTsKKyAgY29uc3QgY2hhciogdGl0bGVzW10gPSB7IlRvdGFsIiwgIk5vblBlcnNpc3RlbnQiLCAiUGVyc2lzdGVudCJ9OworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6ZXh0ZW50PGRlY2x0eXBlKHRpdGxlcyk+Ojp2YWx1ZSA9PSBrQXJlbmFSb3dzLAorICAgICAgICAgICAgICAgICJrQXJlbmFSb3dzIG1pc21hdGNoIik7CiAKLSAgc2l6ZV90IGFsbG9jYXRpb25zW2tBcmVuYVJvd3NdID0ge3RvdGFsX2J5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yLT5HZXROb25QZXJzaXN0ZW50VXNlZEJ5dGVzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3ItPkdldFBlcnNpc3RlbnRVc2VkQnl0ZXMoKX07Ci0gIGNoYXIgdGl0bGVzW2tBcmVuYVJvd3NdW2tNYXhTdHJpbmdMZW5ndGhdID0geyJUb3RhbCIsICJIZWFkIiwgIlRhaWwifTsKLSAgY2hhciBoZWFkZXJzW2tBcmVuYVJvd3NdW2tNYXhTdHJpbmdMZW5ndGhdID0geyJBcmVuYSIsICJCeXRlcyIsICIlIEFyZW5hIn07CisgIExvZ0FyZW5hUmVjb3JkIHJlY29yZCA9IHt9OworICByZWNvcmQudGl0bGUgPSB0aXRsZXNbcm93X2luZGV4XTsKKyAgcmVjb3JkLmFsbG9jYXRpb25zID0gYWxsb2NhdGlvbnNbcm93X2luZGV4XTsKKyAgcmVjb3JkLnBlcmNlbnRhZ2UgPSByZWNvcmQuYWxsb2NhdGlvbnMgKiAxMDAuMGYgLyB0b3RhbF9ieXRlczsKIAotICBjaGFyIGRhdGFba0FyZW5hQ29sc11ba0FyZW5hUm93c11ba01heFN0cmluZ0xlbmd0aF07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwga0FyZW5hUm93czsgKytpKSB7Ci0gICAgTWljcm9TdHJjcHkoZGF0YVswXVtpXSwgdGl0bGVzW2ldKTsKLSAgICBGb3JtYXROdW1iZXI8aW50MzJfdD4oZGF0YVsxXVtpXSwgYWxsb2NhdGlvbnNbaV0pOwotICAgIEZvcm1hdEFzUGVyY2VudGFnZShkYXRhWzJdW2ldLCBzdGF0aWNfY2FzdDxpbnQ2NF90PihhbGxvY2F0aW9uc1tpXSksCi0gICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDY0X3Q+KHRvdGFsX2J5dGVzKSwgMik7Ci0gIH0KLQotICBQcmludEZvcm1hdHRlZERhdGE8a0FyZW5hUm93cywga0FyZW5hQ29scz4oaGVhZGVycywgZGF0YSwga0FyZW5hUm93cywgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBcmVuYSIpOworICByZXR1cm4gcmVjb3JkOwogfQogCi12b2lkIExvZ0FsbG9jYXRpb25zKGNvbnN0IHRmbGl0ZTo6UmVjb3JkaW5nTWljcm9BbGxvY2F0b3ImIGFsbG9jYXRvciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgUHJldHR5UHJpbnRUeXBlIHR5cGUpIHsKLSAgY29uc3RleHByIGludCBrQWxsb2NhdGlvblR5cGVzID0gNzsKLSAgdGZsaXRlOjpSZWNvcmRlZEFsbG9jYXRpb25UeXBlIHR5cGVzW2tBbGxvY2F0aW9uVHlwZXNdID0geworTG9nQWxsb2NhdGlvblJlY29yZCBHZXRMb2dBbGxvY2F0aW9uUmVjb3JkKAorICAgIGNvbnN0IHRmbGl0ZTo6UmVjb3JkaW5nTWljcm9BbGxvY2F0b3ImIGFsbG9jYXRvciwgaW50IHJvd19pbmRleCkgeworICBURkxJVEVfRENIRUNLKHJvd19pbmRleCA8IGtBbGxvY2F0aW9uVHlwZXMpOworCisgIGNvbnN0IHRmbGl0ZTo6UmVjb3JkZWRBbGxvY2F0aW9uVHlwZSB0eXBlc1tdID0gewogICAgICAgdGZsaXRlOjpSZWNvcmRlZEFsbG9jYXRpb25UeXBlOjprVGZMaXRlRXZhbFRlbnNvckRhdGEsCiAgICAgICB0ZmxpdGU6OlJlY29yZGVkQWxsb2NhdGlvblR5cGU6OmtQZXJzaXN0ZW50VGZMaXRlVGVuc29yRGF0YSwKICAgICAgIHRmbGl0ZTo6UmVjb3JkZWRBbGxvY2F0aW9uVHlwZTo6a1BlcnNpc3RlbnRUZkxpdGVUZW5zb3JRdWFudGl6YXRpb25EYXRhLApAQCAtNjAsMzggKzg2LDIyNyBAQAogICAgICAgdGZsaXRlOjpSZWNvcmRlZEFsbG9jYXRpb25UeXBlOjprVGZMaXRlVGVuc29yVmFyaWFibGVCdWZmZXJEYXRhLAogICAgICAgdGZsaXRlOjpSZWNvcmRlZEFsbG9jYXRpb25UeXBlOjprTm9kZUFuZFJlZ2lzdHJhdGlvbkFycmF5LAogICAgICAgdGZsaXRlOjpSZWNvcmRlZEFsbG9jYXRpb25UeXBlOjprT3BEYXRhfTsKLQotICBjaGFyIHRpdGxlc1trQWxsb2NhdGlvblR5cGVzXVtrTWF4U3RyaW5nTGVuZ3RoXSA9IHsKLSAgICAgICJFdmFsIHRlbnNvciBkYXRhIiwKLSAgICAgICJQZXJzaXN0ZW50IHRlbnNvciBkYXRhIiwKLSAgICAgICJQZXJzaXN0ZW50IHF1YW50aXphdGlvbiBkYXRhIiwKLSAgICAgICJQZXJzaXN0ZW50IGJ1ZmZlciBkYXRhIiwKLSAgICAgICJUZW5zb3IgdmFyaWFibGUgYnVmZmVyIGRhdGEiLAotICAgICAgIk5vZGUgYW5kIHJlZ2lzdHJhdGlvbiBhcnJheSIsCi0gICAgICAiT3BlcmF0aW9uIGRhdGEifTsKLQotICBjb25zdGV4cHIgaW50IGtDb2x1bW5zID0gNjsKLSAgY29uc3QgY2hhciBoZWFkZXJzW2tDb2x1bW5zXVtrTWF4U3RyaW5nTGVuZ3RoXSA9IHsKLSAgICAgICJBbGxvY2F0aW9uIiwgIklkIiwgIlVzZWQiLCAiUmVxdWVzdGVkIiwgIkNvdW50IiwgIiUgTWVtb3J5In07Ci0KKyAgc3RhdGljX2Fzc2VydChzdGQ6OmV4dGVudDxkZWNsdHlwZSh0eXBlcyk+Ojp2YWx1ZSA9PSBrQWxsb2NhdGlvblR5cGVzLAorICAgICAgICAgICAgICAgICJrQWxsb2NhdGlvblR5cGVzIG1pc21hdGNoIik7CisgIGNvbnN0IGNoYXIqIHRpdGxlc1tdID0geyJFdmFsIHRlbnNvciBkYXRhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlBlcnNpc3RlbnQgdGVuc29yIGRhdGEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiUGVyc2lzdGVudCBxdWFudGl6YXRpb24gZGF0YSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJQZXJzaXN0ZW50IGJ1ZmZlciBkYXRhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIlRlbnNvciB2YXJpYWJsZSBidWZmZXIgZGF0YSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJOb2RlIGFuZCByZWdpc3RyYXRpb24gYXJyYXkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiT3BlcmF0aW9uIGRhdGEifTsKKyAgc3RhdGljX2Fzc2VydChzdGQ6OmV4dGVudDxkZWNsdHlwZSh0aXRsZXMpPjo6dmFsdWUgPT0ga0FsbG9jYXRpb25UeXBlcywKKyAgICAgICAgICAgICAgICAia0FsbG9jYXRpb25UeXBlcyBtaXNtYXRjaCIpOwogICBjb25zdCBzaXplX3QgdG90YWxfYnl0ZXMgPQogICAgICAgYWxsb2NhdG9yLkdldFNpbXBsZU1lbW9yeUFsbG9jYXRvcigpLT5HZXRVc2VkQnl0ZXMoKTsKKyAgdGZsaXRlOjpSZWNvcmRlZEFsbG9jYXRpb24gYWxsb2NhdGlvbiA9CisgICAgICBhbGxvY2F0b3IuR2V0UmVjb3JkZWRBbGxvY2F0aW9uKHR5cGVzW3Jvd19pbmRleF0pOwogCi0gIGNoYXIgZGF0YVtrQ29sdW1uc11ba0FsbG9jYXRpb25UeXBlc11ba01heFN0cmluZ0xlbmd0aF07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwga0FsbG9jYXRpb25UeXBlczsgKytpKSB7Ci0gICAgdGZsaXRlOjpSZWNvcmRlZEFsbG9jYXRpb24gYWxsb2NhdGlvbiA9Ci0gICAgICAgIGFsbG9jYXRvci5HZXRSZWNvcmRlZEFsbG9jYXRpb24odHlwZXNbaV0pOwotICAgIE1pY3JvU3RyY3B5KGRhdGFbMF1baV0sIHRpdGxlc1tpXSk7Ci0gICAgRm9ybWF0TnVtYmVyPGludDMyX3Q+KGRhdGFbMV1baV0sIHN0YXRpY19jYXN0PGludD4odHlwZXNbaV0pKTsKLSAgICBGb3JtYXROdW1iZXI8aW50MzJfdD4oZGF0YVsyXVtpXSwgYWxsb2NhdGlvbi51c2VkX2J5dGVzKTsKLSAgICBGb3JtYXROdW1iZXI8aW50MzJfdD4oZGF0YVszXVtpXSwgYWxsb2NhdGlvbi5yZXF1ZXN0ZWRfYnl0ZXMpOwotICAgIEZvcm1hdE51bWJlcjxpbnQzMl90PihkYXRhWzRdW2ldLCBhbGxvY2F0aW9uLmNvdW50KTsKLSAgICBGb3JtYXRBc1BlcmNlbnRhZ2UoZGF0YVs1XVtpXSwgc3RhdGljX2Nhc3Q8aW50NjRfdD4oYWxsb2NhdGlvbi51c2VkX2J5dGVzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50NjRfdD4odG90YWxfYnl0ZXMpLCAyKTsKKyAgTG9nQWxsb2NhdGlvblJlY29yZCByZWNvcmQgPSB7fTsKKyAgcmVjb3JkLnRpdGxlID0gdGl0bGVzW3Jvd19pbmRleF07CisgIHJlY29yZC50eXBlID0gc3RhdGljX2Nhc3Q8aW50Pih0eXBlc1tyb3dfaW5kZXhdKTsKKyAgcmVjb3JkLnVzZWRfYnl0ZXMgPSBhbGxvY2F0aW9uLnVzZWRfYnl0ZXM7CisgIHJlY29yZC5yZXF1ZXN0ZWRfYnl0ZXMgPSBhbGxvY2F0aW9uLnJlcXVlc3RlZF9ieXRlczsKKyAgcmVjb3JkLmNvdW50ID0gYWxsb2NhdGlvbi5jb3VudDsKKyAgcmVjb3JkLnBlcmNlbnRhZ2UgPSBhbGxvY2F0aW9uLnVzZWRfYnl0ZXMgKiAxMDAuMGYgLyB0b3RhbF9ieXRlczsKKworICByZXR1cm4gcmVjb3JkOworfQorCit0ZW1wbGF0ZSA8aW50IGtDb2x1bW5zPgordm9pZCBVcGRhdGVDb2x1bW5XaWR0aHMoaW50ICgmd2lkdGhzKVtrQ29sdW1uc10sIGNvbnN0IGNoYXIqIHNba0NvbHVtbnNdKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga0NvbHVtbnM7IGkrKykgeworICAgIHdpZHRoc1tpXSA9IHN0ZDo6bWF4KHdpZHRoc1tpXSwgc3RhdGljX2Nhc3Q8aW50PihzdGQ6OnN0cmxlbihzW2ldKSkpOworICB9Cit9CisKK3ZvaWQgVXBkYXRlQ29sdW1uV2lkdGhzKGludCAoJndpZHRocylba0FyZW5hQ29sdW1uc10sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2dBcmVuYVJlY29yZCYgcmVjb3JkKSB7CisgIGNoYXIgYnVmW2tNYXhCdWZTaXplXTsKKyAgaW50IGNvdW50OworCisgIGNvdW50ID0gTWljcm9TbnByaW50ZihidWYsIGtNYXhCdWZTaXplLCAiJXMiLCByZWNvcmQudGl0bGUpOworICB3aWR0aHNbMF0gPSBzdGQ6Om1heCh3aWR0aHNbMF0sIGNvdW50KTsKKyAgY291bnQgPSBNaWNyb1NucHJpbnRmKGJ1Ziwga01heEJ1ZlNpemUsICIlZCIsIHJlY29yZC5hbGxvY2F0aW9ucyk7CisgIHdpZHRoc1sxXSA9IHN0ZDo6bWF4KHdpZHRoc1sxXSwgY291bnQpOworICBjb3VudCA9IE1pY3JvU25wcmludGYoYnVmLCBrTWF4QnVmU2l6ZSwgIiUuMmYiLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZG91YmxlPihyZWNvcmQucGVyY2VudGFnZSkpOworICB3aWR0aHNbMl0gPSBzdGQ6Om1heCh3aWR0aHNbMl0sIGNvdW50KTsKK30KKwordm9pZCBVcGRhdGVDb2x1bW5XaWR0aHMoaW50ICgmd2lkdGhzKVtrQWxsb2NhdGlvbkNvbHVtbnNdLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9nQWxsb2NhdGlvblJlY29yZCYgcmVjb3JkKSB7CisgIGNoYXIgYnVmW2tNYXhCdWZTaXplXTsKKyAgaW50IGNvdW50OworCisgIGNvdW50ID0gTWljcm9TbnByaW50ZihidWYsIGtNYXhCdWZTaXplLCAiJXMiLCByZWNvcmQudGl0bGUpOworICB3aWR0aHNbMF0gPSBzdGQ6Om1heCh3aWR0aHNbMF0sIGNvdW50KTsKKyAgY291bnQgPSBNaWNyb1NucHJpbnRmKGJ1Ziwga01heEJ1ZlNpemUsICIlZCIsIHJlY29yZC50eXBlKTsKKyAgd2lkdGhzWzFdID0gc3RkOjptYXgod2lkdGhzWzFdLCBjb3VudCk7CisgIGNvdW50ID0gTWljcm9TbnByaW50ZihidWYsIGtNYXhCdWZTaXplLCAiJWQiLCByZWNvcmQudXNlZF9ieXRlcyk7CisgIHdpZHRoc1syXSA9IHN0ZDo6bWF4KHdpZHRoc1syXSwgY291bnQpOworICBjb3VudCA9IE1pY3JvU25wcmludGYoYnVmLCBrTWF4QnVmU2l6ZSwgIiVkIiwgcmVjb3JkLnJlcXVlc3RlZF9ieXRlcyk7CisgIHdpZHRoc1szXSA9IHN0ZDo6bWF4KHdpZHRoc1szXSwgY291bnQpOworICBjb3VudCA9IE1pY3JvU25wcmludGYoYnVmLCBrTWF4QnVmU2l6ZSwgIiVkIiwgcmVjb3JkLmNvdW50KTsKKyAgd2lkdGhzWzRdID0gc3RkOjptYXgod2lkdGhzWzRdLCBjb3VudCk7CisgIGNvdW50ID0gTWljcm9TbnByaW50ZihidWYsIGtNYXhCdWZTaXplLCAiJS4yZiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxkb3VibGU+KHJlY29yZC5wZXJjZW50YWdlKSk7CisgIHdpZHRoc1s1XSA9IHN0ZDo6bWF4KHdpZHRoc1s1XSwgY291bnQpOworfQorCit1c2luZyBCdWZmZXJEYXR1bSA9IHN0ZDo6dHVwbGU8Y2hhciosIGNoYXIqPjsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitCdWZmZXJEYXR1bSBBZGRUYWJsZUNvbHVtblZhbHVlKGNvbnN0IEJ1ZmZlckRhdHVtJiBidWZmZXIsIGNvbnN0IGNoYXIqIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbHVtbl93aWR0aCwgVCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogc2VwYXJhdG9yID0gbnVsbHB0cikgeworICBjaGFyKiBwOworICBjaGFyKiBwX2VuZDsKKyAgc3RkOjp0aWUocCwgcF9lbmQpID0gYnVmZmVyOworICBpbnQgY291bnQgPSBNaWNyb1NucHJpbnRmKHAsIHBfZW5kIC0gcCwgZm9ybWF0LCBjb2x1bW5fd2lkdGgsIHZhbHVlKTsKKyAgcCArPSBjb3VudDsKKyAgaWYgKHNlcGFyYXRvciAhPSBudWxscHRyICYmIHAgPCBwX2VuZCkgeworICAgIGNvdW50ID0gTWljcm9TbnByaW50ZihwLCBwX2VuZCAtIHAsIHNlcGFyYXRvcik7CisgICAgcCArPSBjb3VudDsKICAgfQogCi0gIFByaW50Rm9ybWF0dGVkRGF0YTxrQWxsb2NhdGlvblR5cGVzLCBrQ29sdW1ucz4oCi0gICAgICBoZWFkZXJzLCBkYXRhLCBrQWxsb2NhdGlvblR5cGVzLCB0eXBlLCAiQWxsb2NhdGlvbnMiKTsKKyAgaWYgKHAgPiBwX2VuZCkgeworICAgIHAgPSBwX2VuZDsKKyAgfQorCisgIHJldHVybiBzdGQ6Om1ha2VfdHVwbGUocCwgcF9lbmQpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKwordm9pZCBMb2dBcmVuYUFsbG9jYXRpb25zKAorICAgIGNvbnN0IHRmbGl0ZTo6UmVjb3JkaW5nU2luZ2xlQXJlbmFCdWZmZXJBbGxvY2F0b3IqIGFsbG9jYXRvciwKKyAgICBjb25zdCBQcmV0dHlQcmludFR5cGUgdHlwZSkgeworICBjb25zdCBjaGFyKiBoZWFkZXJzW10gPSB7IkFyZW5hIiwgIkJ5dGVzIiwgIiUlIEFyZW5hIn07CisgIHN0YXRpY19hc3NlcnQoc3RkOjpleHRlbnQ8ZGVjbHR5cGUoaGVhZGVycyk+Ojp2YWx1ZSA9PSBrQXJlbmFDb2x1bW5zLAorICAgICAgICAgICAgICAgICJrQXJlbmFDb2x1bW5zIG1pc21hdGNoIik7CisgIGNoYXIgYnVmZmVyW2tNYXhCdWZTaXplXTsKKyAgQnVmZmVyRGF0dW0gYnVmZmVyX2RhdHVtID0KKyAgICAgIHN0ZDo6bWFrZV90dXBsZShzdGQ6OmJlZ2luKGJ1ZmZlciksIHN0ZDo6ZW5kKGJ1ZmZlcikpOworICBpbnQgY29sdW1uX3dpZHRoc1trQXJlbmFDb2x1bW5zXSA9IHt9OworCisgIGNvbnN0IGNoYXIqIG91dHB1dF90eXBlOworICBjb25zdCBjaGFyKiBzdHJpbmdfZm9ybWF0OworICBpZiAodHlwZSA9PSBQcmV0dHlQcmludFR5cGU6OmtDc3YpIHsKKyAgICBvdXRwdXRfdHlwZSA9ICJDU1YiOworICAgIHN0cmluZ19mb3JtYXQgPSAiXCIlKnNcIiI7CisgIH0gZWxzZSB7CisgICAgb3V0cHV0X3R5cGUgPSAiVGFibGUiOworICAgIHN0cmluZ19mb3JtYXQgPSAiJSpzIjsKKworICAgIFVwZGF0ZUNvbHVtbldpZHRoczxrQXJlbmFDb2x1bW5zPihjb2x1bW5fd2lkdGhzLCBoZWFkZXJzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtBcmVuYVJvd3M7IGkrKykgeworICAgICAgTG9nQXJlbmFSZWNvcmQgcmVjb3JkID0gR2V0TG9nQXJlbmFSZWNvcmQoYWxsb2NhdG9yLCBpKTsKKyAgICAgIFVwZGF0ZUNvbHVtbldpZHRocyhjb2x1bW5fd2lkdGhzLCByZWNvcmQpOworICAgIH0KKyAgfQorCisgIE1pY3JvUHJpbnRmKCJbWyAlcyBdXTogQXJlbmEiLCBvdXRwdXRfdHlwZSk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQXJlbmFDb2x1bW5zOyBpKyspIHsKKyAgICAvLyBjcmVhdGUgaGVhZGVyCisgICAgY29uc3QgY2hhciogc2VwYXJhdG9yID0gbnVsbHB0cjsKKyAgICBpZiAoaSAhPSBrQXJlbmFDb2x1bW5zIC0gMSkgeworICAgICAgLy8gc2VwYXJhdG9yIGZvciBhbGwgYnV0IGxhc3QgY29sdW1uIHZhbHVlCisgICAgICBpZiAodHlwZSA9PSBQcmV0dHlQcmludFR5cGU6OmtDc3YpIHsKKyAgICAgICAgc2VwYXJhdG9yID0gIiwiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2VwYXJhdG9yID0gIiAgICI7CisgICAgICB9CisgICAgfQorICAgIGJ1ZmZlcl9kYXR1bSA9IEFkZFRhYmxlQ29sdW1uVmFsdWUoYnVmZmVyX2RhdHVtLCBzdHJpbmdfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uX3dpZHRoc1tpXSwgaGVhZGVyc1tpXSwgc2VwYXJhdG9yKTsKKyAgfQorICBNaWNyb1ByaW50ZihidWZmZXIpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwga0FyZW5hUm93czsgKytpKSB7CisgICAgLy8gY3JlYXRlIHJvd3MKKyAgICBjb25zdCBjaGFyKiBzZXBhcmF0b3IgPSAodHlwZSA9PSBQcmV0dHlQcmludFR5cGU6OmtDc3YpID8gIiwiIDogIiB8ICI7CisgICAgYnVmZmVyX2RhdHVtID0gc3RkOjptYWtlX3R1cGxlKHN0ZDo6YmVnaW4oYnVmZmVyKSwgc3RkOjplbmQoYnVmZmVyKSk7CisgICAgTG9nQXJlbmFSZWNvcmQgcmVjb3JkID0gR2V0TG9nQXJlbmFSZWNvcmQoYWxsb2NhdG9yLCBpKTsKKyAgICBidWZmZXJfZGF0dW0gPSBBZGRUYWJsZUNvbHVtblZhbHVlKAorICAgICAgICBidWZmZXJfZGF0dW0sIHN0cmluZ19mb3JtYXQsIGNvbHVtbl93aWR0aHNbMF0sIHJlY29yZC50aXRsZSwgc2VwYXJhdG9yKTsKKyAgICBidWZmZXJfZGF0dW0gPSBBZGRUYWJsZUNvbHVtblZhbHVlKGJ1ZmZlcl9kYXR1bSwgIiUqZCIsIGNvbHVtbl93aWR0aHNbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQuYWxsb2NhdGlvbnMsIHNlcGFyYXRvcik7CisgICAgYnVmZmVyX2RhdHVtID0gQWRkVGFibGVDb2x1bW5WYWx1ZShidWZmZXJfZGF0dW0sICIlKi4yZiIsIGNvbHVtbl93aWR0aHNbMl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxkb3VibGU+KHJlY29yZC5wZXJjZW50YWdlKSk7CisgICAgTWljcm9QcmludGYoYnVmZmVyKTsKKyAgfQorCisgIE1pY3JvUHJpbnRmKCIiKTsgIC8vIG91dHB1dCBuZXdsaW5lCit9CisKK3ZvaWQgTG9nQWxsb2NhdGlvbnMoY29uc3QgdGZsaXRlOjpSZWNvcmRpbmdNaWNyb0FsbG9jYXRvciYgYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmV0dHlQcmludFR5cGUgdHlwZSkgeworICBjb25zdCBjaGFyKiBoZWFkZXJzW10gPSB7IkFsbG9jYXRpb24iLCAiSWQiLCAgICAiVXNlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVxdWVzdGVkIiwgICJDb3VudCIsICIlJSBNZW1vcnkifTsKKyAgc3RhdGljX2Fzc2VydChzdGQ6OmV4dGVudDxkZWNsdHlwZShoZWFkZXJzKT46OnZhbHVlID09IGtBbGxvY2F0aW9uQ29sdW1ucywKKyAgICAgICAgICAgICAgICAia0FsbG9jYXRpb25Db2x1bW5zIG1pc21hdGNoIik7CisgIGNoYXIgYnVmZmVyW2tNYXhCdWZTaXplXTsKKyAgQnVmZmVyRGF0dW0gYnVmZmVyX2RhdHVtID0KKyAgICAgIHN0ZDo6bWFrZV90dXBsZShzdGQ6OmJlZ2luKGJ1ZmZlciksIHN0ZDo6ZW5kKGJ1ZmZlcikpOworICBpbnQgY29sdW1uX3dpZHRoc1trQWxsb2NhdGlvbkNvbHVtbnNdID0ge307CisKKyAgY29uc3QgY2hhciogb3V0cHV0X3R5cGU7CisgIGNvbnN0IGNoYXIqIHN0cmluZ19mb3JtYXQ7CisgIGlmICh0eXBlID09IFByZXR0eVByaW50VHlwZTo6a0NzdikgeworICAgIG91dHB1dF90eXBlID0gIkNTViI7CisgICAgc3RyaW5nX2Zvcm1hdCA9ICJcIiUqc1wiIjsKKyAgfSBlbHNlIHsKKyAgICBvdXRwdXRfdHlwZSA9ICJUYWJsZSI7CisgICAgc3RyaW5nX2Zvcm1hdCA9ICIlKnMiOworCisgICAgVXBkYXRlQ29sdW1uV2lkdGhzPGtBbGxvY2F0aW9uQ29sdW1ucz4oY29sdW1uX3dpZHRocywgaGVhZGVycyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQWxsb2NhdGlvblR5cGVzOyBpKyspIHsKKyAgICAgIExvZ0FsbG9jYXRpb25SZWNvcmQgcmVjb3JkID0gR2V0TG9nQWxsb2NhdGlvblJlY29yZChhbGxvY2F0b3IsIGkpOworICAgICAgVXBkYXRlQ29sdW1uV2lkdGhzKGNvbHVtbl93aWR0aHMsIHJlY29yZCk7CisgICAgfQorICB9CisKKyAgTWljcm9QcmludGYoIltbICVzIF1dOiBBbGxvY2F0aW9ucyIsIG91dHB1dF90eXBlKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGtBbGxvY2F0aW9uQ29sdW1uczsgaSsrKSB7CisgICAgLy8gY3JlYXRlIGhlYWRlcgorICAgIGNvbnN0IGNoYXIqIHNlcGFyYXRvciA9IG51bGxwdHI7CisgICAgaWYgKGkgIT0ga0FsbG9jYXRpb25Db2x1bW5zIC0gMSkgeworICAgICAgLy8gc2VwYXJhdG9yIGZvciBhbGwgYnV0IGxhc3QgY29sdW1uIHZhbHVlCisgICAgICBpZiAodHlwZSA9PSBQcmV0dHlQcmludFR5cGU6OmtDc3YpIHsKKyAgICAgICAgc2VwYXJhdG9yID0gIiwiOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc2VwYXJhdG9yID0gIiAgICI7CisgICAgICB9CisgICAgfQorICAgIGJ1ZmZlcl9kYXR1bSA9IEFkZFRhYmxlQ29sdW1uVmFsdWUoYnVmZmVyX2RhdHVtLCBzdHJpbmdfZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uX3dpZHRoc1tpXSwgaGVhZGVyc1tpXSwgc2VwYXJhdG9yKTsKKyAgfQorICBNaWNyb1ByaW50ZihidWZmZXIpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwga0FsbG9jYXRpb25UeXBlczsgKytpKSB7CisgICAgLy8gY3JlYXRlIHJvd3MKKyAgICBjb25zdCBjaGFyKiBzZXBhcmF0b3IgPSAodHlwZSA9PSBQcmV0dHlQcmludFR5cGU6OmtDc3YpID8gIiwiIDogIiB8ICI7CisgICAgYnVmZmVyX2RhdHVtID0gc3RkOjptYWtlX3R1cGxlKHN0ZDo6YmVnaW4oYnVmZmVyKSwgc3RkOjplbmQoYnVmZmVyKSk7CisgICAgTG9nQWxsb2NhdGlvblJlY29yZCByZWNvcmQgPSBHZXRMb2dBbGxvY2F0aW9uUmVjb3JkKGFsbG9jYXRvciwgaSk7CisgICAgYnVmZmVyX2RhdHVtID0gQWRkVGFibGVDb2x1bW5WYWx1ZSgKKyAgICAgICAgYnVmZmVyX2RhdHVtLCBzdHJpbmdfZm9ybWF0LCBjb2x1bW5fd2lkdGhzWzBdLCByZWNvcmQudGl0bGUsIHNlcGFyYXRvcik7CisgICAgYnVmZmVyX2RhdHVtID0gQWRkVGFibGVDb2x1bW5WYWx1ZShidWZmZXJfZGF0dW0sICIlKmQiLCBjb2x1bW5fd2lkdGhzWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkLnR5cGUsIHNlcGFyYXRvcik7CisgICAgYnVmZmVyX2RhdHVtID0gQWRkVGFibGVDb2x1bW5WYWx1ZShidWZmZXJfZGF0dW0sICIlKmQiLCBjb2x1bW5fd2lkdGhzWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkLnVzZWRfYnl0ZXMsIHNlcGFyYXRvcik7CisgICAgYnVmZmVyX2RhdHVtID0gQWRkVGFibGVDb2x1bW5WYWx1ZShidWZmZXJfZGF0dW0sICIlKmQiLCBjb2x1bW5fd2lkdGhzWzNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkLnJlcXVlc3RlZF9ieXRlcywgc2VwYXJhdG9yKTsKKyAgICBidWZmZXJfZGF0dW0gPSBBZGRUYWJsZUNvbHVtblZhbHVlKGJ1ZmZlcl9kYXR1bSwgIiUqZCIsIGNvbHVtbl93aWR0aHNbNF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQuY291bnQsIHNlcGFyYXRvcik7CisgICAgYnVmZmVyX2RhdHVtID0gQWRkVGFibGVDb2x1bW5WYWx1ZShidWZmZXJfZGF0dW0sICIlKi4yZiIsIGNvbHVtbl93aWR0aHNbNV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxkb3VibGU+KHJlY29yZC5wZXJjZW50YWdlKSk7CisgICAgTWljcm9QcmludGYoYnVmZmVyKTsKKyAgfQorCisgIE1pY3JvUHJpbnRmKCIiKTsgIC8vIG91dHB1dCBuZXdsaW5lCiB9CiAKIHZvaWQgTG9nQWxsb2NhdG9yRXZlbnRzKGNvbnN0IHRmbGl0ZTo6UmVjb3JkaW5nTWljcm9BbGxvY2F0b3ImIGFsbG9jYXRvciwKQEAgLTk5LDQgKzMxNCw1IEBACiAgIExvZ0FyZW5hQWxsb2NhdGlvbnMoYWxsb2NhdG9yLkdldFNpbXBsZU1lbW9yeUFsbG9jYXRvcigpLCB0eXBlKTsKICAgTG9nQWxsb2NhdGlvbnMoYWxsb2NhdG9yLCB0eXBlKTsKIH0KKwogfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2JlbmNobWFya2luZy9tZXRyaWNzLmggYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvYmVuY2htYXJraW5nL21ldHJpY3MuaAppbmRleCA1YzBjODgwLi45OTZjZGUxIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvYmVuY2htYXJraW5nL21ldHJpY3MuaAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvYmVuY2htYXJraW5nL21ldHJpY3MuaApAQCAtMTYsMTcgKzE2LDE5IEBACiAjaWZuZGVmIFRGTE1fQkVOQ0hNQVJLX0lOVEVSTkFMX01FVFJJQ1NfSF8KICNkZWZpbmUgVEZMTV9CRU5DSE1BUktfSU5URVJOQUxfTUVUUklDU19IXwogCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgPGNtYXRoPgotI2luY2x1ZGUgPGNzdGRpbnQ+Ci0KICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fcHJvZmlsZXIuaCIKICNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vcmVjb3JkaW5nX21pY3JvX2FsbG9jYXRvci5oIgotI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9iZW5jaG1hcmtpbmcvbG9nX3V0aWxzLmgiCiAKIG5hbWVzcGFjZSB0ZmxpdGUgewogCisvLyBEZWZpbmVzIGhvdyBmb3JtYXR0ZWQgZGF0YSBpcyBwcmludGVkIHRvIHN0ZG91dC4KK2VudW0gY2xhc3MgUHJldHR5UHJpbnRUeXBlIHsKKyAgLy8gUHJpbnRzIGFzIGEgQ1NWIGZpbGUuCisgIGtDc3YsCisgIC8vIFByaW50cyBhcyBhIGZvcm1hdHRlZCB0YWJsZS4KKyAga1RhYmxlLAorfTsKKwogLy8gTG9ncyB0aGUgYWxsb2NhdGlvbiBldmVudHMuIFByaW50cyBvdXQgdHdvIHRhYmxlcywgb25lIGZvciB0aGUgYXJlbmEKIC8vIGFsbG9jYXRpb25zLCBhbmQgb25lIGZvciBlYWNoIHR5cGUgb2YgVEZMTSBhbGxvY2F0aW9uIHR5cGUuCiAvLyBBcmdzOgpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2JlbmNobWFya2luZy9vcF9yZXNvbHZlci5oIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2JlbmNobWFya2luZy9vcF9yZXNvbHZlci5oCmluZGV4IDQ0Nzc0MWIuLjliOTg4NDkgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9iZW5jaG1hcmtpbmcvb3BfcmVzb2x2ZXIuaAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvYmVuY2htYXJraW5nL29wX3Jlc29sdmVyLmgKQEAgLTIzLDE1ICsyMywxNyBAQAogCiBuYW1lc3BhY2UgdGZsaXRlIHsKIAotaW5saW5lIFRmTGl0ZVN0YXR1cyBDcmVhdGVPcFJlc29sdmVyKAotICAgIHRmbGl0ZTo6TWljcm9NdXRhYmxlT3BSZXNvbHZlcjw5Nj4mIG9wX3Jlc29sdmVyKSB7Ci0gIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRGdWxseUNvbm5lY3RlZCgpKTsKLSAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZEFkZCgpKTsKK3VzaW5nIFRmbG1PcFJlc29sdmVyID0gTWljcm9NdXRhYmxlT3BSZXNvbHZlcjwxMTM+OworCitpbmxpbmUgVGZMaXRlU3RhdHVzIENyZWF0ZU9wUmVzb2x2ZXIoVGZsbU9wUmVzb2x2ZXImIG9wX3Jlc29sdmVyKSB7CiAgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRBYnMoKSk7CisgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRBZGQoKSk7CiAgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRBZGROKCkpOwogICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkQXJnTWF4KCkpOwogICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkQXJnTWluKCkpOwogICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkQXNzaWduVmFyaWFibGUoKSk7CisgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRBdmVyYWdlUG9vbDJEKCkpOworICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkQmF0Y2hNYXRNdWwoKSk7CiAgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRCYXRjaFRvU3BhY2VOZCgpKTsKICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZEJyb2FkY2FzdEFyZ3MoKSk7CiAgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRCcm9hZGNhc3RUbygpKTsKQEAgLTQwLDQ0ICs0Miw2MyBAQAogICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkQ2VpbCgpKTsKICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZENpcmN1bGFyQnVmZmVyKCkpOwogICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkQ29uY2F0ZW5hdGlvbigpKTsKKyAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZENvbnYyRCgpKTsKICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZENvcygpKTsKICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZEN1bVN1bSgpKTsKKyAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZERlbGF5KCkpOwogICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkRGVwdGhUb1NwYWNlKCkpOworICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkRGVwdGh3aXNlQ29udjJEKCkpOwogICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkRGVxdWFudGl6ZSgpKTsKKyAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZERldGVjdGlvblBvc3Rwcm9jZXNzKCkpOwogICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkRGl2KCkpOwogICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkRWx1KCkpOworICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkRW1iZWRkaW5nTG9va3VwKCkpOworICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkRW5lcmd5KCkpOwogICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkRXF1YWwoKSk7CiAgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRFdGhvc1UoKSk7CiAgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRFeHAoKSk7CiAgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRFeHBhbmREaW1zKCkpOworICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkRmZ0QXV0b1NjYWxlKCkpOwogICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkRmlsbCgpKTsKKyAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZEZpbHRlckJhbmsoKSk7CisgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRGaWx0ZXJCYW5rTG9nKCkpOworICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkRmlsdGVyQmFua1NwZWN0cmFsU3VidHJhY3Rpb24oKSk7CisgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRGaWx0ZXJCYW5rU3F1YXJlUm9vdCgpKTsKICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZEZsb29yKCkpOwogICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkRmxvb3JEaXYoKSk7CiAgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRGbG9vck1vZCgpKTsKKyAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZEZyYW1lcigpKTsKKyAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZEZ1bGx5Q29ubmVjdGVkKCkpOwogICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkR2F0aGVyKCkpOwogICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkR2F0aGVyTmQoKSk7CiAgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRHcmVhdGVyKCkpOwogICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkR3JlYXRlckVxdWFsKCkpOwogICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkSGFyZFN3aXNoKCkpOwogICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkSWYoKSk7CisgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRJcmZmdCgpKTsKICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZEwyTm9ybWFsaXphdGlvbigpKTsKICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZEwyUG9vbDJEKCkpOwogICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkTGVha3lSZWx1KCkpOwogICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkTGVzcygpKTsKICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZExlc3NFcXVhbCgpKTsKICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZExvZygpKTsKKyAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZExvZ1NvZnRtYXgoKSk7CiAgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRMb2dpY2FsQW5kKCkpOwogICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkTG9naWNhbE5vdCgpKTsKICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZExvZ2ljYWxPcigpKTsKICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZExvZ2lzdGljKCkpOwotICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkTG9nU29mdG1heCgpKTsKKyAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZE1heFBvb2wyRCgpKTsKICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZE1heGltdW0oKSk7Ci0gIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRNaXJyb3JQYWQoKSk7CiAgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRNZWFuKCkpOwogICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkTWluaW11bSgpKTsKKyAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZE1pcnJvclBhZCgpKTsKKyAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZE11bCgpKTsKICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZE5lZygpKTsKICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZE5vdEVxdWFsKCkpOworICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkT3ZlcmxhcEFkZCgpKTsKKyAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZFBDQU4oKSk7CiAgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRQYWNrKCkpOworICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkUGFkKCkpOwogICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkUGFkVjIoKSk7CiAgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRQcmVsdSgpKTsKICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZFF1YW50aXplKCkpOwpAQCAtODgsNiArMTA5LDcgQEAKICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZFJlc2hhcGUoKSk7CiAgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRSZXNpemVCaWxpbmVhcigpKTsKICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZFJlc2l6ZU5lYXJlc3ROZWlnaGJvcigpKTsKKyAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZFJmZnQoKSk7CiAgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRSb3VuZCgpKTsKICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZFJzcXJ0KCkpOwogICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkU2VsZWN0VjIoKSk7CkBAIC05OSwyOSArMTIxLDI3IEBACiAgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRTcGFjZVRvRGVwdGgoKSk7CiAgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRTcGxpdCgpKTsKICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZFNwbGl0VigpKTsKLSAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZFNxdWVlemUoKSk7CiAgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRTcXJ0KCkpOwogICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkU3F1YXJlKCkpOwogICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkU3F1YXJlZERpZmZlcmVuY2UoKSk7CisgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRTcXVlZXplKCkpOworICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkU3RhY2tlcigpKTsKICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZFN0cmlkZWRTbGljZSgpKTsKICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZFN1YigpKTsKICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZFN1bSgpKTsKICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZFN2ZGYoKSk7CiAgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRUYW5oKCkpOwotICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkVHJhbnNwb3NlQ29udigpKTsKICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZFRyYW5zcG9zZSgpKTsKLSAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZFVucGFjaygpKTsKKyAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZFRyYW5zcG9zZUNvbnYoKSk7CiAgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhvcF9yZXNvbHZlci5BZGRVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTSgpKTsKKyAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZFVucGFjaygpKTsKICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZFZhckhhbmRsZSgpKTsKICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZFdoaWxlKCkpOworICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkV2luZG93KCkpOwogICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkWmVyb3NMaWtlKCkpOwotICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkRGVwdGh3aXNlQ29udjJEKCkpOwotICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkQ29udjJEKCkpOwotICBURl9MSVRFX0VOU1VSRV9TVEFUVVMob3BfcmVzb2x2ZXIuQWRkQXZlcmFnZVBvb2wyRCgpKTsKLSAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZFBhZCgpKTsKLSAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZE1heFBvb2wyRCgpKTsKLSAgVEZfTElURV9FTlNVUkVfU1RBVFVTKG9wX3Jlc29sdmVyLkFkZE11bCgpKTsKKwogICByZXR1cm4ga1RmTGl0ZU9rOwogfQorCiB9ICAvLyBuYW1lc3BhY2UgdGZsaXRlCiAjZW5kaWYgIC8vIFRGTE1fQkVOQ0hNQVJLX09QX1JFU09MVkVSX0hfCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvYmVuY2htYXJraW5nL3Nob3dfbWV0YV9kYXRhLmNjLnRlbXBsYXRlIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2JlbmNobWFya2luZy9zaG93X21ldGFfZGF0YS5jYy50ZW1wbGF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjEwMmE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2JlbmNobWFya2luZy9zaG93X21ldGFfZGF0YS5jYy50ZW1wbGF0ZQpAQCAtMCwwICsxLDE3NyBAQAorLyogQ29weXJpZ2h0IDIwMjQgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fbG9nLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2JlbmNobWFya2luZy9zaG93X21ldGFfZGF0YS5oIgorCisjaWYgZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKKyNpbmNsdWRlICJOYXR1cmVEU1BfU2lnbmFsX2lkLmgiCisjaW5jbHVkZSAieGFfbm5saWJfc3RhbmRhcmRzLmgiCisjZW5kaWYgIC8vIGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8IGRlZmluZWQoSElGSTUpCisKK25hbWVzcGFjZSB0ZmxpdGUgeworbmFtZXNwYWNlIHsKKworI2lmIGRlZmluZWQoR0VORVJJQ19CRU5DSE1BUktfVVNJTkdfQlVJTFRJTl9NT0RFTCkKK2NvbnN0IGNoYXIqIG1vZGVsX2FuYWx5c2lzX3N0cmluZ3NbXSA9IHsKKyAgICAvLyAlJSVfbW9kZWxfYW5hbHlzaXNfc3RyaW5nc18lJSUKK307CisKK2NvbnN0IGNoYXIqIG1vZGVsX3NoYTFfc3RyaW5nc1tdID0geworICAgIC8vICUlJV9tb2RlbF9zaGExX3N0cmluZ3NfJSUlCit9OworI2VuZGlmICAvLyBkZWZpbmQoR0VORVJJQ19CRU5DSE1BUktfVVNJTkdfQlVJTFRJTl9NT0RFTCkKKworY29uc3QgY2hhciogY29tcGlsYXRpb25fZGF0ZV9zdHJpbmdzW10gPSB7CisgICAgLy8gJSUlX2NvbXBpbGF0aW9uX2RhdGVfc3RyaW5nc18lJSUKK307CisKK2NvbnN0IGNoYXIqIGdpdF9jb21taXRfc3RyaW5nc1tdID0geworICAgIC8vICUlJV9naXRfY29tbWl0X3N0cmluZ3NfJSUlCit9OworCitjb25zdCBjaGFyKiBnaXRfc3RhdHVzX3N0cmluZ3NbXSA9IHsKKyAgICAvLyAlJSVfZ2l0X3N0YXR1c19zdHJpbmdzXyUlJQorfTsKKworY29uc3QgY2hhciogY2NfbmFtZV9zdHJpbmdzW10gPSB7CisgICAgLy8gJSUlX2NjX25hbWVfc3RyaW5nc18lJSUKK307CisKK2NvbnN0IGNoYXIqIGNjX3ZlcnNpb25fc3RyaW5nc1tdID0geworICAgIC8vICUlJV9jY192ZXJzaW9uX3N0cmluZ3NfJSUlCit9OworCitjb25zdCBjaGFyKiBjY19mbGFnc19zdHJpbmdzW10gPSB7CisgICAgLy8gJSUlX2NjX2ZsYWdzX3N0cmluZ3NfJSUlCit9OworCitjb25zdCBjaGFyKiBjeHhfbmFtZV9zdHJpbmdzW10gPSB7CisgICAgLy8gJSUlX2N4eF9uYW1lX3N0cmluZ3NfJSUlCit9OworCitjb25zdCBjaGFyKiBjeHhfdmVyc2lvbl9zdHJpbmdzW10gPSB7CisgICAgLy8gJSUlX2N4eF92ZXJzaW9uX3N0cmluZ3NfJSUlCit9OworCitjb25zdCBjaGFyKiBjeHhfZmxhZ3Nfc3RyaW5nc1tdID0geworICAgIC8vICUlJV9jeHhfZmxhZ3Nfc3RyaW5nc18lJSUKK307CisKK2NvbnN0IGNoYXIqIG9wdGltaXphdGlvbl9mbGFnX3N0cmluZ3NbXSA9IHsKKyAgICAvLyAlJSVfb3B0aW1pemF0aW9uX2ZsYWdfc3RyaW5nc18lJSUKK307CisKK2NvbnN0IGNoYXIqIHRhcmdldF9pbmZvX3N0cmluZ3NbXSA9IHsKKyAgICAvLyAlJSVfdGFyZ2V0X2luZm9fc3RyaW5nc18lJSUKK307CisKKyNpZiBkZWZpbmVkKENNU0lTX05OKSB8fCBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KSB8fCBcCisgICAgZGVmaW5lZChWSVNJT05fUDYpCitjb25zdCBjaGFyKiBubl9saWJyYXJ5X3VybF9zdHJpbmdzW10gPSB7CisgICAgLy8gJSUlX25uX2xpYnJhcnlfdXJsX3N0cmluZ3NfJSUlCit9OworCitjb25zdCBjaGFyKiBubl9saWJyYXJ5X21kNV9zdHJpbmdzW10gPSB7CisgICAgLy8gJSUlX25uX2xpYnJhcnlfbWQ1X3N0cmluZ3NfJSUlCit9OworI2VuZGlmICAvLyBkZWZpbmVkKENNU0lTX05OKSB8fCBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fAorICAgICAgICAvLyBkZWZpbmVkKEhJRkk1KSB8fCBkZWZpbmVkKFZJU0lPTl9QNikKKwordm9pZCBTaG93U3RyaW5ncyhjb25zdCBjaGFyKiB0aXRsZSwgY29uc3QgY2hhcioqIHN0ciwgY29uc3Qgc2l6ZV90IGNvdW50KSB7CisgIE1pY3JvUHJpbnRmKCIlcyVzIiwgdGl0bGUsIHN0clswXSk7CisgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgY291bnQ7IGkrKykgeworICAgIE1pY3JvUHJpbnRmKCIlcyIsIHN0cltpXSk7CisgIH0KK30KKwordm9pZCBTaG93U2VwYXJhdG9yKCkgeyBNaWNyb1ByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsgfQorCit9ICAvLyBuYW1lc3BhY2UKKwordm9pZCBHZW5lcmljQmVuY2htYXJrU2hvd01ldGFEYXRhKCkgeworICBTaG93U2VwYXJhdG9yKCk7CisgIFNob3dTdHJpbmdzKCJDb21waWxlZCBvbjpcblxuIiwgY29tcGlsYXRpb25fZGF0ZV9zdHJpbmdzLAorICAgICAgICAgICAgICBzdGQ6OmV4dGVudDxkZWNsdHlwZShjb21waWxhdGlvbl9kYXRlX3N0cmluZ3MpPjo6dmFsdWUpOworCisgIFNob3dTZXBhcmF0b3IoKTsKKyAgU2hvd1N0cmluZ3MoIkdpdCBTSEE6ICIsIGdpdF9jb21taXRfc3RyaW5ncywKKyAgICAgICAgICAgICAgc3RkOjpleHRlbnQ8ZGVjbHR5cGUoZ2l0X2NvbW1pdF9zdHJpbmdzKT46OnZhbHVlKTsKKyAgU2hvd1N0cmluZ3MoIlxuR2l0IHN0YXR1czpcblxuIiwgZ2l0X3N0YXR1c19zdHJpbmdzLAorICAgICAgICAgICAgICBzdGQ6OmV4dGVudDxkZWNsdHlwZShnaXRfc3RhdHVzX3N0cmluZ3MpPjo6dmFsdWUpOworCisgIFNob3dTZXBhcmF0b3IoKTsKKyAgU2hvd1N0cmluZ3MoIkMgY29tcGlsZXI6ICIsIGNjX25hbWVfc3RyaW5ncywKKyAgICAgICAgICAgICAgc3RkOjpleHRlbnQ8ZGVjbHR5cGUoY2NfbmFtZV9zdHJpbmdzKT46OnZhbHVlKTsKKyAgU2hvd1N0cmluZ3MoIlZlcnNpb246XG5cbiIsIGNjX3ZlcnNpb25fc3RyaW5ncywKKyAgICAgICAgICAgICAgc3RkOjpleHRlbnQ8ZGVjbHR5cGUoY2NfdmVyc2lvbl9zdHJpbmdzKT46OnZhbHVlKTsKKyAgU2hvd1N0cmluZ3MoIlxuRmxhZ3M6XG5cbiIsIGNjX2ZsYWdzX3N0cmluZ3MsCisgICAgICAgICAgICAgIHN0ZDo6ZXh0ZW50PGRlY2x0eXBlKGNjX2ZsYWdzX3N0cmluZ3MpPjo6dmFsdWUpOworICBTaG93U3RyaW5ncygiXG5DKysgY29tcGlsZXI6ICIsIGN4eF9uYW1lX3N0cmluZ3MsCisgICAgICAgICAgICAgIHN0ZDo6ZXh0ZW50PGRlY2x0eXBlKGN4eF9uYW1lX3N0cmluZ3MpPjo6dmFsdWUpOworICBTaG93U3RyaW5ncygiVmVyc2lvbjpcblxuIiwgY3h4X3ZlcnNpb25fc3RyaW5ncywKKyAgICAgICAgICAgICAgc3RkOjpleHRlbnQ8ZGVjbHR5cGUoY3h4X3ZlcnNpb25fc3RyaW5ncyk+Ojp2YWx1ZSk7CisgIFNob3dTdHJpbmdzKCJcbkZsYWdzOlxuXG4iLCBjeHhfZmxhZ3Nfc3RyaW5ncywKKyAgICAgICAgICAgICAgc3RkOjpleHRlbnQ8ZGVjbHR5cGUoY3h4X2ZsYWdzX3N0cmluZ3MpPjo6dmFsdWUpOworICBTaG93U3RyaW5ncygiXG5PcHRpbWl6YXRpb246ICIsIG9wdGltaXphdGlvbl9mbGFnX3N0cmluZ3MsCisgICAgICAgICAgICAgIHN0ZDo6ZXh0ZW50PGRlY2x0eXBlKG9wdGltaXphdGlvbl9mbGFnX3N0cmluZ3MpPjo6dmFsdWUpOworCisgIFNob3dTZXBhcmF0b3IoKTsKKyAgU2hvd1N0cmluZ3MoIlRhcmdldCBpbmZvcm1hdGlvbjpcblxuIiwgdGFyZ2V0X2luZm9fc3RyaW5ncywKKyAgICAgICAgICAgICAgc3RkOjpleHRlbnQ8ZGVjbHR5cGUodGFyZ2V0X2luZm9fc3RyaW5ncyk+Ojp2YWx1ZSk7CisKKyNpZiBkZWZpbmVkKENNU0lTX05OKSB8fCBkZWZpbmVkKEhJRkkzKSB8fCBkZWZpbmVkKEhJRkk0KSB8fCBkZWZpbmVkKEhJRkk1KSB8fCBcCisgICAgZGVmaW5lZChWSVNJT05fUDYpCisgIFNob3dTZXBhcmF0b3IoKTsKKyAgU2hvd1N0cmluZ3MoIk5OIGxpYnJhcnkgZG93bmxvYWQgVVJMczpcblxuIiwgbm5fbGlicmFyeV91cmxfc3RyaW5ncywKKyAgICAgICAgICAgICAgc3RkOjpleHRlbnQ8ZGVjbHR5cGUobm5fbGlicmFyeV91cmxfc3RyaW5ncyk+Ojp2YWx1ZSk7CisgIFNob3dTdHJpbmdzKCJcbk5OIGxpYnJhcnkgTUQ1IGNoZWNrc3VtczpcblxuIiwgbm5fbGlicmFyeV9tZDVfc3RyaW5ncywKKyAgICAgICAgICAgICAgc3RkOjpleHRlbnQ8ZGVjbHR5cGUobm5fbGlicmFyeV9tZDVfc3RyaW5ncyk+Ojp2YWx1ZSk7CisjZW5kaWYgIC8vIGRlZmluZWQoQ01TSVNfTk4pIHx8IGRlZmluZWQoSElGSTMpIHx8IGRlZmluZWQoSElGSTQpIHx8CisgICAgICAgIC8vIGRlZmluZWQoSElGSTUpIHx8IGRlZmluZWQoVklTSU9OX1A2KQorCisjaWYgZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKKyAgU2hvd1NlcGFyYXRvcigpOworCisgIGNoYXIgdmVyc2lvbl9idWZmZXJbMzAgKyAxXTsKKyAgbWVtc2V0KHZlcnNpb25fYnVmZmVyLCAwLCBzaXplb2YodmVyc2lvbl9idWZmZXIpKTsKKyAgTmF0dXJlRFNQX1NpZ25hbF9nZXRfbGlicmFyeV92ZXJzaW9uKHZlcnNpb25fYnVmZmVyKTsKKyAgTWljcm9QcmludGYoIk5hdHVyZURTUCBsaWJyYXJ5IHZlcnNpb246ICVzIiwgdmVyc2lvbl9idWZmZXIpOworICBtZW1zZXQodmVyc2lvbl9idWZmZXIsIDAsIHNpemVvZih2ZXJzaW9uX2J1ZmZlcikpOworICBOYXR1cmVEU1BfU2lnbmFsX2dldF9saWJyYXJ5X2FwaV92ZXJzaW9uKHZlcnNpb25fYnVmZmVyKTsKKyAgTWljcm9QcmludGYoIk5hdHVyZURTUCBBUEkgdmVyc2lvbjogJXMiLCB2ZXJzaW9uX2J1ZmZlcik7CisKKyAgY29uc3QgY2hhciogbm5saWJfbGlicmFyeV92ZXJzaW9uID0geGFfbm5saWJfZ2V0X2xpYl92ZXJzaW9uX3N0cmluZygpOworICBjb25zdCBjaGFyKiBubmxpYl9hcGlfdmVyc2lvbiA9IHhhX25ubGliX2dldF9saWJfYXBpX3ZlcnNpb25fc3RyaW5nKCk7CisgIE1pY3JvUHJpbnRmKCJOTkxJQiBsaWJyYXJ5IHZlcnNpb246ICVzIiwgbm5saWJfbGlicmFyeV92ZXJzaW9uKTsKKyAgTWljcm9QcmludGYoIk5OTElCIEFQSSB2ZXJzaW9uOiAlcyIsIG5ubGliX2FwaV92ZXJzaW9uKTsKKyNlbmRpZiAgLy8gZGVmaW5lZChISUZJMykgfHwgZGVmaW5lZChISUZJNCkgfHwgZGVmaW5lZChISUZJNSkKKworI2lmIGRlZmluZWQoR0VORVJJQ19CRU5DSE1BUktfVVNJTkdfQlVJTFRJTl9NT0RFTCkKKyAgU2hvd1NlcGFyYXRvcigpOworICBTaG93U3RyaW5ncygiTW9kZWwgU0hBMTpcblxuIiwgbW9kZWxfc2hhMV9zdHJpbmdzLAorICAgICAgICAgICAgICBzdGQ6OmV4dGVudDxkZWNsdHlwZShtb2RlbF9zaGExX3N0cmluZ3MpPjo6dmFsdWUpOworICBTaG93U3RyaW5ncygiXG5Nb2RlbCBhbmFseXNpczpcblxuIiwgbW9kZWxfYW5hbHlzaXNfc3RyaW5ncywKKyAgICAgICAgICAgICAgc3RkOjpleHRlbnQ8ZGVjbHR5cGUobW9kZWxfYW5hbHlzaXNfc3RyaW5ncyk+Ojp2YWx1ZSk7CisjZW5kaWYgIC8vIGRlZmluZChHRU5FUklDX0JFTkNITUFSS19VU0lOR19CVUlMVElOX01PREVMKQorCisgIFNob3dTZXBhcmF0b3IoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9zaW1wbGVfZmVhdHVyZXMvc2ltcGxlX21vZGVsX3NldHRpbmdzLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2JlbmNobWFya2luZy9zaG93X21ldGFfZGF0YS5oCnNpbWlsYXJpdHkgaW5kZXggNjclCmNvcHkgZnJvbSB0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL3NpbXBsZV9mZWF0dXJlcy9zaW1wbGVfbW9kZWxfc2V0dGluZ3MuY2MKY29weSB0byB0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvYmVuY2htYXJraW5nL3Nob3dfbWV0YV9kYXRhLmgKaW5kZXggZTJjZjY2MS4uMzdjZjYxNiAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9zaW1wbGVfZmVhdHVyZXMvc2ltcGxlX21vZGVsX3NldHRpbmdzLmNjCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9iZW5jaG1hcmtpbmcvc2hvd19tZXRhX2RhdGEuaApAQCAtMSw0ICsxLDQgQEAKLS8qIENvcHlyaWdodCAyMDE4IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvKiBDb3B5cmlnaHQgMjAyNCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogCiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTEzLDExICsxMywxMiBAQAogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9zaW1wbGVfZmVhdHVyZXMvc2ltcGxlX21vZGVsX3NldHRpbmdzLmgiCituYW1lc3BhY2UgdGZsaXRlIHsKIAotY29uc3QgY2hhcioga0NhdGVnb3J5TGFiZWxzW2tDYXRlZ29yeUNvdW50XSA9IHsKLSAgICAic2lsZW5jZSIsCi0gICAgInVua25vd24iLAotICAgICJ5ZXMiLAotICAgICJubyIsCi19OworI2lmICFkZWZpbmVkKEdFTkVSSUNfQkVOQ0hNQVJLX05PX01FVEFfREFUQSkKK3ZvaWQgR2VuZXJpY0JlbmNobWFya1Nob3dNZXRhRGF0YSgpOworI2Vsc2UKK2lubGluZSB2b2lkIEdlbmVyaWNCZW5jaG1hcmtTaG93TWV0YURhdGEoKSB7fQorI2VuZGlmICAvLyBkZWZpbmVkKEdFTkVSSUNfQkVOQ0hNQVJLX05PX01FVEFfREFUQSkKKworfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2NpX2J1aWxkL3Rlc3RfY29kZV9zdHlsZS5zaCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9jaV9idWlsZC90ZXN0X2NvZGVfc3R5bGUuc2gKaW5kZXggMGQyNWM5Zi4uZDQ5ZjQyOSAxMDA3NTUKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2NpX2J1aWxkL3Rlc3RfY29kZV9zdHlsZS5zaAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvY2lfYnVpbGQvdGVzdF9jb2RlX3N0eWxlLnNoCkBAIC03Nyw2ICs3Nyw4IEBACiAgIEZJWF9GT1JNQVRfT1BUSU9OUz0iIgogZmkKIAorRVhDTFVERV9TSEFSRURfVEZMX0NPREU9JChzZWQgJ3MvXi8tZSAvJyBjaS90ZmxpdGVfZmlsZXMudHh0KQorCiB0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9kb3dubG9hZHMvcGlnd2VlZC9wd19wcmVzdWJtaXQvcHkvcHdfcHJlc3VibWl0L2Zvcm1hdF9jb2RlLnB5IFwKICAgJHtGSVhfRk9STUFUX09QVElPTlN9IFwKICAgLWUgIlwuZ2l0aHViIiBcCkBAIC04NCw2ICs4Niw4IEBACiAgIC1lIHRoaXJkX3BhcnR5L3h0ZW5zYSBcCiAgIC1lIGNpIFwKICAgLWUgYy9jb21tb24uYyBcCisgIC1lIGNvZGVnZW4vcHJlcHJvY2Vzc29yL3ByZXByb2Nlc3Nvcl9zY2hlbWFfZ2VuZXJhdGVkLmggXAorICAtZSBjb2RlZ2VuL3ByZXByb2Nlc3Nvci9wcmVwcm9jZXNzb3Jfc2NoZW1hX3B5X2dlbmVyYXRlZC5weSBcCiAgIC1lIGNvcmUvYXBpL2Vycm9yX3JlcG9ydGVyLmNjIFwKICAgLWUga2VybmVscy9pbnRlcm5hbC9yZWZlcmVuY2UvaW50ZWdlcl9vcHMvIFwKICAgLWUga2VybmVscy9pbnRlcm5hbC9yZWZlcmVuY2UvcmVmZXJlbmNlX29wcy5oIFwKQEAgLTkzLDggKzk3LDEwIEBACiAgIC1lIGV4cGVyaW1lbnRhbCBcCiAgIC1lIHNjaGVtYS9zY2hlbWFfZ2VuZXJhdGVkLmggXAogICAtZSBzY2hlbWEvc2NoZW1hX3V0aWxzLmggXAorICAtZSB0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbGF5ZXJfYnlfbGF5ZXJfc2NoZW1hX2dlbmVyYXRlZC5oIFwKICAgLWUgIlwuaW5jIiBcCi0gIC1lICJcLm1kIgorICAtZSAiXC5tZCIgXAorICAke0VYQ0xVREVfU0hBUkVEX1RGTF9DT0RFfQogCiBDT0RFX0ZPUk1BVF9SRVNVTFQ9JD8KIApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2NpX2J1aWxkL3Rlc3RfY29ydGV4X21fY29yc3RvbmVfMzAwLnNoIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2NpX2J1aWxkL3Rlc3RfY29ydGV4X21fY29yc3RvbmVfMzAwLnNoCmluZGV4IDUxNmMxODEuLmFiMTM2ZTUgMTAwNzU1Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9jaV9idWlsZC90ZXN0X2NvcnRleF9tX2NvcnN0b25lXzMwMC5zaAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvY2lfYnVpbGQvdGVzdF9jb3J0ZXhfbV9jb3JzdG9uZV8zMDAuc2gKQEAgLTEsNSArMSw1IEBACiAjIS91c3IvYmluL2VudiBiYXNoCi0jIENvcHlyaWdodCAyMDIyIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIENvcHlyaWdodCAyMDI0IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC00MiwzICs0MiwxNCBAQAogcmVhZGFibGVfcnVuIG1ha2UgLWYgdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvTWFrZWZpbGUgY2xlYW4KIHJlYWRhYmxlX3J1biBtYWtlIC1qJChucHJvYykgLWYgdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvTWFrZWZpbGUgQ09fUFJPQ0VTU09SPWV0aG9zX3UgT1BUSU1JWkVEX0tFUk5FTF9ESVI9JHtPUFRJTUlaRURfS0VSTkVMX0RJUn0gVEFSR0VUPSR7VEFSR0VUfSBUQVJHRVRfQVJDSD0ke1RBUkdFVF9BUkNIfSBUT09MQ0hBSU49JHtUT09MQ0hBSU59IGJ1aWxkCiByZWFkYWJsZV9ydW4gbWFrZSAtZiB0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9NYWtlZmlsZSBDT19QUk9DRVNTT1I9ZXRob3NfdSBPUFRJTUlaRURfS0VSTkVMX0RJUj0ke09QVElNSVpFRF9LRVJORUxfRElSfSBUQVJHRVQ9JHtUQVJHRVR9IFRBUkdFVF9BUkNIPSR7VEFSR0VUX0FSQ0h9IFRPT0xDSEFJTj0ke1RPT0xDSEFJTn0gdGVzdAorCisjIFJ1biBnZW5lcmljIGJlbmNobWFyay4KK3JlYWRhYmxlX3J1biBtYWtlIC1qJChucHJvYykgLWYgdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvTWFrZWZpbGUgXAorICBDT19QUk9DRVNTT1I9ZXRob3NfdSBcCisgIE9QVElNSVpFRF9LRVJORUxfRElSPSR7T1BUSU1JWkVEX0tFUk5FTF9ESVJ9IFwKKyAgVEFSR0VUPSR7VEFSR0VUfSBcCisgIFRBUkdFVF9BUkNIPSR7VEFSR0VUX0FSQ0h9IFwKKyAgVE9PTENIQUlOPSR7VE9PTENIQUlOfSBcCisgIEdFTkVSSUNfQkVOQ0hNQVJLX01PREVMX1BBVEg9dGVuc29yZmxvdy9saXRlL21pY3JvL21vZGVscy9wZXJzb25fZGV0ZWN0X3ZlbGEudGZsaXRlIFwKKyAgR0VORVJJQ19CRU5DSE1BUktfQVJFTkFfU0laRT1gZXhwciAxNTAgXCogMTAyNGAgXAorICBydW5fdGZsbV9iZW5jaG1hcmsKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9jaV9idWlsZC90ZXN0X3g4Nl9kZWZhdWx0LnNoIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2NpX2J1aWxkL3Rlc3RfeDg2X2RlZmF1bHQuc2gKaW5kZXggNjIzMjM4ZS4uOTk4ODI3ZiAxMDA3NTUKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2NpX2J1aWxkL3Rlc3RfeDg2X2RlZmF1bHQuc2gKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2NpX2J1aWxkL3Rlc3RfeDg2X2RlZmF1bHQuc2gKQEAgLTQwLDMgKzQwLDEwIEBACiByZWFkYWJsZV9ydW4gbWFrZSAtcyAtajggLWYgJHtURU5TT1JGTE9XX1JPT1R9dGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvTWFrZWZpbGUgYnVpbGQgVEVOU09SRkxPV19ST09UPSR7VEVOU09SRkxPV19ST09UfSBFWFRFUk5BTF9ESVI9JHtFWFRFUk5BTF9ESVJ9CiByZWFkYWJsZV9ydW4gbWFrZSAtcyAtajggLWYgJHtURU5TT1JGTE9XX1JPT1R9dGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvTWFrZWZpbGUgdGVzdCBURU5TT1JGTE9XX1JPT1Q9JHtURU5TT1JGTE9XX1JPT1R9IEVYVEVSTkFMX0RJUj0ke0VYVEVSTkFMX0RJUn0KIHJlYWRhYmxlX3J1biBtYWtlIC1zIC1qOCAtZiAke1RFTlNPUkZMT1dfUk9PVH10ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9NYWtlZmlsZSBpbnRlZ3JhdGlvbl90ZXN0cyBURU5TT1JGTE9XX1JPT1Q9JHtURU5TT1JGTE9XX1JPT1R9IEVYVEVSTkFMX0RJUj0ke0VYVEVSTkFMX0RJUn0KKworIyBydW4gZ2VuZXJpYyBiZW5jaG1hcmsKK3JlYWRhYmxlX3J1biBtYWtlIC1qJChucHJvYykgLWYgJHtURU5TT1JGTE9XX1JPT1R9dGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvTWFrZWZpbGUgXAorICBURU5TT1JGTE9XX1JPT1Q9JHtURU5TT1JGTE9XX1JPT1R9IFwKKyAgRVhURVJOQUxfRElSPSR7RVhURVJOQUxfRElSfSBcCisgIEdFTkVSSUNfQkVOQ0hNQVJLX01PREVMX1BBVEg9JHtURU5TT1JGTE9XX1JPT1R9dGVuc29yZmxvdy9saXRlL21pY3JvL21vZGVscy9wZXJzb25fZGV0ZWN0LnRmbGl0ZSBcCisgIHJ1bl90ZmxtX2JlbmNobWFyawpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2NpX2J1aWxkL3Rlc3RfeHRlbnNhX2Z1c2lvbl9mMS5zaCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9jaV9idWlsZC90ZXN0X3h0ZW5zYV9mdXNpb25fZjEuc2gKaW5kZXggODQxNjc5Mi4uMmZkNmJmOCAxMDA3NTUKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2NpX2J1aWxkL3Rlc3RfeHRlbnNhX2Z1c2lvbl9mMS5zaAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvY2lfYnVpbGQvdGVzdF94dGVuc2FfZnVzaW9uX2YxLnNoCkBAIC0zNSw3ICszNSw3IEBACiBpZiBbWyAkezF9ID09ICJJTlRFUk5BTCIgXV07IHRoZW4KIHJlYWRhYmxlX3J1biBtYWtlIC1mICR7VEVOU09SRkxPV19ST09UfXRlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL01ha2VmaWxlIFwKICAgVEFSR0VUPXh0ZW5zYSBcCi0gIFRBUkdFVF9BUkNIPWhpZmk0IFwKKyAgVEFSR0VUX0FSQ0g9aGlmaTMgXAogICBPUFRJTUlaRURfS0VSTkVMX0RJUj14dGVuc2EgXAogICBYVEVOU0FfQ09SRT1GMV8xOTAzMDVfc3d1cGdyYWRlIFwKICAgVEVOU09SRkxPV19ST09UPSR7VEVOU09SRkxPV19ST09UfSBcCkBAIC00NCw3ICs0NCw3IEBACiAKIHJlYWRhYmxlX3J1biBtYWtlIC1mICR7VEVOU09SRkxPV19ST09UfXRlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL01ha2VmaWxlIFwKICAgVEFSR0VUPXh0ZW5zYSBcCi0gIFRBUkdFVF9BUkNIPWhpZmk0IFwKKyAgVEFSR0VUX0FSQ0g9aGlmaTMgXAogICBPUFRJTUlaRURfS0VSTkVMX0RJUj14dGVuc2EgXAogICBYVEVOU0FfQ09SRT1GMV8xOTAzMDVfc3d1cGdyYWRlIFwKICAgVEVOU09SRkxPV19ST09UPSR7VEVOU09SRkxPV19ST09UfSBcCkBAIC01Myw3ICs1Myw3IEBACiBlbHNlCiByZWFkYWJsZV9ydW4gbWFrZSAtZiAke1RFTlNPUkZMT1dfUk9PVH10ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9NYWtlZmlsZSBcCiAgIFRBUkdFVD14dGVuc2EgXAotICBUQVJHRVRfQVJDSD1oaWZpNCBcCisgIFRBUkdFVF9BUkNIPWhpZmkzIFwKICAgT1BUSU1JWkVEX0tFUk5FTF9ESVI9eHRlbnNhIFwKICAgWFRFTlNBX0NPUkU9RjFfMTkwMzA1X3N3dXBncmFkZSBcCiAgIFRFTlNPUkZMT1dfUk9PVD0ke1RFTlNPUkZMT1dfUk9PVH0gXApAQCAtNjIsMTAgKzYyLDIxIEBACiAKIHJlYWRhYmxlX3J1biBtYWtlIC1mICR7VEVOU09SRkxPV19ST09UfXRlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL01ha2VmaWxlIFwKICAgVEFSR0VUPXh0ZW5zYSBcCi0gIFRBUkdFVF9BUkNIPWhpZmk0IFwKKyAgVEFSR0VUX0FSQ0g9aGlmaTMgXAogICBPUFRJTUlaRURfS0VSTkVMX0RJUj14dGVuc2EgXAogICBYVEVOU0FfQ09SRT1GMV8xOTAzMDVfc3d1cGdyYWRlIFwKICAgVEVOU09SRkxPV19ST09UPSR7VEVOU09SRkxPV19ST09UfSBcCiAgIEVYVEVSTkFMX0RJUj0ke0VYVEVSTkFMX0RJUn0gXAogICB0ZXN0IC1qJChucHJvYykKKworIyBydW4gZ2VuZXJpYyBiZW5jaG1hcmsKK3JlYWRhYmxlX3J1biBtYWtlIC1mICR7VEVOU09SRkxPV19ST09UfXRlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL01ha2VmaWxlIFwKKyAgVEFSR0VUPXh0ZW5zYSBcCisgIFRBUkdFVF9BUkNIPWhpZmkzIFwKKyAgT1BUSU1JWkVEX0tFUk5FTF9ESVI9eHRlbnNhIFwKKyAgWFRFTlNBX0NPUkU9RjFfMTkwMzA1X3N3dXBncmFkZSBcCisgIFRFTlNPUkZMT1dfUk9PVD0ke1RFTlNPUkZMT1dfUk9PVH0gXAorICBFWFRFUk5BTF9ESVI9JHtFWFRFUk5BTF9ESVJ9IFwKKyAgR0VORVJJQ19CRU5DSE1BUktfTU9ERUxfUEFUSD0ke1RFTlNPUkZMT1dfUk9PVH10ZW5zb3JmbG93L2xpdGUvbWljcm8vbW9kZWxzL3BlcnNvbl9kZXRlY3QudGZsaXRlIFwKKyAgcnVuX3RmbG1fYmVuY2htYXJrIC1qJChucHJvYykKIGZpCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvY2lfYnVpbGQvdGVzdF94dGVuc2FfaGlmaTN6LnNoIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2NpX2J1aWxkL3Rlc3RfeHRlbnNhX2hpZmkzei5zaAppbmRleCAxZGRmMGQ5Li5mZjNkNjAwIDEwMDc1NQotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvY2lfYnVpbGQvdGVzdF94dGVuc2FfaGlmaTN6LnNoCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9jaV9idWlsZC90ZXN0X3h0ZW5zYV9oaWZpM3ouc2gKQEAgLTM1LDcgKzM1LDcgQEAKIGlmIFtbICR7MX0gPT0gIklOVEVSTkFMIiBdXTsgdGhlbgogICByZWFkYWJsZV9ydW4gbWFrZSAtZiAke1RFTlNPUkZMT1dfUk9PVH10ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9NYWtlZmlsZSBcCiAgICAgVEFSR0VUPXh0ZW5zYSBcCi0gICAgVEFSR0VUX0FSQ0g9aGlmaTQgXAorICAgIFRBUkdFVF9BUkNIPWhpZmkzIFwKICAgICBPUFRJTUlaRURfS0VSTkVMX0RJUj14dGVuc2EgXAogICAgIFhURU5TQV9DT1JFPUhJRklfMTkwMzA0X3N3dXBncmFkZSBcCiAgICAgVEVOU09SRkxPV19ST09UPSR7VEVOU09SRkxPV19ST09UfSBcCkBAIC00NCw3ICs0NCw3IEBACiAKICAgcmVhZGFibGVfcnVuIG1ha2UgLWYgJHtURU5TT1JGTE9XX1JPT1R9dGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvTWFrZWZpbGUgXAogICAgIFRBUkdFVD14dGVuc2EgXAotICAgIFRBUkdFVF9BUkNIPWhpZmk0IFwKKyAgICBUQVJHRVRfQVJDSD1oaWZpMyBcCiAgICAgT1BUSU1JWkVEX0tFUk5FTF9ESVI9eHRlbnNhIFwKICAgICBYVEVOU0FfQ09SRT1ISUZJXzE5MDMwNF9zd3VwZ3JhZGUgXAogICAgIFRFTlNPUkZMT1dfUk9PVD0ke1RFTlNPUkZMT1dfUk9PVH0gXApAQCAtNTMsNyArNTMsNyBAQAogCiAgIHJlYWRhYmxlX3J1biBtYWtlIC1mICR7VEVOU09SRkxPV19ST09UfXRlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL01ha2VmaWxlIFwKICAgICBUQVJHRVQ9eHRlbnNhIFwKLSAgICBUQVJHRVRfQVJDSD1oaWZpNCBcCisgICAgVEFSR0VUX0FSQ0g9aGlmaTMgXAogICAgIE9QVElNSVpFRF9LRVJORUxfRElSPXh0ZW5zYSBcCiAgICAgWFRFTlNBX0NPUkU9SElGSV8xOTAzMDRfc3d1cGdyYWRlIFwKICAgICBURU5TT1JGTE9XX1JPT1Q9JHtURU5TT1JGTE9XX1JPT1R9IFwKQEAgLTYyLDcgKzYyLDcgQEAKIAogICByZWFkYWJsZV9ydW4gbWFrZSAtZiAke1RFTlNPUkZMT1dfUk9PVH10ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9NYWtlZmlsZSBcCiAgICAgVEFSR0VUPXh0ZW5zYSBcCi0gICAgVEFSR0VUX0FSQ0g9aGlmaTQgXAorICAgIFRBUkdFVF9BUkNIPWhpZmkzIFwKICAgICBPUFRJTUlaRURfS0VSTkVMX0RJUj14dGVuc2EgXAogICAgIFhURU5TQV9DT1JFPUhJRklfMTkwMzA0X3N3dXBncmFkZSBcCiAgICAgVEVOU09SRkxPV19ST09UPSR7VEVOU09SRkxPV19ST09UfSBcCkBAIC03MSw3ICs3MSw3IEBACiAKICAgcmVhZGFibGVfcnVuIG1ha2UgLWYgJHtURU5TT1JGTE9XX1JPT1R9dGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvTWFrZWZpbGUgXAogICAgIFRBUkdFVD14dGVuc2EgXAotICAgIFRBUkdFVF9BUkNIPWhpZmk0IFwKKyAgICBUQVJHRVRfQVJDSD1oaWZpMyBcCiAgICAgT1BUSU1JWkVEX0tFUk5FTF9ESVI9eHRlbnNhIFwKICAgICBYVEVOU0FfQ09SRT1ISUZJXzE5MDMwNF9zd3VwZ3JhZGUgXAogICAgIFRFTlNPUkZMT1dfUk9PVD0ke1RFTlNPUkZMT1dfUk9PVH0gXApAQCAtODAsNyArODAsNyBAQAogZWxzZQogICByZWFkYWJsZV9ydW4gbWFrZSAtZiAke1RFTlNPUkZMT1dfUk9PVH10ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9NYWtlZmlsZSBcCiAgICAgVEFSR0VUPXh0ZW5zYSBcCi0gICAgVEFSR0VUX0FSQ0g9aGlmaTQgXAorICAgIFRBUkdFVF9BUkNIPWhpZmkzIFwKICAgICBPUFRJTUlaRURfS0VSTkVMX0RJUj14dGVuc2EgXAogICAgIFhURU5TQV9DT1JFPUhJRklfMTkwMzA0X3N3dXBncmFkZSBcCiAgICAgVEVOU09SRkxPV19ST09UPSR7VEVOU09SRkxPV19ST09UfSBcCkBAIC04OSwxMCArODksMjEgQEAKIAogICByZWFkYWJsZV9ydW4gbWFrZSAtZiAke1RFTlNPUkZMT1dfUk9PVH10ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9NYWtlZmlsZSBcCiAgICAgVEFSR0VUPXh0ZW5zYSBcCi0gICAgVEFSR0VUX0FSQ0g9aGlmaTQgXAorICAgIFRBUkdFVF9BUkNIPWhpZmkzIFwKICAgICBPUFRJTUlaRURfS0VSTkVMX0RJUj14dGVuc2EgXAogICAgIFhURU5TQV9DT1JFPUhJRklfMTkwMzA0X3N3dXBncmFkZSBcCiAgICAgVEVOU09SRkxPV19ST09UPSR7VEVOU09SRkxPV19ST09UfSBcCiAgICAgRVhURVJOQUxfRElSPSR7RVhURVJOQUxfRElSfSBcCiAgICAgdGVzdCAtaiQobnByb2MpCisKKyAgIyBydW4gZ2VuZXJpYyBiZW5jaG1hcmsKKyAgcmVhZGFibGVfcnVuIG1ha2UgLWYgJHtURU5TT1JGTE9XX1JPT1R9dGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvTWFrZWZpbGUgXAorICAgIFRBUkdFVD14dGVuc2EgXAorICAgIFRBUkdFVF9BUkNIPWhpZmkzIFwKKyAgICBPUFRJTUlaRURfS0VSTkVMX0RJUj14dGVuc2EgXAorICAgIFhURU5TQV9DT1JFPUhJRklfMTkwMzA0X3N3dXBncmFkZSBcCisgICAgVEVOU09SRkxPV19ST09UPSR7VEVOU09SRkxPV19ST09UfSBcCisgICAgRVhURVJOQUxfRElSPSR7RVhURVJOQUxfRElSfSBcCisgICAgR0VORVJJQ19CRU5DSE1BUktfTU9ERUxfUEFUSD0ke1RFTlNPUkZMT1dfUk9PVH10ZW5zb3JmbG93L2xpdGUvbWljcm8vbW9kZWxzL3BlcnNvbl9kZXRlY3QudGZsaXRlIFwKKyAgICBydW5fdGZsbV9iZW5jaG1hcmsgLWokKG5wcm9jKQogZmkKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9jaV9idWlsZC90ZXN0X3h0ZW5zYV9oaWZpNS5zaCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9jaV9idWlsZC90ZXN0X3h0ZW5zYV9oaWZpNS5zaAppbmRleCA4MmEwNGE5Li4wYWQyOWU4IDEwMDc1NQotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvY2lfYnVpbGQvdGVzdF94dGVuc2FfaGlmaTUuc2gKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2NpX2J1aWxkL3Rlc3RfeHRlbnNhX2hpZmk1LnNoCkBAIC00NywzICs0NywxNCBAQAogICBURU5TT1JGTE9XX1JPT1Q9JHtURU5TT1JGTE9XX1JPT1R9IFwKICAgRVhURVJOQUxfRElSPSR7RVhURVJOQUxfRElSfSBcCiAgIHRlc3QgLWokKG5wcm9jKQorCisjIHJ1biBnZW5lcmljIGJlbmNobWFyaworcmVhZGFibGVfcnVuIG1ha2UgLWYgJHtURU5TT1JGTE9XX1JPT1R9dGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvTWFrZWZpbGUgXAorICBUQVJHRVQ9eHRlbnNhIFwKKyAgVEFSR0VUX0FSQ0g9aGlmaTUgXAorICBPUFRJTUlaRURfS0VSTkVMX0RJUj14dGVuc2EgXAorICBYVEVOU0FfQ09SRT1QUkRfSDVfUkRPXzA3XzAxXzIwMjIgXAorICBURU5TT1JGTE9XX1JPT1Q9JHtURU5TT1JGTE9XX1JPT1R9IFwKKyAgRVhURVJOQUxfRElSPSR7RVhURVJOQUxfRElSfSBcCisgIEdFTkVSSUNfQkVOQ0hNQVJLX01PREVMX1BBVEg9JHtURU5TT1JGTE9XX1JPT1R9dGVuc29yZmxvdy9saXRlL21pY3JvL21vZGVscy9wZXJzb25fZGV0ZWN0LnRmbGl0ZSBcCisgIHJ1bl90ZmxtX2JlbmNobWFyayAtaiQobnByb2MpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2NpX2J1aWxkL3Rlc3RfeHRlbnNhX3Zpc2lvbl9wNi5zaCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9jaV9idWlsZC90ZXN0X3h0ZW5zYV92aXNpb25fcDYuc2gKaW5kZXggYTI3NDRiNS4uMWM2ZGU5MyAxMDA3NTUKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2NpX2J1aWxkL3Rlc3RfeHRlbnNhX3Zpc2lvbl9wNi5zaAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvY2lfYnVpbGQvdGVzdF94dGVuc2FfdmlzaW9uX3A2LnNoCkBAIC01NCw0ICs1NCwxNSBAQAogICAgIFRFTlNPUkZMT1dfUk9PVD0ke1RFTlNPUkZMT1dfUk9PVH0gXAogICAgIEVYVEVSTkFMX0RJUj0ke0VYVEVSTkFMX0RJUn0gXAogICAgIHRlc3QgLWokKG5wcm9jKQorCisgICMgcnVuIGdlbmVyaWMgYmVuY2htYXJrCisgIHJlYWRhYmxlX3J1biBtYWtlIC1mICR7VEVOU09SRkxPV19ST09UfXRlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL01ha2VmaWxlIFwKKyAgICBUQVJHRVQ9eHRlbnNhIFwKKyAgICBUQVJHRVRfQVJDSD12aXNpb25fcDYgXAorICAgIE9QVElNSVpFRF9LRVJORUxfRElSPXh0ZW5zYSBcCisgICAgWFRFTlNBX0NPUkU9UDZfMjAwNTI4IFwKKyAgICBURU5TT1JGTE9XX1JPT1Q9JHtURU5TT1JGTE9XX1JPT1R9IFwKKyAgICBFWFRFUk5BTF9ESVI9JHtFWFRFUk5BTF9ESVJ9IFwKKyAgICBHRU5FUklDX0JFTkNITUFSS19NT0RFTF9QQVRIPSR7VEVOU09SRkxPV19ST09UfXRlbnNvcmZsb3cvbGl0ZS9taWNyby9tb2RlbHMvcGVyc29uX2RldGVjdC50ZmxpdGUgXAorICAgIHJ1bl90ZmxtX2JlbmNobWFyayAtaiQobnByb2MpCiBmaQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2dlbl9taWNyb19tdXRhYmxlX29wX3Jlc29sdmVyL0JVSUxEIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2dlbl9taWNyb19tdXRhYmxlX29wX3Jlc29sdmVyL0JVSUxECmluZGV4IDI3NmU5YzIuLmU1OTA5MzkgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9nZW5fbWljcm9fbXV0YWJsZV9vcF9yZXNvbHZlci9CVUlMRAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvZ2VuX21pY3JvX211dGFibGVfb3BfcmVzb2x2ZXIvQlVJTEQKQEAgLTEsMyArMSw0IEBACitsb2FkKCJAcnVsZXNfcHl0aG9uLy9weXRob246ZGVmcy5iemwiLCAicHlfYmluYXJ5IikKIGxvYWQoIkB0ZmxtX3BpcF9kZXBzLy86cmVxdWlyZW1lbnRzLmJ6bCIsICJyZXF1aXJlbWVudCIpCiAKIHBhY2thZ2UoCkBAIC0xOCw3ICsxOSw2IEBACiAgICAgZGVwcyA9IFsKICAgICAgICAgIkBhYnNsX3B5Ly9hYnNsOmFwcCIsCiAgICAgICAgICJAYWJzbF9weS8vYWJzbC9mbGFncyIsCi0gICAgICAgIHJlcXVpcmVtZW50KCJ0ZW5zb3JmbG93LWNwdSIpLAogICAgICAgICByZXF1aXJlbWVudCgibWFrbyIpLAogICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvcHl0aG9uOnNjaGVtYV9weSIsCiAgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9weXRob246c2NoZW1hX3V0aWwiLApAQCAtNDIsNyArNDIsNyBAQAogICAgIGRlcHMgPSBbCiAgICAgICAgICJAYWJzbF9weS8vYWJzbDphcHAiLAogICAgICAgICAiQGFic2xfcHkvL2Fic2wvZmxhZ3MiLAotICAgICAgICByZXF1aXJlbWVudCgidGVuc29yZmxvdy1jcHUiKSwKKyAgICAgICAgcmVxdWlyZW1lbnQoInRlbnNvcmZsb3ciKSwKICAgICAgICAgcmVxdWlyZW1lbnQoIm1ha28iKSwKICAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzOmdlbmVyYXRlX3Rlc3RfZm9yX21vZGVsIiwKICAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL3B5dGhvbjpzY2hlbWFfcHkiLApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2dlbl9taWNyb19tdXRhYmxlX29wX3Jlc29sdmVyL1JFQURNRS5tZCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9nZW5fbWljcm9fbXV0YWJsZV9vcF9yZXNvbHZlci9SRUFETUUubWQKaW5kZXggOTVhMGM0My4uMTgzNzk5NSAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2dlbl9taWNyb19tdXRhYmxlX29wX3Jlc29sdmVyL1JFQURNRS5tZAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvZ2VuX21pY3JvX211dGFibGVfb3BfcmVzb2x2ZXIvUkVBRE1FLm1kCkBAIC00LDYgKzQsOCBAQAogVGhpcyBnZW5lcmFsbHkgcmVxdWlyZXMgbWFudWFsbHkgZmluZGluZyBvdXQgd2hpY2ggb3BlcmF0b3JzIGFyZSB1c2VkIGluIHRoZSBtb2RlbCB0aHJvdWdoIHRoZSB1c2Ugb2YgYSB2aXN1YWxpemF0aW9uIHRvb2wsIHdoaWNoIG1heSBiZSBpbXByYWN0aWNhbCBpbiBzb21lIGNhc2VzLgogVGhpcyBzY3JpcHQgd2lsbCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIGEgTWljcm9NdXRhYmxlT3BSZXNvbHZlciB3aXRoIG9ubHkgdGhlIHVzZWQgb3BlcmF0b3JzIGZvciBhIGdpdmVuIG1vZGVsIG9yIHNldCBvZiBtb2RlbHMuCiAKK05vdGU6IENoZWNrIGNpL0RvY2tlcmZpbGUubWljcm8gZm9yIHN1cHBvcnRlZCBweXRob24gdmVyc2lvbi4KKwogIyMgSG93IHRvIHJ1bgogCiBiYXplbCBydW4gdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2dlbl9taWNyb19tdXRhYmxlX29wX3Jlc29sdmVyOmdlbmVyYXRlX21pY3JvX211dGFibGVfb3BfcmVzb2x2ZXJfZnJvbV9tb2RlbCAtLSBcCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvZ2VuX21pY3JvX211dGFibGVfb3BfcmVzb2x2ZXIvZ2VuZXJhdGVfbWljcm9fbXV0YWJsZV9vcF9yZXNvbHZlcl9mcm9tX21vZGVsLnB5IGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2dlbl9taWNyb19tdXRhYmxlX29wX3Jlc29sdmVyL2dlbmVyYXRlX21pY3JvX211dGFibGVfb3BfcmVzb2x2ZXJfZnJvbV9tb2RlbC5weQppbmRleCBkZTU4M2RhLi5kN2U2MTQwIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvZ2VuX21pY3JvX211dGFibGVfb3BfcmVzb2x2ZXIvZ2VuZXJhdGVfbWljcm9fbXV0YWJsZV9vcF9yZXNvbHZlcl9mcm9tX21vZGVsLnB5CisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9nZW5fbWljcm9fbXV0YWJsZV9vcF9yZXNvbHZlci9nZW5lcmF0ZV9taWNyb19tdXRhYmxlX29wX3Jlc29sdmVyX2Zyb21fbW9kZWwucHkKQEAgLTIzLDcgKzIzLDcgQEAKIGZyb20gYWJzbCBpbXBvcnQgZmxhZ3MKIGZyb20gbWFrbyBpbXBvcnQgdGVtcGxhdGUKIAotZnJvbSB0ZmxpdGVfbWljcm8udGVuc29yZmxvdy5saXRlLnRvb2xzIGltcG9ydCB2aXN1YWxpemUgYXMgdmlzdWFsaXplCitmcm9tIHRlbnNvcmZsb3cubGl0ZS50b29scyBpbXBvcnQgdmlzdWFsaXplCiAKIFRFTVBMQVRFX0RJUiA9IG9zLnBhdGguam9pbihvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pLCAndGVtcGxhdGVzJykKIFRFTVBMQVRFX0RJUiA9IG9zLnBhdGguYWJzcGF0aChURU1QTEFURV9ESVIpCkBAIC02OSw4ICs2OSw5IEBACiAgICAgZWxzZToKICAgICAgIGZvcm1hdGVkX29wX3N0cmluZyArPSBwYXJ0LnVwcGVyKCkKIAotICAjIEVkZ2UgY2FzZSBmb3IgQWRkVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE0oKS4KKyAgIyBFZGdlIGNhc2VzCiAgIGZvcm1hdGVkX29wX3N0cmluZyA9IGZvcm1hdGVkX29wX3N0cmluZy5yZXBsYWNlKCdMc3RtJywgJ0xTVE0nKQorICBmb3JtYXRlZF9vcF9zdHJpbmcgPSBmb3JtYXRlZF9vcF9zdHJpbmcucmVwbGFjZSgnQmF0Y2hNYXRtdWwnLCAnQmF0Y2hNYXRNdWwnKQogCiAgIHJldHVybiAnQWRkJyArIGZvcm1hdGVkX29wX3N0cmluZwogCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvZ2VuZXJhdGVfY2NfYXJyYXlzLnB5IGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2dlbmVyYXRlX2NjX2FycmF5cy5weQppbmRleCA3NTlkYjU2Li4yYTc3YjRkIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvZ2VuZXJhdGVfY2NfYXJyYXlzLnB5CisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9nZW5lcmF0ZV9jY19hcnJheXMucHkKQEAgLTM1LDggKzM1LDYgQEAKICAgICBvdXRfY2NfZmlsZS53cml0ZSgnI2luY2x1ZGUgPGNzdGRpbnQ+XG5cbicpCiAgICAgb3V0X2NjX2ZpbGUud3JpdGUoJyNpbmNsdWRlICJ7fSJcblxuJy5mb3JtYXQoCiAgICAgICAgIG91dF9mbmFtZS5zcGxpdCgnZ2VuZmlsZXMvJylbLTFdLnJlcGxhY2UoJy5jYycsICcuaCcpKSkKLSAgICBvdXRfY2NfZmlsZS53cml0ZSgnY29uc3QgdW5zaWduZWQgaW50IHt9X3NpemUgPSB7fTtcbicuZm9ybWF0KAotICAgICAgICBhcnJheV9uYW1lLCBzdHIoc2l6ZSkpKQogICAgIG91dF9jY19maWxlLndyaXRlKCdhbGlnbmFzKDE2KSBjb25zdCB7fSB7fVtdID0ge3snLmZvcm1hdCgKICAgICAgICAgYXJyYXlfdHlwZSwgYXJyYXlfbmFtZSkpCiAgICAgb3V0X2NjX2ZpbGUud3JpdGUoYXJyYXlfY29udGVudHMpCkBAIC00NSw4ICs0Myw4IEBACiAgIGVsaWYgb3V0X2ZuYW1lLmVuZHN3aXRoKCcuaCcpOgogICAgIG91dF9oZHJfZmlsZSA9IG9wZW4ob3V0X2ZuYW1lLCAndycpCiAgICAgb3V0X2hkcl9maWxlLndyaXRlKCcjaW5jbHVkZSA8Y3N0ZGludD5cblxuJykKLSAgICBvdXRfaGRyX2ZpbGUud3JpdGUoCi0gICAgICAgICdleHRlcm4gY29uc3QgdW5zaWduZWQgaW50IHt9X3NpemU7XG4nLmZvcm1hdChhcnJheV9uYW1lKSkKKyAgICBvdXRfaGRyX2ZpbGUud3JpdGUoJ2NvbnN0ZXhwciB1bnNpZ25lZCBpbnQge31fc2l6ZSA9IHt9O1xuJy5mb3JtYXQoCisgICAgICAgIGFycmF5X25hbWUsIHN0cihzaXplKSkpCiAgICAgb3V0X2hkcl9maWxlLndyaXRlKCdleHRlcm4gY29uc3Qge30ge31bXTtcbicuZm9ybWF0KAogICAgICAgICBhcnJheV90eXBlLCBhcnJheV9uYW1lKSkKICAgICBvdXRfaGRyX2ZpbGUuY2xvc2UoKQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2xheWVyX2J5X2xheWVyLmNjIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2xheWVyX2J5X2xheWVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZDMyNWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbGF5ZXJfYnlfbGF5ZXIuY2MKQEAgLTAsMCArMSwzMzIgQEAKKy8qIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3M+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHJhbmRvbT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvZmxhdGJ1ZmZlcl9idWlsZGVyLmgiCisjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvdXRpbC5oIgorI2luY2x1ZGUgInRlbnNvcmZsb3cvbGl0ZS9jL2NfYXBpX3R5cGVzLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2MvY29tbW9uLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL2tlcm5lbHMvb3BfbWFjcm9zLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMva2VybmVsX3V0aWwuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fYWxsb2NhdG9yLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2NvbnRleHQuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9faW50ZXJwcmV0ZXIuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fbG9nLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX211dGFibGVfb3BfcmVzb2x2ZXIuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fcmVzb3VyY2VfdmFyaWFibGUuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fdXRpbHMuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvYmVuY2htYXJraW5nL29wX3Jlc29sdmVyLmgiCisjaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2xheWVyX2J5X2xheWVyX3NjaGVtYV9nZW5lcmF0ZWQuaCIKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2xpdGUvc2NoZW1hL3NjaGVtYV9nZW5lcmF0ZWQuaCIKKworbmFtZXNwYWNlIHRmbGl0ZSB7CisKK25hbWVzcGFjZSB7CisKKy8vIFNlZWQgdXNlZCBmb3IgdGhlIHJhbmRvbSBpbnB1dC4gSW5wdXQgZGF0YSBzaG91bGRuJ3QgYWZmZWN0IGludm9jYXRpb24gdGltaW5nCisvLyBzbyByYW5kb21uZXNzIGlzbid0IHJlYWxseSBuZWVkZWQuCitjb25zdGV4cHIgdWludDMyX3Qga1JhbmRvbVNlZWQgPSAweEZCOworCitjb25zdGV4cHIgc2l6ZV90IGtUZW5zb3JBcmVuYVNpemUgPSAzZTY7Citjb25zdGV4cHIgaW50IGtOdW1SZXNvdXJjZVZhcmlhYmxlID0gMTAwOworCitib29sIFNhdmVGaWxlKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIGJ1Ziwgc2l6ZV90IGxlbikgeworICBzdGQ6Om9mc3RyZWFtIG9mcyhuYW1lLCBzdGQ6Om9mc3RyZWFtOjpiaW5hcnkpOworICBpZiAoIW9mcy5pc19vcGVuKCkpIHJldHVybiBmYWxzZTsKKyAgb2ZzLndyaXRlKGJ1ZiwgbGVuKTsKKyAgcmV0dXJuICFvZnMuYmFkKCk7Cit9CisKK1RmTGl0ZVN0YXR1cyBDb252ZXJ0VGVuc29yVHlwZShUZkxpdGVUeXBlIHR5cGUsIFRlbnNvclR5cGVzJiB0ZW5zb3JfdHlwZSkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIGtUZkxpdGVGbG9hdDE2OgorICAgICAgdGVuc29yX3R5cGUgPSBUZW5zb3JUeXBlc19GTE9BVDE2OworICAgICAgcmV0dXJuIGtUZkxpdGVPazsKKyAgICBjYXNlIGtUZkxpdGVCRmxvYXQxNjoKKyAgICAgIHRlbnNvcl90eXBlID0gVGVuc29yVHlwZXNfQkZMT0FUMTY7CisgICAgICByZXR1cm4ga1RmTGl0ZU9rOworICAgIGNhc2Uga1RmTGl0ZUZsb2F0MzI6CisgICAgICB0ZW5zb3JfdHlwZSA9IFRlbnNvclR5cGVzX0ZMT0FUMzI7CisgICAgICByZXR1cm4ga1RmTGl0ZU9rOworICAgIGNhc2Uga1RmTGl0ZUZsb2F0NjQ6CisgICAgICB0ZW5zb3JfdHlwZSA9IFRlbnNvclR5cGVzX0ZMT0FUNjQ7CisgICAgICByZXR1cm4ga1RmTGl0ZU9rOworICAgIGNhc2Uga1RmTGl0ZUludDE2OgorICAgICAgdGVuc29yX3R5cGUgPSBUZW5zb3JUeXBlc19JTlQxNjsKKyAgICAgIHJldHVybiBrVGZMaXRlT2s7CisgICAgY2FzZSBrVGZMaXRlVUludDE2OgorICAgICAgdGVuc29yX3R5cGUgPSBUZW5zb3JUeXBlc19VSU5UMTY7CisgICAgICByZXR1cm4ga1RmTGl0ZU9rOworICAgIGNhc2Uga1RmTGl0ZUludDMyOgorICAgICAgdGVuc29yX3R5cGUgPSBUZW5zb3JUeXBlc19JTlQzMjsKKyAgICAgIHJldHVybiBrVGZMaXRlT2s7CisgICAgY2FzZSBrVGZMaXRlVUludDMyOgorICAgICAgdGVuc29yX3R5cGUgPSBUZW5zb3JUeXBlc19VSU5UMzI7CisgICAgICByZXR1cm4ga1RmTGl0ZU9rOworICAgIGNhc2Uga1RmTGl0ZVVJbnQ4OgorICAgICAgdGVuc29yX3R5cGUgPSBUZW5zb3JUeXBlc19VSU5UODsKKyAgICAgIHJldHVybiBrVGZMaXRlT2s7CisgICAgY2FzZSBrVGZMaXRlSW50ODoKKyAgICAgIHRlbnNvcl90eXBlID0gVGVuc29yVHlwZXNfSU5UODsKKyAgICAgIHJldHVybiBrVGZMaXRlT2s7CisgICAgY2FzZSBrVGZMaXRlSW50NjQ6CisgICAgICB0ZW5zb3JfdHlwZSA9IFRlbnNvclR5cGVzX0lOVDY0OworICAgICAgcmV0dXJuIGtUZkxpdGVPazsKKyAgICBjYXNlIGtUZkxpdGVVSW50NjQ6CisgICAgICB0ZW5zb3JfdHlwZSA9IFRlbnNvclR5cGVzX1VJTlQ2NDsKKyAgICAgIHJldHVybiBrVGZMaXRlT2s7CisgICAgY2FzZSBrVGZMaXRlU3RyaW5nOgorICAgICAgdGVuc29yX3R5cGUgPSBUZW5zb3JUeXBlc19TVFJJTkc7CisgICAgICByZXR1cm4ga1RmTGl0ZU9rOworICAgIGNhc2Uga1RmTGl0ZUJvb2w6CisgICAgICB0ZW5zb3JfdHlwZSA9IFRlbnNvclR5cGVzX0JPT0w7CisgICAgICByZXR1cm4ga1RmTGl0ZU9rOworICAgIGNhc2Uga1RmTGl0ZUNvbXBsZXg2NDoKKyAgICAgIHRlbnNvcl90eXBlID0gVGVuc29yVHlwZXNfQ09NUExFWDY0OworICAgICAgcmV0dXJuIGtUZkxpdGVPazsKKyAgICBjYXNlIGtUZkxpdGVDb21wbGV4MTI4OgorICAgICAgdGVuc29yX3R5cGUgPSBUZW5zb3JUeXBlc19DT01QTEVYMTI4OworICAgICAgcmV0dXJuIGtUZkxpdGVPazsKKyAgICBjYXNlIGtUZkxpdGVSZXNvdXJjZToKKyAgICAgIHRlbnNvcl90eXBlID0gVGVuc29yVHlwZXNfUkVTT1VSQ0U7CisgICAgICByZXR1cm4ga1RmTGl0ZU9rOworICAgIGNhc2Uga1RmTGl0ZVZhcmlhbnQ6CisgICAgICB0ZW5zb3JfdHlwZSA9IFRlbnNvclR5cGVzX1ZBUklBTlQ7CisgICAgICByZXR1cm4ga1RmTGl0ZU9rOworICAgIGNhc2Uga1RmTGl0ZUludDQ6CisgICAgICB0ZW5zb3JfdHlwZSA9IFRlbnNvclR5cGVzX0lOVDQ7CisgICAgICByZXR1cm4ga1RmTGl0ZU9rOworICAgIGNhc2Uga1RmTGl0ZU5vVHlwZToKKyAgICAgIE1pY3JvUHJpbnRmKCJVbnN1cHBvcnRlZCBkYXRhIHR5cGUgJWQgaW4gdGVuc29yXG4iLCB0ZW5zb3JfdHlwZSk7CisgICAgICByZXR1cm4ga1RmTGl0ZUVycm9yOworICB9CisgIHJldHVybiBrVGZMaXRlT2s7Cit9CisKK1RmTGl0ZVN0YXR1cyBTZXRSYW5kb21JbnB1dChjb25zdCB1aW50MzJfdCByYW5kb21fc2VlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2RlbFQmIHVucGFja2VkX21vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1pY3JvSW50ZXJwcmV0ZXImIGludGVycHJldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZGVsVGVzdERhdGFUJiBvdXRwdXRfZGF0YSkgeworICBzdGQ6Om10MTk5MzcgZW5nKHJhbmRvbV9zZWVkKTsKKyAgc3RkOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb248dWludDMyX3Q+IGRpc3QoMCwgMjU1KTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbnRlcnByZXRlci5pbnB1dHNfc2l6ZSgpOyArK2kpIHsKKyAgICBUZkxpdGVUZW5zb3IqIGlucHV0ID0gaW50ZXJwcmV0ZXIuaW5wdXRfdGVuc29yKGkpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxUZW5zb3JEYXRhVD4gdGVzdF9kYXRhKG5ldyBUZW5zb3JEYXRhVCgpKTsKKyAgICB0ZXN0X2RhdGEtPmlucHV0X2luZGV4ID0gaTsKKyAgICB0ZXN0X2RhdGEtPmxheWVyX251bWJlciA9IC0xOworICAgIHRlc3RfZGF0YS0+dGVuc29yX2luZGV4ID0gLTE7CisgICAgdGVzdF9kYXRhLT5udW1fYnl0ZXMgPSBpbnB1dC0+Ynl0ZXM7CisgICAgLy8gbWFrZSB0aGlzIHNoYXJlIHRlbnNvcnR5cGUgd2l0aCB0ZmxpdGUgc2NoZW1hIGxhdGVyCisgICAgVEZfTElURV9FTlNVUkVfU1RBVFVTKENvbnZlcnRUZW5zb3JUeXBlKGlucHV0LT50eXBlLCB0ZXN0X2RhdGEtPmR0eXBlKSk7CisgICAgZm9yIChpbnQgeCA9IDA7IHggPCBpbnB1dC0+ZGltcy0+c2l6ZTsgKyt4KSB7CisgICAgICB0ZXN0X2RhdGEtPnNoYXBlLnB1c2hfYmFjayhpbnB1dC0+ZGltcy0+ZGF0YVt4XSk7CisgICAgfQorCisgICAgLy8gUHJlLXBvcHVsYXRlIGlucHV0IHRlbnNvciB3aXRoIHJhbmRvbSB2YWx1ZXMuCisgICAgdWludDhfdCogaW5wdXRfdmFsdWVzID0gR2V0VGVuc29yRGF0YTx1aW50OF90PihpbnB1dCk7CisgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBpbnB1dC0+Ynl0ZXM7ICsraikgeworICAgICAgaW5wdXRfdmFsdWVzW2pdID0gZGlzdChlbmcpOworICAgICAgdGVzdF9kYXRhLT5kYXRhLnB1c2hfYmFjayhpbnB1dF92YWx1ZXNbal0pOworICAgIH0KKyAgICBvdXRwdXRfZGF0YS5pbnB1dF9kYXRhLnB1c2hfYmFjayhzdGQ6Om1vdmUodGVzdF9kYXRhKSk7CisgIH0KKworICAvLyBHZXQgdGVuc29yIGluZGljZXMgZm9yIGFsbCBtb2RlbCBpbnB1dF90ZW5zb3JzCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdW5wYWNrZWRfbW9kZWwuc3ViZ3JhcGhzWzBdLT5pbnB1dHMuc2l6ZSgpOyArK2kpIHsKKyAgICBvdXRwdXRfZGF0YS5pbnB1dF9kYXRhW2ldLT50ZW5zb3JfaW5kZXggPQorICAgICAgICB1bnBhY2tlZF9tb2RlbC5zdWJncmFwaHNbMF0tPmlucHV0c1tpXTsKKyAgfQorICByZXR1cm4ga1RmTGl0ZU9rOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8Y2hhcltdPiBSZWFkTW9kZWxGaWxlKGNvbnN0IGNoYXIqIG1vZGVsX2ZpbGVfbmFtZSkgeworICBzdGQ6Omlmc3RyZWFtIG1vZGVsX2ZpbGUobW9kZWxfZmlsZV9uYW1lLCBzdGQ6Omlvczo6YmluYXJ5KTsKKyAgaWYgKCFtb2RlbF9maWxlLmlzX29wZW4oKSkgeworICAgIE1pY3JvUHJpbnRmKCJjb3VsZCBub3Qgb3BlbiBtb2RlbCBmaWxlIFxuICIpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgbW9kZWxfZmlsZS5zZWVrZygwLCBzdGQ6Omlvczo6ZW5kKTsKKyAgc2l6ZV90IG51bV9ieXRlcyA9IG1vZGVsX2ZpbGUudGVsbGcoKTsKKyAgbW9kZWxfZmlsZS5zZWVrZygwLCBzdGQ6Omlvczo6YmVnKTsKKyAgc3RkOjp1bmlxdWVfcHRyPGNoYXJbXT4gbW9kZWxfZGF0YShuZXcgY2hhcltudW1fYnl0ZXNdKTsKKyAgbW9kZWxfZmlsZS5yZWFkKG1vZGVsX2RhdGEuZ2V0KCksIG51bV9ieXRlcyk7CisKKyAgcmV0dXJuIG1vZGVsX2RhdGE7Cit9CisKKy8vIFN0b3JlcyB0aGUgSW50ZXJtZWRpYXRlIFRlbnNvciBkYXRhIGZvciBlYWNoIGxheWVyIGludG8gdGhlIHVucGFja2VkCisvLyBNb2RlbFRlc3REYXRhVCBjbGFzcyB3aGljaCBpcyBwYWNrZWQgaW50byB0aGUgZmxhdGJ1ZmZlciAhCitUZkxpdGVTdGF0dXMgU3RvcmVMYXllckJ5TGF5ZXJEYXRhKE1pY3JvSW50ZXJwcmV0ZXImIGludGVycHJldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2RlbFQmIHRmbGl0ZV9tb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kZWxUZXN0RGF0YVQmIG91dHB1dF9kYXRhKSB7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGZsaXRlX21vZGVsLnN1YmdyYXBocy5zaXplKCk7ICsraSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxTdWJncmFwaERhdGFUPiBzdWJncmFwaF9kYXRhKG5ldyBTdWJncmFwaERhdGFUKCkpOworICAgIHN1YmdyYXBoX2RhdGEtPnN1YmdyYXBoX2luZGV4ID0gaTsKKworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgdGZsaXRlX21vZGVsLnN1YmdyYXBoc1tpXS0+b3BlcmF0b3JzLnNpemUoKTsgKytqKSB7CisgICAgICBmb3IgKHNpemVfdCBrID0gMDsKKyAgICAgICAgICAgayA8IHRmbGl0ZV9tb2RlbC5zdWJncmFwaHNbaV0tPm9wZXJhdG9yc1tqXS0+b3V0cHV0cy5zaXplKCk7ICsraykgeworICAgICAgICBzdWJncmFwaF9kYXRhLT5vdXRwdXRzLmVtcGxhY2VfYmFjayhuZXcgVGVuc29yRGF0YVQoKSk7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxUZW5zb3JEYXRhVD4mIHRlbnNvcl9kYXRhID0KKyAgICAgICAgICAgIHN1YmdyYXBoX2RhdGEtPm91dHB1dHMuYmFjaygpOworCisgICAgICAgIC8vIGlucHV0X2luZGV4CisgICAgICAgIHRlbnNvcl9kYXRhLT5pbnB1dF9pbmRleCA9IC0xOworCisgICAgICAgIC8vIHRlbnNvciBpbmRleAorICAgICAgICB0ZW5zb3JfZGF0YS0+dGVuc29yX2luZGV4ID0KKyAgICAgICAgICAgIHRmbGl0ZV9tb2RlbC5zdWJncmFwaHNbaV0tPm9wZXJhdG9yc1tqXS0+b3V0cHV0c1trXTsKKworICAgICAgICBUZkxpdGVFdmFsVGVuc29yKiBsYXllcl9vdXRwdXRfdGVuc29yID0KKyAgICAgICAgICAgIGludGVycHJldGVyLkdldFRlbnNvcihzdWJncmFwaF9kYXRhLT5vdXRwdXRzLmJhY2soKS0+dGVuc29yX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmdyYXBoX2RhdGEtPnN1YmdyYXBoX2luZGV4KTsKKworICAgICAgICAvLyBkaW1zCisgICAgICAgIHRlbnNvcl9kYXRhLT5zaGFwZS5hc3NpZ24oCisgICAgICAgICAgICBsYXllcl9vdXRwdXRfdGVuc29yLT5kaW1zLT5kYXRhLAorICAgICAgICAgICAgbGF5ZXJfb3V0cHV0X3RlbnNvci0+ZGltcy0+ZGF0YSArIGxheWVyX291dHB1dF90ZW5zb3ItPmRpbXMtPnNpemUpOworCisgICAgICAgIC8vIGR0eXBlCisgICAgICAgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUygKKyAgICAgICAgICAgIENvbnZlcnRUZW5zb3JUeXBlKGxheWVyX291dHB1dF90ZW5zb3ItPnR5cGUsIHRlbnNvcl9kYXRhLT5kdHlwZSkpOworICAgICAgICAvLyBudW1fYnl0ZXMKKyAgICAgICAgdGVuc29yX2RhdGEtPm51bV9ieXRlcyA9IEV2YWxUZW5zb3JCeXRlcyhsYXllcl9vdXRwdXRfdGVuc29yKTsKKworICAgICAgICB1aW50OF90KiB0ZW5zb3JfdmFsdWVzID0KKyAgICAgICAgICAgIG1pY3JvOjpHZXRUZW5zb3JEYXRhPHVpbnQ4X3Q+KGxheWVyX291dHB1dF90ZW5zb3IpOworCisgICAgICAgIC8vIGRhdGEKKyAgICAgICAgdGVuc29yX2RhdGEtPmRhdGEuYXNzaWduKAorICAgICAgICAgICAgdGVuc29yX3ZhbHVlcywKKyAgICAgICAgICAgIHRlbnNvcl92YWx1ZXMgKyBFdmFsVGVuc29yQnl0ZXMobGF5ZXJfb3V0cHV0X3RlbnNvcikpOworCisgICAgICAgIC8vIGxheWVyX251bWJlcgorICAgICAgICB0ZW5zb3JfZGF0YS0+bGF5ZXJfbnVtYmVyID0gajsKKyAgICAgIH0KKyAgICB9CisgICAgb3V0cHV0X2RhdGEuc3ViZ3JhcGhfZGF0YS5wdXNoX2JhY2soc3RkOjptb3ZlKHN1YmdyYXBoX2RhdGEpKTsKKyAgfQorCisgIHJldHVybiBrVGZMaXRlT2s7Cit9CisKK2Jvb2wgV3JpdGVUb0ZpbGUoY29uc3QgY2hhciogb3V0cHV0X2ZpbGVfbmFtZSwgTW9kZWxUZXN0RGF0YVQmIG91dHB1dF9kYXRhKSB7CisgIGZsYXRidWZmZXJzOjpEZWZhdWx0QWxsb2NhdG9yIGFsbG9jYXRvcjsKKyAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyIGZiYnsyMDQ4LCAmYWxsb2NhdG9yfTsKKyAgYXV0byBuZXdfbW9kZWwgPSBNb2RlbFRlc3REYXRhOjpQYWNrKGZiYiwgJm91dHB1dF9kYXRhKTsKKyAgZmJiLkZpbmlzaChuZXdfbW9kZWwpOworICByZXR1cm4gU2F2ZUZpbGUob3V0cHV0X2ZpbGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGZiYi5HZXRCdWZmZXJQb2ludGVyKCkpLAorICAgICAgICAgICAgICAgICAgZmJiLkdldFNpemUoKSk7Cit9CisKK1RmTGl0ZVN0YXR1cyBJbnZva2UoY29uc3QgTW9kZWwqIG1vZGVsLCBNb2RlbFRlc3REYXRhVCYgb3V0cHV0X2RhdGEpIHsKKyAgY29uc3QgdGZsaXRlOjpNb2RlbFQgdW5wYWNrZWRfbW9kZWwgPSAqbW9kZWwtPlVuUGFjaygpOworICBhbGlnbmFzKDE2KSBzdGF0aWMgdWludDhfdCB0ZW5zb3JfYXJlbmFba1RlbnNvckFyZW5hU2l6ZV07CisKKyAgVGZsbU9wUmVzb2x2ZXIgb3BfcmVzb2x2ZXI7CisgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyhDcmVhdGVPcFJlc29sdmVyKG9wX3Jlc29sdmVyKSk7CisKKyAgTWljcm9BbGxvY2F0b3IqIGFsbG9jYXRvciA9IE1pY3JvQWxsb2NhdG9yOjpDcmVhdGUoCisgICAgICB0ZW5zb3JfYXJlbmEsIGtUZW5zb3JBcmVuYVNpemUsIE1lbW9yeVBsYW5uZXJUeXBlOjprTGluZWFyKTsKKworICBNaWNyb0ludGVycHJldGVyIGludGVycHJldGVyKAorICAgICAgbW9kZWwsIG9wX3Jlc29sdmVyLCBhbGxvY2F0b3IsCisgICAgICBNaWNyb1Jlc291cmNlVmFyaWFibGVzOjpDcmVhdGUoYWxsb2NhdG9yLCBrTnVtUmVzb3VyY2VWYXJpYWJsZSksIG51bGxwdHIpOworICBURl9MSVRFX0VOU1VSRV9TVEFUVVMoaW50ZXJwcmV0ZXIuQWxsb2NhdGVUZW5zb3JzKCkpOworCisgIFRGX0xJVEVfQVNTRVJUKGludGVycHJldGVyLnByZXNlcnZlX2FsbF90ZW5zb3JzKCkpOworCisgIE1pY3JvUHJpbnRmKCIiKTsgIC8vIG51bGwgTWljcm9QcmludGYgc2VydmVzIGFzIGEgbmV3bGluZS4KKworICAvLyBGb3Igc3RyZWFtaW5nIG1vZGVscywgdGhlIGludGVycHJldGVyIHdpbGwgcmV0dXJuIGtUZkxpdGVBYm9ydCBpZiB0aGUgbW9kZWwKKyAgLy8gZG9lcyBub3QgeWV0IGhhdmUgZW5vdWdoIGRhdGEgdG8gbWFrZSBhbiBpbmZlcmVuY2UuIEFzIHN1Y2gsIHdlIG5lZWQgdG8KKyAgLy8gaW52b2tlIHRoZSBpbnRlcnByZXRlciBtdWx0aXBsZSB0aW1lcyB1bnRpbCB3ZSBlaXRoZXIgcmVjZWl2ZSBhbiBlcnJvciBvcgorICAvLyBrVGZMaXRlT2suIFRoaXMgbG9vcCBhbHNvIHdvcmtzIGZvciBub24tc3RyZWFtaW5nIG1vZGVscywgYXMgdGhleSdsbCBqdXN0CisgIC8vIHJldHVybiBrVGZMaXRlT2sgYWZ0ZXIgdGhlIGZpcnN0IGludm9jYXRpb24uCisgIHVpbnQzMl90IHNlZWQgPSBrUmFuZG9tU2VlZDsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBURl9MSVRFX0VOU1VSRV9TVEFUVVMoCisgICAgICAgIFNldFJhbmRvbUlucHV0KHNlZWQrKywgdW5wYWNrZWRfbW9kZWwsIGludGVycHJldGVyLCBvdXRwdXRfZGF0YSkpOworICAgIFRmTGl0ZVN0YXR1cyBzdGF0dXMgPSBpbnRlcnByZXRlci5JbnZva2UoKTsKKyAgICBpZiAoKHN0YXR1cyAhPSBrVGZMaXRlT2spICYmIChzdGF0aWNfY2FzdDxpbnQ+KHN0YXR1cykgIT0ga1RmTGl0ZUFib3J0KSkgeworICAgICAgTWljcm9QcmludGYoIk1vZGVsIGludGVycHJldGVyIGludm9jYXRpb24gZmFpbGVkOiAlZFxuIiwgc3RhdHVzKTsKKyAgICAgIHJldHVybiBrVGZMaXRlRXJyb3I7CisgICAgfQorCisgICAgaWYgKHN0YXR1cyA9PSBrVGZMaXRlT2spIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBURl9MSVRFX0VOU1VSRV9TVEFUVVMoCisgICAgICBTdG9yZUxheWVyQnlMYXllckRhdGEoaW50ZXJwcmV0ZXIsIHVucGFja2VkX21vZGVsLCBvdXRwdXRfZGF0YSkpOworCisgIHJldHVybiBrVGZMaXRlT2s7Cit9Cit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSB0ZmxpdGUKKworLyogVXNhZ2UgaW5mb3JtYXRpb246CisgVGhpcyBiaW5hcnkgd2lsbCB3cml0ZSBhIGRlYnVnZ2luZyBmbGF0YnVmZmVyIHRvIHRoZSBwYXRoIHByb3ZpZGUgaW4gMm5kIGFyZworIHVzaW5nIHRoZSB0ZmxpdGVfbW9kZWwgcHJvdmlkZWQgaW4gdGhlIDFzdCBhcmcgOgorICAgYGJhemVsIHJ1biB0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHM6bGF5ZXJfYnlfbGF5ZXJfb3V0cHV0X3Rvb2wgLS0gXAorICAgICA8L3BhdGgvdG8vaW5wdXRfbW9kZWwudGZsaXRlPgorICAgICA8L3BhdGgvdG8vb3V0cHV0LmZpbGVfbmFtZT5gICovCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICBpZiAoYXJnYyA8IDIpIHsKKyAgICBNaWNyb1ByaW50ZigibGF5ZXJfYnlfbGF5ZXI6IGludmFsaWQgdXNhZ2UhXG4iKTsKKyAgICBNaWNyb1ByaW50ZigKKyAgICAgICAgInVzYWdlOiBsYXllcl9ieV9sYXllcl9vdXRwdXRfdG9vbCAgPC9wYXRoL3RvL2lucHV0X21vZGVsLnRmbGl0ZT4gIgorICAgICAgICAiPC9wYXRoL3RvL291dHB1dC5maWxlX25hbWU+Iik7CisgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgfQorCisgIGNvbnN0IGNoYXIqIG1vZGVsX2ZpbGVfbmFtZSA9IGFyZ3ZbMV07CisgIGNvbnN0IGNoYXIqIG91dHB1dF9maWxlX25hbWUgPSBhcmd2WzJdOworCisgIGNvbnN0IGF1dG8gbW9kZWxfZmlsZV9jb250ZW50ID0gdGZsaXRlOjpSZWFkTW9kZWxGaWxlKG1vZGVsX2ZpbGVfbmFtZSk7CisKKyAgaWYgKCFtb2RlbF9maWxlX2NvbnRlbnQpIHsKKyAgICBNaWNyb1ByaW50ZigiQ291bGQgbm90IHJlYWQgbW9kZWwgZnJvbSBmaWxlOiAlcyIsIG1vZGVsX2ZpbGVfbmFtZSk7CisgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKKyAgfQorCisgIGNvbnN0IHRmbGl0ZTo6TW9kZWwqIG1vZGVsID0gdGZsaXRlOjpHZXRNb2RlbChtb2RlbF9maWxlX2NvbnRlbnQuZ2V0KCkpOworCisgIE1vZGVsVGVzdERhdGFUIG91dHB1dF9kYXRhOworCisgIFRGX0xJVEVfRU5TVVJFX1NUQVRVUyh0ZmxpdGU6Okludm9rZShtb2RlbCwgb3V0cHV0X2RhdGEpKTsKKworICBpZiAoIXRmbGl0ZTo6V3JpdGVUb0ZpbGUob3V0cHV0X2ZpbGVfbmFtZSwgb3V0cHV0X2RhdGEpKSB7CisgICAgTWljcm9QcmludGYoIkNvdWxkIG5vdCB3cml0ZSB0byAlcyIsIG91dHB1dF9maWxlX25hbWUpOworICAgIHJldHVybiBFWElUX0ZBSUxVUkU7CisgIH0KKworICByZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2xheWVyX2J5X2xheWVyX2RlYnVnZ2VyLnB5IGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2xheWVyX2J5X2xheWVyX2RlYnVnZ2VyLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYTI2M2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbGF5ZXJfYnlfbGF5ZXJfZGVidWdnZXIucHkKQEAgLTAsMCArMSwyNzAgQEAKKyMgQ29weXJpZ2h0IDIwMjMgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisiIiJSdW5zIFRGTE0gc3BlY2lmaWMgdHJhbnNmb3JtYXRpb25zIHRvIHJlZHVjZSBtb2RlbCBzaXplIG9uIGEgLnRmbGl0ZSBtb2RlbC4iIiIKKworaW1wb3J0IHN5cworaW1wb3J0IHVuaXR0ZXN0CisKK2Zyb20gYWJzbCBpbXBvcnQgYXBwCitmcm9tIGFic2wgaW1wb3J0IGZsYWdzCitmcm9tIGFic2wgaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBudW1weSBhcyBucAoraW1wb3J0IHRlbnNvcmZsb3cgYXMgdGYKKworZnJvbSB0ZmxpdGVfbWljcm8udGVuc29yZmxvdy5saXRlLnRvb2xzIGltcG9ydCBmbGF0YnVmZmVyX3V0aWxzCitmcm9tIHRlbnNvcmZsb3cucHl0aG9uLnBsYXRmb3JtIGltcG9ydCBnZmlsZQorZnJvbSB0ZmxpdGVfbWljcm8ucHl0aG9uLnRmbGl0ZV9taWNybyBpbXBvcnQgcnVudGltZQorZnJvbSB0ZmxpdGVfbWljcm8udGVuc29yZmxvdy5saXRlLm1pY3JvLnRvb2xzIGltcG9ydCBsYXllcl9ieV9sYXllcl9zY2hlbWFfcHlfZ2VuZXJhdGVkIGFzIGxheWVyX3NjaGVtYV9mYgorZnJvbSB0ZmxpdGVfbWljcm8udGVuc29yZmxvdy5saXRlLm1pY3JvLnRvb2xzIGltcG9ydCBtb2RlbF90cmFuc2Zvcm1zX3V0aWxzCisKK25wLnNldF9wcmludG9wdGlvbnModGhyZXNob2xkPXN5cy5tYXhzaXplKQorCisjIFVzYWdlIGluZm9ybWF0aW9uOgorIyBUaGlzIFB5dGhvbiBUb29sL1NjcmlwdCBjYW4gZmlyc3QgYmUgdXNlZCB0byBjb21wYXJlIFRGTE0gdnMgVGZsaXRlIG91dHB1dHMgZm9yCisjIHJhbmRvbSBJbnB1dHMgYnkgb25seSBwcm92aWRpbmcgYSBUZkxpdGUgZmlsZQorCisjIFRmTGl0ZSB2cyBURkxNIGNvbW1hbmQ6CisjICAgYGJhemVsIHJ1biB0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHM6bGF5ZXJfYnlfbGF5ZXJfZGVidWdnZXIgLS0gXAorIyAgICAgLS1pbnB1dF90ZmxpdGVfZmlsZT08L3BhdGgvdG8vbXlfbW9kZWwudGZsaXRlPmAKKworIyBUaGlzIFB5dGhvbiBUb29sL1NjcmlwdCBjYW4gYWxzbyBiZSB1c2VkIHRvIGNvbWFwcmUgVEZMTSB2cyBFeHBlY3RlZAorIyBPdXRwdXQvRmxhdGJ1ZmZlciBwcm92aWRlZCBieSB0aGUgQysrIFRvb2wvYmluYXJ5LgorCisjIFRGTE0gdnMgRXhwZWN0ZWQgQ29tbWFuZDoKKyMgICBgYmF6ZWwgcnVuIHRlbnNvcmZsb3cvbGl0ZS9taWNyby90b29sczpsYXllcl9ieV9sYXllcl9kZWJ1Z2dlciAtLSBcCisjICAgICAtLWlucHV0X3RmbGl0ZV9maWxlPTwvcGF0aC90by9teV9tb2RlbC50ZmxpdGU+IFwKKyMgICAgIC0tZGJnX2ZpbGU9PC9wYXRoL3RvL215X2RlYnVnX2ZsYXRidWZmZXJfZmlsZT5gCisKKyMgT3B0aW9uYWwgRmxhZ3M6CisjICAgLS1wcmludF9kdW1wCisjICAgICAgICAgICB3aGVuIHRoaXMgZmxhZ3MgaXMgc2V0IGl0IHdpbGwgZHVtcCBhIHBhcnQgb2YgdGhlIFRGTE0gYW5kIE91cHV0CisjICAgICAgICAgICBpdCdzIGNvbXBhcmVkIGFnYWluc3QgZm9yIGVhY2ggbGF5ZXIKKworIyAgIC0tcm5nCisjICAgICAgICAgICBpbnRlZ2VyIGZsYWcgdGhhdCBvbmx5IHdvcmtzIGluIFRmTGl0ZSB2cyBURkxNIGNvbXBhcmlzb24od2hlbiBvbmx5CisjICAgICAgICAgICBhIFRmTGl0ZSBNb2RlbCBpcyBQcm92aWRlZCkuSXQgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBybmcgc2VlZCB0byBhCisjICAgICAgICAgICBkaWZmZXJlbiB2YWx1ZSB0aGVuIGl0J3MgZGVmYXVsdCB2YWx1ZSBvZiA0Mi4KKworX0lOUFVUX1RGTElURV9GSUxFID0gZmxhZ3MuREVGSU5FX3N0cmluZygKKyAgICAiaW5wdXRfdGZsaXRlX2ZpbGUiLAorICAgIE5vbmUsCisgICAgIkZ1bGwgcGF0aCBuYW1lIHRvIHRoZSBpbnB1dCBURkxpdGUgZmlsZS4iLAorICAgIHJlcXVpcmVkPVRydWUpCisKK19STkcgPSBmbGFncy5ERUZJTkVfaW50ZWdlcigKKyAgICAicm5nIiwKKyAgICA0MiwKKyAgICAiVGhpcyBmbGFnIGRlZmluZXMgcm5nIHNlZWQgdXNlZCB0byBnZW5lcmF0ZSByYW5kb20gdGVzdCBkYXRhIGZvciB0aGUiCisgICAgIiBwcm92aWRlZCBtb2RlbC4gVGhpcyBvbmx5IG9jY3VycyB3aGVuIG5vIGlucHV0L2dvbGRlbiBkYXRhIGFyZSBwcm92aWRlZC4iCisgICAgIiBJdCBpcyBkZWZhdWx0ZWQgdG8gNDIuICIsCispCisKK19ERUJVR19GSUxFID0gZmxhZ3MuREVGSU5FX3N0cmluZygKKyAgICAibGF5ZXJfYnlfbGF5ZXJfZGF0YV9maWxlIiwKKyAgICBOb25lLAorICAgICJGdWxsIHBhdGggdG8gdGhlIGRlYnVnIGZpbGUgLCBnZW5lcmF0ZWQgaW4gQysrIiwKKyAgICByZXF1aXJlZD1GYWxzZSwKKykKKworX1BSSU5UX1BSRVZJRVcgPSBmbGFncy5ERUZJTkVfYm9vbCgKKyAgICAicHJpbnRfZHVtcCIsCisgICAgRmFsc2UsCisgICAgIldoZW4gdGhpcyBmbGFnIGlzIHNldCB0byBUcnVlLCBpdCBwcmludHMgYSBwcmV2aWV3IG9mIGVsZW1lbnRzIG9mIHRoZSBURkxNIgorICAgICIgb3V0cHV0IGFuZCBvdXRwdXQgaXQncyBiZWluZyBjb21wYXJlZCB3aXRoLiIsCisgICAgcmVxdWlyZWQ9RmFsc2UsCispCisKKworZGVmIG51bXB5X2Zyb21fdGVuc29yX3R5cGUodGVuc29yX3R5cGVfaWR4KToKKyAgIiIiR2l2ZXMgdGhlIGVxdWl2YWxlbnQgbnVtcHkgZHR5cGUgYmFzZWQgb24gVGVuc29yVHlwZSBjbGFzcyAoc2NoZW1hKSBudW1iZXIuIiIiCisgIHRlbnNvcl90eXBlX2lkeF90b19udW1weSA9IHsKKyAgICAgIGxheWVyX3NjaGVtYV9mYi5UZW5zb3JUeXBlcy5GTE9BVDMyOgorICAgICAgbnAuZmxvYXQzMiwKKyAgICAgIGxheWVyX3NjaGVtYV9mYi5UZW5zb3JUeXBlcy5GTE9BVDE2OgorICAgICAgbnAuZmxvYXQxNiwKKyAgICAgIGxheWVyX3NjaGVtYV9mYi5UZW5zb3JUeXBlcy5JTlQzMjoKKyAgICAgIG5wLmludDMyLAorICAgICAgbGF5ZXJfc2NoZW1hX2ZiLlRlbnNvclR5cGVzLlVJTlQ4OgorICAgICAgbnAudWludDgsCisgICAgICBsYXllcl9zY2hlbWFfZmIuVGVuc29yVHlwZXMuSU5UNjQ6CisgICAgICBucC5pbnQ2NCwKKyAgICAgIGxheWVyX3NjaGVtYV9mYi5UZW5zb3JUeXBlcy5TVFJJTkc6CisgICAgICBucC5ieXRlc18sCisgICAgICBsYXllcl9zY2hlbWFfZmIuVGVuc29yVHlwZXMuQk9PTDoKKyAgICAgIG5wLmJvb2xfLAorICAgICAgbGF5ZXJfc2NoZW1hX2ZiLlRlbnNvclR5cGVzLklOVDE2OgorICAgICAgbnAuaW50MTYsCisgICAgICBsYXllcl9zY2hlbWFfZmIuVGVuc29yVHlwZXMuQ09NUExFWDY0OgorICAgICAgbnAuY29tcGxleDY0LAorICAgICAgbGF5ZXJfc2NoZW1hX2ZiLlRlbnNvclR5cGVzLklOVDg6CisgICAgICBucC5pbnQ4LAorICAgICAgbGF5ZXJfc2NoZW1hX2ZiLlRlbnNvclR5cGVzLkZMT0FUNjQ6CisgICAgICBucC5mbG9hdDY0LAorICAgICAgbGF5ZXJfc2NoZW1hX2ZiLlRlbnNvclR5cGVzLkNPTVBMRVgxMjg6CisgICAgICBucC5jb21wbGV4MTI4LAorICAgICAgbGF5ZXJfc2NoZW1hX2ZiLlRlbnNvclR5cGVzLlVJTlQ2NDoKKyAgICAgIG5wLnVpbnQ2NCwKKyAgICAgIGxheWVyX3NjaGVtYV9mYi5UZW5zb3JUeXBlcy5SRVNPVVJDRToKKyAgICAgICJSRVNPUkNFIiwKKyAgICAgIGxheWVyX3NjaGVtYV9mYi5UZW5zb3JUeXBlcy5WQVJJQU5UOgorICAgICAgIlZBUklBTlQiLAorICAgICAgbGF5ZXJfc2NoZW1hX2ZiLlRlbnNvclR5cGVzLlVJTlQzMjoKKyAgICAgIG5wLnVpbnQzMiwKKyAgICAgIGxheWVyX3NjaGVtYV9mYi5UZW5zb3JUeXBlcy5VSU5UMTY6CisgICAgICBucC51aW50MTYsCisgICAgICAjIElOVDQgaXMgbWFwcGVkIHRvIElOVDgsIGIvMjQ2ODA2NjM0CisgICAgICBsYXllcl9zY2hlbWFfZmIuVGVuc29yVHlwZXMuSU5UNDoKKyAgICAgIG5wLmludDgsCisgIH0KKyAgcmV0dXJuIHRlbnNvcl90eXBlX2lkeF90b19udW1weS5nZXQodGVuc29yX3R5cGVfaWR4KQorCisKK2RlZiBHZW5lcmF0ZVJhbmRvbUlucHV0VGZMaXRlQ29tcGFyaXNvbih0ZmxtX2ludGVycHJldGVyLCB0ZmxpdGVfaW50ZXJwcmV0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwsIHJuZ192YWx1ZSk6CisgIHN1YmdyYXBoX2luZm8gPSBsYXllcl9zY2hlbWFfZmIuTW9kZWxUZXN0RGF0YVQoKQorICBzdWJncmFwaF9pbmZvLnN1YmdyYXBoRGF0YSA9IFtdCisgIHJuZ19zZWVkID0gbnAucmFuZG9tLmRlZmF1bHRfcm5nKHNlZWQ9cm5nX3ZhbHVlKQorCisgIGZvciBzdWJncmFwaF9pbmRleCwgc3ViZ3JhcGggaW4gZW51bWVyYXRlKG1vZGVsLnN1YmdyYXBocyk6CisgICAgc3ViZ3JhcGhfZGF0YSA9IGxheWVyX3NjaGVtYV9mYi5TdWJncmFwaERhdGFUKCkKKyAgICBzdWJncmFwaF9kYXRhLnN1YmdyYXBoSW5kZXggPSBzdWJncmFwaF9pbmRleAorICAgIHN1YmdyYXBoX2RhdGEub3V0cHV0cyA9IFtdCisKKyAgICBmb3Igb3BfaW5kZXgsIG9wZXJhdG9yIGluIGVudW1lcmF0ZShzdWJncmFwaC5vcGVyYXRvcnMpOgorICAgICAgZm9yIG91dHB1dCBpbiBvcGVyYXRvci5vdXRwdXRzOgorICAgICAgICB0ZW5zb3JfZGF0YSA9IGxheWVyX3NjaGVtYV9mYi5UZW5zb3JEYXRhVCgpCisgICAgICAgIHRlbnNvcl9kYXRhLmxheWVyTnVtYmVyID0gb3BfaW5kZXgKKyAgICAgICAgdGVuc29yX2RhdGEudGVuc29ySW5kZXggPSBvdXRwdXQKKyAgICAgICAgc3ViZ3JhcGhfZGF0YS5vdXRwdXRzLmFwcGVuZCh0ZW5zb3JfZGF0YSkKKyAgICBzdWJncmFwaF9pbmZvLnN1YmdyYXBoRGF0YS5hcHBlbmQoc3ViZ3JhcGhfZGF0YSkKKworICBmb3IgaW5kZXgsIGlucHV0X3RlbnNvcl9pbmRleCBpbiBlbnVtZXJhdGUobW9kZWwuc3ViZ3JhcGhzWzBdLmlucHV0cyk6CisgICAgaW5wdXRfdGVuc29yID0gbW9kZWwuc3ViZ3JhcGhzWzBdLnRlbnNvcnNbaW5wdXRfdGVuc29yX2luZGV4XQorICAgIHJhbmRvbV9kYXRhID0gbW9kZWxfdHJhbnNmb3Jtc191dGlscy5nZW5lcmF0ZV9yYW5kb21faW5wdXRfZGF0YSgKKyAgICAgICAgbW9kZWwsIGlucHV0X3RlbnNvciwgcm5nX3NlZWQpCisgICAgdGZsbV9pbnRlcnByZXRlci5zZXRfaW5wdXQocmFuZG9tX2RhdGEsIGluZGV4KQorICAgIHRmbGl0ZV9pbnRlcnByZXRlci5zZXRfdGVuc29yKGlucHV0X3RlbnNvcl9pbmRleCwgcmFuZG9tX2RhdGEpCisgIHJldHVybiBzdWJncmFwaF9pbmZvLCB0ZmxtX2ludGVycHJldGVyLCB0ZmxpdGVfaW50ZXJwcmV0ZXIKKworCitkZWYgUmVhZERlYnVnRmlsZSgpOgorICB3aXRoIGdmaWxlLkdGaWxlKF9ERUJVR19GSUxFLnZhbHVlLCAicmIiKSBhcyBkZWJ1Z19maWxlX2hhbmRsZToKKyAgICBkZWJ1Z19ieXRlYXJyYXkgPSBieXRlYXJyYXkoZGVidWdfZmlsZV9oYW5kbGUucmVhZCgpKQorICBmbGF0YnVmZmVyX3Jvb3Rfb2JqZWN0ID0gbGF5ZXJfc2NoZW1hX2ZiLk1vZGVsVGVzdERhdGEuR2V0Um9vdEFzKAorICAgICAgZGVidWdfYnl0ZWFycmF5LCAwKQorICBkZWJ1Z19vYmogPSBsYXllcl9zY2hlbWFfZmIuTW9kZWxUZXN0RGF0YVQuSW5pdEZyb21PYmooCisgICAgICBmbGF0YnVmZmVyX3Jvb3Rfb2JqZWN0KQorICByZXR1cm4gZGVidWdfb2JqCisKKworZGVmIFNldERlYnVnRmlsZUludGVycHJldGVySW5wdXQodGZsbV9pbnRlcnByZXRlciwgdGZsaXRlX2ludGVycHJldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfb2JqKToKKyAgZm9yIGlucHV0cyBpbiBkZWJ1Z19vYmouaW5wdXREYXRhOgorICAgIGlucHV0X2FycmF5ID0gbnAuZnJvbWJ1ZmZlcihieXRlYXJyYXkoaW5wdXRzLmRhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdHlwZT1udW1weV9mcm9tX3RlbnNvcl90eXBlKGlucHV0cy5kdHlwZSkpCisgICAgaW5wdXRfYXJyYXkgPSBucC5yZXNoYXBlKGlucHV0X2FycmF5LCBpbnB1dHMuc2hhcGUpCisgICAgdGZsbV9pbnRlcnByZXRlci5zZXRfaW5wdXQoaW5wdXRfYXJyYXksIGlucHV0cy5pbnB1dEluZGV4KQorICAgIHRmbGl0ZV9pbnRlcnByZXRlci5zZXRfdGVuc29yKGlucHV0cy50ZW5zb3JJbmRleCwgaW5wdXRfYXJyYXkpCisKKyAgcmV0dXJuIHRmbG1faW50ZXJwcmV0ZXIsIHRmbGl0ZV9pbnRlcnByZXRlcgorCisKK2RlZiBtYWluKF8pIC0+IE5vbmU6CisgIGxvZ2dpbmcuaW5mbygKKyAgICAgICJcbi0tUnVubmluZyBURkxNIHZzIFRmTGl0ZSBsYXllciBieSBsYXllciBkZWJ1Z2dlciBvbjogJXMiLAorICAgICAgX0lOUFVUX1RGTElURV9GSUxFLnZhbHVlLAorICApCisKKyAgbW9kZWwgPSBmbGF0YnVmZmVyX3V0aWxzLnJlYWRfbW9kZWwoX0lOUFVUX1RGTElURV9GSUxFLnZhbHVlKQorCisgIHRmbG1faW50ZXJwcmV0ZXIgPSBydW50aW1lLkludGVycHJldGVyLmZyb21fZmlsZSgKKyAgICAgIF9JTlBVVF9URkxJVEVfRklMRS52YWx1ZSwKKyAgICAgIGludHJlcHJldGVyX2NvbmZpZz1ydW50aW1lLkludGVycHJldGVyQ29uZmlnLmtQcmVzZXJ2ZUFsbFRlbnNvcnMsCisgICkKKworICB0ZmxpdGVfaW50ZXJwcmV0ZXIgPSB0Zi5saXRlLkludGVycHJldGVyKAorICAgICAgbW9kZWxfcGF0aD1fSU5QVVRfVEZMSVRFX0ZJTEUudmFsdWUsCisgICAgICBleHBlcmltZW50YWxfcHJlc2VydmVfYWxsX3RlbnNvcnM9VHJ1ZSwKKyAgKQorCisgIHRmbGl0ZV9pbnRlcnByZXRlci5hbGxvY2F0ZV90ZW5zb3JzKCkKKworICBkZWJ1Z19vYmogPSBOb25lCisKKyAgIyBTZXR0aW5nIElucHV0cyBlaXRoZXIgcmFuZG9tbHkgb3IgdXNpbmcgcHJvdmlkZWQgRGVidWcgRmlsZQorICBpZiBfREVCVUdfRklMRS52YWx1ZSA9PSBOb25lOgorICAgIGRlYnVnX29iaiwgdGZsbV9pbnRlcnByZXRlciwgdGZsaXRlX2ludGVycHJldGVyID0gKAorICAgICAgICBHZW5lcmF0ZVJhbmRvbUlucHV0VGZMaXRlQ29tcGFyaXNvbih0ZmxtX2ludGVycHJldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZmxpdGVfaW50ZXJwcmV0ZXIsIG1vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfUk5HLnZhbHVlKSkKKyAgICB0ZmxpdGVfaW50ZXJwcmV0ZXIuaW52b2tlKCkKKyAgZWxzZToKKyAgICBkZWJ1Z19vYmogPSBSZWFkRGVidWdGaWxlKCkKKyAgICB0ZmxtX2ludGVycHJldGVyLCB0ZmxpdGVfaW50ZXJwcmV0ZXIgPSBTZXREZWJ1Z0ZpbGVJbnRlcnByZXRlcklucHV0KAorICAgICAgICB0ZmxtX2ludGVycHJldGVyLCB0ZmxpdGVfaW50ZXJwcmV0ZXIsIGRlYnVnX29iaikKKworICB0ZmxtX2ludGVycHJldGVyLmludm9rZSgpCisgIGNvbXBhcmlzb24gPSAiIgorCisgIGZvciBzdWJncmFwaCBpbiBkZWJ1Z19vYmouc3ViZ3JhcGhEYXRhOgorICAgIGZvciBvdXRwdXQgaW4gc3ViZ3JhcGgub3V0cHV0czoKKyAgICAgIHRmbG1fb3VwdXQgPSB0ZmxtX2ludGVycHJldGVyLkdldFRlbnNvcigKKyAgICAgICAgICBvdXRwdXQudGVuc29ySW5kZXgsIHN1YmdyYXBoLnN1YmdyYXBoSW5kZXgpWyJ0ZW5zb3JfZGF0YSJdCisKKyAgICAgIGNvbXBhcmlzb25fb3VwdXQgPSBOb25lCisKKyAgICAgIGlmIF9ERUJVR19GSUxFLnZhbHVlID09IE5vbmU6CisgICAgICAgIHRmbGl0ZV9vdXRwdXQgPSB0ZmxpdGVfaW50ZXJwcmV0ZXIuZ2V0X3RlbnNvcihvdXRwdXQudGVuc29ySW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJncmFwaC5zdWJncmFwaEluZGV4KQorICAgICAgICBjb21wYXJpc29uX291cHV0ID0gdGZsaXRlX291dHB1dAorICAgICAgICBjb21wYXJpc29uID0gIlRmTGl0ZSIKKyAgICAgIGVsc2U6CisgICAgICAgIGV4cGVjdGVkX291dHB1dF9kYXRhID0gbnAuZnJvbWJ1ZmZlcihieXRlYXJyYXkob3V0cHV0LmRhdGEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHR5cGU9bnVtcHlfZnJvbV90ZW5zb3JfdHlwZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZHR5cGUpKQorICAgICAgICBleHBlY3RlZF9vdXRwdXRfZGF0YSA9IG5wLnJlc2hhcGUoZXhwZWN0ZWRfb3V0cHV0X2RhdGEsIG91dHB1dC5zaGFwZSkKKyAgICAgICAgY29tcGFyaXNvbiA9ICJFeHBlY3RlZCBHb2xkZW4gRGF0YSIKKyAgICAgICAgY29tcGFyaXNvbl9vdXB1dCA9IGV4cGVjdGVkX291dHB1dF9kYXRhCisKKyAgICAgIGVycm9yX21lc3NhZ2UgPSAoCisgICAgICAgICAgIlxuXG5URkxNIG91dHB1dCBkb2VzIG5vdCBtYXRjaCB7Y29tcGFyaXNvbn0gb3V0cHV0LlxuIFN1YmdyYXBoIgorICAgICAgICAgICIgbnVtYmVyIGlzIHtzdWJncmFwaF9pbmRleH0gXG4gTGF5ZXIgbnVtYmVyIGlzIHtsYXllcl9udW1iZXJ9IFxuIFRoZSIKKyAgICAgICAgICAiIFRlbnNvciBJbmRleCB3aGVyZSB0aGlzIG91dHB1dCBkb2VzIG5vdCBtYXRjaCBpcyB7dGVuc29yX2luZGV4fSIKKyAgICAgICAgICAiIFxuXG5cbiIuZm9ybWF0KAorICAgICAgICAgICAgICBjb21wYXJpc29uPWNvbXBhcmlzb24sCisgICAgICAgICAgICAgIHN1YmdyYXBoX2luZGV4PXN1YmdyYXBoLnN1YmdyYXBoSW5kZXgsCisgICAgICAgICAgICAgIGxheWVyX251bWJlcj1vdXRwdXQubGF5ZXJOdW1iZXIsCisgICAgICAgICAgICAgIHRlbnNvcl9pbmRleD1vdXRwdXQudGVuc29ySW5kZXgsCisgICAgICAgICAgKSkKKyAgICAgIGlmIF9QUklOVF9QUkVWSUVXLnZhbHVlOgorICAgICAgICBwcmludCgibGF5ZXIgbnVtYmVyICIsIG91dHB1dC5sYXllck51bWJlcikKKyAgICAgICAgcHJpbnQoInRlbnNvciBpbmRleCAiLCBvdXRwdXQudGVuc29ySW5kZXgsICJcblxuIikKKyAgICAgICAgcHJpbnQoIlRGTE0gb3V0cHV0IFxuICIsIHRmbG1fb3VwdXRbOjEwXSkKKyAgICAgICAgcHJpbnQoCisgICAgICAgICAgICAie2NvbXBhcmlzb259IG91dHB1dCBcbiIuZm9ybWF0KGNvbXBhcmlzb249Y29tcGFyaXNvbiksCisgICAgICAgICAgICBjb21wYXJpc29uX291cHV0WzpfUFJJTlRfUFJFVklFVy52YWx1ZV0sCisgICAgICAgICkKKyAgICAgICAgcHJpbnQoIi0tLS0tLS0tLS0tLS0tXG5cblxuIikKKyAgICAgIG5wLnRlc3RpbmcuYXNzZXJ0X2FycmF5X2VxdWFsKHRmbG1fb3VwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uX291cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyX21zZz1lcnJvcl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVyYm9zZT1UcnVlKQorICBwcmludCgKKyAgICAgICJcblxuVEZMTSBvdXRwdXQgbWF0Y2hlZCB7Y29tcGFyaXNvbn0gb3V0cHV0IGZvciBhbGwgTGF5ZXJzIGluIHRoZSBNb2RlbC4iCisgICAgICAuZm9ybWF0KGNvbXBhcmlzb249Y29tcGFyaXNvbikpCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgYXBwLnJ1bihtYWluKQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2xheWVyX2J5X2xheWVyX3NjaGVtYS5mYnMgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbGF5ZXJfYnlfbGF5ZXJfc2NoZW1hLmZicwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTgzYzljCi0tLSAvZGV2L251bGwKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2xheWVyX2J5X2xheWVyX3NjaGVtYS5mYnMKQEAgLTAsMCArMSw2MiBAQAorLy8gQ29weXJpZ2h0IDIwMjMgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworZW51bSBUZW5zb3JUeXBlcyA6IGJ5dGUgeworICBGTE9BVDMyID0gMCwKKyAgRkxPQVQxNiA9IDEsCisgIElOVDMyID0gMiwKKyAgVUlOVDggPSAzLAorICBJTlQ2NCA9IDQsCisgIFNUUklORyA9IDUsCisgIEJPT0wgPSA2LAorICBJTlQxNiA9IDcsCisgIENPTVBMRVg2NCA9IDgsCisgIElOVDggPSA5LAorICBGTE9BVDY0ID0gMTAsCisgIENPTVBMRVgxMjggPSAxMSwKKyAgVUlOVDY0ID0gMTIsCisgIC8vIEV4cGVyaW1lbnRhbDogUmVzb3VyY2UgYW5kIHZhcmlhbnQgdHlwZXMgYXJlIGV4cGVyaW1lbnRhbCwgdGhhdCBhcmUgc3ViamVjdAorICAvLyB0byBjaGFuZ2UuIERvIG5vdCBpbXBsZW1lbnQgY3VzdG9tIGtlcm5lbHMgdXNpbmcgcmVzb3VyY2UgJiB2YXJpYW50IHR5cGVzCisgIC8vIG5vdy4KKyAgUkVTT1VSQ0UgPSAxMywKKyAgVkFSSUFOVCA9IDE0LAorICBVSU5UMzIgPSAxNSwKKyAgVUlOVDE2ID0gMTYsCisgIElOVDQgPSAxNywKKyAgQkZMT0FUMTYgPSAxOCwKK30KKwordGFibGUgVGVuc29yRGF0YSB7CisgIC8vaW5wdXRfaW5kZXggd2lsbCBiZSBzZXQgdG8gLTEgZm9yIG5vbi1pbnB1dF90ZW5zb3JzCisgIGlucHV0X2luZGV4OnVpbnQ7CisgIHRlbnNvcl9pbmRleDogdWludDsKKyAgc2hhcGU6W2ludF07CisgIGR0eXBlOlRlbnNvclR5cGVzOworICBkYXRhOlt1Ynl0ZV07CisgIG51bV9ieXRlczp1aW50OworICAvL2xheWVyX251bWJlciB3aWxsIGJlIHNldCB0byAtMSBmb3IgaW5wdXRfdGVuc29ycworICBsYXllcl9udW1iZXI6dWludDsKK30KKwordGFibGUgU3ViZ3JhcGhEYXRhIHsKKyAgb3V0cHV0czpbVGVuc29yRGF0YV07CisgIHN1YmdyYXBoX2luZGV4OnVpbnQ7Cit9CisKK3RhYmxlIE1vZGVsVGVzdERhdGEgeworICBpbnB1dF9kYXRhOltUZW5zb3JEYXRhXTsKKyAgc3ViZ3JhcGhfZGF0YTpbU3ViZ3JhcGhEYXRhXTsKK30KKworcm9vdF90eXBlIE1vZGVsVGVzdERhdGE7CmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbGF5ZXJfYnlfbGF5ZXJfc2NoZW1hX2dlbmVyYXRlZC5oIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2xheWVyX2J5X2xheWVyX3NjaGVtYV9nZW5lcmF0ZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2EyY2FhCi0tLSAvZGV2L251bGwKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2xheWVyX2J5X2xheWVyX3NjaGVtYV9nZW5lcmF0ZWQuaApAQCAtMCwwICsxLDU5NyBAQAorLyogQ29weXJpZ2h0IDIwMjMgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCitVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCitkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCitTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCitsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisvLyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKworCisjaWZuZGVmIEZMQVRCVUZGRVJTX0dFTkVSQVRFRF9MQVlFUkJZTEFZRVJTQ0hFTUFfSF8KKyNkZWZpbmUgRkxBVEJVRkZFUlNfR0VORVJBVEVEX0xBWUVSQllMQVlFUlNDSEVNQV9IXworCisjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvZmxhdGJ1ZmZlcnMuaCIKKworLy8gRW5zdXJlIHRoZSBpbmNsdWRlZCBmbGF0YnVmZmVycy5oIGlzIHRoZSBzYW1lIHZlcnNpb24gYXMgd2hlbiB0aGlzIGZpbGUgd2FzCisvLyBnZW5lcmF0ZWQsIG90aGVyd2lzZSBpdCBtYXkgbm90IGJlIGNvbXBhdGlibGUuCitzdGF0aWNfYXNzZXJ0KEZMQVRCVUZGRVJTX1ZFUlNJT05fTUFKT1IgPT0gMjMgJiYKKyAgICAgICAgICAgICAgRkxBVEJVRkZFUlNfVkVSU0lPTl9NSU5PUiA9PSA1ICYmCisgICAgICAgICAgICAgIEZMQVRCVUZGRVJTX1ZFUlNJT05fUkVWSVNJT04gPT0gMjYsCisgICAgICAgICAgICAgIk5vbi1jb21wYXRpYmxlIGZsYXRidWZmZXJzIHZlcnNpb24gaW5jbHVkZWQiKTsKKworc3RydWN0IFRlbnNvckRhdGE7CitzdHJ1Y3QgVGVuc29yRGF0YUJ1aWxkZXI7CitzdHJ1Y3QgVGVuc29yRGF0YVQ7CisKK3N0cnVjdCBTdWJncmFwaERhdGE7CitzdHJ1Y3QgU3ViZ3JhcGhEYXRhQnVpbGRlcjsKK3N0cnVjdCBTdWJncmFwaERhdGFUOworCitzdHJ1Y3QgTW9kZWxUZXN0RGF0YTsKK3N0cnVjdCBNb2RlbFRlc3REYXRhQnVpbGRlcjsKK3N0cnVjdCBNb2RlbFRlc3REYXRhVDsKKworZW51bSBUZW5zb3JUeXBlcyA6IGludDhfdCB7CisgIFRlbnNvclR5cGVzX0ZMT0FUMzIgPSAwLAorICBUZW5zb3JUeXBlc19GTE9BVDE2ID0gMSwKKyAgVGVuc29yVHlwZXNfSU5UMzIgPSAyLAorICBUZW5zb3JUeXBlc19VSU5UOCA9IDMsCisgIFRlbnNvclR5cGVzX0lOVDY0ID0gNCwKKyAgVGVuc29yVHlwZXNfU1RSSU5HID0gNSwKKyAgVGVuc29yVHlwZXNfQk9PTCA9IDYsCisgIFRlbnNvclR5cGVzX0lOVDE2ID0gNywKKyAgVGVuc29yVHlwZXNfQ09NUExFWDY0ID0gOCwKKyAgVGVuc29yVHlwZXNfSU5UOCA9IDksCisgIFRlbnNvclR5cGVzX0ZMT0FUNjQgPSAxMCwKKyAgVGVuc29yVHlwZXNfQ09NUExFWDEyOCA9IDExLAorICBUZW5zb3JUeXBlc19VSU5UNjQgPSAxMiwKKyAgVGVuc29yVHlwZXNfUkVTT1VSQ0UgPSAxMywKKyAgVGVuc29yVHlwZXNfVkFSSUFOVCA9IDE0LAorICBUZW5zb3JUeXBlc19VSU5UMzIgPSAxNSwKKyAgVGVuc29yVHlwZXNfVUlOVDE2ID0gMTYsCisgIFRlbnNvclR5cGVzX0lOVDQgPSAxNywKKyAgVGVuc29yVHlwZXNfQkZMT0FUMTYgPSAxOCwKKyAgVGVuc29yVHlwZXNfTUlOID0gVGVuc29yVHlwZXNfRkxPQVQzMiwKKyAgVGVuc29yVHlwZXNfTUFYID0gVGVuc29yVHlwZXNfQkZMT0FUMTYKK307CisKK2lubGluZSBjb25zdCBUZW5zb3JUeXBlcyAoJkVudW1WYWx1ZXNUZW5zb3JUeXBlcygpKVsxOV0geworICBzdGF0aWMgY29uc3QgVGVuc29yVHlwZXMgdmFsdWVzW10gPSB7CisgICAgVGVuc29yVHlwZXNfRkxPQVQzMiwKKyAgICBUZW5zb3JUeXBlc19GTE9BVDE2LAorICAgIFRlbnNvclR5cGVzX0lOVDMyLAorICAgIFRlbnNvclR5cGVzX1VJTlQ4LAorICAgIFRlbnNvclR5cGVzX0lOVDY0LAorICAgIFRlbnNvclR5cGVzX1NUUklORywKKyAgICBUZW5zb3JUeXBlc19CT09MLAorICAgIFRlbnNvclR5cGVzX0lOVDE2LAorICAgIFRlbnNvclR5cGVzX0NPTVBMRVg2NCwKKyAgICBUZW5zb3JUeXBlc19JTlQ4LAorICAgIFRlbnNvclR5cGVzX0ZMT0FUNjQsCisgICAgVGVuc29yVHlwZXNfQ09NUExFWDEyOCwKKyAgICBUZW5zb3JUeXBlc19VSU5UNjQsCisgICAgVGVuc29yVHlwZXNfUkVTT1VSQ0UsCisgICAgVGVuc29yVHlwZXNfVkFSSUFOVCwKKyAgICBUZW5zb3JUeXBlc19VSU5UMzIsCisgICAgVGVuc29yVHlwZXNfVUlOVDE2LAorICAgIFRlbnNvclR5cGVzX0lOVDQsCisgICAgVGVuc29yVHlwZXNfQkZMT0FUMTYKKyAgfTsKKyAgcmV0dXJuIHZhbHVlczsKK30KKworaW5saW5lIGNvbnN0IGNoYXIgKiBjb25zdCAqRW51bU5hbWVzVGVuc29yVHlwZXMoKSB7CisgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFtZXNbMjBdID0geworICAgICJGTE9BVDMyIiwKKyAgICAiRkxPQVQxNiIsCisgICAgIklOVDMyIiwKKyAgICAiVUlOVDgiLAorICAgICJJTlQ2NCIsCisgICAgIlNUUklORyIsCisgICAgIkJPT0wiLAorICAgICJJTlQxNiIsCisgICAgIkNPTVBMRVg2NCIsCisgICAgIklOVDgiLAorICAgICJGTE9BVDY0IiwKKyAgICAiQ09NUExFWDEyOCIsCisgICAgIlVJTlQ2NCIsCisgICAgIlJFU09VUkNFIiwKKyAgICAiVkFSSUFOVCIsCisgICAgIlVJTlQzMiIsCisgICAgIlVJTlQxNiIsCisgICAgIklOVDQiLAorICAgICJCRkxPQVQxNiIsCisgICAgbnVsbHB0cgorICB9OworICByZXR1cm4gbmFtZXM7Cit9CisKK2lubGluZSBjb25zdCBjaGFyICpFbnVtTmFtZVRlbnNvclR5cGVzKFRlbnNvclR5cGVzIGUpIHsKKyAgaWYgKDo6ZmxhdGJ1ZmZlcnM6OklzT3V0UmFuZ2UoZSwgVGVuc29yVHlwZXNfRkxPQVQzMiwgVGVuc29yVHlwZXNfQkZMT0FUMTYpKSByZXR1cm4gIiI7CisgIGNvbnN0IHNpemVfdCBpbmRleCA9IHN0YXRpY19jYXN0PHNpemVfdD4oZSk7CisgIHJldHVybiBFbnVtTmFtZXNUZW5zb3JUeXBlcygpW2luZGV4XTsKK30KKworc3RydWN0IFRlbnNvckRhdGFUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKKyAgdHlwZWRlZiBUZW5zb3JEYXRhIFRhYmxlVHlwZTsKKyAgdWludDMyX3QgaW5wdXRfaW5kZXggPSAwOworICB1aW50MzJfdCB0ZW5zb3JfaW5kZXggPSAwOworICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBzaGFwZXt9OworICBUZW5zb3JUeXBlcyBkdHlwZSA9IFRlbnNvclR5cGVzX0ZMT0FUMzI7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRhdGF7fTsKKyAgdWludDMyX3QgbnVtX2J5dGVzID0gMDsKKyAgdWludDMyX3QgbGF5ZXJfbnVtYmVyID0gMDsKK307CisKK3N0cnVjdCBUZW5zb3JEYXRhIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CisgIHR5cGVkZWYgVGVuc29yRGF0YVQgTmF0aXZlVGFibGVUeXBlOworICB0eXBlZGVmIFRlbnNvckRhdGFCdWlsZGVyIEJ1aWxkZXI7CisgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CisgICAgVlRfSU5QVVRfSU5ERVggPSA0LAorICAgIFZUX1RFTlNPUl9JTkRFWCA9IDYsCisgICAgVlRfU0hBUEUgPSA4LAorICAgIFZUX0RUWVBFID0gMTAsCisgICAgVlRfREFUQSA9IDEyLAorICAgIFZUX05VTV9CWVRFUyA9IDE0LAorICAgIFZUX0xBWUVSX05VTUJFUiA9IDE2CisgIH07CisgIHVpbnQzMl90IGlucHV0X2luZGV4KCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDx1aW50MzJfdD4oVlRfSU5QVVRfSU5ERVgsIDApOworICB9CisgIHVpbnQzMl90IHRlbnNvcl9pbmRleCgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8dWludDMyX3Q+KFZUX1RFTlNPUl9JTkRFWCwgMCk7CisgIH0KKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+ICpzaGFwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4gKj4oVlRfU0hBUEUpOworICB9CisgIFRlbnNvclR5cGVzIGR0eXBlKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUZW5zb3JUeXBlcz4oR2V0RmllbGQ8aW50OF90PihWVF9EVFlQRSwgMCkpOworICB9CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqZGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKj4oVlRfREFUQSk7CisgIH0KKyAgdWludDMyX3QgbnVtX2J5dGVzKCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDx1aW50MzJfdD4oVlRfTlVNX0JZVEVTLCAwKTsKKyAgfQorICB1aW50MzJfdCBsYXllcl9udW1iZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPHVpbnQzMl90PihWVF9MQVlFUl9OVU1CRVIsIDApOworICB9CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50MzJfdD4odmVyaWZpZXIsIFZUX0lOUFVUX0lOREVYLCA0KSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50MzJfdD4odmVyaWZpZXIsIFZUX1RFTlNPUl9JTkRFWCwgNCkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9TSEFQRSkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHNoYXBlKCkpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDhfdD4odmVyaWZpZXIsIFZUX0RUWVBFLCAxKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX0RBVEEpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3RvcihkYXRhKCkpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQzMl90Pih2ZXJpZmllciwgVlRfTlVNX0JZVEVTLCA0KSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50MzJfdD4odmVyaWZpZXIsIFZUX0xBWUVSX05VTUJFUiwgNCkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKKyAgfQorICBUZW5zb3JEYXRhVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFRlbnNvckRhdGFUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VGVuc29yRGF0YT4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVGVuc29yRGF0YVQqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKK307CisKK3N0cnVjdCBUZW5zb3JEYXRhQnVpbGRlciB7CisgIHR5cGVkZWYgVGVuc29yRGF0YSBUYWJsZTsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIHZvaWQgYWRkX2lucHV0X2luZGV4KHVpbnQzMl90IGlucHV0X2luZGV4KSB7CisgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQzMl90PihUZW5zb3JEYXRhOjpWVF9JTlBVVF9JTkRFWCwgaW5wdXRfaW5kZXgsIDApOworICB9CisgIHZvaWQgYWRkX3RlbnNvcl9pbmRleCh1aW50MzJfdCB0ZW5zb3JfaW5kZXgpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDMyX3Q+KFRlbnNvckRhdGE6OlZUX1RFTlNPUl9JTkRFWCwgdGVuc29yX2luZGV4LCAwKTsKKyAgfQorICB2b2lkIGFkZF9zaGFwZSg6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+PiBzaGFwZSkgeworICAgIGZiYl8uQWRkT2Zmc2V0KFRlbnNvckRhdGE6OlZUX1NIQVBFLCBzaGFwZSk7CisgIH0KKyAgdm9pZCBhZGRfZHR5cGUoVGVuc29yVHlwZXMgZHR5cGUpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8aW50OF90PihUZW5zb3JEYXRhOjpWVF9EVFlQRSwgc3RhdGljX2Nhc3Q8aW50OF90PihkdHlwZSksIDApOworICB9CisgIHZvaWQgYWRkX2RhdGEoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90Pj4gZGF0YSkgeworICAgIGZiYl8uQWRkT2Zmc2V0KFRlbnNvckRhdGE6OlZUX0RBVEEsIGRhdGEpOworICB9CisgIHZvaWQgYWRkX251bV9ieXRlcyh1aW50MzJfdCBudW1fYnl0ZXMpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDMyX3Q+KFRlbnNvckRhdGE6OlZUX05VTV9CWVRFUywgbnVtX2J5dGVzLCAwKTsKKyAgfQorICB2b2lkIGFkZF9sYXllcl9udW1iZXIodWludDMyX3QgbGF5ZXJfbnVtYmVyKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQzMl90PihUZW5zb3JEYXRhOjpWVF9MQVlFUl9OVU1CRVIsIGxheWVyX251bWJlciwgMCk7CisgIH0KKyAgZXhwbGljaXQgVGVuc29yRGF0YUJ1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgICAgICAgIDogZmJiXyhfZmJiKSB7CisgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CisgIH0KKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFRlbnNvckRhdGE+IEZpbmlzaCgpIHsKKyAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VGVuc29yRGF0YT4oZW5kKTsKKyAgICByZXR1cm4gbzsKKyAgfQorfTsKKworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZW5zb3JEYXRhPiBDcmVhdGVUZW5zb3JEYXRhKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAorICAgIHVpbnQzMl90IGlucHV0X2luZGV4ID0gMCwKKyAgICB1aW50MzJfdCB0ZW5zb3JfaW5kZXggPSAwLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4+IHNoYXBlID0gMCwKKyAgICBUZW5zb3JUeXBlcyBkdHlwZSA9IFRlbnNvclR5cGVzX0ZMT0FUMzIsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90Pj4gZGF0YSA9IDAsCisgICAgdWludDMyX3QgbnVtX2J5dGVzID0gMCwKKyAgICB1aW50MzJfdCBsYXllcl9udW1iZXIgPSAwKSB7CisgIFRlbnNvckRhdGFCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOworICBidWlsZGVyXy5hZGRfbGF5ZXJfbnVtYmVyKGxheWVyX251bWJlcik7CisgIGJ1aWxkZXJfLmFkZF9udW1fYnl0ZXMobnVtX2J5dGVzKTsKKyAgYnVpbGRlcl8uYWRkX2RhdGEoZGF0YSk7CisgIGJ1aWxkZXJfLmFkZF9zaGFwZShzaGFwZSk7CisgIGJ1aWxkZXJfLmFkZF90ZW5zb3JfaW5kZXgodGVuc29yX2luZGV4KTsKKyAgYnVpbGRlcl8uYWRkX2lucHV0X2luZGV4KGlucHV0X2luZGV4KTsKKyAgYnVpbGRlcl8uYWRkX2R0eXBlKGR0eXBlKTsKKyAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOworfQorCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFRlbnNvckRhdGE+IENyZWF0ZVRlbnNvckRhdGFEaXJlY3QoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgdWludDMyX3QgaW5wdXRfaW5kZXggPSAwLAorICAgIHVpbnQzMl90IHRlbnNvcl9pbmRleCA9IDAsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4gKnNoYXBlID0gbnVsbHB0ciwKKyAgICBUZW5zb3JUeXBlcyBkdHlwZSA9IFRlbnNvclR5cGVzX0ZMT0FUMzIsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gKmRhdGEgPSBudWxscHRyLAorICAgIHVpbnQzMl90IG51bV9ieXRlcyA9IDAsCisgICAgdWludDMyX3QgbGF5ZXJfbnVtYmVyID0gMCkgeworICBhdXRvIHNoYXBlX18gPSBzaGFwZSA/IF9mYmIuQ3JlYXRlVmVjdG9yPGludDMyX3Q+KCpzaGFwZSkgOiAwOworICBhdXRvIGRhdGFfXyA9IGRhdGEgPyBfZmJiLkNyZWF0ZVZlY3Rvcjx1aW50OF90PigqZGF0YSkgOiAwOworICByZXR1cm4gQ3JlYXRlVGVuc29yRGF0YSgKKyAgICAgIF9mYmIsCisgICAgICBpbnB1dF9pbmRleCwKKyAgICAgIHRlbnNvcl9pbmRleCwKKyAgICAgIHNoYXBlX18sCisgICAgICBkdHlwZSwKKyAgICAgIGRhdGFfXywKKyAgICAgIG51bV9ieXRlcywKKyAgICAgIGxheWVyX251bWJlcik7Cit9CisKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZW5zb3JEYXRhPiBDcmVhdGVUZW5zb3JEYXRhKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBUZW5zb3JEYXRhVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworCitzdHJ1Y3QgU3ViZ3JhcGhEYXRhVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CisgIHR5cGVkZWYgU3ViZ3JhcGhEYXRhIFRhYmxlVHlwZTsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFRlbnNvckRhdGFUPj4gb3V0cHV0c3t9OworICB1aW50MzJfdCBzdWJncmFwaF9pbmRleCA9IDA7CisgIFN1YmdyYXBoRGF0YVQoKSA9IGRlZmF1bHQ7CisgIFN1YmdyYXBoRGF0YVQoY29uc3QgU3ViZ3JhcGhEYXRhVCAmbyk7CisgIFN1YmdyYXBoRGF0YVQoU3ViZ3JhcGhEYXRhVCYmKSBGTEFUQlVGRkVSU19OT0VYQ0VQVCA9IGRlZmF1bHQ7CisgIFN1YmdyYXBoRGF0YVQgJm9wZXJhdG9yPShTdWJncmFwaERhdGFUIG8pIEZMQVRCVUZGRVJTX05PRVhDRVBUOworfTsKKworc3RydWN0IFN1YmdyYXBoRGF0YSBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgeworICB0eXBlZGVmIFN1YmdyYXBoRGF0YVQgTmF0aXZlVGFibGVUeXBlOworICB0eXBlZGVmIFN1YmdyYXBoRGF0YUJ1aWxkZXIgQnVpbGRlcjsKKyAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKKyAgICBWVF9PVVRQVVRTID0gNCwKKyAgICBWVF9TVUJHUkFQSF9JTkRFWCA9IDYKKyAgfTsKKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZW5zb3JEYXRhPj4gKm91dHB1dHMoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZW5zb3JEYXRhPj4gKj4oVlRfT1VUUFVUUyk7CisgIH0KKyAgdWludDMyX3Qgc3ViZ3JhcGhfaW5kZXgoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPHVpbnQzMl90PihWVF9TVUJHUkFQSF9JTkRFWCwgMCk7CisgIH0KKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfT1VUUFVUUykgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKG91dHB1dHMoKSkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yT2ZUYWJsZXMob3V0cHV0cygpKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50MzJfdD4odmVyaWZpZXIsIFZUX1NVQkdSQVBIX0lOREVYLCA0KSAmJgorICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOworICB9CisgIFN1YmdyYXBoRGF0YVQgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhTdWJncmFwaERhdGFUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3ViZ3JhcGhEYXRhPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTdWJncmFwaERhdGFUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cit9OworCitzdHJ1Y3QgU3ViZ3JhcGhEYXRhQnVpbGRlciB7CisgIHR5cGVkZWYgU3ViZ3JhcGhEYXRhIFRhYmxlOworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgdm9pZCBhZGRfb3V0cHV0cyg6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZW5zb3JEYXRhPj4+IG91dHB1dHMpIHsKKyAgICBmYmJfLkFkZE9mZnNldChTdWJncmFwaERhdGE6OlZUX09VVFBVVFMsIG91dHB1dHMpOworICB9CisgIHZvaWQgYWRkX3N1YmdyYXBoX2luZGV4KHVpbnQzMl90IHN1YmdyYXBoX2luZGV4KSB7CisgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQzMl90PihTdWJncmFwaERhdGE6OlZUX1NVQkdSQVBIX0lOREVYLCBzdWJncmFwaF9pbmRleCwgMCk7CisgIH0KKyAgZXhwbGljaXQgU3ViZ3JhcGhEYXRhQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgICAgICAgOiBmYmJfKF9mYmIpIHsKKyAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKKyAgfQorICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3ViZ3JhcGhEYXRhPiBGaW5pc2goKSB7CisgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN1YmdyYXBoRGF0YT4oZW5kKTsKKyAgICByZXR1cm4gbzsKKyAgfQorfTsKKworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdWJncmFwaERhdGE+IENyZWF0ZVN1YmdyYXBoRGF0YSgKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZW5zb3JEYXRhPj4+IG91dHB1dHMgPSAwLAorICAgIHVpbnQzMl90IHN1YmdyYXBoX2luZGV4ID0gMCkgeworICBTdWJncmFwaERhdGFCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOworICBidWlsZGVyXy5hZGRfc3ViZ3JhcGhfaW5kZXgoc3ViZ3JhcGhfaW5kZXgpOworICBidWlsZGVyXy5hZGRfb3V0cHV0cyhvdXRwdXRzKTsKKyAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOworfQorCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN1YmdyYXBoRGF0YT4gQ3JlYXRlU3ViZ3JhcGhEYXRhRGlyZWN0KAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZW5zb3JEYXRhPj4gKm91dHB1dHMgPSBudWxscHRyLAorICAgIHVpbnQzMl90IHN1YmdyYXBoX2luZGV4ID0gMCkgeworICBhdXRvIG91dHB1dHNfXyA9IG91dHB1dHMgPyBfZmJiLkNyZWF0ZVZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VGVuc29yRGF0YT4+KCpvdXRwdXRzKSA6IDA7CisgIHJldHVybiBDcmVhdGVTdWJncmFwaERhdGEoCisgICAgICBfZmJiLAorICAgICAgb3V0cHV0c19fLAorICAgICAgc3ViZ3JhcGhfaW5kZXgpOworfQorCis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3ViZ3JhcGhEYXRhPiBDcmVhdGVTdWJncmFwaERhdGEoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN1YmdyYXBoRGF0YVQgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKworc3RydWN0IE1vZGVsVGVzdERhdGFUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKKyAgdHlwZWRlZiBNb2RlbFRlc3REYXRhIFRhYmxlVHlwZTsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFRlbnNvckRhdGFUPj4gaW5wdXRfZGF0YXt9OworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8U3ViZ3JhcGhEYXRhVD4+IHN1YmdyYXBoX2RhdGF7fTsKKyAgTW9kZWxUZXN0RGF0YVQoKSA9IGRlZmF1bHQ7CisgIE1vZGVsVGVzdERhdGFUKGNvbnN0IE1vZGVsVGVzdERhdGFUICZvKTsKKyAgTW9kZWxUZXN0RGF0YVQoTW9kZWxUZXN0RGF0YVQmJikgRkxBVEJVRkZFUlNfTk9FWENFUFQgPSBkZWZhdWx0OworICBNb2RlbFRlc3REYXRhVCAmb3BlcmF0b3I9KE1vZGVsVGVzdERhdGFUIG8pIEZMQVRCVUZGRVJTX05PRVhDRVBUOworfTsKKworc3RydWN0IE1vZGVsVGVzdERhdGEgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKKyAgdHlwZWRlZiBNb2RlbFRlc3REYXRhVCBOYXRpdmVUYWJsZVR5cGU7CisgIHR5cGVkZWYgTW9kZWxUZXN0RGF0YUJ1aWxkZXIgQnVpbGRlcjsKKyAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKKyAgICBWVF9JTlBVVF9EQVRBID0gNCwKKyAgICBWVF9TVUJHUkFQSF9EQVRBID0gNgorICB9OworICBjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8OjpmbGF0YnVmZmVyczo6T2Zmc2V0PFRlbnNvckRhdGE+PiAqaW5wdXRfZGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8OjpmbGF0YnVmZmVyczo6T2Zmc2V0PFRlbnNvckRhdGE+PiAqPihWVF9JTlBVVF9EQVRBKTsKKyAgfQorICBjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8OjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN1YmdyYXBoRGF0YT4+ICpzdWJncmFwaF9kYXRhKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3ViZ3JhcGhEYXRhPj4gKj4oVlRfU1VCR1JBUEhfREFUQSk7CisgIH0KKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfSU5QVVRfREFUQSkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKGlucHV0X2RhdGEoKSkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yT2ZUYWJsZXMoaW5wdXRfZGF0YSgpKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1NVQkdSQVBIX0RBVEEpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3RvcihzdWJncmFwaF9kYXRhKCkpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3Rvck9mVGFibGVzKHN1YmdyYXBoX2RhdGEoKSkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKKyAgfQorICBNb2RlbFRlc3REYXRhVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKE1vZGVsVGVzdERhdGFUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TW9kZWxUZXN0RGF0YT4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTW9kZWxUZXN0RGF0YVQqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKK307CisKK3N0cnVjdCBNb2RlbFRlc3REYXRhQnVpbGRlciB7CisgIHR5cGVkZWYgTW9kZWxUZXN0RGF0YSBUYWJsZTsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIHZvaWQgYWRkX2lucHV0X2RhdGEoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VGVuc29yRGF0YT4+PiBpbnB1dF9kYXRhKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoTW9kZWxUZXN0RGF0YTo6VlRfSU5QVVRfREFUQSwgaW5wdXRfZGF0YSk7CisgIH0KKyAgdm9pZCBhZGRfc3ViZ3JhcGhfZGF0YSg6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdWJncmFwaERhdGE+Pj4gc3ViZ3JhcGhfZGF0YSkgeworICAgIGZiYl8uQWRkT2Zmc2V0KE1vZGVsVGVzdERhdGE6OlZUX1NVQkdSQVBIX0RBVEEsIHN1YmdyYXBoX2RhdGEpOworICB9CisgIGV4cGxpY2l0IE1vZGVsVGVzdERhdGFCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICAgICAgICA6IGZiYl8oX2ZiYikgeworICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOworICB9CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNb2RlbFRlc3REYXRhPiBGaW5pc2goKSB7CisgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE1vZGVsVGVzdERhdGE+KGVuZCk7CisgICAgcmV0dXJuIG87CisgIH0KK307CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TW9kZWxUZXN0RGF0YT4gQ3JlYXRlTW9kZWxUZXN0RGF0YSgKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZW5zb3JEYXRhPj4+IGlucHV0X2RhdGEgPSAwLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8OjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN1YmdyYXBoRGF0YT4+PiBzdWJncmFwaF9kYXRhID0gMCkgeworICBNb2RlbFRlc3REYXRhQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKKyAgYnVpbGRlcl8uYWRkX3N1YmdyYXBoX2RhdGEoc3ViZ3JhcGhfZGF0YSk7CisgIGJ1aWxkZXJfLmFkZF9pbnB1dF9kYXRhKGlucHV0X2RhdGEpOworICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7Cit9CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TW9kZWxUZXN0RGF0YT4gQ3JlYXRlTW9kZWxUZXN0RGF0YURpcmVjdCgKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VGVuc29yRGF0YT4+ICppbnB1dF9kYXRhID0gbnVsbHB0ciwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3ViZ3JhcGhEYXRhPj4gKnN1YmdyYXBoX2RhdGEgPSBudWxscHRyKSB7CisgIGF1dG8gaW5wdXRfZGF0YV9fID0gaW5wdXRfZGF0YSA/IF9mYmIuQ3JlYXRlVmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZW5zb3JEYXRhPj4oKmlucHV0X2RhdGEpIDogMDsKKyAgYXV0byBzdWJncmFwaF9kYXRhX18gPSBzdWJncmFwaF9kYXRhID8gX2ZiYi5DcmVhdGVWZWN0b3I8OjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN1YmdyYXBoRGF0YT4+KCpzdWJncmFwaF9kYXRhKSA6IDA7CisgIHJldHVybiBDcmVhdGVNb2RlbFRlc3REYXRhKAorICAgICAgX2ZiYiwKKyAgICAgIGlucHV0X2RhdGFfXywKKyAgICAgIHN1YmdyYXBoX2RhdGFfXyk7Cit9CisKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNb2RlbFRlc3REYXRhPiBDcmVhdGVNb2RlbFRlc3REYXRhKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBNb2RlbFRlc3REYXRhVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworCitpbmxpbmUgVGVuc29yRGF0YVQgKlRlbnNvckRhdGE6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKKyAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxUZW5zb3JEYXRhVD4obmV3IFRlbnNvckRhdGFUKCkpOworICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKKyAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKK30KKworaW5saW5lIHZvaWQgVGVuc29yRGF0YTo6VW5QYWNrVG8oVGVuc29yRGF0YVQgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKKyAgKHZvaWQpX287CisgICh2b2lkKV9yZXNvbHZlcjsKKyAgeyBhdXRvIF9lID0gaW5wdXRfaW5kZXgoKTsgX28tPmlucHV0X2luZGV4ID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gdGVuc29yX2luZGV4KCk7IF9vLT50ZW5zb3JfaW5kZXggPSBfZTsgfQorICB7IGF1dG8gX2UgPSBzaGFwZSgpOyBpZiAoX2UpIHsgX28tPnNoYXBlLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yICg6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnNoYXBlW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT5zaGFwZS5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBkdHlwZSgpOyBfby0+ZHR5cGUgPSBfZTsgfQorICB7IGF1dG8gX2UgPSBkYXRhKCk7IGlmIChfZSkgeyBfby0+ZGF0YS5yZXNpemUoX2UtPnNpemUoKSk7IHN0ZDo6Y29weShfZS0+YmVnaW4oKSwgX2UtPmVuZCgpLCBfby0+ZGF0YS5iZWdpbigpKTsgfSB9CisgIHsgYXV0byBfZSA9IG51bV9ieXRlcygpOyBfby0+bnVtX2J5dGVzID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gbGF5ZXJfbnVtYmVyKCk7IF9vLT5sYXllcl9udW1iZXIgPSBfZTsgfQorfQorCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFRlbnNvckRhdGE+IFRlbnNvckRhdGE6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFRlbnNvckRhdGFUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CisgIHJldHVybiBDcmVhdGVUZW5zb3JEYXRhKF9mYmIsIF9vLCBfcmVoYXNoZXIpOworfQorCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFRlbnNvckRhdGE+IENyZWF0ZVRlbnNvckRhdGEoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFRlbnNvckRhdGFUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CisgICh2b2lkKV9yZWhhc2hlcjsKKyAgKHZvaWQpX287CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgVGVuc29yRGF0YVQqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBhdXRvIF9pbnB1dF9pbmRleCA9IF9vLT5pbnB1dF9pbmRleDsKKyAgYXV0byBfdGVuc29yX2luZGV4ID0gX28tPnRlbnNvcl9pbmRleDsKKyAgYXV0byBfc2hhcGUgPSBfby0+c2hhcGUuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3IoX28tPnNoYXBlKSA6IDA7CisgIGF1dG8gX2R0eXBlID0gX28tPmR0eXBlOworICBhdXRvIF9kYXRhID0gX28tPmRhdGEuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3IoX28tPmRhdGEpIDogMDsKKyAgYXV0byBfbnVtX2J5dGVzID0gX28tPm51bV9ieXRlczsKKyAgYXV0byBfbGF5ZXJfbnVtYmVyID0gX28tPmxheWVyX251bWJlcjsKKyAgcmV0dXJuIENyZWF0ZVRlbnNvckRhdGEoCisgICAgICBfZmJiLAorICAgICAgX2lucHV0X2luZGV4LAorICAgICAgX3RlbnNvcl9pbmRleCwKKyAgICAgIF9zaGFwZSwKKyAgICAgIF9kdHlwZSwKKyAgICAgIF9kYXRhLAorICAgICAgX251bV9ieXRlcywKKyAgICAgIF9sYXllcl9udW1iZXIpOworfQorCitpbmxpbmUgU3ViZ3JhcGhEYXRhVDo6U3ViZ3JhcGhEYXRhVChjb25zdCBTdWJncmFwaERhdGFUICZvKQorICAgICAgOiBzdWJncmFwaF9pbmRleChvLnN1YmdyYXBoX2luZGV4KSB7CisgIG91dHB1dHMucmVzZXJ2ZShvLm91dHB1dHMuc2l6ZSgpKTsKKyAgZm9yIChjb25zdCBhdXRvICZvdXRwdXRzXyA6IG8ub3V0cHV0cykgeyBvdXRwdXRzLmVtcGxhY2VfYmFjaygob3V0cHV0c18pID8gbmV3IFRlbnNvckRhdGFUKCpvdXRwdXRzXykgOiBudWxscHRyKTsgfQorfQorCitpbmxpbmUgU3ViZ3JhcGhEYXRhVCAmU3ViZ3JhcGhEYXRhVDo6b3BlcmF0b3I9KFN1YmdyYXBoRGF0YVQgbykgRkxBVEJVRkZFUlNfTk9FWENFUFQgeworICBzdGQ6OnN3YXAob3V0cHV0cywgby5vdXRwdXRzKTsKKyAgc3RkOjpzd2FwKHN1YmdyYXBoX2luZGV4LCBvLnN1YmdyYXBoX2luZGV4KTsKKyAgcmV0dXJuICp0aGlzOworfQorCitpbmxpbmUgU3ViZ3JhcGhEYXRhVCAqU3ViZ3JhcGhEYXRhOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CisgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8U3ViZ3JhcGhEYXRhVD4obmV3IFN1YmdyYXBoRGF0YVQoKSk7CisgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOworICByZXR1cm4gX28ucmVsZWFzZSgpOworfQorCitpbmxpbmUgdm9pZCBTdWJncmFwaERhdGE6OlVuUGFja1RvKFN1YmdyYXBoRGF0YVQgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKKyAgKHZvaWQpX287CisgICh2b2lkKV9yZXNvbHZlcjsKKyAgeyBhdXRvIF9lID0gb3V0cHV0cygpOyBpZiAoX2UpIHsgX28tPm91dHB1dHMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBpZihfby0+b3V0cHV0c1tfaV0pIHsgX2UtPkdldChfaSktPlVuUGFja1RvKF9vLT5vdXRwdXRzW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPm91dHB1dHNbX2ldID0gc3RkOjp1bmlxdWVfcHRyPFRlbnNvckRhdGFUPihfZS0+R2V0KF9pKS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9OyB9IH0gZWxzZSB7IF9vLT5vdXRwdXRzLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IHN1YmdyYXBoX2luZGV4KCk7IF9vLT5zdWJncmFwaF9pbmRleCA9IF9lOyB9Cit9CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3ViZ3JhcGhEYXRhPiBTdWJncmFwaERhdGE6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN1YmdyYXBoRGF0YVQqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgcmV0dXJuIENyZWF0ZVN1YmdyYXBoRGF0YShfZmJiLCBfbywgX3JlaGFzaGVyKTsKK30KKworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdWJncmFwaERhdGE+IENyZWF0ZVN1YmdyYXBoRGF0YSg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3ViZ3JhcGhEYXRhVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworICAodm9pZClfcmVoYXNoZXI7CisgICh2b2lkKV9vOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFN1YmdyYXBoRGF0YVQqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBhdXRvIF9vdXRwdXRzID0gX28tPm91dHB1dHMuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3I8OjpmbGF0YnVmZmVyczo6T2Zmc2V0PFRlbnNvckRhdGE+PiAoX28tPm91dHB1dHMuc2l6ZSgpLCBbXShzaXplX3QgaSwgX1ZlY3RvckFyZ3MgKl9fdmEpIHsgcmV0dXJuIENyZWF0ZVRlbnNvckRhdGEoKl9fdmEtPl9fZmJiLCBfX3ZhLT5fX28tPm91dHB1dHNbaV0uZ2V0KCksIF9fdmEtPl9fcmVoYXNoZXIpOyB9LCAmX3ZhICkgOiAwOworICBhdXRvIF9zdWJncmFwaF9pbmRleCA9IF9vLT5zdWJncmFwaF9pbmRleDsKKyAgcmV0dXJuIENyZWF0ZVN1YmdyYXBoRGF0YSgKKyAgICAgIF9mYmIsCisgICAgICBfb3V0cHV0cywKKyAgICAgIF9zdWJncmFwaF9pbmRleCk7Cit9CisKK2lubGluZSBNb2RlbFRlc3REYXRhVDo6TW9kZWxUZXN0RGF0YVQoY29uc3QgTW9kZWxUZXN0RGF0YVQgJm8pIHsKKyAgaW5wdXRfZGF0YS5yZXNlcnZlKG8uaW5wdXRfZGF0YS5zaXplKCkpOworICBmb3IgKGNvbnN0IGF1dG8gJmlucHV0X2RhdGFfIDogby5pbnB1dF9kYXRhKSB7IGlucHV0X2RhdGEuZW1wbGFjZV9iYWNrKChpbnB1dF9kYXRhXykgPyBuZXcgVGVuc29yRGF0YVQoKmlucHV0X2RhdGFfKSA6IG51bGxwdHIpOyB9CisgIHN1YmdyYXBoX2RhdGEucmVzZXJ2ZShvLnN1YmdyYXBoX2RhdGEuc2l6ZSgpKTsKKyAgZm9yIChjb25zdCBhdXRvICZzdWJncmFwaF9kYXRhXyA6IG8uc3ViZ3JhcGhfZGF0YSkgeyBzdWJncmFwaF9kYXRhLmVtcGxhY2VfYmFjaygoc3ViZ3JhcGhfZGF0YV8pID8gbmV3IFN1YmdyYXBoRGF0YVQoKnN1YmdyYXBoX2RhdGFfKSA6IG51bGxwdHIpOyB9Cit9CisKK2lubGluZSBNb2RlbFRlc3REYXRhVCAmTW9kZWxUZXN0RGF0YVQ6Om9wZXJhdG9yPShNb2RlbFRlc3REYXRhVCBvKSBGTEFUQlVGRkVSU19OT0VYQ0VQVCB7CisgIHN0ZDo6c3dhcChpbnB1dF9kYXRhLCBvLmlucHV0X2RhdGEpOworICBzdGQ6OnN3YXAoc3ViZ3JhcGhfZGF0YSwgby5zdWJncmFwaF9kYXRhKTsKKyAgcmV0dXJuICp0aGlzOworfQorCitpbmxpbmUgTW9kZWxUZXN0RGF0YVQgKk1vZGVsVGVzdERhdGE6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKKyAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxNb2RlbFRlc3REYXRhVD4obmV3IE1vZGVsVGVzdERhdGFUKCkpOworICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKKyAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKK30KKworaW5saW5lIHZvaWQgTW9kZWxUZXN0RGF0YTo6VW5QYWNrVG8oTW9kZWxUZXN0RGF0YVQgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKKyAgKHZvaWQpX287CisgICh2b2lkKV9yZXNvbHZlcjsKKyAgeyBhdXRvIF9lID0gaW5wdXRfZGF0YSgpOyBpZiAoX2UpIHsgX28tPmlucHV0X2RhdGEucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBpZihfby0+aW5wdXRfZGF0YVtfaV0pIHsgX2UtPkdldChfaSktPlVuUGFja1RvKF9vLT5pbnB1dF9kYXRhW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPmlucHV0X2RhdGFbX2ldID0gc3RkOjp1bmlxdWVfcHRyPFRlbnNvckRhdGFUPihfZS0+R2V0KF9pKS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9OyB9IH0gZWxzZSB7IF9vLT5pbnB1dF9kYXRhLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IHN1YmdyYXBoX2RhdGEoKTsgaWYgKF9lKSB7IF9vLT5zdWJncmFwaF9kYXRhLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yICg6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgaWYoX28tPnN1YmdyYXBoX2RhdGFbX2ldKSB7IF9lLT5HZXQoX2kpLT5VblBhY2tUbyhfby0+c3ViZ3JhcGhfZGF0YVtfaV0uZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT5zdWJncmFwaF9kYXRhW19pXSA9IHN0ZDo6dW5pcXVlX3B0cjxTdWJncmFwaERhdGFUPihfZS0+R2V0KF9pKS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9OyB9IH0gZWxzZSB7IF9vLT5zdWJncmFwaF9kYXRhLnJlc2l6ZSgwKTsgfSB9Cit9CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TW9kZWxUZXN0RGF0YT4gTW9kZWxUZXN0RGF0YTo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTW9kZWxUZXN0RGF0YVQqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgcmV0dXJuIENyZWF0ZU1vZGVsVGVzdERhdGEoX2ZiYiwgX28sIF9yZWhhc2hlcik7Cit9CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TW9kZWxUZXN0RGF0YT4gQ3JlYXRlTW9kZWxUZXN0RGF0YSg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTW9kZWxUZXN0RGF0YVQgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgKHZvaWQpX3JlaGFzaGVyOworICAodm9pZClfbzsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBNb2RlbFRlc3REYXRhVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIGF1dG8gX2lucHV0X2RhdGEgPSBfby0+aW5wdXRfZGF0YS5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VGVuc29yRGF0YT4+IChfby0+aW5wdXRfZGF0YS5zaXplKCksIFtdKHNpemVfdCBpLCBfVmVjdG9yQXJncyAqX192YSkgeyByZXR1cm4gQ3JlYXRlVGVuc29yRGF0YSgqX192YS0+X19mYmIsIF9fdmEtPl9fby0+aW5wdXRfZGF0YVtpXS5nZXQoKSwgX192YS0+X19yZWhhc2hlcik7IH0sICZfdmEgKSA6IDA7CisgIGF1dG8gX3N1YmdyYXBoX2RhdGEgPSBfby0+c3ViZ3JhcGhfZGF0YS5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3ViZ3JhcGhEYXRhPj4gKF9vLT5zdWJncmFwaF9kYXRhLnNpemUoKSwgW10oc2l6ZV90IGksIF9WZWN0b3JBcmdzICpfX3ZhKSB7IHJldHVybiBDcmVhdGVTdWJncmFwaERhdGEoKl9fdmEtPl9fZmJiLCBfX3ZhLT5fX28tPnN1YmdyYXBoX2RhdGFbaV0uZ2V0KCksIF9fdmEtPl9fcmVoYXNoZXIpOyB9LCAmX3ZhICkgOiAwOworICByZXR1cm4gQ3JlYXRlTW9kZWxUZXN0RGF0YSgKKyAgICAgIF9mYmIsCisgICAgICBfaW5wdXRfZGF0YSwKKyAgICAgIF9zdWJncmFwaF9kYXRhKTsKK30KKworaW5saW5lIGNvbnN0IE1vZGVsVGVzdERhdGEgKkdldE1vZGVsVGVzdERhdGEoY29uc3Qgdm9pZCAqYnVmKSB7CisgIHJldHVybiA6OmZsYXRidWZmZXJzOjpHZXRSb290PE1vZGVsVGVzdERhdGE+KGJ1Zik7Cit9CisKK2lubGluZSBjb25zdCBNb2RlbFRlc3REYXRhICpHZXRTaXplUHJlZml4ZWRNb2RlbFRlc3REYXRhKGNvbnN0IHZvaWQgKmJ1ZikgeworICByZXR1cm4gOjpmbGF0YnVmZmVyczo6R2V0U2l6ZVByZWZpeGVkUm9vdDxNb2RlbFRlc3REYXRhPihidWYpOworfQorCitpbmxpbmUgYm9vbCBWZXJpZnlNb2RlbFRlc3REYXRhQnVmZmVyKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgeworICByZXR1cm4gdmVyaWZpZXIuVmVyaWZ5QnVmZmVyPE1vZGVsVGVzdERhdGE+KG51bGxwdHIpOworfQorCitpbmxpbmUgYm9vbCBWZXJpZnlTaXplUHJlZml4ZWRNb2RlbFRlc3REYXRhQnVmZmVyKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgeworICByZXR1cm4gdmVyaWZpZXIuVmVyaWZ5U2l6ZVByZWZpeGVkQnVmZmVyPE1vZGVsVGVzdERhdGE+KG51bGxwdHIpOworfQorCitpbmxpbmUgdm9pZCBGaW5pc2hNb2RlbFRlc3REYXRhQnVmZmVyKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmIsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE1vZGVsVGVzdERhdGE+IHJvb3QpIHsKKyAgZmJiLkZpbmlzaChyb290KTsKK30KKworaW5saW5lIHZvaWQgRmluaXNoU2l6ZVByZWZpeGVkTW9kZWxUZXN0RGF0YUJ1ZmZlcigKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNb2RlbFRlc3REYXRhPiByb290KSB7CisgIGZiYi5GaW5pc2hTaXplUHJlZml4ZWQocm9vdCk7Cit9CisKK2lubGluZSBzdGQ6OnVuaXF1ZV9wdHI8TW9kZWxUZXN0RGF0YVQ+IFVuUGFja01vZGVsVGVzdERhdGEoCisgICAgY29uc3Qgdm9pZCAqYnVmLAorICAgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKnJlcyA9IG51bGxwdHIpIHsKKyAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxNb2RlbFRlc3REYXRhVD4oR2V0TW9kZWxUZXN0RGF0YShidWYpLT5VblBhY2socmVzKSk7Cit9CisKK2lubGluZSBzdGQ6OnVuaXF1ZV9wdHI8TW9kZWxUZXN0RGF0YVQ+IFVuUGFja1NpemVQcmVmaXhlZE1vZGVsVGVzdERhdGEoCisgICAgY29uc3Qgdm9pZCAqYnVmLAorICAgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKnJlcyA9IG51bGxwdHIpIHsKKyAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxNb2RlbFRlc3REYXRhVD4oR2V0U2l6ZVByZWZpeGVkTW9kZWxUZXN0RGF0YShidWYpLT5VblBhY2socmVzKSk7Cit9CisKKyNlbmRpZiAgLy8gRkxBVEJVRkZFUlNfR0VORVJBVEVEX0xBWUVSQllMQVlFUlNDSEVNQV9IXwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvTWFrZWZpbGUgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9NYWtlZmlsZQppbmRleCBiYWRkMGNhLi4zYmYyYjU0IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9NYWtlZmlsZQorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9NYWtlZmlsZQpAQCAtMSw0ICsxLDQgQEAKLSMgQ29weXJpZ2h0IDIwMjMgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgQ29weXJpZ2h0IDIwMjQgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICMKICMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTYwLDkgKzYwLDIxIEBACiAjIFNwZWNpZnkgd2hpY2ggc3BlY2lhbGl6ZWQga2VybmVsIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSBwdWxsZWQgaW4uCiBPUFRJTUlaRURfS0VSTkVMX0RJUiA6PQogCisjIE9wdGltaXplIGtlcm5lbHMgZm9yIHNwZWVkIG9yIG1lbW9yeS4gVGhpcyBpcyBzaW1pbGFyIGJ1dCBub3QgdGhlIHNhbWUgYXMgS0VSTkVMX09QVElNSVpBVElPTl9MRVZFTCBhbmQKKyMgQ09SRV9PUFRJTUlaQVRJT05fTEVWRUwsIHdoaWNoIHNwZWNpZnkgY29tcGlsZXIgb3B0aW1pemF0aW9uIGxldmVsLgorIyBJbnN0ZWFkIHRoaXMgZW5hYmxlcyBhIGtlcm5lbCB0byBwcm92aWRlIG11bHRpcGxlIGltcGxlbWVudGF0aW9ucyB0aGF0IGlzIGNvbmZpZ3VyZWQgYXQgYnVpbGQgdGltZS4KKyMgQW4gZXhhbXBsZSBjb3VsZCBiZSBhIGtlcm5lbCByZXF1aXJpbmcgYSBiaWdnZXIgc2NyYXRjaCBidWZmZXIgZm9yIGNlcnRhaW4gdXNlIGNhc2VzLgorIyBUaGUgZXhhbXBsZSBrZXJuZWwgd291bGQgaGF2ZSBhIHNtYWxsZXIgc2NyYXRjaCBidWZmZXIgdXNhZ2Ugd2hlbiBidWlsZGluZyBmb3Igc2l6ZS4KKyMgVmljZSB2ZXJzYSBpdCB3b3VsZCB1c2UgbW9yZSBzY3JhdGNoIGJ1ZmZlciB3aGVuIGJ1aWxkaW5nIGZvciBzcGVlZCBhbmQgd291bGQgYmUgbW9yZSBwZXJmb3JtYW50LgorIyBOb3RlIHRoYXQgdGhpcyBpcyBvcHRpb25hbC4gSWYgaGF2aW5nIG9uZSBpbXBsZW1lbnRhdGlvbiwgbm90aGluZyBuZWVkcyB0byBiZSBkb25lLgorIyBPUFRJTUlaRV9LRVJORUxTX0ZPUiBoYXMgb25seSB0d28gdmFsaWQgdmFsdWVzLCBLRVJORUxTX09QVElNSVpFRF9GT1JfU0laRSBhbmQgS0VSTkVMU19PUFRJTUlaRURfRk9SX1NQRUVEIHdoZXJlIHRoZQorIyBmb3JtZXIgaXMgZGVmYXVsdC4KK09QVElNSVpFX0tFUk5FTFNfRk9SIDo9IEtFUk5FTFNfT1BUSU1JWkVEX0ZPUl9TUEVFRAorCiAjIE92ZXJyaWRlIHRoaXMgdmFyaWFibGUgZnJvbSB0aGUgY29tbWFuZCBsaW5lIGluIGNhc2UgdGhlIG9wdGltaXplZCBrZXJuZWxzIGFyZQogIyBpbiBhIGRpZmZlcmVudCBkaXJlY3RvcnkuCiBPUFRJTUlaRURfS0VSTkVMX0RJUl9QUkVGSVggOj0gJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMKK09QVElNSVpFRF9TSUdOQUxfS0VSTkVMX0RJUl9QUkVGSVggOj0gJChURU5TT1JGTE9XX1JPT1Qpc2lnbmFsL21pY3JvL2tlcm5lbHMKIAogIyBTcGVjaWZ5IHdoaWNoIGNvLXByb2Nlc3NvcidzIGtlcm5lbCBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgcHVsbGVkIGluLgogIyBJZiB0aGUgc2FtZSBrZXJuZWwgaXMgaW1wbGVtZW50ZWQgaW4gYm90aCBrZXJuZWxzL09QVElNSVpFRF9LRVJORUxfRElSIGFuZApAQCAtOTgsNyArMTEwLDcgQEAKIAogTUlDUk9MSVRFX0xJQlMgOj0gLWxtCiAKLSMgRm9yIHRoZSBvcHRpbWl6ZWRfa2VybmVsX2RpciwgYW5kIGNvLXByb2Nlc3NvciBhcyBzcGVjaWZpZWQgb24gdGhlCisjIEZvciB0aGUgb3B0aW1pemVkX2tlcm5lbF9kaXIsIGNvLXByb2Nlc3NvciBhbmQgb3B0aW1pemVfa2VybmVsc19mb3IgYXMgc3BlY2lmaWVkIG9uIHRoZQogIyBjb21tYW5kIGxpbmUgd2UgYWRkIC1EPHRhZz4gdG8gdGhlIGNmbGFncyB0byBhbGxvdyBmb3IgI2lkZWZzIGluIHRoZSBjb2RlLgogIwogIyBXZSBhcHBseSB0aGUgZm9sbG93aW5nIHRyYW5zZm9ybWF0aW9ucyAodmlhIHRoZSB0ciBjb21tYW5kKToKQEAgLTExMiw2ICsxMjQsMTAgQEAKICAgQURESVRJT05BTF9ERUZJTkVTICs9IC1EJChzaGVsbCBlY2hvICQoQ09fUFJPQ0VTU09SKSB8IHRyIFthLXpdIFtBLVpdKQogZW5kaWYKIAoraWZuZXEgKCQoT1BUSU1JWkVfS0VSTkVMU19GT1IpLCkKKyAgQURESVRJT05BTF9ERUZJTkVTICs9IC1EJChzaGVsbCBlY2hvICQoT1BUSU1JWkVfS0VSTkVMU19GT1IpIHwgdHIgW2Etel0gW0EtWl0pCitlbmRpZgorCiBpZmVxICgkKFRPT0xDSEFJTiksIGFybWNsYW5nKQogICBDT1JFX09QVElNSVpBVElPTl9MRVZFTCA6PSAtT3oKIGVsc2UKQEAgLTEzMCw3ICsxNDYsNiBAQAogQ0NfV0FSTklOR1MgOj0gXAogICAtV3NpZ24tY29tcGFyZSBcCiAgIC1XZG91YmxlLXByb21vdGlvbiBcCi0gIC1Xc2hhZG93IFwKICAgLVd1bnVzZWQtdmFyaWFibGUgXAogICAtV3VudXNlZC1mdW5jdGlvbiBcCiAgIC1Xc3dpdGNoIFwKQEAgLTE0MSw2ICsxNTYsMTQgQEAKICAgLVdzdHJpY3QtYWxpYXNpbmcgXAogICAtV25vLXVudXNlZC1wYXJhbWV0ZXIKIAoraWZuZXEgKCQoVE9PTENIQUlOKSwgZ2NjKQorICAjIEdDQyBjYW4gYmUgb3Zlcmx5IGFnZ3Jlc3NpdmUgd2l0aCBzaGFkb3cgd2FybmluZ3MsIHN1Y2ggYXMgd2FybmluZyB3aGVuIGEKKyAgIyBsYW1iZGEgaGFzIHZhcmlhYmxlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBhIG5vbi1jYXB0dXJlZCB2YXJpYWJsZSBmcm9tIHRoZQorICAjIGVuY2xvc2luZyBzY29wZS4gQXMgc3VjaCwgd2UgZG9uJ3QgZW5hYmxlIHNoYWRvdyB3YXJuaW5ncyBvbiBnY2MuCisgICMgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xLzY2NDA0NzUxCisgIENDX1dBUk5JTkdTICs9IC1Xc2hhZG93CitlbmRpZgorCiBDT01NT05fRkxBR1MgOj0gXAogICAtV2Vycm9yIFwKICAgLWZuby11bndpbmQtdGFibGVzIFwKQEAgLTE1OSw3ICsxODIsNyBAQAogZW5kaWYKIAogQ1hYRkxBR1MgOj0gXAotICAtc3RkPWMrKzExIFwKKyAgLXN0ZD1jKysxNyBcCiAgIC1mbm8tcnR0aSBcCiAgIC1mbm8tZXhjZXB0aW9ucyBcCiAgIC1mbm8tdGhyZWFkc2FmZS1zdGF0aWNzIFwKQEAgLTE2OCw3ICsxOTEsNyBAQAogCiBDQ0ZMQUdTIDo9IFwKICAgLVdpbXBsaWNpdC1mdW5jdGlvbi1kZWNsYXJhdGlvbiBcCi0gIC1zdGQ9YzExIFwKKyAgLXN0ZD1jMTcgXAogICAkKENPTU1PTl9GTEFHUykKIAogQVJGTEFHUyA6PSAtcgpAQCAtMjM0LDEzICsyNTcsNiBAQAogCSMgaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9pc3N1ZXMvNDMwNzYKIAlDWFhGTEFHUyA6PSAkKGZpbHRlci1vdXQgLURURl9MSVRFX1NUQVRJQ19NRU1PUlksICQoQ1hYRkxBR1MpKQogCUNDRkxBR1MgOj0gJChmaWx0ZXItb3V0IC1EVEZfTElURV9TVEFUSUNfTUVNT1JZLCAkKENDRkxBR1MpKQotCi0JIyBXZSBhcmUgdXNpbmcgQysrMTcgZm9yIHRoZSBub190Zl9saXRlX3N0YXRpY19tZW1vcnlfYnVpbGQgdG8gbWFrZSBpdCBjbG9zZQotCSMgdG8gdGhlIFRmTGl0ZSBiYXplbCBidWlsZC4KLQlDWFhGTEFHUyA6PSAkKGZpbHRlci1vdXQgLXN0ZD1jKysxMSwgJChDWFhGTEFHUykpCi0JQ1hYRkxBR1MgKz0gLXN0ZD1jKysxNwotCUNDRkxBR1MgOj0gJChmaWx0ZXItb3V0IC1zdGQ9YzExLCAkKENDTEFHUykpCi0JQ0NGTEFHUyArPSAtc3RkPWMxNwogZW5kaWYKIAogIyBUaGlzIGxpYnJhcnkgaXMgdGhlIG1haW4gdGFyZ2V0IGZvciB0aGlzIG1ha2VmaWxlLiBJdCB3aWxsIGNvbnRhaW4gYSBtaW5pbWFsCkBAIC0yNDksNyArMjY1LDE1IEBACiAKICMgV2hlcmUgY29tcGlsZWQgb2JqZWN0cyBhcmUgc3RvcmVkLgogQkFTRV9HRU5ESVIgOj0gZ2VuCi1HRU5ESVIgOj0gJChCQVNFX0dFTkRJUikvJChUQVJHRVQpXyQoVEFSR0VUX0FSQ0gpXyQoQlVJTERfVFlQRSkvCitHRU5ESVIgOj0gJChCQVNFX0dFTkRJUikvJChUQVJHRVQpXyQoVEFSR0VUX0FSQ0gpXyQoQlVJTERfVFlQRSkKK2lmbmVxICgkKE9QVElNSVpFRF9LRVJORUxfRElSKSwpCisgIEdFTkRJUiA6PSAkKEdFTkRJUilfJChPUFRJTUlaRURfS0VSTkVMX0RJUikKK2VuZGlmCitpZm5lcSAoJChDT19QUk9DRVNTT1IpLCkKKyAgR0VORElSIDo9ICQoR0VORElSKV8kKENPX1BST0NFU1NPUikKK2VuZGlmCitHRU5ESVIgOj0gJChHRU5ESVIpXyQoVE9PTENIQUlOKS8KKwogQ09SRV9PQkpESVIgOj0gJChHRU5ESVIpb2JqL2NvcmUvCiBLRVJORUxfT0JKRElSIDo9ICQoR0VORElSKW9iai9rZXJuZWxzLwogVEhJUkRfUEFSVFlfS0VSTkVMX09CSkRJUiA6PSAkKEdFTkRJUilvYmovdGhpcmRfcGFydHlfa2VybmVscy8KQEAgLTI4MSwxMCArMzA1LDE0IEBACiBNSUNST19MSVRFX0dFTl9NVVRBQkxFX09QX1JFU09MVkVSX1RFU1QgKz0gXAogICAkKHdpbGRjYXJkICQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9nZW5fbWljcm9fbXV0YWJsZV9vcF9yZXNvbHZlcl90ZXN0L3BlcnNvbl9kZXRlY3QvTWFrZWZpbGUuaW5jKQogCitPTERfTUlDUk9fTElURV9CRU5DSE1BUktTIDo9ICQod2lsZGNhcmQgJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2JlbmNobWFya3MvTWFrZWZpbGUuaW5jKQogTUlDUk9fTElURV9CRU5DSE1BUktTIDo9ICQod2lsZGNhcmQgJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2JlbmNobWFya2luZy9NYWtlZmlsZS5pbmMpCiAKK01JQ1JPX0xJVEVfTEFZRVJfQllfTEFZRVJfT1VUUFVUIDo9ICQod2lsZGNhcmQgJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL01ha2VmaWxlLmluYykKKwogIyBUT0RPKGIvMTUyNjQ1NTU5KTogbW92ZSBhbGwgYmVuY2htYXJrcyB0byBiZW5jaG1hcmtzIGRpcmVjdG9yeS4KIE1JQ1JPTElURV9CRU5DSE1BUktfU1JDUyA6PSBcCiskKHdpbGRjYXJkICQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9iZW5jaG1hcmtzLypiZW5jaG1hcmsuY2MpIFwKICQod2lsZGNhcmQgJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2JlbmNobWFya2luZy8qYmVuY2htYXJrLmNjKQogCiBNSUNST0xJVEVfVEVTVF9TUkNTIDo9IFwKQEAgLTI5NCw3ICszMjIsNyBAQAogJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL21lbW9yeV9oZWxwZXJzX3Rlc3QuY2MgXAogJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2FsbG9jYXRvcl90ZXN0LmNjIFwKICQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19hbGxvY2F0aW9uX2luZm9fdGVzdC5jYyBcCi0kKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWljcm9fY29udGV4dF90ZXN0LmNjIFwKKyQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19pbnRlcnByZXRlcl9jb250ZXh0X3Rlc3QuY2MgXAogJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL21pY3JvX2xvZ190ZXN0LmNjIFwKICQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19pbnRlcnByZXRlcl90ZXN0LmNjIFwKICQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb19tdXRhYmxlX29wX3Jlc29sdmVyX3Rlc3QuY2MgXApAQCAtMzEyLDQwICszNDAsNiBAQAogJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL21lbW9yeV9wbGFubmVyL25vbl9wZXJzaXN0ZW50X2J1ZmZlcl9wbGFubmVyX3NoaW1fdGVzdC5jYwogCiBNSUNST0xJVEVfQ0NfS0VSTkVMX1NSQ1MgOj0gXAotJChURU5TT1JGTE9XX1JPT1Qpc2lnbmFsL21pY3JvL2tlcm5lbHMvZGVsYXkuY2MgXAotJChURU5TT1JGTE9XX1JPT1Qpc2lnbmFsL21pY3JvL2tlcm5lbHMvZW5lcmd5LmNjIFwKLSQoVEVOU09SRkxPV19ST09UKXNpZ25hbC9taWNyby9rZXJuZWxzL2ZmdF9hdXRvX3NjYWxlLmNjIFwKLSQoVEVOU09SRkxPV19ST09UKXNpZ25hbC9taWNyby9rZXJuZWxzL2ZpbHRlcl9iYW5rLmNjIFwKLSQoVEVOU09SRkxPV19ST09UKXNpZ25hbC9taWNyby9rZXJuZWxzL2ZpbHRlcl9iYW5rX2xvZy5jYyBcCi0kKFRFTlNPUkZMT1dfUk9PVClzaWduYWwvbWljcm8va2VybmVscy9maWx0ZXJfYmFua19zcXVhcmVfcm9vdC5jYyBcCi0kKFRFTlNPUkZMT1dfUk9PVClzaWduYWwvbWljcm8va2VybmVscy9maWx0ZXJfYmFua19zcGVjdHJhbF9zdWJ0cmFjdGlvbi5jYyBcCi0kKFRFTlNPUkZMT1dfUk9PVClzaWduYWwvbWljcm8va2VybmVscy9mcmFtZXIuY2MgXAotJChURU5TT1JGTE9XX1JPT1Qpc2lnbmFsL21pY3JvL2tlcm5lbHMvaXJmZnQuY2MgXAotJChURU5TT1JGTE9XX1JPT1Qpc2lnbmFsL21pY3JvL2tlcm5lbHMvcmZmdC5jYyBcCi0kKFRFTlNPUkZMT1dfUk9PVClzaWduYWwvbWljcm8va2VybmVscy9zdGFja2VyLmNjIFwKLSQoVEVOU09SRkxPV19ST09UKXNpZ25hbC9taWNyby9rZXJuZWxzL292ZXJsYXBfYWRkLmNjIFwKLSQoVEVOU09SRkxPV19ST09UKXNpZ25hbC9taWNyby9rZXJuZWxzL3dpbmRvdy5jYyBcCi0kKFRFTlNPUkZMT1dfUk9PVClzaWduYWwvc3JjL2NpcmN1bGFyX2J1ZmZlci5jYyBcCi0kKFRFTlNPUkZMT1dfUk9PVClzaWduYWwvc3JjL2VuZXJneS5jYyBcCi0kKFRFTlNPUkZMT1dfUk9PVClzaWduYWwvc3JjL2ZmdF9hdXRvX3NjYWxlLmNjIFwKLSQoVEVOU09SRkxPV19ST09UKXNpZ25hbC9zcmMvZmlsdGVyX2JhbmsuY2MgXAotJChURU5TT1JGTE9XX1JPT1Qpc2lnbmFsL3NyYy9maWx0ZXJfYmFua19sb2cuY2MgXAotJChURU5TT1JGTE9XX1JPT1Qpc2lnbmFsL3NyYy9maWx0ZXJfYmFua19zcXVhcmVfcm9vdC5jYyBcCi0kKFRFTlNPUkZMT1dfUk9PVClzaWduYWwvc3JjL2ZpbHRlcl9iYW5rX3NwZWN0cmFsX3N1YnRyYWN0aW9uLmNjIFwKLSQoVEVOU09SRkxPV19ST09UKXNpZ25hbC9zcmMvaXJmZnRfZmxvYXQuY2MgXAotJChURU5TT1JGTE9XX1JPT1Qpc2lnbmFsL3NyYy9pcmZmdF9pbnQxNi5jYyBcCi0kKFRFTlNPUkZMT1dfUk9PVClzaWduYWwvc3JjL2lyZmZ0X2ludDMyLmNjIFwKLSQoVEVOU09SRkxPV19ST09UKXNpZ25hbC9zcmMvbG9nLmNjIFwKLSQoVEVOU09SRkxPV19ST09UKXNpZ25hbC9zcmMvbWF4X2Ficy5jYyBcCi0kKFRFTlNPUkZMT1dfUk9PVClzaWduYWwvc3JjL21zYl8zMi5jYyBcCi0kKFRFTlNPUkZMT1dfUk9PVClzaWduYWwvc3JjL21zYl82NC5jYyBcCi0kKFRFTlNPUkZMT1dfUk9PVClzaWduYWwvc3JjL292ZXJsYXBfYWRkLmNjIFwKLSQoVEVOU09SRkxPV19ST09UKXNpZ25hbC9zcmMvcmZmdF9mbG9hdC5jYyBcCi0kKFRFTlNPUkZMT1dfUk9PVClzaWduYWwvc3JjL3JmZnRfaW50MTYuY2MgXAotJChURU5TT1JGTE9XX1JPT1Qpc2lnbmFsL3NyYy9yZmZ0X2ludDMyLmNjIFwKLSQoVEVOU09SRkxPV19ST09UKXNpZ25hbC9zcmMvc3F1YXJlX3Jvb3RfMzIuY2MgXAotJChURU5TT1JGTE9XX1JPT1Qpc2lnbmFsL3NyYy9zcXVhcmVfcm9vdF82NC5jYyBcCi0kKFRFTlNPUkZMT1dfUk9PVClzaWduYWwvc3JjL3dpbmRvdy5jYyBcCiAkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9hY3RpdmF0aW9ucy5jYyBcCiAkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9hY3RpdmF0aW9uc19jb21tb24uY2MgXAogJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvYWRkLmNjIFwKQEAgLTM1Myw2ICszNDcsNyBAQAogJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvYWRkX24uY2MgXAogJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvYXJnX21pbl9tYXguY2MgXAogJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvYXNzaWduX3ZhcmlhYmxlLmNjIFwKKyQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL2JhdGNoX21hdG11bC5jYyBcCiAkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9iYXRjaF90b19zcGFjZV9uZC5jYyBcCiAkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9icm9hZGNhc3RfYXJncy5jYyBcCiAkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9icm9hZGNhc3RfdG8uY2MgXApAQCAtNDM3LDYgKzQzMiw3IEBACiAkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9zcXVhcmVkX2RpZmZlcmVuY2UuY2MgXAogJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMvc3F1ZWV6ZS5jYyBcCiAkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9zdHJpZGVkX3NsaWNlLmNjIFwKKyQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3N0cmlkZWRfc2xpY2VfY29tbW9uLmNjIFwKICQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3N1Yi5jYyBcCiAkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9zdWJfY29tbW9uLmNjIFwKICQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3N2ZGYuY2MgXApAQCAtNDUwLDI0ICs0NDYsNjQgQEAKICQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3doaWxlLmNjIFwKICQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3plcm9zX2xpa2UuY2MKIAorTUlDUk9MSVRFX0NDX1NJR05BTF9LRVJORUxfU1JDUyA6PSBcCiskKFRFTlNPUkZMT1dfUk9PVClzaWduYWwvbWljcm8va2VybmVscy9kZWxheS5jYyBcCiskKFRFTlNPUkZMT1dfUk9PVClzaWduYWwvbWljcm8va2VybmVscy9lbmVyZ3kuY2MgXAorJChURU5TT1JGTE9XX1JPT1Qpc2lnbmFsL21pY3JvL2tlcm5lbHMvZmZ0X2F1dG9fc2NhbGVfa2VybmVsLmNjIFwKKyQoVEVOU09SRkxPV19ST09UKXNpZ25hbC9taWNyby9rZXJuZWxzL2ZmdF9hdXRvX3NjYWxlX2NvbW1vbi5jYyBcCiskKFRFTlNPUkZMT1dfUk9PVClzaWduYWwvbWljcm8va2VybmVscy9maWx0ZXJfYmFuay5jYyBcCiskKFRFTlNPUkZMT1dfUk9PVClzaWduYWwvbWljcm8va2VybmVscy9maWx0ZXJfYmFua19sb2cuY2MgXAorJChURU5TT1JGTE9XX1JPT1Qpc2lnbmFsL21pY3JvL2tlcm5lbHMvZmlsdGVyX2Jhbmtfc3F1YXJlX3Jvb3QuY2MgXAorJChURU5TT1JGTE9XX1JPT1Qpc2lnbmFsL21pY3JvL2tlcm5lbHMvZmlsdGVyX2Jhbmtfc3F1YXJlX3Jvb3RfY29tbW9uLmNjIFwKKyQoVEVOU09SRkxPV19ST09UKXNpZ25hbC9taWNyby9rZXJuZWxzL2ZpbHRlcl9iYW5rX3NwZWN0cmFsX3N1YnRyYWN0aW9uLmNjIFwKKyQoVEVOU09SRkxPV19ST09UKXNpZ25hbC9taWNyby9rZXJuZWxzL2ZyYW1lci5jYyBcCiskKFRFTlNPUkZMT1dfUk9PVClzaWduYWwvbWljcm8va2VybmVscy9pcmZmdC5jYyBcCiskKFRFTlNPUkZMT1dfUk9PVClzaWduYWwvbWljcm8va2VybmVscy9yZmZ0LmNjIFwKKyQoVEVOU09SRkxPV19ST09UKXNpZ25hbC9taWNyby9rZXJuZWxzL3N0YWNrZXIuY2MgXAorJChURU5TT1JGTE9XX1JPT1Qpc2lnbmFsL21pY3JvL2tlcm5lbHMvb3ZlcmxhcF9hZGQuY2MgXAorJChURU5TT1JGTE9XX1JPT1Qpc2lnbmFsL21pY3JvL2tlcm5lbHMvcGNhbi5jYyBcCiskKFRFTlNPUkZMT1dfUk9PVClzaWduYWwvbWljcm8va2VybmVscy93aW5kb3cuY2MgXAorJChURU5TT1JGTE9XX1JPT1Qpc2lnbmFsL3NyYy9jaXJjdWxhcl9idWZmZXIuY2MgXAorJChURU5TT1JGTE9XX1JPT1Qpc2lnbmFsL3NyYy9lbmVyZ3kuY2MgXAorJChURU5TT1JGTE9XX1JPT1Qpc2lnbmFsL3NyYy9mZnRfYXV0b19zY2FsZS5jYyBcCiskKFRFTlNPUkZMT1dfUk9PVClzaWduYWwvc3JjL2ZpbHRlcl9iYW5rLmNjIFwKKyQoVEVOU09SRkxPV19ST09UKXNpZ25hbC9zcmMvZmlsdGVyX2JhbmtfbG9nLmNjIFwKKyQoVEVOU09SRkxPV19ST09UKXNpZ25hbC9zcmMvZmlsdGVyX2Jhbmtfc3F1YXJlX3Jvb3QuY2MgXAorJChURU5TT1JGTE9XX1JPT1Qpc2lnbmFsL3NyYy9maWx0ZXJfYmFua19zcGVjdHJhbF9zdWJ0cmFjdGlvbi5jYyBcCiskKFRFTlNPUkZMT1dfUk9PVClzaWduYWwvc3JjL2lyZmZ0X2Zsb2F0LmNjIFwKKyQoVEVOU09SRkxPV19ST09UKXNpZ25hbC9zcmMvaXJmZnRfaW50MTYuY2MgXAorJChURU5TT1JGTE9XX1JPT1Qpc2lnbmFsL3NyYy9pcmZmdF9pbnQzMi5jYyBcCiskKFRFTlNPUkZMT1dfUk9PVClzaWduYWwvc3JjL2xvZy5jYyBcCiskKFRFTlNPUkZMT1dfUk9PVClzaWduYWwvc3JjL21heF9hYnMuY2MgXAorJChURU5TT1JGTE9XX1JPT1Qpc2lnbmFsL3NyYy9tc2JfMzIuY2MgXAorJChURU5TT1JGTE9XX1JPT1Qpc2lnbmFsL3NyYy9tc2JfNjQuY2MgXAorJChURU5TT1JGTE9XX1JPT1Qpc2lnbmFsL3NyYy9vdmVybGFwX2FkZC5jYyBcCiskKFRFTlNPUkZMT1dfUk9PVClzaWduYWwvc3JjL3BjYW5fYXJnY19maXhlZC5jYyBcCiskKFRFTlNPUkZMT1dfUk9PVClzaWduYWwvc3JjL3JmZnRfZmxvYXQuY2MgXAorJChURU5TT1JGTE9XX1JPT1Qpc2lnbmFsL3NyYy9yZmZ0X2ludDE2LmNjIFwKKyQoVEVOU09SRkxPV19ST09UKXNpZ25hbC9zcmMvcmZmdF9pbnQzMi5jYyBcCiskKFRFTlNPUkZMT1dfUk9PVClzaWduYWwvc3JjL3NxdWFyZV9yb290XzMyLmNjIFwKKyQoVEVOU09SRkxPV19ST09UKXNpZ25hbC9zcmMvc3F1YXJlX3Jvb3RfNjQuY2MgXAorJChURU5TT1JGTE9XX1JPT1Qpc2lnbmFsL3NyYy93aW5kb3cuY2MKKwogTUlDUk9MSVRFX1RFU1RfSERSUyA6PSBcCiAkKHdpbGRjYXJkICQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0aW5nLyouaCkKIAogIyBUaGUgZXhwbGljaXRseSBzcGVjaWZpZWQgbGlzdCBvZiBzb3VyY2VzIGFuZCBoZWFkZXJzIHRoYXQgYXJlIHNoYXJlZCBiZXR3ZWVuCiAjIFRmTGl0ZSBhbmQgVEZMTSBhcmUgaW4gdGhlIGNpL3N5bmNfZnJvbV91cHN0cmVhbV90Zi5zaCBzY3JpcHQuCiBURkxfQ0NfU1JDUyA6PSBcCi0kKHNoZWxsIGZpbmQgJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlIC10eXBlIGQgXCggLXBhdGggJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL2V4cGVyaW1lbnRhbCAtbyAtcGF0aCAkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8gXCkgLXBydW5lIC1mYWxzZSAtbyAtbmFtZSAiKi5jYyIgLW8gLW5hbWUgIiouYyIpCiskKHNoZWxsIGZpbmQgJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdyAtdHlwZSBkIFwoIC1wYXRoICQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9leHBlcmltZW50YWwgLW8gLXBhdGggJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvIFwpIC1wcnVuZSAtZmFsc2UgLW8gLW5hbWUgIiouY2MiIC1vIC1uYW1lICIqLmMiKQogCiBURkxfQ0NfSERSUyA6PSBcCi0kKHNoZWxsIGZpbmQgJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlIC10eXBlIGQgXCggLXBhdGggJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL2V4cGVyaW1lbnRhbCAtbyAtcGF0aCAkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8gXCkgLXBydW5lIC1mYWxzZSAtbyAtbmFtZSAiKi5oIikKKyQoc2hlbGwgZmluZCAkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93IC10eXBlIGQgXCggLXBhdGggJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL2V4cGVyaW1lbnRhbCAtbyAtcGF0aCAkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8gXCkgLXBydW5lIC1mYWxzZSAtbyAtbmFtZSAiKi5oIikKIAogaWZuZXEgKCQoQlVJTERfVFlQRSksIG5vX3RmX2xpdGVfc3RhdGljX21lbW9yeSkKICAgRVhDTFVERURfVEZMX0NDX1NSQ1MgOj0gXAotICAJJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL2FycmF5LmNjCisJJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL2FycmF5LmNjCiAgIFRGTF9DQ19TUkNTIDo9ICQoZmlsdGVyLW91dCAkKEVYQ0xVREVEX1RGTF9DQ19TUkNTKSwgJChURkxfQ0NfU1JDUykpCiAKICAgRVhDTFVERURfVEZMX0NDX0hEUlMgOj0gXAotICAJJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL2FycmF5LmgKKwkkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvYXJyYXkuaAogICBURkxfQ0NfSERSUyA6PSAkKGZpbHRlci1vdXQgJChFWENMVURFRF9URkxfQ0NfSERSUyksICQoVEZMX0NDX0hEUlMpKQogZW5kaWYKIApAQCAtNTAxLDIwICs1MzcsMzEgQEAKICQoRE9XTkxPQURTX0RJUikvZmxhdGJ1ZmZlcnMvaW5jbHVkZS9mbGF0YnVmZmVycy9iYXNlLmggXAogJChET1dOTE9BRFNfRElSKS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL2J1ZmZlci5oIFwKICQoRE9XTkxPQURTX0RJUikvZmxhdGJ1ZmZlcnMvaW5jbHVkZS9mbGF0YnVmZmVycy9idWZmZXJfcmVmLmggXAorJChET1dOTE9BRFNfRElSKS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL2NvZGVfZ2VuZXJhdG9yLmggXAorJChET1dOTE9BRFNfRElSKS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL2NvZGVfZ2VuZXJhdG9ycy5oIFwKICQoRE9XTkxPQURTX0RJUikvZmxhdGJ1ZmZlcnMvaW5jbHVkZS9mbGF0YnVmZmVycy9kZWZhdWx0X2FsbG9jYXRvci5oIFwKICQoRE9XTkxPQURTX0RJUikvZmxhdGJ1ZmZlcnMvaW5jbHVkZS9mbGF0YnVmZmVycy9kZXRhY2hlZF9idWZmZXIuaCBcCiskKERPV05MT0FEU19ESVIpL2ZsYXRidWZmZXJzL2luY2x1ZGUvZmxhdGJ1ZmZlcnMvZmlsZV9tYW5hZ2VyLmggXAogJChET1dOTE9BRFNfRElSKS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL2ZsYXRidWZmZXJfYnVpbGRlci5oIFwKICQoRE9XTkxPQURTX0RJUikvZmxhdGJ1ZmZlcnMvaW5jbHVkZS9mbGF0YnVmZmVycy9mbGF0YnVmZmVycy5oIFwKKyQoRE9XTkxPQURTX0RJUikvZmxhdGJ1ZmZlcnMvaW5jbHVkZS9mbGF0YnVmZmVycy9mbGV4X2ZsYXRfdXRpbC5oIFwKICQoRE9XTkxPQURTX0RJUikvZmxhdGJ1ZmZlcnMvaW5jbHVkZS9mbGF0YnVmZmVycy9mbGV4YnVmZmVycy5oIFwKKyQoRE9XTkxPQURTX0RJUikvZmxhdGJ1ZmZlcnMvaW5jbHVkZS9mbGF0YnVmZmVycy9ncnBjLmggXAorJChET1dOTE9BRFNfRElSKS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL2hhc2guaCBcCiskKERPV05MT0FEU19ESVIpL2ZsYXRidWZmZXJzL2luY2x1ZGUvZmxhdGJ1ZmZlcnMvaWRsLmggXAorJChET1dOTE9BRFNfRElSKS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL21pbmlyZWZsZWN0LmggXAorJChET1dOTE9BRFNfRElSKS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL3JlZmxlY3Rpb24uaCBcCiskKERPV05MT0FEU19ESVIpL2ZsYXRidWZmZXJzL2luY2x1ZGUvZmxhdGJ1ZmZlcnMvcmVmbGVjdGlvbl9nZW5lcmF0ZWQuaCBcCiskKERPV05MT0FEU19ESVIpL2ZsYXRidWZmZXJzL2luY2x1ZGUvZmxhdGJ1ZmZlcnMvcmVnaXN0cnkuaCBcCiAkKERPV05MT0FEU19ESVIpL2ZsYXRidWZmZXJzL2luY2x1ZGUvZmxhdGJ1ZmZlcnMvc3RsX2VtdWxhdGlvbi5oIFwKICQoRE9XTkxPQURTX0RJUikvZmxhdGJ1ZmZlcnMvaW5jbHVkZS9mbGF0YnVmZmVycy9zdHJpbmcuaCBcCiAkKERPV05MT0FEU19ESVIpL2ZsYXRidWZmZXJzL2luY2x1ZGUvZmxhdGJ1ZmZlcnMvc3RydWN0LmggXAogJChET1dOTE9BRFNfRElSKS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL3RhYmxlLmggXAorJChET1dOTE9BRFNfRElSKS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL3V0aWwuaCBcCiAkKERPV05MT0FEU19ESVIpL2ZsYXRidWZmZXJzL2luY2x1ZGUvZmxhdGJ1ZmZlcnMvdmVjdG9yLmggXAogJChET1dOTE9BRFNfRElSKS9mbGF0YnVmZmVycy9pbmNsdWRlL2ZsYXRidWZmZXJzL3ZlY3Rvcl9kb3dud2FyZC5oIFwKICQoRE9XTkxPQURTX0RJUikvZmxhdGJ1ZmZlcnMvaW5jbHVkZS9mbGF0YnVmZmVycy92ZXJpZmllci5oIFwKLSQoRE9XTkxPQURTX0RJUikvZmxhdGJ1ZmZlcnMvaW5jbHVkZS9mbGF0YnVmZmVycy91dGlsLmggXAotJChET1dOTE9BRFNfRElSKS9mbGF0YnVmZmVycy9MSUNFTlNFLnR4dCBcCiskKERPV05MT0FEU19ESVIpL2ZsYXRidWZmZXJzL0xJQ0VOU0UgXAogJChET1dOTE9BRFNfRElSKS9nZW1tbG93cC9maXhlZHBvaW50L2ZpeGVkcG9pbnQuaCBcCiAkKERPV05MT0FEU19ESVIpL2dlbW1sb3dwL2ZpeGVkcG9pbnQvZml4ZWRwb2ludF9uZW9uLmggXAogJChET1dOTE9BRFNfRElSKS9nZW1tbG93cC9maXhlZHBvaW50L2ZpeGVkcG9pbnRfc3NlLmggXApAQCAtNTgzLDggKzYzMCwxNCBAQAogICBpbmNsdWRlICQoTUFLRUZJTEVfRElSKS90YXJnZXRzLyQoVEFSR0VUKV9tYWtlZmlsZS5pbmMKIGVuZGlmCiAKKyMgVmFsaWRhdGUgdmFsaWQgb3B0aW9ucy4KK2lmZXEgKCwkKGZpbHRlciAkKE9QVElNSVpFX0tFUk5FTFNfRk9SKSxLRVJORUxTX09QVElNSVpFRF9GT1JfU1BFRUQgS0VSTkVMU19PUFRJTUlaRURfRk9SX1NJWkUpKQorICAgICQoZXJyb3IgSW5jb3JyZWN0IE9QVElNSVpFX0tFUk5FTFNfRk9SOiAkKE9QVElNSVpFX0tFUk5FTFNfRk9SKSkKK2VuZGlmCisKIGlmbmVxICgkKE9QVElNSVpFRF9LRVJORUxfRElSKSwpCiAgIFBBVEhfVE9fT1BUSU1JWkVEX0tFUk5FTFMgOj0gJChPUFRJTUlaRURfS0VSTkVMX0RJUl9QUkVGSVgpLyQoT1BUSU1JWkVEX0tFUk5FTF9ESVIpCisgIFBBVEhfVE9fU0lHTkFMX09QVElNSVpFRF9LRVJORUxTIDo9ICQoT1BUSU1JWkVEX1NJR05BTF9LRVJORUxfRElSX1BSRUZJWCkvJChPUFRJTUlaRURfS0VSTkVMX0RJUikKIAogICAjIENoZWNrIHRoYXQgT1BUSU1JWkVEX0tFUk5FTF9ESVIgaXMgdmFsaWQgdG8gYXZvaWQgdW5leHBlY3RlZCBmYWxsYmFjayB0bwogICAjIHJlZmVyZW5jZSBrZXJuZWxzLiBTZWUgaHR0cDovL2IvMTgzNTQ2NzQyIGZvciBtb3JlIGNvbnRleHQuCkBAIC01OTksNiArNjUyLDIyIEBACiAJCS0tYmFzZV9maWxlcyAiJChNSUNST0xJVEVfQ0NfS0VSTkVMX1NSQ1MpIiBcCiAJCS0tc3BlY2lhbGl6ZV9kaXJlY3RvcnkgJChQQVRIX1RPX09QVElNSVpFRF9LRVJORUxTKSkKIAorICBpZm5lcSAoJChmaWx0ZXIgJChPUFRJTUlaRURfS0VSTkVMX0RJUiksIHh0ZW5zYSksKQorICAgICMgQ2hlY2sgdGhhdCBPUFRJTUlaRURfS0VSTkVMX0RJUiBpcyB2YWxpZCB0byBhdm9pZCB1bmV4cGVjdGVkIGZhbGxiYWNrIHRvCisgICAgIyByZWZlcmVuY2Uga2VybmVscy4gU2VlIGh0dHA6Ly9iLzE4MzU0Njc0MiBmb3IgbW9yZSBjb250ZXh0LgorICAgIFJFU1VMVCA6PSAkKHNoZWxsICQoTUFLRUZJTEVfRElSKS9jaGVja19vcHRpbWl6ZWRfa2VybmVsX2Rpci5zaCAkKFBBVEhfVE9fU0lHTkFMX09QVElNSVpFRF9LRVJORUxTKSkKKyAgICBpZm5lcSAoJChSRVNVTFQpLCBTVUNDRVNTKQorICAgICAgJChlcnJvciBJbmNvcnJlY3QgU0lHTkFMIE9QVElNSVpFRF9LRVJORUxfRElSOiAkKFJFU1VMVCkpCisgICAgZW5kaWYKKworICAgICMgU3BlY2lhbGl6ZSBmb3IgdGhlIG9wdGltaXplZCBrZXJuZWxzCisgICAgTUlDUk9MSVRFX0NDX1NJR05BTF9LRVJORUxfU1JDUyA6PSAkKHNoZWxsIHB5dGhvbjMgJChNQUtFRklMRV9ESVIpL3NwZWNpYWxpemVfZmlsZXMucHkgXAorICAgICAgLS1iYXNlX2ZpbGVzICIkKE1JQ1JPTElURV9DQ19TSUdOQUxfS0VSTkVMX1NSQ1MpIiBcCisgICAgICAtLXNwZWNpYWxpemVfZGlyZWN0b3J5ICQoUEFUSF9UT19TSUdOQUxfT1BUSU1JWkVEX0tFUk5FTFMpKQorICAgIE1JQ1JPTElURV9DQ19LRVJORUxfU1JDUyArPSAkKHdpbGRjYXJkICQoUEFUSF9UT19TSUdOQUxfT1BUSU1JWkVEX0tFUk5FTFMpLyouUykKKyAgICBNSUNST0xJVEVfQ0NfSERSUyArPSAkKHdpbGRjYXJkICQoUEFUSF9UT19TSUdOQUxfT1BUSU1JWkVEX0tFUk5FTFMpLyouaCkKKyAgZW5kaWYKKwogICAjIFRoZSBmaXJzdCBpZm5lcSBpcyBuZWVkZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoIG1ha2UgdmVyc2lvbnMgcHJpb3IgdG8gNC4yCiAgICMgd2hpY2ggZG8gbm90IHN1cHBvcnQgLlNIRUxMU1RBVFVTLiBXaGlsZSBtYWtlIDQuMiB3YXMgcmVsZWFzZWQgaW4gMjAxNiwKICAgIyBVYnVudHUgMTguMDQgb25seSBoYXMgdmVyc2lvbiA0LjEKQEAgLTYxNCw2ICs2ODMsOCBAQAogICBNSUNST0xJVEVfQ0NfSERSUyArPSAkKHdpbGRjYXJkICQoUEFUSF9UT19PUFRJTUlaRURfS0VSTkVMUykvKi5oKQogZW5kaWYKIAorTUlDUk9MSVRFX0NDX0tFUk5FTF9TUkNTICs9ICQoTUlDUk9MSVRFX0NDX1NJR05BTF9LRVJORUxfU1JDUykKKwogIyBJZiBhIGNvLXByb2Nlc3NvciBpcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSB3aXRoCiAjIENPX1BST0NFU1NPUj08Y29fcHJvY2Vzc29yPiB0aGVuIHdlIHdpbGwgaW5jbHVkZSBleHRfbGlicy88Y29fcHJvY2Vzc29yPi5pbmMKICMgYW5kIGZpbmQgYWRkaXRpb25hbCBrZXJuZWwgc291cmNlcyBpbiBrZXJuZWxzLzxjb19wcm9jZXNzb3I+LwpAQCAtNjgyLDcgKzc1MywxNCBAQAogIyBMb2FkIGdlbmVyYXRlZCBtaWNybyBtdXRhYmxlIG9wIHJlc29sdmVyIHRlc3QuCiBpbmNsdWRlICR7TUlDUk9fTElURV9HRU5fTVVUQUJMRV9PUF9SRVNPTFZFUl9URVNUfQogCisjIExvYWQgbGF5ZXJfYnlfbGF5ZXJfb3V0cHV0X3Rvb2wKK2lmbmVxICgkKFRBUkdFVCksICQoZmlsdGVyICQoVEFSR0VUKSwgXAorICBibHVlcGlsbCBjb3J0ZXhfbV9jb3JzdG9uZV8zMDAgcmlzY3YzMl9nZW5lcmljIGhleGFnb24pKQoraW5jbHVkZSAke01JQ1JPX0xJVEVfTEFZRVJfQllfTEFZRVJfT1VUUFVUfQorZW5kaWYKKwogIyBMb2FkIHRoZSBiZW5jaG1hcmtzLgoraW5jbHVkZSAkKE9MRF9NSUNST19MSVRFX0JFTkNITUFSS1MpCiBpbmNsdWRlICQoTUlDUk9fTElURV9CRU5DSE1BUktTKQogCiAjIExvYWQgY3VzdG9tIGtlcm5lbCB0ZXN0cy4KQEAgLTc3NSw2ICs4NTMsNyBAQAogIyBUaGVzZSBhcmUgbWljcm9jb250cm9sbGVyLXNwZWNpZmljIHJ1bGVzIGZvciBjb252ZXJ0aW5nIHRoZSBFTEYgb3V0cHV0CiAjIG9mIHRoZSBsaW5rZXIgaW50byBhIGJpbmFyeSBpbWFnZSB0aGF0IGNhbiBiZSBsb2FkZWQgZGlyZWN0bHkuCiBpZmVxICgkKFRPT0xDSEFJTiksIGFybWNsYW5nKQorICBDWFhGTEFHUyArPSAtZmZwLW1vZGU9ZnVsbAogICBGUk9NRUxGIDo9ICR7VEFSR0VUX1RPT0xDSEFJTl9ST09UfSQoVEFSR0VUX1RPT0xDSEFJTl9QUkVGSVgpZnJvbWVsZgogICAkKEJJTkRJUiklLmJpbjogJChCSU5ESVIpJQogCQlAbWtkaXIgLXAgJChkaXIgJEApCkBAIC04NTAsNiArOTI5LDkgQEAKICMgSnVzdCBidWlsZCB0aGUgdGVzdCB0YXJnZXRzCiBidWlsZDogJChNSUNST0xJVEVfQlVJTERfVEFSR0VUUykKIAorbGlzdF9nZW5kaXI6CisJQGVjaG8gJChHRU5ESVIpCisKIGxpc3RfbGlicmFyeV9zb3VyY2VzOgogCUBlY2hvICQoTUlDUk9MSVRFX0NDX1NSQ1MpICQoTUlDUk9MSVRFX0NDX0tFUk5FTF9TUkNTKQogCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9hcm1fZ2NjX2Rvd25sb2FkLnNoIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvYXJtX2djY19kb3dubG9hZC5zaAppbmRleCA4ZTZkNjMyLi42OGQyY2ExIDEwMDc1NQotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9hcm1fZ2NjX2Rvd25sb2FkLnNoCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2FybV9nY2NfZG93bmxvYWQuc2gKQEAgLTEsNSArMSw1IEBACiAjIS9iaW4vYmFzaAotIyBDb3B5cmlnaHQgMjAyMiBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtNjMsMTkgKzYzLDI2IEBACiAgICAgIyBob3N0IGFyY2hpdGVjaHR1cmUKICAgICBVTkFNRV9NPWB1bmFtZSAtbWAKICAgICBpZiBbICIke1VOQU1FX019IiA9PSAieDg2XzY0IiBdOyB0aGVuCi0gICAgICBHQ0NfVVJMPSJodHRwczovL2RldmVsb3Blci5hcm0uY29tLy0vbWVkaWEvRmlsZXMvZG93bmxvYWRzL2dudS1ybS8xMC4zLTIwMjEuMTAvZ2NjLWFybS1ub25lLWVhYmktMTAuMy0yMDIxLjEwLXg4Nl82NC1saW51eC50YXIuYnoyIgotICAgICAgRVhQRUNURURfTUQ1PSIyMzgzZTRlYjRlYTIzZjI0OGQzM2FkYzcwZGMzMjI3ZSIKKyAgICAgIEdDQ19VUkw9Imh0dHBzOi8vZGV2ZWxvcGVyLmFybS5jb20vLS9tZWRpYS9GaWxlcy9kb3dubG9hZHMvZ251LzEzLjIucmVsMS9iaW5yZWwvYXJtLWdudS10b29sY2hhaW4tMTMuMi5yZWwxLXg4Nl82NC1hcm0tbm9uZS1lYWJpLnRhci54eiIKKyAgICAgIEVYUEVDVEVEX01ENT0iNzkxNzU0ODUyZjhjMThlYTA0ZGE3MTM5ZjE1M2E1YjciCiAgICAgZWxpZiBbICIke1VOQU1FX019IiA9PSAiYWFyY2g2NCIgXTsgdGhlbgotICAgICAgR0NDX1VSTD0iaHR0cHM6Ly9kZXZlbG9wZXIuYXJtLmNvbS8tL21lZGlhL0ZpbGVzL2Rvd25sb2Fkcy9nbnUtcm0vMTAuMy0yMDIxLjEwL2djYy1hcm0tbm9uZS1lYWJpLTEwLjMtMjAyMS4xMC1hYXJjaDY0LWxpbnV4LnRhci5iejIiCi0gICAgICBFWFBFQ1RFRF9NRDU9IjNmZTNkOGJiNjkzYmQwYTZlNDYxNWI2NTY5NDQzZDBkIgorICAgICAgR0NDX1VSTD0iaHR0cHM6Ly9kZXZlbG9wZXIuYXJtLmNvbS8tL21lZGlhL0ZpbGVzL2Rvd25sb2Fkcy9nbnUvMTMuMi5yZWwxL2JpbnJlbC9hcm0tZ251LXRvb2xjaGFpbi0xMy4yLnJlbDEtYWFyY2g2NC1hcm0tbm9uZS1lYWJpLnRhci54eiIKKyAgICAgIEVYUEVDVEVEX01ENT0iNWEwODEyMmU2ZDRjYWY5N2M2Y2NkMWQyOWU2MjU5OWMiCiAgICAgZmkKIAogICBlbGlmIFsgIiR7SE9TVF9PU30iID09ICJvc3giIF07IHRoZW4KLSAgICBHQ0NfVVJMPSJodHRwczovL2RldmVsb3Blci5hcm0uY29tLy0vbWVkaWEvRmlsZXMvZG93bmxvYWRzL2dudS1ybS8xMC4zLTIwMjEuMTAvZ2NjLWFybS1ub25lLWVhYmktMTAuMy0yMDIxLjEwLW1hYy50YXIuYnoyIgotICAgIEVYUEVDVEVEX01ENT0iN2YyYTdiN2IyMzc5NzMwMmE5ZDYxODJjNmU0ODI0NDkiCisgICAgIyBob3N0IGFyY2hpdGVjaHR1cmUKKyAgICBVTkFNRV9NPWB1bmFtZSAtbWAKKyAgICBpZiBbICIke1VOQU1FX019IiA9PSAiYXJtNjQiIF07IHRoZW4KKyAgICAgIEdDQ19VUkw9Imh0dHBzOi8vZGV2ZWxvcGVyLmFybS5jb20vLS9tZWRpYS9GaWxlcy9kb3dubG9hZHMvZ251LzEzLjIucmVsMS9iaW5yZWwvYXJtLWdudS10b29sY2hhaW4tMTMuMi5yZWwxLWRhcndpbi1hcm02NC1hcm0tbm9uZS1lYWJpLnRhci54eiIKKyAgICAgIEVYUEVDVEVEX01ENT0iMmM0M2U5ZDcyMjA2YzFmODEyMjdiMGE2ODVkZjVlYTYiCisgICAgZWxzZQorICAgICAgR0NDX1VSTD0iaHR0cHM6Ly9kZXZlbG9wZXIuYXJtLmNvbS8tL21lZGlhL0ZpbGVzL2Rvd25sb2Fkcy9nbnUvMTMuMi5yZWwxL2JpbnJlbC9hcm0tZ251LXRvb2xjaGFpbi0xMy4yLnJlbDEtZGFyd2luLXg4Nl82NC1hcm0tbm9uZS1lYWJpLnRhci54eiIKKyAgICAgIEVYUEVDVEVEX01ENT0iNDFkNDk4NDBiMGZjNjc2ZDJhZTM1YWFiMjFhNTg2OTMiCisgICAgZmkKICAgZWxpZiBbICIke0hPU1RfT1N9IiA9PSAid2luZG93cyIgXTsgdGhlbgotICAgIEdDQ19VUkw9Imh0dHBzOi8vZGV2ZWxvcGVyLmFybS5jb20vLS9tZWRpYS9GaWxlcy9kb3dubG9hZHMvZ251LXJtLzEwLjMtMjAyMS4xMC9nY2MtYXJtLW5vbmUtZWFiaS0xMC4zLTIwMjEuMTAtd2luMzIuemlwIgotICAgIEVYUEVDVEVEX01ENT0iMmJjOGYwYzRjNDY1OWY4MjU5YzgxNzYyMjNlZWFmYzEiCisgICAgR0NDX1VSTD0iaHR0cHM6Ly9kZXZlbG9wZXIuYXJtLmNvbS8tL21lZGlhL0ZpbGVzL2Rvd25sb2Fkcy9nbnUvMTMuMi5yZWwxL2JpbnJlbC9hcm0tZ251LXRvb2xjaGFpbi0xMy4yLnJlbDEtbWluZ3ctdzY0LWk2ODYtYXJtLW5vbmUtZWFiaS56aXAiCisgICAgRVhQRUNURURfTUQ1PSI3ZmQ2NzcwODgwMzhjZGY4MmYzM2YxNDllMmU5NDNlZSIKICAgZWxzZQogICAgIGVjaG8gIk9TIHR5cGUgJHtIT1NUX09TfSBub3Qgc3VwcG9ydGVkLiIKICAgICBleGl0IDEKQEAgLTkyLDcgKzk5LDcgQEAKICAgICB1bnppcCAtcSAke1RFTVBGSUxFfSAtZCAke1RFTVBESVJ9ID4mMgogICAgIG12ICR7VEVNUERJUn0vKi8qICR7RE9XTkxPQURFRF9HQ0NfUEFUSH0KICAgZWxzZQotICAgIHRhciAtQyAke0RPV05MT0FERURfR0NDX1BBVEh9IC0tc3RyaXAtY29tcG9uZW50cz0xIC14amYgJHtURU1QRklMRX0gPiYyCisgICAgdGFyIC1DICR7RE9XTkxPQURFRF9HQ0NfUEFUSH0gLS1zdHJpcC1jb21wb25lbnRzPTEgLXhKZiAke1RFTVBGSUxFfSA+JjIKICAgZmkKICAgZWNobyA+JjIgIlVucGFja2VkIHRvIGRpcmVjdG9yeTogJHtET1dOTE9BREVEX0dDQ19QQVRIfSIKIGZpCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9iYXNoX2hlbHBlcnMuc2ggYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9iYXNoX2hlbHBlcnMuc2gKaW5kZXggZjI5YTY0MS4uZTU0NDZkZSAxMDA3NTUKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvYmFzaF9oZWxwZXJzLnNoCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2Jhc2hfaGVscGVycy5zaApAQCAtMSw1ICsxLDUgQEAKICMhL2Jpbi9iYXNoCi0jIENvcHlyaWdodCAyMDE5IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIENvcHlyaWdodCAyMDI0IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNCw2ICsxNCwzMiBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKKyMgQ2hlY2sgdGhlIGRvd25sb2FkIHBhdGggYXJndW1lbnQKKyMKKyMgUGFyYW1ldGVyKHMpOgorIyAgICR7MX0gLSBwYXRoIHRvIHRoZSBkb3dubG9hZCBkaXJlY3Rvcnkgb3IgLS1uby1kb3dubG9hZHMKKyMKKyMgT3V0cHV0czoKKyMgInllcyIgb3IgIm5vIgorZnVuY3Rpb24gY2hlY2tfc2hvdWxkX2Rvd25sb2FkKCkgeworICBpZiBbWyAkezF9ID09ICItLW5vLWRvd25sb2FkcyIgXV07IHRoZW4KKyAgICBlY2hvICJubyIKKyAgZWxzZQorICAgIGVjaG8gInllcyIKKyAgZmkKK30KKworIyBTaG93IHRoZSBkb3dubG9hZCBVUkwgYW5kIE1ENSBjaGVja3N1bQorIworIyBQYXJhbWV0ZXIocyk6CisjICAgJHsxfSAtIGRvd25sb2FkIFVSTAorIyAgICR7Mn0gLSBkb3dubG9hZCBNRDUgY2hlY2tzdW0KKyMKKyMgRG93bmxvYWQgc2NyaXB0cyByZXF1aXJlIGluZm9ybWF0aW9uYWwgb3V0cHV0IHNob3VsZCBiZSBvbiBzdGRlcnIuCitmdW5jdGlvbiBzaG93X2Rvd25sb2FkX3VybF9tZDUoKSB7CisgIGVjaG8gPiYyICJMSUJSQVJZX1VSTD0kezF9IgorICBlY2hvID4mMiAiTElCUkFSWV9NRDU9JHsyfSIKK30KIAogIyBDb21wdXRlIHRoZSBNRDUgc3VtLgogIwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvY29yc3RvbmVfMzAwX2Rvd25sb2FkLnNoIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvY29yc3RvbmVfMzAwX2Rvd25sb2FkLnNoCmluZGV4IGFhMGE3NjIuLmM0ODVkM2QgMTAwNzU1Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2NvcnN0b25lXzMwMF9kb3dubG9hZC5zaAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9jb3JzdG9uZV8zMDBfZG93bmxvYWQuc2gKQEAgLTEsNSArMSw1IEBACiAjIS9iaW4vYmFzaAotIyBDb3B5cmlnaHQgMjAyMiBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBDb3B5cmlnaHQgMjAyNCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTcsNiArMTcsNyBAQAogIyBDYWxsZWQgd2l0aCBmb2xsb3dpbmcgYXJndW1lbnRzOgogIyAxIC0gUGF0aCB0byB0aGUgZG93bmxvYWRzIGZvbGRlciB3aGljaCBpcyB0eXBpY2FsbHkKICMgICAgIHRlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2Rvd25sb2FkcworIyAyIC0gKG9wdGlvbmFsKSBURU5TT1JGTE9XX1JPT1Q6IHBhdGggdG8gcm9vdCBvZiB0aGUgVEZMTSB0cmVlIChyZWxhdGl2ZSB0byBkaXJlY3RvcnkgZnJvbSB3aGVyZSB0aGUgc2NyaXB0IGlzIGNhbGxlZCkuCiAjCiAjIFRoaXMgc2NyaXB0IGlzIGNhbGxlZCBmcm9tIHRoZSBNYWtlZmlsZSBhbmQgdXNlcyB0aGUgZm9sbG93aW5nIGNvbnZlbnRpb24gdG8KICMgZW5hYmxlIGRldGVybWluYXRpb24gb2Ygc3VjZXNzL2ZhaWx1cmU6CkBAIC0zMSwxMSArMzIsOCBAQAogCiBzZXQgLWUKIAotU0NSSVBUX0RJUj0iJChjZCAiJChkaXJuYW1lICIke0JBU0hfU09VUkNFWzBdfSIpIiAmJiBwd2QpIgotUk9PVF9ESVI9JHtTQ1JJUFRfRElSfS8uLi8uLi8uLi8uLi8uLgotY2QgIiR7Uk9PVF9ESVJ9IgotCi1zb3VyY2UgdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvYmFzaF9oZWxwZXJzLnNoCitURU5TT1JGTE9XX1JPT1Q9JHsyfQorc291cmNlICR7VEVOU09SRkxPV19ST09UfXRlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2Jhc2hfaGVscGVycy5zaAogCiBET1dOTE9BRFNfRElSPSR7MX0KIGlmIFsgISAtZCAke0RPV05MT0FEU19ESVJ9IF07IHRoZW4KQEAgLTQ4LDEwICs0NiwxOSBAQAogaWYgWyAtZCAke0RPV05MT0FERURfQ09SU1RPTkVfUEFUSH0gXTsgdGhlbgogICBlY2hvID4mMiAiJHtET1dOTE9BREVEX0NPUlNUT05FX1BBVEh9IGFscmVhZHkgZXhpc3RzLCBza2lwcGluZyB0aGUgZG93bmxvYWQuIgogZWxzZQotICBVTkFNRV9TPWB1bmFtZSAtc2AKKyAgVU5BTUVfUz0kKHVuYW1lIC1zKQorICBVTkFNRV9NPSQodW5hbWUgLW0pCiAgIGlmIFsgJHtVTkFNRV9TfSA9PSBMaW51eCBdOyB0aGVuCi0gICAgQ09SU1RPTkVfVVJMPWh0dHBzOi8vZGV2ZWxvcGVyLmFybS5jb20vLS9tZWRpYS9Bcm0lMjBEZXZlbG9wZXIlMjBDb21tdW5pdHkvRG93bmxvYWRzL09TUy9GVlAvQ29yc3RvbmUtMzAwL0ZWUF9Db3JzdG9uZV9TU0UtMzAwXzExLjE2XzI2LnRnegotICAgIEVYUEVDVEVEX01ENT0yOWQ5MjA4MTI3YjI0YTBkODMzNTZlZmI4MzQzMTYyZAorICAgIGlmIFsgJHtVTkFNRV9NfSA9PSB4ODZfNjQgXTsgdGhlbgorICAgICAgQ09SU1RPTkVfVVJMPWh0dHBzOi8vZGV2ZWxvcGVyLmFybS5jb20vLS9tZWRpYS9Bcm0lMjBEZXZlbG9wZXIlMjBDb21tdW5pdHkvRG93bmxvYWRzL09TUy9GVlAvQ29yc3RvbmUtMzAwL0ZWUF9Db3JzdG9uZV9TU0UtMzAwXzExLjI0XzEzX0xpbnV4NjQudGd6CisgICAgICBFWFBFQ1RFRF9NRDU9NDI1MDBlNDlhNGI5ZThlMGY2MzNkMWJhZDliN2MwNTIKKyAgICBlbGlmIFsgJHtVTkFNRV9NfSA9PSBhYXJjaDY0IF07IHRoZW4KKyAgICAgIENPUlNUT05FX1VSTD1odHRwczovL2RldmVsb3Blci5hcm0uY29tLy0vbWVkaWEvQXJtJTIwRGV2ZWxvcGVyJTIwQ29tbXVuaXR5L0Rvd25sb2Fkcy9PU1MvRlZQL0NvcnN0b25lLTMwMC9GVlBfQ29yc3RvbmVfU1NFLTMwMF8xMS4yNF8xM19MaW51eDY0X2FybXY4bC50Z3oKKyAgICAgIEVYUEVDVEVEX01ENT04OTkwNGU4NzVjODYzMjM1NjM1ZTE1NzBjNGY2NDU5ZQorICAgIGVsc2UKKyAgICAgICAgICBlY2hvICJDcHUgdHlwZSAke1VOQU1FX019IHdpdGggT1MgdHlwZSAke1VOQU1FX1N9IG5vdCBzdXBwb3J0ZWQuIgorICAgICAgICAgIGV4aXQgMQorICAgIGZpCiAgIGVsc2UKICAgICBlY2hvICJPUyB0eXBlICR7VU5BTUVfU30gbm90IHN1cHBvcnRlZC4iCiAgICAgZXhpdCAxCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9kb3dubG9hZF9hbmRfZXh0cmFjdC5zaCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2Rvd25sb2FkX2FuZF9leHRyYWN0LnNoCmluZGV4IDk3NGRjYTEuLmRjZDYwZGEgMTAwNzU1Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2Rvd25sb2FkX2FuZF9leHRyYWN0LnNoCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2Rvd25sb2FkX2FuZF9leHRyYWN0LnNoCkBAIC0xLDUgKzEsNSBAQAogIyEvYmluL2Jhc2gKLSMgQ29weXJpZ2h0IDIwMjEgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgQ29weXJpZ2h0IDIwMjQgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICMKICMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTEyMyw5ICsxMjMsOSBAQAogICAgIHNsZWVwIDIKICAgZG9uZQogCi0gICMgQ2hlY2sgdGhhdCB0aGUgZmlsZSB3YXMgZG93bmxvYWRlZCBjb3JyZWN0bHkgdXNpbmcgYSBjaGVja3N1bS4KKyAgIyBDaGVjayB0aGF0IHRoZSBmaWxlIHdhcyBkb3dubG9hZGVkIGNvcnJlY3RseSB1c2luZyBhIGNoZWNrc3VtLiBQdXQgZXhwZWN0ZWRfbWQ1IGFzICJTS0lQX01ENV9DSEVDSyIgdG8gc2tpcCB0aGlzIGNoZWNrLgogICBET1dOTE9BREVEX01ENT0kKG9wZW5zc2wgZGdzdCAtbWQ1ICR7dGVtcGZpbGV9IHwgc2VkICdzLy4qIC8vZycpCi0gIGlmIFsgJHtleHBlY3RlZF9tZDV9ICE9ICR7RE9XTkxPQURFRF9NRDV9IF07IHRoZW4KKyAgaWYgWyAke2V4cGVjdGVkX21kNX0gIT0gJHtET1dOTE9BREVEX01ENX0gXSAmJiBbICR7ZXhwZWN0ZWRfbWQ1fSAhPSAiU0tJUF9NRDVfQ0hFQ0siIF07IHRoZW4KICAgICBlY2hvICJDaGVja3N1bSBlcnJvciBmb3IgJyR7dXJsfScuIEV4cGVjdGVkICR7ZXhwZWN0ZWRfbWQ1fSBidXQgZm91bmQgJHtET1dOTE9BREVEX01ENX0iCiAgICAgZXhpdCAxCiAgIGZpCkBAIC0xMzQsMjggKzEzNCwzMCBAQAogICB1cmw9JChlY2hvICIke3VybH0iIHwgc2VkICJzL1w/LiovLyIpCiAKICAgaWYgW1sgIiR7dXJsfSIgPT0gKmd6IF1dOyB0aGVuCi0gICAgdGFyIC1DICIke2Rpcn0iIC0tc3RyaXAtY29tcG9uZW50cz0xIC14emYgJHt0ZW1wZmlsZX0KKyAgICB0YXIgLUMgIiR7dGVtcGRpcjJ9IiAteHpmICR7dGVtcGZpbGV9CiAgIGVsaWYgW1sgIiR7dXJsfSIgPT0gKnRhci54eiBdXTsgdGhlbgotICAgIHRhciAtQyAiJHtkaXJ9IiAtLXN0cmlwLWNvbXBvbmVudHM9MSAteGYgJHt0ZW1wZmlsZX0KKyAgICB0YXIgLUMgIiR7dGVtcGRpcjJ9IiAteGYgJHt0ZW1wZmlsZX0KICAgZWxpZiBbWyAiJHt1cmx9IiA9PSAqYnoyIF1dOyB0aGVuCiAgICAgY3VybCAtTHMgIiR7dXJsfSIgPiAke3RlbXBkaXJ9L3RhcnJlZC5iejIKLSAgICB0YXIgLUMgIiR7ZGlyfSIgLS1zdHJpcC1jb21wb25lbnRzPTEgLXhqZiAke3RlbXBmaWxlfQorICAgIHRhciAtQyAiJHt0ZW1wZGlyMn0iIC14amYgJHt0ZW1wZmlsZX0KICAgZWxpZiBbWyAiJHt1cmx9IiA9PSAqemlwIF1dOyB0aGVuCiAgICAgdW56aXAgJHt0ZW1wZmlsZX0gLWQgJHt0ZW1wZGlyMn0gMj4mMSAxPi9kZXYvbnVsbAotICAgICMgSWYgdGhlIHppcCBmaWxlIGNvbnRhaW5zIG5lc3RlZCBkaXJlY3RvcmllcywgZXh0cmFjdCB0aGUgZmlsZXMgZnJvbSB0aGUKLSAgICAjIGlubmVyIGRpcmVjdG9yeS4KLSAgICBpZiBbICQoZmluZCAkdGVtcGRpcjIvKiAtbWF4ZGVwdGggMCB8IHdjIC1sKSA9IDEgXSAmJiBbIC1kICR0ZW1wZGlyMi8qIF07IHRoZW4KLSAgICAgICMgdW56aXAgaGFzIG5vIHN0cmlwIGNvbXBvbmVudHMsIHNvIHVuemlwIHRvIGEgdGVtcCBkaXIsIGFuZCBtb3ZlIHRoZQotICAgICAgIyBmaWxlcyB3ZSB3YW50IGZyb20gdGhlIHRlbXBkaXIgdG8gZGVzdGluYXRpb24uCi0gICAgICBjcCAtUiAke3RlbXBkaXIyfS8qLyogJHtkaXJ9LwotICAgIGVsc2UKLSAgICAgIGNwIC1SICR7dGVtcGRpcjJ9LyogJHtkaXJ9LwotICAgIGZpCiAgIGVsc2UKICAgICBlY2hvICJFcnJvciB1bnN1cHBvcnRlZCBhcmNoaXZlIHR5cGUuIEZhaWxlZCB0byBleHRyYWN0IHRvb2wgYWZ0ZXIgZG93bmxvYWQuIgogICAgIGV4aXQgMQogICBmaQotICBybSAtcmYgJHt0ZW1wZGlyMn0gJHt0ZW1wZGlyfQorCisgICMgSWYgdGhlIHppcCBmaWxlIGNvbnRhaW5zIG5lc3RlZCBkaXJlY3RvcmllcywgZXh0cmFjdCB0aGUgZmlsZXMgZnJvbSB0aGUKKyAgIyBpbm5lciBkaXJlY3RvcnkuCisgIGlmIFsgJChmaW5kICR0ZW1wZGlyMi8qIC1tYXhkZXB0aCAwIHwgd2MgLWwpID0gMSBdICYmIFsgLWQgJHRlbXBkaXIyLyogXTsgdGhlbgorICAgICMgVW56aXAgdG8gYSB0ZW1wIGRpciwgYW5kIG1vdmUgdGhlIGZpbGVzIHdlIHdhbnQgZnJvbSB0aGUgdGVtcGRpciB0byBkZXN0aW5hdGlvbi4KKyAgICAjIFdlIHdhbnQgdGhpcyB0byBiZSBkZXBlbmRlbnQgb24gdGhlIGZvbGRlciBzdHJ1Y3R1cmUgb2YgdGhlIHppcHBlZCBmaWxlLCBzbyAtLXN0cmlwLWNvbXBvbmVudHMgY2Fubm90IGJlIHVzZWQuCisgICAgY3AgLVIgJHt0ZW1wZGlyMn0vKi8qICR7ZGlyfS8KKyAgZWxzZQorICAgIGNwIC1SICR7dGVtcGRpcjJ9LyogJHtkaXJ9LworICBmaQorCisgIHJtIC1yZiAke3RlbXBkaXJ9ICR7dGVtcGRpcjJ9CiAKICAgIyBEZWxldGUgYW55IHBvdGVudGlhbCBCVUlMRCBmaWxlcywgd2hpY2ggd291bGQgaW50ZXJmZXJlIHdpdGggQmF6ZWwgYnVpbGRzLgogICBmaW5kICIke2Rpcn0iIC10eXBlIGYgLW5hbWUgJypCVUlMRCcgLWRlbGV0ZQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvZXRob3NfdV9jb3JlX2RyaXZlcl9kb3dubG9hZC5zaCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2V0aG9zX3VfY29yZV9kcml2ZXJfZG93bmxvYWQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTZjOTZjMQotLS0gL2Rldi9udWxsCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2V0aG9zX3VfY29yZV9kcml2ZXJfZG93bmxvYWQuc2gKQEAgLTAsMCArMSw2NCBAQAorIyEvYmluL2Jhc2gKKyMgQ29weXJpZ2h0IDIwMjQgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjCisjIENhbGxlZCB3aXRoIGZvbGxvd2luZyBhcmd1bWVudHM6CisjIDEgLSBQYXRoIHRvIHRoZSBkb3dubG9hZHMgZm9sZGVyIHdoaWNoIGlzIHR5cGljYWxseQorIyAgICAgdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvZG93bmxvYWRzCisjCisjIFRoaXMgc2NyaXB0IGlzIGNhbGxlZCBmcm9tIHRoZSBNYWtlZmlsZSBhbmQgdXNlcyB0aGUgZm9sbG93aW5nIGNvbnZlbnRpb24gdG8KKyMgZW5hYmxlIGRldGVybWluYXRpb24gb2Ygc3VjZXNzL2ZhaWx1cmU6CisjCisjICAgLSBJZiB0aGUgc2NyaXB0IGlzIHN1Y2Nlc3NmdWwsIHRoZSBvbmx5IG91dHB1dCBvbiBzdGRvdXQgc2hvdWxkIGJlIFNVQ0NFU1MuCisjICAgICBUaGUgbWFrZWZpbGUgY2hlY2tzIGZvciB0aGlzIHBhcnRpY3VsYXIgc3RyaW5nLgorIworIyAgIC0gQW55IHN0cmluZyBvbiBzdGRvdXQgdGhhdCBpcyBub3QgU1VDQ0VTUyB3aWxsIGJlIHNob3duIGluIHRoZSBtYWtlZmlsZSBhcworIyAgICAgdGhlIGNhdXNlIGZvciB0aGUgc2NyaXB0IHRvIGhhdmUgZmFpbGVkLgorIworIyAgIC0gQW55IG90aGVyIGluZm9ybWF0aW9uYWwgcHJpbnRzIHNob3VsZCBiZSBvbiBzdGRlcnIuCisKK3NldCAtZQorCitURU5TT1JGTE9XX1JPT1Q9JHsyfQorc291cmNlICR7VEVOU09SRkxPV19ST09UfXRlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2Jhc2hfaGVscGVycy5zaAorCitET1dOTE9BRFNfRElSPSR7MX0KK2lmIFsgISAtZCAke0RPV05MT0FEU19ESVJ9IF07IHRoZW4KKyAgZWNobyAiVGhlIHRvcC1sZXZlbCBkb3dubG9hZHMgZGlyZWN0b3J5OiAke0RPV05MT0FEU19ESVJ9IGRvZXMgbm90IGV4aXN0LiIKKyAgZXhpdCAxCitmaQorCitET1dOTE9BREVEX0VUSE9TX1VfQ09SRV9EUklWRVJfUEFUSD0ke0RPV05MT0FEU19ESVJ9L2V0aG9zX3VfY29yZV9kcml2ZXIKKworaWYgWyAtZCAke0RPV05MT0FERURfRVRIT1NfVV9DT1JFX0RSSVZFUl9QQVRIfSBdOyB0aGVuCisgIGVjaG8gPiYyICIke0RPV05MT0FERURfRVRIT1NfVV9DT1JFX0RSSVZFUl9QQVRIfSBhbHJlYWR5IGV4aXN0cywgc2tpcHBpbmcgdGhlIGRvd25sb2FkLiIKK2Vsc2UKKyAgVU5BTUVfUz1gdW5hbWUgLXNgCisgIGlmIFsgJHtVTkFNRV9TfSAhPSBMaW51eCBdOyB0aGVuCisgICAgZWNobyAiT1MgdHlwZSAke1VOQU1FX1N9IG5vdCBzdXBwb3J0ZWQuIgorICAgIGV4aXQgMQorICBmaQorCisgIGdpdCBjbG9uZSAiaHR0cHM6Ly9yZXZpZXcubWxwbGF0Zm9ybS5vcmcvbWwvZXRob3MtdS9ldGhvcy11LWNvcmUtZHJpdmVyIiBcCisgICAgICAke0RPV05MT0FERURfRVRIT1NfVV9DT1JFX0RSSVZFUl9QQVRIfSA+JjIKKyAgcHVzaGQgJHtET1dOTE9BREVEX0VUSE9TX1VfQ09SRV9EUklWRVJfUEFUSH0gPiAvZGV2L251bGwKKyAgZ2l0IC1jIGFkdmljZS5kZXRhY2hlZEhlYWQ9ZmFsc2UgY2hlY2tvdXQgOTYyMjYwOGE1Y2MzMThjMDkzM2JjY2U3MjBiNTk3MzdkMDNiZmI2ZgorICBybSAtcmYgLmdpdAorICBjcmVhdGVfZ2l0X3JlcG8gLi8KKyAgcG9wZCA+IC9kZXYvbnVsbAorCitmaQorCitlY2hvICJTVUNDRVNTIgpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvaW5jcmVhc2Utc3RhY2stc2l6ZS1hbmQtc3dpdGNoLURUQ00tU1JBTS5wYXRjaCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2V0aG9zX3VfY29yZV9wbGF0Zm9ybS5wYXRjaApzaW1pbGFyaXR5IGluZGV4IDcyJQpyZW5hbWUgZnJvbSB0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9pbmNyZWFzZS1zdGFjay1zaXplLWFuZC1zd2l0Y2gtRFRDTS1TUkFNLnBhdGNoCnJlbmFtZSB0byB0ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9ldGhvc191X2NvcmVfcGxhdGZvcm0ucGF0Y2gKaW5kZXggNTdjNTBjMS4uOTU3YzljMiAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvaW5jcmVhc2Utc3RhY2stc2l6ZS1hbmQtc3dpdGNoLURUQ00tU1JBTS5wYXRjaAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9ldGhvc191X2NvcmVfcGxhdGZvcm0ucGF0Y2gKQEAgLTEsMTYgKzEsMTYgQEAKLUZyb20gNDcwZGVlMTNiZmZjMGFkYjlhNzc4ZDU2ZmFiMzAyODAzMWY3MWU4MCBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb20gNzBlNTA0YWJiMTNmZTU2MjQ0MjUwYWM3YWM1OGIxYjUyMzI0ODFjNyBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKIEZyb206IFRGTE0gPHRmbG1AZ29vZ2xlLmNvbT4KLURhdGU6IEZyaSwgMjggT2N0IDIwMjIgMTE6MDE6MTUgKzAyMDAKK0RhdGU6IE1vbiwgMjggQXVnIDIwMjMgMTY6MDc6MjIgKzAwMDAKIFN1YmplY3Q6IFtQQVRDSF0gVEZMTSBwYXRjaAogCiAtLS0KLSB0YXJnZXRzL2NvcnN0b25lLTMwMC9wbGF0Zm9ybS5sZCAgICAgIHwgIDggKysrLS0tLS0KLSB0YXJnZXRzL2NvcnN0b25lLTMwMC9wbGF0Zm9ybS5zY2F0dGVyIHwgIDUgKysrLS0KKyB0YXJnZXRzL2NvcnN0b25lLTMwMC9wbGF0Zm9ybS5sZCAgICAgIHwgMTAgKysrKy0tLS0tLQorIHRhcmdldHMvY29yc3RvbmUtMzAwL3BsYXRmb3JtLnNjYXR0ZXIgfCAgNyArKysrLS0tCiAgdGFyZ2V0cy9jb3JzdG9uZS0zMDAvcmV0YXJnZXQuYyAgICAgICB8IDE2ICsrKysrKysrLS0tLS0tLS0KLSAzIGZpbGVzIGNoYW5nZWQsIDE0IGluc2VydGlvbnMoKyksIDE1IGRlbGV0aW9ucygtKQorIDMgZmlsZXMgY2hhbmdlZCwgMTYgaW5zZXJ0aW9ucygrKSwgMTcgZGVsZXRpb25zKC0pCiAKIGRpZmYgLS1naXQgYS90YXJnZXRzL2NvcnN0b25lLTMwMC9wbGF0Zm9ybS5sZCBiL3RhcmdldHMvY29yc3RvbmUtMzAwL3BsYXRmb3JtLmxkCi1pbmRleCBlYzU4YWNjLi4yMTMxNmE0IDEwMDY0NAoraW5kZXggZWM1OGFjYy4uNTFjOTNjYSAxMDA2NDQKIC0tLSBhL3RhcmdldHMvY29yc3RvbmUtMzAwL3BsYXRmb3JtLmxkCiArKysgYi90YXJnZXRzL2NvcnN0b25lLTMwMC9wbGF0Zm9ybS5sZAogQEAgLTc1LDcgKzc1LDcgQEAKQEAgLTIyLDYgKzIyLDE1IEBACiAgX19IRUFQX1NJWkUgID0gMHgwMDAwODAwMDsKICAKICBNRU1PUlkKK0BAIC04Myw3ICs4Myw3IEBAIE1FTU9SWQorICAgSVRDTSAgKHJ4KSAgOiBPUklHSU4gPSAweDEwMDAwMDAwLCBMRU5HVEggPSAweDAwMDgwMDAwCisgICBCUkFNICAocncpICA6IE9SSUdJTiA9IDB4MTEwMDAwMDAsIExFTkdUSCA9IDB4MDA0MDAwMDAKKyAgIERUQ00gIChydykgIDogT1JJR0lOID0gMHgzMDAwMDAwMCwgTEVOR1RIID0gMHgwMDA4MDAwMAorLSAgU1JBTSAgKHJ3KSAgOiBPUklHSU4gPSAweDMxMDAwMDAwLCBMRU5HVEggPSAweDAwMjAwMDAwCisrICBTUkFNICAocncpICA6IE9SSUdJTiA9IDB4MzEwMDAwMDAsIExFTkdUSCA9IDB4MDIwMDAwMDAKKyAgIEREUiAgIChyd3gpIDogT1JJR0lOID0gMHg3MDAwMDAwMCwgTEVOR1RIID0gMHg2MDAwMDAwMAorIH0KKyAKIEBAIC0xNTAsOSArMTUwLDYgQEAgU0VDVElPTlMKICAgICAgKihFWENMVURFX0ZJTEUoKmNydGVuZD8ubyAqY3J0ZW5kLm8pIC5kdG9ycykKICAgICAgKihTT1JUKC5kdG9ycy4qKSkKQEAgLTUwLDcgKzU5LDcgQEAKICAgIC5oZWFwIChDT1BZKSA6CiAgICB7CiBkaWZmIC0tZ2l0IGEvdGFyZ2V0cy9jb3JzdG9uZS0zMDAvcGxhdGZvcm0uc2NhdHRlciBiL3RhcmdldHMvY29yc3RvbmUtMzAwL3BsYXRmb3JtLnNjYXR0ZXIKLWluZGV4IGZhYjEyZDEuLmJlNWMyMjcgMTAwNjQ0CitpbmRleCBmYWIxMmQxLi4yMTgwYWNhIDEwMDY0NAogLS0tIGEvdGFyZ2V0cy9jb3JzdG9uZS0zMDAvcGxhdGZvcm0uc2NhdHRlcgogKysrIGIvdGFyZ2V0cy9jb3JzdG9uZS0zMDAvcGxhdGZvcm0uc2NhdHRlcgogQEAgLTEsMyArMSw0IEBACkBAIC02Nyw2ICs3NiwxNSBAQAogICNlbmRpZgogIAogICNpZm5kZWYgSEVBUF9TSVpFCitAQCAtMTA4LDcgKzEwOSw3IEBACisgI2RlZmluZSBEVENNX1NJWkUgIDB4MDAwODAwMDAKKyAKKyAjZGVmaW5lIFNSQU1fU1RBUlQgMHgzMTAwMDAwMAorLSNkZWZpbmUgU1JBTV9TSVpFICAweDAwMjAwMDAwCisrI2RlZmluZSBTUkFNX1NJWkUgIDB4MDIwMDAwMDAKKyAKKyAjZGVmaW5lIEREUl9TVEFSVCAgMHg3MDAwMDAwMAorICNkZWZpbmUgRERSX1NJWkUgICAweDAyMDAwMDAwCiBAQCAtMTM2LDcgKzEzNyw2IEBAIEFQUF9JTUFHRSBMUl9TVEFSVCBMUl9TSVpFCiAgICAgICAgICA7IE1ha2Ugc3VyZSByZXNldF9oYW5kbGVyIGVuZHMgdXAgaW4gcm9vdCBzZWdtZW50LCB3aGVuIHNwbGl0IGFjcm9zcwogICAgICAgICAgOyBJVENNIGFuZCBEVENNCkBAIC0xMTUsNSArMTMzLDUgQEAKICt9CiArI2VuZGlmCiAtLSAKLTIuMTcuMQorMi40Mi4wLnJjMi4yNTMuZ2Q1OWEzYmYyYjQtZ29vZwogCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9ldGhvc191X2NvcmVfcGxhdGZvcm1fZG93bmxvYWQuc2ggYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9ldGhvc191X2NvcmVfcGxhdGZvcm1fZG93bmxvYWQuc2gKaW5kZXggNzYyMjNkYi4uM2ExY2QzMyAxMDA3NTUKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvZXRob3NfdV9jb3JlX3BsYXRmb3JtX2Rvd25sb2FkLnNoCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2V0aG9zX3VfY29yZV9wbGF0Zm9ybV9kb3dubG9hZC5zaApAQCAtMSw1ICsxLDUgQEAKICMhL2Jpbi9iYXNoCi0jIENvcHlyaWdodCAyMDIyIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIENvcHlyaWdodCAyMDI0IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0zMSwxMSArMzEsOCBAQAogCiBzZXQgLWUKIAotU0NSSVBUX0RJUj0iJChjZCAiJChkaXJuYW1lICIke0JBU0hfU09VUkNFWzBdfSIpIiAmJiBwd2QpIgotUk9PVF9ESVI9JHtTQ1JJUFRfRElSfS8uLi8uLi8uLi8uLi8uLgotY2QgIiR7Uk9PVF9ESVJ9IgotCi1zb3VyY2UgdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvYmFzaF9oZWxwZXJzLnNoCitURU5TT1JGTE9XX1JPT1Q9JHsyfQorc291cmNlICR7VEVOU09SRkxPV19ST09UfXRlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2Jhc2hfaGVscGVycy5zaAogCiBET1dOTE9BRFNfRElSPSR7MX0KIGlmIFsgISAtZCAke0RPV05MT0FEU19ESVJ9IF07IHRoZW4KQEAgLTU0LDI0ICs1MSwyMiBAQAogICAgIGV4aXQgMQogICBmaQogCi0gIGdpdCBjbG9uZSBodHRwczovL2dpdC5tbHBsYXRmb3JtLm9yZy9tbC9ldGhvcy11L2V0aG9zLXUtY29yZS1wbGF0Zm9ybS5naXQgJHtET1dOTE9BREVEX0VUSE9TX1VfQ09SRV9QTEFURk9STV9QQVRIfSA+JjIKLSAgY2QgJHtET1dOTE9BREVEX0VUSE9TX1VfQ09SRV9QTEFURk9STV9QQVRIfQorICBnaXQgY2xvbmUgImh0dHBzOi8vcmV2aWV3Lm1scGxhdGZvcm0ub3JnL21sL2V0aG9zLXUvZXRob3MtdS1jb3JlLXBsYXRmb3JtIiAke0RPV05MT0FERURfRVRIT1NfVV9DT1JFX1BMQVRGT1JNX1BBVEh9ID4mMgorICBwdXNoZCAke0RPV05MT0FERURfRVRIT1NfVV9DT1JFX1BMQVRGT1JNX1BBVEh9ID4gL2Rldi9udWxsCiAgIGdpdCBjaGVja291dCBlMjVhODlkZWMxY2Y5OTBmMzE2OGRiZDZjNTY1ZTNiMGQ1MWNiMTUxID4mMgogICBybSAtcmYgLmdpdAogICBjcmVhdGVfZ2l0X3JlcG8gLi8KLQotICBhcHBseV9wYXRjaF90b19mb2xkZXIgLi8gLi4vLi4vaW5jcmVhc2Utc3RhY2stc2l6ZS1hbmQtc3dpdGNoLURUQ00tU1JBTS5wYXRjaCAiVEZMTSBwYXRjaCIKLQotICBjZCAiJHtST09UX0RJUn0iCisgIGFwcGx5X3BhdGNoX3RvX2ZvbGRlciAuLyAuLi8uLi9ldGhvc191X2NvcmVfcGxhdGZvcm0ucGF0Y2ggIlRGTE0gcGF0Y2giCisgIHBvcGQgPiAvZGV2L251bGwKIAogICBMSU5LRVJfUEFUSD0ke0RPV05MT0FERURfRVRIT1NfVV9DT1JFX1BMQVRGT1JNX1BBVEh9L3RhcmdldHMvY29yc3RvbmUtMzAwCiAKICAgIyBSdW4gQyBwcmVwcm9jZXNzb3Igb24gbGlua2VyIGZpbGUgdG8gZ2V0IHJpZCBvZiBpZmRlZnMgYW5kIG1ha2Ugc3VyZSBjb21waWxlciBpcyBkb3dubG9hZGVkIGZpcnN0LgogICBDT01QSUxFUj0ke0RPV05MT0FEU19ESVJ9L2djY19lbWJlZGRlZC9iaW4vYXJtLW5vbmUtZWFiaS1nY2MKICAgaWYgWyAhIC1mICR7Q09NUElMRVJ9IF07IHRoZW4KLSAgICBSRVRVUk5fVkFMVUU9YC4vdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvYXJtX2djY19kb3dubG9hZC5zaCAke0RPV05MT0FEU19ESVJ9YAorICAgIFJFVFVSTl9WQUxVRT1gJHtURU5TT1JGTE9XX1JPT1R9dGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvYXJtX2djY19kb3dubG9hZC5zaCAke0RPV05MT0FEU19ESVJ9ICR7VEVOU09SRkxPV19ST09UfWAKICAgICBpZiBbICJTVUNDRVNTIiAhPSAiJHtSRVRVUk5fVkFMVUV9IiBdOyB0aGVuCi0gICAgICBlY2hvICJUaGUgc2NyaXB0IC4vdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvYXJtX2djY19kb3dubG9hZC5zaCBmYWlsZWQuIgorICAgICAgZWNobyAiVGhlIHNjcmlwdCAke1RFTlNPUkZMT1dfUk9PVH10ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9hcm1fZ2NjX2Rvd25sb2FkLnNoIGZhaWxlZC4iCiAgICAgICBleGl0IDEKICAgICBmaQogICBmaQpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvZXh0X2xpYnMvY21zaXNfbm4uaW5jIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvZXh0X2xpYnMvY21zaXNfbm4uaW5jCmluZGV4IGU5YWU1ZmMuLmE3OGFhNDkgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2V4dF9saWJzL2Ntc2lzX25uLmluYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9leHRfbGlicy9jbXNpc19ubi5pbmMKQEAgLTQzLDcgKzQzLDcgQEAKICMgdGhlIHZhcmlvdXMgaW50cmluaXNpY3MuCiBUSElSRF9QQVJUWV9DQ19IRFJTICs9IFwKICAgJChDTVNJU19QQVRIKS9MSUNFTlNFLnR4dCBcCi0gICQoQ01TSVNfTk5fUEFUSCkvTElDRU5TRS50eHQgXAorICAkKENNU0lTX05OX1BBVEgpL0xJQ0VOU0UgXAogICAkKHdpbGRjYXJkICQoQ01TSVNfUEFUSCkvQ01TSVMvQ29yZS9JbmNsdWRlLyouaCkKIAogIyBXZSBhZGQgLUkkKENNU0lTX1BBVEgpIHRvIGVuYWJsZSB0aGUgY29kZSBpbiB0aGUgVEZMTSByZXBvIChtb3N0bHkgaW4gdGhlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9leHRfbGlicy9jbXNpc19ubl9kb3dubG9hZC5zaCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2V4dF9saWJzL2Ntc2lzX25uX2Rvd25sb2FkLnNoCmluZGV4IGJjOGU4N2IuLmZiMGFkOTIgMTAwNzU1Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2V4dF9saWJzL2Ntc2lzX25uX2Rvd25sb2FkLnNoCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2V4dF9saWJzL2Ntc2lzX25uX2Rvd25sb2FkLnNoCkBAIC0xLDUgKzEsNSBAQAogIyEvYmluL2Jhc2gKLSMgQ29weXJpZ2h0IDIwMjMgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgQ29weXJpZ2h0IDIwMjQgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICMKICMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTM2LDIxICszNiwyMiBAQAogc291cmNlICR7VEVOU09SRkxPV19ST09UfXRlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2Jhc2hfaGVscGVycy5zaAogCiBET1dOTE9BRFNfRElSPSR7MX0KLWlmIFsgISAtZCAke0RPV05MT0FEU19ESVJ9IF07IHRoZW4KLSAgZWNobyAiVGhlIHRvcC1sZXZlbCBkb3dubG9hZHMgZGlyZWN0b3J5OiAke0RPV05MT0FEU19ESVJ9IGRvZXMgbm90IGV4aXN0LiIKLSAgZXhpdCAxCi1maQotCiBET1dOTE9BREVEX0NNU0lTX05OX1BBVEg9JHtET1dOTE9BRFNfRElSfS9jbXNpc19ubgogCi1pZiBbIC1kICR7RE9XTkxPQURFRF9DTVNJU19OTl9QQVRIfSBdOyB0aGVuCitaSVBfUFJFRklYX05OPSIwMWRlZTM4ZTZkNmJmYmJmMjAyZjBjZDQyNWJiZWExNzMxNzQ3ZDUxIgorQ01TSVNfTk5fVVJMPSJodHRwOi8vZ2l0aHViLmNvbS9BUk0tc29mdHdhcmUvQ01TSVMtTk4vYXJjaGl2ZS8ke1pJUF9QUkVGSVhfTk59LnppcCIKK0NNU0lTX05OX01ENT0iZjIwYmU5M2VkZWRmNDJiYjcwNGMxOWY2OTlhMjQzMTMiCisKK3Nob3VsZF9kb3dubG9hZD0kKGNoZWNrX3Nob3VsZF9kb3dubG9hZCAke0RPV05MT0FEU19ESVJ9KQorCitpZiBbWyAke3Nob3VsZF9kb3dubG9hZH0gPT0gIm5vIiBdXTsgdGhlbgorICBzaG93X2Rvd25sb2FkX3VybF9tZDUgJHtDTVNJU19OTl9VUkx9ICR7Q01TSVNfTk5fTUQ1fQorZWxpZiBbICEgLWQgJHtET1dOTE9BRFNfRElSfSBdOyB0aGVuCisgIGVjaG8gIlRoZSB0b3AtbGV2ZWwgZG93bmxvYWRzIGRpcmVjdG9yeTogJHtET1dOTE9BRFNfRElSfSBkb2VzIG5vdCBleGlzdC4iCisgIGV4aXQgMQorZWxpZiBbIC1kICR7RE9XTkxPQURFRF9DTVNJU19OTl9QQVRIfSBdOyB0aGVuCiAgIGVjaG8gPiYyICIke0RPV05MT0FERURfQ01TSVNfTk5fUEFUSH0gYWxyZWFkeSBleGlzdHMsIHNraXBwaW5nIHRoZSBkb3dubG9hZC4iCiBlbHNlCi0KLSAgWklQX1BSRUZJWF9OTj0iZGM2NGU0ODhmNjY1NWFhMjc5MmQyYWNlY2EzMTZjODk2Zjc4YjRkYiIKLSAgQ01TSVNfTk5fVVJMPSJodHRwOi8vZ2l0aHViLmNvbS9BUk0tc29mdHdhcmUvQ01TSVMtTk4vYXJjaGl2ZS8ke1pJUF9QUkVGSVhfTk59LnppcCIKLSAgQ01TSVNfTk5fTUQ1PSI4MGY5Y2YwYmNjMTBhNGFlZmI2NTMxYWU1Mzk0MjA0NCIKLQogICAjIHdnZXQgaXMgbXVjaCBmYXN0ZXIgdGhhbiBnaXQgY2xvbmUgb2YgdGhlIGVudGlyZSByZXBvLiBTbyB3ZSB3Z2V0IGEgc3BlY2lmaWMKICAgIyB2ZXJzaW9uIGFuZCBjYW4gdGhlbiBhcHBseSBhIHBhdGNoLCBhcyBuZWVkZWQuCiAgIHdnZXQgJHtDTVNJU19OTl9VUkx9IC1PIC90bXAvJHtaSVBfUFJFRklYX05OfS56aXAgPiYyCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9leHRfbGlicy9ldGhvc191LmluYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2V4dF9saWJzL2V0aG9zX3UuaW5jCmluZGV4IGM2MWFhZmYuLjczNDQ3Y2QgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2V4dF9saWJzL2V0aG9zX3UuaW5jCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2V4dF9saWJzL2V0aG9zX3UuaW5jCkBAIC0zMCwxMiArMzAsMjIgQEAKIEVUSE9TVV9ERUZBVUxUX0RPV05MT0FEX0RSSVZFUl9QQVRIIDo9ICQoTUFLRUZJTEVfRElSKS9kb3dubG9hZHMvZXRob3NfdV9jb3JlX2RyaXZlcgogRVRIT1NVX0RSSVZFUl9QQVRIIDo9ICQoRVRIT1NVX0RFRkFVTFRfRE9XTkxPQURfRFJJVkVSX1BBVEgpCiBpZmVxICgkKEVUSE9TVV9EUklWRVJfUEFUSCksICQoRVRIT1NVX0RFRkFVTFRfRE9XTkxPQURfRFJJVkVSX1BBVEgpKQotICAkKGNhbGwgJChvciAkKHNoZWxsICQoRE9XTkxPQURfU0NSSVBUKSAkKEVUSE9TVV9VUkwpICQoRVRIT1NVX01ENSkgJChFVEhPU1VfRFJJVkVSX1BBVEgpID4mMiAmJiBlY2hvIFNVQ0NFU1MpLCAkKGVycm9yICQoRE9XTkxPQURfU0NSSVBUKSBmYWlsZWQpKSkKK0RPV05MT0FEX1JFU1VMVCA6PSAkKHNoZWxsICQoTUFLRUZJTEVfRElSKS9ldGhvc191X2NvcmVfZHJpdmVyX2Rvd25sb2FkLnNoICQoRE9XTkxPQURTX0RJUikgJChURU5TT1JGTE9XX1JPT1QpKQorICBpZm5lcSAoJChET1dOTE9BRF9SRVNVTFQpLCBTVUNDRVNTKQorICAgICQoZXJyb3IgJChET1dOTE9BRF9TQ1JJUFQpIGZhaWxlZCkKKyAgZW5kaWYKIGVuZGlmCiAKIFRISVJEX1BBUlRZX0NDX0hEUlMgKz0gJChzaGVsbCBmaW5kICQoRVRIT1NVX0RSSVZFUl9QQVRIKS9pbmNsdWRlIC1uYW1lICIqLmgiKQogaWZlcSAoLCQoRVRIT1NVX0RSSVZFUl9MSUJTKSkKLSAgICBUSElSRF9QQVJUWV9DQ19TUkNTICs9ICQoc2hlbGwgZmluZCAkKEVUSE9TVV9EUklWRVJfUEFUSCkvc3JjIC1uYW1lICIqLmMiKQorICAgIFRISVJEX1BBUlRZX0NDX1NSQ1MgKz0gJChFVEhPU1VfRFJJVkVSX1BBVEgpL3NyYy9ldGhvc3VfcG11LmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJChFVEhPU1VfRFJJVkVSX1BBVEgpL3NyYy9ldGhvc3VfZHJpdmVyLmMKKyAgICAjIEFkZCB0aGUgRXRob3MtVSBkZXZpY2Utc3BlY2lmaWMgZHJpdmVyIHNvdXJjZS4KKyAgICBpZmVxICgkKEVUSE9TVV9BUkNIKSwgdTg1KQorICAgICAgVEhJUkRfUEFSVFlfQ0NfU1JDUyArPSAkKEVUSE9TVV9EUklWRVJfUEFUSCkvc3JjL2V0aG9zdV9kZXZpY2VfdTg1LmMKKyAgICBlbHNlCisgICAgICBUSElSRF9QQVJUWV9DQ19TUkNTICs9ICQoRVRIT1NVX0RSSVZFUl9QQVRIKS9zcmMvZXRob3N1X2RldmljZV91NTVfdTY1LmMKKyAgICBlbmRpZgogZWxzZQogICAgIE1JQ1JPTElURV9MSUJTICs9ICQoRVRIT1NVX0RSSVZFUl9MSUJTKQogZW5kaWYKQEAgLTY3LDggKzc3LDggQEAKIGVsc2UKICAgJChlcnJvciAiRVRIT1NVX0FSQ0g9JChFVEhPU1VfQVJDSCkgaXMgbm90IHN1cHBvcnRlZCIpCiBlbmRpZgotQ0NGTEFHUyArPSAke0VUSE9TVV9GTEFHU30KLUNYWEZMQUdTICs9ICR7RVRIT1NVX0ZMQUdTfQorQ0NGTEFHUyArPSAke0VUSE9TVV9GTEFHU30gJHtFVEhPU1VfRVhUUkFfRkxBR1N9CitDWFhGTEFHUyArPSAke0VUSE9TVV9GTEFHU30gJHtFVEhPU1VfRVhUUkFfRkxBR1N9CiAKICMgQ29udmVydCBkb3dubG9hZGVkIHBlcnNvbiBkZXRlY3QgaW50OCBtb2RlbC4KICQoR0VORVJBVEVEX1NSQ1NfRElSKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9tb2RlbHMvcGVyc29uX2RldGVjdF9tb2RlbF9kYXRhX3ZlbGEuY2M6CmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9leHRfbGlicy9uZHNwbGliLWhpZmkzLnBhdGNoIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvZXh0X2xpYnMvbmRzcGxpYi1oaWZpMy5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjE2Y2UyCi0tLSAvZGV2L251bGwKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvZXh0X2xpYnMvbmRzcGxpYi1oaWZpMy5wYXRjaApAQCAtMCwwICsxLDE0MCBAQAorZGlmZiAtLWdpdCBhL2xpYnJhcnkvaW5jbHVkZS9OYXR1cmVEU1BfU2lnbmFsX21hdGguaCBiL2xpYnJhcnkvaW5jbHVkZS9OYXR1cmVEU1BfU2lnbmFsX21hdGguaAoraW5kZXggMmZmZWE2My4uYWRmMDhhYiAxMDA2NDQKKy0tLSBhL2xpYnJhcnkvaW5jbHVkZS9OYXR1cmVEU1BfU2lnbmFsX21hdGguaAorKysrIGIvbGlicmFyeS9pbmNsdWRlL05hdHVyZURTUF9TaWduYWxfbWF0aC5oCitAQCAtMzgsNyArMzgsNyBAQCBleHRlcm4gIkMiIHsKKyAgIHZlY19sb2cgICAgICAgICAgICAgIExvZ2FyaXRobSANCisgICB2ZWNfYW50aWxvZyAgICAgICAgICBBbnRpbG9nYXJpdGhtICAgICAgICAgDQorICAgdmVjX3NxcnQgICAgICAgICAgICAgU3F1YXJlIFJvb3QNCistICB2ZWNfcnNxcnQJICAgICAgICAgICBSZWNpcHJvY2FsIFNxdWFyZSBSb290DQorKyAgdmVjX3JzcXJ0ICAgICAgICAgICAgUmVjaXByb2NhbCBTcXVhcmUgUm9vdA0KKyAgIHZlY19zaW5lLHZlY19jb3NpbmUgIFNpbmUvQ29zaW5lDQorICAgdmVjX3RhbiAgICAgICAgICAgICAgVGFuZ2VudCANCisgICB2ZWNfYXRhbiAgICAgICAgICAgICBBcmN0YW5nZW50IA0KK0BAIC0zODQsOSArMzg0LDkgQEAgaW50MzJfdCBzY2xfc3FydDY0eDMyKGludDY0X3QgeCk7CisgICBwYXJ0IGxlZnQgYnkgZXhwb25lbnQgdmFsdWUuDQorIA0KKyAgIE1hbnRpc3NhIGFjY3VyYWN5IGlzIDEgTFNCLCBzbyByZWxhdGl2ZSBhY2N1cmFjeSBpczoNCistICB2ZWNfcnNxcnQxNngxNiwgc2NsX3JzcXJ0MTZ4MTYJNi4yZS01DQorLSAgc2NsX3JzcXJ0MzJ4MzIJICAgICAgICAgICAgICAgIDIuNGUtNw0KKy0gIHZlY19yc3FydDMyeDMyCSAgICAgICAgICAgICAgICA5LjJlLTEwDQorKyAgdmVjX3JzcXJ0MTZ4MTYsIHNjbF9yc3FydDE2eDE2ICA2LjJlLTUNCisrICBzY2xfcnNxcnQzMngzMiAgICAgICAgICAgICAgICAgIDIuNGUtNw0KKysgIHZlY19yc3FydDMyeDMyICAgICAgICAgICAgICAgICAgOS4yZS0xMA0KKyANCisgICBQcmVjaXNpb246IA0KKyAgIDE2eDE2ICAxNi1iaXQgaW5wdXRzLCAxNi1iaXQgb3V0cHV0LiBBY2N1cmFjeTogMkxTQg0KK0BAIC00MDYsMTEgKzQwNiwxMSBAQCBpbnQzMl90IHNjbF9zcXJ0NjR4MzIoaW50NjRfdCB4KTsKKyAgIC0tLS0tLS0tLS0tLS0tLS0NCisgICBSZXR1cm5lZCBwYWNrZWQgdmFsdWU6IA0KKyAgIHNjbF9yc3FydDMyeDMyKCk6DQorLSAgYml0cyAyM4UwIGZyYWN0aW9uYWwgcGFydA0KKy0gIGJpdHMgMzGFMjQgZXhwb25lbnQNCisrICBiaXRzIDIz77+9MCBmcmFjdGlvbmFsIHBhcnQNCisrICBiaXRzIDMx77+9MjQgZXhwb25lbnQNCisgICBzY2xfcnNxcnQxNngxNigpOg0KKy0gIGJpdHMgMTWFMCBmcmFjdGlvbmFsIHBhcnQNCistICBiaXRzIDMxhTE2IGV4cG9uZW50DQorKyAgYml0cyAxNe+/vTAgZnJhY3Rpb25hbCBwYXJ0DQorKyAgYml0cyAzMe+/vTE2IGV4cG9uZW50DQorIA0KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisgdm9pZCB2ZWNfcnNxcnQzMngzMiAoIGludDMyX3QgKiBmcmFjLCBpbnQxNl90ICogZXhwLCBjb25zdCBpbnQzMl90ICogeCwgaW50IE4pOw0KK0BAIC02MzUsNiArNjM1LDcgQEAgZmxvYXQzMl90IHNjbF9hdGFuMmYgKGZsb2F0MzJfdCB5LCBmbG9hdDMyX3QgeCk7CisgICByZXR1cm4gcmVzdWx0LCBRMTYuMTUgDQorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KKyB2b2lkIHZlY190YW5oMzJ4MzIoaW50MzJfdCAqIHksIGNvbnN0IGludDMyX3QgKiB4LCBpbnQgTik7DQorK3ZvaWQgdmVjX3RhbmhmICAgIChmbG9hdDMyX3QgKiB5LCBjb25zdCBmbG9hdDMyX3QgKiB4LGludCBOKTsNCisgaW50MzJfdCBzY2xfdGFuaDMyeDMyKGludDMyX3QgeCk7DQorIA0KKyAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCitAQCAtNjU5LDcgKzY2MCwxMiBAQCBpbnQzMl90IHNjbF90YW5oMzJ4MzIoaW50MzJfdCB4KTsKKyAgIHJldHVybiByZXN1bHQsIFExNi4xNQ0KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisgdm9pZCB2ZWNfc2lnbW9pZDMyeDMyKGludDMyX3QgKiB5LCBjb25zdCBpbnQzMl90ICogeCwgaW50IE4pOw0KKyt2b2lkIHZlY19zaWdtb2lkZiAgICAoZmxvYXQzMl90ICogeSwgY29uc3QgZmxvYXQzMl90ICogeCwgaW50IE4pOw0KKyBpbnQzMl90IHNjbF9zaWdtb2lkMzJ4MzIoaW50MzJfdCB4KTsNCisrZmxvYXQzMl90IHNjbF9zaWdtb2lkZihmbG9hdDMyX3QgeCk7DQorKw0KKyt2b2lkIHZlY19yZWx1MzJ4MzIgKGludDMyX3QgICAqIHksIGNvbnN0IGludDMyX3QgICAqIHgsIGludDMyX3QgICBLLCBpbnQgTik7DQorK3ZvaWQgdmVjX3JlbHVmICAgICAoZmxvYXQzMl90ICogeSwgY29uc3QgZmxvYXQzMl90ICogeCwgZmxvYXQzMl90IEssIGludCBOKTsNCisgDQorIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyAgIFNvZnRtYXgNCitAQCAtNjg1LDYgKzY5MSw3IEBAIGludDMyX3Qgc2NsX3NpZ21vaWQzMngzMihpbnQzMl90IHgpOworIA0KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCisgdm9pZCB2ZWNfc29mdG1heDMyeDMyKGludDMyX3QgKiB5LCBjb25zdCBpbnQzMl90ICogeCwgaW50IE4pOw0KKyt2b2lkIHZlY19zb2Z0bWF4ZiAgICAoZmxvYXQzMl90ICogeSwgY29uc3QgZmxvYXQzMl90ICogeCxpbnQgTik7DQorIA0KKyAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisgICBJbnRlZ2VyIHRvIGZsb2F0IGNvbnZlcnNpb24NCitkaWZmIC0tZ2l0IGEvbGlicmFyeS9pbmNsdWRlL05hdHVyZURTUF90eXBlcy5oIGIvbGlicmFyeS9pbmNsdWRlL05hdHVyZURTUF90eXBlcy5oCitpbmRleCBhMzhiMzM0Li42MzIyODUyIDEwMDY0NAorLS0tIGEvbGlicmFyeS9pbmNsdWRlL05hdHVyZURTUF90eXBlcy5oCisrKysgYi9saWJyYXJ5L2luY2x1ZGUvTmF0dXJlRFNQX3R5cGVzLmgKK0BAIC0zMzIsNyArMzMyLDkgQEAgdHlwZWRlZiBzdHJ1Y3QgdGFnQ29tcGxleDMyX3QKKyAgICNkZWZpbmUgTkFTU0VSVCh4KSANCisgICAjZGVmaW5lIHJlc3RyaWN0IA0KKyAjZWxpZiBkZWZpbmVkIChDT01QSUxFUl9YVEVOU0EpDQorKyNpZiAhZGVmaW5lZCByZXN0cmljdA0KKyAgICNkZWZpbmUgcmVzdHJpY3QgX19yZXN0cmljdA0KKysjZW5kaWYNCisgICAjZGVmaW5lIG9uY2hpcA0KKyAgICNkZWZpbmUgTkFTU0VSVCh4KSB7KHZvaWQpX19idWlsdGluX2V4cGVjdCgoeCkhPTAsMSk7fQ0KKyAjZWxzZQ0KK2RpZmYgLS1naXQgYS9saWJyYXJ5L2luY2x1ZGVfcHJpdmF0ZS9jb21tb24uaCBiL2xpYnJhcnkvaW5jbHVkZV9wcml2YXRlL2NvbW1vbi5oCitpbmRleCAyMDIwNmU0Li43NGQ0ZDQyIDEwMDY0NAorLS0tIGEvbGlicmFyeS9pbmNsdWRlX3ByaXZhdGUvY29tbW9uLmgKKysrKyBiL2xpYnJhcnkvaW5jbHVkZV9wcml2YXRlL2NvbW1vbi5oCitAQCAtMTU3LDYgKzE1NywxMiBAQCBfX3ByYWdtYSAod2FybmluZyhwb3ApKQorIF9fYXNtX18oIi50eXBlICIjbmFtZSIsIEBvYmplY3Rcblx0Lmdsb2JhbCAiI25hbWUiXG5cdC5hbGlnbiA0XG5cdCIjbmFtZSI6XG5cdC5sb25nIDB4NDk0MzhCOTYsMHg0RDczRjE5MlxuXHQiKTsNCisgI2VuZGlmDQorIA0KKysjaWYgZGVmaW5lZChDT01QSUxFUl9YVEVOU0EpDQorKyNkZWZpbmUgRElTQ0FSRF9GVU5fRk9SX05PTlZPSURfUkVUVVJOKHJldHZhbF90eXBlLG5hbWUsYXJnbGlzdCkgXA0KKytfX2F0dHJpYnV0ZV9fICgoc2VjdGlvbiAoIi9ESVNDQVJELyIpKSkgXA0KKytyZXR2YWxfdHlwZSBuYW1lIGFyZ2xpc3QgXA0KKyt7IHJldHVybiAocmV0dmFsX3R5cGUpIDA7IH0NCisrI2VuZGlmDQorIA0KKyAjaWZkZWYgX19jcGx1c3BsdXMNCisgI2RlZmluZSBleHRlcm5DIGV4dGVybiAiQyIgDQorZGlmZiAtLWdpdCBhL2xpYnJhcnkvaW5jbHVkZV9wcml2YXRlL2ZmdF9yZWFsX3R3aWRkbGVzLmggYi9saWJyYXJ5L2luY2x1ZGVfcHJpdmF0ZS9mZnRfcmVhbF90d2lkZGxlcy5oCitvbGQgbW9kZSAxMDA2NDQKK25ldyBtb2RlIDEwMDc1NQoraW5kZXggMTBjZDRiMi4uNmY1YzgwYgorLS0tIGEvbGlicmFyeS9pbmNsdWRlX3ByaXZhdGUvZmZ0X3JlYWxfdHdpZGRsZXMuaAorKysrIGIvbGlicmFyeS9pbmNsdWRlX3ByaXZhdGUvZmZ0X3JlYWxfdHdpZGRsZXMuaAorQEAgLTQ0LDggKzQ0LDEyIEBACisgICAgICA3ICAgICAgICAgICAgICAgMTI4DQorICovDQorIA0KKysjaWYgIWRlZmluZWQgTUFYX1JGRlRfUFdSDQorICNkZWZpbmUgTUFYX1JGRlRfUFdSIDEzDQorKyNlbmRpZg0KKysjaWYgIWRlZmluZWQgTUFYX1JGRlRfTEVODQorICNkZWZpbmUgTUFYX1JGRlRfTEVOICgxPDxNQVhfUkZGVF9QV1IpDQorKyNlbmRpZg0KKyANCisgZXh0ZXJuIGNvbnN0IGludDE2X3QgdHdpZGRsZVNwbGl0W01BWF9SRkZUX0xFTi8yXTsNCisgDQorZGlmZiAtLWdpdCBhL2xpYnJhcnkvaW5jbHVkZV9wcml2YXRlL2ZmdF9yZWFsX3R3aWRkbGVzXzI0eDI0LmggYi9saWJyYXJ5L2luY2x1ZGVfcHJpdmF0ZS9mZnRfcmVhbF90d2lkZGxlc18yNHgyNC5oCitvbGQgbW9kZSAxMDA2NDQKK25ldyBtb2RlIDEwMDc1NQoraW5kZXggMzAxN2M2MS4uMjU3Mzk2ZQorLS0tIGEvbGlicmFyeS9pbmNsdWRlX3ByaXZhdGUvZmZ0X3JlYWxfdHdpZGRsZXNfMjR4MjQuaAorKysrIGIvbGlicmFyeS9pbmNsdWRlX3ByaXZhdGUvZmZ0X3JlYWxfdHdpZGRsZXNfMjR4MjQuaAorQEAgLTQ0LDggKzQ0LDEyIEBACisgICAgICA3ICAgICAgICAgICAgICAgMTI4DQorICovDQorIA0KKysjaWYgIWRlZmluZWQgTUFYX1JGRlRfUFdSDQorICNkZWZpbmUgTUFYX1JGRlRfUFdSIDEzDQorKyNlbmRpZg0KKysjaWYgIWRlZmluZWQgTUFYX1JGRlRfTEVODQorICNkZWZpbmUgTUFYX1JGRlRfTEVOICgxPDxNQVhfUkZGVF9QV1IpDQorKyNlbmRpZg0KKyANCisgZXh0ZXJuIGNvbnN0IGludDMyX3QgdHdpZGRsZVNwbGl0MjR4MjRbTUFYX1JGRlRfTEVOLzJdOw0KKyANCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9leHRfbGlicy9uZHNwbGliLWhpZmk0LnBhdGNoIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvZXh0X2xpYnMvbmRzcGxpYi1oaWZpNC5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGExYjNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvZXh0X2xpYnMvbmRzcGxpYi1oaWZpNC5wYXRjaApAQCAtMCwwICsxLDQyIEBACitkaWZmIC0tZ2l0IGEvbGlicmFyeS9mZnQvZmZ0L2ZmdF9yZWFsMjR4MjRfaGlmaTQuYyBiL2xpYnJhcnkvZmZ0L2ZmdC9mZnRfcmVhbDI0eDI0X2hpZmk0LmMKK2luZGV4IDgyZjQ4ZTIuLmJkY2U1OWUgMTAwNjQ0CistLS0gYS9saWJyYXJ5L2ZmdC9mZnQvZmZ0X3JlYWwyNHgyNF9oaWZpNC5jCisrKysgYi9saWJyYXJ5L2ZmdC9mZnQvZmZ0X3JlYWwyNHgyNF9oaWZpNC5jCitAQCAtNzgsNyArNzgsNyBAQAorICAgeCx5ICAgICAgICAgICBzaG91bGQgbm90IG92ZXJsYXAKKyAgIHgseSAgICAgICAgICAgYWxpZ25lZCBvbiBhIDgtYnl0ZXMgYm91bmRhcnkKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy1ESVNDQVJEX0ZVTiggaW50LAorK0RJU0NBUkRfRlVOX0ZPUl9OT05WT0lEX1JFVFVSTiggaW50LAorICAgICAgICAgICAgICBmZnRfcmVhbDI0eDI0LAorICAgICAgICAgICAgICAoZjI0KiB5LAorICAgICAgICAgICAgICAgaW50MzJfdCogeCwKK2RpZmYgLS1naXQgYS9saWJyYXJ5L2luY2x1ZGUvTmF0dXJlRFNQX3R5cGVzLmggYi9saWJyYXJ5L2luY2x1ZGUvTmF0dXJlRFNQX3R5cGVzLmgKK2luZGV4IDAwNjkzNjEuLmMwZjQxMWYgMTAwNjQ0CistLS0gYS9saWJyYXJ5L2luY2x1ZGUvTmF0dXJlRFNQX3R5cGVzLmgKKysrKyBiL2xpYnJhcnkvaW5jbHVkZS9OYXR1cmVEU1BfdHlwZXMuaAorQEAgLTMzMiw3ICszMzIsOSBAQCB0eXBlZGVmIHN0cnVjdCB0YWdDb21wbGV4MzJfdAorICAgI2RlZmluZSBOQVNTRVJUKHgpIAorICAgI2RlZmluZSByZXN0cmljdCAKKyAjZWxpZiBkZWZpbmVkIChDT01QSUxFUl9YVEVOU0EpCisrI2lmICFkZWZpbmVkIHJlc3RyaWN0CisgICAjZGVmaW5lIHJlc3RyaWN0IF9fcmVzdHJpY3QKKysjZW5kaWYKKyAgICNkZWZpbmUgb25jaGlwCisgICAjZGVmaW5lIE5BU1NFUlQoeCkgeyh2b2lkKV9fYnVpbHRpbl9leHBlY3QoKHgpIT0wLDEpO30KKyAjZWxzZQorZGlmZiAtLWdpdCBhL2xpYnJhcnkvaW5jbHVkZV9wcml2YXRlL2NvbW1vbi5oIGIvbGlicmFyeS9pbmNsdWRlX3ByaXZhdGUvY29tbW9uLmgKK2luZGV4IGQ2NDdhZjQuLjI1ZDBjYTggMTAwNjQ0CistLS0gYS9saWJyYXJ5L2luY2x1ZGVfcHJpdmF0ZS9jb21tb24uaAorKysrIGIvbGlicmFyeS9pbmNsdWRlX3ByaXZhdGUvY29tbW9uLmgKK0BAIC0xODcsNiArMTg3LDEwIEBAIEZfVU5ERVJTQ09SRSBTVFJJTkdJWkUobmFtZSkgIjpcbiIgICAgICAgICAgXAorIF9fYXR0cmlidXRlX18gKChzZWN0aW9uICgiL0RJU0NBUkQvIikpKSBcCisgcmV0dmFsX3R5cGUgbmFtZSBhcmdsaXN0IFwKKyB7ICB9CisrI2RlZmluZSBESVNDQVJEX0ZVTl9GT1JfTk9OVk9JRF9SRVRVUk4ocmV0dmFsX3R5cGUsbmFtZSxhcmdsaXN0KSBcCisrX19hdHRyaWJ1dGVfXyAoKHNlY3Rpb24gKCIvRElTQ0FSRC8iKSkpIFwKKytyZXR2YWxfdHlwZSBuYW1lIGFyZ2xpc3QgXAorK3sgcmV0dXJuIChyZXR2YWxfdHlwZSkgMDsgfQorICNlbmRpZgorIAorICNpZmRlZiBfX2NwbHVzcGx1cwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvZXh0X2xpYnMvbmRzcGxpYi1oaWZpNS5wYXRjaCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2V4dF9saWJzL25kc3BsaWItaGlmaTUucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4ODQ1YwotLS0gL2Rldi9udWxsCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2V4dF9saWJzL25kc3BsaWItaGlmaTUucGF0Y2gKQEAgLTAsMCArMSwzMSBAQAorZGlmZiAtLWdpdCBhL2xpYnJhcnkvaW5jbHVkZS9OYXR1cmVEU1BfdHlwZXMuaCBiL2xpYnJhcnkvaW5jbHVkZS9OYXR1cmVEU1BfdHlwZXMuaAoraW5kZXggODJlMTZjNy4uY2U3ZmI3NSAxMDA2NDQKKy0tLSBhL2xpYnJhcnkvaW5jbHVkZS9OYXR1cmVEU1BfdHlwZXMuaAorKysrIGIvbGlicmFyeS9pbmNsdWRlL05hdHVyZURTUF90eXBlcy5oCitAQCAtMzMyLDcgKzMzMiw5IEBAIHR5cGVkZWYgc3RydWN0IHRhZ0NvbXBsZXgzMl90CisgICAjZGVmaW5lIE5BU1NFUlQoeCkgCisgICAjZGVmaW5lIHJlc3RyaWN0IAorICNlbGlmIGRlZmluZWQgKENPTVBJTEVSX1hURU5TQSkKKysjaWYgIWRlZmluZWQgcmVzdHJpY3QKKyAgICNkZWZpbmUgcmVzdHJpY3QgX19yZXN0cmljdAorKyNlbmRpZgorICAgI2RlZmluZSBvbmNoaXAKKyAgICNkZWZpbmUgTkFTU0VSVCh4KSB7KHZvaWQpX19idWlsdGluX2V4cGVjdCgoeCkhPTAsMSk7fQorICNlbHNlCitkaWZmIC0tZ2l0IGEvbGlicmFyeS9pbmNsdWRlX3ByaXZhdGUvY29tbW9uLmggYi9saWJyYXJ5L2luY2x1ZGVfcHJpdmF0ZS9jb21tb24uaAoraW5kZXggMmVhZjcwZi4uOWRmODExYyAxMDA2NDQKKy0tLSBhL2xpYnJhcnkvaW5jbHVkZV9wcml2YXRlL2NvbW1vbi5oCisrKysgYi9saWJyYXJ5L2luY2x1ZGVfcHJpdmF0ZS9jb21tb24uaAorQEAgLTE3Miw2ICsxNzIsMTIgQEAgX19wcmFnbWEgKHdhcm5pbmcocG9wKSkKKyAjaWYgZGVmaW5lZChDT01QSUxFUl9YVEVOU0EpIHx8IGRlZmluZWQoQ09NUElMRVJfR05VKQorICNkZWZpbmUgRElTQ0FSRF9GVU4ocmV0dmFsX3R5cGUsbmFtZSxhcmdsaXN0KSBcCisgX19hc21fXygiLnR5cGUgIiNuYW1lIiwgQG9iamVjdFxuXHQuZ2xvYmFsICIjbmFtZSJcblx0LmFsaWduIDRcblx0IiNuYW1lIjpcblx0LmxvbmcgMHg0OTQzOEI5NiwweDRENzNGMTkyXG5cdCIpOworKworKyNkZWZpbmUgRElTQ0FSRF9GVU5fRk9SX05PTlZPSURfUkVUVVJOKHJldHZhbF90eXBlLG5hbWUsYXJnbGlzdCkgXAorK19fYXR0cmlidXRlX18gKChzZWN0aW9uICgiL0RJU0NBUkQvIikpKSBcCisrcmV0dmFsX3R5cGUgbmFtZSBhcmdsaXN0IFwKKyt7IHJldHVybiAocmV0dmFsX3R5cGUpIDA7IH0KKysKKyAjZW5kaWYKKyAKKyAvKi0tLS0tLSBMSVNUIE9GIERFRklORVMgREVQRU5ESU5HIE9OIElTQSBPUFRJT05TIC0tLS0tLSovCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9leHRfbGlicy9wZXJzb25fZGV0ZWN0aW9uX2ludDhfdmVsYV9jb252ZXJ0LnNoIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvZXh0X2xpYnMvcGVyc29uX2RldGVjdGlvbl9pbnQ4X3ZlbGFfY29udmVydC5zaAppbmRleCBkYTUxZDc1Li5iM2ZlMjRlIDEwMDc1NQotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9leHRfbGlicy9wZXJzb25fZGV0ZWN0aW9uX2ludDhfdmVsYV9jb252ZXJ0LnNoCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2V4dF9saWJzL3BlcnNvbl9kZXRlY3Rpb25faW50OF92ZWxhX2NvbnZlcnQuc2gKQEAgLTEsNSArMSw1IEBACiAjIS9iaW4vYmFzaAotIyBDb3B5cmlnaHQgMjAyMiBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBDb3B5cmlnaHQgMjAyNCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtNDcsMTggKzQ3LDMwIEBACiAjIFNlZSB0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy9ldGhvc191L1JFQURNRS5tZCBmb3IgbW9yZSBpbmZvLgogTU9ERUxfRElSPSR7R0VORVJBVEVEX1NSQ1NfRElSfXRlbnNvcmZsb3cvbGl0ZS9taWNyby9tb2RlbHMKIENPTlZFUlRFRF9QRVJTT05fTU9ERUxfSU5UOD0ke01PREVMX0RJUn0vcGVyc29uX2RldGVjdF9tb2RlbF9kYXRhX3ZlbGEuY2MKK1BFUlNPTl9NT0RFTF9IRUFERVI9JHtNT0RFTF9ESVJ9L3BlcnNvbl9kZXRlY3RfbW9kZWxfZGF0YS5oCiAKIGlmIFsgISAtZiAke0NPTlZFUlRFRF9QRVJTT05fTU9ERUxfSU5UOH0gXTsgdGhlbgorCisgICMgSW5zdGFsbCBldGhvcy11LXZlbGEgaWYgbm90IGFscmVhZHkgaW5zdGFsbGVkLgorICBzZXQgK2UKKyAgcGlwIHNob3cgZXRob3MtdS12ZWxhID4mMgorICByZXRWYWw9JD8KKyAgc2V0IC1lCisgIGlmIFsgJHJldFZhbCAtbmUgMCBdOyB0aGVuCisgICAgVEVNUEZJTEU9JChta3RlbXAgLWQpLworICAgIHB5dGhvbjMgLW0gdmVudiAkVEVNUEZJTEUKKyAgICBzb3VyY2UgJFRFTVBGSUxFL2Jpbi9hY3RpdmF0ZQorICAgIHBpcCBpbnN0YWxsIG51bXB5PT0xLjI2LjQgPiYyCisgICAgcGlwIGluc3RhbGwgLS1wcmVmZXItYmluYXJ5IGV0aG9zLXUtdmVsYSA+JjIKKyAgZmkKKwogICAjIENvbXBpbGUgYW4gb3B0aW1pemVkIC50ZmxpdGUgdmVyc2lvbiBmb3IgRXRob3MtVS4KLSAgVEVNUEZJTEU9JChta3RlbXAgLWQpLwotICBweXRob24zIC1tIHZlbnYgJFRFTVBGSUxFCi0gIHNvdXJjZSAkVEVNUEZJTEUvYmluL2FjdGl2YXRlCi0gIHB5dGhvbjMgLW0gcGlwIGluc3RhbGwgLS11cGdyYWRlIHBpcCA+JjIKLSAgcGlwIGluc3RhbGwgLS11cGdyYWRlIGN5dGhvbiA+JjIKLSAgcGlwIGluc3RhbGwgLS1wcmVmZXItYmluYXJ5IGV0aG9zLXUtdmVsYSA+JjIKICAgdmVsYSAtLWFjY2VsZXJhdG9yLWNvbmZpZz1ldGhvcy11NTUtMjU2ICR7RE9XTkxPQURTX0RJUn0vLi4vLi4vLi4vbW9kZWxzL3BlcnNvbl9kZXRlY3QudGZsaXRlIFwKICAgICAgICAtLW91dHB1dC1kaXIgJHtNT0RFTF9ESVJ9ID4mMgotICBkZWFjdGl2YXRlCisKKyAgaWYgWyAkcmV0VmFsIC1uZSAwIF07IHRoZW4KKyAgICBkZWFjdGl2YXRlCisgIGZpCiAKICAgIyBDb252ZXJ0IC50ZmxpdGUgYmFjayB0byBDIGFycmF5LgogICBlY2hvICIvLyBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5ICQwLiIgPiAke0NPTlZFUlRFRF9QRVJTT05fTU9ERUxfSU5UOH0KQEAgLTY2LDExICs3OCwxMiBAQAogICAgICAgICR7Q09OVkVSVEVEX1BFUlNPTl9NT0RFTF9JTlQ4fQogICBlY2hvIC1uICJjb25zdCAiID4+ICR7Q09OVkVSVEVEX1BFUlNPTl9NT0RFTF9JTlQ4fQogICB4eGQgLWkgJHtNT0RFTF9ESVJ9L3BlcnNvbl9kZXRlY3RfdmVsYS50ZmxpdGUgPj4gJHtDT05WRVJURURfUEVSU09OX01PREVMX0lOVDh9Ci0gIHNlZCAtaSAncy9nZW5fY29ydGV4X21fY29yc3RvbmVfMzAwX2NvcnRleF9tNTVfZGVmYXVsdF9nZW5maWxlc190ZW5zb3JmbG93X2xpdGVfbWljcm9fbW9kZWxzX3BlcnNvbl9kZXRlY3RfdmVsYV90ZmxpdGUvZ19wZXJzb25fZGV0ZWN0X21vZGVsX2RhdGEvJyBcCisgIHNlZCAgLWkgJ3MvZ2VuX2NvcnRleF9tX2NvcnN0b25lXzMwMF9jb3J0ZXhfbTU1Xy4qZ2VuZmlsZXNfdGVuc29yZmxvd19saXRlX21pY3JvX21vZGVsc19wZXJzb25fZGV0ZWN0X3ZlbGFfdGZsaXRlL2dfcGVyc29uX2RldGVjdF9tb2RlbF9kYXRhLycgXAogICAgICAgJHtDT05WRVJURURfUEVSU09OX01PREVMX0lOVDh9Ci0gIHNlZCAtaSAncy9eY29uc3QgdW5zaWduZWQgY2hhciBnX3BlcnNvbl9kZXRlY3RfbW9kZWxfZGF0YS9hbGlnbmFzXCgxNlwpICYvJyAgJHtDT05WRVJURURfUEVSU09OX01PREVMX0lOVDh9Ci0gIHNlZCAtaSAncy9nX3BlcnNvbl9kZXRlY3RfbW9kZWxfZGF0YV9sZW4vZ19wZXJzb25fZGV0ZWN0X21vZGVsX2RhdGFfc2l6ZS8nICAke0NPTlZFUlRFRF9QRVJTT05fTU9ERUxfSU5UOH0KLSAgc2VkIC1pICdzL3Vuc2lnbmVkIGludC9jb25zdCB1bnNpZ25lZCBpbnQvJyAke0NPTlZFUlRFRF9QRVJTT05fTU9ERUxfSU5UOH0KKyAgc2VkIC1pICdzL15jb25zdCB1bnNpZ25lZCBjaGFyIGdfcGVyc29uX2RldGVjdF9tb2RlbF9kYXRhL2FsaWduYXNcKDE2XCkgJi8nICR7Q09OVkVSVEVEX1BFUlNPTl9NT0RFTF9JTlQ4fQorICBTSVpFPSQoc2VkIC1FIC1uIC1lICdzL14uKmdfcGVyc29uX2RldGVjdF9tb2RlbF9kYXRhX2xlbiA9IChbMC05XSspOy9cMS9wJyAke0NPTlZFUlRFRF9QRVJTT05fTU9ERUxfSU5UOH0pCisgIHNlZCAtaSAncy9eLipnX3BlcnNvbl9kZXRlY3RfbW9kZWxfZGF0YV9sZW4uKiQvLycgJHtDT05WRVJURURfUEVSU09OX01PREVMX0lOVDh9CisgIHNlZCAtRSAtaSAicy8oXmNvbnN0ZXhwci4qZ19wZXJzb25fZGV0ZWN0X21vZGVsX2RhdGFfc2l6ZSA9ICkoWzAtOV0rKTsvXDEkU0laRTsvIiAke1BFUlNPTl9NT0RFTF9IRUFERVJ9CiBmaQogCiBlY2hvICJTVUNDRVNTIgpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvZXh0X2xpYnMveGFfbm5saWJfaGlmaTQucGF0Y2ggYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9leHRfbGlicy94YV9ubmxpYl9oaWZpNC5wYXRjaAppbmRleCAyMjdlZTkyLi4xYmIxNWFhIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9leHRfbGlicy94YV9ubmxpYl9oaWZpNC5wYXRjaAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9leHRfbGlicy94YV9ubmxpYl9oaWZpNC5wYXRjaApAQCAtMSwyMDcgKzEsNSBAQAotRnJvbSAwYTY4ZjJmZmE2NDBkMWI1MjMxNDI3OGNlYzgzODM4NDcyMmViMWQwIE1vbiBTZXAgMTcgMDA6MDA6MDAgMjAwMQotRnJvbTogV2lsbGlhbSBIdWFuZyA8eXVzaGhAZ29vZ2xlLmNvbT4KLURhdGU6IFR1ZSwgMTYgTWF5IDIwMjMgMDk6MTg6NTUgKzAwMDAKLVN1YmplY3Q6IFtQQVRDSF0gT3B0aW1pemUgWHRlbnNhIHRyYW5zcG9zZSBjb252b2x1dGlvbiBmb3IgbW9yZSBrZXJuZWwgc2l6ZXMKLSBhbmQgaW5wdXQgY2hhbm5lbHMuCi0KLVByZXZpb3VzbHksIHRoZXJlIHdlcmUgdGhyZWUgY29kZSBwYXRocywgaW4gZGVjcmVhc2luZyBwZXJmb3JtYW5jZToKLQotMS4gS2VybmVsIHNpemUgKEgqVykgbXVsdGlwbGUgb2YgNCwgaW5wdXQgY2hhbm5lbHMgbXVsdGlwbGUgb2YgMTYKLTIuIEtlcm5lbCBzaXplIChIKlcpIG11bHRpcGxlIG9mIDQsIGlucHV0IGNoYW5uZWxzIG11bHRpcGxlIG9mIDQKLTMuIE90aGVycyAodW5vcHRpbWl6ZWQgY2FzZSkKLQotVGhpcyBwYXRjaCByZWR1Y2VzIHRoZW0gdG8gdGhlIGZvbGxvdyB0d28gY2FzZXM6Ci0KLTEuIElucHV0IGNoYW5uZWxzIG11bHRpcGxlIG9mIDQKLTIuIE90aGVycyAodW5vcHRpbWl6ZWQgY2FzZSkKLQotT3JpZ2luYWwgQ0w9Y2wvNTE2MTQ0MDk0Ci0KLUJVRz0yMjczNzQ3MTgKLQotU2lnbmVkLW9mZi1ieTogV2lsbGlhbSBIdWFuZyA8eXVzaGhAZ29vZ2xlLmNvbT4KLQotT3B0aW1pemUgWHRlbnNhIENPTlYyRCBjaXJjdWxhciBidWZmZXIgY29weS4KLQotSW4gWHRlbnNhJ3MgQ09OVjJEIGtlcm5lbCwgZGF0YSBpcyBzaHVmZmxlZCBhcm91bmQgYW5kIHBhZGRlZCBzbyB0aGUgMkQKLWNvbnZvbHV0aW9uIHR1cm5zIGludG8gc2VxdWVudGlhbCB2ZWN0b3IgcHJvZHVjdHMuIFVuZm9ydHVuYXRlbHksIHRoaXMKLXByb2Nlc3MgaXMgc29tZXdoYXQgc2xvdywgYW5kIHRoZSBvdmVyaGVhZCBpcyBlc3BlY2lhbGx5IGhpZ2ggZm9yIHNtYWxsCi12ZWN0b3IgbGVuZ3Rocy4KLQotVGhpcyBwYXRjaCBpbnRyb2R1Y2VzIHRoZSBmb2xsb3dpbmc6Ci0KLS0gRmFzdGVyIGNvZGUgcGF0aCBmb3Igbm8gcGFkZGluZyAoc2luY2Ugb3VyIG1vZGVscyB1c2UgVkFMSUQgcGFkZGluZywKLSAgaS5lLiwgbm8gcGFkZGluZyBhdCBhbGwpCi0tIE1hbnVhbCBsb29wIGlmIGFycmF5IGlzIHNtYWxsIGFuZCBtZW1jcHkgaWYgYXJyYXkgaXMgbGFyZ2UKLS0gU2tpcCBtZW1zZXQgb24gcGFkZGVkIGNoYW5uZWxzIGFzIHRoZSBjb3JyZXNwb25kaW5nIGtlcm5lbHMgYXJlCi0gIGFscmVhZHkgemVybwotCi1CVUc9MjQ5Nzk2OTI5Ci0KLVNpZ25lZC1vZmYtYnk6IFdpbGxpYW0gSHVhbmcgPHl1c2hoQGdvb2dsZS5jb20+Ci0KLUFkZCBpbXBsZW1lbnRhdGlvbiBmb3IgemVyby1jb3B5IENPTlYyRCBrZXJuZWxzLgotCi1UaGUgcHJldmlvdXMgYHhhX25uX2NvbnYyZF9zdGRfc3ltOHN4c3ltMTZzYCBpbXBsZW1lbnRhdGlvbiBzaHVmZmxlcyB0aGUKLWlucHV0IHRlbnNvciBpbnRvIGEgY2lyY3VsYXIgYnVmZmVyLCBmbGF0dGVuaW5nIHRoZSBkaW1lbnNpb25zLCBzbyB0aGF0Ci10aGUgMkQgY29udm9sdXRpb24gdHVybnMgaW50byBzZXF1ZW50aWFsIHZlY3RvciBwcm9kdWN0cy4gSG93ZXZlciwgdGhpcwotY3JlYXRlZCBzaWduaWZpY2FudCBvdmVyaGVhZCBmb3IgbGF5ZXJzIHdoZXJlIHRoZSByZXN1bHRpbmcgdmVjdG9yCi1sZW5ndGhzIGFyZSBzbWFsbC4KLQotVGhpcyBwYXRjaCBpbXBsZW1lbnRzIGFuIGFsdGVybmF0aXZlIHplcm8tY29weSBtZXRob2QgdGhhdCB0YWtlcwotYWR2YW50YWdlIG9mIHR3byBmYWN0czoKLQotMS4gSWYgYHhfcGFkZGluZyA9PSAwYCwgdGhlIHdpZHRoIGRpbWVuc2lvbiBpcyBhdXRvbWF0aWNhbGx5IGZsYXR0ZW5lZAotICAgd2l0aCB0aGUgY2hhbm5lbCBkaW1lbnNpb24sIGFuZCB3ZSBuZWVkIG9ubHkgYGtlcm5lbF9oZWlnaHRgCi0gICBzZXF1ZW50aWFsIHZlY3RvciBwcm9kdWN0cywgZXZlbiB3aXRob3V0IHRoZSBkYXRhIHNodWZmbGluZwotMi4gU2ltaWxhciB0byB0aGUgbG9vcCB0aWxpbmcgZG9uZSBpbgotICAgYHhhX25uX21hdFh2ZWNfc3ltOHN4c3ltMTZzX3N5bTE2c19jaXJjYCwgd2UgY2FuIHRpbGUgdGhlIGBvdXRfd2lkdGhgCi0gICBhbmQgYG91dF9jaGFubmVsc2AgZGltZW5zaW9ucywgYWNoaWV2aW5nIHRoZSB0aHJvdWdocHV0IG9mCi0gICBgX3hhX25uX2RvdF9wcm9kdWN0XzJyb3dfNHZlY19tYXRfdmVjc180Ynl0ZXNfYWxpZ25lZGAgKGkuZS4sIDEuNgotICAgTVVMQUFBQVFzL2N5Y2xlKSwgZXZlbiB3aGVuIGBvdXRfaGVpZ2h0IDwgMmAKLQotQXMgYSByZXN1bHQsIHRoZSBwYXRjaCBzaWduaWZpY2FudGx5IGJlbmVmaXRzIGxheWVycyB3aGVyZSB0aGUga2VybmVsCi1hbmQgb3V0cHV0IGhlaWdodHMgYXJlIHNtYWxsLCBsZWFkaW5nIHRvIDI1JSsgY3ljbGUgcmVkdWN0aW9ucyBpbiBzb21lCi11c2UgY2FzZXMuCi0KLVNpZ25lZC1vZmYtYnk6IFdpbGxpYW0gSHVhbmcgPHl1c2hoQGdvb2dsZS5jb20+Ci0tLS0KLSAuLi4vY25uL2hpZmk0L3hhX25uX2NvbnYyZF9zdGRfY2lyY19idWYuYyAgICAgfCAgODQgKysrKysrKy0KLSAuLi4vY25uL2hpZmk0L3hhX25uX2NvbnYyZF9zdGRfc3RhdGUuaCAgICAgICAgfCAgMTUgKysKLSAuLi4vY25uL2hpZmk0L3hhX25uX2NvbnYyZF9zdGRfc3ltOHN4c3ltMTZzLmMgfCAyMDMgKysrKysrKysrKysrKysrLS0tCi0gLi4uL2hpZmk0L3hhX25uX3RyYW5zcG9zZV9jb252X3N5bThzeHN5bTE2cy5jIHwgIDM2ICstLS0KLSA0IGZpbGVzIGNoYW5nZWQsIDI3NSBpbnNlcnRpb25zKCspLCA2MyBkZWxldGlvbnMoLSkKLQotZGlmZiAtLWdpdCBhL2FsZ28va2VybmVscy9jbm4vaGlmaTQveGFfbm5fY29udjJkX3N0ZF9jaXJjX2J1Zi5jIGIvYWxnby9rZXJuZWxzL2Nubi9oaWZpNC94YV9ubl9jb252MmRfc3RkX2NpcmNfYnVmLmMKLWluZGV4IGY4YWRiYTIuLjFhNWYxODYgMTAwNjQ0Ci0tLS0gYS9hbGdvL2tlcm5lbHMvY25uL2hpZmk0L3hhX25uX2NvbnYyZF9zdGRfY2lyY19idWYuYwotKysrIGIvYWxnby9rZXJuZWxzL2Nubi9oaWZpNC94YV9ubl9jb252MmRfc3RkX2NpcmNfYnVmLmMKLUBAIC02NDIsNyArNjQyLDggQEAgVk9JRCBjb252MmRfc3RkX2luaXRfY2lyX2J1ZigKLSB9Ci0gCi0gLy8gQWRkIHhfc3RyaWRlIChidXQgbm90IG1vcmUgdGhhbiBrZXJuZWxfd2lkdGgpIHggKGlucHV0X2hlaWdodCB4IGlucHV0X2NoYW5uZWxzKSBuZXcgcGxhbmVzIHRvIGNpcmN1bGFyIGJ1ZmZlcgotLVZPSUQgY29udjJkX3N0ZF91cGRhdGVfY2lyX2J1ZigKLSsvLyBTbG93IHZlcnNpb24gb2YgY29udjJkX3N0ZF91cGRhdGVfY2lyX2J1ZiB3aXRoIGZld2VyIHJlcXVpcmVtZW50cwotK1ZPSUQgY29udjJkX3N0ZF91cGRhdGVfY2lyX2J1Zl9zbG93KAotICAgICBXT1JEMzIgaW5wdXRfY2hhbm5lbHMsCi0gICAgIFdPUkQzMiBpbnB1dF9jaGFubmVsc19wYWQsCi0gICAgIFdPUkQzMiBpbnB1dF9ieXRld2lkdGgsCi1AQCAtNzQyLDYgKzc0Myw4NyBAQCBWT0lEIGNvbnYyZF9zdGRfdXBkYXRlX2Npcl9idWYoCi0gICAqcHBfaW5wID0gKFZPSUQgKilwX2lucDsKLSB9Ci0gCi0rLy8gQWRkIHhfc3RyaWRlIChidXQgbm90IG1vcmUgdGhhbiBrZXJuZWxfd2lkdGgpIHggKGlucHV0X2hlaWdodCB4IGlucHV0X2NoYW5uZWxzKSBuZXcgcGxhbmVzIHRvIGNpcmN1bGFyIGJ1ZmZlcgotK1ZPSUQgY29udjJkX3N0ZF91cGRhdGVfY2lyX2J1ZigKLSsgICAgV09SRDMyIGlucHV0X2NoYW5uZWxzLAotKyAgICBXT1JEMzIgaW5wdXRfY2hhbm5lbHNfcGFkLAotKyAgICBXT1JEMzIgaW5wdXRfYnl0ZXdpZHRoLAotKyAgICBXT1JEMzIgaW5wdXRfd2lkdGgsCi0rICAgIFdPUkQzMiBpbnB1dF9oZWlnaHQsCi0rICAgIFdPUkQzMiB5X3BhZGRpbmcsCi0rICAgIFdPUkQzMiB5X2JfcGFkLAotKyAgICBXT1JEMzIgeF9wYWRkaW5nLAotKyAgICBXT1JEMzIga2VybmVsX3dpZHRoLAotKyAgICBXT1JEMzIgeF9zdHJpZGUsCi0rICAgIFZPSUQgKipwcF9pbnAsCi0rICAgIFdPUkQzMiBpZHhfYmVnX2lucF93aWR0aF9wYWQsCi0rICAgIHhhX25uX2NvbnZfc3RhdGVfdCAqcF9zdGF0ZSkKLSt7Ci0rICBpZiAoeV9wYWRkaW5nICE9IDAgfHwgeV9iX3BhZCAhPSAwIHx8IHhfcGFkZGluZyAhPSAwKSB7Ci0rICAgIGNvbnYyZF9zdGRfdXBkYXRlX2Npcl9idWZfc2xvdygKLSsgICAgICBpbnB1dF9jaGFubmVscywKLSsgICAgICBpbnB1dF9jaGFubmVsc19wYWQsCi0rICAgICAgaW5wdXRfYnl0ZXdpZHRoLAotKyAgICAgIGlucHV0X3dpZHRoLAotKyAgICAgIGlucHV0X2hlaWdodCwKLSsgICAgICB5X3BhZGRpbmcsCi0rICAgICAgeV9iX3BhZCwKLSsgICAgICB4X3BhZGRpbmcsCi0rICAgICAga2VybmVsX3dpZHRoLAotKyAgICAgIHhfc3RyaWRlLAotKyAgICAgIHBwX2lucCwKLSsgICAgICBpZHhfYmVnX2lucF93aWR0aF9wYWQsCi0rICAgICAgcF9zdGF0ZQotKyAgICApOwotKyAgICByZXR1cm47Ci0rICB9Ci0rCi0rICBXT1JEMzIgaSxrOwotKyAgV09SRDggKnBfaW5wID0gKFdPUkQ4ICopKnBwX2lucDsKLSsgIFdPUkQzMiBwbGFuZXNfdG9fYWRkID0geF9zdHJpZGUgPiBrZXJuZWxfd2lkdGggPyBrZXJuZWxfd2lkdGggOiB4X3N0cmlkZTsKLSsgIFdPUkQzMiBwbGFuZXNfdG9fa2VlcCA9IGtlcm5lbF93aWR0aCAtIHBsYW5lc190b19hZGQ7Ci0rCi0rICAvLyBDb3B5ICdwbGFuZXNfdG9fYWRkJyBwbGFuZXMgb2YgZGF0YSB0byBjaXJjdWxhciBidWZmZXIKLSsgIEFFX0FERENJUkMxNlg0X1hDKChhZV9pbnQxNng0ICopcF9zdGF0ZS0+Y2lyX2J1Zi5wX2N1cnIsIHBsYW5lc190b19hZGQgKiBpbnB1dF9jaGFubmVsc19wYWQgKiBpbnB1dF9ieXRld2lkdGgpOwotKyAgV09SRDggKnBfZHN0ID0gKFdPUkQ4ICopcF9zdGF0ZS0+Y2lyX2J1Zi5wX2N1cnI7Ci0rICBBRV9BRERDSVJDMTZYNF9YQygoYWVfaW50MTZ4NCAqKXBfZHN0LCBwbGFuZXNfdG9fa2VlcCAqIGlucHV0X2NoYW5uZWxzX3BhZCAqIGlucHV0X2J5dGV3aWR0aCk7Ci0rCi0rICBXT1JEMzIgY29weV9pbnBfd2lkdGggPSBwbGFuZXNfdG9fYWRkOwotKyAgV09SRDMyIHRvX3NraXBfaW5wX3dpZHRoID0geF9zdHJpZGUgLSBwbGFuZXNfdG9fYWRkOyAgICAgLy8gTm9uLXplcm8gZm9yIHhfc3RyaWRlID4ga2VybmVsX3dpZHRoCi0rCi0rICBpbnQgc2l6ZSA9IGlucHV0X2NoYW5uZWxzICogaW5wdXRfYnl0ZXdpZHRoOwotKyAgaWYgKHNpemUgPD0gMzIpIHsKLSsgICAgZm9yKGk9MDtpPGlucHV0X2hlaWdodDtpKyspCi0rICAgIHsKLSsgICAgICBmb3Ioaz0wO2s8Y29weV9pbnBfd2lkdGg7aysrKQotKyAgICAgIHsKLSsgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTsgKytqKSB7Ci0rICAgICAgICAgIHBfZHN0W2pdID0gcF9pbnBbal07Ci0rICAgICAgICB9Ci0rICAgICAgICBBRV9BRERDSVJDMTZYNF9YQygoYWVfaW50MTZ4NCAqKXBfZHN0LCBpbnB1dF9jaGFubmVsc19wYWQgKiBpbnB1dF9ieXRld2lkdGgpOwotKyAgICAgICAgcF9pbnAgKz0gaW5wdXRfY2hhbm5lbHMgKiBpbnB1dF9ieXRld2lkdGg7Ci0rICAgICAgfQotKyAgICAgIEFFX0FERENJUkMxNlg0X1hDKChhZV9pbnQxNng0ICopcF9kc3QsIHBsYW5lc190b19rZWVwICogaW5wdXRfY2hhbm5lbHNfcGFkICogaW5wdXRfYnl0ZXdpZHRoKTsKLSsgICAgICBwX2lucCArPSAoaW5wdXRfd2lkdGggLSBjb3B5X2lucF93aWR0aCkgKiBpbnB1dF9jaGFubmVscyAqIGlucHV0X2J5dGV3aWR0aDsKLSsgICAgfQotKyAgfSBlbHNlIHsKLSsgICAgZm9yKGk9MDtpPGlucHV0X2hlaWdodDtpKyspCi0rICAgIHsKLSsgICAgICBmb3Ioaz0wO2s8Y29weV9pbnBfd2lkdGg7aysrKQotKyAgICAgIHsKLSsgICAgICAgIG1lbWNweShwX2RzdCwgcF9pbnAsIGlucHV0X2NoYW5uZWxzICogaW5wdXRfYnl0ZXdpZHRoKTsKLSsgICAgICAgIEFFX0FERENJUkMxNlg0X1hDKChhZV9pbnQxNng0ICopcF9kc3QsIGlucHV0X2NoYW5uZWxzX3BhZCAqIGlucHV0X2J5dGV3aWR0aCk7Ci0rICAgICAgICBwX2lucCArPSBpbnB1dF9jaGFubmVscyAqIGlucHV0X2J5dGV3aWR0aDsKLSsgICAgICB9Ci0rICAgICAgQUVfQUREQ0lSQzE2WDRfWEMoKGFlX2ludDE2eDQgKilwX2RzdCwgcGxhbmVzX3RvX2tlZXAgKiBpbnB1dF9jaGFubmVsc19wYWQgKiBpbnB1dF9ieXRld2lkdGgpOwotKyAgICAgIHBfaW5wICs9IChpbnB1dF93aWR0aCAtIGNvcHlfaW5wX3dpZHRoKSAqIGlucHV0X2NoYW5uZWxzICogaW5wdXRfYnl0ZXdpZHRoOwotKyAgICB9Ci0rICB9Ci0rICBwX2lucCArPSAoLWlucHV0X2hlaWdodCAqIGlucHV0X3dpZHRoICsgY29weV9pbnBfd2lkdGggKyB0b19za2lwX2lucF93aWR0aCkgKiBpbnB1dF9jaGFubmVscyAqIGlucHV0X2J5dGV3aWR0aDsKLSsKLSsgICpwcF9pbnAgPSAoVk9JRCAqKXBfaW5wOwotK30KLSsKLSBWT0lEIHhhX25uX2RpbGF0ZWRfY29udjJkX3N0ZF9sb2FkX2Npcl9idWZfYXN5bTgoCi0gICAgIFdPUkQzMiBpbnB1dF9jaGFubmVscywKLSAgICAgV09SRDMyIGlucHV0X2NoYW5uZWxzX3BhZCwKLWRpZmYgLS1naXQgYS9hbGdvL2tlcm5lbHMvY25uL2hpZmk0L3hhX25uX2NvbnYyZF9zdGRfc3RhdGUuaCBiL2FsZ28va2VybmVscy9jbm4vaGlmaTQveGFfbm5fY29udjJkX3N0ZF9zdGF0ZS5oCi1pbmRleCBhMmJhMzU1Li44ZDMzYmFkIDEwMDY0NAotLS0tIGEvYWxnby9rZXJuZWxzL2Nubi9oaWZpNC94YV9ubl9jb252MmRfc3RkX3N0YXRlLmgKLSsrKyBiL2FsZ28va2VybmVscy9jbm4vaGlmaTQveGFfbm5fY29udjJkX3N0ZF9zdGF0ZS5oCi1AQCAtMjE0LDYgKzIxNCwyMSBAQCBWT0lEIGNvbnYyZF9zdGRfaW5pdF9jaXJfYnVmKAotICAgICBWT0lEICoqcHBfaW5wLAotICAgICB4YV9ubl9jb252X3N0YXRlX3QgKnBfc3RhdGUpOwotIAotK1ZPSUQgY29udjJkX3N0ZF91cGRhdGVfY2lyX2J1Zl9zbG93KAotKyAgICBXT1JEMzIgaW5wdXRfY2hhbm5lbHMsCi0rICAgIFdPUkQzMiBpbnB1dF9jaGFubmVsc19wYWQsCi0rICAgIFdPUkQzMiBpbnB1dF9ieXRld2lkdGgsCi0rICAgIFdPUkQzMiBpbnB1dF93aWR0aCwKLSsgICAgV09SRDMyIGlucHV0X2hlaWdodCwKLSsgICAgV09SRDMyIHlfcGFkZGluZywKLSsgICAgV09SRDMyIHlfYl9wYWQsCi0rICAgIFdPUkQzMiB4X3BhZGRpbmcsCi0rICAgIFdPUkQzMiBrZXJuZWxfd2lkdGgsCi0rICAgIFdPUkQzMiB4X3N0cmlkZSwKLSsgICAgVk9JRCAqKnBwX2lucCwKLSsgICAgV09SRDMyIGlkeF9iZWdfaW5wX3dpZHRoX3BhZCwKLSsgICAgeGFfbm5fY29udl9zdGF0ZV90ICpwX3N0YXRlKTsKLSsKLSBWT0lEIGNvbnYyZF9zdGRfdXBkYXRlX2Npcl9idWYoCi0gICAgIFdPUkQzMiBpbnB1dF9jaGFubmVscywKLSAgICAgV09SRDMyIGlucHV0X2NoYW5uZWxzX3BhZCwKIGRpZmYgLS1naXQgYS9hbGdvL2tlcm5lbHMvY25uL2hpZmk0L3hhX25uX2NvbnYyZF9zdGRfc3ltOHN4c3ltMTZzLmMgYi9hbGdvL2tlcm5lbHMvY25uL2hpZmk0L3hhX25uX2NvbnYyZF9zdGRfc3ltOHN4c3ltMTZzLmMKLWluZGV4IDkyNzIxYmMuLjZmODY4YmUgMTAwNjQ0CitpbmRleCBiOTkwNWU5Li45OTBiNzEzIDEwMDY0NAogLS0tIGEvYWxnby9rZXJuZWxzL2Nubi9oaWZpNC94YV9ubl9jb252MmRfc3RkX3N5bThzeHN5bTE2cy5jCiArKysgYi9hbGdvL2tlcm5lbHMvY25uL2hpZmk0L3hhX25uX2NvbnYyZF9zdGRfc3ltOHN4c3ltMTZzLmMKIEBAIC00OSw2ICs0OSwyNCBAQCBzdGF0aWMgaW5saW5lIGFlX2ludDMyeDIgTXVsdGlwbHlCeVF1YW50aXplZE11bHRpcGxpZXJfcmVmKGFlX2ludDY0IGRfeCwKQEAgLTIyOSw3OCArMjcsMzUgQEAKICBzdGF0aWMgV09SRDMyIGNvbnZfeF9sZWZ0X3BhZCgKICAgICAgV09SRDMyIHhfcGFkZGluZywKICAgICAgV09SRDMyIGtlcm5lbF93aWR0aCwKLUBAIC0yMzgsNDEgKzI1NiwxNjYgQEAgV09SRDMyIHhhX25uX2NvbnYyZF9zdGRfcGVyX2NoYW5fc3ltOHN4c3ltMTZzKAotICAgV09SRDMyIHlfYl9wYWQgPSBrZXJuZWxfaGVpZ2h0ICsgKG91dF9oZWlnaHQgLSAxKSAqIHlfc3RyaWRlIC0gKHlfcGFkZGluZyArIGlucHV0X2hlaWdodCk7Ci0gICB5X2JfcGFkID0geV9iX3BhZCA8IDAgPyAwIDogeV9iX3BhZDsKK0BAIC0xMjksNiArMTQ3LDE2MCBAQCBzdGF0aWMgV09SRDMyIGNvbnZfeF9yaWdodF9wYWQoCisgICByZXR1cm4gb3V0X3dpZHRoX292ZXJfeF9yX3BhZDsKKyB9CiAgCi0tICBjb252MmRfc3RkX2luaXRfY2lyX2J1ZihpbnB1dF9jaGFubmVscywgaW5wdXRfY2hhbm5lbHNfcGFkLCBpbnB1dF9ieXRld2lkdGgsIGlucHV0X3dpZHRoLCBpbnB1dF9oZWlnaHQsIHlfcGFkZGluZywgeV9iX3BhZCwgeF9wYWRkaW5nX3Zhciwga2VybmVsX3dpZHRoLCB4X3N0cmlkZSwgKFZPSUQqKikmcHBfaW5wLCBwX3N0YXRlKTsKLSsgIGlmICh4X3BhZGRpbmcgfHwgKGlucHV0X2NoYW5uZWxzICYgMHgzKSB8fCAob3V0X2NoYW5uZWxzICYgMHgzKSB8fCAob3V0X3dpZHRoICYgMHgxKSkgewotKyAgICBjb252MmRfc3RkX2luaXRfY2lyX2J1ZihpbnB1dF9jaGFubmVscywgaW5wdXRfY2hhbm5lbHNfcGFkLCBpbnB1dF9ieXRld2lkdGgsIGlucHV0X3dpZHRoLCBpbnB1dF9oZWlnaHQsIHlfcGFkZGluZywgeV9iX3BhZCwgeF9wYWRkaW5nX3Zhciwga2VybmVsX3dpZHRoLCB4X3N0cmlkZSwgKFZPSUQqKikmcHBfaW5wLCBwX3N0YXRlKTsKLSAKLS0gIC8vIEluZGV4IHRvIHBhZGRlZCBpbnB1dCB3aWR0aAotLSAgV09SRDMyIGlkeF9iZWdfaW5wX3dpZHRoX3BhZCA9IGtlcm5lbF93aWR0aCAtIHhfc3RyaWRlOwotLSAgaWR4X2JlZ19pbnBfd2lkdGhfcGFkID0gaWR4X2JlZ19pbnBfd2lkdGhfcGFkIDwgMCA/IDAgOiBpZHhfYmVnX2lucF93aWR0aF9wYWQ7Ci0rICAgIC8vIEluZGV4IHRvIHBhZGRlZCBpbnB1dCB3aWR0aAotKyAgICBXT1JEMzIgaWR4X2JlZ19pbnBfd2lkdGhfcGFkID0ga2VybmVsX3dpZHRoIC0geF9zdHJpZGU7Ci0rICAgIGlkeF9iZWdfaW5wX3dpZHRoX3BhZCA9IGlkeF9iZWdfaW5wX3dpZHRoX3BhZCA8IDAgPyAwIDogaWR4X2JlZ19pbnBfd2lkdGhfcGFkOwotIAotIAotLSAgLy8gUHJvY2VzcyBMb29wIHRvIGNvbXB1dGUgb25lIG91dHB1dCBwbGFuZSBbb3V0X2hlaWdodCB4IG91dF9jaGFubmVsc10gcGVyIGl0ZXJhdGlvbgotLSAgZm9yKGo9MDtqPG91dF93aWR0aC1vdXRfd2lkdGhfb3Zlcl94X3BhZC1vdXRfd2lkdGhfb3Zlcl94X3JfcGFkO2orKykKLS0gIHsKLS0gICAgLy8gQWRkIHhfc3RyaWRlIHggKGlucHV0X2hlaWdodCB4IGlucHV0X2NoYW5uZWxzKSBuZXcgcGxhbmVzIHRvIGNpcmN1bGFyIGJ1ZmZlcgotLSAgICBjb252MmRfc3RkX3VwZGF0ZV9jaXJfYnVmKGlucHV0X2NoYW5uZWxzLCBpbnB1dF9jaGFubmVsc19wYWQsIGlucHV0X2J5dGV3aWR0aCwgaW5wdXRfd2lkdGgsIGlucHV0X2hlaWdodCwgeV9wYWRkaW5nLCB5X2JfcGFkLCB4X3BhZGRpbmdfdmFyLCBrZXJuZWxfd2lkdGgsIHhfc3RyaWRlLCAoVk9JRCoqKSZwcF9pbnAsIGlkeF9iZWdfaW5wX3dpZHRoX3BhZCwgcF9zdGF0ZSk7Ci0rICAgIC8vIFByb2Nlc3MgTG9vcCB0byBjb21wdXRlIG9uZSBvdXRwdXQgcGxhbmUgW291dF9oZWlnaHQgeCBvdXRfY2hhbm5lbHNdIHBlciBpdGVyYXRpb24KLSsgICAgZm9yKGo9MDtqPG91dF93aWR0aC1vdXRfd2lkdGhfb3Zlcl94X3BhZC1vdXRfd2lkdGhfb3Zlcl94X3JfcGFkO2orKykKKytzdGF0aWMgV09SRDMyIHhhX25uX2NvbnYyZF9zdGRfcGVyX2NoYW5fc3ltOHN4c3ltMTZzX25vX2NpcmNfYnVmKAorKyAgICBXT1JEMTYqIF9fcmVzdHJpY3RfXyBwX291dCwKKysgICAgY29uc3QgV09SRDE2KiBfX3Jlc3RyaWN0X18gcF9pbnAsCisrICAgIGNvbnN0IFdPUkQ4KiBfX3Jlc3RyaWN0X18gcF9rZXJuZWwsCisrICAgIGNvbnN0IFdPUkQ2NCogX19yZXN0cmljdF9fIHBfYmlhcywKKysgICAgV09SRDMyIGlucHV0X2hlaWdodCwKKysgICAgV09SRDMyIGlucHV0X3dpZHRoLAorKyAgICBXT1JEMzIgaW5wdXRfY2hhbm5lbHMsCisrICAgIFdPUkQzMiBrZXJuZWxfaGVpZ2h0LAorKyAgICBXT1JEMzIga2VybmVsX3dpZHRoLAorKyAgICBXT1JEMzIgb3V0X2NoYW5uZWxzLAorKyAgICBXT1JEMzIgeF9zdHJpZGUsCisrICAgIFdPUkQzMiB5X3N0cmlkZSwKKysgICAgV09SRDMyIHhfcGFkZGluZywKKysgICAgV09SRDMyIHlfcGFkZGluZywKKysgICAgV09SRDMyIG91dF9oZWlnaHQsCisrICAgIFdPUkQzMiBvdXRfd2lkdGgsCisrICAgIFdPUkQzMiBpbnB1dF96ZXJvX2JpYXMsCisrICAgIFdPUkQzMiAqIHBfb3V0X211bHRpcGxpZXIsCisrICAgIFdPUkQzMiAqIHBfb3V0X3NoaWZ0LAorKyAgICBXT1JEMzIgb3V0X3plcm9fYmlhcywKKysgICAgV09SRDMyIG91dF9kYXRhX2Zvcm1hdAorKyAgICApCiArICAgIHsKLSsgICAgICAvLyBBZGQgeF9zdHJpZGUgeCAoaW5wdXRfaGVpZ2h0IHggaW5wdXRfY2hhbm5lbHMpIG5ldyBwbGFuZXMgdG8gY2lyY3VsYXIgYnVmZmVyCi0rICAgICAgY29udjJkX3N0ZF91cGRhdGVfY2lyX2J1ZihpbnB1dF9jaGFubmVscywgaW5wdXRfY2hhbm5lbHNfcGFkLCBpbnB1dF9ieXRld2lkdGgsIGlucHV0X3dpZHRoLCBpbnB1dF9oZWlnaHQsIHlfcGFkZGluZywgeV9iX3BhZCwgeF9wYWRkaW5nX3Zhciwga2VybmVsX3dpZHRoLCB4X3N0cmlkZSwgKFZPSUQqKikmcHBfaW5wLCBpZHhfYmVnX2lucF93aWR0aF9wYWQsIHBfc3RhdGUpOwotIAotLSAgICAvLyBVcGRhdGUgaW5kZXggdG8gaW5wdXQgd2lkdGggcGFkZGVkCi0tICAgIGlkeF9iZWdfaW5wX3dpZHRoX3BhZCArPSB4X3N0cmlkZTsKLSsgICAgICAvLyBVcGRhdGUgaW5kZXggdG8gaW5wdXQgd2lkdGggcGFkZGVkCi0rICAgICAgaWR4X2JlZ19pbnBfd2lkdGhfcGFkICs9IHhfc3RyaWRlOwotIAotLSAgICAvLyBDb252b2x1dGlvbiB1c2luZyBtYXRYdmVjIHdpdGggbWF0cml4IGFzIGNpcmN1bGFyIGJ1ZmZlcgotLSAgICB4YV9ubl9tYXRYdmVjX3N5bThzeHN5bTE2c19zeW0xNnNfY2lyYwotLSAgICAgIChwX291dCAvKiBvdXRwdXQgKi8KLS0gICAgICAgLHBfc3RhdGUtPmNpcl9idWYucF9jdXJyLyogbWF0cml4OiByb3dzIHggY29scyAqLwotLSAgICAgICAscF9zdGF0ZS0+cF9rZXJuZWxfcGFkZGVkIC8qIHZlYzogY29scyAqLwotLSAgICAgICAscF9iaWFzIC8qIGJpYXMgKi8KLS0gICAgICAgLG91dF9oZWlnaHQgLyogcm93cyAqLwotLSAgICAgICAsaW5wdXRfY2hhbm5lbHNfcGFkICoga2VybmVsX3dpZHRoICoga2VybmVsX2hlaWdodCAvKiBjb2xzICovCi0tICAgICAgICxpbnB1dF9jaGFubmVsc19wYWQgKiBrZXJuZWxfd2lkdGggKiB5X3N0cmlkZS8qIHJvd19vZmZzZXQgKi8KLS0gICAgICAgLG91dF9jaGFubmVscyAvKiB2ZWNfY291bnQgKi8KLS0gICAgICAgLGlucHV0X2NoYW5uZWxzX3BhZCAqIGtlcm5lbF93aWR0aCAqIGtlcm5lbF9oZWlnaHQgLyogdmVjX3N0cmlkZSAqLwotLSAgICAgICAsb3V0X2NoYW5uZWxzX29mZnNldCAvKiBvdXRfY29sX29mZnNldCAqLwotLSAgICAgICAsb3V0X2hlaWdodF9vZmZzZXQgLyogb3V0X3Jvd19vZmZzZXQgKi8KLS0gICAgICAgLGlucHV0X3plcm9fYmlhcwotLSAgICAgICAscF9vdXRfbXVsdGlwbGllcgotLSAgICAgICAscF9vdXRfc2hpZnQKLS0gICAgICAgLG91dF96ZXJvX2JpYXMKLS0gICAgICApOwotLSAgICBwX291dCArPSBvdXRfd2lkdGhfb2Zmc2V0OwotKyAgICAgIC8vIENvbnZvbHV0aW9uIHVzaW5nIG1hdFh2ZWMgd2l0aCBtYXRyaXggYXMgY2lyY3VsYXIgYnVmZmVyCi0rICAgICAgeGFfbm5fbWF0WHZlY19zeW04c3hzeW0xNnNfc3ltMTZzX2NpcmMKLSsgICAgICAgIChwX291dCAvKiBvdXRwdXQgKi8KLSsgICAgICAgICxwX3N0YXRlLT5jaXJfYnVmLnBfY3Vyci8qIG1hdHJpeDogcm93cyB4IGNvbHMgKi8KLSsgICAgICAgICxwX3N0YXRlLT5wX2tlcm5lbF9wYWRkZWQgLyogdmVjOiBjb2xzICovCi0rICAgICAgICAscF9iaWFzIC8qIGJpYXMgKi8KLSsgICAgICAgICxvdXRfaGVpZ2h0IC8qIHJvd3MgKi8KLSsgICAgICAgICxpbnB1dF9jaGFubmVsc19wYWQgKiBrZXJuZWxfd2lkdGggKiBrZXJuZWxfaGVpZ2h0IC8qIGNvbHMgKi8KLSsgICAgICAgICxpbnB1dF9jaGFubmVsc19wYWQgKiBrZXJuZWxfd2lkdGggKiB5X3N0cmlkZS8qIHJvd19vZmZzZXQgKi8KLSsgICAgICAgICxvdXRfY2hhbm5lbHMgLyogdmVjX2NvdW50ICovCi0rICAgICAgICAsaW5wdXRfY2hhbm5lbHNfcGFkICoga2VybmVsX3dpZHRoICoga2VybmVsX2hlaWdodCAvKiB2ZWNfc3RyaWRlICovCi0rICAgICAgICAsb3V0X2NoYW5uZWxzX29mZnNldCAvKiBvdXRfY29sX29mZnNldCAqLwotKyAgICAgICAgLG91dF9oZWlnaHRfb2Zmc2V0IC8qIG91dF9yb3dfb2Zmc2V0ICovCi0rICAgICAgICAsaW5wdXRfemVyb19iaWFzCi0rICAgICAgICAscF9vdXRfbXVsdGlwbGllcgotKyAgICAgICAgLHBfb3V0X3NoaWZ0Ci0rICAgICAgICAsb3V0X3plcm9fYmlhcwotKyAgICAgICAgKTsKLSsgICAgICBwX291dCArPSBvdXRfd2lkdGhfb2Zmc2V0OwotKyAgICB9Ci0rICB9IGVsc2UgeworKwogKyAgICBjb25zdCBXT1JEMTYgKnBfZHN0MF8wID0gcF9vdXQgKyAwOwogKyAgICBjb25zdCBXT1JEMTYgKnBfZHN0MF8xID0gcF9vdXQgKyAxOwogKyAgICBjb25zdCBXT1JEMTYgKnBfZHN0MF8yID0gcF9vdXQgKyAyOwpAQCAtMzEwLDggKzY1LDggQEAKICsgICAgY29uc3QgV09SRDE2ICpwX2RzdDFfMiA9IHBfb3V0ICsgb3V0X2NoYW5uZWxzICsgMjsKICsgICAgY29uc3QgV09SRDE2ICpwX2RzdDFfMyA9IHBfb3V0ICsgb3V0X2NoYW5uZWxzICsgMzsKICsgICAgaW50IGtlcm5lbF9vdXRfY2hfb2Zmc2V0ID0ga2VybmVsX2hlaWdodCAqIGtlcm5lbF93aWR0aCAqIGlucHV0X2NoYW5uZWxzOwotKyAgICBpbnQgaW5wdXRfeF9vZmZzZXQgPSBpbnB1dF9jaGFubmVscyAqIHhfc3RyaWRlIC8gNDsKLSsgICAgaW50IHBfaW5wX3ZlY19zdHJpZGUgPSBpbnB1dF93aWR0aCAqIGlucHV0X2NoYW5uZWxzIC8gNDsKKysgICAgaW50IGlucHV0X3hfb2Zmc2V0ID0gKGlucHV0X2NoYW5uZWxzICogeF9zdHJpZGUpIC8gNDsKKysgICAgaW50IHBfaW5wX3ZlY19zdHJpZGUgPSAoaW5wdXRfd2lkdGggKiBpbnB1dF9jaGFubmVscykgLyA0OwogKyAgICBpbnQgcF9rZXJuX3ZlY19zdHJpZGUgPSBrZXJuZWxfd2lkdGggKiBpbnB1dF9jaGFubmVsczsKICsgICAgaW50IHZlY19sZW4gPSBrZXJuZWxfd2lkdGggKiBpbnB1dF9jaGFubmVsczsKICsgICAgZm9yIChpbnQgb3V0X3kgPSAwOyBvdXRfeSA8IG91dF9oZWlnaHQ7ICsrb3V0X3kpIHsKQEAgLTMyNSw2ICs4MCw3IEBACiArICAgICAgICAgIGFlX2ludDY0IG91dDFfMSA9IHBfYmlhc1tvdXRfY2ggKyAxXTsKICsgICAgICAgICAgYWVfaW50NjQgb3V0MV8yID0gcF9iaWFzW291dF9jaCArIDJdOwogKyAgICAgICAgICBhZV9pbnQ2NCBvdXQxXzMgPSBwX2JpYXNbb3V0X2NoICsgM107CisrCiArICAgICAgICAgIG91dDBfMCA9IEFFX1NMQUk2NChvdXQwXzAsIDgpOwogKyAgICAgICAgICBvdXQwXzEgPSBBRV9TTEFJNjQob3V0MF8xLCA4KTsKICsgICAgICAgICAgb3V0MF8yID0gQUVfU0xBSTY0KG91dDBfMiwgOCk7CkBAIC0zMzMsMTAgKzg5LDExIEBACiArICAgICAgICAgIG91dDFfMSA9IEFFX1NMQUk2NChvdXQxXzEsIDgpOwogKyAgICAgICAgICBvdXQxXzIgPSBBRV9TTEFJNjQob3V0MV8yLCA4KTsKICsgICAgICAgICAgb3V0MV8zID0gQUVfU0xBSTY0KG91dDFfMywgOCk7CisrCiArICAgICAgICAgIGludCBpbl94X28gPSBvdXRfeCAqIHhfc3RyaWRlOwogKyAgICAgICAgICBpbnQgaW5feV9vID0gb3V0X3kgKiB5X3N0cmlkZSAtIHlfcGFkZGluZzsKICsgICAgICAgICAgaW50IGtfeV9taW4gPSAtaW5feV9vOwotKyAgICAgICAgICBpbnQga195X21heCA9IGlucHV0X3dpZHRoIC0gaW5feV9vOworKyAgICAgICAgICBpbnQga195X21heCA9IGlucHV0X2hlaWdodCAtIGluX3lfbzsKICsgICAgICAgICAga195X21pbiA9IChrX3lfbWluIDwgMCkgPyAwIDoga195X21pbjsKICsgICAgICAgICAga195X21pbiA9IChrX3lfbWluIDwga2VybmVsX2hlaWdodCkgPyBrX3lfbWluIDoga2VybmVsX2hlaWdodDsKICsgICAgICAgICAga195X21heCA9IChrX3lfbWF4IDwgMCkgPyAwIDoga195X21heDsKQEAgLTM4Miw2ICsxMzksNyBAQAogKyAgICAgICAgICAgICAgQUVfTVVMQUFBQVExNihvdXQxXzMsIGRfaW5wMSwgZF9rZXJuMyk7CiArICAgICAgICAgICAgfQogKyAgICAgICAgICB9CisrCiArICAgICAgICAgIG91dDBfMCA9IEFFX1NSQUk2NChvdXQwXzAsIDgpOwogKyAgICAgICAgICBvdXQwXzEgPSBBRV9TUkFJNjQob3V0MF8xLCA4KTsKICsgICAgICAgICAgb3V0MF8yID0gQUVfU1JBSTY0KG91dDBfMiwgOCk7CkBAIC0zOTAsNiArMTQ4LDcgQEAKICsgICAgICAgICAgb3V0MV8xID0gQUVfU1JBSTY0KG91dDFfMSwgOCk7CiArICAgICAgICAgIG91dDFfMiA9IEFFX1NSQUk2NChvdXQxXzIsIDgpOwogKyAgICAgICAgICBvdXQxXzMgPSBBRV9TUkFJNjQob3V0MV8zLCA4KTsKKysKICsgICAgICAgICAgYWVfaW50MzJ4MiBhY2NfdmVjMCA9IE11bHRpcGx5QnlRdWFudGl6ZWRNdWx0aXBsaWVyX3gyX29wdCgKICsgICAgICAgICAgICAgIG91dDBfMCwgb3V0MV8wLCBwX291dF9tdWx0aXBsaWVyW291dF9jaCArIDBdLAogKyAgICAgICAgICAgICAgcF9vdXRfc2hpZnRbb3V0X2NoICsgMF0pOwpAQCAtNDIzLDcwICsxODIsNDUgQEAKICsgICAgICAgIHBfZHN0MV8zICs9IG91dF9jaGFubmVsczsKICsgICAgICB9CiArICAgIH0KKysgIHJldHVybiAwOworK30KKysKKyBXT1JEMzIgeGFfbm5fY29udjJkX3N0ZF9wZXJfY2hhbl9zeW04c3hzeW0xNnMoCisgICAgIFdPUkQxNiogX19yZXN0cmljdF9fIHBfb3V0LAorICAgICBjb25zdCBXT1JEMTYqIF9fcmVzdHJpY3RfXyBwX2lucCwKK0BAIC0xODAsNiArMzUyLDM1IEBAIFdPUkQzMiB4YV9ubl9jb252MmRfc3RkX3Blcl9jaGFuX3N5bThzeHN5bTE2cygKKyAgICAgWEFfTk5MSUJfQVJHX0NIS19DT05EKChwX291dF9zaGlmdFtpdHJdIDwgLTMxIHx8IHBfb3V0X3NoaWZ0W2l0cl0gPiAzMSksIC0xKTsKICAgIH0KICAKLSAgIHJldHVybiAwOwotZGlmZiAtLWdpdCBhL2FsZ28va2VybmVscy9jbm4vaGlmaTQveGFfbm5fdHJhbnNwb3NlX2NvbnZfc3ltOHN4c3ltMTZzLmMgYi9hbGdvL2tlcm5lbHMvY25uL2hpZmk0L3hhX25uX3RyYW5zcG9zZV9jb252X3N5bThzeHN5bTE2cy5jCi1pbmRleCA3ZjMxYjc1Li5hMDEwZDQ1IDEwMDY0NAotLS0tIGEvYWxnby9rZXJuZWxzL2Nubi9oaWZpNC94YV9ubl90cmFuc3Bvc2VfY29udl9zeW04c3hzeW0xNnMuYwotKysrIGIvYWxnby9rZXJuZWxzL2Nubi9oaWZpNC94YV9ubl90cmFuc3Bvc2VfY29udl9zeW04c3hzeW0xNnMuYwotQEAgLTE1Nyw3ICsxNTcsNyBAQCBpbnQgeGFfbm5fdHJhbnNwb3NlX2NvbnZfc3ltOHN4c3ltMTZzKFdPUkQxNiogb3V0cHV0X2RhdGEsCi0gCSAqLwotIAlpZihpbnB1dF9kYXRhICYmIGZpbHRlcl9kYXRhICYmIG91dHB1dF9kYXRhICYmIHNjcmF0Y2hfYnVmZmVyICYmCi0gCQkJKCgodW5zaWduZWQgaW50KWlucHV0X2RhdGEmMHg3KT09MCkgJiYgKCgodW5zaWduZWQgaW50KWZpbHRlcl9kYXRhJjB4Myk9PTApICYmICgoKHVuc2lnbmVkIGludClvdXRwdXRfZGF0YSYweDcpID09IDApICYmCi0tCQkJKCgodW5zaWduZWQgaW50KXNjcmF0Y2hfYnVmZmVyJjB4NykgPT0gMCkgJiYgKChpbnB1dF9kZXB0aCYweEYpPT0wKSAmJiAoKGZpbHRlcl9oZWlnaHQqZmlsdGVyX3dpZHRoJjB4Myk9PTApKQotKwkJCSgoKHVuc2lnbmVkIGludClzY3JhdGNoX2J1ZmZlciYweDcpID09IDApICYmICgoaW5wdXRfZGVwdGgmMHgzKT09MCkpCi0gCXsKLSAJCXsKLSAJCQkvL3RiZCA6IGJhdGNoID0gMSwgbmVlZCB0byBoYW5kbGUgb3RoZXIgdmFsdWVzIGFuZCBpbl94X21pbi9tYXg9IDAgLi4gbmVlZCB0b2MgaGVjayBmb3Igb3RoZXIgdmFsdWVzCi1AQCAtMTgwLDcgKzE4MCw4IEBAIGludCB4YV9ubl90cmFuc3Bvc2VfY29udl9zeW04c3hzeW0xNnMoV09SRDE2KiBvdXRwdXRfZGF0YSwKLSAJCQkJCWZpbHRfeV9tYXggPSAoZmlsdF95X21heCA8IGZpbHRlcl9oZWlnaHQpID8gZmlsdF95X21heCA6IGZpbHRlcl9oZWlnaHQ7Ci0gCQkJCQlmaWx0X3lfbWF4ID0gKGZpbHRfeV9tYXggPCAwKSA/IDAgOiBmaWx0X3lfbWF4OwotIAkJCQkJcGlucCA9ICAoV09SRDE2KikmaW5wdXRfZGF0YVtpbl95KmlucHV0X3dpZHRoKmlucHV0X2RlcHRoK2luX3gqaW5wdXRfZGVwdGhdOwotLQkJCQkJZm9yIChpbnQgaW5fY2hhbm5lbCA9IDA7IGluX2NoYW5uZWwgPCBpbnB1dF9kZXB0aDsgaW5fY2hhbm5lbCs9MTYpCi0rCQkJCQlpbnQgaW5fY2hhbm5lbCA9IDA7Ci0rCQkJCQlmb3IgKDsgaW5fY2hhbm5lbCArIDE1IDwgaW5wdXRfZGVwdGg7IGluX2NoYW5uZWwrPTE2KQotIAkJCQkJewotIAkJCQkJCWFlX2ludDE2eDQgZF9pbnAsIGRfaW5wMSwgZF9pbnAyLCBkX2lucDM7Ci0gCQkJCQkJQUVfTDE2WDRfSVAoZF9pbnAsIChhZV9pbnQxNng0KilwaW5wLCBzaXplb2YoV09SRDY0KSk7Ci1AQCAtMjM1LDM2ICsyMzYsNyBAQCBpbnQgeGFfbm5fdHJhbnNwb3NlX2NvbnZfc3ltOHN4c3ltMTZzKFdPUkQxNiogb3V0cHV0X2RhdGEsCi0gCQkJCQkJCX0KLSAJCQkJCQl9Ci0gCQkJCQl9Ci0tCQkJCX0KLS0JCQl9Ci0tCQl9Ci0tCX0KLS0JZWxzZSBpZihpbnB1dF9kYXRhICYmIGZpbHRlcl9kYXRhICYmIG91dHB1dF9kYXRhICYmIHNjcmF0Y2hfYnVmZmVyICYmCi0tCQkJKCgodW5zaWduZWQgaW50KWlucHV0X2RhdGEmMHg3KT09MCkgJiYgKCgodW5zaWduZWQgaW50KWZpbHRlcl9kYXRhJjB4Myk9PTApICYmICgoKHVuc2lnbmVkIGludClvdXRwdXRfZGF0YSYweDcpID09IDApICYmCi0tCQkJKCgodW5zaWduZWQgaW50KXNjcmF0Y2hfYnVmZmVyJjB4NykgPT0gMCkgJiYgKChpbnB1dF9kZXB0aCYweDMpPT0wKSAmJiAoKGZpbHRlcl9oZWlnaHQqZmlsdGVyX3dpZHRoJjB4Myk9PTApKQotLQl7Ci0tCQl7Ci0tCQkJLy90YmQgOiBiYXRjaCA9IDEsIG5lZWQgdG8gaGFuZGxlIG90aGVyIHZhbHVlcyBhbmQgaW5feF9taW4vbWF4PSAwIC4uIG5lZWQgdG9jIGhlY2sgZm9yIG90aGVyIHZhbHVlcwotLQkJCWZvciAoaW50IGluX3kgPSAwOyBpbl95IDwgaW5wdXRfaGVpZ2h0OyArK2luX3kpCi0tCQkJewotLQkJCQlmb3IgKGludCBpbl94ID0gMDsgaW5feCA8IGlucHV0X3dpZHRoOyArK2luX3gpCi0tCQkJCXsKLS0JCQkJCWNvbnN0IGludCBvdXRfeF9vcmlnID0gaW5feCpzdHJpZGVfd2lkdGggLSBwYWRfd2lkdGg7Ci0tCQkJCQljb25zdCBpbnQgb3V0X3lfb3JpZyA9IGluX3kqc3RyaWRlX2hlaWdodCAtIHBhZF9oZWlnaHQ7Ci0tCQkJCQlpbnQgZmlsdF94X21pbiA9IC1vdXRfeF9vcmlnOyAKLS0JCQkJCWludCBmaWx0X3hfbWF4ID0gb3V0cHV0X3dpZHRoIC0gb3V0X3hfb3JpZzsgCi0tCQkJCQlpbnQgZmlsdF95X21pbiA9IC1vdXRfeV9vcmlnOyAKLS0JCQkJCWludCBmaWx0X3lfbWF4ID0gb3V0cHV0X2hlaWdodCAtIG91dF95X29yaWc7IAotLQkJCQkJZmlsdF94X21pbiA9IChmaWx0X3hfbWluIDwgZmlsdGVyX3dpZHRoKSA/IGZpbHRfeF9taW4gOiBmaWx0ZXJfd2lkdGg7Ci0tCQkJCQlmaWx0X3hfbWluID0gKGZpbHRfeF9taW4gPCAwKSA/IDAgOiBmaWx0X3hfbWluOwotLQkJCQkJZmlsdF94X21heCA9IChmaWx0X3hfbWF4IDwgZmlsdGVyX3dpZHRoKSA/IGZpbHRfeF9tYXggOiBmaWx0ZXJfd2lkdGg7Ci0tCQkJCQlmaWx0X3hfbWF4ID0gKGZpbHRfeF9tYXggPCAwKSA/IDAgOiBmaWx0X3hfbWF4OwotLQkJCQkJZmlsdF95X21pbiA9IChmaWx0X3lfbWluIDwgZmlsdGVyX2hlaWdodCkgPyBmaWx0X3lfbWluIDogZmlsdGVyX2hlaWdodDsKLS0JCQkJCWZpbHRfeV9taW4gPSAoZmlsdF95X21pbiA8IDApID8gMCA6IGZpbHRfeV9taW47Ci0tCQkJCQlmaWx0X3lfbWF4ID0gKGZpbHRfeV9tYXggPCBmaWx0ZXJfaGVpZ2h0KSA/IGZpbHRfeV9tYXggOiBmaWx0ZXJfaGVpZ2h0OwotLQkJCQkJZmlsdF95X21heCA9IChmaWx0X3lfbWF4IDwgMCkgPyAwIDogZmlsdF95X21heDsKLS0JCQkJCXBpbnAgPSAgKFdPUkQxNiopJmlucHV0X2RhdGFbaW5feSppbnB1dF93aWR0aCppbnB1dF9kZXB0aCtpbl94KmlucHV0X2RlcHRoXTsKLS0JCQkJCWZvciAoaW50IGluX2NoYW5uZWwgPSAwOyBpbl9jaGFubmVsIDwgaW5wdXRfZGVwdGg7IGluX2NoYW5uZWwrPTQpCi0rCQkJCQlmb3IgKDsgaW5fY2hhbm5lbCArIDMgPCBpbnB1dF9kZXB0aDsgaW5fY2hhbm5lbCs9NCkKLSAJCQkJCXsKLSAJCQkJCQlhZV9pbnQxNng0IGRfaW5wOwotIAkJCQkJCUFFX0wxNlg0X0lQKGRfaW5wLCAoYWVfaW50MTZ4NCopcGlucCwgc2l6ZW9mKFdPUkQ2NCkpOwotLS0gCi0yLjQxLjAuMTYyLmdmYWZkZGIwYWY5LWdvb2cKLQorKyAgaWYgKCAhKHhfcGFkZGluZykgJiYgIShpbnB1dF9jaGFubmVscyAmIDB4MykgJiYgIShvdXRfY2hhbm5lbHMgJiAweDMpICYmICEob3V0X3dpZHRoICYgMHgxKSAmJiAob3V0X2RhdGFfZm9ybWF0ID09IDApICYmICgob3V0X3dpZHRoLTEpKnhfc3RyaWRlIDw9KGlucHV0X3dpZHRoLWtlcm5lbF93aWR0aCkgKSApCisrICB7CisrICAgIGludCByZXRfdmFsPTA7CisrICAgIHJldF92YWw9eGFfbm5fY29udjJkX3N0ZF9wZXJfY2hhbl9zeW04c3hzeW0xNnNfbm9fY2lyY19idWYocF9vdXQsCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX2lucCwKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfa2VybmVsLAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcF9iaWFzLAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfaGVpZ2h0LAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfd2lkdGgsCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9jaGFubmVscywKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlcm5lbF9oZWlnaHQsCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXJuZWxfd2lkdGgsCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfY2hhbm5lbHMsCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4X3N0cmlkZSwKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlfc3RyaWRlLAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeF9wYWRkaW5nLAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeV9wYWRkaW5nLAorKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0X2hlaWdodCwKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF93aWR0aCwKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X3plcm9fYmlhcywKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBfb3V0X211bHRpcGxpZXIsCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwX291dF9zaGlmdCwKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dF96ZXJvX2JpYXMsCisrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRfZGF0YV9mb3JtYXQKKysgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworKworKyAgICByZXR1cm4gcmV0X3ZhbDsKKysgIH0KKysKKyAgIFdPUkQzMiBqOworICAgV09SRDMyIGlucHV0X2J5dGV3aWR0aCA9IDI7CisgICBWT0lEICpwcF9pbnAgPSAoVk9JRCAqKXBfaW5wOwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvZXh0X2xpYnMveGFfbm5saWJfaGlmaTUucGF0Y2ggYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9leHRfbGlicy94YV9ubmxpYl9oaWZpNS5wYXRjaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ5NWM2My4uMDAwMDAwMAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9leHRfbGlicy94YV9ubmxpYl9oaWZpNS5wYXRjaAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLWRpZmYgLS1naXQgYS9hbGdvL2tlcm5lbHMvZmMvaGlmaTQveGFfbm5fZnVsbHlfY29ubmVjdGVkLmMgYi9hbGdvL2tlcm5lbHMvZmMvaGlmaTQveGFfbm5fZnVsbHlfY29ubmVjdGVkLmMKLWluZGV4IDI2YTJiNzMuLjYxZjBhNjQgMTAwNjQ0Ci0tLS0gYS9hbGdvL2tlcm5lbHMvZmMvaGlmaTQveGFfbm5fZnVsbHlfY29ubmVjdGVkLmMKLSsrKyBiL2FsZ28va2VybmVscy9mYy9oaWZpNC94YV9ubl9mdWxseV9jb25uZWN0ZWQuYwotQEAgLTI5OCw3ICsyOTgsNiBAQCBXT1JEMzIgeGFfbm5fZnVsbHlfY29ubmVjdGVkX3N5bThzeGFzeW04c19hc3ltOHMKLSAgIFhBX05OTElCX0FSR19DSEtfUFRSKHBfb3V0LCAtMSk7Ci0gICBYQV9OTkxJQl9BUkdfQ0hLX1BUUihwX3dlaWdodCwgLTEpOwotICAgWEFfTk5MSUJfQVJHX0NIS19QVFIocF9pbnAsIC0xKTsKLS0gIFhBX05OTElCX0FSR19DSEtfUFRSKHBfYmlhcywgLTEpOwotICAgLyogUG9pbnRlciBhbGlnbm1lbnQgY2hlY2tzICovCi0gI2lmIDAKLSAgIFhBX05OTElCX0FSR19DSEtfQUxJR04ocF9vdXQsIEFMSUdOTUVOVCwgLTEpOwotQEAgLTMxMCw3ICszMDksOCBAQCBXT1JEMzIgeGFfbm5fZnVsbHlfY29ubmVjdGVkX3N5bThzeGFzeW04c19hc3ltOHMKLSAgIFhBX05OTElCX0FSR19DSEtfQUxJR04ocF9vdXQsIHNpemVvZihXT1JEOCksIC0xKTsKLSAgIFhBX05OTElCX0FSR19DSEtfQUxJR04ocF93ZWlnaHQsIHNpemVvZihXT1JEOCksIC0xKTsKLSAgIFhBX05OTElCX0FSR19DSEtfQUxJR04ocF9pbnAsIHNpemVvZihXT1JEOCksIC0xKTsKLS0gIFhBX05OTElCX0FSR19DSEtfQUxJR04ocF9iaWFzLCBzaXplb2YoV09SRDMyKSwgLTEpOwotKyAgaWYgKHBfYmlhcyAhPSBOVUxMKQotKyAgICBYQV9OTkxJQl9BUkdfQ0hLX0FMSUdOKHBfYmlhcywgc2l6ZW9mKFdPUkQzMiksIC0xKTsKLSAjZW5kaWYKLSAgIC8qIEJhc2ljIFBhcmFtZXRlciBjaGVja3MgKi8KLSAgIFhBX05OTElCX0FSR19DSEtfQ09ORCgob3V0X2RlcHRoIDw9IDApLCAtMSk7Ci1kaWZmIC0tZ2l0IGEvYWxnby9rZXJuZWxzL21hdFh2ZWMvaGlmaTUveGFfbm5fbWF0WHZlY19zeW04c3hhc3ltOHMuYyBiL2FsZ28va2VybmVscy9tYXRYdmVjL2hpZmk1L3hhX25uX21hdFh2ZWNfc3ltOHN4YXN5bThzLmMKLWluZGV4IDUzNTBjYmUuLmE5MWUwNDMgMTAwNjQ0Ci0tLS0gYS9hbGdvL2tlcm5lbHMvbWF0WHZlYy9oaWZpNS94YV9ubl9tYXRYdmVjX3N5bThzeGFzeW04cy5jCi0rKysgYi9hbGdvL2tlcm5lbHMvbWF0WHZlYy9oaWZpNS94YV9ubl9tYXRYdmVjX3N5bThzeGFzeW04cy5jCi1AQCAtNzA0LDcgKzcwNCw4IEBAIFdPUkQzMiB4YV9ubl9tYXRYdmVjX3N5bThzeGFzeW04c19hc3ltOHMoCi0gICBYQV9OTkxJQl9BUkdfQ0hLX1BUUihwX21hdDEsIC0xKTsKLSAgIFhBX05OTElCX0FSR19DSEtfUFRSKHBfdmVjMSwgLTEpOwotICAgLyogUG9pbnRlciBhbGlnbm1lbnQgY2hlY2tzICovCi0tICBYQV9OTkxJQl9BUkdfQ0hLX0FMSUdOKHBfYmlhcywgc2l6ZW9mKFdPUkQzMiksIC0xKTsKLSsgIGlmIChwX2JpYXMgIT0gTlVMTCkKLSsgICAgWEFfTk5MSUJfQVJHX0NIS19BTElHTihwX2JpYXMsIHNpemVvZihXT1JEMzIpLCAtMSk7Ci0gICAvKiBCYXNpYyBQYXJhbWV0ZXIgY2hlY2tzICovCi0gICBYQV9OTkxJQl9BUkdfQ0hLX0NPTkQoKHJvd3MgPD0gMCksIC0xKTsKLSAgIFhBX05OTElCX0FSR19DSEtfQ09ORCgoY29sczEgPD0gMCksIC0xKTsKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2V4dF9saWJzL3hpX3RmbG1saWJfdmlzaW9uX3A2LnBhdGNoIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvZXh0X2xpYnMveGlfdGZsbWxpYl92aXNpb25fcDYucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdkZjUyZgotLS0gL2Rldi9udWxsCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2V4dF9saWJzL3hpX3RmbG1saWJfdmlzaW9uX3A2LnBhdGNoCkBAIC0wLDAgKzEsMjggQEAKK0Zyb20gZWQ5MjUyOWE2YmU3YTkxMDQ2MjU1OGVkY2YxMDA3MGZiYjBmMjg3MCBNb24gU2VwIDE3IDAwOjAwOjAwIDIwMDEKK0Zyb206IFJ5YW4gS3Vlc3RlciA8a3Vlc3RlckBiZHRpLmNvbT4KK0RhdGU6IFRodSwgMSBBdWcgMjAyNCAxMjo0ODoxMiAtMDUwMAorU3ViamVjdDogW1BBVENIXSBmaXg6IHVzZSA8Y2xpbWl0cz4gaW5zdGVhZCBvZiA8bGltaXRzPiB0byBhY2Nlc3MgSU5UX01BWCBhbmQKKyBmcmllbmRzCisKK0ZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIEMrKyBsaWJyYXJ5IHN0YW5kYXJkLCB1c2UgdGhlIGhlYWRlciwKKzxjbGltaXRzPiwgdG8gYWNjZXNzIGNvbnN0YW50cyBzdWNoIGFzIElOVF9NQVguCistLS0KKyBydW50aW1lL2luY2x1ZGUvY25ucnRfeGkuaCB8IDIgKy0KKyAxIGZpbGUgY2hhbmdlZCwgMSBpbnNlcnRpb24oKyksIDEgZGVsZXRpb24oLSkKKworZGlmZiAtLWdpdCBhL3J1bnRpbWUvaW5jbHVkZS9jbm5ydF94aS5oIGIvcnVudGltZS9pbmNsdWRlL2NubnJ0X3hpLmgKK2luZGV4IGYzYTkxMWUuLjAwYzc0YjggMTAwNjQ0CistLS0gYS9ydW50aW1lL2luY2x1ZGUvY25ucnRfeGkuaAorKysrIGIvcnVudGltZS9pbmNsdWRlL2NubnJ0X3hpLmgKK0BAIC0yNSw3ICsyNSw3IEBACisgIyAgZGVmaW5lIElOQ0xVREVfWElfQ05ODQorICNlbmRpZg0KKyANCistI2luY2x1ZGUgPGxpbWl0cz4NCisrI2luY2x1ZGUgPGNsaW1pdHM+DQorICNpbmNsdWRlICJ4aV9hcGkuaCINCisgI2luY2x1ZGUgInhpX2Nubl9hcGkuaCINCisgI2luY2x1ZGUgInhpX3RpbGVfbWFuYWdlci5oIg0KKy0tIAorMi40My4wCisKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2V4dF9saWJzL3h0ZW5zYS5pbmMgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9leHRfbGlicy94dGVuc2EuaW5jCmluZGV4IDNiMjgyNjcuLjcwZTE4ODAgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2V4dF9saWJzL3h0ZW5zYS5pbmMKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvZXh0X2xpYnMveHRlbnNhLmluYwpAQCAtMSw5ICsxLDEyIEBACisKICMgRXhwbGljaXRseSBhZGQga2VybmVsIHNvdXJjZXMgc3BlY2lmaWMgdG8gdGhlIFh0ZW5zYSBvcHRpbWl6ZWQKICMgaW1wbGVtZW50YXRpb25zLgogTUlDUk9MSVRFX0NDX0tFUk5FTF9TUkNTICs9IFwKICAgJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL2FkZF92aXNpb24uY2MgXAorICAkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvY29udl9jb21tb25feHRlbnNhLmNjIFwKICAgJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2tlcm5lbHMveHRlbnNhL2NvbnZfaGlmaS5jYyBcCiAgICQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9jb252X2ludDE2X3JlZmVyZW5jZS5jYyBcCisgICQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9jb252X2ludDhfaW50MTYuY2MgXAogICAkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvY29udl9pbnQ4X3JlZmVyZW5jZS5jYyBcCiAgICQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9jb252X3Zpc2lvbi5jYyBcCiAgICQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9kZXB0aHdpc2VfY29udl9oaWZpLmNjIFwKQEAgLTI1LDEyICsyOCwyNSBAQAogICAgICQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9rZXJuZWxzL3h0ZW5zYS9oaWZpbWluaS9zdmRmLmNjIFwKICAgICAkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8va2VybmVscy94dGVuc2EvaGlmaW1pbmkvZnVsbHlfY29ubmVjdGVkLmNjCiAKKyAgRkZUX1BBVEggOj0gJChNQUtFRklMRV9ESVIpL2Rvd25sb2Fkcy9oaWZpX2ZmdAorICBJTkNMVURFUyArPSAtSSQoRkZUX1BBVEgpLworCisgIFRISVJEX1BBUlRZX0tFUk5FTF9DQ19TUkNTICs9IFwKKyAgICAkKHNoZWxsIGZpbmQgJChGRlRfUEFUSCkvaGlmaTJfZmZ0IC1uYW1lICIqLmMiKQorICBUSElSRF9QQVJUWV9DQ19IRFJTICs9IFwKKyAgICAkKHNoZWxsIGZpbmQgJChGRlRfUEFUSCkvaGlmaTJfZmZ0IC1uYW1lICIqLmgiKQorCiBlbHNlIGlmZXEgKCQoVEFSR0VUX0FSQ0gpLCBoaWZpNSkKICAgRE9XTkxPQURfUkVTVUxUIDo9ICQoc2hlbGwgJChNQUtFRklMRV9ESVIpL2V4dF9saWJzL3h0ZW5zYV9kb3dubG9hZC5zaCAke0RPV05MT0FEU19ESVJ9IGhpZmk1ICQoVEVOU09SRkxPV19ST09UKSkKICAgaWZuZXEgKCQoRE9XTkxPQURfUkVTVUxUKSwgU1VDQ0VTUykKICAgICAkKGVycm9yIFNvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggdGhlIHh0ZW5zYSBkb3dubG9hZDogJChET1dOTE9BRF9SRVNVTFQpKQogICBlbmRpZgogCisgIERPV05MT0FEX1JFU1VMVCA6PSAkKHNoZWxsICQoTUFLRUZJTEVfRElSKS9leHRfbGlicy94dGVuc2FfbmRzcF9kb3dubG9hZC5zaCAke0RPV05MT0FEU19ESVJ9IGhpZmk1ICQoVEVOU09SRkxPV19ST09UKSkKKyAgaWZuZXEgKCQoRE9XTkxPQURfUkVTVUxUKSwgU1VDQ0VTUykKKyAgICAkKGVycm9yIFNvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggdGhlIHh0ZW5zYSBuZHNwIGRvd25sb2FkOiAkKERPV05MT0FEX1JFU1VMVCkpCisgIGVuZGlmCisKICAgIyBUT0RPKGIvMTYxNDg5MjUyKTogLVduby1zaGFkb3cgaXMgb25seSBuZWVkZWQgZm9yIHhhbm5saWIuIEJ1dCBzaW5jZSB3ZSBkbwogICAjIG5vdCBoYXZlIHNlcGFyYXRlIGNmbGFncyAob3IgdGhlIGNvbmNlcHQgb2YgbW9kdWxhciBidWlsZCB0YXJnZXRzKSB3aXRoIHRoZQogICAjIE1ha2VmaWxlLCAtV25vLXNoYWRvdyB3aWxsIGJlIHVzZWQgZm9yIGV2ZXJ5dGhpbmcuCkBAIC00MywxMCArNTksMTkgQEAKICAgQ1hYRkxBR1MgKz0gJChQTEFURk9STV9GTEFHUykKIAogICBOTkxJQl9QQVRIIDo9ICQoTUFLRUZJTEVfRElSKS9kb3dubG9hZHMveGFfbm5saWJfaGlmaTUKKyAgTkRTUExJQl9QQVRIIDo9ICQoTUFLRUZJTEVfRElSKS9kb3dubG9hZHMvbmRzcGxpYi1oaWZpNQogCiAgIFRISVJEX1BBUlRZX0tFUk5FTF9DQ19TUkNTICs9IFwKICAgICAkKHNoZWxsIGZpbmQgJChOTkxJQl9QQVRIKSAtbmFtZSAiKi5jIikKIAorICAjIFRoZSBORFNQIGxpYnJhcnkgaGFzIGEgbG90IG9mIGZpbGUuIEFkZCBhcyBuZWVkZWQuCisgIFRISVJEX1BBUlRZX0tFUk5FTF9DQ19TUkNTICs9IFwKKyAgICAkKHNoZWxsIGZpbmQgJChORFNQTElCX1BBVEgpL2xpYnJhcnkvZmZ0L2ZmdCAtbmFtZSAiKi5jIikgXAorICAgICQoc2hlbGwgZmluZCAkKE5EU1BMSUJfUEFUSCkvbGlicmFyeS9mZnQvZmZ0X2llIC1uYW1lICIqLmMiKSBcCisgICAgJChzaGVsbCBmaW5kICQoTkRTUExJQl9QQVRIKS9saWJyYXJ5L2ZmdC9mZnRfaWVmIC1uYW1lICIqLmMiKSBcCisgICAgJChzaGVsbCBmaW5kICQoTkRTUExJQl9QQVRIKS9saWJyYXJ5L3R3aWRkbGVzIC1uYW1lICIqLmMiKSBcCisgICAgJChzaGVsbCBmaW5kICQoTkRTUExJQl9QQVRIKS9saWJyYXJ5IC1uYW1lICJ2ZXJzaW9uLmMiKQorCiAgIEVYQ0xVREVEX05OTElCX1NSQ1MgPSBcCiAgICAgJChOTkxJQl9QQVRIKS9hbGdvL2xheWVycy9jbm4vc3JjL3hhX25uX2Nubl9hcGkuYyBcCiAgICAgJChOTkxJQl9QQVRIKS9hbGdvL2xheWVycy9ncnUvc3JjL3hhX25uX2dydV9hcGkuYyBcCkBAIC01NSw3ICs4MCw4IEBACiAgIFRISVJEX1BBUlRZX0tFUk5FTF9DQ19TUkNTIDo9ICQoZmlsdGVyLW91dCAkKEVYQ0xVREVEX05OTElCX1NSQ1MpLCAkKFRISVJEX1BBUlRZX0tFUk5FTF9DQ19TUkNTKSkKIAogICBUSElSRF9QQVJUWV9DQ19IRFJTICs9IFwKLSAgICAkKHNoZWxsIGZpbmQgJChOTkxJQl9QQVRIKSAtbmFtZSAiKi5oIikKKyAgICAkKHNoZWxsIGZpbmQgJChOTkxJQl9QQVRIKSAtbmFtZSAiKi5oIikgXAorICAgICQoc2hlbGwgZmluZCAkKE5EU1BMSUJfUEFUSCkgLW5hbWUgIiouaCIpCiAKICAgSU5DTFVERVMgKz0gXAogICAgIC1JJChOTkxJQl9QQVRIKS8gXApAQCAtNjMsMTUgKzg5LDIwIEBACiAgICAgLUkkKE5OTElCX1BBVEgpL2luY2x1ZGUvbm5saWIvIFwKICAgICAtSSQoTk5MSUJfUEFUSCkvaW5jbHVkZS8gXAogICAgIC1JJChOTkxJQl9QQVRIKS9hbGdvL2NvbW1vbi9pbmNsdWRlLyBcCi0gICAgLUkkKE5OTElCX1BBVEgpL2FsZ28vbmRzcC9oaWZpNS9pbmNsdWRlLwotCi1lbHNlIGlmZXEgKCQoVEFSR0VUX0FSQ0gpLCBoaWZpNCkKLQorICAgIC1JJChORFNQTElCX1BBVEgpL2xpYnJhcnkvaW5jbHVkZS8gXAorICAgIC1JJChORFNQTElCX1BBVEgpL2xpYnJhcnkvaW5jbHVkZV9wcml2YXRlLworZWxzZSBpZmVxICgkKFRBUkdFVF9BUkNIKSwgJChmaWx0ZXIgJChUQVJHRVRfQVJDSCksIGhpZmkzIGhpZmk0KSkKKyAgIyBOTkxpYiBoaWZpNCBhbHNvIHN1cHBvcnRzIGhpZmkzCiAgIERPV05MT0FEX1JFU1VMVCA6PSAkKHNoZWxsICQoTUFLRUZJTEVfRElSKS9leHRfbGlicy94dGVuc2FfZG93bmxvYWQuc2ggJHtET1dOTE9BRFNfRElSfSBoaWZpNCAkKFRFTlNPUkZMT1dfUk9PVCkpCiAgIGlmbmVxICgkKERPV05MT0FEX1JFU1VMVCksIFNVQ0NFU1MpCiAgICAgJChlcnJvciBTb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIHRoZSB4dGVuc2EgZG93bmxvYWQ6ICQoRE9XTkxPQURfUkVTVUxUKSkKICAgZW5kaWYKIAorICBET1dOTE9BRF9SRVNVTFQgOj0gJChzaGVsbCAkKE1BS0VGSUxFX0RJUikvZXh0X2xpYnMveHRlbnNhX25kc3BfZG93bmxvYWQuc2ggJHtET1dOTE9BRFNfRElSfSAkKFRBUkdFVF9BUkNIKSAkKFRFTlNPUkZMT1dfUk9PVCkpCisgIGlmbmVxICgkKERPV05MT0FEX1JFU1VMVCksIFNVQ0NFU1MpCisgICAgJChlcnJvciBTb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIHRoZSB4dGVuc2EgbmRzcCBkb3dubG9hZDogJChET1dOTE9BRF9SRVNVTFQpKQorICBlbmRpZgorCiAgICMgVE9ETyhiLzE2MTQ4OTI1Mik6IC1Xbm8tc2hhZG93IGlzIG9ubHkgbmVlZGVkIGZvciB4YW5ubGliLiBCdXQgc2luY2Ugd2UgZG8KICAgIyBub3QgaGF2ZSBzZXBhcmF0ZSBjZmxhZ3MgKG9yIHRoZSBjb25jZXB0IG9mIG1vZHVsYXIgYnVpbGQgdGFyZ2V0cykgd2l0aCB0aGUKICAgIyBNYWtlZmlsZSwgLVduby1zaGFkb3cgd2lsbCBiZSB1c2VkIGZvciBldmVyeXRoaW5nLgpAQCAtODMsMjAgKzExNCw0NCBAQAogICBDQ0ZMQUdTICs9ICQoUExBVEZPUk1fRkxBR1MpCiAgIENYWEZMQUdTICs9ICQoUExBVEZPUk1fRkxBR1MpCiAKKyAgIyBOTkxpYiBmb3IgaGlmaTQgYWxzbyBzdXBwb3J0cyBoaWZpMwogICBOTkxJQl9QQVRIIDo9ICQoTUFLRUZJTEVfRElSKS9kb3dubG9hZHMveGFfbm5saWJfaGlmaTQKKyAgTkRTUExJQl9QQVRIIDo9ICQoTUFLRUZJTEVfRElSKS9kb3dubG9hZHMvbmRzcGxpYi0kKFRBUkdFVF9BUkNIKQogCiAgIFRISVJEX1BBUlRZX0tFUk5FTF9DQ19TUkNTICs9IFwKICAgICAkKHNoZWxsIGZpbmQgJChOTkxJQl9QQVRIKSAtbmFtZSAiKi5jIikKIAorICAjIFRoZSBORFNQIGxpYnJhcnkgaGFzIGEgbG90IG9mIGZpbGUuIEFkZCBhcyBuZWVkZWQuCisgIFRISVJEX1BBUlRZX0tFUk5FTF9DQ19TUkNTICs9IFwKKyAgICAkKHNoZWxsIGZpbmQgJChORFNQTElCX1BBVEgpL2xpYnJhcnkvZmZ0L2ZmdCAtbmFtZSAiKi5jIikgXAorICAgICQoc2hlbGwgZmluZCAkKE5EU1BMSUJfUEFUSCkvbGlicmFyeS9mZnQvZmZ0X2llIC1uYW1lICIqLmMiKSBcCisgICAgJChzaGVsbCBmaW5kICQoTkRTUExJQl9QQVRIKS9saWJyYXJ5L2ZmdC9mZnRfaWVmIC1uYW1lICIqLmMiKSBcCisgICAgJChzaGVsbCBmaW5kICQoTkRTUExJQl9QQVRIKS9saWJyYXJ5L3R3aWRkbGVzIC1uYW1lICIqLmMiKSBcCisgICAgJChzaGVsbCBmaW5kICQoTkRTUExJQl9QQVRIKS9saWJyYXJ5IC1uYW1lICJ2ZXJzaW9uLmMiKQorCiAgIEVYQ0xVREVEX05OTElCX1NSQ1MgPSBcCiAgICAgJChOTkxJQl9QQVRIKS9hbGdvL2xheWVycy9jbm4vc3JjL3hhX25uX2Nubl9hcGkuYyBcCiAgICAgJChOTkxJQl9QQVRIKS9hbGdvL2xheWVycy9ncnUvc3JjL3hhX25uX2dydV9hcGkuYyBcCiAgICAgJChOTkxJQl9QQVRIKS9hbGdvL2xheWVycy9sc3RtL3NyYy94YV9ubl9sc3RtX2FwaS5jCiAKKyAgaWZlcSAoJChUQVJHRVRfQVJDSCksIGhpZmkzKQorICAgIEVYQ0xVREVEX05OTElCX1NSQ1MgKz0gXAorICAgICAgJChOTkxJQl9QQVRIKS9hbGdvL25kc3AvaGlmaTQvc3JjL3BvdzJmX3RibC5jIFwKKyAgICAgICQoTk5MSUJfUEFUSCkvYWxnby9uZHNwL2hpZmk0L3NyYy9zY2xfdGFuaGZfaGlmaTQuYyBcCisgICAgICAkKE5OTElCX1BBVEgpL2FsZ28vbmRzcC9oaWZpNC9zcmMvdmVjX3RhbmhmX2hpZmk0LmMgXAorICAgICAgJChOTkxJQl9QQVRIKS9hbGdvL25kc3AvaGlmaTQvc3JjL3RhbmhmX3RibC5jCisgIGVuZGlmCisgIAorICBpZmVxICgkKFRBUkdFVF9BUkNIKSwgaGlmaTQpCisgICAgRVhDTFVERURfTk5MSUJfU1JDUyArPSBcCisgICAgICAkKE5OTElCX1BBVEgpL2FsZ28va2VybmVscy9hY3RpdmF0aW9ucy9oaWZpNC94YV9ubl9hY3RpdmF0aW9uc19hc3ltOF9hc3ltOC5jCisgIGVuZGlmCisKICAgVEhJUkRfUEFSVFlfS0VSTkVMX0NDX1NSQ1MgOj0gJChmaWx0ZXItb3V0ICQoRVhDTFVERURfTk5MSUJfU1JDUyksICQoVEhJUkRfUEFSVFlfS0VSTkVMX0NDX1NSQ1MpKQogCiAgIFRISVJEX1BBUlRZX0NDX0hEUlMgKz0gXAotICAgICQoc2hlbGwgZmluZCAkKE5OTElCX1BBVEgpIC1uYW1lICIqLmgiKQorICAgICQoc2hlbGwgZmluZCAkKE5OTElCX1BBVEgpIC1uYW1lICIqLmgiKSBcCisgICAgJChzaGVsbCBmaW5kICQoTkRTUExJQl9QQVRIKSAtbmFtZSAiKi5oIikKIAogICBJTkNMVURFUyArPSBcCiAgICAgLUkkKE5OTElCX1BBVEgpLyBcCkBAIC0xMDQsNyArMTU5LDggQEAKICAgICAtSSQoTk5MSUJfUEFUSCkvaW5jbHVkZS9ubmxpYi8gXAogICAgIC1JJChOTkxJQl9QQVRIKS9pbmNsdWRlLyBcCiAgICAgLUkkKE5OTElCX1BBVEgpL2FsZ28vY29tbW9uL2luY2x1ZGUvIFwKLSAgICAtSSQoTk5MSUJfUEFUSCkvYWxnby9uZHNwL2hpZmk0L2luY2x1ZGUvCisgICAgLUkkKE5EU1BMSUJfUEFUSCkvbGlicmFyeS9pbmNsdWRlLyBcCisgICAgLUkkKE5EU1BMSUJfUEFUSCkvbGlicmFyeS9pbmNsdWRlX3ByaXZhdGUvCiAKIGVsc2UgaWZlcSAoJChUQVJHRVRfQVJDSCksIHZpc2lvbl9wNikKICAgRE9XTkxPQURfUkVTVUxUIDo9ICQoc2hlbGwgJChNQUtFRklMRV9ESVIpL2V4dF9saWJzL3h0ZW5zYV9kb3dubG9hZC5zaCAke0RPV05MT0FEU19ESVJ9IHZpc2lvbl9wNiAkKFRFTlNPUkZMT1dfUk9PVCkpCkBAIC0xMzksMjEgKzE5NSwzIEBACiBlbHNlCiAgICQoZXJyb3IgVW5zdXBwb3J0ZWQgVEFSR0VUX0FSQ0g9JChUQVJHRVRfQVJDSCkpCiBlbmRpZgotCi1GRlRfUEFUSCA6PSAkKE1BS0VGSUxFX0RJUikvZG93bmxvYWRzL2hpZmlfZmZ0Ci0KLUlOQ0xVREVTICs9IC1JJChGRlRfUEFUSCkvCi0KLWlmZXEgKCQoVEFSR0VUX0FSQ0gpLCAkKGZpbHRlciAkKFRBUkdFVF9BUkNIKSwgaGlmaTMgaGlmaTQgaGlmaTUpKQotVEhJUkRfUEFSVFlfS0VSTkVMX0NDX1NSQ1MgKz0gXAotICAgICQoc2hlbGwgZmluZCAkKEZGVF9QQVRIKS9oaWZpM19mZnQgLW5hbWUgIiouYyIpCi0KLVRISVJEX1BBUlRZX0NDX0hEUlMgKz0gXAotICAgICQoc2hlbGwgZmluZCAkKEZGVF9QQVRIKS9oaWZpM19mZnQgLW5hbWUgIiouaCIpCi1lbHNlIGlmZXEgKCQoVEFSR0VUX0FSQ0gpLCBoaWZpbWluaSkKLVRISVJEX1BBUlRZX0tFUk5FTF9DQ19TUkNTICs9IFwKLSAgICAkKHNoZWxsIGZpbmQgJChGRlRfUEFUSCkvaGlmaTJfZmZ0IC1uYW1lICIqLmMiKQotCi1USElSRF9QQVJUWV9DQ19IRFJTICs9IFwKLSAgICAkKHNoZWxsIGZpbmQgJChGRlRfUEFUSCkvaGlmaTJfZmZ0IC1uYW1lICIqLmgiKQotZW5kaWYKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2V4dF9saWJzL3h0ZW5zYV9kb3dubG9hZC5zaCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2V4dF9saWJzL3h0ZW5zYV9kb3dubG9hZC5zaAppbmRleCBmYjQ1MTIzLi45NzI2OTgwIDEwMDc1NQotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9leHRfbGlicy94dGVuc2FfZG93bmxvYWQuc2gKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvZXh0X2xpYnMveHRlbnNhX2Rvd25sb2FkLnNoCkBAIC0xLDUgKzEsNSBAQAogIyEvYmluL2Jhc2gKLSMgQ29weXJpZ2h0IDIwMTkgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMgQ29weXJpZ2h0IDIwMjQgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICMKICMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KQEAgLTM4LDIzICszOCwyNiBAQAogc291cmNlICR7M310ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9iYXNoX2hlbHBlcnMuc2gKIAogRE9XTkxPQURTX0RJUj0kezF9Ci1pZiBbICEgLWQgJHtET1dOTE9BRFNfRElSfSBdOyB0aGVuCi0gIGVjaG8gIlRoZSB0b3AtbGV2ZWwgZG93bmxvYWRzIGRpcmVjdG9yeTogJHtET1dOTE9BRFNfRElSfSBkb2VzIG5vdCBleGlzdC4iCi0gIGV4aXQgMQotZmkKK1BBVENIPSIiCiAKLWlmIFtbICR7Mn0gPT0gImhpZmk0IiBdXTsgdGhlbgotICBMSUJSQVJZX1VSTD0iaHR0cDovL2dpdGh1Yi5jb20vZm9zcy14dGVuc2Evbm5saWItaGlmaTQvcmF3L21hc3Rlci9hcmNoaXZlL3hhX25ubGliX2hpZmk0XzEwXzE0XzIwMjIuemlwIgoraWYgW1sgJHsyfSA9PSAiaGlmaTMiIF1dOyB0aGVuCisgIExJQlJBUllfVVJMPSJodHRwOi8vZ2l0aHViLmNvbS9mb3NzLXh0ZW5zYS9ubmxpYi1oaWZpNC9yYXcvbWFzdGVyL2FyY2hpdmUveGFfbm5saWJfaGlmaTRfMDlfMDVfMjAyMy56aXAiCiAgIExJQlJBUllfRElSTkFNRT0ieGFfbm5saWJfaGlmaTQiCi0gIExJQlJBUllfTUQ1PSIyYmYzYzFjN2ZkNWEyM2YxNTdiYWJjOGUyNGZkMmM1NSIKKyAgTElCUkFSWV9NRDU9IjJhNTRlMDU2YWVmNzNhNGZjZmZkZTQ2NDM5OTg1MDFhIgorZWxpZiBbWyAkezJ9ID09ICJoaWZpNCIgXV07IHRoZW4KKyAgTElCUkFSWV9VUkw9Imh0dHA6Ly9naXRodWIuY29tL2Zvc3MteHRlbnNhL25ubGliLWhpZmk0L3Jhdy9tYXN0ZXIvYXJjaGl2ZS94YV9ubmxpYl9oaWZpNF8wOV8wNV8yMDIzLnppcCIKKyAgTElCUkFSWV9ESVJOQU1FPSJ4YV9ubmxpYl9oaWZpNCIKKyAgTElCUkFSWV9NRDU9IjJhNTRlMDU2YWVmNzNhNGZjZmZkZTQ2NDM5OTg1MDFhIgorICBQQVRDSD0iLi4vLi4vZXh0X2xpYnMveGFfbm5saWJfaGlmaTQucGF0Y2giCiBlbGlmIFtbICR7Mn0gPT0gImhpZmk1IiBdXTsgdGhlbgotICBMSUJSQVJZX1VSTD0iaHR0cDovL2dpdGh1Yi5jb20vZm9zcy14dGVuc2Evbm5saWItaGlmaTUvcmF3L21hc3Rlci9hcmNoaXZlL3hhX25ubGliX2hpZmk1XzEyXzE5XzIwMjIuemlwIgorICBMSUJSQVJZX1VSTD0iaHR0cDovL2dpdGh1Yi5jb20vZm9zcy14dGVuc2Evbm5saWItaGlmaTUvcmF3L21hc3Rlci9hcmNoaXZlL3hhX25ubGliX2hpZmk1XzA5XzA1XzIwMjMuemlwIgogICBMSUJSQVJZX0RJUk5BTUU9InhhX25ubGliX2hpZmk1IgotICBMSUJSQVJZX01ENT0iODMzMDY4MDkxOTFmNDJhMDY0YmRlNjg4Yjk0ZTFlYjEiCisgIExJQlJBUllfTUQ1PSIxZGViNTVlZjIwMGJmNWRiZWRjNzBiOTliMDIxNDBjMCIKIGVsaWYgW1sgJHsyfSA9PSAidmlzaW9uX3A2IiBdXTsgdGhlbgogICBMSUJSQVJZX1VSTD0iaHR0cHM6Ly9naXRodWIuY29tL2Zvc3MteHRlbnNhL3RmbG1saWJfdmlzaW9uL3Jhdy9tYWluL2FyY2hpdmUveGlfdGZsbWxpYl92aXNpb25fcDZfMjJfMDZfMjkuemlwIgogICBMSUJSQVJZX0RJUk5BTUU9InhpX3RmbG1saWJfdmlzaW9uX3A2IgogICBMSUJSQVJZX01ENT0iZmVhMzcyMGQ3NmZkYjNhNWEzMzdhY2U3YjYwODFiNTYiCisgIFBBVENIPSIuLi8uLi9leHRfbGlicy94aV90ZmxtbGliX3Zpc2lvbl9wNi5wYXRjaCIKIGVsc2UKICAgZWNobyAiQXR0ZW1wdGluZyB0byBkb3dubG9hZCBhbiB1bnN1cHBvcnRlZCB4dGVuc2EgdmFyaWFudDogJHsyfSIKICAgZXhpdCAxCkBAIC02MiwzNSArNjUsMzAgQEAKIAogTElCUkFSWV9JTlNUQUxMX1BBVEg9JHtET1dOTE9BRFNfRElSfS8ke0xJQlJBUllfRElSTkFNRX0KIAotaWYgWyAtZCAke0xJQlJBUllfSU5TVEFMTF9QQVRIfSBdOyB0aGVuCitzaG91bGRfZG93bmxvYWQ9JChjaGVja19zaG91bGRfZG93bmxvYWQgJHtET1dOTE9BRFNfRElSfSkKKworaWYgW1sgJHtzaG91bGRfZG93bmxvYWR9ID09ICJubyIgXV07IHRoZW4KKyAgc2hvd19kb3dubG9hZF91cmxfbWQ1ICR7TElCUkFSWV9VUkx9ICR7TElCUkFSWV9NRDV9CitlbGlmIFsgISAtZCAke0RPV05MT0FEU19ESVJ9IF07IHRoZW4KKyAgZWNobyAiVGhlIHRvcC1sZXZlbCBkb3dubG9hZHMgZGlyZWN0b3J5OiAke0RPV05MT0FEU19ESVJ9IGRvZXMgbm90IGV4aXN0LiIKKyAgZXhpdCAxCitlbGlmIFsgLWQgJHtMSUJSQVJZX0lOU1RBTExfUEFUSH0gXTsgdGhlbgogICBlY2hvID4mMiAiJHtMSUJSQVJZX0lOU1RBTExfUEFUSH0gYWxyZWFkeSBleGlzdHMsIHNraXBwaW5nIHRoZSBkb3dubG9hZC4iCiBlbHNlCiAgIFRFTVBESVI9IiQobWt0ZW1wIC1kKSIKICAgVEVNUEZJTEU9IiR7VEVNUERJUn0vJHtMSUJSQVJZX0RJUk5BTUV9LnppcCIKICAgd2dldCAke0xJQlJBUllfVVJMfSAtTyAiJFRFTVBGSUxFIiA+JjIKLSAgTUQ1PWBtZDVzdW0gIiRURU1QRklMRSIgfCBhd2sgJ3twcmludCAkMX0nYAorICBjaGVja19tZDUgIiR7VEVNUEZJTEV9IiAke0xJQlJBUllfTUQ1fQogCi0gIGlmIFtbICR7TUQ1fSAhPSAke0xJQlJBUllfTUQ1fSBdXQotICB0aGVuCi0gICAgZWNobyAiQmFkIGNoZWNrc3VtLiBFeHBlY3RlZDogJHtMSUJSQVJZX01ENX0sIEdvdDogJHtNRDV9IgotICAgIGV4aXQgMQotICBmaQorICB1bnppcCAtcW8gIiRURU1QRklMRSIgLWQgJHtET1dOTE9BRFNfRElSfSA+JjIKIAotICAjIENoZWNrIGlmIGFub3RoZXIgbWFrZSBwcm9jZXNzIGhhcyBhbHJlYWR5IGV4dHJhY3RlZCB0aGUgZG93bmxvYWRlZCBmaWxlcy4KLSAgIyBJZiBzbywgc2tpcCBleHRyYWN0aW5nIGFuZCBwYXRjaGluZy4KLSAgaWYgWyAtZCAke0xJQlJBUllfSU5TVEFMTF9QQVRIfSBdOyB0aGVuCi0gICAgZWNobyA+JjIgIiR7TElCUkFSWV9JTlNUQUxMX1BBVEh9IGFscmVhZHkgZXhpc3RzLCBza2lwcGluZyB0aGUgZXh0cmFjdGlvbi4iCi0gIGVsc2UKLSAgICB1bnppcCAtcW8gIiRURU1QRklMRSIgLWQgJHtET1dOTE9BRFNfRElSfSA+JjIKKyAgcm0gLXJmICIke1RFTVBESVJ9IgogCi0gICAgcm0gLXJmICIke1RFTVBESVJ9IgotCi0gICAgcHVzaGQgIiR7TElCUkFSWV9JTlNUQUxMX1BBVEh9IiA+IC9kZXYvbnVsbAotICAgIGNobW9kIC1SICt3IC4vCi0gICAgaWYgW1sgLWYgIi4uLy4uL2V4dF9saWJzL3hhX25ubGliXyR7Mn0ucGF0Y2giIF1dOyB0aGVuCi0gICAgICBjcmVhdGVfZ2l0X3JlcG8gLi8KLSAgICAgIGFwcGx5X3BhdGNoX3RvX2ZvbGRlciAuLyAiLi4vLi4vZXh0X2xpYnMveGFfbm5saWJfJHsyfS5wYXRjaCIgIlRGTE0gcGF0Y2giCi0gICAgZmkKKyAgcHVzaGQgIiR7TElCUkFSWV9JTlNUQUxMX1BBVEh9IiA+IC9kZXYvbnVsbAorICBjaG1vZCAtUiArdyAuLworICBpZiBbICIke1BBVENIfSIgXTsgdGhlbgorICAgIGNyZWF0ZV9naXRfcmVwbyAuLworICAgIGFwcGx5X3BhdGNoX3RvX2ZvbGRlciAuLyAke1BBVENIfSAiVEZMTSBwYXRjaCIKICAgZmkKIGZpCiAKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2V4dF9saWJzL3h0ZW5zYV9uZHNwX2Rvd25sb2FkLnNoIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvZXh0X2xpYnMveHRlbnNhX25kc3BfZG93bmxvYWQuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzFmZTFkMQotLS0gL2Rldi9udWxsCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2V4dF9saWJzL3h0ZW5zYV9uZHNwX2Rvd25sb2FkLnNoCkBAIC0wLDAgKzEsMTAwIEBACisjIS9iaW4vYmFzaAorIyBDb3B5cmlnaHQgMjAyNCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMKKyMgRG93bmxvYWRzIG5lY2Vzc2FyeSB0byBidWlsZCB3aXRoIE9QVElNSVpFRF9LRVJORUxfRElSPXh0ZW5zYS4KKyMKKyMgQ2FsbGVkIHdpdGggZm91ciBhcmd1bWVudHM6CisjIDEgLSBQYXRoIHRvIHRoZSBkb3dubG9hZHMgZm9sZGVyIHdoaWNoIGlzIHR5cGljYWxseQorIyAgICAgJHtURU5TT1JGTE9XX1JPT1R9L3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2Rvd25sb2FkcworIyAyIC0gWHRlbnNhIHZhcmlhbnQgdG8gZG93bmxvYWQgZm9yIChlLmcuIGhpZmk0KQorIyAzIC0gKG9wdGlvbmFsKSBURU5TT1JGTE9XX1JPT1Q6IHBhdGggdG8gcm9vdCBvZiB0aGUgVEZMTSB0cmVlIChyZWxhdGl2ZSB0byBkaXJlY3RvcnkgZnJvbSB3aGVyZSB0aGUgc2NyaXB0IGlzIGNhbGxlZCkuCisjCisjIFRoaXMgc2NyaXB0IGlzIGNhbGxlZCBmcm9tIHRoZSBNYWtlZmlsZSBhbmQgdXNlcyB0aGUgZm9sbG93aW5nIGNvbnZlbnRpb24gdG8KKyMgZW5hYmxlIGRldGVybWluYXRpb24gb2Ygc3VjZXNzL2ZhaWx1cmU6CisjCisjICAgLSBJZiB0aGUgc2NyaXB0IGlzIHN1Y2Nlc3NmdWwsIHRoZSBvbmx5IG91dHB1dCBvbiBzdGRvdXQgc2hvdWxkIGJlIFNVQ0NFU1MuCisjICAgICBUaGUgbWFrZWZpbGUgY2hlY2tzIGZvciB0aGlzIHBhcnRpY3VsYXIgc3RyaW5nLgorIworIyAgIC0gQW55IHN0cmluZyBvbiBzdGRvdXQgdGhhdCBpcyBub3QgU1VDQ0VTUyB3aWxsIGJlIHNob3duIGluIHRoZSBtYWtlZmlsZSBhcworIyAgICAgdGhlIGNhdXNlIGZvciB0aGUgc2NyaXB0IHRvIGhhdmUgZmFpbGVkLgorIworIyAgIC0gQW55IG90aGVyIGluZm9ybWF0aW9uYWwgcHJpbnRzIHNob3VsZCBiZSBvbiBzdGRlcnIuCisKK3NldCAtZQorCitzb3VyY2UgJHszfXRlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2Jhc2hfaGVscGVycy5zaAorCitET1dOTE9BRFNfRElSPSR7MX0KKworaWYgW1sgJHsyfSA9PSAiaGlmaTMiIF1dOyB0aGVuCisgIENPTU1JVD0iZDE3YmYyMDVkYzUzMGE5ZTFhMWQ5NzkyNDk1MjBmNDQwMTUyOWRiMSIKKyAgTElCUkFSWV9ESVJOQU1FPSJuZHNwbGliLWhpZmkzIgorICBMSUJSQVJZX1VSTD0iaHR0cHM6Ly9naXRodWIuY29tL2Zvc3MteHRlbnNhLyR7TElCUkFSWV9ESVJOQU1FfS9hcmNoaXZlLyR7Q09NTUlUfS56aXAiCisgIExJQlJBUllfTUQ1PSI1NTcyYjI3MzYxNzM2YzFmNzczNDc0ZWJhZjQyYzVkNCIKKyAgQ09SRV9OQU1FPSJIaUZpMyIKK2VsaWYgW1sgJHsyfSA9PSAiaGlmaTQiIF1dOyB0aGVuCisgIENPTU1JVD0iYWJhMjQ4NWJhMTJkOTg1MWZhMzk4YmNiNWMxOGMwNWNjMzczMWExNyIKKyAgTElCUkFSWV9ESVJOQU1FPSJuZHNwbGliLWhpZmk0IgorICBMSUJSQVJZX1VSTD0iaHR0cHM6Ly9naXRodWIuY29tL2Zvc3MteHRlbnNhLyR7TElCUkFSWV9ESVJOQU1FfS9hcmNoaXZlLyR7Q09NTUlUfS56aXAiCisgIExJQlJBUllfTUQ1PSIwNjJiOGY5NTdjNjYyYjZhYjgzNGJiZTI4NDIzN2I2YyIKKyAgQ09SRV9OQU1FPSJIaUZpNCIKK2VsaWYgW1sgJHsyfSA9PSAiaGlmaTUiIF1dOyB0aGVuCisgIENPTU1JVD0iMDFjOTJjZWIyNmNjMGE1OThjNmQ4M2QxN2MzZDg4MzYzYmQ4ZjdmYyIKKyAgTElCUkFSWV9ESVJOQU1FPSJuZHNwbGliLWhpZmk1IgorICBMSUJSQVJZX1VSTD0iaHR0cHM6Ly9naXRodWIuY29tL2Zvc3MteHRlbnNhLyR7TElCUkFSWV9ESVJOQU1FfS9hcmNoaXZlLyR7Q09NTUlUfS56aXAiCisgIExJQlJBUllfTUQ1PSI5NGIzNzJkNjA4NzgxYzEzYmUyZmIyZDFhOGZkM2I1OCIKKyAgQ09SRV9OQU1FPSJIaUZpNSIKK2Vsc2UKKyAgZWNobyAiQXR0ZW1wdGluZyB0byBkb3dubG9hZCBhbiB1bnN1cHBvcnRlZCB4dGVuc2EgdmFyaWFudDogJHsyfSIKKyAgZXhpdCAxCitmaQorCitMSUJSQVJZX0lOU1RBTExfUEFUSD0ke0RPV05MT0FEU19ESVJ9LyR7TElCUkFSWV9ESVJOQU1FfQorCitzaG91bGRfZG93bmxvYWQ9JChjaGVja19zaG91bGRfZG93bmxvYWQgJHtET1dOTE9BRFNfRElSfSkKKworaWYgW1sgJHtzaG91bGRfZG93bmxvYWR9ID09ICJubyIgXV07IHRoZW4KKyAgc2hvd19kb3dubG9hZF91cmxfbWQ1ICR7TElCUkFSWV9VUkx9ICR7TElCUkFSWV9NRDV9CitlbGlmIFsgISAtZCAke0RPV05MT0FEU19ESVJ9IF07IHRoZW4KKyAgZWNobyAiVGhlIHRvcC1sZXZlbCBkb3dubG9hZHMgZGlyZWN0b3J5OiAke0RPV05MT0FEU19ESVJ9IGRvZXMgbm90IGV4aXN0LiIKKyAgZXhpdCAxCitlbGlmIFsgLWQgJHtMSUJSQVJZX0lOU1RBTExfUEFUSH0gXTsgdGhlbgorICBlY2hvID4mMiAiJHtMSUJSQVJZX0lOU1RBTExfUEFUSH0gYWxyZWFkeSBleGlzdHMsIHNraXBwaW5nIHRoZSBkb3dubG9hZC4iCitlbHNlCisgIFRFTVBESVI9IiQobWt0ZW1wIC1kKSIKKyAgVEVNUEZJTEU9IiR7VEVNUERJUn0vJHtMSUJSQVJZX0RJUk5BTUV9LnppcCIKKyAgd2dldCAke0xJQlJBUllfVVJMfSAtTyAiJFRFTVBGSUxFIiA+JjIKKyAgY2hlY2tfbWQ1ICIke1RFTVBGSUxFfSIgJHtMSUJSQVJZX01ENX0KKworICB1bnppcCAtcW8gIiRURU1QRklMRSIgLWQgJHtURU1QRElSfSA+JjIKKyAgdW56aXAgLXFvICR7VEVNUERJUn0vJHtMSUJSQVJZX0RJUk5BTUV9LSR7Q09NTUlUfS9ORFNQXyR7Q09SRV9OQU1FfS9ORFNQXyR7Q09SRV9OQU1FfSouemlwIC1kICR7VEVNUERJUn0vJHtMSUJSQVJZX0RJUk5BTUV9LSR7Q09NTUlUfS9ORFNQXyR7Q09SRV9OQU1FfS8gPiYyCisgIGZpbmQgJHtURU1QRElSfS8ke0xJQlJBUllfRElSTkFNRX0tJHtDT01NSVR9L05EU1BfJHtDT1JFX05BTUV9LyogLW1heGRlcHRoIDAgLXR5cGUgZCAtZXhlYyBtdiB7fSAke0xJQlJBUllfSU5TVEFMTF9QQVRIfSBcOworICBybSAtcmYgIiR7VEVNUERJUn0iCisgICMgTkRTUCBzb3VyY2VzIGluIEdpdEh1YiBjdXJyZW50bHkgdXNlcyBET1Mgc3R5bGUgbmV3bGluZXMsIHdoaWNoIGNhdXNlcyBjb21waWxlciBlcnJvcnMuCisgIGZpbmQgJHtMSUJSQVJZX0lOU1RBTExfUEFUSH0gLXR5cGUgZiAtZXhlYyBzZWQgLWkuYmFrICdzL1xyJC8vZycge30gXDsKKworICBwdXNoZCAiJHtMSUJSQVJZX0lOU1RBTExfUEFUSH0iID4gL2Rldi9udWxsCisgIGNobW9kIC1SICt3IC4vCisgIGlmIFtbIC1mICIuLi8uLi9leHRfbGlicy9uZHNwbGliLSR7Mn0ucGF0Y2giIF1dOyB0aGVuCisgICAgY3JlYXRlX2dpdF9yZXBvIC4vCisgICAgYXBwbHlfcGF0Y2hfdG9fZm9sZGVyIC4vICIuLi8uLi9leHRfbGlicy9uZHNwbGliLSR7Mn0ucGF0Y2giICJURkxNIHBhdGNoIgorICBmaQorICAjIFJlbmFtZSB0aGUgc3RyaW5ncyBpbiBfX3JlbmFtaW5nX18uaCB0byBuYW1lcyB0aGF0IGFyZSB0cmFjZWFibGUgdG8gVEZMTS4KKyAgIyBOb3RlIHRoYXQgcmVuYW1pbmcgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBhbmQgbXVzdCBiZSBlbmFibGVkIHdpdGggLURfX1JFTkFNSU5HX18KKyAgc2VkIC1pICdzL05hdHVyZURTUF8vTmF0dXJlRFNQX1RGTE1fLycgbGlicmFyeS9pbmNsdWRlX3ByaXZhdGUvX19yZW5hbWluZ19fLmgKK2ZpCisKK2VjaG8gIlNVQ0NFU1MiCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9mbGF0YnVmZmVycy5wYXRjaCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2ZsYXRidWZmZXJzLnBhdGNoCmluZGV4IGNiMjJjZjAuLjIwMTc3NzUgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2ZsYXRidWZmZXJzLnBhdGNoCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2ZsYXRidWZmZXJzLnBhdGNoCkBAIC0xLDUgKzEsNSBAQAogZGlmZiAtLWdpdCBhL2luY2x1ZGUvZmxhdGJ1ZmZlcnMvYmFzZS5oIGIvaW5jbHVkZS9mbGF0YnVmZmVycy9iYXNlLmgKLWluZGV4IGE1YWMxMGQuLjM3MWI2ZmQgMTAwNjQ0CitpbmRleCA1YzRjYWU3OS4uMWE2MzE2NDEgMTAwNjQ0CiAtLS0gYS9pbmNsdWRlL2ZsYXRidWZmZXJzL2Jhc2UuaAogKysrIGIvaW5jbHVkZS9mbGF0YnVmZmVycy9iYXNlLmgKIEBAIC0xLDYgKzEsMTYgQEAKQEAgLTIwLDEwICsyMCwxMCBAQAogIAogIC8vIElmIGFjdGl2YXRlIHNob3VsZCBiZSBkZWNsYXJlZCBhbmQgaW5jbHVkZWQgZmlyc3QuCiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mbGF0YnVmZmVycy9kZWZhdWx0X2FsbG9jYXRvci5oIGIvaW5jbHVkZS9mbGF0YnVmZmVycy9kZWZhdWx0X2FsbG9jYXRvci5oCi1pbmRleCA4YjE3M2FmLi45NzVkOTM4IDEwMDY0NAoraW5kZXggZDQ3MjQxMjIuLjk3NWQ5MzgwIDEwMDY0NAogLS0tIGEvaW5jbHVkZS9mbGF0YnVmZmVycy9kZWZhdWx0X2FsbG9jYXRvci5oCiArKysgYi9pbmNsdWRlL2ZsYXRidWZmZXJzL2RlZmF1bHRfYWxsb2NhdG9yLmgKLUBAIC0zOSwyNiArMzksMjAgQEAgY2xhc3MgRGVmYXVsdEFsbG9jYXRvciA6IHB1YmxpYyBBbGxvY2F0b3IgeworQEAgLTM5LDI0ICszOSwxOCBAQCBjbGFzcyBEZWZhdWx0QWxsb2NhdG9yIDogcHVibGljIEFsbG9jYXRvciB7CiAgLy8gVGhpcyBpcyB0byBhdm9pZCBoYXZpbmcgYSBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBkZWZhdWx0CiAgLy8gYWxsb2NhdG9yLCBvciBoYXZpbmcgdG8gbW92ZSBpdCBiZXR3ZWVuIHRoZSBjbGFzc2VzIHRoYXQgbWF5IG93biBpdC4KICBpbmxpbmUgdWludDhfdCAqQWxsb2NhdGUoQWxsb2NhdG9yICphbGxvY2F0b3IsIHNpemVfdCBzaXplKSB7CkBAIC01MiwxNSArNTIsMTEgQEAKICB9CiAgCiAgfSAgLy8gbmFtZXNwYWNlIGZsYXRidWZmZXJzCi0gCi0tI2VuZGlmICAvLyBGTEFUQlVGRkVSU19ERUZBVUxUX0FMTE9DQVRPUl9IXwotXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCi0rI2VuZGlmICAvLyBGTEFUQlVGRkVSU19ERUZBVUxUX0FMTE9DQVRPUl9IXwogZGlmZiAtLWdpdCBhL2luY2x1ZGUvZmxhdGJ1ZmZlcnMvZmxleGJ1ZmZlcnMuaCBiL2luY2x1ZGUvZmxhdGJ1ZmZlcnMvZmxleGJ1ZmZlcnMuaAotaW5kZXggODlmM2YzMC4uNmU2ZDBiMyAxMDA2NDQKK2luZGV4IDhlOGNhYzE0Li41MmRhZTMxNiAxMDA2NDQKIC0tLSBhL2luY2x1ZGUvZmxhdGJ1ZmZlcnMvZmxleGJ1ZmZlcnMuaAogKysrIGIvaW5jbHVkZS9mbGF0YnVmZmVycy9mbGV4YnVmZmVycy5oCi1AQCAtNDk2LDkgKzQ5NiwyNCBAQCBjbGFzcyBSZWZlcmVuY2UgeworQEAgLTQ5NSw5ICs0OTUsMjQgQEAgY2xhc3MgUmVmZXJlbmNlIHsKICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGRvdWJsZT4oUmVhZFVJbnQ2NChJbmRpcmVjdCgpLCBieXRlX3dpZHRoXykpOwogICAgICAgICAgY2FzZSBGQlRfTlVMTDogcmV0dXJuIDAuMDsKICAgICAgICAgIGNhc2UgRkJUX1NUUklORzogewpAQCAtODYsMTAgKzgyLDEwIEBACiAgICAgICAgICBjYXNlIEZCVF9WRUNUT1I6IHJldHVybiBzdGF0aWNfY2FzdDxkb3VibGU+KEFzVmVjdG9yKCkuc2l6ZSgpKTsKICAgICAgICAgIGNhc2UgRkJUX0JPT0w6CiBkaWZmIC0tZ2l0IGEvaW5jbHVkZS9mbGF0YnVmZmVycy91dGlsLmggYi9pbmNsdWRlL2ZsYXRidWZmZXJzL3V0aWwuaAotaW5kZXggOTNhMzlkZS4uMWNkNGU4ZiAxMDA2NDQKK2luZGV4IDFjY2YzNTE3Li4zNGE3NTE5MyAxMDA2NDQKIC0tLSBhL2luY2x1ZGUvZmxhdGJ1ZmZlcnMvdXRpbC5oCiArKysgYi9pbmNsdWRlL2ZsYXRidWZmZXJzL3V0aWwuaAotQEAgLTI0LDYgKzI0LDEyIEBACitAQCAtMjMsNiArMjMsMTIgQEAKICAjaW5jbHVkZSAiZmxhdGJ1ZmZlcnMvYmFzZS5oIgogICNpbmNsdWRlICJmbGF0YnVmZmVycy9zdGxfZW11bGF0aW9uLmgiCiAgCkBAIC0xMDIsNCArOTgsMyBAQAogICNpZm5kZWYgRkxBVEJVRkZFUlNfUFJFRkVSX1BSSU5URgogICMgIGluY2x1ZGUgPGlvbWFuaXA+CiAgIyAgaW5jbHVkZSA8c3N0cmVhbT4KLSAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS9mbGF0YnVmZmVyc19kb3dubG9hZC5zaCBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2ZsYXRidWZmZXJzX2Rvd25sb2FkLnNoCmluZGV4IGFmNWU4MGYuLjUyYWNjY2MgMTAwNzU1Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2ZsYXRidWZmZXJzX2Rvd25sb2FkLnNoCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL2ZsYXRidWZmZXJzX2Rvd25sb2FkLnNoCkBAIC01NCw5ICs1NCw5IEBACiBpZiBbIC1kICR7RE9XTkxPQURFRF9GTEFUQlVGRkVSU19QQVRIfSBdOyB0aGVuCiAgIGVjaG8gPiYyICIke0RPV05MT0FERURfRkxBVEJVRkZFUlNfUEFUSH0gYWxyZWFkeSBleGlzdHMsIHNraXBwaW5nIHRoZSBkb3dubG9hZC4iCiBlbHNlCi0gIFpJUF9QUkVGSVg9ImE2NmRlNThhZjk1NjU1ODY4MzJjMjc2ZmJiNDI1MWZjNDE2YmYwN2YiCisgIFpJUF9QUkVGSVg9InYyMy41LjI2IgogICBGTEFUQlVGRkVSU19VUkw9Imh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvYXJjaGl2ZS8ke1pJUF9QUkVGSVh9LnppcCIKLSAgRkxBVEJVRkZFUlNfTUQ1PSI1MWE3YTk2NzQ3ZTFjMzNlYjRhYWM2ZDUyNTEzYTAyZiIKKyAgRkxBVEJVRkZFUlNfTUQ1PSJlODdlOGFjZDhlMmQ1MzY1MzM4N2FkNzg3MjAzMTZlMiIKIAogICBURU1QRElSPSIkKG1rdGVtcCAtZCkiCiAgIFRFTVBGSUxFPSIke1RFTVBESVJ9LyR7WklQX1BSRUZJWH0uemlwIgpAQCAtNjQsNyArNjQsNyBAQAogICBjaGVja19tZDUgIiR7VEVNUEZJTEV9IiAke0ZMQVRCVUZGRVJTX01ENX0KIAogICB1bnppcCAtcW8gIiRURU1QRklMRSIgLWQgIiR7VEVNUERJUn0iID4mMgotICBtdiAiJHtURU1QRElSfS9mbGF0YnVmZmVycy0ke1pJUF9QUkVGSVh9IiAke0RPV05MT0FERURfRkxBVEJVRkZFUlNfUEFUSH0KKyAgbXYgIiR7VEVNUERJUn0vZmxhdGJ1ZmZlcnMtJHtaSVBfUFJFRklYI3Z9IiAke0RPV05MT0FERURfRkxBVEJVRkZFUlNfUEFUSH0KICAgcm0gLXJmICIke1RFTVBESVJ9IgogCiAgIHB1c2hkICR7RE9XTkxPQURFRF9GTEFUQlVGRkVSU19QQVRIfSA+IC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvdGFyZ2V0cy9hcmMvYXJjX2NvbW1vbi5pbmMgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS90YXJnZXRzL2FyYy9hcmNfY29tbW9uLmluYwppbmRleCBhYmM0NWMzLi44ODA5Mjc5IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS90YXJnZXRzL2FyYy9hcmNfY29tbW9uLmluYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS90YXJnZXRzL2FyYy9hcmNfY29tbW9uLmluYwpAQCAtNjQsOSArNjQsNiBAQAogICBQTEFURk9STV9MREZMQUdTICs9ICQobm90ZGlyICQoTENGX0ZJTEUpKQogZW5kaWYKIAotICBDWFhGTEFHUyA6PSAkKGZpbHRlci1vdXQgLXN0ZD1jKysxMSwkKENYWEZMQUdTKSkKLSAgQ0NGTEFHUyA6PSAkKGZpbHRlci1vdXQgLXN0ZD1jMTEsJChDQ0ZMQUdTKSkKLQogICBsZGZsYWdzX3RvX3JlbW92ZSA9IC1XbCwtLWZhdGFsLXdhcm5pbmdzIC1XbCwtLWdjLXNlY3Rpb25zCiAgIExERkxBR1MgOj0gJChmaWx0ZXItb3V0ICQobGRmbGFnc190b19yZW1vdmUpLCQoTERGTEFHUykpCiAgIApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvdGFyZ2V0cy9ibHVlcGlsbF9tYWtlZmlsZS5pbmMgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS90YXJnZXRzL2JsdWVwaWxsX21ha2VmaWxlLmluYwppbmRleCA1MzI2ODljLi5hZTNiMGIwIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS90YXJnZXRzL2JsdWVwaWxsX21ha2VmaWxlLmluYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS90YXJnZXRzL2JsdWVwaWxsX21ha2VmaWxlLmluYwpAQCAtNTgsNiArNTgsNyBAQAogCiBMREZMQUdTICs9IFwKICAgLVQgJChNQUtFRklMRV9ESVIpL3RhcmdldHMvYmx1ZXBpbGwvYmx1ZXBpbGwubGRzIFwKKyAgLVdsLC0tbm8td2Fybi1yd3gtc2VnbWVudCBcCiAgIC1XbCwtTWFwPWdlbi8kKFRBUkdFVCkubWFwLC0tY3JlZgogCiAjIEFkZGl0aW9uYWwgaW5jbHVkZSBwYXRocyBuZWVkZWQgZm9yIHRoZSBzdG1fMzJfYmFyZV9saWIgb25seS4KQEAgLTg3LDggKzg4LDcgQEAKIAogTUlDUk9MSVRFX1RFU1RfU1JDUyA6PSAkKGZpbHRlci1vdXQgJChFWENMVURFRF9URVNUUyksICQoTUlDUk9MSVRFX1RFU1RfU1JDUykpCiAKLUVYQ0xVREVEX0VYQU1QTEVfVEVTVFMgOj0gXAotICAkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL01ha2VmaWxlLmluYworRVhDTFVERURfRVhBTVBMRV9URVNUUyA6PQogCiBNSUNST19MSVRFX0VYQU1QTEVfVEVTVFMgOj0gJChmaWx0ZXItb3V0ICQoRVhDTFVERURfRVhBTVBMRV9URVNUUyksICQoTUlDUk9fTElURV9FWEFNUExFX1RFU1RTKSkKIApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvdGFyZ2V0cy9jZXZhX21ha2VmaWxlLmluYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL3RhcmdldHMvY2V2YV9tYWtlZmlsZS5pbmMKaW5kZXggNWNjOGFkMS4uZDBkZGM5OCAxMDA3NTUKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvdGFyZ2V0cy9jZXZhX21ha2VmaWxlLmluYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS90YXJnZXRzL2NldmFfbWFrZWZpbGUuaW5jCkBAIC0zMyw4ICszMyw4IEBACiAJLURfTElCQ1BQX0VYVEVSTl9URU1QTEFURV9JTkxJTkVfVklTSUJJTElUWT0iIgogCSAKIAotQ1hYRkxBR1MgOj0gLXN0ZD1jKysxMSAtRFRGX0xJVEVfU1RBVElDX01FTU9SWSAKLUNDRkxBR1MgIDo9IC1zdGQ9YzExICAgLURURl9MSVRFX1NUQVRJQ19NRU1PUlkgCitDWFhGTEFHUyA6PSAtc3RkPWMrKzE3IC1EVEZfTElURV9TVEFUSUNfTUVNT1JZIAorQ0NGTEFHUyAgOj0gLXN0ZD1jMTcgICAtRFRGX0xJVEVfU1RBVElDX01FTU9SWSAKIAogaWZlcSAoJChUQVJHRVRfQVJDSCksIENFVkFfQlgxKQogUExBVEZPUk1fRkxBR1MgKz0gXApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvdGFyZ2V0cy9jb3J0ZXhfYV9nZW5lcmljX21ha2VmaWxlLmluYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL3RhcmdldHMvY29ydGV4X2FfZ2VuZXJpY19tYWtlZmlsZS5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQyNzJjYwotLS0gL2Rldi9udWxsCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL3RhcmdldHMvY29ydGV4X2FfZ2VuZXJpY19tYWtlZmlsZS5pbmMKQEAgLTAsMCArMSw2NiBAQAorIyBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBHZW5lcmljIE1ha2VmaWxlIHRhcmdldCBmb3IgQVJNIENvcnRleCBBIGJ1aWxkcy4KKworRlBVIDo9IG5lb24KK0ZMT0FUX0FCSSA6PSBzb2Z0ZnAKKworR0NDX1RBUkdFVF9BUkNIIDo9CitHQ0NfVEFSR0VUX0NQVSA6PQorCitpZmVxICgkKFRBUkdFVF9BUkNIKSwgYXJtdjguMi1hKQorICBHQ0NfVEFSR0VUX0FSQ0ggOj0gYXJtdjguMi1hCisKK2Vsc2UgaWZlcSAoJChUQVJHRVRfQVJDSCksIGFybXY3LWEpCisgIEdDQ19UQVJHRVRfQVJDSCA6PSBhcm12Ny1hCisKK2Vsc2UgaWZlcSAoJChUQVJHRVRfQVJDSCksIGNvcnRleC1hMzIpCisgIEdDQ19UQVJHRVRfQ1BVIDo9IGNvcnRleC1hMzIKKworZWxzZQorICAkKGVycm9yICJUQVJHRVRfQVJDSD0kKFRBUkdFVF9BUkNIKSBpcyBub3Qgc3VwcG9ydGVkIikKK2VuZGlmCisKK1RBUkdFVF9UT09MQ0hBSU5fUFJFRklYIDo9IGFybS1ub25lLWVhYmktCisKK2lmbmVxICgkKEdDQ19UQVJHRVRfQVJDSCksKQorICBGTEFHU19HQ0MgKz0gLW1hcmNoPSQoR0NDX1RBUkdFVF9BUkNIKQorZWxzZSBpZm5lcSAoJChHQ0NfVEFSR0VUX0NQVSksKQorICBGTEFHU19HQ0MgKz0gLW1jcHU9JChHQ0NfVEFSR0VUX0NQVSkKK2VuZGlmCisKK0NYWEZMQUdTICs9ICQoRkxBR1NfR0NDKQorQ0NGTEFHUyArPSAkKEZMQUdTX0dDQykKKworUExBVEZPUk1fRkxBR1MgPSBcCisgIC1EVEZfTElURV9NQ1VfREVCVUdfTE9HIFwKKyAgLW1mbG9hdC1hYmk9JChGTE9BVF9BQkkpIFwKKyAgLW1mcHU9JChGUFUpIFwKKyAgLWZ1bnNpZ25lZC1jaGFyIFwKKyAgLW1saXR0bGUtZW5kaWFuIFwKKyAgLVduby10eXBlLWxpbWl0cyBcCisgIC1Xbm8tdW51c2VkLXByaXZhdGUtZmllbGQgXAorICAtZm9taXQtZnJhbWUtcG9pbnRlciBcCisgIC1NRAorCitpZm5lcSAoJChQSUMpLCkKKyAgUExBVEZPUk1fRkxBR1MgKz0gLWZwaWMKK2VuZGlmCisKKyMgQ29tbW9uICsgQy9DKysgZmxhZ3MKK0NYWEZMQUdTICs9ICQoUExBVEZPUk1fRkxBR1MpCitDQ0ZMQUdTICs9ICQoUExBVEZPUk1fRkxBR1MpCisKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL3RhcmdldHMvY29ydGV4X21fY29yc3RvbmVfMzAwX21ha2VmaWxlLmluYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL3RhcmdldHMvY29ydGV4X21fY29yc3RvbmVfMzAwX21ha2VmaWxlLmluYwppbmRleCAwZmZlNWEzLi4wYzQ4M2FjIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS90YXJnZXRzL2NvcnRleF9tX2NvcnN0b25lXzMwMF9tYWtlZmlsZS5pbmMKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvdGFyZ2V0cy9jb3J0ZXhfbV9jb3JzdG9uZV8zMDBfbWFrZWZpbGUuaW5jCkBAIC0xLDQgKzEsNCBAQAotIyBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIyBDb3B5cmlnaHQgMjAyNCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTYsMjMgKzE2LDI5IEBACiAjIEFSTSBDb3J0ZXggTSBtYWtlZmlsZSB0YXJnZXRlZCBmb3IgYSBGVlAgYmFzZWQgb24gQXJtIENvcnN0b25lLTMwMCBzb2Z0d2FyZS4KICMgRm9yIG1vcmUgaW5mbyBzZWU6IHRlbnNvcmZsb3cvbGl0ZS9taWNyby9jb3J0ZXhfbV9jb3JzdG9uZV8zMDAvUkVBRE1FLm1kCiAKLWV4cG9ydCBQQVRIIDo9ICQoTUFLRUZJTEVfRElSKS9kb3dubG9hZHMvY29yc3RvbmUzMDAvbW9kZWxzL0xpbnV4NjRfR0NDLTYuNDokKFBBVEgpCi1ET1dOTE9BRF9SRVNVTFQgOj0gJChzaGVsbCAkKE1BS0VGSUxFX0RJUikvY29yc3RvbmVfMzAwX2Rvd25sb2FkLnNoICR7TUFLRUZJTEVfRElSfS9kb3dubG9hZHMpCitVTkFNRV9NIDo9ICQoc2hlbGwgdW5hbWUgLW0pCitpZmVxICgkKFVOQU1FX00pLCBhYXJjaDY0KQorICBleHBvcnQgUEFUSCA6PSAkKERPV05MT0FEU19ESVIpL2NvcnN0b25lMzAwL21vZGVscy9MaW51eDY0X2FybXY4bF9HQ0MtOS4zOiQoUEFUSCkKK2Vsc2UKKyAgZXhwb3J0IFBBVEggOj0gJChET1dOTE9BRFNfRElSKS9jb3JzdG9uZTMwMC9tb2RlbHMvTGludXg2NF9HQ0MtOS4zOiQoUEFUSCkKK2VuZGlmCisKK0RPV05MT0FEX1JFU1VMVCA6PSAkKHNoZWxsICQoTUFLRUZJTEVfRElSKS9jb3JzdG9uZV8zMDBfZG93bmxvYWQuc2ggJChET1dOTE9BRFNfRElSKSAkKFRFTlNPUkZMT1dfUk9PVCkpCiBpZm5lcSAoJChET1dOTE9BRF9SRVNVTFQpLCBTVUNDRVNTKQogICAkKGVycm9yIFNvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggdGhlIEFybSBDb3JzdG9uZS0zMDAgc29mdHdhcmUgZG93bmxvYWQ6ICQoRE9XTkxPQURfUkVTVUxUKSkKIGVuZGlmCiAKLUVUSE9TX1VfQ09SRV9QTEFURk9STSA6PSAke1BXRH0vJChNQUtFRklMRV9ESVIpL2Rvd25sb2Fkcy9ldGhvc191X2NvcmVfcGxhdGZvcm0vdGFyZ2V0cy9jb3JzdG9uZS0zMDAKLURPV05MT0FEX1JFU1VMVCA6PSAkKHNoZWxsICQoTUFLRUZJTEVfRElSKS9ldGhvc191X2NvcmVfcGxhdGZvcm1fZG93bmxvYWQuc2ggJHtNQUtFRklMRV9ESVJ9L2Rvd25sb2FkcykKK0VUSE9TX1VfQ09SRV9QTEFURk9STSA6PSAkKERPV05MT0FEU19ESVIpL2V0aG9zX3VfY29yZV9wbGF0Zm9ybS90YXJnZXRzL2NvcnN0b25lLTMwMAorRE9XTkxPQURfUkVTVUxUIDo9ICQoc2hlbGwgJChNQUtFRklMRV9ESVIpL2V0aG9zX3VfY29yZV9wbGF0Zm9ybV9kb3dubG9hZC5zaCAkKERPV05MT0FEU19ESVIpICQoVEVOU09SRkxPV19ST09UKSkKIGlmbmVxICgkKERPV05MT0FEX1JFU1VMVCksIFNVQ0NFU1MpCiAgICQoZXJyb3IgU29tZXRoaW5nIHdlbnQgd3Jvbmcgd2l0aCB0aGUgRXRob3MtVSBDb3JlIFBsYXRmb3JtIHNvZnR3YXJlIGRvd25sb2FkOiAkKERPV05MT0FEX1JFU1VMVCkpCiBlbmRpZgogCiAjIFRoaXMgdGFyZ2V0IGhhcyBkZXBlbmRlbmNpZXMgdG8gQ01TSVMtRGV2aWNlIHNvIGp1c3QgaW4gY2FzZSBydW5uaW5nIHdpdGhvdXQgT1BUSU1JWkVEX0tFUk5FTF9ESVI9Y21zaXNfbm4uCi1DTVNJU19ERUZBVUxUX0RPV05MT0FEX1BBVEggOj0gJChNQUtFRklMRV9ESVIpL2Rvd25sb2Fkcy9jbXNpcworQ01TSVNfREVGQVVMVF9ET1dOTE9BRF9QQVRIIDo9ICQoRE9XTkxPQURTX0RJUikvY21zaXMKIENNU0lTX1BBVEggOj0gJChDTVNJU19ERUZBVUxUX0RPV05MT0FEX1BBVEgpCiBpZmVxICgkKENNU0lTX1BBVEgpLCAkKENNU0lTX0RFRkFVTFRfRE9XTkxPQURfUEFUSCkpCi0gIERPV05MT0FEX1JFU1VMVCA6PSAkKHNoZWxsICQoTUFLRUZJTEVfRElSKS9leHRfbGlicy9jbXNpc19kb3dubG9hZC5zaCAke01BS0VGSUxFX0RJUn0vZG93bmxvYWRzKQorICBET1dOTE9BRF9SRVNVTFQgOj0gJChzaGVsbCAkKE1BS0VGSUxFX0RJUikvZXh0X2xpYnMvY21zaXNfZG93bmxvYWQuc2ggJChET1dOTE9BRFNfRElSKSAkKFRFTlNPUkZMT1dfUk9PVCkpCiAgIGlmbmVxICgkKERPV05MT0FEX1JFU1VMVCksIFNVQ0NFU1MpCiAgICAgJChlcnJvciBTb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIHRoZSBDTVNJUyBkb3dubG9hZDogJChET1dOTE9BRF9SRVNVTFQpKQogICBlbmRpZgpAQCAtOTcsMTQgKzEwMywxMyBAQAogICBGTEFHU19BUk1DID0gXAogICAgIC0tdGFyZ2V0PWFybS1hcm0tbm9uZS1lYWJpIFwKICAgICAtV25vLXVudXNlZC1wcml2YXRlLWZpZWxkIFwKLSAgICAtbWNwdT0kKE1DUFVfT1BUSU9OKSBcCi0gICAgLWZmcC1tb2RlPWZ1bGwKKyAgICAtbWNwdT0kKE1DUFVfT1BUSU9OKQogCiAgICMgUGFzcyBjb21tYSBzZXBhcmF0ZWQgbGlua2VyIG9wdGlvbnMgdG8gYXJtbGluawogICBBUk1DNl9MREZMQUdTICs9IC1XbCwtLXN0cmljdCwtLXN1bW1hcnlfc3RkZXJyLC0taW5mbyxzdW1tYXJ5c2l6ZXMsLS1tYXAKICAgQVJNQzZfTERGTEFHUyArPSAtV2wsLS1sb2FkX2FkZHJfbWFwX2luZm8sLS14cmVmLC0tY2FsbGdyYXBoLC0tc3ltYm9scwogICBBUk1DNl9MREZMQUdTICs9IC1XbCwtLWluZm8sc2l6ZXMsLS1pbmZvLHRvdGFscywtLWluZm8sdW51c2VkLC0taW5mbyx2ZW5lZXJzCi0gIEFSTUM2X0xERkxBR1MgKz0gLVdsLC0tbGlzdD0ke1RFTlNPUkZMT1dfUk9PVH1nZW4vJChUQVJHRVQpLm1hcAorICBBUk1DNl9MREZMQUdTICs9IC1XbCwtLWxpc3Q9Z2VuLyQoVEFSR0VUKS5tYXAKICAgQVJNQzZfTERGTEFHUyArPSAtV2wsLS1lbnRyeT1SZXNldF9IYW5kbGVyICAtLXZlcmJvc2UKICAgQVJNQzZfTERGTEFHUyArPSAtV2wsLS1zY2F0dGVyPSQoRVRIT1NfVV9DT1JFX1BMQVRGT1JNKS9wbGF0Zm9ybS5zY2F0dGVyCiAKQEAgLTEzMCwxMSArMTM1LDE2IEBACiAgICMgaHR0cHM6Ly9kZXZlbG9wZXIuYXJtLmNvbS9kb2N1bWVudGF0aW9uLzEwMDg5MS8wNjExL3Ryb3VibGVzaG9vdGluZy9nZW5lcmFsLXRyb3VibGVzaG9vdGluZy1hZHZpY2UKICAgTUlDUk9MSVRFX0xJQlMgOj0gJChmaWx0ZXItb3V0IC1sbSwkKE1JQ1JPTElURV9MSUJTKSkKIAorICAjIFRoaXMgZG9lcyBub3QgYnVpbGQgd2l0aCBhcm1jbGFuZyBhbmQgaXMgYW55d2F5IG5vdCB1c2VkIGJ5IHRoaXMgdGFyZ2V0LgorICBFWENMVURFRF9URVNUUyA6PSBcCisgICAgdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL2JlbmNobWFya2luZy9NYWtlZmlsZS5pbmMKKyAgTUlDUk9fTElURV9CRU5DSE1BUktTIDo9ICQoZmlsdGVyLW91dCAkKEVYQ0xVREVEX1RFU1RTKSwgJChNSUNST19MSVRFX0JFTkNITUFSS1MpKQorCiBlbHNlIGlmZXEgKCQoVE9PTENIQUlOKSwgZ2NjKQotICBUQVJHRVRfREVGQVVMVF9UT09MQ0hBSU5fUk9PVCA6PSAkKE1BS0VGSUxFX0RJUikvZG93bmxvYWRzL2djY19lbWJlZGRlZC9iaW4vCisgIFRBUkdFVF9ERUZBVUxUX1RPT0xDSEFJTl9ST09UIDo9ICQoRE9XTkxPQURTX0RJUikvZ2NjX2VtYmVkZGVkL2Jpbi8KICAgVEFSR0VUX1RPT0xDSEFJTl9ST09UIDo9ICQoVEFSR0VUX0RFRkFVTFRfVE9PTENIQUlOX1JPT1QpCiAgIGlmZXEgKCQoVEFSR0VUX1RPT0xDSEFJTl9ST09UKSwgJChUQVJHRVRfREVGQVVMVF9UT09MQ0hBSU5fUk9PVCkpCi0gICAgRE9XTkxPQURfUkVTVUxUIDo9ICQoc2hlbGwgJChNQUtFRklMRV9ESVIpL2FybV9nY2NfZG93bmxvYWQuc2ggJHtNQUtFRklMRV9ESVJ9L2Rvd25sb2FkcykKKyAgICBET1dOTE9BRF9SRVNVTFQgOj0gJChzaGVsbCAkKE1BS0VGSUxFX0RJUikvYXJtX2djY19kb3dubG9hZC5zaCAkKERPV05MT0FEU19ESVIpICQoVEVOU09SRkxPV19ST09UKSkKICAgICBpZm5lcSAoJChET1dOTE9BRF9SRVNVTFQpLCBTVUNDRVNTKQogICAgICAgJChlcnJvciBTb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIHRoZSBHQ0MgZG93bmxvYWQ6ICQoRE9XTkxPQURfUkVTVUxUKSkKICAgICBlbmRpZgpAQCAtMTQ4LDcgKzE1OCw3IEBACiAgIExERkxBR1MgKz0gXAogICAgIC0tc3BlY3M9bm9zeXMuc3BlY3MgXAogICAgIC1UICQoRVRIT1NfVV9DT1JFX1BMQVRGT1JNKS9wbGF0Zm9ybV9wYXJzZWQubGQgXAotICAgIC1XbCwtTWFwPSR7VEVOU09SRkxPV19ST09UfWdlbi8kKFRBUkdFVCkubWFwLC0tY3JlZiBcCisgICAgLVdsLC1NYXA9Z2VuLyQoVEFSR0VUKS5tYXAsLS1jcmVmIFwKICAgICAtV2wsLS1nYy1zZWN0aW9ucyBcCiAgICAgLS1lbnRyeSBSZXNldF9IYW5kbGVyCiAKQEAgLTE4Niw3ICsxOTYsNyBAQAogICBFVEhPU1VfQVJDSD11NTUKIGVuZGlmCiAKLUNNU0lTX0RFRkFVTFRfRE9XTkxPQURfUEFUSCA6PSAkKE1BS0VGSUxFX0RJUikvZG93bmxvYWRzL2Ntc2lzCitDTVNJU19ERUZBVUxUX0RPV05MT0FEX1BBVEggOj0gJChET1dOTE9BRFNfRElSKS9jbXNpcwogQ01TSVNfUEFUSCA6PSAkKENNU0lTX0RFRkFVTFRfRE9XTkxPQURfUEFUSCkKIFRISVJEX1BBUlRZX0NDX1NSQ1MgKz0gXAogICAkKENNU0lTX1BBVEgpL0RldmljZS9BUk0vJChBUk1fQ1BVKS9Tb3VyY2Uvc3lzdGVtXyQoQVJNX0NQVSkuYyBcCkBAIC0xOTcsOCArMjA3LDEzIEBACiAKICMgVE9ETygjMjc0KTogRXhhbWluZSB3aHkgc29tZSB0ZXN0cyBmYWlsIGhlcmUuCiBFWENMVURFRF9URVNUUyA6PSBcCi0gIHRlbnNvcmZsb3cvbGl0ZS9taWNyby9tZW1vcnlfYXJlbmFfdGhyZXNob2xkX3Rlc3QuY2MgIFwKLSAgdGVuc29yZmxvdy9saXRlL21pY3JvL3JlY29yZGluZ19taWNyb19hbGxvY2F0b3JfdGVzdC5jYworICAkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vbWVtb3J5X2FyZW5hX3RocmVzaG9sZF90ZXN0LmNjICBcCisgICQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9yZWNvcmRpbmdfbWljcm9fYWxsb2NhdG9yX3Rlc3QuY2MKK2lmZXEgKCQoQ09fUFJPQ0VTU09SKSwgZXRob3NfdSkKKyMgVGhpcyBkb2VzIG5vdCB3b3JrIHdpdGggRXRob3MtVSBlbmFibGVkIHNpbmNlIHRoZW4gTlBVIFBNVSBjb3VudGVycyBhcmUgdXNlZCBpbnN0ZWFkIGZvciB0aGUgc2FrZSBvZiB0aGUgYmVuY2htYXJrIGV4YW1wbGUuCitFWENMVURFRF9URVNUUyArPSBcCisgICQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby9taWNyb190aW1lX3Rlc3QuY2MKK2VuZGlmCiBNSUNST0xJVEVfVEVTVF9TUkNTIDo9ICQoZmlsdGVyLW91dCAkKEVYQ0xVREVEX1RFU1RTKSwgJChNSUNST0xJVEVfVEVTVF9TUkNTKSkKIAotVEVTVF9TQ1JJUFQgOj0gdGVuc29yZmxvdy9saXRlL21pY3JvL3Rlc3RpbmcvdGVzdF93aXRoX2FybV9jb3JzdG9uZV8zMDAuc2gKK1RFU1RfU0NSSVBUIDo9ICQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0aW5nL3Rlc3Rfd2l0aF9hcm1fY29yc3RvbmVfMzAwLnNoCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS90YXJnZXRzL2NvcnRleF9tX2dlbmVyaWNfbWFrZWZpbGUuaW5jIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvdGFyZ2V0cy9jb3J0ZXhfbV9nZW5lcmljX21ha2VmaWxlLmluYwppbmRleCAwZTAzNGFkLi41YWE1ZDI1IDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS90YXJnZXRzL2NvcnRleF9tX2dlbmVyaWNfbWFrZWZpbGUuaW5jCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL3RhcmdldHMvY29ydGV4X21fZ2VuZXJpY19tYWtlZmlsZS5pbmMKQEAgLTEsNCArMSw0IEBACi0jIENvcHlyaWdodCAyMDIzIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjIENvcHlyaWdodCAyMDI0IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xNiw2ICsxNiwxNiBAQAogIyBHZW5lcmljIE1ha2VmaWxlIHRhcmdldCBmb3IgQVJNIENvcnRleCBNIGJ1aWxkcy4KICMgRm9yIG1vcmUgaW5mbyBzZWU6IHRlbnNvcmZsb3cvbGl0ZS9taWNyby9jb3J0ZXhfbV9nZW5lcmljL1JFQURNRS5tZAogCisjIE5lZWRlZCBpbiBjYXNlIHJ1bm5pbmcgd2l0aG91dCBPUFRJTUlaRURfS0VSTkVMX0RJUj1jbXNpc19ubi4KK0NNU0lTX0RFRkFVTFRfRE9XTkxPQURfUEFUSCA6PSAkKERPV05MT0FEU19ESVIpL2Ntc2lzCitDTVNJU19QQVRIIDo9ICQoQ01TSVNfREVGQVVMVF9ET1dOTE9BRF9QQVRIKQoraWZlcSAoJChDTVNJU19QQVRIKSwgJChDTVNJU19ERUZBVUxUX0RPV05MT0FEX1BBVEgpKQorICBET1dOTE9BRF9SRVNVTFQgOj0gJChzaGVsbCAkKE1BS0VGSUxFX0RJUikvZXh0X2xpYnMvY21zaXNfZG93bmxvYWQuc2ggJChET1dOTE9BRFNfRElSKSAkKFRFTlNPUkZMT1dfUk9PVCkpCisgIGlmbmVxICgkKERPV05MT0FEX1JFU1VMVCksIFNVQ0NFU1MpCisgICAgJChlcnJvciBTb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIHRoZSBDTVNJUyBkb3dubG9hZDogJChET1dOTE9BRF9SRVNVTFQpKQorICBlbmRpZgorZW5kaWYKKwogRkxPQVQgOj0gc29mdAogR0NDX1RBUkdFVF9BUkNIIDo9ICQoVEFSR0VUX0FSQ0gpCiAKQEAgLTkyLDggKzEwMiw2IEBACiAgIENPUkU9TTg1CiAgIEFSTV9MREZMQUdTIDo9IC1XbCwtLWNwdT04LjEtTS5NYWluLm12ZS5mcAogICBGTE9BVD1oYXJkCi0gICMgR0NDIGRvZXMgbm90IHlldCBzdXBwb3J0IGNvcnRleC1tODUgb3B0aW9uIGhlbmNlIGdvIHdpdGggY29ydGV4LW01NSBmb3Igbm93LgotICBHQ0NfVEFSR0VUX0FSQ0ggOj0gY29ydGV4LW01NQogCiBlbHNlIGlmZXEgKCQoVEFSR0VUX0FSQ0gpLCBwcm9qZWN0X2dlbmVyYXRpb24pCiAgICMgTm8gZmxhZ3MgbmVlZGVkIGhlcmUgYXMgcHJvamVjdF9nZW5lcmF0aW9uIGRvZXMgbm90IGJ1aWxkIGFueXRoaW5nLgpAQCAtMjA0LDUgKzIxMiwzIEBACiAgICAgJChURU5TT1JGTE9XX1JPT1QpdGVuc29yZmxvdy9saXRlL21pY3JvL2V4YW1wbGVzL21pY3JvX3NwZWVjaC9NYWtlZmlsZS5pbmMKICAgTUlDUk9fTElURV9FWEFNUExFX1RFU1RTIDo9ICQoZmlsdGVyLW91dCAkKEVYQ0xVREVEX0VYQU1QTEVfVEVTVFMpLCAkKE1JQ1JPX0xJVEVfRVhBTVBMRV9URVNUUykpCiBlbmRpZgotCi1pbmNsdWRlICQoTUFLRUZJTEVfRElSKS9leHRfbGlicy9leWFscm96X3ByaW50Zi5pbmMKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL3RhcmdldHMvaGV4YWdvbl9tYWtlZmlsZS5pbmMgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS90YXJnZXRzL2hleGFnb25fbWFrZWZpbGUuaW5jCmluZGV4IDJlN2QxOGMuLjZmZTdiZTcgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL3RhcmdldHMvaGV4YWdvbl9tYWtlZmlsZS5pbmMKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvdGFyZ2V0cy9oZXhhZ29uX21ha2VmaWxlLmluYwpAQCAtODAsNiArODAsMTAgQEAKICAgLW1jcHU9JChIRVhBR09OX0NQVV9WRVIpIFwKICAgLW0kKEhFWEFHT05fQ1BVX1ZFUikKIAoraWZlcSAoJChIRVhBR09OX1BJQ19CVUlMRCksIHRydWUpCisgIFBMQVRGT1JNX0FSR1MgKz0gLWZQSUMKK2VuZGlmCisKICMgU2VlIGh0dHA6Ly9iLzE4MzQ2MjA3NyBmb3IgbW9yZSBkZXRhaWxzIG9uIHdoeSB3ZSBuZWVkIC1HMCBmb3IgYW4gTFBJIGJ1aWxkLgogaWZlcSAoJChIRVhBR09OX0xQSV9CVUlMRCksIHRydWUpCiAgIFBMQVRGT1JNX0FSR1MgKz0gLUcwCkBAIC0xMTIsNSArMTE2LDEwIEBACiAKIE1JQ1JPTElURV9URVNUX1NSQ1MgOj0gJChmaWx0ZXItb3V0ICQoRVhDTFVERURfVEVTVFMpLCAkKE1JQ1JPTElURV9URVNUX1NSQ1MpKQogCisjIFRPRE8oYi8zMDI0MDQ0NzcpOiBtaWNyb19zcGVlY2hfdGVzdCBleGFtcGxlIGRvZXMgbm90IHBhc3MgZHVlIHRvIG1pc3ByZWRpY3Rpb24KK0VYQ0xVREVEX0VYQU1QTEVfVEVTVFMgOj0gXAorICAkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vZXhhbXBsZXMvbWljcm9fc3BlZWNoL01ha2VmaWxlLmluYworTUlDUk9fTElURV9FWEFNUExFX1RFU1RTIDo9ICQoZmlsdGVyLW91dCAkKEVYQ0xVREVEX0VYQU1QTEVfVEVTVFMpLCAkKE1JQ1JPX0xJVEVfRVhBTVBMRV9URVNUUykpCisKIFRFU1RfU0NSSVBUIDo9ICQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0aW5nL3Rlc3RfaGV4YWdvbl9iaW5hcnkuc2gKIFNJWkVfU0NSSVBUIDo9ICQoVEVOU09SRkxPV19ST09UKXRlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0aW5nL3NpemVfaGV4YWdvbl9iaW5hcnkuc2gKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL3RhcmdldHMvbWlwc19tYWtlZmlsZS5pbmMgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS90YXJnZXRzL21pcHNfbWFrZWZpbGUuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMGQzOGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS90YXJnZXRzL21pcHNfbWFrZWZpbGUuaW5jCkBAIC0wLDAgKzEsNDEgQEAKKyMgQ29weXJpZ2h0IDIwMjMgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RBUkdFVF9BUkNIIDo9IG1pcHMKK1RBUkdFVF9UT09MQ0hBSU5fUFJFRklYIDo9IG1pcHMtZWxmLQorCisKKyMgQWxsb3cgYWRkaXRpb25hbCBmbGFncyBvbiB0aGUgY29tbWFuZCBsaW5lIGZvciBkZWJ1Z2dpbmcuCitNSVBTX0VYVFJBX0NGTEFHUyA6PQorCitleHBvcnQgUEFUSCA6PSAkKFRBUkdFVF9UT09MQ0hBSU5fUk9PVCk6JChQQVRIKQorCitQTEFURk9STV9GTEFHUyA9IFwKKyAgLWZuby1idWlsdGluLXByaW50ZiBcCisgIC1EVEZfTElURV9NQ1VfREVCVUdfTE9HIFwKKyAgLURURl9MSVRFX1VTRV9HTE9CQUxfQ01BVEhfRlVOQ1RJT05TIFwKKyAgLWZuby1kZWxldGUtbnVsbC1wb2ludGVyLWNoZWNrcyBcCisgIC1mb21pdC1mcmFtZS1wb2ludGVyCisKK0NYWEZMQUdTICs9ICQoUExBVEZPUk1fRkxBR1MpIFwKKyAgLWZwZXJtaXNzaXZlIFwKKyAgLWZuby11c2UtY3hhLWF0ZXhpdCBcCisgIC1EVEZfTElURV9VU0VfR0xPQkFMX01JTiBcCisgIC1EVEZfTElURV9VU0VfR0xPQkFMX01BWAorCitDQ0ZMQUdTICs9ICQoUExBVEZPUk1fRkxBR1MpCisKK0NDRkxBR1MgKz0gJChNSVBTX0VYVFJBX0NGTEFHUykKK0NYWEZMQUdTICs9ICQoTUlQU19FWFRSQV9DRkxBR1MpCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS90YXJnZXRzL3Jpc2N2MzJfZ2VuZXJpY19tYWtlZmlsZS5pbmMgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS90YXJnZXRzL3Jpc2N2MzJfZ2VuZXJpY19tYWtlZmlsZS5pbmMKaW5kZXggY2U1ZjBlYi4uNDUzZTlkMCAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvdGFyZ2V0cy9yaXNjdjMyX2dlbmVyaWNfbWFrZWZpbGUuaW5jCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL3RhcmdldHMvcmlzY3YzMl9nZW5lcmljX21ha2VmaWxlLmluYwpAQCAtMiw2ICsyLDEzIEBACiBUQVJHRVRfQVJDSCA6PSByaXNjdjMyCiBUQVJHRVRfVE9PTENIQUlOX1BSRUZJWCA6PSByaXNjdjY0LXVua25vd24tZWxmLQogCitSSVNDVl9BUkNIIDo9IHJ2MzJpbWMKK1JJU0NWX0FCSSA6PSBpbHAzMgorUklTQ1ZfQ09ERV9NT0RFTCA6PSBtZWRhbnkKKworIyBBbGxvdyBhZGRpdGlvbmFsIGZsYWdzIG9uIHRoZSBjb21tYW5kIGxpbmUgZm9yIGRlYnVnZ2luZy4KK1JJU0NWX0VYVFJBX0NGTEFHUyA6PQorCiBUQVJHRVRfREVGQVVMVF9UT09MQ0hBSU5fUk9PVCA6PSAkKERPV05MT0FEU19ESVIpL3Jpc2N2X3Rvb2xjaGFpbi9iaW4vCiBUQVJHRVRfVE9PTENIQUlOX1JPT1QgOj0gJChUQVJHRVRfREVGQVVMVF9UT09MQ0hBSU5fUk9PVCkKIGlmZXEgKCQoVEFSR0VUX1RPT0xDSEFJTl9ST09UKSwgJChUQVJHRVRfREVGQVVMVF9UT09MQ0hBSU5fUk9PVCkpCkBAIC0xMSw5ICsxOCw5IEBACiBleHBvcnQgUEFUSCA6PSAkKFRBUkdFVF9UT09MQ0hBSU5fUk9PVCk6JChQQVRIKQogCiBQTEFURk9STV9GTEFHUyA9IFwKLSAgLW1hcmNoPXJ2MzJpbWFjIFwKLSAgLW1hYmk9aWxwMzIgXAotICAtbWNtb2RlbD1tZWRhbnkgXAorICAtbWFyY2g9JChSSVNDVl9BUkNIKSBcCisgIC1tYWJpPSQoUklTQ1ZfQUJJKSBcCisgIC1tY21vZGVsPSQoUklTQ1ZfQ09ERV9NT0RFTCkgXAogICAtbWV4cGxpY2l0LXJlbG9jcyBcCiAgIC1mbm8tYnVpbHRpbi1wcmludGYgXAogICAtRFRGX0xJVEVfTUNVX0RFQlVHX0xPRyBcCkBAIC00MCw5ICs0NywxMyBAQAogCiBNSUNST0xJVEVfVEVTVF9TUkNTIDo9ICQoZmlsdGVyLW91dCAkKEVYQ0xVREVEX1RFU1RTKSwgJChNSUNST0xJVEVfVEVTVF9TUkNTKSkKIAorQ0NGTEFHUyArPSAkKFJJU0NWX0VYVFJBX0NGTEFHUykKK0NYWEZMQUdTICs9ICQoUklTQ1ZfRVhUUkFfQ0ZMQUdTKQorCiAjIFRoaXMgZGlzYWJsZXMgdGhlICJsaW5rZXIgcmVsYXhhdGlvbiIgb3B0aW1pemF0aW9uLCB3aGljaCBwcm9kdWNlZCBpbmNvcnJlY3QgY29kZS4KICMgVE9ETyhiLzI3OTgwNTYxNSk6IENoZWNrIHdoZXRoZXIgdGhpcyBpcyBmaXhlZCBpbiBuZXdlciB2ZXJzaW9ucyBvZiB0aGUgdG9vbGNoYWluLgogTERGTEFHUyArPSAtbW5vLXJlbGF4CiBURVNUX1NDUklQVCA6PSAkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93L2xpdGUvbWljcm8vdGVzdGluZy90ZXN0X3dpdGhfcWVtdS5zaCByaXNjdjMyIHJ2MzIKIFNJWkVfU0NSSVBUIDo9ICR7VEVOU09SRkxPV19ST09UfXRlbnNvcmZsb3cvbGl0ZS9taWNyby90ZXN0aW5nL3NpemVfcmlzY3YzMl9iaW5hcnkuc2gKIAoraW5jbHVkZSAkKE1BS0VGSUxFX0RJUikvZXh0X2xpYnMvZXlhbHJvel9wcmludGYuaW5jCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS90YXJnZXRzL3h0ZW5zYV9tYWtlZmlsZS5pbmMgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS90YXJnZXRzL3h0ZW5zYV9tYWtlZmlsZS5pbmMKaW5kZXggOGQ5NzBjNy4uOTI1MjdhZCAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvdGFyZ2V0cy94dGVuc2FfbWFrZWZpbGUuaW5jCisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL3RhcmdldHMveHRlbnNhX21ha2VmaWxlLmluYwpAQCAtMzUsMTIgKzM1LDExIEBACiBUQVJHRVRfQVJDSF9ERUZJTkVTIDo9IC1EJChzaGVsbCBlY2hvICQoVEFSR0VUX0FSQ0gpIHwgdHIgW2Etel0gW0EtWl0pCiAKIFBMQVRGT1JNX0ZMQUdTID0gXAorICAtc3RkbGliPWxpYmMrKyBcCiAgIC1EVEZfTElURV9NQ1VfREVCVUdfTE9HIFwKICAgLURURl9MSVRFX1VTRV9DVElNRSBcCiAgIC0teHRlbnNhLWNvcmU9JChYVEVOU0FfQ09SRSkgXAogICAtbWNvcHJvYyBcCi0gIC1ETUFYX1JGRlRfUFdSPTkgXAotICAtRE1JTl9SRkZUX1BXUj1NQVhfUkZGVF9QV1IgXAogICAkKFRBUkdFVF9BUkNIX0RFRklORVMpIFwKICAgLW1sb25nY2FsbHMKIApkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvdGhpcmRfcGFydHlfZG93bmxvYWRzLmluYyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tYWtlL3RoaXJkX3BhcnR5X2Rvd25sb2Fkcy5pbmMKaW5kZXggYThlNjNlMS4uOTAyMjA2ZCAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL21ha2UvdGhpcmRfcGFydHlfZG93bmxvYWRzLmluYworKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbWFrZS90aGlyZF9wYXJ0eV9kb3dubG9hZHMuaW5jCkBAIC0zOSw1ICszOSw0IEBACiBFTUJBUkNfTUxJX1BSRV9DT01QSUxFRF9VUkwgOj0gImh0dHBzOi8vZ2l0aHViLmNvbS9mb3NzLWZvci1zeW5vcHN5cy1kd2MtYXJjLXByb2Nlc3NvcnMvZW1iYXJjX21saS9yZWxlYXNlcy9kb3dubG9hZC9SZWxlYXNlXzEuMS9lbWJBUkNfTUxJX3BhY2thZ2UuemlwIgogRU1CQVJDX01MSV9QUkVfQ09NUElMRURfTUQ1IDo9ICIxNzM5OTBjMmRkZTRlZmVmNmEyYzk1YjkyZDFmMDI0NCIKIAotRVRIT1NVX1VSTCA6PSAiaHR0cHM6Ly9naXQubWxwbGF0Zm9ybS5vcmcvbWwvZXRob3MtdS9ldGhvcy11LWNvcmUtZHJpdmVyLmdpdC9zbmFwc2hvdC9ldGhvcy11LWNvcmUtZHJpdmVyLTI0NDU1ZWVkYjllODkzOWY4YTI4Y2EwMTAxYTZmMmQxNzFlMWIyZjkudGFyLmd6IgotRVRIT1NVX01ENSA6PSAiMTRiNTcxMjUyNWQ0YWY2MTJkMzUyMTdmMGJjNTNmY2MiCisjIFNraXAgbWQ1c3VtLWNoZWNrIHNpbmNlIGV0aG9zLXUtY29yZS1kcml2ZXIgZG93bmxvYWQgbGluayBpcyBub24tZGV0ZXJtaW5pc3RpYywgc2VlICBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2dpdGlsZXMvaXNzdWVzLzg0CmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvbW9kZWxfdHJhbnNmb3Jtc191dGlscy5weSBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tb2RlbF90cmFuc2Zvcm1zX3V0aWxzLnB5CmluZGV4IGM3MTNmMDEuLjRhNTlkODggMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tb2RlbF90cmFuc2Zvcm1zX3V0aWxzLnB5CisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9tb2RlbF90cmFuc2Zvcm1zX3V0aWxzLnB5CkBAIC0yNjQsNyArMjY0LDcgQEAKICAgICAgIHNjaGVtYV9mYi5UZW5zb3JUeXBlLklOVDMyOiBucC5pbnQzMiwKICAgICAgIHNjaGVtYV9mYi5UZW5zb3JUeXBlLlVJTlQ4OiBucC51aW50OCwKICAgICAgIHNjaGVtYV9mYi5UZW5zb3JUeXBlLklOVDY0OiBucC5pbnQ2NCwKLSAgICAgIHNjaGVtYV9mYi5UZW5zb3JUeXBlLlNUUklORzogbnAuc3RyaW5nXywKKyAgICAgIHNjaGVtYV9mYi5UZW5zb3JUeXBlLlNUUklORzogbnAuYnl0ZXNfLAogICAgICAgc2NoZW1hX2ZiLlRlbnNvclR5cGUuQk9PTDogbnAuYm9vbF8sCiAgICAgICBzY2hlbWFfZmIuVGVuc29yVHlwZS5JTlQxNjogbnAuaW50MTYsCiAgICAgICBzY2hlbWFfZmIuVGVuc29yVHlwZS5DT01QTEVYNjQ6IG5wLmNvbXBsZXg2NCwKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9wcm9qZWN0X2dlbmVyYXRpb24vTWFrZWZpbGUgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvcHJvamVjdF9nZW5lcmF0aW9uL01ha2VmaWxlCmluZGV4IDc0OTdmMDcuLmY3M2ZiZGIgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9wcm9qZWN0X2dlbmVyYXRpb24vTWFrZWZpbGUKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL3Byb2plY3RfZ2VuZXJhdGlvbi9NYWtlZmlsZQpAQCAtNzIsMTQgKzcyLDE0IEBACiBlbmRpZgogCiBDWFhGTEFHUyA6PSBcCi0gIC1zdGQ9YysrMTEgXAorICAtc3RkPWMrKzE3IFwKICAgLWZuby1ydHRpIFwKICAgLWZuby1leGNlcHRpb25zIFwKICAgLWZuby10aHJlYWRzYWZlLXN0YXRpY3MgXAogICAkKENPTU1PTl9GTEFHUykKIAogQ0NGTEFHUyA6PSBcCi0gIC1zdGQ9YzExIFwKKyAgLXN0ZD1jMTcgXAogICAkKENPTU1PTl9GTEFHUykKIAogQVJGTEFHUyA6PSAtcgpAQCAtOTAsNiArOTAsNyBAQAogTElCIDo9ICQoR0VORElSKS9saWJ0ZmxtLmEKIAogVEZMTV9DQ19TUkNTIDo9ICQoc2hlbGwgZmluZCAkKFRFTlNPUkZMT1dfUk9PVCl0ZW5zb3JmbG93IC1uYW1lICIqLmNjIiAtbyAtbmFtZSAiKi5jIikKK1RGTE1fQ0NfU1JDUyArPSAkKHNoZWxsIGZpbmQgJChURU5TT1JGTE9XX1JPT1Qpc2lnbmFsIC1uYW1lICIqLmNjIiAtbyAtbmFtZSAiKi5jIikKIE9CSlMgOj0gJChhZGRwcmVmaXggJChPQkpESVIpLywgJChwYXRzdWJzdCAlLmMsJS5vLCQocGF0c3Vic3QgJS5jYywlLm8sJChURkxNX0NDX1NSQ1MpKSkpCiAKICMgaWYgdGhlIHRoaXJkIHBhcnR5IHByaW50ZiBsaWJyYXJ5IGlzIHByZXNlbnQsIGFkZCB0aGUgaW5jbHVkZSBwYXRocwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL3JlcXVhbnRpemVfZmxhdGJ1ZmZlcl90ZXN0LnB5IGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL3JlcXVhbnRpemVfZmxhdGJ1ZmZlcl90ZXN0LnB5CmluZGV4IDRkODA5OTEuLjg4NWFmODkgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9yZXF1YW50aXplX2ZsYXRidWZmZXJfdGVzdC5weQorKysgYi90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvcmVxdWFudGl6ZV9mbGF0YnVmZmVyX3Rlc3QucHkKQEAgLTI0LDcgKzI0LDcgQEAKIGZyb20gdGZsaXRlX21pY3JvLnRlbnNvcmZsb3cubGl0ZS50b29scyBpbXBvcnQgZmxhdGJ1ZmZlcl91dGlscwogCiAKLSNUT0RPKGIvMjQ4MDYxMzcwKTogcmVwbGFjZSB0aGUga2VyYXMgbW9kZWwgY3JlYXRpb24gcHJvY2VzcyB3aXRoIGZsYXRidWZmZXIgbWFuaXB1bGF0aW9uIHRvIHNwZWVkIHVwIHRlc3QKKyMgVE9ETyhiLzI0ODA2MTM3MCk6IHJlcGxhY2UgdGhlIGtlcmFzIG1vZGVsIGNyZWF0aW9uIHByb2Nlc3Mgd2l0aCBmbGF0YnVmZmVyIG1hbmlwdWxhdGlvbiB0byBzcGVlZCB1cCB0ZXN0CiBkZWYgY3JlYXRlX3NpbXBsZV9mY19tb2RlbCgpOgogICAnJydDcmVhdGUgYSBzaW1wbGUgbW9kZWwgd2l0aCB0d28gZnVsbHkgY29ubmVjdGVkKGZjKSBsYXllcnMnJycKICAgbW9kZWwgPSB0Zi5rZXJhcy5tb2RlbHMuU2VxdWVudGlhbChbCkBAIC02MCw2ICs2MCw5IEBACiAgICAgICAgIEVYUEVSSU1FTlRBTF9URkxJVEVfQlVJTFRJTlNfQUNUSVZBVElPTlNfSU5UMTZfV0VJR0hUU19JTlQ4CiAgICAgXQogICBjb252ZXJ0ZXIucmVwcmVzZW50YXRpdmVfZGF0YXNldCA9IHJlcHJlc2VudGF0aXZlX2RhdGFzZXRfZ2VuCisgICMgVE9ETyhiLzMyNDM4NTgwMik6IFN1cHBvcnQgcGVyLWNoYW5uZWwgcXVhbnRpemF0aW9uIGZvciBGdWxseUNvbm5lY3RlZC4KKyAgY29udmVydGVyLl9leHBlcmltZW50YWxfZGlzYWJsZV9wZXJfY2hhbm5lbF9xdWFudGl6YXRpb25fZm9yX2RlbnNlX2xheWVycyA9IFRydWUKKyAgY29udmVydGVyLl9leHBlcmltZW50YWxfZGlzYWJsZV9wZXJfY2hhbm5lbCA9IFRydWUKICAgcmV0dXJuIGNvbnZlcnRlci5jb252ZXJ0KCkKIAogCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvcmVxdWFudGl6ZV9mbGF0YnVmZmVyX3V0aWxzLnB5IGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL3JlcXVhbnRpemVfZmxhdGJ1ZmZlcl91dGlscy5weQppbmRleCA1NzA5ZmYyLi5jNGEzYjEwIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvbWljcm8vdG9vbHMvcmVxdWFudGl6ZV9mbGF0YnVmZmVyX3V0aWxzLnB5CisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy9yZXF1YW50aXplX2ZsYXRidWZmZXJfdXRpbHMucHkKQEAgLTI0LDcgKzI0LDcgQEAKICAgICBUZW5zb3JUeXBlLklOVDMyOiBucC5pbnQzMiwKICAgICBUZW5zb3JUeXBlLlVJTlQ4OiBucC51aW50OCwKICAgICBUZW5zb3JUeXBlLklOVDY0OiBucC5pbnQ2NCwKLSAgICBUZW5zb3JUeXBlLlNUUklORzogbnAuc3RyaW5nXywKKyAgICBUZW5zb3JUeXBlLlNUUklORzogbnAuYnl0ZXNfLAogICAgIFRlbnNvclR5cGUuQk9PTDogbnAuYm9vbF8sCiAgICAgVGVuc29yVHlwZS5JTlQxNjogbnAuaW50MTYsCiAgICAgVGVuc29yVHlwZS5DT01QTEVYNjQ6IG5wLmNvbXBsZXg2NCwKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9taWNyby90b29scy90ZmxtX21vZGVsX3RyYW5zZm9ybXNfbGliLnB5IGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL3RmbG1fbW9kZWxfdHJhbnNmb3Jtc19saWIucHkKaW5kZXggNjA1MzBmZi4uMmJmOTBjZiAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL3RmbG1fbW9kZWxfdHJhbnNmb3Jtc19saWIucHkKKysrIGIvdGVuc29yZmxvdy9saXRlL21pY3JvL3Rvb2xzL3RmbG1fbW9kZWxfdHJhbnNmb3Jtc19saWIucHkKQEAgLTI5LDcgKzI5LDcgQEAKIAogZnJvbSB0ZmxpdGVfbWljcm8udGVuc29yZmxvdy5saXRlLnRvb2xzIGltcG9ydCBmbGF0YnVmZmVyX3V0aWxzCiBmcm9tIHRmbGl0ZV9taWNyby50ZW5zb3JmbG93LmxpdGUubWljcm8udG9vbHMgaW1wb3J0IG1vZGVsX3RyYW5zZm9ybXNfdXRpbHMKLWZyb20gdGZsaXRlX21pY3JvLnRlbnNvcmZsb3cubGl0ZS5taWNyby5weXRob24uaW50ZXJwcmV0ZXIuc3JjIGltcG9ydCBydW50aW1lCitmcm9tIHRmbGl0ZV9taWNyby5weXRob24udGZsaXRlX21pY3JvIGltcG9ydCBydW50aW1lCiAKIAogZGVmIF9zYXZlX2FuZF9hbGlnbl9mbGF0YnVmZmVyKG1vZGVsLCBtb2RlbF9wYXRoKToKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9wb3J0YWJsZV90eXBlX3RvX3RmbGl0ZXR5cGUuaCBiL3RlbnNvcmZsb3cvbGl0ZS9wb3J0YWJsZV90eXBlX3RvX3RmbGl0ZXR5cGUuaAppbmRleCBiNjAwNTg1Li4wMzM1N2RiIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvcG9ydGFibGVfdHlwZV90b190ZmxpdGV0eXBlLmgKKysrIGIvdGVuc29yZmxvdy9saXRlL3BvcnRhYmxlX3R5cGVfdG9fdGZsaXRldHlwZS5oCkBAIC01Miw2ICs1MiwxMCBAQAogICAgIHJldHVybiBURkxJVEVfVFlQRV9FTlVNOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjb25zdGV4cHIgVGZMaXRlVHlwZSB0eXBlVG9UZkxpdGVUeXBlPGNvbnN0IENQUF9UWVBFPigpIHsgICAgXAorICAgIHJldHVybiBURkxJVEVfVFlQRV9FTlVNOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBzdHJ1Y3QgVGZMaXRlVHlwZVRvVHlwZTxURkxJVEVfVFlQRV9FTlVNPiB7ICAgICAgICAgICAgICAgICAgXAogICAgIHVzaW5nIFR5cGUgPSBDUFBfVFlQRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB9CmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvcHl0aG9uL0JVSUxEIGIvdGVuc29yZmxvdy9saXRlL3B5dGhvbi9CVUlMRAppbmRleCAzZGM3MjMyLi43YTdjZTNjIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvcHl0aG9uL0JVSUxECisrKyBiL3RlbnNvcmZsb3cvbGl0ZS9weXRob24vQlVJTEQKQEAgLTEwLDcgKzEwLDcgQEAKIAogZmxhdGJ1ZmZlcl9weV9saWJyYXJ5KAogICAgIG5hbWUgPSAic2NoZW1hX3B5IiwKLSAgICBzcmNzID0gWyIvL3RlbnNvcmZsb3cvbGl0ZS9zY2hlbWE6c2NoZW1hLmZicyJdLAorICAgIHNyY3MgPSBbIi8vdGVuc29yZmxvdy9jb21waWxlci9tbGlyL2xpdGUvc2NoZW1hOnNjaGVtYS5mYnMiXSwKICkKIAogcHlfbGlicmFyeSgKQEAgLTIwLDYgKzIwLDYgQEAKICAgICB2aXNpYmlsaXR5ID0gWyIvLzpfX3N1YnBhY2thZ2VzX18iXSwKICAgICBkZXBzID0gWwogICAgICAgICByZXF1aXJlbWVudCgiZmxhdGJ1ZmZlcnMiKSwKLSAgICAgICAgcmVxdWlyZW1lbnQoInRlbnNvcmZsb3ctY3B1IiksCisgICAgICAgIHJlcXVpcmVtZW50KCJ0ZW5zb3JmbG93IiksCiAgICAgXSwKICkKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9weXRob24vc2NoZW1hX3B5X2dlbmVyYXRlZC5weSBiL3RlbnNvcmZsb3cvbGl0ZS9weXRob24vc2NoZW1hX3B5X2dlbmVyYXRlZC5weQppbmRleCA5MTQzNDBlLi41Mjk5OWNiIDEwMDc1NQotLS0gYS90ZW5zb3JmbG93L2xpdGUvcHl0aG9uL3NjaGVtYV9weV9nZW5lcmF0ZWQucHkKKysrIGIvdGVuc29yZmxvdy9saXRlL3B5dGhvbi9zY2hlbWFfcHlfZ2VuZXJhdGVkLnB5CkBAIC03LDEzODYgKzcsNjQgQEAKIGZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKIG5wID0gaW1wb3J0X251bXB5KCkKIAotY2xhc3MgQVRhbjJPcHRpb25zKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KK2NsYXNzIFRlbnNvclR5cGUob2JqZWN0KToKKyAgICBGTE9BVDMyID0gMAorICAgIEZMT0FUMTYgPSAxCisgICAgSU5UMzIgPSAyCisgICAgVUlOVDggPSAzCisgICAgSU5UNjQgPSA0CisgICAgU1RSSU5HID0gNQorICAgIEJPT0wgPSA2CisgICAgSU5UMTYgPSA3CisgICAgQ09NUExFWDY0ID0gOAorICAgIElOVDggPSA5CisgICAgRkxPQVQ2NCA9IDEwCisgICAgQ09NUExFWDEyOCA9IDExCisgICAgVUlOVDY0ID0gMTIKKyAgICBSRVNPVVJDRSA9IDEzCisgICAgVkFSSUFOVCA9IDE0CisgICAgVUlOVDMyID0gMTUKKyAgICBVSU5UMTYgPSAxNgorICAgIElOVDQgPSAxNworICAgIEJGTE9BVDE2ID0gMTgKIAotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gQVRhbjJPcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKIAotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNBVGFuMk9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBBVGFuMk9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIEFUYW4yT3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLWRlZiBBVGFuMk9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgwKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBBVGFuMk9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIEFUYW4yT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEFUYW4yT3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBBVGFuMk9wdGlvbnNUKG9iamVjdCk6Ci0KLSAgICAjIEFUYW4yT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgYXRhbjJvcHRpb25zID0gQVRhbjJPcHRpb25zKCkKLSAgICAgICAgYXRhbjJvcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooYXRhbjJvcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgYXRhbjJvcHRpb25zKToKLSAgICAgICAgeCA9IEFUYW4yT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2soYXRhbjJvcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBBVGFuMk9wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgYXRhbjJvcHRpb25zKToKLSAgICAgICAgaWYgYXRhbjJvcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLQotICAgICMgQVRhbjJPcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBBVGFuMk9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBhdGFuMm9wdGlvbnMgPSBBVGFuMk9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIGF0YW4yb3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIEFic09wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBBYnNPcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNBYnNPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgQWJzT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgQWJzT3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLWRlZiBBYnNPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gQWJzT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgQWJzT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEFic09wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgQWJzT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgQWJzT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgYWJzT3B0aW9ucyA9IEFic09wdGlvbnMoKQotICAgICAgICBhYnNPcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooYWJzT3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGFic09wdGlvbnMpOgotICAgICAgICB4ID0gQWJzT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2soYWJzT3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgQWJzT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBhYnNPcHRpb25zKToKLSAgICAgICAgaWYgYWJzT3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAjIEFic09wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIEFic09wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBhYnNPcHRpb25zID0gQWJzT3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gYWJzT3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1jbGFzcyBBY3RpdmF0aW9uRnVuY3Rpb25UeXBlKG9iamVjdCk6CitjbGFzcyBRdWFudGl6YXRpb25EZXRhaWxzKG9iamVjdCk6CiAgICAgTk9ORSA9IDAKLSAgICBSRUxVID0gMQotICAgIFJFTFVfTjFfVE9fMSA9IDIKLSAgICBSRUxVNiA9IDMKLSAgICBUQU5IID0gNAotICAgIFNJR05fQklUID0gNQotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKyAgICBDdXN0b21RdWFudGl6YXRpb24gPSAxCiAKLSMgbmFtZXNwYWNlOiB0ZmxpdGUKK2RlZiBRdWFudGl6YXRpb25EZXRhaWxzQ3JlYXRvcih1bmlvblR5cGUsIHRhYmxlKToKKyAgICBmcm9tIGZsYXRidWZmZXJzLnRhYmxlIGltcG9ydCBUYWJsZQorICAgIGlmIG5vdCBpc2luc3RhbmNlKHRhYmxlLCBUYWJsZSk6CisgICAgICAgIHJldHVybiBOb25lCisgICAgaWYgdW5pb25UeXBlID09IFF1YW50aXphdGlvbkRldGFpbHMoKS5DdXN0b21RdWFudGl6YXRpb246CisgICAgICAgIHJldHVybiBDdXN0b21RdWFudGl6YXRpb25ULkluaXRGcm9tQnVmKHRhYmxlLkJ5dGVzLCB0YWJsZS5Qb3MpCisgICAgcmV0dXJuIE5vbmUKIAotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQogCi1jbGFzcyBBZGROT3B0aW9ucyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCitjbGFzcyBEaW1lbnNpb25UeXBlKG9iamVjdCk6CisgICAgREVOU0UgPSAwCisgICAgU1BBUlNFX0NTUiA9IDEKIAotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gQWRkTk9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAogCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc0FkZE5PcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgQWRkTk9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCitjbGFzcyBTcGFyc2VJbmRleFZlY3RvcihvYmplY3QpOgorICAgIE5PTkUgPSAwCisgICAgSW50MzJWZWN0b3IgPSAxCisgICAgVWludDE2VmVjdG9yID0gMgorICAgIFVpbnQ4VmVjdG9yID0gMwogCi0gICAgIyBBZGROT3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLWRlZiBBZGROT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEFkZE5PcHRpb25zU3RhcnQoYnVpbGRlcikKLWRlZiBBZGROT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEFkZE5PcHRpb25zRW5kKGJ1aWxkZXIpCi0KLWNsYXNzIEFkZE5PcHRpb25zVChvYmplY3QpOgotCi0gICAgIyBBZGROT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgYWRkTm9wdGlvbnMgPSBBZGROT3B0aW9ucygpCi0gICAgICAgIGFkZE5vcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooYWRkTm9wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBhZGROb3B0aW9ucyk6Ci0gICAgICAgIHggPSBBZGROT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2soYWRkTm9wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIEFkZE5PcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIGFkZE5vcHRpb25zKToKLSAgICAgICAgaWYgYWRkTm9wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgIyBBZGROT3B0aW9uc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgQWRkTk9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBhZGROb3B0aW9ucyA9IEFkZE5PcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBhZGROb3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIEFkZE9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBBZGRPcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNBZGRPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgQWRkT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgQWRkT3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLSAgICAjIEFkZE9wdGlvbnMKLSAgICBkZWYgRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBBZGRPcHRpb25zCi0gICAgZGVmIFBvdFNjYWxlSW50MTYoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkJvb2xGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpKQotICAgICAgICByZXR1cm4gVHJ1ZQotCi1kZWYgQWRkT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDIpCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEFkZE9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIEFkZE9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbik6IGJ1aWxkZXIuUHJlcGVuZEludDhTbG90KDAsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uLCAwKQotZGVmIEFkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKToKLSAgICByZXR1cm4gQWRkT3B0aW9uc0FkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKQotZGVmIEFkZE9wdGlvbnNBZGRQb3RTY2FsZUludDE2KGJ1aWxkZXIsIHBvdFNjYWxlSW50MTYpOiBidWlsZGVyLlByZXBlbmRCb29sU2xvdCgxLCBwb3RTY2FsZUludDE2LCAxKQotZGVmIEFkZFBvdFNjYWxlSW50MTYoYnVpbGRlciwgcG90U2NhbGVJbnQxNik6Ci0gICAgcmV0dXJuIEFkZE9wdGlvbnNBZGRQb3RTY2FsZUludDE2KGJ1aWxkZXIsIHBvdFNjYWxlSW50MTYpCi1kZWYgQWRkT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEFkZE9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgQWRkT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgQWRkT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYuZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24gPSAwICAjIHR5cGU6IGludAotICAgICAgICBzZWxmLnBvdFNjYWxlSW50MTYgPSBUcnVlICAjIHR5cGU6IGJvb2wKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgYWRkT3B0aW9ucyA9IEFkZE9wdGlvbnMoKQotICAgICAgICBhZGRPcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooYWRkT3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGFkZE9wdGlvbnMpOgotICAgICAgICB4ID0gQWRkT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2soYWRkT3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgQWRkT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBhZGRPcHRpb25zKToKLSAgICAgICAgaWYgYWRkT3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYuZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24gPSBhZGRPcHRpb25zLkZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKCkKLSAgICAgICAgc2VsZi5wb3RTY2FsZUludDE2ID0gYWRkT3B0aW9ucy5Qb3RTY2FsZUludDE2KCkKLQotICAgICMgQWRkT3B0aW9uc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgQWRkT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIEFkZE9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBzZWxmLmZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKQotICAgICAgICBBZGRPcHRpb25zQWRkUG90U2NhbGVJbnQxNihidWlsZGVyLCBzZWxmLnBvdFNjYWxlSW50MTYpCi0gICAgICAgIGFkZE9wdGlvbnMgPSBBZGRPcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBhZGRPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgQXJnTWF4T3B0aW9ucyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IEFyZ01heE9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc0FyZ01heE9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBBcmdNYXhPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBBcmdNYXhPcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotICAgICMgQXJnTWF4T3B0aW9ucwotICAgIGRlZiBPdXRwdXRUeXBlKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50OEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAKLQotZGVmIEFyZ01heE9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgxKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBBcmdNYXhPcHRpb25zU3RhcnQoYnVpbGRlcikKLWRlZiBBcmdNYXhPcHRpb25zQWRkT3V0cHV0VHlwZShidWlsZGVyLCBvdXRwdXRUeXBlKTogYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoMCwgb3V0cHV0VHlwZSwgMCkKLWRlZiBBZGRPdXRwdXRUeXBlKGJ1aWxkZXIsIG91dHB1dFR5cGUpOgotICAgIHJldHVybiBBcmdNYXhPcHRpb25zQWRkT3V0cHV0VHlwZShidWlsZGVyLCBvdXRwdXRUeXBlKQotZGVmIEFyZ01heE9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBBcmdNYXhPcHRpb25zRW5kKGJ1aWxkZXIpCi0KLWNsYXNzIEFyZ01heE9wdGlvbnNUKG9iamVjdCk6Ci0KLSAgICAjIEFyZ01heE9wdGlvbnNUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBzZWxmLm91dHB1dFR5cGUgPSAwICAjIHR5cGU6IGludAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBhcmdNYXhPcHRpb25zID0gQXJnTWF4T3B0aW9ucygpCi0gICAgICAgIGFyZ01heE9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihhcmdNYXhPcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgYXJnTWF4T3B0aW9ucyk6Ci0gICAgICAgIHggPSBBcmdNYXhPcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhhcmdNYXhPcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBBcmdNYXhPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIGFyZ01heE9wdGlvbnMpOgotICAgICAgICBpZiBhcmdNYXhPcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi5vdXRwdXRUeXBlID0gYXJnTWF4T3B0aW9ucy5PdXRwdXRUeXBlKCkKLQotICAgICMgQXJnTWF4T3B0aW9uc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgQXJnTWF4T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIEFyZ01heE9wdGlvbnNBZGRPdXRwdXRUeXBlKGJ1aWxkZXIsIHNlbGYub3V0cHV0VHlwZSkKLSAgICAgICAgYXJnTWF4T3B0aW9ucyA9IEFyZ01heE9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIGFyZ01heE9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBBcmdNaW5PcHRpb25zKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gQXJnTWluT3B0aW9ucygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzQXJnTWluT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEFyZ01pbk9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIEFyZ01pbk9wdGlvbnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi0gICAgIyBBcmdNaW5PcHRpb25zCi0gICAgZGVmIE91dHB1dFR5cGUoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gMAotCi1kZWYgQXJnTWluT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDEpCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEFyZ01pbk9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIEFyZ01pbk9wdGlvbnNBZGRPdXRwdXRUeXBlKGJ1aWxkZXIsIG91dHB1dFR5cGUpOiBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCgwLCBvdXRwdXRUeXBlLCAwKQotZGVmIEFkZE91dHB1dFR5cGUoYnVpbGRlciwgb3V0cHV0VHlwZSk6Ci0gICAgcmV0dXJuIEFyZ01pbk9wdGlvbnNBZGRPdXRwdXRUeXBlKGJ1aWxkZXIsIG91dHB1dFR5cGUpCi1kZWYgQXJnTWluT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEFyZ01pbk9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgQXJnTWluT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgQXJnTWluT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYub3V0cHV0VHlwZSA9IDAgICMgdHlwZTogaW50Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIGFyZ01pbk9wdGlvbnMgPSBBcmdNaW5PcHRpb25zKCkKLSAgICAgICAgYXJnTWluT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGFyZ01pbk9wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBhcmdNaW5PcHRpb25zKToKLSAgICAgICAgeCA9IEFyZ01pbk9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKGFyZ01pbk9wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIEFyZ01pbk9wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgYXJnTWluT3B0aW9ucyk6Ci0gICAgICAgIGlmIGFyZ01pbk9wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLm91dHB1dFR5cGUgPSBhcmdNaW5PcHRpb25zLk91dHB1dFR5cGUoKQotCi0gICAgIyBBcmdNaW5PcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBBcmdNaW5PcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgQXJnTWluT3B0aW9uc0FkZE91dHB1dFR5cGUoYnVpbGRlciwgc2VsZi5vdXRwdXRUeXBlKQotICAgICAgICBhcmdNaW5PcHRpb25zID0gQXJnTWluT3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gYXJnTWluT3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIEFzc2lnblZhcmlhYmxlT3B0aW9ucyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IEFzc2lnblZhcmlhYmxlT3B0aW9ucygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzQXNzaWduVmFyaWFibGVPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgQXNzaWduVmFyaWFibGVPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBBc3NpZ25WYXJpYWJsZU9wdGlvbnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi1kZWYgQXNzaWduVmFyaWFibGVPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gQXNzaWduVmFyaWFibGVPcHRpb25zU3RhcnQoYnVpbGRlcikKLWRlZiBBc3NpZ25WYXJpYWJsZU9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBBc3NpZ25WYXJpYWJsZU9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgQXNzaWduVmFyaWFibGVPcHRpb25zVChvYmplY3QpOgotCi0gICAgIyBBc3NpZ25WYXJpYWJsZU9wdGlvbnNUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBwYXNzCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIGFzc2lnblZhcmlhYmxlT3B0aW9ucyA9IEFzc2lnblZhcmlhYmxlT3B0aW9ucygpCi0gICAgICAgIGFzc2lnblZhcmlhYmxlT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGFzc2lnblZhcmlhYmxlT3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGFzc2lnblZhcmlhYmxlT3B0aW9ucyk6Ci0gICAgICAgIHggPSBBc3NpZ25WYXJpYWJsZU9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKGFzc2lnblZhcmlhYmxlT3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgQXNzaWduVmFyaWFibGVPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIGFzc2lnblZhcmlhYmxlT3B0aW9ucyk6Ci0gICAgICAgIGlmIGFzc2lnblZhcmlhYmxlT3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAjIEFzc2lnblZhcmlhYmxlT3B0aW9uc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgQXNzaWduVmFyaWFibGVPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgYXNzaWduVmFyaWFibGVPcHRpb25zID0gQXNzaWduVmFyaWFibGVPcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBhc3NpZ25WYXJpYWJsZU9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBCYXRjaE1hdE11bE9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBCYXRjaE1hdE11bE9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc0JhdGNoTWF0TXVsT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEJhdGNoTWF0TXVsT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgQmF0Y2hNYXRNdWxPcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotICAgICMgQmF0Y2hNYXRNdWxPcHRpb25zCi0gICAgZGVmIEFkalgoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkJvb2xGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpKQotICAgICAgICByZXR1cm4gRmFsc2UKLQotICAgICMgQmF0Y2hNYXRNdWxPcHRpb25zCi0gICAgZGVmIEFkalkoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkJvb2xGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpKQotICAgICAgICByZXR1cm4gRmFsc2UKLQotICAgICMgQmF0Y2hNYXRNdWxPcHRpb25zCi0gICAgZGVmIEFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyhzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg4KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuQm9vbEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykpCi0gICAgICAgIHJldHVybiBGYWxzZQotCi1kZWYgQmF0Y2hNYXRNdWxPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMykKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gQmF0Y2hNYXRNdWxPcHRpb25zU3RhcnQoYnVpbGRlcikKLWRlZiBCYXRjaE1hdE11bE9wdGlvbnNBZGRBZGpYKGJ1aWxkZXIsIGFkalgpOiBidWlsZGVyLlByZXBlbmRCb29sU2xvdCgwLCBhZGpYLCAwKQotZGVmIEFkZEFkalgoYnVpbGRlciwgYWRqWCk6Ci0gICAgcmV0dXJuIEJhdGNoTWF0TXVsT3B0aW9uc0FkZEFkalgoYnVpbGRlciwgYWRqWCkKLWRlZiBCYXRjaE1hdE11bE9wdGlvbnNBZGRBZGpZKGJ1aWxkZXIsIGFkalkpOiBidWlsZGVyLlByZXBlbmRCb29sU2xvdCgxLCBhZGpZLCAwKQotZGVmIEFkZEFkalkoYnVpbGRlciwgYWRqWSk6Ci0gICAgcmV0dXJuIEJhdGNoTWF0TXVsT3B0aW9uc0FkZEFkalkoYnVpbGRlciwgYWRqWSkKLWRlZiBCYXRjaE1hdE11bE9wdGlvbnNBZGRBc3ltbWV0cmljUXVhbnRpemVJbnB1dHMoYnVpbGRlciwgYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKTogYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoMiwgYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzLCAwKQotZGVmIEFkZEFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyhidWlsZGVyLCBhc3ltbWV0cmljUXVhbnRpemVJbnB1dHMpOgotICAgIHJldHVybiBCYXRjaE1hdE11bE9wdGlvbnNBZGRBc3ltbWV0cmljUXVhbnRpemVJbnB1dHMoYnVpbGRlciwgYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKQotZGVmIEJhdGNoTWF0TXVsT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEJhdGNoTWF0TXVsT3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBCYXRjaE1hdE11bE9wdGlvbnNUKG9iamVjdCk6Ci0KLSAgICAjIEJhdGNoTWF0TXVsT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYuYWRqWCA9IEZhbHNlICAjIHR5cGU6IGJvb2wKLSAgICAgICAgc2VsZi5hZGpZID0gRmFsc2UgICMgdHlwZTogYm9vbAotICAgICAgICBzZWxmLmFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyA9IEZhbHNlICAjIHR5cGU6IGJvb2wKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgYmF0Y2hNYXRNdWxPcHRpb25zID0gQmF0Y2hNYXRNdWxPcHRpb25zKCkKLSAgICAgICAgYmF0Y2hNYXRNdWxPcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooYmF0Y2hNYXRNdWxPcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgYmF0Y2hNYXRNdWxPcHRpb25zKToKLSAgICAgICAgeCA9IEJhdGNoTWF0TXVsT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2soYmF0Y2hNYXRNdWxPcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBCYXRjaE1hdE11bE9wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgYmF0Y2hNYXRNdWxPcHRpb25zKToKLSAgICAgICAgaWYgYmF0Y2hNYXRNdWxPcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi5hZGpYID0gYmF0Y2hNYXRNdWxPcHRpb25zLkFkalgoKQotICAgICAgICBzZWxmLmFkalkgPSBiYXRjaE1hdE11bE9wdGlvbnMuQWRqWSgpCi0gICAgICAgIHNlbGYuYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzID0gYmF0Y2hNYXRNdWxPcHRpb25zLkFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cygpCi0KLSAgICAjIEJhdGNoTWF0TXVsT3B0aW9uc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgQmF0Y2hNYXRNdWxPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgQmF0Y2hNYXRNdWxPcHRpb25zQWRkQWRqWChidWlsZGVyLCBzZWxmLmFkalgpCi0gICAgICAgIEJhdGNoTWF0TXVsT3B0aW9uc0FkZEFkalkoYnVpbGRlciwgc2VsZi5hZGpZKQotICAgICAgICBCYXRjaE1hdE11bE9wdGlvbnNBZGRBc3ltbWV0cmljUXVhbnRpemVJbnB1dHMoYnVpbGRlciwgc2VsZi5hc3ltbWV0cmljUXVhbnRpemVJbnB1dHMpCi0gICAgICAgIGJhdGNoTWF0TXVsT3B0aW9ucyA9IEJhdGNoTWF0TXVsT3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gYmF0Y2hNYXRNdWxPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgQmF0Y2hUb1NwYWNlTkRPcHRpb25zKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gQmF0Y2hUb1NwYWNlTkRPcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNCYXRjaFRvU3BhY2VORE9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBCYXRjaFRvU3BhY2VORE9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIEJhdGNoVG9TcGFjZU5ET3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLWRlZiBCYXRjaFRvU3BhY2VORE9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgwKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBCYXRjaFRvU3BhY2VORE9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIEJhdGNoVG9TcGFjZU5ET3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEJhdGNoVG9TcGFjZU5ET3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBCYXRjaFRvU3BhY2VORE9wdGlvbnNUKG9iamVjdCk6Ci0KLSAgICAjIEJhdGNoVG9TcGFjZU5ET3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgYmF0Y2hUb1NwYWNlTmRvcHRpb25zID0gQmF0Y2hUb1NwYWNlTkRPcHRpb25zKCkKLSAgICAgICAgYmF0Y2hUb1NwYWNlTmRvcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooYmF0Y2hUb1NwYWNlTmRvcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgYmF0Y2hUb1NwYWNlTmRvcHRpb25zKToKLSAgICAgICAgeCA9IEJhdGNoVG9TcGFjZU5ET3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2soYmF0Y2hUb1NwYWNlTmRvcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBCYXRjaFRvU3BhY2VORE9wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgYmF0Y2hUb1NwYWNlTmRvcHRpb25zKToKLSAgICAgICAgaWYgYmF0Y2hUb1NwYWNlTmRvcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLQotICAgICMgQmF0Y2hUb1NwYWNlTkRPcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBCYXRjaFRvU3BhY2VORE9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBiYXRjaFRvU3BhY2VOZG9wdGlvbnMgPSBCYXRjaFRvU3BhY2VORE9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIGJhdGNoVG9TcGFjZU5kb3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc0JpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotICAgICMgQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnMKLSAgICBkZWYgRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9ucwotICAgIGRlZiBDZWxsQ2xpcChzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkZsb2F0MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiAwLjAKLQotICAgICMgQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnMKLSAgICBkZWYgUHJvakNsaXAoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5GbG9hdDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gMC4wCi0KLSAgICAjIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zCi0gICAgZGVmIE1lcmdlT3V0cHV0cyhzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkJvb2xGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpKQotICAgICAgICByZXR1cm4gRmFsc2UKLQotICAgICMgQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnMKLSAgICBkZWYgVGltZU1ham9yKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEyKSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuQm9vbEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykpCi0gICAgICAgIHJldHVybiBUcnVlCi0KLSAgICAjIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zCi0gICAgZGVmIEFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyhzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkJvb2xGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpKQotICAgICAgICByZXR1cm4gRmFsc2UKLQotZGVmIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoNikKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pOiBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCgwLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbiwgMCkKLWRlZiBBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbik6Ci0gICAgcmV0dXJuIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pCi1kZWYgQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNBZGRDZWxsQ2xpcChidWlsZGVyLCBjZWxsQ2xpcCk6IGJ1aWxkZXIuUHJlcGVuZEZsb2F0MzJTbG90KDEsIGNlbGxDbGlwLCAwLjApCi1kZWYgQWRkQ2VsbENsaXAoYnVpbGRlciwgY2VsbENsaXApOgotICAgIHJldHVybiBCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc0FkZENlbGxDbGlwKGJ1aWxkZXIsIGNlbGxDbGlwKQotZGVmIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zQWRkUHJvakNsaXAoYnVpbGRlciwgcHJvakNsaXApOiBidWlsZGVyLlByZXBlbmRGbG9hdDMyU2xvdCgyLCBwcm9qQ2xpcCwgMC4wKQotZGVmIEFkZFByb2pDbGlwKGJ1aWxkZXIsIHByb2pDbGlwKToKLSAgICByZXR1cm4gQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNBZGRQcm9qQ2xpcChidWlsZGVyLCBwcm9qQ2xpcCkKLWRlZiBCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc0FkZE1lcmdlT3V0cHV0cyhidWlsZGVyLCBtZXJnZU91dHB1dHMpOiBidWlsZGVyLlByZXBlbmRCb29sU2xvdCgzLCBtZXJnZU91dHB1dHMsIDApCi1kZWYgQWRkTWVyZ2VPdXRwdXRzKGJ1aWxkZXIsIG1lcmdlT3V0cHV0cyk6Ci0gICAgcmV0dXJuIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zQWRkTWVyZ2VPdXRwdXRzKGJ1aWxkZXIsIG1lcmdlT3V0cHV0cykKLWRlZiBCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc0FkZFRpbWVNYWpvcihidWlsZGVyLCB0aW1lTWFqb3IpOiBidWlsZGVyLlByZXBlbmRCb29sU2xvdCg0LCB0aW1lTWFqb3IsIDEpCi1kZWYgQWRkVGltZU1ham9yKGJ1aWxkZXIsIHRpbWVNYWpvcik6Ci0gICAgcmV0dXJuIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zQWRkVGltZU1ham9yKGJ1aWxkZXIsIHRpbWVNYWpvcikKLWRlZiBCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc0FkZEFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyhidWlsZGVyLCBhc3ltbWV0cmljUXVhbnRpemVJbnB1dHMpOiBidWlsZGVyLlByZXBlbmRCb29sU2xvdCg1LCBhc3ltbWV0cmljUXVhbnRpemVJbnB1dHMsIDApCi1kZWYgQWRkQXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKGJ1aWxkZXIsIGFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyk6Ci0gICAgcmV0dXJuIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zQWRkQXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKGJ1aWxkZXIsIGFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cykKLWRlZiBCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zRW5kKGJ1aWxkZXIpCi0KLWNsYXNzIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zVChvYmplY3QpOgotCi0gICAgIyBCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYuZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24gPSAwICAjIHR5cGU6IGludAotICAgICAgICBzZWxmLmNlbGxDbGlwID0gMC4wICAjIHR5cGU6IGZsb2F0Ci0gICAgICAgIHNlbGYucHJvakNsaXAgPSAwLjAgICMgdHlwZTogZmxvYXQKLSAgICAgICAgc2VsZi5tZXJnZU91dHB1dHMgPSBGYWxzZSAgIyB0eXBlOiBib29sCi0gICAgICAgIHNlbGYudGltZU1ham9yID0gVHJ1ZSAgIyB0eXBlOiBib29sCi0gICAgICAgIHNlbGYuYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzID0gRmFsc2UgICMgdHlwZTogYm9vbAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBiaWRpcmVjdGlvbmFsU2VxdWVuY2VMc3Rtb3B0aW9ucyA9IEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zKCkKLSAgICAgICAgYmlkaXJlY3Rpb25hbFNlcXVlbmNlTHN0bW9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihiaWRpcmVjdGlvbmFsU2VxdWVuY2VMc3Rtb3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxzdG1vcHRpb25zKToKLSAgICAgICAgeCA9IEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhiaWRpcmVjdGlvbmFsU2VxdWVuY2VMc3Rtb3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgYmlkaXJlY3Rpb25hbFNlcXVlbmNlTHN0bW9wdGlvbnMpOgotICAgICAgICBpZiBiaWRpcmVjdGlvbmFsU2VxdWVuY2VMc3Rtb3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYuZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24gPSBiaWRpcmVjdGlvbmFsU2VxdWVuY2VMc3Rtb3B0aW9ucy5GdXNlZEFjdGl2YXRpb25GdW5jdGlvbigpCi0gICAgICAgIHNlbGYuY2VsbENsaXAgPSBiaWRpcmVjdGlvbmFsU2VxdWVuY2VMc3Rtb3B0aW9ucy5DZWxsQ2xpcCgpCi0gICAgICAgIHNlbGYucHJvakNsaXAgPSBiaWRpcmVjdGlvbmFsU2VxdWVuY2VMc3Rtb3B0aW9ucy5Qcm9qQ2xpcCgpCi0gICAgICAgIHNlbGYubWVyZ2VPdXRwdXRzID0gYmlkaXJlY3Rpb25hbFNlcXVlbmNlTHN0bW9wdGlvbnMuTWVyZ2VPdXRwdXRzKCkKLSAgICAgICAgc2VsZi50aW1lTWFqb3IgPSBiaWRpcmVjdGlvbmFsU2VxdWVuY2VMc3Rtb3B0aW9ucy5UaW1lTWFqb3IoKQotICAgICAgICBzZWxmLmFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyA9IGJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxzdG1vcHRpb25zLkFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cygpCi0KLSAgICAjIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbikKLSAgICAgICAgQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNBZGRDZWxsQ2xpcChidWlsZGVyLCBzZWxmLmNlbGxDbGlwKQotICAgICAgICBCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc0FkZFByb2pDbGlwKGJ1aWxkZXIsIHNlbGYucHJvakNsaXApCi0gICAgICAgIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zQWRkTWVyZ2VPdXRwdXRzKGJ1aWxkZXIsIHNlbGYubWVyZ2VPdXRwdXRzKQotICAgICAgICBCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc0FkZFRpbWVNYWpvcihidWlsZGVyLCBzZWxmLnRpbWVNYWpvcikKLSAgICAgICAgQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNBZGRBc3ltbWV0cmljUXVhbnRpemVJbnB1dHMoYnVpbGRlciwgc2VsZi5hc3ltbWV0cmljUXVhbnRpemVJbnB1dHMpCi0gICAgICAgIGJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxzdG1vcHRpb25zID0gQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIGJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxzdG1vcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9ucyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc0JpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotICAgICMgQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9ucwotICAgIGRlZiBUaW1lTWFqb3Ioc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkJvb2xGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpKQotICAgICAgICByZXR1cm4gRmFsc2UKLQotICAgICMgQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9ucwotICAgIGRlZiBGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDhGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnMKLSAgICBkZWYgTWVyZ2VPdXRwdXRzKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gYm9vbChzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5Cb29sRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKSkKLSAgICAgICAgcmV0dXJuIEZhbHNlCi0KLSAgICAjIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnMKLSAgICBkZWYgQXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEwKSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuQm9vbEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykpCi0gICAgICAgIHJldHVybiBGYWxzZQotCi1kZWYgQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDQpCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnNBZGRUaW1lTWFqb3IoYnVpbGRlciwgdGltZU1ham9yKTogYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoMCwgdGltZU1ham9yLCAwKQotZGVmIEFkZFRpbWVNYWpvcihidWlsZGVyLCB0aW1lTWFqb3IpOgotICAgIHJldHVybiBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zQWRkVGltZU1ham9yKGJ1aWxkZXIsIHRpbWVNYWpvcikKLWRlZiBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pOiBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCgxLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbiwgMCkKLWRlZiBBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbik6Ci0gICAgcmV0dXJuIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbikKLWRlZiBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zQWRkTWVyZ2VPdXRwdXRzKGJ1aWxkZXIsIG1lcmdlT3V0cHV0cyk6IGJ1aWxkZXIuUHJlcGVuZEJvb2xTbG90KDIsIG1lcmdlT3V0cHV0cywgMCkKLWRlZiBBZGRNZXJnZU91dHB1dHMoYnVpbGRlciwgbWVyZ2VPdXRwdXRzKToKLSAgICByZXR1cm4gQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9uc0FkZE1lcmdlT3V0cHV0cyhidWlsZGVyLCBtZXJnZU91dHB1dHMpCi1kZWYgQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9uc0FkZEFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyhidWlsZGVyLCBhc3ltbWV0cmljUXVhbnRpemVJbnB1dHMpOiBidWlsZGVyLlByZXBlbmRCb29sU2xvdCgzLCBhc3ltbWV0cmljUXVhbnRpemVJbnB1dHMsIDApCi1kZWYgQWRkQXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKGJ1aWxkZXIsIGFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyk6Ci0gICAgcmV0dXJuIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnNBZGRBc3ltbWV0cmljUXVhbnRpemVJbnB1dHMoYnVpbGRlciwgYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKQotZGVmIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zRW5kKGJ1aWxkZXIpCi0KLWNsYXNzIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnNUKG9iamVjdCk6Ci0KLSAgICAjIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnNUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBzZWxmLnRpbWVNYWpvciA9IEZhbHNlICAjIHR5cGU6IGJvb2wKLSAgICAgICAgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbiA9IDAgICMgdHlwZTogaW50Ci0gICAgICAgIHNlbGYubWVyZ2VPdXRwdXRzID0gRmFsc2UgICMgdHlwZTogYm9vbAotICAgICAgICBzZWxmLmFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyA9IEZhbHNlICAjIHR5cGU6IGJvb2wKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgYmlkaXJlY3Rpb25hbFNlcXVlbmNlUm5ub3B0aW9ucyA9IEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnMoKQotICAgICAgICBiaWRpcmVjdGlvbmFsU2VxdWVuY2VSbm5vcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooYmlkaXJlY3Rpb25hbFNlcXVlbmNlUm5ub3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJubm9wdGlvbnMpOgotICAgICAgICB4ID0gQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2soYmlkaXJlY3Rpb25hbFNlcXVlbmNlUm5ub3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBiaWRpcmVjdGlvbmFsU2VxdWVuY2VSbm5vcHRpb25zKToKLSAgICAgICAgaWYgYmlkaXJlY3Rpb25hbFNlcXVlbmNlUm5ub3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYudGltZU1ham9yID0gYmlkaXJlY3Rpb25hbFNlcXVlbmNlUm5ub3B0aW9ucy5UaW1lTWFqb3IoKQotICAgICAgICBzZWxmLmZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uID0gYmlkaXJlY3Rpb25hbFNlcXVlbmNlUm5ub3B0aW9ucy5GdXNlZEFjdGl2YXRpb25GdW5jdGlvbigpCi0gICAgICAgIHNlbGYubWVyZ2VPdXRwdXRzID0gYmlkaXJlY3Rpb25hbFNlcXVlbmNlUm5ub3B0aW9ucy5NZXJnZU91dHB1dHMoKQotICAgICAgICBzZWxmLmFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyA9IGJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJubm9wdGlvbnMuQXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKCkKLQotICAgICMgQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9uc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnNBZGRUaW1lTWFqb3IoYnVpbGRlciwgc2VsZi50aW1lTWFqb3IpCi0gICAgICAgIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBzZWxmLmZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKQotICAgICAgICBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zQWRkTWVyZ2VPdXRwdXRzKGJ1aWxkZXIsIHNlbGYubWVyZ2VPdXRwdXRzKQotICAgICAgICBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zQWRkQXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKGJ1aWxkZXIsIHNlbGYuYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKQotICAgICAgICBiaWRpcmVjdGlvbmFsU2VxdWVuY2VSbm5vcHRpb25zID0gQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gYmlkaXJlY3Rpb25hbFNlcXVlbmNlUm5ub3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIEJpdGNhc3RPcHRpb25zKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gQml0Y2FzdE9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc0JpdGNhc3RPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgQml0Y2FzdE9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIEJpdGNhc3RPcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotZGVmIEJpdGNhc3RPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gQml0Y2FzdE9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIEJpdGNhc3RPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gQml0Y2FzdE9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgQml0Y2FzdE9wdGlvbnNUKG9iamVjdCk6Ci0KLSAgICAjIEJpdGNhc3RPcHRpb25zVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgcGFzcwotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBiaXRjYXN0T3B0aW9ucyA9IEJpdGNhc3RPcHRpb25zKCkKLSAgICAgICAgYml0Y2FzdE9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihiaXRjYXN0T3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGJpdGNhc3RPcHRpb25zKToKLSAgICAgICAgeCA9IEJpdGNhc3RPcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhiaXRjYXN0T3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgQml0Y2FzdE9wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgYml0Y2FzdE9wdGlvbnMpOgotICAgICAgICBpZiBiaXRjYXN0T3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAjIEJpdGNhc3RPcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBCaXRjYXN0T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIGJpdGNhc3RPcHRpb25zID0gQml0Y2FzdE9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIGJpdGNhc3RPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgQml0d2lzZVhvck9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBCaXR3aXNlWG9yT3B0aW9ucygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzQml0d2lzZVhvck9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBCaXR3aXNlWG9yT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgQml0d2lzZVhvck9wdGlvbnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi1kZWYgQml0d2lzZVhvck9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgwKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBCaXR3aXNlWG9yT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgQml0d2lzZVhvck9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBCaXR3aXNlWG9yT3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBCaXR3aXNlWG9yT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgQml0d2lzZVhvck9wdGlvbnNUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBwYXNzCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIGJpdHdpc2VYb3JPcHRpb25zID0gQml0d2lzZVhvck9wdGlvbnMoKQotICAgICAgICBiaXR3aXNlWG9yT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGJpdHdpc2VYb3JPcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgYml0d2lzZVhvck9wdGlvbnMpOgotICAgICAgICB4ID0gQml0d2lzZVhvck9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKGJpdHdpc2VYb3JPcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBCaXR3aXNlWG9yT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBiaXR3aXNlWG9yT3B0aW9ucyk6Ci0gICAgICAgIGlmIGJpdHdpc2VYb3JPcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLQotICAgICMgQml0d2lzZVhvck9wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIEJpdHdpc2VYb3JPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgYml0d2lzZVhvck9wdGlvbnMgPSBCaXR3aXNlWG9yT3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gYml0d2lzZVhvck9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBCcm9hZGNhc3RUb09wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBCcm9hZGNhc3RUb09wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc0Jyb2FkY2FzdFRvT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEJyb2FkY2FzdFRvT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgQnJvYWRjYXN0VG9PcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotZGVmIEJyb2FkY2FzdFRvT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEJyb2FkY2FzdFRvT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgQnJvYWRjYXN0VG9PcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gQnJvYWRjYXN0VG9PcHRpb25zRW5kKGJ1aWxkZXIpCi0KLWNsYXNzIEJyb2FkY2FzdFRvT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgQnJvYWRjYXN0VG9PcHRpb25zVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgcGFzcwotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBicm9hZGNhc3RUb09wdGlvbnMgPSBCcm9hZGNhc3RUb09wdGlvbnMoKQotICAgICAgICBicm9hZGNhc3RUb09wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihicm9hZGNhc3RUb09wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBicm9hZGNhc3RUb09wdGlvbnMpOgotICAgICAgICB4ID0gQnJvYWRjYXN0VG9PcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhicm9hZGNhc3RUb09wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIEJyb2FkY2FzdFRvT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBicm9hZGNhc3RUb09wdGlvbnMpOgotICAgICAgICBpZiBicm9hZGNhc3RUb09wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgIyBCcm9hZGNhc3RUb09wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIEJyb2FkY2FzdFRvT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIGJyb2FkY2FzdFRvT3B0aW9ucyA9IEJyb2FkY2FzdFRvT3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gYnJvYWRjYXN0VG9PcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgQnVja2V0aXplT3B0aW9ucyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IEJ1Y2tldGl6ZU9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc0J1Y2tldGl6ZU9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBCdWNrZXRpemVPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBCdWNrZXRpemVPcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotICAgICMgQnVja2V0aXplT3B0aW9ucwotICAgIGRlZiBCb3VuZGFyaWVzKHNlbGYsIGopOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICBhID0gc2VsZi5fdGFiLlZlY3RvcihvKQotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkZsb2F0MzJGbGFncywgYSArIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaiAqIDQpKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBCdWNrZXRpemVPcHRpb25zCi0gICAgZGVmIEJvdW5kYXJpZXNBc051bXB5KHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldFZlY3RvckFzTnVtcHkoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkZsb2F0MzJGbGFncywgbykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgQnVja2V0aXplT3B0aW9ucwotICAgIGRlZiBCb3VuZGFyaWVzTGVuZ3RoKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlZlY3RvckxlbihvKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBCdWNrZXRpemVPcHRpb25zCi0gICAgZGVmIEJvdW5kYXJpZXNJc05vbmUoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCi0gICAgICAgIHJldHVybiBvID09IDAKLQotZGVmIEJ1Y2tldGl6ZU9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgxKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBCdWNrZXRpemVPcHRpb25zU3RhcnQoYnVpbGRlcikKLWRlZiBCdWNrZXRpemVPcHRpb25zQWRkQm91bmRhcmllcyhidWlsZGVyLCBib3VuZGFyaWVzKTogYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMCwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShib3VuZGFyaWVzKSwgMCkKLWRlZiBBZGRCb3VuZGFyaWVzKGJ1aWxkZXIsIGJvdW5kYXJpZXMpOgotICAgIHJldHVybiBCdWNrZXRpemVPcHRpb25zQWRkQm91bmRhcmllcyhidWlsZGVyLCBib3VuZGFyaWVzKQotZGVmIEJ1Y2tldGl6ZU9wdGlvbnNTdGFydEJvdW5kYXJpZXNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOiByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCkKLWRlZiBTdGFydEJvdW5kYXJpZXNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgotICAgIHJldHVybiBCdWNrZXRpemVPcHRpb25zU3RhcnRCb3VuZGFyaWVzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKQotZGVmIEJ1Y2tldGl6ZU9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBCdWNrZXRpemVPcHRpb25zRW5kKGJ1aWxkZXIpCi10cnk6Ci0gICAgZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QKLWV4Y2VwdDoKLSAgICBwYXNzCi0KLWNsYXNzIEJ1Y2tldGl6ZU9wdGlvbnNUKG9iamVjdCk6Ci0KLSAgICAjIEJ1Y2tldGl6ZU9wdGlvbnNUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBzZWxmLmJvdW5kYXJpZXMgPSBOb25lICAjIHR5cGU6IExpc3RbZmxvYXRdCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIGJ1Y2tldGl6ZU9wdGlvbnMgPSBCdWNrZXRpemVPcHRpb25zKCkKLSAgICAgICAgYnVja2V0aXplT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGJ1Y2tldGl6ZU9wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBidWNrZXRpemVPcHRpb25zKToKLSAgICAgICAgeCA9IEJ1Y2tldGl6ZU9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKGJ1Y2tldGl6ZU9wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIEJ1Y2tldGl6ZU9wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgYnVja2V0aXplT3B0aW9ucyk6Ci0gICAgICAgIGlmIGJ1Y2tldGl6ZU9wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBpZiBub3QgYnVja2V0aXplT3B0aW9ucy5Cb3VuZGFyaWVzSXNOb25lKCk6Ci0gICAgICAgICAgICBpZiBucCBpcyBOb25lOgotICAgICAgICAgICAgICAgIHNlbGYuYm91bmRhcmllcyA9IFtdCi0gICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoYnVja2V0aXplT3B0aW9ucy5Cb3VuZGFyaWVzTGVuZ3RoKCkpOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmJvdW5kYXJpZXMuYXBwZW5kKGJ1Y2tldGl6ZU9wdGlvbnMuQm91bmRhcmllcyhpKSkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5ib3VuZGFyaWVzID0gYnVja2V0aXplT3B0aW9ucy5Cb3VuZGFyaWVzQXNOdW1weSgpCi0KLSAgICAjIEJ1Y2tldGl6ZU9wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIGlmIHNlbGYuYm91bmRhcmllcyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIGlmIG5wIGlzIG5vdCBOb25lIGFuZCB0eXBlKHNlbGYuYm91bmRhcmllcykgaXMgbnAubmRhcnJheToKLSAgICAgICAgICAgICAgICBib3VuZGFyaWVzID0gYnVpbGRlci5DcmVhdGVOdW1weVZlY3RvcihzZWxmLmJvdW5kYXJpZXMpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIEJ1Y2tldGl6ZU9wdGlvbnNTdGFydEJvdW5kYXJpZXNWZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYuYm91bmRhcmllcykpCi0gICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYuYm91bmRhcmllcykpKToKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5QcmVwZW5kRmxvYXQzMihzZWxmLmJvdW5kYXJpZXNbaV0pCi0gICAgICAgICAgICAgICAgYm91bmRhcmllcyA9IGJ1aWxkZXIuRW5kVmVjdG9yKCkKLSAgICAgICAgQnVja2V0aXplT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIGlmIHNlbGYuYm91bmRhcmllcyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIEJ1Y2tldGl6ZU9wdGlvbnNBZGRCb3VuZGFyaWVzKGJ1aWxkZXIsIGJvdW5kYXJpZXMpCi0gICAgICAgIGJ1Y2tldGl6ZU9wdGlvbnMgPSBCdWNrZXRpemVPcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBidWNrZXRpemVPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgQnVmZmVyKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gQnVmZmVyKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNCdWZmZXIoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBCdWZmZXJCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIEJ1ZmZlcgotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLSAgICAjIEJ1ZmZlcgotICAgIGRlZiBEYXRhKHNlbGYsIGopOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICBhID0gc2VsZi5fdGFiLlZlY3RvcihvKQotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVpbnQ4RmxhZ3MsIGEgKyBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGogKiAxKSkKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgQnVmZmVyCi0gICAgZGVmIERhdGFBc051bXB5KHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldFZlY3RvckFzTnVtcHkoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVpbnQ4RmxhZ3MsIG8pCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIEJ1ZmZlcgotICAgIGRlZiBEYXRhTGVuZ3RoKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlZlY3RvckxlbihvKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBCdWZmZXIKLSAgICBkZWYgRGF0YUlzTm9uZShzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKLSAgICAgICAgcmV0dXJuIG8gPT0gMAotCi0gICAgIyBCdWZmZXIKLSAgICBkZWYgT2Zmc2V0KHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVWludDY0RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBCdWZmZXIKLSAgICBkZWYgU2l6ZShzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg4KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVpbnQ2NEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAKLQotZGVmIEJ1ZmZlclN0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDMpCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEJ1ZmZlclN0YXJ0KGJ1aWxkZXIpCi1kZWYgQnVmZmVyQWRkRGF0YShidWlsZGVyLCBkYXRhKTogYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMCwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShkYXRhKSwgMCkKLWRlZiBBZGREYXRhKGJ1aWxkZXIsIGRhdGEpOgotICAgIHJldHVybiBCdWZmZXJBZGREYXRhKGJ1aWxkZXIsIGRhdGEpCi1kZWYgQnVmZmVyU3RhcnREYXRhVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKTogcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoMSwgbnVtRWxlbXMsIDEpCi1kZWYgU3RhcnREYXRhVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKLSAgICByZXR1cm4gQnVmZmVyU3RhcnREYXRhVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKQotZGVmIEJ1ZmZlckFkZE9mZnNldChidWlsZGVyLCBvZmZzZXQpOiBidWlsZGVyLlByZXBlbmRVaW50NjRTbG90KDEsIG9mZnNldCwgMCkKLWRlZiBBZGRPZmZzZXQoYnVpbGRlciwgb2Zmc2V0KToKLSAgICByZXR1cm4gQnVmZmVyQWRkT2Zmc2V0KGJ1aWxkZXIsIG9mZnNldCkKLWRlZiBCdWZmZXJBZGRTaXplKGJ1aWxkZXIsIHNpemUpOiBidWlsZGVyLlByZXBlbmRVaW50NjRTbG90KDIsIHNpemUsIDApCi1kZWYgQWRkU2l6ZShidWlsZGVyLCBzaXplKToKLSAgICByZXR1cm4gQnVmZmVyQWRkU2l6ZShidWlsZGVyLCBzaXplKQotZGVmIEJ1ZmZlckVuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEJ1ZmZlckVuZChidWlsZGVyKQotdHJ5OgotICAgIGZyb20gdHlwaW5nIGltcG9ydCBMaXN0Ci1leGNlcHQ6Ci0gICAgcGFzcwotCi1jbGFzcyBCdWZmZXJUKG9iamVjdCk6Ci0KLSAgICAjIEJ1ZmZlclQKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYuZGF0YSA9IE5vbmUgICMgdHlwZTogTGlzdFtpbnRdCi0gICAgICAgIHNlbGYub2Zmc2V0ID0gMCAgIyB0eXBlOiBpbnQKLSAgICAgICAgc2VsZi5zaXplID0gMCAgIyB0eXBlOiBpbnQKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgYnVmZmVyID0gQnVmZmVyKCkKLSAgICAgICAgYnVmZmVyLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooYnVmZmVyKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgYnVmZmVyKToKLSAgICAgICAgeCA9IEJ1ZmZlclQoKQotICAgICAgICB4Ll9VblBhY2soYnVmZmVyKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBCdWZmZXJUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgYnVmZmVyKToKLSAgICAgICAgaWYgYnVmZmVyIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgaWYgbm90IGJ1ZmZlci5EYXRhSXNOb25lKCk6Ci0gICAgICAgICAgICBpZiBucCBpcyBOb25lOgotICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IFtdCi0gICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoYnVmZmVyLkRhdGFMZW5ndGgoKSk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5hcHBlbmQoYnVmZmVyLkRhdGEoaSkpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IGJ1ZmZlci5EYXRhQXNOdW1weSgpCi0gICAgICAgIHNlbGYub2Zmc2V0ID0gYnVmZmVyLk9mZnNldCgpCi0gICAgICAgIHNlbGYuc2l6ZSA9IGJ1ZmZlci5TaXplKCkKLQotICAgICMgQnVmZmVyVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBpZiBzZWxmLmRhdGEgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBpZiBucCBpcyBub3QgTm9uZSBhbmQgdHlwZShzZWxmLmRhdGEpIGlzIG5wLm5kYXJyYXk6Ci0gICAgICAgICAgICAgICAgZGF0YSA9IGJ1aWxkZXIuQ3JlYXRlTnVtcHlWZWN0b3Ioc2VsZi5kYXRhKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBCdWZmZXJTdGFydERhdGFWZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYuZGF0YSkpCi0gICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYuZGF0YSkpKToKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5QcmVwZW5kVWludDgoc2VsZi5kYXRhW2ldKQotICAgICAgICAgICAgICAgIGRhdGEgPSBidWlsZGVyLkVuZFZlY3RvcigpCi0gICAgICAgIEJ1ZmZlclN0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIGlmIHNlbGYuZGF0YSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIEJ1ZmZlckFkZERhdGEoYnVpbGRlciwgZGF0YSkKLSAgICAgICAgQnVmZmVyQWRkT2Zmc2V0KGJ1aWxkZXIsIHNlbGYub2Zmc2V0KQotICAgICAgICBCdWZmZXJBZGRTaXplKGJ1aWxkZXIsIHNlbGYuc2l6ZSkKLSAgICAgICAgYnVmZmVyID0gQnVmZmVyRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBidWZmZXIKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CitkZWYgU3BhcnNlSW5kZXhWZWN0b3JDcmVhdG9yKHVuaW9uVHlwZSwgdGFibGUpOgorICAgIGZyb20gZmxhdGJ1ZmZlcnMudGFibGUgaW1wb3J0IFRhYmxlCisgICAgaWYgbm90IGlzaW5zdGFuY2UodGFibGUsIFRhYmxlKToKKyAgICAgICAgcmV0dXJuIE5vbmUKKyAgICBpZiB1bmlvblR5cGUgPT0gU3BhcnNlSW5kZXhWZWN0b3IoKS5JbnQzMlZlY3RvcjoKKyAgICAgICAgcmV0dXJuIEludDMyVmVjdG9yVC5Jbml0RnJvbUJ1Zih0YWJsZS5CeXRlcywgdGFibGUuUG9zKQorICAgIGlmIHVuaW9uVHlwZSA9PSBTcGFyc2VJbmRleFZlY3RvcigpLlVpbnQxNlZlY3RvcjoKKyAgICAgICAgcmV0dXJuIFVpbnQxNlZlY3RvclQuSW5pdEZyb21CdWYodGFibGUuQnl0ZXMsIHRhYmxlLlBvcykKKyAgICBpZiB1bmlvblR5cGUgPT0gU3BhcnNlSW5kZXhWZWN0b3IoKS5VaW50OFZlY3RvcjoKKyAgICAgICAgcmV0dXJuIFVpbnQ4VmVjdG9yVC5Jbml0RnJvbUJ1Zih0YWJsZS5CeXRlcywgdGFibGUuUG9zKQorICAgIHJldHVybiBOb25lCiAKLSMgbmFtZXNwYWNlOiB0ZmxpdGUKIAogY2xhc3MgQnVpbHRpbk9wZXJhdG9yKG9iamVjdCk6CiAgICAgQUREID0gMApAQCAtMTU1MSw5ICsyMjksNTIgQEAKICAgICBCSVRDQVNUID0gMTU5CiAgICAgQklUV0lTRV9YT1IgPSAxNjAKICAgICBSSUdIVF9TSElGVCA9IDE2MQotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKyAgICBTVEFCTEVITE9fTE9HSVNUSUMgPSAxNjIKKyAgICBTVEFCTEVITE9fQUREID0gMTYzCisgICAgU1RBQkxFSExPX0RJVklERSA9IDE2NAorICAgIFNUQUJMRUhMT19NVUxUSVBMWSA9IDE2NQorICAgIFNUQUJMRUhMT19NQVhJTVVNID0gMTY2CisgICAgU1RBQkxFSExPX1JFU0hBUEUgPSAxNjcKKyAgICBTVEFCTEVITE9fQ0xBTVAgPSAxNjgKKyAgICBTVEFCTEVITE9fQ09OQ0FURU5BVEUgPSAxNjkKKyAgICBTVEFCTEVITE9fQlJPQURDQVNUX0lOX0RJTSA9IDE3MAorICAgIFNUQUJMRUhMT19DT05WT0xVVElPTiA9IDE3MQorICAgIFNUQUJMRUhMT19TTElDRSA9IDE3MgorICAgIFNUQUJMRUhMT19DVVNUT01fQ0FMTCA9IDE3MworICAgIFNUQUJMRUhMT19SRURVQ0UgPSAxNzQKKyAgICBTVEFCTEVITE9fQUJTID0gMTc1CisgICAgU1RBQkxFSExPX0FORCA9IDE3NgorICAgIFNUQUJMRUhMT19DT1NJTkUgPSAxNzcKKyAgICBTVEFCTEVITE9fRVhQT05FTlRJQUwgPSAxNzgKKyAgICBTVEFCTEVITE9fRkxPT1IgPSAxNzkKKyAgICBTVEFCTEVITE9fTE9HID0gMTgwCisgICAgU1RBQkxFSExPX01JTklNVU0gPSAxODEKKyAgICBTVEFCTEVITE9fTkVHQVRFID0gMTgyCisgICAgU1RBQkxFSExPX09SID0gMTgzCisgICAgU1RBQkxFSExPX1BPV0VSID0gMTg0CisgICAgU1RBQkxFSExPX1JFTUFJTkRFUiA9IDE4NQorICAgIFNUQUJMRUhMT19SU1FSVCA9IDE4NgorICAgIFNUQUJMRUhMT19TRUxFQ1QgPSAxODcKKyAgICBTVEFCTEVITE9fU1VCVFJBQ1QgPSAxODgKKyAgICBTVEFCTEVITE9fVEFOSCA9IDE4OQorICAgIFNUQUJMRUhMT19TQ0FUVEVSID0gMTkwCisgICAgU1RBQkxFSExPX0NPTVBBUkUgPSAxOTEKKyAgICBTVEFCTEVITE9fQ09OVkVSVCA9IDE5MgorICAgIFNUQUJMRUhMT19EWU5BTUlDX1NMSUNFID0gMTkzCisgICAgU1RBQkxFSExPX0RZTkFNSUNfVVBEQVRFX1NMSUNFID0gMTk0CisgICAgU1RBQkxFSExPX1BBRCA9IDE5NQorICAgIFNUQUJMRUhMT19JT1RBID0gMTk2CisgICAgU1RBQkxFSExPX0RPVF9HRU5FUkFMID0gMTk3CisgICAgU1RBQkxFSExPX1JFRFVDRV9XSU5ET1cgPSAxOTgKKyAgICBTVEFCTEVITE9fU09SVCA9IDE5OQorICAgIFNUQUJMRUhMT19XSElMRSA9IDIwMAorICAgIFNUQUJMRUhMT19HQVRIRVIgPSAyMDEKKyAgICBTVEFCTEVITE9fVFJBTlNQT1NFID0gMjAyCisgICAgRElMQVRFID0gMjAzCisgICAgU1RBQkxFSExPX1JOR19CSVRfR0VORVJBVE9SID0gMjA0CisgICAgUkVEVUNFX1dJTkRPVyA9IDIwNQorICAgIFNUQUJMRUhMT19DT01QT1NJVEUgPSAyMDYKIAotIyBuYW1lc3BhY2U6IHRmbGl0ZQogCiBjbGFzcyBCdWlsdGluT3B0aW9ucyhvYmplY3QpOgogICAgIE5PTkUgPSAwCkBAIC0xOTQxLDI2MSArNjYyLDU5NjAgQEAKICAgICBpZiB1bmlvblR5cGUgPT0gQnVpbHRpbk9wdGlvbnMoKS5SaWdodFNoaWZ0T3B0aW9uczoKICAgICAgICAgcmV0dXJuIFJpZ2h0U2hpZnRPcHRpb25zVC5Jbml0RnJvbUJ1Zih0YWJsZS5CeXRlcywgdGFibGUuUG9zKQogICAgIHJldHVybiBOb25lCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQogCi0jIG5hbWVzcGFjZTogdGZsaXRlCiAKLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKK2NsYXNzIEJ1aWx0aW5PcHRpb25zMihvYmplY3QpOgorICAgIE5PTkUgPSAwCisgICAgU3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zID0gMQorICAgIFN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9ucyA9IDIKKyAgICBTdGFibGVobG9TbGljZU9wdGlvbnMgPSAzCisgICAgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zID0gNAorICAgIFN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zID0gNQorICAgIFN0YWJsZWhsb1JlZHVjZU9wdGlvbnMgPSA2CisgICAgU3RhYmxlaGxvU2NhdHRlck9wdGlvbnMgPSA3CisgICAgU3RhYmxlaGxvQ29tcGFyZU9wdGlvbnMgPSA4CisgICAgU3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9ucyA9IDkKKyAgICBTdGFibGVobG9QYWRPcHRpb25zID0gMTAKKyAgICBTdGFibGVobG9Jb3RhT3B0aW9ucyA9IDExCisgICAgU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnMgPSAxMgorICAgIFN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMgPSAxMworICAgIFN0YWJsZWhsb1NvcnRPcHRpb25zID0gMTQKKyAgICBTdGFibGVobG9XaGlsZU9wdGlvbnMgPSAxNQorICAgIFN0YWJsZWhsb0dhdGhlck9wdGlvbnMgPSAxNgorICAgIFN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnMgPSAxNworICAgIERpbGF0ZU9wdGlvbnMgPSAxOAorICAgIFN0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnMgPSAxOQorICAgIFJlZHVjZVdpbmRvd09wdGlvbnMgPSAyMAorICAgIFN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnMgPSAyMQogCi1jbGFzcyBDYWxsT25jZU9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorZGVmIEJ1aWx0aW5PcHRpb25zMkNyZWF0b3IodW5pb25UeXBlLCB0YWJsZSk6CisgICAgZnJvbSBmbGF0YnVmZmVycy50YWJsZSBpbXBvcnQgVGFibGUKKyAgICBpZiBub3QgaXNpbnN0YW5jZSh0YWJsZSwgVGFibGUpOgorICAgICAgICByZXR1cm4gTm9uZQorICAgIGlmIHVuaW9uVHlwZSA9PSBCdWlsdGluT3B0aW9uczIoKS5TdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnM6CisgICAgICAgIHJldHVybiBTdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnNULkluaXRGcm9tQnVmKHRhYmxlLkJ5dGVzLCB0YWJsZS5Qb3MpCisgICAgaWYgdW5pb25UeXBlID09IEJ1aWx0aW5PcHRpb25zMigpLlN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9uczoKKyAgICAgICAgcmV0dXJuIFN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9uc1QuSW5pdEZyb21CdWYodGFibGUuQnl0ZXMsIHRhYmxlLlBvcykKKyAgICBpZiB1bmlvblR5cGUgPT0gQnVpbHRpbk9wdGlvbnMyKCkuU3RhYmxlaGxvU2xpY2VPcHRpb25zOgorICAgICAgICByZXR1cm4gU3RhYmxlaGxvU2xpY2VPcHRpb25zVC5Jbml0RnJvbUJ1Zih0YWJsZS5CeXRlcywgdGFibGUuUG9zKQorICAgIGlmIHVuaW9uVHlwZSA9PSBCdWlsdGluT3B0aW9uczIoKS5TdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnM6CisgICAgICAgIHJldHVybiBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNULkluaXRGcm9tQnVmKHRhYmxlLkJ5dGVzLCB0YWJsZS5Qb3MpCisgICAgaWYgdW5pb25UeXBlID09IEJ1aWx0aW5PcHRpb25zMigpLlN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zOgorICAgICAgICByZXR1cm4gU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnNULkluaXRGcm9tQnVmKHRhYmxlLkJ5dGVzLCB0YWJsZS5Qb3MpCisgICAgaWYgdW5pb25UeXBlID09IEJ1aWx0aW5PcHRpb25zMigpLlN0YWJsZWhsb1JlZHVjZU9wdGlvbnM6CisgICAgICAgIHJldHVybiBTdGFibGVobG9SZWR1Y2VPcHRpb25zVC5Jbml0RnJvbUJ1Zih0YWJsZS5CeXRlcywgdGFibGUuUG9zKQorICAgIGlmIHVuaW9uVHlwZSA9PSBCdWlsdGluT3B0aW9uczIoKS5TdGFibGVobG9TY2F0dGVyT3B0aW9uczoKKyAgICAgICAgcmV0dXJuIFN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zVC5Jbml0RnJvbUJ1Zih0YWJsZS5CeXRlcywgdGFibGUuUG9zKQorICAgIGlmIHVuaW9uVHlwZSA9PSBCdWlsdGluT3B0aW9uczIoKS5TdGFibGVobG9Db21wYXJlT3B0aW9uczoKKyAgICAgICAgcmV0dXJuIFN0YWJsZWhsb0NvbXBhcmVPcHRpb25zVC5Jbml0RnJvbUJ1Zih0YWJsZS5CeXRlcywgdGFibGUuUG9zKQorICAgIGlmIHVuaW9uVHlwZSA9PSBCdWlsdGluT3B0aW9uczIoKS5TdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zOgorICAgICAgICByZXR1cm4gU3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9uc1QuSW5pdEZyb21CdWYodGFibGUuQnl0ZXMsIHRhYmxlLlBvcykKKyAgICBpZiB1bmlvblR5cGUgPT0gQnVpbHRpbk9wdGlvbnMyKCkuU3RhYmxlaGxvUGFkT3B0aW9uczoKKyAgICAgICAgcmV0dXJuIFN0YWJsZWhsb1BhZE9wdGlvbnNULkluaXRGcm9tQnVmKHRhYmxlLkJ5dGVzLCB0YWJsZS5Qb3MpCisgICAgaWYgdW5pb25UeXBlID09IEJ1aWx0aW5PcHRpb25zMigpLlN0YWJsZWhsb0lvdGFPcHRpb25zOgorICAgICAgICByZXR1cm4gU3RhYmxlaGxvSW90YU9wdGlvbnNULkluaXRGcm9tQnVmKHRhYmxlLkJ5dGVzLCB0YWJsZS5Qb3MpCisgICAgaWYgdW5pb25UeXBlID09IEJ1aWx0aW5PcHRpb25zMigpLlN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zOgorICAgICAgICByZXR1cm4gU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnNULkluaXRGcm9tQnVmKHRhYmxlLkJ5dGVzLCB0YWJsZS5Qb3MpCisgICAgaWYgdW5pb25UeXBlID09IEJ1aWx0aW5PcHRpb25zMigpLlN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnM6CisgICAgICAgIHJldHVybiBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zVC5Jbml0RnJvbUJ1Zih0YWJsZS5CeXRlcywgdGFibGUuUG9zKQorICAgIGlmIHVuaW9uVHlwZSA9PSBCdWlsdGluT3B0aW9uczIoKS5TdGFibGVobG9Tb3J0T3B0aW9uczoKKyAgICAgICAgcmV0dXJuIFN0YWJsZWhsb1NvcnRPcHRpb25zVC5Jbml0RnJvbUJ1Zih0YWJsZS5CeXRlcywgdGFibGUuUG9zKQorICAgIGlmIHVuaW9uVHlwZSA9PSBCdWlsdGluT3B0aW9uczIoKS5TdGFibGVobG9XaGlsZU9wdGlvbnM6CisgICAgICAgIHJldHVybiBTdGFibGVobG9XaGlsZU9wdGlvbnNULkluaXRGcm9tQnVmKHRhYmxlLkJ5dGVzLCB0YWJsZS5Qb3MpCisgICAgaWYgdW5pb25UeXBlID09IEJ1aWx0aW5PcHRpb25zMigpLlN0YWJsZWhsb0dhdGhlck9wdGlvbnM6CisgICAgICAgIHJldHVybiBTdGFibGVobG9HYXRoZXJPcHRpb25zVC5Jbml0RnJvbUJ1Zih0YWJsZS5CeXRlcywgdGFibGUuUG9zKQorICAgIGlmIHVuaW9uVHlwZSA9PSBCdWlsdGluT3B0aW9uczIoKS5TdGFibGVobG9UcmFuc3Bvc2VPcHRpb25zOgorICAgICAgICByZXR1cm4gU3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9uc1QuSW5pdEZyb21CdWYodGFibGUuQnl0ZXMsIHRhYmxlLlBvcykKKyAgICBpZiB1bmlvblR5cGUgPT0gQnVpbHRpbk9wdGlvbnMyKCkuRGlsYXRlT3B0aW9uczoKKyAgICAgICAgcmV0dXJuIERpbGF0ZU9wdGlvbnNULkluaXRGcm9tQnVmKHRhYmxlLkJ5dGVzLCB0YWJsZS5Qb3MpCisgICAgaWYgdW5pb25UeXBlID09IEJ1aWx0aW5PcHRpb25zMigpLlN0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnM6CisgICAgICAgIHJldHVybiBTdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zVC5Jbml0RnJvbUJ1Zih0YWJsZS5CeXRlcywgdGFibGUuUG9zKQorICAgIGlmIHVuaW9uVHlwZSA9PSBCdWlsdGluT3B0aW9uczIoKS5SZWR1Y2VXaW5kb3dPcHRpb25zOgorICAgICAgICByZXR1cm4gUmVkdWNlV2luZG93T3B0aW9uc1QuSW5pdEZyb21CdWYodGFibGUuQnl0ZXMsIHRhYmxlLlBvcykKKyAgICBpZiB1bmlvblR5cGUgPT0gQnVpbHRpbk9wdGlvbnMyKCkuU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9uczoKKyAgICAgICAgcmV0dXJuIFN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnNULkluaXRGcm9tQnVmKHRhYmxlLkJ5dGVzLCB0YWJsZS5Qb3MpCisgICAgcmV0dXJuIE5vbmUKIAotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gQ2FsbE9uY2VPcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKIAotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNDYWxsT25jZU9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBDYWxsT25jZU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCitjbGFzcyBTdGFibGVobG9QcmVjaXNpb25Db25maWcob2JqZWN0KToKKyAgICBERUZBVUxUID0gMAorICAgIEhJR0ggPSAxCisgICAgSElHSEVTVCA9IDIKIAotICAgICMgQ2FsbE9uY2VPcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKIAotICAgICMgQ2FsbE9uY2VPcHRpb25zCi0gICAgZGVmIEluaXRTdWJncmFwaEluZGV4KHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiAwCitjbGFzcyBTdGFibGVobG9Db21wYXJpc29uRGlyZWN0aW9uKG9iamVjdCk6CisgICAgU1RBQkxFSExPX0NPTVBBUklTT05fRElSRUNUSU9OX0VRID0gMAorICAgIFNUQUJMRUhMT19DT01QQVJJU09OX0RJUkVDVElPTl9ORSA9IDEKKyAgICBTVEFCTEVITE9fQ09NUEFSSVNPTl9ESVJFQ1RJT05fR0UgPSAyCisgICAgU1RBQkxFSExPX0NPTVBBUklTT05fRElSRUNUSU9OX0dUID0gMworICAgIFNUQUJMRUhMT19DT01QQVJJU09OX0RJUkVDVElPTl9MRSA9IDQKKyAgICBTVEFCTEVITE9fQ09NUEFSSVNPTl9ESVJFQ1RJT05fTFQgPSA1CiAKLWRlZiBDYWxsT25jZU9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgxKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBDYWxsT25jZU9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIENhbGxPbmNlT3B0aW9uc0FkZEluaXRTdWJncmFwaEluZGV4KGJ1aWxkZXIsIGluaXRTdWJncmFwaEluZGV4KTogYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDAsIGluaXRTdWJncmFwaEluZGV4LCAwKQotZGVmIEFkZEluaXRTdWJncmFwaEluZGV4KGJ1aWxkZXIsIGluaXRTdWJncmFwaEluZGV4KToKLSAgICByZXR1cm4gQ2FsbE9uY2VPcHRpb25zQWRkSW5pdFN1YmdyYXBoSW5kZXgoYnVpbGRlciwgaW5pdFN1YmdyYXBoSW5kZXgpCi1kZWYgQ2FsbE9uY2VPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gQ2FsbE9uY2VPcHRpb25zRW5kKGJ1aWxkZXIpCiAKLWNsYXNzIENhbGxPbmNlT3B0aW9uc1Qob2JqZWN0KToKK2NsYXNzIFN0YWJsZWhsb0NvbXBhcmlzb25UeXBlKG9iamVjdCk6CisgICAgU1RBQkxFSExPX0NPTVBBUklTT05fVFlQRV9OT1RZUEUgPSAwCisgICAgU1RBQkxFSExPX0NPTVBBUklTT05fVFlQRV9GTE9BVCA9IDEKKyAgICBTVEFCTEVITE9fQ09NUEFSSVNPTl9UWVBFX0ZMT0FUX1RPVEFMX09SREVSID0gMgorICAgIFNUQUJMRUhMT19DT01QQVJJU09OX1RZUEVfU0lHTkVEID0gMworICAgIFNUQUJMRUhMT19DT01QQVJJU09OX1RZUEVfVU5TSUdORUQgPSA0CiAKLSAgICAjIENhbGxPbmNlT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYuaW5pdFN1YmdyYXBoSW5kZXggPSAwICAjIHR5cGU6IGludAogCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBjYWxsT25jZU9wdGlvbnMgPSBDYWxsT25jZU9wdGlvbnMoKQotICAgICAgICBjYWxsT25jZU9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihjYWxsT25jZU9wdGlvbnMpCitjbGFzcyBSbmdBbGdvcml0aG0ob2JqZWN0KToKKyAgICBERUZBVUxUID0gMAorICAgIFBISUxPWCA9IDEKKyAgICBUSFJFRUZSWSA9IDIKIAotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGNhbGxPbmNlT3B0aW9ucyk6Ci0gICAgICAgIHggPSBDYWxsT25jZU9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKGNhbGxPbmNlT3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKIAotICAgICMgQ2FsbE9uY2VPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIGNhbGxPbmNlT3B0aW9ucyk6Ci0gICAgICAgIGlmIGNhbGxPbmNlT3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYuaW5pdFN1YmdyYXBoSW5kZXggPSBjYWxsT25jZU9wdGlvbnMuSW5pdFN1YmdyYXBoSW5kZXgoKQorY2xhc3MgUGFkZGluZyhvYmplY3QpOgorICAgIFNBTUUgPSAwCisgICAgVkFMSUQgPSAxCiAKLSAgICAjIENhbGxPbmNlT3B0aW9uc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgQ2FsbE9uY2VPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgQ2FsbE9uY2VPcHRpb25zQWRkSW5pdFN1YmdyYXBoSW5kZXgoYnVpbGRlciwgc2VsZi5pbml0U3ViZ3JhcGhJbmRleCkKLSAgICAgICAgY2FsbE9uY2VPcHRpb25zID0gQ2FsbE9uY2VPcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBjYWxsT25jZU9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CiAKLSMgbmFtZXNwYWNlOiB0ZmxpdGUKK2NsYXNzIEFjdGl2YXRpb25GdW5jdGlvblR5cGUob2JqZWN0KToKKyAgICBOT05FID0gMAorICAgIFJFTFUgPSAxCisgICAgUkVMVV9OMV9UT18xID0gMgorICAgIFJFTFU2ID0gMworICAgIFRBTkggPSA0CisgICAgU0lHTl9CSVQgPSA1CiAKLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKIAotY2xhc3MgQ2FsbE9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorY2xhc3MgTFNIUHJvamVjdGlvblR5cGUob2JqZWN0KToKKyAgICBVTktOT1dOID0gMAorICAgIFNQQVJTRSA9IDEKKyAgICBERU5TRSA9IDIKIAotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gQ2FsbE9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAogCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc0NhbGxPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgQ2FsbE9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCitjbGFzcyBGdWxseUNvbm5lY3RlZE9wdGlvbnNXZWlnaHRzRm9ybWF0KG9iamVjdCk6CisgICAgREVGQVVMVCA9IDAKKyAgICBTSFVGRkxFRDR4MTZJTlQ4ID0gMQogCi0gICAgIyBDYWxsT3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCiAKLSAgICAjIENhbGxPcHRpb25zCi0gICAgZGVmIFN1YmdyYXBoKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVWludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gMAorY2xhc3MgTFNUTUtlcm5lbFR5cGUob2JqZWN0KToKKyAgICBGVUxMID0gMAorICAgIEJBU0lDID0gMQogCi1kZWYgQ2FsbE9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgxKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBDYWxsT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgQ2FsbE9wdGlvbnNBZGRTdWJncmFwaChidWlsZGVyLCBzdWJncmFwaCk6IGJ1aWxkZXIuUHJlcGVuZFVpbnQzMlNsb3QoMCwgc3ViZ3JhcGgsIDApCi1kZWYgQWRkU3ViZ3JhcGgoYnVpbGRlciwgc3ViZ3JhcGgpOgotICAgIHJldHVybiBDYWxsT3B0aW9uc0FkZFN1YmdyYXBoKGJ1aWxkZXIsIHN1YmdyYXBoKQotZGVmIENhbGxPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gQ2FsbE9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgQ2FsbE9wdGlvbnNUKG9iamVjdCk6Ci0KLSAgICAjIENhbGxPcHRpb25zVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi5zdWJncmFwaCA9IDAgICMgdHlwZTogaW50Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIGNhbGxPcHRpb25zID0gQ2FsbE9wdGlvbnMoKQotICAgICAgICBjYWxsT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGNhbGxPcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgY2FsbE9wdGlvbnMpOgotICAgICAgICB4ID0gQ2FsbE9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKGNhbGxPcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBDYWxsT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBjYWxsT3B0aW9ucyk6Ci0gICAgICAgIGlmIGNhbGxPcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi5zdWJncmFwaCA9IGNhbGxPcHRpb25zLlN1YmdyYXBoKCkKLQotICAgICMgQ2FsbE9wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIENhbGxPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgQ2FsbE9wdGlvbnNBZGRTdWJncmFwaChidWlsZGVyLCBzZWxmLnN1YmdyYXBoKQotICAgICAgICBjYWxsT3B0aW9ucyA9IENhbGxPcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBjYWxsT3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIENhc3RPcHRpb25zKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gQ2FzdE9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc0Nhc3RPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgQ2FzdE9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIENhc3RPcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotICAgICMgQ2FzdE9wdGlvbnMKLSAgICBkZWYgSW5EYXRhVHlwZShzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDhGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIENhc3RPcHRpb25zCi0gICAgZGVmIE91dERhdGFUeXBlKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50OEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAKLQotZGVmIENhc3RPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMikKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gQ2FzdE9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIENhc3RPcHRpb25zQWRkSW5EYXRhVHlwZShidWlsZGVyLCBpbkRhdGFUeXBlKTogYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoMCwgaW5EYXRhVHlwZSwgMCkKLWRlZiBBZGRJbkRhdGFUeXBlKGJ1aWxkZXIsIGluRGF0YVR5cGUpOgotICAgIHJldHVybiBDYXN0T3B0aW9uc0FkZEluRGF0YVR5cGUoYnVpbGRlciwgaW5EYXRhVHlwZSkKLWRlZiBDYXN0T3B0aW9uc0FkZE91dERhdGFUeXBlKGJ1aWxkZXIsIG91dERhdGFUeXBlKTogYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoMSwgb3V0RGF0YVR5cGUsIDApCi1kZWYgQWRkT3V0RGF0YVR5cGUoYnVpbGRlciwgb3V0RGF0YVR5cGUpOgotICAgIHJldHVybiBDYXN0T3B0aW9uc0FkZE91dERhdGFUeXBlKGJ1aWxkZXIsIG91dERhdGFUeXBlKQotZGVmIENhc3RPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gQ2FzdE9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgQ2FzdE9wdGlvbnNUKG9iamVjdCk6Ci0KLSAgICAjIENhc3RPcHRpb25zVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi5pbkRhdGFUeXBlID0gMCAgIyB0eXBlOiBpbnQKLSAgICAgICAgc2VsZi5vdXREYXRhVHlwZSA9IDAgICMgdHlwZTogaW50Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIGNhc3RPcHRpb25zID0gQ2FzdE9wdGlvbnMoKQotICAgICAgICBjYXN0T3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGNhc3RPcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgY2FzdE9wdGlvbnMpOgotICAgICAgICB4ID0gQ2FzdE9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKGNhc3RPcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBDYXN0T3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBjYXN0T3B0aW9ucyk6Ci0gICAgICAgIGlmIGNhc3RPcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi5pbkRhdGFUeXBlID0gY2FzdE9wdGlvbnMuSW5EYXRhVHlwZSgpCi0gICAgICAgIHNlbGYub3V0RGF0YVR5cGUgPSBjYXN0T3B0aW9ucy5PdXREYXRhVHlwZSgpCi0KLSAgICAjIENhc3RPcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBDYXN0T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIENhc3RPcHRpb25zQWRkSW5EYXRhVHlwZShidWlsZGVyLCBzZWxmLmluRGF0YVR5cGUpCi0gICAgICAgIENhc3RPcHRpb25zQWRkT3V0RGF0YVR5cGUoYnVpbGRlciwgc2VsZi5vdXREYXRhVHlwZSkKLSAgICAgICAgY2FzdE9wdGlvbnMgPSBDYXN0T3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gY2FzdE9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKIAogY2xhc3MgQ29tYmluZXJUeXBlKG9iamVjdCk6CiAgICAgU1VNID0gMAogICAgIE1FQU4gPSAxCiAgICAgU1FSVE4gPSAyCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQogCi0jIG5hbWVzcGFjZTogdGZsaXRlCiAKLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKK2NsYXNzIE1pcnJvclBhZE1vZGUob2JqZWN0KToKKyAgICBSRUZMRUNUID0gMAorICAgIFNZTU1FVFJJQyA9IDEKKworCitjbGFzcyBSZWR1Y2VXaW5kb3dGdW5jdGlvbihvYmplY3QpOgorICAgIFVOU1VQUE9SVEVEID0gMAorICAgIEFERCA9IDEKKyAgICBNVUwgPSAyCisgICAgTUlOSU1VTSA9IDMKKyAgICBNQVhJTVVNID0gNAorICAgIEFMTCA9IDUKKyAgICBBTlkgPSA2CisKKworY2xhc3MgQ3VzdG9tT3B0aW9uc0Zvcm1hdChvYmplY3QpOgorICAgIEZMRVhCVUZGRVJTID0gMAorCisKK2NsYXNzIEN1c3RvbVF1YW50aXphdGlvbihvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IEN1c3RvbVF1YW50aXphdGlvbigpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzQ3VzdG9tUXVhbnRpemF0aW9uKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgorICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgQ3VzdG9tUXVhbnRpemF0aW9uQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBDdXN0b21RdWFudGl6YXRpb24KKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCisgICAgIyBDdXN0b21RdWFudGl6YXRpb24KKyAgICBkZWYgQ3VzdG9tKHNlbGYsIGopOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICBhID0gc2VsZi5fdGFiLlZlY3RvcihvKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVpbnQ4RmxhZ3MsIGEgKyBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGogKiAxKSkKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgQ3VzdG9tUXVhbnRpemF0aW9uCisgICAgZGVmIEN1c3RvbUFzTnVtcHkoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0VmVjdG9yQXNOdW1weShmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVWludDhGbGFncywgbykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgQ3VzdG9tUXVhbnRpemF0aW9uCisgICAgZGVmIEN1c3RvbUxlbmd0aChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgQ3VzdG9tUXVhbnRpemF0aW9uCisgICAgZGVmIEN1c3RvbUlzTm9uZShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgcmV0dXJuIG8gPT0gMAorCitkZWYgQ3VzdG9tUXVhbnRpemF0aW9uU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgxKQorCitkZWYgQ3VzdG9tUXVhbnRpemF0aW9uQWRkQ3VzdG9tKGJ1aWxkZXIsIGN1c3RvbSk6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMCwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShjdXN0b20pLCAwKQorCitkZWYgQ3VzdG9tUXVhbnRpemF0aW9uU3RhcnRDdXN0b21WZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgorICAgIHJldHVybiBidWlsZGVyLlN0YXJ0VmVjdG9yKDEsIG51bUVsZW1zLCAxKQorCitkZWYgQ3VzdG9tUXVhbnRpemF0aW9uRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKwordHJ5OgorICAgIGZyb20gdHlwaW5nIGltcG9ydCBMaXN0CitleGNlcHQ6CisgICAgcGFzcworCitjbGFzcyBDdXN0b21RdWFudGl6YXRpb25UKG9iamVjdCk6CisKKyAgICAjIEN1c3RvbVF1YW50aXphdGlvblQKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuY3VzdG9tID0gTm9uZSAgIyB0eXBlOiBMaXN0W2ludF0KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgY3VzdG9tUXVhbnRpemF0aW9uID0gQ3VzdG9tUXVhbnRpemF0aW9uKCkKKyAgICAgICAgY3VzdG9tUXVhbnRpemF0aW9uLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooY3VzdG9tUXVhbnRpemF0aW9uKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgY3VzdG9tUXVhbnRpemF0aW9uKToKKyAgICAgICAgeCA9IEN1c3RvbVF1YW50aXphdGlvblQoKQorICAgICAgICB4Ll9VblBhY2soY3VzdG9tUXVhbnRpemF0aW9uKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBDdXN0b21RdWFudGl6YXRpb25UCisgICAgZGVmIF9VblBhY2soc2VsZiwgY3VzdG9tUXVhbnRpemF0aW9uKToKKyAgICAgICAgaWYgY3VzdG9tUXVhbnRpemF0aW9uIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IGN1c3RvbVF1YW50aXphdGlvbi5DdXN0b21Jc05vbmUoKToKKyAgICAgICAgICAgIGlmIG5wIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5jdXN0b20gPSBbXQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGN1c3RvbVF1YW50aXphdGlvbi5DdXN0b21MZW5ndGgoKSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VzdG9tLmFwcGVuZChjdXN0b21RdWFudGl6YXRpb24uQ3VzdG9tKGkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmN1c3RvbSA9IGN1c3RvbVF1YW50aXphdGlvbi5DdXN0b21Bc051bXB5KCkKKworICAgICMgQ3VzdG9tUXVhbnRpemF0aW9uVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBpZiBzZWxmLmN1c3RvbSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG5wIGlzIG5vdCBOb25lIGFuZCB0eXBlKHNlbGYuY3VzdG9tKSBpcyBucC5uZGFycmF5OgorICAgICAgICAgICAgICAgIGN1c3RvbSA9IGJ1aWxkZXIuQ3JlYXRlTnVtcHlWZWN0b3Ioc2VsZi5jdXN0b20pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIEN1c3RvbVF1YW50aXphdGlvblN0YXJ0Q3VzdG9tVmVjdG9yKGJ1aWxkZXIsIGxlbihzZWxmLmN1c3RvbSkpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYuY3VzdG9tKSkpOgorICAgICAgICAgICAgICAgICAgICBidWlsZGVyLlByZXBlbmRVaW50OChzZWxmLmN1c3RvbVtpXSkKKyAgICAgICAgICAgICAgICBjdXN0b20gPSBidWlsZGVyLkVuZFZlY3RvcigpCisgICAgICAgIEN1c3RvbVF1YW50aXphdGlvblN0YXJ0KGJ1aWxkZXIpCisgICAgICAgIGlmIHNlbGYuY3VzdG9tIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgQ3VzdG9tUXVhbnRpemF0aW9uQWRkQ3VzdG9tKGJ1aWxkZXIsIGN1c3RvbSkKKyAgICAgICAgY3VzdG9tUXVhbnRpemF0aW9uID0gQ3VzdG9tUXVhbnRpemF0aW9uRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBjdXN0b21RdWFudGl6YXRpb24KKworCitjbGFzcyBRdWFudGl6YXRpb25QYXJhbWV0ZXJzKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gUXVhbnRpemF0aW9uUGFyYW1ldGVycygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzUXVhbnRpemF0aW9uUGFyYW1ldGVycyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFF1YW50aXphdGlvblBhcmFtZXRlcnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFF1YW50aXphdGlvblBhcmFtZXRlcnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCisgICAgIyBRdWFudGl6YXRpb25QYXJhbWV0ZXJzCisgICAgZGVmIE1pbihzZWxmLCBqKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgYSA9IHNlbGYuX3RhYi5WZWN0b3IobykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5GbG9hdDMyRmxhZ3MsIGEgKyBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGogKiA0KSkKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgUXVhbnRpemF0aW9uUGFyYW1ldGVycworICAgIGRlZiBNaW5Bc051bXB5KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldFZlY3RvckFzTnVtcHkoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkZsb2F0MzJGbGFncywgbykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgUXVhbnRpemF0aW9uUGFyYW1ldGVycworICAgIGRlZiBNaW5MZW5ndGgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuVmVjdG9yTGVuKG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFF1YW50aXphdGlvblBhcmFtZXRlcnMKKyAgICBkZWYgTWluSXNOb25lKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICByZXR1cm4gbyA9PSAwCisKKyAgICAjIFF1YW50aXphdGlvblBhcmFtZXRlcnMKKyAgICBkZWYgTWF4KHNlbGYsIGopOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICBhID0gc2VsZi5fdGFiLlZlY3RvcihvKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkZsb2F0MzJGbGFncywgYSArIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaiAqIDQpKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBRdWFudGl6YXRpb25QYXJhbWV0ZXJzCisgICAgZGVmIE1heEFzTnVtcHkoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0VmVjdG9yQXNOdW1weShmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuRmxvYXQzMkZsYWdzLCBvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBRdWFudGl6YXRpb25QYXJhbWV0ZXJzCisgICAgZGVmIE1heExlbmd0aChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgUXVhbnRpemF0aW9uUGFyYW1ldGVycworICAgIGRlZiBNYXhJc05vbmUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIHJldHVybiBvID09IDAKKworICAgICMgUXVhbnRpemF0aW9uUGFyYW1ldGVycworICAgIGRlZiBTY2FsZShzZWxmLCBqKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg4KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgYSA9IHNlbGYuX3RhYi5WZWN0b3IobykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5GbG9hdDMyRmxhZ3MsIGEgKyBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGogKiA0KSkKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgUXVhbnRpemF0aW9uUGFyYW1ldGVycworICAgIGRlZiBTY2FsZUFzTnVtcHkoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0VmVjdG9yQXNOdW1weShmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuRmxvYXQzMkZsYWdzLCBvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBRdWFudGl6YXRpb25QYXJhbWV0ZXJzCisgICAgZGVmIFNjYWxlTGVuZ3RoKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlZlY3RvckxlbihvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBRdWFudGl6YXRpb25QYXJhbWV0ZXJzCisgICAgZGVmIFNjYWxlSXNOb25lKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQorICAgICAgICByZXR1cm4gbyA9PSAwCisKKyAgICAjIFF1YW50aXphdGlvblBhcmFtZXRlcnMKKyAgICBkZWYgWmVyb1BvaW50KHNlbGYsIGopOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEwKSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgYSA9IHNlbGYuX3RhYi5WZWN0b3IobykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ2NEZsYWdzLCBhICsgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShqICogOCkpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFF1YW50aXphdGlvblBhcmFtZXRlcnMKKyAgICBkZWYgWmVyb1BvaW50QXNOdW1weShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0VmVjdG9yQXNOdW1weShmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgbykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgUXVhbnRpemF0aW9uUGFyYW1ldGVycworICAgIGRlZiBaZXJvUG9pbnRMZW5ndGgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTApKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlZlY3RvckxlbihvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBRdWFudGl6YXRpb25QYXJhbWV0ZXJzCisgICAgZGVmIFplcm9Qb2ludElzTm9uZShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMCkpCisgICAgICAgIHJldHVybiBvID09IDAKKworICAgICMgUXVhbnRpemF0aW9uUGFyYW1ldGVycworICAgIGRlZiBEZXRhaWxzVHlwZShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VaW50OEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgUXVhbnRpemF0aW9uUGFyYW1ldGVycworICAgIGRlZiBEZXRhaWxzKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDE0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgZnJvbSBmbGF0YnVmZmVycy50YWJsZSBpbXBvcnQgVGFibGUKKyAgICAgICAgICAgIG9iaiA9IFRhYmxlKGJ5dGVhcnJheSgpLCAwKQorICAgICAgICAgICAgc2VsZi5fdGFiLlVuaW9uKG9iaiwgbykKKyAgICAgICAgICAgIHJldHVybiBvYmoKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICMgUXVhbnRpemF0aW9uUGFyYW1ldGVycworICAgIGRlZiBRdWFudGl6ZWREaW1lbnNpb24oc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTYpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKK2RlZiBRdWFudGl6YXRpb25QYXJhbWV0ZXJzU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCg3KQorCitkZWYgUXVhbnRpemF0aW9uUGFyYW1ldGVyc0FkZE1pbihidWlsZGVyLCBtaW4pOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDAsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUobWluKSwgMCkKKworZGVmIFF1YW50aXphdGlvblBhcmFtZXRlcnNTdGFydE1pblZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6CisgICAgcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpCisKK2RlZiBRdWFudGl6YXRpb25QYXJhbWV0ZXJzQWRkTWF4KGJ1aWxkZXIsIG1heCk6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMSwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShtYXgpLCAwKQorCitkZWYgUXVhbnRpemF0aW9uUGFyYW1ldGVyc1N0YXJ0TWF4VmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKKyAgICByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCkKKworZGVmIFF1YW50aXphdGlvblBhcmFtZXRlcnNBZGRTY2FsZShidWlsZGVyLCBzY2FsZSk6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMiwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzY2FsZSksIDApCisKK2RlZiBRdWFudGl6YXRpb25QYXJhbWV0ZXJzU3RhcnRTY2FsZVZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6CisgICAgcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpCisKK2RlZiBRdWFudGl6YXRpb25QYXJhbWV0ZXJzQWRkWmVyb1BvaW50KGJ1aWxkZXIsIHplcm9Qb2ludCk6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMywgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZSh6ZXJvUG9pbnQpLCAwKQorCitkZWYgUXVhbnRpemF0aW9uUGFyYW1ldGVyc1N0YXJ0WmVyb1BvaW50VmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKKyAgICByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig4LCBudW1FbGVtcywgOCkKKworZGVmIFF1YW50aXphdGlvblBhcmFtZXRlcnNBZGREZXRhaWxzVHlwZShidWlsZGVyLCBkZXRhaWxzVHlwZSk6CisgICAgYnVpbGRlci5QcmVwZW5kVWludDhTbG90KDQsIGRldGFpbHNUeXBlLCAwKQorCitkZWYgUXVhbnRpemF0aW9uUGFyYW1ldGVyc0FkZERldGFpbHMoYnVpbGRlciwgZGV0YWlscyk6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoNSwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShkZXRhaWxzKSwgMCkKKworZGVmIFF1YW50aXphdGlvblBhcmFtZXRlcnNBZGRRdWFudGl6ZWREaW1lbnNpb24oYnVpbGRlciwgcXVhbnRpemVkRGltZW5zaW9uKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoNiwgcXVhbnRpemVkRGltZW5zaW9uLCAwKQorCitkZWYgUXVhbnRpemF0aW9uUGFyYW1ldGVyc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKK3RyeToKKyAgICBmcm9tIHR5cGluZyBpbXBvcnQgTGlzdCwgVW5pb24KK2V4Y2VwdDoKKyAgICBwYXNzCisKK2NsYXNzIFF1YW50aXphdGlvblBhcmFtZXRlcnNUKG9iamVjdCk6CisKKyAgICAjIFF1YW50aXphdGlvblBhcmFtZXRlcnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLm1pbiA9IE5vbmUgICMgdHlwZTogTGlzdFtmbG9hdF0KKyAgICAgICAgc2VsZi5tYXggPSBOb25lICAjIHR5cGU6IExpc3RbZmxvYXRdCisgICAgICAgIHNlbGYuc2NhbGUgPSBOb25lICAjIHR5cGU6IExpc3RbZmxvYXRdCisgICAgICAgIHNlbGYuemVyb1BvaW50ID0gTm9uZSAgIyB0eXBlOiBMaXN0W2ludF0KKyAgICAgICAgc2VsZi5kZXRhaWxzVHlwZSA9IDAgICMgdHlwZTogaW50CisgICAgICAgIHNlbGYuZGV0YWlscyA9IE5vbmUgICMgdHlwZTogVW5pb25bTm9uZSwgQ3VzdG9tUXVhbnRpemF0aW9uVF0KKyAgICAgICAgc2VsZi5xdWFudGl6ZWREaW1lbnNpb24gPSAwICAjIHR5cGU6IGludAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICBxdWFudGl6YXRpb25QYXJhbWV0ZXJzID0gUXVhbnRpemF0aW9uUGFyYW1ldGVycygpCisgICAgICAgIHF1YW50aXphdGlvblBhcmFtZXRlcnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihxdWFudGl6YXRpb25QYXJhbWV0ZXJzKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgcXVhbnRpemF0aW9uUGFyYW1ldGVycyk6CisgICAgICAgIHggPSBRdWFudGl6YXRpb25QYXJhbWV0ZXJzVCgpCisgICAgICAgIHguX1VuUGFjayhxdWFudGl6YXRpb25QYXJhbWV0ZXJzKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBRdWFudGl6YXRpb25QYXJhbWV0ZXJzVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIHF1YW50aXphdGlvblBhcmFtZXRlcnMpOgorICAgICAgICBpZiBxdWFudGl6YXRpb25QYXJhbWV0ZXJzIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IHF1YW50aXphdGlvblBhcmFtZXRlcnMuTWluSXNOb25lKCk6CisgICAgICAgICAgICBpZiBucCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYubWluID0gW10KKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShxdWFudGl6YXRpb25QYXJhbWV0ZXJzLk1pbkxlbmd0aCgpKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5taW4uYXBwZW5kKHF1YW50aXphdGlvblBhcmFtZXRlcnMuTWluKGkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLm1pbiA9IHF1YW50aXphdGlvblBhcmFtZXRlcnMuTWluQXNOdW1weSgpCisgICAgICAgIGlmIG5vdCBxdWFudGl6YXRpb25QYXJhbWV0ZXJzLk1heElzTm9uZSgpOgorICAgICAgICAgICAgaWYgbnAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLm1heCA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UocXVhbnRpemF0aW9uUGFyYW1ldGVycy5NYXhMZW5ndGgoKSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubWF4LmFwcGVuZChxdWFudGl6YXRpb25QYXJhbWV0ZXJzLk1heChpKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5tYXggPSBxdWFudGl6YXRpb25QYXJhbWV0ZXJzLk1heEFzTnVtcHkoKQorICAgICAgICBpZiBub3QgcXVhbnRpemF0aW9uUGFyYW1ldGVycy5TY2FsZUlzTm9uZSgpOgorICAgICAgICAgICAgaWYgbnAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLnNjYWxlID0gW10KKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShxdWFudGl6YXRpb25QYXJhbWV0ZXJzLlNjYWxlTGVuZ3RoKCkpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNjYWxlLmFwcGVuZChxdWFudGl6YXRpb25QYXJhbWV0ZXJzLlNjYWxlKGkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnNjYWxlID0gcXVhbnRpemF0aW9uUGFyYW1ldGVycy5TY2FsZUFzTnVtcHkoKQorICAgICAgICBpZiBub3QgcXVhbnRpemF0aW9uUGFyYW1ldGVycy5aZXJvUG9pbnRJc05vbmUoKToKKyAgICAgICAgICAgIGlmIG5wIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi56ZXJvUG9pbnQgPSBbXQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHF1YW50aXphdGlvblBhcmFtZXRlcnMuWmVyb1BvaW50TGVuZ3RoKCkpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnplcm9Qb2ludC5hcHBlbmQocXVhbnRpemF0aW9uUGFyYW1ldGVycy5aZXJvUG9pbnQoaSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuemVyb1BvaW50ID0gcXVhbnRpemF0aW9uUGFyYW1ldGVycy5aZXJvUG9pbnRBc051bXB5KCkKKyAgICAgICAgc2VsZi5kZXRhaWxzVHlwZSA9IHF1YW50aXphdGlvblBhcmFtZXRlcnMuRGV0YWlsc1R5cGUoKQorICAgICAgICBzZWxmLmRldGFpbHMgPSBRdWFudGl6YXRpb25EZXRhaWxzQ3JlYXRvcihzZWxmLmRldGFpbHNUeXBlLCBxdWFudGl6YXRpb25QYXJhbWV0ZXJzLkRldGFpbHMoKSkKKyAgICAgICAgc2VsZi5xdWFudGl6ZWREaW1lbnNpb24gPSBxdWFudGl6YXRpb25QYXJhbWV0ZXJzLlF1YW50aXplZERpbWVuc2lvbigpCisKKyAgICAjIFF1YW50aXphdGlvblBhcmFtZXRlcnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIGlmIHNlbGYubWluIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbnAgaXMgbm90IE5vbmUgYW5kIHR5cGUoc2VsZi5taW4pIGlzIG5wLm5kYXJyYXk6CisgICAgICAgICAgICAgICAgbWluID0gYnVpbGRlci5DcmVhdGVOdW1weVZlY3RvcihzZWxmLm1pbikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgUXVhbnRpemF0aW9uUGFyYW1ldGVyc1N0YXJ0TWluVmVjdG9yKGJ1aWxkZXIsIGxlbihzZWxmLm1pbikpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYubWluKSkpOgorICAgICAgICAgICAgICAgICAgICBidWlsZGVyLlByZXBlbmRGbG9hdDMyKHNlbGYubWluW2ldKQorICAgICAgICAgICAgICAgIG1pbiA9IGJ1aWxkZXIuRW5kVmVjdG9yKCkKKyAgICAgICAgaWYgc2VsZi5tYXggaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBucCBpcyBub3QgTm9uZSBhbmQgdHlwZShzZWxmLm1heCkgaXMgbnAubmRhcnJheToKKyAgICAgICAgICAgICAgICBtYXggPSBidWlsZGVyLkNyZWF0ZU51bXB5VmVjdG9yKHNlbGYubWF4KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBRdWFudGl6YXRpb25QYXJhbWV0ZXJzU3RhcnRNYXhWZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYubWF4KSkKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShsZW4oc2VsZi5tYXgpKSk6CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZEZsb2F0MzIoc2VsZi5tYXhbaV0pCisgICAgICAgICAgICAgICAgbWF4ID0gYnVpbGRlci5FbmRWZWN0b3IoKQorICAgICAgICBpZiBzZWxmLnNjYWxlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbnAgaXMgbm90IE5vbmUgYW5kIHR5cGUoc2VsZi5zY2FsZSkgaXMgbnAubmRhcnJheToKKyAgICAgICAgICAgICAgICBzY2FsZSA9IGJ1aWxkZXIuQ3JlYXRlTnVtcHlWZWN0b3Ioc2VsZi5zY2FsZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgUXVhbnRpemF0aW9uUGFyYW1ldGVyc1N0YXJ0U2NhbGVWZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYuc2NhbGUpKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLnNjYWxlKSkpOgorICAgICAgICAgICAgICAgICAgICBidWlsZGVyLlByZXBlbmRGbG9hdDMyKHNlbGYuc2NhbGVbaV0pCisgICAgICAgICAgICAgICAgc2NhbGUgPSBidWlsZGVyLkVuZFZlY3RvcigpCisgICAgICAgIGlmIHNlbGYuemVyb1BvaW50IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbnAgaXMgbm90IE5vbmUgYW5kIHR5cGUoc2VsZi56ZXJvUG9pbnQpIGlzIG5wLm5kYXJyYXk6CisgICAgICAgICAgICAgICAgemVyb1BvaW50ID0gYnVpbGRlci5DcmVhdGVOdW1weVZlY3RvcihzZWxmLnplcm9Qb2ludCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgUXVhbnRpemF0aW9uUGFyYW1ldGVyc1N0YXJ0WmVyb1BvaW50VmVjdG9yKGJ1aWxkZXIsIGxlbihzZWxmLnplcm9Qb2ludCkpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYuemVyb1BvaW50KSkpOgorICAgICAgICAgICAgICAgICAgICBidWlsZGVyLlByZXBlbmRJbnQ2NChzZWxmLnplcm9Qb2ludFtpXSkKKyAgICAgICAgICAgICAgICB6ZXJvUG9pbnQgPSBidWlsZGVyLkVuZFZlY3RvcigpCisgICAgICAgIGlmIHNlbGYuZGV0YWlscyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGRldGFpbHMgPSBzZWxmLmRldGFpbHMuUGFjayhidWlsZGVyKQorICAgICAgICBRdWFudGl6YXRpb25QYXJhbWV0ZXJzU3RhcnQoYnVpbGRlcikKKyAgICAgICAgaWYgc2VsZi5taW4gaXMgbm90IE5vbmU6CisgICAgICAgICAgICBRdWFudGl6YXRpb25QYXJhbWV0ZXJzQWRkTWluKGJ1aWxkZXIsIG1pbikKKyAgICAgICAgaWYgc2VsZi5tYXggaXMgbm90IE5vbmU6CisgICAgICAgICAgICBRdWFudGl6YXRpb25QYXJhbWV0ZXJzQWRkTWF4KGJ1aWxkZXIsIG1heCkKKyAgICAgICAgaWYgc2VsZi5zY2FsZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIFF1YW50aXphdGlvblBhcmFtZXRlcnNBZGRTY2FsZShidWlsZGVyLCBzY2FsZSkKKyAgICAgICAgaWYgc2VsZi56ZXJvUG9pbnQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBRdWFudGl6YXRpb25QYXJhbWV0ZXJzQWRkWmVyb1BvaW50KGJ1aWxkZXIsIHplcm9Qb2ludCkKKyAgICAgICAgUXVhbnRpemF0aW9uUGFyYW1ldGVyc0FkZERldGFpbHNUeXBlKGJ1aWxkZXIsIHNlbGYuZGV0YWlsc1R5cGUpCisgICAgICAgIGlmIHNlbGYuZGV0YWlscyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIFF1YW50aXphdGlvblBhcmFtZXRlcnNBZGREZXRhaWxzKGJ1aWxkZXIsIGRldGFpbHMpCisgICAgICAgIFF1YW50aXphdGlvblBhcmFtZXRlcnNBZGRRdWFudGl6ZWREaW1lbnNpb24oYnVpbGRlciwgc2VsZi5xdWFudGl6ZWREaW1lbnNpb24pCisgICAgICAgIHF1YW50aXphdGlvblBhcmFtZXRlcnMgPSBRdWFudGl6YXRpb25QYXJhbWV0ZXJzRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBxdWFudGl6YXRpb25QYXJhbWV0ZXJzCisKKworY2xhc3MgSW50MzJWZWN0b3Iob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBJbnQzMlZlY3RvcigpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzSW50MzJWZWN0b3IoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbnQzMlZlY3RvckJ1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgSW50MzJWZWN0b3IKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCisgICAgIyBJbnQzMlZlY3RvcgorICAgIGRlZiBWYWx1ZXMoc2VsZiwgaik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIGEgPSBzZWxmLl90YWIuVmVjdG9yKG8pCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgYSArIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaiAqIDQpKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBJbnQzMlZlY3RvcgorICAgIGRlZiBWYWx1ZXNBc051bXB5KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldFZlY3RvckFzTnVtcHkoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIEludDMyVmVjdG9yCisgICAgZGVmIFZhbHVlc0xlbmd0aChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgSW50MzJWZWN0b3IKKyAgICBkZWYgVmFsdWVzSXNOb25lKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICByZXR1cm4gbyA9PSAwCisKK2RlZiBJbnQzMlZlY3RvclN0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMSkKKworZGVmIEludDMyVmVjdG9yQWRkVmFsdWVzKGJ1aWxkZXIsIHZhbHVlcyk6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMCwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZSh2YWx1ZXMpLCAwKQorCitkZWYgSW50MzJWZWN0b3JTdGFydFZhbHVlc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6CisgICAgcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpCisKK2RlZiBJbnQzMlZlY3RvckVuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKK3RyeToKKyAgICBmcm9tIHR5cGluZyBpbXBvcnQgTGlzdAorZXhjZXB0OgorICAgIHBhc3MKKworY2xhc3MgSW50MzJWZWN0b3JUKG9iamVjdCk6CisKKyAgICAjIEludDMyVmVjdG9yVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi52YWx1ZXMgPSBOb25lICAjIHR5cGU6IExpc3RbaW50XQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICBpbnQzMlZlY3RvciA9IEludDMyVmVjdG9yKCkKKyAgICAgICAgaW50MzJWZWN0b3IuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihpbnQzMlZlY3RvcikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGludDMyVmVjdG9yKToKKyAgICAgICAgeCA9IEludDMyVmVjdG9yVCgpCisgICAgICAgIHguX1VuUGFjayhpbnQzMlZlY3RvcikKKyAgICAgICAgcmV0dXJuIHgKKworICAgICMgSW50MzJWZWN0b3JUCisgICAgZGVmIF9VblBhY2soc2VsZiwgaW50MzJWZWN0b3IpOgorICAgICAgICBpZiBpbnQzMlZlY3RvciBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG5vdCBpbnQzMlZlY3Rvci5WYWx1ZXNJc05vbmUoKToKKyAgICAgICAgICAgIGlmIG5wIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi52YWx1ZXMgPSBbXQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGludDMyVmVjdG9yLlZhbHVlc0xlbmd0aCgpKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi52YWx1ZXMuYXBwZW5kKGludDMyVmVjdG9yLlZhbHVlcyhpKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi52YWx1ZXMgPSBpbnQzMlZlY3Rvci5WYWx1ZXNBc051bXB5KCkKKworICAgICMgSW50MzJWZWN0b3JUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIGlmIHNlbGYudmFsdWVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbnAgaXMgbm90IE5vbmUgYW5kIHR5cGUoc2VsZi52YWx1ZXMpIGlzIG5wLm5kYXJyYXk6CisgICAgICAgICAgICAgICAgdmFsdWVzID0gYnVpbGRlci5DcmVhdGVOdW1weVZlY3RvcihzZWxmLnZhbHVlcykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgSW50MzJWZWN0b3JTdGFydFZhbHVlc1ZlY3RvcihidWlsZGVyLCBsZW4oc2VsZi52YWx1ZXMpKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLnZhbHVlcykpKToKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5QcmVwZW5kSW50MzIoc2VsZi52YWx1ZXNbaV0pCisgICAgICAgICAgICAgICAgdmFsdWVzID0gYnVpbGRlci5FbmRWZWN0b3IoKQorICAgICAgICBJbnQzMlZlY3RvclN0YXJ0KGJ1aWxkZXIpCisgICAgICAgIGlmIHNlbGYudmFsdWVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgSW50MzJWZWN0b3JBZGRWYWx1ZXMoYnVpbGRlciwgdmFsdWVzKQorICAgICAgICBpbnQzMlZlY3RvciA9IEludDMyVmVjdG9yRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBpbnQzMlZlY3RvcgorCisKK2NsYXNzIFVpbnQxNlZlY3RvcihvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IFVpbnQxNlZlY3RvcigpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzVWludDE2VmVjdG9yKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgorICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgVWludDE2VmVjdG9yQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBVaW50MTZWZWN0b3IKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCisgICAgIyBVaW50MTZWZWN0b3IKKyAgICBkZWYgVmFsdWVzKHNlbGYsIGopOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICBhID0gc2VsZi5fdGFiLlZlY3RvcihvKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVpbnQxNkZsYWdzLCBhICsgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShqICogMikpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFVpbnQxNlZlY3RvcgorICAgIGRlZiBWYWx1ZXNBc051bXB5KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldFZlY3RvckFzTnVtcHkoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVpbnQxNkZsYWdzLCBvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBVaW50MTZWZWN0b3IKKyAgICBkZWYgVmFsdWVzTGVuZ3RoKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlZlY3RvckxlbihvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBVaW50MTZWZWN0b3IKKyAgICBkZWYgVmFsdWVzSXNOb25lKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICByZXR1cm4gbyA9PSAwCisKK2RlZiBVaW50MTZWZWN0b3JTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDEpCisKK2RlZiBVaW50MTZWZWN0b3JBZGRWYWx1ZXMoYnVpbGRlciwgdmFsdWVzKToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgwLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHZhbHVlcyksIDApCisKK2RlZiBVaW50MTZWZWN0b3JTdGFydFZhbHVlc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6CisgICAgcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoMiwgbnVtRWxlbXMsIDIpCisKK2RlZiBVaW50MTZWZWN0b3JFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCit0cnk6CisgICAgZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QKK2V4Y2VwdDoKKyAgICBwYXNzCisKK2NsYXNzIFVpbnQxNlZlY3RvclQob2JqZWN0KToKKworICAgICMgVWludDE2VmVjdG9yVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi52YWx1ZXMgPSBOb25lICAjIHR5cGU6IExpc3RbaW50XQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICB1aW50MTZWZWN0b3IgPSBVaW50MTZWZWN0b3IoKQorICAgICAgICB1aW50MTZWZWN0b3IuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaih1aW50MTZWZWN0b3IpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCB1aW50MTZWZWN0b3IpOgorICAgICAgICB4ID0gVWludDE2VmVjdG9yVCgpCisgICAgICAgIHguX1VuUGFjayh1aW50MTZWZWN0b3IpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFVpbnQxNlZlY3RvclQKKyAgICBkZWYgX1VuUGFjayhzZWxmLCB1aW50MTZWZWN0b3IpOgorICAgICAgICBpZiB1aW50MTZWZWN0b3IgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3QgdWludDE2VmVjdG9yLlZhbHVlc0lzTm9uZSgpOgorICAgICAgICAgICAgaWYgbnAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLnZhbHVlcyA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UodWludDE2VmVjdG9yLlZhbHVlc0xlbmd0aCgpKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi52YWx1ZXMuYXBwZW5kKHVpbnQxNlZlY3Rvci5WYWx1ZXMoaSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYudmFsdWVzID0gdWludDE2VmVjdG9yLlZhbHVlc0FzTnVtcHkoKQorCisgICAgIyBVaW50MTZWZWN0b3JUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIGlmIHNlbGYudmFsdWVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbnAgaXMgbm90IE5vbmUgYW5kIHR5cGUoc2VsZi52YWx1ZXMpIGlzIG5wLm5kYXJyYXk6CisgICAgICAgICAgICAgICAgdmFsdWVzID0gYnVpbGRlci5DcmVhdGVOdW1weVZlY3RvcihzZWxmLnZhbHVlcykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgVWludDE2VmVjdG9yU3RhcnRWYWx1ZXNWZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYudmFsdWVzKSkKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShsZW4oc2VsZi52YWx1ZXMpKSk6CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZFVpbnQxNihzZWxmLnZhbHVlc1tpXSkKKyAgICAgICAgICAgICAgICB2YWx1ZXMgPSBidWlsZGVyLkVuZFZlY3RvcigpCisgICAgICAgIFVpbnQxNlZlY3RvclN0YXJ0KGJ1aWxkZXIpCisgICAgICAgIGlmIHNlbGYudmFsdWVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgVWludDE2VmVjdG9yQWRkVmFsdWVzKGJ1aWxkZXIsIHZhbHVlcykKKyAgICAgICAgdWludDE2VmVjdG9yID0gVWludDE2VmVjdG9yRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiB1aW50MTZWZWN0b3IKKworCitjbGFzcyBVaW50OFZlY3RvcihvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IFVpbnQ4VmVjdG9yKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNVaW50OFZlY3RvcihjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFVpbnQ4VmVjdG9yQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBVaW50OFZlY3RvcgorICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKKyAgICAjIFVpbnQ4VmVjdG9yCisgICAgZGVmIFZhbHVlcyhzZWxmLCBqKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgYSA9IHNlbGYuX3RhYi5WZWN0b3IobykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VaW50OEZsYWdzLCBhICsgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShqICogMSkpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFVpbnQ4VmVjdG9yCisgICAgZGVmIFZhbHVlc0FzTnVtcHkoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0VmVjdG9yQXNOdW1weShmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVWludDhGbGFncywgbykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgVWludDhWZWN0b3IKKyAgICBkZWYgVmFsdWVzTGVuZ3RoKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlZlY3RvckxlbihvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBVaW50OFZlY3RvcgorICAgIGRlZiBWYWx1ZXNJc05vbmUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIHJldHVybiBvID09IDAKKworZGVmIFVpbnQ4VmVjdG9yU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgxKQorCitkZWYgVWludDhWZWN0b3JBZGRWYWx1ZXMoYnVpbGRlciwgdmFsdWVzKToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgwLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHZhbHVlcyksIDApCisKK2RlZiBVaW50OFZlY3RvclN0YXJ0VmFsdWVzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKKyAgICByZXR1cm4gYnVpbGRlci5TdGFydFZlY3RvcigxLCBudW1FbGVtcywgMSkKKworZGVmIFVpbnQ4VmVjdG9yRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKwordHJ5OgorICAgIGZyb20gdHlwaW5nIGltcG9ydCBMaXN0CitleGNlcHQ6CisgICAgcGFzcworCitjbGFzcyBVaW50OFZlY3RvclQob2JqZWN0KToKKworICAgICMgVWludDhWZWN0b3JUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnZhbHVlcyA9IE5vbmUgICMgdHlwZTogTGlzdFtpbnRdCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHVpbnQ4VmVjdG9yID0gVWludDhWZWN0b3IoKQorICAgICAgICB1aW50OFZlY3Rvci5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHVpbnQ4VmVjdG9yKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgdWludDhWZWN0b3IpOgorICAgICAgICB4ID0gVWludDhWZWN0b3JUKCkKKyAgICAgICAgeC5fVW5QYWNrKHVpbnQ4VmVjdG9yKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBVaW50OFZlY3RvclQKKyAgICBkZWYgX1VuUGFjayhzZWxmLCB1aW50OFZlY3Rvcik6CisgICAgICAgIGlmIHVpbnQ4VmVjdG9yIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IHVpbnQ4VmVjdG9yLlZhbHVlc0lzTm9uZSgpOgorICAgICAgICAgICAgaWYgbnAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLnZhbHVlcyA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UodWludDhWZWN0b3IuVmFsdWVzTGVuZ3RoKCkpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnZhbHVlcy5hcHBlbmQodWludDhWZWN0b3IuVmFsdWVzKGkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnZhbHVlcyA9IHVpbnQ4VmVjdG9yLlZhbHVlc0FzTnVtcHkoKQorCisgICAgIyBVaW50OFZlY3RvclQKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgaWYgc2VsZi52YWx1ZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBucCBpcyBub3QgTm9uZSBhbmQgdHlwZShzZWxmLnZhbHVlcykgaXMgbnAubmRhcnJheToKKyAgICAgICAgICAgICAgICB2YWx1ZXMgPSBidWlsZGVyLkNyZWF0ZU51bXB5VmVjdG9yKHNlbGYudmFsdWVzKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBVaW50OFZlY3RvclN0YXJ0VmFsdWVzVmVjdG9yKGJ1aWxkZXIsIGxlbihzZWxmLnZhbHVlcykpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYudmFsdWVzKSkpOgorICAgICAgICAgICAgICAgICAgICBidWlsZGVyLlByZXBlbmRVaW50OChzZWxmLnZhbHVlc1tpXSkKKyAgICAgICAgICAgICAgICB2YWx1ZXMgPSBidWlsZGVyLkVuZFZlY3RvcigpCisgICAgICAgIFVpbnQ4VmVjdG9yU3RhcnQoYnVpbGRlcikKKyAgICAgICAgaWYgc2VsZi52YWx1ZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBVaW50OFZlY3RvckFkZFZhbHVlcyhidWlsZGVyLCB2YWx1ZXMpCisgICAgICAgIHVpbnQ4VmVjdG9yID0gVWludDhWZWN0b3JFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHVpbnQ4VmVjdG9yCisKKworY2xhc3MgRGltZW5zaW9uTWV0YWRhdGEob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBEaW1lbnNpb25NZXRhZGF0YSgpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzRGltZW5zaW9uTWV0YWRhdGEoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBEaW1lbnNpb25NZXRhZGF0YUJ1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgRGltZW5zaW9uTWV0YWRhdGEKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCisgICAgIyBEaW1lbnNpb25NZXRhZGF0YQorICAgIGRlZiBGb3JtYXQoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBEaW1lbnNpb25NZXRhZGF0YQorICAgIGRlZiBEZW5zZVNpemUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgRGltZW5zaW9uTWV0YWRhdGEKKyAgICBkZWYgQXJyYXlTZWdtZW50c1R5cGUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VaW50OEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgRGltZW5zaW9uTWV0YWRhdGEKKyAgICBkZWYgQXJyYXlTZWdtZW50cyhzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIGZyb20gZmxhdGJ1ZmZlcnMudGFibGUgaW1wb3J0IFRhYmxlCisgICAgICAgICAgICBvYmogPSBUYWJsZShieXRlYXJyYXkoKSwgMCkKKyAgICAgICAgICAgIHNlbGYuX3RhYi5VbmlvbihvYmosIG8pCisgICAgICAgICAgICByZXR1cm4gb2JqCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICAjIERpbWVuc2lvbk1ldGFkYXRhCisgICAgZGVmIEFycmF5SW5kaWNlc1R5cGUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTIpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVWludDhGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIERpbWVuc2lvbk1ldGFkYXRhCisgICAgZGVmIEFycmF5SW5kaWNlcyhzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIGZyb20gZmxhdGJ1ZmZlcnMudGFibGUgaW1wb3J0IFRhYmxlCisgICAgICAgICAgICBvYmogPSBUYWJsZShieXRlYXJyYXkoKSwgMCkKKyAgICAgICAgICAgIHNlbGYuX3RhYi5VbmlvbihvYmosIG8pCisgICAgICAgICAgICByZXR1cm4gb2JqCisgICAgICAgIHJldHVybiBOb25lCisKK2RlZiBEaW1lbnNpb25NZXRhZGF0YVN0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoNikKKworZGVmIERpbWVuc2lvbk1ldGFkYXRhQWRkRm9ybWF0KGJ1aWxkZXIsIGZvcm1hdCk6CisgICAgYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoMCwgZm9ybWF0LCAwKQorCitkZWYgRGltZW5zaW9uTWV0YWRhdGFBZGREZW5zZVNpemUoYnVpbGRlciwgZGVuc2VTaXplKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMSwgZGVuc2VTaXplLCAwKQorCitkZWYgRGltZW5zaW9uTWV0YWRhdGFBZGRBcnJheVNlZ21lbnRzVHlwZShidWlsZGVyLCBhcnJheVNlZ21lbnRzVHlwZSk6CisgICAgYnVpbGRlci5QcmVwZW5kVWludDhTbG90KDIsIGFycmF5U2VnbWVudHNUeXBlLCAwKQorCitkZWYgRGltZW5zaW9uTWV0YWRhdGFBZGRBcnJheVNlZ21lbnRzKGJ1aWxkZXIsIGFycmF5U2VnbWVudHMpOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDMsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoYXJyYXlTZWdtZW50cyksIDApCisKK2RlZiBEaW1lbnNpb25NZXRhZGF0YUFkZEFycmF5SW5kaWNlc1R5cGUoYnVpbGRlciwgYXJyYXlJbmRpY2VzVHlwZSk6CisgICAgYnVpbGRlci5QcmVwZW5kVWludDhTbG90KDQsIGFycmF5SW5kaWNlc1R5cGUsIDApCisKK2RlZiBEaW1lbnNpb25NZXRhZGF0YUFkZEFycmF5SW5kaWNlcyhidWlsZGVyLCBhcnJheUluZGljZXMpOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDUsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoYXJyYXlJbmRpY2VzKSwgMCkKKworZGVmIERpbWVuc2lvbk1ldGFkYXRhRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKwordHJ5OgorICAgIGZyb20gdHlwaW5nIGltcG9ydCBVbmlvbgorZXhjZXB0OgorICAgIHBhc3MKKworY2xhc3MgRGltZW5zaW9uTWV0YWRhdGFUKG9iamVjdCk6CisKKyAgICAjIERpbWVuc2lvbk1ldGFkYXRhVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5mb3JtYXQgPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmRlbnNlU2l6ZSA9IDAgICMgdHlwZTogaW50CisgICAgICAgIHNlbGYuYXJyYXlTZWdtZW50c1R5cGUgPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmFycmF5U2VnbWVudHMgPSBOb25lICAjIHR5cGU6IFVuaW9uW05vbmUsIEludDMyVmVjdG9yVCwgVWludDE2VmVjdG9yVCwgVWludDhWZWN0b3JUXQorICAgICAgICBzZWxmLmFycmF5SW5kaWNlc1R5cGUgPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmFycmF5SW5kaWNlcyA9IE5vbmUgICMgdHlwZTogVW5pb25bTm9uZSwgSW50MzJWZWN0b3JULCBVaW50MTZWZWN0b3JULCBVaW50OFZlY3RvclRdCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIGRpbWVuc2lvbk1ldGFkYXRhID0gRGltZW5zaW9uTWV0YWRhdGEoKQorICAgICAgICBkaW1lbnNpb25NZXRhZGF0YS5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGRpbWVuc2lvbk1ldGFkYXRhKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgZGltZW5zaW9uTWV0YWRhdGEpOgorICAgICAgICB4ID0gRGltZW5zaW9uTWV0YWRhdGFUKCkKKyAgICAgICAgeC5fVW5QYWNrKGRpbWVuc2lvbk1ldGFkYXRhKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBEaW1lbnNpb25NZXRhZGF0YVQKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBkaW1lbnNpb25NZXRhZGF0YSk6CisgICAgICAgIGlmIGRpbWVuc2lvbk1ldGFkYXRhIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5mb3JtYXQgPSBkaW1lbnNpb25NZXRhZGF0YS5Gb3JtYXQoKQorICAgICAgICBzZWxmLmRlbnNlU2l6ZSA9IGRpbWVuc2lvbk1ldGFkYXRhLkRlbnNlU2l6ZSgpCisgICAgICAgIHNlbGYuYXJyYXlTZWdtZW50c1R5cGUgPSBkaW1lbnNpb25NZXRhZGF0YS5BcnJheVNlZ21lbnRzVHlwZSgpCisgICAgICAgIHNlbGYuYXJyYXlTZWdtZW50cyA9IFNwYXJzZUluZGV4VmVjdG9yQ3JlYXRvcihzZWxmLmFycmF5U2VnbWVudHNUeXBlLCBkaW1lbnNpb25NZXRhZGF0YS5BcnJheVNlZ21lbnRzKCkpCisgICAgICAgIHNlbGYuYXJyYXlJbmRpY2VzVHlwZSA9IGRpbWVuc2lvbk1ldGFkYXRhLkFycmF5SW5kaWNlc1R5cGUoKQorICAgICAgICBzZWxmLmFycmF5SW5kaWNlcyA9IFNwYXJzZUluZGV4VmVjdG9yQ3JlYXRvcihzZWxmLmFycmF5SW5kaWNlc1R5cGUsIGRpbWVuc2lvbk1ldGFkYXRhLkFycmF5SW5kaWNlcygpKQorCisgICAgIyBEaW1lbnNpb25NZXRhZGF0YVQKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgaWYgc2VsZi5hcnJheVNlZ21lbnRzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYXJyYXlTZWdtZW50cyA9IHNlbGYuYXJyYXlTZWdtZW50cy5QYWNrKGJ1aWxkZXIpCisgICAgICAgIGlmIHNlbGYuYXJyYXlJbmRpY2VzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYXJyYXlJbmRpY2VzID0gc2VsZi5hcnJheUluZGljZXMuUGFjayhidWlsZGVyKQorICAgICAgICBEaW1lbnNpb25NZXRhZGF0YVN0YXJ0KGJ1aWxkZXIpCisgICAgICAgIERpbWVuc2lvbk1ldGFkYXRhQWRkRm9ybWF0KGJ1aWxkZXIsIHNlbGYuZm9ybWF0KQorICAgICAgICBEaW1lbnNpb25NZXRhZGF0YUFkZERlbnNlU2l6ZShidWlsZGVyLCBzZWxmLmRlbnNlU2l6ZSkKKyAgICAgICAgRGltZW5zaW9uTWV0YWRhdGFBZGRBcnJheVNlZ21lbnRzVHlwZShidWlsZGVyLCBzZWxmLmFycmF5U2VnbWVudHNUeXBlKQorICAgICAgICBpZiBzZWxmLmFycmF5U2VnbWVudHMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBEaW1lbnNpb25NZXRhZGF0YUFkZEFycmF5U2VnbWVudHMoYnVpbGRlciwgYXJyYXlTZWdtZW50cykKKyAgICAgICAgRGltZW5zaW9uTWV0YWRhdGFBZGRBcnJheUluZGljZXNUeXBlKGJ1aWxkZXIsIHNlbGYuYXJyYXlJbmRpY2VzVHlwZSkKKyAgICAgICAgaWYgc2VsZi5hcnJheUluZGljZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBEaW1lbnNpb25NZXRhZGF0YUFkZEFycmF5SW5kaWNlcyhidWlsZGVyLCBhcnJheUluZGljZXMpCisgICAgICAgIGRpbWVuc2lvbk1ldGFkYXRhID0gRGltZW5zaW9uTWV0YWRhdGFFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIGRpbWVuc2lvbk1ldGFkYXRhCisKKworY2xhc3MgU3BhcnNpdHlQYXJhbWV0ZXJzKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gU3BhcnNpdHlQYXJhbWV0ZXJzKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNTcGFyc2l0eVBhcmFtZXRlcnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBTcGFyc2l0eVBhcmFtZXRlcnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFNwYXJzaXR5UGFyYW1ldGVycworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKKyAgICAjIFNwYXJzaXR5UGFyYW1ldGVycworICAgIGRlZiBUcmF2ZXJzYWxPcmRlcihzZWxmLCBqKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgYSA9IHNlbGYuX3RhYi5WZWN0b3IobykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBhICsgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShqICogNCkpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFNwYXJzaXR5UGFyYW1ldGVycworICAgIGRlZiBUcmF2ZXJzYWxPcmRlckFzTnVtcHkoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0VmVjdG9yQXNOdW1weShmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3BhcnNpdHlQYXJhbWV0ZXJzCisgICAgZGVmIFRyYXZlcnNhbE9yZGVyTGVuZ3RoKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlZlY3RvckxlbihvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTcGFyc2l0eVBhcmFtZXRlcnMKKyAgICBkZWYgVHJhdmVyc2FsT3JkZXJJc05vbmUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIHJldHVybiBvID09IDAKKworICAgICMgU3BhcnNpdHlQYXJhbWV0ZXJzCisgICAgZGVmIEJsb2NrTWFwKHNlbGYsIGopOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICBhID0gc2VsZi5fdGFiLlZlY3RvcihvKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIGEgKyBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGogKiA0KSkKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3BhcnNpdHlQYXJhbWV0ZXJzCisgICAgZGVmIEJsb2NrTWFwQXNOdW1weShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXRWZWN0b3JBc051bXB5KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTcGFyc2l0eVBhcmFtZXRlcnMKKyAgICBkZWYgQmxvY2tNYXBMZW5ndGgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuVmVjdG9yTGVuKG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFNwYXJzaXR5UGFyYW1ldGVycworICAgIGRlZiBCbG9ja01hcElzTm9uZShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKKyAgICAgICAgcmV0dXJuIG8gPT0gMAorCisgICAgIyBTcGFyc2l0eVBhcmFtZXRlcnMKKyAgICBkZWYgRGltTWV0YWRhdGEoc2VsZiwgaik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHggPSBzZWxmLl90YWIuVmVjdG9yKG8pCisgICAgICAgICAgICB4ICs9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaikgKiA0CisgICAgICAgICAgICB4ID0gc2VsZi5fdGFiLkluZGlyZWN0KHgpCisgICAgICAgICAgICBvYmogPSBEaW1lbnNpb25NZXRhZGF0YSgpCisgICAgICAgICAgICBvYmouSW5pdChzZWxmLl90YWIuQnl0ZXMsIHgpCisgICAgICAgICAgICByZXR1cm4gb2JqCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICAjIFNwYXJzaXR5UGFyYW1ldGVycworICAgIGRlZiBEaW1NZXRhZGF0YUxlbmd0aChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg4KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3BhcnNpdHlQYXJhbWV0ZXJzCisgICAgZGVmIERpbU1ldGFkYXRhSXNOb25lKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQorICAgICAgICByZXR1cm4gbyA9PSAwCisKK2RlZiBTcGFyc2l0eVBhcmFtZXRlcnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDMpCisKK2RlZiBTcGFyc2l0eVBhcmFtZXRlcnNBZGRUcmF2ZXJzYWxPcmRlcihidWlsZGVyLCB0cmF2ZXJzYWxPcmRlcik6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMCwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZSh0cmF2ZXJzYWxPcmRlciksIDApCisKK2RlZiBTcGFyc2l0eVBhcmFtZXRlcnNTdGFydFRyYXZlcnNhbE9yZGVyVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKKyAgICByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCkKKworZGVmIFNwYXJzaXR5UGFyYW1ldGVyc0FkZEJsb2NrTWFwKGJ1aWxkZXIsIGJsb2NrTWFwKToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgxLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGJsb2NrTWFwKSwgMCkKKworZGVmIFNwYXJzaXR5UGFyYW1ldGVyc1N0YXJ0QmxvY2tNYXBWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgorICAgIHJldHVybiBidWlsZGVyLlN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KQorCitkZWYgU3BhcnNpdHlQYXJhbWV0ZXJzQWRkRGltTWV0YWRhdGEoYnVpbGRlciwgZGltTWV0YWRhdGEpOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDIsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoZGltTWV0YWRhdGEpLCAwKQorCitkZWYgU3BhcnNpdHlQYXJhbWV0ZXJzU3RhcnREaW1NZXRhZGF0YVZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6CisgICAgcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpCisKK2RlZiBTcGFyc2l0eVBhcmFtZXRlcnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCit0cnk6CisgICAgZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QKK2V4Y2VwdDoKKyAgICBwYXNzCisKK2NsYXNzIFNwYXJzaXR5UGFyYW1ldGVyc1Qob2JqZWN0KToKKworICAgICMgU3BhcnNpdHlQYXJhbWV0ZXJzVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi50cmF2ZXJzYWxPcmRlciA9IE5vbmUgICMgdHlwZTogTGlzdFtpbnRdCisgICAgICAgIHNlbGYuYmxvY2tNYXAgPSBOb25lICAjIHR5cGU6IExpc3RbaW50XQorICAgICAgICBzZWxmLmRpbU1ldGFkYXRhID0gTm9uZSAgIyB0eXBlOiBMaXN0W0RpbWVuc2lvbk1ldGFkYXRhVF0KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgc3BhcnNpdHlQYXJhbWV0ZXJzID0gU3BhcnNpdHlQYXJhbWV0ZXJzKCkKKyAgICAgICAgc3BhcnNpdHlQYXJhbWV0ZXJzLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooc3BhcnNpdHlQYXJhbWV0ZXJzKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgc3BhcnNpdHlQYXJhbWV0ZXJzKToKKyAgICAgICAgeCA9IFNwYXJzaXR5UGFyYW1ldGVyc1QoKQorICAgICAgICB4Ll9VblBhY2soc3BhcnNpdHlQYXJhbWV0ZXJzKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBTcGFyc2l0eVBhcmFtZXRlcnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgc3BhcnNpdHlQYXJhbWV0ZXJzKToKKyAgICAgICAgaWYgc3BhcnNpdHlQYXJhbWV0ZXJzIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IHNwYXJzaXR5UGFyYW1ldGVycy5UcmF2ZXJzYWxPcmRlcklzTm9uZSgpOgorICAgICAgICAgICAgaWYgbnAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLnRyYXZlcnNhbE9yZGVyID0gW10KKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShzcGFyc2l0eVBhcmFtZXRlcnMuVHJhdmVyc2FsT3JkZXJMZW5ndGgoKSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudHJhdmVyc2FsT3JkZXIuYXBwZW5kKHNwYXJzaXR5UGFyYW1ldGVycy5UcmF2ZXJzYWxPcmRlcihpKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi50cmF2ZXJzYWxPcmRlciA9IHNwYXJzaXR5UGFyYW1ldGVycy5UcmF2ZXJzYWxPcmRlckFzTnVtcHkoKQorICAgICAgICBpZiBub3Qgc3BhcnNpdHlQYXJhbWV0ZXJzLkJsb2NrTWFwSXNOb25lKCk6CisgICAgICAgICAgICBpZiBucCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuYmxvY2tNYXAgPSBbXQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHNwYXJzaXR5UGFyYW1ldGVycy5CbG9ja01hcExlbmd0aCgpKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5ibG9ja01hcC5hcHBlbmQoc3BhcnNpdHlQYXJhbWV0ZXJzLkJsb2NrTWFwKGkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmJsb2NrTWFwID0gc3BhcnNpdHlQYXJhbWV0ZXJzLkJsb2NrTWFwQXNOdW1weSgpCisgICAgICAgIGlmIG5vdCBzcGFyc2l0eVBhcmFtZXRlcnMuRGltTWV0YWRhdGFJc05vbmUoKToKKyAgICAgICAgICAgIHNlbGYuZGltTWV0YWRhdGEgPSBbXQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc3BhcnNpdHlQYXJhbWV0ZXJzLkRpbU1ldGFkYXRhTGVuZ3RoKCkpOgorICAgICAgICAgICAgICAgIGlmIHNwYXJzaXR5UGFyYW1ldGVycy5EaW1NZXRhZGF0YShpKSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmRpbU1ldGFkYXRhLmFwcGVuZChOb25lKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGRpbWVuc2lvbk1ldGFkYXRhXyA9IERpbWVuc2lvbk1ldGFkYXRhVC5Jbml0RnJvbU9iaihzcGFyc2l0eVBhcmFtZXRlcnMuRGltTWV0YWRhdGEoaSkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuZGltTWV0YWRhdGEuYXBwZW5kKGRpbWVuc2lvbk1ldGFkYXRhXykKKworICAgICMgU3BhcnNpdHlQYXJhbWV0ZXJzVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBpZiBzZWxmLnRyYXZlcnNhbE9yZGVyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbnAgaXMgbm90IE5vbmUgYW5kIHR5cGUoc2VsZi50cmF2ZXJzYWxPcmRlcikgaXMgbnAubmRhcnJheToKKyAgICAgICAgICAgICAgICB0cmF2ZXJzYWxPcmRlciA9IGJ1aWxkZXIuQ3JlYXRlTnVtcHlWZWN0b3Ioc2VsZi50cmF2ZXJzYWxPcmRlcikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgU3BhcnNpdHlQYXJhbWV0ZXJzU3RhcnRUcmF2ZXJzYWxPcmRlclZlY3RvcihidWlsZGVyLCBsZW4oc2VsZi50cmF2ZXJzYWxPcmRlcikpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYudHJhdmVyc2FsT3JkZXIpKSk6CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZEludDMyKHNlbGYudHJhdmVyc2FsT3JkZXJbaV0pCisgICAgICAgICAgICAgICAgdHJhdmVyc2FsT3JkZXIgPSBidWlsZGVyLkVuZFZlY3RvcigpCisgICAgICAgIGlmIHNlbGYuYmxvY2tNYXAgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBucCBpcyBub3QgTm9uZSBhbmQgdHlwZShzZWxmLmJsb2NrTWFwKSBpcyBucC5uZGFycmF5OgorICAgICAgICAgICAgICAgIGJsb2NrTWFwID0gYnVpbGRlci5DcmVhdGVOdW1weVZlY3RvcihzZWxmLmJsb2NrTWFwKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBTcGFyc2l0eVBhcmFtZXRlcnNTdGFydEJsb2NrTWFwVmVjdG9yKGJ1aWxkZXIsIGxlbihzZWxmLmJsb2NrTWFwKSkKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShsZW4oc2VsZi5ibG9ja01hcCkpKToKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5QcmVwZW5kSW50MzIoc2VsZi5ibG9ja01hcFtpXSkKKyAgICAgICAgICAgICAgICBibG9ja01hcCA9IGJ1aWxkZXIuRW5kVmVjdG9yKCkKKyAgICAgICAgaWYgc2VsZi5kaW1NZXRhZGF0YSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGRpbU1ldGFkYXRhbGlzdCA9IFtdCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5kaW1NZXRhZGF0YSkpOgorICAgICAgICAgICAgICAgIGRpbU1ldGFkYXRhbGlzdC5hcHBlbmQoc2VsZi5kaW1NZXRhZGF0YVtpXS5QYWNrKGJ1aWxkZXIpKQorICAgICAgICAgICAgU3BhcnNpdHlQYXJhbWV0ZXJzU3RhcnREaW1NZXRhZGF0YVZlY3RvcihidWlsZGVyLCBsZW4oc2VsZi5kaW1NZXRhZGF0YSkpCisgICAgICAgICAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShsZW4oc2VsZi5kaW1NZXRhZGF0YSkpKToKKyAgICAgICAgICAgICAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlKGRpbU1ldGFkYXRhbGlzdFtpXSkKKyAgICAgICAgICAgIGRpbU1ldGFkYXRhID0gYnVpbGRlci5FbmRWZWN0b3IoKQorICAgICAgICBTcGFyc2l0eVBhcmFtZXRlcnNTdGFydChidWlsZGVyKQorICAgICAgICBpZiBzZWxmLnRyYXZlcnNhbE9yZGVyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgU3BhcnNpdHlQYXJhbWV0ZXJzQWRkVHJhdmVyc2FsT3JkZXIoYnVpbGRlciwgdHJhdmVyc2FsT3JkZXIpCisgICAgICAgIGlmIHNlbGYuYmxvY2tNYXAgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBTcGFyc2l0eVBhcmFtZXRlcnNBZGRCbG9ja01hcChidWlsZGVyLCBibG9ja01hcCkKKyAgICAgICAgaWYgc2VsZi5kaW1NZXRhZGF0YSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIFNwYXJzaXR5UGFyYW1ldGVyc0FkZERpbU1ldGFkYXRhKGJ1aWxkZXIsIGRpbU1ldGFkYXRhKQorICAgICAgICBzcGFyc2l0eVBhcmFtZXRlcnMgPSBTcGFyc2l0eVBhcmFtZXRlcnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHNwYXJzaXR5UGFyYW1ldGVycworCisKK2NsYXNzIFZhcmlhbnRTdWJUeXBlKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gVmFyaWFudFN1YlR5cGUoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc1ZhcmlhbnRTdWJUeXBlKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgorICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgVmFyaWFudFN1YlR5cGVCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFZhcmlhbnRTdWJUeXBlCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworICAgICMgVmFyaWFudFN1YlR5cGUKKyAgICBkZWYgU2hhcGUoc2VsZiwgaik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIGEgPSBzZWxmLl90YWIuVmVjdG9yKG8pCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgYSArIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaiAqIDQpKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBWYXJpYW50U3ViVHlwZQorICAgIGRlZiBTaGFwZUFzTnVtcHkoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0VmVjdG9yQXNOdW1weShmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgVmFyaWFudFN1YlR5cGUKKyAgICBkZWYgU2hhcGVMZW5ndGgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuVmVjdG9yTGVuKG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFZhcmlhbnRTdWJUeXBlCisgICAgZGVmIFNoYXBlSXNOb25lKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICByZXR1cm4gbyA9PSAwCisKKyAgICAjIFZhcmlhbnRTdWJUeXBlCisgICAgZGVmIFR5cGUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBWYXJpYW50U3ViVHlwZQorICAgIGRlZiBIYXNSYW5rKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gYm9vbChzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5Cb29sRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKSkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKK2RlZiBWYXJpYW50U3ViVHlwZVN0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMykKKworZGVmIFZhcmlhbnRTdWJUeXBlQWRkU2hhcGUoYnVpbGRlciwgc2hhcGUpOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDAsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2hhcGUpLCAwKQorCitkZWYgVmFyaWFudFN1YlR5cGVTdGFydFNoYXBlVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKKyAgICByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCkKKworZGVmIFZhcmlhbnRTdWJUeXBlQWRkVHlwZShidWlsZGVyLCB0eXBlKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCgxLCB0eXBlLCAwKQorCitkZWYgVmFyaWFudFN1YlR5cGVBZGRIYXNSYW5rKGJ1aWxkZXIsIGhhc1JhbmspOgorICAgIGJ1aWxkZXIuUHJlcGVuZEJvb2xTbG90KDIsIGhhc1JhbmssIDApCisKK2RlZiBWYXJpYW50U3ViVHlwZUVuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKK3RyeToKKyAgICBmcm9tIHR5cGluZyBpbXBvcnQgTGlzdAorZXhjZXB0OgorICAgIHBhc3MKKworY2xhc3MgVmFyaWFudFN1YlR5cGVUKG9iamVjdCk6CisKKyAgICAjIFZhcmlhbnRTdWJUeXBlVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5zaGFwZSA9IE5vbmUgICMgdHlwZTogTGlzdFtpbnRdCisgICAgICAgIHNlbGYudHlwZSA9IDAgICMgdHlwZTogaW50CisgICAgICAgIHNlbGYuaGFzUmFuayA9IEZhbHNlICAjIHR5cGU6IGJvb2wKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgdmFyaWFudFN1YlR5cGUgPSBWYXJpYW50U3ViVHlwZSgpCisgICAgICAgIHZhcmlhbnRTdWJUeXBlLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoodmFyaWFudFN1YlR5cGUpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCB2YXJpYW50U3ViVHlwZSk6CisgICAgICAgIHggPSBWYXJpYW50U3ViVHlwZVQoKQorICAgICAgICB4Ll9VblBhY2sodmFyaWFudFN1YlR5cGUpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFZhcmlhbnRTdWJUeXBlVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIHZhcmlhbnRTdWJUeXBlKToKKyAgICAgICAgaWYgdmFyaWFudFN1YlR5cGUgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3QgdmFyaWFudFN1YlR5cGUuU2hhcGVJc05vbmUoKToKKyAgICAgICAgICAgIGlmIG5wIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5zaGFwZSA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UodmFyaWFudFN1YlR5cGUuU2hhcGVMZW5ndGgoKSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2hhcGUuYXBwZW5kKHZhcmlhbnRTdWJUeXBlLlNoYXBlKGkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnNoYXBlID0gdmFyaWFudFN1YlR5cGUuU2hhcGVBc051bXB5KCkKKyAgICAgICAgc2VsZi50eXBlID0gdmFyaWFudFN1YlR5cGUuVHlwZSgpCisgICAgICAgIHNlbGYuaGFzUmFuayA9IHZhcmlhbnRTdWJUeXBlLkhhc1JhbmsoKQorCisgICAgIyBWYXJpYW50U3ViVHlwZVQKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgaWYgc2VsZi5zaGFwZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG5wIGlzIG5vdCBOb25lIGFuZCB0eXBlKHNlbGYuc2hhcGUpIGlzIG5wLm5kYXJyYXk6CisgICAgICAgICAgICAgICAgc2hhcGUgPSBidWlsZGVyLkNyZWF0ZU51bXB5VmVjdG9yKHNlbGYuc2hhcGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIFZhcmlhbnRTdWJUeXBlU3RhcnRTaGFwZVZlY3RvcihidWlsZGVyLCBsZW4oc2VsZi5zaGFwZSkpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYuc2hhcGUpKSk6CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZEludDMyKHNlbGYuc2hhcGVbaV0pCisgICAgICAgICAgICAgICAgc2hhcGUgPSBidWlsZGVyLkVuZFZlY3RvcigpCisgICAgICAgIFZhcmlhbnRTdWJUeXBlU3RhcnQoYnVpbGRlcikKKyAgICAgICAgaWYgc2VsZi5zaGFwZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIFZhcmlhbnRTdWJUeXBlQWRkU2hhcGUoYnVpbGRlciwgc2hhcGUpCisgICAgICAgIFZhcmlhbnRTdWJUeXBlQWRkVHlwZShidWlsZGVyLCBzZWxmLnR5cGUpCisgICAgICAgIFZhcmlhbnRTdWJUeXBlQWRkSGFzUmFuayhidWlsZGVyLCBzZWxmLmhhc1JhbmspCisgICAgICAgIHZhcmlhbnRTdWJUeXBlID0gVmFyaWFudFN1YlR5cGVFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHZhcmlhbnRTdWJUeXBlCisKKworY2xhc3MgVGVuc29yKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gVGVuc29yKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNUZW5zb3IoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBUZW5zb3JCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFRlbnNvcgorICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKKyAgICAjIFRlbnNvcgorICAgIGRlZiBTaGFwZShzZWxmLCBqKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgYSA9IHNlbGYuX3RhYi5WZWN0b3IobykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBhICsgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShqICogNCkpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFRlbnNvcgorICAgIGRlZiBTaGFwZUFzTnVtcHkoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0VmVjdG9yQXNOdW1weShmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgVGVuc29yCisgICAgZGVmIFNoYXBlTGVuZ3RoKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlZlY3RvckxlbihvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBUZW5zb3IKKyAgICBkZWYgU2hhcGVJc05vbmUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIHJldHVybiBvID09IDAKKworICAgICMgVGVuc29yCisgICAgZGVmIFR5cGUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBUZW5zb3IKKyAgICBkZWYgQnVmZmVyKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVWludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBUZW5zb3IKKyAgICBkZWYgTmFtZShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuU3RyaW5nKG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgIyBUZW5zb3IKKyAgICBkZWYgUXVhbnRpemF0aW9uKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEyKSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgeCA9IHNlbGYuX3RhYi5JbmRpcmVjdChvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgICAgIG9iaiA9IFF1YW50aXphdGlvblBhcmFtZXRlcnMoKQorICAgICAgICAgICAgb2JqLkluaXQoc2VsZi5fdGFiLkJ5dGVzLCB4KQorICAgICAgICAgICAgcmV0dXJuIG9iagorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgIyBUZW5zb3IKKyAgICBkZWYgSXNWYXJpYWJsZShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkJvb2xGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpKQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICMgVGVuc29yCisgICAgZGVmIFNwYXJzaXR5KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDE2KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgeCA9IHNlbGYuX3RhYi5JbmRpcmVjdChvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgICAgIG9iaiA9IFNwYXJzaXR5UGFyYW1ldGVycygpCisgICAgICAgICAgICBvYmouSW5pdChzZWxmLl90YWIuQnl0ZXMsIHgpCisgICAgICAgICAgICByZXR1cm4gb2JqCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICAjIFRlbnNvcgorICAgIGRlZiBTaGFwZVNpZ25hdHVyZShzZWxmLCBqKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxOCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIGEgPSBzZWxmLl90YWIuVmVjdG9yKG8pCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgYSArIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaiAqIDQpKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBUZW5zb3IKKyAgICBkZWYgU2hhcGVTaWduYXR1cmVBc051bXB5KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDE4KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXRWZWN0b3JBc051bXB5KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBUZW5zb3IKKyAgICBkZWYgU2hhcGVTaWduYXR1cmVMZW5ndGgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTgpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlZlY3RvckxlbihvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBUZW5zb3IKKyAgICBkZWYgU2hhcGVTaWduYXR1cmVJc05vbmUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTgpKQorICAgICAgICByZXR1cm4gbyA9PSAwCisKKyAgICAjIFRlbnNvcgorICAgIGRlZiBIYXNSYW5rKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDIwKSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuQm9vbEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykpCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgIyBUZW5zb3IKKyAgICBkZWYgVmFyaWFudFRlbnNvcnMoc2VsZiwgaik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMjIpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICB4ID0gc2VsZi5fdGFiLlZlY3RvcihvKQorICAgICAgICAgICAgeCArPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGopICogNAorICAgICAgICAgICAgeCA9IHNlbGYuX3RhYi5JbmRpcmVjdCh4KQorICAgICAgICAgICAgb2JqID0gVmFyaWFudFN1YlR5cGUoKQorICAgICAgICAgICAgb2JqLkluaXQoc2VsZi5fdGFiLkJ5dGVzLCB4KQorICAgICAgICAgICAgcmV0dXJuIG9iagorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgIyBUZW5zb3IKKyAgICBkZWYgVmFyaWFudFRlbnNvcnNMZW5ndGgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMjIpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlZlY3RvckxlbihvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBUZW5zb3IKKyAgICBkZWYgVmFyaWFudFRlbnNvcnNJc05vbmUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMjIpKQorICAgICAgICByZXR1cm4gbyA9PSAwCisKK2RlZiBUZW5zb3JTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDEwKQorCitkZWYgVGVuc29yQWRkU2hhcGUoYnVpbGRlciwgc2hhcGUpOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDAsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2hhcGUpLCAwKQorCitkZWYgVGVuc29yU3RhcnRTaGFwZVZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6CisgICAgcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpCisKK2RlZiBUZW5zb3JBZGRUeXBlKGJ1aWxkZXIsIHR5cGUpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEludDhTbG90KDEsIHR5cGUsIDApCisKK2RlZiBUZW5zb3JBZGRCdWZmZXIoYnVpbGRlciwgYnVmZmVyKToKKyAgICBidWlsZGVyLlByZXBlbmRVaW50MzJTbG90KDIsIGJ1ZmZlciwgMCkKKworZGVmIFRlbnNvckFkZE5hbWUoYnVpbGRlciwgbmFtZSk6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMywgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShuYW1lKSwgMCkKKworZGVmIFRlbnNvckFkZFF1YW50aXphdGlvbihidWlsZGVyLCBxdWFudGl6YXRpb24pOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDQsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUocXVhbnRpemF0aW9uKSwgMCkKKworZGVmIFRlbnNvckFkZElzVmFyaWFibGUoYnVpbGRlciwgaXNWYXJpYWJsZSk6CisgICAgYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoNSwgaXNWYXJpYWJsZSwgMCkKKworZGVmIFRlbnNvckFkZFNwYXJzaXR5KGJ1aWxkZXIsIHNwYXJzaXR5KToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCg2LCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNwYXJzaXR5KSwgMCkKKworZGVmIFRlbnNvckFkZFNoYXBlU2lnbmF0dXJlKGJ1aWxkZXIsIHNoYXBlU2lnbmF0dXJlKToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCg3LCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNoYXBlU2lnbmF0dXJlKSwgMCkKKworZGVmIFRlbnNvclN0YXJ0U2hhcGVTaWduYXR1cmVWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgorICAgIHJldHVybiBidWlsZGVyLlN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KQorCitkZWYgVGVuc29yQWRkSGFzUmFuayhidWlsZGVyLCBoYXNSYW5rKToKKyAgICBidWlsZGVyLlByZXBlbmRCb29sU2xvdCg4LCBoYXNSYW5rLCAwKQorCitkZWYgVGVuc29yQWRkVmFyaWFudFRlbnNvcnMoYnVpbGRlciwgdmFyaWFudFRlbnNvcnMpOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDksIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUodmFyaWFudFRlbnNvcnMpLCAwKQorCitkZWYgVGVuc29yU3RhcnRWYXJpYW50VGVuc29yc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6CisgICAgcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpCisKK2RlZiBUZW5zb3JFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCit0cnk6CisgICAgZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QsIE9wdGlvbmFsCitleGNlcHQ6CisgICAgcGFzcworCitjbGFzcyBUZW5zb3JUKG9iamVjdCk6CisKKyAgICAjIFRlbnNvclQKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuc2hhcGUgPSBOb25lICAjIHR5cGU6IExpc3RbaW50XQorICAgICAgICBzZWxmLnR5cGUgPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmJ1ZmZlciA9IDAgICMgdHlwZTogaW50CisgICAgICAgIHNlbGYubmFtZSA9IE5vbmUgICMgdHlwZTogc3RyCisgICAgICAgIHNlbGYucXVhbnRpemF0aW9uID0gTm9uZSAgIyB0eXBlOiBPcHRpb25hbFtRdWFudGl6YXRpb25QYXJhbWV0ZXJzVF0KKyAgICAgICAgc2VsZi5pc1ZhcmlhYmxlID0gRmFsc2UgICMgdHlwZTogYm9vbAorICAgICAgICBzZWxmLnNwYXJzaXR5ID0gTm9uZSAgIyB0eXBlOiBPcHRpb25hbFtTcGFyc2l0eVBhcmFtZXRlcnNUXQorICAgICAgICBzZWxmLnNoYXBlU2lnbmF0dXJlID0gTm9uZSAgIyB0eXBlOiBMaXN0W2ludF0KKyAgICAgICAgc2VsZi5oYXNSYW5rID0gRmFsc2UgICMgdHlwZTogYm9vbAorICAgICAgICBzZWxmLnZhcmlhbnRUZW5zb3JzID0gTm9uZSAgIyB0eXBlOiBMaXN0W1ZhcmlhbnRTdWJUeXBlVF0KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgdGVuc29yID0gVGVuc29yKCkKKyAgICAgICAgdGVuc29yLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoodGVuc29yKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgdGVuc29yKToKKyAgICAgICAgeCA9IFRlbnNvclQoKQorICAgICAgICB4Ll9VblBhY2sodGVuc29yKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBUZW5zb3JUCisgICAgZGVmIF9VblBhY2soc2VsZiwgdGVuc29yKToKKyAgICAgICAgaWYgdGVuc29yIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IHRlbnNvci5TaGFwZUlzTm9uZSgpOgorICAgICAgICAgICAgaWYgbnAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLnNoYXBlID0gW10KKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSh0ZW5zb3IuU2hhcGVMZW5ndGgoKSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2hhcGUuYXBwZW5kKHRlbnNvci5TaGFwZShpKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5zaGFwZSA9IHRlbnNvci5TaGFwZUFzTnVtcHkoKQorICAgICAgICBzZWxmLnR5cGUgPSB0ZW5zb3IuVHlwZSgpCisgICAgICAgIHNlbGYuYnVmZmVyID0gdGVuc29yLkJ1ZmZlcigpCisgICAgICAgIHNlbGYubmFtZSA9IHRlbnNvci5OYW1lKCkKKyAgICAgICAgaWYgdGVuc29yLlF1YW50aXphdGlvbigpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5xdWFudGl6YXRpb24gPSBRdWFudGl6YXRpb25QYXJhbWV0ZXJzVC5Jbml0RnJvbU9iaih0ZW5zb3IuUXVhbnRpemF0aW9uKCkpCisgICAgICAgIHNlbGYuaXNWYXJpYWJsZSA9IHRlbnNvci5Jc1ZhcmlhYmxlKCkKKyAgICAgICAgaWYgdGVuc29yLlNwYXJzaXR5KCkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzZWxmLnNwYXJzaXR5ID0gU3BhcnNpdHlQYXJhbWV0ZXJzVC5Jbml0RnJvbU9iaih0ZW5zb3IuU3BhcnNpdHkoKSkKKyAgICAgICAgaWYgbm90IHRlbnNvci5TaGFwZVNpZ25hdHVyZUlzTm9uZSgpOgorICAgICAgICAgICAgaWYgbnAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLnNoYXBlU2lnbmF0dXJlID0gW10KKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSh0ZW5zb3IuU2hhcGVTaWduYXR1cmVMZW5ndGgoKSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2hhcGVTaWduYXR1cmUuYXBwZW5kKHRlbnNvci5TaGFwZVNpZ25hdHVyZShpKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5zaGFwZVNpZ25hdHVyZSA9IHRlbnNvci5TaGFwZVNpZ25hdHVyZUFzTnVtcHkoKQorICAgICAgICBzZWxmLmhhc1JhbmsgPSB0ZW5zb3IuSGFzUmFuaygpCisgICAgICAgIGlmIG5vdCB0ZW5zb3IuVmFyaWFudFRlbnNvcnNJc05vbmUoKToKKyAgICAgICAgICAgIHNlbGYudmFyaWFudFRlbnNvcnMgPSBbXQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UodGVuc29yLlZhcmlhbnRUZW5zb3JzTGVuZ3RoKCkpOgorICAgICAgICAgICAgICAgIGlmIHRlbnNvci5WYXJpYW50VGVuc29ycyhpKSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnZhcmlhbnRUZW5zb3JzLmFwcGVuZChOb25lKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHZhcmlhbnRTdWJUeXBlXyA9IFZhcmlhbnRTdWJUeXBlVC5Jbml0RnJvbU9iaih0ZW5zb3IuVmFyaWFudFRlbnNvcnMoaSkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYudmFyaWFudFRlbnNvcnMuYXBwZW5kKHZhcmlhbnRTdWJUeXBlXykKKworICAgICMgVGVuc29yVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBpZiBzZWxmLnNoYXBlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbnAgaXMgbm90IE5vbmUgYW5kIHR5cGUoc2VsZi5zaGFwZSkgaXMgbnAubmRhcnJheToKKyAgICAgICAgICAgICAgICBzaGFwZSA9IGJ1aWxkZXIuQ3JlYXRlTnVtcHlWZWN0b3Ioc2VsZi5zaGFwZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgVGVuc29yU3RhcnRTaGFwZVZlY3RvcihidWlsZGVyLCBsZW4oc2VsZi5zaGFwZSkpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYuc2hhcGUpKSk6CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZEludDMyKHNlbGYuc2hhcGVbaV0pCisgICAgICAgICAgICAgICAgc2hhcGUgPSBidWlsZGVyLkVuZFZlY3RvcigpCisgICAgICAgIGlmIHNlbGYubmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG5hbWUgPSBidWlsZGVyLkNyZWF0ZVN0cmluZyhzZWxmLm5hbWUpCisgICAgICAgIGlmIHNlbGYucXVhbnRpemF0aW9uIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcXVhbnRpemF0aW9uID0gc2VsZi5xdWFudGl6YXRpb24uUGFjayhidWlsZGVyKQorICAgICAgICBpZiBzZWxmLnNwYXJzaXR5IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc3BhcnNpdHkgPSBzZWxmLnNwYXJzaXR5LlBhY2soYnVpbGRlcikKKyAgICAgICAgaWYgc2VsZi5zaGFwZVNpZ25hdHVyZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG5wIGlzIG5vdCBOb25lIGFuZCB0eXBlKHNlbGYuc2hhcGVTaWduYXR1cmUpIGlzIG5wLm5kYXJyYXk6CisgICAgICAgICAgICAgICAgc2hhcGVTaWduYXR1cmUgPSBidWlsZGVyLkNyZWF0ZU51bXB5VmVjdG9yKHNlbGYuc2hhcGVTaWduYXR1cmUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIFRlbnNvclN0YXJ0U2hhcGVTaWduYXR1cmVWZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYuc2hhcGVTaWduYXR1cmUpKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLnNoYXBlU2lnbmF0dXJlKSkpOgorICAgICAgICAgICAgICAgICAgICBidWlsZGVyLlByZXBlbmRJbnQzMihzZWxmLnNoYXBlU2lnbmF0dXJlW2ldKQorICAgICAgICAgICAgICAgIHNoYXBlU2lnbmF0dXJlID0gYnVpbGRlci5FbmRWZWN0b3IoKQorICAgICAgICBpZiBzZWxmLnZhcmlhbnRUZW5zb3JzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgdmFyaWFudFRlbnNvcnNsaXN0ID0gW10KKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLnZhcmlhbnRUZW5zb3JzKSk6CisgICAgICAgICAgICAgICAgdmFyaWFudFRlbnNvcnNsaXN0LmFwcGVuZChzZWxmLnZhcmlhbnRUZW5zb3JzW2ldLlBhY2soYnVpbGRlcikpCisgICAgICAgICAgICBUZW5zb3JTdGFydFZhcmlhbnRUZW5zb3JzVmVjdG9yKGJ1aWxkZXIsIGxlbihzZWxmLnZhcmlhbnRUZW5zb3JzKSkKKyAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLnZhcmlhbnRUZW5zb3JzKSkpOgorICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmUodmFyaWFudFRlbnNvcnNsaXN0W2ldKQorICAgICAgICAgICAgdmFyaWFudFRlbnNvcnMgPSBidWlsZGVyLkVuZFZlY3RvcigpCisgICAgICAgIFRlbnNvclN0YXJ0KGJ1aWxkZXIpCisgICAgICAgIGlmIHNlbGYuc2hhcGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBUZW5zb3JBZGRTaGFwZShidWlsZGVyLCBzaGFwZSkKKyAgICAgICAgVGVuc29yQWRkVHlwZShidWlsZGVyLCBzZWxmLnR5cGUpCisgICAgICAgIFRlbnNvckFkZEJ1ZmZlcihidWlsZGVyLCBzZWxmLmJ1ZmZlcikKKyAgICAgICAgaWYgc2VsZi5uYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgVGVuc29yQWRkTmFtZShidWlsZGVyLCBuYW1lKQorICAgICAgICBpZiBzZWxmLnF1YW50aXphdGlvbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIFRlbnNvckFkZFF1YW50aXphdGlvbihidWlsZGVyLCBxdWFudGl6YXRpb24pCisgICAgICAgIFRlbnNvckFkZElzVmFyaWFibGUoYnVpbGRlciwgc2VsZi5pc1ZhcmlhYmxlKQorICAgICAgICBpZiBzZWxmLnNwYXJzaXR5IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgVGVuc29yQWRkU3BhcnNpdHkoYnVpbGRlciwgc3BhcnNpdHkpCisgICAgICAgIGlmIHNlbGYuc2hhcGVTaWduYXR1cmUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBUZW5zb3JBZGRTaGFwZVNpZ25hdHVyZShidWlsZGVyLCBzaGFwZVNpZ25hdHVyZSkKKyAgICAgICAgVGVuc29yQWRkSGFzUmFuayhidWlsZGVyLCBzZWxmLmhhc1JhbmspCisgICAgICAgIGlmIHNlbGYudmFyaWFudFRlbnNvcnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBUZW5zb3JBZGRWYXJpYW50VGVuc29ycyhidWlsZGVyLCB2YXJpYW50VGVuc29ycykKKyAgICAgICAgdGVuc29yID0gVGVuc29yRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiB0ZW5zb3IKKworCitjbGFzcyBTdGFibGVobG9HYXRoZXJPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gU3RhYmxlaGxvR2F0aGVyT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzU3RhYmxlaGxvR2F0aGVyT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFN0YWJsZWhsb0dhdGhlck9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFN0YWJsZWhsb0dhdGhlck9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCisgICAgIyBTdGFibGVobG9HYXRoZXJPcHRpb25zCisgICAgZGVmIE9mZnNldERpbXMoc2VsZiwgaik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIGEgPSBzZWxmLl90YWIuVmVjdG9yKG8pCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgYSArIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaiAqIDgpKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9HYXRoZXJPcHRpb25zCisgICAgZGVmIE9mZnNldERpbXNBc051bXB5KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldFZlY3RvckFzTnVtcHkoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDY0RmxhZ3MsIG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb0dhdGhlck9wdGlvbnMKKyAgICBkZWYgT2Zmc2V0RGltc0xlbmd0aChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvR2F0aGVyT3B0aW9ucworICAgIGRlZiBPZmZzZXREaW1zSXNOb25lKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICByZXR1cm4gbyA9PSAwCisKKyAgICAjIFN0YWJsZWhsb0dhdGhlck9wdGlvbnMKKyAgICBkZWYgQ29sbGFwc2VkU2xpY2VEaW1zKHNlbGYsIGopOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICBhID0gc2VsZi5fdGFiLlZlY3RvcihvKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDY0RmxhZ3MsIGEgKyBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGogKiA4KSkKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvR2F0aGVyT3B0aW9ucworICAgIGRlZiBDb2xsYXBzZWRTbGljZURpbXNBc051bXB5KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldFZlY3RvckFzTnVtcHkoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDY0RmxhZ3MsIG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb0dhdGhlck9wdGlvbnMKKyAgICBkZWYgQ29sbGFwc2VkU2xpY2VEaW1zTGVuZ3RoKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlZlY3RvckxlbihvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9HYXRoZXJPcHRpb25zCisgICAgZGVmIENvbGxhcHNlZFNsaWNlRGltc0lzTm9uZShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKKyAgICAgICAgcmV0dXJuIG8gPT0gMAorCisgICAgIyBTdGFibGVobG9HYXRoZXJPcHRpb25zCisgICAgZGVmIFN0YXJ0SW5kZXhNYXAoc2VsZiwgaik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIGEgPSBzZWxmLl90YWIuVmVjdG9yKG8pCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgYSArIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaiAqIDgpKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9HYXRoZXJPcHRpb25zCisgICAgZGVmIFN0YXJ0SW5kZXhNYXBBc051bXB5KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldFZlY3RvckFzTnVtcHkoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDY0RmxhZ3MsIG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb0dhdGhlck9wdGlvbnMKKyAgICBkZWYgU3RhcnRJbmRleE1hcExlbmd0aChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg4KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvR2F0aGVyT3B0aW9ucworICAgIGRlZiBTdGFydEluZGV4TWFwSXNOb25lKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQorICAgICAgICByZXR1cm4gbyA9PSAwCisKKyAgICAjIFN0YWJsZWhsb0dhdGhlck9wdGlvbnMKKyAgICBkZWYgSW5kZXhWZWN0b3JEaW0oc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTApKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb0dhdGhlck9wdGlvbnMKKyAgICBkZWYgU2xpY2VTaXplcyhzZWxmLCBqKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIGEgPSBzZWxmLl90YWIuVmVjdG9yKG8pCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgYSArIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaiAqIDgpKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9HYXRoZXJPcHRpb25zCisgICAgZGVmIFNsaWNlU2l6ZXNBc051bXB5KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEyKSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXRWZWN0b3JBc051bXB5KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ2NEZsYWdzLCBvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9HYXRoZXJPcHRpb25zCisgICAgZGVmIFNsaWNlU2l6ZXNMZW5ndGgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTIpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlZlY3RvckxlbihvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9HYXRoZXJPcHRpb25zCisgICAgZGVmIFNsaWNlU2l6ZXNJc05vbmUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTIpKQorICAgICAgICByZXR1cm4gbyA9PSAwCisKKyAgICAjIFN0YWJsZWhsb0dhdGhlck9wdGlvbnMKKyAgICBkZWYgSW5kaWNlc0FyZVNvcnRlZChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkJvb2xGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpKQorICAgICAgICByZXR1cm4gRmFsc2UKKworZGVmIFN0YWJsZWhsb0dhdGhlck9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDYpCisKK2RlZiBTdGFibGVobG9HYXRoZXJPcHRpb25zQWRkT2Zmc2V0RGltcyhidWlsZGVyLCBvZmZzZXREaW1zKToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgwLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKG9mZnNldERpbXMpLCAwKQorCitkZWYgU3RhYmxlaGxvR2F0aGVyT3B0aW9uc1N0YXJ0T2Zmc2V0RGltc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6CisgICAgcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoOCwgbnVtRWxlbXMsIDgpCisKK2RlZiBTdGFibGVobG9HYXRoZXJPcHRpb25zQWRkQ29sbGFwc2VkU2xpY2VEaW1zKGJ1aWxkZXIsIGNvbGxhcHNlZFNsaWNlRGltcyk6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMSwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShjb2xsYXBzZWRTbGljZURpbXMpLCAwKQorCitkZWYgU3RhYmxlaGxvR2F0aGVyT3B0aW9uc1N0YXJ0Q29sbGFwc2VkU2xpY2VEaW1zVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKKyAgICByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig4LCBudW1FbGVtcywgOCkKKworZGVmIFN0YWJsZWhsb0dhdGhlck9wdGlvbnNBZGRTdGFydEluZGV4TWFwKGJ1aWxkZXIsIHN0YXJ0SW5kZXhNYXApOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDIsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc3RhcnRJbmRleE1hcCksIDApCisKK2RlZiBTdGFibGVobG9HYXRoZXJPcHRpb25zU3RhcnRTdGFydEluZGV4TWFwVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKKyAgICByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig4LCBudW1FbGVtcywgOCkKKworZGVmIFN0YWJsZWhsb0dhdGhlck9wdGlvbnNBZGRJbmRleFZlY3RvckRpbShidWlsZGVyLCBpbmRleFZlY3RvckRpbSk6CisgICAgYnVpbGRlci5QcmVwZW5kSW50NjRTbG90KDMsIGluZGV4VmVjdG9yRGltLCAwKQorCitkZWYgU3RhYmxlaGxvR2F0aGVyT3B0aW9uc0FkZFNsaWNlU2l6ZXMoYnVpbGRlciwgc2xpY2VTaXplcyk6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoNCwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzbGljZVNpemVzKSwgMCkKKworZGVmIFN0YWJsZWhsb0dhdGhlck9wdGlvbnNTdGFydFNsaWNlU2l6ZXNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgorICAgIHJldHVybiBidWlsZGVyLlN0YXJ0VmVjdG9yKDgsIG51bUVsZW1zLCA4KQorCitkZWYgU3RhYmxlaGxvR2F0aGVyT3B0aW9uc0FkZEluZGljZXNBcmVTb3J0ZWQoYnVpbGRlciwgaW5kaWNlc0FyZVNvcnRlZCk6CisgICAgYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoNSwgaW5kaWNlc0FyZVNvcnRlZCwgMCkKKworZGVmIFN0YWJsZWhsb0dhdGhlck9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCit0cnk6CisgICAgZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QKK2V4Y2VwdDoKKyAgICBwYXNzCisKK2NsYXNzIFN0YWJsZWhsb0dhdGhlck9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIFN0YWJsZWhsb0dhdGhlck9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLm9mZnNldERpbXMgPSBOb25lICAjIHR5cGU6IExpc3RbaW50XQorICAgICAgICBzZWxmLmNvbGxhcHNlZFNsaWNlRGltcyA9IE5vbmUgICMgdHlwZTogTGlzdFtpbnRdCisgICAgICAgIHNlbGYuc3RhcnRJbmRleE1hcCA9IE5vbmUgICMgdHlwZTogTGlzdFtpbnRdCisgICAgICAgIHNlbGYuaW5kZXhWZWN0b3JEaW0gPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLnNsaWNlU2l6ZXMgPSBOb25lICAjIHR5cGU6IExpc3RbaW50XQorICAgICAgICBzZWxmLmluZGljZXNBcmVTb3J0ZWQgPSBGYWxzZSAgIyB0eXBlOiBib29sCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHN0YWJsZWhsb0dhdGhlck9wdGlvbnMgPSBTdGFibGVobG9HYXRoZXJPcHRpb25zKCkKKyAgICAgICAgc3RhYmxlaGxvR2F0aGVyT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHN0YWJsZWhsb0dhdGhlck9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzdGFibGVobG9HYXRoZXJPcHRpb25zKToKKyAgICAgICAgeCA9IFN0YWJsZWhsb0dhdGhlck9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHN0YWJsZWhsb0dhdGhlck9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFN0YWJsZWhsb0dhdGhlck9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgc3RhYmxlaGxvR2F0aGVyT3B0aW9ucyk6CisgICAgICAgIGlmIHN0YWJsZWhsb0dhdGhlck9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3Qgc3RhYmxlaGxvR2F0aGVyT3B0aW9ucy5PZmZzZXREaW1zSXNOb25lKCk6CisgICAgICAgICAgICBpZiBucCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYub2Zmc2V0RGltcyA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc3RhYmxlaGxvR2F0aGVyT3B0aW9ucy5PZmZzZXREaW1zTGVuZ3RoKCkpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLm9mZnNldERpbXMuYXBwZW5kKHN0YWJsZWhsb0dhdGhlck9wdGlvbnMuT2Zmc2V0RGltcyhpKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5vZmZzZXREaW1zID0gc3RhYmxlaGxvR2F0aGVyT3B0aW9ucy5PZmZzZXREaW1zQXNOdW1weSgpCisgICAgICAgIGlmIG5vdCBzdGFibGVobG9HYXRoZXJPcHRpb25zLkNvbGxhcHNlZFNsaWNlRGltc0lzTm9uZSgpOgorICAgICAgICAgICAgaWYgbnAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLmNvbGxhcHNlZFNsaWNlRGltcyA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc3RhYmxlaGxvR2F0aGVyT3B0aW9ucy5Db2xsYXBzZWRTbGljZURpbXNMZW5ndGgoKSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29sbGFwc2VkU2xpY2VEaW1zLmFwcGVuZChzdGFibGVobG9HYXRoZXJPcHRpb25zLkNvbGxhcHNlZFNsaWNlRGltcyhpKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5jb2xsYXBzZWRTbGljZURpbXMgPSBzdGFibGVobG9HYXRoZXJPcHRpb25zLkNvbGxhcHNlZFNsaWNlRGltc0FzTnVtcHkoKQorICAgICAgICBpZiBub3Qgc3RhYmxlaGxvR2F0aGVyT3B0aW9ucy5TdGFydEluZGV4TWFwSXNOb25lKCk6CisgICAgICAgICAgICBpZiBucCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuc3RhcnRJbmRleE1hcCA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc3RhYmxlaGxvR2F0aGVyT3B0aW9ucy5TdGFydEluZGV4TWFwTGVuZ3RoKCkpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0SW5kZXhNYXAuYXBwZW5kKHN0YWJsZWhsb0dhdGhlck9wdGlvbnMuU3RhcnRJbmRleE1hcChpKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5zdGFydEluZGV4TWFwID0gc3RhYmxlaGxvR2F0aGVyT3B0aW9ucy5TdGFydEluZGV4TWFwQXNOdW1weSgpCisgICAgICAgIHNlbGYuaW5kZXhWZWN0b3JEaW0gPSBzdGFibGVobG9HYXRoZXJPcHRpb25zLkluZGV4VmVjdG9yRGltKCkKKyAgICAgICAgaWYgbm90IHN0YWJsZWhsb0dhdGhlck9wdGlvbnMuU2xpY2VTaXplc0lzTm9uZSgpOgorICAgICAgICAgICAgaWYgbnAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLnNsaWNlU2l6ZXMgPSBbXQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHN0YWJsZWhsb0dhdGhlck9wdGlvbnMuU2xpY2VTaXplc0xlbmd0aCgpKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zbGljZVNpemVzLmFwcGVuZChzdGFibGVobG9HYXRoZXJPcHRpb25zLlNsaWNlU2l6ZXMoaSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuc2xpY2VTaXplcyA9IHN0YWJsZWhsb0dhdGhlck9wdGlvbnMuU2xpY2VTaXplc0FzTnVtcHkoKQorICAgICAgICBzZWxmLmluZGljZXNBcmVTb3J0ZWQgPSBzdGFibGVobG9HYXRoZXJPcHRpb25zLkluZGljZXNBcmVTb3J0ZWQoKQorCisgICAgIyBTdGFibGVobG9HYXRoZXJPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBpZiBzZWxmLm9mZnNldERpbXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBucCBpcyBub3QgTm9uZSBhbmQgdHlwZShzZWxmLm9mZnNldERpbXMpIGlzIG5wLm5kYXJyYXk6CisgICAgICAgICAgICAgICAgb2Zmc2V0RGltcyA9IGJ1aWxkZXIuQ3JlYXRlTnVtcHlWZWN0b3Ioc2VsZi5vZmZzZXREaW1zKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBTdGFibGVobG9HYXRoZXJPcHRpb25zU3RhcnRPZmZzZXREaW1zVmVjdG9yKGJ1aWxkZXIsIGxlbihzZWxmLm9mZnNldERpbXMpKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLm9mZnNldERpbXMpKSk6CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZEludDY0KHNlbGYub2Zmc2V0RGltc1tpXSkKKyAgICAgICAgICAgICAgICBvZmZzZXREaW1zID0gYnVpbGRlci5FbmRWZWN0b3IoKQorICAgICAgICBpZiBzZWxmLmNvbGxhcHNlZFNsaWNlRGltcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG5wIGlzIG5vdCBOb25lIGFuZCB0eXBlKHNlbGYuY29sbGFwc2VkU2xpY2VEaW1zKSBpcyBucC5uZGFycmF5OgorICAgICAgICAgICAgICAgIGNvbGxhcHNlZFNsaWNlRGltcyA9IGJ1aWxkZXIuQ3JlYXRlTnVtcHlWZWN0b3Ioc2VsZi5jb2xsYXBzZWRTbGljZURpbXMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIFN0YWJsZWhsb0dhdGhlck9wdGlvbnNTdGFydENvbGxhcHNlZFNsaWNlRGltc1ZlY3RvcihidWlsZGVyLCBsZW4oc2VsZi5jb2xsYXBzZWRTbGljZURpbXMpKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLmNvbGxhcHNlZFNsaWNlRGltcykpKToKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5QcmVwZW5kSW50NjQoc2VsZi5jb2xsYXBzZWRTbGljZURpbXNbaV0pCisgICAgICAgICAgICAgICAgY29sbGFwc2VkU2xpY2VEaW1zID0gYnVpbGRlci5FbmRWZWN0b3IoKQorICAgICAgICBpZiBzZWxmLnN0YXJ0SW5kZXhNYXAgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBucCBpcyBub3QgTm9uZSBhbmQgdHlwZShzZWxmLnN0YXJ0SW5kZXhNYXApIGlzIG5wLm5kYXJyYXk6CisgICAgICAgICAgICAgICAgc3RhcnRJbmRleE1hcCA9IGJ1aWxkZXIuQ3JlYXRlTnVtcHlWZWN0b3Ioc2VsZi5zdGFydEluZGV4TWFwKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBTdGFibGVobG9HYXRoZXJPcHRpb25zU3RhcnRTdGFydEluZGV4TWFwVmVjdG9yKGJ1aWxkZXIsIGxlbihzZWxmLnN0YXJ0SW5kZXhNYXApKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLnN0YXJ0SW5kZXhNYXApKSk6CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZEludDY0KHNlbGYuc3RhcnRJbmRleE1hcFtpXSkKKyAgICAgICAgICAgICAgICBzdGFydEluZGV4TWFwID0gYnVpbGRlci5FbmRWZWN0b3IoKQorICAgICAgICBpZiBzZWxmLnNsaWNlU2l6ZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBucCBpcyBub3QgTm9uZSBhbmQgdHlwZShzZWxmLnNsaWNlU2l6ZXMpIGlzIG5wLm5kYXJyYXk6CisgICAgICAgICAgICAgICAgc2xpY2VTaXplcyA9IGJ1aWxkZXIuQ3JlYXRlTnVtcHlWZWN0b3Ioc2VsZi5zbGljZVNpemVzKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBTdGFibGVobG9HYXRoZXJPcHRpb25zU3RhcnRTbGljZVNpemVzVmVjdG9yKGJ1aWxkZXIsIGxlbihzZWxmLnNsaWNlU2l6ZXMpKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLnNsaWNlU2l6ZXMpKSk6CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZEludDY0KHNlbGYuc2xpY2VTaXplc1tpXSkKKyAgICAgICAgICAgICAgICBzbGljZVNpemVzID0gYnVpbGRlci5FbmRWZWN0b3IoKQorICAgICAgICBTdGFibGVobG9HYXRoZXJPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgaWYgc2VsZi5vZmZzZXREaW1zIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgU3RhYmxlaGxvR2F0aGVyT3B0aW9uc0FkZE9mZnNldERpbXMoYnVpbGRlciwgb2Zmc2V0RGltcykKKyAgICAgICAgaWYgc2VsZi5jb2xsYXBzZWRTbGljZURpbXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBTdGFibGVobG9HYXRoZXJPcHRpb25zQWRkQ29sbGFwc2VkU2xpY2VEaW1zKGJ1aWxkZXIsIGNvbGxhcHNlZFNsaWNlRGltcykKKyAgICAgICAgaWYgc2VsZi5zdGFydEluZGV4TWFwIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgU3RhYmxlaGxvR2F0aGVyT3B0aW9uc0FkZFN0YXJ0SW5kZXhNYXAoYnVpbGRlciwgc3RhcnRJbmRleE1hcCkKKyAgICAgICAgU3RhYmxlaGxvR2F0aGVyT3B0aW9uc0FkZEluZGV4VmVjdG9yRGltKGJ1aWxkZXIsIHNlbGYuaW5kZXhWZWN0b3JEaW0pCisgICAgICAgIGlmIHNlbGYuc2xpY2VTaXplcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIFN0YWJsZWhsb0dhdGhlck9wdGlvbnNBZGRTbGljZVNpemVzKGJ1aWxkZXIsIHNsaWNlU2l6ZXMpCisgICAgICAgIFN0YWJsZWhsb0dhdGhlck9wdGlvbnNBZGRJbmRpY2VzQXJlU29ydGVkKGJ1aWxkZXIsIHNlbGYuaW5kaWNlc0FyZVNvcnRlZCkKKyAgICAgICAgc3RhYmxlaGxvR2F0aGVyT3B0aW9ucyA9IFN0YWJsZWhsb0dhdGhlck9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHN0YWJsZWhsb0dhdGhlck9wdGlvbnMKKworCitjbGFzcyBTdGFibGVobG9UcmFuc3Bvc2VPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gU3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzU3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCisgICAgIyBTdGFibGVobG9UcmFuc3Bvc2VPcHRpb25zCisgICAgZGVmIFBlcm11dGF0aW9uKHNlbGYsIGopOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICBhID0gc2VsZi5fdGFiLlZlY3RvcihvKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDY0RmxhZ3MsIGEgKyBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGogKiA4KSkKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9ucworICAgIGRlZiBQZXJtdXRhdGlvbkFzTnVtcHkoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0VmVjdG9yQXNOdW1weShmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgbykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9ucworICAgIGRlZiBQZXJtdXRhdGlvbkxlbmd0aChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9ucworICAgIGRlZiBQZXJtdXRhdGlvbklzTm9uZShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgcmV0dXJuIG8gPT0gMAorCitkZWYgU3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMSkKKworZGVmIFN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnNBZGRQZXJtdXRhdGlvbihidWlsZGVyLCBwZXJtdXRhdGlvbik6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMCwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShwZXJtdXRhdGlvbiksIDApCisKK2RlZiBTdGFibGVobG9UcmFuc3Bvc2VPcHRpb25zU3RhcnRQZXJtdXRhdGlvblZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6CisgICAgcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoOCwgbnVtRWxlbXMsIDgpCisKK2RlZiBTdGFibGVobG9UcmFuc3Bvc2VPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKwordHJ5OgorICAgIGZyb20gdHlwaW5nIGltcG9ydCBMaXN0CitleGNlcHQ6CisgICAgcGFzcworCitjbGFzcyBTdGFibGVobG9UcmFuc3Bvc2VPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBTdGFibGVobG9UcmFuc3Bvc2VPcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5wZXJtdXRhdGlvbiA9IE5vbmUgICMgdHlwZTogTGlzdFtpbnRdCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnMgPSBTdGFibGVobG9UcmFuc3Bvc2VPcHRpb25zKCkKKyAgICAgICAgc3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzdGFibGVobG9UcmFuc3Bvc2VPcHRpb25zKToKKyAgICAgICAgeCA9IFN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgc3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9ucyk6CisgICAgICAgIGlmIHN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3Qgc3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9ucy5QZXJtdXRhdGlvbklzTm9uZSgpOgorICAgICAgICAgICAgaWYgbnAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLnBlcm11dGF0aW9uID0gW10KKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShzdGFibGVobG9UcmFuc3Bvc2VPcHRpb25zLlBlcm11dGF0aW9uTGVuZ3RoKCkpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnBlcm11dGF0aW9uLmFwcGVuZChzdGFibGVobG9UcmFuc3Bvc2VPcHRpb25zLlBlcm11dGF0aW9uKGkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnBlcm11dGF0aW9uID0gc3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9ucy5QZXJtdXRhdGlvbkFzTnVtcHkoKQorCisgICAgIyBTdGFibGVobG9UcmFuc3Bvc2VPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBpZiBzZWxmLnBlcm11dGF0aW9uIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbnAgaXMgbm90IE5vbmUgYW5kIHR5cGUoc2VsZi5wZXJtdXRhdGlvbikgaXMgbnAubmRhcnJheToKKyAgICAgICAgICAgICAgICBwZXJtdXRhdGlvbiA9IGJ1aWxkZXIuQ3JlYXRlTnVtcHlWZWN0b3Ioc2VsZi5wZXJtdXRhdGlvbikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgU3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9uc1N0YXJ0UGVybXV0YXRpb25WZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYucGVybXV0YXRpb24pKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLnBlcm11dGF0aW9uKSkpOgorICAgICAgICAgICAgICAgICAgICBidWlsZGVyLlByZXBlbmRJbnQ2NChzZWxmLnBlcm11dGF0aW9uW2ldKQorICAgICAgICAgICAgICAgIHBlcm11dGF0aW9uID0gYnVpbGRlci5FbmRWZWN0b3IoKQorICAgICAgICBTdGFibGVobG9UcmFuc3Bvc2VPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgaWYgc2VsZi5wZXJtdXRhdGlvbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIFN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnNBZGRQZXJtdXRhdGlvbihidWlsZGVyLCBwZXJtdXRhdGlvbikKKyAgICAgICAgc3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9ucyA9IFN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnMKKworCitjbGFzcyBTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKKyAgICAjIFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zCisgICAgZGVmIExoc0JhdGNoaW5nRGltZW5zaW9ucyhzZWxmLCBqKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgYSA9IHNlbGYuX3RhYi5WZWN0b3IobykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ2NEZsYWdzLCBhICsgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShqICogOCkpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zCisgICAgZGVmIExoc0JhdGNoaW5nRGltZW5zaW9uc0FzTnVtcHkoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0VmVjdG9yQXNOdW1weShmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgbykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnMKKyAgICBkZWYgTGhzQmF0Y2hpbmdEaW1lbnNpb25zTGVuZ3RoKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlZlY3RvckxlbihvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9ucworICAgIGRlZiBMaHNCYXRjaGluZ0RpbWVuc2lvbnNJc05vbmUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIHJldHVybiBvID09IDAKKworICAgICMgU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnMKKyAgICBkZWYgUmhzQmF0Y2hpbmdEaW1lbnNpb25zKHNlbGYsIGopOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICBhID0gc2VsZi5fdGFiLlZlY3RvcihvKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDY0RmxhZ3MsIGEgKyBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGogKiA4KSkKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnMKKyAgICBkZWYgUmhzQmF0Y2hpbmdEaW1lbnNpb25zQXNOdW1weShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXRWZWN0b3JBc051bXB5KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ2NEZsYWdzLCBvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9ucworICAgIGRlZiBSaHNCYXRjaGluZ0RpbWVuc2lvbnNMZW5ndGgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuVmVjdG9yTGVuKG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zCisgICAgZGVmIFJoc0JhdGNoaW5nRGltZW5zaW9uc0lzTm9uZShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKKyAgICAgICAgcmV0dXJuIG8gPT0gMAorCisgICAgIyBTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9ucworICAgIGRlZiBMaHNDb250cmFjdGluZ0RpbWVuc2lvbnMoc2VsZiwgaik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIGEgPSBzZWxmLl90YWIuVmVjdG9yKG8pCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgYSArIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaiAqIDgpKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9ucworICAgIGRlZiBMaHNDb250cmFjdGluZ0RpbWVuc2lvbnNBc051bXB5KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldFZlY3RvckFzTnVtcHkoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDY0RmxhZ3MsIG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zCisgICAgZGVmIExoc0NvbnRyYWN0aW5nRGltZW5zaW9uc0xlbmd0aChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg4KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnMKKyAgICBkZWYgTGhzQ29udHJhY3RpbmdEaW1lbnNpb25zSXNOb25lKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQorICAgICAgICByZXR1cm4gbyA9PSAwCisKKyAgICAjIFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zCisgICAgZGVmIFJoc0NvbnRyYWN0aW5nRGltZW5zaW9ucyhzZWxmLCBqKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIGEgPSBzZWxmLl90YWIuVmVjdG9yKG8pCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgYSArIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaiAqIDgpKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9ucworICAgIGRlZiBSaHNDb250cmFjdGluZ0RpbWVuc2lvbnNBc051bXB5KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEwKSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXRWZWN0b3JBc051bXB5KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ2NEZsYWdzLCBvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9ucworICAgIGRlZiBSaHNDb250cmFjdGluZ0RpbWVuc2lvbnNMZW5ndGgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTApKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlZlY3RvckxlbihvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9ucworICAgIGRlZiBSaHNDb250cmFjdGluZ0RpbWVuc2lvbnNJc05vbmUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTApKQorICAgICAgICByZXR1cm4gbyA9PSAwCisKKyAgICAjIFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zCisgICAgZGVmIFByZWNpc2lvbkNvbmZpZyhzZWxmLCBqKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIGEgPSBzZWxmLl90YWIuVmVjdG9yKG8pCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVWludDMyRmxhZ3MsIGEgKyBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGogKiA0KSkKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnMKKyAgICBkZWYgUHJlY2lzaW9uQ29uZmlnQXNOdW1weShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0VmVjdG9yQXNOdW1weShmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVWludDMyRmxhZ3MsIG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zCisgICAgZGVmIFByZWNpc2lvbkNvbmZpZ0xlbmd0aChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuVmVjdG9yTGVuKG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zCisgICAgZGVmIFByZWNpc2lvbkNvbmZpZ0lzTm9uZShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMikpCisgICAgICAgIHJldHVybiBvID09IDAKKworZGVmIFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCg1KQorCitkZWYgU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnNBZGRMaHNCYXRjaGluZ0RpbWVuc2lvbnMoYnVpbGRlciwgbGhzQmF0Y2hpbmdEaW1lbnNpb25zKToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgwLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGxoc0JhdGNoaW5nRGltZW5zaW9ucyksIDApCisKK2RlZiBTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9uc1N0YXJ0TGhzQmF0Y2hpbmdEaW1lbnNpb25zVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKKyAgICByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig4LCBudW1FbGVtcywgOCkKKworZGVmIFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zQWRkUmhzQmF0Y2hpbmdEaW1lbnNpb25zKGJ1aWxkZXIsIHJoc0JhdGNoaW5nRGltZW5zaW9ucyk6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMSwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShyaHNCYXRjaGluZ0RpbWVuc2lvbnMpLCAwKQorCitkZWYgU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnNTdGFydFJoc0JhdGNoaW5nRGltZW5zaW9uc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6CisgICAgcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoOCwgbnVtRWxlbXMsIDgpCisKK2RlZiBTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9uc0FkZExoc0NvbnRyYWN0aW5nRGltZW5zaW9ucyhidWlsZGVyLCBsaHNDb250cmFjdGluZ0RpbWVuc2lvbnMpOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDIsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUobGhzQ29udHJhY3RpbmdEaW1lbnNpb25zKSwgMCkKKworZGVmIFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zU3RhcnRMaHNDb250cmFjdGluZ0RpbWVuc2lvbnNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgorICAgIHJldHVybiBidWlsZGVyLlN0YXJ0VmVjdG9yKDgsIG51bUVsZW1zLCA4KQorCitkZWYgU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnNBZGRSaHNDb250cmFjdGluZ0RpbWVuc2lvbnMoYnVpbGRlciwgcmhzQ29udHJhY3RpbmdEaW1lbnNpb25zKToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgzLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHJoc0NvbnRyYWN0aW5nRGltZW5zaW9ucyksIDApCisKK2RlZiBTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9uc1N0YXJ0UmhzQ29udHJhY3RpbmdEaW1lbnNpb25zVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKKyAgICByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig4LCBudW1FbGVtcywgOCkKKworZGVmIFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zQWRkUHJlY2lzaW9uQ29uZmlnKGJ1aWxkZXIsIHByZWNpc2lvbkNvbmZpZyk6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoNCwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShwcmVjaXNpb25Db25maWcpLCAwKQorCitkZWYgU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnNTdGFydFByZWNpc2lvbkNvbmZpZ1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6CisgICAgcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpCisKK2RlZiBTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKK3RyeToKKyAgICBmcm9tIHR5cGluZyBpbXBvcnQgTGlzdAorZXhjZXB0OgorICAgIHBhc3MKKworY2xhc3MgU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5saHNCYXRjaGluZ0RpbWVuc2lvbnMgPSBOb25lICAjIHR5cGU6IExpc3RbaW50XQorICAgICAgICBzZWxmLnJoc0JhdGNoaW5nRGltZW5zaW9ucyA9IE5vbmUgICMgdHlwZTogTGlzdFtpbnRdCisgICAgICAgIHNlbGYubGhzQ29udHJhY3RpbmdEaW1lbnNpb25zID0gTm9uZSAgIyB0eXBlOiBMaXN0W2ludF0KKyAgICAgICAgc2VsZi5yaHNDb250cmFjdGluZ0RpbWVuc2lvbnMgPSBOb25lICAjIHR5cGU6IExpc3RbaW50XQorICAgICAgICBzZWxmLnByZWNpc2lvbkNvbmZpZyA9IE5vbmUgICMgdHlwZTogTGlzdFtpbnRdCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zID0gU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnMoKQorICAgICAgICBzdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgc3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnMpOgorICAgICAgICB4ID0gU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBzdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9ucyk6CisgICAgICAgIGlmIHN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IHN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zLkxoc0JhdGNoaW5nRGltZW5zaW9uc0lzTm9uZSgpOgorICAgICAgICAgICAgaWYgbnAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLmxoc0JhdGNoaW5nRGltZW5zaW9ucyA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnMuTGhzQmF0Y2hpbmdEaW1lbnNpb25zTGVuZ3RoKCkpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmxoc0JhdGNoaW5nRGltZW5zaW9ucy5hcHBlbmQoc3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnMuTGhzQmF0Y2hpbmdEaW1lbnNpb25zKGkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmxoc0JhdGNoaW5nRGltZW5zaW9ucyA9IHN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zLkxoc0JhdGNoaW5nRGltZW5zaW9uc0FzTnVtcHkoKQorICAgICAgICBpZiBub3Qgc3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnMuUmhzQmF0Y2hpbmdEaW1lbnNpb25zSXNOb25lKCk6CisgICAgICAgICAgICBpZiBucCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYucmhzQmF0Y2hpbmdEaW1lbnNpb25zID0gW10KKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShzdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9ucy5SaHNCYXRjaGluZ0RpbWVuc2lvbnNMZW5ndGgoKSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucmhzQmF0Y2hpbmdEaW1lbnNpb25zLmFwcGVuZChzdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9ucy5SaHNCYXRjaGluZ0RpbWVuc2lvbnMoaSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYucmhzQmF0Y2hpbmdEaW1lbnNpb25zID0gc3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnMuUmhzQmF0Y2hpbmdEaW1lbnNpb25zQXNOdW1weSgpCisgICAgICAgIGlmIG5vdCBzdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9ucy5MaHNDb250cmFjdGluZ0RpbWVuc2lvbnNJc05vbmUoKToKKyAgICAgICAgICAgIGlmIG5wIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5saHNDb250cmFjdGluZ0RpbWVuc2lvbnMgPSBbXQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zLkxoc0NvbnRyYWN0aW5nRGltZW5zaW9uc0xlbmd0aCgpKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5saHNDb250cmFjdGluZ0RpbWVuc2lvbnMuYXBwZW5kKHN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zLkxoc0NvbnRyYWN0aW5nRGltZW5zaW9ucyhpKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5saHNDb250cmFjdGluZ0RpbWVuc2lvbnMgPSBzdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9ucy5MaHNDb250cmFjdGluZ0RpbWVuc2lvbnNBc051bXB5KCkKKyAgICAgICAgaWYgbm90IHN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zLlJoc0NvbnRyYWN0aW5nRGltZW5zaW9uc0lzTm9uZSgpOgorICAgICAgICAgICAgaWYgbnAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLnJoc0NvbnRyYWN0aW5nRGltZW5zaW9ucyA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnMuUmhzQ29udHJhY3RpbmdEaW1lbnNpb25zTGVuZ3RoKCkpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnJoc0NvbnRyYWN0aW5nRGltZW5zaW9ucy5hcHBlbmQoc3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnMuUmhzQ29udHJhY3RpbmdEaW1lbnNpb25zKGkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnJoc0NvbnRyYWN0aW5nRGltZW5zaW9ucyA9IHN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zLlJoc0NvbnRyYWN0aW5nRGltZW5zaW9uc0FzTnVtcHkoKQorICAgICAgICBpZiBub3Qgc3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnMuUHJlY2lzaW9uQ29uZmlnSXNOb25lKCk6CisgICAgICAgICAgICBpZiBucCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYucHJlY2lzaW9uQ29uZmlnID0gW10KKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShzdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9ucy5QcmVjaXNpb25Db25maWdMZW5ndGgoKSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucHJlY2lzaW9uQ29uZmlnLmFwcGVuZChzdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9ucy5QcmVjaXNpb25Db25maWcoaSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYucHJlY2lzaW9uQ29uZmlnID0gc3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnMuUHJlY2lzaW9uQ29uZmlnQXNOdW1weSgpCisKKyAgICAjIFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBpZiBzZWxmLmxoc0JhdGNoaW5nRGltZW5zaW9ucyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG5wIGlzIG5vdCBOb25lIGFuZCB0eXBlKHNlbGYubGhzQmF0Y2hpbmdEaW1lbnNpb25zKSBpcyBucC5uZGFycmF5OgorICAgICAgICAgICAgICAgIGxoc0JhdGNoaW5nRGltZW5zaW9ucyA9IGJ1aWxkZXIuQ3JlYXRlTnVtcHlWZWN0b3Ioc2VsZi5saHNCYXRjaGluZ0RpbWVuc2lvbnMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zU3RhcnRMaHNCYXRjaGluZ0RpbWVuc2lvbnNWZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYubGhzQmF0Y2hpbmdEaW1lbnNpb25zKSkKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShsZW4oc2VsZi5saHNCYXRjaGluZ0RpbWVuc2lvbnMpKSk6CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZEludDY0KHNlbGYubGhzQmF0Y2hpbmdEaW1lbnNpb25zW2ldKQorICAgICAgICAgICAgICAgIGxoc0JhdGNoaW5nRGltZW5zaW9ucyA9IGJ1aWxkZXIuRW5kVmVjdG9yKCkKKyAgICAgICAgaWYgc2VsZi5yaHNCYXRjaGluZ0RpbWVuc2lvbnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBucCBpcyBub3QgTm9uZSBhbmQgdHlwZShzZWxmLnJoc0JhdGNoaW5nRGltZW5zaW9ucykgaXMgbnAubmRhcnJheToKKyAgICAgICAgICAgICAgICByaHNCYXRjaGluZ0RpbWVuc2lvbnMgPSBidWlsZGVyLkNyZWF0ZU51bXB5VmVjdG9yKHNlbGYucmhzQmF0Y2hpbmdEaW1lbnNpb25zKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9uc1N0YXJ0UmhzQmF0Y2hpbmdEaW1lbnNpb25zVmVjdG9yKGJ1aWxkZXIsIGxlbihzZWxmLnJoc0JhdGNoaW5nRGltZW5zaW9ucykpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYucmhzQmF0Y2hpbmdEaW1lbnNpb25zKSkpOgorICAgICAgICAgICAgICAgICAgICBidWlsZGVyLlByZXBlbmRJbnQ2NChzZWxmLnJoc0JhdGNoaW5nRGltZW5zaW9uc1tpXSkKKyAgICAgICAgICAgICAgICByaHNCYXRjaGluZ0RpbWVuc2lvbnMgPSBidWlsZGVyLkVuZFZlY3RvcigpCisgICAgICAgIGlmIHNlbGYubGhzQ29udHJhY3RpbmdEaW1lbnNpb25zIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbnAgaXMgbm90IE5vbmUgYW5kIHR5cGUoc2VsZi5saHNDb250cmFjdGluZ0RpbWVuc2lvbnMpIGlzIG5wLm5kYXJyYXk6CisgICAgICAgICAgICAgICAgbGhzQ29udHJhY3RpbmdEaW1lbnNpb25zID0gYnVpbGRlci5DcmVhdGVOdW1weVZlY3RvcihzZWxmLmxoc0NvbnRyYWN0aW5nRGltZW5zaW9ucykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnNTdGFydExoc0NvbnRyYWN0aW5nRGltZW5zaW9uc1ZlY3RvcihidWlsZGVyLCBsZW4oc2VsZi5saHNDb250cmFjdGluZ0RpbWVuc2lvbnMpKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLmxoc0NvbnRyYWN0aW5nRGltZW5zaW9ucykpKToKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5QcmVwZW5kSW50NjQoc2VsZi5saHNDb250cmFjdGluZ0RpbWVuc2lvbnNbaV0pCisgICAgICAgICAgICAgICAgbGhzQ29udHJhY3RpbmdEaW1lbnNpb25zID0gYnVpbGRlci5FbmRWZWN0b3IoKQorICAgICAgICBpZiBzZWxmLnJoc0NvbnRyYWN0aW5nRGltZW5zaW9ucyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG5wIGlzIG5vdCBOb25lIGFuZCB0eXBlKHNlbGYucmhzQ29udHJhY3RpbmdEaW1lbnNpb25zKSBpcyBucC5uZGFycmF5OgorICAgICAgICAgICAgICAgIHJoc0NvbnRyYWN0aW5nRGltZW5zaW9ucyA9IGJ1aWxkZXIuQ3JlYXRlTnVtcHlWZWN0b3Ioc2VsZi5yaHNDb250cmFjdGluZ0RpbWVuc2lvbnMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zU3RhcnRSaHNDb250cmFjdGluZ0RpbWVuc2lvbnNWZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYucmhzQ29udHJhY3RpbmdEaW1lbnNpb25zKSkKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShsZW4oc2VsZi5yaHNDb250cmFjdGluZ0RpbWVuc2lvbnMpKSk6CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZEludDY0KHNlbGYucmhzQ29udHJhY3RpbmdEaW1lbnNpb25zW2ldKQorICAgICAgICAgICAgICAgIHJoc0NvbnRyYWN0aW5nRGltZW5zaW9ucyA9IGJ1aWxkZXIuRW5kVmVjdG9yKCkKKyAgICAgICAgaWYgc2VsZi5wcmVjaXNpb25Db25maWcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBucCBpcyBub3QgTm9uZSBhbmQgdHlwZShzZWxmLnByZWNpc2lvbkNvbmZpZykgaXMgbnAubmRhcnJheToKKyAgICAgICAgICAgICAgICBwcmVjaXNpb25Db25maWcgPSBidWlsZGVyLkNyZWF0ZU51bXB5VmVjdG9yKHNlbGYucHJlY2lzaW9uQ29uZmlnKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9uc1N0YXJ0UHJlY2lzaW9uQ29uZmlnVmVjdG9yKGJ1aWxkZXIsIGxlbihzZWxmLnByZWNpc2lvbkNvbmZpZykpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYucHJlY2lzaW9uQ29uZmlnKSkpOgorICAgICAgICAgICAgICAgICAgICBidWlsZGVyLlByZXBlbmRVaW50MzIoc2VsZi5wcmVjaXNpb25Db25maWdbaV0pCisgICAgICAgICAgICAgICAgcHJlY2lzaW9uQ29uZmlnID0gYnVpbGRlci5FbmRWZWN0b3IoKQorICAgICAgICBTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIGlmIHNlbGYubGhzQmF0Y2hpbmdEaW1lbnNpb25zIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnNBZGRMaHNCYXRjaGluZ0RpbWVuc2lvbnMoYnVpbGRlciwgbGhzQmF0Y2hpbmdEaW1lbnNpb25zKQorICAgICAgICBpZiBzZWxmLnJoc0JhdGNoaW5nRGltZW5zaW9ucyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zQWRkUmhzQmF0Y2hpbmdEaW1lbnNpb25zKGJ1aWxkZXIsIHJoc0JhdGNoaW5nRGltZW5zaW9ucykKKyAgICAgICAgaWYgc2VsZi5saHNDb250cmFjdGluZ0RpbWVuc2lvbnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9uc0FkZExoc0NvbnRyYWN0aW5nRGltZW5zaW9ucyhidWlsZGVyLCBsaHNDb250cmFjdGluZ0RpbWVuc2lvbnMpCisgICAgICAgIGlmIHNlbGYucmhzQ29udHJhY3RpbmdEaW1lbnNpb25zIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnNBZGRSaHNDb250cmFjdGluZ0RpbWVuc2lvbnMoYnVpbGRlciwgcmhzQ29udHJhY3RpbmdEaW1lbnNpb25zKQorICAgICAgICBpZiBzZWxmLnByZWNpc2lvbkNvbmZpZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zQWRkUHJlY2lzaW9uQ29uZmlnKGJ1aWxkZXIsIHByZWNpc2lvbkNvbmZpZykKKyAgICAgICAgc3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnMgPSBTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gc3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnMKKworCitjbGFzcyBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCisgICAgIyBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zCisgICAgZGVmIFdpbmRvd0RpbWVuc2lvbnMoc2VsZiwgaik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIGEgPSBzZWxmLl90YWIuVmVjdG9yKG8pCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgYSArIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaiAqIDgpKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zCisgICAgZGVmIFdpbmRvd0RpbWVuc2lvbnNBc051bXB5KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldFZlY3RvckFzTnVtcHkoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDY0RmxhZ3MsIG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMKKyAgICBkZWYgV2luZG93RGltZW5zaW9uc0xlbmd0aChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9ucworICAgIGRlZiBXaW5kb3dEaW1lbnNpb25zSXNOb25lKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICByZXR1cm4gbyA9PSAwCisKKyAgICAjIFN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMKKyAgICBkZWYgV2luZG93U3RyaWRlcyhzZWxmLCBqKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgYSA9IHNlbGYuX3RhYi5WZWN0b3IobykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ2NEZsYWdzLCBhICsgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShqICogOCkpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMKKyAgICBkZWYgV2luZG93U3RyaWRlc0FzTnVtcHkoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0VmVjdG9yQXNOdW1weShmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgbykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9ucworICAgIGRlZiBXaW5kb3dTdHJpZGVzTGVuZ3RoKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlZlY3RvckxlbihvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zCisgICAgZGVmIFdpbmRvd1N0cmlkZXNJc05vbmUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIHJldHVybiBvID09IDAKKworICAgICMgU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9ucworICAgIGRlZiBCYXNlRGlsYXRpb25zKHNlbGYsIGopOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICBhID0gc2VsZi5fdGFiLlZlY3RvcihvKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDY0RmxhZ3MsIGEgKyBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGogKiA4KSkKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9ucworICAgIGRlZiBCYXNlRGlsYXRpb25zQXNOdW1weShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg4KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXRWZWN0b3JBc051bXB5KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ2NEZsYWdzLCBvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zCisgICAgZGVmIEJhc2VEaWxhdGlvbnNMZW5ndGgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuVmVjdG9yTGVuKG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMKKyAgICBkZWYgQmFzZURpbGF0aW9uc0lzTm9uZShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg4KSkKKyAgICAgICAgcmV0dXJuIG8gPT0gMAorCisgICAgIyBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zCisgICAgZGVmIFdpbmRvd0RpbGF0aW9ucyhzZWxmLCBqKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIGEgPSBzZWxmLl90YWIuVmVjdG9yKG8pCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgYSArIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaiAqIDgpKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zCisgICAgZGVmIFdpbmRvd0RpbGF0aW9uc0FzTnVtcHkoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTApKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldFZlY3RvckFzTnVtcHkoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDY0RmxhZ3MsIG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMKKyAgICBkZWYgV2luZG93RGlsYXRpb25zTGVuZ3RoKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEwKSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9ucworICAgIGRlZiBXaW5kb3dEaWxhdGlvbnNJc05vbmUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTApKQorICAgICAgICByZXR1cm4gbyA9PSAwCisKKyAgICAjIFN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMKKyAgICBkZWYgUGFkZGluZyhzZWxmLCBqKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIGEgPSBzZWxmLl90YWIuVmVjdG9yKG8pCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgYSArIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaiAqIDgpKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zCisgICAgZGVmIFBhZGRpbmdBc051bXB5KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEyKSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXRWZWN0b3JBc051bXB5KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ2NEZsYWdzLCBvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zCisgICAgZGVmIFBhZGRpbmdMZW5ndGgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTIpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlZlY3RvckxlbihvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zCisgICAgZGVmIFBhZGRpbmdJc05vbmUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTIpKQorICAgICAgICByZXR1cm4gbyA9PSAwCisKKyAgICAjIFN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMKKyAgICBkZWYgQm9keVN1YmdyYXBoSW5kZXgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKK2RlZiBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCg2KQorCitkZWYgU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9uc0FkZFdpbmRvd0RpbWVuc2lvbnMoYnVpbGRlciwgd2luZG93RGltZW5zaW9ucyk6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMCwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZSh3aW5kb3dEaW1lbnNpb25zKSwgMCkKKworZGVmIFN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnNTdGFydFdpbmRvd0RpbWVuc2lvbnNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgorICAgIHJldHVybiBidWlsZGVyLlN0YXJ0VmVjdG9yKDgsIG51bUVsZW1zLCA4KQorCitkZWYgU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9uc0FkZFdpbmRvd1N0cmlkZXMoYnVpbGRlciwgd2luZG93U3RyaWRlcyk6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMSwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZSh3aW5kb3dTdHJpZGVzKSwgMCkKKworZGVmIFN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnNTdGFydFdpbmRvd1N0cmlkZXNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgorICAgIHJldHVybiBidWlsZGVyLlN0YXJ0VmVjdG9yKDgsIG51bUVsZW1zLCA4KQorCitkZWYgU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9uc0FkZEJhc2VEaWxhdGlvbnMoYnVpbGRlciwgYmFzZURpbGF0aW9ucyk6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMiwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShiYXNlRGlsYXRpb25zKSwgMCkKKworZGVmIFN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnNTdGFydEJhc2VEaWxhdGlvbnNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgorICAgIHJldHVybiBidWlsZGVyLlN0YXJ0VmVjdG9yKDgsIG51bUVsZW1zLCA4KQorCitkZWYgU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9uc0FkZFdpbmRvd0RpbGF0aW9ucyhidWlsZGVyLCB3aW5kb3dEaWxhdGlvbnMpOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDMsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUod2luZG93RGlsYXRpb25zKSwgMCkKKworZGVmIFN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnNTdGFydFdpbmRvd0RpbGF0aW9uc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6CisgICAgcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoOCwgbnVtRWxlbXMsIDgpCisKK2RlZiBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zQWRkUGFkZGluZyhidWlsZGVyLCBwYWRkaW5nKToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCg0LCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHBhZGRpbmcpLCAwKQorCitkZWYgU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9uc1N0YXJ0UGFkZGluZ1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6CisgICAgcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoOCwgbnVtRWxlbXMsIDgpCisKK2RlZiBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zQWRkQm9keVN1YmdyYXBoSW5kZXgoYnVpbGRlciwgYm9keVN1YmdyYXBoSW5kZXgpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEludDMyU2xvdCg1LCBib2R5U3ViZ3JhcGhJbmRleCwgMCkKKworZGVmIFN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCit0cnk6CisgICAgZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QKK2V4Y2VwdDoKKyAgICBwYXNzCisKK2NsYXNzIFN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIFN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLndpbmRvd0RpbWVuc2lvbnMgPSBOb25lICAjIHR5cGU6IExpc3RbaW50XQorICAgICAgICBzZWxmLndpbmRvd1N0cmlkZXMgPSBOb25lICAjIHR5cGU6IExpc3RbaW50XQorICAgICAgICBzZWxmLmJhc2VEaWxhdGlvbnMgPSBOb25lICAjIHR5cGU6IExpc3RbaW50XQorICAgICAgICBzZWxmLndpbmRvd0RpbGF0aW9ucyA9IE5vbmUgICMgdHlwZTogTGlzdFtpbnRdCisgICAgICAgIHNlbGYucGFkZGluZyA9IE5vbmUgICMgdHlwZTogTGlzdFtpbnRdCisgICAgICAgIHNlbGYuYm9keVN1YmdyYXBoSW5kZXggPSAwICAjIHR5cGU6IGludAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICBzdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zID0gU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9ucygpCisgICAgICAgIHN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihzdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgc3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9ucyk6CisgICAgICAgIHggPSBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhzdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIHN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMpOgorICAgICAgICBpZiBzdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IHN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMuV2luZG93RGltZW5zaW9uc0lzTm9uZSgpOgorICAgICAgICAgICAgaWYgbnAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLndpbmRvd0RpbWVuc2lvbnMgPSBbXQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMuV2luZG93RGltZW5zaW9uc0xlbmd0aCgpKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53aW5kb3dEaW1lbnNpb25zLmFwcGVuZChzdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zLldpbmRvd0RpbWVuc2lvbnMoaSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYud2luZG93RGltZW5zaW9ucyA9IHN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMuV2luZG93RGltZW5zaW9uc0FzTnVtcHkoKQorICAgICAgICBpZiBub3Qgc3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9ucy5XaW5kb3dTdHJpZGVzSXNOb25lKCk6CisgICAgICAgICAgICBpZiBucCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYud2luZG93U3RyaWRlcyA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9ucy5XaW5kb3dTdHJpZGVzTGVuZ3RoKCkpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLndpbmRvd1N0cmlkZXMuYXBwZW5kKHN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMuV2luZG93U3RyaWRlcyhpKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi53aW5kb3dTdHJpZGVzID0gc3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9ucy5XaW5kb3dTdHJpZGVzQXNOdW1weSgpCisgICAgICAgIGlmIG5vdCBzdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zLkJhc2VEaWxhdGlvbnNJc05vbmUoKToKKyAgICAgICAgICAgIGlmIG5wIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5iYXNlRGlsYXRpb25zID0gW10KKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShzdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zLkJhc2VEaWxhdGlvbnNMZW5ndGgoKSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYmFzZURpbGF0aW9ucy5hcHBlbmQoc3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9ucy5CYXNlRGlsYXRpb25zKGkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmJhc2VEaWxhdGlvbnMgPSBzdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zLkJhc2VEaWxhdGlvbnNBc051bXB5KCkKKyAgICAgICAgaWYgbm90IHN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMuV2luZG93RGlsYXRpb25zSXNOb25lKCk6CisgICAgICAgICAgICBpZiBucCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYud2luZG93RGlsYXRpb25zID0gW10KKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShzdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zLldpbmRvd0RpbGF0aW9uc0xlbmd0aCgpKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53aW5kb3dEaWxhdGlvbnMuYXBwZW5kKHN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMuV2luZG93RGlsYXRpb25zKGkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLndpbmRvd0RpbGF0aW9ucyA9IHN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMuV2luZG93RGlsYXRpb25zQXNOdW1weSgpCisgICAgICAgIGlmIG5vdCBzdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zLlBhZGRpbmdJc05vbmUoKToKKyAgICAgICAgICAgIGlmIG5wIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5wYWRkaW5nID0gW10KKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShzdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zLlBhZGRpbmdMZW5ndGgoKSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucGFkZGluZy5hcHBlbmQoc3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9ucy5QYWRkaW5nKGkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnBhZGRpbmcgPSBzdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zLlBhZGRpbmdBc051bXB5KCkKKyAgICAgICAgc2VsZi5ib2R5U3ViZ3JhcGhJbmRleCA9IHN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMuQm9keVN1YmdyYXBoSW5kZXgoKQorCisgICAgIyBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBpZiBzZWxmLndpbmRvd0RpbWVuc2lvbnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBucCBpcyBub3QgTm9uZSBhbmQgdHlwZShzZWxmLndpbmRvd0RpbWVuc2lvbnMpIGlzIG5wLm5kYXJyYXk6CisgICAgICAgICAgICAgICAgd2luZG93RGltZW5zaW9ucyA9IGJ1aWxkZXIuQ3JlYXRlTnVtcHlWZWN0b3Ioc2VsZi53aW5kb3dEaW1lbnNpb25zKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zU3RhcnRXaW5kb3dEaW1lbnNpb25zVmVjdG9yKGJ1aWxkZXIsIGxlbihzZWxmLndpbmRvd0RpbWVuc2lvbnMpKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLndpbmRvd0RpbWVuc2lvbnMpKSk6CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZEludDY0KHNlbGYud2luZG93RGltZW5zaW9uc1tpXSkKKyAgICAgICAgICAgICAgICB3aW5kb3dEaW1lbnNpb25zID0gYnVpbGRlci5FbmRWZWN0b3IoKQorICAgICAgICBpZiBzZWxmLndpbmRvd1N0cmlkZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBucCBpcyBub3QgTm9uZSBhbmQgdHlwZShzZWxmLndpbmRvd1N0cmlkZXMpIGlzIG5wLm5kYXJyYXk6CisgICAgICAgICAgICAgICAgd2luZG93U3RyaWRlcyA9IGJ1aWxkZXIuQ3JlYXRlTnVtcHlWZWN0b3Ioc2VsZi53aW5kb3dTdHJpZGVzKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zU3RhcnRXaW5kb3dTdHJpZGVzVmVjdG9yKGJ1aWxkZXIsIGxlbihzZWxmLndpbmRvd1N0cmlkZXMpKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLndpbmRvd1N0cmlkZXMpKSk6CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZEludDY0KHNlbGYud2luZG93U3RyaWRlc1tpXSkKKyAgICAgICAgICAgICAgICB3aW5kb3dTdHJpZGVzID0gYnVpbGRlci5FbmRWZWN0b3IoKQorICAgICAgICBpZiBzZWxmLmJhc2VEaWxhdGlvbnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBucCBpcyBub3QgTm9uZSBhbmQgdHlwZShzZWxmLmJhc2VEaWxhdGlvbnMpIGlzIG5wLm5kYXJyYXk6CisgICAgICAgICAgICAgICAgYmFzZURpbGF0aW9ucyA9IGJ1aWxkZXIuQ3JlYXRlTnVtcHlWZWN0b3Ioc2VsZi5iYXNlRGlsYXRpb25zKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zU3RhcnRCYXNlRGlsYXRpb25zVmVjdG9yKGJ1aWxkZXIsIGxlbihzZWxmLmJhc2VEaWxhdGlvbnMpKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLmJhc2VEaWxhdGlvbnMpKSk6CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZEludDY0KHNlbGYuYmFzZURpbGF0aW9uc1tpXSkKKyAgICAgICAgICAgICAgICBiYXNlRGlsYXRpb25zID0gYnVpbGRlci5FbmRWZWN0b3IoKQorICAgICAgICBpZiBzZWxmLndpbmRvd0RpbGF0aW9ucyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG5wIGlzIG5vdCBOb25lIGFuZCB0eXBlKHNlbGYud2luZG93RGlsYXRpb25zKSBpcyBucC5uZGFycmF5OgorICAgICAgICAgICAgICAgIHdpbmRvd0RpbGF0aW9ucyA9IGJ1aWxkZXIuQ3JlYXRlTnVtcHlWZWN0b3Ioc2VsZi53aW5kb3dEaWxhdGlvbnMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIFN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnNTdGFydFdpbmRvd0RpbGF0aW9uc1ZlY3RvcihidWlsZGVyLCBsZW4oc2VsZi53aW5kb3dEaWxhdGlvbnMpKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLndpbmRvd0RpbGF0aW9ucykpKToKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5QcmVwZW5kSW50NjQoc2VsZi53aW5kb3dEaWxhdGlvbnNbaV0pCisgICAgICAgICAgICAgICAgd2luZG93RGlsYXRpb25zID0gYnVpbGRlci5FbmRWZWN0b3IoKQorICAgICAgICBpZiBzZWxmLnBhZGRpbmcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBucCBpcyBub3QgTm9uZSBhbmQgdHlwZShzZWxmLnBhZGRpbmcpIGlzIG5wLm5kYXJyYXk6CisgICAgICAgICAgICAgICAgcGFkZGluZyA9IGJ1aWxkZXIuQ3JlYXRlTnVtcHlWZWN0b3Ioc2VsZi5wYWRkaW5nKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zU3RhcnRQYWRkaW5nVmVjdG9yKGJ1aWxkZXIsIGxlbihzZWxmLnBhZGRpbmcpKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLnBhZGRpbmcpKSk6CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZEludDY0KHNlbGYucGFkZGluZ1tpXSkKKyAgICAgICAgICAgICAgICBwYWRkaW5nID0gYnVpbGRlci5FbmRWZWN0b3IoKQorICAgICAgICBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgaWYgc2VsZi53aW5kb3dEaW1lbnNpb25zIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9uc0FkZFdpbmRvd0RpbWVuc2lvbnMoYnVpbGRlciwgd2luZG93RGltZW5zaW9ucykKKyAgICAgICAgaWYgc2VsZi53aW5kb3dTdHJpZGVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9uc0FkZFdpbmRvd1N0cmlkZXMoYnVpbGRlciwgd2luZG93U3RyaWRlcykKKyAgICAgICAgaWYgc2VsZi5iYXNlRGlsYXRpb25zIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9uc0FkZEJhc2VEaWxhdGlvbnMoYnVpbGRlciwgYmFzZURpbGF0aW9ucykKKyAgICAgICAgaWYgc2VsZi53aW5kb3dEaWxhdGlvbnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zQWRkV2luZG93RGlsYXRpb25zKGJ1aWxkZXIsIHdpbmRvd0RpbGF0aW9ucykKKyAgICAgICAgaWYgc2VsZi5wYWRkaW5nIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9uc0FkZFBhZGRpbmcoYnVpbGRlciwgcGFkZGluZykKKyAgICAgICAgU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9uc0FkZEJvZHlTdWJncmFwaEluZGV4KGJ1aWxkZXIsIHNlbGYuYm9keVN1YmdyYXBoSW5kZXgpCisgICAgICAgIHN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMgPSBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBzdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zCisKKworY2xhc3MgU3RhYmxlaGxvV2hpbGVPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gU3RhYmxlaGxvV2hpbGVPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNTdGFibGVobG9XaGlsZU9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBTdGFibGVobG9XaGlsZU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFN0YWJsZWhsb1doaWxlT3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKKyAgICAjIFN0YWJsZWhsb1doaWxlT3B0aW9ucworICAgIGRlZiBDb25kU3ViZ3JhcGhJbmRleChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9XaGlsZU9wdGlvbnMKKyAgICBkZWYgQm9keVN1YmdyYXBoSW5kZXgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworZGVmIFN0YWJsZWhsb1doaWxlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMikKKworZGVmIFN0YWJsZWhsb1doaWxlT3B0aW9uc0FkZENvbmRTdWJncmFwaEluZGV4KGJ1aWxkZXIsIGNvbmRTdWJncmFwaEluZGV4KToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMCwgY29uZFN1YmdyYXBoSW5kZXgsIDApCisKK2RlZiBTdGFibGVobG9XaGlsZU9wdGlvbnNBZGRCb2R5U3ViZ3JhcGhJbmRleChidWlsZGVyLCBib2R5U3ViZ3JhcGhJbmRleCk6CisgICAgYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDEsIGJvZHlTdWJncmFwaEluZGV4LCAwKQorCitkZWYgU3RhYmxlaGxvV2hpbGVPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBTdGFibGVobG9XaGlsZU9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIFN0YWJsZWhsb1doaWxlT3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuY29uZFN1YmdyYXBoSW5kZXggPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmJvZHlTdWJncmFwaEluZGV4ID0gMCAgIyB0eXBlOiBpbnQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgc3RhYmxlaGxvV2hpbGVPcHRpb25zID0gU3RhYmxlaGxvV2hpbGVPcHRpb25zKCkKKyAgICAgICAgc3RhYmxlaGxvV2hpbGVPcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooc3RhYmxlaGxvV2hpbGVPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgc3RhYmxlaGxvV2hpbGVPcHRpb25zKToKKyAgICAgICAgeCA9IFN0YWJsZWhsb1doaWxlT3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2soc3RhYmxlaGxvV2hpbGVPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBTdGFibGVobG9XaGlsZU9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgc3RhYmxlaGxvV2hpbGVPcHRpb25zKToKKyAgICAgICAgaWYgc3RhYmxlaGxvV2hpbGVPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5jb25kU3ViZ3JhcGhJbmRleCA9IHN0YWJsZWhsb1doaWxlT3B0aW9ucy5Db25kU3ViZ3JhcGhJbmRleCgpCisgICAgICAgIHNlbGYuYm9keVN1YmdyYXBoSW5kZXggPSBzdGFibGVobG9XaGlsZU9wdGlvbnMuQm9keVN1YmdyYXBoSW5kZXgoKQorCisgICAgIyBTdGFibGVobG9XaGlsZU9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIFN0YWJsZWhsb1doaWxlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIFN0YWJsZWhsb1doaWxlT3B0aW9uc0FkZENvbmRTdWJncmFwaEluZGV4KGJ1aWxkZXIsIHNlbGYuY29uZFN1YmdyYXBoSW5kZXgpCisgICAgICAgIFN0YWJsZWhsb1doaWxlT3B0aW9uc0FkZEJvZHlTdWJncmFwaEluZGV4KGJ1aWxkZXIsIHNlbGYuYm9keVN1YmdyYXBoSW5kZXgpCisgICAgICAgIHN0YWJsZWhsb1doaWxlT3B0aW9ucyA9IFN0YWJsZWhsb1doaWxlT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gc3RhYmxlaGxvV2hpbGVPcHRpb25zCisKKworY2xhc3MgU3RhYmxlaGxvU29ydE9wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBTdGFibGVobG9Tb3J0T3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzU3RhYmxlaGxvU29ydE9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBTdGFibGVobG9Tb3J0T3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgU3RhYmxlaGxvU29ydE9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCisgICAgIyBTdGFibGVobG9Tb3J0T3B0aW9ucworICAgIGRlZiBEaW1lbnNpb24oc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ2NEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvU29ydE9wdGlvbnMKKyAgICBkZWYgSXNTdGFibGUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkJvb2xGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpKQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICMgU3RhYmxlaGxvU29ydE9wdGlvbnMKKyAgICBkZWYgQ29tcGFyYXRvclN1YmdyYXBoSW5kZXgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworZGVmIFN0YWJsZWhsb1NvcnRPcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgzKQorCitkZWYgU3RhYmxlaGxvU29ydE9wdGlvbnNBZGREaW1lbnNpb24oYnVpbGRlciwgZGltZW5zaW9uKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQ2NFNsb3QoMCwgZGltZW5zaW9uLCAwKQorCitkZWYgU3RhYmxlaGxvU29ydE9wdGlvbnNBZGRJc1N0YWJsZShidWlsZGVyLCBpc1N0YWJsZSk6CisgICAgYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoMSwgaXNTdGFibGUsIDApCisKK2RlZiBTdGFibGVobG9Tb3J0T3B0aW9uc0FkZENvbXBhcmF0b3JTdWJncmFwaEluZGV4KGJ1aWxkZXIsIGNvbXBhcmF0b3JTdWJncmFwaEluZGV4KToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMiwgY29tcGFyYXRvclN1YmdyYXBoSW5kZXgsIDApCisKK2RlZiBTdGFibGVobG9Tb3J0T3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgU3RhYmxlaGxvU29ydE9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIFN0YWJsZWhsb1NvcnRPcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5kaW1lbnNpb24gPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmlzU3RhYmxlID0gRmFsc2UgICMgdHlwZTogYm9vbAorICAgICAgICBzZWxmLmNvbXBhcmF0b3JTdWJncmFwaEluZGV4ID0gMCAgIyB0eXBlOiBpbnQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgc3RhYmxlaGxvU29ydE9wdGlvbnMgPSBTdGFibGVobG9Tb3J0T3B0aW9ucygpCisgICAgICAgIHN0YWJsZWhsb1NvcnRPcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooc3RhYmxlaGxvU29ydE9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzdGFibGVobG9Tb3J0T3B0aW9ucyk6CisgICAgICAgIHggPSBTdGFibGVobG9Tb3J0T3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2soc3RhYmxlaGxvU29ydE9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFN0YWJsZWhsb1NvcnRPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIHN0YWJsZWhsb1NvcnRPcHRpb25zKToKKyAgICAgICAgaWYgc3RhYmxlaGxvU29ydE9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmRpbWVuc2lvbiA9IHN0YWJsZWhsb1NvcnRPcHRpb25zLkRpbWVuc2lvbigpCisgICAgICAgIHNlbGYuaXNTdGFibGUgPSBzdGFibGVobG9Tb3J0T3B0aW9ucy5Jc1N0YWJsZSgpCisgICAgICAgIHNlbGYuY29tcGFyYXRvclN1YmdyYXBoSW5kZXggPSBzdGFibGVobG9Tb3J0T3B0aW9ucy5Db21wYXJhdG9yU3ViZ3JhcGhJbmRleCgpCisKKyAgICAjIFN0YWJsZWhsb1NvcnRPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBTdGFibGVobG9Tb3J0T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIFN0YWJsZWhsb1NvcnRPcHRpb25zQWRkRGltZW5zaW9uKGJ1aWxkZXIsIHNlbGYuZGltZW5zaW9uKQorICAgICAgICBTdGFibGVobG9Tb3J0T3B0aW9uc0FkZElzU3RhYmxlKGJ1aWxkZXIsIHNlbGYuaXNTdGFibGUpCisgICAgICAgIFN0YWJsZWhsb1NvcnRPcHRpb25zQWRkQ29tcGFyYXRvclN1YmdyYXBoSW5kZXgoYnVpbGRlciwgc2VsZi5jb21wYXJhdG9yU3ViZ3JhcGhJbmRleCkKKyAgICAgICAgc3RhYmxlaGxvU29ydE9wdGlvbnMgPSBTdGFibGVobG9Tb3J0T3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gc3RhYmxlaGxvU29ydE9wdGlvbnMKKworCitjbGFzcyBTdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBTdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc1N0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFN0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgU3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworICAgICMgU3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zCisgICAgZGVmIERpbWVuc2lvbihzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDY0RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCitkZWYgU3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgxKQorCitkZWYgU3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zQWRkRGltZW5zaW9uKGJ1aWxkZXIsIGRpbWVuc2lvbik6CisgICAgYnVpbGRlci5QcmVwZW5kSW50NjRTbG90KDAsIGRpbWVuc2lvbiwgMCkKKworZGVmIFN0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgU3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBTdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmRpbWVuc2lvbiA9IDAgICMgdHlwZTogaW50CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHN0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9ucyA9IFN0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9ucygpCisgICAgICAgIHN0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHN0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9ucykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHN0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9ucyk6CisgICAgICAgIHggPSBTdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHN0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9ucykKKyAgICAgICAgcmV0dXJuIHgKKworICAgICMgU3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIHN0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9ucyk6CisgICAgICAgIGlmIHN0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9ucyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuZGltZW5zaW9uID0gc3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zLkRpbWVuc2lvbigpCisKKyAgICAjIFN0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgU3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgU3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zQWRkRGltZW5zaW9uKGJ1aWxkZXIsIHNlbGYuZGltZW5zaW9uKQorICAgICAgICBzdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnMgPSBTdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHN0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9ucworCisKK2NsYXNzIFN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IFN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzU3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgorICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgU3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCisgICAgIyBTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnMKKyAgICBkZWYgQnJvYWRjYXN0RGltZW5zaW9ucyhzZWxmLCBqKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgYSA9IHNlbGYuX3RhYi5WZWN0b3IobykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ2NEZsYWdzLCBhICsgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShqICogOCkpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9ucworICAgIGRlZiBCcm9hZGNhc3REaW1lbnNpb25zQXNOdW1weShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXRWZWN0b3JBc051bXB5KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ2NEZsYWdzLCBvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnMKKyAgICBkZWYgQnJvYWRjYXN0RGltZW5zaW9uc0xlbmd0aChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zCisgICAgZGVmIEJyb2FkY2FzdERpbWVuc2lvbnNJc05vbmUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIHJldHVybiBvID09IDAKKworZGVmIFN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMSkKKworZGVmIFN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9uc0FkZEJyb2FkY2FzdERpbWVuc2lvbnMoYnVpbGRlciwgYnJvYWRjYXN0RGltZW5zaW9ucyk6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMCwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShicm9hZGNhc3REaW1lbnNpb25zKSwgMCkKKworZGVmIFN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9uc1N0YXJ0QnJvYWRjYXN0RGltZW5zaW9uc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6CisgICAgcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoOCwgbnVtRWxlbXMsIDgpCisKK2RlZiBTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCit0cnk6CisgICAgZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QKK2V4Y2VwdDoKKyAgICBwYXNzCisKK2NsYXNzIFN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgU3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5icm9hZGNhc3REaW1lbnNpb25zID0gTm9uZSAgIyB0eXBlOiBMaXN0W2ludF0KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgc3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zID0gU3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zKCkKKyAgICAgICAgc3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooc3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgc3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zKToKKyAgICAgICAgeCA9IFN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2soc3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgc3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zKToKKyAgICAgICAgaWYgc3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IHN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9ucy5Ccm9hZGNhc3REaW1lbnNpb25zSXNOb25lKCk6CisgICAgICAgICAgICBpZiBucCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuYnJvYWRjYXN0RGltZW5zaW9ucyA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zLkJyb2FkY2FzdERpbWVuc2lvbnNMZW5ndGgoKSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYnJvYWRjYXN0RGltZW5zaW9ucy5hcHBlbmQoc3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zLkJyb2FkY2FzdERpbWVuc2lvbnMoaSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuYnJvYWRjYXN0RGltZW5zaW9ucyA9IHN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9ucy5Ccm9hZGNhc3REaW1lbnNpb25zQXNOdW1weSgpCisKKyAgICAjIFN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgaWYgc2VsZi5icm9hZGNhc3REaW1lbnNpb25zIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbnAgaXMgbm90IE5vbmUgYW5kIHR5cGUoc2VsZi5icm9hZGNhc3REaW1lbnNpb25zKSBpcyBucC5uZGFycmF5OgorICAgICAgICAgICAgICAgIGJyb2FkY2FzdERpbWVuc2lvbnMgPSBidWlsZGVyLkNyZWF0ZU51bXB5VmVjdG9yKHNlbGYuYnJvYWRjYXN0RGltZW5zaW9ucykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgU3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zU3RhcnRCcm9hZGNhc3REaW1lbnNpb25zVmVjdG9yKGJ1aWxkZXIsIGxlbihzZWxmLmJyb2FkY2FzdERpbWVuc2lvbnMpKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLmJyb2FkY2FzdERpbWVuc2lvbnMpKSk6CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZEludDY0KHNlbGYuYnJvYWRjYXN0RGltZW5zaW9uc1tpXSkKKyAgICAgICAgICAgICAgICBicm9hZGNhc3REaW1lbnNpb25zID0gYnVpbGRlci5FbmRWZWN0b3IoKQorICAgICAgICBTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICBpZiBzZWxmLmJyb2FkY2FzdERpbWVuc2lvbnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnNBZGRCcm9hZGNhc3REaW1lbnNpb25zKGJ1aWxkZXIsIGJyb2FkY2FzdERpbWVuc2lvbnMpCisgICAgICAgIHN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9ucyA9IFN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gc3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zCisKKworY2xhc3MgU3RhYmxlaGxvQ29tcGFyZU9wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBTdGFibGVobG9Db21wYXJlT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzU3RhYmxlaGxvQ29tcGFyZU9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBTdGFibGVobG9Db21wYXJlT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgU3RhYmxlaGxvQ29tcGFyZU9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCisgICAgIyBTdGFibGVobG9Db21wYXJlT3B0aW9ucworICAgIGRlZiBDb21wYXJpc29uRGlyZWN0aW9uKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVWludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9Db21wYXJlT3B0aW9ucworICAgIGRlZiBDb21wYXJlVHlwZShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVpbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworZGVmIFN0YWJsZWhsb0NvbXBhcmVPcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgyKQorCitkZWYgU3RhYmxlaGxvQ29tcGFyZU9wdGlvbnNBZGRDb21wYXJpc29uRGlyZWN0aW9uKGJ1aWxkZXIsIGNvbXBhcmlzb25EaXJlY3Rpb24pOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVpbnQzMlNsb3QoMCwgY29tcGFyaXNvbkRpcmVjdGlvbiwgMCkKKworZGVmIFN0YWJsZWhsb0NvbXBhcmVPcHRpb25zQWRkQ29tcGFyZVR5cGUoYnVpbGRlciwgY29tcGFyZVR5cGUpOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVpbnQzMlNsb3QoMSwgY29tcGFyZVR5cGUsIDApCisKK2RlZiBTdGFibGVobG9Db21wYXJlT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgU3RhYmxlaGxvQ29tcGFyZU9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIFN0YWJsZWhsb0NvbXBhcmVPcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5jb21wYXJpc29uRGlyZWN0aW9uID0gMCAgIyB0eXBlOiBpbnQKKyAgICAgICAgc2VsZi5jb21wYXJlVHlwZSA9IDAgICMgdHlwZTogaW50CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHN0YWJsZWhsb0NvbXBhcmVPcHRpb25zID0gU3RhYmxlaGxvQ29tcGFyZU9wdGlvbnMoKQorICAgICAgICBzdGFibGVobG9Db21wYXJlT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHN0YWJsZWhsb0NvbXBhcmVPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgc3RhYmxlaGxvQ29tcGFyZU9wdGlvbnMpOgorICAgICAgICB4ID0gU3RhYmxlaGxvQ29tcGFyZU9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHN0YWJsZWhsb0NvbXBhcmVPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBTdGFibGVobG9Db21wYXJlT3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBzdGFibGVobG9Db21wYXJlT3B0aW9ucyk6CisgICAgICAgIGlmIHN0YWJsZWhsb0NvbXBhcmVPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5jb21wYXJpc29uRGlyZWN0aW9uID0gc3RhYmxlaGxvQ29tcGFyZU9wdGlvbnMuQ29tcGFyaXNvbkRpcmVjdGlvbigpCisgICAgICAgIHNlbGYuY29tcGFyZVR5cGUgPSBzdGFibGVobG9Db21wYXJlT3B0aW9ucy5Db21wYXJlVHlwZSgpCisKKyAgICAjIFN0YWJsZWhsb0NvbXBhcmVPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBTdGFibGVobG9Db21wYXJlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIFN0YWJsZWhsb0NvbXBhcmVPcHRpb25zQWRkQ29tcGFyaXNvbkRpcmVjdGlvbihidWlsZGVyLCBzZWxmLmNvbXBhcmlzb25EaXJlY3Rpb24pCisgICAgICAgIFN0YWJsZWhsb0NvbXBhcmVPcHRpb25zQWRkQ29tcGFyZVR5cGUoYnVpbGRlciwgc2VsZi5jb21wYXJlVHlwZSkKKyAgICAgICAgc3RhYmxlaGxvQ29tcGFyZU9wdGlvbnMgPSBTdGFibGVobG9Db21wYXJlT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gc3RhYmxlaGxvQ29tcGFyZU9wdGlvbnMKKworCitjbGFzcyBTdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gU3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzU3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFN0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFN0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCisgICAgIyBTdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zCisgICAgZGVmIFNsaWNlU2l6ZXMoc2VsZiwgaik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIGEgPSBzZWxmLl90YWIuVmVjdG9yKG8pCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgYSArIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaiAqIDgpKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zCisgICAgZGVmIFNsaWNlU2l6ZXNBc051bXB5KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldFZlY3RvckFzTnVtcHkoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDY0RmxhZ3MsIG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnMKKyAgICBkZWYgU2xpY2VTaXplc0xlbmd0aChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9ucworICAgIGRlZiBTbGljZVNpemVzSXNOb25lKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICByZXR1cm4gbyA9PSAwCisKK2RlZiBTdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgxKQorCitkZWYgU3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9uc0FkZFNsaWNlU2l6ZXMoYnVpbGRlciwgc2xpY2VTaXplcyk6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMCwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzbGljZVNpemVzKSwgMCkKKworZGVmIFN0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnNTdGFydFNsaWNlU2l6ZXNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgorICAgIHJldHVybiBidWlsZGVyLlN0YXJ0VmVjdG9yKDgsIG51bUVsZW1zLCA4KQorCitkZWYgU3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKK3RyeToKKyAgICBmcm9tIHR5cGluZyBpbXBvcnQgTGlzdAorZXhjZXB0OgorICAgIHBhc3MKKworY2xhc3MgU3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgU3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuc2xpY2VTaXplcyA9IE5vbmUgICMgdHlwZTogTGlzdFtpbnRdCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHN0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnMgPSBTdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zKCkKKyAgICAgICAgc3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHN0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zKToKKyAgICAgICAgeCA9IFN0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHN0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFN0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgc3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9ucyk6CisgICAgICAgIGlmIHN0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3Qgc3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9ucy5TbGljZVNpemVzSXNOb25lKCk6CisgICAgICAgICAgICBpZiBucCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuc2xpY2VTaXplcyA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9ucy5TbGljZVNpemVzTGVuZ3RoKCkpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNsaWNlU2l6ZXMuYXBwZW5kKHN0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnMuU2xpY2VTaXplcyhpKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5zbGljZVNpemVzID0gc3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9ucy5TbGljZVNpemVzQXNOdW1weSgpCisKKyAgICAjIFN0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIGlmIHNlbGYuc2xpY2VTaXplcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG5wIGlzIG5vdCBOb25lIGFuZCB0eXBlKHNlbGYuc2xpY2VTaXplcykgaXMgbnAubmRhcnJheToKKyAgICAgICAgICAgICAgICBzbGljZVNpemVzID0gYnVpbGRlci5DcmVhdGVOdW1weVZlY3RvcihzZWxmLnNsaWNlU2l6ZXMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIFN0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnNTdGFydFNsaWNlU2l6ZXNWZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYuc2xpY2VTaXplcykpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYuc2xpY2VTaXplcykpKToKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5QcmVwZW5kSW50NjQoc2VsZi5zbGljZVNpemVzW2ldKQorICAgICAgICAgICAgICAgIHNsaWNlU2l6ZXMgPSBidWlsZGVyLkVuZFZlY3RvcigpCisgICAgICAgIFN0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICBpZiBzZWxmLnNsaWNlU2l6ZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBTdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zQWRkU2xpY2VTaXplcyhidWlsZGVyLCBzbGljZVNpemVzKQorICAgICAgICBzdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zID0gU3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gc3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9ucworCisKK2NsYXNzIFN0YWJsZWhsb1BhZE9wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBTdGFibGVobG9QYWRPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNTdGFibGVobG9QYWRPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgorICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgU3RhYmxlaGxvUGFkT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgU3RhYmxlaGxvUGFkT3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKKyAgICAjIFN0YWJsZWhsb1BhZE9wdGlvbnMKKyAgICBkZWYgRWRnZVBhZGRpbmdMb3coc2VsZiwgaik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIGEgPSBzZWxmLl90YWIuVmVjdG9yKG8pCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgYSArIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaiAqIDgpKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9QYWRPcHRpb25zCisgICAgZGVmIEVkZ2VQYWRkaW5nTG93QXNOdW1weShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXRWZWN0b3JBc051bXB5KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ2NEZsYWdzLCBvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9QYWRPcHRpb25zCisgICAgZGVmIEVkZ2VQYWRkaW5nTG93TGVuZ3RoKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlZlY3RvckxlbihvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9QYWRPcHRpb25zCisgICAgZGVmIEVkZ2VQYWRkaW5nTG93SXNOb25lKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICByZXR1cm4gbyA9PSAwCisKKyAgICAjIFN0YWJsZWhsb1BhZE9wdGlvbnMKKyAgICBkZWYgRWRnZVBhZGRpbmdIaWdoKHNlbGYsIGopOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICBhID0gc2VsZi5fdGFiLlZlY3RvcihvKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDY0RmxhZ3MsIGEgKyBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGogKiA4KSkKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvUGFkT3B0aW9ucworICAgIGRlZiBFZGdlUGFkZGluZ0hpZ2hBc051bXB5KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldFZlY3RvckFzTnVtcHkoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDY0RmxhZ3MsIG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb1BhZE9wdGlvbnMKKyAgICBkZWYgRWRnZVBhZGRpbmdIaWdoTGVuZ3RoKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlZlY3RvckxlbihvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9QYWRPcHRpb25zCisgICAgZGVmIEVkZ2VQYWRkaW5nSGlnaElzTm9uZShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKKyAgICAgICAgcmV0dXJuIG8gPT0gMAorCisgICAgIyBTdGFibGVobG9QYWRPcHRpb25zCisgICAgZGVmIEludGVyaW9yUGFkZGluZyhzZWxmLCBqKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg4KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgYSA9IHNlbGYuX3RhYi5WZWN0b3IobykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ2NEZsYWdzLCBhICsgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShqICogOCkpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb1BhZE9wdGlvbnMKKyAgICBkZWYgSW50ZXJpb3JQYWRkaW5nQXNOdW1weShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg4KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXRWZWN0b3JBc051bXB5KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ2NEZsYWdzLCBvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9QYWRPcHRpb25zCisgICAgZGVmIEludGVyaW9yUGFkZGluZ0xlbmd0aChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg4KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvUGFkT3B0aW9ucworICAgIGRlZiBJbnRlcmlvclBhZGRpbmdJc05vbmUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCisgICAgICAgIHJldHVybiBvID09IDAKKworZGVmIFN0YWJsZWhsb1BhZE9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDMpCisKK2RlZiBTdGFibGVobG9QYWRPcHRpb25zQWRkRWRnZVBhZGRpbmdMb3coYnVpbGRlciwgZWRnZVBhZGRpbmdMb3cpOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDAsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoZWRnZVBhZGRpbmdMb3cpLCAwKQorCitkZWYgU3RhYmxlaGxvUGFkT3B0aW9uc1N0YXJ0RWRnZVBhZGRpbmdMb3dWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgorICAgIHJldHVybiBidWlsZGVyLlN0YXJ0VmVjdG9yKDgsIG51bUVsZW1zLCA4KQorCitkZWYgU3RhYmxlaGxvUGFkT3B0aW9uc0FkZEVkZ2VQYWRkaW5nSGlnaChidWlsZGVyLCBlZGdlUGFkZGluZ0hpZ2gpOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDEsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoZWRnZVBhZGRpbmdIaWdoKSwgMCkKKworZGVmIFN0YWJsZWhsb1BhZE9wdGlvbnNTdGFydEVkZ2VQYWRkaW5nSGlnaFZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6CisgICAgcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoOCwgbnVtRWxlbXMsIDgpCisKK2RlZiBTdGFibGVobG9QYWRPcHRpb25zQWRkSW50ZXJpb3JQYWRkaW5nKGJ1aWxkZXIsIGludGVyaW9yUGFkZGluZyk6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMiwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShpbnRlcmlvclBhZGRpbmcpLCAwKQorCitkZWYgU3RhYmxlaGxvUGFkT3B0aW9uc1N0YXJ0SW50ZXJpb3JQYWRkaW5nVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKKyAgICByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig4LCBudW1FbGVtcywgOCkKKworZGVmIFN0YWJsZWhsb1BhZE9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCit0cnk6CisgICAgZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QKK2V4Y2VwdDoKKyAgICBwYXNzCisKK2NsYXNzIFN0YWJsZWhsb1BhZE9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIFN0YWJsZWhsb1BhZE9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmVkZ2VQYWRkaW5nTG93ID0gTm9uZSAgIyB0eXBlOiBMaXN0W2ludF0KKyAgICAgICAgc2VsZi5lZGdlUGFkZGluZ0hpZ2ggPSBOb25lICAjIHR5cGU6IExpc3RbaW50XQorICAgICAgICBzZWxmLmludGVyaW9yUGFkZGluZyA9IE5vbmUgICMgdHlwZTogTGlzdFtpbnRdCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHN0YWJsZWhsb1BhZE9wdGlvbnMgPSBTdGFibGVobG9QYWRPcHRpb25zKCkKKyAgICAgICAgc3RhYmxlaGxvUGFkT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHN0YWJsZWhsb1BhZE9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzdGFibGVobG9QYWRPcHRpb25zKToKKyAgICAgICAgeCA9IFN0YWJsZWhsb1BhZE9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHN0YWJsZWhsb1BhZE9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFN0YWJsZWhsb1BhZE9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgc3RhYmxlaGxvUGFkT3B0aW9ucyk6CisgICAgICAgIGlmIHN0YWJsZWhsb1BhZE9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3Qgc3RhYmxlaGxvUGFkT3B0aW9ucy5FZGdlUGFkZGluZ0xvd0lzTm9uZSgpOgorICAgICAgICAgICAgaWYgbnAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLmVkZ2VQYWRkaW5nTG93ID0gW10KKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShzdGFibGVobG9QYWRPcHRpb25zLkVkZ2VQYWRkaW5nTG93TGVuZ3RoKCkpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmVkZ2VQYWRkaW5nTG93LmFwcGVuZChzdGFibGVobG9QYWRPcHRpb25zLkVkZ2VQYWRkaW5nTG93KGkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmVkZ2VQYWRkaW5nTG93ID0gc3RhYmxlaGxvUGFkT3B0aW9ucy5FZGdlUGFkZGluZ0xvd0FzTnVtcHkoKQorICAgICAgICBpZiBub3Qgc3RhYmxlaGxvUGFkT3B0aW9ucy5FZGdlUGFkZGluZ0hpZ2hJc05vbmUoKToKKyAgICAgICAgICAgIGlmIG5wIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5lZGdlUGFkZGluZ0hpZ2ggPSBbXQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHN0YWJsZWhsb1BhZE9wdGlvbnMuRWRnZVBhZGRpbmdIaWdoTGVuZ3RoKCkpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmVkZ2VQYWRkaW5nSGlnaC5hcHBlbmQoc3RhYmxlaGxvUGFkT3B0aW9ucy5FZGdlUGFkZGluZ0hpZ2goaSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZWRnZVBhZGRpbmdIaWdoID0gc3RhYmxlaGxvUGFkT3B0aW9ucy5FZGdlUGFkZGluZ0hpZ2hBc051bXB5KCkKKyAgICAgICAgaWYgbm90IHN0YWJsZWhsb1BhZE9wdGlvbnMuSW50ZXJpb3JQYWRkaW5nSXNOb25lKCk6CisgICAgICAgICAgICBpZiBucCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuaW50ZXJpb3JQYWRkaW5nID0gW10KKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShzdGFibGVobG9QYWRPcHRpb25zLkludGVyaW9yUGFkZGluZ0xlbmd0aCgpKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnRlcmlvclBhZGRpbmcuYXBwZW5kKHN0YWJsZWhsb1BhZE9wdGlvbnMuSW50ZXJpb3JQYWRkaW5nKGkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmludGVyaW9yUGFkZGluZyA9IHN0YWJsZWhsb1BhZE9wdGlvbnMuSW50ZXJpb3JQYWRkaW5nQXNOdW1weSgpCisKKyAgICAjIFN0YWJsZWhsb1BhZE9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIGlmIHNlbGYuZWRnZVBhZGRpbmdMb3cgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBucCBpcyBub3QgTm9uZSBhbmQgdHlwZShzZWxmLmVkZ2VQYWRkaW5nTG93KSBpcyBucC5uZGFycmF5OgorICAgICAgICAgICAgICAgIGVkZ2VQYWRkaW5nTG93ID0gYnVpbGRlci5DcmVhdGVOdW1weVZlY3RvcihzZWxmLmVkZ2VQYWRkaW5nTG93KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBTdGFibGVobG9QYWRPcHRpb25zU3RhcnRFZGdlUGFkZGluZ0xvd1ZlY3RvcihidWlsZGVyLCBsZW4oc2VsZi5lZGdlUGFkZGluZ0xvdykpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYuZWRnZVBhZGRpbmdMb3cpKSk6CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZEludDY0KHNlbGYuZWRnZVBhZGRpbmdMb3dbaV0pCisgICAgICAgICAgICAgICAgZWRnZVBhZGRpbmdMb3cgPSBidWlsZGVyLkVuZFZlY3RvcigpCisgICAgICAgIGlmIHNlbGYuZWRnZVBhZGRpbmdIaWdoIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbnAgaXMgbm90IE5vbmUgYW5kIHR5cGUoc2VsZi5lZGdlUGFkZGluZ0hpZ2gpIGlzIG5wLm5kYXJyYXk6CisgICAgICAgICAgICAgICAgZWRnZVBhZGRpbmdIaWdoID0gYnVpbGRlci5DcmVhdGVOdW1weVZlY3RvcihzZWxmLmVkZ2VQYWRkaW5nSGlnaCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgU3RhYmxlaGxvUGFkT3B0aW9uc1N0YXJ0RWRnZVBhZGRpbmdIaWdoVmVjdG9yKGJ1aWxkZXIsIGxlbihzZWxmLmVkZ2VQYWRkaW5nSGlnaCkpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYuZWRnZVBhZGRpbmdIaWdoKSkpOgorICAgICAgICAgICAgICAgICAgICBidWlsZGVyLlByZXBlbmRJbnQ2NChzZWxmLmVkZ2VQYWRkaW5nSGlnaFtpXSkKKyAgICAgICAgICAgICAgICBlZGdlUGFkZGluZ0hpZ2ggPSBidWlsZGVyLkVuZFZlY3RvcigpCisgICAgICAgIGlmIHNlbGYuaW50ZXJpb3JQYWRkaW5nIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbnAgaXMgbm90IE5vbmUgYW5kIHR5cGUoc2VsZi5pbnRlcmlvclBhZGRpbmcpIGlzIG5wLm5kYXJyYXk6CisgICAgICAgICAgICAgICAgaW50ZXJpb3JQYWRkaW5nID0gYnVpbGRlci5DcmVhdGVOdW1weVZlY3RvcihzZWxmLmludGVyaW9yUGFkZGluZykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgU3RhYmxlaGxvUGFkT3B0aW9uc1N0YXJ0SW50ZXJpb3JQYWRkaW5nVmVjdG9yKGJ1aWxkZXIsIGxlbihzZWxmLmludGVyaW9yUGFkZGluZykpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYuaW50ZXJpb3JQYWRkaW5nKSkpOgorICAgICAgICAgICAgICAgICAgICBidWlsZGVyLlByZXBlbmRJbnQ2NChzZWxmLmludGVyaW9yUGFkZGluZ1tpXSkKKyAgICAgICAgICAgICAgICBpbnRlcmlvclBhZGRpbmcgPSBidWlsZGVyLkVuZFZlY3RvcigpCisgICAgICAgIFN0YWJsZWhsb1BhZE9wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICBpZiBzZWxmLmVkZ2VQYWRkaW5nTG93IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgU3RhYmxlaGxvUGFkT3B0aW9uc0FkZEVkZ2VQYWRkaW5nTG93KGJ1aWxkZXIsIGVkZ2VQYWRkaW5nTG93KQorICAgICAgICBpZiBzZWxmLmVkZ2VQYWRkaW5nSGlnaCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIFN0YWJsZWhsb1BhZE9wdGlvbnNBZGRFZGdlUGFkZGluZ0hpZ2goYnVpbGRlciwgZWRnZVBhZGRpbmdIaWdoKQorICAgICAgICBpZiBzZWxmLmludGVyaW9yUGFkZGluZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIFN0YWJsZWhsb1BhZE9wdGlvbnNBZGRJbnRlcmlvclBhZGRpbmcoYnVpbGRlciwgaW50ZXJpb3JQYWRkaW5nKQorICAgICAgICBzdGFibGVobG9QYWRPcHRpb25zID0gU3RhYmxlaGxvUGFkT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gc3RhYmxlaGxvUGFkT3B0aW9ucworCisKK2NsYXNzIFN0YWJsZWhsb0lvdGFPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gU3RhYmxlaGxvSW90YU9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc1N0YWJsZWhsb0lvdGFPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgorICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgU3RhYmxlaGxvSW90YU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFN0YWJsZWhsb0lvdGFPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworICAgICMgU3RhYmxlaGxvSW90YU9wdGlvbnMKKyAgICBkZWYgSW90YURpbWVuc2lvbihzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDY0RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCitkZWYgU3RhYmxlaGxvSW90YU9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDEpCisKK2RlZiBTdGFibGVobG9Jb3RhT3B0aW9uc0FkZElvdGFEaW1lbnNpb24oYnVpbGRlciwgaW90YURpbWVuc2lvbik6CisgICAgYnVpbGRlci5QcmVwZW5kSW50NjRTbG90KDAsIGlvdGFEaW1lbnNpb24sIDApCisKK2RlZiBTdGFibGVobG9Jb3RhT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgU3RhYmxlaGxvSW90YU9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIFN0YWJsZWhsb0lvdGFPcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5pb3RhRGltZW5zaW9uID0gMCAgIyB0eXBlOiBpbnQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgc3RhYmxlaGxvSW90YU9wdGlvbnMgPSBTdGFibGVobG9Jb3RhT3B0aW9ucygpCisgICAgICAgIHN0YWJsZWhsb0lvdGFPcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooc3RhYmxlaGxvSW90YU9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzdGFibGVobG9Jb3RhT3B0aW9ucyk6CisgICAgICAgIHggPSBTdGFibGVobG9Jb3RhT3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2soc3RhYmxlaGxvSW90YU9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFN0YWJsZWhsb0lvdGFPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIHN0YWJsZWhsb0lvdGFPcHRpb25zKToKKyAgICAgICAgaWYgc3RhYmxlaGxvSW90YU9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmlvdGFEaW1lbnNpb24gPSBzdGFibGVobG9Jb3RhT3B0aW9ucy5Jb3RhRGltZW5zaW9uKCkKKworICAgICMgU3RhYmxlaGxvSW90YU9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIFN0YWJsZWhsb0lvdGFPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgU3RhYmxlaGxvSW90YU9wdGlvbnNBZGRJb3RhRGltZW5zaW9uKGJ1aWxkZXIsIHNlbGYuaW90YURpbWVuc2lvbikKKyAgICAgICAgc3RhYmxlaGxvSW90YU9wdGlvbnMgPSBTdGFibGVobG9Jb3RhT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gc3RhYmxlaGxvSW90YU9wdGlvbnMKKworCitjbGFzcyBTdGFibGVobG9DdXN0b21DYWxsT3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IFN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNTdGFibGVobG9DdXN0b21DYWxsT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBTdGFibGVobG9DdXN0b21DYWxsT3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKKyAgICAjIFN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zCisgICAgZGVmIENhbGxUYXJnZXROYW1lKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlN0cmluZyhvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICMgU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnMKKyAgICBkZWYgSGFzU2lkZUVmZmVjdChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuQm9vbEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykpCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgIyBTdGFibGVobG9DdXN0b21DYWxsT3B0aW9ucworICAgIGRlZiBCYWNrZW5kQ29uZmlnKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlN0cmluZyhvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICMgU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnMKKyAgICBkZWYgQXBpVmVyc2lvbihzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnMKKyAgICBkZWYgQ2FsbGVkQ29tcHV0YXRpb25zKHNlbGYsIGopOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEyKSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgYSA9IHNlbGYuX3RhYi5WZWN0b3IobykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBhICsgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShqICogNCkpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zCisgICAgZGVmIENhbGxlZENvbXB1dGF0aW9uc0FzTnVtcHkoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTIpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldFZlY3RvckFzTnVtcHkoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zCisgICAgZGVmIENhbGxlZENvbXB1dGF0aW9uc0xlbmd0aChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuVmVjdG9yTGVuKG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zCisgICAgZGVmIENhbGxlZENvbXB1dGF0aW9uc0lzTm9uZShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMikpCisgICAgICAgIHJldHVybiBvID09IDAKKworICAgICMgU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnMKKyAgICBkZWYgQ3VzdG9tQXR0cmlidXRlcyhzZWxmLCBqKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIGEgPSBzZWxmLl90YWIuVmVjdG9yKG8pCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVWludDhGbGFncywgYSArIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaiAqIDEpKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9DdXN0b21DYWxsT3B0aW9ucworICAgIGRlZiBDdXN0b21BdHRyaWJ1dGVzQXNOdW1weShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0VmVjdG9yQXNOdW1weShmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVWludDhGbGFncywgbykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnMKKyAgICBkZWYgQ3VzdG9tQXR0cmlidXRlc0xlbmd0aChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuVmVjdG9yTGVuKG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zCisgICAgZGVmIEN1c3RvbUF0dHJpYnV0ZXNJc05vbmUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTQpKQorICAgICAgICByZXR1cm4gbyA9PSAwCisKK2RlZiBTdGFibGVobG9DdXN0b21DYWxsT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoNikKKworZGVmIFN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zQWRkQ2FsbFRhcmdldE5hbWUoYnVpbGRlciwgY2FsbFRhcmdldE5hbWUpOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDAsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoY2FsbFRhcmdldE5hbWUpLCAwKQorCitkZWYgU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnNBZGRIYXNTaWRlRWZmZWN0KGJ1aWxkZXIsIGhhc1NpZGVFZmZlY3QpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEJvb2xTbG90KDEsIGhhc1NpZGVFZmZlY3QsIDApCisKK2RlZiBTdGFibGVobG9DdXN0b21DYWxsT3B0aW9uc0FkZEJhY2tlbmRDb25maWcoYnVpbGRlciwgYmFja2VuZENvbmZpZyk6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMiwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShiYWNrZW5kQ29uZmlnKSwgMCkKKworZGVmIFN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zQWRkQXBpVmVyc2lvbihidWlsZGVyLCBhcGlWZXJzaW9uKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMywgYXBpVmVyc2lvbiwgMCkKKworZGVmIFN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zQWRkQ2FsbGVkQ29tcHV0YXRpb25zKGJ1aWxkZXIsIGNhbGxlZENvbXB1dGF0aW9ucyk6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoNCwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShjYWxsZWRDb21wdXRhdGlvbnMpLCAwKQorCitkZWYgU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnNTdGFydENhbGxlZENvbXB1dGF0aW9uc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6CisgICAgcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpCisKK2RlZiBTdGFibGVobG9DdXN0b21DYWxsT3B0aW9uc0FkZEN1c3RvbUF0dHJpYnV0ZXMoYnVpbGRlciwgY3VzdG9tQXR0cmlidXRlcyk6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoNSwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShjdXN0b21BdHRyaWJ1dGVzKSwgMCkKKworZGVmIFN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zU3RhcnRDdXN0b21BdHRyaWJ1dGVzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKKyAgICByZXR1cm4gYnVpbGRlci5TdGFydFZlY3RvcigxLCBudW1FbGVtcywgMSkKKworZGVmIFN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKwordHJ5OgorICAgIGZyb20gdHlwaW5nIGltcG9ydCBMaXN0CitleGNlcHQ6CisgICAgcGFzcworCitjbGFzcyBTdGFibGVobG9DdXN0b21DYWxsT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmNhbGxUYXJnZXROYW1lID0gTm9uZSAgIyB0eXBlOiBzdHIKKyAgICAgICAgc2VsZi5oYXNTaWRlRWZmZWN0ID0gRmFsc2UgICMgdHlwZTogYm9vbAorICAgICAgICBzZWxmLmJhY2tlbmRDb25maWcgPSBOb25lICAjIHR5cGU6IHN0cgorICAgICAgICBzZWxmLmFwaVZlcnNpb24gPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmNhbGxlZENvbXB1dGF0aW9ucyA9IE5vbmUgICMgdHlwZTogTGlzdFtpbnRdCisgICAgICAgIHNlbGYuY3VzdG9tQXR0cmlidXRlcyA9IE5vbmUgICMgdHlwZTogTGlzdFtpbnRdCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zID0gU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnMoKQorICAgICAgICBzdGFibGVobG9DdXN0b21DYWxsT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgc3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnMpOgorICAgICAgICB4ID0gU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBTdGFibGVobG9DdXN0b21DYWxsT3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBzdGFibGVobG9DdXN0b21DYWxsT3B0aW9ucyk6CisgICAgICAgIGlmIHN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5jYWxsVGFyZ2V0TmFtZSA9IHN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zLkNhbGxUYXJnZXROYW1lKCkKKyAgICAgICAgc2VsZi5oYXNTaWRlRWZmZWN0ID0gc3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnMuSGFzU2lkZUVmZmVjdCgpCisgICAgICAgIHNlbGYuYmFja2VuZENvbmZpZyA9IHN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zLkJhY2tlbmRDb25maWcoKQorICAgICAgICBzZWxmLmFwaVZlcnNpb24gPSBzdGFibGVobG9DdXN0b21DYWxsT3B0aW9ucy5BcGlWZXJzaW9uKCkKKyAgICAgICAgaWYgbm90IHN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zLkNhbGxlZENvbXB1dGF0aW9uc0lzTm9uZSgpOgorICAgICAgICAgICAgaWYgbnAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLmNhbGxlZENvbXB1dGF0aW9ucyA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnMuQ2FsbGVkQ29tcHV0YXRpb25zTGVuZ3RoKCkpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmNhbGxlZENvbXB1dGF0aW9ucy5hcHBlbmQoc3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnMuQ2FsbGVkQ29tcHV0YXRpb25zKGkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmNhbGxlZENvbXB1dGF0aW9ucyA9IHN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zLkNhbGxlZENvbXB1dGF0aW9uc0FzTnVtcHkoKQorICAgICAgICBpZiBub3Qgc3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnMuQ3VzdG9tQXR0cmlidXRlc0lzTm9uZSgpOgorICAgICAgICAgICAgaWYgbnAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLmN1c3RvbUF0dHJpYnV0ZXMgPSBbXQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zLkN1c3RvbUF0dHJpYnV0ZXNMZW5ndGgoKSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY3VzdG9tQXR0cmlidXRlcy5hcHBlbmQoc3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnMuQ3VzdG9tQXR0cmlidXRlcyhpKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5jdXN0b21BdHRyaWJ1dGVzID0gc3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnMuQ3VzdG9tQXR0cmlidXRlc0FzTnVtcHkoKQorCisgICAgIyBTdGFibGVobG9DdXN0b21DYWxsT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgaWYgc2VsZi5jYWxsVGFyZ2V0TmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNhbGxUYXJnZXROYW1lID0gYnVpbGRlci5DcmVhdGVTdHJpbmcoc2VsZi5jYWxsVGFyZ2V0TmFtZSkKKyAgICAgICAgaWYgc2VsZi5iYWNrZW5kQ29uZmlnIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYmFja2VuZENvbmZpZyA9IGJ1aWxkZXIuQ3JlYXRlU3RyaW5nKHNlbGYuYmFja2VuZENvbmZpZykKKyAgICAgICAgaWYgc2VsZi5jYWxsZWRDb21wdXRhdGlvbnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBucCBpcyBub3QgTm9uZSBhbmQgdHlwZShzZWxmLmNhbGxlZENvbXB1dGF0aW9ucykgaXMgbnAubmRhcnJheToKKyAgICAgICAgICAgICAgICBjYWxsZWRDb21wdXRhdGlvbnMgPSBidWlsZGVyLkNyZWF0ZU51bXB5VmVjdG9yKHNlbGYuY2FsbGVkQ29tcHV0YXRpb25zKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBTdGFibGVobG9DdXN0b21DYWxsT3B0aW9uc1N0YXJ0Q2FsbGVkQ29tcHV0YXRpb25zVmVjdG9yKGJ1aWxkZXIsIGxlbihzZWxmLmNhbGxlZENvbXB1dGF0aW9ucykpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYuY2FsbGVkQ29tcHV0YXRpb25zKSkpOgorICAgICAgICAgICAgICAgICAgICBidWlsZGVyLlByZXBlbmRJbnQzMihzZWxmLmNhbGxlZENvbXB1dGF0aW9uc1tpXSkKKyAgICAgICAgICAgICAgICBjYWxsZWRDb21wdXRhdGlvbnMgPSBidWlsZGVyLkVuZFZlY3RvcigpCisgICAgICAgIGlmIHNlbGYuY3VzdG9tQXR0cmlidXRlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG5wIGlzIG5vdCBOb25lIGFuZCB0eXBlKHNlbGYuY3VzdG9tQXR0cmlidXRlcykgaXMgbnAubmRhcnJheToKKyAgICAgICAgICAgICAgICBjdXN0b21BdHRyaWJ1dGVzID0gYnVpbGRlci5DcmVhdGVOdW1weVZlY3RvcihzZWxmLmN1c3RvbUF0dHJpYnV0ZXMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIFN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zU3RhcnRDdXN0b21BdHRyaWJ1dGVzVmVjdG9yKGJ1aWxkZXIsIGxlbihzZWxmLmN1c3RvbUF0dHJpYnV0ZXMpKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLmN1c3RvbUF0dHJpYnV0ZXMpKSk6CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZFVpbnQ4KHNlbGYuY3VzdG9tQXR0cmlidXRlc1tpXSkKKyAgICAgICAgICAgICAgICBjdXN0b21BdHRyaWJ1dGVzID0gYnVpbGRlci5FbmRWZWN0b3IoKQorICAgICAgICBTdGFibGVobG9DdXN0b21DYWxsT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIGlmIHNlbGYuY2FsbFRhcmdldE5hbWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBTdGFibGVobG9DdXN0b21DYWxsT3B0aW9uc0FkZENhbGxUYXJnZXROYW1lKGJ1aWxkZXIsIGNhbGxUYXJnZXROYW1lKQorICAgICAgICBTdGFibGVobG9DdXN0b21DYWxsT3B0aW9uc0FkZEhhc1NpZGVFZmZlY3QoYnVpbGRlciwgc2VsZi5oYXNTaWRlRWZmZWN0KQorICAgICAgICBpZiBzZWxmLmJhY2tlbmRDb25maWcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBTdGFibGVobG9DdXN0b21DYWxsT3B0aW9uc0FkZEJhY2tlbmRDb25maWcoYnVpbGRlciwgYmFja2VuZENvbmZpZykKKyAgICAgICAgU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnNBZGRBcGlWZXJzaW9uKGJ1aWxkZXIsIHNlbGYuYXBpVmVyc2lvbikKKyAgICAgICAgaWYgc2VsZi5jYWxsZWRDb21wdXRhdGlvbnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBTdGFibGVobG9DdXN0b21DYWxsT3B0aW9uc0FkZENhbGxlZENvbXB1dGF0aW9ucyhidWlsZGVyLCBjYWxsZWRDb21wdXRhdGlvbnMpCisgICAgICAgIGlmIHNlbGYuY3VzdG9tQXR0cmlidXRlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIFN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zQWRkQ3VzdG9tQXR0cmlidXRlcyhidWlsZGVyLCBjdXN0b21BdHRyaWJ1dGVzKQorICAgICAgICBzdGFibGVobG9DdXN0b21DYWxsT3B0aW9ucyA9IFN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBzdGFibGVobG9DdXN0b21DYWxsT3B0aW9ucworCisKK2NsYXNzIFN0YWJsZWhsb1JlZHVjZU9wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBTdGFibGVobG9SZWR1Y2VPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNTdGFibGVobG9SZWR1Y2VPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgorICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgU3RhYmxlaGxvUmVkdWNlT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgU3RhYmxlaGxvUmVkdWNlT3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKKyAgICAjIFN0YWJsZWhsb1JlZHVjZU9wdGlvbnMKKyAgICBkZWYgRGltZW5zaW9ucyhzZWxmLCBqKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgYSA9IHNlbGYuX3RhYi5WZWN0b3IobykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ2NEZsYWdzLCBhICsgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShqICogOCkpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb1JlZHVjZU9wdGlvbnMKKyAgICBkZWYgRGltZW5zaW9uc0FzTnVtcHkoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0VmVjdG9yQXNOdW1weShmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgbykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvUmVkdWNlT3B0aW9ucworICAgIGRlZiBEaW1lbnNpb25zTGVuZ3RoKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlZlY3RvckxlbihvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9SZWR1Y2VPcHRpb25zCisgICAgZGVmIERpbWVuc2lvbnNJc05vbmUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIHJldHVybiBvID09IDAKKworICAgICMgU3RhYmxlaGxvUmVkdWNlT3B0aW9ucworICAgIGRlZiBCb2R5U3ViZ3JhcGhJbmRleChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCitkZWYgU3RhYmxlaGxvUmVkdWNlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMikKKworZGVmIFN0YWJsZWhsb1JlZHVjZU9wdGlvbnNBZGREaW1lbnNpb25zKGJ1aWxkZXIsIGRpbWVuc2lvbnMpOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDAsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoZGltZW5zaW9ucyksIDApCisKK2RlZiBTdGFibGVobG9SZWR1Y2VPcHRpb25zU3RhcnREaW1lbnNpb25zVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKKyAgICByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig4LCBudW1FbGVtcywgOCkKKworZGVmIFN0YWJsZWhsb1JlZHVjZU9wdGlvbnNBZGRCb2R5U3ViZ3JhcGhJbmRleChidWlsZGVyLCBib2R5U3ViZ3JhcGhJbmRleCk6CisgICAgYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDEsIGJvZHlTdWJncmFwaEluZGV4LCAwKQorCitkZWYgU3RhYmxlaGxvUmVkdWNlT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKK3RyeToKKyAgICBmcm9tIHR5cGluZyBpbXBvcnQgTGlzdAorZXhjZXB0OgorICAgIHBhc3MKKworY2xhc3MgU3RhYmxlaGxvUmVkdWNlT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgU3RhYmxlaGxvUmVkdWNlT3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuZGltZW5zaW9ucyA9IE5vbmUgICMgdHlwZTogTGlzdFtpbnRdCisgICAgICAgIHNlbGYuYm9keVN1YmdyYXBoSW5kZXggPSAwICAjIHR5cGU6IGludAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICBzdGFibGVobG9SZWR1Y2VPcHRpb25zID0gU3RhYmxlaGxvUmVkdWNlT3B0aW9ucygpCisgICAgICAgIHN0YWJsZWhsb1JlZHVjZU9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihzdGFibGVobG9SZWR1Y2VPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgc3RhYmxlaGxvUmVkdWNlT3B0aW9ucyk6CisgICAgICAgIHggPSBTdGFibGVobG9SZWR1Y2VPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhzdGFibGVobG9SZWR1Y2VPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBTdGFibGVobG9SZWR1Y2VPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIHN0YWJsZWhsb1JlZHVjZU9wdGlvbnMpOgorICAgICAgICBpZiBzdGFibGVobG9SZWR1Y2VPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IHN0YWJsZWhsb1JlZHVjZU9wdGlvbnMuRGltZW5zaW9uc0lzTm9uZSgpOgorICAgICAgICAgICAgaWYgbnAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLmRpbWVuc2lvbnMgPSBbXQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHN0YWJsZWhsb1JlZHVjZU9wdGlvbnMuRGltZW5zaW9uc0xlbmd0aCgpKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5kaW1lbnNpb25zLmFwcGVuZChzdGFibGVobG9SZWR1Y2VPcHRpb25zLkRpbWVuc2lvbnMoaSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZGltZW5zaW9ucyA9IHN0YWJsZWhsb1JlZHVjZU9wdGlvbnMuRGltZW5zaW9uc0FzTnVtcHkoKQorICAgICAgICBzZWxmLmJvZHlTdWJncmFwaEluZGV4ID0gc3RhYmxlaGxvUmVkdWNlT3B0aW9ucy5Cb2R5U3ViZ3JhcGhJbmRleCgpCisKKyAgICAjIFN0YWJsZWhsb1JlZHVjZU9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIGlmIHNlbGYuZGltZW5zaW9ucyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG5wIGlzIG5vdCBOb25lIGFuZCB0eXBlKHNlbGYuZGltZW5zaW9ucykgaXMgbnAubmRhcnJheToKKyAgICAgICAgICAgICAgICBkaW1lbnNpb25zID0gYnVpbGRlci5DcmVhdGVOdW1weVZlY3RvcihzZWxmLmRpbWVuc2lvbnMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIFN0YWJsZWhsb1JlZHVjZU9wdGlvbnNTdGFydERpbWVuc2lvbnNWZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYuZGltZW5zaW9ucykpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYuZGltZW5zaW9ucykpKToKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5QcmVwZW5kSW50NjQoc2VsZi5kaW1lbnNpb25zW2ldKQorICAgICAgICAgICAgICAgIGRpbWVuc2lvbnMgPSBidWlsZGVyLkVuZFZlY3RvcigpCisgICAgICAgIFN0YWJsZWhsb1JlZHVjZU9wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICBpZiBzZWxmLmRpbWVuc2lvbnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBTdGFibGVobG9SZWR1Y2VPcHRpb25zQWRkRGltZW5zaW9ucyhidWlsZGVyLCBkaW1lbnNpb25zKQorICAgICAgICBTdGFibGVobG9SZWR1Y2VPcHRpb25zQWRkQm9keVN1YmdyYXBoSW5kZXgoYnVpbGRlciwgc2VsZi5ib2R5U3ViZ3JhcGhJbmRleCkKKyAgICAgICAgc3RhYmxlaGxvUmVkdWNlT3B0aW9ucyA9IFN0YWJsZWhsb1JlZHVjZU9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHN0YWJsZWhsb1JlZHVjZU9wdGlvbnMKKworCitjbGFzcyBTdGFibGVobG9TbGljZU9wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBTdGFibGVobG9TbGljZU9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc1N0YWJsZWhsb1NsaWNlT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFN0YWJsZWhsb1NsaWNlT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgU3RhYmxlaGxvU2xpY2VPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworICAgICMgU3RhYmxlaGxvU2xpY2VPcHRpb25zCisgICAgZGVmIFN0YXJ0SW5kaWNlcyhzZWxmLCBqKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgYSA9IHNlbGYuX3RhYi5WZWN0b3IobykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ2NEZsYWdzLCBhICsgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShqICogOCkpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb1NsaWNlT3B0aW9ucworICAgIGRlZiBTdGFydEluZGljZXNBc051bXB5KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldFZlY3RvckFzTnVtcHkoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDY0RmxhZ3MsIG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb1NsaWNlT3B0aW9ucworICAgIGRlZiBTdGFydEluZGljZXNMZW5ndGgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuVmVjdG9yTGVuKG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb1NsaWNlT3B0aW9ucworICAgIGRlZiBTdGFydEluZGljZXNJc05vbmUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIHJldHVybiBvID09IDAKKworICAgICMgU3RhYmxlaGxvU2xpY2VPcHRpb25zCisgICAgZGVmIExpbWl0SW5kaWNlcyhzZWxmLCBqKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgYSA9IHNlbGYuX3RhYi5WZWN0b3IobykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ2NEZsYWdzLCBhICsgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShqICogOCkpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb1NsaWNlT3B0aW9ucworICAgIGRlZiBMaW1pdEluZGljZXNBc051bXB5KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldFZlY3RvckFzTnVtcHkoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDY0RmxhZ3MsIG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb1NsaWNlT3B0aW9ucworICAgIGRlZiBMaW1pdEluZGljZXNMZW5ndGgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuVmVjdG9yTGVuKG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb1NsaWNlT3B0aW9ucworICAgIGRlZiBMaW1pdEluZGljZXNJc05vbmUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIHJldHVybiBvID09IDAKKworICAgICMgU3RhYmxlaGxvU2xpY2VPcHRpb25zCisgICAgZGVmIFN0cmlkZXMoc2VsZiwgaik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIGEgPSBzZWxmLl90YWIuVmVjdG9yKG8pCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgYSArIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaiAqIDgpKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9TbGljZU9wdGlvbnMKKyAgICBkZWYgU3RyaWRlc0FzTnVtcHkoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0VmVjdG9yQXNOdW1weShmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgbykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvU2xpY2VPcHRpb25zCisgICAgZGVmIFN0cmlkZXNMZW5ndGgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuVmVjdG9yTGVuKG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb1NsaWNlT3B0aW9ucworICAgIGRlZiBTdHJpZGVzSXNOb25lKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQorICAgICAgICByZXR1cm4gbyA9PSAwCisKK2RlZiBTdGFibGVobG9TbGljZU9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDMpCisKK2RlZiBTdGFibGVobG9TbGljZU9wdGlvbnNBZGRTdGFydEluZGljZXMoYnVpbGRlciwgc3RhcnRJbmRpY2VzKToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgwLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHN0YXJ0SW5kaWNlcyksIDApCisKK2RlZiBTdGFibGVobG9TbGljZU9wdGlvbnNTdGFydFN0YXJ0SW5kaWNlc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6CisgICAgcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoOCwgbnVtRWxlbXMsIDgpCisKK2RlZiBTdGFibGVobG9TbGljZU9wdGlvbnNBZGRMaW1pdEluZGljZXMoYnVpbGRlciwgbGltaXRJbmRpY2VzKToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgxLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGxpbWl0SW5kaWNlcyksIDApCisKK2RlZiBTdGFibGVobG9TbGljZU9wdGlvbnNTdGFydExpbWl0SW5kaWNlc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6CisgICAgcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoOCwgbnVtRWxlbXMsIDgpCisKK2RlZiBTdGFibGVobG9TbGljZU9wdGlvbnNBZGRTdHJpZGVzKGJ1aWxkZXIsIHN0cmlkZXMpOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDIsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc3RyaWRlcyksIDApCisKK2RlZiBTdGFibGVobG9TbGljZU9wdGlvbnNTdGFydFN0cmlkZXNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgorICAgIHJldHVybiBidWlsZGVyLlN0YXJ0VmVjdG9yKDgsIG51bUVsZW1zLCA4KQorCitkZWYgU3RhYmxlaGxvU2xpY2VPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKwordHJ5OgorICAgIGZyb20gdHlwaW5nIGltcG9ydCBMaXN0CitleGNlcHQ6CisgICAgcGFzcworCitjbGFzcyBTdGFibGVobG9TbGljZU9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIFN0YWJsZWhsb1NsaWNlT3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuc3RhcnRJbmRpY2VzID0gTm9uZSAgIyB0eXBlOiBMaXN0W2ludF0KKyAgICAgICAgc2VsZi5saW1pdEluZGljZXMgPSBOb25lICAjIHR5cGU6IExpc3RbaW50XQorICAgICAgICBzZWxmLnN0cmlkZXMgPSBOb25lICAjIHR5cGU6IExpc3RbaW50XQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICBzdGFibGVobG9TbGljZU9wdGlvbnMgPSBTdGFibGVobG9TbGljZU9wdGlvbnMoKQorICAgICAgICBzdGFibGVobG9TbGljZU9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihzdGFibGVobG9TbGljZU9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzdGFibGVobG9TbGljZU9wdGlvbnMpOgorICAgICAgICB4ID0gU3RhYmxlaGxvU2xpY2VPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhzdGFibGVobG9TbGljZU9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFN0YWJsZWhsb1NsaWNlT3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBzdGFibGVobG9TbGljZU9wdGlvbnMpOgorICAgICAgICBpZiBzdGFibGVobG9TbGljZU9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3Qgc3RhYmxlaGxvU2xpY2VPcHRpb25zLlN0YXJ0SW5kaWNlc0lzTm9uZSgpOgorICAgICAgICAgICAgaWYgbnAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLnN0YXJ0SW5kaWNlcyA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc3RhYmxlaGxvU2xpY2VPcHRpb25zLlN0YXJ0SW5kaWNlc0xlbmd0aCgpKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdGFydEluZGljZXMuYXBwZW5kKHN0YWJsZWhsb1NsaWNlT3B0aW9ucy5TdGFydEluZGljZXMoaSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuc3RhcnRJbmRpY2VzID0gc3RhYmxlaGxvU2xpY2VPcHRpb25zLlN0YXJ0SW5kaWNlc0FzTnVtcHkoKQorICAgICAgICBpZiBub3Qgc3RhYmxlaGxvU2xpY2VPcHRpb25zLkxpbWl0SW5kaWNlc0lzTm9uZSgpOgorICAgICAgICAgICAgaWYgbnAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLmxpbWl0SW5kaWNlcyA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc3RhYmxlaGxvU2xpY2VPcHRpb25zLkxpbWl0SW5kaWNlc0xlbmd0aCgpKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5saW1pdEluZGljZXMuYXBwZW5kKHN0YWJsZWhsb1NsaWNlT3B0aW9ucy5MaW1pdEluZGljZXMoaSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYubGltaXRJbmRpY2VzID0gc3RhYmxlaGxvU2xpY2VPcHRpb25zLkxpbWl0SW5kaWNlc0FzTnVtcHkoKQorICAgICAgICBpZiBub3Qgc3RhYmxlaGxvU2xpY2VPcHRpb25zLlN0cmlkZXNJc05vbmUoKToKKyAgICAgICAgICAgIGlmIG5wIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5zdHJpZGVzID0gW10KKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShzdGFibGVobG9TbGljZU9wdGlvbnMuU3RyaWRlc0xlbmd0aCgpKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zdHJpZGVzLmFwcGVuZChzdGFibGVobG9TbGljZU9wdGlvbnMuU3RyaWRlcyhpKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5zdHJpZGVzID0gc3RhYmxlaGxvU2xpY2VPcHRpb25zLlN0cmlkZXNBc051bXB5KCkKKworICAgICMgU3RhYmxlaGxvU2xpY2VPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBpZiBzZWxmLnN0YXJ0SW5kaWNlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG5wIGlzIG5vdCBOb25lIGFuZCB0eXBlKHNlbGYuc3RhcnRJbmRpY2VzKSBpcyBucC5uZGFycmF5OgorICAgICAgICAgICAgICAgIHN0YXJ0SW5kaWNlcyA9IGJ1aWxkZXIuQ3JlYXRlTnVtcHlWZWN0b3Ioc2VsZi5zdGFydEluZGljZXMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIFN0YWJsZWhsb1NsaWNlT3B0aW9uc1N0YXJ0U3RhcnRJbmRpY2VzVmVjdG9yKGJ1aWxkZXIsIGxlbihzZWxmLnN0YXJ0SW5kaWNlcykpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYuc3RhcnRJbmRpY2VzKSkpOgorICAgICAgICAgICAgICAgICAgICBidWlsZGVyLlByZXBlbmRJbnQ2NChzZWxmLnN0YXJ0SW5kaWNlc1tpXSkKKyAgICAgICAgICAgICAgICBzdGFydEluZGljZXMgPSBidWlsZGVyLkVuZFZlY3RvcigpCisgICAgICAgIGlmIHNlbGYubGltaXRJbmRpY2VzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbnAgaXMgbm90IE5vbmUgYW5kIHR5cGUoc2VsZi5saW1pdEluZGljZXMpIGlzIG5wLm5kYXJyYXk6CisgICAgICAgICAgICAgICAgbGltaXRJbmRpY2VzID0gYnVpbGRlci5DcmVhdGVOdW1weVZlY3RvcihzZWxmLmxpbWl0SW5kaWNlcykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgU3RhYmxlaGxvU2xpY2VPcHRpb25zU3RhcnRMaW1pdEluZGljZXNWZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYubGltaXRJbmRpY2VzKSkKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShsZW4oc2VsZi5saW1pdEluZGljZXMpKSk6CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZEludDY0KHNlbGYubGltaXRJbmRpY2VzW2ldKQorICAgICAgICAgICAgICAgIGxpbWl0SW5kaWNlcyA9IGJ1aWxkZXIuRW5kVmVjdG9yKCkKKyAgICAgICAgaWYgc2VsZi5zdHJpZGVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbnAgaXMgbm90IE5vbmUgYW5kIHR5cGUoc2VsZi5zdHJpZGVzKSBpcyBucC5uZGFycmF5OgorICAgICAgICAgICAgICAgIHN0cmlkZXMgPSBidWlsZGVyLkNyZWF0ZU51bXB5VmVjdG9yKHNlbGYuc3RyaWRlcykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgU3RhYmxlaGxvU2xpY2VPcHRpb25zU3RhcnRTdHJpZGVzVmVjdG9yKGJ1aWxkZXIsIGxlbihzZWxmLnN0cmlkZXMpKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLnN0cmlkZXMpKSk6CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZEludDY0KHNlbGYuc3RyaWRlc1tpXSkKKyAgICAgICAgICAgICAgICBzdHJpZGVzID0gYnVpbGRlci5FbmRWZWN0b3IoKQorICAgICAgICBTdGFibGVobG9TbGljZU9wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICBpZiBzZWxmLnN0YXJ0SW5kaWNlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIFN0YWJsZWhsb1NsaWNlT3B0aW9uc0FkZFN0YXJ0SW5kaWNlcyhidWlsZGVyLCBzdGFydEluZGljZXMpCisgICAgICAgIGlmIHNlbGYubGltaXRJbmRpY2VzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgU3RhYmxlaGxvU2xpY2VPcHRpb25zQWRkTGltaXRJbmRpY2VzKGJ1aWxkZXIsIGxpbWl0SW5kaWNlcykKKyAgICAgICAgaWYgc2VsZi5zdHJpZGVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgU3RhYmxlaGxvU2xpY2VPcHRpb25zQWRkU3RyaWRlcyhidWlsZGVyLCBzdHJpZGVzKQorICAgICAgICBzdGFibGVobG9TbGljZU9wdGlvbnMgPSBTdGFibGVobG9TbGljZU9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHN0YWJsZWhsb1NsaWNlT3B0aW9ucworCisKK2NsYXNzIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgorICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCisgICAgIyBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMKKyAgICBkZWYgV2luZG93U3RyaWRlcyhzZWxmLCBqKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgYSA9IHNlbGYuX3RhYi5WZWN0b3IobykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ2NEZsYWdzLCBhICsgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShqICogOCkpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucworICAgIGRlZiBXaW5kb3dTdHJpZGVzQXNOdW1weShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXRWZWN0b3JBc051bXB5KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ2NEZsYWdzLCBvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMKKyAgICBkZWYgV2luZG93U3RyaWRlc0xlbmd0aChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zCisgICAgZGVmIFdpbmRvd1N0cmlkZXNJc05vbmUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIHJldHVybiBvID09IDAKKworICAgICMgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zCisgICAgZGVmIFBhZGRpbmcoc2VsZiwgaik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIGEgPSBzZWxmLl90YWIuVmVjdG9yKG8pCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgYSArIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaiAqIDgpKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMKKyAgICBkZWYgUGFkZGluZ0FzTnVtcHkoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0VmVjdG9yQXNOdW1weShmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgbykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zCisgICAgZGVmIFBhZGRpbmdMZW5ndGgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuVmVjdG9yTGVuKG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucworICAgIGRlZiBQYWRkaW5nSXNOb25lKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQorICAgICAgICByZXR1cm4gbyA9PSAwCisKKyAgICAjIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucworICAgIGRlZiBMaHNEaWxhdGlvbihzZWxmLCBqKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg4KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgYSA9IHNlbGYuX3RhYi5WZWN0b3IobykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ2NEZsYWdzLCBhICsgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShqICogOCkpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucworICAgIGRlZiBMaHNEaWxhdGlvbkFzTnVtcHkoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0VmVjdG9yQXNOdW1weShmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgbykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zCisgICAgZGVmIExoc0RpbGF0aW9uTGVuZ3RoKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlZlY3RvckxlbihvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMKKyAgICBkZWYgTGhzRGlsYXRpb25Jc05vbmUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCisgICAgICAgIHJldHVybiBvID09IDAKKworICAgICMgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zCisgICAgZGVmIFJoc0RpbGF0aW9uKHNlbGYsIGopOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEwKSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgYSA9IHNlbGYuX3RhYi5WZWN0b3IobykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ2NEZsYWdzLCBhICsgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShqICogOCkpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucworICAgIGRlZiBSaHNEaWxhdGlvbkFzTnVtcHkoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTApKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldFZlY3RvckFzTnVtcHkoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDY0RmxhZ3MsIG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucworICAgIGRlZiBSaHNEaWxhdGlvbkxlbmd0aChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuVmVjdG9yTGVuKG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucworICAgIGRlZiBSaHNEaWxhdGlvbklzTm9uZShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMCkpCisgICAgICAgIHJldHVybiBvID09IDAKKworICAgICMgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zCisgICAgZGVmIFdpbmRvd1JldmVyc2FsKHNlbGYsIGopOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEyKSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgYSA9IHNlbGYuX3RhYi5WZWN0b3IobykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5Cb29sRmxhZ3MsIGEgKyBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGogKiAxKSkKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zCisgICAgZGVmIFdpbmRvd1JldmVyc2FsQXNOdW1weShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0VmVjdG9yQXNOdW1weShmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuQm9vbEZsYWdzLCBvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMKKyAgICBkZWYgV2luZG93UmV2ZXJzYWxMZW5ndGgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTIpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlZlY3RvckxlbihvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMKKyAgICBkZWYgV2luZG93UmV2ZXJzYWxJc05vbmUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTIpKQorICAgICAgICByZXR1cm4gbyA9PSAwCisKKyAgICAjIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucworICAgIGRlZiBJbnB1dEJhdGNoRGltZW5zaW9uKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDE0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDY0RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMKKyAgICBkZWYgSW5wdXRGZWF0dXJlRGltZW5zaW9uKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDE2KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDY0RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMKKyAgICBkZWYgSW5wdXRTcGF0aWFsRGltZW5zaW9ucyhzZWxmLCBqKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxOCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIGEgPSBzZWxmLl90YWIuVmVjdG9yKG8pCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgYSArIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaiAqIDgpKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMKKyAgICBkZWYgSW5wdXRTcGF0aWFsRGltZW5zaW9uc0FzTnVtcHkoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTgpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldFZlY3RvckFzTnVtcHkoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDY0RmxhZ3MsIG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucworICAgIGRlZiBJbnB1dFNwYXRpYWxEaW1lbnNpb25zTGVuZ3RoKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDE4KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zCisgICAgZGVmIElucHV0U3BhdGlhbERpbWVuc2lvbnNJc05vbmUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTgpKQorICAgICAgICByZXR1cm4gbyA9PSAwCisKKyAgICAjIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucworICAgIGRlZiBLZXJuZWxJbnB1dEZlYXR1cmVEaW1lbnNpb24oc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMjApKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucworICAgIGRlZiBLZXJuZWxPdXRwdXRGZWF0dXJlRGltZW5zaW9uKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDIyKSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDY0RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMKKyAgICBkZWYgS2VybmVsU3BhdGlhbERpbWVuc2lvbnMoc2VsZiwgaik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMjQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICBhID0gc2VsZi5fdGFiLlZlY3RvcihvKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDY0RmxhZ3MsIGEgKyBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGogKiA4KSkKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zCisgICAgZGVmIEtlcm5lbFNwYXRpYWxEaW1lbnNpb25zQXNOdW1weShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgyNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0VmVjdG9yQXNOdW1weShmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgbykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zCisgICAgZGVmIEtlcm5lbFNwYXRpYWxEaW1lbnNpb25zTGVuZ3RoKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDI0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zCisgICAgZGVmIEtlcm5lbFNwYXRpYWxEaW1lbnNpb25zSXNOb25lKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDI0KSkKKyAgICAgICAgcmV0dXJuIG8gPT0gMAorCisgICAgIyBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMKKyAgICBkZWYgT3V0cHV0QmF0Y2hEaW1lbnNpb24oc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMjYpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucworICAgIGRlZiBPdXRwdXRGZWF0dXJlRGltZW5zaW9uKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDI4KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDY0RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMKKyAgICBkZWYgT3V0cHV0U3BhdGlhbERpbWVuc2lvbnMoc2VsZiwgaik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMzApKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICBhID0gc2VsZi5fdGFiLlZlY3RvcihvKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDY0RmxhZ3MsIGEgKyBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGogKiA4KSkKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zCisgICAgZGVmIE91dHB1dFNwYXRpYWxEaW1lbnNpb25zQXNOdW1weShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgzMCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0VmVjdG9yQXNOdW1weShmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgbykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zCisgICAgZGVmIE91dHB1dFNwYXRpYWxEaW1lbnNpb25zTGVuZ3RoKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDMwKSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zCisgICAgZGVmIE91dHB1dFNwYXRpYWxEaW1lbnNpb25zSXNOb25lKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDMwKSkKKyAgICAgICAgcmV0dXJuIG8gPT0gMAorCisgICAgIyBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMKKyAgICBkZWYgRmVhdHVyZUdyb3VwQ291bnQoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMzIpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucworICAgIGRlZiBCYXRjaEdyb3VwQ291bnQoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMzQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucworICAgIGRlZiBQcmVjaXNpb25Db25maWcoc2VsZiwgaik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMzYpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICBhID0gc2VsZi5fdGFiLlZlY3RvcihvKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVpbnQzMkZsYWdzLCBhICsgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShqICogNCkpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucworICAgIGRlZiBQcmVjaXNpb25Db25maWdBc051bXB5KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDM2KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXRWZWN0b3JBc051bXB5KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VaW50MzJGbGFncywgbykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zCisgICAgZGVmIFByZWNpc2lvbkNvbmZpZ0xlbmd0aChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgzNikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuVmVjdG9yTGVuKG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucworICAgIGRlZiBQcmVjaXNpb25Db25maWdJc05vbmUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMzYpKQorICAgICAgICByZXR1cm4gbyA9PSAwCisKK2RlZiBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDE3KQorCitkZWYgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zQWRkV2luZG93U3RyaWRlcyhidWlsZGVyLCB3aW5kb3dTdHJpZGVzKToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgwLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHdpbmRvd1N0cmlkZXMpLCAwKQorCitkZWYgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zU3RhcnRXaW5kb3dTdHJpZGVzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKKyAgICByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig4LCBudW1FbGVtcywgOCkKKworZGVmIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc0FkZFBhZGRpbmcoYnVpbGRlciwgcGFkZGluZyk6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMSwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShwYWRkaW5nKSwgMCkKKworZGVmIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc1N0YXJ0UGFkZGluZ1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6CisgICAgcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoOCwgbnVtRWxlbXMsIDgpCisKK2RlZiBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNBZGRMaHNEaWxhdGlvbihidWlsZGVyLCBsaHNEaWxhdGlvbik6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMiwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShsaHNEaWxhdGlvbiksIDApCisKK2RlZiBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNTdGFydExoc0RpbGF0aW9uVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKKyAgICByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig4LCBudW1FbGVtcywgOCkKKworZGVmIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc0FkZFJoc0RpbGF0aW9uKGJ1aWxkZXIsIHJoc0RpbGF0aW9uKToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgzLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHJoc0RpbGF0aW9uKSwgMCkKKworZGVmIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc1N0YXJ0UmhzRGlsYXRpb25WZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgorICAgIHJldHVybiBidWlsZGVyLlN0YXJ0VmVjdG9yKDgsIG51bUVsZW1zLCA4KQorCitkZWYgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zQWRkV2luZG93UmV2ZXJzYWwoYnVpbGRlciwgd2luZG93UmV2ZXJzYWwpOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDQsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUod2luZG93UmV2ZXJzYWwpLCAwKQorCitkZWYgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zU3RhcnRXaW5kb3dSZXZlcnNhbFZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6CisgICAgcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoMSwgbnVtRWxlbXMsIDEpCisKK2RlZiBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNBZGRJbnB1dEJhdGNoRGltZW5zaW9uKGJ1aWxkZXIsIGlucHV0QmF0Y2hEaW1lbnNpb24pOgorICAgIGJ1aWxkZXIuUHJlcGVuZEludDY0U2xvdCg1LCBpbnB1dEJhdGNoRGltZW5zaW9uLCAwKQorCitkZWYgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zQWRkSW5wdXRGZWF0dXJlRGltZW5zaW9uKGJ1aWxkZXIsIGlucHV0RmVhdHVyZURpbWVuc2lvbik6CisgICAgYnVpbGRlci5QcmVwZW5kSW50NjRTbG90KDYsIGlucHV0RmVhdHVyZURpbWVuc2lvbiwgMCkKKworZGVmIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc0FkZElucHV0U3BhdGlhbERpbWVuc2lvbnMoYnVpbGRlciwgaW5wdXRTcGF0aWFsRGltZW5zaW9ucyk6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoNywgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShpbnB1dFNwYXRpYWxEaW1lbnNpb25zKSwgMCkKKworZGVmIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc1N0YXJ0SW5wdXRTcGF0aWFsRGltZW5zaW9uc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6CisgICAgcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoOCwgbnVtRWxlbXMsIDgpCisKK2RlZiBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNBZGRLZXJuZWxJbnB1dEZlYXR1cmVEaW1lbnNpb24oYnVpbGRlciwga2VybmVsSW5wdXRGZWF0dXJlRGltZW5zaW9uKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQ2NFNsb3QoOCwga2VybmVsSW5wdXRGZWF0dXJlRGltZW5zaW9uLCAwKQorCitkZWYgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zQWRkS2VybmVsT3V0cHV0RmVhdHVyZURpbWVuc2lvbihidWlsZGVyLCBrZXJuZWxPdXRwdXRGZWF0dXJlRGltZW5zaW9uKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQ2NFNsb3QoOSwga2VybmVsT3V0cHV0RmVhdHVyZURpbWVuc2lvbiwgMCkKKworZGVmIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc0FkZEtlcm5lbFNwYXRpYWxEaW1lbnNpb25zKGJ1aWxkZXIsIGtlcm5lbFNwYXRpYWxEaW1lbnNpb25zKToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgxMCwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShrZXJuZWxTcGF0aWFsRGltZW5zaW9ucyksIDApCisKK2RlZiBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNTdGFydEtlcm5lbFNwYXRpYWxEaW1lbnNpb25zVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKKyAgICByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig4LCBudW1FbGVtcywgOCkKKworZGVmIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc0FkZE91dHB1dEJhdGNoRGltZW5zaW9uKGJ1aWxkZXIsIG91dHB1dEJhdGNoRGltZW5zaW9uKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQ2NFNsb3QoMTEsIG91dHB1dEJhdGNoRGltZW5zaW9uLCAwKQorCitkZWYgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zQWRkT3V0cHV0RmVhdHVyZURpbWVuc2lvbihidWlsZGVyLCBvdXRwdXRGZWF0dXJlRGltZW5zaW9uKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQ2NFNsb3QoMTIsIG91dHB1dEZlYXR1cmVEaW1lbnNpb24sIDApCisKK2RlZiBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNBZGRPdXRwdXRTcGF0aWFsRGltZW5zaW9ucyhidWlsZGVyLCBvdXRwdXRTcGF0aWFsRGltZW5zaW9ucyk6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMTMsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUob3V0cHV0U3BhdGlhbERpbWVuc2lvbnMpLCAwKQorCitkZWYgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zU3RhcnRPdXRwdXRTcGF0aWFsRGltZW5zaW9uc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6CisgICAgcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoOCwgbnVtRWxlbXMsIDgpCisKK2RlZiBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNBZGRGZWF0dXJlR3JvdXBDb3VudChidWlsZGVyLCBmZWF0dXJlR3JvdXBDb3VudCk6CisgICAgYnVpbGRlci5QcmVwZW5kSW50NjRTbG90KDE0LCBmZWF0dXJlR3JvdXBDb3VudCwgMCkKKworZGVmIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc0FkZEJhdGNoR3JvdXBDb3VudChidWlsZGVyLCBiYXRjaEdyb3VwQ291bnQpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEludDY0U2xvdCgxNSwgYmF0Y2hHcm91cENvdW50LCAwKQorCitkZWYgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zQWRkUHJlY2lzaW9uQ29uZmlnKGJ1aWxkZXIsIHByZWNpc2lvbkNvbmZpZyk6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMTYsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUocHJlY2lzaW9uQ29uZmlnKSwgMCkKKworZGVmIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc1N0YXJ0UHJlY2lzaW9uQ29uZmlnVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKKyAgICByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCkKKworZGVmIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKK3RyeToKKyAgICBmcm9tIHR5cGluZyBpbXBvcnQgTGlzdAorZXhjZXB0OgorICAgIHBhc3MKKworY2xhc3MgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zVChvYmplY3QpOgorCisgICAgIyBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLndpbmRvd1N0cmlkZXMgPSBOb25lICAjIHR5cGU6IExpc3RbaW50XQorICAgICAgICBzZWxmLnBhZGRpbmcgPSBOb25lICAjIHR5cGU6IExpc3RbaW50XQorICAgICAgICBzZWxmLmxoc0RpbGF0aW9uID0gTm9uZSAgIyB0eXBlOiBMaXN0W2ludF0KKyAgICAgICAgc2VsZi5yaHNEaWxhdGlvbiA9IE5vbmUgICMgdHlwZTogTGlzdFtpbnRdCisgICAgICAgIHNlbGYud2luZG93UmV2ZXJzYWwgPSBOb25lICAjIHR5cGU6IExpc3RbYm9vbF0KKyAgICAgICAgc2VsZi5pbnB1dEJhdGNoRGltZW5zaW9uID0gMCAgIyB0eXBlOiBpbnQKKyAgICAgICAgc2VsZi5pbnB1dEZlYXR1cmVEaW1lbnNpb24gPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmlucHV0U3BhdGlhbERpbWVuc2lvbnMgPSBOb25lICAjIHR5cGU6IExpc3RbaW50XQorICAgICAgICBzZWxmLmtlcm5lbElucHV0RmVhdHVyZURpbWVuc2lvbiA9IDAgICMgdHlwZTogaW50CisgICAgICAgIHNlbGYua2VybmVsT3V0cHV0RmVhdHVyZURpbWVuc2lvbiA9IDAgICMgdHlwZTogaW50CisgICAgICAgIHNlbGYua2VybmVsU3BhdGlhbERpbWVuc2lvbnMgPSBOb25lICAjIHR5cGU6IExpc3RbaW50XQorICAgICAgICBzZWxmLm91dHB1dEJhdGNoRGltZW5zaW9uID0gMCAgIyB0eXBlOiBpbnQKKyAgICAgICAgc2VsZi5vdXRwdXRGZWF0dXJlRGltZW5zaW9uID0gMCAgIyB0eXBlOiBpbnQKKyAgICAgICAgc2VsZi5vdXRwdXRTcGF0aWFsRGltZW5zaW9ucyA9IE5vbmUgICMgdHlwZTogTGlzdFtpbnRdCisgICAgICAgIHNlbGYuZmVhdHVyZUdyb3VwQ291bnQgPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmJhdGNoR3JvdXBDb3VudCA9IDAgICMgdHlwZTogaW50CisgICAgICAgIHNlbGYucHJlY2lzaW9uQ29uZmlnID0gTm9uZSAgIyB0eXBlOiBMaXN0W2ludF0KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgc3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zID0gU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zKCkKKyAgICAgICAgc3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooc3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgc3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zKToKKyAgICAgICAgeCA9IFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2soc3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgc3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zKToKKyAgICAgICAgaWYgc3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IHN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucy5XaW5kb3dTdHJpZGVzSXNOb25lKCk6CisgICAgICAgICAgICBpZiBucCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYud2luZG93U3RyaWRlcyA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zLldpbmRvd1N0cmlkZXNMZW5ndGgoKSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYud2luZG93U3RyaWRlcy5hcHBlbmQoc3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zLldpbmRvd1N0cmlkZXMoaSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYud2luZG93U3RyaWRlcyA9IHN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucy5XaW5kb3dTdHJpZGVzQXNOdW1weSgpCisgICAgICAgIGlmIG5vdCBzdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMuUGFkZGluZ0lzTm9uZSgpOgorICAgICAgICAgICAgaWYgbnAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLnBhZGRpbmcgPSBbXQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucy5QYWRkaW5nTGVuZ3RoKCkpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnBhZGRpbmcuYXBwZW5kKHN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucy5QYWRkaW5nKGkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnBhZGRpbmcgPSBzdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMuUGFkZGluZ0FzTnVtcHkoKQorICAgICAgICBpZiBub3Qgc3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zLkxoc0RpbGF0aW9uSXNOb25lKCk6CisgICAgICAgICAgICBpZiBucCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYubGhzRGlsYXRpb24gPSBbXQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucy5MaHNEaWxhdGlvbkxlbmd0aCgpKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5saHNEaWxhdGlvbi5hcHBlbmQoc3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zLkxoc0RpbGF0aW9uKGkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmxoc0RpbGF0aW9uID0gc3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zLkxoc0RpbGF0aW9uQXNOdW1weSgpCisgICAgICAgIGlmIG5vdCBzdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMuUmhzRGlsYXRpb25Jc05vbmUoKToKKyAgICAgICAgICAgIGlmIG5wIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5yaHNEaWxhdGlvbiA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zLlJoc0RpbGF0aW9uTGVuZ3RoKCkpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnJoc0RpbGF0aW9uLmFwcGVuZChzdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMuUmhzRGlsYXRpb24oaSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYucmhzRGlsYXRpb24gPSBzdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMuUmhzRGlsYXRpb25Bc051bXB5KCkKKyAgICAgICAgaWYgbm90IHN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucy5XaW5kb3dSZXZlcnNhbElzTm9uZSgpOgorICAgICAgICAgICAgaWYgbnAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLndpbmRvd1JldmVyc2FsID0gW10KKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShzdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMuV2luZG93UmV2ZXJzYWxMZW5ndGgoKSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYud2luZG93UmV2ZXJzYWwuYXBwZW5kKHN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucy5XaW5kb3dSZXZlcnNhbChpKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi53aW5kb3dSZXZlcnNhbCA9IHN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucy5XaW5kb3dSZXZlcnNhbEFzTnVtcHkoKQorICAgICAgICBzZWxmLmlucHV0QmF0Y2hEaW1lbnNpb24gPSBzdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMuSW5wdXRCYXRjaERpbWVuc2lvbigpCisgICAgICAgIHNlbGYuaW5wdXRGZWF0dXJlRGltZW5zaW9uID0gc3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zLklucHV0RmVhdHVyZURpbWVuc2lvbigpCisgICAgICAgIGlmIG5vdCBzdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMuSW5wdXRTcGF0aWFsRGltZW5zaW9uc0lzTm9uZSgpOgorICAgICAgICAgICAgaWYgbnAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLmlucHV0U3BhdGlhbERpbWVuc2lvbnMgPSBbXQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucy5JbnB1dFNwYXRpYWxEaW1lbnNpb25zTGVuZ3RoKCkpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmlucHV0U3BhdGlhbERpbWVuc2lvbnMuYXBwZW5kKHN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucy5JbnB1dFNwYXRpYWxEaW1lbnNpb25zKGkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmlucHV0U3BhdGlhbERpbWVuc2lvbnMgPSBzdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMuSW5wdXRTcGF0aWFsRGltZW5zaW9uc0FzTnVtcHkoKQorICAgICAgICBzZWxmLmtlcm5lbElucHV0RmVhdHVyZURpbWVuc2lvbiA9IHN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucy5LZXJuZWxJbnB1dEZlYXR1cmVEaW1lbnNpb24oKQorICAgICAgICBzZWxmLmtlcm5lbE91dHB1dEZlYXR1cmVEaW1lbnNpb24gPSBzdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMuS2VybmVsT3V0cHV0RmVhdHVyZURpbWVuc2lvbigpCisgICAgICAgIGlmIG5vdCBzdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMuS2VybmVsU3BhdGlhbERpbWVuc2lvbnNJc05vbmUoKToKKyAgICAgICAgICAgIGlmIG5wIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5rZXJuZWxTcGF0aWFsRGltZW5zaW9ucyA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zLktlcm5lbFNwYXRpYWxEaW1lbnNpb25zTGVuZ3RoKCkpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmtlcm5lbFNwYXRpYWxEaW1lbnNpb25zLmFwcGVuZChzdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMuS2VybmVsU3BhdGlhbERpbWVuc2lvbnMoaSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYua2VybmVsU3BhdGlhbERpbWVuc2lvbnMgPSBzdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMuS2VybmVsU3BhdGlhbERpbWVuc2lvbnNBc051bXB5KCkKKyAgICAgICAgc2VsZi5vdXRwdXRCYXRjaERpbWVuc2lvbiA9IHN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucy5PdXRwdXRCYXRjaERpbWVuc2lvbigpCisgICAgICAgIHNlbGYub3V0cHV0RmVhdHVyZURpbWVuc2lvbiA9IHN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucy5PdXRwdXRGZWF0dXJlRGltZW5zaW9uKCkKKyAgICAgICAgaWYgbm90IHN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucy5PdXRwdXRTcGF0aWFsRGltZW5zaW9uc0lzTm9uZSgpOgorICAgICAgICAgICAgaWYgbnAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLm91dHB1dFNwYXRpYWxEaW1lbnNpb25zID0gW10KKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShzdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMuT3V0cHV0U3BhdGlhbERpbWVuc2lvbnNMZW5ndGgoKSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYub3V0cHV0U3BhdGlhbERpbWVuc2lvbnMuYXBwZW5kKHN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucy5PdXRwdXRTcGF0aWFsRGltZW5zaW9ucyhpKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5vdXRwdXRTcGF0aWFsRGltZW5zaW9ucyA9IHN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucy5PdXRwdXRTcGF0aWFsRGltZW5zaW9uc0FzTnVtcHkoKQorICAgICAgICBzZWxmLmZlYXR1cmVHcm91cENvdW50ID0gc3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zLkZlYXR1cmVHcm91cENvdW50KCkKKyAgICAgICAgc2VsZi5iYXRjaEdyb3VwQ291bnQgPSBzdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMuQmF0Y2hHcm91cENvdW50KCkKKyAgICAgICAgaWYgbm90IHN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucy5QcmVjaXNpb25Db25maWdJc05vbmUoKToKKyAgICAgICAgICAgIGlmIG5wIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5wcmVjaXNpb25Db25maWcgPSBbXQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucy5QcmVjaXNpb25Db25maWdMZW5ndGgoKSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucHJlY2lzaW9uQ29uZmlnLmFwcGVuZChzdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMuUHJlY2lzaW9uQ29uZmlnKGkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnByZWNpc2lvbkNvbmZpZyA9IHN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucy5QcmVjaXNpb25Db25maWdBc051bXB5KCkKKworICAgICMgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBpZiBzZWxmLndpbmRvd1N0cmlkZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBucCBpcyBub3QgTm9uZSBhbmQgdHlwZShzZWxmLndpbmRvd1N0cmlkZXMpIGlzIG5wLm5kYXJyYXk6CisgICAgICAgICAgICAgICAgd2luZG93U3RyaWRlcyA9IGJ1aWxkZXIuQ3JlYXRlTnVtcHlWZWN0b3Ioc2VsZi53aW5kb3dTdHJpZGVzKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNTdGFydFdpbmRvd1N0cmlkZXNWZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYud2luZG93U3RyaWRlcykpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYud2luZG93U3RyaWRlcykpKToKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5QcmVwZW5kSW50NjQoc2VsZi53aW5kb3dTdHJpZGVzW2ldKQorICAgICAgICAgICAgICAgIHdpbmRvd1N0cmlkZXMgPSBidWlsZGVyLkVuZFZlY3RvcigpCisgICAgICAgIGlmIHNlbGYucGFkZGluZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG5wIGlzIG5vdCBOb25lIGFuZCB0eXBlKHNlbGYucGFkZGluZykgaXMgbnAubmRhcnJheToKKyAgICAgICAgICAgICAgICBwYWRkaW5nID0gYnVpbGRlci5DcmVhdGVOdW1weVZlY3RvcihzZWxmLnBhZGRpbmcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc1N0YXJ0UGFkZGluZ1ZlY3RvcihidWlsZGVyLCBsZW4oc2VsZi5wYWRkaW5nKSkKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShsZW4oc2VsZi5wYWRkaW5nKSkpOgorICAgICAgICAgICAgICAgICAgICBidWlsZGVyLlByZXBlbmRJbnQ2NChzZWxmLnBhZGRpbmdbaV0pCisgICAgICAgICAgICAgICAgcGFkZGluZyA9IGJ1aWxkZXIuRW5kVmVjdG9yKCkKKyAgICAgICAgaWYgc2VsZi5saHNEaWxhdGlvbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG5wIGlzIG5vdCBOb25lIGFuZCB0eXBlKHNlbGYubGhzRGlsYXRpb24pIGlzIG5wLm5kYXJyYXk6CisgICAgICAgICAgICAgICAgbGhzRGlsYXRpb24gPSBidWlsZGVyLkNyZWF0ZU51bXB5VmVjdG9yKHNlbGYubGhzRGlsYXRpb24pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc1N0YXJ0TGhzRGlsYXRpb25WZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYubGhzRGlsYXRpb24pKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLmxoc0RpbGF0aW9uKSkpOgorICAgICAgICAgICAgICAgICAgICBidWlsZGVyLlByZXBlbmRJbnQ2NChzZWxmLmxoc0RpbGF0aW9uW2ldKQorICAgICAgICAgICAgICAgIGxoc0RpbGF0aW9uID0gYnVpbGRlci5FbmRWZWN0b3IoKQorICAgICAgICBpZiBzZWxmLnJoc0RpbGF0aW9uIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbnAgaXMgbm90IE5vbmUgYW5kIHR5cGUoc2VsZi5yaHNEaWxhdGlvbikgaXMgbnAubmRhcnJheToKKyAgICAgICAgICAgICAgICByaHNEaWxhdGlvbiA9IGJ1aWxkZXIuQ3JlYXRlTnVtcHlWZWN0b3Ioc2VsZi5yaHNEaWxhdGlvbikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zU3RhcnRSaHNEaWxhdGlvblZlY3RvcihidWlsZGVyLCBsZW4oc2VsZi5yaHNEaWxhdGlvbikpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYucmhzRGlsYXRpb24pKSk6CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZEludDY0KHNlbGYucmhzRGlsYXRpb25baV0pCisgICAgICAgICAgICAgICAgcmhzRGlsYXRpb24gPSBidWlsZGVyLkVuZFZlY3RvcigpCisgICAgICAgIGlmIHNlbGYud2luZG93UmV2ZXJzYWwgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBucCBpcyBub3QgTm9uZSBhbmQgdHlwZShzZWxmLndpbmRvd1JldmVyc2FsKSBpcyBucC5uZGFycmF5OgorICAgICAgICAgICAgICAgIHdpbmRvd1JldmVyc2FsID0gYnVpbGRlci5DcmVhdGVOdW1weVZlY3RvcihzZWxmLndpbmRvd1JldmVyc2FsKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNTdGFydFdpbmRvd1JldmVyc2FsVmVjdG9yKGJ1aWxkZXIsIGxlbihzZWxmLndpbmRvd1JldmVyc2FsKSkKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShsZW4oc2VsZi53aW5kb3dSZXZlcnNhbCkpKToKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5QcmVwZW5kQm9vbChzZWxmLndpbmRvd1JldmVyc2FsW2ldKQorICAgICAgICAgICAgICAgIHdpbmRvd1JldmVyc2FsID0gYnVpbGRlci5FbmRWZWN0b3IoKQorICAgICAgICBpZiBzZWxmLmlucHV0U3BhdGlhbERpbWVuc2lvbnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBucCBpcyBub3QgTm9uZSBhbmQgdHlwZShzZWxmLmlucHV0U3BhdGlhbERpbWVuc2lvbnMpIGlzIG5wLm5kYXJyYXk6CisgICAgICAgICAgICAgICAgaW5wdXRTcGF0aWFsRGltZW5zaW9ucyA9IGJ1aWxkZXIuQ3JlYXRlTnVtcHlWZWN0b3Ioc2VsZi5pbnB1dFNwYXRpYWxEaW1lbnNpb25zKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNTdGFydElucHV0U3BhdGlhbERpbWVuc2lvbnNWZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYuaW5wdXRTcGF0aWFsRGltZW5zaW9ucykpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYuaW5wdXRTcGF0aWFsRGltZW5zaW9ucykpKToKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5QcmVwZW5kSW50NjQoc2VsZi5pbnB1dFNwYXRpYWxEaW1lbnNpb25zW2ldKQorICAgICAgICAgICAgICAgIGlucHV0U3BhdGlhbERpbWVuc2lvbnMgPSBidWlsZGVyLkVuZFZlY3RvcigpCisgICAgICAgIGlmIHNlbGYua2VybmVsU3BhdGlhbERpbWVuc2lvbnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBucCBpcyBub3QgTm9uZSBhbmQgdHlwZShzZWxmLmtlcm5lbFNwYXRpYWxEaW1lbnNpb25zKSBpcyBucC5uZGFycmF5OgorICAgICAgICAgICAgICAgIGtlcm5lbFNwYXRpYWxEaW1lbnNpb25zID0gYnVpbGRlci5DcmVhdGVOdW1weVZlY3RvcihzZWxmLmtlcm5lbFNwYXRpYWxEaW1lbnNpb25zKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNTdGFydEtlcm5lbFNwYXRpYWxEaW1lbnNpb25zVmVjdG9yKGJ1aWxkZXIsIGxlbihzZWxmLmtlcm5lbFNwYXRpYWxEaW1lbnNpb25zKSkKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShsZW4oc2VsZi5rZXJuZWxTcGF0aWFsRGltZW5zaW9ucykpKToKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5QcmVwZW5kSW50NjQoc2VsZi5rZXJuZWxTcGF0aWFsRGltZW5zaW9uc1tpXSkKKyAgICAgICAgICAgICAgICBrZXJuZWxTcGF0aWFsRGltZW5zaW9ucyA9IGJ1aWxkZXIuRW5kVmVjdG9yKCkKKyAgICAgICAgaWYgc2VsZi5vdXRwdXRTcGF0aWFsRGltZW5zaW9ucyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG5wIGlzIG5vdCBOb25lIGFuZCB0eXBlKHNlbGYub3V0cHV0U3BhdGlhbERpbWVuc2lvbnMpIGlzIG5wLm5kYXJyYXk6CisgICAgICAgICAgICAgICAgb3V0cHV0U3BhdGlhbERpbWVuc2lvbnMgPSBidWlsZGVyLkNyZWF0ZU51bXB5VmVjdG9yKHNlbGYub3V0cHV0U3BhdGlhbERpbWVuc2lvbnMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc1N0YXJ0T3V0cHV0U3BhdGlhbERpbWVuc2lvbnNWZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYub3V0cHV0U3BhdGlhbERpbWVuc2lvbnMpKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLm91dHB1dFNwYXRpYWxEaW1lbnNpb25zKSkpOgorICAgICAgICAgICAgICAgICAgICBidWlsZGVyLlByZXBlbmRJbnQ2NChzZWxmLm91dHB1dFNwYXRpYWxEaW1lbnNpb25zW2ldKQorICAgICAgICAgICAgICAgIG91dHB1dFNwYXRpYWxEaW1lbnNpb25zID0gYnVpbGRlci5FbmRWZWN0b3IoKQorICAgICAgICBpZiBzZWxmLnByZWNpc2lvbkNvbmZpZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG5wIGlzIG5vdCBOb25lIGFuZCB0eXBlKHNlbGYucHJlY2lzaW9uQ29uZmlnKSBpcyBucC5uZGFycmF5OgorICAgICAgICAgICAgICAgIHByZWNpc2lvbkNvbmZpZyA9IGJ1aWxkZXIuQ3JlYXRlTnVtcHlWZWN0b3Ioc2VsZi5wcmVjaXNpb25Db25maWcpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc1N0YXJ0UHJlY2lzaW9uQ29uZmlnVmVjdG9yKGJ1aWxkZXIsIGxlbihzZWxmLnByZWNpc2lvbkNvbmZpZykpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYucHJlY2lzaW9uQ29uZmlnKSkpOgorICAgICAgICAgICAgICAgICAgICBidWlsZGVyLlByZXBlbmRVaW50MzIoc2VsZi5wcmVjaXNpb25Db25maWdbaV0pCisgICAgICAgICAgICAgICAgcHJlY2lzaW9uQ29uZmlnID0gYnVpbGRlci5FbmRWZWN0b3IoKQorICAgICAgICBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICBpZiBzZWxmLndpbmRvd1N0cmlkZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNBZGRXaW5kb3dTdHJpZGVzKGJ1aWxkZXIsIHdpbmRvd1N0cmlkZXMpCisgICAgICAgIGlmIHNlbGYucGFkZGluZyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc0FkZFBhZGRpbmcoYnVpbGRlciwgcGFkZGluZykKKyAgICAgICAgaWYgc2VsZi5saHNEaWxhdGlvbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc0FkZExoc0RpbGF0aW9uKGJ1aWxkZXIsIGxoc0RpbGF0aW9uKQorICAgICAgICBpZiBzZWxmLnJoc0RpbGF0aW9uIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zQWRkUmhzRGlsYXRpb24oYnVpbGRlciwgcmhzRGlsYXRpb24pCisgICAgICAgIGlmIHNlbGYud2luZG93UmV2ZXJzYWwgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNBZGRXaW5kb3dSZXZlcnNhbChidWlsZGVyLCB3aW5kb3dSZXZlcnNhbCkKKyAgICAgICAgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zQWRkSW5wdXRCYXRjaERpbWVuc2lvbihidWlsZGVyLCBzZWxmLmlucHV0QmF0Y2hEaW1lbnNpb24pCisgICAgICAgIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc0FkZElucHV0RmVhdHVyZURpbWVuc2lvbihidWlsZGVyLCBzZWxmLmlucHV0RmVhdHVyZURpbWVuc2lvbikKKyAgICAgICAgaWYgc2VsZi5pbnB1dFNwYXRpYWxEaW1lbnNpb25zIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zQWRkSW5wdXRTcGF0aWFsRGltZW5zaW9ucyhidWlsZGVyLCBpbnB1dFNwYXRpYWxEaW1lbnNpb25zKQorICAgICAgICBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNBZGRLZXJuZWxJbnB1dEZlYXR1cmVEaW1lbnNpb24oYnVpbGRlciwgc2VsZi5rZXJuZWxJbnB1dEZlYXR1cmVEaW1lbnNpb24pCisgICAgICAgIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc0FkZEtlcm5lbE91dHB1dEZlYXR1cmVEaW1lbnNpb24oYnVpbGRlciwgc2VsZi5rZXJuZWxPdXRwdXRGZWF0dXJlRGltZW5zaW9uKQorICAgICAgICBpZiBzZWxmLmtlcm5lbFNwYXRpYWxEaW1lbnNpb25zIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zQWRkS2VybmVsU3BhdGlhbERpbWVuc2lvbnMoYnVpbGRlciwga2VybmVsU3BhdGlhbERpbWVuc2lvbnMpCisgICAgICAgIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc0FkZE91dHB1dEJhdGNoRGltZW5zaW9uKGJ1aWxkZXIsIHNlbGYub3V0cHV0QmF0Y2hEaW1lbnNpb24pCisgICAgICAgIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc0FkZE91dHB1dEZlYXR1cmVEaW1lbnNpb24oYnVpbGRlciwgc2VsZi5vdXRwdXRGZWF0dXJlRGltZW5zaW9uKQorICAgICAgICBpZiBzZWxmLm91dHB1dFNwYXRpYWxEaW1lbnNpb25zIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zQWRkT3V0cHV0U3BhdGlhbERpbWVuc2lvbnMoYnVpbGRlciwgb3V0cHV0U3BhdGlhbERpbWVuc2lvbnMpCisgICAgICAgIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc0FkZEZlYXR1cmVHcm91cENvdW50KGJ1aWxkZXIsIHNlbGYuZmVhdHVyZUdyb3VwQ291bnQpCisgICAgICAgIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc0FkZEJhdGNoR3JvdXBDb3VudChidWlsZGVyLCBzZWxmLmJhdGNoR3JvdXBDb3VudCkKKyAgICAgICAgaWYgc2VsZi5wcmVjaXNpb25Db25maWcgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNBZGRQcmVjaXNpb25Db25maWcoYnVpbGRlciwgcHJlY2lzaW9uQ29uZmlnKQorICAgICAgICBzdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMgPSBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucworCisKK2NsYXNzIFN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gU3RhYmxlaGxvU2NhdHRlck9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc1N0YWJsZWhsb1NjYXR0ZXJPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgorICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgU3RhYmxlaGxvU2NhdHRlck9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworICAgICMgU3RhYmxlaGxvU2NhdHRlck9wdGlvbnMKKyAgICBkZWYgSW5kaWNlc0FyZVNvcnRlZChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuQm9vbEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykpCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgIyBTdGFibGVobG9TY2F0dGVyT3B0aW9ucworICAgIGRlZiBVcGRhdGVXaW5kb3dEaW1zKHNlbGYsIGopOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICBhID0gc2VsZi5fdGFiLlZlY3RvcihvKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDY0RmxhZ3MsIGEgKyBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGogKiA4KSkKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvU2NhdHRlck9wdGlvbnMKKyAgICBkZWYgVXBkYXRlV2luZG93RGltc0FzTnVtcHkoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0VmVjdG9yQXNOdW1weShmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgbykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvU2NhdHRlck9wdGlvbnMKKyAgICBkZWYgVXBkYXRlV2luZG93RGltc0xlbmd0aChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvU2NhdHRlck9wdGlvbnMKKyAgICBkZWYgVXBkYXRlV2luZG93RGltc0lzTm9uZShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKKyAgICAgICAgcmV0dXJuIG8gPT0gMAorCisgICAgIyBTdGFibGVobG9TY2F0dGVyT3B0aW9ucworICAgIGRlZiBJbnNlcnRlZFdpbmRvd0RpbXMoc2VsZiwgaik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIGEgPSBzZWxmLl90YWIuVmVjdG9yKG8pCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgYSArIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaiAqIDgpKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9TY2F0dGVyT3B0aW9ucworICAgIGRlZiBJbnNlcnRlZFdpbmRvd0RpbXNBc051bXB5KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldFZlY3RvckFzTnVtcHkoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDY0RmxhZ3MsIG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zCisgICAgZGVmIEluc2VydGVkV2luZG93RGltc0xlbmd0aChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg4KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlaGxvU2NhdHRlck9wdGlvbnMKKyAgICBkZWYgSW5zZXJ0ZWRXaW5kb3dEaW1zSXNOb25lKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQorICAgICAgICByZXR1cm4gbyA9PSAwCisKKyAgICAjIFN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zCisgICAgZGVmIFNjYXR0ZXJEaW1zVG9PcGVyYW5kRGltcyhzZWxmLCBqKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIGEgPSBzZWxmLl90YWIuVmVjdG9yKG8pCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgYSArIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaiAqIDgpKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9TY2F0dGVyT3B0aW9ucworICAgIGRlZiBTY2F0dGVyRGltc1RvT3BlcmFuZERpbXNBc051bXB5KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEwKSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXRWZWN0b3JBc051bXB5KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ2NEZsYWdzLCBvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9TY2F0dGVyT3B0aW9ucworICAgIGRlZiBTY2F0dGVyRGltc1RvT3BlcmFuZERpbXNMZW5ndGgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTApKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlZlY3RvckxlbihvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9TY2F0dGVyT3B0aW9ucworICAgIGRlZiBTY2F0dGVyRGltc1RvT3BlcmFuZERpbXNJc05vbmUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTApKQorICAgICAgICByZXR1cm4gbyA9PSAwCisKKyAgICAjIFN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zCisgICAgZGVmIEluZGV4VmVjdG9yRGltKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEyKSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDY0RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVobG9TY2F0dGVyT3B0aW9ucworICAgIGRlZiBVbmlxdWVJbmRpY2VzKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDE0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuQm9vbEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykpCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgIyBTdGFibGVobG9TY2F0dGVyT3B0aW9ucworICAgIGRlZiBVcGRhdGVDb21wdXRhdGlvblN1YmdyYXBoSW5kZXgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTYpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKK2RlZiBTdGFibGVobG9TY2F0dGVyT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoNykKKworZGVmIFN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zQWRkSW5kaWNlc0FyZVNvcnRlZChidWlsZGVyLCBpbmRpY2VzQXJlU29ydGVkKToKKyAgICBidWlsZGVyLlByZXBlbmRCb29sU2xvdCgwLCBpbmRpY2VzQXJlU29ydGVkLCAwKQorCitkZWYgU3RhYmxlaGxvU2NhdHRlck9wdGlvbnNBZGRVcGRhdGVXaW5kb3dEaW1zKGJ1aWxkZXIsIHVwZGF0ZVdpbmRvd0RpbXMpOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDEsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUodXBkYXRlV2luZG93RGltcyksIDApCisKK2RlZiBTdGFibGVobG9TY2F0dGVyT3B0aW9uc1N0YXJ0VXBkYXRlV2luZG93RGltc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6CisgICAgcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoOCwgbnVtRWxlbXMsIDgpCisKK2RlZiBTdGFibGVobG9TY2F0dGVyT3B0aW9uc0FkZEluc2VydGVkV2luZG93RGltcyhidWlsZGVyLCBpbnNlcnRlZFdpbmRvd0RpbXMpOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDIsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaW5zZXJ0ZWRXaW5kb3dEaW1zKSwgMCkKKworZGVmIFN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zU3RhcnRJbnNlcnRlZFdpbmRvd0RpbXNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgorICAgIHJldHVybiBidWlsZGVyLlN0YXJ0VmVjdG9yKDgsIG51bUVsZW1zLCA4KQorCitkZWYgU3RhYmxlaGxvU2NhdHRlck9wdGlvbnNBZGRTY2F0dGVyRGltc1RvT3BlcmFuZERpbXMoYnVpbGRlciwgc2NhdHRlckRpbXNUb09wZXJhbmREaW1zKToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgzLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNjYXR0ZXJEaW1zVG9PcGVyYW5kRGltcyksIDApCisKK2RlZiBTdGFibGVobG9TY2F0dGVyT3B0aW9uc1N0YXJ0U2NhdHRlckRpbXNUb09wZXJhbmREaW1zVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKKyAgICByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig4LCBudW1FbGVtcywgOCkKKworZGVmIFN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zQWRkSW5kZXhWZWN0b3JEaW0oYnVpbGRlciwgaW5kZXhWZWN0b3JEaW0pOgorICAgIGJ1aWxkZXIuUHJlcGVuZEludDY0U2xvdCg0LCBpbmRleFZlY3RvckRpbSwgMCkKKworZGVmIFN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zQWRkVW5pcXVlSW5kaWNlcyhidWlsZGVyLCB1bmlxdWVJbmRpY2VzKToKKyAgICBidWlsZGVyLlByZXBlbmRCb29sU2xvdCg1LCB1bmlxdWVJbmRpY2VzLCAwKQorCitkZWYgU3RhYmxlaGxvU2NhdHRlck9wdGlvbnNBZGRVcGRhdGVDb21wdXRhdGlvblN1YmdyYXBoSW5kZXgoYnVpbGRlciwgdXBkYXRlQ29tcHV0YXRpb25TdWJncmFwaEluZGV4KToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoNiwgdXBkYXRlQ29tcHV0YXRpb25TdWJncmFwaEluZGV4LCAwKQorCitkZWYgU3RhYmxlaGxvU2NhdHRlck9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCit0cnk6CisgICAgZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QKK2V4Y2VwdDoKKyAgICBwYXNzCisKK2NsYXNzIFN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBTdGFibGVobG9TY2F0dGVyT3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuaW5kaWNlc0FyZVNvcnRlZCA9IEZhbHNlICAjIHR5cGU6IGJvb2wKKyAgICAgICAgc2VsZi51cGRhdGVXaW5kb3dEaW1zID0gTm9uZSAgIyB0eXBlOiBMaXN0W2ludF0KKyAgICAgICAgc2VsZi5pbnNlcnRlZFdpbmRvd0RpbXMgPSBOb25lICAjIHR5cGU6IExpc3RbaW50XQorICAgICAgICBzZWxmLnNjYXR0ZXJEaW1zVG9PcGVyYW5kRGltcyA9IE5vbmUgICMgdHlwZTogTGlzdFtpbnRdCisgICAgICAgIHNlbGYuaW5kZXhWZWN0b3JEaW0gPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLnVuaXF1ZUluZGljZXMgPSBGYWxzZSAgIyB0eXBlOiBib29sCisgICAgICAgIHNlbGYudXBkYXRlQ29tcHV0YXRpb25TdWJncmFwaEluZGV4ID0gMCAgIyB0eXBlOiBpbnQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgc3RhYmxlaGxvU2NhdHRlck9wdGlvbnMgPSBTdGFibGVobG9TY2F0dGVyT3B0aW9ucygpCisgICAgICAgIHN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooc3RhYmxlaGxvU2NhdHRlck9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzdGFibGVobG9TY2F0dGVyT3B0aW9ucyk6CisgICAgICAgIHggPSBTdGFibGVobG9TY2F0dGVyT3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2soc3RhYmxlaGxvU2NhdHRlck9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIHN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zKToKKyAgICAgICAgaWYgc3RhYmxlaGxvU2NhdHRlck9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmluZGljZXNBcmVTb3J0ZWQgPSBzdGFibGVobG9TY2F0dGVyT3B0aW9ucy5JbmRpY2VzQXJlU29ydGVkKCkKKyAgICAgICAgaWYgbm90IHN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zLlVwZGF0ZVdpbmRvd0RpbXNJc05vbmUoKToKKyAgICAgICAgICAgIGlmIG5wIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVXaW5kb3dEaW1zID0gW10KKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShzdGFibGVobG9TY2F0dGVyT3B0aW9ucy5VcGRhdGVXaW5kb3dEaW1zTGVuZ3RoKCkpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnVwZGF0ZVdpbmRvd0RpbXMuYXBwZW5kKHN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zLlVwZGF0ZVdpbmRvd0RpbXMoaSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlV2luZG93RGltcyA9IHN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zLlVwZGF0ZVdpbmRvd0RpbXNBc051bXB5KCkKKyAgICAgICAgaWYgbm90IHN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zLkluc2VydGVkV2luZG93RGltc0lzTm9uZSgpOgorICAgICAgICAgICAgaWYgbnAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLmluc2VydGVkV2luZG93RGltcyA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc3RhYmxlaGxvU2NhdHRlck9wdGlvbnMuSW5zZXJ0ZWRXaW5kb3dEaW1zTGVuZ3RoKCkpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmluc2VydGVkV2luZG93RGltcy5hcHBlbmQoc3RhYmxlaGxvU2NhdHRlck9wdGlvbnMuSW5zZXJ0ZWRXaW5kb3dEaW1zKGkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmluc2VydGVkV2luZG93RGltcyA9IHN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zLkluc2VydGVkV2luZG93RGltc0FzTnVtcHkoKQorICAgICAgICBpZiBub3Qgc3RhYmxlaGxvU2NhdHRlck9wdGlvbnMuU2NhdHRlckRpbXNUb09wZXJhbmREaW1zSXNOb25lKCk6CisgICAgICAgICAgICBpZiBucCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuc2NhdHRlckRpbXNUb09wZXJhbmREaW1zID0gW10KKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShzdGFibGVobG9TY2F0dGVyT3B0aW9ucy5TY2F0dGVyRGltc1RvT3BlcmFuZERpbXNMZW5ndGgoKSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2NhdHRlckRpbXNUb09wZXJhbmREaW1zLmFwcGVuZChzdGFibGVobG9TY2F0dGVyT3B0aW9ucy5TY2F0dGVyRGltc1RvT3BlcmFuZERpbXMoaSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuc2NhdHRlckRpbXNUb09wZXJhbmREaW1zID0gc3RhYmxlaGxvU2NhdHRlck9wdGlvbnMuU2NhdHRlckRpbXNUb09wZXJhbmREaW1zQXNOdW1weSgpCisgICAgICAgIHNlbGYuaW5kZXhWZWN0b3JEaW0gPSBzdGFibGVobG9TY2F0dGVyT3B0aW9ucy5JbmRleFZlY3RvckRpbSgpCisgICAgICAgIHNlbGYudW5pcXVlSW5kaWNlcyA9IHN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zLlVuaXF1ZUluZGljZXMoKQorICAgICAgICBzZWxmLnVwZGF0ZUNvbXB1dGF0aW9uU3ViZ3JhcGhJbmRleCA9IHN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zLlVwZGF0ZUNvbXB1dGF0aW9uU3ViZ3JhcGhJbmRleCgpCisKKyAgICAjIFN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBpZiBzZWxmLnVwZGF0ZVdpbmRvd0RpbXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBucCBpcyBub3QgTm9uZSBhbmQgdHlwZShzZWxmLnVwZGF0ZVdpbmRvd0RpbXMpIGlzIG5wLm5kYXJyYXk6CisgICAgICAgICAgICAgICAgdXBkYXRlV2luZG93RGltcyA9IGJ1aWxkZXIuQ3JlYXRlTnVtcHlWZWN0b3Ioc2VsZi51cGRhdGVXaW5kb3dEaW1zKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBTdGFibGVobG9TY2F0dGVyT3B0aW9uc1N0YXJ0VXBkYXRlV2luZG93RGltc1ZlY3RvcihidWlsZGVyLCBsZW4oc2VsZi51cGRhdGVXaW5kb3dEaW1zKSkKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShsZW4oc2VsZi51cGRhdGVXaW5kb3dEaW1zKSkpOgorICAgICAgICAgICAgICAgICAgICBidWlsZGVyLlByZXBlbmRJbnQ2NChzZWxmLnVwZGF0ZVdpbmRvd0RpbXNbaV0pCisgICAgICAgICAgICAgICAgdXBkYXRlV2luZG93RGltcyA9IGJ1aWxkZXIuRW5kVmVjdG9yKCkKKyAgICAgICAgaWYgc2VsZi5pbnNlcnRlZFdpbmRvd0RpbXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBucCBpcyBub3QgTm9uZSBhbmQgdHlwZShzZWxmLmluc2VydGVkV2luZG93RGltcykgaXMgbnAubmRhcnJheToKKyAgICAgICAgICAgICAgICBpbnNlcnRlZFdpbmRvd0RpbXMgPSBidWlsZGVyLkNyZWF0ZU51bXB5VmVjdG9yKHNlbGYuaW5zZXJ0ZWRXaW5kb3dEaW1zKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBTdGFibGVobG9TY2F0dGVyT3B0aW9uc1N0YXJ0SW5zZXJ0ZWRXaW5kb3dEaW1zVmVjdG9yKGJ1aWxkZXIsIGxlbihzZWxmLmluc2VydGVkV2luZG93RGltcykpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYuaW5zZXJ0ZWRXaW5kb3dEaW1zKSkpOgorICAgICAgICAgICAgICAgICAgICBidWlsZGVyLlByZXBlbmRJbnQ2NChzZWxmLmluc2VydGVkV2luZG93RGltc1tpXSkKKyAgICAgICAgICAgICAgICBpbnNlcnRlZFdpbmRvd0RpbXMgPSBidWlsZGVyLkVuZFZlY3RvcigpCisgICAgICAgIGlmIHNlbGYuc2NhdHRlckRpbXNUb09wZXJhbmREaW1zIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbnAgaXMgbm90IE5vbmUgYW5kIHR5cGUoc2VsZi5zY2F0dGVyRGltc1RvT3BlcmFuZERpbXMpIGlzIG5wLm5kYXJyYXk6CisgICAgICAgICAgICAgICAgc2NhdHRlckRpbXNUb09wZXJhbmREaW1zID0gYnVpbGRlci5DcmVhdGVOdW1weVZlY3RvcihzZWxmLnNjYXR0ZXJEaW1zVG9PcGVyYW5kRGltcykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgU3RhYmxlaGxvU2NhdHRlck9wdGlvbnNTdGFydFNjYXR0ZXJEaW1zVG9PcGVyYW5kRGltc1ZlY3RvcihidWlsZGVyLCBsZW4oc2VsZi5zY2F0dGVyRGltc1RvT3BlcmFuZERpbXMpKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLnNjYXR0ZXJEaW1zVG9PcGVyYW5kRGltcykpKToKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5QcmVwZW5kSW50NjQoc2VsZi5zY2F0dGVyRGltc1RvT3BlcmFuZERpbXNbaV0pCisgICAgICAgICAgICAgICAgc2NhdHRlckRpbXNUb09wZXJhbmREaW1zID0gYnVpbGRlci5FbmRWZWN0b3IoKQorICAgICAgICBTdGFibGVobG9TY2F0dGVyT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIFN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zQWRkSW5kaWNlc0FyZVNvcnRlZChidWlsZGVyLCBzZWxmLmluZGljZXNBcmVTb3J0ZWQpCisgICAgICAgIGlmIHNlbGYudXBkYXRlV2luZG93RGltcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIFN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zQWRkVXBkYXRlV2luZG93RGltcyhidWlsZGVyLCB1cGRhdGVXaW5kb3dEaW1zKQorICAgICAgICBpZiBzZWxmLmluc2VydGVkV2luZG93RGltcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIFN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zQWRkSW5zZXJ0ZWRXaW5kb3dEaW1zKGJ1aWxkZXIsIGluc2VydGVkV2luZG93RGltcykKKyAgICAgICAgaWYgc2VsZi5zY2F0dGVyRGltc1RvT3BlcmFuZERpbXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBTdGFibGVobG9TY2F0dGVyT3B0aW9uc0FkZFNjYXR0ZXJEaW1zVG9PcGVyYW5kRGltcyhidWlsZGVyLCBzY2F0dGVyRGltc1RvT3BlcmFuZERpbXMpCisgICAgICAgIFN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zQWRkSW5kZXhWZWN0b3JEaW0oYnVpbGRlciwgc2VsZi5pbmRleFZlY3RvckRpbSkKKyAgICAgICAgU3RhYmxlaGxvU2NhdHRlck9wdGlvbnNBZGRVbmlxdWVJbmRpY2VzKGJ1aWxkZXIsIHNlbGYudW5pcXVlSW5kaWNlcykKKyAgICAgICAgU3RhYmxlaGxvU2NhdHRlck9wdGlvbnNBZGRVcGRhdGVDb21wdXRhdGlvblN1YmdyYXBoSW5kZXgoYnVpbGRlciwgc2VsZi51cGRhdGVDb21wdXRhdGlvblN1YmdyYXBoSW5kZXgpCisgICAgICAgIHN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zID0gU3RhYmxlaGxvU2NhdHRlck9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zCisKKworY2xhc3MgU3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IFN0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc1N0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBTdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBTdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworICAgICMgU3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9ucworICAgIGRlZiBBbGdvcml0aG0oc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCitkZWYgU3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMSkKKworZGVmIFN0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnNBZGRBbGdvcml0aG0oYnVpbGRlciwgYWxnb3JpdGhtKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCgwLCBhbGdvcml0aG0sIDApCisKK2RlZiBTdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBTdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBTdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5hbGdvcml0aG0gPSAwICAjIHR5cGU6IGludAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICBzdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zID0gU3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9ucygpCisgICAgICAgIHN0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihzdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgc3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9ucyk6CisgICAgICAgIHggPSBTdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhzdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBTdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIHN0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnMpOgorICAgICAgICBpZiBzdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5hbGdvcml0aG0gPSBzdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zLkFsZ29yaXRobSgpCisKKyAgICAjIFN0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIFN0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICBTdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zQWRkQWxnb3JpdGhtKGJ1aWxkZXIsIHNlbGYuYWxnb3JpdGhtKQorICAgICAgICBzdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zID0gU3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gc3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9ucworCisKK2NsYXNzIENvbnYyRE9wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBDb252MkRPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNDb252MkRPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgorICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgQ29udjJET3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgQ29udjJET3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKKyAgICAjIENvbnYyRE9wdGlvbnMKKyAgICBkZWYgUGFkZGluZyhzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDhGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIENvbnYyRE9wdGlvbnMKKyAgICBkZWYgU3RyaWRlVyhzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBDb252MkRPcHRpb25zCisgICAgZGVmIFN0cmlkZUgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgQ29udjJET3B0aW9ucworICAgIGRlZiBGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBDb252MkRPcHRpb25zCisgICAgZGVmIERpbGF0aW9uV0ZhY3RvcihzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDEKKworICAgICMgQ29udjJET3B0aW9ucworICAgIGRlZiBEaWxhdGlvbkhGYWN0b3Ioc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAxCisKKyAgICAjIENvbnYyRE9wdGlvbnMKKyAgICBkZWYgUXVhbnRpemVkQmlhc1R5cGUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTYpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50OEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworZGVmIENvbnYyRE9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDcpCisKK2RlZiBDb252MkRPcHRpb25zQWRkUGFkZGluZyhidWlsZGVyLCBwYWRkaW5nKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCgwLCBwYWRkaW5nLCAwKQorCitkZWYgQ29udjJET3B0aW9uc0FkZFN0cmlkZVcoYnVpbGRlciwgc3RyaWRlVyk6CisgICAgYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDEsIHN0cmlkZVcsIDApCisKK2RlZiBDb252MkRPcHRpb25zQWRkU3RyaWRlSChidWlsZGVyLCBzdHJpZGVIKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMiwgc3RyaWRlSCwgMCkKKworZGVmIENvbnYyRE9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbik6CisgICAgYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoMywgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24sIDApCisKK2RlZiBDb252MkRPcHRpb25zQWRkRGlsYXRpb25XRmFjdG9yKGJ1aWxkZXIsIGRpbGF0aW9uV0ZhY3Rvcik6CisgICAgYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDQsIGRpbGF0aW9uV0ZhY3RvciwgMSkKKworZGVmIENvbnYyRE9wdGlvbnNBZGREaWxhdGlvbkhGYWN0b3IoYnVpbGRlciwgZGlsYXRpb25IRmFjdG9yKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoNSwgZGlsYXRpb25IRmFjdG9yLCAxKQorCitkZWYgQ29udjJET3B0aW9uc0FkZFF1YW50aXplZEJpYXNUeXBlKGJ1aWxkZXIsIHF1YW50aXplZEJpYXNUeXBlKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCg2LCBxdWFudGl6ZWRCaWFzVHlwZSwgMCkKKworZGVmIENvbnYyRE9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIENvbnYyRE9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIENvbnYyRE9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnBhZGRpbmcgPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLnN0cmlkZVcgPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLnN0cmlkZUggPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uID0gMCAgIyB0eXBlOiBpbnQKKyAgICAgICAgc2VsZi5kaWxhdGlvbldGYWN0b3IgPSAxICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmRpbGF0aW9uSEZhY3RvciA9IDEgICMgdHlwZTogaW50CisgICAgICAgIHNlbGYucXVhbnRpemVkQmlhc1R5cGUgPSAwICAjIHR5cGU6IGludAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICBjb252MkRvcHRpb25zID0gQ29udjJET3B0aW9ucygpCisgICAgICAgIGNvbnYyRG9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihjb252MkRvcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgY29udjJEb3B0aW9ucyk6CisgICAgICAgIHggPSBDb252MkRPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhjb252MkRvcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBDb252MkRPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIGNvbnYyRG9wdGlvbnMpOgorICAgICAgICBpZiBjb252MkRvcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5wYWRkaW5nID0gY29udjJEb3B0aW9ucy5QYWRkaW5nKCkKKyAgICAgICAgc2VsZi5zdHJpZGVXID0gY29udjJEb3B0aW9ucy5TdHJpZGVXKCkKKyAgICAgICAgc2VsZi5zdHJpZGVIID0gY29udjJEb3B0aW9ucy5TdHJpZGVIKCkKKyAgICAgICAgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbiA9IGNvbnYyRG9wdGlvbnMuRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oKQorICAgICAgICBzZWxmLmRpbGF0aW9uV0ZhY3RvciA9IGNvbnYyRG9wdGlvbnMuRGlsYXRpb25XRmFjdG9yKCkKKyAgICAgICAgc2VsZi5kaWxhdGlvbkhGYWN0b3IgPSBjb252MkRvcHRpb25zLkRpbGF0aW9uSEZhY3RvcigpCisgICAgICAgIHNlbGYucXVhbnRpemVkQmlhc1R5cGUgPSBjb252MkRvcHRpb25zLlF1YW50aXplZEJpYXNUeXBlKCkKKworICAgICMgQ29udjJET3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgQ29udjJET3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIENvbnYyRE9wdGlvbnNBZGRQYWRkaW5nKGJ1aWxkZXIsIHNlbGYucGFkZGluZykKKyAgICAgICAgQ29udjJET3B0aW9uc0FkZFN0cmlkZVcoYnVpbGRlciwgc2VsZi5zdHJpZGVXKQorICAgICAgICBDb252MkRPcHRpb25zQWRkU3RyaWRlSChidWlsZGVyLCBzZWxmLnN0cmlkZUgpCisgICAgICAgIENvbnYyRE9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBzZWxmLmZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKQorICAgICAgICBDb252MkRPcHRpb25zQWRkRGlsYXRpb25XRmFjdG9yKGJ1aWxkZXIsIHNlbGYuZGlsYXRpb25XRmFjdG9yKQorICAgICAgICBDb252MkRPcHRpb25zQWRkRGlsYXRpb25IRmFjdG9yKGJ1aWxkZXIsIHNlbGYuZGlsYXRpb25IRmFjdG9yKQorICAgICAgICBDb252MkRPcHRpb25zQWRkUXVhbnRpemVkQmlhc1R5cGUoYnVpbGRlciwgc2VsZi5xdWFudGl6ZWRCaWFzVHlwZSkKKyAgICAgICAgY29udjJEb3B0aW9ucyA9IENvbnYyRE9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIGNvbnYyRG9wdGlvbnMKKworCitjbGFzcyBDb252M0RPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gQ29udjNET3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzQ29udjNET3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIENvbnYzRE9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIENvbnYzRE9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCisgICAgIyBDb252M0RPcHRpb25zCisgICAgZGVmIFBhZGRpbmcoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBDb252M0RPcHRpb25zCisgICAgZGVmIFN0cmlkZUQoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgQ29udjNET3B0aW9ucworICAgIGRlZiBTdHJpZGVXKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIENvbnYzRE9wdGlvbnMKKyAgICBkZWYgU3RyaWRlSChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgQ29udjNET3B0aW9ucworICAgIGRlZiBGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBDb252M0RPcHRpb25zCisgICAgZGVmIERpbGF0aW9uREZhY3RvcihzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDEKKworICAgICMgQ29udjNET3B0aW9ucworICAgIGRlZiBEaWxhdGlvbldGYWN0b3Ioc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTYpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAxCisKKyAgICAjIENvbnYzRE9wdGlvbnMKKyAgICBkZWYgRGlsYXRpb25IRmFjdG9yKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDE4KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMQorCitkZWYgQ29udjNET3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoOCkKKworZGVmIENvbnYzRE9wdGlvbnNBZGRQYWRkaW5nKGJ1aWxkZXIsIHBhZGRpbmcpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEludDhTbG90KDAsIHBhZGRpbmcsIDApCisKK2RlZiBDb252M0RPcHRpb25zQWRkU3RyaWRlRChidWlsZGVyLCBzdHJpZGVEKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMSwgc3RyaWRlRCwgMCkKKworZGVmIENvbnYzRE9wdGlvbnNBZGRTdHJpZGVXKGJ1aWxkZXIsIHN0cmlkZVcpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEludDMyU2xvdCgyLCBzdHJpZGVXLCAwKQorCitkZWYgQ29udjNET3B0aW9uc0FkZFN0cmlkZUgoYnVpbGRlciwgc3RyaWRlSCk6CisgICAgYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDMsIHN0cmlkZUgsIDApCisKK2RlZiBDb252M0RPcHRpb25zQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pOgorICAgIGJ1aWxkZXIuUHJlcGVuZEludDhTbG90KDQsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uLCAwKQorCitkZWYgQ29udjNET3B0aW9uc0FkZERpbGF0aW9uREZhY3RvcihidWlsZGVyLCBkaWxhdGlvbkRGYWN0b3IpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEludDMyU2xvdCg1LCBkaWxhdGlvbkRGYWN0b3IsIDEpCisKK2RlZiBDb252M0RPcHRpb25zQWRkRGlsYXRpb25XRmFjdG9yKGJ1aWxkZXIsIGRpbGF0aW9uV0ZhY3Rvcik6CisgICAgYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDYsIGRpbGF0aW9uV0ZhY3RvciwgMSkKKworZGVmIENvbnYzRE9wdGlvbnNBZGREaWxhdGlvbkhGYWN0b3IoYnVpbGRlciwgZGlsYXRpb25IRmFjdG9yKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoNywgZGlsYXRpb25IRmFjdG9yLCAxKQorCitkZWYgQ29udjNET3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgQ29udjNET3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgQ29udjNET3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYucGFkZGluZyA9IDAgICMgdHlwZTogaW50CisgICAgICAgIHNlbGYuc3RyaWRlRCA9IDAgICMgdHlwZTogaW50CisgICAgICAgIHNlbGYuc3RyaWRlVyA9IDAgICMgdHlwZTogaW50CisgICAgICAgIHNlbGYuc3RyaWRlSCA9IDAgICMgdHlwZTogaW50CisgICAgICAgIHNlbGYuZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24gPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmRpbGF0aW9uREZhY3RvciA9IDEgICMgdHlwZTogaW50CisgICAgICAgIHNlbGYuZGlsYXRpb25XRmFjdG9yID0gMSAgIyB0eXBlOiBpbnQKKyAgICAgICAgc2VsZi5kaWxhdGlvbkhGYWN0b3IgPSAxICAjIHR5cGU6IGludAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICBjb252M0RvcHRpb25zID0gQ29udjNET3B0aW9ucygpCisgICAgICAgIGNvbnYzRG9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihjb252M0RvcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgY29udjNEb3B0aW9ucyk6CisgICAgICAgIHggPSBDb252M0RPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhjb252M0RvcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBDb252M0RPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIGNvbnYzRG9wdGlvbnMpOgorICAgICAgICBpZiBjb252M0RvcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5wYWRkaW5nID0gY29udjNEb3B0aW9ucy5QYWRkaW5nKCkKKyAgICAgICAgc2VsZi5zdHJpZGVEID0gY29udjNEb3B0aW9ucy5TdHJpZGVEKCkKKyAgICAgICAgc2VsZi5zdHJpZGVXID0gY29udjNEb3B0aW9ucy5TdHJpZGVXKCkKKyAgICAgICAgc2VsZi5zdHJpZGVIID0gY29udjNEb3B0aW9ucy5TdHJpZGVIKCkKKyAgICAgICAgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbiA9IGNvbnYzRG9wdGlvbnMuRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oKQorICAgICAgICBzZWxmLmRpbGF0aW9uREZhY3RvciA9IGNvbnYzRG9wdGlvbnMuRGlsYXRpb25ERmFjdG9yKCkKKyAgICAgICAgc2VsZi5kaWxhdGlvbldGYWN0b3IgPSBjb252M0RvcHRpb25zLkRpbGF0aW9uV0ZhY3RvcigpCisgICAgICAgIHNlbGYuZGlsYXRpb25IRmFjdG9yID0gY29udjNEb3B0aW9ucy5EaWxhdGlvbkhGYWN0b3IoKQorCisgICAgIyBDb252M0RPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBDb252M0RPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgQ29udjNET3B0aW9uc0FkZFBhZGRpbmcoYnVpbGRlciwgc2VsZi5wYWRkaW5nKQorICAgICAgICBDb252M0RPcHRpb25zQWRkU3RyaWRlRChidWlsZGVyLCBzZWxmLnN0cmlkZUQpCisgICAgICAgIENvbnYzRE9wdGlvbnNBZGRTdHJpZGVXKGJ1aWxkZXIsIHNlbGYuc3RyaWRlVykKKyAgICAgICAgQ29udjNET3B0aW9uc0FkZFN0cmlkZUgoYnVpbGRlciwgc2VsZi5zdHJpZGVIKQorICAgICAgICBDb252M0RPcHRpb25zQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbikKKyAgICAgICAgQ29udjNET3B0aW9uc0FkZERpbGF0aW9uREZhY3RvcihidWlsZGVyLCBzZWxmLmRpbGF0aW9uREZhY3RvcikKKyAgICAgICAgQ29udjNET3B0aW9uc0FkZERpbGF0aW9uV0ZhY3RvcihidWlsZGVyLCBzZWxmLmRpbGF0aW9uV0ZhY3RvcikKKyAgICAgICAgQ29udjNET3B0aW9uc0FkZERpbGF0aW9uSEZhY3RvcihidWlsZGVyLCBzZWxmLmRpbGF0aW9uSEZhY3RvcikKKyAgICAgICAgY29udjNEb3B0aW9ucyA9IENvbnYzRE9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIGNvbnYzRG9wdGlvbnMKKworCitjbGFzcyBQb29sMkRPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gUG9vbDJET3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzUG9vbDJET3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFBvb2wyRE9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFBvb2wyRE9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCisgICAgIyBQb29sMkRPcHRpb25zCisgICAgZGVmIFBhZGRpbmcoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBQb29sMkRPcHRpb25zCisgICAgZGVmIFN0cmlkZVcoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgUG9vbDJET3B0aW9ucworICAgIGRlZiBTdHJpZGVIKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFBvb2wyRE9wdGlvbnMKKyAgICBkZWYgRmlsdGVyV2lkdGgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTApKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFBvb2wyRE9wdGlvbnMKKyAgICBkZWYgRmlsdGVySGVpZ2h0KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEyKSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBQb29sMkRPcHRpb25zCisgICAgZGVmIEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDE0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDhGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKK2RlZiBQb29sMkRPcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCg2KQorCitkZWYgUG9vbDJET3B0aW9uc0FkZFBhZGRpbmcoYnVpbGRlciwgcGFkZGluZyk6CisgICAgYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoMCwgcGFkZGluZywgMCkKKworZGVmIFBvb2wyRE9wdGlvbnNBZGRTdHJpZGVXKGJ1aWxkZXIsIHN0cmlkZVcpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEludDMyU2xvdCgxLCBzdHJpZGVXLCAwKQorCitkZWYgUG9vbDJET3B0aW9uc0FkZFN0cmlkZUgoYnVpbGRlciwgc3RyaWRlSCk6CisgICAgYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDIsIHN0cmlkZUgsIDApCisKK2RlZiBQb29sMkRPcHRpb25zQWRkRmlsdGVyV2lkdGgoYnVpbGRlciwgZmlsdGVyV2lkdGgpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEludDMyU2xvdCgzLCBmaWx0ZXJXaWR0aCwgMCkKKworZGVmIFBvb2wyRE9wdGlvbnNBZGRGaWx0ZXJIZWlnaHQoYnVpbGRlciwgZmlsdGVySGVpZ2h0KToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoNCwgZmlsdGVySGVpZ2h0LCAwKQorCitkZWYgUG9vbDJET3B0aW9uc0FkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCg1LCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbiwgMCkKKworZGVmIFBvb2wyRE9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIFBvb2wyRE9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIFBvb2wyRE9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnBhZGRpbmcgPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLnN0cmlkZVcgPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLnN0cmlkZUggPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmZpbHRlcldpZHRoID0gMCAgIyB0eXBlOiBpbnQKKyAgICAgICAgc2VsZi5maWx0ZXJIZWlnaHQgPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uID0gMCAgIyB0eXBlOiBpbnQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgcG9vbDJEb3B0aW9ucyA9IFBvb2wyRE9wdGlvbnMoKQorICAgICAgICBwb29sMkRvcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoocG9vbDJEb3B0aW9ucykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHBvb2wyRG9wdGlvbnMpOgorICAgICAgICB4ID0gUG9vbDJET3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2socG9vbDJEb3B0aW9ucykKKyAgICAgICAgcmV0dXJuIHgKKworICAgICMgUG9vbDJET3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBwb29sMkRvcHRpb25zKToKKyAgICAgICAgaWYgcG9vbDJEb3B0aW9ucyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYucGFkZGluZyA9IHBvb2wyRG9wdGlvbnMuUGFkZGluZygpCisgICAgICAgIHNlbGYuc3RyaWRlVyA9IHBvb2wyRG9wdGlvbnMuU3RyaWRlVygpCisgICAgICAgIHNlbGYuc3RyaWRlSCA9IHBvb2wyRG9wdGlvbnMuU3RyaWRlSCgpCisgICAgICAgIHNlbGYuZmlsdGVyV2lkdGggPSBwb29sMkRvcHRpb25zLkZpbHRlcldpZHRoKCkKKyAgICAgICAgc2VsZi5maWx0ZXJIZWlnaHQgPSBwb29sMkRvcHRpb25zLkZpbHRlckhlaWdodCgpCisgICAgICAgIHNlbGYuZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24gPSBwb29sMkRvcHRpb25zLkZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKCkKKworICAgICMgUG9vbDJET3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgUG9vbDJET3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIFBvb2wyRE9wdGlvbnNBZGRQYWRkaW5nKGJ1aWxkZXIsIHNlbGYucGFkZGluZykKKyAgICAgICAgUG9vbDJET3B0aW9uc0FkZFN0cmlkZVcoYnVpbGRlciwgc2VsZi5zdHJpZGVXKQorICAgICAgICBQb29sMkRPcHRpb25zQWRkU3RyaWRlSChidWlsZGVyLCBzZWxmLnN0cmlkZUgpCisgICAgICAgIFBvb2wyRE9wdGlvbnNBZGRGaWx0ZXJXaWR0aChidWlsZGVyLCBzZWxmLmZpbHRlcldpZHRoKQorICAgICAgICBQb29sMkRPcHRpb25zQWRkRmlsdGVySGVpZ2h0KGJ1aWxkZXIsIHNlbGYuZmlsdGVySGVpZ2h0KQorICAgICAgICBQb29sMkRPcHRpb25zQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbikKKyAgICAgICAgcG9vbDJEb3B0aW9ucyA9IFBvb2wyRE9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHBvb2wyRG9wdGlvbnMKKworCitjbGFzcyBEZXB0aHdpc2VDb252MkRPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gRGVwdGh3aXNlQ29udjJET3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzRGVwdGh3aXNlQ29udjJET3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIERlcHRod2lzZUNvbnYyRE9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIERlcHRod2lzZUNvbnYyRE9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCisgICAgIyBEZXB0aHdpc2VDb252MkRPcHRpb25zCisgICAgZGVmIFBhZGRpbmcoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBEZXB0aHdpc2VDb252MkRPcHRpb25zCisgICAgZGVmIFN0cmlkZVcoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgRGVwdGh3aXNlQ29udjJET3B0aW9ucworICAgIGRlZiBTdHJpZGVIKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIERlcHRod2lzZUNvbnYyRE9wdGlvbnMKKyAgICBkZWYgRGVwdGhNdWx0aXBsaWVyKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEwKSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBEZXB0aHdpc2VDb252MkRPcHRpb25zCisgICAgZGVmIEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEyKSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDhGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIERlcHRod2lzZUNvbnYyRE9wdGlvbnMKKyAgICBkZWYgRGlsYXRpb25XRmFjdG9yKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDE0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMQorCisgICAgIyBEZXB0aHdpc2VDb252MkRPcHRpb25zCisgICAgZGVmIERpbGF0aW9uSEZhY3RvcihzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxNikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDEKKworZGVmIERlcHRod2lzZUNvbnYyRE9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDcpCisKK2RlZiBEZXB0aHdpc2VDb252MkRPcHRpb25zQWRkUGFkZGluZyhidWlsZGVyLCBwYWRkaW5nKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCgwLCBwYWRkaW5nLCAwKQorCitkZWYgRGVwdGh3aXNlQ29udjJET3B0aW9uc0FkZFN0cmlkZVcoYnVpbGRlciwgc3RyaWRlVyk6CisgICAgYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDEsIHN0cmlkZVcsIDApCisKK2RlZiBEZXB0aHdpc2VDb252MkRPcHRpb25zQWRkU3RyaWRlSChidWlsZGVyLCBzdHJpZGVIKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMiwgc3RyaWRlSCwgMCkKKworZGVmIERlcHRod2lzZUNvbnYyRE9wdGlvbnNBZGREZXB0aE11bHRpcGxpZXIoYnVpbGRlciwgZGVwdGhNdWx0aXBsaWVyKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMywgZGVwdGhNdWx0aXBsaWVyLCAwKQorCitkZWYgRGVwdGh3aXNlQ29udjJET3B0aW9uc0FkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCg0LCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbiwgMCkKKworZGVmIERlcHRod2lzZUNvbnYyRE9wdGlvbnNBZGREaWxhdGlvbldGYWN0b3IoYnVpbGRlciwgZGlsYXRpb25XRmFjdG9yKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoNSwgZGlsYXRpb25XRmFjdG9yLCAxKQorCitkZWYgRGVwdGh3aXNlQ29udjJET3B0aW9uc0FkZERpbGF0aW9uSEZhY3RvcihidWlsZGVyLCBkaWxhdGlvbkhGYWN0b3IpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEludDMyU2xvdCg2LCBkaWxhdGlvbkhGYWN0b3IsIDEpCisKK2RlZiBEZXB0aHdpc2VDb252MkRPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBEZXB0aHdpc2VDb252MkRPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBEZXB0aHdpc2VDb252MkRPcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5wYWRkaW5nID0gMCAgIyB0eXBlOiBpbnQKKyAgICAgICAgc2VsZi5zdHJpZGVXID0gMCAgIyB0eXBlOiBpbnQKKyAgICAgICAgc2VsZi5zdHJpZGVIID0gMCAgIyB0eXBlOiBpbnQKKyAgICAgICAgc2VsZi5kZXB0aE11bHRpcGxpZXIgPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uID0gMCAgIyB0eXBlOiBpbnQKKyAgICAgICAgc2VsZi5kaWxhdGlvbldGYWN0b3IgPSAxICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmRpbGF0aW9uSEZhY3RvciA9IDEgICMgdHlwZTogaW50CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIGRlcHRod2lzZUNvbnYyRG9wdGlvbnMgPSBEZXB0aHdpc2VDb252MkRPcHRpb25zKCkKKyAgICAgICAgZGVwdGh3aXNlQ29udjJEb3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGRlcHRod2lzZUNvbnYyRG9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBkZXB0aHdpc2VDb252MkRvcHRpb25zKToKKyAgICAgICAgeCA9IERlcHRod2lzZUNvbnYyRE9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKGRlcHRod2lzZUNvbnYyRG9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIERlcHRod2lzZUNvbnYyRE9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgZGVwdGh3aXNlQ29udjJEb3B0aW9ucyk6CisgICAgICAgIGlmIGRlcHRod2lzZUNvbnYyRG9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnBhZGRpbmcgPSBkZXB0aHdpc2VDb252MkRvcHRpb25zLlBhZGRpbmcoKQorICAgICAgICBzZWxmLnN0cmlkZVcgPSBkZXB0aHdpc2VDb252MkRvcHRpb25zLlN0cmlkZVcoKQorICAgICAgICBzZWxmLnN0cmlkZUggPSBkZXB0aHdpc2VDb252MkRvcHRpb25zLlN0cmlkZUgoKQorICAgICAgICBzZWxmLmRlcHRoTXVsdGlwbGllciA9IGRlcHRod2lzZUNvbnYyRG9wdGlvbnMuRGVwdGhNdWx0aXBsaWVyKCkKKyAgICAgICAgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbiA9IGRlcHRod2lzZUNvbnYyRG9wdGlvbnMuRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oKQorICAgICAgICBzZWxmLmRpbGF0aW9uV0ZhY3RvciA9IGRlcHRod2lzZUNvbnYyRG9wdGlvbnMuRGlsYXRpb25XRmFjdG9yKCkKKyAgICAgICAgc2VsZi5kaWxhdGlvbkhGYWN0b3IgPSBkZXB0aHdpc2VDb252MkRvcHRpb25zLkRpbGF0aW9uSEZhY3RvcigpCisKKyAgICAjIERlcHRod2lzZUNvbnYyRE9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIERlcHRod2lzZUNvbnYyRE9wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICBEZXB0aHdpc2VDb252MkRPcHRpb25zQWRkUGFkZGluZyhidWlsZGVyLCBzZWxmLnBhZGRpbmcpCisgICAgICAgIERlcHRod2lzZUNvbnYyRE9wdGlvbnNBZGRTdHJpZGVXKGJ1aWxkZXIsIHNlbGYuc3RyaWRlVykKKyAgICAgICAgRGVwdGh3aXNlQ29udjJET3B0aW9uc0FkZFN0cmlkZUgoYnVpbGRlciwgc2VsZi5zdHJpZGVIKQorICAgICAgICBEZXB0aHdpc2VDb252MkRPcHRpb25zQWRkRGVwdGhNdWx0aXBsaWVyKGJ1aWxkZXIsIHNlbGYuZGVwdGhNdWx0aXBsaWVyKQorICAgICAgICBEZXB0aHdpc2VDb252MkRPcHRpb25zQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbikKKyAgICAgICAgRGVwdGh3aXNlQ29udjJET3B0aW9uc0FkZERpbGF0aW9uV0ZhY3RvcihidWlsZGVyLCBzZWxmLmRpbGF0aW9uV0ZhY3RvcikKKyAgICAgICAgRGVwdGh3aXNlQ29udjJET3B0aW9uc0FkZERpbGF0aW9uSEZhY3RvcihidWlsZGVyLCBzZWxmLmRpbGF0aW9uSEZhY3RvcikKKyAgICAgICAgZGVwdGh3aXNlQ29udjJEb3B0aW9ucyA9IERlcHRod2lzZUNvbnYyRE9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIGRlcHRod2lzZUNvbnYyRG9wdGlvbnMKKwogCiBjbGFzcyBDb25jYXRFbWJlZGRpbmdzT3B0aW9ucyhvYmplY3QpOgogICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCkBAIC0yMjgwLDI3ICs2NzAwLDI4IEBACiAgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCiAgICAgICAgIHJldHVybiBvID09IDAKIAotZGVmIENvbmNhdEVtYmVkZGluZ3NPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMykKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gQ29uY2F0RW1iZWRkaW5nc09wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIENvbmNhdEVtYmVkZGluZ3NPcHRpb25zQWRkTnVtQ2hhbm5lbHMoYnVpbGRlciwgbnVtQ2hhbm5lbHMpOiBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMCwgbnVtQ2hhbm5lbHMsIDApCi1kZWYgQWRkTnVtQ2hhbm5lbHMoYnVpbGRlciwgbnVtQ2hhbm5lbHMpOgotICAgIHJldHVybiBDb25jYXRFbWJlZGRpbmdzT3B0aW9uc0FkZE51bUNoYW5uZWxzKGJ1aWxkZXIsIG51bUNoYW5uZWxzKQotZGVmIENvbmNhdEVtYmVkZGluZ3NPcHRpb25zQWRkTnVtQ29sdW1uc1BlckNoYW5uZWwoYnVpbGRlciwgbnVtQ29sdW1uc1BlckNoYW5uZWwpOiBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgxLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKG51bUNvbHVtbnNQZXJDaGFubmVsKSwgMCkKLWRlZiBBZGROdW1Db2x1bW5zUGVyQ2hhbm5lbChidWlsZGVyLCBudW1Db2x1bW5zUGVyQ2hhbm5lbCk6Ci0gICAgcmV0dXJuIENvbmNhdEVtYmVkZGluZ3NPcHRpb25zQWRkTnVtQ29sdW1uc1BlckNoYW5uZWwoYnVpbGRlciwgbnVtQ29sdW1uc1BlckNoYW5uZWwpCi1kZWYgQ29uY2F0RW1iZWRkaW5nc09wdGlvbnNTdGFydE51bUNvbHVtbnNQZXJDaGFubmVsVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKTogcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpCi1kZWYgU3RhcnROdW1Db2x1bW5zUGVyQ2hhbm5lbFZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6Ci0gICAgcmV0dXJuIENvbmNhdEVtYmVkZGluZ3NPcHRpb25zU3RhcnROdW1Db2x1bW5zUGVyQ2hhbm5lbFZlY3RvcihidWlsZGVyLCBudW1FbGVtcykKLWRlZiBDb25jYXRFbWJlZGRpbmdzT3B0aW9uc0FkZEVtYmVkZGluZ0RpbVBlckNoYW5uZWwoYnVpbGRlciwgZW1iZWRkaW5nRGltUGVyQ2hhbm5lbCk6IGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDIsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoZW1iZWRkaW5nRGltUGVyQ2hhbm5lbCksIDApCi1kZWYgQWRkRW1iZWRkaW5nRGltUGVyQ2hhbm5lbChidWlsZGVyLCBlbWJlZGRpbmdEaW1QZXJDaGFubmVsKToKLSAgICByZXR1cm4gQ29uY2F0RW1iZWRkaW5nc09wdGlvbnNBZGRFbWJlZGRpbmdEaW1QZXJDaGFubmVsKGJ1aWxkZXIsIGVtYmVkZGluZ0RpbVBlckNoYW5uZWwpCi1kZWYgQ29uY2F0RW1iZWRkaW5nc09wdGlvbnNTdGFydEVtYmVkZGluZ0RpbVBlckNoYW5uZWxWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOiByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCkKLWRlZiBTdGFydEVtYmVkZGluZ0RpbVBlckNoYW5uZWxWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgotICAgIHJldHVybiBDb25jYXRFbWJlZGRpbmdzT3B0aW9uc1N0YXJ0RW1iZWRkaW5nRGltUGVyQ2hhbm5lbFZlY3RvcihidWlsZGVyLCBudW1FbGVtcykKLWRlZiBDb25jYXRFbWJlZGRpbmdzT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIENvbmNhdEVtYmVkZGluZ3NPcHRpb25zRW5kKGJ1aWxkZXIpCitkZWYgQ29uY2F0RW1iZWRkaW5nc09wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDMpCisKK2RlZiBDb25jYXRFbWJlZGRpbmdzT3B0aW9uc0FkZE51bUNoYW5uZWxzKGJ1aWxkZXIsIG51bUNoYW5uZWxzKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMCwgbnVtQ2hhbm5lbHMsIDApCisKK2RlZiBDb25jYXRFbWJlZGRpbmdzT3B0aW9uc0FkZE51bUNvbHVtbnNQZXJDaGFubmVsKGJ1aWxkZXIsIG51bUNvbHVtbnNQZXJDaGFubmVsKToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgxLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKG51bUNvbHVtbnNQZXJDaGFubmVsKSwgMCkKKworZGVmIENvbmNhdEVtYmVkZGluZ3NPcHRpb25zU3RhcnROdW1Db2x1bW5zUGVyQ2hhbm5lbFZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6CisgICAgcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpCisKK2RlZiBDb25jYXRFbWJlZGRpbmdzT3B0aW9uc0FkZEVtYmVkZGluZ0RpbVBlckNoYW5uZWwoYnVpbGRlciwgZW1iZWRkaW5nRGltUGVyQ2hhbm5lbCk6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMiwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShlbWJlZGRpbmdEaW1QZXJDaGFubmVsKSwgMCkKKworZGVmIENvbmNhdEVtYmVkZGluZ3NPcHRpb25zU3RhcnRFbWJlZGRpbmdEaW1QZXJDaGFubmVsVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKKyAgICByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCkKKworZGVmIENvbmNhdEVtYmVkZGluZ3NPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKwogdHJ5OgogICAgIGZyb20gdHlwaW5nIGltcG9ydCBMaXN0CiBleGNlcHQ6CkBAIC0yMzIxLDYgKzY3NDIsMTEgQEAKICAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihjb25jYXRFbWJlZGRpbmdzT3B0aW9ucykKIAogICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGNvbmNhdEVtYmVkZGluZ3NPcHRpb25zKToKICAgICAgICAgeCA9IENvbmNhdEVtYmVkZGluZ3NPcHRpb25zVCgpCiAgICAgICAgIHguX1VuUGFjayhjb25jYXRFbWJlZGRpbmdzT3B0aW9ucykKQEAgLTIzNzIsMTkyMyArNjc5OCw0OTYgQEAKICAgICAgICAgICAgIENvbmNhdEVtYmVkZGluZ3NPcHRpb25zQWRkRW1iZWRkaW5nRGltUGVyQ2hhbm5lbChidWlsZGVyLCBlbWJlZGRpbmdEaW1QZXJDaGFubmVsKQogICAgICAgICBjb25jYXRFbWJlZGRpbmdzT3B0aW9ucyA9IENvbmNhdEVtYmVkZGluZ3NPcHRpb25zRW5kKGJ1aWxkZXIpCiAgICAgICAgIHJldHVybiBjb25jYXRFbWJlZGRpbmdzT3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKIAotIyBuYW1lc3BhY2U6IHRmbGl0ZQogCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIENvbmNhdGVuYXRpb25PcHRpb25zKG9iamVjdCk6CitjbGFzcyBMU0hQcm9qZWN0aW9uT3B0aW9ucyhvYmplY3QpOgogICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCiAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CiAgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IENvbmNhdGVuYXRpb25PcHRpb25zKCkKKyAgICAgICAgeCA9IExTSFByb2plY3Rpb25PcHRpb25zKCkKICAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKICAgICAgICAgcmV0dXJuIHgKIAogICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNDb25jYXRlbmF0aW9uT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgIGRlZiBHZXRSb290QXNMU0hQcm9qZWN0aW9uT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgogICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKICAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCiAgICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIENvbmNhdGVuYXRpb25PcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICBkZWYgTFNIUHJvamVjdGlvbk9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgogICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCiAKLSAgICAjIENvbmNhdGVuYXRpb25PcHRpb25zCisgICAgIyBMU0hQcm9qZWN0aW9uT3B0aW9ucwogICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKICAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCiAKLSAgICAjIENvbmNhdGVuYXRpb25PcHRpb25zCi0gICAgZGVmIEF4aXMoc2VsZik6CisgICAgIyBMU0hQcm9qZWN0aW9uT3B0aW9ucworICAgIGRlZiBUeXBlKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50OEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworZGVmIExTSFByb2plY3Rpb25PcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgxKQorCitkZWYgTFNIUHJvamVjdGlvbk9wdGlvbnNBZGRUeXBlKGJ1aWxkZXIsIHR5cGUpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEludDhTbG90KDAsIHR5cGUsIDApCisKK2RlZiBMU0hQcm9qZWN0aW9uT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgTFNIUHJvamVjdGlvbk9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIExTSFByb2plY3Rpb25PcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi50eXBlID0gMCAgIyB0eXBlOiBpbnQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgbHNocHJvamVjdGlvbk9wdGlvbnMgPSBMU0hQcm9qZWN0aW9uT3B0aW9ucygpCisgICAgICAgIGxzaHByb2plY3Rpb25PcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoobHNocHJvamVjdGlvbk9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBsc2hwcm9qZWN0aW9uT3B0aW9ucyk6CisgICAgICAgIHggPSBMU0hQcm9qZWN0aW9uT3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2sobHNocHJvamVjdGlvbk9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIExTSFByb2plY3Rpb25PcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIGxzaHByb2plY3Rpb25PcHRpb25zKToKKyAgICAgICAgaWYgbHNocHJvamVjdGlvbk9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnR5cGUgPSBsc2hwcm9qZWN0aW9uT3B0aW9ucy5UeXBlKCkKKworICAgICMgTFNIUHJvamVjdGlvbk9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIExTSFByb2plY3Rpb25PcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgTFNIUHJvamVjdGlvbk9wdGlvbnNBZGRUeXBlKGJ1aWxkZXIsIHNlbGYudHlwZSkKKyAgICAgICAgbHNocHJvamVjdGlvbk9wdGlvbnMgPSBMU0hQcm9qZWN0aW9uT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gbHNocHJvamVjdGlvbk9wdGlvbnMKKworCitjbGFzcyBTVkRGT3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IFNWREZPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNTVkRGT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFNWREZPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBTVkRGT3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKKyAgICAjIFNWREZPcHRpb25zCisgICAgZGVmIFJhbmsoc2VsZik6CiAgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCiAgICAgICAgIGlmIG8gIT0gMDoKICAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKICAgICAgICAgcmV0dXJuIDAKIAotICAgICMgQ29uY2F0ZW5hdGlvbk9wdGlvbnMKKyAgICAjIFNWREZPcHRpb25zCiAgICAgZGVmIEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKHNlbGYpOgogICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQogICAgICAgICBpZiBvICE9IDA6CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50OEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKICAgICAgICAgcmV0dXJuIDAKIAotZGVmIENvbmNhdGVuYXRpb25PcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMikKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gQ29uY2F0ZW5hdGlvbk9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIENvbmNhdGVuYXRpb25PcHRpb25zQWRkQXhpcyhidWlsZGVyLCBheGlzKTogYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDAsIGF4aXMsIDApCi1kZWYgQWRkQXhpcyhidWlsZGVyLCBheGlzKToKLSAgICByZXR1cm4gQ29uY2F0ZW5hdGlvbk9wdGlvbnNBZGRBeGlzKGJ1aWxkZXIsIGF4aXMpCi1kZWYgQ29uY2F0ZW5hdGlvbk9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbik6IGJ1aWxkZXIuUHJlcGVuZEludDhTbG90KDEsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uLCAwKQotZGVmIEFkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKToKLSAgICByZXR1cm4gQ29uY2F0ZW5hdGlvbk9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbikKLWRlZiBDb25jYXRlbmF0aW9uT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIENvbmNhdGVuYXRpb25PcHRpb25zRW5kKGJ1aWxkZXIpCi0KLWNsYXNzIENvbmNhdGVuYXRpb25PcHRpb25zVChvYmplY3QpOgotCi0gICAgIyBDb25jYXRlbmF0aW9uT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYuYXhpcyA9IDAgICMgdHlwZTogaW50Ci0gICAgICAgIHNlbGYuZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24gPSAwICAjIHR5cGU6IGludAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBjb25jYXRlbmF0aW9uT3B0aW9ucyA9IENvbmNhdGVuYXRpb25PcHRpb25zKCkKLSAgICAgICAgY29uY2F0ZW5hdGlvbk9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihjb25jYXRlbmF0aW9uT3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGNvbmNhdGVuYXRpb25PcHRpb25zKToKLSAgICAgICAgeCA9IENvbmNhdGVuYXRpb25PcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhjb25jYXRlbmF0aW9uT3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgQ29uY2F0ZW5hdGlvbk9wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgY29uY2F0ZW5hdGlvbk9wdGlvbnMpOgotICAgICAgICBpZiBjb25jYXRlbmF0aW9uT3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYuYXhpcyA9IGNvbmNhdGVuYXRpb25PcHRpb25zLkF4aXMoKQotICAgICAgICBzZWxmLmZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uID0gY29uY2F0ZW5hdGlvbk9wdGlvbnMuRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oKQotCi0gICAgIyBDb25jYXRlbmF0aW9uT3B0aW9uc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgQ29uY2F0ZW5hdGlvbk9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBDb25jYXRlbmF0aW9uT3B0aW9uc0FkZEF4aXMoYnVpbGRlciwgc2VsZi5heGlzKQotICAgICAgICBDb25jYXRlbmF0aW9uT3B0aW9uc0FkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIHNlbGYuZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pCi0gICAgICAgIGNvbmNhdGVuYXRpb25PcHRpb25zID0gQ29uY2F0ZW5hdGlvbk9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIGNvbmNhdGVuYXRpb25PcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgQ29udjJET3B0aW9ucyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IENvbnYyRE9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc0NvbnYyRE9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBDb252MkRPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBDb252MkRPcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotICAgICMgQ29udjJET3B0aW9ucwotICAgIGRlZiBQYWRkaW5nKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50OEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgQ29udjJET3B0aW9ucwotICAgIGRlZiBTdHJpZGVXKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIENvbnYyRE9wdGlvbnMKLSAgICBkZWYgU3RyaWRlSChzZWxmKToKKyAgICAjIFNWREZPcHRpb25zCisgICAgZGVmIEFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyhzZWxmKToKICAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg4KSkKICAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBDb252MkRPcHRpb25zCi0gICAgZGVmIEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEwKSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDhGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIENvbnYyRE9wdGlvbnMKLSAgICBkZWYgRGlsYXRpb25XRmFjdG9yKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEyKSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gMQotCi0gICAgIyBDb252MkRPcHRpb25zCi0gICAgZGVmIERpbGF0aW9uSEZhY3RvcihzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDEKLQotZGVmIENvbnYyRE9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCg2KQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBDb252MkRPcHRpb25zU3RhcnQoYnVpbGRlcikKLWRlZiBDb252MkRPcHRpb25zQWRkUGFkZGluZyhidWlsZGVyLCBwYWRkaW5nKTogYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoMCwgcGFkZGluZywgMCkKLWRlZiBBZGRQYWRkaW5nKGJ1aWxkZXIsIHBhZGRpbmcpOgotICAgIHJldHVybiBDb252MkRPcHRpb25zQWRkUGFkZGluZyhidWlsZGVyLCBwYWRkaW5nKQotZGVmIENvbnYyRE9wdGlvbnNBZGRTdHJpZGVXKGJ1aWxkZXIsIHN0cmlkZVcpOiBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMSwgc3RyaWRlVywgMCkKLWRlZiBBZGRTdHJpZGVXKGJ1aWxkZXIsIHN0cmlkZVcpOgotICAgIHJldHVybiBDb252MkRPcHRpb25zQWRkU3RyaWRlVyhidWlsZGVyLCBzdHJpZGVXKQotZGVmIENvbnYyRE9wdGlvbnNBZGRTdHJpZGVIKGJ1aWxkZXIsIHN0cmlkZUgpOiBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMiwgc3RyaWRlSCwgMCkKLWRlZiBBZGRTdHJpZGVIKGJ1aWxkZXIsIHN0cmlkZUgpOgotICAgIHJldHVybiBDb252MkRPcHRpb25zQWRkU3RyaWRlSChidWlsZGVyLCBzdHJpZGVIKQotZGVmIENvbnYyRE9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbik6IGJ1aWxkZXIuUHJlcGVuZEludDhTbG90KDMsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uLCAwKQotZGVmIEFkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKToKLSAgICByZXR1cm4gQ29udjJET3B0aW9uc0FkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKQotZGVmIENvbnYyRE9wdGlvbnNBZGREaWxhdGlvbldGYWN0b3IoYnVpbGRlciwgZGlsYXRpb25XRmFjdG9yKTogYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDQsIGRpbGF0aW9uV0ZhY3RvciwgMSkKLWRlZiBBZGREaWxhdGlvbldGYWN0b3IoYnVpbGRlciwgZGlsYXRpb25XRmFjdG9yKToKLSAgICByZXR1cm4gQ29udjJET3B0aW9uc0FkZERpbGF0aW9uV0ZhY3RvcihidWlsZGVyLCBkaWxhdGlvbldGYWN0b3IpCi1kZWYgQ29udjJET3B0aW9uc0FkZERpbGF0aW9uSEZhY3RvcihidWlsZGVyLCBkaWxhdGlvbkhGYWN0b3IpOiBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoNSwgZGlsYXRpb25IRmFjdG9yLCAxKQotZGVmIEFkZERpbGF0aW9uSEZhY3RvcihidWlsZGVyLCBkaWxhdGlvbkhGYWN0b3IpOgotICAgIHJldHVybiBDb252MkRPcHRpb25zQWRkRGlsYXRpb25IRmFjdG9yKGJ1aWxkZXIsIGRpbGF0aW9uSEZhY3RvcikKLWRlZiBDb252MkRPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gQ29udjJET3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBDb252MkRPcHRpb25zVChvYmplY3QpOgotCi0gICAgIyBDb252MkRPcHRpb25zVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi5wYWRkaW5nID0gMCAgIyB0eXBlOiBpbnQKLSAgICAgICAgc2VsZi5zdHJpZGVXID0gMCAgIyB0eXBlOiBpbnQKLSAgICAgICAgc2VsZi5zdHJpZGVIID0gMCAgIyB0eXBlOiBpbnQKLSAgICAgICAgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbiA9IDAgICMgdHlwZTogaW50Ci0gICAgICAgIHNlbGYuZGlsYXRpb25XRmFjdG9yID0gMSAgIyB0eXBlOiBpbnQKLSAgICAgICAgc2VsZi5kaWxhdGlvbkhGYWN0b3IgPSAxICAjIHR5cGU6IGludAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBjb252MmRvcHRpb25zID0gQ29udjJET3B0aW9ucygpCi0gICAgICAgIGNvbnYyZG9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihjb252MmRvcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgY29udjJkb3B0aW9ucyk6Ci0gICAgICAgIHggPSBDb252MkRPcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhjb252MmRvcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBDb252MkRPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIGNvbnYyZG9wdGlvbnMpOgotICAgICAgICBpZiBjb252MmRvcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi5wYWRkaW5nID0gY29udjJkb3B0aW9ucy5QYWRkaW5nKCkKLSAgICAgICAgc2VsZi5zdHJpZGVXID0gY29udjJkb3B0aW9ucy5TdHJpZGVXKCkKLSAgICAgICAgc2VsZi5zdHJpZGVIID0gY29udjJkb3B0aW9ucy5TdHJpZGVIKCkKLSAgICAgICAgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbiA9IGNvbnYyZG9wdGlvbnMuRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oKQotICAgICAgICBzZWxmLmRpbGF0aW9uV0ZhY3RvciA9IGNvbnYyZG9wdGlvbnMuRGlsYXRpb25XRmFjdG9yKCkKLSAgICAgICAgc2VsZi5kaWxhdGlvbkhGYWN0b3IgPSBjb252MmRvcHRpb25zLkRpbGF0aW9uSEZhY3RvcigpCi0KLSAgICAjIENvbnYyRE9wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIENvbnYyRE9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBDb252MkRPcHRpb25zQWRkUGFkZGluZyhidWlsZGVyLCBzZWxmLnBhZGRpbmcpCi0gICAgICAgIENvbnYyRE9wdGlvbnNBZGRTdHJpZGVXKGJ1aWxkZXIsIHNlbGYuc3RyaWRlVykKLSAgICAgICAgQ29udjJET3B0aW9uc0FkZFN0cmlkZUgoYnVpbGRlciwgc2VsZi5zdHJpZGVIKQotICAgICAgICBDb252MkRPcHRpb25zQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbikKLSAgICAgICAgQ29udjJET3B0aW9uc0FkZERpbGF0aW9uV0ZhY3RvcihidWlsZGVyLCBzZWxmLmRpbGF0aW9uV0ZhY3RvcikKLSAgICAgICAgQ29udjJET3B0aW9uc0FkZERpbGF0aW9uSEZhY3RvcihidWlsZGVyLCBzZWxmLmRpbGF0aW9uSEZhY3RvcikKLSAgICAgICAgY29udjJkb3B0aW9ucyA9IENvbnYyRE9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIGNvbnYyZG9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBDb252M0RPcHRpb25zKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gQ29udjNET3B0aW9ucygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzQ29udjNET3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIENvbnYzRE9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIENvbnYzRE9wdGlvbnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi0gICAgIyBDb252M0RPcHRpb25zCi0gICAgZGVmIFBhZGRpbmcoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBDb252M0RPcHRpb25zCi0gICAgZGVmIFN0cmlkZUQoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgQ29udjNET3B0aW9ucwotICAgIGRlZiBTdHJpZGVXKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIENvbnYzRE9wdGlvbnMKLSAgICBkZWYgU3RyaWRlSChzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgQ29udjNET3B0aW9ucwotICAgIGRlZiBGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMikpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBDb252M0RPcHRpb25zCi0gICAgZGVmIERpbGF0aW9uREZhY3RvcihzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDEKLQotICAgICMgQ29udjNET3B0aW9ucwotICAgIGRlZiBEaWxhdGlvbldGYWN0b3Ioc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTYpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiAxCi0KLSAgICAjIENvbnYzRE9wdGlvbnMKLSAgICBkZWYgRGlsYXRpb25IRmFjdG9yKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDE4KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gMQotCi1kZWYgQ29udjNET3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDgpCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIENvbnYzRE9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIENvbnYzRE9wdGlvbnNBZGRQYWRkaW5nKGJ1aWxkZXIsIHBhZGRpbmcpOiBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCgwLCBwYWRkaW5nLCAwKQotZGVmIEFkZFBhZGRpbmcoYnVpbGRlciwgcGFkZGluZyk6Ci0gICAgcmV0dXJuIENvbnYzRE9wdGlvbnNBZGRQYWRkaW5nKGJ1aWxkZXIsIHBhZGRpbmcpCi1kZWYgQ29udjNET3B0aW9uc0FkZFN0cmlkZUQoYnVpbGRlciwgc3RyaWRlRCk6IGJ1aWxkZXIuUHJlcGVuZEludDMyU2xvdCgxLCBzdHJpZGVELCAwKQotZGVmIEFkZFN0cmlkZUQoYnVpbGRlciwgc3RyaWRlRCk6Ci0gICAgcmV0dXJuIENvbnYzRE9wdGlvbnNBZGRTdHJpZGVEKGJ1aWxkZXIsIHN0cmlkZUQpCi1kZWYgQ29udjNET3B0aW9uc0FkZFN0cmlkZVcoYnVpbGRlciwgc3RyaWRlVyk6IGJ1aWxkZXIuUHJlcGVuZEludDMyU2xvdCgyLCBzdHJpZGVXLCAwKQotZGVmIEFkZFN0cmlkZVcoYnVpbGRlciwgc3RyaWRlVyk6Ci0gICAgcmV0dXJuIENvbnYzRE9wdGlvbnNBZGRTdHJpZGVXKGJ1aWxkZXIsIHN0cmlkZVcpCi1kZWYgQ29udjNET3B0aW9uc0FkZFN0cmlkZUgoYnVpbGRlciwgc3RyaWRlSCk6IGJ1aWxkZXIuUHJlcGVuZEludDMyU2xvdCgzLCBzdHJpZGVILCAwKQotZGVmIEFkZFN0cmlkZUgoYnVpbGRlciwgc3RyaWRlSCk6Ci0gICAgcmV0dXJuIENvbnYzRE9wdGlvbnNBZGRTdHJpZGVIKGJ1aWxkZXIsIHN0cmlkZUgpCi1kZWYgQ29udjNET3B0aW9uc0FkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKTogYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoNCwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24sIDApCi1kZWYgQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pOgotICAgIHJldHVybiBDb252M0RPcHRpb25zQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pCi1kZWYgQ29udjNET3B0aW9uc0FkZERpbGF0aW9uREZhY3RvcihidWlsZGVyLCBkaWxhdGlvbkRGYWN0b3IpOiBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoNSwgZGlsYXRpb25ERmFjdG9yLCAxKQotZGVmIEFkZERpbGF0aW9uREZhY3RvcihidWlsZGVyLCBkaWxhdGlvbkRGYWN0b3IpOgotICAgIHJldHVybiBDb252M0RPcHRpb25zQWRkRGlsYXRpb25ERmFjdG9yKGJ1aWxkZXIsIGRpbGF0aW9uREZhY3RvcikKLWRlZiBDb252M0RPcHRpb25zQWRkRGlsYXRpb25XRmFjdG9yKGJ1aWxkZXIsIGRpbGF0aW9uV0ZhY3Rvcik6IGJ1aWxkZXIuUHJlcGVuZEludDMyU2xvdCg2LCBkaWxhdGlvbldGYWN0b3IsIDEpCi1kZWYgQWRkRGlsYXRpb25XRmFjdG9yKGJ1aWxkZXIsIGRpbGF0aW9uV0ZhY3Rvcik6Ci0gICAgcmV0dXJuIENvbnYzRE9wdGlvbnNBZGREaWxhdGlvbldGYWN0b3IoYnVpbGRlciwgZGlsYXRpb25XRmFjdG9yKQotZGVmIENvbnYzRE9wdGlvbnNBZGREaWxhdGlvbkhGYWN0b3IoYnVpbGRlciwgZGlsYXRpb25IRmFjdG9yKTogYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDcsIGRpbGF0aW9uSEZhY3RvciwgMSkKLWRlZiBBZGREaWxhdGlvbkhGYWN0b3IoYnVpbGRlciwgZGlsYXRpb25IRmFjdG9yKToKLSAgICByZXR1cm4gQ29udjNET3B0aW9uc0FkZERpbGF0aW9uSEZhY3RvcihidWlsZGVyLCBkaWxhdGlvbkhGYWN0b3IpCi1kZWYgQ29udjNET3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIENvbnYzRE9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgQ29udjNET3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgQ29udjNET3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYucGFkZGluZyA9IDAgICMgdHlwZTogaW50Ci0gICAgICAgIHNlbGYuc3RyaWRlRCA9IDAgICMgdHlwZTogaW50Ci0gICAgICAgIHNlbGYuc3RyaWRlVyA9IDAgICMgdHlwZTogaW50Ci0gICAgICAgIHNlbGYuc3RyaWRlSCA9IDAgICMgdHlwZTogaW50Ci0gICAgICAgIHNlbGYuZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24gPSAwICAjIHR5cGU6IGludAotICAgICAgICBzZWxmLmRpbGF0aW9uREZhY3RvciA9IDEgICMgdHlwZTogaW50Ci0gICAgICAgIHNlbGYuZGlsYXRpb25XRmFjdG9yID0gMSAgIyB0eXBlOiBpbnQKLSAgICAgICAgc2VsZi5kaWxhdGlvbkhGYWN0b3IgPSAxICAjIHR5cGU6IGludAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBjb252M2RvcHRpb25zID0gQ29udjNET3B0aW9ucygpCi0gICAgICAgIGNvbnYzZG9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihjb252M2RvcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgY29udjNkb3B0aW9ucyk6Ci0gICAgICAgIHggPSBDb252M0RPcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhjb252M2RvcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBDb252M0RPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIGNvbnYzZG9wdGlvbnMpOgotICAgICAgICBpZiBjb252M2RvcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi5wYWRkaW5nID0gY29udjNkb3B0aW9ucy5QYWRkaW5nKCkKLSAgICAgICAgc2VsZi5zdHJpZGVEID0gY29udjNkb3B0aW9ucy5TdHJpZGVEKCkKLSAgICAgICAgc2VsZi5zdHJpZGVXID0gY29udjNkb3B0aW9ucy5TdHJpZGVXKCkKLSAgICAgICAgc2VsZi5zdHJpZGVIID0gY29udjNkb3B0aW9ucy5TdHJpZGVIKCkKLSAgICAgICAgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbiA9IGNvbnYzZG9wdGlvbnMuRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oKQotICAgICAgICBzZWxmLmRpbGF0aW9uREZhY3RvciA9IGNvbnYzZG9wdGlvbnMuRGlsYXRpb25ERmFjdG9yKCkKLSAgICAgICAgc2VsZi5kaWxhdGlvbldGYWN0b3IgPSBjb252M2RvcHRpb25zLkRpbGF0aW9uV0ZhY3RvcigpCi0gICAgICAgIHNlbGYuZGlsYXRpb25IRmFjdG9yID0gY29udjNkb3B0aW9ucy5EaWxhdGlvbkhGYWN0b3IoKQotCi0gICAgIyBDb252M0RPcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBDb252M0RPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgQ29udjNET3B0aW9uc0FkZFBhZGRpbmcoYnVpbGRlciwgc2VsZi5wYWRkaW5nKQotICAgICAgICBDb252M0RPcHRpb25zQWRkU3RyaWRlRChidWlsZGVyLCBzZWxmLnN0cmlkZUQpCi0gICAgICAgIENvbnYzRE9wdGlvbnNBZGRTdHJpZGVXKGJ1aWxkZXIsIHNlbGYuc3RyaWRlVykKLSAgICAgICAgQ29udjNET3B0aW9uc0FkZFN0cmlkZUgoYnVpbGRlciwgc2VsZi5zdHJpZGVIKQotICAgICAgICBDb252M0RPcHRpb25zQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbikKLSAgICAgICAgQ29udjNET3B0aW9uc0FkZERpbGF0aW9uREZhY3RvcihidWlsZGVyLCBzZWxmLmRpbGF0aW9uREZhY3RvcikKLSAgICAgICAgQ29udjNET3B0aW9uc0FkZERpbGF0aW9uV0ZhY3RvcihidWlsZGVyLCBzZWxmLmRpbGF0aW9uV0ZhY3RvcikKLSAgICAgICAgQ29udjNET3B0aW9uc0FkZERpbGF0aW9uSEZhY3RvcihidWlsZGVyLCBzZWxmLmRpbGF0aW9uSEZhY3RvcikKLSAgICAgICAgY29udjNkb3B0aW9ucyA9IENvbnYzRE9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIGNvbnYzZG9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBDb3NPcHRpb25zKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gQ29zT3B0aW9ucygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzQ29zT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIENvc09wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIENvc09wdGlvbnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi1kZWYgQ29zT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIENvc09wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIENvc09wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBDb3NPcHRpb25zRW5kKGJ1aWxkZXIpCi0KLWNsYXNzIENvc09wdGlvbnNUKG9iamVjdCk6Ci0KLSAgICAjIENvc09wdGlvbnNUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBwYXNzCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIGNvc09wdGlvbnMgPSBDb3NPcHRpb25zKCkKLSAgICAgICAgY29zT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGNvc09wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBjb3NPcHRpb25zKToKLSAgICAgICAgeCA9IENvc09wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKGNvc09wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIENvc09wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgY29zT3B0aW9ucyk6Ci0gICAgICAgIGlmIGNvc09wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgIyBDb3NPcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBDb3NPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgY29zT3B0aW9ucyA9IENvc09wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIGNvc09wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBDdW1zdW1PcHRpb25zKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gQ3Vtc3VtT3B0aW9ucygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzQ3Vtc3VtT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEN1bXN1bU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIEN1bXN1bU9wdGlvbnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi0gICAgIyBDdW1zdW1PcHRpb25zCi0gICAgZGVmIEV4Y2x1c2l2ZShzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKLSAgICAgICAgaWYgbyAhPSAwOgogICAgICAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuQm9vbEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykpCiAgICAgICAgIHJldHVybiBGYWxzZQogCi0gICAgIyBDdW1zdW1PcHRpb25zCi0gICAgZGVmIFJldmVyc2Uoc2VsZik6CitkZWYgU1ZERk9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDMpCisKK2RlZiBTVkRGT3B0aW9uc0FkZFJhbmsoYnVpbGRlciwgcmFuayk6CisgICAgYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDAsIHJhbmssIDApCisKK2RlZiBTVkRGT3B0aW9uc0FkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCgxLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbiwgMCkKKworZGVmIFNWREZPcHRpb25zQWRkQXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKGJ1aWxkZXIsIGFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyk6CisgICAgYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoMiwgYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzLCAwKQorCitkZWYgU1ZERk9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIFNWREZPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBTVkRGT3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYucmFuayA9IDAgICMgdHlwZTogaW50CisgICAgICAgIHNlbGYuZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24gPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyA9IEZhbHNlICAjIHR5cGU6IGJvb2wKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgc3ZkZm9wdGlvbnMgPSBTVkRGT3B0aW9ucygpCisgICAgICAgIHN2ZGZvcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooc3ZkZm9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzdmRmb3B0aW9ucyk6CisgICAgICAgIHggPSBTVkRGT3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2soc3ZkZm9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFNWREZPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIHN2ZGZvcHRpb25zKToKKyAgICAgICAgaWYgc3ZkZm9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnJhbmsgPSBzdmRmb3B0aW9ucy5SYW5rKCkKKyAgICAgICAgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbiA9IHN2ZGZvcHRpb25zLkZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKCkKKyAgICAgICAgc2VsZi5hc3ltbWV0cmljUXVhbnRpemVJbnB1dHMgPSBzdmRmb3B0aW9ucy5Bc3ltbWV0cmljUXVhbnRpemVJbnB1dHMoKQorCisgICAgIyBTVkRGT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgU1ZERk9wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICBTVkRGT3B0aW9uc0FkZFJhbmsoYnVpbGRlciwgc2VsZi5yYW5rKQorICAgICAgICBTVkRGT3B0aW9uc0FkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIHNlbGYuZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pCisgICAgICAgIFNWREZPcHRpb25zQWRkQXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKGJ1aWxkZXIsIHNlbGYuYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKQorICAgICAgICBzdmRmb3B0aW9ucyA9IFNWREZPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBzdmRmb3B0aW9ucworCisKK2NsYXNzIFJOTk9wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBSTk5PcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNSTk5PcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgorICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgUk5OT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgUk5OT3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKKyAgICAjIFJOTk9wdGlvbnMKKyAgICBkZWYgRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBSTk5PcHRpb25zCisgICAgZGVmIEFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyhzZWxmKToKICAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKICAgICAgICAgaWYgbyAhPSAwOgogICAgICAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuQm9vbEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykpCiAgICAgICAgIHJldHVybiBGYWxzZQogCi1kZWYgQ3Vtc3VtT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDIpCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEN1bXN1bU9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIEN1bXN1bU9wdGlvbnNBZGRFeGNsdXNpdmUoYnVpbGRlciwgZXhjbHVzaXZlKTogYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoMCwgZXhjbHVzaXZlLCAwKQotZGVmIEFkZEV4Y2x1c2l2ZShidWlsZGVyLCBleGNsdXNpdmUpOgotICAgIHJldHVybiBDdW1zdW1PcHRpb25zQWRkRXhjbHVzaXZlKGJ1aWxkZXIsIGV4Y2x1c2l2ZSkKLWRlZiBDdW1zdW1PcHRpb25zQWRkUmV2ZXJzZShidWlsZGVyLCByZXZlcnNlKTogYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoMSwgcmV2ZXJzZSwgMCkKLWRlZiBBZGRSZXZlcnNlKGJ1aWxkZXIsIHJldmVyc2UpOgotICAgIHJldHVybiBDdW1zdW1PcHRpb25zQWRkUmV2ZXJzZShidWlsZGVyLCByZXZlcnNlKQotZGVmIEN1bXN1bU9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBDdW1zdW1PcHRpb25zRW5kKGJ1aWxkZXIpCitkZWYgUk5OT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMikKIAotY2xhc3MgQ3Vtc3VtT3B0aW9uc1Qob2JqZWN0KToKK2RlZiBSTk5PcHRpb25zQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pOgorICAgIGJ1aWxkZXIuUHJlcGVuZEludDhTbG90KDAsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uLCAwKQogCi0gICAgIyBDdW1zdW1PcHRpb25zVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi5leGNsdXNpdmUgPSBGYWxzZSAgIyB0eXBlOiBib29sCi0gICAgICAgIHNlbGYucmV2ZXJzZSA9IEZhbHNlICAjIHR5cGU6IGJvb2wKK2RlZiBSTk5PcHRpb25zQWRkQXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKGJ1aWxkZXIsIGFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyk6CisgICAgYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoMSwgYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzLCAwKQogCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBjdW1zdW1PcHRpb25zID0gQ3Vtc3VtT3B0aW9ucygpCi0gICAgICAgIGN1bXN1bU9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihjdW1zdW1PcHRpb25zKQorZGVmIFJOTk9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKIAotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGN1bXN1bU9wdGlvbnMpOgotICAgICAgICB4ID0gQ3Vtc3VtT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2soY3Vtc3VtT3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKIAotICAgICMgQ3Vtc3VtT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBjdW1zdW1PcHRpb25zKToKLSAgICAgICAgaWYgY3Vtc3VtT3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYuZXhjbHVzaXZlID0gY3Vtc3VtT3B0aW9ucy5FeGNsdXNpdmUoKQotICAgICAgICBzZWxmLnJldmVyc2UgPSBjdW1zdW1PcHRpb25zLlJldmVyc2UoKQogCi0gICAgIyBDdW1zdW1PcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBDdW1zdW1PcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgQ3Vtc3VtT3B0aW9uc0FkZEV4Y2x1c2l2ZShidWlsZGVyLCBzZWxmLmV4Y2x1c2l2ZSkKLSAgICAgICAgQ3Vtc3VtT3B0aW9uc0FkZFJldmVyc2UoYnVpbGRlciwgc2VsZi5yZXZlcnNlKQotICAgICAgICBjdW1zdW1PcHRpb25zID0gQ3Vtc3VtT3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gY3Vtc3VtT3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKK2NsYXNzIFJOTk9wdGlvbnNUKG9iamVjdCk6CiAKLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotY2xhc3MgQ3VzdG9tT3B0aW9uc0Zvcm1hdChvYmplY3QpOgotICAgIEZMRVhCVUZGRVJTID0gMAotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIEN1c3RvbVF1YW50aXphdGlvbihvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IEN1c3RvbVF1YW50aXphdGlvbigpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzQ3VzdG9tUXVhbnRpemF0aW9uKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgQ3VzdG9tUXVhbnRpemF0aW9uQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBDdXN0b21RdWFudGl6YXRpb24KLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi0gICAgIyBDdXN0b21RdWFudGl6YXRpb24KLSAgICBkZWYgQ3VzdG9tKHNlbGYsIGopOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICBhID0gc2VsZi5fdGFiLlZlY3RvcihvKQotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVpbnQ4RmxhZ3MsIGEgKyBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGogKiAxKSkKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgQ3VzdG9tUXVhbnRpemF0aW9uCi0gICAgZGVmIEN1c3RvbUFzTnVtcHkoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0VmVjdG9yQXNOdW1weShmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVWludDhGbGFncywgbykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgQ3VzdG9tUXVhbnRpemF0aW9uCi0gICAgZGVmIEN1c3RvbUxlbmd0aChzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgQ3VzdG9tUXVhbnRpemF0aW9uCi0gICAgZGVmIEN1c3RvbUlzTm9uZShzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKLSAgICAgICAgcmV0dXJuIG8gPT0gMAotCi1kZWYgQ3VzdG9tUXVhbnRpemF0aW9uU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMSkKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gQ3VzdG9tUXVhbnRpemF0aW9uU3RhcnQoYnVpbGRlcikKLWRlZiBDdXN0b21RdWFudGl6YXRpb25BZGRDdXN0b20oYnVpbGRlciwgY3VzdG9tKTogYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMCwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShjdXN0b20pLCAwKQotZGVmIEFkZEN1c3RvbShidWlsZGVyLCBjdXN0b20pOgotICAgIHJldHVybiBDdXN0b21RdWFudGl6YXRpb25BZGRDdXN0b20oYnVpbGRlciwgY3VzdG9tKQotZGVmIEN1c3RvbVF1YW50aXphdGlvblN0YXJ0Q3VzdG9tVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKTogcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoMSwgbnVtRWxlbXMsIDEpCi1kZWYgU3RhcnRDdXN0b21WZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgotICAgIHJldHVybiBDdXN0b21RdWFudGl6YXRpb25TdGFydEN1c3RvbVZlY3RvcihidWlsZGVyLCBudW1FbGVtcykKLWRlZiBDdXN0b21RdWFudGl6YXRpb25FbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBDdXN0b21RdWFudGl6YXRpb25FbmQoYnVpbGRlcikKLXRyeToKLSAgICBmcm9tIHR5cGluZyBpbXBvcnQgTGlzdAotZXhjZXB0OgotICAgIHBhc3MKLQotY2xhc3MgQ3VzdG9tUXVhbnRpemF0aW9uVChvYmplY3QpOgotCi0gICAgIyBDdXN0b21RdWFudGl6YXRpb25UCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBzZWxmLmN1c3RvbSA9IE5vbmUgICMgdHlwZTogTGlzdFtpbnRdCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIGN1c3RvbVF1YW50aXphdGlvbiA9IEN1c3RvbVF1YW50aXphdGlvbigpCi0gICAgICAgIGN1c3RvbVF1YW50aXphdGlvbi5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGN1c3RvbVF1YW50aXphdGlvbikKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGN1c3RvbVF1YW50aXphdGlvbik6Ci0gICAgICAgIHggPSBDdXN0b21RdWFudGl6YXRpb25UKCkKLSAgICAgICAgeC5fVW5QYWNrKGN1c3RvbVF1YW50aXphdGlvbikKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgQ3VzdG9tUXVhbnRpemF0aW9uVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIGN1c3RvbVF1YW50aXphdGlvbik6Ci0gICAgICAgIGlmIGN1c3RvbVF1YW50aXphdGlvbiBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGlmIG5vdCBjdXN0b21RdWFudGl6YXRpb24uQ3VzdG9tSXNOb25lKCk6Ci0gICAgICAgICAgICBpZiBucCBpcyBOb25lOgotICAgICAgICAgICAgICAgIHNlbGYuY3VzdG9tID0gW10KLSAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShjdXN0b21RdWFudGl6YXRpb24uQ3VzdG9tTGVuZ3RoKCkpOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmN1c3RvbS5hcHBlbmQoY3VzdG9tUXVhbnRpemF0aW9uLkN1c3RvbShpKSkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi5jdXN0b20gPSBjdXN0b21RdWFudGl6YXRpb24uQ3VzdG9tQXNOdW1weSgpCi0KLSAgICAjIEN1c3RvbVF1YW50aXphdGlvblQKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgaWYgc2VsZi5jdXN0b20gaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBpZiBucCBpcyBub3QgTm9uZSBhbmQgdHlwZShzZWxmLmN1c3RvbSkgaXMgbnAubmRhcnJheToKLSAgICAgICAgICAgICAgICBjdXN0b20gPSBidWlsZGVyLkNyZWF0ZU51bXB5VmVjdG9yKHNlbGYuY3VzdG9tKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBDdXN0b21RdWFudGl6YXRpb25TdGFydEN1c3RvbVZlY3RvcihidWlsZGVyLCBsZW4oc2VsZi5jdXN0b20pKQotICAgICAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLmN1c3RvbSkpKToKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5QcmVwZW5kVWludDgoc2VsZi5jdXN0b21baV0pCi0gICAgICAgICAgICAgICAgY3VzdG9tID0gYnVpbGRlci5FbmRWZWN0b3IoKQotICAgICAgICBDdXN0b21RdWFudGl6YXRpb25TdGFydChidWlsZGVyKQotICAgICAgICBpZiBzZWxmLmN1c3RvbSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIEN1c3RvbVF1YW50aXphdGlvbkFkZEN1c3RvbShidWlsZGVyLCBjdXN0b20pCi0gICAgICAgIGN1c3RvbVF1YW50aXphdGlvbiA9IEN1c3RvbVF1YW50aXphdGlvbkVuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gY3VzdG9tUXVhbnRpemF0aW9uCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgRGVuc2lmeU9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBEZW5zaWZ5T3B0aW9ucygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzRGVuc2lmeU9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBEZW5zaWZ5T3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgRGVuc2lmeU9wdGlvbnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi1kZWYgRGVuc2lmeU9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgwKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBEZW5zaWZ5T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgRGVuc2lmeU9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBEZW5zaWZ5T3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBEZW5zaWZ5T3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgRGVuc2lmeU9wdGlvbnNUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBwYXNzCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIGRlbnNpZnlPcHRpb25zID0gRGVuc2lmeU9wdGlvbnMoKQotICAgICAgICBkZW5zaWZ5T3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGRlbnNpZnlPcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgZGVuc2lmeU9wdGlvbnMpOgotICAgICAgICB4ID0gRGVuc2lmeU9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKGRlbnNpZnlPcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBEZW5zaWZ5T3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBkZW5zaWZ5T3B0aW9ucyk6Ci0gICAgICAgIGlmIGRlbnNpZnlPcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLQotICAgICMgRGVuc2lmeU9wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIERlbnNpZnlPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgZGVuc2lmeU9wdGlvbnMgPSBEZW5zaWZ5T3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gZGVuc2lmeU9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBEZXB0aFRvU3BhY2VPcHRpb25zKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gRGVwdGhUb1NwYWNlT3B0aW9ucygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzRGVwdGhUb1NwYWNlT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIERlcHRoVG9TcGFjZU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIERlcHRoVG9TcGFjZU9wdGlvbnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi0gICAgIyBEZXB0aFRvU3BhY2VPcHRpb25zCi0gICAgZGVmIEJsb2NrU2l6ZShzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gMAotCi1kZWYgRGVwdGhUb1NwYWNlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDEpCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIERlcHRoVG9TcGFjZU9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIERlcHRoVG9TcGFjZU9wdGlvbnNBZGRCbG9ja1NpemUoYnVpbGRlciwgYmxvY2tTaXplKTogYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDAsIGJsb2NrU2l6ZSwgMCkKLWRlZiBBZGRCbG9ja1NpemUoYnVpbGRlciwgYmxvY2tTaXplKToKLSAgICByZXR1cm4gRGVwdGhUb1NwYWNlT3B0aW9uc0FkZEJsb2NrU2l6ZShidWlsZGVyLCBibG9ja1NpemUpCi1kZWYgRGVwdGhUb1NwYWNlT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIERlcHRoVG9TcGFjZU9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgRGVwdGhUb1NwYWNlT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgRGVwdGhUb1NwYWNlT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYuYmxvY2tTaXplID0gMCAgIyB0eXBlOiBpbnQKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgZGVwdGhUb1NwYWNlT3B0aW9ucyA9IERlcHRoVG9TcGFjZU9wdGlvbnMoKQotICAgICAgICBkZXB0aFRvU3BhY2VPcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooZGVwdGhUb1NwYWNlT3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGRlcHRoVG9TcGFjZU9wdGlvbnMpOgotICAgICAgICB4ID0gRGVwdGhUb1NwYWNlT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2soZGVwdGhUb1NwYWNlT3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgRGVwdGhUb1NwYWNlT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBkZXB0aFRvU3BhY2VPcHRpb25zKToKLSAgICAgICAgaWYgZGVwdGhUb1NwYWNlT3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYuYmxvY2tTaXplID0gZGVwdGhUb1NwYWNlT3B0aW9ucy5CbG9ja1NpemUoKQotCi0gICAgIyBEZXB0aFRvU3BhY2VPcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBEZXB0aFRvU3BhY2VPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgRGVwdGhUb1NwYWNlT3B0aW9uc0FkZEJsb2NrU2l6ZShidWlsZGVyLCBzZWxmLmJsb2NrU2l6ZSkKLSAgICAgICAgZGVwdGhUb1NwYWNlT3B0aW9ucyA9IERlcHRoVG9TcGFjZU9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIGRlcHRoVG9TcGFjZU9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBEZXB0aHdpc2VDb252MkRPcHRpb25zKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gRGVwdGh3aXNlQ29udjJET3B0aW9ucygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzRGVwdGh3aXNlQ29udjJET3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIERlcHRod2lzZUNvbnYyRE9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIERlcHRod2lzZUNvbnYyRE9wdGlvbnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi0gICAgIyBEZXB0aHdpc2VDb252MkRPcHRpb25zCi0gICAgZGVmIFBhZGRpbmcoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBEZXB0aHdpc2VDb252MkRPcHRpb25zCi0gICAgZGVmIFN0cmlkZVcoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgRGVwdGh3aXNlQ29udjJET3B0aW9ucwotICAgIGRlZiBTdHJpZGVIKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIERlcHRod2lzZUNvbnYyRE9wdGlvbnMKLSAgICBkZWYgRGVwdGhNdWx0aXBsaWVyKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEwKSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBEZXB0aHdpc2VDb252MkRPcHRpb25zCi0gICAgZGVmIEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEyKSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDhGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIERlcHRod2lzZUNvbnYyRE9wdGlvbnMKLSAgICBkZWYgRGlsYXRpb25XRmFjdG9yKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDE0KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gMQotCi0gICAgIyBEZXB0aHdpc2VDb252MkRPcHRpb25zCi0gICAgZGVmIERpbGF0aW9uSEZhY3RvcihzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxNikpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDEKLQotZGVmIERlcHRod2lzZUNvbnYyRE9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCg3KQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBEZXB0aHdpc2VDb252MkRPcHRpb25zU3RhcnQoYnVpbGRlcikKLWRlZiBEZXB0aHdpc2VDb252MkRPcHRpb25zQWRkUGFkZGluZyhidWlsZGVyLCBwYWRkaW5nKTogYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoMCwgcGFkZGluZywgMCkKLWRlZiBBZGRQYWRkaW5nKGJ1aWxkZXIsIHBhZGRpbmcpOgotICAgIHJldHVybiBEZXB0aHdpc2VDb252MkRPcHRpb25zQWRkUGFkZGluZyhidWlsZGVyLCBwYWRkaW5nKQotZGVmIERlcHRod2lzZUNvbnYyRE9wdGlvbnNBZGRTdHJpZGVXKGJ1aWxkZXIsIHN0cmlkZVcpOiBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMSwgc3RyaWRlVywgMCkKLWRlZiBBZGRTdHJpZGVXKGJ1aWxkZXIsIHN0cmlkZVcpOgotICAgIHJldHVybiBEZXB0aHdpc2VDb252MkRPcHRpb25zQWRkU3RyaWRlVyhidWlsZGVyLCBzdHJpZGVXKQotZGVmIERlcHRod2lzZUNvbnYyRE9wdGlvbnNBZGRTdHJpZGVIKGJ1aWxkZXIsIHN0cmlkZUgpOiBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMiwgc3RyaWRlSCwgMCkKLWRlZiBBZGRTdHJpZGVIKGJ1aWxkZXIsIHN0cmlkZUgpOgotICAgIHJldHVybiBEZXB0aHdpc2VDb252MkRPcHRpb25zQWRkU3RyaWRlSChidWlsZGVyLCBzdHJpZGVIKQotZGVmIERlcHRod2lzZUNvbnYyRE9wdGlvbnNBZGREZXB0aE11bHRpcGxpZXIoYnVpbGRlciwgZGVwdGhNdWx0aXBsaWVyKTogYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDMsIGRlcHRoTXVsdGlwbGllciwgMCkKLWRlZiBBZGREZXB0aE11bHRpcGxpZXIoYnVpbGRlciwgZGVwdGhNdWx0aXBsaWVyKToKLSAgICByZXR1cm4gRGVwdGh3aXNlQ29udjJET3B0aW9uc0FkZERlcHRoTXVsdGlwbGllcihidWlsZGVyLCBkZXB0aE11bHRpcGxpZXIpCi1kZWYgRGVwdGh3aXNlQ29udjJET3B0aW9uc0FkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKTogYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoNCwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24sIDApCi1kZWYgQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pOgotICAgIHJldHVybiBEZXB0aHdpc2VDb252MkRPcHRpb25zQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pCi1kZWYgRGVwdGh3aXNlQ29udjJET3B0aW9uc0FkZERpbGF0aW9uV0ZhY3RvcihidWlsZGVyLCBkaWxhdGlvbldGYWN0b3IpOiBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoNSwgZGlsYXRpb25XRmFjdG9yLCAxKQotZGVmIEFkZERpbGF0aW9uV0ZhY3RvcihidWlsZGVyLCBkaWxhdGlvbldGYWN0b3IpOgotICAgIHJldHVybiBEZXB0aHdpc2VDb252MkRPcHRpb25zQWRkRGlsYXRpb25XRmFjdG9yKGJ1aWxkZXIsIGRpbGF0aW9uV0ZhY3RvcikKLWRlZiBEZXB0aHdpc2VDb252MkRPcHRpb25zQWRkRGlsYXRpb25IRmFjdG9yKGJ1aWxkZXIsIGRpbGF0aW9uSEZhY3Rvcik6IGJ1aWxkZXIuUHJlcGVuZEludDMyU2xvdCg2LCBkaWxhdGlvbkhGYWN0b3IsIDEpCi1kZWYgQWRkRGlsYXRpb25IRmFjdG9yKGJ1aWxkZXIsIGRpbGF0aW9uSEZhY3Rvcik6Ci0gICAgcmV0dXJuIERlcHRod2lzZUNvbnYyRE9wdGlvbnNBZGREaWxhdGlvbkhGYWN0b3IoYnVpbGRlciwgZGlsYXRpb25IRmFjdG9yKQotZGVmIERlcHRod2lzZUNvbnYyRE9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBEZXB0aHdpc2VDb252MkRPcHRpb25zRW5kKGJ1aWxkZXIpCi0KLWNsYXNzIERlcHRod2lzZUNvbnYyRE9wdGlvbnNUKG9iamVjdCk6Ci0KLSAgICAjIERlcHRod2lzZUNvbnYyRE9wdGlvbnNUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBzZWxmLnBhZGRpbmcgPSAwICAjIHR5cGU6IGludAotICAgICAgICBzZWxmLnN0cmlkZVcgPSAwICAjIHR5cGU6IGludAotICAgICAgICBzZWxmLnN0cmlkZUggPSAwICAjIHR5cGU6IGludAotICAgICAgICBzZWxmLmRlcHRoTXVsdGlwbGllciA9IDAgICMgdHlwZTogaW50Ci0gICAgICAgIHNlbGYuZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24gPSAwICAjIHR5cGU6IGludAotICAgICAgICBzZWxmLmRpbGF0aW9uV0ZhY3RvciA9IDEgICMgdHlwZTogaW50Ci0gICAgICAgIHNlbGYuZGlsYXRpb25IRmFjdG9yID0gMSAgIyB0eXBlOiBpbnQKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgZGVwdGh3aXNlQ29udjJkb3B0aW9ucyA9IERlcHRod2lzZUNvbnYyRE9wdGlvbnMoKQotICAgICAgICBkZXB0aHdpc2VDb252MmRvcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooZGVwdGh3aXNlQ29udjJkb3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGRlcHRod2lzZUNvbnYyZG9wdGlvbnMpOgotICAgICAgICB4ID0gRGVwdGh3aXNlQ29udjJET3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2soZGVwdGh3aXNlQ29udjJkb3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgRGVwdGh3aXNlQ29udjJET3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBkZXB0aHdpc2VDb252MmRvcHRpb25zKToKLSAgICAgICAgaWYgZGVwdGh3aXNlQ29udjJkb3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYucGFkZGluZyA9IGRlcHRod2lzZUNvbnYyZG9wdGlvbnMuUGFkZGluZygpCi0gICAgICAgIHNlbGYuc3RyaWRlVyA9IGRlcHRod2lzZUNvbnYyZG9wdGlvbnMuU3RyaWRlVygpCi0gICAgICAgIHNlbGYuc3RyaWRlSCA9IGRlcHRod2lzZUNvbnYyZG9wdGlvbnMuU3RyaWRlSCgpCi0gICAgICAgIHNlbGYuZGVwdGhNdWx0aXBsaWVyID0gZGVwdGh3aXNlQ29udjJkb3B0aW9ucy5EZXB0aE11bHRpcGxpZXIoKQotICAgICAgICBzZWxmLmZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uID0gZGVwdGh3aXNlQ29udjJkb3B0aW9ucy5GdXNlZEFjdGl2YXRpb25GdW5jdGlvbigpCi0gICAgICAgIHNlbGYuZGlsYXRpb25XRmFjdG9yID0gZGVwdGh3aXNlQ29udjJkb3B0aW9ucy5EaWxhdGlvbldGYWN0b3IoKQotICAgICAgICBzZWxmLmRpbGF0aW9uSEZhY3RvciA9IGRlcHRod2lzZUNvbnYyZG9wdGlvbnMuRGlsYXRpb25IRmFjdG9yKCkKLQotICAgICMgRGVwdGh3aXNlQ29udjJET3B0aW9uc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgRGVwdGh3aXNlQ29udjJET3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIERlcHRod2lzZUNvbnYyRE9wdGlvbnNBZGRQYWRkaW5nKGJ1aWxkZXIsIHNlbGYucGFkZGluZykKLSAgICAgICAgRGVwdGh3aXNlQ29udjJET3B0aW9uc0FkZFN0cmlkZVcoYnVpbGRlciwgc2VsZi5zdHJpZGVXKQotICAgICAgICBEZXB0aHdpc2VDb252MkRPcHRpb25zQWRkU3RyaWRlSChidWlsZGVyLCBzZWxmLnN0cmlkZUgpCi0gICAgICAgIERlcHRod2lzZUNvbnYyRE9wdGlvbnNBZGREZXB0aE11bHRpcGxpZXIoYnVpbGRlciwgc2VsZi5kZXB0aE11bHRpcGxpZXIpCi0gICAgICAgIERlcHRod2lzZUNvbnYyRE9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBzZWxmLmZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKQotICAgICAgICBEZXB0aHdpc2VDb252MkRPcHRpb25zQWRkRGlsYXRpb25XRmFjdG9yKGJ1aWxkZXIsIHNlbGYuZGlsYXRpb25XRmFjdG9yKQotICAgICAgICBEZXB0aHdpc2VDb252MkRPcHRpb25zQWRkRGlsYXRpb25IRmFjdG9yKGJ1aWxkZXIsIHNlbGYuZGlsYXRpb25IRmFjdG9yKQotICAgICAgICBkZXB0aHdpc2VDb252MmRvcHRpb25zID0gRGVwdGh3aXNlQ29udjJET3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gZGVwdGh3aXNlQ29udjJkb3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIERlcXVhbnRpemVPcHRpb25zKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gRGVxdWFudGl6ZU9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc0RlcXVhbnRpemVPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgRGVxdWFudGl6ZU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIERlcXVhbnRpemVPcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotZGVmIERlcXVhbnRpemVPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gRGVxdWFudGl6ZU9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIERlcXVhbnRpemVPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gRGVxdWFudGl6ZU9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgRGVxdWFudGl6ZU9wdGlvbnNUKG9iamVjdCk6Ci0KLSAgICAjIERlcXVhbnRpemVPcHRpb25zVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgcGFzcwotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBkZXF1YW50aXplT3B0aW9ucyA9IERlcXVhbnRpemVPcHRpb25zKCkKLSAgICAgICAgZGVxdWFudGl6ZU9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihkZXF1YW50aXplT3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGRlcXVhbnRpemVPcHRpb25zKToKLSAgICAgICAgeCA9IERlcXVhbnRpemVPcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhkZXF1YW50aXplT3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgRGVxdWFudGl6ZU9wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgZGVxdWFudGl6ZU9wdGlvbnMpOgotICAgICAgICBpZiBkZXF1YW50aXplT3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAjIERlcXVhbnRpemVPcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBEZXF1YW50aXplT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIGRlcXVhbnRpemVPcHRpb25zID0gRGVxdWFudGl6ZU9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIGRlcXVhbnRpemVPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgRGltZW5zaW9uTWV0YWRhdGEob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBEaW1lbnNpb25NZXRhZGF0YSgpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzRGltZW5zaW9uTWV0YWRhdGEoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBEaW1lbnNpb25NZXRhZGF0YUJ1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgRGltZW5zaW9uTWV0YWRhdGEKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi0gICAgIyBEaW1lbnNpb25NZXRhZGF0YQotICAgIGRlZiBGb3JtYXQoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBEaW1lbnNpb25NZXRhZGF0YQotICAgIGRlZiBEZW5zZVNpemUoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgRGltZW5zaW9uTWV0YWRhdGEKLSAgICBkZWYgQXJyYXlTZWdtZW50c1R5cGUoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VaW50OEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgRGltZW5zaW9uTWV0YWRhdGEKLSAgICBkZWYgQXJyYXlTZWdtZW50cyhzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIGZyb20gZmxhdGJ1ZmZlcnMudGFibGUgaW1wb3J0IFRhYmxlCi0gICAgICAgICAgICBvYmogPSBUYWJsZShieXRlYXJyYXkoKSwgMCkKLSAgICAgICAgICAgIHNlbGYuX3RhYi5VbmlvbihvYmosIG8pCi0gICAgICAgICAgICByZXR1cm4gb2JqCi0gICAgICAgIHJldHVybiBOb25lCi0KLSAgICAjIERpbWVuc2lvbk1ldGFkYXRhCi0gICAgZGVmIEFycmF5SW5kaWNlc1R5cGUoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTIpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVWludDhGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIERpbWVuc2lvbk1ldGFkYXRhCi0gICAgZGVmIEFycmF5SW5kaWNlcyhzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIGZyb20gZmxhdGJ1ZmZlcnMudGFibGUgaW1wb3J0IFRhYmxlCi0gICAgICAgICAgICBvYmogPSBUYWJsZShieXRlYXJyYXkoKSwgMCkKLSAgICAgICAgICAgIHNlbGYuX3RhYi5VbmlvbihvYmosIG8pCi0gICAgICAgICAgICByZXR1cm4gb2JqCi0gICAgICAgIHJldHVybiBOb25lCi0KLWRlZiBEaW1lbnNpb25NZXRhZGF0YVN0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDYpCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIERpbWVuc2lvbk1ldGFkYXRhU3RhcnQoYnVpbGRlcikKLWRlZiBEaW1lbnNpb25NZXRhZGF0YUFkZEZvcm1hdChidWlsZGVyLCBmb3JtYXQpOiBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCgwLCBmb3JtYXQsIDApCi1kZWYgQWRkRm9ybWF0KGJ1aWxkZXIsIGZvcm1hdCk6Ci0gICAgcmV0dXJuIERpbWVuc2lvbk1ldGFkYXRhQWRkRm9ybWF0KGJ1aWxkZXIsIGZvcm1hdCkKLWRlZiBEaW1lbnNpb25NZXRhZGF0YUFkZERlbnNlU2l6ZShidWlsZGVyLCBkZW5zZVNpemUpOiBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMSwgZGVuc2VTaXplLCAwKQotZGVmIEFkZERlbnNlU2l6ZShidWlsZGVyLCBkZW5zZVNpemUpOgotICAgIHJldHVybiBEaW1lbnNpb25NZXRhZGF0YUFkZERlbnNlU2l6ZShidWlsZGVyLCBkZW5zZVNpemUpCi1kZWYgRGltZW5zaW9uTWV0YWRhdGFBZGRBcnJheVNlZ21lbnRzVHlwZShidWlsZGVyLCBhcnJheVNlZ21lbnRzVHlwZSk6IGJ1aWxkZXIuUHJlcGVuZFVpbnQ4U2xvdCgyLCBhcnJheVNlZ21lbnRzVHlwZSwgMCkKLWRlZiBBZGRBcnJheVNlZ21lbnRzVHlwZShidWlsZGVyLCBhcnJheVNlZ21lbnRzVHlwZSk6Ci0gICAgcmV0dXJuIERpbWVuc2lvbk1ldGFkYXRhQWRkQXJyYXlTZWdtZW50c1R5cGUoYnVpbGRlciwgYXJyYXlTZWdtZW50c1R5cGUpCi1kZWYgRGltZW5zaW9uTWV0YWRhdGFBZGRBcnJheVNlZ21lbnRzKGJ1aWxkZXIsIGFycmF5U2VnbWVudHMpOiBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgzLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGFycmF5U2VnbWVudHMpLCAwKQotZGVmIEFkZEFycmF5U2VnbWVudHMoYnVpbGRlciwgYXJyYXlTZWdtZW50cyk6Ci0gICAgcmV0dXJuIERpbWVuc2lvbk1ldGFkYXRhQWRkQXJyYXlTZWdtZW50cyhidWlsZGVyLCBhcnJheVNlZ21lbnRzKQotZGVmIERpbWVuc2lvbk1ldGFkYXRhQWRkQXJyYXlJbmRpY2VzVHlwZShidWlsZGVyLCBhcnJheUluZGljZXNUeXBlKTogYnVpbGRlci5QcmVwZW5kVWludDhTbG90KDQsIGFycmF5SW5kaWNlc1R5cGUsIDApCi1kZWYgQWRkQXJyYXlJbmRpY2VzVHlwZShidWlsZGVyLCBhcnJheUluZGljZXNUeXBlKToKLSAgICByZXR1cm4gRGltZW5zaW9uTWV0YWRhdGFBZGRBcnJheUluZGljZXNUeXBlKGJ1aWxkZXIsIGFycmF5SW5kaWNlc1R5cGUpCi1kZWYgRGltZW5zaW9uTWV0YWRhdGFBZGRBcnJheUluZGljZXMoYnVpbGRlciwgYXJyYXlJbmRpY2VzKTogYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoNSwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShhcnJheUluZGljZXMpLCAwKQotZGVmIEFkZEFycmF5SW5kaWNlcyhidWlsZGVyLCBhcnJheUluZGljZXMpOgotICAgIHJldHVybiBEaW1lbnNpb25NZXRhZGF0YUFkZEFycmF5SW5kaWNlcyhidWlsZGVyLCBhcnJheUluZGljZXMpCi1kZWYgRGltZW5zaW9uTWV0YWRhdGFFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBEaW1lbnNpb25NZXRhZGF0YUVuZChidWlsZGVyKQotdHJ5OgotICAgIGZyb20gdHlwaW5nIGltcG9ydCBVbmlvbgotZXhjZXB0OgotICAgIHBhc3MKLQotY2xhc3MgRGltZW5zaW9uTWV0YWRhdGFUKG9iamVjdCk6Ci0KLSAgICAjIERpbWVuc2lvbk1ldGFkYXRhVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi5mb3JtYXQgPSAwICAjIHR5cGU6IGludAotICAgICAgICBzZWxmLmRlbnNlU2l6ZSA9IDAgICMgdHlwZTogaW50Ci0gICAgICAgIHNlbGYuYXJyYXlTZWdtZW50c1R5cGUgPSAwICAjIHR5cGU6IGludAotICAgICAgICBzZWxmLmFycmF5U2VnbWVudHMgPSBOb25lICAjIHR5cGU6IFVuaW9uW05vbmUsIEludDMyVmVjdG9yVCwgVWludDE2VmVjdG9yVCwgVWludDhWZWN0b3JUXQotICAgICAgICBzZWxmLmFycmF5SW5kaWNlc1R5cGUgPSAwICAjIHR5cGU6IGludAotICAgICAgICBzZWxmLmFycmF5SW5kaWNlcyA9IE5vbmUgICMgdHlwZTogVW5pb25bTm9uZSwgSW50MzJWZWN0b3JULCBVaW50MTZWZWN0b3JULCBVaW50OFZlY3RvclRdCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIGRpbWVuc2lvbk1ldGFkYXRhID0gRGltZW5zaW9uTWV0YWRhdGEoKQotICAgICAgICBkaW1lbnNpb25NZXRhZGF0YS5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGRpbWVuc2lvbk1ldGFkYXRhKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgZGltZW5zaW9uTWV0YWRhdGEpOgotICAgICAgICB4ID0gRGltZW5zaW9uTWV0YWRhdGFUKCkKLSAgICAgICAgeC5fVW5QYWNrKGRpbWVuc2lvbk1ldGFkYXRhKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBEaW1lbnNpb25NZXRhZGF0YVQKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBkaW1lbnNpb25NZXRhZGF0YSk6Ci0gICAgICAgIGlmIGRpbWVuc2lvbk1ldGFkYXRhIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi5mb3JtYXQgPSBkaW1lbnNpb25NZXRhZGF0YS5Gb3JtYXQoKQotICAgICAgICBzZWxmLmRlbnNlU2l6ZSA9IGRpbWVuc2lvbk1ldGFkYXRhLkRlbnNlU2l6ZSgpCi0gICAgICAgIHNlbGYuYXJyYXlTZWdtZW50c1R5cGUgPSBkaW1lbnNpb25NZXRhZGF0YS5BcnJheVNlZ21lbnRzVHlwZSgpCi0gICAgICAgIHNlbGYuYXJyYXlTZWdtZW50cyA9IFNwYXJzZUluZGV4VmVjdG9yQ3JlYXRvcihzZWxmLmFycmF5U2VnbWVudHNUeXBlLCBkaW1lbnNpb25NZXRhZGF0YS5BcnJheVNlZ21lbnRzKCkpCi0gICAgICAgIHNlbGYuYXJyYXlJbmRpY2VzVHlwZSA9IGRpbWVuc2lvbk1ldGFkYXRhLkFycmF5SW5kaWNlc1R5cGUoKQotICAgICAgICBzZWxmLmFycmF5SW5kaWNlcyA9IFNwYXJzZUluZGV4VmVjdG9yQ3JlYXRvcihzZWxmLmFycmF5SW5kaWNlc1R5cGUsIGRpbWVuc2lvbk1ldGFkYXRhLkFycmF5SW5kaWNlcygpKQotCi0gICAgIyBEaW1lbnNpb25NZXRhZGF0YVQKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgaWYgc2VsZi5hcnJheVNlZ21lbnRzIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgYXJyYXlTZWdtZW50cyA9IHNlbGYuYXJyYXlTZWdtZW50cy5QYWNrKGJ1aWxkZXIpCi0gICAgICAgIGlmIHNlbGYuYXJyYXlJbmRpY2VzIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgYXJyYXlJbmRpY2VzID0gc2VsZi5hcnJheUluZGljZXMuUGFjayhidWlsZGVyKQotICAgICAgICBEaW1lbnNpb25NZXRhZGF0YVN0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIERpbWVuc2lvbk1ldGFkYXRhQWRkRm9ybWF0KGJ1aWxkZXIsIHNlbGYuZm9ybWF0KQotICAgICAgICBEaW1lbnNpb25NZXRhZGF0YUFkZERlbnNlU2l6ZShidWlsZGVyLCBzZWxmLmRlbnNlU2l6ZSkKLSAgICAgICAgRGltZW5zaW9uTWV0YWRhdGFBZGRBcnJheVNlZ21lbnRzVHlwZShidWlsZGVyLCBzZWxmLmFycmF5U2VnbWVudHNUeXBlKQotICAgICAgICBpZiBzZWxmLmFycmF5U2VnbWVudHMgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBEaW1lbnNpb25NZXRhZGF0YUFkZEFycmF5U2VnbWVudHMoYnVpbGRlciwgYXJyYXlTZWdtZW50cykKLSAgICAgICAgRGltZW5zaW9uTWV0YWRhdGFBZGRBcnJheUluZGljZXNUeXBlKGJ1aWxkZXIsIHNlbGYuYXJyYXlJbmRpY2VzVHlwZSkKLSAgICAgICAgaWYgc2VsZi5hcnJheUluZGljZXMgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBEaW1lbnNpb25NZXRhZGF0YUFkZEFycmF5SW5kaWNlcyhidWlsZGVyLCBhcnJheUluZGljZXMpCi0gICAgICAgIGRpbWVuc2lvbk1ldGFkYXRhID0gRGltZW5zaW9uTWV0YWRhdGFFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIGRpbWVuc2lvbk1ldGFkYXRhCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWNsYXNzIERpbWVuc2lvblR5cGUob2JqZWN0KToKLSAgICBERU5TRSA9IDAKLSAgICBTUEFSU0VfQ1NSID0gMQotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIERpdk9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBEaXZPcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNEaXZPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgRGl2T3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgRGl2T3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLSAgICAjIERpdk9wdGlvbnMKLSAgICBkZWYgRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gMAotCi1kZWYgRGl2T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDEpCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIERpdk9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIERpdk9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbik6IGJ1aWxkZXIuUHJlcGVuZEludDhTbG90KDAsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uLCAwKQotZGVmIEFkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKToKLSAgICByZXR1cm4gRGl2T3B0aW9uc0FkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKQotZGVmIERpdk9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBEaXZPcHRpb25zRW5kKGJ1aWxkZXIpCi0KLWNsYXNzIERpdk9wdGlvbnNUKG9iamVjdCk6Ci0KLSAgICAjIERpdk9wdGlvbnNUCisgICAgIyBSTk5PcHRpb25zVAogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbiA9IDAgICMgdHlwZTogaW50CisgICAgICAgIHNlbGYuYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzID0gRmFsc2UgICMgdHlwZTogYm9vbAogCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBkaXZPcHRpb25zID0gRGl2T3B0aW9ucygpCi0gICAgICAgIGRpdk9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihkaXZPcHRpb25zKQorICAgICAgICBybm5vcHRpb25zID0gUk5OT3B0aW9ucygpCisgICAgICAgIHJubm9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihybm5vcHRpb25zKQogCiAgICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgZGl2T3B0aW9ucyk6Ci0gICAgICAgIHggPSBEaXZPcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhkaXZPcHRpb25zKQorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHJubm9wdGlvbnMpOgorICAgICAgICB4ID0gUk5OT3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2socm5ub3B0aW9ucykKICAgICAgICAgcmV0dXJuIHgKIAotICAgICMgRGl2T3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBkaXZPcHRpb25zKToKLSAgICAgICAgaWYgZGl2T3B0aW9ucyBpcyBOb25lOgorICAgICMgUk5OT3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBybm5vcHRpb25zKToKKyAgICAgICAgaWYgcm5ub3B0aW9ucyBpcyBOb25lOgogICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYuZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24gPSBkaXZPcHRpb25zLkZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKCkKKyAgICAgICAgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbiA9IHJubm9wdGlvbnMuRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oKQorICAgICAgICBzZWxmLmFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyA9IHJubm9wdGlvbnMuQXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKCkKIAotICAgICMgRGl2T3B0aW9uc1QKKyAgICAjIFJOTk9wdGlvbnNUCiAgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIERpdk9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBEaXZPcHRpb25zQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbikKLSAgICAgICAgZGl2T3B0aW9ucyA9IERpdk9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIGRpdk9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisgICAgICAgIFJOTk9wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICBSTk5PcHRpb25zQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbikKKyAgICAgICAgUk5OT3B0aW9uc0FkZEFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyhidWlsZGVyLCBzZWxmLmFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cykKKyAgICAgICAgcm5ub3B0aW9ucyA9IFJOTk9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHJubm9wdGlvbnMKIAotIyBuYW1lc3BhY2U6IHRmbGl0ZQogCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnMob2JqZWN0KToKK2NsYXNzIFNlcXVlbmNlUk5OT3B0aW9ucyhvYmplY3QpOgogICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCiAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CiAgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnMoKQorICAgICAgICB4ID0gU2VxdWVuY2VSTk5PcHRpb25zKCkKICAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKICAgICAgICAgcmV0dXJuIHgKIAogICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNEeW5hbWljVXBkYXRlU2xpY2VPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgZGVmIEdldFJvb3RBc1NlcXVlbmNlUk5OT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgogICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKICAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCiAgICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgIGRlZiBTZXF1ZW5jZVJOTk9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgogICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCiAKLSAgICAjIER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnMKKyAgICAjIFNlcXVlbmNlUk5OT3B0aW9ucwogICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKICAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCiAKLWRlZiBEeW5hbWljVXBkYXRlU2xpY2VPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gRHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgRHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgRHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgRHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgZHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9ucyA9IER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnMoKQotICAgICAgICBkeW5hbWljVXBkYXRlU2xpY2VPcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooZHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGR5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnMpOgotICAgICAgICB4ID0gRHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2soZHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgRHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBkeW5hbWljVXBkYXRlU2xpY2VPcHRpb25zKToKLSAgICAgICAgaWYgZHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAjIER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBkeW5hbWljVXBkYXRlU2xpY2VPcHRpb25zID0gRHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gZHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIEVtYmVkZGluZ0xvb2t1cFNwYXJzZU9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgRW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgRW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLSAgICAjIEVtYmVkZGluZ0xvb2t1cFNwYXJzZU9wdGlvbnMKLSAgICBkZWYgQ29tYmluZXIoc2VsZik6CisgICAgIyBTZXF1ZW5jZVJOTk9wdGlvbnMKKyAgICBkZWYgVGltZU1ham9yKHNlbGYpOgogICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQogICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gYm9vbChzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5Cb29sRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKSkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAjIFNlcXVlbmNlUk5OT3B0aW9ucworICAgIGRlZiBGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKKyAgICAgICAgaWYgbyAhPSAwOgogICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDhGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCiAgICAgICAgIHJldHVybiAwCiAKLWRlZiBFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMSkKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gRW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgRW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9uc0FkZENvbWJpbmVyKGJ1aWxkZXIsIGNvbWJpbmVyKTogYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoMCwgY29tYmluZXIsIDApCi1kZWYgQWRkQ29tYmluZXIoYnVpbGRlciwgY29tYmluZXIpOgotICAgIHJldHVybiBFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zQWRkQ29tYmluZXIoYnVpbGRlciwgY29tYmluZXIpCi1kZWYgRW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEVtYmVkZGluZ0xvb2t1cFNwYXJzZU9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgRW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgRW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYuY29tYmluZXIgPSAwICAjIHR5cGU6IGludAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBlbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zID0gRW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9ucygpCi0gICAgICAgIGVtYmVkZGluZ0xvb2t1cFNwYXJzZU9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihlbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgZW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9ucyk6Ci0gICAgICAgIHggPSBFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhlbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIGVtYmVkZGluZ0xvb2t1cFNwYXJzZU9wdGlvbnMpOgotICAgICAgICBpZiBlbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi5jb21iaW5lciA9IGVtYmVkZGluZ0xvb2t1cFNwYXJzZU9wdGlvbnMuQ29tYmluZXIoKQotCi0gICAgIyBFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgRW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9uc0FkZENvbWJpbmVyKGJ1aWxkZXIsIHNlbGYuY29tYmluZXIpCi0gICAgICAgIGVtYmVkZGluZ0xvb2t1cFNwYXJzZU9wdGlvbnMgPSBFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBlbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgRXF1YWxPcHRpb25zKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gRXF1YWxPcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNFcXVhbE9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBFcXVhbE9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIEVxdWFsT3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLWRlZiBFcXVhbE9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgwKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBFcXVhbE9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIEVxdWFsT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEVxdWFsT3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBFcXVhbE9wdGlvbnNUKG9iamVjdCk6Ci0KLSAgICAjIEVxdWFsT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgZXF1YWxPcHRpb25zID0gRXF1YWxPcHRpb25zKCkKLSAgICAgICAgZXF1YWxPcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooZXF1YWxPcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgZXF1YWxPcHRpb25zKToKLSAgICAgICAgeCA9IEVxdWFsT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2soZXF1YWxPcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBFcXVhbE9wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgZXF1YWxPcHRpb25zKToKLSAgICAgICAgaWYgZXF1YWxPcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLQotICAgICMgRXF1YWxPcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBFcXVhbE9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBlcXVhbE9wdGlvbnMgPSBFcXVhbE9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIGVxdWFsT3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIEV4cE9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBFeHBPcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNFeHBPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgRXhwT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgRXhwT3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLWRlZiBFeHBPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gRXhwT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgRXhwT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEV4cE9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgRXhwT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgRXhwT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgZXhwT3B0aW9ucyA9IEV4cE9wdGlvbnMoKQotICAgICAgICBleHBPcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooZXhwT3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGV4cE9wdGlvbnMpOgotICAgICAgICB4ID0gRXhwT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2soZXhwT3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgRXhwT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBleHBPcHRpb25zKToKLSAgICAgICAgaWYgZXhwT3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAjIEV4cE9wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIEV4cE9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBleHBPcHRpb25zID0gRXhwT3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gZXhwT3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIEV4cGFuZERpbXNPcHRpb25zKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gRXhwYW5kRGltc09wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc0V4cGFuZERpbXNPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgRXhwYW5kRGltc09wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIEV4cGFuZERpbXNPcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotZGVmIEV4cGFuZERpbXNPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gRXhwYW5kRGltc09wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIEV4cGFuZERpbXNPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gRXhwYW5kRGltc09wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgRXhwYW5kRGltc09wdGlvbnNUKG9iamVjdCk6Ci0KLSAgICAjIEV4cGFuZERpbXNPcHRpb25zVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgcGFzcwotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBleHBhbmREaW1zT3B0aW9ucyA9IEV4cGFuZERpbXNPcHRpb25zKCkKLSAgICAgICAgZXhwYW5kRGltc09wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihleHBhbmREaW1zT3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGV4cGFuZERpbXNPcHRpb25zKToKLSAgICAgICAgeCA9IEV4cGFuZERpbXNPcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhleHBhbmREaW1zT3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgRXhwYW5kRGltc09wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgZXhwYW5kRGltc09wdGlvbnMpOgotICAgICAgICBpZiBleHBhbmREaW1zT3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAjIEV4cGFuZERpbXNPcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBFeHBhbmREaW1zT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIGV4cGFuZERpbXNPcHRpb25zID0gRXhwYW5kRGltc09wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIGV4cGFuZERpbXNPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgRmFrZVF1YW50T3B0aW9ucyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IEZha2VRdWFudE9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc0Zha2VRdWFudE9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBGYWtlUXVhbnRPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBGYWtlUXVhbnRPcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotICAgICMgRmFrZVF1YW50T3B0aW9ucwotICAgIGRlZiBNaW4oc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5GbG9hdDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gMC4wCi0KLSAgICAjIEZha2VRdWFudE9wdGlvbnMKLSAgICBkZWYgTWF4KHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuRmxvYXQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAuMAotCi0gICAgIyBGYWtlUXVhbnRPcHRpb25zCi0gICAgZGVmIE51bUJpdHMoc2VsZik6CisgICAgIyBTZXF1ZW5jZVJOTk9wdGlvbnMKKyAgICBkZWYgQXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKHNlbGYpOgogICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQogICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgICAgICByZXR1cm4gYm9vbChzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5Cb29sRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKSkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKK2RlZiBTZXF1ZW5jZVJOTk9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDMpCisKK2RlZiBTZXF1ZW5jZVJOTk9wdGlvbnNBZGRUaW1lTWFqb3IoYnVpbGRlciwgdGltZU1ham9yKToKKyAgICBidWlsZGVyLlByZXBlbmRCb29sU2xvdCgwLCB0aW1lTWFqb3IsIDApCisKK2RlZiBTZXF1ZW5jZVJOTk9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbik6CisgICAgYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoMSwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24sIDApCisKK2RlZiBTZXF1ZW5jZVJOTk9wdGlvbnNBZGRBc3ltbWV0cmljUXVhbnRpemVJbnB1dHMoYnVpbGRlciwgYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKToKKyAgICBidWlsZGVyLlByZXBlbmRCb29sU2xvdCgyLCBhc3ltbWV0cmljUXVhbnRpemVJbnB1dHMsIDApCisKK2RlZiBTZXF1ZW5jZVJOTk9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIFNlcXVlbmNlUk5OT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgU2VxdWVuY2VSTk5PcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi50aW1lTWFqb3IgPSBGYWxzZSAgIyB0eXBlOiBib29sCisgICAgICAgIHNlbGYuZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24gPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyA9IEZhbHNlICAjIHR5cGU6IGJvb2wKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VxdWVuY2VSbm5vcHRpb25zID0gU2VxdWVuY2VSTk5PcHRpb25zKCkKKyAgICAgICAgc2VxdWVuY2VSbm5vcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooc2VxdWVuY2VSbm5vcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgc2VxdWVuY2VSbm5vcHRpb25zKToKKyAgICAgICAgeCA9IFNlcXVlbmNlUk5OT3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2soc2VxdWVuY2VSbm5vcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBTZXF1ZW5jZVJOTk9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgc2VxdWVuY2VSbm5vcHRpb25zKToKKyAgICAgICAgaWYgc2VxdWVuY2VSbm5vcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi50aW1lTWFqb3IgPSBzZXF1ZW5jZVJubm9wdGlvbnMuVGltZU1ham9yKCkKKyAgICAgICAgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbiA9IHNlcXVlbmNlUm5ub3B0aW9ucy5GdXNlZEFjdGl2YXRpb25GdW5jdGlvbigpCisgICAgICAgIHNlbGYuYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzID0gc2VxdWVuY2VSbm5vcHRpb25zLkFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cygpCisKKyAgICAjIFNlcXVlbmNlUk5OT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgU2VxdWVuY2VSTk5PcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgU2VxdWVuY2VSTk5PcHRpb25zQWRkVGltZU1ham9yKGJ1aWxkZXIsIHNlbGYudGltZU1ham9yKQorICAgICAgICBTZXF1ZW5jZVJOTk9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBzZWxmLmZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKQorICAgICAgICBTZXF1ZW5jZVJOTk9wdGlvbnNBZGRBc3ltbWV0cmljUXVhbnRpemVJbnB1dHMoYnVpbGRlciwgc2VsZi5hc3ltbWV0cmljUXVhbnRpemVJbnB1dHMpCisgICAgICAgIHNlcXVlbmNlUm5ub3B0aW9ucyA9IFNlcXVlbmNlUk5OT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gc2VxdWVuY2VSbm5vcHRpb25zCisKKworY2xhc3MgQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc0JpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworICAgICMgQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9ucworICAgIGRlZiBUaW1lTWFqb3Ioc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkJvb2xGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpKQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICMgQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9ucworICAgIGRlZiBGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDhGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCiAgICAgICAgIHJldHVybiAwCiAKLSAgICAjIEZha2VRdWFudE9wdGlvbnMKLSAgICBkZWYgTmFycm93UmFuZ2Uoc2VsZik6CisgICAgIyBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zCisgICAgZGVmIE1lcmdlT3V0cHV0cyhzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg4KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuQm9vbEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykpCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgIyBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zCisgICAgZGVmIEFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyhzZWxmKToKICAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMCkpCiAgICAgICAgIGlmIG8gIT0gMDoKICAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkJvb2xGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpKQogICAgICAgICByZXR1cm4gRmFsc2UKIAotZGVmIEZha2VRdWFudE9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCg0KQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBGYWtlUXVhbnRPcHRpb25zU3RhcnQoYnVpbGRlcikKLWRlZiBGYWtlUXVhbnRPcHRpb25zQWRkTWluKGJ1aWxkZXIsIG1pbik6IGJ1aWxkZXIuUHJlcGVuZEZsb2F0MzJTbG90KDAsIG1pbiwgMC4wKQotZGVmIEFkZE1pbihidWlsZGVyLCBtaW4pOgotICAgIHJldHVybiBGYWtlUXVhbnRPcHRpb25zQWRkTWluKGJ1aWxkZXIsIG1pbikKLWRlZiBGYWtlUXVhbnRPcHRpb25zQWRkTWF4KGJ1aWxkZXIsIG1heCk6IGJ1aWxkZXIuUHJlcGVuZEZsb2F0MzJTbG90KDEsIG1heCwgMC4wKQotZGVmIEFkZE1heChidWlsZGVyLCBtYXgpOgotICAgIHJldHVybiBGYWtlUXVhbnRPcHRpb25zQWRkTWF4KGJ1aWxkZXIsIG1heCkKLWRlZiBGYWtlUXVhbnRPcHRpb25zQWRkTnVtQml0cyhidWlsZGVyLCBudW1CaXRzKTogYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDIsIG51bUJpdHMsIDApCi1kZWYgQWRkTnVtQml0cyhidWlsZGVyLCBudW1CaXRzKToKLSAgICByZXR1cm4gRmFrZVF1YW50T3B0aW9uc0FkZE51bUJpdHMoYnVpbGRlciwgbnVtQml0cykKLWRlZiBGYWtlUXVhbnRPcHRpb25zQWRkTmFycm93UmFuZ2UoYnVpbGRlciwgbmFycm93UmFuZ2UpOiBidWlsZGVyLlByZXBlbmRCb29sU2xvdCgzLCBuYXJyb3dSYW5nZSwgMCkKLWRlZiBBZGROYXJyb3dSYW5nZShidWlsZGVyLCBuYXJyb3dSYW5nZSk6Ci0gICAgcmV0dXJuIEZha2VRdWFudE9wdGlvbnNBZGROYXJyb3dSYW5nZShidWlsZGVyLCBuYXJyb3dSYW5nZSkKLWRlZiBGYWtlUXVhbnRPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gRmFrZVF1YW50T3B0aW9uc0VuZChidWlsZGVyKQorZGVmIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDQpCiAKLWNsYXNzIEZha2VRdWFudE9wdGlvbnNUKG9iamVjdCk6CitkZWYgQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9uc0FkZFRpbWVNYWpvcihidWlsZGVyLCB0aW1lTWFqb3IpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEJvb2xTbG90KDAsIHRpbWVNYWpvciwgMCkKIAotICAgICMgRmFrZVF1YW50T3B0aW9uc1QKK2RlZiBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pOgorICAgIGJ1aWxkZXIuUHJlcGVuZEludDhTbG90KDEsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uLCAwKQorCitkZWYgQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9uc0FkZE1lcmdlT3V0cHV0cyhidWlsZGVyLCBtZXJnZU91dHB1dHMpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEJvb2xTbG90KDIsIG1lcmdlT3V0cHV0cywgMCkKKworZGVmIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnNBZGRBc3ltbWV0cmljUXVhbnRpemVJbnB1dHMoYnVpbGRlciwgYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKToKKyAgICBidWlsZGVyLlByZXBlbmRCb29sU2xvdCgzLCBhc3ltbWV0cmljUXVhbnRpemVJbnB1dHMsIDApCisKK2RlZiBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zVChvYmplY3QpOgorCisgICAgIyBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zVAogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi5taW4gPSAwLjAgICMgdHlwZTogZmxvYXQKLSAgICAgICAgc2VsZi5tYXggPSAwLjAgICMgdHlwZTogZmxvYXQKLSAgICAgICAgc2VsZi5udW1CaXRzID0gMCAgIyB0eXBlOiBpbnQKLSAgICAgICAgc2VsZi5uYXJyb3dSYW5nZSA9IEZhbHNlICAjIHR5cGU6IGJvb2wKKyAgICAgICAgc2VsZi50aW1lTWFqb3IgPSBGYWxzZSAgIyB0eXBlOiBib29sCisgICAgICAgIHNlbGYuZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24gPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLm1lcmdlT3V0cHV0cyA9IEZhbHNlICAjIHR5cGU6IGJvb2wKKyAgICAgICAgc2VsZi5hc3ltbWV0cmljUXVhbnRpemVJbnB1dHMgPSBGYWxzZSAgIyB0eXBlOiBib29sCiAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIGZha2VRdWFudE9wdGlvbnMgPSBGYWtlUXVhbnRPcHRpb25zKCkKLSAgICAgICAgZmFrZVF1YW50T3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGZha2VRdWFudE9wdGlvbnMpCisgICAgICAgIGJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJubm9wdGlvbnMgPSBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zKCkKKyAgICAgICAgYmlkaXJlY3Rpb25hbFNlcXVlbmNlUm5ub3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJubm9wdGlvbnMpCiAKICAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBmYWtlUXVhbnRPcHRpb25zKToKLSAgICAgICAgeCA9IEZha2VRdWFudE9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKGZha2VRdWFudE9wdGlvbnMpCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgYmlkaXJlY3Rpb25hbFNlcXVlbmNlUm5ub3B0aW9ucyk6CisgICAgICAgIHggPSBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhiaWRpcmVjdGlvbmFsU2VxdWVuY2VSbm5vcHRpb25zKQogICAgICAgICByZXR1cm4geAogCi0gICAgIyBGYWtlUXVhbnRPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIGZha2VRdWFudE9wdGlvbnMpOgotICAgICAgICBpZiBmYWtlUXVhbnRPcHRpb25zIGlzIE5vbmU6CisgICAgIyBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIGJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJubm9wdGlvbnMpOgorICAgICAgICBpZiBiaWRpcmVjdGlvbmFsU2VxdWVuY2VSbm5vcHRpb25zIGlzIE5vbmU6CiAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi5taW4gPSBmYWtlUXVhbnRPcHRpb25zLk1pbigpCi0gICAgICAgIHNlbGYubWF4ID0gZmFrZVF1YW50T3B0aW9ucy5NYXgoKQotICAgICAgICBzZWxmLm51bUJpdHMgPSBmYWtlUXVhbnRPcHRpb25zLk51bUJpdHMoKQotICAgICAgICBzZWxmLm5hcnJvd1JhbmdlID0gZmFrZVF1YW50T3B0aW9ucy5OYXJyb3dSYW5nZSgpCisgICAgICAgIHNlbGYudGltZU1ham9yID0gYmlkaXJlY3Rpb25hbFNlcXVlbmNlUm5ub3B0aW9ucy5UaW1lTWFqb3IoKQorICAgICAgICBzZWxmLmZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uID0gYmlkaXJlY3Rpb25hbFNlcXVlbmNlUm5ub3B0aW9ucy5GdXNlZEFjdGl2YXRpb25GdW5jdGlvbigpCisgICAgICAgIHNlbGYubWVyZ2VPdXRwdXRzID0gYmlkaXJlY3Rpb25hbFNlcXVlbmNlUm5ub3B0aW9ucy5NZXJnZU91dHB1dHMoKQorICAgICAgICBzZWxmLmFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyA9IGJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJubm9wdGlvbnMuQXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKCkKIAotICAgICMgRmFrZVF1YW50T3B0aW9uc1QKKyAgICAjIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnNUCiAgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIEZha2VRdWFudE9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBGYWtlUXVhbnRPcHRpb25zQWRkTWluKGJ1aWxkZXIsIHNlbGYubWluKQotICAgICAgICBGYWtlUXVhbnRPcHRpb25zQWRkTWF4KGJ1aWxkZXIsIHNlbGYubWF4KQotICAgICAgICBGYWtlUXVhbnRPcHRpb25zQWRkTnVtQml0cyhidWlsZGVyLCBzZWxmLm51bUJpdHMpCi0gICAgICAgIEZha2VRdWFudE9wdGlvbnNBZGROYXJyb3dSYW5nZShidWlsZGVyLCBzZWxmLm5hcnJvd1JhbmdlKQotICAgICAgICBmYWtlUXVhbnRPcHRpb25zID0gRmFrZVF1YW50T3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gZmFrZVF1YW50T3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKyAgICAgICAgQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnNBZGRUaW1lTWFqb3IoYnVpbGRlciwgc2VsZi50aW1lTWFqb3IpCisgICAgICAgIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBzZWxmLmZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKQorICAgICAgICBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zQWRkTWVyZ2VPdXRwdXRzKGJ1aWxkZXIsIHNlbGYubWVyZ2VPdXRwdXRzKQorICAgICAgICBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zQWRkQXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKGJ1aWxkZXIsIHNlbGYuYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKQorICAgICAgICBiaWRpcmVjdGlvbmFsU2VxdWVuY2VSbm5vcHRpb25zID0gQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gYmlkaXJlY3Rpb25hbFNlcXVlbmNlUm5ub3B0aW9ucwogCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgRmlsbE9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBGaWxsT3B0aW9ucygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzRmlsbE9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBGaWxsT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgRmlsbE9wdGlvbnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi1kZWYgRmlsbE9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgwKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBGaWxsT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgRmlsbE9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBGaWxsT3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBGaWxsT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgRmlsbE9wdGlvbnNUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBwYXNzCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIGZpbGxPcHRpb25zID0gRmlsbE9wdGlvbnMoKQotICAgICAgICBmaWxsT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGZpbGxPcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgZmlsbE9wdGlvbnMpOgotICAgICAgICB4ID0gRmlsbE9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKGZpbGxPcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBGaWxsT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBmaWxsT3B0aW9ucyk6Ci0gICAgICAgIGlmIGZpbGxPcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLQotICAgICMgRmlsbE9wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIEZpbGxPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgZmlsbE9wdGlvbnMgPSBGaWxsT3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gZmlsbE9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBGbG9vckRpdk9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBGbG9vckRpdk9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc0Zsb29yRGl2T3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEZsb29yRGl2T3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgRmxvb3JEaXZPcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotZGVmIEZsb29yRGl2T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEZsb29yRGl2T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgRmxvb3JEaXZPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gRmxvb3JEaXZPcHRpb25zRW5kKGJ1aWxkZXIpCi0KLWNsYXNzIEZsb29yRGl2T3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgRmxvb3JEaXZPcHRpb25zVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgcGFzcwotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBmbG9vckRpdk9wdGlvbnMgPSBGbG9vckRpdk9wdGlvbnMoKQotICAgICAgICBmbG9vckRpdk9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihmbG9vckRpdk9wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBmbG9vckRpdk9wdGlvbnMpOgotICAgICAgICB4ID0gRmxvb3JEaXZPcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhmbG9vckRpdk9wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIEZsb29yRGl2T3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBmbG9vckRpdk9wdGlvbnMpOgotICAgICAgICBpZiBmbG9vckRpdk9wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgIyBGbG9vckRpdk9wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIEZsb29yRGl2T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIGZsb29yRGl2T3B0aW9ucyA9IEZsb29yRGl2T3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gZmxvb3JEaXZPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgRmxvb3JNb2RPcHRpb25zKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gRmxvb3JNb2RPcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNGbG9vck1vZE9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBGbG9vck1vZE9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIEZsb29yTW9kT3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLWRlZiBGbG9vck1vZE9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgwKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBGbG9vck1vZE9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIEZsb29yTW9kT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEZsb29yTW9kT3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBGbG9vck1vZE9wdGlvbnNUKG9iamVjdCk6Ci0KLSAgICAjIEZsb29yTW9kT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgZmxvb3JNb2RPcHRpb25zID0gRmxvb3JNb2RPcHRpb25zKCkKLSAgICAgICAgZmxvb3JNb2RPcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooZmxvb3JNb2RPcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgZmxvb3JNb2RPcHRpb25zKToKLSAgICAgICAgeCA9IEZsb29yTW9kT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2soZmxvb3JNb2RPcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBGbG9vck1vZE9wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgZmxvb3JNb2RPcHRpb25zKToKLSAgICAgICAgaWYgZmxvb3JNb2RPcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLQotICAgICMgRmxvb3JNb2RPcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBGbG9vck1vZE9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBmbG9vck1vZE9wdGlvbnMgPSBGbG9vck1vZE9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIGZsb29yTW9kT3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCiAKIGNsYXNzIEZ1bGx5Q29ubmVjdGVkT3B0aW9ucyhvYmplY3QpOgogICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCkBAIC00MzQwLDI0ICs3MzM5LDM1IEBACiAgICAgICAgICAgICByZXR1cm4gYm9vbChzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5Cb29sRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKSkKICAgICAgICAgcmV0dXJuIEZhbHNlCiAKLWRlZiBGdWxseUNvbm5lY3RlZE9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCg0KQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBGdWxseUNvbm5lY3RlZE9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIEZ1bGx5Q29ubmVjdGVkT3B0aW9uc0FkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKTogYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoMCwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24sIDApCi1kZWYgQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pOgotICAgIHJldHVybiBGdWxseUNvbm5lY3RlZE9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbikKLWRlZiBGdWxseUNvbm5lY3RlZE9wdGlvbnNBZGRXZWlnaHRzRm9ybWF0KGJ1aWxkZXIsIHdlaWdodHNGb3JtYXQpOiBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCgxLCB3ZWlnaHRzRm9ybWF0LCAwKQotZGVmIEFkZFdlaWdodHNGb3JtYXQoYnVpbGRlciwgd2VpZ2h0c0Zvcm1hdCk6Ci0gICAgcmV0dXJuIEZ1bGx5Q29ubmVjdGVkT3B0aW9uc0FkZFdlaWdodHNGb3JtYXQoYnVpbGRlciwgd2VpZ2h0c0Zvcm1hdCkKLWRlZiBGdWxseUNvbm5lY3RlZE9wdGlvbnNBZGRLZWVwTnVtRGltcyhidWlsZGVyLCBrZWVwTnVtRGltcyk6IGJ1aWxkZXIuUHJlcGVuZEJvb2xTbG90KDIsIGtlZXBOdW1EaW1zLCAwKQotZGVmIEFkZEtlZXBOdW1EaW1zKGJ1aWxkZXIsIGtlZXBOdW1EaW1zKToKLSAgICByZXR1cm4gRnVsbHlDb25uZWN0ZWRPcHRpb25zQWRkS2VlcE51bURpbXMoYnVpbGRlciwga2VlcE51bURpbXMpCi1kZWYgRnVsbHlDb25uZWN0ZWRPcHRpb25zQWRkQXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKGJ1aWxkZXIsIGFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyk6IGJ1aWxkZXIuUHJlcGVuZEJvb2xTbG90KDMsIGFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cywgMCkKLWRlZiBBZGRBc3ltbWV0cmljUXVhbnRpemVJbnB1dHMoYnVpbGRlciwgYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKToKLSAgICByZXR1cm4gRnVsbHlDb25uZWN0ZWRPcHRpb25zQWRkQXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKGJ1aWxkZXIsIGFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cykKLWRlZiBGdWxseUNvbm5lY3RlZE9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBGdWxseUNvbm5lY3RlZE9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAjIEZ1bGx5Q29ubmVjdGVkT3B0aW9ucworICAgIGRlZiBRdWFudGl6ZWRCaWFzVHlwZShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCitkZWYgRnVsbHlDb25uZWN0ZWRPcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCg1KQorCitkZWYgRnVsbHlDb25uZWN0ZWRPcHRpb25zQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pOgorICAgIGJ1aWxkZXIuUHJlcGVuZEludDhTbG90KDAsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uLCAwKQorCitkZWYgRnVsbHlDb25uZWN0ZWRPcHRpb25zQWRkV2VpZ2h0c0Zvcm1hdChidWlsZGVyLCB3ZWlnaHRzRm9ybWF0KToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCgxLCB3ZWlnaHRzRm9ybWF0LCAwKQorCitkZWYgRnVsbHlDb25uZWN0ZWRPcHRpb25zQWRkS2VlcE51bURpbXMoYnVpbGRlciwga2VlcE51bURpbXMpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEJvb2xTbG90KDIsIGtlZXBOdW1EaW1zLCAwKQorCitkZWYgRnVsbHlDb25uZWN0ZWRPcHRpb25zQWRkQXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKGJ1aWxkZXIsIGFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyk6CisgICAgYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoMywgYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzLCAwKQorCitkZWYgRnVsbHlDb25uZWN0ZWRPcHRpb25zQWRkUXVhbnRpemVkQmlhc1R5cGUoYnVpbGRlciwgcXVhbnRpemVkQmlhc1R5cGUpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEludDhTbG90KDQsIHF1YW50aXplZEJpYXNUeXBlLCAwKQorCitkZWYgRnVsbHlDb25uZWN0ZWRPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKwogCiBjbGFzcyBGdWxseUNvbm5lY3RlZE9wdGlvbnNUKG9iamVjdCk6CiAKQEAgLTQzNjcsNiArNzM3Nyw3IEBACiAgICAgICAgIHNlbGYud2VpZ2h0c0Zvcm1hdCA9IDAgICMgdHlwZTogaW50CiAgICAgICAgIHNlbGYua2VlcE51bURpbXMgPSBGYWxzZSAgIyB0eXBlOiBib29sCiAgICAgICAgIHNlbGYuYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzID0gRmFsc2UgICMgdHlwZTogYm9vbAorICAgICAgICBzZWxmLnF1YW50aXplZEJpYXNUeXBlID0gMCAgIyB0eXBlOiBpbnQKIAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKQEAgLTQzNzUsNiArNzM4NiwxMSBAQAogICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGZ1bGx5Q29ubmVjdGVkT3B0aW9ucykKIAogICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGZ1bGx5Q29ubmVjdGVkT3B0aW9ucyk6CiAgICAgICAgIHggPSBGdWxseUNvbm5lY3RlZE9wdGlvbnNUKCkKICAgICAgICAgeC5fVW5QYWNrKGZ1bGx5Q29ubmVjdGVkT3B0aW9ucykKQEAgLTQzODgsNiArNzQwNCw3IEBACiAgICAgICAgIHNlbGYud2VpZ2h0c0Zvcm1hdCA9IGZ1bGx5Q29ubmVjdGVkT3B0aW9ucy5XZWlnaHRzRm9ybWF0KCkKICAgICAgICAgc2VsZi5rZWVwTnVtRGltcyA9IGZ1bGx5Q29ubmVjdGVkT3B0aW9ucy5LZWVwTnVtRGltcygpCiAgICAgICAgIHNlbGYuYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzID0gZnVsbHlDb25uZWN0ZWRPcHRpb25zLkFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cygpCisgICAgICAgIHNlbGYucXVhbnRpemVkQmlhc1R5cGUgPSBmdWxseUNvbm5lY3RlZE9wdGlvbnMuUXVhbnRpemVkQmlhc1R5cGUoKQogCiAgICAgIyBGdWxseUNvbm5lY3RlZE9wdGlvbnNUCiAgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CkBAIC00Mzk2LDk0MyArNzQxMywzNDQgQEAKICAgICAgICAgRnVsbHlDb25uZWN0ZWRPcHRpb25zQWRkV2VpZ2h0c0Zvcm1hdChidWlsZGVyLCBzZWxmLndlaWdodHNGb3JtYXQpCiAgICAgICAgIEZ1bGx5Q29ubmVjdGVkT3B0aW9uc0FkZEtlZXBOdW1EaW1zKGJ1aWxkZXIsIHNlbGYua2VlcE51bURpbXMpCiAgICAgICAgIEZ1bGx5Q29ubmVjdGVkT3B0aW9uc0FkZEFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyhidWlsZGVyLCBzZWxmLmFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cykKKyAgICAgICAgRnVsbHlDb25uZWN0ZWRPcHRpb25zQWRkUXVhbnRpemVkQmlhc1R5cGUoYnVpbGRlciwgc2VsZi5xdWFudGl6ZWRCaWFzVHlwZSkKICAgICAgICAgZnVsbHlDb25uZWN0ZWRPcHRpb25zID0gRnVsbHlDb25uZWN0ZWRPcHRpb25zRW5kKGJ1aWxkZXIpCiAgICAgICAgIHJldHVybiBmdWxseUNvbm5lY3RlZE9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CiAKLSMgbmFtZXNwYWNlOiB0ZmxpdGUKIAotY2xhc3MgRnVsbHlDb25uZWN0ZWRPcHRpb25zV2VpZ2h0c0Zvcm1hdChvYmplY3QpOgotICAgIERFRkFVTFQgPSAwCi0gICAgU0hVRkZMRUQ0eDE2SU5UOCA9IDEKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBHYXRoZXJOZE9wdGlvbnMob2JqZWN0KToKK2NsYXNzIFNvZnRtYXhPcHRpb25zKG9iamVjdCk6CiAgICAgX19zbG90c19fID0gWydfdGFiJ10KIAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKICAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gR2F0aGVyTmRPcHRpb25zKCkKKyAgICAgICAgeCA9IFNvZnRtYXhPcHRpb25zKCkKICAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKICAgICAgICAgcmV0dXJuIHgKIAogICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNHYXRoZXJOZE9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICBkZWYgR2V0Um9vdEFzU29mdG1heE9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKICAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCiAgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQogICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHYXRoZXJOZE9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgIGRlZiBTb2Z0bWF4T3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CiAgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKIAotICAgICMgR2F0aGVyTmRPcHRpb25zCisgICAgIyBTb2Z0bWF4T3B0aW9ucwogICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKICAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCiAKLWRlZiBHYXRoZXJOZE9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgwKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBHYXRoZXJOZE9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIEdhdGhlck5kT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEdhdGhlck5kT3B0aW9uc0VuZChidWlsZGVyKQorICAgICMgU29mdG1heE9wdGlvbnMKKyAgICBkZWYgQmV0YShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkZsb2F0MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwLjAKIAotY2xhc3MgR2F0aGVyTmRPcHRpb25zVChvYmplY3QpOgorZGVmIFNvZnRtYXhPcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgxKQogCi0gICAgIyBHYXRoZXJOZE9wdGlvbnNUCitkZWYgU29mdG1heE9wdGlvbnNBZGRCZXRhKGJ1aWxkZXIsIGJldGEpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEZsb2F0MzJTbG90KDAsIGJldGEsIDAuMCkKKworZGVmIFNvZnRtYXhPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBTb2Z0bWF4T3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgU29mdG1heE9wdGlvbnNUCiAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuYmV0YSA9IDAuMCAgIyB0eXBlOiBmbG9hdAogCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBnYXRoZXJOZE9wdGlvbnMgPSBHYXRoZXJOZE9wdGlvbnMoKQotICAgICAgICBnYXRoZXJOZE9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihnYXRoZXJOZE9wdGlvbnMpCisgICAgICAgIHNvZnRtYXhPcHRpb25zID0gU29mdG1heE9wdGlvbnMoKQorICAgICAgICBzb2Z0bWF4T3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHNvZnRtYXhPcHRpb25zKQogCiAgICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgZ2F0aGVyTmRPcHRpb25zKToKLSAgICAgICAgeCA9IEdhdGhlck5kT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2soZ2F0aGVyTmRPcHRpb25zKQorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHNvZnRtYXhPcHRpb25zKToKKyAgICAgICAgeCA9IFNvZnRtYXhPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhzb2Z0bWF4T3B0aW9ucykKICAgICAgICAgcmV0dXJuIHgKIAotICAgICMgR2F0aGVyTmRPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIGdhdGhlck5kT3B0aW9ucyk6Ci0gICAgICAgIGlmIGdhdGhlck5kT3B0aW9ucyBpcyBOb25lOgorICAgICMgU29mdG1heE9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgc29mdG1heE9wdGlvbnMpOgorICAgICAgICBpZiBzb2Z0bWF4T3B0aW9ucyBpcyBOb25lOgogICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuYmV0YSA9IHNvZnRtYXhPcHRpb25zLkJldGEoKQogCi0gICAgIyBHYXRoZXJOZE9wdGlvbnNUCisgICAgIyBTb2Z0bWF4T3B0aW9uc1QKICAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgR2F0aGVyTmRPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgZ2F0aGVyTmRPcHRpb25zID0gR2F0aGVyTmRPcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBnYXRoZXJOZE9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisgICAgICAgIFNvZnRtYXhPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgU29mdG1heE9wdGlvbnNBZGRCZXRhKGJ1aWxkZXIsIHNlbGYuYmV0YSkKKyAgICAgICAgc29mdG1heE9wdGlvbnMgPSBTb2Z0bWF4T3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gc29mdG1heE9wdGlvbnMKIAotIyBuYW1lc3BhY2U6IHRmbGl0ZQogCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIEdhdGhlck9wdGlvbnMob2JqZWN0KToKK2NsYXNzIENvbmNhdGVuYXRpb25PcHRpb25zKG9iamVjdCk6CiAgICAgX19zbG90c19fID0gWydfdGFiJ10KIAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKICAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gR2F0aGVyT3B0aW9ucygpCisgICAgICAgIHggPSBDb25jYXRlbmF0aW9uT3B0aW9ucygpCiAgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCiAgICAgICAgIHJldHVybiB4CiAKICAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzR2F0aGVyT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgIGRlZiBHZXRSb290QXNDb25jYXRlbmF0aW9uT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgogICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKICAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCiAgICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdhdGhlck9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgIGRlZiBDb25jYXRlbmF0aW9uT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CiAgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKIAotICAgICMgR2F0aGVyT3B0aW9ucworICAgICMgQ29uY2F0ZW5hdGlvbk9wdGlvbnMKICAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CiAgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQogCi0gICAgIyBHYXRoZXJPcHRpb25zCisgICAgIyBDb25jYXRlbmF0aW9uT3B0aW9ucwogICAgIGRlZiBBeGlzKHNlbGYpOgogICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQogICAgICAgICBpZiBvICE9IDA6CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCiAgICAgICAgIHJldHVybiAwCiAKLSAgICAjIEdhdGhlck9wdGlvbnMKLSAgICBkZWYgQmF0Y2hEaW1zKHNlbGYpOgorICAgICMgQ29uY2F0ZW5hdGlvbk9wdGlvbnMKKyAgICBkZWYgRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oc2VsZik6CiAgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCiAgICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQogICAgICAgICByZXR1cm4gMAogCi1kZWYgR2F0aGVyT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDIpCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEdhdGhlck9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIEdhdGhlck9wdGlvbnNBZGRBeGlzKGJ1aWxkZXIsIGF4aXMpOiBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMCwgYXhpcywgMCkKLWRlZiBBZGRBeGlzKGJ1aWxkZXIsIGF4aXMpOgotICAgIHJldHVybiBHYXRoZXJPcHRpb25zQWRkQXhpcyhidWlsZGVyLCBheGlzKQotZGVmIEdhdGhlck9wdGlvbnNBZGRCYXRjaERpbXMoYnVpbGRlciwgYmF0Y2hEaW1zKTogYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDEsIGJhdGNoRGltcywgMCkKLWRlZiBBZGRCYXRjaERpbXMoYnVpbGRlciwgYmF0Y2hEaW1zKToKLSAgICByZXR1cm4gR2F0aGVyT3B0aW9uc0FkZEJhdGNoRGltcyhidWlsZGVyLCBiYXRjaERpbXMpCi1kZWYgR2F0aGVyT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEdhdGhlck9wdGlvbnNFbmQoYnVpbGRlcikKK2RlZiBDb25jYXRlbmF0aW9uT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMikKIAotY2xhc3MgR2F0aGVyT3B0aW9uc1Qob2JqZWN0KToKK2RlZiBDb25jYXRlbmF0aW9uT3B0aW9uc0FkZEF4aXMoYnVpbGRlciwgYXhpcyk6CisgICAgYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDAsIGF4aXMsIDApCiAKLSAgICAjIEdhdGhlck9wdGlvbnNUCitkZWYgQ29uY2F0ZW5hdGlvbk9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbik6CisgICAgYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoMSwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24sIDApCisKK2RlZiBDb25jYXRlbmF0aW9uT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgQ29uY2F0ZW5hdGlvbk9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIENvbmNhdGVuYXRpb25PcHRpb25zVAogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgc2VsZi5heGlzID0gMCAgIyB0eXBlOiBpbnQKLSAgICAgICAgc2VsZi5iYXRjaERpbXMgPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uID0gMCAgIyB0eXBlOiBpbnQKIAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgZ2F0aGVyT3B0aW9ucyA9IEdhdGhlck9wdGlvbnMoKQotICAgICAgICBnYXRoZXJPcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooZ2F0aGVyT3B0aW9ucykKKyAgICAgICAgY29uY2F0ZW5hdGlvbk9wdGlvbnMgPSBDb25jYXRlbmF0aW9uT3B0aW9ucygpCisgICAgICAgIGNvbmNhdGVuYXRpb25PcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooY29uY2F0ZW5hdGlvbk9wdGlvbnMpCiAKICAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBnYXRoZXJPcHRpb25zKToKLSAgICAgICAgeCA9IEdhdGhlck9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKGdhdGhlck9wdGlvbnMpCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgY29uY2F0ZW5hdGlvbk9wdGlvbnMpOgorICAgICAgICB4ID0gQ29uY2F0ZW5hdGlvbk9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKGNvbmNhdGVuYXRpb25PcHRpb25zKQogICAgICAgICByZXR1cm4geAogCi0gICAgIyBHYXRoZXJPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIGdhdGhlck9wdGlvbnMpOgotICAgICAgICBpZiBnYXRoZXJPcHRpb25zIGlzIE5vbmU6CisgICAgIyBDb25jYXRlbmF0aW9uT3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBjb25jYXRlbmF0aW9uT3B0aW9ucyk6CisgICAgICAgIGlmIGNvbmNhdGVuYXRpb25PcHRpb25zIGlzIE5vbmU6CiAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi5heGlzID0gZ2F0aGVyT3B0aW9ucy5BeGlzKCkKLSAgICAgICAgc2VsZi5iYXRjaERpbXMgPSBnYXRoZXJPcHRpb25zLkJhdGNoRGltcygpCisgICAgICAgIHNlbGYuYXhpcyA9IGNvbmNhdGVuYXRpb25PcHRpb25zLkF4aXMoKQorICAgICAgICBzZWxmLmZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uID0gY29uY2F0ZW5hdGlvbk9wdGlvbnMuRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oKQogCi0gICAgIyBHYXRoZXJPcHRpb25zVAorICAgICMgQ29uY2F0ZW5hdGlvbk9wdGlvbnNUCiAgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIEdhdGhlck9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBHYXRoZXJPcHRpb25zQWRkQXhpcyhidWlsZGVyLCBzZWxmLmF4aXMpCi0gICAgICAgIEdhdGhlck9wdGlvbnNBZGRCYXRjaERpbXMoYnVpbGRlciwgc2VsZi5iYXRjaERpbXMpCi0gICAgICAgIGdhdGhlck9wdGlvbnMgPSBHYXRoZXJPcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBnYXRoZXJPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorICAgICAgICBDb25jYXRlbmF0aW9uT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIENvbmNhdGVuYXRpb25PcHRpb25zQWRkQXhpcyhidWlsZGVyLCBzZWxmLmF4aXMpCisgICAgICAgIENvbmNhdGVuYXRpb25PcHRpb25zQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbikKKyAgICAgICAgY29uY2F0ZW5hdGlvbk9wdGlvbnMgPSBDb25jYXRlbmF0aW9uT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gY29uY2F0ZW5hdGlvbk9wdGlvbnMKIAotIyBuYW1lc3BhY2U6IHRmbGl0ZQogCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIEdlbHVPcHRpb25zKG9iamVjdCk6CitjbGFzcyBBZGRPcHRpb25zKG9iamVjdCk6CiAgICAgX19zbG90c19fID0gWydfdGFiJ10KIAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKICAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gR2VsdU9wdGlvbnMoKQorICAgICAgICB4ID0gQWRkT3B0aW9ucygpCiAgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCiAgICAgICAgIHJldHVybiB4CiAKICAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzR2VsdU9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICBkZWYgR2V0Um9vdEFzQWRkT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgogICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKICAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCiAgICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdlbHVPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICBkZWYgQWRkT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CiAgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKIAotICAgICMgR2VsdU9wdGlvbnMKKyAgICAjIEFkZE9wdGlvbnMKICAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CiAgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQogCi0gICAgIyBHZWx1T3B0aW9ucwotICAgIGRlZiBBcHByb3hpbWF0ZShzZWxmKToKKyAgICAjIEFkZE9wdGlvbnMKKyAgICBkZWYgRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oc2VsZik6CiAgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCiAgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBBZGRPcHRpb25zCisgICAgZGVmIFBvdFNjYWxlSW50MTYoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIGlmIG8gIT0gMDoKICAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkJvb2xGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpKQotICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgcmV0dXJuIFRydWUKIAotZGVmIEdlbHVPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMSkKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gR2VsdU9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIEdlbHVPcHRpb25zQWRkQXBwcm94aW1hdGUoYnVpbGRlciwgYXBwcm94aW1hdGUpOiBidWlsZGVyLlByZXBlbmRCb29sU2xvdCgwLCBhcHByb3hpbWF0ZSwgMCkKLWRlZiBBZGRBcHByb3hpbWF0ZShidWlsZGVyLCBhcHByb3hpbWF0ZSk6Ci0gICAgcmV0dXJuIEdlbHVPcHRpb25zQWRkQXBwcm94aW1hdGUoYnVpbGRlciwgYXBwcm94aW1hdGUpCi1kZWYgR2VsdU9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBHZWx1T3B0aW9uc0VuZChidWlsZGVyKQorZGVmIEFkZE9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDIpCiAKLWNsYXNzIEdlbHVPcHRpb25zVChvYmplY3QpOgorZGVmIEFkZE9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbik6CisgICAgYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoMCwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24sIDApCiAKLSAgICAjIEdlbHVPcHRpb25zVAorZGVmIEFkZE9wdGlvbnNBZGRQb3RTY2FsZUludDE2KGJ1aWxkZXIsIHBvdFNjYWxlSW50MTYpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEJvb2xTbG90KDEsIHBvdFNjYWxlSW50MTYsIDEpCisKK2RlZiBBZGRPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBBZGRPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBBZGRPcHRpb25zVAogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi5hcHByb3hpbWF0ZSA9IEZhbHNlICAjIHR5cGU6IGJvb2wKKyAgICAgICAgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbiA9IDAgICMgdHlwZTogaW50CisgICAgICAgIHNlbGYucG90U2NhbGVJbnQxNiA9IFRydWUgICMgdHlwZTogYm9vbAogCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBnZWx1T3B0aW9ucyA9IEdlbHVPcHRpb25zKCkKLSAgICAgICAgZ2VsdU9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihnZWx1T3B0aW9ucykKKyAgICAgICAgYWRkT3B0aW9ucyA9IEFkZE9wdGlvbnMoKQorICAgICAgICBhZGRPcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooYWRkT3B0aW9ucykKIAogICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGdlbHVPcHRpb25zKToKLSAgICAgICAgeCA9IEdlbHVPcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhnZWx1T3B0aW9ucykKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBhZGRPcHRpb25zKToKKyAgICAgICAgeCA9IEFkZE9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKGFkZE9wdGlvbnMpCiAgICAgICAgIHJldHVybiB4CiAKLSAgICAjIEdlbHVPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIGdlbHVPcHRpb25zKToKLSAgICAgICAgaWYgZ2VsdU9wdGlvbnMgaXMgTm9uZToKKyAgICAjIEFkZE9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgYWRkT3B0aW9ucyk6CisgICAgICAgIGlmIGFkZE9wdGlvbnMgaXMgTm9uZToKICAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLmFwcHJveGltYXRlID0gZ2VsdU9wdGlvbnMuQXBwcm94aW1hdGUoKQorICAgICAgICBzZWxmLmZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uID0gYWRkT3B0aW9ucy5GdXNlZEFjdGl2YXRpb25GdW5jdGlvbigpCisgICAgICAgIHNlbGYucG90U2NhbGVJbnQxNiA9IGFkZE9wdGlvbnMuUG90U2NhbGVJbnQxNigpCiAKLSAgICAjIEdlbHVPcHRpb25zVAorICAgICMgQWRkT3B0aW9uc1QKICAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgR2VsdU9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBHZWx1T3B0aW9uc0FkZEFwcHJveGltYXRlKGJ1aWxkZXIsIHNlbGYuYXBwcm94aW1hdGUpCi0gICAgICAgIGdlbHVPcHRpb25zID0gR2VsdU9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIGdlbHVPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorICAgICAgICBBZGRPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgQWRkT3B0aW9uc0FkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIHNlbGYuZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pCisgICAgICAgIEFkZE9wdGlvbnNBZGRQb3RTY2FsZUludDE2KGJ1aWxkZXIsIHNlbGYucG90U2NhbGVJbnQxNikKKyAgICAgICAgYWRkT3B0aW9ucyA9IEFkZE9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIGFkZE9wdGlvbnMKIAotIyBuYW1lc3BhY2U6IHRmbGl0ZQogCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIEdyZWF0ZXJFcXVhbE9wdGlvbnMob2JqZWN0KToKK2NsYXNzIE11bE9wdGlvbnMob2JqZWN0KToKICAgICBfX3Nsb3RzX18gPSBbJ190YWInXQogCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgogICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBHcmVhdGVyRXF1YWxPcHRpb25zKCkKKyAgICAgICAgeCA9IE11bE9wdGlvbnMoKQogICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQogICAgICAgICByZXR1cm4geAogCiAgICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc0dyZWF0ZXJFcXVhbE9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICBkZWYgR2V0Um9vdEFzTXVsT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgogICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKICAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCiAgICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdyZWF0ZXJFcXVhbE9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgIGRlZiBNdWxPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKICAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQogCi0gICAgIyBHcmVhdGVyRXF1YWxPcHRpb25zCisgICAgIyBNdWxPcHRpb25zCiAgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgogICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKIAotZGVmIEdyZWF0ZXJFcXVhbE9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgwKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBHcmVhdGVyRXF1YWxPcHRpb25zU3RhcnQoYnVpbGRlcikKLWRlZiBHcmVhdGVyRXF1YWxPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gR3JlYXRlckVxdWFsT3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBHcmVhdGVyRXF1YWxPcHRpb25zVChvYmplY3QpOgotCi0gICAgIyBHcmVhdGVyRXF1YWxPcHRpb25zVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgcGFzcwotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBncmVhdGVyRXF1YWxPcHRpb25zID0gR3JlYXRlckVxdWFsT3B0aW9ucygpCi0gICAgICAgIGdyZWF0ZXJFcXVhbE9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihncmVhdGVyRXF1YWxPcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgZ3JlYXRlckVxdWFsT3B0aW9ucyk6Ci0gICAgICAgIHggPSBHcmVhdGVyRXF1YWxPcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhncmVhdGVyRXF1YWxPcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBHcmVhdGVyRXF1YWxPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIGdyZWF0ZXJFcXVhbE9wdGlvbnMpOgotICAgICAgICBpZiBncmVhdGVyRXF1YWxPcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLQotICAgICMgR3JlYXRlckVxdWFsT3B0aW9uc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgR3JlYXRlckVxdWFsT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIGdyZWF0ZXJFcXVhbE9wdGlvbnMgPSBHcmVhdGVyRXF1YWxPcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBncmVhdGVyRXF1YWxPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgR3JlYXRlck9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBHcmVhdGVyT3B0aW9ucygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzR3JlYXRlck9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHcmVhdGVyT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgR3JlYXRlck9wdGlvbnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi1kZWYgR3JlYXRlck9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgwKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBHcmVhdGVyT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgR3JlYXRlck9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBHcmVhdGVyT3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBHcmVhdGVyT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgR3JlYXRlck9wdGlvbnNUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBwYXNzCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIGdyZWF0ZXJPcHRpb25zID0gR3JlYXRlck9wdGlvbnMoKQotICAgICAgICBncmVhdGVyT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGdyZWF0ZXJPcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgZ3JlYXRlck9wdGlvbnMpOgotICAgICAgICB4ID0gR3JlYXRlck9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKGdyZWF0ZXJPcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBHcmVhdGVyT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBncmVhdGVyT3B0aW9ucyk6Ci0gICAgICAgIGlmIGdyZWF0ZXJPcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLQotICAgICMgR3JlYXRlck9wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIEdyZWF0ZXJPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgZ3JlYXRlck9wdGlvbnMgPSBHcmVhdGVyT3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gZ3JlYXRlck9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBIYXJkU3dpc2hPcHRpb25zKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gSGFyZFN3aXNoT3B0aW9ucygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzSGFyZFN3aXNoT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEhhcmRTd2lzaE9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIEhhcmRTd2lzaE9wdGlvbnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi1kZWYgSGFyZFN3aXNoT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEhhcmRTd2lzaE9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIEhhcmRTd2lzaE9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBIYXJkU3dpc2hPcHRpb25zRW5kKGJ1aWxkZXIpCi0KLWNsYXNzIEhhcmRTd2lzaE9wdGlvbnNUKG9iamVjdCk6Ci0KLSAgICAjIEhhcmRTd2lzaE9wdGlvbnNUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBwYXNzCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIGhhcmRTd2lzaE9wdGlvbnMgPSBIYXJkU3dpc2hPcHRpb25zKCkKLSAgICAgICAgaGFyZFN3aXNoT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGhhcmRTd2lzaE9wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBoYXJkU3dpc2hPcHRpb25zKToKLSAgICAgICAgeCA9IEhhcmRTd2lzaE9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKGhhcmRTd2lzaE9wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIEhhcmRTd2lzaE9wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgaGFyZFN3aXNoT3B0aW9ucyk6Ci0gICAgICAgIGlmIGhhcmRTd2lzaE9wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgIyBIYXJkU3dpc2hPcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBIYXJkU3dpc2hPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgaGFyZFN3aXNoT3B0aW9ucyA9IEhhcmRTd2lzaE9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIGhhcmRTd2lzaE9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBIYXNodGFibGVGaW5kT3B0aW9ucyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IEhhc2h0YWJsZUZpbmRPcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNIYXNodGFibGVGaW5kT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEhhc2h0YWJsZUZpbmRPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBIYXNodGFibGVGaW5kT3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLWRlZiBIYXNodGFibGVGaW5kT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEhhc2h0YWJsZUZpbmRPcHRpb25zU3RhcnQoYnVpbGRlcikKLWRlZiBIYXNodGFibGVGaW5kT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEhhc2h0YWJsZUZpbmRPcHRpb25zRW5kKGJ1aWxkZXIpCi0KLWNsYXNzIEhhc2h0YWJsZUZpbmRPcHRpb25zVChvYmplY3QpOgotCi0gICAgIyBIYXNodGFibGVGaW5kT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgaGFzaHRhYmxlRmluZE9wdGlvbnMgPSBIYXNodGFibGVGaW5kT3B0aW9ucygpCi0gICAgICAgIGhhc2h0YWJsZUZpbmRPcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooaGFzaHRhYmxlRmluZE9wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBoYXNodGFibGVGaW5kT3B0aW9ucyk6Ci0gICAgICAgIHggPSBIYXNodGFibGVGaW5kT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2soaGFzaHRhYmxlRmluZE9wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIEhhc2h0YWJsZUZpbmRPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIGhhc2h0YWJsZUZpbmRPcHRpb25zKToKLSAgICAgICAgaWYgaGFzaHRhYmxlRmluZE9wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgIyBIYXNodGFibGVGaW5kT3B0aW9uc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgSGFzaHRhYmxlRmluZE9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBoYXNodGFibGVGaW5kT3B0aW9ucyA9IEhhc2h0YWJsZUZpbmRPcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBoYXNodGFibGVGaW5kT3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIEhhc2h0YWJsZUltcG9ydE9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBIYXNodGFibGVJbXBvcnRPcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNIYXNodGFibGVJbXBvcnRPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSGFzaHRhYmxlSW1wb3J0T3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgSGFzaHRhYmxlSW1wb3J0T3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLWRlZiBIYXNodGFibGVJbXBvcnRPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gSGFzaHRhYmxlSW1wb3J0T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgSGFzaHRhYmxlSW1wb3J0T3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEhhc2h0YWJsZUltcG9ydE9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgSGFzaHRhYmxlSW1wb3J0T3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgSGFzaHRhYmxlSW1wb3J0T3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgaGFzaHRhYmxlSW1wb3J0T3B0aW9ucyA9IEhhc2h0YWJsZUltcG9ydE9wdGlvbnMoKQotICAgICAgICBoYXNodGFibGVJbXBvcnRPcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooaGFzaHRhYmxlSW1wb3J0T3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGhhc2h0YWJsZUltcG9ydE9wdGlvbnMpOgotICAgICAgICB4ID0gSGFzaHRhYmxlSW1wb3J0T3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2soaGFzaHRhYmxlSW1wb3J0T3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgSGFzaHRhYmxlSW1wb3J0T3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBoYXNodGFibGVJbXBvcnRPcHRpb25zKToKLSAgICAgICAgaWYgaGFzaHRhYmxlSW1wb3J0T3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAjIEhhc2h0YWJsZUltcG9ydE9wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIEhhc2h0YWJsZUltcG9ydE9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBoYXNodGFibGVJbXBvcnRPcHRpb25zID0gSGFzaHRhYmxlSW1wb3J0T3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gaGFzaHRhYmxlSW1wb3J0T3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIEhhc2h0YWJsZU9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBIYXNodGFibGVPcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNIYXNodGFibGVPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSGFzaHRhYmxlT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgSGFzaHRhYmxlT3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLSAgICAjIEhhc2h0YWJsZU9wdGlvbnMKLSAgICBkZWYgVGFibGVJZChzZWxmKToKKyAgICAjIE11bE9wdGlvbnMKKyAgICBkZWYgRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oc2VsZik6CiAgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCiAgICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgSGFzaHRhYmxlT3B0aW9ucwotICAgIGRlZiBLZXlEdHlwZShzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKLSAgICAgICAgaWYgbyAhPSAwOgogICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDhGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCiAgICAgICAgIHJldHVybiAwCiAKLSAgICAjIEhhc2h0YWJsZU9wdGlvbnMKLSAgICBkZWYgVmFsdWVEdHlwZShzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg4KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDhGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiAwCitkZWYgTXVsT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMSkKIAotZGVmIEhhc2h0YWJsZU9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgzKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBIYXNodGFibGVPcHRpb25zU3RhcnQoYnVpbGRlcikKLWRlZiBIYXNodGFibGVPcHRpb25zQWRkVGFibGVJZChidWlsZGVyLCB0YWJsZUlkKTogYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDAsIHRhYmxlSWQsIDApCi1kZWYgQWRkVGFibGVJZChidWlsZGVyLCB0YWJsZUlkKToKLSAgICByZXR1cm4gSGFzaHRhYmxlT3B0aW9uc0FkZFRhYmxlSWQoYnVpbGRlciwgdGFibGVJZCkKLWRlZiBIYXNodGFibGVPcHRpb25zQWRkS2V5RHR5cGUoYnVpbGRlciwga2V5RHR5cGUpOiBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCgxLCBrZXlEdHlwZSwgMCkKLWRlZiBBZGRLZXlEdHlwZShidWlsZGVyLCBrZXlEdHlwZSk6Ci0gICAgcmV0dXJuIEhhc2h0YWJsZU9wdGlvbnNBZGRLZXlEdHlwZShidWlsZGVyLCBrZXlEdHlwZSkKLWRlZiBIYXNodGFibGVPcHRpb25zQWRkVmFsdWVEdHlwZShidWlsZGVyLCB2YWx1ZUR0eXBlKTogYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoMiwgdmFsdWVEdHlwZSwgMCkKLWRlZiBBZGRWYWx1ZUR0eXBlKGJ1aWxkZXIsIHZhbHVlRHR5cGUpOgotICAgIHJldHVybiBIYXNodGFibGVPcHRpb25zQWRkVmFsdWVEdHlwZShidWlsZGVyLCB2YWx1ZUR0eXBlKQotZGVmIEhhc2h0YWJsZU9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBIYXNodGFibGVPcHRpb25zRW5kKGJ1aWxkZXIpCitkZWYgTXVsT3B0aW9uc0FkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCgwLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbiwgMCkKIAotY2xhc3MgSGFzaHRhYmxlT3B0aW9uc1Qob2JqZWN0KToKK2RlZiBNdWxPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCiAKLSAgICAjIEhhc2h0YWJsZU9wdGlvbnNUCisKKworY2xhc3MgTXVsT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgTXVsT3B0aW9uc1QKICAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYudGFibGVJZCA9IDAgICMgdHlwZTogaW50Ci0gICAgICAgIHNlbGYua2V5RHR5cGUgPSAwICAjIHR5cGU6IGludAotICAgICAgICBzZWxmLnZhbHVlRHR5cGUgPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uID0gMCAgIyB0eXBlOiBpbnQKIAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgaGFzaHRhYmxlT3B0aW9ucyA9IEhhc2h0YWJsZU9wdGlvbnMoKQotICAgICAgICBoYXNodGFibGVPcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooaGFzaHRhYmxlT3B0aW9ucykKKyAgICAgICAgbXVsT3B0aW9ucyA9IE11bE9wdGlvbnMoKQorICAgICAgICBtdWxPcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoobXVsT3B0aW9ucykKIAogICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGhhc2h0YWJsZU9wdGlvbnMpOgotICAgICAgICB4ID0gSGFzaHRhYmxlT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2soaGFzaHRhYmxlT3B0aW9ucykKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBtdWxPcHRpb25zKToKKyAgICAgICAgeCA9IE11bE9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKG11bE9wdGlvbnMpCiAgICAgICAgIHJldHVybiB4CiAKLSAgICAjIEhhc2h0YWJsZU9wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgaGFzaHRhYmxlT3B0aW9ucyk6Ci0gICAgICAgIGlmIGhhc2h0YWJsZU9wdGlvbnMgaXMgTm9uZToKKyAgICAjIE11bE9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgbXVsT3B0aW9ucyk6CisgICAgICAgIGlmIG11bE9wdGlvbnMgaXMgTm9uZToKICAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLnRhYmxlSWQgPSBoYXNodGFibGVPcHRpb25zLlRhYmxlSWQoKQotICAgICAgICBzZWxmLmtleUR0eXBlID0gaGFzaHRhYmxlT3B0aW9ucy5LZXlEdHlwZSgpCi0gICAgICAgIHNlbGYudmFsdWVEdHlwZSA9IGhhc2h0YWJsZU9wdGlvbnMuVmFsdWVEdHlwZSgpCisgICAgICAgIHNlbGYuZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24gPSBtdWxPcHRpb25zLkZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKCkKIAotICAgICMgSGFzaHRhYmxlT3B0aW9uc1QKKyAgICAjIE11bE9wdGlvbnNUCiAgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIEhhc2h0YWJsZU9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBIYXNodGFibGVPcHRpb25zQWRkVGFibGVJZChidWlsZGVyLCBzZWxmLnRhYmxlSWQpCi0gICAgICAgIEhhc2h0YWJsZU9wdGlvbnNBZGRLZXlEdHlwZShidWlsZGVyLCBzZWxmLmtleUR0eXBlKQotICAgICAgICBIYXNodGFibGVPcHRpb25zQWRkVmFsdWVEdHlwZShidWlsZGVyLCBzZWxmLnZhbHVlRHR5cGUpCi0gICAgICAgIGhhc2h0YWJsZU9wdGlvbnMgPSBIYXNodGFibGVPcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBoYXNodGFibGVPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorICAgICAgICBNdWxPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgTXVsT3B0aW9uc0FkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIHNlbGYuZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pCisgICAgICAgIG11bE9wdGlvbnMgPSBNdWxPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBtdWxPcHRpb25zCiAKLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBIYXNodGFibGVTaXplT3B0aW9ucyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IEhhc2h0YWJsZVNpemVPcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNIYXNodGFibGVTaXplT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEhhc2h0YWJsZVNpemVPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBIYXNodGFibGVTaXplT3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLWRlZiBIYXNodGFibGVTaXplT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEhhc2h0YWJsZVNpemVPcHRpb25zU3RhcnQoYnVpbGRlcikKLWRlZiBIYXNodGFibGVTaXplT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEhhc2h0YWJsZVNpemVPcHRpb25zRW5kKGJ1aWxkZXIpCi0KLWNsYXNzIEhhc2h0YWJsZVNpemVPcHRpb25zVChvYmplY3QpOgotCi0gICAgIyBIYXNodGFibGVTaXplT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgaGFzaHRhYmxlU2l6ZU9wdGlvbnMgPSBIYXNodGFibGVTaXplT3B0aW9ucygpCi0gICAgICAgIGhhc2h0YWJsZVNpemVPcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooaGFzaHRhYmxlU2l6ZU9wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBoYXNodGFibGVTaXplT3B0aW9ucyk6Ci0gICAgICAgIHggPSBIYXNodGFibGVTaXplT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2soaGFzaHRhYmxlU2l6ZU9wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIEhhc2h0YWJsZVNpemVPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIGhhc2h0YWJsZVNpemVPcHRpb25zKToKLSAgICAgICAgaWYgaGFzaHRhYmxlU2l6ZU9wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgIyBIYXNodGFibGVTaXplT3B0aW9uc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgSGFzaHRhYmxlU2l6ZU9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBoYXNodGFibGVTaXplT3B0aW9ucyA9IEhhc2h0YWJsZVNpemVPcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBoYXNodGFibGVTaXplT3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIElmT3B0aW9ucyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IElmT3B0aW9ucygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzSWZPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSWZPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBJZk9wdGlvbnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi0gICAgIyBJZk9wdGlvbnMKLSAgICBkZWYgVGhlblN1YmdyYXBoSW5kZXgoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgSWZPcHRpb25zCi0gICAgZGVmIEVsc2VTdWJncmFwaEluZGV4KHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiAwCi0KLWRlZiBJZk9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgyKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBJZk9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIElmT3B0aW9uc0FkZFRoZW5TdWJncmFwaEluZGV4KGJ1aWxkZXIsIHRoZW5TdWJncmFwaEluZGV4KTogYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDAsIHRoZW5TdWJncmFwaEluZGV4LCAwKQotZGVmIEFkZFRoZW5TdWJncmFwaEluZGV4KGJ1aWxkZXIsIHRoZW5TdWJncmFwaEluZGV4KToKLSAgICByZXR1cm4gSWZPcHRpb25zQWRkVGhlblN1YmdyYXBoSW5kZXgoYnVpbGRlciwgdGhlblN1YmdyYXBoSW5kZXgpCi1kZWYgSWZPcHRpb25zQWRkRWxzZVN1YmdyYXBoSW5kZXgoYnVpbGRlciwgZWxzZVN1YmdyYXBoSW5kZXgpOiBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMSwgZWxzZVN1YmdyYXBoSW5kZXgsIDApCi1kZWYgQWRkRWxzZVN1YmdyYXBoSW5kZXgoYnVpbGRlciwgZWxzZVN1YmdyYXBoSW5kZXgpOgotICAgIHJldHVybiBJZk9wdGlvbnNBZGRFbHNlU3ViZ3JhcGhJbmRleChidWlsZGVyLCBlbHNlU3ViZ3JhcGhJbmRleCkKLWRlZiBJZk9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBJZk9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgSWZPcHRpb25zVChvYmplY3QpOgotCi0gICAgIyBJZk9wdGlvbnNUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBzZWxmLnRoZW5TdWJncmFwaEluZGV4ID0gMCAgIyB0eXBlOiBpbnQKLSAgICAgICAgc2VsZi5lbHNlU3ViZ3JhcGhJbmRleCA9IDAgICMgdHlwZTogaW50Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIGlmT3B0aW9ucyA9IElmT3B0aW9ucygpCi0gICAgICAgIGlmT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGlmT3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGlmT3B0aW9ucyk6Ci0gICAgICAgIHggPSBJZk9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKGlmT3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgSWZPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIGlmT3B0aW9ucyk6Ci0gICAgICAgIGlmIGlmT3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYudGhlblN1YmdyYXBoSW5kZXggPSBpZk9wdGlvbnMuVGhlblN1YmdyYXBoSW5kZXgoKQotICAgICAgICBzZWxmLmVsc2VTdWJncmFwaEluZGV4ID0gaWZPcHRpb25zLkVsc2VTdWJncmFwaEluZGV4KCkKLQotICAgICMgSWZPcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBJZk9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBJZk9wdGlvbnNBZGRUaGVuU3ViZ3JhcGhJbmRleChidWlsZGVyLCBzZWxmLnRoZW5TdWJncmFwaEluZGV4KQotICAgICAgICBJZk9wdGlvbnNBZGRFbHNlU3ViZ3JhcGhJbmRleChidWlsZGVyLCBzZWxmLmVsc2VTdWJncmFwaEluZGV4KQotICAgICAgICBpZk9wdGlvbnMgPSBJZk9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIGlmT3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIEludDMyVmVjdG9yKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gSW50MzJWZWN0b3IoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc0ludDMyVmVjdG9yKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW50MzJWZWN0b3JCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIEludDMyVmVjdG9yCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotICAgICMgSW50MzJWZWN0b3IKLSAgICBkZWYgVmFsdWVzKHNlbGYsIGopOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICBhID0gc2VsZi5fdGFiLlZlY3RvcihvKQotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIGEgKyBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGogKiA0KSkKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgSW50MzJWZWN0b3IKLSAgICBkZWYgVmFsdWVzQXNOdW1weShzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXRWZWN0b3JBc051bXB5KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBJbnQzMlZlY3RvcgotICAgIGRlZiBWYWx1ZXNMZW5ndGgoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuVmVjdG9yTGVuKG8pCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIEludDMyVmVjdG9yCi0gICAgZGVmIFZhbHVlc0lzTm9uZShzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKLSAgICAgICAgcmV0dXJuIG8gPT0gMAotCi1kZWYgSW50MzJWZWN0b3JTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgxKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBJbnQzMlZlY3RvclN0YXJ0KGJ1aWxkZXIpCi1kZWYgSW50MzJWZWN0b3JBZGRWYWx1ZXMoYnVpbGRlciwgdmFsdWVzKTogYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMCwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZSh2YWx1ZXMpLCAwKQotZGVmIEFkZFZhbHVlcyhidWlsZGVyLCB2YWx1ZXMpOgotICAgIHJldHVybiBJbnQzMlZlY3RvckFkZFZhbHVlcyhidWlsZGVyLCB2YWx1ZXMpCi1kZWYgSW50MzJWZWN0b3JTdGFydFZhbHVlc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6IHJldHVybiBidWlsZGVyLlN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KQotZGVmIFN0YXJ0VmFsdWVzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKLSAgICByZXR1cm4gSW50MzJWZWN0b3JTdGFydFZhbHVlc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykKLWRlZiBJbnQzMlZlY3RvckVuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEludDMyVmVjdG9yRW5kKGJ1aWxkZXIpCi10cnk6Ci0gICAgZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QKLWV4Y2VwdDoKLSAgICBwYXNzCi0KLWNsYXNzIEludDMyVmVjdG9yVChvYmplY3QpOgotCi0gICAgIyBJbnQzMlZlY3RvclQKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYudmFsdWVzID0gTm9uZSAgIyB0eXBlOiBMaXN0W2ludF0KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgaW50MzJ2ZWN0b3IgPSBJbnQzMlZlY3RvcigpCi0gICAgICAgIGludDMydmVjdG9yLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooaW50MzJ2ZWN0b3IpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBpbnQzMnZlY3Rvcik6Ci0gICAgICAgIHggPSBJbnQzMlZlY3RvclQoKQotICAgICAgICB4Ll9VblBhY2soaW50MzJ2ZWN0b3IpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIEludDMyVmVjdG9yVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIGludDMydmVjdG9yKToKLSAgICAgICAgaWYgaW50MzJ2ZWN0b3IgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBpZiBub3QgaW50MzJ2ZWN0b3IuVmFsdWVzSXNOb25lKCk6Ci0gICAgICAgICAgICBpZiBucCBpcyBOb25lOgotICAgICAgICAgICAgICAgIHNlbGYudmFsdWVzID0gW10KLSAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShpbnQzMnZlY3Rvci5WYWx1ZXNMZW5ndGgoKSk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYudmFsdWVzLmFwcGVuZChpbnQzMnZlY3Rvci5WYWx1ZXMoaSkpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlbGYudmFsdWVzID0gaW50MzJ2ZWN0b3IuVmFsdWVzQXNOdW1weSgpCi0KLSAgICAjIEludDMyVmVjdG9yVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBpZiBzZWxmLnZhbHVlcyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIGlmIG5wIGlzIG5vdCBOb25lIGFuZCB0eXBlKHNlbGYudmFsdWVzKSBpcyBucC5uZGFycmF5OgotICAgICAgICAgICAgICAgIHZhbHVlcyA9IGJ1aWxkZXIuQ3JlYXRlTnVtcHlWZWN0b3Ioc2VsZi52YWx1ZXMpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIEludDMyVmVjdG9yU3RhcnRWYWx1ZXNWZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYudmFsdWVzKSkKLSAgICAgICAgICAgICAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShsZW4oc2VsZi52YWx1ZXMpKSk6Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZEludDMyKHNlbGYudmFsdWVzW2ldKQotICAgICAgICAgICAgICAgIHZhbHVlcyA9IGJ1aWxkZXIuRW5kVmVjdG9yKCkKLSAgICAgICAgSW50MzJWZWN0b3JTdGFydChidWlsZGVyKQotICAgICAgICBpZiBzZWxmLnZhbHVlcyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIEludDMyVmVjdG9yQWRkVmFsdWVzKGJ1aWxkZXIsIHZhbHVlcykKLSAgICAgICAgaW50MzJ2ZWN0b3IgPSBJbnQzMlZlY3RvckVuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gaW50MzJ2ZWN0b3IKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQogCiBjbGFzcyBMMk5vcm1PcHRpb25zKG9iamVjdCk6CiAgICAgX19zbG90c19fID0gWydfdGFiJ10KQEAgLTUzNjMsMTUgKzc3ODEsMTYgQEAKICAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQogICAgICAgICByZXR1cm4gMAogCi1kZWYgTDJOb3JtT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDEpCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIEwyTm9ybU9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIEwyTm9ybU9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbik6IGJ1aWxkZXIuUHJlcGVuZEludDhTbG90KDAsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uLCAwKQotZGVmIEFkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKToKLSAgICByZXR1cm4gTDJOb3JtT3B0aW9uc0FkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKQotZGVmIEwyTm9ybU9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBMMk5vcm1PcHRpb25zRW5kKGJ1aWxkZXIpCitkZWYgTDJOb3JtT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMSkKKworZGVmIEwyTm9ybU9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbik6CisgICAgYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoMCwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24sIDApCisKK2RlZiBMMk5vcm1PcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKwogCiBjbGFzcyBMMk5vcm1PcHRpb25zVChvYmplY3QpOgogCkBAIC01MzgxLDEyNSArNzgwMCwxNTAgQEAKIAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgbDJub3JtT3B0aW9ucyA9IEwyTm9ybU9wdGlvbnMoKQotICAgICAgICBsMm5vcm1PcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoobDJub3JtT3B0aW9ucykKKyAgICAgICAgbDJOb3JtT3B0aW9ucyA9IEwyTm9ybU9wdGlvbnMoKQorICAgICAgICBsMk5vcm1PcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoobDJOb3JtT3B0aW9ucykKIAogICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGwybm9ybU9wdGlvbnMpOgorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGwyTm9ybU9wdGlvbnMpOgogICAgICAgICB4ID0gTDJOb3JtT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2sobDJub3JtT3B0aW9ucykKKyAgICAgICAgeC5fVW5QYWNrKGwyTm9ybU9wdGlvbnMpCiAgICAgICAgIHJldHVybiB4CiAKICAgICAjIEwyTm9ybU9wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgbDJub3JtT3B0aW9ucyk6Ci0gICAgICAgIGlmIGwybm9ybU9wdGlvbnMgaXMgTm9uZToKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBsMk5vcm1PcHRpb25zKToKKyAgICAgICAgaWYgbDJOb3JtT3B0aW9ucyBpcyBOb25lOgogICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYuZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24gPSBsMm5vcm1PcHRpb25zLkZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKCkKKyAgICAgICAgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbiA9IGwyTm9ybU9wdGlvbnMuRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oKQogCiAgICAgIyBMMk5vcm1PcHRpb25zVAogICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgogICAgICAgICBMMk5vcm1PcHRpb25zU3RhcnQoYnVpbGRlcikKICAgICAgICAgTDJOb3JtT3B0aW9uc0FkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIHNlbGYuZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pCi0gICAgICAgIGwybm9ybU9wdGlvbnMgPSBMMk5vcm1PcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBsMm5vcm1PcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorICAgICAgICBsMk5vcm1PcHRpb25zID0gTDJOb3JtT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gbDJOb3JtT3B0aW9ucwogCi0jIG5hbWVzcGFjZTogdGZsaXRlCiAKLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgTFNIUHJvamVjdGlvbk9wdGlvbnMob2JqZWN0KToKK2NsYXNzIExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9ucyhvYmplY3QpOgogICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCiAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CiAgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IExTSFByb2plY3Rpb25PcHRpb25zKCkKKyAgICAgICAgeCA9IExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9ucygpCiAgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCiAgICAgICAgIHJldHVybiB4CiAKICAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzTFNIUHJvamVjdGlvbk9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICBkZWYgR2V0Um9vdEFzTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CiAgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgogICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKICAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgTFNIUHJvamVjdGlvbk9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgIGRlZiBMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgogICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCiAKLSAgICAjIExTSFByb2plY3Rpb25PcHRpb25zCisgICAgIyBMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnMKICAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CiAgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQogCi0gICAgIyBMU0hQcm9qZWN0aW9uT3B0aW9ucwotICAgIGRlZiBUeXBlKHNlbGYpOgorICAgICMgTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zCisgICAgZGVmIFJhZGl1cyhzZWxmKToKICAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKICAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDhGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCiAgICAgICAgIHJldHVybiAwCiAKLWRlZiBMU0hQcm9qZWN0aW9uT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDEpCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIExTSFByb2plY3Rpb25PcHRpb25zU3RhcnQoYnVpbGRlcikKLWRlZiBMU0hQcm9qZWN0aW9uT3B0aW9uc0FkZFR5cGUoYnVpbGRlciwgdHlwZSk6IGJ1aWxkZXIuUHJlcGVuZEludDhTbG90KDAsIHR5cGUsIDApCi1kZWYgQWRkVHlwZShidWlsZGVyLCB0eXBlKToKLSAgICByZXR1cm4gTFNIUHJvamVjdGlvbk9wdGlvbnNBZGRUeXBlKGJ1aWxkZXIsIHR5cGUpCi1kZWYgTFNIUHJvamVjdGlvbk9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBMU0hQcm9qZWN0aW9uT3B0aW9uc0VuZChidWlsZGVyKQorICAgICMgTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zCisgICAgZGVmIEJpYXMoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5GbG9hdDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMC4wCiAKLWNsYXNzIExTSFByb2plY3Rpb25PcHRpb25zVChvYmplY3QpOgorICAgICMgTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zCisgICAgZGVmIEFscGhhKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuRmxvYXQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAuMAogCi0gICAgIyBMU0hQcm9qZWN0aW9uT3B0aW9uc1QKKyAgICAjIExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9ucworICAgIGRlZiBCZXRhKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEwKSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkZsb2F0MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwLjAKKworZGVmIExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoNCkKKworZGVmIExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9uc0FkZFJhZGl1cyhidWlsZGVyLCByYWRpdXMpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEludDMyU2xvdCgwLCByYWRpdXMsIDApCisKK2RlZiBMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnNBZGRCaWFzKGJ1aWxkZXIsIGJpYXMpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEZsb2F0MzJTbG90KDEsIGJpYXMsIDAuMCkKKworZGVmIExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9uc0FkZEFscGhhKGJ1aWxkZXIsIGFscGhhKToKKyAgICBidWlsZGVyLlByZXBlbmRGbG9hdDMyU2xvdCgyLCBhbHBoYSwgMC4wKQorCitkZWYgTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zQWRkQmV0YShidWlsZGVyLCBiZXRhKToKKyAgICBidWlsZGVyLlByZXBlbmRGbG9hdDMyU2xvdCgzLCBiZXRhLCAwLjApCisKK2RlZiBMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zVAogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi50eXBlID0gMCAgIyB0eXBlOiBpbnQKKyAgICAgICAgc2VsZi5yYWRpdXMgPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmJpYXMgPSAwLjAgICMgdHlwZTogZmxvYXQKKyAgICAgICAgc2VsZi5hbHBoYSA9IDAuMCAgIyB0eXBlOiBmbG9hdAorICAgICAgICBzZWxmLmJldGEgPSAwLjAgICMgdHlwZTogZmxvYXQKIAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgbHNocHJvamVjdGlvbk9wdGlvbnMgPSBMU0hQcm9qZWN0aW9uT3B0aW9ucygpCi0gICAgICAgIGxzaHByb2plY3Rpb25PcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoobHNocHJvamVjdGlvbk9wdGlvbnMpCisgICAgICAgIGxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9ucyA9IExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9ucygpCisgICAgICAgIGxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9ucykKIAogICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGxzaHByb2plY3Rpb25PcHRpb25zKToKLSAgICAgICAgeCA9IExTSFByb2plY3Rpb25PcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhsc2hwcm9qZWN0aW9uT3B0aW9ucykKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnMpOgorICAgICAgICB4ID0gTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnMpCiAgICAgICAgIHJldHVybiB4CiAKLSAgICAjIExTSFByb2plY3Rpb25PcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIGxzaHByb2plY3Rpb25PcHRpb25zKToKLSAgICAgICAgaWYgbHNocHJvamVjdGlvbk9wdGlvbnMgaXMgTm9uZToKKyAgICAjIExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnMpOgorICAgICAgICBpZiBsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnMgaXMgTm9uZToKICAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLnR5cGUgPSBsc2hwcm9qZWN0aW9uT3B0aW9ucy5UeXBlKCkKKyAgICAgICAgc2VsZi5yYWRpdXMgPSBsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnMuUmFkaXVzKCkKKyAgICAgICAgc2VsZi5iaWFzID0gbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zLkJpYXMoKQorICAgICAgICBzZWxmLmFscGhhID0gbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zLkFscGhhKCkKKyAgICAgICAgc2VsZi5iZXRhID0gbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zLkJldGEoKQogCi0gICAgIyBMU0hQcm9qZWN0aW9uT3B0aW9uc1QKKyAgICAjIExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9uc1QKICAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgTFNIUHJvamVjdGlvbk9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBMU0hQcm9qZWN0aW9uT3B0aW9uc0FkZFR5cGUoYnVpbGRlciwgc2VsZi50eXBlKQotICAgICAgICBsc2hwcm9qZWN0aW9uT3B0aW9ucyA9IExTSFByb2plY3Rpb25PcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBsc2hwcm9qZWN0aW9uT3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKyAgICAgICAgTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zQWRkUmFkaXVzKGJ1aWxkZXIsIHNlbGYucmFkaXVzKQorICAgICAgICBMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnNBZGRCaWFzKGJ1aWxkZXIsIHNlbGYuYmlhcykKKyAgICAgICAgTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zQWRkQWxwaGEoYnVpbGRlciwgc2VsZi5hbHBoYSkKKyAgICAgICAgTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zQWRkQmV0YShidWlsZGVyLCBzZWxmLmJldGEpCisgICAgICAgIGxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9ucyA9IExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zCiAKLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotY2xhc3MgTFNIUHJvamVjdGlvblR5cGUob2JqZWN0KToKLSAgICBVTktOT1dOID0gMAotICAgIFNQQVJTRSA9IDEKLSAgICBERU5TRSA9IDIKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotY2xhc3MgTFNUTUtlcm5lbFR5cGUob2JqZWN0KToKLSAgICBGVUxMID0gMAotICAgIEJBU0lDID0gMQotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCiAKIGNsYXNzIExTVE1PcHRpb25zKG9iamVjdCk6CiAgICAgX19zbG90c19fID0gWydfdGFiJ10KQEAgLTU1NTgsMjcgKzgwMDIsMjggQEAKICAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkJvb2xGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpKQogICAgICAgICByZXR1cm4gRmFsc2UKIAotZGVmIExTVE1PcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoNSkKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gTFNUTU9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIExTVE1PcHRpb25zQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pOiBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCgwLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbiwgMCkKLWRlZiBBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbik6Ci0gICAgcmV0dXJuIExTVE1PcHRpb25zQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pCi1kZWYgTFNUTU9wdGlvbnNBZGRDZWxsQ2xpcChidWlsZGVyLCBjZWxsQ2xpcCk6IGJ1aWxkZXIuUHJlcGVuZEZsb2F0MzJTbG90KDEsIGNlbGxDbGlwLCAwLjApCi1kZWYgQWRkQ2VsbENsaXAoYnVpbGRlciwgY2VsbENsaXApOgotICAgIHJldHVybiBMU1RNT3B0aW9uc0FkZENlbGxDbGlwKGJ1aWxkZXIsIGNlbGxDbGlwKQotZGVmIExTVE1PcHRpb25zQWRkUHJvakNsaXAoYnVpbGRlciwgcHJvakNsaXApOiBidWlsZGVyLlByZXBlbmRGbG9hdDMyU2xvdCgyLCBwcm9qQ2xpcCwgMC4wKQotZGVmIEFkZFByb2pDbGlwKGJ1aWxkZXIsIHByb2pDbGlwKToKLSAgICByZXR1cm4gTFNUTU9wdGlvbnNBZGRQcm9qQ2xpcChidWlsZGVyLCBwcm9qQ2xpcCkKLWRlZiBMU1RNT3B0aW9uc0FkZEtlcm5lbFR5cGUoYnVpbGRlciwga2VybmVsVHlwZSk6IGJ1aWxkZXIuUHJlcGVuZEludDhTbG90KDMsIGtlcm5lbFR5cGUsIDApCi1kZWYgQWRkS2VybmVsVHlwZShidWlsZGVyLCBrZXJuZWxUeXBlKToKLSAgICByZXR1cm4gTFNUTU9wdGlvbnNBZGRLZXJuZWxUeXBlKGJ1aWxkZXIsIGtlcm5lbFR5cGUpCi1kZWYgTFNUTU9wdGlvbnNBZGRBc3ltbWV0cmljUXVhbnRpemVJbnB1dHMoYnVpbGRlciwgYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKTogYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoNCwgYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzLCAwKQotZGVmIEFkZEFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyhidWlsZGVyLCBhc3ltbWV0cmljUXVhbnRpemVJbnB1dHMpOgotICAgIHJldHVybiBMU1RNT3B0aW9uc0FkZEFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyhidWlsZGVyLCBhc3ltbWV0cmljUXVhbnRpemVJbnB1dHMpCi1kZWYgTFNUTU9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBMU1RNT3B0aW9uc0VuZChidWlsZGVyKQorZGVmIExTVE1PcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCg1KQorCitkZWYgTFNUTU9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbik6CisgICAgYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoMCwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24sIDApCisKK2RlZiBMU1RNT3B0aW9uc0FkZENlbGxDbGlwKGJ1aWxkZXIsIGNlbGxDbGlwKToKKyAgICBidWlsZGVyLlByZXBlbmRGbG9hdDMyU2xvdCgxLCBjZWxsQ2xpcCwgMC4wKQorCitkZWYgTFNUTU9wdGlvbnNBZGRQcm9qQ2xpcChidWlsZGVyLCBwcm9qQ2xpcCk6CisgICAgYnVpbGRlci5QcmVwZW5kRmxvYXQzMlNsb3QoMiwgcHJvakNsaXAsIDAuMCkKKworZGVmIExTVE1PcHRpb25zQWRkS2VybmVsVHlwZShidWlsZGVyLCBrZXJuZWxUeXBlKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCgzLCBrZXJuZWxUeXBlLCAwKQorCitkZWYgTFNUTU9wdGlvbnNBZGRBc3ltbWV0cmljUXVhbnRpemVJbnB1dHMoYnVpbGRlciwgYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKToKKyAgICBidWlsZGVyLlByZXBlbmRCb29sU2xvdCg0LCBhc3ltbWV0cmljUXVhbnRpemVJbnB1dHMsIDApCisKK2RlZiBMU1RNT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKIAogY2xhc3MgTFNUTU9wdGlvbnNUKG9iamVjdCk6CiAKQEAgLTU1OTcsNiArODA0MiwxMSBAQAogICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGxzdG1vcHRpb25zKQogCiAgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIEluaXRGcm9tT2JqKGNscywgbHN0bW9wdGlvbnMpOgogICAgICAgICB4ID0gTFNUTU9wdGlvbnNUKCkKICAgICAgICAgeC5fVW5QYWNrKGxzdG1vcHRpb25zKQpAQCAtNTYyMiwzMzEgKzgwNzIsMjI3MCBAQAogICAgICAgICBMU1RNT3B0aW9uc0FkZEFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyhidWlsZGVyLCBzZWxmLmFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cykKICAgICAgICAgbHN0bW9wdGlvbnMgPSBMU1RNT3B0aW9uc0VuZChidWlsZGVyKQogICAgICAgICByZXR1cm4gbHN0bW9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CiAKLSMgbmFtZXNwYWNlOiB0ZmxpdGUKIAotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBMZWFreVJlbHVPcHRpb25zKG9iamVjdCk6CitjbGFzcyBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnMob2JqZWN0KToKICAgICBfX3Nsb3RzX18gPSBbJ190YWInXQogCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgogICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBMZWFreVJlbHVPcHRpb25zKCkKKyAgICAgICAgeCA9IFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9ucygpCiAgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCiAgICAgICAgIHJldHVybiB4CiAKICAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzTGVha3lSZWx1T3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgIGRlZiBHZXRSb290QXNVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKICAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCiAgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQogICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBMZWFreVJlbHVPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICBkZWYgVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKICAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQogCi0gICAgIyBMZWFreVJlbHVPcHRpb25zCisgICAgIyBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnMKICAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CiAgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQogCi0gICAgIyBMZWFreVJlbHVPcHRpb25zCi0gICAgZGVmIEFscGhhKHNlbGYpOgorICAgICMgVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zCisgICAgZGVmIEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKHNlbGYpOgogICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQogICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuRmxvYXQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAuMAotCi1kZWYgTGVha3lSZWx1T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDEpCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIExlYWt5UmVsdU9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIExlYWt5UmVsdU9wdGlvbnNBZGRBbHBoYShidWlsZGVyLCBhbHBoYSk6IGJ1aWxkZXIuUHJlcGVuZEZsb2F0MzJTbG90KDAsIGFscGhhLCAwLjApCi1kZWYgQWRkQWxwaGEoYnVpbGRlciwgYWxwaGEpOgotICAgIHJldHVybiBMZWFreVJlbHVPcHRpb25zQWRkQWxwaGEoYnVpbGRlciwgYWxwaGEpCi1kZWYgTGVha3lSZWx1T3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIExlYWt5UmVsdU9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgTGVha3lSZWx1T3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgTGVha3lSZWx1T3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYuYWxwaGEgPSAwLjAgICMgdHlwZTogZmxvYXQKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgbGVha3lSZWx1T3B0aW9ucyA9IExlYWt5UmVsdU9wdGlvbnMoKQotICAgICAgICBsZWFreVJlbHVPcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoobGVha3lSZWx1T3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGxlYWt5UmVsdU9wdGlvbnMpOgotICAgICAgICB4ID0gTGVha3lSZWx1T3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2sobGVha3lSZWx1T3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgTGVha3lSZWx1T3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBsZWFreVJlbHVPcHRpb25zKToKLSAgICAgICAgaWYgbGVha3lSZWx1T3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYuYWxwaGEgPSBsZWFreVJlbHVPcHRpb25zLkFscGhhKCkKLQotICAgICMgTGVha3lSZWx1T3B0aW9uc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgTGVha3lSZWx1T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIExlYWt5UmVsdU9wdGlvbnNBZGRBbHBoYShidWlsZGVyLCBzZWxmLmFscGhhKQotICAgICAgICBsZWFreVJlbHVPcHRpb25zID0gTGVha3lSZWx1T3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gbGVha3lSZWx1T3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIExlc3NFcXVhbE9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBMZXNzRXF1YWxPcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNMZXNzRXF1YWxPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgTGVzc0VxdWFsT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgTGVzc0VxdWFsT3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLWRlZiBMZXNzRXF1YWxPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gTGVzc0VxdWFsT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgTGVzc0VxdWFsT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIExlc3NFcXVhbE9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgTGVzc0VxdWFsT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgTGVzc0VxdWFsT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgbGVzc0VxdWFsT3B0aW9ucyA9IExlc3NFcXVhbE9wdGlvbnMoKQotICAgICAgICBsZXNzRXF1YWxPcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoobGVzc0VxdWFsT3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGxlc3NFcXVhbE9wdGlvbnMpOgotICAgICAgICB4ID0gTGVzc0VxdWFsT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2sobGVzc0VxdWFsT3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgTGVzc0VxdWFsT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBsZXNzRXF1YWxPcHRpb25zKToKLSAgICAgICAgaWYgbGVzc0VxdWFsT3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAjIExlc3NFcXVhbE9wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIExlc3NFcXVhbE9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBsZXNzRXF1YWxPcHRpb25zID0gTGVzc0VxdWFsT3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gbGVzc0VxdWFsT3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIExlc3NPcHRpb25zKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gTGVzc09wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc0xlc3NPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgTGVzc09wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIExlc3NPcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotZGVmIExlc3NPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gTGVzc09wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIExlc3NPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gTGVzc09wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgTGVzc09wdGlvbnNUKG9iamVjdCk6Ci0KLSAgICAjIExlc3NPcHRpb25zVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgcGFzcwotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBsZXNzT3B0aW9ucyA9IExlc3NPcHRpb25zKCkKLSAgICAgICAgbGVzc09wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihsZXNzT3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGxlc3NPcHRpb25zKToKLSAgICAgICAgeCA9IExlc3NPcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhsZXNzT3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgTGVzc09wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgbGVzc09wdGlvbnMpOgotICAgICAgICBpZiBsZXNzT3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAjIExlc3NPcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBMZXNzT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIGxlc3NPcHRpb25zID0gTGVzc09wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIGxlc3NPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLSAgICAjIExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9ucwotICAgIGRlZiBSYWRpdXMoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQogICAgICAgICByZXR1cm4gMAogCi0gICAgIyBMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnMKLSAgICBkZWYgQmlhcyhzZWxmKToKKyAgICAjIFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9ucworICAgIGRlZiBDZWxsQ2xpcChzZWxmKToKICAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKICAgICAgICAgaWYgbyAhPSAwOgogICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkZsb2F0MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCiAgICAgICAgIHJldHVybiAwLjAKIAotICAgICMgTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zCi0gICAgZGVmIEFscGhhKHNlbGYpOgorICAgICMgVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zCisgICAgZGVmIFByb2pDbGlwKHNlbGYpOgogICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQogICAgICAgICBpZiBvICE9IDA6CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuRmxvYXQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKICAgICAgICAgcmV0dXJuIDAuMAogCi0gICAgIyBMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnMKLSAgICBkZWYgQmV0YShzZWxmKToKKyAgICAjIFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9ucworICAgIGRlZiBUaW1lTWFqb3Ioc2VsZik6CiAgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTApKQogICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gYm9vbChzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5Cb29sRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKSkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAjIFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9ucworICAgIGRlZiBBc3ltbWV0cmljUXVhbnRpemVJbnB1dHMoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTIpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gYm9vbChzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5Cb29sRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKSkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKKyAgICAjIFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9ucworICAgIGRlZiBEaWFnb25hbFJlY3VycmVudFRlbnNvcnMoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gYm9vbChzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5Cb29sRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKSkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKK2RlZiBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDYpCisKK2RlZiBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbik6CisgICAgYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoMCwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24sIDApCisKK2RlZiBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNBZGRDZWxsQ2xpcChidWlsZGVyLCBjZWxsQ2xpcCk6CisgICAgYnVpbGRlci5QcmVwZW5kRmxvYXQzMlNsb3QoMSwgY2VsbENsaXAsIDAuMCkKKworZGVmIFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc0FkZFByb2pDbGlwKGJ1aWxkZXIsIHByb2pDbGlwKToKKyAgICBidWlsZGVyLlByZXBlbmRGbG9hdDMyU2xvdCgyLCBwcm9qQ2xpcCwgMC4wKQorCitkZWYgVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zQWRkVGltZU1ham9yKGJ1aWxkZXIsIHRpbWVNYWpvcik6CisgICAgYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoMywgdGltZU1ham9yLCAwKQorCitkZWYgVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zQWRkQXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKGJ1aWxkZXIsIGFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyk6CisgICAgYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoNCwgYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzLCAwKQorCitkZWYgVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zQWRkRGlhZ29uYWxSZWN1cnJlbnRUZW5zb3JzKGJ1aWxkZXIsIGRpYWdvbmFsUmVjdXJyZW50VGVuc29ycyk6CisgICAgYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoNSwgZGlhZ29uYWxSZWN1cnJlbnRUZW5zb3JzLCAwKQorCitkZWYgVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24gPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmNlbGxDbGlwID0gMC4wICAjIHR5cGU6IGZsb2F0CisgICAgICAgIHNlbGYucHJvakNsaXAgPSAwLjAgICMgdHlwZTogZmxvYXQKKyAgICAgICAgc2VsZi50aW1lTWFqb3IgPSBGYWxzZSAgIyB0eXBlOiBib29sCisgICAgICAgIHNlbGYuYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzID0gRmFsc2UgICMgdHlwZTogYm9vbAorICAgICAgICBzZWxmLmRpYWdvbmFsUmVjdXJyZW50VGVuc29ycyA9IEZhbHNlICAjIHR5cGU6IGJvb2wKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgdW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxzdG1vcHRpb25zID0gVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zKCkKKyAgICAgICAgdW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxzdG1vcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoodW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxzdG1vcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgdW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxzdG1vcHRpb25zKToKKyAgICAgICAgeCA9IFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2sodW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxzdG1vcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgdW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxzdG1vcHRpb25zKToKKyAgICAgICAgaWYgdW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxzdG1vcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbiA9IHVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMc3Rtb3B0aW9ucy5GdXNlZEFjdGl2YXRpb25GdW5jdGlvbigpCisgICAgICAgIHNlbGYuY2VsbENsaXAgPSB1bmlkaXJlY3Rpb25hbFNlcXVlbmNlTHN0bW9wdGlvbnMuQ2VsbENsaXAoKQorICAgICAgICBzZWxmLnByb2pDbGlwID0gdW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxzdG1vcHRpb25zLlByb2pDbGlwKCkKKyAgICAgICAgc2VsZi50aW1lTWFqb3IgPSB1bmlkaXJlY3Rpb25hbFNlcXVlbmNlTHN0bW9wdGlvbnMuVGltZU1ham9yKCkKKyAgICAgICAgc2VsZi5hc3ltbWV0cmljUXVhbnRpemVJbnB1dHMgPSB1bmlkaXJlY3Rpb25hbFNlcXVlbmNlTHN0bW9wdGlvbnMuQXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKCkKKyAgICAgICAgc2VsZi5kaWFnb25hbFJlY3VycmVudFRlbnNvcnMgPSB1bmlkaXJlY3Rpb25hbFNlcXVlbmNlTHN0bW9wdGlvbnMuRGlhZ29uYWxSZWN1cnJlbnRUZW5zb3JzKCkKKworICAgICMgVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBzZWxmLmZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKQorICAgICAgICBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNBZGRDZWxsQ2xpcChidWlsZGVyLCBzZWxmLmNlbGxDbGlwKQorICAgICAgICBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNBZGRQcm9qQ2xpcChidWlsZGVyLCBzZWxmLnByb2pDbGlwKQorICAgICAgICBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNBZGRUaW1lTWFqb3IoYnVpbGRlciwgc2VsZi50aW1lTWFqb3IpCisgICAgICAgIFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc0FkZEFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyhidWlsZGVyLCBzZWxmLmFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cykKKyAgICAgICAgVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zQWRkRGlhZ29uYWxSZWN1cnJlbnRUZW5zb3JzKGJ1aWxkZXIsIHNlbGYuZGlhZ29uYWxSZWN1cnJlbnRUZW5zb3JzKQorICAgICAgICB1bmlkaXJlY3Rpb25hbFNlcXVlbmNlTHN0bW9wdGlvbnMgPSBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMc3Rtb3B0aW9ucworCisKK2NsYXNzIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc0JpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgorICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworICAgICMgQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnMKKyAgICBkZWYgRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9ucworICAgIGRlZiBDZWxsQ2xpcChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKKyAgICAgICAgaWYgbyAhPSAwOgogICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkZsb2F0MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCiAgICAgICAgIHJldHVybiAwLjAKIAotZGVmIExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDQpCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zQWRkUmFkaXVzKGJ1aWxkZXIsIHJhZGl1cyk6IGJ1aWxkZXIuUHJlcGVuZEludDMyU2xvdCgwLCByYWRpdXMsIDApCi1kZWYgQWRkUmFkaXVzKGJ1aWxkZXIsIHJhZGl1cyk6Ci0gICAgcmV0dXJuIExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9uc0FkZFJhZGl1cyhidWlsZGVyLCByYWRpdXMpCi1kZWYgTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zQWRkQmlhcyhidWlsZGVyLCBiaWFzKTogYnVpbGRlci5QcmVwZW5kRmxvYXQzMlNsb3QoMSwgYmlhcywgMC4wKQotZGVmIEFkZEJpYXMoYnVpbGRlciwgYmlhcyk6Ci0gICAgcmV0dXJuIExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9uc0FkZEJpYXMoYnVpbGRlciwgYmlhcykKLWRlZiBMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnNBZGRBbHBoYShidWlsZGVyLCBhbHBoYSk6IGJ1aWxkZXIuUHJlcGVuZEZsb2F0MzJTbG90KDIsIGFscGhhLCAwLjApCi1kZWYgQWRkQWxwaGEoYnVpbGRlciwgYWxwaGEpOgotICAgIHJldHVybiBMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnNBZGRBbHBoYShidWlsZGVyLCBhbHBoYSkKLWRlZiBMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnNBZGRCZXRhKGJ1aWxkZXIsIGJldGEpOiBidWlsZGVyLlByZXBlbmRGbG9hdDMyU2xvdCgzLCBiZXRhLCAwLjApCi1kZWYgQWRkQmV0YShidWlsZGVyLCBiZXRhKToKLSAgICByZXR1cm4gTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zQWRkQmV0YShidWlsZGVyLCBiZXRhKQotZGVmIExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9uc0VuZChidWlsZGVyKQorICAgICMgQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnMKKyAgICBkZWYgUHJvakNsaXAoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5GbG9hdDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMC4wCiAKLWNsYXNzIExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9uc1Qob2JqZWN0KToKKyAgICAjIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zCisgICAgZGVmIE1lcmdlT3V0cHV0cyhzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkJvb2xGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpKQorICAgICAgICByZXR1cm4gRmFsc2UKIAotICAgICMgTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zVAorICAgICMgQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnMKKyAgICBkZWYgVGltZU1ham9yKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEyKSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuQm9vbEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykpCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICAjIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zCisgICAgZGVmIEFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyhzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkJvb2xGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpKQorICAgICAgICByZXR1cm4gRmFsc2UKKworZGVmIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCg2KQorCitkZWYgQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbik6CisgICAgYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoMCwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24sIDApCisKK2RlZiBCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc0FkZENlbGxDbGlwKGJ1aWxkZXIsIGNlbGxDbGlwKToKKyAgICBidWlsZGVyLlByZXBlbmRGbG9hdDMyU2xvdCgxLCBjZWxsQ2xpcCwgMC4wKQorCitkZWYgQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNBZGRQcm9qQ2xpcChidWlsZGVyLCBwcm9qQ2xpcCk6CisgICAgYnVpbGRlci5QcmVwZW5kRmxvYXQzMlNsb3QoMiwgcHJvakNsaXAsIDAuMCkKKworZGVmIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zQWRkTWVyZ2VPdXRwdXRzKGJ1aWxkZXIsIG1lcmdlT3V0cHV0cyk6CisgICAgYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoMywgbWVyZ2VPdXRwdXRzLCAwKQorCitkZWYgQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNBZGRUaW1lTWFqb3IoYnVpbGRlciwgdGltZU1ham9yKToKKyAgICBidWlsZGVyLlByZXBlbmRCb29sU2xvdCg0LCB0aW1lTWFqb3IsIDEpCisKK2RlZiBCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc0FkZEFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyhidWlsZGVyLCBhc3ltbWV0cmljUXVhbnRpemVJbnB1dHMpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEJvb2xTbG90KDUsIGFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cywgMCkKKworZGVmIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNUCiAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBzZWxmLnJhZGl1cyA9IDAgICMgdHlwZTogaW50Ci0gICAgICAgIHNlbGYuYmlhcyA9IDAuMCAgIyB0eXBlOiBmbG9hdAotICAgICAgICBzZWxmLmFscGhhID0gMC4wICAjIHR5cGU6IGZsb2F0Ci0gICAgICAgIHNlbGYuYmV0YSA9IDAuMCAgIyB0eXBlOiBmbG9hdAorICAgICAgICBzZWxmLmZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uID0gMCAgIyB0eXBlOiBpbnQKKyAgICAgICAgc2VsZi5jZWxsQ2xpcCA9IDAuMCAgIyB0eXBlOiBmbG9hdAorICAgICAgICBzZWxmLnByb2pDbGlwID0gMC4wICAjIHR5cGU6IGZsb2F0CisgICAgICAgIHNlbGYubWVyZ2VPdXRwdXRzID0gRmFsc2UgICMgdHlwZTogYm9vbAorICAgICAgICBzZWxmLnRpbWVNYWpvciA9IFRydWUgICMgdHlwZTogYm9vbAorICAgICAgICBzZWxmLmFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyA9IEZhbHNlICAjIHR5cGU6IGJvb2wKIAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zID0gTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zKCkKLSAgICAgICAgbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoobG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zKQorICAgICAgICBiaWRpcmVjdGlvbmFsU2VxdWVuY2VMc3Rtb3B0aW9ucyA9IEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zKCkKKyAgICAgICAgYmlkaXJlY3Rpb25hbFNlcXVlbmNlTHN0bW9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihiaWRpcmVjdGlvbmFsU2VxdWVuY2VMc3Rtb3B0aW9ucykKIAogICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9ucyk6Ci0gICAgICAgIHggPSBMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKGxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9ucykKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBiaWRpcmVjdGlvbmFsU2VxdWVuY2VMc3Rtb3B0aW9ucyk6CisgICAgICAgIHggPSBCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2soYmlkaXJlY3Rpb25hbFNlcXVlbmNlTHN0bW9wdGlvbnMpCiAgICAgICAgIHJldHVybiB4CiAKLSAgICAjIExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnMpOgotICAgICAgICBpZiBsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnMgaXMgTm9uZToKKyAgICAjIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIGJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxzdG1vcHRpb25zKToKKyAgICAgICAgaWYgYmlkaXJlY3Rpb25hbFNlcXVlbmNlTHN0bW9wdGlvbnMgaXMgTm9uZToKICAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLnJhZGl1cyA9IGxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9ucy5SYWRpdXMoKQotICAgICAgICBzZWxmLmJpYXMgPSBsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnMuQmlhcygpCi0gICAgICAgIHNlbGYuYWxwaGEgPSBsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnMuQWxwaGEoKQotICAgICAgICBzZWxmLmJldGEgPSBsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnMuQmV0YSgpCisgICAgICAgIHNlbGYuZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24gPSBiaWRpcmVjdGlvbmFsU2VxdWVuY2VMc3Rtb3B0aW9ucy5GdXNlZEFjdGl2YXRpb25GdW5jdGlvbigpCisgICAgICAgIHNlbGYuY2VsbENsaXAgPSBiaWRpcmVjdGlvbmFsU2VxdWVuY2VMc3Rtb3B0aW9ucy5DZWxsQ2xpcCgpCisgICAgICAgIHNlbGYucHJvakNsaXAgPSBiaWRpcmVjdGlvbmFsU2VxdWVuY2VMc3Rtb3B0aW9ucy5Qcm9qQ2xpcCgpCisgICAgICAgIHNlbGYubWVyZ2VPdXRwdXRzID0gYmlkaXJlY3Rpb25hbFNlcXVlbmNlTHN0bW9wdGlvbnMuTWVyZ2VPdXRwdXRzKCkKKyAgICAgICAgc2VsZi50aW1lTWFqb3IgPSBiaWRpcmVjdGlvbmFsU2VxdWVuY2VMc3Rtb3B0aW9ucy5UaW1lTWFqb3IoKQorICAgICAgICBzZWxmLmFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyA9IGJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxzdG1vcHRpb25zLkFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cygpCiAKLSAgICAjIExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9uc1QKKyAgICAjIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zVAogICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnNBZGRSYWRpdXMoYnVpbGRlciwgc2VsZi5yYWRpdXMpCi0gICAgICAgIExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9uc0FkZEJpYXMoYnVpbGRlciwgc2VsZi5iaWFzKQotICAgICAgICBMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnNBZGRBbHBoYShidWlsZGVyLCBzZWxmLmFscGhhKQotICAgICAgICBMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnNBZGRCZXRhKGJ1aWxkZXIsIHNlbGYuYmV0YSkKLSAgICAgICAgbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zID0gTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisgICAgICAgIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBzZWxmLmZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKQorICAgICAgICBCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc0FkZENlbGxDbGlwKGJ1aWxkZXIsIHNlbGYuY2VsbENsaXApCisgICAgICAgIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zQWRkUHJvakNsaXAoYnVpbGRlciwgc2VsZi5wcm9qQ2xpcCkKKyAgICAgICAgQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNBZGRNZXJnZU91dHB1dHMoYnVpbGRlciwgc2VsZi5tZXJnZU91dHB1dHMpCisgICAgICAgIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zQWRkVGltZU1ham9yKGJ1aWxkZXIsIHNlbGYudGltZU1ham9yKQorICAgICAgICBCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc0FkZEFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyhidWlsZGVyLCBzZWxmLmFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cykKKyAgICAgICAgYmlkaXJlY3Rpb25hbFNlcXVlbmNlTHN0bW9wdGlvbnMgPSBCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gYmlkaXJlY3Rpb25hbFNlcXVlbmNlTHN0bW9wdGlvbnMKIAotIyBuYW1lc3BhY2U6IHRmbGl0ZQogCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCitjbGFzcyBSZXNpemVCaWxpbmVhck9wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBSZXNpemVCaWxpbmVhck9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc1Jlc2l6ZUJpbGluZWFyT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFJlc2l6ZUJpbGluZWFyT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgUmVzaXplQmlsaW5lYXJPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworICAgICMgUmVzaXplQmlsaW5lYXJPcHRpb25zCisgICAgZGVmIEFsaWduQ29ybmVycyhzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg4KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuQm9vbEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykpCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgIyBSZXNpemVCaWxpbmVhck9wdGlvbnMKKyAgICBkZWYgSGFsZlBpeGVsQ2VudGVycyhzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkJvb2xGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpKQorICAgICAgICByZXR1cm4gRmFsc2UKKworZGVmIFJlc2l6ZUJpbGluZWFyT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoNCkKKworZGVmIFJlc2l6ZUJpbGluZWFyT3B0aW9uc0FkZEFsaWduQ29ybmVycyhidWlsZGVyLCBhbGlnbkNvcm5lcnMpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEJvb2xTbG90KDIsIGFsaWduQ29ybmVycywgMCkKKworZGVmIFJlc2l6ZUJpbGluZWFyT3B0aW9uc0FkZEhhbGZQaXhlbENlbnRlcnMoYnVpbGRlciwgaGFsZlBpeGVsQ2VudGVycyk6CisgICAgYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoMywgaGFsZlBpeGVsQ2VudGVycywgMCkKKworZGVmIFJlc2l6ZUJpbGluZWFyT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgUmVzaXplQmlsaW5lYXJPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBSZXNpemVCaWxpbmVhck9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmFsaWduQ29ybmVycyA9IEZhbHNlICAjIHR5cGU6IGJvb2wKKyAgICAgICAgc2VsZi5oYWxmUGl4ZWxDZW50ZXJzID0gRmFsc2UgICMgdHlwZTogYm9vbAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICByZXNpemVCaWxpbmVhck9wdGlvbnMgPSBSZXNpemVCaWxpbmVhck9wdGlvbnMoKQorICAgICAgICByZXNpemVCaWxpbmVhck9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihyZXNpemVCaWxpbmVhck9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCByZXNpemVCaWxpbmVhck9wdGlvbnMpOgorICAgICAgICB4ID0gUmVzaXplQmlsaW5lYXJPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhyZXNpemVCaWxpbmVhck9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFJlc2l6ZUJpbGluZWFyT3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCByZXNpemVCaWxpbmVhck9wdGlvbnMpOgorICAgICAgICBpZiByZXNpemVCaWxpbmVhck9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmFsaWduQ29ybmVycyA9IHJlc2l6ZUJpbGluZWFyT3B0aW9ucy5BbGlnbkNvcm5lcnMoKQorICAgICAgICBzZWxmLmhhbGZQaXhlbENlbnRlcnMgPSByZXNpemVCaWxpbmVhck9wdGlvbnMuSGFsZlBpeGVsQ2VudGVycygpCisKKyAgICAjIFJlc2l6ZUJpbGluZWFyT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgUmVzaXplQmlsaW5lYXJPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgUmVzaXplQmlsaW5lYXJPcHRpb25zQWRkQWxpZ25Db3JuZXJzKGJ1aWxkZXIsIHNlbGYuYWxpZ25Db3JuZXJzKQorICAgICAgICBSZXNpemVCaWxpbmVhck9wdGlvbnNBZGRIYWxmUGl4ZWxDZW50ZXJzKGJ1aWxkZXIsIHNlbGYuaGFsZlBpeGVsQ2VudGVycykKKyAgICAgICAgcmVzaXplQmlsaW5lYXJPcHRpb25zID0gUmVzaXplQmlsaW5lYXJPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiByZXNpemVCaWxpbmVhck9wdGlvbnMKKworCitjbGFzcyBSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gUmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzUmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCisgICAgIyBSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zCisgICAgZGVmIEFsaWduQ29ybmVycyhzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuQm9vbEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykpCisgICAgICAgIHJldHVybiBGYWxzZQorCisgICAgIyBSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zCisgICAgZGVmIEhhbGZQaXhlbENlbnRlcnMoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkJvb2xGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpKQorICAgICAgICByZXR1cm4gRmFsc2UKKworZGVmIFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDIpCisKK2RlZiBSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zQWRkQWxpZ25Db3JuZXJzKGJ1aWxkZXIsIGFsaWduQ29ybmVycyk6CisgICAgYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoMCwgYWxpZ25Db3JuZXJzLCAwKQorCitkZWYgUmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9uc0FkZEhhbGZQaXhlbENlbnRlcnMoYnVpbGRlciwgaGFsZlBpeGVsQ2VudGVycyk6CisgICAgYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoMSwgaGFsZlBpeGVsQ2VudGVycywgMCkKKworZGVmIFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmFsaWduQ29ybmVycyA9IEZhbHNlICAjIHR5cGU6IGJvb2wKKyAgICAgICAgc2VsZi5oYWxmUGl4ZWxDZW50ZXJzID0gRmFsc2UgICMgdHlwZTogYm9vbAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICByZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zID0gUmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9ucygpCisgICAgICAgIHJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihyZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgcmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9ucyk6CisgICAgICAgIHggPSBSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhyZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIHJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnMpOgorICAgICAgICBpZiByZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5hbGlnbkNvcm5lcnMgPSByZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zLkFsaWduQ29ybmVycygpCisgICAgICAgIHNlbGYuaGFsZlBpeGVsQ2VudGVycyA9IHJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnMuSGFsZlBpeGVsQ2VudGVycygpCisKKyAgICAjIFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICBSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zQWRkQWxpZ25Db3JuZXJzKGJ1aWxkZXIsIHNlbGYuYWxpZ25Db3JuZXJzKQorICAgICAgICBSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zQWRkSGFsZlBpeGVsQ2VudGVycyhidWlsZGVyLCBzZWxmLmhhbGZQaXhlbENlbnRlcnMpCisgICAgICAgIHJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnMgPSBSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiByZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zCisKKworY2xhc3MgQ2FsbE9wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBDYWxsT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzQ2FsbE9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBDYWxsT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgQ2FsbE9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCisgICAgIyBDYWxsT3B0aW9ucworICAgIGRlZiBTdWJncmFwaChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVpbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworZGVmIENhbGxPcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgxKQorCitkZWYgQ2FsbE9wdGlvbnNBZGRTdWJncmFwaChidWlsZGVyLCBzdWJncmFwaCk6CisgICAgYnVpbGRlci5QcmVwZW5kVWludDMyU2xvdCgwLCBzdWJncmFwaCwgMCkKKworZGVmIENhbGxPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBDYWxsT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgQ2FsbE9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnN1YmdyYXBoID0gMCAgIyB0eXBlOiBpbnQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgY2FsbE9wdGlvbnMgPSBDYWxsT3B0aW9ucygpCisgICAgICAgIGNhbGxPcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooY2FsbE9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBjYWxsT3B0aW9ucyk6CisgICAgICAgIHggPSBDYWxsT3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2soY2FsbE9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIENhbGxPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIGNhbGxPcHRpb25zKToKKyAgICAgICAgaWYgY2FsbE9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnN1YmdyYXBoID0gY2FsbE9wdGlvbnMuU3ViZ3JhcGgoKQorCisgICAgIyBDYWxsT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgQ2FsbE9wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICBDYWxsT3B0aW9uc0FkZFN1YmdyYXBoKGJ1aWxkZXIsIHNlbGYuc3ViZ3JhcGgpCisgICAgICAgIGNhbGxPcHRpb25zID0gQ2FsbE9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIGNhbGxPcHRpb25zCisKKworY2xhc3MgUGFkT3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IFBhZE9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc1BhZE9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBQYWRPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBQYWRPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworZGVmIFBhZE9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCisKK2RlZiBQYWRPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBQYWRPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBQYWRPcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICBwYWRPcHRpb25zID0gUGFkT3B0aW9ucygpCisgICAgICAgIHBhZE9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihwYWRPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgcGFkT3B0aW9ucyk6CisgICAgICAgIHggPSBQYWRPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhwYWRPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBQYWRPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIHBhZE9wdGlvbnMpOgorICAgICAgICBpZiBwYWRPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICMgUGFkT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgUGFkT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIHBhZE9wdGlvbnMgPSBQYWRPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBwYWRPcHRpb25zCisKKworY2xhc3MgUGFkVjJPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gUGFkVjJPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNQYWRWMk9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBQYWRWMk9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFBhZFYyT3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKK2RlZiBQYWRWMk9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCisKK2RlZiBQYWRWMk9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIFBhZFYyT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgUGFkVjJPcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICBwYWRWMk9wdGlvbnMgPSBQYWRWMk9wdGlvbnMoKQorICAgICAgICBwYWRWMk9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihwYWRWMk9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBwYWRWMk9wdGlvbnMpOgorICAgICAgICB4ID0gUGFkVjJPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhwYWRWMk9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFBhZFYyT3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBwYWRWMk9wdGlvbnMpOgorICAgICAgICBpZiBwYWRWMk9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgIyBQYWRWMk9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIFBhZFYyT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIHBhZFYyT3B0aW9ucyA9IFBhZFYyT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gcGFkVjJPcHRpb25zCisKKworY2xhc3MgUmVzaGFwZU9wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBSZXNoYXBlT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzUmVzaGFwZU9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBSZXNoYXBlT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgUmVzaGFwZU9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCisgICAgIyBSZXNoYXBlT3B0aW9ucworICAgIGRlZiBOZXdTaGFwZShzZWxmLCBqKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgYSA9IHNlbGYuX3RhYi5WZWN0b3IobykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBhICsgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShqICogNCkpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFJlc2hhcGVPcHRpb25zCisgICAgZGVmIE5ld1NoYXBlQXNOdW1weShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXRWZWN0b3JBc051bXB5KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBSZXNoYXBlT3B0aW9ucworICAgIGRlZiBOZXdTaGFwZUxlbmd0aChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgUmVzaGFwZU9wdGlvbnMKKyAgICBkZWYgTmV3U2hhcGVJc05vbmUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIHJldHVybiBvID09IDAKKworZGVmIFJlc2hhcGVPcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgxKQorCitkZWYgUmVzaGFwZU9wdGlvbnNBZGROZXdTaGFwZShidWlsZGVyLCBuZXdTaGFwZSk6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMCwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShuZXdTaGFwZSksIDApCisKK2RlZiBSZXNoYXBlT3B0aW9uc1N0YXJ0TmV3U2hhcGVWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgorICAgIHJldHVybiBidWlsZGVyLlN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KQorCitkZWYgUmVzaGFwZU9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCit0cnk6CisgICAgZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QKK2V4Y2VwdDoKKyAgICBwYXNzCisKK2NsYXNzIFJlc2hhcGVPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBSZXNoYXBlT3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYubmV3U2hhcGUgPSBOb25lICAjIHR5cGU6IExpc3RbaW50XQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICByZXNoYXBlT3B0aW9ucyA9IFJlc2hhcGVPcHRpb25zKCkKKyAgICAgICAgcmVzaGFwZU9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihyZXNoYXBlT3B0aW9ucykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHJlc2hhcGVPcHRpb25zKToKKyAgICAgICAgeCA9IFJlc2hhcGVPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhyZXNoYXBlT3B0aW9ucykKKyAgICAgICAgcmV0dXJuIHgKKworICAgICMgUmVzaGFwZU9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgcmVzaGFwZU9wdGlvbnMpOgorICAgICAgICBpZiByZXNoYXBlT3B0aW9ucyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG5vdCByZXNoYXBlT3B0aW9ucy5OZXdTaGFwZUlzTm9uZSgpOgorICAgICAgICAgICAgaWYgbnAgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLm5ld1NoYXBlID0gW10KKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShyZXNoYXBlT3B0aW9ucy5OZXdTaGFwZUxlbmd0aCgpKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5uZXdTaGFwZS5hcHBlbmQocmVzaGFwZU9wdGlvbnMuTmV3U2hhcGUoaSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYubmV3U2hhcGUgPSByZXNoYXBlT3B0aW9ucy5OZXdTaGFwZUFzTnVtcHkoKQorCisgICAgIyBSZXNoYXBlT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgaWYgc2VsZi5uZXdTaGFwZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG5wIGlzIG5vdCBOb25lIGFuZCB0eXBlKHNlbGYubmV3U2hhcGUpIGlzIG5wLm5kYXJyYXk6CisgICAgICAgICAgICAgICAgbmV3U2hhcGUgPSBidWlsZGVyLkNyZWF0ZU51bXB5VmVjdG9yKHNlbGYubmV3U2hhcGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIFJlc2hhcGVPcHRpb25zU3RhcnROZXdTaGFwZVZlY3RvcihidWlsZGVyLCBsZW4oc2VsZi5uZXdTaGFwZSkpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYubmV3U2hhcGUpKSk6CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZEludDMyKHNlbGYubmV3U2hhcGVbaV0pCisgICAgICAgICAgICAgICAgbmV3U2hhcGUgPSBidWlsZGVyLkVuZFZlY3RvcigpCisgICAgICAgIFJlc2hhcGVPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgaWYgc2VsZi5uZXdTaGFwZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIFJlc2hhcGVPcHRpb25zQWRkTmV3U2hhcGUoYnVpbGRlciwgbmV3U2hhcGUpCisgICAgICAgIHJlc2hhcGVPcHRpb25zID0gUmVzaGFwZU9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHJlc2hhcGVPcHRpb25zCisKKworY2xhc3MgU3BhY2VUb0JhdGNoTkRPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gU3BhY2VUb0JhdGNoTkRPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNTcGFjZVRvQmF0Y2hORE9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBTcGFjZVRvQmF0Y2hORE9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFNwYWNlVG9CYXRjaE5ET3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKK2RlZiBTcGFjZVRvQmF0Y2hORE9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCisKK2RlZiBTcGFjZVRvQmF0Y2hORE9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIFNwYWNlVG9CYXRjaE5ET3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgU3BhY2VUb0JhdGNoTkRPcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICBzcGFjZVRvQmF0Y2hOZG9wdGlvbnMgPSBTcGFjZVRvQmF0Y2hORE9wdGlvbnMoKQorICAgICAgICBzcGFjZVRvQmF0Y2hOZG9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihzcGFjZVRvQmF0Y2hOZG9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzcGFjZVRvQmF0Y2hOZG9wdGlvbnMpOgorICAgICAgICB4ID0gU3BhY2VUb0JhdGNoTkRPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhzcGFjZVRvQmF0Y2hOZG9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFNwYWNlVG9CYXRjaE5ET3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBzcGFjZVRvQmF0Y2hOZG9wdGlvbnMpOgorICAgICAgICBpZiBzcGFjZVRvQmF0Y2hOZG9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgIyBTcGFjZVRvQmF0Y2hORE9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIFNwYWNlVG9CYXRjaE5ET3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIHNwYWNlVG9CYXRjaE5kb3B0aW9ucyA9IFNwYWNlVG9CYXRjaE5ET3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gc3BhY2VUb0JhdGNoTmRvcHRpb25zCisKKworY2xhc3MgQmF0Y2hUb1NwYWNlTkRPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gQmF0Y2hUb1NwYWNlTkRPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNCYXRjaFRvU3BhY2VORE9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBCYXRjaFRvU3BhY2VORE9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIEJhdGNoVG9TcGFjZU5ET3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKK2RlZiBCYXRjaFRvU3BhY2VORE9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCisKK2RlZiBCYXRjaFRvU3BhY2VORE9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIEJhdGNoVG9TcGFjZU5ET3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgQmF0Y2hUb1NwYWNlTkRPcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICBiYXRjaFRvU3BhY2VOZG9wdGlvbnMgPSBCYXRjaFRvU3BhY2VORE9wdGlvbnMoKQorICAgICAgICBiYXRjaFRvU3BhY2VOZG9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihiYXRjaFRvU3BhY2VOZG9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBiYXRjaFRvU3BhY2VOZG9wdGlvbnMpOgorICAgICAgICB4ID0gQmF0Y2hUb1NwYWNlTkRPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhiYXRjaFRvU3BhY2VOZG9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIEJhdGNoVG9TcGFjZU5ET3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBiYXRjaFRvU3BhY2VOZG9wdGlvbnMpOgorICAgICAgICBpZiBiYXRjaFRvU3BhY2VOZG9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgIyBCYXRjaFRvU3BhY2VORE9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIEJhdGNoVG9TcGFjZU5ET3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIGJhdGNoVG9TcGFjZU5kb3B0aW9ucyA9IEJhdGNoVG9TcGFjZU5ET3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gYmF0Y2hUb1NwYWNlTmRvcHRpb25zCisKKworY2xhc3MgU2tpcEdyYW1PcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gU2tpcEdyYW1PcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNTa2lwR3JhbU9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBTa2lwR3JhbU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFNraXBHcmFtT3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKKyAgICAjIFNraXBHcmFtT3B0aW9ucworICAgIGRlZiBOZ3JhbVNpemUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU2tpcEdyYW1PcHRpb25zCisgICAgZGVmIE1heFNraXBTaXplKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFNraXBHcmFtT3B0aW9ucworICAgIGRlZiBJbmNsdWRlQWxsTmdyYW1zKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gYm9vbChzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5Cb29sRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKSkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKK2RlZiBTa2lwR3JhbU9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDMpCisKK2RlZiBTa2lwR3JhbU9wdGlvbnNBZGROZ3JhbVNpemUoYnVpbGRlciwgbmdyYW1TaXplKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMCwgbmdyYW1TaXplLCAwKQorCitkZWYgU2tpcEdyYW1PcHRpb25zQWRkTWF4U2tpcFNpemUoYnVpbGRlciwgbWF4U2tpcFNpemUpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEludDMyU2xvdCgxLCBtYXhTa2lwU2l6ZSwgMCkKKworZGVmIFNraXBHcmFtT3B0aW9uc0FkZEluY2x1ZGVBbGxOZ3JhbXMoYnVpbGRlciwgaW5jbHVkZUFsbE5ncmFtcyk6CisgICAgYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoMiwgaW5jbHVkZUFsbE5ncmFtcywgMCkKKworZGVmIFNraXBHcmFtT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgU2tpcEdyYW1PcHRpb25zVChvYmplY3QpOgorCisgICAgIyBTa2lwR3JhbU9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLm5ncmFtU2l6ZSA9IDAgICMgdHlwZTogaW50CisgICAgICAgIHNlbGYubWF4U2tpcFNpemUgPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmluY2x1ZGVBbGxOZ3JhbXMgPSBGYWxzZSAgIyB0eXBlOiBib29sCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHNraXBHcmFtT3B0aW9ucyA9IFNraXBHcmFtT3B0aW9ucygpCisgICAgICAgIHNraXBHcmFtT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHNraXBHcmFtT3B0aW9ucykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHNraXBHcmFtT3B0aW9ucyk6CisgICAgICAgIHggPSBTa2lwR3JhbU9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHNraXBHcmFtT3B0aW9ucykKKyAgICAgICAgcmV0dXJuIHgKKworICAgICMgU2tpcEdyYW1PcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIHNraXBHcmFtT3B0aW9ucyk6CisgICAgICAgIGlmIHNraXBHcmFtT3B0aW9ucyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYubmdyYW1TaXplID0gc2tpcEdyYW1PcHRpb25zLk5ncmFtU2l6ZSgpCisgICAgICAgIHNlbGYubWF4U2tpcFNpemUgPSBza2lwR3JhbU9wdGlvbnMuTWF4U2tpcFNpemUoKQorICAgICAgICBzZWxmLmluY2x1ZGVBbGxOZ3JhbXMgPSBza2lwR3JhbU9wdGlvbnMuSW5jbHVkZUFsbE5ncmFtcygpCisKKyAgICAjIFNraXBHcmFtT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgU2tpcEdyYW1PcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgU2tpcEdyYW1PcHRpb25zQWRkTmdyYW1TaXplKGJ1aWxkZXIsIHNlbGYubmdyYW1TaXplKQorICAgICAgICBTa2lwR3JhbU9wdGlvbnNBZGRNYXhTa2lwU2l6ZShidWlsZGVyLCBzZWxmLm1heFNraXBTaXplKQorICAgICAgICBTa2lwR3JhbU9wdGlvbnNBZGRJbmNsdWRlQWxsTmdyYW1zKGJ1aWxkZXIsIHNlbGYuaW5jbHVkZUFsbE5ncmFtcykKKyAgICAgICAgc2tpcEdyYW1PcHRpb25zID0gU2tpcEdyYW1PcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBza2lwR3JhbU9wdGlvbnMKKworCitjbGFzcyBTcGFjZVRvRGVwdGhPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gU3BhY2VUb0RlcHRoT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzU3BhY2VUb0RlcHRoT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFNwYWNlVG9EZXB0aE9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFNwYWNlVG9EZXB0aE9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCisgICAgIyBTcGFjZVRvRGVwdGhPcHRpb25zCisgICAgZGVmIEJsb2NrU2l6ZShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCitkZWYgU3BhY2VUb0RlcHRoT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMSkKKworZGVmIFNwYWNlVG9EZXB0aE9wdGlvbnNBZGRCbG9ja1NpemUoYnVpbGRlciwgYmxvY2tTaXplKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMCwgYmxvY2tTaXplLCAwKQorCitkZWYgU3BhY2VUb0RlcHRoT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgU3BhY2VUb0RlcHRoT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgU3BhY2VUb0RlcHRoT3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuYmxvY2tTaXplID0gMCAgIyB0eXBlOiBpbnQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgc3BhY2VUb0RlcHRoT3B0aW9ucyA9IFNwYWNlVG9EZXB0aE9wdGlvbnMoKQorICAgICAgICBzcGFjZVRvRGVwdGhPcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooc3BhY2VUb0RlcHRoT3B0aW9ucykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHNwYWNlVG9EZXB0aE9wdGlvbnMpOgorICAgICAgICB4ID0gU3BhY2VUb0RlcHRoT3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2soc3BhY2VUb0RlcHRoT3B0aW9ucykKKyAgICAgICAgcmV0dXJuIHgKKworICAgICMgU3BhY2VUb0RlcHRoT3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBzcGFjZVRvRGVwdGhPcHRpb25zKToKKyAgICAgICAgaWYgc3BhY2VUb0RlcHRoT3B0aW9ucyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuYmxvY2tTaXplID0gc3BhY2VUb0RlcHRoT3B0aW9ucy5CbG9ja1NpemUoKQorCisgICAgIyBTcGFjZVRvRGVwdGhPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBTcGFjZVRvRGVwdGhPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgU3BhY2VUb0RlcHRoT3B0aW9uc0FkZEJsb2NrU2l6ZShidWlsZGVyLCBzZWxmLmJsb2NrU2l6ZSkKKyAgICAgICAgc3BhY2VUb0RlcHRoT3B0aW9ucyA9IFNwYWNlVG9EZXB0aE9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHNwYWNlVG9EZXB0aE9wdGlvbnMKKworCitjbGFzcyBEZXB0aFRvU3BhY2VPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gRGVwdGhUb1NwYWNlT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzRGVwdGhUb1NwYWNlT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIERlcHRoVG9TcGFjZU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIERlcHRoVG9TcGFjZU9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCisgICAgIyBEZXB0aFRvU3BhY2VPcHRpb25zCisgICAgZGVmIEJsb2NrU2l6ZShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCitkZWYgRGVwdGhUb1NwYWNlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMSkKKworZGVmIERlcHRoVG9TcGFjZU9wdGlvbnNBZGRCbG9ja1NpemUoYnVpbGRlciwgYmxvY2tTaXplKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMCwgYmxvY2tTaXplLCAwKQorCitkZWYgRGVwdGhUb1NwYWNlT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgRGVwdGhUb1NwYWNlT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgRGVwdGhUb1NwYWNlT3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuYmxvY2tTaXplID0gMCAgIyB0eXBlOiBpbnQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgZGVwdGhUb1NwYWNlT3B0aW9ucyA9IERlcHRoVG9TcGFjZU9wdGlvbnMoKQorICAgICAgICBkZXB0aFRvU3BhY2VPcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooZGVwdGhUb1NwYWNlT3B0aW9ucykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGRlcHRoVG9TcGFjZU9wdGlvbnMpOgorICAgICAgICB4ID0gRGVwdGhUb1NwYWNlT3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2soZGVwdGhUb1NwYWNlT3B0aW9ucykKKyAgICAgICAgcmV0dXJuIHgKKworICAgICMgRGVwdGhUb1NwYWNlT3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBkZXB0aFRvU3BhY2VPcHRpb25zKToKKyAgICAgICAgaWYgZGVwdGhUb1NwYWNlT3B0aW9ucyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuYmxvY2tTaXplID0gZGVwdGhUb1NwYWNlT3B0aW9ucy5CbG9ja1NpemUoKQorCisgICAgIyBEZXB0aFRvU3BhY2VPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBEZXB0aFRvU3BhY2VPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgRGVwdGhUb1NwYWNlT3B0aW9uc0FkZEJsb2NrU2l6ZShidWlsZGVyLCBzZWxmLmJsb2NrU2l6ZSkKKyAgICAgICAgZGVwdGhUb1NwYWNlT3B0aW9ucyA9IERlcHRoVG9TcGFjZU9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIGRlcHRoVG9TcGFjZU9wdGlvbnMKKworCitjbGFzcyBTdWJPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gU3ViT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzU3ViT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFN1Yk9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFN1Yk9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCisgICAgIyBTdWJPcHRpb25zCisgICAgZGVmIEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50OEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3ViT3B0aW9ucworICAgIGRlZiBQb3RTY2FsZUludDE2KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gYm9vbChzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5Cb29sRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKSkKKyAgICAgICAgcmV0dXJuIFRydWUKKworZGVmIFN1Yk9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDIpCisKK2RlZiBTdWJPcHRpb25zQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pOgorICAgIGJ1aWxkZXIuUHJlcGVuZEludDhTbG90KDAsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uLCAwKQorCitkZWYgU3ViT3B0aW9uc0FkZFBvdFNjYWxlSW50MTYoYnVpbGRlciwgcG90U2NhbGVJbnQxNik6CisgICAgYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoMSwgcG90U2NhbGVJbnQxNiwgMSkKKworZGVmIFN1Yk9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIFN1Yk9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIFN1Yk9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uID0gMCAgIyB0eXBlOiBpbnQKKyAgICAgICAgc2VsZi5wb3RTY2FsZUludDE2ID0gVHJ1ZSAgIyB0eXBlOiBib29sCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHN1Yk9wdGlvbnMgPSBTdWJPcHRpb25zKCkKKyAgICAgICAgc3ViT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHN1Yk9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzdWJPcHRpb25zKToKKyAgICAgICAgeCA9IFN1Yk9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHN1Yk9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFN1Yk9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgc3ViT3B0aW9ucyk6CisgICAgICAgIGlmIHN1Yk9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uID0gc3ViT3B0aW9ucy5GdXNlZEFjdGl2YXRpb25GdW5jdGlvbigpCisgICAgICAgIHNlbGYucG90U2NhbGVJbnQxNiA9IHN1Yk9wdGlvbnMuUG90U2NhbGVJbnQxNigpCisKKyAgICAjIFN1Yk9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIFN1Yk9wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICBTdWJPcHRpb25zQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbikKKyAgICAgICAgU3ViT3B0aW9uc0FkZFBvdFNjYWxlSW50MTYoYnVpbGRlciwgc2VsZi5wb3RTY2FsZUludDE2KQorICAgICAgICBzdWJPcHRpb25zID0gU3ViT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gc3ViT3B0aW9ucworCisKK2NsYXNzIERpdk9wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBEaXZPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNEaXZPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgorICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgRGl2T3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgRGl2T3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKKyAgICAjIERpdk9wdGlvbnMKKyAgICBkZWYgRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCitkZWYgRGl2T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMSkKKworZGVmIERpdk9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbik6CisgICAgYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoMCwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24sIDApCisKK2RlZiBEaXZPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBEaXZPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBEaXZPcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbiA9IDAgICMgdHlwZTogaW50CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIGRpdk9wdGlvbnMgPSBEaXZPcHRpb25zKCkKKyAgICAgICAgZGl2T3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGRpdk9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBkaXZPcHRpb25zKToKKyAgICAgICAgeCA9IERpdk9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKGRpdk9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIERpdk9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgZGl2T3B0aW9ucyk6CisgICAgICAgIGlmIGRpdk9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uID0gZGl2T3B0aW9ucy5GdXNlZEFjdGl2YXRpb25GdW5jdGlvbigpCisKKyAgICAjIERpdk9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIERpdk9wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICBEaXZPcHRpb25zQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbikKKyAgICAgICAgZGl2T3B0aW9ucyA9IERpdk9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIGRpdk9wdGlvbnMKKworCitjbGFzcyBUb3BLVjJPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gVG9wS1YyT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzVG9wS1YyT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFRvcEtWMk9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFRvcEtWMk9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCitkZWYgVG9wS1YyT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIFRvcEtWMk9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIFRvcEtWMk9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIFRvcEtWMk9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHRvcEt2Mk9wdGlvbnMgPSBUb3BLVjJPcHRpb25zKCkKKyAgICAgICAgdG9wS3YyT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHRvcEt2Mk9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCB0b3BLdjJPcHRpb25zKToKKyAgICAgICAgeCA9IFRvcEtWMk9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHRvcEt2Mk9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFRvcEtWMk9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgdG9wS3YyT3B0aW9ucyk6CisgICAgICAgIGlmIHRvcEt2Mk9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgIyBUb3BLVjJPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBUb3BLVjJPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgdG9wS3YyT3B0aW9ucyA9IFRvcEtWMk9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHRvcEt2Mk9wdGlvbnMKKworCitjbGFzcyBFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gRW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzRW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEVtYmVkZGluZ0xvb2t1cFNwYXJzZU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIEVtYmVkZGluZ0xvb2t1cFNwYXJzZU9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCisgICAgIyBFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zCisgICAgZGVmIENvbWJpbmVyKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50OEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworZGVmIEVtYmVkZGluZ0xvb2t1cFNwYXJzZU9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDEpCisKK2RlZiBFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zQWRkQ29tYmluZXIoYnVpbGRlciwgY29tYmluZXIpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEludDhTbG90KDAsIGNvbWJpbmVyLCAwKQorCitkZWYgRW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgRW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgRW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuY29tYmluZXIgPSAwICAjIHR5cGU6IGludAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICBlbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zID0gRW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9ucygpCisgICAgICAgIGVtYmVkZGluZ0xvb2t1cFNwYXJzZU9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihlbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgZW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9ucyk6CisgICAgICAgIHggPSBFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhlbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIGVtYmVkZGluZ0xvb2t1cFNwYXJzZU9wdGlvbnMpOgorICAgICAgICBpZiBlbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5jb21iaW5lciA9IGVtYmVkZGluZ0xvb2t1cFNwYXJzZU9wdGlvbnMuQ29tYmluZXIoKQorCisgICAgIyBFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgRW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9uc0FkZENvbWJpbmVyKGJ1aWxkZXIsIHNlbGYuY29tYmluZXIpCisgICAgICAgIGVtYmVkZGluZ0xvb2t1cFNwYXJzZU9wdGlvbnMgPSBFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBlbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zCisKKworY2xhc3MgR2F0aGVyT3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IEdhdGhlck9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc0dhdGhlck9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHYXRoZXJPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBHYXRoZXJPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworICAgICMgR2F0aGVyT3B0aW9ucworICAgIGRlZiBBeGlzKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIEdhdGhlck9wdGlvbnMKKyAgICBkZWYgQmF0Y2hEaW1zKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKK2RlZiBHYXRoZXJPcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgyKQorCitkZWYgR2F0aGVyT3B0aW9uc0FkZEF4aXMoYnVpbGRlciwgYXhpcyk6CisgICAgYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDAsIGF4aXMsIDApCisKK2RlZiBHYXRoZXJPcHRpb25zQWRkQmF0Y2hEaW1zKGJ1aWxkZXIsIGJhdGNoRGltcyk6CisgICAgYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDEsIGJhdGNoRGltcywgMCkKKworZGVmIEdhdGhlck9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIEdhdGhlck9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIEdhdGhlck9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmF4aXMgPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmJhdGNoRGltcyA9IDAgICMgdHlwZTogaW50CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIGdhdGhlck9wdGlvbnMgPSBHYXRoZXJPcHRpb25zKCkKKyAgICAgICAgZ2F0aGVyT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGdhdGhlck9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBnYXRoZXJPcHRpb25zKToKKyAgICAgICAgeCA9IEdhdGhlck9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKGdhdGhlck9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIEdhdGhlck9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgZ2F0aGVyT3B0aW9ucyk6CisgICAgICAgIGlmIGdhdGhlck9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmF4aXMgPSBnYXRoZXJPcHRpb25zLkF4aXMoKQorICAgICAgICBzZWxmLmJhdGNoRGltcyA9IGdhdGhlck9wdGlvbnMuQmF0Y2hEaW1zKCkKKworICAgICMgR2F0aGVyT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgR2F0aGVyT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIEdhdGhlck9wdGlvbnNBZGRBeGlzKGJ1aWxkZXIsIHNlbGYuYXhpcykKKyAgICAgICAgR2F0aGVyT3B0aW9uc0FkZEJhdGNoRGltcyhidWlsZGVyLCBzZWxmLmJhdGNoRGltcykKKyAgICAgICAgZ2F0aGVyT3B0aW9ucyA9IEdhdGhlck9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIGdhdGhlck9wdGlvbnMKKworCitjbGFzcyBUcmFuc3Bvc2VPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gVHJhbnNwb3NlT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzVHJhbnNwb3NlT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFRyYW5zcG9zZU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFRyYW5zcG9zZU9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCitkZWYgVHJhbnNwb3NlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIFRyYW5zcG9zZU9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIFRyYW5zcG9zZU9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIFRyYW5zcG9zZU9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHRyYW5zcG9zZU9wdGlvbnMgPSBUcmFuc3Bvc2VPcHRpb25zKCkKKyAgICAgICAgdHJhbnNwb3NlT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHRyYW5zcG9zZU9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCB0cmFuc3Bvc2VPcHRpb25zKToKKyAgICAgICAgeCA9IFRyYW5zcG9zZU9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHRyYW5zcG9zZU9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFRyYW5zcG9zZU9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgdHJhbnNwb3NlT3B0aW9ucyk6CisgICAgICAgIGlmIHRyYW5zcG9zZU9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgIyBUcmFuc3Bvc2VPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBUcmFuc3Bvc2VPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgdHJhbnNwb3NlT3B0aW9ucyA9IFRyYW5zcG9zZU9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHRyYW5zcG9zZU9wdGlvbnMKKworCitjbGFzcyBFeHBPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gRXhwT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzRXhwT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEV4cE9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIEV4cE9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCitkZWYgRXhwT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIEV4cE9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIEV4cE9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIEV4cE9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIGV4cE9wdGlvbnMgPSBFeHBPcHRpb25zKCkKKyAgICAgICAgZXhwT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGV4cE9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBleHBPcHRpb25zKToKKyAgICAgICAgeCA9IEV4cE9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKGV4cE9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIEV4cE9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgZXhwT3B0aW9ucyk6CisgICAgICAgIGlmIGV4cE9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgIyBFeHBPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBFeHBPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgZXhwT3B0aW9ucyA9IEV4cE9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIGV4cE9wdGlvbnMKKworCitjbGFzcyBDb3NPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gQ29zT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzQ29zT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIENvc09wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIENvc09wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCitkZWYgQ29zT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIENvc09wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIENvc09wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIENvc09wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIGNvc09wdGlvbnMgPSBDb3NPcHRpb25zKCkKKyAgICAgICAgY29zT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGNvc09wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBjb3NPcHRpb25zKToKKyAgICAgICAgeCA9IENvc09wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKGNvc09wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIENvc09wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgY29zT3B0aW9ucyk6CisgICAgICAgIGlmIGNvc09wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgIyBDb3NPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBDb3NPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgY29zT3B0aW9ucyA9IENvc09wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIGNvc09wdGlvbnMKKworCitjbGFzcyBSZWR1Y2VyT3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IFJlZHVjZXJPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNSZWR1Y2VyT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFJlZHVjZXJPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBSZWR1Y2VyT3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKKyAgICAjIFJlZHVjZXJPcHRpb25zCisgICAgZGVmIEtlZXBEaW1zKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gYm9vbChzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5Cb29sRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKSkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKK2RlZiBSZWR1Y2VyT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMSkKKworZGVmIFJlZHVjZXJPcHRpb25zQWRkS2VlcERpbXMoYnVpbGRlciwga2VlcERpbXMpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEJvb2xTbG90KDAsIGtlZXBEaW1zLCAwKQorCitkZWYgUmVkdWNlck9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIFJlZHVjZXJPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBSZWR1Y2VyT3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYua2VlcERpbXMgPSBGYWxzZSAgIyB0eXBlOiBib29sCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHJlZHVjZXJPcHRpb25zID0gUmVkdWNlck9wdGlvbnMoKQorICAgICAgICByZWR1Y2VyT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHJlZHVjZXJPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgcmVkdWNlck9wdGlvbnMpOgorICAgICAgICB4ID0gUmVkdWNlck9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHJlZHVjZXJPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBSZWR1Y2VyT3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCByZWR1Y2VyT3B0aW9ucyk6CisgICAgICAgIGlmIHJlZHVjZXJPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5rZWVwRGltcyA9IHJlZHVjZXJPcHRpb25zLktlZXBEaW1zKCkKKworICAgICMgUmVkdWNlck9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIFJlZHVjZXJPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgUmVkdWNlck9wdGlvbnNBZGRLZWVwRGltcyhidWlsZGVyLCBzZWxmLmtlZXBEaW1zKQorICAgICAgICByZWR1Y2VyT3B0aW9ucyA9IFJlZHVjZXJPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiByZWR1Y2VyT3B0aW9ucworCisKK2NsYXNzIFNxdWVlemVPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gU3F1ZWV6ZU9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc1NxdWVlemVPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgorICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgU3F1ZWV6ZU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFNxdWVlemVPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworICAgICMgU3F1ZWV6ZU9wdGlvbnMKKyAgICBkZWYgU3F1ZWV6ZURpbXMoc2VsZiwgaik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIGEgPSBzZWxmLl90YWIuVmVjdG9yKG8pCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgYSArIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaiAqIDQpKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTcXVlZXplT3B0aW9ucworICAgIGRlZiBTcXVlZXplRGltc0FzTnVtcHkoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0VmVjdG9yQXNOdW1weShmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3F1ZWV6ZU9wdGlvbnMKKyAgICBkZWYgU3F1ZWV6ZURpbXNMZW5ndGgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuVmVjdG9yTGVuKG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFNxdWVlemVPcHRpb25zCisgICAgZGVmIFNxdWVlemVEaW1zSXNOb25lKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICByZXR1cm4gbyA9PSAwCisKK2RlZiBTcXVlZXplT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMSkKKworZGVmIFNxdWVlemVPcHRpb25zQWRkU3F1ZWV6ZURpbXMoYnVpbGRlciwgc3F1ZWV6ZURpbXMpOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDAsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc3F1ZWV6ZURpbXMpLCAwKQorCitkZWYgU3F1ZWV6ZU9wdGlvbnNTdGFydFNxdWVlemVEaW1zVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKKyAgICByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCkKKworZGVmIFNxdWVlemVPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKwordHJ5OgorICAgIGZyb20gdHlwaW5nIGltcG9ydCBMaXN0CitleGNlcHQ6CisgICAgcGFzcworCitjbGFzcyBTcXVlZXplT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgU3F1ZWV6ZU9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnNxdWVlemVEaW1zID0gTm9uZSAgIyB0eXBlOiBMaXN0W2ludF0KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgc3F1ZWV6ZU9wdGlvbnMgPSBTcXVlZXplT3B0aW9ucygpCisgICAgICAgIHNxdWVlemVPcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooc3F1ZWV6ZU9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzcXVlZXplT3B0aW9ucyk6CisgICAgICAgIHggPSBTcXVlZXplT3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2soc3F1ZWV6ZU9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFNxdWVlemVPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIHNxdWVlemVPcHRpb25zKToKKyAgICAgICAgaWYgc3F1ZWV6ZU9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3Qgc3F1ZWV6ZU9wdGlvbnMuU3F1ZWV6ZURpbXNJc05vbmUoKToKKyAgICAgICAgICAgIGlmIG5wIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5zcXVlZXplRGltcyA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc3F1ZWV6ZU9wdGlvbnMuU3F1ZWV6ZURpbXNMZW5ndGgoKSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3F1ZWV6ZURpbXMuYXBwZW5kKHNxdWVlemVPcHRpb25zLlNxdWVlemVEaW1zKGkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnNxdWVlemVEaW1zID0gc3F1ZWV6ZU9wdGlvbnMuU3F1ZWV6ZURpbXNBc051bXB5KCkKKworICAgICMgU3F1ZWV6ZU9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIGlmIHNlbGYuc3F1ZWV6ZURpbXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBucCBpcyBub3QgTm9uZSBhbmQgdHlwZShzZWxmLnNxdWVlemVEaW1zKSBpcyBucC5uZGFycmF5OgorICAgICAgICAgICAgICAgIHNxdWVlemVEaW1zID0gYnVpbGRlci5DcmVhdGVOdW1weVZlY3RvcihzZWxmLnNxdWVlemVEaW1zKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBTcXVlZXplT3B0aW9uc1N0YXJ0U3F1ZWV6ZURpbXNWZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYuc3F1ZWV6ZURpbXMpKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLnNxdWVlemVEaW1zKSkpOgorICAgICAgICAgICAgICAgICAgICBidWlsZGVyLlByZXBlbmRJbnQzMihzZWxmLnNxdWVlemVEaW1zW2ldKQorICAgICAgICAgICAgICAgIHNxdWVlemVEaW1zID0gYnVpbGRlci5FbmRWZWN0b3IoKQorICAgICAgICBTcXVlZXplT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIGlmIHNlbGYuc3F1ZWV6ZURpbXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBTcXVlZXplT3B0aW9uc0FkZFNxdWVlemVEaW1zKGJ1aWxkZXIsIHNxdWVlemVEaW1zKQorICAgICAgICBzcXVlZXplT3B0aW9ucyA9IFNxdWVlemVPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBzcXVlZXplT3B0aW9ucworCisKK2NsYXNzIFNwbGl0T3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IFNwbGl0T3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzU3BsaXRPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgorICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgU3BsaXRPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBTcGxpdE9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCisgICAgIyBTcGxpdE9wdGlvbnMKKyAgICBkZWYgTnVtU3BsaXRzKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKK2RlZiBTcGxpdE9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDEpCisKK2RlZiBTcGxpdE9wdGlvbnNBZGROdW1TcGxpdHMoYnVpbGRlciwgbnVtU3BsaXRzKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMCwgbnVtU3BsaXRzLCAwKQorCitkZWYgU3BsaXRPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBTcGxpdE9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIFNwbGl0T3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYubnVtU3BsaXRzID0gMCAgIyB0eXBlOiBpbnQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgc3BsaXRPcHRpb25zID0gU3BsaXRPcHRpb25zKCkKKyAgICAgICAgc3BsaXRPcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooc3BsaXRPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgc3BsaXRPcHRpb25zKToKKyAgICAgICAgeCA9IFNwbGl0T3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2soc3BsaXRPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBTcGxpdE9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgc3BsaXRPcHRpb25zKToKKyAgICAgICAgaWYgc3BsaXRPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5udW1TcGxpdHMgPSBzcGxpdE9wdGlvbnMuTnVtU3BsaXRzKCkKKworICAgICMgU3BsaXRPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBTcGxpdE9wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICBTcGxpdE9wdGlvbnNBZGROdW1TcGxpdHMoYnVpbGRlciwgc2VsZi5udW1TcGxpdHMpCisgICAgICAgIHNwbGl0T3B0aW9ucyA9IFNwbGl0T3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gc3BsaXRPcHRpb25zCisKKworY2xhc3MgU3BsaXRWT3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IFNwbGl0Vk9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc1NwbGl0Vk9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBTcGxpdFZPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBTcGxpdFZPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworICAgICMgU3BsaXRWT3B0aW9ucworICAgIGRlZiBOdW1TcGxpdHMoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworZGVmIFNwbGl0Vk9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDEpCisKK2RlZiBTcGxpdFZPcHRpb25zQWRkTnVtU3BsaXRzKGJ1aWxkZXIsIG51bVNwbGl0cyk6CisgICAgYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDAsIG51bVNwbGl0cywgMCkKKworZGVmIFNwbGl0Vk9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIFNwbGl0Vk9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIFNwbGl0Vk9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLm51bVNwbGl0cyA9IDAgICMgdHlwZTogaW50CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHNwbGl0Vm9wdGlvbnMgPSBTcGxpdFZPcHRpb25zKCkKKyAgICAgICAgc3BsaXRWb3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHNwbGl0Vm9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzcGxpdFZvcHRpb25zKToKKyAgICAgICAgeCA9IFNwbGl0Vk9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHNwbGl0Vm9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFNwbGl0Vk9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgc3BsaXRWb3B0aW9ucyk6CisgICAgICAgIGlmIHNwbGl0Vm9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLm51bVNwbGl0cyA9IHNwbGl0Vm9wdGlvbnMuTnVtU3BsaXRzKCkKKworICAgICMgU3BsaXRWT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgU3BsaXRWT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIFNwbGl0Vk9wdGlvbnNBZGROdW1TcGxpdHMoYnVpbGRlciwgc2VsZi5udW1TcGxpdHMpCisgICAgICAgIHNwbGl0Vm9wdGlvbnMgPSBTcGxpdFZPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBzcGxpdFZvcHRpb25zCisKKworY2xhc3MgU3RyaWRlZFNsaWNlT3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IFN0cmlkZWRTbGljZU9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc1N0cmlkZWRTbGljZU9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBTdHJpZGVkU2xpY2VPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBTdHJpZGVkU2xpY2VPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworICAgICMgU3RyaWRlZFNsaWNlT3B0aW9ucworICAgIGRlZiBCZWdpbk1hc2soc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RyaWRlZFNsaWNlT3B0aW9ucworICAgIGRlZiBFbmRNYXNrKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0cmlkZWRTbGljZU9wdGlvbnMKKyAgICBkZWYgRWxsaXBzaXNNYXNrKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0cmlkZWRTbGljZU9wdGlvbnMKKyAgICBkZWYgTmV3QXhpc01hc2soc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTApKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0cmlkZWRTbGljZU9wdGlvbnMKKyAgICBkZWYgU2hyaW5rQXhpc01hc2soc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTIpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0cmlkZWRTbGljZU9wdGlvbnMKKyAgICBkZWYgT2Zmc2V0KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDE0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuQm9vbEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykpCisgICAgICAgIHJldHVybiBGYWxzZQorCitkZWYgU3RyaWRlZFNsaWNlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoNikKKworZGVmIFN0cmlkZWRTbGljZU9wdGlvbnNBZGRCZWdpbk1hc2soYnVpbGRlciwgYmVnaW5NYXNrKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMCwgYmVnaW5NYXNrLCAwKQorCitkZWYgU3RyaWRlZFNsaWNlT3B0aW9uc0FkZEVuZE1hc2soYnVpbGRlciwgZW5kTWFzayk6CisgICAgYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDEsIGVuZE1hc2ssIDApCisKK2RlZiBTdHJpZGVkU2xpY2VPcHRpb25zQWRkRWxsaXBzaXNNYXNrKGJ1aWxkZXIsIGVsbGlwc2lzTWFzayk6CisgICAgYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDIsIGVsbGlwc2lzTWFzaywgMCkKKworZGVmIFN0cmlkZWRTbGljZU9wdGlvbnNBZGROZXdBeGlzTWFzayhidWlsZGVyLCBuZXdBeGlzTWFzayk6CisgICAgYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDMsIG5ld0F4aXNNYXNrLCAwKQorCitkZWYgU3RyaWRlZFNsaWNlT3B0aW9uc0FkZFNocmlua0F4aXNNYXNrKGJ1aWxkZXIsIHNocmlua0F4aXNNYXNrKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoNCwgc2hyaW5rQXhpc01hc2ssIDApCisKK2RlZiBTdHJpZGVkU2xpY2VPcHRpb25zQWRkT2Zmc2V0KGJ1aWxkZXIsIG9mZnNldCk6CisgICAgYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoNSwgb2Zmc2V0LCAwKQorCitkZWYgU3RyaWRlZFNsaWNlT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgU3RyaWRlZFNsaWNlT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgU3RyaWRlZFNsaWNlT3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuYmVnaW5NYXNrID0gMCAgIyB0eXBlOiBpbnQKKyAgICAgICAgc2VsZi5lbmRNYXNrID0gMCAgIyB0eXBlOiBpbnQKKyAgICAgICAgc2VsZi5lbGxpcHNpc01hc2sgPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLm5ld0F4aXNNYXNrID0gMCAgIyB0eXBlOiBpbnQKKyAgICAgICAgc2VsZi5zaHJpbmtBeGlzTWFzayA9IDAgICMgdHlwZTogaW50CisgICAgICAgIHNlbGYub2Zmc2V0ID0gRmFsc2UgICMgdHlwZTogYm9vbAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICBzdHJpZGVkU2xpY2VPcHRpb25zID0gU3RyaWRlZFNsaWNlT3B0aW9ucygpCisgICAgICAgIHN0cmlkZWRTbGljZU9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihzdHJpZGVkU2xpY2VPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgc3RyaWRlZFNsaWNlT3B0aW9ucyk6CisgICAgICAgIHggPSBTdHJpZGVkU2xpY2VPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhzdHJpZGVkU2xpY2VPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBTdHJpZGVkU2xpY2VPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIHN0cmlkZWRTbGljZU9wdGlvbnMpOgorICAgICAgICBpZiBzdHJpZGVkU2xpY2VPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5iZWdpbk1hc2sgPSBzdHJpZGVkU2xpY2VPcHRpb25zLkJlZ2luTWFzaygpCisgICAgICAgIHNlbGYuZW5kTWFzayA9IHN0cmlkZWRTbGljZU9wdGlvbnMuRW5kTWFzaygpCisgICAgICAgIHNlbGYuZWxsaXBzaXNNYXNrID0gc3RyaWRlZFNsaWNlT3B0aW9ucy5FbGxpcHNpc01hc2soKQorICAgICAgICBzZWxmLm5ld0F4aXNNYXNrID0gc3RyaWRlZFNsaWNlT3B0aW9ucy5OZXdBeGlzTWFzaygpCisgICAgICAgIHNlbGYuc2hyaW5rQXhpc01hc2sgPSBzdHJpZGVkU2xpY2VPcHRpb25zLlNocmlua0F4aXNNYXNrKCkKKyAgICAgICAgc2VsZi5vZmZzZXQgPSBzdHJpZGVkU2xpY2VPcHRpb25zLk9mZnNldCgpCisKKyAgICAjIFN0cmlkZWRTbGljZU9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIFN0cmlkZWRTbGljZU9wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICBTdHJpZGVkU2xpY2VPcHRpb25zQWRkQmVnaW5NYXNrKGJ1aWxkZXIsIHNlbGYuYmVnaW5NYXNrKQorICAgICAgICBTdHJpZGVkU2xpY2VPcHRpb25zQWRkRW5kTWFzayhidWlsZGVyLCBzZWxmLmVuZE1hc2spCisgICAgICAgIFN0cmlkZWRTbGljZU9wdGlvbnNBZGRFbGxpcHNpc01hc2soYnVpbGRlciwgc2VsZi5lbGxpcHNpc01hc2spCisgICAgICAgIFN0cmlkZWRTbGljZU9wdGlvbnNBZGROZXdBeGlzTWFzayhidWlsZGVyLCBzZWxmLm5ld0F4aXNNYXNrKQorICAgICAgICBTdHJpZGVkU2xpY2VPcHRpb25zQWRkU2hyaW5rQXhpc01hc2soYnVpbGRlciwgc2VsZi5zaHJpbmtBeGlzTWFzaykKKyAgICAgICAgU3RyaWRlZFNsaWNlT3B0aW9uc0FkZE9mZnNldChidWlsZGVyLCBzZWxmLm9mZnNldCkKKyAgICAgICAgc3RyaWRlZFNsaWNlT3B0aW9ucyA9IFN0cmlkZWRTbGljZU9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHN0cmlkZWRTbGljZU9wdGlvbnMKKwogCiBjbGFzcyBMb2dTb2Z0bWF4T3B0aW9ucyhvYmplY3QpOgogICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCkBAIC01OTcwLDEyICsxMDM1OSwxMyBAQAogICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKICAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCiAKLWRlZiBMb2dTb2Z0bWF4T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIExvZ1NvZnRtYXhPcHRpb25zU3RhcnQoYnVpbGRlcikKLWRlZiBMb2dTb2Z0bWF4T3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIExvZ1NvZnRtYXhPcHRpb25zRW5kKGJ1aWxkZXIpCitkZWYgTG9nU29mdG1heE9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCisKK2RlZiBMb2dTb2Z0bWF4T3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKIAogY2xhc3MgTG9nU29mdG1heE9wdGlvbnNUKG9iamVjdCk6CiAKQEAgLTU5OTAsNiArMTAzODAsMTEgQEAKICAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihsb2dTb2Z0bWF4T3B0aW9ucykKIAogICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGxvZ1NvZnRtYXhPcHRpb25zKToKICAgICAgICAgeCA9IExvZ1NvZnRtYXhPcHRpb25zVCgpCiAgICAgICAgIHguX1VuUGFjayhsb2dTb2Z0bWF4T3B0aW9ucykKQEAgLTYwMDUsMzMyICsxMDQwMCwxNjIgQEAKICAgICAgICAgTG9nU29mdG1heE9wdGlvbnNTdGFydChidWlsZGVyKQogICAgICAgICBsb2dTb2Z0bWF4T3B0aW9ucyA9IExvZ1NvZnRtYXhPcHRpb25zRW5kKGJ1aWxkZXIpCiAgICAgICAgIHJldHVybiBsb2dTb2Z0bWF4T3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKIAotIyBuYW1lc3BhY2U6IHRmbGl0ZQogCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIExvZ2ljYWxBbmRPcHRpb25zKG9iamVjdCk6CitjbGFzcyBDYXN0T3B0aW9ucyhvYmplY3QpOgogICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCiAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CiAgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IExvZ2ljYWxBbmRPcHRpb25zKCkKKyAgICAgICAgeCA9IENhc3RPcHRpb25zKCkKICAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKICAgICAgICAgcmV0dXJuIHgKIAogICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNMb2dpY2FsQW5kT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgIGRlZiBHZXRSb290QXNDYXN0T3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgogICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKICAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCiAgICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIExvZ2ljYWxBbmRPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICBkZWYgQ2FzdE9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgogICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCiAKLSAgICAjIExvZ2ljYWxBbmRPcHRpb25zCisgICAgIyBDYXN0T3B0aW9ucwogICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKICAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCiAKLWRlZiBMb2dpY2FsQW5kT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIExvZ2ljYWxBbmRPcHRpb25zU3RhcnQoYnVpbGRlcikKLWRlZiBMb2dpY2FsQW5kT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIExvZ2ljYWxBbmRPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgIyBDYXN0T3B0aW9ucworICAgIGRlZiBJbkRhdGFUeXBlKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50OEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKIAotY2xhc3MgTG9naWNhbEFuZE9wdGlvbnNUKG9iamVjdCk6CisgICAgIyBDYXN0T3B0aW9ucworICAgIGRlZiBPdXREYXRhVHlwZShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDhGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCiAKLSAgICAjIExvZ2ljYWxBbmRPcHRpb25zVAorZGVmIENhc3RPcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgyKQorCitkZWYgQ2FzdE9wdGlvbnNBZGRJbkRhdGFUeXBlKGJ1aWxkZXIsIGluRGF0YVR5cGUpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEludDhTbG90KDAsIGluRGF0YVR5cGUsIDApCisKK2RlZiBDYXN0T3B0aW9uc0FkZE91dERhdGFUeXBlKGJ1aWxkZXIsIG91dERhdGFUeXBlKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCgxLCBvdXREYXRhVHlwZSwgMCkKKworZGVmIENhc3RPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBDYXN0T3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgQ2FzdE9wdGlvbnNUCiAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuaW5EYXRhVHlwZSA9IDAgICMgdHlwZTogaW50CisgICAgICAgIHNlbGYub3V0RGF0YVR5cGUgPSAwICAjIHR5cGU6IGludAogCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBsb2dpY2FsQW5kT3B0aW9ucyA9IExvZ2ljYWxBbmRPcHRpb25zKCkKLSAgICAgICAgbG9naWNhbEFuZE9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihsb2dpY2FsQW5kT3B0aW9ucykKKyAgICAgICAgY2FzdE9wdGlvbnMgPSBDYXN0T3B0aW9ucygpCisgICAgICAgIGNhc3RPcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooY2FzdE9wdGlvbnMpCiAKICAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBsb2dpY2FsQW5kT3B0aW9ucyk6Ci0gICAgICAgIHggPSBMb2dpY2FsQW5kT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2sobG9naWNhbEFuZE9wdGlvbnMpCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgY2FzdE9wdGlvbnMpOgorICAgICAgICB4ID0gQ2FzdE9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKGNhc3RPcHRpb25zKQogICAgICAgICByZXR1cm4geAogCi0gICAgIyBMb2dpY2FsQW5kT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBsb2dpY2FsQW5kT3B0aW9ucyk6Ci0gICAgICAgIGlmIGxvZ2ljYWxBbmRPcHRpb25zIGlzIE5vbmU6CisgICAgIyBDYXN0T3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBjYXN0T3B0aW9ucyk6CisgICAgICAgIGlmIGNhc3RPcHRpb25zIGlzIE5vbmU6CiAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5pbkRhdGFUeXBlID0gY2FzdE9wdGlvbnMuSW5EYXRhVHlwZSgpCisgICAgICAgIHNlbGYub3V0RGF0YVR5cGUgPSBjYXN0T3B0aW9ucy5PdXREYXRhVHlwZSgpCiAKLSAgICAjIExvZ2ljYWxBbmRPcHRpb25zVAorICAgICMgQ2FzdE9wdGlvbnNUCiAgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIExvZ2ljYWxBbmRPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgbG9naWNhbEFuZE9wdGlvbnMgPSBMb2dpY2FsQW5kT3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gbG9naWNhbEFuZE9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisgICAgICAgIENhc3RPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgQ2FzdE9wdGlvbnNBZGRJbkRhdGFUeXBlKGJ1aWxkZXIsIHNlbGYuaW5EYXRhVHlwZSkKKyAgICAgICAgQ2FzdE9wdGlvbnNBZGRPdXREYXRhVHlwZShidWlsZGVyLCBzZWxmLm91dERhdGFUeXBlKQorICAgICAgICBjYXN0T3B0aW9ucyA9IENhc3RPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBjYXN0T3B0aW9ucwogCi0jIG5hbWVzcGFjZTogdGZsaXRlCiAKLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgTG9naWNhbE5vdE9wdGlvbnMob2JqZWN0KToKK2NsYXNzIERlcXVhbnRpemVPcHRpb25zKG9iamVjdCk6CiAgICAgX19zbG90c19fID0gWydfdGFiJ10KIAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKICAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gTG9naWNhbE5vdE9wdGlvbnMoKQorICAgICAgICB4ID0gRGVxdWFudGl6ZU9wdGlvbnMoKQogICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQogICAgICAgICByZXR1cm4geAogCiAgICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc0xvZ2ljYWxOb3RPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgZGVmIEdldFJvb3RBc0RlcXVhbnRpemVPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CiAgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgogICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKICAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgTG9naWNhbE5vdE9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgIGRlZiBEZXF1YW50aXplT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CiAgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKIAotICAgICMgTG9naWNhbE5vdE9wdGlvbnMKKyAgICAjIERlcXVhbnRpemVPcHRpb25zCiAgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgogICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKIAotZGVmIExvZ2ljYWxOb3RPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gTG9naWNhbE5vdE9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIExvZ2ljYWxOb3RPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gTG9naWNhbE5vdE9wdGlvbnNFbmQoYnVpbGRlcikKK2RlZiBEZXF1YW50aXplT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKIAotY2xhc3MgTG9naWNhbE5vdE9wdGlvbnNUKG9iamVjdCk6CitkZWYgRGVxdWFudGl6ZU9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKIAotICAgICMgTG9naWNhbE5vdE9wdGlvbnNUCisKKworY2xhc3MgRGVxdWFudGl6ZU9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIERlcXVhbnRpemVPcHRpb25zVAogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgcGFzcwogCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBsb2dpY2FsTm90T3B0aW9ucyA9IExvZ2ljYWxOb3RPcHRpb25zKCkKLSAgICAgICAgbG9naWNhbE5vdE9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihsb2dpY2FsTm90T3B0aW9ucykKKyAgICAgICAgZGVxdWFudGl6ZU9wdGlvbnMgPSBEZXF1YW50aXplT3B0aW9ucygpCisgICAgICAgIGRlcXVhbnRpemVPcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooZGVxdWFudGl6ZU9wdGlvbnMpCiAKICAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBsb2dpY2FsTm90T3B0aW9ucyk6Ci0gICAgICAgIHggPSBMb2dpY2FsTm90T3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2sobG9naWNhbE5vdE9wdGlvbnMpCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgZGVxdWFudGl6ZU9wdGlvbnMpOgorICAgICAgICB4ID0gRGVxdWFudGl6ZU9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKGRlcXVhbnRpemVPcHRpb25zKQogICAgICAgICByZXR1cm4geAogCi0gICAgIyBMb2dpY2FsTm90T3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBsb2dpY2FsTm90T3B0aW9ucyk6Ci0gICAgICAgIGlmIGxvZ2ljYWxOb3RPcHRpb25zIGlzIE5vbmU6CisgICAgIyBEZXF1YW50aXplT3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBkZXF1YW50aXplT3B0aW9ucyk6CisgICAgICAgIGlmIGRlcXVhbnRpemVPcHRpb25zIGlzIE5vbmU6CiAgICAgICAgICAgICByZXR1cm4KIAotICAgICMgTG9naWNhbE5vdE9wdGlvbnNUCisgICAgIyBEZXF1YW50aXplT3B0aW9uc1QKICAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgTG9naWNhbE5vdE9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBsb2dpY2FsTm90T3B0aW9ucyA9IExvZ2ljYWxOb3RPcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBsb2dpY2FsTm90T3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKyAgICAgICAgRGVxdWFudGl6ZU9wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICBkZXF1YW50aXplT3B0aW9ucyA9IERlcXVhbnRpemVPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBkZXF1YW50aXplT3B0aW9ucwogCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgTG9naWNhbE9yT3B0aW9ucyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IExvZ2ljYWxPck9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc0xvZ2ljYWxPck9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBMb2dpY2FsT3JPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBMb2dpY2FsT3JPcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotZGVmIExvZ2ljYWxPck9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgwKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBMb2dpY2FsT3JPcHRpb25zU3RhcnQoYnVpbGRlcikKLWRlZiBMb2dpY2FsT3JPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gTG9naWNhbE9yT3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBMb2dpY2FsT3JPcHRpb25zVChvYmplY3QpOgotCi0gICAgIyBMb2dpY2FsT3JPcHRpb25zVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgcGFzcwotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBsb2dpY2FsT3JPcHRpb25zID0gTG9naWNhbE9yT3B0aW9ucygpCi0gICAgICAgIGxvZ2ljYWxPck9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihsb2dpY2FsT3JPcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgbG9naWNhbE9yT3B0aW9ucyk6Ci0gICAgICAgIHggPSBMb2dpY2FsT3JPcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhsb2dpY2FsT3JPcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBMb2dpY2FsT3JPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIGxvZ2ljYWxPck9wdGlvbnMpOgotICAgICAgICBpZiBsb2dpY2FsT3JPcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLQotICAgICMgTG9naWNhbE9yT3B0aW9uc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgTG9naWNhbE9yT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIGxvZ2ljYWxPck9wdGlvbnMgPSBMb2dpY2FsT3JPcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBsb2dpY2FsT3JPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgTWF0cml4RGlhZ09wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBNYXRyaXhEaWFnT3B0aW9ucygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzTWF0cml4RGlhZ09wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBNYXRyaXhEaWFnT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgTWF0cml4RGlhZ09wdGlvbnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi1kZWYgTWF0cml4RGlhZ09wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgwKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBNYXRyaXhEaWFnT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgTWF0cml4RGlhZ09wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBNYXRyaXhEaWFnT3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBNYXRyaXhEaWFnT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgTWF0cml4RGlhZ09wdGlvbnNUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBwYXNzCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIG1hdHJpeERpYWdPcHRpb25zID0gTWF0cml4RGlhZ09wdGlvbnMoKQotICAgICAgICBtYXRyaXhEaWFnT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKG1hdHJpeERpYWdPcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgbWF0cml4RGlhZ09wdGlvbnMpOgotICAgICAgICB4ID0gTWF0cml4RGlhZ09wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKG1hdHJpeERpYWdPcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBNYXRyaXhEaWFnT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBtYXRyaXhEaWFnT3B0aW9ucyk6Ci0gICAgICAgIGlmIG1hdHJpeERpYWdPcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLQotICAgICMgTWF0cml4RGlhZ09wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIE1hdHJpeERpYWdPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgbWF0cml4RGlhZ09wdGlvbnMgPSBNYXRyaXhEaWFnT3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gbWF0cml4RGlhZ09wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBNYXRyaXhTZXREaWFnT3B0aW9ucyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IE1hdHJpeFNldERpYWdPcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNNYXRyaXhTZXREaWFnT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIE1hdHJpeFNldERpYWdPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBNYXRyaXhTZXREaWFnT3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLWRlZiBNYXRyaXhTZXREaWFnT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIE1hdHJpeFNldERpYWdPcHRpb25zU3RhcnQoYnVpbGRlcikKLWRlZiBNYXRyaXhTZXREaWFnT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIE1hdHJpeFNldERpYWdPcHRpb25zRW5kKGJ1aWxkZXIpCi0KLWNsYXNzIE1hdHJpeFNldERpYWdPcHRpb25zVChvYmplY3QpOgotCi0gICAgIyBNYXRyaXhTZXREaWFnT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgbWF0cml4U2V0RGlhZ09wdGlvbnMgPSBNYXRyaXhTZXREaWFnT3B0aW9ucygpCi0gICAgICAgIG1hdHJpeFNldERpYWdPcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoobWF0cml4U2V0RGlhZ09wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBtYXRyaXhTZXREaWFnT3B0aW9ucyk6Ci0gICAgICAgIHggPSBNYXRyaXhTZXREaWFnT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2sobWF0cml4U2V0RGlhZ09wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIE1hdHJpeFNldERpYWdPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIG1hdHJpeFNldERpYWdPcHRpb25zKToKLSAgICAgICAgaWYgbWF0cml4U2V0RGlhZ09wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgIyBNYXRyaXhTZXREaWFnT3B0aW9uc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgTWF0cml4U2V0RGlhZ09wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBtYXRyaXhTZXREaWFnT3B0aW9ucyA9IE1hdHJpeFNldERpYWdPcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBtYXRyaXhTZXREaWFnT3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCiAKIGNsYXNzIE1heGltdW1NaW5pbXVtT3B0aW9ucyhvYmplY3QpOgogICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCkBAIC02MzU0LDEyICsxMDU3OSwxMyBAQAogICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKICAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCiAKLWRlZiBNYXhpbXVtTWluaW11bU9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgwKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBNYXhpbXVtTWluaW11bU9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIE1heGltdW1NaW5pbXVtT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIE1heGltdW1NaW5pbXVtT3B0aW9uc0VuZChidWlsZGVyKQorZGVmIE1heGltdW1NaW5pbXVtT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIE1heGltdW1NaW5pbXVtT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKIAogY2xhc3MgTWF4aW11bU1pbmltdW1PcHRpb25zVChvYmplY3QpOgogCkBAIC02Mzc0LDYgKzEwNjAwLDExIEBACiAgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoobWF4aW11bU1pbmltdW1PcHRpb25zKQogCiAgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIEluaXRGcm9tT2JqKGNscywgbWF4aW11bU1pbmltdW1PcHRpb25zKToKICAgICAgICAgeCA9IE1heGltdW1NaW5pbXVtT3B0aW9uc1QoKQogICAgICAgICB4Ll9VblBhY2sobWF4aW11bU1pbmltdW1PcHRpb25zKQpAQCAtNjM4OSw2NTUgKzEwNjIwLDQ4NiBAQAogICAgICAgICBNYXhpbXVtTWluaW11bU9wdGlvbnNTdGFydChidWlsZGVyKQogICAgICAgICBtYXhpbXVtTWluaW11bU9wdGlvbnMgPSBNYXhpbXVtTWluaW11bU9wdGlvbnNFbmQoYnVpbGRlcikKICAgICAgICAgcmV0dXJuIG1heGltdW1NaW5pbXVtT3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKIAotIyBuYW1lc3BhY2U6IHRmbGl0ZQogCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIE1ldGFkYXRhKG9iamVjdCk6CitjbGFzcyBUaWxlT3B0aW9ucyhvYmplY3QpOgogICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCiAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CiAgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IE1ldGFkYXRhKCkKKyAgICAgICAgeCA9IFRpbGVPcHRpb25zKCkKICAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKICAgICAgICAgcmV0dXJuIHgKIAogICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNNZXRhZGF0YShjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgIGRlZiBHZXRSb290QXNUaWxlT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgogICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKICAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCiAgICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIE1ldGFkYXRhQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICBkZWYgVGlsZU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgogICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCiAKLSAgICAjIE1ldGFkYXRhCisgICAgIyBUaWxlT3B0aW9ucwogICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKICAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCiAKLSAgICAjIE1ldGFkYXRhCi0gICAgZGVmIE5hbWUoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuU3RyaW5nKG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gTm9uZQorZGVmIFRpbGVPcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgwKQogCi0gICAgIyBNZXRhZGF0YQotICAgIGRlZiBCdWZmZXIoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VaW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiAwCitkZWYgVGlsZU9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKIAotZGVmIE1ldGFkYXRhU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMikKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gTWV0YWRhdGFTdGFydChidWlsZGVyKQotZGVmIE1ldGFkYXRhQWRkTmFtZShidWlsZGVyLCBuYW1lKTogYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMCwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShuYW1lKSwgMCkKLWRlZiBBZGROYW1lKGJ1aWxkZXIsIG5hbWUpOgotICAgIHJldHVybiBNZXRhZGF0YUFkZE5hbWUoYnVpbGRlciwgbmFtZSkKLWRlZiBNZXRhZGF0YUFkZEJ1ZmZlcihidWlsZGVyLCBidWZmZXIpOiBidWlsZGVyLlByZXBlbmRVaW50MzJTbG90KDEsIGJ1ZmZlciwgMCkKLWRlZiBBZGRCdWZmZXIoYnVpbGRlciwgYnVmZmVyKToKLSAgICByZXR1cm4gTWV0YWRhdGFBZGRCdWZmZXIoYnVpbGRlciwgYnVmZmVyKQotZGVmIE1ldGFkYXRhRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gTWV0YWRhdGFFbmQoYnVpbGRlcikKIAotY2xhc3MgTWV0YWRhdGFUKG9iamVjdCk6CiAKLSAgICAjIE1ldGFkYXRhVAorY2xhc3MgVGlsZU9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIFRpbGVPcHRpb25zVAogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi5uYW1lID0gTm9uZSAgIyB0eXBlOiBzdHIKLSAgICAgICAgc2VsZi5idWZmZXIgPSAwICAjIHR5cGU6IGludAorICAgICAgICBwYXNzCiAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGEoKQotICAgICAgICBtZXRhZGF0YS5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKG1ldGFkYXRhKQorICAgICAgICB0aWxlT3B0aW9ucyA9IFRpbGVPcHRpb25zKCkKKyAgICAgICAgdGlsZU9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaih0aWxlT3B0aW9ucykKIAogICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIG1ldGFkYXRhKToKLSAgICAgICAgeCA9IE1ldGFkYXRhVCgpCi0gICAgICAgIHguX1VuUGFjayhtZXRhZGF0YSkKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCB0aWxlT3B0aW9ucyk6CisgICAgICAgIHggPSBUaWxlT3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2sodGlsZU9wdGlvbnMpCiAgICAgICAgIHJldHVybiB4CiAKLSAgICAjIE1ldGFkYXRhVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIG1ldGFkYXRhKToKLSAgICAgICAgaWYgbWV0YWRhdGEgaXMgTm9uZToKKyAgICAjIFRpbGVPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIHRpbGVPcHRpb25zKToKKyAgICAgICAgaWYgdGlsZU9wdGlvbnMgaXMgTm9uZToKICAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLm5hbWUgPSBtZXRhZGF0YS5OYW1lKCkKLSAgICAgICAgc2VsZi5idWZmZXIgPSBtZXRhZGF0YS5CdWZmZXIoKQogCi0gICAgIyBNZXRhZGF0YVQKKyAgICAjIFRpbGVPcHRpb25zVAogICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBpZiBzZWxmLm5hbWUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBuYW1lID0gYnVpbGRlci5DcmVhdGVTdHJpbmcoc2VsZi5uYW1lKQotICAgICAgICBNZXRhZGF0YVN0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIGlmIHNlbGYubmFtZSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIE1ldGFkYXRhQWRkTmFtZShidWlsZGVyLCBuYW1lKQotICAgICAgICBNZXRhZGF0YUFkZEJ1ZmZlcihidWlsZGVyLCBzZWxmLmJ1ZmZlcikKLSAgICAgICAgbWV0YWRhdGEgPSBNZXRhZGF0YUVuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gbWV0YWRhdGEKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisgICAgICAgIFRpbGVPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgdGlsZU9wdGlvbnMgPSBUaWxlT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gdGlsZU9wdGlvbnMKIAotIyBuYW1lc3BhY2U6IHRmbGl0ZQogCi1jbGFzcyBNaXJyb3JQYWRNb2RlKG9iamVjdCk6Ci0gICAgUkVGTEVDVCA9IDAKLSAgICBTWU1NRVRSSUMgPSAxCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgTWlycm9yUGFkT3B0aW9ucyhvYmplY3QpOgorY2xhc3MgQXJnTWF4T3B0aW9ucyhvYmplY3QpOgogICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCiAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CiAgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IE1pcnJvclBhZE9wdGlvbnMoKQorICAgICAgICB4ID0gQXJnTWF4T3B0aW9ucygpCiAgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCiAgICAgICAgIHJldHVybiB4CiAKICAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzTWlycm9yUGFkT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgIGRlZiBHZXRSb290QXNBcmdNYXhPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CiAgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgogICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKICAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgTWlycm9yUGFkT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgZGVmIEFyZ01heE9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgogICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCiAKLSAgICAjIE1pcnJvclBhZE9wdGlvbnMKKyAgICAjIEFyZ01heE9wdGlvbnMKICAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CiAgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQogCi0gICAgIyBNaXJyb3JQYWRPcHRpb25zCi0gICAgZGVmIE1vZGUoc2VsZik6CisgICAgIyBBcmdNYXhPcHRpb25zCisgICAgZGVmIE91dHB1dFR5cGUoc2VsZik6CiAgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCiAgICAgICAgIGlmIG8gIT0gMDoKICAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQogICAgICAgICByZXR1cm4gMAogCi1kZWYgTWlycm9yUGFkT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDEpCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIE1pcnJvclBhZE9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIE1pcnJvclBhZE9wdGlvbnNBZGRNb2RlKGJ1aWxkZXIsIG1vZGUpOiBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCgwLCBtb2RlLCAwKQotZGVmIEFkZE1vZGUoYnVpbGRlciwgbW9kZSk6Ci0gICAgcmV0dXJuIE1pcnJvclBhZE9wdGlvbnNBZGRNb2RlKGJ1aWxkZXIsIG1vZGUpCi1kZWYgTWlycm9yUGFkT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIE1pcnJvclBhZE9wdGlvbnNFbmQoYnVpbGRlcikKK2RlZiBBcmdNYXhPcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgxKQogCi1jbGFzcyBNaXJyb3JQYWRPcHRpb25zVChvYmplY3QpOgorZGVmIEFyZ01heE9wdGlvbnNBZGRPdXRwdXRUeXBlKGJ1aWxkZXIsIG91dHB1dFR5cGUpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEludDhTbG90KDAsIG91dHB1dFR5cGUsIDApCiAKLSAgICAjIE1pcnJvclBhZE9wdGlvbnNUCitkZWYgQXJnTWF4T3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgQXJnTWF4T3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgQXJnTWF4T3B0aW9uc1QKICAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYubW9kZSA9IDAgICMgdHlwZTogaW50CisgICAgICAgIHNlbGYub3V0cHV0VHlwZSA9IDAgICMgdHlwZTogaW50CiAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIG1pcnJvclBhZE9wdGlvbnMgPSBNaXJyb3JQYWRPcHRpb25zKCkKLSAgICAgICAgbWlycm9yUGFkT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKG1pcnJvclBhZE9wdGlvbnMpCisgICAgICAgIGFyZ01heE9wdGlvbnMgPSBBcmdNYXhPcHRpb25zKCkKKyAgICAgICAgYXJnTWF4T3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGFyZ01heE9wdGlvbnMpCiAKICAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBtaXJyb3JQYWRPcHRpb25zKToKLSAgICAgICAgeCA9IE1pcnJvclBhZE9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKG1pcnJvclBhZE9wdGlvbnMpCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgYXJnTWF4T3B0aW9ucyk6CisgICAgICAgIHggPSBBcmdNYXhPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhhcmdNYXhPcHRpb25zKQogICAgICAgICByZXR1cm4geAogCi0gICAgIyBNaXJyb3JQYWRPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIG1pcnJvclBhZE9wdGlvbnMpOgotICAgICAgICBpZiBtaXJyb3JQYWRPcHRpb25zIGlzIE5vbmU6CisgICAgIyBBcmdNYXhPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIGFyZ01heE9wdGlvbnMpOgorICAgICAgICBpZiBhcmdNYXhPcHRpb25zIGlzIE5vbmU6CiAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi5tb2RlID0gbWlycm9yUGFkT3B0aW9ucy5Nb2RlKCkKKyAgICAgICAgc2VsZi5vdXRwdXRUeXBlID0gYXJnTWF4T3B0aW9ucy5PdXRwdXRUeXBlKCkKIAotICAgICMgTWlycm9yUGFkT3B0aW9uc1QKKyAgICAjIEFyZ01heE9wdGlvbnNUCiAgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIE1pcnJvclBhZE9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBNaXJyb3JQYWRPcHRpb25zQWRkTW9kZShidWlsZGVyLCBzZWxmLm1vZGUpCi0gICAgICAgIG1pcnJvclBhZE9wdGlvbnMgPSBNaXJyb3JQYWRPcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBtaXJyb3JQYWRPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorICAgICAgICBBcmdNYXhPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgQXJnTWF4T3B0aW9uc0FkZE91dHB1dFR5cGUoYnVpbGRlciwgc2VsZi5vdXRwdXRUeXBlKQorICAgICAgICBhcmdNYXhPcHRpb25zID0gQXJnTWF4T3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gYXJnTWF4T3B0aW9ucwogCi0jIG5hbWVzcGFjZTogdGZsaXRlCiAKLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgTW9kZWwob2JqZWN0KToKK2NsYXNzIEFyZ01pbk9wdGlvbnMob2JqZWN0KToKICAgICBfX3Nsb3RzX18gPSBbJ190YWInXQogCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgogICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBNb2RlbCgpCisgICAgICAgIHggPSBBcmdNaW5PcHRpb25zKCkKICAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKICAgICAgICAgcmV0dXJuIHgKIAogICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNNb2RlbChjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgIGRlZiBHZXRSb290QXNBcmdNaW5PcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CiAgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgogICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKICAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgTW9kZWxCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgIGRlZiBBcmdNaW5PcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKICAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQogCi0gICAgIyBNb2RlbAorICAgICMgQXJnTWluT3B0aW9ucwogICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKICAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCiAKLSAgICAjIE1vZGVsCi0gICAgZGVmIFZlcnNpb24oc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VaW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIE1vZGVsCi0gICAgZGVmIE9wZXJhdG9yQ29kZXMoc2VsZiwgaik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHggPSBzZWxmLl90YWIuVmVjdG9yKG8pCi0gICAgICAgICAgICB4ICs9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaikgKiA0Ci0gICAgICAgICAgICB4ID0gc2VsZi5fdGFiLkluZGlyZWN0KHgpCi0gICAgICAgICAgICBvYmogPSBPcGVyYXRvckNvZGUoKQotICAgICAgICAgICAgb2JqLkluaXQoc2VsZi5fdGFiLkJ5dGVzLCB4KQotICAgICAgICAgICAgcmV0dXJuIG9iagotICAgICAgICByZXR1cm4gTm9uZQotCi0gICAgIyBNb2RlbAotICAgIGRlZiBPcGVyYXRvckNvZGVzTGVuZ3RoKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlZlY3RvckxlbihvKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBNb2RlbAotICAgIGRlZiBPcGVyYXRvckNvZGVzSXNOb25lKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQotICAgICAgICByZXR1cm4gbyA9PSAwCi0KLSAgICAjIE1vZGVsCi0gICAgZGVmIFN1YmdyYXBocyhzZWxmLCBqKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg4KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgeCA9IHNlbGYuX3RhYi5WZWN0b3IobykKLSAgICAgICAgICAgIHggKz0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShqKSAqIDQKLSAgICAgICAgICAgIHggPSBzZWxmLl90YWIuSW5kaXJlY3QoeCkKLSAgICAgICAgICAgIG9iaiA9IFN1YkdyYXBoKCkKLSAgICAgICAgICAgIG9iai5Jbml0KHNlbGYuX3RhYi5CeXRlcywgeCkKLSAgICAgICAgICAgIHJldHVybiBvYmoKLSAgICAgICAgcmV0dXJuIE5vbmUKLQotICAgICMgTW9kZWwKLSAgICBkZWYgU3ViZ3JhcGhzTGVuZ3RoKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlZlY3RvckxlbihvKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBNb2RlbAotICAgIGRlZiBTdWJncmFwaHNJc05vbmUoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCi0gICAgICAgIHJldHVybiBvID09IDAKLQotICAgICMgTW9kZWwKLSAgICBkZWYgRGVzY3JpcHRpb24oc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTApKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlN0cmluZyhvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIE5vbmUKLQotICAgICMgTW9kZWwKLSAgICBkZWYgQnVmZmVycyhzZWxmLCBqKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMikpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHggPSBzZWxmLl90YWIuVmVjdG9yKG8pCi0gICAgICAgICAgICB4ICs9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaikgKiA0Ci0gICAgICAgICAgICB4ID0gc2VsZi5fdGFiLkluZGlyZWN0KHgpCi0gICAgICAgICAgICBvYmogPSBCdWZmZXIoKQotICAgICAgICAgICAgb2JqLkluaXQoc2VsZi5fdGFiLkJ5dGVzLCB4KQotICAgICAgICAgICAgcmV0dXJuIG9iagotICAgICAgICByZXR1cm4gTm9uZQotCi0gICAgIyBNb2RlbAotICAgIGRlZiBCdWZmZXJzTGVuZ3RoKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEyKSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgTW9kZWwKLSAgICBkZWYgQnVmZmVyc0lzTm9uZShzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMikpCi0gICAgICAgIHJldHVybiBvID09IDAKLQotICAgICMgTW9kZWwKLSAgICBkZWYgTWV0YWRhdGFCdWZmZXIoc2VsZiwgaik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTQpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICBhID0gc2VsZi5fdGFiLlZlY3RvcihvKQotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIGEgKyBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGogKiA0KSkKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgTW9kZWwKLSAgICBkZWYgTWV0YWRhdGFCdWZmZXJBc051bXB5KHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDE0KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXRWZWN0b3JBc051bXB5KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBNb2RlbAotICAgIGRlZiBNZXRhZGF0YUJ1ZmZlckxlbmd0aChzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuVmVjdG9yTGVuKG8pCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIE1vZGVsCi0gICAgZGVmIE1ldGFkYXRhQnVmZmVySXNOb25lKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDE0KSkKLSAgICAgICAgcmV0dXJuIG8gPT0gMAotCi0gICAgIyBNb2RlbAotICAgIGRlZiBNZXRhZGF0YShzZWxmLCBqKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxNikpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHggPSBzZWxmLl90YWIuVmVjdG9yKG8pCi0gICAgICAgICAgICB4ICs9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaikgKiA0Ci0gICAgICAgICAgICB4ID0gc2VsZi5fdGFiLkluZGlyZWN0KHgpCi0gICAgICAgICAgICBvYmogPSBNZXRhZGF0YSgpCi0gICAgICAgICAgICBvYmouSW5pdChzZWxmLl90YWIuQnl0ZXMsIHgpCi0gICAgICAgICAgICByZXR1cm4gb2JqCi0gICAgICAgIHJldHVybiBOb25lCi0KLSAgICAjIE1vZGVsCi0gICAgZGVmIE1ldGFkYXRhTGVuZ3RoKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDE2KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgTW9kZWwKLSAgICBkZWYgTWV0YWRhdGFJc05vbmUoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTYpKQotICAgICAgICByZXR1cm4gbyA9PSAwCi0KLSAgICAjIE1vZGVsCi0gICAgZGVmIFNpZ25hdHVyZURlZnMoc2VsZiwgaik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTgpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICB4ID0gc2VsZi5fdGFiLlZlY3RvcihvKQotICAgICAgICAgICAgeCArPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGopICogNAotICAgICAgICAgICAgeCA9IHNlbGYuX3RhYi5JbmRpcmVjdCh4KQotICAgICAgICAgICAgb2JqID0gU2lnbmF0dXJlRGVmKCkKLSAgICAgICAgICAgIG9iai5Jbml0KHNlbGYuX3RhYi5CeXRlcywgeCkKLSAgICAgICAgICAgIHJldHVybiBvYmoKLSAgICAgICAgcmV0dXJuIE5vbmUKLQotICAgICMgTW9kZWwKLSAgICBkZWYgU2lnbmF0dXJlRGVmc0xlbmd0aChzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxOCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuVmVjdG9yTGVuKG8pCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIE1vZGVsCi0gICAgZGVmIFNpZ25hdHVyZURlZnNJc05vbmUoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTgpKQotICAgICAgICByZXR1cm4gbyA9PSAwCi0KLWRlZiBNb2RlbFN0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDgpCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIE1vZGVsU3RhcnQoYnVpbGRlcikKLWRlZiBNb2RlbEFkZFZlcnNpb24oYnVpbGRlciwgdmVyc2lvbik6IGJ1aWxkZXIuUHJlcGVuZFVpbnQzMlNsb3QoMCwgdmVyc2lvbiwgMCkKLWRlZiBBZGRWZXJzaW9uKGJ1aWxkZXIsIHZlcnNpb24pOgotICAgIHJldHVybiBNb2RlbEFkZFZlcnNpb24oYnVpbGRlciwgdmVyc2lvbikKLWRlZiBNb2RlbEFkZE9wZXJhdG9yQ29kZXMoYnVpbGRlciwgb3BlcmF0b3JDb2Rlcyk6IGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDEsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUob3BlcmF0b3JDb2RlcyksIDApCi1kZWYgQWRkT3BlcmF0b3JDb2RlcyhidWlsZGVyLCBvcGVyYXRvckNvZGVzKToKLSAgICByZXR1cm4gTW9kZWxBZGRPcGVyYXRvckNvZGVzKGJ1aWxkZXIsIG9wZXJhdG9yQ29kZXMpCi1kZWYgTW9kZWxTdGFydE9wZXJhdG9yQ29kZXNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOiByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCkKLWRlZiBTdGFydE9wZXJhdG9yQ29kZXNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgotICAgIHJldHVybiBNb2RlbFN0YXJ0T3BlcmF0b3JDb2Rlc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykKLWRlZiBNb2RlbEFkZFN1YmdyYXBocyhidWlsZGVyLCBzdWJncmFwaHMpOiBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgyLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHN1YmdyYXBocyksIDApCi1kZWYgQWRkU3ViZ3JhcGhzKGJ1aWxkZXIsIHN1YmdyYXBocyk6Ci0gICAgcmV0dXJuIE1vZGVsQWRkU3ViZ3JhcGhzKGJ1aWxkZXIsIHN1YmdyYXBocykKLWRlZiBNb2RlbFN0YXJ0U3ViZ3JhcGhzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKTogcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpCi1kZWYgU3RhcnRTdWJncmFwaHNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgotICAgIHJldHVybiBNb2RlbFN0YXJ0U3ViZ3JhcGhzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKQotZGVmIE1vZGVsQWRkRGVzY3JpcHRpb24oYnVpbGRlciwgZGVzY3JpcHRpb24pOiBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgzLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGRlc2NyaXB0aW9uKSwgMCkKLWRlZiBBZGREZXNjcmlwdGlvbihidWlsZGVyLCBkZXNjcmlwdGlvbik6Ci0gICAgcmV0dXJuIE1vZGVsQWRkRGVzY3JpcHRpb24oYnVpbGRlciwgZGVzY3JpcHRpb24pCi1kZWYgTW9kZWxBZGRCdWZmZXJzKGJ1aWxkZXIsIGJ1ZmZlcnMpOiBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCg0LCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGJ1ZmZlcnMpLCAwKQotZGVmIEFkZEJ1ZmZlcnMoYnVpbGRlciwgYnVmZmVycyk6Ci0gICAgcmV0dXJuIE1vZGVsQWRkQnVmZmVycyhidWlsZGVyLCBidWZmZXJzKQotZGVmIE1vZGVsU3RhcnRCdWZmZXJzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKTogcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpCi1kZWYgU3RhcnRCdWZmZXJzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKLSAgICByZXR1cm4gTW9kZWxTdGFydEJ1ZmZlcnNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpCi1kZWYgTW9kZWxBZGRNZXRhZGF0YUJ1ZmZlcihidWlsZGVyLCBtZXRhZGF0YUJ1ZmZlcik6IGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDUsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUobWV0YWRhdGFCdWZmZXIpLCAwKQotZGVmIEFkZE1ldGFkYXRhQnVmZmVyKGJ1aWxkZXIsIG1ldGFkYXRhQnVmZmVyKToKLSAgICByZXR1cm4gTW9kZWxBZGRNZXRhZGF0YUJ1ZmZlcihidWlsZGVyLCBtZXRhZGF0YUJ1ZmZlcikKLWRlZiBNb2RlbFN0YXJ0TWV0YWRhdGFCdWZmZXJWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOiByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCkKLWRlZiBTdGFydE1ldGFkYXRhQnVmZmVyVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKLSAgICByZXR1cm4gTW9kZWxTdGFydE1ldGFkYXRhQnVmZmVyVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKQotZGVmIE1vZGVsQWRkTWV0YWRhdGEoYnVpbGRlciwgbWV0YWRhdGEpOiBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCg2LCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKG1ldGFkYXRhKSwgMCkKLWRlZiBBZGRNZXRhZGF0YShidWlsZGVyLCBtZXRhZGF0YSk6Ci0gICAgcmV0dXJuIE1vZGVsQWRkTWV0YWRhdGEoYnVpbGRlciwgbWV0YWRhdGEpCi1kZWYgTW9kZWxTdGFydE1ldGFkYXRhVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKTogcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpCi1kZWYgU3RhcnRNZXRhZGF0YVZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6Ci0gICAgcmV0dXJuIE1vZGVsU3RhcnRNZXRhZGF0YVZlY3RvcihidWlsZGVyLCBudW1FbGVtcykKLWRlZiBNb2RlbEFkZFNpZ25hdHVyZURlZnMoYnVpbGRlciwgc2lnbmF0dXJlRGVmcyk6IGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDcsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2lnbmF0dXJlRGVmcyksIDApCi1kZWYgQWRkU2lnbmF0dXJlRGVmcyhidWlsZGVyLCBzaWduYXR1cmVEZWZzKToKLSAgICByZXR1cm4gTW9kZWxBZGRTaWduYXR1cmVEZWZzKGJ1aWxkZXIsIHNpZ25hdHVyZURlZnMpCi1kZWYgTW9kZWxTdGFydFNpZ25hdHVyZURlZnNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOiByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCkKLWRlZiBTdGFydFNpZ25hdHVyZURlZnNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgotICAgIHJldHVybiBNb2RlbFN0YXJ0U2lnbmF0dXJlRGVmc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykKLWRlZiBNb2RlbEVuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIE1vZGVsRW5kKGJ1aWxkZXIpCi10cnk6Ci0gICAgZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QKLWV4Y2VwdDoKLSAgICBwYXNzCi0KLWNsYXNzIE1vZGVsVChvYmplY3QpOgotCi0gICAgIyBNb2RlbFQKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYudmVyc2lvbiA9IDAgICMgdHlwZTogaW50Ci0gICAgICAgIHNlbGYub3BlcmF0b3JDb2RlcyA9IE5vbmUgICMgdHlwZTogTGlzdFtPcGVyYXRvckNvZGVUXQotICAgICAgICBzZWxmLnN1YmdyYXBocyA9IE5vbmUgICMgdHlwZTogTGlzdFtTdWJHcmFwaFRdCi0gICAgICAgIHNlbGYuZGVzY3JpcHRpb24gPSBOb25lICAjIHR5cGU6IHN0cgotICAgICAgICBzZWxmLmJ1ZmZlcnMgPSBOb25lICAjIHR5cGU6IExpc3RbQnVmZmVyVF0KLSAgICAgICAgc2VsZi5tZXRhZGF0YUJ1ZmZlciA9IE5vbmUgICMgdHlwZTogTGlzdFtpbnRdCi0gICAgICAgIHNlbGYubWV0YWRhdGEgPSBOb25lICAjIHR5cGU6IExpc3RbTWV0YWRhdGFUXQotICAgICAgICBzZWxmLnNpZ25hdHVyZURlZnMgPSBOb25lICAjIHR5cGU6IExpc3RbU2lnbmF0dXJlRGVmVF0KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgbW9kZWwgPSBNb2RlbCgpCi0gICAgICAgIG1vZGVsLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoobW9kZWwpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBtb2RlbCk6Ci0gICAgICAgIHggPSBNb2RlbFQoKQotICAgICAgICB4Ll9VblBhY2sobW9kZWwpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIE1vZGVsVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIG1vZGVsKToKLSAgICAgICAgaWYgbW9kZWwgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLnZlcnNpb24gPSBtb2RlbC5WZXJzaW9uKCkKLSAgICAgICAgaWYgbm90IG1vZGVsLk9wZXJhdG9yQ29kZXNJc05vbmUoKToKLSAgICAgICAgICAgIHNlbGYub3BlcmF0b3JDb2RlcyA9IFtdCi0gICAgICAgICAgICBmb3IgaSBpbiByYW5nZShtb2RlbC5PcGVyYXRvckNvZGVzTGVuZ3RoKCkpOgotICAgICAgICAgICAgICAgIGlmIG1vZGVsLk9wZXJhdG9yQ29kZXMoaSkgaXMgTm9uZToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5vcGVyYXRvckNvZGVzLmFwcGVuZChOb25lKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yQ29kZV8gPSBPcGVyYXRvckNvZGVULkluaXRGcm9tT2JqKG1vZGVsLk9wZXJhdG9yQ29kZXMoaSkpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYub3BlcmF0b3JDb2Rlcy5hcHBlbmQob3BlcmF0b3JDb2RlXykKLSAgICAgICAgaWYgbm90IG1vZGVsLlN1YmdyYXBoc0lzTm9uZSgpOgotICAgICAgICAgICAgc2VsZi5zdWJncmFwaHMgPSBbXQotICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobW9kZWwuU3ViZ3JhcGhzTGVuZ3RoKCkpOgotICAgICAgICAgICAgICAgIGlmIG1vZGVsLlN1YmdyYXBocyhpKSBpcyBOb25lOgotICAgICAgICAgICAgICAgICAgICBzZWxmLnN1YmdyYXBocy5hcHBlbmQoTm9uZSkKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBzdWJHcmFwaF8gPSBTdWJHcmFwaFQuSW5pdEZyb21PYmoobW9kZWwuU3ViZ3JhcGhzKGkpKQotICAgICAgICAgICAgICAgICAgICBzZWxmLnN1YmdyYXBocy5hcHBlbmQoc3ViR3JhcGhfKQotICAgICAgICBzZWxmLmRlc2NyaXB0aW9uID0gbW9kZWwuRGVzY3JpcHRpb24oKQotICAgICAgICBpZiBub3QgbW9kZWwuQnVmZmVyc0lzTm9uZSgpOgotICAgICAgICAgICAgc2VsZi5idWZmZXJzID0gW10KLSAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKG1vZGVsLkJ1ZmZlcnNMZW5ndGgoKSk6Ci0gICAgICAgICAgICAgICAgaWYgbW9kZWwuQnVmZmVycyhpKSBpcyBOb25lOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmJ1ZmZlcnMuYXBwZW5kKE5vbmUpCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyXyA9IEJ1ZmZlclQuSW5pdEZyb21PYmoobW9kZWwuQnVmZmVycyhpKSkKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5idWZmZXJzLmFwcGVuZChidWZmZXJfKQotICAgICAgICBpZiBub3QgbW9kZWwuTWV0YWRhdGFCdWZmZXJJc05vbmUoKToKLSAgICAgICAgICAgIGlmIG5wIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgc2VsZi5tZXRhZGF0YUJ1ZmZlciA9IFtdCi0gICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobW9kZWwuTWV0YWRhdGFCdWZmZXJMZW5ndGgoKSk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYubWV0YWRhdGFCdWZmZXIuYXBwZW5kKG1vZGVsLk1ldGFkYXRhQnVmZmVyKGkpKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLm1ldGFkYXRhQnVmZmVyID0gbW9kZWwuTWV0YWRhdGFCdWZmZXJBc051bXB5KCkKLSAgICAgICAgaWYgbm90IG1vZGVsLk1ldGFkYXRhSXNOb25lKCk6Ci0gICAgICAgICAgICBzZWxmLm1ldGFkYXRhID0gW10KLSAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKG1vZGVsLk1ldGFkYXRhTGVuZ3RoKCkpOgotICAgICAgICAgICAgICAgIGlmIG1vZGVsLk1ldGFkYXRhKGkpIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYubWV0YWRhdGEuYXBwZW5kKE5vbmUpCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFfID0gTWV0YWRhdGFULkluaXRGcm9tT2JqKG1vZGVsLk1ldGFkYXRhKGkpKQotICAgICAgICAgICAgICAgICAgICBzZWxmLm1ldGFkYXRhLmFwcGVuZChtZXRhZGF0YV8pCi0gICAgICAgIGlmIG5vdCBtb2RlbC5TaWduYXR1cmVEZWZzSXNOb25lKCk6Ci0gICAgICAgICAgICBzZWxmLnNpZ25hdHVyZURlZnMgPSBbXQotICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobW9kZWwuU2lnbmF0dXJlRGVmc0xlbmd0aCgpKToKLSAgICAgICAgICAgICAgICBpZiBtb2RlbC5TaWduYXR1cmVEZWZzKGkpIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuc2lnbmF0dXJlRGVmcy5hcHBlbmQoTm9uZSkKLSAgICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVEZWZfID0gU2lnbmF0dXJlRGVmVC5Jbml0RnJvbU9iaihtb2RlbC5TaWduYXR1cmVEZWZzKGkpKQotICAgICAgICAgICAgICAgICAgICBzZWxmLnNpZ25hdHVyZURlZnMuYXBwZW5kKHNpZ25hdHVyZURlZl8pCi0KLSAgICAjIE1vZGVsVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBpZiBzZWxmLm9wZXJhdG9yQ29kZXMgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBvcGVyYXRvckNvZGVzbGlzdCA9IFtdCi0gICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5vcGVyYXRvckNvZGVzKSk6Ci0gICAgICAgICAgICAgICAgb3BlcmF0b3JDb2Rlc2xpc3QuYXBwZW5kKHNlbGYub3BlcmF0b3JDb2Rlc1tpXS5QYWNrKGJ1aWxkZXIpKQotICAgICAgICAgICAgTW9kZWxTdGFydE9wZXJhdG9yQ29kZXNWZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYub3BlcmF0b3JDb2RlcykpCi0gICAgICAgICAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShsZW4oc2VsZi5vcGVyYXRvckNvZGVzKSkpOgotICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmUob3BlcmF0b3JDb2Rlc2xpc3RbaV0pCi0gICAgICAgICAgICBvcGVyYXRvckNvZGVzID0gYnVpbGRlci5FbmRWZWN0b3IoKQotICAgICAgICBpZiBzZWxmLnN1YmdyYXBocyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHN1YmdyYXBoc2xpc3QgPSBbXQotICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuc3ViZ3JhcGhzKSk6Ci0gICAgICAgICAgICAgICAgc3ViZ3JhcGhzbGlzdC5hcHBlbmQoc2VsZi5zdWJncmFwaHNbaV0uUGFjayhidWlsZGVyKSkKLSAgICAgICAgICAgIE1vZGVsU3RhcnRTdWJncmFwaHNWZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYuc3ViZ3JhcGhzKSkKLSAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLnN1YmdyYXBocykpKToKLSAgICAgICAgICAgICAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlKHN1YmdyYXBoc2xpc3RbaV0pCi0gICAgICAgICAgICBzdWJncmFwaHMgPSBidWlsZGVyLkVuZFZlY3RvcigpCi0gICAgICAgIGlmIHNlbGYuZGVzY3JpcHRpb24gaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBkZXNjcmlwdGlvbiA9IGJ1aWxkZXIuQ3JlYXRlU3RyaW5nKHNlbGYuZGVzY3JpcHRpb24pCi0gICAgICAgIGlmIHNlbGYuYnVmZmVycyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIGJ1ZmZlcnNsaXN0ID0gW10KLSAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLmJ1ZmZlcnMpKToKLSAgICAgICAgICAgICAgICBidWZmZXJzbGlzdC5hcHBlbmQoc2VsZi5idWZmZXJzW2ldLlBhY2soYnVpbGRlcikpCi0gICAgICAgICAgICBNb2RlbFN0YXJ0QnVmZmVyc1ZlY3RvcihidWlsZGVyLCBsZW4oc2VsZi5idWZmZXJzKSkKLSAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLmJ1ZmZlcnMpKSk6Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZShidWZmZXJzbGlzdFtpXSkKLSAgICAgICAgICAgIGJ1ZmZlcnMgPSBidWlsZGVyLkVuZFZlY3RvcigpCi0gICAgICAgIGlmIHNlbGYubWV0YWRhdGFCdWZmZXIgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBpZiBucCBpcyBub3QgTm9uZSBhbmQgdHlwZShzZWxmLm1ldGFkYXRhQnVmZmVyKSBpcyBucC5uZGFycmF5OgotICAgICAgICAgICAgICAgIG1ldGFkYXRhQnVmZmVyID0gYnVpbGRlci5DcmVhdGVOdW1weVZlY3RvcihzZWxmLm1ldGFkYXRhQnVmZmVyKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBNb2RlbFN0YXJ0TWV0YWRhdGFCdWZmZXJWZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYubWV0YWRhdGFCdWZmZXIpKQotICAgICAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLm1ldGFkYXRhQnVmZmVyKSkpOgotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLlByZXBlbmRJbnQzMihzZWxmLm1ldGFkYXRhQnVmZmVyW2ldKQotICAgICAgICAgICAgICAgIG1ldGFkYXRhQnVmZmVyID0gYnVpbGRlci5FbmRWZWN0b3IoKQotICAgICAgICBpZiBzZWxmLm1ldGFkYXRhIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgbWV0YWRhdGFsaXN0ID0gW10KLSAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLm1ldGFkYXRhKSk6Ci0gICAgICAgICAgICAgICAgbWV0YWRhdGFsaXN0LmFwcGVuZChzZWxmLm1ldGFkYXRhW2ldLlBhY2soYnVpbGRlcikpCi0gICAgICAgICAgICBNb2RlbFN0YXJ0TWV0YWRhdGFWZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYubWV0YWRhdGEpKQotICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYubWV0YWRhdGEpKSk6Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZShtZXRhZGF0YWxpc3RbaV0pCi0gICAgICAgICAgICBtZXRhZGF0YSA9IGJ1aWxkZXIuRW5kVmVjdG9yKCkKLSAgICAgICAgaWYgc2VsZi5zaWduYXR1cmVEZWZzIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgc2lnbmF0dXJlRGVmc2xpc3QgPSBbXQotICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuc2lnbmF0dXJlRGVmcykpOgotICAgICAgICAgICAgICAgIHNpZ25hdHVyZURlZnNsaXN0LmFwcGVuZChzZWxmLnNpZ25hdHVyZURlZnNbaV0uUGFjayhidWlsZGVyKSkKLSAgICAgICAgICAgIE1vZGVsU3RhcnRTaWduYXR1cmVEZWZzVmVjdG9yKGJ1aWxkZXIsIGxlbihzZWxmLnNpZ25hdHVyZURlZnMpKQotICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYuc2lnbmF0dXJlRGVmcykpKToKLSAgICAgICAgICAgICAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlKHNpZ25hdHVyZURlZnNsaXN0W2ldKQotICAgICAgICAgICAgc2lnbmF0dXJlRGVmcyA9IGJ1aWxkZXIuRW5kVmVjdG9yKCkKLSAgICAgICAgTW9kZWxTdGFydChidWlsZGVyKQotICAgICAgICBNb2RlbEFkZFZlcnNpb24oYnVpbGRlciwgc2VsZi52ZXJzaW9uKQotICAgICAgICBpZiBzZWxmLm9wZXJhdG9yQ29kZXMgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBNb2RlbEFkZE9wZXJhdG9yQ29kZXMoYnVpbGRlciwgb3BlcmF0b3JDb2RlcykKLSAgICAgICAgaWYgc2VsZi5zdWJncmFwaHMgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBNb2RlbEFkZFN1YmdyYXBocyhidWlsZGVyLCBzdWJncmFwaHMpCi0gICAgICAgIGlmIHNlbGYuZGVzY3JpcHRpb24gaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBNb2RlbEFkZERlc2NyaXB0aW9uKGJ1aWxkZXIsIGRlc2NyaXB0aW9uKQotICAgICAgICBpZiBzZWxmLmJ1ZmZlcnMgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBNb2RlbEFkZEJ1ZmZlcnMoYnVpbGRlciwgYnVmZmVycykKLSAgICAgICAgaWYgc2VsZi5tZXRhZGF0YUJ1ZmZlciBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIE1vZGVsQWRkTWV0YWRhdGFCdWZmZXIoYnVpbGRlciwgbWV0YWRhdGFCdWZmZXIpCi0gICAgICAgIGlmIHNlbGYubWV0YWRhdGEgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBNb2RlbEFkZE1ldGFkYXRhKGJ1aWxkZXIsIG1ldGFkYXRhKQotICAgICAgICBpZiBzZWxmLnNpZ25hdHVyZURlZnMgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBNb2RlbEFkZFNpZ25hdHVyZURlZnMoYnVpbGRlciwgc2lnbmF0dXJlRGVmcykKLSAgICAgICAgbW9kZWwgPSBNb2RlbEVuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gbW9kZWwKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBNdWxPcHRpb25zKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gTXVsT3B0aW9ucygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzTXVsT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIE11bE9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIE11bE9wdGlvbnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi0gICAgIyBNdWxPcHRpb25zCi0gICAgZGVmIEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKHNlbGYpOgorICAgICMgQXJnTWluT3B0aW9ucworICAgIGRlZiBPdXRwdXRUeXBlKHNlbGYpOgogICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQogICAgICAgICBpZiBvICE9IDA6CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50OEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKICAgICAgICAgcmV0dXJuIDAKIAotZGVmIE11bE9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgxKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBNdWxPcHRpb25zU3RhcnQoYnVpbGRlcikKLWRlZiBNdWxPcHRpb25zQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pOiBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCgwLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbiwgMCkKLWRlZiBBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbik6Ci0gICAgcmV0dXJuIE11bE9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbikKLWRlZiBNdWxPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gTXVsT3B0aW9uc0VuZChidWlsZGVyKQorZGVmIEFyZ01pbk9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDEpCiAKLWNsYXNzIE11bE9wdGlvbnNUKG9iamVjdCk6CitkZWYgQXJnTWluT3B0aW9uc0FkZE91dHB1dFR5cGUoYnVpbGRlciwgb3V0cHV0VHlwZSk6CisgICAgYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoMCwgb3V0cHV0VHlwZSwgMCkKIAotICAgICMgTXVsT3B0aW9uc1QKK2RlZiBBcmdNaW5PcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBBcmdNaW5PcHRpb25zVChvYmplY3QpOgorCisgICAgIyBBcmdNaW5PcHRpb25zVAogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbiA9IDAgICMgdHlwZTogaW50CisgICAgICAgIHNlbGYub3V0cHV0VHlwZSA9IDAgICMgdHlwZTogaW50CiAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIG11bE9wdGlvbnMgPSBNdWxPcHRpb25zKCkKLSAgICAgICAgbXVsT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKG11bE9wdGlvbnMpCisgICAgICAgIGFyZ01pbk9wdGlvbnMgPSBBcmdNaW5PcHRpb25zKCkKKyAgICAgICAgYXJnTWluT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGFyZ01pbk9wdGlvbnMpCiAKICAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBtdWxPcHRpb25zKToKLSAgICAgICAgeCA9IE11bE9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKG11bE9wdGlvbnMpCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgYXJnTWluT3B0aW9ucyk6CisgICAgICAgIHggPSBBcmdNaW5PcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhhcmdNaW5PcHRpb25zKQogICAgICAgICByZXR1cm4geAogCi0gICAgIyBNdWxPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIG11bE9wdGlvbnMpOgotICAgICAgICBpZiBtdWxPcHRpb25zIGlzIE5vbmU6CisgICAgIyBBcmdNaW5PcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIGFyZ01pbk9wdGlvbnMpOgorICAgICAgICBpZiBhcmdNaW5PcHRpb25zIGlzIE5vbmU6CiAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbiA9IG11bE9wdGlvbnMuRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oKQorICAgICAgICBzZWxmLm91dHB1dFR5cGUgPSBhcmdNaW5PcHRpb25zLk91dHB1dFR5cGUoKQogCi0gICAgIyBNdWxPcHRpb25zVAorICAgICMgQXJnTWluT3B0aW9uc1QKICAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgTXVsT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIE11bE9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBzZWxmLmZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKQotICAgICAgICBtdWxPcHRpb25zID0gTXVsT3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gbXVsT3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKKyAgICAgICAgQXJnTWluT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIEFyZ01pbk9wdGlvbnNBZGRPdXRwdXRUeXBlKGJ1aWxkZXIsIHNlbGYub3V0cHV0VHlwZSkKKyAgICAgICAgYXJnTWluT3B0aW9ucyA9IEFyZ01pbk9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIGFyZ01pbk9wdGlvbnMKIAotIyBuYW1lc3BhY2U6IHRmbGl0ZQogCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCitjbGFzcyBHcmVhdGVyT3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IEdyZWF0ZXJPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNHcmVhdGVyT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdyZWF0ZXJPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBHcmVhdGVyT3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKK2RlZiBHcmVhdGVyT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIEdyZWF0ZXJPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBHcmVhdGVyT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgR3JlYXRlck9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIGdyZWF0ZXJPcHRpb25zID0gR3JlYXRlck9wdGlvbnMoKQorICAgICAgICBncmVhdGVyT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGdyZWF0ZXJPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgZ3JlYXRlck9wdGlvbnMpOgorICAgICAgICB4ID0gR3JlYXRlck9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKGdyZWF0ZXJPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBHcmVhdGVyT3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBncmVhdGVyT3B0aW9ucyk6CisgICAgICAgIGlmIGdyZWF0ZXJPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICMgR3JlYXRlck9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIEdyZWF0ZXJPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgZ3JlYXRlck9wdGlvbnMgPSBHcmVhdGVyT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gZ3JlYXRlck9wdGlvbnMKKworCitjbGFzcyBHcmVhdGVyRXF1YWxPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gR3JlYXRlckVxdWFsT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzR3JlYXRlckVxdWFsT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdyZWF0ZXJFcXVhbE9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIEdyZWF0ZXJFcXVhbE9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCitkZWYgR3JlYXRlckVxdWFsT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIEdyZWF0ZXJFcXVhbE9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIEdyZWF0ZXJFcXVhbE9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIEdyZWF0ZXJFcXVhbE9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIGdyZWF0ZXJFcXVhbE9wdGlvbnMgPSBHcmVhdGVyRXF1YWxPcHRpb25zKCkKKyAgICAgICAgZ3JlYXRlckVxdWFsT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGdyZWF0ZXJFcXVhbE9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBncmVhdGVyRXF1YWxPcHRpb25zKToKKyAgICAgICAgeCA9IEdyZWF0ZXJFcXVhbE9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKGdyZWF0ZXJFcXVhbE9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIEdyZWF0ZXJFcXVhbE9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgZ3JlYXRlckVxdWFsT3B0aW9ucyk6CisgICAgICAgIGlmIGdyZWF0ZXJFcXVhbE9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgIyBHcmVhdGVyRXF1YWxPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBHcmVhdGVyRXF1YWxPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgZ3JlYXRlckVxdWFsT3B0aW9ucyA9IEdyZWF0ZXJFcXVhbE9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIGdyZWF0ZXJFcXVhbE9wdGlvbnMKKworCitjbGFzcyBMZXNzT3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IExlc3NPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNMZXNzT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIExlc3NPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBMZXNzT3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKK2RlZiBMZXNzT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIExlc3NPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBMZXNzT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgTGVzc09wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIGxlc3NPcHRpb25zID0gTGVzc09wdGlvbnMoKQorICAgICAgICBsZXNzT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGxlc3NPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgbGVzc09wdGlvbnMpOgorICAgICAgICB4ID0gTGVzc09wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKGxlc3NPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBMZXNzT3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBsZXNzT3B0aW9ucyk6CisgICAgICAgIGlmIGxlc3NPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICMgTGVzc09wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIExlc3NPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgbGVzc09wdGlvbnMgPSBMZXNzT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gbGVzc09wdGlvbnMKKworCitjbGFzcyBMZXNzRXF1YWxPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gTGVzc0VxdWFsT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzTGVzc0VxdWFsT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIExlc3NFcXVhbE9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIExlc3NFcXVhbE9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCitkZWYgTGVzc0VxdWFsT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIExlc3NFcXVhbE9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIExlc3NFcXVhbE9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIExlc3NFcXVhbE9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIGxlc3NFcXVhbE9wdGlvbnMgPSBMZXNzRXF1YWxPcHRpb25zKCkKKyAgICAgICAgbGVzc0VxdWFsT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGxlc3NFcXVhbE9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBsZXNzRXF1YWxPcHRpb25zKToKKyAgICAgICAgeCA9IExlc3NFcXVhbE9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKGxlc3NFcXVhbE9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIExlc3NFcXVhbE9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgbGVzc0VxdWFsT3B0aW9ucyk6CisgICAgICAgIGlmIGxlc3NFcXVhbE9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgIyBMZXNzRXF1YWxPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBMZXNzRXF1YWxPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgbGVzc0VxdWFsT3B0aW9ucyA9IExlc3NFcXVhbE9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIGxlc3NFcXVhbE9wdGlvbnMKKwogCiBjbGFzcyBOZWdPcHRpb25zKG9iamVjdCk6CiAgICAgX19zbG90c19fID0gWydfdGFiJ10KQEAgLTcwNjEsMTIgKzExMTIzLDEzIEBACiAgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgogICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKIAotZGVmIE5lZ09wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgwKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBOZWdPcHRpb25zU3RhcnQoYnVpbGRlcikKLWRlZiBOZWdPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gTmVnT3B0aW9uc0VuZChidWlsZGVyKQorZGVmIE5lZ09wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCisKK2RlZiBOZWdPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKwogCiBjbGFzcyBOZWdPcHRpb25zVChvYmplY3QpOgogCkBAIC03MDgxLDYgKzExMTQ0LDExIEBACiAgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoobmVnT3B0aW9ucykKIAogICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIG5lZ09wdGlvbnMpOgogICAgICAgICB4ID0gTmVnT3B0aW9uc1QoKQogICAgICAgICB4Ll9VblBhY2sobmVnT3B0aW9ucykKQEAgLTcwOTYsMTQwICsxMTE2NCw0NzMgQEAKICAgICAgICAgTmVnT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCiAgICAgICAgIG5lZ09wdGlvbnMgPSBOZWdPcHRpb25zRW5kKGJ1aWxkZXIpCiAgICAgICAgIHJldHVybiBuZWdPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQogCi0jIG5hbWVzcGFjZTogdGZsaXRlCiAKLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgTm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnMob2JqZWN0KToKK2NsYXNzIFNlbGVjdE9wdGlvbnMob2JqZWN0KToKICAgICBfX3Nsb3RzX18gPSBbJ190YWInXQogCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgogICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBOb25NYXhTdXBwcmVzc2lvblY0T3B0aW9ucygpCisgICAgICAgIHggPSBTZWxlY3RPcHRpb25zKCkKICAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKICAgICAgICAgcmV0dXJuIHgKIAogICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNOb25NYXhTdXBwcmVzc2lvblY0T3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgIGRlZiBHZXRSb290QXNTZWxlY3RPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CiAgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgogICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKICAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgTm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgIGRlZiBTZWxlY3RPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKICAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQogCi0gICAgIyBOb25NYXhTdXBwcmVzc2lvblY0T3B0aW9ucworICAgICMgU2VsZWN0T3B0aW9ucwogICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKICAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCiAKLWRlZiBOb25NYXhTdXBwcmVzc2lvblY0T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIE5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zU3RhcnQoYnVpbGRlcikKLWRlZiBOb25NYXhTdXBwcmVzc2lvblY0T3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIE5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zRW5kKGJ1aWxkZXIpCitkZWYgU2VsZWN0T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKIAotY2xhc3MgTm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnNUKG9iamVjdCk6CitkZWYgU2VsZWN0T3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQogCi0gICAgIyBOb25NYXhTdXBwcmVzc2lvblY0T3B0aW9uc1QKKworCitjbGFzcyBTZWxlY3RPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBTZWxlY3RPcHRpb25zVAogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgcGFzcwogCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBub25NYXhTdXBwcmVzc2lvblY0b3B0aW9ucyA9IE5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zKCkKLSAgICAgICAgbm9uTWF4U3VwcHJlc3Npb25WNG9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihub25NYXhTdXBwcmVzc2lvblY0b3B0aW9ucykKKyAgICAgICAgc2VsZWN0T3B0aW9ucyA9IFNlbGVjdE9wdGlvbnMoKQorICAgICAgICBzZWxlY3RPcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooc2VsZWN0T3B0aW9ucykKIAogICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIG5vbk1heFN1cHByZXNzaW9uVjRvcHRpb25zKToKLSAgICAgICAgeCA9IE5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhub25NYXhTdXBwcmVzc2lvblY0b3B0aW9ucykKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzZWxlY3RPcHRpb25zKToKKyAgICAgICAgeCA9IFNlbGVjdE9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHNlbGVjdE9wdGlvbnMpCiAgICAgICAgIHJldHVybiB4CiAKLSAgICAjIE5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIG5vbk1heFN1cHByZXNzaW9uVjRvcHRpb25zKToKLSAgICAgICAgaWYgbm9uTWF4U3VwcHJlc3Npb25WNG9wdGlvbnMgaXMgTm9uZToKKyAgICAjIFNlbGVjdE9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgc2VsZWN0T3B0aW9ucyk6CisgICAgICAgIGlmIHNlbGVjdE9wdGlvbnMgaXMgTm9uZToKICAgICAgICAgICAgIHJldHVybgogCi0gICAgIyBOb25NYXhTdXBwcmVzc2lvblY0T3B0aW9uc1QKKyAgICAjIFNlbGVjdE9wdGlvbnNUCiAgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIE5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgbm9uTWF4U3VwcHJlc3Npb25WNG9wdGlvbnMgPSBOb25NYXhTdXBwcmVzc2lvblY0T3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gbm9uTWF4U3VwcHJlc3Npb25WNG9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisgICAgICAgIFNlbGVjdE9wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICBzZWxlY3RPcHRpb25zID0gU2VsZWN0T3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gc2VsZWN0T3B0aW9ucwogCi0jIG5hbWVzcGFjZTogdGZsaXRlCiAKLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgTm9uTWF4U3VwcHJlc3Npb25WNU9wdGlvbnMob2JqZWN0KToKK2NsYXNzIFNsaWNlT3B0aW9ucyhvYmplY3QpOgogICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCiAKICAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CiAgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zKCkKKyAgICAgICAgeCA9IFNsaWNlT3B0aW9ucygpCiAgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCiAgICAgICAgIHJldHVybiB4CiAKICAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzTm9uTWF4U3VwcHJlc3Npb25WNU9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICBkZWYgR2V0Um9vdEFzU2xpY2VPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CiAgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgogICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKICAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgTm9uTWF4U3VwcHJlc3Npb25WNU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgIGRlZiBTbGljZU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgogICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCiAKLSAgICAjIE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zCisgICAgIyBTbGljZU9wdGlvbnMKICAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CiAgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQogCi1kZWYgTm9uTWF4U3VwcHJlc3Npb25WNU9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgwKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBOb25NYXhTdXBwcmVzc2lvblY1T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgTm9uTWF4U3VwcHJlc3Npb25WNU9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBOb25NYXhTdXBwcmVzc2lvblY1T3B0aW9uc0VuZChidWlsZGVyKQorZGVmIFNsaWNlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKIAotY2xhc3MgTm9uTWF4U3VwcHJlc3Npb25WNU9wdGlvbnNUKG9iamVjdCk6CitkZWYgU2xpY2VPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCiAKLSAgICAjIE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zVAorCisKK2NsYXNzIFNsaWNlT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgU2xpY2VPcHRpb25zVAogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgcGFzcwogCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBub25NYXhTdXBwcmVzc2lvblY1b3B0aW9ucyA9IE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zKCkKLSAgICAgICAgbm9uTWF4U3VwcHJlc3Npb25WNW9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihub25NYXhTdXBwcmVzc2lvblY1b3B0aW9ucykKKyAgICAgICAgc2xpY2VPcHRpb25zID0gU2xpY2VPcHRpb25zKCkKKyAgICAgICAgc2xpY2VPcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooc2xpY2VPcHRpb25zKQogCiAgICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgbm9uTWF4U3VwcHJlc3Npb25WNW9wdGlvbnMpOgotICAgICAgICB4ID0gTm9uTWF4U3VwcHJlc3Npb25WNU9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKG5vbk1heFN1cHByZXNzaW9uVjVvcHRpb25zKQorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHNsaWNlT3B0aW9ucyk6CisgICAgICAgIHggPSBTbGljZU9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHNsaWNlT3B0aW9ucykKICAgICAgICAgcmV0dXJuIHgKIAotICAgICMgTm9uTWF4U3VwcHJlc3Npb25WNU9wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgbm9uTWF4U3VwcHJlc3Npb25WNW9wdGlvbnMpOgotICAgICAgICBpZiBub25NYXhTdXBwcmVzc2lvblY1b3B0aW9ucyBpcyBOb25lOgorICAgICMgU2xpY2VPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIHNsaWNlT3B0aW9ucyk6CisgICAgICAgIGlmIHNsaWNlT3B0aW9ucyBpcyBOb25lOgogICAgICAgICAgICAgcmV0dXJuCiAKLSAgICAjIE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zVAorICAgICMgU2xpY2VPcHRpb25zVAogICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBOb25NYXhTdXBwcmVzc2lvblY1T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIG5vbk1heFN1cHByZXNzaW9uVjVvcHRpb25zID0gTm9uTWF4U3VwcHJlc3Npb25WNU9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIG5vbk1heFN1cHByZXNzaW9uVjVvcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorICAgICAgICBTbGljZU9wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICBzbGljZU9wdGlvbnMgPSBTbGljZU9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHNsaWNlT3B0aW9ucwogCi0jIG5hbWVzcGFjZTogdGZsaXRlCiAKLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKK2NsYXNzIFRyYW5zcG9zZUNvbnZPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gVHJhbnNwb3NlQ29udk9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc1RyYW5zcG9zZUNvbnZPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgorICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgVHJhbnNwb3NlQ29udk9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFRyYW5zcG9zZUNvbnZPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworICAgICMgVHJhbnNwb3NlQ29udk9wdGlvbnMKKyAgICBkZWYgUGFkZGluZyhzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDhGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFRyYW5zcG9zZUNvbnZPcHRpb25zCisgICAgZGVmIFN0cmlkZVcoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgVHJhbnNwb3NlQ29udk9wdGlvbnMKKyAgICBkZWYgU3RyaWRlSChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg4KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBUcmFuc3Bvc2VDb252T3B0aW9ucworICAgIGRlZiBGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBUcmFuc3Bvc2VDb252T3B0aW9ucworICAgIGRlZiBRdWFudGl6ZWRCaWFzVHlwZShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCitkZWYgVHJhbnNwb3NlQ29udk9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDUpCisKK2RlZiBUcmFuc3Bvc2VDb252T3B0aW9uc0FkZFBhZGRpbmcoYnVpbGRlciwgcGFkZGluZyk6CisgICAgYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoMCwgcGFkZGluZywgMCkKKworZGVmIFRyYW5zcG9zZUNvbnZPcHRpb25zQWRkU3RyaWRlVyhidWlsZGVyLCBzdHJpZGVXKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMSwgc3RyaWRlVywgMCkKKworZGVmIFRyYW5zcG9zZUNvbnZPcHRpb25zQWRkU3RyaWRlSChidWlsZGVyLCBzdHJpZGVIKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMiwgc3RyaWRlSCwgMCkKKworZGVmIFRyYW5zcG9zZUNvbnZPcHRpb25zQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pOgorICAgIGJ1aWxkZXIuUHJlcGVuZEludDhTbG90KDMsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uLCAwKQorCitkZWYgVHJhbnNwb3NlQ29udk9wdGlvbnNBZGRRdWFudGl6ZWRCaWFzVHlwZShidWlsZGVyLCBxdWFudGl6ZWRCaWFzVHlwZSk6CisgICAgYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoNCwgcXVhbnRpemVkQmlhc1R5cGUsIDApCisKK2RlZiBUcmFuc3Bvc2VDb252T3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgVHJhbnNwb3NlQ29udk9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIFRyYW5zcG9zZUNvbnZPcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5wYWRkaW5nID0gMCAgIyB0eXBlOiBpbnQKKyAgICAgICAgc2VsZi5zdHJpZGVXID0gMCAgIyB0eXBlOiBpbnQKKyAgICAgICAgc2VsZi5zdHJpZGVIID0gMCAgIyB0eXBlOiBpbnQKKyAgICAgICAgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbiA9IDAgICMgdHlwZTogaW50CisgICAgICAgIHNlbGYucXVhbnRpemVkQmlhc1R5cGUgPSAwICAjIHR5cGU6IGludAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICB0cmFuc3Bvc2VDb252T3B0aW9ucyA9IFRyYW5zcG9zZUNvbnZPcHRpb25zKCkKKyAgICAgICAgdHJhbnNwb3NlQ29udk9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaih0cmFuc3Bvc2VDb252T3B0aW9ucykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHRyYW5zcG9zZUNvbnZPcHRpb25zKToKKyAgICAgICAgeCA9IFRyYW5zcG9zZUNvbnZPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayh0cmFuc3Bvc2VDb252T3B0aW9ucykKKyAgICAgICAgcmV0dXJuIHgKKworICAgICMgVHJhbnNwb3NlQ29udk9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgdHJhbnNwb3NlQ29udk9wdGlvbnMpOgorICAgICAgICBpZiB0cmFuc3Bvc2VDb252T3B0aW9ucyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYucGFkZGluZyA9IHRyYW5zcG9zZUNvbnZPcHRpb25zLlBhZGRpbmcoKQorICAgICAgICBzZWxmLnN0cmlkZVcgPSB0cmFuc3Bvc2VDb252T3B0aW9ucy5TdHJpZGVXKCkKKyAgICAgICAgc2VsZi5zdHJpZGVIID0gdHJhbnNwb3NlQ29udk9wdGlvbnMuU3RyaWRlSCgpCisgICAgICAgIHNlbGYuZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24gPSB0cmFuc3Bvc2VDb252T3B0aW9ucy5GdXNlZEFjdGl2YXRpb25GdW5jdGlvbigpCisgICAgICAgIHNlbGYucXVhbnRpemVkQmlhc1R5cGUgPSB0cmFuc3Bvc2VDb252T3B0aW9ucy5RdWFudGl6ZWRCaWFzVHlwZSgpCisKKyAgICAjIFRyYW5zcG9zZUNvbnZPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBUcmFuc3Bvc2VDb252T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIFRyYW5zcG9zZUNvbnZPcHRpb25zQWRkUGFkZGluZyhidWlsZGVyLCBzZWxmLnBhZGRpbmcpCisgICAgICAgIFRyYW5zcG9zZUNvbnZPcHRpb25zQWRkU3RyaWRlVyhidWlsZGVyLCBzZWxmLnN0cmlkZVcpCisgICAgICAgIFRyYW5zcG9zZUNvbnZPcHRpb25zQWRkU3RyaWRlSChidWlsZGVyLCBzZWxmLnN0cmlkZUgpCisgICAgICAgIFRyYW5zcG9zZUNvbnZPcHRpb25zQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbikKKyAgICAgICAgVHJhbnNwb3NlQ29udk9wdGlvbnNBZGRRdWFudGl6ZWRCaWFzVHlwZShidWlsZGVyLCBzZWxmLnF1YW50aXplZEJpYXNUeXBlKQorICAgICAgICB0cmFuc3Bvc2VDb252T3B0aW9ucyA9IFRyYW5zcG9zZUNvbnZPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiB0cmFuc3Bvc2VDb252T3B0aW9ucworCisKK2NsYXNzIEV4cGFuZERpbXNPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gRXhwYW5kRGltc09wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc0V4cGFuZERpbXNPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgorICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgRXhwYW5kRGltc09wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIEV4cGFuZERpbXNPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworZGVmIEV4cGFuZERpbXNPcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgwKQorCitkZWYgRXhwYW5kRGltc09wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIEV4cGFuZERpbXNPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBFeHBhbmREaW1zT3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgZXhwYW5kRGltc09wdGlvbnMgPSBFeHBhbmREaW1zT3B0aW9ucygpCisgICAgICAgIGV4cGFuZERpbXNPcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooZXhwYW5kRGltc09wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBleHBhbmREaW1zT3B0aW9ucyk6CisgICAgICAgIHggPSBFeHBhbmREaW1zT3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2soZXhwYW5kRGltc09wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIEV4cGFuZERpbXNPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIGV4cGFuZERpbXNPcHRpb25zKToKKyAgICAgICAgaWYgZXhwYW5kRGltc09wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgIyBFeHBhbmREaW1zT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgRXhwYW5kRGltc09wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICBleHBhbmREaW1zT3B0aW9ucyA9IEV4cGFuZERpbXNPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBleHBhbmREaW1zT3B0aW9ucworCisKK2NsYXNzIFNwYXJzZVRvRGVuc2VPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gU3BhcnNlVG9EZW5zZU9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc1NwYXJzZVRvRGVuc2VPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgorICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgU3BhcnNlVG9EZW5zZU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFNwYXJzZVRvRGVuc2VPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworICAgICMgU3BhcnNlVG9EZW5zZU9wdGlvbnMKKyAgICBkZWYgVmFsaWRhdGVJbmRpY2VzKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gYm9vbChzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5Cb29sRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKSkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKK2RlZiBTcGFyc2VUb0RlbnNlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMSkKKworZGVmIFNwYXJzZVRvRGVuc2VPcHRpb25zQWRkVmFsaWRhdGVJbmRpY2VzKGJ1aWxkZXIsIHZhbGlkYXRlSW5kaWNlcyk6CisgICAgYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoMCwgdmFsaWRhdGVJbmRpY2VzLCAwKQorCitkZWYgU3BhcnNlVG9EZW5zZU9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIFNwYXJzZVRvRGVuc2VPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBTcGFyc2VUb0RlbnNlT3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYudmFsaWRhdGVJbmRpY2VzID0gRmFsc2UgICMgdHlwZTogYm9vbAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICBzcGFyc2VUb0RlbnNlT3B0aW9ucyA9IFNwYXJzZVRvRGVuc2VPcHRpb25zKCkKKyAgICAgICAgc3BhcnNlVG9EZW5zZU9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihzcGFyc2VUb0RlbnNlT3B0aW9ucykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHNwYXJzZVRvRGVuc2VPcHRpb25zKToKKyAgICAgICAgeCA9IFNwYXJzZVRvRGVuc2VPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhzcGFyc2VUb0RlbnNlT3B0aW9ucykKKyAgICAgICAgcmV0dXJuIHgKKworICAgICMgU3BhcnNlVG9EZW5zZU9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgc3BhcnNlVG9EZW5zZU9wdGlvbnMpOgorICAgICAgICBpZiBzcGFyc2VUb0RlbnNlT3B0aW9ucyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYudmFsaWRhdGVJbmRpY2VzID0gc3BhcnNlVG9EZW5zZU9wdGlvbnMuVmFsaWRhdGVJbmRpY2VzKCkKKworICAgICMgU3BhcnNlVG9EZW5zZU9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIFNwYXJzZVRvRGVuc2VPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgU3BhcnNlVG9EZW5zZU9wdGlvbnNBZGRWYWxpZGF0ZUluZGljZXMoYnVpbGRlciwgc2VsZi52YWxpZGF0ZUluZGljZXMpCisgICAgICAgIHNwYXJzZVRvRGVuc2VPcHRpb25zID0gU3BhcnNlVG9EZW5zZU9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHNwYXJzZVRvRGVuc2VPcHRpb25zCisKKworY2xhc3MgRXF1YWxPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gRXF1YWxPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNFcXVhbE9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBFcXVhbE9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIEVxdWFsT3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKK2RlZiBFcXVhbE9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCisKK2RlZiBFcXVhbE9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIEVxdWFsT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgRXF1YWxPcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICBlcXVhbE9wdGlvbnMgPSBFcXVhbE9wdGlvbnMoKQorICAgICAgICBlcXVhbE9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihlcXVhbE9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBlcXVhbE9wdGlvbnMpOgorICAgICAgICB4ID0gRXF1YWxPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhlcXVhbE9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIEVxdWFsT3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBlcXVhbE9wdGlvbnMpOgorICAgICAgICBpZiBlcXVhbE9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgIyBFcXVhbE9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIEVxdWFsT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIGVxdWFsT3B0aW9ucyA9IEVxdWFsT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gZXF1YWxPcHRpb25zCisKIAogY2xhc3MgTm90RXF1YWxPcHRpb25zKG9iamVjdCk6CiAgICAgX19zbG90c19fID0gWydfdGFiJ10KQEAgLTcyNTMsMTIgKzExNjU0LDEzIEBACiAgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgogICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKIAotZGVmIE5vdEVxdWFsT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIE5vdEVxdWFsT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgTm90RXF1YWxPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gTm90RXF1YWxPcHRpb25zRW5kKGJ1aWxkZXIpCitkZWYgTm90RXF1YWxPcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgwKQorCitkZWYgTm90RXF1YWxPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKwogCiBjbGFzcyBOb3RFcXVhbE9wdGlvbnNUKG9iamVjdCk6CiAKQEAgLTcyNzMsNiArMTE2NzUsMTEgQEAKICAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihub3RFcXVhbE9wdGlvbnMpCiAKICAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBub3RFcXVhbE9wdGlvbnMpOgogICAgICAgICB4ID0gTm90RXF1YWxPcHRpb25zVCgpCiAgICAgICAgIHguX1VuUGFjayhub3RFcXVhbE9wdGlvbnMpCkBAIC03Mjg4LDEyICsxMTY5NSw0ODUgQEAKICAgICAgICAgTm90RXF1YWxPcHRpb25zU3RhcnQoYnVpbGRlcikKICAgICAgICAgbm90RXF1YWxPcHRpb25zID0gTm90RXF1YWxPcHRpb25zRW5kKGJ1aWxkZXIpCiAgICAgICAgIHJldHVybiBub3RFcXVhbE9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CiAKLSMgbmFtZXNwYWNlOiB0ZmxpdGUKIAotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQorY2xhc3MgU2hhcGVPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gU2hhcGVPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNTaGFwZU9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBTaGFwZU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFNoYXBlT3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKKyAgICAjIFNoYXBlT3B0aW9ucworICAgIGRlZiBPdXRUeXBlKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50OEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworZGVmIFNoYXBlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMSkKKworZGVmIFNoYXBlT3B0aW9uc0FkZE91dFR5cGUoYnVpbGRlciwgb3V0VHlwZSk6CisgICAgYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoMCwgb3V0VHlwZSwgMCkKKworZGVmIFNoYXBlT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgU2hhcGVPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBTaGFwZU9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLm91dFR5cGUgPSAwICAjIHR5cGU6IGludAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICBzaGFwZU9wdGlvbnMgPSBTaGFwZU9wdGlvbnMoKQorICAgICAgICBzaGFwZU9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihzaGFwZU9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzaGFwZU9wdGlvbnMpOgorICAgICAgICB4ID0gU2hhcGVPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhzaGFwZU9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFNoYXBlT3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBzaGFwZU9wdGlvbnMpOgorICAgICAgICBpZiBzaGFwZU9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLm91dFR5cGUgPSBzaGFwZU9wdGlvbnMuT3V0VHlwZSgpCisKKyAgICAjIFNoYXBlT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgU2hhcGVPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgU2hhcGVPcHRpb25zQWRkT3V0VHlwZShidWlsZGVyLCBzZWxmLm91dFR5cGUpCisgICAgICAgIHNoYXBlT3B0aW9ucyA9IFNoYXBlT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gc2hhcGVPcHRpb25zCisKKworY2xhc3MgUmFua09wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBSYW5rT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzUmFua09wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBSYW5rT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgUmFua09wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCitkZWYgUmFua09wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCisKK2RlZiBSYW5rT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgUmFua09wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIFJhbmtPcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICByYW5rT3B0aW9ucyA9IFJhbmtPcHRpb25zKCkKKyAgICAgICAgcmFua09wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihyYW5rT3B0aW9ucykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHJhbmtPcHRpb25zKToKKyAgICAgICAgeCA9IFJhbmtPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhyYW5rT3B0aW9ucykKKyAgICAgICAgcmV0dXJuIHgKKworICAgICMgUmFua09wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgcmFua09wdGlvbnMpOgorICAgICAgICBpZiByYW5rT3B0aW9ucyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAjIFJhbmtPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBSYW5rT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIHJhbmtPcHRpb25zID0gUmFua09wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHJhbmtPcHRpb25zCisKKworY2xhc3MgUG93T3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IFBvd09wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc1Bvd09wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBQb3dPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBQb3dPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworZGVmIFBvd09wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCisKK2RlZiBQb3dPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBQb3dPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBQb3dPcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICBwb3dPcHRpb25zID0gUG93T3B0aW9ucygpCisgICAgICAgIHBvd09wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihwb3dPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgcG93T3B0aW9ucyk6CisgICAgICAgIHggPSBQb3dPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhwb3dPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBQb3dPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIHBvd09wdGlvbnMpOgorICAgICAgICBpZiBwb3dPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICMgUG93T3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgUG93T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIHBvd09wdGlvbnMgPSBQb3dPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBwb3dPcHRpb25zCisKKworY2xhc3MgRmFrZVF1YW50T3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IEZha2VRdWFudE9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc0Zha2VRdWFudE9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBGYWtlUXVhbnRPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBGYWtlUXVhbnRPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworICAgICMgRmFrZVF1YW50T3B0aW9ucworICAgIGRlZiBNaW4oc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5GbG9hdDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMC4wCisKKyAgICAjIEZha2VRdWFudE9wdGlvbnMKKyAgICBkZWYgTWF4KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuRmxvYXQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAuMAorCisgICAgIyBGYWtlUXVhbnRPcHRpb25zCisgICAgZGVmIE51bUJpdHMoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgRmFrZVF1YW50T3B0aW9ucworICAgIGRlZiBOYXJyb3dSYW5nZShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkJvb2xGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpKQorICAgICAgICByZXR1cm4gRmFsc2UKKworZGVmIEZha2VRdWFudE9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDQpCisKK2RlZiBGYWtlUXVhbnRPcHRpb25zQWRkTWluKGJ1aWxkZXIsIG1pbik6CisgICAgYnVpbGRlci5QcmVwZW5kRmxvYXQzMlNsb3QoMCwgbWluLCAwLjApCisKK2RlZiBGYWtlUXVhbnRPcHRpb25zQWRkTWF4KGJ1aWxkZXIsIG1heCk6CisgICAgYnVpbGRlci5QcmVwZW5kRmxvYXQzMlNsb3QoMSwgbWF4LCAwLjApCisKK2RlZiBGYWtlUXVhbnRPcHRpb25zQWRkTnVtQml0cyhidWlsZGVyLCBudW1CaXRzKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMiwgbnVtQml0cywgMCkKKworZGVmIEZha2VRdWFudE9wdGlvbnNBZGROYXJyb3dSYW5nZShidWlsZGVyLCBuYXJyb3dSYW5nZSk6CisgICAgYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoMywgbmFycm93UmFuZ2UsIDApCisKK2RlZiBGYWtlUXVhbnRPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBGYWtlUXVhbnRPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBGYWtlUXVhbnRPcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5taW4gPSAwLjAgICMgdHlwZTogZmxvYXQKKyAgICAgICAgc2VsZi5tYXggPSAwLjAgICMgdHlwZTogZmxvYXQKKyAgICAgICAgc2VsZi5udW1CaXRzID0gMCAgIyB0eXBlOiBpbnQKKyAgICAgICAgc2VsZi5uYXJyb3dSYW5nZSA9IEZhbHNlICAjIHR5cGU6IGJvb2wKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgZmFrZVF1YW50T3B0aW9ucyA9IEZha2VRdWFudE9wdGlvbnMoKQorICAgICAgICBmYWtlUXVhbnRPcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooZmFrZVF1YW50T3B0aW9ucykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGZha2VRdWFudE9wdGlvbnMpOgorICAgICAgICB4ID0gRmFrZVF1YW50T3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2soZmFrZVF1YW50T3B0aW9ucykKKyAgICAgICAgcmV0dXJuIHgKKworICAgICMgRmFrZVF1YW50T3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBmYWtlUXVhbnRPcHRpb25zKToKKyAgICAgICAgaWYgZmFrZVF1YW50T3B0aW9ucyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYubWluID0gZmFrZVF1YW50T3B0aW9ucy5NaW4oKQorICAgICAgICBzZWxmLm1heCA9IGZha2VRdWFudE9wdGlvbnMuTWF4KCkKKyAgICAgICAgc2VsZi5udW1CaXRzID0gZmFrZVF1YW50T3B0aW9ucy5OdW1CaXRzKCkKKyAgICAgICAgc2VsZi5uYXJyb3dSYW5nZSA9IGZha2VRdWFudE9wdGlvbnMuTmFycm93UmFuZ2UoKQorCisgICAgIyBGYWtlUXVhbnRPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBGYWtlUXVhbnRPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgRmFrZVF1YW50T3B0aW9uc0FkZE1pbihidWlsZGVyLCBzZWxmLm1pbikKKyAgICAgICAgRmFrZVF1YW50T3B0aW9uc0FkZE1heChidWlsZGVyLCBzZWxmLm1heCkKKyAgICAgICAgRmFrZVF1YW50T3B0aW9uc0FkZE51bUJpdHMoYnVpbGRlciwgc2VsZi5udW1CaXRzKQorICAgICAgICBGYWtlUXVhbnRPcHRpb25zQWRkTmFycm93UmFuZ2UoYnVpbGRlciwgc2VsZi5uYXJyb3dSYW5nZSkKKyAgICAgICAgZmFrZVF1YW50T3B0aW9ucyA9IEZha2VRdWFudE9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIGZha2VRdWFudE9wdGlvbnMKKworCitjbGFzcyBQYWNrT3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IFBhY2tPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNQYWNrT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFBhY2tPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBQYWNrT3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKKyAgICAjIFBhY2tPcHRpb25zCisgICAgZGVmIFZhbHVlc0NvdW50KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFBhY2tPcHRpb25zCisgICAgZGVmIEF4aXMoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworZGVmIFBhY2tPcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgyKQorCitkZWYgUGFja09wdGlvbnNBZGRWYWx1ZXNDb3VudChidWlsZGVyLCB2YWx1ZXNDb3VudCk6CisgICAgYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDAsIHZhbHVlc0NvdW50LCAwKQorCitkZWYgUGFja09wdGlvbnNBZGRBeGlzKGJ1aWxkZXIsIGF4aXMpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEludDMyU2xvdCgxLCBheGlzLCAwKQorCitkZWYgUGFja09wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIFBhY2tPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBQYWNrT3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYudmFsdWVzQ291bnQgPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmF4aXMgPSAwICAjIHR5cGU6IGludAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICBwYWNrT3B0aW9ucyA9IFBhY2tPcHRpb25zKCkKKyAgICAgICAgcGFja09wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihwYWNrT3B0aW9ucykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHBhY2tPcHRpb25zKToKKyAgICAgICAgeCA9IFBhY2tPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhwYWNrT3B0aW9ucykKKyAgICAgICAgcmV0dXJuIHgKKworICAgICMgUGFja09wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgcGFja09wdGlvbnMpOgorICAgICAgICBpZiBwYWNrT3B0aW9ucyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYudmFsdWVzQ291bnQgPSBwYWNrT3B0aW9ucy5WYWx1ZXNDb3VudCgpCisgICAgICAgIHNlbGYuYXhpcyA9IHBhY2tPcHRpb25zLkF4aXMoKQorCisgICAgIyBQYWNrT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgUGFja09wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICBQYWNrT3B0aW9uc0FkZFZhbHVlc0NvdW50KGJ1aWxkZXIsIHNlbGYudmFsdWVzQ291bnQpCisgICAgICAgIFBhY2tPcHRpb25zQWRkQXhpcyhidWlsZGVyLCBzZWxmLmF4aXMpCisgICAgICAgIHBhY2tPcHRpb25zID0gUGFja09wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHBhY2tPcHRpb25zCisKKworY2xhc3MgTG9naWNhbE9yT3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IExvZ2ljYWxPck9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc0xvZ2ljYWxPck9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBMb2dpY2FsT3JPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBMb2dpY2FsT3JPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworZGVmIExvZ2ljYWxPck9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCisKK2RlZiBMb2dpY2FsT3JPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBMb2dpY2FsT3JPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBMb2dpY2FsT3JPcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICBsb2dpY2FsT3JPcHRpb25zID0gTG9naWNhbE9yT3B0aW9ucygpCisgICAgICAgIGxvZ2ljYWxPck9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihsb2dpY2FsT3JPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgbG9naWNhbE9yT3B0aW9ucyk6CisgICAgICAgIHggPSBMb2dpY2FsT3JPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhsb2dpY2FsT3JPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBMb2dpY2FsT3JPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIGxvZ2ljYWxPck9wdGlvbnMpOgorICAgICAgICBpZiBsb2dpY2FsT3JPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICMgTG9naWNhbE9yT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgTG9naWNhbE9yT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIGxvZ2ljYWxPck9wdGlvbnMgPSBMb2dpY2FsT3JPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBsb2dpY2FsT3JPcHRpb25zCisKIAogY2xhc3MgT25lSG90T3B0aW9ucyhvYmplY3QpOgogICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCkBAIC03MzI0LDE1ICsxMjIwNCwxNiBAQAogICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQogICAgICAgICByZXR1cm4gMAogCi1kZWYgT25lSG90T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDEpCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIE9uZUhvdE9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIE9uZUhvdE9wdGlvbnNBZGRBeGlzKGJ1aWxkZXIsIGF4aXMpOiBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMCwgYXhpcywgMCkKLWRlZiBBZGRBeGlzKGJ1aWxkZXIsIGF4aXMpOgotICAgIHJldHVybiBPbmVIb3RPcHRpb25zQWRkQXhpcyhidWlsZGVyLCBheGlzKQotZGVmIE9uZUhvdE9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBPbmVIb3RPcHRpb25zRW5kKGJ1aWxkZXIpCitkZWYgT25lSG90T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMSkKKworZGVmIE9uZUhvdE9wdGlvbnNBZGRBeGlzKGJ1aWxkZXIsIGF4aXMpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEludDMyU2xvdCgwLCBheGlzLCAwKQorCitkZWYgT25lSG90T3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKIAogY2xhc3MgT25lSG90T3B0aW9uc1Qob2JqZWN0KToKIApAQCAtNzM0Nyw2ICsxMjIyOCwxMSBAQAogICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKG9uZUhvdE9wdGlvbnMpCiAKICAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBvbmVIb3RPcHRpb25zKToKICAgICAgICAgeCA9IE9uZUhvdE9wdGlvbnNUKCkKICAgICAgICAgeC5fVW5QYWNrKG9uZUhvdE9wdGlvbnMpCkBAIC03MzY0LDEyICsxMjI1MCw0NDUzIEBACiAgICAgICAgIE9uZUhvdE9wdGlvbnNBZGRBeGlzKGJ1aWxkZXIsIHNlbGYuYXhpcykKICAgICAgICAgb25lSG90T3B0aW9ucyA9IE9uZUhvdE9wdGlvbnNFbmQoYnVpbGRlcikKICAgICAgICAgcmV0dXJuIG9uZUhvdE9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CiAKLSMgbmFtZXNwYWNlOiB0ZmxpdGUKIAotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQorY2xhc3MgQWJzT3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IEFic09wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc0Fic09wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBBYnNPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBBYnNPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworZGVmIEFic09wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCisKK2RlZiBBYnNPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBBYnNPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBBYnNPcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICBhYnNPcHRpb25zID0gQWJzT3B0aW9ucygpCisgICAgICAgIGFic09wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihhYnNPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgYWJzT3B0aW9ucyk6CisgICAgICAgIHggPSBBYnNPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhhYnNPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBBYnNPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIGFic09wdGlvbnMpOgorICAgICAgICBpZiBhYnNPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICMgQWJzT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgQWJzT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIGFic09wdGlvbnMgPSBBYnNPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBhYnNPcHRpb25zCisKKworY2xhc3MgSGFyZFN3aXNoT3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IEhhcmRTd2lzaE9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc0hhcmRTd2lzaE9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBIYXJkU3dpc2hPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBIYXJkU3dpc2hPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworZGVmIEhhcmRTd2lzaE9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCisKK2RlZiBIYXJkU3dpc2hPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBIYXJkU3dpc2hPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBIYXJkU3dpc2hPcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICBoYXJkU3dpc2hPcHRpb25zID0gSGFyZFN3aXNoT3B0aW9ucygpCisgICAgICAgIGhhcmRTd2lzaE9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihoYXJkU3dpc2hPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgaGFyZFN3aXNoT3B0aW9ucyk6CisgICAgICAgIHggPSBIYXJkU3dpc2hPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhoYXJkU3dpc2hPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBIYXJkU3dpc2hPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIGhhcmRTd2lzaE9wdGlvbnMpOgorICAgICAgICBpZiBoYXJkU3dpc2hPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICMgSGFyZFN3aXNoT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgSGFyZFN3aXNoT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIGhhcmRTd2lzaE9wdGlvbnMgPSBIYXJkU3dpc2hPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBoYXJkU3dpc2hPcHRpb25zCisKKworY2xhc3MgTG9naWNhbEFuZE9wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBMb2dpY2FsQW5kT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzTG9naWNhbEFuZE9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBMb2dpY2FsQW5kT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgTG9naWNhbEFuZE9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCitkZWYgTG9naWNhbEFuZE9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCisKK2RlZiBMb2dpY2FsQW5kT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgTG9naWNhbEFuZE9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIExvZ2ljYWxBbmRPcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICBsb2dpY2FsQW5kT3B0aW9ucyA9IExvZ2ljYWxBbmRPcHRpb25zKCkKKyAgICAgICAgbG9naWNhbEFuZE9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihsb2dpY2FsQW5kT3B0aW9ucykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGxvZ2ljYWxBbmRPcHRpb25zKToKKyAgICAgICAgeCA9IExvZ2ljYWxBbmRPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhsb2dpY2FsQW5kT3B0aW9ucykKKyAgICAgICAgcmV0dXJuIHgKKworICAgICMgTG9naWNhbEFuZE9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgbG9naWNhbEFuZE9wdGlvbnMpOgorICAgICAgICBpZiBsb2dpY2FsQW5kT3B0aW9ucyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAjIExvZ2ljYWxBbmRPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBMb2dpY2FsQW5kT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIGxvZ2ljYWxBbmRPcHRpb25zID0gTG9naWNhbEFuZE9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIGxvZ2ljYWxBbmRPcHRpb25zCisKKworY2xhc3MgTG9naWNhbE5vdE9wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBMb2dpY2FsTm90T3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzTG9naWNhbE5vdE9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBMb2dpY2FsTm90T3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgTG9naWNhbE5vdE9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCitkZWYgTG9naWNhbE5vdE9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCisKK2RlZiBMb2dpY2FsTm90T3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgTG9naWNhbE5vdE9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIExvZ2ljYWxOb3RPcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICBsb2dpY2FsTm90T3B0aW9ucyA9IExvZ2ljYWxOb3RPcHRpb25zKCkKKyAgICAgICAgbG9naWNhbE5vdE9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihsb2dpY2FsTm90T3B0aW9ucykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGxvZ2ljYWxOb3RPcHRpb25zKToKKyAgICAgICAgeCA9IExvZ2ljYWxOb3RPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhsb2dpY2FsTm90T3B0aW9ucykKKyAgICAgICAgcmV0dXJuIHgKKworICAgICMgTG9naWNhbE5vdE9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgbG9naWNhbE5vdE9wdGlvbnMpOgorICAgICAgICBpZiBsb2dpY2FsTm90T3B0aW9ucyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAjIExvZ2ljYWxOb3RPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBMb2dpY2FsTm90T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIGxvZ2ljYWxOb3RPcHRpb25zID0gTG9naWNhbE5vdE9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIGxvZ2ljYWxOb3RPcHRpb25zCisKKworY2xhc3MgVW5wYWNrT3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IFVucGFja09wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc1VucGFja09wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBVbnBhY2tPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBVbnBhY2tPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworICAgICMgVW5wYWNrT3B0aW9ucworICAgIGRlZiBOdW0oc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgVW5wYWNrT3B0aW9ucworICAgIGRlZiBBeGlzKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKK2RlZiBVbnBhY2tPcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgyKQorCitkZWYgVW5wYWNrT3B0aW9uc0FkZE51bShidWlsZGVyLCBudW0pOgorICAgIGJ1aWxkZXIuUHJlcGVuZEludDMyU2xvdCgwLCBudW0sIDApCisKK2RlZiBVbnBhY2tPcHRpb25zQWRkQXhpcyhidWlsZGVyLCBheGlzKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMSwgYXhpcywgMCkKKworZGVmIFVucGFja09wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIFVucGFja09wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIFVucGFja09wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLm51bSA9IDAgICMgdHlwZTogaW50CisgICAgICAgIHNlbGYuYXhpcyA9IDAgICMgdHlwZTogaW50CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHVucGFja09wdGlvbnMgPSBVbnBhY2tPcHRpb25zKCkKKyAgICAgICAgdW5wYWNrT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHVucGFja09wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCB1bnBhY2tPcHRpb25zKToKKyAgICAgICAgeCA9IFVucGFja09wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHVucGFja09wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFVucGFja09wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgdW5wYWNrT3B0aW9ucyk6CisgICAgICAgIGlmIHVucGFja09wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLm51bSA9IHVucGFja09wdGlvbnMuTnVtKCkKKyAgICAgICAgc2VsZi5heGlzID0gdW5wYWNrT3B0aW9ucy5BeGlzKCkKKworICAgICMgVW5wYWNrT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgVW5wYWNrT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIFVucGFja09wdGlvbnNBZGROdW0oYnVpbGRlciwgc2VsZi5udW0pCisgICAgICAgIFVucGFja09wdGlvbnNBZGRBeGlzKGJ1aWxkZXIsIHNlbGYuYXhpcykKKyAgICAgICAgdW5wYWNrT3B0aW9ucyA9IFVucGFja09wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHVucGFja09wdGlvbnMKKworCitjbGFzcyBGbG9vckRpdk9wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBGbG9vckRpdk9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc0Zsb29yRGl2T3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEZsb29yRGl2T3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgRmxvb3JEaXZPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworZGVmIEZsb29yRGl2T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIEZsb29yRGl2T3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgRmxvb3JEaXZPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBGbG9vckRpdk9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIGZsb29yRGl2T3B0aW9ucyA9IEZsb29yRGl2T3B0aW9ucygpCisgICAgICAgIGZsb29yRGl2T3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGZsb29yRGl2T3B0aW9ucykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGZsb29yRGl2T3B0aW9ucyk6CisgICAgICAgIHggPSBGbG9vckRpdk9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKGZsb29yRGl2T3B0aW9ucykKKyAgICAgICAgcmV0dXJuIHgKKworICAgICMgRmxvb3JEaXZPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIGZsb29yRGl2T3B0aW9ucyk6CisgICAgICAgIGlmIGZsb29yRGl2T3B0aW9ucyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAjIEZsb29yRGl2T3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgRmxvb3JEaXZPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgZmxvb3JEaXZPcHRpb25zID0gRmxvb3JEaXZPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBmbG9vckRpdk9wdGlvbnMKKworCitjbGFzcyBTcXVhcmVPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gU3F1YXJlT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzU3F1YXJlT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFNxdWFyZU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFNxdWFyZU9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCitkZWYgU3F1YXJlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIFNxdWFyZU9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIFNxdWFyZU9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIFNxdWFyZU9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHNxdWFyZU9wdGlvbnMgPSBTcXVhcmVPcHRpb25zKCkKKyAgICAgICAgc3F1YXJlT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHNxdWFyZU9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzcXVhcmVPcHRpb25zKToKKyAgICAgICAgeCA9IFNxdWFyZU9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHNxdWFyZU9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFNxdWFyZU9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgc3F1YXJlT3B0aW9ucyk6CisgICAgICAgIGlmIHNxdWFyZU9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgIyBTcXVhcmVPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBTcXVhcmVPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgc3F1YXJlT3B0aW9ucyA9IFNxdWFyZU9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHNxdWFyZU9wdGlvbnMKKworCitjbGFzcyBaZXJvc0xpa2VPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gWmVyb3NMaWtlT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzWmVyb3NMaWtlT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFplcm9zTGlrZU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFplcm9zTGlrZU9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCitkZWYgWmVyb3NMaWtlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIFplcm9zTGlrZU9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIFplcm9zTGlrZU9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIFplcm9zTGlrZU9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHplcm9zTGlrZU9wdGlvbnMgPSBaZXJvc0xpa2VPcHRpb25zKCkKKyAgICAgICAgemVyb3NMaWtlT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHplcm9zTGlrZU9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCB6ZXJvc0xpa2VPcHRpb25zKToKKyAgICAgICAgeCA9IFplcm9zTGlrZU9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHplcm9zTGlrZU9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFplcm9zTGlrZU9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgemVyb3NMaWtlT3B0aW9ucyk6CisgICAgICAgIGlmIHplcm9zTGlrZU9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgIyBaZXJvc0xpa2VPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBaZXJvc0xpa2VPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgemVyb3NMaWtlT3B0aW9ucyA9IFplcm9zTGlrZU9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHplcm9zTGlrZU9wdGlvbnMKKworCitjbGFzcyBGaWxsT3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IEZpbGxPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNGaWxsT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEZpbGxPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBGaWxsT3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKK2RlZiBGaWxsT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIEZpbGxPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBGaWxsT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgRmlsbE9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIGZpbGxPcHRpb25zID0gRmlsbE9wdGlvbnMoKQorICAgICAgICBmaWxsT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGZpbGxPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgZmlsbE9wdGlvbnMpOgorICAgICAgICB4ID0gRmlsbE9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKGZpbGxPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBGaWxsT3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBmaWxsT3B0aW9ucyk6CisgICAgICAgIGlmIGZpbGxPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICMgRmlsbE9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIEZpbGxPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgZmlsbE9wdGlvbnMgPSBGaWxsT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gZmlsbE9wdGlvbnMKKworCitjbGFzcyBGbG9vck1vZE9wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBGbG9vck1vZE9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc0Zsb29yTW9kT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEZsb29yTW9kT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgRmxvb3JNb2RPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworZGVmIEZsb29yTW9kT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIEZsb29yTW9kT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgRmxvb3JNb2RPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBGbG9vck1vZE9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIGZsb29yTW9kT3B0aW9ucyA9IEZsb29yTW9kT3B0aW9ucygpCisgICAgICAgIGZsb29yTW9kT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGZsb29yTW9kT3B0aW9ucykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGZsb29yTW9kT3B0aW9ucyk6CisgICAgICAgIHggPSBGbG9vck1vZE9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKGZsb29yTW9kT3B0aW9ucykKKyAgICAgICAgcmV0dXJuIHgKKworICAgICMgRmxvb3JNb2RPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIGZsb29yTW9kT3B0aW9ucyk6CisgICAgICAgIGlmIGZsb29yTW9kT3B0aW9ucyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAjIEZsb29yTW9kT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgRmxvb3JNb2RPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgZmxvb3JNb2RPcHRpb25zID0gRmxvb3JNb2RPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBmbG9vck1vZE9wdGlvbnMKKworCitjbGFzcyBSYW5nZU9wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBSYW5nZU9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc1JhbmdlT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFJhbmdlT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgUmFuZ2VPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworZGVmIFJhbmdlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIFJhbmdlT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgUmFuZ2VPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBSYW5nZU9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHJhbmdlT3B0aW9ucyA9IFJhbmdlT3B0aW9ucygpCisgICAgICAgIHJhbmdlT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHJhbmdlT3B0aW9ucykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHJhbmdlT3B0aW9ucyk6CisgICAgICAgIHggPSBSYW5nZU9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHJhbmdlT3B0aW9ucykKKyAgICAgICAgcmV0dXJuIHgKKworICAgICMgUmFuZ2VPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIHJhbmdlT3B0aW9ucyk6CisgICAgICAgIGlmIHJhbmdlT3B0aW9ucyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAjIFJhbmdlT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgUmFuZ2VPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgcmFuZ2VPcHRpb25zID0gUmFuZ2VPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiByYW5nZU9wdGlvbnMKKworCitjbGFzcyBMZWFreVJlbHVPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gTGVha3lSZWx1T3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzTGVha3lSZWx1T3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIExlYWt5UmVsdU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIExlYWt5UmVsdU9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCisgICAgIyBMZWFreVJlbHVPcHRpb25zCisgICAgZGVmIEFscGhhKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuRmxvYXQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAuMAorCitkZWYgTGVha3lSZWx1T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMSkKKworZGVmIExlYWt5UmVsdU9wdGlvbnNBZGRBbHBoYShidWlsZGVyLCBhbHBoYSk6CisgICAgYnVpbGRlci5QcmVwZW5kRmxvYXQzMlNsb3QoMCwgYWxwaGEsIDAuMCkKKworZGVmIExlYWt5UmVsdU9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIExlYWt5UmVsdU9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIExlYWt5UmVsdU9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmFscGhhID0gMC4wICAjIHR5cGU6IGZsb2F0CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIGxlYWt5UmVsdU9wdGlvbnMgPSBMZWFreVJlbHVPcHRpb25zKCkKKyAgICAgICAgbGVha3lSZWx1T3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGxlYWt5UmVsdU9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBsZWFreVJlbHVPcHRpb25zKToKKyAgICAgICAgeCA9IExlYWt5UmVsdU9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKGxlYWt5UmVsdU9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIExlYWt5UmVsdU9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgbGVha3lSZWx1T3B0aW9ucyk6CisgICAgICAgIGlmIGxlYWt5UmVsdU9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmFscGhhID0gbGVha3lSZWx1T3B0aW9ucy5BbHBoYSgpCisKKyAgICAjIExlYWt5UmVsdU9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIExlYWt5UmVsdU9wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICBMZWFreVJlbHVPcHRpb25zQWRkQWxwaGEoYnVpbGRlciwgc2VsZi5hbHBoYSkKKyAgICAgICAgbGVha3lSZWx1T3B0aW9ucyA9IExlYWt5UmVsdU9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIGxlYWt5UmVsdU9wdGlvbnMKKworCitjbGFzcyBTcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBTcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc1NxdWFyZWREaWZmZXJlbmNlT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFNxdWFyZWREaWZmZXJlbmNlT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgU3F1YXJlZERpZmZlcmVuY2VPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworZGVmIFNxdWFyZWREaWZmZXJlbmNlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIFNxdWFyZWREaWZmZXJlbmNlT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgU3F1YXJlZERpZmZlcmVuY2VPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBTcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHNxdWFyZWREaWZmZXJlbmNlT3B0aW9ucyA9IFNxdWFyZWREaWZmZXJlbmNlT3B0aW9ucygpCisgICAgICAgIHNxdWFyZWREaWZmZXJlbmNlT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHNxdWFyZWREaWZmZXJlbmNlT3B0aW9ucykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHNxdWFyZWREaWZmZXJlbmNlT3B0aW9ucyk6CisgICAgICAgIHggPSBTcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHNxdWFyZWREaWZmZXJlbmNlT3B0aW9ucykKKyAgICAgICAgcmV0dXJuIHgKKworICAgICMgU3F1YXJlZERpZmZlcmVuY2VPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIHNxdWFyZWREaWZmZXJlbmNlT3B0aW9ucyk6CisgICAgICAgIGlmIHNxdWFyZWREaWZmZXJlbmNlT3B0aW9ucyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAjIFNxdWFyZWREaWZmZXJlbmNlT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgU3F1YXJlZERpZmZlcmVuY2VPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgc3F1YXJlZERpZmZlcmVuY2VPcHRpb25zID0gU3F1YXJlZERpZmZlcmVuY2VPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBzcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnMKKworCitjbGFzcyBNaXJyb3JQYWRPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gTWlycm9yUGFkT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzTWlycm9yUGFkT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIE1pcnJvclBhZE9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIE1pcnJvclBhZE9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCisgICAgIyBNaXJyb3JQYWRPcHRpb25zCisgICAgZGVmIE1vZGUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCitkZWYgTWlycm9yUGFkT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMSkKKworZGVmIE1pcnJvclBhZE9wdGlvbnNBZGRNb2RlKGJ1aWxkZXIsIG1vZGUpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEludDhTbG90KDAsIG1vZGUsIDApCisKK2RlZiBNaXJyb3JQYWRPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBNaXJyb3JQYWRPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBNaXJyb3JQYWRPcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5tb2RlID0gMCAgIyB0eXBlOiBpbnQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgbWlycm9yUGFkT3B0aW9ucyA9IE1pcnJvclBhZE9wdGlvbnMoKQorICAgICAgICBtaXJyb3JQYWRPcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoobWlycm9yUGFkT3B0aW9ucykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIG1pcnJvclBhZE9wdGlvbnMpOgorICAgICAgICB4ID0gTWlycm9yUGFkT3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2sobWlycm9yUGFkT3B0aW9ucykKKyAgICAgICAgcmV0dXJuIHgKKworICAgICMgTWlycm9yUGFkT3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBtaXJyb3JQYWRPcHRpb25zKToKKyAgICAgICAgaWYgbWlycm9yUGFkT3B0aW9ucyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYubW9kZSA9IG1pcnJvclBhZE9wdGlvbnMuTW9kZSgpCisKKyAgICAjIE1pcnJvclBhZE9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIE1pcnJvclBhZE9wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICBNaXJyb3JQYWRPcHRpb25zQWRkTW9kZShidWlsZGVyLCBzZWxmLm1vZGUpCisgICAgICAgIG1pcnJvclBhZE9wdGlvbnMgPSBNaXJyb3JQYWRPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBtaXJyb3JQYWRPcHRpb25zCisKKworY2xhc3MgVW5pcXVlT3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IFVuaXF1ZU9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc1VuaXF1ZU9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBVbmlxdWVPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBVbmlxdWVPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworICAgICMgVW5pcXVlT3B0aW9ucworICAgIGRlZiBJZHhPdXRUeXBlKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50OEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDIKKworZGVmIFVuaXF1ZU9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDEpCisKK2RlZiBVbmlxdWVPcHRpb25zQWRkSWR4T3V0VHlwZShidWlsZGVyLCBpZHhPdXRUeXBlKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCgwLCBpZHhPdXRUeXBlLCAyKQorCitkZWYgVW5pcXVlT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgVW5pcXVlT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgVW5pcXVlT3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuaWR4T3V0VHlwZSA9IDIgICMgdHlwZTogaW50CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHVuaXF1ZU9wdGlvbnMgPSBVbmlxdWVPcHRpb25zKCkKKyAgICAgICAgdW5pcXVlT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHVuaXF1ZU9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCB1bmlxdWVPcHRpb25zKToKKyAgICAgICAgeCA9IFVuaXF1ZU9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHVuaXF1ZU9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFVuaXF1ZU9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgdW5pcXVlT3B0aW9ucyk6CisgICAgICAgIGlmIHVuaXF1ZU9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmlkeE91dFR5cGUgPSB1bmlxdWVPcHRpb25zLklkeE91dFR5cGUoKQorCisgICAgIyBVbmlxdWVPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBVbmlxdWVPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgVW5pcXVlT3B0aW9uc0FkZElkeE91dFR5cGUoYnVpbGRlciwgc2VsZi5pZHhPdXRUeXBlKQorICAgICAgICB1bmlxdWVPcHRpb25zID0gVW5pcXVlT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gdW5pcXVlT3B0aW9ucworCisKK2NsYXNzIFJldmVyc2VWMk9wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBSZXZlcnNlVjJPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNSZXZlcnNlVjJPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgorICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgUmV2ZXJzZVYyT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgUmV2ZXJzZVYyT3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKK2RlZiBSZXZlcnNlVjJPcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgwKQorCitkZWYgUmV2ZXJzZVYyT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgUmV2ZXJzZVYyT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgUmV2ZXJzZVYyT3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgcmV2ZXJzZVYyT3B0aW9ucyA9IFJldmVyc2VWMk9wdGlvbnMoKQorICAgICAgICByZXZlcnNlVjJPcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoocmV2ZXJzZVYyT3B0aW9ucykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHJldmVyc2VWMk9wdGlvbnMpOgorICAgICAgICB4ID0gUmV2ZXJzZVYyT3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2socmV2ZXJzZVYyT3B0aW9ucykKKyAgICAgICAgcmV0dXJuIHgKKworICAgICMgUmV2ZXJzZVYyT3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCByZXZlcnNlVjJPcHRpb25zKToKKyAgICAgICAgaWYgcmV2ZXJzZVYyT3B0aW9ucyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAjIFJldmVyc2VWMk9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIFJldmVyc2VWMk9wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICByZXZlcnNlVjJPcHRpb25zID0gUmV2ZXJzZVYyT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gcmV2ZXJzZVYyT3B0aW9ucworCisKK2NsYXNzIEFkZE5PcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gQWRkTk9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc0FkZE5PcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgorICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgQWRkTk9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIEFkZE5PcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworZGVmIEFkZE5PcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgwKQorCitkZWYgQWRkTk9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIEFkZE5PcHRpb25zVChvYmplY3QpOgorCisgICAgIyBBZGROT3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgYWRkTm9wdGlvbnMgPSBBZGROT3B0aW9ucygpCisgICAgICAgIGFkZE5vcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooYWRkTm9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBhZGROb3B0aW9ucyk6CisgICAgICAgIHggPSBBZGROT3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2soYWRkTm9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIEFkZE5PcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIGFkZE5vcHRpb25zKToKKyAgICAgICAgaWYgYWRkTm9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgIyBBZGROT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgQWRkTk9wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICBhZGROb3B0aW9ucyA9IEFkZE5PcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBhZGROb3B0aW9ucworCisKK2NsYXNzIEdhdGhlck5kT3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IEdhdGhlck5kT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzR2F0aGVyTmRPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgorICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2F0aGVyTmRPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBHYXRoZXJOZE9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCitkZWYgR2F0aGVyTmRPcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgwKQorCitkZWYgR2F0aGVyTmRPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBHYXRoZXJOZE9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIEdhdGhlck5kT3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgZ2F0aGVyTmRPcHRpb25zID0gR2F0aGVyTmRPcHRpb25zKCkKKyAgICAgICAgZ2F0aGVyTmRPcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooZ2F0aGVyTmRPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgZ2F0aGVyTmRPcHRpb25zKToKKyAgICAgICAgeCA9IEdhdGhlck5kT3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2soZ2F0aGVyTmRPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBHYXRoZXJOZE9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgZ2F0aGVyTmRPcHRpb25zKToKKyAgICAgICAgaWYgZ2F0aGVyTmRPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICMgR2F0aGVyTmRPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBHYXRoZXJOZE9wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICBnYXRoZXJOZE9wdGlvbnMgPSBHYXRoZXJOZE9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIGdhdGhlck5kT3B0aW9ucworCisKK2NsYXNzIFdoZXJlT3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IFdoZXJlT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzV2hlcmVPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgorICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgV2hlcmVPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBXaGVyZU9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCitkZWYgV2hlcmVPcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgwKQorCitkZWYgV2hlcmVPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBXaGVyZU9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIFdoZXJlT3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgd2hlcmVPcHRpb25zID0gV2hlcmVPcHRpb25zKCkKKyAgICAgICAgd2hlcmVPcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmood2hlcmVPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgd2hlcmVPcHRpb25zKToKKyAgICAgICAgeCA9IFdoZXJlT3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2sod2hlcmVPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBXaGVyZU9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgd2hlcmVPcHRpb25zKToKKyAgICAgICAgaWYgd2hlcmVPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICMgV2hlcmVPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBXaGVyZU9wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICB3aGVyZU9wdGlvbnMgPSBXaGVyZU9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHdoZXJlT3B0aW9ucworCisKK2NsYXNzIFJldmVyc2VTZXF1ZW5jZU9wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBSZXZlcnNlU2VxdWVuY2VPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNSZXZlcnNlU2VxdWVuY2VPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgorICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgUmV2ZXJzZVNlcXVlbmNlT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgUmV2ZXJzZVNlcXVlbmNlT3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKKyAgICAjIFJldmVyc2VTZXF1ZW5jZU9wdGlvbnMKKyAgICBkZWYgU2VxRGltKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFJldmVyc2VTZXF1ZW5jZU9wdGlvbnMKKyAgICBkZWYgQmF0Y2hEaW0oc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworZGVmIFJldmVyc2VTZXF1ZW5jZU9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDIpCisKK2RlZiBSZXZlcnNlU2VxdWVuY2VPcHRpb25zQWRkU2VxRGltKGJ1aWxkZXIsIHNlcURpbSk6CisgICAgYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDAsIHNlcURpbSwgMCkKKworZGVmIFJldmVyc2VTZXF1ZW5jZU9wdGlvbnNBZGRCYXRjaERpbShidWlsZGVyLCBiYXRjaERpbSk6CisgICAgYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDEsIGJhdGNoRGltLCAwKQorCitkZWYgUmV2ZXJzZVNlcXVlbmNlT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgUmV2ZXJzZVNlcXVlbmNlT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgUmV2ZXJzZVNlcXVlbmNlT3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuc2VxRGltID0gMCAgIyB0eXBlOiBpbnQKKyAgICAgICAgc2VsZi5iYXRjaERpbSA9IDAgICMgdHlwZTogaW50CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHJldmVyc2VTZXF1ZW5jZU9wdGlvbnMgPSBSZXZlcnNlU2VxdWVuY2VPcHRpb25zKCkKKyAgICAgICAgcmV2ZXJzZVNlcXVlbmNlT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHJldmVyc2VTZXF1ZW5jZU9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCByZXZlcnNlU2VxdWVuY2VPcHRpb25zKToKKyAgICAgICAgeCA9IFJldmVyc2VTZXF1ZW5jZU9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHJldmVyc2VTZXF1ZW5jZU9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFJldmVyc2VTZXF1ZW5jZU9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgcmV2ZXJzZVNlcXVlbmNlT3B0aW9ucyk6CisgICAgICAgIGlmIHJldmVyc2VTZXF1ZW5jZU9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnNlcURpbSA9IHJldmVyc2VTZXF1ZW5jZU9wdGlvbnMuU2VxRGltKCkKKyAgICAgICAgc2VsZi5iYXRjaERpbSA9IHJldmVyc2VTZXF1ZW5jZU9wdGlvbnMuQmF0Y2hEaW0oKQorCisgICAgIyBSZXZlcnNlU2VxdWVuY2VPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBSZXZlcnNlU2VxdWVuY2VPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgUmV2ZXJzZVNlcXVlbmNlT3B0aW9uc0FkZFNlcURpbShidWlsZGVyLCBzZWxmLnNlcURpbSkKKyAgICAgICAgUmV2ZXJzZVNlcXVlbmNlT3B0aW9uc0FkZEJhdGNoRGltKGJ1aWxkZXIsIHNlbGYuYmF0Y2hEaW0pCisgICAgICAgIHJldmVyc2VTZXF1ZW5jZU9wdGlvbnMgPSBSZXZlcnNlU2VxdWVuY2VPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiByZXZlcnNlU2VxdWVuY2VPcHRpb25zCisKKworY2xhc3MgTWF0cml4RGlhZ09wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBNYXRyaXhEaWFnT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzTWF0cml4RGlhZ09wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBNYXRyaXhEaWFnT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgTWF0cml4RGlhZ09wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCitkZWYgTWF0cml4RGlhZ09wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCisKK2RlZiBNYXRyaXhEaWFnT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgTWF0cml4RGlhZ09wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIE1hdHJpeERpYWdPcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICBtYXRyaXhEaWFnT3B0aW9ucyA9IE1hdHJpeERpYWdPcHRpb25zKCkKKyAgICAgICAgbWF0cml4RGlhZ09wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihtYXRyaXhEaWFnT3B0aW9ucykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIG1hdHJpeERpYWdPcHRpb25zKToKKyAgICAgICAgeCA9IE1hdHJpeERpYWdPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhtYXRyaXhEaWFnT3B0aW9ucykKKyAgICAgICAgcmV0dXJuIHgKKworICAgICMgTWF0cml4RGlhZ09wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgbWF0cml4RGlhZ09wdGlvbnMpOgorICAgICAgICBpZiBtYXRyaXhEaWFnT3B0aW9ucyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAjIE1hdHJpeERpYWdPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBNYXRyaXhEaWFnT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIG1hdHJpeERpYWdPcHRpb25zID0gTWF0cml4RGlhZ09wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIG1hdHJpeERpYWdPcHRpb25zCisKKworY2xhc3MgUXVhbnRpemVPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gUXVhbnRpemVPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNRdWFudGl6ZU9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBRdWFudGl6ZU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFF1YW50aXplT3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKK2RlZiBRdWFudGl6ZU9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCisKK2RlZiBRdWFudGl6ZU9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIFF1YW50aXplT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgUXVhbnRpemVPcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICBxdWFudGl6ZU9wdGlvbnMgPSBRdWFudGl6ZU9wdGlvbnMoKQorICAgICAgICBxdWFudGl6ZU9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihxdWFudGl6ZU9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBxdWFudGl6ZU9wdGlvbnMpOgorICAgICAgICB4ID0gUXVhbnRpemVPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhxdWFudGl6ZU9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFF1YW50aXplT3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBxdWFudGl6ZU9wdGlvbnMpOgorICAgICAgICBpZiBxdWFudGl6ZU9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgIyBRdWFudGl6ZU9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIFF1YW50aXplT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIHF1YW50aXplT3B0aW9ucyA9IFF1YW50aXplT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gcXVhbnRpemVPcHRpb25zCisKKworY2xhc3MgTWF0cml4U2V0RGlhZ09wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBNYXRyaXhTZXREaWFnT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzTWF0cml4U2V0RGlhZ09wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBNYXRyaXhTZXREaWFnT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgTWF0cml4U2V0RGlhZ09wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCitkZWYgTWF0cml4U2V0RGlhZ09wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCisKK2RlZiBNYXRyaXhTZXREaWFnT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgTWF0cml4U2V0RGlhZ09wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIE1hdHJpeFNldERpYWdPcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICBtYXRyaXhTZXREaWFnT3B0aW9ucyA9IE1hdHJpeFNldERpYWdPcHRpb25zKCkKKyAgICAgICAgbWF0cml4U2V0RGlhZ09wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihtYXRyaXhTZXREaWFnT3B0aW9ucykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIG1hdHJpeFNldERpYWdPcHRpb25zKToKKyAgICAgICAgeCA9IE1hdHJpeFNldERpYWdPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhtYXRyaXhTZXREaWFnT3B0aW9ucykKKyAgICAgICAgcmV0dXJuIHgKKworICAgICMgTWF0cml4U2V0RGlhZ09wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgbWF0cml4U2V0RGlhZ09wdGlvbnMpOgorICAgICAgICBpZiBtYXRyaXhTZXREaWFnT3B0aW9ucyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAjIE1hdHJpeFNldERpYWdPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBNYXRyaXhTZXREaWFnT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIG1hdHJpeFNldERpYWdPcHRpb25zID0gTWF0cml4U2V0RGlhZ09wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIG1hdHJpeFNldERpYWdPcHRpb25zCisKKworY2xhc3MgSWZPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gSWZPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNJZk9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJZk9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIElmT3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKKyAgICAjIElmT3B0aW9ucworICAgIGRlZiBUaGVuU3ViZ3JhcGhJbmRleChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBJZk9wdGlvbnMKKyAgICBkZWYgRWxzZVN1YmdyYXBoSW5kZXgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworZGVmIElmT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMikKKworZGVmIElmT3B0aW9uc0FkZFRoZW5TdWJncmFwaEluZGV4KGJ1aWxkZXIsIHRoZW5TdWJncmFwaEluZGV4KToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMCwgdGhlblN1YmdyYXBoSW5kZXgsIDApCisKK2RlZiBJZk9wdGlvbnNBZGRFbHNlU3ViZ3JhcGhJbmRleChidWlsZGVyLCBlbHNlU3ViZ3JhcGhJbmRleCk6CisgICAgYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDEsIGVsc2VTdWJncmFwaEluZGV4LCAwKQorCitkZWYgSWZPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBJZk9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIElmT3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYudGhlblN1YmdyYXBoSW5kZXggPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmVsc2VTdWJncmFwaEluZGV4ID0gMCAgIyB0eXBlOiBpbnQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgaWZPcHRpb25zID0gSWZPcHRpb25zKCkKKyAgICAgICAgaWZPcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooaWZPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgaWZPcHRpb25zKToKKyAgICAgICAgeCA9IElmT3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2soaWZPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBJZk9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgaWZPcHRpb25zKToKKyAgICAgICAgaWYgaWZPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi50aGVuU3ViZ3JhcGhJbmRleCA9IGlmT3B0aW9ucy5UaGVuU3ViZ3JhcGhJbmRleCgpCisgICAgICAgIHNlbGYuZWxzZVN1YmdyYXBoSW5kZXggPSBpZk9wdGlvbnMuRWxzZVN1YmdyYXBoSW5kZXgoKQorCisgICAgIyBJZk9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIElmT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIElmT3B0aW9uc0FkZFRoZW5TdWJncmFwaEluZGV4KGJ1aWxkZXIsIHNlbGYudGhlblN1YmdyYXBoSW5kZXgpCisgICAgICAgIElmT3B0aW9uc0FkZEVsc2VTdWJncmFwaEluZGV4KGJ1aWxkZXIsIHNlbGYuZWxzZVN1YmdyYXBoSW5kZXgpCisgICAgICAgIGlmT3B0aW9ucyA9IElmT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gaWZPcHRpb25zCisKKworY2xhc3MgQ2FsbE9uY2VPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gQ2FsbE9uY2VPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNDYWxsT25jZU9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBDYWxsT25jZU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIENhbGxPbmNlT3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKKyAgICAjIENhbGxPbmNlT3B0aW9ucworICAgIGRlZiBJbml0U3ViZ3JhcGhJbmRleChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCitkZWYgQ2FsbE9uY2VPcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgxKQorCitkZWYgQ2FsbE9uY2VPcHRpb25zQWRkSW5pdFN1YmdyYXBoSW5kZXgoYnVpbGRlciwgaW5pdFN1YmdyYXBoSW5kZXgpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEludDMyU2xvdCgwLCBpbml0U3ViZ3JhcGhJbmRleCwgMCkKKworZGVmIENhbGxPbmNlT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgQ2FsbE9uY2VPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBDYWxsT25jZU9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmluaXRTdWJncmFwaEluZGV4ID0gMCAgIyB0eXBlOiBpbnQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgY2FsbE9uY2VPcHRpb25zID0gQ2FsbE9uY2VPcHRpb25zKCkKKyAgICAgICAgY2FsbE9uY2VPcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooY2FsbE9uY2VPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgY2FsbE9uY2VPcHRpb25zKToKKyAgICAgICAgeCA9IENhbGxPbmNlT3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2soY2FsbE9uY2VPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBDYWxsT25jZU9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgY2FsbE9uY2VPcHRpb25zKToKKyAgICAgICAgaWYgY2FsbE9uY2VPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5pbml0U3ViZ3JhcGhJbmRleCA9IGNhbGxPbmNlT3B0aW9ucy5Jbml0U3ViZ3JhcGhJbmRleCgpCisKKyAgICAjIENhbGxPbmNlT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgQ2FsbE9uY2VPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgQ2FsbE9uY2VPcHRpb25zQWRkSW5pdFN1YmdyYXBoSW5kZXgoYnVpbGRlciwgc2VsZi5pbml0U3ViZ3JhcGhJbmRleCkKKyAgICAgICAgY2FsbE9uY2VPcHRpb25zID0gQ2FsbE9uY2VPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBjYWxsT25jZU9wdGlvbnMKKworCitjbGFzcyBXaGlsZU9wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBXaGlsZU9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc1doaWxlT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFdoaWxlT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgV2hpbGVPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworICAgICMgV2hpbGVPcHRpb25zCisgICAgZGVmIENvbmRTdWJncmFwaEluZGV4KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFdoaWxlT3B0aW9ucworICAgIGRlZiBCb2R5U3ViZ3JhcGhJbmRleChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCitkZWYgV2hpbGVPcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgyKQorCitkZWYgV2hpbGVPcHRpb25zQWRkQ29uZFN1YmdyYXBoSW5kZXgoYnVpbGRlciwgY29uZFN1YmdyYXBoSW5kZXgpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEludDMyU2xvdCgwLCBjb25kU3ViZ3JhcGhJbmRleCwgMCkKKworZGVmIFdoaWxlT3B0aW9uc0FkZEJvZHlTdWJncmFwaEluZGV4KGJ1aWxkZXIsIGJvZHlTdWJncmFwaEluZGV4KToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMSwgYm9keVN1YmdyYXBoSW5kZXgsIDApCisKK2RlZiBXaGlsZU9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIFdoaWxlT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgV2hpbGVPcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5jb25kU3ViZ3JhcGhJbmRleCA9IDAgICMgdHlwZTogaW50CisgICAgICAgIHNlbGYuYm9keVN1YmdyYXBoSW5kZXggPSAwICAjIHR5cGU6IGludAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICB3aGlsZU9wdGlvbnMgPSBXaGlsZU9wdGlvbnMoKQorICAgICAgICB3aGlsZU9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaih3aGlsZU9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCB3aGlsZU9wdGlvbnMpOgorICAgICAgICB4ID0gV2hpbGVPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayh3aGlsZU9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFdoaWxlT3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCB3aGlsZU9wdGlvbnMpOgorICAgICAgICBpZiB3aGlsZU9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmNvbmRTdWJncmFwaEluZGV4ID0gd2hpbGVPcHRpb25zLkNvbmRTdWJncmFwaEluZGV4KCkKKyAgICAgICAgc2VsZi5ib2R5U3ViZ3JhcGhJbmRleCA9IHdoaWxlT3B0aW9ucy5Cb2R5U3ViZ3JhcGhJbmRleCgpCisKKyAgICAjIFdoaWxlT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgV2hpbGVPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgV2hpbGVPcHRpb25zQWRkQ29uZFN1YmdyYXBoSW5kZXgoYnVpbGRlciwgc2VsZi5jb25kU3ViZ3JhcGhJbmRleCkKKyAgICAgICAgV2hpbGVPcHRpb25zQWRkQm9keVN1YmdyYXBoSW5kZXgoYnVpbGRlciwgc2VsZi5ib2R5U3ViZ3JhcGhJbmRleCkKKyAgICAgICAgd2hpbGVPcHRpb25zID0gV2hpbGVPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiB3aGlsZU9wdGlvbnMKKworCitjbGFzcyBOb25NYXhTdXBwcmVzc2lvblY0T3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IE5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNOb25NYXhTdXBwcmVzc2lvblY0T3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIE5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBOb25NYXhTdXBwcmVzc2lvblY0T3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKK2RlZiBOb25NYXhTdXBwcmVzc2lvblY0T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIE5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBOb25NYXhTdXBwcmVzc2lvblY0T3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgTm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIG5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zID0gTm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnMoKQorICAgICAgICBub25NYXhTdXBwcmVzc2lvblY0T3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKG5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgbm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnMpOgorICAgICAgICB4ID0gTm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKG5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBOb25NYXhTdXBwcmVzc2lvblY0T3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBub25NYXhTdXBwcmVzc2lvblY0T3B0aW9ucyk6CisgICAgICAgIGlmIG5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICMgTm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIE5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgbm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnMgPSBOb25NYXhTdXBwcmVzc2lvblY0T3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gbm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnMKKworCitjbGFzcyBOb25NYXhTdXBwcmVzc2lvblY1T3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNOb25NYXhTdXBwcmVzc2lvblY1T3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBOb25NYXhTdXBwcmVzc2lvblY1T3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKK2RlZiBOb25NYXhTdXBwcmVzc2lvblY1T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBOb25NYXhTdXBwcmVzc2lvblY1T3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgTm9uTWF4U3VwcHJlc3Npb25WNU9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIG5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zID0gTm9uTWF4U3VwcHJlc3Npb25WNU9wdGlvbnMoKQorICAgICAgICBub25NYXhTdXBwcmVzc2lvblY1T3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKG5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgbm9uTWF4U3VwcHJlc3Npb25WNU9wdGlvbnMpOgorICAgICAgICB4ID0gTm9uTWF4U3VwcHJlc3Npb25WNU9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKG5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBOb25NYXhTdXBwcmVzc2lvblY1T3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBub25NYXhTdXBwcmVzc2lvblY1T3B0aW9ucyk6CisgICAgICAgIGlmIG5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICMgTm9uTWF4U3VwcHJlc3Npb25WNU9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgbm9uTWF4U3VwcHJlc3Npb25WNU9wdGlvbnMgPSBOb25NYXhTdXBwcmVzc2lvblY1T3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gbm9uTWF4U3VwcHJlc3Npb25WNU9wdGlvbnMKKworCitjbGFzcyBTY2F0dGVyTmRPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gU2NhdHRlck5kT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzU2NhdHRlck5kT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFNjYXR0ZXJOZE9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFNjYXR0ZXJOZE9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCitkZWYgU2NhdHRlck5kT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIFNjYXR0ZXJOZE9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIFNjYXR0ZXJOZE9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIFNjYXR0ZXJOZE9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHNjYXR0ZXJOZE9wdGlvbnMgPSBTY2F0dGVyTmRPcHRpb25zKCkKKyAgICAgICAgc2NhdHRlck5kT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHNjYXR0ZXJOZE9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzY2F0dGVyTmRPcHRpb25zKToKKyAgICAgICAgeCA9IFNjYXR0ZXJOZE9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHNjYXR0ZXJOZE9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFNjYXR0ZXJOZE9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgc2NhdHRlck5kT3B0aW9ucyk6CisgICAgICAgIGlmIHNjYXR0ZXJOZE9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgIyBTY2F0dGVyTmRPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBTY2F0dGVyTmRPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgc2NhdHRlck5kT3B0aW9ucyA9IFNjYXR0ZXJOZE9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHNjYXR0ZXJOZE9wdGlvbnMKKworCitjbGFzcyBTZWxlY3RWMk9wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBTZWxlY3RWMk9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc1NlbGVjdFYyT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFNlbGVjdFYyT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgU2VsZWN0VjJPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworZGVmIFNlbGVjdFYyT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIFNlbGVjdFYyT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgU2VsZWN0VjJPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBTZWxlY3RWMk9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGVjdFYyT3B0aW9ucyA9IFNlbGVjdFYyT3B0aW9ucygpCisgICAgICAgIHNlbGVjdFYyT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHNlbGVjdFYyT3B0aW9ucykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHNlbGVjdFYyT3B0aW9ucyk6CisgICAgICAgIHggPSBTZWxlY3RWMk9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHNlbGVjdFYyT3B0aW9ucykKKyAgICAgICAgcmV0dXJuIHgKKworICAgICMgU2VsZWN0VjJPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIHNlbGVjdFYyT3B0aW9ucyk6CisgICAgICAgIGlmIHNlbGVjdFYyT3B0aW9ucyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAjIFNlbGVjdFYyT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgU2VsZWN0VjJPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgc2VsZWN0VjJPcHRpb25zID0gU2VsZWN0VjJPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBzZWxlY3RWMk9wdGlvbnMKKworCitjbGFzcyBEZW5zaWZ5T3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IERlbnNpZnlPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNEZW5zaWZ5T3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIERlbnNpZnlPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBEZW5zaWZ5T3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKK2RlZiBEZW5zaWZ5T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIERlbnNpZnlPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBEZW5zaWZ5T3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgRGVuc2lmeU9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIGRlbnNpZnlPcHRpb25zID0gRGVuc2lmeU9wdGlvbnMoKQorICAgICAgICBkZW5zaWZ5T3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGRlbnNpZnlPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgZGVuc2lmeU9wdGlvbnMpOgorICAgICAgICB4ID0gRGVuc2lmeU9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKGRlbnNpZnlPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBEZW5zaWZ5T3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBkZW5zaWZ5T3B0aW9ucyk6CisgICAgICAgIGlmIGRlbnNpZnlPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICMgRGVuc2lmeU9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIERlbnNpZnlPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgZGVuc2lmeU9wdGlvbnMgPSBEZW5zaWZ5T3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gZGVuc2lmeU9wdGlvbnMKKworCitjbGFzcyBTZWdtZW50U3VtT3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IFNlZ21lbnRTdW1PcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNTZWdtZW50U3VtT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFNlZ21lbnRTdW1PcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBTZWdtZW50U3VtT3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKK2RlZiBTZWdtZW50U3VtT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIFNlZ21lbnRTdW1PcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBTZWdtZW50U3VtT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgU2VnbWVudFN1bU9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHNlZ21lbnRTdW1PcHRpb25zID0gU2VnbWVudFN1bU9wdGlvbnMoKQorICAgICAgICBzZWdtZW50U3VtT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHNlZ21lbnRTdW1PcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgc2VnbWVudFN1bU9wdGlvbnMpOgorICAgICAgICB4ID0gU2VnbWVudFN1bU9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHNlZ21lbnRTdW1PcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBTZWdtZW50U3VtT3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBzZWdtZW50U3VtT3B0aW9ucyk6CisgICAgICAgIGlmIHNlZ21lbnRTdW1PcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICMgU2VnbWVudFN1bU9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIFNlZ21lbnRTdW1PcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgc2VnbWVudFN1bU9wdGlvbnMgPSBTZWdtZW50U3VtT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gc2VnbWVudFN1bU9wdGlvbnMKKworCitjbGFzcyBCYXRjaE1hdE11bE9wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBCYXRjaE1hdE11bE9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc0JhdGNoTWF0TXVsT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEJhdGNoTWF0TXVsT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgQmF0Y2hNYXRNdWxPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworICAgICMgQmF0Y2hNYXRNdWxPcHRpb25zCisgICAgZGVmIEFkalgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkJvb2xGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpKQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICMgQmF0Y2hNYXRNdWxPcHRpb25zCisgICAgZGVmIEFkalkoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkJvb2xGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpKQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICMgQmF0Y2hNYXRNdWxPcHRpb25zCisgICAgZGVmIEFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyhzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg4KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuQm9vbEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykpCisgICAgICAgIHJldHVybiBGYWxzZQorCitkZWYgQmF0Y2hNYXRNdWxPcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgzKQorCitkZWYgQmF0Y2hNYXRNdWxPcHRpb25zQWRkQWRqWChidWlsZGVyLCBhZGpYKToKKyAgICBidWlsZGVyLlByZXBlbmRCb29sU2xvdCgwLCBhZGpYLCAwKQorCitkZWYgQmF0Y2hNYXRNdWxPcHRpb25zQWRkQWRqWShidWlsZGVyLCBhZGpZKToKKyAgICBidWlsZGVyLlByZXBlbmRCb29sU2xvdCgxLCBhZGpZLCAwKQorCitkZWYgQmF0Y2hNYXRNdWxPcHRpb25zQWRkQXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKGJ1aWxkZXIsIGFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyk6CisgICAgYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoMiwgYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzLCAwKQorCitkZWYgQmF0Y2hNYXRNdWxPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBCYXRjaE1hdE11bE9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIEJhdGNoTWF0TXVsT3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuYWRqWCA9IEZhbHNlICAjIHR5cGU6IGJvb2wKKyAgICAgICAgc2VsZi5hZGpZID0gRmFsc2UgICMgdHlwZTogYm9vbAorICAgICAgICBzZWxmLmFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyA9IEZhbHNlICAjIHR5cGU6IGJvb2wKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgYmF0Y2hNYXRNdWxPcHRpb25zID0gQmF0Y2hNYXRNdWxPcHRpb25zKCkKKyAgICAgICAgYmF0Y2hNYXRNdWxPcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooYmF0Y2hNYXRNdWxPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgYmF0Y2hNYXRNdWxPcHRpb25zKToKKyAgICAgICAgeCA9IEJhdGNoTWF0TXVsT3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2soYmF0Y2hNYXRNdWxPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBCYXRjaE1hdE11bE9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgYmF0Y2hNYXRNdWxPcHRpb25zKToKKyAgICAgICAgaWYgYmF0Y2hNYXRNdWxPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5hZGpYID0gYmF0Y2hNYXRNdWxPcHRpb25zLkFkalgoKQorICAgICAgICBzZWxmLmFkalkgPSBiYXRjaE1hdE11bE9wdGlvbnMuQWRqWSgpCisgICAgICAgIHNlbGYuYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzID0gYmF0Y2hNYXRNdWxPcHRpb25zLkFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cygpCisKKyAgICAjIEJhdGNoTWF0TXVsT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgQmF0Y2hNYXRNdWxPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgQmF0Y2hNYXRNdWxPcHRpb25zQWRkQWRqWChidWlsZGVyLCBzZWxmLmFkalgpCisgICAgICAgIEJhdGNoTWF0TXVsT3B0aW9uc0FkZEFkalkoYnVpbGRlciwgc2VsZi5hZGpZKQorICAgICAgICBCYXRjaE1hdE11bE9wdGlvbnNBZGRBc3ltbWV0cmljUXVhbnRpemVJbnB1dHMoYnVpbGRlciwgc2VsZi5hc3ltbWV0cmljUXVhbnRpemVJbnB1dHMpCisgICAgICAgIGJhdGNoTWF0TXVsT3B0aW9ucyA9IEJhdGNoTWF0TXVsT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gYmF0Y2hNYXRNdWxPcHRpb25zCisKKworY2xhc3MgQ3Vtc3VtT3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IEN1bXN1bU9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc0N1bXN1bU9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBDdW1zdW1PcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBDdW1zdW1PcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworICAgICMgQ3Vtc3VtT3B0aW9ucworICAgIGRlZiBFeGNsdXNpdmUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkJvb2xGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpKQorICAgICAgICByZXR1cm4gRmFsc2UKKworICAgICMgQ3Vtc3VtT3B0aW9ucworICAgIGRlZiBSZXZlcnNlKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gYm9vbChzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5Cb29sRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKSkKKyAgICAgICAgcmV0dXJuIEZhbHNlCisKK2RlZiBDdW1zdW1PcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgyKQorCitkZWYgQ3Vtc3VtT3B0aW9uc0FkZEV4Y2x1c2l2ZShidWlsZGVyLCBleGNsdXNpdmUpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEJvb2xTbG90KDAsIGV4Y2x1c2l2ZSwgMCkKKworZGVmIEN1bXN1bU9wdGlvbnNBZGRSZXZlcnNlKGJ1aWxkZXIsIHJldmVyc2UpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEJvb2xTbG90KDEsIHJldmVyc2UsIDApCisKK2RlZiBDdW1zdW1PcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBDdW1zdW1PcHRpb25zVChvYmplY3QpOgorCisgICAgIyBDdW1zdW1PcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5leGNsdXNpdmUgPSBGYWxzZSAgIyB0eXBlOiBib29sCisgICAgICAgIHNlbGYucmV2ZXJzZSA9IEZhbHNlICAjIHR5cGU6IGJvb2wKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgY3Vtc3VtT3B0aW9ucyA9IEN1bXN1bU9wdGlvbnMoKQorICAgICAgICBjdW1zdW1PcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooY3Vtc3VtT3B0aW9ucykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGN1bXN1bU9wdGlvbnMpOgorICAgICAgICB4ID0gQ3Vtc3VtT3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2soY3Vtc3VtT3B0aW9ucykKKyAgICAgICAgcmV0dXJuIHgKKworICAgICMgQ3Vtc3VtT3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBjdW1zdW1PcHRpb25zKToKKyAgICAgICAgaWYgY3Vtc3VtT3B0aW9ucyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuZXhjbHVzaXZlID0gY3Vtc3VtT3B0aW9ucy5FeGNsdXNpdmUoKQorICAgICAgICBzZWxmLnJldmVyc2UgPSBjdW1zdW1PcHRpb25zLlJldmVyc2UoKQorCisgICAgIyBDdW1zdW1PcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBDdW1zdW1PcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgQ3Vtc3VtT3B0aW9uc0FkZEV4Y2x1c2l2ZShidWlsZGVyLCBzZWxmLmV4Y2x1c2l2ZSkKKyAgICAgICAgQ3Vtc3VtT3B0aW9uc0FkZFJldmVyc2UoYnVpbGRlciwgc2VsZi5yZXZlcnNlKQorICAgICAgICBjdW1zdW1PcHRpb25zID0gQ3Vtc3VtT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gY3Vtc3VtT3B0aW9ucworCisKK2NsYXNzIEJyb2FkY2FzdFRvT3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IEJyb2FkY2FzdFRvT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzQnJvYWRjYXN0VG9PcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgorICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgQnJvYWRjYXN0VG9PcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBCcm9hZGNhc3RUb09wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCitkZWYgQnJvYWRjYXN0VG9PcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgwKQorCitkZWYgQnJvYWRjYXN0VG9PcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBCcm9hZGNhc3RUb09wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIEJyb2FkY2FzdFRvT3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgYnJvYWRjYXN0VG9PcHRpb25zID0gQnJvYWRjYXN0VG9PcHRpb25zKCkKKyAgICAgICAgYnJvYWRjYXN0VG9PcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooYnJvYWRjYXN0VG9PcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgYnJvYWRjYXN0VG9PcHRpb25zKToKKyAgICAgICAgeCA9IEJyb2FkY2FzdFRvT3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2soYnJvYWRjYXN0VG9PcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBCcm9hZGNhc3RUb09wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgYnJvYWRjYXN0VG9PcHRpb25zKToKKyAgICAgICAgaWYgYnJvYWRjYXN0VG9PcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICMgQnJvYWRjYXN0VG9PcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBCcm9hZGNhc3RUb09wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICBicm9hZGNhc3RUb09wdGlvbnMgPSBCcm9hZGNhc3RUb09wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIGJyb2FkY2FzdFRvT3B0aW9ucworCisKK2NsYXNzIFJmZnQyZE9wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBSZmZ0MmRPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNSZmZ0MmRPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgorICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgUmZmdDJkT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgUmZmdDJkT3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKK2RlZiBSZmZ0MmRPcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgwKQorCitkZWYgUmZmdDJkT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgUmZmdDJkT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgUmZmdDJkT3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgcmZmdDJkT3B0aW9ucyA9IFJmZnQyZE9wdGlvbnMoKQorICAgICAgICByZmZ0MmRPcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoocmZmdDJkT3B0aW9ucykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHJmZnQyZE9wdGlvbnMpOgorICAgICAgICB4ID0gUmZmdDJkT3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2socmZmdDJkT3B0aW9ucykKKyAgICAgICAgcmV0dXJuIHgKKworICAgICMgUmZmdDJkT3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCByZmZ0MmRPcHRpb25zKToKKyAgICAgICAgaWYgcmZmdDJkT3B0aW9ucyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAjIFJmZnQyZE9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIFJmZnQyZE9wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICByZmZ0MmRPcHRpb25zID0gUmZmdDJkT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gcmZmdDJkT3B0aW9ucworCisKK2NsYXNzIEhhc2h0YWJsZU9wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBIYXNodGFibGVPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNIYXNodGFibGVPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgorICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSGFzaHRhYmxlT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgSGFzaHRhYmxlT3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKKyAgICAjIEhhc2h0YWJsZU9wdGlvbnMKKyAgICBkZWYgVGFibGVJZChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBIYXNodGFibGVPcHRpb25zCisgICAgZGVmIEtleUR0eXBlKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50OEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgSGFzaHRhYmxlT3B0aW9ucworICAgIGRlZiBWYWx1ZUR0eXBlKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50OEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworZGVmIEhhc2h0YWJsZU9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDMpCisKK2RlZiBIYXNodGFibGVPcHRpb25zQWRkVGFibGVJZChidWlsZGVyLCB0YWJsZUlkKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMCwgdGFibGVJZCwgMCkKKworZGVmIEhhc2h0YWJsZU9wdGlvbnNBZGRLZXlEdHlwZShidWlsZGVyLCBrZXlEdHlwZSk6CisgICAgYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoMSwga2V5RHR5cGUsIDApCisKK2RlZiBIYXNodGFibGVPcHRpb25zQWRkVmFsdWVEdHlwZShidWlsZGVyLCB2YWx1ZUR0eXBlKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCgyLCB2YWx1ZUR0eXBlLCAwKQorCitkZWYgSGFzaHRhYmxlT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgSGFzaHRhYmxlT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgSGFzaHRhYmxlT3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYudGFibGVJZCA9IDAgICMgdHlwZTogaW50CisgICAgICAgIHNlbGYua2V5RHR5cGUgPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLnZhbHVlRHR5cGUgPSAwICAjIHR5cGU6IGludAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICBoYXNodGFibGVPcHRpb25zID0gSGFzaHRhYmxlT3B0aW9ucygpCisgICAgICAgIGhhc2h0YWJsZU9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihoYXNodGFibGVPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgaGFzaHRhYmxlT3B0aW9ucyk6CisgICAgICAgIHggPSBIYXNodGFibGVPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhoYXNodGFibGVPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBIYXNodGFibGVPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIGhhc2h0YWJsZU9wdGlvbnMpOgorICAgICAgICBpZiBoYXNodGFibGVPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi50YWJsZUlkID0gaGFzaHRhYmxlT3B0aW9ucy5UYWJsZUlkKCkKKyAgICAgICAgc2VsZi5rZXlEdHlwZSA9IGhhc2h0YWJsZU9wdGlvbnMuS2V5RHR5cGUoKQorICAgICAgICBzZWxmLnZhbHVlRHR5cGUgPSBoYXNodGFibGVPcHRpb25zLlZhbHVlRHR5cGUoKQorCisgICAgIyBIYXNodGFibGVPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBIYXNodGFibGVPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgSGFzaHRhYmxlT3B0aW9uc0FkZFRhYmxlSWQoYnVpbGRlciwgc2VsZi50YWJsZUlkKQorICAgICAgICBIYXNodGFibGVPcHRpb25zQWRkS2V5RHR5cGUoYnVpbGRlciwgc2VsZi5rZXlEdHlwZSkKKyAgICAgICAgSGFzaHRhYmxlT3B0aW9uc0FkZFZhbHVlRHR5cGUoYnVpbGRlciwgc2VsZi52YWx1ZUR0eXBlKQorICAgICAgICBoYXNodGFibGVPcHRpb25zID0gSGFzaHRhYmxlT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gaGFzaHRhYmxlT3B0aW9ucworCisKK2NsYXNzIEhhc2h0YWJsZUZpbmRPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gSGFzaHRhYmxlRmluZE9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc0hhc2h0YWJsZUZpbmRPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgorICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSGFzaHRhYmxlRmluZE9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIEhhc2h0YWJsZUZpbmRPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworZGVmIEhhc2h0YWJsZUZpbmRPcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgwKQorCitkZWYgSGFzaHRhYmxlRmluZE9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIEhhc2h0YWJsZUZpbmRPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBIYXNodGFibGVGaW5kT3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgaGFzaHRhYmxlRmluZE9wdGlvbnMgPSBIYXNodGFibGVGaW5kT3B0aW9ucygpCisgICAgICAgIGhhc2h0YWJsZUZpbmRPcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooaGFzaHRhYmxlRmluZE9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBoYXNodGFibGVGaW5kT3B0aW9ucyk6CisgICAgICAgIHggPSBIYXNodGFibGVGaW5kT3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2soaGFzaHRhYmxlRmluZE9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIEhhc2h0YWJsZUZpbmRPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIGhhc2h0YWJsZUZpbmRPcHRpb25zKToKKyAgICAgICAgaWYgaGFzaHRhYmxlRmluZE9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgIyBIYXNodGFibGVGaW5kT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgSGFzaHRhYmxlRmluZE9wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICBoYXNodGFibGVGaW5kT3B0aW9ucyA9IEhhc2h0YWJsZUZpbmRPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBoYXNodGFibGVGaW5kT3B0aW9ucworCisKK2NsYXNzIEhhc2h0YWJsZUltcG9ydE9wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBIYXNodGFibGVJbXBvcnRPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNIYXNodGFibGVJbXBvcnRPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgorICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSGFzaHRhYmxlSW1wb3J0T3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgSGFzaHRhYmxlSW1wb3J0T3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKK2RlZiBIYXNodGFibGVJbXBvcnRPcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgwKQorCitkZWYgSGFzaHRhYmxlSW1wb3J0T3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgSGFzaHRhYmxlSW1wb3J0T3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgSGFzaHRhYmxlSW1wb3J0T3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgaGFzaHRhYmxlSW1wb3J0T3B0aW9ucyA9IEhhc2h0YWJsZUltcG9ydE9wdGlvbnMoKQorICAgICAgICBoYXNodGFibGVJbXBvcnRPcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooaGFzaHRhYmxlSW1wb3J0T3B0aW9ucykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGhhc2h0YWJsZUltcG9ydE9wdGlvbnMpOgorICAgICAgICB4ID0gSGFzaHRhYmxlSW1wb3J0T3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2soaGFzaHRhYmxlSW1wb3J0T3B0aW9ucykKKyAgICAgICAgcmV0dXJuIHgKKworICAgICMgSGFzaHRhYmxlSW1wb3J0T3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBoYXNodGFibGVJbXBvcnRPcHRpb25zKToKKyAgICAgICAgaWYgaGFzaHRhYmxlSW1wb3J0T3B0aW9ucyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAjIEhhc2h0YWJsZUltcG9ydE9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIEhhc2h0YWJsZUltcG9ydE9wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICBoYXNodGFibGVJbXBvcnRPcHRpb25zID0gSGFzaHRhYmxlSW1wb3J0T3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gaGFzaHRhYmxlSW1wb3J0T3B0aW9ucworCisKK2NsYXNzIEhhc2h0YWJsZVNpemVPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gSGFzaHRhYmxlU2l6ZU9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc0hhc2h0YWJsZVNpemVPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgorICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSGFzaHRhYmxlU2l6ZU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIEhhc2h0YWJsZVNpemVPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworZGVmIEhhc2h0YWJsZVNpemVPcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgwKQorCitkZWYgSGFzaHRhYmxlU2l6ZU9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIEhhc2h0YWJsZVNpemVPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBIYXNodGFibGVTaXplT3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgaGFzaHRhYmxlU2l6ZU9wdGlvbnMgPSBIYXNodGFibGVTaXplT3B0aW9ucygpCisgICAgICAgIGhhc2h0YWJsZVNpemVPcHRpb25zLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooaGFzaHRhYmxlU2l6ZU9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBoYXNodGFibGVTaXplT3B0aW9ucyk6CisgICAgICAgIHggPSBIYXNodGFibGVTaXplT3B0aW9uc1QoKQorICAgICAgICB4Ll9VblBhY2soaGFzaHRhYmxlU2l6ZU9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIEhhc2h0YWJsZVNpemVPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIGhhc2h0YWJsZVNpemVPcHRpb25zKToKKyAgICAgICAgaWYgaGFzaHRhYmxlU2l6ZU9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgIyBIYXNodGFibGVTaXplT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgSGFzaHRhYmxlU2l6ZU9wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICBoYXNodGFibGVTaXplT3B0aW9ucyA9IEhhc2h0YWJsZVNpemVPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBoYXNodGFibGVTaXplT3B0aW9ucworCisKK2NsYXNzIFZhckhhbmRsZU9wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBWYXJIYW5kbGVPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNWYXJIYW5kbGVPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgorICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgVmFySGFuZGxlT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgVmFySGFuZGxlT3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKKyAgICAjIFZhckhhbmRsZU9wdGlvbnMKKyAgICBkZWYgQ29udGFpbmVyKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlN0cmluZyhvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICMgVmFySGFuZGxlT3B0aW9ucworICAgIGRlZiBTaGFyZWROYW1lKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlN0cmluZyhvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIE5vbmUKKworZGVmIFZhckhhbmRsZU9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDIpCisKK2RlZiBWYXJIYW5kbGVPcHRpb25zQWRkQ29udGFpbmVyKGJ1aWxkZXIsIGNvbnRhaW5lcik6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMCwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShjb250YWluZXIpLCAwKQorCitkZWYgVmFySGFuZGxlT3B0aW9uc0FkZFNoYXJlZE5hbWUoYnVpbGRlciwgc2hhcmVkTmFtZSk6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMSwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzaGFyZWROYW1lKSwgMCkKKworZGVmIFZhckhhbmRsZU9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIFZhckhhbmRsZU9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIFZhckhhbmRsZU9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmNvbnRhaW5lciA9IE5vbmUgICMgdHlwZTogc3RyCisgICAgICAgIHNlbGYuc2hhcmVkTmFtZSA9IE5vbmUgICMgdHlwZTogc3RyCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHZhckhhbmRsZU9wdGlvbnMgPSBWYXJIYW5kbGVPcHRpb25zKCkKKyAgICAgICAgdmFySGFuZGxlT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHZhckhhbmRsZU9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCB2YXJIYW5kbGVPcHRpb25zKToKKyAgICAgICAgeCA9IFZhckhhbmRsZU9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHZhckhhbmRsZU9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFZhckhhbmRsZU9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgdmFySGFuZGxlT3B0aW9ucyk6CisgICAgICAgIGlmIHZhckhhbmRsZU9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLmNvbnRhaW5lciA9IHZhckhhbmRsZU9wdGlvbnMuQ29udGFpbmVyKCkKKyAgICAgICAgc2VsZi5zaGFyZWROYW1lID0gdmFySGFuZGxlT3B0aW9ucy5TaGFyZWROYW1lKCkKKworICAgICMgVmFySGFuZGxlT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgaWYgc2VsZi5jb250YWluZXIgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBjb250YWluZXIgPSBidWlsZGVyLkNyZWF0ZVN0cmluZyhzZWxmLmNvbnRhaW5lcikKKyAgICAgICAgaWYgc2VsZi5zaGFyZWROYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2hhcmVkTmFtZSA9IGJ1aWxkZXIuQ3JlYXRlU3RyaW5nKHNlbGYuc2hhcmVkTmFtZSkKKyAgICAgICAgVmFySGFuZGxlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIGlmIHNlbGYuY29udGFpbmVyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgVmFySGFuZGxlT3B0aW9uc0FkZENvbnRhaW5lcihidWlsZGVyLCBjb250YWluZXIpCisgICAgICAgIGlmIHNlbGYuc2hhcmVkTmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIFZhckhhbmRsZU9wdGlvbnNBZGRTaGFyZWROYW1lKGJ1aWxkZXIsIHNoYXJlZE5hbWUpCisgICAgICAgIHZhckhhbmRsZU9wdGlvbnMgPSBWYXJIYW5kbGVPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiB2YXJIYW5kbGVPcHRpb25zCisKKworY2xhc3MgUmVhZFZhcmlhYmxlT3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IFJlYWRWYXJpYWJsZU9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc1JlYWRWYXJpYWJsZU9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBSZWFkVmFyaWFibGVPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBSZWFkVmFyaWFibGVPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworZGVmIFJlYWRWYXJpYWJsZU9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCisKK2RlZiBSZWFkVmFyaWFibGVPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBSZWFkVmFyaWFibGVPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBSZWFkVmFyaWFibGVPcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICByZWFkVmFyaWFibGVPcHRpb25zID0gUmVhZFZhcmlhYmxlT3B0aW9ucygpCisgICAgICAgIHJlYWRWYXJpYWJsZU9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihyZWFkVmFyaWFibGVPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgcmVhZFZhcmlhYmxlT3B0aW9ucyk6CisgICAgICAgIHggPSBSZWFkVmFyaWFibGVPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhyZWFkVmFyaWFibGVPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBSZWFkVmFyaWFibGVPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIHJlYWRWYXJpYWJsZU9wdGlvbnMpOgorICAgICAgICBpZiByZWFkVmFyaWFibGVPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICMgUmVhZFZhcmlhYmxlT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgUmVhZFZhcmlhYmxlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIHJlYWRWYXJpYWJsZU9wdGlvbnMgPSBSZWFkVmFyaWFibGVPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiByZWFkVmFyaWFibGVPcHRpb25zCisKKworY2xhc3MgQXNzaWduVmFyaWFibGVPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gQXNzaWduVmFyaWFibGVPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNBc3NpZ25WYXJpYWJsZU9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBBc3NpZ25WYXJpYWJsZU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIEFzc2lnblZhcmlhYmxlT3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKK2RlZiBBc3NpZ25WYXJpYWJsZU9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCisKK2RlZiBBc3NpZ25WYXJpYWJsZU9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIEFzc2lnblZhcmlhYmxlT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgQXNzaWduVmFyaWFibGVPcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICBhc3NpZ25WYXJpYWJsZU9wdGlvbnMgPSBBc3NpZ25WYXJpYWJsZU9wdGlvbnMoKQorICAgICAgICBhc3NpZ25WYXJpYWJsZU9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihhc3NpZ25WYXJpYWJsZU9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBhc3NpZ25WYXJpYWJsZU9wdGlvbnMpOgorICAgICAgICB4ID0gQXNzaWduVmFyaWFibGVPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhhc3NpZ25WYXJpYWJsZU9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIEFzc2lnblZhcmlhYmxlT3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBhc3NpZ25WYXJpYWJsZU9wdGlvbnMpOgorICAgICAgICBpZiBhc3NpZ25WYXJpYWJsZU9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgIyBBc3NpZ25WYXJpYWJsZU9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIEFzc2lnblZhcmlhYmxlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIGFzc2lnblZhcmlhYmxlT3B0aW9ucyA9IEFzc2lnblZhcmlhYmxlT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gYXNzaWduVmFyaWFibGVPcHRpb25zCisKKworY2xhc3MgUmFuZG9tT3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IFJhbmRvbU9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc1JhbmRvbU9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBSYW5kb21PcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBSYW5kb21PcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworICAgICMgUmFuZG9tT3B0aW9ucworICAgIGRlZiBTZWVkKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFJhbmRvbU9wdGlvbnMKKyAgICBkZWYgU2VlZDIoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ2NEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworZGVmIFJhbmRvbU9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDIpCisKK2RlZiBSYW5kb21PcHRpb25zQWRkU2VlZChidWlsZGVyLCBzZWVkKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQ2NFNsb3QoMCwgc2VlZCwgMCkKKworZGVmIFJhbmRvbU9wdGlvbnNBZGRTZWVkMihidWlsZGVyLCBzZWVkMik6CisgICAgYnVpbGRlci5QcmVwZW5kSW50NjRTbG90KDEsIHNlZWQyLCAwKQorCitkZWYgUmFuZG9tT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgUmFuZG9tT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgUmFuZG9tT3B0aW9uc1QKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuc2VlZCA9IDAgICMgdHlwZTogaW50CisgICAgICAgIHNlbGYuc2VlZDIgPSAwICAjIHR5cGU6IGludAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICByYW5kb21PcHRpb25zID0gUmFuZG9tT3B0aW9ucygpCisgICAgICAgIHJhbmRvbU9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihyYW5kb21PcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgcmFuZG9tT3B0aW9ucyk6CisgICAgICAgIHggPSBSYW5kb21PcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhyYW5kb21PcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBSYW5kb21PcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIHJhbmRvbU9wdGlvbnMpOgorICAgICAgICBpZiByYW5kb21PcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5zZWVkID0gcmFuZG9tT3B0aW9ucy5TZWVkKCkKKyAgICAgICAgc2VsZi5zZWVkMiA9IHJhbmRvbU9wdGlvbnMuU2VlZDIoKQorCisgICAgIyBSYW5kb21PcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBSYW5kb21PcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgUmFuZG9tT3B0aW9uc0FkZFNlZWQoYnVpbGRlciwgc2VsZi5zZWVkKQorICAgICAgICBSYW5kb21PcHRpb25zQWRkU2VlZDIoYnVpbGRlciwgc2VsZi5zZWVkMikKKyAgICAgICAgcmFuZG9tT3B0aW9ucyA9IFJhbmRvbU9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHJhbmRvbU9wdGlvbnMKKworCitjbGFzcyBCdWNrZXRpemVPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gQnVja2V0aXplT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzQnVja2V0aXplT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEJ1Y2tldGl6ZU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIEJ1Y2tldGl6ZU9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCisgICAgIyBCdWNrZXRpemVPcHRpb25zCisgICAgZGVmIEJvdW5kYXJpZXMoc2VsZiwgaik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIGEgPSBzZWxmLl90YWIuVmVjdG9yKG8pCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuRmxvYXQzMkZsYWdzLCBhICsgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShqICogNCkpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIEJ1Y2tldGl6ZU9wdGlvbnMKKyAgICBkZWYgQm91bmRhcmllc0FzTnVtcHkoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0VmVjdG9yQXNOdW1weShmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuRmxvYXQzMkZsYWdzLCBvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBCdWNrZXRpemVPcHRpb25zCisgICAgZGVmIEJvdW5kYXJpZXNMZW5ndGgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuVmVjdG9yTGVuKG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIEJ1Y2tldGl6ZU9wdGlvbnMKKyAgICBkZWYgQm91bmRhcmllc0lzTm9uZShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgcmV0dXJuIG8gPT0gMAorCitkZWYgQnVja2V0aXplT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMSkKKworZGVmIEJ1Y2tldGl6ZU9wdGlvbnNBZGRCb3VuZGFyaWVzKGJ1aWxkZXIsIGJvdW5kYXJpZXMpOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDAsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoYm91bmRhcmllcyksIDApCisKK2RlZiBCdWNrZXRpemVPcHRpb25zU3RhcnRCb3VuZGFyaWVzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKKyAgICByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCkKKworZGVmIEJ1Y2tldGl6ZU9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCit0cnk6CisgICAgZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QKK2V4Y2VwdDoKKyAgICBwYXNzCisKK2NsYXNzIEJ1Y2tldGl6ZU9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIEJ1Y2tldGl6ZU9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmJvdW5kYXJpZXMgPSBOb25lICAjIHR5cGU6IExpc3RbZmxvYXRdCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIGJ1Y2tldGl6ZU9wdGlvbnMgPSBCdWNrZXRpemVPcHRpb25zKCkKKyAgICAgICAgYnVja2V0aXplT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGJ1Y2tldGl6ZU9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBidWNrZXRpemVPcHRpb25zKToKKyAgICAgICAgeCA9IEJ1Y2tldGl6ZU9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKGJ1Y2tldGl6ZU9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIEJ1Y2tldGl6ZU9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgYnVja2V0aXplT3B0aW9ucyk6CisgICAgICAgIGlmIGJ1Y2tldGl6ZU9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBub3QgYnVja2V0aXplT3B0aW9ucy5Cb3VuZGFyaWVzSXNOb25lKCk6CisgICAgICAgICAgICBpZiBucCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuYm91bmRhcmllcyA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoYnVja2V0aXplT3B0aW9ucy5Cb3VuZGFyaWVzTGVuZ3RoKCkpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmJvdW5kYXJpZXMuYXBwZW5kKGJ1Y2tldGl6ZU9wdGlvbnMuQm91bmRhcmllcyhpKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5ib3VuZGFyaWVzID0gYnVja2V0aXplT3B0aW9ucy5Cb3VuZGFyaWVzQXNOdW1weSgpCisKKyAgICAjIEJ1Y2tldGl6ZU9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIGlmIHNlbGYuYm91bmRhcmllcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG5wIGlzIG5vdCBOb25lIGFuZCB0eXBlKHNlbGYuYm91bmRhcmllcykgaXMgbnAubmRhcnJheToKKyAgICAgICAgICAgICAgICBib3VuZGFyaWVzID0gYnVpbGRlci5DcmVhdGVOdW1weVZlY3RvcihzZWxmLmJvdW5kYXJpZXMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIEJ1Y2tldGl6ZU9wdGlvbnNTdGFydEJvdW5kYXJpZXNWZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYuYm91bmRhcmllcykpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYuYm91bmRhcmllcykpKToKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5QcmVwZW5kRmxvYXQzMihzZWxmLmJvdW5kYXJpZXNbaV0pCisgICAgICAgICAgICAgICAgYm91bmRhcmllcyA9IGJ1aWxkZXIuRW5kVmVjdG9yKCkKKyAgICAgICAgQnVja2V0aXplT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIGlmIHNlbGYuYm91bmRhcmllcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIEJ1Y2tldGl6ZU9wdGlvbnNBZGRCb3VuZGFyaWVzKGJ1aWxkZXIsIGJvdW5kYXJpZXMpCisgICAgICAgIGJ1Y2tldGl6ZU9wdGlvbnMgPSBCdWNrZXRpemVPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBidWNrZXRpemVPcHRpb25zCisKKworY2xhc3MgR2VsdU9wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBHZWx1T3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzR2VsdU9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCisgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQorICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZWx1T3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgR2VsdU9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCisgICAgIyBHZWx1T3B0aW9ucworICAgIGRlZiBBcHByb3hpbWF0ZShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuQm9vbEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykpCisgICAgICAgIHJldHVybiBGYWxzZQorCitkZWYgR2VsdU9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDEpCisKK2RlZiBHZWx1T3B0aW9uc0FkZEFwcHJveGltYXRlKGJ1aWxkZXIsIGFwcHJveGltYXRlKToKKyAgICBidWlsZGVyLlByZXBlbmRCb29sU2xvdCgwLCBhcHByb3hpbWF0ZSwgMCkKKworZGVmIEdlbHVPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBHZWx1T3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgR2VsdU9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLmFwcHJveGltYXRlID0gRmFsc2UgICMgdHlwZTogYm9vbAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgorICAgICAgICBnZWx1T3B0aW9ucyA9IEdlbHVPcHRpb25zKCkKKyAgICAgICAgZ2VsdU9wdGlvbnMuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihnZWx1T3B0aW9ucykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGdlbHVPcHRpb25zKToKKyAgICAgICAgeCA9IEdlbHVPcHRpb25zVCgpCisgICAgICAgIHguX1VuUGFjayhnZWx1T3B0aW9ucykKKyAgICAgICAgcmV0dXJuIHgKKworICAgICMgR2VsdU9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgZ2VsdU9wdGlvbnMpOgorICAgICAgICBpZiBnZWx1T3B0aW9ucyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuYXBwcm94aW1hdGUgPSBnZWx1T3B0aW9ucy5BcHByb3hpbWF0ZSgpCisKKyAgICAjIEdlbHVPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBHZWx1T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIEdlbHVPcHRpb25zQWRkQXBwcm94aW1hdGUoYnVpbGRlciwgc2VsZi5hcHByb3hpbWF0ZSkKKyAgICAgICAgZ2VsdU9wdGlvbnMgPSBHZWx1T3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gZ2VsdU9wdGlvbnMKKworCitjbGFzcyBEeW5hbWljVXBkYXRlU2xpY2VPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gRHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzRHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCitkZWYgRHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIGR5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnMgPSBEeW5hbWljVXBkYXRlU2xpY2VPcHRpb25zKCkKKyAgICAgICAgZHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGR5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBkeW5hbWljVXBkYXRlU2xpY2VPcHRpb25zKToKKyAgICAgICAgeCA9IER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKGR5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgZHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9ucyk6CisgICAgICAgIGlmIGR5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgIyBEeW5hbWljVXBkYXRlU2xpY2VPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBEeW5hbWljVXBkYXRlU2xpY2VPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgZHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9ucyA9IER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIGR5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnMKKworCitjbGFzcyBVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IFVuc29ydGVkU2VnbWVudFByb2RPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFVuc29ydGVkU2VnbWVudFByb2RPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKK2RlZiBVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIFVuc29ydGVkU2VnbWVudFByb2RPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgVW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHVuc29ydGVkU2VnbWVudFByb2RPcHRpb25zID0gVW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnMoKQorICAgICAgICB1bnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHVuc29ydGVkU2VnbWVudFByb2RPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgdW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnMpOgorICAgICAgICB4ID0gVW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHVuc29ydGVkU2VnbWVudFByb2RPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCB1bnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9ucyk6CisgICAgICAgIGlmIHVuc29ydGVkU2VnbWVudFByb2RPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICMgVW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIFVuc29ydGVkU2VnbWVudFByb2RPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgdW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnMgPSBVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gdW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnMKKworCitjbGFzcyBVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gVW5zb3J0ZWRTZWdtZW50TWF4T3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzVW5zb3J0ZWRTZWdtZW50TWF4T3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFVuc29ydGVkU2VnbWVudE1heE9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFVuc29ydGVkU2VnbWVudE1heE9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCitkZWYgVW5zb3J0ZWRTZWdtZW50TWF4T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIFVuc29ydGVkU2VnbWVudE1heE9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIFVuc29ydGVkU2VnbWVudE1heE9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIFVuc29ydGVkU2VnbWVudE1heE9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHVuc29ydGVkU2VnbWVudE1heE9wdGlvbnMgPSBVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zKCkKKyAgICAgICAgdW5zb3J0ZWRTZWdtZW50TWF4T3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHVuc29ydGVkU2VnbWVudE1heE9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCB1bnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zKToKKyAgICAgICAgeCA9IFVuc29ydGVkU2VnbWVudE1heE9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHVuc29ydGVkU2VnbWVudE1heE9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFVuc29ydGVkU2VnbWVudE1heE9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgdW5zb3J0ZWRTZWdtZW50TWF4T3B0aW9ucyk6CisgICAgICAgIGlmIHVuc29ydGVkU2VnbWVudE1heE9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgIyBVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgdW5zb3J0ZWRTZWdtZW50TWF4T3B0aW9ucyA9IFVuc29ydGVkU2VnbWVudE1heE9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHVuc29ydGVkU2VnbWVudE1heE9wdGlvbnMKKworCitjbGFzcyBVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gVW5zb3J0ZWRTZWdtZW50U3VtT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzVW5zb3J0ZWRTZWdtZW50U3VtT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCitkZWYgVW5zb3J0ZWRTZWdtZW50U3VtT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIFVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIFVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIFVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnMgPSBVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zKCkKKyAgICAgICAgdW5zb3J0ZWRTZWdtZW50U3VtT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCB1bnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zKToKKyAgICAgICAgeCA9IFVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgdW5zb3J0ZWRTZWdtZW50U3VtT3B0aW9ucyk6CisgICAgICAgIGlmIHVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgIyBVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgdW5zb3J0ZWRTZWdtZW50U3VtT3B0aW9ucyA9IFVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnMKKworCitjbGFzcyBBVGFuMk9wdGlvbnMob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBBVGFuMk9wdGlvbnMoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc0FUYW4yT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEFUYW4yT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgQVRhbjJPcHRpb25zCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworZGVmIEFUYW4yT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIEFUYW4yT3B0aW9uc0VuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKKworY2xhc3MgQVRhbjJPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBBVGFuMk9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIGF0YW4yT3B0aW9ucyA9IEFUYW4yT3B0aW9ucygpCisgICAgICAgIGF0YW4yT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGF0YW4yT3B0aW9ucykKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIGF0YW4yT3B0aW9ucyk6CisgICAgICAgIHggPSBBVGFuMk9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKGF0YW4yT3B0aW9ucykKKyAgICAgICAgcmV0dXJuIHgKKworICAgICMgQVRhbjJPcHRpb25zVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIGF0YW4yT3B0aW9ucyk6CisgICAgICAgIGlmIGF0YW4yT3B0aW9ucyBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisKKyAgICAjIEFUYW4yT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgQVRhbjJPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgYXRhbjJPcHRpb25zID0gQVRhbjJPcHRpb25zRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBhdGFuMk9wdGlvbnMKKworCitjbGFzcyBVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gVW5zb3J0ZWRTZWdtZW50TWluT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzVW5zb3J0ZWRTZWdtZW50TWluT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCitkZWYgVW5zb3J0ZWRTZWdtZW50TWluT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIFVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIFVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIFVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnMgPSBVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zKCkKKyAgICAgICAgdW5zb3J0ZWRTZWdtZW50TWluT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCB1bnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zKToKKyAgICAgICAgeCA9IFVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgdW5zb3J0ZWRTZWdtZW50TWluT3B0aW9ucyk6CisgICAgICAgIGlmIHVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgIyBVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgdW5zb3J0ZWRTZWdtZW50TWluT3B0aW9ucyA9IFVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnMKKworCitjbGFzcyBTaWduT3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IFNpZ25PcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNTaWduT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFNpZ25PcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBTaWduT3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKK2RlZiBTaWduT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIFNpZ25PcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBTaWduT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgU2lnbk9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHNpZ25PcHRpb25zID0gU2lnbk9wdGlvbnMoKQorICAgICAgICBzaWduT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHNpZ25PcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgc2lnbk9wdGlvbnMpOgorICAgICAgICB4ID0gU2lnbk9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHNpZ25PcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBTaWduT3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBzaWduT3B0aW9ucyk6CisgICAgICAgIGlmIHNpZ25PcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICMgU2lnbk9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIFNpZ25PcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgc2lnbk9wdGlvbnMgPSBTaWduT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gc2lnbk9wdGlvbnMKKworCitjbGFzcyBCaXRjYXN0T3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IEJpdGNhc3RPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNCaXRjYXN0T3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEJpdGNhc3RPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBCaXRjYXN0T3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKK2RlZiBCaXRjYXN0T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIEJpdGNhc3RPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBCaXRjYXN0T3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgQml0Y2FzdE9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIGJpdGNhc3RPcHRpb25zID0gQml0Y2FzdE9wdGlvbnMoKQorICAgICAgICBiaXRjYXN0T3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGJpdGNhc3RPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgYml0Y2FzdE9wdGlvbnMpOgorICAgICAgICB4ID0gQml0Y2FzdE9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKGJpdGNhc3RPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBCaXRjYXN0T3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBiaXRjYXN0T3B0aW9ucyk6CisgICAgICAgIGlmIGJpdGNhc3RPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICMgQml0Y2FzdE9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIEJpdGNhc3RPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgYml0Y2FzdE9wdGlvbnMgPSBCaXRjYXN0T3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gYml0Y2FzdE9wdGlvbnMKKworCitjbGFzcyBCaXR3aXNlWG9yT3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IEJpdHdpc2VYb3JPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNCaXR3aXNlWG9yT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEJpdHdpc2VYb3JPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBCaXR3aXNlWG9yT3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKK2RlZiBCaXR3aXNlWG9yT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIEJpdHdpc2VYb3JPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBCaXR3aXNlWG9yT3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgQml0d2lzZVhvck9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIGJpdHdpc2VYb3JPcHRpb25zID0gQml0d2lzZVhvck9wdGlvbnMoKQorICAgICAgICBiaXR3aXNlWG9yT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGJpdHdpc2VYb3JPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgYml0d2lzZVhvck9wdGlvbnMpOgorICAgICAgICB4ID0gQml0d2lzZVhvck9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKGJpdHdpc2VYb3JPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBCaXR3aXNlWG9yT3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBiaXR3aXNlWG9yT3B0aW9ucyk6CisgICAgICAgIGlmIGJpdHdpc2VYb3JPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICMgQml0d2lzZVhvck9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIEJpdHdpc2VYb3JPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgYml0d2lzZVhvck9wdGlvbnMgPSBCaXR3aXNlWG9yT3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gYml0d2lzZVhvck9wdGlvbnMKKworCitjbGFzcyBSaWdodFNoaWZ0T3B0aW9ucyhvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IFJpZ2h0U2hpZnRPcHRpb25zKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNSaWdodFNoaWZ0T3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFJpZ2h0U2hpZnRPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBSaWdodFNoaWZ0T3B0aW9ucworICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKK2RlZiBSaWdodFNoaWZ0T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIFJpZ2h0U2hpZnRPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBSaWdodFNoaWZ0T3B0aW9uc1Qob2JqZWN0KToKKworICAgICMgUmlnaHRTaGlmdE9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHJpZ2h0U2hpZnRPcHRpb25zID0gUmlnaHRTaGlmdE9wdGlvbnMoKQorICAgICAgICByaWdodFNoaWZ0T3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHJpZ2h0U2hpZnRPcHRpb25zKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgcmlnaHRTaGlmdE9wdGlvbnMpOgorICAgICAgICB4ID0gUmlnaHRTaGlmdE9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHJpZ2h0U2hpZnRPcHRpb25zKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBSaWdodFNoaWZ0T3B0aW9uc1QKKyAgICBkZWYgX1VuUGFjayhzZWxmLCByaWdodFNoaWZ0T3B0aW9ucyk6CisgICAgICAgIGlmIHJpZ2h0U2hpZnRPcHRpb25zIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKworICAgICMgUmlnaHRTaGlmdE9wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIFJpZ2h0U2hpZnRPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgcmlnaHRTaGlmdE9wdGlvbnMgPSBSaWdodFNoaWZ0T3B0aW9uc0VuZChidWlsZGVyKQorICAgICAgICByZXR1cm4gcmlnaHRTaGlmdE9wdGlvbnMKKworCitjbGFzcyBEaWxhdGVPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gRGlsYXRlT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzRGlsYXRlT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIERpbGF0ZU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIERpbGF0ZU9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCitkZWYgRGlsYXRlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKKworZGVmIERpbGF0ZU9wdGlvbnNFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIERpbGF0ZU9wdGlvbnNUKG9iamVjdCk6CisKKyAgICAjIERpbGF0ZU9wdGlvbnNUCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIGRpbGF0ZU9wdGlvbnMgPSBEaWxhdGVPcHRpb25zKCkKKyAgICAgICAgZGlsYXRlT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKGRpbGF0ZU9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBkaWxhdGVPcHRpb25zKToKKyAgICAgICAgeCA9IERpbGF0ZU9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKGRpbGF0ZU9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIERpbGF0ZU9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgZGlsYXRlT3B0aW9ucyk6CisgICAgICAgIGlmIGRpbGF0ZU9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgIyBEaWxhdGVPcHRpb25zVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBEaWxhdGVPcHRpb25zU3RhcnQoYnVpbGRlcikKKyAgICAgICAgZGlsYXRlT3B0aW9ucyA9IERpbGF0ZU9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIGRpbGF0ZU9wdGlvbnMKKworCitjbGFzcyBSZWR1Y2VXaW5kb3dPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gUmVkdWNlV2luZG93T3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzUmVkdWNlV2luZG93T3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFJlZHVjZVdpbmRvd09wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFJlZHVjZVdpbmRvd09wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCisgICAgIyBSZWR1Y2VXaW5kb3dPcHRpb25zCisgICAgZGVmIFJlZHVjZUZ1bmN0aW9uKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKK2RlZiBSZWR1Y2VXaW5kb3dPcHRpb25zU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgxKQorCitkZWYgUmVkdWNlV2luZG93T3B0aW9uc0FkZFJlZHVjZUZ1bmN0aW9uKGJ1aWxkZXIsIHJlZHVjZUZ1bmN0aW9uKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMCwgcmVkdWNlRnVuY3Rpb24sIDApCisKK2RlZiBSZWR1Y2VXaW5kb3dPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKworCitjbGFzcyBSZWR1Y2VXaW5kb3dPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBSZWR1Y2VXaW5kb3dPcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5yZWR1Y2VGdW5jdGlvbiA9IDAgICMgdHlwZTogaW50CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHJlZHVjZVdpbmRvd09wdGlvbnMgPSBSZWR1Y2VXaW5kb3dPcHRpb25zKCkKKyAgICAgICAgcmVkdWNlV2luZG93T3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHJlZHVjZVdpbmRvd09wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCByZWR1Y2VXaW5kb3dPcHRpb25zKToKKyAgICAgICAgeCA9IFJlZHVjZVdpbmRvd09wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHJlZHVjZVdpbmRvd09wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFJlZHVjZVdpbmRvd09wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgcmVkdWNlV2luZG93T3B0aW9ucyk6CisgICAgICAgIGlmIHJlZHVjZVdpbmRvd09wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnJlZHVjZUZ1bmN0aW9uID0gcmVkdWNlV2luZG93T3B0aW9ucy5SZWR1Y2VGdW5jdGlvbigpCisKKyAgICAjIFJlZHVjZVdpbmRvd09wdGlvbnNUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIFJlZHVjZVdpbmRvd09wdGlvbnNTdGFydChidWlsZGVyKQorICAgICAgICBSZWR1Y2VXaW5kb3dPcHRpb25zQWRkUmVkdWNlRnVuY3Rpb24oYnVpbGRlciwgc2VsZi5yZWR1Y2VGdW5jdGlvbikKKyAgICAgICAgcmVkdWNlV2luZG93T3B0aW9ucyA9IFJlZHVjZVdpbmRvd09wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHJlZHVjZVdpbmRvd09wdGlvbnMKKworCitjbGFzcyBPcGVyYXRvckNvZGUob2JqZWN0KToKKyAgICBfX3Nsb3RzX18gPSBbJ190YWInXQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCisgICAgICAgIHggPSBPcGVyYXRvckNvZGUoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc09wZXJhdG9yQ29kZShjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIE9wZXJhdG9yQ29kZUJ1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKKworICAgICMgT3BlcmF0b3JDb2RlCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworICAgICMgT3BlcmF0b3JDb2RlCisgICAgZGVmIERlcHJlY2F0ZWRCdWlsdGluQ29kZShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDhGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIE9wZXJhdG9yQ29kZQorICAgIGRlZiBDdXN0b21Db2RlKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlN0cmluZyhvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgICMgT3BlcmF0b3JDb2RlCisgICAgZGVmIFZlcnNpb24oc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDEKKworICAgICMgT3BlcmF0b3JDb2RlCisgICAgZGVmIEJ1aWx0aW5Db2RlKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEwKSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gMAorCitkZWYgT3BlcmF0b3JDb2RlU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCg0KQorCitkZWYgT3BlcmF0b3JDb2RlQWRkRGVwcmVjYXRlZEJ1aWx0aW5Db2RlKGJ1aWxkZXIsIGRlcHJlY2F0ZWRCdWlsdGluQ29kZSk6CisgICAgYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoMCwgZGVwcmVjYXRlZEJ1aWx0aW5Db2RlLCAwKQorCitkZWYgT3BlcmF0b3JDb2RlQWRkQ3VzdG9tQ29kZShidWlsZGVyLCBjdXN0b21Db2RlKToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgxLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGN1c3RvbUNvZGUpLCAwKQorCitkZWYgT3BlcmF0b3JDb2RlQWRkVmVyc2lvbihidWlsZGVyLCB2ZXJzaW9uKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMiwgdmVyc2lvbiwgMSkKKworZGVmIE9wZXJhdG9yQ29kZUFkZEJ1aWx0aW5Db2RlKGJ1aWxkZXIsIGJ1aWx0aW5Db2RlKToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMywgYnVpbHRpbkNvZGUsIDApCisKK2RlZiBPcGVyYXRvckNvZGVFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCisKK2NsYXNzIE9wZXJhdG9yQ29kZVQob2JqZWN0KToKKworICAgICMgT3BlcmF0b3JDb2RlVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5kZXByZWNhdGVkQnVpbHRpbkNvZGUgPSAwICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmN1c3RvbUNvZGUgPSBOb25lICAjIHR5cGU6IHN0cgorICAgICAgICBzZWxmLnZlcnNpb24gPSAxICAjIHR5cGU6IGludAorICAgICAgICBzZWxmLmJ1aWx0aW5Db2RlID0gMCAgIyB0eXBlOiBpbnQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgb3BlcmF0b3JDb2RlID0gT3BlcmF0b3JDb2RlKCkKKyAgICAgICAgb3BlcmF0b3JDb2RlLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoob3BlcmF0b3JDb2RlKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgb3BlcmF0b3JDb2RlKToKKyAgICAgICAgeCA9IE9wZXJhdG9yQ29kZVQoKQorICAgICAgICB4Ll9VblBhY2sob3BlcmF0b3JDb2RlKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBPcGVyYXRvckNvZGVUCisgICAgZGVmIF9VblBhY2soc2VsZiwgb3BlcmF0b3JDb2RlKToKKyAgICAgICAgaWYgb3BlcmF0b3JDb2RlIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5kZXByZWNhdGVkQnVpbHRpbkNvZGUgPSBvcGVyYXRvckNvZGUuRGVwcmVjYXRlZEJ1aWx0aW5Db2RlKCkKKyAgICAgICAgc2VsZi5jdXN0b21Db2RlID0gb3BlcmF0b3JDb2RlLkN1c3RvbUNvZGUoKQorICAgICAgICBzZWxmLnZlcnNpb24gPSBvcGVyYXRvckNvZGUuVmVyc2lvbigpCisgICAgICAgIHNlbGYuYnVpbHRpbkNvZGUgPSBvcGVyYXRvckNvZGUuQnVpbHRpbkNvZGUoKQorCisgICAgIyBPcGVyYXRvckNvZGVUCisgICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6CisgICAgICAgIGlmIHNlbGYuY3VzdG9tQ29kZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGN1c3RvbUNvZGUgPSBidWlsZGVyLkNyZWF0ZVN0cmluZyhzZWxmLmN1c3RvbUNvZGUpCisgICAgICAgIE9wZXJhdG9yQ29kZVN0YXJ0KGJ1aWxkZXIpCisgICAgICAgIE9wZXJhdG9yQ29kZUFkZERlcHJlY2F0ZWRCdWlsdGluQ29kZShidWlsZGVyLCBzZWxmLmRlcHJlY2F0ZWRCdWlsdGluQ29kZSkKKyAgICAgICAgaWYgc2VsZi5jdXN0b21Db2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgT3BlcmF0b3JDb2RlQWRkQ3VzdG9tQ29kZShidWlsZGVyLCBjdXN0b21Db2RlKQorICAgICAgICBPcGVyYXRvckNvZGVBZGRWZXJzaW9uKGJ1aWxkZXIsIHNlbGYudmVyc2lvbikKKyAgICAgICAgT3BlcmF0b3JDb2RlQWRkQnVpbHRpbkNvZGUoYnVpbGRlciwgc2VsZi5idWlsdGluQ29kZSkKKyAgICAgICAgb3BlcmF0b3JDb2RlID0gT3BlcmF0b3JDb2RlRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBvcGVyYXRvckNvZGUKKworCitjbGFzcyBTdGFibGVITE9Db21wb3NpdGVPcHRpb25zKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9ucygpCisgICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCisgICAgICAgIHJldHVybiB4CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIFN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIFN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnMKKyAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6CisgICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQorCisgICAgIyBTdGFibGVITE9Db21wb3NpdGVPcHRpb25zCisgICAgZGVmIE5hbWUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuU3RyaW5nKG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgIyBTdGFibGVITE9Db21wb3NpdGVPcHRpb25zCisgICAgZGVmIERlY29tcG9zaXRpb25TdWJncmFwaEluZGV4KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnMKKyAgICBkZWYgQ29tcG9zaXRlQXR0cmlidXRlcyhzZWxmLCBqKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg4KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgYSA9IHNlbGYuX3RhYi5WZWN0b3IobykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VaW50OEZsYWdzLCBhICsgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShqICogMSkpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnMKKyAgICBkZWYgQ29tcG9zaXRlQXR0cmlidXRlc0FzTnVtcHkoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0VmVjdG9yQXNOdW1weShmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVWludDhGbGFncywgbykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9ucworICAgIGRlZiBDb21wb3NpdGVBdHRyaWJ1dGVzTGVuZ3RoKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlZlY3RvckxlbihvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBTdGFibGVITE9Db21wb3NpdGVPcHRpb25zCisgICAgZGVmIENvbXBvc2l0ZUF0dHJpYnV0ZXNJc05vbmUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCisgICAgICAgIHJldHVybiBvID09IDAKKworICAgICMgU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9ucworICAgIGRlZiBDb21wb3NpdGVBdHRyaWJ1dGVzRm9ybWF0KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEwKSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDhGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIFN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnMKKyAgICBkZWYgVmVyc2lvbihzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworZGVmIFN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnNTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDUpCisKK2RlZiBTdGFibGVITE9Db21wb3NpdGVPcHRpb25zQWRkTmFtZShidWlsZGVyLCBuYW1lKToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgwLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKG5hbWUpLCAwKQorCitkZWYgU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9uc0FkZERlY29tcG9zaXRpb25TdWJncmFwaEluZGV4KGJ1aWxkZXIsIGRlY29tcG9zaXRpb25TdWJncmFwaEluZGV4KToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMSwgZGVjb21wb3NpdGlvblN1YmdyYXBoSW5kZXgsIDApCisKK2RlZiBTdGFibGVITE9Db21wb3NpdGVPcHRpb25zQWRkQ29tcG9zaXRlQXR0cmlidXRlcyhidWlsZGVyLCBjb21wb3NpdGVBdHRyaWJ1dGVzKToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgyLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGNvbXBvc2l0ZUF0dHJpYnV0ZXMpLCAwKQorCitkZWYgU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9uc1N0YXJ0Q29tcG9zaXRlQXR0cmlidXRlc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6CisgICAgcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoMSwgbnVtRWxlbXMsIDEpCisKK2RlZiBTdGFibGVITE9Db21wb3NpdGVPcHRpb25zQWRkQ29tcG9zaXRlQXR0cmlidXRlc0Zvcm1hdChidWlsZGVyLCBjb21wb3NpdGVBdHRyaWJ1dGVzRm9ybWF0KToKKyAgICBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCgzLCBjb21wb3NpdGVBdHRyaWJ1dGVzRm9ybWF0LCAwKQorCitkZWYgU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9uc0FkZFZlcnNpb24oYnVpbGRlciwgdmVyc2lvbik6CisgICAgYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDQsIHZlcnNpb24sIDApCisKK2RlZiBTdGFibGVITE9Db21wb3NpdGVPcHRpb25zRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKwordHJ5OgorICAgIGZyb20gdHlwaW5nIGltcG9ydCBMaXN0CitleGNlcHQ6CisgICAgcGFzcworCitjbGFzcyBTdGFibGVITE9Db21wb3NpdGVPcHRpb25zVChvYmplY3QpOgorCisgICAgIyBTdGFibGVITE9Db21wb3NpdGVPcHRpb25zVAorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5uYW1lID0gTm9uZSAgIyB0eXBlOiBzdHIKKyAgICAgICAgc2VsZi5kZWNvbXBvc2l0aW9uU3ViZ3JhcGhJbmRleCA9IDAgICMgdHlwZTogaW50CisgICAgICAgIHNlbGYuY29tcG9zaXRlQXR0cmlidXRlcyA9IE5vbmUgICMgdHlwZTogTGlzdFtpbnRdCisgICAgICAgIHNlbGYuY29tcG9zaXRlQXR0cmlidXRlc0Zvcm1hdCA9IDAgICMgdHlwZTogaW50CisgICAgICAgIHNlbGYudmVyc2lvbiA9IDAgICMgdHlwZTogaW50CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHN0YWJsZUhsb2NvbXBvc2l0ZU9wdGlvbnMgPSBTdGFibGVITE9Db21wb3NpdGVPcHRpb25zKCkKKyAgICAgICAgc3RhYmxlSGxvY29tcG9zaXRlT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHN0YWJsZUhsb2NvbXBvc2l0ZU9wdGlvbnMpCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzdGFibGVIbG9jb21wb3NpdGVPcHRpb25zKToKKyAgICAgICAgeCA9IFN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnNUKCkKKyAgICAgICAgeC5fVW5QYWNrKHN0YWJsZUhsb2NvbXBvc2l0ZU9wdGlvbnMpCisgICAgICAgIHJldHVybiB4CisKKyAgICAjIFN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnNUCisgICAgZGVmIF9VblBhY2soc2VsZiwgc3RhYmxlSGxvY29tcG9zaXRlT3B0aW9ucyk6CisgICAgICAgIGlmIHN0YWJsZUhsb2NvbXBvc2l0ZU9wdGlvbnMgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLm5hbWUgPSBzdGFibGVIbG9jb21wb3NpdGVPcHRpb25zLk5hbWUoKQorICAgICAgICBzZWxmLmRlY29tcG9zaXRpb25TdWJncmFwaEluZGV4ID0gc3RhYmxlSGxvY29tcG9zaXRlT3B0aW9ucy5EZWNvbXBvc2l0aW9uU3ViZ3JhcGhJbmRleCgpCisgICAgICAgIGlmIG5vdCBzdGFibGVIbG9jb21wb3NpdGVPcHRpb25zLkNvbXBvc2l0ZUF0dHJpYnV0ZXNJc05vbmUoKToKKyAgICAgICAgICAgIGlmIG5wIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi5jb21wb3NpdGVBdHRyaWJ1dGVzID0gW10KKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShzdGFibGVIbG9jb21wb3NpdGVPcHRpb25zLkNvbXBvc2l0ZUF0dHJpYnV0ZXNMZW5ndGgoKSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuY29tcG9zaXRlQXR0cmlidXRlcy5hcHBlbmQoc3RhYmxlSGxvY29tcG9zaXRlT3B0aW9ucy5Db21wb3NpdGVBdHRyaWJ1dGVzKGkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmNvbXBvc2l0ZUF0dHJpYnV0ZXMgPSBzdGFibGVIbG9jb21wb3NpdGVPcHRpb25zLkNvbXBvc2l0ZUF0dHJpYnV0ZXNBc051bXB5KCkKKyAgICAgICAgc2VsZi5jb21wb3NpdGVBdHRyaWJ1dGVzRm9ybWF0ID0gc3RhYmxlSGxvY29tcG9zaXRlT3B0aW9ucy5Db21wb3NpdGVBdHRyaWJ1dGVzRm9ybWF0KCkKKyAgICAgICAgc2VsZi52ZXJzaW9uID0gc3RhYmxlSGxvY29tcG9zaXRlT3B0aW9ucy5WZXJzaW9uKCkKKworICAgICMgU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9uc1QKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgaWYgc2VsZi5uYW1lIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgbmFtZSA9IGJ1aWxkZXIuQ3JlYXRlU3RyaW5nKHNlbGYubmFtZSkKKyAgICAgICAgaWYgc2VsZi5jb21wb3NpdGVBdHRyaWJ1dGVzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgbnAgaXMgbm90IE5vbmUgYW5kIHR5cGUoc2VsZi5jb21wb3NpdGVBdHRyaWJ1dGVzKSBpcyBucC5uZGFycmF5OgorICAgICAgICAgICAgICAgIGNvbXBvc2l0ZUF0dHJpYnV0ZXMgPSBidWlsZGVyLkNyZWF0ZU51bXB5VmVjdG9yKHNlbGYuY29tcG9zaXRlQXR0cmlidXRlcykKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9uc1N0YXJ0Q29tcG9zaXRlQXR0cmlidXRlc1ZlY3RvcihidWlsZGVyLCBsZW4oc2VsZi5jb21wb3NpdGVBdHRyaWJ1dGVzKSkKKyAgICAgICAgICAgICAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShsZW4oc2VsZi5jb21wb3NpdGVBdHRyaWJ1dGVzKSkpOgorICAgICAgICAgICAgICAgICAgICBidWlsZGVyLlByZXBlbmRVaW50OChzZWxmLmNvbXBvc2l0ZUF0dHJpYnV0ZXNbaV0pCisgICAgICAgICAgICAgICAgY29tcG9zaXRlQXR0cmlidXRlcyA9IGJ1aWxkZXIuRW5kVmVjdG9yKCkKKyAgICAgICAgU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCisgICAgICAgIGlmIHNlbGYubmFtZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIFN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnNBZGROYW1lKGJ1aWxkZXIsIG5hbWUpCisgICAgICAgIFN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnNBZGREZWNvbXBvc2l0aW9uU3ViZ3JhcGhJbmRleChidWlsZGVyLCBzZWxmLmRlY29tcG9zaXRpb25TdWJncmFwaEluZGV4KQorICAgICAgICBpZiBzZWxmLmNvbXBvc2l0ZUF0dHJpYnV0ZXMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBTdGFibGVITE9Db21wb3NpdGVPcHRpb25zQWRkQ29tcG9zaXRlQXR0cmlidXRlcyhidWlsZGVyLCBjb21wb3NpdGVBdHRyaWJ1dGVzKQorICAgICAgICBTdGFibGVITE9Db21wb3NpdGVPcHRpb25zQWRkQ29tcG9zaXRlQXR0cmlidXRlc0Zvcm1hdChidWlsZGVyLCBzZWxmLmNvbXBvc2l0ZUF0dHJpYnV0ZXNGb3JtYXQpCisgICAgICAgIFN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnNBZGRWZXJzaW9uKGJ1aWxkZXIsIHNlbGYudmVyc2lvbikKKyAgICAgICAgc3RhYmxlSGxvY29tcG9zaXRlT3B0aW9ucyA9IFN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnNFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHN0YWJsZUhsb2NvbXBvc2l0ZU9wdGlvbnMKKwogCiBjbGFzcyBPcGVyYXRvcihvYmplY3QpOgogICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCkBAIC03NTczLDYwICsxNjkwMCw4NCBAQAogICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVpbnQ2NEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKICAgICAgICAgcmV0dXJuIDAKIAotZGVmIE9wZXJhdG9yU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMTEpCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIE9wZXJhdG9yU3RhcnQoYnVpbGRlcikKLWRlZiBPcGVyYXRvckFkZE9wY29kZUluZGV4KGJ1aWxkZXIsIG9wY29kZUluZGV4KTogYnVpbGRlci5QcmVwZW5kVWludDMyU2xvdCgwLCBvcGNvZGVJbmRleCwgMCkKLWRlZiBBZGRPcGNvZGVJbmRleChidWlsZGVyLCBvcGNvZGVJbmRleCk6Ci0gICAgcmV0dXJuIE9wZXJhdG9yQWRkT3Bjb2RlSW5kZXgoYnVpbGRlciwgb3Bjb2RlSW5kZXgpCi1kZWYgT3BlcmF0b3JBZGRJbnB1dHMoYnVpbGRlciwgaW5wdXRzKTogYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMSwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShpbnB1dHMpLCAwKQotZGVmIEFkZElucHV0cyhidWlsZGVyLCBpbnB1dHMpOgotICAgIHJldHVybiBPcGVyYXRvckFkZElucHV0cyhidWlsZGVyLCBpbnB1dHMpCi1kZWYgT3BlcmF0b3JTdGFydElucHV0c1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6IHJldHVybiBidWlsZGVyLlN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KQotZGVmIFN0YXJ0SW5wdXRzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKLSAgICByZXR1cm4gT3BlcmF0b3JTdGFydElucHV0c1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykKLWRlZiBPcGVyYXRvckFkZE91dHB1dHMoYnVpbGRlciwgb3V0cHV0cyk6IGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDIsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUob3V0cHV0cyksIDApCi1kZWYgQWRkT3V0cHV0cyhidWlsZGVyLCBvdXRwdXRzKToKLSAgICByZXR1cm4gT3BlcmF0b3JBZGRPdXRwdXRzKGJ1aWxkZXIsIG91dHB1dHMpCi1kZWYgT3BlcmF0b3JTdGFydE91dHB1dHNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOiByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCkKLWRlZiBTdGFydE91dHB1dHNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgotICAgIHJldHVybiBPcGVyYXRvclN0YXJ0T3V0cHV0c1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykKLWRlZiBPcGVyYXRvckFkZEJ1aWx0aW5PcHRpb25zVHlwZShidWlsZGVyLCBidWlsdGluT3B0aW9uc1R5cGUpOiBidWlsZGVyLlByZXBlbmRVaW50OFNsb3QoMywgYnVpbHRpbk9wdGlvbnNUeXBlLCAwKQotZGVmIEFkZEJ1aWx0aW5PcHRpb25zVHlwZShidWlsZGVyLCBidWlsdGluT3B0aW9uc1R5cGUpOgotICAgIHJldHVybiBPcGVyYXRvckFkZEJ1aWx0aW5PcHRpb25zVHlwZShidWlsZGVyLCBidWlsdGluT3B0aW9uc1R5cGUpCi1kZWYgT3BlcmF0b3JBZGRCdWlsdGluT3B0aW9ucyhidWlsZGVyLCBidWlsdGluT3B0aW9ucyk6IGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDQsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoYnVpbHRpbk9wdGlvbnMpLCAwKQotZGVmIEFkZEJ1aWx0aW5PcHRpb25zKGJ1aWxkZXIsIGJ1aWx0aW5PcHRpb25zKToKLSAgICByZXR1cm4gT3BlcmF0b3JBZGRCdWlsdGluT3B0aW9ucyhidWlsZGVyLCBidWlsdGluT3B0aW9ucykKLWRlZiBPcGVyYXRvckFkZEN1c3RvbU9wdGlvbnMoYnVpbGRlciwgY3VzdG9tT3B0aW9ucyk6IGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDUsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoY3VzdG9tT3B0aW9ucyksIDApCi1kZWYgQWRkQ3VzdG9tT3B0aW9ucyhidWlsZGVyLCBjdXN0b21PcHRpb25zKToKLSAgICByZXR1cm4gT3BlcmF0b3JBZGRDdXN0b21PcHRpb25zKGJ1aWxkZXIsIGN1c3RvbU9wdGlvbnMpCi1kZWYgT3BlcmF0b3JTdGFydEN1c3RvbU9wdGlvbnNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOiByZXR1cm4gYnVpbGRlci5TdGFydFZlY3RvcigxLCBudW1FbGVtcywgMSkKLWRlZiBTdGFydEN1c3RvbU9wdGlvbnNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgotICAgIHJldHVybiBPcGVyYXRvclN0YXJ0Q3VzdG9tT3B0aW9uc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykKLWRlZiBPcGVyYXRvckFkZEN1c3RvbU9wdGlvbnNGb3JtYXQoYnVpbGRlciwgY3VzdG9tT3B0aW9uc0Zvcm1hdCk6IGJ1aWxkZXIuUHJlcGVuZEludDhTbG90KDYsIGN1c3RvbU9wdGlvbnNGb3JtYXQsIDApCi1kZWYgQWRkQ3VzdG9tT3B0aW9uc0Zvcm1hdChidWlsZGVyLCBjdXN0b21PcHRpb25zRm9ybWF0KToKLSAgICByZXR1cm4gT3BlcmF0b3JBZGRDdXN0b21PcHRpb25zRm9ybWF0KGJ1aWxkZXIsIGN1c3RvbU9wdGlvbnNGb3JtYXQpCi1kZWYgT3BlcmF0b3JBZGRNdXRhdGluZ1ZhcmlhYmxlSW5wdXRzKGJ1aWxkZXIsIG11dGF0aW5nVmFyaWFibGVJbnB1dHMpOiBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCg3LCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKG11dGF0aW5nVmFyaWFibGVJbnB1dHMpLCAwKQotZGVmIEFkZE11dGF0aW5nVmFyaWFibGVJbnB1dHMoYnVpbGRlciwgbXV0YXRpbmdWYXJpYWJsZUlucHV0cyk6Ci0gICAgcmV0dXJuIE9wZXJhdG9yQWRkTXV0YXRpbmdWYXJpYWJsZUlucHV0cyhidWlsZGVyLCBtdXRhdGluZ1ZhcmlhYmxlSW5wdXRzKQotZGVmIE9wZXJhdG9yU3RhcnRNdXRhdGluZ1ZhcmlhYmxlSW5wdXRzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKTogcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoMSwgbnVtRWxlbXMsIDEpCi1kZWYgU3RhcnRNdXRhdGluZ1ZhcmlhYmxlSW5wdXRzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKLSAgICByZXR1cm4gT3BlcmF0b3JTdGFydE11dGF0aW5nVmFyaWFibGVJbnB1dHNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpCi1kZWYgT3BlcmF0b3JBZGRJbnRlcm1lZGlhdGVzKGJ1aWxkZXIsIGludGVybWVkaWF0ZXMpOiBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCg4LCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGludGVybWVkaWF0ZXMpLCAwKQotZGVmIEFkZEludGVybWVkaWF0ZXMoYnVpbGRlciwgaW50ZXJtZWRpYXRlcyk6Ci0gICAgcmV0dXJuIE9wZXJhdG9yQWRkSW50ZXJtZWRpYXRlcyhidWlsZGVyLCBpbnRlcm1lZGlhdGVzKQotZGVmIE9wZXJhdG9yU3RhcnRJbnRlcm1lZGlhdGVzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKTogcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpCi1kZWYgU3RhcnRJbnRlcm1lZGlhdGVzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKLSAgICByZXR1cm4gT3BlcmF0b3JTdGFydEludGVybWVkaWF0ZXNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpCi1kZWYgT3BlcmF0b3JBZGRMYXJnZUN1c3RvbU9wdGlvbnNPZmZzZXQoYnVpbGRlciwgbGFyZ2VDdXN0b21PcHRpb25zT2Zmc2V0KTogYnVpbGRlci5QcmVwZW5kVWludDY0U2xvdCg5LCBsYXJnZUN1c3RvbU9wdGlvbnNPZmZzZXQsIDApCi1kZWYgQWRkTGFyZ2VDdXN0b21PcHRpb25zT2Zmc2V0KGJ1aWxkZXIsIGxhcmdlQ3VzdG9tT3B0aW9uc09mZnNldCk6Ci0gICAgcmV0dXJuIE9wZXJhdG9yQWRkTGFyZ2VDdXN0b21PcHRpb25zT2Zmc2V0KGJ1aWxkZXIsIGxhcmdlQ3VzdG9tT3B0aW9uc09mZnNldCkKLWRlZiBPcGVyYXRvckFkZExhcmdlQ3VzdG9tT3B0aW9uc1NpemUoYnVpbGRlciwgbGFyZ2VDdXN0b21PcHRpb25zU2l6ZSk6IGJ1aWxkZXIuUHJlcGVuZFVpbnQ2NFNsb3QoMTAsIGxhcmdlQ3VzdG9tT3B0aW9uc1NpemUsIDApCi1kZWYgQWRkTGFyZ2VDdXN0b21PcHRpb25zU2l6ZShidWlsZGVyLCBsYXJnZUN1c3RvbU9wdGlvbnNTaXplKToKLSAgICByZXR1cm4gT3BlcmF0b3JBZGRMYXJnZUN1c3RvbU9wdGlvbnNTaXplKGJ1aWxkZXIsIGxhcmdlQ3VzdG9tT3B0aW9uc1NpemUpCi1kZWYgT3BlcmF0b3JFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBPcGVyYXRvckVuZChidWlsZGVyKQorICAgICMgT3BlcmF0b3IKKyAgICBkZWYgQnVpbHRpbk9wdGlvbnMyVHlwZShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgyNikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VaW50OEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgT3BlcmF0b3IKKyAgICBkZWYgQnVpbHRpbk9wdGlvbnMyKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDI4KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgZnJvbSBmbGF0YnVmZmVycy50YWJsZSBpbXBvcnQgVGFibGUKKyAgICAgICAgICAgIG9iaiA9IFRhYmxlKGJ5dGVhcnJheSgpLCAwKQorICAgICAgICAgICAgc2VsZi5fdGFiLlVuaW9uKG9iaiwgbykKKyAgICAgICAgICAgIHJldHVybiBvYmoKKyAgICAgICAgcmV0dXJuIE5vbmUKKworZGVmIE9wZXJhdG9yU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCgxMykKKworZGVmIE9wZXJhdG9yQWRkT3Bjb2RlSW5kZXgoYnVpbGRlciwgb3Bjb2RlSW5kZXgpOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVpbnQzMlNsb3QoMCwgb3Bjb2RlSW5kZXgsIDApCisKK2RlZiBPcGVyYXRvckFkZElucHV0cyhidWlsZGVyLCBpbnB1dHMpOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDEsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaW5wdXRzKSwgMCkKKworZGVmIE9wZXJhdG9yU3RhcnRJbnB1dHNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgorICAgIHJldHVybiBidWlsZGVyLlN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KQorCitkZWYgT3BlcmF0b3JBZGRPdXRwdXRzKGJ1aWxkZXIsIG91dHB1dHMpOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDIsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUob3V0cHV0cyksIDApCisKK2RlZiBPcGVyYXRvclN0YXJ0T3V0cHV0c1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6CisgICAgcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpCisKK2RlZiBPcGVyYXRvckFkZEJ1aWx0aW5PcHRpb25zVHlwZShidWlsZGVyLCBidWlsdGluT3B0aW9uc1R5cGUpOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVpbnQ4U2xvdCgzLCBidWlsdGluT3B0aW9uc1R5cGUsIDApCisKK2RlZiBPcGVyYXRvckFkZEJ1aWx0aW5PcHRpb25zKGJ1aWxkZXIsIGJ1aWx0aW5PcHRpb25zKToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCg0LCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGJ1aWx0aW5PcHRpb25zKSwgMCkKKworZGVmIE9wZXJhdG9yQWRkQ3VzdG9tT3B0aW9ucyhidWlsZGVyLCBjdXN0b21PcHRpb25zKToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCg1LCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGN1c3RvbU9wdGlvbnMpLCAwKQorCitkZWYgT3BlcmF0b3JTdGFydEN1c3RvbU9wdGlvbnNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgorICAgIHJldHVybiBidWlsZGVyLlN0YXJ0VmVjdG9yKDEsIG51bUVsZW1zLCAxKQorCitkZWYgT3BlcmF0b3JBZGRDdXN0b21PcHRpb25zRm9ybWF0KGJ1aWxkZXIsIGN1c3RvbU9wdGlvbnNGb3JtYXQpOgorICAgIGJ1aWxkZXIuUHJlcGVuZEludDhTbG90KDYsIGN1c3RvbU9wdGlvbnNGb3JtYXQsIDApCisKK2RlZiBPcGVyYXRvckFkZE11dGF0aW5nVmFyaWFibGVJbnB1dHMoYnVpbGRlciwgbXV0YXRpbmdWYXJpYWJsZUlucHV0cyk6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoNywgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShtdXRhdGluZ1ZhcmlhYmxlSW5wdXRzKSwgMCkKKworZGVmIE9wZXJhdG9yU3RhcnRNdXRhdGluZ1ZhcmlhYmxlSW5wdXRzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKKyAgICByZXR1cm4gYnVpbGRlci5TdGFydFZlY3RvcigxLCBudW1FbGVtcywgMSkKKworZGVmIE9wZXJhdG9yQWRkSW50ZXJtZWRpYXRlcyhidWlsZGVyLCBpbnRlcm1lZGlhdGVzKToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCg4LCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGludGVybWVkaWF0ZXMpLCAwKQorCitkZWYgT3BlcmF0b3JTdGFydEludGVybWVkaWF0ZXNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgorICAgIHJldHVybiBidWlsZGVyLlN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KQorCitkZWYgT3BlcmF0b3JBZGRMYXJnZUN1c3RvbU9wdGlvbnNPZmZzZXQoYnVpbGRlciwgbGFyZ2VDdXN0b21PcHRpb25zT2Zmc2V0KToKKyAgICBidWlsZGVyLlByZXBlbmRVaW50NjRTbG90KDksIGxhcmdlQ3VzdG9tT3B0aW9uc09mZnNldCwgMCkKKworZGVmIE9wZXJhdG9yQWRkTGFyZ2VDdXN0b21PcHRpb25zU2l6ZShidWlsZGVyLCBsYXJnZUN1c3RvbU9wdGlvbnNTaXplKToKKyAgICBidWlsZGVyLlByZXBlbmRVaW50NjRTbG90KDEwLCBsYXJnZUN1c3RvbU9wdGlvbnNTaXplLCAwKQorCitkZWYgT3BlcmF0b3JBZGRCdWlsdGluT3B0aW9uczJUeXBlKGJ1aWxkZXIsIGJ1aWx0aW5PcHRpb25zMlR5cGUpOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVpbnQ4U2xvdCgxMSwgYnVpbHRpbk9wdGlvbnMyVHlwZSwgMCkKKworZGVmIE9wZXJhdG9yQWRkQnVpbHRpbk9wdGlvbnMyKGJ1aWxkZXIsIGJ1aWx0aW5PcHRpb25zMik6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMTIsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoYnVpbHRpbk9wdGlvbnMyKSwgMCkKKworZGVmIE9wZXJhdG9yRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKwogdHJ5OgogICAgIGZyb20gdHlwaW5nIGltcG9ydCBMaXN0LCBVbmlvbgogZXhjZXB0OgpAQCAtNzY0Nyw2ICsxNjk5OCw4IEBACiAgICAgICAgIHNlbGYuaW50ZXJtZWRpYXRlcyA9IE5vbmUgICMgdHlwZTogTGlzdFtpbnRdCiAgICAgICAgIHNlbGYubGFyZ2VDdXN0b21PcHRpb25zT2Zmc2V0ID0gMCAgIyB0eXBlOiBpbnQKICAgICAgICAgc2VsZi5sYXJnZUN1c3RvbU9wdGlvbnNTaXplID0gMCAgIyB0eXBlOiBpbnQKKyAgICAgICAgc2VsZi5idWlsdGluT3B0aW9uczJUeXBlID0gMCAgIyB0eXBlOiBpbnQKKyAgICAgICAgc2VsZi5idWlsdGluT3B0aW9uczIgPSBOb25lICAjIHR5cGU6IFVuaW9uW05vbmUsIFN0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9uc1QsIFN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9uc1QsIFN0YWJsZWhsb1NsaWNlT3B0aW9uc1QsIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc1QsIFN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zVCwgU3RhYmxlaGxvUmVkdWNlT3B0aW9uc1QsIFN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zVCwgU3RhYmxlaGxvQ29tcGFyZU9wdGlvbnNULCBTdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zVCwgU3RhYmxlaGxvUGFkT3B0aW9uc1QsIFN0YWJsZWhsb0lvdGFPcHRpb25zVCwgU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnNULCBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zVCwgU3RhYmxlaGxvU29ydE9wdGlvbnNULCBTdGFibGVobG9XaGlsZU9wdGlvbnNULCBTdGFibGVobG9HYXRoZXJPcHRpb25zVCwgU3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9uc1QsIERpbGF0ZU9wdGlvbnNULCBTdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zVCwgUmVkdWNlV2luZG93T3B0aW9uc1QsIFN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnNUXQogCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgpAQCAtNzY1NSw2ICsxNzAwOCwxMSBAQAogICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKG9wZXJhdG9yKQogCiAgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIEluaXRGcm9tT2JqKGNscywgb3BlcmF0b3IpOgogICAgICAgICB4ID0gT3BlcmF0b3JUKCkKICAgICAgICAgeC5fVW5QYWNrKG9wZXJhdG9yKQpAQCAtNzcwNSw2ICsxNzA2Myw4IEBACiAgICAgICAgICAgICAgICAgc2VsZi5pbnRlcm1lZGlhdGVzID0gb3BlcmF0b3IuSW50ZXJtZWRpYXRlc0FzTnVtcHkoKQogICAgICAgICBzZWxmLmxhcmdlQ3VzdG9tT3B0aW9uc09mZnNldCA9IG9wZXJhdG9yLkxhcmdlQ3VzdG9tT3B0aW9uc09mZnNldCgpCiAgICAgICAgIHNlbGYubGFyZ2VDdXN0b21PcHRpb25zU2l6ZSA9IG9wZXJhdG9yLkxhcmdlQ3VzdG9tT3B0aW9uc1NpemUoKQorICAgICAgICBzZWxmLmJ1aWx0aW5PcHRpb25zMlR5cGUgPSBvcGVyYXRvci5CdWlsdGluT3B0aW9uczJUeXBlKCkKKyAgICAgICAgc2VsZi5idWlsdGluT3B0aW9uczIgPSBCdWlsdGluT3B0aW9uczJDcmVhdG9yKHNlbGYuYnVpbHRpbk9wdGlvbnMyVHlwZSwgb3BlcmF0b3IuQnVpbHRpbk9wdGlvbnMyKCkpCiAKICAgICAjIE9wZXJhdG9yVAogICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgpAQCAtNzc1MCw2ICsxNzExMCw4IEBACiAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYuaW50ZXJtZWRpYXRlcykpKToKICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5QcmVwZW5kSW50MzIoc2VsZi5pbnRlcm1lZGlhdGVzW2ldKQogICAgICAgICAgICAgICAgIGludGVybWVkaWF0ZXMgPSBidWlsZGVyLkVuZFZlY3RvcigpCisgICAgICAgIGlmIHNlbGYuYnVpbHRpbk9wdGlvbnMyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYnVpbHRpbk9wdGlvbnMyID0gc2VsZi5idWlsdGluT3B0aW9uczIuUGFjayhidWlsZGVyKQogICAgICAgICBPcGVyYXRvclN0YXJ0KGJ1aWxkZXIpCiAgICAgICAgIE9wZXJhdG9yQWRkT3Bjb2RlSW5kZXgoYnVpbGRlciwgc2VsZi5vcGNvZGVJbmRleCkKICAgICAgICAgaWYgc2VsZi5pbnB1dHMgaXMgbm90IE5vbmU6CkBAIC03NzY4LDQwMDkgKzE3MTMwLDEyIEBACiAgICAgICAgICAgICBPcGVyYXRvckFkZEludGVybWVkaWF0ZXMoYnVpbGRlciwgaW50ZXJtZWRpYXRlcykKICAgICAgICAgT3BlcmF0b3JBZGRMYXJnZUN1c3RvbU9wdGlvbnNPZmZzZXQoYnVpbGRlciwgc2VsZi5sYXJnZUN1c3RvbU9wdGlvbnNPZmZzZXQpCiAgICAgICAgIE9wZXJhdG9yQWRkTGFyZ2VDdXN0b21PcHRpb25zU2l6ZShidWlsZGVyLCBzZWxmLmxhcmdlQ3VzdG9tT3B0aW9uc1NpemUpCisgICAgICAgIE9wZXJhdG9yQWRkQnVpbHRpbk9wdGlvbnMyVHlwZShidWlsZGVyLCBzZWxmLmJ1aWx0aW5PcHRpb25zMlR5cGUpCisgICAgICAgIGlmIHNlbGYuYnVpbHRpbk9wdGlvbnMyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgT3BlcmF0b3JBZGRCdWlsdGluT3B0aW9uczIoYnVpbGRlciwgYnVpbHRpbk9wdGlvbnMyKQogICAgICAgICBvcGVyYXRvciA9IE9wZXJhdG9yRW5kKGJ1aWxkZXIpCiAgICAgICAgIHJldHVybiBvcGVyYXRvcgotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIE9wZXJhdG9yQ29kZShvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IE9wZXJhdG9yQ29kZSgpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzT3BlcmF0b3JDb2RlKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgT3BlcmF0b3JDb2RlQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBPcGVyYXRvckNvZGUKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi0gICAgIyBPcGVyYXRvckNvZGUKLSAgICBkZWYgRGVwcmVjYXRlZEJ1aWx0aW5Db2RlKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50OEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgT3BlcmF0b3JDb2RlCi0gICAgZGVmIEN1c3RvbUNvZGUoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuU3RyaW5nKG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gTm9uZQotCi0gICAgIyBPcGVyYXRvckNvZGUKLSAgICBkZWYgVmVyc2lvbihzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg4KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gMQotCi0gICAgIyBPcGVyYXRvckNvZGUKLSAgICBkZWYgQnVpbHRpbkNvZGUoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTApKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiAwCi0KLWRlZiBPcGVyYXRvckNvZGVTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCg0KQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBPcGVyYXRvckNvZGVTdGFydChidWlsZGVyKQotZGVmIE9wZXJhdG9yQ29kZUFkZERlcHJlY2F0ZWRCdWlsdGluQ29kZShidWlsZGVyLCBkZXByZWNhdGVkQnVpbHRpbkNvZGUpOiBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCgwLCBkZXByZWNhdGVkQnVpbHRpbkNvZGUsIDApCi1kZWYgQWRkRGVwcmVjYXRlZEJ1aWx0aW5Db2RlKGJ1aWxkZXIsIGRlcHJlY2F0ZWRCdWlsdGluQ29kZSk6Ci0gICAgcmV0dXJuIE9wZXJhdG9yQ29kZUFkZERlcHJlY2F0ZWRCdWlsdGluQ29kZShidWlsZGVyLCBkZXByZWNhdGVkQnVpbHRpbkNvZGUpCi1kZWYgT3BlcmF0b3JDb2RlQWRkQ3VzdG9tQ29kZShidWlsZGVyLCBjdXN0b21Db2RlKTogYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMSwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShjdXN0b21Db2RlKSwgMCkKLWRlZiBBZGRDdXN0b21Db2RlKGJ1aWxkZXIsIGN1c3RvbUNvZGUpOgotICAgIHJldHVybiBPcGVyYXRvckNvZGVBZGRDdXN0b21Db2RlKGJ1aWxkZXIsIGN1c3RvbUNvZGUpCi1kZWYgT3BlcmF0b3JDb2RlQWRkVmVyc2lvbihidWlsZGVyLCB2ZXJzaW9uKTogYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDIsIHZlcnNpb24sIDEpCi1kZWYgQWRkVmVyc2lvbihidWlsZGVyLCB2ZXJzaW9uKToKLSAgICByZXR1cm4gT3BlcmF0b3JDb2RlQWRkVmVyc2lvbihidWlsZGVyLCB2ZXJzaW9uKQotZGVmIE9wZXJhdG9yQ29kZUFkZEJ1aWx0aW5Db2RlKGJ1aWxkZXIsIGJ1aWx0aW5Db2RlKTogYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDMsIGJ1aWx0aW5Db2RlLCAwKQotZGVmIEFkZEJ1aWx0aW5Db2RlKGJ1aWxkZXIsIGJ1aWx0aW5Db2RlKToKLSAgICByZXR1cm4gT3BlcmF0b3JDb2RlQWRkQnVpbHRpbkNvZGUoYnVpbGRlciwgYnVpbHRpbkNvZGUpCi1kZWYgT3BlcmF0b3JDb2RlRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gT3BlcmF0b3JDb2RlRW5kKGJ1aWxkZXIpCi0KLWNsYXNzIE9wZXJhdG9yQ29kZVQob2JqZWN0KToKLQotICAgICMgT3BlcmF0b3JDb2RlVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi5kZXByZWNhdGVkQnVpbHRpbkNvZGUgPSAwICAjIHR5cGU6IGludAotICAgICAgICBzZWxmLmN1c3RvbUNvZGUgPSBOb25lICAjIHR5cGU6IHN0cgotICAgICAgICBzZWxmLnZlcnNpb24gPSAxICAjIHR5cGU6IGludAotICAgICAgICBzZWxmLmJ1aWx0aW5Db2RlID0gMCAgIyB0eXBlOiBpbnQKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgb3BlcmF0b3JDb2RlID0gT3BlcmF0b3JDb2RlKCkKLSAgICAgICAgb3BlcmF0b3JDb2RlLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoob3BlcmF0b3JDb2RlKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgb3BlcmF0b3JDb2RlKToKLSAgICAgICAgeCA9IE9wZXJhdG9yQ29kZVQoKQotICAgICAgICB4Ll9VblBhY2sob3BlcmF0b3JDb2RlKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBPcGVyYXRvckNvZGVUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgb3BlcmF0b3JDb2RlKToKLSAgICAgICAgaWYgb3BlcmF0b3JDb2RlIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi5kZXByZWNhdGVkQnVpbHRpbkNvZGUgPSBvcGVyYXRvckNvZGUuRGVwcmVjYXRlZEJ1aWx0aW5Db2RlKCkKLSAgICAgICAgc2VsZi5jdXN0b21Db2RlID0gb3BlcmF0b3JDb2RlLkN1c3RvbUNvZGUoKQotICAgICAgICBzZWxmLnZlcnNpb24gPSBvcGVyYXRvckNvZGUuVmVyc2lvbigpCi0gICAgICAgIHNlbGYuYnVpbHRpbkNvZGUgPSBvcGVyYXRvckNvZGUuQnVpbHRpbkNvZGUoKQotCi0gICAgIyBPcGVyYXRvckNvZGVUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIGlmIHNlbGYuY3VzdG9tQ29kZSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIGN1c3RvbUNvZGUgPSBidWlsZGVyLkNyZWF0ZVN0cmluZyhzZWxmLmN1c3RvbUNvZGUpCi0gICAgICAgIE9wZXJhdG9yQ29kZVN0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIE9wZXJhdG9yQ29kZUFkZERlcHJlY2F0ZWRCdWlsdGluQ29kZShidWlsZGVyLCBzZWxmLmRlcHJlY2F0ZWRCdWlsdGluQ29kZSkKLSAgICAgICAgaWYgc2VsZi5jdXN0b21Db2RlIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgT3BlcmF0b3JDb2RlQWRkQ3VzdG9tQ29kZShidWlsZGVyLCBjdXN0b21Db2RlKQotICAgICAgICBPcGVyYXRvckNvZGVBZGRWZXJzaW9uKGJ1aWxkZXIsIHNlbGYudmVyc2lvbikKLSAgICAgICAgT3BlcmF0b3JDb2RlQWRkQnVpbHRpbkNvZGUoYnVpbGRlciwgc2VsZi5idWlsdGluQ29kZSkKLSAgICAgICAgb3BlcmF0b3JDb2RlID0gT3BlcmF0b3JDb2RlRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBvcGVyYXRvckNvZGUKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBQYWNrT3B0aW9ucyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IFBhY2tPcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNQYWNrT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIFBhY2tPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBQYWNrT3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLSAgICAjIFBhY2tPcHRpb25zCi0gICAgZGVmIFZhbHVlc0NvdW50KHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIFBhY2tPcHRpb25zCi0gICAgZGVmIEF4aXMoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAKLQotZGVmIFBhY2tPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMikKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gUGFja09wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIFBhY2tPcHRpb25zQWRkVmFsdWVzQ291bnQoYnVpbGRlciwgdmFsdWVzQ291bnQpOiBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMCwgdmFsdWVzQ291bnQsIDApCi1kZWYgQWRkVmFsdWVzQ291bnQoYnVpbGRlciwgdmFsdWVzQ291bnQpOgotICAgIHJldHVybiBQYWNrT3B0aW9uc0FkZFZhbHVlc0NvdW50KGJ1aWxkZXIsIHZhbHVlc0NvdW50KQotZGVmIFBhY2tPcHRpb25zQWRkQXhpcyhidWlsZGVyLCBheGlzKTogYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDEsIGF4aXMsIDApCi1kZWYgQWRkQXhpcyhidWlsZGVyLCBheGlzKToKLSAgICByZXR1cm4gUGFja09wdGlvbnNBZGRBeGlzKGJ1aWxkZXIsIGF4aXMpCi1kZWYgUGFja09wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBQYWNrT3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBQYWNrT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgUGFja09wdGlvbnNUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBzZWxmLnZhbHVlc0NvdW50ID0gMCAgIyB0eXBlOiBpbnQKLSAgICAgICAgc2VsZi5heGlzID0gMCAgIyB0eXBlOiBpbnQKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgcGFja09wdGlvbnMgPSBQYWNrT3B0aW9ucygpCi0gICAgICAgIHBhY2tPcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoocGFja09wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBwYWNrT3B0aW9ucyk6Ci0gICAgICAgIHggPSBQYWNrT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2socGFja09wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIFBhY2tPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIHBhY2tPcHRpb25zKToKLSAgICAgICAgaWYgcGFja09wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLnZhbHVlc0NvdW50ID0gcGFja09wdGlvbnMuVmFsdWVzQ291bnQoKQotICAgICAgICBzZWxmLmF4aXMgPSBwYWNrT3B0aW9ucy5BeGlzKCkKLQotICAgICMgUGFja09wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIFBhY2tPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgUGFja09wdGlvbnNBZGRWYWx1ZXNDb3VudChidWlsZGVyLCBzZWxmLnZhbHVlc0NvdW50KQotICAgICAgICBQYWNrT3B0aW9uc0FkZEF4aXMoYnVpbGRlciwgc2VsZi5heGlzKQotICAgICAgICBwYWNrT3B0aW9ucyA9IFBhY2tPcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBwYWNrT3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIFBhZE9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBQYWRPcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNQYWRPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgUGFkT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgUGFkT3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLWRlZiBQYWRPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gUGFkT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgUGFkT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFBhZE9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgUGFkT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgUGFkT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgcGFkT3B0aW9ucyA9IFBhZE9wdGlvbnMoKQotICAgICAgICBwYWRPcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoocGFkT3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHBhZE9wdGlvbnMpOgotICAgICAgICB4ID0gUGFkT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2socGFkT3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgUGFkT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBwYWRPcHRpb25zKToKLSAgICAgICAgaWYgcGFkT3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAjIFBhZE9wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIFBhZE9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBwYWRPcHRpb25zID0gUGFkT3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gcGFkT3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIFBhZFYyT3B0aW9ucyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IFBhZFYyT3B0aW9ucygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzUGFkVjJPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgUGFkVjJPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBQYWRWMk9wdGlvbnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi1kZWYgUGFkVjJPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gUGFkVjJPcHRpb25zU3RhcnQoYnVpbGRlcikKLWRlZiBQYWRWMk9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBQYWRWMk9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgUGFkVjJPcHRpb25zVChvYmplY3QpOgotCi0gICAgIyBQYWRWMk9wdGlvbnNUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBwYXNzCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIHBhZFYyb3B0aW9ucyA9IFBhZFYyT3B0aW9ucygpCi0gICAgICAgIHBhZFYyb3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHBhZFYyb3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHBhZFYyb3B0aW9ucyk6Ci0gICAgICAgIHggPSBQYWRWMk9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKHBhZFYyb3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgUGFkVjJPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIHBhZFYyb3B0aW9ucyk6Ci0gICAgICAgIGlmIHBhZFYyb3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAjIFBhZFYyT3B0aW9uc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgUGFkVjJPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgcGFkVjJvcHRpb25zID0gUGFkVjJPcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBwYWRWMm9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotY2xhc3MgUGFkZGluZyhvYmplY3QpOgotICAgIFNBTUUgPSAwCi0gICAgVkFMSUQgPSAxCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgUG9vbDJET3B0aW9ucyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IFBvb2wyRE9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc1Bvb2wyRE9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBQb29sMkRPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBQb29sMkRPcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotICAgICMgUG9vbDJET3B0aW9ucwotICAgIGRlZiBQYWRkaW5nKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50OEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgUG9vbDJET3B0aW9ucwotICAgIGRlZiBTdHJpZGVXKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIFBvb2wyRE9wdGlvbnMKLSAgICBkZWYgU3RyaWRlSChzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg4KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBQb29sMkRPcHRpb25zCi0gICAgZGVmIEZpbHRlcldpZHRoKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEwKSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBQb29sMkRPcHRpb25zCi0gICAgZGVmIEZpbHRlckhlaWdodChzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMikpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgUG9vbDJET3B0aW9ucwotICAgIGRlZiBGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gMAotCi1kZWYgUG9vbDJET3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDYpCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFBvb2wyRE9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIFBvb2wyRE9wdGlvbnNBZGRQYWRkaW5nKGJ1aWxkZXIsIHBhZGRpbmcpOiBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCgwLCBwYWRkaW5nLCAwKQotZGVmIEFkZFBhZGRpbmcoYnVpbGRlciwgcGFkZGluZyk6Ci0gICAgcmV0dXJuIFBvb2wyRE9wdGlvbnNBZGRQYWRkaW5nKGJ1aWxkZXIsIHBhZGRpbmcpCi1kZWYgUG9vbDJET3B0aW9uc0FkZFN0cmlkZVcoYnVpbGRlciwgc3RyaWRlVyk6IGJ1aWxkZXIuUHJlcGVuZEludDMyU2xvdCgxLCBzdHJpZGVXLCAwKQotZGVmIEFkZFN0cmlkZVcoYnVpbGRlciwgc3RyaWRlVyk6Ci0gICAgcmV0dXJuIFBvb2wyRE9wdGlvbnNBZGRTdHJpZGVXKGJ1aWxkZXIsIHN0cmlkZVcpCi1kZWYgUG9vbDJET3B0aW9uc0FkZFN0cmlkZUgoYnVpbGRlciwgc3RyaWRlSCk6IGJ1aWxkZXIuUHJlcGVuZEludDMyU2xvdCgyLCBzdHJpZGVILCAwKQotZGVmIEFkZFN0cmlkZUgoYnVpbGRlciwgc3RyaWRlSCk6Ci0gICAgcmV0dXJuIFBvb2wyRE9wdGlvbnNBZGRTdHJpZGVIKGJ1aWxkZXIsIHN0cmlkZUgpCi1kZWYgUG9vbDJET3B0aW9uc0FkZEZpbHRlcldpZHRoKGJ1aWxkZXIsIGZpbHRlcldpZHRoKTogYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDMsIGZpbHRlcldpZHRoLCAwKQotZGVmIEFkZEZpbHRlcldpZHRoKGJ1aWxkZXIsIGZpbHRlcldpZHRoKToKLSAgICByZXR1cm4gUG9vbDJET3B0aW9uc0FkZEZpbHRlcldpZHRoKGJ1aWxkZXIsIGZpbHRlcldpZHRoKQotZGVmIFBvb2wyRE9wdGlvbnNBZGRGaWx0ZXJIZWlnaHQoYnVpbGRlciwgZmlsdGVySGVpZ2h0KTogYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDQsIGZpbHRlckhlaWdodCwgMCkKLWRlZiBBZGRGaWx0ZXJIZWlnaHQoYnVpbGRlciwgZmlsdGVySGVpZ2h0KToKLSAgICByZXR1cm4gUG9vbDJET3B0aW9uc0FkZEZpbHRlckhlaWdodChidWlsZGVyLCBmaWx0ZXJIZWlnaHQpCi1kZWYgUG9vbDJET3B0aW9uc0FkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKTogYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoNSwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24sIDApCi1kZWYgQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pOgotICAgIHJldHVybiBQb29sMkRPcHRpb25zQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pCi1kZWYgUG9vbDJET3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFBvb2wyRE9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgUG9vbDJET3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgUG9vbDJET3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYucGFkZGluZyA9IDAgICMgdHlwZTogaW50Ci0gICAgICAgIHNlbGYuc3RyaWRlVyA9IDAgICMgdHlwZTogaW50Ci0gICAgICAgIHNlbGYuc3RyaWRlSCA9IDAgICMgdHlwZTogaW50Ci0gICAgICAgIHNlbGYuZmlsdGVyV2lkdGggPSAwICAjIHR5cGU6IGludAotICAgICAgICBzZWxmLmZpbHRlckhlaWdodCA9IDAgICMgdHlwZTogaW50Ci0gICAgICAgIHNlbGYuZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24gPSAwICAjIHR5cGU6IGludAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBwb29sMmRvcHRpb25zID0gUG9vbDJET3B0aW9ucygpCi0gICAgICAgIHBvb2wyZG9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihwb29sMmRvcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgcG9vbDJkb3B0aW9ucyk6Ci0gICAgICAgIHggPSBQb29sMkRPcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhwb29sMmRvcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBQb29sMkRPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIHBvb2wyZG9wdGlvbnMpOgotICAgICAgICBpZiBwb29sMmRvcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi5wYWRkaW5nID0gcG9vbDJkb3B0aW9ucy5QYWRkaW5nKCkKLSAgICAgICAgc2VsZi5zdHJpZGVXID0gcG9vbDJkb3B0aW9ucy5TdHJpZGVXKCkKLSAgICAgICAgc2VsZi5zdHJpZGVIID0gcG9vbDJkb3B0aW9ucy5TdHJpZGVIKCkKLSAgICAgICAgc2VsZi5maWx0ZXJXaWR0aCA9IHBvb2wyZG9wdGlvbnMuRmlsdGVyV2lkdGgoKQotICAgICAgICBzZWxmLmZpbHRlckhlaWdodCA9IHBvb2wyZG9wdGlvbnMuRmlsdGVySGVpZ2h0KCkKLSAgICAgICAgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbiA9IHBvb2wyZG9wdGlvbnMuRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oKQotCi0gICAgIyBQb29sMkRPcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBQb29sMkRPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgUG9vbDJET3B0aW9uc0FkZFBhZGRpbmcoYnVpbGRlciwgc2VsZi5wYWRkaW5nKQotICAgICAgICBQb29sMkRPcHRpb25zQWRkU3RyaWRlVyhidWlsZGVyLCBzZWxmLnN0cmlkZVcpCi0gICAgICAgIFBvb2wyRE9wdGlvbnNBZGRTdHJpZGVIKGJ1aWxkZXIsIHNlbGYuc3RyaWRlSCkKLSAgICAgICAgUG9vbDJET3B0aW9uc0FkZEZpbHRlcldpZHRoKGJ1aWxkZXIsIHNlbGYuZmlsdGVyV2lkdGgpCi0gICAgICAgIFBvb2wyRE9wdGlvbnNBZGRGaWx0ZXJIZWlnaHQoYnVpbGRlciwgc2VsZi5maWx0ZXJIZWlnaHQpCi0gICAgICAgIFBvb2wyRE9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBzZWxmLmZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKQotICAgICAgICBwb29sMmRvcHRpb25zID0gUG9vbDJET3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gcG9vbDJkb3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIFBvd09wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBQb3dPcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNQb3dPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgUG93T3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgUG93T3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLWRlZiBQb3dPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gUG93T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgUG93T3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFBvd09wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgUG93T3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgUG93T3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgcG93T3B0aW9ucyA9IFBvd09wdGlvbnMoKQotICAgICAgICBwb3dPcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoocG93T3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHBvd09wdGlvbnMpOgotICAgICAgICB4ID0gUG93T3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2socG93T3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgUG93T3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBwb3dPcHRpb25zKToKLSAgICAgICAgaWYgcG93T3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAjIFBvd09wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIFBvd09wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBwb3dPcHRpb25zID0gUG93T3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gcG93T3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1jbGFzcyBRdWFudGl6YXRpb25EZXRhaWxzKG9iamVjdCk6Ci0gICAgTk9ORSA9IDAKLSAgICBDdXN0b21RdWFudGl6YXRpb24gPSAxCi0KLWRlZiBRdWFudGl6YXRpb25EZXRhaWxzQ3JlYXRvcih1bmlvblR5cGUsIHRhYmxlKToKLSAgICBmcm9tIGZsYXRidWZmZXJzLnRhYmxlIGltcG9ydCBUYWJsZQotICAgIGlmIG5vdCBpc2luc3RhbmNlKHRhYmxlLCBUYWJsZSk6Ci0gICAgICAgIHJldHVybiBOb25lCi0gICAgaWYgdW5pb25UeXBlID09IFF1YW50aXphdGlvbkRldGFpbHMoKS5DdXN0b21RdWFudGl6YXRpb246Ci0gICAgICAgIHJldHVybiBDdXN0b21RdWFudGl6YXRpb25ULkluaXRGcm9tQnVmKHRhYmxlLkJ5dGVzLCB0YWJsZS5Qb3MpCi0gICAgcmV0dXJuIE5vbmUKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBRdWFudGl6YXRpb25QYXJhbWV0ZXJzKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gUXVhbnRpemF0aW9uUGFyYW1ldGVycygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzUXVhbnRpemF0aW9uUGFyYW1ldGVycyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIFF1YW50aXphdGlvblBhcmFtZXRlcnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIFF1YW50aXphdGlvblBhcmFtZXRlcnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi0gICAgIyBRdWFudGl6YXRpb25QYXJhbWV0ZXJzCi0gICAgZGVmIE1pbihzZWxmLCBqKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgYSA9IHNlbGYuX3RhYi5WZWN0b3IobykKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5GbG9hdDMyRmxhZ3MsIGEgKyBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGogKiA0KSkKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgUXVhbnRpemF0aW9uUGFyYW1ldGVycwotICAgIGRlZiBNaW5Bc051bXB5KHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldFZlY3RvckFzTnVtcHkoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkZsb2F0MzJGbGFncywgbykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgUXVhbnRpemF0aW9uUGFyYW1ldGVycwotICAgIGRlZiBNaW5MZW5ndGgoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuVmVjdG9yTGVuKG8pCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIFF1YW50aXphdGlvblBhcmFtZXRlcnMKLSAgICBkZWYgTWluSXNOb25lKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQotICAgICAgICByZXR1cm4gbyA9PSAwCi0KLSAgICAjIFF1YW50aXphdGlvblBhcmFtZXRlcnMKLSAgICBkZWYgTWF4KHNlbGYsIGopOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICBhID0gc2VsZi5fdGFiLlZlY3RvcihvKQotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkZsb2F0MzJGbGFncywgYSArIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaiAqIDQpKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBRdWFudGl6YXRpb25QYXJhbWV0ZXJzCi0gICAgZGVmIE1heEFzTnVtcHkoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0VmVjdG9yQXNOdW1weShmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuRmxvYXQzMkZsYWdzLCBvKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBRdWFudGl6YXRpb25QYXJhbWV0ZXJzCi0gICAgZGVmIE1heExlbmd0aChzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgUXVhbnRpemF0aW9uUGFyYW1ldGVycwotICAgIGRlZiBNYXhJc05vbmUoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCi0gICAgICAgIHJldHVybiBvID09IDAKLQotICAgICMgUXVhbnRpemF0aW9uUGFyYW1ldGVycwotICAgIGRlZiBTY2FsZShzZWxmLCBqKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg4KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgYSA9IHNlbGYuX3RhYi5WZWN0b3IobykKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5GbG9hdDMyRmxhZ3MsIGEgKyBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGogKiA0KSkKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgUXVhbnRpemF0aW9uUGFyYW1ldGVycwotICAgIGRlZiBTY2FsZUFzTnVtcHkoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0VmVjdG9yQXNOdW1weShmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuRmxvYXQzMkZsYWdzLCBvKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBRdWFudGl6YXRpb25QYXJhbWV0ZXJzCi0gICAgZGVmIFNjYWxlTGVuZ3RoKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlZlY3RvckxlbihvKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBRdWFudGl6YXRpb25QYXJhbWV0ZXJzCi0gICAgZGVmIFNjYWxlSXNOb25lKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQotICAgICAgICByZXR1cm4gbyA9PSAwCi0KLSAgICAjIFF1YW50aXphdGlvblBhcmFtZXRlcnMKLSAgICBkZWYgWmVyb1BvaW50KHNlbGYsIGopOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEwKSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgYSA9IHNlbGYuX3RhYi5WZWN0b3IobykKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ2NEZsYWdzLCBhICsgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShqICogOCkpCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIFF1YW50aXphdGlvblBhcmFtZXRlcnMKLSAgICBkZWYgWmVyb1BvaW50QXNOdW1weShzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0VmVjdG9yQXNOdW1weShmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgbykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgUXVhbnRpemF0aW9uUGFyYW1ldGVycwotICAgIGRlZiBaZXJvUG9pbnRMZW5ndGgoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTApKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlZlY3RvckxlbihvKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBRdWFudGl6YXRpb25QYXJhbWV0ZXJzCi0gICAgZGVmIFplcm9Qb2ludElzTm9uZShzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMCkpCi0gICAgICAgIHJldHVybiBvID09IDAKLQotICAgICMgUXVhbnRpemF0aW9uUGFyYW1ldGVycwotICAgIGRlZiBEZXRhaWxzVHlwZShzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMikpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VaW50OEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgUXVhbnRpemF0aW9uUGFyYW1ldGVycwotICAgIGRlZiBEZXRhaWxzKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDE0KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgZnJvbSBmbGF0YnVmZmVycy50YWJsZSBpbXBvcnQgVGFibGUKLSAgICAgICAgICAgIG9iaiA9IFRhYmxlKGJ5dGVhcnJheSgpLCAwKQotICAgICAgICAgICAgc2VsZi5fdGFiLlVuaW9uKG9iaiwgbykKLSAgICAgICAgICAgIHJldHVybiBvYmoKLSAgICAgICAgcmV0dXJuIE5vbmUKLQotICAgICMgUXVhbnRpemF0aW9uUGFyYW1ldGVycwotICAgIGRlZiBRdWFudGl6ZWREaW1lbnNpb24oc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTYpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiAwCi0KLWRlZiBRdWFudGl6YXRpb25QYXJhbWV0ZXJzU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoNykKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gUXVhbnRpemF0aW9uUGFyYW1ldGVyc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgUXVhbnRpemF0aW9uUGFyYW1ldGVyc0FkZE1pbihidWlsZGVyLCBtaW4pOiBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgwLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKG1pbiksIDApCi1kZWYgQWRkTWluKGJ1aWxkZXIsIG1pbik6Ci0gICAgcmV0dXJuIFF1YW50aXphdGlvblBhcmFtZXRlcnNBZGRNaW4oYnVpbGRlciwgbWluKQotZGVmIFF1YW50aXphdGlvblBhcmFtZXRlcnNTdGFydE1pblZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6IHJldHVybiBidWlsZGVyLlN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KQotZGVmIFN0YXJ0TWluVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKLSAgICByZXR1cm4gUXVhbnRpemF0aW9uUGFyYW1ldGVyc1N0YXJ0TWluVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKQotZGVmIFF1YW50aXphdGlvblBhcmFtZXRlcnNBZGRNYXgoYnVpbGRlciwgbWF4KTogYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMSwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShtYXgpLCAwKQotZGVmIEFkZE1heChidWlsZGVyLCBtYXgpOgotICAgIHJldHVybiBRdWFudGl6YXRpb25QYXJhbWV0ZXJzQWRkTWF4KGJ1aWxkZXIsIG1heCkKLWRlZiBRdWFudGl6YXRpb25QYXJhbWV0ZXJzU3RhcnRNYXhWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOiByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCkKLWRlZiBTdGFydE1heFZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6Ci0gICAgcmV0dXJuIFF1YW50aXphdGlvblBhcmFtZXRlcnNTdGFydE1heFZlY3RvcihidWlsZGVyLCBudW1FbGVtcykKLWRlZiBRdWFudGl6YXRpb25QYXJhbWV0ZXJzQWRkU2NhbGUoYnVpbGRlciwgc2NhbGUpOiBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgyLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNjYWxlKSwgMCkKLWRlZiBBZGRTY2FsZShidWlsZGVyLCBzY2FsZSk6Ci0gICAgcmV0dXJuIFF1YW50aXphdGlvblBhcmFtZXRlcnNBZGRTY2FsZShidWlsZGVyLCBzY2FsZSkKLWRlZiBRdWFudGl6YXRpb25QYXJhbWV0ZXJzU3RhcnRTY2FsZVZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6IHJldHVybiBidWlsZGVyLlN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KQotZGVmIFN0YXJ0U2NhbGVWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgotICAgIHJldHVybiBRdWFudGl6YXRpb25QYXJhbWV0ZXJzU3RhcnRTY2FsZVZlY3RvcihidWlsZGVyLCBudW1FbGVtcykKLWRlZiBRdWFudGl6YXRpb25QYXJhbWV0ZXJzQWRkWmVyb1BvaW50KGJ1aWxkZXIsIHplcm9Qb2ludCk6IGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDMsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoemVyb1BvaW50KSwgMCkKLWRlZiBBZGRaZXJvUG9pbnQoYnVpbGRlciwgemVyb1BvaW50KToKLSAgICByZXR1cm4gUXVhbnRpemF0aW9uUGFyYW1ldGVyc0FkZFplcm9Qb2ludChidWlsZGVyLCB6ZXJvUG9pbnQpCi1kZWYgUXVhbnRpemF0aW9uUGFyYW1ldGVyc1N0YXJ0WmVyb1BvaW50VmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKTogcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoOCwgbnVtRWxlbXMsIDgpCi1kZWYgU3RhcnRaZXJvUG9pbnRWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgotICAgIHJldHVybiBRdWFudGl6YXRpb25QYXJhbWV0ZXJzU3RhcnRaZXJvUG9pbnRWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpCi1kZWYgUXVhbnRpemF0aW9uUGFyYW1ldGVyc0FkZERldGFpbHNUeXBlKGJ1aWxkZXIsIGRldGFpbHNUeXBlKTogYnVpbGRlci5QcmVwZW5kVWludDhTbG90KDQsIGRldGFpbHNUeXBlLCAwKQotZGVmIEFkZERldGFpbHNUeXBlKGJ1aWxkZXIsIGRldGFpbHNUeXBlKToKLSAgICByZXR1cm4gUXVhbnRpemF0aW9uUGFyYW1ldGVyc0FkZERldGFpbHNUeXBlKGJ1aWxkZXIsIGRldGFpbHNUeXBlKQotZGVmIFF1YW50aXphdGlvblBhcmFtZXRlcnNBZGREZXRhaWxzKGJ1aWxkZXIsIGRldGFpbHMpOiBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCg1LCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGRldGFpbHMpLCAwKQotZGVmIEFkZERldGFpbHMoYnVpbGRlciwgZGV0YWlscyk6Ci0gICAgcmV0dXJuIFF1YW50aXphdGlvblBhcmFtZXRlcnNBZGREZXRhaWxzKGJ1aWxkZXIsIGRldGFpbHMpCi1kZWYgUXVhbnRpemF0aW9uUGFyYW1ldGVyc0FkZFF1YW50aXplZERpbWVuc2lvbihidWlsZGVyLCBxdWFudGl6ZWREaW1lbnNpb24pOiBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoNiwgcXVhbnRpemVkRGltZW5zaW9uLCAwKQotZGVmIEFkZFF1YW50aXplZERpbWVuc2lvbihidWlsZGVyLCBxdWFudGl6ZWREaW1lbnNpb24pOgotICAgIHJldHVybiBRdWFudGl6YXRpb25QYXJhbWV0ZXJzQWRkUXVhbnRpemVkRGltZW5zaW9uKGJ1aWxkZXIsIHF1YW50aXplZERpbWVuc2lvbikKLWRlZiBRdWFudGl6YXRpb25QYXJhbWV0ZXJzRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gUXVhbnRpemF0aW9uUGFyYW1ldGVyc0VuZChidWlsZGVyKQotdHJ5OgotICAgIGZyb20gdHlwaW5nIGltcG9ydCBMaXN0LCBVbmlvbgotZXhjZXB0OgotICAgIHBhc3MKLQotY2xhc3MgUXVhbnRpemF0aW9uUGFyYW1ldGVyc1Qob2JqZWN0KToKLQotICAgICMgUXVhbnRpemF0aW9uUGFyYW1ldGVyc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYubWluID0gTm9uZSAgIyB0eXBlOiBMaXN0W2Zsb2F0XQotICAgICAgICBzZWxmLm1heCA9IE5vbmUgICMgdHlwZTogTGlzdFtmbG9hdF0KLSAgICAgICAgc2VsZi5zY2FsZSA9IE5vbmUgICMgdHlwZTogTGlzdFtmbG9hdF0KLSAgICAgICAgc2VsZi56ZXJvUG9pbnQgPSBOb25lICAjIHR5cGU6IExpc3RbaW50XQotICAgICAgICBzZWxmLmRldGFpbHNUeXBlID0gMCAgIyB0eXBlOiBpbnQKLSAgICAgICAgc2VsZi5kZXRhaWxzID0gTm9uZSAgIyB0eXBlOiBVbmlvbltOb25lLCBDdXN0b21RdWFudGl6YXRpb25UXQotICAgICAgICBzZWxmLnF1YW50aXplZERpbWVuc2lvbiA9IDAgICMgdHlwZTogaW50Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIHF1YW50aXphdGlvblBhcmFtZXRlcnMgPSBRdWFudGl6YXRpb25QYXJhbWV0ZXJzKCkKLSAgICAgICAgcXVhbnRpemF0aW9uUGFyYW1ldGVycy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHF1YW50aXphdGlvblBhcmFtZXRlcnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBxdWFudGl6YXRpb25QYXJhbWV0ZXJzKToKLSAgICAgICAgeCA9IFF1YW50aXphdGlvblBhcmFtZXRlcnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKHF1YW50aXphdGlvblBhcmFtZXRlcnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIFF1YW50aXphdGlvblBhcmFtZXRlcnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgcXVhbnRpemF0aW9uUGFyYW1ldGVycyk6Ci0gICAgICAgIGlmIHF1YW50aXphdGlvblBhcmFtZXRlcnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBpZiBub3QgcXVhbnRpemF0aW9uUGFyYW1ldGVycy5NaW5Jc05vbmUoKToKLSAgICAgICAgICAgIGlmIG5wIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgc2VsZi5taW4gPSBbXQotICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHF1YW50aXphdGlvblBhcmFtZXRlcnMuTWluTGVuZ3RoKCkpOgotICAgICAgICAgICAgICAgICAgICBzZWxmLm1pbi5hcHBlbmQocXVhbnRpemF0aW9uUGFyYW1ldGVycy5NaW4oaSkpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlbGYubWluID0gcXVhbnRpemF0aW9uUGFyYW1ldGVycy5NaW5Bc051bXB5KCkKLSAgICAgICAgaWYgbm90IHF1YW50aXphdGlvblBhcmFtZXRlcnMuTWF4SXNOb25lKCk6Ci0gICAgICAgICAgICBpZiBucCBpcyBOb25lOgotICAgICAgICAgICAgICAgIHNlbGYubWF4ID0gW10KLSAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShxdWFudGl6YXRpb25QYXJhbWV0ZXJzLk1heExlbmd0aCgpKToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5tYXguYXBwZW5kKHF1YW50aXphdGlvblBhcmFtZXRlcnMuTWF4KGkpKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLm1heCA9IHF1YW50aXphdGlvblBhcmFtZXRlcnMuTWF4QXNOdW1weSgpCi0gICAgICAgIGlmIG5vdCBxdWFudGl6YXRpb25QYXJhbWV0ZXJzLlNjYWxlSXNOb25lKCk6Ci0gICAgICAgICAgICBpZiBucCBpcyBOb25lOgotICAgICAgICAgICAgICAgIHNlbGYuc2NhbGUgPSBbXQotICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHF1YW50aXphdGlvblBhcmFtZXRlcnMuU2NhbGVMZW5ndGgoKSk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuc2NhbGUuYXBwZW5kKHF1YW50aXphdGlvblBhcmFtZXRlcnMuU2NhbGUoaSkpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlbGYuc2NhbGUgPSBxdWFudGl6YXRpb25QYXJhbWV0ZXJzLlNjYWxlQXNOdW1weSgpCi0gICAgICAgIGlmIG5vdCBxdWFudGl6YXRpb25QYXJhbWV0ZXJzLlplcm9Qb2ludElzTm9uZSgpOgotICAgICAgICAgICAgaWYgbnAgaXMgTm9uZToKLSAgICAgICAgICAgICAgICBzZWxmLnplcm9Qb2ludCA9IFtdCi0gICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UocXVhbnRpemF0aW9uUGFyYW1ldGVycy5aZXJvUG9pbnRMZW5ndGgoKSk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuemVyb1BvaW50LmFwcGVuZChxdWFudGl6YXRpb25QYXJhbWV0ZXJzLlplcm9Qb2ludChpKSkKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgc2VsZi56ZXJvUG9pbnQgPSBxdWFudGl6YXRpb25QYXJhbWV0ZXJzLlplcm9Qb2ludEFzTnVtcHkoKQotICAgICAgICBzZWxmLmRldGFpbHNUeXBlID0gcXVhbnRpemF0aW9uUGFyYW1ldGVycy5EZXRhaWxzVHlwZSgpCi0gICAgICAgIHNlbGYuZGV0YWlscyA9IFF1YW50aXphdGlvbkRldGFpbHNDcmVhdG9yKHNlbGYuZGV0YWlsc1R5cGUsIHF1YW50aXphdGlvblBhcmFtZXRlcnMuRGV0YWlscygpKQotICAgICAgICBzZWxmLnF1YW50aXplZERpbWVuc2lvbiA9IHF1YW50aXphdGlvblBhcmFtZXRlcnMuUXVhbnRpemVkRGltZW5zaW9uKCkKLQotICAgICMgUXVhbnRpemF0aW9uUGFyYW1ldGVyc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgaWYgc2VsZi5taW4gaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBpZiBucCBpcyBub3QgTm9uZSBhbmQgdHlwZShzZWxmLm1pbikgaXMgbnAubmRhcnJheToKLSAgICAgICAgICAgICAgICBtaW4gPSBidWlsZGVyLkNyZWF0ZU51bXB5VmVjdG9yKHNlbGYubWluKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBRdWFudGl6YXRpb25QYXJhbWV0ZXJzU3RhcnRNaW5WZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYubWluKSkKLSAgICAgICAgICAgICAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShsZW4oc2VsZi5taW4pKSk6Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZEZsb2F0MzIoc2VsZi5taW5baV0pCi0gICAgICAgICAgICAgICAgbWluID0gYnVpbGRlci5FbmRWZWN0b3IoKQotICAgICAgICBpZiBzZWxmLm1heCBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIGlmIG5wIGlzIG5vdCBOb25lIGFuZCB0eXBlKHNlbGYubWF4KSBpcyBucC5uZGFycmF5OgotICAgICAgICAgICAgICAgIG1heCA9IGJ1aWxkZXIuQ3JlYXRlTnVtcHlWZWN0b3Ioc2VsZi5tYXgpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIFF1YW50aXphdGlvblBhcmFtZXRlcnNTdGFydE1heFZlY3RvcihidWlsZGVyLCBsZW4oc2VsZi5tYXgpKQotICAgICAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLm1heCkpKToKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5QcmVwZW5kRmxvYXQzMihzZWxmLm1heFtpXSkKLSAgICAgICAgICAgICAgICBtYXggPSBidWlsZGVyLkVuZFZlY3RvcigpCi0gICAgICAgIGlmIHNlbGYuc2NhbGUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBpZiBucCBpcyBub3QgTm9uZSBhbmQgdHlwZShzZWxmLnNjYWxlKSBpcyBucC5uZGFycmF5OgotICAgICAgICAgICAgICAgIHNjYWxlID0gYnVpbGRlci5DcmVhdGVOdW1weVZlY3RvcihzZWxmLnNjYWxlKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBRdWFudGl6YXRpb25QYXJhbWV0ZXJzU3RhcnRTY2FsZVZlY3RvcihidWlsZGVyLCBsZW4oc2VsZi5zY2FsZSkpCi0gICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYuc2NhbGUpKSk6Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZEZsb2F0MzIoc2VsZi5zY2FsZVtpXSkKLSAgICAgICAgICAgICAgICBzY2FsZSA9IGJ1aWxkZXIuRW5kVmVjdG9yKCkKLSAgICAgICAgaWYgc2VsZi56ZXJvUG9pbnQgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBpZiBucCBpcyBub3QgTm9uZSBhbmQgdHlwZShzZWxmLnplcm9Qb2ludCkgaXMgbnAubmRhcnJheToKLSAgICAgICAgICAgICAgICB6ZXJvUG9pbnQgPSBidWlsZGVyLkNyZWF0ZU51bXB5VmVjdG9yKHNlbGYuemVyb1BvaW50KQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBRdWFudGl6YXRpb25QYXJhbWV0ZXJzU3RhcnRaZXJvUG9pbnRWZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYuemVyb1BvaW50KSkKLSAgICAgICAgICAgICAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShsZW4oc2VsZi56ZXJvUG9pbnQpKSk6Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZEludDY0KHNlbGYuemVyb1BvaW50W2ldKQotICAgICAgICAgICAgICAgIHplcm9Qb2ludCA9IGJ1aWxkZXIuRW5kVmVjdG9yKCkKLSAgICAgICAgaWYgc2VsZi5kZXRhaWxzIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgZGV0YWlscyA9IHNlbGYuZGV0YWlscy5QYWNrKGJ1aWxkZXIpCi0gICAgICAgIFF1YW50aXphdGlvblBhcmFtZXRlcnNTdGFydChidWlsZGVyKQotICAgICAgICBpZiBzZWxmLm1pbiBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIFF1YW50aXphdGlvblBhcmFtZXRlcnNBZGRNaW4oYnVpbGRlciwgbWluKQotICAgICAgICBpZiBzZWxmLm1heCBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIFF1YW50aXphdGlvblBhcmFtZXRlcnNBZGRNYXgoYnVpbGRlciwgbWF4KQotICAgICAgICBpZiBzZWxmLnNjYWxlIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgUXVhbnRpemF0aW9uUGFyYW1ldGVyc0FkZFNjYWxlKGJ1aWxkZXIsIHNjYWxlKQotICAgICAgICBpZiBzZWxmLnplcm9Qb2ludCBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIFF1YW50aXphdGlvblBhcmFtZXRlcnNBZGRaZXJvUG9pbnQoYnVpbGRlciwgemVyb1BvaW50KQotICAgICAgICBRdWFudGl6YXRpb25QYXJhbWV0ZXJzQWRkRGV0YWlsc1R5cGUoYnVpbGRlciwgc2VsZi5kZXRhaWxzVHlwZSkKLSAgICAgICAgaWYgc2VsZi5kZXRhaWxzIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgUXVhbnRpemF0aW9uUGFyYW1ldGVyc0FkZERldGFpbHMoYnVpbGRlciwgZGV0YWlscykKLSAgICAgICAgUXVhbnRpemF0aW9uUGFyYW1ldGVyc0FkZFF1YW50aXplZERpbWVuc2lvbihidWlsZGVyLCBzZWxmLnF1YW50aXplZERpbWVuc2lvbikKLSAgICAgICAgcXVhbnRpemF0aW9uUGFyYW1ldGVycyA9IFF1YW50aXphdGlvblBhcmFtZXRlcnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIHF1YW50aXphdGlvblBhcmFtZXRlcnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBRdWFudGl6ZU9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBRdWFudGl6ZU9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc1F1YW50aXplT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIFF1YW50aXplT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgUXVhbnRpemVPcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotZGVmIFF1YW50aXplT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFF1YW50aXplT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgUXVhbnRpemVPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gUXVhbnRpemVPcHRpb25zRW5kKGJ1aWxkZXIpCi0KLWNsYXNzIFF1YW50aXplT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgUXVhbnRpemVPcHRpb25zVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgcGFzcwotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBxdWFudGl6ZU9wdGlvbnMgPSBRdWFudGl6ZU9wdGlvbnMoKQotICAgICAgICBxdWFudGl6ZU9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihxdWFudGl6ZU9wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBxdWFudGl6ZU9wdGlvbnMpOgotICAgICAgICB4ID0gUXVhbnRpemVPcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhxdWFudGl6ZU9wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIFF1YW50aXplT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBxdWFudGl6ZU9wdGlvbnMpOgotICAgICAgICBpZiBxdWFudGl6ZU9wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgIyBRdWFudGl6ZU9wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIFF1YW50aXplT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIHF1YW50aXplT3B0aW9ucyA9IFF1YW50aXplT3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gcXVhbnRpemVPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgUk5OT3B0aW9ucyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IFJOTk9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc1JOTk9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBSTk5PcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBSTk5PcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotICAgICMgUk5OT3B0aW9ucwotICAgIGRlZiBGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDhGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIFJOTk9wdGlvbnMKLSAgICBkZWYgQXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gYm9vbChzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5Cb29sRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKSkKLSAgICAgICAgcmV0dXJuIEZhbHNlCi0KLWRlZiBSTk5PcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMikKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gUk5OT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgUk5OT3B0aW9uc0FkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKTogYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoMCwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24sIDApCi1kZWYgQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pOgotICAgIHJldHVybiBSTk5PcHRpb25zQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pCi1kZWYgUk5OT3B0aW9uc0FkZEFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyhidWlsZGVyLCBhc3ltbWV0cmljUXVhbnRpemVJbnB1dHMpOiBidWlsZGVyLlByZXBlbmRCb29sU2xvdCgxLCBhc3ltbWV0cmljUXVhbnRpemVJbnB1dHMsIDApCi1kZWYgQWRkQXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKGJ1aWxkZXIsIGFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyk6Ci0gICAgcmV0dXJuIFJOTk9wdGlvbnNBZGRBc3ltbWV0cmljUXVhbnRpemVJbnB1dHMoYnVpbGRlciwgYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKQotZGVmIFJOTk9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBSTk5PcHRpb25zRW5kKGJ1aWxkZXIpCi0KLWNsYXNzIFJOTk9wdGlvbnNUKG9iamVjdCk6Ci0KLSAgICAjIFJOTk9wdGlvbnNUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBzZWxmLmZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uID0gMCAgIyB0eXBlOiBpbnQKLSAgICAgICAgc2VsZi5hc3ltbWV0cmljUXVhbnRpemVJbnB1dHMgPSBGYWxzZSAgIyB0eXBlOiBib29sCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIHJubm9wdGlvbnMgPSBSTk5PcHRpb25zKCkKLSAgICAgICAgcm5ub3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHJubm9wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBybm5vcHRpb25zKToKLSAgICAgICAgeCA9IFJOTk9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKHJubm9wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIFJOTk9wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgcm5ub3B0aW9ucyk6Ci0gICAgICAgIGlmIHJubm9wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLmZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uID0gcm5ub3B0aW9ucy5GdXNlZEFjdGl2YXRpb25GdW5jdGlvbigpCi0gICAgICAgIHNlbGYuYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzID0gcm5ub3B0aW9ucy5Bc3ltbWV0cmljUXVhbnRpemVJbnB1dHMoKQotCi0gICAgIyBSTk5PcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBSTk5PcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgUk5OT3B0aW9uc0FkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIHNlbGYuZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pCi0gICAgICAgIFJOTk9wdGlvbnNBZGRBc3ltbWV0cmljUXVhbnRpemVJbnB1dHMoYnVpbGRlciwgc2VsZi5hc3ltbWV0cmljUXVhbnRpemVJbnB1dHMpCi0gICAgICAgIHJubm9wdGlvbnMgPSBSTk5PcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBybm5vcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgUmFuZG9tT3B0aW9ucyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IFJhbmRvbU9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc1JhbmRvbU9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBSYW5kb21PcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBSYW5kb21PcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotICAgICMgUmFuZG9tT3B0aW9ucwotICAgIGRlZiBTZWVkKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50NjRGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIFJhbmRvbU9wdGlvbnMKLSAgICBkZWYgU2VlZDIoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ2NEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAKLQotZGVmIFJhbmRvbU9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgyKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBSYW5kb21PcHRpb25zU3RhcnQoYnVpbGRlcikKLWRlZiBSYW5kb21PcHRpb25zQWRkU2VlZChidWlsZGVyLCBzZWVkKTogYnVpbGRlci5QcmVwZW5kSW50NjRTbG90KDAsIHNlZWQsIDApCi1kZWYgQWRkU2VlZChidWlsZGVyLCBzZWVkKToKLSAgICByZXR1cm4gUmFuZG9tT3B0aW9uc0FkZFNlZWQoYnVpbGRlciwgc2VlZCkKLWRlZiBSYW5kb21PcHRpb25zQWRkU2VlZDIoYnVpbGRlciwgc2VlZDIpOiBidWlsZGVyLlByZXBlbmRJbnQ2NFNsb3QoMSwgc2VlZDIsIDApCi1kZWYgQWRkU2VlZDIoYnVpbGRlciwgc2VlZDIpOgotICAgIHJldHVybiBSYW5kb21PcHRpb25zQWRkU2VlZDIoYnVpbGRlciwgc2VlZDIpCi1kZWYgUmFuZG9tT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFJhbmRvbU9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgUmFuZG9tT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgUmFuZG9tT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYuc2VlZCA9IDAgICMgdHlwZTogaW50Ci0gICAgICAgIHNlbGYuc2VlZDIgPSAwICAjIHR5cGU6IGludAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICByYW5kb21PcHRpb25zID0gUmFuZG9tT3B0aW9ucygpCi0gICAgICAgIHJhbmRvbU9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihyYW5kb21PcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgcmFuZG9tT3B0aW9ucyk6Ci0gICAgICAgIHggPSBSYW5kb21PcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhyYW5kb21PcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBSYW5kb21PcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIHJhbmRvbU9wdGlvbnMpOgotICAgICAgICBpZiByYW5kb21PcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi5zZWVkID0gcmFuZG9tT3B0aW9ucy5TZWVkKCkKLSAgICAgICAgc2VsZi5zZWVkMiA9IHJhbmRvbU9wdGlvbnMuU2VlZDIoKQotCi0gICAgIyBSYW5kb21PcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBSYW5kb21PcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgUmFuZG9tT3B0aW9uc0FkZFNlZWQoYnVpbGRlciwgc2VsZi5zZWVkKQotICAgICAgICBSYW5kb21PcHRpb25zQWRkU2VlZDIoYnVpbGRlciwgc2VsZi5zZWVkMikKLSAgICAgICAgcmFuZG9tT3B0aW9ucyA9IFJhbmRvbU9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIHJhbmRvbU9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBSYW5nZU9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBSYW5nZU9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc1JhbmdlT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIFJhbmdlT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgUmFuZ2VPcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotZGVmIFJhbmdlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFJhbmdlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgUmFuZ2VPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gUmFuZ2VPcHRpb25zRW5kKGJ1aWxkZXIpCi0KLWNsYXNzIFJhbmdlT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgUmFuZ2VPcHRpb25zVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgcGFzcwotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICByYW5nZU9wdGlvbnMgPSBSYW5nZU9wdGlvbnMoKQotICAgICAgICByYW5nZU9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihyYW5nZU9wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCByYW5nZU9wdGlvbnMpOgotICAgICAgICB4ID0gUmFuZ2VPcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhyYW5nZU9wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIFJhbmdlT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCByYW5nZU9wdGlvbnMpOgotICAgICAgICBpZiByYW5nZU9wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgIyBSYW5nZU9wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIFJhbmdlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIHJhbmdlT3B0aW9ucyA9IFJhbmdlT3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gcmFuZ2VPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgUmFua09wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBSYW5rT3B0aW9ucygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzUmFua09wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBSYW5rT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgUmFua09wdGlvbnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi1kZWYgUmFua09wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgwKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBSYW5rT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgUmFua09wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBSYW5rT3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBSYW5rT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgUmFua09wdGlvbnNUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBwYXNzCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIHJhbmtPcHRpb25zID0gUmFua09wdGlvbnMoKQotICAgICAgICByYW5rT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHJhbmtPcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgcmFua09wdGlvbnMpOgotICAgICAgICB4ID0gUmFua09wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKHJhbmtPcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBSYW5rT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCByYW5rT3B0aW9ucyk6Ci0gICAgICAgIGlmIHJhbmtPcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLQotICAgICMgUmFua09wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIFJhbmtPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgcmFua09wdGlvbnMgPSBSYW5rT3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gcmFua09wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBSZWFkVmFyaWFibGVPcHRpb25zKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gUmVhZFZhcmlhYmxlT3B0aW9ucygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzUmVhZFZhcmlhYmxlT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIFJlYWRWYXJpYWJsZU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIFJlYWRWYXJpYWJsZU9wdGlvbnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi1kZWYgUmVhZFZhcmlhYmxlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFJlYWRWYXJpYWJsZU9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIFJlYWRWYXJpYWJsZU9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBSZWFkVmFyaWFibGVPcHRpb25zRW5kKGJ1aWxkZXIpCi0KLWNsYXNzIFJlYWRWYXJpYWJsZU9wdGlvbnNUKG9iamVjdCk6Ci0KLSAgICAjIFJlYWRWYXJpYWJsZU9wdGlvbnNUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBwYXNzCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIHJlYWRWYXJpYWJsZU9wdGlvbnMgPSBSZWFkVmFyaWFibGVPcHRpb25zKCkKLSAgICAgICAgcmVhZFZhcmlhYmxlT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHJlYWRWYXJpYWJsZU9wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCByZWFkVmFyaWFibGVPcHRpb25zKToKLSAgICAgICAgeCA9IFJlYWRWYXJpYWJsZU9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKHJlYWRWYXJpYWJsZU9wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIFJlYWRWYXJpYWJsZU9wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgcmVhZFZhcmlhYmxlT3B0aW9ucyk6Ci0gICAgICAgIGlmIHJlYWRWYXJpYWJsZU9wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgIyBSZWFkVmFyaWFibGVPcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBSZWFkVmFyaWFibGVPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgcmVhZFZhcmlhYmxlT3B0aW9ucyA9IFJlYWRWYXJpYWJsZU9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIHJlYWRWYXJpYWJsZU9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBSZWR1Y2VyT3B0aW9ucyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IFJlZHVjZXJPcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNSZWR1Y2VyT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIFJlZHVjZXJPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBSZWR1Y2VyT3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLSAgICAjIFJlZHVjZXJPcHRpb25zCi0gICAgZGVmIEtlZXBEaW1zKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gYm9vbChzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5Cb29sRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKSkKLSAgICAgICAgcmV0dXJuIEZhbHNlCi0KLWRlZiBSZWR1Y2VyT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDEpCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFJlZHVjZXJPcHRpb25zU3RhcnQoYnVpbGRlcikKLWRlZiBSZWR1Y2VyT3B0aW9uc0FkZEtlZXBEaW1zKGJ1aWxkZXIsIGtlZXBEaW1zKTogYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoMCwga2VlcERpbXMsIDApCi1kZWYgQWRkS2VlcERpbXMoYnVpbGRlciwga2VlcERpbXMpOgotICAgIHJldHVybiBSZWR1Y2VyT3B0aW9uc0FkZEtlZXBEaW1zKGJ1aWxkZXIsIGtlZXBEaW1zKQotZGVmIFJlZHVjZXJPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gUmVkdWNlck9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgUmVkdWNlck9wdGlvbnNUKG9iamVjdCk6Ci0KLSAgICAjIFJlZHVjZXJPcHRpb25zVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi5rZWVwRGltcyA9IEZhbHNlICAjIHR5cGU6IGJvb2wKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgcmVkdWNlck9wdGlvbnMgPSBSZWR1Y2VyT3B0aW9ucygpCi0gICAgICAgIHJlZHVjZXJPcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoocmVkdWNlck9wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCByZWR1Y2VyT3B0aW9ucyk6Ci0gICAgICAgIHggPSBSZWR1Y2VyT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2socmVkdWNlck9wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIFJlZHVjZXJPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIHJlZHVjZXJPcHRpb25zKToKLSAgICAgICAgaWYgcmVkdWNlck9wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLmtlZXBEaW1zID0gcmVkdWNlck9wdGlvbnMuS2VlcERpbXMoKQotCi0gICAgIyBSZWR1Y2VyT3B0aW9uc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgUmVkdWNlck9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBSZWR1Y2VyT3B0aW9uc0FkZEtlZXBEaW1zKGJ1aWxkZXIsIHNlbGYua2VlcERpbXMpCi0gICAgICAgIHJlZHVjZXJPcHRpb25zID0gUmVkdWNlck9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIHJlZHVjZXJPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgUmVzaGFwZU9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBSZXNoYXBlT3B0aW9ucygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzUmVzaGFwZU9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBSZXNoYXBlT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgUmVzaGFwZU9wdGlvbnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi0gICAgIyBSZXNoYXBlT3B0aW9ucwotICAgIGRlZiBOZXdTaGFwZShzZWxmLCBqKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgYSA9IHNlbGYuX3RhYi5WZWN0b3IobykKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBhICsgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShqICogNCkpCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIFJlc2hhcGVPcHRpb25zCi0gICAgZGVmIE5ld1NoYXBlQXNOdW1weShzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXRWZWN0b3JBc051bXB5KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBSZXNoYXBlT3B0aW9ucwotICAgIGRlZiBOZXdTaGFwZUxlbmd0aChzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgUmVzaGFwZU9wdGlvbnMKLSAgICBkZWYgTmV3U2hhcGVJc05vbmUoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCi0gICAgICAgIHJldHVybiBvID09IDAKLQotZGVmIFJlc2hhcGVPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMSkKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gUmVzaGFwZU9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIFJlc2hhcGVPcHRpb25zQWRkTmV3U2hhcGUoYnVpbGRlciwgbmV3U2hhcGUpOiBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgwLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKG5ld1NoYXBlKSwgMCkKLWRlZiBBZGROZXdTaGFwZShidWlsZGVyLCBuZXdTaGFwZSk6Ci0gICAgcmV0dXJuIFJlc2hhcGVPcHRpb25zQWRkTmV3U2hhcGUoYnVpbGRlciwgbmV3U2hhcGUpCi1kZWYgUmVzaGFwZU9wdGlvbnNTdGFydE5ld1NoYXBlVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKTogcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpCi1kZWYgU3RhcnROZXdTaGFwZVZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6Ci0gICAgcmV0dXJuIFJlc2hhcGVPcHRpb25zU3RhcnROZXdTaGFwZVZlY3RvcihidWlsZGVyLCBudW1FbGVtcykKLWRlZiBSZXNoYXBlT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFJlc2hhcGVPcHRpb25zRW5kKGJ1aWxkZXIpCi10cnk6Ci0gICAgZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QKLWV4Y2VwdDoKLSAgICBwYXNzCi0KLWNsYXNzIFJlc2hhcGVPcHRpb25zVChvYmplY3QpOgotCi0gICAgIyBSZXNoYXBlT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYubmV3U2hhcGUgPSBOb25lICAjIHR5cGU6IExpc3RbaW50XQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICByZXNoYXBlT3B0aW9ucyA9IFJlc2hhcGVPcHRpb25zKCkKLSAgICAgICAgcmVzaGFwZU9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihyZXNoYXBlT3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHJlc2hhcGVPcHRpb25zKToKLSAgICAgICAgeCA9IFJlc2hhcGVPcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhyZXNoYXBlT3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgUmVzaGFwZU9wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgcmVzaGFwZU9wdGlvbnMpOgotICAgICAgICBpZiByZXNoYXBlT3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGlmIG5vdCByZXNoYXBlT3B0aW9ucy5OZXdTaGFwZUlzTm9uZSgpOgotICAgICAgICAgICAgaWYgbnAgaXMgTm9uZToKLSAgICAgICAgICAgICAgICBzZWxmLm5ld1NoYXBlID0gW10KLSAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShyZXNoYXBlT3B0aW9ucy5OZXdTaGFwZUxlbmd0aCgpKToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5uZXdTaGFwZS5hcHBlbmQocmVzaGFwZU9wdGlvbnMuTmV3U2hhcGUoaSkpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlbGYubmV3U2hhcGUgPSByZXNoYXBlT3B0aW9ucy5OZXdTaGFwZUFzTnVtcHkoKQotCi0gICAgIyBSZXNoYXBlT3B0aW9uc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgaWYgc2VsZi5uZXdTaGFwZSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIGlmIG5wIGlzIG5vdCBOb25lIGFuZCB0eXBlKHNlbGYubmV3U2hhcGUpIGlzIG5wLm5kYXJyYXk6Ci0gICAgICAgICAgICAgICAgbmV3U2hhcGUgPSBidWlsZGVyLkNyZWF0ZU51bXB5VmVjdG9yKHNlbGYubmV3U2hhcGUpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIFJlc2hhcGVPcHRpb25zU3RhcnROZXdTaGFwZVZlY3RvcihidWlsZGVyLCBsZW4oc2VsZi5uZXdTaGFwZSkpCi0gICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYubmV3U2hhcGUpKSk6Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZEludDMyKHNlbGYubmV3U2hhcGVbaV0pCi0gICAgICAgICAgICAgICAgbmV3U2hhcGUgPSBidWlsZGVyLkVuZFZlY3RvcigpCi0gICAgICAgIFJlc2hhcGVPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgaWYgc2VsZi5uZXdTaGFwZSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIFJlc2hhcGVPcHRpb25zQWRkTmV3U2hhcGUoYnVpbGRlciwgbmV3U2hhcGUpCi0gICAgICAgIHJlc2hhcGVPcHRpb25zID0gUmVzaGFwZU9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIHJlc2hhcGVPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgUmVzaXplQmlsaW5lYXJPcHRpb25zKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gUmVzaXplQmlsaW5lYXJPcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNSZXNpemVCaWxpbmVhck9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBSZXNpemVCaWxpbmVhck9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIFJlc2l6ZUJpbGluZWFyT3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLSAgICAjIFJlc2l6ZUJpbGluZWFyT3B0aW9ucwotICAgIGRlZiBBbGlnbkNvcm5lcnMoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkJvb2xGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpKQotICAgICAgICByZXR1cm4gRmFsc2UKLQotICAgICMgUmVzaXplQmlsaW5lYXJPcHRpb25zCi0gICAgZGVmIEhhbGZQaXhlbENlbnRlcnMoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTApKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gYm9vbChzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5Cb29sRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKSkKLSAgICAgICAgcmV0dXJuIEZhbHNlCi0KLWRlZiBSZXNpemVCaWxpbmVhck9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCg0KQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBSZXNpemVCaWxpbmVhck9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIFJlc2l6ZUJpbGluZWFyT3B0aW9uc0FkZEFsaWduQ29ybmVycyhidWlsZGVyLCBhbGlnbkNvcm5lcnMpOiBidWlsZGVyLlByZXBlbmRCb29sU2xvdCgyLCBhbGlnbkNvcm5lcnMsIDApCi1kZWYgQWRkQWxpZ25Db3JuZXJzKGJ1aWxkZXIsIGFsaWduQ29ybmVycyk6Ci0gICAgcmV0dXJuIFJlc2l6ZUJpbGluZWFyT3B0aW9uc0FkZEFsaWduQ29ybmVycyhidWlsZGVyLCBhbGlnbkNvcm5lcnMpCi1kZWYgUmVzaXplQmlsaW5lYXJPcHRpb25zQWRkSGFsZlBpeGVsQ2VudGVycyhidWlsZGVyLCBoYWxmUGl4ZWxDZW50ZXJzKTogYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoMywgaGFsZlBpeGVsQ2VudGVycywgMCkKLWRlZiBBZGRIYWxmUGl4ZWxDZW50ZXJzKGJ1aWxkZXIsIGhhbGZQaXhlbENlbnRlcnMpOgotICAgIHJldHVybiBSZXNpemVCaWxpbmVhck9wdGlvbnNBZGRIYWxmUGl4ZWxDZW50ZXJzKGJ1aWxkZXIsIGhhbGZQaXhlbENlbnRlcnMpCi1kZWYgUmVzaXplQmlsaW5lYXJPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gUmVzaXplQmlsaW5lYXJPcHRpb25zRW5kKGJ1aWxkZXIpCi0KLWNsYXNzIFJlc2l6ZUJpbGluZWFyT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgUmVzaXplQmlsaW5lYXJPcHRpb25zVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi5hbGlnbkNvcm5lcnMgPSBGYWxzZSAgIyB0eXBlOiBib29sCi0gICAgICAgIHNlbGYuaGFsZlBpeGVsQ2VudGVycyA9IEZhbHNlICAjIHR5cGU6IGJvb2wKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgcmVzaXplQmlsaW5lYXJPcHRpb25zID0gUmVzaXplQmlsaW5lYXJPcHRpb25zKCkKLSAgICAgICAgcmVzaXplQmlsaW5lYXJPcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoocmVzaXplQmlsaW5lYXJPcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgcmVzaXplQmlsaW5lYXJPcHRpb25zKToKLSAgICAgICAgeCA9IFJlc2l6ZUJpbGluZWFyT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2socmVzaXplQmlsaW5lYXJPcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBSZXNpemVCaWxpbmVhck9wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgcmVzaXplQmlsaW5lYXJPcHRpb25zKToKLSAgICAgICAgaWYgcmVzaXplQmlsaW5lYXJPcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi5hbGlnbkNvcm5lcnMgPSByZXNpemVCaWxpbmVhck9wdGlvbnMuQWxpZ25Db3JuZXJzKCkKLSAgICAgICAgc2VsZi5oYWxmUGl4ZWxDZW50ZXJzID0gcmVzaXplQmlsaW5lYXJPcHRpb25zLkhhbGZQaXhlbENlbnRlcnMoKQotCi0gICAgIyBSZXNpemVCaWxpbmVhck9wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIFJlc2l6ZUJpbGluZWFyT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIFJlc2l6ZUJpbGluZWFyT3B0aW9uc0FkZEFsaWduQ29ybmVycyhidWlsZGVyLCBzZWxmLmFsaWduQ29ybmVycykKLSAgICAgICAgUmVzaXplQmlsaW5lYXJPcHRpb25zQWRkSGFsZlBpeGVsQ2VudGVycyhidWlsZGVyLCBzZWxmLmhhbGZQaXhlbENlbnRlcnMpCi0gICAgICAgIHJlc2l6ZUJpbGluZWFyT3B0aW9ucyA9IFJlc2l6ZUJpbGluZWFyT3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gcmVzaXplQmlsaW5lYXJPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgUmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9ucyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc1Jlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotICAgICMgUmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9ucwotICAgIGRlZiBBbGlnbkNvcm5lcnMoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkJvb2xGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpKQotICAgICAgICByZXR1cm4gRmFsc2UKLQotICAgICMgUmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9ucwotICAgIGRlZiBIYWxmUGl4ZWxDZW50ZXJzKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gYm9vbChzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5Cb29sRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKSkKLSAgICAgICAgcmV0dXJuIEZhbHNlCi0KLWRlZiBSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMikKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gUmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgUmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9uc0FkZEFsaWduQ29ybmVycyhidWlsZGVyLCBhbGlnbkNvcm5lcnMpOiBidWlsZGVyLlByZXBlbmRCb29sU2xvdCgwLCBhbGlnbkNvcm5lcnMsIDApCi1kZWYgQWRkQWxpZ25Db3JuZXJzKGJ1aWxkZXIsIGFsaWduQ29ybmVycyk6Ci0gICAgcmV0dXJuIFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnNBZGRBbGlnbkNvcm5lcnMoYnVpbGRlciwgYWxpZ25Db3JuZXJzKQotZGVmIFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnNBZGRIYWxmUGl4ZWxDZW50ZXJzKGJ1aWxkZXIsIGhhbGZQaXhlbENlbnRlcnMpOiBidWlsZGVyLlByZXBlbmRCb29sU2xvdCgxLCBoYWxmUGl4ZWxDZW50ZXJzLCAwKQotZGVmIEFkZEhhbGZQaXhlbENlbnRlcnMoYnVpbGRlciwgaGFsZlBpeGVsQ2VudGVycyk6Ci0gICAgcmV0dXJuIFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnNBZGRIYWxmUGl4ZWxDZW50ZXJzKGJ1aWxkZXIsIGhhbGZQaXhlbENlbnRlcnMpCi1kZWYgUmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgUmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgUmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYuYWxpZ25Db3JuZXJzID0gRmFsc2UgICMgdHlwZTogYm9vbAotICAgICAgICBzZWxmLmhhbGZQaXhlbENlbnRlcnMgPSBGYWxzZSAgIyB0eXBlOiBib29sCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIHJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnMgPSBSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zKCkKLSAgICAgICAgcmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCByZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zKToKLSAgICAgICAgeCA9IFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKHJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgcmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9ucyk6Ci0gICAgICAgIGlmIHJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLmFsaWduQ29ybmVycyA9IHJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnMuQWxpZ25Db3JuZXJzKCkKLSAgICAgICAgc2VsZi5oYWxmUGl4ZWxDZW50ZXJzID0gcmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9ucy5IYWxmUGl4ZWxDZW50ZXJzKCkKLQotICAgICMgUmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9uc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgUmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnNBZGRBbGlnbkNvcm5lcnMoYnVpbGRlciwgc2VsZi5hbGlnbkNvcm5lcnMpCi0gICAgICAgIFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnNBZGRIYWxmUGl4ZWxDZW50ZXJzKGJ1aWxkZXIsIHNlbGYuaGFsZlBpeGVsQ2VudGVycykKLSAgICAgICAgcmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9ucyA9IFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIHJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBSZXZlcnNlU2VxdWVuY2VPcHRpb25zKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gUmV2ZXJzZVNlcXVlbmNlT3B0aW9ucygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzUmV2ZXJzZVNlcXVlbmNlT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIFJldmVyc2VTZXF1ZW5jZU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIFJldmVyc2VTZXF1ZW5jZU9wdGlvbnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi0gICAgIyBSZXZlcnNlU2VxdWVuY2VPcHRpb25zCi0gICAgZGVmIFNlcURpbShzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBSZXZlcnNlU2VxdWVuY2VPcHRpb25zCi0gICAgZGVmIEJhdGNoRGltKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiAwCi0KLWRlZiBSZXZlcnNlU2VxdWVuY2VPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMikKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gUmV2ZXJzZVNlcXVlbmNlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgUmV2ZXJzZVNlcXVlbmNlT3B0aW9uc0FkZFNlcURpbShidWlsZGVyLCBzZXFEaW0pOiBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMCwgc2VxRGltLCAwKQotZGVmIEFkZFNlcURpbShidWlsZGVyLCBzZXFEaW0pOgotICAgIHJldHVybiBSZXZlcnNlU2VxdWVuY2VPcHRpb25zQWRkU2VxRGltKGJ1aWxkZXIsIHNlcURpbSkKLWRlZiBSZXZlcnNlU2VxdWVuY2VPcHRpb25zQWRkQmF0Y2hEaW0oYnVpbGRlciwgYmF0Y2hEaW0pOiBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMSwgYmF0Y2hEaW0sIDApCi1kZWYgQWRkQmF0Y2hEaW0oYnVpbGRlciwgYmF0Y2hEaW0pOgotICAgIHJldHVybiBSZXZlcnNlU2VxdWVuY2VPcHRpb25zQWRkQmF0Y2hEaW0oYnVpbGRlciwgYmF0Y2hEaW0pCi1kZWYgUmV2ZXJzZVNlcXVlbmNlT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFJldmVyc2VTZXF1ZW5jZU9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgUmV2ZXJzZVNlcXVlbmNlT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgUmV2ZXJzZVNlcXVlbmNlT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYuc2VxRGltID0gMCAgIyB0eXBlOiBpbnQKLSAgICAgICAgc2VsZi5iYXRjaERpbSA9IDAgICMgdHlwZTogaW50Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIHJldmVyc2VTZXF1ZW5jZU9wdGlvbnMgPSBSZXZlcnNlU2VxdWVuY2VPcHRpb25zKCkKLSAgICAgICAgcmV2ZXJzZVNlcXVlbmNlT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHJldmVyc2VTZXF1ZW5jZU9wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCByZXZlcnNlU2VxdWVuY2VPcHRpb25zKToKLSAgICAgICAgeCA9IFJldmVyc2VTZXF1ZW5jZU9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKHJldmVyc2VTZXF1ZW5jZU9wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIFJldmVyc2VTZXF1ZW5jZU9wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgcmV2ZXJzZVNlcXVlbmNlT3B0aW9ucyk6Ci0gICAgICAgIGlmIHJldmVyc2VTZXF1ZW5jZU9wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLnNlcURpbSA9IHJldmVyc2VTZXF1ZW5jZU9wdGlvbnMuU2VxRGltKCkKLSAgICAgICAgc2VsZi5iYXRjaERpbSA9IHJldmVyc2VTZXF1ZW5jZU9wdGlvbnMuQmF0Y2hEaW0oKQotCi0gICAgIyBSZXZlcnNlU2VxdWVuY2VPcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBSZXZlcnNlU2VxdWVuY2VPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgUmV2ZXJzZVNlcXVlbmNlT3B0aW9uc0FkZFNlcURpbShidWlsZGVyLCBzZWxmLnNlcURpbSkKLSAgICAgICAgUmV2ZXJzZVNlcXVlbmNlT3B0aW9uc0FkZEJhdGNoRGltKGJ1aWxkZXIsIHNlbGYuYmF0Y2hEaW0pCi0gICAgICAgIHJldmVyc2VTZXF1ZW5jZU9wdGlvbnMgPSBSZXZlcnNlU2VxdWVuY2VPcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiByZXZlcnNlU2VxdWVuY2VPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgUmV2ZXJzZVYyT3B0aW9ucyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IFJldmVyc2VWMk9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc1JldmVyc2VWMk9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBSZXZlcnNlVjJPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBSZXZlcnNlVjJPcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotZGVmIFJldmVyc2VWMk9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgwKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBSZXZlcnNlVjJPcHRpb25zU3RhcnQoYnVpbGRlcikKLWRlZiBSZXZlcnNlVjJPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gUmV2ZXJzZVYyT3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBSZXZlcnNlVjJPcHRpb25zVChvYmplY3QpOgotCi0gICAgIyBSZXZlcnNlVjJPcHRpb25zVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgcGFzcwotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICByZXZlcnNlVjJvcHRpb25zID0gUmV2ZXJzZVYyT3B0aW9ucygpCi0gICAgICAgIHJldmVyc2VWMm9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihyZXZlcnNlVjJvcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgcmV2ZXJzZVYyb3B0aW9ucyk6Ci0gICAgICAgIHggPSBSZXZlcnNlVjJPcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhyZXZlcnNlVjJvcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBSZXZlcnNlVjJPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIHJldmVyc2VWMm9wdGlvbnMpOgotICAgICAgICBpZiByZXZlcnNlVjJvcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLQotICAgICMgUmV2ZXJzZVYyT3B0aW9uc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgUmV2ZXJzZVYyT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIHJldmVyc2VWMm9wdGlvbnMgPSBSZXZlcnNlVjJPcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiByZXZlcnNlVjJvcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgUmZmdDJkT3B0aW9ucyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IFJmZnQyZE9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc1JmZnQyZE9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBSZmZ0MmRPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBSZmZ0MmRPcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotZGVmIFJmZnQyZE9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgwKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBSZmZ0MmRPcHRpb25zU3RhcnQoYnVpbGRlcikKLWRlZiBSZmZ0MmRPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gUmZmdDJkT3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBSZmZ0MmRPcHRpb25zVChvYmplY3QpOgotCi0gICAgIyBSZmZ0MmRPcHRpb25zVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgcGFzcwotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICByZmZ0MmRPcHRpb25zID0gUmZmdDJkT3B0aW9ucygpCi0gICAgICAgIHJmZnQyZE9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihyZmZ0MmRPcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgcmZmdDJkT3B0aW9ucyk6Ci0gICAgICAgIHggPSBSZmZ0MmRPcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhyZmZ0MmRPcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBSZmZ0MmRPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIHJmZnQyZE9wdGlvbnMpOgotICAgICAgICBpZiByZmZ0MmRPcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLQotICAgICMgUmZmdDJkT3B0aW9uc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgUmZmdDJkT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIHJmZnQyZE9wdGlvbnMgPSBSZmZ0MmRPcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiByZmZ0MmRPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgUmlnaHRTaGlmdE9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBSaWdodFNoaWZ0T3B0aW9ucygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzUmlnaHRTaGlmdE9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBSaWdodFNoaWZ0T3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgUmlnaHRTaGlmdE9wdGlvbnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi1kZWYgUmlnaHRTaGlmdE9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgwKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBSaWdodFNoaWZ0T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgUmlnaHRTaGlmdE9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBSaWdodFNoaWZ0T3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBSaWdodFNoaWZ0T3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgUmlnaHRTaGlmdE9wdGlvbnNUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBwYXNzCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIHJpZ2h0U2hpZnRPcHRpb25zID0gUmlnaHRTaGlmdE9wdGlvbnMoKQotICAgICAgICByaWdodFNoaWZ0T3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHJpZ2h0U2hpZnRPcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgcmlnaHRTaGlmdE9wdGlvbnMpOgotICAgICAgICB4ID0gUmlnaHRTaGlmdE9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKHJpZ2h0U2hpZnRPcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBSaWdodFNoaWZ0T3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCByaWdodFNoaWZ0T3B0aW9ucyk6Ci0gICAgICAgIGlmIHJpZ2h0U2hpZnRPcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLQotICAgICMgUmlnaHRTaGlmdE9wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIFJpZ2h0U2hpZnRPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgcmlnaHRTaGlmdE9wdGlvbnMgPSBSaWdodFNoaWZ0T3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gcmlnaHRTaGlmdE9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBTVkRGT3B0aW9ucyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IFNWREZPcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNTVkRGT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIFNWREZPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBTVkRGT3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLSAgICAjIFNWREZPcHRpb25zCi0gICAgZGVmIFJhbmsoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgU1ZERk9wdGlvbnMKLSAgICBkZWYgRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBTVkRGT3B0aW9ucwotICAgIGRlZiBBc3ltbWV0cmljUXVhbnRpemVJbnB1dHMoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkJvb2xGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpKQotICAgICAgICByZXR1cm4gRmFsc2UKLQotZGVmIFNWREZPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMykKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gU1ZERk9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIFNWREZPcHRpb25zQWRkUmFuayhidWlsZGVyLCByYW5rKTogYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDAsIHJhbmssIDApCi1kZWYgQWRkUmFuayhidWlsZGVyLCByYW5rKToKLSAgICByZXR1cm4gU1ZERk9wdGlvbnNBZGRSYW5rKGJ1aWxkZXIsIHJhbmspCi1kZWYgU1ZERk9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbik6IGJ1aWxkZXIuUHJlcGVuZEludDhTbG90KDEsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uLCAwKQotZGVmIEFkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKToKLSAgICByZXR1cm4gU1ZERk9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbikKLWRlZiBTVkRGT3B0aW9uc0FkZEFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyhidWlsZGVyLCBhc3ltbWV0cmljUXVhbnRpemVJbnB1dHMpOiBidWlsZGVyLlByZXBlbmRCb29sU2xvdCgyLCBhc3ltbWV0cmljUXVhbnRpemVJbnB1dHMsIDApCi1kZWYgQWRkQXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKGJ1aWxkZXIsIGFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyk6Ci0gICAgcmV0dXJuIFNWREZPcHRpb25zQWRkQXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKGJ1aWxkZXIsIGFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cykKLWRlZiBTVkRGT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFNWREZPcHRpb25zRW5kKGJ1aWxkZXIpCi0KLWNsYXNzIFNWREZPcHRpb25zVChvYmplY3QpOgotCi0gICAgIyBTVkRGT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYucmFuayA9IDAgICMgdHlwZTogaW50Ci0gICAgICAgIHNlbGYuZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24gPSAwICAjIHR5cGU6IGludAotICAgICAgICBzZWxmLmFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyA9IEZhbHNlICAjIHR5cGU6IGJvb2wKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgc3ZkZm9wdGlvbnMgPSBTVkRGT3B0aW9ucygpCi0gICAgICAgIHN2ZGZvcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooc3ZkZm9wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzdmRmb3B0aW9ucyk6Ci0gICAgICAgIHggPSBTVkRGT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2soc3ZkZm9wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIFNWREZPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIHN2ZGZvcHRpb25zKToKLSAgICAgICAgaWYgc3ZkZm9wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLnJhbmsgPSBzdmRmb3B0aW9ucy5SYW5rKCkKLSAgICAgICAgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbiA9IHN2ZGZvcHRpb25zLkZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKCkKLSAgICAgICAgc2VsZi5hc3ltbWV0cmljUXVhbnRpemVJbnB1dHMgPSBzdmRmb3B0aW9ucy5Bc3ltbWV0cmljUXVhbnRpemVJbnB1dHMoKQotCi0gICAgIyBTVkRGT3B0aW9uc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgU1ZERk9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBTVkRGT3B0aW9uc0FkZFJhbmsoYnVpbGRlciwgc2VsZi5yYW5rKQotICAgICAgICBTVkRGT3B0aW9uc0FkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIHNlbGYuZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pCi0gICAgICAgIFNWREZPcHRpb25zQWRkQXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKGJ1aWxkZXIsIHNlbGYuYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKQotICAgICAgICBzdmRmb3B0aW9ucyA9IFNWREZPcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBzdmRmb3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIFNjYXR0ZXJOZE9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBTY2F0dGVyTmRPcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNTY2F0dGVyTmRPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgU2NhdHRlck5kT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgU2NhdHRlck5kT3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLWRlZiBTY2F0dGVyTmRPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gU2NhdHRlck5kT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgU2NhdHRlck5kT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFNjYXR0ZXJOZE9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgU2NhdHRlck5kT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgU2NhdHRlck5kT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2NhdHRlck5kT3B0aW9ucyA9IFNjYXR0ZXJOZE9wdGlvbnMoKQotICAgICAgICBzY2F0dGVyTmRPcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooc2NhdHRlck5kT3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHNjYXR0ZXJOZE9wdGlvbnMpOgotICAgICAgICB4ID0gU2NhdHRlck5kT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2soc2NhdHRlck5kT3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgU2NhdHRlck5kT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBzY2F0dGVyTmRPcHRpb25zKToKLSAgICAgICAgaWYgc2NhdHRlck5kT3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAjIFNjYXR0ZXJOZE9wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIFNjYXR0ZXJOZE9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBzY2F0dGVyTmRPcHRpb25zID0gU2NhdHRlck5kT3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gc2NhdHRlck5kT3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIFNlZ21lbnRTdW1PcHRpb25zKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gU2VnbWVudFN1bU9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc1NlZ21lbnRTdW1PcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgU2VnbWVudFN1bU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIFNlZ21lbnRTdW1PcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotZGVmIFNlZ21lbnRTdW1PcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gU2VnbWVudFN1bU9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIFNlZ21lbnRTdW1PcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gU2VnbWVudFN1bU9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgU2VnbWVudFN1bU9wdGlvbnNUKG9iamVjdCk6Ci0KLSAgICAjIFNlZ21lbnRTdW1PcHRpb25zVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgcGFzcwotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBzZWdtZW50U3VtT3B0aW9ucyA9IFNlZ21lbnRTdW1PcHRpb25zKCkKLSAgICAgICAgc2VnbWVudFN1bU9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihzZWdtZW50U3VtT3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHNlZ21lbnRTdW1PcHRpb25zKToKLSAgICAgICAgeCA9IFNlZ21lbnRTdW1PcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhzZWdtZW50U3VtT3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgU2VnbWVudFN1bU9wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgc2VnbWVudFN1bU9wdGlvbnMpOgotICAgICAgICBpZiBzZWdtZW50U3VtT3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAjIFNlZ21lbnRTdW1PcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBTZWdtZW50U3VtT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIHNlZ21lbnRTdW1PcHRpb25zID0gU2VnbWVudFN1bU9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIHNlZ21lbnRTdW1PcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgU2VsZWN0T3B0aW9ucyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IFNlbGVjdE9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc1NlbGVjdE9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBTZWxlY3RPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBTZWxlY3RPcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotZGVmIFNlbGVjdE9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgwKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBTZWxlY3RPcHRpb25zU3RhcnQoYnVpbGRlcikKLWRlZiBTZWxlY3RPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gU2VsZWN0T3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBTZWxlY3RPcHRpb25zVChvYmplY3QpOgotCi0gICAgIyBTZWxlY3RPcHRpb25zVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgcGFzcwotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBzZWxlY3RPcHRpb25zID0gU2VsZWN0T3B0aW9ucygpCi0gICAgICAgIHNlbGVjdE9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihzZWxlY3RPcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgc2VsZWN0T3B0aW9ucyk6Ci0gICAgICAgIHggPSBTZWxlY3RPcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhzZWxlY3RPcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBTZWxlY3RPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIHNlbGVjdE9wdGlvbnMpOgotICAgICAgICBpZiBzZWxlY3RPcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLQotICAgICMgU2VsZWN0T3B0aW9uc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgU2VsZWN0T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIHNlbGVjdE9wdGlvbnMgPSBTZWxlY3RPcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBzZWxlY3RPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgU2VsZWN0VjJPcHRpb25zKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gU2VsZWN0VjJPcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNTZWxlY3RWMk9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBTZWxlY3RWMk9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIFNlbGVjdFYyT3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLWRlZiBTZWxlY3RWMk9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgwKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBTZWxlY3RWMk9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIFNlbGVjdFYyT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFNlbGVjdFYyT3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBTZWxlY3RWMk9wdGlvbnNUKG9iamVjdCk6Ci0KLSAgICAjIFNlbGVjdFYyT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZWN0VjJvcHRpb25zID0gU2VsZWN0VjJPcHRpb25zKCkKLSAgICAgICAgc2VsZWN0VjJvcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooc2VsZWN0VjJvcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgc2VsZWN0VjJvcHRpb25zKToKLSAgICAgICAgeCA9IFNlbGVjdFYyT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2soc2VsZWN0VjJvcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBTZWxlY3RWMk9wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgc2VsZWN0VjJvcHRpb25zKToKLSAgICAgICAgaWYgc2VsZWN0VjJvcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLQotICAgICMgU2VsZWN0VjJPcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBTZWxlY3RWMk9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBzZWxlY3RWMm9wdGlvbnMgPSBTZWxlY3RWMk9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIHNlbGVjdFYyb3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIFNlcXVlbmNlUk5OT3B0aW9ucyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IFNlcXVlbmNlUk5OT3B0aW9ucygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzU2VxdWVuY2VSTk5PcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgU2VxdWVuY2VSTk5PcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBTZXF1ZW5jZVJOTk9wdGlvbnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi0gICAgIyBTZXF1ZW5jZVJOTk9wdGlvbnMKLSAgICBkZWYgVGltZU1ham9yKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gYm9vbChzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5Cb29sRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKSkKLSAgICAgICAgcmV0dXJuIEZhbHNlCi0KLSAgICAjIFNlcXVlbmNlUk5OT3B0aW9ucwotICAgIGRlZiBGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDhGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIFNlcXVlbmNlUk5OT3B0aW9ucwotICAgIGRlZiBBc3ltbWV0cmljUXVhbnRpemVJbnB1dHMoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkJvb2xGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpKQotICAgICAgICByZXR1cm4gRmFsc2UKLQotZGVmIFNlcXVlbmNlUk5OT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDMpCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFNlcXVlbmNlUk5OT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgU2VxdWVuY2VSTk5PcHRpb25zQWRkVGltZU1ham9yKGJ1aWxkZXIsIHRpbWVNYWpvcik6IGJ1aWxkZXIuUHJlcGVuZEJvb2xTbG90KDAsIHRpbWVNYWpvciwgMCkKLWRlZiBBZGRUaW1lTWFqb3IoYnVpbGRlciwgdGltZU1ham9yKToKLSAgICByZXR1cm4gU2VxdWVuY2VSTk5PcHRpb25zQWRkVGltZU1ham9yKGJ1aWxkZXIsIHRpbWVNYWpvcikKLWRlZiBTZXF1ZW5jZVJOTk9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbik6IGJ1aWxkZXIuUHJlcGVuZEludDhTbG90KDEsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uLCAwKQotZGVmIEFkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKToKLSAgICByZXR1cm4gU2VxdWVuY2VSTk5PcHRpb25zQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pCi1kZWYgU2VxdWVuY2VSTk5PcHRpb25zQWRkQXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKGJ1aWxkZXIsIGFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyk6IGJ1aWxkZXIuUHJlcGVuZEJvb2xTbG90KDIsIGFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cywgMCkKLWRlZiBBZGRBc3ltbWV0cmljUXVhbnRpemVJbnB1dHMoYnVpbGRlciwgYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKToKLSAgICByZXR1cm4gU2VxdWVuY2VSTk5PcHRpb25zQWRkQXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKGJ1aWxkZXIsIGFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cykKLWRlZiBTZXF1ZW5jZVJOTk9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBTZXF1ZW5jZVJOTk9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgU2VxdWVuY2VSTk5PcHRpb25zVChvYmplY3QpOgotCi0gICAgIyBTZXF1ZW5jZVJOTk9wdGlvbnNUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBzZWxmLnRpbWVNYWpvciA9IEZhbHNlICAjIHR5cGU6IGJvb2wKLSAgICAgICAgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbiA9IDAgICMgdHlwZTogaW50Ci0gICAgICAgIHNlbGYuYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzID0gRmFsc2UgICMgdHlwZTogYm9vbAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBzZXF1ZW5jZVJubm9wdGlvbnMgPSBTZXF1ZW5jZVJOTk9wdGlvbnMoKQotICAgICAgICBzZXF1ZW5jZVJubm9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihzZXF1ZW5jZVJubm9wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzZXF1ZW5jZVJubm9wdGlvbnMpOgotICAgICAgICB4ID0gU2VxdWVuY2VSTk5PcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhzZXF1ZW5jZVJubm9wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIFNlcXVlbmNlUk5OT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBzZXF1ZW5jZVJubm9wdGlvbnMpOgotICAgICAgICBpZiBzZXF1ZW5jZVJubm9wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLnRpbWVNYWpvciA9IHNlcXVlbmNlUm5ub3B0aW9ucy5UaW1lTWFqb3IoKQotICAgICAgICBzZWxmLmZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uID0gc2VxdWVuY2VSbm5vcHRpb25zLkZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKCkKLSAgICAgICAgc2VsZi5hc3ltbWV0cmljUXVhbnRpemVJbnB1dHMgPSBzZXF1ZW5jZVJubm9wdGlvbnMuQXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKCkKLQotICAgICMgU2VxdWVuY2VSTk5PcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBTZXF1ZW5jZVJOTk9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBTZXF1ZW5jZVJOTk9wdGlvbnNBZGRUaW1lTWFqb3IoYnVpbGRlciwgc2VsZi50aW1lTWFqb3IpCi0gICAgICAgIFNlcXVlbmNlUk5OT3B0aW9uc0FkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIHNlbGYuZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pCi0gICAgICAgIFNlcXVlbmNlUk5OT3B0aW9uc0FkZEFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyhidWlsZGVyLCBzZWxmLmFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cykKLSAgICAgICAgc2VxdWVuY2VSbm5vcHRpb25zID0gU2VxdWVuY2VSTk5PcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBzZXF1ZW5jZVJubm9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBTaGFwZU9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBTaGFwZU9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc1NoYXBlT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIFNoYXBlT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgU2hhcGVPcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotICAgICMgU2hhcGVPcHRpb25zCi0gICAgZGVmIE91dFR5cGUoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gMAotCi1kZWYgU2hhcGVPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMSkKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gU2hhcGVPcHRpb25zU3RhcnQoYnVpbGRlcikKLWRlZiBTaGFwZU9wdGlvbnNBZGRPdXRUeXBlKGJ1aWxkZXIsIG91dFR5cGUpOiBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCgwLCBvdXRUeXBlLCAwKQotZGVmIEFkZE91dFR5cGUoYnVpbGRlciwgb3V0VHlwZSk6Ci0gICAgcmV0dXJuIFNoYXBlT3B0aW9uc0FkZE91dFR5cGUoYnVpbGRlciwgb3V0VHlwZSkKLWRlZiBTaGFwZU9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBTaGFwZU9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgU2hhcGVPcHRpb25zVChvYmplY3QpOgotCi0gICAgIyBTaGFwZU9wdGlvbnNUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBzZWxmLm91dFR5cGUgPSAwICAjIHR5cGU6IGludAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBzaGFwZU9wdGlvbnMgPSBTaGFwZU9wdGlvbnMoKQotICAgICAgICBzaGFwZU9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihzaGFwZU9wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzaGFwZU9wdGlvbnMpOgotICAgICAgICB4ID0gU2hhcGVPcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhzaGFwZU9wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIFNoYXBlT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBzaGFwZU9wdGlvbnMpOgotICAgICAgICBpZiBzaGFwZU9wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLm91dFR5cGUgPSBzaGFwZU9wdGlvbnMuT3V0VHlwZSgpCi0KLSAgICAjIFNoYXBlT3B0aW9uc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgU2hhcGVPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgU2hhcGVPcHRpb25zQWRkT3V0VHlwZShidWlsZGVyLCBzZWxmLm91dFR5cGUpCi0gICAgICAgIHNoYXBlT3B0aW9ucyA9IFNoYXBlT3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gc2hhcGVPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgU2lnbk9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBTaWduT3B0aW9ucygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzU2lnbk9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBTaWduT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgU2lnbk9wdGlvbnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi1kZWYgU2lnbk9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgwKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBTaWduT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgU2lnbk9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBTaWduT3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBTaWduT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgU2lnbk9wdGlvbnNUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBwYXNzCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIHNpZ25PcHRpb25zID0gU2lnbk9wdGlvbnMoKQotICAgICAgICBzaWduT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHNpZ25PcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgc2lnbk9wdGlvbnMpOgotICAgICAgICB4ID0gU2lnbk9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKHNpZ25PcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBTaWduT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBzaWduT3B0aW9ucyk6Ci0gICAgICAgIGlmIHNpZ25PcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLQotICAgICMgU2lnbk9wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIFNpZ25PcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgc2lnbk9wdGlvbnMgPSBTaWduT3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gc2lnbk9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBTaWduYXR1cmVEZWYob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBTaWduYXR1cmVEZWYoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc1NpZ25hdHVyZURlZihjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIFNpZ25hdHVyZURlZkJ1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgU2lnbmF0dXJlRGVmCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotICAgICMgU2lnbmF0dXJlRGVmCi0gICAgZGVmIElucHV0cyhzZWxmLCBqKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgeCA9IHNlbGYuX3RhYi5WZWN0b3IobykKLSAgICAgICAgICAgIHggKz0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShqKSAqIDQKLSAgICAgICAgICAgIHggPSBzZWxmLl90YWIuSW5kaXJlY3QoeCkKLSAgICAgICAgICAgIG9iaiA9IFRlbnNvck1hcCgpCi0gICAgICAgICAgICBvYmouSW5pdChzZWxmLl90YWIuQnl0ZXMsIHgpCi0gICAgICAgICAgICByZXR1cm4gb2JqCi0gICAgICAgIHJldHVybiBOb25lCi0KLSAgICAjIFNpZ25hdHVyZURlZgotICAgIGRlZiBJbnB1dHNMZW5ndGgoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuVmVjdG9yTGVuKG8pCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIFNpZ25hdHVyZURlZgotICAgIGRlZiBJbnB1dHNJc05vbmUoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCi0gICAgICAgIHJldHVybiBvID09IDAKLQotICAgICMgU2lnbmF0dXJlRGVmCi0gICAgZGVmIE91dHB1dHMoc2VsZiwgaik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHggPSBzZWxmLl90YWIuVmVjdG9yKG8pCi0gICAgICAgICAgICB4ICs9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaikgKiA0Ci0gICAgICAgICAgICB4ID0gc2VsZi5fdGFiLkluZGlyZWN0KHgpCi0gICAgICAgICAgICBvYmogPSBUZW5zb3JNYXAoKQotICAgICAgICAgICAgb2JqLkluaXQoc2VsZi5fdGFiLkJ5dGVzLCB4KQotICAgICAgICAgICAgcmV0dXJuIG9iagotICAgICAgICByZXR1cm4gTm9uZQotCi0gICAgIyBTaWduYXR1cmVEZWYKLSAgICBkZWYgT3V0cHV0c0xlbmd0aChzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgU2lnbmF0dXJlRGVmCi0gICAgZGVmIE91dHB1dHNJc05vbmUoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCi0gICAgICAgIHJldHVybiBvID09IDAKLQotICAgICMgU2lnbmF0dXJlRGVmCi0gICAgZGVmIFNpZ25hdHVyZUtleShzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg4KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5TdHJpbmcobyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiBOb25lCi0KLSAgICAjIFNpZ25hdHVyZURlZgotICAgIGRlZiBTdWJncmFwaEluZGV4KHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEyKSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVpbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAKLQotZGVmIFNpZ25hdHVyZURlZlN0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDUpCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFNpZ25hdHVyZURlZlN0YXJ0KGJ1aWxkZXIpCi1kZWYgU2lnbmF0dXJlRGVmQWRkSW5wdXRzKGJ1aWxkZXIsIGlucHV0cyk6IGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDAsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaW5wdXRzKSwgMCkKLWRlZiBBZGRJbnB1dHMoYnVpbGRlciwgaW5wdXRzKToKLSAgICByZXR1cm4gU2lnbmF0dXJlRGVmQWRkSW5wdXRzKGJ1aWxkZXIsIGlucHV0cykKLWRlZiBTaWduYXR1cmVEZWZTdGFydElucHV0c1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6IHJldHVybiBidWlsZGVyLlN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KQotZGVmIFN0YXJ0SW5wdXRzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKLSAgICByZXR1cm4gU2lnbmF0dXJlRGVmU3RhcnRJbnB1dHNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpCi1kZWYgU2lnbmF0dXJlRGVmQWRkT3V0cHV0cyhidWlsZGVyLCBvdXRwdXRzKTogYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMSwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShvdXRwdXRzKSwgMCkKLWRlZiBBZGRPdXRwdXRzKGJ1aWxkZXIsIG91dHB1dHMpOgotICAgIHJldHVybiBTaWduYXR1cmVEZWZBZGRPdXRwdXRzKGJ1aWxkZXIsIG91dHB1dHMpCi1kZWYgU2lnbmF0dXJlRGVmU3RhcnRPdXRwdXRzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKTogcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpCi1kZWYgU3RhcnRPdXRwdXRzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKLSAgICByZXR1cm4gU2lnbmF0dXJlRGVmU3RhcnRPdXRwdXRzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKQotZGVmIFNpZ25hdHVyZURlZkFkZFNpZ25hdHVyZUtleShidWlsZGVyLCBzaWduYXR1cmVLZXkpOiBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgyLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNpZ25hdHVyZUtleSksIDApCi1kZWYgQWRkU2lnbmF0dXJlS2V5KGJ1aWxkZXIsIHNpZ25hdHVyZUtleSk6Ci0gICAgcmV0dXJuIFNpZ25hdHVyZURlZkFkZFNpZ25hdHVyZUtleShidWlsZGVyLCBzaWduYXR1cmVLZXkpCi1kZWYgU2lnbmF0dXJlRGVmQWRkU3ViZ3JhcGhJbmRleChidWlsZGVyLCBzdWJncmFwaEluZGV4KTogYnVpbGRlci5QcmVwZW5kVWludDMyU2xvdCg0LCBzdWJncmFwaEluZGV4LCAwKQotZGVmIEFkZFN1YmdyYXBoSW5kZXgoYnVpbGRlciwgc3ViZ3JhcGhJbmRleCk6Ci0gICAgcmV0dXJuIFNpZ25hdHVyZURlZkFkZFN1YmdyYXBoSW5kZXgoYnVpbGRlciwgc3ViZ3JhcGhJbmRleCkKLWRlZiBTaWduYXR1cmVEZWZFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBTaWduYXR1cmVEZWZFbmQoYnVpbGRlcikKLXRyeToKLSAgICBmcm9tIHR5cGluZyBpbXBvcnQgTGlzdAotZXhjZXB0OgotICAgIHBhc3MKLQotY2xhc3MgU2lnbmF0dXJlRGVmVChvYmplY3QpOgotCi0gICAgIyBTaWduYXR1cmVEZWZUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBzZWxmLmlucHV0cyA9IE5vbmUgICMgdHlwZTogTGlzdFtUZW5zb3JNYXBUXQotICAgICAgICBzZWxmLm91dHB1dHMgPSBOb25lICAjIHR5cGU6IExpc3RbVGVuc29yTWFwVF0KLSAgICAgICAgc2VsZi5zaWduYXR1cmVLZXkgPSBOb25lICAjIHR5cGU6IHN0cgotICAgICAgICBzZWxmLnN1YmdyYXBoSW5kZXggPSAwICAjIHR5cGU6IGludAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBzaWduYXR1cmVEZWYgPSBTaWduYXR1cmVEZWYoKQotICAgICAgICBzaWduYXR1cmVEZWYuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihzaWduYXR1cmVEZWYpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzaWduYXR1cmVEZWYpOgotICAgICAgICB4ID0gU2lnbmF0dXJlRGVmVCgpCi0gICAgICAgIHguX1VuUGFjayhzaWduYXR1cmVEZWYpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIFNpZ25hdHVyZURlZlQKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBzaWduYXR1cmVEZWYpOgotICAgICAgICBpZiBzaWduYXR1cmVEZWYgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBpZiBub3Qgc2lnbmF0dXJlRGVmLklucHV0c0lzTm9uZSgpOgotICAgICAgICAgICAgc2VsZi5pbnB1dHMgPSBbXQotICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc2lnbmF0dXJlRGVmLklucHV0c0xlbmd0aCgpKToKLSAgICAgICAgICAgICAgICBpZiBzaWduYXR1cmVEZWYuSW5wdXRzKGkpIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuaW5wdXRzLmFwcGVuZChOb25lKQotICAgICAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgICAgIHRlbnNvck1hcF8gPSBUZW5zb3JNYXBULkluaXRGcm9tT2JqKHNpZ25hdHVyZURlZi5JbnB1dHMoaSkpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYuaW5wdXRzLmFwcGVuZCh0ZW5zb3JNYXBfKQotICAgICAgICBpZiBub3Qgc2lnbmF0dXJlRGVmLk91dHB1dHNJc05vbmUoKToKLSAgICAgICAgICAgIHNlbGYub3V0cHV0cyA9IFtdCi0gICAgICAgICAgICBmb3IgaSBpbiByYW5nZShzaWduYXR1cmVEZWYuT3V0cHV0c0xlbmd0aCgpKToKLSAgICAgICAgICAgICAgICBpZiBzaWduYXR1cmVEZWYuT3V0cHV0cyhpKSBpcyBOb25lOgotICAgICAgICAgICAgICAgICAgICBzZWxmLm91dHB1dHMuYXBwZW5kKE5vbmUpCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgdGVuc29yTWFwXyA9IFRlbnNvck1hcFQuSW5pdEZyb21PYmooc2lnbmF0dXJlRGVmLk91dHB1dHMoaSkpCi0gICAgICAgICAgICAgICAgICAgIHNlbGYub3V0cHV0cy5hcHBlbmQodGVuc29yTWFwXykKLSAgICAgICAgc2VsZi5zaWduYXR1cmVLZXkgPSBzaWduYXR1cmVEZWYuU2lnbmF0dXJlS2V5KCkKLSAgICAgICAgc2VsZi5zdWJncmFwaEluZGV4ID0gc2lnbmF0dXJlRGVmLlN1YmdyYXBoSW5kZXgoKQotCi0gICAgIyBTaWduYXR1cmVEZWZUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIGlmIHNlbGYuaW5wdXRzIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgaW5wdXRzbGlzdCA9IFtdCi0gICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5pbnB1dHMpKToKLSAgICAgICAgICAgICAgICBpbnB1dHNsaXN0LmFwcGVuZChzZWxmLmlucHV0c1tpXS5QYWNrKGJ1aWxkZXIpKQotICAgICAgICAgICAgU2lnbmF0dXJlRGVmU3RhcnRJbnB1dHNWZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYuaW5wdXRzKSkKLSAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLmlucHV0cykpKToKLSAgICAgICAgICAgICAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlKGlucHV0c2xpc3RbaV0pCi0gICAgICAgICAgICBpbnB1dHMgPSBidWlsZGVyLkVuZFZlY3RvcigpCi0gICAgICAgIGlmIHNlbGYub3V0cHV0cyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIG91dHB1dHNsaXN0ID0gW10KLSAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLm91dHB1dHMpKToKLSAgICAgICAgICAgICAgICBvdXRwdXRzbGlzdC5hcHBlbmQoc2VsZi5vdXRwdXRzW2ldLlBhY2soYnVpbGRlcikpCi0gICAgICAgICAgICBTaWduYXR1cmVEZWZTdGFydE91dHB1dHNWZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYub3V0cHV0cykpCi0gICAgICAgICAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShsZW4oc2VsZi5vdXRwdXRzKSkpOgotICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmUob3V0cHV0c2xpc3RbaV0pCi0gICAgICAgICAgICBvdXRwdXRzID0gYnVpbGRlci5FbmRWZWN0b3IoKQotICAgICAgICBpZiBzZWxmLnNpZ25hdHVyZUtleSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHNpZ25hdHVyZUtleSA9IGJ1aWxkZXIuQ3JlYXRlU3RyaW5nKHNlbGYuc2lnbmF0dXJlS2V5KQotICAgICAgICBTaWduYXR1cmVEZWZTdGFydChidWlsZGVyKQotICAgICAgICBpZiBzZWxmLmlucHV0cyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIFNpZ25hdHVyZURlZkFkZElucHV0cyhidWlsZGVyLCBpbnB1dHMpCi0gICAgICAgIGlmIHNlbGYub3V0cHV0cyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIFNpZ25hdHVyZURlZkFkZE91dHB1dHMoYnVpbGRlciwgb3V0cHV0cykKLSAgICAgICAgaWYgc2VsZi5zaWduYXR1cmVLZXkgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBTaWduYXR1cmVEZWZBZGRTaWduYXR1cmVLZXkoYnVpbGRlciwgc2lnbmF0dXJlS2V5KQotICAgICAgICBTaWduYXR1cmVEZWZBZGRTdWJncmFwaEluZGV4KGJ1aWxkZXIsIHNlbGYuc3ViZ3JhcGhJbmRleCkKLSAgICAgICAgc2lnbmF0dXJlRGVmID0gU2lnbmF0dXJlRGVmRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBzaWduYXR1cmVEZWYKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBTa2lwR3JhbU9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBTa2lwR3JhbU9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc1NraXBHcmFtT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIFNraXBHcmFtT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgU2tpcEdyYW1PcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotICAgICMgU2tpcEdyYW1PcHRpb25zCi0gICAgZGVmIE5ncmFtU2l6ZShzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBTa2lwR3JhbU9wdGlvbnMKLSAgICBkZWYgTWF4U2tpcFNpemUoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgU2tpcEdyYW1PcHRpb25zCi0gICAgZGVmIEluY2x1ZGVBbGxOZ3JhbXMoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkJvb2xGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpKQotICAgICAgICByZXR1cm4gRmFsc2UKLQotZGVmIFNraXBHcmFtT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDMpCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFNraXBHcmFtT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgU2tpcEdyYW1PcHRpb25zQWRkTmdyYW1TaXplKGJ1aWxkZXIsIG5ncmFtU2l6ZSk6IGJ1aWxkZXIuUHJlcGVuZEludDMyU2xvdCgwLCBuZ3JhbVNpemUsIDApCi1kZWYgQWRkTmdyYW1TaXplKGJ1aWxkZXIsIG5ncmFtU2l6ZSk6Ci0gICAgcmV0dXJuIFNraXBHcmFtT3B0aW9uc0FkZE5ncmFtU2l6ZShidWlsZGVyLCBuZ3JhbVNpemUpCi1kZWYgU2tpcEdyYW1PcHRpb25zQWRkTWF4U2tpcFNpemUoYnVpbGRlciwgbWF4U2tpcFNpemUpOiBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMSwgbWF4U2tpcFNpemUsIDApCi1kZWYgQWRkTWF4U2tpcFNpemUoYnVpbGRlciwgbWF4U2tpcFNpemUpOgotICAgIHJldHVybiBTa2lwR3JhbU9wdGlvbnNBZGRNYXhTa2lwU2l6ZShidWlsZGVyLCBtYXhTa2lwU2l6ZSkKLWRlZiBTa2lwR3JhbU9wdGlvbnNBZGRJbmNsdWRlQWxsTmdyYW1zKGJ1aWxkZXIsIGluY2x1ZGVBbGxOZ3JhbXMpOiBidWlsZGVyLlByZXBlbmRCb29sU2xvdCgyLCBpbmNsdWRlQWxsTmdyYW1zLCAwKQotZGVmIEFkZEluY2x1ZGVBbGxOZ3JhbXMoYnVpbGRlciwgaW5jbHVkZUFsbE5ncmFtcyk6Ci0gICAgcmV0dXJuIFNraXBHcmFtT3B0aW9uc0FkZEluY2x1ZGVBbGxOZ3JhbXMoYnVpbGRlciwgaW5jbHVkZUFsbE5ncmFtcykKLWRlZiBTa2lwR3JhbU9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBTa2lwR3JhbU9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgU2tpcEdyYW1PcHRpb25zVChvYmplY3QpOgotCi0gICAgIyBTa2lwR3JhbU9wdGlvbnNUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBzZWxmLm5ncmFtU2l6ZSA9IDAgICMgdHlwZTogaW50Ci0gICAgICAgIHNlbGYubWF4U2tpcFNpemUgPSAwICAjIHR5cGU6IGludAotICAgICAgICBzZWxmLmluY2x1ZGVBbGxOZ3JhbXMgPSBGYWxzZSAgIyB0eXBlOiBib29sCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIHNraXBHcmFtT3B0aW9ucyA9IFNraXBHcmFtT3B0aW9ucygpCi0gICAgICAgIHNraXBHcmFtT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHNraXBHcmFtT3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHNraXBHcmFtT3B0aW9ucyk6Ci0gICAgICAgIHggPSBTa2lwR3JhbU9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKHNraXBHcmFtT3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgU2tpcEdyYW1PcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIHNraXBHcmFtT3B0aW9ucyk6Ci0gICAgICAgIGlmIHNraXBHcmFtT3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYubmdyYW1TaXplID0gc2tpcEdyYW1PcHRpb25zLk5ncmFtU2l6ZSgpCi0gICAgICAgIHNlbGYubWF4U2tpcFNpemUgPSBza2lwR3JhbU9wdGlvbnMuTWF4U2tpcFNpemUoKQotICAgICAgICBzZWxmLmluY2x1ZGVBbGxOZ3JhbXMgPSBza2lwR3JhbU9wdGlvbnMuSW5jbHVkZUFsbE5ncmFtcygpCi0KLSAgICAjIFNraXBHcmFtT3B0aW9uc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgU2tpcEdyYW1PcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgU2tpcEdyYW1PcHRpb25zQWRkTmdyYW1TaXplKGJ1aWxkZXIsIHNlbGYubmdyYW1TaXplKQotICAgICAgICBTa2lwR3JhbU9wdGlvbnNBZGRNYXhTa2lwU2l6ZShidWlsZGVyLCBzZWxmLm1heFNraXBTaXplKQotICAgICAgICBTa2lwR3JhbU9wdGlvbnNBZGRJbmNsdWRlQWxsTmdyYW1zKGJ1aWxkZXIsIHNlbGYuaW5jbHVkZUFsbE5ncmFtcykKLSAgICAgICAgc2tpcEdyYW1PcHRpb25zID0gU2tpcEdyYW1PcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBza2lwR3JhbU9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBTbGljZU9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBTbGljZU9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc1NsaWNlT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIFNsaWNlT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgU2xpY2VPcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotZGVmIFNsaWNlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFNsaWNlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgU2xpY2VPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gU2xpY2VPcHRpb25zRW5kKGJ1aWxkZXIpCi0KLWNsYXNzIFNsaWNlT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgU2xpY2VPcHRpb25zVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgcGFzcwotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBzbGljZU9wdGlvbnMgPSBTbGljZU9wdGlvbnMoKQotICAgICAgICBzbGljZU9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihzbGljZU9wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzbGljZU9wdGlvbnMpOgotICAgICAgICB4ID0gU2xpY2VPcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhzbGljZU9wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIFNsaWNlT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBzbGljZU9wdGlvbnMpOgotICAgICAgICBpZiBzbGljZU9wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgIyBTbGljZU9wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIFNsaWNlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIHNsaWNlT3B0aW9ucyA9IFNsaWNlT3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gc2xpY2VPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgU29mdG1heE9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBTb2Z0bWF4T3B0aW9ucygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzU29mdG1heE9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBTb2Z0bWF4T3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgU29mdG1heE9wdGlvbnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi0gICAgIyBTb2Z0bWF4T3B0aW9ucwotICAgIGRlZiBCZXRhKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuRmxvYXQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAuMAotCi1kZWYgU29mdG1heE9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgxKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBTb2Z0bWF4T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgU29mdG1heE9wdGlvbnNBZGRCZXRhKGJ1aWxkZXIsIGJldGEpOiBidWlsZGVyLlByZXBlbmRGbG9hdDMyU2xvdCgwLCBiZXRhLCAwLjApCi1kZWYgQWRkQmV0YShidWlsZGVyLCBiZXRhKToKLSAgICByZXR1cm4gU29mdG1heE9wdGlvbnNBZGRCZXRhKGJ1aWxkZXIsIGJldGEpCi1kZWYgU29mdG1heE9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBTb2Z0bWF4T3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBTb2Z0bWF4T3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgU29mdG1heE9wdGlvbnNUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBzZWxmLmJldGEgPSAwLjAgICMgdHlwZTogZmxvYXQKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgc29mdG1heE9wdGlvbnMgPSBTb2Z0bWF4T3B0aW9ucygpCi0gICAgICAgIHNvZnRtYXhPcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooc29mdG1heE9wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzb2Z0bWF4T3B0aW9ucyk6Ci0gICAgICAgIHggPSBTb2Z0bWF4T3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2soc29mdG1heE9wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIFNvZnRtYXhPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIHNvZnRtYXhPcHRpb25zKToKLSAgICAgICAgaWYgc29mdG1heE9wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLmJldGEgPSBzb2Z0bWF4T3B0aW9ucy5CZXRhKCkKLQotICAgICMgU29mdG1heE9wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIFNvZnRtYXhPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgU29mdG1heE9wdGlvbnNBZGRCZXRhKGJ1aWxkZXIsIHNlbGYuYmV0YSkKLSAgICAgICAgc29mdG1heE9wdGlvbnMgPSBTb2Z0bWF4T3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gc29mdG1heE9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBTcGFjZVRvQmF0Y2hORE9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBTcGFjZVRvQmF0Y2hORE9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc1NwYWNlVG9CYXRjaE5ET3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIFNwYWNlVG9CYXRjaE5ET3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgU3BhY2VUb0JhdGNoTkRPcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotZGVmIFNwYWNlVG9CYXRjaE5ET3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFNwYWNlVG9CYXRjaE5ET3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgU3BhY2VUb0JhdGNoTkRPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gU3BhY2VUb0JhdGNoTkRPcHRpb25zRW5kKGJ1aWxkZXIpCi0KLWNsYXNzIFNwYWNlVG9CYXRjaE5ET3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgU3BhY2VUb0JhdGNoTkRPcHRpb25zVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgcGFzcwotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBzcGFjZVRvQmF0Y2hOZG9wdGlvbnMgPSBTcGFjZVRvQmF0Y2hORE9wdGlvbnMoKQotICAgICAgICBzcGFjZVRvQmF0Y2hOZG9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihzcGFjZVRvQmF0Y2hOZG9wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzcGFjZVRvQmF0Y2hOZG9wdGlvbnMpOgotICAgICAgICB4ID0gU3BhY2VUb0JhdGNoTkRPcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhzcGFjZVRvQmF0Y2hOZG9wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIFNwYWNlVG9CYXRjaE5ET3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBzcGFjZVRvQmF0Y2hOZG9wdGlvbnMpOgotICAgICAgICBpZiBzcGFjZVRvQmF0Y2hOZG9wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgIyBTcGFjZVRvQmF0Y2hORE9wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIFNwYWNlVG9CYXRjaE5ET3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIHNwYWNlVG9CYXRjaE5kb3B0aW9ucyA9IFNwYWNlVG9CYXRjaE5ET3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gc3BhY2VUb0JhdGNoTmRvcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgU3BhY2VUb0RlcHRoT3B0aW9ucyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IFNwYWNlVG9EZXB0aE9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc1NwYWNlVG9EZXB0aE9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBTcGFjZVRvRGVwdGhPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBTcGFjZVRvRGVwdGhPcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotICAgICMgU3BhY2VUb0RlcHRoT3B0aW9ucwotICAgIGRlZiBCbG9ja1NpemUoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAKLQotZGVmIFNwYWNlVG9EZXB0aE9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgxKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBTcGFjZVRvRGVwdGhPcHRpb25zU3RhcnQoYnVpbGRlcikKLWRlZiBTcGFjZVRvRGVwdGhPcHRpb25zQWRkQmxvY2tTaXplKGJ1aWxkZXIsIGJsb2NrU2l6ZSk6IGJ1aWxkZXIuUHJlcGVuZEludDMyU2xvdCgwLCBibG9ja1NpemUsIDApCi1kZWYgQWRkQmxvY2tTaXplKGJ1aWxkZXIsIGJsb2NrU2l6ZSk6Ci0gICAgcmV0dXJuIFNwYWNlVG9EZXB0aE9wdGlvbnNBZGRCbG9ja1NpemUoYnVpbGRlciwgYmxvY2tTaXplKQotZGVmIFNwYWNlVG9EZXB0aE9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBTcGFjZVRvRGVwdGhPcHRpb25zRW5kKGJ1aWxkZXIpCi0KLWNsYXNzIFNwYWNlVG9EZXB0aE9wdGlvbnNUKG9iamVjdCk6Ci0KLSAgICAjIFNwYWNlVG9EZXB0aE9wdGlvbnNUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBzZWxmLmJsb2NrU2l6ZSA9IDAgICMgdHlwZTogaW50Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIHNwYWNlVG9EZXB0aE9wdGlvbnMgPSBTcGFjZVRvRGVwdGhPcHRpb25zKCkKLSAgICAgICAgc3BhY2VUb0RlcHRoT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHNwYWNlVG9EZXB0aE9wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzcGFjZVRvRGVwdGhPcHRpb25zKToKLSAgICAgICAgeCA9IFNwYWNlVG9EZXB0aE9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKHNwYWNlVG9EZXB0aE9wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIFNwYWNlVG9EZXB0aE9wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgc3BhY2VUb0RlcHRoT3B0aW9ucyk6Ci0gICAgICAgIGlmIHNwYWNlVG9EZXB0aE9wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLmJsb2NrU2l6ZSA9IHNwYWNlVG9EZXB0aE9wdGlvbnMuQmxvY2tTaXplKCkKLQotICAgICMgU3BhY2VUb0RlcHRoT3B0aW9uc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgU3BhY2VUb0RlcHRoT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIFNwYWNlVG9EZXB0aE9wdGlvbnNBZGRCbG9ja1NpemUoYnVpbGRlciwgc2VsZi5ibG9ja1NpemUpCi0gICAgICAgIHNwYWNlVG9EZXB0aE9wdGlvbnMgPSBTcGFjZVRvRGVwdGhPcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBzcGFjZVRvRGVwdGhPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWNsYXNzIFNwYXJzZUluZGV4VmVjdG9yKG9iamVjdCk6Ci0gICAgTk9ORSA9IDAKLSAgICBJbnQzMlZlY3RvciA9IDEKLSAgICBVaW50MTZWZWN0b3IgPSAyCi0gICAgVWludDhWZWN0b3IgPSAzCi0KLWRlZiBTcGFyc2VJbmRleFZlY3RvckNyZWF0b3IodW5pb25UeXBlLCB0YWJsZSk6Ci0gICAgZnJvbSBmbGF0YnVmZmVycy50YWJsZSBpbXBvcnQgVGFibGUKLSAgICBpZiBub3QgaXNpbnN0YW5jZSh0YWJsZSwgVGFibGUpOgotICAgICAgICByZXR1cm4gTm9uZQotICAgIGlmIHVuaW9uVHlwZSA9PSBTcGFyc2VJbmRleFZlY3RvcigpLkludDMyVmVjdG9yOgotICAgICAgICByZXR1cm4gSW50MzJWZWN0b3JULkluaXRGcm9tQnVmKHRhYmxlLkJ5dGVzLCB0YWJsZS5Qb3MpCi0gICAgaWYgdW5pb25UeXBlID09IFNwYXJzZUluZGV4VmVjdG9yKCkuVWludDE2VmVjdG9yOgotICAgICAgICByZXR1cm4gVWludDE2VmVjdG9yVC5Jbml0RnJvbUJ1Zih0YWJsZS5CeXRlcywgdGFibGUuUG9zKQotICAgIGlmIHVuaW9uVHlwZSA9PSBTcGFyc2VJbmRleFZlY3RvcigpLlVpbnQ4VmVjdG9yOgotICAgICAgICByZXR1cm4gVWludDhWZWN0b3JULkluaXRGcm9tQnVmKHRhYmxlLkJ5dGVzLCB0YWJsZS5Qb3MpCi0gICAgcmV0dXJuIE5vbmUKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBTcGFyc2VUb0RlbnNlT3B0aW9ucyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IFNwYXJzZVRvRGVuc2VPcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNTcGFyc2VUb0RlbnNlT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIFNwYXJzZVRvRGVuc2VPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBTcGFyc2VUb0RlbnNlT3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLSAgICAjIFNwYXJzZVRvRGVuc2VPcHRpb25zCi0gICAgZGVmIFZhbGlkYXRlSW5kaWNlcyhzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuQm9vbEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykpCi0gICAgICAgIHJldHVybiBGYWxzZQotCi1kZWYgU3BhcnNlVG9EZW5zZU9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgxKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBTcGFyc2VUb0RlbnNlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgU3BhcnNlVG9EZW5zZU9wdGlvbnNBZGRWYWxpZGF0ZUluZGljZXMoYnVpbGRlciwgdmFsaWRhdGVJbmRpY2VzKTogYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoMCwgdmFsaWRhdGVJbmRpY2VzLCAwKQotZGVmIEFkZFZhbGlkYXRlSW5kaWNlcyhidWlsZGVyLCB2YWxpZGF0ZUluZGljZXMpOgotICAgIHJldHVybiBTcGFyc2VUb0RlbnNlT3B0aW9uc0FkZFZhbGlkYXRlSW5kaWNlcyhidWlsZGVyLCB2YWxpZGF0ZUluZGljZXMpCi1kZWYgU3BhcnNlVG9EZW5zZU9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBTcGFyc2VUb0RlbnNlT3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBTcGFyc2VUb0RlbnNlT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgU3BhcnNlVG9EZW5zZU9wdGlvbnNUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBzZWxmLnZhbGlkYXRlSW5kaWNlcyA9IEZhbHNlICAjIHR5cGU6IGJvb2wKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgc3BhcnNlVG9EZW5zZU9wdGlvbnMgPSBTcGFyc2VUb0RlbnNlT3B0aW9ucygpCi0gICAgICAgIHNwYXJzZVRvRGVuc2VPcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooc3BhcnNlVG9EZW5zZU9wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzcGFyc2VUb0RlbnNlT3B0aW9ucyk6Ci0gICAgICAgIHggPSBTcGFyc2VUb0RlbnNlT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2soc3BhcnNlVG9EZW5zZU9wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIFNwYXJzZVRvRGVuc2VPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIHNwYXJzZVRvRGVuc2VPcHRpb25zKToKLSAgICAgICAgaWYgc3BhcnNlVG9EZW5zZU9wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLnZhbGlkYXRlSW5kaWNlcyA9IHNwYXJzZVRvRGVuc2VPcHRpb25zLlZhbGlkYXRlSW5kaWNlcygpCi0KLSAgICAjIFNwYXJzZVRvRGVuc2VPcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBTcGFyc2VUb0RlbnNlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIFNwYXJzZVRvRGVuc2VPcHRpb25zQWRkVmFsaWRhdGVJbmRpY2VzKGJ1aWxkZXIsIHNlbGYudmFsaWRhdGVJbmRpY2VzKQotICAgICAgICBzcGFyc2VUb0RlbnNlT3B0aW9ucyA9IFNwYXJzZVRvRGVuc2VPcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBzcGFyc2VUb0RlbnNlT3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIFNwYXJzaXR5UGFyYW1ldGVycyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IFNwYXJzaXR5UGFyYW1ldGVycygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzU3BhcnNpdHlQYXJhbWV0ZXJzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgU3BhcnNpdHlQYXJhbWV0ZXJzQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBTcGFyc2l0eVBhcmFtZXRlcnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi0gICAgIyBTcGFyc2l0eVBhcmFtZXRlcnMKLSAgICBkZWYgVHJhdmVyc2FsT3JkZXIoc2VsZiwgaik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIGEgPSBzZWxmLl90YWIuVmVjdG9yKG8pCi0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgYSArIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaiAqIDQpKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBTcGFyc2l0eVBhcmFtZXRlcnMKLSAgICBkZWYgVHJhdmVyc2FsT3JkZXJBc051bXB5KHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldFZlY3RvckFzTnVtcHkoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8pCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIFNwYXJzaXR5UGFyYW1ldGVycwotICAgIGRlZiBUcmF2ZXJzYWxPcmRlckxlbmd0aChzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgU3BhcnNpdHlQYXJhbWV0ZXJzCi0gICAgZGVmIFRyYXZlcnNhbE9yZGVySXNOb25lKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQotICAgICAgICByZXR1cm4gbyA9PSAwCi0KLSAgICAjIFNwYXJzaXR5UGFyYW1ldGVycwotICAgIGRlZiBCbG9ja01hcChzZWxmLCBqKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgYSA9IHNlbGYuX3RhYi5WZWN0b3IobykKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBhICsgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShqICogNCkpCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIFNwYXJzaXR5UGFyYW1ldGVycwotICAgIGRlZiBCbG9ja01hcEFzTnVtcHkoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0VmVjdG9yQXNOdW1weShmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgU3BhcnNpdHlQYXJhbWV0ZXJzCi0gICAgZGVmIEJsb2NrTWFwTGVuZ3RoKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlZlY3RvckxlbihvKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBTcGFyc2l0eVBhcmFtZXRlcnMKLSAgICBkZWYgQmxvY2tNYXBJc05vbmUoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCi0gICAgICAgIHJldHVybiBvID09IDAKLQotICAgICMgU3BhcnNpdHlQYXJhbWV0ZXJzCi0gICAgZGVmIERpbU1ldGFkYXRhKHNlbGYsIGopOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICB4ID0gc2VsZi5fdGFiLlZlY3RvcihvKQotICAgICAgICAgICAgeCArPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGopICogNAotICAgICAgICAgICAgeCA9IHNlbGYuX3RhYi5JbmRpcmVjdCh4KQotICAgICAgICAgICAgb2JqID0gRGltZW5zaW9uTWV0YWRhdGEoKQotICAgICAgICAgICAgb2JqLkluaXQoc2VsZi5fdGFiLkJ5dGVzLCB4KQotICAgICAgICAgICAgcmV0dXJuIG9iagotICAgICAgICByZXR1cm4gTm9uZQotCi0gICAgIyBTcGFyc2l0eVBhcmFtZXRlcnMKLSAgICBkZWYgRGltTWV0YWRhdGFMZW5ndGgoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuVmVjdG9yTGVuKG8pCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIFNwYXJzaXR5UGFyYW1ldGVycwotICAgIGRlZiBEaW1NZXRhZGF0YUlzTm9uZShzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg4KSkKLSAgICAgICAgcmV0dXJuIG8gPT0gMAotCi1kZWYgU3BhcnNpdHlQYXJhbWV0ZXJzU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMykKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gU3BhcnNpdHlQYXJhbWV0ZXJzU3RhcnQoYnVpbGRlcikKLWRlZiBTcGFyc2l0eVBhcmFtZXRlcnNBZGRUcmF2ZXJzYWxPcmRlcihidWlsZGVyLCB0cmF2ZXJzYWxPcmRlcik6IGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDAsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUodHJhdmVyc2FsT3JkZXIpLCAwKQotZGVmIEFkZFRyYXZlcnNhbE9yZGVyKGJ1aWxkZXIsIHRyYXZlcnNhbE9yZGVyKToKLSAgICByZXR1cm4gU3BhcnNpdHlQYXJhbWV0ZXJzQWRkVHJhdmVyc2FsT3JkZXIoYnVpbGRlciwgdHJhdmVyc2FsT3JkZXIpCi1kZWYgU3BhcnNpdHlQYXJhbWV0ZXJzU3RhcnRUcmF2ZXJzYWxPcmRlclZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6IHJldHVybiBidWlsZGVyLlN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KQotZGVmIFN0YXJ0VHJhdmVyc2FsT3JkZXJWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgotICAgIHJldHVybiBTcGFyc2l0eVBhcmFtZXRlcnNTdGFydFRyYXZlcnNhbE9yZGVyVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKQotZGVmIFNwYXJzaXR5UGFyYW1ldGVyc0FkZEJsb2NrTWFwKGJ1aWxkZXIsIGJsb2NrTWFwKTogYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMSwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShibG9ja01hcCksIDApCi1kZWYgQWRkQmxvY2tNYXAoYnVpbGRlciwgYmxvY2tNYXApOgotICAgIHJldHVybiBTcGFyc2l0eVBhcmFtZXRlcnNBZGRCbG9ja01hcChidWlsZGVyLCBibG9ja01hcCkKLWRlZiBTcGFyc2l0eVBhcmFtZXRlcnNTdGFydEJsb2NrTWFwVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKTogcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpCi1kZWYgU3RhcnRCbG9ja01hcFZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6Ci0gICAgcmV0dXJuIFNwYXJzaXR5UGFyYW1ldGVyc1N0YXJ0QmxvY2tNYXBWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpCi1kZWYgU3BhcnNpdHlQYXJhbWV0ZXJzQWRkRGltTWV0YWRhdGEoYnVpbGRlciwgZGltTWV0YWRhdGEpOiBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgyLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGRpbU1ldGFkYXRhKSwgMCkKLWRlZiBBZGREaW1NZXRhZGF0YShidWlsZGVyLCBkaW1NZXRhZGF0YSk6Ci0gICAgcmV0dXJuIFNwYXJzaXR5UGFyYW1ldGVyc0FkZERpbU1ldGFkYXRhKGJ1aWxkZXIsIGRpbU1ldGFkYXRhKQotZGVmIFNwYXJzaXR5UGFyYW1ldGVyc1N0YXJ0RGltTWV0YWRhdGFWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOiByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCkKLWRlZiBTdGFydERpbU1ldGFkYXRhVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKLSAgICByZXR1cm4gU3BhcnNpdHlQYXJhbWV0ZXJzU3RhcnREaW1NZXRhZGF0YVZlY3RvcihidWlsZGVyLCBudW1FbGVtcykKLWRlZiBTcGFyc2l0eVBhcmFtZXRlcnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBTcGFyc2l0eVBhcmFtZXRlcnNFbmQoYnVpbGRlcikKLXRyeToKLSAgICBmcm9tIHR5cGluZyBpbXBvcnQgTGlzdAotZXhjZXB0OgotICAgIHBhc3MKLQotY2xhc3MgU3BhcnNpdHlQYXJhbWV0ZXJzVChvYmplY3QpOgotCi0gICAgIyBTcGFyc2l0eVBhcmFtZXRlcnNUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBzZWxmLnRyYXZlcnNhbE9yZGVyID0gTm9uZSAgIyB0eXBlOiBMaXN0W2ludF0KLSAgICAgICAgc2VsZi5ibG9ja01hcCA9IE5vbmUgICMgdHlwZTogTGlzdFtpbnRdCi0gICAgICAgIHNlbGYuZGltTWV0YWRhdGEgPSBOb25lICAjIHR5cGU6IExpc3RbRGltZW5zaW9uTWV0YWRhdGFUXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBzcGFyc2l0eVBhcmFtZXRlcnMgPSBTcGFyc2l0eVBhcmFtZXRlcnMoKQotICAgICAgICBzcGFyc2l0eVBhcmFtZXRlcnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihzcGFyc2l0eVBhcmFtZXRlcnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzcGFyc2l0eVBhcmFtZXRlcnMpOgotICAgICAgICB4ID0gU3BhcnNpdHlQYXJhbWV0ZXJzVCgpCi0gICAgICAgIHguX1VuUGFjayhzcGFyc2l0eVBhcmFtZXRlcnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIFNwYXJzaXR5UGFyYW1ldGVyc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBzcGFyc2l0eVBhcmFtZXRlcnMpOgotICAgICAgICBpZiBzcGFyc2l0eVBhcmFtZXRlcnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBpZiBub3Qgc3BhcnNpdHlQYXJhbWV0ZXJzLlRyYXZlcnNhbE9yZGVySXNOb25lKCk6Ci0gICAgICAgICAgICBpZiBucCBpcyBOb25lOgotICAgICAgICAgICAgICAgIHNlbGYudHJhdmVyc2FsT3JkZXIgPSBbXQotICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHNwYXJzaXR5UGFyYW1ldGVycy5UcmF2ZXJzYWxPcmRlckxlbmd0aCgpKToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi50cmF2ZXJzYWxPcmRlci5hcHBlbmQoc3BhcnNpdHlQYXJhbWV0ZXJzLlRyYXZlcnNhbE9yZGVyKGkpKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLnRyYXZlcnNhbE9yZGVyID0gc3BhcnNpdHlQYXJhbWV0ZXJzLlRyYXZlcnNhbE9yZGVyQXNOdW1weSgpCi0gICAgICAgIGlmIG5vdCBzcGFyc2l0eVBhcmFtZXRlcnMuQmxvY2tNYXBJc05vbmUoKToKLSAgICAgICAgICAgIGlmIG5wIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgc2VsZi5ibG9ja01hcCA9IFtdCi0gICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2Uoc3BhcnNpdHlQYXJhbWV0ZXJzLkJsb2NrTWFwTGVuZ3RoKCkpOgotICAgICAgICAgICAgICAgICAgICBzZWxmLmJsb2NrTWFwLmFwcGVuZChzcGFyc2l0eVBhcmFtZXRlcnMuQmxvY2tNYXAoaSkpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlbGYuYmxvY2tNYXAgPSBzcGFyc2l0eVBhcmFtZXRlcnMuQmxvY2tNYXBBc051bXB5KCkKLSAgICAgICAgaWYgbm90IHNwYXJzaXR5UGFyYW1ldGVycy5EaW1NZXRhZGF0YUlzTm9uZSgpOgotICAgICAgICAgICAgc2VsZi5kaW1NZXRhZGF0YSA9IFtdCi0gICAgICAgICAgICBmb3IgaSBpbiByYW5nZShzcGFyc2l0eVBhcmFtZXRlcnMuRGltTWV0YWRhdGFMZW5ndGgoKSk6Ci0gICAgICAgICAgICAgICAgaWYgc3BhcnNpdHlQYXJhbWV0ZXJzLkRpbU1ldGFkYXRhKGkpIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYuZGltTWV0YWRhdGEuYXBwZW5kKE5vbmUpCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgZGltZW5zaW9uTWV0YWRhdGFfID0gRGltZW5zaW9uTWV0YWRhdGFULkluaXRGcm9tT2JqKHNwYXJzaXR5UGFyYW1ldGVycy5EaW1NZXRhZGF0YShpKSkKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5kaW1NZXRhZGF0YS5hcHBlbmQoZGltZW5zaW9uTWV0YWRhdGFfKQotCi0gICAgIyBTcGFyc2l0eVBhcmFtZXRlcnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIGlmIHNlbGYudHJhdmVyc2FsT3JkZXIgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBpZiBucCBpcyBub3QgTm9uZSBhbmQgdHlwZShzZWxmLnRyYXZlcnNhbE9yZGVyKSBpcyBucC5uZGFycmF5OgotICAgICAgICAgICAgICAgIHRyYXZlcnNhbE9yZGVyID0gYnVpbGRlci5DcmVhdGVOdW1weVZlY3RvcihzZWxmLnRyYXZlcnNhbE9yZGVyKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBTcGFyc2l0eVBhcmFtZXRlcnNTdGFydFRyYXZlcnNhbE9yZGVyVmVjdG9yKGJ1aWxkZXIsIGxlbihzZWxmLnRyYXZlcnNhbE9yZGVyKSkKLSAgICAgICAgICAgICAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShsZW4oc2VsZi50cmF2ZXJzYWxPcmRlcikpKToKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5QcmVwZW5kSW50MzIoc2VsZi50cmF2ZXJzYWxPcmRlcltpXSkKLSAgICAgICAgICAgICAgICB0cmF2ZXJzYWxPcmRlciA9IGJ1aWxkZXIuRW5kVmVjdG9yKCkKLSAgICAgICAgaWYgc2VsZi5ibG9ja01hcCBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIGlmIG5wIGlzIG5vdCBOb25lIGFuZCB0eXBlKHNlbGYuYmxvY2tNYXApIGlzIG5wLm5kYXJyYXk6Ci0gICAgICAgICAgICAgICAgYmxvY2tNYXAgPSBidWlsZGVyLkNyZWF0ZU51bXB5VmVjdG9yKHNlbGYuYmxvY2tNYXApCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIFNwYXJzaXR5UGFyYW1ldGVyc1N0YXJ0QmxvY2tNYXBWZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYuYmxvY2tNYXApKQotICAgICAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLmJsb2NrTWFwKSkpOgotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLlByZXBlbmRJbnQzMihzZWxmLmJsb2NrTWFwW2ldKQotICAgICAgICAgICAgICAgIGJsb2NrTWFwID0gYnVpbGRlci5FbmRWZWN0b3IoKQotICAgICAgICBpZiBzZWxmLmRpbU1ldGFkYXRhIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgZGltTWV0YWRhdGFsaXN0ID0gW10KLSAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLmRpbU1ldGFkYXRhKSk6Ci0gICAgICAgICAgICAgICAgZGltTWV0YWRhdGFsaXN0LmFwcGVuZChzZWxmLmRpbU1ldGFkYXRhW2ldLlBhY2soYnVpbGRlcikpCi0gICAgICAgICAgICBTcGFyc2l0eVBhcmFtZXRlcnNTdGFydERpbU1ldGFkYXRhVmVjdG9yKGJ1aWxkZXIsIGxlbihzZWxmLmRpbU1ldGFkYXRhKSkKLSAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLmRpbU1ldGFkYXRhKSkpOgotICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmUoZGltTWV0YWRhdGFsaXN0W2ldKQotICAgICAgICAgICAgZGltTWV0YWRhdGEgPSBidWlsZGVyLkVuZFZlY3RvcigpCi0gICAgICAgIFNwYXJzaXR5UGFyYW1ldGVyc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIGlmIHNlbGYudHJhdmVyc2FsT3JkZXIgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBTcGFyc2l0eVBhcmFtZXRlcnNBZGRUcmF2ZXJzYWxPcmRlcihidWlsZGVyLCB0cmF2ZXJzYWxPcmRlcikKLSAgICAgICAgaWYgc2VsZi5ibG9ja01hcCBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIFNwYXJzaXR5UGFyYW1ldGVyc0FkZEJsb2NrTWFwKGJ1aWxkZXIsIGJsb2NrTWFwKQotICAgICAgICBpZiBzZWxmLmRpbU1ldGFkYXRhIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgU3BhcnNpdHlQYXJhbWV0ZXJzQWRkRGltTWV0YWRhdGEoYnVpbGRlciwgZGltTWV0YWRhdGEpCi0gICAgICAgIHNwYXJzaXR5UGFyYW1ldGVycyA9IFNwYXJzaXR5UGFyYW1ldGVyc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gc3BhcnNpdHlQYXJhbWV0ZXJzCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgU3BsaXRPcHRpb25zKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gU3BsaXRPcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNTcGxpdE9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBTcGxpdE9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIFNwbGl0T3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLSAgICAjIFNwbGl0T3B0aW9ucwotICAgIGRlZiBOdW1TcGxpdHMoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAKLQotZGVmIFNwbGl0T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDEpCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFNwbGl0T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgU3BsaXRPcHRpb25zQWRkTnVtU3BsaXRzKGJ1aWxkZXIsIG51bVNwbGl0cyk6IGJ1aWxkZXIuUHJlcGVuZEludDMyU2xvdCgwLCBudW1TcGxpdHMsIDApCi1kZWYgQWRkTnVtU3BsaXRzKGJ1aWxkZXIsIG51bVNwbGl0cyk6Ci0gICAgcmV0dXJuIFNwbGl0T3B0aW9uc0FkZE51bVNwbGl0cyhidWlsZGVyLCBudW1TcGxpdHMpCi1kZWYgU3BsaXRPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gU3BsaXRPcHRpb25zRW5kKGJ1aWxkZXIpCi0KLWNsYXNzIFNwbGl0T3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgU3BsaXRPcHRpb25zVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi5udW1TcGxpdHMgPSAwICAjIHR5cGU6IGludAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBzcGxpdE9wdGlvbnMgPSBTcGxpdE9wdGlvbnMoKQotICAgICAgICBzcGxpdE9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihzcGxpdE9wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzcGxpdE9wdGlvbnMpOgotICAgICAgICB4ID0gU3BsaXRPcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhzcGxpdE9wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIFNwbGl0T3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBzcGxpdE9wdGlvbnMpOgotICAgICAgICBpZiBzcGxpdE9wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLm51bVNwbGl0cyA9IHNwbGl0T3B0aW9ucy5OdW1TcGxpdHMoKQotCi0gICAgIyBTcGxpdE9wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIFNwbGl0T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIFNwbGl0T3B0aW9uc0FkZE51bVNwbGl0cyhidWlsZGVyLCBzZWxmLm51bVNwbGl0cykKLSAgICAgICAgc3BsaXRPcHRpb25zID0gU3BsaXRPcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiBzcGxpdE9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBTcGxpdFZPcHRpb25zKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gU3BsaXRWT3B0aW9ucygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzU3BsaXRWT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIFNwbGl0Vk9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIFNwbGl0Vk9wdGlvbnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi0gICAgIyBTcGxpdFZPcHRpb25zCi0gICAgZGVmIE51bVNwbGl0cyhzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gMAotCi1kZWYgU3BsaXRWT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDEpCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFNwbGl0Vk9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIFNwbGl0Vk9wdGlvbnNBZGROdW1TcGxpdHMoYnVpbGRlciwgbnVtU3BsaXRzKTogYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDAsIG51bVNwbGl0cywgMCkKLWRlZiBBZGROdW1TcGxpdHMoYnVpbGRlciwgbnVtU3BsaXRzKToKLSAgICByZXR1cm4gU3BsaXRWT3B0aW9uc0FkZE51bVNwbGl0cyhidWlsZGVyLCBudW1TcGxpdHMpCi1kZWYgU3BsaXRWT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFNwbGl0Vk9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgU3BsaXRWT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgU3BsaXRWT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYubnVtU3BsaXRzID0gMCAgIyB0eXBlOiBpbnQKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgc3BsaXRWb3B0aW9ucyA9IFNwbGl0Vk9wdGlvbnMoKQotICAgICAgICBzcGxpdFZvcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooc3BsaXRWb3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHNwbGl0Vm9wdGlvbnMpOgotICAgICAgICB4ID0gU3BsaXRWT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2soc3BsaXRWb3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgU3BsaXRWT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBzcGxpdFZvcHRpb25zKToKLSAgICAgICAgaWYgc3BsaXRWb3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYubnVtU3BsaXRzID0gc3BsaXRWb3B0aW9ucy5OdW1TcGxpdHMoKQotCi0gICAgIyBTcGxpdFZPcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBTcGxpdFZPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgU3BsaXRWT3B0aW9uc0FkZE51bVNwbGl0cyhidWlsZGVyLCBzZWxmLm51bVNwbGl0cykKLSAgICAgICAgc3BsaXRWb3B0aW9ucyA9IFNwbGl0Vk9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIHNwbGl0Vm9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBTcXVhcmVPcHRpb25zKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gU3F1YXJlT3B0aW9ucygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzU3F1YXJlT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIFNxdWFyZU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIFNxdWFyZU9wdGlvbnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi1kZWYgU3F1YXJlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFNxdWFyZU9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIFNxdWFyZU9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBTcXVhcmVPcHRpb25zRW5kKGJ1aWxkZXIpCi0KLWNsYXNzIFNxdWFyZU9wdGlvbnNUKG9iamVjdCk6Ci0KLSAgICAjIFNxdWFyZU9wdGlvbnNUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBwYXNzCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIHNxdWFyZU9wdGlvbnMgPSBTcXVhcmVPcHRpb25zKCkKLSAgICAgICAgc3F1YXJlT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHNxdWFyZU9wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzcXVhcmVPcHRpb25zKToKLSAgICAgICAgeCA9IFNxdWFyZU9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKHNxdWFyZU9wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIFNxdWFyZU9wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgc3F1YXJlT3B0aW9ucyk6Ci0gICAgICAgIGlmIHNxdWFyZU9wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgIyBTcXVhcmVPcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBTcXVhcmVPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgc3F1YXJlT3B0aW9ucyA9IFNxdWFyZU9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIHNxdWFyZU9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBTcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBTcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc1NxdWFyZWREaWZmZXJlbmNlT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIFNxdWFyZWREaWZmZXJlbmNlT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgU3F1YXJlZERpZmZlcmVuY2VPcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotZGVmIFNxdWFyZWREaWZmZXJlbmNlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFNxdWFyZWREaWZmZXJlbmNlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgU3F1YXJlZERpZmZlcmVuY2VPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gU3F1YXJlZERpZmZlcmVuY2VPcHRpb25zRW5kKGJ1aWxkZXIpCi0KLWNsYXNzIFNxdWFyZWREaWZmZXJlbmNlT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgU3F1YXJlZERpZmZlcmVuY2VPcHRpb25zVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgcGFzcwotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBzcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnMgPSBTcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnMoKQotICAgICAgICBzcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihzcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnMpOgotICAgICAgICB4ID0gU3F1YXJlZERpZmZlcmVuY2VPcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhzcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIFNxdWFyZWREaWZmZXJlbmNlT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCBzcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnMpOgotICAgICAgICBpZiBzcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgIyBTcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIFNxdWFyZWREaWZmZXJlbmNlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIHNxdWFyZWREaWZmZXJlbmNlT3B0aW9ucyA9IFNxdWFyZWREaWZmZXJlbmNlT3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gc3F1YXJlZERpZmZlcmVuY2VPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgU3F1ZWV6ZU9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBTcXVlZXplT3B0aW9ucygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzU3F1ZWV6ZU9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBTcXVlZXplT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgU3F1ZWV6ZU9wdGlvbnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi0gICAgIyBTcXVlZXplT3B0aW9ucwotICAgIGRlZiBTcXVlZXplRGltcyhzZWxmLCBqKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgYSA9IHNlbGYuX3RhYi5WZWN0b3IobykKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBhICsgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShqICogNCkpCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIFNxdWVlemVPcHRpb25zCi0gICAgZGVmIFNxdWVlemVEaW1zQXNOdW1weShzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXRWZWN0b3JBc051bXB5KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBTcXVlZXplT3B0aW9ucwotICAgIGRlZiBTcXVlZXplRGltc0xlbmd0aChzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgU3F1ZWV6ZU9wdGlvbnMKLSAgICBkZWYgU3F1ZWV6ZURpbXNJc05vbmUoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCi0gICAgICAgIHJldHVybiBvID09IDAKLQotZGVmIFNxdWVlemVPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMSkKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gU3F1ZWV6ZU9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIFNxdWVlemVPcHRpb25zQWRkU3F1ZWV6ZURpbXMoYnVpbGRlciwgc3F1ZWV6ZURpbXMpOiBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgwLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNxdWVlemVEaW1zKSwgMCkKLWRlZiBBZGRTcXVlZXplRGltcyhidWlsZGVyLCBzcXVlZXplRGltcyk6Ci0gICAgcmV0dXJuIFNxdWVlemVPcHRpb25zQWRkU3F1ZWV6ZURpbXMoYnVpbGRlciwgc3F1ZWV6ZURpbXMpCi1kZWYgU3F1ZWV6ZU9wdGlvbnNTdGFydFNxdWVlemVEaW1zVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKTogcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpCi1kZWYgU3RhcnRTcXVlZXplRGltc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6Ci0gICAgcmV0dXJuIFNxdWVlemVPcHRpb25zU3RhcnRTcXVlZXplRGltc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykKLWRlZiBTcXVlZXplT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFNxdWVlemVPcHRpb25zRW5kKGJ1aWxkZXIpCi10cnk6Ci0gICAgZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QKLWV4Y2VwdDoKLSAgICBwYXNzCi0KLWNsYXNzIFNxdWVlemVPcHRpb25zVChvYmplY3QpOgotCi0gICAgIyBTcXVlZXplT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYuc3F1ZWV6ZURpbXMgPSBOb25lICAjIHR5cGU6IExpc3RbaW50XQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBzcXVlZXplT3B0aW9ucyA9IFNxdWVlemVPcHRpb25zKCkKLSAgICAgICAgc3F1ZWV6ZU9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihzcXVlZXplT3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHNxdWVlemVPcHRpb25zKToKLSAgICAgICAgeCA9IFNxdWVlemVPcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhzcXVlZXplT3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgU3F1ZWV6ZU9wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgc3F1ZWV6ZU9wdGlvbnMpOgotICAgICAgICBpZiBzcXVlZXplT3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIGlmIG5vdCBzcXVlZXplT3B0aW9ucy5TcXVlZXplRGltc0lzTm9uZSgpOgotICAgICAgICAgICAgaWYgbnAgaXMgTm9uZToKLSAgICAgICAgICAgICAgICBzZWxmLnNxdWVlemVEaW1zID0gW10KLSAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShzcXVlZXplT3B0aW9ucy5TcXVlZXplRGltc0xlbmd0aCgpKToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5zcXVlZXplRGltcy5hcHBlbmQoc3F1ZWV6ZU9wdGlvbnMuU3F1ZWV6ZURpbXMoaSkpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlbGYuc3F1ZWV6ZURpbXMgPSBzcXVlZXplT3B0aW9ucy5TcXVlZXplRGltc0FzTnVtcHkoKQotCi0gICAgIyBTcXVlZXplT3B0aW9uc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgaWYgc2VsZi5zcXVlZXplRGltcyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIGlmIG5wIGlzIG5vdCBOb25lIGFuZCB0eXBlKHNlbGYuc3F1ZWV6ZURpbXMpIGlzIG5wLm5kYXJyYXk6Ci0gICAgICAgICAgICAgICAgc3F1ZWV6ZURpbXMgPSBidWlsZGVyLkNyZWF0ZU51bXB5VmVjdG9yKHNlbGYuc3F1ZWV6ZURpbXMpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIFNxdWVlemVPcHRpb25zU3RhcnRTcXVlZXplRGltc1ZlY3RvcihidWlsZGVyLCBsZW4oc2VsZi5zcXVlZXplRGltcykpCi0gICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYuc3F1ZWV6ZURpbXMpKSk6Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZEludDMyKHNlbGYuc3F1ZWV6ZURpbXNbaV0pCi0gICAgICAgICAgICAgICAgc3F1ZWV6ZURpbXMgPSBidWlsZGVyLkVuZFZlY3RvcigpCi0gICAgICAgIFNxdWVlemVPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgaWYgc2VsZi5zcXVlZXplRGltcyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIFNxdWVlemVPcHRpb25zQWRkU3F1ZWV6ZURpbXMoYnVpbGRlciwgc3F1ZWV6ZURpbXMpCi0gICAgICAgIHNxdWVlemVPcHRpb25zID0gU3F1ZWV6ZU9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIHNxdWVlemVPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgU3RyaWRlZFNsaWNlT3B0aW9ucyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IFN0cmlkZWRTbGljZU9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc1N0cmlkZWRTbGljZU9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBTdHJpZGVkU2xpY2VPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBTdHJpZGVkU2xpY2VPcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotICAgICMgU3RyaWRlZFNsaWNlT3B0aW9ucwotICAgIGRlZiBCZWdpbk1hc2soc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgU3RyaWRlZFNsaWNlT3B0aW9ucwotICAgIGRlZiBFbmRNYXNrKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIFN0cmlkZWRTbGljZU9wdGlvbnMKLSAgICBkZWYgRWxsaXBzaXNNYXNrKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIFN0cmlkZWRTbGljZU9wdGlvbnMKLSAgICBkZWYgTmV3QXhpc01hc2soc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTApKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIFN0cmlkZWRTbGljZU9wdGlvbnMKLSAgICBkZWYgU2hyaW5rQXhpc01hc2soc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTIpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIFN0cmlkZWRTbGljZU9wdGlvbnMKLSAgICBkZWYgT2Zmc2V0KHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDE0KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuQm9vbEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykpCi0gICAgICAgIHJldHVybiBGYWxzZQotCi1kZWYgU3RyaWRlZFNsaWNlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDYpCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFN0cmlkZWRTbGljZU9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIFN0cmlkZWRTbGljZU9wdGlvbnNBZGRCZWdpbk1hc2soYnVpbGRlciwgYmVnaW5NYXNrKTogYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDAsIGJlZ2luTWFzaywgMCkKLWRlZiBBZGRCZWdpbk1hc2soYnVpbGRlciwgYmVnaW5NYXNrKToKLSAgICByZXR1cm4gU3RyaWRlZFNsaWNlT3B0aW9uc0FkZEJlZ2luTWFzayhidWlsZGVyLCBiZWdpbk1hc2spCi1kZWYgU3RyaWRlZFNsaWNlT3B0aW9uc0FkZEVuZE1hc2soYnVpbGRlciwgZW5kTWFzayk6IGJ1aWxkZXIuUHJlcGVuZEludDMyU2xvdCgxLCBlbmRNYXNrLCAwKQotZGVmIEFkZEVuZE1hc2soYnVpbGRlciwgZW5kTWFzayk6Ci0gICAgcmV0dXJuIFN0cmlkZWRTbGljZU9wdGlvbnNBZGRFbmRNYXNrKGJ1aWxkZXIsIGVuZE1hc2spCi1kZWYgU3RyaWRlZFNsaWNlT3B0aW9uc0FkZEVsbGlwc2lzTWFzayhidWlsZGVyLCBlbGxpcHNpc01hc2spOiBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMiwgZWxsaXBzaXNNYXNrLCAwKQotZGVmIEFkZEVsbGlwc2lzTWFzayhidWlsZGVyLCBlbGxpcHNpc01hc2spOgotICAgIHJldHVybiBTdHJpZGVkU2xpY2VPcHRpb25zQWRkRWxsaXBzaXNNYXNrKGJ1aWxkZXIsIGVsbGlwc2lzTWFzaykKLWRlZiBTdHJpZGVkU2xpY2VPcHRpb25zQWRkTmV3QXhpc01hc2soYnVpbGRlciwgbmV3QXhpc01hc2spOiBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMywgbmV3QXhpc01hc2ssIDApCi1kZWYgQWRkTmV3QXhpc01hc2soYnVpbGRlciwgbmV3QXhpc01hc2spOgotICAgIHJldHVybiBTdHJpZGVkU2xpY2VPcHRpb25zQWRkTmV3QXhpc01hc2soYnVpbGRlciwgbmV3QXhpc01hc2spCi1kZWYgU3RyaWRlZFNsaWNlT3B0aW9uc0FkZFNocmlua0F4aXNNYXNrKGJ1aWxkZXIsIHNocmlua0F4aXNNYXNrKTogYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDQsIHNocmlua0F4aXNNYXNrLCAwKQotZGVmIEFkZFNocmlua0F4aXNNYXNrKGJ1aWxkZXIsIHNocmlua0F4aXNNYXNrKToKLSAgICByZXR1cm4gU3RyaWRlZFNsaWNlT3B0aW9uc0FkZFNocmlua0F4aXNNYXNrKGJ1aWxkZXIsIHNocmlua0F4aXNNYXNrKQotZGVmIFN0cmlkZWRTbGljZU9wdGlvbnNBZGRPZmZzZXQoYnVpbGRlciwgb2Zmc2V0KTogYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoNSwgb2Zmc2V0LCAwKQotZGVmIEFkZE9mZnNldChidWlsZGVyLCBvZmZzZXQpOgotICAgIHJldHVybiBTdHJpZGVkU2xpY2VPcHRpb25zQWRkT2Zmc2V0KGJ1aWxkZXIsIG9mZnNldCkKLWRlZiBTdHJpZGVkU2xpY2VPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gU3RyaWRlZFNsaWNlT3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBTdHJpZGVkU2xpY2VPcHRpb25zVChvYmplY3QpOgotCi0gICAgIyBTdHJpZGVkU2xpY2VPcHRpb25zVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi5iZWdpbk1hc2sgPSAwICAjIHR5cGU6IGludAotICAgICAgICBzZWxmLmVuZE1hc2sgPSAwICAjIHR5cGU6IGludAotICAgICAgICBzZWxmLmVsbGlwc2lzTWFzayA9IDAgICMgdHlwZTogaW50Ci0gICAgICAgIHNlbGYubmV3QXhpc01hc2sgPSAwICAjIHR5cGU6IGludAotICAgICAgICBzZWxmLnNocmlua0F4aXNNYXNrID0gMCAgIyB0eXBlOiBpbnQKLSAgICAgICAgc2VsZi5vZmZzZXQgPSBGYWxzZSAgIyB0eXBlOiBib29sCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIHN0cmlkZWRTbGljZU9wdGlvbnMgPSBTdHJpZGVkU2xpY2VPcHRpb25zKCkKLSAgICAgICAgc3RyaWRlZFNsaWNlT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHN0cmlkZWRTbGljZU9wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzdHJpZGVkU2xpY2VPcHRpb25zKToKLSAgICAgICAgeCA9IFN0cmlkZWRTbGljZU9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKHN0cmlkZWRTbGljZU9wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIFN0cmlkZWRTbGljZU9wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgc3RyaWRlZFNsaWNlT3B0aW9ucyk6Ci0gICAgICAgIGlmIHN0cmlkZWRTbGljZU9wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBzZWxmLmJlZ2luTWFzayA9IHN0cmlkZWRTbGljZU9wdGlvbnMuQmVnaW5NYXNrKCkKLSAgICAgICAgc2VsZi5lbmRNYXNrID0gc3RyaWRlZFNsaWNlT3B0aW9ucy5FbmRNYXNrKCkKLSAgICAgICAgc2VsZi5lbGxpcHNpc01hc2sgPSBzdHJpZGVkU2xpY2VPcHRpb25zLkVsbGlwc2lzTWFzaygpCi0gICAgICAgIHNlbGYubmV3QXhpc01hc2sgPSBzdHJpZGVkU2xpY2VPcHRpb25zLk5ld0F4aXNNYXNrKCkKLSAgICAgICAgc2VsZi5zaHJpbmtBeGlzTWFzayA9IHN0cmlkZWRTbGljZU9wdGlvbnMuU2hyaW5rQXhpc01hc2soKQotICAgICAgICBzZWxmLm9mZnNldCA9IHN0cmlkZWRTbGljZU9wdGlvbnMuT2Zmc2V0KCkKLQotICAgICMgU3RyaWRlZFNsaWNlT3B0aW9uc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgU3RyaWRlZFNsaWNlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIFN0cmlkZWRTbGljZU9wdGlvbnNBZGRCZWdpbk1hc2soYnVpbGRlciwgc2VsZi5iZWdpbk1hc2spCi0gICAgICAgIFN0cmlkZWRTbGljZU9wdGlvbnNBZGRFbmRNYXNrKGJ1aWxkZXIsIHNlbGYuZW5kTWFzaykKLSAgICAgICAgU3RyaWRlZFNsaWNlT3B0aW9uc0FkZEVsbGlwc2lzTWFzayhidWlsZGVyLCBzZWxmLmVsbGlwc2lzTWFzaykKLSAgICAgICAgU3RyaWRlZFNsaWNlT3B0aW9uc0FkZE5ld0F4aXNNYXNrKGJ1aWxkZXIsIHNlbGYubmV3QXhpc01hc2spCi0gICAgICAgIFN0cmlkZWRTbGljZU9wdGlvbnNBZGRTaHJpbmtBeGlzTWFzayhidWlsZGVyLCBzZWxmLnNocmlua0F4aXNNYXNrKQotICAgICAgICBTdHJpZGVkU2xpY2VPcHRpb25zQWRkT2Zmc2V0KGJ1aWxkZXIsIHNlbGYub2Zmc2V0KQotICAgICAgICBzdHJpZGVkU2xpY2VPcHRpb25zID0gU3RyaWRlZFNsaWNlT3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gc3RyaWRlZFNsaWNlT3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQogCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCiAKIGNsYXNzIFN1YkdyYXBoKG9iamVjdCk6CiAgICAgX19zbG90c19fID0gWydfdGFiJ10KQEAgLTExOTAzLDM5ICsxNzI2OCw0MCBAQAogICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5TdHJpbmcobyArIHNlbGYuX3RhYi5Qb3MpCiAgICAgICAgIHJldHVybiBOb25lCiAKLWRlZiBTdWJHcmFwaFN0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDUpCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFN1YkdyYXBoU3RhcnQoYnVpbGRlcikKLWRlZiBTdWJHcmFwaEFkZFRlbnNvcnMoYnVpbGRlciwgdGVuc29ycyk6IGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDAsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUodGVuc29ycyksIDApCi1kZWYgQWRkVGVuc29ycyhidWlsZGVyLCB0ZW5zb3JzKToKLSAgICByZXR1cm4gU3ViR3JhcGhBZGRUZW5zb3JzKGJ1aWxkZXIsIHRlbnNvcnMpCi1kZWYgU3ViR3JhcGhTdGFydFRlbnNvcnNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOiByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCkKLWRlZiBTdGFydFRlbnNvcnNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgotICAgIHJldHVybiBTdWJHcmFwaFN0YXJ0VGVuc29yc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykKLWRlZiBTdWJHcmFwaEFkZElucHV0cyhidWlsZGVyLCBpbnB1dHMpOiBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgxLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGlucHV0cyksIDApCi1kZWYgQWRkSW5wdXRzKGJ1aWxkZXIsIGlucHV0cyk6Ci0gICAgcmV0dXJuIFN1YkdyYXBoQWRkSW5wdXRzKGJ1aWxkZXIsIGlucHV0cykKLWRlZiBTdWJHcmFwaFN0YXJ0SW5wdXRzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKTogcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpCi1kZWYgU3RhcnRJbnB1dHNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgotICAgIHJldHVybiBTdWJHcmFwaFN0YXJ0SW5wdXRzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKQotZGVmIFN1YkdyYXBoQWRkT3V0cHV0cyhidWlsZGVyLCBvdXRwdXRzKTogYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMiwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShvdXRwdXRzKSwgMCkKLWRlZiBBZGRPdXRwdXRzKGJ1aWxkZXIsIG91dHB1dHMpOgotICAgIHJldHVybiBTdWJHcmFwaEFkZE91dHB1dHMoYnVpbGRlciwgb3V0cHV0cykKLWRlZiBTdWJHcmFwaFN0YXJ0T3V0cHV0c1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6IHJldHVybiBidWlsZGVyLlN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KQotZGVmIFN0YXJ0T3V0cHV0c1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6Ci0gICAgcmV0dXJuIFN1YkdyYXBoU3RhcnRPdXRwdXRzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKQotZGVmIFN1YkdyYXBoQWRkT3BlcmF0b3JzKGJ1aWxkZXIsIG9wZXJhdG9ycyk6IGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDMsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUob3BlcmF0b3JzKSwgMCkKLWRlZiBBZGRPcGVyYXRvcnMoYnVpbGRlciwgb3BlcmF0b3JzKToKLSAgICByZXR1cm4gU3ViR3JhcGhBZGRPcGVyYXRvcnMoYnVpbGRlciwgb3BlcmF0b3JzKQotZGVmIFN1YkdyYXBoU3RhcnRPcGVyYXRvcnNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOiByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCkKLWRlZiBTdGFydE9wZXJhdG9yc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6Ci0gICAgcmV0dXJuIFN1YkdyYXBoU3RhcnRPcGVyYXRvcnNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpCi1kZWYgU3ViR3JhcGhBZGROYW1lKGJ1aWxkZXIsIG5hbWUpOiBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCg0LCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKG5hbWUpLCAwKQotZGVmIEFkZE5hbWUoYnVpbGRlciwgbmFtZSk6Ci0gICAgcmV0dXJuIFN1YkdyYXBoQWRkTmFtZShidWlsZGVyLCBuYW1lKQotZGVmIFN1YkdyYXBoRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gU3ViR3JhcGhFbmQoYnVpbGRlcikKK2RlZiBTdWJHcmFwaFN0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoNSkKKworZGVmIFN1YkdyYXBoQWRkVGVuc29ycyhidWlsZGVyLCB0ZW5zb3JzKToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgwLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHRlbnNvcnMpLCAwKQorCitkZWYgU3ViR3JhcGhTdGFydFRlbnNvcnNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgorICAgIHJldHVybiBidWlsZGVyLlN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KQorCitkZWYgU3ViR3JhcGhBZGRJbnB1dHMoYnVpbGRlciwgaW5wdXRzKToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgxLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGlucHV0cyksIDApCisKK2RlZiBTdWJHcmFwaFN0YXJ0SW5wdXRzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKKyAgICByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCkKKworZGVmIFN1YkdyYXBoQWRkT3V0cHV0cyhidWlsZGVyLCBvdXRwdXRzKToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgyLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKG91dHB1dHMpLCAwKQorCitkZWYgU3ViR3JhcGhTdGFydE91dHB1dHNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgorICAgIHJldHVybiBidWlsZGVyLlN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KQorCitkZWYgU3ViR3JhcGhBZGRPcGVyYXRvcnMoYnVpbGRlciwgb3BlcmF0b3JzKToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgzLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKG9wZXJhdG9ycyksIDApCisKK2RlZiBTdWJHcmFwaFN0YXJ0T3BlcmF0b3JzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKKyAgICByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCkKKworZGVmIFN1YkdyYXBoQWRkTmFtZShidWlsZGVyLCBuYW1lKToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCg0LCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKG5hbWUpLCAwKQorCitkZWYgU3ViR3JhcGhFbmQoYnVpbGRlcik6CisgICAgcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKKworCiB0cnk6CiAgICAgZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QKIGV4Y2VwdDoKQEAgLTExOTU4LDYgKzE3MzI0LDExIEBACiAgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooc3ViR3JhcGgpCiAKICAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKICAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBzdWJHcmFwaCk6CiAgICAgICAgIHggPSBTdWJHcmFwaFQoKQogICAgICAgICB4Ll9VblBhY2soc3ViR3JhcGgpCkBAIC0xMjA0OCw0MjcgKzE3NDE5LDI0NSBAQAogICAgICAgICAgICAgU3ViR3JhcGhBZGROYW1lKGJ1aWxkZXIsIG5hbWUpCiAgICAgICAgIHN1YkdyYXBoID0gU3ViR3JhcGhFbmQoYnVpbGRlcikKICAgICAgICAgcmV0dXJuIHN1YkdyYXBoCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQogCi0jIG5hbWVzcGFjZTogdGZsaXRlCiAKLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgU3ViT3B0aW9ucyhvYmplY3QpOgorY2xhc3MgQnVmZmVyKG9iamVjdCk6CiAgICAgX19zbG90c19fID0gWydfdGFiJ10KIAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKICAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gU3ViT3B0aW9ucygpCisgICAgICAgIHggPSBCdWZmZXIoKQogICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQogICAgICAgICByZXR1cm4geAogCiAgICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc1N1Yk9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICBkZWYgR2V0Um9vdEFzQnVmZmVyKGNscywgYnVmLCBvZmZzZXQ9MCk6CiAgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgogICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKICAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgU3ViT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgZGVmIEJ1ZmZlckJ1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CiAgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKIAotICAgICMgU3ViT3B0aW9ucworICAgICMgQnVmZmVyCiAgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgogICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKIAotICAgICMgU3ViT3B0aW9ucwotICAgIGRlZiBGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDhGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIFN1Yk9wdGlvbnMKLSAgICBkZWYgUG90U2NhbGVJbnQxNihzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIGJvb2woc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuQm9vbEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykpCi0gICAgICAgIHJldHVybiBUcnVlCi0KLWRlZiBTdWJPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMikKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gU3ViT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgU3ViT3B0aW9uc0FkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKTogYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoMCwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24sIDApCi1kZWYgQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pOgotICAgIHJldHVybiBTdWJPcHRpb25zQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pCi1kZWYgU3ViT3B0aW9uc0FkZFBvdFNjYWxlSW50MTYoYnVpbGRlciwgcG90U2NhbGVJbnQxNik6IGJ1aWxkZXIuUHJlcGVuZEJvb2xTbG90KDEsIHBvdFNjYWxlSW50MTYsIDEpCi1kZWYgQWRkUG90U2NhbGVJbnQxNihidWlsZGVyLCBwb3RTY2FsZUludDE2KToKLSAgICByZXR1cm4gU3ViT3B0aW9uc0FkZFBvdFNjYWxlSW50MTYoYnVpbGRlciwgcG90U2NhbGVJbnQxNikKLWRlZiBTdWJPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gU3ViT3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBTdWJPcHRpb25zVChvYmplY3QpOgotCi0gICAgIyBTdWJPcHRpb25zVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbiA9IDAgICMgdHlwZTogaW50Ci0gICAgICAgIHNlbGYucG90U2NhbGVJbnQxNiA9IFRydWUgICMgdHlwZTogYm9vbAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICBzdWJPcHRpb25zID0gU3ViT3B0aW9ucygpCi0gICAgICAgIHN1Yk9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihzdWJPcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgc3ViT3B0aW9ucyk6Ci0gICAgICAgIHggPSBTdWJPcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayhzdWJPcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBTdWJPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIHN1Yk9wdGlvbnMpOgotICAgICAgICBpZiBzdWJPcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbiA9IHN1Yk9wdGlvbnMuRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oKQotICAgICAgICBzZWxmLnBvdFNjYWxlSW50MTYgPSBzdWJPcHRpb25zLlBvdFNjYWxlSW50MTYoKQotCi0gICAgIyBTdWJPcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBTdWJPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgU3ViT3B0aW9uc0FkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIHNlbGYuZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pCi0gICAgICAgIFN1Yk9wdGlvbnNBZGRQb3RTY2FsZUludDE2KGJ1aWxkZXIsIHNlbGYucG90U2NhbGVJbnQxNikKLSAgICAgICAgc3ViT3B0aW9ucyA9IFN1Yk9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIHN1Yk9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBUZW5zb3Iob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBUZW5zb3IoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc1RlbnNvcihjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIFRlbnNvckJ1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgVGVuc29yCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotICAgICMgVGVuc29yCi0gICAgZGVmIFNoYXBlKHNlbGYsIGopOgorICAgICMgQnVmZmVyCisgICAgZGVmIERhdGEoc2VsZiwgaik6CiAgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCiAgICAgICAgIGlmIG8gIT0gMDoKICAgICAgICAgICAgIGEgPSBzZWxmLl90YWIuVmVjdG9yKG8pCi0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgYSArIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaiAqIDQpKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVpbnQ4RmxhZ3MsIGEgKyBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGogKiAxKSkKICAgICAgICAgcmV0dXJuIDAKIAotICAgICMgVGVuc29yCi0gICAgZGVmIFNoYXBlQXNOdW1weShzZWxmKToKKyAgICAjIEJ1ZmZlcgorICAgIGRlZiBEYXRhQXNOdW1weShzZWxmKToKICAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKICAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXRWZWN0b3JBc051bXB5KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXRWZWN0b3JBc051bXB5KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VaW50OEZsYWdzLCBvKQogICAgICAgICByZXR1cm4gMAogCi0gICAgIyBUZW5zb3IKLSAgICBkZWYgU2hhcGVMZW5ndGgoc2VsZik6CisgICAgIyBCdWZmZXIKKyAgICBkZWYgRGF0YUxlbmd0aChzZWxmKToKICAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKICAgICAgICAgaWYgbyAhPSAwOgogICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKICAgICAgICAgcmV0dXJuIDAKIAotICAgICMgVGVuc29yCi0gICAgZGVmIFNoYXBlSXNOb25lKHNlbGYpOgorICAgICMgQnVmZmVyCisgICAgZGVmIERhdGFJc05vbmUoc2VsZik6CiAgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCiAgICAgICAgIHJldHVybiBvID09IDAKIAotICAgICMgVGVuc29yCi0gICAgZGVmIFR5cGUoc2VsZik6CisgICAgIyBCdWZmZXIKKyAgICBkZWYgT2Zmc2V0KHNlbGYpOgogICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQogICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50OEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VaW50NjRGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCiAgICAgICAgIHJldHVybiAwCiAKLSAgICAjIFRlbnNvcgotICAgIGRlZiBCdWZmZXIoc2VsZik6CisgICAgIyBCdWZmZXIKKyAgICBkZWYgU2l6ZShzZWxmKToKICAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg4KSkKICAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVpbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VaW50NjRGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCiAgICAgICAgIHJldHVybiAwCiAKLSAgICAjIFRlbnNvcgorZGVmIEJ1ZmZlclN0YXJ0KGJ1aWxkZXIpOgorICAgIGJ1aWxkZXIuU3RhcnRPYmplY3QoMykKKworZGVmIEJ1ZmZlckFkZERhdGEoYnVpbGRlciwgZGF0YSk6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMCwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShkYXRhKSwgMCkKKworZGVmIEJ1ZmZlclN0YXJ0RGF0YVZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6CisgICAgcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoMSwgbnVtRWxlbXMsIDEpCisKK2RlZiBCdWZmZXJBZGRPZmZzZXQoYnVpbGRlciwgb2Zmc2V0KToKKyAgICBidWlsZGVyLlByZXBlbmRVaW50NjRTbG90KDEsIG9mZnNldCwgMCkKKworZGVmIEJ1ZmZlckFkZFNpemUoYnVpbGRlciwgc2l6ZSk6CisgICAgYnVpbGRlci5QcmVwZW5kVWludDY0U2xvdCgyLCBzaXplLCAwKQorCitkZWYgQnVmZmVyRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKwordHJ5OgorICAgIGZyb20gdHlwaW5nIGltcG9ydCBMaXN0CitleGNlcHQ6CisgICAgcGFzcworCitjbGFzcyBCdWZmZXJUKG9iamVjdCk6CisKKyAgICAjIEJ1ZmZlclQKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuZGF0YSA9IE5vbmUgICMgdHlwZTogTGlzdFtpbnRdCisgICAgICAgIHNlbGYub2Zmc2V0ID0gMCAgIyB0eXBlOiBpbnQKKyAgICAgICAgc2VsZi5zaXplID0gMCAgIyB0eXBlOiBpbnQKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKKyAgICAgICAgYnVmZmVyID0gQnVmZmVyKCkKKyAgICAgICAgYnVmZmVyLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooYnVmZmVyKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgYnVmZmVyKToKKyAgICAgICAgeCA9IEJ1ZmZlclQoKQorICAgICAgICB4Ll9VblBhY2soYnVmZmVyKQorICAgICAgICByZXR1cm4geAorCisgICAgIyBCdWZmZXJUCisgICAgZGVmIF9VblBhY2soc2VsZiwgYnVmZmVyKToKKyAgICAgICAgaWYgYnVmZmVyIGlzIE5vbmU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbm90IGJ1ZmZlci5EYXRhSXNOb25lKCk6CisgICAgICAgICAgICBpZiBucCBpcyBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoYnVmZmVyLkRhdGFMZW5ndGgoKSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5hcHBlbmQoYnVmZmVyLkRhdGEoaSkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IGJ1ZmZlci5EYXRhQXNOdW1weSgpCisgICAgICAgIHNlbGYub2Zmc2V0ID0gYnVmZmVyLk9mZnNldCgpCisgICAgICAgIHNlbGYuc2l6ZSA9IGJ1ZmZlci5TaXplKCkKKworICAgICMgQnVmZmVyVAorICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgorICAgICAgICBpZiBzZWxmLmRhdGEgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBucCBpcyBub3QgTm9uZSBhbmQgdHlwZShzZWxmLmRhdGEpIGlzIG5wLm5kYXJyYXk6CisgICAgICAgICAgICAgICAgZGF0YSA9IGJ1aWxkZXIuQ3JlYXRlTnVtcHlWZWN0b3Ioc2VsZi5kYXRhKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBCdWZmZXJTdGFydERhdGFWZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYuZGF0YSkpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYuZGF0YSkpKToKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5QcmVwZW5kVWludDgoc2VsZi5kYXRhW2ldKQorICAgICAgICAgICAgICAgIGRhdGEgPSBidWlsZGVyLkVuZFZlY3RvcigpCisgICAgICAgIEJ1ZmZlclN0YXJ0KGJ1aWxkZXIpCisgICAgICAgIGlmIHNlbGYuZGF0YSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIEJ1ZmZlckFkZERhdGEoYnVpbGRlciwgZGF0YSkKKyAgICAgICAgQnVmZmVyQWRkT2Zmc2V0KGJ1aWxkZXIsIHNlbGYub2Zmc2V0KQorICAgICAgICBCdWZmZXJBZGRTaXplKGJ1aWxkZXIsIHNlbGYuc2l6ZSkKKyAgICAgICAgYnVmZmVyID0gQnVmZmVyRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBidWZmZXIKKworCitjbGFzcyBNZXRhZGF0YShvYmplY3QpOgorICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKKyAgICAgICAgeCA9IE1ldGFkYXRhKCkKKyAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKKyAgICAgICAgcmV0dXJuIHgKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXNNZXRhZGF0YShjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKKyAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIE1ldGFkYXRhQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKKyAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQorCisgICAgIyBNZXRhZGF0YQorICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKKyAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCisKKyAgICAjIE1ldGFkYXRhCiAgICAgZGVmIE5hbWUoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTApKQorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQogICAgICAgICBpZiBvICE9IDA6CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlN0cmluZyhvICsgc2VsZi5fdGFiLlBvcykKICAgICAgICAgcmV0dXJuIE5vbmUKIAotICAgICMgVGVuc29yCi0gICAgZGVmIFF1YW50aXphdGlvbihzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMikpCisgICAgIyBNZXRhZGF0YQorICAgIGRlZiBCdWZmZXIoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCiAgICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHggPSBzZWxmLl90YWIuSW5kaXJlY3QobyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgICAgICBvYmogPSBRdWFudGl6YXRpb25QYXJhbWV0ZXJzKCkKLSAgICAgICAgICAgIG9iai5Jbml0KHNlbGYuX3RhYi5CeXRlcywgeCkKLSAgICAgICAgICAgIHJldHVybiBvYmoKLSAgICAgICAgcmV0dXJuIE5vbmUKLQotICAgICMgVGVuc29yCi0gICAgZGVmIElzVmFyaWFibGUoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTQpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gYm9vbChzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5Cb29sRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKSkKLSAgICAgICAgcmV0dXJuIEZhbHNlCi0KLSAgICAjIFRlbnNvcgotICAgIGRlZiBTcGFyc2l0eShzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxNikpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHggPSBzZWxmLl90YWIuSW5kaXJlY3QobyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgICAgICBvYmogPSBTcGFyc2l0eVBhcmFtZXRlcnMoKQotICAgICAgICAgICAgb2JqLkluaXQoc2VsZi5fdGFiLkJ5dGVzLCB4KQotICAgICAgICAgICAgcmV0dXJuIG9iagotICAgICAgICByZXR1cm4gTm9uZQotCi0gICAgIyBUZW5zb3IKLSAgICBkZWYgU2hhcGVTaWduYXR1cmUoc2VsZiwgaik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTgpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICBhID0gc2VsZi5fdGFiLlZlY3RvcihvKQotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIGEgKyBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGogKiA0KSkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VaW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCiAgICAgICAgIHJldHVybiAwCiAKLSAgICAjIFRlbnNvcgotICAgIGRlZiBTaGFwZVNpZ25hdHVyZUFzTnVtcHkoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTgpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldFZlY3RvckFzTnVtcHkoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8pCi0gICAgICAgIHJldHVybiAwCitkZWYgTWV0YWRhdGFTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDIpCiAKLSAgICAjIFRlbnNvcgotICAgIGRlZiBTaGFwZVNpZ25hdHVyZUxlbmd0aChzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxOCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuVmVjdG9yTGVuKG8pCi0gICAgICAgIHJldHVybiAwCitkZWYgTWV0YWRhdGFBZGROYW1lKGJ1aWxkZXIsIG5hbWUpOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDAsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUobmFtZSksIDApCiAKLSAgICAjIFRlbnNvcgotICAgIGRlZiBTaGFwZVNpZ25hdHVyZUlzTm9uZShzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxOCkpCi0gICAgICAgIHJldHVybiBvID09IDAKK2RlZiBNZXRhZGF0YUFkZEJ1ZmZlcihidWlsZGVyLCBidWZmZXIpOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVpbnQzMlNsb3QoMSwgYnVmZmVyLCAwKQogCi0gICAgIyBUZW5zb3IKLSAgICBkZWYgSGFzUmFuayhzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgyMCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkJvb2xGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpKQotICAgICAgICByZXR1cm4gRmFsc2UKK2RlZiBNZXRhZGF0YUVuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQogCi0gICAgIyBUZW5zb3IKLSAgICBkZWYgVmFyaWFudFRlbnNvcnMoc2VsZiwgaik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMjIpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICB4ID0gc2VsZi5fdGFiLlZlY3RvcihvKQotICAgICAgICAgICAgeCArPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGopICogNAotICAgICAgICAgICAgeCA9IHNlbGYuX3RhYi5JbmRpcmVjdCh4KQotICAgICAgICAgICAgb2JqID0gVmFyaWFudFN1YlR5cGUoKQotICAgICAgICAgICAgb2JqLkluaXQoc2VsZi5fdGFiLkJ5dGVzLCB4KQotICAgICAgICAgICAgcmV0dXJuIG9iagotICAgICAgICByZXR1cm4gTm9uZQogCi0gICAgIyBUZW5zb3IKLSAgICBkZWYgVmFyaWFudFRlbnNvcnNMZW5ndGgoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMjIpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlZlY3RvckxlbihvKQotICAgICAgICByZXR1cm4gMAogCi0gICAgIyBUZW5zb3IKLSAgICBkZWYgVmFyaWFudFRlbnNvcnNJc05vbmUoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMjIpKQotICAgICAgICByZXR1cm4gbyA9PSAwCitjbGFzcyBNZXRhZGF0YVQob2JqZWN0KToKIAotZGVmIFRlbnNvclN0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDEwKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBUZW5zb3JTdGFydChidWlsZGVyKQotZGVmIFRlbnNvckFkZFNoYXBlKGJ1aWxkZXIsIHNoYXBlKTogYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMCwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzaGFwZSksIDApCi1kZWYgQWRkU2hhcGUoYnVpbGRlciwgc2hhcGUpOgotICAgIHJldHVybiBUZW5zb3JBZGRTaGFwZShidWlsZGVyLCBzaGFwZSkKLWRlZiBUZW5zb3JTdGFydFNoYXBlVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKTogcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpCi1kZWYgU3RhcnRTaGFwZVZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6Ci0gICAgcmV0dXJuIFRlbnNvclN0YXJ0U2hhcGVWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpCi1kZWYgVGVuc29yQWRkVHlwZShidWlsZGVyLCB0eXBlKTogYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoMSwgdHlwZSwgMCkKLWRlZiBBZGRUeXBlKGJ1aWxkZXIsIHR5cGUpOgotICAgIHJldHVybiBUZW5zb3JBZGRUeXBlKGJ1aWxkZXIsIHR5cGUpCi1kZWYgVGVuc29yQWRkQnVmZmVyKGJ1aWxkZXIsIGJ1ZmZlcik6IGJ1aWxkZXIuUHJlcGVuZFVpbnQzMlNsb3QoMiwgYnVmZmVyLCAwKQotZGVmIEFkZEJ1ZmZlcihidWlsZGVyLCBidWZmZXIpOgotICAgIHJldHVybiBUZW5zb3JBZGRCdWZmZXIoYnVpbGRlciwgYnVmZmVyKQotZGVmIFRlbnNvckFkZE5hbWUoYnVpbGRlciwgbmFtZSk6IGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDMsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUobmFtZSksIDApCi1kZWYgQWRkTmFtZShidWlsZGVyLCBuYW1lKToKLSAgICByZXR1cm4gVGVuc29yQWRkTmFtZShidWlsZGVyLCBuYW1lKQotZGVmIFRlbnNvckFkZFF1YW50aXphdGlvbihidWlsZGVyLCBxdWFudGl6YXRpb24pOiBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCg0LCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHF1YW50aXphdGlvbiksIDApCi1kZWYgQWRkUXVhbnRpemF0aW9uKGJ1aWxkZXIsIHF1YW50aXphdGlvbik6Ci0gICAgcmV0dXJuIFRlbnNvckFkZFF1YW50aXphdGlvbihidWlsZGVyLCBxdWFudGl6YXRpb24pCi1kZWYgVGVuc29yQWRkSXNWYXJpYWJsZShidWlsZGVyLCBpc1ZhcmlhYmxlKTogYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoNSwgaXNWYXJpYWJsZSwgMCkKLWRlZiBBZGRJc1ZhcmlhYmxlKGJ1aWxkZXIsIGlzVmFyaWFibGUpOgotICAgIHJldHVybiBUZW5zb3JBZGRJc1ZhcmlhYmxlKGJ1aWxkZXIsIGlzVmFyaWFibGUpCi1kZWYgVGVuc29yQWRkU3BhcnNpdHkoYnVpbGRlciwgc3BhcnNpdHkpOiBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCg2LCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNwYXJzaXR5KSwgMCkKLWRlZiBBZGRTcGFyc2l0eShidWlsZGVyLCBzcGFyc2l0eSk6Ci0gICAgcmV0dXJuIFRlbnNvckFkZFNwYXJzaXR5KGJ1aWxkZXIsIHNwYXJzaXR5KQotZGVmIFRlbnNvckFkZFNoYXBlU2lnbmF0dXJlKGJ1aWxkZXIsIHNoYXBlU2lnbmF0dXJlKTogYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoNywgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzaGFwZVNpZ25hdHVyZSksIDApCi1kZWYgQWRkU2hhcGVTaWduYXR1cmUoYnVpbGRlciwgc2hhcGVTaWduYXR1cmUpOgotICAgIHJldHVybiBUZW5zb3JBZGRTaGFwZVNpZ25hdHVyZShidWlsZGVyLCBzaGFwZVNpZ25hdHVyZSkKLWRlZiBUZW5zb3JTdGFydFNoYXBlU2lnbmF0dXJlVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKTogcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpCi1kZWYgU3RhcnRTaGFwZVNpZ25hdHVyZVZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6Ci0gICAgcmV0dXJuIFRlbnNvclN0YXJ0U2hhcGVTaWduYXR1cmVWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpCi1kZWYgVGVuc29yQWRkSGFzUmFuayhidWlsZGVyLCBoYXNSYW5rKTogYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoOCwgaGFzUmFuaywgMCkKLWRlZiBBZGRIYXNSYW5rKGJ1aWxkZXIsIGhhc1JhbmspOgotICAgIHJldHVybiBUZW5zb3JBZGRIYXNSYW5rKGJ1aWxkZXIsIGhhc1JhbmspCi1kZWYgVGVuc29yQWRkVmFyaWFudFRlbnNvcnMoYnVpbGRlciwgdmFyaWFudFRlbnNvcnMpOiBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCg5LCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHZhcmlhbnRUZW5zb3JzKSwgMCkKLWRlZiBBZGRWYXJpYW50VGVuc29ycyhidWlsZGVyLCB2YXJpYW50VGVuc29ycyk6Ci0gICAgcmV0dXJuIFRlbnNvckFkZFZhcmlhbnRUZW5zb3JzKGJ1aWxkZXIsIHZhcmlhbnRUZW5zb3JzKQotZGVmIFRlbnNvclN0YXJ0VmFyaWFudFRlbnNvcnNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOiByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCkKLWRlZiBTdGFydFZhcmlhbnRUZW5zb3JzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKLSAgICByZXR1cm4gVGVuc29yU3RhcnRWYXJpYW50VGVuc29yc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykKLWRlZiBUZW5zb3JFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBUZW5zb3JFbmQoYnVpbGRlcikKLXRyeToKLSAgICBmcm9tIHR5cGluZyBpbXBvcnQgTGlzdCwgT3B0aW9uYWwKLWV4Y2VwdDoKLSAgICBwYXNzCi0KLWNsYXNzIFRlbnNvclQob2JqZWN0KToKLQotICAgICMgVGVuc29yVAorICAgICMgTWV0YWRhdGFUCiAgICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBzZWxmLnNoYXBlID0gTm9uZSAgIyB0eXBlOiBMaXN0W2ludF0KLSAgICAgICAgc2VsZi50eXBlID0gMCAgIyB0eXBlOiBpbnQKLSAgICAgICAgc2VsZi5idWZmZXIgPSAwICAjIHR5cGU6IGludAogICAgICAgICBzZWxmLm5hbWUgPSBOb25lICAjIHR5cGU6IHN0cgotICAgICAgICBzZWxmLnF1YW50aXphdGlvbiA9IE5vbmUgICMgdHlwZTogT3B0aW9uYWxbUXVhbnRpemF0aW9uUGFyYW1ldGVyc1RdCi0gICAgICAgIHNlbGYuaXNWYXJpYWJsZSA9IEZhbHNlICAjIHR5cGU6IGJvb2wKLSAgICAgICAgc2VsZi5zcGFyc2l0eSA9IE5vbmUgICMgdHlwZTogT3B0aW9uYWxbU3BhcnNpdHlQYXJhbWV0ZXJzVF0KLSAgICAgICAgc2VsZi5zaGFwZVNpZ25hdHVyZSA9IE5vbmUgICMgdHlwZTogTGlzdFtpbnRdCi0gICAgICAgIHNlbGYuaGFzUmFuayA9IEZhbHNlICAjIHR5cGU6IGJvb2wKLSAgICAgICAgc2VsZi52YXJpYW50VGVuc29ycyA9IE5vbmUgICMgdHlwZTogTGlzdFtWYXJpYW50U3ViVHlwZVRdCisgICAgICAgIHNlbGYuYnVmZmVyID0gMCAgIyB0eXBlOiBpbnQKIAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgdGVuc29yID0gVGVuc29yKCkKLSAgICAgICAgdGVuc29yLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoodGVuc29yKQorICAgICAgICBtZXRhZGF0YSA9IE1ldGFkYXRhKCkKKyAgICAgICAgbWV0YWRhdGEuSW5pdChidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaihtZXRhZGF0YSkKIAogICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHRlbnNvcik6Ci0gICAgICAgIHggPSBUZW5zb3JUKCkKLSAgICAgICAgeC5fVW5QYWNrKHRlbnNvcikKKyAgICBkZWYgSW5pdEZyb21QYWNrZWRCdWYoY2xzLCBidWYsIHBvcz0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tQnVmKGJ1ZiwgcG9zK24pCisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21PYmooY2xzLCBtZXRhZGF0YSk6CisgICAgICAgIHggPSBNZXRhZGF0YVQoKQorICAgICAgICB4Ll9VblBhY2sobWV0YWRhdGEpCiAgICAgICAgIHJldHVybiB4CiAKLSAgICAjIFRlbnNvclQKLSAgICBkZWYgX1VuUGFjayhzZWxmLCB0ZW5zb3IpOgotICAgICAgICBpZiB0ZW5zb3IgaXMgTm9uZToKKyAgICAjIE1ldGFkYXRhVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIG1ldGFkYXRhKToKKyAgICAgICAgaWYgbWV0YWRhdGEgaXMgTm9uZToKICAgICAgICAgICAgIHJldHVybgotICAgICAgICBpZiBub3QgdGVuc29yLlNoYXBlSXNOb25lKCk6Ci0gICAgICAgICAgICBpZiBucCBpcyBOb25lOgotICAgICAgICAgICAgICAgIHNlbGYuc2hhcGUgPSBbXQotICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHRlbnNvci5TaGFwZUxlbmd0aCgpKToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5zaGFwZS5hcHBlbmQodGVuc29yLlNoYXBlKGkpKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLnNoYXBlID0gdGVuc29yLlNoYXBlQXNOdW1weSgpCi0gICAgICAgIHNlbGYudHlwZSA9IHRlbnNvci5UeXBlKCkKLSAgICAgICAgc2VsZi5idWZmZXIgPSB0ZW5zb3IuQnVmZmVyKCkKLSAgICAgICAgc2VsZi5uYW1lID0gdGVuc29yLk5hbWUoKQotICAgICAgICBpZiB0ZW5zb3IuUXVhbnRpemF0aW9uKCkgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBzZWxmLnF1YW50aXphdGlvbiA9IFF1YW50aXphdGlvblBhcmFtZXRlcnNULkluaXRGcm9tT2JqKHRlbnNvci5RdWFudGl6YXRpb24oKSkKLSAgICAgICAgc2VsZi5pc1ZhcmlhYmxlID0gdGVuc29yLklzVmFyaWFibGUoKQotICAgICAgICBpZiB0ZW5zb3IuU3BhcnNpdHkoKSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHNlbGYuc3BhcnNpdHkgPSBTcGFyc2l0eVBhcmFtZXRlcnNULkluaXRGcm9tT2JqKHRlbnNvci5TcGFyc2l0eSgpKQotICAgICAgICBpZiBub3QgdGVuc29yLlNoYXBlU2lnbmF0dXJlSXNOb25lKCk6Ci0gICAgICAgICAgICBpZiBucCBpcyBOb25lOgotICAgICAgICAgICAgICAgIHNlbGYuc2hhcGVTaWduYXR1cmUgPSBbXQotICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHRlbnNvci5TaGFwZVNpZ25hdHVyZUxlbmd0aCgpKToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5zaGFwZVNpZ25hdHVyZS5hcHBlbmQodGVuc29yLlNoYXBlU2lnbmF0dXJlKGkpKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLnNoYXBlU2lnbmF0dXJlID0gdGVuc29yLlNoYXBlU2lnbmF0dXJlQXNOdW1weSgpCi0gICAgICAgIHNlbGYuaGFzUmFuayA9IHRlbnNvci5IYXNSYW5rKCkKLSAgICAgICAgaWYgbm90IHRlbnNvci5WYXJpYW50VGVuc29yc0lzTm9uZSgpOgotICAgICAgICAgICAgc2VsZi52YXJpYW50VGVuc29ycyA9IFtdCi0gICAgICAgICAgICBmb3IgaSBpbiByYW5nZSh0ZW5zb3IuVmFyaWFudFRlbnNvcnNMZW5ndGgoKSk6Ci0gICAgICAgICAgICAgICAgaWYgdGVuc29yLlZhcmlhbnRUZW5zb3JzKGkpIGlzIE5vbmU6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYudmFyaWFudFRlbnNvcnMuYXBwZW5kKE5vbmUpCi0gICAgICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICAgICAgdmFyaWFudFN1YlR5cGVfID0gVmFyaWFudFN1YlR5cGVULkluaXRGcm9tT2JqKHRlbnNvci5WYXJpYW50VGVuc29ycyhpKSkKLSAgICAgICAgICAgICAgICAgICAgc2VsZi52YXJpYW50VGVuc29ycy5hcHBlbmQodmFyaWFudFN1YlR5cGVfKQorICAgICAgICBzZWxmLm5hbWUgPSBtZXRhZGF0YS5OYW1lKCkKKyAgICAgICAgc2VsZi5idWZmZXIgPSBtZXRhZGF0YS5CdWZmZXIoKQogCi0gICAgIyBUZW5zb3JUCisgICAgIyBNZXRhZGF0YVQKICAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgaWYgc2VsZi5zaGFwZSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIGlmIG5wIGlzIG5vdCBOb25lIGFuZCB0eXBlKHNlbGYuc2hhcGUpIGlzIG5wLm5kYXJyYXk6Ci0gICAgICAgICAgICAgICAgc2hhcGUgPSBidWlsZGVyLkNyZWF0ZU51bXB5VmVjdG9yKHNlbGYuc2hhcGUpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIFRlbnNvclN0YXJ0U2hhcGVWZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYuc2hhcGUpKQotICAgICAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLnNoYXBlKSkpOgotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLlByZXBlbmRJbnQzMihzZWxmLnNoYXBlW2ldKQotICAgICAgICAgICAgICAgIHNoYXBlID0gYnVpbGRlci5FbmRWZWN0b3IoKQogICAgICAgICBpZiBzZWxmLm5hbWUgaXMgbm90IE5vbmU6CiAgICAgICAgICAgICBuYW1lID0gYnVpbGRlci5DcmVhdGVTdHJpbmcoc2VsZi5uYW1lKQotICAgICAgICBpZiBzZWxmLnF1YW50aXphdGlvbiBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHF1YW50aXphdGlvbiA9IHNlbGYucXVhbnRpemF0aW9uLlBhY2soYnVpbGRlcikKLSAgICAgICAgaWYgc2VsZi5zcGFyc2l0eSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHNwYXJzaXR5ID0gc2VsZi5zcGFyc2l0eS5QYWNrKGJ1aWxkZXIpCi0gICAgICAgIGlmIHNlbGYuc2hhcGVTaWduYXR1cmUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBpZiBucCBpcyBub3QgTm9uZSBhbmQgdHlwZShzZWxmLnNoYXBlU2lnbmF0dXJlKSBpcyBucC5uZGFycmF5OgotICAgICAgICAgICAgICAgIHNoYXBlU2lnbmF0dXJlID0gYnVpbGRlci5DcmVhdGVOdW1weVZlY3RvcihzZWxmLnNoYXBlU2lnbmF0dXJlKQotICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBUZW5zb3JTdGFydFNoYXBlU2lnbmF0dXJlVmVjdG9yKGJ1aWxkZXIsIGxlbihzZWxmLnNoYXBlU2lnbmF0dXJlKSkKLSAgICAgICAgICAgICAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShsZW4oc2VsZi5zaGFwZVNpZ25hdHVyZSkpKToKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5QcmVwZW5kSW50MzIoc2VsZi5zaGFwZVNpZ25hdHVyZVtpXSkKLSAgICAgICAgICAgICAgICBzaGFwZVNpZ25hdHVyZSA9IGJ1aWxkZXIuRW5kVmVjdG9yKCkKLSAgICAgICAgaWYgc2VsZi52YXJpYW50VGVuc29ycyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIHZhcmlhbnRUZW5zb3JzbGlzdCA9IFtdCi0gICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi52YXJpYW50VGVuc29ycykpOgotICAgICAgICAgICAgICAgIHZhcmlhbnRUZW5zb3JzbGlzdC5hcHBlbmQoc2VsZi52YXJpYW50VGVuc29yc1tpXS5QYWNrKGJ1aWxkZXIpKQotICAgICAgICAgICAgVGVuc29yU3RhcnRWYXJpYW50VGVuc29yc1ZlY3RvcihidWlsZGVyLCBsZW4oc2VsZi52YXJpYW50VGVuc29ycykpCi0gICAgICAgICAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShsZW4oc2VsZi52YXJpYW50VGVuc29ycykpKToKLSAgICAgICAgICAgICAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlKHZhcmlhbnRUZW5zb3JzbGlzdFtpXSkKLSAgICAgICAgICAgIHZhcmlhbnRUZW5zb3JzID0gYnVpbGRlci5FbmRWZWN0b3IoKQotICAgICAgICBUZW5zb3JTdGFydChidWlsZGVyKQotICAgICAgICBpZiBzZWxmLnNoYXBlIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgVGVuc29yQWRkU2hhcGUoYnVpbGRlciwgc2hhcGUpCi0gICAgICAgIFRlbnNvckFkZFR5cGUoYnVpbGRlciwgc2VsZi50eXBlKQotICAgICAgICBUZW5zb3JBZGRCdWZmZXIoYnVpbGRlciwgc2VsZi5idWZmZXIpCisgICAgICAgIE1ldGFkYXRhU3RhcnQoYnVpbGRlcikKICAgICAgICAgaWYgc2VsZi5uYW1lIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgVGVuc29yQWRkTmFtZShidWlsZGVyLCBuYW1lKQotICAgICAgICBpZiBzZWxmLnF1YW50aXphdGlvbiBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIFRlbnNvckFkZFF1YW50aXphdGlvbihidWlsZGVyLCBxdWFudGl6YXRpb24pCi0gICAgICAgIFRlbnNvckFkZElzVmFyaWFibGUoYnVpbGRlciwgc2VsZi5pc1ZhcmlhYmxlKQotICAgICAgICBpZiBzZWxmLnNwYXJzaXR5IGlzIG5vdCBOb25lOgotICAgICAgICAgICAgVGVuc29yQWRkU3BhcnNpdHkoYnVpbGRlciwgc3BhcnNpdHkpCi0gICAgICAgIGlmIHNlbGYuc2hhcGVTaWduYXR1cmUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBUZW5zb3JBZGRTaGFwZVNpZ25hdHVyZShidWlsZGVyLCBzaGFwZVNpZ25hdHVyZSkKLSAgICAgICAgVGVuc29yQWRkSGFzUmFuayhidWlsZGVyLCBzZWxmLmhhc1JhbmspCi0gICAgICAgIGlmIHNlbGYudmFyaWFudFRlbnNvcnMgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBUZW5zb3JBZGRWYXJpYW50VGVuc29ycyhidWlsZGVyLCB2YXJpYW50VGVuc29ycykKLSAgICAgICAgdGVuc29yID0gVGVuc29yRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiB0ZW5zb3IKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5CisgICAgICAgICAgICBNZXRhZGF0YUFkZE5hbWUoYnVpbGRlciwgbmFtZSkKKyAgICAgICAgTWV0YWRhdGFBZGRCdWZmZXIoYnVpbGRlciwgc2VsZi5idWZmZXIpCisgICAgICAgIG1ldGFkYXRhID0gTWV0YWRhdGFFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIG1ldGFkYXRhCiAKLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQogCiBjbGFzcyBUZW5zb3JNYXAob2JqZWN0KToKICAgICBfX3Nsb3RzX18gPSBbJ190YWInXQpAQCAtMTI1MDYsMTggKzE3Njk1LDE5IEBACiAgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVWludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQogICAgICAgICByZXR1cm4gMAogCi1kZWYgVGVuc29yTWFwU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMikKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gVGVuc29yTWFwU3RhcnQoYnVpbGRlcikKLWRlZiBUZW5zb3JNYXBBZGROYW1lKGJ1aWxkZXIsIG5hbWUpOiBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgwLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKG5hbWUpLCAwKQotZGVmIEFkZE5hbWUoYnVpbGRlciwgbmFtZSk6Ci0gICAgcmV0dXJuIFRlbnNvck1hcEFkZE5hbWUoYnVpbGRlciwgbmFtZSkKLWRlZiBUZW5zb3JNYXBBZGRUZW5zb3JJbmRleChidWlsZGVyLCB0ZW5zb3JJbmRleCk6IGJ1aWxkZXIuUHJlcGVuZFVpbnQzMlNsb3QoMSwgdGVuc29ySW5kZXgsIDApCi1kZWYgQWRkVGVuc29ySW5kZXgoYnVpbGRlciwgdGVuc29ySW5kZXgpOgotICAgIHJldHVybiBUZW5zb3JNYXBBZGRUZW5zb3JJbmRleChidWlsZGVyLCB0ZW5zb3JJbmRleCkKLWRlZiBUZW5zb3JNYXBFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBUZW5zb3JNYXBFbmQoYnVpbGRlcikKK2RlZiBUZW5zb3JNYXBTdGFydChidWlsZGVyKToKKyAgICBidWlsZGVyLlN0YXJ0T2JqZWN0KDIpCisKK2RlZiBUZW5zb3JNYXBBZGROYW1lKGJ1aWxkZXIsIG5hbWUpOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDAsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUobmFtZSksIDApCisKK2RlZiBUZW5zb3JNYXBBZGRUZW5zb3JJbmRleChidWlsZGVyLCB0ZW5zb3JJbmRleCk6CisgICAgYnVpbGRlci5QcmVwZW5kVWludDMyU2xvdCgxLCB0ZW5zb3JJbmRleCwgMCkKKworZGVmIFRlbnNvck1hcEVuZChidWlsZGVyKToKKyAgICByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQorCisKIAogY2xhc3MgVGVuc29yTWFwVChvYmplY3QpOgogCkBAIC0xMjUzMyw2ICsxNzcyMywxMSBAQAogICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHRlbnNvck1hcCkKIAogICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHRlbnNvck1hcCk6CiAgICAgICAgIHggPSBUZW5zb3JNYXBUKCkKICAgICAgICAgeC5fVW5QYWNrKHRlbnNvck1hcCkKQEAgLTEyNTU1LDE1ODcgKzE3NzUwLDU5MyBAQAogICAgICAgICBUZW5zb3JNYXBBZGRUZW5zb3JJbmRleChidWlsZGVyLCBzZWxmLnRlbnNvckluZGV4KQogICAgICAgICB0ZW5zb3JNYXAgPSBUZW5zb3JNYXBFbmQoYnVpbGRlcikKICAgICAgICAgcmV0dXJuIHRlbnNvck1hcAotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKIAotIyBuYW1lc3BhY2U6IHRmbGl0ZQogCi1jbGFzcyBUZW5zb3JUeXBlKG9iamVjdCk6Ci0gICAgRkxPQVQzMiA9IDAKLSAgICBGTE9BVDE2ID0gMQotICAgIElOVDMyID0gMgotICAgIFVJTlQ4ID0gMwotICAgIElOVDY0ID0gNAotICAgIFNUUklORyA9IDUKLSAgICBCT09MID0gNgotICAgIElOVDE2ID0gNwotICAgIENPTVBMRVg2NCA9IDgKLSAgICBJTlQ4ID0gOQotICAgIEZMT0FUNjQgPSAxMAotICAgIENPTVBMRVgxMjggPSAxMQotICAgIFVJTlQ2NCA9IDEyCi0gICAgUkVTT1VSQ0UgPSAxMwotICAgIFZBUklBTlQgPSAxNAotICAgIFVJTlQzMiA9IDE1Ci0gICAgVUlOVDE2ID0gMTYKLSAgICBJTlQ0ID0gMTcKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBUaWxlT3B0aW9ucyhvYmplY3QpOgorY2xhc3MgU2lnbmF0dXJlRGVmKG9iamVjdCk6CiAgICAgX19zbG90c19fID0gWydfdGFiJ10KIAogICAgIEBjbGFzc21ldGhvZAogICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKICAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gVGlsZU9wdGlvbnMoKQorICAgICAgICB4ID0gU2lnbmF0dXJlRGVmKCkKICAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKICAgICAgICAgcmV0dXJuIHgKIAogICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNUaWxlT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgorICAgIGRlZiBHZXRSb290QXNTaWduYXR1cmVEZWYoY2xzLCBidWYsIG9mZnNldD0wKToKICAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCiAgICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQogICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBUaWxlT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CisgICAgZGVmIFNpZ25hdHVyZURlZkJ1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6CiAgICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKIAotICAgICMgVGlsZU9wdGlvbnMKKyAgICAjIFNpZ25hdHVyZURlZgogICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKICAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCiAKLWRlZiBUaWxlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFRpbGVPcHRpb25zU3RhcnQoYnVpbGRlcikKLWRlZiBUaWxlT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFRpbGVPcHRpb25zRW5kKGJ1aWxkZXIpCi0KLWNsYXNzIFRpbGVPcHRpb25zVChvYmplY3QpOgotCi0gICAgIyBUaWxlT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgdGlsZU9wdGlvbnMgPSBUaWxlT3B0aW9ucygpCi0gICAgICAgIHRpbGVPcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoodGlsZU9wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCB0aWxlT3B0aW9ucyk6Ci0gICAgICAgIHggPSBUaWxlT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2sodGlsZU9wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIFRpbGVPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIHRpbGVPcHRpb25zKToKLSAgICAgICAgaWYgdGlsZU9wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgIyBUaWxlT3B0aW9uc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgVGlsZU9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICB0aWxlT3B0aW9ucyA9IFRpbGVPcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiB0aWxlT3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIFRvcEtWMk9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBUb3BLVjJPcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNUb3BLVjJPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgVG9wS1YyT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgVG9wS1YyT3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLWRlZiBUb3BLVjJPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gVG9wS1YyT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgVG9wS1YyT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFRvcEtWMk9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgVG9wS1YyT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgVG9wS1YyT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgdG9wS3Yyb3B0aW9ucyA9IFRvcEtWMk9wdGlvbnMoKQotICAgICAgICB0b3BLdjJvcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoodG9wS3Yyb3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHRvcEt2Mm9wdGlvbnMpOgotICAgICAgICB4ID0gVG9wS1YyT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2sodG9wS3Yyb3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgVG9wS1YyT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCB0b3BLdjJvcHRpb25zKToKLSAgICAgICAgaWYgdG9wS3Yyb3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAjIFRvcEtWMk9wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIFRvcEtWMk9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICB0b3BLdjJvcHRpb25zID0gVG9wS1YyT3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gdG9wS3Yyb3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIFRyYW5zcG9zZUNvbnZPcHRpb25zKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gVHJhbnNwb3NlQ29udk9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc1RyYW5zcG9zZUNvbnZPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgVHJhbnNwb3NlQ29udk9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIFRyYW5zcG9zZUNvbnZPcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotICAgICMgVHJhbnNwb3NlQ29udk9wdGlvbnMKLSAgICBkZWYgUGFkZGluZyhzZWxmKToKKyAgICAjIFNpZ25hdHVyZURlZgorICAgIGRlZiBJbnB1dHMoc2VsZiwgaik6CiAgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCiAgICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gMAorICAgICAgICAgICAgeCA9IHNlbGYuX3RhYi5WZWN0b3IobykKKyAgICAgICAgICAgIHggKz0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShqKSAqIDQKKyAgICAgICAgICAgIHggPSBzZWxmLl90YWIuSW5kaXJlY3QoeCkKKyAgICAgICAgICAgIG9iaiA9IFRlbnNvck1hcCgpCisgICAgICAgICAgICBvYmouSW5pdChzZWxmLl90YWIuQnl0ZXMsIHgpCisgICAgICAgICAgICByZXR1cm4gb2JqCisgICAgICAgIHJldHVybiBOb25lCiAKLSAgICAjIFRyYW5zcG9zZUNvbnZPcHRpb25zCi0gICAgZGVmIFN0cmlkZVcoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgVHJhbnNwb3NlQ29udk9wdGlvbnMKLSAgICBkZWYgU3RyaWRlSChzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg4KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBUcmFuc3Bvc2VDb252T3B0aW9ucwotICAgIGRlZiBGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQ4RmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKQotICAgICAgICByZXR1cm4gMAotCi1kZWYgVHJhbnNwb3NlQ29udk9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCg0KQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBUcmFuc3Bvc2VDb252T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgVHJhbnNwb3NlQ29udk9wdGlvbnNBZGRQYWRkaW5nKGJ1aWxkZXIsIHBhZGRpbmcpOiBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCgwLCBwYWRkaW5nLCAwKQotZGVmIEFkZFBhZGRpbmcoYnVpbGRlciwgcGFkZGluZyk6Ci0gICAgcmV0dXJuIFRyYW5zcG9zZUNvbnZPcHRpb25zQWRkUGFkZGluZyhidWlsZGVyLCBwYWRkaW5nKQotZGVmIFRyYW5zcG9zZUNvbnZPcHRpb25zQWRkU3RyaWRlVyhidWlsZGVyLCBzdHJpZGVXKTogYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDEsIHN0cmlkZVcsIDApCi1kZWYgQWRkU3RyaWRlVyhidWlsZGVyLCBzdHJpZGVXKToKLSAgICByZXR1cm4gVHJhbnNwb3NlQ29udk9wdGlvbnNBZGRTdHJpZGVXKGJ1aWxkZXIsIHN0cmlkZVcpCi1kZWYgVHJhbnNwb3NlQ29udk9wdGlvbnNBZGRTdHJpZGVIKGJ1aWxkZXIsIHN0cmlkZUgpOiBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMiwgc3RyaWRlSCwgMCkKLWRlZiBBZGRTdHJpZGVIKGJ1aWxkZXIsIHN0cmlkZUgpOgotICAgIHJldHVybiBUcmFuc3Bvc2VDb252T3B0aW9uc0FkZFN0cmlkZUgoYnVpbGRlciwgc3RyaWRlSCkKLWRlZiBUcmFuc3Bvc2VDb252T3B0aW9uc0FkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKTogYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoMywgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24sIDApCi1kZWYgQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pOgotICAgIHJldHVybiBUcmFuc3Bvc2VDb252T3B0aW9uc0FkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKQotZGVmIFRyYW5zcG9zZUNvbnZPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gVHJhbnNwb3NlQ29udk9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgVHJhbnNwb3NlQ29udk9wdGlvbnNUKG9iamVjdCk6Ci0KLSAgICAjIFRyYW5zcG9zZUNvbnZPcHRpb25zVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi5wYWRkaW5nID0gMCAgIyB0eXBlOiBpbnQKLSAgICAgICAgc2VsZi5zdHJpZGVXID0gMCAgIyB0eXBlOiBpbnQKLSAgICAgICAgc2VsZi5zdHJpZGVIID0gMCAgIyB0eXBlOiBpbnQKLSAgICAgICAgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbiA9IDAgICMgdHlwZTogaW50Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIHRyYW5zcG9zZUNvbnZPcHRpb25zID0gVHJhbnNwb3NlQ29udk9wdGlvbnMoKQotICAgICAgICB0cmFuc3Bvc2VDb252T3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHRyYW5zcG9zZUNvbnZPcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgdHJhbnNwb3NlQ29udk9wdGlvbnMpOgotICAgICAgICB4ID0gVHJhbnNwb3NlQ29udk9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKHRyYW5zcG9zZUNvbnZPcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBUcmFuc3Bvc2VDb252T3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCB0cmFuc3Bvc2VDb252T3B0aW9ucyk6Ci0gICAgICAgIGlmIHRyYW5zcG9zZUNvbnZPcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi5wYWRkaW5nID0gdHJhbnNwb3NlQ29udk9wdGlvbnMuUGFkZGluZygpCi0gICAgICAgIHNlbGYuc3RyaWRlVyA9IHRyYW5zcG9zZUNvbnZPcHRpb25zLlN0cmlkZVcoKQotICAgICAgICBzZWxmLnN0cmlkZUggPSB0cmFuc3Bvc2VDb252T3B0aW9ucy5TdHJpZGVIKCkKLSAgICAgICAgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbiA9IHRyYW5zcG9zZUNvbnZPcHRpb25zLkZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKCkKLQotICAgICMgVHJhbnNwb3NlQ29udk9wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIFRyYW5zcG9zZUNvbnZPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgVHJhbnNwb3NlQ29udk9wdGlvbnNBZGRQYWRkaW5nKGJ1aWxkZXIsIHNlbGYucGFkZGluZykKLSAgICAgICAgVHJhbnNwb3NlQ29udk9wdGlvbnNBZGRTdHJpZGVXKGJ1aWxkZXIsIHNlbGYuc3RyaWRlVykKLSAgICAgICAgVHJhbnNwb3NlQ29udk9wdGlvbnNBZGRTdHJpZGVIKGJ1aWxkZXIsIHNlbGYuc3RyaWRlSCkKLSAgICAgICAgVHJhbnNwb3NlQ29udk9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBzZWxmLmZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKQotICAgICAgICB0cmFuc3Bvc2VDb252T3B0aW9ucyA9IFRyYW5zcG9zZUNvbnZPcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiB0cmFuc3Bvc2VDb252T3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIFRyYW5zcG9zZU9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBUcmFuc3Bvc2VPcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNUcmFuc3Bvc2VPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgVHJhbnNwb3NlT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgVHJhbnNwb3NlT3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLWRlZiBUcmFuc3Bvc2VPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gVHJhbnNwb3NlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgVHJhbnNwb3NlT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFRyYW5zcG9zZU9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgVHJhbnNwb3NlT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgVHJhbnNwb3NlT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgdHJhbnNwb3NlT3B0aW9ucyA9IFRyYW5zcG9zZU9wdGlvbnMoKQotICAgICAgICB0cmFuc3Bvc2VPcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoodHJhbnNwb3NlT3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHRyYW5zcG9zZU9wdGlvbnMpOgotICAgICAgICB4ID0gVHJhbnNwb3NlT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2sodHJhbnNwb3NlT3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgVHJhbnNwb3NlT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCB0cmFuc3Bvc2VPcHRpb25zKToKLSAgICAgICAgaWYgdHJhbnNwb3NlT3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAjIFRyYW5zcG9zZU9wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIFRyYW5zcG9zZU9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICB0cmFuc3Bvc2VPcHRpb25zID0gVHJhbnNwb3NlT3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gdHJhbnNwb3NlT3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIFVpbnQxNlZlY3RvcihvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IFVpbnQxNlZlY3RvcigpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzVWludDE2VmVjdG9yKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgVWludDE2VmVjdG9yQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBVaW50MTZWZWN0b3IKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi0gICAgIyBVaW50MTZWZWN0b3IKLSAgICBkZWYgVmFsdWVzKHNlbGYsIGopOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICBhID0gc2VsZi5fdGFiLlZlY3RvcihvKQotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVpbnQxNkZsYWdzLCBhICsgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShqICogMikpCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIFVpbnQxNlZlY3RvcgotICAgIGRlZiBWYWx1ZXNBc051bXB5KHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldFZlY3RvckFzTnVtcHkoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVpbnQxNkZsYWdzLCBvKQotICAgICAgICByZXR1cm4gMAotCi0gICAgIyBVaW50MTZWZWN0b3IKLSAgICBkZWYgVmFsdWVzTGVuZ3RoKHNlbGYpOgorICAgICMgU2lnbmF0dXJlRGVmCisgICAgZGVmIElucHV0c0xlbmd0aChzZWxmKToKICAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKICAgICAgICAgaWYgbyAhPSAwOgogICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKICAgICAgICAgcmV0dXJuIDAKIAotICAgICMgVWludDE2VmVjdG9yCi0gICAgZGVmIFZhbHVlc0lzTm9uZShzZWxmKToKKyAgICAjIFNpZ25hdHVyZURlZgorICAgIGRlZiBJbnB1dHNJc05vbmUoc2VsZik6CiAgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCiAgICAgICAgIHJldHVybiBvID09IDAKIAotZGVmIFVpbnQxNlZlY3RvclN0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDEpCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFVpbnQxNlZlY3RvclN0YXJ0KGJ1aWxkZXIpCi1kZWYgVWludDE2VmVjdG9yQWRkVmFsdWVzKGJ1aWxkZXIsIHZhbHVlcyk6IGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDAsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUodmFsdWVzKSwgMCkKLWRlZiBBZGRWYWx1ZXMoYnVpbGRlciwgdmFsdWVzKToKLSAgICByZXR1cm4gVWludDE2VmVjdG9yQWRkVmFsdWVzKGJ1aWxkZXIsIHZhbHVlcykKLWRlZiBVaW50MTZWZWN0b3JTdGFydFZhbHVlc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6IHJldHVybiBidWlsZGVyLlN0YXJ0VmVjdG9yKDIsIG51bUVsZW1zLCAyKQotZGVmIFN0YXJ0VmFsdWVzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKLSAgICByZXR1cm4gVWludDE2VmVjdG9yU3RhcnRWYWx1ZXNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpCi1kZWYgVWludDE2VmVjdG9yRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gVWludDE2VmVjdG9yRW5kKGJ1aWxkZXIpCi10cnk6Ci0gICAgZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QKLWV4Y2VwdDoKLSAgICBwYXNzCi0KLWNsYXNzIFVpbnQxNlZlY3RvclQob2JqZWN0KToKLQotICAgICMgVWludDE2VmVjdG9yVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi52YWx1ZXMgPSBOb25lICAjIHR5cGU6IExpc3RbaW50XQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICB1aW50MTZ2ZWN0b3IgPSBVaW50MTZWZWN0b3IoKQotICAgICAgICB1aW50MTZ2ZWN0b3IuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaih1aW50MTZ2ZWN0b3IpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCB1aW50MTZ2ZWN0b3IpOgotICAgICAgICB4ID0gVWludDE2VmVjdG9yVCgpCi0gICAgICAgIHguX1VuUGFjayh1aW50MTZ2ZWN0b3IpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIFVpbnQxNlZlY3RvclQKLSAgICBkZWYgX1VuUGFjayhzZWxmLCB1aW50MTZ2ZWN0b3IpOgotICAgICAgICBpZiB1aW50MTZ2ZWN0b3IgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBpZiBub3QgdWludDE2dmVjdG9yLlZhbHVlc0lzTm9uZSgpOgotICAgICAgICAgICAgaWYgbnAgaXMgTm9uZToKLSAgICAgICAgICAgICAgICBzZWxmLnZhbHVlcyA9IFtdCi0gICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UodWludDE2dmVjdG9yLlZhbHVlc0xlbmd0aCgpKToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi52YWx1ZXMuYXBwZW5kKHVpbnQxNnZlY3Rvci5WYWx1ZXMoaSkpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlbGYudmFsdWVzID0gdWludDE2dmVjdG9yLlZhbHVlc0FzTnVtcHkoKQotCi0gICAgIyBVaW50MTZWZWN0b3JUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIGlmIHNlbGYudmFsdWVzIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgaWYgbnAgaXMgbm90IE5vbmUgYW5kIHR5cGUoc2VsZi52YWx1ZXMpIGlzIG5wLm5kYXJyYXk6Ci0gICAgICAgICAgICAgICAgdmFsdWVzID0gYnVpbGRlci5DcmVhdGVOdW1weVZlY3RvcihzZWxmLnZhbHVlcykKLSAgICAgICAgICAgIGVsc2U6Ci0gICAgICAgICAgICAgICAgVWludDE2VmVjdG9yU3RhcnRWYWx1ZXNWZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYudmFsdWVzKSkKLSAgICAgICAgICAgICAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShsZW4oc2VsZi52YWx1ZXMpKSk6Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZFVpbnQxNihzZWxmLnZhbHVlc1tpXSkKLSAgICAgICAgICAgICAgICB2YWx1ZXMgPSBidWlsZGVyLkVuZFZlY3RvcigpCi0gICAgICAgIFVpbnQxNlZlY3RvclN0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIGlmIHNlbGYudmFsdWVzIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgVWludDE2VmVjdG9yQWRkVmFsdWVzKGJ1aWxkZXIsIHZhbHVlcykKLSAgICAgICAgdWludDE2dmVjdG9yID0gVWludDE2VmVjdG9yRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiB1aW50MTZ2ZWN0b3IKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBVaW50OFZlY3RvcihvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IFVpbnQ4VmVjdG9yKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNVaW50OFZlY3RvcihjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIFVpbnQ4VmVjdG9yQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBVaW50OFZlY3RvcgotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLSAgICAjIFVpbnQ4VmVjdG9yCi0gICAgZGVmIFZhbHVlcyhzZWxmLCBqKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAjIFNpZ25hdHVyZURlZgorICAgIGRlZiBPdXRwdXRzKHNlbGYsIGopOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQogICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICBhID0gc2VsZi5fdGFiLlZlY3RvcihvKQotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVpbnQ4RmxhZ3MsIGEgKyBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGogKiAxKSkKLSAgICAgICAgcmV0dXJuIDAKKyAgICAgICAgICAgIHggPSBzZWxmLl90YWIuVmVjdG9yKG8pCisgICAgICAgICAgICB4ICs9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaikgKiA0CisgICAgICAgICAgICB4ID0gc2VsZi5fdGFiLkluZGlyZWN0KHgpCisgICAgICAgICAgICBvYmogPSBUZW5zb3JNYXAoKQorICAgICAgICAgICAgb2JqLkluaXQoc2VsZi5fdGFiLkJ5dGVzLCB4KQorICAgICAgICAgICAgcmV0dXJuIG9iagorICAgICAgICByZXR1cm4gTm9uZQogCi0gICAgIyBVaW50OFZlY3RvcgotICAgIGRlZiBWYWx1ZXNBc051bXB5KHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldFZlY3RvckFzTnVtcHkoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVpbnQ4RmxhZ3MsIG8pCi0gICAgICAgIHJldHVybiAwCi0KLSAgICAjIFVpbnQ4VmVjdG9yCi0gICAgZGVmIFZhbHVlc0xlbmd0aChzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAjIFNpZ25hdHVyZURlZgorICAgIGRlZiBPdXRwdXRzTGVuZ3RoKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQogICAgICAgICBpZiBvICE9IDA6CiAgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlZlY3RvckxlbihvKQogICAgICAgICByZXR1cm4gMAogCi0gICAgIyBVaW50OFZlY3RvcgotICAgIGRlZiBWYWx1ZXNJc05vbmUoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgIyBTaWduYXR1cmVEZWYKKyAgICBkZWYgT3V0cHV0c0lzTm9uZShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKICAgICAgICAgcmV0dXJuIG8gPT0gMAogCi1kZWYgVWludDhWZWN0b3JTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgxKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBVaW50OFZlY3RvclN0YXJ0KGJ1aWxkZXIpCi1kZWYgVWludDhWZWN0b3JBZGRWYWx1ZXMoYnVpbGRlciwgdmFsdWVzKTogYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMCwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZSh2YWx1ZXMpLCAwKQotZGVmIEFkZFZhbHVlcyhidWlsZGVyLCB2YWx1ZXMpOgotICAgIHJldHVybiBVaW50OFZlY3RvckFkZFZhbHVlcyhidWlsZGVyLCB2YWx1ZXMpCi1kZWYgVWludDhWZWN0b3JTdGFydFZhbHVlc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6IHJldHVybiBidWlsZGVyLlN0YXJ0VmVjdG9yKDEsIG51bUVsZW1zLCAxKQotZGVmIFN0YXJ0VmFsdWVzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKLSAgICByZXR1cm4gVWludDhWZWN0b3JTdGFydFZhbHVlc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcykKLWRlZiBVaW50OFZlY3RvckVuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFVpbnQ4VmVjdG9yRW5kKGJ1aWxkZXIpCi10cnk6Ci0gICAgZnJvbSB0eXBpbmcgaW1wb3J0IExpc3QKLWV4Y2VwdDoKLSAgICBwYXNzCi0KLWNsYXNzIFVpbnQ4VmVjdG9yVChvYmplY3QpOgotCi0gICAgIyBVaW50OFZlY3RvclQKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYudmFsdWVzID0gTm9uZSAgIyB0eXBlOiBMaXN0W2ludF0KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgdWludDh2ZWN0b3IgPSBVaW50OFZlY3RvcigpCi0gICAgICAgIHVpbnQ4dmVjdG9yLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoodWludDh2ZWN0b3IpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCB1aW50OHZlY3Rvcik6Ci0gICAgICAgIHggPSBVaW50OFZlY3RvclQoKQotICAgICAgICB4Ll9VblBhY2sodWludDh2ZWN0b3IpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIFVpbnQ4VmVjdG9yVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIHVpbnQ4dmVjdG9yKToKLSAgICAgICAgaWYgdWludDh2ZWN0b3IgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotICAgICAgICBpZiBub3QgdWludDh2ZWN0b3IuVmFsdWVzSXNOb25lKCk6Ci0gICAgICAgICAgICBpZiBucCBpcyBOb25lOgotICAgICAgICAgICAgICAgIHNlbGYudmFsdWVzID0gW10KLSAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSh1aW50OHZlY3Rvci5WYWx1ZXNMZW5ndGgoKSk6Ci0gICAgICAgICAgICAgICAgICAgIHNlbGYudmFsdWVzLmFwcGVuZCh1aW50OHZlY3Rvci5WYWx1ZXMoaSkpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIHNlbGYudmFsdWVzID0gdWludDh2ZWN0b3IuVmFsdWVzQXNOdW1weSgpCi0KLSAgICAjIFVpbnQ4VmVjdG9yVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBpZiBzZWxmLnZhbHVlcyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIGlmIG5wIGlzIG5vdCBOb25lIGFuZCB0eXBlKHNlbGYudmFsdWVzKSBpcyBucC5uZGFycmF5OgotICAgICAgICAgICAgICAgIHZhbHVlcyA9IGJ1aWxkZXIuQ3JlYXRlTnVtcHlWZWN0b3Ioc2VsZi52YWx1ZXMpCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIFVpbnQ4VmVjdG9yU3RhcnRWYWx1ZXNWZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYudmFsdWVzKSkKLSAgICAgICAgICAgICAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShsZW4oc2VsZi52YWx1ZXMpKSk6Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZFVpbnQ4KHNlbGYudmFsdWVzW2ldKQotICAgICAgICAgICAgICAgIHZhbHVlcyA9IGJ1aWxkZXIuRW5kVmVjdG9yKCkKLSAgICAgICAgVWludDhWZWN0b3JTdGFydChidWlsZGVyKQotICAgICAgICBpZiBzZWxmLnZhbHVlcyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIFVpbnQ4VmVjdG9yQWRkVmFsdWVzKGJ1aWxkZXIsIHZhbHVlcykKLSAgICAgICAgdWludDh2ZWN0b3IgPSBVaW50OFZlY3RvckVuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gdWludDh2ZWN0b3IKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc1VuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotICAgICMgVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zCi0gICAgZGVmIEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50OEZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zCi0gICAgZGVmIENlbGxDbGlwKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuRmxvYXQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAuMAotCi0gICAgIyBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnMKLSAgICBkZWYgUHJvakNsaXAoc2VsZik6CisgICAgIyBTaWduYXR1cmVEZWYKKyAgICBkZWYgU2lnbmF0dXJlS2V5KHNlbGYpOgogICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQogICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuRmxvYXQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAuMAorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5TdHJpbmcobyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiBOb25lCiAKLSAgICAjIFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9ucwotICAgIGRlZiBUaW1lTWFqb3Ioc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTApKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gYm9vbChzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5Cb29sRmxhZ3MsIG8gKyBzZWxmLl90YWIuUG9zKSkKLSAgICAgICAgcmV0dXJuIEZhbHNlCi0KLSAgICAjIFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9ucwotICAgIGRlZiBBc3ltbWV0cmljUXVhbnRpemVJbnB1dHMoc2VsZik6CisgICAgIyBTaWduYXR1cmVEZWYKKyAgICBkZWYgU3ViZ3JhcGhJbmRleChzZWxmKToKICAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMikpCiAgICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkJvb2xGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpKQotICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VaW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgIHJldHVybiAwCiAKLSAgICAjIFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9ucwotICAgIGRlZiBEaWFnb25hbFJlY3VycmVudFRlbnNvcnMoc2VsZik6CitkZWYgU2lnbmF0dXJlRGVmU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCg1KQorCitkZWYgU2lnbmF0dXJlRGVmQWRkSW5wdXRzKGJ1aWxkZXIsIGlucHV0cyk6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoMCwgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShpbnB1dHMpLCAwKQorCitkZWYgU2lnbmF0dXJlRGVmU3RhcnRJbnB1dHNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgorICAgIHJldHVybiBidWlsZGVyLlN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KQorCitkZWYgU2lnbmF0dXJlRGVmQWRkT3V0cHV0cyhidWlsZGVyLCBvdXRwdXRzKToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgxLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKG91dHB1dHMpLCAwKQorCitkZWYgU2lnbmF0dXJlRGVmU3RhcnRPdXRwdXRzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKKyAgICByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCkKKworZGVmIFNpZ25hdHVyZURlZkFkZFNpZ25hdHVyZUtleShidWlsZGVyLCBzaWduYXR1cmVLZXkpOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDIsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2lnbmF0dXJlS2V5KSwgMCkKKworZGVmIFNpZ25hdHVyZURlZkFkZFN1YmdyYXBoSW5kZXgoYnVpbGRlciwgc3ViZ3JhcGhJbmRleCk6CisgICAgYnVpbGRlci5QcmVwZW5kVWludDMyU2xvdCg0LCBzdWJncmFwaEluZGV4LCAwKQorCitkZWYgU2lnbmF0dXJlRGVmRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKwordHJ5OgorICAgIGZyb20gdHlwaW5nIGltcG9ydCBMaXN0CitleGNlcHQ6CisgICAgcGFzcworCitjbGFzcyBTaWduYXR1cmVEZWZUKG9iamVjdCk6CisKKyAgICAjIFNpZ25hdHVyZURlZlQKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYuaW5wdXRzID0gTm9uZSAgIyB0eXBlOiBMaXN0W1RlbnNvck1hcFRdCisgICAgICAgIHNlbGYub3V0cHV0cyA9IE5vbmUgICMgdHlwZTogTGlzdFtUZW5zb3JNYXBUXQorICAgICAgICBzZWxmLnNpZ25hdHVyZUtleSA9IE5vbmUgICMgdHlwZTogc3RyCisgICAgICAgIHNlbGYuc3ViZ3JhcGhJbmRleCA9IDAgICMgdHlwZTogaW50CisKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6CisgICAgICAgIHNpZ25hdHVyZURlZiA9IFNpZ25hdHVyZURlZigpCisgICAgICAgIHNpZ25hdHVyZURlZi5Jbml0KGJ1ZiwgcG9zKQorICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHNpZ25hdHVyZURlZikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbVBhY2tlZEJ1ZihjbHMsIGJ1ZiwgcG9zPTApOgorICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21CdWYoYnVmLCBwb3MrbikKKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHNpZ25hdHVyZURlZik6CisgICAgICAgIHggPSBTaWduYXR1cmVEZWZUKCkKKyAgICAgICAgeC5fVW5QYWNrKHNpZ25hdHVyZURlZikKKyAgICAgICAgcmV0dXJuIHgKKworICAgICMgU2lnbmF0dXJlRGVmVAorICAgIGRlZiBfVW5QYWNrKHNlbGYsIHNpZ25hdHVyZURlZik6CisgICAgICAgIGlmIHNpZ25hdHVyZURlZiBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG5vdCBzaWduYXR1cmVEZWYuSW5wdXRzSXNOb25lKCk6CisgICAgICAgICAgICBzZWxmLmlucHV0cyA9IFtdCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShzaWduYXR1cmVEZWYuSW5wdXRzTGVuZ3RoKCkpOgorICAgICAgICAgICAgICAgIGlmIHNpZ25hdHVyZURlZi5JbnB1dHMoaSkgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnB1dHMuYXBwZW5kKE5vbmUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgdGVuc29yTWFwXyA9IFRlbnNvck1hcFQuSW5pdEZyb21PYmooc2lnbmF0dXJlRGVmLklucHV0cyhpKSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5pbnB1dHMuYXBwZW5kKHRlbnNvck1hcF8pCisgICAgICAgIGlmIG5vdCBzaWduYXR1cmVEZWYuT3V0cHV0c0lzTm9uZSgpOgorICAgICAgICAgICAgc2VsZi5vdXRwdXRzID0gW10KKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHNpZ25hdHVyZURlZi5PdXRwdXRzTGVuZ3RoKCkpOgorICAgICAgICAgICAgICAgIGlmIHNpZ25hdHVyZURlZi5PdXRwdXRzKGkpIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYub3V0cHV0cy5hcHBlbmQoTm9uZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICB0ZW5zb3JNYXBfID0gVGVuc29yTWFwVC5Jbml0RnJvbU9iaihzaWduYXR1cmVEZWYuT3V0cHV0cyhpKSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5vdXRwdXRzLmFwcGVuZCh0ZW5zb3JNYXBfKQorICAgICAgICBzZWxmLnNpZ25hdHVyZUtleSA9IHNpZ25hdHVyZURlZi5TaWduYXR1cmVLZXkoKQorICAgICAgICBzZWxmLnN1YmdyYXBoSW5kZXggPSBzaWduYXR1cmVEZWYuU3ViZ3JhcGhJbmRleCgpCisKKyAgICAjIFNpZ25hdHVyZURlZlQKKyAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKKyAgICAgICAgaWYgc2VsZi5pbnB1dHMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpbnB1dHNsaXN0ID0gW10KKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLmlucHV0cykpOgorICAgICAgICAgICAgICAgIGlucHV0c2xpc3QuYXBwZW5kKHNlbGYuaW5wdXRzW2ldLlBhY2soYnVpbGRlcikpCisgICAgICAgICAgICBTaWduYXR1cmVEZWZTdGFydElucHV0c1ZlY3RvcihidWlsZGVyLCBsZW4oc2VsZi5pbnB1dHMpKQorICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYuaW5wdXRzKSkpOgorICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmUoaW5wdXRzbGlzdFtpXSkKKyAgICAgICAgICAgIGlucHV0cyA9IGJ1aWxkZXIuRW5kVmVjdG9yKCkKKyAgICAgICAgaWYgc2VsZi5vdXRwdXRzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgb3V0cHV0c2xpc3QgPSBbXQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYub3V0cHV0cykpOgorICAgICAgICAgICAgICAgIG91dHB1dHNsaXN0LmFwcGVuZChzZWxmLm91dHB1dHNbaV0uUGFjayhidWlsZGVyKSkKKyAgICAgICAgICAgIFNpZ25hdHVyZURlZlN0YXJ0T3V0cHV0c1ZlY3RvcihidWlsZGVyLCBsZW4oc2VsZi5vdXRwdXRzKSkKKyAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLm91dHB1dHMpKSk6CisgICAgICAgICAgICAgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZShvdXRwdXRzbGlzdFtpXSkKKyAgICAgICAgICAgIG91dHB1dHMgPSBidWlsZGVyLkVuZFZlY3RvcigpCisgICAgICAgIGlmIHNlbGYuc2lnbmF0dXJlS2V5IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2lnbmF0dXJlS2V5ID0gYnVpbGRlci5DcmVhdGVTdHJpbmcoc2VsZi5zaWduYXR1cmVLZXkpCisgICAgICAgIFNpZ25hdHVyZURlZlN0YXJ0KGJ1aWxkZXIpCisgICAgICAgIGlmIHNlbGYuaW5wdXRzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgU2lnbmF0dXJlRGVmQWRkSW5wdXRzKGJ1aWxkZXIsIGlucHV0cykKKyAgICAgICAgaWYgc2VsZi5vdXRwdXRzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgU2lnbmF0dXJlRGVmQWRkT3V0cHV0cyhidWlsZGVyLCBvdXRwdXRzKQorICAgICAgICBpZiBzZWxmLnNpZ25hdHVyZUtleSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIFNpZ25hdHVyZURlZkFkZFNpZ25hdHVyZUtleShidWlsZGVyLCBzaWduYXR1cmVLZXkpCisgICAgICAgIFNpZ25hdHVyZURlZkFkZFN1YmdyYXBoSW5kZXgoYnVpbGRlciwgc2VsZi5zdWJncmFwaEluZGV4KQorICAgICAgICBzaWduYXR1cmVEZWYgPSBTaWduYXR1cmVEZWZFbmQoYnVpbGRlcikKKyAgICAgICAgcmV0dXJuIHNpZ25hdHVyZURlZgorCisKK2NsYXNzIE1vZGVsKG9iamVjdCk6CisgICAgX19zbG90c19fID0gWydfdGFiJ10KKworICAgIEBjbGFzc21ldGhvZAorICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKKyAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQorICAgICAgICB4ID0gTW9kZWwoKQorICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQorICAgICAgICByZXR1cm4geAorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEdldFJvb3RBc01vZGVsKGNscywgYnVmLCBvZmZzZXQ9MCk6CisgICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgorICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKKyAgICBAY2xhc3NtZXRob2QKKyAgICBkZWYgTW9kZWxCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgorICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCisKKyAgICAjIE1vZGVsCisgICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgorICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKKworICAgICMgTW9kZWwKKyAgICBkZWYgVmVyc2lvbihzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVpbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgTW9kZWwKKyAgICBkZWYgT3BlcmF0b3JDb2RlcyhzZWxmLCBqKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgeCA9IHNlbGYuX3RhYi5WZWN0b3IobykKKyAgICAgICAgICAgIHggKz0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShqKSAqIDQKKyAgICAgICAgICAgIHggPSBzZWxmLl90YWIuSW5kaXJlY3QoeCkKKyAgICAgICAgICAgIG9iaiA9IE9wZXJhdG9yQ29kZSgpCisgICAgICAgICAgICBvYmouSW5pdChzZWxmLl90YWIuQnl0ZXMsIHgpCisgICAgICAgICAgICByZXR1cm4gb2JqCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICAjIE1vZGVsCisgICAgZGVmIE9wZXJhdG9yQ29kZXNMZW5ndGgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuVmVjdG9yTGVuKG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIE1vZGVsCisgICAgZGVmIE9wZXJhdG9yQ29kZXNJc05vbmUoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNikpCisgICAgICAgIHJldHVybiBvID09IDAKKworICAgICMgTW9kZWwKKyAgICBkZWYgU3ViZ3JhcGhzKHNlbGYsIGopOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDgpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICB4ID0gc2VsZi5fdGFiLlZlY3RvcihvKQorICAgICAgICAgICAgeCArPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGopICogNAorICAgICAgICAgICAgeCA9IHNlbGYuX3RhYi5JbmRpcmVjdCh4KQorICAgICAgICAgICAgb2JqID0gU3ViR3JhcGgoKQorICAgICAgICAgICAgb2JqLkluaXQoc2VsZi5fdGFiLkJ5dGVzLCB4KQorICAgICAgICAgICAgcmV0dXJuIG9iagorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgIyBNb2RlbAorICAgIGRlZiBTdWJncmFwaHNMZW5ndGgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuVmVjdG9yTGVuKG8pCisgICAgICAgIHJldHVybiAwCisKKyAgICAjIE1vZGVsCisgICAgZGVmIFN1YmdyYXBoc0lzTm9uZShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg4KSkKKyAgICAgICAgcmV0dXJuIG8gPT0gMAorCisgICAgIyBNb2RlbAorICAgIGRlZiBEZXNjcmlwdGlvbihzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxMCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuU3RyaW5nKG8gKyBzZWxmLl90YWIuUG9zKQorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgIyBNb2RlbAorICAgIGRlZiBCdWZmZXJzKHNlbGYsIGopOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEyKSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgeCA9IHNlbGYuX3RhYi5WZWN0b3IobykKKyAgICAgICAgICAgIHggKz0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShqKSAqIDQKKyAgICAgICAgICAgIHggPSBzZWxmLl90YWIuSW5kaXJlY3QoeCkKKyAgICAgICAgICAgIG9iaiA9IEJ1ZmZlcigpCisgICAgICAgICAgICBvYmouSW5pdChzZWxmLl90YWIuQnl0ZXMsIHgpCisgICAgICAgICAgICByZXR1cm4gb2JqCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICAjIE1vZGVsCisgICAgZGVmIEJ1ZmZlcnNMZW5ndGgoc2VsZik6CisgICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoMTIpKQorICAgICAgICBpZiBvICE9IDA6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLlZlY3RvckxlbihvKQorICAgICAgICByZXR1cm4gMAorCisgICAgIyBNb2RlbAorICAgIGRlZiBCdWZmZXJzSXNOb25lKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDEyKSkKKyAgICAgICAgcmV0dXJuIG8gPT0gMAorCisgICAgIyBNb2RlbAorICAgIGRlZiBNZXRhZGF0YUJ1ZmZlcihzZWxmLCBqKToKICAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxNCkpCiAgICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkJvb2xGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpKQotICAgICAgICByZXR1cm4gRmFsc2UKLQotZGVmIFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDYpCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zQWRkRnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24oYnVpbGRlciwgZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24pOiBidWlsZGVyLlByZXBlbmRJbnQ4U2xvdCgwLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbiwgMCkKLWRlZiBBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBmdXNlZEFjdGl2YXRpb25GdW5jdGlvbik6Ci0gICAgcmV0dXJuIFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc0FkZEZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKGJ1aWxkZXIsIGZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKQotZGVmIFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc0FkZENlbGxDbGlwKGJ1aWxkZXIsIGNlbGxDbGlwKTogYnVpbGRlci5QcmVwZW5kRmxvYXQzMlNsb3QoMSwgY2VsbENsaXAsIDAuMCkKLWRlZiBBZGRDZWxsQ2xpcChidWlsZGVyLCBjZWxsQ2xpcCk6Ci0gICAgcmV0dXJuIFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc0FkZENlbGxDbGlwKGJ1aWxkZXIsIGNlbGxDbGlwKQotZGVmIFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc0FkZFByb2pDbGlwKGJ1aWxkZXIsIHByb2pDbGlwKTogYnVpbGRlci5QcmVwZW5kRmxvYXQzMlNsb3QoMiwgcHJvakNsaXAsIDAuMCkKLWRlZiBBZGRQcm9qQ2xpcChidWlsZGVyLCBwcm9qQ2xpcCk6Ci0gICAgcmV0dXJuIFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc0FkZFByb2pDbGlwKGJ1aWxkZXIsIHByb2pDbGlwKQotZGVmIFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc0FkZFRpbWVNYWpvcihidWlsZGVyLCB0aW1lTWFqb3IpOiBidWlsZGVyLlByZXBlbmRCb29sU2xvdCgzLCB0aW1lTWFqb3IsIDApCi1kZWYgQWRkVGltZU1ham9yKGJ1aWxkZXIsIHRpbWVNYWpvcik6Ci0gICAgcmV0dXJuIFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc0FkZFRpbWVNYWpvcihidWlsZGVyLCB0aW1lTWFqb3IpCi1kZWYgVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zQWRkQXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKGJ1aWxkZXIsIGFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyk6IGJ1aWxkZXIuUHJlcGVuZEJvb2xTbG90KDQsIGFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cywgMCkKLWRlZiBBZGRBc3ltbWV0cmljUXVhbnRpemVJbnB1dHMoYnVpbGRlciwgYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKToKLSAgICByZXR1cm4gVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zQWRkQXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKGJ1aWxkZXIsIGFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cykKLWRlZiBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNBZGREaWFnb25hbFJlY3VycmVudFRlbnNvcnMoYnVpbGRlciwgZGlhZ29uYWxSZWN1cnJlbnRUZW5zb3JzKTogYnVpbGRlci5QcmVwZW5kQm9vbFNsb3QoNSwgZGlhZ29uYWxSZWN1cnJlbnRUZW5zb3JzLCAwKQotZGVmIEFkZERpYWdvbmFsUmVjdXJyZW50VGVuc29ycyhidWlsZGVyLCBkaWFnb25hbFJlY3VycmVudFRlbnNvcnMpOgotICAgIHJldHVybiBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNBZGREaWFnb25hbFJlY3VycmVudFRlbnNvcnMoYnVpbGRlciwgZGlhZ29uYWxSZWN1cnJlbnRUZW5zb3JzKQotZGVmIFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNUKG9iamVjdCk6Ci0KLSAgICAjIFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYuZnVzZWRBY3RpdmF0aW9uRnVuY3Rpb24gPSAwICAjIHR5cGU6IGludAotICAgICAgICBzZWxmLmNlbGxDbGlwID0gMC4wICAjIHR5cGU6IGZsb2F0Ci0gICAgICAgIHNlbGYucHJvakNsaXAgPSAwLjAgICMgdHlwZTogZmxvYXQKLSAgICAgICAgc2VsZi50aW1lTWFqb3IgPSBGYWxzZSAgIyB0eXBlOiBib29sCi0gICAgICAgIHNlbGYuYXN5bW1ldHJpY1F1YW50aXplSW5wdXRzID0gRmFsc2UgICMgdHlwZTogYm9vbAotICAgICAgICBzZWxmLmRpYWdvbmFsUmVjdXJyZW50VGVuc29ycyA9IEZhbHNlICAjIHR5cGU6IGJvb2wKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgdW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxzdG1vcHRpb25zID0gVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zKCkKLSAgICAgICAgdW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxzdG1vcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoodW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxzdG1vcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgdW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxzdG1vcHRpb25zKToKLSAgICAgICAgeCA9IFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2sodW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxzdG1vcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgdW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxzdG1vcHRpb25zKToKLSAgICAgICAgaWYgdW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxzdG1vcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi5mdXNlZEFjdGl2YXRpb25GdW5jdGlvbiA9IHVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMc3Rtb3B0aW9ucy5GdXNlZEFjdGl2YXRpb25GdW5jdGlvbigpCi0gICAgICAgIHNlbGYuY2VsbENsaXAgPSB1bmlkaXJlY3Rpb25hbFNlcXVlbmNlTHN0bW9wdGlvbnMuQ2VsbENsaXAoKQotICAgICAgICBzZWxmLnByb2pDbGlwID0gdW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxzdG1vcHRpb25zLlByb2pDbGlwKCkKLSAgICAgICAgc2VsZi50aW1lTWFqb3IgPSB1bmlkaXJlY3Rpb25hbFNlcXVlbmNlTHN0bW9wdGlvbnMuVGltZU1ham9yKCkKLSAgICAgICAgc2VsZi5hc3ltbWV0cmljUXVhbnRpemVJbnB1dHMgPSB1bmlkaXJlY3Rpb25hbFNlcXVlbmNlTHN0bW9wdGlvbnMuQXN5bW1ldHJpY1F1YW50aXplSW5wdXRzKCkKLSAgICAgICAgc2VsZi5kaWFnb25hbFJlY3VycmVudFRlbnNvcnMgPSB1bmlkaXJlY3Rpb25hbFNlcXVlbmNlTHN0bW9wdGlvbnMuRGlhZ29uYWxSZWN1cnJlbnRUZW5zb3JzKCkKLQotICAgICMgVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNBZGRGdXNlZEFjdGl2YXRpb25GdW5jdGlvbihidWlsZGVyLCBzZWxmLmZ1c2VkQWN0aXZhdGlvbkZ1bmN0aW9uKQotICAgICAgICBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNBZGRDZWxsQ2xpcChidWlsZGVyLCBzZWxmLmNlbGxDbGlwKQotICAgICAgICBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNBZGRQcm9qQ2xpcChidWlsZGVyLCBzZWxmLnByb2pDbGlwKQotICAgICAgICBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNBZGRUaW1lTWFqb3IoYnVpbGRlciwgc2VsZi50aW1lTWFqb3IpCi0gICAgICAgIFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc0FkZEFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cyhidWlsZGVyLCBzZWxmLmFzeW1tZXRyaWNRdWFudGl6ZUlucHV0cykKLSAgICAgICAgVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zQWRkRGlhZ29uYWxSZWN1cnJlbnRUZW5zb3JzKGJ1aWxkZXIsIHNlbGYuZGlhZ29uYWxSZWN1cnJlbnRUZW5zb3JzKQotICAgICAgICB1bmlkaXJlY3Rpb25hbFNlcXVlbmNlTHN0bW9wdGlvbnMgPSBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIHVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMc3Rtb3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIFVuaXF1ZU9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBVbmlxdWVPcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNVbmlxdWVPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgVW5pcXVlT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgVW5pcXVlT3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLSAgICAjIFVuaXF1ZU9wdGlvbnMKLSAgICBkZWYgSWR4T3V0VHlwZShzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDhGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiAyCi0KLWRlZiBVbmlxdWVPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMSkKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gVW5pcXVlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgVW5pcXVlT3B0aW9uc0FkZElkeE91dFR5cGUoYnVpbGRlciwgaWR4T3V0VHlwZSk6IGJ1aWxkZXIuUHJlcGVuZEludDhTbG90KDAsIGlkeE91dFR5cGUsIDIpCi1kZWYgQWRkSWR4T3V0VHlwZShidWlsZGVyLCBpZHhPdXRUeXBlKToKLSAgICByZXR1cm4gVW5pcXVlT3B0aW9uc0FkZElkeE91dFR5cGUoYnVpbGRlciwgaWR4T3V0VHlwZSkKLWRlZiBVbmlxdWVPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gVW5pcXVlT3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBVbmlxdWVPcHRpb25zVChvYmplY3QpOgotCi0gICAgIyBVbmlxdWVPcHRpb25zVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi5pZHhPdXRUeXBlID0gMiAgIyB0eXBlOiBpbnQKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgdW5pcXVlT3B0aW9ucyA9IFVuaXF1ZU9wdGlvbnMoKQotICAgICAgICB1bmlxdWVPcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoodW5pcXVlT3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHVuaXF1ZU9wdGlvbnMpOgotICAgICAgICB4ID0gVW5pcXVlT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2sodW5pcXVlT3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgVW5pcXVlT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCB1bmlxdWVPcHRpb25zKToKLSAgICAgICAgaWYgdW5pcXVlT3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYuaWR4T3V0VHlwZSA9IHVuaXF1ZU9wdGlvbnMuSWR4T3V0VHlwZSgpCi0KLSAgICAjIFVuaXF1ZU9wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIFVuaXF1ZU9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBVbmlxdWVPcHRpb25zQWRkSWR4T3V0VHlwZShidWlsZGVyLCBzZWxmLmlkeE91dFR5cGUpCi0gICAgICAgIHVuaXF1ZU9wdGlvbnMgPSBVbmlxdWVPcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiB1bmlxdWVPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgVW5wYWNrT3B0aW9ucyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IFVucGFja09wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc1VucGFja09wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBVbnBhY2tPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBVbnBhY2tPcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotICAgICMgVW5wYWNrT3B0aW9ucwotICAgIGRlZiBOdW0oc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgVW5wYWNrT3B0aW9ucwotICAgIGRlZiBBeGlzKHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiAwCi0KLWRlZiBVbnBhY2tPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMikKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gVW5wYWNrT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgVW5wYWNrT3B0aW9uc0FkZE51bShidWlsZGVyLCBudW0pOiBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMCwgbnVtLCAwKQotZGVmIEFkZE51bShidWlsZGVyLCBudW0pOgotICAgIHJldHVybiBVbnBhY2tPcHRpb25zQWRkTnVtKGJ1aWxkZXIsIG51bSkKLWRlZiBVbnBhY2tPcHRpb25zQWRkQXhpcyhidWlsZGVyLCBheGlzKTogYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDEsIGF4aXMsIDApCi1kZWYgQWRkQXhpcyhidWlsZGVyLCBheGlzKToKLSAgICByZXR1cm4gVW5wYWNrT3B0aW9uc0FkZEF4aXMoYnVpbGRlciwgYXhpcykKLWRlZiBVbnBhY2tPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gVW5wYWNrT3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBVbnBhY2tPcHRpb25zVChvYmplY3QpOgotCi0gICAgIyBVbnBhY2tPcHRpb25zVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi5udW0gPSAwICAjIHR5cGU6IGludAotICAgICAgICBzZWxmLmF4aXMgPSAwICAjIHR5cGU6IGludAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICB1bnBhY2tPcHRpb25zID0gVW5wYWNrT3B0aW9ucygpCi0gICAgICAgIHVucGFja09wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaih1bnBhY2tPcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgdW5wYWNrT3B0aW9ucyk6Ci0gICAgICAgIHggPSBVbnBhY2tPcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayh1bnBhY2tPcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBVbnBhY2tPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIHVucGFja09wdGlvbnMpOgotICAgICAgICBpZiB1bnBhY2tPcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLSAgICAgICAgc2VsZi5udW0gPSB1bnBhY2tPcHRpb25zLk51bSgpCi0gICAgICAgIHNlbGYuYXhpcyA9IHVucGFja09wdGlvbnMuQXhpcygpCi0KLSAgICAjIFVucGFja09wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIFVucGFja09wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBVbnBhY2tPcHRpb25zQWRkTnVtKGJ1aWxkZXIsIHNlbGYubnVtKQotICAgICAgICBVbnBhY2tPcHRpb25zQWRkQXhpcyhidWlsZGVyLCBzZWxmLmF4aXMpCi0gICAgICAgIHVucGFja09wdGlvbnMgPSBVbnBhY2tPcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiB1bnBhY2tPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgVW5zb3J0ZWRTZWdtZW50TWF4T3B0aW9ucyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IFVuc29ydGVkU2VnbWVudE1heE9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc1Vuc29ydGVkU2VnbWVudE1heE9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotZGVmIFVuc29ydGVkU2VnbWVudE1heE9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgwKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zU3RhcnQoYnVpbGRlcikKLWRlZiBVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gVW5zb3J0ZWRTZWdtZW50TWF4T3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zVChvYmplY3QpOgotCi0gICAgIyBVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgcGFzcwotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICB1bnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zID0gVW5zb3J0ZWRTZWdtZW50TWF4T3B0aW9ucygpCi0gICAgICAgIHVuc29ydGVkU2VnbWVudE1heE9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaih1bnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgdW5zb3J0ZWRTZWdtZW50TWF4T3B0aW9ucyk6Ci0gICAgICAgIHggPSBVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayh1bnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIHVuc29ydGVkU2VnbWVudE1heE9wdGlvbnMpOgotICAgICAgICBpZiB1bnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLQotICAgICMgVW5zb3J0ZWRTZWdtZW50TWF4T3B0aW9uc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgVW5zb3J0ZWRTZWdtZW50TWF4T3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIHVuc29ydGVkU2VnbWVudE1heE9wdGlvbnMgPSBVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiB1bnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgVW5zb3J0ZWRTZWdtZW50TWluT3B0aW9ucyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IFVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnMoKQotICAgICAgICB4LkluaXQoYnVmLCBuICsgb2Zmc2V0KQotICAgICAgICByZXR1cm4geAotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBc1Vuc29ydGVkU2VnbWVudE1pbk9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zCi0gICAgZGVmIEluaXQoc2VsZiwgYnVmLCBwb3MpOgotICAgICAgICBzZWxmLl90YWIgPSBmbGF0YnVmZmVycy50YWJsZS5UYWJsZShidWYsIHBvcykKLQotZGVmIFVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgwKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zU3RhcnQoYnVpbGRlcikKLWRlZiBVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zRW5kKGJ1aWxkZXIpOiByZXR1cm4gYnVpbGRlci5FbmRPYmplY3QoKQotZGVmIEVuZChidWlsZGVyKToKLSAgICByZXR1cm4gVW5zb3J0ZWRTZWdtZW50TWluT3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zVChvYmplY3QpOgotCi0gICAgIyBVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zVAotICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgcGFzcwotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICB1bnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zID0gVW5zb3J0ZWRTZWdtZW50TWluT3B0aW9ucygpCi0gICAgICAgIHVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnMuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaih1bnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgdW5zb3J0ZWRTZWdtZW50TWluT3B0aW9ucyk6Ci0gICAgICAgIHggPSBVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zVCgpCi0gICAgICAgIHguX1VuUGFjayh1bnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIHVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnMpOgotICAgICAgICBpZiB1bnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLQotICAgICMgVW5zb3J0ZWRTZWdtZW50TWluT3B0aW9uc1QKLSAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgVW5zb3J0ZWRTZWdtZW50TWluT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi0gICAgICAgIHVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnMgPSBVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zRW5kKGJ1aWxkZXIpCi0gICAgICAgIHJldHVybiB1bnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQotCi0jIG5hbWVzcGFjZTogdGZsaXRlCi0KLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgVW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9ucygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzVW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgVW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi1kZWYgVW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgwKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgVW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgVW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnNUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBwYXNzCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIHVuc29ydGVkU2VnbWVudFByb2RPcHRpb25zID0gVW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnMoKQotICAgICAgICB1bnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHVuc29ydGVkU2VnbWVudFByb2RPcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgdW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnMpOgotICAgICAgICB4ID0gVW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKHVuc29ydGVkU2VnbWVudFByb2RPcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCB1bnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9ucyk6Ci0gICAgICAgIGlmIHVuc29ydGVkU2VnbWVudFByb2RPcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLQotICAgICMgVW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIFVuc29ydGVkU2VnbWVudFByb2RPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgdW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnMgPSBVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gdW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gVW5zb3J0ZWRTZWdtZW50U3VtT3B0aW9ucygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzVW5zb3J0ZWRTZWdtZW50U3VtT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIFVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIFVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi1kZWYgVW5zb3J0ZWRTZWdtZW50U3VtT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpOiBidWlsZGVyLlN0YXJ0T2JqZWN0KDApCi1kZWYgU3RhcnQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIFVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zRW5kKGJ1aWxkZXIpCi0KLWNsYXNzIFVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnNUKG9iamVjdCk6Ci0KLSAgICAjIFVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnNUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBwYXNzCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIHVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnMgPSBVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zKCkKLSAgICAgICAgdW5zb3J0ZWRTZWdtZW50U3VtT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnMpCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCB1bnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zKToKLSAgICAgICAgeCA9IFVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKHVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnMpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICAjIFVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgdW5zb3J0ZWRTZWdtZW50U3VtT3B0aW9ucyk6Ci0gICAgICAgIGlmIHVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnMgaXMgTm9uZToKLSAgICAgICAgICAgIHJldHVybgotCi0gICAgIyBVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgdW5zb3J0ZWRTZWdtZW50U3VtT3B0aW9ucyA9IFVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIHVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBWYXJIYW5kbGVPcHRpb25zKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gVmFySGFuZGxlT3B0aW9ucygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzVmFySGFuZGxlT3B0aW9ucyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIFZhckhhbmRsZU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIFZhckhhbmRsZU9wdGlvbnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi0gICAgIyBWYXJIYW5kbGVPcHRpb25zCi0gICAgZGVmIENvbnRhaW5lcihzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5TdHJpbmcobyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiBOb25lCi0KLSAgICAjIFZhckhhbmRsZU9wdGlvbnMKLSAgICBkZWYgU2hhcmVkTmFtZShzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKLSAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5TdHJpbmcobyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiBOb25lCi0KLWRlZiBWYXJIYW5kbGVPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMikKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gVmFySGFuZGxlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgVmFySGFuZGxlT3B0aW9uc0FkZENvbnRhaW5lcihidWlsZGVyLCBjb250YWluZXIpOiBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgwLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGNvbnRhaW5lciksIDApCi1kZWYgQWRkQ29udGFpbmVyKGJ1aWxkZXIsIGNvbnRhaW5lcik6Ci0gICAgcmV0dXJuIFZhckhhbmRsZU9wdGlvbnNBZGRDb250YWluZXIoYnVpbGRlciwgY29udGFpbmVyKQotZGVmIFZhckhhbmRsZU9wdGlvbnNBZGRTaGFyZWROYW1lKGJ1aWxkZXIsIHNoYXJlZE5hbWUpOiBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgxLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNoYXJlZE5hbWUpLCAwKQotZGVmIEFkZFNoYXJlZE5hbWUoYnVpbGRlciwgc2hhcmVkTmFtZSk6Ci0gICAgcmV0dXJuIFZhckhhbmRsZU9wdGlvbnNBZGRTaGFyZWROYW1lKGJ1aWxkZXIsIHNoYXJlZE5hbWUpCi1kZWYgVmFySGFuZGxlT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFZhckhhbmRsZU9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgVmFySGFuZGxlT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgVmFySGFuZGxlT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHNlbGYuY29udGFpbmVyID0gTm9uZSAgIyB0eXBlOiBzdHIKLSAgICAgICAgc2VsZi5zaGFyZWROYW1lID0gTm9uZSAgIyB0eXBlOiBzdHIKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgdmFySGFuZGxlT3B0aW9ucyA9IFZhckhhbmRsZU9wdGlvbnMoKQotICAgICAgICB2YXJIYW5kbGVPcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoodmFySGFuZGxlT3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHZhckhhbmRsZU9wdGlvbnMpOgotICAgICAgICB4ID0gVmFySGFuZGxlT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2sodmFySGFuZGxlT3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgVmFySGFuZGxlT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCB2YXJIYW5kbGVPcHRpb25zKToKLSAgICAgICAgaWYgdmFySGFuZGxlT3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYuY29udGFpbmVyID0gdmFySGFuZGxlT3B0aW9ucy5Db250YWluZXIoKQotICAgICAgICBzZWxmLnNoYXJlZE5hbWUgPSB2YXJIYW5kbGVPcHRpb25zLlNoYXJlZE5hbWUoKQotCi0gICAgIyBWYXJIYW5kbGVPcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBpZiBzZWxmLmNvbnRhaW5lciBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIGNvbnRhaW5lciA9IGJ1aWxkZXIuQ3JlYXRlU3RyaW5nKHNlbGYuY29udGFpbmVyKQotICAgICAgICBpZiBzZWxmLnNoYXJlZE5hbWUgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBzaGFyZWROYW1lID0gYnVpbGRlci5DcmVhdGVTdHJpbmcoc2VsZi5zaGFyZWROYW1lKQotICAgICAgICBWYXJIYW5kbGVPcHRpb25zU3RhcnQoYnVpbGRlcikKLSAgICAgICAgaWYgc2VsZi5jb250YWluZXIgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBWYXJIYW5kbGVPcHRpb25zQWRkQ29udGFpbmVyKGJ1aWxkZXIsIGNvbnRhaW5lcikKLSAgICAgICAgaWYgc2VsZi5zaGFyZWROYW1lIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgVmFySGFuZGxlT3B0aW9uc0FkZFNoYXJlZE5hbWUoYnVpbGRlciwgc2hhcmVkTmFtZSkKLSAgICAgICAgdmFySGFuZGxlT3B0aW9ucyA9IFZhckhhbmRsZU9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIHZhckhhbmRsZU9wdGlvbnMKLSMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgdGhlIEZsYXRCdWZmZXJzIGNvbXBpbGVyLCBkbyBub3QgbW9kaWZ5Ci0KLSMgbmFtZXNwYWNlOiB0ZmxpdGUKLQotZnJvbSBmbGF0YnVmZmVycy5jb21wYXQgaW1wb3J0IGltcG9ydF9udW1weQotbnAgPSBpbXBvcnRfbnVtcHkoKQotCi1jbGFzcyBWYXJpYW50U3ViVHlwZShvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IFZhcmlhbnRTdWJUeXBlKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNWYXJpYW50U3ViVHlwZShjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICAiIiJUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLiBQbGVhc2Ugc3dpdGNoIHRvIEdldFJvb3RBcy4iIiIKLSAgICAgICAgcmV0dXJuIGNscy5HZXRSb290QXMoYnVmLCBvZmZzZXQpCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIFZhcmlhbnRTdWJUeXBlQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBWYXJpYW50U3ViVHlwZQotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLSAgICAjIFZhcmlhbnRTdWJUeXBlCi0gICAgZGVmIFNoYXBlKHNlbGYsIGopOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQotICAgICAgICBpZiBvICE9IDA6CiAgICAgICAgICAgICBhID0gc2VsZi5fdGFiLlZlY3RvcihvKQogICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDMyRmxhZ3MsIGEgKyBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGogKiA0KSkKICAgICAgICAgcmV0dXJuIDAKIAotICAgICMgVmFyaWFudFN1YlR5cGUKLSAgICBkZWYgU2hhcGVBc051bXB5KHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDQpKQorICAgICMgTW9kZWwKKyAgICBkZWYgTWV0YWRhdGFCdWZmZXJBc051bXB5KHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDE0KSkKICAgICAgICAgaWYgbyAhPSAwOgogICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXRWZWN0b3JBc051bXB5KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvKQogICAgICAgICByZXR1cm4gMAogCi0gICAgIyBWYXJpYW50U3ViVHlwZQotICAgIGRlZiBTaGFwZUxlbmd0aChzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg0KSkKKyAgICAjIE1vZGVsCisgICAgZGVmIE1ldGFkYXRhQnVmZmVyTGVuZ3RoKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDE0KSkKICAgICAgICAgaWYgbyAhPSAwOgogICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKICAgICAgICAgcmV0dXJuIDAKIAotICAgICMgVmFyaWFudFN1YlR5cGUKLSAgICBkZWYgU2hhcGVJc05vbmUoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCisgICAgIyBNb2RlbAorICAgIGRlZiBNZXRhZGF0YUJ1ZmZlcklzTm9uZShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxNCkpCiAgICAgICAgIHJldHVybiBvID09IDAKIAotICAgICMgVmFyaWFudFN1YlR5cGUKLSAgICBkZWYgVHlwZShzZWxmKToKLSAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCg2KSkKKyAgICAjIE1vZGVsCisgICAgZGVmIE1ldGFkYXRhKHNlbGYsIGopOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDE2KSkKICAgICAgICAgaWYgbyAhPSAwOgotICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkludDhGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCisgICAgICAgICAgICB4ID0gc2VsZi5fdGFiLlZlY3RvcihvKQorICAgICAgICAgICAgeCArPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKGopICogNAorICAgICAgICAgICAgeCA9IHNlbGYuX3RhYi5JbmRpcmVjdCh4KQorICAgICAgICAgICAgb2JqID0gTWV0YWRhdGEoKQorICAgICAgICAgICAgb2JqLkluaXQoc2VsZi5fdGFiLkJ5dGVzLCB4KQorICAgICAgICAgICAgcmV0dXJuIG9iagorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgIyBNb2RlbAorICAgIGRlZiBNZXRhZGF0YUxlbmd0aChzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxNikpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuVmVjdG9yTGVuKG8pCiAgICAgICAgIHJldHVybiAwCiAKLSAgICAjIFZhcmlhbnRTdWJUeXBlCi0gICAgZGVmIEhhc1Jhbmsoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoOCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBib29sKHNlbGYuX3RhYi5HZXQoZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLkJvb2xGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpKQotICAgICAgICByZXR1cm4gRmFsc2UKKyAgICAjIE1vZGVsCisgICAgZGVmIE1ldGFkYXRhSXNOb25lKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDE2KSkKKyAgICAgICAgcmV0dXJuIG8gPT0gMAogCi1kZWYgVmFyaWFudFN1YlR5cGVTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgzKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBWYXJpYW50U3ViVHlwZVN0YXJ0KGJ1aWxkZXIpCi1kZWYgVmFyaWFudFN1YlR5cGVBZGRTaGFwZShidWlsZGVyLCBzaGFwZSk6IGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDAsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2hhcGUpLCAwKQotZGVmIEFkZFNoYXBlKGJ1aWxkZXIsIHNoYXBlKToKLSAgICByZXR1cm4gVmFyaWFudFN1YlR5cGVBZGRTaGFwZShidWlsZGVyLCBzaGFwZSkKLWRlZiBWYXJpYW50U3ViVHlwZVN0YXJ0U2hhcGVWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOiByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCkKLWRlZiBTdGFydFNoYXBlVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKLSAgICByZXR1cm4gVmFyaWFudFN1YlR5cGVTdGFydFNoYXBlVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKQotZGVmIFZhcmlhbnRTdWJUeXBlQWRkVHlwZShidWlsZGVyLCB0eXBlKTogYnVpbGRlci5QcmVwZW5kSW50OFNsb3QoMSwgdHlwZSwgMCkKLWRlZiBBZGRUeXBlKGJ1aWxkZXIsIHR5cGUpOgotICAgIHJldHVybiBWYXJpYW50U3ViVHlwZUFkZFR5cGUoYnVpbGRlciwgdHlwZSkKLWRlZiBWYXJpYW50U3ViVHlwZUFkZEhhc1JhbmsoYnVpbGRlciwgaGFzUmFuayk6IGJ1aWxkZXIuUHJlcGVuZEJvb2xTbG90KDIsIGhhc1JhbmssIDApCi1kZWYgQWRkSGFzUmFuayhidWlsZGVyLCBoYXNSYW5rKToKLSAgICByZXR1cm4gVmFyaWFudFN1YlR5cGVBZGRIYXNSYW5rKGJ1aWxkZXIsIGhhc1JhbmspCi1kZWYgVmFyaWFudFN1YlR5cGVFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBWYXJpYW50U3ViVHlwZUVuZChidWlsZGVyKQorICAgICMgTW9kZWwKKyAgICBkZWYgU2lnbmF0dXJlRGVmcyhzZWxmLCBqKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxOCkpCisgICAgICAgIGlmIG8gIT0gMDoKKyAgICAgICAgICAgIHggPSBzZWxmLl90YWIuVmVjdG9yKG8pCisgICAgICAgICAgICB4ICs9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoaikgKiA0CisgICAgICAgICAgICB4ID0gc2VsZi5fdGFiLkluZGlyZWN0KHgpCisgICAgICAgICAgICBvYmogPSBTaWduYXR1cmVEZWYoKQorICAgICAgICAgICAgb2JqLkluaXQoc2VsZi5fdGFiLkJ5dGVzLCB4KQorICAgICAgICAgICAgcmV0dXJuIG9iagorICAgICAgICByZXR1cm4gTm9uZQorCisgICAgIyBNb2RlbAorICAgIGRlZiBTaWduYXR1cmVEZWZzTGVuZ3RoKHNlbGYpOgorICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDE4KSkKKyAgICAgICAgaWYgbyAhPSAwOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3RhYi5WZWN0b3JMZW4obykKKyAgICAgICAgcmV0dXJuIDAKKworICAgICMgTW9kZWwKKyAgICBkZWYgU2lnbmF0dXJlRGVmc0lzTm9uZShzZWxmKToKKyAgICAgICAgbyA9IGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoc2VsZi5fdGFiLk9mZnNldCgxOCkpCisgICAgICAgIHJldHVybiBvID09IDAKKworZGVmIE1vZGVsU3RhcnQoYnVpbGRlcik6CisgICAgYnVpbGRlci5TdGFydE9iamVjdCg4KQorCitkZWYgTW9kZWxBZGRWZXJzaW9uKGJ1aWxkZXIsIHZlcnNpb24pOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVpbnQzMlNsb3QoMCwgdmVyc2lvbiwgMCkKKworZGVmIE1vZGVsQWRkT3BlcmF0b3JDb2RlcyhidWlsZGVyLCBvcGVyYXRvckNvZGVzKToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgxLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKG9wZXJhdG9yQ29kZXMpLCAwKQorCitkZWYgTW9kZWxTdGFydE9wZXJhdG9yQ29kZXNWZWN0b3IoYnVpbGRlciwgbnVtRWxlbXMpOgorICAgIHJldHVybiBidWlsZGVyLlN0YXJ0VmVjdG9yKDQsIG51bUVsZW1zLCA0KQorCitkZWYgTW9kZWxBZGRTdWJncmFwaHMoYnVpbGRlciwgc3ViZ3JhcGhzKToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCgyLCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHN1YmdyYXBocyksIDApCisKK2RlZiBNb2RlbFN0YXJ0U3ViZ3JhcGhzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKKyAgICByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCkKKworZGVmIE1vZGVsQWRkRGVzY3JpcHRpb24oYnVpbGRlciwgZGVzY3JpcHRpb24pOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDMsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoZGVzY3JpcHRpb24pLCAwKQorCitkZWYgTW9kZWxBZGRCdWZmZXJzKGJ1aWxkZXIsIGJ1ZmZlcnMpOgorICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmVTbG90KDQsIGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5VT2Zmc2V0VEZsYWdzLnB5X3R5cGUoYnVmZmVycyksIDApCisKK2RlZiBNb2RlbFN0YXJ0QnVmZmVyc1ZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6CisgICAgcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpCisKK2RlZiBNb2RlbEFkZE1ldGFkYXRhQnVmZmVyKGJ1aWxkZXIsIG1ldGFkYXRhQnVmZmVyKToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCg1LCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKG1ldGFkYXRhQnVmZmVyKSwgMCkKKworZGVmIE1vZGVsU3RhcnRNZXRhZGF0YUJ1ZmZlclZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6CisgICAgcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpCisKK2RlZiBNb2RlbEFkZE1ldGFkYXRhKGJ1aWxkZXIsIG1ldGFkYXRhKToKKyAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlU2xvdCg2LCBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKG1ldGFkYXRhKSwgMCkKKworZGVmIE1vZGVsU3RhcnRNZXRhZGF0YVZlY3RvcihidWlsZGVyLCBudW1FbGVtcyk6CisgICAgcmV0dXJuIGJ1aWxkZXIuU3RhcnRWZWN0b3IoNCwgbnVtRWxlbXMsIDQpCisKK2RlZiBNb2RlbEFkZFNpZ25hdHVyZURlZnMoYnVpbGRlciwgc2lnbmF0dXJlRGVmcyk6CisgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZVNsb3QoNywgZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzaWduYXR1cmVEZWZzKSwgMCkKKworZGVmIE1vZGVsU3RhcnRTaWduYXR1cmVEZWZzVmVjdG9yKGJ1aWxkZXIsIG51bUVsZW1zKToKKyAgICByZXR1cm4gYnVpbGRlci5TdGFydFZlY3Rvcig0LCBudW1FbGVtcywgNCkKKworZGVmIE1vZGVsRW5kKGJ1aWxkZXIpOgorICAgIHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCisKKwogdHJ5OgogICAgIGZyb20gdHlwaW5nIGltcG9ydCBMaXN0CiBleGNlcHQ6CiAgICAgcGFzcwogCi1jbGFzcyBWYXJpYW50U3ViVHlwZVQob2JqZWN0KToKK2NsYXNzIE1vZGVsVChvYmplY3QpOgogCi0gICAgIyBWYXJpYW50U3ViVHlwZVQKKyAgICAjIE1vZGVsVAogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAgICAgc2VsZi5zaGFwZSA9IE5vbmUgICMgdHlwZTogTGlzdFtpbnRdCi0gICAgICAgIHNlbGYudHlwZSA9IDAgICMgdHlwZTogaW50Ci0gICAgICAgIHNlbGYuaGFzUmFuayA9IEZhbHNlICAjIHR5cGU6IGJvb2wKKyAgICAgICAgc2VsZi52ZXJzaW9uID0gMCAgIyB0eXBlOiBpbnQKKyAgICAgICAgc2VsZi5vcGVyYXRvckNvZGVzID0gTm9uZSAgIyB0eXBlOiBMaXN0W09wZXJhdG9yQ29kZVRdCisgICAgICAgIHNlbGYuc3ViZ3JhcGhzID0gTm9uZSAgIyB0eXBlOiBMaXN0W1N1YkdyYXBoVF0KKyAgICAgICAgc2VsZi5kZXNjcmlwdGlvbiA9IE5vbmUgICMgdHlwZTogc3RyCisgICAgICAgIHNlbGYuYnVmZmVycyA9IE5vbmUgICMgdHlwZTogTGlzdFtCdWZmZXJUXQorICAgICAgICBzZWxmLm1ldGFkYXRhQnVmZmVyID0gTm9uZSAgIyB0eXBlOiBMaXN0W2ludF0KKyAgICAgICAgc2VsZi5tZXRhZGF0YSA9IE5vbmUgICMgdHlwZTogTGlzdFtNZXRhZGF0YVRdCisgICAgICAgIHNlbGYuc2lnbmF0dXJlRGVmcyA9IE5vbmUgICMgdHlwZTogTGlzdFtTaWduYXR1cmVEZWZUXQogCiAgICAgQGNsYXNzbWV0aG9kCiAgICAgZGVmIEluaXRGcm9tQnVmKGNscywgYnVmLCBwb3MpOgotICAgICAgICB2YXJpYW50U3ViVHlwZSA9IFZhcmlhbnRTdWJUeXBlKCkKLSAgICAgICAgdmFyaWFudFN1YlR5cGUuSW5pdChidWYsIHBvcykKLSAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbU9iaih2YXJpYW50U3ViVHlwZSkKKyAgICAgICAgbW9kZWwgPSBNb2RlbCgpCisgICAgICAgIG1vZGVsLkluaXQoYnVmLCBwb3MpCisgICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmoobW9kZWwpCiAKICAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21PYmooY2xzLCB2YXJpYW50U3ViVHlwZSk6Ci0gICAgICAgIHggPSBWYXJpYW50U3ViVHlwZVQoKQotICAgICAgICB4Ll9VblBhY2sodmFyaWFudFN1YlR5cGUpCisgICAgZGVmIEluaXRGcm9tUGFja2VkQnVmKGNscywgYnVmLCBwb3M9MCk6CisgICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIHBvcykKKyAgICAgICAgcmV0dXJuIGNscy5Jbml0RnJvbUJ1ZihidWYsIHBvcytuKQorCisgICAgQGNsYXNzbWV0aG9kCisgICAgZGVmIEluaXRGcm9tT2JqKGNscywgbW9kZWwpOgorICAgICAgICB4ID0gTW9kZWxUKCkKKyAgICAgICAgeC5fVW5QYWNrKG1vZGVsKQogICAgICAgICByZXR1cm4geAogCi0gICAgIyBWYXJpYW50U3ViVHlwZVQKLSAgICBkZWYgX1VuUGFjayhzZWxmLCB2YXJpYW50U3ViVHlwZSk6Ci0gICAgICAgIGlmIHZhcmlhbnRTdWJUeXBlIGlzIE5vbmU6CisgICAgIyBNb2RlbFQKKyAgICBkZWYgX1VuUGFjayhzZWxmLCBtb2RlbCk6CisgICAgICAgIGlmIG1vZGVsIGlzIE5vbmU6CiAgICAgICAgICAgICByZXR1cm4KLSAgICAgICAgaWYgbm90IHZhcmlhbnRTdWJUeXBlLlNoYXBlSXNOb25lKCk6CisgICAgICAgIHNlbGYudmVyc2lvbiA9IG1vZGVsLlZlcnNpb24oKQorICAgICAgICBpZiBub3QgbW9kZWwuT3BlcmF0b3JDb2Rlc0lzTm9uZSgpOgorICAgICAgICAgICAgc2VsZi5vcGVyYXRvckNvZGVzID0gW10KKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKG1vZGVsLk9wZXJhdG9yQ29kZXNMZW5ndGgoKSk6CisgICAgICAgICAgICAgICAgaWYgbW9kZWwuT3BlcmF0b3JDb2RlcyhpKSBpcyBOb25lOgorICAgICAgICAgICAgICAgICAgICBzZWxmLm9wZXJhdG9yQ29kZXMuYXBwZW5kKE5vbmUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgb3BlcmF0b3JDb2RlXyA9IE9wZXJhdG9yQ29kZVQuSW5pdEZyb21PYmoobW9kZWwuT3BlcmF0b3JDb2RlcyhpKSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5vcGVyYXRvckNvZGVzLmFwcGVuZChvcGVyYXRvckNvZGVfKQorICAgICAgICBpZiBub3QgbW9kZWwuU3ViZ3JhcGhzSXNOb25lKCk6CisgICAgICAgICAgICBzZWxmLnN1YmdyYXBocyA9IFtdCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShtb2RlbC5TdWJncmFwaHNMZW5ndGgoKSk6CisgICAgICAgICAgICAgICAgaWYgbW9kZWwuU3ViZ3JhcGhzKGkpIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3ViZ3JhcGhzLmFwcGVuZChOb25lKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHN1YkdyYXBoXyA9IFN1YkdyYXBoVC5Jbml0RnJvbU9iaihtb2RlbC5TdWJncmFwaHMoaSkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc3ViZ3JhcGhzLmFwcGVuZChzdWJHcmFwaF8pCisgICAgICAgIHNlbGYuZGVzY3JpcHRpb24gPSBtb2RlbC5EZXNjcmlwdGlvbigpCisgICAgICAgIGlmIG5vdCBtb2RlbC5CdWZmZXJzSXNOb25lKCk6CisgICAgICAgICAgICBzZWxmLmJ1ZmZlcnMgPSBbXQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobW9kZWwuQnVmZmVyc0xlbmd0aCgpKToKKyAgICAgICAgICAgICAgICBpZiBtb2RlbC5CdWZmZXJzKGkpIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuYnVmZmVycy5hcHBlbmQoTm9uZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBidWZmZXJfID0gQnVmZmVyVC5Jbml0RnJvbU9iaihtb2RlbC5CdWZmZXJzKGkpKQorICAgICAgICAgICAgICAgICAgICBzZWxmLmJ1ZmZlcnMuYXBwZW5kKGJ1ZmZlcl8pCisgICAgICAgIGlmIG5vdCBtb2RlbC5NZXRhZGF0YUJ1ZmZlcklzTm9uZSgpOgogICAgICAgICAgICAgaWYgbnAgaXMgTm9uZToKLSAgICAgICAgICAgICAgICBzZWxmLnNoYXBlID0gW10KLSAgICAgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSh2YXJpYW50U3ViVHlwZS5TaGFwZUxlbmd0aCgpKToKLSAgICAgICAgICAgICAgICAgICAgc2VsZi5zaGFwZS5hcHBlbmQodmFyaWFudFN1YlR5cGUuU2hhcGUoaSkpCisgICAgICAgICAgICAgICAgc2VsZi5tZXRhZGF0YUJ1ZmZlciA9IFtdCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobW9kZWwuTWV0YWRhdGFCdWZmZXJMZW5ndGgoKSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubWV0YWRhdGFCdWZmZXIuYXBwZW5kKG1vZGVsLk1ldGFkYXRhQnVmZmVyKGkpKQogICAgICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICAgICBzZWxmLnNoYXBlID0gdmFyaWFudFN1YlR5cGUuU2hhcGVBc051bXB5KCkKLSAgICAgICAgc2VsZi50eXBlID0gdmFyaWFudFN1YlR5cGUuVHlwZSgpCi0gICAgICAgIHNlbGYuaGFzUmFuayA9IHZhcmlhbnRTdWJUeXBlLkhhc1JhbmsoKQorICAgICAgICAgICAgICAgIHNlbGYubWV0YWRhdGFCdWZmZXIgPSBtb2RlbC5NZXRhZGF0YUJ1ZmZlckFzTnVtcHkoKQorICAgICAgICBpZiBub3QgbW9kZWwuTWV0YWRhdGFJc05vbmUoKToKKyAgICAgICAgICAgIHNlbGYubWV0YWRhdGEgPSBbXQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobW9kZWwuTWV0YWRhdGFMZW5ndGgoKSk6CisgICAgICAgICAgICAgICAgaWYgbW9kZWwuTWV0YWRhdGEoaSkgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5tZXRhZGF0YS5hcHBlbmQoTm9uZSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YV8gPSBNZXRhZGF0YVQuSW5pdEZyb21PYmoobW9kZWwuTWV0YWRhdGEoaSkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYubWV0YWRhdGEuYXBwZW5kKG1ldGFkYXRhXykKKyAgICAgICAgaWYgbm90IG1vZGVsLlNpZ25hdHVyZURlZnNJc05vbmUoKToKKyAgICAgICAgICAgIHNlbGYuc2lnbmF0dXJlRGVmcyA9IFtdCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShtb2RlbC5TaWduYXR1cmVEZWZzTGVuZ3RoKCkpOgorICAgICAgICAgICAgICAgIGlmIG1vZGVsLlNpZ25hdHVyZURlZnMoaSkgaXMgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zaWduYXR1cmVEZWZzLmFwcGVuZChOb25lKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZURlZl8gPSBTaWduYXR1cmVEZWZULkluaXRGcm9tT2JqKG1vZGVsLlNpZ25hdHVyZURlZnMoaSkpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2lnbmF0dXJlRGVmcy5hcHBlbmQoc2lnbmF0dXJlRGVmXykKIAotICAgICMgVmFyaWFudFN1YlR5cGVUCisgICAgIyBNb2RlbFQKICAgICBkZWYgUGFjayhzZWxmLCBidWlsZGVyKToKLSAgICAgICAgaWYgc2VsZi5zaGFwZSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIGlmIG5wIGlzIG5vdCBOb25lIGFuZCB0eXBlKHNlbGYuc2hhcGUpIGlzIG5wLm5kYXJyYXk6Ci0gICAgICAgICAgICAgICAgc2hhcGUgPSBidWlsZGVyLkNyZWF0ZU51bXB5VmVjdG9yKHNlbGYuc2hhcGUpCisgICAgICAgIGlmIHNlbGYub3BlcmF0b3JDb2RlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIG9wZXJhdG9yQ29kZXNsaXN0ID0gW10KKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLm9wZXJhdG9yQ29kZXMpKToKKyAgICAgICAgICAgICAgICBvcGVyYXRvckNvZGVzbGlzdC5hcHBlbmQoc2VsZi5vcGVyYXRvckNvZGVzW2ldLlBhY2soYnVpbGRlcikpCisgICAgICAgICAgICBNb2RlbFN0YXJ0T3BlcmF0b3JDb2Rlc1ZlY3RvcihidWlsZGVyLCBsZW4oc2VsZi5vcGVyYXRvckNvZGVzKSkKKyAgICAgICAgICAgIGZvciBpIGluIHJldmVyc2VkKHJhbmdlKGxlbihzZWxmLm9wZXJhdG9yQ29kZXMpKSk6CisgICAgICAgICAgICAgICAgYnVpbGRlci5QcmVwZW5kVU9mZnNldFRSZWxhdGl2ZShvcGVyYXRvckNvZGVzbGlzdFtpXSkKKyAgICAgICAgICAgIG9wZXJhdG9yQ29kZXMgPSBidWlsZGVyLkVuZFZlY3RvcigpCisgICAgICAgIGlmIHNlbGYuc3ViZ3JhcGhzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc3ViZ3JhcGhzbGlzdCA9IFtdCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5zdWJncmFwaHMpKToKKyAgICAgICAgICAgICAgICBzdWJncmFwaHNsaXN0LmFwcGVuZChzZWxmLnN1YmdyYXBoc1tpXS5QYWNrKGJ1aWxkZXIpKQorICAgICAgICAgICAgTW9kZWxTdGFydFN1YmdyYXBoc1ZlY3RvcihidWlsZGVyLCBsZW4oc2VsZi5zdWJncmFwaHMpKQorICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYuc3ViZ3JhcGhzKSkpOgorICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmUoc3ViZ3JhcGhzbGlzdFtpXSkKKyAgICAgICAgICAgIHN1YmdyYXBocyA9IGJ1aWxkZXIuRW5kVmVjdG9yKCkKKyAgICAgICAgaWYgc2VsZi5kZXNjcmlwdGlvbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gYnVpbGRlci5DcmVhdGVTdHJpbmcoc2VsZi5kZXNjcmlwdGlvbikKKyAgICAgICAgaWYgc2VsZi5idWZmZXJzIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgYnVmZmVyc2xpc3QgPSBbXQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuYnVmZmVycykpOgorICAgICAgICAgICAgICAgIGJ1ZmZlcnNsaXN0LmFwcGVuZChzZWxmLmJ1ZmZlcnNbaV0uUGFjayhidWlsZGVyKSkKKyAgICAgICAgICAgIE1vZGVsU3RhcnRCdWZmZXJzVmVjdG9yKGJ1aWxkZXIsIGxlbihzZWxmLmJ1ZmZlcnMpKQorICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYuYnVmZmVycykpKToKKyAgICAgICAgICAgICAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlKGJ1ZmZlcnNsaXN0W2ldKQorICAgICAgICAgICAgYnVmZmVycyA9IGJ1aWxkZXIuRW5kVmVjdG9yKCkKKyAgICAgICAgaWYgc2VsZi5tZXRhZGF0YUJ1ZmZlciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG5wIGlzIG5vdCBOb25lIGFuZCB0eXBlKHNlbGYubWV0YWRhdGFCdWZmZXIpIGlzIG5wLm5kYXJyYXk6CisgICAgICAgICAgICAgICAgbWV0YWRhdGFCdWZmZXIgPSBidWlsZGVyLkNyZWF0ZU51bXB5VmVjdG9yKHNlbGYubWV0YWRhdGFCdWZmZXIpCiAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIFZhcmlhbnRTdWJUeXBlU3RhcnRTaGFwZVZlY3RvcihidWlsZGVyLCBsZW4oc2VsZi5zaGFwZSkpCi0gICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYuc2hhcGUpKSk6Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZEludDMyKHNlbGYuc2hhcGVbaV0pCi0gICAgICAgICAgICAgICAgc2hhcGUgPSBidWlsZGVyLkVuZFZlY3RvcigpCi0gICAgICAgIFZhcmlhbnRTdWJUeXBlU3RhcnQoYnVpbGRlcikKLSAgICAgICAgaWYgc2VsZi5zaGFwZSBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIFZhcmlhbnRTdWJUeXBlQWRkU2hhcGUoYnVpbGRlciwgc2hhcGUpCi0gICAgICAgIFZhcmlhbnRTdWJUeXBlQWRkVHlwZShidWlsZGVyLCBzZWxmLnR5cGUpCi0gICAgICAgIFZhcmlhbnRTdWJUeXBlQWRkSGFzUmFuayhidWlsZGVyLCBzZWxmLmhhc1JhbmspCi0gICAgICAgIHZhcmlhbnRTdWJUeXBlID0gVmFyaWFudFN1YlR5cGVFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIHZhcmlhbnRTdWJUeXBlCi0jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IHRoZSBGbGF0QnVmZmVycyBjb21waWxlciwgZG8gbm90IG1vZGlmeQorICAgICAgICAgICAgICAgIE1vZGVsU3RhcnRNZXRhZGF0YUJ1ZmZlclZlY3RvcihidWlsZGVyLCBsZW4oc2VsZi5tZXRhZGF0YUJ1ZmZlcikpCisgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmV2ZXJzZWQocmFuZ2UobGVuKHNlbGYubWV0YWRhdGFCdWZmZXIpKSk6CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZEludDMyKHNlbGYubWV0YWRhdGFCdWZmZXJbaV0pCisgICAgICAgICAgICAgICAgbWV0YWRhdGFCdWZmZXIgPSBidWlsZGVyLkVuZFZlY3RvcigpCisgICAgICAgIGlmIHNlbGYubWV0YWRhdGEgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBtZXRhZGF0YWxpc3QgPSBbXQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYubWV0YWRhdGEpKToKKyAgICAgICAgICAgICAgICBtZXRhZGF0YWxpc3QuYXBwZW5kKHNlbGYubWV0YWRhdGFbaV0uUGFjayhidWlsZGVyKSkKKyAgICAgICAgICAgIE1vZGVsU3RhcnRNZXRhZGF0YVZlY3RvcihidWlsZGVyLCBsZW4oc2VsZi5tZXRhZGF0YSkpCisgICAgICAgICAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShsZW4oc2VsZi5tZXRhZGF0YSkpKToKKyAgICAgICAgICAgICAgICBidWlsZGVyLlByZXBlbmRVT2Zmc2V0VFJlbGF0aXZlKG1ldGFkYXRhbGlzdFtpXSkKKyAgICAgICAgICAgIG1ldGFkYXRhID0gYnVpbGRlci5FbmRWZWN0b3IoKQorICAgICAgICBpZiBzZWxmLnNpZ25hdHVyZURlZnMgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBzaWduYXR1cmVEZWZzbGlzdCA9IFtdCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5zaWduYXR1cmVEZWZzKSk6CisgICAgICAgICAgICAgICAgc2lnbmF0dXJlRGVmc2xpc3QuYXBwZW5kKHNlbGYuc2lnbmF0dXJlRGVmc1tpXS5QYWNrKGJ1aWxkZXIpKQorICAgICAgICAgICAgTW9kZWxTdGFydFNpZ25hdHVyZURlZnNWZWN0b3IoYnVpbGRlciwgbGVuKHNlbGYuc2lnbmF0dXJlRGVmcykpCisgICAgICAgICAgICBmb3IgaSBpbiByZXZlcnNlZChyYW5nZShsZW4oc2VsZi5zaWduYXR1cmVEZWZzKSkpOgorICAgICAgICAgICAgICAgIGJ1aWxkZXIuUHJlcGVuZFVPZmZzZXRUUmVsYXRpdmUoc2lnbmF0dXJlRGVmc2xpc3RbaV0pCisgICAgICAgICAgICBzaWduYXR1cmVEZWZzID0gYnVpbGRlci5FbmRWZWN0b3IoKQorICAgICAgICBNb2RlbFN0YXJ0KGJ1aWxkZXIpCisgICAgICAgIE1vZGVsQWRkVmVyc2lvbihidWlsZGVyLCBzZWxmLnZlcnNpb24pCisgICAgICAgIGlmIHNlbGYub3BlcmF0b3JDb2RlcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIE1vZGVsQWRkT3BlcmF0b3JDb2RlcyhidWlsZGVyLCBvcGVyYXRvckNvZGVzKQorICAgICAgICBpZiBzZWxmLnN1YmdyYXBocyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIE1vZGVsQWRkU3ViZ3JhcGhzKGJ1aWxkZXIsIHN1YmdyYXBocykKKyAgICAgICAgaWYgc2VsZi5kZXNjcmlwdGlvbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIE1vZGVsQWRkRGVzY3JpcHRpb24oYnVpbGRlciwgZGVzY3JpcHRpb24pCisgICAgICAgIGlmIHNlbGYuYnVmZmVycyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIE1vZGVsQWRkQnVmZmVycyhidWlsZGVyLCBidWZmZXJzKQorICAgICAgICBpZiBzZWxmLm1ldGFkYXRhQnVmZmVyIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgTW9kZWxBZGRNZXRhZGF0YUJ1ZmZlcihidWlsZGVyLCBtZXRhZGF0YUJ1ZmZlcikKKyAgICAgICAgaWYgc2VsZi5tZXRhZGF0YSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIE1vZGVsQWRkTWV0YWRhdGEoYnVpbGRlciwgbWV0YWRhdGEpCisgICAgICAgIGlmIHNlbGYuc2lnbmF0dXJlRGVmcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIE1vZGVsQWRkU2lnbmF0dXJlRGVmcyhidWlsZGVyLCBzaWduYXR1cmVEZWZzKQorICAgICAgICBtb2RlbCA9IE1vZGVsRW5kKGJ1aWxkZXIpCisgICAgICAgIHJldHVybiBtb2RlbAogCi0jIG5hbWVzcGFjZTogdGZsaXRlCiAKLWZyb20gZmxhdGJ1ZmZlcnMuY29tcGF0IGltcG9ydCBpbXBvcnRfbnVtcHkKLW5wID0gaW1wb3J0X251bXB5KCkKLQotY2xhc3MgV2hlcmVPcHRpb25zKG9iamVjdCk6Ci0gICAgX19zbG90c19fID0gWydfdGFiJ10KLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgbiA9IGZsYXRidWZmZXJzLmVuY29kZS5HZXQoZmxhdGJ1ZmZlcnMucGFja2VyLnVvZmZzZXQsIGJ1Ziwgb2Zmc2V0KQotICAgICAgICB4ID0gV2hlcmVPcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNXaGVyZU9wdGlvbnMoY2xzLCBidWYsIG9mZnNldD0wKToKLSAgICAgICAgIiIiVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHN3aXRjaCB0byBHZXRSb290QXMuIiIiCi0gICAgICAgIHJldHVybiBjbHMuR2V0Um9vdEFzKGJ1Ziwgb2Zmc2V0KQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBXaGVyZU9wdGlvbnNCdWZmZXJIYXNJZGVudGlmaWVyKGNscywgYnVmLCBvZmZzZXQsIHNpemVfcHJlZml4ZWQ9RmFsc2UpOgotICAgICAgICByZXR1cm4gZmxhdGJ1ZmZlcnMudXRpbC5CdWZmZXJIYXNJZGVudGlmaWVyKGJ1Ziwgb2Zmc2V0LCBiIlx4NTRceDQ2XHg0Q1x4MzMiLCBzaXplX3ByZWZpeGVkPXNpemVfcHJlZml4ZWQpCi0KLSAgICAjIFdoZXJlT3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLWRlZiBXaGVyZU9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgwKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBXaGVyZU9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIFdoZXJlT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFdoZXJlT3B0aW9uc0VuZChidWlsZGVyKQotCi1jbGFzcyBXaGVyZU9wdGlvbnNUKG9iamVjdCk6Ci0KLSAgICAjIFdoZXJlT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgd2hlcmVPcHRpb25zID0gV2hlcmVPcHRpb25zKCkKLSAgICAgICAgd2hlcmVPcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmood2hlcmVPcHRpb25zKQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEluaXRGcm9tT2JqKGNscywgd2hlcmVPcHRpb25zKToKLSAgICAgICAgeCA9IFdoZXJlT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2sod2hlcmVPcHRpb25zKQotICAgICAgICByZXR1cm4geAotCi0gICAgIyBXaGVyZU9wdGlvbnNUCi0gICAgZGVmIF9VblBhY2soc2VsZiwgd2hlcmVPcHRpb25zKToKLSAgICAgICAgaWYgd2hlcmVPcHRpb25zIGlzIE5vbmU6Ci0gICAgICAgICAgICByZXR1cm4KLQotICAgICMgV2hlcmVPcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBXaGVyZU9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICB3aGVyZU9wdGlvbnMgPSBXaGVyZU9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIHdoZXJlT3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIFdoaWxlT3B0aW9ucyhvYmplY3QpOgotICAgIF9fc2xvdHNfXyA9IFsnX3RhYiddCi0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgIG4gPSBmbGF0YnVmZmVycy5lbmNvZGUuR2V0KGZsYXRidWZmZXJzLnBhY2tlci51b2Zmc2V0LCBidWYsIG9mZnNldCkKLSAgICAgICAgeCA9IFdoaWxlT3B0aW9ucygpCi0gICAgICAgIHguSW5pdChidWYsIG4gKyBvZmZzZXQpCi0gICAgICAgIHJldHVybiB4Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgR2V0Um9vdEFzV2hpbGVPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgV2hpbGVPcHRpb25zQnVmZmVySGFzSWRlbnRpZmllcihjbHMsIGJ1Ziwgb2Zmc2V0LCBzaXplX3ByZWZpeGVkPUZhbHNlKToKLSAgICAgICAgcmV0dXJuIGZsYXRidWZmZXJzLnV0aWwuQnVmZmVySGFzSWRlbnRpZmllcihidWYsIG9mZnNldCwgYiJceDU0XHg0Nlx4NENceDMzIiwgc2l6ZV9wcmVmaXhlZD1zaXplX3ByZWZpeGVkKQotCi0gICAgIyBXaGlsZU9wdGlvbnMKLSAgICBkZWYgSW5pdChzZWxmLCBidWYsIHBvcyk6Ci0gICAgICAgIHNlbGYuX3RhYiA9IGZsYXRidWZmZXJzLnRhYmxlLlRhYmxlKGJ1ZiwgcG9zKQotCi0gICAgIyBXaGlsZU9wdGlvbnMKLSAgICBkZWYgQ29uZFN1YmdyYXBoSW5kZXgoc2VsZik6Ci0gICAgICAgIG8gPSBmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuVU9mZnNldFRGbGFncy5weV90eXBlKHNlbGYuX3RhYi5PZmZzZXQoNCkpCi0gICAgICAgIGlmIG8gIT0gMDoKLSAgICAgICAgICAgIHJldHVybiBzZWxmLl90YWIuR2V0KGZsYXRidWZmZXJzLm51bWJlcl90eXBlcy5JbnQzMkZsYWdzLCBvICsgc2VsZi5fdGFiLlBvcykKLSAgICAgICAgcmV0dXJuIDAKLQotICAgICMgV2hpbGVPcHRpb25zCi0gICAgZGVmIEJvZHlTdWJncmFwaEluZGV4KHNlbGYpOgotICAgICAgICBvID0gZmxhdGJ1ZmZlcnMubnVtYmVyX3R5cGVzLlVPZmZzZXRURmxhZ3MucHlfdHlwZShzZWxmLl90YWIuT2Zmc2V0KDYpKQotICAgICAgICBpZiBvICE9IDA6Ci0gICAgICAgICAgICByZXR1cm4gc2VsZi5fdGFiLkdldChmbGF0YnVmZmVycy5udW1iZXJfdHlwZXMuSW50MzJGbGFncywgbyArIHNlbGYuX3RhYi5Qb3MpCi0gICAgICAgIHJldHVybiAwCi0KLWRlZiBXaGlsZU9wdGlvbnNTdGFydChidWlsZGVyKTogYnVpbGRlci5TdGFydE9iamVjdCgyKQotZGVmIFN0YXJ0KGJ1aWxkZXIpOgotICAgIHJldHVybiBXaGlsZU9wdGlvbnNTdGFydChidWlsZGVyKQotZGVmIFdoaWxlT3B0aW9uc0FkZENvbmRTdWJncmFwaEluZGV4KGJ1aWxkZXIsIGNvbmRTdWJncmFwaEluZGV4KTogYnVpbGRlci5QcmVwZW5kSW50MzJTbG90KDAsIGNvbmRTdWJncmFwaEluZGV4LCAwKQotZGVmIEFkZENvbmRTdWJncmFwaEluZGV4KGJ1aWxkZXIsIGNvbmRTdWJncmFwaEluZGV4KToKLSAgICByZXR1cm4gV2hpbGVPcHRpb25zQWRkQ29uZFN1YmdyYXBoSW5kZXgoYnVpbGRlciwgY29uZFN1YmdyYXBoSW5kZXgpCi1kZWYgV2hpbGVPcHRpb25zQWRkQm9keVN1YmdyYXBoSW5kZXgoYnVpbGRlciwgYm9keVN1YmdyYXBoSW5kZXgpOiBidWlsZGVyLlByZXBlbmRJbnQzMlNsb3QoMSwgYm9keVN1YmdyYXBoSW5kZXgsIDApCi1kZWYgQWRkQm9keVN1YmdyYXBoSW5kZXgoYnVpbGRlciwgYm9keVN1YmdyYXBoSW5kZXgpOgotICAgIHJldHVybiBXaGlsZU9wdGlvbnNBZGRCb2R5U3ViZ3JhcGhJbmRleChidWlsZGVyLCBib2R5U3ViZ3JhcGhJbmRleCkKLWRlZiBXaGlsZU9wdGlvbnNFbmQoYnVpbGRlcik6IHJldHVybiBidWlsZGVyLkVuZE9iamVjdCgpCi1kZWYgRW5kKGJ1aWxkZXIpOgotICAgIHJldHVybiBXaGlsZU9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgV2hpbGVPcHRpb25zVChvYmplY3QpOgotCi0gICAgIyBXaGlsZU9wdGlvbnNUCi0gICAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgICAgICBzZWxmLmNvbmRTdWJncmFwaEluZGV4ID0gMCAgIyB0eXBlOiBpbnQKLSAgICAgICAgc2VsZi5ib2R5U3ViZ3JhcGhJbmRleCA9IDAgICMgdHlwZTogaW50Ci0KLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgSW5pdEZyb21CdWYoY2xzLCBidWYsIHBvcyk6Ci0gICAgICAgIHdoaWxlT3B0aW9ucyA9IFdoaWxlT3B0aW9ucygpCi0gICAgICAgIHdoaWxlT3B0aW9ucy5Jbml0KGJ1ZiwgcG9zKQotICAgICAgICByZXR1cm4gY2xzLkluaXRGcm9tT2JqKHdoaWxlT3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHdoaWxlT3B0aW9ucyk6Ci0gICAgICAgIHggPSBXaGlsZU9wdGlvbnNUKCkKLSAgICAgICAgeC5fVW5QYWNrKHdoaWxlT3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgV2hpbGVPcHRpb25zVAotICAgIGRlZiBfVW5QYWNrKHNlbGYsIHdoaWxlT3B0aW9ucyk6Ci0gICAgICAgIGlmIHdoaWxlT3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgIHNlbGYuY29uZFN1YmdyYXBoSW5kZXggPSB3aGlsZU9wdGlvbnMuQ29uZFN1YmdyYXBoSW5kZXgoKQotICAgICAgICBzZWxmLmJvZHlTdWJncmFwaEluZGV4ID0gd2hpbGVPcHRpb25zLkJvZHlTdWJncmFwaEluZGV4KCkKLQotICAgICMgV2hpbGVPcHRpb25zVAotICAgIGRlZiBQYWNrKHNlbGYsIGJ1aWxkZXIpOgotICAgICAgICBXaGlsZU9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICBXaGlsZU9wdGlvbnNBZGRDb25kU3ViZ3JhcGhJbmRleChidWlsZGVyLCBzZWxmLmNvbmRTdWJncmFwaEluZGV4KQotICAgICAgICBXaGlsZU9wdGlvbnNBZGRCb2R5U3ViZ3JhcGhJbmRleChidWlsZGVyLCBzZWxmLmJvZHlTdWJncmFwaEluZGV4KQotICAgICAgICB3aGlsZU9wdGlvbnMgPSBXaGlsZU9wdGlvbnNFbmQoYnVpbGRlcikKLSAgICAgICAgcmV0dXJuIHdoaWxlT3B0aW9ucwotIyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieSB0aGUgRmxhdEJ1ZmZlcnMgY29tcGlsZXIsIGRvIG5vdCBtb2RpZnkKLQotIyBuYW1lc3BhY2U6IHRmbGl0ZQotCi1mcm9tIGZsYXRidWZmZXJzLmNvbXBhdCBpbXBvcnQgaW1wb3J0X251bXB5Ci1ucCA9IGltcG9ydF9udW1weSgpCi0KLWNsYXNzIFplcm9zTGlrZU9wdGlvbnMob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSBbJ190YWInXQotCi0gICAgQGNsYXNzbWV0aG9kCi0gICAgZGVmIEdldFJvb3RBcyhjbHMsIGJ1Ziwgb2Zmc2V0PTApOgotICAgICAgICBuID0gZmxhdGJ1ZmZlcnMuZW5jb2RlLkdldChmbGF0YnVmZmVycy5wYWNrZXIudW9mZnNldCwgYnVmLCBvZmZzZXQpCi0gICAgICAgIHggPSBaZXJvc0xpa2VPcHRpb25zKCkKLSAgICAgICAgeC5Jbml0KGJ1ZiwgbiArIG9mZnNldCkKLSAgICAgICAgcmV0dXJuIHgKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBHZXRSb290QXNaZXJvc0xpa2VPcHRpb25zKGNscywgYnVmLCBvZmZzZXQ9MCk6Ci0gICAgICAgICIiIlRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSBzd2l0Y2ggdG8gR2V0Um9vdEFzLiIiIgotICAgICAgICByZXR1cm4gY2xzLkdldFJvb3RBcyhidWYsIG9mZnNldCkKLSAgICBAY2xhc3NtZXRob2QKLSAgICBkZWYgWmVyb3NMaWtlT3B0aW9uc0J1ZmZlckhhc0lkZW50aWZpZXIoY2xzLCBidWYsIG9mZnNldCwgc2l6ZV9wcmVmaXhlZD1GYWxzZSk6Ci0gICAgICAgIHJldHVybiBmbGF0YnVmZmVycy51dGlsLkJ1ZmZlckhhc0lkZW50aWZpZXIoYnVmLCBvZmZzZXQsIGIiXHg1NFx4NDZceDRDXHgzMyIsIHNpemVfcHJlZml4ZWQ9c2l6ZV9wcmVmaXhlZCkKLQotICAgICMgWmVyb3NMaWtlT3B0aW9ucwotICAgIGRlZiBJbml0KHNlbGYsIGJ1ZiwgcG9zKToKLSAgICAgICAgc2VsZi5fdGFiID0gZmxhdGJ1ZmZlcnMudGFibGUuVGFibGUoYnVmLCBwb3MpCi0KLWRlZiBaZXJvc0xpa2VPcHRpb25zU3RhcnQoYnVpbGRlcik6IGJ1aWxkZXIuU3RhcnRPYmplY3QoMCkKLWRlZiBTdGFydChidWlsZGVyKToKLSAgICByZXR1cm4gWmVyb3NMaWtlT3B0aW9uc1N0YXJ0KGJ1aWxkZXIpCi1kZWYgWmVyb3NMaWtlT3B0aW9uc0VuZChidWlsZGVyKTogcmV0dXJuIGJ1aWxkZXIuRW5kT2JqZWN0KCkKLWRlZiBFbmQoYnVpbGRlcik6Ci0gICAgcmV0dXJuIFplcm9zTGlrZU9wdGlvbnNFbmQoYnVpbGRlcikKLQotY2xhc3MgWmVyb3NMaWtlT3B0aW9uc1Qob2JqZWN0KToKLQotICAgICMgWmVyb3NMaWtlT3B0aW9uc1QKLSAgICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgICAgIHBhc3MKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbUJ1ZihjbHMsIGJ1ZiwgcG9zKToKLSAgICAgICAgemVyb3NMaWtlT3B0aW9ucyA9IFplcm9zTGlrZU9wdGlvbnMoKQotICAgICAgICB6ZXJvc0xpa2VPcHRpb25zLkluaXQoYnVmLCBwb3MpCi0gICAgICAgIHJldHVybiBjbHMuSW5pdEZyb21PYmooemVyb3NMaWtlT3B0aW9ucykKLQotICAgIEBjbGFzc21ldGhvZAotICAgIGRlZiBJbml0RnJvbU9iaihjbHMsIHplcm9zTGlrZU9wdGlvbnMpOgotICAgICAgICB4ID0gWmVyb3NMaWtlT3B0aW9uc1QoKQotICAgICAgICB4Ll9VblBhY2soemVyb3NMaWtlT3B0aW9ucykKLSAgICAgICAgcmV0dXJuIHgKLQotICAgICMgWmVyb3NMaWtlT3B0aW9uc1QKLSAgICBkZWYgX1VuUGFjayhzZWxmLCB6ZXJvc0xpa2VPcHRpb25zKToKLSAgICAgICAgaWYgemVyb3NMaWtlT3B0aW9ucyBpcyBOb25lOgotICAgICAgICAgICAgcmV0dXJuCi0KLSAgICAjIFplcm9zTGlrZU9wdGlvbnNUCi0gICAgZGVmIFBhY2soc2VsZiwgYnVpbGRlcik6Ci0gICAgICAgIFplcm9zTGlrZU9wdGlvbnNTdGFydChidWlsZGVyKQotICAgICAgICB6ZXJvc0xpa2VPcHRpb25zID0gWmVyb3NMaWtlT3B0aW9uc0VuZChidWlsZGVyKQotICAgICAgICByZXR1cm4gemVyb3NMaWtlT3B0aW9ucwpkaWZmIC0tZ2l0IGEvdGVuc29yZmxvdy9saXRlL3NjaGVtYS9CVUlMRCBiL3RlbnNvcmZsb3cvbGl0ZS9zY2hlbWEvQlVJTEQKaW5kZXggZTg3Mzc1YS4uMTk5YzEwNSAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL3NjaGVtYS9CVUlMRAorKysgYi90ZW5zb3JmbG93L2xpdGUvc2NoZW1hL0JVSUxECkBAIC0xMSwxMyArMTEsMTMgQEAKICMgYmF6ZWwgYnVpbGQgc2NoZW1hX2Zic19zcmNzLgogZmxhdGJ1ZmZlcl9jY19saWJyYXJ5KAogICAgIG5hbWUgPSAic2NoZW1hX2ZicyIsCi0gICAgc3JjcyA9IFsic2NoZW1hLmZicyJdLAorICAgIHNyY3MgPSBbIi8vdGVuc29yZmxvdy9jb21waWxlci9tbGlyL2xpdGUvc2NoZW1hOnNjaGVtYS5mYnMiXSwKICkKIAogIyBHZW5lcmljIHNjaGVtYSBmb3IgaW5mZXJlbmNlIG9uIGRldmljZSAoYnV0IHdpdGggcmVmbGVjdGlvbnMgbWFrZXMgYmlnZ2VyKS4KIGZsYXRidWZmZXJfY2NfbGlicmFyeSgKICAgICBuYW1lID0gInNjaGVtYV9mYnNfd2l0aF9yZWZsZWN0aW9uIiwKLSAgICBzcmNzID0gWyJzY2hlbWEuZmJzIl0sCisgICAgc3JjcyA9IFsiLy90ZW5zb3JmbG93L2NvbXBpbGVyL21saXIvbGl0ZS9zY2hlbWE6c2NoZW1hLmZicyJdLAogICAgIGZsYXRjX2FyZ3MgPSBbCiAgICAgICAgICItLXJlZmxlY3QtdHlwZXMiLAogICAgICAgICAiLS1yZWZsZWN0LW5hbWVzIiwKQEAgLTI5LDExICsyOSw4IEBACiAKIGNjX2xpYnJhcnkoCiAgICAgbmFtZSA9ICJzY2hlbWFfdXRpbHMiLAotICAgIHNyY3MgPSBbInNjaGVtYV91dGlscy5jYyJdLAogICAgIGhkcnMgPSBbInNjaGVtYV91dGlscy5oIl0sCiAgICAgZGVwcyA9IFsKLSAgICAgICAgIjpzY2hlbWFfZmJzIiwKLSAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL2tlcm5lbHMvaW50ZXJuYWw6Y29tcGF0aWJpbGl0eSIsCi0gICAgICAgICJAZmxhdGJ1ZmZlcnMvLzpydW50aW1lX2NjIiwKKyAgICAgICAgIi8vdGVuc29yZmxvdy9jb21waWxlci9tbGlyL2xpdGUvc2NoZW1hOnNjaGVtYV91dGlscyIsCiAgICAgXSwKICkKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9zY2hlbWEvc2NoZW1hX2dlbmVyYXRlZC5oIGIvdGVuc29yZmxvdy9saXRlL3NjaGVtYS9zY2hlbWFfZ2VuZXJhdGVkLmgKaW5kZXggYzlkOTJmOC4uZDcyODYxNyAxMDA3NTUKLS0tIGEvdGVuc29yZmxvdy9saXRlL3NjaGVtYS9zY2hlbWFfZ2VuZXJhdGVkLmgKKysrIGIvdGVuc29yZmxvdy9saXRlL3NjaGVtYS9zY2hlbWFfZ2VuZXJhdGVkLmgKQEAgLTgsOSArOCw5IEBACiAKIC8vIEVuc3VyZSB0aGUgaW5jbHVkZWQgZmxhdGJ1ZmZlcnMuaCBpcyB0aGUgc2FtZSB2ZXJzaW9uIGFzIHdoZW4gdGhpcyBmaWxlIHdhcwogLy8gZ2VuZXJhdGVkLCBvdGhlcndpc2UgaXQgbWF5IG5vdCBiZSBjb21wYXRpYmxlLgotc3RhdGljX2Fzc2VydChGTEFUQlVGRkVSU19WRVJTSU9OX01BSk9SID09IDIgJiYKLSAgICAgICAgICAgICAgRkxBVEJVRkZFUlNfVkVSU0lPTl9NSU5PUiA9PSAwICYmCi0gICAgICAgICAgICAgIEZMQVRCVUZGRVJTX1ZFUlNJT05fUkVWSVNJT04gPT0gNiwKK3N0YXRpY19hc3NlcnQoRkxBVEJVRkZFUlNfVkVSU0lPTl9NQUpPUiA9PSAyMyAmJgorICAgICAgICAgICAgICBGTEFUQlVGRkVSU19WRVJTSU9OX01JTk9SID09IDUgJiYKKyAgICAgICAgICAgICAgRkxBVEJVRkZFUlNfVkVSU0lPTl9SRVZJU0lPTiA9PSAyNiwKICAgICAgICAgICAgICAiTm9uLWNvbXBhdGlibGUgZmxhdGJ1ZmZlcnMgdmVyc2lvbiBpbmNsdWRlZCIpOwogCiBuYW1lc3BhY2UgdGZsaXRlIHsKQEAgLTUxLDYgKzUxLDc4IEBACiBzdHJ1Y3QgVGVuc29yQnVpbGRlcjsKIHN0cnVjdCBUZW5zb3JUOwogCitzdHJ1Y3QgU3RhYmxlaGxvR2F0aGVyT3B0aW9uczsKK3N0cnVjdCBTdGFibGVobG9HYXRoZXJPcHRpb25zQnVpbGRlcjsKK3N0cnVjdCBTdGFibGVobG9HYXRoZXJPcHRpb25zVDsKKworc3RydWN0IFN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnM7CitzdHJ1Y3QgU3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9uc0J1aWxkZXI7CitzdHJ1Y3QgU3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9uc1Q7CisKK3N0cnVjdCBTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9uczsKK3N0cnVjdCBTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9uc0J1aWxkZXI7CitzdHJ1Y3QgU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnNUOworCitzdHJ1Y3QgU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9uczsKK3N0cnVjdCBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zQnVpbGRlcjsKK3N0cnVjdCBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zVDsKKworc3RydWN0IFN0YWJsZWhsb1doaWxlT3B0aW9uczsKK3N0cnVjdCBTdGFibGVobG9XaGlsZU9wdGlvbnNCdWlsZGVyOworc3RydWN0IFN0YWJsZWhsb1doaWxlT3B0aW9uc1Q7CisKK3N0cnVjdCBTdGFibGVobG9Tb3J0T3B0aW9uczsKK3N0cnVjdCBTdGFibGVobG9Tb3J0T3B0aW9uc0J1aWxkZXI7CitzdHJ1Y3QgU3RhYmxlaGxvU29ydE9wdGlvbnNUOworCitzdHJ1Y3QgU3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zOworc3RydWN0IFN0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9uc0J1aWxkZXI7CitzdHJ1Y3QgU3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zVDsKKworc3RydWN0IFN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9uczsKK3N0cnVjdCBTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnNCdWlsZGVyOworc3RydWN0IFN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9uc1Q7CisKK3N0cnVjdCBTdGFibGVobG9Db21wYXJlT3B0aW9uczsKK3N0cnVjdCBTdGFibGVobG9Db21wYXJlT3B0aW9uc0J1aWxkZXI7CitzdHJ1Y3QgU3RhYmxlaGxvQ29tcGFyZU9wdGlvbnNUOworCitzdHJ1Y3QgU3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9uczsKK3N0cnVjdCBTdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zQnVpbGRlcjsKK3N0cnVjdCBTdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zVDsKKworc3RydWN0IFN0YWJsZWhsb1BhZE9wdGlvbnM7CitzdHJ1Y3QgU3RhYmxlaGxvUGFkT3B0aW9uc0J1aWxkZXI7CitzdHJ1Y3QgU3RhYmxlaGxvUGFkT3B0aW9uc1Q7CisKK3N0cnVjdCBTdGFibGVobG9Jb3RhT3B0aW9uczsKK3N0cnVjdCBTdGFibGVobG9Jb3RhT3B0aW9uc0J1aWxkZXI7CitzdHJ1Y3QgU3RhYmxlaGxvSW90YU9wdGlvbnNUOworCitzdHJ1Y3QgU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnM7CitzdHJ1Y3QgU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnNCdWlsZGVyOworc3RydWN0IFN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zVDsKKworc3RydWN0IFN0YWJsZWhsb1JlZHVjZU9wdGlvbnM7CitzdHJ1Y3QgU3RhYmxlaGxvUmVkdWNlT3B0aW9uc0J1aWxkZXI7CitzdHJ1Y3QgU3RhYmxlaGxvUmVkdWNlT3B0aW9uc1Q7CisKK3N0cnVjdCBTdGFibGVobG9TbGljZU9wdGlvbnM7CitzdHJ1Y3QgU3RhYmxlaGxvU2xpY2VPcHRpb25zQnVpbGRlcjsKK3N0cnVjdCBTdGFibGVobG9TbGljZU9wdGlvbnNUOworCitzdHJ1Y3QgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zOworc3RydWN0IFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc0J1aWxkZXI7CitzdHJ1Y3QgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zVDsKKworc3RydWN0IFN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zOworc3RydWN0IFN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zQnVpbGRlcjsKK3N0cnVjdCBTdGFibGVobG9TY2F0dGVyT3B0aW9uc1Q7CisKK3N0cnVjdCBTdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zOworc3RydWN0IFN0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnNCdWlsZGVyOworc3RydWN0IFN0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnNUOworCiBzdHJ1Y3QgQ29udjJET3B0aW9uczsKIHN0cnVjdCBDb252MkRPcHRpb25zQnVpbGRlcjsKIHN0cnVjdCBDb252MkRPcHRpb25zVDsKQEAgLTU1NSwxMCArNjI3LDIyIEBACiBzdHJ1Y3QgUmlnaHRTaGlmdE9wdGlvbnNCdWlsZGVyOwogc3RydWN0IFJpZ2h0U2hpZnRPcHRpb25zVDsKIAorc3RydWN0IERpbGF0ZU9wdGlvbnM7CitzdHJ1Y3QgRGlsYXRlT3B0aW9uc0J1aWxkZXI7CitzdHJ1Y3QgRGlsYXRlT3B0aW9uc1Q7CisKK3N0cnVjdCBSZWR1Y2VXaW5kb3dPcHRpb25zOworc3RydWN0IFJlZHVjZVdpbmRvd09wdGlvbnNCdWlsZGVyOworc3RydWN0IFJlZHVjZVdpbmRvd09wdGlvbnNUOworCiBzdHJ1Y3QgT3BlcmF0b3JDb2RlOwogc3RydWN0IE9wZXJhdG9yQ29kZUJ1aWxkZXI7CiBzdHJ1Y3QgT3BlcmF0b3JDb2RlVDsKIAorc3RydWN0IFN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnM7CitzdHJ1Y3QgU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9uc0J1aWxkZXI7CitzdHJ1Y3QgU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9uc1Q7CisKIHN0cnVjdCBPcGVyYXRvcjsKIHN0cnVjdCBPcGVyYXRvckJ1aWxkZXI7CiBzdHJ1Y3QgT3BlcmF0b3JUOwpAQCAtNjA2LDExICs2OTAsMTIgQEAKICAgVGVuc29yVHlwZV9VSU5UMzIgPSAxNSwKICAgVGVuc29yVHlwZV9VSU5UMTYgPSAxNiwKICAgVGVuc29yVHlwZV9JTlQ0ID0gMTcsCisgIFRlbnNvclR5cGVfQkZMT0FUMTYgPSAxOCwKICAgVGVuc29yVHlwZV9NSU4gPSBUZW5zb3JUeXBlX0ZMT0FUMzIsCi0gIFRlbnNvclR5cGVfTUFYID0gVGVuc29yVHlwZV9JTlQ0CisgIFRlbnNvclR5cGVfTUFYID0gVGVuc29yVHlwZV9CRkxPQVQxNgogfTsKIAotaW5saW5lIGNvbnN0IFRlbnNvclR5cGUgKCZFbnVtVmFsdWVzVGVuc29yVHlwZSgpKVsxOF0geworaW5saW5lIGNvbnN0IFRlbnNvclR5cGUgKCZFbnVtVmFsdWVzVGVuc29yVHlwZSgpKVsxOV0gewogICBzdGF0aWMgY29uc3QgVGVuc29yVHlwZSB2YWx1ZXNbXSA9IHsKICAgICBUZW5zb3JUeXBlX0ZMT0FUMzIsCiAgICAgVGVuc29yVHlwZV9GTE9BVDE2LApAQCAtNjI5LDEzICs3MTQsMTQgQEAKICAgICBUZW5zb3JUeXBlX1ZBUklBTlQsCiAgICAgVGVuc29yVHlwZV9VSU5UMzIsCiAgICAgVGVuc29yVHlwZV9VSU5UMTYsCi0gICAgVGVuc29yVHlwZV9JTlQ0CisgICAgVGVuc29yVHlwZV9JTlQ0LAorICAgIFRlbnNvclR5cGVfQkZMT0FUMTYKICAgfTsKICAgcmV0dXJuIHZhbHVlczsKIH0KIAogaW5saW5lIGNvbnN0IGNoYXIgKiBjb25zdCAqRW51bU5hbWVzVGVuc29yVHlwZSgpIHsKLSAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lc1sxOV0gPSB7CisgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFtZXNbMjBdID0gewogICAgICJGTE9BVDMyIiwKICAgICAiRkxPQVQxNiIsCiAgICAgIklOVDMyIiwKQEAgLTY1NCwxMyArNzQwLDE0IEBACiAgICAgIlVJTlQzMiIsCiAgICAgIlVJTlQxNiIsCiAgICAgIklOVDQiLAorICAgICJCRkxPQVQxNiIsCiAgICAgbnVsbHB0cgogICB9OwogICByZXR1cm4gbmFtZXM7CiB9CiAKIGlubGluZSBjb25zdCBjaGFyICpFbnVtTmFtZVRlbnNvclR5cGUoVGVuc29yVHlwZSBlKSB7Ci0gIGlmIChmbGF0YnVmZmVyczo6SXNPdXRSYW5nZShlLCBUZW5zb3JUeXBlX0ZMT0FUMzIsIFRlbnNvclR5cGVfSU5UNCkpIHJldHVybiAiIjsKKyAgaWYgKDo6ZmxhdGJ1ZmZlcnM6OklzT3V0UmFuZ2UoZSwgVGVuc29yVHlwZV9GTE9BVDMyLCBUZW5zb3JUeXBlX0JGTE9BVDE2KSkgcmV0dXJuICIiOwogICBjb25zdCBzaXplX3QgaW5kZXggPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGUpOwogICByZXR1cm4gRW51bU5hbWVzVGVuc29yVHlwZSgpW2luZGV4XTsKIH0KQEAgLTY5MCw3ICs3NzcsNyBAQAogfQogCiBpbmxpbmUgY29uc3QgY2hhciAqRW51bU5hbWVRdWFudGl6YXRpb25EZXRhaWxzKFF1YW50aXphdGlvbkRldGFpbHMgZSkgewotICBpZiAoZmxhdGJ1ZmZlcnM6OklzT3V0UmFuZ2UoZSwgUXVhbnRpemF0aW9uRGV0YWlsc19OT05FLCBRdWFudGl6YXRpb25EZXRhaWxzX0N1c3RvbVF1YW50aXphdGlvbikpIHJldHVybiAiIjsKKyAgaWYgKDo6ZmxhdGJ1ZmZlcnM6OklzT3V0UmFuZ2UoZSwgUXVhbnRpemF0aW9uRGV0YWlsc19OT05FLCBRdWFudGl6YXRpb25EZXRhaWxzX0N1c3RvbVF1YW50aXphdGlvbikpIHJldHVybiAiIjsKICAgY29uc3Qgc2l6ZV90IGluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihlKTsKICAgcmV0dXJuIEVudW1OYW1lc1F1YW50aXphdGlvbkRldGFpbHMoKVtpbmRleF07CiB9CkBAIC03MzgsOCArODI1LDggQEAKICAgICB9CiAgIH0KIAotICBzdGF0aWMgdm9pZCAqVW5QYWNrKGNvbnN0IHZvaWQgKm9iaiwgUXVhbnRpemF0aW9uRGV0YWlscyB0eXBlLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqcmVzb2x2ZXIpOwotICBmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyB2b2lkICpVblBhY2soY29uc3Qgdm9pZCAqb2JqLCBRdWFudGl6YXRpb25EZXRhaWxzIHR5cGUsIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKnJlc29sdmVyKTsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpIGNvbnN0OwogCiAgIHRmbGl0ZTo6Q3VzdG9tUXVhbnRpemF0aW9uVCAqQXNDdXN0b21RdWFudGl6YXRpb24oKSB7CiAgICAgcmV0dXJuIHR5cGUgPT0gUXVhbnRpemF0aW9uRGV0YWlsc19DdXN0b21RdWFudGl6YXRpb24gPwpAQCAtNzUxLDggKzgzOCw4IEBACiAgIH0KIH07CiAKLWJvb2wgVmVyaWZ5UXVhbnRpemF0aW9uRGV0YWlscyhmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyLCBjb25zdCB2b2lkICpvYmosIFF1YW50aXphdGlvbkRldGFpbHMgdHlwZSk7Ci1ib29sIFZlcmlmeVF1YW50aXphdGlvbkRldGFpbHNWZWN0b3IoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllciwgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+PiAqdmFsdWVzLCBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICp0eXBlcyk7Citib29sIFZlcmlmeVF1YW50aXphdGlvbkRldGFpbHMoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyLCBjb25zdCB2b2lkICpvYmosIFF1YW50aXphdGlvbkRldGFpbHMgdHlwZSk7Citib29sIFZlcmlmeVF1YW50aXphdGlvbkRldGFpbHNWZWN0b3IoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyLCBjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8OjpmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+PiAqdmFsdWVzLCBjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKnR5cGVzKTsKIAogZW51bSBEaW1lbnNpb25UeXBlIDogaW50OF90IHsKICAgRGltZW5zaW9uVHlwZV9ERU5TRSA9IDAsCkBAIC03NzksNyArODY2LDcgQEAKIH0KIAogaW5saW5lIGNvbnN0IGNoYXIgKkVudW1OYW1lRGltZW5zaW9uVHlwZShEaW1lbnNpb25UeXBlIGUpIHsKLSAgaWYgKGZsYXRidWZmZXJzOjpJc091dFJhbmdlKGUsIERpbWVuc2lvblR5cGVfREVOU0UsIERpbWVuc2lvblR5cGVfU1BBUlNFX0NTUikpIHJldHVybiAiIjsKKyAgaWYgKDo6ZmxhdGJ1ZmZlcnM6OklzT3V0UmFuZ2UoZSwgRGltZW5zaW9uVHlwZV9ERU5TRSwgRGltZW5zaW9uVHlwZV9TUEFSU0VfQ1NSKSkgcmV0dXJuICIiOwogICBjb25zdCBzaXplX3QgaW5kZXggPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGUpOwogICByZXR1cm4gRW51bU5hbWVzRGltZW5zaW9uVHlwZSgpW2luZGV4XTsKIH0KQEAgLTgxNSw3ICs5MDIsNyBAQAogfQogCiBpbmxpbmUgY29uc3QgY2hhciAqRW51bU5hbWVTcGFyc2VJbmRleFZlY3RvcihTcGFyc2VJbmRleFZlY3RvciBlKSB7Ci0gIGlmIChmbGF0YnVmZmVyczo6SXNPdXRSYW5nZShlLCBTcGFyc2VJbmRleFZlY3Rvcl9OT05FLCBTcGFyc2VJbmRleFZlY3Rvcl9VaW50OFZlY3RvcikpIHJldHVybiAiIjsKKyAgaWYgKDo6ZmxhdGJ1ZmZlcnM6OklzT3V0UmFuZ2UoZSwgU3BhcnNlSW5kZXhWZWN0b3JfTk9ORSwgU3BhcnNlSW5kZXhWZWN0b3JfVWludDhWZWN0b3IpKSByZXR1cm4gIiI7CiAgIGNvbnN0IHNpemVfdCBpbmRleCA9IHN0YXRpY19jYXN0PHNpemVfdD4oZSk7CiAgIHJldHVybiBFbnVtTmFtZXNTcGFyc2VJbmRleFZlY3RvcigpW2luZGV4XTsKIH0KQEAgLTg3OSw4ICs5NjYsOCBAQAogICAgIH0KICAgfQogCi0gIHN0YXRpYyB2b2lkICpVblBhY2soY29uc3Qgdm9pZCAqb2JqLCBTcGFyc2VJbmRleFZlY3RvciB0eXBlLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqcmVzb2x2ZXIpOwotICBmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyB2b2lkICpVblBhY2soY29uc3Qgdm9pZCAqb2JqLCBTcGFyc2VJbmRleFZlY3RvciB0eXBlLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpyZXNvbHZlcik7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKSBjb25zdDsKIAogICB0ZmxpdGU6OkludDMyVmVjdG9yVCAqQXNJbnQzMlZlY3RvcigpIHsKICAgICByZXR1cm4gdHlwZSA9PSBTcGFyc2VJbmRleFZlY3Rvcl9JbnQzMlZlY3RvciA/CkBAIC05MDgsOCArOTk1LDggQEAKICAgfQogfTsKIAotYm9vbCBWZXJpZnlTcGFyc2VJbmRleFZlY3RvcihmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyLCBjb25zdCB2b2lkICpvYmosIFNwYXJzZUluZGV4VmVjdG9yIHR5cGUpOwotYm9vbCBWZXJpZnlTcGFyc2VJbmRleFZlY3RvclZlY3RvcihmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyLCBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4+ICp2YWx1ZXMsIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKnR5cGVzKTsKK2Jvb2wgVmVyaWZ5U3BhcnNlSW5kZXhWZWN0b3IoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyLCBjb25zdCB2b2lkICpvYmosIFNwYXJzZUluZGV4VmVjdG9yIHR5cGUpOworYm9vbCBWZXJpZnlTcGFyc2VJbmRleFZlY3RvclZlY3Rvcig6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIsIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4+ICp2YWx1ZXMsIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqdHlwZXMpOwogCiBlbnVtIEJ1aWx0aW5PcGVyYXRvciA6IGludDMyX3QgewogICBCdWlsdGluT3BlcmF0b3JfQUREID0gMCwKQEAgLTEwNzQsMTEgKzExNjEsNTYgQEAKICAgQnVpbHRpbk9wZXJhdG9yX0JJVENBU1QgPSAxNTksCiAgIEJ1aWx0aW5PcGVyYXRvcl9CSVRXSVNFX1hPUiA9IDE2MCwKICAgQnVpbHRpbk9wZXJhdG9yX1JJR0hUX1NISUZUID0gMTYxLAorICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0xPR0lTVElDID0gMTYyLAorICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0FERCA9IDE2MywKKyAgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19ESVZJREUgPSAxNjQsCisgIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fTVVMVElQTFkgPSAxNjUsCisgIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fTUFYSU1VTSA9IDE2NiwKKyAgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19SRVNIQVBFID0gMTY3LAorICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0NMQU1QID0gMTY4LAorICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0NPTkNBVEVOQVRFID0gMTY5LAorICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0JST0FEQ0FTVF9JTl9ESU0gPSAxNzAsCisgIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fQ09OVk9MVVRJT04gPSAxNzEsCisgIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fU0xJQ0UgPSAxNzIsCisgIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fQ1VTVE9NX0NBTEwgPSAxNzMsCisgIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fUkVEVUNFID0gMTc0LAorICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0FCUyA9IDE3NSwKKyAgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19BTkQgPSAxNzYsCisgIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fQ09TSU5FID0gMTc3LAorICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0VYUE9ORU5USUFMID0gMTc4LAorICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0ZMT09SID0gMTc5LAorICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0xPRyA9IDE4MCwKKyAgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19NSU5JTVVNID0gMTgxLAorICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX05FR0FURSA9IDE4MiwKKyAgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19PUiA9IDE4MywKKyAgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19QT1dFUiA9IDE4NCwKKyAgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19SRU1BSU5ERVIgPSAxODUsCisgIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fUlNRUlQgPSAxODYsCisgIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fU0VMRUNUID0gMTg3LAorICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX1NVQlRSQUNUID0gMTg4LAorICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX1RBTkggPSAxODksCisgIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fU0NBVFRFUiA9IDE5MCwKKyAgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19DT01QQVJFID0gMTkxLAorICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0NPTlZFUlQgPSAxOTIsCisgIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fRFlOQU1JQ19TTElDRSA9IDE5MywKKyAgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19EWU5BTUlDX1VQREFURV9TTElDRSA9IDE5NCwKKyAgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19QQUQgPSAxOTUsCisgIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fSU9UQSA9IDE5NiwKKyAgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19ET1RfR0VORVJBTCA9IDE5NywKKyAgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19SRURVQ0VfV0lORE9XID0gMTk4LAorICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX1NPUlQgPSAxOTksCisgIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fV0hJTEUgPSAyMDAsCisgIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fR0FUSEVSID0gMjAxLAorICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX1RSQU5TUE9TRSA9IDIwMiwKKyAgQnVpbHRpbk9wZXJhdG9yX0RJTEFURSA9IDIwMywKKyAgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19STkdfQklUX0dFTkVSQVRPUiA9IDIwNCwKKyAgQnVpbHRpbk9wZXJhdG9yX1JFRFVDRV9XSU5ET1cgPSAyMDUsCisgIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fQ09NUE9TSVRFID0gMjA2LAogICBCdWlsdGluT3BlcmF0b3JfTUlOID0gQnVpbHRpbk9wZXJhdG9yX0FERCwKLSAgQnVpbHRpbk9wZXJhdG9yX01BWCA9IEJ1aWx0aW5PcGVyYXRvcl9SSUdIVF9TSElGVAorICBCdWlsdGluT3BlcmF0b3JfTUFYID0gQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19DT01QT1NJVEUKIH07CiAKLWlubGluZSBjb25zdCBCdWlsdGluT3BlcmF0b3IgKCZFbnVtVmFsdWVzQnVpbHRpbk9wZXJhdG9yKCkpWzE2Ml0geworaW5saW5lIGNvbnN0IEJ1aWx0aW5PcGVyYXRvciAoJkVudW1WYWx1ZXNCdWlsdGluT3BlcmF0b3IoKSlbMjA3XSB7CiAgIHN0YXRpYyBjb25zdCBCdWlsdGluT3BlcmF0b3IgdmFsdWVzW10gPSB7CiAgICAgQnVpbHRpbk9wZXJhdG9yX0FERCwKICAgICBCdWlsdGluT3BlcmF0b3JfQVZFUkFHRV9QT09MXzJELApAQCAtMTI0MSwxMyArMTM3Myw1OCBAQAogICAgIEJ1aWx0aW5PcGVyYXRvcl9TSUdOLAogICAgIEJ1aWx0aW5PcGVyYXRvcl9CSVRDQVNULAogICAgIEJ1aWx0aW5PcGVyYXRvcl9CSVRXSVNFX1hPUiwKLSAgICBCdWlsdGluT3BlcmF0b3JfUklHSFRfU0hJRlQKKyAgICBCdWlsdGluT3BlcmF0b3JfUklHSFRfU0hJRlQsCisgICAgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19MT0dJU1RJQywKKyAgICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0FERCwKKyAgICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0RJVklERSwKKyAgICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX01VTFRJUExZLAorICAgIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fTUFYSU1VTSwKKyAgICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX1JFU0hBUEUsCisgICAgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19DTEFNUCwKKyAgICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0NPTkNBVEVOQVRFLAorICAgIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fQlJPQURDQVNUX0lOX0RJTSwKKyAgICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0NPTlZPTFVUSU9OLAorICAgIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fU0xJQ0UsCisgICAgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19DVVNUT01fQ0FMTCwKKyAgICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX1JFRFVDRSwKKyAgICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0FCUywKKyAgICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0FORCwKKyAgICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0NPU0lORSwKKyAgICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0VYUE9ORU5USUFMLAorICAgIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fRkxPT1IsCisgICAgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19MT0csCisgICAgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19NSU5JTVVNLAorICAgIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fTkVHQVRFLAorICAgIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fT1IsCisgICAgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19QT1dFUiwKKyAgICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX1JFTUFJTkRFUiwKKyAgICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX1JTUVJULAorICAgIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fU0VMRUNULAorICAgIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fU1VCVFJBQ1QsCisgICAgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19UQU5ILAorICAgIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fU0NBVFRFUiwKKyAgICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0NPTVBBUkUsCisgICAgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19DT05WRVJULAorICAgIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fRFlOQU1JQ19TTElDRSwKKyAgICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0RZTkFNSUNfVVBEQVRFX1NMSUNFLAorICAgIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fUEFELAorICAgIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fSU9UQSwKKyAgICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0RPVF9HRU5FUkFMLAorICAgIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fUkVEVUNFX1dJTkRPVywKKyAgICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX1NPUlQsCisgICAgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19XSElMRSwKKyAgICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX0dBVEhFUiwKKyAgICBCdWlsdGluT3BlcmF0b3JfU1RBQkxFSExPX1RSQU5TUE9TRSwKKyAgICBCdWlsdGluT3BlcmF0b3JfRElMQVRFLAorICAgIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fUk5HX0JJVF9HRU5FUkFUT1IsCisgICAgQnVpbHRpbk9wZXJhdG9yX1JFRFVDRV9XSU5ET1csCisgICAgQnVpbHRpbk9wZXJhdG9yX1NUQUJMRUhMT19DT01QT1NJVEUKICAgfTsKICAgcmV0dXJuIHZhbHVlczsKIH0KIAogaW5saW5lIGNvbnN0IGNoYXIgKiBjb25zdCAqRW51bU5hbWVzQnVpbHRpbk9wZXJhdG9yKCkgewotICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVzWzE2M10gPSB7CisgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFtZXNbMjA4XSA9IHsKICAgICAiQUREIiwKICAgICAiQVZFUkFHRV9QT09MXzJEIiwKICAgICAiQ09OQ0FURU5BVElPTiIsCkBAIC0xNDEwLDEzICsxNTg3LDU4IEBACiAgICAgIkJJVENBU1QiLAogICAgICJCSVRXSVNFX1hPUiIsCiAgICAgIlJJR0hUX1NISUZUIiwKKyAgICAiU1RBQkxFSExPX0xPR0lTVElDIiwKKyAgICAiU1RBQkxFSExPX0FERCIsCisgICAgIlNUQUJMRUhMT19ESVZJREUiLAorICAgICJTVEFCTEVITE9fTVVMVElQTFkiLAorICAgICJTVEFCTEVITE9fTUFYSU1VTSIsCisgICAgIlNUQUJMRUhMT19SRVNIQVBFIiwKKyAgICAiU1RBQkxFSExPX0NMQU1QIiwKKyAgICAiU1RBQkxFSExPX0NPTkNBVEVOQVRFIiwKKyAgICAiU1RBQkxFSExPX0JST0FEQ0FTVF9JTl9ESU0iLAorICAgICJTVEFCTEVITE9fQ09OVk9MVVRJT04iLAorICAgICJTVEFCTEVITE9fU0xJQ0UiLAorICAgICJTVEFCTEVITE9fQ1VTVE9NX0NBTEwiLAorICAgICJTVEFCTEVITE9fUkVEVUNFIiwKKyAgICAiU1RBQkxFSExPX0FCUyIsCisgICAgIlNUQUJMRUhMT19BTkQiLAorICAgICJTVEFCTEVITE9fQ09TSU5FIiwKKyAgICAiU1RBQkxFSExPX0VYUE9ORU5USUFMIiwKKyAgICAiU1RBQkxFSExPX0ZMT09SIiwKKyAgICAiU1RBQkxFSExPX0xPRyIsCisgICAgIlNUQUJMRUhMT19NSU5JTVVNIiwKKyAgICAiU1RBQkxFSExPX05FR0FURSIsCisgICAgIlNUQUJMRUhMT19PUiIsCisgICAgIlNUQUJMRUhMT19QT1dFUiIsCisgICAgIlNUQUJMRUhMT19SRU1BSU5ERVIiLAorICAgICJTVEFCTEVITE9fUlNRUlQiLAorICAgICJTVEFCTEVITE9fU0VMRUNUIiwKKyAgICAiU1RBQkxFSExPX1NVQlRSQUNUIiwKKyAgICAiU1RBQkxFSExPX1RBTkgiLAorICAgICJTVEFCTEVITE9fU0NBVFRFUiIsCisgICAgIlNUQUJMRUhMT19DT01QQVJFIiwKKyAgICAiU1RBQkxFSExPX0NPTlZFUlQiLAorICAgICJTVEFCTEVITE9fRFlOQU1JQ19TTElDRSIsCisgICAgIlNUQUJMRUhMT19EWU5BTUlDX1VQREFURV9TTElDRSIsCisgICAgIlNUQUJMRUhMT19QQUQiLAorICAgICJTVEFCTEVITE9fSU9UQSIsCisgICAgIlNUQUJMRUhMT19ET1RfR0VORVJBTCIsCisgICAgIlNUQUJMRUhMT19SRURVQ0VfV0lORE9XIiwKKyAgICAiU1RBQkxFSExPX1NPUlQiLAorICAgICJTVEFCTEVITE9fV0hJTEUiLAorICAgICJTVEFCTEVITE9fR0FUSEVSIiwKKyAgICAiU1RBQkxFSExPX1RSQU5TUE9TRSIsCisgICAgIkRJTEFURSIsCisgICAgIlNUQUJMRUhMT19STkdfQklUX0dFTkVSQVRPUiIsCisgICAgIlJFRFVDRV9XSU5ET1ciLAorICAgICJTVEFCTEVITE9fQ09NUE9TSVRFIiwKICAgICBudWxscHRyCiAgIH07CiAgIHJldHVybiBuYW1lczsKIH0KIAogaW5saW5lIGNvbnN0IGNoYXIgKkVudW1OYW1lQnVpbHRpbk9wZXJhdG9yKEJ1aWx0aW5PcGVyYXRvciBlKSB7Ci0gIGlmIChmbGF0YnVmZmVyczo6SXNPdXRSYW5nZShlLCBCdWlsdGluT3BlcmF0b3JfQURELCBCdWlsdGluT3BlcmF0b3JfUklHSFRfU0hJRlQpKSByZXR1cm4gIiI7CisgIGlmICg6OmZsYXRidWZmZXJzOjpJc091dFJhbmdlKGUsIEJ1aWx0aW5PcGVyYXRvcl9BREQsIEJ1aWx0aW5PcGVyYXRvcl9TVEFCTEVITE9fQ09NUE9TSVRFKSkgcmV0dXJuICIiOwogICBjb25zdCBzaXplX3QgaW5kZXggPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGUpOwogICByZXR1cm4gRW51bU5hbWVzQnVpbHRpbk9wZXJhdG9yKClbaW5kZXhdOwogfQpAQCAtMTgyMSw3ICsyMDQzLDcgQEAKIH0KIAogaW5saW5lIGNvbnN0IGNoYXIgKkVudW1OYW1lQnVpbHRpbk9wdGlvbnMoQnVpbHRpbk9wdGlvbnMgZSkgewotICBpZiAoZmxhdGJ1ZmZlcnM6OklzT3V0UmFuZ2UoZSwgQnVpbHRpbk9wdGlvbnNfTk9ORSwgQnVpbHRpbk9wdGlvbnNfUmlnaHRTaGlmdE9wdGlvbnMpKSByZXR1cm4gIiI7CisgIGlmICg6OmZsYXRidWZmZXJzOjpJc091dFJhbmdlKGUsIEJ1aWx0aW5PcHRpb25zX05PTkUsIEJ1aWx0aW5PcHRpb25zX1JpZ2h0U2hpZnRPcHRpb25zKSkgcmV0dXJuICIiOwogICBjb25zdCBzaXplX3QgaW5kZXggPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGUpOwogICByZXR1cm4gRW51bU5hbWVzQnVpbHRpbk9wdGlvbnMoKVtpbmRleF07CiB9CkBAIC0yODY5LDggKzMwOTEsOCBAQAogICAgIH0KICAgfQogCi0gIHN0YXRpYyB2b2lkICpVblBhY2soY29uc3Qgdm9pZCAqb2JqLCBCdWlsdGluT3B0aW9ucyB0eXBlLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqcmVzb2x2ZXIpOwotICBmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyB2b2lkICpVblBhY2soY29uc3Qgdm9pZCAqb2JqLCBCdWlsdGluT3B0aW9ucyB0eXBlLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpyZXNvbHZlcik7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKSBjb25zdDsKIAogICB0ZmxpdGU6OkNvbnYyRE9wdGlvbnNUICpBc0NvbnYyRE9wdGlvbnMoKSB7CiAgICAgcmV0dXJuIHR5cGUgPT0gQnVpbHRpbk9wdGlvbnNfQ29udjJET3B0aW9ucyA/CkBAIC0zODgyLDggKzQxMDQsNjI0IEBACiAgIH0KIH07CiAKLWJvb2wgVmVyaWZ5QnVpbHRpbk9wdGlvbnMoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllciwgY29uc3Qgdm9pZCAqb2JqLCBCdWlsdGluT3B0aW9ucyB0eXBlKTsKLWJvb2wgVmVyaWZ5QnVpbHRpbk9wdGlvbnNWZWN0b3IoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllciwgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+PiAqdmFsdWVzLCBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICp0eXBlcyk7Citib29sIFZlcmlmeUJ1aWx0aW5PcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllciwgY29uc3Qgdm9pZCAqb2JqLCBCdWlsdGluT3B0aW9ucyB0eXBlKTsKK2Jvb2wgVmVyaWZ5QnVpbHRpbk9wdGlvbnNWZWN0b3IoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyLCBjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8OjpmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+PiAqdmFsdWVzLCBjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKnR5cGVzKTsKKworZW51bSBCdWlsdGluT3B0aW9uczIgOiB1aW50OF90IHsKKyAgQnVpbHRpbk9wdGlvbnMyX05PTkUgPSAwLAorICBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zID0gMSwKKyAgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9ucyA9IDIsCisgIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9TbGljZU9wdGlvbnMgPSAzLAorICBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zID0gNCwKKyAgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zID0gNSwKKyAgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1JlZHVjZU9wdGlvbnMgPSA2LAorICBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvU2NhdHRlck9wdGlvbnMgPSA3LAorICBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvQ29tcGFyZU9wdGlvbnMgPSA4LAorICBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9ucyA9IDksCisgIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9QYWRPcHRpb25zID0gMTAsCisgIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9Jb3RhT3B0aW9ucyA9IDExLAorICBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnMgPSAxMiwKKyAgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMgPSAxMywKKyAgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1NvcnRPcHRpb25zID0gMTQsCisgIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9XaGlsZU9wdGlvbnMgPSAxNSwKKyAgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0dhdGhlck9wdGlvbnMgPSAxNiwKKyAgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnMgPSAxNywKKyAgQnVpbHRpbk9wdGlvbnMyX0RpbGF0ZU9wdGlvbnMgPSAxOCwKKyAgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnMgPSAxOSwKKyAgQnVpbHRpbk9wdGlvbnMyX1JlZHVjZVdpbmRvd09wdGlvbnMgPSAyMCwKKyAgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnMgPSAyMSwKKyAgQnVpbHRpbk9wdGlvbnMyX01JTiA9IEJ1aWx0aW5PcHRpb25zMl9OT05FLAorICBCdWlsdGluT3B0aW9uczJfTUFYID0gQnVpbHRpbk9wdGlvbnMyX1N0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnMKK307CisKK2lubGluZSBjb25zdCBCdWlsdGluT3B0aW9uczIgKCZFbnVtVmFsdWVzQnVpbHRpbk9wdGlvbnMyKCkpWzIyXSB7CisgIHN0YXRpYyBjb25zdCBCdWlsdGluT3B0aW9uczIgdmFsdWVzW10gPSB7CisgICAgQnVpbHRpbk9wdGlvbnMyX05PTkUsCisgICAgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9ucywKKyAgICBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zLAorICAgIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9TbGljZU9wdGlvbnMsCisgICAgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucywKKyAgICBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnMsCisgICAgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1JlZHVjZU9wdGlvbnMsCisgICAgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1NjYXR0ZXJPcHRpb25zLAorICAgIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9Db21wYXJlT3B0aW9ucywKKyAgICBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9ucywKKyAgICBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvUGFkT3B0aW9ucywKKyAgICBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvSW90YU9wdGlvbnMsCisgICAgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zLAorICAgIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zLAorICAgIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9Tb3J0T3B0aW9ucywKKyAgICBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvV2hpbGVPcHRpb25zLAorICAgIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9HYXRoZXJPcHRpb25zLAorICAgIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9UcmFuc3Bvc2VPcHRpb25zLAorICAgIEJ1aWx0aW5PcHRpb25zMl9EaWxhdGVPcHRpb25zLAorICAgIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zLAorICAgIEJ1aWx0aW5PcHRpb25zMl9SZWR1Y2VXaW5kb3dPcHRpb25zLAorICAgIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVITE9Db21wb3NpdGVPcHRpb25zCisgIH07CisgIHJldHVybiB2YWx1ZXM7Cit9CisKK2lubGluZSBjb25zdCBjaGFyICogY29uc3QgKkVudW1OYW1lc0J1aWx0aW5PcHRpb25zMigpIHsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lc1syM10gPSB7CisgICAgIk5PTkUiLAorICAgICJTdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnMiLAorICAgICJTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnMiLAorICAgICJTdGFibGVobG9TbGljZU9wdGlvbnMiLAorICAgICJTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMiLAorICAgICJTdGFibGVobG9DdXN0b21DYWxsT3B0aW9ucyIsCisgICAgIlN0YWJsZWhsb1JlZHVjZU9wdGlvbnMiLAorICAgICJTdGFibGVobG9TY2F0dGVyT3B0aW9ucyIsCisgICAgIlN0YWJsZWhsb0NvbXBhcmVPcHRpb25zIiwKKyAgICAiU3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9ucyIsCisgICAgIlN0YWJsZWhsb1BhZE9wdGlvbnMiLAorICAgICJTdGFibGVobG9Jb3RhT3B0aW9ucyIsCisgICAgIlN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zIiwKKyAgICAiU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9ucyIsCisgICAgIlN0YWJsZWhsb1NvcnRPcHRpb25zIiwKKyAgICAiU3RhYmxlaGxvV2hpbGVPcHRpb25zIiwKKyAgICAiU3RhYmxlaGxvR2F0aGVyT3B0aW9ucyIsCisgICAgIlN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnMiLAorICAgICJEaWxhdGVPcHRpb25zIiwKKyAgICAiU3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9ucyIsCisgICAgIlJlZHVjZVdpbmRvd09wdGlvbnMiLAorICAgICJTdGFibGVITE9Db21wb3NpdGVPcHRpb25zIiwKKyAgICBudWxscHRyCisgIH07CisgIHJldHVybiBuYW1lczsKK30KKworaW5saW5lIGNvbnN0IGNoYXIgKkVudW1OYW1lQnVpbHRpbk9wdGlvbnMyKEJ1aWx0aW5PcHRpb25zMiBlKSB7CisgIGlmICg6OmZsYXRidWZmZXJzOjpJc091dFJhbmdlKGUsIEJ1aWx0aW5PcHRpb25zMl9OT05FLCBCdWlsdGluT3B0aW9uczJfU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9ucykpIHJldHVybiAiIjsKKyAgY29uc3Qgc2l6ZV90IGluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihlKTsKKyAgcmV0dXJuIEVudW1OYW1lc0J1aWx0aW5PcHRpb25zMigpW2luZGV4XTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IEJ1aWx0aW5PcHRpb25zMlRyYWl0cyB7CisgIHN0YXRpYyBjb25zdCBCdWlsdGluT3B0aW9uczIgZW51bV92YWx1ZSA9IEJ1aWx0aW5PcHRpb25zMl9OT05FOworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQnVpbHRpbk9wdGlvbnMyVHJhaXRzPHRmbGl0ZTo6U3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zPiB7CisgIHN0YXRpYyBjb25zdCBCdWlsdGluT3B0aW9uczIgZW51bV92YWx1ZSA9IEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnM7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBCdWlsdGluT3B0aW9uczJUcmFpdHM8dGZsaXRlOjpTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnM+IHsKKyAgc3RhdGljIGNvbnN0IEJ1aWx0aW5PcHRpb25zMiBlbnVtX3ZhbHVlID0gQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9uczsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IEJ1aWx0aW5PcHRpb25zMlRyYWl0czx0ZmxpdGU6OlN0YWJsZWhsb1NsaWNlT3B0aW9ucz4geworICBzdGF0aWMgY29uc3QgQnVpbHRpbk9wdGlvbnMyIGVudW1fdmFsdWUgPSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvU2xpY2VPcHRpb25zOworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQnVpbHRpbk9wdGlvbnMyVHJhaXRzPHRmbGl0ZTo6U3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zPiB7CisgIHN0YXRpYyBjb25zdCBCdWlsdGluT3B0aW9uczIgZW51bV92YWx1ZSA9IEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnM7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBCdWlsdGluT3B0aW9uczJUcmFpdHM8dGZsaXRlOjpTdGFibGVobG9DdXN0b21DYWxsT3B0aW9ucz4geworICBzdGF0aWMgY29uc3QgQnVpbHRpbk9wdGlvbnMyIGVudW1fdmFsdWUgPSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnM7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBCdWlsdGluT3B0aW9uczJUcmFpdHM8dGZsaXRlOjpTdGFibGVobG9SZWR1Y2VPcHRpb25zPiB7CisgIHN0YXRpYyBjb25zdCBCdWlsdGluT3B0aW9uczIgZW51bV92YWx1ZSA9IEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9SZWR1Y2VPcHRpb25zOworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQnVpbHRpbk9wdGlvbnMyVHJhaXRzPHRmbGl0ZTo6U3RhYmxlaGxvU2NhdHRlck9wdGlvbnM+IHsKKyAgc3RhdGljIGNvbnN0IEJ1aWx0aW5PcHRpb25zMiBlbnVtX3ZhbHVlID0gQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1NjYXR0ZXJPcHRpb25zOworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQnVpbHRpbk9wdGlvbnMyVHJhaXRzPHRmbGl0ZTo6U3RhYmxlaGxvQ29tcGFyZU9wdGlvbnM+IHsKKyAgc3RhdGljIGNvbnN0IEJ1aWx0aW5PcHRpb25zMiBlbnVtX3ZhbHVlID0gQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0NvbXBhcmVPcHRpb25zOworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQnVpbHRpbk9wdGlvbnMyVHJhaXRzPHRmbGl0ZTo6U3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9ucz4geworICBzdGF0aWMgY29uc3QgQnVpbHRpbk9wdGlvbnMyIGVudW1fdmFsdWUgPSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9uczsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IEJ1aWx0aW5PcHRpb25zMlRyYWl0czx0ZmxpdGU6OlN0YWJsZWhsb1BhZE9wdGlvbnM+IHsKKyAgc3RhdGljIGNvbnN0IEJ1aWx0aW5PcHRpb25zMiBlbnVtX3ZhbHVlID0gQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1BhZE9wdGlvbnM7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBCdWlsdGluT3B0aW9uczJUcmFpdHM8dGZsaXRlOjpTdGFibGVobG9Jb3RhT3B0aW9ucz4geworICBzdGF0aWMgY29uc3QgQnVpbHRpbk9wdGlvbnMyIGVudW1fdmFsdWUgPSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvSW90YU9wdGlvbnM7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBCdWlsdGluT3B0aW9uczJUcmFpdHM8dGZsaXRlOjpTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9ucz4geworICBzdGF0aWMgY29uc3QgQnVpbHRpbk9wdGlvbnMyIGVudW1fdmFsdWUgPSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnM7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBCdWlsdGluT3B0aW9uczJUcmFpdHM8dGZsaXRlOjpTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zPiB7CisgIHN0YXRpYyBjb25zdCBCdWlsdGluT3B0aW9uczIgZW51bV92YWx1ZSA9IEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zOworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQnVpbHRpbk9wdGlvbnMyVHJhaXRzPHRmbGl0ZTo6U3RhYmxlaGxvU29ydE9wdGlvbnM+IHsKKyAgc3RhdGljIGNvbnN0IEJ1aWx0aW5PcHRpb25zMiBlbnVtX3ZhbHVlID0gQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1NvcnRPcHRpb25zOworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQnVpbHRpbk9wdGlvbnMyVHJhaXRzPHRmbGl0ZTo6U3RhYmxlaGxvV2hpbGVPcHRpb25zPiB7CisgIHN0YXRpYyBjb25zdCBCdWlsdGluT3B0aW9uczIgZW51bV92YWx1ZSA9IEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9XaGlsZU9wdGlvbnM7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBCdWlsdGluT3B0aW9uczJUcmFpdHM8dGZsaXRlOjpTdGFibGVobG9HYXRoZXJPcHRpb25zPiB7CisgIHN0YXRpYyBjb25zdCBCdWlsdGluT3B0aW9uczIgZW51bV92YWx1ZSA9IEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9HYXRoZXJPcHRpb25zOworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQnVpbHRpbk9wdGlvbnMyVHJhaXRzPHRmbGl0ZTo6U3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9ucz4geworICBzdGF0aWMgY29uc3QgQnVpbHRpbk9wdGlvbnMyIGVudW1fdmFsdWUgPSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9uczsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IEJ1aWx0aW5PcHRpb25zMlRyYWl0czx0ZmxpdGU6OkRpbGF0ZU9wdGlvbnM+IHsKKyAgc3RhdGljIGNvbnN0IEJ1aWx0aW5PcHRpb25zMiBlbnVtX3ZhbHVlID0gQnVpbHRpbk9wdGlvbnMyX0RpbGF0ZU9wdGlvbnM7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBCdWlsdGluT3B0aW9uczJUcmFpdHM8dGZsaXRlOjpTdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zPiB7CisgIHN0YXRpYyBjb25zdCBCdWlsdGluT3B0aW9uczIgZW51bV92YWx1ZSA9IEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zOworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQnVpbHRpbk9wdGlvbnMyVHJhaXRzPHRmbGl0ZTo6UmVkdWNlV2luZG93T3B0aW9ucz4geworICBzdGF0aWMgY29uc3QgQnVpbHRpbk9wdGlvbnMyIGVudW1fdmFsdWUgPSBCdWlsdGluT3B0aW9uczJfUmVkdWNlV2luZG93T3B0aW9uczsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IEJ1aWx0aW5PcHRpb25zMlRyYWl0czx0ZmxpdGU6OlN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnM+IHsKKyAgc3RhdGljIGNvbnN0IEJ1aWx0aW5PcHRpb25zMiBlbnVtX3ZhbHVlID0gQnVpbHRpbk9wdGlvbnMyX1N0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnM7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgQnVpbHRpbk9wdGlvbnMyVW5pb25UcmFpdHMgeworICBzdGF0aWMgY29uc3QgQnVpbHRpbk9wdGlvbnMyIGVudW1fdmFsdWUgPSBCdWlsdGluT3B0aW9uczJfTk9ORTsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IEJ1aWx0aW5PcHRpb25zMlVuaW9uVHJhaXRzPHRmbGl0ZTo6U3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zVD4geworICBzdGF0aWMgY29uc3QgQnVpbHRpbk9wdGlvbnMyIGVudW1fdmFsdWUgPSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zOworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQnVpbHRpbk9wdGlvbnMyVW5pb25UcmFpdHM8dGZsaXRlOjpTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnNUPiB7CisgIHN0YXRpYyBjb25zdCBCdWlsdGluT3B0aW9uczIgZW51bV92YWx1ZSA9IEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnM7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBCdWlsdGluT3B0aW9uczJVbmlvblRyYWl0czx0ZmxpdGU6OlN0YWJsZWhsb1NsaWNlT3B0aW9uc1Q+IHsKKyAgc3RhdGljIGNvbnN0IEJ1aWx0aW5PcHRpb25zMiBlbnVtX3ZhbHVlID0gQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1NsaWNlT3B0aW9uczsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IEJ1aWx0aW5PcHRpb25zMlVuaW9uVHJhaXRzPHRmbGl0ZTo6U3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zVD4geworICBzdGF0aWMgY29uc3QgQnVpbHRpbk9wdGlvbnMyIGVudW1fdmFsdWUgPSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zOworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQnVpbHRpbk9wdGlvbnMyVW5pb25UcmFpdHM8dGZsaXRlOjpTdGFibGVobG9DdXN0b21DYWxsT3B0aW9uc1Q+IHsKKyAgc3RhdGljIGNvbnN0IEJ1aWx0aW5PcHRpb25zMiBlbnVtX3ZhbHVlID0gQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zOworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQnVpbHRpbk9wdGlvbnMyVW5pb25UcmFpdHM8dGZsaXRlOjpTdGFibGVobG9SZWR1Y2VPcHRpb25zVD4geworICBzdGF0aWMgY29uc3QgQnVpbHRpbk9wdGlvbnMyIGVudW1fdmFsdWUgPSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvUmVkdWNlT3B0aW9uczsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IEJ1aWx0aW5PcHRpb25zMlVuaW9uVHJhaXRzPHRmbGl0ZTo6U3RhYmxlaGxvU2NhdHRlck9wdGlvbnNUPiB7CisgIHN0YXRpYyBjb25zdCBCdWlsdGluT3B0aW9uczIgZW51bV92YWx1ZSA9IEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9TY2F0dGVyT3B0aW9uczsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IEJ1aWx0aW5PcHRpb25zMlVuaW9uVHJhaXRzPHRmbGl0ZTo6U3RhYmxlaGxvQ29tcGFyZU9wdGlvbnNUPiB7CisgIHN0YXRpYyBjb25zdCBCdWlsdGluT3B0aW9uczIgZW51bV92YWx1ZSA9IEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9Db21wYXJlT3B0aW9uczsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IEJ1aWx0aW5PcHRpb25zMlVuaW9uVHJhaXRzPHRmbGl0ZTo6U3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9uc1Q+IHsKKyAgc3RhdGljIGNvbnN0IEJ1aWx0aW5PcHRpb25zMiBlbnVtX3ZhbHVlID0gQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnM7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBCdWlsdGluT3B0aW9uczJVbmlvblRyYWl0czx0ZmxpdGU6OlN0YWJsZWhsb1BhZE9wdGlvbnNUPiB7CisgIHN0YXRpYyBjb25zdCBCdWlsdGluT3B0aW9uczIgZW51bV92YWx1ZSA9IEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9QYWRPcHRpb25zOworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQnVpbHRpbk9wdGlvbnMyVW5pb25UcmFpdHM8dGZsaXRlOjpTdGFibGVobG9Jb3RhT3B0aW9uc1Q+IHsKKyAgc3RhdGljIGNvbnN0IEJ1aWx0aW5PcHRpb25zMiBlbnVtX3ZhbHVlID0gQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0lvdGFPcHRpb25zOworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQnVpbHRpbk9wdGlvbnMyVW5pb25UcmFpdHM8dGZsaXRlOjpTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9uc1Q+IHsKKyAgc3RhdGljIGNvbnN0IEJ1aWx0aW5PcHRpb25zMiBlbnVtX3ZhbHVlID0gQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zOworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQnVpbHRpbk9wdGlvbnMyVW5pb25UcmFpdHM8dGZsaXRlOjpTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zVD4geworICBzdGF0aWMgY29uc3QgQnVpbHRpbk9wdGlvbnMyIGVudW1fdmFsdWUgPSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9uczsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IEJ1aWx0aW5PcHRpb25zMlVuaW9uVHJhaXRzPHRmbGl0ZTo6U3RhYmxlaGxvU29ydE9wdGlvbnNUPiB7CisgIHN0YXRpYyBjb25zdCBCdWlsdGluT3B0aW9uczIgZW51bV92YWx1ZSA9IEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9Tb3J0T3B0aW9uczsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IEJ1aWx0aW5PcHRpb25zMlVuaW9uVHJhaXRzPHRmbGl0ZTo6U3RhYmxlaGxvV2hpbGVPcHRpb25zVD4geworICBzdGF0aWMgY29uc3QgQnVpbHRpbk9wdGlvbnMyIGVudW1fdmFsdWUgPSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvV2hpbGVPcHRpb25zOworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQnVpbHRpbk9wdGlvbnMyVW5pb25UcmFpdHM8dGZsaXRlOjpTdGFibGVobG9HYXRoZXJPcHRpb25zVD4geworICBzdGF0aWMgY29uc3QgQnVpbHRpbk9wdGlvbnMyIGVudW1fdmFsdWUgPSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvR2F0aGVyT3B0aW9uczsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IEJ1aWx0aW5PcHRpb25zMlVuaW9uVHJhaXRzPHRmbGl0ZTo6U3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9uc1Q+IHsKKyAgc3RhdGljIGNvbnN0IEJ1aWx0aW5PcHRpb25zMiBlbnVtX3ZhbHVlID0gQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnM7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBCdWlsdGluT3B0aW9uczJVbmlvblRyYWl0czx0ZmxpdGU6OkRpbGF0ZU9wdGlvbnNUPiB7CisgIHN0YXRpYyBjb25zdCBCdWlsdGluT3B0aW9uczIgZW51bV92YWx1ZSA9IEJ1aWx0aW5PcHRpb25zMl9EaWxhdGVPcHRpb25zOworfTsKKwordGVtcGxhdGU8PiBzdHJ1Y3QgQnVpbHRpbk9wdGlvbnMyVW5pb25UcmFpdHM8dGZsaXRlOjpTdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zVD4geworICBzdGF0aWMgY29uc3QgQnVpbHRpbk9wdGlvbnMyIGVudW1fdmFsdWUgPSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9uczsKK307CisKK3RlbXBsYXRlPD4gc3RydWN0IEJ1aWx0aW5PcHRpb25zMlVuaW9uVHJhaXRzPHRmbGl0ZTo6UmVkdWNlV2luZG93T3B0aW9uc1Q+IHsKKyAgc3RhdGljIGNvbnN0IEJ1aWx0aW5PcHRpb25zMiBlbnVtX3ZhbHVlID0gQnVpbHRpbk9wdGlvbnMyX1JlZHVjZVdpbmRvd09wdGlvbnM7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBCdWlsdGluT3B0aW9uczJVbmlvblRyYWl0czx0ZmxpdGU6OlN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnNUPiB7CisgIHN0YXRpYyBjb25zdCBCdWlsdGluT3B0aW9uczIgZW51bV92YWx1ZSA9IEJ1aWx0aW5PcHRpb25zMl9TdGFibGVITE9Db21wb3NpdGVPcHRpb25zOworfTsKKworc3RydWN0IEJ1aWx0aW5PcHRpb25zMlVuaW9uIHsKKyAgQnVpbHRpbk9wdGlvbnMyIHR5cGU7CisgIHZvaWQgKnZhbHVlOworCisgIEJ1aWx0aW5PcHRpb25zMlVuaW9uKCkgOiB0eXBlKEJ1aWx0aW5PcHRpb25zMl9OT05FKSwgdmFsdWUobnVsbHB0cikge30KKyAgQnVpbHRpbk9wdGlvbnMyVW5pb24oQnVpbHRpbk9wdGlvbnMyVW5pb24mJiB1KSBGTEFUQlVGRkVSU19OT0VYQ0VQVCA6CisgICAgdHlwZShCdWlsdGluT3B0aW9uczJfTk9ORSksIHZhbHVlKG51bGxwdHIpCisgICAgeyBzdGQ6OnN3YXAodHlwZSwgdS50eXBlKTsgc3RkOjpzd2FwKHZhbHVlLCB1LnZhbHVlKTsgfQorICBCdWlsdGluT3B0aW9uczJVbmlvbihjb25zdCBCdWlsdGluT3B0aW9uczJVbmlvbiAmKTsKKyAgQnVpbHRpbk9wdGlvbnMyVW5pb24gJm9wZXJhdG9yPShjb25zdCBCdWlsdGluT3B0aW9uczJVbmlvbiAmdSkKKyAgICB7IEJ1aWx0aW5PcHRpb25zMlVuaW9uIHQodSk7IHN0ZDo6c3dhcCh0eXBlLCB0LnR5cGUpOyBzdGQ6OnN3YXAodmFsdWUsIHQudmFsdWUpOyByZXR1cm4gKnRoaXM7IH0KKyAgQnVpbHRpbk9wdGlvbnMyVW5pb24gJm9wZXJhdG9yPShCdWlsdGluT3B0aW9uczJVbmlvbiAmJnUpIEZMQVRCVUZGRVJTX05PRVhDRVBUCisgICAgeyBzdGQ6OnN3YXAodHlwZSwgdS50eXBlKTsgc3RkOjpzd2FwKHZhbHVlLCB1LnZhbHVlKTsgcmV0dXJuICp0aGlzOyB9CisgIH5CdWlsdGluT3B0aW9uczJVbmlvbigpIHsgUmVzZXQoKTsgfQorCisgIHZvaWQgUmVzZXQoKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgdm9pZCBTZXQoVCYmIHZhbCkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPFQ+Ojp0eXBlIFJUOworICAgIFJlc2V0KCk7CisgICAgdHlwZSA9IEJ1aWx0aW5PcHRpb25zMlVuaW9uVHJhaXRzPFJUPjo6ZW51bV92YWx1ZTsKKyAgICBpZiAodHlwZSAhPSBCdWlsdGluT3B0aW9uczJfTk9ORSkgeworICAgICAgdmFsdWUgPSBuZXcgUlQoc3RkOjpmb3J3YXJkPFQ+KHZhbCkpOworICAgIH0KKyAgfQorCisgIHN0YXRpYyB2b2lkICpVblBhY2soY29uc3Qgdm9pZCAqb2JqLCBCdWlsdGluT3B0aW9uczIgdHlwZSwgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqcmVzb2x2ZXIpOworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cikgY29uc3Q7CisKKyAgdGZsaXRlOjpTdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnNUICpBc1N0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9ucygpIHsKKyAgICByZXR1cm4gdHlwZSA9PSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dGZsaXRlOjpTdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnNUICo+KHZhbHVlKSA6IG51bGxwdHI7CisgIH0KKyAgY29uc3QgdGZsaXRlOjpTdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnNUICpBc1N0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gdHlwZSA9PSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnNUICo+KHZhbHVlKSA6IG51bGxwdHI7CisgIH0KKyAgdGZsaXRlOjpTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnNUICpBc1N0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9ucygpIHsKKyAgICByZXR1cm4gdHlwZSA9PSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dGZsaXRlOjpTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnNUICo+KHZhbHVlKSA6IG51bGxwdHI7CisgIH0KKyAgY29uc3QgdGZsaXRlOjpTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnNUICpBc1N0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gdHlwZSA9PSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnNUICo+KHZhbHVlKSA6IG51bGxwdHI7CisgIH0KKyAgdGZsaXRlOjpTdGFibGVobG9TbGljZU9wdGlvbnNUICpBc1N0YWJsZWhsb1NsaWNlT3B0aW9ucygpIHsKKyAgICByZXR1cm4gdHlwZSA9PSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvU2xpY2VPcHRpb25zID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dGZsaXRlOjpTdGFibGVobG9TbGljZU9wdGlvbnNUICo+KHZhbHVlKSA6IG51bGxwdHI7CisgIH0KKyAgY29uc3QgdGZsaXRlOjpTdGFibGVobG9TbGljZU9wdGlvbnNUICpBc1N0YWJsZWhsb1NsaWNlT3B0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gdHlwZSA9PSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvU2xpY2VPcHRpb25zID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9TbGljZU9wdGlvbnNUICo+KHZhbHVlKSA6IG51bGxwdHI7CisgIH0KKyAgdGZsaXRlOjpTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNUICpBc1N0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucygpIHsKKyAgICByZXR1cm4gdHlwZSA9PSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dGZsaXRlOjpTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNUICo+KHZhbHVlKSA6IG51bGxwdHI7CisgIH0KKyAgY29uc3QgdGZsaXRlOjpTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNUICpBc1N0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gdHlwZSA9PSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNUICo+KHZhbHVlKSA6IG51bGxwdHI7CisgIH0KKyAgdGZsaXRlOjpTdGFibGVobG9DdXN0b21DYWxsT3B0aW9uc1QgKkFzU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnMoKSB7CisgICAgcmV0dXJuIHR5cGUgPT0gQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dGZsaXRlOjpTdGFibGVobG9DdXN0b21DYWxsT3B0aW9uc1QgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zVCAqQXNTdGFibGVobG9DdXN0b21DYWxsT3B0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gdHlwZSA9PSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnMgPworICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9CisgIHRmbGl0ZTo6U3RhYmxlaGxvUmVkdWNlT3B0aW9uc1QgKkFzU3RhYmxlaGxvUmVkdWNlT3B0aW9ucygpIHsKKyAgICByZXR1cm4gdHlwZSA9PSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvUmVkdWNlT3B0aW9ucyA/CisgICAgICByZWludGVycHJldF9jYXN0PHRmbGl0ZTo6U3RhYmxlaGxvUmVkdWNlT3B0aW9uc1QgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1JlZHVjZU9wdGlvbnNUICpBc1N0YWJsZWhsb1JlZHVjZU9wdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIHR5cGUgPT0gQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1JlZHVjZU9wdGlvbnMgPworICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1JlZHVjZU9wdGlvbnNUICo+KHZhbHVlKSA6IG51bGxwdHI7CisgIH0KKyAgdGZsaXRlOjpTdGFibGVobG9TY2F0dGVyT3B0aW9uc1QgKkFzU3RhYmxlaGxvU2NhdHRlck9wdGlvbnMoKSB7CisgICAgcmV0dXJuIHR5cGUgPT0gQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1NjYXR0ZXJPcHRpb25zID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dGZsaXRlOjpTdGFibGVobG9TY2F0dGVyT3B0aW9uc1QgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zVCAqQXNTdGFibGVobG9TY2F0dGVyT3B0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gdHlwZSA9PSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvU2NhdHRlck9wdGlvbnMgPworICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9CisgIHRmbGl0ZTo6U3RhYmxlaGxvQ29tcGFyZU9wdGlvbnNUICpBc1N0YWJsZWhsb0NvbXBhcmVPcHRpb25zKCkgeworICAgIHJldHVybiB0eXBlID09IEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9Db21wYXJlT3B0aW9ucyA/CisgICAgICByZWludGVycHJldF9jYXN0PHRmbGl0ZTo6U3RhYmxlaGxvQ29tcGFyZU9wdGlvbnNUICo+KHZhbHVlKSA6IG51bGxwdHI7CisgIH0KKyAgY29uc3QgdGZsaXRlOjpTdGFibGVobG9Db21wYXJlT3B0aW9uc1QgKkFzU3RhYmxlaGxvQ29tcGFyZU9wdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIHR5cGUgPT0gQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0NvbXBhcmVPcHRpb25zID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9Db21wYXJlT3B0aW9uc1QgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorICB0ZmxpdGU6OlN0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnNUICpBc1N0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnMoKSB7CisgICAgcmV0dXJuIHR5cGUgPT0gQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnMgPworICAgICAgcmVpbnRlcnByZXRfY2FzdDx0ZmxpdGU6OlN0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnNUICo+KHZhbHVlKSA6IG51bGxwdHI7CisgIH0KKyAgY29uc3QgdGZsaXRlOjpTdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zVCAqQXNTdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zKCkgY29uc3QgeworICAgIHJldHVybiB0eXBlID09IEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9CisgIHRmbGl0ZTo6U3RhYmxlaGxvUGFkT3B0aW9uc1QgKkFzU3RhYmxlaGxvUGFkT3B0aW9ucygpIHsKKyAgICByZXR1cm4gdHlwZSA9PSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvUGFkT3B0aW9ucyA/CisgICAgICByZWludGVycHJldF9jYXN0PHRmbGl0ZTo6U3RhYmxlaGxvUGFkT3B0aW9uc1QgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1BhZE9wdGlvbnNUICpBc1N0YWJsZWhsb1BhZE9wdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIHR5cGUgPT0gQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1BhZE9wdGlvbnMgPworICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1BhZE9wdGlvbnNUICo+KHZhbHVlKSA6IG51bGxwdHI7CisgIH0KKyAgdGZsaXRlOjpTdGFibGVobG9Jb3RhT3B0aW9uc1QgKkFzU3RhYmxlaGxvSW90YU9wdGlvbnMoKSB7CisgICAgcmV0dXJuIHR5cGUgPT0gQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0lvdGFPcHRpb25zID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dGZsaXRlOjpTdGFibGVobG9Jb3RhT3B0aW9uc1QgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb0lvdGFPcHRpb25zVCAqQXNTdGFibGVobG9Jb3RhT3B0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gdHlwZSA9PSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvSW90YU9wdGlvbnMgPworICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb0lvdGFPcHRpb25zVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9CisgIHRmbGl0ZTo6U3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnNUICpBc1N0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zKCkgeworICAgIHJldHVybiB0eXBlID09IEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9ucyA/CisgICAgICByZWludGVycHJldF9jYXN0PHRmbGl0ZTo6U3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnNUICo+KHZhbHVlKSA6IG51bGxwdHI7CisgIH0KKyAgY29uc3QgdGZsaXRlOjpTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9uc1QgKkFzU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIHR5cGUgPT0gQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9uc1QgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorICB0ZmxpdGU6OlN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnNUICpBc1N0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMoKSB7CisgICAgcmV0dXJuIHR5cGUgPT0gQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMgPworICAgICAgcmVpbnRlcnByZXRfY2FzdDx0ZmxpdGU6OlN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnNUICo+KHZhbHVlKSA6IG51bGxwdHI7CisgIH0KKyAgY29uc3QgdGZsaXRlOjpTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zVCAqQXNTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zKCkgY29uc3QgeworICAgIHJldHVybiB0eXBlID09IEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9CisgIHRmbGl0ZTo6U3RhYmxlaGxvU29ydE9wdGlvbnNUICpBc1N0YWJsZWhsb1NvcnRPcHRpb25zKCkgeworICAgIHJldHVybiB0eXBlID09IEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9Tb3J0T3B0aW9ucyA/CisgICAgICByZWludGVycHJldF9jYXN0PHRmbGl0ZTo6U3RhYmxlaGxvU29ydE9wdGlvbnNUICo+KHZhbHVlKSA6IG51bGxwdHI7CisgIH0KKyAgY29uc3QgdGZsaXRlOjpTdGFibGVobG9Tb3J0T3B0aW9uc1QgKkFzU3RhYmxlaGxvU29ydE9wdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIHR5cGUgPT0gQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1NvcnRPcHRpb25zID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9Tb3J0T3B0aW9uc1QgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorICB0ZmxpdGU6OlN0YWJsZWhsb1doaWxlT3B0aW9uc1QgKkFzU3RhYmxlaGxvV2hpbGVPcHRpb25zKCkgeworICAgIHJldHVybiB0eXBlID09IEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9XaGlsZU9wdGlvbnMgPworICAgICAgcmVpbnRlcnByZXRfY2FzdDx0ZmxpdGU6OlN0YWJsZWhsb1doaWxlT3B0aW9uc1QgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1doaWxlT3B0aW9uc1QgKkFzU3RhYmxlaGxvV2hpbGVPcHRpb25zKCkgY29uc3QgeworICAgIHJldHVybiB0eXBlID09IEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9XaGlsZU9wdGlvbnMgPworICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1doaWxlT3B0aW9uc1QgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorICB0ZmxpdGU6OlN0YWJsZWhsb0dhdGhlck9wdGlvbnNUICpBc1N0YWJsZWhsb0dhdGhlck9wdGlvbnMoKSB7CisgICAgcmV0dXJuIHR5cGUgPT0gQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0dhdGhlck9wdGlvbnMgPworICAgICAgcmVpbnRlcnByZXRfY2FzdDx0ZmxpdGU6OlN0YWJsZWhsb0dhdGhlck9wdGlvbnNUICo+KHZhbHVlKSA6IG51bGxwdHI7CisgIH0KKyAgY29uc3QgdGZsaXRlOjpTdGFibGVobG9HYXRoZXJPcHRpb25zVCAqQXNTdGFibGVobG9HYXRoZXJPcHRpb25zKCkgY29uc3QgeworICAgIHJldHVybiB0eXBlID09IEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9HYXRoZXJPcHRpb25zID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9HYXRoZXJPcHRpb25zVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9CisgIHRmbGl0ZTo6U3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9uc1QgKkFzU3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9ucygpIHsKKyAgICByZXR1cm4gdHlwZSA9PSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9ucyA/CisgICAgICByZWludGVycHJldF9jYXN0PHRmbGl0ZTo6U3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9uc1QgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnNUICpBc1N0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIHR5cGUgPT0gQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnMgPworICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnNUICo+KHZhbHVlKSA6IG51bGxwdHI7CisgIH0KKyAgdGZsaXRlOjpEaWxhdGVPcHRpb25zVCAqQXNEaWxhdGVPcHRpb25zKCkgeworICAgIHJldHVybiB0eXBlID09IEJ1aWx0aW5PcHRpb25zMl9EaWxhdGVPcHRpb25zID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dGZsaXRlOjpEaWxhdGVPcHRpb25zVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9CisgIGNvbnN0IHRmbGl0ZTo6RGlsYXRlT3B0aW9uc1QgKkFzRGlsYXRlT3B0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gdHlwZSA9PSBCdWlsdGluT3B0aW9uczJfRGlsYXRlT3B0aW9ucyA/CisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHRmbGl0ZTo6RGlsYXRlT3B0aW9uc1QgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorICB0ZmxpdGU6OlN0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnNUICpBc1N0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnMoKSB7CisgICAgcmV0dXJuIHR5cGUgPT0gQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnMgPworICAgICAgcmVpbnRlcnByZXRfY2FzdDx0ZmxpdGU6OlN0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnNUICo+KHZhbHVlKSA6IG51bGxwdHI7CisgIH0KKyAgY29uc3QgdGZsaXRlOjpTdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zVCAqQXNTdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zKCkgY29uc3QgeworICAgIHJldHVybiB0eXBlID09IEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9CisgIHRmbGl0ZTo6UmVkdWNlV2luZG93T3B0aW9uc1QgKkFzUmVkdWNlV2luZG93T3B0aW9ucygpIHsKKyAgICByZXR1cm4gdHlwZSA9PSBCdWlsdGluT3B0aW9uczJfUmVkdWNlV2luZG93T3B0aW9ucyA/CisgICAgICByZWludGVycHJldF9jYXN0PHRmbGl0ZTo6UmVkdWNlV2luZG93T3B0aW9uc1QgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCB0ZmxpdGU6OlJlZHVjZVdpbmRvd09wdGlvbnNUICpBc1JlZHVjZVdpbmRvd09wdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIHR5cGUgPT0gQnVpbHRpbk9wdGlvbnMyX1JlZHVjZVdpbmRvd09wdGlvbnMgPworICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB0ZmxpdGU6OlJlZHVjZVdpbmRvd09wdGlvbnNUICo+KHZhbHVlKSA6IG51bGxwdHI7CisgIH0KKyAgdGZsaXRlOjpTdGFibGVITE9Db21wb3NpdGVPcHRpb25zVCAqQXNTdGFibGVITE9Db21wb3NpdGVPcHRpb25zKCkgeworICAgIHJldHVybiB0eXBlID09IEJ1aWx0aW5PcHRpb25zMl9TdGFibGVITE9Db21wb3NpdGVPcHRpb25zID8KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dGZsaXRlOjpTdGFibGVITE9Db21wb3NpdGVPcHRpb25zVCAqPih2YWx1ZSkgOiBudWxscHRyOworICB9CisgIGNvbnN0IHRmbGl0ZTo6U3RhYmxlSExPQ29tcG9zaXRlT3B0aW9uc1QgKkFzU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gdHlwZSA9PSBCdWlsdGluT3B0aW9uczJfU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9ucyA/CisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHRmbGl0ZTo6U3RhYmxlSExPQ29tcG9zaXRlT3B0aW9uc1QgKj4odmFsdWUpIDogbnVsbHB0cjsKKyAgfQorfTsKKworYm9vbCBWZXJpZnlCdWlsdGluT3B0aW9uczIoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyLCBjb25zdCB2b2lkICpvYmosIEJ1aWx0aW5PcHRpb25zMiB0eXBlKTsKK2Jvb2wgVmVyaWZ5QnVpbHRpbk9wdGlvbnMyVmVjdG9yKDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllciwgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPj4gKnZhbHVlcywgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICp0eXBlcyk7CisKK2VudW0gU3RhYmxlaGxvUHJlY2lzaW9uQ29uZmlnIDogdWludDMyX3QgeworICBTdGFibGVobG9QcmVjaXNpb25Db25maWdfREVGQVVMVCA9IDAsCisgIFN0YWJsZWhsb1ByZWNpc2lvbkNvbmZpZ19ISUdIID0gMSwKKyAgU3RhYmxlaGxvUHJlY2lzaW9uQ29uZmlnX0hJR0hFU1QgPSAyLAorICBTdGFibGVobG9QcmVjaXNpb25Db25maWdfTUlOID0gU3RhYmxlaGxvUHJlY2lzaW9uQ29uZmlnX0RFRkFVTFQsCisgIFN0YWJsZWhsb1ByZWNpc2lvbkNvbmZpZ19NQVggPSBTdGFibGVobG9QcmVjaXNpb25Db25maWdfSElHSEVTVAorfTsKKworaW5saW5lIGNvbnN0IFN0YWJsZWhsb1ByZWNpc2lvbkNvbmZpZyAoJkVudW1WYWx1ZXNTdGFibGVobG9QcmVjaXNpb25Db25maWcoKSlbM10geworICBzdGF0aWMgY29uc3QgU3RhYmxlaGxvUHJlY2lzaW9uQ29uZmlnIHZhbHVlc1tdID0geworICAgIFN0YWJsZWhsb1ByZWNpc2lvbkNvbmZpZ19ERUZBVUxULAorICAgIFN0YWJsZWhsb1ByZWNpc2lvbkNvbmZpZ19ISUdILAorICAgIFN0YWJsZWhsb1ByZWNpc2lvbkNvbmZpZ19ISUdIRVNUCisgIH07CisgIHJldHVybiB2YWx1ZXM7Cit9CisKK2lubGluZSBjb25zdCBjaGFyICogY29uc3QgKkVudW1OYW1lc1N0YWJsZWhsb1ByZWNpc2lvbkNvbmZpZygpIHsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lc1s0XSA9IHsKKyAgICAiREVGQVVMVCIsCisgICAgIkhJR0giLAorICAgICJISUdIRVNUIiwKKyAgICBudWxscHRyCisgIH07CisgIHJldHVybiBuYW1lczsKK30KKworaW5saW5lIGNvbnN0IGNoYXIgKkVudW1OYW1lU3RhYmxlaGxvUHJlY2lzaW9uQ29uZmlnKFN0YWJsZWhsb1ByZWNpc2lvbkNvbmZpZyBlKSB7CisgIGlmICg6OmZsYXRidWZmZXJzOjpJc091dFJhbmdlKGUsIFN0YWJsZWhsb1ByZWNpc2lvbkNvbmZpZ19ERUZBVUxULCBTdGFibGVobG9QcmVjaXNpb25Db25maWdfSElHSEVTVCkpIHJldHVybiAiIjsKKyAgY29uc3Qgc2l6ZV90IGluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihlKTsKKyAgcmV0dXJuIEVudW1OYW1lc1N0YWJsZWhsb1ByZWNpc2lvbkNvbmZpZygpW2luZGV4XTsKK30KKworZW51bSBTdGFibGVobG9Db21wYXJpc29uRGlyZWN0aW9uIDogdWludDMyX3QgeworICBTdGFibGVobG9Db21wYXJpc29uRGlyZWN0aW9uX1NUQUJMRUhMT19DT01QQVJJU09OX0RJUkVDVElPTl9FUSA9IDAsCisgIFN0YWJsZWhsb0NvbXBhcmlzb25EaXJlY3Rpb25fU1RBQkxFSExPX0NPTVBBUklTT05fRElSRUNUSU9OX05FID0gMSwKKyAgU3RhYmxlaGxvQ29tcGFyaXNvbkRpcmVjdGlvbl9TVEFCTEVITE9fQ09NUEFSSVNPTl9ESVJFQ1RJT05fR0UgPSAyLAorICBTdGFibGVobG9Db21wYXJpc29uRGlyZWN0aW9uX1NUQUJMRUhMT19DT01QQVJJU09OX0RJUkVDVElPTl9HVCA9IDMsCisgIFN0YWJsZWhsb0NvbXBhcmlzb25EaXJlY3Rpb25fU1RBQkxFSExPX0NPTVBBUklTT05fRElSRUNUSU9OX0xFID0gNCwKKyAgU3RhYmxlaGxvQ29tcGFyaXNvbkRpcmVjdGlvbl9TVEFCTEVITE9fQ09NUEFSSVNPTl9ESVJFQ1RJT05fTFQgPSA1LAorICBTdGFibGVobG9Db21wYXJpc29uRGlyZWN0aW9uX01JTiA9IFN0YWJsZWhsb0NvbXBhcmlzb25EaXJlY3Rpb25fU1RBQkxFSExPX0NPTVBBUklTT05fRElSRUNUSU9OX0VRLAorICBTdGFibGVobG9Db21wYXJpc29uRGlyZWN0aW9uX01BWCA9IFN0YWJsZWhsb0NvbXBhcmlzb25EaXJlY3Rpb25fU1RBQkxFSExPX0NPTVBBUklTT05fRElSRUNUSU9OX0xUCit9OworCitpbmxpbmUgY29uc3QgU3RhYmxlaGxvQ29tcGFyaXNvbkRpcmVjdGlvbiAoJkVudW1WYWx1ZXNTdGFibGVobG9Db21wYXJpc29uRGlyZWN0aW9uKCkpWzZdIHsKKyAgc3RhdGljIGNvbnN0IFN0YWJsZWhsb0NvbXBhcmlzb25EaXJlY3Rpb24gdmFsdWVzW10gPSB7CisgICAgU3RhYmxlaGxvQ29tcGFyaXNvbkRpcmVjdGlvbl9TVEFCTEVITE9fQ09NUEFSSVNPTl9ESVJFQ1RJT05fRVEsCisgICAgU3RhYmxlaGxvQ29tcGFyaXNvbkRpcmVjdGlvbl9TVEFCTEVITE9fQ09NUEFSSVNPTl9ESVJFQ1RJT05fTkUsCisgICAgU3RhYmxlaGxvQ29tcGFyaXNvbkRpcmVjdGlvbl9TVEFCTEVITE9fQ09NUEFSSVNPTl9ESVJFQ1RJT05fR0UsCisgICAgU3RhYmxlaGxvQ29tcGFyaXNvbkRpcmVjdGlvbl9TVEFCTEVITE9fQ09NUEFSSVNPTl9ESVJFQ1RJT05fR1QsCisgICAgU3RhYmxlaGxvQ29tcGFyaXNvbkRpcmVjdGlvbl9TVEFCTEVITE9fQ09NUEFSSVNPTl9ESVJFQ1RJT05fTEUsCisgICAgU3RhYmxlaGxvQ29tcGFyaXNvbkRpcmVjdGlvbl9TVEFCTEVITE9fQ09NUEFSSVNPTl9ESVJFQ1RJT05fTFQKKyAgfTsKKyAgcmV0dXJuIHZhbHVlczsKK30KKworaW5saW5lIGNvbnN0IGNoYXIgKiBjb25zdCAqRW51bU5hbWVzU3RhYmxlaGxvQ29tcGFyaXNvbkRpcmVjdGlvbigpIHsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lc1s3XSA9IHsKKyAgICAiU1RBQkxFSExPX0NPTVBBUklTT05fRElSRUNUSU9OX0VRIiwKKyAgICAiU1RBQkxFSExPX0NPTVBBUklTT05fRElSRUNUSU9OX05FIiwKKyAgICAiU1RBQkxFSExPX0NPTVBBUklTT05fRElSRUNUSU9OX0dFIiwKKyAgICAiU1RBQkxFSExPX0NPTVBBUklTT05fRElSRUNUSU9OX0dUIiwKKyAgICAiU1RBQkxFSExPX0NPTVBBUklTT05fRElSRUNUSU9OX0xFIiwKKyAgICAiU1RBQkxFSExPX0NPTVBBUklTT05fRElSRUNUSU9OX0xUIiwKKyAgICBudWxscHRyCisgIH07CisgIHJldHVybiBuYW1lczsKK30KKworaW5saW5lIGNvbnN0IGNoYXIgKkVudW1OYW1lU3RhYmxlaGxvQ29tcGFyaXNvbkRpcmVjdGlvbihTdGFibGVobG9Db21wYXJpc29uRGlyZWN0aW9uIGUpIHsKKyAgaWYgKDo6ZmxhdGJ1ZmZlcnM6OklzT3V0UmFuZ2UoZSwgU3RhYmxlaGxvQ29tcGFyaXNvbkRpcmVjdGlvbl9TVEFCTEVITE9fQ09NUEFSSVNPTl9ESVJFQ1RJT05fRVEsIFN0YWJsZWhsb0NvbXBhcmlzb25EaXJlY3Rpb25fU1RBQkxFSExPX0NPTVBBUklTT05fRElSRUNUSU9OX0xUKSkgcmV0dXJuICIiOworICBjb25zdCBzaXplX3QgaW5kZXggPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGUpOworICByZXR1cm4gRW51bU5hbWVzU3RhYmxlaGxvQ29tcGFyaXNvbkRpcmVjdGlvbigpW2luZGV4XTsKK30KKworZW51bSBTdGFibGVobG9Db21wYXJpc29uVHlwZSA6IHVpbnQzMl90IHsKKyAgU3RhYmxlaGxvQ29tcGFyaXNvblR5cGVfU1RBQkxFSExPX0NPTVBBUklTT05fVFlQRV9OT1RZUEUgPSAwLAorICBTdGFibGVobG9Db21wYXJpc29uVHlwZV9TVEFCTEVITE9fQ09NUEFSSVNPTl9UWVBFX0ZMT0FUID0gMSwKKyAgU3RhYmxlaGxvQ29tcGFyaXNvblR5cGVfU1RBQkxFSExPX0NPTVBBUklTT05fVFlQRV9GTE9BVF9UT1RBTF9PUkRFUiA9IDIsCisgIFN0YWJsZWhsb0NvbXBhcmlzb25UeXBlX1NUQUJMRUhMT19DT01QQVJJU09OX1RZUEVfU0lHTkVEID0gMywKKyAgU3RhYmxlaGxvQ29tcGFyaXNvblR5cGVfU1RBQkxFSExPX0NPTVBBUklTT05fVFlQRV9VTlNJR05FRCA9IDQsCisgIFN0YWJsZWhsb0NvbXBhcmlzb25UeXBlX01JTiA9IFN0YWJsZWhsb0NvbXBhcmlzb25UeXBlX1NUQUJMRUhMT19DT01QQVJJU09OX1RZUEVfTk9UWVBFLAorICBTdGFibGVobG9Db21wYXJpc29uVHlwZV9NQVggPSBTdGFibGVobG9Db21wYXJpc29uVHlwZV9TVEFCTEVITE9fQ09NUEFSSVNPTl9UWVBFX1VOU0lHTkVECit9OworCitpbmxpbmUgY29uc3QgU3RhYmxlaGxvQ29tcGFyaXNvblR5cGUgKCZFbnVtVmFsdWVzU3RhYmxlaGxvQ29tcGFyaXNvblR5cGUoKSlbNV0geworICBzdGF0aWMgY29uc3QgU3RhYmxlaGxvQ29tcGFyaXNvblR5cGUgdmFsdWVzW10gPSB7CisgICAgU3RhYmxlaGxvQ29tcGFyaXNvblR5cGVfU1RBQkxFSExPX0NPTVBBUklTT05fVFlQRV9OT1RZUEUsCisgICAgU3RhYmxlaGxvQ29tcGFyaXNvblR5cGVfU1RBQkxFSExPX0NPTVBBUklTT05fVFlQRV9GTE9BVCwKKyAgICBTdGFibGVobG9Db21wYXJpc29uVHlwZV9TVEFCTEVITE9fQ09NUEFSSVNPTl9UWVBFX0ZMT0FUX1RPVEFMX09SREVSLAorICAgIFN0YWJsZWhsb0NvbXBhcmlzb25UeXBlX1NUQUJMRUhMT19DT01QQVJJU09OX1RZUEVfU0lHTkVELAorICAgIFN0YWJsZWhsb0NvbXBhcmlzb25UeXBlX1NUQUJMRUhMT19DT01QQVJJU09OX1RZUEVfVU5TSUdORUQKKyAgfTsKKyAgcmV0dXJuIHZhbHVlczsKK30KKworaW5saW5lIGNvbnN0IGNoYXIgKiBjb25zdCAqRW51bU5hbWVzU3RhYmxlaGxvQ29tcGFyaXNvblR5cGUoKSB7CisgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgbmFtZXNbNl0gPSB7CisgICAgIlNUQUJMRUhMT19DT01QQVJJU09OX1RZUEVfTk9UWVBFIiwKKyAgICAiU1RBQkxFSExPX0NPTVBBUklTT05fVFlQRV9GTE9BVCIsCisgICAgIlNUQUJMRUhMT19DT01QQVJJU09OX1RZUEVfRkxPQVRfVE9UQUxfT1JERVIiLAorICAgICJTVEFCTEVITE9fQ09NUEFSSVNPTl9UWVBFX1NJR05FRCIsCisgICAgIlNUQUJMRUhMT19DT01QQVJJU09OX1RZUEVfVU5TSUdORUQiLAorICAgIG51bGxwdHIKKyAgfTsKKyAgcmV0dXJuIG5hbWVzOworfQorCitpbmxpbmUgY29uc3QgY2hhciAqRW51bU5hbWVTdGFibGVobG9Db21wYXJpc29uVHlwZShTdGFibGVobG9Db21wYXJpc29uVHlwZSBlKSB7CisgIGlmICg6OmZsYXRidWZmZXJzOjpJc091dFJhbmdlKGUsIFN0YWJsZWhsb0NvbXBhcmlzb25UeXBlX1NUQUJMRUhMT19DT01QQVJJU09OX1RZUEVfTk9UWVBFLCBTdGFibGVobG9Db21wYXJpc29uVHlwZV9TVEFCTEVITE9fQ09NUEFSSVNPTl9UWVBFX1VOU0lHTkVEKSkgcmV0dXJuICIiOworICBjb25zdCBzaXplX3QgaW5kZXggPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGUpOworICByZXR1cm4gRW51bU5hbWVzU3RhYmxlaGxvQ29tcGFyaXNvblR5cGUoKVtpbmRleF07Cit9CisKK2VudW0gUm5nQWxnb3JpdGhtIDogaW50OF90IHsKKyAgUm5nQWxnb3JpdGhtX0RFRkFVTFQgPSAwLAorICBSbmdBbGdvcml0aG1fUEhJTE9YID0gMSwKKyAgUm5nQWxnb3JpdGhtX1RIUkVFRlJZID0gMiwKKyAgUm5nQWxnb3JpdGhtX01JTiA9IFJuZ0FsZ29yaXRobV9ERUZBVUxULAorICBSbmdBbGdvcml0aG1fTUFYID0gUm5nQWxnb3JpdGhtX1RIUkVFRlJZCit9OworCitpbmxpbmUgY29uc3QgUm5nQWxnb3JpdGhtICgmRW51bVZhbHVlc1JuZ0FsZ29yaXRobSgpKVszXSB7CisgIHN0YXRpYyBjb25zdCBSbmdBbGdvcml0aG0gdmFsdWVzW10gPSB7CisgICAgUm5nQWxnb3JpdGhtX0RFRkFVTFQsCisgICAgUm5nQWxnb3JpdGhtX1BISUxPWCwKKyAgICBSbmdBbGdvcml0aG1fVEhSRUVGUlkKKyAgfTsKKyAgcmV0dXJuIHZhbHVlczsKK30KKworaW5saW5lIGNvbnN0IGNoYXIgKiBjb25zdCAqRW51bU5hbWVzUm5nQWxnb3JpdGhtKCkgeworICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IG5hbWVzWzRdID0geworICAgICJERUZBVUxUIiwKKyAgICAiUEhJTE9YIiwKKyAgICAiVEhSRUVGUlkiLAorICAgIG51bGxwdHIKKyAgfTsKKyAgcmV0dXJuIG5hbWVzOworfQorCitpbmxpbmUgY29uc3QgY2hhciAqRW51bU5hbWVSbmdBbGdvcml0aG0oUm5nQWxnb3JpdGhtIGUpIHsKKyAgaWYgKDo6ZmxhdGJ1ZmZlcnM6OklzT3V0UmFuZ2UoZSwgUm5nQWxnb3JpdGhtX0RFRkFVTFQsIFJuZ0FsZ29yaXRobV9USFJFRUZSWSkpIHJldHVybiAiIjsKKyAgY29uc3Qgc2l6ZV90IGluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihlKTsKKyAgcmV0dXJuIEVudW1OYW1lc1JuZ0FsZ29yaXRobSgpW2luZGV4XTsKK30KIAogZW51bSBQYWRkaW5nIDogaW50OF90IHsKICAgUGFkZGluZ19TQU1FID0gMCwKQEAgLTM5MTAsNyArNDc0OCw3IEBACiB9CiAKIGlubGluZSBjb25zdCBjaGFyICpFbnVtTmFtZVBhZGRpbmcoUGFkZGluZyBlKSB7Ci0gIGlmIChmbGF0YnVmZmVyczo6SXNPdXRSYW5nZShlLCBQYWRkaW5nX1NBTUUsIFBhZGRpbmdfVkFMSUQpKSByZXR1cm4gIiI7CisgIGlmICg6OmZsYXRidWZmZXJzOjpJc091dFJhbmdlKGUsIFBhZGRpbmdfU0FNRSwgUGFkZGluZ19WQUxJRCkpIHJldHVybiAiIjsKICAgY29uc3Qgc2l6ZV90IGluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihlKTsKICAgcmV0dXJuIEVudW1OYW1lc1BhZGRpbmcoKVtpbmRleF07CiB9CkBAIC0zOTUyLDcgKzQ3OTAsNyBAQAogfQogCiBpbmxpbmUgY29uc3QgY2hhciAqRW51bU5hbWVBY3RpdmF0aW9uRnVuY3Rpb25UeXBlKEFjdGl2YXRpb25GdW5jdGlvblR5cGUgZSkgewotICBpZiAoZmxhdGJ1ZmZlcnM6OklzT3V0UmFuZ2UoZSwgQWN0aXZhdGlvbkZ1bmN0aW9uVHlwZV9OT05FLCBBY3RpdmF0aW9uRnVuY3Rpb25UeXBlX1NJR05fQklUKSkgcmV0dXJuICIiOworICBpZiAoOjpmbGF0YnVmZmVyczo6SXNPdXRSYW5nZShlLCBBY3RpdmF0aW9uRnVuY3Rpb25UeXBlX05PTkUsIEFjdGl2YXRpb25GdW5jdGlvblR5cGVfU0lHTl9CSVQpKSByZXR1cm4gIiI7CiAgIGNvbnN0IHNpemVfdCBpbmRleCA9IHN0YXRpY19jYXN0PHNpemVfdD4oZSk7CiAgIHJldHVybiBFbnVtTmFtZXNBY3RpdmF0aW9uRnVuY3Rpb25UeXBlKClbaW5kZXhdOwogfQpAQCAtMzk4NSw3ICs0ODIzLDcgQEAKIH0KIAogaW5saW5lIGNvbnN0IGNoYXIgKkVudW1OYW1lTFNIUHJvamVjdGlvblR5cGUoTFNIUHJvamVjdGlvblR5cGUgZSkgewotICBpZiAoZmxhdGJ1ZmZlcnM6OklzT3V0UmFuZ2UoZSwgTFNIUHJvamVjdGlvblR5cGVfVU5LTk9XTiwgTFNIUHJvamVjdGlvblR5cGVfREVOU0UpKSByZXR1cm4gIiI7CisgIGlmICg6OmZsYXRidWZmZXJzOjpJc091dFJhbmdlKGUsIExTSFByb2plY3Rpb25UeXBlX1VOS05PV04sIExTSFByb2plY3Rpb25UeXBlX0RFTlNFKSkgcmV0dXJuICIiOwogICBjb25zdCBzaXplX3QgaW5kZXggPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGUpOwogICByZXR1cm4gRW51bU5hbWVzTFNIUHJvamVjdGlvblR5cGUoKVtpbmRleF07CiB9CkBAIC00MDE1LDcgKzQ4NTMsNyBAQAogfQogCiBpbmxpbmUgY29uc3QgY2hhciAqRW51bU5hbWVGdWxseUNvbm5lY3RlZE9wdGlvbnNXZWlnaHRzRm9ybWF0KEZ1bGx5Q29ubmVjdGVkT3B0aW9uc1dlaWdodHNGb3JtYXQgZSkgewotICBpZiAoZmxhdGJ1ZmZlcnM6OklzT3V0UmFuZ2UoZSwgRnVsbHlDb25uZWN0ZWRPcHRpb25zV2VpZ2h0c0Zvcm1hdF9ERUZBVUxULCBGdWxseUNvbm5lY3RlZE9wdGlvbnNXZWlnaHRzRm9ybWF0X1NIVUZGTEVENHgxNklOVDgpKSByZXR1cm4gIiI7CisgIGlmICg6OmZsYXRidWZmZXJzOjpJc091dFJhbmdlKGUsIEZ1bGx5Q29ubmVjdGVkT3B0aW9uc1dlaWdodHNGb3JtYXRfREVGQVVMVCwgRnVsbHlDb25uZWN0ZWRPcHRpb25zV2VpZ2h0c0Zvcm1hdF9TSFVGRkxFRDR4MTZJTlQ4KSkgcmV0dXJuICIiOwogICBjb25zdCBzaXplX3QgaW5kZXggPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGUpOwogICByZXR1cm4gRW51bU5hbWVzRnVsbHlDb25uZWN0ZWRPcHRpb25zV2VpZ2h0c0Zvcm1hdCgpW2luZGV4XTsKIH0KQEAgLTQwNDUsNyArNDg4Myw3IEBACiB9CiAKIGlubGluZSBjb25zdCBjaGFyICpFbnVtTmFtZUxTVE1LZXJuZWxUeXBlKExTVE1LZXJuZWxUeXBlIGUpIHsKLSAgaWYgKGZsYXRidWZmZXJzOjpJc091dFJhbmdlKGUsIExTVE1LZXJuZWxUeXBlX0ZVTEwsIExTVE1LZXJuZWxUeXBlX0JBU0lDKSkgcmV0dXJuICIiOworICBpZiAoOjpmbGF0YnVmZmVyczo6SXNPdXRSYW5nZShlLCBMU1RNS2VybmVsVHlwZV9GVUxMLCBMU1RNS2VybmVsVHlwZV9CQVNJQykpIHJldHVybiAiIjsKICAgY29uc3Qgc2l6ZV90IGluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihlKTsKICAgcmV0dXJuIEVudW1OYW1lc0xTVE1LZXJuZWxUeXBlKClbaW5kZXhdOwogfQpAQCAtNDA3OCw3ICs0OTE2LDcgQEAKIH0KIAogaW5saW5lIGNvbnN0IGNoYXIgKkVudW1OYW1lQ29tYmluZXJUeXBlKENvbWJpbmVyVHlwZSBlKSB7Ci0gIGlmIChmbGF0YnVmZmVyczo6SXNPdXRSYW5nZShlLCBDb21iaW5lclR5cGVfU1VNLCBDb21iaW5lclR5cGVfU1FSVE4pKSByZXR1cm4gIiI7CisgIGlmICg6OmZsYXRidWZmZXJzOjpJc091dFJhbmdlKGUsIENvbWJpbmVyVHlwZV9TVU0sIENvbWJpbmVyVHlwZV9TUVJUTikpIHJldHVybiAiIjsKICAgY29uc3Qgc2l6ZV90IGluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihlKTsKICAgcmV0dXJuIEVudW1OYW1lc0NvbWJpbmVyVHlwZSgpW2luZGV4XTsKIH0KQEAgLTQxMDgsMTEgKzQ5NDYsNTYgQEAKIH0KIAogaW5saW5lIGNvbnN0IGNoYXIgKkVudW1OYW1lTWlycm9yUGFkTW9kZShNaXJyb3JQYWRNb2RlIGUpIHsKLSAgaWYgKGZsYXRidWZmZXJzOjpJc091dFJhbmdlKGUsIE1pcnJvclBhZE1vZGVfUkVGTEVDVCwgTWlycm9yUGFkTW9kZV9TWU1NRVRSSUMpKSByZXR1cm4gIiI7CisgIGlmICg6OmZsYXRidWZmZXJzOjpJc091dFJhbmdlKGUsIE1pcnJvclBhZE1vZGVfUkVGTEVDVCwgTWlycm9yUGFkTW9kZV9TWU1NRVRSSUMpKSByZXR1cm4gIiI7CiAgIGNvbnN0IHNpemVfdCBpbmRleCA9IHN0YXRpY19jYXN0PHNpemVfdD4oZSk7CiAgIHJldHVybiBFbnVtTmFtZXNNaXJyb3JQYWRNb2RlKClbaW5kZXhdOwogfQogCitlbnVtIFJlZHVjZVdpbmRvd0Z1bmN0aW9uIDogaW50MzJfdCB7CisgIFJlZHVjZVdpbmRvd0Z1bmN0aW9uX1VOU1VQUE9SVEVEID0gMCwKKyAgUmVkdWNlV2luZG93RnVuY3Rpb25fQUREID0gMSwKKyAgUmVkdWNlV2luZG93RnVuY3Rpb25fTVVMID0gMiwKKyAgUmVkdWNlV2luZG93RnVuY3Rpb25fTUlOSU1VTSA9IDMsCisgIFJlZHVjZVdpbmRvd0Z1bmN0aW9uX01BWElNVU0gPSA0LAorICBSZWR1Y2VXaW5kb3dGdW5jdGlvbl9BTEwgPSA1LAorICBSZWR1Y2VXaW5kb3dGdW5jdGlvbl9BTlkgPSA2LAorICBSZWR1Y2VXaW5kb3dGdW5jdGlvbl9NSU4gPSBSZWR1Y2VXaW5kb3dGdW5jdGlvbl9VTlNVUFBPUlRFRCwKKyAgUmVkdWNlV2luZG93RnVuY3Rpb25fTUFYID0gUmVkdWNlV2luZG93RnVuY3Rpb25fQU5ZCit9OworCitpbmxpbmUgY29uc3QgUmVkdWNlV2luZG93RnVuY3Rpb24gKCZFbnVtVmFsdWVzUmVkdWNlV2luZG93RnVuY3Rpb24oKSlbN10geworICBzdGF0aWMgY29uc3QgUmVkdWNlV2luZG93RnVuY3Rpb24gdmFsdWVzW10gPSB7CisgICAgUmVkdWNlV2luZG93RnVuY3Rpb25fVU5TVVBQT1JURUQsCisgICAgUmVkdWNlV2luZG93RnVuY3Rpb25fQURELAorICAgIFJlZHVjZVdpbmRvd0Z1bmN0aW9uX01VTCwKKyAgICBSZWR1Y2VXaW5kb3dGdW5jdGlvbl9NSU5JTVVNLAorICAgIFJlZHVjZVdpbmRvd0Z1bmN0aW9uX01BWElNVU0sCisgICAgUmVkdWNlV2luZG93RnVuY3Rpb25fQUxMLAorICAgIFJlZHVjZVdpbmRvd0Z1bmN0aW9uX0FOWQorICB9OworICByZXR1cm4gdmFsdWVzOworfQorCitpbmxpbmUgY29uc3QgY2hhciAqIGNvbnN0ICpFbnVtTmFtZXNSZWR1Y2VXaW5kb3dGdW5jdGlvbigpIHsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBuYW1lc1s4XSA9IHsKKyAgICAiVU5TVVBQT1JURUQiLAorICAgICJBREQiLAorICAgICJNVUwiLAorICAgICJNSU5JTVVNIiwKKyAgICAiTUFYSU1VTSIsCisgICAgIkFMTCIsCisgICAgIkFOWSIsCisgICAgbnVsbHB0cgorICB9OworICByZXR1cm4gbmFtZXM7Cit9CisKK2lubGluZSBjb25zdCBjaGFyICpFbnVtTmFtZVJlZHVjZVdpbmRvd0Z1bmN0aW9uKFJlZHVjZVdpbmRvd0Z1bmN0aW9uIGUpIHsKKyAgaWYgKDo6ZmxhdGJ1ZmZlcnM6OklzT3V0UmFuZ2UoZSwgUmVkdWNlV2luZG93RnVuY3Rpb25fVU5TVVBQT1JURUQsIFJlZHVjZVdpbmRvd0Z1bmN0aW9uX0FOWSkpIHJldHVybiAiIjsKKyAgY29uc3Qgc2l6ZV90IGluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihlKTsKKyAgcmV0dXJuIEVudW1OYW1lc1JlZHVjZVdpbmRvd0Z1bmN0aW9uKClbaW5kZXhdOworfQorCiBlbnVtIEN1c3RvbU9wdGlvbnNGb3JtYXQgOiBpbnQ4X3QgewogICBDdXN0b21PcHRpb25zRm9ybWF0X0ZMRVhCVUZGRVJTID0gMCwKICAgQ3VzdG9tT3B0aW9uc0Zvcm1hdF9NSU4gPSBDdXN0b21PcHRpb25zRm9ybWF0X0ZMRVhCVUZGRVJTLApAQCAtNDEzNSw2NCArNTAxOCw2NCBAQAogfQogCiBpbmxpbmUgY29uc3QgY2hhciAqRW51bU5hbWVDdXN0b21PcHRpb25zRm9ybWF0KEN1c3RvbU9wdGlvbnNGb3JtYXQgZSkgewotICBpZiAoZmxhdGJ1ZmZlcnM6OklzT3V0UmFuZ2UoZSwgQ3VzdG9tT3B0aW9uc0Zvcm1hdF9GTEVYQlVGRkVSUywgQ3VzdG9tT3B0aW9uc0Zvcm1hdF9GTEVYQlVGRkVSUykpIHJldHVybiAiIjsKKyAgaWYgKDo6ZmxhdGJ1ZmZlcnM6OklzT3V0UmFuZ2UoZSwgQ3VzdG9tT3B0aW9uc0Zvcm1hdF9GTEVYQlVGRkVSUywgQ3VzdG9tT3B0aW9uc0Zvcm1hdF9GTEVYQlVGRkVSUykpIHJldHVybiAiIjsKICAgY29uc3Qgc2l6ZV90IGluZGV4ID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihlKTsKICAgcmV0dXJuIEVudW1OYW1lc0N1c3RvbU9wdGlvbnNGb3JtYXQoKVtpbmRleF07CiB9CiAKLXN0cnVjdCBDdXN0b21RdWFudGl6YXRpb25UIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgQ3VzdG9tUXVhbnRpemF0aW9uVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgQ3VzdG9tUXVhbnRpemF0aW9uIFRhYmxlVHlwZTsKICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY3VzdG9te307CiB9OwogCi1zdHJ1Y3QgQ3VzdG9tUXVhbnRpemF0aW9uIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IEN1c3RvbVF1YW50aXphdGlvbiBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIEN1c3RvbVF1YW50aXphdGlvblQgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIEN1c3RvbVF1YW50aXphdGlvbkJ1aWxkZXIgQnVpbGRlcjsKICAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKICAgICBWVF9DVVNUT00gPSA0CiAgIH07Ci0gIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKmN1c3RvbSgpIGNvbnN0IHsKLSAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICo+KFZUX0NVU1RPTSk7CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqY3VzdG9tKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqPihWVF9DVVNUT00pOwogICB9Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfQ1VTVE9NKSAmJgogICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IoY3VzdG9tKCkpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgQ3VzdG9tUXVhbnRpemF0aW9uVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhDdXN0b21RdWFudGl6YXRpb25UICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDdXN0b21RdWFudGl6YXRpb24+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBDdXN0b21RdWFudGl6YXRpb25UKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBDdXN0b21RdWFudGl6YXRpb25UICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oQ3VzdG9tUXVhbnRpemF0aW9uVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEN1c3RvbVF1YW50aXphdGlvbj4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQ3VzdG9tUXVhbnRpemF0aW9uVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IEN1c3RvbVF1YW50aXphdGlvbkJ1aWxkZXIgewogICB0eXBlZGVmIEN1c3RvbVF1YW50aXphdGlvbiBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgdm9pZCBhZGRfY3VzdG9tKGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90Pj4gY3VzdG9tKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICB2b2lkIGFkZF9jdXN0b20oOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90Pj4gY3VzdG9tKSB7CiAgICAgZmJiXy5BZGRPZmZzZXQoQ3VzdG9tUXVhbnRpemF0aW9uOjpWVF9DVVNUT00sIGN1c3RvbSk7CiAgIH0KLSAgZXhwbGljaXQgQ3VzdG9tUXVhbnRpemF0aW9uQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIGV4cGxpY2l0IEN1c3RvbVF1YW50aXphdGlvbkJ1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDdXN0b21RdWFudGl6YXRpb24+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEN1c3RvbVF1YW50aXphdGlvbj4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8Q3VzdG9tUXVhbnRpemF0aW9uPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDdXN0b21RdWFudGl6YXRpb24+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEN1c3RvbVF1YW50aXphdGlvbj4gQ3JlYXRlQ3VzdG9tUXVhbnRpemF0aW9uKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKLSAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4+IGN1c3RvbSA9IDApIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Q3VzdG9tUXVhbnRpemF0aW9uPiBDcmVhdGVDdXN0b21RdWFudGl6YXRpb24oCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90Pj4gY3VzdG9tID0gMCkgewogICBDdXN0b21RdWFudGl6YXRpb25CdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICBidWlsZGVyXy5hZGRfY3VzdG9tKGN1c3RvbSk7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8Q3VzdG9tUXVhbnRpemF0aW9uPiBDcmVhdGVDdXN0b21RdWFudGl6YXRpb25EaXJlY3QoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAoraW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDdXN0b21RdWFudGl6YXRpb24+IENyZWF0ZUN1c3RvbVF1YW50aXphdGlvbkRpcmVjdCgKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqY3VzdG9tID0gbnVsbHB0cikgewogICBpZiAoY3VzdG9tKSB7IF9mYmIuRm9yY2VWZWN0b3JBbGlnbm1lbnQoY3VzdG9tLT5zaXplKCksIHNpemVvZih1aW50OF90KSwgMTYpOyB9CiAgIGF1dG8gY3VzdG9tX18gPSBjdXN0b20gPyBfZmJiLkNyZWF0ZVZlY3Rvcjx1aW50OF90PigqY3VzdG9tKSA6IDA7CkBAIC00MjAxLDkgKzUwODQsOSBAQAogICAgICAgY3VzdG9tX18pOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PEN1c3RvbVF1YW50aXphdGlvbj4gQ3JlYXRlQ3VzdG9tUXVhbnRpemF0aW9uKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQ3VzdG9tUXVhbnRpemF0aW9uVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDdXN0b21RdWFudGl6YXRpb24+IENyZWF0ZUN1c3RvbVF1YW50aXphdGlvbig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQ3VzdG9tUXVhbnRpemF0aW9uVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgUXVhbnRpemF0aW9uUGFyYW1ldGVyc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBRdWFudGl6YXRpb25QYXJhbWV0ZXJzVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgUXVhbnRpemF0aW9uUGFyYW1ldGVycyBUYWJsZVR5cGU7CiAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBtaW57fTsKICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IG1heHt9OwpAQCAtNDIxMyw3ICs1MDk2LDcgQEAKICAgaW50MzJfdCBxdWFudGl6ZWRfZGltZW5zaW9uID0gMDsKIH07CiAKLXN0cnVjdCBRdWFudGl6YXRpb25QYXJhbWV0ZXJzIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IFF1YW50aXphdGlvblBhcmFtZXRlcnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBRdWFudGl6YXRpb25QYXJhbWV0ZXJzVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgUXVhbnRpemF0aW9uUGFyYW1ldGVyc0J1aWxkZXIgQnVpbGRlcjsKICAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKQEAgLTQyMjUsMTcgKzUxMDgsMTcgQEAKICAgICBWVF9ERVRBSUxTID0gMTQsCiAgICAgVlRfUVVBTlRJWkVEX0RJTUVOU0lPTiA9IDE2CiAgIH07Ci0gIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxvYXQ+ICptaW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbG9hdD4gKj4oVlRfTUlOKTsKKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPGZsb2F0PiAqbWluKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbG9hdD4gKj4oVlRfTUlOKTsKICAgfQotICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsb2F0PiAqbWF4KCkgY29uc3QgewotICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxvYXQ+ICo+KFZUX01BWCk7CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbG9hdD4gKm1heCgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8ZmxvYXQ+ICo+KFZUX01BWCk7CiAgIH0KLSAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbG9hdD4gKnNjYWxlKCkgY29uc3QgewotICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxvYXQ+ICo+KFZUX1NDQUxFKTsKKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPGZsb2F0PiAqc2NhbGUoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPGZsb2F0PiAqPihWVF9TQ0FMRSk7CiAgIH0KLSAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiAqemVyb19wb2ludCgpIGNvbnN0IHsKLSAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+ICo+KFZUX1pFUk9fUE9JTlQpOworICBjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4gKnplcm9fcG9pbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+ICo+KFZUX1pFUk9fUE9JTlQpOwogICB9CiAgIHRmbGl0ZTo6UXVhbnRpemF0aW9uRGV0YWlscyBkZXRhaWxzX3R5cGUoKSBjb25zdCB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHRmbGl0ZTo6UXVhbnRpemF0aW9uRGV0YWlscz4oR2V0RmllbGQ8dWludDhfdD4oVlRfREVUQUlMU19UWVBFLCAwKSk7CkBAIC00MjUwLDcgKzUxMzMsNyBAQAogICBpbnQzMl90IHF1YW50aXplZF9kaW1lbnNpb24oKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldEZpZWxkPGludDMyX3Q+KFZUX1FVQU5USVpFRF9ESU1FTlNJT04sIDApOwogICB9Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfTUlOKSAmJgogICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IobWluKCkpICYmCkBAIC00MjY2LDkgKzUxNDksOSBAQAogICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQzMl90Pih2ZXJpZmllciwgVlRfUVVBTlRJWkVEX0RJTUVOU0lPTiwgNCkgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBRdWFudGl6YXRpb25QYXJhbWV0ZXJzVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhRdWFudGl6YXRpb25QYXJhbWV0ZXJzVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8UXVhbnRpemF0aW9uUGFyYW1ldGVycz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFF1YW50aXphdGlvblBhcmFtZXRlcnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBRdWFudGl6YXRpb25QYXJhbWV0ZXJzVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFF1YW50aXphdGlvblBhcmFtZXRlcnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UXVhbnRpemF0aW9uUGFyYW1ldGVycz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUXVhbnRpemF0aW9uUGFyYW1ldGVyc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHRlbXBsYXRlPD4gaW5saW5lIGNvbnN0IHRmbGl0ZTo6Q3VzdG9tUXVhbnRpemF0aW9uICpRdWFudGl6YXRpb25QYXJhbWV0ZXJzOjpkZXRhaWxzX2FzPHRmbGl0ZTo6Q3VzdG9tUXVhbnRpemF0aW9uPigpIGNvbnN0IHsKQEAgLTQyNzcsNDggKzUxNjAsNDggQEAKIAogc3RydWN0IFF1YW50aXphdGlvblBhcmFtZXRlcnNCdWlsZGVyIHsKICAgdHlwZWRlZiBRdWFudGl6YXRpb25QYXJhbWV0ZXJzIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwotICB2b2lkIGFkZF9taW4oZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGZsb2F0Pj4gbWluKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICB2b2lkIGFkZF9taW4oOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbG9hdD4+IG1pbikgewogICAgIGZiYl8uQWRkT2Zmc2V0KFF1YW50aXphdGlvblBhcmFtZXRlcnM6OlZUX01JTiwgbWluKTsKICAgfQotICB2b2lkIGFkZF9tYXgoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGZsb2F0Pj4gbWF4KSB7CisgIHZvaWQgYWRkX21heCg6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGZsb2F0Pj4gbWF4KSB7CiAgICAgZmJiXy5BZGRPZmZzZXQoUXVhbnRpemF0aW9uUGFyYW1ldGVyczo6VlRfTUFYLCBtYXgpOwogICB9Ci0gIHZvaWQgYWRkX3NjYWxlKGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbG9hdD4+IHNjYWxlKSB7CisgIHZvaWQgYWRkX3NjYWxlKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8ZmxvYXQ+PiBzY2FsZSkgewogICAgIGZiYl8uQWRkT2Zmc2V0KFF1YW50aXphdGlvblBhcmFtZXRlcnM6OlZUX1NDQUxFLCBzY2FsZSk7CiAgIH0KLSAgdm9pZCBhZGRfemVyb19wb2ludChmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4+IHplcm9fcG9pbnQpIHsKKyAgdm9pZCBhZGRfemVyb19wb2ludCg6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+PiB6ZXJvX3BvaW50KSB7CiAgICAgZmJiXy5BZGRPZmZzZXQoUXVhbnRpemF0aW9uUGFyYW1ldGVyczo6VlRfWkVST19QT0lOVCwgemVyb19wb2ludCk7CiAgIH0KICAgdm9pZCBhZGRfZGV0YWlsc190eXBlKHRmbGl0ZTo6UXVhbnRpemF0aW9uRGV0YWlscyBkZXRhaWxzX3R5cGUpIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDhfdD4oUXVhbnRpemF0aW9uUGFyYW1ldGVyczo6VlRfREVUQUlMU19UWVBFLCBzdGF0aWNfY2FzdDx1aW50OF90PihkZXRhaWxzX3R5cGUpLCAwKTsKICAgfQotICB2b2lkIGFkZF9kZXRhaWxzKGZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4gZGV0YWlscykgeworICB2b2lkIGFkZF9kZXRhaWxzKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPiBkZXRhaWxzKSB7CiAgICAgZmJiXy5BZGRPZmZzZXQoUXVhbnRpemF0aW9uUGFyYW1ldGVyczo6VlRfREVUQUlMUywgZGV0YWlscyk7CiAgIH0KICAgdm9pZCBhZGRfcXVhbnRpemVkX2RpbWVuc2lvbihpbnQzMl90IHF1YW50aXplZF9kaW1lbnNpb24pIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8aW50MzJfdD4oUXVhbnRpemF0aW9uUGFyYW1ldGVyczo6VlRfUVVBTlRJWkVEX0RJTUVOU0lPTiwgcXVhbnRpemVkX2RpbWVuc2lvbiwgMCk7CiAgIH0KLSAgZXhwbGljaXQgUXVhbnRpemF0aW9uUGFyYW1ldGVyc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICBleHBsaWNpdCBRdWFudGl6YXRpb25QYXJhbWV0ZXJzQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PFF1YW50aXphdGlvblBhcmFtZXRlcnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFF1YW50aXphdGlvblBhcmFtZXRlcnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PFF1YW50aXphdGlvblBhcmFtZXRlcnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFF1YW50aXphdGlvblBhcmFtZXRlcnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFF1YW50aXphdGlvblBhcmFtZXRlcnM+IENyZWF0ZVF1YW50aXphdGlvblBhcmFtZXRlcnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAotICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbG9hdD4+IG1pbiA9IDAsCi0gICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGZsb2F0Pj4gbWF4ID0gMCwKLSAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxvYXQ+PiBzY2FsZSA9IDAsCi0gICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+PiB6ZXJvX3BvaW50ID0gMCwKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UXVhbnRpemF0aW9uUGFyYW1ldGVycz4gQ3JlYXRlUXVhbnRpemF0aW9uUGFyYW1ldGVycygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGZsb2F0Pj4gbWluID0gMCwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGZsb2F0Pj4gbWF4ID0gMCwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGZsb2F0Pj4gc2NhbGUgPSAwLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4+IHplcm9fcG9pbnQgPSAwLAogICAgIHRmbGl0ZTo6UXVhbnRpemF0aW9uRGV0YWlscyBkZXRhaWxzX3R5cGUgPSB0ZmxpdGU6OlF1YW50aXphdGlvbkRldGFpbHNfTk9ORSwKLSAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+IGRldGFpbHMgPSAwLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPiBkZXRhaWxzID0gMCwKICAgICBpbnQzMl90IHF1YW50aXplZF9kaW1lbnNpb24gPSAwKSB7CiAgIFF1YW50aXphdGlvblBhcmFtZXRlcnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICBidWlsZGVyXy5hZGRfcXVhbnRpemVkX2RpbWVuc2lvbihxdWFudGl6ZWRfZGltZW5zaW9uKTsKQEAgLTQzMzEsMTQgKzUyMTQsMTQgQEAKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxRdWFudGl6YXRpb25QYXJhbWV0ZXJzPiBDcmVhdGVRdWFudGl6YXRpb25QYXJhbWV0ZXJzRGlyZWN0KAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UXVhbnRpemF0aW9uUGFyYW1ldGVycz4gQ3JlYXRlUXVhbnRpemF0aW9uUGFyYW1ldGVyc0RpcmVjdCgKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKICAgICBjb25zdCBzdGQ6OnZlY3RvcjxmbG9hdD4gKm1pbiA9IG51bGxwdHIsCiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICptYXggPSBudWxscHRyLAogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGZsb2F0PiAqc2NhbGUgPSBudWxscHRyLAogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICp6ZXJvX3BvaW50ID0gbnVsbHB0ciwKICAgICB0ZmxpdGU6OlF1YW50aXphdGlvbkRldGFpbHMgZGV0YWlsc190eXBlID0gdGZsaXRlOjpRdWFudGl6YXRpb25EZXRhaWxzX05PTkUsCi0gICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPiBkZXRhaWxzID0gMCwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4gZGV0YWlscyA9IDAsCiAgICAgaW50MzJfdCBxdWFudGl6ZWRfZGltZW5zaW9uID0gMCkgewogICBhdXRvIG1pbl9fID0gbWluID8gX2ZiYi5DcmVhdGVWZWN0b3I8ZmxvYXQ+KCptaW4pIDogMDsKICAgYXV0byBtYXhfXyA9IG1heCA/IF9mYmIuQ3JlYXRlVmVjdG9yPGZsb2F0PigqbWF4KSA6IDA7CkBAIC00MzU1LDYxICs1MjM4LDYxIEBACiAgICAgICBxdWFudGl6ZWRfZGltZW5zaW9uKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxRdWFudGl6YXRpb25QYXJhbWV0ZXJzPiBDcmVhdGVRdWFudGl6YXRpb25QYXJhbWV0ZXJzKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUXVhbnRpemF0aW9uUGFyYW1ldGVyc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UXVhbnRpemF0aW9uUGFyYW1ldGVycz4gQ3JlYXRlUXVhbnRpemF0aW9uUGFyYW1ldGVycyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUXVhbnRpemF0aW9uUGFyYW1ldGVyc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IEludDMyVmVjdG9yVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IEludDMyVmVjdG9yVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgSW50MzJWZWN0b3IgVGFibGVUeXBlOwogICBzdGQ6OnZlY3RvcjxpbnQzMl90PiB2YWx1ZXN7fTsKIH07CiAKLXN0cnVjdCBJbnQzMlZlY3RvciBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBJbnQzMlZlY3RvciBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIEludDMyVmVjdG9yVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgSW50MzJWZWN0b3JCdWlsZGVyIEJ1aWxkZXI7CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CiAgICAgVlRfVkFMVUVTID0gNAogICB9OwotICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+ICp2YWx1ZXMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90PiAqPihWVF9WQUxVRVMpOworICBjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4gKnZhbHVlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4gKj4oVlRfVkFMVUVTKTsKICAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1ZBTFVFUykgJiYKICAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHZhbHVlcygpKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIEludDMyVmVjdG9yVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhJbnQzMlZlY3RvclQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PEludDMyVmVjdG9yPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSW50MzJWZWN0b3JUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBJbnQzMlZlY3RvclQgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhJbnQzMlZlY3RvclQgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxJbnQzMlZlY3Rvcj4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSW50MzJWZWN0b3JUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgSW50MzJWZWN0b3JCdWlsZGVyIHsKICAgdHlwZWRlZiBJbnQzMlZlY3RvciBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgdm9pZCBhZGRfdmFsdWVzKGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90Pj4gdmFsdWVzKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICB2b2lkIGFkZF92YWx1ZXMoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90Pj4gdmFsdWVzKSB7CiAgICAgZmJiXy5BZGRPZmZzZXQoSW50MzJWZWN0b3I6OlZUX1ZBTFVFUywgdmFsdWVzKTsKICAgfQotICBleHBsaWNpdCBJbnQzMlZlY3RvckJ1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICBleHBsaWNpdCBJbnQzMlZlY3RvckJ1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxJbnQzMlZlY3Rvcj4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8SW50MzJWZWN0b3I+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PEludDMyVmVjdG9yPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxJbnQzMlZlY3Rvcj4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8SW50MzJWZWN0b3I+IENyZWF0ZUludDMyVmVjdG9yKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKLSAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4+IHZhbHVlcyA9IDApIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8SW50MzJWZWN0b3I+IENyZWF0ZUludDMyVmVjdG9yKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4+IHZhbHVlcyA9IDApIHsKICAgSW50MzJWZWN0b3JCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICBidWlsZGVyXy5hZGRfdmFsdWVzKHZhbHVlcyk7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8SW50MzJWZWN0b3I+IENyZWF0ZUludDMyVmVjdG9yRGlyZWN0KAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8SW50MzJWZWN0b3I+IENyZWF0ZUludDMyVmVjdG9yRGlyZWN0KAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICp2YWx1ZXMgPSBudWxscHRyKSB7CiAgIGF1dG8gdmFsdWVzX18gPSB2YWx1ZXMgPyBfZmJiLkNyZWF0ZVZlY3RvcjxpbnQzMl90PigqdmFsdWVzKSA6IDA7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZUludDMyVmVjdG9yKApAQCAtNDQxNyw2MSArNTMwMCw2MSBAQAogICAgICAgdmFsdWVzX18pOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PEludDMyVmVjdG9yPiBDcmVhdGVJbnQzMlZlY3RvcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEludDMyVmVjdG9yVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxJbnQzMlZlY3Rvcj4gQ3JlYXRlSW50MzJWZWN0b3IoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEludDMyVmVjdG9yVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgVWludDE2VmVjdG9yVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IFVpbnQxNlZlY3RvclQgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIFVpbnQxNlZlY3RvciBUYWJsZVR5cGU7CiAgIHN0ZDo6dmVjdG9yPHVpbnQxNl90PiB2YWx1ZXN7fTsKIH07CiAKLXN0cnVjdCBVaW50MTZWZWN0b3IgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgVWludDE2VmVjdG9yIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgVWludDE2VmVjdG9yVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgVWludDE2VmVjdG9yQnVpbGRlciBCdWlsZGVyOwogICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgewogICAgIFZUX1ZBTFVFUyA9IDQKICAgfTsKLSAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50MTZfdD4gKnZhbHVlcygpIGNvbnN0IHsKLSAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQxNl90PiAqPihWVF9WQUxVRVMpOworICBjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8dWludDE2X3Q+ICp2YWx1ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQxNl90PiAqPihWVF9WQUxVRVMpOwogICB9Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfVkFMVUVTKSAmJgogICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IodmFsdWVzKCkpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgVWludDE2VmVjdG9yVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhVaW50MTZWZWN0b3JUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVaW50MTZWZWN0b3I+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBVaW50MTZWZWN0b3JUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBVaW50MTZWZWN0b3JUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oVWludDE2VmVjdG9yVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFVpbnQxNlZlY3Rvcj4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVWludDE2VmVjdG9yVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IFVpbnQxNlZlY3RvckJ1aWxkZXIgewogICB0eXBlZGVmIFVpbnQxNlZlY3RvciBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgdm9pZCBhZGRfdmFsdWVzKGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50MTZfdD4+IHZhbHVlcykgeworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgdm9pZCBhZGRfdmFsdWVzKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8dWludDE2X3Q+PiB2YWx1ZXMpIHsKICAgICBmYmJfLkFkZE9mZnNldChVaW50MTZWZWN0b3I6OlZUX1ZBTFVFUywgdmFsdWVzKTsKICAgfQotICBleHBsaWNpdCBVaW50MTZWZWN0b3JCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgZXhwbGljaXQgVWludDE2VmVjdG9yQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PFVpbnQxNlZlY3Rvcj4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VWludDE2VmVjdG9yPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVaW50MTZWZWN0b3I+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFVpbnQxNlZlY3Rvcj4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8VWludDE2VmVjdG9yPiBDcmVhdGVVaW50MTZWZWN0b3IoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAotICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50MTZfdD4+IHZhbHVlcyA9IDApIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VWludDE2VmVjdG9yPiBDcmVhdGVVaW50MTZWZWN0b3IoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50MTZfdD4+IHZhbHVlcyA9IDApIHsKICAgVWludDE2VmVjdG9yQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKICAgYnVpbGRlcl8uYWRkX3ZhbHVlcyh2YWx1ZXMpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFVpbnQxNlZlY3Rvcj4gQ3JlYXRlVWludDE2VmVjdG9yRGlyZWN0KAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VWludDE2VmVjdG9yPiBDcmVhdGVVaW50MTZWZWN0b3JEaXJlY3QoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDE2X3Q+ICp2YWx1ZXMgPSBudWxscHRyKSB7CiAgIGlmICh2YWx1ZXMpIHsgX2ZiYi5Gb3JjZVZlY3RvckFsaWdubWVudCh2YWx1ZXMtPnNpemUoKSwgc2l6ZW9mKHVpbnQxNl90KSwgNCk7IH0KICAgYXV0byB2YWx1ZXNfXyA9IHZhbHVlcyA/IF9mYmIuQ3JlYXRlVmVjdG9yPHVpbnQxNl90PigqdmFsdWVzKSA6IDA7CkBAIC00NDgwLDYxICs1MzYzLDYxIEBACiAgICAgICB2YWx1ZXNfXyk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8VWludDE2VmVjdG9yPiBDcmVhdGVVaW50MTZWZWN0b3IoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBVaW50MTZWZWN0b3JUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFVpbnQxNlZlY3Rvcj4gQ3JlYXRlVWludDE2VmVjdG9yKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBVaW50MTZWZWN0b3JUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBVaW50OFZlY3RvclQgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBVaW50OFZlY3RvclQgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIFVpbnQ4VmVjdG9yIFRhYmxlVHlwZTsKICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWVze307CiB9OwogCi1zdHJ1Y3QgVWludDhWZWN0b3IgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgVWludDhWZWN0b3IgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBVaW50OFZlY3RvclQgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIFVpbnQ4VmVjdG9yQnVpbGRlciBCdWlsZGVyOwogICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgewogICAgIFZUX1ZBTFVFUyA9IDQKICAgfTsKLSAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqdmFsdWVzKCkgY29uc3QgewotICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKj4oVlRfVkFMVUVTKTsKKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICp2YWx1ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICo+KFZUX1ZBTFVFUyk7CiAgIH0KLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9WQUxVRVMpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3Rvcih2YWx1ZXMoKSkgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBVaW50OFZlY3RvclQgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oVWludDhWZWN0b3JUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVaW50OFZlY3Rvcj4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFVpbnQ4VmVjdG9yVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgVWludDhWZWN0b3JUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oVWludDhWZWN0b3JUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VWludDhWZWN0b3I+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFVpbnQ4VmVjdG9yVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IFVpbnQ4VmVjdG9yQnVpbGRlciB7CiAgIHR5cGVkZWYgVWludDhWZWN0b3IgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87Ci0gIHZvaWQgYWRkX3ZhbHVlcyhmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4+IHZhbHVlcykgeworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgdm9pZCBhZGRfdmFsdWVzKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4+IHZhbHVlcykgewogICAgIGZiYl8uQWRkT2Zmc2V0KFVpbnQ4VmVjdG9yOjpWVF9WQUxVRVMsIHZhbHVlcyk7CiAgIH0KLSAgZXhwbGljaXQgVWludDhWZWN0b3JCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgZXhwbGljaXQgVWludDhWZWN0b3JCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8VWludDhWZWN0b3I+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFVpbnQ4VmVjdG9yPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVaW50OFZlY3Rvcj4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VWludDhWZWN0b3I+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFVpbnQ4VmVjdG9yPiBDcmVhdGVVaW50OFZlY3RvcigKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCi0gICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+PiB2YWx1ZXMgPSAwKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFVpbnQ4VmVjdG9yPiBDcmVhdGVVaW50OFZlY3RvcigKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+PiB2YWx1ZXMgPSAwKSB7CiAgIFVpbnQ4VmVjdG9yQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKICAgYnVpbGRlcl8uYWRkX3ZhbHVlcyh2YWx1ZXMpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFVpbnQ4VmVjdG9yPiBDcmVhdGVVaW50OFZlY3RvckRpcmVjdCgKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFVpbnQ4VmVjdG9yPiBDcmVhdGVVaW50OFZlY3RvckRpcmVjdCgKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqdmFsdWVzID0gbnVsbHB0cikgewogICBpZiAodmFsdWVzKSB7IF9mYmIuRm9yY2VWZWN0b3JBbGlnbm1lbnQodmFsdWVzLT5zaXplKCksIHNpemVvZih1aW50OF90KSwgNCk7IH0KICAgYXV0byB2YWx1ZXNfXyA9IHZhbHVlcyA/IF9mYmIuQ3JlYXRlVmVjdG9yPHVpbnQ4X3Q+KCp2YWx1ZXMpIDogMDsKQEAgLTQ1NDMsOSArNTQyNiw5IEBACiAgICAgICB2YWx1ZXNfXyk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8VWludDhWZWN0b3I+IENyZWF0ZVVpbnQ4VmVjdG9yKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVWludDhWZWN0b3JUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFVpbnQ4VmVjdG9yPiBDcmVhdGVVaW50OFZlY3Rvcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVWludDhWZWN0b3JUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBEaW1lbnNpb25NZXRhZGF0YVQgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBEaW1lbnNpb25NZXRhZGF0YVQgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIERpbWVuc2lvbk1ldGFkYXRhIFRhYmxlVHlwZTsKICAgdGZsaXRlOjpEaW1lbnNpb25UeXBlIGZvcm1hdCA9IHRmbGl0ZTo6RGltZW5zaW9uVHlwZV9ERU5TRTsKICAgaW50MzJfdCBkZW5zZV9zaXplID0gMDsKQEAgLTQ1NTMsNyArNTQzNiw3IEBACiAgIHRmbGl0ZTo6U3BhcnNlSW5kZXhWZWN0b3JVbmlvbiBhcnJheV9pbmRpY2Vze307CiB9OwogCi1zdHJ1Y3QgRGltZW5zaW9uTWV0YWRhdGEgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgRGltZW5zaW9uTWV0YWRhdGEgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBEaW1lbnNpb25NZXRhZGF0YVQgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIERpbWVuc2lvbk1ldGFkYXRhQnVpbGRlciBCdWlsZGVyOwogICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgewpAQCAtNDYwMiw3ICs1NDg1LDcgQEAKICAgY29uc3QgdGZsaXRlOjpVaW50OFZlY3RvciAqYXJyYXlfaW5kaWNlc19hc19VaW50OFZlY3RvcigpIGNvbnN0IHsKICAgICByZXR1cm4gYXJyYXlfaW5kaWNlc190eXBlKCkgPT0gdGZsaXRlOjpTcGFyc2VJbmRleFZlY3Rvcl9VaW50OFZlY3RvciA/IHN0YXRpY19jYXN0PGNvbnN0IHRmbGl0ZTo6VWludDhWZWN0b3IgKj4oYXJyYXlfaW5kaWNlcygpKSA6IG51bGxwdHI7CiAgIH0KLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50OF90Pih2ZXJpZmllciwgVlRfRk9STUFULCAxKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQzMl90Pih2ZXJpZmllciwgVlRfREVOU0VfU0laRSwgNCkgJiYKQEAgLTQ2MTQsOSArNTQ5Nyw5IEBACiAgICAgICAgICAgIFZlcmlmeVNwYXJzZUluZGV4VmVjdG9yKHZlcmlmaWVyLCBhcnJheV9pbmRpY2VzKCksIGFycmF5X2luZGljZXNfdHlwZSgpKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIERpbWVuc2lvbk1ldGFkYXRhVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhEaW1lbnNpb25NZXRhZGF0YVQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PERpbWVuc2lvbk1ldGFkYXRhPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRGltZW5zaW9uTWV0YWRhdGFUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBEaW1lbnNpb25NZXRhZGF0YVQgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhEaW1lbnNpb25NZXRhZGF0YVQgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxEaW1lbnNpb25NZXRhZGF0YT4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRGltZW5zaW9uTWV0YWRhdGFUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiB0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB0ZmxpdGU6OkludDMyVmVjdG9yICpEaW1lbnNpb25NZXRhZGF0YTo6YXJyYXlfc2VnbWVudHNfYXM8dGZsaXRlOjpJbnQzMlZlY3Rvcj4oKSBjb25zdCB7CkBAIC00NjQ1LDggKzU1MjgsOCBAQAogCiBzdHJ1Y3QgRGltZW5zaW9uTWV0YWRhdGFCdWlsZGVyIHsKICAgdHlwZWRlZiBEaW1lbnNpb25NZXRhZGF0YSBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CiAgIHZvaWQgYWRkX2Zvcm1hdCh0ZmxpdGU6OkRpbWVuc2lvblR5cGUgZm9ybWF0KSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PGludDhfdD4oRGltZW5zaW9uTWV0YWRhdGE6OlZUX0ZPUk1BVCwgc3RhdGljX2Nhc3Q8aW50OF90Pihmb3JtYXQpLCAwKTsKICAgfQpAQCAtNDY1NiwzNCArNTUzOSwzNCBAQAogICB2b2lkIGFkZF9hcnJheV9zZWdtZW50c190eXBlKHRmbGl0ZTo6U3BhcnNlSW5kZXhWZWN0b3IgYXJyYXlfc2VnbWVudHNfdHlwZSkgewogICAgIGZiYl8uQWRkRWxlbWVudDx1aW50OF90PihEaW1lbnNpb25NZXRhZGF0YTo6VlRfQVJSQVlfU0VHTUVOVFNfVFlQRSwgc3RhdGljX2Nhc3Q8dWludDhfdD4oYXJyYXlfc2VnbWVudHNfdHlwZSksIDApOwogICB9Ci0gIHZvaWQgYWRkX2FycmF5X3NlZ21lbnRzKGZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4gYXJyYXlfc2VnbWVudHMpIHsKKyAgdm9pZCBhZGRfYXJyYXlfc2VnbWVudHMoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+IGFycmF5X3NlZ21lbnRzKSB7CiAgICAgZmJiXy5BZGRPZmZzZXQoRGltZW5zaW9uTWV0YWRhdGE6OlZUX0FSUkFZX1NFR01FTlRTLCBhcnJheV9zZWdtZW50cyk7CiAgIH0KICAgdm9pZCBhZGRfYXJyYXlfaW5kaWNlc190eXBlKHRmbGl0ZTo6U3BhcnNlSW5kZXhWZWN0b3IgYXJyYXlfaW5kaWNlc190eXBlKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQ4X3Q+KERpbWVuc2lvbk1ldGFkYXRhOjpWVF9BUlJBWV9JTkRJQ0VTX1RZUEUsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGFycmF5X2luZGljZXNfdHlwZSksIDApOwogICB9Ci0gIHZvaWQgYWRkX2FycmF5X2luZGljZXMoZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPiBhcnJheV9pbmRpY2VzKSB7CisgIHZvaWQgYWRkX2FycmF5X2luZGljZXMoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+IGFycmF5X2luZGljZXMpIHsKICAgICBmYmJfLkFkZE9mZnNldChEaW1lbnNpb25NZXRhZGF0YTo6VlRfQVJSQVlfSU5ESUNFUywgYXJyYXlfaW5kaWNlcyk7CiAgIH0KLSAgZXhwbGljaXQgRGltZW5zaW9uTWV0YWRhdGFCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgZXhwbGljaXQgRGltZW5zaW9uTWV0YWRhdGFCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8RGltZW5zaW9uTWV0YWRhdGE+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PERpbWVuc2lvbk1ldGFkYXRhPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxEaW1lbnNpb25NZXRhZGF0YT4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8RGltZW5zaW9uTWV0YWRhdGE+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PERpbWVuc2lvbk1ldGFkYXRhPiBDcmVhdGVEaW1lbnNpb25NZXRhZGF0YSgKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PERpbWVuc2lvbk1ldGFkYXRhPiBDcmVhdGVEaW1lbnNpb25NZXRhZGF0YSgKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKICAgICB0ZmxpdGU6OkRpbWVuc2lvblR5cGUgZm9ybWF0ID0gdGZsaXRlOjpEaW1lbnNpb25UeXBlX0RFTlNFLAogICAgIGludDMyX3QgZGVuc2Vfc2l6ZSA9IDAsCiAgICAgdGZsaXRlOjpTcGFyc2VJbmRleFZlY3RvciBhcnJheV9zZWdtZW50c190eXBlID0gdGZsaXRlOjpTcGFyc2VJbmRleFZlY3Rvcl9OT05FLAotICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4gYXJyYXlfc2VnbWVudHMgPSAwLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPiBhcnJheV9zZWdtZW50cyA9IDAsCiAgICAgdGZsaXRlOjpTcGFyc2VJbmRleFZlY3RvciBhcnJheV9pbmRpY2VzX3R5cGUgPSB0ZmxpdGU6OlNwYXJzZUluZGV4VmVjdG9yX05PTkUsCi0gICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPiBhcnJheV9pbmRpY2VzID0gMCkgeworICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPiBhcnJheV9pbmRpY2VzID0gMCkgewogICBEaW1lbnNpb25NZXRhZGF0YUJ1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIGJ1aWxkZXJfLmFkZF9hcnJheV9pbmRpY2VzKGFycmF5X2luZGljZXMpOwogICBidWlsZGVyXy5hZGRfYXJyYXlfc2VnbWVudHMoYXJyYXlfc2VnbWVudHMpOwpAQCAtNDY5NCw5ICs1NTc3LDkgQEAKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PERpbWVuc2lvbk1ldGFkYXRhPiBDcmVhdGVEaW1lbnNpb25NZXRhZGF0YShmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IERpbWVuc2lvbk1ldGFkYXRhVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxEaW1lbnNpb25NZXRhZGF0YT4gQ3JlYXRlRGltZW5zaW9uTWV0YWRhdGEoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IERpbWVuc2lvbk1ldGFkYXRhVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgU3BhcnNpdHlQYXJhbWV0ZXJzVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IFNwYXJzaXR5UGFyYW1ldGVyc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIFNwYXJzaXR5UGFyYW1ldGVycyBUYWJsZVR5cGU7CiAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHRyYXZlcnNhbF9vcmRlcnt9OwogICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBibG9ja19tYXB7fTsKQEAgLTQ3MDcsNyArNTU5MCw3IEBACiAgIFNwYXJzaXR5UGFyYW1ldGVyc1QgJm9wZXJhdG9yPShTcGFyc2l0eVBhcmFtZXRlcnNUIG8pIEZMQVRCVUZGRVJTX05PRVhDRVBUOwogfTsKIAotc3RydWN0IFNwYXJzaXR5UGFyYW1ldGVycyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBTcGFyc2l0eVBhcmFtZXRlcnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBTcGFyc2l0eVBhcmFtZXRlcnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBTcGFyc2l0eVBhcmFtZXRlcnNCdWlsZGVyIEJ1aWxkZXI7CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CkBAIC00NzE1LDE2ICs1NTk4LDE2IEBACiAgICAgVlRfQkxPQ0tfTUFQID0gNiwKICAgICBWVF9ESU1fTUVUQURBVEEgPSA4CiAgIH07Ci0gIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4gKnRyYXZlcnNhbF9vcmRlcigpIGNvbnN0IHsKLSAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+ICo+KFZUX1RSQVZFUlNBTF9PUkRFUik7CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90PiAqdHJhdmVyc2FsX29yZGVyKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90PiAqPihWVF9UUkFWRVJTQUxfT1JERVIpOwogICB9Ci0gIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4gKmJsb2NrX21hcCgpIGNvbnN0IHsKLSAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+ICo+KFZUX0JMT0NLX01BUCk7CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90PiAqYmxvY2tfbWFwKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90PiAqPihWVF9CTE9DS19NQVApOwogICB9Ci0gIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OkRpbWVuc2lvbk1ldGFkYXRhPj4gKmRpbV9tZXRhZGF0YSgpIGNvbnN0IHsKLSAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpEaW1lbnNpb25NZXRhZGF0YT4+ICo+KFZUX0RJTV9NRVRBREFUQSk7CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpEaW1lbnNpb25NZXRhZGF0YT4+ICpkaW1fbWV0YWRhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OkRpbWVuc2lvbk1ldGFkYXRhPj4gKj4oVlRfRElNX01FVEFEQVRBKTsKICAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1RSQVZFUlNBTF9PUkRFUikgJiYKICAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHRyYXZlcnNhbF9vcmRlcigpKSAmJgpAQCAtNDczNSw0MCArNTYxOCw0MCBAQAogICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3JPZlRhYmxlcyhkaW1fbWV0YWRhdGEoKSkgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBTcGFyc2l0eVBhcmFtZXRlcnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKFNwYXJzaXR5UGFyYW1ldGVyc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PFNwYXJzaXR5UGFyYW1ldGVycz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNwYXJzaXR5UGFyYW1ldGVyc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIFNwYXJzaXR5UGFyYW1ldGVyc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhTcGFyc2l0eVBhcmFtZXRlcnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3BhcnNpdHlQYXJhbWV0ZXJzPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTcGFyc2l0eVBhcmFtZXRlcnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgU3BhcnNpdHlQYXJhbWV0ZXJzQnVpbGRlciB7CiAgIHR5cGVkZWYgU3BhcnNpdHlQYXJhbWV0ZXJzIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwotICB2b2lkIGFkZF90cmF2ZXJzYWxfb3JkZXIoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+PiB0cmF2ZXJzYWxfb3JkZXIpIHsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIHZvaWQgYWRkX3RyYXZlcnNhbF9vcmRlcig6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+PiB0cmF2ZXJzYWxfb3JkZXIpIHsKICAgICBmYmJfLkFkZE9mZnNldChTcGFyc2l0eVBhcmFtZXRlcnM6OlZUX1RSQVZFUlNBTF9PUkRFUiwgdHJhdmVyc2FsX29yZGVyKTsKICAgfQotICB2b2lkIGFkZF9ibG9ja19tYXAoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+PiBibG9ja19tYXApIHsKKyAgdm9pZCBhZGRfYmxvY2tfbWFwKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4+IGJsb2NrX21hcCkgewogICAgIGZiYl8uQWRkT2Zmc2V0KFNwYXJzaXR5UGFyYW1ldGVyczo6VlRfQkxPQ0tfTUFQLCBibG9ja19tYXApOwogICB9Ci0gIHZvaWQgYWRkX2RpbV9tZXRhZGF0YShmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OkRpbWVuc2lvbk1ldGFkYXRhPj4+IGRpbV9tZXRhZGF0YSkgeworICB2b2lkIGFkZF9kaW1fbWV0YWRhdGEoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpEaW1lbnNpb25NZXRhZGF0YT4+PiBkaW1fbWV0YWRhdGEpIHsKICAgICBmYmJfLkFkZE9mZnNldChTcGFyc2l0eVBhcmFtZXRlcnM6OlZUX0RJTV9NRVRBREFUQSwgZGltX21ldGFkYXRhKTsKICAgfQotICBleHBsaWNpdCBTcGFyc2l0eVBhcmFtZXRlcnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgZXhwbGljaXQgU3BhcnNpdHlQYXJhbWV0ZXJzQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PFNwYXJzaXR5UGFyYW1ldGVycz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3BhcnNpdHlQYXJhbWV0ZXJzPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcGFyc2l0eVBhcmFtZXRlcnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNwYXJzaXR5UGFyYW1ldGVycz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3BhcnNpdHlQYXJhbWV0ZXJzPiBDcmVhdGVTcGFyc2l0eVBhcmFtZXRlcnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAotICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90Pj4gdHJhdmVyc2FsX29yZGVyID0gMCwKLSAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4+IGJsb2NrX21hcCA9IDAsCi0gICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpEaW1lbnNpb25NZXRhZGF0YT4+PiBkaW1fbWV0YWRhdGEgPSAwKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNwYXJzaXR5UGFyYW1ldGVycz4gQ3JlYXRlU3BhcnNpdHlQYXJhbWV0ZXJzKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4+IHRyYXZlcnNhbF9vcmRlciA9IDAsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90Pj4gYmxvY2tfbWFwID0gMCwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OkRpbWVuc2lvbk1ldGFkYXRhPj4+IGRpbV9tZXRhZGF0YSA9IDApIHsKICAgU3BhcnNpdHlQYXJhbWV0ZXJzQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKICAgYnVpbGRlcl8uYWRkX2RpbV9tZXRhZGF0YShkaW1fbWV0YWRhdGEpOwogICBidWlsZGVyXy5hZGRfYmxvY2tfbWFwKGJsb2NrX21hcCk7CkBAIC00Nzc2LDE0ICs1NjU5LDE0IEBACiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3BhcnNpdHlQYXJhbWV0ZXJzPiBDcmVhdGVTcGFyc2l0eVBhcmFtZXRlcnNEaXJlY3QoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAoraW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcGFyc2l0eVBhcmFtZXRlcnM+IENyZWF0ZVNwYXJzaXR5UGFyYW1ldGVyc0RpcmVjdCgKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiAqdHJhdmVyc2FsX29yZGVyID0gbnVsbHB0ciwKICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiAqYmxvY2tfbWFwID0gbnVsbHB0ciwKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6RGltZW5zaW9uTWV0YWRhdGE+PiAqZGltX21ldGFkYXRhID0gbnVsbHB0cikgeworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OkRpbWVuc2lvbk1ldGFkYXRhPj4gKmRpbV9tZXRhZGF0YSA9IG51bGxwdHIpIHsKICAgYXV0byB0cmF2ZXJzYWxfb3JkZXJfXyA9IHRyYXZlcnNhbF9vcmRlciA/IF9mYmIuQ3JlYXRlVmVjdG9yPGludDMyX3Q+KCp0cmF2ZXJzYWxfb3JkZXIpIDogMDsKICAgYXV0byBibG9ja19tYXBfXyA9IGJsb2NrX21hcCA/IF9mYmIuQ3JlYXRlVmVjdG9yPGludDMyX3Q+KCpibG9ja19tYXApIDogMDsKLSAgYXV0byBkaW1fbWV0YWRhdGFfXyA9IGRpbV9tZXRhZGF0YSA/IF9mYmIuQ3JlYXRlVmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpEaW1lbnNpb25NZXRhZGF0YT4+KCpkaW1fbWV0YWRhdGEpIDogMDsKKyAgYXV0byBkaW1fbWV0YWRhdGFfXyA9IGRpbV9tZXRhZGF0YSA/IF9mYmIuQ3JlYXRlVmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OkRpbWVuc2lvbk1ldGFkYXRhPj4oKmRpbV9tZXRhZGF0YSkgOiAwOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVTcGFyc2l0eVBhcmFtZXRlcnMoCiAgICAgICBfZmJiLAogICAgICAgdHJhdmVyc2FsX29yZGVyX18sCkBAIC00NzkxLDE2ICs1Njc0LDE2IEBACiAgICAgICBkaW1fbWV0YWRhdGFfXyk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8U3BhcnNpdHlQYXJhbWV0ZXJzPiBDcmVhdGVTcGFyc2l0eVBhcmFtZXRlcnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTcGFyc2l0eVBhcmFtZXRlcnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNwYXJzaXR5UGFyYW1ldGVycz4gQ3JlYXRlU3BhcnNpdHlQYXJhbWV0ZXJzKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTcGFyc2l0eVBhcmFtZXRlcnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBWYXJpYW50U3ViVHlwZVQgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBWYXJpYW50U3ViVHlwZVQgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIFZhcmlhbnRTdWJUeXBlIFRhYmxlVHlwZTsKICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gc2hhcGV7fTsKICAgdGZsaXRlOjpUZW5zb3JUeXBlIHR5cGUgPSB0ZmxpdGU6OlRlbnNvclR5cGVfRkxPQVQzMjsKICAgYm9vbCBoYXNfcmFuayA9IGZhbHNlOwogfTsKIAotc3RydWN0IFZhcmlhbnRTdWJUeXBlIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IFZhcmlhbnRTdWJUeXBlIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgVmFyaWFudFN1YlR5cGVUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBWYXJpYW50U3ViVHlwZUJ1aWxkZXIgQnVpbGRlcjsKICAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKQEAgLTQ4MDgsOCArNTY5MSw4IEBACiAgICAgVlRfVFlQRSA9IDYsCiAgICAgVlRfSEFTX1JBTksgPSA4CiAgIH07Ci0gIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4gKnNoYXBlKCkgY29uc3QgewotICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4gKj4oVlRfU0hBUEUpOworICBjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4gKnNoYXBlKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90PiAqPihWVF9TSEFQRSk7CiAgIH0KICAgdGZsaXRlOjpUZW5zb3JUeXBlIHR5cGUoKSBjb25zdCB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHRmbGl0ZTo6VGVuc29yVHlwZT4oR2V0RmllbGQ8aW50OF90PihWVF9UWVBFLCAwKSk7CkBAIC00ODE3LDcgKzU3MDAsNyBAQAogICBib29sIGhhc19yYW5rKCkgY29uc3QgewogICAgIHJldHVybiBHZXRGaWVsZDx1aW50OF90PihWVF9IQVNfUkFOSywgMCkgIT0gMDsKICAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1NIQVBFKSAmJgogICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3Ioc2hhcGUoKSkgJiYKQEAgLTQ4MjUsMTYgKzU3MDgsMTYgQEAKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8dWludDhfdD4odmVyaWZpZXIsIFZUX0hBU19SQU5LLCAxKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIFZhcmlhbnRTdWJUeXBlVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhWYXJpYW50U3ViVHlwZVQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PFZhcmlhbnRTdWJUeXBlPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVmFyaWFudFN1YlR5cGVUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBWYXJpYW50U3ViVHlwZVQgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhWYXJpYW50U3ViVHlwZVQgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxWYXJpYW50U3ViVHlwZT4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVmFyaWFudFN1YlR5cGVUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgVmFyaWFudFN1YlR5cGVCdWlsZGVyIHsKICAgdHlwZWRlZiBWYXJpYW50U3ViVHlwZSBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgdm9pZCBhZGRfc2hhcGUoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+PiBzaGFwZSkgeworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgdm9pZCBhZGRfc2hhcGUoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90Pj4gc2hhcGUpIHsKICAgICBmYmJfLkFkZE9mZnNldChWYXJpYW50U3ViVHlwZTo6VlRfU0hBUEUsIHNoYXBlKTsKICAgfQogICB2b2lkIGFkZF90eXBlKHRmbGl0ZTo6VGVuc29yVHlwZSB0eXBlKSB7CkBAIC00ODQzLDIwICs1NzI2LDIwIEBACiAgIHZvaWQgYWRkX2hhc19yYW5rKGJvb2wgaGFzX3JhbmspIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDhfdD4oVmFyaWFudFN1YlR5cGU6OlZUX0hBU19SQU5LLCBzdGF0aWNfY2FzdDx1aW50OF90PihoYXNfcmFuayksIDApOwogICB9Ci0gIGV4cGxpY2l0IFZhcmlhbnRTdWJUeXBlQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIGV4cGxpY2l0IFZhcmlhbnRTdWJUeXBlQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PFZhcmlhbnRTdWJUeXBlPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxWYXJpYW50U3ViVHlwZT4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8VmFyaWFudFN1YlR5cGU+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFZhcmlhbnRTdWJUeXBlPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxWYXJpYW50U3ViVHlwZT4gQ3JlYXRlVmFyaWFudFN1YlR5cGUoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAotICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90Pj4gc2hhcGUgPSAwLAoraW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxWYXJpYW50U3ViVHlwZT4gQ3JlYXRlVmFyaWFudFN1YlR5cGUoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90Pj4gc2hhcGUgPSAwLAogICAgIHRmbGl0ZTo6VGVuc29yVHlwZSB0eXBlID0gdGZsaXRlOjpUZW5zb3JUeXBlX0ZMT0FUMzIsCiAgICAgYm9vbCBoYXNfcmFuayA9IGZhbHNlKSB7CiAgIFZhcmlhbnRTdWJUeXBlQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKQEAgLTQ4NjYsOCArNTc0OSw4IEBACiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8VmFyaWFudFN1YlR5cGU+IENyZWF0ZVZhcmlhbnRTdWJUeXBlRGlyZWN0KAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VmFyaWFudFN1YlR5cGU+IENyZWF0ZVZhcmlhbnRTdWJUeXBlRGlyZWN0KAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICpzaGFwZSA9IG51bGxwdHIsCiAgICAgdGZsaXRlOjpUZW5zb3JUeXBlIHR5cGUgPSB0ZmxpdGU6OlRlbnNvclR5cGVfRkxPQVQzMiwKICAgICBib29sIGhhc19yYW5rID0gZmFsc2UpIHsKQEAgLTQ4NzksOSArNTc2Miw5IEBACiAgICAgICBoYXNfcmFuayk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8VmFyaWFudFN1YlR5cGU+IENyZWF0ZVZhcmlhbnRTdWJUeXBlKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVmFyaWFudFN1YlR5cGVUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFZhcmlhbnRTdWJUeXBlPiBDcmVhdGVWYXJpYW50U3ViVHlwZSg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVmFyaWFudFN1YlR5cGVUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBUZW5zb3JUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgVGVuc29yVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgVGVuc29yIFRhYmxlVHlwZTsKICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gc2hhcGV7fTsKICAgdGZsaXRlOjpUZW5zb3JUeXBlIHR5cGUgPSB0ZmxpdGU6OlRlbnNvclR5cGVfRkxPQVQzMjsKQEAgLTQ4OTksNyArNTc4Miw3IEBACiAgIFRlbnNvclQgJm9wZXJhdG9yPShUZW5zb3JUIG8pIEZMQVRCVUZGRVJTX05PRVhDRVBUOwogfTsKIAotc3RydWN0IFRlbnNvciBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBUZW5zb3IgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBUZW5zb3JUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBUZW5zb3JCdWlsZGVyIEJ1aWxkZXI7CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CkBAIC00OTE0LDggKzU3OTcsOCBAQAogICAgIFZUX0hBU19SQU5LID0gMjAsCiAgICAgVlRfVkFSSUFOVF9URU5TT1JTID0gMjIKICAgfTsKLSAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90PiAqc2hhcGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90PiAqPihWVF9TSEFQRSk7CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90PiAqc2hhcGUoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+ICo+KFZUX1NIQVBFKTsKICAgfQogICB0ZmxpdGU6OlRlbnNvclR5cGUgdHlwZSgpIGNvbnN0IHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dGZsaXRlOjpUZW5zb3JUeXBlPihHZXRGaWVsZDxpbnQ4X3Q+KFZUX1RZUEUsIDApKTsKQEAgLTQ5MjMsOCArNTgwNiw4IEBACiAgIHVpbnQzMl90IGJ1ZmZlcigpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8dWludDMyX3Q+KFZUX0JVRkZFUiwgMCk7CiAgIH0KLSAgY29uc3QgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqbmFtZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6U3RyaW5nICo+KFZUX05BTUUpOworICBjb25zdCA6OmZsYXRidWZmZXJzOjpTdHJpbmcgKm5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgOjpmbGF0YnVmZmVyczo6U3RyaW5nICo+KFZUX05BTUUpOwogICB9CiAgIGNvbnN0IHRmbGl0ZTo6UXVhbnRpemF0aW9uUGFyYW1ldGVycyAqcXVhbnRpemF0aW9uKCkgY29uc3QgewogICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IHRmbGl0ZTo6UXVhbnRpemF0aW9uUGFyYW1ldGVycyAqPihWVF9RVUFOVElaQVRJT04pOwpAQCAtNDkzNSwxNiArNTgxOCwxNiBAQAogICBjb25zdCB0ZmxpdGU6OlNwYXJzaXR5UGFyYW1ldGVycyAqc3BhcnNpdHkoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgdGZsaXRlOjpTcGFyc2l0eVBhcmFtZXRlcnMgKj4oVlRfU1BBUlNJVFkpOwogICB9Ci0gIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4gKnNoYXBlX3NpZ25hdHVyZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+ICo+KFZUX1NIQVBFX1NJR05BVFVSRSk7CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90PiAqc2hhcGVfc2lnbmF0dXJlKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90PiAqPihWVF9TSEFQRV9TSUdOQVRVUkUpOwogICB9CiAgIGJvb2wgaGFzX3JhbmsoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldEZpZWxkPHVpbnQ4X3Q+KFZUX0hBU19SQU5LLCAwKSAhPSAwOwogICB9Ci0gIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlZhcmlhbnRTdWJUeXBlPj4gKnZhcmlhbnRfdGVuc29ycygpIGNvbnN0IHsKLSAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpWYXJpYW50U3ViVHlwZT4+ICo+KFZUX1ZBUklBTlRfVEVOU09SUyk7CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpWYXJpYW50U3ViVHlwZT4+ICp2YXJpYW50X3RlbnNvcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlZhcmlhbnRTdWJUeXBlPj4gKj4oVlRfVkFSSUFOVF9URU5TT1JTKTsKICAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1NIQVBFKSAmJgogICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3Ioc2hhcGUoKSkgJiYKQEAgLTQ5NjUsMTYgKzU4NDgsMTYgQEAKICAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yT2ZUYWJsZXModmFyaWFudF90ZW5zb3JzKCkpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgVGVuc29yVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhUZW5zb3JUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZW5zb3I+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBUZW5zb3JUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBUZW5zb3JUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oVGVuc29yVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFRlbnNvcj4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVGVuc29yVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IFRlbnNvckJ1aWxkZXIgewogICB0eXBlZGVmIFRlbnNvciBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgdm9pZCBhZGRfc2hhcGUoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+PiBzaGFwZSkgeworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgdm9pZCBhZGRfc2hhcGUoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90Pj4gc2hhcGUpIHsKICAgICBmYmJfLkFkZE9mZnNldChUZW5zb3I6OlZUX1NIQVBFLCBzaGFwZSk7CiAgIH0KICAgdm9pZCBhZGRfdHlwZSh0ZmxpdGU6OlRlbnNvclR5cGUgdHlwZSkgewpAQCAtNDk4Myw1MCArNTg2Niw1MCBAQAogICB2b2lkIGFkZF9idWZmZXIodWludDMyX3QgYnVmZmVyKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQzMl90PihUZW5zb3I6OlZUX0JVRkZFUiwgYnVmZmVyLCAwKTsKICAgfQotICB2b2lkIGFkZF9uYW1lKGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4gbmFtZSkgeworICB2b2lkIGFkZF9uYW1lKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpTdHJpbmc+IG5hbWUpIHsKICAgICBmYmJfLkFkZE9mZnNldChUZW5zb3I6OlZUX05BTUUsIG5hbWUpOwogICB9Ci0gIHZvaWQgYWRkX3F1YW50aXphdGlvbihmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6UXVhbnRpemF0aW9uUGFyYW1ldGVycz4gcXVhbnRpemF0aW9uKSB7CisgIHZvaWQgYWRkX3F1YW50aXphdGlvbig6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpRdWFudGl6YXRpb25QYXJhbWV0ZXJzPiBxdWFudGl6YXRpb24pIHsKICAgICBmYmJfLkFkZE9mZnNldChUZW5zb3I6OlZUX1FVQU5USVpBVElPTiwgcXVhbnRpemF0aW9uKTsKICAgfQogICB2b2lkIGFkZF9pc192YXJpYWJsZShib29sIGlzX3ZhcmlhYmxlKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQ4X3Q+KFRlbnNvcjo6VlRfSVNfVkFSSUFCTEUsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGlzX3ZhcmlhYmxlKSwgMCk7CiAgIH0KLSAgdm9pZCBhZGRfc3BhcnNpdHkoZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlNwYXJzaXR5UGFyYW1ldGVycz4gc3BhcnNpdHkpIHsKKyAgdm9pZCBhZGRfc3BhcnNpdHkoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6U3BhcnNpdHlQYXJhbWV0ZXJzPiBzcGFyc2l0eSkgewogICAgIGZiYl8uQWRkT2Zmc2V0KFRlbnNvcjo6VlRfU1BBUlNJVFksIHNwYXJzaXR5KTsKICAgfQotICB2b2lkIGFkZF9zaGFwZV9zaWduYXR1cmUoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+PiBzaGFwZV9zaWduYXR1cmUpIHsKKyAgdm9pZCBhZGRfc2hhcGVfc2lnbmF0dXJlKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4+IHNoYXBlX3NpZ25hdHVyZSkgewogICAgIGZiYl8uQWRkT2Zmc2V0KFRlbnNvcjo6VlRfU0hBUEVfU0lHTkFUVVJFLCBzaGFwZV9zaWduYXR1cmUpOwogICB9CiAgIHZvaWQgYWRkX2hhc19yYW5rKGJvb2wgaGFzX3JhbmspIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDhfdD4oVGVuc29yOjpWVF9IQVNfUkFOSywgc3RhdGljX2Nhc3Q8dWludDhfdD4oaGFzX3JhbmspLCAwKTsKICAgfQotICB2b2lkIGFkZF92YXJpYW50X3RlbnNvcnMoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpWYXJpYW50U3ViVHlwZT4+PiB2YXJpYW50X3RlbnNvcnMpIHsKKyAgdm9pZCBhZGRfdmFyaWFudF90ZW5zb3JzKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8OjpmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6VmFyaWFudFN1YlR5cGU+Pj4gdmFyaWFudF90ZW5zb3JzKSB7CiAgICAgZmJiXy5BZGRPZmZzZXQoVGVuc29yOjpWVF9WQVJJQU5UX1RFTlNPUlMsIHZhcmlhbnRfdGVuc29ycyk7CiAgIH0KLSAgZXhwbGljaXQgVGVuc29yQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIGV4cGxpY2l0IFRlbnNvckJ1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZW5zb3I+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFRlbnNvcj4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8VGVuc29yPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZW5zb3I+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFRlbnNvcj4gQ3JlYXRlVGVuc29yKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKLSAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4+IHNoYXBlID0gMCwKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VGVuc29yPiBDcmVhdGVUZW5zb3IoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90Pj4gc2hhcGUgPSAwLAogICAgIHRmbGl0ZTo6VGVuc29yVHlwZSB0eXBlID0gdGZsaXRlOjpUZW5zb3JUeXBlX0ZMT0FUMzIsCiAgICAgdWludDMyX3QgYnVmZmVyID0gMCwKLSAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+IG5hbWUgPSAwLAotICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpRdWFudGl6YXRpb25QYXJhbWV0ZXJzPiBxdWFudGl6YXRpb24gPSAwLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpTdHJpbmc+IG5hbWUgPSAwLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlF1YW50aXphdGlvblBhcmFtZXRlcnM+IHF1YW50aXphdGlvbiA9IDAsCiAgICAgYm9vbCBpc192YXJpYWJsZSA9IGZhbHNlLAotICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpTcGFyc2l0eVBhcmFtZXRlcnM+IHNwYXJzaXR5ID0gMCwKLSAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4+IHNoYXBlX3NpZ25hdHVyZSA9IDAsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6U3BhcnNpdHlQYXJhbWV0ZXJzPiBzcGFyc2l0eSA9IDAsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90Pj4gc2hhcGVfc2lnbmF0dXJlID0gMCwKICAgICBib29sIGhhc19yYW5rID0gZmFsc2UsCi0gICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpWYXJpYW50U3ViVHlwZT4+PiB2YXJpYW50X3RlbnNvcnMgPSAwKSB7CisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpWYXJpYW50U3ViVHlwZT4+PiB2YXJpYW50X3RlbnNvcnMgPSAwKSB7CiAgIFRlbnNvckJ1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIGJ1aWxkZXJfLmFkZF92YXJpYW50X3RlbnNvcnModmFyaWFudF90ZW5zb3JzKTsKICAgYnVpbGRlcl8uYWRkX3NoYXBlX3NpZ25hdHVyZShzaGFwZV9zaWduYXR1cmUpOwpAQCAtNTA0MSwyMiArNTkyNCwyMiBAQAogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFRlbnNvcj4gQ3JlYXRlVGVuc29yRGlyZWN0KAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VGVuc29yPiBDcmVhdGVUZW5zb3JEaXJlY3QoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4gKnNoYXBlID0gbnVsbHB0ciwKICAgICB0ZmxpdGU6OlRlbnNvclR5cGUgdHlwZSA9IHRmbGl0ZTo6VGVuc29yVHlwZV9GTE9BVDMyLAogICAgIHVpbnQzMl90IGJ1ZmZlciA9IDAsCiAgICAgY29uc3QgY2hhciAqbmFtZSA9IG51bGxwdHIsCi0gICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlF1YW50aXphdGlvblBhcmFtZXRlcnM+IHF1YW50aXphdGlvbiA9IDAsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6UXVhbnRpemF0aW9uUGFyYW1ldGVycz4gcXVhbnRpemF0aW9uID0gMCwKICAgICBib29sIGlzX3ZhcmlhYmxlID0gZmFsc2UsCi0gICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlNwYXJzaXR5UGFyYW1ldGVycz4gc3BhcnNpdHkgPSAwLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlNwYXJzaXR5UGFyYW1ldGVycz4gc3BhcnNpdHkgPSAwLAogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICpzaGFwZV9zaWduYXR1cmUgPSBudWxscHRyLAogICAgIGJvb2wgaGFzX3JhbmsgPSBmYWxzZSwKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6VmFyaWFudFN1YlR5cGU+PiAqdmFyaWFudF90ZW5zb3JzID0gbnVsbHB0cikgeworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlZhcmlhbnRTdWJUeXBlPj4gKnZhcmlhbnRfdGVuc29ycyA9IG51bGxwdHIpIHsKICAgYXV0byBzaGFwZV9fID0gc2hhcGUgPyBfZmJiLkNyZWF0ZVZlY3RvcjxpbnQzMl90Pigqc2hhcGUpIDogMDsKICAgYXV0byBuYW1lX18gPSBuYW1lID8gX2ZiYi5DcmVhdGVTdHJpbmcobmFtZSkgOiAwOwogICBhdXRvIHNoYXBlX3NpZ25hdHVyZV9fID0gc2hhcGVfc2lnbmF0dXJlID8gX2ZiYi5DcmVhdGVWZWN0b3I8aW50MzJfdD4oKnNoYXBlX3NpZ25hdHVyZSkgOiAwOwotICBhdXRvIHZhcmlhbnRfdGVuc29yc19fID0gdmFyaWFudF90ZW5zb3JzID8gX2ZiYi5DcmVhdGVWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlZhcmlhbnRTdWJUeXBlPj4oKnZhcmlhbnRfdGVuc29ycykgOiAwOworICBhdXRvIHZhcmlhbnRfdGVuc29yc19fID0gdmFyaWFudF90ZW5zb3JzID8gX2ZiYi5DcmVhdGVWZWN0b3I8OjpmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6VmFyaWFudFN1YlR5cGU+PigqdmFyaWFudF90ZW5zb3JzKSA6IDA7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZVRlbnNvcigKICAgICAgIF9mYmIsCiAgICAgICBzaGFwZV9fLApAQCAtNTA3MSw5ICs1OTU0LDE3NjMgQEAKICAgICAgIHZhcmlhbnRfdGVuc29yc19fKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZW5zb3I+IENyZWF0ZVRlbnNvcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFRlbnNvclQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VGVuc29yPiBDcmVhdGVUZW5zb3IoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFRlbnNvclQgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IENvbnYyRE9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgU3RhYmxlaGxvR2F0aGVyT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworICB0eXBlZGVmIFN0YWJsZWhsb0dhdGhlck9wdGlvbnMgVGFibGVUeXBlOworICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBvZmZzZXRfZGltc3t9OworICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBjb2xsYXBzZWRfc2xpY2VfZGltc3t9OworICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBzdGFydF9pbmRleF9tYXB7fTsKKyAgaW50NjRfdCBpbmRleF92ZWN0b3JfZGltID0gMDsKKyAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gc2xpY2Vfc2l6ZXN7fTsKKyAgYm9vbCBpbmRpY2VzX2FyZV9zb3J0ZWQgPSBmYWxzZTsKK307CisKK3N0cnVjdCBTdGFibGVobG9HYXRoZXJPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CisgIHR5cGVkZWYgU3RhYmxlaGxvR2F0aGVyT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOworICB0eXBlZGVmIFN0YWJsZWhsb0dhdGhlck9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CisgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CisgICAgVlRfT0ZGU0VUX0RJTVMgPSA0LAorICAgIFZUX0NPTExBUFNFRF9TTElDRV9ESU1TID0gNiwKKyAgICBWVF9TVEFSVF9JTkRFWF9NQVAgPSA4LAorICAgIFZUX0lOREVYX1ZFQ1RPUl9ESU0gPSAxMCwKKyAgICBWVF9TTElDRV9TSVpFUyA9IDEyLAorICAgIFZUX0lORElDRVNfQVJFX1NPUlRFRCA9IDE0CisgIH07CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiAqb2Zmc2V0X2RpbXMoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+ICo+KFZUX09GRlNFVF9ESU1TKTsKKyAgfQorICBjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4gKmNvbGxhcHNlZF9zbGljZV9kaW1zKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiAqPihWVF9DT0xMQVBTRURfU0xJQ0VfRElNUyk7CisgIH0KKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+ICpzdGFydF9pbmRleF9tYXAoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+ICo+KFZUX1NUQVJUX0lOREVYX01BUCk7CisgIH0KKyAgaW50NjRfdCBpbmRleF92ZWN0b3JfZGltKCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDxpbnQ2NF90PihWVF9JTkRFWF9WRUNUT1JfRElNLCAwKTsKKyAgfQorICBjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4gKnNsaWNlX3NpemVzKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiAqPihWVF9TTElDRV9TSVpFUyk7CisgIH0KKyAgYm9vbCBpbmRpY2VzX2FyZV9zb3J0ZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPHVpbnQ4X3Q+KFZUX0lORElDRVNfQVJFX1NPUlRFRCwgMCkgIT0gMDsKKyAgfQorICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9PRkZTRVRfRElNUykgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKG9mZnNldF9kaW1zKCkpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfQ09MTEFQU0VEX1NMSUNFX0RJTVMpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3Rvcihjb2xsYXBzZWRfc2xpY2VfZGltcygpKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1NUQVJUX0lOREVYX01BUCkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHN0YXJ0X2luZGV4X21hcCgpKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQ2NF90Pih2ZXJpZmllciwgVlRfSU5ERVhfVkVDVE9SX0RJTSwgOCkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9TTElDRV9TSVpFUykgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHNsaWNlX3NpemVzKCkpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9JTkRJQ0VTX0FSRV9TT1JURUQsIDEpICYmCisgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CisgIH0KKyAgU3RhYmxlaGxvR2F0aGVyT3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhTdGFibGVobG9HYXRoZXJPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb0dhdGhlck9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN0YWJsZWhsb0dhdGhlck9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cit9OworCitzdHJ1Y3QgU3RhYmxlaGxvR2F0aGVyT3B0aW9uc0J1aWxkZXIgeworICB0eXBlZGVmIFN0YWJsZWhsb0dhdGhlck9wdGlvbnMgVGFibGU7CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICB2b2lkIGFkZF9vZmZzZXRfZGltcyg6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+PiBvZmZzZXRfZGltcykgeworICAgIGZiYl8uQWRkT2Zmc2V0KFN0YWJsZWhsb0dhdGhlck9wdGlvbnM6OlZUX09GRlNFVF9ESU1TLCBvZmZzZXRfZGltcyk7CisgIH0KKyAgdm9pZCBhZGRfY29sbGFwc2VkX3NsaWNlX2RpbXMoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90Pj4gY29sbGFwc2VkX3NsaWNlX2RpbXMpIHsKKyAgICBmYmJfLkFkZE9mZnNldChTdGFibGVobG9HYXRoZXJPcHRpb25zOjpWVF9DT0xMQVBTRURfU0xJQ0VfRElNUywgY29sbGFwc2VkX3NsaWNlX2RpbXMpOworICB9CisgIHZvaWQgYWRkX3N0YXJ0X2luZGV4X21hcCg6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+PiBzdGFydF9pbmRleF9tYXApIHsKKyAgICBmYmJfLkFkZE9mZnNldChTdGFibGVobG9HYXRoZXJPcHRpb25zOjpWVF9TVEFSVF9JTkRFWF9NQVAsIHN0YXJ0X2luZGV4X21hcCk7CisgIH0KKyAgdm9pZCBhZGRfaW5kZXhfdmVjdG9yX2RpbShpbnQ2NF90IGluZGV4X3ZlY3Rvcl9kaW0pIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8aW50NjRfdD4oU3RhYmxlaGxvR2F0aGVyT3B0aW9uczo6VlRfSU5ERVhfVkVDVE9SX0RJTSwgaW5kZXhfdmVjdG9yX2RpbSwgMCk7CisgIH0KKyAgdm9pZCBhZGRfc2xpY2Vfc2l6ZXMoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90Pj4gc2xpY2Vfc2l6ZXMpIHsKKyAgICBmYmJfLkFkZE9mZnNldChTdGFibGVobG9HYXRoZXJPcHRpb25zOjpWVF9TTElDRV9TSVpFUywgc2xpY2Vfc2l6ZXMpOworICB9CisgIHZvaWQgYWRkX2luZGljZXNfYXJlX3NvcnRlZChib29sIGluZGljZXNfYXJlX3NvcnRlZCkgeworICAgIGZiYl8uQWRkRWxlbWVudDx1aW50OF90PihTdGFibGVobG9HYXRoZXJPcHRpb25zOjpWVF9JTkRJQ0VTX0FSRV9TT1JURUQsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGluZGljZXNfYXJlX3NvcnRlZCksIDApOworICB9CisgIGV4cGxpY2l0IFN0YWJsZWhsb0dhdGhlck9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICAgICAgICA6IGZiYl8oX2ZiYikgeworICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOworICB9CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9HYXRoZXJPcHRpb25zPiBGaW5pc2goKSB7CisgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb0dhdGhlck9wdGlvbnM+KGVuZCk7CisgICAgcmV0dXJuIG87CisgIH0KK307CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvR2F0aGVyT3B0aW9ucz4gQ3JlYXRlU3RhYmxlaGxvR2F0aGVyT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+PiBvZmZzZXRfZGltcyA9IDAsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90Pj4gY29sbGFwc2VkX3NsaWNlX2RpbXMgPSAwLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4+IHN0YXJ0X2luZGV4X21hcCA9IDAsCisgICAgaW50NjRfdCBpbmRleF92ZWN0b3JfZGltID0gMCwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+PiBzbGljZV9zaXplcyA9IDAsCisgICAgYm9vbCBpbmRpY2VzX2FyZV9zb3J0ZWQgPSBmYWxzZSkgeworICBTdGFibGVobG9HYXRoZXJPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKKyAgYnVpbGRlcl8uYWRkX2luZGV4X3ZlY3Rvcl9kaW0oaW5kZXhfdmVjdG9yX2RpbSk7CisgIGJ1aWxkZXJfLmFkZF9zbGljZV9zaXplcyhzbGljZV9zaXplcyk7CisgIGJ1aWxkZXJfLmFkZF9zdGFydF9pbmRleF9tYXAoc3RhcnRfaW5kZXhfbWFwKTsKKyAgYnVpbGRlcl8uYWRkX2NvbGxhcHNlZF9zbGljZV9kaW1zKGNvbGxhcHNlZF9zbGljZV9kaW1zKTsKKyAgYnVpbGRlcl8uYWRkX29mZnNldF9kaW1zKG9mZnNldF9kaW1zKTsKKyAgYnVpbGRlcl8uYWRkX2luZGljZXNfYXJlX3NvcnRlZChpbmRpY2VzX2FyZV9zb3J0ZWQpOworICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7Cit9CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvR2F0aGVyT3B0aW9ucz4gQ3JlYXRlU3RhYmxlaGxvR2F0aGVyT3B0aW9uc0RpcmVjdCgKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAqb2Zmc2V0X2RpbXMgPSBudWxscHRyLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICpjb2xsYXBzZWRfc2xpY2VfZGltcyA9IG51bGxwdHIsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gKnN0YXJ0X2luZGV4X21hcCA9IG51bGxwdHIsCisgICAgaW50NjRfdCBpbmRleF92ZWN0b3JfZGltID0gMCwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAqc2xpY2Vfc2l6ZXMgPSBudWxscHRyLAorICAgIGJvb2wgaW5kaWNlc19hcmVfc29ydGVkID0gZmFsc2UpIHsKKyAgYXV0byBvZmZzZXRfZGltc19fID0gb2Zmc2V0X2RpbXMgPyBfZmJiLkNyZWF0ZVZlY3RvcjxpbnQ2NF90Pigqb2Zmc2V0X2RpbXMpIDogMDsKKyAgYXV0byBjb2xsYXBzZWRfc2xpY2VfZGltc19fID0gY29sbGFwc2VkX3NsaWNlX2RpbXMgPyBfZmJiLkNyZWF0ZVZlY3RvcjxpbnQ2NF90PigqY29sbGFwc2VkX3NsaWNlX2RpbXMpIDogMDsKKyAgYXV0byBzdGFydF9pbmRleF9tYXBfXyA9IHN0YXJ0X2luZGV4X21hcCA/IF9mYmIuQ3JlYXRlVmVjdG9yPGludDY0X3Q+KCpzdGFydF9pbmRleF9tYXApIDogMDsKKyAgYXV0byBzbGljZV9zaXplc19fID0gc2xpY2Vfc2l6ZXMgPyBfZmJiLkNyZWF0ZVZlY3RvcjxpbnQ2NF90Pigqc2xpY2Vfc2l6ZXMpIDogMDsKKyAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlU3RhYmxlaGxvR2F0aGVyT3B0aW9ucygKKyAgICAgIF9mYmIsCisgICAgICBvZmZzZXRfZGltc19fLAorICAgICAgY29sbGFwc2VkX3NsaWNlX2RpbXNfXywKKyAgICAgIHN0YXJ0X2luZGV4X21hcF9fLAorICAgICAgaW5kZXhfdmVjdG9yX2RpbSwKKyAgICAgIHNsaWNlX3NpemVzX18sCisgICAgICBpbmRpY2VzX2FyZV9zb3J0ZWQpOworfQorCis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvR2F0aGVyT3B0aW9ucz4gQ3JlYXRlU3RhYmxlaGxvR2F0aGVyT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlaGxvR2F0aGVyT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKworc3RydWN0IFN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKKyAgdHlwZWRlZiBTdGFibGVobG9UcmFuc3Bvc2VPcHRpb25zIFRhYmxlVHlwZTsKKyAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gcGVybXV0YXRpb257fTsKK307CisKK3N0cnVjdCBTdGFibGVobG9UcmFuc3Bvc2VPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CisgIHR5cGVkZWYgU3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOworICB0eXBlZGVmIFN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CisgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CisgICAgVlRfUEVSTVVUQVRJT04gPSA0CisgIH07CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiAqcGVybXV0YXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+ICo+KFZUX1BFUk1VVEFUSU9OKTsKKyAgfQorICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9QRVJNVVRBVElPTikgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHBlcm11dGF0aW9uKCkpICYmCisgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CisgIH0KKyAgU3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhTdGFibGVobG9UcmFuc3Bvc2VPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cit9OworCitzdHJ1Y3QgU3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9uc0J1aWxkZXIgeworICB0eXBlZGVmIFN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnMgVGFibGU7CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICB2b2lkIGFkZF9wZXJtdXRhdGlvbig6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+PiBwZXJtdXRhdGlvbikgeworICAgIGZiYl8uQWRkT2Zmc2V0KFN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnM6OlZUX1BFUk1VVEFUSU9OLCBwZXJtdXRhdGlvbik7CisgIH0KKyAgZXhwbGljaXQgU3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgICAgICAgIDogZmJiXyhfZmJiKSB7CisgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CisgIH0KKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9ucz4oZW5kKTsKKyAgICByZXR1cm4gbzsKKyAgfQorfTsKKworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9UcmFuc3Bvc2VPcHRpb25zPiBDcmVhdGVTdGFibGVobG9UcmFuc3Bvc2VPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4+IHBlcm11dGF0aW9uID0gMCkgeworICBTdGFibGVobG9UcmFuc3Bvc2VPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKKyAgYnVpbGRlcl8uYWRkX3Blcm11dGF0aW9uKHBlcm11dGF0aW9uKTsKKyAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOworfQorCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnM+IENyZWF0ZVN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnNEaXJlY3QoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gKnBlcm11dGF0aW9uID0gbnVsbHB0cikgeworICBhdXRvIHBlcm11dGF0aW9uX18gPSBwZXJtdXRhdGlvbiA/IF9mYmIuQ3JlYXRlVmVjdG9yPGludDY0X3Q+KCpwZXJtdXRhdGlvbikgOiAwOworICByZXR1cm4gdGZsaXRlOjpDcmVhdGVTdGFibGVobG9UcmFuc3Bvc2VPcHRpb25zKAorICAgICAgX2ZiYiwKKyAgICAgIHBlcm11dGF0aW9uX18pOworfQorCis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9ucz4gQ3JlYXRlU3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKworc3RydWN0IFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CisgIHR5cGVkZWYgU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnMgVGFibGVUeXBlOworICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBsaHNfYmF0Y2hpbmdfZGltZW5zaW9uc3t9OworICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiByaHNfYmF0Y2hpbmdfZGltZW5zaW9uc3t9OworICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBsaHNfY29udHJhY3RpbmdfZGltZW5zaW9uc3t9OworICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiByaHNfY29udHJhY3RpbmdfZGltZW5zaW9uc3t9OworICBzdGQ6OnZlY3Rvcjx0ZmxpdGU6OlN0YWJsZWhsb1ByZWNpc2lvbkNvbmZpZz4gcHJlY2lzaW9uX2NvbmZpZ3t9OworfTsKKworc3RydWN0IFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CisgIHR5cGVkZWYgU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKKyAgdHlwZWRlZiBTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKKyAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKKyAgICBWVF9MSFNfQkFUQ0hJTkdfRElNRU5TSU9OUyA9IDQsCisgICAgVlRfUkhTX0JBVENISU5HX0RJTUVOU0lPTlMgPSA2LAorICAgIFZUX0xIU19DT05UUkFDVElOR19ESU1FTlNJT05TID0gOCwKKyAgICBWVF9SSFNfQ09OVFJBQ1RJTkdfRElNRU5TSU9OUyA9IDEwLAorICAgIFZUX1BSRUNJU0lPTl9DT05GSUcgPSAxMgorICB9OworICBjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4gKmxoc19iYXRjaGluZ19kaW1lbnNpb25zKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiAqPihWVF9MSFNfQkFUQ0hJTkdfRElNRU5TSU9OUyk7CisgIH0KKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+ICpyaHNfYmF0Y2hpbmdfZGltZW5zaW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4gKj4oVlRfUkhTX0JBVENISU5HX0RJTUVOU0lPTlMpOworICB9CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiAqbGhzX2NvbnRyYWN0aW5nX2RpbWVuc2lvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+ICo+KFZUX0xIU19DT05UUkFDVElOR19ESU1FTlNJT05TKTsKKyAgfQorICBjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4gKnJoc19jb250cmFjdGluZ19kaW1lbnNpb25zKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiAqPihWVF9SSFNfQ09OVFJBQ1RJTkdfRElNRU5TSU9OUyk7CisgIH0KKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQzMl90PiAqcHJlY2lzaW9uX2NvbmZpZygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8dWludDMyX3Q+ICo+KFZUX1BSRUNJU0lPTl9DT05GSUcpOworICB9CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX0xIU19CQVRDSElOR19ESU1FTlNJT05TKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IobGhzX2JhdGNoaW5nX2RpbWVuc2lvbnMoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9SSFNfQkFUQ0hJTkdfRElNRU5TSU9OUykgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHJoc19iYXRjaGluZ19kaW1lbnNpb25zKCkpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfTEhTX0NPTlRSQUNUSU5HX0RJTUVOU0lPTlMpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3RvcihsaHNfY29udHJhY3RpbmdfZGltZW5zaW9ucygpKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1JIU19DT05UUkFDVElOR19ESU1FTlNJT05TKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IocmhzX2NvbnRyYWN0aW5nX2RpbWVuc2lvbnMoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9QUkVDSVNJT05fQ09ORklHKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IocHJlY2lzaW9uX2NvbmZpZygpKSAmJgorICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOworICB9CisgIFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKK307CisKK3N0cnVjdCBTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9uc0J1aWxkZXIgeworICB0eXBlZGVmIFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zIFRhYmxlOworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgdm9pZCBhZGRfbGhzX2JhdGNoaW5nX2RpbWVuc2lvbnMoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90Pj4gbGhzX2JhdGNoaW5nX2RpbWVuc2lvbnMpIHsKKyAgICBmYmJfLkFkZE9mZnNldChTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9uczo6VlRfTEhTX0JBVENISU5HX0RJTUVOU0lPTlMsIGxoc19iYXRjaGluZ19kaW1lbnNpb25zKTsKKyAgfQorICB2b2lkIGFkZF9yaHNfYmF0Y2hpbmdfZGltZW5zaW9ucyg6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+PiByaHNfYmF0Y2hpbmdfZGltZW5zaW9ucykgeworICAgIGZiYl8uQWRkT2Zmc2V0KFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zOjpWVF9SSFNfQkFUQ0hJTkdfRElNRU5TSU9OUywgcmhzX2JhdGNoaW5nX2RpbWVuc2lvbnMpOworICB9CisgIHZvaWQgYWRkX2xoc19jb250cmFjdGluZ19kaW1lbnNpb25zKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4+IGxoc19jb250cmFjdGluZ19kaW1lbnNpb25zKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnM6OlZUX0xIU19DT05UUkFDVElOR19ESU1FTlNJT05TLCBsaHNfY29udHJhY3RpbmdfZGltZW5zaW9ucyk7CisgIH0KKyAgdm9pZCBhZGRfcmhzX2NvbnRyYWN0aW5nX2RpbWVuc2lvbnMoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90Pj4gcmhzX2NvbnRyYWN0aW5nX2RpbWVuc2lvbnMpIHsKKyAgICBmYmJfLkFkZE9mZnNldChTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9uczo6VlRfUkhTX0NPTlRSQUNUSU5HX0RJTUVOU0lPTlMsIHJoc19jb250cmFjdGluZ19kaW1lbnNpb25zKTsKKyAgfQorICB2b2lkIGFkZF9wcmVjaXNpb25fY29uZmlnKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8dWludDMyX3Q+PiBwcmVjaXNpb25fY29uZmlnKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnM6OlZUX1BSRUNJU0lPTl9DT05GSUcsIHByZWNpc2lvbl9jb25maWcpOworICB9CisgIGV4cGxpY2l0IFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgICAgICAgOiBmYmJfKF9mYmIpIHsKKyAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKKyAgfQorICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnM+KGVuZCk7CisgICAgcmV0dXJuIG87CisgIH0KK307CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnM+IENyZWF0ZVN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4+IGxoc19iYXRjaGluZ19kaW1lbnNpb25zID0gMCwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+PiByaHNfYmF0Y2hpbmdfZGltZW5zaW9ucyA9IDAsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90Pj4gbGhzX2NvbnRyYWN0aW5nX2RpbWVuc2lvbnMgPSAwLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4+IHJoc19jb250cmFjdGluZ19kaW1lbnNpb25zID0gMCwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQzMl90Pj4gcHJlY2lzaW9uX2NvbmZpZyA9IDApIHsKKyAgU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOworICBidWlsZGVyXy5hZGRfcHJlY2lzaW9uX2NvbmZpZyhwcmVjaXNpb25fY29uZmlnKTsKKyAgYnVpbGRlcl8uYWRkX3Joc19jb250cmFjdGluZ19kaW1lbnNpb25zKHJoc19jb250cmFjdGluZ19kaW1lbnNpb25zKTsKKyAgYnVpbGRlcl8uYWRkX2xoc19jb250cmFjdGluZ19kaW1lbnNpb25zKGxoc19jb250cmFjdGluZ19kaW1lbnNpb25zKTsKKyAgYnVpbGRlcl8uYWRkX3Joc19iYXRjaGluZ19kaW1lbnNpb25zKHJoc19iYXRjaGluZ19kaW1lbnNpb25zKTsKKyAgYnVpbGRlcl8uYWRkX2xoc19iYXRjaGluZ19kaW1lbnNpb25zKGxoc19iYXRjaGluZ19kaW1lbnNpb25zKTsKKyAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOworfQorCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zPiBDcmVhdGVTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9uc0RpcmVjdCgKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAqbGhzX2JhdGNoaW5nX2RpbWVuc2lvbnMgPSBudWxscHRyLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICpyaHNfYmF0Y2hpbmdfZGltZW5zaW9ucyA9IG51bGxwdHIsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gKmxoc19jb250cmFjdGluZ19kaW1lbnNpb25zID0gbnVsbHB0ciwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAqcmhzX2NvbnRyYWN0aW5nX2RpbWVuc2lvbnMgPSBudWxscHRyLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiAqcHJlY2lzaW9uX2NvbmZpZyA9IG51bGxwdHIpIHsKKyAgYXV0byBsaHNfYmF0Y2hpbmdfZGltZW5zaW9uc19fID0gbGhzX2JhdGNoaW5nX2RpbWVuc2lvbnMgPyBfZmJiLkNyZWF0ZVZlY3RvcjxpbnQ2NF90PigqbGhzX2JhdGNoaW5nX2RpbWVuc2lvbnMpIDogMDsKKyAgYXV0byByaHNfYmF0Y2hpbmdfZGltZW5zaW9uc19fID0gcmhzX2JhdGNoaW5nX2RpbWVuc2lvbnMgPyBfZmJiLkNyZWF0ZVZlY3RvcjxpbnQ2NF90PigqcmhzX2JhdGNoaW5nX2RpbWVuc2lvbnMpIDogMDsKKyAgYXV0byBsaHNfY29udHJhY3RpbmdfZGltZW5zaW9uc19fID0gbGhzX2NvbnRyYWN0aW5nX2RpbWVuc2lvbnMgPyBfZmJiLkNyZWF0ZVZlY3RvcjxpbnQ2NF90PigqbGhzX2NvbnRyYWN0aW5nX2RpbWVuc2lvbnMpIDogMDsKKyAgYXV0byByaHNfY29udHJhY3RpbmdfZGltZW5zaW9uc19fID0gcmhzX2NvbnRyYWN0aW5nX2RpbWVuc2lvbnMgPyBfZmJiLkNyZWF0ZVZlY3RvcjxpbnQ2NF90PigqcmhzX2NvbnRyYWN0aW5nX2RpbWVuc2lvbnMpIDogMDsKKyAgYXV0byBwcmVjaXNpb25fY29uZmlnX18gPSBwcmVjaXNpb25fY29uZmlnID8gX2ZiYi5DcmVhdGVWZWN0b3I8dWludDMyX3Q+KCpwcmVjaXNpb25fY29uZmlnKSA6IDA7CisgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZVN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zKAorICAgICAgX2ZiYiwKKyAgICAgIGxoc19iYXRjaGluZ19kaW1lbnNpb25zX18sCisgICAgICByaHNfYmF0Y2hpbmdfZGltZW5zaW9uc19fLAorICAgICAgbGhzX2NvbnRyYWN0aW5nX2RpbWVuc2lvbnNfXywKKyAgICAgIHJoc19jb250cmFjdGluZ19kaW1lbnNpb25zX18sCisgICAgICBwcmVjaXNpb25fY29uZmlnX18pOworfQorCis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnM+IENyZWF0ZVN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKworc3RydWN0IFN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKKyAgdHlwZWRlZiBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zIFRhYmxlVHlwZTsKKyAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gd2luZG93X2RpbWVuc2lvbnN7fTsKKyAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gd2luZG93X3N0cmlkZXN7fTsKKyAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gYmFzZV9kaWxhdGlvbnN7fTsKKyAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gd2luZG93X2RpbGF0aW9uc3t9OworICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBwYWRkaW5ne307CisgIGludDMyX3QgYm9keV9zdWJncmFwaF9pbmRleCA9IDA7Cit9OworCitzdHJ1Y3QgU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgeworICB0eXBlZGVmIFN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKKyAgdHlwZWRlZiBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zQnVpbGRlciBCdWlsZGVyOworICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgeworICAgIFZUX1dJTkRPV19ESU1FTlNJT05TID0gNCwKKyAgICBWVF9XSU5ET1dfU1RSSURFUyA9IDYsCisgICAgVlRfQkFTRV9ESUxBVElPTlMgPSA4LAorICAgIFZUX1dJTkRPV19ESUxBVElPTlMgPSAxMCwKKyAgICBWVF9QQURESU5HID0gMTIsCisgICAgVlRfQk9EWV9TVUJHUkFQSF9JTkRFWCA9IDE0CisgIH07CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiAqd2luZG93X2RpbWVuc2lvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+ICo+KFZUX1dJTkRPV19ESU1FTlNJT05TKTsKKyAgfQorICBjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4gKndpbmRvd19zdHJpZGVzKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiAqPihWVF9XSU5ET1dfU1RSSURFUyk7CisgIH0KKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+ICpiYXNlX2RpbGF0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4gKj4oVlRfQkFTRV9ESUxBVElPTlMpOworICB9CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiAqd2luZG93X2RpbGF0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4gKj4oVlRfV0lORE9XX0RJTEFUSU9OUyk7CisgIH0KKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+ICpwYWRkaW5nKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiAqPihWVF9QQURESU5HKTsKKyAgfQorICBpbnQzMl90IGJvZHlfc3ViZ3JhcGhfaW5kZXgoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPGludDMyX3Q+KFZUX0JPRFlfU1VCR1JBUEhfSU5ERVgsIDApOworICB9CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1dJTkRPV19ESU1FTlNJT05TKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3Iod2luZG93X2RpbWVuc2lvbnMoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9XSU5ET1dfU1RSSURFUykgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHdpbmRvd19zdHJpZGVzKCkpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfQkFTRV9ESUxBVElPTlMpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3RvcihiYXNlX2RpbGF0aW9ucygpKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1dJTkRPV19ESUxBVElPTlMpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3Rvcih3aW5kb3dfZGlsYXRpb25zKCkpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfUEFERElORykgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHBhZGRpbmcoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50MzJfdD4odmVyaWZpZXIsIFZUX0JPRFlfU1VCR1JBUEhfSU5ERVgsIDQpICYmCisgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CisgIH0KKyAgU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cit9OworCitzdHJ1Y3QgU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9uc0J1aWxkZXIgeworICB0eXBlZGVmIFN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMgVGFibGU7CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICB2b2lkIGFkZF93aW5kb3dfZGltZW5zaW9ucyg6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+PiB3aW5kb3dfZGltZW5zaW9ucykgeworICAgIGZiYl8uQWRkT2Zmc2V0KFN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnM6OlZUX1dJTkRPV19ESU1FTlNJT05TLCB3aW5kb3dfZGltZW5zaW9ucyk7CisgIH0KKyAgdm9pZCBhZGRfd2luZG93X3N0cmlkZXMoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90Pj4gd2luZG93X3N0cmlkZXMpIHsKKyAgICBmYmJfLkFkZE9mZnNldChTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zOjpWVF9XSU5ET1dfU1RSSURFUywgd2luZG93X3N0cmlkZXMpOworICB9CisgIHZvaWQgYWRkX2Jhc2VfZGlsYXRpb25zKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4+IGJhc2VfZGlsYXRpb25zKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9uczo6VlRfQkFTRV9ESUxBVElPTlMsIGJhc2VfZGlsYXRpb25zKTsKKyAgfQorICB2b2lkIGFkZF93aW5kb3dfZGlsYXRpb25zKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4+IHdpbmRvd19kaWxhdGlvbnMpIHsKKyAgICBmYmJfLkFkZE9mZnNldChTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zOjpWVF9XSU5ET1dfRElMQVRJT05TLCB3aW5kb3dfZGlsYXRpb25zKTsKKyAgfQorICB2b2lkIGFkZF9wYWRkaW5nKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4+IHBhZGRpbmcpIHsKKyAgICBmYmJfLkFkZE9mZnNldChTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zOjpWVF9QQURESU5HLCBwYWRkaW5nKTsKKyAgfQorICB2b2lkIGFkZF9ib2R5X3N1YmdyYXBoX2luZGV4KGludDMyX3QgYm9keV9zdWJncmFwaF9pbmRleCkgeworICAgIGZiYl8uQWRkRWxlbWVudDxpbnQzMl90PihTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zOjpWVF9CT0RZX1NVQkdSQVBIX0lOREVYLCBib2R5X3N1YmdyYXBoX2luZGV4LCAwKTsKKyAgfQorICBleHBsaWNpdCBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgICAgICAgOiBmYmJfKF9mYmIpIHsKKyAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKKyAgfQorICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9ucz4gRmluaXNoKCkgeworICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zPihlbmQpOworICAgIHJldHVybiBvOworICB9Cit9OworCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnM+IENyZWF0ZVN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90Pj4gd2luZG93X2RpbWVuc2lvbnMgPSAwLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4+IHdpbmRvd19zdHJpZGVzID0gMCwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+PiBiYXNlX2RpbGF0aW9ucyA9IDAsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90Pj4gd2luZG93X2RpbGF0aW9ucyA9IDAsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90Pj4gcGFkZGluZyA9IDAsCisgICAgaW50MzJfdCBib2R5X3N1YmdyYXBoX2luZGV4ID0gMCkgeworICBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKKyAgYnVpbGRlcl8uYWRkX2JvZHlfc3ViZ3JhcGhfaW5kZXgoYm9keV9zdWJncmFwaF9pbmRleCk7CisgIGJ1aWxkZXJfLmFkZF9wYWRkaW5nKHBhZGRpbmcpOworICBidWlsZGVyXy5hZGRfd2luZG93X2RpbGF0aW9ucyh3aW5kb3dfZGlsYXRpb25zKTsKKyAgYnVpbGRlcl8uYWRkX2Jhc2VfZGlsYXRpb25zKGJhc2VfZGlsYXRpb25zKTsKKyAgYnVpbGRlcl8uYWRkX3dpbmRvd19zdHJpZGVzKHdpbmRvd19zdHJpZGVzKTsKKyAgYnVpbGRlcl8uYWRkX3dpbmRvd19kaW1lbnNpb25zKHdpbmRvd19kaW1lbnNpb25zKTsKKyAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOworfQorCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnM+IENyZWF0ZVN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnNEaXJlY3QoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gKndpbmRvd19kaW1lbnNpb25zID0gbnVsbHB0ciwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAqd2luZG93X3N0cmlkZXMgPSBudWxscHRyLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICpiYXNlX2RpbGF0aW9ucyA9IG51bGxwdHIsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gKndpbmRvd19kaWxhdGlvbnMgPSBudWxscHRyLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICpwYWRkaW5nID0gbnVsbHB0ciwKKyAgICBpbnQzMl90IGJvZHlfc3ViZ3JhcGhfaW5kZXggPSAwKSB7CisgIGF1dG8gd2luZG93X2RpbWVuc2lvbnNfXyA9IHdpbmRvd19kaW1lbnNpb25zID8gX2ZiYi5DcmVhdGVWZWN0b3I8aW50NjRfdD4oKndpbmRvd19kaW1lbnNpb25zKSA6IDA7CisgIGF1dG8gd2luZG93X3N0cmlkZXNfXyA9IHdpbmRvd19zdHJpZGVzID8gX2ZiYi5DcmVhdGVWZWN0b3I8aW50NjRfdD4oKndpbmRvd19zdHJpZGVzKSA6IDA7CisgIGF1dG8gYmFzZV9kaWxhdGlvbnNfXyA9IGJhc2VfZGlsYXRpb25zID8gX2ZiYi5DcmVhdGVWZWN0b3I8aW50NjRfdD4oKmJhc2VfZGlsYXRpb25zKSA6IDA7CisgIGF1dG8gd2luZG93X2RpbGF0aW9uc19fID0gd2luZG93X2RpbGF0aW9ucyA/IF9mYmIuQ3JlYXRlVmVjdG9yPGludDY0X3Q+KCp3aW5kb3dfZGlsYXRpb25zKSA6IDA7CisgIGF1dG8gcGFkZGluZ19fID0gcGFkZGluZyA/IF9mYmIuQ3JlYXRlVmVjdG9yPGludDY0X3Q+KCpwYWRkaW5nKSA6IDA7CisgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZVN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMoCisgICAgICBfZmJiLAorICAgICAgd2luZG93X2RpbWVuc2lvbnNfXywKKyAgICAgIHdpbmRvd19zdHJpZGVzX18sCisgICAgICBiYXNlX2RpbGF0aW9uc19fLAorICAgICAgd2luZG93X2RpbGF0aW9uc19fLAorICAgICAgcGFkZGluZ19fLAorICAgICAgYm9keV9zdWJncmFwaF9pbmRleCk7Cit9CisKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zPiBDcmVhdGVTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworCitzdHJ1Y3QgU3RhYmxlaGxvV2hpbGVPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CisgIHR5cGVkZWYgU3RhYmxlaGxvV2hpbGVPcHRpb25zIFRhYmxlVHlwZTsKKyAgaW50MzJfdCBjb25kX3N1YmdyYXBoX2luZGV4ID0gMDsKKyAgaW50MzJfdCBib2R5X3N1YmdyYXBoX2luZGV4ID0gMDsKK307CisKK3N0cnVjdCBTdGFibGVobG9XaGlsZU9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKKyAgdHlwZWRlZiBTdGFibGVobG9XaGlsZU9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKKyAgdHlwZWRlZiBTdGFibGVobG9XaGlsZU9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CisgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CisgICAgVlRfQ09ORF9TVUJHUkFQSF9JTkRFWCA9IDQsCisgICAgVlRfQk9EWV9TVUJHUkFQSF9JTkRFWCA9IDYKKyAgfTsKKyAgaW50MzJfdCBjb25kX3N1YmdyYXBoX2luZGV4KCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDxpbnQzMl90PihWVF9DT05EX1NVQkdSQVBIX0lOREVYLCAwKTsKKyAgfQorICBpbnQzMl90IGJvZHlfc3ViZ3JhcGhfaW5kZXgoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPGludDMyX3Q+KFZUX0JPRFlfU1VCR1JBUEhfSU5ERVgsIDApOworICB9CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQzMl90Pih2ZXJpZmllciwgVlRfQ09ORF9TVUJHUkFQSF9JTkRFWCwgNCkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50MzJfdD4odmVyaWZpZXIsIFZUX0JPRFlfU1VCR1JBUEhfSU5ERVgsIDQpICYmCisgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CisgIH0KKyAgU3RhYmxlaGxvV2hpbGVPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFN0YWJsZWhsb1doaWxlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9XaGlsZU9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN0YWJsZWhsb1doaWxlT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKK307CisKK3N0cnVjdCBTdGFibGVobG9XaGlsZU9wdGlvbnNCdWlsZGVyIHsKKyAgdHlwZWRlZiBTdGFibGVobG9XaGlsZU9wdGlvbnMgVGFibGU7CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICB2b2lkIGFkZF9jb25kX3N1YmdyYXBoX2luZGV4KGludDMyX3QgY29uZF9zdWJncmFwaF9pbmRleCkgeworICAgIGZiYl8uQWRkRWxlbWVudDxpbnQzMl90PihTdGFibGVobG9XaGlsZU9wdGlvbnM6OlZUX0NPTkRfU1VCR1JBUEhfSU5ERVgsIGNvbmRfc3ViZ3JhcGhfaW5kZXgsIDApOworICB9CisgIHZvaWQgYWRkX2JvZHlfc3ViZ3JhcGhfaW5kZXgoaW50MzJfdCBib2R5X3N1YmdyYXBoX2luZGV4KSB7CisgICAgZmJiXy5BZGRFbGVtZW50PGludDMyX3Q+KFN0YWJsZWhsb1doaWxlT3B0aW9uczo6VlRfQk9EWV9TVUJHUkFQSF9JTkRFWCwgYm9keV9zdWJncmFwaF9pbmRleCwgMCk7CisgIH0KKyAgZXhwbGljaXQgU3RhYmxlaGxvV2hpbGVPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgICAgICAgOiBmYmJfKF9mYmIpIHsKKyAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKKyAgfQorICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvV2hpbGVPcHRpb25zPiBGaW5pc2goKSB7CisgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb1doaWxlT3B0aW9ucz4oZW5kKTsKKyAgICByZXR1cm4gbzsKKyAgfQorfTsKKworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9XaGlsZU9wdGlvbnM+IENyZWF0ZVN0YWJsZWhsb1doaWxlT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKKyAgICBpbnQzMl90IGNvbmRfc3ViZ3JhcGhfaW5kZXggPSAwLAorICAgIGludDMyX3QgYm9keV9zdWJncmFwaF9pbmRleCA9IDApIHsKKyAgU3RhYmxlaGxvV2hpbGVPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKKyAgYnVpbGRlcl8uYWRkX2JvZHlfc3ViZ3JhcGhfaW5kZXgoYm9keV9zdWJncmFwaF9pbmRleCk7CisgIGJ1aWxkZXJfLmFkZF9jb25kX3N1YmdyYXBoX2luZGV4KGNvbmRfc3ViZ3JhcGhfaW5kZXgpOworICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7Cit9CisKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9XaGlsZU9wdGlvbnM+IENyZWF0ZVN0YWJsZWhsb1doaWxlT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlaGxvV2hpbGVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworCitzdHJ1Y3QgU3RhYmxlaGxvU29ydE9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKKyAgdHlwZWRlZiBTdGFibGVobG9Tb3J0T3B0aW9ucyBUYWJsZVR5cGU7CisgIGludDY0X3QgZGltZW5zaW9uID0gMDsKKyAgYm9vbCBpc19zdGFibGUgPSBmYWxzZTsKKyAgaW50MzJfdCBjb21wYXJhdG9yX3N1YmdyYXBoX2luZGV4ID0gMDsKK307CisKK3N0cnVjdCBTdGFibGVobG9Tb3J0T3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgeworICB0eXBlZGVmIFN0YWJsZWhsb1NvcnRPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CisgIHR5cGVkZWYgU3RhYmxlaGxvU29ydE9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CisgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CisgICAgVlRfRElNRU5TSU9OID0gNCwKKyAgICBWVF9JU19TVEFCTEUgPSA2LAorICAgIFZUX0NPTVBBUkFUT1JfU1VCR1JBUEhfSU5ERVggPSA4CisgIH07CisgIGludDY0X3QgZGltZW5zaW9uKCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDxpbnQ2NF90PihWVF9ESU1FTlNJT04sIDApOworICB9CisgIGJvb2wgaXNfc3RhYmxlKCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDx1aW50OF90PihWVF9JU19TVEFCTEUsIDApICE9IDA7CisgIH0KKyAgaW50MzJfdCBjb21wYXJhdG9yX3N1YmdyYXBoX2luZGV4KCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDxpbnQzMl90PihWVF9DT01QQVJBVE9SX1NVQkdSQVBIX0lOREVYLCAwKTsKKyAgfQorICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50NjRfdD4odmVyaWZpZXIsIFZUX0RJTUVOU0lPTiwgOCkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8dWludDhfdD4odmVyaWZpZXIsIFZUX0lTX1NUQUJMRSwgMSkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50MzJfdD4odmVyaWZpZXIsIFZUX0NPTVBBUkFUT1JfU1VCR1JBUEhfSU5ERVgsIDQpICYmCisgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CisgIH0KKyAgU3RhYmxlaGxvU29ydE9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oU3RhYmxlaGxvU29ydE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvU29ydE9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN0YWJsZWhsb1NvcnRPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworfTsKKworc3RydWN0IFN0YWJsZWhsb1NvcnRPcHRpb25zQnVpbGRlciB7CisgIHR5cGVkZWYgU3RhYmxlaGxvU29ydE9wdGlvbnMgVGFibGU7CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICB2b2lkIGFkZF9kaW1lbnNpb24oaW50NjRfdCBkaW1lbnNpb24pIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8aW50NjRfdD4oU3RhYmxlaGxvU29ydE9wdGlvbnM6OlZUX0RJTUVOU0lPTiwgZGltZW5zaW9uLCAwKTsKKyAgfQorICB2b2lkIGFkZF9pc19zdGFibGUoYm9vbCBpc19zdGFibGUpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDhfdD4oU3RhYmxlaGxvU29ydE9wdGlvbnM6OlZUX0lTX1NUQUJMRSwgc3RhdGljX2Nhc3Q8dWludDhfdD4oaXNfc3RhYmxlKSwgMCk7CisgIH0KKyAgdm9pZCBhZGRfY29tcGFyYXRvcl9zdWJncmFwaF9pbmRleChpbnQzMl90IGNvbXBhcmF0b3Jfc3ViZ3JhcGhfaW5kZXgpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8aW50MzJfdD4oU3RhYmxlaGxvU29ydE9wdGlvbnM6OlZUX0NPTVBBUkFUT1JfU1VCR1JBUEhfSU5ERVgsIGNvbXBhcmF0b3Jfc3ViZ3JhcGhfaW5kZXgsIDApOworICB9CisgIGV4cGxpY2l0IFN0YWJsZWhsb1NvcnRPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgICAgICAgOiBmYmJfKF9mYmIpIHsKKyAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKKyAgfQorICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvU29ydE9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvU29ydE9wdGlvbnM+KGVuZCk7CisgICAgcmV0dXJuIG87CisgIH0KK307CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvU29ydE9wdGlvbnM+IENyZWF0ZVN0YWJsZWhsb1NvcnRPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAorICAgIGludDY0X3QgZGltZW5zaW9uID0gMCwKKyAgICBib29sIGlzX3N0YWJsZSA9IGZhbHNlLAorICAgIGludDMyX3QgY29tcGFyYXRvcl9zdWJncmFwaF9pbmRleCA9IDApIHsKKyAgU3RhYmxlaGxvU29ydE9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOworICBidWlsZGVyXy5hZGRfZGltZW5zaW9uKGRpbWVuc2lvbik7CisgIGJ1aWxkZXJfLmFkZF9jb21wYXJhdG9yX3N1YmdyYXBoX2luZGV4KGNvbXBhcmF0b3Jfc3ViZ3JhcGhfaW5kZXgpOworICBidWlsZGVyXy5hZGRfaXNfc3RhYmxlKGlzX3N0YWJsZSk7CisgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKK30KKworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb1NvcnRPcHRpb25zPiBDcmVhdGVTdGFibGVobG9Tb3J0T3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlaGxvU29ydE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisKK3N0cnVjdCBTdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKKyAgdHlwZWRlZiBTdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnMgVGFibGVUeXBlOworICBpbnQ2NF90IGRpbWVuc2lvbiA9IDA7Cit9OworCitzdHJ1Y3QgU3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CisgIHR5cGVkZWYgU3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CisgIHR5cGVkZWYgU3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zQnVpbGRlciBCdWlsZGVyOworICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgeworICAgIFZUX0RJTUVOU0lPTiA9IDQKKyAgfTsKKyAgaW50NjRfdCBkaW1lbnNpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPGludDY0X3Q+KFZUX0RJTUVOU0lPTiwgMCk7CisgIH0KKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDY0X3Q+KHZlcmlmaWVyLCBWVF9ESU1FTlNJT04sIDgpICYmCisgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CisgIH0KKyAgU3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFN0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKK307CisKK3N0cnVjdCBTdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnNCdWlsZGVyIHsKKyAgdHlwZWRlZiBTdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnMgVGFibGU7CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICB2b2lkIGFkZF9kaW1lbnNpb24oaW50NjRfdCBkaW1lbnNpb24pIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8aW50NjRfdD4oU3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zOjpWVF9ESU1FTlNJT04sIGRpbWVuc2lvbiwgMCk7CisgIH0KKyAgZXhwbGljaXQgU3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgICAgICAgOiBmYmJfKF9mYmIpIHsKKyAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKKyAgfQorICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zPiBGaW5pc2goKSB7CisgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9ucz4oZW5kKTsKKyAgICByZXR1cm4gbzsKKyAgfQorfTsKKworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnM+IENyZWF0ZVN0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKKyAgICBpbnQ2NF90IGRpbWVuc2lvbiA9IDApIHsKKyAgU3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKKyAgYnVpbGRlcl8uYWRkX2RpbWVuc2lvbihkaW1lbnNpb24pOworICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7Cit9CisKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnM+IENyZWF0ZVN0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworCitzdHJ1Y3QgU3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CisgIHR5cGVkZWYgU3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zIFRhYmxlVHlwZTsKKyAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gYnJvYWRjYXN0X2RpbWVuc2lvbnN7fTsKK307CisKK3N0cnVjdCBTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKKyAgdHlwZWRlZiBTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKKyAgdHlwZWRlZiBTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CisgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CisgICAgVlRfQlJPQURDQVNUX0RJTUVOU0lPTlMgPSA0CisgIH07CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiAqYnJvYWRjYXN0X2RpbWVuc2lvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+ICo+KFZUX0JST0FEQ0FTVF9ESU1FTlNJT05TKTsKKyAgfQorICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9CUk9BRENBU1RfRElNRU5TSU9OUykgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKGJyb2FkY2FzdF9kaW1lbnNpb25zKCkpICYmCisgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CisgIH0KKyAgU3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKK307CisKK3N0cnVjdCBTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnNCdWlsZGVyIHsKKyAgdHlwZWRlZiBTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnMgVGFibGU7CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICB2b2lkIGFkZF9icm9hZGNhc3RfZGltZW5zaW9ucyg6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+PiBicm9hZGNhc3RfZGltZW5zaW9ucykgeworICAgIGZiYl8uQWRkT2Zmc2V0KFN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9uczo6VlRfQlJPQURDQVNUX0RJTUVOU0lPTlMsIGJyb2FkY2FzdF9kaW1lbnNpb25zKTsKKyAgfQorICBleHBsaWNpdCBTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICAgICAgICA6IGZiYl8oX2ZiYikgeworICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOworICB9CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zPihlbmQpOworICAgIHJldHVybiBvOworICB9Cit9OworCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9ucz4gQ3JlYXRlU3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4+IGJyb2FkY2FzdF9kaW1lbnNpb25zID0gMCkgeworICBTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOworICBidWlsZGVyXy5hZGRfYnJvYWRjYXN0X2RpbWVuc2lvbnMoYnJvYWRjYXN0X2RpbWVuc2lvbnMpOworICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7Cit9CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zPiBDcmVhdGVTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnNEaXJlY3QoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gKmJyb2FkY2FzdF9kaW1lbnNpb25zID0gbnVsbHB0cikgeworICBhdXRvIGJyb2FkY2FzdF9kaW1lbnNpb25zX18gPSBicm9hZGNhc3RfZGltZW5zaW9ucyA/IF9mYmIuQ3JlYXRlVmVjdG9yPGludDY0X3Q+KCpicm9hZGNhc3RfZGltZW5zaW9ucykgOiAwOworICByZXR1cm4gdGZsaXRlOjpDcmVhdGVTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnMoCisgICAgICBfZmJiLAorICAgICAgYnJvYWRjYXN0X2RpbWVuc2lvbnNfXyk7Cit9CisKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnM+IENyZWF0ZVN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworCitzdHJ1Y3QgU3RhYmxlaGxvQ29tcGFyZU9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKKyAgdHlwZWRlZiBTdGFibGVobG9Db21wYXJlT3B0aW9ucyBUYWJsZVR5cGU7CisgIHRmbGl0ZTo6U3RhYmxlaGxvQ29tcGFyaXNvbkRpcmVjdGlvbiBjb21wYXJpc29uX2RpcmVjdGlvbiA9IHRmbGl0ZTo6U3RhYmxlaGxvQ29tcGFyaXNvbkRpcmVjdGlvbl9TVEFCTEVITE9fQ09NUEFSSVNPTl9ESVJFQ1RJT05fRVE7CisgIHRmbGl0ZTo6U3RhYmxlaGxvQ29tcGFyaXNvblR5cGUgY29tcGFyZV90eXBlID0gdGZsaXRlOjpTdGFibGVobG9Db21wYXJpc29uVHlwZV9TVEFCTEVITE9fQ09NUEFSSVNPTl9UWVBFX05PVFlQRTsKK307CisKK3N0cnVjdCBTdGFibGVobG9Db21wYXJlT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgeworICB0eXBlZGVmIFN0YWJsZWhsb0NvbXBhcmVPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CisgIHR5cGVkZWYgU3RhYmxlaGxvQ29tcGFyZU9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CisgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CisgICAgVlRfQ09NUEFSSVNPTl9ESVJFQ1RJT04gPSA0LAorICAgIFZUX0NPTVBBUkVfVFlQRSA9IDYKKyAgfTsKKyAgdGZsaXRlOjpTdGFibGVobG9Db21wYXJpc29uRGlyZWN0aW9uIGNvbXBhcmlzb25fZGlyZWN0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDx0ZmxpdGU6OlN0YWJsZWhsb0NvbXBhcmlzb25EaXJlY3Rpb24+KEdldEZpZWxkPHVpbnQzMl90PihWVF9DT01QQVJJU09OX0RJUkVDVElPTiwgMCkpOworICB9CisgIHRmbGl0ZTo6U3RhYmxlaGxvQ29tcGFyaXNvblR5cGUgY29tcGFyZV90eXBlKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDx0ZmxpdGU6OlN0YWJsZWhsb0NvbXBhcmlzb25UeXBlPihHZXRGaWVsZDx1aW50MzJfdD4oVlRfQ09NUEFSRV9UWVBFLCAwKSk7CisgIH0KKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQzMl90Pih2ZXJpZmllciwgVlRfQ09NUEFSSVNPTl9ESVJFQ1RJT04sIDQpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQzMl90Pih2ZXJpZmllciwgVlRfQ09NUEFSRV9UWVBFLCA0KSAmJgorICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOworICB9CisgIFN0YWJsZWhsb0NvbXBhcmVPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFN0YWJsZWhsb0NvbXBhcmVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb0NvbXBhcmVPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTdGFibGVobG9Db21wYXJlT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKK307CisKK3N0cnVjdCBTdGFibGVobG9Db21wYXJlT3B0aW9uc0J1aWxkZXIgeworICB0eXBlZGVmIFN0YWJsZWhsb0NvbXBhcmVPcHRpb25zIFRhYmxlOworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgdm9pZCBhZGRfY29tcGFyaXNvbl9kaXJlY3Rpb24odGZsaXRlOjpTdGFibGVobG9Db21wYXJpc29uRGlyZWN0aW9uIGNvbXBhcmlzb25fZGlyZWN0aW9uKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQzMl90PihTdGFibGVobG9Db21wYXJlT3B0aW9uczo6VlRfQ09NUEFSSVNPTl9ESVJFQ1RJT04sIHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb21wYXJpc29uX2RpcmVjdGlvbiksIDApOworICB9CisgIHZvaWQgYWRkX2NvbXBhcmVfdHlwZSh0ZmxpdGU6OlN0YWJsZWhsb0NvbXBhcmlzb25UeXBlIGNvbXBhcmVfdHlwZSkgeworICAgIGZiYl8uQWRkRWxlbWVudDx1aW50MzJfdD4oU3RhYmxlaGxvQ29tcGFyZU9wdGlvbnM6OlZUX0NPTVBBUkVfVFlQRSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGNvbXBhcmVfdHlwZSksIDApOworICB9CisgIGV4cGxpY2l0IFN0YWJsZWhsb0NvbXBhcmVPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgICAgICAgOiBmYmJfKF9mYmIpIHsKKyAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKKyAgfQorICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvQ29tcGFyZU9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvQ29tcGFyZU9wdGlvbnM+KGVuZCk7CisgICAgcmV0dXJuIG87CisgIH0KK307CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvQ29tcGFyZU9wdGlvbnM+IENyZWF0ZVN0YWJsZWhsb0NvbXBhcmVPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAorICAgIHRmbGl0ZTo6U3RhYmxlaGxvQ29tcGFyaXNvbkRpcmVjdGlvbiBjb21wYXJpc29uX2RpcmVjdGlvbiA9IHRmbGl0ZTo6U3RhYmxlaGxvQ29tcGFyaXNvbkRpcmVjdGlvbl9TVEFCTEVITE9fQ09NUEFSSVNPTl9ESVJFQ1RJT05fRVEsCisgICAgdGZsaXRlOjpTdGFibGVobG9Db21wYXJpc29uVHlwZSBjb21wYXJlX3R5cGUgPSB0ZmxpdGU6OlN0YWJsZWhsb0NvbXBhcmlzb25UeXBlX1NUQUJMRUhMT19DT01QQVJJU09OX1RZUEVfTk9UWVBFKSB7CisgIFN0YWJsZWhsb0NvbXBhcmVPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKKyAgYnVpbGRlcl8uYWRkX2NvbXBhcmVfdHlwZShjb21wYXJlX3R5cGUpOworICBidWlsZGVyXy5hZGRfY29tcGFyaXNvbl9kaXJlY3Rpb24oY29tcGFyaXNvbl9kaXJlY3Rpb24pOworICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7Cit9CisKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9Db21wYXJlT3B0aW9ucz4gQ3JlYXRlU3RhYmxlaGxvQ29tcGFyZU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN0YWJsZWhsb0NvbXBhcmVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworCitzdHJ1Y3QgU3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworICB0eXBlZGVmIFN0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnMgVGFibGVUeXBlOworICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBzbGljZV9zaXplc3t9OworfTsKKworc3RydWN0IFN0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKKyAgdHlwZWRlZiBTdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CisgIHR5cGVkZWYgU3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKKyAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKKyAgICBWVF9TTElDRV9TSVpFUyA9IDQKKyAgfTsKKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+ICpzbGljZV9zaXplcygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4gKj4oVlRfU0xJQ0VfU0laRVMpOworICB9CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1NMSUNFX1NJWkVTKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3Ioc2xpY2Vfc2l6ZXMoKSkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKKyAgfQorICBTdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFN0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKK307CisKK3N0cnVjdCBTdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zQnVpbGRlciB7CisgIHR5cGVkZWYgU3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9ucyBUYWJsZTsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIHZvaWQgYWRkX3NsaWNlX3NpemVzKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4+IHNsaWNlX3NpemVzKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoU3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9uczo6VlRfU0xJQ0VfU0laRVMsIHNsaWNlX3NpemVzKTsKKyAgfQorICBleHBsaWNpdCBTdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgICAgICAgOiBmYmJfKF9mYmIpIHsKKyAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKKyAgfQorICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9ucz4gRmluaXNoKCkgeworICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zPihlbmQpOworICAgIHJldHVybiBvOworICB9Cit9OworCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnM+IENyZWF0ZVN0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90Pj4gc2xpY2Vfc2l6ZXMgPSAwKSB7CisgIFN0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOworICBidWlsZGVyXy5hZGRfc2xpY2Vfc2l6ZXMoc2xpY2Vfc2l6ZXMpOworICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7Cit9CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9ucz4gQ3JlYXRlU3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9uc0RpcmVjdCgKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAqc2xpY2Vfc2l6ZXMgPSBudWxscHRyKSB7CisgIGF1dG8gc2xpY2Vfc2l6ZXNfXyA9IHNsaWNlX3NpemVzID8gX2ZiYi5DcmVhdGVWZWN0b3I8aW50NjRfdD4oKnNsaWNlX3NpemVzKSA6IDA7CisgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZVN0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnMoCisgICAgICBfZmJiLAorICAgICAgc2xpY2Vfc2l6ZXNfXyk7Cit9CisKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zPiBDcmVhdGVTdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworCitzdHJ1Y3QgU3RhYmxlaGxvUGFkT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworICB0eXBlZGVmIFN0YWJsZWhsb1BhZE9wdGlvbnMgVGFibGVUeXBlOworICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBlZGdlX3BhZGRpbmdfbG93e307CisgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IGVkZ2VfcGFkZGluZ19oaWdoe307CisgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IGludGVyaW9yX3BhZGRpbmd7fTsKK307CisKK3N0cnVjdCBTdGFibGVobG9QYWRPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CisgIHR5cGVkZWYgU3RhYmxlaGxvUGFkT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOworICB0eXBlZGVmIFN0YWJsZWhsb1BhZE9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CisgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CisgICAgVlRfRURHRV9QQURESU5HX0xPVyA9IDQsCisgICAgVlRfRURHRV9QQURESU5HX0hJR0ggPSA2LAorICAgIFZUX0lOVEVSSU9SX1BBRERJTkcgPSA4CisgIH07CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiAqZWRnZV9wYWRkaW5nX2xvdygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4gKj4oVlRfRURHRV9QQURESU5HX0xPVyk7CisgIH0KKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+ICplZGdlX3BhZGRpbmdfaGlnaCgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4gKj4oVlRfRURHRV9QQURESU5HX0hJR0gpOworICB9CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiAqaW50ZXJpb3JfcGFkZGluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4gKj4oVlRfSU5URVJJT1JfUEFERElORyk7CisgIH0KKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfRURHRV9QQURESU5HX0xPVykgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKGVkZ2VfcGFkZGluZ19sb3coKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9FREdFX1BBRERJTkdfSElHSCkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKGVkZ2VfcGFkZGluZ19oaWdoKCkpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfSU5URVJJT1JfUEFERElORykgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKGludGVyaW9yX3BhZGRpbmcoKSkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKKyAgfQorICBTdGFibGVobG9QYWRPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFN0YWJsZWhsb1BhZE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvUGFkT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlaGxvUGFkT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKK307CisKK3N0cnVjdCBTdGFibGVobG9QYWRPcHRpb25zQnVpbGRlciB7CisgIHR5cGVkZWYgU3RhYmxlaGxvUGFkT3B0aW9ucyBUYWJsZTsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIHZvaWQgYWRkX2VkZ2VfcGFkZGluZ19sb3coOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90Pj4gZWRnZV9wYWRkaW5nX2xvdykgeworICAgIGZiYl8uQWRkT2Zmc2V0KFN0YWJsZWhsb1BhZE9wdGlvbnM6OlZUX0VER0VfUEFERElOR19MT1csIGVkZ2VfcGFkZGluZ19sb3cpOworICB9CisgIHZvaWQgYWRkX2VkZ2VfcGFkZGluZ19oaWdoKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4+IGVkZ2VfcGFkZGluZ19oaWdoKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoU3RhYmxlaGxvUGFkT3B0aW9uczo6VlRfRURHRV9QQURESU5HX0hJR0gsIGVkZ2VfcGFkZGluZ19oaWdoKTsKKyAgfQorICB2b2lkIGFkZF9pbnRlcmlvcl9wYWRkaW5nKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4+IGludGVyaW9yX3BhZGRpbmcpIHsKKyAgICBmYmJfLkFkZE9mZnNldChTdGFibGVobG9QYWRPcHRpb25zOjpWVF9JTlRFUklPUl9QQURESU5HLCBpbnRlcmlvcl9wYWRkaW5nKTsKKyAgfQorICBleHBsaWNpdCBTdGFibGVobG9QYWRPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgICAgICAgOiBmYmJfKF9mYmIpIHsKKyAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKKyAgfQorICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvUGFkT3B0aW9ucz4gRmluaXNoKCkgeworICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9QYWRPcHRpb25zPihlbmQpOworICAgIHJldHVybiBvOworICB9Cit9OworCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb1BhZE9wdGlvbnM+IENyZWF0ZVN0YWJsZWhsb1BhZE9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90Pj4gZWRnZV9wYWRkaW5nX2xvdyA9IDAsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90Pj4gZWRnZV9wYWRkaW5nX2hpZ2ggPSAwLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4+IGludGVyaW9yX3BhZGRpbmcgPSAwKSB7CisgIFN0YWJsZWhsb1BhZE9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOworICBidWlsZGVyXy5hZGRfaW50ZXJpb3JfcGFkZGluZyhpbnRlcmlvcl9wYWRkaW5nKTsKKyAgYnVpbGRlcl8uYWRkX2VkZ2VfcGFkZGluZ19oaWdoKGVkZ2VfcGFkZGluZ19oaWdoKTsKKyAgYnVpbGRlcl8uYWRkX2VkZ2VfcGFkZGluZ19sb3coZWRnZV9wYWRkaW5nX2xvdyk7CisgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKK30KKworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9QYWRPcHRpb25zPiBDcmVhdGVTdGFibGVobG9QYWRPcHRpb25zRGlyZWN0KAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICplZGdlX3BhZGRpbmdfbG93ID0gbnVsbHB0ciwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAqZWRnZV9wYWRkaW5nX2hpZ2ggPSBudWxscHRyLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICppbnRlcmlvcl9wYWRkaW5nID0gbnVsbHB0cikgeworICBhdXRvIGVkZ2VfcGFkZGluZ19sb3dfXyA9IGVkZ2VfcGFkZGluZ19sb3cgPyBfZmJiLkNyZWF0ZVZlY3RvcjxpbnQ2NF90PigqZWRnZV9wYWRkaW5nX2xvdykgOiAwOworICBhdXRvIGVkZ2VfcGFkZGluZ19oaWdoX18gPSBlZGdlX3BhZGRpbmdfaGlnaCA/IF9mYmIuQ3JlYXRlVmVjdG9yPGludDY0X3Q+KCplZGdlX3BhZGRpbmdfaGlnaCkgOiAwOworICBhdXRvIGludGVyaW9yX3BhZGRpbmdfXyA9IGludGVyaW9yX3BhZGRpbmcgPyBfZmJiLkNyZWF0ZVZlY3RvcjxpbnQ2NF90PigqaW50ZXJpb3JfcGFkZGluZykgOiAwOworICByZXR1cm4gdGZsaXRlOjpDcmVhdGVTdGFibGVobG9QYWRPcHRpb25zKAorICAgICAgX2ZiYiwKKyAgICAgIGVkZ2VfcGFkZGluZ19sb3dfXywKKyAgICAgIGVkZ2VfcGFkZGluZ19oaWdoX18sCisgICAgICBpbnRlcmlvcl9wYWRkaW5nX18pOworfQorCis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvUGFkT3B0aW9ucz4gQ3JlYXRlU3RhYmxlaGxvUGFkT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlaGxvUGFkT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKworc3RydWN0IFN0YWJsZWhsb0lvdGFPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CisgIHR5cGVkZWYgU3RhYmxlaGxvSW90YU9wdGlvbnMgVGFibGVUeXBlOworICBpbnQ2NF90IGlvdGFfZGltZW5zaW9uID0gMDsKK307CisKK3N0cnVjdCBTdGFibGVobG9Jb3RhT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgeworICB0eXBlZGVmIFN0YWJsZWhsb0lvdGFPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CisgIHR5cGVkZWYgU3RhYmxlaGxvSW90YU9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CisgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CisgICAgVlRfSU9UQV9ESU1FTlNJT04gPSA0CisgIH07CisgIGludDY0X3QgaW90YV9kaW1lbnNpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPGludDY0X3Q+KFZUX0lPVEFfRElNRU5TSU9OLCAwKTsKKyAgfQorICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50NjRfdD4odmVyaWZpZXIsIFZUX0lPVEFfRElNRU5TSU9OLCA4KSAmJgorICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOworICB9CisgIFN0YWJsZWhsb0lvdGFPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFN0YWJsZWhsb0lvdGFPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb0lvdGFPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTdGFibGVobG9Jb3RhT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKK307CisKK3N0cnVjdCBTdGFibGVobG9Jb3RhT3B0aW9uc0J1aWxkZXIgeworICB0eXBlZGVmIFN0YWJsZWhsb0lvdGFPcHRpb25zIFRhYmxlOworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgdm9pZCBhZGRfaW90YV9kaW1lbnNpb24oaW50NjRfdCBpb3RhX2RpbWVuc2lvbikgeworICAgIGZiYl8uQWRkRWxlbWVudDxpbnQ2NF90PihTdGFibGVobG9Jb3RhT3B0aW9uczo6VlRfSU9UQV9ESU1FTlNJT04sIGlvdGFfZGltZW5zaW9uLCAwKTsKKyAgfQorICBleHBsaWNpdCBTdGFibGVobG9Jb3RhT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgICAgICAgIDogZmJiXyhfZmJiKSB7CisgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CisgIH0KKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb0lvdGFPcHRpb25zPiBGaW5pc2goKSB7CisgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb0lvdGFPcHRpb25zPihlbmQpOworICAgIHJldHVybiBvOworICB9Cit9OworCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb0lvdGFPcHRpb25zPiBDcmVhdGVTdGFibGVobG9Jb3RhT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKKyAgICBpbnQ2NF90IGlvdGFfZGltZW5zaW9uID0gMCkgeworICBTdGFibGVobG9Jb3RhT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CisgIGJ1aWxkZXJfLmFkZF9pb3RhX2RpbWVuc2lvbihpb3RhX2RpbWVuc2lvbik7CisgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKK30KKworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb0lvdGFPcHRpb25zPiBDcmVhdGVTdGFibGVobG9Jb3RhT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlaGxvSW90YU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisKK3N0cnVjdCBTdGFibGVobG9DdXN0b21DYWxsT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworICB0eXBlZGVmIFN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zIFRhYmxlVHlwZTsKKyAgc3RkOjpzdHJpbmcgY2FsbF90YXJnZXRfbmFtZXt9OworICBib29sIGhhc19zaWRlX2VmZmVjdCA9IGZhbHNlOworICBzdGQ6OnN0cmluZyBiYWNrZW5kX2NvbmZpZ3t9OworICBpbnQzMl90IGFwaV92ZXJzaW9uID0gMDsKKyAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gY2FsbGVkX2NvbXB1dGF0aW9uc3t9OworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBjdXN0b21fYXR0cmlidXRlc3t9OworfTsKKworc3RydWN0IFN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CisgIHR5cGVkZWYgU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKKyAgdHlwZWRlZiBTdGFibGVobG9DdXN0b21DYWxsT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKKyAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKKyAgICBWVF9DQUxMX1RBUkdFVF9OQU1FID0gNCwKKyAgICBWVF9IQVNfU0lERV9FRkZFQ1QgPSA2LAorICAgIFZUX0JBQ0tFTkRfQ09ORklHID0gOCwKKyAgICBWVF9BUElfVkVSU0lPTiA9IDEwLAorICAgIFZUX0NBTExFRF9DT01QVVRBVElPTlMgPSAxMiwKKyAgICBWVF9DVVNUT01fQVRUUklCVVRFUyA9IDE0CisgIH07CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlN0cmluZyAqY2FsbF90YXJnZXRfbmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpTdHJpbmcgKj4oVlRfQ0FMTF9UQVJHRVRfTkFNRSk7CisgIH0KKyAgYm9vbCBoYXNfc2lkZV9lZmZlY3QoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPHVpbnQ4X3Q+KFZUX0hBU19TSURFX0VGRkVDVCwgMCkgIT0gMDsKKyAgfQorICBjb25zdCA6OmZsYXRidWZmZXJzOjpTdHJpbmcgKmJhY2tlbmRfY29uZmlnKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlN0cmluZyAqPihWVF9CQUNLRU5EX0NPTkZJRyk7CisgIH0KKyAgaW50MzJfdCBhcGlfdmVyc2lvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8aW50MzJfdD4oVlRfQVBJX1ZFUlNJT04sIDApOworICB9CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90PiAqY2FsbGVkX2NvbXB1dGF0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4gKj4oVlRfQ0FMTEVEX0NPTVBVVEFUSU9OUyk7CisgIH0KKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICpjdXN0b21fYXR0cmlidXRlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKj4oVlRfQ1VTVE9NX0FUVFJJQlVURVMpOworICB9CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX0NBTExfVEFSR0VUX05BTUUpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVN0cmluZyhjYWxsX3RhcmdldF9uYW1lKCkpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9IQVNfU0lERV9FRkZFQ1QsIDEpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfQkFDS0VORF9DT05GSUcpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVN0cmluZyhiYWNrZW5kX2NvbmZpZygpKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQzMl90Pih2ZXJpZmllciwgVlRfQVBJX1ZFUlNJT04sIDQpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfQ0FMTEVEX0NPTVBVVEFUSU9OUykgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKGNhbGxlZF9jb21wdXRhdGlvbnMoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9DVVNUT01fQVRUUklCVVRFUykgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKGN1c3RvbV9hdHRyaWJ1dGVzKCkpICYmCisgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CisgIH0KKyAgU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworfTsKKworc3RydWN0IFN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zQnVpbGRlciB7CisgIHR5cGVkZWYgU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnMgVGFibGU7CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICB2b2lkIGFkZF9jYWxsX3RhcmdldF9uYW1lKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpTdHJpbmc+IGNhbGxfdGFyZ2V0X25hbWUpIHsKKyAgICBmYmJfLkFkZE9mZnNldChTdGFibGVobG9DdXN0b21DYWxsT3B0aW9uczo6VlRfQ0FMTF9UQVJHRVRfTkFNRSwgY2FsbF90YXJnZXRfbmFtZSk7CisgIH0KKyAgdm9pZCBhZGRfaGFzX3NpZGVfZWZmZWN0KGJvb2wgaGFzX3NpZGVfZWZmZWN0KSB7CisgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQ4X3Q+KFN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zOjpWVF9IQVNfU0lERV9FRkZFQ1QsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGhhc19zaWRlX2VmZmVjdCksIDApOworICB9CisgIHZvaWQgYWRkX2JhY2tlbmRfY29uZmlnKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpTdHJpbmc+IGJhY2tlbmRfY29uZmlnKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnM6OlZUX0JBQ0tFTkRfQ09ORklHLCBiYWNrZW5kX2NvbmZpZyk7CisgIH0KKyAgdm9pZCBhZGRfYXBpX3ZlcnNpb24oaW50MzJfdCBhcGlfdmVyc2lvbikgeworICAgIGZiYl8uQWRkRWxlbWVudDxpbnQzMl90PihTdGFibGVobG9DdXN0b21DYWxsT3B0aW9uczo6VlRfQVBJX1ZFUlNJT04sIGFwaV92ZXJzaW9uLCAwKTsKKyAgfQorICB2b2lkIGFkZF9jYWxsZWRfY29tcHV0YXRpb25zKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4+IGNhbGxlZF9jb21wdXRhdGlvbnMpIHsKKyAgICBmYmJfLkFkZE9mZnNldChTdGFibGVobG9DdXN0b21DYWxsT3B0aW9uczo6VlRfQ0FMTEVEX0NPTVBVVEFUSU9OUywgY2FsbGVkX2NvbXB1dGF0aW9ucyk7CisgIH0KKyAgdm9pZCBhZGRfY3VzdG9tX2F0dHJpYnV0ZXMoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90Pj4gY3VzdG9tX2F0dHJpYnV0ZXMpIHsKKyAgICBmYmJfLkFkZE9mZnNldChTdGFibGVobG9DdXN0b21DYWxsT3B0aW9uczo6VlRfQ1VTVE9NX0FUVFJJQlVURVMsIGN1c3RvbV9hdHRyaWJ1dGVzKTsKKyAgfQorICBleHBsaWNpdCBTdGFibGVobG9DdXN0b21DYWxsT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgICAgICAgIDogZmJiXyhfZmJiKSB7CisgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CisgIH0KKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zPiBGaW5pc2goKSB7CisgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zPihlbmQpOworICAgIHJldHVybiBvOworICB9Cit9OworCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zPiBDcmVhdGVTdGFibGVobG9DdXN0b21DYWxsT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6U3RyaW5nPiBjYWxsX3RhcmdldF9uYW1lID0gMCwKKyAgICBib29sIGhhc19zaWRlX2VmZmVjdCA9IGZhbHNlLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpTdHJpbmc+IGJhY2tlbmRfY29uZmlnID0gMCwKKyAgICBpbnQzMl90IGFwaV92ZXJzaW9uID0gMCwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+PiBjYWxsZWRfY29tcHV0YXRpb25zID0gMCwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+PiBjdXN0b21fYXR0cmlidXRlcyA9IDApIHsKKyAgU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOworICBidWlsZGVyXy5hZGRfY3VzdG9tX2F0dHJpYnV0ZXMoY3VzdG9tX2F0dHJpYnV0ZXMpOworICBidWlsZGVyXy5hZGRfY2FsbGVkX2NvbXB1dGF0aW9ucyhjYWxsZWRfY29tcHV0YXRpb25zKTsKKyAgYnVpbGRlcl8uYWRkX2FwaV92ZXJzaW9uKGFwaV92ZXJzaW9uKTsKKyAgYnVpbGRlcl8uYWRkX2JhY2tlbmRfY29uZmlnKGJhY2tlbmRfY29uZmlnKTsKKyAgYnVpbGRlcl8uYWRkX2NhbGxfdGFyZ2V0X25hbWUoY2FsbF90YXJnZXRfbmFtZSk7CisgIGJ1aWxkZXJfLmFkZF9oYXNfc2lkZV9lZmZlY3QoaGFzX3NpZGVfZWZmZWN0KTsKKyAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOworfQorCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zPiBDcmVhdGVTdGFibGVobG9DdXN0b21DYWxsT3B0aW9uc0RpcmVjdCgKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKKyAgICBjb25zdCBjaGFyICpjYWxsX3RhcmdldF9uYW1lID0gbnVsbHB0ciwKKyAgICBib29sIGhhc19zaWRlX2VmZmVjdCA9IGZhbHNlLAorICAgIGNvbnN0IGNoYXIgKmJhY2tlbmRfY29uZmlnID0gbnVsbHB0ciwKKyAgICBpbnQzMl90IGFwaV92ZXJzaW9uID0gMCwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiAqY2FsbGVkX2NvbXB1dGF0aW9ucyA9IG51bGxwdHIsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gKmN1c3RvbV9hdHRyaWJ1dGVzID0gbnVsbHB0cikgeworICBhdXRvIGNhbGxfdGFyZ2V0X25hbWVfXyA9IGNhbGxfdGFyZ2V0X25hbWUgPyBfZmJiLkNyZWF0ZVN0cmluZyhjYWxsX3RhcmdldF9uYW1lKSA6IDA7CisgIGF1dG8gYmFja2VuZF9jb25maWdfXyA9IGJhY2tlbmRfY29uZmlnID8gX2ZiYi5DcmVhdGVTdHJpbmcoYmFja2VuZF9jb25maWcpIDogMDsKKyAgYXV0byBjYWxsZWRfY29tcHV0YXRpb25zX18gPSBjYWxsZWRfY29tcHV0YXRpb25zID8gX2ZiYi5DcmVhdGVWZWN0b3I8aW50MzJfdD4oKmNhbGxlZF9jb21wdXRhdGlvbnMpIDogMDsKKyAgYXV0byBjdXN0b21fYXR0cmlidXRlc19fID0gY3VzdG9tX2F0dHJpYnV0ZXMgPyBfZmJiLkNyZWF0ZVZlY3Rvcjx1aW50OF90PigqY3VzdG9tX2F0dHJpYnV0ZXMpIDogMDsKKyAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnMoCisgICAgICBfZmJiLAorICAgICAgY2FsbF90YXJnZXRfbmFtZV9fLAorICAgICAgaGFzX3NpZGVfZWZmZWN0LAorICAgICAgYmFja2VuZF9jb25maWdfXywKKyAgICAgIGFwaV92ZXJzaW9uLAorICAgICAgY2FsbGVkX2NvbXB1dGF0aW9uc19fLAorICAgICAgY3VzdG9tX2F0dHJpYnV0ZXNfXyk7Cit9CisKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9DdXN0b21DYWxsT3B0aW9ucz4gQ3JlYXRlU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworCitzdHJ1Y3QgU3RhYmxlaGxvUmVkdWNlT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworICB0eXBlZGVmIFN0YWJsZWhsb1JlZHVjZU9wdGlvbnMgVGFibGVUeXBlOworICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBkaW1lbnNpb25ze307CisgIGludDMyX3QgYm9keV9zdWJncmFwaF9pbmRleCA9IDA7Cit9OworCitzdHJ1Y3QgU3RhYmxlaGxvUmVkdWNlT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgeworICB0eXBlZGVmIFN0YWJsZWhsb1JlZHVjZU9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKKyAgdHlwZWRlZiBTdGFibGVobG9SZWR1Y2VPcHRpb25zQnVpbGRlciBCdWlsZGVyOworICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgeworICAgIFZUX0RJTUVOU0lPTlMgPSA0LAorICAgIFZUX0JPRFlfU1VCR1JBUEhfSU5ERVggPSA2CisgIH07CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiAqZGltZW5zaW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4gKj4oVlRfRElNRU5TSU9OUyk7CisgIH0KKyAgaW50MzJfdCBib2R5X3N1YmdyYXBoX2luZGV4KCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDxpbnQzMl90PihWVF9CT0RZX1NVQkdSQVBIX0lOREVYLCAwKTsKKyAgfQorICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9ESU1FTlNJT05TKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IoZGltZW5zaW9ucygpKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQzMl90Pih2ZXJpZmllciwgVlRfQk9EWV9TVUJHUkFQSF9JTkRFWCwgNCkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKKyAgfQorICBTdGFibGVobG9SZWR1Y2VPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFN0YWJsZWhsb1JlZHVjZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvUmVkdWNlT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlaGxvUmVkdWNlT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKK307CisKK3N0cnVjdCBTdGFibGVobG9SZWR1Y2VPcHRpb25zQnVpbGRlciB7CisgIHR5cGVkZWYgU3RhYmxlaGxvUmVkdWNlT3B0aW9ucyBUYWJsZTsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIHZvaWQgYWRkX2RpbWVuc2lvbnMoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90Pj4gZGltZW5zaW9ucykgeworICAgIGZiYl8uQWRkT2Zmc2V0KFN0YWJsZWhsb1JlZHVjZU9wdGlvbnM6OlZUX0RJTUVOU0lPTlMsIGRpbWVuc2lvbnMpOworICB9CisgIHZvaWQgYWRkX2JvZHlfc3ViZ3JhcGhfaW5kZXgoaW50MzJfdCBib2R5X3N1YmdyYXBoX2luZGV4KSB7CisgICAgZmJiXy5BZGRFbGVtZW50PGludDMyX3Q+KFN0YWJsZWhsb1JlZHVjZU9wdGlvbnM6OlZUX0JPRFlfU1VCR1JBUEhfSU5ERVgsIGJvZHlfc3ViZ3JhcGhfaW5kZXgsIDApOworICB9CisgIGV4cGxpY2l0IFN0YWJsZWhsb1JlZHVjZU9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICAgICAgICA6IGZiYl8oX2ZiYikgeworICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOworICB9CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9SZWR1Y2VPcHRpb25zPiBGaW5pc2goKSB7CisgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb1JlZHVjZU9wdGlvbnM+KGVuZCk7CisgICAgcmV0dXJuIG87CisgIH0KK307CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvUmVkdWNlT3B0aW9ucz4gQ3JlYXRlU3RhYmxlaGxvUmVkdWNlT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+PiBkaW1lbnNpb25zID0gMCwKKyAgICBpbnQzMl90IGJvZHlfc3ViZ3JhcGhfaW5kZXggPSAwKSB7CisgIFN0YWJsZWhsb1JlZHVjZU9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOworICBidWlsZGVyXy5hZGRfYm9keV9zdWJncmFwaF9pbmRleChib2R5X3N1YmdyYXBoX2luZGV4KTsKKyAgYnVpbGRlcl8uYWRkX2RpbWVuc2lvbnMoZGltZW5zaW9ucyk7CisgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKK30KKworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9SZWR1Y2VPcHRpb25zPiBDcmVhdGVTdGFibGVobG9SZWR1Y2VPcHRpb25zRGlyZWN0KAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICpkaW1lbnNpb25zID0gbnVsbHB0ciwKKyAgICBpbnQzMl90IGJvZHlfc3ViZ3JhcGhfaW5kZXggPSAwKSB7CisgIGF1dG8gZGltZW5zaW9uc19fID0gZGltZW5zaW9ucyA/IF9mYmIuQ3JlYXRlVmVjdG9yPGludDY0X3Q+KCpkaW1lbnNpb25zKSA6IDA7CisgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZVN0YWJsZWhsb1JlZHVjZU9wdGlvbnMoCisgICAgICBfZmJiLAorICAgICAgZGltZW5zaW9uc19fLAorICAgICAgYm9keV9zdWJncmFwaF9pbmRleCk7Cit9CisKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9SZWR1Y2VPcHRpb25zPiBDcmVhdGVTdGFibGVobG9SZWR1Y2VPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTdGFibGVobG9SZWR1Y2VPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworCitzdHJ1Y3QgU3RhYmxlaGxvU2xpY2VPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CisgIHR5cGVkZWYgU3RhYmxlaGxvU2xpY2VPcHRpb25zIFRhYmxlVHlwZTsKKyAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gc3RhcnRfaW5kaWNlc3t9OworICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBsaW1pdF9pbmRpY2Vze307CisgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IHN0cmlkZXN7fTsKK307CisKK3N0cnVjdCBTdGFibGVobG9TbGljZU9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKKyAgdHlwZWRlZiBTdGFibGVobG9TbGljZU9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKKyAgdHlwZWRlZiBTdGFibGVobG9TbGljZU9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CisgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CisgICAgVlRfU1RBUlRfSU5ESUNFUyA9IDQsCisgICAgVlRfTElNSVRfSU5ESUNFUyA9IDYsCisgICAgVlRfU1RSSURFUyA9IDgKKyAgfTsKKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+ICpzdGFydF9pbmRpY2VzKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiAqPihWVF9TVEFSVF9JTkRJQ0VTKTsKKyAgfQorICBjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4gKmxpbWl0X2luZGljZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+ICo+KFZUX0xJTUlUX0lORElDRVMpOworICB9CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiAqc3RyaWRlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4gKj4oVlRfU1RSSURFUyk7CisgIH0KKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfU1RBUlRfSU5ESUNFUykgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHN0YXJ0X2luZGljZXMoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9MSU1JVF9JTkRJQ0VTKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IobGltaXRfaW5kaWNlcygpKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1NUUklERVMpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3RvcihzdHJpZGVzKCkpICYmCisgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CisgIH0KKyAgU3RhYmxlaGxvU2xpY2VPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFN0YWJsZWhsb1NsaWNlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9TbGljZU9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN0YWJsZWhsb1NsaWNlT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKK307CisKK3N0cnVjdCBTdGFibGVobG9TbGljZU9wdGlvbnNCdWlsZGVyIHsKKyAgdHlwZWRlZiBTdGFibGVobG9TbGljZU9wdGlvbnMgVGFibGU7CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICB2b2lkIGFkZF9zdGFydF9pbmRpY2VzKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4+IHN0YXJ0X2luZGljZXMpIHsKKyAgICBmYmJfLkFkZE9mZnNldChTdGFibGVobG9TbGljZU9wdGlvbnM6OlZUX1NUQVJUX0lORElDRVMsIHN0YXJ0X2luZGljZXMpOworICB9CisgIHZvaWQgYWRkX2xpbWl0X2luZGljZXMoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90Pj4gbGltaXRfaW5kaWNlcykgeworICAgIGZiYl8uQWRkT2Zmc2V0KFN0YWJsZWhsb1NsaWNlT3B0aW9uczo6VlRfTElNSVRfSU5ESUNFUywgbGltaXRfaW5kaWNlcyk7CisgIH0KKyAgdm9pZCBhZGRfc3RyaWRlcyg6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+PiBzdHJpZGVzKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoU3RhYmxlaGxvU2xpY2VPcHRpb25zOjpWVF9TVFJJREVTLCBzdHJpZGVzKTsKKyAgfQorICBleHBsaWNpdCBTdGFibGVobG9TbGljZU9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICAgICAgICA6IGZiYl8oX2ZiYikgeworICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOworICB9CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9TbGljZU9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvU2xpY2VPcHRpb25zPihlbmQpOworICAgIHJldHVybiBvOworICB9Cit9OworCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb1NsaWNlT3B0aW9ucz4gQ3JlYXRlU3RhYmxlaGxvU2xpY2VPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4+IHN0YXJ0X2luZGljZXMgPSAwLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4+IGxpbWl0X2luZGljZXMgPSAwLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4+IHN0cmlkZXMgPSAwKSB7CisgIFN0YWJsZWhsb1NsaWNlT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CisgIGJ1aWxkZXJfLmFkZF9zdHJpZGVzKHN0cmlkZXMpOworICBidWlsZGVyXy5hZGRfbGltaXRfaW5kaWNlcyhsaW1pdF9pbmRpY2VzKTsKKyAgYnVpbGRlcl8uYWRkX3N0YXJ0X2luZGljZXMoc3RhcnRfaW5kaWNlcyk7CisgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKK30KKworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9TbGljZU9wdGlvbnM+IENyZWF0ZVN0YWJsZWhsb1NsaWNlT3B0aW9uc0RpcmVjdCgKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAqc3RhcnRfaW5kaWNlcyA9IG51bGxwdHIsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gKmxpbWl0X2luZGljZXMgPSBudWxscHRyLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICpzdHJpZGVzID0gbnVsbHB0cikgeworICBhdXRvIHN0YXJ0X2luZGljZXNfXyA9IHN0YXJ0X2luZGljZXMgPyBfZmJiLkNyZWF0ZVZlY3RvcjxpbnQ2NF90Pigqc3RhcnRfaW5kaWNlcykgOiAwOworICBhdXRvIGxpbWl0X2luZGljZXNfXyA9IGxpbWl0X2luZGljZXMgPyBfZmJiLkNyZWF0ZVZlY3RvcjxpbnQ2NF90PigqbGltaXRfaW5kaWNlcykgOiAwOworICBhdXRvIHN0cmlkZXNfXyA9IHN0cmlkZXMgPyBfZmJiLkNyZWF0ZVZlY3RvcjxpbnQ2NF90Pigqc3RyaWRlcykgOiAwOworICByZXR1cm4gdGZsaXRlOjpDcmVhdGVTdGFibGVobG9TbGljZU9wdGlvbnMoCisgICAgICBfZmJiLAorICAgICAgc3RhcnRfaW5kaWNlc19fLAorICAgICAgbGltaXRfaW5kaWNlc19fLAorICAgICAgc3RyaWRlc19fKTsKK30KKworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb1NsaWNlT3B0aW9ucz4gQ3JlYXRlU3RhYmxlaGxvU2xpY2VPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTdGFibGVobG9TbGljZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisKK3N0cnVjdCBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKKyAgdHlwZWRlZiBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMgVGFibGVUeXBlOworICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiB3aW5kb3dfc3RyaWRlc3t9OworICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBwYWRkaW5ne307CisgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IGxoc19kaWxhdGlvbnt9OworICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiByaHNfZGlsYXRpb257fTsKKyAgc3RkOjp2ZWN0b3I8Ym9vbD4gd2luZG93X3JldmVyc2Fse307CisgIGludDY0X3QgaW5wdXRfYmF0Y2hfZGltZW5zaW9uID0gMDsKKyAgaW50NjRfdCBpbnB1dF9mZWF0dXJlX2RpbWVuc2lvbiA9IDA7CisgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IGlucHV0X3NwYXRpYWxfZGltZW5zaW9uc3t9OworICBpbnQ2NF90IGtlcm5lbF9pbnB1dF9mZWF0dXJlX2RpbWVuc2lvbiA9IDA7CisgIGludDY0X3Qga2VybmVsX291dHB1dF9mZWF0dXJlX2RpbWVuc2lvbiA9IDA7CisgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IGtlcm5lbF9zcGF0aWFsX2RpbWVuc2lvbnN7fTsKKyAgaW50NjRfdCBvdXRwdXRfYmF0Y2hfZGltZW5zaW9uID0gMDsKKyAgaW50NjRfdCBvdXRwdXRfZmVhdHVyZV9kaW1lbnNpb24gPSAwOworICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBvdXRwdXRfc3BhdGlhbF9kaW1lbnNpb25ze307CisgIGludDY0X3QgZmVhdHVyZV9ncm91cF9jb3VudCA9IDA7CisgIGludDY0X3QgYmF0Y2hfZ3JvdXBfY291bnQgPSAwOworICBzdGQ6OnZlY3Rvcjx0ZmxpdGU6OlN0YWJsZWhsb1ByZWNpc2lvbkNvbmZpZz4gcHJlY2lzaW9uX2NvbmZpZ3t9OworfTsKKworc3RydWN0IFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgeworICB0eXBlZGVmIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOworICB0eXBlZGVmIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKKyAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKKyAgICBWVF9XSU5ET1dfU1RSSURFUyA9IDQsCisgICAgVlRfUEFERElORyA9IDYsCisgICAgVlRfTEhTX0RJTEFUSU9OID0gOCwKKyAgICBWVF9SSFNfRElMQVRJT04gPSAxMCwKKyAgICBWVF9XSU5ET1dfUkVWRVJTQUwgPSAxMiwKKyAgICBWVF9JTlBVVF9CQVRDSF9ESU1FTlNJT04gPSAxNCwKKyAgICBWVF9JTlBVVF9GRUFUVVJFX0RJTUVOU0lPTiA9IDE2LAorICAgIFZUX0lOUFVUX1NQQVRJQUxfRElNRU5TSU9OUyA9IDE4LAorICAgIFZUX0tFUk5FTF9JTlBVVF9GRUFUVVJFX0RJTUVOU0lPTiA9IDIwLAorICAgIFZUX0tFUk5FTF9PVVRQVVRfRkVBVFVSRV9ESU1FTlNJT04gPSAyMiwKKyAgICBWVF9LRVJORUxfU1BBVElBTF9ESU1FTlNJT05TID0gMjQsCisgICAgVlRfT1VUUFVUX0JBVENIX0RJTUVOU0lPTiA9IDI2LAorICAgIFZUX09VVFBVVF9GRUFUVVJFX0RJTUVOU0lPTiA9IDI4LAorICAgIFZUX09VVFBVVF9TUEFUSUFMX0RJTUVOU0lPTlMgPSAzMCwKKyAgICBWVF9GRUFUVVJFX0dST1VQX0NPVU5UID0gMzIsCisgICAgVlRfQkFUQ0hfR1JPVVBfQ09VTlQgPSAzNCwKKyAgICBWVF9QUkVDSVNJT05fQ09ORklHID0gMzYKKyAgfTsKKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+ICp3aW5kb3dfc3RyaWRlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4gKj4oVlRfV0lORE9XX1NUUklERVMpOworICB9CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiAqcGFkZGluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4gKj4oVlRfUEFERElORyk7CisgIH0KKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+ICpsaHNfZGlsYXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+ICo+KFZUX0xIU19ESUxBVElPTik7CisgIH0KKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+ICpyaHNfZGlsYXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+ICo+KFZUX1JIU19ESUxBVElPTik7CisgIH0KKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICp3aW5kb3dfcmV2ZXJzYWwoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICo+KFZUX1dJTkRPV19SRVZFUlNBTCk7CisgIH0KKyAgaW50NjRfdCBpbnB1dF9iYXRjaF9kaW1lbnNpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPGludDY0X3Q+KFZUX0lOUFVUX0JBVENIX0RJTUVOU0lPTiwgMCk7CisgIH0KKyAgaW50NjRfdCBpbnB1dF9mZWF0dXJlX2RpbWVuc2lvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8aW50NjRfdD4oVlRfSU5QVVRfRkVBVFVSRV9ESU1FTlNJT04sIDApOworICB9CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiAqaW5wdXRfc3BhdGlhbF9kaW1lbnNpb25zKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiAqPihWVF9JTlBVVF9TUEFUSUFMX0RJTUVOU0lPTlMpOworICB9CisgIGludDY0X3Qga2VybmVsX2lucHV0X2ZlYXR1cmVfZGltZW5zaW9uKCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDxpbnQ2NF90PihWVF9LRVJORUxfSU5QVVRfRkVBVFVSRV9ESU1FTlNJT04sIDApOworICB9CisgIGludDY0X3Qga2VybmVsX291dHB1dF9mZWF0dXJlX2RpbWVuc2lvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8aW50NjRfdD4oVlRfS0VSTkVMX09VVFBVVF9GRUFUVVJFX0RJTUVOU0lPTiwgMCk7CisgIH0KKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+ICprZXJuZWxfc3BhdGlhbF9kaW1lbnNpb25zKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiAqPihWVF9LRVJORUxfU1BBVElBTF9ESU1FTlNJT05TKTsKKyAgfQorICBpbnQ2NF90IG91dHB1dF9iYXRjaF9kaW1lbnNpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPGludDY0X3Q+KFZUX09VVFBVVF9CQVRDSF9ESU1FTlNJT04sIDApOworICB9CisgIGludDY0X3Qgb3V0cHV0X2ZlYXR1cmVfZGltZW5zaW9uKCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDxpbnQ2NF90PihWVF9PVVRQVVRfRkVBVFVSRV9ESU1FTlNJT04sIDApOworICB9CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiAqb3V0cHV0X3NwYXRpYWxfZGltZW5zaW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4gKj4oVlRfT1VUUFVUX1NQQVRJQUxfRElNRU5TSU9OUyk7CisgIH0KKyAgaW50NjRfdCBmZWF0dXJlX2dyb3VwX2NvdW50KCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDxpbnQ2NF90PihWVF9GRUFUVVJFX0dST1VQX0NPVU5ULCAwKTsKKyAgfQorICBpbnQ2NF90IGJhdGNoX2dyb3VwX2NvdW50KCkgY29uc3QgeworICAgIHJldHVybiBHZXRGaWVsZDxpbnQ2NF90PihWVF9CQVRDSF9HUk9VUF9DT1VOVCwgMCk7CisgIH0KKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQzMl90PiAqcHJlY2lzaW9uX2NvbmZpZygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8dWludDMyX3Q+ICo+KFZUX1BSRUNJU0lPTl9DT05GSUcpOworICB9CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1dJTkRPV19TVFJJREVTKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3Iod2luZG93X3N0cmlkZXMoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9QQURESU5HKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IocGFkZGluZygpKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX0xIU19ESUxBVElPTikgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKGxoc19kaWxhdGlvbigpKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1JIU19ESUxBVElPTikgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHJoc19kaWxhdGlvbigpKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1dJTkRPV19SRVZFUlNBTCkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHdpbmRvd19yZXZlcnNhbCgpKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQ2NF90Pih2ZXJpZmllciwgVlRfSU5QVVRfQkFUQ0hfRElNRU5TSU9OLCA4KSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQ2NF90Pih2ZXJpZmllciwgVlRfSU5QVVRfRkVBVFVSRV9ESU1FTlNJT04sIDgpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfSU5QVVRfU1BBVElBTF9ESU1FTlNJT05TKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IoaW5wdXRfc3BhdGlhbF9kaW1lbnNpb25zKCkpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDY0X3Q+KHZlcmlmaWVyLCBWVF9LRVJORUxfSU5QVVRfRkVBVFVSRV9ESU1FTlNJT04sIDgpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDY0X3Q+KHZlcmlmaWVyLCBWVF9LRVJORUxfT1VUUFVUX0ZFQVRVUkVfRElNRU5TSU9OLCA4KSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX0tFUk5FTF9TUEFUSUFMX0RJTUVOU0lPTlMpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3RvcihrZXJuZWxfc3BhdGlhbF9kaW1lbnNpb25zKCkpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDY0X3Q+KHZlcmlmaWVyLCBWVF9PVVRQVVRfQkFUQ0hfRElNRU5TSU9OLCA4KSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQ2NF90Pih2ZXJpZmllciwgVlRfT1VUUFVUX0ZFQVRVUkVfRElNRU5TSU9OLCA4KSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX09VVFBVVF9TUEFUSUFMX0RJTUVOU0lPTlMpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3RvcihvdXRwdXRfc3BhdGlhbF9kaW1lbnNpb25zKCkpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDY0X3Q+KHZlcmlmaWVyLCBWVF9GRUFUVVJFX0dST1VQX0NPVU5ULCA4KSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQ2NF90Pih2ZXJpZmllciwgVlRfQkFUQ0hfR1JPVVBfQ09VTlQsIDgpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfUFJFQ0lTSU9OX0NPTkZJRykgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKHByZWNpc2lvbl9jb25maWcoKSkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKKyAgfQorICBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworfTsKKworc3RydWN0IFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc0J1aWxkZXIgeworICB0eXBlZGVmIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucyBUYWJsZTsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIHZvaWQgYWRkX3dpbmRvd19zdHJpZGVzKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4+IHdpbmRvd19zdHJpZGVzKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zOjpWVF9XSU5ET1dfU1RSSURFUywgd2luZG93X3N0cmlkZXMpOworICB9CisgIHZvaWQgYWRkX3BhZGRpbmcoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90Pj4gcGFkZGluZykgeworICAgIGZiYl8uQWRkT2Zmc2V0KFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uczo6VlRfUEFERElORywgcGFkZGluZyk7CisgIH0KKyAgdm9pZCBhZGRfbGhzX2RpbGF0aW9uKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4+IGxoc19kaWxhdGlvbikgeworICAgIGZiYl8uQWRkT2Zmc2V0KFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uczo6VlRfTEhTX0RJTEFUSU9OLCBsaHNfZGlsYXRpb24pOworICB9CisgIHZvaWQgYWRkX3Joc19kaWxhdGlvbig6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+PiByaHNfZGlsYXRpb24pIHsKKyAgICBmYmJfLkFkZE9mZnNldChTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnM6OlZUX1JIU19ESUxBVElPTiwgcmhzX2RpbGF0aW9uKTsKKyAgfQorICB2b2lkIGFkZF93aW5kb3dfcmV2ZXJzYWwoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90Pj4gd2luZG93X3JldmVyc2FsKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zOjpWVF9XSU5ET1dfUkVWRVJTQUwsIHdpbmRvd19yZXZlcnNhbCk7CisgIH0KKyAgdm9pZCBhZGRfaW5wdXRfYmF0Y2hfZGltZW5zaW9uKGludDY0X3QgaW5wdXRfYmF0Y2hfZGltZW5zaW9uKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PGludDY0X3Q+KFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uczo6VlRfSU5QVVRfQkFUQ0hfRElNRU5TSU9OLCBpbnB1dF9iYXRjaF9kaW1lbnNpb24sIDApOworICB9CisgIHZvaWQgYWRkX2lucHV0X2ZlYXR1cmVfZGltZW5zaW9uKGludDY0X3QgaW5wdXRfZmVhdHVyZV9kaW1lbnNpb24pIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8aW50NjRfdD4oU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zOjpWVF9JTlBVVF9GRUFUVVJFX0RJTUVOU0lPTiwgaW5wdXRfZmVhdHVyZV9kaW1lbnNpb24sIDApOworICB9CisgIHZvaWQgYWRkX2lucHV0X3NwYXRpYWxfZGltZW5zaW9ucyg6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+PiBpbnB1dF9zcGF0aWFsX2RpbWVuc2lvbnMpIHsKKyAgICBmYmJfLkFkZE9mZnNldChTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnM6OlZUX0lOUFVUX1NQQVRJQUxfRElNRU5TSU9OUywgaW5wdXRfc3BhdGlhbF9kaW1lbnNpb25zKTsKKyAgfQorICB2b2lkIGFkZF9rZXJuZWxfaW5wdXRfZmVhdHVyZV9kaW1lbnNpb24oaW50NjRfdCBrZXJuZWxfaW5wdXRfZmVhdHVyZV9kaW1lbnNpb24pIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8aW50NjRfdD4oU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zOjpWVF9LRVJORUxfSU5QVVRfRkVBVFVSRV9ESU1FTlNJT04sIGtlcm5lbF9pbnB1dF9mZWF0dXJlX2RpbWVuc2lvbiwgMCk7CisgIH0KKyAgdm9pZCBhZGRfa2VybmVsX291dHB1dF9mZWF0dXJlX2RpbWVuc2lvbihpbnQ2NF90IGtlcm5lbF9vdXRwdXRfZmVhdHVyZV9kaW1lbnNpb24pIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8aW50NjRfdD4oU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zOjpWVF9LRVJORUxfT1VUUFVUX0ZFQVRVUkVfRElNRU5TSU9OLCBrZXJuZWxfb3V0cHV0X2ZlYXR1cmVfZGltZW5zaW9uLCAwKTsKKyAgfQorICB2b2lkIGFkZF9rZXJuZWxfc3BhdGlhbF9kaW1lbnNpb25zKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4+IGtlcm5lbF9zcGF0aWFsX2RpbWVuc2lvbnMpIHsKKyAgICBmYmJfLkFkZE9mZnNldChTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnM6OlZUX0tFUk5FTF9TUEFUSUFMX0RJTUVOU0lPTlMsIGtlcm5lbF9zcGF0aWFsX2RpbWVuc2lvbnMpOworICB9CisgIHZvaWQgYWRkX291dHB1dF9iYXRjaF9kaW1lbnNpb24oaW50NjRfdCBvdXRwdXRfYmF0Y2hfZGltZW5zaW9uKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PGludDY0X3Q+KFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uczo6VlRfT1VUUFVUX0JBVENIX0RJTUVOU0lPTiwgb3V0cHV0X2JhdGNoX2RpbWVuc2lvbiwgMCk7CisgIH0KKyAgdm9pZCBhZGRfb3V0cHV0X2ZlYXR1cmVfZGltZW5zaW9uKGludDY0X3Qgb3V0cHV0X2ZlYXR1cmVfZGltZW5zaW9uKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PGludDY0X3Q+KFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uczo6VlRfT1VUUFVUX0ZFQVRVUkVfRElNRU5TSU9OLCBvdXRwdXRfZmVhdHVyZV9kaW1lbnNpb24sIDApOworICB9CisgIHZvaWQgYWRkX291dHB1dF9zcGF0aWFsX2RpbWVuc2lvbnMoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90Pj4gb3V0cHV0X3NwYXRpYWxfZGltZW5zaW9ucykgeworICAgIGZiYl8uQWRkT2Zmc2V0KFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uczo6VlRfT1VUUFVUX1NQQVRJQUxfRElNRU5TSU9OUywgb3V0cHV0X3NwYXRpYWxfZGltZW5zaW9ucyk7CisgIH0KKyAgdm9pZCBhZGRfZmVhdHVyZV9ncm91cF9jb3VudChpbnQ2NF90IGZlYXR1cmVfZ3JvdXBfY291bnQpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8aW50NjRfdD4oU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zOjpWVF9GRUFUVVJFX0dST1VQX0NPVU5ULCBmZWF0dXJlX2dyb3VwX2NvdW50LCAwKTsKKyAgfQorICB2b2lkIGFkZF9iYXRjaF9ncm91cF9jb3VudChpbnQ2NF90IGJhdGNoX2dyb3VwX2NvdW50KSB7CisgICAgZmJiXy5BZGRFbGVtZW50PGludDY0X3Q+KFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uczo6VlRfQkFUQ0hfR1JPVVBfQ09VTlQsIGJhdGNoX2dyb3VwX2NvdW50LCAwKTsKKyAgfQorICB2b2lkIGFkZF9wcmVjaXNpb25fY29uZmlnKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8dWludDMyX3Q+PiBwcmVjaXNpb25fY29uZmlnKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zOjpWVF9QUkVDSVNJT05fQ09ORklHLCBwcmVjaXNpb25fY29uZmlnKTsKKyAgfQorICBleHBsaWNpdCBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICAgICAgICA6IGZiYl8oX2ZiYikgeworICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOworICB9CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zPihlbmQpOworICAgIHJldHVybiBvOworICB9Cit9OworCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucz4gQ3JlYXRlU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4+IHdpbmRvd19zdHJpZGVzID0gMCwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+PiBwYWRkaW5nID0gMCwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+PiBsaHNfZGlsYXRpb24gPSAwLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4+IHJoc19kaWxhdGlvbiA9IDAsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90Pj4gd2luZG93X3JldmVyc2FsID0gMCwKKyAgICBpbnQ2NF90IGlucHV0X2JhdGNoX2RpbWVuc2lvbiA9IDAsCisgICAgaW50NjRfdCBpbnB1dF9mZWF0dXJlX2RpbWVuc2lvbiA9IDAsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90Pj4gaW5wdXRfc3BhdGlhbF9kaW1lbnNpb25zID0gMCwKKyAgICBpbnQ2NF90IGtlcm5lbF9pbnB1dF9mZWF0dXJlX2RpbWVuc2lvbiA9IDAsCisgICAgaW50NjRfdCBrZXJuZWxfb3V0cHV0X2ZlYXR1cmVfZGltZW5zaW9uID0gMCwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+PiBrZXJuZWxfc3BhdGlhbF9kaW1lbnNpb25zID0gMCwKKyAgICBpbnQ2NF90IG91dHB1dF9iYXRjaF9kaW1lbnNpb24gPSAwLAorICAgIGludDY0X3Qgb3V0cHV0X2ZlYXR1cmVfZGltZW5zaW9uID0gMCwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+PiBvdXRwdXRfc3BhdGlhbF9kaW1lbnNpb25zID0gMCwKKyAgICBpbnQ2NF90IGZlYXR1cmVfZ3JvdXBfY291bnQgPSAwLAorICAgIGludDY0X3QgYmF0Y2hfZ3JvdXBfY291bnQgPSAwLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8dWludDMyX3Q+PiBwcmVjaXNpb25fY29uZmlnID0gMCkgeworICBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOworICBidWlsZGVyXy5hZGRfYmF0Y2hfZ3JvdXBfY291bnQoYmF0Y2hfZ3JvdXBfY291bnQpOworICBidWlsZGVyXy5hZGRfZmVhdHVyZV9ncm91cF9jb3VudChmZWF0dXJlX2dyb3VwX2NvdW50KTsKKyAgYnVpbGRlcl8uYWRkX291dHB1dF9mZWF0dXJlX2RpbWVuc2lvbihvdXRwdXRfZmVhdHVyZV9kaW1lbnNpb24pOworICBidWlsZGVyXy5hZGRfb3V0cHV0X2JhdGNoX2RpbWVuc2lvbihvdXRwdXRfYmF0Y2hfZGltZW5zaW9uKTsKKyAgYnVpbGRlcl8uYWRkX2tlcm5lbF9vdXRwdXRfZmVhdHVyZV9kaW1lbnNpb24oa2VybmVsX291dHB1dF9mZWF0dXJlX2RpbWVuc2lvbik7CisgIGJ1aWxkZXJfLmFkZF9rZXJuZWxfaW5wdXRfZmVhdHVyZV9kaW1lbnNpb24oa2VybmVsX2lucHV0X2ZlYXR1cmVfZGltZW5zaW9uKTsKKyAgYnVpbGRlcl8uYWRkX2lucHV0X2ZlYXR1cmVfZGltZW5zaW9uKGlucHV0X2ZlYXR1cmVfZGltZW5zaW9uKTsKKyAgYnVpbGRlcl8uYWRkX2lucHV0X2JhdGNoX2RpbWVuc2lvbihpbnB1dF9iYXRjaF9kaW1lbnNpb24pOworICBidWlsZGVyXy5hZGRfcHJlY2lzaW9uX2NvbmZpZyhwcmVjaXNpb25fY29uZmlnKTsKKyAgYnVpbGRlcl8uYWRkX291dHB1dF9zcGF0aWFsX2RpbWVuc2lvbnMob3V0cHV0X3NwYXRpYWxfZGltZW5zaW9ucyk7CisgIGJ1aWxkZXJfLmFkZF9rZXJuZWxfc3BhdGlhbF9kaW1lbnNpb25zKGtlcm5lbF9zcGF0aWFsX2RpbWVuc2lvbnMpOworICBidWlsZGVyXy5hZGRfaW5wdXRfc3BhdGlhbF9kaW1lbnNpb25zKGlucHV0X3NwYXRpYWxfZGltZW5zaW9ucyk7CisgIGJ1aWxkZXJfLmFkZF93aW5kb3dfcmV2ZXJzYWwod2luZG93X3JldmVyc2FsKTsKKyAgYnVpbGRlcl8uYWRkX3Joc19kaWxhdGlvbihyaHNfZGlsYXRpb24pOworICBidWlsZGVyXy5hZGRfbGhzX2RpbGF0aW9uKGxoc19kaWxhdGlvbik7CisgIGJ1aWxkZXJfLmFkZF9wYWRkaW5nKHBhZGRpbmcpOworICBidWlsZGVyXy5hZGRfd2luZG93X3N0cmlkZXMod2luZG93X3N0cmlkZXMpOworICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7Cit9CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zPiBDcmVhdGVTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNEaXJlY3QoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gKndpbmRvd19zdHJpZGVzID0gbnVsbHB0ciwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAqcGFkZGluZyA9IG51bGxwdHIsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gKmxoc19kaWxhdGlvbiA9IG51bGxwdHIsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gKnJoc19kaWxhdGlvbiA9IG51bGxwdHIsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gKndpbmRvd19yZXZlcnNhbCA9IG51bGxwdHIsCisgICAgaW50NjRfdCBpbnB1dF9iYXRjaF9kaW1lbnNpb24gPSAwLAorICAgIGludDY0X3QgaW5wdXRfZmVhdHVyZV9kaW1lbnNpb24gPSAwLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICppbnB1dF9zcGF0aWFsX2RpbWVuc2lvbnMgPSBudWxscHRyLAorICAgIGludDY0X3Qga2VybmVsX2lucHV0X2ZlYXR1cmVfZGltZW5zaW9uID0gMCwKKyAgICBpbnQ2NF90IGtlcm5lbF9vdXRwdXRfZmVhdHVyZV9kaW1lbnNpb24gPSAwLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+ICprZXJuZWxfc3BhdGlhbF9kaW1lbnNpb25zID0gbnVsbHB0ciwKKyAgICBpbnQ2NF90IG91dHB1dF9iYXRjaF9kaW1lbnNpb24gPSAwLAorICAgIGludDY0X3Qgb3V0cHV0X2ZlYXR1cmVfZGltZW5zaW9uID0gMCwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAqb3V0cHV0X3NwYXRpYWxfZGltZW5zaW9ucyA9IG51bGxwdHIsCisgICAgaW50NjRfdCBmZWF0dXJlX2dyb3VwX2NvdW50ID0gMCwKKyAgICBpbnQ2NF90IGJhdGNoX2dyb3VwX2NvdW50ID0gMCwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gKnByZWNpc2lvbl9jb25maWcgPSBudWxscHRyKSB7CisgIGF1dG8gd2luZG93X3N0cmlkZXNfXyA9IHdpbmRvd19zdHJpZGVzID8gX2ZiYi5DcmVhdGVWZWN0b3I8aW50NjRfdD4oKndpbmRvd19zdHJpZGVzKSA6IDA7CisgIGF1dG8gcGFkZGluZ19fID0gcGFkZGluZyA/IF9mYmIuQ3JlYXRlVmVjdG9yPGludDY0X3Q+KCpwYWRkaW5nKSA6IDA7CisgIGF1dG8gbGhzX2RpbGF0aW9uX18gPSBsaHNfZGlsYXRpb24gPyBfZmJiLkNyZWF0ZVZlY3RvcjxpbnQ2NF90PigqbGhzX2RpbGF0aW9uKSA6IDA7CisgIGF1dG8gcmhzX2RpbGF0aW9uX18gPSByaHNfZGlsYXRpb24gPyBfZmJiLkNyZWF0ZVZlY3RvcjxpbnQ2NF90PigqcmhzX2RpbGF0aW9uKSA6IDA7CisgIGF1dG8gd2luZG93X3JldmVyc2FsX18gPSB3aW5kb3dfcmV2ZXJzYWwgPyBfZmJiLkNyZWF0ZVZlY3Rvcjx1aW50OF90Pigqd2luZG93X3JldmVyc2FsKSA6IDA7CisgIGF1dG8gaW5wdXRfc3BhdGlhbF9kaW1lbnNpb25zX18gPSBpbnB1dF9zcGF0aWFsX2RpbWVuc2lvbnMgPyBfZmJiLkNyZWF0ZVZlY3RvcjxpbnQ2NF90PigqaW5wdXRfc3BhdGlhbF9kaW1lbnNpb25zKSA6IDA7CisgIGF1dG8ga2VybmVsX3NwYXRpYWxfZGltZW5zaW9uc19fID0ga2VybmVsX3NwYXRpYWxfZGltZW5zaW9ucyA/IF9mYmIuQ3JlYXRlVmVjdG9yPGludDY0X3Q+KCprZXJuZWxfc3BhdGlhbF9kaW1lbnNpb25zKSA6IDA7CisgIGF1dG8gb3V0cHV0X3NwYXRpYWxfZGltZW5zaW9uc19fID0gb3V0cHV0X3NwYXRpYWxfZGltZW5zaW9ucyA/IF9mYmIuQ3JlYXRlVmVjdG9yPGludDY0X3Q+KCpvdXRwdXRfc3BhdGlhbF9kaW1lbnNpb25zKSA6IDA7CisgIGF1dG8gcHJlY2lzaW9uX2NvbmZpZ19fID0gcHJlY2lzaW9uX2NvbmZpZyA/IF9mYmIuQ3JlYXRlVmVjdG9yPHVpbnQzMl90PigqcHJlY2lzaW9uX2NvbmZpZykgOiAwOworICByZXR1cm4gdGZsaXRlOjpDcmVhdGVTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMoCisgICAgICBfZmJiLAorICAgICAgd2luZG93X3N0cmlkZXNfXywKKyAgICAgIHBhZGRpbmdfXywKKyAgICAgIGxoc19kaWxhdGlvbl9fLAorICAgICAgcmhzX2RpbGF0aW9uX18sCisgICAgICB3aW5kb3dfcmV2ZXJzYWxfXywKKyAgICAgIGlucHV0X2JhdGNoX2RpbWVuc2lvbiwKKyAgICAgIGlucHV0X2ZlYXR1cmVfZGltZW5zaW9uLAorICAgICAgaW5wdXRfc3BhdGlhbF9kaW1lbnNpb25zX18sCisgICAgICBrZXJuZWxfaW5wdXRfZmVhdHVyZV9kaW1lbnNpb24sCisgICAgICBrZXJuZWxfb3V0cHV0X2ZlYXR1cmVfZGltZW5zaW9uLAorICAgICAga2VybmVsX3NwYXRpYWxfZGltZW5zaW9uc19fLAorICAgICAgb3V0cHV0X2JhdGNoX2RpbWVuc2lvbiwKKyAgICAgIG91dHB1dF9mZWF0dXJlX2RpbWVuc2lvbiwKKyAgICAgIG91dHB1dF9zcGF0aWFsX2RpbWVuc2lvbnNfXywKKyAgICAgIGZlYXR1cmVfZ3JvdXBfY291bnQsCisgICAgICBiYXRjaF9ncm91cF9jb3VudCwKKyAgICAgIHByZWNpc2lvbl9jb25maWdfXyk7Cit9CisKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnM+IENyZWF0ZVN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworCitzdHJ1Y3QgU3RhYmxlaGxvU2NhdHRlck9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKKyAgdHlwZWRlZiBTdGFibGVobG9TY2F0dGVyT3B0aW9ucyBUYWJsZVR5cGU7CisgIGJvb2wgaW5kaWNlc19hcmVfc29ydGVkID0gZmFsc2U7CisgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IHVwZGF0ZV93aW5kb3dfZGltc3t9OworICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBpbnNlcnRlZF93aW5kb3dfZGltc3t9OworICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBzY2F0dGVyX2RpbXNfdG9fb3BlcmFuZF9kaW1ze307CisgIGludDY0X3QgaW5kZXhfdmVjdG9yX2RpbSA9IDA7CisgIGJvb2wgdW5pcXVlX2luZGljZXMgPSBmYWxzZTsKKyAgaW50MzJfdCB1cGRhdGVfY29tcHV0YXRpb25fc3ViZ3JhcGhfaW5kZXggPSAwOworfTsKKworc3RydWN0IFN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CisgIHR5cGVkZWYgU3RhYmxlaGxvU2NhdHRlck9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKKyAgdHlwZWRlZiBTdGFibGVobG9TY2F0dGVyT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKKyAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKKyAgICBWVF9JTkRJQ0VTX0FSRV9TT1JURUQgPSA0LAorICAgIFZUX1VQREFURV9XSU5ET1dfRElNUyA9IDYsCisgICAgVlRfSU5TRVJURURfV0lORE9XX0RJTVMgPSA4LAorICAgIFZUX1NDQVRURVJfRElNU19UT19PUEVSQU5EX0RJTVMgPSAxMCwKKyAgICBWVF9JTkRFWF9WRUNUT1JfRElNID0gMTIsCisgICAgVlRfVU5JUVVFX0lORElDRVMgPSAxNCwKKyAgICBWVF9VUERBVEVfQ09NUFVUQVRJT05fU1VCR1JBUEhfSU5ERVggPSAxNgorICB9OworICBib29sIGluZGljZXNfYXJlX3NvcnRlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8dWludDhfdD4oVlRfSU5ESUNFU19BUkVfU09SVEVELCAwKSAhPSAwOworICB9CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiAqdXBkYXRlX3dpbmRvd19kaW1zKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiAqPihWVF9VUERBVEVfV0lORE9XX0RJTVMpOworICB9CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90PiAqaW5zZXJ0ZWRfd2luZG93X2RpbXMoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+ICo+KFZUX0lOU0VSVEVEX1dJTkRPV19ESU1TKTsKKyAgfQorICBjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4gKnNjYXR0ZXJfZGltc190b19vcGVyYW5kX2RpbXMoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+ICo+KFZUX1NDQVRURVJfRElNU19UT19PUEVSQU5EX0RJTVMpOworICB9CisgIGludDY0X3QgaW5kZXhfdmVjdG9yX2RpbSgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8aW50NjRfdD4oVlRfSU5ERVhfVkVDVE9SX0RJTSwgMCk7CisgIH0KKyAgYm9vbCB1bmlxdWVfaW5kaWNlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8dWludDhfdD4oVlRfVU5JUVVFX0lORElDRVMsIDApICE9IDA7CisgIH0KKyAgaW50MzJfdCB1cGRhdGVfY29tcHV0YXRpb25fc3ViZ3JhcGhfaW5kZXgoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPGludDMyX3Q+KFZUX1VQREFURV9DT01QVVRBVElPTl9TVUJHUkFQSF9JTkRFWCwgMCk7CisgIH0KKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9JTkRJQ0VTX0FSRV9TT1JURUQsIDEpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfVVBEQVRFX1dJTkRPV19ESU1TKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IodXBkYXRlX3dpbmRvd19kaW1zKCkpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfSU5TRVJURURfV0lORE9XX0RJTVMpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3RvcihpbnNlcnRlZF93aW5kb3dfZGltcygpKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1NDQVRURVJfRElNU19UT19PUEVSQU5EX0RJTVMpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3RvcihzY2F0dGVyX2RpbXNfdG9fb3BlcmFuZF9kaW1zKCkpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDY0X3Q+KHZlcmlmaWVyLCBWVF9JTkRFWF9WRUNUT1JfRElNLCA4KSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50OF90Pih2ZXJpZmllciwgVlRfVU5JUVVFX0lORElDRVMsIDEpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDMyX3Q+KHZlcmlmaWVyLCBWVF9VUERBVEVfQ09NUFVUQVRJT05fU1VCR1JBUEhfSU5ERVgsIDQpICYmCisgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CisgIH0KKyAgU3RhYmxlaGxvU2NhdHRlck9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oU3RhYmxlaGxvU2NhdHRlck9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvU2NhdHRlck9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworfTsKKworc3RydWN0IFN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zQnVpbGRlciB7CisgIHR5cGVkZWYgU3RhYmxlaGxvU2NhdHRlck9wdGlvbnMgVGFibGU7CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICB2b2lkIGFkZF9pbmRpY2VzX2FyZV9zb3J0ZWQoYm9vbCBpbmRpY2VzX2FyZV9zb3J0ZWQpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDhfdD4oU3RhYmxlaGxvU2NhdHRlck9wdGlvbnM6OlZUX0lORElDRVNfQVJFX1NPUlRFRCwgc3RhdGljX2Nhc3Q8dWludDhfdD4oaW5kaWNlc19hcmVfc29ydGVkKSwgMCk7CisgIH0KKyAgdm9pZCBhZGRfdXBkYXRlX3dpbmRvd19kaW1zKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4+IHVwZGF0ZV93aW5kb3dfZGltcykgeworICAgIGZiYl8uQWRkT2Zmc2V0KFN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zOjpWVF9VUERBVEVfV0lORE9XX0RJTVMsIHVwZGF0ZV93aW5kb3dfZGltcyk7CisgIH0KKyAgdm9pZCBhZGRfaW5zZXJ0ZWRfd2luZG93X2RpbXMoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90Pj4gaW5zZXJ0ZWRfd2luZG93X2RpbXMpIHsKKyAgICBmYmJfLkFkZE9mZnNldChTdGFibGVobG9TY2F0dGVyT3B0aW9uczo6VlRfSU5TRVJURURfV0lORE9XX0RJTVMsIGluc2VydGVkX3dpbmRvd19kaW1zKTsKKyAgfQorICB2b2lkIGFkZF9zY2F0dGVyX2RpbXNfdG9fb3BlcmFuZF9kaW1zKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50NjRfdD4+IHNjYXR0ZXJfZGltc190b19vcGVyYW5kX2RpbXMpIHsKKyAgICBmYmJfLkFkZE9mZnNldChTdGFibGVobG9TY2F0dGVyT3B0aW9uczo6VlRfU0NBVFRFUl9ESU1TX1RPX09QRVJBTkRfRElNUywgc2NhdHRlcl9kaW1zX3RvX29wZXJhbmRfZGltcyk7CisgIH0KKyAgdm9pZCBhZGRfaW5kZXhfdmVjdG9yX2RpbShpbnQ2NF90IGluZGV4X3ZlY3Rvcl9kaW0pIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8aW50NjRfdD4oU3RhYmxlaGxvU2NhdHRlck9wdGlvbnM6OlZUX0lOREVYX1ZFQ1RPUl9ESU0sIGluZGV4X3ZlY3Rvcl9kaW0sIDApOworICB9CisgIHZvaWQgYWRkX3VuaXF1ZV9pbmRpY2VzKGJvb2wgdW5pcXVlX2luZGljZXMpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDhfdD4oU3RhYmxlaGxvU2NhdHRlck9wdGlvbnM6OlZUX1VOSVFVRV9JTkRJQ0VTLCBzdGF0aWNfY2FzdDx1aW50OF90Pih1bmlxdWVfaW5kaWNlcyksIDApOworICB9CisgIHZvaWQgYWRkX3VwZGF0ZV9jb21wdXRhdGlvbl9zdWJncmFwaF9pbmRleChpbnQzMl90IHVwZGF0ZV9jb21wdXRhdGlvbl9zdWJncmFwaF9pbmRleCkgeworICAgIGZiYl8uQWRkRWxlbWVudDxpbnQzMl90PihTdGFibGVobG9TY2F0dGVyT3B0aW9uczo6VlRfVVBEQVRFX0NPTVBVVEFUSU9OX1NVQkdSQVBIX0lOREVYLCB1cGRhdGVfY29tcHV0YXRpb25fc3ViZ3JhcGhfaW5kZXgsIDApOworICB9CisgIGV4cGxpY2l0IFN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgICAgICAgOiBmYmJfKF9mYmIpIHsKKyAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKKyAgfQorICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvU2NhdHRlck9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvU2NhdHRlck9wdGlvbnM+KGVuZCk7CisgICAgcmV0dXJuIG87CisgIH0KK307CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvU2NhdHRlck9wdGlvbnM+IENyZWF0ZVN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAorICAgIGJvb2wgaW5kaWNlc19hcmVfc29ydGVkID0gZmFsc2UsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90Pj4gdXBkYXRlX3dpbmRvd19kaW1zID0gMCwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDY0X3Q+PiBpbnNlcnRlZF93aW5kb3dfZGltcyA9IDAsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQ2NF90Pj4gc2NhdHRlcl9kaW1zX3RvX29wZXJhbmRfZGltcyA9IDAsCisgICAgaW50NjRfdCBpbmRleF92ZWN0b3JfZGltID0gMCwKKyAgICBib29sIHVuaXF1ZV9pbmRpY2VzID0gZmFsc2UsCisgICAgaW50MzJfdCB1cGRhdGVfY29tcHV0YXRpb25fc3ViZ3JhcGhfaW5kZXggPSAwKSB7CisgIFN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKKyAgYnVpbGRlcl8uYWRkX2luZGV4X3ZlY3Rvcl9kaW0oaW5kZXhfdmVjdG9yX2RpbSk7CisgIGJ1aWxkZXJfLmFkZF91cGRhdGVfY29tcHV0YXRpb25fc3ViZ3JhcGhfaW5kZXgodXBkYXRlX2NvbXB1dGF0aW9uX3N1YmdyYXBoX2luZGV4KTsKKyAgYnVpbGRlcl8uYWRkX3NjYXR0ZXJfZGltc190b19vcGVyYW5kX2RpbXMoc2NhdHRlcl9kaW1zX3RvX29wZXJhbmRfZGltcyk7CisgIGJ1aWxkZXJfLmFkZF9pbnNlcnRlZF93aW5kb3dfZGltcyhpbnNlcnRlZF93aW5kb3dfZGltcyk7CisgIGJ1aWxkZXJfLmFkZF91cGRhdGVfd2luZG93X2RpbXModXBkYXRlX3dpbmRvd19kaW1zKTsKKyAgYnVpbGRlcl8uYWRkX3VuaXF1ZV9pbmRpY2VzKHVuaXF1ZV9pbmRpY2VzKTsKKyAgYnVpbGRlcl8uYWRkX2luZGljZXNfYXJlX3NvcnRlZChpbmRpY2VzX2FyZV9zb3J0ZWQpOworICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7Cit9CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvU2NhdHRlck9wdGlvbnM+IENyZWF0ZVN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zRGlyZWN0KAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAorICAgIGJvb2wgaW5kaWNlc19hcmVfc29ydGVkID0gZmFsc2UsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gKnVwZGF0ZV93aW5kb3dfZGltcyA9IG51bGxwdHIsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4gKmluc2VydGVkX3dpbmRvd19kaW1zID0gbnVsbHB0ciwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAqc2NhdHRlcl9kaW1zX3RvX29wZXJhbmRfZGltcyA9IG51bGxwdHIsCisgICAgaW50NjRfdCBpbmRleF92ZWN0b3JfZGltID0gMCwKKyAgICBib29sIHVuaXF1ZV9pbmRpY2VzID0gZmFsc2UsCisgICAgaW50MzJfdCB1cGRhdGVfY29tcHV0YXRpb25fc3ViZ3JhcGhfaW5kZXggPSAwKSB7CisgIGF1dG8gdXBkYXRlX3dpbmRvd19kaW1zX18gPSB1cGRhdGVfd2luZG93X2RpbXMgPyBfZmJiLkNyZWF0ZVZlY3RvcjxpbnQ2NF90PigqdXBkYXRlX3dpbmRvd19kaW1zKSA6IDA7CisgIGF1dG8gaW5zZXJ0ZWRfd2luZG93X2RpbXNfXyA9IGluc2VydGVkX3dpbmRvd19kaW1zID8gX2ZiYi5DcmVhdGVWZWN0b3I8aW50NjRfdD4oKmluc2VydGVkX3dpbmRvd19kaW1zKSA6IDA7CisgIGF1dG8gc2NhdHRlcl9kaW1zX3RvX29wZXJhbmRfZGltc19fID0gc2NhdHRlcl9kaW1zX3RvX29wZXJhbmRfZGltcyA/IF9mYmIuQ3JlYXRlVmVjdG9yPGludDY0X3Q+KCpzY2F0dGVyX2RpbXNfdG9fb3BlcmFuZF9kaW1zKSA6IDA7CisgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZVN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zKAorICAgICAgX2ZiYiwKKyAgICAgIGluZGljZXNfYXJlX3NvcnRlZCwKKyAgICAgIHVwZGF0ZV93aW5kb3dfZGltc19fLAorICAgICAgaW5zZXJ0ZWRfd2luZG93X2RpbXNfXywKKyAgICAgIHNjYXR0ZXJfZGltc190b19vcGVyYW5kX2RpbXNfXywKKyAgICAgIGluZGV4X3ZlY3Rvcl9kaW0sCisgICAgICB1bmlxdWVfaW5kaWNlcywKKyAgICAgIHVwZGF0ZV9jb21wdXRhdGlvbl9zdWJncmFwaF9pbmRleCk7Cit9CisKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9TY2F0dGVyT3B0aW9ucz4gQ3JlYXRlU3RhYmxlaGxvU2NhdHRlck9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworCitzdHJ1Y3QgU3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworICB0eXBlZGVmIFN0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnMgVGFibGVUeXBlOworICB0ZmxpdGU6OlJuZ0FsZ29yaXRobSBhbGdvcml0aG0gPSB0ZmxpdGU6OlJuZ0FsZ29yaXRobV9ERUZBVUxUOworfTsKKworc3RydWN0IFN0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKKyAgdHlwZWRlZiBTdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CisgIHR5cGVkZWYgU3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKKyAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKKyAgICBWVF9BTEdPUklUSE0gPSA0CisgIH07CisgIHRmbGl0ZTo6Um5nQWxnb3JpdGhtIGFsZ29yaXRobSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dGZsaXRlOjpSbmdBbGdvcml0aG0+KEdldEZpZWxkPGludDhfdD4oVlRfQUxHT1JJVEhNLCAwKSk7CisgIH0KKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDhfdD4odmVyaWZpZXIsIFZUX0FMR09SSVRITSwgMSkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKKyAgfQorICBTdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFN0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKK307CisKK3N0cnVjdCBTdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zQnVpbGRlciB7CisgIHR5cGVkZWYgU3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9ucyBUYWJsZTsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIHZvaWQgYWRkX2FsZ29yaXRobSh0ZmxpdGU6OlJuZ0FsZ29yaXRobSBhbGdvcml0aG0pIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8aW50OF90PihTdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zOjpWVF9BTEdPUklUSE0sIHN0YXRpY19jYXN0PGludDhfdD4oYWxnb3JpdGhtKSwgMCk7CisgIH0KKyAgZXhwbGljaXQgU3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgICAgICAgIDogZmJiXyhfZmJiKSB7CisgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CisgIH0KKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9ucz4oZW5kKTsKKyAgICByZXR1cm4gbzsKKyAgfQorfTsKKworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zPiBDcmVhdGVTdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAorICAgIHRmbGl0ZTo6Um5nQWxnb3JpdGhtIGFsZ29yaXRobSA9IHRmbGl0ZTo6Um5nQWxnb3JpdGhtX0RFRkFVTFQpIHsKKyAgU3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CisgIGJ1aWxkZXJfLmFkZF9hbGdvcml0aG0oYWxnb3JpdGhtKTsKKyAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOworfQorCis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9ucz4gQ3JlYXRlU3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKworc3RydWN0IENvbnYyRE9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBDb252MkRPcHRpb25zIFRhYmxlVHlwZTsKICAgdGZsaXRlOjpQYWRkaW5nIHBhZGRpbmcgPSB0ZmxpdGU6OlBhZGRpbmdfU0FNRTsKICAgaW50MzJfdCBzdHJpZGVfdyA9IDA7CkBAIC01MDgxLDkgKzc3MTgsMTAgQEAKICAgdGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlIGZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24gPSB0ZmxpdGU6OkFjdGl2YXRpb25GdW5jdGlvblR5cGVfTk9ORTsKICAgaW50MzJfdCBkaWxhdGlvbl93X2ZhY3RvciA9IDE7CiAgIGludDMyX3QgZGlsYXRpb25faF9mYWN0b3IgPSAxOworICB0ZmxpdGU6OlRlbnNvclR5cGUgcXVhbnRpemVkX2JpYXNfdHlwZSA9IHRmbGl0ZTo6VGVuc29yVHlwZV9GTE9BVDMyOwogfTsKIAotc3RydWN0IENvbnYyRE9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgQ29udjJET3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIENvbnYyRE9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBDb252MkRPcHRpb25zQnVpbGRlciBCdWlsZGVyOwogICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgewpAQCAtNTA5Miw3ICs3NzMwLDggQEAKICAgICBWVF9TVFJJREVfSCA9IDgsCiAgICAgVlRfRlVTRURfQUNUSVZBVElPTl9GVU5DVElPTiA9IDEwLAogICAgIFZUX0RJTEFUSU9OX1dfRkFDVE9SID0gMTIsCi0gICAgVlRfRElMQVRJT05fSF9GQUNUT1IgPSAxNAorICAgIFZUX0RJTEFUSU9OX0hfRkFDVE9SID0gMTQsCisgICAgVlRfUVVBTlRJWkVEX0JJQVNfVFlQRSA9IDE2CiAgIH07CiAgIHRmbGl0ZTo6UGFkZGluZyBwYWRkaW5nKCkgY29uc3QgewogICAgIHJldHVybiBzdGF0aWNfY2FzdDx0ZmxpdGU6OlBhZGRpbmc+KEdldEZpZWxkPGludDhfdD4oVlRfUEFERElORywgMCkpOwpAQCAtNTExMiw3ICs3NzUxLDEwIEBACiAgIGludDMyX3QgZGlsYXRpb25faF9mYWN0b3IoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldEZpZWxkPGludDMyX3Q+KFZUX0RJTEFUSU9OX0hfRkFDVE9SLCAxKTsKICAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIHRmbGl0ZTo6VGVuc29yVHlwZSBxdWFudGl6ZWRfYmlhc190eXBlKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDx0ZmxpdGU6OlRlbnNvclR5cGU+KEdldEZpZWxkPGludDhfdD4oVlRfUVVBTlRJWkVEX0JJQVNfVFlQRSwgMCkpOworICB9CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9QQURESU5HLCAxKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQzMl90Pih2ZXJpZmllciwgVlRfU1RSSURFX1csIDQpICYmCkBAIC01MTIwLDE3ICs3NzYyLDE4IEBACiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDhfdD4odmVyaWZpZXIsIFZUX0ZVU0VEX0FDVElWQVRJT05fRlVOQ1RJT04sIDEpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDMyX3Q+KHZlcmlmaWVyLCBWVF9ESUxBVElPTl9XX0ZBQ1RPUiwgNCkgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50MzJfdD4odmVyaWZpZXIsIFZUX0RJTEFUSU9OX0hfRkFDVE9SLCA0KSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9RVUFOVElaRURfQklBU19UWVBFLCAxKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIENvbnYyRE9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKENvbnYyRE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDb252MkRPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQ29udjJET3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIENvbnYyRE9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oQ29udjJET3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDb252MkRPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBDb252MkRPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IENvbnYyRE9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBDb252MkRPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKICAgdm9pZCBhZGRfcGFkZGluZyh0ZmxpdGU6OlBhZGRpbmcgcGFkZGluZykgewogICAgIGZiYl8uQWRkRWxlbWVudDxpbnQ4X3Q+KENvbnYyRE9wdGlvbnM6OlZUX1BBRERJTkcsIHN0YXRpY19jYXN0PGludDhfdD4ocGFkZGluZyksIDApOwogICB9CkBAIC01MTQ5LDM4ICs3NzkyLDQzIEBACiAgIHZvaWQgYWRkX2RpbGF0aW9uX2hfZmFjdG9yKGludDMyX3QgZGlsYXRpb25faF9mYWN0b3IpIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8aW50MzJfdD4oQ29udjJET3B0aW9uczo6VlRfRElMQVRJT05fSF9GQUNUT1IsIGRpbGF0aW9uX2hfZmFjdG9yLCAxKTsKICAgfQotICBleHBsaWNpdCBDb252MkRPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIHZvaWQgYWRkX3F1YW50aXplZF9iaWFzX3R5cGUodGZsaXRlOjpUZW5zb3JUeXBlIHF1YW50aXplZF9iaWFzX3R5cGUpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8aW50OF90PihDb252MkRPcHRpb25zOjpWVF9RVUFOVElaRURfQklBU19UWVBFLCBzdGF0aWNfY2FzdDxpbnQ4X3Q+KHF1YW50aXplZF9iaWFzX3R5cGUpLCAwKTsKKyAgfQorICBleHBsaWNpdCBDb252MkRPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PENvbnYyRE9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PENvbnYyRE9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PENvbnYyRE9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PENvbnYyRE9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PENvbnYyRE9wdGlvbnM+IENyZWF0ZUNvbnYyRE9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAoraW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDb252MkRPcHRpb25zPiBDcmVhdGVDb252MkRPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAogICAgIHRmbGl0ZTo6UGFkZGluZyBwYWRkaW5nID0gdGZsaXRlOjpQYWRkaW5nX1NBTUUsCiAgICAgaW50MzJfdCBzdHJpZGVfdyA9IDAsCiAgICAgaW50MzJfdCBzdHJpZGVfaCA9IDAsCiAgICAgdGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlIGZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24gPSB0ZmxpdGU6OkFjdGl2YXRpb25GdW5jdGlvblR5cGVfTk9ORSwKICAgICBpbnQzMl90IGRpbGF0aW9uX3dfZmFjdG9yID0gMSwKLSAgICBpbnQzMl90IGRpbGF0aW9uX2hfZmFjdG9yID0gMSkgeworICAgIGludDMyX3QgZGlsYXRpb25faF9mYWN0b3IgPSAxLAorICAgIHRmbGl0ZTo6VGVuc29yVHlwZSBxdWFudGl6ZWRfYmlhc190eXBlID0gdGZsaXRlOjpUZW5zb3JUeXBlX0ZMT0FUMzIpIHsKICAgQ29udjJET3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIGJ1aWxkZXJfLmFkZF9kaWxhdGlvbl9oX2ZhY3RvcihkaWxhdGlvbl9oX2ZhY3Rvcik7CiAgIGJ1aWxkZXJfLmFkZF9kaWxhdGlvbl93X2ZhY3RvcihkaWxhdGlvbl93X2ZhY3Rvcik7CiAgIGJ1aWxkZXJfLmFkZF9zdHJpZGVfaChzdHJpZGVfaCk7CiAgIGJ1aWxkZXJfLmFkZF9zdHJpZGVfdyhzdHJpZGVfdyk7CisgIGJ1aWxkZXJfLmFkZF9xdWFudGl6ZWRfYmlhc190eXBlKHF1YW50aXplZF9iaWFzX3R5cGUpOwogICBidWlsZGVyXy5hZGRfZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbihmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uKTsKICAgYnVpbGRlcl8uYWRkX3BhZGRpbmcocGFkZGluZyk7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDb252MkRPcHRpb25zPiBDcmVhdGVDb252MkRPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQ29udjJET3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Q29udjJET3B0aW9ucz4gQ3JlYXRlQ29udjJET3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQ29udjJET3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IENvbnYzRE9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgQ29udjNET3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIENvbnYzRE9wdGlvbnMgVGFibGVUeXBlOwogICB0ZmxpdGU6OlBhZGRpbmcgcGFkZGluZyA9IHRmbGl0ZTo6UGFkZGluZ19TQU1FOwogICBpbnQzMl90IHN0cmlkZV9kID0gMDsKQEAgLTUxOTIsNyArNzg0MCw3IEBACiAgIGludDMyX3QgZGlsYXRpb25faF9mYWN0b3IgPSAxOwogfTsKIAotc3RydWN0IENvbnYzRE9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgQ29udjNET3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIENvbnYzRE9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBDb252M0RPcHRpb25zQnVpbGRlciBCdWlsZGVyOwogICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgewpAQCAtNTIyOSw3ICs3ODc3LDcgQEAKICAgaW50MzJfdCBkaWxhdGlvbl9oX2ZhY3RvcigpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8aW50MzJfdD4oVlRfRElMQVRJT05fSF9GQUNUT1IsIDEpOwogICB9Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDhfdD4odmVyaWZpZXIsIFZUX1BBRERJTkcsIDEpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDMyX3Q+KHZlcmlmaWVyLCBWVF9TVFJJREVfRCwgNCkgJiYKQEAgLTUyNDEsMTUgKzc4ODksMTUgQEAKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50MzJfdD4odmVyaWZpZXIsIFZUX0RJTEFUSU9OX0hfRkFDVE9SLCA0KSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIENvbnYzRE9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKENvbnYzRE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDb252M0RPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQ29udjNET3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIENvbnYzRE9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oQ29udjNET3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDb252M0RPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBDb252M0RPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IENvbnYzRE9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBDb252M0RPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKICAgdm9pZCBhZGRfcGFkZGluZyh0ZmxpdGU6OlBhZGRpbmcgcGFkZGluZykgewogICAgIGZiYl8uQWRkRWxlbWVudDxpbnQ4X3Q+KENvbnYzRE9wdGlvbnM6OlZUX1BBRERJTkcsIHN0YXRpY19jYXN0PGludDhfdD4ocGFkZGluZyksIDApOwogICB9CkBAIC01Mjc0LDE5ICs3OTIyLDE5IEBACiAgIHZvaWQgYWRkX2RpbGF0aW9uX2hfZmFjdG9yKGludDMyX3QgZGlsYXRpb25faF9mYWN0b3IpIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8aW50MzJfdD4oQ29udjNET3B0aW9uczo6VlRfRElMQVRJT05fSF9GQUNUT1IsIGRpbGF0aW9uX2hfZmFjdG9yLCAxKTsKICAgfQotICBleHBsaWNpdCBDb252M0RPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIGV4cGxpY2l0IENvbnYzRE9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8Q29udjNET3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Q29udjNET3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8Q29udjNET3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Q29udjNET3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8Q29udjNET3B0aW9ucz4gQ3JlYXRlQ29udjNET3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PENvbnYzRE9wdGlvbnM+IENyZWF0ZUNvbnYzRE9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCiAgICAgdGZsaXRlOjpQYWRkaW5nIHBhZGRpbmcgPSB0ZmxpdGU6OlBhZGRpbmdfU0FNRSwKICAgICBpbnQzMl90IHN0cmlkZV9kID0gMCwKICAgICBpbnQzMl90IHN0cmlkZV93ID0gMCwKQEAgLTUzMDcsOSArNzk1NSw5IEBACiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDb252M0RPcHRpb25zPiBDcmVhdGVDb252M0RPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQ29udjNET3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Q29udjNET3B0aW9ucz4gQ3JlYXRlQ29udjNET3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQ29udjNET3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IFBvb2wyRE9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgUG9vbDJET3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIFBvb2wyRE9wdGlvbnMgVGFibGVUeXBlOwogICB0ZmxpdGU6OlBhZGRpbmcgcGFkZGluZyA9IHRmbGl0ZTo6UGFkZGluZ19TQU1FOwogICBpbnQzMl90IHN0cmlkZV93ID0gMDsKQEAgLTUzMTksNyArNzk2Nyw3IEBACiAgIHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZSBmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uID0gdGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlX05PTkU7CiB9OwogCi1zdHJ1Y3QgUG9vbDJET3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBQb29sMkRPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgUG9vbDJET3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIFBvb2wyRE9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CkBAIC01MzQ4LDcgKzc5OTYsNyBAQAogICB0ZmxpdGU6OkFjdGl2YXRpb25GdW5jdGlvblR5cGUgZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbigpIGNvbnN0IHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlPihHZXRGaWVsZDxpbnQ4X3Q+KFZUX0ZVU0VEX0FDVElWQVRJT05fRlVOQ1RJT04sIDApKTsKICAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9QQURESU5HLCAxKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQzMl90Pih2ZXJpZmllciwgVlRfU1RSSURFX1csIDQpICYmCkBAIC01MzU4LDE1ICs4MDA2LDE1IEBACiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDhfdD4odmVyaWZpZXIsIFZUX0ZVU0VEX0FDVElWQVRJT05fRlVOQ1RJT04sIDEpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgUG9vbDJET3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oUG9vbDJET3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PFBvb2wyRE9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBQb29sMkRPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgUG9vbDJET3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhQb29sMkRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFBvb2wyRE9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFBvb2wyRE9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgUG9vbDJET3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIFBvb2wyRE9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwogICB2b2lkIGFkZF9wYWRkaW5nKHRmbGl0ZTo6UGFkZGluZyBwYWRkaW5nKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PGludDhfdD4oUG9vbDJET3B0aW9uczo6VlRfUEFERElORywgc3RhdGljX2Nhc3Q8aW50OF90PihwYWRkaW5nKSwgMCk7CiAgIH0KQEAgLTUzODUsMTkgKzgwMzMsMTkgQEAKICAgdm9pZCBhZGRfZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbih0ZmxpdGU6OkFjdGl2YXRpb25GdW5jdGlvblR5cGUgZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbikgewogICAgIGZiYl8uQWRkRWxlbWVudDxpbnQ4X3Q+KFBvb2wyRE9wdGlvbnM6OlZUX0ZVU0VEX0FDVElWQVRJT05fRlVOQ1RJT04sIHN0YXRpY19jYXN0PGludDhfdD4oZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbiksIDApOwogICB9Ci0gIGV4cGxpY2l0IFBvb2wyRE9wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgZXhwbGljaXQgUG9vbDJET3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxQb29sMkRPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxQb29sMkRPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxQb29sMkRPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxQb29sMkRPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxQb29sMkRPcHRpb25zPiBDcmVhdGVQb29sMkRPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UG9vbDJET3B0aW9ucz4gQ3JlYXRlUG9vbDJET3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKICAgICB0ZmxpdGU6OlBhZGRpbmcgcGFkZGluZyA9IHRmbGl0ZTo6UGFkZGluZ19TQU1FLAogICAgIGludDMyX3Qgc3RyaWRlX3cgPSAwLAogICAgIGludDMyX3Qgc3RyaWRlX2ggPSAwLApAQCAtNTQxNCw5ICs4MDYyLDkgQEAKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PFBvb2wyRE9wdGlvbnM+IENyZWF0ZVBvb2wyRE9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBQb29sMkRPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxQb29sMkRPcHRpb25zPiBDcmVhdGVQb29sMkRPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBQb29sMkRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgRGVwdGh3aXNlQ29udjJET3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBEZXB0aHdpc2VDb252MkRPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgRGVwdGh3aXNlQ29udjJET3B0aW9ucyBUYWJsZVR5cGU7CiAgIHRmbGl0ZTo6UGFkZGluZyBwYWRkaW5nID0gdGZsaXRlOjpQYWRkaW5nX1NBTUU7CiAgIGludDMyX3Qgc3RyaWRlX3cgPSAwOwpAQCAtNTQyNyw3ICs4MDc1LDcgQEAKICAgaW50MzJfdCBkaWxhdGlvbl9oX2ZhY3RvciA9IDE7CiB9OwogCi1zdHJ1Y3QgRGVwdGh3aXNlQ29udjJET3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBEZXB0aHdpc2VDb252MkRPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgRGVwdGh3aXNlQ29udjJET3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIERlcHRod2lzZUNvbnYyRE9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CkBAIC01NDYwLDcgKzgxMDgsNyBAQAogICBpbnQzMl90IGRpbGF0aW9uX2hfZmFjdG9yKCkgY29uc3QgewogICAgIHJldHVybiBHZXRGaWVsZDxpbnQzMl90PihWVF9ESUxBVElPTl9IX0ZBQ1RPUiwgMSk7CiAgIH0KLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50OF90Pih2ZXJpZmllciwgVlRfUEFERElORywgMSkgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50MzJfdD4odmVyaWZpZXIsIFZUX1NUUklERV9XLCA0KSAmJgpAQCAtNTQ3MSwxNSArODExOSwxNSBAQAogICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQzMl90Pih2ZXJpZmllciwgVlRfRElMQVRJT05fSF9GQUNUT1IsIDQpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgRGVwdGh3aXNlQ29udjJET3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oRGVwdGh3aXNlQ29udjJET3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PERlcHRod2lzZUNvbnYyRE9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBEZXB0aHdpc2VDb252MkRPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgRGVwdGh3aXNlQ29udjJET3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhEZXB0aHdpc2VDb252MkRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PERlcHRod2lzZUNvbnYyRE9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IERlcHRod2lzZUNvbnYyRE9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgRGVwdGh3aXNlQ29udjJET3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIERlcHRod2lzZUNvbnYyRE9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwogICB2b2lkIGFkZF9wYWRkaW5nKHRmbGl0ZTo6UGFkZGluZyBwYWRkaW5nKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PGludDhfdD4oRGVwdGh3aXNlQ29udjJET3B0aW9uczo6VlRfUEFERElORywgc3RhdGljX2Nhc3Q8aW50OF90PihwYWRkaW5nKSwgMCk7CiAgIH0KQEAgLTU1MDEsMTkgKzgxNDksMTkgQEAKICAgdm9pZCBhZGRfZGlsYXRpb25faF9mYWN0b3IoaW50MzJfdCBkaWxhdGlvbl9oX2ZhY3RvcikgewogICAgIGZiYl8uQWRkRWxlbWVudDxpbnQzMl90PihEZXB0aHdpc2VDb252MkRPcHRpb25zOjpWVF9ESUxBVElPTl9IX0ZBQ1RPUiwgZGlsYXRpb25faF9mYWN0b3IsIDEpOwogICB9Ci0gIGV4cGxpY2l0IERlcHRod2lzZUNvbnYyRE9wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgZXhwbGljaXQgRGVwdGh3aXNlQ29udjJET3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxEZXB0aHdpc2VDb252MkRPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxEZXB0aHdpc2VDb252MkRPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxEZXB0aHdpc2VDb252MkRPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxEZXB0aHdpc2VDb252MkRPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxEZXB0aHdpc2VDb252MkRPcHRpb25zPiBDcmVhdGVEZXB0aHdpc2VDb252MkRPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8RGVwdGh3aXNlQ29udjJET3B0aW9ucz4gQ3JlYXRlRGVwdGh3aXNlQ29udjJET3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKICAgICB0ZmxpdGU6OlBhZGRpbmcgcGFkZGluZyA9IHRmbGl0ZTo6UGFkZGluZ19TQU1FLAogICAgIGludDMyX3Qgc3RyaWRlX3cgPSAwLAogICAgIGludDMyX3Qgc3RyaWRlX2ggPSAwLApAQCAtNTUzMiwxNiArODE4MCwxNiBAQAogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8RGVwdGh3aXNlQ29udjJET3B0aW9ucz4gQ3JlYXRlRGVwdGh3aXNlQ29udjJET3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IERlcHRod2lzZUNvbnYyRE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PERlcHRod2lzZUNvbnYyRE9wdGlvbnM+IENyZWF0ZURlcHRod2lzZUNvbnYyRE9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IERlcHRod2lzZUNvbnYyRE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBDb25jYXRFbWJlZGRpbmdzT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBDb25jYXRFbWJlZGRpbmdzT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIENvbmNhdEVtYmVkZGluZ3NPcHRpb25zIFRhYmxlVHlwZTsKICAgaW50MzJfdCBudW1fY2hhbm5lbHMgPSAwOwogICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBudW1fY29sdW1uc19wZXJfY2hhbm5lbHt9OwogICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBlbWJlZGRpbmdfZGltX3Blcl9jaGFubmVse307CiB9OwogCi1zdHJ1Y3QgQ29uY2F0RW1iZWRkaW5nc09wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgQ29uY2F0RW1iZWRkaW5nc09wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBDb25jYXRFbWJlZGRpbmdzT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIENvbmNhdEVtYmVkZGluZ3NPcHRpb25zQnVpbGRlciBCdWlsZGVyOwogICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgewpAQCAtNTU1MiwxMyArODIwMCwxMyBAQAogICBpbnQzMl90IG51bV9jaGFubmVscygpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8aW50MzJfdD4oVlRfTlVNX0NIQU5ORUxTLCAwKTsKICAgfQotICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+ICpudW1fY29sdW1uc19wZXJfY2hhbm5lbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+ICo+KFZUX05VTV9DT0xVTU5TX1BFUl9DSEFOTkVMKTsKKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+ICpudW1fY29sdW1uc19wZXJfY2hhbm5lbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4gKj4oVlRfTlVNX0NPTFVNTlNfUEVSX0NIQU5ORUwpOwogICB9Ci0gIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4gKmVtYmVkZGluZ19kaW1fcGVyX2NoYW5uZWwoKSBjb25zdCB7Ci0gICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90PiAqPihWVF9FTUJFRERJTkdfRElNX1BFUl9DSEFOTkVMKTsKKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+ICplbWJlZGRpbmdfZGltX3Blcl9jaGFubmVsKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90PiAqPihWVF9FTUJFRERJTkdfRElNX1BFUl9DSEFOTkVMKTsKICAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQzMl90Pih2ZXJpZmllciwgVlRfTlVNX0NIQU5ORUxTLCA0KSAmJgogICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX05VTV9DT0xVTU5TX1BFUl9DSEFOTkVMKSAmJgpAQCAtNTU2Nyw0MCArODIxNSw0MCBAQAogICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IoZW1iZWRkaW5nX2RpbV9wZXJfY2hhbm5lbCgpKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIENvbmNhdEVtYmVkZGluZ3NPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhDb25jYXRFbWJlZGRpbmdzT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PENvbmNhdEVtYmVkZGluZ3NPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQ29uY2F0RW1iZWRkaW5nc09wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBDb25jYXRFbWJlZGRpbmdzT3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhDb25jYXRFbWJlZGRpbmdzT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDb25jYXRFbWJlZGRpbmdzT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQ29uY2F0RW1iZWRkaW5nc09wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgQ29uY2F0RW1iZWRkaW5nc09wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBDb25jYXRFbWJlZGRpbmdzT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CiAgIHZvaWQgYWRkX251bV9jaGFubmVscyhpbnQzMl90IG51bV9jaGFubmVscykgewogICAgIGZiYl8uQWRkRWxlbWVudDxpbnQzMl90PihDb25jYXRFbWJlZGRpbmdzT3B0aW9uczo6VlRfTlVNX0NIQU5ORUxTLCBudW1fY2hhbm5lbHMsIDApOwogICB9Ci0gIHZvaWQgYWRkX251bV9jb2x1bW5zX3Blcl9jaGFubmVsKGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90Pj4gbnVtX2NvbHVtbnNfcGVyX2NoYW5uZWwpIHsKKyAgdm9pZCBhZGRfbnVtX2NvbHVtbnNfcGVyX2NoYW5uZWwoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90Pj4gbnVtX2NvbHVtbnNfcGVyX2NoYW5uZWwpIHsKICAgICBmYmJfLkFkZE9mZnNldChDb25jYXRFbWJlZGRpbmdzT3B0aW9uczo6VlRfTlVNX0NPTFVNTlNfUEVSX0NIQU5ORUwsIG51bV9jb2x1bW5zX3Blcl9jaGFubmVsKTsKICAgfQotICB2b2lkIGFkZF9lbWJlZGRpbmdfZGltX3Blcl9jaGFubmVsKGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90Pj4gZW1iZWRkaW5nX2RpbV9wZXJfY2hhbm5lbCkgeworICB2b2lkIGFkZF9lbWJlZGRpbmdfZGltX3Blcl9jaGFubmVsKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4+IGVtYmVkZGluZ19kaW1fcGVyX2NoYW5uZWwpIHsKICAgICBmYmJfLkFkZE9mZnNldChDb25jYXRFbWJlZGRpbmdzT3B0aW9uczo6VlRfRU1CRURESU5HX0RJTV9QRVJfQ0hBTk5FTCwgZW1iZWRkaW5nX2RpbV9wZXJfY2hhbm5lbCk7CiAgIH0KLSAgZXhwbGljaXQgQ29uY2F0RW1iZWRkaW5nc09wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgZXhwbGljaXQgQ29uY2F0RW1iZWRkaW5nc09wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8Q29uY2F0RW1iZWRkaW5nc09wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PENvbmNhdEVtYmVkZGluZ3NPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDb25jYXRFbWJlZGRpbmdzT3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Q29uY2F0RW1iZWRkaW5nc09wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PENvbmNhdEVtYmVkZGluZ3NPcHRpb25zPiBDcmVhdGVDb25jYXRFbWJlZGRpbmdzT3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PENvbmNhdEVtYmVkZGluZ3NPcHRpb25zPiBDcmVhdGVDb25jYXRFbWJlZGRpbmdzT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKICAgICBpbnQzMl90IG51bV9jaGFubmVscyA9IDAsCi0gICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+PiBudW1fY29sdW1uc19wZXJfY2hhbm5lbCA9IDAsCi0gICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+PiBlbWJlZGRpbmdfZGltX3Blcl9jaGFubmVsID0gMCkgeworICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4+IG51bV9jb2x1bW5zX3Blcl9jaGFubmVsID0gMCwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+PiBlbWJlZGRpbmdfZGltX3Blcl9jaGFubmVsID0gMCkgewogICBDb25jYXRFbWJlZGRpbmdzT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIGJ1aWxkZXJfLmFkZF9lbWJlZGRpbmdfZGltX3Blcl9jaGFubmVsKGVtYmVkZGluZ19kaW1fcGVyX2NoYW5uZWwpOwogICBidWlsZGVyXy5hZGRfbnVtX2NvbHVtbnNfcGVyX2NoYW5uZWwobnVtX2NvbHVtbnNfcGVyX2NoYW5uZWwpOwpAQCAtNTYwOCw4ICs4MjU2LDggQEAKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDb25jYXRFbWJlZGRpbmdzT3B0aW9ucz4gQ3JlYXRlQ29uY2F0RW1iZWRkaW5nc09wdGlvbnNEaXJlY3QoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAoraW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDb25jYXRFbWJlZGRpbmdzT3B0aW9ucz4gQ3JlYXRlQ29uY2F0RW1iZWRkaW5nc09wdGlvbnNEaXJlY3QoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCiAgICAgaW50MzJfdCBudW1fY2hhbm5lbHMgPSAwLAogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICpudW1fY29sdW1uc19wZXJfY2hhbm5lbCA9IG51bGxwdHIsCiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4gKmVtYmVkZGluZ19kaW1fcGVyX2NoYW5uZWwgPSBudWxscHRyKSB7CkBAIC01NjIyLDE0ICs4MjcwLDE0IEBACiAgICAgICBlbWJlZGRpbmdfZGltX3Blcl9jaGFubmVsX18pOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PENvbmNhdEVtYmVkZGluZ3NPcHRpb25zPiBDcmVhdGVDb25jYXRFbWJlZGRpbmdzT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IENvbmNhdEVtYmVkZGluZ3NPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDb25jYXRFbWJlZGRpbmdzT3B0aW9ucz4gQ3JlYXRlQ29uY2F0RW1iZWRkaW5nc09wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IENvbmNhdEVtYmVkZGluZ3NPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgTFNIUHJvamVjdGlvbk9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgTFNIUHJvamVjdGlvbk9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBMU0hQcm9qZWN0aW9uT3B0aW9ucyBUYWJsZVR5cGU7CiAgIHRmbGl0ZTo6TFNIUHJvamVjdGlvblR5cGUgdHlwZSA9IHRmbGl0ZTo6TFNIUHJvamVjdGlvblR5cGVfVU5LTk9XTjsKIH07CiAKLXN0cnVjdCBMU0hQcm9qZWN0aW9uT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBMU0hQcm9qZWN0aW9uT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIExTSFByb2plY3Rpb25PcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgTFNIUHJvamVjdGlvbk9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CkBAIC01NjM4LDUyICs4Mjg2LDUyIEBACiAgIHRmbGl0ZTo6TFNIUHJvamVjdGlvblR5cGUgdHlwZSgpIGNvbnN0IHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dGZsaXRlOjpMU0hQcm9qZWN0aW9uVHlwZT4oR2V0RmllbGQ8aW50OF90PihWVF9UWVBFLCAwKSk7CiAgIH0KLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50OF90Pih2ZXJpZmllciwgVlRfVFlQRSwgMSkgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBMU0hQcm9qZWN0aW9uT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oTFNIUHJvamVjdGlvbk9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMU0hQcm9qZWN0aW9uT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IExTSFByb2plY3Rpb25PcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgTFNIUHJvamVjdGlvbk9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oTFNIUHJvamVjdGlvbk9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TFNIUHJvamVjdGlvbk9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IExTSFByb2plY3Rpb25PcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IExTSFByb2plY3Rpb25PcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgTFNIUHJvamVjdGlvbk9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwogICB2b2lkIGFkZF90eXBlKHRmbGl0ZTo6TFNIUHJvamVjdGlvblR5cGUgdHlwZSkgewogICAgIGZiYl8uQWRkRWxlbWVudDxpbnQ4X3Q+KExTSFByb2plY3Rpb25PcHRpb25zOjpWVF9UWVBFLCBzdGF0aWNfY2FzdDxpbnQ4X3Q+KHR5cGUpLCAwKTsKICAgfQotICBleHBsaWNpdCBMU0hQcm9qZWN0aW9uT3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICBleHBsaWNpdCBMU0hQcm9qZWN0aW9uT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMU0hQcm9qZWN0aW9uT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TFNIUHJvamVjdGlvbk9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PExTSFByb2plY3Rpb25PcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMU0hQcm9qZWN0aW9uT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TFNIUHJvamVjdGlvbk9wdGlvbnM+IENyZWF0ZUxTSFByb2plY3Rpb25PcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TFNIUHJvamVjdGlvbk9wdGlvbnM+IENyZWF0ZUxTSFByb2plY3Rpb25PcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAogICAgIHRmbGl0ZTo6TFNIUHJvamVjdGlvblR5cGUgdHlwZSA9IHRmbGl0ZTo6TFNIUHJvamVjdGlvblR5cGVfVU5LTk9XTikgewogICBMU0hQcm9qZWN0aW9uT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIGJ1aWxkZXJfLmFkZF90eXBlKHR5cGUpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8TFNIUHJvamVjdGlvbk9wdGlvbnM+IENyZWF0ZUxTSFByb2plY3Rpb25PcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTFNIUHJvamVjdGlvbk9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PExTSFByb2plY3Rpb25PcHRpb25zPiBDcmVhdGVMU0hQcm9qZWN0aW9uT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTFNIUHJvamVjdGlvbk9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBTVkRGT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBTVkRGT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIFNWREZPcHRpb25zIFRhYmxlVHlwZTsKICAgaW50MzJfdCByYW5rID0gMDsKICAgdGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlIGZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24gPSB0ZmxpdGU6OkFjdGl2YXRpb25GdW5jdGlvblR5cGVfTk9ORTsKICAgYm9vbCBhc3ltbWV0cmljX3F1YW50aXplX2lucHV0cyA9IGZhbHNlOwogfTsKIAotc3RydWN0IFNWREZPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IFNWREZPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgU1ZERk9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBTVkRGT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKICAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKQEAgLTU3MDAsMjIgKzgzNDgsMjIgQEAKICAgYm9vbCBhc3ltbWV0cmljX3F1YW50aXplX2lucHV0cygpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8dWludDhfdD4oVlRfQVNZTU1FVFJJQ19RVUFOVElaRV9JTlBVVFMsIDApICE9IDA7CiAgIH0KLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50MzJfdD4odmVyaWZpZXIsIFZUX1JBTkssIDQpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDhfdD4odmVyaWZpZXIsIFZUX0ZVU0VEX0FDVElWQVRJT05fRlVOQ1RJT04sIDEpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9BU1lNTUVUUklDX1FVQU5USVpFX0lOUFVUUywgMSkgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBTVkRGT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oU1ZERk9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTVkRGT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNWREZPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgU1ZERk9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oU1ZERk9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U1ZERk9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNWREZPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IFNWREZPcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgU1ZERk9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwogICB2b2lkIGFkZF9yYW5rKGludDMyX3QgcmFuaykgewogICAgIGZiYl8uQWRkRWxlbWVudDxpbnQzMl90PihTVkRGT3B0aW9uczo6VlRfUkFOSywgcmFuaywgMCk7CiAgIH0KQEAgLTU3MjUsMTkgKzgzNzMsMTkgQEAKICAgdm9pZCBhZGRfYXN5bW1ldHJpY19xdWFudGl6ZV9pbnB1dHMoYm9vbCBhc3ltbWV0cmljX3F1YW50aXplX2lucHV0cykgewogICAgIGZiYl8uQWRkRWxlbWVudDx1aW50OF90PihTVkRGT3B0aW9uczo6VlRfQVNZTU1FVFJJQ19RVUFOVElaRV9JTlBVVFMsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGFzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzKSwgMCk7CiAgIH0KLSAgZXhwbGljaXQgU1ZERk9wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgZXhwbGljaXQgU1ZERk9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8U1ZERk9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNWREZPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTVkRGT3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U1ZERk9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNWREZPcHRpb25zPiBDcmVhdGVTVkRGT3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNWREZPcHRpb25zPiBDcmVhdGVTVkRGT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKICAgICBpbnQzMl90IHJhbmsgPSAwLAogICAgIHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZSBmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uID0gdGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlX05PTkUsCiAgICAgYm9vbCBhc3ltbWV0cmljX3F1YW50aXplX2lucHV0cyA9IGZhbHNlKSB7CkBAIC01NzQ4LDE1ICs4Mzk2LDE1IEBACiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTVkRGT3B0aW9ucz4gQ3JlYXRlU1ZERk9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTVkRGT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U1ZERk9wdGlvbnM+IENyZWF0ZVNWREZPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTVkRGT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IFJOTk9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgUk5OT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIFJOTk9wdGlvbnMgVGFibGVUeXBlOwogICB0ZmxpdGU6OkFjdGl2YXRpb25GdW5jdGlvblR5cGUgZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbiA9IHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZV9OT05FOwogICBib29sIGFzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzID0gZmFsc2U7CiB9OwogCi1zdHJ1Y3QgUk5OT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBSTk5PcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgUk5OT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIFJOTk9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CkBAIC01NzY5LDQwICs4NDE3LDQwIEBACiAgIGJvb2wgYXN5bW1ldHJpY19xdWFudGl6ZV9pbnB1dHMoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldEZpZWxkPHVpbnQ4X3Q+KFZUX0FTWU1NRVRSSUNfUVVBTlRJWkVfSU5QVVRTLCAwKSAhPSAwOwogICB9Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDhfdD4odmVyaWZpZXIsIFZUX0ZVU0VEX0FDVElWQVRJT05fRlVOQ1RJT04sIDEpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9BU1lNTUVUUklDX1FVQU5USVpFX0lOUFVUUywgMSkgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBSTk5PcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhSTk5PcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8Uk5OT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJOTk9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBSTk5PcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFJOTk9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Uk5OT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUk5OT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBSTk5PcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgUk5OT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CiAgIHZvaWQgYWRkX2Z1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24odGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlIGZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24pIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8aW50OF90PihSTk5PcHRpb25zOjpWVF9GVVNFRF9BQ1RJVkFUSU9OX0ZVTkNUSU9OLCBzdGF0aWNfY2FzdDxpbnQ4X3Q+KGZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24pLCAwKTsKICAgfQogICB2b2lkIGFkZF9hc3ltbWV0cmljX3F1YW50aXplX2lucHV0cyhib29sIGFzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQ4X3Q+KFJOTk9wdGlvbnM6OlZUX0FTWU1NRVRSSUNfUVVBTlRJWkVfSU5QVVRTLCBzdGF0aWNfY2FzdDx1aW50OF90Pihhc3ltbWV0cmljX3F1YW50aXplX2lucHV0cyksIDApOwogICB9Ci0gIGV4cGxpY2l0IFJOTk9wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgZXhwbGljaXQgUk5OT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSTk5PcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSTk5PcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSTk5PcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSTk5PcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSTk5PcHRpb25zPiBDcmVhdGVSTk5PcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Uk5OT3B0aW9ucz4gQ3JlYXRlUk5OT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKICAgICB0ZmxpdGU6OkFjdGl2YXRpb25GdW5jdGlvblR5cGUgZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbiA9IHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZV9OT05FLAogICAgIGJvb2wgYXN5bW1ldHJpY19xdWFudGl6ZV9pbnB1dHMgPSBmYWxzZSkgewogICBSTk5PcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKQEAgLTU4MTEsMTYgKzg0NTksMTYgQEAKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PFJOTk9wdGlvbnM+IENyZWF0ZVJOTk9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBSTk5PcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSTk5PcHRpb25zPiBDcmVhdGVSTk5PcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBSTk5PcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgU2VxdWVuY2VSTk5PcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IFNlcXVlbmNlUk5OT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIFNlcXVlbmNlUk5OT3B0aW9ucyBUYWJsZVR5cGU7CiAgIGJvb2wgdGltZV9tYWpvciA9IGZhbHNlOwogICB0ZmxpdGU6OkFjdGl2YXRpb25GdW5jdGlvblR5cGUgZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbiA9IHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZV9OT05FOwogICBib29sIGFzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzID0gZmFsc2U7CiB9OwogCi1zdHJ1Y3QgU2VxdWVuY2VSTk5PcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IFNlcXVlbmNlUk5OT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIFNlcXVlbmNlUk5OT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIFNlcXVlbmNlUk5OT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKICAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKQEAgLTU4MzcsMjIgKzg0ODUsMjIgQEAKICAgYm9vbCBhc3ltbWV0cmljX3F1YW50aXplX2lucHV0cygpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8dWludDhfdD4oVlRfQVNZTU1FVFJJQ19RVUFOVElaRV9JTlBVVFMsIDApICE9IDA7CiAgIH0KLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8dWludDhfdD4odmVyaWZpZXIsIFZUX1RJTUVfTUFKT1IsIDEpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDhfdD4odmVyaWZpZXIsIFZUX0ZVU0VEX0FDVElWQVRJT05fRlVOQ1RJT04sIDEpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9BU1lNTUVUUklDX1FVQU5USVpFX0lOUFVUUywgMSkgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBTZXF1ZW5jZVJOTk9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKFNlcXVlbmNlUk5OT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PFNlcXVlbmNlUk5OT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNlcXVlbmNlUk5OT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIFNlcXVlbmNlUk5OT3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhTZXF1ZW5jZVJOTk9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U2VxdWVuY2VSTk5PcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTZXF1ZW5jZVJOTk9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgU2VxdWVuY2VSTk5PcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgU2VxdWVuY2VSTk5PcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKICAgdm9pZCBhZGRfdGltZV9tYWpvcihib29sIHRpbWVfbWFqb3IpIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDhfdD4oU2VxdWVuY2VSTk5PcHRpb25zOjpWVF9USU1FX01BSk9SLCBzdGF0aWNfY2FzdDx1aW50OF90Pih0aW1lX21ham9yKSwgMCk7CiAgIH0KQEAgLTU4NjIsMTkgKzg1MTAsMTkgQEAKICAgdm9pZCBhZGRfYXN5bW1ldHJpY19xdWFudGl6ZV9pbnB1dHMoYm9vbCBhc3ltbWV0cmljX3F1YW50aXplX2lucHV0cykgewogICAgIGZiYl8uQWRkRWxlbWVudDx1aW50OF90PihTZXF1ZW5jZVJOTk9wdGlvbnM6OlZUX0FTWU1NRVRSSUNfUVVBTlRJWkVfSU5QVVRTLCBzdGF0aWNfY2FzdDx1aW50OF90Pihhc3ltbWV0cmljX3F1YW50aXplX2lucHV0cyksIDApOwogICB9Ci0gIGV4cGxpY2l0IFNlcXVlbmNlUk5OT3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICBleHBsaWNpdCBTZXF1ZW5jZVJOTk9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8U2VxdWVuY2VSTk5PcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTZXF1ZW5jZVJOTk9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNlcXVlbmNlUk5OT3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U2VxdWVuY2VSTk5PcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTZXF1ZW5jZVJOTk9wdGlvbnM+IENyZWF0ZVNlcXVlbmNlUk5OT3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNlcXVlbmNlUk5OT3B0aW9ucz4gQ3JlYXRlU2VxdWVuY2VSTk5PcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAogICAgIGJvb2wgdGltZV9tYWpvciA9IGZhbHNlLAogICAgIHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZSBmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uID0gdGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlX05PTkUsCiAgICAgYm9vbCBhc3ltbWV0cmljX3F1YW50aXplX2lucHV0cyA9IGZhbHNlKSB7CkBAIC01ODg1LDkgKzg1MzMsOSBAQAogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8U2VxdWVuY2VSTk5PcHRpb25zPiBDcmVhdGVTZXF1ZW5jZVJOTk9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTZXF1ZW5jZVJOTk9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNlcXVlbmNlUk5OT3B0aW9ucz4gQ3JlYXRlU2VxdWVuY2VSTk5PcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTZXF1ZW5jZVJOTk9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zIFRhYmxlVHlwZTsKICAgYm9vbCB0aW1lX21ham9yID0gZmFsc2U7CiAgIHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZSBmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uID0gdGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlX05PTkU7CkBAIC01ODk1LDcgKzg1NDMsNyBAQAogICBib29sIGFzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzID0gZmFsc2U7CiB9OwogCi1zdHJ1Y3QgQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CkBAIC01OTE2LDcgKzg1NjQsNyBAQAogICBib29sIGFzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzKCkgY29uc3QgewogICAgIHJldHVybiBHZXRGaWVsZDx1aW50OF90PihWVF9BU1lNTUVUUklDX1FVQU5USVpFX0lOUFVUUywgMCkgIT0gMDsKICAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50OF90Pih2ZXJpZmllciwgVlRfVElNRV9NQUpPUiwgMSkgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50OF90Pih2ZXJpZmllciwgVlRfRlVTRURfQUNUSVZBVElPTl9GVU5DVElPTiwgMSkgJiYKQEAgLTU5MjQsMTUgKzg1NzIsMTUgQEAKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8dWludDhfdD4odmVyaWZpZXIsIFZUX0FTWU1NRVRSSUNfUVVBTlRJWkVfSU5QVVRTLCAxKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKICAgdm9pZCBhZGRfdGltZV9tYWpvcihib29sIHRpbWVfbWFqb3IpIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDhfdD4oQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9uczo6VlRfVElNRV9NQUpPUiwgc3RhdGljX2Nhc3Q8dWludDhfdD4odGltZV9tYWpvciksIDApOwogICB9CkBAIC01OTQ1LDE5ICs4NTkzLDE5IEBACiAgIHZvaWQgYWRkX2FzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzKGJvb2wgYXN5bW1ldHJpY19xdWFudGl6ZV9pbnB1dHMpIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDhfdD4oQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9uczo6VlRfQVNZTU1FVFJJQ19RVUFOVElaRV9JTlBVVFMsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGFzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzKSwgMCk7CiAgIH0KLSAgZXhwbGljaXQgQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICBleHBsaWNpdCBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnM+IENyZWF0ZUJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAoraW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zPiBDcmVhdGVCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAogICAgIGJvb2wgdGltZV9tYWpvciA9IGZhbHNlLAogICAgIHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZSBmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uID0gdGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlX05PTkUsCiAgICAgYm9vbCBtZXJnZV9vdXRwdXRzID0gZmFsc2UsCkBAIC01OTcwLDI0ICs4NjE4LDI2IEBACiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zPiBDcmVhdGVCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9ucz4gQ3JlYXRlQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IEZ1bGx5Q29ubmVjdGVkT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBGdWxseUNvbm5lY3RlZE9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBGdWxseUNvbm5lY3RlZE9wdGlvbnMgVGFibGVUeXBlOwogICB0ZmxpdGU6OkFjdGl2YXRpb25GdW5jdGlvblR5cGUgZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbiA9IHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZV9OT05FOwogICB0ZmxpdGU6OkZ1bGx5Q29ubmVjdGVkT3B0aW9uc1dlaWdodHNGb3JtYXQgd2VpZ2h0c19mb3JtYXQgPSB0ZmxpdGU6OkZ1bGx5Q29ubmVjdGVkT3B0aW9uc1dlaWdodHNGb3JtYXRfREVGQVVMVDsKICAgYm9vbCBrZWVwX251bV9kaW1zID0gZmFsc2U7CiAgIGJvb2wgYXN5bW1ldHJpY19xdWFudGl6ZV9pbnB1dHMgPSBmYWxzZTsKKyAgdGZsaXRlOjpUZW5zb3JUeXBlIHF1YW50aXplZF9iaWFzX3R5cGUgPSB0ZmxpdGU6OlRlbnNvclR5cGVfRkxPQVQzMjsKIH07CiAKLXN0cnVjdCBGdWxseUNvbm5lY3RlZE9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgRnVsbHlDb25uZWN0ZWRPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgRnVsbHlDb25uZWN0ZWRPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgRnVsbHlDb25uZWN0ZWRPcHRpb25zQnVpbGRlciBCdWlsZGVyOwogICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgewogICAgIFZUX0ZVU0VEX0FDVElWQVRJT05fRlVOQ1RJT04gPSA0LAogICAgIFZUX1dFSUdIVFNfRk9STUFUID0gNiwKICAgICBWVF9LRUVQX05VTV9ESU1TID0gOCwKLSAgICBWVF9BU1lNTUVUUklDX1FVQU5USVpFX0lOUFVUUyA9IDEwCisgICAgVlRfQVNZTU1FVFJJQ19RVUFOVElaRV9JTlBVVFMgPSAxMCwKKyAgICBWVF9RVUFOVElaRURfQklBU19UWVBFID0gMTIKICAgfTsKICAgdGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlIGZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24oKSBjb25zdCB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZT4oR2V0RmllbGQ8aW50OF90PihWVF9GVVNFRF9BQ1RJVkFUSU9OX0ZVTkNUSU9OLCAwKSk7CkBAIC02MDAxLDIzICs4NjUxLDI3IEBACiAgIGJvb2wgYXN5bW1ldHJpY19xdWFudGl6ZV9pbnB1dHMoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldEZpZWxkPHVpbnQ4X3Q+KFZUX0FTWU1NRVRSSUNfUVVBTlRJWkVfSU5QVVRTLCAwKSAhPSAwOwogICB9Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgdGZsaXRlOjpUZW5zb3JUeXBlIHF1YW50aXplZF9iaWFzX3R5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHRmbGl0ZTo6VGVuc29yVHlwZT4oR2V0RmllbGQ8aW50OF90PihWVF9RVUFOVElaRURfQklBU19UWVBFLCAwKSk7CisgIH0KKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDhfdD4odmVyaWZpZXIsIFZUX0ZVU0VEX0FDVElWQVRJT05fRlVOQ1RJT04sIDEpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDhfdD4odmVyaWZpZXIsIFZUX1dFSUdIVFNfRk9STUFULCAxKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50OF90Pih2ZXJpZmllciwgVlRfS0VFUF9OVU1fRElNUywgMSkgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8dWludDhfdD4odmVyaWZpZXIsIFZUX0FTWU1NRVRSSUNfUVVBTlRJWkVfSU5QVVRTLCAxKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9RVUFOVElaRURfQklBU19UWVBFLCAxKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIEZ1bGx5Q29ubmVjdGVkT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oRnVsbHlDb25uZWN0ZWRPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8RnVsbHlDb25uZWN0ZWRPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRnVsbHlDb25uZWN0ZWRPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgRnVsbHlDb25uZWN0ZWRPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKEZ1bGx5Q29ubmVjdGVkT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxGdWxseUNvbm5lY3RlZE9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEZ1bGx5Q29ubmVjdGVkT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBGdWxseUNvbm5lY3RlZE9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBGdWxseUNvbm5lY3RlZE9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwogICB2b2lkIGFkZF9mdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uKHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZSBmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PGludDhfdD4oRnVsbHlDb25uZWN0ZWRPcHRpb25zOjpWVF9GVVNFRF9BQ1RJVkFUSU9OX0ZVTkNUSU9OLCBzdGF0aWNfY2FzdDxpbnQ4X3Q+KGZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24pLCAwKTsKICAgfQpAQCAtNjAzMCwyNCArODY4NCwyOSBAQAogICB2b2lkIGFkZF9hc3ltbWV0cmljX3F1YW50aXplX2lucHV0cyhib29sIGFzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQ4X3Q+KEZ1bGx5Q29ubmVjdGVkT3B0aW9uczo6VlRfQVNZTU1FVFJJQ19RVUFOVElaRV9JTlBVVFMsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGFzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzKSwgMCk7CiAgIH0KLSAgZXhwbGljaXQgRnVsbHlDb25uZWN0ZWRPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIHZvaWQgYWRkX3F1YW50aXplZF9iaWFzX3R5cGUodGZsaXRlOjpUZW5zb3JUeXBlIHF1YW50aXplZF9iaWFzX3R5cGUpIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8aW50OF90PihGdWxseUNvbm5lY3RlZE9wdGlvbnM6OlZUX1FVQU5USVpFRF9CSUFTX1RZUEUsIHN0YXRpY19jYXN0PGludDhfdD4ocXVhbnRpemVkX2JpYXNfdHlwZSksIDApOworICB9CisgIGV4cGxpY2l0IEZ1bGx5Q29ubmVjdGVkT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxGdWxseUNvbm5lY3RlZE9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEZ1bGx5Q29ubmVjdGVkT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8RnVsbHlDb25uZWN0ZWRPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxGdWxseUNvbm5lY3RlZE9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEZ1bGx5Q29ubmVjdGVkT3B0aW9ucz4gQ3JlYXRlRnVsbHlDb25uZWN0ZWRPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8RnVsbHlDb25uZWN0ZWRPcHRpb25zPiBDcmVhdGVGdWxseUNvbm5lY3RlZE9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCiAgICAgdGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlIGZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24gPSB0ZmxpdGU6OkFjdGl2YXRpb25GdW5jdGlvblR5cGVfTk9ORSwKICAgICB0ZmxpdGU6OkZ1bGx5Q29ubmVjdGVkT3B0aW9uc1dlaWdodHNGb3JtYXQgd2VpZ2h0c19mb3JtYXQgPSB0ZmxpdGU6OkZ1bGx5Q29ubmVjdGVkT3B0aW9uc1dlaWdodHNGb3JtYXRfREVGQVVMVCwKICAgICBib29sIGtlZXBfbnVtX2RpbXMgPSBmYWxzZSwKLSAgICBib29sIGFzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzID0gZmFsc2UpIHsKKyAgICBib29sIGFzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzID0gZmFsc2UsCisgICAgdGZsaXRlOjpUZW5zb3JUeXBlIHF1YW50aXplZF9iaWFzX3R5cGUgPSB0ZmxpdGU6OlRlbnNvclR5cGVfRkxPQVQzMikgewogICBGdWxseUNvbm5lY3RlZE9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOworICBidWlsZGVyXy5hZGRfcXVhbnRpemVkX2JpYXNfdHlwZShxdWFudGl6ZWRfYmlhc190eXBlKTsKICAgYnVpbGRlcl8uYWRkX2FzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzKGFzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzKTsKICAgYnVpbGRlcl8uYWRkX2tlZXBfbnVtX2RpbXMoa2VlcF9udW1fZGltcyk7CiAgIGJ1aWxkZXJfLmFkZF93ZWlnaHRzX2Zvcm1hdCh3ZWlnaHRzX2Zvcm1hdCk7CkBAIC02MDU1LDE0ICs4NzE0LDE0IEBACiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxGdWxseUNvbm5lY3RlZE9wdGlvbnM+IENyZWF0ZUZ1bGx5Q29ubmVjdGVkT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEZ1bGx5Q29ubmVjdGVkT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8RnVsbHlDb25uZWN0ZWRPcHRpb25zPiBDcmVhdGVGdWxseUNvbm5lY3RlZE9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEZ1bGx5Q29ubmVjdGVkT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IFNvZnRtYXhPcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IFNvZnRtYXhPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgU29mdG1heE9wdGlvbnMgVGFibGVUeXBlOwogICBmbG9hdCBiZXRhID0gMC4wZjsKIH07CiAKLXN0cnVjdCBTb2Z0bWF4T3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBTb2Z0bWF4T3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIFNvZnRtYXhPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgU29mdG1heE9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CkBAIC02MDcxLDUxICs4NzMwLDUxIEBACiAgIGZsb2F0IGJldGEoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldEZpZWxkPGZsb2F0PihWVF9CRVRBLCAwLjBmKTsKICAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDxmbG9hdD4odmVyaWZpZXIsIFZUX0JFVEEsIDQpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgU29mdG1heE9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKFNvZnRtYXhPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8U29mdG1heE9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTb2Z0bWF4T3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIFNvZnRtYXhPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFNvZnRtYXhPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNvZnRtYXhPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTb2Z0bWF4T3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBTb2Z0bWF4T3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIFNvZnRtYXhPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKICAgdm9pZCBhZGRfYmV0YShmbG9hdCBiZXRhKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PGZsb2F0PihTb2Z0bWF4T3B0aW9uczo6VlRfQkVUQSwgYmV0YSwgMC4wZik7CiAgIH0KLSAgZXhwbGljaXQgU29mdG1heE9wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgZXhwbGljaXQgU29mdG1heE9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8U29mdG1heE9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNvZnRtYXhPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTb2Z0bWF4T3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U29mdG1heE9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNvZnRtYXhPcHRpb25zPiBDcmVhdGVTb2Z0bWF4T3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNvZnRtYXhPcHRpb25zPiBDcmVhdGVTb2Z0bWF4T3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKICAgICBmbG9hdCBiZXRhID0gMC4wZikgewogICBTb2Z0bWF4T3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIGJ1aWxkZXJfLmFkZF9iZXRhKGJldGEpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8U29mdG1heE9wdGlvbnM+IENyZWF0ZVNvZnRtYXhPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU29mdG1heE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNvZnRtYXhPcHRpb25zPiBDcmVhdGVTb2Z0bWF4T3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU29mdG1heE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBDb25jYXRlbmF0aW9uT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBDb25jYXRlbmF0aW9uT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIENvbmNhdGVuYXRpb25PcHRpb25zIFRhYmxlVHlwZTsKICAgaW50MzJfdCBheGlzID0gMDsKICAgdGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlIGZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24gPSB0ZmxpdGU6OkFjdGl2YXRpb25GdW5jdGlvblR5cGVfTk9ORTsKIH07CiAKLXN0cnVjdCBDb25jYXRlbmF0aW9uT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBDb25jYXRlbmF0aW9uT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIENvbmNhdGVuYXRpb25PcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgQ29uY2F0ZW5hdGlvbk9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CkBAIC02MTI4LDQwICs4Nzg3LDQwIEBACiAgIHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZSBmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uKCkgY29uc3QgewogICAgIHJldHVybiBzdGF0aWNfY2FzdDx0ZmxpdGU6OkFjdGl2YXRpb25GdW5jdGlvblR5cGU+KEdldEZpZWxkPGludDhfdD4oVlRfRlVTRURfQUNUSVZBVElPTl9GVU5DVElPTiwgMCkpOwogICB9Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDMyX3Q+KHZlcmlmaWVyLCBWVF9BWElTLCA0KSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9GVVNFRF9BQ1RJVkFUSU9OX0ZVTkNUSU9OLCAxKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIENvbmNhdGVuYXRpb25PcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhDb25jYXRlbmF0aW9uT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PENvbmNhdGVuYXRpb25PcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQ29uY2F0ZW5hdGlvbk9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBDb25jYXRlbmF0aW9uT3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhDb25jYXRlbmF0aW9uT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDb25jYXRlbmF0aW9uT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQ29uY2F0ZW5hdGlvbk9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgQ29uY2F0ZW5hdGlvbk9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBDb25jYXRlbmF0aW9uT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CiAgIHZvaWQgYWRkX2F4aXMoaW50MzJfdCBheGlzKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PGludDMyX3Q+KENvbmNhdGVuYXRpb25PcHRpb25zOjpWVF9BWElTLCBheGlzLCAwKTsKICAgfQogICB2b2lkIGFkZF9mdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uKHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZSBmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PGludDhfdD4oQ29uY2F0ZW5hdGlvbk9wdGlvbnM6OlZUX0ZVU0VEX0FDVElWQVRJT05fRlVOQ1RJT04sIHN0YXRpY19jYXN0PGludDhfdD4oZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbiksIDApOwogICB9Ci0gIGV4cGxpY2l0IENvbmNhdGVuYXRpb25PcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIGV4cGxpY2l0IENvbmNhdGVuYXRpb25PcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PENvbmNhdGVuYXRpb25PcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDb25jYXRlbmF0aW9uT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8Q29uY2F0ZW5hdGlvbk9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PENvbmNhdGVuYXRpb25PcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDb25jYXRlbmF0aW9uT3B0aW9ucz4gQ3JlYXRlQ29uY2F0ZW5hdGlvbk9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAoraW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDb25jYXRlbmF0aW9uT3B0aW9ucz4gQ3JlYXRlQ29uY2F0ZW5hdGlvbk9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCiAgICAgaW50MzJfdCBheGlzID0gMCwKICAgICB0ZmxpdGU6OkFjdGl2YXRpb25GdW5jdGlvblR5cGUgZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbiA9IHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZV9OT05FKSB7CiAgIENvbmNhdGVuYXRpb25PcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKQEAgLTYxNzAsMTUgKzg4MjksMTUgQEAKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PENvbmNhdGVuYXRpb25PcHRpb25zPiBDcmVhdGVDb25jYXRlbmF0aW9uT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IENvbmNhdGVuYXRpb25PcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDb25jYXRlbmF0aW9uT3B0aW9ucz4gQ3JlYXRlQ29uY2F0ZW5hdGlvbk9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IENvbmNhdGVuYXRpb25PcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgQWRkT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBBZGRPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgQWRkT3B0aW9ucyBUYWJsZVR5cGU7CiAgIHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZSBmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uID0gdGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlX05PTkU7CiAgIGJvb2wgcG90X3NjYWxlX2ludDE2ID0gdHJ1ZTsKIH07CiAKLXN0cnVjdCBBZGRPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IEFkZE9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBBZGRPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgQWRkT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKICAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKQEAgLTYxOTEsNDAgKzg4NTAsNDAgQEAKICAgYm9vbCBwb3Rfc2NhbGVfaW50MTYoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldEZpZWxkPHVpbnQ4X3Q+KFZUX1BPVF9TQ0FMRV9JTlQxNiwgMSkgIT0gMDsKICAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9GVVNFRF9BQ1RJVkFUSU9OX0ZVTkNUSU9OLCAxKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50OF90Pih2ZXJpZmllciwgVlRfUE9UX1NDQUxFX0lOVDE2LCAxKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIEFkZE9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKEFkZE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBZGRPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQWRkT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIEFkZE9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oQWRkT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBZGRPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBBZGRPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IEFkZE9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBBZGRPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKICAgdm9pZCBhZGRfZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbih0ZmxpdGU6OkFjdGl2YXRpb25GdW5jdGlvblR5cGUgZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbikgewogICAgIGZiYl8uQWRkRWxlbWVudDxpbnQ4X3Q+KEFkZE9wdGlvbnM6OlZUX0ZVU0VEX0FDVElWQVRJT05fRlVOQ1RJT04sIHN0YXRpY19jYXN0PGludDhfdD4oZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbiksIDApOwogICB9CiAgIHZvaWQgYWRkX3BvdF9zY2FsZV9pbnQxNihib29sIHBvdF9zY2FsZV9pbnQxNikgewogICAgIGZiYl8uQWRkRWxlbWVudDx1aW50OF90PihBZGRPcHRpb25zOjpWVF9QT1RfU0NBTEVfSU5UMTYsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHBvdF9zY2FsZV9pbnQxNiksIDEpOwogICB9Ci0gIGV4cGxpY2l0IEFkZE9wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgZXhwbGljaXQgQWRkT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBZGRPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBZGRPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBZGRPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBZGRPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBZGRPcHRpb25zPiBDcmVhdGVBZGRPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QWRkT3B0aW9ucz4gQ3JlYXRlQWRkT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKICAgICB0ZmxpdGU6OkFjdGl2YXRpb25GdW5jdGlvblR5cGUgZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbiA9IHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZV9OT05FLAogICAgIGJvb2wgcG90X3NjYWxlX2ludDE2ID0gdHJ1ZSkgewogICBBZGRPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKQEAgLTYyMzMsMTQgKzg4OTIsMTQgQEAKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PEFkZE9wdGlvbnM+IENyZWF0ZUFkZE9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBBZGRPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBZGRPcHRpb25zPiBDcmVhdGVBZGRPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBBZGRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgTXVsT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBNdWxPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgTXVsT3B0aW9ucyBUYWJsZVR5cGU7CiAgIHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZSBmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uID0gdGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlX05PTkU7CiB9OwogCi1zdHJ1Y3QgTXVsT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBNdWxPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgTXVsT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIE11bE9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CkBAIC02MjQ5LDUwICs4OTA4LDUwIEBACiAgIHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZSBmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uKCkgY29uc3QgewogICAgIHJldHVybiBzdGF0aWNfY2FzdDx0ZmxpdGU6OkFjdGl2YXRpb25GdW5jdGlvblR5cGU+KEdldEZpZWxkPGludDhfdD4oVlRfRlVTRURfQUNUSVZBVElPTl9GVU5DVElPTiwgMCkpOwogICB9Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDhfdD4odmVyaWZpZXIsIFZUX0ZVU0VEX0FDVElWQVRJT05fRlVOQ1RJT04sIDEpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgTXVsT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oTXVsT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PE11bE9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBNdWxPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgTXVsT3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhNdWxPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE11bE9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE11bE9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgTXVsT3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIE11bE9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwogICB2b2lkIGFkZF9mdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uKHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZSBmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PGludDhfdD4oTXVsT3B0aW9uczo6VlRfRlVTRURfQUNUSVZBVElPTl9GVU5DVElPTiwgc3RhdGljX2Nhc3Q8aW50OF90PihmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uKSwgMCk7CiAgIH0KLSAgZXhwbGljaXQgTXVsT3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICBleHBsaWNpdCBNdWxPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PE11bE9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE11bE9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PE11bE9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE11bE9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PE11bE9wdGlvbnM+IENyZWF0ZU11bE9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAoraW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNdWxPcHRpb25zPiBDcmVhdGVNdWxPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAogICAgIHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZSBmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uID0gdGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlX05PTkUpIHsKICAgTXVsT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIGJ1aWxkZXJfLmFkZF9mdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uKGZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24pOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8TXVsT3B0aW9ucz4gQ3JlYXRlTXVsT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE11bE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE11bE9wdGlvbnM+IENyZWF0ZU11bE9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE11bE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBMMk5vcm1PcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IEwyTm9ybU9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBMMk5vcm1PcHRpb25zIFRhYmxlVHlwZTsKICAgdGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlIGZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24gPSB0ZmxpdGU6OkFjdGl2YXRpb25GdW5jdGlvblR5cGVfTk9ORTsKIH07CiAKLXN0cnVjdCBMMk5vcm1PcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IEwyTm9ybU9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBMMk5vcm1PcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgTDJOb3JtT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKICAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKQEAgLTYzMDEsNDUgKzg5NjAsNDUgQEAKICAgdGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlIGZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24oKSBjb25zdCB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZT4oR2V0RmllbGQ8aW50OF90PihWVF9GVVNFRF9BQ1RJVkFUSU9OX0ZVTkNUSU9OLCAwKSk7CiAgIH0KLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50OF90Pih2ZXJpZmllciwgVlRfRlVTRURfQUNUSVZBVElPTl9GVU5DVElPTiwgMSkgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBMMk5vcm1PcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhMMk5vcm1PcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8TDJOb3JtT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEwyTm9ybU9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBMMk5vcm1PcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKEwyTm9ybU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TDJOb3JtT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTDJOb3JtT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBMMk5vcm1PcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgTDJOb3JtT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CiAgIHZvaWQgYWRkX2Z1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24odGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlIGZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24pIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8aW50OF90PihMMk5vcm1PcHRpb25zOjpWVF9GVVNFRF9BQ1RJVkFUSU9OX0ZVTkNUSU9OLCBzdGF0aWNfY2FzdDxpbnQ4X3Q+KGZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24pLCAwKTsKICAgfQotICBleHBsaWNpdCBMMk5vcm1PcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIGV4cGxpY2l0IEwyTm9ybU9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8TDJOb3JtT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TDJOb3JtT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8TDJOb3JtT3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TDJOb3JtT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TDJOb3JtT3B0aW9ucz4gQ3JlYXRlTDJOb3JtT3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEwyTm9ybU9wdGlvbnM+IENyZWF0ZUwyTm9ybU9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCiAgICAgdGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlIGZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24gPSB0ZmxpdGU6OkFjdGl2YXRpb25GdW5jdGlvblR5cGVfTk9ORSkgewogICBMMk5vcm1PcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKICAgYnVpbGRlcl8uYWRkX2Z1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24oZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbik7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMMk5vcm1PcHRpb25zPiBDcmVhdGVMMk5vcm1PcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTDJOb3JtT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TDJOb3JtT3B0aW9ucz4gQ3JlYXRlTDJOb3JtT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTDJOb3JtT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnMgVGFibGVUeXBlOwogICBpbnQzMl90IHJhZGl1cyA9IDA7CiAgIGZsb2F0IGJpYXMgPSAwLjBmOwpAQCAtNjM0Nyw3ICs5MDA2LDcgQEAKICAgZmxvYXQgYmV0YSA9IDAuMGY7CiB9OwogCi1zdHJ1Y3QgTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKICAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKQEAgLTYzNjgsNyArOTAyNyw3IEBACiAgIGZsb2F0IGJldGEoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldEZpZWxkPGZsb2F0PihWVF9CRVRBLCAwLjBmKTsKICAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQzMl90Pih2ZXJpZmllciwgVlRfUkFESVVTLCA0KSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDxmbG9hdD4odmVyaWZpZXIsIFZUX0JJQVMsIDQpICYmCkBAIC02Mzc2LDE1ICs5MDM1LDE1IEBACiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGZsb2F0Pih2ZXJpZmllciwgVlRfQkVUQSwgNCkgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKICAgdm9pZCBhZGRfcmFkaXVzKGludDMyX3QgcmFkaXVzKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PGludDMyX3Q+KExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9uczo6VlRfUkFESVVTLCByYWRpdXMsIDApOwogICB9CkBAIC02Mzk3LDE5ICs5MDU2LDE5IEBACiAgIHZvaWQgYWRkX2JldGEoZmxvYXQgYmV0YSkgewogICAgIGZiYl8uQWRkRWxlbWVudDxmbG9hdD4oTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zOjpWVF9CRVRBLCBiZXRhLCAwLjBmKTsKICAgfQotICBleHBsaWNpdCBMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgZXhwbGljaXQgTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zPiBDcmVhdGVMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAoraW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnM+IENyZWF0ZUxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKICAgICBpbnQzMl90IHJhZGl1cyA9IDAsCiAgICAgZmxvYXQgYmlhcyA9IDAuMGYsCiAgICAgZmxvYXQgYWxwaGEgPSAwLjBmLApAQCAtNjQyMiw5ICs5MDgxLDkgQEAKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9ucz4gQ3JlYXRlTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnM+IENyZWF0ZUxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgTFNUTU9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgTFNUTU9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBMU1RNT3B0aW9ucyBUYWJsZVR5cGU7CiAgIHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZSBmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uID0gdGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlX05PTkU7CiAgIGZsb2F0IGNlbGxfY2xpcCA9IDAuMGY7CkBAIC02NDMzLDcgKzkwOTIsNyBAQAogICBib29sIGFzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzID0gZmFsc2U7CiB9OwogCi1zdHJ1Y3QgTFNUTU9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgTFNUTU9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBMU1RNT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIExTVE1PcHRpb25zQnVpbGRlciBCdWlsZGVyOwogICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgewpAQCAtNjQ1OCw3ICs5MTE3LDcgQEAKICAgYm9vbCBhc3ltbWV0cmljX3F1YW50aXplX2lucHV0cygpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8dWludDhfdD4oVlRfQVNZTU1FVFJJQ19RVUFOVElaRV9JTlBVVFMsIDApICE9IDA7CiAgIH0KLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50OF90Pih2ZXJpZmllciwgVlRfRlVTRURfQUNUSVZBVElPTl9GVU5DVElPTiwgMSkgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8ZmxvYXQ+KHZlcmlmaWVyLCBWVF9DRUxMX0NMSVAsIDQpICYmCkBAIC02NDY3LDE1ICs5MTI2LDE1IEBACiAgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9BU1lNTUVUUklDX1FVQU5USVpFX0lOUFVUUywgMSkgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBMU1RNT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oTFNUTU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMU1RNT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IExTVE1PcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgTFNUTU9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oTFNUTU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TFNUTU9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IExTVE1PcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IExTVE1PcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgTFNUTU9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwogICB2b2lkIGFkZF9mdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uKHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZSBmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PGludDhfdD4oTFNUTU9wdGlvbnM6OlZUX0ZVU0VEX0FDVElWQVRJT05fRlVOQ1RJT04sIHN0YXRpY19jYXN0PGludDhfdD4oZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbiksIDApOwogICB9CkBAIC02NDkxLDE5ICs5MTUwLDE5IEBACiAgIHZvaWQgYWRkX2FzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzKGJvb2wgYXN5bW1ldHJpY19xdWFudGl6ZV9pbnB1dHMpIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDhfdD4oTFNUTU9wdGlvbnM6OlZUX0FTWU1NRVRSSUNfUVVBTlRJWkVfSU5QVVRTLCBzdGF0aWNfY2FzdDx1aW50OF90Pihhc3ltbWV0cmljX3F1YW50aXplX2lucHV0cyksIDApOwogICB9Ci0gIGV4cGxpY2l0IExTVE1PcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIGV4cGxpY2l0IExTVE1PcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PExTVE1PcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMU1RNT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8TFNUTU9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PExTVE1PcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMU1RNT3B0aW9ucz4gQ3JlYXRlTFNUTU9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAoraW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMU1RNT3B0aW9ucz4gQ3JlYXRlTFNUTU9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCiAgICAgdGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlIGZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24gPSB0ZmxpdGU6OkFjdGl2YXRpb25GdW5jdGlvblR5cGVfTk9ORSwKICAgICBmbG9hdCBjZWxsX2NsaXAgPSAwLjBmLAogICAgIGZsb2F0IHByb2pfY2xpcCA9IDAuMGYsCkBAIC02NTE4LDkgKzkxNzcsOSBAQAogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8TFNUTU9wdGlvbnM+IENyZWF0ZUxTVE1PcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTFNUTU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PExTVE1PcHRpb25zPiBDcmVhdGVMU1RNT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTFNUTU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zIFRhYmxlVHlwZTsKICAgdGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlIGZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24gPSB0ZmxpdGU6OkFjdGl2YXRpb25GdW5jdGlvblR5cGVfTk9ORTsKICAgZmxvYXQgY2VsbF9jbGlwID0gMC4wZjsKQEAgLTY1MzAsNyArOTE4OSw3IEBACiAgIGJvb2wgZGlhZ29uYWxfcmVjdXJyZW50X3RlbnNvcnMgPSBmYWxzZTsKIH07CiAKLXN0cnVjdCBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zQnVpbGRlciBCdWlsZGVyOwogICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgewpAQCAtNjU1OSw3ICs5MjE4LDcgQEAKICAgYm9vbCBkaWFnb25hbF9yZWN1cnJlbnRfdGVuc29ycygpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8dWludDhfdD4oVlRfRElBR09OQUxfUkVDVVJSRU5UX1RFTlNPUlMsIDApICE9IDA7CiAgIH0KLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50OF90Pih2ZXJpZmllciwgVlRfRlVTRURfQUNUSVZBVElPTl9GVU5DVElPTiwgMSkgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8ZmxvYXQ+KHZlcmlmaWVyLCBWVF9DRUxMX0NMSVAsIDQpICYmCkBAIC02NTY5LDE1ICs5MjI4LDE1IEBACiAgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9ESUFHT05BTF9SRUNVUlJFTlRfVEVOU09SUywgMSkgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKICAgdm9pZCBhZGRfZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbih0ZmxpdGU6OkFjdGl2YXRpb25GdW5jdGlvblR5cGUgZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbikgewogICAgIGZiYl8uQWRkRWxlbWVudDxpbnQ4X3Q+KFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uczo6VlRfRlVTRURfQUNUSVZBVElPTl9GVU5DVElPTiwgc3RhdGljX2Nhc3Q8aW50OF90PihmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uKSwgMCk7CiAgIH0KQEAgLTY1OTYsMTkgKzkyNTUsMTkgQEAKICAgdm9pZCBhZGRfZGlhZ29uYWxfcmVjdXJyZW50X3RlbnNvcnMoYm9vbCBkaWFnb25hbF9yZWN1cnJlbnRfdGVuc29ycykgewogICAgIGZiYl8uQWRkRWxlbWVudDx1aW50OF90PihVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnM6OlZUX0RJQUdPTkFMX1JFQ1VSUkVOVF9URU5TT1JTLCBzdGF0aWNfY2FzdDx1aW50OF90PihkaWFnb25hbF9yZWN1cnJlbnRfdGVuc29ycyksIDApOwogICB9Ci0gIGV4cGxpY2l0IFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICBleHBsaWNpdCBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8VW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnM+IENyZWF0ZVVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9ucz4gQ3JlYXRlVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAogICAgIHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZSBmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uID0gdGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlX05PTkUsCiAgICAgZmxvYXQgY2VsbF9jbGlwID0gMC4wZiwKICAgICBmbG9hdCBwcm9qX2NsaXAgPSAwLjBmLApAQCAtNjYyNSw5ICs5Mjg0LDkgQEAKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9ucz4gQ3JlYXRlVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnM+IENyZWF0ZVVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9ucyBUYWJsZVR5cGU7CiAgIHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZSBmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uID0gdGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlX05PTkU7CiAgIGZsb2F0IGNlbGxfY2xpcCA9IDAuMGY7CkBAIC02NjM3LDcgKzkyOTYsNyBAQAogICBib29sIGFzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzID0gZmFsc2U7CiB9OwogCi1zdHJ1Y3QgQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zQnVpbGRlciBCdWlsZGVyOwogICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgewpAQCAtNjY2Niw3ICs5MzI1LDcgQEAKICAgYm9vbCBhc3ltbWV0cmljX3F1YW50aXplX2lucHV0cygpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8dWludDhfdD4oVlRfQVNZTU1FVFJJQ19RVUFOVElaRV9JTlBVVFMsIDApICE9IDA7CiAgIH0KLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50OF90Pih2ZXJpZmllciwgVlRfRlVTRURfQUNUSVZBVElPTl9GVU5DVElPTiwgMSkgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8ZmxvYXQ+KHZlcmlmaWVyLCBWVF9DRUxMX0NMSVAsIDQpICYmCkBAIC02Njc2LDE1ICs5MzM1LDE1IEBACiAgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9BU1lNTUVUUklDX1FVQU5USVpFX0lOUFVUUywgMSkgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwogICB2b2lkIGFkZF9mdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uKHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZSBmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PGludDhfdD4oQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnM6OlZUX0ZVU0VEX0FDVElWQVRJT05fRlVOQ1RJT04sIHN0YXRpY19jYXN0PGludDhfdD4oZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbiksIDApOwogICB9CkBAIC02NzAzLDE5ICs5MzYyLDE5IEBACiAgIHZvaWQgYWRkX2FzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzKGJvb2wgYXN5bW1ldHJpY19xdWFudGl6ZV9pbnB1dHMpIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDhfdD4oQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnM6OlZUX0FTWU1NRVRSSUNfUVVBTlRJWkVfSU5QVVRTLCBzdGF0aWNfY2FzdDx1aW50OF90Pihhc3ltbWV0cmljX3F1YW50aXplX2lucHV0cyksIDApOwogICB9Ci0gIGV4cGxpY2l0IEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIGV4cGxpY2l0IEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8QmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9ucz4gQ3JlYXRlQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAoraW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9ucz4gQ3JlYXRlQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCiAgICAgdGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlIGZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24gPSB0ZmxpdGU6OkFjdGl2YXRpb25GdW5jdGlvblR5cGVfTk9ORSwKICAgICBmbG9hdCBjZWxsX2NsaXAgPSAwLjBmLAogICAgIGZsb2F0IHByb2pfY2xpcCA9IDAuMGYsCkBAIC02NzMyLDE1ICs5MzkxLDE1IEBACiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9ucz4gQ3JlYXRlQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnM+IENyZWF0ZUJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IFJlc2l6ZUJpbGluZWFyT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBSZXNpemVCaWxpbmVhck9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBSZXNpemVCaWxpbmVhck9wdGlvbnMgVGFibGVUeXBlOwogICBib29sIGFsaWduX2Nvcm5lcnMgPSBmYWxzZTsKICAgYm9vbCBoYWxmX3BpeGVsX2NlbnRlcnMgPSBmYWxzZTsKIH07CiAKLXN0cnVjdCBSZXNpemVCaWxpbmVhck9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgUmVzaXplQmlsaW5lYXJPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgUmVzaXplQmlsaW5lYXJPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgUmVzaXplQmlsaW5lYXJPcHRpb25zQnVpbGRlciBCdWlsZGVyOwogICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgewpAQCAtNjc1Myw0MCArOTQxMiw0MCBAQAogICBib29sIGhhbGZfcGl4ZWxfY2VudGVycygpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8dWludDhfdD4oVlRfSEFMRl9QSVhFTF9DRU5URVJTLCAwKSAhPSAwOwogICB9Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9BTElHTl9DT1JORVJTLCAxKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50OF90Pih2ZXJpZmllciwgVlRfSEFMRl9QSVhFTF9DRU5URVJTLCAxKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIFJlc2l6ZUJpbGluZWFyT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oUmVzaXplQmlsaW5lYXJPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8UmVzaXplQmlsaW5lYXJPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmVzaXplQmlsaW5lYXJPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgUmVzaXplQmlsaW5lYXJPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFJlc2l6ZUJpbGluZWFyT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXNpemVCaWxpbmVhck9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJlc2l6ZUJpbGluZWFyT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBSZXNpemVCaWxpbmVhck9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBSZXNpemVCaWxpbmVhck9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwogICB2b2lkIGFkZF9hbGlnbl9jb3JuZXJzKGJvb2wgYWxpZ25fY29ybmVycykgewogICAgIGZiYl8uQWRkRWxlbWVudDx1aW50OF90PihSZXNpemVCaWxpbmVhck9wdGlvbnM6OlZUX0FMSUdOX0NPUk5FUlMsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGFsaWduX2Nvcm5lcnMpLCAwKTsKICAgfQogICB2b2lkIGFkZF9oYWxmX3BpeGVsX2NlbnRlcnMoYm9vbCBoYWxmX3BpeGVsX2NlbnRlcnMpIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDhfdD4oUmVzaXplQmlsaW5lYXJPcHRpb25zOjpWVF9IQUxGX1BJWEVMX0NFTlRFUlMsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGhhbGZfcGl4ZWxfY2VudGVycyksIDApOwogICB9Ci0gIGV4cGxpY2l0IFJlc2l6ZUJpbGluZWFyT3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICBleHBsaWNpdCBSZXNpemVCaWxpbmVhck9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8UmVzaXplQmlsaW5lYXJPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXNpemVCaWxpbmVhck9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PFJlc2l6ZUJpbGluZWFyT3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UmVzaXplQmlsaW5lYXJPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXNpemVCaWxpbmVhck9wdGlvbnM+IENyZWF0ZVJlc2l6ZUJpbGluZWFyT3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJlc2l6ZUJpbGluZWFyT3B0aW9ucz4gQ3JlYXRlUmVzaXplQmlsaW5lYXJPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAogICAgIGJvb2wgYWxpZ25fY29ybmVycyA9IGZhbHNlLAogICAgIGJvb2wgaGFsZl9waXhlbF9jZW50ZXJzID0gZmFsc2UpIHsKICAgUmVzaXplQmlsaW5lYXJPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKQEAgLTY3OTUsMTUgKzk0NTQsMTUgQEAKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PFJlc2l6ZUJpbGluZWFyT3B0aW9ucz4gQ3JlYXRlUmVzaXplQmlsaW5lYXJPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmVzaXplQmlsaW5lYXJPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXNpemVCaWxpbmVhck9wdGlvbnM+IENyZWF0ZVJlc2l6ZUJpbGluZWFyT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmVzaXplQmlsaW5lYXJPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgUmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgUmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9ucyBUYWJsZVR5cGU7CiAgIGJvb2wgYWxpZ25fY29ybmVycyA9IGZhbHNlOwogICBib29sIGhhbGZfcGl4ZWxfY2VudGVycyA9IGZhbHNlOwogfTsKIAotc3RydWN0IFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgUmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zQnVpbGRlciBCdWlsZGVyOwogICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgewpAQCAtNjgxNiw0MCArOTQ3NSw0MCBAQAogICBib29sIGhhbGZfcGl4ZWxfY2VudGVycygpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8dWludDhfdD4oVlRfSEFMRl9QSVhFTF9DRU5URVJTLCAwKSAhPSAwOwogICB9Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9BTElHTl9DT1JORVJTLCAxKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50OF90Pih2ZXJpZmllciwgVlRfSEFMRl9QSVhFTF9DRU5URVJTLCAxKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oUmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKICAgdm9pZCBhZGRfYWxpZ25fY29ybmVycyhib29sIGFsaWduX2Nvcm5lcnMpIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDhfdD4oUmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9uczo6VlRfQUxJR05fQ09STkVSUywgc3RhdGljX2Nhc3Q8dWludDhfdD4oYWxpZ25fY29ybmVycyksIDApOwogICB9CiAgIHZvaWQgYWRkX2hhbGZfcGl4ZWxfY2VudGVycyhib29sIGhhbGZfcGl4ZWxfY2VudGVycykgewogICAgIGZiYl8uQWRkRWxlbWVudDx1aW50OF90PihSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zOjpWVF9IQUxGX1BJWEVMX0NFTlRFUlMsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGhhbGZfcGl4ZWxfY2VudGVycyksIDApOwogICB9Ci0gIGV4cGxpY2l0IFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgZXhwbGljaXQgUmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zPiBDcmVhdGVSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9ucz4gQ3JlYXRlUmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKICAgICBib29sIGFsaWduX2Nvcm5lcnMgPSBmYWxzZSwKICAgICBib29sIGhhbGZfcGl4ZWxfY2VudGVycyA9IGZhbHNlKSB7CiAgIFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwpAQCAtNjg1OCwxNCArOTUxNywxNCBAQAogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8UmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9ucz4gQ3JlYXRlUmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnM+IENyZWF0ZVJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBDYWxsT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBDYWxsT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIENhbGxPcHRpb25zIFRhYmxlVHlwZTsKICAgdWludDMyX3Qgc3ViZ3JhcGggPSAwOwogfTsKIAotc3RydWN0IENhbGxPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IENhbGxPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgQ2FsbE9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBDYWxsT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKICAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKQEAgLTY4NzQsMTc1ICs5NTMzLDE3NSBAQAogICB1aW50MzJfdCBzdWJncmFwaCgpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8dWludDMyX3Q+KFZUX1NVQkdSQVBILCAwKTsKICAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50MzJfdD4odmVyaWZpZXIsIFZUX1NVQkdSQVBILCA0KSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIENhbGxPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhDYWxsT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PENhbGxPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQ2FsbE9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBDYWxsT3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhDYWxsT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDYWxsT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQ2FsbE9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgQ2FsbE9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBDYWxsT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CiAgIHZvaWQgYWRkX3N1YmdyYXBoKHVpbnQzMl90IHN1YmdyYXBoKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQzMl90PihDYWxsT3B0aW9uczo6VlRfU1VCR1JBUEgsIHN1YmdyYXBoLCAwKTsKICAgfQotICBleHBsaWNpdCBDYWxsT3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICBleHBsaWNpdCBDYWxsT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDYWxsT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Q2FsbE9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PENhbGxPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDYWxsT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8Q2FsbE9wdGlvbnM+IENyZWF0ZUNhbGxPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Q2FsbE9wdGlvbnM+IENyZWF0ZUNhbGxPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAogICAgIHVpbnQzMl90IHN1YmdyYXBoID0gMCkgewogICBDYWxsT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIGJ1aWxkZXJfLmFkZF9zdWJncmFwaChzdWJncmFwaCk7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDYWxsT3B0aW9ucz4gQ3JlYXRlQ2FsbE9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBDYWxsT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Q2FsbE9wdGlvbnM+IENyZWF0ZUNhbGxPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBDYWxsT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IFBhZE9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgUGFkT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIFBhZE9wdGlvbnMgVGFibGVUeXBlOwogfTsKIAotc3RydWN0IFBhZE9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgUGFkT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIFBhZE9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBQYWRPcHRpb25zQnVpbGRlciBCdWlsZGVyOwotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIFBhZE9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKFBhZE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxQYWRPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUGFkT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIFBhZE9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oUGFkT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxQYWRPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBQYWRPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IFBhZE9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBQYWRPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwotICBleHBsaWNpdCBQYWRPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICBleHBsaWNpdCBQYWRPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PFBhZE9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFBhZE9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PFBhZE9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFBhZE9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFBhZE9wdGlvbnM+IENyZWF0ZVBhZE9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFBhZE9wdGlvbnM+IENyZWF0ZVBhZE9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKICAgUGFkT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxQYWRPcHRpb25zPiBDcmVhdGVQYWRPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUGFkT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UGFkT3B0aW9ucz4gQ3JlYXRlUGFkT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUGFkT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IFBhZFYyT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBQYWRWMk9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBQYWRWMk9wdGlvbnMgVGFibGVUeXBlOwogfTsKIAotc3RydWN0IFBhZFYyT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBQYWRWMk9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBQYWRWMk9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBQYWRWMk9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgUGFkVjJPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhQYWRWMk9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxQYWRWMk9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBQYWRWMk9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBQYWRWMk9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oUGFkVjJPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFBhZFYyT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUGFkVjJPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IFBhZFYyT3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIFBhZFYyT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgZXhwbGljaXQgUGFkVjJPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICBleHBsaWNpdCBQYWRWMk9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8UGFkVjJPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxQYWRWMk9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PFBhZFYyT3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UGFkVjJPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxQYWRWMk9wdGlvbnM+IENyZWF0ZVBhZFYyT3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UGFkVjJPcHRpb25zPiBDcmVhdGVQYWRWMk9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKICAgUGFkVjJPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PFBhZFYyT3B0aW9ucz4gQ3JlYXRlUGFkVjJPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUGFkVjJPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxQYWRWMk9wdGlvbnM+IENyZWF0ZVBhZFYyT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUGFkVjJPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgUmVzaGFwZU9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgUmVzaGFwZU9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBSZXNoYXBlT3B0aW9ucyBUYWJsZVR5cGU7CiAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IG5ld19zaGFwZXt9OwogfTsKIAotc3RydWN0IFJlc2hhcGVPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IFJlc2hhcGVPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgUmVzaGFwZU9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBSZXNoYXBlT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKICAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKICAgICBWVF9ORVdfU0hBUEUgPSA0CiAgIH07Ci0gIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4gKm5ld19zaGFwZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+ICo+KFZUX05FV19TSEFQRSk7CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90PiAqbmV3X3NoYXBlKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90PiAqPihWVF9ORVdfU0hBUEUpOwogICB9Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfTkVXX1NIQVBFKSAmJgogICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IobmV3X3NoYXBlKCkpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgUmVzaGFwZU9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKFJlc2hhcGVPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8UmVzaGFwZU9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBSZXNoYXBlT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIFJlc2hhcGVPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFJlc2hhcGVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJlc2hhcGVPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBSZXNoYXBlT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBSZXNoYXBlT3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIFJlc2hhcGVPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwotICB2b2lkIGFkZF9uZXdfc2hhcGUoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+PiBuZXdfc2hhcGUpIHsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIHZvaWQgYWRkX25ld19zaGFwZSg6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+PiBuZXdfc2hhcGUpIHsKICAgICBmYmJfLkFkZE9mZnNldChSZXNoYXBlT3B0aW9uczo6VlRfTkVXX1NIQVBFLCBuZXdfc2hhcGUpOwogICB9Ci0gIGV4cGxpY2l0IFJlc2hhcGVPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIGV4cGxpY2l0IFJlc2hhcGVPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PFJlc2hhcGVPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXNoYXBlT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8UmVzaGFwZU9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJlc2hhcGVPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXNoYXBlT3B0aW9ucz4gQ3JlYXRlUmVzaGFwZU9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAotICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90Pj4gbmV3X3NoYXBlID0gMCkgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXNoYXBlT3B0aW9ucz4gQ3JlYXRlUmVzaGFwZU9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90Pj4gbmV3X3NoYXBlID0gMCkgewogICBSZXNoYXBlT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIGJ1aWxkZXJfLmFkZF9uZXdfc2hhcGUobmV3X3NoYXBlKTsKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXNoYXBlT3B0aW9ucz4gQ3JlYXRlUmVzaGFwZU9wdGlvbnNEaXJlY3QoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAoraW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXNoYXBlT3B0aW9ucz4gQ3JlYXRlUmVzaGFwZU9wdGlvbnNEaXJlY3QoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4gKm5ld19zaGFwZSA9IG51bGxwdHIpIHsKICAgYXV0byBuZXdfc2hhcGVfXyA9IG5ld19zaGFwZSA/IF9mYmIuQ3JlYXRlVmVjdG9yPGludDMyX3Q+KCpuZXdfc2hhcGUpIDogMDsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlUmVzaGFwZU9wdGlvbnMoCkBAIC03MDUwLDk0ICs5NzA5LDk0IEBACiAgICAgICBuZXdfc2hhcGVfXyk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8UmVzaGFwZU9wdGlvbnM+IENyZWF0ZVJlc2hhcGVPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmVzaGFwZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJlc2hhcGVPcHRpb25zPiBDcmVhdGVSZXNoYXBlT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmVzaGFwZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBTcGFjZVRvQmF0Y2hORE9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgU3BhY2VUb0JhdGNoTkRPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgU3BhY2VUb0JhdGNoTkRPcHRpb25zIFRhYmxlVHlwZTsKIH07CiAKLXN0cnVjdCBTcGFjZVRvQmF0Y2hORE9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgU3BhY2VUb0JhdGNoTkRPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgU3BhY2VUb0JhdGNoTkRPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgU3BhY2VUb0JhdGNoTkRPcHRpb25zQnVpbGRlciBCdWlsZGVyOwotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIFNwYWNlVG9CYXRjaE5ET3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oU3BhY2VUb0JhdGNoTkRPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3BhY2VUb0JhdGNoTkRPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3BhY2VUb0JhdGNoTkRPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgU3BhY2VUb0JhdGNoTkRPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFNwYWNlVG9CYXRjaE5ET3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcGFjZVRvQmF0Y2hORE9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNwYWNlVG9CYXRjaE5ET3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBTcGFjZVRvQmF0Y2hORE9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBTcGFjZVRvQmF0Y2hORE9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87Ci0gIGV4cGxpY2l0IFNwYWNlVG9CYXRjaE5ET3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgZXhwbGljaXQgU3BhY2VUb0JhdGNoTkRPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PFNwYWNlVG9CYXRjaE5ET3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3BhY2VUb0JhdGNoTkRPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcGFjZVRvQmF0Y2hORE9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNwYWNlVG9CYXRjaE5ET3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3BhY2VUb0JhdGNoTkRPcHRpb25zPiBDcmVhdGVTcGFjZVRvQmF0Y2hORE9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNwYWNlVG9CYXRjaE5ET3B0aW9ucz4gQ3JlYXRlU3BhY2VUb0JhdGNoTkRPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CiAgIFNwYWNlVG9CYXRjaE5ET3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcGFjZVRvQmF0Y2hORE9wdGlvbnM+IENyZWF0ZVNwYWNlVG9CYXRjaE5ET3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNwYWNlVG9CYXRjaE5ET3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3BhY2VUb0JhdGNoTkRPcHRpb25zPiBDcmVhdGVTcGFjZVRvQmF0Y2hORE9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNwYWNlVG9CYXRjaE5ET3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IEJhdGNoVG9TcGFjZU5ET3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBCYXRjaFRvU3BhY2VORE9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBCYXRjaFRvU3BhY2VORE9wdGlvbnMgVGFibGVUeXBlOwogfTsKIAotc3RydWN0IEJhdGNoVG9TcGFjZU5ET3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBCYXRjaFRvU3BhY2VORE9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBCYXRjaFRvU3BhY2VORE9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBCYXRjaFRvU3BhY2VORE9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgQmF0Y2hUb1NwYWNlTkRPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhCYXRjaFRvU3BhY2VORE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCYXRjaFRvU3BhY2VORE9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBCYXRjaFRvU3BhY2VORE9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBCYXRjaFRvU3BhY2VORE9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oQmF0Y2hUb1NwYWNlTkRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEJhdGNoVG9TcGFjZU5ET3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQmF0Y2hUb1NwYWNlTkRPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IEJhdGNoVG9TcGFjZU5ET3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIEJhdGNoVG9TcGFjZU5ET3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgZXhwbGljaXQgQmF0Y2hUb1NwYWNlTkRPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICBleHBsaWNpdCBCYXRjaFRvU3BhY2VORE9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8QmF0Y2hUb1NwYWNlTkRPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCYXRjaFRvU3BhY2VORE9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PEJhdGNoVG9TcGFjZU5ET3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QmF0Y2hUb1NwYWNlTkRPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCYXRjaFRvU3BhY2VORE9wdGlvbnM+IENyZWF0ZUJhdGNoVG9TcGFjZU5ET3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QmF0Y2hUb1NwYWNlTkRPcHRpb25zPiBDcmVhdGVCYXRjaFRvU3BhY2VORE9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKICAgQmF0Y2hUb1NwYWNlTkRPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PEJhdGNoVG9TcGFjZU5ET3B0aW9ucz4gQ3JlYXRlQmF0Y2hUb1NwYWNlTkRPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQmF0Y2hUb1NwYWNlTkRPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCYXRjaFRvU3BhY2VORE9wdGlvbnM+IENyZWF0ZUJhdGNoVG9TcGFjZU5ET3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQmF0Y2hUb1NwYWNlTkRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgU2tpcEdyYW1PcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IFNraXBHcmFtT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIFNraXBHcmFtT3B0aW9ucyBUYWJsZVR5cGU7CiAgIGludDMyX3QgbmdyYW1fc2l6ZSA9IDA7CiAgIGludDMyX3QgbWF4X3NraXBfc2l6ZSA9IDA7CiAgIGJvb2wgaW5jbHVkZV9hbGxfbmdyYW1zID0gZmFsc2U7CiB9OwogCi1zdHJ1Y3QgU2tpcEdyYW1PcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IFNraXBHcmFtT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIFNraXBHcmFtT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIFNraXBHcmFtT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKICAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKQEAgLTcxNTQsMjIgKzk4MTMsMjIgQEAKICAgYm9vbCBpbmNsdWRlX2FsbF9uZ3JhbXMoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldEZpZWxkPHVpbnQ4X3Q+KFZUX0lOQ0xVREVfQUxMX05HUkFNUywgMCkgIT0gMDsKICAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQzMl90Pih2ZXJpZmllciwgVlRfTkdSQU1fU0laRSwgNCkgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50MzJfdD4odmVyaWZpZXIsIFZUX01BWF9TS0lQX1NJWkUsIDQpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9JTkNMVURFX0FMTF9OR1JBTVMsIDEpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgU2tpcEdyYW1PcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhTa2lwR3JhbU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTa2lwR3JhbU9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTa2lwR3JhbU9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBTa2lwR3JhbU9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oU2tpcEdyYW1PcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNraXBHcmFtT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU2tpcEdyYW1PcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IFNraXBHcmFtT3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIFNraXBHcmFtT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CiAgIHZvaWQgYWRkX25ncmFtX3NpemUoaW50MzJfdCBuZ3JhbV9zaXplKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PGludDMyX3Q+KFNraXBHcmFtT3B0aW9uczo6VlRfTkdSQU1fU0laRSwgbmdyYW1fc2l6ZSwgMCk7CiAgIH0KQEAgLTcxNzksMTkgKzk4MzgsMTkgQEAKICAgdm9pZCBhZGRfaW5jbHVkZV9hbGxfbmdyYW1zKGJvb2wgaW5jbHVkZV9hbGxfbmdyYW1zKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQ4X3Q+KFNraXBHcmFtT3B0aW9uczo6VlRfSU5DTFVERV9BTExfTkdSQU1TLCBzdGF0aWNfY2FzdDx1aW50OF90PihpbmNsdWRlX2FsbF9uZ3JhbXMpLCAwKTsKICAgfQotICBleHBsaWNpdCBTa2lwR3JhbU9wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgZXhwbGljaXQgU2tpcEdyYW1PcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PFNraXBHcmFtT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U2tpcEdyYW1PcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTa2lwR3JhbU9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNraXBHcmFtT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U2tpcEdyYW1PcHRpb25zPiBDcmVhdGVTa2lwR3JhbU9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAoraW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTa2lwR3JhbU9wdGlvbnM+IENyZWF0ZVNraXBHcmFtT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKICAgICBpbnQzMl90IG5ncmFtX3NpemUgPSAwLAogICAgIGludDMyX3QgbWF4X3NraXBfc2l6ZSA9IDAsCiAgICAgYm9vbCBpbmNsdWRlX2FsbF9uZ3JhbXMgPSBmYWxzZSkgewpAQCAtNzIwMiwxNCArOTg2MSwxNCBAQAogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8U2tpcEdyYW1PcHRpb25zPiBDcmVhdGVTa2lwR3JhbU9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTa2lwR3JhbU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNraXBHcmFtT3B0aW9ucz4gQ3JlYXRlU2tpcEdyYW1PcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTa2lwR3JhbU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBTcGFjZVRvRGVwdGhPcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IFNwYWNlVG9EZXB0aE9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBTcGFjZVRvRGVwdGhPcHRpb25zIFRhYmxlVHlwZTsKICAgaW50MzJfdCBibG9ja19zaXplID0gMDsKIH07CiAKLXN0cnVjdCBTcGFjZVRvRGVwdGhPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IFNwYWNlVG9EZXB0aE9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBTcGFjZVRvRGVwdGhPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgU3BhY2VUb0RlcHRoT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKICAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKQEAgLTcyMTgsNTAgKzk4NzcsNTAgQEAKICAgaW50MzJfdCBibG9ja19zaXplKCkgY29uc3QgewogICAgIHJldHVybiBHZXRGaWVsZDxpbnQzMl90PihWVF9CTE9DS19TSVpFLCAwKTsKICAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQzMl90Pih2ZXJpZmllciwgVlRfQkxPQ0tfU0laRSwgNCkgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBTcGFjZVRvRGVwdGhPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhTcGFjZVRvRGVwdGhPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3BhY2VUb0RlcHRoT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNwYWNlVG9EZXB0aE9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBTcGFjZVRvRGVwdGhPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFNwYWNlVG9EZXB0aE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3BhY2VUb0RlcHRoT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3BhY2VUb0RlcHRoT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBTcGFjZVRvRGVwdGhPcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgU3BhY2VUb0RlcHRoT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CiAgIHZvaWQgYWRkX2Jsb2NrX3NpemUoaW50MzJfdCBibG9ja19zaXplKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PGludDMyX3Q+KFNwYWNlVG9EZXB0aE9wdGlvbnM6OlZUX0JMT0NLX1NJWkUsIGJsb2NrX3NpemUsIDApOwogICB9Ci0gIGV4cGxpY2l0IFNwYWNlVG9EZXB0aE9wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgZXhwbGljaXQgU3BhY2VUb0RlcHRoT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcGFjZVRvRGVwdGhPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcGFjZVRvRGVwdGhPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcGFjZVRvRGVwdGhPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcGFjZVRvRGVwdGhPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcGFjZVRvRGVwdGhPcHRpb25zPiBDcmVhdGVTcGFjZVRvRGVwdGhPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3BhY2VUb0RlcHRoT3B0aW9ucz4gQ3JlYXRlU3BhY2VUb0RlcHRoT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKICAgICBpbnQzMl90IGJsb2NrX3NpemUgPSAwKSB7CiAgIFNwYWNlVG9EZXB0aE9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICBidWlsZGVyXy5hZGRfYmxvY2tfc2l6ZShibG9ja19zaXplKTsKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PFNwYWNlVG9EZXB0aE9wdGlvbnM+IENyZWF0ZVNwYWNlVG9EZXB0aE9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTcGFjZVRvRGVwdGhPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcGFjZVRvRGVwdGhPcHRpb25zPiBDcmVhdGVTcGFjZVRvRGVwdGhPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTcGFjZVRvRGVwdGhPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgRGVwdGhUb1NwYWNlT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBEZXB0aFRvU3BhY2VPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgRGVwdGhUb1NwYWNlT3B0aW9ucyBUYWJsZVR5cGU7CiAgIGludDMyX3QgYmxvY2tfc2l6ZSA9IDA7CiB9OwogCi1zdHJ1Y3QgRGVwdGhUb1NwYWNlT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBEZXB0aFRvU3BhY2VPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgRGVwdGhUb1NwYWNlT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIERlcHRoVG9TcGFjZU9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CkBAIC03MjcwLDUxICs5OTI5LDUxIEBACiAgIGludDMyX3QgYmxvY2tfc2l6ZSgpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8aW50MzJfdD4oVlRfQkxPQ0tfU0laRSwgMCk7CiAgIH0KLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50MzJfdD4odmVyaWZpZXIsIFZUX0JMT0NLX1NJWkUsIDQpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgRGVwdGhUb1NwYWNlT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oRGVwdGhUb1NwYWNlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PERlcHRoVG9TcGFjZU9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBEZXB0aFRvU3BhY2VPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgRGVwdGhUb1NwYWNlT3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhEZXB0aFRvU3BhY2VPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PERlcHRoVG9TcGFjZU9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IERlcHRoVG9TcGFjZU9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgRGVwdGhUb1NwYWNlT3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIERlcHRoVG9TcGFjZU9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwogICB2b2lkIGFkZF9ibG9ja19zaXplKGludDMyX3QgYmxvY2tfc2l6ZSkgewogICAgIGZiYl8uQWRkRWxlbWVudDxpbnQzMl90PihEZXB0aFRvU3BhY2VPcHRpb25zOjpWVF9CTE9DS19TSVpFLCBibG9ja19zaXplLCAwKTsKICAgfQotICBleHBsaWNpdCBEZXB0aFRvU3BhY2VPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIGV4cGxpY2l0IERlcHRoVG9TcGFjZU9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8RGVwdGhUb1NwYWNlT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8RGVwdGhUb1NwYWNlT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8RGVwdGhUb1NwYWNlT3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8RGVwdGhUb1NwYWNlT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8RGVwdGhUb1NwYWNlT3B0aW9ucz4gQ3JlYXRlRGVwdGhUb1NwYWNlT3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PERlcHRoVG9TcGFjZU9wdGlvbnM+IENyZWF0ZURlcHRoVG9TcGFjZU9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCiAgICAgaW50MzJfdCBibG9ja19zaXplID0gMCkgewogICBEZXB0aFRvU3BhY2VPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKICAgYnVpbGRlcl8uYWRkX2Jsb2NrX3NpemUoYmxvY2tfc2l6ZSk7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxEZXB0aFRvU3BhY2VPcHRpb25zPiBDcmVhdGVEZXB0aFRvU3BhY2VPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRGVwdGhUb1NwYWNlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8RGVwdGhUb1NwYWNlT3B0aW9ucz4gQ3JlYXRlRGVwdGhUb1NwYWNlT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRGVwdGhUb1NwYWNlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IFN1Yk9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgU3ViT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIFN1Yk9wdGlvbnMgVGFibGVUeXBlOwogICB0ZmxpdGU6OkFjdGl2YXRpb25GdW5jdGlvblR5cGUgZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbiA9IHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZV9OT05FOwogICBib29sIHBvdF9zY2FsZV9pbnQxNiA9IHRydWU7CiB9OwogCi1zdHJ1Y3QgU3ViT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBTdWJPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgU3ViT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIFN1Yk9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CkBAIC03MzI3LDQwICs5OTg2LDQwIEBACiAgIGJvb2wgcG90X3NjYWxlX2ludDE2KCkgY29uc3QgewogICAgIHJldHVybiBHZXRGaWVsZDx1aW50OF90PihWVF9QT1RfU0NBTEVfSU5UMTYsIDEpICE9IDA7CiAgIH0KLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50OF90Pih2ZXJpZmllciwgVlRfRlVTRURfQUNUSVZBVElPTl9GVU5DVElPTiwgMSkgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8dWludDhfdD4odmVyaWZpZXIsIFZUX1BPVF9TQ0FMRV9JTlQxNiwgMSkgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBTdWJPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhTdWJPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3ViT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN1Yk9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBTdWJPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFN1Yk9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3ViT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3ViT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBTdWJPcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgU3ViT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CiAgIHZvaWQgYWRkX2Z1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24odGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlIGZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24pIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8aW50OF90PihTdWJPcHRpb25zOjpWVF9GVVNFRF9BQ1RJVkFUSU9OX0ZVTkNUSU9OLCBzdGF0aWNfY2FzdDxpbnQ4X3Q+KGZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24pLCAwKTsKICAgfQogICB2b2lkIGFkZF9wb3Rfc2NhbGVfaW50MTYoYm9vbCBwb3Rfc2NhbGVfaW50MTYpIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDhfdD4oU3ViT3B0aW9uczo6VlRfUE9UX1NDQUxFX0lOVDE2LCBzdGF0aWNfY2FzdDx1aW50OF90Pihwb3Rfc2NhbGVfaW50MTYpLCAxKTsKICAgfQotICBleHBsaWNpdCBTdWJPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIGV4cGxpY2l0IFN1Yk9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3ViT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3ViT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8U3ViT3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3ViT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3ViT3B0aW9ucz4gQ3JlYXRlU3ViT3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN1Yk9wdGlvbnM+IENyZWF0ZVN1Yk9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCiAgICAgdGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlIGZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24gPSB0ZmxpdGU6OkFjdGl2YXRpb25GdW5jdGlvblR5cGVfTk9ORSwKICAgICBib29sIHBvdF9zY2FsZV9pbnQxNiA9IHRydWUpIHsKICAgU3ViT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CkBAIC03MzY5LDE0ICsxMDAyOCwxNCBAQAogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8U3ViT3B0aW9ucz4gQ3JlYXRlU3ViT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN1Yk9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN1Yk9wdGlvbnM+IENyZWF0ZVN1Yk9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN1Yk9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBEaXZPcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IERpdk9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBEaXZPcHRpb25zIFRhYmxlVHlwZTsKICAgdGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlIGZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24gPSB0ZmxpdGU6OkFjdGl2YXRpb25GdW5jdGlvblR5cGVfTk9ORTsKIH07CiAKLXN0cnVjdCBEaXZPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IERpdk9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBEaXZPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgRGl2T3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKICAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKQEAgLTczODUsODkgKzEwMDQ0LDg5IEBACiAgIHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZSBmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uKCkgY29uc3QgewogICAgIHJldHVybiBzdGF0aWNfY2FzdDx0ZmxpdGU6OkFjdGl2YXRpb25GdW5jdGlvblR5cGU+KEdldEZpZWxkPGludDhfdD4oVlRfRlVTRURfQUNUSVZBVElPTl9GVU5DVElPTiwgMCkpOwogICB9Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDhfdD4odmVyaWZpZXIsIFZUX0ZVU0VEX0FDVElWQVRJT05fRlVOQ1RJT04sIDEpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgRGl2T3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oRGl2T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PERpdk9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBEaXZPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgRGl2T3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhEaXZPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PERpdk9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IERpdk9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgRGl2T3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIERpdk9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwogICB2b2lkIGFkZF9mdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uKHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZSBmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PGludDhfdD4oRGl2T3B0aW9uczo6VlRfRlVTRURfQUNUSVZBVElPTl9GVU5DVElPTiwgc3RhdGljX2Nhc3Q8aW50OF90PihmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uKSwgMCk7CiAgIH0KLSAgZXhwbGljaXQgRGl2T3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICBleHBsaWNpdCBEaXZPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PERpdk9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PERpdk9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PERpdk9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PERpdk9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PERpdk9wdGlvbnM+IENyZWF0ZURpdk9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAoraW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxEaXZPcHRpb25zPiBDcmVhdGVEaXZPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAogICAgIHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZSBmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uID0gdGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlX05PTkUpIHsKICAgRGl2T3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIGJ1aWxkZXJfLmFkZF9mdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uKGZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24pOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8RGl2T3B0aW9ucz4gQ3JlYXRlRGl2T3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IERpdk9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PERpdk9wdGlvbnM+IENyZWF0ZURpdk9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IERpdk9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBUb3BLVjJPcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IFRvcEtWMk9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBUb3BLVjJPcHRpb25zIFRhYmxlVHlwZTsKIH07CiAKLXN0cnVjdCBUb3BLVjJPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IFRvcEtWMk9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBUb3BLVjJPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgVG9wS1YyT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBUb3BLVjJPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhUb3BLVjJPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8VG9wS1YyT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFRvcEtWMk9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBUb3BLVjJPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFRvcEtWMk9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VG9wS1YyT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVG9wS1YyT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBUb3BLVjJPcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgVG9wS1YyT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgZXhwbGljaXQgVG9wS1YyT3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgZXhwbGljaXQgVG9wS1YyT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUb3BLVjJPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUb3BLVjJPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUb3BLVjJPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUb3BLVjJPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUb3BLVjJPcHRpb25zPiBDcmVhdGVUb3BLVjJPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUb3BLVjJPcHRpb25zPiBDcmVhdGVUb3BLVjJPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CiAgIFRvcEtWMk9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8VG9wS1YyT3B0aW9ucz4gQ3JlYXRlVG9wS1YyT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFRvcEtWMk9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFRvcEtWMk9wdGlvbnM+IENyZWF0ZVRvcEtWMk9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFRvcEtWMk9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IEVtYmVkZGluZ0xvb2t1cFNwYXJzZU9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zIFRhYmxlVHlwZTsKICAgdGZsaXRlOjpDb21iaW5lclR5cGUgY29tYmluZXIgPSB0ZmxpdGU6OkNvbWJpbmVyVHlwZV9TVU07CiB9OwogCi1zdHJ1Y3QgRW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgRW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIEVtYmVkZGluZ0xvb2t1cFNwYXJzZU9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CkBAIC03NDc2LDUxICsxMDEzNSw1MSBAQAogICB0ZmxpdGU6OkNvbWJpbmVyVHlwZSBjb21iaW5lcigpIGNvbnN0IHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dGZsaXRlOjpDb21iaW5lclR5cGU+KEdldEZpZWxkPGludDhfdD4oVlRfQ09NQklORVIsIDApKTsKICAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9DT01CSU5FUiwgMSkgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8RW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEVtYmVkZGluZ0xvb2t1cFNwYXJzZU9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKEVtYmVkZGluZ0xvb2t1cFNwYXJzZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8RW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgRW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CiAgIHZvaWQgYWRkX2NvbWJpbmVyKHRmbGl0ZTo6Q29tYmluZXJUeXBlIGNvbWJpbmVyKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PGludDhfdD4oRW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9uczo6VlRfQ09NQklORVIsIHN0YXRpY19jYXN0PGludDhfdD4oY29tYmluZXIpLCAwKTsKICAgfQotICBleHBsaWNpdCBFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIGV4cGxpY2l0IEVtYmVkZGluZ0xvb2t1cFNwYXJzZU9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8RW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8RW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8RW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8RW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8RW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9ucz4gQ3JlYXRlRW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEVtYmVkZGluZ0xvb2t1cFNwYXJzZU9wdGlvbnM+IENyZWF0ZUVtYmVkZGluZ0xvb2t1cFNwYXJzZU9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCiAgICAgdGZsaXRlOjpDb21iaW5lclR5cGUgY29tYmluZXIgPSB0ZmxpdGU6OkNvbWJpbmVyVHlwZV9TVU0pIHsKICAgRW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIGJ1aWxkZXJfLmFkZF9jb21iaW5lcihjb21iaW5lcik7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zPiBDcmVhdGVFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8RW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9ucz4gQ3JlYXRlRW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IEdhdGhlck9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgR2F0aGVyT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIEdhdGhlck9wdGlvbnMgVGFibGVUeXBlOwogICBpbnQzMl90IGF4aXMgPSAwOwogICBpbnQzMl90IGJhdGNoX2RpbXMgPSAwOwogfTsKIAotc3RydWN0IEdhdGhlck9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgR2F0aGVyT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIEdhdGhlck9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBHYXRoZXJPcHRpb25zQnVpbGRlciBCdWlsZGVyOwogICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgewpAQCAtNzUzMyw0MCArMTAxOTIsNDAgQEAKICAgaW50MzJfdCBiYXRjaF9kaW1zKCkgY29uc3QgewogICAgIHJldHVybiBHZXRGaWVsZDxpbnQzMl90PihWVF9CQVRDSF9ESU1TLCAwKTsKICAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQzMl90Pih2ZXJpZmllciwgVlRfQVhJUywgNCkgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50MzJfdD4odmVyaWZpZXIsIFZUX0JBVENIX0RJTVMsIDQpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgR2F0aGVyT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oR2F0aGVyT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PEdhdGhlck9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBHYXRoZXJPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgR2F0aGVyT3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhHYXRoZXJPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEdhdGhlck9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEdhdGhlck9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgR2F0aGVyT3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIEdhdGhlck9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwogICB2b2lkIGFkZF9heGlzKGludDMyX3QgYXhpcykgewogICAgIGZiYl8uQWRkRWxlbWVudDxpbnQzMl90PihHYXRoZXJPcHRpb25zOjpWVF9BWElTLCBheGlzLCAwKTsKICAgfQogICB2b2lkIGFkZF9iYXRjaF9kaW1zKGludDMyX3QgYmF0Y2hfZGltcykgewogICAgIGZiYl8uQWRkRWxlbWVudDxpbnQzMl90PihHYXRoZXJPcHRpb25zOjpWVF9CQVRDSF9ESU1TLCBiYXRjaF9kaW1zLCAwKTsKICAgfQotICBleHBsaWNpdCBHYXRoZXJPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIGV4cGxpY2l0IEdhdGhlck9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8R2F0aGVyT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8R2F0aGVyT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8R2F0aGVyT3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8R2F0aGVyT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8R2F0aGVyT3B0aW9ucz4gQ3JlYXRlR2F0aGVyT3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEdhdGhlck9wdGlvbnM+IENyZWF0ZUdhdGhlck9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCiAgICAgaW50MzJfdCBheGlzID0gMCwKICAgICBpbnQzMl90IGJhdGNoX2RpbXMgPSAwKSB7CiAgIEdhdGhlck9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwpAQCAtNzU3NSwxMzEgKzEwMjM0LDEzMSBAQAogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8R2F0aGVyT3B0aW9ucz4gQ3JlYXRlR2F0aGVyT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEdhdGhlck9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEdhdGhlck9wdGlvbnM+IENyZWF0ZUdhdGhlck9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEdhdGhlck9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBUcmFuc3Bvc2VPcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IFRyYW5zcG9zZU9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBUcmFuc3Bvc2VPcHRpb25zIFRhYmxlVHlwZTsKIH07CiAKLXN0cnVjdCBUcmFuc3Bvc2VPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IFRyYW5zcG9zZU9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBUcmFuc3Bvc2VPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgVHJhbnNwb3NlT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBUcmFuc3Bvc2VPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhUcmFuc3Bvc2VPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8VHJhbnNwb3NlT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFRyYW5zcG9zZU9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBUcmFuc3Bvc2VPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFRyYW5zcG9zZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VHJhbnNwb3NlT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVHJhbnNwb3NlT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBUcmFuc3Bvc2VPcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgVHJhbnNwb3NlT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgZXhwbGljaXQgVHJhbnNwb3NlT3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgZXhwbGljaXQgVHJhbnNwb3NlT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUcmFuc3Bvc2VPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUcmFuc3Bvc2VPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUcmFuc3Bvc2VPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUcmFuc3Bvc2VPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUcmFuc3Bvc2VPcHRpb25zPiBDcmVhdGVUcmFuc3Bvc2VPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUcmFuc3Bvc2VPcHRpb25zPiBDcmVhdGVUcmFuc3Bvc2VPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CiAgIFRyYW5zcG9zZU9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8VHJhbnNwb3NlT3B0aW9ucz4gQ3JlYXRlVHJhbnNwb3NlT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFRyYW5zcG9zZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFRyYW5zcG9zZU9wdGlvbnM+IENyZWF0ZVRyYW5zcG9zZU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFRyYW5zcG9zZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBFeHBPcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IEV4cE9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBFeHBPcHRpb25zIFRhYmxlVHlwZTsKIH07CiAKLXN0cnVjdCBFeHBPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IEV4cE9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBFeHBPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgRXhwT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBFeHBPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhFeHBPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8RXhwT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEV4cE9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBFeHBPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKEV4cE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8RXhwT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRXhwT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBFeHBPcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgRXhwT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgZXhwbGljaXQgRXhwT3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgZXhwbGljaXQgRXhwT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxFeHBPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxFeHBPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxFeHBPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxFeHBPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxFeHBPcHRpb25zPiBDcmVhdGVFeHBPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxFeHBPcHRpb25zPiBDcmVhdGVFeHBPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CiAgIEV4cE9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8RXhwT3B0aW9ucz4gQ3JlYXRlRXhwT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEV4cE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEV4cE9wdGlvbnM+IENyZWF0ZUV4cE9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEV4cE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBDb3NPcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IENvc09wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBDb3NPcHRpb25zIFRhYmxlVHlwZTsKIH07CiAKLXN0cnVjdCBDb3NPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IENvc09wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBDb3NPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgQ29zT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBDb3NPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhDb3NPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8Q29zT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IENvc09wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBDb3NPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKENvc09wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Q29zT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQ29zT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBDb3NPcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgQ29zT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgZXhwbGljaXQgQ29zT3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgZXhwbGljaXQgQ29zT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDb3NPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDb3NPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDb3NPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDb3NPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDb3NPcHRpb25zPiBDcmVhdGVDb3NPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDb3NPcHRpb25zPiBDcmVhdGVDb3NPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CiAgIENvc09wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8Q29zT3B0aW9ucz4gQ3JlYXRlQ29zT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IENvc09wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PENvc09wdGlvbnM+IENyZWF0ZUNvc09wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IENvc09wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBSZWR1Y2VyT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBSZWR1Y2VyT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIFJlZHVjZXJPcHRpb25zIFRhYmxlVHlwZTsKICAgYm9vbCBrZWVwX2RpbXMgPSBmYWxzZTsKIH07CiAKLXN0cnVjdCBSZWR1Y2VyT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBSZWR1Y2VyT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIFJlZHVjZXJPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgUmVkdWNlck9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CkBAIC03NzA4LDk3ICsxMDM2Nyw5NyBAQAogICBib29sIGtlZXBfZGltcygpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8dWludDhfdD4oVlRfS0VFUF9ESU1TLCAwKSAhPSAwOwogICB9Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9LRUVQX0RJTVMsIDEpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgUmVkdWNlck9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKFJlZHVjZXJPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8UmVkdWNlck9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBSZWR1Y2VyT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIFJlZHVjZXJPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFJlZHVjZXJPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJlZHVjZXJPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBSZWR1Y2VyT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBSZWR1Y2VyT3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIFJlZHVjZXJPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKICAgdm9pZCBhZGRfa2VlcF9kaW1zKGJvb2wga2VlcF9kaW1zKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQ4X3Q+KFJlZHVjZXJPcHRpb25zOjpWVF9LRUVQX0RJTVMsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGtlZXBfZGltcyksIDApOwogICB9Ci0gIGV4cGxpY2l0IFJlZHVjZXJPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIGV4cGxpY2l0IFJlZHVjZXJPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PFJlZHVjZXJPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZWR1Y2VyT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8UmVkdWNlck9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJlZHVjZXJPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZWR1Y2VyT3B0aW9ucz4gQ3JlYXRlUmVkdWNlck9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAoraW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZWR1Y2VyT3B0aW9ucz4gQ3JlYXRlUmVkdWNlck9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCiAgICAgYm9vbCBrZWVwX2RpbXMgPSBmYWxzZSkgewogICBSZWR1Y2VyT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIGJ1aWxkZXJfLmFkZF9rZWVwX2RpbXMoa2VlcF9kaW1zKTsKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PFJlZHVjZXJPcHRpb25zPiBDcmVhdGVSZWR1Y2VyT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJlZHVjZXJPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZWR1Y2VyT3B0aW9ucz4gQ3JlYXRlUmVkdWNlck9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJlZHVjZXJPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgU3F1ZWV6ZU9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgU3F1ZWV6ZU9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBTcXVlZXplT3B0aW9ucyBUYWJsZVR5cGU7CiAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHNxdWVlemVfZGltc3t9OwogfTsKIAotc3RydWN0IFNxdWVlemVPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IFNxdWVlemVPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgU3F1ZWV6ZU9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBTcXVlZXplT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKICAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKICAgICBWVF9TUVVFRVpFX0RJTVMgPSA0CiAgIH07Ci0gIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4gKnNxdWVlemVfZGltcygpIGNvbnN0IHsKLSAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+ICo+KFZUX1NRVUVFWkVfRElNUyk7CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90PiAqc3F1ZWV6ZV9kaW1zKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90PiAqPihWVF9TUVVFRVpFX0RJTVMpOwogICB9Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfU1FVRUVaRV9ESU1TKSAmJgogICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3Ioc3F1ZWV6ZV9kaW1zKCkpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgU3F1ZWV6ZU9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKFNxdWVlemVPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3F1ZWV6ZU9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTcXVlZXplT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIFNxdWVlemVPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFNxdWVlemVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNxdWVlemVPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTcXVlZXplT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBTcXVlZXplT3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIFNxdWVlemVPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwotICB2b2lkIGFkZF9zcXVlZXplX2RpbXMoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+PiBzcXVlZXplX2RpbXMpIHsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIHZvaWQgYWRkX3NxdWVlemVfZGltcyg6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+PiBzcXVlZXplX2RpbXMpIHsKICAgICBmYmJfLkFkZE9mZnNldChTcXVlZXplT3B0aW9uczo6VlRfU1FVRUVaRV9ESU1TLCBzcXVlZXplX2RpbXMpOwogICB9Ci0gIGV4cGxpY2l0IFNxdWVlemVPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIGV4cGxpY2l0IFNxdWVlemVPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PFNxdWVlemVPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcXVlZXplT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8U3F1ZWV6ZU9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNxdWVlemVPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcXVlZXplT3B0aW9ucz4gQ3JlYXRlU3F1ZWV6ZU9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAotICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90Pj4gc3F1ZWV6ZV9kaW1zID0gMCkgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcXVlZXplT3B0aW9ucz4gQ3JlYXRlU3F1ZWV6ZU9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90Pj4gc3F1ZWV6ZV9kaW1zID0gMCkgewogICBTcXVlZXplT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIGJ1aWxkZXJfLmFkZF9zcXVlZXplX2RpbXMoc3F1ZWV6ZV9kaW1zKTsKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcXVlZXplT3B0aW9ucz4gQ3JlYXRlU3F1ZWV6ZU9wdGlvbnNEaXJlY3QoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAoraW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcXVlZXplT3B0aW9ucz4gQ3JlYXRlU3F1ZWV6ZU9wdGlvbnNEaXJlY3QoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4gKnNxdWVlemVfZGltcyA9IG51bGxwdHIpIHsKICAgYXV0byBzcXVlZXplX2RpbXNfXyA9IHNxdWVlemVfZGltcyA/IF9mYmIuQ3JlYXRlVmVjdG9yPGludDMyX3Q+KCpzcXVlZXplX2RpbXMpIDogMDsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlU3F1ZWV6ZU9wdGlvbnMoCkBAIC03ODA2LDE0ICsxMDQ2NSwxNCBAQAogICAgICAgc3F1ZWV6ZV9kaW1zX18pOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PFNxdWVlemVPcHRpb25zPiBDcmVhdGVTcXVlZXplT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNxdWVlemVPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcXVlZXplT3B0aW9ucz4gQ3JlYXRlU3F1ZWV6ZU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNxdWVlemVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgU3BsaXRPcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IFNwbGl0T3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIFNwbGl0T3B0aW9ucyBUYWJsZVR5cGU7CiAgIGludDMyX3QgbnVtX3NwbGl0cyA9IDA7CiB9OwogCi1zdHJ1Y3QgU3BsaXRPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IFNwbGl0T3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIFNwbGl0T3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIFNwbGl0T3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKICAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKQEAgLTc4MjIsNTAgKzEwNDgxLDUwIEBACiAgIGludDMyX3QgbnVtX3NwbGl0cygpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8aW50MzJfdD4oVlRfTlVNX1NQTElUUywgMCk7CiAgIH0KLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50MzJfdD4odmVyaWZpZXIsIFZUX05VTV9TUExJVFMsIDQpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgU3BsaXRPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhTcGxpdE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcGxpdE9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTcGxpdE9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBTcGxpdE9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oU3BsaXRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNwbGl0T3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3BsaXRPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IFNwbGl0T3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIFNwbGl0T3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CiAgIHZvaWQgYWRkX251bV9zcGxpdHMoaW50MzJfdCBudW1fc3BsaXRzKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PGludDMyX3Q+KFNwbGl0T3B0aW9uczo6VlRfTlVNX1NQTElUUywgbnVtX3NwbGl0cywgMCk7CiAgIH0KLSAgZXhwbGljaXQgU3BsaXRPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIGV4cGxpY2l0IFNwbGl0T3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcGxpdE9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNwbGl0T3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8U3BsaXRPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcGxpdE9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNwbGl0T3B0aW9ucz4gQ3JlYXRlU3BsaXRPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3BsaXRPcHRpb25zPiBDcmVhdGVTcGxpdE9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCiAgICAgaW50MzJfdCBudW1fc3BsaXRzID0gMCkgewogICBTcGxpdE9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICBidWlsZGVyXy5hZGRfbnVtX3NwbGl0cyhudW1fc3BsaXRzKTsKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PFNwbGl0T3B0aW9ucz4gQ3JlYXRlU3BsaXRPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3BsaXRPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcGxpdE9wdGlvbnM+IENyZWF0ZVNwbGl0T3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3BsaXRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgU3BsaXRWT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBTcGxpdFZPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgU3BsaXRWT3B0aW9ucyBUYWJsZVR5cGU7CiAgIGludDMyX3QgbnVtX3NwbGl0cyA9IDA7CiB9OwogCi1zdHJ1Y3QgU3BsaXRWT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBTcGxpdFZPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgU3BsaXRWT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIFNwbGl0Vk9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CkBAIC03ODc0LDQ1ICsxMDUzMyw0NSBAQAogICBpbnQzMl90IG51bV9zcGxpdHMoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldEZpZWxkPGludDMyX3Q+KFZUX05VTV9TUExJVFMsIDApOwogICB9Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDMyX3Q+KHZlcmlmaWVyLCBWVF9OVU1fU1BMSVRTLCA0KSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIFNwbGl0Vk9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKFNwbGl0Vk9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcGxpdFZPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3BsaXRWT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIFNwbGl0Vk9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oU3BsaXRWT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcGxpdFZPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTcGxpdFZPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IFNwbGl0Vk9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBTcGxpdFZPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKICAgdm9pZCBhZGRfbnVtX3NwbGl0cyhpbnQzMl90IG51bV9zcGxpdHMpIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8aW50MzJfdD4oU3BsaXRWT3B0aW9uczo6VlRfTlVNX1NQTElUUywgbnVtX3NwbGl0cywgMCk7CiAgIH0KLSAgZXhwbGljaXQgU3BsaXRWT3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICBleHBsaWNpdCBTcGxpdFZPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PFNwbGl0Vk9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNwbGl0Vk9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNwbGl0Vk9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNwbGl0Vk9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNwbGl0Vk9wdGlvbnM+IENyZWF0ZVNwbGl0Vk9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAoraW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcGxpdFZPcHRpb25zPiBDcmVhdGVTcGxpdFZPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAogICAgIGludDMyX3QgbnVtX3NwbGl0cyA9IDApIHsKICAgU3BsaXRWT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIGJ1aWxkZXJfLmFkZF9udW1fc3BsaXRzKG51bV9zcGxpdHMpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8U3BsaXRWT3B0aW9ucz4gQ3JlYXRlU3BsaXRWT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNwbGl0Vk9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNwbGl0Vk9wdGlvbnM+IENyZWF0ZVNwbGl0Vk9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNwbGl0Vk9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBTdHJpZGVkU2xpY2VPcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IFN0cmlkZWRTbGljZU9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBTdHJpZGVkU2xpY2VPcHRpb25zIFRhYmxlVHlwZTsKICAgaW50MzJfdCBiZWdpbl9tYXNrID0gMDsKICAgaW50MzJfdCBlbmRfbWFzayA9IDA7CkBAIC03OTIyLDcgKzEwNTgxLDcgQEAKICAgYm9vbCBvZmZzZXQgPSBmYWxzZTsKIH07CiAKLXN0cnVjdCBTdHJpZGVkU2xpY2VPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IFN0cmlkZWRTbGljZU9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBTdHJpZGVkU2xpY2VPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgU3RyaWRlZFNsaWNlT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKICAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKQEAgLTc5NTEsNyArMTA2MTAsNyBAQAogICBib29sIG9mZnNldCgpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8dWludDhfdD4oVlRfT0ZGU0VULCAwKSAhPSAwOwogICB9Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDMyX3Q+KHZlcmlmaWVyLCBWVF9CRUdJTl9NQVNLLCA0KSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQzMl90Pih2ZXJpZmllciwgVlRfRU5EX01BU0ssIDQpICYmCkBAIC03OTYxLDE1ICsxMDYyMCwxNSBAQAogICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50OF90Pih2ZXJpZmllciwgVlRfT0ZGU0VULCAxKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIFN0cmlkZWRTbGljZU9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKFN0cmlkZWRTbGljZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdHJpZGVkU2xpY2VPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RyaWRlZFNsaWNlT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIFN0cmlkZWRTbGljZU9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oU3RyaWRlZFNsaWNlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdHJpZGVkU2xpY2VPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTdHJpZGVkU2xpY2VPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IFN0cmlkZWRTbGljZU9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBTdHJpZGVkU2xpY2VPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKICAgdm9pZCBhZGRfYmVnaW5fbWFzayhpbnQzMl90IGJlZ2luX21hc2spIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8aW50MzJfdD4oU3RyaWRlZFNsaWNlT3B0aW9uczo6VlRfQkVHSU5fTUFTSywgYmVnaW5fbWFzaywgMCk7CiAgIH0KQEAgLTc5ODgsMTkgKzEwNjQ3LDE5IEBACiAgIHZvaWQgYWRkX29mZnNldChib29sIG9mZnNldCkgewogICAgIGZiYl8uQWRkRWxlbWVudDx1aW50OF90PihTdHJpZGVkU2xpY2VPcHRpb25zOjpWVF9PRkZTRVQsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KG9mZnNldCksIDApOwogICB9Ci0gIGV4cGxpY2l0IFN0cmlkZWRTbGljZU9wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgZXhwbGljaXQgU3RyaWRlZFNsaWNlT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdHJpZGVkU2xpY2VPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdHJpZGVkU2xpY2VPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdHJpZGVkU2xpY2VPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdHJpZGVkU2xpY2VPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdHJpZGVkU2xpY2VPcHRpb25zPiBDcmVhdGVTdHJpZGVkU2xpY2VPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RyaWRlZFNsaWNlT3B0aW9ucz4gQ3JlYXRlU3RyaWRlZFNsaWNlT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKICAgICBpbnQzMl90IGJlZ2luX21hc2sgPSAwLAogICAgIGludDMyX3QgZW5kX21hc2sgPSAwLAogICAgIGludDMyX3QgZWxsaXBzaXNfbWFzayA9IDAsCkBAIC04MDE3LDU0ICsxMDY3Niw1NCBAQAogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8U3RyaWRlZFNsaWNlT3B0aW9ucz4gQ3JlYXRlU3RyaWRlZFNsaWNlT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN0cmlkZWRTbGljZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0cmlkZWRTbGljZU9wdGlvbnM+IENyZWF0ZVN0cmlkZWRTbGljZU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN0cmlkZWRTbGljZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBMb2dTb2Z0bWF4T3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBMb2dTb2Z0bWF4T3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIExvZ1NvZnRtYXhPcHRpb25zIFRhYmxlVHlwZTsKIH07CiAKLXN0cnVjdCBMb2dTb2Z0bWF4T3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBMb2dTb2Z0bWF4T3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIExvZ1NvZnRtYXhPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgTG9nU29mdG1heE9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgTG9nU29mdG1heE9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKExvZ1NvZnRtYXhPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8TG9nU29mdG1heE9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBMb2dTb2Z0bWF4T3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIExvZ1NvZnRtYXhPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKExvZ1NvZnRtYXhPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PExvZ1NvZnRtYXhPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBMb2dTb2Z0bWF4T3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBMb2dTb2Z0bWF4T3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIExvZ1NvZnRtYXhPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwotICBleHBsaWNpdCBMb2dTb2Z0bWF4T3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgZXhwbGljaXQgTG9nU29mdG1heE9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8TG9nU29mdG1heE9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PExvZ1NvZnRtYXhPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMb2dTb2Z0bWF4T3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TG9nU29mdG1heE9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PExvZ1NvZnRtYXhPcHRpb25zPiBDcmVhdGVMb2dTb2Z0bWF4T3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TG9nU29mdG1heE9wdGlvbnM+IENyZWF0ZUxvZ1NvZnRtYXhPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CiAgIExvZ1NvZnRtYXhPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PExvZ1NvZnRtYXhPcHRpb25zPiBDcmVhdGVMb2dTb2Z0bWF4T3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IExvZ1NvZnRtYXhPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMb2dTb2Z0bWF4T3B0aW9ucz4gQ3JlYXRlTG9nU29mdG1heE9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IExvZ1NvZnRtYXhPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgQ2FzdE9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgQ2FzdE9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBDYXN0T3B0aW9ucyBUYWJsZVR5cGU7CiAgIHRmbGl0ZTo6VGVuc29yVHlwZSBpbl9kYXRhX3R5cGUgPSB0ZmxpdGU6OlRlbnNvclR5cGVfRkxPQVQzMjsKICAgdGZsaXRlOjpUZW5zb3JUeXBlIG91dF9kYXRhX3R5cGUgPSB0ZmxpdGU6OlRlbnNvclR5cGVfRkxPQVQzMjsKIH07CiAKLXN0cnVjdCBDYXN0T3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBDYXN0T3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIENhc3RPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgQ2FzdE9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CkBAIC04MDc3LDQwICsxMDczNiw0MCBAQAogICB0ZmxpdGU6OlRlbnNvclR5cGUgb3V0X2RhdGFfdHlwZSgpIGNvbnN0IHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dGZsaXRlOjpUZW5zb3JUeXBlPihHZXRGaWVsZDxpbnQ4X3Q+KFZUX09VVF9EQVRBX1RZUEUsIDApKTsKICAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9JTl9EQVRBX1RZUEUsIDEpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDhfdD4odmVyaWZpZXIsIFZUX09VVF9EQVRBX1RZUEUsIDEpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgQ2FzdE9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKENhc3RPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8Q2FzdE9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBDYXN0T3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIENhc3RPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKENhc3RPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PENhc3RPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBDYXN0T3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBDYXN0T3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIENhc3RPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKICAgdm9pZCBhZGRfaW5fZGF0YV90eXBlKHRmbGl0ZTo6VGVuc29yVHlwZSBpbl9kYXRhX3R5cGUpIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8aW50OF90PihDYXN0T3B0aW9uczo6VlRfSU5fREFUQV9UWVBFLCBzdGF0aWNfY2FzdDxpbnQ4X3Q+KGluX2RhdGFfdHlwZSksIDApOwogICB9CiAgIHZvaWQgYWRkX291dF9kYXRhX3R5cGUodGZsaXRlOjpUZW5zb3JUeXBlIG91dF9kYXRhX3R5cGUpIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8aW50OF90PihDYXN0T3B0aW9uczo6VlRfT1VUX0RBVEFfVFlQRSwgc3RhdGljX2Nhc3Q8aW50OF90PihvdXRfZGF0YV90eXBlKSwgMCk7CiAgIH0KLSAgZXhwbGljaXQgQ2FzdE9wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgZXhwbGljaXQgQ2FzdE9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8Q2FzdE9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PENhc3RPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDYXN0T3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Q2FzdE9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PENhc3RPcHRpb25zPiBDcmVhdGVDYXN0T3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PENhc3RPcHRpb25zPiBDcmVhdGVDYXN0T3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKICAgICB0ZmxpdGU6OlRlbnNvclR5cGUgaW5fZGF0YV90eXBlID0gdGZsaXRlOjpUZW5zb3JUeXBlX0ZMT0FUMzIsCiAgICAgdGZsaXRlOjpUZW5zb3JUeXBlIG91dF9kYXRhX3R5cGUgPSB0ZmxpdGU6OlRlbnNvclR5cGVfRkxPQVQzMikgewogICBDYXN0T3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CkBAIC04MTE5LDEzMSArMTA3NzgsMTMxIEBACiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDYXN0T3B0aW9ucz4gQ3JlYXRlQ2FzdE9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBDYXN0T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Q2FzdE9wdGlvbnM+IENyZWF0ZUNhc3RPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBDYXN0T3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IERlcXVhbnRpemVPcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IERlcXVhbnRpemVPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgRGVxdWFudGl6ZU9wdGlvbnMgVGFibGVUeXBlOwogfTsKIAotc3RydWN0IERlcXVhbnRpemVPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IERlcXVhbnRpemVPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgRGVxdWFudGl6ZU9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBEZXF1YW50aXplT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBEZXF1YW50aXplT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oRGVxdWFudGl6ZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxEZXF1YW50aXplT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IERlcXVhbnRpemVPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgRGVxdWFudGl6ZU9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oRGVxdWFudGl6ZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8RGVxdWFudGl6ZU9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IERlcXVhbnRpemVPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IERlcXVhbnRpemVPcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgRGVxdWFudGl6ZU9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87Ci0gIGV4cGxpY2l0IERlcXVhbnRpemVPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICBleHBsaWNpdCBEZXF1YW50aXplT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxEZXF1YW50aXplT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8RGVxdWFudGl6ZU9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PERlcXVhbnRpemVPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxEZXF1YW50aXplT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8RGVxdWFudGl6ZU9wdGlvbnM+IENyZWF0ZURlcXVhbnRpemVPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxEZXF1YW50aXplT3B0aW9ucz4gQ3JlYXRlRGVxdWFudGl6ZU9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKICAgRGVxdWFudGl6ZU9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8RGVxdWFudGl6ZU9wdGlvbnM+IENyZWF0ZURlcXVhbnRpemVPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRGVxdWFudGl6ZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PERlcXVhbnRpemVPcHRpb25zPiBDcmVhdGVEZXF1YW50aXplT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRGVxdWFudGl6ZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBNYXhpbXVtTWluaW11bU9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgTWF4aW11bU1pbmltdW1PcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgTWF4aW11bU1pbmltdW1PcHRpb25zIFRhYmxlVHlwZTsKIH07CiAKLXN0cnVjdCBNYXhpbXVtTWluaW11bU9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgTWF4aW11bU1pbmltdW1PcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgTWF4aW11bU1pbmltdW1PcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgTWF4aW11bU1pbmltdW1PcHRpb25zQnVpbGRlciBCdWlsZGVyOwotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIE1heGltdW1NaW5pbXVtT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oTWF4aW11bU1pbmltdW1PcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8TWF4aW11bU1pbmltdW1PcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTWF4aW11bU1pbmltdW1PcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgTWF4aW11bU1pbmltdW1PcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKE1heGltdW1NaW5pbXVtT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNYXhpbXVtTWluaW11bU9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE1heGltdW1NaW5pbXVtT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBNYXhpbXVtTWluaW11bU9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBNYXhpbXVtTWluaW11bU9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87Ci0gIGV4cGxpY2l0IE1heGltdW1NaW5pbXVtT3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgZXhwbGljaXQgTWF4aW11bU1pbmltdW1PcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PE1heGltdW1NaW5pbXVtT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TWF4aW11bU1pbmltdW1PcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNYXhpbXVtTWluaW11bU9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE1heGltdW1NaW5pbXVtT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TWF4aW11bU1pbmltdW1PcHRpb25zPiBDcmVhdGVNYXhpbXVtTWluaW11bU9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE1heGltdW1NaW5pbXVtT3B0aW9ucz4gQ3JlYXRlTWF4aW11bU1pbmltdW1PcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CiAgIE1heGltdW1NaW5pbXVtT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNYXhpbXVtTWluaW11bU9wdGlvbnM+IENyZWF0ZU1heGltdW1NaW5pbXVtT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE1heGltdW1NaW5pbXVtT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TWF4aW11bU1pbmltdW1PcHRpb25zPiBDcmVhdGVNYXhpbXVtTWluaW11bU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE1heGltdW1NaW5pbXVtT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IFRpbGVPcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IFRpbGVPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgVGlsZU9wdGlvbnMgVGFibGVUeXBlOwogfTsKIAotc3RydWN0IFRpbGVPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IFRpbGVPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgVGlsZU9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBUaWxlT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBUaWxlT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oVGlsZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUaWxlT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFRpbGVPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgVGlsZU9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oVGlsZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VGlsZU9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFRpbGVPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IFRpbGVPcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgVGlsZU9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87Ci0gIGV4cGxpY2l0IFRpbGVPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICBleHBsaWNpdCBUaWxlT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUaWxlT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VGlsZU9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PFRpbGVPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUaWxlT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8VGlsZU9wdGlvbnM+IENyZWF0ZVRpbGVPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUaWxlT3B0aW9ucz4gQ3JlYXRlVGlsZU9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKICAgVGlsZU9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8VGlsZU9wdGlvbnM+IENyZWF0ZVRpbGVPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVGlsZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFRpbGVPcHRpb25zPiBDcmVhdGVUaWxlT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVGlsZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBBcmdNYXhPcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IEFyZ01heE9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBBcmdNYXhPcHRpb25zIFRhYmxlVHlwZTsKICAgdGZsaXRlOjpUZW5zb3JUeXBlIG91dHB1dF90eXBlID0gdGZsaXRlOjpUZW5zb3JUeXBlX0ZMT0FUMzI7CiB9OwogCi1zdHJ1Y3QgQXJnTWF4T3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBBcmdNYXhPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgQXJnTWF4T3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIEFyZ01heE9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CkBAIC04MjUyLDUwICsxMDkxMSw1MCBAQAogICB0ZmxpdGU6OlRlbnNvclR5cGUgb3V0cHV0X3R5cGUoKSBjb25zdCB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHRmbGl0ZTo6VGVuc29yVHlwZT4oR2V0RmllbGQ8aW50OF90PihWVF9PVVRQVVRfVFlQRSwgMCkpOwogICB9Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDhfdD4odmVyaWZpZXIsIFZUX09VVFBVVF9UWVBFLCAxKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIEFyZ01heE9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKEFyZ01heE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBcmdNYXhPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQXJnTWF4T3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIEFyZ01heE9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oQXJnTWF4T3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBcmdNYXhPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBBcmdNYXhPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IEFyZ01heE9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBBcmdNYXhPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKICAgdm9pZCBhZGRfb3V0cHV0X3R5cGUodGZsaXRlOjpUZW5zb3JUeXBlIG91dHB1dF90eXBlKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PGludDhfdD4oQXJnTWF4T3B0aW9uczo6VlRfT1VUUFVUX1RZUEUsIHN0YXRpY19jYXN0PGludDhfdD4ob3V0cHV0X3R5cGUpLCAwKTsKICAgfQotICBleHBsaWNpdCBBcmdNYXhPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIGV4cGxpY2l0IEFyZ01heE9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8QXJnTWF4T3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QXJnTWF4T3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8QXJnTWF4T3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QXJnTWF4T3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8QXJnTWF4T3B0aW9ucz4gQ3JlYXRlQXJnTWF4T3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEFyZ01heE9wdGlvbnM+IENyZWF0ZUFyZ01heE9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCiAgICAgdGZsaXRlOjpUZW5zb3JUeXBlIG91dHB1dF90eXBlID0gdGZsaXRlOjpUZW5zb3JUeXBlX0ZMT0FUMzIpIHsKICAgQXJnTWF4T3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIGJ1aWxkZXJfLmFkZF9vdXRwdXRfdHlwZShvdXRwdXRfdHlwZSk7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBcmdNYXhPcHRpb25zPiBDcmVhdGVBcmdNYXhPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQXJnTWF4T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QXJnTWF4T3B0aW9ucz4gQ3JlYXRlQXJnTWF4T3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQXJnTWF4T3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IEFyZ01pbk9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgQXJnTWluT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIEFyZ01pbk9wdGlvbnMgVGFibGVUeXBlOwogICB0ZmxpdGU6OlRlbnNvclR5cGUgb3V0cHV0X3R5cGUgPSB0ZmxpdGU6OlRlbnNvclR5cGVfRkxPQVQzMjsKIH07CiAKLXN0cnVjdCBBcmdNaW5PcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IEFyZ01pbk9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBBcmdNaW5PcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgQXJnTWluT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKICAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKQEAgLTgzMDQsMzMzICsxMDk2MywzMzUgQEAKICAgdGZsaXRlOjpUZW5zb3JUeXBlIG91dHB1dF90eXBlKCkgY29uc3QgewogICAgIHJldHVybiBzdGF0aWNfY2FzdDx0ZmxpdGU6OlRlbnNvclR5cGU+KEdldEZpZWxkPGludDhfdD4oVlRfT1VUUFVUX1RZUEUsIDApKTsKICAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9PVVRQVVRfVFlQRSwgMSkgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBBcmdNaW5PcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhBcmdNaW5PcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8QXJnTWluT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEFyZ01pbk9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBBcmdNaW5PcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKEFyZ01pbk9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QXJnTWluT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQXJnTWluT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBBcmdNaW5PcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgQXJnTWluT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CiAgIHZvaWQgYWRkX291dHB1dF90eXBlKHRmbGl0ZTo6VGVuc29yVHlwZSBvdXRwdXRfdHlwZSkgewogICAgIGZiYl8uQWRkRWxlbWVudDxpbnQ4X3Q+KEFyZ01pbk9wdGlvbnM6OlZUX09VVFBVVF9UWVBFLCBzdGF0aWNfY2FzdDxpbnQ4X3Q+KG91dHB1dF90eXBlKSwgMCk7CiAgIH0KLSAgZXhwbGljaXQgQXJnTWluT3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICBleHBsaWNpdCBBcmdNaW5PcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PEFyZ01pbk9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEFyZ01pbk9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PEFyZ01pbk9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEFyZ01pbk9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEFyZ01pbk9wdGlvbnM+IENyZWF0ZUFyZ01pbk9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAoraW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBcmdNaW5PcHRpb25zPiBDcmVhdGVBcmdNaW5PcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAogICAgIHRmbGl0ZTo6VGVuc29yVHlwZSBvdXRwdXRfdHlwZSA9IHRmbGl0ZTo6VGVuc29yVHlwZV9GTE9BVDMyKSB7CiAgIEFyZ01pbk9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICBidWlsZGVyXy5hZGRfb3V0cHV0X3R5cGUob3V0cHV0X3R5cGUpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8QXJnTWluT3B0aW9ucz4gQ3JlYXRlQXJnTWluT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEFyZ01pbk9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEFyZ01pbk9wdGlvbnM+IENyZWF0ZUFyZ01pbk9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEFyZ01pbk9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBHcmVhdGVyT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBHcmVhdGVyT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIEdyZWF0ZXJPcHRpb25zIFRhYmxlVHlwZTsKIH07CiAKLXN0cnVjdCBHcmVhdGVyT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBHcmVhdGVyT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIEdyZWF0ZXJPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgR3JlYXRlck9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgR3JlYXRlck9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKEdyZWF0ZXJPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8R3JlYXRlck9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBHcmVhdGVyT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIEdyZWF0ZXJPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKEdyZWF0ZXJPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEdyZWF0ZXJPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBHcmVhdGVyT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBHcmVhdGVyT3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIEdyZWF0ZXJPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwotICBleHBsaWNpdCBHcmVhdGVyT3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgZXhwbGljaXQgR3JlYXRlck9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8R3JlYXRlck9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEdyZWF0ZXJPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxHcmVhdGVyT3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8R3JlYXRlck9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEdyZWF0ZXJPcHRpb25zPiBDcmVhdGVHcmVhdGVyT3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8R3JlYXRlck9wdGlvbnM+IENyZWF0ZUdyZWF0ZXJPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CiAgIEdyZWF0ZXJPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PEdyZWF0ZXJPcHRpb25zPiBDcmVhdGVHcmVhdGVyT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEdyZWF0ZXJPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxHcmVhdGVyT3B0aW9ucz4gQ3JlYXRlR3JlYXRlck9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEdyZWF0ZXJPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgR3JlYXRlckVxdWFsT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBHcmVhdGVyRXF1YWxPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgR3JlYXRlckVxdWFsT3B0aW9ucyBUYWJsZVR5cGU7CiB9OwogCi1zdHJ1Y3QgR3JlYXRlckVxdWFsT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBHcmVhdGVyRXF1YWxPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgR3JlYXRlckVxdWFsT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIEdyZWF0ZXJFcXVhbE9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgR3JlYXRlckVxdWFsT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oR3JlYXRlckVxdWFsT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PEdyZWF0ZXJFcXVhbE9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBHcmVhdGVyRXF1YWxPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgR3JlYXRlckVxdWFsT3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhHcmVhdGVyRXF1YWxPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEdyZWF0ZXJFcXVhbE9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEdyZWF0ZXJFcXVhbE9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgR3JlYXRlckVxdWFsT3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIEdyZWF0ZXJFcXVhbE9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87Ci0gIGV4cGxpY2l0IEdyZWF0ZXJFcXVhbE9wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIGV4cGxpY2l0IEdyZWF0ZXJFcXVhbE9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8R3JlYXRlckVxdWFsT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8R3JlYXRlckVxdWFsT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8R3JlYXRlckVxdWFsT3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8R3JlYXRlckVxdWFsT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8R3JlYXRlckVxdWFsT3B0aW9ucz4gQ3JlYXRlR3JlYXRlckVxdWFsT3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8R3JlYXRlckVxdWFsT3B0aW9ucz4gQ3JlYXRlR3JlYXRlckVxdWFsT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgewogICBHcmVhdGVyRXF1YWxPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PEdyZWF0ZXJFcXVhbE9wdGlvbnM+IENyZWF0ZUdyZWF0ZXJFcXVhbE9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBHcmVhdGVyRXF1YWxPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxHcmVhdGVyRXF1YWxPcHRpb25zPiBDcmVhdGVHcmVhdGVyRXF1YWxPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBHcmVhdGVyRXF1YWxPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgTGVzc09wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgTGVzc09wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBMZXNzT3B0aW9ucyBUYWJsZVR5cGU7CiB9OwogCi1zdHJ1Y3QgTGVzc09wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgTGVzc09wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBMZXNzT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIExlc3NPcHRpb25zQnVpbGRlciBCdWlsZGVyOwotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIExlc3NPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhMZXNzT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PExlc3NPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTGVzc09wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBMZXNzT3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhMZXNzT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMZXNzT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTGVzc09wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgTGVzc09wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBMZXNzT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgZXhwbGljaXQgTGVzc09wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIGV4cGxpY2l0IExlc3NPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PExlc3NPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMZXNzT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8TGVzc09wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PExlc3NPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMZXNzT3B0aW9ucz4gQ3JlYXRlTGVzc09wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PExlc3NPcHRpb25zPiBDcmVhdGVMZXNzT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgewogICBMZXNzT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMZXNzT3B0aW9ucz4gQ3JlYXRlTGVzc09wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBMZXNzT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TGVzc09wdGlvbnM+IENyZWF0ZUxlc3NPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBMZXNzT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IExlc3NFcXVhbE9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgTGVzc0VxdWFsT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIExlc3NFcXVhbE9wdGlvbnMgVGFibGVUeXBlOwogfTsKIAotc3RydWN0IExlc3NFcXVhbE9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgTGVzc0VxdWFsT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIExlc3NFcXVhbE9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBMZXNzRXF1YWxPcHRpb25zQnVpbGRlciBCdWlsZGVyOwotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIExlc3NFcXVhbE9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKExlc3NFcXVhbE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMZXNzRXF1YWxPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTGVzc0VxdWFsT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIExlc3NFcXVhbE9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oTGVzc0VxdWFsT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMZXNzRXF1YWxPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBMZXNzRXF1YWxPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IExlc3NFcXVhbE9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBMZXNzRXF1YWxPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwotICBleHBsaWNpdCBMZXNzRXF1YWxPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICBleHBsaWNpdCBMZXNzRXF1YWxPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PExlc3NFcXVhbE9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PExlc3NFcXVhbE9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PExlc3NFcXVhbE9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PExlc3NFcXVhbE9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PExlc3NFcXVhbE9wdGlvbnM+IENyZWF0ZUxlc3NFcXVhbE9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PExlc3NFcXVhbE9wdGlvbnM+IENyZWF0ZUxlc3NFcXVhbE9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKICAgTGVzc0VxdWFsT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMZXNzRXF1YWxPcHRpb25zPiBDcmVhdGVMZXNzRXF1YWxPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTGVzc0VxdWFsT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TGVzc0VxdWFsT3B0aW9ucz4gQ3JlYXRlTGVzc0VxdWFsT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTGVzc0VxdWFsT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IE5lZ09wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgTmVnT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIE5lZ09wdGlvbnMgVGFibGVUeXBlOwogfTsKIAotc3RydWN0IE5lZ09wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgTmVnT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIE5lZ09wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBOZWdPcHRpb25zQnVpbGRlciBCdWlsZGVyOwotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIE5lZ09wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKE5lZ09wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxOZWdPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTmVnT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIE5lZ09wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oTmVnT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxOZWdPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBOZWdPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IE5lZ09wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBOZWdPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwotICBleHBsaWNpdCBOZWdPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICBleHBsaWNpdCBOZWdPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PE5lZ09wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE5lZ09wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PE5lZ09wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE5lZ09wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PE5lZ09wdGlvbnM+IENyZWF0ZU5lZ09wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE5lZ09wdGlvbnM+IENyZWF0ZU5lZ09wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKICAgTmVnT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxOZWdPcHRpb25zPiBDcmVhdGVOZWdPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTmVnT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TmVnT3B0aW9ucz4gQ3JlYXRlTmVnT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTmVnT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IFNlbGVjdE9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgU2VsZWN0T3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIFNlbGVjdE9wdGlvbnMgVGFibGVUeXBlOwogfTsKIAotc3RydWN0IFNlbGVjdE9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgU2VsZWN0T3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIFNlbGVjdE9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBTZWxlY3RPcHRpb25zQnVpbGRlciBCdWlsZGVyOwotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIFNlbGVjdE9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKFNlbGVjdE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTZWxlY3RPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU2VsZWN0T3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIFNlbGVjdE9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oU2VsZWN0T3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTZWxlY3RPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTZWxlY3RPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IFNlbGVjdE9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBTZWxlY3RPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwotICBleHBsaWNpdCBTZWxlY3RPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICBleHBsaWNpdCBTZWxlY3RPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PFNlbGVjdE9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNlbGVjdE9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNlbGVjdE9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNlbGVjdE9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNlbGVjdE9wdGlvbnM+IENyZWF0ZVNlbGVjdE9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNlbGVjdE9wdGlvbnM+IENyZWF0ZVNlbGVjdE9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKICAgU2VsZWN0T3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTZWxlY3RPcHRpb25zPiBDcmVhdGVTZWxlY3RPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU2VsZWN0T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U2VsZWN0T3B0aW9ucz4gQ3JlYXRlU2VsZWN0T3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU2VsZWN0T3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IFNsaWNlT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBTbGljZU9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBTbGljZU9wdGlvbnMgVGFibGVUeXBlOwogfTsKIAotc3RydWN0IFNsaWNlT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBTbGljZU9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBTbGljZU9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBTbGljZU9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgU2xpY2VPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhTbGljZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTbGljZU9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTbGljZU9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBTbGljZU9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oU2xpY2VPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNsaWNlT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU2xpY2VPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IFNsaWNlT3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIFNsaWNlT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgZXhwbGljaXQgU2xpY2VPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICBleHBsaWNpdCBTbGljZU9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8U2xpY2VPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTbGljZU9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNsaWNlT3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U2xpY2VPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTbGljZU9wdGlvbnM+IENyZWF0ZVNsaWNlT3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U2xpY2VPcHRpb25zPiBDcmVhdGVTbGljZU9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKICAgU2xpY2VPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PFNsaWNlT3B0aW9ucz4gQ3JlYXRlU2xpY2VPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU2xpY2VPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTbGljZU9wdGlvbnM+IENyZWF0ZVNsaWNlT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU2xpY2VPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgVHJhbnNwb3NlQ29udk9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgVHJhbnNwb3NlQ29udk9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBUcmFuc3Bvc2VDb252T3B0aW9ucyBUYWJsZVR5cGU7CiAgIHRmbGl0ZTo6UGFkZGluZyBwYWRkaW5nID0gdGZsaXRlOjpQYWRkaW5nX1NBTUU7CiAgIGludDMyX3Qgc3RyaWRlX3cgPSAwOwogICBpbnQzMl90IHN0cmlkZV9oID0gMDsKICAgdGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlIGZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24gPSB0ZmxpdGU6OkFjdGl2YXRpb25GdW5jdGlvblR5cGVfTk9ORTsKKyAgdGZsaXRlOjpUZW5zb3JUeXBlIHF1YW50aXplZF9iaWFzX3R5cGUgPSB0ZmxpdGU6OlRlbnNvclR5cGVfRkxPQVQzMjsKIH07CiAKLXN0cnVjdCBUcmFuc3Bvc2VDb252T3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBUcmFuc3Bvc2VDb252T3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIFRyYW5zcG9zZUNvbnZPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgVHJhbnNwb3NlQ29udk9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CiAgICAgVlRfUEFERElORyA9IDQsCiAgICAgVlRfU1RSSURFX1cgPSA2LAogICAgIFZUX1NUUklERV9IID0gOCwKLSAgICBWVF9GVVNFRF9BQ1RJVkFUSU9OX0ZVTkNUSU9OID0gMTAKKyAgICBWVF9GVVNFRF9BQ1RJVkFUSU9OX0ZVTkNUSU9OID0gMTAsCisgICAgVlRfUVVBTlRJWkVEX0JJQVNfVFlQRSA9IDEyCiAgIH07CiAgIHRmbGl0ZTo6UGFkZGluZyBwYWRkaW5nKCkgY29uc3QgewogICAgIHJldHVybiBzdGF0aWNfY2FzdDx0ZmxpdGU6OlBhZGRpbmc+KEdldEZpZWxkPGludDhfdD4oVlRfUEFERElORywgMCkpOwpAQCAtODY0NCwyMyArMTEzMDUsMjcgQEAKICAgdGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlIGZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24oKSBjb25zdCB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZT4oR2V0RmllbGQ8aW50OF90PihWVF9GVVNFRF9BQ1RJVkFUSU9OX0ZVTkNUSU9OLCAwKSk7CiAgIH0KLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICB0ZmxpdGU6OlRlbnNvclR5cGUgcXVhbnRpemVkX2JpYXNfdHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dGZsaXRlOjpUZW5zb3JUeXBlPihHZXRGaWVsZDxpbnQ4X3Q+KFZUX1FVQU5USVpFRF9CSUFTX1RZUEUsIDApKTsKKyAgfQorICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50OF90Pih2ZXJpZmllciwgVlRfUEFERElORywgMSkgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50MzJfdD4odmVyaWZpZXIsIFZUX1NUUklERV9XLCA0KSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQzMl90Pih2ZXJpZmllciwgVlRfU1RSSURFX0gsIDQpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDhfdD4odmVyaWZpZXIsIFZUX0ZVU0VEX0FDVElWQVRJT05fRlVOQ1RJT04sIDEpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDhfdD4odmVyaWZpZXIsIFZUX1FVQU5USVpFRF9CSUFTX1RZUEUsIDEpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgVHJhbnNwb3NlQ29udk9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKFRyYW5zcG9zZUNvbnZPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8VHJhbnNwb3NlQ29udk9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBUcmFuc3Bvc2VDb252T3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIFRyYW5zcG9zZUNvbnZPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFRyYW5zcG9zZUNvbnZPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFRyYW5zcG9zZUNvbnZPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBUcmFuc3Bvc2VDb252T3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBUcmFuc3Bvc2VDb252T3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIFRyYW5zcG9zZUNvbnZPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKICAgdm9pZCBhZGRfcGFkZGluZyh0ZmxpdGU6OlBhZGRpbmcgcGFkZGluZykgewogICAgIGZiYl8uQWRkRWxlbWVudDxpbnQ4X3Q+KFRyYW5zcG9zZUNvbnZPcHRpb25zOjpWVF9QQURESU5HLCBzdGF0aWNfY2FzdDxpbnQ4X3Q+KHBhZGRpbmcpLCAwKTsKICAgfQpAQCAtODY3Myw3OCArMTEzMzgsODMgQEAKICAgdm9pZCBhZGRfZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbih0ZmxpdGU6OkFjdGl2YXRpb25GdW5jdGlvblR5cGUgZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbikgewogICAgIGZiYl8uQWRkRWxlbWVudDxpbnQ4X3Q+KFRyYW5zcG9zZUNvbnZPcHRpb25zOjpWVF9GVVNFRF9BQ1RJVkFUSU9OX0ZVTkNUSU9OLCBzdGF0aWNfY2FzdDxpbnQ4X3Q+KGZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24pLCAwKTsKICAgfQotICBleHBsaWNpdCBUcmFuc3Bvc2VDb252T3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICB2b2lkIGFkZF9xdWFudGl6ZWRfYmlhc190eXBlKHRmbGl0ZTo6VGVuc29yVHlwZSBxdWFudGl6ZWRfYmlhc190eXBlKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PGludDhfdD4oVHJhbnNwb3NlQ29udk9wdGlvbnM6OlZUX1FVQU5USVpFRF9CSUFTX1RZUEUsIHN0YXRpY19jYXN0PGludDhfdD4ocXVhbnRpemVkX2JpYXNfdHlwZSksIDApOworICB9CisgIGV4cGxpY2l0IFRyYW5zcG9zZUNvbnZPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PFRyYW5zcG9zZUNvbnZPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUcmFuc3Bvc2VDb252T3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8VHJhbnNwb3NlQ29udk9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFRyYW5zcG9zZUNvbnZPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUcmFuc3Bvc2VDb252T3B0aW9ucz4gQ3JlYXRlVHJhbnNwb3NlQ29udk9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAoraW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUcmFuc3Bvc2VDb252T3B0aW9ucz4gQ3JlYXRlVHJhbnNwb3NlQ29udk9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCiAgICAgdGZsaXRlOjpQYWRkaW5nIHBhZGRpbmcgPSB0ZmxpdGU6OlBhZGRpbmdfU0FNRSwKICAgICBpbnQzMl90IHN0cmlkZV93ID0gMCwKICAgICBpbnQzMl90IHN0cmlkZV9oID0gMCwKLSAgICB0ZmxpdGU6OkFjdGl2YXRpb25GdW5jdGlvblR5cGUgZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbiA9IHRmbGl0ZTo6QWN0aXZhdGlvbkZ1bmN0aW9uVHlwZV9OT05FKSB7CisgICAgdGZsaXRlOjpBY3RpdmF0aW9uRnVuY3Rpb25UeXBlIGZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24gPSB0ZmxpdGU6OkFjdGl2YXRpb25GdW5jdGlvblR5cGVfTk9ORSwKKyAgICB0ZmxpdGU6OlRlbnNvclR5cGUgcXVhbnRpemVkX2JpYXNfdHlwZSA9IHRmbGl0ZTo6VGVuc29yVHlwZV9GTE9BVDMyKSB7CiAgIFRyYW5zcG9zZUNvbnZPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKICAgYnVpbGRlcl8uYWRkX3N0cmlkZV9oKHN0cmlkZV9oKTsKICAgYnVpbGRlcl8uYWRkX3N0cmlkZV93KHN0cmlkZV93KTsKKyAgYnVpbGRlcl8uYWRkX3F1YW50aXplZF9iaWFzX3R5cGUocXVhbnRpemVkX2JpYXNfdHlwZSk7CiAgIGJ1aWxkZXJfLmFkZF9mdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uKGZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24pOwogICBidWlsZGVyXy5hZGRfcGFkZGluZyhwYWRkaW5nKTsKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PFRyYW5zcG9zZUNvbnZPcHRpb25zPiBDcmVhdGVUcmFuc3Bvc2VDb252T3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFRyYW5zcG9zZUNvbnZPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUcmFuc3Bvc2VDb252T3B0aW9ucz4gQ3JlYXRlVHJhbnNwb3NlQ29udk9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFRyYW5zcG9zZUNvbnZPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgRXhwYW5kRGltc09wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgRXhwYW5kRGltc09wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBFeHBhbmREaW1zT3B0aW9ucyBUYWJsZVR5cGU7CiB9OwogCi1zdHJ1Y3QgRXhwYW5kRGltc09wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgRXhwYW5kRGltc09wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBFeHBhbmREaW1zT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIEV4cGFuZERpbXNPcHRpb25zQnVpbGRlciBCdWlsZGVyOwotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIEV4cGFuZERpbXNPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhFeHBhbmREaW1zT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PEV4cGFuZERpbXNPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRXhwYW5kRGltc09wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBFeHBhbmREaW1zT3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhFeHBhbmREaW1zT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxFeHBhbmREaW1zT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRXhwYW5kRGltc09wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgRXhwYW5kRGltc09wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBFeHBhbmREaW1zT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgZXhwbGljaXQgRXhwYW5kRGltc09wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIGV4cGxpY2l0IEV4cGFuZERpbXNPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PEV4cGFuZERpbXNPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxFeHBhbmREaW1zT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8RXhwYW5kRGltc09wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEV4cGFuZERpbXNPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxFeHBhbmREaW1zT3B0aW9ucz4gQ3JlYXRlRXhwYW5kRGltc09wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEV4cGFuZERpbXNPcHRpb25zPiBDcmVhdGVFeHBhbmREaW1zT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgewogICBFeHBhbmREaW1zT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxFeHBhbmREaW1zT3B0aW9ucz4gQ3JlYXRlRXhwYW5kRGltc09wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBFeHBhbmREaW1zT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8RXhwYW5kRGltc09wdGlvbnM+IENyZWF0ZUV4cGFuZERpbXNPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBFeHBhbmREaW1zT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IFNwYXJzZVRvRGVuc2VPcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IFNwYXJzZVRvRGVuc2VPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgU3BhcnNlVG9EZW5zZU9wdGlvbnMgVGFibGVUeXBlOwogICBib29sIHZhbGlkYXRlX2luZGljZXMgPSBmYWxzZTsKIH07CiAKLXN0cnVjdCBTcGFyc2VUb0RlbnNlT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBTcGFyc2VUb0RlbnNlT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIFNwYXJzZVRvRGVuc2VPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgU3BhcnNlVG9EZW5zZU9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CkBAIC04NzUzLDEyOCArMTE0MjMsMTI4IEBACiAgIGJvb2wgdmFsaWRhdGVfaW5kaWNlcygpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8dWludDhfdD4oVlRfVkFMSURBVEVfSU5ESUNFUywgMCkgIT0gMDsKICAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50OF90Pih2ZXJpZmllciwgVlRfVkFMSURBVEVfSU5ESUNFUywgMSkgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBTcGFyc2VUb0RlbnNlT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oU3BhcnNlVG9EZW5zZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcGFyc2VUb0RlbnNlT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNwYXJzZVRvRGVuc2VPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgU3BhcnNlVG9EZW5zZU9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oU3BhcnNlVG9EZW5zZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3BhcnNlVG9EZW5zZU9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNwYXJzZVRvRGVuc2VPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IFNwYXJzZVRvRGVuc2VPcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgU3BhcnNlVG9EZW5zZU9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwogICB2b2lkIGFkZF92YWxpZGF0ZV9pbmRpY2VzKGJvb2wgdmFsaWRhdGVfaW5kaWNlcykgewogICAgIGZiYl8uQWRkRWxlbWVudDx1aW50OF90PihTcGFyc2VUb0RlbnNlT3B0aW9uczo6VlRfVkFMSURBVEVfSU5ESUNFUywgc3RhdGljX2Nhc3Q8dWludDhfdD4odmFsaWRhdGVfaW5kaWNlcyksIDApOwogICB9Ci0gIGV4cGxpY2l0IFNwYXJzZVRvRGVuc2VPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIGV4cGxpY2l0IFNwYXJzZVRvRGVuc2VPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PFNwYXJzZVRvRGVuc2VPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcGFyc2VUb0RlbnNlT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8U3BhcnNlVG9EZW5zZU9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNwYXJzZVRvRGVuc2VPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcGFyc2VUb0RlbnNlT3B0aW9ucz4gQ3JlYXRlU3BhcnNlVG9EZW5zZU9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAoraW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcGFyc2VUb0RlbnNlT3B0aW9ucz4gQ3JlYXRlU3BhcnNlVG9EZW5zZU9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCiAgICAgYm9vbCB2YWxpZGF0ZV9pbmRpY2VzID0gZmFsc2UpIHsKICAgU3BhcnNlVG9EZW5zZU9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICBidWlsZGVyXy5hZGRfdmFsaWRhdGVfaW5kaWNlcyh2YWxpZGF0ZV9pbmRpY2VzKTsKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PFNwYXJzZVRvRGVuc2VPcHRpb25zPiBDcmVhdGVTcGFyc2VUb0RlbnNlT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNwYXJzZVRvRGVuc2VPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcGFyc2VUb0RlbnNlT3B0aW9ucz4gQ3JlYXRlU3BhcnNlVG9EZW5zZU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNwYXJzZVRvRGVuc2VPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgRXF1YWxPcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IEVxdWFsT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIEVxdWFsT3B0aW9ucyBUYWJsZVR5cGU7CiB9OwogCi1zdHJ1Y3QgRXF1YWxPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IEVxdWFsT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIEVxdWFsT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIEVxdWFsT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBFcXVhbE9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKEVxdWFsT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PEVxdWFsT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEVxdWFsT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIEVxdWFsT3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhFcXVhbE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8RXF1YWxPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBFcXVhbE9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgRXF1YWxPcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgRXF1YWxPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwotICBleHBsaWNpdCBFcXVhbE9wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIGV4cGxpY2l0IEVxdWFsT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxFcXVhbE9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEVxdWFsT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8RXF1YWxPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxFcXVhbE9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEVxdWFsT3B0aW9ucz4gQ3JlYXRlRXF1YWxPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxFcXVhbE9wdGlvbnM+IENyZWF0ZUVxdWFsT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgewogICBFcXVhbE9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8RXF1YWxPcHRpb25zPiBDcmVhdGVFcXVhbE9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBFcXVhbE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEVxdWFsT3B0aW9ucz4gQ3JlYXRlRXF1YWxPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBFcXVhbE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBOb3RFcXVhbE9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgTm90RXF1YWxPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgTm90RXF1YWxPcHRpb25zIFRhYmxlVHlwZTsKIH07CiAKLXN0cnVjdCBOb3RFcXVhbE9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgTm90RXF1YWxPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgTm90RXF1YWxPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgTm90RXF1YWxPcHRpb25zQnVpbGRlciBCdWlsZGVyOwotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIE5vdEVxdWFsT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oTm90RXF1YWxPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8Tm90RXF1YWxPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTm90RXF1YWxPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgTm90RXF1YWxPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKE5vdEVxdWFsT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxOb3RFcXVhbE9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE5vdEVxdWFsT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBOb3RFcXVhbE9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBOb3RFcXVhbE9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87Ci0gIGV4cGxpY2l0IE5vdEVxdWFsT3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgZXhwbGljaXQgTm90RXF1YWxPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PE5vdEVxdWFsT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Tm90RXF1YWxPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxOb3RFcXVhbE9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE5vdEVxdWFsT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8Tm90RXF1YWxPcHRpb25zPiBDcmVhdGVOb3RFcXVhbE9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE5vdEVxdWFsT3B0aW9ucz4gQ3JlYXRlTm90RXF1YWxPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CiAgIE5vdEVxdWFsT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxOb3RFcXVhbE9wdGlvbnM+IENyZWF0ZU5vdEVxdWFsT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE5vdEVxdWFsT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Tm90RXF1YWxPcHRpb25zPiBDcmVhdGVOb3RFcXVhbE9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE5vdEVxdWFsT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IFNoYXBlT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBTaGFwZU9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBTaGFwZU9wdGlvbnMgVGFibGVUeXBlOwogICB0ZmxpdGU6OlRlbnNvclR5cGUgb3V0X3R5cGUgPSB0ZmxpdGU6OlRlbnNvclR5cGVfRkxPQVQzMjsKIH07CiAKLXN0cnVjdCBTaGFwZU9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgU2hhcGVPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgU2hhcGVPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgU2hhcGVPcHRpb25zQnVpbGRlciBCdWlsZGVyOwogICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgewpAQCAtODg4MywxMjMgKzExNTUzLDEyMyBAQAogICB0ZmxpdGU6OlRlbnNvclR5cGUgb3V0X3R5cGUoKSBjb25zdCB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHRmbGl0ZTo6VGVuc29yVHlwZT4oR2V0RmllbGQ8aW50OF90PihWVF9PVVRfVFlQRSwgMCkpOwogICB9Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDhfdD4odmVyaWZpZXIsIFZUX09VVF9UWVBFLCAxKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIFNoYXBlT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oU2hhcGVPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8U2hhcGVPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU2hhcGVPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgU2hhcGVPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFNoYXBlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTaGFwZU9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNoYXBlT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBTaGFwZU9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBTaGFwZU9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwogICB2b2lkIGFkZF9vdXRfdHlwZSh0ZmxpdGU6OlRlbnNvclR5cGUgb3V0X3R5cGUpIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8aW50OF90PihTaGFwZU9wdGlvbnM6OlZUX09VVF9UWVBFLCBzdGF0aWNfY2FzdDxpbnQ4X3Q+KG91dF90eXBlKSwgMCk7CiAgIH0KLSAgZXhwbGljaXQgU2hhcGVPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIGV4cGxpY2l0IFNoYXBlT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTaGFwZU9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNoYXBlT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8U2hhcGVPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTaGFwZU9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNoYXBlT3B0aW9ucz4gQ3JlYXRlU2hhcGVPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U2hhcGVPcHRpb25zPiBDcmVhdGVTaGFwZU9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCiAgICAgdGZsaXRlOjpUZW5zb3JUeXBlIG91dF90eXBlID0gdGZsaXRlOjpUZW5zb3JUeXBlX0ZMT0FUMzIpIHsKICAgU2hhcGVPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKICAgYnVpbGRlcl8uYWRkX291dF90eXBlKG91dF90eXBlKTsKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PFNoYXBlT3B0aW9ucz4gQ3JlYXRlU2hhcGVPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU2hhcGVPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTaGFwZU9wdGlvbnM+IENyZWF0ZVNoYXBlT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU2hhcGVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgUmFua09wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgUmFua09wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBSYW5rT3B0aW9ucyBUYWJsZVR5cGU7CiB9OwogCi1zdHJ1Y3QgUmFua09wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgUmFua09wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBSYW5rT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIFJhbmtPcHRpb25zQnVpbGRlciBCdWlsZGVyOwotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIFJhbmtPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhSYW5rT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PFJhbmtPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmFua09wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBSYW5rT3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhSYW5rT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSYW5rT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmFua09wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgUmFua09wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBSYW5rT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgZXhwbGljaXQgUmFua09wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIGV4cGxpY2l0IFJhbmtPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PFJhbmtPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSYW5rT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8UmFua09wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJhbmtPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSYW5rT3B0aW9ucz4gQ3JlYXRlUmFua09wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJhbmtPcHRpb25zPiBDcmVhdGVSYW5rT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgewogICBSYW5rT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSYW5rT3B0aW9ucz4gQ3JlYXRlUmFua09wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBSYW5rT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UmFua09wdGlvbnM+IENyZWF0ZVJhbmtPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBSYW5rT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IFBvd09wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgUG93T3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIFBvd09wdGlvbnMgVGFibGVUeXBlOwogfTsKIAotc3RydWN0IFBvd09wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgUG93T3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIFBvd09wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBQb3dPcHRpb25zQnVpbGRlciBCdWlsZGVyOwotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIFBvd09wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKFBvd09wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxQb3dPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUG93T3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIFBvd09wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oUG93T3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxQb3dPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBQb3dPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IFBvd09wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBQb3dPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwotICBleHBsaWNpdCBQb3dPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICBleHBsaWNpdCBQb3dPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PFBvd09wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFBvd09wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PFBvd09wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFBvd09wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFBvd09wdGlvbnM+IENyZWF0ZVBvd09wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFBvd09wdGlvbnM+IENyZWF0ZVBvd09wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKICAgUG93T3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxQb3dPcHRpb25zPiBDcmVhdGVQb3dPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUG93T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UG93T3B0aW9ucz4gQ3JlYXRlUG93T3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUG93T3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IEZha2VRdWFudE9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgRmFrZVF1YW50T3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIEZha2VRdWFudE9wdGlvbnMgVGFibGVUeXBlOwogICBmbG9hdCBtaW4gPSAwLjBmOwogICBmbG9hdCBtYXggPSAwLjBmOwpAQCAtOTAwNyw3ICsxMTY3Nyw3IEBACiAgIGJvb2wgbmFycm93X3JhbmdlID0gZmFsc2U7CiB9OwogCi1zdHJ1Y3QgRmFrZVF1YW50T3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBGYWtlUXVhbnRPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgRmFrZVF1YW50T3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIEZha2VRdWFudE9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CkBAIC05MDI4LDcgKzExNjk4LDcgQEAKICAgYm9vbCBuYXJyb3dfcmFuZ2UoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldEZpZWxkPHVpbnQ4X3Q+KFZUX05BUlJPV19SQU5HRSwgMCkgIT0gMDsKICAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDxmbG9hdD4odmVyaWZpZXIsIFZUX01JTiwgNCkgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8ZmxvYXQ+KHZlcmlmaWVyLCBWVF9NQVgsIDQpICYmCkBAIC05MDM2LDE1ICsxMTcwNiwxNSBAQAogICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50OF90Pih2ZXJpZmllciwgVlRfTkFSUk9XX1JBTkdFLCAxKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIEZha2VRdWFudE9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKEZha2VRdWFudE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxGYWtlUXVhbnRPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRmFrZVF1YW50T3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIEZha2VRdWFudE9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oRmFrZVF1YW50T3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxGYWtlUXVhbnRPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBGYWtlUXVhbnRPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IEZha2VRdWFudE9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBGYWtlUXVhbnRPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKICAgdm9pZCBhZGRfbWluKGZsb2F0IG1pbikgewogICAgIGZiYl8uQWRkRWxlbWVudDxmbG9hdD4oRmFrZVF1YW50T3B0aW9uczo6VlRfTUlOLCBtaW4sIDAuMGYpOwogICB9CkBAIC05MDU3LDE5ICsxMTcyNywxOSBAQAogICB2b2lkIGFkZF9uYXJyb3dfcmFuZ2UoYm9vbCBuYXJyb3dfcmFuZ2UpIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDhfdD4oRmFrZVF1YW50T3B0aW9uczo6VlRfTkFSUk9XX1JBTkdFLCBzdGF0aWNfY2FzdDx1aW50OF90PihuYXJyb3dfcmFuZ2UpLCAwKTsKICAgfQotICBleHBsaWNpdCBGYWtlUXVhbnRPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIGV4cGxpY2l0IEZha2VRdWFudE9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8RmFrZVF1YW50T3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8RmFrZVF1YW50T3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8RmFrZVF1YW50T3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8RmFrZVF1YW50T3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8RmFrZVF1YW50T3B0aW9ucz4gQ3JlYXRlRmFrZVF1YW50T3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEZha2VRdWFudE9wdGlvbnM+IENyZWF0ZUZha2VRdWFudE9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCiAgICAgZmxvYXQgbWluID0gMC4wZiwKICAgICBmbG9hdCBtYXggPSAwLjBmLAogICAgIGludDMyX3QgbnVtX2JpdHMgPSAwLApAQCAtOTA4MiwxNSArMTE3NTIsMTUgQEAKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PEZha2VRdWFudE9wdGlvbnM+IENyZWF0ZUZha2VRdWFudE9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBGYWtlUXVhbnRPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxGYWtlUXVhbnRPcHRpb25zPiBDcmVhdGVGYWtlUXVhbnRPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBGYWtlUXVhbnRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgUGFja09wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgUGFja09wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBQYWNrT3B0aW9ucyBUYWJsZVR5cGU7CiAgIGludDMyX3QgdmFsdWVzX2NvdW50ID0gMDsKICAgaW50MzJfdCBheGlzID0gMDsKIH07CiAKLXN0cnVjdCBQYWNrT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBQYWNrT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIFBhY2tPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgUGFja09wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CkBAIC05MTAzLDQwICsxMTc3Myw0MCBAQAogICBpbnQzMl90IGF4aXMoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldEZpZWxkPGludDMyX3Q+KFZUX0FYSVMsIDApOwogICB9Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDMyX3Q+KHZlcmlmaWVyLCBWVF9WQUxVRVNfQ09VTlQsIDQpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDMyX3Q+KHZlcmlmaWVyLCBWVF9BWElTLCA0KSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIFBhY2tPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhQYWNrT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PFBhY2tPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUGFja09wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBQYWNrT3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhQYWNrT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxQYWNrT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUGFja09wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgUGFja09wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBQYWNrT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CiAgIHZvaWQgYWRkX3ZhbHVlc19jb3VudChpbnQzMl90IHZhbHVlc19jb3VudCkgewogICAgIGZiYl8uQWRkRWxlbWVudDxpbnQzMl90PihQYWNrT3B0aW9uczo6VlRfVkFMVUVTX0NPVU5ULCB2YWx1ZXNfY291bnQsIDApOwogICB9CiAgIHZvaWQgYWRkX2F4aXMoaW50MzJfdCBheGlzKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PGludDMyX3Q+KFBhY2tPcHRpb25zOjpWVF9BWElTLCBheGlzLCAwKTsKICAgfQotICBleHBsaWNpdCBQYWNrT3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICBleHBsaWNpdCBQYWNrT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxQYWNrT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UGFja09wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PFBhY2tPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxQYWNrT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8UGFja09wdGlvbnM+IENyZWF0ZVBhY2tPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UGFja09wdGlvbnM+IENyZWF0ZVBhY2tPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAogICAgIGludDMyX3QgdmFsdWVzX2NvdW50ID0gMCwKICAgICBpbnQzMl90IGF4aXMgPSAwKSB7CiAgIFBhY2tPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKQEAgLTkxNDUsNTMgKzExODE1LDUzIEBACiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxQYWNrT3B0aW9ucz4gQ3JlYXRlUGFja09wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBQYWNrT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UGFja09wdGlvbnM+IENyZWF0ZVBhY2tPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBQYWNrT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IExvZ2ljYWxPck9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgTG9naWNhbE9yT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIExvZ2ljYWxPck9wdGlvbnMgVGFibGVUeXBlOwogfTsKIAotc3RydWN0IExvZ2ljYWxPck9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgTG9naWNhbE9yT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIExvZ2ljYWxPck9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBMb2dpY2FsT3JPcHRpb25zQnVpbGRlciBCdWlsZGVyOwotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIExvZ2ljYWxPck9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKExvZ2ljYWxPck9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMb2dpY2FsT3JPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTG9naWNhbE9yT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIExvZ2ljYWxPck9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oTG9naWNhbE9yT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMb2dpY2FsT3JPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBMb2dpY2FsT3JPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IExvZ2ljYWxPck9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBMb2dpY2FsT3JPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwotICBleHBsaWNpdCBMb2dpY2FsT3JPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICBleHBsaWNpdCBMb2dpY2FsT3JPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PExvZ2ljYWxPck9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PExvZ2ljYWxPck9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PExvZ2ljYWxPck9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PExvZ2ljYWxPck9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PExvZ2ljYWxPck9wdGlvbnM+IENyZWF0ZUxvZ2ljYWxPck9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PExvZ2ljYWxPck9wdGlvbnM+IENyZWF0ZUxvZ2ljYWxPck9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKICAgTG9naWNhbE9yT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMb2dpY2FsT3JPcHRpb25zPiBDcmVhdGVMb2dpY2FsT3JPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTG9naWNhbE9yT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TG9naWNhbE9yT3B0aW9ucz4gQ3JlYXRlTG9naWNhbE9yT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTG9naWNhbE9yT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IE9uZUhvdE9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgT25lSG90T3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIE9uZUhvdE9wdGlvbnMgVGFibGVUeXBlOwogICBpbnQzMl90IGF4aXMgPSAwOwogfTsKIAotc3RydWN0IE9uZUhvdE9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgT25lSG90T3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIE9uZUhvdE9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBPbmVIb3RPcHRpb25zQnVpbGRlciBCdWlsZGVyOwogICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgewpAQCAtOTIwMCwyMDcgKzExODcwLDIwNyBAQAogICBpbnQzMl90IGF4aXMoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldEZpZWxkPGludDMyX3Q+KFZUX0FYSVMsIDApOwogICB9Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDMyX3Q+KHZlcmlmaWVyLCBWVF9BWElTLCA0KSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIE9uZUhvdE9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKE9uZUhvdE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxPbmVIb3RPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgT25lSG90T3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIE9uZUhvdE9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oT25lSG90T3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxPbmVIb3RPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBPbmVIb3RPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IE9uZUhvdE9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBPbmVIb3RPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKICAgdm9pZCBhZGRfYXhpcyhpbnQzMl90IGF4aXMpIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8aW50MzJfdD4oT25lSG90T3B0aW9uczo6VlRfQVhJUywgYXhpcywgMCk7CiAgIH0KLSAgZXhwbGljaXQgT25lSG90T3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICBleHBsaWNpdCBPbmVIb3RPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PE9uZUhvdE9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE9uZUhvdE9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PE9uZUhvdE9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE9uZUhvdE9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PE9uZUhvdE9wdGlvbnM+IENyZWF0ZU9uZUhvdE9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAoraW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxPbmVIb3RPcHRpb25zPiBDcmVhdGVPbmVIb3RPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAogICAgIGludDMyX3QgYXhpcyA9IDApIHsKICAgT25lSG90T3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIGJ1aWxkZXJfLmFkZF9heGlzKGF4aXMpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8T25lSG90T3B0aW9ucz4gQ3JlYXRlT25lSG90T3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE9uZUhvdE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE9uZUhvdE9wdGlvbnM+IENyZWF0ZU9uZUhvdE9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE9uZUhvdE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBBYnNPcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IEFic09wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBBYnNPcHRpb25zIFRhYmxlVHlwZTsKIH07CiAKLXN0cnVjdCBBYnNPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IEFic09wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBBYnNPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgQWJzT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBBYnNPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhBYnNPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8QWJzT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEFic09wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBBYnNPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKEFic09wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QWJzT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQWJzT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBBYnNPcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgQWJzT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgZXhwbGljaXQgQWJzT3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgZXhwbGljaXQgQWJzT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBYnNPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBYnNPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBYnNPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBYnNPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBYnNPcHRpb25zPiBDcmVhdGVBYnNPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBYnNPcHRpb25zPiBDcmVhdGVBYnNPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CiAgIEFic09wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8QWJzT3B0aW9ucz4gQ3JlYXRlQWJzT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEFic09wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEFic09wdGlvbnM+IENyZWF0ZUFic09wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEFic09wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBIYXJkU3dpc2hPcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IEhhcmRTd2lzaE9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBIYXJkU3dpc2hPcHRpb25zIFRhYmxlVHlwZTsKIH07CiAKLXN0cnVjdCBIYXJkU3dpc2hPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IEhhcmRTd2lzaE9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBIYXJkU3dpc2hPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgSGFyZFN3aXNoT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBIYXJkU3dpc2hPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhIYXJkU3dpc2hPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8SGFyZFN3aXNoT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEhhcmRTd2lzaE9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBIYXJkU3dpc2hPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKEhhcmRTd2lzaE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8SGFyZFN3aXNoT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSGFyZFN3aXNoT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBIYXJkU3dpc2hPcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgSGFyZFN3aXNoT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgZXhwbGljaXQgSGFyZFN3aXNoT3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgZXhwbGljaXQgSGFyZFN3aXNoT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxIYXJkU3dpc2hPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxIYXJkU3dpc2hPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxIYXJkU3dpc2hPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxIYXJkU3dpc2hPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxIYXJkU3dpc2hPcHRpb25zPiBDcmVhdGVIYXJkU3dpc2hPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxIYXJkU3dpc2hPcHRpb25zPiBDcmVhdGVIYXJkU3dpc2hPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CiAgIEhhcmRTd2lzaE9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8SGFyZFN3aXNoT3B0aW9ucz4gQ3JlYXRlSGFyZFN3aXNoT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEhhcmRTd2lzaE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEhhcmRTd2lzaE9wdGlvbnM+IENyZWF0ZUhhcmRTd2lzaE9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEhhcmRTd2lzaE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBMb2dpY2FsQW5kT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBMb2dpY2FsQW5kT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIExvZ2ljYWxBbmRPcHRpb25zIFRhYmxlVHlwZTsKIH07CiAKLXN0cnVjdCBMb2dpY2FsQW5kT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBMb2dpY2FsQW5kT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIExvZ2ljYWxBbmRPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgTG9naWNhbEFuZE9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgTG9naWNhbEFuZE9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKExvZ2ljYWxBbmRPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8TG9naWNhbEFuZE9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBMb2dpY2FsQW5kT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIExvZ2ljYWxBbmRPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKExvZ2ljYWxBbmRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PExvZ2ljYWxBbmRPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBMb2dpY2FsQW5kT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBMb2dpY2FsQW5kT3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIExvZ2ljYWxBbmRPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwotICBleHBsaWNpdCBMb2dpY2FsQW5kT3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgZXhwbGljaXQgTG9naWNhbEFuZE9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8TG9naWNhbEFuZE9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PExvZ2ljYWxBbmRPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMb2dpY2FsQW5kT3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TG9naWNhbEFuZE9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PExvZ2ljYWxBbmRPcHRpb25zPiBDcmVhdGVMb2dpY2FsQW5kT3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TG9naWNhbEFuZE9wdGlvbnM+IENyZWF0ZUxvZ2ljYWxBbmRPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CiAgIExvZ2ljYWxBbmRPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PExvZ2ljYWxBbmRPcHRpb25zPiBDcmVhdGVMb2dpY2FsQW5kT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IExvZ2ljYWxBbmRPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMb2dpY2FsQW5kT3B0aW9ucz4gQ3JlYXRlTG9naWNhbEFuZE9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IExvZ2ljYWxBbmRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgTG9naWNhbE5vdE9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgTG9naWNhbE5vdE9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBMb2dpY2FsTm90T3B0aW9ucyBUYWJsZVR5cGU7CiB9OwogCi1zdHJ1Y3QgTG9naWNhbE5vdE9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgTG9naWNhbE5vdE9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBMb2dpY2FsTm90T3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIExvZ2ljYWxOb3RPcHRpb25zQnVpbGRlciBCdWlsZGVyOwotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIExvZ2ljYWxOb3RPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhMb2dpY2FsTm90T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PExvZ2ljYWxOb3RPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTG9naWNhbE5vdE9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBMb2dpY2FsTm90T3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhMb2dpY2FsTm90T3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMb2dpY2FsTm90T3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTG9naWNhbE5vdE9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgTG9naWNhbE5vdE9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBMb2dpY2FsTm90T3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgZXhwbGljaXQgTG9naWNhbE5vdE9wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIGV4cGxpY2l0IExvZ2ljYWxOb3RPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PExvZ2ljYWxOb3RPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMb2dpY2FsTm90T3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8TG9naWNhbE5vdE9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PExvZ2ljYWxOb3RPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMb2dpY2FsTm90T3B0aW9ucz4gQ3JlYXRlTG9naWNhbE5vdE9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PExvZ2ljYWxOb3RPcHRpb25zPiBDcmVhdGVMb2dpY2FsTm90T3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgewogICBMb2dpY2FsTm90T3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMb2dpY2FsTm90T3B0aW9ucz4gQ3JlYXRlTG9naWNhbE5vdE9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBMb2dpY2FsTm90T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TG9naWNhbE5vdE9wdGlvbnM+IENyZWF0ZUxvZ2ljYWxOb3RPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBMb2dpY2FsTm90T3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IFVucGFja09wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgVW5wYWNrT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIFVucGFja09wdGlvbnMgVGFibGVUeXBlOwogICBpbnQzMl90IG51bSA9IDA7CiAgIGludDMyX3QgYXhpcyA9IDA7CiB9OwogCi1zdHJ1Y3QgVW5wYWNrT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBVbnBhY2tPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgVW5wYWNrT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIFVucGFja09wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CkBAIC05NDEzLDQwICsxMjA4Myw0MCBAQAogICBpbnQzMl90IGF4aXMoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldEZpZWxkPGludDMyX3Q+KFZUX0FYSVMsIDApOwogICB9Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDMyX3Q+KHZlcmlmaWVyLCBWVF9OVU0sIDQpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDMyX3Q+KHZlcmlmaWVyLCBWVF9BWElTLCA0KSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIFVucGFja09wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKFVucGFja09wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbnBhY2tPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVW5wYWNrT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIFVucGFja09wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oVW5wYWNrT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbnBhY2tPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBVbnBhY2tPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IFVucGFja09wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBVbnBhY2tPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKICAgdm9pZCBhZGRfbnVtKGludDMyX3QgbnVtKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PGludDMyX3Q+KFVucGFja09wdGlvbnM6OlZUX05VTSwgbnVtLCAwKTsKICAgfQogICB2b2lkIGFkZF9heGlzKGludDMyX3QgYXhpcykgewogICAgIGZiYl8uQWRkRWxlbWVudDxpbnQzMl90PihVbnBhY2tPcHRpb25zOjpWVF9BWElTLCBheGlzLCAwKTsKICAgfQotICBleHBsaWNpdCBVbnBhY2tPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIGV4cGxpY2l0IFVucGFja09wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8VW5wYWNrT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VW5wYWNrT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8VW5wYWNrT3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VW5wYWNrT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8VW5wYWNrT3B0aW9ucz4gQ3JlYXRlVW5wYWNrT3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFVucGFja09wdGlvbnM+IENyZWF0ZVVucGFja09wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCiAgICAgaW50MzJfdCBudW0gPSAwLAogICAgIGludDMyX3QgYXhpcyA9IDApIHsKICAgVW5wYWNrT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CkBAIC05NDU1LDI0OCArMTIxMjUsMjQ4IEBACiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbnBhY2tPcHRpb25zPiBDcmVhdGVVbnBhY2tPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVW5wYWNrT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VW5wYWNrT3B0aW9ucz4gQ3JlYXRlVW5wYWNrT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVW5wYWNrT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IEZsb29yRGl2T3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBGbG9vckRpdk9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBGbG9vckRpdk9wdGlvbnMgVGFibGVUeXBlOwogfTsKIAotc3RydWN0IEZsb29yRGl2T3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBGbG9vckRpdk9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBGbG9vckRpdk9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBGbG9vckRpdk9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgRmxvb3JEaXZPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhGbG9vckRpdk9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxGbG9vckRpdk9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBGbG9vckRpdk9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBGbG9vckRpdk9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oRmxvb3JEaXZPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEZsb29yRGl2T3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRmxvb3JEaXZPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IEZsb29yRGl2T3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIEZsb29yRGl2T3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgZXhwbGljaXQgRmxvb3JEaXZPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICBleHBsaWNpdCBGbG9vckRpdk9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8Rmxvb3JEaXZPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxGbG9vckRpdk9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PEZsb29yRGl2T3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Rmxvb3JEaXZPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxGbG9vckRpdk9wdGlvbnM+IENyZWF0ZUZsb29yRGl2T3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Rmxvb3JEaXZPcHRpb25zPiBDcmVhdGVGbG9vckRpdk9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKICAgRmxvb3JEaXZPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PEZsb29yRGl2T3B0aW9ucz4gQ3JlYXRlRmxvb3JEaXZPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRmxvb3JEaXZPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxGbG9vckRpdk9wdGlvbnM+IENyZWF0ZUZsb29yRGl2T3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRmxvb3JEaXZPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgU3F1YXJlT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBTcXVhcmVPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgU3F1YXJlT3B0aW9ucyBUYWJsZVR5cGU7CiB9OwogCi1zdHJ1Y3QgU3F1YXJlT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBTcXVhcmVPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgU3F1YXJlT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIFNxdWFyZU9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgU3F1YXJlT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oU3F1YXJlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PFNxdWFyZU9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTcXVhcmVPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgU3F1YXJlT3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhTcXVhcmVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNxdWFyZU9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNxdWFyZU9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgU3F1YXJlT3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIFNxdWFyZU9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87Ci0gIGV4cGxpY2l0IFNxdWFyZU9wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIGV4cGxpY2l0IFNxdWFyZU9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3F1YXJlT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3F1YXJlT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8U3F1YXJlT3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3F1YXJlT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3F1YXJlT3B0aW9ucz4gQ3JlYXRlU3F1YXJlT3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3F1YXJlT3B0aW9ucz4gQ3JlYXRlU3F1YXJlT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgewogICBTcXVhcmVPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PFNxdWFyZU9wdGlvbnM+IENyZWF0ZVNxdWFyZU9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTcXVhcmVPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcXVhcmVPcHRpb25zPiBDcmVhdGVTcXVhcmVPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTcXVhcmVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgWmVyb3NMaWtlT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBaZXJvc0xpa2VPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgWmVyb3NMaWtlT3B0aW9ucyBUYWJsZVR5cGU7CiB9OwogCi1zdHJ1Y3QgWmVyb3NMaWtlT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBaZXJvc0xpa2VPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgWmVyb3NMaWtlT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIFplcm9zTGlrZU9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgWmVyb3NMaWtlT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oWmVyb3NMaWtlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PFplcm9zTGlrZU9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBaZXJvc0xpa2VPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgWmVyb3NMaWtlT3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhaZXJvc0xpa2VPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFplcm9zTGlrZU9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFplcm9zTGlrZU9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgWmVyb3NMaWtlT3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIFplcm9zTGlrZU9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87Ci0gIGV4cGxpY2l0IFplcm9zTGlrZU9wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIGV4cGxpY2l0IFplcm9zTGlrZU9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8WmVyb3NMaWtlT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8WmVyb3NMaWtlT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8WmVyb3NMaWtlT3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8WmVyb3NMaWtlT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8WmVyb3NMaWtlT3B0aW9ucz4gQ3JlYXRlWmVyb3NMaWtlT3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8WmVyb3NMaWtlT3B0aW9ucz4gQ3JlYXRlWmVyb3NMaWtlT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgewogICBaZXJvc0xpa2VPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PFplcm9zTGlrZU9wdGlvbnM+IENyZWF0ZVplcm9zTGlrZU9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBaZXJvc0xpa2VPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxaZXJvc0xpa2VPcHRpb25zPiBDcmVhdGVaZXJvc0xpa2VPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBaZXJvc0xpa2VPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgRmlsbE9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgRmlsbE9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBGaWxsT3B0aW9ucyBUYWJsZVR5cGU7CiB9OwogCi1zdHJ1Y3QgRmlsbE9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgRmlsbE9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBGaWxsT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIEZpbGxPcHRpb25zQnVpbGRlciBCdWlsZGVyOwotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIEZpbGxPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhGaWxsT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PEZpbGxPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRmlsbE9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBGaWxsT3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhGaWxsT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxGaWxsT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRmlsbE9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgRmlsbE9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBGaWxsT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgZXhwbGljaXQgRmlsbE9wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIGV4cGxpY2l0IEZpbGxPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PEZpbGxPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxGaWxsT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8RmlsbE9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEZpbGxPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxGaWxsT3B0aW9ucz4gQ3JlYXRlRmlsbE9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEZpbGxPcHRpb25zPiBDcmVhdGVGaWxsT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgewogICBGaWxsT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxGaWxsT3B0aW9ucz4gQ3JlYXRlRmlsbE9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBGaWxsT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8RmlsbE9wdGlvbnM+IENyZWF0ZUZpbGxPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBGaWxsT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IEZsb29yTW9kT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBGbG9vck1vZE9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBGbG9vck1vZE9wdGlvbnMgVGFibGVUeXBlOwogfTsKIAotc3RydWN0IEZsb29yTW9kT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBGbG9vck1vZE9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBGbG9vck1vZE9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBGbG9vck1vZE9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgRmxvb3JNb2RPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhGbG9vck1vZE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxGbG9vck1vZE9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBGbG9vck1vZE9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBGbG9vck1vZE9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oRmxvb3JNb2RPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEZsb29yTW9kT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRmxvb3JNb2RPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IEZsb29yTW9kT3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIEZsb29yTW9kT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgZXhwbGljaXQgRmxvb3JNb2RPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICBleHBsaWNpdCBGbG9vck1vZE9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8Rmxvb3JNb2RPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxGbG9vck1vZE9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PEZsb29yTW9kT3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Rmxvb3JNb2RPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxGbG9vck1vZE9wdGlvbnM+IENyZWF0ZUZsb29yTW9kT3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Rmxvb3JNb2RPcHRpb25zPiBDcmVhdGVGbG9vck1vZE9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKICAgRmxvb3JNb2RPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PEZsb29yTW9kT3B0aW9ucz4gQ3JlYXRlRmxvb3JNb2RPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRmxvb3JNb2RPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxGbG9vck1vZE9wdGlvbnM+IENyZWF0ZUZsb29yTW9kT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRmxvb3JNb2RPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgUmFuZ2VPcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IFJhbmdlT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIFJhbmdlT3B0aW9ucyBUYWJsZVR5cGU7CiB9OwogCi1zdHJ1Y3QgUmFuZ2VPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IFJhbmdlT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIFJhbmdlT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIFJhbmdlT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBSYW5nZU9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKFJhbmdlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PFJhbmdlT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJhbmdlT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIFJhbmdlT3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhSYW5nZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UmFuZ2VPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBSYW5nZU9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgUmFuZ2VPcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgUmFuZ2VPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwotICBleHBsaWNpdCBSYW5nZU9wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIGV4cGxpY2l0IFJhbmdlT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSYW5nZU9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJhbmdlT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8UmFuZ2VPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSYW5nZU9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFJhbmdlT3B0aW9ucz4gQ3JlYXRlUmFuZ2VPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSYW5nZU9wdGlvbnM+IENyZWF0ZVJhbmdlT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgewogICBSYW5nZU9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8UmFuZ2VPcHRpb25zPiBDcmVhdGVSYW5nZU9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBSYW5nZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJhbmdlT3B0aW9ucz4gQ3JlYXRlUmFuZ2VPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBSYW5nZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBMZWFreVJlbHVPcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IExlYWt5UmVsdU9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBMZWFreVJlbHVPcHRpb25zIFRhYmxlVHlwZTsKICAgZmxvYXQgYWxwaGEgPSAwLjBmOwogfTsKIAotc3RydWN0IExlYWt5UmVsdU9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgTGVha3lSZWx1T3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIExlYWt5UmVsdU9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBMZWFreVJlbHVPcHRpb25zQnVpbGRlciBCdWlsZGVyOwogICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgewpAQCAtOTcwNSw4OSArMTIzNzUsODkgQEAKICAgZmxvYXQgYWxwaGEoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldEZpZWxkPGZsb2F0PihWVF9BTFBIQSwgMC4wZik7CiAgIH0KLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8ZmxvYXQ+KHZlcmlmaWVyLCBWVF9BTFBIQSwgNCkgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBMZWFreVJlbHVPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhMZWFreVJlbHVPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8TGVha3lSZWx1T3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IExlYWt5UmVsdU9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBMZWFreVJlbHVPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKExlYWt5UmVsdU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TGVha3lSZWx1T3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTGVha3lSZWx1T3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBMZWFreVJlbHVPcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgTGVha3lSZWx1T3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CiAgIHZvaWQgYWRkX2FscGhhKGZsb2F0IGFscGhhKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PGZsb2F0PihMZWFreVJlbHVPcHRpb25zOjpWVF9BTFBIQSwgYWxwaGEsIDAuMGYpOwogICB9Ci0gIGV4cGxpY2l0IExlYWt5UmVsdU9wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgZXhwbGljaXQgTGVha3lSZWx1T3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMZWFreVJlbHVPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMZWFreVJlbHVPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMZWFreVJlbHVPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMZWFreVJlbHVPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMZWFreVJlbHVPcHRpb25zPiBDcmVhdGVMZWFreVJlbHVPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TGVha3lSZWx1T3B0aW9ucz4gQ3JlYXRlTGVha3lSZWx1T3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKICAgICBmbG9hdCBhbHBoYSA9IDAuMGYpIHsKICAgTGVha3lSZWx1T3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIGJ1aWxkZXJfLmFkZF9hbHBoYShhbHBoYSk7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMZWFreVJlbHVPcHRpb25zPiBDcmVhdGVMZWFreVJlbHVPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTGVha3lSZWx1T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TGVha3lSZWx1T3B0aW9ucz4gQ3JlYXRlTGVha3lSZWx1T3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTGVha3lSZWx1T3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IFNxdWFyZWREaWZmZXJlbmNlT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBTcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBTcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnMgVGFibGVUeXBlOwogfTsKIAotc3RydWN0IFNxdWFyZWREaWZmZXJlbmNlT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBTcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBTcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBTcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgU3F1YXJlZERpZmZlcmVuY2VPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhTcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBTcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oU3F1YXJlZERpZmZlcmVuY2VPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNxdWFyZWREaWZmZXJlbmNlT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3F1YXJlZERpZmZlcmVuY2VPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IFNxdWFyZWREaWZmZXJlbmNlT3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIFNxdWFyZWREaWZmZXJlbmNlT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgZXhwbGljaXQgU3F1YXJlZERpZmZlcmVuY2VPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICBleHBsaWNpdCBTcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3F1YXJlZERpZmZlcmVuY2VPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNxdWFyZWREaWZmZXJlbmNlT3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3F1YXJlZERpZmZlcmVuY2VPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnM+IENyZWF0ZVNxdWFyZWREaWZmZXJlbmNlT3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3F1YXJlZERpZmZlcmVuY2VPcHRpb25zPiBDcmVhdGVTcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKICAgU3F1YXJlZERpZmZlcmVuY2VPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PFNxdWFyZWREaWZmZXJlbmNlT3B0aW9ucz4gQ3JlYXRlU3F1YXJlZERpZmZlcmVuY2VPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3F1YXJlZERpZmZlcmVuY2VPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnM+IENyZWF0ZVNxdWFyZWREaWZmZXJlbmNlT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3F1YXJlZERpZmZlcmVuY2VPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgTWlycm9yUGFkT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBNaXJyb3JQYWRPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgTWlycm9yUGFkT3B0aW9ucyBUYWJsZVR5cGU7CiAgIHRmbGl0ZTo6TWlycm9yUGFkTW9kZSBtb2RlID0gdGZsaXRlOjpNaXJyb3JQYWRNb2RlX1JFRkxFQ1Q7CiB9OwogCi1zdHJ1Y3QgTWlycm9yUGFkT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBNaXJyb3JQYWRPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgTWlycm9yUGFkT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIE1pcnJvclBhZE9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CkBAIC05Nzk2LDUwICsxMjQ2Niw1MCBAQAogICB0ZmxpdGU6Ok1pcnJvclBhZE1vZGUgbW9kZSgpIGNvbnN0IHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dGZsaXRlOjpNaXJyb3JQYWRNb2RlPihHZXRGaWVsZDxpbnQ4X3Q+KFZUX01PREUsIDApKTsKICAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9NT0RFLCAxKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIE1pcnJvclBhZE9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKE1pcnJvclBhZE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNaXJyb3JQYWRPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTWlycm9yUGFkT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIE1pcnJvclBhZE9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oTWlycm9yUGFkT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNaXJyb3JQYWRPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBNaXJyb3JQYWRPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IE1pcnJvclBhZE9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBNaXJyb3JQYWRPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKICAgdm9pZCBhZGRfbW9kZSh0ZmxpdGU6Ok1pcnJvclBhZE1vZGUgbW9kZSkgewogICAgIGZiYl8uQWRkRWxlbWVudDxpbnQ4X3Q+KE1pcnJvclBhZE9wdGlvbnM6OlZUX01PREUsIHN0YXRpY19jYXN0PGludDhfdD4obW9kZSksIDApOwogICB9Ci0gIGV4cGxpY2l0IE1pcnJvclBhZE9wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgZXhwbGljaXQgTWlycm9yUGFkT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNaXJyb3JQYWRPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNaXJyb3JQYWRPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNaXJyb3JQYWRPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNaXJyb3JQYWRPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNaXJyb3JQYWRPcHRpb25zPiBDcmVhdGVNaXJyb3JQYWRPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TWlycm9yUGFkT3B0aW9ucz4gQ3JlYXRlTWlycm9yUGFkT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKICAgICB0ZmxpdGU6Ok1pcnJvclBhZE1vZGUgbW9kZSA9IHRmbGl0ZTo6TWlycm9yUGFkTW9kZV9SRUZMRUNUKSB7CiAgIE1pcnJvclBhZE9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICBidWlsZGVyXy5hZGRfbW9kZShtb2RlKTsKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PE1pcnJvclBhZE9wdGlvbnM+IENyZWF0ZU1pcnJvclBhZE9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBNaXJyb3JQYWRPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNaXJyb3JQYWRPcHRpb25zPiBDcmVhdGVNaXJyb3JQYWRPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBNaXJyb3JQYWRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgVW5pcXVlT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBVbmlxdWVPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgVW5pcXVlT3B0aW9ucyBUYWJsZVR5cGU7CiAgIHRmbGl0ZTo6VGVuc29yVHlwZSBpZHhfb3V0X3R5cGUgPSB0ZmxpdGU6OlRlbnNvclR5cGVfSU5UMzI7CiB9OwogCi1zdHJ1Y3QgVW5pcXVlT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBVbmlxdWVPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgVW5pcXVlT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIFVuaXF1ZU9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CkBAIC05ODQ4LDIwNyArMTI1MTgsMjA3IEBACiAgIHRmbGl0ZTo6VGVuc29yVHlwZSBpZHhfb3V0X3R5cGUoKSBjb25zdCB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHRmbGl0ZTo6VGVuc29yVHlwZT4oR2V0RmllbGQ8aW50OF90PihWVF9JRFhfT1VUX1RZUEUsIDIpKTsKICAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9JRFhfT1VUX1RZUEUsIDEpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgVW5pcXVlT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oVW5pcXVlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PFVuaXF1ZU9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBVbmlxdWVPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgVW5pcXVlT3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhVbmlxdWVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFVuaXF1ZU9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFVuaXF1ZU9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgVW5pcXVlT3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIFVuaXF1ZU9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwogICB2b2lkIGFkZF9pZHhfb3V0X3R5cGUodGZsaXRlOjpUZW5zb3JUeXBlIGlkeF9vdXRfdHlwZSkgewogICAgIGZiYl8uQWRkRWxlbWVudDxpbnQ4X3Q+KFVuaXF1ZU9wdGlvbnM6OlZUX0lEWF9PVVRfVFlQRSwgc3RhdGljX2Nhc3Q8aW50OF90PihpZHhfb3V0X3R5cGUpLCAyKTsKICAgfQotICBleHBsaWNpdCBVbmlxdWVPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIGV4cGxpY2l0IFVuaXF1ZU9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8VW5pcXVlT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VW5pcXVlT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8VW5pcXVlT3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VW5pcXVlT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8VW5pcXVlT3B0aW9ucz4gQ3JlYXRlVW5pcXVlT3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFVuaXF1ZU9wdGlvbnM+IENyZWF0ZVVuaXF1ZU9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCiAgICAgdGZsaXRlOjpUZW5zb3JUeXBlIGlkeF9vdXRfdHlwZSA9IHRmbGl0ZTo6VGVuc29yVHlwZV9JTlQzMikgewogICBVbmlxdWVPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKICAgYnVpbGRlcl8uYWRkX2lkeF9vdXRfdHlwZShpZHhfb3V0X3R5cGUpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8VW5pcXVlT3B0aW9ucz4gQ3JlYXRlVW5pcXVlT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFVuaXF1ZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFVuaXF1ZU9wdGlvbnM+IENyZWF0ZVVuaXF1ZU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFVuaXF1ZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBSZXZlcnNlVjJPcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IFJldmVyc2VWMk9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBSZXZlcnNlVjJPcHRpb25zIFRhYmxlVHlwZTsKIH07CiAKLXN0cnVjdCBSZXZlcnNlVjJPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IFJldmVyc2VWMk9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBSZXZlcnNlVjJPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgUmV2ZXJzZVYyT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBSZXZlcnNlVjJPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhSZXZlcnNlVjJPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8UmV2ZXJzZVYyT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJldmVyc2VWMk9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBSZXZlcnNlVjJPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFJldmVyc2VWMk9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UmV2ZXJzZVYyT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmV2ZXJzZVYyT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBSZXZlcnNlVjJPcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgUmV2ZXJzZVYyT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgZXhwbGljaXQgUmV2ZXJzZVYyT3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgZXhwbGljaXQgUmV2ZXJzZVYyT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXZlcnNlVjJPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXZlcnNlVjJPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXZlcnNlVjJPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXZlcnNlVjJPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXZlcnNlVjJPcHRpb25zPiBDcmVhdGVSZXZlcnNlVjJPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXZlcnNlVjJPcHRpb25zPiBDcmVhdGVSZXZlcnNlVjJPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CiAgIFJldmVyc2VWMk9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8UmV2ZXJzZVYyT3B0aW9ucz4gQ3JlYXRlUmV2ZXJzZVYyT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJldmVyc2VWMk9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJldmVyc2VWMk9wdGlvbnM+IENyZWF0ZVJldmVyc2VWMk9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJldmVyc2VWMk9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBBZGROT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBBZGROT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIEFkZE5PcHRpb25zIFRhYmxlVHlwZTsKIH07CiAKLXN0cnVjdCBBZGROT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBBZGROT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIEFkZE5PcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgQWRkTk9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgQWRkTk9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKEFkZE5PcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8QWRkTk9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBBZGROT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIEFkZE5PcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKEFkZE5PcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEFkZE5PcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBBZGROT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBBZGROT3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIEFkZE5PcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwotICBleHBsaWNpdCBBZGROT3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgZXhwbGljaXQgQWRkTk9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8QWRkTk9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEFkZE5PcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBZGROT3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QWRkTk9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEFkZE5PcHRpb25zPiBDcmVhdGVBZGROT3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QWRkTk9wdGlvbnM+IENyZWF0ZUFkZE5PcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CiAgIEFkZE5PcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PEFkZE5PcHRpb25zPiBDcmVhdGVBZGROT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEFkZE5PcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBZGROT3B0aW9ucz4gQ3JlYXRlQWRkTk9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEFkZE5PcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgR2F0aGVyTmRPcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IEdhdGhlck5kT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIEdhdGhlck5kT3B0aW9ucyBUYWJsZVR5cGU7CiB9OwogCi1zdHJ1Y3QgR2F0aGVyTmRPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IEdhdGhlck5kT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIEdhdGhlck5kT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIEdhdGhlck5kT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBHYXRoZXJOZE9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKEdhdGhlck5kT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PEdhdGhlck5kT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEdhdGhlck5kT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIEdhdGhlck5kT3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhHYXRoZXJOZE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8R2F0aGVyTmRPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBHYXRoZXJOZE9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgR2F0aGVyTmRPcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgR2F0aGVyTmRPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwotICBleHBsaWNpdCBHYXRoZXJOZE9wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIGV4cGxpY2l0IEdhdGhlck5kT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxHYXRoZXJOZE9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEdhdGhlck5kT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8R2F0aGVyTmRPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxHYXRoZXJOZE9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEdhdGhlck5kT3B0aW9ucz4gQ3JlYXRlR2F0aGVyTmRPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxHYXRoZXJOZE9wdGlvbnM+IENyZWF0ZUdhdGhlck5kT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgewogICBHYXRoZXJOZE9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8R2F0aGVyTmRPcHRpb25zPiBDcmVhdGVHYXRoZXJOZE9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBHYXRoZXJOZE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEdhdGhlck5kT3B0aW9ucz4gQ3JlYXRlR2F0aGVyTmRPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBHYXRoZXJOZE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBXaGVyZU9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgV2hlcmVPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgV2hlcmVPcHRpb25zIFRhYmxlVHlwZTsKIH07CiAKLXN0cnVjdCBXaGVyZU9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgV2hlcmVPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgV2hlcmVPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgV2hlcmVPcHRpb25zQnVpbGRlciBCdWlsZGVyOwotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIFdoZXJlT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oV2hlcmVPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8V2hlcmVPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgV2hlcmVPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgV2hlcmVPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFdoZXJlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxXaGVyZU9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFdoZXJlT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBXaGVyZU9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBXaGVyZU9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87Ci0gIGV4cGxpY2l0IFdoZXJlT3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgZXhwbGljaXQgV2hlcmVPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PFdoZXJlT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8V2hlcmVPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxXaGVyZU9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFdoZXJlT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8V2hlcmVPcHRpb25zPiBDcmVhdGVXaGVyZU9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFdoZXJlT3B0aW9ucz4gQ3JlYXRlV2hlcmVPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CiAgIFdoZXJlT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxXaGVyZU9wdGlvbnM+IENyZWF0ZVdoZXJlT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFdoZXJlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8V2hlcmVPcHRpb25zPiBDcmVhdGVXaGVyZU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFdoZXJlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IFJldmVyc2VTZXF1ZW5jZU9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgUmV2ZXJzZVNlcXVlbmNlT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIFJldmVyc2VTZXF1ZW5jZU9wdGlvbnMgVGFibGVUeXBlOwogICBpbnQzMl90IHNlcV9kaW0gPSAwOwogICBpbnQzMl90IGJhdGNoX2RpbSA9IDA7CiB9OwogCi1zdHJ1Y3QgUmV2ZXJzZVNlcXVlbmNlT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBSZXZlcnNlU2VxdWVuY2VPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgUmV2ZXJzZVNlcXVlbmNlT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIFJldmVyc2VTZXF1ZW5jZU9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CkBAIC0xMDA2MSw0MCArMTI3MzEsNDAgQEAKICAgaW50MzJfdCBiYXRjaF9kaW0oKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldEZpZWxkPGludDMyX3Q+KFZUX0JBVENIX0RJTSwgMCk7CiAgIH0KLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50MzJfdD4odmVyaWZpZXIsIFZUX1NFUV9ESU0sIDQpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDMyX3Q+KHZlcmlmaWVyLCBWVF9CQVRDSF9ESU0sIDQpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgUmV2ZXJzZVNlcXVlbmNlT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oUmV2ZXJzZVNlcXVlbmNlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PFJldmVyc2VTZXF1ZW5jZU9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBSZXZlcnNlU2VxdWVuY2VPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgUmV2ZXJzZVNlcXVlbmNlT3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhSZXZlcnNlU2VxdWVuY2VPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJldmVyc2VTZXF1ZW5jZU9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJldmVyc2VTZXF1ZW5jZU9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgUmV2ZXJzZVNlcXVlbmNlT3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIFJldmVyc2VTZXF1ZW5jZU9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwogICB2b2lkIGFkZF9zZXFfZGltKGludDMyX3Qgc2VxX2RpbSkgewogICAgIGZiYl8uQWRkRWxlbWVudDxpbnQzMl90PihSZXZlcnNlU2VxdWVuY2VPcHRpb25zOjpWVF9TRVFfRElNLCBzZXFfZGltLCAwKTsKICAgfQogICB2b2lkIGFkZF9iYXRjaF9kaW0oaW50MzJfdCBiYXRjaF9kaW0pIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8aW50MzJfdD4oUmV2ZXJzZVNlcXVlbmNlT3B0aW9uczo6VlRfQkFUQ0hfRElNLCBiYXRjaF9kaW0sIDApOwogICB9Ci0gIGV4cGxpY2l0IFJldmVyc2VTZXF1ZW5jZU9wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgZXhwbGljaXQgUmV2ZXJzZVNlcXVlbmNlT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXZlcnNlU2VxdWVuY2VPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXZlcnNlU2VxdWVuY2VPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXZlcnNlU2VxdWVuY2VPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXZlcnNlU2VxdWVuY2VPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXZlcnNlU2VxdWVuY2VPcHRpb25zPiBDcmVhdGVSZXZlcnNlU2VxdWVuY2VPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UmV2ZXJzZVNlcXVlbmNlT3B0aW9ucz4gQ3JlYXRlUmV2ZXJzZVNlcXVlbmNlT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKICAgICBpbnQzMl90IHNlcV9kaW0gPSAwLAogICAgIGludDMyX3QgYmF0Y2hfZGltID0gMCkgewogICBSZXZlcnNlU2VxdWVuY2VPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKQEAgLTEwMTAzLDEzMiArMTI3NzMsMTMyIEBACiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXZlcnNlU2VxdWVuY2VPcHRpb25zPiBDcmVhdGVSZXZlcnNlU2VxdWVuY2VPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmV2ZXJzZVNlcXVlbmNlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UmV2ZXJzZVNlcXVlbmNlT3B0aW9ucz4gQ3JlYXRlUmV2ZXJzZVNlcXVlbmNlT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmV2ZXJzZVNlcXVlbmNlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IE1hdHJpeERpYWdPcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IE1hdHJpeERpYWdPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgTWF0cml4RGlhZ09wdGlvbnMgVGFibGVUeXBlOwogfTsKIAotc3RydWN0IE1hdHJpeERpYWdPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IE1hdHJpeERpYWdPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgTWF0cml4RGlhZ09wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBNYXRyaXhEaWFnT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBNYXRyaXhEaWFnT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oTWF0cml4RGlhZ09wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNYXRyaXhEaWFnT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE1hdHJpeERpYWdPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgTWF0cml4RGlhZ09wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oTWF0cml4RGlhZ09wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TWF0cml4RGlhZ09wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE1hdHJpeERpYWdPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IE1hdHJpeERpYWdPcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgTWF0cml4RGlhZ09wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87Ci0gIGV4cGxpY2l0IE1hdHJpeERpYWdPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICBleHBsaWNpdCBNYXRyaXhEaWFnT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNYXRyaXhEaWFnT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TWF0cml4RGlhZ09wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PE1hdHJpeERpYWdPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNYXRyaXhEaWFnT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TWF0cml4RGlhZ09wdGlvbnM+IENyZWF0ZU1hdHJpeERpYWdPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNYXRyaXhEaWFnT3B0aW9ucz4gQ3JlYXRlTWF0cml4RGlhZ09wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKICAgTWF0cml4RGlhZ09wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8TWF0cml4RGlhZ09wdGlvbnM+IENyZWF0ZU1hdHJpeERpYWdPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTWF0cml4RGlhZ09wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE1hdHJpeERpYWdPcHRpb25zPiBDcmVhdGVNYXRyaXhEaWFnT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTWF0cml4RGlhZ09wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBRdWFudGl6ZU9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgUXVhbnRpemVPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgUXVhbnRpemVPcHRpb25zIFRhYmxlVHlwZTsKIH07CiAKLXN0cnVjdCBRdWFudGl6ZU9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgUXVhbnRpemVPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgUXVhbnRpemVPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgUXVhbnRpemVPcHRpb25zQnVpbGRlciBCdWlsZGVyOwotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIFF1YW50aXplT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oUXVhbnRpemVPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8UXVhbnRpemVPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUXVhbnRpemVPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgUXVhbnRpemVPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFF1YW50aXplT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxRdWFudGl6ZU9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFF1YW50aXplT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBRdWFudGl6ZU9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBRdWFudGl6ZU9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87Ci0gIGV4cGxpY2l0IFF1YW50aXplT3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgZXhwbGljaXQgUXVhbnRpemVPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PFF1YW50aXplT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UXVhbnRpemVPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxRdWFudGl6ZU9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFF1YW50aXplT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8UXVhbnRpemVPcHRpb25zPiBDcmVhdGVRdWFudGl6ZU9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFF1YW50aXplT3B0aW9ucz4gQ3JlYXRlUXVhbnRpemVPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CiAgIFF1YW50aXplT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxRdWFudGl6ZU9wdGlvbnM+IENyZWF0ZVF1YW50aXplT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFF1YW50aXplT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UXVhbnRpemVPcHRpb25zPiBDcmVhdGVRdWFudGl6ZU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFF1YW50aXplT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IE1hdHJpeFNldERpYWdPcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IE1hdHJpeFNldERpYWdPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgTWF0cml4U2V0RGlhZ09wdGlvbnMgVGFibGVUeXBlOwogfTsKIAotc3RydWN0IE1hdHJpeFNldERpYWdPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IE1hdHJpeFNldERpYWdPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgTWF0cml4U2V0RGlhZ09wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBNYXRyaXhTZXREaWFnT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBNYXRyaXhTZXREaWFnT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oTWF0cml4U2V0RGlhZ09wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNYXRyaXhTZXREaWFnT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE1hdHJpeFNldERpYWdPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgTWF0cml4U2V0RGlhZ09wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oTWF0cml4U2V0RGlhZ09wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TWF0cml4U2V0RGlhZ09wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE1hdHJpeFNldERpYWdPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IE1hdHJpeFNldERpYWdPcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgTWF0cml4U2V0RGlhZ09wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87Ci0gIGV4cGxpY2l0IE1hdHJpeFNldERpYWdPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICBleHBsaWNpdCBNYXRyaXhTZXREaWFnT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNYXRyaXhTZXREaWFnT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TWF0cml4U2V0RGlhZ09wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PE1hdHJpeFNldERpYWdPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNYXRyaXhTZXREaWFnT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TWF0cml4U2V0RGlhZ09wdGlvbnM+IENyZWF0ZU1hdHJpeFNldERpYWdPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNYXRyaXhTZXREaWFnT3B0aW9ucz4gQ3JlYXRlTWF0cml4U2V0RGlhZ09wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKICAgTWF0cml4U2V0RGlhZ09wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8TWF0cml4U2V0RGlhZ09wdGlvbnM+IENyZWF0ZU1hdHJpeFNldERpYWdPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTWF0cml4U2V0RGlhZ09wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE1hdHJpeFNldERpYWdPcHRpb25zPiBDcmVhdGVNYXRyaXhTZXREaWFnT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTWF0cml4U2V0RGlhZ09wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBJZk9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgSWZPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgSWZPcHRpb25zIFRhYmxlVHlwZTsKICAgaW50MzJfdCB0aGVuX3N1YmdyYXBoX2luZGV4ID0gMDsKICAgaW50MzJfdCBlbHNlX3N1YmdyYXBoX2luZGV4ID0gMDsKIH07CiAKLXN0cnVjdCBJZk9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgSWZPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgSWZPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgSWZPcHRpb25zQnVpbGRlciBCdWlsZGVyOwogICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgewpAQCAtMTAyNDEsNDAgKzEyOTExLDQwIEBACiAgIGludDMyX3QgZWxzZV9zdWJncmFwaF9pbmRleCgpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8aW50MzJfdD4oVlRfRUxTRV9TVUJHUkFQSF9JTkRFWCwgMCk7CiAgIH0KLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50MzJfdD4odmVyaWZpZXIsIFZUX1RIRU5fU1VCR1JBUEhfSU5ERVgsIDQpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDMyX3Q+KHZlcmlmaWVyLCBWVF9FTFNFX1NVQkdSQVBIX0lOREVYLCA0KSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIElmT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oSWZPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8SWZPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSWZPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgSWZPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKElmT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxJZk9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IElmT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBJZk9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBJZk9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwogICB2b2lkIGFkZF90aGVuX3N1YmdyYXBoX2luZGV4KGludDMyX3QgdGhlbl9zdWJncmFwaF9pbmRleCkgewogICAgIGZiYl8uQWRkRWxlbWVudDxpbnQzMl90PihJZk9wdGlvbnM6OlZUX1RIRU5fU1VCR1JBUEhfSU5ERVgsIHRoZW5fc3ViZ3JhcGhfaW5kZXgsIDApOwogICB9CiAgIHZvaWQgYWRkX2Vsc2Vfc3ViZ3JhcGhfaW5kZXgoaW50MzJfdCBlbHNlX3N1YmdyYXBoX2luZGV4KSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PGludDMyX3Q+KElmT3B0aW9uczo6VlRfRUxTRV9TVUJHUkFQSF9JTkRFWCwgZWxzZV9zdWJncmFwaF9pbmRleCwgMCk7CiAgIH0KLSAgZXhwbGljaXQgSWZPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIGV4cGxpY2l0IElmT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxJZk9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PElmT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8SWZPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxJZk9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PElmT3B0aW9ucz4gQ3JlYXRlSWZPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8SWZPcHRpb25zPiBDcmVhdGVJZk9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCiAgICAgaW50MzJfdCB0aGVuX3N1YmdyYXBoX2luZGV4ID0gMCwKICAgICBpbnQzMl90IGVsc2Vfc3ViZ3JhcGhfaW5kZXggPSAwKSB7CiAgIElmT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CkBAIC0xMDI4MywxNCArMTI5NTMsMTQgQEAKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PElmT3B0aW9ucz4gQ3JlYXRlSWZPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSWZPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxJZk9wdGlvbnM+IENyZWF0ZUlmT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSWZPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgQ2FsbE9uY2VPcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IENhbGxPbmNlT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIENhbGxPbmNlT3B0aW9ucyBUYWJsZVR5cGU7CiAgIGludDMyX3QgaW5pdF9zdWJncmFwaF9pbmRleCA9IDA7CiB9OwogCi1zdHJ1Y3QgQ2FsbE9uY2VPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IENhbGxPbmNlT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIENhbGxPbmNlT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIENhbGxPbmNlT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKICAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKQEAgLTEwMjk5LDUxICsxMjk2OSw1MSBAQAogICBpbnQzMl90IGluaXRfc3ViZ3JhcGhfaW5kZXgoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldEZpZWxkPGludDMyX3Q+KFZUX0lOSVRfU1VCR1JBUEhfSU5ERVgsIDApOwogICB9Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDMyX3Q+KHZlcmlmaWVyLCBWVF9JTklUX1NVQkdSQVBIX0lOREVYLCA0KSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIENhbGxPbmNlT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oQ2FsbE9uY2VPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8Q2FsbE9uY2VPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQ2FsbE9uY2VPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgQ2FsbE9uY2VPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKENhbGxPbmNlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDYWxsT25jZU9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IENhbGxPbmNlT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBDYWxsT25jZU9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBDYWxsT25jZU9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwogICB2b2lkIGFkZF9pbml0X3N1YmdyYXBoX2luZGV4KGludDMyX3QgaW5pdF9zdWJncmFwaF9pbmRleCkgewogICAgIGZiYl8uQWRkRWxlbWVudDxpbnQzMl90PihDYWxsT25jZU9wdGlvbnM6OlZUX0lOSVRfU1VCR1JBUEhfSU5ERVgsIGluaXRfc3ViZ3JhcGhfaW5kZXgsIDApOwogICB9Ci0gIGV4cGxpY2l0IENhbGxPbmNlT3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICBleHBsaWNpdCBDYWxsT25jZU9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8Q2FsbE9uY2VPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDYWxsT25jZU9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PENhbGxPbmNlT3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Q2FsbE9uY2VPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDYWxsT25jZU9wdGlvbnM+IENyZWF0ZUNhbGxPbmNlT3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PENhbGxPbmNlT3B0aW9ucz4gQ3JlYXRlQ2FsbE9uY2VPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAogICAgIGludDMyX3QgaW5pdF9zdWJncmFwaF9pbmRleCA9IDApIHsKICAgQ2FsbE9uY2VPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKICAgYnVpbGRlcl8uYWRkX2luaXRfc3ViZ3JhcGhfaW5kZXgoaW5pdF9zdWJncmFwaF9pbmRleCk7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDYWxsT25jZU9wdGlvbnM+IENyZWF0ZUNhbGxPbmNlT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IENhbGxPbmNlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Q2FsbE9uY2VPcHRpb25zPiBDcmVhdGVDYWxsT25jZU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IENhbGxPbmNlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IFdoaWxlT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBXaGlsZU9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBXaGlsZU9wdGlvbnMgVGFibGVUeXBlOwogICBpbnQzMl90IGNvbmRfc3ViZ3JhcGhfaW5kZXggPSAwOwogICBpbnQzMl90IGJvZHlfc3ViZ3JhcGhfaW5kZXggPSAwOwogfTsKIAotc3RydWN0IFdoaWxlT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBXaGlsZU9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBXaGlsZU9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBXaGlsZU9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CkBAIC0xMDM1Niw0MCArMTMwMjYsNDAgQEAKICAgaW50MzJfdCBib2R5X3N1YmdyYXBoX2luZGV4KCkgY29uc3QgewogICAgIHJldHVybiBHZXRGaWVsZDxpbnQzMl90PihWVF9CT0RZX1NVQkdSQVBIX0lOREVYLCAwKTsKICAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQzMl90Pih2ZXJpZmllciwgVlRfQ09ORF9TVUJHUkFQSF9JTkRFWCwgNCkgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50MzJfdD4odmVyaWZpZXIsIFZUX0JPRFlfU1VCR1JBUEhfSU5ERVgsIDQpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgV2hpbGVPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhXaGlsZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxXaGlsZU9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBXaGlsZU9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBXaGlsZU9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oV2hpbGVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFdoaWxlT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgV2hpbGVPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IFdoaWxlT3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIFdoaWxlT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CiAgIHZvaWQgYWRkX2NvbmRfc3ViZ3JhcGhfaW5kZXgoaW50MzJfdCBjb25kX3N1YmdyYXBoX2luZGV4KSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PGludDMyX3Q+KFdoaWxlT3B0aW9uczo6VlRfQ09ORF9TVUJHUkFQSF9JTkRFWCwgY29uZF9zdWJncmFwaF9pbmRleCwgMCk7CiAgIH0KICAgdm9pZCBhZGRfYm9keV9zdWJncmFwaF9pbmRleChpbnQzMl90IGJvZHlfc3ViZ3JhcGhfaW5kZXgpIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8aW50MzJfdD4oV2hpbGVPcHRpb25zOjpWVF9CT0RZX1NVQkdSQVBIX0lOREVYLCBib2R5X3N1YmdyYXBoX2luZGV4LCAwKTsKICAgfQotICBleHBsaWNpdCBXaGlsZU9wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgZXhwbGljaXQgV2hpbGVPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PFdoaWxlT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8V2hpbGVPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxXaGlsZU9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFdoaWxlT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8V2hpbGVPcHRpb25zPiBDcmVhdGVXaGlsZU9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAoraW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxXaGlsZU9wdGlvbnM+IENyZWF0ZVdoaWxlT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKICAgICBpbnQzMl90IGNvbmRfc3ViZ3JhcGhfaW5kZXggPSAwLAogICAgIGludDMyX3QgYm9keV9zdWJncmFwaF9pbmRleCA9IDApIHsKICAgV2hpbGVPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKQEAgLTEwMzk4LDI1MCArMTMwNjgsMjUwIEBACiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxXaGlsZU9wdGlvbnM+IENyZWF0ZVdoaWxlT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFdoaWxlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8V2hpbGVPcHRpb25zPiBDcmVhdGVXaGlsZU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFdoaWxlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IE5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IE5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgTm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnMgVGFibGVUeXBlOwogfTsKIAotc3RydWN0IE5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IE5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgTm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBOb25NYXhTdXBwcmVzc2lvblY0T3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBOb25NYXhTdXBwcmVzc2lvblY0T3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oTm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxOb25NYXhTdXBwcmVzc2lvblY0T3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgTm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oTm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Tm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IE5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgTm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87Ci0gIGV4cGxpY2l0IE5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICBleHBsaWNpdCBOb25NYXhTdXBwcmVzc2lvblY0T3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxOb25NYXhTdXBwcmVzc2lvblY0T3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Tm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PE5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxOb25NYXhTdXBwcmVzc2lvblY0T3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8Tm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnM+IENyZWF0ZU5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxOb25NYXhTdXBwcmVzc2lvblY0T3B0aW9ucz4gQ3JlYXRlTm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKICAgTm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8Tm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnM+IENyZWF0ZU5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zPiBDcmVhdGVOb25NYXhTdXBwcmVzc2lvblY0T3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBOb25NYXhTdXBwcmVzc2lvblY1T3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBOb25NYXhTdXBwcmVzc2lvblY1T3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zIFRhYmxlVHlwZTsKIH07CiAKLXN0cnVjdCBOb25NYXhTdXBwcmVzc2lvblY1T3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBOb25NYXhTdXBwcmVzc2lvblY1T3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgTm9uTWF4U3VwcHJlc3Npb25WNU9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgTm9uTWF4U3VwcHJlc3Npb25WNU9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8Tm9uTWF4U3VwcHJlc3Npb25WNU9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBOb25NYXhTdXBwcmVzc2lvblY1T3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBOb25NYXhTdXBwcmVzc2lvblY1T3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBOb25NYXhTdXBwcmVzc2lvblY1T3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwotICBleHBsaWNpdCBOb25NYXhTdXBwcmVzc2lvblY1T3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgZXhwbGljaXQgTm9uTWF4U3VwcHJlc3Npb25WNU9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8Tm9uTWF4U3VwcHJlc3Npb25WNU9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxOb25NYXhTdXBwcmVzc2lvblY1T3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Tm9uTWF4U3VwcHJlc3Npb25WNU9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zPiBDcmVhdGVOb25NYXhTdXBwcmVzc2lvblY1T3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Tm9uTWF4U3VwcHJlc3Npb25WNU9wdGlvbnM+IENyZWF0ZU5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CiAgIE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zPiBDcmVhdGVOb25NYXhTdXBwcmVzc2lvblY1T3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxOb25NYXhTdXBwcmVzc2lvblY1T3B0aW9ucz4gQ3JlYXRlTm9uTWF4U3VwcHJlc3Npb25WNU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgU2NhdHRlck5kT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBTY2F0dGVyTmRPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgU2NhdHRlck5kT3B0aW9ucyBUYWJsZVR5cGU7CiB9OwogCi1zdHJ1Y3QgU2NhdHRlck5kT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBTY2F0dGVyTmRPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgU2NhdHRlck5kT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIFNjYXR0ZXJOZE9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgU2NhdHRlck5kT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oU2NhdHRlck5kT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PFNjYXR0ZXJOZE9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTY2F0dGVyTmRPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgU2NhdHRlck5kT3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhTY2F0dGVyTmRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNjYXR0ZXJOZE9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNjYXR0ZXJOZE9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgU2NhdHRlck5kT3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIFNjYXR0ZXJOZE9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87Ci0gIGV4cGxpY2l0IFNjYXR0ZXJOZE9wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIGV4cGxpY2l0IFNjYXR0ZXJOZE9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8U2NhdHRlck5kT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U2NhdHRlck5kT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8U2NhdHRlck5kT3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U2NhdHRlck5kT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U2NhdHRlck5kT3B0aW9ucz4gQ3JlYXRlU2NhdHRlck5kT3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U2NhdHRlck5kT3B0aW9ucz4gQ3JlYXRlU2NhdHRlck5kT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgewogICBTY2F0dGVyTmRPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PFNjYXR0ZXJOZE9wdGlvbnM+IENyZWF0ZVNjYXR0ZXJOZE9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTY2F0dGVyTmRPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTY2F0dGVyTmRPcHRpb25zPiBDcmVhdGVTY2F0dGVyTmRPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTY2F0dGVyTmRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgU2VsZWN0VjJPcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IFNlbGVjdFYyT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIFNlbGVjdFYyT3B0aW9ucyBUYWJsZVR5cGU7CiB9OwogCi1zdHJ1Y3QgU2VsZWN0VjJPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IFNlbGVjdFYyT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIFNlbGVjdFYyT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIFNlbGVjdFYyT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBTZWxlY3RWMk9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKFNlbGVjdFYyT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PFNlbGVjdFYyT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNlbGVjdFYyT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIFNlbGVjdFYyT3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhTZWxlY3RWMk9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U2VsZWN0VjJPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTZWxlY3RWMk9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgU2VsZWN0VjJPcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgU2VsZWN0VjJPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwotICBleHBsaWNpdCBTZWxlY3RWMk9wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIGV4cGxpY2l0IFNlbGVjdFYyT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTZWxlY3RWMk9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNlbGVjdFYyT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8U2VsZWN0VjJPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTZWxlY3RWMk9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNlbGVjdFYyT3B0aW9ucz4gQ3JlYXRlU2VsZWN0VjJPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTZWxlY3RWMk9wdGlvbnM+IENyZWF0ZVNlbGVjdFYyT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgewogICBTZWxlY3RWMk9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8U2VsZWN0VjJPcHRpb25zPiBDcmVhdGVTZWxlY3RWMk9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTZWxlY3RWMk9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNlbGVjdFYyT3B0aW9ucz4gQ3JlYXRlU2VsZWN0VjJPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTZWxlY3RWMk9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBEZW5zaWZ5T3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBEZW5zaWZ5T3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIERlbnNpZnlPcHRpb25zIFRhYmxlVHlwZTsKIH07CiAKLXN0cnVjdCBEZW5zaWZ5T3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBEZW5zaWZ5T3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIERlbnNpZnlPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgRGVuc2lmeU9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgRGVuc2lmeU9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKERlbnNpZnlPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8RGVuc2lmeU9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBEZW5zaWZ5T3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIERlbnNpZnlPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKERlbnNpZnlPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PERlbnNpZnlPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBEZW5zaWZ5T3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBEZW5zaWZ5T3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIERlbnNpZnlPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwotICBleHBsaWNpdCBEZW5zaWZ5T3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgZXhwbGljaXQgRGVuc2lmeU9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8RGVuc2lmeU9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PERlbnNpZnlPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxEZW5zaWZ5T3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8RGVuc2lmeU9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PERlbnNpZnlPcHRpb25zPiBDcmVhdGVEZW5zaWZ5T3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8RGVuc2lmeU9wdGlvbnM+IENyZWF0ZURlbnNpZnlPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CiAgIERlbnNpZnlPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PERlbnNpZnlPcHRpb25zPiBDcmVhdGVEZW5zaWZ5T3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IERlbnNpZnlPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxEZW5zaWZ5T3B0aW9ucz4gQ3JlYXRlRGVuc2lmeU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IERlbnNpZnlPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgU2VnbWVudFN1bU9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgU2VnbWVudFN1bU9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBTZWdtZW50U3VtT3B0aW9ucyBUYWJsZVR5cGU7CiB9OwogCi1zdHJ1Y3QgU2VnbWVudFN1bU9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgU2VnbWVudFN1bU9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBTZWdtZW50U3VtT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIFNlZ21lbnRTdW1PcHRpb25zQnVpbGRlciBCdWlsZGVyOwotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIFNlZ21lbnRTdW1PcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhTZWdtZW50U3VtT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PFNlZ21lbnRTdW1PcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU2VnbWVudFN1bU9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBTZWdtZW50U3VtT3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhTZWdtZW50U3VtT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTZWdtZW50U3VtT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU2VnbWVudFN1bU9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgU2VnbWVudFN1bU9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBTZWdtZW50U3VtT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgZXhwbGljaXQgU2VnbWVudFN1bU9wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIGV4cGxpY2l0IFNlZ21lbnRTdW1PcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PFNlZ21lbnRTdW1PcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTZWdtZW50U3VtT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8U2VnbWVudFN1bU9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNlZ21lbnRTdW1PcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTZWdtZW50U3VtT3B0aW9ucz4gQ3JlYXRlU2VnbWVudFN1bU9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNlZ21lbnRTdW1PcHRpb25zPiBDcmVhdGVTZWdtZW50U3VtT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgewogICBTZWdtZW50U3VtT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTZWdtZW50U3VtT3B0aW9ucz4gQ3JlYXRlU2VnbWVudFN1bU9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTZWdtZW50U3VtT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U2VnbWVudFN1bU9wdGlvbnM+IENyZWF0ZVNlZ21lbnRTdW1PcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTZWdtZW50U3VtT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IEJhdGNoTWF0TXVsT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBCYXRjaE1hdE11bE9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBCYXRjaE1hdE11bE9wdGlvbnMgVGFibGVUeXBlOwogICBib29sIGFkal94ID0gZmFsc2U7CiAgIGJvb2wgYWRqX3kgPSBmYWxzZTsKICAgYm9vbCBhc3ltbWV0cmljX3F1YW50aXplX2lucHV0cyA9IGZhbHNlOwogfTsKIAotc3RydWN0IEJhdGNoTWF0TXVsT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBCYXRjaE1hdE11bE9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBCYXRjaE1hdE11bE9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBCYXRjaE1hdE11bE9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CkBAIC0xMDY1OCwyMiArMTMzMjgsMjIgQEAKICAgYm9vbCBhc3ltbWV0cmljX3F1YW50aXplX2lucHV0cygpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8dWludDhfdD4oVlRfQVNZTU1FVFJJQ19RVUFOVElaRV9JTlBVVFMsIDApICE9IDA7CiAgIH0KLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8dWludDhfdD4odmVyaWZpZXIsIFZUX0FESl9YLCAxKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50OF90Pih2ZXJpZmllciwgVlRfQURKX1ksIDEpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9BU1lNTUVUUklDX1FVQU5USVpFX0lOUFVUUywgMSkgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBCYXRjaE1hdE11bE9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKEJhdGNoTWF0TXVsT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PEJhdGNoTWF0TXVsT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEJhdGNoTWF0TXVsT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIEJhdGNoTWF0TXVsT3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhCYXRjaE1hdE11bE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QmF0Y2hNYXRNdWxPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBCYXRjaE1hdE11bE9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgQmF0Y2hNYXRNdWxPcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgQmF0Y2hNYXRNdWxPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKICAgdm9pZCBhZGRfYWRqX3goYm9vbCBhZGpfeCkgewogICAgIGZiYl8uQWRkRWxlbWVudDx1aW50OF90PihCYXRjaE1hdE11bE9wdGlvbnM6OlZUX0FESl9YLCBzdGF0aWNfY2FzdDx1aW50OF90PihhZGpfeCksIDApOwogICB9CkBAIC0xMDY4MywxOSArMTMzNTMsMTkgQEAKICAgdm9pZCBhZGRfYXN5bW1ldHJpY19xdWFudGl6ZV9pbnB1dHMoYm9vbCBhc3ltbWV0cmljX3F1YW50aXplX2lucHV0cykgewogICAgIGZiYl8uQWRkRWxlbWVudDx1aW50OF90PihCYXRjaE1hdE11bE9wdGlvbnM6OlZUX0FTWU1NRVRSSUNfUVVBTlRJWkVfSU5QVVRTLCBzdGF0aWNfY2FzdDx1aW50OF90Pihhc3ltbWV0cmljX3F1YW50aXplX2lucHV0cyksIDApOwogICB9Ci0gIGV4cGxpY2l0IEJhdGNoTWF0TXVsT3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICBleHBsaWNpdCBCYXRjaE1hdE11bE9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8QmF0Y2hNYXRNdWxPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCYXRjaE1hdE11bE9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PEJhdGNoTWF0TXVsT3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QmF0Y2hNYXRNdWxPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCYXRjaE1hdE11bE9wdGlvbnM+IENyZWF0ZUJhdGNoTWF0TXVsT3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEJhdGNoTWF0TXVsT3B0aW9ucz4gQ3JlYXRlQmF0Y2hNYXRNdWxPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAogICAgIGJvb2wgYWRqX3ggPSBmYWxzZSwKICAgICBib29sIGFkal95ID0gZmFsc2UsCiAgICAgYm9vbCBhc3ltbWV0cmljX3F1YW50aXplX2lucHV0cyA9IGZhbHNlKSB7CkBAIC0xMDcwNiwxNSArMTMzNzYsMTUgQEAKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PEJhdGNoTWF0TXVsT3B0aW9ucz4gQ3JlYXRlQmF0Y2hNYXRNdWxPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQmF0Y2hNYXRNdWxPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCYXRjaE1hdE11bE9wdGlvbnM+IENyZWF0ZUJhdGNoTWF0TXVsT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQmF0Y2hNYXRNdWxPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgQ3Vtc3VtT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBDdW1zdW1PcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgQ3Vtc3VtT3B0aW9ucyBUYWJsZVR5cGU7CiAgIGJvb2wgZXhjbHVzaXZlID0gZmFsc2U7CiAgIGJvb2wgcmV2ZXJzZSA9IGZhbHNlOwogfTsKIAotc3RydWN0IEN1bXN1bU9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgQ3Vtc3VtT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIEN1bXN1bU9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBDdW1zdW1PcHRpb25zQnVpbGRlciBCdWlsZGVyOwogICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgewpAQCAtMTA3MjcsNDAgKzEzMzk3LDQwIEBACiAgIGJvb2wgcmV2ZXJzZSgpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8dWludDhfdD4oVlRfUkVWRVJTRSwgMCkgIT0gMDsKICAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50OF90Pih2ZXJpZmllciwgVlRfRVhDTFVTSVZFLCAxKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50OF90Pih2ZXJpZmllciwgVlRfUkVWRVJTRSwgMSkgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBDdW1zdW1PcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhDdW1zdW1PcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8Q3Vtc3VtT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEN1bXN1bU9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBDdW1zdW1PcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKEN1bXN1bU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Q3Vtc3VtT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQ3Vtc3VtT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBDdW1zdW1PcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgQ3Vtc3VtT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CiAgIHZvaWQgYWRkX2V4Y2x1c2l2ZShib29sIGV4Y2x1c2l2ZSkgewogICAgIGZiYl8uQWRkRWxlbWVudDx1aW50OF90PihDdW1zdW1PcHRpb25zOjpWVF9FWENMVVNJVkUsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGV4Y2x1c2l2ZSksIDApOwogICB9CiAgIHZvaWQgYWRkX3JldmVyc2UoYm9vbCByZXZlcnNlKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQ4X3Q+KEN1bXN1bU9wdGlvbnM6OlZUX1JFVkVSU0UsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJldmVyc2UpLCAwKTsKICAgfQotICBleHBsaWNpdCBDdW1zdW1PcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIGV4cGxpY2l0IEN1bXN1bU9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8Q3Vtc3VtT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Q3Vtc3VtT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8Q3Vtc3VtT3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Q3Vtc3VtT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8Q3Vtc3VtT3B0aW9ucz4gQ3JlYXRlQ3Vtc3VtT3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEN1bXN1bU9wdGlvbnM+IENyZWF0ZUN1bXN1bU9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCiAgICAgYm9vbCBleGNsdXNpdmUgPSBmYWxzZSwKICAgICBib29sIHJldmVyc2UgPSBmYWxzZSkgewogICBDdW1zdW1PcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKQEAgLTEwNzY5LDk0ICsxMzQzOSw5NCBAQAogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8Q3Vtc3VtT3B0aW9ucz4gQ3JlYXRlQ3Vtc3VtT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEN1bXN1bU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEN1bXN1bU9wdGlvbnM+IENyZWF0ZUN1bXN1bU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEN1bXN1bU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBCcm9hZGNhc3RUb09wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgQnJvYWRjYXN0VG9PcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgQnJvYWRjYXN0VG9PcHRpb25zIFRhYmxlVHlwZTsKIH07CiAKLXN0cnVjdCBCcm9hZGNhc3RUb09wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgQnJvYWRjYXN0VG9PcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgQnJvYWRjYXN0VG9PcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgQnJvYWRjYXN0VG9PcHRpb25zQnVpbGRlciBCdWlsZGVyOwotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIEJyb2FkY2FzdFRvT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oQnJvYWRjYXN0VG9PcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8QnJvYWRjYXN0VG9PcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQnJvYWRjYXN0VG9PcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgQnJvYWRjYXN0VG9PcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKEJyb2FkY2FzdFRvT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCcm9hZGNhc3RUb09wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEJyb2FkY2FzdFRvT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBCcm9hZGNhc3RUb09wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBCcm9hZGNhc3RUb09wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87Ci0gIGV4cGxpY2l0IEJyb2FkY2FzdFRvT3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgZXhwbGljaXQgQnJvYWRjYXN0VG9PcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PEJyb2FkY2FzdFRvT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QnJvYWRjYXN0VG9PcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCcm9hZGNhc3RUb09wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEJyb2FkY2FzdFRvT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8QnJvYWRjYXN0VG9PcHRpb25zPiBDcmVhdGVCcm9hZGNhc3RUb09wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEJyb2FkY2FzdFRvT3B0aW9ucz4gQ3JlYXRlQnJvYWRjYXN0VG9PcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CiAgIEJyb2FkY2FzdFRvT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCcm9hZGNhc3RUb09wdGlvbnM+IENyZWF0ZUJyb2FkY2FzdFRvT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEJyb2FkY2FzdFRvT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QnJvYWRjYXN0VG9PcHRpb25zPiBDcmVhdGVCcm9hZGNhc3RUb09wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEJyb2FkY2FzdFRvT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IFJmZnQyZE9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgUmZmdDJkT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIFJmZnQyZE9wdGlvbnMgVGFibGVUeXBlOwogfTsKIAotc3RydWN0IFJmZnQyZE9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgUmZmdDJkT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIFJmZnQyZE9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBSZmZ0MmRPcHRpb25zQnVpbGRlciBCdWlsZGVyOwotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIFJmZnQyZE9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKFJmZnQyZE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZmZ0MmRPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmZmdDJkT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIFJmZnQyZE9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oUmZmdDJkT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZmZ0MmRPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBSZmZ0MmRPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IFJmZnQyZE9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBSZmZ0MmRPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwotICBleHBsaWNpdCBSZmZ0MmRPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICBleHBsaWNpdCBSZmZ0MmRPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PFJmZnQyZE9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJmZnQyZE9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PFJmZnQyZE9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJmZnQyZE9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFJmZnQyZE9wdGlvbnM+IENyZWF0ZVJmZnQyZE9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJmZnQyZE9wdGlvbnM+IENyZWF0ZVJmZnQyZE9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKICAgUmZmdDJkT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZmZ0MmRPcHRpb25zPiBDcmVhdGVSZmZ0MmRPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmZmdDJkT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UmZmdDJkT3B0aW9ucz4gQ3JlYXRlUmZmdDJkT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmZmdDJkT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IEhhc2h0YWJsZU9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgSGFzaHRhYmxlT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIEhhc2h0YWJsZU9wdGlvbnMgVGFibGVUeXBlOwogICBpbnQzMl90IHRhYmxlX2lkID0gMDsKICAgdGZsaXRlOjpUZW5zb3JUeXBlIGtleV9kdHlwZSA9IHRmbGl0ZTo6VGVuc29yVHlwZV9GTE9BVDMyOwogICB0ZmxpdGU6OlRlbnNvclR5cGUgdmFsdWVfZHR5cGUgPSB0ZmxpdGU6OlRlbnNvclR5cGVfRkxPQVQzMjsKIH07CiAKLXN0cnVjdCBIYXNodGFibGVPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IEhhc2h0YWJsZU9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBIYXNodGFibGVPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgSGFzaHRhYmxlT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKICAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKQEAgLTEwODczLDIyICsxMzU0MywyMiBAQAogICB0ZmxpdGU6OlRlbnNvclR5cGUgdmFsdWVfZHR5cGUoKSBjb25zdCB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHRmbGl0ZTo6VGVuc29yVHlwZT4oR2V0RmllbGQ8aW50OF90PihWVF9WQUxVRV9EVFlQRSwgMCkpOwogICB9Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDMyX3Q+KHZlcmlmaWVyLCBWVF9UQUJMRV9JRCwgNCkgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50OF90Pih2ZXJpZmllciwgVlRfS0VZX0RUWVBFLCAxKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9WQUxVRV9EVFlQRSwgMSkgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBIYXNodGFibGVPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhIYXNodGFibGVPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8SGFzaHRhYmxlT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEhhc2h0YWJsZU9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBIYXNodGFibGVPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKEhhc2h0YWJsZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8SGFzaHRhYmxlT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSGFzaHRhYmxlT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBIYXNodGFibGVPcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgSGFzaHRhYmxlT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CiAgIHZvaWQgYWRkX3RhYmxlX2lkKGludDMyX3QgdGFibGVfaWQpIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8aW50MzJfdD4oSGFzaHRhYmxlT3B0aW9uczo6VlRfVEFCTEVfSUQsIHRhYmxlX2lkLCAwKTsKICAgfQpAQCAtMTA4OTgsMTkgKzEzNTY4LDE5IEBACiAgIHZvaWQgYWRkX3ZhbHVlX2R0eXBlKHRmbGl0ZTo6VGVuc29yVHlwZSB2YWx1ZV9kdHlwZSkgewogICAgIGZiYl8uQWRkRWxlbWVudDxpbnQ4X3Q+KEhhc2h0YWJsZU9wdGlvbnM6OlZUX1ZBTFVFX0RUWVBFLCBzdGF0aWNfY2FzdDxpbnQ4X3Q+KHZhbHVlX2R0eXBlKSwgMCk7CiAgIH0KLSAgZXhwbGljaXQgSGFzaHRhYmxlT3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICBleHBsaWNpdCBIYXNodGFibGVPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PEhhc2h0YWJsZU9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEhhc2h0YWJsZU9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PEhhc2h0YWJsZU9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEhhc2h0YWJsZU9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEhhc2h0YWJsZU9wdGlvbnM+IENyZWF0ZUhhc2h0YWJsZU9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAoraW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxIYXNodGFibGVPcHRpb25zPiBDcmVhdGVIYXNodGFibGVPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAogICAgIGludDMyX3QgdGFibGVfaWQgPSAwLAogICAgIHRmbGl0ZTo6VGVuc29yVHlwZSBrZXlfZHR5cGUgPSB0ZmxpdGU6OlRlbnNvclR5cGVfRkxPQVQzMiwKICAgICB0ZmxpdGU6OlRlbnNvclR5cGUgdmFsdWVfZHR5cGUgPSB0ZmxpdGU6OlRlbnNvclR5cGVfRkxPQVQzMikgewpAQCAtMTA5MjEsMTQ1ICsxMzU5MSwxNDUgQEAKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PEhhc2h0YWJsZU9wdGlvbnM+IENyZWF0ZUhhc2h0YWJsZU9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBIYXNodGFibGVPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxIYXNodGFibGVPcHRpb25zPiBDcmVhdGVIYXNodGFibGVPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBIYXNodGFibGVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgSGFzaHRhYmxlRmluZE9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgSGFzaHRhYmxlRmluZE9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBIYXNodGFibGVGaW5kT3B0aW9ucyBUYWJsZVR5cGU7CiB9OwogCi1zdHJ1Y3QgSGFzaHRhYmxlRmluZE9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgSGFzaHRhYmxlRmluZE9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBIYXNodGFibGVGaW5kT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIEhhc2h0YWJsZUZpbmRPcHRpb25zQnVpbGRlciBCdWlsZGVyOwotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIEhhc2h0YWJsZUZpbmRPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhIYXNodGFibGVGaW5kT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PEhhc2h0YWJsZUZpbmRPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSGFzaHRhYmxlRmluZE9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBIYXNodGFibGVGaW5kT3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhIYXNodGFibGVGaW5kT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxIYXNodGFibGVGaW5kT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSGFzaHRhYmxlRmluZE9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgSGFzaHRhYmxlRmluZE9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBIYXNodGFibGVGaW5kT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgZXhwbGljaXQgSGFzaHRhYmxlRmluZE9wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIGV4cGxpY2l0IEhhc2h0YWJsZUZpbmRPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PEhhc2h0YWJsZUZpbmRPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxIYXNodGFibGVGaW5kT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8SGFzaHRhYmxlRmluZE9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEhhc2h0YWJsZUZpbmRPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxIYXNodGFibGVGaW5kT3B0aW9ucz4gQ3JlYXRlSGFzaHRhYmxlRmluZE9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEhhc2h0YWJsZUZpbmRPcHRpb25zPiBDcmVhdGVIYXNodGFibGVGaW5kT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgewogICBIYXNodGFibGVGaW5kT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxIYXNodGFibGVGaW5kT3B0aW9ucz4gQ3JlYXRlSGFzaHRhYmxlRmluZE9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBIYXNodGFibGVGaW5kT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8SGFzaHRhYmxlRmluZE9wdGlvbnM+IENyZWF0ZUhhc2h0YWJsZUZpbmRPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBIYXNodGFibGVGaW5kT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IEhhc2h0YWJsZUltcG9ydE9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgSGFzaHRhYmxlSW1wb3J0T3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIEhhc2h0YWJsZUltcG9ydE9wdGlvbnMgVGFibGVUeXBlOwogfTsKIAotc3RydWN0IEhhc2h0YWJsZUltcG9ydE9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgSGFzaHRhYmxlSW1wb3J0T3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIEhhc2h0YWJsZUltcG9ydE9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBIYXNodGFibGVJbXBvcnRPcHRpb25zQnVpbGRlciBCdWlsZGVyOwotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIEhhc2h0YWJsZUltcG9ydE9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKEhhc2h0YWJsZUltcG9ydE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxIYXNodGFibGVJbXBvcnRPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSGFzaHRhYmxlSW1wb3J0T3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIEhhc2h0YWJsZUltcG9ydE9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oSGFzaHRhYmxlSW1wb3J0T3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxIYXNodGFibGVJbXBvcnRPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBIYXNodGFibGVJbXBvcnRPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IEhhc2h0YWJsZUltcG9ydE9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBIYXNodGFibGVJbXBvcnRPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwotICBleHBsaWNpdCBIYXNodGFibGVJbXBvcnRPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICBleHBsaWNpdCBIYXNodGFibGVJbXBvcnRPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PEhhc2h0YWJsZUltcG9ydE9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEhhc2h0YWJsZUltcG9ydE9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PEhhc2h0YWJsZUltcG9ydE9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEhhc2h0YWJsZUltcG9ydE9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEhhc2h0YWJsZUltcG9ydE9wdGlvbnM+IENyZWF0ZUhhc2h0YWJsZUltcG9ydE9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEhhc2h0YWJsZUltcG9ydE9wdGlvbnM+IENyZWF0ZUhhc2h0YWJsZUltcG9ydE9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKICAgSGFzaHRhYmxlSW1wb3J0T3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxIYXNodGFibGVJbXBvcnRPcHRpb25zPiBDcmVhdGVIYXNodGFibGVJbXBvcnRPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSGFzaHRhYmxlSW1wb3J0T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8SGFzaHRhYmxlSW1wb3J0T3B0aW9ucz4gQ3JlYXRlSGFzaHRhYmxlSW1wb3J0T3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSGFzaHRhYmxlSW1wb3J0T3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IEhhc2h0YWJsZVNpemVPcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IEhhc2h0YWJsZVNpemVPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgSGFzaHRhYmxlU2l6ZU9wdGlvbnMgVGFibGVUeXBlOwogfTsKIAotc3RydWN0IEhhc2h0YWJsZVNpemVPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IEhhc2h0YWJsZVNpemVPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgSGFzaHRhYmxlU2l6ZU9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBIYXNodGFibGVTaXplT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBIYXNodGFibGVTaXplT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oSGFzaHRhYmxlU2l6ZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxIYXNodGFibGVTaXplT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEhhc2h0YWJsZVNpemVPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgSGFzaHRhYmxlU2l6ZU9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oSGFzaHRhYmxlU2l6ZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8SGFzaHRhYmxlU2l6ZU9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEhhc2h0YWJsZVNpemVPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IEhhc2h0YWJsZVNpemVPcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgSGFzaHRhYmxlU2l6ZU9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87Ci0gIGV4cGxpY2l0IEhhc2h0YWJsZVNpemVPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICBleHBsaWNpdCBIYXNodGFibGVTaXplT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxIYXNodGFibGVTaXplT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8SGFzaHRhYmxlU2l6ZU9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PEhhc2h0YWJsZVNpemVPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxIYXNodGFibGVTaXplT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8SGFzaHRhYmxlU2l6ZU9wdGlvbnM+IENyZWF0ZUhhc2h0YWJsZVNpemVPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxIYXNodGFibGVTaXplT3B0aW9ucz4gQ3JlYXRlSGFzaHRhYmxlU2l6ZU9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKICAgSGFzaHRhYmxlU2l6ZU9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8SGFzaHRhYmxlU2l6ZU9wdGlvbnM+IENyZWF0ZUhhc2h0YWJsZVNpemVPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSGFzaHRhYmxlU2l6ZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEhhc2h0YWJsZVNpemVPcHRpb25zPiBDcmVhdGVIYXNodGFibGVTaXplT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSGFzaHRhYmxlU2l6ZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBWYXJIYW5kbGVPcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IFZhckhhbmRsZU9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBWYXJIYW5kbGVPcHRpb25zIFRhYmxlVHlwZTsKICAgc3RkOjpzdHJpbmcgY29udGFpbmVye307CiAgIHN0ZDo6c3RyaW5nIHNoYXJlZF9uYW1le307CiB9OwogCi1zdHJ1Y3QgVmFySGFuZGxlT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBWYXJIYW5kbGVPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgVmFySGFuZGxlT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIFZhckhhbmRsZU9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CiAgICAgVlRfQ09OVEFJTkVSID0gNCwKICAgICBWVF9TSEFSRURfTkFNRSA9IDYKICAgfTsKLSAgY29uc3QgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqY29udGFpbmVyKCkgY29uc3QgewotICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpTdHJpbmcgKj4oVlRfQ09OVEFJTkVSKTsKKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6U3RyaW5nICpjb250YWluZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgOjpmbGF0YnVmZmVyczo6U3RyaW5nICo+KFZUX0NPTlRBSU5FUik7CiAgIH0KLSAgY29uc3QgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqc2hhcmVkX25hbWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqPihWVF9TSEFSRURfTkFNRSk7CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlN0cmluZyAqc2hhcmVkX25hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgOjpmbGF0YnVmZmVyczo6U3RyaW5nICo+KFZUX1NIQVJFRF9OQU1FKTsKICAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX0NPTlRBSU5FUikgJiYKICAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5U3RyaW5nKGNvbnRhaW5lcigpKSAmJgpAQCAtMTEwNjcsNDQgKzEzNzM3LDQ0IEBACiAgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVN0cmluZyhzaGFyZWRfbmFtZSgpKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIFZhckhhbmRsZU9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKFZhckhhbmRsZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxWYXJIYW5kbGVPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVmFySGFuZGxlT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIFZhckhhbmRsZU9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oVmFySGFuZGxlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxWYXJIYW5kbGVPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBWYXJIYW5kbGVPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IFZhckhhbmRsZU9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBWYXJIYW5kbGVPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwotICB2b2lkIGFkZF9jb250YWluZXIoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPiBjb250YWluZXIpIHsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIHZvaWQgYWRkX2NvbnRhaW5lcig6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6U3RyaW5nPiBjb250YWluZXIpIHsKICAgICBmYmJfLkFkZE9mZnNldChWYXJIYW5kbGVPcHRpb25zOjpWVF9DT05UQUlORVIsIGNvbnRhaW5lcik7CiAgIH0KLSAgdm9pZCBhZGRfc2hhcmVkX25hbWUoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPiBzaGFyZWRfbmFtZSkgeworICB2b2lkIGFkZF9zaGFyZWRfbmFtZSg6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6U3RyaW5nPiBzaGFyZWRfbmFtZSkgewogICAgIGZiYl8uQWRkT2Zmc2V0KFZhckhhbmRsZU9wdGlvbnM6OlZUX1NIQVJFRF9OQU1FLCBzaGFyZWRfbmFtZSk7CiAgIH0KLSAgZXhwbGljaXQgVmFySGFuZGxlT3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICBleHBsaWNpdCBWYXJIYW5kbGVPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PFZhckhhbmRsZU9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFZhckhhbmRsZU9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PFZhckhhbmRsZU9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFZhckhhbmRsZU9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFZhckhhbmRsZU9wdGlvbnM+IENyZWF0ZVZhckhhbmRsZU9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAotICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlN0cmluZz4gY29udGFpbmVyID0gMCwKLSAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+IHNoYXJlZF9uYW1lID0gMCkgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxWYXJIYW5kbGVPcHRpb25zPiBDcmVhdGVWYXJIYW5kbGVPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpTdHJpbmc+IGNvbnRhaW5lciA9IDAsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlN0cmluZz4gc2hhcmVkX25hbWUgPSAwKSB7CiAgIFZhckhhbmRsZU9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICBidWlsZGVyXy5hZGRfc2hhcmVkX25hbWUoc2hhcmVkX25hbWUpOwogICBidWlsZGVyXy5hZGRfY29udGFpbmVyKGNvbnRhaW5lcik7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8VmFySGFuZGxlT3B0aW9ucz4gQ3JlYXRlVmFySGFuZGxlT3B0aW9uc0RpcmVjdCgKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFZhckhhbmRsZU9wdGlvbnM+IENyZWF0ZVZhckhhbmRsZU9wdGlvbnNEaXJlY3QoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCiAgICAgY29uc3QgY2hhciAqY29udGFpbmVyID0gbnVsbHB0ciwKICAgICBjb25zdCBjaGFyICpzaGFyZWRfbmFtZSA9IG51bGxwdHIpIHsKICAgYXV0byBjb250YWluZXJfXyA9IGNvbnRhaW5lciA/IF9mYmIuQ3JlYXRlU3RyaW5nKGNvbnRhaW5lcikgOiAwOwpAQCAtMTExMTUsOTMgKzEzNzg1LDkzIEBACiAgICAgICBzaGFyZWRfbmFtZV9fKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxWYXJIYW5kbGVPcHRpb25zPiBDcmVhdGVWYXJIYW5kbGVPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVmFySGFuZGxlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VmFySGFuZGxlT3B0aW9ucz4gQ3JlYXRlVmFySGFuZGxlT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVmFySGFuZGxlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IFJlYWRWYXJpYWJsZU9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgUmVhZFZhcmlhYmxlT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIFJlYWRWYXJpYWJsZU9wdGlvbnMgVGFibGVUeXBlOwogfTsKIAotc3RydWN0IFJlYWRWYXJpYWJsZU9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgUmVhZFZhcmlhYmxlT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIFJlYWRWYXJpYWJsZU9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBSZWFkVmFyaWFibGVPcHRpb25zQnVpbGRlciBCdWlsZGVyOwotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIFJlYWRWYXJpYWJsZU9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKFJlYWRWYXJpYWJsZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZWFkVmFyaWFibGVPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmVhZFZhcmlhYmxlT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIFJlYWRWYXJpYWJsZU9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oUmVhZFZhcmlhYmxlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZWFkVmFyaWFibGVPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBSZWFkVmFyaWFibGVPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IFJlYWRWYXJpYWJsZU9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBSZWFkVmFyaWFibGVPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwotICBleHBsaWNpdCBSZWFkVmFyaWFibGVPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICBleHBsaWNpdCBSZWFkVmFyaWFibGVPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PFJlYWRWYXJpYWJsZU9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJlYWRWYXJpYWJsZU9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PFJlYWRWYXJpYWJsZU9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJlYWRWYXJpYWJsZU9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFJlYWRWYXJpYWJsZU9wdGlvbnM+IENyZWF0ZVJlYWRWYXJpYWJsZU9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJlYWRWYXJpYWJsZU9wdGlvbnM+IENyZWF0ZVJlYWRWYXJpYWJsZU9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKICAgUmVhZFZhcmlhYmxlT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZWFkVmFyaWFibGVPcHRpb25zPiBDcmVhdGVSZWFkVmFyaWFibGVPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmVhZFZhcmlhYmxlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UmVhZFZhcmlhYmxlT3B0aW9ucz4gQ3JlYXRlUmVhZFZhcmlhYmxlT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmVhZFZhcmlhYmxlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IEFzc2lnblZhcmlhYmxlT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBBc3NpZ25WYXJpYWJsZU9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBBc3NpZ25WYXJpYWJsZU9wdGlvbnMgVGFibGVUeXBlOwogfTsKIAotc3RydWN0IEFzc2lnblZhcmlhYmxlT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBBc3NpZ25WYXJpYWJsZU9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBBc3NpZ25WYXJpYWJsZU9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBBc3NpZ25WYXJpYWJsZU9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgQXNzaWduVmFyaWFibGVPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhBc3NpZ25WYXJpYWJsZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBc3NpZ25WYXJpYWJsZU9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBBc3NpZ25WYXJpYWJsZU9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBBc3NpZ25WYXJpYWJsZU9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oQXNzaWduVmFyaWFibGVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEFzc2lnblZhcmlhYmxlT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQXNzaWduVmFyaWFibGVPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IEFzc2lnblZhcmlhYmxlT3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIEFzc2lnblZhcmlhYmxlT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgZXhwbGljaXQgQXNzaWduVmFyaWFibGVPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICBleHBsaWNpdCBBc3NpZ25WYXJpYWJsZU9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8QXNzaWduVmFyaWFibGVPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBc3NpZ25WYXJpYWJsZU9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PEFzc2lnblZhcmlhYmxlT3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QXNzaWduVmFyaWFibGVPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBc3NpZ25WYXJpYWJsZU9wdGlvbnM+IENyZWF0ZUFzc2lnblZhcmlhYmxlT3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QXNzaWduVmFyaWFibGVPcHRpb25zPiBDcmVhdGVBc3NpZ25WYXJpYWJsZU9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKICAgQXNzaWduVmFyaWFibGVPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PEFzc2lnblZhcmlhYmxlT3B0aW9ucz4gQ3JlYXRlQXNzaWduVmFyaWFibGVPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQXNzaWduVmFyaWFibGVPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBc3NpZ25WYXJpYWJsZU9wdGlvbnM+IENyZWF0ZUFzc2lnblZhcmlhYmxlT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQXNzaWduVmFyaWFibGVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgUmFuZG9tT3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBSYW5kb21PcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgUmFuZG9tT3B0aW9ucyBUYWJsZVR5cGU7CiAgIGludDY0X3Qgc2VlZCA9IDA7CiAgIGludDY0X3Qgc2VlZDIgPSAwOwogfTsKIAotc3RydWN0IFJhbmRvbU9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgUmFuZG9tT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIFJhbmRvbU9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBSYW5kb21PcHRpb25zQnVpbGRlciBCdWlsZGVyOwogICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgewpAQCAtMTEyMTQsNDAgKzEzODg0LDQwIEBACiAgIGludDY0X3Qgc2VlZDIoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldEZpZWxkPGludDY0X3Q+KFZUX1NFRUQyLCAwKTsKICAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQ2NF90Pih2ZXJpZmllciwgVlRfU0VFRCwgOCkgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50NjRfdD4odmVyaWZpZXIsIFZUX1NFRUQyLCA4KSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIFJhbmRvbU9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKFJhbmRvbU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSYW5kb21PcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmFuZG9tT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIFJhbmRvbU9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oUmFuZG9tT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSYW5kb21PcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBSYW5kb21PcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IFJhbmRvbU9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBSYW5kb21PcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKICAgdm9pZCBhZGRfc2VlZChpbnQ2NF90IHNlZWQpIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8aW50NjRfdD4oUmFuZG9tT3B0aW9uczo6VlRfU0VFRCwgc2VlZCwgMCk7CiAgIH0KICAgdm9pZCBhZGRfc2VlZDIoaW50NjRfdCBzZWVkMikgewogICAgIGZiYl8uQWRkRWxlbWVudDxpbnQ2NF90PihSYW5kb21PcHRpb25zOjpWVF9TRUVEMiwgc2VlZDIsIDApOwogICB9Ci0gIGV4cGxpY2l0IFJhbmRvbU9wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgZXhwbGljaXQgUmFuZG9tT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSYW5kb21PcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSYW5kb21PcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSYW5kb21PcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSYW5kb21PcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSYW5kb21PcHRpb25zPiBDcmVhdGVSYW5kb21PcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UmFuZG9tT3B0aW9ucz4gQ3JlYXRlUmFuZG9tT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKICAgICBpbnQ2NF90IHNlZWQgPSAwLAogICAgIGludDY0X3Qgc2VlZDIgPSAwKSB7CiAgIFJhbmRvbU9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwpAQCAtMTEyNTYsNjEgKzEzOTI2LDYxIEBACiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSYW5kb21PcHRpb25zPiBDcmVhdGVSYW5kb21PcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmFuZG9tT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UmFuZG9tT3B0aW9ucz4gQ3JlYXRlUmFuZG9tT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmFuZG9tT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IEJ1Y2tldGl6ZU9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgQnVja2V0aXplT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIEJ1Y2tldGl6ZU9wdGlvbnMgVGFibGVUeXBlOwogICBzdGQ6OnZlY3RvcjxmbG9hdD4gYm91bmRhcmllc3t9OwogfTsKIAotc3RydWN0IEJ1Y2tldGl6ZU9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgQnVja2V0aXplT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIEJ1Y2tldGl6ZU9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBCdWNrZXRpemVPcHRpb25zQnVpbGRlciBCdWlsZGVyOwogICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgewogICAgIFZUX0JPVU5EQVJJRVMgPSA0CiAgIH07Ci0gIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxvYXQ+ICpib3VuZGFyaWVzKCkgY29uc3QgewotICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxvYXQ+ICo+KFZUX0JPVU5EQVJJRVMpOworICBjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8ZmxvYXQ+ICpib3VuZGFyaWVzKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbG9hdD4gKj4oVlRfQk9VTkRBUklFUyk7CiAgIH0KLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9CT1VOREFSSUVTKSAmJgogICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IoYm91bmRhcmllcygpKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIEJ1Y2tldGl6ZU9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKEJ1Y2tldGl6ZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCdWNrZXRpemVPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQnVja2V0aXplT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIEJ1Y2tldGl6ZU9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oQnVja2V0aXplT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCdWNrZXRpemVPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBCdWNrZXRpemVPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IEJ1Y2tldGl6ZU9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBCdWNrZXRpemVPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwotICB2b2lkIGFkZF9ib3VuZGFyaWVzKGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbG9hdD4+IGJvdW5kYXJpZXMpIHsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIHZvaWQgYWRkX2JvdW5kYXJpZXMoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbG9hdD4+IGJvdW5kYXJpZXMpIHsKICAgICBmYmJfLkFkZE9mZnNldChCdWNrZXRpemVPcHRpb25zOjpWVF9CT1VOREFSSUVTLCBib3VuZGFyaWVzKTsKICAgfQotICBleHBsaWNpdCBCdWNrZXRpemVPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIGV4cGxpY2l0IEJ1Y2tldGl6ZU9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8QnVja2V0aXplT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QnVja2V0aXplT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8QnVja2V0aXplT3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QnVja2V0aXplT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8QnVja2V0aXplT3B0aW9ucz4gQ3JlYXRlQnVja2V0aXplT3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCi0gICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGZsb2F0Pj4gYm91bmRhcmllcyA9IDApIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QnVja2V0aXplT3B0aW9ucz4gQ3JlYXRlQnVja2V0aXplT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGZsb2F0Pj4gYm91bmRhcmllcyA9IDApIHsKICAgQnVja2V0aXplT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIGJ1aWxkZXJfLmFkZF9ib3VuZGFyaWVzKGJvdW5kYXJpZXMpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEJ1Y2tldGl6ZU9wdGlvbnM+IENyZWF0ZUJ1Y2tldGl6ZU9wdGlvbnNEaXJlY3QoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAoraW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCdWNrZXRpemVPcHRpb25zPiBDcmVhdGVCdWNrZXRpemVPcHRpb25zRGlyZWN0KAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGZsb2F0PiAqYm91bmRhcmllcyA9IG51bGxwdHIpIHsKICAgYXV0byBib3VuZGFyaWVzX18gPSBib3VuZGFyaWVzID8gX2ZiYi5DcmVhdGVWZWN0b3I8ZmxvYXQ+KCpib3VuZGFyaWVzKSA6IDA7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZUJ1Y2tldGl6ZU9wdGlvbnMoCkBAIC0xMTMxOCwxNCArMTM5ODgsMTQgQEAKICAgICAgIGJvdW5kYXJpZXNfXyk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8QnVja2V0aXplT3B0aW9ucz4gQ3JlYXRlQnVja2V0aXplT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEJ1Y2tldGl6ZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEJ1Y2tldGl6ZU9wdGlvbnM+IENyZWF0ZUJ1Y2tldGl6ZU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEJ1Y2tldGl6ZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBHZWx1T3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBHZWx1T3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIEdlbHVPcHRpb25zIFRhYmxlVHlwZTsKICAgYm9vbCBhcHByb3hpbWF0ZSA9IGZhbHNlOwogfTsKIAotc3RydWN0IEdlbHVPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IEdlbHVPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgR2VsdU9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBHZWx1T3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKICAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKQEAgLTExMzM0LDQzNSArMTQwMDQsNTI2IEBACiAgIGJvb2wgYXBwcm94aW1hdGUoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldEZpZWxkPHVpbnQ4X3Q+KFZUX0FQUFJPWElNQVRFLCAwKSAhPSAwOwogICB9Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ4X3Q+KHZlcmlmaWVyLCBWVF9BUFBST1hJTUFURSwgMSkgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBHZWx1T3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oR2VsdU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxHZWx1T3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEdlbHVPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgR2VsdU9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oR2VsdU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8R2VsdU9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEdlbHVPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IEdlbHVPcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgR2VsdU9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwogICB2b2lkIGFkZF9hcHByb3hpbWF0ZShib29sIGFwcHJveGltYXRlKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQ4X3Q+KEdlbHVPcHRpb25zOjpWVF9BUFBST1hJTUFURSwgc3RhdGljX2Nhc3Q8dWludDhfdD4oYXBwcm94aW1hdGUpLCAwKTsKICAgfQotICBleHBsaWNpdCBHZWx1T3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICBleHBsaWNpdCBHZWx1T3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxHZWx1T3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8R2VsdU9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PEdlbHVPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxHZWx1T3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8R2VsdU9wdGlvbnM+IENyZWF0ZUdlbHVPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8R2VsdU9wdGlvbnM+IENyZWF0ZUdlbHVPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAogICAgIGJvb2wgYXBwcm94aW1hdGUgPSBmYWxzZSkgewogICBHZWx1T3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIGJ1aWxkZXJfLmFkZF9hcHByb3hpbWF0ZShhcHByb3hpbWF0ZSk7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxHZWx1T3B0aW9ucz4gQ3JlYXRlR2VsdU9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBHZWx1T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8R2VsdU9wdGlvbnM+IENyZWF0ZUdlbHVPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBHZWx1T3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgRHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnMgVGFibGVUeXBlOwogfTsKIAotc3RydWN0IER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgRHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBEeW5hbWljVXBkYXRlU2xpY2VPcHRpb25zQnVpbGRlciBCdWlsZGVyOwotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxEeW5hbWljVXBkYXRlU2xpY2VPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oRHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxEeW5hbWljVXBkYXRlU2xpY2VPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBEeW5hbWljVXBkYXRlU2xpY2VPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBEeW5hbWljVXBkYXRlU2xpY2VPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwotICBleHBsaWNpdCBEeW5hbWljVXBkYXRlU2xpY2VPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICBleHBsaWNpdCBEeW5hbWljVXBkYXRlU2xpY2VPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnM+IENyZWF0ZUR5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnM+IENyZWF0ZUR5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKICAgRHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxEeW5hbWljVXBkYXRlU2xpY2VPcHRpb25zPiBDcmVhdGVEeW5hbWljVXBkYXRlU2xpY2VPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8RHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9ucz4gQ3JlYXRlRHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IFVuc29ydGVkU2VnbWVudFByb2RPcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IFVuc29ydGVkU2VnbWVudFByb2RPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgVW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnMgVGFibGVUeXBlOwogfTsKIAotc3RydWN0IFVuc29ydGVkU2VnbWVudFByb2RPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IFVuc29ydGVkU2VnbWVudFByb2RPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgVW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oVW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFVuc29ydGVkU2VnbWVudFByb2RPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgVW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oVW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFVuc29ydGVkU2VnbWVudFByb2RPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IFVuc29ydGVkU2VnbWVudFByb2RPcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgVW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87Ci0gIGV4cGxpY2l0IFVuc29ydGVkU2VnbWVudFByb2RPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICBleHBsaWNpdCBVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PFVuc29ydGVkU2VnbWVudFByb2RPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8VW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnM+IENyZWF0ZVVuc29ydGVkU2VnbWVudFByb2RPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9ucz4gQ3JlYXRlVW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKICAgVW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8VW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnM+IENyZWF0ZVVuc29ydGVkU2VnbWVudFByb2RPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFVuc29ydGVkU2VnbWVudFByb2RPcHRpb25zPiBDcmVhdGVVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IFVuc29ydGVkU2VnbWVudE1heE9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zIFRhYmxlVHlwZTsKIH07CiAKLXN0cnVjdCBVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IFVuc29ydGVkU2VnbWVudE1heE9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgVW5zb3J0ZWRTZWdtZW50TWF4T3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8VW5zb3J0ZWRTZWdtZW50TWF4T3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFVuc29ydGVkU2VnbWVudE1heE9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFVuc29ydGVkU2VnbWVudE1heE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VW5zb3J0ZWRTZWdtZW50TWF4T3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVW5zb3J0ZWRTZWdtZW50TWF4T3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgVW5zb3J0ZWRTZWdtZW50TWF4T3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgZXhwbGljaXQgVW5zb3J0ZWRTZWdtZW50TWF4T3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgZXhwbGljaXQgVW5zb3J0ZWRTZWdtZW50TWF4T3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zPiBDcmVhdGVVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zPiBDcmVhdGVVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CiAgIFVuc29ydGVkU2VnbWVudE1heE9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8VW5zb3J0ZWRTZWdtZW50TWF4T3B0aW9ucz4gQ3JlYXRlVW5zb3J0ZWRTZWdtZW50TWF4T3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFVuc29ydGVkU2VnbWVudE1heE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFVuc29ydGVkU2VnbWVudE1heE9wdGlvbnM+IENyZWF0ZVVuc29ydGVkU2VnbWVudE1heE9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFVuc29ydGVkU2VnbWVudE1heE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IFVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zIFRhYmxlVHlwZTsKIH07CiAKLXN0cnVjdCBVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IFVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgVW5zb3J0ZWRTZWdtZW50U3VtT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8VW5zb3J0ZWRTZWdtZW50U3VtT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VW5zb3J0ZWRTZWdtZW50U3VtT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVW5zb3J0ZWRTZWdtZW50U3VtT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgVW5zb3J0ZWRTZWdtZW50U3VtT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgZXhwbGljaXQgVW5zb3J0ZWRTZWdtZW50U3VtT3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgZXhwbGljaXQgVW5zb3J0ZWRTZWdtZW50U3VtT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zPiBDcmVhdGVVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zPiBDcmVhdGVVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CiAgIFVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8VW5zb3J0ZWRTZWdtZW50U3VtT3B0aW9ucz4gQ3JlYXRlVW5zb3J0ZWRTZWdtZW50U3VtT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnM+IENyZWF0ZVVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBBVGFuMk9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgQVRhbjJPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgQVRhbjJPcHRpb25zIFRhYmxlVHlwZTsKIH07CiAKLXN0cnVjdCBBVGFuMk9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgQVRhbjJPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgQVRhbjJPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgQVRhbjJPcHRpb25zQnVpbGRlciBCdWlsZGVyOwotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIEFUYW4yT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oQVRhbjJPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8QVRhbjJPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQVRhbjJPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgQVRhbjJPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKEFUYW4yT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBVGFuMk9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEFUYW4yT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBBVGFuMk9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBBVGFuMk9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87Ci0gIGV4cGxpY2l0IEFUYW4yT3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgZXhwbGljaXQgQVRhbjJPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PEFUYW4yT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QVRhbjJPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBVGFuMk9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEFUYW4yT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8QVRhbjJPcHRpb25zPiBDcmVhdGVBVGFuMk9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEFUYW4yT3B0aW9ucz4gQ3JlYXRlQVRhbjJPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CiAgIEFUYW4yT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBVGFuMk9wdGlvbnM+IENyZWF0ZUFUYW4yT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEFUYW4yT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QVRhbjJPcHRpb25zPiBDcmVhdGVBVGFuMk9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEFUYW4yT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IFVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgVW5zb3J0ZWRTZWdtZW50TWluT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIFVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnMgVGFibGVUeXBlOwogfTsKIAotc3RydWN0IFVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgVW5zb3J0ZWRTZWdtZW50TWluT3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIFVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zQnVpbGRlciBCdWlsZGVyOwotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIFVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKFVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVW5zb3J0ZWRTZWdtZW50TWluT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIFVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oVW5zb3J0ZWRTZWdtZW50TWluT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IFVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwotICBleHBsaWNpdCBVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICBleHBsaWNpdCBVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PFVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PFVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnM+IENyZWF0ZVVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnM+IENyZWF0ZVVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKICAgVW5zb3J0ZWRTZWdtZW50TWluT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zPiBDcmVhdGVVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVW5zb3J0ZWRTZWdtZW50TWluT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VW5zb3J0ZWRTZWdtZW50TWluT3B0aW9ucz4gQ3JlYXRlVW5zb3J0ZWRTZWdtZW50TWluT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVW5zb3J0ZWRTZWdtZW50TWluT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IFNpZ25PcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IFNpZ25PcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgU2lnbk9wdGlvbnMgVGFibGVUeXBlOwogfTsKIAotc3RydWN0IFNpZ25PcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IFNpZ25PcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgU2lnbk9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBTaWduT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBTaWduT3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oU2lnbk9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTaWduT3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNpZ25PcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgU2lnbk9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oU2lnbk9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U2lnbk9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNpZ25PcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IFNpZ25PcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgU2lnbk9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87Ci0gIGV4cGxpY2l0IFNpZ25PcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICBleHBsaWNpdCBTaWduT3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTaWduT3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U2lnbk9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNpZ25PcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTaWduT3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U2lnbk9wdGlvbnM+IENyZWF0ZVNpZ25PcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTaWduT3B0aW9ucz4gQ3JlYXRlU2lnbk9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKICAgU2lnbk9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8U2lnbk9wdGlvbnM+IENyZWF0ZVNpZ25PcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU2lnbk9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNpZ25PcHRpb25zPiBDcmVhdGVTaWduT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU2lnbk9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBCaXRjYXN0T3B0aW9uc1QgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBCaXRjYXN0T3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgewogICB0eXBlZGVmIEJpdGNhc3RPcHRpb25zIFRhYmxlVHlwZTsKIH07CiAKLXN0cnVjdCBCaXRjYXN0T3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBCaXRjYXN0T3B0aW9ucyBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIEJpdGNhc3RPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgQml0Y2FzdE9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgQml0Y2FzdE9wdGlvbnNUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKEJpdGNhc3RPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8Qml0Y2FzdE9wdGlvbnM+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBCaXRjYXN0T3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIEJpdGNhc3RPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKEJpdGNhc3RPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEJpdGNhc3RPcHRpb25zPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBCaXRjYXN0T3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBCaXRjYXN0T3B0aW9uc0J1aWxkZXIgewogICB0eXBlZGVmIEJpdGNhc3RPcHRpb25zIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOwotICBleHBsaWNpdCBCaXRjYXN0T3B0aW9uc0J1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgZXhwbGljaXQgQml0Y2FzdE9wdGlvbnNCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8Qml0Y2FzdE9wdGlvbnM+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEJpdGNhc3RPcHRpb25zPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCaXRjYXN0T3B0aW9ucz4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Qml0Y2FzdE9wdGlvbnM+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEJpdGNhc3RPcHRpb25zPiBDcmVhdGVCaXRjYXN0T3B0aW9ucygKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Qml0Y2FzdE9wdGlvbnM+IENyZWF0ZUJpdGNhc3RPcHRpb25zKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CiAgIEJpdGNhc3RPcHRpb25zQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1mbGF0YnVmZmVyczo6T2Zmc2V0PEJpdGNhc3RPcHRpb25zPiBDcmVhdGVCaXRjYXN0T3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEJpdGNhc3RPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCaXRjYXN0T3B0aW9ucz4gQ3JlYXRlQml0Y2FzdE9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEJpdGNhc3RPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogCi1zdHJ1Y3QgQml0d2lzZVhvck9wdGlvbnNUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgQml0d2lzZVhvck9wdGlvbnNUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBCaXR3aXNlWG9yT3B0aW9ucyBUYWJsZVR5cGU7CiB9OwogCi1zdHJ1Y3QgQml0d2lzZVhvck9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgQml0d2lzZVhvck9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBCaXR3aXNlWG9yT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIEJpdHdpc2VYb3JPcHRpb25zQnVpbGRlciBCdWlsZGVyOwotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIEJpdHdpc2VYb3JPcHRpb25zVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhCaXR3aXNlWG9yT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PEJpdHdpc2VYb3JPcHRpb25zPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQml0d2lzZVhvck9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBCaXR3aXNlWG9yT3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhCaXR3aXNlWG9yT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCaXR3aXNlWG9yT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQml0d2lzZVhvck9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiBzdHJ1Y3QgQml0d2lzZVhvck9wdGlvbnNCdWlsZGVyIHsKICAgdHlwZWRlZiBCaXR3aXNlWG9yT3B0aW9ucyBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgZXhwbGljaXQgQml0d2lzZVhvck9wdGlvbnNCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIGV4cGxpY2l0IEJpdHdpc2VYb3JPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PEJpdHdpc2VYb3JPcHRpb25zPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCaXR3aXNlWG9yT3B0aW9ucz4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8Qml0d2lzZVhvck9wdGlvbnM+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEJpdHdpc2VYb3JPcHRpb25zPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCaXR3aXNlWG9yT3B0aW9ucz4gQ3JlYXRlQml0d2lzZVhvck9wdGlvbnMoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEJpdHdpc2VYb3JPcHRpb25zPiBDcmVhdGVCaXR3aXNlWG9yT3B0aW9ucygKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgewogICBCaXR3aXNlWG9yT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCaXR3aXNlWG9yT3B0aW9ucz4gQ3JlYXRlQml0d2lzZVhvck9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBCaXR3aXNlWG9yT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Qml0d2lzZVhvck9wdGlvbnM+IENyZWF0ZUJpdHdpc2VYb3JPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBCaXR3aXNlWG9yT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IFJpZ2h0U2hpZnRPcHRpb25zVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IFJpZ2h0U2hpZnRPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgUmlnaHRTaGlmdE9wdGlvbnMgVGFibGVUeXBlOwogfTsKIAotc3RydWN0IFJpZ2h0U2hpZnRPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IFJpZ2h0U2hpZnRPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgUmlnaHRTaGlmdE9wdGlvbnNUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBSaWdodFNoaWZ0T3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBSaWdodFNoaWZ0T3B0aW9uc1QgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oUmlnaHRTaGlmdE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSaWdodFNoaWZ0T3B0aW9ucz4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJpZ2h0U2hpZnRPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgUmlnaHRTaGlmdE9wdGlvbnNUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oUmlnaHRTaGlmdE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UmlnaHRTaGlmdE9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJpZ2h0U2hpZnRPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IFJpZ2h0U2hpZnRPcHRpb25zQnVpbGRlciB7CiAgIHR5cGVkZWYgUmlnaHRTaGlmdE9wdGlvbnMgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87Ci0gIGV4cGxpY2l0IFJpZ2h0U2hpZnRPcHRpb25zQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICBleHBsaWNpdCBSaWdodFNoaWZ0T3B0aW9uc0J1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSaWdodFNoaWZ0T3B0aW9ucz4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UmlnaHRTaGlmdE9wdGlvbnM+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PFJpZ2h0U2hpZnRPcHRpb25zPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSaWdodFNoaWZ0T3B0aW9ucz4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8UmlnaHRTaGlmdE9wdGlvbnM+IENyZWF0ZVJpZ2h0U2hpZnRPcHRpb25zKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSaWdodFNoaWZ0T3B0aW9ucz4gQ3JlYXRlUmlnaHRTaGlmdE9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKICAgUmlnaHRTaGlmdE9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8UmlnaHRTaGlmdE9wdGlvbnM+IENyZWF0ZVJpZ2h0U2hpZnRPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmlnaHRTaGlmdE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJpZ2h0U2hpZnRPcHRpb25zPiBDcmVhdGVSaWdodFNoaWZ0T3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmlnaHRTaGlmdE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBPcGVyYXRvckNvZGVUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgRGlsYXRlT3B0aW9uc1QgOiBwdWJsaWMgOjpmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworICB0eXBlZGVmIERpbGF0ZU9wdGlvbnMgVGFibGVUeXBlOworfTsKKworc3RydWN0IERpbGF0ZU9wdGlvbnMgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKKyAgdHlwZWRlZiBEaWxhdGVPcHRpb25zVCBOYXRpdmVUYWJsZVR5cGU7CisgIHR5cGVkZWYgRGlsYXRlT3B0aW9uc0J1aWxkZXIgQnVpbGRlcjsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCisgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CisgIH0KKyAgRGlsYXRlT3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhEaWxhdGVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PERpbGF0ZU9wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IERpbGF0ZU9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cit9OworCitzdHJ1Y3QgRGlsYXRlT3B0aW9uc0J1aWxkZXIgeworICB0eXBlZGVmIERpbGF0ZU9wdGlvbnMgVGFibGU7CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICBleHBsaWNpdCBEaWxhdGVPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgICAgICAgOiBmYmJfKF9mYmIpIHsKKyAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKKyAgfQorICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8RGlsYXRlT3B0aW9ucz4gRmluaXNoKCkgeworICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxEaWxhdGVPcHRpb25zPihlbmQpOworICAgIHJldHVybiBvOworICB9Cit9OworCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PERpbGF0ZU9wdGlvbnM+IENyZWF0ZURpbGF0ZU9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpIHsKKyAgRGlsYXRlT3B0aW9uc0J1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CisgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKK30KKworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PERpbGF0ZU9wdGlvbnM+IENyZWF0ZURpbGF0ZU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IERpbGF0ZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisKK3N0cnVjdCBSZWR1Y2VXaW5kb3dPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CisgIHR5cGVkZWYgUmVkdWNlV2luZG93T3B0aW9ucyBUYWJsZVR5cGU7CisgIHRmbGl0ZTo6UmVkdWNlV2luZG93RnVuY3Rpb24gcmVkdWNlX2Z1bmN0aW9uID0gdGZsaXRlOjpSZWR1Y2VXaW5kb3dGdW5jdGlvbl9VTlNVUFBPUlRFRDsKK307CisKK3N0cnVjdCBSZWR1Y2VXaW5kb3dPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CisgIHR5cGVkZWYgUmVkdWNlV2luZG93T3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOworICB0eXBlZGVmIFJlZHVjZVdpbmRvd09wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CisgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CisgICAgVlRfUkVEVUNFX0ZVTkNUSU9OID0gNAorICB9OworICB0ZmxpdGU6OlJlZHVjZVdpbmRvd0Z1bmN0aW9uIHJlZHVjZV9mdW5jdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dGZsaXRlOjpSZWR1Y2VXaW5kb3dGdW5jdGlvbj4oR2V0RmllbGQ8aW50MzJfdD4oVlRfUkVEVUNFX0ZVTkNUSU9OLCAwKSk7CisgIH0KKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDMyX3Q+KHZlcmlmaWVyLCBWVF9SRURVQ0VfRlVOQ1RJT04sIDQpICYmCisgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CisgIH0KKyAgUmVkdWNlV2luZG93T3B0aW9uc1QgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhSZWR1Y2VXaW5kb3dPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJlZHVjZVdpbmRvd09wdGlvbnM+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJlZHVjZVdpbmRvd09wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cit9OworCitzdHJ1Y3QgUmVkdWNlV2luZG93T3B0aW9uc0J1aWxkZXIgeworICB0eXBlZGVmIFJlZHVjZVdpbmRvd09wdGlvbnMgVGFibGU7CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICB2b2lkIGFkZF9yZWR1Y2VfZnVuY3Rpb24odGZsaXRlOjpSZWR1Y2VXaW5kb3dGdW5jdGlvbiByZWR1Y2VfZnVuY3Rpb24pIHsKKyAgICBmYmJfLkFkZEVsZW1lbnQ8aW50MzJfdD4oUmVkdWNlV2luZG93T3B0aW9uczo6VlRfUkVEVUNFX0ZVTkNUSU9OLCBzdGF0aWNfY2FzdDxpbnQzMl90PihyZWR1Y2VfZnVuY3Rpb24pLCAwKTsKKyAgfQorICBleHBsaWNpdCBSZWR1Y2VXaW5kb3dPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgICAgICAgOiBmYmJfKF9mYmIpIHsKKyAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKKyAgfQorICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UmVkdWNlV2luZG93T3B0aW9ucz4gRmluaXNoKCkgeworICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZWR1Y2VXaW5kb3dPcHRpb25zPihlbmQpOworICAgIHJldHVybiBvOworICB9Cit9OworCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJlZHVjZVdpbmRvd09wdGlvbnM+IENyZWF0ZVJlZHVjZVdpbmRvd09wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgdGZsaXRlOjpSZWR1Y2VXaW5kb3dGdW5jdGlvbiByZWR1Y2VfZnVuY3Rpb24gPSB0ZmxpdGU6OlJlZHVjZVdpbmRvd0Z1bmN0aW9uX1VOU1VQUE9SVEVEKSB7CisgIFJlZHVjZVdpbmRvd09wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOworICBidWlsZGVyXy5hZGRfcmVkdWNlX2Z1bmN0aW9uKHJlZHVjZV9mdW5jdGlvbik7CisgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKK30KKworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJlZHVjZVdpbmRvd09wdGlvbnM+IENyZWF0ZVJlZHVjZVdpbmRvd09wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJlZHVjZVdpbmRvd09wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisKK3N0cnVjdCBPcGVyYXRvckNvZGVUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBPcGVyYXRvckNvZGUgVGFibGVUeXBlOwogICBpbnQ4X3QgZGVwcmVjYXRlZF9idWlsdGluX2NvZGUgPSAwOwogICBzdGQ6OnN0cmluZyBjdXN0b21fY29kZXt9OwpAQCAtMTE3NzAsNyArMTQ1MzEsNyBAQAogICB0ZmxpdGU6OkJ1aWx0aW5PcGVyYXRvciBidWlsdGluX2NvZGUgPSB0ZmxpdGU6OkJ1aWx0aW5PcGVyYXRvcl9BREQ7CiB9OwogCi1zdHJ1Y3QgT3BlcmF0b3JDb2RlIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IE9wZXJhdG9yQ29kZSBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIE9wZXJhdG9yQ29kZVQgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIE9wZXJhdG9yQ29kZUJ1aWxkZXIgQnVpbGRlcjsKICAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKQEAgLTExNzgyLDggKzE0NTQzLDggQEAKICAgaW50OF90IGRlcHJlY2F0ZWRfYnVpbHRpbl9jb2RlKCkgY29uc3QgewogICAgIHJldHVybiBHZXRGaWVsZDxpbnQ4X3Q+KFZUX0RFUFJFQ0FURURfQlVJTFRJTl9DT0RFLCAwKTsKICAgfQotICBjb25zdCBmbGF0YnVmZmVyczo6U3RyaW5nICpjdXN0b21fY29kZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6U3RyaW5nICo+KFZUX0NVU1RPTV9DT0RFKTsKKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6U3RyaW5nICpjdXN0b21fY29kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpTdHJpbmcgKj4oVlRfQ1VTVE9NX0NPREUpOwogICB9CiAgIGludDMyX3QgdmVyc2lvbigpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8aW50MzJfdD4oVlRfVkVSU0lPTiwgMSk7CkBAIC0xMTc5MSw3ICsxNDU1Miw3IEBACiAgIHRmbGl0ZTo6QnVpbHRpbk9wZXJhdG9yIGJ1aWx0aW5fY29kZSgpIGNvbnN0IHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dGZsaXRlOjpCdWlsdGluT3BlcmF0b3I+KEdldEZpZWxkPGludDMyX3Q+KFZUX0JVSUxUSU5fQ09ERSwgMCkpOwogICB9Ci0gIGJvb2wgVmVyaWZ5KGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKKyAgYm9vbCBWZXJpZnkoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CiAgICAgcmV0dXJuIFZlcmlmeVRhYmxlU3RhcnQodmVyaWZpZXIpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDhfdD4odmVyaWZpZXIsIFZUX0RFUFJFQ0FURURfQlVJTFRJTl9DT0RFLCAxKSAmJgogICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX0NVU1RPTV9DT0RFKSAmJgpAQCAtMTE4MDAsMTkgKzE0NTYxLDE5IEBACiAgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDMyX3Q+KHZlcmlmaWVyLCBWVF9CVUlMVElOX0NPREUsIDQpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgT3BlcmF0b3JDb2RlVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhPcGVyYXRvckNvZGVUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxPcGVyYXRvckNvZGU+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBPcGVyYXRvckNvZGVUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBPcGVyYXRvckNvZGVUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oT3BlcmF0b3JDb2RlVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE9wZXJhdG9yQ29kZT4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgT3BlcmF0b3JDb2RlVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IE9wZXJhdG9yQ29kZUJ1aWxkZXIgewogICB0eXBlZGVmIE9wZXJhdG9yQ29kZSBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CiAgIHZvaWQgYWRkX2RlcHJlY2F0ZWRfYnVpbHRpbl9jb2RlKGludDhfdCBkZXByZWNhdGVkX2J1aWx0aW5fY29kZSkgewogICAgIGZiYl8uQWRkRWxlbWVudDxpbnQ4X3Q+KE9wZXJhdG9yQ29kZTo6VlRfREVQUkVDQVRFRF9CVUlMVElOX0NPREUsIGRlcHJlY2F0ZWRfYnVpbHRpbl9jb2RlLCAwKTsKICAgfQotICB2b2lkIGFkZF9jdXN0b21fY29kZShmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+IGN1c3RvbV9jb2RlKSB7CisgIHZvaWQgYWRkX2N1c3RvbV9jb2RlKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpTdHJpbmc+IGN1c3RvbV9jb2RlKSB7CiAgICAgZmJiXy5BZGRPZmZzZXQoT3BlcmF0b3JDb2RlOjpWVF9DVVNUT01fQ09ERSwgY3VzdG9tX2NvZGUpOwogICB9CiAgIHZvaWQgYWRkX3ZlcnNpb24oaW50MzJfdCB2ZXJzaW9uKSB7CkBAIC0xMTgyMSwyMSArMTQ1ODIsMjEgQEAKICAgdm9pZCBhZGRfYnVpbHRpbl9jb2RlKHRmbGl0ZTo6QnVpbHRpbk9wZXJhdG9yIGJ1aWx0aW5fY29kZSkgewogICAgIGZiYl8uQWRkRWxlbWVudDxpbnQzMl90PihPcGVyYXRvckNvZGU6OlZUX0JVSUxUSU5fQ09ERSwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oYnVpbHRpbl9jb2RlKSwgMCk7CiAgIH0KLSAgZXhwbGljaXQgT3BlcmF0b3JDb2RlQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIGV4cGxpY2l0IE9wZXJhdG9yQ29kZUJ1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxPcGVyYXRvckNvZGU+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE9wZXJhdG9yQ29kZT4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8T3BlcmF0b3JDb2RlPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxPcGVyYXRvckNvZGU+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PE9wZXJhdG9yQ29kZT4gQ3JlYXRlT3BlcmF0b3JDb2RlKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8T3BlcmF0b3JDb2RlPiBDcmVhdGVPcGVyYXRvckNvZGUoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCiAgICAgaW50OF90IGRlcHJlY2F0ZWRfYnVpbHRpbl9jb2RlID0gMCwKLSAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+IGN1c3RvbV9jb2RlID0gMCwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6U3RyaW5nPiBjdXN0b21fY29kZSA9IDAsCiAgICAgaW50MzJfdCB2ZXJzaW9uID0gMSwKICAgICB0ZmxpdGU6OkJ1aWx0aW5PcGVyYXRvciBidWlsdGluX2NvZGUgPSB0ZmxpdGU6OkJ1aWx0aW5PcGVyYXRvcl9BREQpIHsKICAgT3BlcmF0b3JDb2RlQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKQEAgLTExODQ2LDggKzE0NjA3LDggQEAKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxPcGVyYXRvckNvZGU+IENyZWF0ZU9wZXJhdG9yQ29kZURpcmVjdCgKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE9wZXJhdG9yQ29kZT4gQ3JlYXRlT3BlcmF0b3JDb2RlRGlyZWN0KAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAogICAgIGludDhfdCBkZXByZWNhdGVkX2J1aWx0aW5fY29kZSA9IDAsCiAgICAgY29uc3QgY2hhciAqY3VzdG9tX2NvZGUgPSBudWxscHRyLAogICAgIGludDMyX3QgdmVyc2lvbiA9IDEsCkBAIC0xMTg2MSw5ICsxNDYyMiwxMjUgQEAKICAgICAgIGJ1aWx0aW5fY29kZSk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8T3BlcmF0b3JDb2RlPiBDcmVhdGVPcGVyYXRvckNvZGUoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBPcGVyYXRvckNvZGVUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE9wZXJhdG9yQ29kZT4gQ3JlYXRlT3BlcmF0b3JDb2RlKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBPcGVyYXRvckNvZGVUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBPcGVyYXRvclQgOiBwdWJsaWMgZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKK3N0cnVjdCBTdGFibGVITE9Db21wb3NpdGVPcHRpb25zVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CisgIHR5cGVkZWYgU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9ucyBUYWJsZVR5cGU7CisgIHN0ZDo6c3RyaW5nIG5hbWV7fTsKKyAgaW50MzJfdCBkZWNvbXBvc2l0aW9uX3N1YmdyYXBoX2luZGV4ID0gMDsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gY29tcG9zaXRlX2F0dHJpYnV0ZXN7fTsKKyAgdGZsaXRlOjpDdXN0b21PcHRpb25zRm9ybWF0IGNvbXBvc2l0ZV9hdHRyaWJ1dGVzX2Zvcm1hdCA9IHRmbGl0ZTo6Q3VzdG9tT3B0aW9uc0Zvcm1hdF9GTEVYQlVGRkVSUzsKKyAgaW50MzJfdCB2ZXJzaW9uID0gMDsKK307CisKK3N0cnVjdCBTdGFibGVITE9Db21wb3NpdGVPcHRpb25zIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CisgIHR5cGVkZWYgU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9uc1QgTmF0aXZlVGFibGVUeXBlOworICB0eXBlZGVmIFN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnNCdWlsZGVyIEJ1aWxkZXI7CisgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CisgICAgVlRfTkFNRSA9IDQsCisgICAgVlRfREVDT01QT1NJVElPTl9TVUJHUkFQSF9JTkRFWCA9IDYsCisgICAgVlRfQ09NUE9TSVRFX0FUVFJJQlVURVMgPSA4LAorICAgIFZUX0NPTVBPU0lURV9BVFRSSUJVVEVTX0ZPUk1BVCA9IDEwLAorICAgIFZUX1ZFUlNJT04gPSAxMgorICB9OworICBjb25zdCA6OmZsYXRidWZmZXJzOjpTdHJpbmcgKm5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgOjpmbGF0YnVmZmVyczo6U3RyaW5nICo+KFZUX05BTUUpOworICB9CisgIGludDMyX3QgZGVjb21wb3NpdGlvbl9zdWJncmFwaF9pbmRleCgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RmllbGQ8aW50MzJfdD4oVlRfREVDT01QT1NJVElPTl9TVUJHUkFQSF9JTkRFWCwgMCk7CisgIH0KKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICpjb21wb3NpdGVfYXR0cmlidXRlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKj4oVlRfQ09NUE9TSVRFX0FUVFJJQlVURVMpOworICB9CisgIHRmbGl0ZTo6Q3VzdG9tT3B0aW9uc0Zvcm1hdCBjb21wb3NpdGVfYXR0cmlidXRlc19mb3JtYXQoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHRmbGl0ZTo6Q3VzdG9tT3B0aW9uc0Zvcm1hdD4oR2V0RmllbGQ8aW50OF90PihWVF9DT01QT1NJVEVfQVRUUklCVVRFU19GT1JNQVQsIDApKTsKKyAgfQorICBpbnQzMl90IHZlcnNpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEZpZWxkPGludDMyX3Q+KFZUX1ZFUlNJT04sIDApOworICB9CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX05BTUUpICYmCisgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVN0cmluZyhuYW1lKCkpICYmCisgICAgICAgICAgIFZlcmlmeUZpZWxkPGludDMyX3Q+KHZlcmlmaWVyLCBWVF9ERUNPTVBPU0lUSU9OX1NVQkdSQVBIX0lOREVYLCA0KSAmJgorICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX0NPTVBPU0lURV9BVFRSSUJVVEVTKSAmJgorICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlWZWN0b3IoY29tcG9zaXRlX2F0dHJpYnV0ZXMoKSkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8aW50OF90Pih2ZXJpZmllciwgVlRfQ09NUE9TSVRFX0FUVFJJQlVURVNfRk9STUFULCAxKSAmJgorICAgICAgICAgICBWZXJpZnlGaWVsZDxpbnQzMl90Pih2ZXJpZmllciwgVlRfVkVSU0lPTiwgNCkgJiYKKyAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKKyAgfQorICBTdGFibGVITE9Db21wb3NpdGVPcHRpb25zVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlSExPQ29tcG9zaXRlT3B0aW9ucz4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKK307CisKK3N0cnVjdCBTdGFibGVITE9Db21wb3NpdGVPcHRpb25zQnVpbGRlciB7CisgIHR5cGVkZWYgU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9ucyBUYWJsZTsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CisgIHZvaWQgYWRkX25hbWUoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlN0cmluZz4gbmFtZSkgeworICAgIGZiYl8uQWRkT2Zmc2V0KFN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnM6OlZUX05BTUUsIG5hbWUpOworICB9CisgIHZvaWQgYWRkX2RlY29tcG9zaXRpb25fc3ViZ3JhcGhfaW5kZXgoaW50MzJfdCBkZWNvbXBvc2l0aW9uX3N1YmdyYXBoX2luZGV4KSB7CisgICAgZmJiXy5BZGRFbGVtZW50PGludDMyX3Q+KFN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnM6OlZUX0RFQ09NUE9TSVRJT05fU1VCR1JBUEhfSU5ERVgsIGRlY29tcG9zaXRpb25fc3ViZ3JhcGhfaW5kZXgsIDApOworICB9CisgIHZvaWQgYWRkX2NvbXBvc2l0ZV9hdHRyaWJ1dGVzKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4+IGNvbXBvc2l0ZV9hdHRyaWJ1dGVzKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9uczo6VlRfQ09NUE9TSVRFX0FUVFJJQlVURVMsIGNvbXBvc2l0ZV9hdHRyaWJ1dGVzKTsKKyAgfQorICB2b2lkIGFkZF9jb21wb3NpdGVfYXR0cmlidXRlc19mb3JtYXQodGZsaXRlOjpDdXN0b21PcHRpb25zRm9ybWF0IGNvbXBvc2l0ZV9hdHRyaWJ1dGVzX2Zvcm1hdCkgeworICAgIGZiYl8uQWRkRWxlbWVudDxpbnQ4X3Q+KFN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnM6OlZUX0NPTVBPU0lURV9BVFRSSUJVVEVTX0ZPUk1BVCwgc3RhdGljX2Nhc3Q8aW50OF90Pihjb21wb3NpdGVfYXR0cmlidXRlc19mb3JtYXQpLCAwKTsKKyAgfQorICB2b2lkIGFkZF92ZXJzaW9uKGludDMyX3QgdmVyc2lvbikgeworICAgIGZiYl8uQWRkRWxlbWVudDxpbnQzMl90PihTdGFibGVITE9Db21wb3NpdGVPcHRpb25zOjpWVF9WRVJTSU9OLCB2ZXJzaW9uLCAwKTsKKyAgfQorICBleHBsaWNpdCBTdGFibGVITE9Db21wb3NpdGVPcHRpb25zQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgICAgICAgOiBmYmJfKF9mYmIpIHsKKyAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKKyAgfQorICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlSExPQ29tcG9zaXRlT3B0aW9ucz4gRmluaXNoKCkgeworICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVITE9Db21wb3NpdGVPcHRpb25zPihlbmQpOworICAgIHJldHVybiBvOworICB9Cit9OworCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnM+IENyZWF0ZVN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnMoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlN0cmluZz4gbmFtZSA9IDAsCisgICAgaW50MzJfdCBkZWNvbXBvc2l0aW9uX3N1YmdyYXBoX2luZGV4ID0gMCwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+PiBjb21wb3NpdGVfYXR0cmlidXRlcyA9IDAsCisgICAgdGZsaXRlOjpDdXN0b21PcHRpb25zRm9ybWF0IGNvbXBvc2l0ZV9hdHRyaWJ1dGVzX2Zvcm1hdCA9IHRmbGl0ZTo6Q3VzdG9tT3B0aW9uc0Zvcm1hdF9GTEVYQlVGRkVSUywKKyAgICBpbnQzMl90IHZlcnNpb24gPSAwKSB7CisgIFN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnNCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOworICBidWlsZGVyXy5hZGRfdmVyc2lvbih2ZXJzaW9uKTsKKyAgYnVpbGRlcl8uYWRkX2NvbXBvc2l0ZV9hdHRyaWJ1dGVzKGNvbXBvc2l0ZV9hdHRyaWJ1dGVzKTsKKyAgYnVpbGRlcl8uYWRkX2RlY29tcG9zaXRpb25fc3ViZ3JhcGhfaW5kZXgoZGVjb21wb3NpdGlvbl9zdWJncmFwaF9pbmRleCk7CisgIGJ1aWxkZXJfLmFkZF9uYW1lKG5hbWUpOworICBidWlsZGVyXy5hZGRfY29tcG9zaXRlX2F0dHJpYnV0ZXNfZm9ybWF0KGNvbXBvc2l0ZV9hdHRyaWJ1dGVzX2Zvcm1hdCk7CisgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKK30KKworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVITE9Db21wb3NpdGVPcHRpb25zPiBDcmVhdGVTdGFibGVITE9Db21wb3NpdGVPcHRpb25zRGlyZWN0KAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAorICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBudWxscHRyLAorICAgIGludDMyX3QgZGVjb21wb3NpdGlvbl9zdWJncmFwaF9pbmRleCA9IDAsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gKmNvbXBvc2l0ZV9hdHRyaWJ1dGVzID0gbnVsbHB0ciwKKyAgICB0ZmxpdGU6OkN1c3RvbU9wdGlvbnNGb3JtYXQgY29tcG9zaXRlX2F0dHJpYnV0ZXNfZm9ybWF0ID0gdGZsaXRlOjpDdXN0b21PcHRpb25zRm9ybWF0X0ZMRVhCVUZGRVJTLAorICAgIGludDMyX3QgdmVyc2lvbiA9IDApIHsKKyAgYXV0byBuYW1lX18gPSBuYW1lID8gX2ZiYi5DcmVhdGVTdHJpbmcobmFtZSkgOiAwOworICBhdXRvIGNvbXBvc2l0ZV9hdHRyaWJ1dGVzX18gPSBjb21wb3NpdGVfYXR0cmlidXRlcyA/IF9mYmIuQ3JlYXRlVmVjdG9yPHVpbnQ4X3Q+KCpjb21wb3NpdGVfYXR0cmlidXRlcykgOiAwOworICByZXR1cm4gdGZsaXRlOjpDcmVhdGVTdGFibGVITE9Db21wb3NpdGVPcHRpb25zKAorICAgICAgX2ZiYiwKKyAgICAgIG5hbWVfXywKKyAgICAgIGRlY29tcG9zaXRpb25fc3ViZ3JhcGhfaW5kZXgsCisgICAgICBjb21wb3NpdGVfYXR0cmlidXRlc19fLAorICAgICAgY29tcG9zaXRlX2F0dHJpYnV0ZXNfZm9ybWF0LAorICAgICAgdmVyc2lvbik7Cit9CisKKzo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVITE9Db21wb3NpdGVPcHRpb25zPiBDcmVhdGVTdGFibGVITE9Db21wb3NpdGVPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTdGFibGVITE9Db21wb3NpdGVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworCitzdHJ1Y3QgT3BlcmF0b3JUIDogcHVibGljIDo6ZmxhdGJ1ZmZlcnM6Ok5hdGl2ZVRhYmxlIHsKICAgdHlwZWRlZiBPcGVyYXRvciBUYWJsZVR5cGU7CiAgIHVpbnQzMl90IG9wY29kZV9pbmRleCA9IDA7CiAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGlucHV0c3t9OwpAQCAtMTE4NzUsOSArMTQ3NTIsMTAgQEAKICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gaW50ZXJtZWRpYXRlc3t9OwogICB1aW50NjRfdCBsYXJnZV9jdXN0b21fb3B0aW9uc19vZmZzZXQgPSAwOwogICB1aW50NjRfdCBsYXJnZV9jdXN0b21fb3B0aW9uc19zaXplID0gMDsKKyAgdGZsaXRlOjpCdWlsdGluT3B0aW9uczJVbmlvbiBidWlsdGluX29wdGlvbnNfMnt9OwogfTsKIAotc3RydWN0IE9wZXJhdG9yIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IE9wZXJhdG9yIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgT3BlcmF0b3JUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBPcGVyYXRvckJ1aWxkZXIgQnVpbGRlcjsKICAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKQEAgLTExODkxLDE2ICsxNDc2OSwxOCBAQAogICAgIFZUX01VVEFUSU5HX1ZBUklBQkxFX0lOUFVUUyA9IDE4LAogICAgIFZUX0lOVEVSTUVESUFURVMgPSAyMCwKICAgICBWVF9MQVJHRV9DVVNUT01fT1BUSU9OU19PRkZTRVQgPSAyMiwKLSAgICBWVF9MQVJHRV9DVVNUT01fT1BUSU9OU19TSVpFID0gMjQKKyAgICBWVF9MQVJHRV9DVVNUT01fT1BUSU9OU19TSVpFID0gMjQsCisgICAgVlRfQlVJTFRJTl9PUFRJT05TXzJfVFlQRSA9IDI2LAorICAgIFZUX0JVSUxUSU5fT1BUSU9OU18yID0gMjgKICAgfTsKICAgdWludDMyX3Qgb3Bjb2RlX2luZGV4KCkgY29uc3QgewogICAgIHJldHVybiBHZXRGaWVsZDx1aW50MzJfdD4oVlRfT1BDT0RFX0lOREVYLCAwKTsKICAgfQotICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+ICppbnB1dHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90PiAqPihWVF9JTlBVVFMpOworICBjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4gKmlucHV0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4gKj4oVlRfSU5QVVRTKTsKICAgfQotICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+ICpvdXRwdXRzKCkgY29uc3QgewotICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4gKj4oVlRfT1VUUFVUUyk7CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90PiAqb3V0cHV0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4gKj4oVlRfT1VUUFVUUyk7CiAgIH0KICAgdGZsaXRlOjpCdWlsdGluT3B0aW9ucyBidWlsdGluX29wdGlvbnNfdHlwZSgpIGNvbnN0IHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dGZsaXRlOjpCdWlsdGluT3B0aW9ucz4oR2V0RmllbGQ8dWludDhfdD4oVlRfQlVJTFRJTl9PUFRJT05TX1RZUEUsIDApKTsKQEAgLTEyMjg3LDE3ICsxNTE2NywxNyBAQAogICBjb25zdCB0ZmxpdGU6OlJpZ2h0U2hpZnRPcHRpb25zICpidWlsdGluX29wdGlvbnNfYXNfUmlnaHRTaGlmdE9wdGlvbnMoKSBjb25zdCB7CiAgICAgcmV0dXJuIGJ1aWx0aW5fb3B0aW9uc190eXBlKCkgPT0gdGZsaXRlOjpCdWlsdGluT3B0aW9uc19SaWdodFNoaWZ0T3B0aW9ucyA/IHN0YXRpY19jYXN0PGNvbnN0IHRmbGl0ZTo6UmlnaHRTaGlmdE9wdGlvbnMgKj4oYnVpbHRpbl9vcHRpb25zKCkpIDogbnVsbHB0cjsKICAgfQotICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICpjdXN0b21fb3B0aW9ucygpIGNvbnN0IHsKLSAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICo+KFZUX0NVU1RPTV9PUFRJT05TKTsKKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICpjdXN0b21fb3B0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKj4oVlRfQ1VTVE9NX09QVElPTlMpOwogICB9CiAgIHRmbGl0ZTo6Q3VzdG9tT3B0aW9uc0Zvcm1hdCBjdXN0b21fb3B0aW9uc19mb3JtYXQoKSBjb25zdCB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHRmbGl0ZTo6Q3VzdG9tT3B0aW9uc0Zvcm1hdD4oR2V0RmllbGQ8aW50OF90PihWVF9DVVNUT01fT1BUSU9OU19GT1JNQVQsIDApKTsKICAgfQotICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICptdXRhdGluZ192YXJpYWJsZV9pbnB1dHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqPihWVF9NVVRBVElOR19WQVJJQUJMRV9JTlBVVFMpOworICBjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKm11dGF0aW5nX3ZhcmlhYmxlX2lucHV0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKj4oVlRfTVVUQVRJTkdfVkFSSUFCTEVfSU5QVVRTKTsKICAgfQotICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+ICppbnRlcm1lZGlhdGVzKCkgY29uc3QgewotICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4gKj4oVlRfSU5URVJNRURJQVRFUyk7CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90PiAqaW50ZXJtZWRpYXRlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4gKj4oVlRfSU5URVJNRURJQVRFUyk7CiAgIH0KICAgdWludDY0X3QgbGFyZ2VfY3VzdG9tX29wdGlvbnNfb2Zmc2V0KCkgY29uc3QgewogICAgIHJldHVybiBHZXRGaWVsZDx1aW50NjRfdD4oVlRfTEFSR0VfQ1VTVE9NX09QVElPTlNfT0ZGU0VULCAwKTsKQEAgLTEyMzA1LDcgKzE1MTg1LDc3IEBACiAgIHVpbnQ2NF90IGxhcmdlX2N1c3RvbV9vcHRpb25zX3NpemUoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldEZpZWxkPHVpbnQ2NF90PihWVF9MQVJHRV9DVVNUT01fT1BUSU9OU19TSVpFLCAwKTsKICAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIHRmbGl0ZTo6QnVpbHRpbk9wdGlvbnMyIGJ1aWx0aW5fb3B0aW9uc18yX3R5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHRmbGl0ZTo6QnVpbHRpbk9wdGlvbnMyPihHZXRGaWVsZDx1aW50OF90PihWVF9CVUlMVElOX09QVElPTlNfMl9UWVBFLCAwKSk7CisgIH0KKyAgY29uc3Qgdm9pZCAqYnVpbHRpbl9vcHRpb25zXzIoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3Qgdm9pZCAqPihWVF9CVUlMVElOX09QVElPTlNfMik7CisgIH0KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY29uc3QgVCAqYnVpbHRpbl9vcHRpb25zXzJfYXMoKSBjb25zdDsKKyAgY29uc3QgdGZsaXRlOjpTdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnMgKmJ1aWx0aW5fb3B0aW9uc18yX2FzX1N0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gYnVpbHRpbl9vcHRpb25zXzJfdHlwZSgpID09IHRmbGl0ZTo6QnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9ucyA/IHN0YXRpY19jYXN0PGNvbnN0IHRmbGl0ZTo6U3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zICo+KGJ1aWx0aW5fb3B0aW9uc18yKCkpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9ucyAqYnVpbHRpbl9vcHRpb25zXzJfYXNfU3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zKCkgY29uc3QgeworICAgIHJldHVybiBidWlsdGluX29wdGlvbnNfMl90eXBlKCkgPT0gdGZsaXRlOjpCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zID8gc3RhdGljX2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnMgKj4oYnVpbHRpbl9vcHRpb25zXzIoKSkgOiBudWxscHRyOworICB9CisgIGNvbnN0IHRmbGl0ZTo6U3RhYmxlaGxvU2xpY2VPcHRpb25zICpidWlsdGluX29wdGlvbnNfMl9hc19TdGFibGVobG9TbGljZU9wdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIGJ1aWx0aW5fb3B0aW9uc18yX3R5cGUoKSA9PSB0ZmxpdGU6OkJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9TbGljZU9wdGlvbnMgPyBzdGF0aWNfY2FzdDxjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1NsaWNlT3B0aW9ucyAqPihidWlsdGluX29wdGlvbnNfMigpKSA6IG51bGxwdHI7CisgIH0KKyAgY29uc3QgdGZsaXRlOjpTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMgKmJ1aWx0aW5fb3B0aW9uc18yX2FzX1N0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gYnVpbHRpbl9vcHRpb25zXzJfdHlwZSgpID09IHRmbGl0ZTo6QnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucyA/IHN0YXRpY19jYXN0PGNvbnN0IHRmbGl0ZTo6U3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zICo+KGJ1aWx0aW5fb3B0aW9uc18yKCkpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zICpidWlsdGluX29wdGlvbnNfMl9hc19TdGFibGVobG9DdXN0b21DYWxsT3B0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gYnVpbHRpbl9vcHRpb25zXzJfdHlwZSgpID09IHRmbGl0ZTo6QnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zID8gc3RhdGljX2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9DdXN0b21DYWxsT3B0aW9ucyAqPihidWlsdGluX29wdGlvbnNfMigpKSA6IG51bGxwdHI7CisgIH0KKyAgY29uc3QgdGZsaXRlOjpTdGFibGVobG9SZWR1Y2VPcHRpb25zICpidWlsdGluX29wdGlvbnNfMl9hc19TdGFibGVobG9SZWR1Y2VPcHRpb25zKCkgY29uc3QgeworICAgIHJldHVybiBidWlsdGluX29wdGlvbnNfMl90eXBlKCkgPT0gdGZsaXRlOjpCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvUmVkdWNlT3B0aW9ucyA/IHN0YXRpY19jYXN0PGNvbnN0IHRmbGl0ZTo6U3RhYmxlaGxvUmVkdWNlT3B0aW9ucyAqPihidWlsdGluX29wdGlvbnNfMigpKSA6IG51bGxwdHI7CisgIH0KKyAgY29uc3QgdGZsaXRlOjpTdGFibGVobG9TY2F0dGVyT3B0aW9ucyAqYnVpbHRpbl9vcHRpb25zXzJfYXNfU3RhYmxlaGxvU2NhdHRlck9wdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIGJ1aWx0aW5fb3B0aW9uc18yX3R5cGUoKSA9PSB0ZmxpdGU6OkJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9TY2F0dGVyT3B0aW9ucyA/IHN0YXRpY19jYXN0PGNvbnN0IHRmbGl0ZTo6U3RhYmxlaGxvU2NhdHRlck9wdGlvbnMgKj4oYnVpbHRpbl9vcHRpb25zXzIoKSkgOiBudWxscHRyOworICB9CisgIGNvbnN0IHRmbGl0ZTo6U3RhYmxlaGxvQ29tcGFyZU9wdGlvbnMgKmJ1aWx0aW5fb3B0aW9uc18yX2FzX1N0YWJsZWhsb0NvbXBhcmVPcHRpb25zKCkgY29uc3QgeworICAgIHJldHVybiBidWlsdGluX29wdGlvbnNfMl90eXBlKCkgPT0gdGZsaXRlOjpCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvQ29tcGFyZU9wdGlvbnMgPyBzdGF0aWNfY2FzdDxjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb0NvbXBhcmVPcHRpb25zICo+KGJ1aWx0aW5fb3B0aW9uc18yKCkpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnMgKmJ1aWx0aW5fb3B0aW9uc18yX2FzX1N0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIGJ1aWx0aW5fb3B0aW9uc18yX3R5cGUoKSA9PSB0ZmxpdGU6OkJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zID8gc3RhdGljX2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zICo+KGJ1aWx0aW5fb3B0aW9uc18yKCkpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1BhZE9wdGlvbnMgKmJ1aWx0aW5fb3B0aW9uc18yX2FzX1N0YWJsZWhsb1BhZE9wdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIGJ1aWx0aW5fb3B0aW9uc18yX3R5cGUoKSA9PSB0ZmxpdGU6OkJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9QYWRPcHRpb25zID8gc3RhdGljX2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9QYWRPcHRpb25zICo+KGJ1aWx0aW5fb3B0aW9uc18yKCkpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb0lvdGFPcHRpb25zICpidWlsdGluX29wdGlvbnNfMl9hc19TdGFibGVobG9Jb3RhT3B0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gYnVpbHRpbl9vcHRpb25zXzJfdHlwZSgpID09IHRmbGl0ZTo6QnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0lvdGFPcHRpb25zID8gc3RhdGljX2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9Jb3RhT3B0aW9ucyAqPihidWlsdGluX29wdGlvbnNfMigpKSA6IG51bGxwdHI7CisgIH0KKyAgY29uc3QgdGZsaXRlOjpTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9ucyAqYnVpbHRpbl9vcHRpb25zXzJfYXNfU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIGJ1aWx0aW5fb3B0aW9uc18yX3R5cGUoKSA9PSB0ZmxpdGU6OkJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9ucyA/IHN0YXRpY19jYXN0PGNvbnN0IHRmbGl0ZTo6U3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnMgKj4oYnVpbHRpbl9vcHRpb25zXzIoKSkgOiBudWxscHRyOworICB9CisgIGNvbnN0IHRmbGl0ZTo6U3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9ucyAqYnVpbHRpbl9vcHRpb25zXzJfYXNfU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gYnVpbHRpbl9vcHRpb25zXzJfdHlwZSgpID09IHRmbGl0ZTo6QnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMgPyBzdGF0aWNfY2FzdDxjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMgKj4oYnVpbHRpbl9vcHRpb25zXzIoKSkgOiBudWxscHRyOworICB9CisgIGNvbnN0IHRmbGl0ZTo6U3RhYmxlaGxvU29ydE9wdGlvbnMgKmJ1aWx0aW5fb3B0aW9uc18yX2FzX1N0YWJsZWhsb1NvcnRPcHRpb25zKCkgY29uc3QgeworICAgIHJldHVybiBidWlsdGluX29wdGlvbnNfMl90eXBlKCkgPT0gdGZsaXRlOjpCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvU29ydE9wdGlvbnMgPyBzdGF0aWNfY2FzdDxjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1NvcnRPcHRpb25zICo+KGJ1aWx0aW5fb3B0aW9uc18yKCkpIDogbnVsbHB0cjsKKyAgfQorICBjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1doaWxlT3B0aW9ucyAqYnVpbHRpbl9vcHRpb25zXzJfYXNfU3RhYmxlaGxvV2hpbGVPcHRpb25zKCkgY29uc3QgeworICAgIHJldHVybiBidWlsdGluX29wdGlvbnNfMl90eXBlKCkgPT0gdGZsaXRlOjpCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvV2hpbGVPcHRpb25zID8gc3RhdGljX2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9XaGlsZU9wdGlvbnMgKj4oYnVpbHRpbl9vcHRpb25zXzIoKSkgOiBudWxscHRyOworICB9CisgIGNvbnN0IHRmbGl0ZTo6U3RhYmxlaGxvR2F0aGVyT3B0aW9ucyAqYnVpbHRpbl9vcHRpb25zXzJfYXNfU3RhYmxlaGxvR2F0aGVyT3B0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gYnVpbHRpbl9vcHRpb25zXzJfdHlwZSgpID09IHRmbGl0ZTo6QnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0dhdGhlck9wdGlvbnMgPyBzdGF0aWNfY2FzdDxjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb0dhdGhlck9wdGlvbnMgKj4oYnVpbHRpbl9vcHRpb25zXzIoKSkgOiBudWxscHRyOworICB9CisgIGNvbnN0IHRmbGl0ZTo6U3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9ucyAqYnVpbHRpbl9vcHRpb25zXzJfYXNfU3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gYnVpbHRpbl9vcHRpb25zXzJfdHlwZSgpID09IHRmbGl0ZTo6QnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnMgPyBzdGF0aWNfY2FzdDxjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnMgKj4oYnVpbHRpbl9vcHRpb25zXzIoKSkgOiBudWxscHRyOworICB9CisgIGNvbnN0IHRmbGl0ZTo6RGlsYXRlT3B0aW9ucyAqYnVpbHRpbl9vcHRpb25zXzJfYXNfRGlsYXRlT3B0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gYnVpbHRpbl9vcHRpb25zXzJfdHlwZSgpID09IHRmbGl0ZTo6QnVpbHRpbk9wdGlvbnMyX0RpbGF0ZU9wdGlvbnMgPyBzdGF0aWNfY2FzdDxjb25zdCB0ZmxpdGU6OkRpbGF0ZU9wdGlvbnMgKj4oYnVpbHRpbl9vcHRpb25zXzIoKSkgOiBudWxscHRyOworICB9CisgIGNvbnN0IHRmbGl0ZTo6U3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9ucyAqYnVpbHRpbl9vcHRpb25zXzJfYXNfU3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gYnVpbHRpbl9vcHRpb25zXzJfdHlwZSgpID09IHRmbGl0ZTo6QnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnMgPyBzdGF0aWNfY2FzdDxjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnMgKj4oYnVpbHRpbl9vcHRpb25zXzIoKSkgOiBudWxscHRyOworICB9CisgIGNvbnN0IHRmbGl0ZTo6UmVkdWNlV2luZG93T3B0aW9ucyAqYnVpbHRpbl9vcHRpb25zXzJfYXNfUmVkdWNlV2luZG93T3B0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gYnVpbHRpbl9vcHRpb25zXzJfdHlwZSgpID09IHRmbGl0ZTo6QnVpbHRpbk9wdGlvbnMyX1JlZHVjZVdpbmRvd09wdGlvbnMgPyBzdGF0aWNfY2FzdDxjb25zdCB0ZmxpdGU6OlJlZHVjZVdpbmRvd09wdGlvbnMgKj4oYnVpbHRpbl9vcHRpb25zXzIoKSkgOiBudWxscHRyOworICB9CisgIGNvbnN0IHRmbGl0ZTo6U3RhYmxlSExPQ29tcG9zaXRlT3B0aW9ucyAqYnVpbHRpbl9vcHRpb25zXzJfYXNfU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gYnVpbHRpbl9vcHRpb25zXzJfdHlwZSgpID09IHRmbGl0ZTo6QnVpbHRpbk9wdGlvbnMyX1N0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnMgPyBzdGF0aWNfY2FzdDxjb25zdCB0ZmxpdGU6OlN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnMgKj4oYnVpbHRpbl9vcHRpb25zXzIoKSkgOiBudWxscHRyOworICB9CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50MzJfdD4odmVyaWZpZXIsIFZUX09QQ09ERV9JTkRFWCwgNCkgJiYKICAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9JTlBVVFMpICYmCkBAIC0xMjMyNCwxMSArMTUyNzQsMTQgQEAKICAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKGludGVybWVkaWF0ZXMoKSkgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8dWludDY0X3Q+KHZlcmlmaWVyLCBWVF9MQVJHRV9DVVNUT01fT1BUSU9OU19PRkZTRVQsIDgpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQ2NF90Pih2ZXJpZmllciwgVlRfTEFSR0VfQ1VTVE9NX09QVElPTlNfU0laRSwgOCkgJiYKKyAgICAgICAgICAgVmVyaWZ5RmllbGQ8dWludDhfdD4odmVyaWZpZXIsIFZUX0JVSUxUSU5fT1BUSU9OU18yX1RZUEUsIDEpICYmCisgICAgICAgICAgIFZlcmlmeU9mZnNldCh2ZXJpZmllciwgVlRfQlVJTFRJTl9PUFRJT05TXzIpICYmCisgICAgICAgICAgIFZlcmlmeUJ1aWx0aW5PcHRpb25zMih2ZXJpZmllciwgYnVpbHRpbl9vcHRpb25zXzIoKSwgYnVpbHRpbl9vcHRpb25zXzJfdHlwZSgpKSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIE9wZXJhdG9yVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhPcGVyYXRvclQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHN0YXRpYyBmbGF0YnVmZmVyczo6T2Zmc2V0PE9wZXJhdG9yPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgT3BlcmF0b3JUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBPcGVyYXRvclQgKlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgdm9pZCBVblBhY2tUbyhPcGVyYXRvclQgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxPcGVyYXRvcj4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgT3BlcmF0b3JUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiB9OwogCiB0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB0ZmxpdGU6OkNvbnYyRE9wdGlvbnMgKk9wZXJhdG9yOjpidWlsdGluX29wdGlvbnNfYXM8dGZsaXRlOjpDb252MkRPcHRpb25zPigpIGNvbnN0IHsKQEAgLTEyODM1LDM1ICsxNTc4OCwxMTkgQEAKICAgcmV0dXJuIGJ1aWx0aW5fb3B0aW9uc19hc19SaWdodFNoaWZ0T3B0aW9ucygpOwogfQogCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9ucyAqT3BlcmF0b3I6OmJ1aWx0aW5fb3B0aW9uc18yX2FzPHRmbGl0ZTo6U3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zPigpIGNvbnN0IHsKKyAgcmV0dXJuIGJ1aWx0aW5fb3B0aW9uc18yX2FzX1N0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9ucygpOworfQorCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9ucyAqT3BlcmF0b3I6OmJ1aWx0aW5fb3B0aW9uc18yX2FzPHRmbGl0ZTo6U3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zPigpIGNvbnN0IHsKKyAgcmV0dXJuIGJ1aWx0aW5fb3B0aW9uc18yX2FzX1N0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9ucygpOworfQorCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1NsaWNlT3B0aW9ucyAqT3BlcmF0b3I6OmJ1aWx0aW5fb3B0aW9uc18yX2FzPHRmbGl0ZTo6U3RhYmxlaGxvU2xpY2VPcHRpb25zPigpIGNvbnN0IHsKKyAgcmV0dXJuIGJ1aWx0aW5fb3B0aW9uc18yX2FzX1N0YWJsZWhsb1NsaWNlT3B0aW9ucygpOworfQorCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucyAqT3BlcmF0b3I6OmJ1aWx0aW5fb3B0aW9uc18yX2FzPHRmbGl0ZTo6U3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zPigpIGNvbnN0IHsKKyAgcmV0dXJuIGJ1aWx0aW5fb3B0aW9uc18yX2FzX1N0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucygpOworfQorCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zICpPcGVyYXRvcjo6YnVpbHRpbl9vcHRpb25zXzJfYXM8dGZsaXRlOjpTdGFibGVobG9DdXN0b21DYWxsT3B0aW9ucz4oKSBjb25zdCB7CisgIHJldHVybiBidWlsdGluX29wdGlvbnNfMl9hc19TdGFibGVobG9DdXN0b21DYWxsT3B0aW9ucygpOworfQorCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1JlZHVjZU9wdGlvbnMgKk9wZXJhdG9yOjpidWlsdGluX29wdGlvbnNfMl9hczx0ZmxpdGU6OlN0YWJsZWhsb1JlZHVjZU9wdGlvbnM+KCkgY29uc3QgeworICByZXR1cm4gYnVpbHRpbl9vcHRpb25zXzJfYXNfU3RhYmxlaGxvUmVkdWNlT3B0aW9ucygpOworfQorCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zICpPcGVyYXRvcjo6YnVpbHRpbl9vcHRpb25zXzJfYXM8dGZsaXRlOjpTdGFibGVobG9TY2F0dGVyT3B0aW9ucz4oKSBjb25zdCB7CisgIHJldHVybiBidWlsdGluX29wdGlvbnNfMl9hc19TdGFibGVobG9TY2F0dGVyT3B0aW9ucygpOworfQorCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb0NvbXBhcmVPcHRpb25zICpPcGVyYXRvcjo6YnVpbHRpbl9vcHRpb25zXzJfYXM8dGZsaXRlOjpTdGFibGVobG9Db21wYXJlT3B0aW9ucz4oKSBjb25zdCB7CisgIHJldHVybiBidWlsdGluX29wdGlvbnNfMl9hc19TdGFibGVobG9Db21wYXJlT3B0aW9ucygpOworfQorCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnMgKk9wZXJhdG9yOjpidWlsdGluX29wdGlvbnNfMl9hczx0ZmxpdGU6OlN0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnM+KCkgY29uc3QgeworICByZXR1cm4gYnVpbHRpbl9vcHRpb25zXzJfYXNfU3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9ucygpOworfQorCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1BhZE9wdGlvbnMgKk9wZXJhdG9yOjpidWlsdGluX29wdGlvbnNfMl9hczx0ZmxpdGU6OlN0YWJsZWhsb1BhZE9wdGlvbnM+KCkgY29uc3QgeworICByZXR1cm4gYnVpbHRpbl9vcHRpb25zXzJfYXNfU3RhYmxlaGxvUGFkT3B0aW9ucygpOworfQorCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb0lvdGFPcHRpb25zICpPcGVyYXRvcjo6YnVpbHRpbl9vcHRpb25zXzJfYXM8dGZsaXRlOjpTdGFibGVobG9Jb3RhT3B0aW9ucz4oKSBjb25zdCB7CisgIHJldHVybiBidWlsdGluX29wdGlvbnNfMl9hc19TdGFibGVobG9Jb3RhT3B0aW9ucygpOworfQorCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zICpPcGVyYXRvcjo6YnVpbHRpbl9vcHRpb25zXzJfYXM8dGZsaXRlOjpTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9ucz4oKSBjb25zdCB7CisgIHJldHVybiBidWlsdGluX29wdGlvbnNfMl9hc19TdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9ucygpOworfQorCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMgKk9wZXJhdG9yOjpidWlsdGluX29wdGlvbnNfMl9hczx0ZmxpdGU6OlN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnM+KCkgY29uc3QgeworICByZXR1cm4gYnVpbHRpbl9vcHRpb25zXzJfYXNfU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9ucygpOworfQorCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1NvcnRPcHRpb25zICpPcGVyYXRvcjo6YnVpbHRpbl9vcHRpb25zXzJfYXM8dGZsaXRlOjpTdGFibGVobG9Tb3J0T3B0aW9ucz4oKSBjb25zdCB7CisgIHJldHVybiBidWlsdGluX29wdGlvbnNfMl9hc19TdGFibGVobG9Tb3J0T3B0aW9ucygpOworfQorCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1doaWxlT3B0aW9ucyAqT3BlcmF0b3I6OmJ1aWx0aW5fb3B0aW9uc18yX2FzPHRmbGl0ZTo6U3RhYmxlaGxvV2hpbGVPcHRpb25zPigpIGNvbnN0IHsKKyAgcmV0dXJuIGJ1aWx0aW5fb3B0aW9uc18yX2FzX1N0YWJsZWhsb1doaWxlT3B0aW9ucygpOworfQorCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb0dhdGhlck9wdGlvbnMgKk9wZXJhdG9yOjpidWlsdGluX29wdGlvbnNfMl9hczx0ZmxpdGU6OlN0YWJsZWhsb0dhdGhlck9wdGlvbnM+KCkgY29uc3QgeworICByZXR1cm4gYnVpbHRpbl9vcHRpb25zXzJfYXNfU3RhYmxlaGxvR2F0aGVyT3B0aW9ucygpOworfQorCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnMgKk9wZXJhdG9yOjpidWlsdGluX29wdGlvbnNfMl9hczx0ZmxpdGU6OlN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnM+KCkgY29uc3QgeworICByZXR1cm4gYnVpbHRpbl9vcHRpb25zXzJfYXNfU3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9ucygpOworfQorCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB0ZmxpdGU6OkRpbGF0ZU9wdGlvbnMgKk9wZXJhdG9yOjpidWlsdGluX29wdGlvbnNfMl9hczx0ZmxpdGU6OkRpbGF0ZU9wdGlvbnM+KCkgY29uc3QgeworICByZXR1cm4gYnVpbHRpbl9vcHRpb25zXzJfYXNfRGlsYXRlT3B0aW9ucygpOworfQorCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnMgKk9wZXJhdG9yOjpidWlsdGluX29wdGlvbnNfMl9hczx0ZmxpdGU6OlN0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnM+KCkgY29uc3QgeworICByZXR1cm4gYnVpbHRpbl9vcHRpb25zXzJfYXNfU3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9ucygpOworfQorCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB0ZmxpdGU6OlJlZHVjZVdpbmRvd09wdGlvbnMgKk9wZXJhdG9yOjpidWlsdGluX29wdGlvbnNfMl9hczx0ZmxpdGU6OlJlZHVjZVdpbmRvd09wdGlvbnM+KCkgY29uc3QgeworICByZXR1cm4gYnVpbHRpbl9vcHRpb25zXzJfYXNfUmVkdWNlV2luZG93T3B0aW9ucygpOworfQorCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCB0ZmxpdGU6OlN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnMgKk9wZXJhdG9yOjpidWlsdGluX29wdGlvbnNfMl9hczx0ZmxpdGU6OlN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnM+KCkgY29uc3QgeworICByZXR1cm4gYnVpbHRpbl9vcHRpb25zXzJfYXNfU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9ucygpOworfQorCiBzdHJ1Y3QgT3BlcmF0b3JCdWlsZGVyIHsKICAgdHlwZWRlZiBPcGVyYXRvciBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87CisgIDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87CiAgIHZvaWQgYWRkX29wY29kZV9pbmRleCh1aW50MzJfdCBvcGNvZGVfaW5kZXgpIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDMyX3Q+KE9wZXJhdG9yOjpWVF9PUENPREVfSU5ERVgsIG9wY29kZV9pbmRleCwgMCk7CiAgIH0KLSAgdm9pZCBhZGRfaW5wdXRzKGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90Pj4gaW5wdXRzKSB7CisgIHZvaWQgYWRkX2lucHV0cyg6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+PiBpbnB1dHMpIHsKICAgICBmYmJfLkFkZE9mZnNldChPcGVyYXRvcjo6VlRfSU5QVVRTLCBpbnB1dHMpOwogICB9Ci0gIHZvaWQgYWRkX291dHB1dHMoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+PiBvdXRwdXRzKSB7CisgIHZvaWQgYWRkX291dHB1dHMoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90Pj4gb3V0cHV0cykgewogICAgIGZiYl8uQWRkT2Zmc2V0KE9wZXJhdG9yOjpWVF9PVVRQVVRTLCBvdXRwdXRzKTsKICAgfQogICB2b2lkIGFkZF9idWlsdGluX29wdGlvbnNfdHlwZSh0ZmxpdGU6OkJ1aWx0aW5PcHRpb25zIGJ1aWx0aW5fb3B0aW9uc190eXBlKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQ4X3Q+KE9wZXJhdG9yOjpWVF9CVUlMVElOX09QVElPTlNfVFlQRSwgc3RhdGljX2Nhc3Q8dWludDhfdD4oYnVpbHRpbl9vcHRpb25zX3R5cGUpLCAwKTsKICAgfQotICB2b2lkIGFkZF9idWlsdGluX29wdGlvbnMoZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPiBidWlsdGluX29wdGlvbnMpIHsKKyAgdm9pZCBhZGRfYnVpbHRpbl9vcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPiBidWlsdGluX29wdGlvbnMpIHsKICAgICBmYmJfLkFkZE9mZnNldChPcGVyYXRvcjo6VlRfQlVJTFRJTl9PUFRJT05TLCBidWlsdGluX29wdGlvbnMpOwogICB9Ci0gIHZvaWQgYWRkX2N1c3RvbV9vcHRpb25zKGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90Pj4gY3VzdG9tX29wdGlvbnMpIHsKKyAgdm9pZCBhZGRfY3VzdG9tX29wdGlvbnMoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90Pj4gY3VzdG9tX29wdGlvbnMpIHsKICAgICBmYmJfLkFkZE9mZnNldChPcGVyYXRvcjo6VlRfQ1VTVE9NX09QVElPTlMsIGN1c3RvbV9vcHRpb25zKTsKICAgfQogICB2b2lkIGFkZF9jdXN0b21fb3B0aW9uc19mb3JtYXQodGZsaXRlOjpDdXN0b21PcHRpb25zRm9ybWF0IGN1c3RvbV9vcHRpb25zX2Zvcm1hdCkgewogICAgIGZiYl8uQWRkRWxlbWVudDxpbnQ4X3Q+KE9wZXJhdG9yOjpWVF9DVVNUT01fT1BUSU9OU19GT1JNQVQsIHN0YXRpY19jYXN0PGludDhfdD4oY3VzdG9tX29wdGlvbnNfZm9ybWF0KSwgMCk7CiAgIH0KLSAgdm9pZCBhZGRfbXV0YXRpbmdfdmFyaWFibGVfaW5wdXRzKGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90Pj4gbXV0YXRpbmdfdmFyaWFibGVfaW5wdXRzKSB7CisgIHZvaWQgYWRkX211dGF0aW5nX3ZhcmlhYmxlX2lucHV0cyg6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+PiBtdXRhdGluZ192YXJpYWJsZV9pbnB1dHMpIHsKICAgICBmYmJfLkFkZE9mZnNldChPcGVyYXRvcjo6VlRfTVVUQVRJTkdfVkFSSUFCTEVfSU5QVVRTLCBtdXRhdGluZ192YXJpYWJsZV9pbnB1dHMpOwogICB9Ci0gIHZvaWQgYWRkX2ludGVybWVkaWF0ZXMoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+PiBpbnRlcm1lZGlhdGVzKSB7CisgIHZvaWQgYWRkX2ludGVybWVkaWF0ZXMoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90Pj4gaW50ZXJtZWRpYXRlcykgewogICAgIGZiYl8uQWRkT2Zmc2V0KE9wZXJhdG9yOjpWVF9JTlRFUk1FRElBVEVTLCBpbnRlcm1lZGlhdGVzKTsKICAgfQogICB2b2lkIGFkZF9sYXJnZV9jdXN0b21fb3B0aW9uc19vZmZzZXQodWludDY0X3QgbGFyZ2VfY3VzdG9tX29wdGlvbnNfb2Zmc2V0KSB7CkBAIC0xMjg3MiwzMyArMTU5MDksNDIgQEAKICAgdm9pZCBhZGRfbGFyZ2VfY3VzdG9tX29wdGlvbnNfc2l6ZSh1aW50NjRfdCBsYXJnZV9jdXN0b21fb3B0aW9uc19zaXplKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQ2NF90PihPcGVyYXRvcjo6VlRfTEFSR0VfQ1VTVE9NX09QVElPTlNfU0laRSwgbGFyZ2VfY3VzdG9tX29wdGlvbnNfc2l6ZSwgMCk7CiAgIH0KLSAgZXhwbGljaXQgT3BlcmF0b3JCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgdm9pZCBhZGRfYnVpbHRpbl9vcHRpb25zXzJfdHlwZSh0ZmxpdGU6OkJ1aWx0aW5PcHRpb25zMiBidWlsdGluX29wdGlvbnNfMl90eXBlKSB7CisgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQ4X3Q+KE9wZXJhdG9yOjpWVF9CVUlMVElOX09QVElPTlNfMl9UWVBFLCBzdGF0aWNfY2FzdDx1aW50OF90PihidWlsdGluX29wdGlvbnNfMl90eXBlKSwgMCk7CisgIH0KKyAgdm9pZCBhZGRfYnVpbHRpbl9vcHRpb25zXzIoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+IGJ1aWx0aW5fb3B0aW9uc18yKSB7CisgICAgZmJiXy5BZGRPZmZzZXQoT3BlcmF0b3I6OlZUX0JVSUxUSU5fT1BUSU9OU18yLCBidWlsdGluX29wdGlvbnNfMik7CisgIH0KKyAgZXhwbGljaXQgT3BlcmF0b3JCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8T3BlcmF0b3I+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE9wZXJhdG9yPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxPcGVyYXRvcj4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8T3BlcmF0b3I+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PE9wZXJhdG9yPiBDcmVhdGVPcGVyYXRvcigKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE9wZXJhdG9yPiBDcmVhdGVPcGVyYXRvcigKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKICAgICB1aW50MzJfdCBvcGNvZGVfaW5kZXggPSAwLAotICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90Pj4gaW5wdXRzID0gMCwKLSAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4+IG91dHB1dHMgPSAwLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4+IGlucHV0cyA9IDAsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90Pj4gb3V0cHV0cyA9IDAsCiAgICAgdGZsaXRlOjpCdWlsdGluT3B0aW9ucyBidWlsdGluX29wdGlvbnNfdHlwZSA9IHRmbGl0ZTo6QnVpbHRpbk9wdGlvbnNfTk9ORSwKLSAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+IGJ1aWx0aW5fb3B0aW9ucyA9IDAsCi0gICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+PiBjdXN0b21fb3B0aW9ucyA9IDAsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+IGJ1aWx0aW5fb3B0aW9ucyA9IDAsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90Pj4gY3VzdG9tX29wdGlvbnMgPSAwLAogICAgIHRmbGl0ZTo6Q3VzdG9tT3B0aW9uc0Zvcm1hdCBjdXN0b21fb3B0aW9uc19mb3JtYXQgPSB0ZmxpdGU6OkN1c3RvbU9wdGlvbnNGb3JtYXRfRkxFWEJVRkZFUlMsCi0gICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+PiBtdXRhdGluZ192YXJpYWJsZV9pbnB1dHMgPSAwLAotICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90Pj4gaW50ZXJtZWRpYXRlcyA9IDAsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90Pj4gbXV0YXRpbmdfdmFyaWFibGVfaW5wdXRzID0gMCwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+PiBpbnRlcm1lZGlhdGVzID0gMCwKICAgICB1aW50NjRfdCBsYXJnZV9jdXN0b21fb3B0aW9uc19vZmZzZXQgPSAwLAotICAgIHVpbnQ2NF90IGxhcmdlX2N1c3RvbV9vcHRpb25zX3NpemUgPSAwKSB7CisgICAgdWludDY0X3QgbGFyZ2VfY3VzdG9tX29wdGlvbnNfc2l6ZSA9IDAsCisgICAgdGZsaXRlOjpCdWlsdGluT3B0aW9uczIgYnVpbHRpbl9vcHRpb25zXzJfdHlwZSA9IHRmbGl0ZTo6QnVpbHRpbk9wdGlvbnMyX05PTkUsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+IGJ1aWx0aW5fb3B0aW9uc18yID0gMCkgewogICBPcGVyYXRvckJ1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIGJ1aWxkZXJfLmFkZF9sYXJnZV9jdXN0b21fb3B0aW9uc19zaXplKGxhcmdlX2N1c3RvbV9vcHRpb25zX3NpemUpOwogICBidWlsZGVyXy5hZGRfbGFyZ2VfY3VzdG9tX29wdGlvbnNfb2Zmc2V0KGxhcmdlX2N1c3RvbV9vcHRpb25zX29mZnNldCk7CisgIGJ1aWxkZXJfLmFkZF9idWlsdGluX29wdGlvbnNfMihidWlsdGluX29wdGlvbnNfMik7CiAgIGJ1aWxkZXJfLmFkZF9pbnRlcm1lZGlhdGVzKGludGVybWVkaWF0ZXMpOwogICBidWlsZGVyXy5hZGRfbXV0YXRpbmdfdmFyaWFibGVfaW5wdXRzKG11dGF0aW5nX3ZhcmlhYmxlX2lucHV0cyk7CiAgIGJ1aWxkZXJfLmFkZF9jdXN0b21fb3B0aW9ucyhjdXN0b21fb3B0aW9ucyk7CkBAIC0xMjkwNiwyNCArMTU5NTIsMjcgQEAKICAgYnVpbGRlcl8uYWRkX291dHB1dHMob3V0cHV0cyk7CiAgIGJ1aWxkZXJfLmFkZF9pbnB1dHMoaW5wdXRzKTsKICAgYnVpbGRlcl8uYWRkX29wY29kZV9pbmRleChvcGNvZGVfaW5kZXgpOworICBidWlsZGVyXy5hZGRfYnVpbHRpbl9vcHRpb25zXzJfdHlwZShidWlsdGluX29wdGlvbnNfMl90eXBlKTsKICAgYnVpbGRlcl8uYWRkX2N1c3RvbV9vcHRpb25zX2Zvcm1hdChjdXN0b21fb3B0aW9uc19mb3JtYXQpOwogICBidWlsZGVyXy5hZGRfYnVpbHRpbl9vcHRpb25zX3R5cGUoYnVpbHRpbl9vcHRpb25zX3R5cGUpOwogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PE9wZXJhdG9yPiBDcmVhdGVPcGVyYXRvckRpcmVjdCgKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE9wZXJhdG9yPiBDcmVhdGVPcGVyYXRvckRpcmVjdCgKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKICAgICB1aW50MzJfdCBvcGNvZGVfaW5kZXggPSAwLAogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICppbnB1dHMgPSBudWxscHRyLAogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICpvdXRwdXRzID0gbnVsbHB0ciwKICAgICB0ZmxpdGU6OkJ1aWx0aW5PcHRpb25zIGJ1aWx0aW5fb3B0aW9uc190eXBlID0gdGZsaXRlOjpCdWlsdGluT3B0aW9uc19OT05FLAotICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4gYnVpbHRpbl9vcHRpb25zID0gMCwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4gYnVpbHRpbl9vcHRpb25zID0gMCwKICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqY3VzdG9tX29wdGlvbnMgPSBudWxscHRyLAogICAgIHRmbGl0ZTo6Q3VzdG9tT3B0aW9uc0Zvcm1hdCBjdXN0b21fb3B0aW9uc19mb3JtYXQgPSB0ZmxpdGU6OkN1c3RvbU9wdGlvbnNGb3JtYXRfRkxFWEJVRkZFUlMsCiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gKm11dGF0aW5nX3ZhcmlhYmxlX2lucHV0cyA9IG51bGxwdHIsCiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4gKmludGVybWVkaWF0ZXMgPSBudWxscHRyLAogICAgIHVpbnQ2NF90IGxhcmdlX2N1c3RvbV9vcHRpb25zX29mZnNldCA9IDAsCi0gICAgdWludDY0X3QgbGFyZ2VfY3VzdG9tX29wdGlvbnNfc2l6ZSA9IDApIHsKKyAgICB1aW50NjRfdCBsYXJnZV9jdXN0b21fb3B0aW9uc19zaXplID0gMCwKKyAgICB0ZmxpdGU6OkJ1aWx0aW5PcHRpb25zMiBidWlsdGluX29wdGlvbnNfMl90eXBlID0gdGZsaXRlOjpCdWlsdGluT3B0aW9uczJfTk9ORSwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4gYnVpbHRpbl9vcHRpb25zXzIgPSAwKSB7CiAgIGF1dG8gaW5wdXRzX18gPSBpbnB1dHMgPyBfZmJiLkNyZWF0ZVZlY3RvcjxpbnQzMl90PigqaW5wdXRzKSA6IDA7CiAgIGF1dG8gb3V0cHV0c19fID0gb3V0cHV0cyA/IF9mYmIuQ3JlYXRlVmVjdG9yPGludDMyX3Q+KCpvdXRwdXRzKSA6IDA7CiAgIGF1dG8gY3VzdG9tX29wdGlvbnNfXyA9IGN1c3RvbV9vcHRpb25zID8gX2ZiYi5DcmVhdGVWZWN0b3I8dWludDhfdD4oKmN1c3RvbV9vcHRpb25zKSA6IDA7CkBAIC0xMjk0MSwxMiArMTU5OTAsMTQgQEAKICAgICAgIG11dGF0aW5nX3ZhcmlhYmxlX2lucHV0c19fLAogICAgICAgaW50ZXJtZWRpYXRlc19fLAogICAgICAgbGFyZ2VfY3VzdG9tX29wdGlvbnNfb2Zmc2V0LAotICAgICAgbGFyZ2VfY3VzdG9tX29wdGlvbnNfc2l6ZSk7CisgICAgICBsYXJnZV9jdXN0b21fb3B0aW9uc19zaXplLAorICAgICAgYnVpbHRpbl9vcHRpb25zXzJfdHlwZSwKKyAgICAgIGJ1aWx0aW5fb3B0aW9uc18yKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxPcGVyYXRvcj4gQ3JlYXRlT3BlcmF0b3IoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBPcGVyYXRvclQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8T3BlcmF0b3I+IENyZWF0ZU9wZXJhdG9yKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBPcGVyYXRvclQgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IFN1YkdyYXBoVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IFN1YkdyYXBoVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgU3ViR3JhcGggVGFibGVUeXBlOwogICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8dGZsaXRlOjpUZW5zb3JUPj4gdGVuc29yc3t9OwogICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBpbnB1dHN7fTsKQEAgLTEyOTU5LDcgKzE2MDEwLDcgQEAKICAgU3ViR3JhcGhUICZvcGVyYXRvcj0oU3ViR3JhcGhUIG8pIEZMQVRCVUZGRVJTX05PRVhDRVBUOwogfTsKIAotc3RydWN0IFN1YkdyYXBoIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSBmbGF0YnVmZmVyczo6VGFibGUgeworc3RydWN0IFN1YkdyYXBoIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgU3ViR3JhcGhUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBTdWJHcmFwaEJ1aWxkZXIgQnVpbGRlcjsKICAgZW51bSBGbGF0QnVmZmVyc1ZUYWJsZU9mZnNldCBGTEFUQlVGRkVSU19WVEFCTEVfVU5ERVJMWUlOR19UWVBFIHsKQEAgLTEyOTY5LDIyICsxNjAyMCwyMiBAQAogICAgIFZUX09QRVJBVE9SUyA9IDEwLAogICAgIFZUX05BTUUgPSAxMgogICB9OwotICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpUZW5zb3I+PiAqdGVuc29ycygpIGNvbnN0IHsKLSAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpUZW5zb3I+PiAqPihWVF9URU5TT1JTKTsKKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlRlbnNvcj4+ICp0ZW5zb3JzKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpUZW5zb3I+PiAqPihWVF9URU5TT1JTKTsKICAgfQotICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+ICppbnB1dHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90PiAqPihWVF9JTlBVVFMpOworICBjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4gKmlucHV0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4gKj4oVlRfSU5QVVRTKTsKICAgfQotICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+ICpvdXRwdXRzKCkgY29uc3QgewotICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4gKj4oVlRfT1VUUFVUUyk7CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90PiAqb3V0cHV0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4gKj4oVlRfT1VUUFVUUyk7CiAgIH0KLSAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6T3BlcmF0b3I+PiAqb3BlcmF0b3JzKCkgY29uc3QgewotICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6Ok9wZXJhdG9yPj4gKj4oVlRfT1BFUkFUT1JTKTsKKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6Ok9wZXJhdG9yPj4gKm9wZXJhdG9ycygpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8OjpmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6T3BlcmF0b3I+PiAqPihWVF9PUEVSQVRPUlMpOwogICB9Ci0gIGNvbnN0IGZsYXRidWZmZXJzOjpTdHJpbmcgKm5hbWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqPihWVF9OQU1FKTsKKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6U3RyaW5nICpuYW1lKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlN0cmluZyAqPihWVF9OQU1FKTsKICAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX1RFTlNPUlMpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3Rvcih0ZW5zb3JzKCkpICYmCkBAIC0xMzAwMCw0OCArMTYwNTEsNDggQEAKICAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5U3RyaW5nKG5hbWUoKSkgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBTdWJHcmFwaFQgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oU3ViR3JhcGhUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdWJHcmFwaD4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN1YkdyYXBoVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgU3ViR3JhcGhUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oU3ViR3JhcGhUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3ViR3JhcGg+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN1YkdyYXBoVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IFN1YkdyYXBoQnVpbGRlciB7CiAgIHR5cGVkZWYgU3ViR3JhcGggVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87Ci0gIHZvaWQgYWRkX3RlbnNvcnMoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpUZW5zb3I+Pj4gdGVuc29ycykgeworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgdm9pZCBhZGRfdGVuc29ycyg6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlRlbnNvcj4+PiB0ZW5zb3JzKSB7CiAgICAgZmJiXy5BZGRPZmZzZXQoU3ViR3JhcGg6OlZUX1RFTlNPUlMsIHRlbnNvcnMpOwogICB9Ci0gIHZvaWQgYWRkX2lucHV0cyhmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4+IGlucHV0cykgeworICB2b2lkIGFkZF9pbnB1dHMoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90Pj4gaW5wdXRzKSB7CiAgICAgZmJiXy5BZGRPZmZzZXQoU3ViR3JhcGg6OlZUX0lOUFVUUywgaW5wdXRzKTsKICAgfQotICB2b2lkIGFkZF9vdXRwdXRzKGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90Pj4gb3V0cHV0cykgeworICB2b2lkIGFkZF9vdXRwdXRzKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4+IG91dHB1dHMpIHsKICAgICBmYmJfLkFkZE9mZnNldChTdWJHcmFwaDo6VlRfT1VUUFVUUywgb3V0cHV0cyk7CiAgIH0KLSAgdm9pZCBhZGRfb3BlcmF0b3JzKGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6T3BlcmF0b3I+Pj4gb3BlcmF0b3JzKSB7CisgIHZvaWQgYWRkX29wZXJhdG9ycyg6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6Ok9wZXJhdG9yPj4+IG9wZXJhdG9ycykgewogICAgIGZiYl8uQWRkT2Zmc2V0KFN1YkdyYXBoOjpWVF9PUEVSQVRPUlMsIG9wZXJhdG9ycyk7CiAgIH0KLSAgdm9pZCBhZGRfbmFtZShmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+IG5hbWUpIHsKKyAgdm9pZCBhZGRfbmFtZSg6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6U3RyaW5nPiBuYW1lKSB7CiAgICAgZmJiXy5BZGRPZmZzZXQoU3ViR3JhcGg6OlZUX05BTUUsIG5hbWUpOwogICB9Ci0gIGV4cGxpY2l0IFN1YkdyYXBoQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIGV4cGxpY2l0IFN1YkdyYXBoQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PFN1YkdyYXBoPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdWJHcmFwaD4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8U3ViR3JhcGg+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN1YkdyYXBoPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdWJHcmFwaD4gQ3JlYXRlU3ViR3JhcGgoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAotICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6VGVuc29yPj4+IHRlbnNvcnMgPSAwLAotICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90Pj4gaW5wdXRzID0gMCwKLSAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4+IG91dHB1dHMgPSAwLAotICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6T3BlcmF0b3I+Pj4gb3BlcmF0b3JzID0gMCwKLSAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+IG5hbWUgPSAwKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN1YkdyYXBoPiBDcmVhdGVTdWJHcmFwaCgKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlRlbnNvcj4+PiB0ZW5zb3JzID0gMCwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+PiBpbnB1dHMgPSAwLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4+IG91dHB1dHMgPSAwLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8OjpmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6T3BlcmF0b3I+Pj4gb3BlcmF0b3JzID0gMCwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6U3RyaW5nPiBuYW1lID0gMCkgewogICBTdWJHcmFwaEJ1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIGJ1aWxkZXJfLmFkZF9uYW1lKG5hbWUpOwogICBidWlsZGVyXy5hZGRfb3BlcmF0b3JzKG9wZXJhdG9ycyk7CkBAIC0xMzA1MSwxNyArMTYxMDIsMTcgQEAKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdWJHcmFwaD4gQ3JlYXRlU3ViR3JhcGhEaXJlY3QoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpUZW5zb3I+PiAqdGVuc29ycyA9IG51bGxwdHIsCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN1YkdyYXBoPiBDcmVhdGVTdWJHcmFwaERpcmVjdCgKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpUZW5zb3I+PiAqdGVuc29ycyA9IG51bGxwdHIsCiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4gKmlucHV0cyA9IG51bGxwdHIsCiAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4gKm91dHB1dHMgPSBudWxscHRyLAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpPcGVyYXRvcj4+ICpvcGVyYXRvcnMgPSBudWxscHRyLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6Ok9wZXJhdG9yPj4gKm9wZXJhdG9ycyA9IG51bGxwdHIsCiAgICAgY29uc3QgY2hhciAqbmFtZSA9IG51bGxwdHIpIHsKLSAgYXV0byB0ZW5zb3JzX18gPSB0ZW5zb3JzID8gX2ZiYi5DcmVhdGVWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlRlbnNvcj4+KCp0ZW5zb3JzKSA6IDA7CisgIGF1dG8gdGVuc29yc19fID0gdGVuc29ycyA/IF9mYmIuQ3JlYXRlVmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlRlbnNvcj4+KCp0ZW5zb3JzKSA6IDA7CiAgIGF1dG8gaW5wdXRzX18gPSBpbnB1dHMgPyBfZmJiLkNyZWF0ZVZlY3RvcjxpbnQzMl90PigqaW5wdXRzKSA6IDA7CiAgIGF1dG8gb3V0cHV0c19fID0gb3V0cHV0cyA/IF9mYmIuQ3JlYXRlVmVjdG9yPGludDMyX3Q+KCpvdXRwdXRzKSA6IDA7Ci0gIGF1dG8gb3BlcmF0b3JzX18gPSBvcGVyYXRvcnMgPyBfZmJiLkNyZWF0ZVZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6T3BlcmF0b3I+Pigqb3BlcmF0b3JzKSA6IDA7CisgIGF1dG8gb3BlcmF0b3JzX18gPSBvcGVyYXRvcnMgPyBfZmJiLkNyZWF0ZVZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpPcGVyYXRvcj4+KCpvcGVyYXRvcnMpIDogMDsKICAgYXV0byBuYW1lX18gPSBuYW1lID8gX2ZiYi5DcmVhdGVTdHJpbmcobmFtZSkgOiAwOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVTdWJHcmFwaCgKICAgICAgIF9mYmIsCkBAIC0xMzA3MiwxNiArMTYxMjMsMTYgQEAKICAgICAgIG5hbWVfXyk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8U3ViR3JhcGg+IENyZWF0ZVN1YkdyYXBoKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3ViR3JhcGhUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN1YkdyYXBoPiBDcmVhdGVTdWJHcmFwaCg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3ViR3JhcGhUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBCdWZmZXJUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgQnVmZmVyVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgQnVmZmVyIFRhYmxlVHlwZTsKICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YXt9OwogICB1aW50NjRfdCBvZmZzZXQgPSAwOwogICB1aW50NjRfdCBzaXplID0gMDsKIH07CiAKLXN0cnVjdCBCdWZmZXIgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgQnVmZmVyIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgQnVmZmVyVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgQnVmZmVyQnVpbGRlciBCdWlsZGVyOwogICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgewpAQCAtMTMwODksOCArMTYxNDAsOCBAQAogICAgIFZUX09GRlNFVCA9IDYsCiAgICAgVlRfU0laRSA9IDgKICAgfTsKLSAgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqZGF0YSgpIGNvbnN0IHsKLSAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICo+KFZUX0RBVEEpOworICBjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKmRhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICo+KFZUX0RBVEEpOwogICB9CiAgIHVpbnQ2NF90IG9mZnNldCgpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8dWludDY0X3Q+KFZUX09GRlNFVCwgMCk7CkBAIC0xMzA5OCw3ICsxNjE0OSw3IEBACiAgIHVpbnQ2NF90IHNpemUoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldEZpZWxkPHVpbnQ2NF90PihWVF9TSVpFLCAwKTsKICAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX0RBVEEpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3RvcihkYXRhKCkpICYmCkBAIC0xMzEwNiwxNiArMTYxNTcsMTYgQEAKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8dWludDY0X3Q+KHZlcmlmaWVyLCBWVF9TSVpFLCA4KSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIEJ1ZmZlclQgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oQnVmZmVyVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8QnVmZmVyPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQnVmZmVyVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgQnVmZmVyVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKEJ1ZmZlclQgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCdWZmZXI+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEJ1ZmZlclQqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBCdWZmZXJCdWlsZGVyIHsKICAgdHlwZWRlZiBCdWZmZXIgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87Ci0gIHZvaWQgYWRkX2RhdGEoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+PiBkYXRhKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICB2b2lkIGFkZF9kYXRhKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4+IGRhdGEpIHsKICAgICBmYmJfLkFkZE9mZnNldChCdWZmZXI6OlZUX0RBVEEsIGRhdGEpOwogICB9CiAgIHZvaWQgYWRkX29mZnNldCh1aW50NjRfdCBvZmZzZXQpIHsKQEAgLTEzMTI0LDIwICsxNjE3NSwyMCBAQAogICB2b2lkIGFkZF9zaXplKHVpbnQ2NF90IHNpemUpIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDY0X3Q+KEJ1ZmZlcjo6VlRfU0laRSwgc2l6ZSwgMCk7CiAgIH0KLSAgZXhwbGljaXQgQnVmZmVyQnVpbGRlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCisgIGV4cGxpY2l0IEJ1ZmZlckJ1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCdWZmZXI+IEZpbmlzaCgpIHsKKyAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEJ1ZmZlcj4gRmluaXNoKCkgewogICAgIGNvbnN0IGF1dG8gZW5kID0gZmJiXy5FbmRUYWJsZShzdGFydF8pOwotICAgIGF1dG8gbyA9IGZsYXRidWZmZXJzOjpPZmZzZXQ8QnVmZmVyPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCdWZmZXI+KGVuZCk7CiAgICAgcmV0dXJuIG87CiAgIH0KIH07CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEJ1ZmZlcj4gQ3JlYXRlQnVmZmVyKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKLSAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4+IGRhdGEgPSAwLAoraW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCdWZmZXI+IENyZWF0ZUJ1ZmZlcigKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+PiBkYXRhID0gMCwKICAgICB1aW50NjRfdCBvZmZzZXQgPSAwLAogICAgIHVpbnQ2NF90IHNpemUgPSAwKSB7CiAgIEJ1ZmZlckJ1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CkBAIC0xMzE0Nyw4ICsxNjE5OCw4IEBACiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8QnVmZmVyPiBDcmVhdGVCdWZmZXJEaXJlY3QoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAoraW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCdWZmZXI+IENyZWF0ZUJ1ZmZlckRpcmVjdCgKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqZGF0YSA9IG51bGxwdHIsCiAgICAgdWludDY0X3Qgb2Zmc2V0ID0gMCwKICAgICB1aW50NjRfdCBzaXplID0gMCkgewpAQCAtMTMxNjEsNjMgKzE2MjEyLDYzIEBACiAgICAgICBzaXplKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCdWZmZXI+IENyZWF0ZUJ1ZmZlcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEJ1ZmZlclQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QnVmZmVyPiBDcmVhdGVCdWZmZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEJ1ZmZlclQgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IE1ldGFkYXRhVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IE1ldGFkYXRhVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgTWV0YWRhdGEgVGFibGVUeXBlOwogICBzdGQ6OnN0cmluZyBuYW1le307CiAgIHVpbnQzMl90IGJ1ZmZlciA9IDA7CiB9OwogCi1zdHJ1Y3QgTWV0YWRhdGEgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgTWV0YWRhdGEgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBNZXRhZGF0YVQgTmF0aXZlVGFibGVUeXBlOwogICB0eXBlZGVmIE1ldGFkYXRhQnVpbGRlciBCdWlsZGVyOwogICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgewogICAgIFZUX05BTUUgPSA0LAogICAgIFZUX0JVRkZFUiA9IDYKICAgfTsKLSAgY29uc3QgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqbmFtZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6U3RyaW5nICo+KFZUX05BTUUpOworICBjb25zdCA6OmZsYXRidWZmZXJzOjpTdHJpbmcgKm5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgOjpmbGF0YnVmZmVyczo6U3RyaW5nICo+KFZUX05BTUUpOwogICB9CiAgIHVpbnQzMl90IGJ1ZmZlcigpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8dWludDMyX3Q+KFZUX0JVRkZFUiwgMCk7CiAgIH0KLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgVmVyaWZ5T2Zmc2V0KHZlcmlmaWVyLCBWVF9OQU1FKSAmJgogICAgICAgICAgICB2ZXJpZmllci5WZXJpZnlTdHJpbmcobmFtZSgpKSAmJgogICAgICAgICAgICBWZXJpZnlGaWVsZDx1aW50MzJfdD4odmVyaWZpZXIsIFZUX0JVRkZFUiwgNCkgJiYKICAgICAgICAgICAgdmVyaWZpZXIuRW5kVGFibGUoKTsKICAgfQotICBNZXRhZGF0YVQgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oTWV0YWRhdGFUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNZXRhZGF0YT4gUGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE1ldGFkYXRhVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgTWV0YWRhdGFUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oTWV0YWRhdGFUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHN0YXRpYyA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TWV0YWRhdGE+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE1ldGFkYXRhVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IE1ldGFkYXRhQnVpbGRlciB7CiAgIHR5cGVkZWYgTWV0YWRhdGEgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87Ci0gIHZvaWQgYWRkX25hbWUoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPiBuYW1lKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICB2b2lkIGFkZF9uYW1lKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpTdHJpbmc+IG5hbWUpIHsKICAgICBmYmJfLkFkZE9mZnNldChNZXRhZGF0YTo6VlRfTkFNRSwgbmFtZSk7CiAgIH0KICAgdm9pZCBhZGRfYnVmZmVyKHVpbnQzMl90IGJ1ZmZlcikgewogICAgIGZiYl8uQWRkRWxlbWVudDx1aW50MzJfdD4oTWV0YWRhdGE6OlZUX0JVRkZFUiwgYnVmZmVyLCAwKTsKICAgfQotICBleHBsaWNpdCBNZXRhZGF0YUJ1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICBleHBsaWNpdCBNZXRhZGF0YUJ1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNZXRhZGF0YT4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TWV0YWRhdGE+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PE1ldGFkYXRhPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNZXRhZGF0YT4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TWV0YWRhdGE+IENyZWF0ZU1ldGFkYXRhKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKLSAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+IG5hbWUgPSAwLAoraW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNZXRhZGF0YT4gQ3JlYXRlTWV0YWRhdGEoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlN0cmluZz4gbmFtZSA9IDAsCiAgICAgdWludDMyX3QgYnVmZmVyID0gMCkgewogICBNZXRhZGF0YUJ1aWxkZXIgYnVpbGRlcl8oX2ZiYik7CiAgIGJ1aWxkZXJfLmFkZF9idWZmZXIoYnVmZmVyKTsKQEAgLTEzMjI1LDggKzE2Mjc2LDggQEAKICAgcmV0dXJuIGJ1aWxkZXJfLkZpbmlzaCgpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNZXRhZGF0YT4gQ3JlYXRlTWV0YWRhdGFEaXJlY3QoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAoraW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNZXRhZGF0YT4gQ3JlYXRlTWV0YWRhdGFEaXJlY3QoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCiAgICAgY29uc3QgY2hhciAqbmFtZSA9IG51bGxwdHIsCiAgICAgdWludDMyX3QgYnVmZmVyID0gMCkgewogICBhdXRvIG5hbWVfXyA9IG5hbWUgPyBfZmJiLkNyZWF0ZVN0cmluZyhuYW1lKSA6IDA7CkBAIC0xMzIzNiw2MyArMTYyODcsNjMgQEAKICAgICAgIGJ1ZmZlcik7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8TWV0YWRhdGE+IENyZWF0ZU1ldGFkYXRhKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTWV0YWRhdGFUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE1ldGFkYXRhPiBDcmVhdGVNZXRhZGF0YSg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTWV0YWRhdGFUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBUZW5zb3JNYXBUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgVGVuc29yTWFwVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgVGVuc29yTWFwIFRhYmxlVHlwZTsKICAgc3RkOjpzdHJpbmcgbmFtZXt9OwogICB1aW50MzJfdCB0ZW5zb3JfaW5kZXggPSAwOwogfTsKIAotc3RydWN0IFRlbnNvck1hcCBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBUZW5zb3JNYXAgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIDo6ZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKICAgdHlwZWRlZiBUZW5zb3JNYXBUIE5hdGl2ZVRhYmxlVHlwZTsKICAgdHlwZWRlZiBUZW5zb3JNYXBCdWlsZGVyIEJ1aWxkZXI7CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CiAgICAgVlRfTkFNRSA9IDQsCiAgICAgVlRfVEVOU09SX0lOREVYID0gNgogICB9OwotICBjb25zdCBmbGF0YnVmZmVyczo6U3RyaW5nICpuYW1lKCkgY29uc3QgewotICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpTdHJpbmcgKj4oVlRfTkFNRSk7CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlN0cmluZyAqbmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpTdHJpbmcgKj4oVlRfTkFNRSk7CiAgIH0KICAgdWludDMyX3QgdGVuc29yX2luZGV4KCkgY29uc3QgewogICAgIHJldHVybiBHZXRGaWVsZDx1aW50MzJfdD4oVlRfVEVOU09SX0lOREVYLCAwKTsKICAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX05BTUUpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVN0cmluZyhuYW1lKCkpICYmCiAgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQzMl90Pih2ZXJpZmllciwgVlRfVEVOU09SX0lOREVYLCA0KSAmJgogICAgICAgICAgICB2ZXJpZmllci5FbmRUYWJsZSgpOwogICB9Ci0gIFRlbnNvck1hcFQgKlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7Ci0gIHZvaWQgVW5QYWNrVG8oVGVuc29yTWFwVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8VGVuc29yTWFwPiBQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVGVuc29yTWFwVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKKyAgVGVuc29yTWFwVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKFRlbnNvck1hcFQgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKKyAgc3RhdGljIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZW5zb3JNYXA+IFBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFRlbnNvck1hcFQqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBUZW5zb3JNYXBCdWlsZGVyIHsKICAgdHlwZWRlZiBUZW5zb3JNYXAgVGFibGU7Ci0gIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKLSAgZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBzdGFydF87Ci0gIHZvaWQgYWRkX25hbWUoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPiBuYW1lKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOworICA6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICB2b2lkIGFkZF9uYW1lKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpTdHJpbmc+IG5hbWUpIHsKICAgICBmYmJfLkFkZE9mZnNldChUZW5zb3JNYXA6OlZUX05BTUUsIG5hbWUpOwogICB9CiAgIHZvaWQgYWRkX3RlbnNvcl9pbmRleCh1aW50MzJfdCB0ZW5zb3JfaW5kZXgpIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDMyX3Q+KFRlbnNvck1hcDo6VlRfVEVOU09SX0lOREVYLCB0ZW5zb3JfaW5kZXgsIDApOwogICB9Ci0gIGV4cGxpY2l0IFRlbnNvck1hcEJ1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICBleHBsaWNpdCBUZW5zb3JNYXBCdWlsZGVyKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQogICAgICAgICA6IGZiYl8oX2ZiYikgewogICAgIHN0YXJ0XyA9IGZiYl8uU3RhcnRUYWJsZSgpOwogICB9Ci0gIGZsYXRidWZmZXJzOjpPZmZzZXQ8VGVuc29yTWFwPiBGaW5pc2goKSB7CisgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZW5zb3JNYXA+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PFRlbnNvck1hcD4oZW5kKTsKKyAgICBhdXRvIG8gPSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VGVuc29yTWFwPihlbmQpOwogICAgIHJldHVybiBvOwogICB9CiB9OwogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZW5zb3JNYXA+IENyZWF0ZVRlbnNvck1hcCgKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCi0gICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPiBuYW1lID0gMCwKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VGVuc29yTWFwPiBDcmVhdGVUZW5zb3JNYXAoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlN0cmluZz4gbmFtZSA9IDAsCiAgICAgdWludDMyX3QgdGVuc29yX2luZGV4ID0gMCkgewogICBUZW5zb3JNYXBCdWlsZGVyIGJ1aWxkZXJfKF9mYmIpOwogICBidWlsZGVyXy5hZGRfdGVuc29yX2luZGV4KHRlbnNvcl9pbmRleCk7CkBAIC0xMzMwMCw4ICsxNjM1MSw4IEBACiAgIHJldHVybiBidWlsZGVyXy5GaW5pc2goKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8VGVuc29yTWFwPiBDcmVhdGVUZW5zb3JNYXBEaXJlY3QoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAoraW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZW5zb3JNYXA+IENyZWF0ZVRlbnNvck1hcERpcmVjdCgKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKICAgICBjb25zdCBjaGFyICpuYW1lID0gbnVsbHB0ciwKICAgICB1aW50MzJfdCB0ZW5zb3JfaW5kZXggPSAwKSB7CiAgIGF1dG8gbmFtZV9fID0gbmFtZSA/IF9mYmIuQ3JlYXRlU3RyaW5nKG5hbWUpIDogMDsKQEAgLTEzMzExLDkgKzE2MzYyLDkgQEAKICAgICAgIHRlbnNvcl9pbmRleCk7CiB9CiAKLWZsYXRidWZmZXJzOjpPZmZzZXQ8VGVuc29yTWFwPiBDcmVhdGVUZW5zb3JNYXAoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBUZW5zb3JNYXBUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFRlbnNvck1hcD4gQ3JlYXRlVGVuc29yTWFwKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBUZW5zb3JNYXBUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CiAKLXN0cnVjdCBTaWduYXR1cmVEZWZUIDogcHVibGljIGZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CitzdHJ1Y3QgU2lnbmF0dXJlRGVmVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgU2lnbmF0dXJlRGVmIFRhYmxlVHlwZTsKICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPHRmbGl0ZTo6VGVuc29yTWFwVD4+IGlucHV0c3t9OwogICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8dGZsaXRlOjpUZW5zb3JNYXBUPj4gb3V0cHV0c3t9OwpAQCAtMTMzMjUsNyArMTYzNzYsNyBAQAogICBTaWduYXR1cmVEZWZUICZvcGVyYXRvcj0oU2lnbmF0dXJlRGVmVCBvKSBGTEFUQlVGRkVSU19OT0VYQ0VQVDsKIH07CiAKLXN0cnVjdCBTaWduYXR1cmVEZWYgRkxBVEJVRkZFUlNfRklOQUxfQ0xBU1MgOiBwcml2YXRlIGZsYXRidWZmZXJzOjpUYWJsZSB7CitzdHJ1Y3QgU2lnbmF0dXJlRGVmIEZMQVRCVUZGRVJTX0ZJTkFMX0NMQVNTIDogcHJpdmF0ZSA6OmZsYXRidWZmZXJzOjpUYWJsZSB7CiAgIHR5cGVkZWYgU2lnbmF0dXJlRGVmVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgU2lnbmF0dXJlRGVmQnVpbGRlciBCdWlsZGVyOwogICBlbnVtIEZsYXRCdWZmZXJzVlRhYmxlT2Zmc2V0IEZMQVRCVUZGRVJTX1ZUQUJMRV9VTkRFUkxZSU5HX1RZUEUgewpAQCAtMTMzMzQsMTkgKzE2Mzg1LDE5IEBACiAgICAgVlRfU0lHTkFUVVJFX0tFWSA9IDgsCiAgICAgVlRfU1VCR1JBUEhfSU5ERVggPSAxMgogICB9OwotICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpUZW5zb3JNYXA+PiAqaW5wdXRzKCkgY29uc3QgewotICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlRlbnNvck1hcD4+ICo+KFZUX0lOUFVUUyk7CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpUZW5zb3JNYXA+PiAqaW5wdXRzKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpUZW5zb3JNYXA+PiAqPihWVF9JTlBVVFMpOwogICB9Ci0gIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlRlbnNvck1hcD4+ICpvdXRwdXRzKCkgY29uc3QgewotICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlRlbnNvck1hcD4+ICo+KFZUX09VVFBVVFMpOworICBjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8OjpmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6VGVuc29yTWFwPj4gKm91dHB1dHMoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlRlbnNvck1hcD4+ICo+KFZUX09VVFBVVFMpOwogICB9Ci0gIGNvbnN0IGZsYXRidWZmZXJzOjpTdHJpbmcgKnNpZ25hdHVyZV9rZXkoKSBjb25zdCB7Ci0gICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqPihWVF9TSUdOQVRVUkVfS0VZKTsKKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6U3RyaW5nICpzaWduYXR1cmVfa2V5KCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlN0cmluZyAqPihWVF9TSUdOQVRVUkVfS0VZKTsKICAgfQogICB1aW50MzJfdCBzdWJncmFwaF9pbmRleCgpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8dWludDMyX3Q+KFZUX1NVQkdSQVBIX0lOREVYLCAwKTsKICAgfQotICBib29sIFZlcmlmeShmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyKSBjb25zdCB7CisgIGJvb2wgVmVyaWZ5KDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgewogICAgIHJldHVybiBWZXJpZnlUYWJsZVN0YXJ0KHZlcmlmaWVyKSAmJgogICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX0lOUFVUUykgJiYKICAgICAgICAgICAgdmVyaWZpZXIuVmVyaWZ5VmVjdG9yKGlucHV0cygpKSAmJgpAQCAtMTMzNTksNDMgKzE2NDEwLDQzIEBACiAgICAgICAgICAgIFZlcmlmeUZpZWxkPHVpbnQzMl90Pih2ZXJpZmllciwgVlRfU1VCR1JBUEhfSU5ERVgsIDQpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgU2lnbmF0dXJlRGVmVCAqVW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgdm9pZCBVblBhY2tUbyhTaWduYXR1cmVEZWZUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICBzdGF0aWMgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTaWduYXR1cmVEZWY+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTaWduYXR1cmVEZWZUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOworICBTaWduYXR1cmVEZWZUICpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgVW5QYWNrVG8oU2lnbmF0dXJlRGVmVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNpZ25hdHVyZURlZj4gUGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU2lnbmF0dXJlRGVmVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlciA9IG51bGxwdHIpOwogfTsKIAogc3RydWN0IFNpZ25hdHVyZURlZkJ1aWxkZXIgewogICB0eXBlZGVmIFNpZ25hdHVyZURlZiBUYWJsZTsKLSAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZmYmJfOwotICBmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKLSAgdm9pZCBhZGRfaW5wdXRzKGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6VGVuc29yTWFwPj4+IGlucHV0cykgeworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKKyAgdm9pZCBhZGRfaW5wdXRzKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8OjpmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6VGVuc29yTWFwPj4+IGlucHV0cykgewogICAgIGZiYl8uQWRkT2Zmc2V0KFNpZ25hdHVyZURlZjo6VlRfSU5QVVRTLCBpbnB1dHMpOwogICB9Ci0gIHZvaWQgYWRkX291dHB1dHMoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpUZW5zb3JNYXA+Pj4gb3V0cHV0cykgeworICB2b2lkIGFkZF9vdXRwdXRzKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8OjpmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6VGVuc29yTWFwPj4+IG91dHB1dHMpIHsKICAgICBmYmJfLkFkZE9mZnNldChTaWduYXR1cmVEZWY6OlZUX09VVFBVVFMsIG91dHB1dHMpOwogICB9Ci0gIHZvaWQgYWRkX3NpZ25hdHVyZV9rZXkoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPiBzaWduYXR1cmVfa2V5KSB7CisgIHZvaWQgYWRkX3NpZ25hdHVyZV9rZXkoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlN0cmluZz4gc2lnbmF0dXJlX2tleSkgewogICAgIGZiYl8uQWRkT2Zmc2V0KFNpZ25hdHVyZURlZjo6VlRfU0lHTkFUVVJFX0tFWSwgc2lnbmF0dXJlX2tleSk7CiAgIH0KICAgdm9pZCBhZGRfc3ViZ3JhcGhfaW5kZXgodWludDMyX3Qgc3ViZ3JhcGhfaW5kZXgpIHsKICAgICBmYmJfLkFkZEVsZW1lbnQ8dWludDMyX3Q+KFNpZ25hdHVyZURlZjo6VlRfU1VCR1JBUEhfSU5ERVgsIHN1YmdyYXBoX2luZGV4LCAwKTsKICAgfQotICBleHBsaWNpdCBTaWduYXR1cmVEZWZCdWlsZGVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKKyAgZXhwbGljaXQgU2lnbmF0dXJlRGVmQnVpbGRlcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYikKICAgICAgICAgOiBmYmJfKF9mYmIpIHsKICAgICBzdGFydF8gPSBmYmJfLlN0YXJ0VGFibGUoKTsKICAgfQotICBmbGF0YnVmZmVyczo6T2Zmc2V0PFNpZ25hdHVyZURlZj4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U2lnbmF0dXJlRGVmPiBGaW5pc2goKSB7CiAgICAgY29uc3QgYXV0byBlbmQgPSBmYmJfLkVuZFRhYmxlKHN0YXJ0Xyk7Ci0gICAgYXV0byBvID0gZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTaWduYXR1cmVEZWY+KGVuZCk7CisgICAgYXV0byBvID0gOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNpZ25hdHVyZURlZj4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U2lnbmF0dXJlRGVmPiBDcmVhdGVTaWduYXR1cmVEZWYoCi0gICAgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAotICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6VGVuc29yTWFwPj4+IGlucHV0cyA9IDAsCi0gICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpUZW5zb3JNYXA+Pj4gb3V0cHV0cyA9IDAsCi0gICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPiBzaWduYXR1cmVfa2V5ID0gMCwKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U2lnbmF0dXJlRGVmPiBDcmVhdGVTaWduYXR1cmVEZWYoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpUZW5zb3JNYXA+Pj4gaW5wdXRzID0gMCwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlRlbnNvck1hcD4+PiBvdXRwdXRzID0gMCwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6U3RyaW5nPiBzaWduYXR1cmVfa2V5ID0gMCwKICAgICB1aW50MzJfdCBzdWJncmFwaF9pbmRleCA9IDApIHsKICAgU2lnbmF0dXJlRGVmQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKICAgYnVpbGRlcl8uYWRkX3N1YmdyYXBoX2luZGV4KHN1YmdyYXBoX2luZGV4KTsKQEAgLTEzNDA1LDE0ICsxNjQ1NiwxNCBAQAogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNpZ25hdHVyZURlZj4gQ3JlYXRlU2lnbmF0dXJlRGVmRGlyZWN0KAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6VGVuc29yTWFwPj4gKmlucHV0cyA9IG51bGxwdHIsCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlRlbnNvck1hcD4+ICpvdXRwdXRzID0gbnVsbHB0ciwKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U2lnbmF0dXJlRGVmPiBDcmVhdGVTaWduYXR1cmVEZWZEaXJlY3QoCisgICAgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8OjpmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6VGVuc29yTWFwPj4gKmlucHV0cyA9IG51bGxwdHIsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8OjpmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6VGVuc29yTWFwPj4gKm91dHB1dHMgPSBudWxscHRyLAogICAgIGNvbnN0IGNoYXIgKnNpZ25hdHVyZV9rZXkgPSBudWxscHRyLAogICAgIHVpbnQzMl90IHN1YmdyYXBoX2luZGV4ID0gMCkgewotICBhdXRvIGlucHV0c19fID0gaW5wdXRzID8gX2ZiYi5DcmVhdGVWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlRlbnNvck1hcD4+KCppbnB1dHMpIDogMDsKLSAgYXV0byBvdXRwdXRzX18gPSBvdXRwdXRzID8gX2ZiYi5DcmVhdGVWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlRlbnNvck1hcD4+KCpvdXRwdXRzKSA6IDA7CisgIGF1dG8gaW5wdXRzX18gPSBpbnB1dHMgPyBfZmJiLkNyZWF0ZVZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpUZW5zb3JNYXA+PigqaW5wdXRzKSA6IDA7CisgIGF1dG8gb3V0cHV0c19fID0gb3V0cHV0cyA/IF9mYmIuQ3JlYXRlVmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlRlbnNvck1hcD4+KCpvdXRwdXRzKSA6IDA7CiAgIGF1dG8gc2lnbmF0dXJlX2tleV9fID0gc2lnbmF0dXJlX2tleSA/IF9mYmIuQ3JlYXRlU3RyaW5nKHNpZ25hdHVyZV9rZXkpIDogMDsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlU2lnbmF0dXJlRGVmKAogICAgICAgX2ZiYiwKQEAgLTEzNDIyLDkgKzE2NDczLDkgQEAKICAgICAgIHN1YmdyYXBoX2luZGV4KTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTaWduYXR1cmVEZWY+IENyZWF0ZVNpZ25hdHVyZURlZihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNpZ25hdHVyZURlZlQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U2lnbmF0dXJlRGVmPiBDcmVhdGVTaWduYXR1cmVEZWYoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNpZ25hdHVyZURlZlQgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotc3RydWN0IE1vZGVsVCA6IHB1YmxpYyBmbGF0YnVmZmVyczo6TmF0aXZlVGFibGUgeworc3RydWN0IE1vZGVsVCA6IHB1YmxpYyA6OmZsYXRidWZmZXJzOjpOYXRpdmVUYWJsZSB7CiAgIHR5cGVkZWYgTW9kZWwgVGFibGVUeXBlOwogICB1aW50MzJfdCB2ZXJzaW9uID0gMDsKICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPHRmbGl0ZTo6T3BlcmF0b3JDb2RlVD4+IG9wZXJhdG9yX2NvZGVze307CkBAIC0xMzQ0MCw3ICsxNjQ5MSw3IEBACiAgIE1vZGVsVCAmb3BlcmF0b3I9KE1vZGVsVCBvKSBGTEFUQlVGRkVSU19OT0VYQ0VQVDsKIH07CiAKLXN0cnVjdCBNb2RlbCBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgZmxhdGJ1ZmZlcnM6OlRhYmxlIHsKK3N0cnVjdCBNb2RlbCBGTEFUQlVGRkVSU19GSU5BTF9DTEFTUyA6IHByaXZhdGUgOjpmbGF0YnVmZmVyczo6VGFibGUgewogICB0eXBlZGVmIE1vZGVsVCBOYXRpdmVUYWJsZVR5cGU7CiAgIHR5cGVkZWYgTW9kZWxCdWlsZGVyIEJ1aWxkZXI7CiAgIGVudW0gRmxhdEJ1ZmZlcnNWVGFibGVPZmZzZXQgRkxBVEJVRkZFUlNfVlRBQkxFX1VOREVSTFlJTkdfVFlQRSB7CkBAIC0xMzQ1NiwyOCArMTY1MDcsMjggQEAKICAgdWludDMyX3QgdmVyc2lvbigpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0RmllbGQ8dWludDMyX3Q+KFZUX1ZFUlNJT04sIDApOwogICB9Ci0gIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6Ok9wZXJhdG9yQ29kZT4+ICpvcGVyYXRvcl9jb2RlcygpIGNvbnN0IHsKLSAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpPcGVyYXRvckNvZGU+PiAqPihWVF9PUEVSQVRPUl9DT0RFUyk7CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpPcGVyYXRvckNvZGU+PiAqb3BlcmF0b3JfY29kZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6Ok9wZXJhdG9yQ29kZT4+ICo+KFZUX09QRVJBVE9SX0NPREVTKTsKICAgfQotICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpTdWJHcmFwaD4+ICpzdWJncmFwaHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6U3ViR3JhcGg+PiAqPihWVF9TVUJHUkFQSFMpOworICBjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8OjpmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6U3ViR3JhcGg+PiAqc3ViZ3JhcGhzKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpTdWJHcmFwaD4+ICo+KFZUX1NVQkdSQVBIUyk7CiAgIH0KLSAgY29uc3QgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqZGVzY3JpcHRpb24oKSBjb25zdCB7Ci0gICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlN0cmluZyAqPihWVF9ERVNDUklQVElPTik7CisgIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlN0cmluZyAqZGVzY3JpcHRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgOjpmbGF0YnVmZmVyczo6U3RyaW5nICo+KFZUX0RFU0NSSVBUSU9OKTsKICAgfQotICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpCdWZmZXI+PiAqYnVmZmVycygpIGNvbnN0IHsKLSAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpCdWZmZXI+PiAqPihWVF9CVUZGRVJTKTsKKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OkJ1ZmZlcj4+ICpidWZmZXJzKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpCdWZmZXI+PiAqPihWVF9CVUZGRVJTKTsKICAgfQotICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+ICptZXRhZGF0YV9idWZmZXIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxpbnQzMl90PiAqPihWVF9NRVRBREFUQV9CVUZGRVIpOworICBjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4gKm1ldGFkYXRhX2J1ZmZlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4gKj4oVlRfTUVUQURBVEFfQlVGRkVSKTsKICAgfQotICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpNZXRhZGF0YT4+ICptZXRhZGF0YSgpIGNvbnN0IHsKLSAgICByZXR1cm4gR2V0UG9pbnRlcjxjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpNZXRhZGF0YT4+ICo+KFZUX01FVEFEQVRBKTsKKyAgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6Ok1ldGFkYXRhPj4gKm1ldGFkYXRhKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpNZXRhZGF0YT4+ICo+KFZUX01FVEFEQVRBKTsKICAgfQotICBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpTaWduYXR1cmVEZWY+PiAqc2lnbmF0dXJlX2RlZnMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIEdldFBvaW50ZXI8Y29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6U2lnbmF0dXJlRGVmPj4gKj4oVlRfU0lHTkFUVVJFX0RFRlMpOworICBjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8OjpmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6U2lnbmF0dXJlRGVmPj4gKnNpZ25hdHVyZV9kZWZzKCkgY29uc3QgeworICAgIHJldHVybiBHZXRQb2ludGVyPGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpTaWduYXR1cmVEZWY+PiAqPihWVF9TSUdOQVRVUkVfREVGUyk7CiAgIH0KLSAgYm9vbCBWZXJpZnkoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllcikgY29uc3QgeworICBib29sIFZlcmlmeSg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIGNvbnN0IHsKICAgICByZXR1cm4gVmVyaWZ5VGFibGVTdGFydCh2ZXJpZmllcikgJiYKICAgICAgICAgICAgVmVyaWZ5RmllbGQ8dWludDMyX3Q+KHZlcmlmaWVyLCBWVF9WRVJTSU9OLCA0KSAmJgogICAgICAgICAgICBWZXJpZnlPZmZzZXQodmVyaWZpZXIsIFZUX09QRVJBVE9SX0NPREVTKSAmJgpAQCAtMTM1MDEsNjAgKzE2NTUyLDYwIEBACiAgICAgICAgICAgIHZlcmlmaWVyLlZlcmlmeVZlY3Rvck9mVGFibGVzKHNpZ25hdHVyZV9kZWZzKCkpICYmCiAgICAgICAgICAgIHZlcmlmaWVyLkVuZFRhYmxlKCk7CiAgIH0KLSAgTW9kZWxUICpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OwotICB2b2lkIFVuUGFja1RvKE1vZGVsVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIgPSBudWxscHRyKSBjb25zdDsKLSAgc3RhdGljIGZsYXRidWZmZXJzOjpPZmZzZXQ8TW9kZWw+IFBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBNb2RlbFQqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7CisgIE1vZGVsVCAqVW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIFVuUGFja1RvKE1vZGVsVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlciA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE1vZGVsPiBQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBNb2RlbFQqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIH07CiAKIHN0cnVjdCBNb2RlbEJ1aWxkZXIgewogICB0eXBlZGVmIE1vZGVsIFRhYmxlOwotICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYl87Ci0gIGZsYXRidWZmZXJzOjp1b2Zmc2V0X3Qgc3RhcnRfOworICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiXzsKKyAgOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IHN0YXJ0XzsKICAgdm9pZCBhZGRfdmVyc2lvbih1aW50MzJfdCB2ZXJzaW9uKSB7CiAgICAgZmJiXy5BZGRFbGVtZW50PHVpbnQzMl90PihNb2RlbDo6VlRfVkVSU0lPTiwgdmVyc2lvbiwgMCk7CiAgIH0KLSAgdm9pZCBhZGRfb3BlcmF0b3JfY29kZXMoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpPcGVyYXRvckNvZGU+Pj4gb3BlcmF0b3JfY29kZXMpIHsKKyAgdm9pZCBhZGRfb3BlcmF0b3JfY29kZXMoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpPcGVyYXRvckNvZGU+Pj4gb3BlcmF0b3JfY29kZXMpIHsKICAgICBmYmJfLkFkZE9mZnNldChNb2RlbDo6VlRfT1BFUkFUT1JfQ09ERVMsIG9wZXJhdG9yX2NvZGVzKTsKICAgfQotICB2b2lkIGFkZF9zdWJncmFwaHMoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpTdWJHcmFwaD4+PiBzdWJncmFwaHMpIHsKKyAgdm9pZCBhZGRfc3ViZ3JhcGhzKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8OjpmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6U3ViR3JhcGg+Pj4gc3ViZ3JhcGhzKSB7CiAgICAgZmJiXy5BZGRPZmZzZXQoTW9kZWw6OlZUX1NVQkdSQVBIUywgc3ViZ3JhcGhzKTsKICAgfQotICB2b2lkIGFkZF9kZXNjcmlwdGlvbihmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpTdHJpbmc+IGRlc2NyaXB0aW9uKSB7CisgIHZvaWQgYWRkX2Rlc2NyaXB0aW9uKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpTdHJpbmc+IGRlc2NyaXB0aW9uKSB7CiAgICAgZmJiXy5BZGRPZmZzZXQoTW9kZWw6OlZUX0RFU0NSSVBUSU9OLCBkZXNjcmlwdGlvbik7CiAgIH0KLSAgdm9pZCBhZGRfYnVmZmVycyhmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OkJ1ZmZlcj4+PiBidWZmZXJzKSB7CisgIHZvaWQgYWRkX2J1ZmZlcnMoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpCdWZmZXI+Pj4gYnVmZmVycykgewogICAgIGZiYl8uQWRkT2Zmc2V0KE1vZGVsOjpWVF9CVUZGRVJTLCBidWZmZXJzKTsKICAgfQotICB2b2lkIGFkZF9tZXRhZGF0YV9idWZmZXIoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+PiBtZXRhZGF0YV9idWZmZXIpIHsKKyAgdm9pZCBhZGRfbWV0YWRhdGFfYnVmZmVyKDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4+IG1ldGFkYXRhX2J1ZmZlcikgewogICAgIGZiYl8uQWRkT2Zmc2V0KE1vZGVsOjpWVF9NRVRBREFUQV9CVUZGRVIsIG1ldGFkYXRhX2J1ZmZlcik7CiAgIH0KLSAgdm9pZCBhZGRfbWV0YWRhdGEoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpNZXRhZGF0YT4+PiBtZXRhZGF0YSkgeworICB2b2lkIGFkZF9tZXRhZGF0YSg6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6Ok1ldGFkYXRhPj4+IG1ldGFkYXRhKSB7CiAgICAgZmJiXy5BZGRPZmZzZXQoTW9kZWw6OlZUX01FVEFEQVRBLCBtZXRhZGF0YSk7CiAgIH0KLSAgdm9pZCBhZGRfc2lnbmF0dXJlX2RlZnMoZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpTaWduYXR1cmVEZWY+Pj4gc2lnbmF0dXJlX2RlZnMpIHsKKyAgdm9pZCBhZGRfc2lnbmF0dXJlX2RlZnMoOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpTaWduYXR1cmVEZWY+Pj4gc2lnbmF0dXJlX2RlZnMpIHsKICAgICBmYmJfLkFkZE9mZnNldChNb2RlbDo6VlRfU0lHTkFUVVJFX0RFRlMsIHNpZ25hdHVyZV9kZWZzKTsKICAgfQotICBleHBsaWNpdCBNb2RlbEJ1aWxkZXIoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiKQorICBleHBsaWNpdCBNb2RlbEJ1aWxkZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIpCiAgICAgICAgIDogZmJiXyhfZmJiKSB7CiAgICAgc3RhcnRfID0gZmJiXy5TdGFydFRhYmxlKCk7CiAgIH0KLSAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNb2RlbD4gRmluaXNoKCkgeworICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TW9kZWw+IEZpbmlzaCgpIHsKICAgICBjb25zdCBhdXRvIGVuZCA9IGZiYl8uRW5kVGFibGUoc3RhcnRfKTsKLSAgICBhdXRvIG8gPSBmbGF0YnVmZmVyczo6T2Zmc2V0PE1vZGVsPihlbmQpOworICAgIGF1dG8gbyA9IDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNb2RlbD4oZW5kKTsKICAgICByZXR1cm4gbzsKICAgfQogfTsKIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TW9kZWw+IENyZWF0ZU1vZGVsKAotICAgIGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TW9kZWw+IENyZWF0ZU1vZGVsKAorICAgIDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLAogICAgIHVpbnQzMl90IHZlcnNpb24gPSAwLAotICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6T3BlcmF0b3JDb2RlPj4+IG9wZXJhdG9yX2NvZGVzID0gMCwKLSAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PGZsYXRidWZmZXJzOjpWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlN1YkdyYXBoPj4+IHN1YmdyYXBocyA9IDAsCi0gICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6U3RyaW5nPiBkZXNjcmlwdGlvbiA9IDAsCi0gICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpCdWZmZXI+Pj4gYnVmZmVycyA9IDAsCi0gICAgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxmbGF0YnVmZmVyczo6VmVjdG9yPGludDMyX3Q+PiBtZXRhZGF0YV9idWZmZXIgPSAwLAotICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6TWV0YWRhdGE+Pj4gbWV0YWRhdGEgPSAwLAotICAgIGZsYXRidWZmZXJzOjpPZmZzZXQ8ZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6U2lnbmF0dXJlRGVmPj4+IHNpZ25hdHVyZV9kZWZzID0gMCkgeworICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8OjpmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6T3BlcmF0b3JDb2RlPj4+IG9wZXJhdG9yX2NvZGVzID0gMCwKKyAgICA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8OjpmbGF0YnVmZmVyczo6VmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlN1YkdyYXBoPj4+IHN1YmdyYXBocyA9IDAsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlN0cmluZz4gZGVzY3JpcHRpb24gPSAwLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8OjpmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6QnVmZmVyPj4+IGJ1ZmZlcnMgPSAwLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDw6OmZsYXRidWZmZXJzOjpWZWN0b3I8aW50MzJfdD4+IG1ldGFkYXRhX2J1ZmZlciA9IDAsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpNZXRhZGF0YT4+PiBtZXRhZGF0YSA9IDAsCisgICAgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpTaWduYXR1cmVEZWY+Pj4gc2lnbmF0dXJlX2RlZnMgPSAwKSB7CiAgIE1vZGVsQnVpbGRlciBidWlsZGVyXyhfZmJiKTsKICAgYnVpbGRlcl8uYWRkX3NpZ25hdHVyZV9kZWZzKHNpZ25hdHVyZV9kZWZzKTsKICAgYnVpbGRlcl8uYWRkX21ldGFkYXRhKG1ldGFkYXRhKTsKQEAgLTEzNTY3LDIzICsxNjYxOCwyMyBAQAogICByZXR1cm4gYnVpbGRlcl8uRmluaXNoKCk7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PE1vZGVsPiBDcmVhdGVNb2RlbERpcmVjdCgKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE1vZGVsPiBDcmVhdGVNb2RlbERpcmVjdCgKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwKICAgICB1aW50MzJfdCB2ZXJzaW9uID0gMCwKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6T3BlcmF0b3JDb2RlPj4gKm9wZXJhdG9yX2NvZGVzID0gbnVsbHB0ciwKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6U3ViR3JhcGg+PiAqc3ViZ3JhcGhzID0gbnVsbHB0ciwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpPcGVyYXRvckNvZGU+PiAqb3BlcmF0b3JfY29kZXMgPSBudWxscHRyLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlN1YkdyYXBoPj4gKnN1YmdyYXBocyA9IG51bGxwdHIsCiAgICAgY29uc3QgY2hhciAqZGVzY3JpcHRpb24gPSBudWxscHRyLAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpCdWZmZXI+PiAqYnVmZmVycyA9IG51bGxwdHIsCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8OjpmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6QnVmZmVyPj4gKmJ1ZmZlcnMgPSBudWxscHRyLAogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGludDMyX3Q+ICptZXRhZGF0YV9idWZmZXIgPSBudWxscHRyLAotICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpNZXRhZGF0YT4+ICptZXRhZGF0YSA9IG51bGxwdHIsCi0gICAgY29uc3Qgc3RkOjp2ZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlNpZ25hdHVyZURlZj4+ICpzaWduYXR1cmVfZGVmcyA9IG51bGxwdHIpIHsKLSAgYXV0byBvcGVyYXRvcl9jb2Rlc19fID0gb3BlcmF0b3JfY29kZXMgPyBfZmJiLkNyZWF0ZVZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6T3BlcmF0b3JDb2RlPj4oKm9wZXJhdG9yX2NvZGVzKSA6IDA7Ci0gIGF1dG8gc3ViZ3JhcGhzX18gPSBzdWJncmFwaHMgPyBfZmJiLkNyZWF0ZVZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6U3ViR3JhcGg+Pigqc3ViZ3JhcGhzKSA6IDA7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8OjpmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6TWV0YWRhdGE+PiAqbWV0YWRhdGEgPSBudWxscHRyLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlNpZ25hdHVyZURlZj4+ICpzaWduYXR1cmVfZGVmcyA9IG51bGxwdHIpIHsKKyAgYXV0byBvcGVyYXRvcl9jb2Rlc19fID0gb3BlcmF0b3JfY29kZXMgPyBfZmJiLkNyZWF0ZVZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpPcGVyYXRvckNvZGU+Pigqb3BlcmF0b3JfY29kZXMpIDogMDsKKyAgYXV0byBzdWJncmFwaHNfXyA9IHN1YmdyYXBocyA/IF9mYmIuQ3JlYXRlVmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlN1YkdyYXBoPj4oKnN1YmdyYXBocykgOiAwOwogICBhdXRvIGRlc2NyaXB0aW9uX18gPSBkZXNjcmlwdGlvbiA/IF9mYmIuQ3JlYXRlU3RyaW5nKGRlc2NyaXB0aW9uKSA6IDA7Ci0gIGF1dG8gYnVmZmVyc19fID0gYnVmZmVycyA/IF9mYmIuQ3JlYXRlVmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpCdWZmZXI+PigqYnVmZmVycykgOiAwOworICBhdXRvIGJ1ZmZlcnNfXyA9IGJ1ZmZlcnMgPyBfZmJiLkNyZWF0ZVZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpCdWZmZXI+PigqYnVmZmVycykgOiAwOwogICBhdXRvIG1ldGFkYXRhX2J1ZmZlcl9fID0gbWV0YWRhdGFfYnVmZmVyID8gX2ZiYi5DcmVhdGVWZWN0b3I8aW50MzJfdD4oKm1ldGFkYXRhX2J1ZmZlcikgOiAwOwotICBhdXRvIG1ldGFkYXRhX18gPSBtZXRhZGF0YSA/IF9mYmIuQ3JlYXRlVmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpNZXRhZGF0YT4+KCptZXRhZGF0YSkgOiAwOwotICBhdXRvIHNpZ25hdHVyZV9kZWZzX18gPSBzaWduYXR1cmVfZGVmcyA/IF9mYmIuQ3JlYXRlVmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpTaWduYXR1cmVEZWY+Pigqc2lnbmF0dXJlX2RlZnMpIDogMDsKKyAgYXV0byBtZXRhZGF0YV9fID0gbWV0YWRhdGEgPyBfZmJiLkNyZWF0ZVZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpNZXRhZGF0YT4+KCptZXRhZGF0YSkgOiAwOworICBhdXRvIHNpZ25hdHVyZV9kZWZzX18gPSBzaWduYXR1cmVfZGVmcyA/IF9mYmIuQ3JlYXRlVmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlNpZ25hdHVyZURlZj4+KCpzaWduYXR1cmVfZGVmcykgOiAwOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVNb2RlbCgKICAgICAgIF9mYmIsCiAgICAgICB2ZXJzaW9uLApAQCAtMTM1OTYsMjggKzE2NjQ3LDI4IEBACiAgICAgICBzaWduYXR1cmVfZGVmc19fKTsKIH0KIAotZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNb2RlbD4gQ3JlYXRlTW9kZWwoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBNb2RlbFQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyID0gbnVsbHB0cik7Cis6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TW9kZWw+IENyZWF0ZU1vZGVsKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBNb2RlbFQgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIgPSBudWxscHRyKTsKIAotaW5saW5lIEN1c3RvbVF1YW50aXphdGlvblQgKkN1c3RvbVF1YW50aXphdGlvbjo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBDdXN0b21RdWFudGl6YXRpb25UICpDdXN0b21RdWFudGl6YXRpb246OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxDdXN0b21RdWFudGl6YXRpb25UPihuZXcgQ3VzdG9tUXVhbnRpemF0aW9uVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIEN1c3RvbVF1YW50aXphdGlvbjo6VW5QYWNrVG8oQ3VzdG9tUXVhbnRpemF0aW9uVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIEN1c3RvbVF1YW50aXphdGlvbjo6VW5QYWNrVG8oQ3VzdG9tUXVhbnRpemF0aW9uVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogICB7IGF1dG8gX2UgPSBjdXN0b20oKTsgaWYgKF9lKSB7IF9vLT5jdXN0b20ucmVzaXplKF9lLT5zaXplKCkpOyBzdGQ6OmNvcHkoX2UtPmJlZ2luKCksIF9lLT5lbmQoKSwgX28tPmN1c3RvbS5iZWdpbigpKTsgfSB9CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEN1c3RvbVF1YW50aXphdGlvbj4gQ3VzdG9tUXVhbnRpemF0aW9uOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQ3VzdG9tUXVhbnRpemF0aW9uVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Q3VzdG9tUXVhbnRpemF0aW9uPiBDdXN0b21RdWFudGl6YXRpb246OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEN1c3RvbVF1YW50aXphdGlvblQqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZUN1c3RvbVF1YW50aXphdGlvbihfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8Q3VzdG9tUXVhbnRpemF0aW9uPiBDcmVhdGVDdXN0b21RdWFudGl6YXRpb24oZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBDdXN0b21RdWFudGl6YXRpb25UICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDdXN0b21RdWFudGl6YXRpb24+IENyZWF0ZUN1c3RvbVF1YW50aXphdGlvbig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQ3VzdG9tUXVhbnRpemF0aW9uVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBDdXN0b21RdWFudGl6YXRpb25UKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgQ3VzdG9tUXVhbnRpemF0aW9uVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIF9mYmIuRm9yY2VWZWN0b3JBbGlnbm1lbnQoX28tPmN1c3RvbS5zaXplKCksIHNpemVvZih1aW50OF90KSwgMTYpOwogICBhdXRvIF9jdXN0b20gPSBfby0+Y3VzdG9tLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT5jdXN0b20pIDogMDsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlQ3VzdG9tUXVhbnRpemF0aW9uKApAQCAtMTM2MjUsMzIgKzE2Njc2LDMyIEBACiAgICAgICBfY3VzdG9tKTsKIH0KIAotaW5saW5lIFF1YW50aXphdGlvblBhcmFtZXRlcnNUICpRdWFudGl6YXRpb25QYXJhbWV0ZXJzOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIFF1YW50aXphdGlvblBhcmFtZXRlcnNUICpRdWFudGl6YXRpb25QYXJhbWV0ZXJzOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8UXVhbnRpemF0aW9uUGFyYW1ldGVyc1Q+KG5ldyBRdWFudGl6YXRpb25QYXJhbWV0ZXJzVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIFF1YW50aXphdGlvblBhcmFtZXRlcnM6OlVuUGFja1RvKFF1YW50aXphdGlvblBhcmFtZXRlcnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgUXVhbnRpemF0aW9uUGFyYW1ldGVyczo6VW5QYWNrVG8oUXVhbnRpemF0aW9uUGFyYW1ldGVyc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKLSAgeyBhdXRvIF9lID0gbWluKCk7IGlmIChfZSkgeyBfby0+bWluLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5taW5bX2ldID0gX2UtPkdldChfaSk7IH0gfSB9Ci0gIHsgYXV0byBfZSA9IG1heCgpOyBpZiAoX2UpIHsgX28tPm1heC5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+bWF4W19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gfQotICB7IGF1dG8gX2UgPSBzY2FsZSgpOyBpZiAoX2UpIHsgX28tPnNjYWxlLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5zY2FsZVtfaV0gPSBfZS0+R2V0KF9pKTsgfSB9IH0KLSAgeyBhdXRvIF9lID0gemVyb19wb2ludCgpOyBpZiAoX2UpIHsgX28tPnplcm9fcG9pbnQucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnplcm9fcG9pbnRbX2ldID0gX2UtPkdldChfaSk7IH0gfSB9CisgIHsgYXV0byBfZSA9IG1pbigpOyBpZiAoX2UpIHsgX28tPm1pbi5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5taW5bX2ldID0gX2UtPkdldChfaSk7IH0gfSBlbHNlIHsgX28tPm1pbi5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBtYXgoKTsgaWYgKF9lKSB7IF9vLT5tYXgucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+bWF4W19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT5tYXgucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gc2NhbGUoKTsgaWYgKF9lKSB7IF9vLT5zY2FsZS5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5zY2FsZVtfaV0gPSBfZS0+R2V0KF9pKTsgfSB9IGVsc2UgeyBfby0+c2NhbGUucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gemVyb19wb2ludCgpOyBpZiAoX2UpIHsgX28tPnplcm9fcG9pbnQucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+emVyb19wb2ludFtfaV0gPSBfZS0+R2V0KF9pKTsgfSB9IGVsc2UgeyBfby0+emVyb19wb2ludC5yZXNpemUoMCk7IH0gfQogICB7IGF1dG8gX2UgPSBkZXRhaWxzX3R5cGUoKTsgX28tPmRldGFpbHMudHlwZSA9IF9lOyB9CiAgIHsgYXV0byBfZSA9IGRldGFpbHMoKTsgaWYgKF9lKSBfby0+ZGV0YWlscy52YWx1ZSA9IHRmbGl0ZTo6UXVhbnRpemF0aW9uRGV0YWlsc1VuaW9uOjpVblBhY2soX2UsIGRldGFpbHNfdHlwZSgpLCBfcmVzb2x2ZXIpOyB9CiAgIHsgYXV0byBfZSA9IHF1YW50aXplZF9kaW1lbnNpb24oKTsgX28tPnF1YW50aXplZF9kaW1lbnNpb24gPSBfZTsgfQogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxRdWFudGl6YXRpb25QYXJhbWV0ZXJzPiBRdWFudGl6YXRpb25QYXJhbWV0ZXJzOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUXVhbnRpemF0aW9uUGFyYW1ldGVyc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFF1YW50aXphdGlvblBhcmFtZXRlcnM+IFF1YW50aXphdGlvblBhcmFtZXRlcnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFF1YW50aXphdGlvblBhcmFtZXRlcnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVRdWFudGl6YXRpb25QYXJhbWV0ZXJzKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxRdWFudGl6YXRpb25QYXJhbWV0ZXJzPiBDcmVhdGVRdWFudGl6YXRpb25QYXJhbWV0ZXJzKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUXVhbnRpemF0aW9uUGFyYW1ldGVyc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFF1YW50aXphdGlvblBhcmFtZXRlcnM+IENyZWF0ZVF1YW50aXphdGlvblBhcmFtZXRlcnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFF1YW50aXphdGlvblBhcmFtZXRlcnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFF1YW50aXphdGlvblBhcmFtZXRlcnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgUXVhbnRpemF0aW9uUGFyYW1ldGVyc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICBhdXRvIF9taW4gPSBfby0+bWluLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT5taW4pIDogMDsKICAgYXV0byBfbWF4ID0gX28tPm1heC5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcihfby0+bWF4KSA6IDA7CiAgIGF1dG8gX3NjYWxlID0gX28tPnNjYWxlLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT5zY2FsZSkgOiAwOwpAQCAtMTM2NjksNTIgKzE2NzIwLDUyIEBACiAgICAgICBfcXVhbnRpemVkX2RpbWVuc2lvbik7CiB9CiAKLWlubGluZSBJbnQzMlZlY3RvclQgKkludDMyVmVjdG9yOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIEludDMyVmVjdG9yVCAqSW50MzJWZWN0b3I6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxJbnQzMlZlY3RvclQ+KG5ldyBJbnQzMlZlY3RvclQoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBJbnQzMlZlY3Rvcjo6VW5QYWNrVG8oSW50MzJWZWN0b3JUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgSW50MzJWZWN0b3I6OlVuUGFja1RvKEludDMyVmVjdG9yVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwotICB7IGF1dG8gX2UgPSB2YWx1ZXMoKTsgaWYgKF9lKSB7IF9vLT52YWx1ZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnZhbHVlc1tfaV0gPSBfZS0+R2V0KF9pKTsgfSB9IH0KKyAgeyBhdXRvIF9lID0gdmFsdWVzKCk7IGlmIChfZSkgeyBfby0+dmFsdWVzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yICg6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnZhbHVlc1tfaV0gPSBfZS0+R2V0KF9pKTsgfSB9IGVsc2UgeyBfby0+dmFsdWVzLnJlc2l6ZSgwKTsgfSB9CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEludDMyVmVjdG9yPiBJbnQzMlZlY3Rvcjo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEludDMyVmVjdG9yVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8SW50MzJWZWN0b3I+IEludDMyVmVjdG9yOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBJbnQzMlZlY3RvclQqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZUludDMyVmVjdG9yKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxJbnQzMlZlY3Rvcj4gQ3JlYXRlSW50MzJWZWN0b3IoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBJbnQzMlZlY3RvclQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEludDMyVmVjdG9yPiBDcmVhdGVJbnQzMlZlY3Rvcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSW50MzJWZWN0b3JUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IEludDMyVmVjdG9yVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IEludDMyVmVjdG9yVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIGF1dG8gX3ZhbHVlcyA9IF9vLT52YWx1ZXMuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3IoX28tPnZhbHVlcykgOiAwOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVJbnQzMlZlY3RvcigKICAgICAgIF9mYmIsCiAgICAgICBfdmFsdWVzKTsKIH0KIAotaW5saW5lIFVpbnQxNlZlY3RvclQgKlVpbnQxNlZlY3Rvcjo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBVaW50MTZWZWN0b3JUICpVaW50MTZWZWN0b3I6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxVaW50MTZWZWN0b3JUPihuZXcgVWludDE2VmVjdG9yVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIFVpbnQxNlZlY3Rvcjo6VW5QYWNrVG8oVWludDE2VmVjdG9yVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIFVpbnQxNlZlY3Rvcjo6VW5QYWNrVG8oVWludDE2VmVjdG9yVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwotICB7IGF1dG8gX2UgPSB2YWx1ZXMoKTsgaWYgKF9lKSB7IF9vLT52YWx1ZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnZhbHVlc1tfaV0gPSBfZS0+R2V0KF9pKTsgfSB9IH0KKyAgeyBhdXRvIF9lID0gdmFsdWVzKCk7IGlmIChfZSkgeyBfby0+dmFsdWVzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yICg6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnZhbHVlc1tfaV0gPSBfZS0+R2V0KF9pKTsgfSB9IGVsc2UgeyBfby0+dmFsdWVzLnJlc2l6ZSgwKTsgfSB9CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFVpbnQxNlZlY3Rvcj4gVWludDE2VmVjdG9yOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVWludDE2VmVjdG9yVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VWludDE2VmVjdG9yPiBVaW50MTZWZWN0b3I6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFVpbnQxNlZlY3RvclQqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZVVpbnQxNlZlY3RvcihfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8VWludDE2VmVjdG9yPiBDcmVhdGVVaW50MTZWZWN0b3IoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBVaW50MTZWZWN0b3JUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVaW50MTZWZWN0b3I+IENyZWF0ZVVpbnQxNlZlY3Rvcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVWludDE2VmVjdG9yVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBVaW50MTZWZWN0b3JUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgVWludDE2VmVjdG9yVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIF9mYmIuRm9yY2VWZWN0b3JBbGlnbm1lbnQoX28tPnZhbHVlcy5zaXplKCksIHNpemVvZih1aW50MTZfdCksIDQpOwogICBhdXRvIF92YWx1ZXMgPSBfby0+dmFsdWVzLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT52YWx1ZXMpIDogMDsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlVWludDE2VmVjdG9yKApAQCAtMTM3MjIsMjYgKzE2NzczLDI2IEBACiAgICAgICBfdmFsdWVzKTsKIH0KIAotaW5saW5lIFVpbnQ4VmVjdG9yVCAqVWludDhWZWN0b3I6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgVWludDhWZWN0b3JUICpVaW50OFZlY3Rvcjo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFVpbnQ4VmVjdG9yVD4obmV3IFVpbnQ4VmVjdG9yVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIFVpbnQ4VmVjdG9yOjpVblBhY2tUbyhVaW50OFZlY3RvclQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBVaW50OFZlY3Rvcjo6VW5QYWNrVG8oVWludDhWZWN0b3JUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiAgIHsgYXV0byBfZSA9IHZhbHVlcygpOyBpZiAoX2UpIHsgX28tPnZhbHVlcy5yZXNpemUoX2UtPnNpemUoKSk7IHN0ZDo6Y29weShfZS0+YmVnaW4oKSwgX2UtPmVuZCgpLCBfby0+dmFsdWVzLmJlZ2luKCkpOyB9IH0KIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8VWludDhWZWN0b3I+IFVpbnQ4VmVjdG9yOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVWludDhWZWN0b3JUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVaW50OFZlY3Rvcj4gVWludDhWZWN0b3I6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFVpbnQ4VmVjdG9yVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlVWludDhWZWN0b3IoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFVpbnQ4VmVjdG9yPiBDcmVhdGVVaW50OFZlY3RvcihmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFVpbnQ4VmVjdG9yVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VWludDhWZWN0b3I+IENyZWF0ZVVpbnQ4VmVjdG9yKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBVaW50OFZlY3RvclQgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgVWludDhWZWN0b3JUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgVWludDhWZWN0b3JUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgX2ZiYi5Gb3JjZVZlY3RvckFsaWdubWVudChfby0+dmFsdWVzLnNpemUoKSwgc2l6ZW9mKHVpbnQ4X3QpLCA0KTsKICAgYXV0byBfdmFsdWVzID0gX28tPnZhbHVlcy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcihfby0+dmFsdWVzKSA6IDA7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZVVpbnQ4VmVjdG9yKApAQCAtMTM3NDksMTMgKzE2ODAwLDEzIEBACiAgICAgICBfdmFsdWVzKTsKIH0KIAotaW5saW5lIERpbWVuc2lvbk1ldGFkYXRhVCAqRGltZW5zaW9uTWV0YWRhdGE6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgRGltZW5zaW9uTWV0YWRhdGFUICpEaW1lbnNpb25NZXRhZGF0YTo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPERpbWVuc2lvbk1ldGFkYXRhVD4obmV3IERpbWVuc2lvbk1ldGFkYXRhVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIERpbWVuc2lvbk1ldGFkYXRhOjpVblBhY2tUbyhEaW1lbnNpb25NZXRhZGF0YVQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBEaW1lbnNpb25NZXRhZGF0YTo6VW5QYWNrVG8oRGltZW5zaW9uTWV0YWRhdGFUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiAgIHsgYXV0byBfZSA9IGZvcm1hdCgpOyBfby0+Zm9ybWF0ID0gX2U7IH0KQEAgLTEzNzY2LDE0ICsxNjgxNywxNCBAQAogICB7IGF1dG8gX2UgPSBhcnJheV9pbmRpY2VzKCk7IGlmIChfZSkgX28tPmFycmF5X2luZGljZXMudmFsdWUgPSB0ZmxpdGU6OlNwYXJzZUluZGV4VmVjdG9yVW5pb246OlVuUGFjayhfZSwgYXJyYXlfaW5kaWNlc190eXBlKCksIF9yZXNvbHZlcik7IH0KIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8RGltZW5zaW9uTWV0YWRhdGE+IERpbWVuc2lvbk1ldGFkYXRhOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRGltZW5zaW9uTWV0YWRhdGFUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxEaW1lbnNpb25NZXRhZGF0YT4gRGltZW5zaW9uTWV0YWRhdGE6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IERpbWVuc2lvbk1ldGFkYXRhVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlRGltZW5zaW9uTWV0YWRhdGEoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PERpbWVuc2lvbk1ldGFkYXRhPiBDcmVhdGVEaW1lbnNpb25NZXRhZGF0YShmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IERpbWVuc2lvbk1ldGFkYXRhVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8RGltZW5zaW9uTWV0YWRhdGE+IENyZWF0ZURpbWVuc2lvbk1ldGFkYXRhKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBEaW1lbnNpb25NZXRhZGF0YVQgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgRGltZW5zaW9uTWV0YWRhdGFUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgRGltZW5zaW9uTWV0YWRhdGFUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgYXV0byBfZm9ybWF0ID0gX28tPmZvcm1hdDsKICAgYXV0byBfZGVuc2Vfc2l6ZSA9IF9vLT5kZW5zZV9zaXplOwogICBhdXRvIF9hcnJheV9zZWdtZW50c190eXBlID0gX28tPmFycmF5X3NlZ21lbnRzLnR5cGU7CkBAIC0xMzgwNCwzMSArMTY4NTUsMzEgQEAKICAgcmV0dXJuICp0aGlzOwogfQogCi1pbmxpbmUgU3BhcnNpdHlQYXJhbWV0ZXJzVCAqU3BhcnNpdHlQYXJhbWV0ZXJzOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIFNwYXJzaXR5UGFyYW1ldGVyc1QgKlNwYXJzaXR5UGFyYW1ldGVyczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFNwYXJzaXR5UGFyYW1ldGVyc1Q+KG5ldyBTcGFyc2l0eVBhcmFtZXRlcnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgU3BhcnNpdHlQYXJhbWV0ZXJzOjpVblBhY2tUbyhTcGFyc2l0eVBhcmFtZXRlcnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgU3BhcnNpdHlQYXJhbWV0ZXJzOjpVblBhY2tUbyhTcGFyc2l0eVBhcmFtZXRlcnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7Ci0gIHsgYXV0byBfZSA9IHRyYXZlcnNhbF9vcmRlcigpOyBpZiAoX2UpIHsgX28tPnRyYXZlcnNhbF9vcmRlci5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+dHJhdmVyc2FsX29yZGVyW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gfQotICB7IGF1dG8gX2UgPSBibG9ja19tYXAoKTsgaWYgKF9lKSB7IF9vLT5ibG9ja19tYXAucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPmJsb2NrX21hcFtfaV0gPSBfZS0+R2V0KF9pKTsgfSB9IH0KLSAgeyBhdXRvIF9lID0gZGltX21ldGFkYXRhKCk7IGlmIChfZSkgeyBfby0+ZGltX21ldGFkYXRhLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IGlmKF9vLT5kaW1fbWV0YWRhdGFbX2ldKSB7IF9lLT5HZXQoX2kpLT5VblBhY2tUbyhfby0+ZGltX21ldGFkYXRhW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPmRpbV9tZXRhZGF0YVtfaV0gPSBzdGQ6OnVuaXF1ZV9wdHI8dGZsaXRlOjpEaW1lbnNpb25NZXRhZGF0YVQ+KF9lLT5HZXQoX2kpLT5VblBhY2soX3Jlc29sdmVyKSk7IH07IH0gfSB9CisgIHsgYXV0byBfZSA9IHRyYXZlcnNhbF9vcmRlcigpOyBpZiAoX2UpIHsgX28tPnRyYXZlcnNhbF9vcmRlci5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT50cmF2ZXJzYWxfb3JkZXJbX2ldID0gX2UtPkdldChfaSk7IH0gfSBlbHNlIHsgX28tPnRyYXZlcnNhbF9vcmRlci5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBibG9ja19tYXAoKTsgaWYgKF9lKSB7IF9vLT5ibG9ja19tYXAucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+YmxvY2tfbWFwW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT5ibG9ja19tYXAucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gZGltX21ldGFkYXRhKCk7IGlmIChfZSkgeyBfby0+ZGltX21ldGFkYXRhLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yICg6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgaWYoX28tPmRpbV9tZXRhZGF0YVtfaV0pIHsgX2UtPkdldChfaSktPlVuUGFja1RvKF9vLT5kaW1fbWV0YWRhdGFbX2ldLmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+ZGltX21ldGFkYXRhW19pXSA9IHN0ZDo6dW5pcXVlX3B0cjx0ZmxpdGU6OkRpbWVuc2lvbk1ldGFkYXRhVD4oX2UtPkdldChfaSktPlVuUGFjayhfcmVzb2x2ZXIpKTsgfTsgfSB9IGVsc2UgeyBfby0+ZGltX21ldGFkYXRhLnJlc2l6ZSgwKTsgfSB9CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNwYXJzaXR5UGFyYW1ldGVycz4gU3BhcnNpdHlQYXJhbWV0ZXJzOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3BhcnNpdHlQYXJhbWV0ZXJzVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3BhcnNpdHlQYXJhbWV0ZXJzPiBTcGFyc2l0eVBhcmFtZXRlcnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNwYXJzaXR5UGFyYW1ldGVyc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZVNwYXJzaXR5UGFyYW1ldGVycyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3BhcnNpdHlQYXJhbWV0ZXJzPiBDcmVhdGVTcGFyc2l0eVBhcmFtZXRlcnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTcGFyc2l0eVBhcmFtZXRlcnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcGFyc2l0eVBhcmFtZXRlcnM+IENyZWF0ZVNwYXJzaXR5UGFyYW1ldGVycyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3BhcnNpdHlQYXJhbWV0ZXJzVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBTcGFyc2l0eVBhcmFtZXRlcnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgU3BhcnNpdHlQYXJhbWV0ZXJzVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIGF1dG8gX3RyYXZlcnNhbF9vcmRlciA9IF9vLT50cmF2ZXJzYWxfb3JkZXIuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3IoX28tPnRyYXZlcnNhbF9vcmRlcikgOiAwOwogICBhdXRvIF9ibG9ja19tYXAgPSBfby0+YmxvY2tfbWFwLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT5ibG9ja19tYXApIDogMDsKLSAgYXV0byBfZGltX21ldGFkYXRhID0gX28tPmRpbV9tZXRhZGF0YS5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6RGltZW5zaW9uTWV0YWRhdGE+PiAoX28tPmRpbV9tZXRhZGF0YS5zaXplKCksIFtdKHNpemVfdCBpLCBfVmVjdG9yQXJncyAqX192YSkgeyByZXR1cm4gQ3JlYXRlRGltZW5zaW9uTWV0YWRhdGEoKl9fdmEtPl9fZmJiLCBfX3ZhLT5fX28tPmRpbV9tZXRhZGF0YVtpXS5nZXQoKSwgX192YS0+X19yZWhhc2hlcik7IH0sICZfdmEgKSA6IDA7CisgIGF1dG8gX2RpbV9tZXRhZGF0YSA9IF9vLT5kaW1fbWV0YWRhdGEuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3I8OjpmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6RGltZW5zaW9uTWV0YWRhdGE+PiAoX28tPmRpbV9tZXRhZGF0YS5zaXplKCksIFtdKHNpemVfdCBpLCBfVmVjdG9yQXJncyAqX192YSkgeyByZXR1cm4gQ3JlYXRlRGltZW5zaW9uTWV0YWRhdGEoKl9fdmEtPl9fZmJiLCBfX3ZhLT5fX28tPmRpbV9tZXRhZGF0YVtpXS5nZXQoKSwgX192YS0+X19yZWhhc2hlcik7IH0sICZfdmEgKSA6IDA7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZVNwYXJzaXR5UGFyYW1ldGVycygKICAgICAgIF9mYmIsCiAgICAgICBfdHJhdmVyc2FsX29yZGVyLApAQCAtMTM4MzYsMjggKzE2ODg3LDI4IEBACiAgICAgICBfZGltX21ldGFkYXRhKTsKIH0KIAotaW5saW5lIFZhcmlhbnRTdWJUeXBlVCAqVmFyaWFudFN1YlR5cGU6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgVmFyaWFudFN1YlR5cGVUICpWYXJpYW50U3ViVHlwZTo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFZhcmlhbnRTdWJUeXBlVD4obmV3IFZhcmlhbnRTdWJUeXBlVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIFZhcmlhbnRTdWJUeXBlOjpVblBhY2tUbyhWYXJpYW50U3ViVHlwZVQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBWYXJpYW50U3ViVHlwZTo6VW5QYWNrVG8oVmFyaWFudFN1YlR5cGVUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7Ci0gIHsgYXV0byBfZSA9IHNoYXBlKCk7IGlmIChfZSkgeyBfby0+c2hhcGUucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnNoYXBlW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gfQorICB7IGF1dG8gX2UgPSBzaGFwZSgpOyBpZiAoX2UpIHsgX28tPnNoYXBlLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yICg6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnNoYXBlW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT5zaGFwZS5yZXNpemUoMCk7IH0gfQogICB7IGF1dG8gX2UgPSB0eXBlKCk7IF9vLT50eXBlID0gX2U7IH0KICAgeyBhdXRvIF9lID0gaGFzX3JhbmsoKTsgX28tPmhhc19yYW5rID0gX2U7IH0KIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8VmFyaWFudFN1YlR5cGU+IFZhcmlhbnRTdWJUeXBlOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVmFyaWFudFN1YlR5cGVUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxWYXJpYW50U3ViVHlwZT4gVmFyaWFudFN1YlR5cGU6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFZhcmlhbnRTdWJUeXBlVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlVmFyaWFudFN1YlR5cGUoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFZhcmlhbnRTdWJUeXBlPiBDcmVhdGVWYXJpYW50U3ViVHlwZShmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFZhcmlhbnRTdWJUeXBlVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VmFyaWFudFN1YlR5cGU+IENyZWF0ZVZhcmlhbnRTdWJUeXBlKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBWYXJpYW50U3ViVHlwZVQgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgVmFyaWFudFN1YlR5cGVUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgVmFyaWFudFN1YlR5cGVUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgYXV0byBfc2hhcGUgPSBfby0+c2hhcGUuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3IoX28tPnNoYXBlKSA6IDA7CiAgIGF1dG8gX3R5cGUgPSBfby0+dHlwZTsKICAgYXV0byBfaGFzX3JhbmsgPSBfby0+aGFzX3Jhbms7CkBAIC0xMzg5NiwzNSArMTY5NDcsMzUgQEAKICAgcmV0dXJuICp0aGlzOwogfQogCi1pbmxpbmUgVGVuc29yVCAqVGVuc29yOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIFRlbnNvclQgKlRlbnNvcjo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFRlbnNvclQ+KG5ldyBUZW5zb3JUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgVGVuc29yOjpVblBhY2tUbyhUZW5zb3JUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgVGVuc29yOjpVblBhY2tUbyhUZW5zb3JUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7Ci0gIHsgYXV0byBfZSA9IHNoYXBlKCk7IGlmIChfZSkgeyBfby0+c2hhcGUucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnNoYXBlW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gfQorICB7IGF1dG8gX2UgPSBzaGFwZSgpOyBpZiAoX2UpIHsgX28tPnNoYXBlLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yICg6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnNoYXBlW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT5zaGFwZS5yZXNpemUoMCk7IH0gfQogICB7IGF1dG8gX2UgPSB0eXBlKCk7IF9vLT50eXBlID0gX2U7IH0KICAgeyBhdXRvIF9lID0gYnVmZmVyKCk7IF9vLT5idWZmZXIgPSBfZTsgfQogICB7IGF1dG8gX2UgPSBuYW1lKCk7IGlmIChfZSkgX28tPm5hbWUgPSBfZS0+c3RyKCk7IH0KLSAgeyBhdXRvIF9lID0gcXVhbnRpemF0aW9uKCk7IGlmIChfZSkgeyBpZihfby0+cXVhbnRpemF0aW9uKSB7IF9lLT5VblBhY2tUbyhfby0+cXVhbnRpemF0aW9uLmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+cXVhbnRpemF0aW9uID0gc3RkOjp1bmlxdWVfcHRyPHRmbGl0ZTo6UXVhbnRpemF0aW9uUGFyYW1ldGVyc1Q+KF9lLT5VblBhY2soX3Jlc29sdmVyKSk7IH0gfSB9CisgIHsgYXV0byBfZSA9IHF1YW50aXphdGlvbigpOyBpZiAoX2UpIHsgaWYoX28tPnF1YW50aXphdGlvbikgeyBfZS0+VW5QYWNrVG8oX28tPnF1YW50aXphdGlvbi5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPnF1YW50aXphdGlvbiA9IHN0ZDo6dW5pcXVlX3B0cjx0ZmxpdGU6OlF1YW50aXphdGlvblBhcmFtZXRlcnNUPihfZS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9IH0gZWxzZSBpZiAoX28tPnF1YW50aXphdGlvbikgeyBfby0+cXVhbnRpemF0aW9uLnJlc2V0KCk7IH0gfQogICB7IGF1dG8gX2UgPSBpc192YXJpYWJsZSgpOyBfby0+aXNfdmFyaWFibGUgPSBfZTsgfQotICB7IGF1dG8gX2UgPSBzcGFyc2l0eSgpOyBpZiAoX2UpIHsgaWYoX28tPnNwYXJzaXR5KSB7IF9lLT5VblBhY2tUbyhfby0+c3BhcnNpdHkuZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT5zcGFyc2l0eSA9IHN0ZDo6dW5pcXVlX3B0cjx0ZmxpdGU6OlNwYXJzaXR5UGFyYW1ldGVyc1Q+KF9lLT5VblBhY2soX3Jlc29sdmVyKSk7IH0gfSB9Ci0gIHsgYXV0byBfZSA9IHNoYXBlX3NpZ25hdHVyZSgpOyBpZiAoX2UpIHsgX28tPnNoYXBlX3NpZ25hdHVyZS5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+c2hhcGVfc2lnbmF0dXJlW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gfQorICB7IGF1dG8gX2UgPSBzcGFyc2l0eSgpOyBpZiAoX2UpIHsgaWYoX28tPnNwYXJzaXR5KSB7IF9lLT5VblBhY2tUbyhfby0+c3BhcnNpdHkuZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT5zcGFyc2l0eSA9IHN0ZDo6dW5pcXVlX3B0cjx0ZmxpdGU6OlNwYXJzaXR5UGFyYW1ldGVyc1Q+KF9lLT5VblBhY2soX3Jlc29sdmVyKSk7IH0gfSBlbHNlIGlmIChfby0+c3BhcnNpdHkpIHsgX28tPnNwYXJzaXR5LnJlc2V0KCk7IH0gfQorICB7IGF1dG8gX2UgPSBzaGFwZV9zaWduYXR1cmUoKTsgaWYgKF9lKSB7IF9vLT5zaGFwZV9zaWduYXR1cmUucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+c2hhcGVfc2lnbmF0dXJlW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT5zaGFwZV9zaWduYXR1cmUucmVzaXplKDApOyB9IH0KICAgeyBhdXRvIF9lID0gaGFzX3JhbmsoKTsgX28tPmhhc19yYW5rID0gX2U7IH0KLSAgeyBhdXRvIF9lID0gdmFyaWFudF90ZW5zb3JzKCk7IGlmIChfZSkgeyBfby0+dmFyaWFudF90ZW5zb3JzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IGlmKF9vLT52YXJpYW50X3RlbnNvcnNbX2ldKSB7IF9lLT5HZXQoX2kpLT5VblBhY2tUbyhfby0+dmFyaWFudF90ZW5zb3JzW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPnZhcmlhbnRfdGVuc29yc1tfaV0gPSBzdGQ6OnVuaXF1ZV9wdHI8dGZsaXRlOjpWYXJpYW50U3ViVHlwZVQ+KF9lLT5HZXQoX2kpLT5VblBhY2soX3Jlc29sdmVyKSk7IH07IH0gfSB9CisgIHsgYXV0byBfZSA9IHZhcmlhbnRfdGVuc29ycygpOyBpZiAoX2UpIHsgX28tPnZhcmlhbnRfdGVuc29ycy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IGlmKF9vLT52YXJpYW50X3RlbnNvcnNbX2ldKSB7IF9lLT5HZXQoX2kpLT5VblBhY2tUbyhfby0+dmFyaWFudF90ZW5zb3JzW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPnZhcmlhbnRfdGVuc29yc1tfaV0gPSBzdGQ6OnVuaXF1ZV9wdHI8dGZsaXRlOjpWYXJpYW50U3ViVHlwZVQ+KF9lLT5HZXQoX2kpLT5VblBhY2soX3Jlc29sdmVyKSk7IH07IH0gfSBlbHNlIHsgX28tPnZhcmlhbnRfdGVuc29ycy5yZXNpemUoMCk7IH0gfQogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZW5zb3I+IFRlbnNvcjo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFRlbnNvclQqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFRlbnNvcj4gVGVuc29yOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBUZW5zb3JUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVUZW5zb3IoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFRlbnNvcj4gQ3JlYXRlVGVuc29yKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVGVuc29yVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VGVuc29yPiBDcmVhdGVUZW5zb3IoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFRlbnNvclQgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgVGVuc29yVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFRlbnNvclQqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICBhdXRvIF9zaGFwZSA9IF9vLT5zaGFwZS5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcihfby0+c2hhcGUpIDogMDsKICAgYXV0byBfdHlwZSA9IF9vLT50eXBlOwogICBhdXRvIF9idWZmZXIgPSBfby0+YnVmZmVyOwpAQCAtMTM5MzQsNyArMTY5ODUsNyBAQAogICBhdXRvIF9zcGFyc2l0eSA9IF9vLT5zcGFyc2l0eSA/IENyZWF0ZVNwYXJzaXR5UGFyYW1ldGVycyhfZmJiLCBfby0+c3BhcnNpdHkuZ2V0KCksIF9yZWhhc2hlcikgOiAwOwogICBhdXRvIF9zaGFwZV9zaWduYXR1cmUgPSBfby0+c2hhcGVfc2lnbmF0dXJlLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT5zaGFwZV9zaWduYXR1cmUpIDogMDsKICAgYXV0byBfaGFzX3JhbmsgPSBfby0+aGFzX3Jhbms7Ci0gIGF1dG8gX3ZhcmlhbnRfdGVuc29ycyA9IF9vLT52YXJpYW50X3RlbnNvcnMuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlZhcmlhbnRTdWJUeXBlPj4gKF9vLT52YXJpYW50X3RlbnNvcnMuc2l6ZSgpLCBbXShzaXplX3QgaSwgX1ZlY3RvckFyZ3MgKl9fdmEpIHsgcmV0dXJuIENyZWF0ZVZhcmlhbnRTdWJUeXBlKCpfX3ZhLT5fX2ZiYiwgX192YS0+X19vLT52YXJpYW50X3RlbnNvcnNbaV0uZ2V0KCksIF9fdmEtPl9fcmVoYXNoZXIpOyB9LCAmX3ZhICkgOiAwOworICBhdXRvIF92YXJpYW50X3RlbnNvcnMgPSBfby0+dmFyaWFudF90ZW5zb3JzLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlZhcmlhbnRTdWJUeXBlPj4gKF9vLT52YXJpYW50X3RlbnNvcnMuc2l6ZSgpLCBbXShzaXplX3QgaSwgX1ZlY3RvckFyZ3MgKl9fdmEpIHsgcmV0dXJuIENyZWF0ZVZhcmlhbnRTdWJUeXBlKCpfX3ZhLT5fX2ZiYiwgX192YS0+X19vLT52YXJpYW50X3RlbnNvcnNbaV0uZ2V0KCksIF9fdmEtPl9fcmVoYXNoZXIpOyB9LCAmX3ZhICkgOiAwOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVUZW5zb3IoCiAgICAgICBfZmJiLAogICAgICAgX3NoYXBlLApAQCAtMTM5NDksMTMgKzE3MDAwLDYzMSBAQAogICAgICAgX3ZhcmlhbnRfdGVuc29ycyk7CiB9CiAKLWlubGluZSBDb252MkRPcHRpb25zVCAqQ29udjJET3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBTdGFibGVobG9HYXRoZXJPcHRpb25zVCAqU3RhYmxlaGxvR2F0aGVyT3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFN0YWJsZWhsb0dhdGhlck9wdGlvbnNUPihuZXcgU3RhYmxlaGxvR2F0aGVyT3B0aW9uc1QoKSk7CisgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOworICByZXR1cm4gX28ucmVsZWFzZSgpOworfQorCitpbmxpbmUgdm9pZCBTdGFibGVobG9HYXRoZXJPcHRpb25zOjpVblBhY2tUbyhTdGFibGVobG9HYXRoZXJPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICAodm9pZClfbzsKKyAgKHZvaWQpX3Jlc29sdmVyOworICB7IGF1dG8gX2UgPSBvZmZzZXRfZGltcygpOyBpZiAoX2UpIHsgX28tPm9mZnNldF9kaW1zLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yICg6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPm9mZnNldF9kaW1zW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT5vZmZzZXRfZGltcy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBjb2xsYXBzZWRfc2xpY2VfZGltcygpOyBpZiAoX2UpIHsgX28tPmNvbGxhcHNlZF9zbGljZV9kaW1zLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yICg6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPmNvbGxhcHNlZF9zbGljZV9kaW1zW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT5jb2xsYXBzZWRfc2xpY2VfZGltcy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBzdGFydF9pbmRleF9tYXAoKTsgaWYgKF9lKSB7IF9vLT5zdGFydF9pbmRleF9tYXAucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+c3RhcnRfaW5kZXhfbWFwW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT5zdGFydF9pbmRleF9tYXAucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gaW5kZXhfdmVjdG9yX2RpbSgpOyBfby0+aW5kZXhfdmVjdG9yX2RpbSA9IF9lOyB9CisgIHsgYXV0byBfZSA9IHNsaWNlX3NpemVzKCk7IGlmIChfZSkgeyBfby0+c2xpY2Vfc2l6ZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+c2xpY2Vfc2l6ZXNbX2ldID0gX2UtPkdldChfaSk7IH0gfSBlbHNlIHsgX28tPnNsaWNlX3NpemVzLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IGluZGljZXNfYXJlX3NvcnRlZCgpOyBfby0+aW5kaWNlc19hcmVfc29ydGVkID0gX2U7IH0KK30KKworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9HYXRoZXJPcHRpb25zPiBTdGFibGVobG9HYXRoZXJPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTdGFibGVobG9HYXRoZXJPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworICByZXR1cm4gQ3JlYXRlU3RhYmxlaGxvR2F0aGVyT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKK30KKworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9HYXRoZXJPcHRpb25zPiBDcmVhdGVTdGFibGVobG9HYXRoZXJPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTdGFibGVobG9HYXRoZXJPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworICAodm9pZClfcmVoYXNoZXI7CisgICh2b2lkKV9vOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFN0YWJsZWhsb0dhdGhlck9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgYXV0byBfb2Zmc2V0X2RpbXMgPSBfby0+b2Zmc2V0X2RpbXMuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3IoX28tPm9mZnNldF9kaW1zKSA6IDA7CisgIGF1dG8gX2NvbGxhcHNlZF9zbGljZV9kaW1zID0gX28tPmNvbGxhcHNlZF9zbGljZV9kaW1zLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT5jb2xsYXBzZWRfc2xpY2VfZGltcykgOiAwOworICBhdXRvIF9zdGFydF9pbmRleF9tYXAgPSBfby0+c3RhcnRfaW5kZXhfbWFwLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT5zdGFydF9pbmRleF9tYXApIDogMDsKKyAgYXV0byBfaW5kZXhfdmVjdG9yX2RpbSA9IF9vLT5pbmRleF92ZWN0b3JfZGltOworICBhdXRvIF9zbGljZV9zaXplcyA9IF9vLT5zbGljZV9zaXplcy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcihfby0+c2xpY2Vfc2l6ZXMpIDogMDsKKyAgYXV0byBfaW5kaWNlc19hcmVfc29ydGVkID0gX28tPmluZGljZXNfYXJlX3NvcnRlZDsKKyAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlU3RhYmxlaGxvR2F0aGVyT3B0aW9ucygKKyAgICAgIF9mYmIsCisgICAgICBfb2Zmc2V0X2RpbXMsCisgICAgICBfY29sbGFwc2VkX3NsaWNlX2RpbXMsCisgICAgICBfc3RhcnRfaW5kZXhfbWFwLAorICAgICAgX2luZGV4X3ZlY3Rvcl9kaW0sCisgICAgICBfc2xpY2Vfc2l6ZXMsCisgICAgICBfaW5kaWNlc19hcmVfc29ydGVkKTsKK30KKworaW5saW5lIFN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnNUICpTdGFibGVobG9UcmFuc3Bvc2VPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CisgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8U3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9uc1Q+KG5ldyBTdGFibGVobG9UcmFuc3Bvc2VPcHRpb25zVCgpKTsKKyAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CisgIHJldHVybiBfby5yZWxlYXNlKCk7Cit9CisKK2lubGluZSB2b2lkIFN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnM6OlVuUGFja1RvKFN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CisgICh2b2lkKV9vOworICAodm9pZClfcmVzb2x2ZXI7CisgIHsgYXV0byBfZSA9IHBlcm11dGF0aW9uKCk7IGlmIChfZSkgeyBfby0+cGVybXV0YXRpb24ucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+cGVybXV0YXRpb25bX2ldID0gX2UtPkdldChfaSk7IH0gfSBlbHNlIHsgX28tPnBlcm11dGF0aW9uLnJlc2l6ZSgwKTsgfSB9Cit9CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9ucz4gU3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgcmV0dXJuIENyZWF0ZVN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7Cit9CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9ucz4gQ3JlYXRlU3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgKHZvaWQpX3JlaGFzaGVyOworICAodm9pZClfbzsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBTdGFibGVobG9UcmFuc3Bvc2VPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIGF1dG8gX3Blcm11dGF0aW9uID0gX28tPnBlcm11dGF0aW9uLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT5wZXJtdXRhdGlvbikgOiAwOworICByZXR1cm4gdGZsaXRlOjpDcmVhdGVTdGFibGVobG9UcmFuc3Bvc2VPcHRpb25zKAorICAgICAgX2ZiYiwKKyAgICAgIF9wZXJtdXRhdGlvbik7Cit9CisKK2lubGluZSBTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9uc1QgKlN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CisgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8U3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnNUPihuZXcgU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnNUKCkpOworICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKKyAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKK30KKworaW5saW5lIHZvaWQgU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnM6OlVuUGFja1RvKFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICAodm9pZClfbzsKKyAgKHZvaWQpX3Jlc29sdmVyOworICB7IGF1dG8gX2UgPSBsaHNfYmF0Y2hpbmdfZGltZW5zaW9ucygpOyBpZiAoX2UpIHsgX28tPmxoc19iYXRjaGluZ19kaW1lbnNpb25zLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yICg6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPmxoc19iYXRjaGluZ19kaW1lbnNpb25zW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT5saHNfYmF0Y2hpbmdfZGltZW5zaW9ucy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSByaHNfYmF0Y2hpbmdfZGltZW5zaW9ucygpOyBpZiAoX2UpIHsgX28tPnJoc19iYXRjaGluZ19kaW1lbnNpb25zLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yICg6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnJoc19iYXRjaGluZ19kaW1lbnNpb25zW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT5yaHNfYmF0Y2hpbmdfZGltZW5zaW9ucy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBsaHNfY29udHJhY3RpbmdfZGltZW5zaW9ucygpOyBpZiAoX2UpIHsgX28tPmxoc19jb250cmFjdGluZ19kaW1lbnNpb25zLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yICg6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPmxoc19jb250cmFjdGluZ19kaW1lbnNpb25zW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT5saHNfY29udHJhY3RpbmdfZGltZW5zaW9ucy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSByaHNfY29udHJhY3RpbmdfZGltZW5zaW9ucygpOyBpZiAoX2UpIHsgX28tPnJoc19jb250cmFjdGluZ19kaW1lbnNpb25zLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yICg6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnJoc19jb250cmFjdGluZ19kaW1lbnNpb25zW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT5yaHNfY29udHJhY3RpbmdfZGltZW5zaW9ucy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBwcmVjaXNpb25fY29uZmlnKCk7IGlmIChfZSkgeyBfby0+cHJlY2lzaW9uX2NvbmZpZy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5wcmVjaXNpb25fY29uZmlnW19pXSA9IHN0YXRpY19jYXN0PHRmbGl0ZTo6U3RhYmxlaGxvUHJlY2lzaW9uQ29uZmlnPihfZS0+R2V0KF9pKSk7IH0gfSBlbHNlIHsgX28tPnByZWNpc2lvbl9jb25maWcucmVzaXplKDApOyB9IH0KK30KKworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9ucz4gU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworICByZXR1cm4gQ3JlYXRlU3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7Cit9CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnM+IENyZWF0ZVN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgKHZvaWQpX3JlaGFzaGVyOworICAodm9pZClfbzsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBhdXRvIF9saHNfYmF0Y2hpbmdfZGltZW5zaW9ucyA9IF9vLT5saHNfYmF0Y2hpbmdfZGltZW5zaW9ucy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcihfby0+bGhzX2JhdGNoaW5nX2RpbWVuc2lvbnMpIDogMDsKKyAgYXV0byBfcmhzX2JhdGNoaW5nX2RpbWVuc2lvbnMgPSBfby0+cmhzX2JhdGNoaW5nX2RpbWVuc2lvbnMuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3IoX28tPnJoc19iYXRjaGluZ19kaW1lbnNpb25zKSA6IDA7CisgIGF1dG8gX2xoc19jb250cmFjdGluZ19kaW1lbnNpb25zID0gX28tPmxoc19jb250cmFjdGluZ19kaW1lbnNpb25zLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT5saHNfY29udHJhY3RpbmdfZGltZW5zaW9ucykgOiAwOworICBhdXRvIF9yaHNfY29udHJhY3RpbmdfZGltZW5zaW9ucyA9IF9vLT5yaHNfY29udHJhY3RpbmdfZGltZW5zaW9ucy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcihfby0+cmhzX2NvbnRyYWN0aW5nX2RpbWVuc2lvbnMpIDogMDsKKyAgYXV0byBfcHJlY2lzaW9uX2NvbmZpZyA9IF9vLT5wcmVjaXNpb25fY29uZmlnLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yU2NhbGFyQ2FzdDx1aW50MzJfdD4oOjpmbGF0YnVmZmVyczo6ZGF0YShfby0+cHJlY2lzaW9uX2NvbmZpZyksIF9vLT5wcmVjaXNpb25fY29uZmlnLnNpemUoKSkgOiAwOworICByZXR1cm4gdGZsaXRlOjpDcmVhdGVTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9ucygKKyAgICAgIF9mYmIsCisgICAgICBfbGhzX2JhdGNoaW5nX2RpbWVuc2lvbnMsCisgICAgICBfcmhzX2JhdGNoaW5nX2RpbWVuc2lvbnMsCisgICAgICBfbGhzX2NvbnRyYWN0aW5nX2RpbWVuc2lvbnMsCisgICAgICBfcmhzX2NvbnRyYWN0aW5nX2RpbWVuc2lvbnMsCisgICAgICBfcHJlY2lzaW9uX2NvbmZpZyk7Cit9CisKK2lubGluZSBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zVCAqU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnNUPihuZXcgU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9uc1QoKSk7CisgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOworICByZXR1cm4gX28ucmVsZWFzZSgpOworfQorCitpbmxpbmUgdm9pZCBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zOjpVblBhY2tUbyhTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICAodm9pZClfbzsKKyAgKHZvaWQpX3Jlc29sdmVyOworICB7IGF1dG8gX2UgPSB3aW5kb3dfZGltZW5zaW9ucygpOyBpZiAoX2UpIHsgX28tPndpbmRvd19kaW1lbnNpb25zLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yICg6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPndpbmRvd19kaW1lbnNpb25zW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT53aW5kb3dfZGltZW5zaW9ucy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSB3aW5kb3dfc3RyaWRlcygpOyBpZiAoX2UpIHsgX28tPndpbmRvd19zdHJpZGVzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yICg6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPndpbmRvd19zdHJpZGVzW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT53aW5kb3dfc3RyaWRlcy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBiYXNlX2RpbGF0aW9ucygpOyBpZiAoX2UpIHsgX28tPmJhc2VfZGlsYXRpb25zLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yICg6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPmJhc2VfZGlsYXRpb25zW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT5iYXNlX2RpbGF0aW9ucy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSB3aW5kb3dfZGlsYXRpb25zKCk7IGlmIChfZSkgeyBfby0+d2luZG93X2RpbGF0aW9ucy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT53aW5kb3dfZGlsYXRpb25zW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT53aW5kb3dfZGlsYXRpb25zLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IHBhZGRpbmcoKTsgaWYgKF9lKSB7IF9vLT5wYWRkaW5nLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yICg6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnBhZGRpbmdbX2ldID0gX2UtPkdldChfaSk7IH0gfSBlbHNlIHsgX28tPnBhZGRpbmcucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gYm9keV9zdWJncmFwaF9pbmRleCgpOyBfby0+Ym9keV9zdWJncmFwaF9pbmRleCA9IF9lOyB9Cit9CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9ucz4gU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgcmV0dXJuIENyZWF0ZVN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7Cit9CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9ucz4gQ3JlYXRlU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgKHZvaWQpX3JlaGFzaGVyOworICAodm9pZClfbzsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIGF1dG8gX3dpbmRvd19kaW1lbnNpb25zID0gX28tPndpbmRvd19kaW1lbnNpb25zLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT53aW5kb3dfZGltZW5zaW9ucykgOiAwOworICBhdXRvIF93aW5kb3dfc3RyaWRlcyA9IF9vLT53aW5kb3dfc3RyaWRlcy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcihfby0+d2luZG93X3N0cmlkZXMpIDogMDsKKyAgYXV0byBfYmFzZV9kaWxhdGlvbnMgPSBfby0+YmFzZV9kaWxhdGlvbnMuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3IoX28tPmJhc2VfZGlsYXRpb25zKSA6IDA7CisgIGF1dG8gX3dpbmRvd19kaWxhdGlvbnMgPSBfby0+d2luZG93X2RpbGF0aW9ucy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcihfby0+d2luZG93X2RpbGF0aW9ucykgOiAwOworICBhdXRvIF9wYWRkaW5nID0gX28tPnBhZGRpbmcuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3IoX28tPnBhZGRpbmcpIDogMDsKKyAgYXV0byBfYm9keV9zdWJncmFwaF9pbmRleCA9IF9vLT5ib2R5X3N1YmdyYXBoX2luZGV4OworICByZXR1cm4gdGZsaXRlOjpDcmVhdGVTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zKAorICAgICAgX2ZiYiwKKyAgICAgIF93aW5kb3dfZGltZW5zaW9ucywKKyAgICAgIF93aW5kb3dfc3RyaWRlcywKKyAgICAgIF9iYXNlX2RpbGF0aW9ucywKKyAgICAgIF93aW5kb3dfZGlsYXRpb25zLAorICAgICAgX3BhZGRpbmcsCisgICAgICBfYm9keV9zdWJncmFwaF9pbmRleCk7Cit9CisKK2lubGluZSBTdGFibGVobG9XaGlsZU9wdGlvbnNUICpTdGFibGVobG9XaGlsZU9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKKyAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxTdGFibGVobG9XaGlsZU9wdGlvbnNUPihuZXcgU3RhYmxlaGxvV2hpbGVPcHRpb25zVCgpKTsKKyAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CisgIHJldHVybiBfby5yZWxlYXNlKCk7Cit9CisKK2lubGluZSB2b2lkIFN0YWJsZWhsb1doaWxlT3B0aW9uczo6VW5QYWNrVG8oU3RhYmxlaGxvV2hpbGVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICAodm9pZClfbzsKKyAgKHZvaWQpX3Jlc29sdmVyOworICB7IGF1dG8gX2UgPSBjb25kX3N1YmdyYXBoX2luZGV4KCk7IF9vLT5jb25kX3N1YmdyYXBoX2luZGV4ID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gYm9keV9zdWJncmFwaF9pbmRleCgpOyBfby0+Ym9keV9zdWJncmFwaF9pbmRleCA9IF9lOyB9Cit9CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvV2hpbGVPcHRpb25zPiBTdGFibGVobG9XaGlsZU9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN0YWJsZWhsb1doaWxlT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgcmV0dXJuIENyZWF0ZVN0YWJsZWhsb1doaWxlT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKK30KKworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9XaGlsZU9wdGlvbnM+IENyZWF0ZVN0YWJsZWhsb1doaWxlT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlaGxvV2hpbGVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworICAodm9pZClfcmVoYXNoZXI7CisgICh2b2lkKV9vOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFN0YWJsZWhsb1doaWxlT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBhdXRvIF9jb25kX3N1YmdyYXBoX2luZGV4ID0gX28tPmNvbmRfc3ViZ3JhcGhfaW5kZXg7CisgIGF1dG8gX2JvZHlfc3ViZ3JhcGhfaW5kZXggPSBfby0+Ym9keV9zdWJncmFwaF9pbmRleDsKKyAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlU3RhYmxlaGxvV2hpbGVPcHRpb25zKAorICAgICAgX2ZiYiwKKyAgICAgIF9jb25kX3N1YmdyYXBoX2luZGV4LAorICAgICAgX2JvZHlfc3ViZ3JhcGhfaW5kZXgpOworfQorCitpbmxpbmUgU3RhYmxlaGxvU29ydE9wdGlvbnNUICpTdGFibGVobG9Tb3J0T3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFN0YWJsZWhsb1NvcnRPcHRpb25zVD4obmV3IFN0YWJsZWhsb1NvcnRPcHRpb25zVCgpKTsKKyAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CisgIHJldHVybiBfby5yZWxlYXNlKCk7Cit9CisKK2lubGluZSB2b2lkIFN0YWJsZWhsb1NvcnRPcHRpb25zOjpVblBhY2tUbyhTdGFibGVobG9Tb3J0T3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKKyAgKHZvaWQpX287CisgICh2b2lkKV9yZXNvbHZlcjsKKyAgeyBhdXRvIF9lID0gZGltZW5zaW9uKCk7IF9vLT5kaW1lbnNpb24gPSBfZTsgfQorICB7IGF1dG8gX2UgPSBpc19zdGFibGUoKTsgX28tPmlzX3N0YWJsZSA9IF9lOyB9CisgIHsgYXV0byBfZSA9IGNvbXBhcmF0b3Jfc3ViZ3JhcGhfaW5kZXgoKTsgX28tPmNvbXBhcmF0b3Jfc3ViZ3JhcGhfaW5kZXggPSBfZTsgfQorfQorCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb1NvcnRPcHRpb25zPiBTdGFibGVobG9Tb3J0T3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlaGxvU29ydE9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CisgIHJldHVybiBDcmVhdGVTdGFibGVobG9Tb3J0T3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKK30KKworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9Tb3J0T3B0aW9ucz4gQ3JlYXRlU3RhYmxlaGxvU29ydE9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN0YWJsZWhsb1NvcnRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworICAodm9pZClfcmVoYXNoZXI7CisgICh2b2lkKV9vOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFN0YWJsZWhsb1NvcnRPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIGF1dG8gX2RpbWVuc2lvbiA9IF9vLT5kaW1lbnNpb247CisgIGF1dG8gX2lzX3N0YWJsZSA9IF9vLT5pc19zdGFibGU7CisgIGF1dG8gX2NvbXBhcmF0b3Jfc3ViZ3JhcGhfaW5kZXggPSBfby0+Y29tcGFyYXRvcl9zdWJncmFwaF9pbmRleDsKKyAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlU3RhYmxlaGxvU29ydE9wdGlvbnMoCisgICAgICBfZmJiLAorICAgICAgX2RpbWVuc2lvbiwKKyAgICAgIF9pc19zdGFibGUsCisgICAgICBfY29tcGFyYXRvcl9zdWJncmFwaF9pbmRleCk7Cit9CisKK2lubGluZSBTdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnNUICpTdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKKyAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxTdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnNUPihuZXcgU3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zVCgpKTsKKyAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CisgIHJldHVybiBfby5yZWxlYXNlKCk7Cit9CisKK2lubGluZSB2b2lkIFN0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9uczo6VW5QYWNrVG8oU3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICAodm9pZClfbzsKKyAgKHZvaWQpX3Jlc29sdmVyOworICB7IGF1dG8gX2UgPSBkaW1lbnNpb24oKTsgX28tPmRpbWVuc2lvbiA9IF9lOyB9Cit9CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zPiBTdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgcmV0dXJuIENyZWF0ZVN0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKK30KKworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnM+IENyZWF0ZVN0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworICAodm9pZClfcmVoYXNoZXI7CisgICh2b2lkKV9vOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFN0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBhdXRvIF9kaW1lbnNpb24gPSBfby0+ZGltZW5zaW9uOworICByZXR1cm4gdGZsaXRlOjpDcmVhdGVTdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnMoCisgICAgICBfZmJiLAorICAgICAgX2RpbWVuc2lvbik7Cit9CisKK2lubGluZSBTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnNUICpTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKKyAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnNUPihuZXcgU3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zVCgpKTsKKyAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CisgIHJldHVybiBfby5yZWxlYXNlKCk7Cit9CisKK2lubGluZSB2b2lkIFN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9uczo6VW5QYWNrVG8oU3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICAodm9pZClfbzsKKyAgKHZvaWQpX3Jlc29sdmVyOworICB7IGF1dG8gX2UgPSBicm9hZGNhc3RfZGltZW5zaW9ucygpOyBpZiAoX2UpIHsgX28tPmJyb2FkY2FzdF9kaW1lbnNpb25zLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yICg6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPmJyb2FkY2FzdF9kaW1lbnNpb25zW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT5icm9hZGNhc3RfZGltZW5zaW9ucy5yZXNpemUoMCk7IH0gfQorfQorCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9ucz4gU3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CisgIHJldHVybiBDcmVhdGVTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7Cit9CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zPiBDcmVhdGVTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgKHZvaWQpX3JlaGFzaGVyOworICAodm9pZClfbzsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgYXV0byBfYnJvYWRjYXN0X2RpbWVuc2lvbnMgPSBfby0+YnJvYWRjYXN0X2RpbWVuc2lvbnMuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3IoX28tPmJyb2FkY2FzdF9kaW1lbnNpb25zKSA6IDA7CisgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZVN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9ucygKKyAgICAgIF9mYmIsCisgICAgICBfYnJvYWRjYXN0X2RpbWVuc2lvbnMpOworfQorCitpbmxpbmUgU3RhYmxlaGxvQ29tcGFyZU9wdGlvbnNUICpTdGFibGVobG9Db21wYXJlT3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFN0YWJsZWhsb0NvbXBhcmVPcHRpb25zVD4obmV3IFN0YWJsZWhsb0NvbXBhcmVPcHRpb25zVCgpKTsKKyAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CisgIHJldHVybiBfby5yZWxlYXNlKCk7Cit9CisKK2lubGluZSB2b2lkIFN0YWJsZWhsb0NvbXBhcmVPcHRpb25zOjpVblBhY2tUbyhTdGFibGVobG9Db21wYXJlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKKyAgKHZvaWQpX287CisgICh2b2lkKV9yZXNvbHZlcjsKKyAgeyBhdXRvIF9lID0gY29tcGFyaXNvbl9kaXJlY3Rpb24oKTsgX28tPmNvbXBhcmlzb25fZGlyZWN0aW9uID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gY29tcGFyZV90eXBlKCk7IF9vLT5jb21wYXJlX3R5cGUgPSBfZTsgfQorfQorCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb0NvbXBhcmVPcHRpb25zPiBTdGFibGVobG9Db21wYXJlT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlaGxvQ29tcGFyZU9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CisgIHJldHVybiBDcmVhdGVTdGFibGVobG9Db21wYXJlT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKK30KKworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9Db21wYXJlT3B0aW9ucz4gQ3JlYXRlU3RhYmxlaGxvQ29tcGFyZU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN0YWJsZWhsb0NvbXBhcmVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworICAodm9pZClfcmVoYXNoZXI7CisgICh2b2lkKV9vOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFN0YWJsZWhsb0NvbXBhcmVPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIGF1dG8gX2NvbXBhcmlzb25fZGlyZWN0aW9uID0gX28tPmNvbXBhcmlzb25fZGlyZWN0aW9uOworICBhdXRvIF9jb21wYXJlX3R5cGUgPSBfby0+Y29tcGFyZV90eXBlOworICByZXR1cm4gdGZsaXRlOjpDcmVhdGVTdGFibGVobG9Db21wYXJlT3B0aW9ucygKKyAgICAgIF9mYmIsCisgICAgICBfY29tcGFyaXNvbl9kaXJlY3Rpb24sCisgICAgICBfY29tcGFyZV90eXBlKTsKK30KKworaW5saW5lIFN0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnNUICpTdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CisgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8U3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9uc1Q+KG5ldyBTdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zVCgpKTsKKyAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CisgIHJldHVybiBfby5yZWxlYXNlKCk7Cit9CisKK2lubGluZSB2b2lkIFN0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnM6OlVuUGFja1RvKFN0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CisgICh2b2lkKV9vOworICAodm9pZClfcmVzb2x2ZXI7CisgIHsgYXV0byBfZSA9IHNsaWNlX3NpemVzKCk7IGlmIChfZSkgeyBfby0+c2xpY2Vfc2l6ZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+c2xpY2Vfc2l6ZXNbX2ldID0gX2UtPkdldChfaSk7IH0gfSBlbHNlIHsgX28tPnNsaWNlX3NpemVzLnJlc2l6ZSgwKTsgfSB9Cit9CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9ucz4gU3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgcmV0dXJuIENyZWF0ZVN0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7Cit9CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9ucz4gQ3JlYXRlU3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgKHZvaWQpX3JlaGFzaGVyOworICAodm9pZClfbzsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBTdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIGF1dG8gX3NsaWNlX3NpemVzID0gX28tPnNsaWNlX3NpemVzLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT5zbGljZV9zaXplcykgOiAwOworICByZXR1cm4gdGZsaXRlOjpDcmVhdGVTdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zKAorICAgICAgX2ZiYiwKKyAgICAgIF9zbGljZV9zaXplcyk7Cit9CisKK2lubGluZSBTdGFibGVobG9QYWRPcHRpb25zVCAqU3RhYmxlaGxvUGFkT3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFN0YWJsZWhsb1BhZE9wdGlvbnNUPihuZXcgU3RhYmxlaGxvUGFkT3B0aW9uc1QoKSk7CisgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOworICByZXR1cm4gX28ucmVsZWFzZSgpOworfQorCitpbmxpbmUgdm9pZCBTdGFibGVobG9QYWRPcHRpb25zOjpVblBhY2tUbyhTdGFibGVobG9QYWRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICAodm9pZClfbzsKKyAgKHZvaWQpX3Jlc29sdmVyOworICB7IGF1dG8gX2UgPSBlZGdlX3BhZGRpbmdfbG93KCk7IGlmIChfZSkgeyBfby0+ZWRnZV9wYWRkaW5nX2xvdy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5lZGdlX3BhZGRpbmdfbG93W19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT5lZGdlX3BhZGRpbmdfbG93LnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IGVkZ2VfcGFkZGluZ19oaWdoKCk7IGlmIChfZSkgeyBfby0+ZWRnZV9wYWRkaW5nX2hpZ2gucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+ZWRnZV9wYWRkaW5nX2hpZ2hbX2ldID0gX2UtPkdldChfaSk7IH0gfSBlbHNlIHsgX28tPmVkZ2VfcGFkZGluZ19oaWdoLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IGludGVyaW9yX3BhZGRpbmcoKTsgaWYgKF9lKSB7IF9vLT5pbnRlcmlvcl9wYWRkaW5nLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yICg6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPmludGVyaW9yX3BhZGRpbmdbX2ldID0gX2UtPkdldChfaSk7IH0gfSBlbHNlIHsgX28tPmludGVyaW9yX3BhZGRpbmcucmVzaXplKDApOyB9IH0KK30KKworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9QYWRPcHRpb25zPiBTdGFibGVobG9QYWRPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTdGFibGVobG9QYWRPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworICByZXR1cm4gQ3JlYXRlU3RhYmxlaGxvUGFkT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKK30KKworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9QYWRPcHRpb25zPiBDcmVhdGVTdGFibGVobG9QYWRPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTdGFibGVobG9QYWRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworICAodm9pZClfcmVoYXNoZXI7CisgICh2b2lkKV9vOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFN0YWJsZWhsb1BhZE9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgYXV0byBfZWRnZV9wYWRkaW5nX2xvdyA9IF9vLT5lZGdlX3BhZGRpbmdfbG93LnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT5lZGdlX3BhZGRpbmdfbG93KSA6IDA7CisgIGF1dG8gX2VkZ2VfcGFkZGluZ19oaWdoID0gX28tPmVkZ2VfcGFkZGluZ19oaWdoLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT5lZGdlX3BhZGRpbmdfaGlnaCkgOiAwOworICBhdXRvIF9pbnRlcmlvcl9wYWRkaW5nID0gX28tPmludGVyaW9yX3BhZGRpbmcuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3IoX28tPmludGVyaW9yX3BhZGRpbmcpIDogMDsKKyAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlU3RhYmxlaGxvUGFkT3B0aW9ucygKKyAgICAgIF9mYmIsCisgICAgICBfZWRnZV9wYWRkaW5nX2xvdywKKyAgICAgIF9lZGdlX3BhZGRpbmdfaGlnaCwKKyAgICAgIF9pbnRlcmlvcl9wYWRkaW5nKTsKK30KKworaW5saW5lIFN0YWJsZWhsb0lvdGFPcHRpb25zVCAqU3RhYmxlaGxvSW90YU9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKKyAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxTdGFibGVobG9Jb3RhT3B0aW9uc1Q+KG5ldyBTdGFibGVobG9Jb3RhT3B0aW9uc1QoKSk7CisgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOworICByZXR1cm4gX28ucmVsZWFzZSgpOworfQorCitpbmxpbmUgdm9pZCBTdGFibGVobG9Jb3RhT3B0aW9uczo6VW5QYWNrVG8oU3RhYmxlaGxvSW90YU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CisgICh2b2lkKV9vOworICAodm9pZClfcmVzb2x2ZXI7CisgIHsgYXV0byBfZSA9IGlvdGFfZGltZW5zaW9uKCk7IF9vLT5pb3RhX2RpbWVuc2lvbiA9IF9lOyB9Cit9CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvSW90YU9wdGlvbnM+IFN0YWJsZWhsb0lvdGFPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTdGFibGVobG9Jb3RhT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgcmV0dXJuIENyZWF0ZVN0YWJsZWhsb0lvdGFPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOworfQorCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb0lvdGFPcHRpb25zPiBDcmVhdGVTdGFibGVobG9Jb3RhT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlaGxvSW90YU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CisgICh2b2lkKV9yZWhhc2hlcjsKKyAgKHZvaWQpX287CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgU3RhYmxlaGxvSW90YU9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgYXV0byBfaW90YV9kaW1lbnNpb24gPSBfby0+aW90YV9kaW1lbnNpb247CisgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZVN0YWJsZWhsb0lvdGFPcHRpb25zKAorICAgICAgX2ZiYiwKKyAgICAgIF9pb3RhX2RpbWVuc2lvbik7Cit9CisKK2lubGluZSBTdGFibGVobG9DdXN0b21DYWxsT3B0aW9uc1QgKlN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CisgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8U3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnNUPihuZXcgU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnNUKCkpOworICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKKyAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKK30KKworaW5saW5lIHZvaWQgU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnM6OlVuUGFja1RvKFN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICAodm9pZClfbzsKKyAgKHZvaWQpX3Jlc29sdmVyOworICB7IGF1dG8gX2UgPSBjYWxsX3RhcmdldF9uYW1lKCk7IGlmIChfZSkgX28tPmNhbGxfdGFyZ2V0X25hbWUgPSBfZS0+c3RyKCk7IH0KKyAgeyBhdXRvIF9lID0gaGFzX3NpZGVfZWZmZWN0KCk7IF9vLT5oYXNfc2lkZV9lZmZlY3QgPSBfZTsgfQorICB7IGF1dG8gX2UgPSBiYWNrZW5kX2NvbmZpZygpOyBpZiAoX2UpIF9vLT5iYWNrZW5kX2NvbmZpZyA9IF9lLT5zdHIoKTsgfQorICB7IGF1dG8gX2UgPSBhcGlfdmVyc2lvbigpOyBfby0+YXBpX3ZlcnNpb24gPSBfZTsgfQorICB7IGF1dG8gX2UgPSBjYWxsZWRfY29tcHV0YXRpb25zKCk7IGlmIChfZSkgeyBfby0+Y2FsbGVkX2NvbXB1dGF0aW9ucy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5jYWxsZWRfY29tcHV0YXRpb25zW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT5jYWxsZWRfY29tcHV0YXRpb25zLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IGN1c3RvbV9hdHRyaWJ1dGVzKCk7IGlmIChfZSkgeyBfby0+Y3VzdG9tX2F0dHJpYnV0ZXMucmVzaXplKF9lLT5zaXplKCkpOyBzdGQ6OmNvcHkoX2UtPmJlZ2luKCksIF9lLT5lbmQoKSwgX28tPmN1c3RvbV9hdHRyaWJ1dGVzLmJlZ2luKCkpOyB9IH0KK30KKworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9DdXN0b21DYWxsT3B0aW9ucz4gU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworICByZXR1cm4gQ3JlYXRlU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7Cit9CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnM+IENyZWF0ZVN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTdGFibGVobG9DdXN0b21DYWxsT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgKHZvaWQpX3JlaGFzaGVyOworICAodm9pZClfbzsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBTdGFibGVobG9DdXN0b21DYWxsT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBhdXRvIF9jYWxsX3RhcmdldF9uYW1lID0gX28tPmNhbGxfdGFyZ2V0X25hbWUuZW1wdHkoKSA/IDAgOiBfZmJiLkNyZWF0ZVN0cmluZyhfby0+Y2FsbF90YXJnZXRfbmFtZSk7CisgIGF1dG8gX2hhc19zaWRlX2VmZmVjdCA9IF9vLT5oYXNfc2lkZV9lZmZlY3Q7CisgIGF1dG8gX2JhY2tlbmRfY29uZmlnID0gX28tPmJhY2tlbmRfY29uZmlnLmVtcHR5KCkgPyAwIDogX2ZiYi5DcmVhdGVTdHJpbmcoX28tPmJhY2tlbmRfY29uZmlnKTsKKyAgYXV0byBfYXBpX3ZlcnNpb24gPSBfby0+YXBpX3ZlcnNpb247CisgIGF1dG8gX2NhbGxlZF9jb21wdXRhdGlvbnMgPSBfby0+Y2FsbGVkX2NvbXB1dGF0aW9ucy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcihfby0+Y2FsbGVkX2NvbXB1dGF0aW9ucykgOiAwOworICBhdXRvIF9jdXN0b21fYXR0cmlidXRlcyA9IF9vLT5jdXN0b21fYXR0cmlidXRlcy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcihfby0+Y3VzdG9tX2F0dHJpYnV0ZXMpIDogMDsKKyAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnMoCisgICAgICBfZmJiLAorICAgICAgX2NhbGxfdGFyZ2V0X25hbWUsCisgICAgICBfaGFzX3NpZGVfZWZmZWN0LAorICAgICAgX2JhY2tlbmRfY29uZmlnLAorICAgICAgX2FwaV92ZXJzaW9uLAorICAgICAgX2NhbGxlZF9jb21wdXRhdGlvbnMsCisgICAgICBfY3VzdG9tX2F0dHJpYnV0ZXMpOworfQorCitpbmxpbmUgU3RhYmxlaGxvUmVkdWNlT3B0aW9uc1QgKlN0YWJsZWhsb1JlZHVjZU9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKKyAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxTdGFibGVobG9SZWR1Y2VPcHRpb25zVD4obmV3IFN0YWJsZWhsb1JlZHVjZU9wdGlvbnNUKCkpOworICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKKyAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKK30KKworaW5saW5lIHZvaWQgU3RhYmxlaGxvUmVkdWNlT3B0aW9uczo6VW5QYWNrVG8oU3RhYmxlaGxvUmVkdWNlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKKyAgKHZvaWQpX287CisgICh2b2lkKV9yZXNvbHZlcjsKKyAgeyBhdXRvIF9lID0gZGltZW5zaW9ucygpOyBpZiAoX2UpIHsgX28tPmRpbWVuc2lvbnMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+ZGltZW5zaW9uc1tfaV0gPSBfZS0+R2V0KF9pKTsgfSB9IGVsc2UgeyBfby0+ZGltZW5zaW9ucy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBib2R5X3N1YmdyYXBoX2luZGV4KCk7IF9vLT5ib2R5X3N1YmdyYXBoX2luZGV4ID0gX2U7IH0KK30KKworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9SZWR1Y2VPcHRpb25zPiBTdGFibGVobG9SZWR1Y2VPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTdGFibGVobG9SZWR1Y2VPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworICByZXR1cm4gQ3JlYXRlU3RhYmxlaGxvUmVkdWNlT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKK30KKworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9SZWR1Y2VPcHRpb25zPiBDcmVhdGVTdGFibGVobG9SZWR1Y2VPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTdGFibGVobG9SZWR1Y2VPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworICAodm9pZClfcmVoYXNoZXI7CisgICh2b2lkKV9vOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFN0YWJsZWhsb1JlZHVjZU9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgYXV0byBfZGltZW5zaW9ucyA9IF9vLT5kaW1lbnNpb25zLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT5kaW1lbnNpb25zKSA6IDA7CisgIGF1dG8gX2JvZHlfc3ViZ3JhcGhfaW5kZXggPSBfby0+Ym9keV9zdWJncmFwaF9pbmRleDsKKyAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlU3RhYmxlaGxvUmVkdWNlT3B0aW9ucygKKyAgICAgIF9mYmIsCisgICAgICBfZGltZW5zaW9ucywKKyAgICAgIF9ib2R5X3N1YmdyYXBoX2luZGV4KTsKK30KKworaW5saW5lIFN0YWJsZWhsb1NsaWNlT3B0aW9uc1QgKlN0YWJsZWhsb1NsaWNlT3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFN0YWJsZWhsb1NsaWNlT3B0aW9uc1Q+KG5ldyBTdGFibGVobG9TbGljZU9wdGlvbnNUKCkpOworICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKKyAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKK30KKworaW5saW5lIHZvaWQgU3RhYmxlaGxvU2xpY2VPcHRpb25zOjpVblBhY2tUbyhTdGFibGVobG9TbGljZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CisgICh2b2lkKV9vOworICAodm9pZClfcmVzb2x2ZXI7CisgIHsgYXV0byBfZSA9IHN0YXJ0X2luZGljZXMoKTsgaWYgKF9lKSB7IF9vLT5zdGFydF9pbmRpY2VzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yICg6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnN0YXJ0X2luZGljZXNbX2ldID0gX2UtPkdldChfaSk7IH0gfSBlbHNlIHsgX28tPnN0YXJ0X2luZGljZXMucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gbGltaXRfaW5kaWNlcygpOyBpZiAoX2UpIHsgX28tPmxpbWl0X2luZGljZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+bGltaXRfaW5kaWNlc1tfaV0gPSBfZS0+R2V0KF9pKTsgfSB9IGVsc2UgeyBfby0+bGltaXRfaW5kaWNlcy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBzdHJpZGVzKCk7IGlmIChfZSkgeyBfby0+c3RyaWRlcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5zdHJpZGVzW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT5zdHJpZGVzLnJlc2l6ZSgwKTsgfSB9Cit9CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvU2xpY2VPcHRpb25zPiBTdGFibGVobG9TbGljZU9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN0YWJsZWhsb1NsaWNlT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgcmV0dXJuIENyZWF0ZVN0YWJsZWhsb1NsaWNlT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKK30KKworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdGFibGVobG9TbGljZU9wdGlvbnM+IENyZWF0ZVN0YWJsZWhsb1NsaWNlT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlaGxvU2xpY2VPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworICAodm9pZClfcmVoYXNoZXI7CisgICh2b2lkKV9vOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFN0YWJsZWhsb1NsaWNlT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBhdXRvIF9zdGFydF9pbmRpY2VzID0gX28tPnN0YXJ0X2luZGljZXMuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3IoX28tPnN0YXJ0X2luZGljZXMpIDogMDsKKyAgYXV0byBfbGltaXRfaW5kaWNlcyA9IF9vLT5saW1pdF9pbmRpY2VzLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT5saW1pdF9pbmRpY2VzKSA6IDA7CisgIGF1dG8gX3N0cmlkZXMgPSBfby0+c3RyaWRlcy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcihfby0+c3RyaWRlcykgOiAwOworICByZXR1cm4gdGZsaXRlOjpDcmVhdGVTdGFibGVobG9TbGljZU9wdGlvbnMoCisgICAgICBfZmJiLAorICAgICAgX3N0YXJ0X2luZGljZXMsCisgICAgICBfbGltaXRfaW5kaWNlcywKKyAgICAgIF9zdHJpZGVzKTsKK30KKworaW5saW5lIFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc1QgKlN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc1Q+KG5ldyBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNUKCkpOworICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKKyAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKK30KKworaW5saW5lIHZvaWQgU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zOjpVblBhY2tUbyhTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CisgICh2b2lkKV9vOworICAodm9pZClfcmVzb2x2ZXI7CisgIHsgYXV0byBfZSA9IHdpbmRvd19zdHJpZGVzKCk7IGlmIChfZSkgeyBfby0+d2luZG93X3N0cmlkZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+d2luZG93X3N0cmlkZXNbX2ldID0gX2UtPkdldChfaSk7IH0gfSBlbHNlIHsgX28tPndpbmRvd19zdHJpZGVzLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IHBhZGRpbmcoKTsgaWYgKF9lKSB7IF9vLT5wYWRkaW5nLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yICg6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnBhZGRpbmdbX2ldID0gX2UtPkdldChfaSk7IH0gfSBlbHNlIHsgX28tPnBhZGRpbmcucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gbGhzX2RpbGF0aW9uKCk7IGlmIChfZSkgeyBfby0+bGhzX2RpbGF0aW9uLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yICg6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPmxoc19kaWxhdGlvbltfaV0gPSBfZS0+R2V0KF9pKTsgfSB9IGVsc2UgeyBfby0+bGhzX2RpbGF0aW9uLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IHJoc19kaWxhdGlvbigpOyBpZiAoX2UpIHsgX28tPnJoc19kaWxhdGlvbi5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5yaHNfZGlsYXRpb25bX2ldID0gX2UtPkdldChfaSk7IH0gfSBlbHNlIHsgX28tPnJoc19kaWxhdGlvbi5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSB3aW5kb3dfcmV2ZXJzYWwoKTsgaWYgKF9lKSB7IF9vLT53aW5kb3dfcmV2ZXJzYWwucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+d2luZG93X3JldmVyc2FsW19pXSA9IF9lLT5HZXQoX2kpICE9IDA7IH0gfSBlbHNlIHsgX28tPndpbmRvd19yZXZlcnNhbC5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBpbnB1dF9iYXRjaF9kaW1lbnNpb24oKTsgX28tPmlucHV0X2JhdGNoX2RpbWVuc2lvbiA9IF9lOyB9CisgIHsgYXV0byBfZSA9IGlucHV0X2ZlYXR1cmVfZGltZW5zaW9uKCk7IF9vLT5pbnB1dF9mZWF0dXJlX2RpbWVuc2lvbiA9IF9lOyB9CisgIHsgYXV0byBfZSA9IGlucHV0X3NwYXRpYWxfZGltZW5zaW9ucygpOyBpZiAoX2UpIHsgX28tPmlucHV0X3NwYXRpYWxfZGltZW5zaW9ucy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5pbnB1dF9zcGF0aWFsX2RpbWVuc2lvbnNbX2ldID0gX2UtPkdldChfaSk7IH0gfSBlbHNlIHsgX28tPmlucHV0X3NwYXRpYWxfZGltZW5zaW9ucy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBrZXJuZWxfaW5wdXRfZmVhdHVyZV9kaW1lbnNpb24oKTsgX28tPmtlcm5lbF9pbnB1dF9mZWF0dXJlX2RpbWVuc2lvbiA9IF9lOyB9CisgIHsgYXV0byBfZSA9IGtlcm5lbF9vdXRwdXRfZmVhdHVyZV9kaW1lbnNpb24oKTsgX28tPmtlcm5lbF9vdXRwdXRfZmVhdHVyZV9kaW1lbnNpb24gPSBfZTsgfQorICB7IGF1dG8gX2UgPSBrZXJuZWxfc3BhdGlhbF9kaW1lbnNpb25zKCk7IGlmIChfZSkgeyBfby0+a2VybmVsX3NwYXRpYWxfZGltZW5zaW9ucy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5rZXJuZWxfc3BhdGlhbF9kaW1lbnNpb25zW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT5rZXJuZWxfc3BhdGlhbF9kaW1lbnNpb25zLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IG91dHB1dF9iYXRjaF9kaW1lbnNpb24oKTsgX28tPm91dHB1dF9iYXRjaF9kaW1lbnNpb24gPSBfZTsgfQorICB7IGF1dG8gX2UgPSBvdXRwdXRfZmVhdHVyZV9kaW1lbnNpb24oKTsgX28tPm91dHB1dF9mZWF0dXJlX2RpbWVuc2lvbiA9IF9lOyB9CisgIHsgYXV0byBfZSA9IG91dHB1dF9zcGF0aWFsX2RpbWVuc2lvbnMoKTsgaWYgKF9lKSB7IF9vLT5vdXRwdXRfc3BhdGlhbF9kaW1lbnNpb25zLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yICg6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPm91dHB1dF9zcGF0aWFsX2RpbWVuc2lvbnNbX2ldID0gX2UtPkdldChfaSk7IH0gfSBlbHNlIHsgX28tPm91dHB1dF9zcGF0aWFsX2RpbWVuc2lvbnMucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gZmVhdHVyZV9ncm91cF9jb3VudCgpOyBfby0+ZmVhdHVyZV9ncm91cF9jb3VudCA9IF9lOyB9CisgIHsgYXV0byBfZSA9IGJhdGNoX2dyb3VwX2NvdW50KCk7IF9vLT5iYXRjaF9ncm91cF9jb3VudCA9IF9lOyB9CisgIHsgYXV0byBfZSA9IHByZWNpc2lvbl9jb25maWcoKTsgaWYgKF9lKSB7IF9vLT5wcmVjaXNpb25fY29uZmlnLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yICg6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPnByZWNpc2lvbl9jb25maWdbX2ldID0gc3RhdGljX2Nhc3Q8dGZsaXRlOjpTdGFibGVobG9QcmVjaXNpb25Db25maWc+KF9lLT5HZXQoX2kpKTsgfSB9IGVsc2UgeyBfby0+cHJlY2lzaW9uX2NvbmZpZy5yZXNpemUoMCk7IH0gfQorfQorCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucz4gU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CisgIHJldHVybiBDcmVhdGVTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7Cit9CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zPiBDcmVhdGVTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgKHZvaWQpX3JlaGFzaGVyOworICAodm9pZClfbzsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgYXV0byBfd2luZG93X3N0cmlkZXMgPSBfby0+d2luZG93X3N0cmlkZXMuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3IoX28tPndpbmRvd19zdHJpZGVzKSA6IDA7CisgIGF1dG8gX3BhZGRpbmcgPSBfby0+cGFkZGluZy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcihfby0+cGFkZGluZykgOiAwOworICBhdXRvIF9saHNfZGlsYXRpb24gPSBfby0+bGhzX2RpbGF0aW9uLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT5saHNfZGlsYXRpb24pIDogMDsKKyAgYXV0byBfcmhzX2RpbGF0aW9uID0gX28tPnJoc19kaWxhdGlvbi5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcihfby0+cmhzX2RpbGF0aW9uKSA6IDA7CisgIGF1dG8gX3dpbmRvd19yZXZlcnNhbCA9IF9vLT53aW5kb3dfcmV2ZXJzYWwuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3IoX28tPndpbmRvd19yZXZlcnNhbCkgOiAwOworICBhdXRvIF9pbnB1dF9iYXRjaF9kaW1lbnNpb24gPSBfby0+aW5wdXRfYmF0Y2hfZGltZW5zaW9uOworICBhdXRvIF9pbnB1dF9mZWF0dXJlX2RpbWVuc2lvbiA9IF9vLT5pbnB1dF9mZWF0dXJlX2RpbWVuc2lvbjsKKyAgYXV0byBfaW5wdXRfc3BhdGlhbF9kaW1lbnNpb25zID0gX28tPmlucHV0X3NwYXRpYWxfZGltZW5zaW9ucy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcihfby0+aW5wdXRfc3BhdGlhbF9kaW1lbnNpb25zKSA6IDA7CisgIGF1dG8gX2tlcm5lbF9pbnB1dF9mZWF0dXJlX2RpbWVuc2lvbiA9IF9vLT5rZXJuZWxfaW5wdXRfZmVhdHVyZV9kaW1lbnNpb247CisgIGF1dG8gX2tlcm5lbF9vdXRwdXRfZmVhdHVyZV9kaW1lbnNpb24gPSBfby0+a2VybmVsX291dHB1dF9mZWF0dXJlX2RpbWVuc2lvbjsKKyAgYXV0byBfa2VybmVsX3NwYXRpYWxfZGltZW5zaW9ucyA9IF9vLT5rZXJuZWxfc3BhdGlhbF9kaW1lbnNpb25zLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT5rZXJuZWxfc3BhdGlhbF9kaW1lbnNpb25zKSA6IDA7CisgIGF1dG8gX291dHB1dF9iYXRjaF9kaW1lbnNpb24gPSBfby0+b3V0cHV0X2JhdGNoX2RpbWVuc2lvbjsKKyAgYXV0byBfb3V0cHV0X2ZlYXR1cmVfZGltZW5zaW9uID0gX28tPm91dHB1dF9mZWF0dXJlX2RpbWVuc2lvbjsKKyAgYXV0byBfb3V0cHV0X3NwYXRpYWxfZGltZW5zaW9ucyA9IF9vLT5vdXRwdXRfc3BhdGlhbF9kaW1lbnNpb25zLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT5vdXRwdXRfc3BhdGlhbF9kaW1lbnNpb25zKSA6IDA7CisgIGF1dG8gX2ZlYXR1cmVfZ3JvdXBfY291bnQgPSBfby0+ZmVhdHVyZV9ncm91cF9jb3VudDsKKyAgYXV0byBfYmF0Y2hfZ3JvdXBfY291bnQgPSBfby0+YmF0Y2hfZ3JvdXBfY291bnQ7CisgIGF1dG8gX3ByZWNpc2lvbl9jb25maWcgPSBfby0+cHJlY2lzaW9uX2NvbmZpZy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3RvclNjYWxhckNhc3Q8dWludDMyX3Q+KDo6ZmxhdGJ1ZmZlcnM6OmRhdGEoX28tPnByZWNpc2lvbl9jb25maWcpLCBfby0+cHJlY2lzaW9uX2NvbmZpZy5zaXplKCkpIDogMDsKKyAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zKAorICAgICAgX2ZiYiwKKyAgICAgIF93aW5kb3dfc3RyaWRlcywKKyAgICAgIF9wYWRkaW5nLAorICAgICAgX2xoc19kaWxhdGlvbiwKKyAgICAgIF9yaHNfZGlsYXRpb24sCisgICAgICBfd2luZG93X3JldmVyc2FsLAorICAgICAgX2lucHV0X2JhdGNoX2RpbWVuc2lvbiwKKyAgICAgIF9pbnB1dF9mZWF0dXJlX2RpbWVuc2lvbiwKKyAgICAgIF9pbnB1dF9zcGF0aWFsX2RpbWVuc2lvbnMsCisgICAgICBfa2VybmVsX2lucHV0X2ZlYXR1cmVfZGltZW5zaW9uLAorICAgICAgX2tlcm5lbF9vdXRwdXRfZmVhdHVyZV9kaW1lbnNpb24sCisgICAgICBfa2VybmVsX3NwYXRpYWxfZGltZW5zaW9ucywKKyAgICAgIF9vdXRwdXRfYmF0Y2hfZGltZW5zaW9uLAorICAgICAgX291dHB1dF9mZWF0dXJlX2RpbWVuc2lvbiwKKyAgICAgIF9vdXRwdXRfc3BhdGlhbF9kaW1lbnNpb25zLAorICAgICAgX2ZlYXR1cmVfZ3JvdXBfY291bnQsCisgICAgICBfYmF0Y2hfZ3JvdXBfY291bnQsCisgICAgICBfcHJlY2lzaW9uX2NvbmZpZyk7Cit9CisKK2lubGluZSBTdGFibGVobG9TY2F0dGVyT3B0aW9uc1QgKlN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CisgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8U3RhYmxlaGxvU2NhdHRlck9wdGlvbnNUPihuZXcgU3RhYmxlaGxvU2NhdHRlck9wdGlvbnNUKCkpOworICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKKyAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKK30KKworaW5saW5lIHZvaWQgU3RhYmxlaGxvU2NhdHRlck9wdGlvbnM6OlVuUGFja1RvKFN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICAodm9pZClfbzsKKyAgKHZvaWQpX3Jlc29sdmVyOworICB7IGF1dG8gX2UgPSBpbmRpY2VzX2FyZV9zb3J0ZWQoKTsgX28tPmluZGljZXNfYXJlX3NvcnRlZCA9IF9lOyB9CisgIHsgYXV0byBfZSA9IHVwZGF0ZV93aW5kb3dfZGltcygpOyBpZiAoX2UpIHsgX28tPnVwZGF0ZV93aW5kb3dfZGltcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT51cGRhdGVfd2luZG93X2RpbXNbX2ldID0gX2UtPkdldChfaSk7IH0gfSBlbHNlIHsgX28tPnVwZGF0ZV93aW5kb3dfZGltcy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBpbnNlcnRlZF93aW5kb3dfZGltcygpOyBpZiAoX2UpIHsgX28tPmluc2VydGVkX3dpbmRvd19kaW1zLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yICg6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPmluc2VydGVkX3dpbmRvd19kaW1zW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT5pbnNlcnRlZF93aW5kb3dfZGltcy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBzY2F0dGVyX2RpbXNfdG9fb3BlcmFuZF9kaW1zKCk7IGlmIChfZSkgeyBfby0+c2NhdHRlcl9kaW1zX3RvX29wZXJhbmRfZGltcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5zY2F0dGVyX2RpbXNfdG9fb3BlcmFuZF9kaW1zW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT5zY2F0dGVyX2RpbXNfdG9fb3BlcmFuZF9kaW1zLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IGluZGV4X3ZlY3Rvcl9kaW0oKTsgX28tPmluZGV4X3ZlY3Rvcl9kaW0gPSBfZTsgfQorICB7IGF1dG8gX2UgPSB1bmlxdWVfaW5kaWNlcygpOyBfby0+dW5pcXVlX2luZGljZXMgPSBfZTsgfQorICB7IGF1dG8gX2UgPSB1cGRhdGVfY29tcHV0YXRpb25fc3ViZ3JhcGhfaW5kZXgoKTsgX28tPnVwZGF0ZV9jb21wdXRhdGlvbl9zdWJncmFwaF9pbmRleCA9IF9lOyB9Cit9CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvU2NhdHRlck9wdGlvbnM+IFN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTdGFibGVobG9TY2F0dGVyT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgcmV0dXJuIENyZWF0ZVN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOworfQorCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zPiBDcmVhdGVTdGFibGVobG9TY2F0dGVyT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlaGxvU2NhdHRlck9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CisgICh2b2lkKV9yZWhhc2hlcjsKKyAgKHZvaWQpX287CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgU3RhYmxlaGxvU2NhdHRlck9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgYXV0byBfaW5kaWNlc19hcmVfc29ydGVkID0gX28tPmluZGljZXNfYXJlX3NvcnRlZDsKKyAgYXV0byBfdXBkYXRlX3dpbmRvd19kaW1zID0gX28tPnVwZGF0ZV93aW5kb3dfZGltcy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcihfby0+dXBkYXRlX3dpbmRvd19kaW1zKSA6IDA7CisgIGF1dG8gX2luc2VydGVkX3dpbmRvd19kaW1zID0gX28tPmluc2VydGVkX3dpbmRvd19kaW1zLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT5pbnNlcnRlZF93aW5kb3dfZGltcykgOiAwOworICBhdXRvIF9zY2F0dGVyX2RpbXNfdG9fb3BlcmFuZF9kaW1zID0gX28tPnNjYXR0ZXJfZGltc190b19vcGVyYW5kX2RpbXMuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3IoX28tPnNjYXR0ZXJfZGltc190b19vcGVyYW5kX2RpbXMpIDogMDsKKyAgYXV0byBfaW5kZXhfdmVjdG9yX2RpbSA9IF9vLT5pbmRleF92ZWN0b3JfZGltOworICBhdXRvIF91bmlxdWVfaW5kaWNlcyA9IF9vLT51bmlxdWVfaW5kaWNlczsKKyAgYXV0byBfdXBkYXRlX2NvbXB1dGF0aW9uX3N1YmdyYXBoX2luZGV4ID0gX28tPnVwZGF0ZV9jb21wdXRhdGlvbl9zdWJncmFwaF9pbmRleDsKKyAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlU3RhYmxlaGxvU2NhdHRlck9wdGlvbnMoCisgICAgICBfZmJiLAorICAgICAgX2luZGljZXNfYXJlX3NvcnRlZCwKKyAgICAgIF91cGRhdGVfd2luZG93X2RpbXMsCisgICAgICBfaW5zZXJ0ZWRfd2luZG93X2RpbXMsCisgICAgICBfc2NhdHRlcl9kaW1zX3RvX29wZXJhbmRfZGltcywKKyAgICAgIF9pbmRleF92ZWN0b3JfZGltLAorICAgICAgX3VuaXF1ZV9pbmRpY2VzLAorICAgICAgX3VwZGF0ZV9jb21wdXRhdGlvbl9zdWJncmFwaF9pbmRleCk7Cit9CisKK2lubGluZSBTdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zVCAqU3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFN0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnNUPihuZXcgU3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9uc1QoKSk7CisgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOworICByZXR1cm4gX28ucmVsZWFzZSgpOworfQorCitpbmxpbmUgdm9pZCBTdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zOjpVblBhY2tUbyhTdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICAodm9pZClfbzsKKyAgKHZvaWQpX3Jlc29sdmVyOworICB7IGF1dG8gX2UgPSBhbGdvcml0aG0oKTsgX28tPmFsZ29yaXRobSA9IF9lOyB9Cit9CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9ucz4gU3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgcmV0dXJuIENyZWF0ZVN0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7Cit9CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9ucz4gQ3JlYXRlU3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgKHZvaWQpX3JlaGFzaGVyOworICAodm9pZClfbzsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBTdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIGF1dG8gX2FsZ29yaXRobSA9IF9vLT5hbGdvcml0aG07CisgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZVN0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnMoCisgICAgICBfZmJiLAorICAgICAgX2FsZ29yaXRobSk7Cit9CisKK2lubGluZSBDb252MkRPcHRpb25zVCAqQ29udjJET3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPENvbnYyRE9wdGlvbnNUPihuZXcgQ29udjJET3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBDb252MkRPcHRpb25zOjpVblBhY2tUbyhDb252MkRPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIENvbnYyRE9wdGlvbnM6OlVuUGFja1RvKENvbnYyRE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiAgIHsgYXV0byBfZSA9IHBhZGRpbmcoKTsgX28tPnBhZGRpbmcgPSBfZTsgfQpAQCAtMTM5NjQsMjIgKzE3NjMzLDI0IEBACiAgIHsgYXV0byBfZSA9IGZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24oKTsgX28tPmZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24gPSBfZTsgfQogICB7IGF1dG8gX2UgPSBkaWxhdGlvbl93X2ZhY3RvcigpOyBfby0+ZGlsYXRpb25fd19mYWN0b3IgPSBfZTsgfQogICB7IGF1dG8gX2UgPSBkaWxhdGlvbl9oX2ZhY3RvcigpOyBfby0+ZGlsYXRpb25faF9mYWN0b3IgPSBfZTsgfQorICB7IGF1dG8gX2UgPSBxdWFudGl6ZWRfYmlhc190eXBlKCk7IF9vLT5xdWFudGl6ZWRfYmlhc190eXBlID0gX2U7IH0KIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8Q29udjJET3B0aW9ucz4gQ29udjJET3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IENvbnYyRE9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDb252MkRPcHRpb25zPiBDb252MkRPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBDb252MkRPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlQ29udjJET3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8Q29udjJET3B0aW9ucz4gQ3JlYXRlQ29udjJET3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IENvbnYyRE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDb252MkRPcHRpb25zPiBDcmVhdGVDb252MkRPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBDb252MkRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBDb252MkRPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IENvbnYyRE9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgYXV0byBfcGFkZGluZyA9IF9vLT5wYWRkaW5nOwogICBhdXRvIF9zdHJpZGVfdyA9IF9vLT5zdHJpZGVfdzsKICAgYXV0byBfc3RyaWRlX2ggPSBfby0+c3RyaWRlX2g7CiAgIGF1dG8gX2Z1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24gPSBfby0+ZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbjsKICAgYXV0byBfZGlsYXRpb25fd19mYWN0b3IgPSBfby0+ZGlsYXRpb25fd19mYWN0b3I7CiAgIGF1dG8gX2RpbGF0aW9uX2hfZmFjdG9yID0gX28tPmRpbGF0aW9uX2hfZmFjdG9yOworICBhdXRvIF9xdWFudGl6ZWRfYmlhc190eXBlID0gX28tPnF1YW50aXplZF9iaWFzX3R5cGU7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZUNvbnYyRE9wdGlvbnMoCiAgICAgICBfZmJiLAogICAgICAgX3BhZGRpbmcsCkBAIC0xMzk4NywxNiArMTc2NTgsMTcgQEAKICAgICAgIF9zdHJpZGVfaCwKICAgICAgIF9mdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uLAogICAgICAgX2RpbGF0aW9uX3dfZmFjdG9yLAotICAgICAgX2RpbGF0aW9uX2hfZmFjdG9yKTsKKyAgICAgIF9kaWxhdGlvbl9oX2ZhY3RvciwKKyAgICAgIF9xdWFudGl6ZWRfYmlhc190eXBlKTsKIH0KIAotaW5saW5lIENvbnYzRE9wdGlvbnNUICpDb252M0RPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIENvbnYzRE9wdGlvbnNUICpDb252M0RPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8Q29udjNET3B0aW9uc1Q+KG5ldyBDb252M0RPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIENvbnYzRE9wdGlvbnM6OlVuUGFja1RvKENvbnYzRE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgQ29udjNET3B0aW9uczo6VW5QYWNrVG8oQ29udjNET3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKICAgeyBhdXRvIF9lID0gcGFkZGluZygpOyBfby0+cGFkZGluZyA9IF9lOyB9CkBAIC0xNDAwOSwxNCArMTc2ODEsMTQgQEAKICAgeyBhdXRvIF9lID0gZGlsYXRpb25faF9mYWN0b3IoKTsgX28tPmRpbGF0aW9uX2hfZmFjdG9yID0gX2U7IH0KIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8Q29udjNET3B0aW9ucz4gQ29udjNET3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IENvbnYzRE9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDb252M0RPcHRpb25zPiBDb252M0RPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBDb252M0RPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlQ29udjNET3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8Q29udjNET3B0aW9ucz4gQ3JlYXRlQ29udjNET3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IENvbnYzRE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDb252M0RPcHRpb25zPiBDcmVhdGVDb252M0RPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBDb252M0RPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBDb252M0RPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IENvbnYzRE9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgYXV0byBfcGFkZGluZyA9IF9vLT5wYWRkaW5nOwogICBhdXRvIF9zdHJpZGVfZCA9IF9vLT5zdHJpZGVfZDsKICAgYXV0byBfc3RyaWRlX3cgPSBfby0+c3RyaWRlX3c7CkBAIC0xNDAzNywxMyArMTc3MDksMTMgQEAKICAgICAgIF9kaWxhdGlvbl9oX2ZhY3Rvcik7CiB9CiAKLWlubGluZSBQb29sMkRPcHRpb25zVCAqUG9vbDJET3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBQb29sMkRPcHRpb25zVCAqUG9vbDJET3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFBvb2wyRE9wdGlvbnNUPihuZXcgUG9vbDJET3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBQb29sMkRPcHRpb25zOjpVblBhY2tUbyhQb29sMkRPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIFBvb2wyRE9wdGlvbnM6OlVuUGFja1RvKFBvb2wyRE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiAgIHsgYXV0byBfZSA9IHBhZGRpbmcoKTsgX28tPnBhZGRpbmcgPSBfZTsgfQpAQCAtMTQwNTQsMTQgKzE3NzI2LDE0IEBACiAgIHsgYXV0byBfZSA9IGZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24oKTsgX28tPmZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24gPSBfZTsgfQogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxQb29sMkRPcHRpb25zPiBQb29sMkRPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUG9vbDJET3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFBvb2wyRE9wdGlvbnM+IFBvb2wyRE9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFBvb2wyRE9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVQb29sMkRPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxQb29sMkRPcHRpb25zPiBDcmVhdGVQb29sMkRPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUG9vbDJET3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFBvb2wyRE9wdGlvbnM+IENyZWF0ZVBvb2wyRE9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFBvb2wyRE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFBvb2wyRE9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgUG9vbDJET3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICBhdXRvIF9wYWRkaW5nID0gX28tPnBhZGRpbmc7CiAgIGF1dG8gX3N0cmlkZV93ID0gX28tPnN0cmlkZV93OwogICBhdXRvIF9zdHJpZGVfaCA9IF9vLT5zdHJpZGVfaDsKQEAgLTE0MDc4LDEzICsxNzc1MCwxMyBAQAogICAgICAgX2Z1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24pOwogfQogCi1pbmxpbmUgRGVwdGh3aXNlQ29udjJET3B0aW9uc1QgKkRlcHRod2lzZUNvbnYyRE9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgRGVwdGh3aXNlQ29udjJET3B0aW9uc1QgKkRlcHRod2lzZUNvbnYyRE9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxEZXB0aHdpc2VDb252MkRPcHRpb25zVD4obmV3IERlcHRod2lzZUNvbnYyRE9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgRGVwdGh3aXNlQ29udjJET3B0aW9uczo6VW5QYWNrVG8oRGVwdGh3aXNlQ29udjJET3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBEZXB0aHdpc2VDb252MkRPcHRpb25zOjpVblBhY2tUbyhEZXB0aHdpc2VDb252MkRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogICB7IGF1dG8gX2UgPSBwYWRkaW5nKCk7IF9vLT5wYWRkaW5nID0gX2U7IH0KQEAgLTE0MDk2LDE0ICsxNzc2OCwxNCBAQAogICB7IGF1dG8gX2UgPSBkaWxhdGlvbl9oX2ZhY3RvcigpOyBfby0+ZGlsYXRpb25faF9mYWN0b3IgPSBfZTsgfQogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxEZXB0aHdpc2VDb252MkRPcHRpb25zPiBEZXB0aHdpc2VDb252MkRPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRGVwdGh3aXNlQ29udjJET3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PERlcHRod2lzZUNvbnYyRE9wdGlvbnM+IERlcHRod2lzZUNvbnYyRE9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IERlcHRod2lzZUNvbnYyRE9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVEZXB0aHdpc2VDb252MkRPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxEZXB0aHdpc2VDb252MkRPcHRpb25zPiBDcmVhdGVEZXB0aHdpc2VDb252MkRPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRGVwdGh3aXNlQ29udjJET3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PERlcHRod2lzZUNvbnYyRE9wdGlvbnM+IENyZWF0ZURlcHRod2lzZUNvbnYyRE9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IERlcHRod2lzZUNvbnYyRE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IERlcHRod2lzZUNvbnYyRE9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgRGVwdGh3aXNlQ29udjJET3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICBhdXRvIF9wYWRkaW5nID0gX28tPnBhZGRpbmc7CiAgIGF1dG8gX3N0cmlkZV93ID0gX28tPnN0cmlkZV93OwogICBhdXRvIF9zdHJpZGVfaCA9IF9vLT5zdHJpZGVfaDsKQEAgLTE0MTIyLDI4ICsxNzc5NCwyOCBAQAogICAgICAgX2RpbGF0aW9uX2hfZmFjdG9yKTsKIH0KIAotaW5saW5lIENvbmNhdEVtYmVkZGluZ3NPcHRpb25zVCAqQ29uY2F0RW1iZWRkaW5nc09wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgQ29uY2F0RW1iZWRkaW5nc09wdGlvbnNUICpDb25jYXRFbWJlZGRpbmdzT3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPENvbmNhdEVtYmVkZGluZ3NPcHRpb25zVD4obmV3IENvbmNhdEVtYmVkZGluZ3NPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIENvbmNhdEVtYmVkZGluZ3NPcHRpb25zOjpVblBhY2tUbyhDb25jYXRFbWJlZGRpbmdzT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBDb25jYXRFbWJlZGRpbmdzT3B0aW9uczo6VW5QYWNrVG8oQ29uY2F0RW1iZWRkaW5nc09wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiAgIHsgYXV0byBfZSA9IG51bV9jaGFubmVscygpOyBfby0+bnVtX2NoYW5uZWxzID0gX2U7IH0KLSAgeyBhdXRvIF9lID0gbnVtX2NvbHVtbnNfcGVyX2NoYW5uZWwoKTsgaWYgKF9lKSB7IF9vLT5udW1fY29sdW1uc19wZXJfY2hhbm5lbC5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+bnVtX2NvbHVtbnNfcGVyX2NoYW5uZWxbX2ldID0gX2UtPkdldChfaSk7IH0gfSB9Ci0gIHsgYXV0byBfZSA9IGVtYmVkZGluZ19kaW1fcGVyX2NoYW5uZWwoKTsgaWYgKF9lKSB7IF9vLT5lbWJlZGRpbmdfZGltX3Blcl9jaGFubmVsLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5lbWJlZGRpbmdfZGltX3Blcl9jaGFubmVsW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gfQorICB7IGF1dG8gX2UgPSBudW1fY29sdW1uc19wZXJfY2hhbm5lbCgpOyBpZiAoX2UpIHsgX28tPm51bV9jb2x1bW5zX3Blcl9jaGFubmVsLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yICg6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPm51bV9jb2x1bW5zX3Blcl9jaGFubmVsW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT5udW1fY29sdW1uc19wZXJfY2hhbm5lbC5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBlbWJlZGRpbmdfZGltX3Blcl9jaGFubmVsKCk7IGlmIChfZSkgeyBfby0+ZW1iZWRkaW5nX2RpbV9wZXJfY2hhbm5lbC5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5lbWJlZGRpbmdfZGltX3Blcl9jaGFubmVsW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT5lbWJlZGRpbmdfZGltX3Blcl9jaGFubmVsLnJlc2l6ZSgwKTsgfSB9CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PENvbmNhdEVtYmVkZGluZ3NPcHRpb25zPiBDb25jYXRFbWJlZGRpbmdzT3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IENvbmNhdEVtYmVkZGluZ3NPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Q29uY2F0RW1iZWRkaW5nc09wdGlvbnM+IENvbmNhdEVtYmVkZGluZ3NPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBDb25jYXRFbWJlZGRpbmdzT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZUNvbmNhdEVtYmVkZGluZ3NPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDb25jYXRFbWJlZGRpbmdzT3B0aW9ucz4gQ3JlYXRlQ29uY2F0RW1iZWRkaW5nc09wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBDb25jYXRFbWJlZGRpbmdzT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PENvbmNhdEVtYmVkZGluZ3NPcHRpb25zPiBDcmVhdGVDb25jYXRFbWJlZGRpbmdzT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQ29uY2F0RW1iZWRkaW5nc09wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IENvbmNhdEVtYmVkZGluZ3NPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IENvbmNhdEVtYmVkZGluZ3NPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIGF1dG8gX251bV9jaGFubmVscyA9IF9vLT5udW1fY2hhbm5lbHM7CiAgIGF1dG8gX251bV9jb2x1bW5zX3Blcl9jaGFubmVsID0gX28tPm51bV9jb2x1bW5zX3Blcl9jaGFubmVsLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT5udW1fY29sdW1uc19wZXJfY2hhbm5lbCkgOiAwOwogICBhdXRvIF9lbWJlZGRpbmdfZGltX3Blcl9jaGFubmVsID0gX28tPmVtYmVkZGluZ19kaW1fcGVyX2NoYW5uZWwuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3IoX28tPmVtYmVkZGluZ19kaW1fcGVyX2NoYW5uZWwpIDogMDsKQEAgLTE0MTU0LDM5ICsxNzgyNiwzOSBAQAogICAgICAgX2VtYmVkZGluZ19kaW1fcGVyX2NoYW5uZWwpOwogfQogCi1pbmxpbmUgTFNIUHJvamVjdGlvbk9wdGlvbnNUICpMU0hQcm9qZWN0aW9uT3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBMU0hQcm9qZWN0aW9uT3B0aW9uc1QgKkxTSFByb2plY3Rpb25PcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8TFNIUHJvamVjdGlvbk9wdGlvbnNUPihuZXcgTFNIUHJvamVjdGlvbk9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgTFNIUHJvamVjdGlvbk9wdGlvbnM6OlVuUGFja1RvKExTSFByb2plY3Rpb25PcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIExTSFByb2plY3Rpb25PcHRpb25zOjpVblBhY2tUbyhMU0hQcm9qZWN0aW9uT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKICAgeyBhdXRvIF9lID0gdHlwZSgpOyBfby0+dHlwZSA9IF9lOyB9CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PExTSFByb2plY3Rpb25PcHRpb25zPiBMU0hQcm9qZWN0aW9uT3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IExTSFByb2plY3Rpb25PcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TFNIUHJvamVjdGlvbk9wdGlvbnM+IExTSFByb2plY3Rpb25PcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBMU0hQcm9qZWN0aW9uT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZUxTSFByb2plY3Rpb25PcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMU0hQcm9qZWN0aW9uT3B0aW9ucz4gQ3JlYXRlTFNIUHJvamVjdGlvbk9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBMU0hQcm9qZWN0aW9uT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PExTSFByb2plY3Rpb25PcHRpb25zPiBDcmVhdGVMU0hQcm9qZWN0aW9uT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTFNIUHJvamVjdGlvbk9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IExTSFByb2plY3Rpb25PcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IExTSFByb2plY3Rpb25PcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIGF1dG8gX3R5cGUgPSBfby0+dHlwZTsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlTFNIUHJvamVjdGlvbk9wdGlvbnMoCiAgICAgICBfZmJiLAogICAgICAgX3R5cGUpOwogfQogCi1pbmxpbmUgU1ZERk9wdGlvbnNUICpTVkRGT3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBTVkRGT3B0aW9uc1QgKlNWREZPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8U1ZERk9wdGlvbnNUPihuZXcgU1ZERk9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgU1ZERk9wdGlvbnM6OlVuUGFja1RvKFNWREZPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIFNWREZPcHRpb25zOjpVblBhY2tUbyhTVkRGT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKICAgeyBhdXRvIF9lID0gcmFuaygpOyBfby0+cmFuayA9IF9lOyB9CkBAIC0xNDE5NCwxNCArMTc4NjYsMTQgQEAKICAgeyBhdXRvIF9lID0gYXN5bW1ldHJpY19xdWFudGl6ZV9pbnB1dHMoKTsgX28tPmFzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzID0gX2U7IH0KIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U1ZERk9wdGlvbnM+IFNWREZPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU1ZERk9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTVkRGT3B0aW9ucz4gU1ZERk9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNWREZPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlU1ZERk9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNWREZPcHRpb25zPiBDcmVhdGVTVkRGT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNWREZPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U1ZERk9wdGlvbnM+IENyZWF0ZVNWREZPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTVkRGT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgU1ZERk9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgU1ZERk9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgYXV0byBfcmFuayA9IF9vLT5yYW5rOwogICBhdXRvIF9mdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uID0gX28tPmZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb247CiAgIGF1dG8gX2FzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzID0gX28tPmFzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzOwpAQCAtMTQyMTIsMjcgKzE3ODg0LDI3IEBACiAgICAgICBfYXN5bW1ldHJpY19xdWFudGl6ZV9pbnB1dHMpOwogfQogCi1pbmxpbmUgUk5OT3B0aW9uc1QgKlJOTk9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgUk5OT3B0aW9uc1QgKlJOTk9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxSTk5PcHRpb25zVD4obmV3IFJOTk9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgUk5OT3B0aW9uczo6VW5QYWNrVG8oUk5OT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBSTk5PcHRpb25zOjpVblBhY2tUbyhSTk5PcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogICB7IGF1dG8gX2UgPSBmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uKCk7IF9vLT5mdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uID0gX2U7IH0KICAgeyBhdXRvIF9lID0gYXN5bW1ldHJpY19xdWFudGl6ZV9pbnB1dHMoKTsgX28tPmFzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzID0gX2U7IH0KIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8Uk5OT3B0aW9ucz4gUk5OT3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJOTk9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSTk5PcHRpb25zPiBSTk5PcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBSTk5PcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlUk5OT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8Uk5OT3B0aW9ucz4gQ3JlYXRlUk5OT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJOTk9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSTk5PcHRpb25zPiBDcmVhdGVSTk5PcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBSTk5PcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBSTk5PcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFJOTk9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgYXV0byBfZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbiA9IF9vLT5mdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uOwogICBhdXRvIF9hc3ltbWV0cmljX3F1YW50aXplX2lucHV0cyA9IF9vLT5hc3ltbWV0cmljX3F1YW50aXplX2lucHV0czsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlUk5OT3B0aW9ucygKQEAgLTE0MjQxLDEzICsxNzkxMywxMyBAQAogICAgICAgX2FzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzKTsKIH0KIAotaW5saW5lIFNlcXVlbmNlUk5OT3B0aW9uc1QgKlNlcXVlbmNlUk5OT3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBTZXF1ZW5jZVJOTk9wdGlvbnNUICpTZXF1ZW5jZVJOTk9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxTZXF1ZW5jZVJOTk9wdGlvbnNUPihuZXcgU2VxdWVuY2VSTk5PcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIFNlcXVlbmNlUk5OT3B0aW9uczo6VW5QYWNrVG8oU2VxdWVuY2VSTk5PcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIFNlcXVlbmNlUk5OT3B0aW9uczo6VW5QYWNrVG8oU2VxdWVuY2VSTk5PcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogICB7IGF1dG8gX2UgPSB0aW1lX21ham9yKCk7IF9vLT50aW1lX21ham9yID0gX2U7IH0KQEAgLTE0MjU1LDE0ICsxNzkyNywxNCBAQAogICB7IGF1dG8gX2UgPSBhc3ltbWV0cmljX3F1YW50aXplX2lucHV0cygpOyBfby0+YXN5bW1ldHJpY19xdWFudGl6ZV9pbnB1dHMgPSBfZTsgfQogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTZXF1ZW5jZVJOTk9wdGlvbnM+IFNlcXVlbmNlUk5OT3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNlcXVlbmNlUk5OT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNlcXVlbmNlUk5OT3B0aW9ucz4gU2VxdWVuY2VSTk5PcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTZXF1ZW5jZVJOTk9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVTZXF1ZW5jZVJOTk9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNlcXVlbmNlUk5OT3B0aW9ucz4gQ3JlYXRlU2VxdWVuY2VSTk5PcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU2VxdWVuY2VSTk5PcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U2VxdWVuY2VSTk5PcHRpb25zPiBDcmVhdGVTZXF1ZW5jZVJOTk9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNlcXVlbmNlUk5OT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgU2VxdWVuY2VSTk5PcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFNlcXVlbmNlUk5OT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICBhdXRvIF90aW1lX21ham9yID0gX28tPnRpbWVfbWFqb3I7CiAgIGF1dG8gX2Z1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24gPSBfby0+ZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbjsKICAgYXV0byBfYXN5bW1ldHJpY19xdWFudGl6ZV9pbnB1dHMgPSBfby0+YXN5bW1ldHJpY19xdWFudGl6ZV9pbnB1dHM7CkBAIC0xNDI3MywxMyArMTc5NDUsMTMgQEAKICAgICAgIF9hc3ltbWV0cmljX3F1YW50aXplX2lucHV0cyk7CiB9CiAKLWlubGluZSBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zVCAqQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zVCAqQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnNUPihuZXcgQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zOjpVblBhY2tUbyhCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnM6OlVuUGFja1RvKEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiAgIHsgYXV0byBfZSA9IHRpbWVfbWFqb3IoKTsgX28tPnRpbWVfbWFqb3IgPSBfZTsgfQpAQCAtMTQyODgsMTQgKzE3OTYwLDE0IEBACiAgIHsgYXV0byBfZSA9IGFzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzKCk7IF9vLT5hc3ltbWV0cmljX3F1YW50aXplX2lucHV0cyA9IF9lOyB9CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnM+IEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9ucz4gQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZUJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnM+IENyZWF0ZUJpZGlyZWN0aW9uYWxTZXF1ZW5jZVJOTk9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9ucz4gQ3JlYXRlQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgQmlkaXJlY3Rpb25hbFNlcXVlbmNlUk5OT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBCaWRpcmVjdGlvbmFsU2VxdWVuY2VSTk5PcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIGF1dG8gX3RpbWVfbWFqb3IgPSBfby0+dGltZV9tYWpvcjsKICAgYXV0byBfZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbiA9IF9vLT5mdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uOwogICBhdXRvIF9tZXJnZV9vdXRwdXRzID0gX28tPm1lcmdlX291dHB1dHM7CkBAIC0xNDMwOCw4OCArMTc5ODAsOTEgQEAKICAgICAgIF9hc3ltbWV0cmljX3F1YW50aXplX2lucHV0cyk7CiB9CiAKLWlubGluZSBGdWxseUNvbm5lY3RlZE9wdGlvbnNUICpGdWxseUNvbm5lY3RlZE9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgRnVsbHlDb25uZWN0ZWRPcHRpb25zVCAqRnVsbHlDb25uZWN0ZWRPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8RnVsbHlDb25uZWN0ZWRPcHRpb25zVD4obmV3IEZ1bGx5Q29ubmVjdGVkT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBGdWxseUNvbm5lY3RlZE9wdGlvbnM6OlVuUGFja1RvKEZ1bGx5Q29ubmVjdGVkT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBGdWxseUNvbm5lY3RlZE9wdGlvbnM6OlVuUGFja1RvKEZ1bGx5Q29ubmVjdGVkT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKICAgeyBhdXRvIF9lID0gZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbigpOyBfby0+ZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbiA9IF9lOyB9CiAgIHsgYXV0byBfZSA9IHdlaWdodHNfZm9ybWF0KCk7IF9vLT53ZWlnaHRzX2Zvcm1hdCA9IF9lOyB9CiAgIHsgYXV0byBfZSA9IGtlZXBfbnVtX2RpbXMoKTsgX28tPmtlZXBfbnVtX2RpbXMgPSBfZTsgfQogICB7IGF1dG8gX2UgPSBhc3ltbWV0cmljX3F1YW50aXplX2lucHV0cygpOyBfby0+YXN5bW1ldHJpY19xdWFudGl6ZV9pbnB1dHMgPSBfZTsgfQorICB7IGF1dG8gX2UgPSBxdWFudGl6ZWRfYmlhc190eXBlKCk7IF9vLT5xdWFudGl6ZWRfYmlhc190eXBlID0gX2U7IH0KIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8RnVsbHlDb25uZWN0ZWRPcHRpb25zPiBGdWxseUNvbm5lY3RlZE9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBGdWxseUNvbm5lY3RlZE9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxGdWxseUNvbm5lY3RlZE9wdGlvbnM+IEZ1bGx5Q29ubmVjdGVkT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRnVsbHlDb25uZWN0ZWRPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlRnVsbHlDb25uZWN0ZWRPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxGdWxseUNvbm5lY3RlZE9wdGlvbnM+IENyZWF0ZUZ1bGx5Q29ubmVjdGVkT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEZ1bGx5Q29ubmVjdGVkT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEZ1bGx5Q29ubmVjdGVkT3B0aW9ucz4gQ3JlYXRlRnVsbHlDb25uZWN0ZWRPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBGdWxseUNvbm5lY3RlZE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IEZ1bGx5Q29ubmVjdGVkT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBGdWxseUNvbm5lY3RlZE9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgYXV0byBfZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbiA9IF9vLT5mdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uOwogICBhdXRvIF93ZWlnaHRzX2Zvcm1hdCA9IF9vLT53ZWlnaHRzX2Zvcm1hdDsKICAgYXV0byBfa2VlcF9udW1fZGltcyA9IF9vLT5rZWVwX251bV9kaW1zOwogICBhdXRvIF9hc3ltbWV0cmljX3F1YW50aXplX2lucHV0cyA9IF9vLT5hc3ltbWV0cmljX3F1YW50aXplX2lucHV0czsKKyAgYXV0byBfcXVhbnRpemVkX2JpYXNfdHlwZSA9IF9vLT5xdWFudGl6ZWRfYmlhc190eXBlOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVGdWxseUNvbm5lY3RlZE9wdGlvbnMoCiAgICAgICBfZmJiLAogICAgICAgX2Z1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24sCiAgICAgICBfd2VpZ2h0c19mb3JtYXQsCiAgICAgICBfa2VlcF9udW1fZGltcywKLSAgICAgIF9hc3ltbWV0cmljX3F1YW50aXplX2lucHV0cyk7CisgICAgICBfYXN5bW1ldHJpY19xdWFudGl6ZV9pbnB1dHMsCisgICAgICBfcXVhbnRpemVkX2JpYXNfdHlwZSk7CiB9CiAKLWlubGluZSBTb2Z0bWF4T3B0aW9uc1QgKlNvZnRtYXhPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIFNvZnRtYXhPcHRpb25zVCAqU29mdG1heE9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxTb2Z0bWF4T3B0aW9uc1Q+KG5ldyBTb2Z0bWF4T3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBTb2Z0bWF4T3B0aW9uczo6VW5QYWNrVG8oU29mdG1heE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgU29mdG1heE9wdGlvbnM6OlVuUGFja1RvKFNvZnRtYXhPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogICB7IGF1dG8gX2UgPSBiZXRhKCk7IF9vLT5iZXRhID0gX2U7IH0KIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U29mdG1heE9wdGlvbnM+IFNvZnRtYXhPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU29mdG1heE9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTb2Z0bWF4T3B0aW9ucz4gU29mdG1heE9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNvZnRtYXhPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlU29mdG1heE9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNvZnRtYXhPcHRpb25zPiBDcmVhdGVTb2Z0bWF4T3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNvZnRtYXhPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U29mdG1heE9wdGlvbnM+IENyZWF0ZVNvZnRtYXhPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTb2Z0bWF4T3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgU29mdG1heE9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgU29mdG1heE9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgYXV0byBfYmV0YSA9IF9vLT5iZXRhOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVTb2Z0bWF4T3B0aW9ucygKICAgICAgIF9mYmIsCiAgICAgICBfYmV0YSk7CiB9CiAKLWlubGluZSBDb25jYXRlbmF0aW9uT3B0aW9uc1QgKkNvbmNhdGVuYXRpb25PcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIENvbmNhdGVuYXRpb25PcHRpb25zVCAqQ29uY2F0ZW5hdGlvbk9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxDb25jYXRlbmF0aW9uT3B0aW9uc1Q+KG5ldyBDb25jYXRlbmF0aW9uT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBDb25jYXRlbmF0aW9uT3B0aW9uczo6VW5QYWNrVG8oQ29uY2F0ZW5hdGlvbk9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgQ29uY2F0ZW5hdGlvbk9wdGlvbnM6OlVuUGFja1RvKENvbmNhdGVuYXRpb25PcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogICB7IGF1dG8gX2UgPSBheGlzKCk7IF9vLT5heGlzID0gX2U7IH0KICAgeyBhdXRvIF9lID0gZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbigpOyBfby0+ZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbiA9IF9lOyB9CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PENvbmNhdGVuYXRpb25PcHRpb25zPiBDb25jYXRlbmF0aW9uT3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IENvbmNhdGVuYXRpb25PcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Q29uY2F0ZW5hdGlvbk9wdGlvbnM+IENvbmNhdGVuYXRpb25PcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBDb25jYXRlbmF0aW9uT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZUNvbmNhdGVuYXRpb25PcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDb25jYXRlbmF0aW9uT3B0aW9ucz4gQ3JlYXRlQ29uY2F0ZW5hdGlvbk9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBDb25jYXRlbmF0aW9uT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PENvbmNhdGVuYXRpb25PcHRpb25zPiBDcmVhdGVDb25jYXRlbmF0aW9uT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQ29uY2F0ZW5hdGlvbk9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IENvbmNhdGVuYXRpb25PcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IENvbmNhdGVuYXRpb25PcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIGF1dG8gX2F4aXMgPSBfby0+YXhpczsKICAgYXV0byBfZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbiA9IF9vLT5mdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVDb25jYXRlbmF0aW9uT3B0aW9ucygKQEAgLTE0Mzk4LDI3ICsxODA3MywyNyBAQAogICAgICAgX2Z1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24pOwogfQogCi1pbmxpbmUgQWRkT3B0aW9uc1QgKkFkZE9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgQWRkT3B0aW9uc1QgKkFkZE9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxBZGRPcHRpb25zVD4obmV3IEFkZE9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgQWRkT3B0aW9uczo6VW5QYWNrVG8oQWRkT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBBZGRPcHRpb25zOjpVblBhY2tUbyhBZGRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogICB7IGF1dG8gX2UgPSBmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uKCk7IF9vLT5mdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uID0gX2U7IH0KICAgeyBhdXRvIF9lID0gcG90X3NjYWxlX2ludDE2KCk7IF9vLT5wb3Rfc2NhbGVfaW50MTYgPSBfZTsgfQogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBZGRPcHRpb25zPiBBZGRPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQWRkT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEFkZE9wdGlvbnM+IEFkZE9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEFkZE9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVBZGRPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBZGRPcHRpb25zPiBDcmVhdGVBZGRPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQWRkT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEFkZE9wdGlvbnM+IENyZWF0ZUFkZE9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEFkZE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IEFkZE9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgQWRkT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICBhdXRvIF9mdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uID0gX28tPmZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb247CiAgIGF1dG8gX3BvdF9zY2FsZV9pbnQxNiA9IF9vLT5wb3Rfc2NhbGVfaW50MTY7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZUFkZE9wdGlvbnMoCkBAIC0xNDQyNyw2NSArMTgxMDIsNjUgQEAKICAgICAgIF9wb3Rfc2NhbGVfaW50MTYpOwogfQogCi1pbmxpbmUgTXVsT3B0aW9uc1QgKk11bE9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgTXVsT3B0aW9uc1QgKk11bE9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxNdWxPcHRpb25zVD4obmV3IE11bE9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgTXVsT3B0aW9uczo6VW5QYWNrVG8oTXVsT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBNdWxPcHRpb25zOjpVblBhY2tUbyhNdWxPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogICB7IGF1dG8gX2UgPSBmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uKCk7IF9vLT5mdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uID0gX2U7IH0KIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TXVsT3B0aW9ucz4gTXVsT3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE11bE9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNdWxPcHRpb25zPiBNdWxPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBNdWxPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlTXVsT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TXVsT3B0aW9ucz4gQ3JlYXRlTXVsT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE11bE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNdWxPcHRpb25zPiBDcmVhdGVNdWxPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBNdWxPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBNdWxPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IE11bE9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgYXV0byBfZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbiA9IF9vLT5mdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVNdWxPcHRpb25zKAogICAgICAgX2ZiYiwKICAgICAgIF9mdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uKTsKIH0KIAotaW5saW5lIEwyTm9ybU9wdGlvbnNUICpMMk5vcm1PcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIEwyTm9ybU9wdGlvbnNUICpMMk5vcm1PcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8TDJOb3JtT3B0aW9uc1Q+KG5ldyBMMk5vcm1PcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIEwyTm9ybU9wdGlvbnM6OlVuUGFja1RvKEwyTm9ybU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgTDJOb3JtT3B0aW9uczo6VW5QYWNrVG8oTDJOb3JtT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKICAgeyBhdXRvIF9lID0gZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbigpOyBfby0+ZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbiA9IF9lOyB9CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEwyTm9ybU9wdGlvbnM+IEwyTm9ybU9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBMMk5vcm1PcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TDJOb3JtT3B0aW9ucz4gTDJOb3JtT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTDJOb3JtT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZUwyTm9ybU9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEwyTm9ybU9wdGlvbnM+IENyZWF0ZUwyTm9ybU9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBMMk5vcm1PcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TDJOb3JtT3B0aW9ucz4gQ3JlYXRlTDJOb3JtT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTDJOb3JtT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgTDJOb3JtT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBMMk5vcm1PcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIGF1dG8gX2Z1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24gPSBfby0+ZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbjsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlTDJOb3JtT3B0aW9ucygKICAgICAgIF9mYmIsCiAgICAgICBfZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbik7CiB9CiAKLWlubGluZSBMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnNUICpMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zVCAqTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8TG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zVD4obmV3IExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnM6OlVuUGFja1RvKExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnM6OlVuUGFja1RvKExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKICAgeyBhdXRvIF9lID0gcmFkaXVzKCk7IF9vLT5yYWRpdXMgPSBfZTsgfQpAQCAtMTQ0OTQsMTQgKzE4MTY5LDE0IEBACiAgIHsgYXV0byBfZSA9IGJldGEoKTsgX28tPmJldGEgPSBfZTsgfQogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnM+IExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9ucz4gTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9ucz4gQ3JlYXRlTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zPiBDcmVhdGVMb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbk9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgTG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25PcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IExvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICBhdXRvIF9yYWRpdXMgPSBfby0+cmFkaXVzOwogICBhdXRvIF9iaWFzID0gX28tPmJpYXM7CiAgIGF1dG8gX2FscGhhID0gX28tPmFscGhhOwpAQCAtMTQ1MTQsMTMgKzE4MTg5LDEzIEBACiAgICAgICBfYmV0YSk7CiB9CiAKLWlubGluZSBMU1RNT3B0aW9uc1QgKkxTVE1PcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIExTVE1PcHRpb25zVCAqTFNUTU9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxMU1RNT3B0aW9uc1Q+KG5ldyBMU1RNT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBMU1RNT3B0aW9uczo6VW5QYWNrVG8oTFNUTU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgTFNUTU9wdGlvbnM6OlVuUGFja1RvKExTVE1PcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogICB7IGF1dG8gX2UgPSBmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uKCk7IF9vLT5mdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uID0gX2U7IH0KQEAgLTE0NTMwLDE0ICsxODIwNSwxNCBAQAogICB7IGF1dG8gX2UgPSBhc3ltbWV0cmljX3F1YW50aXplX2lucHV0cygpOyBfby0+YXN5bW1ldHJpY19xdWFudGl6ZV9pbnB1dHMgPSBfZTsgfQogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMU1RNT3B0aW9ucz4gTFNUTU9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBMU1RNT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PExTVE1PcHRpb25zPiBMU1RNT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTFNUTU9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVMU1RNT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TFNUTU9wdGlvbnM+IENyZWF0ZUxTVE1PcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTFNUTU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMU1RNT3B0aW9ucz4gQ3JlYXRlTFNUTU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IExTVE1PcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBMU1RNT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBMU1RNT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICBhdXRvIF9mdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uID0gX28tPmZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb247CiAgIGF1dG8gX2NlbGxfY2xpcCA9IF9vLT5jZWxsX2NsaXA7CiAgIGF1dG8gX3Byb2pfY2xpcCA9IF9vLT5wcm9qX2NsaXA7CkBAIC0xNDU1MiwxMyArMTgyMjcsMTMgQEAKICAgICAgIF9hc3ltbWV0cmljX3F1YW50aXplX2lucHV0cyk7CiB9CiAKLWlubGluZSBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNUICpVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zVCAqVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8VW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zVD4obmV3IFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnM6OlVuUGFja1RvKFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnM6OlVuUGFja1RvKFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKICAgeyBhdXRvIF9lID0gZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbigpOyBfby0+ZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbiA9IF9lOyB9CkBAIC0xNDU2OSwxNCArMTgyNDQsMTQgQEAKICAgeyBhdXRvIF9lID0gZGlhZ29uYWxfcmVjdXJyZW50X3RlbnNvcnMoKTsgX28tPmRpYWdvbmFsX3JlY3VycmVudF90ZW5zb3JzID0gX2U7IH0KIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8VW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zPiBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnM+IFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnM+IENyZWF0ZVVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9ucz4gQ3JlYXRlVW5pZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFVuaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBVbmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgYXV0byBfZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbiA9IF9vLT5mdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uOwogICBhdXRvIF9jZWxsX2NsaXAgPSBfby0+Y2VsbF9jbGlwOwogICBhdXRvIF9wcm9qX2NsaXAgPSBfby0+cHJval9jbGlwOwpAQCAtMTQ1OTMsMTMgKzE4MjY4LDEzIEBACiAgICAgICBfZGlhZ29uYWxfcmVjdXJyZW50X3RlbnNvcnMpOwogfQogCi1pbmxpbmUgQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNUICpCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc1QgKkJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8QmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNUPihuZXcgQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnM6OlVuUGFja1RvKEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zOjpVblBhY2tUbyhCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKICAgeyBhdXRvIF9lID0gZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbigpOyBfby0+ZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbiA9IF9lOyB9CkBAIC0xNDYxMCwxNCArMTgyODUsMTQgQEAKICAgeyBhdXRvIF9lID0gYXN5bW1ldHJpY19xdWFudGl6ZV9pbnB1dHMoKTsgX28tPmFzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzID0gX2U7IH0KIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8QmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnM+IEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9ucz4gQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zPiBDcmVhdGVCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnM+IENyZWF0ZUJpZGlyZWN0aW9uYWxTZXF1ZW5jZUxTVE1PcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBCaWRpcmVjdGlvbmFsU2VxdWVuY2VMU1RNT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgQmlkaXJlY3Rpb25hbFNlcXVlbmNlTFNUTU9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgYXV0byBfZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbiA9IF9vLT5mdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uOwogICBhdXRvIF9jZWxsX2NsaXAgPSBfby0+Y2VsbF9jbGlwOwogICBhdXRvIF9wcm9qX2NsaXAgPSBfby0+cHJval9jbGlwOwpAQCAtMTQ2MzQsMjcgKzE4MzA5LDI3IEBACiAgICAgICBfYXN5bW1ldHJpY19xdWFudGl6ZV9pbnB1dHMpOwogfQogCi1pbmxpbmUgUmVzaXplQmlsaW5lYXJPcHRpb25zVCAqUmVzaXplQmlsaW5lYXJPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIFJlc2l6ZUJpbGluZWFyT3B0aW9uc1QgKlJlc2l6ZUJpbGluZWFyT3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFJlc2l6ZUJpbGluZWFyT3B0aW9uc1Q+KG5ldyBSZXNpemVCaWxpbmVhck9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgUmVzaXplQmlsaW5lYXJPcHRpb25zOjpVblBhY2tUbyhSZXNpemVCaWxpbmVhck9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgUmVzaXplQmlsaW5lYXJPcHRpb25zOjpVblBhY2tUbyhSZXNpemVCaWxpbmVhck9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiAgIHsgYXV0byBfZSA9IGFsaWduX2Nvcm5lcnMoKTsgX28tPmFsaWduX2Nvcm5lcnMgPSBfZTsgfQogICB7IGF1dG8gX2UgPSBoYWxmX3BpeGVsX2NlbnRlcnMoKTsgX28tPmhhbGZfcGl4ZWxfY2VudGVycyA9IF9lOyB9CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFJlc2l6ZUJpbGluZWFyT3B0aW9ucz4gUmVzaXplQmlsaW5lYXJPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmVzaXplQmlsaW5lYXJPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UmVzaXplQmlsaW5lYXJPcHRpb25zPiBSZXNpemVCaWxpbmVhck9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJlc2l6ZUJpbGluZWFyT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZVJlc2l6ZUJpbGluZWFyT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8UmVzaXplQmlsaW5lYXJPcHRpb25zPiBDcmVhdGVSZXNpemVCaWxpbmVhck9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBSZXNpemVCaWxpbmVhck9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXNpemVCaWxpbmVhck9wdGlvbnM+IENyZWF0ZVJlc2l6ZUJpbGluZWFyT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmVzaXplQmlsaW5lYXJPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBSZXNpemVCaWxpbmVhck9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgUmVzaXplQmlsaW5lYXJPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIGF1dG8gX2FsaWduX2Nvcm5lcnMgPSBfby0+YWxpZ25fY29ybmVyczsKICAgYXV0byBfaGFsZl9waXhlbF9jZW50ZXJzID0gX28tPmhhbGZfcGl4ZWxfY2VudGVyczsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlUmVzaXplQmlsaW5lYXJPcHRpb25zKApAQCAtMTQ2NjMsMjcgKzE4MzM4LDI3IEBACiAgICAgICBfaGFsZl9waXhlbF9jZW50ZXJzKTsKIH0KIAotaW5saW5lIFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnNUICpSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnNUICpSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8UmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9uc1Q+KG5ldyBSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnM6OlVuUGFja1RvKFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgUmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9uczo6VW5QYWNrVG8oUmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKICAgeyBhdXRvIF9lID0gYWxpZ25fY29ybmVycygpOyBfby0+YWxpZ25fY29ybmVycyA9IF9lOyB9CiAgIHsgYXV0byBfZSA9IGhhbGZfcGl4ZWxfY2VudGVycygpOyBfby0+aGFsZl9waXhlbF9jZW50ZXJzID0gX2U7IH0KIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8UmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9ucz4gUmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zPiBSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlUmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8UmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9ucz4gQ3JlYXRlUmVzaXplTmVhcmVzdE5laWdoYm9yT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zPiBDcmVhdGVSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFJlc2l6ZU5lYXJlc3ROZWlnaGJvck9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgYXV0byBfYWxpZ25fY29ybmVycyA9IF9vLT5hbGlnbl9jb3JuZXJzOwogICBhdXRvIF9oYWxmX3BpeGVsX2NlbnRlcnMgPSBfby0+aGFsZl9waXhlbF9jZW50ZXJzOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVSZXNpemVOZWFyZXN0TmVpZ2hib3JPcHRpb25zKApAQCAtMTQ2OTIsMTU3ICsxODM2NywxNTcgQEAKICAgICAgIF9oYWxmX3BpeGVsX2NlbnRlcnMpOwogfQogCi1pbmxpbmUgQ2FsbE9wdGlvbnNUICpDYWxsT3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBDYWxsT3B0aW9uc1QgKkNhbGxPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8Q2FsbE9wdGlvbnNUPihuZXcgQ2FsbE9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgQ2FsbE9wdGlvbnM6OlVuUGFja1RvKENhbGxPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIENhbGxPcHRpb25zOjpVblBhY2tUbyhDYWxsT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKICAgeyBhdXRvIF9lID0gc3ViZ3JhcGgoKTsgX28tPnN1YmdyYXBoID0gX2U7IH0KIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8Q2FsbE9wdGlvbnM+IENhbGxPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQ2FsbE9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDYWxsT3B0aW9ucz4gQ2FsbE9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IENhbGxPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlQ2FsbE9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PENhbGxPcHRpb25zPiBDcmVhdGVDYWxsT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IENhbGxPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Q2FsbE9wdGlvbnM+IENyZWF0ZUNhbGxPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBDYWxsT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgQ2FsbE9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgQ2FsbE9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgYXV0byBfc3ViZ3JhcGggPSBfby0+c3ViZ3JhcGg7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZUNhbGxPcHRpb25zKAogICAgICAgX2ZiYiwKICAgICAgIF9zdWJncmFwaCk7CiB9CiAKLWlubGluZSBQYWRPcHRpb25zVCAqUGFkT3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBQYWRPcHRpb25zVCAqUGFkT3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFBhZE9wdGlvbnNUPihuZXcgUGFkT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBQYWRPcHRpb25zOjpVblBhY2tUbyhQYWRPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIFBhZE9wdGlvbnM6OlVuUGFja1RvKFBhZE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFBhZE9wdGlvbnM+IFBhZE9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBQYWRPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UGFkT3B0aW9ucz4gUGFkT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUGFkT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZVBhZE9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFBhZE9wdGlvbnM+IENyZWF0ZVBhZE9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBQYWRPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UGFkT3B0aW9ucz4gQ3JlYXRlUGFkT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUGFkT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgUGFkT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBQYWRPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZVBhZE9wdGlvbnMoCiAgICAgICBfZmJiKTsKIH0KIAotaW5saW5lIFBhZFYyT3B0aW9uc1QgKlBhZFYyT3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBQYWRWMk9wdGlvbnNUICpQYWRWMk9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxQYWRWMk9wdGlvbnNUPihuZXcgUGFkVjJPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIFBhZFYyT3B0aW9uczo6VW5QYWNrVG8oUGFkVjJPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIFBhZFYyT3B0aW9uczo6VW5QYWNrVG8oUGFkVjJPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxQYWRWMk9wdGlvbnM+IFBhZFYyT3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFBhZFYyT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFBhZFYyT3B0aW9ucz4gUGFkVjJPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBQYWRWMk9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVQYWRWMk9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFBhZFYyT3B0aW9ucz4gQ3JlYXRlUGFkVjJPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUGFkVjJPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UGFkVjJPcHRpb25zPiBDcmVhdGVQYWRWMk9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFBhZFYyT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgUGFkVjJPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFBhZFYyT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVQYWRWMk9wdGlvbnMoCiAgICAgICBfZmJiKTsKIH0KIAotaW5saW5lIFJlc2hhcGVPcHRpb25zVCAqUmVzaGFwZU9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgUmVzaGFwZU9wdGlvbnNUICpSZXNoYXBlT3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFJlc2hhcGVPcHRpb25zVD4obmV3IFJlc2hhcGVPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIFJlc2hhcGVPcHRpb25zOjpVblBhY2tUbyhSZXNoYXBlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBSZXNoYXBlT3B0aW9uczo6VW5QYWNrVG8oUmVzaGFwZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7Ci0gIHsgYXV0byBfZSA9IG5ld19zaGFwZSgpOyBpZiAoX2UpIHsgX28tPm5ld19zaGFwZS5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+bmV3X3NoYXBlW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gfQorICB7IGF1dG8gX2UgPSBuZXdfc2hhcGUoKTsgaWYgKF9lKSB7IF9vLT5uZXdfc2hhcGUucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+bmV3X3NoYXBlW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT5uZXdfc2hhcGUucmVzaXplKDApOyB9IH0KIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8UmVzaGFwZU9wdGlvbnM+IFJlc2hhcGVPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmVzaGFwZU9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXNoYXBlT3B0aW9ucz4gUmVzaGFwZU9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJlc2hhcGVPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlUmVzaGFwZU9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFJlc2hhcGVPcHRpb25zPiBDcmVhdGVSZXNoYXBlT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJlc2hhcGVPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UmVzaGFwZU9wdGlvbnM+IENyZWF0ZVJlc2hhcGVPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBSZXNoYXBlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgUmVzaGFwZU9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgUmVzaGFwZU9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgYXV0byBfbmV3X3NoYXBlID0gX28tPm5ld19zaGFwZS5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcihfby0+bmV3X3NoYXBlKSA6IDA7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZVJlc2hhcGVPcHRpb25zKAogICAgICAgX2ZiYiwKICAgICAgIF9uZXdfc2hhcGUpOwogfQogCi1pbmxpbmUgU3BhY2VUb0JhdGNoTkRPcHRpb25zVCAqU3BhY2VUb0JhdGNoTkRPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIFNwYWNlVG9CYXRjaE5ET3B0aW9uc1QgKlNwYWNlVG9CYXRjaE5ET3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFNwYWNlVG9CYXRjaE5ET3B0aW9uc1Q+KG5ldyBTcGFjZVRvQmF0Y2hORE9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgU3BhY2VUb0JhdGNoTkRPcHRpb25zOjpVblBhY2tUbyhTcGFjZVRvQmF0Y2hORE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgU3BhY2VUb0JhdGNoTkRPcHRpb25zOjpVblBhY2tUbyhTcGFjZVRvQmF0Y2hORE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNwYWNlVG9CYXRjaE5ET3B0aW9ucz4gU3BhY2VUb0JhdGNoTkRPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3BhY2VUb0JhdGNoTkRPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3BhY2VUb0JhdGNoTkRPcHRpb25zPiBTcGFjZVRvQmF0Y2hORE9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNwYWNlVG9CYXRjaE5ET3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZVNwYWNlVG9CYXRjaE5ET3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3BhY2VUb0JhdGNoTkRPcHRpb25zPiBDcmVhdGVTcGFjZVRvQmF0Y2hORE9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTcGFjZVRvQmF0Y2hORE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcGFjZVRvQmF0Y2hORE9wdGlvbnM+IENyZWF0ZVNwYWNlVG9CYXRjaE5ET3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3BhY2VUb0JhdGNoTkRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBTcGFjZVRvQmF0Y2hORE9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgU3BhY2VUb0JhdGNoTkRPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZVNwYWNlVG9CYXRjaE5ET3B0aW9ucygKICAgICAgIF9mYmIpOwogfQogCi1pbmxpbmUgQmF0Y2hUb1NwYWNlTkRPcHRpb25zVCAqQmF0Y2hUb1NwYWNlTkRPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIEJhdGNoVG9TcGFjZU5ET3B0aW9uc1QgKkJhdGNoVG9TcGFjZU5ET3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPEJhdGNoVG9TcGFjZU5ET3B0aW9uc1Q+KG5ldyBCYXRjaFRvU3BhY2VORE9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgQmF0Y2hUb1NwYWNlTkRPcHRpb25zOjpVblBhY2tUbyhCYXRjaFRvU3BhY2VORE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgQmF0Y2hUb1NwYWNlTkRPcHRpb25zOjpVblBhY2tUbyhCYXRjaFRvU3BhY2VORE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEJhdGNoVG9TcGFjZU5ET3B0aW9ucz4gQmF0Y2hUb1NwYWNlTkRPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQmF0Y2hUb1NwYWNlTkRPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QmF0Y2hUb1NwYWNlTkRPcHRpb25zPiBCYXRjaFRvU3BhY2VORE9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEJhdGNoVG9TcGFjZU5ET3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZUJhdGNoVG9TcGFjZU5ET3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8QmF0Y2hUb1NwYWNlTkRPcHRpb25zPiBDcmVhdGVCYXRjaFRvU3BhY2VORE9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBCYXRjaFRvU3BhY2VORE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCYXRjaFRvU3BhY2VORE9wdGlvbnM+IENyZWF0ZUJhdGNoVG9TcGFjZU5ET3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQmF0Y2hUb1NwYWNlTkRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBCYXRjaFRvU3BhY2VORE9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgQmF0Y2hUb1NwYWNlTkRPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZUJhdGNoVG9TcGFjZU5ET3B0aW9ucygKICAgICAgIF9mYmIpOwogfQogCi1pbmxpbmUgU2tpcEdyYW1PcHRpb25zVCAqU2tpcEdyYW1PcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIFNraXBHcmFtT3B0aW9uc1QgKlNraXBHcmFtT3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFNraXBHcmFtT3B0aW9uc1Q+KG5ldyBTa2lwR3JhbU9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgU2tpcEdyYW1PcHRpb25zOjpVblBhY2tUbyhTa2lwR3JhbU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgU2tpcEdyYW1PcHRpb25zOjpVblBhY2tUbyhTa2lwR3JhbU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiAgIHsgYXV0byBfZSA9IG5ncmFtX3NpemUoKTsgX28tPm5ncmFtX3NpemUgPSBfZTsgfQpAQCAtMTQ4NTAsMTQgKzE4NTI1LDE0IEBACiAgIHsgYXV0byBfZSA9IGluY2x1ZGVfYWxsX25ncmFtcygpOyBfby0+aW5jbHVkZV9hbGxfbmdyYW1zID0gX2U7IH0KIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U2tpcEdyYW1PcHRpb25zPiBTa2lwR3JhbU9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTa2lwR3JhbU9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTa2lwR3JhbU9wdGlvbnM+IFNraXBHcmFtT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU2tpcEdyYW1PcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlU2tpcEdyYW1PcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTa2lwR3JhbU9wdGlvbnM+IENyZWF0ZVNraXBHcmFtT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNraXBHcmFtT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNraXBHcmFtT3B0aW9ucz4gQ3JlYXRlU2tpcEdyYW1PcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTa2lwR3JhbU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFNraXBHcmFtT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBTa2lwR3JhbU9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgYXV0byBfbmdyYW1fc2l6ZSA9IF9vLT5uZ3JhbV9zaXplOwogICBhdXRvIF9tYXhfc2tpcF9zaXplID0gX28tPm1heF9za2lwX3NpemU7CiAgIGF1dG8gX2luY2x1ZGVfYWxsX25ncmFtcyA9IF9vLT5pbmNsdWRlX2FsbF9uZ3JhbXM7CkBAIC0xNDg2OCw3OSArMTg1NDMsNzkgQEAKICAgICAgIF9pbmNsdWRlX2FsbF9uZ3JhbXMpOwogfQogCi1pbmxpbmUgU3BhY2VUb0RlcHRoT3B0aW9uc1QgKlNwYWNlVG9EZXB0aE9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgU3BhY2VUb0RlcHRoT3B0aW9uc1QgKlNwYWNlVG9EZXB0aE9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxTcGFjZVRvRGVwdGhPcHRpb25zVD4obmV3IFNwYWNlVG9EZXB0aE9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgU3BhY2VUb0RlcHRoT3B0aW9uczo6VW5QYWNrVG8oU3BhY2VUb0RlcHRoT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBTcGFjZVRvRGVwdGhPcHRpb25zOjpVblBhY2tUbyhTcGFjZVRvRGVwdGhPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogICB7IGF1dG8gX2UgPSBibG9ja19zaXplKCk7IF9vLT5ibG9ja19zaXplID0gX2U7IH0KIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3BhY2VUb0RlcHRoT3B0aW9ucz4gU3BhY2VUb0RlcHRoT3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNwYWNlVG9EZXB0aE9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcGFjZVRvRGVwdGhPcHRpb25zPiBTcGFjZVRvRGVwdGhPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTcGFjZVRvRGVwdGhPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlU3BhY2VUb0RlcHRoT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3BhY2VUb0RlcHRoT3B0aW9ucz4gQ3JlYXRlU3BhY2VUb0RlcHRoT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNwYWNlVG9EZXB0aE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcGFjZVRvRGVwdGhPcHRpb25zPiBDcmVhdGVTcGFjZVRvRGVwdGhPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTcGFjZVRvRGVwdGhPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBTcGFjZVRvRGVwdGhPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFNwYWNlVG9EZXB0aE9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgYXV0byBfYmxvY2tfc2l6ZSA9IF9vLT5ibG9ja19zaXplOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVTcGFjZVRvRGVwdGhPcHRpb25zKAogICAgICAgX2ZiYiwKICAgICAgIF9ibG9ja19zaXplKTsKIH0KIAotaW5saW5lIERlcHRoVG9TcGFjZU9wdGlvbnNUICpEZXB0aFRvU3BhY2VPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIERlcHRoVG9TcGFjZU9wdGlvbnNUICpEZXB0aFRvU3BhY2VPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8RGVwdGhUb1NwYWNlT3B0aW9uc1Q+KG5ldyBEZXB0aFRvU3BhY2VPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIERlcHRoVG9TcGFjZU9wdGlvbnM6OlVuUGFja1RvKERlcHRoVG9TcGFjZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgRGVwdGhUb1NwYWNlT3B0aW9uczo6VW5QYWNrVG8oRGVwdGhUb1NwYWNlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKICAgeyBhdXRvIF9lID0gYmxvY2tfc2l6ZSgpOyBfby0+YmxvY2tfc2l6ZSA9IF9lOyB9CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PERlcHRoVG9TcGFjZU9wdGlvbnM+IERlcHRoVG9TcGFjZU9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBEZXB0aFRvU3BhY2VPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8RGVwdGhUb1NwYWNlT3B0aW9ucz4gRGVwdGhUb1NwYWNlT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRGVwdGhUb1NwYWNlT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZURlcHRoVG9TcGFjZU9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PERlcHRoVG9TcGFjZU9wdGlvbnM+IENyZWF0ZURlcHRoVG9TcGFjZU9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBEZXB0aFRvU3BhY2VPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8RGVwdGhUb1NwYWNlT3B0aW9ucz4gQ3JlYXRlRGVwdGhUb1NwYWNlT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRGVwdGhUb1NwYWNlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgRGVwdGhUb1NwYWNlT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBEZXB0aFRvU3BhY2VPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIGF1dG8gX2Jsb2NrX3NpemUgPSBfby0+YmxvY2tfc2l6ZTsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlRGVwdGhUb1NwYWNlT3B0aW9ucygKICAgICAgIF9mYmIsCiAgICAgICBfYmxvY2tfc2l6ZSk7CiB9CiAKLWlubGluZSBTdWJPcHRpb25zVCAqU3ViT3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBTdWJPcHRpb25zVCAqU3ViT3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFN1Yk9wdGlvbnNUPihuZXcgU3ViT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBTdWJPcHRpb25zOjpVblBhY2tUbyhTdWJPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIFN1Yk9wdGlvbnM6OlVuUGFja1RvKFN1Yk9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiAgIHsgYXV0byBfZSA9IGZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24oKTsgX28tPmZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24gPSBfZTsgfQogICB7IGF1dG8gX2UgPSBwb3Rfc2NhbGVfaW50MTYoKTsgX28tPnBvdF9zY2FsZV9pbnQxNiA9IF9lOyB9CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFN1Yk9wdGlvbnM+IFN1Yk9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTdWJPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3ViT3B0aW9ucz4gU3ViT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3ViT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZVN1Yk9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFN1Yk9wdGlvbnM+IENyZWF0ZVN1Yk9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTdWJPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3ViT3B0aW9ucz4gQ3JlYXRlU3ViT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3ViT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgU3ViT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBTdWJPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIGF1dG8gX2Z1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24gPSBfby0+ZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbjsKICAgYXV0byBfcG90X3NjYWxlX2ludDE2ID0gX28tPnBvdF9zY2FsZV9pbnQxNjsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlU3ViT3B0aW9ucygKQEAgLTE0OTQ5LDEwMiArMTg2MjQsMTAyIEBACiAgICAgICBfcG90X3NjYWxlX2ludDE2KTsKIH0KIAotaW5saW5lIERpdk9wdGlvbnNUICpEaXZPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIERpdk9wdGlvbnNUICpEaXZPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8RGl2T3B0aW9uc1Q+KG5ldyBEaXZPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIERpdk9wdGlvbnM6OlVuUGFja1RvKERpdk9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgRGl2T3B0aW9uczo6VW5QYWNrVG8oRGl2T3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKICAgeyBhdXRvIF9lID0gZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbigpOyBfby0+ZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbiA9IF9lOyB9CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PERpdk9wdGlvbnM+IERpdk9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBEaXZPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8RGl2T3B0aW9ucz4gRGl2T3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRGl2T3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZURpdk9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PERpdk9wdGlvbnM+IENyZWF0ZURpdk9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBEaXZPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8RGl2T3B0aW9ucz4gQ3JlYXRlRGl2T3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRGl2T3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgRGl2T3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBEaXZPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIGF1dG8gX2Z1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb24gPSBfby0+ZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbjsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlRGl2T3B0aW9ucygKICAgICAgIF9mYmIsCiAgICAgICBfZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbik7CiB9CiAKLWlubGluZSBUb3BLVjJPcHRpb25zVCAqVG9wS1YyT3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBUb3BLVjJPcHRpb25zVCAqVG9wS1YyT3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFRvcEtWMk9wdGlvbnNUPihuZXcgVG9wS1YyT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBUb3BLVjJPcHRpb25zOjpVblBhY2tUbyhUb3BLVjJPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIFRvcEtWMk9wdGlvbnM6OlVuUGFja1RvKFRvcEtWMk9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFRvcEtWMk9wdGlvbnM+IFRvcEtWMk9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBUb3BLVjJPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VG9wS1YyT3B0aW9ucz4gVG9wS1YyT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVG9wS1YyT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZVRvcEtWMk9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFRvcEtWMk9wdGlvbnM+IENyZWF0ZVRvcEtWMk9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBUb3BLVjJPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VG9wS1YyT3B0aW9ucz4gQ3JlYXRlVG9wS1YyT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVG9wS1YyT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgVG9wS1YyT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBUb3BLVjJPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZVRvcEtWMk9wdGlvbnMoCiAgICAgICBfZmJiKTsKIH0KIAotaW5saW5lIEVtYmVkZGluZ0xvb2t1cFNwYXJzZU9wdGlvbnNUICpFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIEVtYmVkZGluZ0xvb2t1cFNwYXJzZU9wdGlvbnNUICpFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8RW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9uc1Q+KG5ldyBFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIEVtYmVkZGluZ0xvb2t1cFNwYXJzZU9wdGlvbnM6OlVuUGFja1RvKEVtYmVkZGluZ0xvb2t1cFNwYXJzZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgRW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9uczo6VW5QYWNrVG8oRW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKICAgeyBhdXRvIF9lID0gY29tYmluZXIoKTsgX28tPmNvbWJpbmVyID0gX2U7IH0KIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8RW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9ucz4gRW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEVtYmVkZGluZ0xvb2t1cFNwYXJzZU9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zPiBFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlRW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8RW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9ucz4gQ3JlYXRlRW1iZWRkaW5nTG9va3VwU3BhcnNlT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEVtYmVkZGluZ0xvb2t1cFNwYXJzZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zPiBDcmVhdGVFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBFbWJlZGRpbmdMb29rdXBTcGFyc2VPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IEVtYmVkZGluZ0xvb2t1cFNwYXJzZU9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgYXV0byBfY29tYmluZXIgPSBfby0+Y29tYmluZXI7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZUVtYmVkZGluZ0xvb2t1cFNwYXJzZU9wdGlvbnMoCiAgICAgICBfZmJiLAogICAgICAgX2NvbWJpbmVyKTsKIH0KIAotaW5saW5lIEdhdGhlck9wdGlvbnNUICpHYXRoZXJPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIEdhdGhlck9wdGlvbnNUICpHYXRoZXJPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8R2F0aGVyT3B0aW9uc1Q+KG5ldyBHYXRoZXJPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIEdhdGhlck9wdGlvbnM6OlVuUGFja1RvKEdhdGhlck9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgR2F0aGVyT3B0aW9uczo6VW5QYWNrVG8oR2F0aGVyT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKICAgeyBhdXRvIF9lID0gYXhpcygpOyBfby0+YXhpcyA9IF9lOyB9CiAgIHsgYXV0byBfZSA9IGJhdGNoX2RpbXMoKTsgX28tPmJhdGNoX2RpbXMgPSBfZTsgfQogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxHYXRoZXJPcHRpb25zPiBHYXRoZXJPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgR2F0aGVyT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEdhdGhlck9wdGlvbnM+IEdhdGhlck9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEdhdGhlck9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVHYXRoZXJPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxHYXRoZXJPcHRpb25zPiBDcmVhdGVHYXRoZXJPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgR2F0aGVyT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEdhdGhlck9wdGlvbnM+IENyZWF0ZUdhdGhlck9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEdhdGhlck9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IEdhdGhlck9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgR2F0aGVyT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICBhdXRvIF9heGlzID0gX28tPmF4aXM7CiAgIGF1dG8gX2JhdGNoX2RpbXMgPSBfby0+YmF0Y2hfZGltczsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlR2F0aGVyT3B0aW9ucygKQEAgLTE1MDUzLDE4NiArMTg3MjgsMTg2IEBACiAgICAgICBfYmF0Y2hfZGltcyk7CiB9CiAKLWlubGluZSBUcmFuc3Bvc2VPcHRpb25zVCAqVHJhbnNwb3NlT3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBUcmFuc3Bvc2VPcHRpb25zVCAqVHJhbnNwb3NlT3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFRyYW5zcG9zZU9wdGlvbnNUPihuZXcgVHJhbnNwb3NlT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBUcmFuc3Bvc2VPcHRpb25zOjpVblBhY2tUbyhUcmFuc3Bvc2VPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIFRyYW5zcG9zZU9wdGlvbnM6OlVuUGFja1RvKFRyYW5zcG9zZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFRyYW5zcG9zZU9wdGlvbnM+IFRyYW5zcG9zZU9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBUcmFuc3Bvc2VPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VHJhbnNwb3NlT3B0aW9ucz4gVHJhbnNwb3NlT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVHJhbnNwb3NlT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZVRyYW5zcG9zZU9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFRyYW5zcG9zZU9wdGlvbnM+IENyZWF0ZVRyYW5zcG9zZU9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBUcmFuc3Bvc2VPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VHJhbnNwb3NlT3B0aW9ucz4gQ3JlYXRlVHJhbnNwb3NlT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVHJhbnNwb3NlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgVHJhbnNwb3NlT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBUcmFuc3Bvc2VPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZVRyYW5zcG9zZU9wdGlvbnMoCiAgICAgICBfZmJiKTsKIH0KIAotaW5saW5lIEV4cE9wdGlvbnNUICpFeHBPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIEV4cE9wdGlvbnNUICpFeHBPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8RXhwT3B0aW9uc1Q+KG5ldyBFeHBPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIEV4cE9wdGlvbnM6OlVuUGFja1RvKEV4cE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgRXhwT3B0aW9uczo6VW5QYWNrVG8oRXhwT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8RXhwT3B0aW9ucz4gRXhwT3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEV4cE9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxFeHBPcHRpb25zPiBFeHBPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBFeHBPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlRXhwT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8RXhwT3B0aW9ucz4gQ3JlYXRlRXhwT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEV4cE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxFeHBPcHRpb25zPiBDcmVhdGVFeHBPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBFeHBPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBFeHBPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IEV4cE9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlRXhwT3B0aW9ucygKICAgICAgIF9mYmIpOwogfQogCi1pbmxpbmUgQ29zT3B0aW9uc1QgKkNvc09wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgQ29zT3B0aW9uc1QgKkNvc09wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxDb3NPcHRpb25zVD4obmV3IENvc09wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgQ29zT3B0aW9uczo6VW5QYWNrVG8oQ29zT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBDb3NPcHRpb25zOjpVblBhY2tUbyhDb3NPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDb3NPcHRpb25zPiBDb3NPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQ29zT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PENvc09wdGlvbnM+IENvc09wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IENvc09wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVDb3NPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDb3NPcHRpb25zPiBDcmVhdGVDb3NPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQ29zT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PENvc09wdGlvbnM+IENyZWF0ZUNvc09wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IENvc09wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IENvc09wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgQ29zT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVDb3NPcHRpb25zKAogICAgICAgX2ZiYik7CiB9CiAKLWlubGluZSBSZWR1Y2VyT3B0aW9uc1QgKlJlZHVjZXJPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIFJlZHVjZXJPcHRpb25zVCAqUmVkdWNlck9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxSZWR1Y2VyT3B0aW9uc1Q+KG5ldyBSZWR1Y2VyT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBSZWR1Y2VyT3B0aW9uczo6VW5QYWNrVG8oUmVkdWNlck9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgUmVkdWNlck9wdGlvbnM6OlVuUGFja1RvKFJlZHVjZXJPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogICB7IGF1dG8gX2UgPSBrZWVwX2RpbXMoKTsgX28tPmtlZXBfZGltcyA9IF9lOyB9CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFJlZHVjZXJPcHRpb25zPiBSZWR1Y2VyT3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJlZHVjZXJPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UmVkdWNlck9wdGlvbnM+IFJlZHVjZXJPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBSZWR1Y2VyT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZVJlZHVjZXJPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZWR1Y2VyT3B0aW9ucz4gQ3JlYXRlUmVkdWNlck9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBSZWR1Y2VyT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJlZHVjZXJPcHRpb25zPiBDcmVhdGVSZWR1Y2VyT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmVkdWNlck9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFJlZHVjZXJPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFJlZHVjZXJPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIGF1dG8gX2tlZXBfZGltcyA9IF9vLT5rZWVwX2RpbXM7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZVJlZHVjZXJPcHRpb25zKAogICAgICAgX2ZiYiwKICAgICAgIF9rZWVwX2RpbXMpOwogfQogCi1pbmxpbmUgU3F1ZWV6ZU9wdGlvbnNUICpTcXVlZXplT3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBTcXVlZXplT3B0aW9uc1QgKlNxdWVlemVPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8U3F1ZWV6ZU9wdGlvbnNUPihuZXcgU3F1ZWV6ZU9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgU3F1ZWV6ZU9wdGlvbnM6OlVuUGFja1RvKFNxdWVlemVPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIFNxdWVlemVPcHRpb25zOjpVblBhY2tUbyhTcXVlZXplT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKLSAgeyBhdXRvIF9lID0gc3F1ZWV6ZV9kaW1zKCk7IGlmIChfZSkgeyBfby0+c3F1ZWV6ZV9kaW1zLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5zcXVlZXplX2RpbXNbX2ldID0gX2UtPkdldChfaSk7IH0gfSB9CisgIHsgYXV0byBfZSA9IHNxdWVlemVfZGltcygpOyBpZiAoX2UpIHsgX28tPnNxdWVlemVfZGltcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5zcXVlZXplX2RpbXNbX2ldID0gX2UtPkdldChfaSk7IH0gfSBlbHNlIHsgX28tPnNxdWVlemVfZGltcy5yZXNpemUoMCk7IH0gfQogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcXVlZXplT3B0aW9ucz4gU3F1ZWV6ZU9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTcXVlZXplT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNxdWVlemVPcHRpb25zPiBTcXVlZXplT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3F1ZWV6ZU9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVTcXVlZXplT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3F1ZWV6ZU9wdGlvbnM+IENyZWF0ZVNxdWVlemVPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3F1ZWV6ZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcXVlZXplT3B0aW9ucz4gQ3JlYXRlU3F1ZWV6ZU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNxdWVlemVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBTcXVlZXplT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBTcXVlZXplT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICBhdXRvIF9zcXVlZXplX2RpbXMgPSBfby0+c3F1ZWV6ZV9kaW1zLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT5zcXVlZXplX2RpbXMpIDogMDsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlU3F1ZWV6ZU9wdGlvbnMoCiAgICAgICBfZmJiLAogICAgICAgX3NxdWVlemVfZGltcyk7CiB9CiAKLWlubGluZSBTcGxpdE9wdGlvbnNUICpTcGxpdE9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgU3BsaXRPcHRpb25zVCAqU3BsaXRPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8U3BsaXRPcHRpb25zVD4obmV3IFNwbGl0T3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBTcGxpdE9wdGlvbnM6OlVuUGFja1RvKFNwbGl0T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBTcGxpdE9wdGlvbnM6OlVuUGFja1RvKFNwbGl0T3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKICAgeyBhdXRvIF9lID0gbnVtX3NwbGl0cygpOyBfby0+bnVtX3NwbGl0cyA9IF9lOyB9CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNwbGl0T3B0aW9ucz4gU3BsaXRPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3BsaXRPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3BsaXRPcHRpb25zPiBTcGxpdE9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNwbGl0T3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZVNwbGl0T3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3BsaXRPcHRpb25zPiBDcmVhdGVTcGxpdE9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTcGxpdE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcGxpdE9wdGlvbnM+IENyZWF0ZVNwbGl0T3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3BsaXRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBTcGxpdE9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgU3BsaXRPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIGF1dG8gX251bV9zcGxpdHMgPSBfby0+bnVtX3NwbGl0czsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlU3BsaXRPcHRpb25zKAogICAgICAgX2ZiYiwKICAgICAgIF9udW1fc3BsaXRzKTsKIH0KIAotaW5saW5lIFNwbGl0Vk9wdGlvbnNUICpTcGxpdFZPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIFNwbGl0Vk9wdGlvbnNUICpTcGxpdFZPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8U3BsaXRWT3B0aW9uc1Q+KG5ldyBTcGxpdFZPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIFNwbGl0Vk9wdGlvbnM6OlVuUGFja1RvKFNwbGl0Vk9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgU3BsaXRWT3B0aW9uczo6VW5QYWNrVG8oU3BsaXRWT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKICAgeyBhdXRvIF9lID0gbnVtX3NwbGl0cygpOyBfby0+bnVtX3NwbGl0cyA9IF9lOyB9CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNwbGl0Vk9wdGlvbnM+IFNwbGl0Vk9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTcGxpdFZPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3BsaXRWT3B0aW9ucz4gU3BsaXRWT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3BsaXRWT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZVNwbGl0Vk9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNwbGl0Vk9wdGlvbnM+IENyZWF0ZVNwbGl0Vk9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTcGxpdFZPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3BsaXRWT3B0aW9ucz4gQ3JlYXRlU3BsaXRWT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3BsaXRWT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgU3BsaXRWT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBTcGxpdFZPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIGF1dG8gX251bV9zcGxpdHMgPSBfby0+bnVtX3NwbGl0czsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlU3BsaXRWT3B0aW9ucygKICAgICAgIF9mYmIsCiAgICAgICBfbnVtX3NwbGl0cyk7CiB9CiAKLWlubGluZSBTdHJpZGVkU2xpY2VPcHRpb25zVCAqU3RyaWRlZFNsaWNlT3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBTdHJpZGVkU2xpY2VPcHRpb25zVCAqU3RyaWRlZFNsaWNlT3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFN0cmlkZWRTbGljZU9wdGlvbnNUPihuZXcgU3RyaWRlZFNsaWNlT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBTdHJpZGVkU2xpY2VPcHRpb25zOjpVblBhY2tUbyhTdHJpZGVkU2xpY2VPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIFN0cmlkZWRTbGljZU9wdGlvbnM6OlVuUGFja1RvKFN0cmlkZWRTbGljZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiAgIHsgYXV0byBfZSA9IGJlZ2luX21hc2soKTsgX28tPmJlZ2luX21hc2sgPSBfZTsgfQpAQCAtMTUyNDMsMTQgKzE4OTE4LDE0IEBACiAgIHsgYXV0byBfZSA9IG9mZnNldCgpOyBfby0+b2Zmc2V0ID0gX2U7IH0KIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3RyaWRlZFNsaWNlT3B0aW9ucz4gU3RyaWRlZFNsaWNlT3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN0cmlkZWRTbGljZU9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdHJpZGVkU2xpY2VPcHRpb25zPiBTdHJpZGVkU2xpY2VPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTdHJpZGVkU2xpY2VPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlU3RyaWRlZFNsaWNlT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3RyaWRlZFNsaWNlT3B0aW9ucz4gQ3JlYXRlU3RyaWRlZFNsaWNlT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN0cmlkZWRTbGljZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdHJpZGVkU2xpY2VPcHRpb25zPiBDcmVhdGVTdHJpZGVkU2xpY2VPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTdHJpZGVkU2xpY2VPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBTdHJpZGVkU2xpY2VPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFN0cmlkZWRTbGljZU9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgYXV0byBfYmVnaW5fbWFzayA9IF9vLT5iZWdpbl9tYXNrOwogICBhdXRvIF9lbmRfbWFzayA9IF9vLT5lbmRfbWFzazsKICAgYXV0byBfZWxsaXBzaXNfbWFzayA9IF9vLT5lbGxpcHNpc19tYXNrOwpAQCAtMTUyNjcsNTAgKzE4OTQyLDUwIEBACiAgICAgICBfb2Zmc2V0KTsKIH0KIAotaW5saW5lIExvZ1NvZnRtYXhPcHRpb25zVCAqTG9nU29mdG1heE9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgTG9nU29mdG1heE9wdGlvbnNUICpMb2dTb2Z0bWF4T3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPExvZ1NvZnRtYXhPcHRpb25zVD4obmV3IExvZ1NvZnRtYXhPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIExvZ1NvZnRtYXhPcHRpb25zOjpVblBhY2tUbyhMb2dTb2Z0bWF4T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBMb2dTb2Z0bWF4T3B0aW9uczo6VW5QYWNrVG8oTG9nU29mdG1heE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PExvZ1NvZnRtYXhPcHRpb25zPiBMb2dTb2Z0bWF4T3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IExvZ1NvZnRtYXhPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TG9nU29mdG1heE9wdGlvbnM+IExvZ1NvZnRtYXhPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBMb2dTb2Z0bWF4T3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZUxvZ1NvZnRtYXhPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMb2dTb2Z0bWF4T3B0aW9ucz4gQ3JlYXRlTG9nU29mdG1heE9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBMb2dTb2Z0bWF4T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PExvZ1NvZnRtYXhPcHRpb25zPiBDcmVhdGVMb2dTb2Z0bWF4T3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTG9nU29mdG1heE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IExvZ1NvZnRtYXhPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IExvZ1NvZnRtYXhPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZUxvZ1NvZnRtYXhPcHRpb25zKAogICAgICAgX2ZiYik7CiB9CiAKLWlubGluZSBDYXN0T3B0aW9uc1QgKkNhc3RPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIENhc3RPcHRpb25zVCAqQ2FzdE9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxDYXN0T3B0aW9uc1Q+KG5ldyBDYXN0T3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBDYXN0T3B0aW9uczo6VW5QYWNrVG8oQ2FzdE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgQ2FzdE9wdGlvbnM6OlVuUGFja1RvKENhc3RPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogICB7IGF1dG8gX2UgPSBpbl9kYXRhX3R5cGUoKTsgX28tPmluX2RhdGFfdHlwZSA9IF9lOyB9CiAgIHsgYXV0byBfZSA9IG91dF9kYXRhX3R5cGUoKTsgX28tPm91dF9kYXRhX3R5cGUgPSBfZTsgfQogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDYXN0T3B0aW9ucz4gQ2FzdE9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBDYXN0T3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PENhc3RPcHRpb25zPiBDYXN0T3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQ2FzdE9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVDYXN0T3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8Q2FzdE9wdGlvbnM+IENyZWF0ZUNhc3RPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQ2FzdE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDYXN0T3B0aW9ucz4gQ3JlYXRlQ2FzdE9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IENhc3RPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBDYXN0T3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBDYXN0T3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICBhdXRvIF9pbl9kYXRhX3R5cGUgPSBfby0+aW5fZGF0YV90eXBlOwogICBhdXRvIF9vdXRfZGF0YV90eXBlID0gX28tPm91dF9kYXRhX3R5cGU7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZUNhc3RPcHRpb25zKApAQCAtMTUzMTksNDk3ICsxODk5NCw1MDAgQEAKICAgICAgIF9vdXRfZGF0YV90eXBlKTsKIH0KIAotaW5saW5lIERlcXVhbnRpemVPcHRpb25zVCAqRGVxdWFudGl6ZU9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgRGVxdWFudGl6ZU9wdGlvbnNUICpEZXF1YW50aXplT3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPERlcXVhbnRpemVPcHRpb25zVD4obmV3IERlcXVhbnRpemVPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIERlcXVhbnRpemVPcHRpb25zOjpVblBhY2tUbyhEZXF1YW50aXplT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBEZXF1YW50aXplT3B0aW9uczo6VW5QYWNrVG8oRGVxdWFudGl6ZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PERlcXVhbnRpemVPcHRpb25zPiBEZXF1YW50aXplT3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IERlcXVhbnRpemVPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8RGVxdWFudGl6ZU9wdGlvbnM+IERlcXVhbnRpemVPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBEZXF1YW50aXplT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZURlcXVhbnRpemVPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxEZXF1YW50aXplT3B0aW9ucz4gQ3JlYXRlRGVxdWFudGl6ZU9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBEZXF1YW50aXplT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PERlcXVhbnRpemVPcHRpb25zPiBDcmVhdGVEZXF1YW50aXplT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRGVxdWFudGl6ZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IERlcXVhbnRpemVPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IERlcXVhbnRpemVPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZURlcXVhbnRpemVPcHRpb25zKAogICAgICAgX2ZiYik7CiB9CiAKLWlubGluZSBNYXhpbXVtTWluaW11bU9wdGlvbnNUICpNYXhpbXVtTWluaW11bU9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgTWF4aW11bU1pbmltdW1PcHRpb25zVCAqTWF4aW11bU1pbmltdW1PcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8TWF4aW11bU1pbmltdW1PcHRpb25zVD4obmV3IE1heGltdW1NaW5pbXVtT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBNYXhpbXVtTWluaW11bU9wdGlvbnM6OlVuUGFja1RvKE1heGltdW1NaW5pbXVtT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBNYXhpbXVtTWluaW11bU9wdGlvbnM6OlVuUGFja1RvKE1heGltdW1NaW5pbXVtT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TWF4aW11bU1pbmltdW1PcHRpb25zPiBNYXhpbXVtTWluaW11bU9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBNYXhpbXVtTWluaW11bU9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNYXhpbXVtTWluaW11bU9wdGlvbnM+IE1heGltdW1NaW5pbXVtT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTWF4aW11bU1pbmltdW1PcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlTWF4aW11bU1pbmltdW1PcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNYXhpbXVtTWluaW11bU9wdGlvbnM+IENyZWF0ZU1heGltdW1NaW5pbXVtT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE1heGltdW1NaW5pbXVtT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE1heGltdW1NaW5pbXVtT3B0aW9ucz4gQ3JlYXRlTWF4aW11bU1pbmltdW1PcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBNYXhpbXVtTWluaW11bU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IE1heGltdW1NaW5pbXVtT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBNYXhpbXVtTWluaW11bU9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlTWF4aW11bU1pbmltdW1PcHRpb25zKAogICAgICAgX2ZiYik7CiB9CiAKLWlubGluZSBUaWxlT3B0aW9uc1QgKlRpbGVPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIFRpbGVPcHRpb25zVCAqVGlsZU9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxUaWxlT3B0aW9uc1Q+KG5ldyBUaWxlT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBUaWxlT3B0aW9uczo6VW5QYWNrVG8oVGlsZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgVGlsZU9wdGlvbnM6OlVuUGFja1RvKFRpbGVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUaWxlT3B0aW9ucz4gVGlsZU9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBUaWxlT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFRpbGVPcHRpb25zPiBUaWxlT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVGlsZU9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVUaWxlT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8VGlsZU9wdGlvbnM+IENyZWF0ZVRpbGVPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVGlsZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUaWxlT3B0aW9ucz4gQ3JlYXRlVGlsZU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFRpbGVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBUaWxlT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBUaWxlT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVUaWxlT3B0aW9ucygKICAgICAgIF9mYmIpOwogfQogCi1pbmxpbmUgQXJnTWF4T3B0aW9uc1QgKkFyZ01heE9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgQXJnTWF4T3B0aW9uc1QgKkFyZ01heE9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxBcmdNYXhPcHRpb25zVD4obmV3IEFyZ01heE9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgQXJnTWF4T3B0aW9uczo6VW5QYWNrVG8oQXJnTWF4T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBBcmdNYXhPcHRpb25zOjpVblBhY2tUbyhBcmdNYXhPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogICB7IGF1dG8gX2UgPSBvdXRwdXRfdHlwZSgpOyBfby0+b3V0cHV0X3R5cGUgPSBfZTsgfQogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBcmdNYXhPcHRpb25zPiBBcmdNYXhPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQXJnTWF4T3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEFyZ01heE9wdGlvbnM+IEFyZ01heE9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEFyZ01heE9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVBcmdNYXhPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBcmdNYXhPcHRpb25zPiBDcmVhdGVBcmdNYXhPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQXJnTWF4T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEFyZ01heE9wdGlvbnM+IENyZWF0ZUFyZ01heE9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEFyZ01heE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IEFyZ01heE9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgQXJnTWF4T3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICBhdXRvIF9vdXRwdXRfdHlwZSA9IF9vLT5vdXRwdXRfdHlwZTsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlQXJnTWF4T3B0aW9ucygKICAgICAgIF9mYmIsCiAgICAgICBfb3V0cHV0X3R5cGUpOwogfQogCi1pbmxpbmUgQXJnTWluT3B0aW9uc1QgKkFyZ01pbk9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgQXJnTWluT3B0aW9uc1QgKkFyZ01pbk9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxBcmdNaW5PcHRpb25zVD4obmV3IEFyZ01pbk9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgQXJnTWluT3B0aW9uczo6VW5QYWNrVG8oQXJnTWluT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBBcmdNaW5PcHRpb25zOjpVblBhY2tUbyhBcmdNaW5PcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogICB7IGF1dG8gX2UgPSBvdXRwdXRfdHlwZSgpOyBfby0+b3V0cHV0X3R5cGUgPSBfZTsgfQogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBcmdNaW5PcHRpb25zPiBBcmdNaW5PcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQXJnTWluT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEFyZ01pbk9wdGlvbnM+IEFyZ01pbk9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEFyZ01pbk9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVBcmdNaW5PcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBcmdNaW5PcHRpb25zPiBDcmVhdGVBcmdNaW5PcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQXJnTWluT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEFyZ01pbk9wdGlvbnM+IENyZWF0ZUFyZ01pbk9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEFyZ01pbk9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IEFyZ01pbk9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgQXJnTWluT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICBhdXRvIF9vdXRwdXRfdHlwZSA9IF9vLT5vdXRwdXRfdHlwZTsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlQXJnTWluT3B0aW9ucygKICAgICAgIF9mYmIsCiAgICAgICBfb3V0cHV0X3R5cGUpOwogfQogCi1pbmxpbmUgR3JlYXRlck9wdGlvbnNUICpHcmVhdGVyT3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBHcmVhdGVyT3B0aW9uc1QgKkdyZWF0ZXJPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8R3JlYXRlck9wdGlvbnNUPihuZXcgR3JlYXRlck9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgR3JlYXRlck9wdGlvbnM6OlVuUGFja1RvKEdyZWF0ZXJPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIEdyZWF0ZXJPcHRpb25zOjpVblBhY2tUbyhHcmVhdGVyT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8R3JlYXRlck9wdGlvbnM+IEdyZWF0ZXJPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgR3JlYXRlck9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxHcmVhdGVyT3B0aW9ucz4gR3JlYXRlck9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEdyZWF0ZXJPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlR3JlYXRlck9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEdyZWF0ZXJPcHRpb25zPiBDcmVhdGVHcmVhdGVyT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEdyZWF0ZXJPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8R3JlYXRlck9wdGlvbnM+IENyZWF0ZUdyZWF0ZXJPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBHcmVhdGVyT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgR3JlYXRlck9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgR3JlYXRlck9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlR3JlYXRlck9wdGlvbnMoCiAgICAgICBfZmJiKTsKIH0KIAotaW5saW5lIEdyZWF0ZXJFcXVhbE9wdGlvbnNUICpHcmVhdGVyRXF1YWxPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIEdyZWF0ZXJFcXVhbE9wdGlvbnNUICpHcmVhdGVyRXF1YWxPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8R3JlYXRlckVxdWFsT3B0aW9uc1Q+KG5ldyBHcmVhdGVyRXF1YWxPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIEdyZWF0ZXJFcXVhbE9wdGlvbnM6OlVuUGFja1RvKEdyZWF0ZXJFcXVhbE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgR3JlYXRlckVxdWFsT3B0aW9uczo6VW5QYWNrVG8oR3JlYXRlckVxdWFsT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8R3JlYXRlckVxdWFsT3B0aW9ucz4gR3JlYXRlckVxdWFsT3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEdyZWF0ZXJFcXVhbE9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxHcmVhdGVyRXF1YWxPcHRpb25zPiBHcmVhdGVyRXF1YWxPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBHcmVhdGVyRXF1YWxPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlR3JlYXRlckVxdWFsT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8R3JlYXRlckVxdWFsT3B0aW9ucz4gQ3JlYXRlR3JlYXRlckVxdWFsT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEdyZWF0ZXJFcXVhbE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxHcmVhdGVyRXF1YWxPcHRpb25zPiBDcmVhdGVHcmVhdGVyRXF1YWxPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBHcmVhdGVyRXF1YWxPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBHcmVhdGVyRXF1YWxPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IEdyZWF0ZXJFcXVhbE9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlR3JlYXRlckVxdWFsT3B0aW9ucygKICAgICAgIF9mYmIpOwogfQogCi1pbmxpbmUgTGVzc09wdGlvbnNUICpMZXNzT3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBMZXNzT3B0aW9uc1QgKkxlc3NPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8TGVzc09wdGlvbnNUPihuZXcgTGVzc09wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgTGVzc09wdGlvbnM6OlVuUGFja1RvKExlc3NPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIExlc3NPcHRpb25zOjpVblBhY2tUbyhMZXNzT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TGVzc09wdGlvbnM+IExlc3NPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTGVzc09wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMZXNzT3B0aW9ucz4gTGVzc09wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IExlc3NPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlTGVzc09wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PExlc3NPcHRpb25zPiBDcmVhdGVMZXNzT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IExlc3NPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TGVzc09wdGlvbnM+IENyZWF0ZUxlc3NPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBMZXNzT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgTGVzc09wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgTGVzc09wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlTGVzc09wdGlvbnMoCiAgICAgICBfZmJiKTsKIH0KIAotaW5saW5lIExlc3NFcXVhbE9wdGlvbnNUICpMZXNzRXF1YWxPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIExlc3NFcXVhbE9wdGlvbnNUICpMZXNzRXF1YWxPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8TGVzc0VxdWFsT3B0aW9uc1Q+KG5ldyBMZXNzRXF1YWxPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIExlc3NFcXVhbE9wdGlvbnM6OlVuUGFja1RvKExlc3NFcXVhbE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgTGVzc0VxdWFsT3B0aW9uczo6VW5QYWNrVG8oTGVzc0VxdWFsT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TGVzc0VxdWFsT3B0aW9ucz4gTGVzc0VxdWFsT3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IExlc3NFcXVhbE9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMZXNzRXF1YWxPcHRpb25zPiBMZXNzRXF1YWxPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBMZXNzRXF1YWxPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlTGVzc0VxdWFsT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TGVzc0VxdWFsT3B0aW9ucz4gQ3JlYXRlTGVzc0VxdWFsT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IExlc3NFcXVhbE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMZXNzRXF1YWxPcHRpb25zPiBDcmVhdGVMZXNzRXF1YWxPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBMZXNzRXF1YWxPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBMZXNzRXF1YWxPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IExlc3NFcXVhbE9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlTGVzc0VxdWFsT3B0aW9ucygKICAgICAgIF9mYmIpOwogfQogCi1pbmxpbmUgTmVnT3B0aW9uc1QgKk5lZ09wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgTmVnT3B0aW9uc1QgKk5lZ09wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxOZWdPcHRpb25zVD4obmV3IE5lZ09wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgTmVnT3B0aW9uczo6VW5QYWNrVG8oTmVnT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBOZWdPcHRpb25zOjpVblBhY2tUbyhOZWdPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxOZWdPcHRpb25zPiBOZWdPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTmVnT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE5lZ09wdGlvbnM+IE5lZ09wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE5lZ09wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVOZWdPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxOZWdPcHRpb25zPiBDcmVhdGVOZWdPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTmVnT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE5lZ09wdGlvbnM+IENyZWF0ZU5lZ09wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE5lZ09wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IE5lZ09wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgTmVnT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVOZWdPcHRpb25zKAogICAgICAgX2ZiYik7CiB9CiAKLWlubGluZSBTZWxlY3RPcHRpb25zVCAqU2VsZWN0T3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBTZWxlY3RPcHRpb25zVCAqU2VsZWN0T3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFNlbGVjdE9wdGlvbnNUPihuZXcgU2VsZWN0T3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBTZWxlY3RPcHRpb25zOjpVblBhY2tUbyhTZWxlY3RPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIFNlbGVjdE9wdGlvbnM6OlVuUGFja1RvKFNlbGVjdE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNlbGVjdE9wdGlvbnM+IFNlbGVjdE9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTZWxlY3RPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U2VsZWN0T3B0aW9ucz4gU2VsZWN0T3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU2VsZWN0T3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZVNlbGVjdE9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNlbGVjdE9wdGlvbnM+IENyZWF0ZVNlbGVjdE9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTZWxlY3RPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U2VsZWN0T3B0aW9ucz4gQ3JlYXRlU2VsZWN0T3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU2VsZWN0T3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgU2VsZWN0T3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBTZWxlY3RPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZVNlbGVjdE9wdGlvbnMoCiAgICAgICBfZmJiKTsKIH0KIAotaW5saW5lIFNsaWNlT3B0aW9uc1QgKlNsaWNlT3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBTbGljZU9wdGlvbnNUICpTbGljZU9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxTbGljZU9wdGlvbnNUPihuZXcgU2xpY2VPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIFNsaWNlT3B0aW9uczo6VW5QYWNrVG8oU2xpY2VPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIFNsaWNlT3B0aW9uczo6VW5QYWNrVG8oU2xpY2VPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTbGljZU9wdGlvbnM+IFNsaWNlT3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNsaWNlT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNsaWNlT3B0aW9ucz4gU2xpY2VPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTbGljZU9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVTbGljZU9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNsaWNlT3B0aW9ucz4gQ3JlYXRlU2xpY2VPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU2xpY2VPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U2xpY2VPcHRpb25zPiBDcmVhdGVTbGljZU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNsaWNlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgU2xpY2VPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFNsaWNlT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVTbGljZU9wdGlvbnMoCiAgICAgICBfZmJiKTsKIH0KIAotaW5saW5lIFRyYW5zcG9zZUNvbnZPcHRpb25zVCAqVHJhbnNwb3NlQ29udk9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgVHJhbnNwb3NlQ29udk9wdGlvbnNUICpUcmFuc3Bvc2VDb252T3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFRyYW5zcG9zZUNvbnZPcHRpb25zVD4obmV3IFRyYW5zcG9zZUNvbnZPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIFRyYW5zcG9zZUNvbnZPcHRpb25zOjpVblBhY2tUbyhUcmFuc3Bvc2VDb252T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBUcmFuc3Bvc2VDb252T3B0aW9uczo6VW5QYWNrVG8oVHJhbnNwb3NlQ29udk9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiAgIHsgYXV0byBfZSA9IHBhZGRpbmcoKTsgX28tPnBhZGRpbmcgPSBfZTsgfQogICB7IGF1dG8gX2UgPSBzdHJpZGVfdygpOyBfby0+c3RyaWRlX3cgPSBfZTsgfQogICB7IGF1dG8gX2UgPSBzdHJpZGVfaCgpOyBfby0+c3RyaWRlX2ggPSBfZTsgfQogICB7IGF1dG8gX2UgPSBmdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uKCk7IF9vLT5mdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gcXVhbnRpemVkX2JpYXNfdHlwZSgpOyBfby0+cXVhbnRpemVkX2JpYXNfdHlwZSA9IF9lOyB9CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFRyYW5zcG9zZUNvbnZPcHRpb25zPiBUcmFuc3Bvc2VDb252T3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFRyYW5zcG9zZUNvbnZPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VHJhbnNwb3NlQ29udk9wdGlvbnM+IFRyYW5zcG9zZUNvbnZPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBUcmFuc3Bvc2VDb252T3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZVRyYW5zcG9zZUNvbnZPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUcmFuc3Bvc2VDb252T3B0aW9ucz4gQ3JlYXRlVHJhbnNwb3NlQ29udk9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBUcmFuc3Bvc2VDb252T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFRyYW5zcG9zZUNvbnZPcHRpb25zPiBDcmVhdGVUcmFuc3Bvc2VDb252T3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVHJhbnNwb3NlQ29udk9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFRyYW5zcG9zZUNvbnZPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFRyYW5zcG9zZUNvbnZPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIGF1dG8gX3BhZGRpbmcgPSBfby0+cGFkZGluZzsKICAgYXV0byBfc3RyaWRlX3cgPSBfby0+c3RyaWRlX3c7CiAgIGF1dG8gX3N0cmlkZV9oID0gX28tPnN0cmlkZV9oOwogICBhdXRvIF9mdXNlZF9hY3RpdmF0aW9uX2Z1bmN0aW9uID0gX28tPmZ1c2VkX2FjdGl2YXRpb25fZnVuY3Rpb247CisgIGF1dG8gX3F1YW50aXplZF9iaWFzX3R5cGUgPSBfby0+cXVhbnRpemVkX2JpYXNfdHlwZTsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlVHJhbnNwb3NlQ29udk9wdGlvbnMoCiAgICAgICBfZmJiLAogICAgICAgX3BhZGRpbmcsCiAgICAgICBfc3RyaWRlX3csCiAgICAgICBfc3RyaWRlX2gsCi0gICAgICBfZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbik7CisgICAgICBfZnVzZWRfYWN0aXZhdGlvbl9mdW5jdGlvbiwKKyAgICAgIF9xdWFudGl6ZWRfYmlhc190eXBlKTsKIH0KIAotaW5saW5lIEV4cGFuZERpbXNPcHRpb25zVCAqRXhwYW5kRGltc09wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgRXhwYW5kRGltc09wdGlvbnNUICpFeHBhbmREaW1zT3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPEV4cGFuZERpbXNPcHRpb25zVD4obmV3IEV4cGFuZERpbXNPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIEV4cGFuZERpbXNPcHRpb25zOjpVblBhY2tUbyhFeHBhbmREaW1zT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBFeHBhbmREaW1zT3B0aW9uczo6VW5QYWNrVG8oRXhwYW5kRGltc09wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEV4cGFuZERpbXNPcHRpb25zPiBFeHBhbmREaW1zT3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEV4cGFuZERpbXNPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8RXhwYW5kRGltc09wdGlvbnM+IEV4cGFuZERpbXNPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBFeHBhbmREaW1zT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZUV4cGFuZERpbXNPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxFeHBhbmREaW1zT3B0aW9ucz4gQ3JlYXRlRXhwYW5kRGltc09wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBFeHBhbmREaW1zT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEV4cGFuZERpbXNPcHRpb25zPiBDcmVhdGVFeHBhbmREaW1zT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRXhwYW5kRGltc09wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IEV4cGFuZERpbXNPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IEV4cGFuZERpbXNPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZUV4cGFuZERpbXNPcHRpb25zKAogICAgICAgX2ZiYik7CiB9CiAKLWlubGluZSBTcGFyc2VUb0RlbnNlT3B0aW9uc1QgKlNwYXJzZVRvRGVuc2VPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIFNwYXJzZVRvRGVuc2VPcHRpb25zVCAqU3BhcnNlVG9EZW5zZU9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxTcGFyc2VUb0RlbnNlT3B0aW9uc1Q+KG5ldyBTcGFyc2VUb0RlbnNlT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBTcGFyc2VUb0RlbnNlT3B0aW9uczo6VW5QYWNrVG8oU3BhcnNlVG9EZW5zZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgU3BhcnNlVG9EZW5zZU9wdGlvbnM6OlVuUGFja1RvKFNwYXJzZVRvRGVuc2VPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogICB7IGF1dG8gX2UgPSB2YWxpZGF0ZV9pbmRpY2VzKCk7IF9vLT52YWxpZGF0ZV9pbmRpY2VzID0gX2U7IH0KIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3BhcnNlVG9EZW5zZU9wdGlvbnM+IFNwYXJzZVRvRGVuc2VPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3BhcnNlVG9EZW5zZU9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcGFyc2VUb0RlbnNlT3B0aW9ucz4gU3BhcnNlVG9EZW5zZU9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNwYXJzZVRvRGVuc2VPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlU3BhcnNlVG9EZW5zZU9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNwYXJzZVRvRGVuc2VPcHRpb25zPiBDcmVhdGVTcGFyc2VUb0RlbnNlT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNwYXJzZVRvRGVuc2VPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3BhcnNlVG9EZW5zZU9wdGlvbnM+IENyZWF0ZVNwYXJzZVRvRGVuc2VPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTcGFyc2VUb0RlbnNlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgU3BhcnNlVG9EZW5zZU9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgU3BhcnNlVG9EZW5zZU9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgYXV0byBfdmFsaWRhdGVfaW5kaWNlcyA9IF9vLT52YWxpZGF0ZV9pbmRpY2VzOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVTcGFyc2VUb0RlbnNlT3B0aW9ucygKICAgICAgIF9mYmIsCiAgICAgICBfdmFsaWRhdGVfaW5kaWNlcyk7CiB9CiAKLWlubGluZSBFcXVhbE9wdGlvbnNUICpFcXVhbE9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgRXF1YWxPcHRpb25zVCAqRXF1YWxPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8RXF1YWxPcHRpb25zVD4obmV3IEVxdWFsT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBFcXVhbE9wdGlvbnM6OlVuUGFja1RvKEVxdWFsT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBFcXVhbE9wdGlvbnM6OlVuUGFja1RvKEVxdWFsT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8RXF1YWxPcHRpb25zPiBFcXVhbE9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBFcXVhbE9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxFcXVhbE9wdGlvbnM+IEVxdWFsT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRXF1YWxPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlRXF1YWxPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxFcXVhbE9wdGlvbnM+IENyZWF0ZUVxdWFsT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEVxdWFsT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEVxdWFsT3B0aW9ucz4gQ3JlYXRlRXF1YWxPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBFcXVhbE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IEVxdWFsT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBFcXVhbE9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlRXF1YWxPcHRpb25zKAogICAgICAgX2ZiYik7CiB9CiAKLWlubGluZSBOb3RFcXVhbE9wdGlvbnNUICpOb3RFcXVhbE9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgTm90RXF1YWxPcHRpb25zVCAqTm90RXF1YWxPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8Tm90RXF1YWxPcHRpb25zVD4obmV3IE5vdEVxdWFsT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBOb3RFcXVhbE9wdGlvbnM6OlVuUGFja1RvKE5vdEVxdWFsT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBOb3RFcXVhbE9wdGlvbnM6OlVuUGFja1RvKE5vdEVxdWFsT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8Tm90RXF1YWxPcHRpb25zPiBOb3RFcXVhbE9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBOb3RFcXVhbE9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxOb3RFcXVhbE9wdGlvbnM+IE5vdEVxdWFsT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTm90RXF1YWxPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlTm90RXF1YWxPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxOb3RFcXVhbE9wdGlvbnM+IENyZWF0ZU5vdEVxdWFsT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE5vdEVxdWFsT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE5vdEVxdWFsT3B0aW9ucz4gQ3JlYXRlTm90RXF1YWxPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBOb3RFcXVhbE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IE5vdEVxdWFsT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBOb3RFcXVhbE9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlTm90RXF1YWxPcHRpb25zKAogICAgICAgX2ZiYik7CiB9CiAKLWlubGluZSBTaGFwZU9wdGlvbnNUICpTaGFwZU9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgU2hhcGVPcHRpb25zVCAqU2hhcGVPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8U2hhcGVPcHRpb25zVD4obmV3IFNoYXBlT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBTaGFwZU9wdGlvbnM6OlVuUGFja1RvKFNoYXBlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBTaGFwZU9wdGlvbnM6OlVuUGFja1RvKFNoYXBlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKICAgeyBhdXRvIF9lID0gb3V0X3R5cGUoKTsgX28tPm91dF90eXBlID0gX2U7IH0KIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U2hhcGVPcHRpb25zPiBTaGFwZU9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTaGFwZU9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTaGFwZU9wdGlvbnM+IFNoYXBlT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU2hhcGVPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlU2hhcGVPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTaGFwZU9wdGlvbnM+IENyZWF0ZVNoYXBlT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNoYXBlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNoYXBlT3B0aW9ucz4gQ3JlYXRlU2hhcGVPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTaGFwZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFNoYXBlT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBTaGFwZU9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgYXV0byBfb3V0X3R5cGUgPSBfby0+b3V0X3R5cGU7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZVNoYXBlT3B0aW9ucygKICAgICAgIF9mYmIsCiAgICAgICBfb3V0X3R5cGUpOwogfQogCi1pbmxpbmUgUmFua09wdGlvbnNUICpSYW5rT3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBSYW5rT3B0aW9uc1QgKlJhbmtPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8UmFua09wdGlvbnNUPihuZXcgUmFua09wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgUmFua09wdGlvbnM6OlVuUGFja1RvKFJhbmtPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIFJhbmtPcHRpb25zOjpVblBhY2tUbyhSYW5rT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8UmFua09wdGlvbnM+IFJhbmtPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmFua09wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSYW5rT3B0aW9ucz4gUmFua09wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJhbmtPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlUmFua09wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFJhbmtPcHRpb25zPiBDcmVhdGVSYW5rT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJhbmtPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UmFua09wdGlvbnM+IENyZWF0ZVJhbmtPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBSYW5rT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgUmFua09wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgUmFua09wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlUmFua09wdGlvbnMoCiAgICAgICBfZmJiKTsKIH0KIAotaW5saW5lIFBvd09wdGlvbnNUICpQb3dPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIFBvd09wdGlvbnNUICpQb3dPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8UG93T3B0aW9uc1Q+KG5ldyBQb3dPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIFBvd09wdGlvbnM6OlVuUGFja1RvKFBvd09wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgUG93T3B0aW9uczo6VW5QYWNrVG8oUG93T3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8UG93T3B0aW9ucz4gUG93T3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFBvd09wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxQb3dPcHRpb25zPiBQb3dPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBQb3dPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlUG93T3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8UG93T3B0aW9ucz4gQ3JlYXRlUG93T3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFBvd09wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxQb3dPcHRpb25zPiBDcmVhdGVQb3dPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBQb3dPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBQb3dPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFBvd09wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlUG93T3B0aW9ucygKICAgICAgIF9mYmIpOwogfQogCi1pbmxpbmUgRmFrZVF1YW50T3B0aW9uc1QgKkZha2VRdWFudE9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgRmFrZVF1YW50T3B0aW9uc1QgKkZha2VRdWFudE9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxGYWtlUXVhbnRPcHRpb25zVD4obmV3IEZha2VRdWFudE9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgRmFrZVF1YW50T3B0aW9uczo6VW5QYWNrVG8oRmFrZVF1YW50T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBGYWtlUXVhbnRPcHRpb25zOjpVblBhY2tUbyhGYWtlUXVhbnRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogICB7IGF1dG8gX2UgPSBtaW4oKTsgX28tPm1pbiA9IF9lOyB9CkBAIC0xNTgxOCwxNCArMTk0OTYsMTQgQEAKICAgeyBhdXRvIF9lID0gbmFycm93X3JhbmdlKCk7IF9vLT5uYXJyb3dfcmFuZ2UgPSBfZTsgfQogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxGYWtlUXVhbnRPcHRpb25zPiBGYWtlUXVhbnRPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRmFrZVF1YW50T3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEZha2VRdWFudE9wdGlvbnM+IEZha2VRdWFudE9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEZha2VRdWFudE9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVGYWtlUXVhbnRPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxGYWtlUXVhbnRPcHRpb25zPiBDcmVhdGVGYWtlUXVhbnRPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRmFrZVF1YW50T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEZha2VRdWFudE9wdGlvbnM+IENyZWF0ZUZha2VRdWFudE9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEZha2VRdWFudE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IEZha2VRdWFudE9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgRmFrZVF1YW50T3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICBhdXRvIF9taW4gPSBfby0+bWluOwogICBhdXRvIF9tYXggPSBfby0+bWF4OwogICBhdXRvIF9udW1fYml0cyA9IF9vLT5udW1fYml0czsKQEAgLTE1ODM4LDI3ICsxOTUxNiwyNyBAQAogICAgICAgX25hcnJvd19yYW5nZSk7CiB9CiAKLWlubGluZSBQYWNrT3B0aW9uc1QgKlBhY2tPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIFBhY2tPcHRpb25zVCAqUGFja09wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxQYWNrT3B0aW9uc1Q+KG5ldyBQYWNrT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBQYWNrT3B0aW9uczo6VW5QYWNrVG8oUGFja09wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgUGFja09wdGlvbnM6OlVuUGFja1RvKFBhY2tPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogICB7IGF1dG8gX2UgPSB2YWx1ZXNfY291bnQoKTsgX28tPnZhbHVlc19jb3VudCA9IF9lOyB9CiAgIHsgYXV0byBfZSA9IGF4aXMoKTsgX28tPmF4aXMgPSBfZTsgfQogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxQYWNrT3B0aW9ucz4gUGFja09wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBQYWNrT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFBhY2tPcHRpb25zPiBQYWNrT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUGFja09wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVQYWNrT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8UGFja09wdGlvbnM+IENyZWF0ZVBhY2tPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUGFja09wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxQYWNrT3B0aW9ucz4gQ3JlYXRlUGFja09wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFBhY2tPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBQYWNrT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBQYWNrT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICBhdXRvIF92YWx1ZXNfY291bnQgPSBfby0+dmFsdWVzX2NvdW50OwogICBhdXRvIF9heGlzID0gX28tPmF4aXM7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZVBhY2tPcHRpb25zKApAQCAtMTU4NjcsMTY4ICsxOTU0NSwxNjggQEAKICAgICAgIF9heGlzKTsKIH0KIAotaW5saW5lIExvZ2ljYWxPck9wdGlvbnNUICpMb2dpY2FsT3JPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIExvZ2ljYWxPck9wdGlvbnNUICpMb2dpY2FsT3JPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8TG9naWNhbE9yT3B0aW9uc1Q+KG5ldyBMb2dpY2FsT3JPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIExvZ2ljYWxPck9wdGlvbnM6OlVuUGFja1RvKExvZ2ljYWxPck9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgTG9naWNhbE9yT3B0aW9uczo6VW5QYWNrVG8oTG9naWNhbE9yT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TG9naWNhbE9yT3B0aW9ucz4gTG9naWNhbE9yT3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IExvZ2ljYWxPck9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMb2dpY2FsT3JPcHRpb25zPiBMb2dpY2FsT3JPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBMb2dpY2FsT3JPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlTG9naWNhbE9yT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TG9naWNhbE9yT3B0aW9ucz4gQ3JlYXRlTG9naWNhbE9yT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IExvZ2ljYWxPck9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMb2dpY2FsT3JPcHRpb25zPiBDcmVhdGVMb2dpY2FsT3JPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBMb2dpY2FsT3JPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBMb2dpY2FsT3JPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IExvZ2ljYWxPck9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlTG9naWNhbE9yT3B0aW9ucygKICAgICAgIF9mYmIpOwogfQogCi1pbmxpbmUgT25lSG90T3B0aW9uc1QgKk9uZUhvdE9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgT25lSG90T3B0aW9uc1QgKk9uZUhvdE9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxPbmVIb3RPcHRpb25zVD4obmV3IE9uZUhvdE9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgT25lSG90T3B0aW9uczo6VW5QYWNrVG8oT25lSG90T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBPbmVIb3RPcHRpb25zOjpVblBhY2tUbyhPbmVIb3RPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogICB7IGF1dG8gX2UgPSBheGlzKCk7IF9vLT5heGlzID0gX2U7IH0KIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8T25lSG90T3B0aW9ucz4gT25lSG90T3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE9uZUhvdE9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxPbmVIb3RPcHRpb25zPiBPbmVIb3RPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBPbmVIb3RPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlT25lSG90T3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8T25lSG90T3B0aW9ucz4gQ3JlYXRlT25lSG90T3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE9uZUhvdE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxPbmVIb3RPcHRpb25zPiBDcmVhdGVPbmVIb3RPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBPbmVIb3RPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBPbmVIb3RPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IE9uZUhvdE9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgYXV0byBfYXhpcyA9IF9vLT5heGlzOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVPbmVIb3RPcHRpb25zKAogICAgICAgX2ZiYiwKICAgICAgIF9heGlzKTsKIH0KIAotaW5saW5lIEFic09wdGlvbnNUICpBYnNPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIEFic09wdGlvbnNUICpBYnNPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8QWJzT3B0aW9uc1Q+KG5ldyBBYnNPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIEFic09wdGlvbnM6OlVuUGFja1RvKEFic09wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgQWJzT3B0aW9uczo6VW5QYWNrVG8oQWJzT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8QWJzT3B0aW9ucz4gQWJzT3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEFic09wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBYnNPcHRpb25zPiBBYnNPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBBYnNPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlQWJzT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8QWJzT3B0aW9ucz4gQ3JlYXRlQWJzT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEFic09wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBYnNPcHRpb25zPiBDcmVhdGVBYnNPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBBYnNPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBBYnNPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IEFic09wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlQWJzT3B0aW9ucygKICAgICAgIF9mYmIpOwogfQogCi1pbmxpbmUgSGFyZFN3aXNoT3B0aW9uc1QgKkhhcmRTd2lzaE9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgSGFyZFN3aXNoT3B0aW9uc1QgKkhhcmRTd2lzaE9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxIYXJkU3dpc2hPcHRpb25zVD4obmV3IEhhcmRTd2lzaE9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgSGFyZFN3aXNoT3B0aW9uczo6VW5QYWNrVG8oSGFyZFN3aXNoT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBIYXJkU3dpc2hPcHRpb25zOjpVblBhY2tUbyhIYXJkU3dpc2hPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxIYXJkU3dpc2hPcHRpb25zPiBIYXJkU3dpc2hPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSGFyZFN3aXNoT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEhhcmRTd2lzaE9wdGlvbnM+IEhhcmRTd2lzaE9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEhhcmRTd2lzaE9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVIYXJkU3dpc2hPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxIYXJkU3dpc2hPcHRpb25zPiBDcmVhdGVIYXJkU3dpc2hPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSGFyZFN3aXNoT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEhhcmRTd2lzaE9wdGlvbnM+IENyZWF0ZUhhcmRTd2lzaE9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEhhcmRTd2lzaE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IEhhcmRTd2lzaE9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgSGFyZFN3aXNoT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVIYXJkU3dpc2hPcHRpb25zKAogICAgICAgX2ZiYik7CiB9CiAKLWlubGluZSBMb2dpY2FsQW5kT3B0aW9uc1QgKkxvZ2ljYWxBbmRPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIExvZ2ljYWxBbmRPcHRpb25zVCAqTG9naWNhbEFuZE9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxMb2dpY2FsQW5kT3B0aW9uc1Q+KG5ldyBMb2dpY2FsQW5kT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBMb2dpY2FsQW5kT3B0aW9uczo6VW5QYWNrVG8oTG9naWNhbEFuZE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgTG9naWNhbEFuZE9wdGlvbnM6OlVuUGFja1RvKExvZ2ljYWxBbmRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMb2dpY2FsQW5kT3B0aW9ucz4gTG9naWNhbEFuZE9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBMb2dpY2FsQW5kT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PExvZ2ljYWxBbmRPcHRpb25zPiBMb2dpY2FsQW5kT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTG9naWNhbEFuZE9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVMb2dpY2FsQW5kT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TG9naWNhbEFuZE9wdGlvbnM+IENyZWF0ZUxvZ2ljYWxBbmRPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTG9naWNhbEFuZE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMb2dpY2FsQW5kT3B0aW9ucz4gQ3JlYXRlTG9naWNhbEFuZE9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IExvZ2ljYWxBbmRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBMb2dpY2FsQW5kT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBMb2dpY2FsQW5kT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVMb2dpY2FsQW5kT3B0aW9ucygKICAgICAgIF9mYmIpOwogfQogCi1pbmxpbmUgTG9naWNhbE5vdE9wdGlvbnNUICpMb2dpY2FsTm90T3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBMb2dpY2FsTm90T3B0aW9uc1QgKkxvZ2ljYWxOb3RPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8TG9naWNhbE5vdE9wdGlvbnNUPihuZXcgTG9naWNhbE5vdE9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgTG9naWNhbE5vdE9wdGlvbnM6OlVuUGFja1RvKExvZ2ljYWxOb3RPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIExvZ2ljYWxOb3RPcHRpb25zOjpVblBhY2tUbyhMb2dpY2FsTm90T3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TG9naWNhbE5vdE9wdGlvbnM+IExvZ2ljYWxOb3RPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTG9naWNhbE5vdE9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMb2dpY2FsTm90T3B0aW9ucz4gTG9naWNhbE5vdE9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IExvZ2ljYWxOb3RPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlTG9naWNhbE5vdE9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PExvZ2ljYWxOb3RPcHRpb25zPiBDcmVhdGVMb2dpY2FsTm90T3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IExvZ2ljYWxOb3RPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TG9naWNhbE5vdE9wdGlvbnM+IENyZWF0ZUxvZ2ljYWxOb3RPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBMb2dpY2FsTm90T3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgTG9naWNhbE5vdE9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgTG9naWNhbE5vdE9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlTG9naWNhbE5vdE9wdGlvbnMoCiAgICAgICBfZmJiKTsKIH0KIAotaW5saW5lIFVucGFja09wdGlvbnNUICpVbnBhY2tPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIFVucGFja09wdGlvbnNUICpVbnBhY2tPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8VW5wYWNrT3B0aW9uc1Q+KG5ldyBVbnBhY2tPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIFVucGFja09wdGlvbnM6OlVuUGFja1RvKFVucGFja09wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgVW5wYWNrT3B0aW9uczo6VW5QYWNrVG8oVW5wYWNrT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKICAgeyBhdXRvIF9lID0gbnVtKCk7IF9vLT5udW0gPSBfZTsgfQogICB7IGF1dG8gX2UgPSBheGlzKCk7IF9vLT5heGlzID0gX2U7IH0KIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8VW5wYWNrT3B0aW9ucz4gVW5wYWNrT3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFVucGFja09wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbnBhY2tPcHRpb25zPiBVbnBhY2tPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBVbnBhY2tPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlVW5wYWNrT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8VW5wYWNrT3B0aW9ucz4gQ3JlYXRlVW5wYWNrT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFVucGFja09wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbnBhY2tPcHRpb25zPiBDcmVhdGVVbnBhY2tPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBVbnBhY2tPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBVbnBhY2tPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFVucGFja09wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgYXV0byBfbnVtID0gX28tPm51bTsKICAgYXV0byBfYXhpcyA9IF9vLT5heGlzOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVVbnBhY2tPcHRpb25zKApAQCAtMTYwMzcsMzU4ICsxOTcxNSwzNTggQEAKICAgICAgIF9heGlzKTsKIH0KIAotaW5saW5lIEZsb29yRGl2T3B0aW9uc1QgKkZsb29yRGl2T3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBGbG9vckRpdk9wdGlvbnNUICpGbG9vckRpdk9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxGbG9vckRpdk9wdGlvbnNUPihuZXcgRmxvb3JEaXZPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIEZsb29yRGl2T3B0aW9uczo6VW5QYWNrVG8oRmxvb3JEaXZPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIEZsb29yRGl2T3B0aW9uczo6VW5QYWNrVG8oRmxvb3JEaXZPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxGbG9vckRpdk9wdGlvbnM+IEZsb29yRGl2T3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEZsb29yRGl2T3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEZsb29yRGl2T3B0aW9ucz4gRmxvb3JEaXZPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBGbG9vckRpdk9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVGbG9vckRpdk9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEZsb29yRGl2T3B0aW9ucz4gQ3JlYXRlRmxvb3JEaXZPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRmxvb3JEaXZPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Rmxvb3JEaXZPcHRpb25zPiBDcmVhdGVGbG9vckRpdk9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEZsb29yRGl2T3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgRmxvb3JEaXZPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IEZsb29yRGl2T3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVGbG9vckRpdk9wdGlvbnMoCiAgICAgICBfZmJiKTsKIH0KIAotaW5saW5lIFNxdWFyZU9wdGlvbnNUICpTcXVhcmVPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIFNxdWFyZU9wdGlvbnNUICpTcXVhcmVPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8U3F1YXJlT3B0aW9uc1Q+KG5ldyBTcXVhcmVPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIFNxdWFyZU9wdGlvbnM6OlVuUGFja1RvKFNxdWFyZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgU3F1YXJlT3B0aW9uczo6VW5QYWNrVG8oU3F1YXJlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3F1YXJlT3B0aW9ucz4gU3F1YXJlT3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNxdWFyZU9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcXVhcmVPcHRpb25zPiBTcXVhcmVPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTcXVhcmVPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlU3F1YXJlT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3F1YXJlT3B0aW9ucz4gQ3JlYXRlU3F1YXJlT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNxdWFyZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcXVhcmVPcHRpb25zPiBDcmVhdGVTcXVhcmVPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTcXVhcmVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBTcXVhcmVPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFNxdWFyZU9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlU3F1YXJlT3B0aW9ucygKICAgICAgIF9mYmIpOwogfQogCi1pbmxpbmUgWmVyb3NMaWtlT3B0aW9uc1QgKlplcm9zTGlrZU9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgWmVyb3NMaWtlT3B0aW9uc1QgKlplcm9zTGlrZU9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxaZXJvc0xpa2VPcHRpb25zVD4obmV3IFplcm9zTGlrZU9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgWmVyb3NMaWtlT3B0aW9uczo6VW5QYWNrVG8oWmVyb3NMaWtlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBaZXJvc0xpa2VPcHRpb25zOjpVblBhY2tUbyhaZXJvc0xpa2VPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxaZXJvc0xpa2VPcHRpb25zPiBaZXJvc0xpa2VPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgWmVyb3NMaWtlT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFplcm9zTGlrZU9wdGlvbnM+IFplcm9zTGlrZU9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFplcm9zTGlrZU9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVaZXJvc0xpa2VPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxaZXJvc0xpa2VPcHRpb25zPiBDcmVhdGVaZXJvc0xpa2VPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgWmVyb3NMaWtlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFplcm9zTGlrZU9wdGlvbnM+IENyZWF0ZVplcm9zTGlrZU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFplcm9zTGlrZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFplcm9zTGlrZU9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgWmVyb3NMaWtlT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVaZXJvc0xpa2VPcHRpb25zKAogICAgICAgX2ZiYik7CiB9CiAKLWlubGluZSBGaWxsT3B0aW9uc1QgKkZpbGxPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIEZpbGxPcHRpb25zVCAqRmlsbE9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxGaWxsT3B0aW9uc1Q+KG5ldyBGaWxsT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBGaWxsT3B0aW9uczo6VW5QYWNrVG8oRmlsbE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgRmlsbE9wdGlvbnM6OlVuUGFja1RvKEZpbGxPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxGaWxsT3B0aW9ucz4gRmlsbE9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBGaWxsT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEZpbGxPcHRpb25zPiBGaWxsT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRmlsbE9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVGaWxsT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8RmlsbE9wdGlvbnM+IENyZWF0ZUZpbGxPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRmlsbE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxGaWxsT3B0aW9ucz4gQ3JlYXRlRmlsbE9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEZpbGxPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBGaWxsT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBGaWxsT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVGaWxsT3B0aW9ucygKICAgICAgIF9mYmIpOwogfQogCi1pbmxpbmUgRmxvb3JNb2RPcHRpb25zVCAqRmxvb3JNb2RPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIEZsb29yTW9kT3B0aW9uc1QgKkZsb29yTW9kT3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPEZsb29yTW9kT3B0aW9uc1Q+KG5ldyBGbG9vck1vZE9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgRmxvb3JNb2RPcHRpb25zOjpVblBhY2tUbyhGbG9vck1vZE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgRmxvb3JNb2RPcHRpb25zOjpVblBhY2tUbyhGbG9vck1vZE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEZsb29yTW9kT3B0aW9ucz4gRmxvb3JNb2RPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRmxvb3JNb2RPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Rmxvb3JNb2RPcHRpb25zPiBGbG9vck1vZE9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEZsb29yTW9kT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZUZsb29yTW9kT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8Rmxvb3JNb2RPcHRpb25zPiBDcmVhdGVGbG9vck1vZE9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBGbG9vck1vZE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxGbG9vck1vZE9wdGlvbnM+IENyZWF0ZUZsb29yTW9kT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRmxvb3JNb2RPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBGbG9vck1vZE9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgRmxvb3JNb2RPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZUZsb29yTW9kT3B0aW9ucygKICAgICAgIF9mYmIpOwogfQogCi1pbmxpbmUgUmFuZ2VPcHRpb25zVCAqUmFuZ2VPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIFJhbmdlT3B0aW9uc1QgKlJhbmdlT3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFJhbmdlT3B0aW9uc1Q+KG5ldyBSYW5nZU9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgUmFuZ2VPcHRpb25zOjpVblBhY2tUbyhSYW5nZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgUmFuZ2VPcHRpb25zOjpVblBhY2tUbyhSYW5nZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFJhbmdlT3B0aW9ucz4gUmFuZ2VPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmFuZ2VPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UmFuZ2VPcHRpb25zPiBSYW5nZU9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJhbmdlT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZVJhbmdlT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8UmFuZ2VPcHRpb25zPiBDcmVhdGVSYW5nZU9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBSYW5nZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSYW5nZU9wdGlvbnM+IENyZWF0ZVJhbmdlT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmFuZ2VPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBSYW5nZU9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgUmFuZ2VPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZVJhbmdlT3B0aW9ucygKICAgICAgIF9mYmIpOwogfQogCi1pbmxpbmUgTGVha3lSZWx1T3B0aW9uc1QgKkxlYWt5UmVsdU9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgTGVha3lSZWx1T3B0aW9uc1QgKkxlYWt5UmVsdU9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxMZWFreVJlbHVPcHRpb25zVD4obmV3IExlYWt5UmVsdU9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgTGVha3lSZWx1T3B0aW9uczo6VW5QYWNrVG8oTGVha3lSZWx1T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBMZWFreVJlbHVPcHRpb25zOjpVblBhY2tUbyhMZWFreVJlbHVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogICB7IGF1dG8gX2UgPSBhbHBoYSgpOyBfby0+YWxwaGEgPSBfZTsgfQogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMZWFreVJlbHVPcHRpb25zPiBMZWFreVJlbHVPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTGVha3lSZWx1T3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PExlYWt5UmVsdU9wdGlvbnM+IExlYWt5UmVsdU9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IExlYWt5UmVsdU9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVMZWFreVJlbHVPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxMZWFreVJlbHVPcHRpb25zPiBDcmVhdGVMZWFreVJlbHVPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTGVha3lSZWx1T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PExlYWt5UmVsdU9wdGlvbnM+IENyZWF0ZUxlYWt5UmVsdU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IExlYWt5UmVsdU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IExlYWt5UmVsdU9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgTGVha3lSZWx1T3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICBhdXRvIF9hbHBoYSA9IF9vLT5hbHBoYTsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlTGVha3lSZWx1T3B0aW9ucygKICAgICAgIF9mYmIsCiAgICAgICBfYWxwaGEpOwogfQogCi1pbmxpbmUgU3F1YXJlZERpZmZlcmVuY2VPcHRpb25zVCAqU3F1YXJlZERpZmZlcmVuY2VPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIFNxdWFyZWREaWZmZXJlbmNlT3B0aW9uc1QgKlNxdWFyZWREaWZmZXJlbmNlT3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFNxdWFyZWREaWZmZXJlbmNlT3B0aW9uc1Q+KG5ldyBTcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgU3F1YXJlZERpZmZlcmVuY2VPcHRpb25zOjpVblBhY2tUbyhTcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgU3F1YXJlZERpZmZlcmVuY2VPcHRpb25zOjpVblBhY2tUbyhTcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNxdWFyZWREaWZmZXJlbmNlT3B0aW9ucz4gU3F1YXJlZERpZmZlcmVuY2VPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3F1YXJlZERpZmZlcmVuY2VPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3F1YXJlZERpZmZlcmVuY2VPcHRpb25zPiBTcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNxdWFyZWREaWZmZXJlbmNlT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZVNxdWFyZWREaWZmZXJlbmNlT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3F1YXJlZERpZmZlcmVuY2VPcHRpb25zPiBDcmVhdGVTcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnM+IENyZWF0ZVNxdWFyZWREaWZmZXJlbmNlT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3F1YXJlZERpZmZlcmVuY2VPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBTcXVhcmVkRGlmZmVyZW5jZU9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgU3F1YXJlZERpZmZlcmVuY2VPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZVNxdWFyZWREaWZmZXJlbmNlT3B0aW9ucygKICAgICAgIF9mYmIpOwogfQogCi1pbmxpbmUgTWlycm9yUGFkT3B0aW9uc1QgKk1pcnJvclBhZE9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgTWlycm9yUGFkT3B0aW9uc1QgKk1pcnJvclBhZE9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxNaXJyb3JQYWRPcHRpb25zVD4obmV3IE1pcnJvclBhZE9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgTWlycm9yUGFkT3B0aW9uczo6VW5QYWNrVG8oTWlycm9yUGFkT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBNaXJyb3JQYWRPcHRpb25zOjpVblBhY2tUbyhNaXJyb3JQYWRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogICB7IGF1dG8gX2UgPSBtb2RlKCk7IF9vLT5tb2RlID0gX2U7IH0KIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TWlycm9yUGFkT3B0aW9ucz4gTWlycm9yUGFkT3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE1pcnJvclBhZE9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNaXJyb3JQYWRPcHRpb25zPiBNaXJyb3JQYWRPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBNaXJyb3JQYWRPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlTWlycm9yUGFkT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TWlycm9yUGFkT3B0aW9ucz4gQ3JlYXRlTWlycm9yUGFkT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE1pcnJvclBhZE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNaXJyb3JQYWRPcHRpb25zPiBDcmVhdGVNaXJyb3JQYWRPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBNaXJyb3JQYWRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBNaXJyb3JQYWRPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IE1pcnJvclBhZE9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgYXV0byBfbW9kZSA9IF9vLT5tb2RlOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVNaXJyb3JQYWRPcHRpb25zKAogICAgICAgX2ZiYiwKICAgICAgIF9tb2RlKTsKIH0KIAotaW5saW5lIFVuaXF1ZU9wdGlvbnNUICpVbmlxdWVPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIFVuaXF1ZU9wdGlvbnNUICpVbmlxdWVPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8VW5pcXVlT3B0aW9uc1Q+KG5ldyBVbmlxdWVPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIFVuaXF1ZU9wdGlvbnM6OlVuUGFja1RvKFVuaXF1ZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgVW5pcXVlT3B0aW9uczo6VW5QYWNrVG8oVW5pcXVlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKICAgeyBhdXRvIF9lID0gaWR4X291dF90eXBlKCk7IF9vLT5pZHhfb3V0X3R5cGUgPSBfZTsgfQogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbmlxdWVPcHRpb25zPiBVbmlxdWVPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVW5pcXVlT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFVuaXF1ZU9wdGlvbnM+IFVuaXF1ZU9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFVuaXF1ZU9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVVbmlxdWVPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbmlxdWVPcHRpb25zPiBDcmVhdGVVbmlxdWVPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVW5pcXVlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFVuaXF1ZU9wdGlvbnM+IENyZWF0ZVVuaXF1ZU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFVuaXF1ZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFVuaXF1ZU9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgVW5pcXVlT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICBhdXRvIF9pZHhfb3V0X3R5cGUgPSBfby0+aWR4X291dF90eXBlOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVVbmlxdWVPcHRpb25zKAogICAgICAgX2ZiYiwKICAgICAgIF9pZHhfb3V0X3R5cGUpOwogfQogCi1pbmxpbmUgUmV2ZXJzZVYyT3B0aW9uc1QgKlJldmVyc2VWMk9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgUmV2ZXJzZVYyT3B0aW9uc1QgKlJldmVyc2VWMk9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxSZXZlcnNlVjJPcHRpb25zVD4obmV3IFJldmVyc2VWMk9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgUmV2ZXJzZVYyT3B0aW9uczo6VW5QYWNrVG8oUmV2ZXJzZVYyT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBSZXZlcnNlVjJPcHRpb25zOjpVblBhY2tUbyhSZXZlcnNlVjJPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXZlcnNlVjJPcHRpb25zPiBSZXZlcnNlVjJPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmV2ZXJzZVYyT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJldmVyc2VWMk9wdGlvbnM+IFJldmVyc2VWMk9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJldmVyc2VWMk9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVSZXZlcnNlVjJPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXZlcnNlVjJPcHRpb25zPiBDcmVhdGVSZXZlcnNlVjJPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmV2ZXJzZVYyT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJldmVyc2VWMk9wdGlvbnM+IENyZWF0ZVJldmVyc2VWMk9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJldmVyc2VWMk9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFJldmVyc2VWMk9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgUmV2ZXJzZVYyT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVSZXZlcnNlVjJPcHRpb25zKAogICAgICAgX2ZiYik7CiB9CiAKLWlubGluZSBBZGROT3B0aW9uc1QgKkFkZE5PcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIEFkZE5PcHRpb25zVCAqQWRkTk9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxBZGROT3B0aW9uc1Q+KG5ldyBBZGROT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBBZGROT3B0aW9uczo6VW5QYWNrVG8oQWRkTk9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgQWRkTk9wdGlvbnM6OlVuUGFja1RvKEFkZE5PcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBZGROT3B0aW9ucz4gQWRkTk9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBBZGROT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEFkZE5PcHRpb25zPiBBZGROT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQWRkTk9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVBZGROT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8QWRkTk9wdGlvbnM+IENyZWF0ZUFkZE5PcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQWRkTk9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBZGROT3B0aW9ucz4gQ3JlYXRlQWRkTk9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEFkZE5PcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBBZGROT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBBZGROT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVBZGROT3B0aW9ucygKICAgICAgIF9mYmIpOwogfQogCi1pbmxpbmUgR2F0aGVyTmRPcHRpb25zVCAqR2F0aGVyTmRPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIEdhdGhlck5kT3B0aW9uc1QgKkdhdGhlck5kT3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPEdhdGhlck5kT3B0aW9uc1Q+KG5ldyBHYXRoZXJOZE9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgR2F0aGVyTmRPcHRpb25zOjpVblBhY2tUbyhHYXRoZXJOZE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgR2F0aGVyTmRPcHRpb25zOjpVblBhY2tUbyhHYXRoZXJOZE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEdhdGhlck5kT3B0aW9ucz4gR2F0aGVyTmRPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgR2F0aGVyTmRPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8R2F0aGVyTmRPcHRpb25zPiBHYXRoZXJOZE9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEdhdGhlck5kT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZUdhdGhlck5kT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8R2F0aGVyTmRPcHRpb25zPiBDcmVhdGVHYXRoZXJOZE9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBHYXRoZXJOZE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxHYXRoZXJOZE9wdGlvbnM+IENyZWF0ZUdhdGhlck5kT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgR2F0aGVyTmRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBHYXRoZXJOZE9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgR2F0aGVyTmRPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZUdhdGhlck5kT3B0aW9ucygKICAgICAgIF9mYmIpOwogfQogCi1pbmxpbmUgV2hlcmVPcHRpb25zVCAqV2hlcmVPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIFdoZXJlT3B0aW9uc1QgKldoZXJlT3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFdoZXJlT3B0aW9uc1Q+KG5ldyBXaGVyZU9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgV2hlcmVPcHRpb25zOjpVblBhY2tUbyhXaGVyZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgV2hlcmVPcHRpb25zOjpVblBhY2tUbyhXaGVyZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFdoZXJlT3B0aW9ucz4gV2hlcmVPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgV2hlcmVPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8V2hlcmVPcHRpb25zPiBXaGVyZU9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFdoZXJlT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZVdoZXJlT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8V2hlcmVPcHRpb25zPiBDcmVhdGVXaGVyZU9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBXaGVyZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxXaGVyZU9wdGlvbnM+IENyZWF0ZVdoZXJlT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgV2hlcmVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBXaGVyZU9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgV2hlcmVPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZVdoZXJlT3B0aW9ucygKICAgICAgIF9mYmIpOwogfQogCi1pbmxpbmUgUmV2ZXJzZVNlcXVlbmNlT3B0aW9uc1QgKlJldmVyc2VTZXF1ZW5jZU9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgUmV2ZXJzZVNlcXVlbmNlT3B0aW9uc1QgKlJldmVyc2VTZXF1ZW5jZU9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxSZXZlcnNlU2VxdWVuY2VPcHRpb25zVD4obmV3IFJldmVyc2VTZXF1ZW5jZU9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgUmV2ZXJzZVNlcXVlbmNlT3B0aW9uczo6VW5QYWNrVG8oUmV2ZXJzZVNlcXVlbmNlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBSZXZlcnNlU2VxdWVuY2VPcHRpb25zOjpVblBhY2tUbyhSZXZlcnNlU2VxdWVuY2VPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogICB7IGF1dG8gX2UgPSBzZXFfZGltKCk7IF9vLT5zZXFfZGltID0gX2U7IH0KICAgeyBhdXRvIF9lID0gYmF0Y2hfZGltKCk7IF9vLT5iYXRjaF9kaW0gPSBfZTsgfQogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXZlcnNlU2VxdWVuY2VPcHRpb25zPiBSZXZlcnNlU2VxdWVuY2VPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmV2ZXJzZVNlcXVlbmNlT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJldmVyc2VTZXF1ZW5jZU9wdGlvbnM+IFJldmVyc2VTZXF1ZW5jZU9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJldmVyc2VTZXF1ZW5jZU9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVSZXZlcnNlU2VxdWVuY2VPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZXZlcnNlU2VxdWVuY2VPcHRpb25zPiBDcmVhdGVSZXZlcnNlU2VxdWVuY2VPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmV2ZXJzZVNlcXVlbmNlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJldmVyc2VTZXF1ZW5jZU9wdGlvbnM+IENyZWF0ZVJldmVyc2VTZXF1ZW5jZU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJldmVyc2VTZXF1ZW5jZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFJldmVyc2VTZXF1ZW5jZU9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgUmV2ZXJzZVNlcXVlbmNlT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICBhdXRvIF9zZXFfZGltID0gX28tPnNlcV9kaW07CiAgIGF1dG8gX2JhdGNoX2RpbSA9IF9vLT5iYXRjaF9kaW07CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZVJldmVyc2VTZXF1ZW5jZU9wdGlvbnMoCkBAIC0xNjM5Nyw5NiArMjAwNzUsOTYgQEAKICAgICAgIF9iYXRjaF9kaW0pOwogfQogCi1pbmxpbmUgTWF0cml4RGlhZ09wdGlvbnNUICpNYXRyaXhEaWFnT3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBNYXRyaXhEaWFnT3B0aW9uc1QgKk1hdHJpeERpYWdPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8TWF0cml4RGlhZ09wdGlvbnNUPihuZXcgTWF0cml4RGlhZ09wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgTWF0cml4RGlhZ09wdGlvbnM6OlVuUGFja1RvKE1hdHJpeERpYWdPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIE1hdHJpeERpYWdPcHRpb25zOjpVblBhY2tUbyhNYXRyaXhEaWFnT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TWF0cml4RGlhZ09wdGlvbnM+IE1hdHJpeERpYWdPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTWF0cml4RGlhZ09wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNYXRyaXhEaWFnT3B0aW9ucz4gTWF0cml4RGlhZ09wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE1hdHJpeERpYWdPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlTWF0cml4RGlhZ09wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PE1hdHJpeERpYWdPcHRpb25zPiBDcmVhdGVNYXRyaXhEaWFnT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE1hdHJpeERpYWdPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TWF0cml4RGlhZ09wdGlvbnM+IENyZWF0ZU1hdHJpeERpYWdPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBNYXRyaXhEaWFnT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgTWF0cml4RGlhZ09wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgTWF0cml4RGlhZ09wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlTWF0cml4RGlhZ09wdGlvbnMoCiAgICAgICBfZmJiKTsKIH0KIAotaW5saW5lIFF1YW50aXplT3B0aW9uc1QgKlF1YW50aXplT3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBRdWFudGl6ZU9wdGlvbnNUICpRdWFudGl6ZU9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxRdWFudGl6ZU9wdGlvbnNUPihuZXcgUXVhbnRpemVPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIFF1YW50aXplT3B0aW9uczo6VW5QYWNrVG8oUXVhbnRpemVPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIFF1YW50aXplT3B0aW9uczo6VW5QYWNrVG8oUXVhbnRpemVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxRdWFudGl6ZU9wdGlvbnM+IFF1YW50aXplT3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFF1YW50aXplT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFF1YW50aXplT3B0aW9ucz4gUXVhbnRpemVPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBRdWFudGl6ZU9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVRdWFudGl6ZU9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFF1YW50aXplT3B0aW9ucz4gQ3JlYXRlUXVhbnRpemVPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUXVhbnRpemVPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UXVhbnRpemVPcHRpb25zPiBDcmVhdGVRdWFudGl6ZU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFF1YW50aXplT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgUXVhbnRpemVPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFF1YW50aXplT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVRdWFudGl6ZU9wdGlvbnMoCiAgICAgICBfZmJiKTsKIH0KIAotaW5saW5lIE1hdHJpeFNldERpYWdPcHRpb25zVCAqTWF0cml4U2V0RGlhZ09wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgTWF0cml4U2V0RGlhZ09wdGlvbnNUICpNYXRyaXhTZXREaWFnT3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPE1hdHJpeFNldERpYWdPcHRpb25zVD4obmV3IE1hdHJpeFNldERpYWdPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIE1hdHJpeFNldERpYWdPcHRpb25zOjpVblBhY2tUbyhNYXRyaXhTZXREaWFnT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBNYXRyaXhTZXREaWFnT3B0aW9uczo6VW5QYWNrVG8oTWF0cml4U2V0RGlhZ09wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PE1hdHJpeFNldERpYWdPcHRpb25zPiBNYXRyaXhTZXREaWFnT3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE1hdHJpeFNldERpYWdPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TWF0cml4U2V0RGlhZ09wdGlvbnM+IE1hdHJpeFNldERpYWdPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBNYXRyaXhTZXREaWFnT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZU1hdHJpeFNldERpYWdPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNYXRyaXhTZXREaWFnT3B0aW9ucz4gQ3JlYXRlTWF0cml4U2V0RGlhZ09wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBNYXRyaXhTZXREaWFnT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE1hdHJpeFNldERpYWdPcHRpb25zPiBDcmVhdGVNYXRyaXhTZXREaWFnT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTWF0cml4U2V0RGlhZ09wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IE1hdHJpeFNldERpYWdPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IE1hdHJpeFNldERpYWdPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZU1hdHJpeFNldERpYWdPcHRpb25zKAogICAgICAgX2ZiYik7CiB9CiAKLWlubGluZSBJZk9wdGlvbnNUICpJZk9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgSWZPcHRpb25zVCAqSWZPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8SWZPcHRpb25zVD4obmV3IElmT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBJZk9wdGlvbnM6OlVuUGFja1RvKElmT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBJZk9wdGlvbnM6OlVuUGFja1RvKElmT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKICAgeyBhdXRvIF9lID0gdGhlbl9zdWJncmFwaF9pbmRleCgpOyBfby0+dGhlbl9zdWJncmFwaF9pbmRleCA9IF9lOyB9CiAgIHsgYXV0byBfZSA9IGVsc2Vfc3ViZ3JhcGhfaW5kZXgoKTsgX28tPmVsc2Vfc3ViZ3JhcGhfaW5kZXggPSBfZTsgfQogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxJZk9wdGlvbnM+IElmT3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IElmT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PElmT3B0aW9ucz4gSWZPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBJZk9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVJZk9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PElmT3B0aW9ucz4gQ3JlYXRlSWZPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSWZPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8SWZPcHRpb25zPiBDcmVhdGVJZk9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IElmT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgSWZPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IElmT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICBhdXRvIF90aGVuX3N1YmdyYXBoX2luZGV4ID0gX28tPnRoZW5fc3ViZ3JhcGhfaW5kZXg7CiAgIGF1dG8gX2Vsc2Vfc3ViZ3JhcGhfaW5kZXggPSBfby0+ZWxzZV9zdWJncmFwaF9pbmRleDsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlSWZPcHRpb25zKApAQCAtMTY0OTUsNTMgKzIwMTczLDUzIEBACiAgICAgICBfZWxzZV9zdWJncmFwaF9pbmRleCk7CiB9CiAKLWlubGluZSBDYWxsT25jZU9wdGlvbnNUICpDYWxsT25jZU9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgQ2FsbE9uY2VPcHRpb25zVCAqQ2FsbE9uY2VPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8Q2FsbE9uY2VPcHRpb25zVD4obmV3IENhbGxPbmNlT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBDYWxsT25jZU9wdGlvbnM6OlVuUGFja1RvKENhbGxPbmNlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBDYWxsT25jZU9wdGlvbnM6OlVuUGFja1RvKENhbGxPbmNlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKICAgeyBhdXRvIF9lID0gaW5pdF9zdWJncmFwaF9pbmRleCgpOyBfby0+aW5pdF9zdWJncmFwaF9pbmRleCA9IF9lOyB9CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PENhbGxPbmNlT3B0aW9ucz4gQ2FsbE9uY2VPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQ2FsbE9uY2VPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Q2FsbE9uY2VPcHRpb25zPiBDYWxsT25jZU9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IENhbGxPbmNlT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZUNhbGxPbmNlT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8Q2FsbE9uY2VPcHRpb25zPiBDcmVhdGVDYWxsT25jZU9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBDYWxsT25jZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDYWxsT25jZU9wdGlvbnM+IENyZWF0ZUNhbGxPbmNlT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQ2FsbE9uY2VPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBDYWxsT25jZU9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgQ2FsbE9uY2VPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIGF1dG8gX2luaXRfc3ViZ3JhcGhfaW5kZXggPSBfby0+aW5pdF9zdWJncmFwaF9pbmRleDsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlQ2FsbE9uY2VPcHRpb25zKAogICAgICAgX2ZiYiwKICAgICAgIF9pbml0X3N1YmdyYXBoX2luZGV4KTsKIH0KIAotaW5saW5lIFdoaWxlT3B0aW9uc1QgKldoaWxlT3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBXaGlsZU9wdGlvbnNUICpXaGlsZU9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxXaGlsZU9wdGlvbnNUPihuZXcgV2hpbGVPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIFdoaWxlT3B0aW9uczo6VW5QYWNrVG8oV2hpbGVPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIFdoaWxlT3B0aW9uczo6VW5QYWNrVG8oV2hpbGVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogICB7IGF1dG8gX2UgPSBjb25kX3N1YmdyYXBoX2luZGV4KCk7IF9vLT5jb25kX3N1YmdyYXBoX2luZGV4ID0gX2U7IH0KICAgeyBhdXRvIF9lID0gYm9keV9zdWJncmFwaF9pbmRleCgpOyBfby0+Ym9keV9zdWJncmFwaF9pbmRleCA9IF9lOyB9CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFdoaWxlT3B0aW9ucz4gV2hpbGVPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgV2hpbGVPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8V2hpbGVPcHRpb25zPiBXaGlsZU9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFdoaWxlT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZVdoaWxlT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8V2hpbGVPcHRpb25zPiBDcmVhdGVXaGlsZU9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBXaGlsZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxXaGlsZU9wdGlvbnM+IENyZWF0ZVdoaWxlT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgV2hpbGVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBXaGlsZU9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgV2hpbGVPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIGF1dG8gX2NvbmRfc3ViZ3JhcGhfaW5kZXggPSBfby0+Y29uZF9zdWJncmFwaF9pbmRleDsKICAgYXV0byBfYm9keV9zdWJncmFwaF9pbmRleCA9IF9vLT5ib2R5X3N1YmdyYXBoX2luZGV4OwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVXaGlsZU9wdGlvbnMoCkBAIC0xNjU1MCwxNTEgKzIwMjI4LDE1MSBAQAogICAgICAgX2JvZHlfc3ViZ3JhcGhfaW5kZXgpOwogfQogCi1pbmxpbmUgTm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnNUICpOb25NYXhTdXBwcmVzc2lvblY0T3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBOb25NYXhTdXBwcmVzc2lvblY0T3B0aW9uc1QgKk5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8Tm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnNUPihuZXcgTm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgTm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnM6OlVuUGFja1RvKE5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIE5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zOjpVblBhY2tUbyhOb25NYXhTdXBwcmVzc2lvblY0T3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8Tm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnM+IE5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxOb25NYXhTdXBwcmVzc2lvblY0T3B0aW9ucz4gTm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlTm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PE5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zPiBDcmVhdGVOb25NYXhTdXBwcmVzc2lvblY0T3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Tm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnM+IENyZWF0ZU5vbk1heFN1cHByZXNzaW9uVjRPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBOb25NYXhTdXBwcmVzc2lvblY0T3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgTm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgTm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlTm9uTWF4U3VwcHJlc3Npb25WNE9wdGlvbnMoCiAgICAgICBfZmJiKTsKIH0KIAotaW5saW5lIE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zVCAqTm9uTWF4U3VwcHJlc3Npb25WNU9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgTm9uTWF4U3VwcHJlc3Npb25WNU9wdGlvbnNUICpOb25NYXhTdXBwcmVzc2lvblY1T3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zVD4obmV3IE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zOjpVblBhY2tUbyhOb25NYXhTdXBwcmVzc2lvblY1T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBOb25NYXhTdXBwcmVzc2lvblY1T3B0aW9uczo6VW5QYWNrVG8oTm9uTWF4U3VwcHJlc3Npb25WNU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zPiBOb25NYXhTdXBwcmVzc2lvblY1T3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Tm9uTWF4U3VwcHJlc3Npb25WNU9wdGlvbnM+IE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBOb25NYXhTdXBwcmVzc2lvblY1T3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZU5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxOb25NYXhTdXBwcmVzc2lvblY1T3B0aW9ucz4gQ3JlYXRlTm9uTWF4U3VwcHJlc3Npb25WNU9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBOb25NYXhTdXBwcmVzc2lvblY1T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zPiBDcmVhdGVOb25NYXhTdXBwcmVzc2lvblY1T3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTm9uTWF4U3VwcHJlc3Npb25WNU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IE5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZU5vbk1heFN1cHByZXNzaW9uVjVPcHRpb25zKAogICAgICAgX2ZiYik7CiB9CiAKLWlubGluZSBTY2F0dGVyTmRPcHRpb25zVCAqU2NhdHRlck5kT3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBTY2F0dGVyTmRPcHRpb25zVCAqU2NhdHRlck5kT3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFNjYXR0ZXJOZE9wdGlvbnNUPihuZXcgU2NhdHRlck5kT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBTY2F0dGVyTmRPcHRpb25zOjpVblBhY2tUbyhTY2F0dGVyTmRPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIFNjYXR0ZXJOZE9wdGlvbnM6OlVuUGFja1RvKFNjYXR0ZXJOZE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNjYXR0ZXJOZE9wdGlvbnM+IFNjYXR0ZXJOZE9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTY2F0dGVyTmRPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U2NhdHRlck5kT3B0aW9ucz4gU2NhdHRlck5kT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU2NhdHRlck5kT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZVNjYXR0ZXJOZE9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNjYXR0ZXJOZE9wdGlvbnM+IENyZWF0ZVNjYXR0ZXJOZE9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTY2F0dGVyTmRPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U2NhdHRlck5kT3B0aW9ucz4gQ3JlYXRlU2NhdHRlck5kT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU2NhdHRlck5kT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgU2NhdHRlck5kT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBTY2F0dGVyTmRPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZVNjYXR0ZXJOZE9wdGlvbnMoCiAgICAgICBfZmJiKTsKIH0KIAotaW5saW5lIFNlbGVjdFYyT3B0aW9uc1QgKlNlbGVjdFYyT3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBTZWxlY3RWMk9wdGlvbnNUICpTZWxlY3RWMk9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxTZWxlY3RWMk9wdGlvbnNUPihuZXcgU2VsZWN0VjJPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIFNlbGVjdFYyT3B0aW9uczo6VW5QYWNrVG8oU2VsZWN0VjJPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIFNlbGVjdFYyT3B0aW9uczo6VW5QYWNrVG8oU2VsZWN0VjJPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTZWxlY3RWMk9wdGlvbnM+IFNlbGVjdFYyT3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNlbGVjdFYyT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNlbGVjdFYyT3B0aW9ucz4gU2VsZWN0VjJPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTZWxlY3RWMk9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVTZWxlY3RWMk9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNlbGVjdFYyT3B0aW9ucz4gQ3JlYXRlU2VsZWN0VjJPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU2VsZWN0VjJPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U2VsZWN0VjJPcHRpb25zPiBDcmVhdGVTZWxlY3RWMk9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNlbGVjdFYyT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgU2VsZWN0VjJPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFNlbGVjdFYyT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVTZWxlY3RWMk9wdGlvbnMoCiAgICAgICBfZmJiKTsKIH0KIAotaW5saW5lIERlbnNpZnlPcHRpb25zVCAqRGVuc2lmeU9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgRGVuc2lmeU9wdGlvbnNUICpEZW5zaWZ5T3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPERlbnNpZnlPcHRpb25zVD4obmV3IERlbnNpZnlPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIERlbnNpZnlPcHRpb25zOjpVblBhY2tUbyhEZW5zaWZ5T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBEZW5zaWZ5T3B0aW9uczo6VW5QYWNrVG8oRGVuc2lmeU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PERlbnNpZnlPcHRpb25zPiBEZW5zaWZ5T3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IERlbnNpZnlPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8RGVuc2lmeU9wdGlvbnM+IERlbnNpZnlPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBEZW5zaWZ5T3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZURlbnNpZnlPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxEZW5zaWZ5T3B0aW9ucz4gQ3JlYXRlRGVuc2lmeU9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBEZW5zaWZ5T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PERlbnNpZnlPcHRpb25zPiBDcmVhdGVEZW5zaWZ5T3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRGVuc2lmeU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IERlbnNpZnlPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IERlbnNpZnlPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZURlbnNpZnlPcHRpb25zKAogICAgICAgX2ZiYik7CiB9CiAKLWlubGluZSBTZWdtZW50U3VtT3B0aW9uc1QgKlNlZ21lbnRTdW1PcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIFNlZ21lbnRTdW1PcHRpb25zVCAqU2VnbWVudFN1bU9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxTZWdtZW50U3VtT3B0aW9uc1Q+KG5ldyBTZWdtZW50U3VtT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBTZWdtZW50U3VtT3B0aW9uczo6VW5QYWNrVG8oU2VnbWVudFN1bU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgU2VnbWVudFN1bU9wdGlvbnM6OlVuUGFja1RvKFNlZ21lbnRTdW1PcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTZWdtZW50U3VtT3B0aW9ucz4gU2VnbWVudFN1bU9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTZWdtZW50U3VtT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNlZ21lbnRTdW1PcHRpb25zPiBTZWdtZW50U3VtT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU2VnbWVudFN1bU9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVTZWdtZW50U3VtT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U2VnbWVudFN1bU9wdGlvbnM+IENyZWF0ZVNlZ21lbnRTdW1PcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU2VnbWVudFN1bU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTZWdtZW50U3VtT3B0aW9ucz4gQ3JlYXRlU2VnbWVudFN1bU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNlZ21lbnRTdW1PcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBTZWdtZW50U3VtT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBTZWdtZW50U3VtT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVTZWdtZW50U3VtT3B0aW9ucygKICAgICAgIF9mYmIpOwogfQogCi1pbmxpbmUgQmF0Y2hNYXRNdWxPcHRpb25zVCAqQmF0Y2hNYXRNdWxPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIEJhdGNoTWF0TXVsT3B0aW9uc1QgKkJhdGNoTWF0TXVsT3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPEJhdGNoTWF0TXVsT3B0aW9uc1Q+KG5ldyBCYXRjaE1hdE11bE9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgQmF0Y2hNYXRNdWxPcHRpb25zOjpVblBhY2tUbyhCYXRjaE1hdE11bE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgQmF0Y2hNYXRNdWxPcHRpb25zOjpVblBhY2tUbyhCYXRjaE1hdE11bE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiAgIHsgYXV0byBfZSA9IGFkal94KCk7IF9vLT5hZGpfeCA9IF9lOyB9CkBAIC0xNjcwMiwxNCArMjAzODAsMTQgQEAKICAgeyBhdXRvIF9lID0gYXN5bW1ldHJpY19xdWFudGl6ZV9pbnB1dHMoKTsgX28tPmFzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzID0gX2U7IH0KIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8QmF0Y2hNYXRNdWxPcHRpb25zPiBCYXRjaE1hdE11bE9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBCYXRjaE1hdE11bE9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCYXRjaE1hdE11bE9wdGlvbnM+IEJhdGNoTWF0TXVsT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQmF0Y2hNYXRNdWxPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlQmF0Y2hNYXRNdWxPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCYXRjaE1hdE11bE9wdGlvbnM+IENyZWF0ZUJhdGNoTWF0TXVsT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEJhdGNoTWF0TXVsT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEJhdGNoTWF0TXVsT3B0aW9ucz4gQ3JlYXRlQmF0Y2hNYXRNdWxPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBCYXRjaE1hdE11bE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IEJhdGNoTWF0TXVsT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBCYXRjaE1hdE11bE9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgYXV0byBfYWRqX3ggPSBfby0+YWRqX3g7CiAgIGF1dG8gX2Fkal95ID0gX28tPmFkal95OwogICBhdXRvIF9hc3ltbWV0cmljX3F1YW50aXplX2lucHV0cyA9IF9vLT5hc3ltbWV0cmljX3F1YW50aXplX2lucHV0czsKQEAgLTE2NzIwLDI3ICsyMDM5OCwyNyBAQAogICAgICAgX2FzeW1tZXRyaWNfcXVhbnRpemVfaW5wdXRzKTsKIH0KIAotaW5saW5lIEN1bXN1bU9wdGlvbnNUICpDdW1zdW1PcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIEN1bXN1bU9wdGlvbnNUICpDdW1zdW1PcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8Q3Vtc3VtT3B0aW9uc1Q+KG5ldyBDdW1zdW1PcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIEN1bXN1bU9wdGlvbnM6OlVuUGFja1RvKEN1bXN1bU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgQ3Vtc3VtT3B0aW9uczo6VW5QYWNrVG8oQ3Vtc3VtT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKICAgeyBhdXRvIF9lID0gZXhjbHVzaXZlKCk7IF9vLT5leGNsdXNpdmUgPSBfZTsgfQogICB7IGF1dG8gX2UgPSByZXZlcnNlKCk7IF9vLT5yZXZlcnNlID0gX2U7IH0KIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8Q3Vtc3VtT3B0aW9ucz4gQ3Vtc3VtT3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEN1bXN1bU9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDdW1zdW1PcHRpb25zPiBDdW1zdW1PcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBDdW1zdW1PcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlQ3Vtc3VtT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8Q3Vtc3VtT3B0aW9ucz4gQ3JlYXRlQ3Vtc3VtT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEN1bXN1bU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxDdW1zdW1PcHRpb25zPiBDcmVhdGVDdW1zdW1PcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBDdW1zdW1PcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBDdW1zdW1PcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IEN1bXN1bU9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgYXV0byBfZXhjbHVzaXZlID0gX28tPmV4Y2x1c2l2ZTsKICAgYXV0byBfcmV2ZXJzZSA9IF9vLT5yZXZlcnNlOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVDdW1zdW1PcHRpb25zKApAQCAtMTY3NDksNTkgKzIwNDI3LDU5IEBACiAgICAgICBfcmV2ZXJzZSk7CiB9CiAKLWlubGluZSBCcm9hZGNhc3RUb09wdGlvbnNUICpCcm9hZGNhc3RUb09wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgQnJvYWRjYXN0VG9PcHRpb25zVCAqQnJvYWRjYXN0VG9PcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8QnJvYWRjYXN0VG9PcHRpb25zVD4obmV3IEJyb2FkY2FzdFRvT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBCcm9hZGNhc3RUb09wdGlvbnM6OlVuUGFja1RvKEJyb2FkY2FzdFRvT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBCcm9hZGNhc3RUb09wdGlvbnM6OlVuUGFja1RvKEJyb2FkY2FzdFRvT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8QnJvYWRjYXN0VG9PcHRpb25zPiBCcm9hZGNhc3RUb09wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBCcm9hZGNhc3RUb09wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCcm9hZGNhc3RUb09wdGlvbnM+IEJyb2FkY2FzdFRvT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQnJvYWRjYXN0VG9PcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlQnJvYWRjYXN0VG9PcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCcm9hZGNhc3RUb09wdGlvbnM+IENyZWF0ZUJyb2FkY2FzdFRvT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEJyb2FkY2FzdFRvT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEJyb2FkY2FzdFRvT3B0aW9ucz4gQ3JlYXRlQnJvYWRjYXN0VG9PcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBCcm9hZGNhc3RUb09wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IEJyb2FkY2FzdFRvT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBCcm9hZGNhc3RUb09wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlQnJvYWRjYXN0VG9PcHRpb25zKAogICAgICAgX2ZiYik7CiB9CiAKLWlubGluZSBSZmZ0MmRPcHRpb25zVCAqUmZmdDJkT3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBSZmZ0MmRPcHRpb25zVCAqUmZmdDJkT3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFJmZnQyZE9wdGlvbnNUPihuZXcgUmZmdDJkT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBSZmZ0MmRPcHRpb25zOjpVblBhY2tUbyhSZmZ0MmRPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIFJmZnQyZE9wdGlvbnM6OlVuUGFja1RvKFJmZnQyZE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFJmZnQyZE9wdGlvbnM+IFJmZnQyZE9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBSZmZ0MmRPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UmZmdDJkT3B0aW9ucz4gUmZmdDJkT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmZmdDJkT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZVJmZnQyZE9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFJmZnQyZE9wdGlvbnM+IENyZWF0ZVJmZnQyZE9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBSZmZ0MmRPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UmZmdDJkT3B0aW9ucz4gQ3JlYXRlUmZmdDJkT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmZmdDJkT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgUmZmdDJkT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBSZmZ0MmRPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZVJmZnQyZE9wdGlvbnMoCiAgICAgICBfZmJiKTsKIH0KIAotaW5saW5lIEhhc2h0YWJsZU9wdGlvbnNUICpIYXNodGFibGVPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIEhhc2h0YWJsZU9wdGlvbnNUICpIYXNodGFibGVPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8SGFzaHRhYmxlT3B0aW9uc1Q+KG5ldyBIYXNodGFibGVPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIEhhc2h0YWJsZU9wdGlvbnM6OlVuUGFja1RvKEhhc2h0YWJsZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgSGFzaHRhYmxlT3B0aW9uczo6VW5QYWNrVG8oSGFzaHRhYmxlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKICAgeyBhdXRvIF9lID0gdGFibGVfaWQoKTsgX28tPnRhYmxlX2lkID0gX2U7IH0KQEAgLTE2ODA5LDE0ICsyMDQ4NywxNCBAQAogICB7IGF1dG8gX2UgPSB2YWx1ZV9kdHlwZSgpOyBfby0+dmFsdWVfZHR5cGUgPSBfZTsgfQogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxIYXNodGFibGVPcHRpb25zPiBIYXNodGFibGVPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSGFzaHRhYmxlT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEhhc2h0YWJsZU9wdGlvbnM+IEhhc2h0YWJsZU9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEhhc2h0YWJsZU9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVIYXNodGFibGVPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxIYXNodGFibGVPcHRpb25zPiBDcmVhdGVIYXNodGFibGVPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSGFzaHRhYmxlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEhhc2h0YWJsZU9wdGlvbnM+IENyZWF0ZUhhc2h0YWJsZU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEhhc2h0YWJsZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IEhhc2h0YWJsZU9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgSGFzaHRhYmxlT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICBhdXRvIF90YWJsZV9pZCA9IF9vLT50YWJsZV9pZDsKICAgYXV0byBfa2V5X2R0eXBlID0gX28tPmtleV9kdHlwZTsKICAgYXV0byBfdmFsdWVfZHR5cGUgPSBfby0+dmFsdWVfZHR5cGU7CkBAIC0xNjgyNyw5NiArMjA1MDUsOTYgQEAKICAgICAgIF92YWx1ZV9kdHlwZSk7CiB9CiAKLWlubGluZSBIYXNodGFibGVGaW5kT3B0aW9uc1QgKkhhc2h0YWJsZUZpbmRPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIEhhc2h0YWJsZUZpbmRPcHRpb25zVCAqSGFzaHRhYmxlRmluZE9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxIYXNodGFibGVGaW5kT3B0aW9uc1Q+KG5ldyBIYXNodGFibGVGaW5kT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBIYXNodGFibGVGaW5kT3B0aW9uczo6VW5QYWNrVG8oSGFzaHRhYmxlRmluZE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgSGFzaHRhYmxlRmluZE9wdGlvbnM6OlVuUGFja1RvKEhhc2h0YWJsZUZpbmRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxIYXNodGFibGVGaW5kT3B0aW9ucz4gSGFzaHRhYmxlRmluZE9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBIYXNodGFibGVGaW5kT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEhhc2h0YWJsZUZpbmRPcHRpb25zPiBIYXNodGFibGVGaW5kT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSGFzaHRhYmxlRmluZE9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVIYXNodGFibGVGaW5kT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8SGFzaHRhYmxlRmluZE9wdGlvbnM+IENyZWF0ZUhhc2h0YWJsZUZpbmRPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSGFzaHRhYmxlRmluZE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxIYXNodGFibGVGaW5kT3B0aW9ucz4gQ3JlYXRlSGFzaHRhYmxlRmluZE9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEhhc2h0YWJsZUZpbmRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBIYXNodGFibGVGaW5kT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBIYXNodGFibGVGaW5kT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVIYXNodGFibGVGaW5kT3B0aW9ucygKICAgICAgIF9mYmIpOwogfQogCi1pbmxpbmUgSGFzaHRhYmxlSW1wb3J0T3B0aW9uc1QgKkhhc2h0YWJsZUltcG9ydE9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgSGFzaHRhYmxlSW1wb3J0T3B0aW9uc1QgKkhhc2h0YWJsZUltcG9ydE9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxIYXNodGFibGVJbXBvcnRPcHRpb25zVD4obmV3IEhhc2h0YWJsZUltcG9ydE9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgSGFzaHRhYmxlSW1wb3J0T3B0aW9uczo6VW5QYWNrVG8oSGFzaHRhYmxlSW1wb3J0T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBIYXNodGFibGVJbXBvcnRPcHRpb25zOjpVblBhY2tUbyhIYXNodGFibGVJbXBvcnRPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxIYXNodGFibGVJbXBvcnRPcHRpb25zPiBIYXNodGFibGVJbXBvcnRPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSGFzaHRhYmxlSW1wb3J0T3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEhhc2h0YWJsZUltcG9ydE9wdGlvbnM+IEhhc2h0YWJsZUltcG9ydE9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEhhc2h0YWJsZUltcG9ydE9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVIYXNodGFibGVJbXBvcnRPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxIYXNodGFibGVJbXBvcnRPcHRpb25zPiBDcmVhdGVIYXNodGFibGVJbXBvcnRPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSGFzaHRhYmxlSW1wb3J0T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEhhc2h0YWJsZUltcG9ydE9wdGlvbnM+IENyZWF0ZUhhc2h0YWJsZUltcG9ydE9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEhhc2h0YWJsZUltcG9ydE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IEhhc2h0YWJsZUltcG9ydE9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgSGFzaHRhYmxlSW1wb3J0T3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVIYXNodGFibGVJbXBvcnRPcHRpb25zKAogICAgICAgX2ZiYik7CiB9CiAKLWlubGluZSBIYXNodGFibGVTaXplT3B0aW9uc1QgKkhhc2h0YWJsZVNpemVPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIEhhc2h0YWJsZVNpemVPcHRpb25zVCAqSGFzaHRhYmxlU2l6ZU9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxIYXNodGFibGVTaXplT3B0aW9uc1Q+KG5ldyBIYXNodGFibGVTaXplT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBIYXNodGFibGVTaXplT3B0aW9uczo6VW5QYWNrVG8oSGFzaHRhYmxlU2l6ZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgSGFzaHRhYmxlU2l6ZU9wdGlvbnM6OlVuUGFja1RvKEhhc2h0YWJsZVNpemVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxIYXNodGFibGVTaXplT3B0aW9ucz4gSGFzaHRhYmxlU2l6ZU9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBIYXNodGFibGVTaXplT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEhhc2h0YWJsZVNpemVPcHRpb25zPiBIYXNodGFibGVTaXplT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSGFzaHRhYmxlU2l6ZU9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVIYXNodGFibGVTaXplT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8SGFzaHRhYmxlU2l6ZU9wdGlvbnM+IENyZWF0ZUhhc2h0YWJsZVNpemVPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgSGFzaHRhYmxlU2l6ZU9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxIYXNodGFibGVTaXplT3B0aW9ucz4gQ3JlYXRlSGFzaHRhYmxlU2l6ZU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEhhc2h0YWJsZVNpemVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBIYXNodGFibGVTaXplT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBIYXNodGFibGVTaXplT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVIYXNodGFibGVTaXplT3B0aW9ucygKICAgICAgIF9mYmIpOwogfQogCi1pbmxpbmUgVmFySGFuZGxlT3B0aW9uc1QgKlZhckhhbmRsZU9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgVmFySGFuZGxlT3B0aW9uc1QgKlZhckhhbmRsZU9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxWYXJIYW5kbGVPcHRpb25zVD4obmV3IFZhckhhbmRsZU9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgVmFySGFuZGxlT3B0aW9uczo6VW5QYWNrVG8oVmFySGFuZGxlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBWYXJIYW5kbGVPcHRpb25zOjpVblBhY2tUbyhWYXJIYW5kbGVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogICB7IGF1dG8gX2UgPSBjb250YWluZXIoKTsgaWYgKF9lKSBfby0+Y29udGFpbmVyID0gX2UtPnN0cigpOyB9CiAgIHsgYXV0byBfZSA9IHNoYXJlZF9uYW1lKCk7IGlmIChfZSkgX28tPnNoYXJlZF9uYW1lID0gX2UtPnN0cigpOyB9CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFZhckhhbmRsZU9wdGlvbnM+IFZhckhhbmRsZU9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBWYXJIYW5kbGVPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VmFySGFuZGxlT3B0aW9ucz4gVmFySGFuZGxlT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVmFySGFuZGxlT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZVZhckhhbmRsZU9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFZhckhhbmRsZU9wdGlvbnM+IENyZWF0ZVZhckhhbmRsZU9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBWYXJIYW5kbGVPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VmFySGFuZGxlT3B0aW9ucz4gQ3JlYXRlVmFySGFuZGxlT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVmFySGFuZGxlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgVmFySGFuZGxlT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBWYXJIYW5kbGVPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIGF1dG8gX2NvbnRhaW5lciA9IF9vLT5jb250YWluZXIuZW1wdHkoKSA/IDAgOiBfZmJiLkNyZWF0ZVN0cmluZyhfby0+Y29udGFpbmVyKTsKICAgYXV0byBfc2hhcmVkX25hbWUgPSBfby0+c2hhcmVkX25hbWUuZW1wdHkoKSA/IDAgOiBfZmJiLkNyZWF0ZVN0cmluZyhfby0+c2hhcmVkX25hbWUpOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVWYXJIYW5kbGVPcHRpb25zKApAQCAtMTY5MjUsNzMgKzIwNjAzLDczIEBACiAgICAgICBfc2hhcmVkX25hbWUpOwogfQogCi1pbmxpbmUgUmVhZFZhcmlhYmxlT3B0aW9uc1QgKlJlYWRWYXJpYWJsZU9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgUmVhZFZhcmlhYmxlT3B0aW9uc1QgKlJlYWRWYXJpYWJsZU9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxSZWFkVmFyaWFibGVPcHRpb25zVD4obmV3IFJlYWRWYXJpYWJsZU9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgUmVhZFZhcmlhYmxlT3B0aW9uczo6VW5QYWNrVG8oUmVhZFZhcmlhYmxlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBSZWFkVmFyaWFibGVPcHRpb25zOjpVblBhY2tUbyhSZWFkVmFyaWFibGVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZWFkVmFyaWFibGVPcHRpb25zPiBSZWFkVmFyaWFibGVPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmVhZFZhcmlhYmxlT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJlYWRWYXJpYWJsZU9wdGlvbnM+IFJlYWRWYXJpYWJsZU9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJlYWRWYXJpYWJsZU9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVSZWFkVmFyaWFibGVPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSZWFkVmFyaWFibGVPcHRpb25zPiBDcmVhdGVSZWFkVmFyaWFibGVPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmVhZFZhcmlhYmxlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJlYWRWYXJpYWJsZU9wdGlvbnM+IENyZWF0ZVJlYWRWYXJpYWJsZU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJlYWRWYXJpYWJsZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFJlYWRWYXJpYWJsZU9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgUmVhZFZhcmlhYmxlT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVSZWFkVmFyaWFibGVPcHRpb25zKAogICAgICAgX2ZiYik7CiB9CiAKLWlubGluZSBBc3NpZ25WYXJpYWJsZU9wdGlvbnNUICpBc3NpZ25WYXJpYWJsZU9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgQXNzaWduVmFyaWFibGVPcHRpb25zVCAqQXNzaWduVmFyaWFibGVPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8QXNzaWduVmFyaWFibGVPcHRpb25zVD4obmV3IEFzc2lnblZhcmlhYmxlT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBBc3NpZ25WYXJpYWJsZU9wdGlvbnM6OlVuUGFja1RvKEFzc2lnblZhcmlhYmxlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBBc3NpZ25WYXJpYWJsZU9wdGlvbnM6OlVuUGFja1RvKEFzc2lnblZhcmlhYmxlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8QXNzaWduVmFyaWFibGVPcHRpb25zPiBBc3NpZ25WYXJpYWJsZU9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBBc3NpZ25WYXJpYWJsZU9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBc3NpZ25WYXJpYWJsZU9wdGlvbnM+IEFzc2lnblZhcmlhYmxlT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQXNzaWduVmFyaWFibGVPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlQXNzaWduVmFyaWFibGVPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBc3NpZ25WYXJpYWJsZU9wdGlvbnM+IENyZWF0ZUFzc2lnblZhcmlhYmxlT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEFzc2lnblZhcmlhYmxlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEFzc2lnblZhcmlhYmxlT3B0aW9ucz4gQ3JlYXRlQXNzaWduVmFyaWFibGVPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBBc3NpZ25WYXJpYWJsZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IEFzc2lnblZhcmlhYmxlT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBBc3NpZ25WYXJpYWJsZU9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlQXNzaWduVmFyaWFibGVPcHRpb25zKAogICAgICAgX2ZiYik7CiB9CiAKLWlubGluZSBSYW5kb21PcHRpb25zVCAqUmFuZG9tT3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBSYW5kb21PcHRpb25zVCAqUmFuZG9tT3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFJhbmRvbU9wdGlvbnNUPihuZXcgUmFuZG9tT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBSYW5kb21PcHRpb25zOjpVblBhY2tUbyhSYW5kb21PcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIFJhbmRvbU9wdGlvbnM6OlVuUGFja1RvKFJhbmRvbU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiAgIHsgYXV0byBfZSA9IHNlZWQoKTsgX28tPnNlZWQgPSBfZTsgfQogICB7IGF1dG8gX2UgPSBzZWVkMigpOyBfby0+c2VlZDIgPSBfZTsgfQogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSYW5kb21PcHRpb25zPiBSYW5kb21PcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmFuZG9tT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJhbmRvbU9wdGlvbnM+IFJhbmRvbU9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJhbmRvbU9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVSYW5kb21PcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSYW5kb21PcHRpb25zPiBDcmVhdGVSYW5kb21PcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmFuZG9tT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFJhbmRvbU9wdGlvbnM+IENyZWF0ZVJhbmRvbU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJhbmRvbU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFJhbmRvbU9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgUmFuZG9tT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICBhdXRvIF9zZWVkID0gX28tPnNlZWQ7CiAgIGF1dG8gX3NlZWQyID0gX28tPnNlZWQyOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVSYW5kb21PcHRpb25zKApAQCAtMTcwMDAsMjk1ICsyMDY3OCwzNDQgQEAKICAgICAgIF9zZWVkMik7CiB9CiAKLWlubGluZSBCdWNrZXRpemVPcHRpb25zVCAqQnVja2V0aXplT3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBCdWNrZXRpemVPcHRpb25zVCAqQnVja2V0aXplT3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPEJ1Y2tldGl6ZU9wdGlvbnNUPihuZXcgQnVja2V0aXplT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBCdWNrZXRpemVPcHRpb25zOjpVblBhY2tUbyhCdWNrZXRpemVPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIEJ1Y2tldGl6ZU9wdGlvbnM6OlVuUGFja1RvKEJ1Y2tldGl6ZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7Ci0gIHsgYXV0byBfZSA9IGJvdW5kYXJpZXMoKTsgaWYgKF9lKSB7IF9vLT5ib3VuZGFyaWVzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5ib3VuZGFyaWVzW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gfQorICB7IGF1dG8gX2UgPSBib3VuZGFyaWVzKCk7IGlmIChfZSkgeyBfby0+Ym91bmRhcmllcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5ib3VuZGFyaWVzW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT5ib3VuZGFyaWVzLnJlc2l6ZSgwKTsgfSB9CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEJ1Y2tldGl6ZU9wdGlvbnM+IEJ1Y2tldGl6ZU9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBCdWNrZXRpemVPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QnVja2V0aXplT3B0aW9ucz4gQnVja2V0aXplT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQnVja2V0aXplT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZUJ1Y2tldGl6ZU9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEJ1Y2tldGl6ZU9wdGlvbnM+IENyZWF0ZUJ1Y2tldGl6ZU9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBCdWNrZXRpemVPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QnVja2V0aXplT3B0aW9ucz4gQ3JlYXRlQnVja2V0aXplT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQnVja2V0aXplT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgQnVja2V0aXplT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBCdWNrZXRpemVPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIGF1dG8gX2JvdW5kYXJpZXMgPSBfby0+Ym91bmRhcmllcy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcihfby0+Ym91bmRhcmllcykgOiAwOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVCdWNrZXRpemVPcHRpb25zKAogICAgICAgX2ZiYiwKICAgICAgIF9ib3VuZGFyaWVzKTsKIH0KIAotaW5saW5lIEdlbHVPcHRpb25zVCAqR2VsdU9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgR2VsdU9wdGlvbnNUICpHZWx1T3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPEdlbHVPcHRpb25zVD4obmV3IEdlbHVPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIEdlbHVPcHRpb25zOjpVblBhY2tUbyhHZWx1T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBHZWx1T3B0aW9uczo6VW5QYWNrVG8oR2VsdU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiAgIHsgYXV0byBfZSA9IGFwcHJveGltYXRlKCk7IF9vLT5hcHByb3hpbWF0ZSA9IF9lOyB9CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEdlbHVPcHRpb25zPiBHZWx1T3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEdlbHVPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8R2VsdU9wdGlvbnM+IEdlbHVPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBHZWx1T3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZUdlbHVPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxHZWx1T3B0aW9ucz4gQ3JlYXRlR2VsdU9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBHZWx1T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEdlbHVPcHRpb25zPiBDcmVhdGVHZWx1T3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgR2VsdU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IEdlbHVPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IEdlbHVPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIGF1dG8gX2FwcHJveGltYXRlID0gX28tPmFwcHJveGltYXRlOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVHZWx1T3B0aW9ucygKICAgICAgIF9mYmIsCiAgICAgICBfYXBwcm94aW1hdGUpOwogfQogCi1pbmxpbmUgRHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9uc1QgKkR5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgRHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9uc1QgKkR5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxEeW5hbWljVXBkYXRlU2xpY2VPcHRpb25zVD4obmV3IER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgRHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9uczo6VW5QYWNrVG8oRHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBEeW5hbWljVXBkYXRlU2xpY2VPcHRpb25zOjpVblBhY2tUbyhEeW5hbWljVXBkYXRlU2xpY2VPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxEeW5hbWljVXBkYXRlU2xpY2VPcHRpb25zPiBEeW5hbWljVXBkYXRlU2xpY2VPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnM+IER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVEeW5hbWljVXBkYXRlU2xpY2VPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxEeW5hbWljVXBkYXRlU2xpY2VPcHRpb25zPiBDcmVhdGVEeW5hbWljVXBkYXRlU2xpY2VPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgRHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnM+IENyZWF0ZUR5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IER5bmFtaWNVcGRhdGVTbGljZU9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgRHluYW1pY1VwZGF0ZVNsaWNlT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVEeW5hbWljVXBkYXRlU2xpY2VPcHRpb25zKAogICAgICAgX2ZiYik7CiB9CiAKLWlubGluZSBVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9uc1QgKlVuc29ydGVkU2VnbWVudFByb2RPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIFVuc29ydGVkU2VnbWVudFByb2RPcHRpb25zVCAqVW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9uc1Q+KG5ldyBVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9uczo6VW5QYWNrVG8oVW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgVW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnM6OlVuUGFja1RvKFVuc29ydGVkU2VnbWVudFByb2RPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9ucz4gVW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFVuc29ydGVkU2VnbWVudFByb2RPcHRpb25zPiBVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8VW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnM+IENyZWF0ZVVuc29ydGVkU2VnbWVudFByb2RPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9ucz4gQ3JlYXRlVW5zb3J0ZWRTZWdtZW50UHJvZE9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFVuc29ydGVkU2VnbWVudFByb2RPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVVbnNvcnRlZFNlZ21lbnRQcm9kT3B0aW9ucygKICAgICAgIF9mYmIpOwogfQogCi1pbmxpbmUgVW5zb3J0ZWRTZWdtZW50TWF4T3B0aW9uc1QgKlVuc29ydGVkU2VnbWVudE1heE9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgVW5zb3J0ZWRTZWdtZW50TWF4T3B0aW9uc1QgKlVuc29ydGVkU2VnbWVudE1heE9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zVD4obmV3IFVuc29ydGVkU2VnbWVudE1heE9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgVW5zb3J0ZWRTZWdtZW50TWF4T3B0aW9uczo6VW5QYWNrVG8oVW5zb3J0ZWRTZWdtZW50TWF4T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zOjpVblBhY2tUbyhVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zPiBVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVW5zb3J0ZWRTZWdtZW50TWF4T3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFVuc29ydGVkU2VnbWVudE1heE9wdGlvbnM+IFVuc29ydGVkU2VnbWVudE1heE9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFVuc29ydGVkU2VnbWVudE1heE9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zPiBDcmVhdGVVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVW5zb3J0ZWRTZWdtZW50TWF4T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFVuc29ydGVkU2VnbWVudE1heE9wdGlvbnM+IENyZWF0ZVVuc29ydGVkU2VnbWVudE1heE9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFVuc29ydGVkU2VnbWVudE1heE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFVuc29ydGVkU2VnbWVudE1heE9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgVW5zb3J0ZWRTZWdtZW50TWF4T3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVVbnNvcnRlZFNlZ21lbnRNYXhPcHRpb25zKAogICAgICAgX2ZiYik7CiB9CiAKLWlubGluZSBVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zVCAqVW5zb3J0ZWRTZWdtZW50U3VtT3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zVCAqVW5zb3J0ZWRTZWdtZW50U3VtT3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnNUPihuZXcgVW5zb3J0ZWRTZWdtZW50U3VtT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zOjpVblBhY2tUbyhVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIFVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnM6OlVuUGFja1RvKFVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnM+IFVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VW5zb3J0ZWRTZWdtZW50U3VtT3B0aW9ucz4gVW5zb3J0ZWRTZWdtZW50U3VtT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVW5zb3J0ZWRTZWdtZW50U3VtT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZVVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnM+IENyZWF0ZVVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VW5zb3J0ZWRTZWdtZW50U3VtT3B0aW9ucz4gQ3JlYXRlVW5zb3J0ZWRTZWdtZW50U3VtT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVW5zb3J0ZWRTZWdtZW50U3VtT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgVW5zb3J0ZWRTZWdtZW50U3VtT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBVbnNvcnRlZFNlZ21lbnRTdW1PcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZVVuc29ydGVkU2VnbWVudFN1bU9wdGlvbnMoCiAgICAgICBfZmJiKTsKIH0KIAotaW5saW5lIEFUYW4yT3B0aW9uc1QgKkFUYW4yT3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBBVGFuMk9wdGlvbnNUICpBVGFuMk9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxBVGFuMk9wdGlvbnNUPihuZXcgQVRhbjJPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIEFUYW4yT3B0aW9uczo6VW5QYWNrVG8oQVRhbjJPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIEFUYW4yT3B0aW9uczo6VW5QYWNrVG8oQVRhbjJPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxBVGFuMk9wdGlvbnM+IEFUYW4yT3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEFUYW4yT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEFUYW4yT3B0aW9ucz4gQVRhbjJPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBBVGFuMk9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVBVGFuMk9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEFUYW4yT3B0aW9ucz4gQ3JlYXRlQVRhbjJPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQVRhbjJPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QVRhbjJPcHRpb25zPiBDcmVhdGVBVGFuMk9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEFUYW4yT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgQVRhbjJPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IEFUYW4yT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVBVGFuMk9wdGlvbnMoCiAgICAgICBfZmJiKTsKIH0KIAotaW5saW5lIFVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnNUICpVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIFVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnNUICpVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8VW5zb3J0ZWRTZWdtZW50TWluT3B0aW9uc1Q+KG5ldyBVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIFVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnM6OlVuUGFja1RvKFVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgVW5zb3J0ZWRTZWdtZW50TWluT3B0aW9uczo6VW5QYWNrVG8oVW5zb3J0ZWRTZWdtZW50TWluT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8VW5zb3J0ZWRTZWdtZW50TWluT3B0aW9ucz4gVW5zb3J0ZWRTZWdtZW50TWluT3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zPiBVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlVW5zb3J0ZWRTZWdtZW50TWluT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8VW5zb3J0ZWRTZWdtZW50TWluT3B0aW9ucz4gQ3JlYXRlVW5zb3J0ZWRTZWdtZW50TWluT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zPiBDcmVhdGVVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBVbnNvcnRlZFNlZ21lbnRNaW5PcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFVuc29ydGVkU2VnbWVudE1pbk9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlVW5zb3J0ZWRTZWdtZW50TWluT3B0aW9ucygKICAgICAgIF9mYmIpOwogfQogCi1pbmxpbmUgU2lnbk9wdGlvbnNUICpTaWduT3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBTaWduT3B0aW9uc1QgKlNpZ25PcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8U2lnbk9wdGlvbnNUPihuZXcgU2lnbk9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgU2lnbk9wdGlvbnM6OlVuUGFja1RvKFNpZ25PcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIFNpZ25PcHRpb25zOjpVblBhY2tUbyhTaWduT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U2lnbk9wdGlvbnM+IFNpZ25PcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU2lnbk9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTaWduT3B0aW9ucz4gU2lnbk9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNpZ25PcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlU2lnbk9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNpZ25PcHRpb25zPiBDcmVhdGVTaWduT3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNpZ25PcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U2lnbk9wdGlvbnM+IENyZWF0ZVNpZ25PcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTaWduT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgU2lnbk9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgU2lnbk9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlU2lnbk9wdGlvbnMoCiAgICAgICBfZmJiKTsKIH0KIAotaW5saW5lIEJpdGNhc3RPcHRpb25zVCAqQml0Y2FzdE9wdGlvbnM6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgQml0Y2FzdE9wdGlvbnNUICpCaXRjYXN0T3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPEJpdGNhc3RPcHRpb25zVD4obmV3IEJpdGNhc3RPcHRpb25zVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIEJpdGNhc3RPcHRpb25zOjpVblBhY2tUbyhCaXRjYXN0T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBCaXRjYXN0T3B0aW9uczo6VW5QYWNrVG8oQml0Y2FzdE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEJpdGNhc3RPcHRpb25zPiBCaXRjYXN0T3B0aW9uczo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEJpdGNhc3RPcHRpb25zVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8Qml0Y2FzdE9wdGlvbnM+IEJpdGNhc3RPcHRpb25zOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBCaXRjYXN0T3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZUJpdGNhc3RPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCaXRjYXN0T3B0aW9ucz4gQ3JlYXRlQml0Y2FzdE9wdGlvbnMoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBCaXRjYXN0T3B0aW9uc1QgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEJpdGNhc3RPcHRpb25zPiBDcmVhdGVCaXRjYXN0T3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQml0Y2FzdE9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IEJpdGNhc3RPcHRpb25zVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IEJpdGNhc3RPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZUJpdGNhc3RPcHRpb25zKAogICAgICAgX2ZiYik7CiB9CiAKLWlubGluZSBCaXR3aXNlWG9yT3B0aW9uc1QgKkJpdHdpc2VYb3JPcHRpb25zOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIEJpdHdpc2VYb3JPcHRpb25zVCAqQml0d2lzZVhvck9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxCaXR3aXNlWG9yT3B0aW9uc1Q+KG5ldyBCaXR3aXNlWG9yT3B0aW9uc1QoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBCaXR3aXNlWG9yT3B0aW9uczo6VW5QYWNrVG8oQml0d2lzZVhvck9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgQml0d2lzZVhvck9wdGlvbnM6OlVuUGFja1RvKEJpdHdpc2VYb3JPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCaXR3aXNlWG9yT3B0aW9ucz4gQml0d2lzZVhvck9wdGlvbnM6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBCaXR3aXNlWG9yT3B0aW9uc1QqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEJpdHdpc2VYb3JPcHRpb25zPiBCaXR3aXNlWG9yT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQml0d2lzZVhvck9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVCaXR3aXNlWG9yT3B0aW9ucyhfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8Qml0d2lzZVhvck9wdGlvbnM+IENyZWF0ZUJpdHdpc2VYb3JPcHRpb25zKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQml0d2lzZVhvck9wdGlvbnNUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCaXR3aXNlWG9yT3B0aW9ucz4gQ3JlYXRlQml0d2lzZVhvck9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEJpdHdpc2VYb3JPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBCaXR3aXNlWG9yT3B0aW9uc1QqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBCaXR3aXNlWG9yT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVCaXR3aXNlWG9yT3B0aW9ucygKICAgICAgIF9mYmIpOwogfQogCi1pbmxpbmUgUmlnaHRTaGlmdE9wdGlvbnNUICpSaWdodFNoaWZ0T3B0aW9uczo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBSaWdodFNoaWZ0T3B0aW9uc1QgKlJpZ2h0U2hpZnRPcHRpb25zOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8UmlnaHRTaGlmdE9wdGlvbnNUPihuZXcgUmlnaHRTaGlmdE9wdGlvbnNUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgUmlnaHRTaGlmdE9wdGlvbnM6OlVuUGFja1RvKFJpZ2h0U2hpZnRPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIFJpZ2h0U2hpZnRPcHRpb25zOjpVblBhY2tUbyhSaWdodFNoaWZ0T3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8UmlnaHRTaGlmdE9wdGlvbnM+IFJpZ2h0U2hpZnRPcHRpb25zOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmlnaHRTaGlmdE9wdGlvbnNUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxSaWdodFNoaWZ0T3B0aW9ucz4gUmlnaHRTaGlmdE9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJpZ2h0U2hpZnRPcHRpb25zVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlUmlnaHRTaGlmdE9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFJpZ2h0U2hpZnRPcHRpb25zPiBDcmVhdGVSaWdodFNoaWZ0T3B0aW9ucyhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFJpZ2h0U2hpZnRPcHRpb25zVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UmlnaHRTaGlmdE9wdGlvbnM+IENyZWF0ZVJpZ2h0U2hpZnRPcHRpb25zKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBSaWdodFNoaWZ0T3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgUmlnaHRTaGlmdE9wdGlvbnNUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgUmlnaHRTaGlmdE9wdGlvbnNUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlUmlnaHRTaGlmdE9wdGlvbnMoCiAgICAgICBfZmJiKTsKIH0KIAotaW5saW5lIE9wZXJhdG9yQ29kZVQgKk9wZXJhdG9yQ29kZTo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBEaWxhdGVPcHRpb25zVCAqRGlsYXRlT3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPERpbGF0ZU9wdGlvbnNUPihuZXcgRGlsYXRlT3B0aW9uc1QoKSk7CisgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOworICByZXR1cm4gX28ucmVsZWFzZSgpOworfQorCitpbmxpbmUgdm9pZCBEaWxhdGVPcHRpb25zOjpVblBhY2tUbyhEaWxhdGVPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICAodm9pZClfbzsKKyAgKHZvaWQpX3Jlc29sdmVyOworfQorCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PERpbGF0ZU9wdGlvbnM+IERpbGF0ZU9wdGlvbnM6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IERpbGF0ZU9wdGlvbnNUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CisgIHJldHVybiBDcmVhdGVEaWxhdGVPcHRpb25zKF9mYmIsIF9vLCBfcmVoYXNoZXIpOworfQorCitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PERpbGF0ZU9wdGlvbnM+IENyZWF0ZURpbGF0ZU9wdGlvbnMoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IERpbGF0ZU9wdGlvbnNUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CisgICh2b2lkKV9yZWhhc2hlcjsKKyAgKHZvaWQpX287CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgRGlsYXRlT3B0aW9uc1QqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICByZXR1cm4gdGZsaXRlOjpDcmVhdGVEaWxhdGVPcHRpb25zKAorICAgICAgX2ZiYik7Cit9CisKK2lubGluZSBSZWR1Y2VXaW5kb3dPcHRpb25zVCAqUmVkdWNlV2luZG93T3B0aW9uczo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFJlZHVjZVdpbmRvd09wdGlvbnNUPihuZXcgUmVkdWNlV2luZG93T3B0aW9uc1QoKSk7CisgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOworICByZXR1cm4gX28ucmVsZWFzZSgpOworfQorCitpbmxpbmUgdm9pZCBSZWR1Y2VXaW5kb3dPcHRpb25zOjpVblBhY2tUbyhSZWR1Y2VXaW5kb3dPcHRpb25zVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworICAodm9pZClfbzsKKyAgKHZvaWQpX3Jlc29sdmVyOworICB7IGF1dG8gX2UgPSByZWR1Y2VfZnVuY3Rpb24oKTsgX28tPnJlZHVjZV9mdW5jdGlvbiA9IF9lOyB9Cit9CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UmVkdWNlV2luZG93T3B0aW9ucz4gUmVkdWNlV2luZG93T3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmVkdWNlV2luZG93T3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgcmV0dXJuIENyZWF0ZVJlZHVjZVdpbmRvd09wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7Cit9CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8UmVkdWNlV2luZG93T3B0aW9ucz4gQ3JlYXRlUmVkdWNlV2luZG93T3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgUmVkdWNlV2luZG93T3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgKHZvaWQpX3JlaGFzaGVyOworICAodm9pZClfbzsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBSZWR1Y2VXaW5kb3dPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIGF1dG8gX3JlZHVjZV9mdW5jdGlvbiA9IF9vLT5yZWR1Y2VfZnVuY3Rpb247CisgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZVJlZHVjZVdpbmRvd09wdGlvbnMoCisgICAgICBfZmJiLAorICAgICAgX3JlZHVjZV9mdW5jdGlvbik7Cit9CisKK2lubGluZSBPcGVyYXRvckNvZGVUICpPcGVyYXRvckNvZGU6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxPcGVyYXRvckNvZGVUPihuZXcgT3BlcmF0b3JDb2RlVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIE9wZXJhdG9yQ29kZTo6VW5QYWNrVG8oT3BlcmF0b3JDb2RlVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIE9wZXJhdG9yQ29kZTo6VW5QYWNrVG8oT3BlcmF0b3JDb2RlVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogICB7IGF1dG8gX2UgPSBkZXByZWNhdGVkX2J1aWx0aW5fY29kZSgpOyBfby0+ZGVwcmVjYXRlZF9idWlsdGluX2NvZGUgPSBfZTsgfQpAQCAtMTcyOTcsMTQgKzIxMDI0LDE0IEBACiAgIHsgYXV0byBfZSA9IGJ1aWx0aW5fY29kZSgpOyBfby0+YnVpbHRpbl9jb2RlID0gX2U7IH0KIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8T3BlcmF0b3JDb2RlPiBPcGVyYXRvckNvZGU6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBPcGVyYXRvckNvZGVUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxPcGVyYXRvckNvZGU+IE9wZXJhdG9yQ29kZTo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgT3BlcmF0b3JDb2RlVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlT3BlcmF0b3JDb2RlKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxPcGVyYXRvckNvZGU+IENyZWF0ZU9wZXJhdG9yQ29kZShmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE9wZXJhdG9yQ29kZVQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE9wZXJhdG9yQ29kZT4gQ3JlYXRlT3BlcmF0b3JDb2RlKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBPcGVyYXRvckNvZGVUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IE9wZXJhdG9yQ29kZVQqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBPcGVyYXRvckNvZGVUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgYXV0byBfZGVwcmVjYXRlZF9idWlsdGluX2NvZGUgPSBfby0+ZGVwcmVjYXRlZF9idWlsdGluX2NvZGU7CiAgIGF1dG8gX2N1c3RvbV9jb2RlID0gX28tPmN1c3RvbV9jb2RlLmVtcHR5KCkgPyAwIDogX2ZiYi5DcmVhdGVTdHJpbmcoX28tPmN1c3RvbV9jb2RlKTsKICAgYXV0byBfdmVyc2lvbiA9IF9vLT52ZXJzaW9uOwpAQCAtMTczMTcsMzYgKzIxMDQ0LDc2IEBACiAgICAgICBfYnVpbHRpbl9jb2RlKTsKIH0KIAotaW5saW5lIE9wZXJhdG9yVCAqT3BlcmF0b3I6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9uc1QgKlN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnM6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKKyAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxTdGFibGVITE9Db21wb3NpdGVPcHRpb25zVD4obmV3IFN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnNUKCkpOworICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKKyAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKK30KKworaW5saW5lIHZvaWQgU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9uczo6VW5QYWNrVG8oU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKKyAgKHZvaWQpX287CisgICh2b2lkKV9yZXNvbHZlcjsKKyAgeyBhdXRvIF9lID0gbmFtZSgpOyBpZiAoX2UpIF9vLT5uYW1lID0gX2UtPnN0cigpOyB9CisgIHsgYXV0byBfZSA9IGRlY29tcG9zaXRpb25fc3ViZ3JhcGhfaW5kZXgoKTsgX28tPmRlY29tcG9zaXRpb25fc3ViZ3JhcGhfaW5kZXggPSBfZTsgfQorICB7IGF1dG8gX2UgPSBjb21wb3NpdGVfYXR0cmlidXRlcygpOyBpZiAoX2UpIHsgX28tPmNvbXBvc2l0ZV9hdHRyaWJ1dGVzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgc3RkOjpjb3B5KF9lLT5iZWdpbigpLCBfZS0+ZW5kKCksIF9vLT5jb21wb3NpdGVfYXR0cmlidXRlcy5iZWdpbigpKTsgfSB9CisgIHsgYXV0byBfZSA9IGNvbXBvc2l0ZV9hdHRyaWJ1dGVzX2Zvcm1hdCgpOyBfby0+Y29tcG9zaXRlX2F0dHJpYnV0ZXNfZm9ybWF0ID0gX2U7IH0KKyAgeyBhdXRvIF9lID0gdmVyc2lvbigpOyBfby0+dmVyc2lvbiA9IF9lOyB9Cit9CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlSExPQ29tcG9zaXRlT3B0aW9ucz4gU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9uczo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9uc1QqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgcmV0dXJuIENyZWF0ZVN0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnMoX2ZiYiwgX28sIF9yZWhhc2hlcik7Cit9CisKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3RhYmxlSExPQ29tcG9zaXRlT3B0aW9ucz4gQ3JlYXRlU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9uc1QgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKKyAgKHZvaWQpX3JlaGFzaGVyOworICAodm9pZClfbzsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBTdGFibGVITE9Db21wb3NpdGVPcHRpb25zVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIGF1dG8gX25hbWUgPSBfby0+bmFtZS5lbXB0eSgpID8gMCA6IF9mYmIuQ3JlYXRlU3RyaW5nKF9vLT5uYW1lKTsKKyAgYXV0byBfZGVjb21wb3NpdGlvbl9zdWJncmFwaF9pbmRleCA9IF9vLT5kZWNvbXBvc2l0aW9uX3N1YmdyYXBoX2luZGV4OworICBhdXRvIF9jb21wb3NpdGVfYXR0cmlidXRlcyA9IF9vLT5jb21wb3NpdGVfYXR0cmlidXRlcy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcihfby0+Y29tcG9zaXRlX2F0dHJpYnV0ZXMpIDogMDsKKyAgYXV0byBfY29tcG9zaXRlX2F0dHJpYnV0ZXNfZm9ybWF0ID0gX28tPmNvbXBvc2l0ZV9hdHRyaWJ1dGVzX2Zvcm1hdDsKKyAgYXV0byBfdmVyc2lvbiA9IF9vLT52ZXJzaW9uOworICByZXR1cm4gdGZsaXRlOjpDcmVhdGVTdGFibGVITE9Db21wb3NpdGVPcHRpb25zKAorICAgICAgX2ZiYiwKKyAgICAgIF9uYW1lLAorICAgICAgX2RlY29tcG9zaXRpb25fc3ViZ3JhcGhfaW5kZXgsCisgICAgICBfY29tcG9zaXRlX2F0dHJpYnV0ZXMsCisgICAgICBfY29tcG9zaXRlX2F0dHJpYnV0ZXNfZm9ybWF0LAorICAgICAgX3ZlcnNpb24pOworfQorCitpbmxpbmUgT3BlcmF0b3JUICpPcGVyYXRvcjo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPE9wZXJhdG9yVD4obmV3IE9wZXJhdG9yVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIE9wZXJhdG9yOjpVblBhY2tUbyhPcGVyYXRvclQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBPcGVyYXRvcjo6VW5QYWNrVG8oT3BlcmF0b3JUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7CiAgIHsgYXV0byBfZSA9IG9wY29kZV9pbmRleCgpOyBfby0+b3Bjb2RlX2luZGV4ID0gX2U7IH0KLSAgeyBhdXRvIF9lID0gaW5wdXRzKCk7IGlmIChfZSkgeyBfby0+aW5wdXRzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5pbnB1dHNbX2ldID0gX2UtPkdldChfaSk7IH0gfSB9Ci0gIHsgYXV0byBfZSA9IG91dHB1dHMoKTsgaWYgKF9lKSB7IF9vLT5vdXRwdXRzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5vdXRwdXRzW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gfQorICB7IGF1dG8gX2UgPSBpbnB1dHMoKTsgaWYgKF9lKSB7IF9vLT5pbnB1dHMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+aW5wdXRzW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT5pbnB1dHMucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gb3V0cHV0cygpOyBpZiAoX2UpIHsgX28tPm91dHB1dHMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+b3V0cHV0c1tfaV0gPSBfZS0+R2V0KF9pKTsgfSB9IGVsc2UgeyBfby0+b3V0cHV0cy5yZXNpemUoMCk7IH0gfQogICB7IGF1dG8gX2UgPSBidWlsdGluX29wdGlvbnNfdHlwZSgpOyBfby0+YnVpbHRpbl9vcHRpb25zLnR5cGUgPSBfZTsgfQogICB7IGF1dG8gX2UgPSBidWlsdGluX29wdGlvbnMoKTsgaWYgKF9lKSBfby0+YnVpbHRpbl9vcHRpb25zLnZhbHVlID0gdGZsaXRlOjpCdWlsdGluT3B0aW9uc1VuaW9uOjpVblBhY2soX2UsIGJ1aWx0aW5fb3B0aW9uc190eXBlKCksIF9yZXNvbHZlcik7IH0KICAgeyBhdXRvIF9lID0gY3VzdG9tX29wdGlvbnMoKTsgaWYgKF9lKSB7IF9vLT5jdXN0b21fb3B0aW9ucy5yZXNpemUoX2UtPnNpemUoKSk7IHN0ZDo6Y29weShfZS0+YmVnaW4oKSwgX2UtPmVuZCgpLCBfby0+Y3VzdG9tX29wdGlvbnMuYmVnaW4oKSk7IH0gfQogICB7IGF1dG8gX2UgPSBjdXN0b21fb3B0aW9uc19mb3JtYXQoKTsgX28tPmN1c3RvbV9vcHRpb25zX2Zvcm1hdCA9IF9lOyB9Ci0gIHsgYXV0byBfZSA9IG11dGF0aW5nX3ZhcmlhYmxlX2lucHV0cygpOyBpZiAoX2UpIHsgX28tPm11dGF0aW5nX3ZhcmlhYmxlX2lucHV0cy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+bXV0YXRpbmdfdmFyaWFibGVfaW5wdXRzW19pXSA9IF9lLT5HZXQoX2kpICE9IDA7IH0gfSB9Ci0gIHsgYXV0byBfZSA9IGludGVybWVkaWF0ZXMoKTsgaWYgKF9lKSB7IF9vLT5pbnRlcm1lZGlhdGVzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5pbnRlcm1lZGlhdGVzW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gfQorICB7IGF1dG8gX2UgPSBtdXRhdGluZ192YXJpYWJsZV9pbnB1dHMoKTsgaWYgKF9lKSB7IF9vLT5tdXRhdGluZ192YXJpYWJsZV9pbnB1dHMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+bXV0YXRpbmdfdmFyaWFibGVfaW5wdXRzW19pXSA9IF9lLT5HZXQoX2kpICE9IDA7IH0gfSBlbHNlIHsgX28tPm11dGF0aW5nX3ZhcmlhYmxlX2lucHV0cy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBpbnRlcm1lZGlhdGVzKCk7IGlmIChfZSkgeyBfby0+aW50ZXJtZWRpYXRlcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5pbnRlcm1lZGlhdGVzW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT5pbnRlcm1lZGlhdGVzLnJlc2l6ZSgwKTsgfSB9CiAgIHsgYXV0byBfZSA9IGxhcmdlX2N1c3RvbV9vcHRpb25zX29mZnNldCgpOyBfby0+bGFyZ2VfY3VzdG9tX29wdGlvbnNfb2Zmc2V0ID0gX2U7IH0KICAgeyBhdXRvIF9lID0gbGFyZ2VfY3VzdG9tX29wdGlvbnNfc2l6ZSgpOyBfby0+bGFyZ2VfY3VzdG9tX29wdGlvbnNfc2l6ZSA9IF9lOyB9CisgIHsgYXV0byBfZSA9IGJ1aWx0aW5fb3B0aW9uc18yX3R5cGUoKTsgX28tPmJ1aWx0aW5fb3B0aW9uc18yLnR5cGUgPSBfZTsgfQorICB7IGF1dG8gX2UgPSBidWlsdGluX29wdGlvbnNfMigpOyBpZiAoX2UpIF9vLT5idWlsdGluX29wdGlvbnNfMi52YWx1ZSA9IHRmbGl0ZTo6QnVpbHRpbk9wdGlvbnMyVW5pb246OlVuUGFjayhfZSwgYnVpbHRpbl9vcHRpb25zXzJfdHlwZSgpLCBfcmVzb2x2ZXIpOyB9CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PE9wZXJhdG9yPiBPcGVyYXRvcjo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE9wZXJhdG9yVCogX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8T3BlcmF0b3I+IE9wZXJhdG9yOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBPcGVyYXRvclQqIF9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgcmV0dXJuIENyZWF0ZU9wZXJhdG9yKF9mYmIsIF9vLCBfcmVoYXNoZXIpOwogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxPcGVyYXRvcj4gQ3JlYXRlT3BlcmF0b3IoZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBPcGVyYXRvclQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE9wZXJhdG9yPiBDcmVhdGVPcGVyYXRvcig6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgT3BlcmF0b3JUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgKHZvaWQpX287Ci0gIHN0cnVjdCBfVmVjdG9yQXJncyB7IGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IE9wZXJhdG9yVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IE9wZXJhdG9yVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CiAgIGF1dG8gX29wY29kZV9pbmRleCA9IF9vLT5vcGNvZGVfaW5kZXg7CiAgIGF1dG8gX2lucHV0cyA9IF9vLT5pbnB1dHMuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3IoX28tPmlucHV0cykgOiAwOwogICBhdXRvIF9vdXRwdXRzID0gX28tPm91dHB1dHMuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3IoX28tPm91dHB1dHMpIDogMDsKQEAgLTE3MzU4LDYgKzIxMTI1LDggQEAKICAgYXV0byBfaW50ZXJtZWRpYXRlcyA9IF9vLT5pbnRlcm1lZGlhdGVzLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yKF9vLT5pbnRlcm1lZGlhdGVzKSA6IDA7CiAgIGF1dG8gX2xhcmdlX2N1c3RvbV9vcHRpb25zX29mZnNldCA9IF9vLT5sYXJnZV9jdXN0b21fb3B0aW9uc19vZmZzZXQ7CiAgIGF1dG8gX2xhcmdlX2N1c3RvbV9vcHRpb25zX3NpemUgPSBfby0+bGFyZ2VfY3VzdG9tX29wdGlvbnNfc2l6ZTsKKyAgYXV0byBfYnVpbHRpbl9vcHRpb25zXzJfdHlwZSA9IF9vLT5idWlsdGluX29wdGlvbnNfMi50eXBlOworICBhdXRvIF9idWlsdGluX29wdGlvbnNfMiA9IF9vLT5idWlsdGluX29wdGlvbnNfMi5QYWNrKF9mYmIpOwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVPcGVyYXRvcigKICAgICAgIF9mYmIsCiAgICAgICBfb3Bjb2RlX2luZGV4LApAQCAtMTczNzAsNyArMjExMzksOSBAQAogICAgICAgX211dGF0aW5nX3ZhcmlhYmxlX2lucHV0cywKICAgICAgIF9pbnRlcm1lZGlhdGVzLAogICAgICAgX2xhcmdlX2N1c3RvbV9vcHRpb25zX29mZnNldCwKLSAgICAgIF9sYXJnZV9jdXN0b21fb3B0aW9uc19zaXplKTsKKyAgICAgIF9sYXJnZV9jdXN0b21fb3B0aW9uc19zaXplLAorICAgICAgX2J1aWx0aW5fb3B0aW9uc18yX3R5cGUsCisgICAgICBfYnVpbHRpbl9vcHRpb25zXzIpOwogfQogCiBpbmxpbmUgU3ViR3JhcGhUOjpTdWJHcmFwaFQoY29uc3QgU3ViR3JhcGhUICZvKQpAQCAtMTczOTIsMzQgKzIxMTYzLDM0IEBACiAgIHJldHVybiAqdGhpczsKIH0KIAotaW5saW5lIFN1YkdyYXBoVCAqU3ViR3JhcGg6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgU3ViR3JhcGhUICpTdWJHcmFwaDo6VW5QYWNrKGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICBhdXRvIF9vID0gc3RkOjp1bmlxdWVfcHRyPFN1YkdyYXBoVD4obmV3IFN1YkdyYXBoVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIFN1YkdyYXBoOjpVblBhY2tUbyhTdWJHcmFwaFQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBTdWJHcmFwaDo6VW5QYWNrVG8oU3ViR3JhcGhUICpfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgICh2b2lkKV9vOwogICAodm9pZClfcmVzb2x2ZXI7Ci0gIHsgYXV0byBfZSA9IHRlbnNvcnMoKTsgaWYgKF9lKSB7IF9vLT50ZW5zb3JzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IGlmKF9vLT50ZW5zb3JzW19pXSkgeyBfZS0+R2V0KF9pKS0+VW5QYWNrVG8oX28tPnRlbnNvcnNbX2ldLmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+dGVuc29yc1tfaV0gPSBzdGQ6OnVuaXF1ZV9wdHI8dGZsaXRlOjpUZW5zb3JUPihfZS0+R2V0KF9pKS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9OyB9IH0gfQotICB7IGF1dG8gX2UgPSBpbnB1dHMoKTsgaWYgKF9lKSB7IF9vLT5pbnB1dHMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPmlucHV0c1tfaV0gPSBfZS0+R2V0KF9pKTsgfSB9IH0KLSAgeyBhdXRvIF9lID0gb3V0cHV0cygpOyBpZiAoX2UpIHsgX28tPm91dHB1dHMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgX28tPm91dHB1dHNbX2ldID0gX2UtPkdldChfaSk7IH0gfSB9Ci0gIHsgYXV0byBfZSA9IG9wZXJhdG9ycygpOyBpZiAoX2UpIHsgX28tPm9wZXJhdG9ycy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBpZihfby0+b3BlcmF0b3JzW19pXSkgeyBfZS0+R2V0KF9pKS0+VW5QYWNrVG8oX28tPm9wZXJhdG9yc1tfaV0uZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT5vcGVyYXRvcnNbX2ldID0gc3RkOjp1bmlxdWVfcHRyPHRmbGl0ZTo6T3BlcmF0b3JUPihfZS0+R2V0KF9pKS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9OyB9IH0gfQorICB7IGF1dG8gX2UgPSB0ZW5zb3JzKCk7IGlmIChfZSkgeyBfby0+dGVuc29ycy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IGlmKF9vLT50ZW5zb3JzW19pXSkgeyBfZS0+R2V0KF9pKS0+VW5QYWNrVG8oX28tPnRlbnNvcnNbX2ldLmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+dGVuc29yc1tfaV0gPSBzdGQ6OnVuaXF1ZV9wdHI8dGZsaXRlOjpUZW5zb3JUPihfZS0+R2V0KF9pKS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9OyB9IH0gZWxzZSB7IF9vLT50ZW5zb3JzLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IGlucHV0cygpOyBpZiAoX2UpIHsgX28tPmlucHV0cy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5pbnB1dHNbX2ldID0gX2UtPkdldChfaSk7IH0gfSBlbHNlIHsgX28tPmlucHV0cy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBvdXRwdXRzKCk7IGlmIChfZSkgeyBfby0+b3V0cHV0cy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5vdXRwdXRzW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT5vdXRwdXRzLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IG9wZXJhdG9ycygpOyBpZiAoX2UpIHsgX28tPm9wZXJhdG9ycy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IGlmKF9vLT5vcGVyYXRvcnNbX2ldKSB7IF9lLT5HZXQoX2kpLT5VblBhY2tUbyhfby0+b3BlcmF0b3JzW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPm9wZXJhdG9yc1tfaV0gPSBzdGQ6OnVuaXF1ZV9wdHI8dGZsaXRlOjpPcGVyYXRvclQ+KF9lLT5HZXQoX2kpLT5VblBhY2soX3Jlc29sdmVyKSk7IH07IH0gfSBlbHNlIHsgX28tPm9wZXJhdG9ycy5yZXNpemUoMCk7IH0gfQogICB7IGF1dG8gX2UgPSBuYW1lKCk7IGlmIChfZSkgX28tPm5hbWUgPSBfZS0+c3RyKCk7IH0KIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8U3ViR3JhcGg+IFN1YkdyYXBoOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU3ViR3JhcGhUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTdWJHcmFwaD4gU3ViR3JhcGg6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN1YkdyYXBoVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlU3ViR3JhcGgoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFN1YkdyYXBoPiBDcmVhdGVTdWJHcmFwaChmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFN1YkdyYXBoVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U3ViR3JhcGg+IENyZWF0ZVN1YkdyYXBoKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTdWJHcmFwaFQgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgU3ViR3JhcGhUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7Ci0gIGF1dG8gX3RlbnNvcnMgPSBfby0+dGVuc29ycy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6VGVuc29yPj4gKF9vLT50ZW5zb3JzLnNpemUoKSwgW10oc2l6ZV90IGksIF9WZWN0b3JBcmdzICpfX3ZhKSB7IHJldHVybiBDcmVhdGVUZW5zb3IoKl9fdmEtPl9fZmJiLCBfX3ZhLT5fX28tPnRlbnNvcnNbaV0uZ2V0KCksIF9fdmEtPl9fcmVoYXNoZXIpOyB9LCAmX3ZhICkgOiAwOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFN1YkdyYXBoVCogX19vOyBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIGF1dG8gX3RlbnNvcnMgPSBfby0+dGVuc29ycy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpUZW5zb3I+PiAoX28tPnRlbnNvcnMuc2l6ZSgpLCBbXShzaXplX3QgaSwgX1ZlY3RvckFyZ3MgKl9fdmEpIHsgcmV0dXJuIENyZWF0ZVRlbnNvcigqX192YS0+X19mYmIsIF9fdmEtPl9fby0+dGVuc29yc1tpXS5nZXQoKSwgX192YS0+X19yZWhhc2hlcik7IH0sICZfdmEgKSA6IDA7CiAgIGF1dG8gX2lucHV0cyA9IF9vLT5pbnB1dHMuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3IoX28tPmlucHV0cykgOiAwOwogICBhdXRvIF9vdXRwdXRzID0gX28tPm91dHB1dHMuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3IoX28tPm91dHB1dHMpIDogMDsKLSAgYXV0byBfb3BlcmF0b3JzID0gX28tPm9wZXJhdG9ycy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6T3BlcmF0b3I+PiAoX28tPm9wZXJhdG9ycy5zaXplKCksIFtdKHNpemVfdCBpLCBfVmVjdG9yQXJncyAqX192YSkgeyByZXR1cm4gQ3JlYXRlT3BlcmF0b3IoKl9fdmEtPl9fZmJiLCBfX3ZhLT5fX28tPm9wZXJhdG9yc1tpXS5nZXQoKSwgX192YS0+X19yZWhhc2hlcik7IH0sICZfdmEgKSA6IDA7CisgIGF1dG8gX29wZXJhdG9ycyA9IF9vLT5vcGVyYXRvcnMuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3I8OjpmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6T3BlcmF0b3I+PiAoX28tPm9wZXJhdG9ycy5zaXplKCksIFtdKHNpemVfdCBpLCBfVmVjdG9yQXJncyAqX192YSkgeyByZXR1cm4gQ3JlYXRlT3BlcmF0b3IoKl9fdmEtPl9fZmJiLCBfX3ZhLT5fX28tPm9wZXJhdG9yc1tpXS5nZXQoKSwgX192YS0+X19yZWhhc2hlcik7IH0sICZfdmEgKSA6IDA7CiAgIGF1dG8gX25hbWUgPSBfby0+bmFtZS5lbXB0eSgpID8gMCA6IF9mYmIuQ3JlYXRlU3RyaW5nKF9vLT5uYW1lKTsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlU3ViR3JhcGgoCiAgICAgICBfZmJiLApAQCAtMTc0MzAsMTMgKzIxMjAxLDEzIEBACiAgICAgICBfbmFtZSk7CiB9CiAKLWlubGluZSBCdWZmZXJUICpCdWZmZXI6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgQnVmZmVyVCAqQnVmZmVyOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyVD4obmV3IEJ1ZmZlclQoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBCdWZmZXI6OlVuUGFja1RvKEJ1ZmZlclQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBCdWZmZXI6OlVuUGFja1RvKEJ1ZmZlclQgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKICAgeyBhdXRvIF9lID0gZGF0YSgpOyBpZiAoX2UpIHsgX28tPmRhdGEucmVzaXplKF9lLT5zaXplKCkpOyBzdGQ6OmNvcHkoX2UtPmJlZ2luKCksIF9lLT5lbmQoKSwgX28tPmRhdGEuYmVnaW4oKSk7IH0gfQpAQCAtMTc0NDQsMTQgKzIxMjE1LDE0IEBACiAgIHsgYXV0byBfZSA9IHNpemUoKTsgX28tPnNpemUgPSBfZTsgfQogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxCdWZmZXI+IEJ1ZmZlcjo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEJ1ZmZlclQqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PEJ1ZmZlcj4gQnVmZmVyOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBCdWZmZXJUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVCdWZmZXIoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PEJ1ZmZlcj4gQ3JlYXRlQnVmZmVyKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgQnVmZmVyVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8QnVmZmVyPiBDcmVhdGVCdWZmZXIoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IEJ1ZmZlclQgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgQnVmZmVyVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IEJ1ZmZlclQqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICBfZmJiLkZvcmNlVmVjdG9yQWxpZ25tZW50KF9vLT5kYXRhLnNpemUoKSwgc2l6ZW9mKHVpbnQ4X3QpLCAxNik7CiAgIGF1dG8gX2RhdGEgPSBfby0+ZGF0YS5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcihfby0+ZGF0YSkgOiAwOwogICBhdXRvIF9vZmZzZXQgPSBfby0+b2Zmc2V0OwpAQCAtMTc0NjMsMjcgKzIxMjM0LDI3IEBACiAgICAgICBfc2l6ZSk7CiB9CiAKLWlubGluZSBNZXRhZGF0YVQgKk1ldGFkYXRhOjpVblBhY2soY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIE1ldGFkYXRhVCAqTWV0YWRhdGE6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxNZXRhZGF0YVQ+KG5ldyBNZXRhZGF0YVQoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBNZXRhZGF0YTo6VW5QYWNrVG8oTWV0YWRhdGFUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgeworaW5saW5lIHZvaWQgTWV0YWRhdGE6OlVuUGFja1RvKE1ldGFkYXRhVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogICB7IGF1dG8gX2UgPSBuYW1lKCk7IGlmIChfZSkgX28tPm5hbWUgPSBfZS0+c3RyKCk7IH0KICAgeyBhdXRvIF9lID0gYnVmZmVyKCk7IF9vLT5idWZmZXIgPSBfZTsgfQogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNZXRhZGF0YT4gTWV0YWRhdGE6OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBNZXRhZGF0YVQqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PE1ldGFkYXRhPiBNZXRhZGF0YTo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTWV0YWRhdGFUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVNZXRhZGF0YShfZmJiLCBfbywgX3JlaGFzaGVyKTsKIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TWV0YWRhdGE+IENyZWF0ZU1ldGFkYXRhKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTWV0YWRhdGFUICpfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNZXRhZGF0YT4gQ3JlYXRlTWV0YWRhdGEoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE1ldGFkYXRhVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICAodm9pZClfcmVoYXNoZXI7CiAgICh2b2lkKV9vOwotICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBNZXRhZGF0YVQqIF9fbzsgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBNZXRhZGF0YVQqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICBhdXRvIF9uYW1lID0gX28tPm5hbWUuZW1wdHkoKSA/IDAgOiBfZmJiLkNyZWF0ZVN0cmluZyhfby0+bmFtZSk7CiAgIGF1dG8gX2J1ZmZlciA9IF9vLT5idWZmZXI7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZU1ldGFkYXRhKApAQCAtMTc0OTIsMjcgKzIxMjYzLDI3IEBACiAgICAgICBfYnVmZmVyKTsKIH0KIAotaW5saW5lIFRlbnNvck1hcFQgKlRlbnNvck1hcDo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBUZW5zb3JNYXBUICpUZW5zb3JNYXA6OlVuUGFjayhjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgYXV0byBfbyA9IHN0ZDo6dW5pcXVlX3B0cjxUZW5zb3JNYXBUPihuZXcgVGVuc29yTWFwVCgpKTsKICAgVW5QYWNrVG8oX28uZ2V0KCksIF9yZXNvbHZlcik7CiAgIHJldHVybiBfby5yZWxlYXNlKCk7CiB9CiAKLWlubGluZSB2b2lkIFRlbnNvck1hcDo6VW5QYWNrVG8oVGVuc29yTWFwVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIFRlbnNvck1hcDo6VW5QYWNrVG8oVGVuc29yTWFwVCAqX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKl9yZXNvbHZlcikgY29uc3QgewogICAodm9pZClfbzsKICAgKHZvaWQpX3Jlc29sdmVyOwogICB7IGF1dG8gX2UgPSBuYW1lKCk7IGlmIChfZSkgX28tPm5hbWUgPSBfZS0+c3RyKCk7IH0KICAgeyBhdXRvIF9lID0gdGVuc29yX2luZGV4KCk7IF9vLT50ZW5zb3JfaW5kZXggPSBfZTsgfQogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxUZW5zb3JNYXA+IFRlbnNvck1hcDo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFRlbnNvck1hcFQqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFRlbnNvck1hcD4gVGVuc29yTWFwOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBUZW5zb3JNYXBUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVUZW5zb3JNYXAoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFRlbnNvck1hcD4gQ3JlYXRlVGVuc29yTWFwKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgVGVuc29yTWFwVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8VGVuc29yTWFwPiBDcmVhdGVUZW5zb3JNYXAoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFRlbnNvck1hcFQgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgVGVuc29yTWFwVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOworICBzdHJ1Y3QgX1ZlY3RvckFyZ3MgeyA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAqX19mYmI7IGNvbnN0IFRlbnNvck1hcFQqIF9fbzsgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwogICBhdXRvIF9uYW1lID0gX28tPm5hbWUuZW1wdHkoKSA/IDAgOiBfZmJiLkNyZWF0ZVN0cmluZyhfby0+bmFtZSk7CiAgIGF1dG8gX3RlbnNvcl9pbmRleCA9IF9vLT50ZW5zb3JfaW5kZXg7CiAgIHJldHVybiB0ZmxpdGU6OkNyZWF0ZVRlbnNvck1hcCgKQEAgLTE3NTM4LDMxICsyMTMwOSwzMSBAQAogICByZXR1cm4gKnRoaXM7CiB9CiAKLWlubGluZSBTaWduYXR1cmVEZWZUICpTaWduYXR1cmVEZWY6OlVuUGFjayhjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgU2lnbmF0dXJlRGVmVCAqU2lnbmF0dXJlRGVmOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8U2lnbmF0dXJlRGVmVD4obmV3IFNpZ25hdHVyZURlZlQoKSk7CiAgIFVuUGFja1RvKF9vLmdldCgpLCBfcmVzb2x2ZXIpOwogICByZXR1cm4gX28ucmVsZWFzZSgpOwogfQogCi1pbmxpbmUgdm9pZCBTaWduYXR1cmVEZWY6OlVuUGFja1RvKFNpZ25hdHVyZURlZlQgKl9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CitpbmxpbmUgdm9pZCBTaWduYXR1cmVEZWY6OlVuUGFja1RvKFNpZ25hdHVyZURlZlQgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKLSAgeyBhdXRvIF9lID0gaW5wdXRzKCk7IGlmIChfZSkgeyBfby0+aW5wdXRzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IGlmKF9vLT5pbnB1dHNbX2ldKSB7IF9lLT5HZXQoX2kpLT5VblBhY2tUbyhfby0+aW5wdXRzW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPmlucHV0c1tfaV0gPSBzdGQ6OnVuaXF1ZV9wdHI8dGZsaXRlOjpUZW5zb3JNYXBUPihfZS0+R2V0KF9pKS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9OyB9IH0gfQotICB7IGF1dG8gX2UgPSBvdXRwdXRzKCk7IGlmIChfZSkgeyBfby0+b3V0cHV0cy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBpZihfby0+b3V0cHV0c1tfaV0pIHsgX2UtPkdldChfaSktPlVuUGFja1RvKF9vLT5vdXRwdXRzW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPm91dHB1dHNbX2ldID0gc3RkOjp1bmlxdWVfcHRyPHRmbGl0ZTo6VGVuc29yTWFwVD4oX2UtPkdldChfaSktPlVuUGFjayhfcmVzb2x2ZXIpKTsgfTsgfSB9IH0KKyAgeyBhdXRvIF9lID0gaW5wdXRzKCk7IGlmIChfZSkgeyBfby0+aW5wdXRzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yICg6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgaWYoX28tPmlucHV0c1tfaV0pIHsgX2UtPkdldChfaSktPlVuUGFja1RvKF9vLT5pbnB1dHNbX2ldLmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+aW5wdXRzW19pXSA9IHN0ZDo6dW5pcXVlX3B0cjx0ZmxpdGU6OlRlbnNvck1hcFQ+KF9lLT5HZXQoX2kpLT5VblBhY2soX3Jlc29sdmVyKSk7IH07IH0gfSBlbHNlIHsgX28tPmlucHV0cy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBvdXRwdXRzKCk7IGlmIChfZSkgeyBfby0+b3V0cHV0cy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IGlmKF9vLT5vdXRwdXRzW19pXSkgeyBfZS0+R2V0KF9pKS0+VW5QYWNrVG8oX28tPm91dHB1dHNbX2ldLmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+b3V0cHV0c1tfaV0gPSBzdGQ6OnVuaXF1ZV9wdHI8dGZsaXRlOjpUZW5zb3JNYXBUPihfZS0+R2V0KF9pKS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9OyB9IH0gZWxzZSB7IF9vLT5vdXRwdXRzLnJlc2l6ZSgwKTsgfSB9CiAgIHsgYXV0byBfZSA9IHNpZ25hdHVyZV9rZXkoKTsgaWYgKF9lKSBfby0+c2lnbmF0dXJlX2tleSA9IF9lLT5zdHIoKTsgfQogICB7IGF1dG8gX2UgPSBzdWJncmFwaF9pbmRleCgpOyBfby0+c3ViZ3JhcGhfaW5kZXggPSBfZTsgfQogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDxTaWduYXR1cmVEZWY+IFNpZ25hdHVyZURlZjo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNpZ25hdHVyZURlZlQqIF9vLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PFNpZ25hdHVyZURlZj4gU2lnbmF0dXJlRGVmOjpQYWNrKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBTaWduYXR1cmVEZWZUKiBfbywgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSB7CiAgIHJldHVybiBDcmVhdGVTaWduYXR1cmVEZWYoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PFNpZ25hdHVyZURlZj4gQ3JlYXRlU2lnbmF0dXJlRGVmKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgU2lnbmF0dXJlRGVmVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8U2lnbmF0dXJlRGVmPiBDcmVhdGVTaWduYXR1cmVEZWYoOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IFNpZ25hdHVyZURlZlQgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgU2lnbmF0dXJlRGVmVCogX19vOyBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX19yZWhhc2hlcjsgfSBfdmEgPSB7ICZfZmJiLCBfbywgX3JlaGFzaGVyfTsgKHZvaWQpX3ZhOwotICBhdXRvIF9pbnB1dHMgPSBfby0+aW5wdXRzLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpUZW5zb3JNYXA+PiAoX28tPmlucHV0cy5zaXplKCksIFtdKHNpemVfdCBpLCBfVmVjdG9yQXJncyAqX192YSkgeyByZXR1cm4gQ3JlYXRlVGVuc29yTWFwKCpfX3ZhLT5fX2ZiYiwgX192YS0+X19vLT5pbnB1dHNbaV0uZ2V0KCksIF9fdmEtPl9fcmVoYXNoZXIpOyB9LCAmX3ZhICkgOiAwOwotICBhdXRvIF9vdXRwdXRzID0gX28tPm91dHB1dHMuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlRlbnNvck1hcD4+IChfby0+b3V0cHV0cy5zaXplKCksIFtdKHNpemVfdCBpLCBfVmVjdG9yQXJncyAqX192YSkgeyByZXR1cm4gQ3JlYXRlVGVuc29yTWFwKCpfX3ZhLT5fX2ZiYiwgX192YS0+X19vLT5vdXRwdXRzW2ldLmdldCgpLCBfX3ZhLT5fX3JlaGFzaGVyKTsgfSwgJl92YSApIDogMDsKKyAgc3RydWN0IF9WZWN0b3JBcmdzIHsgOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgKl9fZmJiOyBjb25zdCBTaWduYXR1cmVEZWZUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKKyAgYXV0byBfaW5wdXRzID0gX28tPmlucHV0cy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpUZW5zb3JNYXA+PiAoX28tPmlucHV0cy5zaXplKCksIFtdKHNpemVfdCBpLCBfVmVjdG9yQXJncyAqX192YSkgeyByZXR1cm4gQ3JlYXRlVGVuc29yTWFwKCpfX3ZhLT5fX2ZiYiwgX192YS0+X19vLT5pbnB1dHNbaV0uZ2V0KCksIF9fdmEtPl9fcmVoYXNoZXIpOyB9LCAmX3ZhICkgOiAwOworICBhdXRvIF9vdXRwdXRzID0gX28tPm91dHB1dHMuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3I8OjpmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6VGVuc29yTWFwPj4gKF9vLT5vdXRwdXRzLnNpemUoKSwgW10oc2l6ZV90IGksIF9WZWN0b3JBcmdzICpfX3ZhKSB7IHJldHVybiBDcmVhdGVUZW5zb3JNYXAoKl9fdmEtPl9fZmJiLCBfX3ZhLT5fX28tPm91dHB1dHNbaV0uZ2V0KCksIF9fdmEtPl9fcmVoYXNoZXIpOyB9LCAmX3ZhICkgOiAwOwogICBhdXRvIF9zaWduYXR1cmVfa2V5ID0gX28tPnNpZ25hdHVyZV9rZXkuZW1wdHkoKSA/IDAgOiBfZmJiLkNyZWF0ZVN0cmluZyhfby0+c2lnbmF0dXJlX2tleSk7CiAgIGF1dG8gX3N1YmdyYXBoX2luZGV4ID0gX28tPnN1YmdyYXBoX2luZGV4OwogICByZXR1cm4gdGZsaXRlOjpDcmVhdGVTaWduYXR1cmVEZWYoCkBAIC0xNzYwMSw0MSArMjEzNzIsNDEgQEAKICAgcmV0dXJuICp0aGlzOwogfQogCi1pbmxpbmUgTW9kZWxUICpNb2RlbDo6VW5QYWNrKGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSBNb2RlbFQgKk1vZGVsOjpVblBhY2soY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqX3Jlc29sdmVyKSBjb25zdCB7CiAgIGF1dG8gX28gPSBzdGQ6OnVuaXF1ZV9wdHI8TW9kZWxUPihuZXcgTW9kZWxUKCkpOwogICBVblBhY2tUbyhfby5nZXQoKSwgX3Jlc29sdmVyKTsKICAgcmV0dXJuIF9vLnJlbGVhc2UoKTsKIH0KIAotaW5saW5lIHZvaWQgTW9kZWw6OlVuUGFja1RvKE1vZGVsVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKK2lubGluZSB2b2lkIE1vZGVsOjpVblBhY2tUbyhNb2RlbFQgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpfcmVzb2x2ZXIpIGNvbnN0IHsKICAgKHZvaWQpX287CiAgICh2b2lkKV9yZXNvbHZlcjsKICAgeyBhdXRvIF9lID0gdmVyc2lvbigpOyBfby0+dmVyc2lvbiA9IF9lOyB9Ci0gIHsgYXV0byBfZSA9IG9wZXJhdG9yX2NvZGVzKCk7IGlmIChfZSkgeyBfby0+b3BlcmF0b3JfY29kZXMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgaWYoX28tPm9wZXJhdG9yX2NvZGVzW19pXSkgeyBfZS0+R2V0KF9pKS0+VW5QYWNrVG8oX28tPm9wZXJhdG9yX2NvZGVzW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPm9wZXJhdG9yX2NvZGVzW19pXSA9IHN0ZDo6dW5pcXVlX3B0cjx0ZmxpdGU6Ok9wZXJhdG9yQ29kZVQ+KF9lLT5HZXQoX2kpLT5VblBhY2soX3Jlc29sdmVyKSk7IH07IH0gfSB9Ci0gIHsgYXV0byBfZSA9IHN1YmdyYXBocygpOyBpZiAoX2UpIHsgX28tPnN1YmdyYXBocy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBpZihfby0+c3ViZ3JhcGhzW19pXSkgeyBfZS0+R2V0KF9pKS0+VW5QYWNrVG8oX28tPnN1YmdyYXBoc1tfaV0uZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT5zdWJncmFwaHNbX2ldID0gc3RkOjp1bmlxdWVfcHRyPHRmbGl0ZTo6U3ViR3JhcGhUPihfZS0+R2V0KF9pKS0+VW5QYWNrKF9yZXNvbHZlcikpOyB9OyB9IH0gfQorICB7IGF1dG8gX2UgPSBvcGVyYXRvcl9jb2RlcygpOyBpZiAoX2UpIHsgX28tPm9wZXJhdG9yX2NvZGVzLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yICg6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgaWYoX28tPm9wZXJhdG9yX2NvZGVzW19pXSkgeyBfZS0+R2V0KF9pKS0+VW5QYWNrVG8oX28tPm9wZXJhdG9yX2NvZGVzW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPm9wZXJhdG9yX2NvZGVzW19pXSA9IHN0ZDo6dW5pcXVlX3B0cjx0ZmxpdGU6Ok9wZXJhdG9yQ29kZVQ+KF9lLT5HZXQoX2kpLT5VblBhY2soX3Jlc29sdmVyKSk7IH07IH0gfSBlbHNlIHsgX28tPm9wZXJhdG9yX2NvZGVzLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IHN1YmdyYXBocygpOyBpZiAoX2UpIHsgX28tPnN1YmdyYXBocy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IGlmKF9vLT5zdWJncmFwaHNbX2ldKSB7IF9lLT5HZXQoX2kpLT5VblBhY2tUbyhfby0+c3ViZ3JhcGhzW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPnN1YmdyYXBoc1tfaV0gPSBzdGQ6OnVuaXF1ZV9wdHI8dGZsaXRlOjpTdWJHcmFwaFQ+KF9lLT5HZXQoX2kpLT5VblBhY2soX3Jlc29sdmVyKSk7IH07IH0gfSBlbHNlIHsgX28tPnN1YmdyYXBocy5yZXNpemUoMCk7IH0gfQogICB7IGF1dG8gX2UgPSBkZXNjcmlwdGlvbigpOyBpZiAoX2UpIF9vLT5kZXNjcmlwdGlvbiA9IF9lLT5zdHIoKTsgfQotICB7IGF1dG8gX2UgPSBidWZmZXJzKCk7IGlmIChfZSkgeyBfby0+YnVmZmVycy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBpZihfby0+YnVmZmVyc1tfaV0pIHsgX2UtPkdldChfaSktPlVuUGFja1RvKF9vLT5idWZmZXJzW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPmJ1ZmZlcnNbX2ldID0gc3RkOjp1bmlxdWVfcHRyPHRmbGl0ZTo6QnVmZmVyVD4oX2UtPkdldChfaSktPlVuUGFjayhfcmVzb2x2ZXIpKTsgfTsgfSB9IH0KLSAgeyBhdXRvIF9lID0gbWV0YWRhdGFfYnVmZmVyKCk7IGlmIChfZSkgeyBfby0+bWV0YWRhdGFfYnVmZmVyLnJlc2l6ZShfZS0+c2l6ZSgpKTsgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IF9vLT5tZXRhZGF0YV9idWZmZXJbX2ldID0gX2UtPkdldChfaSk7IH0gfSB9Ci0gIHsgYXV0byBfZSA9IG1ldGFkYXRhKCk7IGlmIChfZSkgeyBfby0+bWV0YWRhdGEucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgX2kgPSAwOyBfaSA8IF9lLT5zaXplKCk7IF9pKyspIHsgaWYoX28tPm1ldGFkYXRhW19pXSkgeyBfZS0+R2V0KF9pKS0+VW5QYWNrVG8oX28tPm1ldGFkYXRhW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPm1ldGFkYXRhW19pXSA9IHN0ZDo6dW5pcXVlX3B0cjx0ZmxpdGU6Ok1ldGFkYXRhVD4oX2UtPkdldChfaSktPlVuUGFjayhfcmVzb2x2ZXIpKTsgfTsgfSB9IH0KLSAgeyBhdXRvIF9lID0gc2lnbmF0dXJlX2RlZnMoKTsgaWYgKF9lKSB7IF9vLT5zaWduYXR1cmVfZGVmcy5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBpZihfby0+c2lnbmF0dXJlX2RlZnNbX2ldKSB7IF9lLT5HZXQoX2kpLT5VblBhY2tUbyhfby0+c2lnbmF0dXJlX2RlZnNbX2ldLmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+c2lnbmF0dXJlX2RlZnNbX2ldID0gc3RkOjp1bmlxdWVfcHRyPHRmbGl0ZTo6U2lnbmF0dXJlRGVmVD4oX2UtPkdldChfaSktPlVuUGFjayhfcmVzb2x2ZXIpKTsgfTsgfSB9IH0KKyAgeyBhdXRvIF9lID0gYnVmZmVycygpOyBpZiAoX2UpIHsgX28tPmJ1ZmZlcnMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBpZihfby0+YnVmZmVyc1tfaV0pIHsgX2UtPkdldChfaSktPlVuUGFja1RvKF9vLT5idWZmZXJzW19pXS5nZXQoKSwgX3Jlc29sdmVyKTsgfSBlbHNlIHsgX28tPmJ1ZmZlcnNbX2ldID0gc3RkOjp1bmlxdWVfcHRyPHRmbGl0ZTo6QnVmZmVyVD4oX2UtPkdldChfaSktPlVuUGFjayhfcmVzb2x2ZXIpKTsgfTsgfSB9IGVsc2UgeyBfby0+YnVmZmVycy5yZXNpemUoMCk7IH0gfQorICB7IGF1dG8gX2UgPSBtZXRhZGF0YV9idWZmZXIoKTsgaWYgKF9lKSB7IF9vLT5tZXRhZGF0YV9idWZmZXIucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBfby0+bWV0YWRhdGFfYnVmZmVyW19pXSA9IF9lLT5HZXQoX2kpOyB9IH0gZWxzZSB7IF9vLT5tZXRhZGF0YV9idWZmZXIucmVzaXplKDApOyB9IH0KKyAgeyBhdXRvIF9lID0gbWV0YWRhdGEoKTsgaWYgKF9lKSB7IF9vLT5tZXRhZGF0YS5yZXNpemUoX2UtPnNpemUoKSk7IGZvciAoOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IF9pID0gMDsgX2kgPCBfZS0+c2l6ZSgpOyBfaSsrKSB7IGlmKF9vLT5tZXRhZGF0YVtfaV0pIHsgX2UtPkdldChfaSktPlVuUGFja1RvKF9vLT5tZXRhZGF0YVtfaV0uZ2V0KCksIF9yZXNvbHZlcik7IH0gZWxzZSB7IF9vLT5tZXRhZGF0YVtfaV0gPSBzdGQ6OnVuaXF1ZV9wdHI8dGZsaXRlOjpNZXRhZGF0YVQ+KF9lLT5HZXQoX2kpLT5VblBhY2soX3Jlc29sdmVyKSk7IH07IH0gfSBlbHNlIHsgX28tPm1ldGFkYXRhLnJlc2l6ZSgwKTsgfSB9CisgIHsgYXV0byBfZSA9IHNpZ25hdHVyZV9kZWZzKCk7IGlmIChfZSkgeyBfby0+c2lnbmF0dXJlX2RlZnMucmVzaXplKF9lLT5zaXplKCkpOyBmb3IgKDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBfaSA9IDA7IF9pIDwgX2UtPnNpemUoKTsgX2krKykgeyBpZihfby0+c2lnbmF0dXJlX2RlZnNbX2ldKSB7IF9lLT5HZXQoX2kpLT5VblBhY2tUbyhfby0+c2lnbmF0dXJlX2RlZnNbX2ldLmdldCgpLCBfcmVzb2x2ZXIpOyB9IGVsc2UgeyBfby0+c2lnbmF0dXJlX2RlZnNbX2ldID0gc3RkOjp1bmlxdWVfcHRyPHRmbGl0ZTo6U2lnbmF0dXJlRGVmVD4oX2UtPkdldChfaSktPlVuUGFjayhfcmVzb2x2ZXIpKTsgfTsgfSB9IGVsc2UgeyBfby0+c2lnbmF0dXJlX2RlZnMucmVzaXplKDApOyB9IH0KIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8TW9kZWw+IE1vZGVsOjpQYWNrKGZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgTW9kZWxUKiBfbywgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgeworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDxNb2RlbD4gTW9kZWw6OlBhY2soOjpmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE1vZGVsVCogX28sIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9yZWhhc2hlcikgewogICByZXR1cm4gQ3JlYXRlTW9kZWwoX2ZiYiwgX28sIF9yZWhhc2hlcik7CiB9CiAKLWlubGluZSBmbGF0YnVmZmVyczo6T2Zmc2V0PE1vZGVsPiBDcmVhdGVNb2RlbChmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IE1vZGVsVCAqX28sIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8TW9kZWw+IENyZWF0ZU1vZGVsKDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBNb2RlbFQgKl9vLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIHsKICAgKHZvaWQpX3JlaGFzaGVyOwogICAodm9pZClfbzsKLSAgc3RydWN0IF9WZWN0b3JBcmdzIHsgZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgTW9kZWxUKiBfX287IGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfX3JlaGFzaGVyOyB9IF92YSA9IHsgJl9mYmIsIF9vLCBfcmVoYXNoZXJ9OyAodm9pZClfdmE7CisgIHN0cnVjdCBfVmVjdG9yQXJncyB7IDo6ZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICpfX2ZiYjsgY29uc3QgTW9kZWxUKiBfX287IGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlaGFzaGVyX2Z1bmN0aW9uX3QgKl9fcmVoYXNoZXI7IH0gX3ZhID0geyAmX2ZiYiwgX28sIF9yZWhhc2hlcn07ICh2b2lkKV92YTsKICAgYXV0byBfdmVyc2lvbiA9IF9vLT52ZXJzaW9uOwotICBhdXRvIF9vcGVyYXRvcl9jb2RlcyA9IF9vLT5vcGVyYXRvcl9jb2Rlcy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6T3BlcmF0b3JDb2RlPj4gKF9vLT5vcGVyYXRvcl9jb2Rlcy5zaXplKCksIFtdKHNpemVfdCBpLCBfVmVjdG9yQXJncyAqX192YSkgeyByZXR1cm4gQ3JlYXRlT3BlcmF0b3JDb2RlKCpfX3ZhLT5fX2ZiYiwgX192YS0+X19vLT5vcGVyYXRvcl9jb2Rlc1tpXS5nZXQoKSwgX192YS0+X19yZWhhc2hlcik7IH0sICZfdmEgKSA6IDA7Ci0gIGF1dG8gX3N1YmdyYXBocyA9IF9vLT5zdWJncmFwaHMuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OlN1YkdyYXBoPj4gKF9vLT5zdWJncmFwaHMuc2l6ZSgpLCBbXShzaXplX3QgaSwgX1ZlY3RvckFyZ3MgKl9fdmEpIHsgcmV0dXJuIENyZWF0ZVN1YkdyYXBoKCpfX3ZhLT5fX2ZiYiwgX192YS0+X19vLT5zdWJncmFwaHNbaV0uZ2V0KCksIF9fdmEtPl9fcmVoYXNoZXIpOyB9LCAmX3ZhICkgOiAwOworICBhdXRvIF9vcGVyYXRvcl9jb2RlcyA9IF9vLT5vcGVyYXRvcl9jb2Rlcy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpPcGVyYXRvckNvZGU+PiAoX28tPm9wZXJhdG9yX2NvZGVzLnNpemUoKSwgW10oc2l6ZV90IGksIF9WZWN0b3JBcmdzICpfX3ZhKSB7IHJldHVybiBDcmVhdGVPcGVyYXRvckNvZGUoKl9fdmEtPl9fZmJiLCBfX3ZhLT5fX28tPm9wZXJhdG9yX2NvZGVzW2ldLmdldCgpLCBfX3ZhLT5fX3JlaGFzaGVyKTsgfSwgJl92YSApIDogMDsKKyAgYXV0byBfc3ViZ3JhcGhzID0gX28tPnN1YmdyYXBocy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpTdWJHcmFwaD4+IChfby0+c3ViZ3JhcGhzLnNpemUoKSwgW10oc2l6ZV90IGksIF9WZWN0b3JBcmdzICpfX3ZhKSB7IHJldHVybiBDcmVhdGVTdWJHcmFwaCgqX192YS0+X19mYmIsIF9fdmEtPl9fby0+c3ViZ3JhcGhzW2ldLmdldCgpLCBfX3ZhLT5fX3JlaGFzaGVyKTsgfSwgJl92YSApIDogMDsKICAgYXV0byBfZGVzY3JpcHRpb24gPSBfby0+ZGVzY3JpcHRpb24uZW1wdHkoKSA/IDAgOiBfZmJiLkNyZWF0ZVN0cmluZyhfby0+ZGVzY3JpcHRpb24pOwotICBhdXRvIF9idWZmZXJzID0gX28tPmJ1ZmZlcnMuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3I8ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OkJ1ZmZlcj4+IChfby0+YnVmZmVycy5zaXplKCksIFtdKHNpemVfdCBpLCBfVmVjdG9yQXJncyAqX192YSkgeyByZXR1cm4gQ3JlYXRlQnVmZmVyKCpfX3ZhLT5fX2ZiYiwgX192YS0+X19vLT5idWZmZXJzW2ldLmdldCgpLCBfX3ZhLT5fX3JlaGFzaGVyKTsgfSwgJl92YSApIDogMDsKKyAgYXV0byBfYnVmZmVycyA9IF9vLT5idWZmZXJzLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6OkJ1ZmZlcj4+IChfby0+YnVmZmVycy5zaXplKCksIFtdKHNpemVfdCBpLCBfVmVjdG9yQXJncyAqX192YSkgeyByZXR1cm4gQ3JlYXRlQnVmZmVyKCpfX3ZhLT5fX2ZiYiwgX192YS0+X19vLT5idWZmZXJzW2ldLmdldCgpLCBfX3ZhLT5fX3JlaGFzaGVyKTsgfSwgJl92YSApIDogMDsKICAgYXV0byBfbWV0YWRhdGFfYnVmZmVyID0gX28tPm1ldGFkYXRhX2J1ZmZlci5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcihfby0+bWV0YWRhdGFfYnVmZmVyKSA6IDA7Ci0gIGF1dG8gX21ldGFkYXRhID0gX28tPm1ldGFkYXRhLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpNZXRhZGF0YT4+IChfby0+bWV0YWRhdGEuc2l6ZSgpLCBbXShzaXplX3QgaSwgX1ZlY3RvckFyZ3MgKl9fdmEpIHsgcmV0dXJuIENyZWF0ZU1ldGFkYXRhKCpfX3ZhLT5fX2ZiYiwgX192YS0+X19vLT5tZXRhZGF0YVtpXS5nZXQoKSwgX192YS0+X19yZWhhc2hlcik7IH0sICZfdmEgKSA6IDA7Ci0gIGF1dG8gX3NpZ25hdHVyZV9kZWZzID0gX28tPnNpZ25hdHVyZV9kZWZzLnNpemUoKSA/IF9mYmIuQ3JlYXRlVmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpTaWduYXR1cmVEZWY+PiAoX28tPnNpZ25hdHVyZV9kZWZzLnNpemUoKSwgW10oc2l6ZV90IGksIF9WZWN0b3JBcmdzICpfX3ZhKSB7IHJldHVybiBDcmVhdGVTaWduYXR1cmVEZWYoKl9fdmEtPl9fZmJiLCBfX3ZhLT5fX28tPnNpZ25hdHVyZV9kZWZzW2ldLmdldCgpLCBfX3ZhLT5fX3JlaGFzaGVyKTsgfSwgJl92YSApIDogMDsKKyAgYXV0byBfbWV0YWRhdGEgPSBfby0+bWV0YWRhdGEuc2l6ZSgpID8gX2ZiYi5DcmVhdGVWZWN0b3I8OjpmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6TWV0YWRhdGE+PiAoX28tPm1ldGFkYXRhLnNpemUoKSwgW10oc2l6ZV90IGksIF9WZWN0b3JBcmdzICpfX3ZhKSB7IHJldHVybiBDcmVhdGVNZXRhZGF0YSgqX192YS0+X19mYmIsIF9fdmEtPl9fby0+bWV0YWRhdGFbaV0uZ2V0KCksIF9fdmEtPl9fcmVoYXNoZXIpOyB9LCAmX3ZhICkgOiAwOworICBhdXRvIF9zaWduYXR1cmVfZGVmcyA9IF9vLT5zaWduYXR1cmVfZGVmcy5zaXplKCkgPyBfZmJiLkNyZWF0ZVZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dGZsaXRlOjpTaWduYXR1cmVEZWY+PiAoX28tPnNpZ25hdHVyZV9kZWZzLnNpemUoKSwgW10oc2l6ZV90IGksIF9WZWN0b3JBcmdzICpfX3ZhKSB7IHJldHVybiBDcmVhdGVTaWduYXR1cmVEZWYoKl9fdmEtPl9fZmJiLCBfX3ZhLT5fX28tPnNpZ25hdHVyZV9kZWZzW2ldLmdldCgpLCBfX3ZhLT5fX3JlaGFzaGVyKTsgfSwgJl92YSApIDogMDsKICAgcmV0dXJuIHRmbGl0ZTo6Q3JlYXRlTW9kZWwoCiAgICAgICBfZmJiLAogICAgICAgX3ZlcnNpb24sCkBAIC0xNzY0OCw3ICsyMTQxOSw3IEBACiAgICAgICBfc2lnbmF0dXJlX2RlZnMpOwogfQogCi1pbmxpbmUgYm9vbCBWZXJpZnlRdWFudGl6YXRpb25EZXRhaWxzKGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIsIGNvbnN0IHZvaWQgKm9iaiwgUXVhbnRpemF0aW9uRGV0YWlscyB0eXBlKSB7CitpbmxpbmUgYm9vbCBWZXJpZnlRdWFudGl6YXRpb25EZXRhaWxzKDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllciwgY29uc3Qgdm9pZCAqb2JqLCBRdWFudGl6YXRpb25EZXRhaWxzIHR5cGUpIHsKICAgc3dpdGNoICh0eXBlKSB7CiAgICAgY2FzZSBRdWFudGl6YXRpb25EZXRhaWxzX05PTkU6IHsKICAgICAgIHJldHVybiB0cnVlOwpAQCAtMTc2NjEsMTAgKzIxNDMyLDEwIEBACiAgIH0KIH0KIAotaW5saW5lIGJvb2wgVmVyaWZ5UXVhbnRpemF0aW9uRGV0YWlsc1ZlY3RvcihmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyLCBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4+ICp2YWx1ZXMsIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKnR5cGVzKSB7CitpbmxpbmUgYm9vbCBWZXJpZnlRdWFudGl6YXRpb25EZXRhaWxzVmVjdG9yKDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllciwgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPj4gKnZhbHVlcywgY29uc3QgOjpmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICp0eXBlcykgewogICBpZiAoIXZhbHVlcyB8fCAhdHlwZXMpIHJldHVybiAhdmFsdWVzICYmICF0eXBlczsKICAgaWYgKHZhbHVlcy0+c2l6ZSgpICE9IHR5cGVzLT5zaXplKCkpIHJldHVybiBmYWxzZTsKLSAgZm9yIChmbGF0YnVmZmVyczo6dW9mZnNldF90IGkgPSAwOyBpIDwgdmFsdWVzLT5zaXplKCk7ICsraSkgeworICBmb3IgKDo6ZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBpID0gMDsgaSA8IHZhbHVlcy0+c2l6ZSgpOyArK2kpIHsKICAgICBpZiAoIVZlcmlmeVF1YW50aXphdGlvbkRldGFpbHMoCiAgICAgICAgIHZlcmlmaWVyLCAgdmFsdWVzLT5HZXQoaSksIHR5cGVzLT5HZXRFbnVtPFF1YW50aXphdGlvbkRldGFpbHM+KGkpKSkgewogICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTc2NzMsNyArMjE0NDQsNyBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotaW5saW5lIHZvaWQgKlF1YW50aXphdGlvbkRldGFpbHNVbmlvbjo6VW5QYWNrKGNvbnN0IHZvaWQgKm9iaiwgUXVhbnRpemF0aW9uRGV0YWlscyB0eXBlLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqcmVzb2x2ZXIpIHsKK2lubGluZSB2b2lkICpRdWFudGl6YXRpb25EZXRhaWxzVW5pb246OlVuUGFjayhjb25zdCB2b2lkICpvYmosIFF1YW50aXphdGlvbkRldGFpbHMgdHlwZSwgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqcmVzb2x2ZXIpIHsKICAgKHZvaWQpcmVzb2x2ZXI7CiAgIHN3aXRjaCAodHlwZSkgewogICAgIGNhc2UgUXVhbnRpemF0aW9uRGV0YWlsc19DdXN0b21RdWFudGl6YXRpb246IHsKQEAgLTE3Njg0LDcgKzIxNDU1LDcgQEAKICAgfQogfQogCi1pbmxpbmUgZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPiBRdWFudGl6YXRpb25EZXRhaWxzVW5pb246OlBhY2soZmxhdGJ1ZmZlcnM6OkZsYXRCdWZmZXJCdWlsZGVyICZfZmJiLCBjb25zdCBmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSBjb25zdCB7CitpbmxpbmUgOjpmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+IFF1YW50aXphdGlvbkRldGFpbHNVbmlvbjo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSBjb25zdCB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgc3dpdGNoICh0eXBlKSB7CiAgICAgY2FzZSBRdWFudGl6YXRpb25EZXRhaWxzX0N1c3RvbVF1YW50aXphdGlvbjogewpAQCAtMTc3MTksNyArMjE0OTAsNyBAQAogICB0eXBlID0gUXVhbnRpemF0aW9uRGV0YWlsc19OT05FOwogfQogCi1pbmxpbmUgYm9vbCBWZXJpZnlTcGFyc2VJbmRleFZlY3RvcihmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyLCBjb25zdCB2b2lkICpvYmosIFNwYXJzZUluZGV4VmVjdG9yIHR5cGUpIHsKK2lubGluZSBib29sIFZlcmlmeVNwYXJzZUluZGV4VmVjdG9yKDo6ZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllciwgY29uc3Qgdm9pZCAqb2JqLCBTcGFyc2VJbmRleFZlY3RvciB0eXBlKSB7CiAgIHN3aXRjaCAodHlwZSkgewogICAgIGNhc2UgU3BhcnNlSW5kZXhWZWN0b3JfTk9ORTogewogICAgICAgcmV0dXJuIHRydWU7CkBAIC0xNzc0MCwxMCArMjE1MTEsMTAgQEAKICAgfQogfQogCi1pbmxpbmUgYm9vbCBWZXJpZnlTcGFyc2VJbmRleFZlY3RvclZlY3RvcihmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyLCBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPGZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4+ICp2YWx1ZXMsIGNvbnN0IGZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKnR5cGVzKSB7CitpbmxpbmUgYm9vbCBWZXJpZnlTcGFyc2VJbmRleFZlY3RvclZlY3Rvcig6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIsIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4+ICp2YWx1ZXMsIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqdHlwZXMpIHsKICAgaWYgKCF2YWx1ZXMgfHwgIXR5cGVzKSByZXR1cm4gIXZhbHVlcyAmJiAhdHlwZXM7CiAgIGlmICh2YWx1ZXMtPnNpemUoKSAhPSB0eXBlcy0+c2l6ZSgpKSByZXR1cm4gZmFsc2U7Ci0gIGZvciAoZmxhdGJ1ZmZlcnM6OnVvZmZzZXRfdCBpID0gMDsgaSA8IHZhbHVlcy0+c2l6ZSgpOyArK2kpIHsKKyAgZm9yICg6OmZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgaSA9IDA7IGkgPCB2YWx1ZXMtPnNpemUoKTsgKytpKSB7CiAgICAgaWYgKCFWZXJpZnlTcGFyc2VJbmRleFZlY3RvcigKICAgICAgICAgdmVyaWZpZXIsICB2YWx1ZXMtPkdldChpKSwgdHlwZXMtPkdldEVudW08U3BhcnNlSW5kZXhWZWN0b3I+KGkpKSkgewogICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTc3NTIsNyArMjE1MjMsNyBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotaW5saW5lIHZvaWQgKlNwYXJzZUluZGV4VmVjdG9yVW5pb246OlVuUGFjayhjb25zdCB2b2lkICpvYmosIFNwYXJzZUluZGV4VmVjdG9yIHR5cGUsIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpyZXNvbHZlcikgeworaW5saW5lIHZvaWQgKlNwYXJzZUluZGV4VmVjdG9yVW5pb246OlVuUGFjayhjb25zdCB2b2lkICpvYmosIFNwYXJzZUluZGV4VmVjdG9yIHR5cGUsIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKnJlc29sdmVyKSB7CiAgICh2b2lkKXJlc29sdmVyOwogICBzd2l0Y2ggKHR5cGUpIHsKICAgICBjYXNlIFNwYXJzZUluZGV4VmVjdG9yX0ludDMyVmVjdG9yOiB7CkBAIC0xNzc3MSw3ICsyMTU0Miw3IEBACiAgIH0KIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4gU3BhcnNlSW5kZXhWZWN0b3JVbmlvbjo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIGNvbnN0IHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4gU3BhcnNlSW5kZXhWZWN0b3JVbmlvbjo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSBjb25zdCB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgc3dpdGNoICh0eXBlKSB7CiAgICAgY2FzZSBTcGFyc2VJbmRleFZlY3Rvcl9JbnQzMlZlY3RvcjogewpAQCAtMTc4MzIsNyArMjE2MDMsNyBAQAogICB0eXBlID0gU3BhcnNlSW5kZXhWZWN0b3JfTk9ORTsKIH0KIAotaW5saW5lIGJvb2wgVmVyaWZ5QnVpbHRpbk9wdGlvbnMoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllciwgY29uc3Qgdm9pZCAqb2JqLCBCdWlsdGluT3B0aW9ucyB0eXBlKSB7CitpbmxpbmUgYm9vbCBWZXJpZnlCdWlsdGluT3B0aW9ucyg6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIsIGNvbnN0IHZvaWQgKm9iaiwgQnVpbHRpbk9wdGlvbnMgdHlwZSkgewogICBzd2l0Y2ggKHR5cGUpIHsKICAgICBjYXNlIEJ1aWx0aW5PcHRpb25zX05PTkU6IHsKICAgICAgIHJldHVybiB0cnVlOwpAQCAtMTgzNDUsMTAgKzIyMTE2LDEwIEBACiAgIH0KIH0KIAotaW5saW5lIGJvb2wgVmVyaWZ5QnVpbHRpbk9wdGlvbnNWZWN0b3IoZmxhdGJ1ZmZlcnM6OlZlcmlmaWVyICZ2ZXJpZmllciwgY29uc3QgZmxhdGJ1ZmZlcnM6OlZlY3RvcjxmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+PiAqdmFsdWVzLCBjb25zdCBmbGF0YnVmZmVyczo6VmVjdG9yPHVpbnQ4X3Q+ICp0eXBlcykgeworaW5saW5lIGJvb2wgVmVyaWZ5QnVpbHRpbk9wdGlvbnNWZWN0b3IoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyLCBjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8OjpmbGF0YnVmZmVyczo6T2Zmc2V0PHZvaWQ+PiAqdmFsdWVzLCBjb25zdCA6OmZsYXRidWZmZXJzOjpWZWN0b3I8dWludDhfdD4gKnR5cGVzKSB7CiAgIGlmICghdmFsdWVzIHx8ICF0eXBlcykgcmV0dXJuICF2YWx1ZXMgJiYgIXR5cGVzOwogICBpZiAodmFsdWVzLT5zaXplKCkgIT0gdHlwZXMtPnNpemUoKSkgcmV0dXJuIGZhbHNlOwotICBmb3IgKGZsYXRidWZmZXJzOjp1b2Zmc2V0X3QgaSA9IDA7IGkgPCB2YWx1ZXMtPnNpemUoKTsgKytpKSB7CisgIGZvciAoOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IGkgPSAwOyBpIDwgdmFsdWVzLT5zaXplKCk7ICsraSkgewogICAgIGlmICghVmVyaWZ5QnVpbHRpbk9wdGlvbnMoCiAgICAgICAgIHZlcmlmaWVyLCAgdmFsdWVzLT5HZXQoaSksIHR5cGVzLT5HZXRFbnVtPEJ1aWx0aW5PcHRpb25zPihpKSkpIHsKICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTE4MzU3LDcgKzIyMTI4LDcgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKLWlubGluZSB2b2lkICpCdWlsdGluT3B0aW9uc1VuaW9uOjpVblBhY2soY29uc3Qgdm9pZCAqb2JqLCBCdWlsdGluT3B0aW9ucyB0eXBlLCBjb25zdCBmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqcmVzb2x2ZXIpIHsKK2lubGluZSB2b2lkICpCdWlsdGluT3B0aW9uc1VuaW9uOjpVblBhY2soY29uc3Qgdm9pZCAqb2JqLCBCdWlsdGluT3B0aW9ucyB0eXBlLCBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpyZXNvbHZlcikgewogICAodm9pZClyZXNvbHZlcjsKICAgc3dpdGNoICh0eXBlKSB7CiAgICAgY2FzZSBCdWlsdGluT3B0aW9uc19Db252MkRPcHRpb25zOiB7CkBAIC0xODg2OCw3ICsyMjYzOSw3IEBACiAgIH0KIH0KIAotaW5saW5lIGZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4gQnVpbHRpbk9wdGlvbnNVbmlvbjo6UGFjayhmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJl9mYmIsIGNvbnN0IGZsYXRidWZmZXJzOjpyZWhhc2hlcl9mdW5jdGlvbl90ICpfcmVoYXNoZXIpIGNvbnN0IHsKK2lubGluZSA6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4gQnVpbHRpbk9wdGlvbnNVbmlvbjo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSBjb25zdCB7CiAgICh2b2lkKV9yZWhhc2hlcjsKICAgc3dpdGNoICh0eXBlKSB7CiAgICAgY2FzZSBCdWlsdGluT3B0aW9uc19Db252MkRPcHRpb25zOiB7CkBAIC0yMDUyOCwxMiArMjQyOTksNTAzIEBACiAgIHR5cGUgPSBCdWlsdGluT3B0aW9uc19OT05FOwogfQogCitpbmxpbmUgYm9vbCBWZXJpZnlCdWlsdGluT3B0aW9uczIoOjpmbGF0YnVmZmVyczo6VmVyaWZpZXIgJnZlcmlmaWVyLCBjb25zdCB2b2lkICpvYmosIEJ1aWx0aW5PcHRpb25zMiB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX05PTkU6IHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnM6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9ucyAqPihvYmopOworICAgICAgcmV0dXJuIHZlcmlmaWVyLlZlcmlmeVRhYmxlKHB0cik7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9uczogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHRmbGl0ZTo6U3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zICo+KG9iaik7CisgICAgICByZXR1cm4gdmVyaWZpZXIuVmVyaWZ5VGFibGUocHRyKTsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvU2xpY2VPcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9TbGljZU9wdGlvbnMgKj4ob2JqKTsKKyAgICAgIHJldHVybiB2ZXJpZmllci5WZXJpZnlUYWJsZShwdHIpOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnM6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9ucyAqPihvYmopOworICAgICAgcmV0dXJuIHZlcmlmaWVyLlZlcmlmeVRhYmxlKHB0cik7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9DdXN0b21DYWxsT3B0aW9ucyAqPihvYmopOworICAgICAgcmV0dXJuIHZlcmlmaWVyLlZlcmlmeVRhYmxlKHB0cik7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1JlZHVjZU9wdGlvbnM6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1JlZHVjZU9wdGlvbnMgKj4ob2JqKTsKKyAgICAgIHJldHVybiB2ZXJpZmllci5WZXJpZnlUYWJsZShwdHIpOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9TY2F0dGVyT3B0aW9uczogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHRmbGl0ZTo6U3RhYmxlaGxvU2NhdHRlck9wdGlvbnMgKj4ob2JqKTsKKyAgICAgIHJldHVybiB2ZXJpZmllci5WZXJpZnlUYWJsZShwdHIpOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9Db21wYXJlT3B0aW9uczogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHRmbGl0ZTo6U3RhYmxlaGxvQ29tcGFyZU9wdGlvbnMgKj4ob2JqKTsKKyAgICAgIHJldHVybiB2ZXJpZmllci5WZXJpZnlUYWJsZShwdHIpOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zICo+KG9iaik7CisgICAgICByZXR1cm4gdmVyaWZpZXIuVmVyaWZ5VGFibGUocHRyKTsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvUGFkT3B0aW9uczogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHRmbGl0ZTo6U3RhYmxlaGxvUGFkT3B0aW9ucyAqPihvYmopOworICAgICAgcmV0dXJuIHZlcmlmaWVyLlZlcmlmeVRhYmxlKHB0cik7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0lvdGFPcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9Jb3RhT3B0aW9ucyAqPihvYmopOworICAgICAgcmV0dXJuIHZlcmlmaWVyLlZlcmlmeVRhYmxlKHB0cik7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9ucyAqPihvYmopOworICAgICAgcmV0dXJuIHZlcmlmaWVyLlZlcmlmeVRhYmxlKHB0cik7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnM6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMgKj4ob2JqKTsKKyAgICAgIHJldHVybiB2ZXJpZmllci5WZXJpZnlUYWJsZShwdHIpOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9Tb3J0T3B0aW9uczogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHRmbGl0ZTo6U3RhYmxlaGxvU29ydE9wdGlvbnMgKj4ob2JqKTsKKyAgICAgIHJldHVybiB2ZXJpZmllci5WZXJpZnlUYWJsZShwdHIpOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9XaGlsZU9wdGlvbnM6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1doaWxlT3B0aW9ucyAqPihvYmopOworICAgICAgcmV0dXJuIHZlcmlmaWVyLlZlcmlmeVRhYmxlKHB0cik7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0dhdGhlck9wdGlvbnM6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb0dhdGhlck9wdGlvbnMgKj4ob2JqKTsKKyAgICAgIHJldHVybiB2ZXJpZmllci5WZXJpZnlUYWJsZShwdHIpOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9UcmFuc3Bvc2VPcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9UcmFuc3Bvc2VPcHRpb25zICo+KG9iaik7CisgICAgICByZXR1cm4gdmVyaWZpZXIuVmVyaWZ5VGFibGUocHRyKTsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfRGlsYXRlT3B0aW9uczogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHRmbGl0ZTo6RGlsYXRlT3B0aW9ucyAqPihvYmopOworICAgICAgcmV0dXJuIHZlcmlmaWVyLlZlcmlmeVRhYmxlKHB0cik7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnM6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnMgKj4ob2JqKTsKKyAgICAgIHJldHVybiB2ZXJpZmllci5WZXJpZnlUYWJsZShwdHIpOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9SZWR1Y2VXaW5kb3dPcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpSZWR1Y2VXaW5kb3dPcHRpb25zICo+KG9iaik7CisgICAgICByZXR1cm4gdmVyaWZpZXIuVmVyaWZ5VGFibGUocHRyKTsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9uczogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHRmbGl0ZTo6U3RhYmxlSExPQ29tcG9zaXRlT3B0aW9ucyAqPihvYmopOworICAgICAgcmV0dXJuIHZlcmlmaWVyLlZlcmlmeVRhYmxlKHB0cik7CisgICAgfQorICAgIGRlZmF1bHQ6IHJldHVybiB0cnVlOworICB9Cit9CisKK2lubGluZSBib29sIFZlcmlmeUJ1aWx0aW5PcHRpb25zMlZlY3Rvcig6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIsIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjw6OmZsYXRidWZmZXJzOjpPZmZzZXQ8dm9pZD4+ICp2YWx1ZXMsIGNvbnN0IDo6ZmxhdGJ1ZmZlcnM6OlZlY3Rvcjx1aW50OF90PiAqdHlwZXMpIHsKKyAgaWYgKCF2YWx1ZXMgfHwgIXR5cGVzKSByZXR1cm4gIXZhbHVlcyAmJiAhdHlwZXM7CisgIGlmICh2YWx1ZXMtPnNpemUoKSAhPSB0eXBlcy0+c2l6ZSgpKSByZXR1cm4gZmFsc2U7CisgIGZvciAoOjpmbGF0YnVmZmVyczo6dW9mZnNldF90IGkgPSAwOyBpIDwgdmFsdWVzLT5zaXplKCk7ICsraSkgeworICAgIGlmICghVmVyaWZ5QnVpbHRpbk9wdGlvbnMyKAorICAgICAgICB2ZXJpZmllciwgIHZhbHVlcy0+R2V0KGkpLCB0eXBlcy0+R2V0RW51bTxCdWlsdGluT3B0aW9uczI+KGkpKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworaW5saW5lIHZvaWQgKkJ1aWx0aW5PcHRpb25zMlVuaW9uOjpVblBhY2soY29uc3Qgdm9pZCAqb2JqLCBCdWlsdGluT3B0aW9uczIgdHlwZSwgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqcmVzb2x2ZXIpIHsKKyAgKHZvaWQpcmVzb2x2ZXI7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9uczogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHRmbGl0ZTo6U3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zICo+KG9iaik7CisgICAgICByZXR1cm4gcHRyLT5VblBhY2socmVzb2x2ZXIpOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnM6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9ucyAqPihvYmopOworICAgICAgcmV0dXJuIHB0ci0+VW5QYWNrKHJlc29sdmVyKTsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvU2xpY2VPcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9TbGljZU9wdGlvbnMgKj4ob2JqKTsKKyAgICAgIHJldHVybiBwdHItPlVuUGFjayhyZXNvbHZlcik7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uczogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHRmbGl0ZTo6U3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zICo+KG9iaik7CisgICAgICByZXR1cm4gcHRyLT5VblBhY2socmVzb2x2ZXIpOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9DdXN0b21DYWxsT3B0aW9uczogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHRmbGl0ZTo6U3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnMgKj4ob2JqKTsKKyAgICAgIHJldHVybiBwdHItPlVuUGFjayhyZXNvbHZlcik7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1JlZHVjZU9wdGlvbnM6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1JlZHVjZU9wdGlvbnMgKj4ob2JqKTsKKyAgICAgIHJldHVybiBwdHItPlVuUGFjayhyZXNvbHZlcik7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1NjYXR0ZXJPcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9TY2F0dGVyT3B0aW9ucyAqPihvYmopOworICAgICAgcmV0dXJuIHB0ci0+VW5QYWNrKHJlc29sdmVyKTsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvQ29tcGFyZU9wdGlvbnM6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb0NvbXBhcmVPcHRpb25zICo+KG9iaik7CisgICAgICByZXR1cm4gcHRyLT5VblBhY2socmVzb2x2ZXIpOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zICo+KG9iaik7CisgICAgICByZXR1cm4gcHRyLT5VblBhY2socmVzb2x2ZXIpOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9QYWRPcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9QYWRPcHRpb25zICo+KG9iaik7CisgICAgICByZXR1cm4gcHRyLT5VblBhY2socmVzb2x2ZXIpOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9Jb3RhT3B0aW9uczogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHRmbGl0ZTo6U3RhYmxlaGxvSW90YU9wdGlvbnMgKj4ob2JqKTsKKyAgICAgIHJldHVybiBwdHItPlVuUGFjayhyZXNvbHZlcik7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9ucyAqPihvYmopOworICAgICAgcmV0dXJuIHB0ci0+VW5QYWNrKHJlc29sdmVyKTsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9uczogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHRmbGl0ZTo6U3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9ucyAqPihvYmopOworICAgICAgcmV0dXJuIHB0ci0+VW5QYWNrKHJlc29sdmVyKTsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvU29ydE9wdGlvbnM6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1NvcnRPcHRpb25zICo+KG9iaik7CisgICAgICByZXR1cm4gcHRyLT5VblBhY2socmVzb2x2ZXIpOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9XaGlsZU9wdGlvbnM6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1doaWxlT3B0aW9ucyAqPihvYmopOworICAgICAgcmV0dXJuIHB0ci0+VW5QYWNrKHJlc29sdmVyKTsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvR2F0aGVyT3B0aW9uczogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHRmbGl0ZTo6U3RhYmxlaGxvR2F0aGVyT3B0aW9ucyAqPihvYmopOworICAgICAgcmV0dXJuIHB0ci0+VW5QYWNrKHJlc29sdmVyKTsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9uczogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHRmbGl0ZTo6U3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9ucyAqPihvYmopOworICAgICAgcmV0dXJuIHB0ci0+VW5QYWNrKHJlc29sdmVyKTsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfRGlsYXRlT3B0aW9uczogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHRmbGl0ZTo6RGlsYXRlT3B0aW9ucyAqPihvYmopOworICAgICAgcmV0dXJuIHB0ci0+VW5QYWNrKHJlc29sdmVyKTsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9uczogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHRmbGl0ZTo6U3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9ucyAqPihvYmopOworICAgICAgcmV0dXJuIHB0ci0+VW5QYWNrKHJlc29sdmVyKTsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfUmVkdWNlV2luZG93T3B0aW9uczogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHRmbGl0ZTo6UmVkdWNlV2luZG93T3B0aW9ucyAqPihvYmopOworICAgICAgcmV0dXJuIHB0ci0+VW5QYWNrKHJlc29sdmVyKTsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9uczogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHRmbGl0ZTo6U3RhYmxlSExPQ29tcG9zaXRlT3B0aW9ucyAqPihvYmopOworICAgICAgcmV0dXJuIHB0ci0+VW5QYWNrKHJlc29sdmVyKTsKKyAgICB9CisgICAgZGVmYXVsdDogcmV0dXJuIG51bGxwdHI7CisgIH0KK30KKworaW5saW5lIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx2b2lkPiBCdWlsdGluT3B0aW9uczJVbmlvbjo6UGFjayg6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmX2ZiYiwgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVoYXNoZXJfZnVuY3Rpb25fdCAqX3JlaGFzaGVyKSBjb25zdCB7CisgICh2b2lkKV9yZWhhc2hlcjsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnNUICo+KHZhbHVlKTsKKyAgICAgIHJldHVybiBDcmVhdGVTdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnMoX2ZiYiwgcHRyLCBfcmVoYXNoZXIpLlVuaW9uKCk7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9uczogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHRmbGl0ZTo6U3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zVCAqPih2YWx1ZSk7CisgICAgICByZXR1cm4gQ3JlYXRlU3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zKF9mYmIsIHB0ciwgX3JlaGFzaGVyKS5VbmlvbigpOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9TbGljZU9wdGlvbnM6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1NsaWNlT3B0aW9uc1QgKj4odmFsdWUpOworICAgICAgcmV0dXJuIENyZWF0ZVN0YWJsZWhsb1NsaWNlT3B0aW9ucyhfZmJiLCBwdHIsIF9yZWhhc2hlcikuVW5pb24oKTsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNUICo+KHZhbHVlKTsKKyAgICAgIHJldHVybiBDcmVhdGVTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnMoX2ZiYiwgcHRyLCBfcmVoYXNoZXIpLlVuaW9uKCk7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9DdXN0b21DYWxsT3B0aW9uc1QgKj4odmFsdWUpOworICAgICAgcmV0dXJuIENyZWF0ZVN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zKF9mYmIsIHB0ciwgX3JlaGFzaGVyKS5VbmlvbigpOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9SZWR1Y2VPcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9SZWR1Y2VPcHRpb25zVCAqPih2YWx1ZSk7CisgICAgICByZXR1cm4gQ3JlYXRlU3RhYmxlaGxvUmVkdWNlT3B0aW9ucyhfZmJiLCBwdHIsIF9yZWhhc2hlcikuVW5pb24oKTsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvU2NhdHRlck9wdGlvbnM6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zVCAqPih2YWx1ZSk7CisgICAgICByZXR1cm4gQ3JlYXRlU3RhYmxlaGxvU2NhdHRlck9wdGlvbnMoX2ZiYiwgcHRyLCBfcmVoYXNoZXIpLlVuaW9uKCk7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0NvbXBhcmVPcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9Db21wYXJlT3B0aW9uc1QgKj4odmFsdWUpOworICAgICAgcmV0dXJuIENyZWF0ZVN0YWJsZWhsb0NvbXBhcmVPcHRpb25zKF9mYmIsIHB0ciwgX3JlaGFzaGVyKS5VbmlvbigpOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zVCAqPih2YWx1ZSk7CisgICAgICByZXR1cm4gQ3JlYXRlU3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9ucyhfZmJiLCBwdHIsIF9yZWhhc2hlcikuVW5pb24oKTsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvUGFkT3B0aW9uczogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHRmbGl0ZTo6U3RhYmxlaGxvUGFkT3B0aW9uc1QgKj4odmFsdWUpOworICAgICAgcmV0dXJuIENyZWF0ZVN0YWJsZWhsb1BhZE9wdGlvbnMoX2ZiYiwgcHRyLCBfcmVoYXNoZXIpLlVuaW9uKCk7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0lvdGFPcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9Jb3RhT3B0aW9uc1QgKj4odmFsdWUpOworICAgICAgcmV0dXJuIENyZWF0ZVN0YWJsZWhsb0lvdGFPcHRpb25zKF9mYmIsIHB0ciwgX3JlaGFzaGVyKS5VbmlvbigpOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9uczogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHRmbGl0ZTo6U3RhYmxlaGxvRG90R2VuZXJhbE9wdGlvbnNUICo+KHZhbHVlKTsKKyAgICAgIHJldHVybiBDcmVhdGVTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9ucyhfZmJiLCBwdHIsIF9yZWhhc2hlcikuVW5pb24oKTsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9uczogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHRmbGl0ZTo6U3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9uc1QgKj4odmFsdWUpOworICAgICAgcmV0dXJuIENyZWF0ZVN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnMoX2ZiYiwgcHRyLCBfcmVoYXNoZXIpLlVuaW9uKCk7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1NvcnRPcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVobG9Tb3J0T3B0aW9uc1QgKj4odmFsdWUpOworICAgICAgcmV0dXJuIENyZWF0ZVN0YWJsZWhsb1NvcnRPcHRpb25zKF9mYmIsIHB0ciwgX3JlaGFzaGVyKS5VbmlvbigpOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9XaGlsZU9wdGlvbnM6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1doaWxlT3B0aW9uc1QgKj4odmFsdWUpOworICAgICAgcmV0dXJuIENyZWF0ZVN0YWJsZWhsb1doaWxlT3B0aW9ucyhfZmJiLCBwdHIsIF9yZWhhc2hlcikuVW5pb24oKTsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvR2F0aGVyT3B0aW9uczogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHRmbGl0ZTo6U3RhYmxlaGxvR2F0aGVyT3B0aW9uc1QgKj4odmFsdWUpOworICAgICAgcmV0dXJuIENyZWF0ZVN0YWJsZWhsb0dhdGhlck9wdGlvbnMoX2ZiYiwgcHRyLCBfcmVoYXNoZXIpLlVuaW9uKCk7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnM6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB0ZmxpdGU6OlN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnNUICo+KHZhbHVlKTsKKyAgICAgIHJldHVybiBDcmVhdGVTdGFibGVobG9UcmFuc3Bvc2VPcHRpb25zKF9mYmIsIHB0ciwgX3JlaGFzaGVyKS5VbmlvbigpOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9EaWxhdGVPcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpEaWxhdGVPcHRpb25zVCAqPih2YWx1ZSk7CisgICAgICByZXR1cm4gQ3JlYXRlRGlsYXRlT3B0aW9ucyhfZmJiLCBwdHIsIF9yZWhhc2hlcikuVW5pb24oKTsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9uczogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHRmbGl0ZTo6U3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9uc1QgKj4odmFsdWUpOworICAgICAgcmV0dXJuIENyZWF0ZVN0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnMoX2ZiYiwgcHRyLCBfcmVoYXNoZXIpLlVuaW9uKCk7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1JlZHVjZVdpbmRvd09wdGlvbnM6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB0ZmxpdGU6OlJlZHVjZVdpbmRvd09wdGlvbnNUICo+KHZhbHVlKTsKKyAgICAgIHJldHVybiBDcmVhdGVSZWR1Y2VXaW5kb3dPcHRpb25zKF9mYmIsIHB0ciwgX3JlaGFzaGVyKS5VbmlvbigpOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVITE9Db21wb3NpdGVPcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdGZsaXRlOjpTdGFibGVITE9Db21wb3NpdGVPcHRpb25zVCAqPih2YWx1ZSk7CisgICAgICByZXR1cm4gQ3JlYXRlU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9ucyhfZmJiLCBwdHIsIF9yZWhhc2hlcikuVW5pb24oKTsKKyAgICB9CisgICAgZGVmYXVsdDogcmV0dXJuIDA7CisgIH0KK30KKworaW5saW5lIEJ1aWx0aW5PcHRpb25zMlVuaW9uOjpCdWlsdGluT3B0aW9uczJVbmlvbihjb25zdCBCdWlsdGluT3B0aW9uczJVbmlvbiAmdSkgOiB0eXBlKHUudHlwZSksIHZhbHVlKG51bGxwdHIpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zOiB7CisgICAgICB2YWx1ZSA9IG5ldyB0ZmxpdGU6OlN0YWJsZWhsb0NvbmNhdGVuYXRlT3B0aW9uc1QoKnJlaW50ZXJwcmV0X2Nhc3Q8dGZsaXRlOjpTdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnNUICo+KHUudmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnM6IHsKKyAgICAgIHZhbHVlID0gbmV3IHRmbGl0ZTo6U3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zVCgqcmVpbnRlcnByZXRfY2FzdDx0ZmxpdGU6OlN0YWJsZWhsb0Jyb2FkY2FzdEluRGltT3B0aW9uc1QgKj4odS52YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1NsaWNlT3B0aW9uczogeworICAgICAgdmFsdWUgPSBuZXcgdGZsaXRlOjpTdGFibGVobG9TbGljZU9wdGlvbnNUKCpyZWludGVycHJldF9jYXN0PHRmbGl0ZTo6U3RhYmxlaGxvU2xpY2VPcHRpb25zVCAqPih1LnZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zOiB7CisgICAgICB2YWx1ZSA9IG5ldyB0ZmxpdGU6OlN0YWJsZWhsb0NvbnZvbHV0aW9uT3B0aW9uc1QoKnJlaW50ZXJwcmV0X2Nhc3Q8dGZsaXRlOjpTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNUICo+KHUudmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9DdXN0b21DYWxsT3B0aW9uczogeworICAgICAgdmFsdWUgPSBuZXcgdGZsaXRlOjpTdGFibGVobG9DdXN0b21DYWxsT3B0aW9uc1QoKnJlaW50ZXJwcmV0X2Nhc3Q8dGZsaXRlOjpTdGFibGVobG9DdXN0b21DYWxsT3B0aW9uc1QgKj4odS52YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1JlZHVjZU9wdGlvbnM6IHsKKyAgICAgIHZhbHVlID0gbmV3IHRmbGl0ZTo6U3RhYmxlaGxvUmVkdWNlT3B0aW9uc1QoKnJlaW50ZXJwcmV0X2Nhc3Q8dGZsaXRlOjpTdGFibGVobG9SZWR1Y2VPcHRpb25zVCAqPih1LnZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvU2NhdHRlck9wdGlvbnM6IHsKKyAgICAgIHZhbHVlID0gbmV3IHRmbGl0ZTo6U3RhYmxlaGxvU2NhdHRlck9wdGlvbnNUKCpyZWludGVycHJldF9jYXN0PHRmbGl0ZTo6U3RhYmxlaGxvU2NhdHRlck9wdGlvbnNUICo+KHUudmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9Db21wYXJlT3B0aW9uczogeworICAgICAgdmFsdWUgPSBuZXcgdGZsaXRlOjpTdGFibGVobG9Db21wYXJlT3B0aW9uc1QoKnJlaW50ZXJwcmV0X2Nhc3Q8dGZsaXRlOjpTdGFibGVobG9Db21wYXJlT3B0aW9uc1QgKj4odS52YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0R5bmFtaWNTbGljZU9wdGlvbnM6IHsKKyAgICAgIHZhbHVlID0gbmV3IHRmbGl0ZTo6U3RhYmxlaGxvRHluYW1pY1NsaWNlT3B0aW9uc1QoKnJlaW50ZXJwcmV0X2Nhc3Q8dGZsaXRlOjpTdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zVCAqPih1LnZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvUGFkT3B0aW9uczogeworICAgICAgdmFsdWUgPSBuZXcgdGZsaXRlOjpTdGFibGVobG9QYWRPcHRpb25zVCgqcmVpbnRlcnByZXRfY2FzdDx0ZmxpdGU6OlN0YWJsZWhsb1BhZE9wdGlvbnNUICo+KHUudmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9Jb3RhT3B0aW9uczogeworICAgICAgdmFsdWUgPSBuZXcgdGZsaXRlOjpTdGFibGVobG9Jb3RhT3B0aW9uc1QoKnJlaW50ZXJwcmV0X2Nhc3Q8dGZsaXRlOjpTdGFibGVobG9Jb3RhT3B0aW9uc1QgKj4odS52YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zOiB7CisgICAgICB2YWx1ZSA9IG5ldyB0ZmxpdGU6OlN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zVCgqcmVpbnRlcnByZXRfY2FzdDx0ZmxpdGU6OlN0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zVCAqPih1LnZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvUmVkdWNlV2luZG93T3B0aW9uczogeworICAgICAgdmFsdWUgPSBuZXcgdGZsaXRlOjpTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zVCgqcmVpbnRlcnByZXRfY2FzdDx0ZmxpdGU6OlN0YWJsZWhsb1JlZHVjZVdpbmRvd09wdGlvbnNUICo+KHUudmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9Tb3J0T3B0aW9uczogeworICAgICAgdmFsdWUgPSBuZXcgdGZsaXRlOjpTdGFibGVobG9Tb3J0T3B0aW9uc1QoKnJlaW50ZXJwcmV0X2Nhc3Q8dGZsaXRlOjpTdGFibGVobG9Tb3J0T3B0aW9uc1QgKj4odS52YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1doaWxlT3B0aW9uczogeworICAgICAgdmFsdWUgPSBuZXcgdGZsaXRlOjpTdGFibGVobG9XaGlsZU9wdGlvbnNUKCpyZWludGVycHJldF9jYXN0PHRmbGl0ZTo6U3RhYmxlaGxvV2hpbGVPcHRpb25zVCAqPih1LnZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvR2F0aGVyT3B0aW9uczogeworICAgICAgdmFsdWUgPSBuZXcgdGZsaXRlOjpTdGFibGVobG9HYXRoZXJPcHRpb25zVCgqcmVpbnRlcnByZXRfY2FzdDx0ZmxpdGU6OlN0YWJsZWhsb0dhdGhlck9wdGlvbnNUICo+KHUudmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9UcmFuc3Bvc2VPcHRpb25zOiB7CisgICAgICB2YWx1ZSA9IG5ldyB0ZmxpdGU6OlN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnNUKCpyZWludGVycHJldF9jYXN0PHRmbGl0ZTo6U3RhYmxlaGxvVHJhbnNwb3NlT3B0aW9uc1QgKj4odS52YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX0RpbGF0ZU9wdGlvbnM6IHsKKyAgICAgIHZhbHVlID0gbmV3IHRmbGl0ZTo6RGlsYXRlT3B0aW9uc1QoKnJlaW50ZXJwcmV0X2Nhc3Q8dGZsaXRlOjpEaWxhdGVPcHRpb25zVCAqPih1LnZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvUm5nQml0R2VuZXJhdG9yT3B0aW9uczogeworICAgICAgdmFsdWUgPSBuZXcgdGZsaXRlOjpTdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zVCgqcmVpbnRlcnByZXRfY2FzdDx0ZmxpdGU6OlN0YWJsZWhsb1JuZ0JpdEdlbmVyYXRvck9wdGlvbnNUICo+KHUudmFsdWUpKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9SZWR1Y2VXaW5kb3dPcHRpb25zOiB7CisgICAgICB2YWx1ZSA9IG5ldyB0ZmxpdGU6OlJlZHVjZVdpbmRvd09wdGlvbnNUKCpyZWludGVycHJldF9jYXN0PHRmbGl0ZTo6UmVkdWNlV2luZG93T3B0aW9uc1QgKj4odS52YWx1ZSkpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZUhMT0NvbXBvc2l0ZU9wdGlvbnM6IHsKKyAgICAgIHZhbHVlID0gbmV3IHRmbGl0ZTo6U3RhYmxlSExPQ29tcG9zaXRlT3B0aW9uc1QoKnJlaW50ZXJwcmV0X2Nhc3Q8dGZsaXRlOjpTdGFibGVITE9Db21wb3NpdGVPcHRpb25zVCAqPih1LnZhbHVlKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK2lubGluZSB2b2lkIEJ1aWx0aW5PcHRpb25zMlVuaW9uOjpSZXNldCgpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvQ29uY2F0ZW5hdGVPcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dGZsaXRlOjpTdGFibGVobG9Db25jYXRlbmF0ZU9wdGlvbnNUICo+KHZhbHVlKTsKKyAgICAgIGRlbGV0ZSBwdHI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvQnJvYWRjYXN0SW5EaW1PcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dGZsaXRlOjpTdGFibGVobG9Ccm9hZGNhc3RJbkRpbU9wdGlvbnNUICo+KHZhbHVlKTsKKyAgICAgIGRlbGV0ZSBwdHI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvU2xpY2VPcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dGZsaXRlOjpTdGFibGVobG9TbGljZU9wdGlvbnNUICo+KHZhbHVlKTsKKyAgICAgIGRlbGV0ZSBwdHI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvQ29udm9sdXRpb25PcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dGZsaXRlOjpTdGFibGVobG9Db252b2x1dGlvbk9wdGlvbnNUICo+KHZhbHVlKTsKKyAgICAgIGRlbGV0ZSBwdHI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvQ3VzdG9tQ2FsbE9wdGlvbnM6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDx0ZmxpdGU6OlN0YWJsZWhsb0N1c3RvbUNhbGxPcHRpb25zVCAqPih2YWx1ZSk7CisgICAgICBkZWxldGUgcHRyOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1JlZHVjZU9wdGlvbnM6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDx0ZmxpdGU6OlN0YWJsZWhsb1JlZHVjZU9wdGlvbnNUICo+KHZhbHVlKTsKKyAgICAgIGRlbGV0ZSBwdHI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvU2NhdHRlck9wdGlvbnM6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDx0ZmxpdGU6OlN0YWJsZWhsb1NjYXR0ZXJPcHRpb25zVCAqPih2YWx1ZSk7CisgICAgICBkZWxldGUgcHRyOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0NvbXBhcmVPcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dGZsaXRlOjpTdGFibGVobG9Db21wYXJlT3B0aW9uc1QgKj4odmFsdWUpOworICAgICAgZGVsZXRlIHB0cjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dGZsaXRlOjpTdGFibGVobG9EeW5hbWljU2xpY2VPcHRpb25zVCAqPih2YWx1ZSk7CisgICAgICBkZWxldGUgcHRyOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1BhZE9wdGlvbnM6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDx0ZmxpdGU6OlN0YWJsZWhsb1BhZE9wdGlvbnNUICo+KHZhbHVlKTsKKyAgICAgIGRlbGV0ZSBwdHI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlaGxvSW90YU9wdGlvbnM6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDx0ZmxpdGU6OlN0YWJsZWhsb0lvdGFPcHRpb25zVCAqPih2YWx1ZSk7CisgICAgICBkZWxldGUgcHRyOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb0RvdEdlbmVyYWxPcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dGZsaXRlOjpTdGFibGVobG9Eb3RHZW5lcmFsT3B0aW9uc1QgKj4odmFsdWUpOworICAgICAgZGVsZXRlIHB0cjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dGZsaXRlOjpTdGFibGVobG9SZWR1Y2VXaW5kb3dPcHRpb25zVCAqPih2YWx1ZSk7CisgICAgICBkZWxldGUgcHRyOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1NvcnRPcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dGZsaXRlOjpTdGFibGVobG9Tb3J0T3B0aW9uc1QgKj4odmFsdWUpOworICAgICAgZGVsZXRlIHB0cjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9XaGlsZU9wdGlvbnM6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDx0ZmxpdGU6OlN0YWJsZWhsb1doaWxlT3B0aW9uc1QgKj4odmFsdWUpOworICAgICAgZGVsZXRlIHB0cjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9HYXRoZXJPcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dGZsaXRlOjpTdGFibGVobG9HYXRoZXJPcHRpb25zVCAqPih2YWx1ZSk7CisgICAgICBkZWxldGUgcHRyOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1N0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnM6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDx0ZmxpdGU6OlN0YWJsZWhsb1RyYW5zcG9zZU9wdGlvbnNUICo+KHZhbHVlKTsKKyAgICAgIGRlbGV0ZSBwdHI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfRGlsYXRlT3B0aW9uczogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PHRmbGl0ZTo6RGlsYXRlT3B0aW9uc1QgKj4odmFsdWUpOworICAgICAgZGVsZXRlIHB0cjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJ1aWx0aW5PcHRpb25zMl9TdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zOiB7CisgICAgICBhdXRvIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dGZsaXRlOjpTdGFibGVobG9SbmdCaXRHZW5lcmF0b3JPcHRpb25zVCAqPih2YWx1ZSk7CisgICAgICBkZWxldGUgcHRyOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQnVpbHRpbk9wdGlvbnMyX1JlZHVjZVdpbmRvd09wdGlvbnM6IHsKKyAgICAgIGF1dG8gcHRyID0gcmVpbnRlcnByZXRfY2FzdDx0ZmxpdGU6OlJlZHVjZVdpbmRvd09wdGlvbnNUICo+KHZhbHVlKTsKKyAgICAgIGRlbGV0ZSBwdHI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBCdWlsdGluT3B0aW9uczJfU3RhYmxlSExPQ29tcG9zaXRlT3B0aW9uczogeworICAgICAgYXV0byBwdHIgPSByZWludGVycHJldF9jYXN0PHRmbGl0ZTo6U3RhYmxlSExPQ29tcG9zaXRlT3B0aW9uc1QgKj4odmFsdWUpOworICAgICAgZGVsZXRlIHB0cjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBkZWZhdWx0OiBicmVhazsKKyAgfQorICB2YWx1ZSA9IG51bGxwdHI7CisgIHR5cGUgPSBCdWlsdGluT3B0aW9uczJfTk9ORTsKK30KKwogaW5saW5lIGNvbnN0IHRmbGl0ZTo6TW9kZWwgKkdldE1vZGVsKGNvbnN0IHZvaWQgKmJ1ZikgewotICByZXR1cm4gZmxhdGJ1ZmZlcnM6OkdldFJvb3Q8dGZsaXRlOjpNb2RlbD4oYnVmKTsKKyAgcmV0dXJuIDo6ZmxhdGJ1ZmZlcnM6OkdldFJvb3Q8dGZsaXRlOjpNb2RlbD4oYnVmKTsKIH0KIAogaW5saW5lIGNvbnN0IHRmbGl0ZTo6TW9kZWwgKkdldFNpemVQcmVmaXhlZE1vZGVsKGNvbnN0IHZvaWQgKmJ1ZikgewotICByZXR1cm4gZmxhdGJ1ZmZlcnM6OkdldFNpemVQcmVmaXhlZFJvb3Q8dGZsaXRlOjpNb2RlbD4oYnVmKTsKKyAgcmV0dXJuIDo6ZmxhdGJ1ZmZlcnM6OkdldFNpemVQcmVmaXhlZFJvb3Q8dGZsaXRlOjpNb2RlbD4oYnVmKTsKIH0KIAogaW5saW5lIGNvbnN0IGNoYXIgKk1vZGVsSWRlbnRpZmllcigpIHsKQEAgLTIwNTQxLDIyICsyNDgwMywyMiBAQAogfQogCiBpbmxpbmUgYm9vbCBNb2RlbEJ1ZmZlckhhc0lkZW50aWZpZXIoY29uc3Qgdm9pZCAqYnVmKSB7Ci0gIHJldHVybiBmbGF0YnVmZmVyczo6QnVmZmVySGFzSWRlbnRpZmllcigKKyAgcmV0dXJuIDo6ZmxhdGJ1ZmZlcnM6OkJ1ZmZlckhhc0lkZW50aWZpZXIoCiAgICAgICBidWYsIE1vZGVsSWRlbnRpZmllcigpKTsKIH0KIAogaW5saW5lIGJvb2wgU2l6ZVByZWZpeGVkTW9kZWxCdWZmZXJIYXNJZGVudGlmaWVyKGNvbnN0IHZvaWQgKmJ1ZikgewotICByZXR1cm4gZmxhdGJ1ZmZlcnM6OkJ1ZmZlckhhc0lkZW50aWZpZXIoCisgIHJldHVybiA6OmZsYXRidWZmZXJzOjpCdWZmZXJIYXNJZGVudGlmaWVyKAogICAgICAgYnVmLCBNb2RlbElkZW50aWZpZXIoKSwgdHJ1ZSk7CiB9CiAKIGlubGluZSBib29sIFZlcmlmeU1vZGVsQnVmZmVyKAotICAgIGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIHsKKyAgICA6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIHsKICAgcmV0dXJuIHZlcmlmaWVyLlZlcmlmeUJ1ZmZlcjx0ZmxpdGU6Ok1vZGVsPihNb2RlbElkZW50aWZpZXIoKSk7CiB9CiAKIGlubGluZSBib29sIFZlcmlmeVNpemVQcmVmaXhlZE1vZGVsQnVmZmVyKAotICAgIGZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIHsKKyAgICA6OmZsYXRidWZmZXJzOjpWZXJpZmllciAmdmVyaWZpZXIpIHsKICAgcmV0dXJuIHZlcmlmaWVyLlZlcmlmeVNpemVQcmVmaXhlZEJ1ZmZlcjx0ZmxpdGU6Ok1vZGVsPihNb2RlbElkZW50aWZpZXIoKSk7CiB9CiAKQEAgLTIwNTY1LDI2ICsyNDgyNywyNiBAQAogfQogCiBpbmxpbmUgdm9pZCBGaW5pc2hNb2RlbEJ1ZmZlcigKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYiwKLSAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6TW9kZWw+IHJvb3QpIHsKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6Ok1vZGVsPiByb290KSB7CiAgIGZiYi5GaW5pc2gocm9vdCwgTW9kZWxJZGVudGlmaWVyKCkpOwogfQogCiBpbmxpbmUgdm9pZCBGaW5pc2hTaXplUHJlZml4ZWRNb2RlbEJ1ZmZlcigKLSAgICBmbGF0YnVmZmVyczo6RmxhdEJ1ZmZlckJ1aWxkZXIgJmZiYiwKLSAgICBmbGF0YnVmZmVyczo6T2Zmc2V0PHRmbGl0ZTo6TW9kZWw+IHJvb3QpIHsKKyAgICA6OmZsYXRidWZmZXJzOjpGbGF0QnVmZmVyQnVpbGRlciAmZmJiLAorICAgIDo6ZmxhdGJ1ZmZlcnM6Ok9mZnNldDx0ZmxpdGU6Ok1vZGVsPiByb290KSB7CiAgIGZiYi5GaW5pc2hTaXplUHJlZml4ZWQocm9vdCwgTW9kZWxJZGVudGlmaWVyKCkpOwogfQogCiBpbmxpbmUgc3RkOjp1bmlxdWVfcHRyPHRmbGl0ZTo6TW9kZWxUPiBVblBhY2tNb2RlbCgKICAgICBjb25zdCB2b2lkICpidWYsCi0gICAgY29uc3QgZmxhdGJ1ZmZlcnM6OnJlc29sdmVyX2Z1bmN0aW9uX3QgKnJlcyA9IG51bGxwdHIpIHsKKyAgICBjb25zdCA6OmZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpyZXMgPSBudWxscHRyKSB7CiAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8dGZsaXRlOjpNb2RlbFQ+KEdldE1vZGVsKGJ1ZiktPlVuUGFjayhyZXMpKTsKIH0KIAogaW5saW5lIHN0ZDo6dW5pcXVlX3B0cjx0ZmxpdGU6Ok1vZGVsVD4gVW5QYWNrU2l6ZVByZWZpeGVkTW9kZWwoCiAgICAgY29uc3Qgdm9pZCAqYnVmLAotICAgIGNvbnN0IGZsYXRidWZmZXJzOjpyZXNvbHZlcl9mdW5jdGlvbl90ICpyZXMgPSBudWxscHRyKSB7CisgICAgY29uc3QgOjpmbGF0YnVmZmVyczo6cmVzb2x2ZXJfZnVuY3Rpb25fdCAqcmVzID0gbnVsbHB0cikgewogICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPHRmbGl0ZTo6TW9kZWxUPihHZXRTaXplUHJlZml4ZWRNb2RlbChidWYpLT5VblBhY2socmVzKSk7CiB9CiAKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS9zY2hlbWEvc2NoZW1hX3V0aWxzLmggYi90ZW5zb3JmbG93L2xpdGUvc2NoZW1hL3NjaGVtYV91dGlscy5oCmluZGV4IDljY2EzNmMuLmZmMDRjZjEgMTAwNjQ0Ci0tLSBhL3RlbnNvcmZsb3cvbGl0ZS9zY2hlbWEvc2NoZW1hX3V0aWxzLmgKKysrIGIvdGVuc29yZmxvdy9saXRlL3NjaGVtYS9zY2hlbWFfdXRpbHMuaApAQCAtMTUsMTkgKzE1LDYgQEAKICNpZm5kZWYgVEVOU09SRkxPV19MSVRFX1NDSEVNQV9TQ0hFTUFfVVRJTFNfSF8KICNkZWZpbmUgVEVOU09SRkxPV19MSVRFX1NDSEVNQV9TQ0hFTUFfVVRJTFNfSF8KIAotI2luY2x1ZGUgImZsYXRidWZmZXJzL2ZsYXRidWZmZXJzLmgiCi0jaW5jbHVkZSAidGVuc29yZmxvdy9saXRlL3NjaGVtYS9zY2hlbWFfZ2VuZXJhdGVkLmgiCi0KLW5hbWVzcGFjZSB0ZmxpdGUgewotCi0vLyBUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIGludHJvZHVjZWQgdG8gcmVzb2x2ZSBvcCBidWlsdGluIGNvZGUgc2hvcnRhZ2UKLS8vIHByb2JsZW0uIFRoZSBuZXcgYnVpbHRpbiBvcGVyYXRvciB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBleHRlbmRlZCBidWlsdGluCi0vLyBjb2RlIGZpZWxkIGluIHRoZSBmbGF0YnVmZmVyIHNjaGVtYS4gVGhvc2UgbWV0aG9kcyBoZWxwcyB0byBoaWRlIGJ1aWx0aW4gY29kZQotLy8gZGV0YWlscy4KLUJ1aWx0aW5PcGVyYXRvciBHZXRCdWlsdGluQ29kZShjb25zdCBPcGVyYXRvckNvZGUgKm9wX2NvZGUpOwotCi1CdWlsdGluT3BlcmF0b3IgR2V0QnVpbHRpbkNvZGUoY29uc3QgT3BlcmF0b3JDb2RlVCAqb3BfY29kZSk7Ci0KLX0gIC8vIG5hbWVzcGFjZSB0ZmxpdGUKKyNpbmNsdWRlICJ0ZW5zb3JmbG93L2NvbXBpbGVyL21saXIvbGl0ZS9zY2hlbWEvc2NoZW1hX3V0aWxzLmgiICAvLyBJV1lVIHByYWdtYToga2VlcAogCiAjZW5kaWYgIC8vIFRFTlNPUkZMT1dfTElURV9TQ0hFTUFfU0NIRU1BX1VUSUxTX0hfCmRpZmYgLS1naXQgYS90ZW5zb3JmbG93L2xpdGUvdG9vbHMvQlVJTEQgYi90ZW5zb3JmbG93L2xpdGUvdG9vbHMvQlVJTEQKaW5kZXggYjUwNzNjOS4uZTdkNTExNCAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL3Rvb2xzL0JVSUxECisrKyBiL3RlbnNvcmZsb3cvbGl0ZS90b29scy9CVUlMRApAQCAtNyw3ICs3LDcgQEAKICAgICB2aXNpYmlsaXR5ID0gWyIvLzpfX3N1YnBhY2thZ2VzX18iXSwKICAgICBkZXBzID0gWwogICAgICAgICAiQGZsYXRidWZmZXJzLy86cnVudGltZV9weSIsCi0gICAgICAgIHJlcXVpcmVtZW50KCJ0ZW5zb3JmbG93LWNwdSIpLAorICAgICAgICByZXF1aXJlbWVudCgidGVuc29yZmxvdyIpLAogICAgICAgICAiLy90ZW5zb3JmbG93L2xpdGUvcHl0aG9uOnNjaGVtYV9weSIsCiAgICAgICAgICIvL3RlbnNvcmZsb3cvbGl0ZS9weXRob246c2NoZW1hX3V0aWwiLAogICAgIF0sCkBAIC0xOSw3ICsxOSw3IEBACiAgICAgc3Jjc192ZXJzaW9uID0gIlBZMyIsCiAgICAgZGVwcyA9IFsKICAgICAgICAgIkBmbGF0YnVmZmVycy8vOnJ1bnRpbWVfcHkiLAotICAgICAgICByZXF1aXJlbWVudCgidGVuc29yZmxvdy1jcHUiKSwKKyAgICAgICAgcmVxdWlyZW1lbnQoInRlbnNvcmZsb3ciKSwKICAgICAgICAgIi8vdGVuc29yZmxvdy9saXRlL3B5dGhvbjpzY2hlbWFfcHkiLAogICAgIF0sCiApCkBAIC01Niw3ICs1Niw3IEBACiAgICAgZGVwcyA9IFsKICAgICAgICAgIjpmbGF0YnVmZmVyX3V0aWxzIiwKICAgICAgICAgIjp0ZXN0X3V0aWxzIiwKLSAgICAgICAgcmVxdWlyZW1lbnQoInRlbnNvcmZsb3ctY3B1IiksCisgICAgICAgIHJlcXVpcmVtZW50KCJ0ZW5zb3JmbG93IiksCiAgICAgXSwKICkKIApAQCAtNjgsNiArNjgsNiBAQAogICAgIGRlcHMgPSBbCiAgICAgICAgICI6dGVzdF91dGlscyIsCiAgICAgICAgICI6dmlzdWFsaXplIiwKLSAgICAgICAgcmVxdWlyZW1lbnQoInRlbnNvcmZsb3ctY3B1IiksCisgICAgICAgIHJlcXVpcmVtZW50KCJ0ZW5zb3JmbG93IiksCiAgICAgXSwKICkKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS90b29scy9mbGF0YnVmZmVyX3V0aWxzLnB5IGIvdGVuc29yZmxvdy9saXRlL3Rvb2xzL2ZsYXRidWZmZXJfdXRpbHMucHkKaW5kZXggZjQ0OGJmYS4uYTdkMWRkMSAxMDA2NDQKLS0tIGEvdGVuc29yZmxvdy9saXRlL3Rvb2xzL2ZsYXRidWZmZXJfdXRpbHMucHkKKysrIGIvdGVuc29yZmxvdy9saXRlL3Rvb2xzL2ZsYXRidWZmZXJfdXRpbHMucHkKQEAgLTU4LDkgKzU4LDM4IEBACiAgICAgcmFpc2UgUnVudGltZUVycm9yKCdJbnB1dCBmaWxlIG5vdCBmb3VuZCBhdCAlclxuJyAlIGlucHV0X3RmbGl0ZV9maWxlKQogICB3aXRoIGdmaWxlLkdGaWxlKGlucHV0X3RmbGl0ZV9maWxlLCAncmInKSBhcyBpbnB1dF9maWxlX2hhbmRsZToKICAgICBtb2RlbF9ieXRlYXJyYXkgPSBieXRlYXJyYXkoaW5wdXRfZmlsZV9oYW5kbGUucmVhZCgpKQorICByZXR1cm4gcmVhZF9tb2RlbF9mcm9tX2J5dGVhcnJheShtb2RlbF9ieXRlYXJyYXkpCisKKworZGVmIHJlYWRfbW9kZWxfZnJvbV9ieXRlYXJyYXkobW9kZWxfYnl0ZWFycmF5KToKKyAgIiIiUmVhZHMgYSB0ZmxpdGUgbW9kZWwgYXMgYSBweXRob24gb2JqZWN0LgorCisgIEFyZ3M6CisgICAgbW9kZWxfYnl0ZWFycmF5OiBURkxpdGUgbW9kZWwgaW4gYnl0ZWFycmF5IGZvcm1hdC4KKworICBSZXR1cm5zOgorICAgIEEgcHl0aG9uIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCB0ZmxpdGUgZmlsZS4KKyAgIiIiCiAgIG1vZGVsID0gY29udmVydF9ieXRlYXJyYXlfdG9fb2JqZWN0KG1vZGVsX2J5dGVhcnJheSkKICAgaWYgc3lzLmJ5dGVvcmRlciA9PSAnYmlnJzoKICAgICBieXRlX3N3YXBfdGZsaXRlX21vZGVsX29iaihtb2RlbCwgJ2xpdHRsZScsICdiaWcnKQorCisgICMgT2Zmc2V0IGhhbmRsaW5nIGZvciBtb2RlbHMgPiAyR0IKKyAgZm9yIGJ1ZmZlciBpbiBtb2RlbC5idWZmZXJzOgorICAgIGlmIGJ1ZmZlci5vZmZzZXQ6CisgICAgICBidWZmZXIuZGF0YSA9IG1vZGVsX2J5dGVhcnJheVtidWZmZXIub2Zmc2V0IDogYnVmZmVyLm9mZnNldCArIGJ1ZmZlci5zaXplXQorICAgICAgYnVmZmVyLm9mZnNldCA9IDAKKyAgICAgIGJ1ZmZlci5zaXplID0gMAorICBmb3Igc3ViZ3JhcGggaW4gbW9kZWwuc3ViZ3JhcGhzOgorICAgIGZvciBvcCBpbiBzdWJncmFwaC5vcGVyYXRvcnM6CisgICAgICBpZiBvcC5sYXJnZUN1c3RvbU9wdGlvbnNPZmZzZXQ6CisgICAgICAgIG9wLmN1c3RvbU9wdGlvbnMgPSBtb2RlbF9ieXRlYXJyYXlbCisgICAgICAgICAgICBvcC5sYXJnZUN1c3RvbU9wdGlvbnNPZmZzZXQgOiBvcC5sYXJnZUN1c3RvbU9wdGlvbnNPZmZzZXQKKyAgICAgICAgICAgICsgb3AubGFyZ2VDdXN0b21PcHRpb25zU2l6ZQorICAgICAgICBdCisgICAgICAgIG9wLmxhcmdlQ3VzdG9tT3B0aW9uc09mZnNldCA9IDAKKyAgICAgICAgb3AubGFyZ2VDdXN0b21PcHRpb25zU2l6ZSA9IDAKKwogICByZXR1cm4gbW9kZWwKIAogCkBAIC0yOTQsMTQgKzMyMywyOSBAQAogICAgICAgYnVmZmVyLmRhdGFbaSA6IGkgKyBjaHVua3NpemVdCiAgICAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4oYnVmZmVyLmRhdGEpLCBjaHVua3NpemUpCiAgIF0KLSAgYnVmZmVyLmRhdGEgPSBiJycuam9pbigKLSAgICAgIFsKLSAgICAgICAgICBpbnQuZnJvbV9ieXRlcyhieXRlc3dhcCwgZnJvbV9lbmRpbmVzcykudG9fYnl0ZXMoCi0gICAgICAgICAgICAgIGNodW5rc2l6ZSwgdG9fZW5kaW5lc3MKLSAgICAgICAgICApCi0gICAgICAgICAgZm9yIGJ5dGVzd2FwIGluIHRvX3N3YXAKLSAgICAgIF0KLSAgKQorICBidWZmZXIuZGF0YSA9IGInJy5qb2luKFsKKyAgICAgIGludC5mcm9tX2J5dGVzKGJ5dGVzd2FwLCBmcm9tX2VuZGluZXNzKS50b19ieXRlcyhjaHVua3NpemUsIHRvX2VuZGluZXNzKQorICAgICAgZm9yIGJ5dGVzd2FwIGluIHRvX3N3YXAKKyAgXSkKKworCitkZWYgYnl0ZV9zd2FwX3N0cmluZ19jb250ZW50KGJ1ZmZlciwgZnJvbV9lbmRpbmVzcywgdG9fZW5kaW5lc3MpOgorICAiIiJIZWxwZXIgZnVuY3Rpb24gZm9yIGJ5dGUtc3dhcHBpbmcgdGhlIHN0cmluZyBidWZmZXIuCisKKyAgQXJnczoKKyAgICBidWZmZXI6IFRGTGl0ZSBzdHJpbmcgYnVmZmVyIG9mIGZyb21fZW5kaW5lc3MgZm9ybWF0LgorICAgIGZyb21fZW5kaW5lc3M6IFRoZSBvcmlnaW5hbCBlbmRpYW5uZXNzIGZvcm1hdCBvZiB0aGUgc3RyaW5nIGJ1ZmZlci4KKyAgICB0b19lbmRpbmVzczogVGhlIGRlc3RpbmVkIGVuZGlhbm5lc3MgZm9ybWF0IG9mIHRoZSBzdHJpbmcgYnVmZmVyLgorICAiIiIKKyAgbnVtX29mX3N0cmluZ3MgPSBpbnQuZnJvbV9ieXRlcyhidWZmZXIuZGF0YVswOjRdLCBmcm9tX2VuZGluZXNzKQorICBzdHJpbmdfY29udGVudCA9IGJ5dGVhcnJheShidWZmZXIuZGF0YVs0ICogKG51bV9vZl9zdHJpbmdzICsgMikgOl0pCisgIHByZWZpeF9kYXRhID0gYicnLmpvaW4oWworICAgICAgaW50LmZyb21fYnl0ZXMoYnVmZmVyLmRhdGFbaSA6IGkgKyA0XSwgZnJvbV9lbmRpbmVzcykudG9fYnl0ZXMoCisgICAgICAgICAgNCwgdG9fZW5kaW5lc3MKKyAgICAgICkKKyAgICAgIGZvciBpIGluIHJhbmdlKDAsIChudW1fb2Zfc3RyaW5ncyArIDEpICogNCArIDEsIDQpCisgIF0pCisgIGJ1ZmZlci5kYXRhID0gcHJlZml4X2RhdGEgKyBzdHJpbmdfY29udGVudAogCiAKIGRlZiBieXRlX3N3YXBfdGZsaXRlX21vZGVsX29iaihtb2RlbCwgZnJvbV9lbmRpbmVzcywgdG9fZW5kaW5lc3MpOgpAQCAtMzQxLDcgKzM4NSwxMSBAQAogICAgICAgICAgIGFuZCB0ZW5zb3IuYnVmZmVyIG5vdCBpbiBidWZmZXJfc3dhcHBlZAogICAgICAgICAgIGFuZCBtb2RlbC5idWZmZXJzW3RlbnNvci5idWZmZXJdLmRhdGEgaXMgbm90IE5vbmUKICAgICAgICk6Ci0gICAgICAgIGlmIHRlbnNvci50eXBlIGluIHR5cGVzX29mXzE2X2JpdHM6CisgICAgICAgIGlmIHRlbnNvci50eXBlID09IHNjaGVtYV9mYi5UZW5zb3JUeXBlLlNUUklORzoKKyAgICAgICAgICBieXRlX3N3YXBfc3RyaW5nX2NvbnRlbnQoCisgICAgICAgICAgICAgIG1vZGVsLmJ1ZmZlcnNbdGVuc29yLmJ1ZmZlcl0sIGZyb21fZW5kaW5lc3MsIHRvX2VuZGluZXNzCisgICAgICAgICAgKQorICAgICAgICBlbGlmIHRlbnNvci50eXBlIGluIHR5cGVzX29mXzE2X2JpdHM6CiAgICAgICAgICAgYnl0ZV9zd2FwX2J1ZmZlcl9jb250ZW50KAogICAgICAgICAgICAgICBtb2RlbC5idWZmZXJzW3RlbnNvci5idWZmZXJdLCAyLCBmcm9tX2VuZGluZXNzLCB0b19lbmRpbmVzcwogICAgICAgICAgICkKZGlmZiAtLWdpdCBhL3RlbnNvcmZsb3cvbGl0ZS90b29scy9yYW5kb21pemVfd2VpZ2h0cy5weSBiL3RlbnNvcmZsb3cvbGl0ZS90b29scy9yYW5kb21pemVfd2VpZ2h0cy5weQppbmRleCAyYjM2ZmIxLi40YmFmNTBkIDEwMDY0NAotLS0gYS90ZW5zb3JmbG93L2xpdGUvdG9vbHMvcmFuZG9taXplX3dlaWdodHMucHkKKysrIGIvdGVuc29yZmxvdy9saXRlL3Rvb2xzL3JhbmRvbWl6ZV93ZWlnaHRzLnB5CkBAIC0zMCw2ICszMCwxNSBAQAogICAgICdpLmUuLCB0byBiZSBsZWZ0IHVubW9kaWZpZWQuJykKIGZsYWdzLkRFRklORV9tdWx0aV9zdHJpbmcoCiAgICAgJ29wc190b19za2lwJywgW10sICdPcHMgaW4gdGhlIFRGTGl0ZSBtb2RlbCB0byBiZSBza2lwcGVkIC8gdW5tb2RpZmllZC4nKQorZmxhZ3MuREVGSU5FX211bHRpX3N0cmluZygKKyAgICAnb3BzX29wZXJhbmRzX3RvX3NraXAnLAorICAgIFtdLAorICAgICdPcCBvcGVyYW5kIGluZGljZXMgaW4gdGhlIFRGTGl0ZSBtb2RlbCB0byBiZSBza2lwcGVkIC8gdW5tb2RpZmllZC4gSXQnCisgICAgJyBzaG91bGQgYmUgc3BlY2lmaWVkIGluIHRoZSBmb3JtYXQnCisgICAgJyA8b3BfbmFtZT46PG9wZXJhbmRfaW5kZXg+Wyw8b3BlcmFuZF9pbmRleD5dLiBGb3IgZXhhbXBsZSwnCisgICAgJyBUUkFOU1BPU0VfQ09OVjowLDIgc3RhbmRzIGZvciBza2lwcGluZyB0aGUgVFJBTlNQT1NFX0NPTlYgb3BlcmFuZHMnCisgICAgJyBpbmRleGVkIDAgYW5kIDInLAorKQogZmxhZ3MuREVGSU5FX2ludGVnZXIoJ3JhbmRvbV9zZWVkJywgMCwgJ0lucHV0IHRvIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4nKQogCiBmbGFncy5tYXJrX2ZsYWdfYXNfcmVxdWlyZWQoJ2lucHV0X3RmbGl0ZV9maWxlJykKQEAgLTM5LDE1ICs0OCwzMSBAQAogZGVmIG1haW4oXyk6CiAgIGJ1ZmZlcnNfdG9fc2tpcCA9IEZMQUdTLmJ1ZmZlcnNfdG9fc2tpcAogICBvcHNfdG9fc2tpcCA9IFtvcC51cHBlcigpIGZvciBvcCBpbiBGTEFHUy5vcHNfdG9fc2tpcF0KKyAgb3BzX29wZXJhbmRzX3RvX3NraXAgPSB7fQorICBmb3Igb3Bfb3BlcmFuZHNfdG9fc2tpcCBpbiBGTEFHUy5vcHNfb3BlcmFuZHNfdG9fc2tpcDoKKyAgICBvcF9uYW1lLCBpbmRpY2VzID0gb3Bfb3BlcmFuZHNfdG9fc2tpcC5zcGxpdCgnOicpCisgICAgb3BfbmFtZV91cHBlciA9IG9wX25hbWUudXBwZXIoKQorICAgIGlmIG9wX25hbWVfdXBwZXIgaW4gb3BzX29wZXJhbmRzX3RvX3NraXA6CisgICAgICByYWlzZSBWYWx1ZUVycm9yKAorICAgICAgICAgICdJbmRpY2VzIGZvciB0aGUgc2FtZSBvcCBtdXN0IGJlIHNwZWNpZmllZCBvbmx5IG9uY2UgbXVsdGlwbGUnCisgICAgICAgICAgZicgc3BlY2lmaWNhdGlvbiBmb3Igb3Age29wX25hbWV9LicKKyAgICAgICkKKyAgICBvcHNfb3BlcmFuZHNfdG9fc2tpcFtvcF9uYW1lX3VwcGVyXSA9IGxpc3QobWFwKGludCwgaW5kaWNlcy5zcGxpdCgnLCcpKSkKKwogICBtb2RlbCA9IGZsYXRidWZmZXJfdXRpbHMucmVhZF9tb2RlbChGTEFHUy5pbnB1dF90ZmxpdGVfZmlsZSkKIAotICAjIEFkZCBpbiBidWZmZXJzIGZvciBvcHMgaW4gb3BzX3RvX3NraXAgdG8gdGhlIGxpc3Qgb2Ygc2tpcHBlZCBidWZmZXJzLgorICAjIEFkZCBpbiBidWZmZXJzIGZvciBvcHMgaW4gb3BzX3RvX3NraXAgb3Igb3BzX29wZXJhbmRzX3RvX3NraXAgdG8gdGhlIGxpc3Qgb2YKKyAgIyBza2lwcGVkIGJ1ZmZlcnMuCiAgIGZvciBncmFwaCBpbiBtb2RlbC5zdWJncmFwaHM6CiAgICAgZm9yIG9wIGluIGdyYXBoLm9wZXJhdG9yczoKICAgICAgIG9wX25hbWUgPSBmbGF0YnVmZmVyX3V0aWxzLm9wY29kZV90b19uYW1lKG1vZGVsLCBvcC5vcGNvZGVJbmRleCkKLSAgICAgIGlmIG9wX25hbWUudXBwZXIoKSBpbiBvcHNfdG9fc2tpcDoKKyAgICAgIG9wX25hbWVfdXBwZXIgPSBvcF9uYW1lLnVwcGVyKCkKKyAgICAgIGlmIG9wX25hbWVfdXBwZXIgaW4gb3BzX3RvX3NraXA6CiAgICAgICAgIGZvciBpbnB1dF9pZHggaW4gb3AuaW5wdXRzOgogICAgICAgICAgIGJ1ZmZlcnNfdG9fc2tpcC5hcHBlbmQoZ3JhcGgudGVuc29yc1tpbnB1dF9pZHhdLmJ1ZmZlcikKKyAgICAgIGlmIG9wX25hbWVfdXBwZXIgaW4gb3BzX29wZXJhbmRzX3RvX3NraXA6CisgICAgICAgIGZvciBvcGVyYW5kX2lkeCBpbiBvcHNfb3BlcmFuZHNfdG9fc2tpcFtvcF9uYW1lX3VwcGVyXToKKyAgICAgICAgICBidWZmZXJzX3RvX3NraXAuYXBwZW5kKGdyYXBoLnRlbnNvcnNbb3AuaW5wdXRzW29wZXJhbmRfaWR4XV0uYnVmZmVyKQogCiAgIGZsYXRidWZmZXJfdXRpbHMucmFuZG9taXplX3dlaWdodHMobW9kZWwsIEZMQUdTLnJhbmRvbV9zZWVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMQUdTLmJ1ZmZlcnNfdG9fc2tpcCkKZGlmZiAtLWdpdCBhL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL0JVSUxELmV4dGVybmFsIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvQlVJTEQub3NzCnNpbWlsYXJpdHkgaW5kZXggODYlCnJlbmFtZSBmcm9tIHRoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL0JVSUxELmV4dGVybmFsCnJlbmFtZSB0byB0aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9CVUlMRC5vc3MKaW5kZXggZGZkM2ExNi4uOGY5ZDRlYiAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvQlVJTEQuZXh0ZXJuYWwKKysrIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvQlVJTEQub3NzCkBAIC0yLDMwICsyLDIzIEBACiAKIHBhY2thZ2UoZGVmYXVsdF92aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0pCiAKLWxpY2Vuc2VzKFsibm90aWNlIl0pCitsaWNlbnNlcyhbIm5vdGljZSJdKSAgIyBBcGFjaGUgMi4wCiAKLWV4cG9ydHNfZmlsZXMoWyJMSUNFTlNFLnR4dCJdKQotCi1saWNlbnNlcyhbIm5vdGljZSJdKQorZXhwb3J0c19maWxlcyhbIkxJQ0VOU0UiXSkKIAogY29uZmlnX3NldHRpbmcoCi0gICAgbmFtZSA9ICJmcmVlYnNkIiwKKyAgICBuYW1lID0gInBsYXRmb3JtX2ZyZWVic2QiLAogICAgIHZhbHVlcyA9IHsiY3B1IjogImZyZWVic2QifSwKICkKIAogY29uZmlnX3NldHRpbmcoCi0gICAgbmFtZSA9ICJ3aW5kb3dzIiwKLSAgICB2YWx1ZXMgPSB7ImNwdSI6ICJ4NjRfd2luZG93cyJ9LAotKQotCi1jb25maWdfc2V0dGluZygKICAgICBuYW1lID0gInBsYXRmb3JtX29wZW5ic2QiLAogICAgIHZhbHVlcyA9IHsiY3B1IjogIm9wZW5ic2QifSwKICkKIAogY29uZmlnX3NldHRpbmcoCi0gICAgbmFtZSA9ICJwbGF0Zm9ybV9mcmVlYnNkIiwKLSAgICB2YWx1ZXMgPSB7ImNwdSI6ICJmcmVlYnNkIn0sCisgICAgbmFtZSA9ICJ3aW5kb3dzIiwKKyAgICB2YWx1ZXMgPSB7ImNwdSI6ICJ4NjRfd2luZG93cyJ9LAogKQogCiBsb2FkKCJAcnVsZXNfY2MvL2NjOmRlZnMuYnpsIiwgImNjX2JpbmFyeSIsICJjY19saWJyYXJ5IikKQEAgLTQ3LDEyICs0MCwxMyBAQAogICAgICAgICAiaW5jbHVkZS9mbGF0YnVmZmVycy9hbGxvY2F0b3IuaCIsCiAgICAgICAgICJpbmNsdWRlL2ZsYXRidWZmZXJzL2FycmF5LmgiLAogICAgICAgICAiaW5jbHVkZS9mbGF0YnVmZmVycy9iYXNlLmgiLAotICAgICAgICAiaW5jbHVkZS9mbGF0YnVmZmVycy9iZmJzX2dlbmVyYXRvci5oIiwKICAgICAgICAgImluY2x1ZGUvZmxhdGJ1ZmZlcnMvYnVmZmVyLmgiLAogICAgICAgICAiaW5jbHVkZS9mbGF0YnVmZmVycy9idWZmZXJfcmVmLmgiLAorICAgICAgICAiaW5jbHVkZS9mbGF0YnVmZmVycy9jb2RlX2dlbmVyYXRvci5oIiwKICAgICAgICAgImluY2x1ZGUvZmxhdGJ1ZmZlcnMvY29kZV9nZW5lcmF0b3JzLmgiLAogICAgICAgICAiaW5jbHVkZS9mbGF0YnVmZmVycy9kZWZhdWx0X2FsbG9jYXRvci5oIiwKICAgICAgICAgImluY2x1ZGUvZmxhdGJ1ZmZlcnMvZGV0YWNoZWRfYnVmZmVyLmgiLAorICAgICAgICAiaW5jbHVkZS9mbGF0YnVmZmVycy9maWxlX21hbmFnZXIuaCIsCiAgICAgICAgICJpbmNsdWRlL2ZsYXRidWZmZXJzL2ZsYXRidWZmZXJfYnVpbGRlci5oIiwKICAgICAgICAgImluY2x1ZGUvZmxhdGJ1ZmZlcnMvZmxhdGJ1ZmZlcnMuaCIsCiAgICAgICAgICJpbmNsdWRlL2ZsYXRidWZmZXJzL2ZsZXhfZmxhdF91dGlsLmgiLApAQCAtNzMsNyArNjcsNyBAQAogICAgICAgICAiaW5jbHVkZS9mbGF0YnVmZmVycy92ZWN0b3JfZG93bndhcmQuaCIsCiAgICAgICAgICJpbmNsdWRlL2ZsYXRidWZmZXJzL3ZlcmlmaWVyLmgiLAogICAgIF0sCi0gICAgdmlzaWJpbGl0eSA9IFsiLy86X19zdWJwYWNrYWdlc19fIl0sCisgICAgdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdLAogKQogCiAjIFB1YmxpYyBmbGF0YyBjb21waWxlciBsaWJyYXJ5LgpAQCAtOTAsOSArODQsMTEgQEAKIGNjX2JpbmFyeSgKICAgICBuYW1lID0gImZsYXRjIiwKICAgICBsaW5rb3B0cyA9IHNlbGVjdCh7Ci0gICAgICAgICI6ZnJlZWJzZCI6IFsKKyAgICAgICAgIjpwbGF0Zm9ybV9mcmVlYnNkIjogWwogICAgICAgICAgICAgIi1sbSIsCiAgICAgICAgIF0sCisgICAgICAgICMgSWYgVmlzdWFsIFN0dWRpbyAyMDIyIGRldmVsb3BlcnMgZmFjaW5nIGxpbmtpbmcgZXJyb3JzLAorICAgICAgICAjIGNoYW5nZSB0aGUgbGluZSBiZWxvdyBhcyAiOndpbmRvd3MiOiBbIi9ERUZBVUxUTElCOm1zdmNydC5saWIiXSwKICAgICAgICAgIjp3aW5kb3dzIjogW10sCiAgICAgICAgICIvL2NvbmRpdGlvbnM6ZGVmYXVsdCI6IFsKICAgICAgICAgICAgICItbG0iLApAQCAtMTEwLDcgKzEwNiw3IEBACiAgICAgc3JjcyA9IFsKICAgICAgICAgImluY2x1ZGUvZmxhdGJ1ZmZlcnMvZmxhdGMuaCIsCiAgICAgXSwKLSAgICB2aXNpYmlsaXR5ID0gWyIvLzpfX3N1YnBhY2thZ2VzX18iXSwKKyAgICB2aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0sCiApCiAKICMgTGlicmFyeSB1c2VkIGJ5IGZsYXRidWZmZXJfY2NfbGlicmFyeSBydWxlcy4KQEAgLTEyMCwyMiArMTE2LDEzIEBACiAgICAgICAgICJpbmNsdWRlL2ZsYXRidWZmZXJzL2FsbG9jYXRvci5oIiwKICAgICAgICAgImluY2x1ZGUvZmxhdGJ1ZmZlcnMvYXJyYXkuaCIsCiAgICAgICAgICJpbmNsdWRlL2ZsYXRidWZmZXJzL2Jhc2UuaCIsCi0gICAgICAgICJpbmNsdWRlL2ZsYXRidWZmZXJzL2JmYnNfZ2VuZXJhdG9yLmgiLAogICAgICAgICAiaW5jbHVkZS9mbGF0YnVmZmVycy9idWZmZXIuaCIsCiAgICAgICAgICJpbmNsdWRlL2ZsYXRidWZmZXJzL2J1ZmZlcl9yZWYuaCIsCi0gICAgICAgICJpbmNsdWRlL2ZsYXRidWZmZXJzL2NvZGVfZ2VuZXJhdG9ycy5oIiwKICAgICAgICAgImluY2x1ZGUvZmxhdGJ1ZmZlcnMvZGVmYXVsdF9hbGxvY2F0b3IuaCIsCiAgICAgICAgICJpbmNsdWRlL2ZsYXRidWZmZXJzL2RldGFjaGVkX2J1ZmZlci5oIiwKICAgICAgICAgImluY2x1ZGUvZmxhdGJ1ZmZlcnMvZmxhdGJ1ZmZlcl9idWlsZGVyLmgiLAogICAgICAgICAiaW5jbHVkZS9mbGF0YnVmZmVycy9mbGF0YnVmZmVycy5oIiwKICAgICAgICAgImluY2x1ZGUvZmxhdGJ1ZmZlcnMvZmxleGJ1ZmZlcnMuaCIsCi0gICAgICAgICJpbmNsdWRlL2ZsYXRidWZmZXJzL2dycGMuaCIsCi0gICAgICAgICJpbmNsdWRlL2ZsYXRidWZmZXJzL2hhc2guaCIsCi0gICAgICAgICJpbmNsdWRlL2ZsYXRidWZmZXJzL2lkbC5oIiwKLSAgICAgICAgImluY2x1ZGUvZmxhdGJ1ZmZlcnMvbWluaXJlZmxlY3QuaCIsCi0gICAgICAgICJpbmNsdWRlL2ZsYXRidWZmZXJzL3JlZmxlY3Rpb24uaCIsCi0gICAgICAgICJpbmNsdWRlL2ZsYXRidWZmZXJzL3JlZmxlY3Rpb25fZ2VuZXJhdGVkLmgiLAotICAgICAgICAiaW5jbHVkZS9mbGF0YnVmZmVycy9yZWdpc3RyeS5oIiwKICAgICAgICAgImluY2x1ZGUvZmxhdGJ1ZmZlcnMvc3RsX2VtdWxhdGlvbi5oIiwKICAgICAgICAgImluY2x1ZGUvZmxhdGJ1ZmZlcnMvc3RyaW5nLmgiLAogICAgICAgICAiaW5jbHVkZS9mbGF0YnVmZmVycy9zdHJ1Y3QuaCIsCkBAIC0xODcsNCArMTc0LDQgQEAKICAgICBuYW1lID0gInJ1bnRpbWVfcHkiLAogICAgIHNyY3MgPSBbIjpydW50aW1lX3B5X3NyY3MiXSwKICAgICB2aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0sCi0pClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvYnVpbGRfZGVmcy5iemwgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9idWlsZF9kZWZzLmJ6bAppbmRleCAxYTg0OTI4Li45MmM5ZTJlIDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9idWlsZF9kZWZzLmJ6bAorKysgYi90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy9idWlsZF9kZWZzLmJ6bApAQCAtMTk0LDcgKzE5NCw3IEBACiAgICAgICAgIHJlZmxlY3Rpb24gYmluYXJpZXMgZm9yIHRoZSBzY2hlbWFzLgogICAgICcnJwogICAgIG91dHB1dF9oZWFkZXJzID0gWwotICAgICAgICAob3V0X3ByZWZpeCArICIlc19nZW5lcmF0ZWQuaCIpICUgKHMucmVwbGFjZSgiLmZicyIsICIiKS5zcGxpdCgiLyIpWy0xXSkKKyAgICAgICAgKG91dF9wcmVmaXggKyAiJXNfZ2VuZXJhdGVkLmgiKSAlIChzLnJlcGxhY2UoIi5mYnMiLCAiIikuc3BsaXQoIi8iKVstMV0uc3BsaXQoIjoiKVstMV0pCiAgICAgICAgIGZvciBzIGluIHNyY3MKICAgICBdCiAgICAgcmVmbGVjdGlvbl9uYW1lID0gIiVzX3JlZmxlY3Rpb24iICUgbmFtZSBpZiBnZW5fcmVmbGVjdGlvbnMgZWxzZSAiIgpAQCAtMjc5LDYgKzI3OSwxMSBAQAogICAgIGVsc2U6CiAgICAgICAgIG5vX2luY2x1ZGVzX3N0YXRlbWVudCA9IFtdCiAKKyAgICBpZiBjdHguYXR0ci5sYW5ndWFnZV9mbGFnID09ICItLXB5dGhvbiI6CisgICAgICAgIG9uZWZpbGVfc3RhdGVtZW50ID0gWyItLWdlbi1vbmVmaWxlIl0KKyAgICBlbHNlOgorICAgICAgICBvbmVmaWxlX3N0YXRlbWVudCA9IFtdCisKICAgICAjIE5lZWQgdG8gZ2VuZXJhdGUgYWxsIGZpbGVzIGluIGEgZGlyZWN0b3J5LgogICAgIGlmIG5vdCBvdXRwdXRzOgogICAgICAgICBvdXRwdXRzID0gW2N0eC5hY3Rpb25zLmRlY2xhcmVfZGlyZWN0b3J5KCJ7fV9hbGwiLmZvcm1hdChjdHguYXR0ci5uYW1lKSldCkBAIC0zMTQsNiArMzE5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLUkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5iaW5fZGlyLnBhdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICBdICsgbm9faW5jbHVkZXNfc3RhdGVtZW50ICsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9uZWZpbGVfc3RhdGVtZW50ICsKICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfcGF0aHNfY21kX2xpbmUgKyBbCiAgICAgICAgICAgICAgICAgIi0tbm8tdW5pb24tdmFsdWUtbmFtZXNwYWNpbmciLAogICAgICAgICAgICAgICAgICItLWdlbi1vYmplY3QtYXBpIiwKQEAgLTM1OSw3ICszNjUsNiBAQAogICAgICAgICAgICAgY2ZnID0gImV4ZWMiLAogICAgICAgICApLAogICAgIH0sCi0gICAgb3V0cHV0X3RvX2dlbmZpbGVzID0gVHJ1ZSwKICkKIAogZGVmIGZsYXRidWZmZXJfcHlfc3RyaXBfcHJlZml4X3NyY3MobmFtZSwgc3JjcyA9IFtdLCBzdHJpcF9wcmVmaXggPSAiIik6CkBAIC0zOTQsNiArMzk5LDcgQEAKICAgICAgICAgICAgIGN0eC5hdHRyLmRlcHNbMF0uZmlsZXMudG9fbGlzdCgpWzBdLnBhdGgsCiAgICAgICAgICAgICBjdHgub3V0cHV0cy5vdXQucGF0aCwKICAgICAgICAgKSwKKyAgICAgICAgdXNlX2RlZmF1bHRfc2hlbGxfZW52ID0gVHJ1ZSwKICAgICApCiAKIF9jb25jYXRfZmxhdGJ1ZmZlcl9weV9zcmNzID0gcnVsZSgKQEAgLTQwMSw3ICs0MDcsNiBAQAogICAgIGF0dHJzID0gewogICAgICAgICAiZGVwcyI6IGF0dHIubGFiZWxfbGlzdChtYW5kYXRvcnkgPSBUcnVlKSwKICAgICB9LAotICAgIG91dHB1dF90b19nZW5maWxlcyA9IFRydWUsCiAgICAgb3V0cHV0cyA9IHsib3V0IjogIiV7bmFtZX0ucHkifSwKICkKIApAQCAtNDMyLDYgKzQzNyw4IEBACiAgICAgICAgIGRlcHMgPSBkZXBzLAogICAgICAgICBpbmNsdWRlX3BhdGhzID0gaW5jbHVkZV9wYXRocywKICAgICApCisKKyAgICAjIFRPRE8oYi8yMzU1NTA1NjMpOiBSZW1vdmUgdGhlIGNvbmNhdG5hdGlvbiBydWxlIHdpdGggMi4wLjYgdXBkYXRlLgogICAgIGFsbF9zcmNzX25vX2luY2x1ZGUgPSAie31fc3Jjc19ub19pbmNsdWRlIi5mb3JtYXQobmFtZSkKICAgICBfZ2VuX2ZsYXRidWZmZXJfc3JjcygKICAgICAgICAgbmFtZSA9IGFsbF9zcmNzX25vX2luY2x1ZGUsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy93b3Jrc3BhY2UuYnpsIGIvdGhpcmRfcGFydHkvZmxhdGJ1ZmZlcnMvd29ya3NwYWNlLmJ6bAppbmRleCBlNzk5YTcwLi44MTJhZGU3IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9mbGF0YnVmZmVycy93b3Jrc3BhY2UuYnpsCisrKyBiL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzL3dvcmtzcGFjZS5iemwKQEAgLTUsMTIgKzUsMTIgQEAKIGRlZiByZXBvKCk6CiAgICAgdGZfaHR0cF9hcmNoaXZlKAogICAgICAgICBuYW1lID0gImZsYXRidWZmZXJzIiwKLSAgICAgICAgc3RyaXBfcHJlZml4ID0gImZsYXRidWZmZXJzLWE2NmRlNThhZjk1NjU1ODY4MzJjMjc2ZmJiNDI1MWZjNDE2YmYwN2YiLAotICAgICAgICBzaGEyNTYgPSAiZGEwNmFjMmZjNmZlZDhlMzhiNjM5MmY1YTIwZmEyNGE0MjkwY2VjYWFkZDg3YWVmMTZiNmI4NDk2MDQwODY4MCIsCisgICAgICAgIHN0cmlwX3ByZWZpeCA9ICJmbGF0YnVmZmVycy0yMy41LjI2IiwKKyAgICAgICAgc2hhMjU2ID0gIjFjY2UwNmIxN2NkZGQ4OTZiNmQ3M2NjMDQ3ZTM2YTI1NGZiOGRmNGQ3ZWExOGE0NmFjZjE2YzRjMGNkM2YzZjMiLAogICAgICAgICB1cmxzID0gWwotICAgICAgICAgICAgImh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvZmxhdGJ1ZmZlcnMvYXJjaGl2ZS9hNjZkZTU4YWY5NTY1NTg2ODMyYzI3NmZiYjQyNTFmYzQxNmJmMDdmLnRhci5neiIsCisgICAgICAgICAgICAiaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9mbGF0YnVmZmVycy9hcmNoaXZlL3YyMy41LjI2LnRhci5neiIsCiAgICAgICAgIF0sCi0gICAgICAgIGJ1aWxkX2ZpbGUgPSAiLy90aGlyZF9wYXJ0eS9mbGF0YnVmZmVyczpCVUlMRC5leHRlcm5hbCIsCisgICAgICAgIGJ1aWxkX2ZpbGUgPSAiLy90aGlyZF9wYXJ0eS9mbGF0YnVmZmVyczpCVUlMRC5vc3MiLAogICAgICAgICBzeXN0ZW1fYnVpbGRfZmlsZSA9ICIvL3RoaXJkX3BhcnR5L2ZsYXRidWZmZXJzOkJVSUxELnN5c3RlbSIsCiAgICAgICAgIGxpbmtfZmlsZXMgPSB7CiAgICAgICAgICAgICAiLy90aGlyZF9wYXJ0eS9mbGF0YnVmZmVyczpidWlsZF9kZWZzLmJ6bCI6ICJidWlsZF9kZWZzLmJ6bCIsCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS9oZXhhZ29uL2Z1bGx5X2Nvbm5lY3RlZC5jYyBiL3RoaXJkX3BhcnR5L2hleGFnb24vZnVsbHlfY29ubmVjdGVkLmNjCmluZGV4IGMyN2MyMzguLjk5ZWUxZjMgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L2hleGFnb24vZnVsbHlfY29ubmVjdGVkLmNjCisrKyBiL3RoaXJkX3BhcnR5L2hleGFnb24vZnVsbHlfY29ubmVjdGVkLmNjCkBAIC0xMjksNCArMTI5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGV4YWdvbkZ1bGx5Q29ubmVjdGVkRXZhbCk7CiB9CiAKK1RGTE1JbmZlcmVuY2VSZWdpc3RyYXRpb24gUmVnaXN0ZXJJbmZlcmVuY2VfRlVMTFlfQ09OTkVDVEVEKCkgeworICByZXR1cm4gdGZsaXRlOjptaWNybzo6UmVnaXN0ZXJPcChIZXhhZ29uRnVsbHlDb25uZWN0ZWRFdmFsKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIHRmbGl0ZQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvcHl0aG9uX3JlcXVpcmVtZW50cy5pbiBiL3RoaXJkX3BhcnR5L3B5dGhvbl9yZXF1aXJlbWVudHMuaW4KaW5kZXggMzYxNDMxMS4uMjljMDgxZSAxMDA2NDQKLS0tIGEvdGhpcmRfcGFydHkvcHl0aG9uX3JlcXVpcmVtZW50cy5pbgorKysgYi90aGlyZF9wYXJ0eS9weXRob25fcmVxdWlyZW1lbnRzLmluCkBAIC0yNiw3ICsyNiw5IEBACiAjIGlzIHNlbnNpdGl2ZSB0byB0aGUgUHl0aG9uIGVudmlyb25tZW50IChpbnRlcnByZXRlciB2ZXJzaW9uLCBldGMuKSBpbiB3aGljaAogIyBpdCBpcyBydW4uCiAKLXRlbnNvcmZsb3ctY3B1CitoZXhkdW1wCit0ZW5zb3JmbG93Cit0d2luZQogbnVtcHkKIG1ha28KIHBpbGxvdwpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvcHl0aG9uX3JlcXVpcmVtZW50cy50eHQgYi90aGlyZF9wYXJ0eS9weXRob25fcmVxdWlyZW1lbnRzLnR4dAppbmRleCBkMDAyMWIwLi45MjQ2MDI5IDEwMDY0NAotLS0gYS90aGlyZF9wYXJ0eS9weXRob25fcmVxdWlyZW1lbnRzLnR4dAorKysgYi90aGlyZF9wYXJ0eS9weXRob25fcmVxdWlyZW1lbnRzLnR4dApAQCAtMSwzNDIgKzEsNTIwIEBACiAjCi0jIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGJ5IHBpcC1jb21waWxlIHdpdGggcHl0aG9uIDMuMTAKLSMgVG8gdXBkYXRlLCBydW46CisjIFRoaXMgZmlsZSBpcyBhdXRvZ2VuZXJhdGVkIGJ5IHBpcC1jb21waWxlIHdpdGggUHl0aG9uIDMuMTEKKyMgYnkgdGhlIGZvbGxvd2luZyBjb21tYW5kOgogIwogIyAgICBiYXplbCBydW4gLy90aGlyZF9wYXJ0eTpweXRob25fcmVxdWlyZW1lbnRzLnVwZGF0ZQogIwotYWJzbC1weT09MS40LjAgXAotICAgIC0taGFzaD1zaGEyNTY6MGQzZmU2MDZhZGZhNGY3ZGI2NDc5MmRkNGM3YWVlNGVlMGMzOGFiNzVkZmQzNTNiN2E4M2VkM2U5NTdmY2I0NyBcCi0gICAgLS1oYXNoPXNoYTI1NjpkMmMyNDRkMDEwNDhiYTQ3NmU3YzA4MGJkMmM2ZGY1ZTE0MWQyMTFkZTgwMjIzNDYwZDViM2I4YTJhNTg0MzNkCithYnNsLXB5PT0yLjAuMCBcCisgICAgLS1oYXNoPXNoYTI1Njo5YTI4YWJiNjI3NzRhZTRlOGVkYmUyZGQ0YzQ5ZmZjZDQ1YTZhODQ4OTUyYTVlY2NjNmE0OWYzZjBmYzFlMmYzIFwKKyAgICAtLWhhc2g9c2hhMjU2OmQ5NjkwMjExYzVmY2ZlZmNkZDFhNDU0NzBhYzJiNWM1YWNkNDUyNDFjM2FmNzFlZWQ5NmJjNTQ0MTc0NmMwZDUKICAgICAjIHZpYQogICAgICMgICB0ZW5zb3Jib2FyZAotICAgICMgICB0ZW5zb3JmbG93LWNwdQorICAgICMgICB0ZW5zb3JmbG93CiBhc3R1bnBhcnNlPT0xLjYuMyBcCiAgICAgLS1oYXNoPXNoYTI1Njo1YWQ5M2E4NDU2ZjBkMDg0YzM0NTZkMDU5ZmQ5YTkyY2NlNjY3OTYzMjMyY2JmNzYzZWFjM2JjNWI3OTQwODcyIFwKICAgICAtLWhhc2g9c2hhMjU2OmMyNjUyNDE3ZjJjOGI1YmIzMjVjODg1YWUzMjliZGYzZjg2NDI0MDc1YzRmZDFhMTI4Njc0YmM2ZmJhNGI4ZTgKLSAgICAjIHZpYSB0ZW5zb3JmbG93LWNwdQotY2FjaGV0b29scz09NS4zLjAgXAotICAgIC0taGFzaD1zaGEyNTY6MTNkZmRkYzdiOGRmOTM4YzIxYTk0MGRmYTY1NTdjZTZlOTRhMmYxY2RmYTU4ZWI5MGM4MDU3MjFkNThmMmMxNCBcCi0gICAgLS1oYXNoPXNoYTI1Njo0MjllMWExZTg0NWMwMDhlYTZjODVhYTM1ZDRiOThiNjVkNmE5NzYzZWVlZjNlMzdlOTI3MjhhMTJkMWRlOWQ0CisgICAgIyB2aWEgdGVuc29yZmxvdworY2FjaGV0b29scz09NS4zLjIgXAorICAgIC0taGFzaD1zaGEyNTY6MDg2ZWU0MjAxOTZmN2IyYWI5Y2EyZGIyNTIwYWNhMzI2MzE4YjY4ZmU1YmE4YmM0ZDQ5Y2NhOTFhZGQ0NTBmMiBcCisgICAgLS1oYXNoPXNoYTI1Njo4NjFmMzVhMTNhNDUxZjk0ZTMwMWNlMmJlYzdjYWM2M2U4ODEyMzJjY2NlN2VkNjdmYWI5YjVkZjRkM2JlYWExCiAgICAgIyB2aWEgZ29vZ2xlLWF1dGgKLWNlcnRpZmk9PTIwMjMuNS43IFwKLSAgICAtLWhhc2g9c2hhMjU2OjBmMGQ1NmRjNWE2YWQ1NmZkNGJhMzY0ODRkNmNjMzQ0NTFlMWM2NTQ4YzYxZGFhZDhjMzIwMTY5ZjkxZWRkYzcgXAotICAgIC0taGFzaD1zaGEyNTY6YzZjMmU5OGY1Yzc4NjllZmNhMWY4OTE2ZmVkMjI4ZGQ5MTUzOWY5ZjFiNDQ0YzMxNGMwNmVlZjAyOTgwYzcxNgorY2VydGlmaT09MjAyMy4xMS4xNyBcCisgICAgLS1oYXNoPXNoYTI1Njo5YjQ2OWYzYTkwMGJmMjhkYzE5YjhjZmJmODAxOWJmNDdmN2ZkZDFhNjVhMWQ0ZmZiOThmYzE0MTY2YmViNGQxIFwKKyAgICAtLWhhc2g9c2hhMjU2OmUwMzZhYjQ5ZDViNzk1NTZmOTljZmMyZDkzMjBiMzRjZmJlNWJlMDVjNTg3MWI1MWRlOTMyOWYwNjAzYjA0NzQKICAgICAjIHZpYSByZXF1ZXN0cwotY2hhcnNldC1ub3JtYWxpemVyPT0zLjEuMCBcCi0gICAgLS1oYXNoPXNoYTI1NjowNGFmYTYzODdlMmIyODJjZjc4ZmYzZGJjZTIwZjBjYzA3MWMxMmRjOGY2ODViZDQwOTYwY2M2ODY0NGNmZWE2IFwKLSAgICAtLWhhc2g9c2hhMjU2OjA0ZWVmY2VlMDk1ZjU4ZWFhYmU2ZGMzY2MyMjYyZjNiY2Q3NzZkMmM2NzAwNTg4MDg5NGY0NDdiM2YyY2I5YzEgXAotICAgIC0taGFzaD1zaGEyNTY6MGJlNjVjY2Y2MThjMWU3YWM5Yjg0OWMzMTVjYzJlOGE4NzUxZDljZmRhYTQzMDI3ZDRmNjYyNGJkNTg3YWI3ZSBcCi0gICAgLS1oYXNoPXNoYTI1NjowYzk1ZjEyYjc0NjgxZTlhZTEyNzcyOGY3ZTU0MDljYmJlZjljZDkxNGQ1ODk2ZWYyMzhjYzc3OWI4MTUyMzczIFwKLSAgICAtLWhhc2g9c2hhMjU2OjBjYTU2NDYwNmQyY2FhZmIwYWJlNmQxYjUzMTFjMjY0OWU4MDcxZWIyNDFiMmQ2NGU3NWEwZDAwNjUxMDdlNjIgXAotICAgIC0taGFzaD1zaGEyNTY6MTBjOTM2MjhkNzQ5N2M4MTY4NmU4ZTVlNTU3YWFmYTc4ZjIzMGNkOWU3N2RkMGM0MDAzMmVmOTBjMThmMjIzMCBcCi0gICAgLS1oYXNoPXNoYTI1NjoxMWQxMTdlNmM2M2U4ZjQ5NTQxMmQzN2U3ZGMyZTJmZmYwOWMzNGIyZDA5ZGJlMmJlZTNjNjIyOTU3NzgxOGJlIFwKLSAgICAtLWhhc2g9c2hhMjU2OjExZDNiY2I3YmUzNWU3YjFiYmEyYzIzYmVlZGFjODFlZTg5M2FjOTg3MWQwYmE3OWVmZmM3ZmMwMTE2N2RiNmMgXAotICAgIC0taGFzaD1zaGEyNTY6MTJhMmI1NjFhZjEyMmUzZDk0Y2RiOTdmZTZmYjJiYjJiODJjZWYwY2RjYTEzMTY0NmZkYjk0MGExZWRhMDRmMCBcCi0gICAgLS1oYXNoPXNoYTI1NjoxMmQxYTM5YWE2YjhjNmY2MjQ4YmI1NDU1MGVmY2MxYzM4Y2UwZDgwOTZhMTQ2NjM4ZmQ0NzM4ZTQyMjg0NDQ4IFwKLSAgICAtLWhhc2g9c2hhMjU2OjE0MzVhZTE1MTA4YjFjYjZmZmZiY2VhMmFmM2Q0Njg2ODNiN2FmZWQwMTY5YWQ3MTg0NTFmOGRiNWQxYWZmNmYgXAotICAgIC0taGFzaD1zaGEyNTY6MWM2MGI5YzIwMmQwMDA1MjE4M2M5YmU4NWU1ZWFmMThhNGFkYTBhNDdkMTg4YTgzYzhmNWM1YjIzMjUyZjY0OSBcCi0gICAgLS1oYXNoPXNoYTI1NjoxZThmY2RkOGY2NzJhMWM0ZmM4ZDBiZDNhMmI1NzZiMTUyZDJhMzQ5NzgyZDFlYjBmNmI4ZTUyZTk5NTQ3MzFkIFwKLSAgICAtLWhhc2g9c2hhMjU2OjIwMDY0ZWFkMDcxN2NmOWE3M2E2ZDFlNzc5YjIzZDE0OWI1M2RhZjk3MTE2OTI4OWVkMmVkNDNhNzFlOGQzYjAgXAotICAgIC0taGFzaD1zaGEyNTY6MjFmYTU1ODk5Njc4MmZjMjI2YjUyOWZkZDJlZDc4NjZjMmM2ZWM5MWNlZTgyNzM1Yzk4YTE5N2ZhZTM5ZjcwNiBcCi0gICAgLS1oYXNoPXNoYTI1NjoyMjkwODg5MWEzODBkNTA3MzhlMWY5Nzg2Njc1MzZmNmM2YjUyNmEyMDY0MTU2MjAzZDQxOGY0ODU2ZDZlODZhIFwKLSAgICAtLWhhc2g9c2hhMjU2OjMxNjBhMGZkOTc1NGFhYjdkNDdmOTVhNmI2M2FiMzU1Mzg4ZDg5MDE2M2ViMDNiMmQyYjg3YWIwYTMwY2ZhNTkgXAotICAgIC0taGFzaD1zaGEyNTY6MzIyMTAyY2RmMWFiNjgyZWNjN2Q5YjFjNWVlZDRlYzU5NjU3YTY1ZTFjMTQ2YTBkYTM0MmI3OGY0MTEyZGIyMyBcCi0gICAgLS1oYXNoPXNoYTI1NjozNGUwYTJmOWMzNzBlYjk1NTk3YWFlNjNiZjg1ZWI1ZTk2ODI2ZDgxZTNkY2Y4OGI4ODg2MDEyOTA2ZjUwOWI1IFwKLSAgICAtLWhhc2g9c2hhMjU2OjM1NzNkMzc2NDU0ZDk1NjU1M2MzNTZkZjQ1YmI4MjQyNjJjMzk3YzZlMjZjZTQzZTgyMDNjNGM1NDBlZTBhY2IgXAotICAgIC0taGFzaD1zaGEyNTY6Mzc0NzQ0M2I2YTkwNDAwMTQ3MzM3MGQ3ODEwYWExOWMzYTE4MGNjZDUyYTcxNTdhYWNjMjY0YTVhYzc5MjY1ZSBcCi0gICAgLS1oYXNoPXNoYTI1NjozOGU4MTJhMTk3YmY4ZTcxYTU5ZmU1NWI3NTdhODRjMWY5NDZkMGFjMTE0YWNhZmFhZmFmMjE2NjdhN2UxNjllIFwKLSAgICAtLWhhc2g9c2hhMjU2OjNhMDZmMzJjOTYzNGE4NzA1ZjRjYTk5NDZkNjY3NjA5ZjUyY2YxMzBkNTU0ODg4MTQwMWYxZWIyYzM5YjFlMmMgXAotICAgIC0taGFzaD1zaGEyNTY6M2E1ZmM3OGY5ZTNmNTAxYTE2MTRhOThmN2M1NGQzOTY5ZjNhZDliYmE4YmEzZDliNDM4YzNiYzVkMDQ3ZGQyOCBcCi0gICAgLS1oYXNoPXNoYTI1NjozZDkwOThiNDc5ZTc4Yzg1MDgwYzk4ZTFlMzVmZjQwYjRhMzFkODk1MzEwMmJiMGZkN2QxYjZmOGEyMTExYTNkIFwKLSAgICAtLWhhc2g9c2hhMjU2OjNkYzViNmE4ZWNmZGM1NzQ4YTdlNDI5NzgyNTk4ZTRmMTdlZjM3OGUzZTI3MmVlYjEzNDBlYTU3YzkxMDlmNDEgXAotICAgIC0taGFzaD1zaGEyNTY6NDE1NWI1MWFlMDVlZDQ3MTk5ZGM1YjJhNGU2MmFiY2NiMjc0Y2VlNmIwMWRhNWI4OTUwOTliNjFiMTk4Mjk3NCBcCi0gICAgLS1oYXNoPXNoYTI1Njo0OTkxOWY4NDAwYjVlNDllOTYxZjMyMGM3MzUzODhlZTY4NmE2MjMyN2U3NzNmYTViM2NlNjcyMWY3ZTc4NWNlIFwKLSAgICAtLWhhc2g9c2hhMjU2OjUzZDBhM2ZhNWY4YWY5OGExZTI2MWRlNmEzOTQzY2E2MzFjNTI2NjM1ZWI1ODE3YTg3YTU5ZDlhNTdlYmY0OGYgXAotICAgIC0taGFzaD1zaGEyNTY6NWYwMDg1MjVlMDI5MDhiMjBlMDQ3MDdhNGY3MDRjZDI4NmQ5NDcxOGY0OGJiMzNlZGRkYzdkN2I1ODRkZGRjMSBcCi0gICAgLS1oYXNoPXNoYTI1Njo2MjhjOTg1YWZiMmM3ZDI3YTQ4MDBiZmI2MDllMDM5ODVhYWVjYjQyZjk1NTA0OTk1NzgxNGUwNDkxZDQwMDZkIFwKLSAgICAtLWhhc2g9c2hhMjU2OjY1ZWQ5MjNmODRhNjg0NGRlNWZkMjk3MjZiODg4ZTU4YzYyODIwZTA3NjliNzY1NjU0ODBlMWZkYzNkMDYyZjggXAotICAgIC0taGFzaD1zaGEyNTY6NjczNGU2MDYzNTU4MzRmMTM0NDViNmFkYzM4YjUzYzBmZDQ1ZjFhNTZhOWJhMDZjMjA1OGY4Njg5M2FlODAxNyBcCi0gICAgLS1oYXNoPXNoYTI1Njo2YmFmMGJhZjBkNWQyNjVmYTc5NDRmZWI5Zjc0NTFjYzMxNmJmZTMwZThkZjFhNjFiMWJiMDg1NzdjNTU0ZjMxIFwKLSAgICAtLWhhc2g9c2hhMjU2OjZmNGY0NjY4ZTE4MzE4NTBlYmNjMmZkMGIxY2QxMTcyMTk0N2I2ZGM3YzAwYmYxYzZiZDNjOTI5YWUxNGYyYzcgXAotICAgIC0taGFzaD1zaGEyNTY6NmY1YzJlN2JjOGE0YmY3YzQyNjU5OTc2NWIxYmQzMzIxN2VjODQwMjMwMzM2NzJjMWU5YThiMzVlYWVhYWFmOCBcCi0gICAgLS1oYXNoPXNoYTI1Njo2ZjZjN2E4YTU3ZTk0MDVjYWQ3NDg1ZjRjOWQzMTcyYWU0ODZjZmVmMTM0NGI1ZGRkOGU1MjM5NTgyZDczNTVlIFwKLSAgICAtLWhhc2g9c2hhMjU2OjczODFjNjZlMDU2MWM1NzU3ZmZlNjE2YWY4NjliOTE2YzhiNGU0MmIzNjdhYjI5ZmVkYzk4NDgxZDFlNzRlMTQgXAotICAgIC0taGFzaD1zaGEyNTY6NzNkYzAzYTZhN2UzMGI3ZWRjNWIwMWI2MDFlNTNlN2ZjOTI0YjA0ZTE4MzVlOGU0MDdjMTJjMDM3ZTgxYWRiZCBcCi0gICAgLS1oYXNoPXNoYTI1Njo3NGRiMDA1MmQ5ODVjZjM3ZmExMTE4MjhkMGRkMjMwNzc2YWM5OWM3NDBlMWE3NThhZDk5MDk0YmU0ZjE4MDNkIFwKLSAgICAtLWhhc2g9c2hhMjU2Ojc1ZjI1NjhiNDE4OWRkYTFjNTY3MzM5YjQ4Y2JhNGFjNzM4NGFjY2I5YzJhN2VkNjU1Y2Q4NmIwNDA1NWM3OTUgXAotICAgIC0taGFzaD1zaGEyNTY6NzhjYWNkMDNlNzlkMDA5ZDk1NjM1ZTdkNmZmMTJjMjFlYjg5Yjg5NGMzNTRiZDJiMmVkMGI0NzYzMzczNjkzYiBcCi0gICAgLS1oYXNoPXNoYTI1Njo4MGQxNTQzZDU4YmQzZDZjMjcxYjY2YWJmNDU0ZDQzN2E0MzhkZmYwMWMzZTYyZmRiY2Q2OGYyYTExMzEwZDRiIFwKLSAgICAtLWhhc2g9c2hhMjU2OjgzMGQyOTQ4YTVlYzM3YzM4NmQzMTcwYzQ4MzA2Mzc5OGQ3ODc5MDM3NDkyNTQwZjEwYTQ3NWUzZmQ2ZjI0NGIgXAotICAgIC0taGFzaD1zaGEyNTY6ODkxY2Y5YjQ4Nzc2YjVjNjFjNzAwYjU1YTU5ODYyMWZkYjdiMWUzMDFhNTUwMzY1NTcxZTk2MjRmMjcwYzIwMyBcCi0gICAgLS1oYXNoPXNoYTI1Njo4ZjI1ZTE3YWIzMDM5YjA1Zjc2MmIwYTU1YWUwYjM2MzJiMmUwNzNkOWM4ZmM4OGU4OWFjYTMxYTYxOThlODhmIFwKLSAgICAtLWhhc2g9c2hhMjU2OjlhMzI2NzYyMDg2NmM5ZDE3Yjk1OWE4NGRkMGJkMmQ0NTcxOWI4MTcyNDVlNDkzNzFlYWQ3OWVkNGY3MTBkMTkgXAotICAgIC0taGFzaD1zaGEyNTY6YTA0Zjg2ZjQxYTg5MTZmZTQ1YWM1MDI0ZWM0NzdmNDFmODg2YjNjNDM1ZGEyZDRlM2QyNzA5YjIyYWIwMmFmMSBcCi0gICAgLS1oYXNoPXNoYTI1NjphYWY1M2E2Y2ViYWQwZWFlNTc4ZjA2MmM3ZDQ2MjE1NWVhZGE5YzE3MmJkOGM0ZDI1MGI4YzFkOGViN2Y5MTZhIFwKLSAgICAtLWhhc2g9c2hhMjU2OmFiYzExODVkNzlmNDdjMGE3YWFmN2UyNDEyYTBlYjJjMDNiNzI0NTgxMTM5MTkzZDJkODJiM2FkOGNiYjAwYWMgXAotICAgIC0taGFzaD1zaGEyNTY6YWMwYWE2Y2Q1M2FiOWEzMWQzOTdmODMwM2Y5MmM0MmY1MzQ2OTM1MjhmYWZiZGI5OTdjODJiYWU2ZTQ3N2FkOSBcCi0gICAgLS1oYXNoPXNoYTI1NjphYzM3NzVlMzMxMTY2MWQ0YWRhY2UzNjk3YTUyYWMwYmFiMTdlZGQxNjYwODdkNDkzYjUyZDRmNGY1NTNmOWYwIFwKLSAgICAtLWhhc2g9c2hhMjU2OmIwNmYwZDNiZjA0NTE1OGQyZmI4ODM3YzU3ODVmZTlmZjliOGM5MzM1OGJlNjQ0NjFhMTA4OWY1ZGE5ODMxMzcgXAotICAgIC0taGFzaD1zaGEyNTY6YjExNjUwMjA4N2NlOGE2YjdhNWYxODE0NTY4Y2NiZDBlOWY2Y2ZkOTk5NDhhYTU5YjBlMjQxZGM1N2NmNzM5ZiBcCi0gICAgLS1oYXNoPXNoYTI1NjpiODJmYWI3OGUwYjEzMjllMTgzYTY1MjYwNTgxZGU0Mzc1ZjYxOTE2NzQ3OGRkZGFiNTEwYzZjNmZiMDRkOWI2IFwKLSAgICAtLWhhc2g9c2hhMjU2OmJkNzE2MzE4MjEzM2MwYzc3MDFiMjVlNjA0Y2YxNjExYzBkODc3MTJlNTZlODhlN2VlNWQ3MmRlYWIzZTc2YjUgXAotICAgIC0taGFzaD1zaGEyNTY6YzM2YmNiYzBkNTE3NGE4MGQ2Y2NjZjQzYTBlY2FjYTQ0ZTgxZDI1YmU0YjdmOTBmMGVkN2JjZmJiNWEwMDkwOSBcCi0gICAgLS1oYXNoPXNoYTI1NjpjM2FmOGUwZjA3Mzk5ZDMxNzZiMTc5ZjJlMjYzNGMzY2U5YzEzMDEzNzlhNmI4YzljOWFlZWNkNDgxZGE0OTRmIFwKLSAgICAtLWhhc2g9c2hhMjU2OmM4NDEzMmE1NGM3NTBmZGE1NzcyOWQxZTI1OTliYjU5OGY1ZmEwMzQ0MDg1ZGJkZTUwMDNiYTQyOWE0Nzk4YzAgXAotICAgIC0taGFzaD1zaGEyNTY6Y2I3YjJhYjAxODg4Mjk1OTNiOWRlNjQ2NTQ1MTc1NTQ3YTcwZDlhNmUyYjYzYmYyY2Q4N2EwYTM5MTU5OTMyNCBcCi0gICAgLS1oYXNoPXNoYTI1NjpjY2E0ZGVmNTc2ZjQ3YTA5YTk0MzY2NmI4ZjgyOTYwNmJjYjE3ZTJiYzJkNTkxMWE0NmM4ZjhkYTQ1ZjU2NzU1IFwKLSAgICAtLWhhc2g9c2hhMjU2OmNmNjUxMWVmYTQ4MDFiOWIzOGRjNTU0NmQ3NTQ3ZDViNWM2ZWY0YjA4MWM2MGIyM2U0ZDk0MWQwZWJhOWNiZWIgXAotICAgIC0taGFzaD1zaGEyNTY6ZDE2ZmQ1MjUyZjg4M2ViMDc0Y2E1NWNiNjIyYmMwYmVlNDliOTc5YWU0ZTg2MzlmZmY2Y2EzZmY0NGY5Zjg1NCBcCi0gICAgLS1oYXNoPXNoYTI1NjpkMjY4NmY5MTYxMWY5ZTE3ZjQ1NDhkYmYwNTBlNzViMDc5YmJjMmE4MmJlNTY1ODMyYmM4ZWE5MDQ3YjYxYzhjIFwKLSAgICAtLWhhc2g9c2hhMjU2OmQ3ZmMzZmNhMDFkYTE4ZmJhYmU0NjI1ZDY0YmI2MTJiNTMzNTMzZWQxMDA0NWEyYWMzZGQxOTRiZmE2NTZiNjAgXAotICAgIC0taGFzaD1zaGEyNTY6ZGQ1NjUzZTY3YjE0OTUwM2M2OGM0MDE4YmYwN2U0MmVlZWQ2YjRlOTU2YjI0YzAwY2NkZjkzYWM3OWNkZmY4NCBcCi0gICAgLS1oYXNoPXNoYTI1NjpkZTU2OTVhNmYxZDgzNDBiMTJhNWQ2ZDQ0ODQyOTBlZTc0ZDYxZTQ2N2MzOWZmMDNiMzllMzBkZjYyY2Y4M2EwIFwKLSAgICAtLWhhc2g9c2hhMjU2OmUwYWM4OTU5YzkyOTU5M2ZlZTM4ZGExYzJiNjRlZTk3Nzg3MzNjZGYwM2M0ODJjOWZmMWQ1MDhiNmI1OTNiMmIgXAotICAgIC0taGFzaD1zaGEyNTY6ZTFiMjVlM2FkNmM5MDlmMzk4ZGY4OTIxNzgwZDZhM2QxMjBkOGMwOTQ2NjcyMDIyNmZjNjIxNjA1YjZmOTJiMSBcCi0gICAgLS1oYXNoPXNoYTI1NjplNjMzOTQwZjI4YzFlOTEzNjE1ZmQ2MjRmY2RkNzJmZGJhODA3YmY1M2VhNjkyNWQ2YTU4OGU4NGUxMTUxNTMxIFwKLSAgICAtLWhhc2g9c2hhMjU2OmU4OWRmMjk1OGU1MTU5YjgxMWFmOWZmMGY5MjYxNGRhYmY0ZmY2MTdjMDNhNGMxYzZmZjUzYmYxYzM5OWUwZTEgXAotICAgIC0taGFzaD1zaGEyNTY6ZWE5ZjljNjAzNGVhMmQ5M2Q5MTQ3ODE4ZjE3YzJhMDg2MGQ0MWI3MWMzOGI5Y2U0ZDU1ZjIxYjZmOTE2NWExMSBcCi0gICAgLS1oYXNoPXNoYTI1NjpmNjQ1Y2FhZjAwMDhiYWNmMzQ5ODc1YTk3NDIyMGYxZjFkYTM0OWM1ZGJlN2M0ZWM5MzA0OGNkYzc4NWEzMzI2IFwKLSAgICAtLWhhc2g9c2hhMjU2OmY4MzAzNDE0YzdiMDNmNzk0MzQ3YWQwNjJjMDUxNmNlZTBlMTVmN2E2MTJhYmQwY2UxZTI1Y2FmNmNlYjQ3ZGYgXAotICAgIC0taGFzaD1zaGEyNTY6ZmNhNjJhODMwMWI2MDViOTU0YWQyZTljMzY2NmY5ZDk3ZjYzODcyYWE0ZWZjYWU1NDkyYmFjYTIwNTZiNzRhYgorY2ZmaT09MS4xNi4wIFwKKyAgICAtLWhhc2g9c2hhMjU2OjBjOWVmNmZmMzdlOTc0YjczYzI1ZWVjYzEzOTUyYzU1YmNlZWQ5MTEyYmUyZDlkOTM4ZGVkOGU4NTYxMzhiY2MgXAorICAgIC0taGFzaD1zaGEyNTY6MTMxZmQwOTRkMTA2NWIxOTU0MGMzZDcyNTk0MjYwZjExOGIyMzEwOTAyOTVkOGMzNGUxOWE3YmJjZjJlODYwYSBcCisgICAgLS1oYXNoPXNoYTI1NjoxYjhlYmMyN2MwMTRjNTk2OTJiYjI2NjRjN2QxM2NlN2E2ZTlhNjI5YmUyMGU1NGU3MjcxZmE2OTZmZjJiNDE3IFwKKyAgICAtLWhhc2g9c2hhMjU2OjJjNTZiMzYxOTE2ZjM5MGNkNzU4YTU3ZjJlMTYyMzNlYjRmNjRiY2JlZWU4OGE0ODgxZWE5MGZjYTE0ZGM2YWIgXAorICAgIC0taGFzaD1zaGEyNTY6MmQ5MmIyNWRiZjZjYWUzM2Y2NTAwNWJhZjQ3MmQyYzI0NWMwNTBiMWNlNzA5Y2M0NTg4Y2RjZGQ1NDk1YjUyMCBcCisgICAgLS1oYXNoPXNoYTI1NjozMWQxM2IwZjk5ZTA4MzZiN2ZmODkzZDM3YWYwNzM2NmViYzkwYjY3OGI2NjY0Yzk1NWI1NDU2MWZjMzZlZjM2IFwKKyAgICAtLWhhc2g9c2hhMjU2OjMyYzY4ZWY3MzVkYmU1ODU3YzgxMDMyOGNiMjQ4MWUyNDcyMmE1OWEyMDAzMDE4ODg1NTE0ZDRjMDlhZjk3NDMgXAorICAgIC0taGFzaD1zaGEyNTY6MzY4NmRmZmIwMjQ1OTU1OWM3NGRkM2Q4MTc0ODI2OWZmYjBlYjAyN2MzOWE2ZmM5OTUwMmRlMzdkNTAxZmFhOCBcCisgICAgLS1oYXNoPXNoYTI1Njo1ODIyMTVhMGU5YWRiZTBlMzc5NzYxMjYwNTUzYmExMWM1ODk0M2U0YmJlOWMzNjQzMGM0Y2E2YWM3NGIxNWVkIFwKKyAgICAtLWhhc2g9c2hhMjU2OjViNTBiZjNmNTU1NjFkYWM1NDM4ZjhlNzBiZmNkZmQ3NDU0M2ZkNjBkZjVmYTVmNjJkOTRlNTg2N2RlY2E2ODQgXAorICAgIC0taGFzaD1zaGEyNTY6NWJmNDRkNjZjZGY5ZTg5MzYzNzg5NmM3ZmFhMjIyOThiYWViY2QxOGQxZGRiNmQyNjI2YTZlMzk3OTNhMWQ1NiBcCisgICAgLS1oYXNoPXNoYTI1Njo2NjAyYmM4ZGM2ZjNhOWUwMmI2YzIyYzRmYzFlNDdhYTUwZjhmOGU2ZDNmNzhhNWUxNmFjMzNlZjVmZWZhMzI0IFwKKyAgICAtLWhhc2g9c2hhMjU2OjY3MzczOWNiNTM5ZjhjZGFhMDdkOTJkMDJlZmE5M2M5Y2NmODdlMzQ1YjlhMGI1NTZlM2VjYzY2NjcxODQ2OGQgXAorICAgIC0taGFzaD1zaGEyNTY6Njg2NzhhYmYzODBiNDJjZTIxYTVmMmFiZGU4ZWZlZTA1YzExNGMyZmRiMmU5ZWVmMmVmZGIwMjU3ZmJhMTIzNSBcCisgICAgLS1oYXNoPXNoYTI1Njo2OGU3YzQ0OTMxY2MxNzFjNTRjY2I3MDI0ODJlOWZjNzIzMTkyZTg4ZDI1YTBlMTMzZWRkN2FmZjhmY2QxZjZlIFwKKyAgICAtLWhhc2g9c2hhMjU2OjZiM2Q2NjA2ZDM2OWZjMWRhNGZkOGMzNTdkMDI2MzE3ZmJiOWM5Yjc1ZDM2ZGMxNmU5MGU4NGMyNjg1NGIwODggXAorICAgIC0taGFzaD1zaGEyNTY6NzQ4ZGNkMWUzZDNkN2NkNTQ0M2VmMDNjZTg2ODUwNDMyOTRhZDZiZDdjMDJhMzhkMWJkMzY3Y2ZkOTY4ZTAwMCBcCisgICAgLS1oYXNoPXNoYTI1Njo3NjUxYzUwYzhjNWVmN2JkYjQxMTA4YjdiOGM1YTgzMDEzYmZhYThhOTM1NTkwYzVkNzQ2MjdjMDQ3YTU4M2M3IFwKKyAgICAtLWhhc2g9c2hhMjU2OjdiNzgwMTBlN2I5N2ZlZjRiZWUxZTg5NmRmOGE0YmJiNjcxMmI3ZjA1YjdlZjYzMGY5ZDFkYTAwZjY0NDRkMmUgXAorICAgIC0taGFzaD1zaGEyNTY6N2U2MWUzZTRmYTY2NGE4NTg4YWEyNWM4ODNlYWI2MTJhMTg4YzcyNTc1NWFmZmY2Mjg5NDU0ZDYzNjJiOTY3MyBcCisgICAgLS1oYXNoPXNoYTI1Njo4MDg3NjMzOGUxOWM5NTFmZGZlZDYxOThlNzBiYzg4ZjFjOTc1OGI5NDU3OGQ1YTdjNGM5MWE4N2FmM2NmMzFjIFwKKyAgICAtLWhhc2g9c2hhMjU2Ojg4OTU2MTNiY2MwOTRkNGExYjJkYmUxNzlkODhkN2ZiNGExNWNlZTQzYzA1MmU4ODg1NzgzZmFjMzk3ZDkxZmUgXAorICAgIC0taGFzaD1zaGEyNTY6ODhlMmIzYzE0YmRiMzJlNDQwYmU1MzFhZGUyOWQzYzUwYTFhNTljZDRlNTFiMWRkOGIwODY1YzU0ZWE1ZDJlMiBcCisgICAgLS1oYXNoPXNoYTI1Njo4ZjhlNzA5MTI3YzZjNzc0NDZhOGMwYThjOGJmM2M4ZWU3MDZhMDZjZDQ0YjFlODI3YzNlNmEyZWU2YjhjMDk4IFwKKyAgICAtLWhhc2g9c2hhMjU2OjljYjRhMzViMzY0MmZjNWMwMDVhNjc1NWE1ZDE3YzZjOGI2YmNiNjk4MWJhZjgxY2VhOGJmYmM4OTAzZThiYTggXAorICAgIC0taGFzaD1zaGEyNTY6OWY5MDM4OTY5MzczMWZmMWY2NTllNTVjN2QxNjQwZTJlYzQzZmY3MjVjYzYxYjA0YjJmOWM2ZDhkMDE3ZGY2YSBcCisgICAgLS1oYXNoPXNoYTI1NjphMDk1ODJmMTc4NzU5ZWU4MTI4ZDkyNzBjZDEzNDQxNTRmZDQ3M2JiNzdkOTRjZTBhZWIyYTkzZWJmMGZlYWYwIFwKKyAgICAtLWhhc2g9c2hhMjU2OmE2YTE0YjE3ZDdlMTdmYTBkMjA3YWMwODY0MmM4ODIwZjg0ZjI1Y2UxN2E0NDJmZDE1ZTI3ZWExOGQ2N2M1OWIgXAorICAgIC0taGFzaD1zaGEyNTY6YTcyZTg5NjFhODZkMTliZGI0NTg1MWQ4ZjFmMDhiMDQxZWEzN2QyYmQ4ZDRmZDE5OTAzYmMzMDgzZDgwYzg5NiBcCisgICAgLS1oYXNoPXNoYTI1NjphYmQ4MDhmOWMxMjliYTJiZWRhNGNmYzUzYmRlODAxZTViY2Y5ZDZlMGYyMmYwOTVlNDUzMjdjMDM4YmZlNjhlIFwKKyAgICAtLWhhc2g9c2hhMjU2OmFjMGY1ZWRkMjM2MGVlYTJmMWRhYTllMjZhNDFkYjAyZGQ0YjA0NTFiNDhmN2MzMThlMjE3ZWUwOTJhMjEzZTkgXAorICAgIC0taGFzaD1zaGEyNTY6YjI5ZWJmZmNmNTUwZjlkYTU1YmVjOWUwMmFkNDMwYzk5MmE4N2U1ZjUxMmNkNjMzODhhYmI3NmYxMDM2ZDhkMiBcCisgICAgLS1oYXNoPXNoYTI1NjpiMmNhNGU3N2Y5ZjQ3YzU1YzE5NDk4MmUxMGYwNThkYjA2MzkzNzg0NWJiMmI3YTg2Yzg0YTZjZmUwYWVmYThiIFwKKyAgICAtLWhhc2g9c2hhMjU2OmI3YmUyZDc3MWNkYmEyOTQyZTEzMjE1YzRlMzQwYmZkNzYzOThlOTIyN2FkMTA0MDJhODc2N2FiMTg2NWQyZTYgXAorICAgIC0taGFzaD1zaGEyNTY6Yjg0ODM0ZDBjZjk3ZTdkMjdkZDViN2YzYWNhN2I2ZTkyNjNjNTYzMDhhYjlkYzhhYWU5Nzg0YWJiNzc0ZDQwNCBcCisgICAgLS1oYXNoPXNoYTI1NjpiODY4NTFhMzI4ZWVkYzY5MmFjZjgxZmIwNTQ0NGJkZjE4OTE3NDdjMjVhZjc1MjllMzlkZGFmYWY2OGE0ZjNmIFwKKyAgICAtLWhhc2g9c2hhMjU2OmJjYjNlZjQzZTU4NjY1YmJkYTJmYjE5ODY5OGZjYWU2Nzc2NDgzZTBjNGE2MzFhYTU2NDc4MDZjMjVlMDJjYzAgXAorICAgIC0taGFzaD1zaGEyNTY6YzBmMzExMzBlYmMyZDM3Y2RkOGU0NDYwNWZiNWZhN2FkNTkwNDkyOThiM2Y3NDVjNzRmYTc0YzYyZmJmY2ZjNCBcCisgICAgLS1oYXNoPXNoYTI1NjpjNmExNjRhYTQ3ODQzZmIxYjAxZTk0MWQzODVhYWI3MjE1NTYzYmI4ODE2ZDgwZmYzYTM2M2E5Zjg0NDhhOGRjIFwKKyAgICAtLWhhc2g9c2hhMjU2OmQ4YTlkM2ViZTQ5ZjA4NGFkNzFmOTI2OTgzNGNlY2NiZjM5ODI1M2M5ZmFjOTEwYzRmZDcwNTNmZjEzODY5MzYgXAorICAgIC0taGFzaD1zaGEyNTY6ZGI4ZTU3N2MxOWMwZmRhMGJlYjdlMGQ0ZTA5ZTBiYTc0YjFlNGMwOTJlMGU0MGJmYTEyZmUwNWI2ZjZkNzViYSBcCisgICAgLS1oYXNoPXNoYTI1NjpkYzliMThiZjQwY2M3NWY2NmY0MGE3Mzc5ZjZhOTUxMzI0NGZlMzNjMGU4YWE3MmUyZDU2YjAxOTZhN2VmODcyIFwKKyAgICAtLWhhc2g9c2hhMjU2OmUwOWYzZmY2MTMzNDVkZjVlOGMzNjY3ZGExZDkxOGY5MTQ5YmQ2MjNjZDkwNzBjOTgzYzAxMzc5MmE5YTYyZWIgXAorICAgIC0taGFzaD1zaGEyNTY6ZTQxMDhkZjdmZTliNzA3MTkxZTU1ZjMzZWZiY2IyZDgxOTI4ZTEwY2VhNDU1Mjc4NzlhNDc0OWNiZTQ3MjYxNCBcCisgICAgLS1oYXNoPXNoYTI1NjplNjAyNDY3NWU2N2FmOTI5MDg4ZmRhMzk5YjIwOTQ1NzQ2MDkzOTZiMWRlY2I2MDljNTVmYTU4YjAyOGEzMmExIFwKKyAgICAtLWhhc2g9c2hhMjU2OmU3MGY1NGYxNzk2NjY5ZWY2OTFjYTA3ZDA0NmNkODFhMjljYjRkZWIxZTVmOTQyMDAzZjQwMWMwYzRhMjY5NWQgXAorICAgIC0taGFzaD1zaGEyNTY6ZTcxNTU5NmU2ODNkMmNlMDAwNTc0YmFlNWQwN2JkNTIyYzc4MWE4MjI4NjZjMjA0OTVlNTI1MjA1NjRmMDk2OSBcCisgICAgLS1oYXNoPXNoYTI1NjplNzYwMTkxZGQ0MjU4MWUwMjNhNjhiNzU4NzY5ZTJkYTI1OWI1ZDUyZTMxMDNjNjA2MGRkYzAyYzllZGI4ZDdiIFwKKyAgICAtLWhhc2g9c2hhMjU2OmVkODZhMzU2MzFmN2JmYmIyOGUxMDhkZDk2NzczYjlkNWE2Y2U0ODExY2Y2ZWE0NjhiYjZhMzU5YjI1NmIxZTQgXAorICAgIC0taGFzaD1zaGEyNTY6ZWUwN2U0N2MxMjg5MGVmMjQ4NzY2YTZlNTViZDM4ZWJmYjJiYjhlZGQ0MTQyZDU2ZGI5MWIyMWVhNjhiNzYyNyBcCisgICAgLS1oYXNoPXNoYTI1NjpmYTNhMDEyOGIxNTI2MjcxNjFjZTQ3MjAxMjYyZDMxNDBlZGI1YTVjM2RhODhkNzNhMWI3OTBhOTU5MTI2OTU2IFwKKyAgICAtLWhhc2g9c2hhMjU2OmZjYzhlYjZkNTkwMmJiMWNmNmRjNGYxODdlZTNlYTgwYTFlYmEwYTg5YWJhNDBhNWNiMjBhNTA4N2Q5NjEzNTcKKyAgICAjIHZpYSBjcnlwdG9ncmFwaHkKK2NoYXJzZXQtbm9ybWFsaXplcj09My4zLjIgXAorICAgIC0taGFzaD1zaGEyNTY6MDY0MzViNTM5Zjg4OWIxZjZmNGFjMTc1ODg3MWFhZTQyZGMzYThjMGUyNGFjOWU2MGMyMzg0OTczYWQ3MzAyNyBcCisgICAgLS1oYXNoPXNoYTI1NjowNmE4MWU5M2NkNDQxYzU2YTliNjVkOGUxZDA0M2RhZWI5N2EzZDA4NTZkMTc3ZDVjOTBiYTg1YWNiM2RiMDg3IFwKKyAgICAtLWhhc2g9c2hhMjU2OjBhNTU1NTRhMmZhMGQ0MDg4MTZiM2I1Y2VkZjAwNDVmNGI4ZTFhNjA2NWFlYzQ1ODQ5ZGUyZDZmM2Y4ZTk3ODYgXAorICAgIC0taGFzaD1zaGEyNTY6MGIyYjY0ZDJiYjZkM2ZiOTExMmJhZmE3MzJkZWY0ODYwNDllNjNkZTk2MThiNTg0M2JjZGQwODFkODE0NGNkOCBcCisgICAgLS1oYXNoPXNoYTI1NjoxMDk1NTg0MjU3MDg3NjYwNGQ0MDQ2NjFmYmNjYmM5YzdlNjg0Y2FmNDMyYzA5YzcxNWVjMzhmYmFlNDVhZTA5IFwKKyAgICAtLWhhc2g9c2hhMjU2OjEyMmM3ZmE2MmIxMzBlZDU1ZjhmMjg1YmZkNTZkNWY0YjRhNWI1MDM2MDlkMTgxZjlhZDg1ZTU1Yzg5ZjQxODUgXAorICAgIC0taGFzaD1zaGEyNTY6MWNlYWUyZjE3YTljMzNjYjQ4ZTMyNjM5NjBkYzVmYzgwMDUzNTFlZTE5ZGIyMTdlOWIxYmIxNWQyOGMwMjU3NCBcCisgICAgLS1oYXNoPXNoYTI1NjoxZDMxOTNmNGE2ODBjNjRiNGI2YTkxMTU5NDM1MzhlZGI4OTZlZGMxOTBmMGIyMjJlNzM3NjE3MTY1MTkyNjhlIFwKKyAgICAtLWhhc2g9c2hhMjU2OjFmNzk2ODJmYmUzMDNkYjkyYmMyYjExMzYwMTZhMzhhNDJlODM1ZDkzMmJhYjViM2IxYmZjZmJmMDY0MGU1MTkgXAorICAgIC0taGFzaD1zaGEyNTY6MjEyNzU2NmM2NjQ0NDI2NTJmMDI0YzgzNzA5MTg5MGNiMTk0MmMzMDkzN2FkZDI4ODIyM2RjODk1NzkzZjg5OCBcCisgICAgLS1oYXNoPXNoYTI1NjoyMmFmY2I5ZjI1M2RhYzA2OTZiNWE0YmU0YTFjMGY4NzYyZjgyMzllMjFiOTk2ODAwOTlhYmQ5YjJiMWIyMjY5IFwKKyAgICAtLWhhc2g9c2hhMjU2OjI1YmFmMDgzYmY2ZjZiMzQxZjQxMjFjMmYzYzU0ODg3NWVlNmY1MzM5MzAwZTA4YmUzZjJiMmJhMTcyMWNkZDMgXAorICAgIC0taGFzaD1zaGEyNTY6MmU4MWM3YjljODk3OWNlOTJlZDMwNmMyNDlkNDY4OTQ3NzZhOTA5NTA1ZDhmNWE0YmE1NWIxNDIwNmUzMjIyZiBcCisgICAgLS1oYXNoPXNoYTI1NjozMjg3NzYxYmM0ZWU5ZTMzNTYxYTdlMDU4YzcyYWMwOTM4YzRmNTdmZTQ5YTA5ZWFlNDI4ZmQ4OGFhZmU3YmI2IFwKKyAgICAtLWhhc2g9c2hhMjU2OjM0ZDFjOGRhMWU3OGQyZTAwMWYzNjM3OTFjOThhMjcyYmI3MzQwMDBmY2VmNDdhNDkxYzFlM2IwNTA1NjU3YTggXAorICAgIC0taGFzaD1zaGEyNTY6MzdlNTVjOGU1MWMyMzZmOTViMDMzZjZmYjM5MWQ3ZDc5NzBiYTVmZTdmZjQ1M2RhZDY3NWU4OGNmMzAzMzc3YSBcCisgICAgLS1oYXNoPXNoYTI1NjozZDQ3ZmEyMDNhN2JkOWM1YjZjZWU0NzM2ZWU4NGNhMDNiOGVmMjMxOTNjMGQxY2E5OWI1MDg5ZjcyNjQ1YzczIFwKKyAgICAtLWhhc2g9c2hhMjU2OjNlNGQxZjY1ODczMjJkMjc4ODgzNmE5OWM2OTA2MmZiYjA5MTMzMWVjOTQwZTAyZDEyZDE3OWMxZDUzZTI1ZmMgXAorICAgIC0taGFzaD1zaGEyNTY6NDJjYjI5NjYzNmZjYzhiMDY0NDQ4NmQxNWMxMjM3NmNiOWZhNzU0NDNlMDBmYjI1ZGUwYjg2MDJlNjRjMTcxNCBcCisgICAgLS1oYXNoPXNoYTI1Njo0NTQ4NWUwMWZmNGQzNjMwZWMwZDk2MTczMTA0NDhhODcwMmY3MGU5YzAxOTA2YjBkMDExOGJkZjlkMTI0Y2YyIFwKKyAgICAtLWhhc2g9c2hhMjU2OjRhNzhiMmI0NDZiZDdjOTM0ZjVkY2VkYzU4ODkwM2ZiMmY1ZWVjMTcyZjNkMjllNTJhOTA5NmE0MzcyMmFkZmMgXAorICAgIC0taGFzaD1zaGEyNTY6NGFiMmZlNDdmYWU5ZTBmOWRlZThjMDQxODdjZTVkMDlmNDhlYWJlNjExYmU4MjU5NDQ0OTA2NzkzYWI3Y2JjZSBcCisgICAgLS1oYXNoPXNoYTI1Njo0ZDBkMTY1MDM2OTE2NWExNGUxNGUxZTQ3YjM3MmNmY2IzMWQ2YWI0NGU2ZTMzY2IyZDRlNTcyNjUyOTAwNDRkIFwKKyAgICAtLWhhc2g9c2hhMjU2OjU0OWEzYTczZGE5MDFkNWJjM2NlOGQyNGUwNjAwZDFmYTg1NTI0YzEwMjg3ZjYwMDRmYmFiODc2NzJiZjNlMWUgXAorICAgIC0taGFzaD1zaGEyNTY6NTUwODZlZTEwNjQyMTU3ODFmZmYzOWExYWYwOTUxOGJjOTI1NWI1MGQ2MzMzZjJlNGM3NGNhMDlmYWM2YThmNiBcCisgICAgLS1oYXNoPXNoYTI1Njo1NzJjMzc2M2EyNjRiYTQ3YjNjZjcwOGE0NGNlOTY1ZDk4NTU1ZjYxOGNhNDJjOTI2YTljMTYxNmQ4ZjM0MjY5IFwKKyAgICAtLWhhc2g9c2hhMjU2OjU3M2Y2ZWFjNDhmNDc2OWQ2NjdjNDQ0MjA4MWIxNzk0ZjUyOTE5ZTdlZGFkYTc3NDk1YWFlZDkyMzZkMTNhOTYgXAorICAgIC0taGFzaD1zaGEyNTY6NWI0YzE0NTQwOWJlZjYwMmE2OTBlN2NmYWQwYTE1YTU1YzEzMzIwZmY3YTNhZDdjYTU5YzEzYmI4YmE0ZDQ1ZCBcCisgICAgLS1oYXNoPXNoYTI1Njo2NDYzZWZmYTMxODZlYTA5NDExZDUwZWZjN2Q4NTM2MGIzOGQ1ZjA5Yjg3MGM0OGU0NjAwZjYzYWY0OTBlNTZhIFwKKyAgICAtLWhhc2g9c2hhMjU2OjY1ZjZmNjMwMzQxMDBlYWQwOTRiODc0NGIzYjk3OTY1Nzg1Mzg4ZjMwOGE2NGNmOGQ3YzM0ZjJmMmU1YmUwYzQgXAorICAgIC0taGFzaD1zaGEyNTY6NjYzOTQ2NjM5ZDI5NmRmNmEyYmIyYWE1MWI2MGEyNDU0Y2ExY2IyOTgzNTMyNGM2NDBkYWZiNWZmMjEzMWE3NyBcCisgICAgLS1oYXNoPXNoYTI1Njo2ODk3YWY1MTY1NWUzNjkxZmY4NTM2Njg3NzljN2JhZDQxNTc5ZmFjYWNmNWZkNzI1M2IwMTMzMzA4Y2YwMDBkIFwKKyAgICAtLWhhc2g9c2hhMjU2OjY4ZDFmOGE5ZTllMzdjMTIyM2I2NTYzOTliZTVkNmI0NDhkZWE4NTBiZWQ3ZDBmODdhODMxMWYxZmYzZGFiYjAgXAorICAgIC0taGFzaD1zaGEyNTY6NmFjN2ZmYzdhZDZkMDQwNTE3YmUzOWViNTkxY2FjNWZmODc0MTZjMjUzN2RmNmJhM2NiYTNiYWUyOTBjMGZlZCBcCisgICAgLS1oYXNoPXNoYTI1Njo2YjMyNTE4OTBmZmYzMGVlMTQyYzQ0MTQ0ODcxMTg1ZGJlMTNiMTFiYWI0NzhhODg4ODdhNjM5NjU1YmUxMDY4IFwKKyAgICAtLWhhc2g9c2hhMjU2OjZjNGNhZWVmOGZhNjNkMDZiZDQzN2NkNGJkY2YzZmZlZmU2NzM4ZmIxYjI1OTUxNDQwZDgwZGM3ZGY4YzAzYWMgXAorICAgIC0taGFzaD1zaGEyNTY6NmVmMWQ4MmEzYWY5ZDNlZWNkYmEyMzIxZGMxYjNjMjM4MjQ1ZDg5MDg0M2UwNDBlNDFlNDcwZmZhNjRjM2UyNSBcCisgICAgLS1oYXNoPXNoYTI1Njo3NTNmMTBlODY3MzQzYjQ1MTExMjhjNmVkOGM4MmY3YmVjM2JkMDI2ODc1NTc2ZGZkODg0ODNjNWM3M2IyZmQ4IFwKKyAgICAtLWhhc2g9c2hhMjU2OjdjZDEzYTJlM2RkZWVkNjkxM2E2NWU2NmU5NGI1MWQ4MGEwNDExNDVhMDI2YzI3ZTZiYjc2YzMxYTg1M2M2YWIgXAorICAgIC0taGFzaD1zaGEyNTY6N2VkOWU1MjY3NDI4NTFlOGQ1Y2M5ZTZjZjQxNDI3ZGZjNjA2OGQ0ZjVhM2JiMDM2NTk0NDRiNGNhYmY2YmMyNiBcCisgICAgLS1oYXNoPXNoYTI1Njo3ZjA0YzgzOWVkMGI2Yjk4YjFhNzUwMWEwMDIxNDRiNzZjMThmYjFjMTg1MGM4Yjk4ZDQ1OGFjMjY5ZTI2ZWQyIFwKKyAgICAtLWhhc2g9c2hhMjU2OjgwMmZlOTljY2E3NDU3NjQyMTI1YThhODhhMDg0Y2VmMjhmZjBjZjk0MDcwNjBmN2I5M2RjYTVhYTI1NDgwZGIgXAorICAgIC0taGFzaD1zaGEyNTY6ODA0MDJjZDZlZTI5MWRjYjcyNjQ0ZDZlYWM5Mzc4NWZlMmM4YjljYjMwODkzYzFhZjViOGZkZDc1M2I5ZDQwZiBcCisgICAgLS1oYXNoPXNoYTI1Njo4NDY1MzIyMTk2YzhiNGQ3YWI2ZDFlMDQ5ZTRjNWNiNDYwZDAzOTRkYTRhMjdkMjNjYzI0MmZiZjAwMzRiNmI1IFwKKyAgICAtLWhhc2g9c2hhMjU2Ojg2MjE2YjVjZWU0YjA2ZGY5ODZkMjE0ZjY2NDMwNTE0MmQ5Yzc2ZGY5YjY1MTJiZTI3MzhhYTcyYTIwNDhmOTkgXAorICAgIC0taGFzaD1zaGEyNTY6ODdkMTM1MTI2ODczMWRiNzllMGY4ZTc0NWQ5MjQ5M2VlMjg0MWM5NzQxMjhlZjYyOWRjNTE4YjkzN2Q5MTk0YyBcCisgICAgLS1oYXNoPXNoYTI1Njo4YmRiNThmZjdiYTIzMDAyYTRjNTgwOGQ2MDhlNGU2YzY4NzE3NTcyNGY1NGE1ZGFkZTVmYThjNjdiNjA0ZTRkIFwKKyAgICAtLWhhc2g9c2hhMjU2OjhjNjIyYTVmZTM5YTQ4Zjc4OTQ0YTg3ZDRmYjhhNTNlZTA3MzQ0NjQxYjA1NjJjNTQwZDg0MDc0ODU3MWI4MTEgXAorICAgIC0taGFzaD1zaGEyNTY6OGQ3NTZlNDRlOTQ0ODllNDk1NzEwODZlZjgzYjJiYjhjZTMxMWU3MzAwOTJkMmMzNGNhOGY3ZDkyNWNiMjBhYSBcCisgICAgLS1oYXNoPXNoYTI1Njo4ZjRhMDE0YmMzNmQzYzU3NDAyZTI5NzdkYWRhMzRmOWMxMjMwMGFmNTM2ODM5ZGMzOGMwYmVhYjg4NzhmMzhhIFwKKyAgICAtLWhhc2g9c2hhMjU2OjkwNjNlMjRmZGIxZTQ5OGFiNzFjYjc0MTllMjQ2MjI1MTZjNGEwNDQ3NmIxN2EyZGFiNTdlOGJhYTMwZDZlMDMgXAorICAgIC0taGFzaD1zaGEyNTY6OTBkNTU4NDg5OTYyZmQ0OTE4MTQzMjc3YTc3MzMxNmU1NmM3MmRhNTZlYzdhYTNkYzNkYmJlMjBmZGZlZDE1YiBcCisgICAgLS1oYXNoPXNoYTI1Njo5MjNjMGM4MzFiN2NmY2IwNzE1ODBkM2Y0NmM0YmFmNTBmMTc0YmU1NzE1NzY1NTYyNjk1MzBmNGJiZDc5ZDA0IFwKKyAgICAtLWhhc2g9c2hhMjU2Ojk1ZjJhNTc5NjMyOTMyM2I4ZjA1MTJlMDlkYmI3YTE4NjBjNDZhMzlkYTYyZWNiMjMyNGYxMTZmYThmZGM4NWMgXAorICAgIC0taGFzaD1zaGEyNTY6OTZiMDJhM2RjNDM4MWU1NDk0ZmFkMzliZTY3N2FiY2I1ZTY2MzRiZjdiNGZhODNhNmRkMzExMjYwNzU0NzAwMSBcCisgICAgLS1oYXNoPXNoYTI1Njo5Zjk2ZGY2OTIzZTIxODE2ZGE3ZTBhZDNmZDQ3ZGQ4Zjk0YjJhNWNlNTk0ZTAwNjc3YzAwMTMwMThiODEzNDU4IFwKKyAgICAtLWhhc2g9c2hhMjU2OmExMGFmMjBiODIzNjBhYjAwODI3ZjkxNmE2MDU4NDUxYjcyM2I0ZTY1MDMwYzVhMTg1NzdjOGIyZGU1YjMzODkgXAorICAgIC0taGFzaD1zaGEyNTY6YTUwYWViZmExNzNlMTU3MDk5OTM5YjE3ZjE4NjAwZjcyZjg0ZWVkMzA0OWU3NDNiNjhhZDE1YmQ2OWI2YmY5OSBcCisgICAgLS1oYXNoPXNoYTI1NjphOTgxYTUzNjk3NGJiYzdhNTEyY2Y0NGVkMTQ5MzhjZjAxMDMwYTk5ZTliM2EwNmRkNTk1Nzg4ODJmMDZmOTg1IFwKKyAgICAtLWhhc2g9c2hhMjU2OmE5YThlOTAzMWQ2MTNmZDIwMDljMTgyYjY5YzdiMmMxZWY4MjM5YTBlZmIxZGYzZjdjOGRhNjZkNWRkM2Q1MzcgXAorICAgIC0taGFzaD1zaGEyNTY6YWU1ZjQxNjFmMThjNjE4MDZmNDExYTEzYjAzMTBiZWE4N2Y5ODdjN2QyZWNkYmRhYWQwZTk0ZWIyZTQwNDIzOCBcCisgICAgLS1oYXNoPXNoYTI1NjphZWQzOGY2ZTRmYjNmNWQ2YmY4MWJmYTk5MGEwNzgwNmJlOWQ4M2NmN2JhY2VmOTk4YWIxYTliZDY2MGE1ODFmIFwKKyAgICAtLWhhc2g9c2hhMjU2OmIwMWI4OGQ0NWE2ZmNiNjk2NjdjZDZkMmY3YTlhZWI0YmY1Mzc2MGQ3ZmM1MzZiZjY3OWVjOTRmZTlmM2ZmM2QgXAorICAgIC0taGFzaD1zaGEyNTY6YjI2MWNjZGVjNzgyMTI4MWRhZGU3NDhkMDg4YmI2ZTliNjllNmQxNWIzMDY1MmI3NGNiYmFjMjVlMjgwYjc5NiBcCisgICAgLS1oYXNoPXNoYTI1NjpiMmIwYTBjMDUxNzYxNmI2ODY5ODY5ZjhjNTgxZDRlYjJkZDgzYTRkNzllMGViY2I3ZDM3M2VmOTk1NmFlYjBhIFwKKyAgICAtLWhhc2g9c2hhMjU2OmI0YTIzZjYxY2U4N2FkZjg5YmU3NDZjOGE4OTc0ZmUxYzgyM2M4OTFkOGY4NmViMjE4YmI5NTdjOTI0YmIxNDMgXAorICAgIC0taGFzaD1zaGEyNTY6YmQ4ZjdkZjdkMTJjMmRiOWZhYjQwYmRkODdhN2MwOWIxNTMwMTI4MzE1ZDA0N2EwODZmYTNhZTM0MzVjYjNhOCBcCisgICAgLS1oYXNoPXNoYTI1NjpiZWI1OGZlNWNkYjEwMWUzYTA1NTE5MmFjMjkxYjdhMjFlM2I3ZWY0ZjY3ZmExZDc0ZTMzMWE3ZjIxMjQzNDFjIFwKKyAgICAtLWhhc2g9c2hhMjU2OmMwMDJiNGZmYzBiZTYxMWYwZDlkYTkzMmViMGY3MDRmZTI2MDJhOWE5NDlkMWY3MzhlNGMzNGM3NWIwODYzZDUgXAorICAgIC0taGFzaD1zaGEyNTY6YzA4M2FmNjA3ZDI1MTU2MTIwNTZhMzFmMGE4ZDllMGZjYjU4NzZiN2JmYzBhYmFkM2VjZDI3NWJjNGViYzJkNSBcCisgICAgLS1oYXNoPXNoYTI1NjpjMTgwZjUxYWZiMzk0ZTE2NWVhZmU0YWMyOTM2YTE0YmVlM2ViMTBkZWJjOWQ5ZTRkYjg5NThmZTM2YWZlNzExIFwKKyAgICAtLWhhc2g9c2hhMjU2OmMyMzVlYmQ5YmFhZTAyZjFiNzdiY2VhNjFiY2UzMzJjYjQzMzFkYzM2MTdkMjU0ZGYzMzIzYWEwMWFiNDdiZDQgXAorICAgIC0taGFzaD1zaGEyNTY6Y2Q3MDU3NGIxMmJiOGE0ZDJhYWEwMDk0NTE1ZGYyNDYzY2I0MjlkODUzNmNmYjZjN2NlOTgzMjQ2OTgzZTVhNiBcCisgICAgLS1oYXNoPXNoYTI1NjpkMGVjY2NlZmZjYjUzMjAxYjViZmViYjUyNjAwYTVmYjQ4M2EyMGI2MWRhOWRiYzg4NWY4YjEwM2NiZTc1OThjIFwKKyAgICAtLWhhc2g9c2hhMjU2OmQ5NjViYmE0N2RkZWVjOGNkNTYwNjg3NTg0ZTg4Y2Y2OTlmZDI4ZjE5MmNlYjQ1MmQxZDdlZTgwN2M1NTk3YjcgXAorICAgIC0taGFzaD1zaGEyNTY6ZGIzNjRlY2EyM2Y4NzZkYTZmOWUxNmM5ZGEwZGY1MWFhNGYxMDRhOTcyNzM1NTc0ODQyNjE4YjhjNmQ5OTlkNCBcCisgICAgLS1oYXNoPXNoYTI1NjpkZGJiMjU1MWQ3ZTAxMDJlNzI1MmRiNzliYTQ0NWNkYWI3MWIyNjY0MDgxN2FiMWUzZTM2NDhkYWQ1MTUwMDNiIFwKKyAgICAtLWhhc2g9c2hhMjU2OmRlYjZiZTBhYzM4ZWNlOWJhODdkZWE4ODBlNDM4ZjI1Y2EzZWRkZmFjOGIwMDJhMmVjM2Q5MTgzYTQ1NGU4YWUgXAorICAgIC0taGFzaD1zaGEyNTY6ZTA2ZWQzZWIzMjE4YmM2NDc4NmY3ZGI0MTkxN2Q0ZTY4NmNjNDg1Njk0NGY1M2Q1YmRmODNhNjg4NDQzMmUxMiBcCisgICAgLS1oYXNoPXNoYTI1NjplMjdhZDkzMGE4NDJiNGM1ZWI4YWMwMDE2YjBhNTRmNWFlYmJlNjc5MzQwYzI2MTAxZGYzMzQyNDE0MmMxNDNjIFwKKyAgICAtLWhhc2g9c2hhMjU2OmU1Mzc0ODRkZjBkOGY0MjZjZTJhZmIyZDBmOGUxYzNkMGIxMTRiODNmODg1MGU1ZjJmYmVhMGU3OTdiZDgyYWUgXAorICAgIC0taGFzaD1zaGEyNTY6ZWIwMGVkOTQxMTk0NjY1YzMzMmJmOGUwNzhiYWYwMzdkNmMzNWQ3YzRmMzEwMmVhMmQ0ZjE2Y2E5NGEyNmRjOCBcCisgICAgLS1oYXNoPXNoYTI1NjplYjY5MDRjMzU0NTI2ZTc1OGZkYTcxNjdiMzMwMDU5OThmYjY4YzQ2ZmJjMTBlMDEzY2E5N2YyMWNhNWM4ODg3IFwKKyAgICAtLWhhc2g9c2hhMjU2OmViODgyMWUwOWU5MTYxNjVlMTYwNzk3YTZjMTdlZGRhMDY3OTM3OWE0YmU1YzcxNmMyNjBlODM2ZTEyMmY1NGIgXAorICAgIC0taGFzaD1zaGEyNTY6ZWZjYjNmNjY3NjQ4MDY5MTUxOGMxNzdlM2I0NjViY2RkZjU3Y2VhMDQwMzAyZjlmNGU2ZTE5MWFmOTExNzRkNCBcCisgICAgLS1oYXNoPXNoYTI1NjpmMjcyNzNiNjA0ODhhYmU3MjFhMDc1YmNjYTZkN2YzOTY0ZjlmNmYwNjdjOGM0YzYwNTc0MzAyM2Q3ZDM5NDRmIFwKKyAgICAtLWhhc2g9c2hhMjU2OmYzMGMzY2IzM2IyNDQ1NGE4MmZhZWNhZjAxYjE5YzE4NTYyYjFlODk1NThmYjZjNTZkZTRkOTExOGEwMzJmZDUgXAorICAgIC0taGFzaD1zaGEyNTY6ZmI2OTI1NmUxODBjYjZjOGE4OTRmZWU2MmIzYWZlYmFlNzg1YmFiYzFlZTk4YjgxY2RmNjhiYmNhMTk4N2YzMyBcCisgICAgLS1oYXNoPXNoYTI1NjpmZDFhYmMwZDg5ZTMwY2M0ZTAyZTQwNjRkYzY3ZmNjNTFiZDk0MWViMzk1YzUwMmFhYzNlYzE5ZmFiNDZiNTE5IFwKKyAgICAtLWhhc2g9c2hhMjU2OmZmOGZhMzY3ZDA5YjcxN2IyYTE3YTA1MjU0NDE5M2FkNzZjZDQ5OTc5YzgwNTc2ODg3OWNiNjNkOWNhNTA1NjEKICAgICAjIHZpYSByZXF1ZXN0cwotZmxhdGJ1ZmZlcnM9PTIzLjUuOSBcCi0gICAgLS1oYXNoPXNoYTI1Njo5M2E1MDZiNmFiNzcxYzc5Y2U4MTZlN2IzNWE5M2VkMDhlYzViNGM5ZWRiODExMTAxYTIyYzQ0YTQxNTJmMDE4IFwKLSAgICAtLWhhc2g9c2hhMjU2OmEwMmViOGMyZDYxY2JhMTUzY2QyMTE5MzdkZThmOGY3NzY0YjZhNzUxMDk3MWIyYzQ2ODRlZDhiMDJlNmU1NzEKLSAgICAjIHZpYSB0ZW5zb3JmbG93LWNwdQotZ2FzdD09MC40LjAgXAotICAgIC0taGFzaD1zaGEyNTY6NDBmZWI3YjhiODQzNDc4NTU4NWFiMjI0ZDE1NjhiODU3ZWRiMTgyOTdlNWEzMDQ3ZjFiYTAxMmJjODNiNDJjMSBcCi0gICAgLS1oYXNoPXNoYTI1NjpiN2FkY2RkNWFkYmViZjFhZGYxNzM3OGRhNWJhM2Y1NDM2ODRkYmVjNDdiMWNkYTFmMzk5N2U1NzNjZDU0MmM0Ci0gICAgIyB2aWEgdGVuc29yZmxvdy1jcHUKLWdvb2dsZS1hdXRoPT0yLjE4LjAgXAotICAgIC0taGFzaD1zaGEyNTY6YzY2YjQ4OGE4YjAwNWIyM2NjYjk3YjExOThiNmNlY2U1MTZjOTE4NjkwOTFhYzViN2MyNjc0MjJkYjI3MzNjNyBcCi0gICAgLS1oYXNoPXNoYTI1NjplZjNmM2E2N2ZhNTRkNDIxYTFjMTU1ODY0NTcwZjlhOGRlOTE3OWNlZGM5MzdiZGE0OTZiN2E4Y2EzMzhlOTM2CitjcnlwdG9ncmFwaHk9PTQxLjAuNyBcCisgICAgLS1oYXNoPXNoYTI1NjowNzliODU2NThlYTJmNTljNGY0M2I3MGY4MTE5YTUyNDE0Y2RiN2JlMzRkYTVkMDE5YTc3YmY5NmQ0NzNiOTYwIFwKKyAgICAtLWhhc2g9c2hhMjU2OjA5NjE2ZWVhZWY0MDZmOTkwNDY1NTNiOGE0MGZiZjhiMWU3MDc5NWE5MTg4NWJhNGM5NmE3MDc5M2RlNTUwNGEgXAorICAgIC0taGFzaD1zaGEyNTY6MTNmOTNjZTliZWE4MDE2YzI1M2IzNGFmYzZiZDZhNzU5OTNlNWM0MDY3MmVkNTQwNWE5YzgzMmYwZDRhMDBiYyBcCisgICAgLS1oYXNoPXNoYTI1NjozN2ExMzg1ODliMTIwNjllZmI0MjQyMjBiZjc4ZWFjNTljYTY4Yjk1Njk2ZmM2MjJiNmNjYzFjMGExOTcyMDRhIFwKKyAgICAtLWhhc2g9c2hhMjU2OjNjNzg0NTFiNzgzMTNmYTgxNjA3ZmExYjNmMWFlMGE1ZGRkODAxNGMzOGEwMmQ5ZGIwNjE2MTMzOTg3YjljZGYgXAorICAgIC0taGFzaD1zaGEyNTY6NDNmMjU1MmEyMzc4YjQ0ODY5ZmU4ODI3YWExOWU2OTUxMmUzMjQ1YTIxOTEwNDQzODY5MjM4NWIwZWUxMTlkMSBcCisgICAgLS1oYXNoPXNoYTI1Njo0OGEwNDc2NjI2ZGE5MTJhNDRjYzA3OGY5ODkzZjI5MmYwYjNlNGM3MzljYWYyODkyNjgxNjhkOGY0NzAyYTM5IFwKKyAgICAtLWhhc2g9c2hhMjU2OjQ5ZjA4MDVmYzBiMmFjOGQ0ODgyZGQ1MmY0YTNiOTM1YjIxMDkzNWQ1MDBiNmI4MDVmMzIxYWRkYzgxNzc0MDYgXAorICAgIC0taGFzaD1zaGEyNTY6NTQyOWVjNzM5YTI5ZGYyZTI5ZTE1ZDA4MmYxZDlhZDY4MzcwMWYwZWM3NzA5Y2E0NzliM2ZmMjcwOGRhZTY1YSBcCisgICAgLS1oYXNoPXNoYTI1Njo1YTFiNDFiYzk3ZjFhZDIzMGE0MTY1N2Q5MTU1MTEzYzc1MjE5NTM4NjlhZTU3YWMzOWFjN2YxYmI0NzE0NjlhIFwKKyAgICAtLWhhc2g9c2hhMjU2OjY4YTJkZWM3OWRlZWJjNWQyNmQ2MTdiZmRmNmU4YWFiMDY1YTRmMzQ5MzRiMjJkM2I1MDEwZGYzYmEzNjYxMmMgXAorICAgIC0taGFzaD1zaGEyNTY6N2E2OThjYjFkYWM4MmMzNWZjZjhmZTM0MTdhM2FhYmE5N2RlMTZhMDFhYzkxNGI4OWEwODg5ZDM2NGQyZjZiZSBcCisgICAgLS1oYXNoPXNoYTI1Njo4NDFkZjRjYWEwMTAwOGJhZDI1M2JjZTJhNmY3YjQ3Zjg2ZGM5ZjA4ZGY0YjQzM2M0MDRkZWY4NjlmNTkwYTE1IFwKKyAgICAtLWhhc2g9c2hhMjU2OjkwNDUyYmE3OWI4Nzg4ZmEzODBkZmI1ODdjY2E2OTI5NzZlZjRlNzU3YjE5NGIwOTNkODQ1ZThkOTlmNjEyZjIgXAorICAgIC0taGFzaD1zaGEyNTY6OTI4MjU4YmE1ZDZmOGFlNjQ0ZTc2NGQwZjk5NmQ2MWE4Nzc3NTU5ZjcyZGZlYjJlZWE3ZTJmZTBhZDZlNzgyZCBcCisgICAgLS1oYXNoPXNoYTI1NjphZjAzYjMyNjk1YjI0ZDg1YTc1ZDQwZTFiYTM5ZmZlN2RiN2ZmY2IwOTlmZTUwN2IzOWZkNDFhNTY1ZjFiMTU3IFwKKyAgICAtLWhhc2g9c2hhMjU2OmI2NDA5ODFiZjY0YTNlOTc4YTU2MTY3NTk0YTBlOTdkYjcxYzg5YTQ3OWRhOGUxNzVkOGJiNWJlNTE3OGMwMDMgXAorICAgIC0taGFzaD1zaGEyNTY6YzVjYTc4NDg1YTI1NWUwM2MzMmI1MTNmOGMyYmMzOWZlZGI3ZjVjNWY4NTM1NTQ1YmRjMjIzYTAzYjI0ZjI0OCBcCisgICAgLS1oYXNoPXNoYTI1NjpjN2YzMjAxZWM0N2Q1MjA3ODQxNDAyNTk0ZjFkNzk1MDg3OWVmODkwYzBjNDk1MDUyZmE2MmY1ODI4M2ZkZTFhIFwKKyAgICAtLWhhc2g9c2hhMjU2OmQ1ZWM4NTA4MGNjZTdiMDUxM2NmZDIzMzkxNGViOGI3YmJkMDYzM2YxZDE3MDNhYTI4ZDFkZDVhNzJmNjc4ZWMgXAorICAgIC0taGFzaD1zaGEyNTY6ZDZjMzkxYzAyMWFiMWY3YTgyZGE1ZDhkMGIzY2VlMmY0YjJjNDU1ZWM4NmM4YWViYmM4NDgzN2E2MzFmZjMwOSBcCisgICAgLS1oYXNoPXNoYTI1NjplMzExNGRhNmQ3Zjk1ZDJkZWU3ZDNmNGVlYzE2ZGFjZmY4MTk3NDBiYmFiOTMxYWZmODY0OGNiMTNjNWZmNWU3IFwKKyAgICAtLWhhc2g9c2hhMjU2OmY5ODM1OTYwNjVhMThhMjE4M2U3Zjc5YWIzZmQ0YzQ3NTIwNWI4MzllMDJjYmMwZWZiYmY5NjY2YzRiMzA4M2QKKyAgICAjIHZpYSBzZWNyZXRzdG9yYWdlCitkb2N1dGlscz09MC4yMC4xIFwKKyAgICAtLWhhc2g9c2hhMjU2Ojk2ZjM4N2EyYzU1NjJkYjQ0NzZmMDlmMTNiYmFiMjE5MmU3NjRjYWMwOGViYmYzYTM0YTk1ZDliMWU0YTU5ZDYgXAorICAgIC0taGFzaD1zaGEyNTY6ZjA4YTRlMjc2YzNhMTU4M2E4NmRjZTNlMzRhYmEzZmUwNGQwMmJiYTJkZDUxZWQxNjEwNjI0NGU4YTkyM2UzYgorICAgICMgdmlhIHJlYWRtZS1yZW5kZXJlcgorZmxhdGJ1ZmZlcnM9PTIzLjUuMjYgXAorICAgIC0taGFzaD1zaGEyNTY6OWVhMTE0NGNhYzA1Y2U1ZDg2ZTI4NTlmNDMxYzZjZDVlNjZjZDljNzhjNTU4MzE3Yzc5NTVmYjhkNGM3OGQ4OSBcCisgICAgLS1oYXNoPXNoYTI1NjpjMGZmMzU2ZGEzNjMwODdiOTE1ZmRlNGI4YjQ1YmRkYTczNDMyZmMxN2NkZGIzYzgxNTc0NzJlYWIxNDIyYWQxCisgICAgIyB2aWEgdGVuc29yZmxvdworZ2FzdD09MC41LjQgXAorICAgIC0taGFzaD1zaGEyNTY6NmZjNGZhNWZhMTBiNzJmYjhhYWI0YWU1OGJjYjAyMzA1ODM4NmU2N2I2ZmEyZTNlMzRjZWM1Yzc2OTM2MDMxNiBcCisgICAgLS1oYXNoPXNoYTI1Njo5YzI3MGZlNWY0YjEzMDk2OWI1NDE3NGRlN2RiNGU3NjRiMDliNGY3ZjY3Y2NmYzMyNDgwZTI5Zjc4MzQ4ZDk3CisgICAgIyB2aWEgdGVuc29yZmxvdworZ29vZ2xlLWF1dGg9PTIuMjYuMiBcCisgICAgLS1oYXNoPXNoYTI1NjozZjQ0NWM4Y2U5YjYxZWQ2NDU5YWFkODZkOGNjZGJhNGE5YWZlZDg0MWIyZDE0NTFhMTFlZjRkYjA4OTU3NDI0IFwKKyAgICAtLWhhc2g9c2hhMjU2Ojk3MzI3ZGJiZjU4Y2NjYjU4ZmM1YTE3MTJiYmE0MDNhZTc2NjY4ZTY0ODE0ZWIzMGY3MzE2ZjdlMjcxMjZiODEKICAgICAjIHZpYQogICAgICMgICBnb29nbGUtYXV0aC1vYXV0aGxpYgogICAgICMgICB0ZW5zb3Jib2FyZAotZ29vZ2xlLWF1dGgtb2F1dGhsaWI9PTEuMC4wIFwKLSAgICAtLWhhc2g9c2hhMjU2Ojk1ODgwY2E3MDQ5MjhjMzAwZjQ4MTk0ZDE3NzBjZjViMTQ2MjgzNWI2ZTQ5ZGI2MTQ0NWE1MjBmNzkzZmQ1ZmIgXAotICAgIC0taGFzaD1zaGEyNTY6ZTM3NTA2NDk2NDgyMGI0NzIyMWE3ZTFiN2VlMWZkNzcwNTFiNjMyM2MzZjllM2UxOTc4NWY3OGFiNjdlY2ZjNQorZ29vZ2xlLWF1dGgtb2F1dGhsaWI9PTEuMi4wIFwKKyAgICAtLWhhc2g9c2hhMjU2OjI5MmQyZDM3ODMzNDlmMmIwNzM0YTBhMDIwN2IxZTFlMzIyYWMxOTNjMmMwOWQ4ZjdjNjEzZmI3Y2M1MDFlYTggXAorICAgIC0taGFzaD1zaGEyNTY6Mjk3YzFjZTRjYjEzYTk5YjU4MzRjNzRhMWZlMDMyNTJlMWU0OTk3MTY3MThiMTkwZjU2YmNiOWM0YWJjNGZhZgogICAgICMgdmlhIHRlbnNvcmJvYXJkCiBnb29nbGUtcGFzdGE9PTAuMi4wIFwKICAgICAtLWhhc2g9c2hhMjU2OjQ2MTI5NTFkYTg3NmIxYTEwZmUzOTYwZDcyMjZmMGM3NjgyY2Y5MDFlMTZhYzA2ZTQ3M2IyNjdhNWFmYTg5NTQgXAogICAgIC0taGFzaD1zaGEyNTY6YjMyNDgyNzk0YTM2NmI1MzY2YTMyYzkyYTlhOTIwMWIxMDc4MjE4ODk5MzVhMDJiM2U1MWY2YjQzMmVhODRlZCBcCiAgICAgLS1oYXNoPXNoYTI1NjpjOWYyYzhkZmM4Zjk2ZDBkNTgwODI5OTkyMDcyMWJlMzBjOWVlYzM3ZjIzODlmMjg5MDRmNDU0NTY1YzhhMTZlCi0gICAgIyB2aWEgdGVuc29yZmxvdy1jcHUKLWdycGNpbz09MS41NC4wIFwKLSAgICAtLWhhc2g9c2hhMjU2OjAyMDAwYjAwNWJjOGI3MmZmNTBjNDc3YjY0MzFlODg4NmIyOTk2MTE1OWU4YjhkMDNjMDBiM2RkOTEzOWJhZWQgXAotICAgIC0taGFzaD1zaGEyNTY6MDMxYmJkMjY2NTZlMDczOWU0YjJjODFjMTcyMTU1ZmIyNmUyNzRiOGQwMzEyZDY3YWVmYzczMGJjYmE5MTViNiBcCi0gICAgLS1oYXNoPXNoYTI1NjoxMjA5ZDZiMDAyYjI2ZTkzOWU0YzhlYTM3YTNkNWI0MDI4ZWI5NTU1Mzk0ZWE2OWZiMWFkYmQ0YjYxYTEwYmI4IFwKLSAgICAtLWhhc2g9c2hhMjU2OjEyNWVkMzVhYTM4NjhlZmE4MmVhYmZmZWNlNjI2NGJmNjM4Y2ZkYzlmMGNkNThkZGIxNzkzNjY4NGFhZmQwZjggXAotICAgIC0taGFzaD1zaGEyNTY6MTM4MmJjNDk5YWY5MjkwMWMyMjQwYzRkNTQwYzc0ZWFlOGE2NzFlNGZlOTgzOWJmZWVmZGZjYzNhMTA2YjVlMiBcCi0gICAgLS1oYXNoPXNoYTI1NjoxNmJjYTgwOTJkZDk5NGYyODY0ZmRhYjI3OGFlMDUyZmFkNDkxM2YzNmYzNTIzOGIyZGQxMWFmMmQ1NWE4N2RiIFwKLSAgICAtLWhhc2g9c2hhMjU2OjFjNTlkODk5ZWU3MTYwNjM4NjEzYTQ1MmY5YTQ5MzFkZTIyNjIzZTdiYTE3ODk3ZDhlM2UzNDhjMmU5ZDhkMGIgXAotICAgIC0taGFzaD1zaGEyNTY6MWQxMDlkZjMwNjQxZDA1MGUwMDkxMDVmOWM5Y2E1YTM1ZDAxZTM0ZDJlZTJhNGU5YzA5ODRkMzkyZmQ2ZDcwNCBcCi0gICAgLS1oYXNoPXNoYTI1NjoxZmE3ZDZkZGQzM2FiYmQzYzhiM2Q3ZDA3YzU2YzQwZWEzZDE4OTFjZTNjZDJhYTlmYTczMTA1ZWQ1MzMxODY2IFwKLSAgICAtLWhhc2g9c2hhMjU2OjIxYzRhMWFhZTg2MTc0OGQ2MzkzYTNmZjc4Njc0NzM5OTZjMTM5YTc3ZjkwMzI2ZDlmNDEwNGJlYmIyMmQ4YjggXAotICAgIC0taGFzaD1zaGEyNTY6MjI0MTY2ZjA2Y2NkYWY4ODRiZjM1NjkwYmY0MjcyOTk3YzE0MDVkZTMwMzVkNjEzODRjY2I1YjI1YTRjMWNhOCBcCi0gICAgLS1oYXNoPXNoYTI1NjoyMjYyYmQzNTEyYmE5ZTlmMGU5MWQyODczOTNkZjZmMzNjMTg5OTkzMTdkZTQ1NjI5YjdiZDQ2YzQwZjE2YmE5IFwKLSAgICAtLWhhc2g9c2hhMjU2OjI1ODViM2MyOTQ2MzFhMzliMzNmOWY5NjdhNTliMGZhZDIzYjFhNzFhMjEyZWJhNmJjMWUzY2E2ZTZlZWM5ZWUgXAotICAgIC0taGFzaD1zaGEyNTY6MjdmYjAzMGE0NTg5ZDI1MzZkYWVjNWZmNWJhMmExMjhmNGYxNTUxNDllZmFiNTc4ZmUyZGUyY2IyMTU5NmQzZCBcCi0gICAgLS1oYXNoPXNoYTI1NjozMGZiYmNlMTFmZmViNGY5ZjkxYzEzZmUwNDg5OWFhZjNlOWE4MTcwOGJlZGYyNjdiZjQ0NzU5NmI5NWRmMjZiIFwKLSAgICAtLWhhc2g9c2hhMjU2OjM5MzA2NjljOWU2ZjA4YTJlZWQ4MjQ3MzhjM2Q1Njk5ZDExY2Q0N2EwZWNjMTNiNjhlZDExNTk1NzEwYjExMzMgXAotICAgIC0taGFzaD1zaGEyNTY6M2IxNzBlNDQxZTkxZTRmMzIxZTQ2ZDNjYzk1YTAxY2IzMDdhNDU5NmRhNTRhY2E1OWViNzhhYjBmYzAzNzU0ZCBcCi0gICAgLS1oYXNoPXNoYTI1NjozZGI3MWM2ZjFhYjY4OGQ4ZGZjMTAyMjcxY2VkYzk4MjhiZWFjMzM1YTNhNDM3MmVjNTRiOGJmMTFiNDNmZDI5IFwKLSAgICAtLWhhc2g9c2hhMjU2OjQ4Y2I3YWY3NzIzOGJhMTZjNzc4NzkwMDkwMDNmNmIyMmMyMzQyNWU1ZWU1OWNiMmM0YzEwM2VjMDQwNjM4YTUgXAotICAgIC0taGFzaD1zaGEyNTY6NDllYWNlOGVhNTVmYmM0MmM3MzNkZWZiZGExZTRmZWI2ZDM4NDRlY2Q4NzViMDFiYjhiOTIzNzA5ZTBmNWVjOCBcCi0gICAgLS1oYXNoPXNoYTI1Njo1MzNlYWY1YjJhNzlhM2M2ZjM1Y2JkNmEwOTVhZTk5Y2FjN2Y0ZjljMGUwOGJkY2Y4NmMxMzBlZmQzYzMyYWRmIFwKLSAgICAtLWhhc2g9c2hhMjU2OjU5NDJhM2UwNTYzMGUxZWY1YjdiNTc1MmU1ZGE2NTgyNDYwYTJlNDQzMWRhZTYwM2RlODlmYzQ1ZjllYzVhYTkgXAotICAgIC0taGFzaD1zaGEyNTY6NjIxMTc0ODY0NjBjODNhY2QzYjVkODVjMTJlZGQ1ZmUyMGEzNzQ2MzA0NzUzODhjZmM4OTgyOTgzMWQzZWI3OSBcCi0gICAgLS1oYXNoPXNoYTI1Njo2NTBmNWYyYzlhYjEyNzViNDAwNjcwNzQxMWJiNmQ2YmM5Mjc4ODY4NzRhMjg3NjYxYzNjNmYzMzJkNGMwNjhiIFwKLSAgICAtLWhhc2g9c2hhMjU2OjZkYzFlMmM5YWMyOTJjOWE0ODRlZjkwMGM1NjhjY2IyZDZiNGRmZTI2ZGZhMDE2M2Q1YmM4MTViYjgzNmM3OGQgXAotICAgIC0taGFzaD1zaGEyNTY6NzNjMjM4ZWY2ZTRiNjQyNzJkZjdlZWM5NzZiYjAxNmM3M2QzYWI1YTZjN2U5Y2Q5MDZhYjcwMDUyM2QzMTJmMyBcCi0gICAgLS1oYXNoPXNoYTI1Njo3NzVhMmY3MDUwMTM3MGU1YmE1NGUxZWUzNDY0NDEzYmZmOWJkODViZDlhMGIyNWM5ODk2OThjNDRhNmZiNTJmIFwKLSAgICAtLWhhc2g9c2hhMjU2Ojg2MGZjZDZkYjdkY2U4MGQwYTY3M2ExY2M4OThjZTZiYzNkNDc4M2QxOTViYmUwZTkxMWJmOGE2MmM5M2ZmM2YgXAotICAgIC0taGFzaD1zaGEyNTY6ODdmNDdiZjk1MjBiYmE0MDgzZDY1YWI5MTFmOGY0YzBhYzNlZmE4MjQxOTkzZWRkNzRjOGRkMDhhZTg3NTUyZiBcCi0gICAgLS1oYXNoPXNoYTI1Njo5NjBiMTc2ZTBiYjJiNGFmZWFhMWNkMjAwMmRiMWU4MmFlNTRjOWI2ZTI3ZWE5MzU3MGE0MjMxNjUyNGU3N2NmIFwKLSAgICAtLWhhc2g9c2hhMjU2OmE3Y2FmNTUzY2NhZjcxNWVjMDViMjhjOWIyYWIyZWUzZmRiNDAzNjYyNmQ3NzlhYTA5Y2Y3Y2JmNTRiNzE0NDUgXAotICAgIC0taGFzaD1zaGEyNTY6YTk0N2Q1Mjk4YTBiYmRkNGQxNTY3MTAyNGJmMzNlMmI3ZGE3OWE3MGRlNjAwZWQyOWJhN2UwZmVmMDUzOWViYiBcCi0gICAgLS1oYXNoPXNoYTI1NjphOTdiMGQwMWFlNTk1Yzk5N2MxZDlkODI0OWUyZDJkYTgyOWMyZDhhNGJkYzI5YmI4Zjc2YzExYTk0OTE1YzlhIFwKLSAgICAtLWhhc2g9c2hhMjU2OmI3NjU1ZjgwOWUzNDIwZjgwY2UzYmY4OTczNzE2OWE5ZGNlNzMyMzhhZjU5NDA0OTc1NGExMTI4MTMyYzBkYTQgXAotICAgIC0taGFzaD1zaGEyNTY6YzMzNzQ0ZDBkMWE3MzIyZGE0NDVjMGZlNzI2ZWE2ZDRlM2VmMmRmYjA1MzllYWRmMjNkY2UzNjZmNTJmNTQ2YyBcCi0gICAgLS1oYXNoPXNoYTI1NjpjNTVhOWNmNWNiYTgwZmI4OGM4NTA5MTVjODY1YjhlZDc4ZDVlNDZlMWYyZWMxYjI3NjkyZjNlYWFmMGRjYTdlIFwKLSAgICAtLWhhc2g9c2hhMjU2OmQyZjYyZmIxYzkxNGEwMzg5MjE2NzdjZmE1MzZkNjQ1Y2I4MGUzZGQwN2RjNDg1OWEzYzkyZDc1NDA3YjkwYTUgXAotICAgIC0taGFzaD1zaGEyNTY6ZDhhZTZlMGRmM2E2MDhlOTllZTFhY2FmYWFmZDdkYjA4MzAxMDYzOTRkNTQ1NzFjMWVjZTU3ZjY1MDEyNGNlOSBcCi0gICAgLS1oYXNoPXNoYTI1NjplMzU1ZWU5ZGE5YzFjMDNmMTc0ZWZlYTU5MjkyYjE3YTk1ZTBiN2I0ZDdkMmEzODkyNjVmNzMxYTk4ODdkNWE5IFwKLSAgICAtLWhhc2g9c2hhMjU2OmUzZTUyNjA2MmM2OTA1MTdiNDJiYmE2NmZmZTM4YWFmOGJjOTlhMTgwYTc4MjEyZTdiMjJiYWE4NjkwMmY2OTAgXAotICAgIC0taGFzaD1zaGEyNTY6ZWIwODA3MzIzNTcyNjQyYWI3M2ZkODZmZTUzZDg4ZDg0M2NlNjE3ZGQxZGRmNDMwMzUxYWQwNzU5ODA5YTBhZSBcCi0gICAgLS1oYXNoPXNoYTI1NjplYmZmMDczOGJlMDQ5OWQ3ZGI3NGQyMGRjYTlmMjJhN2IyN2RlYWUzMWUxYmY5MmVhNDQ5MjRmZDY5ZWI2MjUxIFwKLSAgICAtLWhhc2g9c2hhMjU2OmVkMzZlODU0NDQ5ZmY2YzJmOGVlMTQ1Zjk0ODUxZmUxNzEyOThlMWU3OTNmNDRkNGY2NzJjNGEwZDc4MDY0ZTcgXAotICAgIC0taGFzaD1zaGEyNTY6ZWQzZDQ1OGRlZDMyZmYzYTU4ZjE1N2I2MGNjMTQwYzg4ZjdhYzhjNTA2YTFjNTY3YjJhOWVlOGEyZmQyY2U1NCBcCi0gICAgLS1oYXNoPXNoYTI1NjpmNGE3ZGNhOGNjZDgwMjNkOTE2YjkwMGFhM2M2MjZmMWJkMTgxYmQ1YjcwMTU5NDc5YjE0MmY5NTdmZjQyMGU0CisgICAgIyB2aWEgdGVuc29yZmxvdworZ3JwY2lvPT0xLjYwLjAgXAorICAgIC0taGFzaD1zaGEyNTY6MDczZjk1OWM2ZjU3MDc5NzI3MmY0ZWU5NDY0YTk5OTdlYWYxZTk4YzI3Y2I2ODAyMjViODJiNTMzOTBkNjFlNiBcCisgICAgLS1oYXNoPXNoYTI1NjowZmQzYjM5NjhmZmU3NjQzMTQ0NTgwZjI2MGYwNGQzOWQ4NjlmY2MyY2RkYjc0NWRlZWYwNzhiMDlmZDJiMzI4IFwKKyAgICAtLWhhc2g9c2hhMjU2OjE0MzRjYTc3ZDZmZWQ0ZWEzMTI5MDExMjJkYzhkYTZjNDM4OTczOGJmNTc4OGY0M2VmYjE5YTgzOGFjMDNlYWQgXAorICAgIC0taGFzaD1zaGEyNTY6MWMzMGJiMjNhNDFkZjk1MTA5ZGIxMzBhNmNjMWI5NzQ4NDQzMDBhZTJlNWQ2OGRkNDk0N2FhY2JhNTk4NWFhNSBcCisgICAgLS1oYXNoPXNoYTI1NjoyMGU3YTRmN2RlZDU5MDk3Yzg0MDU5ZDI4MjMwOTA3Y2Q5NzEzMGZhNzRmNGE4YmZkMWQ4ZTViYTE4YzgxNDkxIFwKKyAgICAtLWhhc2g9c2hhMjU2OjIxOTkxNjVhMWFmZmI2NjZhYTI0YWRmMGM5NzQzNjY4NmQwYTYxYmM1ZmMxMTNjMDM3NzAxZmI3YzdmY2ViOTYgXAorICAgIC0taGFzaD1zaGEyNTY6Mjk3ZWVmNTQyMTU2ZDZiMTUxNzRhMTIzMWMyNDkzZWE5ZWE1NGFmOGQwMTZiOGNhN2Q1ZDljYzY1Y2ZjYzQ0NCBcCisgICAgLS1oYXNoPXNoYTI1NjoyYWVmNTZlODU5MDFjMjM5N2JkNTU3YzViYTUxNGY4NGRlMWYwYWU1ZGQxMzJmNWQ1ZmVkMDQyODU4MTE1OTUxIFwKKyAgICAtLWhhc2g9c2hhMjU2OjMwOTQzYjk1MzBmZTM2MjBlM2IxOTVjMDMxMzAzOTZjZDBlZTNhMGQxMGE2NmMxYmVlNzE1ZDE4MTkwMDFlYWYgXAorICAgIC0taGFzaD1zaGEyNTY6M2IzNmEyYzZkNDkyMGJhODhmYTk4MDc1ZmRkNThmZjk0ZWJlYjhhY2MxMjE1YWUwN2QwMWE0MThhZjRjMDI1MyBcCisgICAgLS1oYXNoPXNoYTI1Njo0MjhkNjk5Yzg1NTNjMjdlOThmNGQyOWZkYzBmMGVkYzUwZTlhOGE3NTkwYmZkMjk0ZDJlZGIwZGE3YmUzNjI5IFwKKyAgICAtLWhhc2g9c2hhMjU2OjQzZTYzNmRjMmNlOWVjZTU4M2IzZTJjYTQxZGY1Yzk4M2Y0MzAyZWFiYzZkNWY5Y2QwNGYwNTYyZWU4ZWMxYWUgXAorICAgIC0taGFzaD1zaGEyNTY6NDUyY2E1YjRhZmVkMzBlNzI3NDQ0NWRkOWI0NDFhMzVlY2U2NTZlYzE2MDBiNzdmZmY4YzIxNmZkZjA3ZGY0MyBcCisgICAgLS1oYXNoPXNoYTI1Njo0NjdhN2QzMTU1NDg5MmVlZDJhYTZjMmQ0N2RlZDEwNzlmYzQwZWEwYjk2MDFkOWY3OTIwNGFmYTg5MDIyNzRiIFwKKyAgICAtLWhhc2g9c2hhMjU2OjRiNDRkN2UzOTk2NGU4MDhiMDcxNzE0NjY2YTgxMjA0OTc2NWIyNmIzZWE0OGM0NDM0YTNiMzE3YmFjODJmMTQgXAorICAgIC0taGFzaD1zaGEyNTY6NGM4NjM0M2NmOWZmN2IyNTE0ZGQyMjliZGQ4OGViYmE3NjBiZDg5NzNkYWMxOTJhZTY4N2ZmNzVlMzllYmZhYiBcCisgICAgLS1oYXNoPXNoYTI1Njo1MjA4YTU3ZWFlNDQ1YWU4NGEyMTlkZmQ4YjU2ZTA0MzEzNDQ1ZDE0Njg3MzExN2I1ZmE3NWYzMjQ1YmMxMzkwIFwKKyAgICAtLWhhc2g9c2hhMjU2OjVmZjIxZTAwMGZmMmY2NTg0MzBiZGU1Mjg4Y2IxYWM0NDBmZjE1YzBkN2QxOGI1ZmIyMjJmOTQxYjQ2Y2IwZDIgXAorICAgIC0taGFzaD1zaGEyNTY6Njc1OTk3MjIyZjJlMmYyMjkyOGZiYmE2NDA4MjRhZWJkNDM3OTExMTYwMzRmNjIwMDZlMTk3MzA3MTUxNjZjMCBcCisgICAgLS1oYXNoPXNoYTI1Njo2NzZlNGE0NGU3NDBkZWFiYTBmNGQ5NWJhMWQ4YzVjODlhMmZjYzQzZDAyYzM5ZjY5NDUwYjFmYTE5ZDM5NTkwIFwKKyAgICAtLWhhc2g9c2hhMjU2OjZlMzA2Yjk3OTY2MzY5Yjg4OTk4NWE1NjJlZGU5ZDk5MTgwZGVmMzlhZDQyYzgwMTQ2MjhkZDNjYzM0M2Y1MDggXAorICAgIC0taGFzaD1zaGEyNTY6NmZkOTU4NGJmMWJjY2RmZmYxNTEyNzE5MzE2ZWZhNzdiZTIzNTQ2OWUxZTMyOTVkY2U2NDUzOGM0NzczODQwYiBcCisgICAgLS1oYXNoPXNoYTI1Njo3MDVhNjhhOTczYzRjNzZkYjVkMzY5ZWQ1NzNmZWMzMzY3ZDdkMTk2NjczZmE4NjYxNGIzM2Q4YzhlOWViYjA4IFwKKyAgICAtLWhhc2g9c2hhMjU2Ojc0ZDdkOWZhOTc4MDljNWI4OTI0NDliMjhhNjVlYzJiZmE0NThhNDczNWRkYWQ0NjA3NGY5ZjdkOTU1MGFkMTMgXAorICAgIC0taGFzaD1zaGEyNTY6NzdjOGEzMTdmMGZkNWEwYTJiZThlZDVjYmU1MzQxNTM3ZDVjMDBiYjc5YjNiYjI3YmE3YzUzNzhiYTc3ZGJjYSBcCisgICAgLS1oYXNoPXNoYTI1Njo3OWEwNTA4ODllYjhkNTdhOTNlZDIxZDk1ODViYjYzZmNhODgxNjY2ZmM3MDlmNWQ5ZjdmOTM3MmY1ZTdmZDAzIFwKKyAgICAtLWhhc2g9c2hhMjU2OjdkYjE2ZGQ0ZWExYjA1YWRhNTA0ZjA4ZDBkY2ExY2Q5YjkyNmJlZDM3NzBmNTBlNzE1ZDA4N2M2ZjAwYWQ3NDggXAorICAgIC0taGFzaD1zaGEyNTY6ODNmMjI5MmFlMjkyZWQ1YTQ3Y2RjYjk4MjEwMzljYThlODg5MDI5MjMxOThmMjE5M2YxMzk1OTM2MGMwMTg2MCBcCisgICAgLS1oYXNoPXNoYTI1Njo4N2M5MjI0YWNiYTBhZDhiYWNkZGY0MjdhMWMyNzcyZTE3Y2U1MGIzMDQyYTc4OTU0N2FmMjcwOTljNWY3NTFkIFwKKyAgICAtLWhhc2g9c2hhMjU2OjhhOTdhNjgxZTgyYmMxMWE0MmQ0MzcyZmU1Nzg5OGQyNzBhMjcwN2YzNmM0NWM2Njc2ZTQ5Y2UwZDVjNDEzNTMgXAorICAgIC0taGFzaD1zaGEyNTY6OTA3MzUxM2VjMzgwNDM0ZWI4ZDIxOTcwZTFhYjMxNjEwNDFkZTEyMWY0MDE4YmJlZDMxNDY4Mzk0NTFhNmQ4ZSBcCisgICAgLS1oYXNoPXNoYTI1Njo5MGJkZDc2YjNmMDRiZGIyMWRlNTM5OGI4YTdjNjI5Njc2YzgxZGZhYzI5MGY1ZjE5ODgzODU3ZTkzNzFkMjhjIFwKKyAgICAtLWhhc2g9c2hhMjU2OjkxMjI5ZDcyMDNmMWVmMGFiNDIwYzliNTNmZTJjYTVjMWZiZWIzNGY2OWIzYmMxYjUwODk0NjYyMzdhNGExMzQgXAorICAgIC0taGFzaD1zaGEyNTY6OTJmODhjYTFiOTU2ZWI4NDI3YTExYmI4YjRhMGMwYjJiMDMzNzcyMzVmYzUxMDJjYjA1ZTUzM2I4NjkzYTQxNSBcCisgICAgLS1oYXNoPXNoYTI1Njo5NWFlM2U4ZTJjMWI5YmY2NzE4MTdmODZmMTU1YzVkYTdkNDlhMjI4OWM1Y2YyN2EzMTk0NThjM2UwMjVjMzIwIFwKKyAgICAtLWhhc2g9c2hhMjU2OjllMzBiZTg5YTc1ZWU2NmFlYzdmOWU2MDA4NmZhZGIzN2ZmOGMwYmE0OWEwMjI4ODdjMjhjMTM0MzQxZjcxNzkgXAorICAgIC0taGFzaD1zaGEyNTY6YTQ4ZWRkZTc4OGI5OTIxNDYxM2U0NDBmY2U0OTViYmUyYjFlMTQyYTdmMjE0Y2NlOWUwODMyMTQ2YzQxZTMyNCBcCisgICAgLS1oYXNoPXNoYTI1NjphNzE1MmZhNmU1OTdjMjBjYjk3OTIzNDA3Y2YwOTM0ZTE0MjI0YWY0MmMyYjhkOTE1ZjQ4YmMzYWQyZDlhYzE4IFwKKyAgICAtLWhhc2g9c2hhMjU2OmE5YzdiNzEyMTFmMDY2OTA4ZTUxOGEyZWY3YTVlMjExNjcwNzYxNjUxMDM5ZjBkNmE4MGQ4ZDQwMDU0MDQ3ZGYgXAorICAgIC0taGFzaD1zaGEyNTY6YjA1NzFhNWFlZjM2YmE5MTc3ZTI2MmRjODhhOTI0MGM4NjZkOTAzYTYyNzk5ZTQ0ZmQ0YWFlM2Y5YTJlYzE3ZSBcCisgICAgLS1oYXNoPXNoYTI1NjpiMGZiMmQ0ODAxNTQ2NTk4YWM1Y2QxOGUzZWM3OWMxYTlhZjhiOGYyYTg2MjgzYzU1YTUzMzdjNWFlY2E0YjFiIFwKKyAgICAtLWhhc2g9c2hhMjU2OmIxMDI0MTI1MGNiNzc2NTdhYjMxNTI3MGIwNjRhNmM3ZjFhZGQ1OGFmOTRiZWZhMjA2ODdlN2M4ZDg2MDNhZTYgXAorICAgIC0taGFzaD1zaGEyNTY6Yjg3ZWZlNGEzODA4ODc0MjViYjE1ZjIyMDA3OWFhODMzNjI3NjM5OGRjMzNmY2UzOGM2NGQyNzgxNjRmOTYzZCBcCisgICAgLS1oYXNoPXNoYTI1NjpiOThmNDNmY2RiMTYxNzJkZWM1ZjRiNDlmMmZlY2U0YjE2YTk5ZmQyODRkODFjNmJiYWMxYjNiNjlmY2JlMGZmIFwKKyAgICAtLWhhc2g9c2hhMjU2OmMxOTMxMDljYTQwNzBjZGNhYTZlZmYwMGZkYjVhNTYyMzNkYzc2MTAyMTZkNThmYjgxNjM4Zjg5ZjAyZTQ5NjggXAorICAgIC0taGFzaD1zaGEyNTY6YzgyNmY5MzA1MGM3M2U3NzY5ODA2ZjkyZTYwMWUwZWZkYjgzZWM4ZDdjNzZkZGY0NWQ1MTRmZWU1NGU4ZTYxOSBcCisgICAgLS1oYXNoPXNoYTI1NjpkMDIwY2ZhNTk1ZDFmOGY1YzZiMzQzNTMwY2QzY2ExNmFlNWFlZmRkMWU4MzJiNzc3ZjlmMGViMTA1ZjViMTM5IFwKKyAgICAtLWhhc2g9c2hhMjU2OmQ2YTQ3ODU4MWIxYTFhOGZkZjMzMThlY2I1ZjRkMGNkYTQxY2FjZGZmZTJiNTI3YzIzNzA3YzljMWI4ZmRiNTUgXAorICAgIC0taGFzaD1zaGEyNTY6ZGUyYWQ2OWM5YTA5NGJmMzdjMTEwMmI1NzQ0YzlhZWM2Y2Y3NGQyYjYzNTU1OGI3NzkwODVkMDI2MzE2NjQ1NCBcCisgICAgLS1oYXNoPXNoYTI1NjplMjc4ZWFmYjQwNmY3ZTFiMWI2MzdjMmNmNTFkM2FkNDU4ODNiYjViZDFjYTU2YmMwNWU0ZmMxMzVkZmRhYTY1IFwKKyAgICAtLWhhc2g9c2hhMjU2OmUzODFmZTBjMmFhNmMwM2IwNTZhZDhmNTJmOGVmY2E3YmUyOWZiNGQ5YWUyZjg4NzM1MjA4NDNiNjAzOTYxMmEgXAorICAgIC0taGFzaD1zaGEyNTY6ZTYxZTc2MDIwZTBjMzMyYTk4MjkwMzIzZWNmZWM3MjFjOTU0NGY1YjczOWZhYjkyNWI2ZThjYmUxOTQ0Y2YxOSBcCisgICAgLS1oYXNoPXNoYTI1NjpmODk3YzNiMTI3NTMyZTZiZWZkY2Y5NjFjNDE1Yzk3ZjMyMGQ0NTYxNGRhZjg0ZGViYTBhNTRlNjRlYTI0NTdiIFwKKyAgICAtLWhhc2g9c2hhMjU2OmZiNDY0NDc5OTM0Nzc4ZDdjYzViYWY0NjNkOTU5ZDM2MTk1NGQ2NTMzYWQzNGMzYTRmMWQyNjdlODZlZTI1ZmQKICAgICAjIHZpYQogICAgICMgICB0ZW5zb3Jib2FyZAotICAgICMgICB0ZW5zb3JmbG93LWNwdQotaDVweT09My44LjAgXAotICAgIC0taGFzaD1zaGEyNTY6MDM4OTBiMWMxMjNkMDI0ZmIwMjM5YTMyNzk3MzdkNTQzMjQ5OGMxOTAxYzM1NGY4YjEwZDgyMjFkMWQxNjIzNSBcCi0gICAgLS1oYXNoPXNoYTI1NjowZmVmNzZlMTBiOTIxNjY1N2ZhMzdlN2VkZmY2ZDhiZTA3MDliMjViZDUwNjY0NzRjMjI5YjU2Y2YwMDk4ZGY5IFwKLSAgICAtLWhhc2g9c2hhMjU2OjI2ZmZjMzQ0ZWM5OTg0ZDJjZDNjYTAyNjUwMDcyOTlhOGJhYzhkODVjMWFkNDhmNDYzOWQ4ZDNhZWQyYWYxNzEgXAotICAgIC0taGFzaD1zaGEyNTY6MjkwZTAwZmEyZGU3NGExMDY4OGQxYmFjOThkNWE5Y2RkNDNmMTRmNThlNTYyYzU4MGI1YjNkZmJkMzU4ZWNhZSBcCi0gICAgLS1oYXNoPXNoYTI1NjozM2IxNWFhZTc5ZTkxNDdhZWJlMWQwZTU0MDk5Y2JjZGU4ZDY1ZTNlMjI3Y2Q1YjU5ZTQ5YjEyNzJhYTBlMDlkIFwKLSAgICAtLWhhc2g9c2hhMjU2OjM2NzYxNjkzZWZiZTUzZGYxNzk2MjdhNzc1NDc2ZGNiYzM3NzI3ZDZlOTIwOTU4Mjc3YTdlZmJjMThmMWZiNzMgXAotICAgIC0taGFzaD1zaGEyNTY6Mzc3ODY1ODIxZmU4MGFkOTg0ZDAwMzcyM2Q2Zjg4OTBiZDU0Y2VlYjU5ODFiNDNjMDMxM2I5ZGY5NTQxMWIzMCBcCi0gICAgLS1oYXNoPXNoYTI1Njo0OWJjODU3NjM1ZjkzNWZhMzBlOTJlNjFhYzFlODc0OTZkZjhmMjYwYTY5NDVhMzIzNWU0M2E5ODkwNDI2ODY2IFwKLSAgICAtLWhhc2g9c2hhMjU2OjRhNTA2ZmMyMjNkZWY0MjhmNDMyOWU3ZTFmOWZlMWM4YzU5M2VhYjIyNmU3YzA5NDJjOGQ3NTMwOGFkNDk5NTAgXAotICAgIC0taGFzaD1zaGEyNTY6NTMzZDdkYWQ0NjZkZGI3ZTNiMzBhZjI3NGI2MzBlYjdjMWE2ZTRkZGYwMWQxYzM3M2EwMzM0ZGMyMTUyMTEwYSBcCi0gICAgLS1oYXNoPXNoYTI1Njo1ZmQyMjUyZDFmYzM2NGJhMGU5M2RkMGI3MDg5ZjQ5MDZiNjY4MDVjYjRlNmFjYTdmYTg4NzRhYzA4NjQ5NjQ3IFwKLSAgICAtLWhhc2g9c2hhMjU2OjZmZWFkODJmMGM0MDAwY2YzOGQ1M2Y5YzAzMDc4MGQ4MWJmYTAyMjAyMThhZWUxM2I5MGI3NzAxYzkzN2Q5NWYgXAotICAgIC0taGFzaD1zaGEyNTY6N2YzMzUwZmMwYTg0MDdkNjY4YjEzMjQ3ODYxYzJhY2QyM2Y3ZjVmZTdkMDYwYTNhZDliMDgyMGY1ZmNiY2FlMCBcCi0gICAgLS1oYXNoPXNoYTI1Njo4ZjU1ZDljNmM4NGQ3ZDA5Yzc5ZmI4NTk3OWU5N2I4MWVjNjA3MWNjNzc2YTk3ZWI2Yjk2ZjhmNmVjNzY3MzIzIFwKLSAgICAtLWhhc2g9c2hhMjU2Ojk4YTI0MGNkNGMxYmZkNTY4YWFhNTJlYzQyZDI2MzEzMWEyNTgyZGFiODJkNzRkM2Q0MmEwZDk1NGNhYzEyYmUgXAotICAgIC0taGFzaD1zaGEyNTY6OWY2ZjZmZmFkZDZiZmE5YjJjNWIzMzQ4MDVlYjRiMTljYTBhNTYyMDQzMzY1OWQ4ZjdmYjg2NjkyYzQwYTM1OSBcCi0gICAgLS1oYXNoPXNoYTI1NjpiNjg1NDUzZTUzOGIyYjU5MzRjNThhNjQ0YWMzZjNiM2QwY2VjMWEwMWI2ZmIyNmQ1NzM4OGU5ZjliNjc0YWQwIFwKLSAgICAtLWhhc2g9c2hhMjU2OmI3ODY1ZGUwNjc3OWIxNGQ5ODA2OGRhMzg3MzMzYWQ5YmYyNzU2YjViNTc5Y2M4ODdmYWMxNjliYzA4Zjg3YzMgXAotICAgIC0taGFzaD1zaGEyNTY6YmFjYWExYzE2ODEwZGQyYjNlNDQxN2Y4ZTczMDk3MWI3YzRkNTNkMjM0ZGU2MWZlNGE5MThkYjc4ZTgwZTFlNCBcCi0gICAgLS1oYXNoPXNoYTI1NjpiYWU3MzA1ODBhZTkyOGRlNDA5ZDYzY2JlNGZkY2E0YzgyYzNhZDJiZWQzMDUxMWQxOWQzNGU5OTVkNjNjNzdlIFwKLSAgICAtLWhhc2g9c2hhMjU2OmMzMzg5YjYzMjIyYjFjN2ExNThiYjdmZTY5ZDExY2EwMDA2Njc0MGVjNTU3NDU5NmQ0N2EyZmU1MzE3ZjU2M2EgXAotICAgIC0taGFzaD1zaGEyNTY6Yzg3M2JhOWZkNGZhODc1YWQ2MmNlMGU0ODkxNzI1ZTI1N2E4ZmU3ZjVhYmRiYzE3ZTUxYTVkNTQ4MTliZTU1YyBcCi0gICAgLS1oYXNoPXNoYTI1NjpkYjAzZTNmMmM3MTYyMDVmYmRhYmIzNGQwODQ4NDU5ODQwNTg1MjI1ZWI5N2I0ZjA4OTk4Yzc0MzgyMWNhMzIzIFwKLSAgICAtLWhhc2g9c2hhMjU2OmY0N2Y3NTdkMWI3NmYwZWNiOGFhMDUwOGVjOGQxYjM5MGRmNjdhOGI2N2VlMjUxNWRjMWIwNDZmM2ExNTk2ZWEgXAotICAgIC0taGFzaD1zaGEyNTY6Zjg5MWIxN2UzYTNlOTc0ZTkzZjllMzRlN2NjYTlmNTMwODA2NTQzNTcxY2UwNzg5OTg2NzZhNTU1ODM3ZDkxZAotICAgICMgdmlhIHRlbnNvcmZsb3ctY3B1Ci1pZG5hPT0zLjQgXAotICAgIC0taGFzaD1zaGEyNTY6ODE0ZjUyOGU4ZGVhZDdkMzI5ODMzYjkxYzVmYWE4N2Q2MGJmNzE4MjRjZDEyYTc1MzBiNTUyNjA2M2QwMmNiNCBcCi0gICAgLS1oYXNoPXNoYTI1Njo5MGI3N2U3OWVhYTNlYmE2ZGU4MTlhMGM0NDJjMGI0Y2VlZmMzNDFhN2EyYWI3N2Q3NTYyYmY0OWY0MjVjNWMyCi0gICAgIyB2aWEgcmVxdWVzdHMKLWpheD09MC40LjkgXAotICAgIC0taGFzaD1zaGEyNTY6MWVkMTM1Y2QwOGY0OGU0YmFmMTBmNmVhZmRiNGE0Y2RhZTc4MWY5MDUyYjU4MzhjMDljOTFhOWY0ZmE3NWYwOQotICAgICMgdmlhIHRlbnNvcmZsb3ctY3B1Ci1rZXJhcz09Mi4xMi4wIFwKLSAgICAtLWhhc2g9c2hhMjU2OjM1YzM5NTM0MDExZTkwOTY0NWZiOTM1MTU0NTJlOThlMWEwY2UyMzcyN2I1NWQ0OTE4YjljNThiMjMwOGMxNWUKLSAgICAjIHZpYSB0ZW5zb3JmbG93LWNwdQotbGliY2xhbmc9PTE2LjAuMCBcCi0gICAgLS1oYXNoPXNoYTI1NjoyYWRjZTQyYWU2NTJmMzEyMjQ1YjhmNGVkYTZmMzBiNDA3NmZiNjFmNzYxOWYyZGZkMGEwYzMxZGVlNGMzMmI5IFwKLSAgICAtLWhhc2g9c2hhMjU2OjY1MjU4YTZiYjNlN2RjMzFkYzliMjZmOGQ0MmY1M2M5ZDNiOTU5NjQzYWRlMjkxZmNkMWFlZjQ4NTUzMDNjYTYgXAotICAgIC0taGFzaD1zaGEyNTY6N2I2Njg2YjY3YTBkYWE4NGI0YzYxNGJjYzExOTU3ODMyOWZjNGZiYjUyYjkxOTU2NWI3Mzc2YjUwN2M0NzkzYiBcCi0gICAgLS1oYXNoPXNoYTI1NjphMDQzMTM4Y2FhZjJjYjA3NmViYjA2MGM2MjgxZWM5NTYxMjkyNjY0NWQ0MjVjNjkxOTkxZmM5ZGYwMGU4YTI0IFwKLSAgICAtLWhhc2g9c2hhMjU2OmFmNTVhNGFhODZmZGZlNmIyZWM2OGJjOGNmZTVmZGFjNmM0NDhkNTkxY2E3NjQ4YmU4NmNhMTcwOTliNDFjYTggXAotICAgIC0taGFzaD1zaGEyNTY6YmY0NjI4ZmM0ZGE3YTFkZDA2YTI0NGY5YjhlMTIxYzVlYzY4MDc2YTc2M2M1OWQ2YjEzY2JiMTAzYWNjOTM1YiBcCi0gICAgLS1oYXNoPXNoYTI1NjplYjU5NjUyY2IwNTU5YzBlNzE3ODRmZjRjOGJhMjRjMTQ2NDRiZWNjOTA3YjE0NDY1NjNlY2ZhYTYyMmQ1MjNiIFwKLSAgICAtLWhhc2g9c2hhMjU2OmVlMjBiZjkzZTNkZDMzMGY3MWZjNTBjZGJmMTNiOTJjZWQwYWVjOGU1NDBiZTY0MjUxZGI1MzUwMmE5YjMzZjcKLSAgICAjIHZpYSB0ZW5zb3JmbG93LWNwdQotbWFrbz09MS4yLjQgXAotICAgIC0taGFzaD1zaGEyNTY6Yzk3Yzc5YzAxOGI5MTY1YWM5OTIyYWU0ZjMyZGEwOTVmZmQzYzRlNjg3MmI0NWVkZWQ0MjkyNmRlZWE0NjgxOCBcCi0gICAgLS1oYXNoPXNoYTI1NjpkNjBhMzkwM2RjM2JiMDFhMThhZDZhODljZGJlMmU0ZWFkYzY5YzBiYzhlZjFlMzc3M2JhNTNkNDRjM2Y3YTM0CisgICAgIyAgIHRlbnNvcmZsb3cKK2g1cHk9PTMuMTAuMCBcCisgICAgLS1oYXNoPXNoYTI1NjowMTJhYjQ0ODU5MGUzYzRmNWE4ZGQwZjM1MzMyNTViYzU3ZjgwNjI5YmY3YzUwNTRjZjRjODdiMzAwODUwNjNjIFwKKyAgICAtLWhhc2g9c2hhMjU2OjIxMmJiOTk3YTkxZTZhODk1Y2U1ZTJmMzY1YmE3NjRkZWJlYWVmNWQyZGNhNWM2ZmI3MDk4ZDY2NjA3YWRmOTkgXAorICAgIC0taGFzaD1zaGEyNTY6MjM4MWU5OGFmMDgxYjZkZjdmNmRiMzAwY2Q4OGY4OGU3NDA2NDlkNzc3MzZlNGI1M2RiNTIyZDg4NzRiZjJkYyBcCisgICAgLS1oYXNoPXNoYTI1NjoyYzhlNGZkYTE5ZWI3NjllOWE2Nzg1OTJlNjdlYWVjM2EyZjA2OWY3NTcwYzgyZDJkYTkwOWMwNzdhYTk0MzM5IFwKKyAgICAtLWhhc2g9c2hhMjU2OjMwNzRlYzQ1ZDNkYzZlMTc4YzZmOTY4MzRjZjgxMDhiZjRhNjBjY2I1YWIwNDRlMTY5MDk1ODAzNTIwMTBhOTcgXAorICAgIC0taGFzaD1zaGEyNTY6M2M5N2QwM2Y4N2YyMTVlNzc1OWEzNTQ0NjBmYjRiMGQwZjI3MDAxNDUwYjE4YjIzZTU1NmU3ODU2YTBiMjFjMyBcCisgICAgLS1oYXNoPXNoYTI1Njo0M2E2MWIyYzJhZDY1YjFmYWJjMjg4MDJkMTMzZWVkMzRkZWJjYzJjOGI0MjBjYjIxM2QzZDRlZjRkM2UyMjI5IFwKKyAgICAtLWhhc2g9c2hhMjU2OjQ5MjMwNWEwNzQzMjdlOGQyNTEzMDExZmE5ZmZmZWI1NGVjYjI4YTA0Y2E0YzQyMjdkN2UxZTk2MTZkMzU2NDEgXAorICAgIC0taGFzaD1zaGEyNTY6NWRmYzY1YWMyMWZhMmY2MzAzMjNjOTI0NTNjYWRiZThkNGY1MDQ3MjZlYzQyZjZhNTZjZjgwYzJmOTBkNmM1MiBcCisgICAgLS1oYXNoPXNoYTI1Njo2NjdmZTIzYWIzM2Q1YThhNmI3Nzk3MGIyMjllMTRhZTNiYjg0ZTRlYTMzODJjYzA4NTY3YTAyZTE0OTllZWRkIFwKKyAgICAtLWhhc2g9c2hhMjU2OjZjMDEzZDJlNzljMDBmMjhmZmQwY2MyNGU2ODY2NWVhMDNhZTkwNjllMTY3MDg3YjJhZGI1NzI3ZDI3MzZhNTIgXAorICAgIC0taGFzaD1zaGEyNTY6NzgxYTI0MjYzYzEyNzBhNjJjZDY3YmU1OWYyOTNlNjJiNzZhY2ZjYzIwN2FmYTYzODQ5NjE3NjJiYjg4ZWEwMyBcCisgICAgLS1oYXNoPXNoYTI1Njo4NmRmNGMyZGU2ODI1N2I4NTM5YTE4NjQ2Y2VjY2RjZjJjMWNlNmIxNzY4YWRhMTZjOGRjZmI0ODllYWZhZTIwIFwKKyAgICAtLWhhc2g9c2hhMjU2OjkwMjg2Yjc5YWJkMDg1ZTRlNjVlMDdjMWJkN2VlNjVhMGYxNTgxOGVhMTA3ZjQ0YjE3NWQyZGZlMWE0Njc0YjcgXAorICAgIC0taGFzaD1zaGEyNTY6OTIyNzNjZTY5YWU0OTgzZGFkYjg5OGZkNGQzYmVhNWViOTA4MjBkZjk1M2I0MDEyODJlZTY5YWQ2NDhkZjY4NCBcCisgICAgLS1oYXNoPXNoYTI1Njo5M2RkODQwYmQ2NzU3ODdmYzBiMDE2ZjdhMDVmYzZlZmUzNzMxMmEwODg0OWQ5ZGQ0MDUzZmQwMzc3YjEzNTdmIFwKKyAgICAtLWhhc2g9c2hhMjU2Ojk0NTA0NjRiNDU4Y2NhMmM4NjI1MmI2MjQyNzkxMTVkY2FhNzI2MGE0MGQzY2IxNTk0YmYyYjQxMGEyYmQxYTMgXAorICAgIC0taGFzaD1zaGEyNTY6YWUyZjAyMDFjOTUwMDU5Njc2NDU1ZGFmOTI3MDBlZWI1N2RjZjVjYWFmNzFiOWUxMzI4ZTZlNjU5MzYwMTc3MCBcCisgICAgLS1oYXNoPXNoYTI1NjphZWNlMGUyZTFlZDJhYWIwNzZjNDE4MDJlNTBhMGMzZTVlZjg4MTZkNjBlY2UzOTEwN2Q2ODcxN2Q0NTU5ODI0IFwKKyAgICAtLWhhc2g9c2hhMjU2OmI5NjNmYjc3Mjk2NGZjMWQxNTYzYzU3ZTRlMmU4NzQwMjJjZTExZjc1ZGRjNmRmMWE2MjZmNDJiZDQ5YWI5OWYgXAorICAgIC0taGFzaD1zaGEyNTY6YmE5YWIzNmJlOTkxMTE5YTNmZjMyZDBjN2NiZTVmYWY5YjhkMjM3NWI1Mjc4YjJhZWE2NGVmZmJlYmE2NjAzOSBcCisgICAgLS1oYXNoPXNoYTI1NjpkNDY4MmI5NGZkMzZhYjIxNzM1MmJlNDM4YWJkNDRjOGYzNTdjNTQ0OWI4OTk1ZTYzODg2YjQzMWQyNjBmM2QzIFwKKyAgICAtLWhhc2g9c2hhMjU2OmQ5M2FkYzQ4Y2VlYjMzMzQ3ZWIyNGE2MzRmYjc4N2VmYzdhZTQ2NDRlNmVhNGJhNzMzZDA5OTYwNTA0NWMwNDkgXAorICAgIC0taGFzaD1zaGEyNTY6ZjQyZTZjMzA2OThiNTIwZjAyOTVkNzAxNTdjNGUyMDJhOWU0MDI0MDZmNTBkYzA4ZjVhN2JjNDE2YjI0ZTUyZCBcCisgICAgLS1oYXNoPXNoYTI1NjpmZDZmNmQxMzg0YTlmNDkxNzMyY2VlMjMzYjk5Y2Q0YmZkNmU4MzhhODgxNWNjODY3MjJmOWQyZWU2NDAzMmFmCisgICAgIyB2aWEgdGVuc29yZmxvdworaGV4ZHVtcD09My4zIFwKKyAgICAtLWhhc2g9c2hhMjU2OmQ3ODFhNDNiMGMxNmFjZTNmOTM2NmFhZGU3M2U4YWQzYTdiZDUxMzdkNThmMGI0NWFiMmQzZjU0ODc2ZjIwZGIKICAgICAjIHZpYSAtciB0aGlyZF9wYXJ0eS9weXRob25fcmVxdWlyZW1lbnRzLmluCi1tYXJrZG93bj09My40LjMgXAotICAgIC0taGFzaD1zaGEyNTY6MDY1ZmQ0ZGYyMmRhNzNhNjI1ZjE0ODkwZGQ3N2ViODA0MGVkY2JkNjg3OTRiY2QzNTk0M2JlMTQ0OTA2MDhiMiBcCi0gICAgLS1oYXNoPXNoYTI1Njo4YmYxMDExOThlMDA0ZGM5M2U4NGExMmE3Mzk1ZTMxYWFjNmE5Yzk5NDI4NDhhZTFkOTliOWQ3MmNmOWIzNTIwCitpZG5hPT0zLjYgXAorICAgIC0taGFzaD1zaGEyNTY6OWVjZGJiZDA4M2IwNjc5OGFlMWU4NmFkY2JmZThhYjE0NzljZjg2NGU0ZWUzMGZlNGU0NmEwMDNkMTI0OTFjYSBcCisgICAgLS1oYXNoPXNoYTI1NjpjMDU1NjdlOWMyNGE2YjlmYWFhODM1YzQ4MjFiYWQwNTkwZmJiOWQ1Nzc5ZTdjYWE2ZTFjYzQ5NzhlN2ViMjRmCisgICAgIyB2aWEgcmVxdWVzdHMKK2ltcG9ydGxpYi1tZXRhZGF0YT09Ny4wLjEgXAorICAgIC0taGFzaD1zaGEyNTY6NDgwNTkxMWMzYTRlYzdjMzk2NjQxMDA1M2U5ZWM2YTFmZWNkNjI5MTE3ZGY1YWRlZTU2ZGZjOTQzMmExMDgxZSBcCisgICAgLS1oYXNoPXNoYTI1NjpmMjM4NzM2YmIwNjU5MGFlNTJhYzFmYWIwNmEzYTllZjFkOGRjZTJiN2EzNWI1YWIzMjkzNzFkNmM4ZjVkMmNjCisgICAgIyB2aWEKKyAgICAjICAga2V5cmluZworICAgICMgICB0d2luZQorICAgICMgICB5YXBmCitqYXJhY28tY2xhc3Nlcz09My4zLjAgXAorICAgIC0taGFzaD1zaGEyNTY6MTBhZmE5MmI2NzQzZjI1YzBjZjVmMzdjNmJiNmUxOGUyYzViYjg0YTE2NTI3Y2NmYzAwNDBlYTM3N2U3YWFlYiBcCisgICAgLS1oYXNoPXNoYTI1NjpjMDYzZGQwOGU4OTIxN2NlZTAyYzhkNWU1ZWM1NjBmMmM4Y2U2Y2RjMmZjZGMyZTY4ZjdiMmU1NTQ3ZWQzNjIxCisgICAgIyB2aWEga2V5cmluZworamVlcG5leT09MC44LjAgXAorICAgIC0taGFzaD1zaGEyNTY6NWVmZTQ4ZDI1NTk3MzkwMmY2YmFkYzNjZTU1ZTJhYTZjNWMzYjNiYzY0MjA1OWVmM2E5MTI0N2JjZmNjNTgwNiBcCisgICAgLS1oYXNoPXNoYTI1NjpjMGE0NTRhZDAxNmNhNTc1MDYwODAyZWU0ZDU5MGRkOTEyZTM1YzEyMmZhMDRlNzAzMDZkZTNkMDc2Y2NlNzU1CisgICAgIyB2aWEKKyAgICAjICAga2V5cmluZworICAgICMgICBzZWNyZXRzdG9yYWdlCitrZXJhcz09Mi4xNS4wIFwKKyAgICAtLWhhc2g9c2hhMjU2OjJkY2M2ZDJlMzBjZjljOTUxMDY0YjYzYzFmNGM0MDRiOTY2YzU5Y2FmMDllMDFmMzU0OTEzOGVjOGVlMGRkMWYgXAorICAgIC0taGFzaD1zaGEyNTY6ODE4NzFkMjk4YzA2NGRjNGFjNmI1ODQ0MGZkYWU2N2JmY2Y0N2M4ZDdhZDI4NTgwZmFiNDAxODM0YzA2YTU3NQorICAgICMgdmlhIHRlbnNvcmZsb3cKK2tleXJpbmc9PTI0LjMuMCBcCisgICAgLS1oYXNoPXNoYTI1Njo0NDQ2ZDM1ZDYzNmU2YTEwYjhiY2U3Y2FhNjY5MTNkZDllY2E1ZmQyMjJjYTAzYTNkNDJjMzg2MDhhYzMwODM2IFwKKyAgICAtLWhhc2g9c2hhMjU2OmU3MzBlY2ZmZDMwOTY1OGEwOGVlODI1MzVhM2I1ZWM0YjRjODY2OWE5YmUxMWVmYjY2MjQ5ZDhlMGFlYjlhMjUKKyAgICAjIHZpYSB0d2luZQorbGliY2xhbmc9PTE2LjAuNiBcCisgICAgLS1oYXNoPXNoYTI1NjoxZTk0MDA0OGY1MWQwYjA5OTkwOTlhOWI3ODYyOWFiOGE2NGI2MmFmNWU5ZmYxYjJiMDYyNDM5YzIxZWUyNDRkIFwKKyAgICAtLWhhc2g9c2hhMjU2OjRhOWFjYmZkOWMxMzVhNzJmODBkNWRiZmY3NTg4ZGZiMGM4MTQ1ODI0NGE4OWI5ZTgzNTI2ZTg1OTU4ODBlMGEgXAorICAgIC0taGFzaD1zaGEyNTY6NGFjZGRlMzlkZmU0MTBjODc3YjRjY2MwZDRiNTdlYjk1MjEwMGU0ZWUyNmJiZGY2Y2ZkYjg4ZTIwMzNhN2QzMSBcCisgICAgLS1oYXNoPXNoYTI1Njo4MTMwNDgyMTIwNTAwNDc2YTAyNzE3MWY4ZjNjOGRmYzI1MzZiNTkxNzE2ZWVhNzFmYzVkYTIyY2FlMTMxMzFiIFwKKyAgICAtLWhhc2g9c2hhMjU2Ojg4YmM3ZTdiMzkzYzMyZTQxZTAzYmE3N2VmMDJmZGQ2NDdkYTFmNzY0YzJjZDAyOGU2OWUwODM3MDgwYjc5ZjYgXAorICAgIC0taGFzaD1zaGEyNTY6OWRjZGM3MzA5Mzk3ODhiOGI2OWZmZDZkNWQ3NWZlNTM2NmUzZWUwMDdmMWUzNmE5OTc5OWVjMGIwYzAwMTQ5MiBcCisgICAgLS1oYXNoPXNoYTI1NjpkODBlZDU4Mjc3MzZlZDVlYzJiY2VkZjUzNjcyMDQ3NmZkOWQ0ZmE0Yzc5ZWYwY2IyNGFlYTRjNTkzMzJmMzYxIFwKKyAgICAtLWhhc2g9c2hhMjU2OmRhOWU0N2ViYzNmMGE2ZDkwZmIxNjllZjI1ZjlmYmNkMjliNGE0ZWY5N2E4YjBlM2UzYTE3ODAwYWYxNDIzZjQgXAorICAgIC0taGFzaD1zaGEyNTY6ZGFhYjRhMTFkYWUyMjhmMWVmYTllZmEzZmU2MzhiNDkzYjE0ZDhkNTJjNzFmYjNjNzAxOWUyZjFkZjQ1MTRjMiBcCisgICAgLS1oYXNoPXNoYTI1NjplMWE1YWQxZTg5NWU1NDQzZTIwNTU2OGM4NWMwNGI0NjA4ZTRlOTczZGFlNDJmNGRmZDljYjQ2YzgxZDE0ODZiIFwKKyAgICAtLWhhc2g9c2hhMjU2OmYwNGUzMDYwYWUxZjIwN2YyMzRkMDYwODkwMGM5OWM1MGVkY2I3NDNlNWUxODI3NmQ3OGRhMmRkZDcyN2QzOWYKKyAgICAjIHZpYSB0ZW5zb3JmbG93CittYWtvPT0xLjMuMCBcCisgICAgLS1oYXNoPXNoYTI1Njo1N2Q0ZTk5NzM0OWYxYTkyMDM1YWEyNWMxN2FjZTM3MWE0MjEzZjJjYTQyZjk5YmVlOWE2MDI1MDBjZmQ1NGQ5IFwKKyAgICAtLWhhc2g9c2hhMjU2OmUzYTlkMzg4ZmQwMGU4NzA0M2VkYmU4NzkyZjQ1ODgwYWMwMTE0ZTljNGFkYzY5ZjZlOWJmYjJjNTVlM2IxMWIKKyAgICAjIHZpYSAtciB0aGlyZF9wYXJ0eS9weXRob25fcmVxdWlyZW1lbnRzLmluCittYXJrZG93bj09My41LjIgXAorICAgIC0taGFzaD1zaGEyNTY6ZDQzMzIzODY1ZDg5ZmMwY2I5YjIwYzc1ZmM4YWQzMTNhZjMwN2NjMDg3ZTg0YjY1N2Q5ZWVjNzY4ZWRkZWFkZCBcCisgICAgLS1oYXNoPXNoYTI1NjplMWFjN2IzZGM1NTBlZTgwZTYwMmU3MWMxZDE2ODAwMmYwNjJlNDlmMWIxMWUyNmEzNjI2NGRhZmQ0ZGYyZWY4CiAgICAgIyB2aWEgdGVuc29yYm9hcmQKLW1hcmt1cHNhZmU9PTIuMS4yIFwKLSAgICAtLWhhc2g9c2hhMjU2OjA1NzZmZTk3NGI0MGE0MDA0NDk3Njg5NDFkNWQwODU4Y2M2MjRlMzI0OWRmZDFlMGMzMzY3NGU1YzdjYTdhZWQgXAotICAgIC0taGFzaD1zaGEyNTY6MDg1ZmQzMjAxZTdiMTI4MDlmOWU2ZTliYzFlNWM5NmEzNjhjODUyM2ZhZDVhZmIwMmFmZTNjMDUxYWU0YWZjYyBcCi0gICAgLS1oYXNoPXNoYTI1NjowOTAzNzZkODEyZmI2YWM1ZjE3MWU1OTM4ZTgyZTdmMmQ3YWRjMmI2MjkxMDFjZWMwZGI4YjI2NzgxNWM4NWUyIFwKLSAgICAtLWhhc2g9c2hhMjU2OjBiNDYyMTA0YmEyNWYxYWMwMDZmZGFiOGI2YTAxZWJiZmJjZTllZDM3ZmQzN2ZkNGFjZDcwYzY3Yzk3M2U0NjAgXAotICAgIC0taGFzaD1zaGEyNTY6MTM3Njc4YzYzYzk3Nzc1NGFiZTkwODZhM2VjMDExZThmZDk4NWFiOTA2MzExNDVkZmI5Mjk0YWQwOWMxMDJhNyBcCi0gICAgLS1oYXNoPXNoYTI1NjoxYmVhMzBlOWJmMzMxZjNmZWY2N2UwYTM4NzdiMjI4ODU5M2M5OGEyMWNjYjJjZjI5Yjc0YzU4MWE0ZWIzYWYwIFwKLSAgICAtLWhhc2g9c2hhMjU2OjIyMTUyZDAwYmY0YTljN2M4Mzk2MDUyMWZjNTU4ZjU1YTFhZGJjMDYzMWZiYjAwYTk0NzFlMDk3YjE5ZDcyZTEgXAotICAgIC0taGFzaD1zaGEyNTY6MjI3MzFkNzllZDJlYjI1MDU5YWUzZGYxZGZjOWNiMTU0NjY5MWNjNDFmNGUzMTMwZmU2YmZiYzNlY2JiZWNmYSBcCi0gICAgLS1oYXNoPXNoYTI1NjoyMjk4Yzg1OWNmYzU0NjNmMWI2NGJkNTVjYjNlNjAyNTI4ZGI2ZmEwZjNjZmQ1NjhkMzYwNWM1MDY3OGY4ZjAzIFwKLSAgICAtLWhhc2g9c2hhMjU2OjI4MDU3ZTk4NWRhY2UyZjQ3OGUwNDJlYWExNTYwNmM3ZWZjY2I3MDA3OTc2NjA2MjlkYTM4N2ViMjg5YjkzMjMgXAotICAgIC0taGFzaD1zaGEyNTY6MmU3ODIxYmZmZTAwYWE2YmQwN2EyMzkxM2I3ZjRlMDEzMjhjM2Q1Y2MwYjQwYjM2YzBiZDgxZDM2MmZhZWI2NSBcCi0gICAgLS1oYXNoPXNoYTI1NjoyZWM0ZjJkNDhhZTU5YmJiOWQxZjlkN2VmYjkyMzZhYjgxNDI5YTc2NGRlZGNhMTE0ZjVmZGFiYmMzNzg4MDEzIFwKLSAgICAtLWhhc2g9c2hhMjU2OjM0MGJlYTE3NGU5NzYxMzA4NzAzYWU5ODhlOTgyMDA1YWVkZjQyN2RlODE2ZDFhZmU5ODE0NzY2OGNjMDMwMzYgXAotICAgIC0taGFzaD1zaGEyNTY6NDA2MjdkY2YwNDdkYWRiMjJjZDI1ZWE3ZWNmZTljYmYzYmJiYWQwNDgyZWU1OTIwYjU4MmYzODA5Yzk3NjU0ZiBcCi0gICAgLS1oYXNoPXNoYTI1Njo0MGRmZDNmZWZiZWY1NzllZTA1OGYxMzk3MzNhYzMzNjMxMjY2M2M2NzA2ZDExNjNiODJiMzAwM2ZiMTkyNWM0IFwKLSAgICAtLWhhc2g9c2hhMjU2OjRjZjA2Y2RjMWRkYTk1MjIzZTlkMmQzYzU4ZDNiMTc4YWE1ZGFjYjM1ZWU3ZTNiYmFjMTBlNGUxZmFhY2I0MTkgXAotICAgIC0taGFzaD1zaGEyNTY6NTBjNDI4MzBhNjMzZmEwY2Y5ZTdkMjc2NjQ2Mzc1MzI3OTFiZmMzMWM3MzFhODdiMjAyZDJkOGFjNDBjM2VhMiBcCi0gICAgLS1oYXNoPXNoYTI1Njo1NWY0NGI0NDBkNDkxMDI4YWRkYjNiODhmNzIyMDdkNzFlZWViZmI3YjVkYmYwNjQzZjdjMDIzYWUxZmJhNjE5IFwKLSAgICAtLWhhc2g9c2hhMjU2OjYwOGU3MDczZGZhOWUzOGE4NWQzODQ3NGMwODJkNDI4MWY0Y2UyNzZhYzAwMTAyMjRlYWJhMTFlOTI5ZGQ1M2EgXAotICAgIC0taGFzaD1zaGEyNTY6NjNiYTA2Yzk5NDFlNDZmYTM4OWQzODk2NDRlMmQ4MjI1ZTBlM2U1ZWJjYzRmZjFlYTg1MDZkY2U2NDZmOGM4YSBcCi0gICAgLS1oYXNoPXNoYTI1Njo2NTYwOGMzNWJmYjhhNzY3NjNmMzcwMzY1NDdmN2FkZmQwOTI3MGZiZGJmOTY2MDhiZTJiZWFkMzE5NzI4ZmNkIFwKLSAgICAtLWhhc2g9c2hhMjU2OjY2NWEzNmFlNmY4ZjIwYTQ2NzZiNTMyMjRlMzNkNDU2YTZmNWE3MjY1N2Q5YzgzYzJhYTAwNzY1MDcyZjMxZjcgXAotICAgIC0taGFzaD1zaGEyNTY6NmQ2NjA3Zjk4ZmNmMTdlNTM0MTYyZjA3MDlhYWFkM2FiN2E5NjAzMjcyM2Q4YWM4NzUwZmZlMTdhZTVhMDY2NiBcCi0gICAgLS1oYXNoPXNoYTI1Njo3MzEzY2U2YTE5OTY1MWM0ZWQ5ZDdlNGNmYjRhYTU2ZmU5MjNiMWFkZjlhZjNiNDIwZWUxNGU2ZDlhNzNkZjY1IFwKLSAgICAtLWhhc2g9c2hhMjU2Ojc2NjhiNTJlMTAyZDBlZDg3Y2IwODIzODBhN2UyZTFlNzg3MzdkZGVjZGRlMTI5YWNhZGIwZWNjYzU0MjM4NTkgXAotICAgIC0taGFzaD1zaGEyNTY6N2RmNzA5MDdlMDBjOTcwYzYwYjllZjI5MzhkODk0YTkzODFmMzhlNmI5ZGI3M2M1YmUzNWU1OWQ5MmUwNjYyNSBcCi0gICAgLS1oYXNoPXNoYTI1Njo3ZTAwNzEzMmFmNzhlYTlkZjI5NDk1ZGJmN2I1ODI0Y2I3MTY0OGQ3MTMzY2Y3ODQ4YTJhNWRkMDBkMzZmOWZmIFwKLSAgICAtLWhhc2g9c2hhMjU2OjgzNWZiNWUzOGZkODkzMjhlOWM4MTA2N2ZkNjQyYjM1OTNjMzNlMWUxN2UyZmRiZjc3ZjU2NzZhYmIxNGExNTYgXAotICAgIC0taGFzaD1zaGEyNTY6OGJjYTdlMjZjMWRkNzUxMjM2Y2ZiMGM2YzcyZDRhZDYxZDk4NmU5YTQxYmJmNzZjYjQ0NWY2OTQ4OGIyYTJiZCBcCi0gICAgLS1oYXNoPXNoYTI1Njo4ZGIwMzJiZjBjZTkwMjJhOGU0MWEyMjU5OGVlZmM4MDIzMTRlODFiODc5YWUwOTNmMzZjZTlkZGYzOWFiMWJhIFwKLSAgICAtLWhhc2g9c2hhMjU2Ojk5NjI1YTkyZGE4MjI5ZGY2ZDQ0MzM1ZTZmY2M1NThhNTAzN2RkMGE3NjBlMTFkODRiZTIyNjBlNmYzNzAwMmYgXAotICAgIC0taGFzaD1zaGEyNTY6OWNhZDk3YWIyOWRmYzNmMDI0OWI0ODM0MTJjODVjOGVmNDc2NmQ5NmNkZjlkY2Y1YTFlM2NhYTNmMzY2MWNmMSBcCi0gICAgLS1oYXNoPXNoYTI1NjphNGFiYWVjNmNhM2FkODY2MDY5MDIzNmQxMWJmZTI4ZGZkNzA3Nzc4ZTI0NDJiNDVhZGRkMmYwODZkNmVmMDk0IFwKLSAgICAtLWhhc2g9c2hhMjU2OmE2ZTQwYWZhN2Y0NTkzOWNhMzU2ZjM0OGM4ZTIzMDQ4ZTAyY2IxMDljZWQxZWI4NDIwOTYxYjJmNDBmYjM3M2EgXAotICAgIC0taGFzaD1zaGEyNTY6YTZmMmZjY2E3NDZlOGQ1OTEwZTE4NzgyZjk3NjQ4OTkzOWQ1NGE5MWY5NDExYzMyMDUxYjRhYWIyYmQ3YzUxMyBcCi0gICAgLS1oYXNoPXNoYTI1NjphODA2ZGIwMjc4NTI1MzhkMmFkNzU1NWIyMDMzMDAxNzNkZDFiNzdiYTExNmRlOTJkYTlhZmJjM2EzYmUzZWVkIFwKLSAgICAtLWhhc2g9c2hhMjU2OmFiY2FiYzhjMmIyNjAzNmQ2MmQ0Yzc0NjM4MWE2ZjdjZjYwYWFmY2M2NTMxOThhZDY3ODMwNjk4NmIwOTQ1MGQgXAotICAgIC0taGFzaD1zaGEyNTY6Yjg1MjZjNmQ0Mzc4NTU0NDJjZGQzZDg3ZWVkZTljNDI1YzQ0NDVlYTAxMWNhMzhkOTM3ZGIyOTkzODJlNmZhMyBcCi0gICAgLS1oYXNoPXNoYTI1NjpiYjA2ZmViNzYyYmFkZTZiZjNjOGI4NDQ0NjIyNzRkYjBjNzZhY2M5NWM1MmFiZThkYmVkMjhhZTNkNDRhMTQ3IFwKLSAgICAtLWhhc2g9c2hhMjU2OmMwYTMzYmM5ZjAyYzJiMTdjM2VhMzgyZjkxYjRkYjBlNmNkZTkwYjYzYjI5NjQyMmE5Mzk4ODZhN2E4MGRlMWMgXAotICAgIC0taGFzaD1zaGEyNTY6YzRhNTQ5ODkwYTQ1ZjU3ZjFlYmY5OWMwNjdhNGFkMGNiNDIzYTA1NTQ0YWNjYWYyYjA2NTI0NjgyN2VkOTYwMyBcCi0gICAgLS1oYXNoPXNoYTI1NjpjYTI0NGZhNzNmNTBhODAwY2Y4YzNlYmY3ZmQ5MzE0OWVjMzdmNWNiOTU5NmFhODg3M2FlMmMxZDIzNDk4NjAxIFwKLSAgICAtLWhhc2g9c2hhMjU2OmNmODc3YWI0ZWQ2ZTMwMmVjMWQwNDk1MmNhMzU4YjM4MWE4ODJmYmQ5ZDFiMDdjY2NiZmQ2MTc4MzU2MWY5OGEgXAotICAgIC0taGFzaD1zaGEyNTY6ZDlkOTcxZWMxZTc5OTA2MDQ2YWEzY2EyNjZkZTc5ZWFjNDJmMWRiZjM2MTJhMDVkYzkzNjgxMjU5NTJiZDFhMSBcCi0gICAgLS1oYXNoPXNoYTI1NjpkYTI1MzAzZDkxNTI2YWFjMzY3MmVlNmQ0OWEyZjNkYjJkOTUwMmE0YTYwYjU1NTE5ZmViMWE0Yzc3MTRlMDdkIFwKLSAgICAtLWhhc2g9c2hhMjU2OmU1NWU0MGZmMGNjOGNjNWMwNzk5NjkxNWFkMzY3ZmE0N2RhNmIzZmMwOTFmZGFkY2E3ZjU0MDMyMzljNWZlYzMgXAotICAgIC0taGFzaD1zaGEyNTY6ZjAzYTUzMmQ3ZGVlMWJlZDIwYmM0ODg0MTk0YTE2MTYwYTJkZTlmZmM2MzU0YjM4NzhlYzk2ODJiYjYyM2M1NCBcCi0gICAgLS1oYXNoPXNoYTI1NjpmMWNkMDk4NDM0ZTgzZTY1NmFiZjE5OGYxMDNhODIwN2E4MTg3YzBmYzExMDMwNjY5MWEyZTk0YTc4ZDBhYmIyIFwKLSAgICAtLWhhc2g9c2hhMjU2OmYyYmZiNTYzZDAyMTFjZTE2YjYzYzdjYjkzOTVkMmM2ODJhMjMxODdmNTRjM2Q3OWJmZWMzM2U2NzA1NDczYzYgXAotICAgIC0taGFzaD1zaGEyNTY6ZjhmZmI3MDVmZmNmNWRkZDBlODBiNjVkZGY3YmVkN2VlNGY1YTQ0MWVhN2QzNDE5ZTg2MWExMmVhZjQxYWY1OAorbWFya2Rvd24taXQtcHk9PTMuMC4wIFwKKyAgICAtLWhhc2g9c2hhMjU2OjM1NTIxNjg0NWM2MGJkOTYyMzJjZDhkOGM0MGU4Zjk3NjVjYzg2ZjQ2ODgwZTQzYThmZDIyZGMxYTFhOGNhYjEgXAorICAgIC0taGFzaD1zaGEyNTY6ZTNmNjBhOTRmYTA2NmRjNTJlYzc2NjYxZTM3Yzg1MWNiMjMyZDkyZjk4ODZiMTVjYjU2MGFhYWRhMmRmOGZlYgorICAgICMgdmlhIHJpY2gKK21hcmt1cHNhZmU9PTIuMS4zIFwKKyAgICAtLWhhc2g9c2hhMjU2OjA1ZmIyMTE3MDQyM2RiMDIxODk1ZTFlYTFlMWYzYWIzYWRiODVkMWMyMzMzY2JjMjMxMGYyYTI2YmM3NzI3MmUgXAorICAgIC0taGFzaD1zaGEyNTY6MGE0ZTRhMWFmZjZjN2FjNGNkNTU3OTJhYmY5NmM5MTU2MzRjMmI5N2UzY2MxYzcxMjk1NzhhYTY4ZWJkNzU0ZSBcCisgICAgLS1oYXNoPXNoYTI1NjoxMGJiZmU5OTg4M2RiODBiZGJhZmYyZGNmNjgxZGZjNjUzM2E2MTRmNzAwZGExMjg3NzA3ZThhNWQ3OGE4NDMxIFwKKyAgICAtLWhhc2g9c2hhMjU2OjEzNGRhMWVjYTllYzBhZTUyODExMGNjYzllNDgwNDFlMDgyOGQ3OWYyNDEyMWExYTE0NjE2MTEwM2M3NmU2ODYgXAorICAgIC0taGFzaD1zaGEyNTY6MTRmZjgwNjg1MDgyN2FmZDZiMDdhNWYzMmJkOTE3ZmI3ZjQ1YjA0NmJhNDBjNTdhYmRiNjM2Njc0YThiNTU5YyBcCisgICAgLS1oYXNoPXNoYTI1NjoxNTc3NzM1NTI0Y2RhZDMyZjlmNjk0MjA4YWE3NWU0MjJhZGJhNzRmMWJhZWU3NTUxNjIwZTQzYTMxNDFmNTU5IFwKKyAgICAtLWhhc2g9c2hhMjU2OjFiNDAwNjlkNDg3ZTdlZGIyNjc2ZDNmYmRiMmIwODI5ZmZhMmNkNjNhMmVjMjZjNDkzOGIyZDM0MzkxYjRlY2MgXAorICAgIC0taGFzaD1zaGEyNTY6MWI4ZGQ4YzNmZDE0MzQ5NDMzYzc5ZmE4YWJlYjU3M2E1NWZjMGZkZDc2OTEzM2JhYWMxZjVlMDdhYmY1NGFlYiBcCisgICAgLS1oYXNoPXNoYTI1NjoxZjY3YzcwMzhkNTYwZDkyMTQ5YzA2MDE1N2Q2MjNjNTQyMTczMDE2YzRiYWJjMGMxOTEzY2NhMDU2NGI5OTM5IFwKKyAgICAtLWhhc2g9c2hhMjU2OjI4MmMyY2IzNWI1YjY3M2JiY2FkYjMzYTU4NTQwODEwNGRmMDRmMTRiMmQ5YjAxZDRjMzQ1YTNiOTI4NjFjMmMgXAorICAgIC0taGFzaD1zaGEyNTY6MmMxYjE5YjNhYWFjYzZlNTdiN2UyNTcxMGZmNTcxYzI0ZDZjMzYxM2E0NWU5MDViMWZkZTA0ZDY5MWI5OGVlMCBcCisgICAgLS1oYXNoPXNoYTI1NjoyZWYxMjE3OWQzYTI5MWJlMjM3MjgwMTc1YjU0MmMwN2EzNmU3ZjYwNzE4Mjk2Mjc4ZDg1OTNkMjFjYTkzN2Q0IFwKKyAgICAtLWhhc2g9c2hhMjU2OjMzOGFlMjdkNmI4NzQ1NTg1Zjg3MjE4YTNmMjNmMTUxMmRiZjUyYzI2YzI4ZTMyMmRiZTU0YmNlZGU1NGNjYjkgXAorICAgIC0taGFzaD1zaGEyNTY6M2MwZmFlNmMzYmU4MzJhMGEwNDczYWM5MTI4MTBiMjg3N2M4Y2I5ZDc2Y2E0OGRlMWVkMzFlMWM2ODM4NjU3NSBcCisgICAgLS1oYXNoPXNoYTI1NjozZmQ0YWJjYjg4OGQxNWE5NGYzMmI3NWQ4ZmQxOGVlMTYyY2EwYzA2NGYzNWIxMTEzNGJlNzcwNTAyOTZkNmJhIFwKKyAgICAtLWhhc2g9c2hhMjU2OjQyZGUzMmIyMmI2YjgwNGY0MmM1ZDk4YmU0ZjdlNWU5NzdlY2RkOWVlOWI2NjBmZGExYTNlZGYwM2IxMTc5MmQgXAorICAgIC0taGFzaD1zaGEyNTY6NDdkNGYxYzVmODBmYzYyZmRkNzc3N2QwZDQwYTJlOWRkYTBhMDU4ODNhYjExMzc0MzM0ZjZjNGRlMzhhZGZmZCBcCisgICAgLS1oYXNoPXNoYTI1Njo1MDRiMzIwY2Q0YjdlZmY2Zjk2OGVkZGY4MTEyNzExMmRiNjg1ZTgxZjdlMzZlNzVmOWY4NGYwZGY0NjA0MWMzIFwKKyAgICAtLWhhc2g9c2hhMjU2OjUyNTgwOGI4MDE5ZTM2ZWI1MjRiOGM2OGFjZGQ2M2EzN2U3NTcxNGVhYzUwZTk4ODE4MGIxNjlkNjQ0ODBhMDAgXAorICAgIC0taGFzaD1zaGEyNTY6NTZkOWYyZWNhYzY2MmNhMTYxMWQxODNmZWIwM2EzZmE0NDA2NDY5ZGFmZTI0MTY3M2Q1MjFkZDVhZTkyYTE1NSBcCisgICAgLS1oYXNoPXNoYTI1Njo1YmJlMDZmOGVlYWZkMzhlNWQwYTQ4OTRmZmVjODkzNzhiNmM2YTYyNWZmNTdlMzAyODkyMWY4ZmY1OTMxOGFjIFwKKyAgICAtLWhhc2g9c2hhMjU2OjY1YzFhOWJjZGFkYzZjMjhlZWNlZTJjMTE5NDY1YWViZmY4ZjdhNTg0ZGQ3MTlmYWNkZDllODI1ZWM2MWFiNTIgXAorICAgIC0taGFzaD1zaGEyNTY6NjhlNzg2MTlhNjFlY2Y5MWU3NmFhM2U2ZThlMzNmYzQ4OTRhMmJlYmU5MzQxMDc1NGJkMjhmY2UwYThhNGY5ZiBcCisgICAgLS1oYXNoPXNoYTI1Njo2OWMwZjE3ZTlmNWE3YWZkZjJjYzlmYjJkMWNlNmFhYmRiM2JhZmI3ZjM4MDE3YzBiNzc4NjJiY2VjMmJiYWQ4IFwKKyAgICAtLWhhc2g9c2hhMjU2OjZiMmI1Njk1MGQ5M2U0MWYzM2I0MjIzZWFkMTAwZWEwZmUxMWY4ZTZlZTVmNjQxZWI3NTNjZTRiNzdhNzA0MmIgXAorICAgIC0taGFzaD1zaGEyNTY6NzE1ZDM1NjJmNzlkNTQwZjI1MWI5OWViZDZkOGJhYTU0NzExODk3NDM0MWRiMDRmNWFkMDZkNWVhM2ViODAwNyBcCisgICAgLS1oYXNoPXNoYTI1Njo3ODcwMDNjMGRkYjAwNTAwZTQ5YTEwZjI4NDRmYWM4N2FhNmNlOTc3YjkwYjBmZWFhZjlkZTIzYzIyNTA4YjI0IFwKKyAgICAtLWhhc2g9c2hhMjU2OjdlZjNjYjJlYmJmOTFlMzMwZTNiYjkzN2VmYWRhMGVkZDkwMDM2ODNkYjZiNTdiYjEwOGM0MDAxZjM3YTAyZWEgXAorICAgIC0taGFzaD1zaGEyNTY6ODAyM2ZhZjRlMDFlZmFkZmExODNlODYzZmVmZGUwMDQ2ZGU1NzZjNmYxNDY1OWU4NzgyMDY1YmNlY2UyMjE5OCBcCisgICAgLS1oYXNoPXNoYTI1Njo4NzU4ODQ2YTdlODA5MTAwOTY5NTBiNjcwNzEyNDNkYTNlNWEyMGVkMjU0NmU2MzkyNjAzYzA5Njc3OGQ0OGUwIFwKKyAgICAtLWhhc2g9c2hhMjU2OjhhZmFmZDk5OTQ1ZWFkNmUwNzViOTczZmVmYTU2Mzc5YzViNWM1M2ZkODkzN2RhZDkyYzY2MmRhNWQ4ZmQ1ZWUgXAorICAgIC0taGFzaD1zaGEyNTY6OGM0MTk3NmEyOWQwNzhiYjIzNWZlYTliMmVjZDNkYTQ2NWRmNDJhNTYyOTEwZjkwMjJmMWEwMzEwN2JkMDJiZSBcCisgICAgLS1oYXNoPXNoYTI1Njo4ZTI1NGFlNjk2Yzg4ZDk4ZGE2NTU1ZjVhY2UyMjc5Y2Y3Y2Q1YjNmNTJiZTJiNWNmOTdmZWFmZTg4M2I1OGQyIFwKKyAgICAtLWhhc2g9c2hhMjU2OjhmOTI5Mzg2NGZlMDliODE0OWYwY2M0MmNlNTZlM2YwZTU0ZGU4ODNhOWRlOTBjZDQyN2YxOTFjMzQ2ZWIyZTEgXAorICAgIC0taGFzaD1zaGEyNTY6OTQwMmIwM2YxYTFiNGRjNGMxOTg0NWU1Yzc0OWUzYWI4MmQ1MDc4ZDE2YTJhNGMyY2QyZGY2MmQ1N2JiMDcwNyBcCisgICAgLS1oYXNoPXNoYTI1Njo5NjJmODJhMzA4NjQ4M2Y1ZTVmNjRkYmFkODgwZDMxMDM4YjY5ODQ5NDc5OWIwOTdiYzU5YzJlZGYzOTJmY2U2IFwKKyAgICAtLWhhc2g9c2hhMjU2OjlhYWQzYzE3NTUwOTVjZTM0N2UyNjQ4ODIxNGVmNzdlMDQ4NWEzYzM0YTUwYzVhNWUyNDcxZGZmNjBiOWRkOWMgXAorICAgIC0taGFzaD1zaGEyNTY6OWRjZGZkMGVhZjI4M2FmMDQxOTczYmZmMTRhMmUxNDNiOGJkNjRlMDY5ZjRjMzgzNDE2ZWNkNzlhODFhYWI1OCBcCisgICAgLS1oYXNoPXNoYTI1NjphYTU3YmQ5Y2Y4YWU4MzFhMzYyMTg1ZWU0NDRlMTVhOTNlY2IyZTM0NGM4ZTUyZTRkNzIxZWEzYWI2ZWYxODIzIFwKKyAgICAtLWhhc2g9c2hhMjU2OmFhN2JkMTMwZWZhYjFjMjgwYmVkMGY0NTUwMWI3Yzg3OTVmOWZkYmViMDJlOTY1MzcxYmJlZjM1MjM2Mjc3NzkgXAorICAgIC0taGFzaD1zaGEyNTY6YWI0YTBkZjQxZTdjMTZhMTM5MjcyNzcyN2U3OTk4YTQ2NzQ3MmQwYWQ2NWYzYWQ1ZTZlNzY1MDE1ZGYwODYzNiBcCisgICAgLS1oYXNoPXNoYTI1NjphZDllODJmYjhmMDlhZGUxYzNlMWI5OTZhNjMzN2FmYWMyYjhiOWUzNjVmOTI2ZjVhNjFhYWNjNzFhZGM1YjNjIFwKKyAgICAtLWhhc2g9c2hhMjU2OmFmNTk4ZWQzMmQ2YWU4NmYxYjc0N2I4Mjc4Mzk1OGIxYTRhYjhmNjE3YjA2ZmU2ODc5NWM3ZjAyNmFiYmRjYWQgXAorICAgIC0taGFzaD1zaGEyNTY6YjA3NmI2MjI2ZmI4NDE1N2UzZjdjOTcxYTQ3ZmYzYTY3OWQ4MzdjZjMzODU0NzUzMmFiODY2YzU3OTMwZGJlZSBcCisgICAgLS1oYXNoPXNoYTI1NjpiN2ZmMGY1NGNiNGZmNjZkZDM4YmViZDMzNWEzOGUyYzIyYzQxYThlZTQ1YWE2MDhlZmM4OTBhYzNlMzkzMWJjIFwKKyAgICAtLWhhc2g9c2hhMjU2OmJmY2U2M2E5ZTc4MzRiMTJiODdjNjRkNmIxNTVmZGQ5YjNiOTYxOTFiNmJkMzM0YmYzN2RiN2ZmMWZlNDU3ZjIgXAorICAgIC0taGFzaD1zaGEyNTY6YzAxMWE0MTQ5Y2ZiY2Y5ZjAzOTk0ZWMyZWRmZmNiOGIxZGMyZDJhZWRlN2NhMjQzNzQ2ZGY5N2E1ZDQxY2U0OCBcCisgICAgLS1oYXNoPXNoYTI1NjpjOWM4MDQ2NjRlYmU4ZjgzYTIxMWNhY2U2Mzc1MDY2NjllNzg5MGZlYzFiNDE5NWI1MDVjMjE0ZTUwZGQ0ZWI3IFwKKyAgICAtLWhhc2g9c2hhMjU2OmNhMzc5MDU1YTQ3MzgzZDAyYTU0MDBjYjBkMTEwY2VmMGE3NzZmYzY0NGNkYTc5N2RiMGM1Njk2Y2ZkN2UxOGUgXAorICAgIC0taGFzaD1zaGEyNTY6Y2IwOTMyZGMxNTg0NzE1MjNjOTYzN2U4MDdkOWJmYjkzZTA2YTk1Y2JmMDEwZjFhMzhiOTg2MjNiOTI5ZWYyYiBcCisgICAgLS1oYXNoPXNoYTI1NjpjZDBmNTAyZmUwMTY0NjA2ODBjZDIwYWFhNWE3NmQyNDFkNmYzNWExYzMzNTBjNDc0YmFjMTI3MzgwMzg5M2ZhIFwKKyAgICAtLWhhc2g9c2hhMjU2OmNlYjAxOTQ5YWY3MTIxZjlmYzM5ZjdkMjdmOTFiZTg1NDZmM2ZiMTEyYzYwOGJjNDAyOWFlZjBiYWI4NmEyYTUgXAorICAgIC0taGFzaD1zaGEyNTY6ZDA4MGUwYTVlYjI1Mjk0NjBiMzAxOTBmY2ZjYzQxOTliZDdmODI3NjYzZjg1OGEyMjZhODFiYzI3YmVhYTk3ZSBcCisgICAgLS1oYXNoPXNoYTI1NjpkZDE1ZmYwNGZmZDdlMDVmZmNiN2ZlNzlmMWI5ODA0MWI4ZWEzMGFlOTIzNGFlZDJhOTE2OGI1Nzk3YzNlZmZiIFwKKyAgICAtLWhhc2g9c2hhMjU2OmRmMGJlMmI1NzZhN2FiYmY3MzdiMTU3NWYwNDhjMjNmYjFkNzY5ZjI2N2VjNDM1ODI5NmYzMWMyNDc5ZGI4ZjkgXAorICAgIC0taGFzaD1zaGEyNTY6ZTA5MDMxYzg3YTFlNTE1NTZmZGNiNDZlNWJkNGY1OWRmYjc0MzA2MWNmOTNjNGQ2ODMxYmY4OTRmMTI1ZWI1NyBcCisgICAgLS1oYXNoPXNoYTI1NjplNGRkNTJkODBiOGM4M2ZkY2U0NGUxMjQ3OGFkMmU4NWM2NGVhOTY1ZTc1ZDY2ZGJlYWZiMGEzZTc3MzA4ZmNjIFwKKyAgICAtLWhhc2g9c2hhMjU2OmY2OThkZTNmZDBjNGU2OTcyYjkyMjkwYTQ1YmQ5YjE1MzZiZmZlOGM2NzU5YzYyNDcxZWZhYThhY2I0YzM3YmMgXAorICAgIC0taGFzaD1zaGEyNTY6ZmVjMjE2OTMyMThlZmUzOWFhN2Y4NTk5MzQ2ZTkwYzcwNWFmYTUyYzViMzFhZTAxOWIyZTU3ZThmNjU0MmJiMiBcCisgICAgLS1oYXNoPXNoYTI1NjpmZmNjM2Y3YzY2YjVmNWI3OTMxYTVhYTY4ZmM5Y2VjYzUxZTY4NWVmOTAyODJmNGE4MmYwZjVlOWI3MDRhZDExCiAgICAgIyB2aWEKICAgICAjICAgbWFrbwogICAgICMgICB3ZXJremV1ZwotbWwtZHR5cGVzPT0wLjEuMCBcCi0gICAgLS1oYXNoPXNoYTI1NjoyNzNjMzA2ZGI4NDYwMDViODNhOThjOWM3ZWMzZGM4ZmEyMGU4ZjExYzM3NzJjOGU4YzIwY2MxMmQ4YWJmZDRiIFwKLSAgICAtLWhhc2g9c2hhMjU2OjJkZTZjODFiMGRhMzk4ZDU0YWFiZGQ3ZGU1OTlmMmRmYzQzZTMwYjY1ZDlmYWQzNzlhNjlmNGNjNGFlMTY1ZDMgXAotICAgIC0taGFzaD1zaGEyNTY6MzZlODUxOGM4ZmQyYzM4NzI5ZjAyMDEyNWYzOWVmMDdiMDQ1ZjVjMTZkMDg0NjMyMGM3MjUyZDc3NzMyODVlZSBcCi0gICAgLS1oYXNoPXNoYTI1NjozNzdmMmQ1Y2ZiZjgwOWI1OTE4OGUwYmZkYTRhMDc3NGU2NTg1NDFmNTc1YjYzN2ZlZTQ4NTBkOTljMmY5ZmRjIFwKLSAgICAtLWhhc2g9c2hhMjU2OjQxYjZiZWVhZWE0N2UyNDY2Yjk0MDY4NjY0YzlhNDViMmE2NWRkMDIzYWE0ZTVkZWViNWE3MzMwMzY2MTM0NGUgXAotICAgIC0taGFzaD1zaGEyNTY6Nzc5NzBiZWViM2NmNmFjNTU5YzRiNmIzOTNmMjQ3NzhhNWFiZDM0ZmFmYmFhZDgyZDVhMGQxN2QwZjE0ODkzNiBcCi0gICAgLS1oYXNoPXNoYTI1Njo4N2FhMWNmODNkNDFmZWQ1YTQwZmMyN2VlNTdhYzRjMWJmOTA0ZTk0MGYwODI1MzFkM2Q1OGYxYzMxOGI1OTI4IFwKLSAgICAtLWhhc2g9c2hhMjU2OjhjNWM5ZmUwODY3NTZmYmMxYmY1MTI5NjQzMWQ2NDQyOTUzNjA5M2NmNmUyYmE1OTJlMDQyZDdmYzA3Yzg1MTQgXAotICAgIC0taGFzaD1zaGEyNTY6OGRlOWJiZjViZWQ1ODdhMTE2NjY5OTQ0N2VhMTRkMWU4ZmU2NmQ0ZTgxMjgxMWUzN2JmMmY0ZDk4ODQ3NTQ3NiBcCi0gICAgLS1oYXNoPXNoYTI1Njo5OWZhYjgyNjJkMTc1YzQ5YmYxNjU1YzIyOTI0NGYzMDEyNzRlODI4OTQ0OWMzNTBiYTRkNWI5NWFkZTA3ZDlhIFwKLSAgICAtLWhhc2g9c2hhMjU2OmEyOWZiZjEyODU4MzY3M2VjYTBmNDNkZWYxZGJlNzdlMDJjMWU4YjhhODMzMWRiMjg3N2JiYjU3ZDA5MWVmMTEgXAotICAgIC0taGFzaD1zaGEyNTY6YWQ3NjUxNTlhYzZjMThkNWVlN2QzMjVmY2YzNGQzMTA2YTlkOWQ3YTQ5NzEzZDk5OGY1Y2ZhMzMwYTE0NTliNCBcCi0gICAgLS1oYXNoPXNoYTI1NjpiOWM1NTc4ZGZmZDg1NjM3YTdkZDQzNzE5MmRlMThiYzFhMTRlYjZiYTdkNTNlZjQwZGUzZjg0YzUxYzc4OWU1IFwKLSAgICAtLWhhc2g9c2hhMjU2OmMxZmMwYWZlNjNjZTk5MDY5ZjlkN2UwNjkzYTYxY2ZkMGFlYTkwMjQxZmMzODIxYWY5OTUzZDBjMTFmNDA0OGEgXAotICAgIC0taGFzaD1zaGEyNTY6YzkyMTgxNzViMDY3NjRiOGRkYzk1Y2IxOGQxMWE2YzRiNDhhNGIxMDNhMzFjOWVhMmIyYzNjZDBjZmMzNjlmOCBcCi0gICAgLS1oYXNoPXNoYTI1NjpkZWU4ZWE2MjliOGUzZTIwYzY2NDk4NTJjMWI5ZGVhY2ZhMTMzODRhYjkzMzdmMmM5ZTcxN2U0MDFkMTAyZjIzIFwKLSAgICAtLWhhc2g9c2hhMjU2OmZmYjc4ODJkZDQ2Mzk5MjE3ZGM1NGYzN2FmZmM4OTllMGEyOWE0Y2ZiNjNlNWJmNzMzYWMwYmFmNGExNzljNzcKLSAgICAjIHZpYSBqYXgKLW51bXB5PT0xLjIzLjUgXAotICAgIC0taGFzaD1zaGEyNTY6MDFkZDE3Y2JiMzQwYmYwZmMyMzk4MWU1MmUxZDE4YTlkNDA1MDc5MmU4ZmI4MzYzY2VjYmYwNjZhODRiODI3ZCBcCi0gICAgLS1oYXNoPXNoYTI1NjowNjAwNWEyZWY2MDE0ZTk5NTZjMDliYTA3NjU0Zjk4MzdkOWUyNjY5NmEwNDcwZTQyYmVlZGFkYjc4YzExYjA3IFwKLSAgICAtLWhhc2g9c2hhMjU2OjA5Yjc4NDdmN2U4M2NhMzdjNmU2Mjc2ODJmMTQ1ODU2ZGUzMzEwNDkwMTM4NTNmMzQ0ZjM3YjBjOTY5MGUzZGYgXAotICAgIC0taGFzaD1zaGEyNTY6MGFhZWUxMmQ4ODgzNTUyZmFkZmM0MWU5NmI0YzgyZWU3ZDc5NDk0OWUyYTdjM2IzYTcyMDFlOTY4YzdlY2FiOSBcCi0gICAgLS1oYXNoPXNoYTI1NjowY2JlOTg0OGZhZDA4YmFmNzFkZTFhMzllMTJkMWI2MzEwZjFkNWIyZDBlYTRkZTA1MTA1OGU2ZTEwNzY4NTJkIFwKLSAgICAtLWhhc2g9c2hhMjU2OjFiMTc2NmQ2ZjM5N2MxODE1M2Q0MDAxNWRkZmM3OWRkYjcxNWNhYmFkYzA0ZDJkMjI4ZDRlNWE4YmM0ZGVkMWEgXAotICAgIC0taGFzaD1zaGEyNTY6MzMxNjE2MTNkMjI2OTAyNTg3MzAyNWIzM2U4Nzk4MjVlYzdiMWQ4MzEzMTdlNjhmNGYyZjBmODRlZDE0YzcxOSBcCi0gICAgLS1oYXNoPXNoYTI1Njo1MDM5ZjU1NTU1ZTFlYWIzMTEyNGE1NzY4ODk4YzllMjJjMjVhNjVjMWUwMDM3ZjRkN2M0OTVhNDU3NzhjOWYyIFwKLSAgICAtLWhhc2g9c2hhMjU2OjUyMmUyNmJiZjYzNzdlNGQ3NjQwMzgyNmVkNjg5YzI5NWIwYjIzOGY0NmMyOGE3MjUxYWI5NDcxNmRhMGIyODAgXAotICAgIC0taGFzaD1zaGEyNTY6NTZlNDU0Yzc4MzNlOTRlYzk3NjlmYTBmODZlNmZmOGU0MmVlMzhjZTBjZTFmYTRjYmI3NDdlYTdlMDZkNTZhYSBcCi0gICAgLS1oYXNoPXNoYTI1Njo1OGY1NDVlZmQxMTA4ZTY0NzYwNGExYjVhYTgwOTU5MWNjZDI1NDBmNDY4YTg4MGJlZGI5NzI0N2U3MmRiMzg3IFwKLSAgICAtLWhhc2g9c2hhMjU2OjVlMDViMWM5NzNhOWY4NThjNzQzNjc1NTNlMjM2ZjI4N2U3NDk0NjVmNzczMzI4YzhlZjMxYWJlMThmNjkxZTEgXAotICAgIC0taGFzaD1zaGEyNTY6NzkwM2JhOGFiNTkyYjgyMDE0NzEzYzQ5MWY2YzVkM2ExY2RlNWI0YTNiZjExNjQwNGUwOGY1YjUyZjZkYWY0MyBcCi0gICAgLS1oYXNoPXNoYTI1Njo4OTY5YmZkMjhlODVjODFmM2Y5NGViNGE2NmJjMmNmMWRiZGM1YzE4ZWZjMzIwYWYzNGJmZmM1NGQ2YjFlMzhmIFwKLSAgICAtLWhhc2g9c2hhMjU2OjkyYzhjMWU4OWExZjUwMjhhNGM2ZDllM2NjYmUzMTFiNmJhNTM2OTQ4MTEyNjliOTkyYzBiMjI0MjY5ZTIzOTggXAotICAgIC0taGFzaD1zaGEyNTY6OWM4ODc5M2Y3OGZjYTE3ZGEwMTQ1NDU1ZjBkNzgyNmJjYjlmMzdkYTQ3NjRhZjI3YWM5NDU0ODgxMTZlZmU2MyBcCi0gICAgLS1oYXNoPXNoYTI1NjphN2FjMjMxYTA4YmIzN2Y4NTI4NDliYmIzODdhMjBhNTc1NzRhOTdjZmM3YjZjYWJiNDg4YTRmYzhiZTE3NmRlIFwKLSAgICAtLWhhc2g9c2hhMjU2OmFiZGRlOWY3OTVjZjI5MmZiOTY1MWVkNDgxODU1MDNhMmZmMjliZTg3NzcwYzNiOGUyYTE0YjBjZDdhYTE2ZjggXAotICAgIC0taGFzaD1zaGEyNTY6YWYxZGE4OGY2YmMzZDIzMzhlYmJmMGUyMmZlNDg3ODIxZWE0ZDhlODkwNTNlMjVmYTU5ZDFkNzk3ODZlNzQ4MSBcCi0gICAgLS1oYXNoPXNoYTI1NjpiMmE5YWI3YzI3OWM5MTk3NGY3NTZjODRjMzY1YTY2OWE4ODdlZmEyODczNjVhOGUyYzQxOGY4YjNiYTczZmIwIFwKLSAgICAtLWhhc2g9c2hhMjU2OmJmODM3ZGM2M2JhNWMwNmRjODc5N2MzOThkYjFlMjIzYTQ2NmM3ZWNlMjdhMWY3YjUyMzJiYTM0NjZhYWZlM2QgXAotICAgIC0taGFzaD1zaGEyNTY6Y2E1MWZjZmNjNWY5MzU0YzQ1ZjQwMDA1OWU4OGJjMDkyMTVmYjcxYTQ4ZDM3NjhmYjgwZTM1N2YzYjQ1N2UxZSBcCi0gICAgLS1oYXNoPXNoYTI1NjpjZTU3MTM2N2I2ZGZlNjBhZjA0ZTA0YTE4MzRjYTJkYzVmNDYwMDRhYzFjYzc1NmZiOTUzMTlmNjRjMDk1YTk2IFwKLSAgICAtLWhhc2g9c2hhMjU2OmQyMDhhMGY4NzI5ZjNmYjc5MGVkMThhMDAzZjNhNTc4OTViOTg5YjQwZWE0ZGNlNDcxN2U5Y2Y0YWY2MmM2YmIgXAotICAgIC0taGFzaD1zaGEyNTY6ZGJlZTg3YjQ2OTAxODk2MWQxYWQ3OWIxYTVkNTBjMGFlODUwMDAwYjYzOWJjYjFiNjk0ZTk5ODEwODMyNDNiNiBcCi0gICAgLS1oYXNoPXNoYTI1NjplOWY0YzRlNTE1NjdiNjE2YmU2NGUwNWQ1MTdjNzlhOGEyMmYzNjA2NDk5OTQxZDk3YmI3NmYyY2E1OWY5ODJkIFwKLSAgICAtLWhhc2g9c2hhMjU2OmYwNjNiNjliMDkwYzlkOTE4ZjlkZjBhMTIxMTYwMjllMjc0ZGFmMDE4MWRmMzkyODM5NjYxYzRjN2VjOTAxOGEgXAotICAgIC0taGFzaD1zaGEyNTY6ZjlhOTA5YThiYWUyODRkNDZiYmZkZWZiZGQ0YTI2MmJhMTlkM2JjOTkyMWIxZTc2MTI2YjFkMjFjM2MzNDEzNQorbWR1cmw9PTAuMS4yIFwKKyAgICAtLWhhc2g9c2hhMjU2Ojg0MDA4YTQxZTUxNjE1YTQ5ZmM5OTY2MTkxZmY5MTUwOWUzYzQwYjkzOTE3NmU2NDNmZDUwYTVjMjE5NmI4ZjggXAorICAgIC0taGFzaD1zaGEyNTY6YmI0MTNkMjlmNWVlYTM4ZjMxZGQ0NzU0ZGQ3Mzc3ZDQ0NjUxMTZmYjIwNzU4NWY5N2JmOTI1NTg4Njg3YzFiYQorICAgICMgdmlhIG1hcmtkb3duLWl0LXB5CittbC1kdHlwZXM9PTAuMi4wIFwKKyAgICAtLWhhc2g9c2hhMjU2OjAyMmQ1YTRlZTZiZTE0NTY5YzJhOWQxNTQ5ZTE2ZjFlYzg3Y2E5NDk2ODFkMGRjYTU5OTk1NDQ1ZDVmY2RkNWIgXAorICAgIC0taGFzaD1zaGEyNTY6MTc0OWI2MDM0OGRhNzFmZDNjMmFiMzAzZmRiYzE5NjU5NThkYzUwNzc1ZWFkNDFmNTY2OWM5MzJhMzQxY2FmZCBcCisgICAgLS1oYXNoPXNoYTI1NjozMjEwN2U3ZmE5ZjYyZGI5YTUyODFkZTkyMzg2MTMyNTIxMWRmZmY4N2JkMjNmYWVmYjI3YjMwMzMxNDYzNWFiIFwKKyAgICAtLWhhc2g9c2hhMjU2OjM1Yjk4NGNkZGJlODE3M2I1NDVhMGUzMzM0ZmU1NmVhMWE1YzNlYjY3YzUwN2Y2MGQwY2ZkZTFkM2ZhOGY4YzIgXAorICAgIC0taGFzaD1zaGEyNTY6MzZkMjhiODg2MWE4OTMxNjk1ZTVhMzExNzZjYWQ1YWU4NWY2NTA0OTA2NjUwZGVhNTU5OGZiZWMwNmM5NDYwNiBcCisgICAgLS1oYXNoPXNoYTI1Njo1MDg0NWFmM2U5YTYwMTgxMDc1MWI1NTA5MWRlZTZjMjU2MjQwM2ZhMWNiNGUwMTIzNjc1Y2YzYTRmYzJjMTdhIFwKKyAgICAtLWhhc2g9c2hhMjU2OjY0ODhlYjY0MmFjYWFmMDhkODAyMGY2ZGUwYTM4YWNlZTdhYzMyNGMxZTZlOTJlZTBjMGZlYTQyNDIyY2I3OTcgXAorICAgIC0taGFzaD1zaGEyNTY6NzUwMTU4MThhN2ZjY2Y5OWE1ZThlZDE4NzIwY2I0MzBmM2U3MWE4ODM4Mzg4ODQwZjRjZGYyMjVjMDM2Yzk4MyBcCisgICAgLS1oYXNoPXNoYTI1Njo4MGQzMDRjODM2ZDczZjEwNjA1YzU4Y2NmNzc4OWMxNzFjYzIyOWJmYjY3ODc0OGFkZmI3Y2VhMjUxMGRmZDBlIFwKKyAgICAtLWhhc2g9c2hhMjU2OjgzMmEwMTlhMWI2ZGI1YzQ0MjIwMzJjYTk5NDBhOTkwZmExMDRlZWU0MjBmNjQzNzEzMjQxYjNhNTE4OTc3ZmEgXAorICAgIC0taGFzaD1zaGEyNTY6OGZhYWYwODk3OTQyYzgyNTNkZDEyNjY2Mjc3NmJhNDVmMGE1ODYxOTY4Y2YwZjA2ZDZkNDY1ZjhhN2JjMjk4YSBcCisgICAgLS1oYXNoPXNoYTI1NjpiYzI5YTA1MjRlZjVlMjNhN2ZiYjhkODgxYmRlY2FiZWIzZmMxZDE5ZDlkYjYxNzg1ZDA3N2E4NmNiOTRmYWIyIFwKKyAgICAtLWhhc2g9c2hhMjU2OmRmNmE3NmUxYzhhZGY0ODRmZWIxMzhlZDMyM2Y5ZjQwYTdiNmMyMTc4OGYxMjBmN2M3OGJlYzIwYWMzN2VlODEgXAorICAgIC0taGFzaD1zaGEyNTY6ZTcwMDQ3ZWMyYzgzZWFlZTAxYWZkZmRhYmVlMmM1YjBjMTMzODA0ZDkwZDBmN2RiNGRkOTAzMzYwZmNjNTM3YyBcCisgICAgLS1oYXNoPXNoYTI1NjplODViYThlMjRjZjQ4ZDQ1NmU1NjQ2ODhlOTgxY2YzNzlkNGM4ZTY0NGRiMGEyZjcxOWI3OGRlMjgxYmFjMmNhIFwKKyAgICAtLWhhc2g9c2hhMjU2OmYwMGM3MWM4YzYzZTAzYWZmMzEzYmM2YTdhZWFhYzlhNGYxNDgzYTkyMWE2ZmZlZmE2ZDQ0MDRlZmQxYWYzZDAgXAorICAgIC0taGFzaD1zaGEyNTY6ZjA4YzM5MWMyNzk0ZjJhYWQzNThlNmY0YzcwNzg1YTlhN2IxZGY5ODBlZjRjMjMyYjNjY2Q0ZjZmZTM5ZjcxOQorICAgICMgdmlhIHRlbnNvcmZsb3cKK21vcmUtaXRlcnRvb2xzPT0xMC4yLjAgXAorICAgIC0taGFzaD1zaGEyNTY6Njg2YjA2YWJlNTY1ZWRmYWIxNTFjYjhmZDM4NWEwNTY1MWUxZmRmOGYwYTE0MTkxZTQ0MzkyODM0MjFmODY4NCBcCisgICAgLS1oYXNoPXNoYTI1Njo4ZmNjYjQ4MGM0M2QzZTk5YTAwMDg3NjM0YzA2ZGQwMmIwZDUwZmJmMDg4YjM4MGRlNWE0MWEwMTVlYzIzOWUxCisgICAgIyB2aWEgamFyYWNvLWNsYXNzZXMKK25oMz09MC4yLjE1IFwKKyAgICAtLWhhc2g9c2hhMjU2OjBkMDJkMGZmNzlkZmQ4MjA4ZWQyNWEzOWMxMmNiZGEwOTIzODhmZmY3ZjE2NjI0NjZlMjdkOTdhZDAxMWI3NzAgXAorICAgIC0taGFzaD1zaGEyNTY6MzI3NzQ4MTI5M2I4NjhiMjcxNTkwNzMxMGM3YmUwZjFiOWQxMDQ5MWQ1YWRmOWZjZTExNzU2YTk3ZTk3ZWRkZiBcCisgICAgLS1oYXNoPXNoYTI1NjozYjgwM2E1ODc1ZTcyMzQ5MDdmN2Q2NDc3N2RmZGUyYjkzZGI5OTIzNzZmM2Q2ZDdhZjdmM2JjMzQ3ZGViMzA1IFwKKyAgICAtLWhhc2g9c2hhMjU2OjQyN2ZlY2JiMTAzMWRiMDg1ZWFhYzk5MzEzNjJhZGY0YTc5NjQyOGVmMDE2MzA3MGM0ODRiNWE3NjhlNzE2MDEgXAorICAgIC0taGFzaD1zaGEyNTY6NWYwZDc3MjcyY2U2ZDM0ZGI2Yzg3YjRmODk0ZjAzN2Q1NTE4M2Q5NTE4Zjk0OGJiYTIzNmZlODFlMmJiNGUyOCBcCisgICAgLS1oYXNoPXNoYTI1Njo2MDY4NDg1N2NmYThmZGJiNzRkYWE4NjdlNWNhZDNmMGM5Nzg5NDE1YWJhNjYwNjE0ZmUxNmNkNjZjYmI5ZWM3IFwKKyAgICAtLWhhc2g9c2hhMjU2OjZmNDJmOTlmMGNmNjMxMmU0NzBiNmMwOWUwNGRhMzFmOWFiYWFkY2QzZWI1OTFkN2QxYTg4ZWE5MzFkY2E3ZjMgXAorICAgIC0taGFzaD1zaGEyNTY6ODZlNDQ3YTYzY2EwYjE2MzE4ZGViNjI0OThkYjRmNzZmYzYwNjk5Y2UwYTEyMzEyNjI4ODBiMzhiNmNmZjkxMSBcCisgICAgLS1oYXNoPXNoYTI1Njo4ZDU5NWRmMDI0MTNhYTM4NTg2YzI0ODExMjM3ZTk1OTM3ZWYxODMwNGUxMDhiN2U5MmM4OTBhMDY3OTNlM2JmIFwKKyAgICAtLWhhc2g9c2hhMjU2OjljMGQ0MTVmNmI3ZjIzMzhmOTMwMzViYmE1YzBkOGMxYjQ2NGU1MzhiZmJiMWQ1OThhY2Q0N2Q3OTY5Mjg0ZjAgXAorICAgIC0taGFzaD1zaGEyNTY6YTUxNjdhNjQwM2QxOWM1MTUyMTdiNmJjYWFhOWJlNDIwOTc0YTZhYzMwZTBkYTllODRkNGZjNjdhNWQ0NzRjNSBcCisgICAgLS1oYXNoPXNoYTI1NjphYzE5YzBkNjhjZDQyZWNkN2VhZDkxYTNhMDMyZmRmZmYyM2QyOTMwMmRiYjEzMTFlNjQxYTEzMGRmZWZiYTk3IFwKKyAgICAtLWhhc2g9c2hhMjU2OmIxZTk3MjIxY2VkYWYxNWE1NGY1MjQzZjJjNTg5NGJiMTJjYTk1MWFlNGRkZmQwMmE5ZDRlYTlkZjllMWEyOWQgXAorICAgIC0taGFzaD1zaGEyNTY6YmMyZDA4NmZiNTQwZDBmYTUyY2UzNWFmYWRlZDRlYTUyNmI4ZmM0ZDMzMzlmNzgzZGI1NWM5NWRlNDBlZjAyZSBcCisgICAgLS1oYXNoPXNoYTI1NjpkMWUzMGZmMmQ4ZDU4ZmIyYTE0OTYxZjdhYWMxYmJiMWM1MWY5YmRkN2RhNzI3YmUzNWM2MzgyNjA2MGIwYmYzIFwKKyAgICAtLWhhc2g9c2hhMjU2OmYzYjUzYmE5M2JiNzcyNWFjYWIxZTAzMGJjMmVjZDAxMmE4MTcwNDBmZDc4NTFiMzMyZjg2ZTJmOWJiOThkYzYKKyAgICAjIHZpYSByZWFkbWUtcmVuZGVyZXIKK251bXB5PT0xLjI2LjMgXAorICAgIC0taGFzaD1zaGEyNTY6MDJmOTgwMTFiYTRhYjE3ZjQ2ZjgwZjdmOGYxYzI5MWVlN2Q4NTVmY2VmMGE1YTk4ZGI4MDc2N2E0NjhjODVjZCBcCisgICAgLS1oYXNoPXNoYTI1NjowYjdlODA3ZDY4ODhkYTBkYjZlN2U3NTgzODQ0NGQ2MjQ5NWUyYjU4OGI5OWU5MGRkODBjMzQ1OTU5NGU4NTdiIFwKKyAgICAtLWhhc2g9c2hhMjU2OjEyYzcwYWMyNzRiMzJiYzAwYzdmNjFiNTE1MTI2YzkyMDUzMjM3MDNhYmI5OWNkNDE4MzZlODEyNWVhMDA0M2UgXAorICAgIC0taGFzaD1zaGEyNTY6MTY2NmY2MzRjYjNjODBjY2JkNzdlYzk3YmMxNzMzNzcxOGY1NmQ2NjU4YWNmNWQzYjkwNmNhMDNlOTBjZTg3ZiBcCisgICAgLS1oYXNoPXNoYTI1NjoxOGMzMzE5YTdkMzliMmM2YTllM2JiNzVhYWIyMzA0YWI3OWE4MTFhYzAxNjhhNjcxYTYyZTYzNDZjMjliMDNmIFwKKyAgICAtLWhhc2g9c2hhMjU2OjIxMWRkZDFlOTQ4MTdlZDJkMTc1YjYwYjYzNzQxMjAyNDRhNGRkMjI4N2Y0ZWNlNDVkNDkyMjhiNGQ1MjkxNzggXAorICAgIC0taGFzaD1zaGEyNTY6MjFhOTQ4NGU3NWFkMDE4OTc0YTJmZGFhMjE2NTI0ZDY0ZWQ0MjEyZTQxOGUwYTU1MWEyZDgzNDAzYjA1MzFkMyBcCisgICAgLS1oYXNoPXNoYTI1NjozOTc2M2FlZTZkZmRkNDg3ODAzMjM2MWIzMGIyYjEyNTkzZmI0NDVkZGI2NmJiYWM4MDJlMjExM2ViOGE2YWM0IFwKKyAgICAtLWhhc2g9c2hhMjU2OjNjNjc0MjNiMzcwM2Y4ZmJkOTBmNWFkYWEzN2Y4NWI1Nzk0ZDMzNjY5NDhlZmU5YTUxOTBhNWYzYTgzZmMzNGUgXAorICAgIC0taGFzaD1zaGEyNTY6NDZmNDdlZTU2NmQ5ODg0OTMyM2YwMWIzNDlkNThmMjU1N2YwMjE2N2VlMzAxZTVlMjg4MDlhOGMwZTI3YTJkMCBcCisgICAgLS1oYXNoPXNoYTI1Njo1MWM3ZjFiMzQ0ZjMwMjA2N2IwMmUwZjViNWQyZGFhOWVkNGE3MjFjZjQ5ZjA3MDI4MGFjMjAyNzM4ZWE3ZjAwIFwKKyAgICAtLWhhc2g9c2hhMjU2OjVmMjQ3NTBlZjk0ZDU2Y2U2ZTMzZTQwMTlhOGE0ZDY4Y2ZkYjFlZjY2MWE1MmNkYWVlNjI4YTU2ZDI0Mzc0MTkgXAorICAgIC0taGFzaD1zaGEyNTY6Njk3ZGY0M2UyYjYzMTBlY2M5ZDk1ZjA1ZDVlZjIwZWFjYzA5YzdjNGVjYzlkYTNmMjM1ZDM5ZTcxYjdkYTFlNCBcCisgICAgLS1oYXNoPXNoYTI1Njo2ZDQ1YjNlYzJmYWVkNGJhY2E0MWM3NjYxN2ZjZGNmYTRmNjg0ZmY3YTE1MWNlNmZjNzhhZDNiNmU4NWFmMGE2IFwKKyAgICAtLWhhc2g9c2hhMjU2Ojc3ODEwZWYyOWUwZmIxZDI4OWQyMjVjYWJiOWVlNmNmNGQxMTk3OGEwMGJiOTlmN2Y4ZWMyMTMyYTg0ZTAxNjYgXAorICAgIC0taGFzaD1zaGEyNTY6N2NhNGYyNDM0MWRmMDcxODc3ODQ5ZWIyMDM0OTQ4NDU5Y2UzYTA3OTE1YzI3MzRmMWFiYjQwMThkOWM0OWQ3YiBcCisgICAgLS1oYXNoPXNoYTI1Njo3Zjc4NGUxM2U1OThlOTU5NDc1MGIyZWY2NzI5YmNkNWE0N2Y2Y2ZlNGExMmNjYTEzZGVmMzVlMDZkODE2M2UzIFwKKyAgICAtLWhhc2g9c2hhMjU2OjgwNmRkNjQyMzBkYmJmYWNhOGEyN2ZhYTY0ZTJmNDE0YmYxYzY2MjJhYjc4Y2M0MjY0ZjdmNWYwMjhmZWUzYmYgXAorICAgIC0taGFzaD1zaGEyNTY6ODY3ZTM2NDRlMjA4Yzg5MjJhM2JlMjZmYzZiYmYxMTJhMDM1ZjUwZjBhODY0OTdmOThmMjI4YzUwYzYwN2JiMiBcCisgICAgLS1oYXNoPXNoYTI1Njo4YzY2ZDZmZWM0NjdlOGMwZjk3NTgxOGMxNzk2ZDI1YzUzNTIxMTI0YjdjZmI3NjAxMTRiZTBhYmFkNTNhMGEyIFwKKyAgICAtLWhhc2g9c2hhMjU2OjhlZDA3YTkwZjU0NTBkOTlkYWQ2MGQzNzk5ZjljMDNjNjU2NjcwOWJkNTNiNDk3ZWI5Y2NhZDlhNTU4NjdmMzYgXAorICAgIC0taGFzaD1zaGEyNTY6OWJjNmQxYTdmOGNlZGQ1MTljNGI3YjExNTZkOThlMDUxYjcyNmJmMTYwNzE1Yjc2OTEwNjY2MWQ1NjdiM2YwMyBcCisgICAgLS1oYXNoPXNoYTI1Njo5ZTE1OTFmNmFlOThiY2ZhYzJhNGJiZjkyMjFjMGI5MmFiNDk3NjIyMjhmMzgyODdmNmVlYjVmM2Y1NTkwNWNlIFwKKyAgICAtLWhhc2g9c2hhMjU2OjllODc1NjJiOTFmNjhkZDhiMWMzOTE0OWQwMzIzYjQyZTAwODJkYjdkZGI4ZTkzNGFiNGMyOTIwOTRkNTc1ZDYgXAorICAgIC0taGFzaD1zaGEyNTY6YTcwODFmZDE5YTZkNTczZTFhMDVlNjAwYzgyYTFjNDIxMDExZGI3OTM1ZWQwZDVjNDgzZTlkZDk2Yjk5Y2YxMyBcCisgICAgLS1oYXNoPXNoYTI1NjphODQ3NDcwM2JmZmM2NWNhMTU4NTNkNWZkNGQwNmIxODEzOGFlOTBjMTdjOGQxMjE2OTk2OGU5OThlNDQ4YmI1IFwKKyAgICAtLWhhc2g9c2hhMjU2OmFmMzZlMGFhNDVlMjVjOWY1N2JmNjg0YjExNzVlNTllYTA1ZDlhN2QzZThlODdiN2FlMWExZGEyNDZmMjc2N2UgXAorICAgIC0taGFzaD1zaGEyNTY6YjEyNDBmNzY3ZjY5ZDdjNGM4YTI5YWRkZTIzMTBiODcxMTUzZGY5YjI2YjVjYjJiNTRhNTYxYWM4NTE0NjQ4NSBcCisgICAgLS1oYXNoPXNoYTI1NjpiNGQzNjJlMTdiY2IwMDExNzM4YzJkODNlMGE2NWVhOGNlNjI3MDU3YjJmZGRhMzc2NzhmNDM3NGEzODJhMTM3IFwKKyAgICAtLWhhc2g9c2hhMjU2OmI4MzEyOTVlNTQ3Mjk1NDEwNGVjYjQ2Y2Q5OGMwOGI5OGI0OWM2OWZkYjcwNDA0ODNhZmY3OTlhNzU1YTczNzQgXAorICAgIC0taGFzaD1zaGEyNTY6YjhjMjc1ZjBhZTkwMDY5NDk2MDY4YzcxNDM4N2I0YTBlYmE1ZDUzMWFhY2UyNjk1NTlmZjJiNDM2NTVlZGQ1OCBcCisgICAgLS1oYXNoPXNoYTI1NjpiZGQyYjQ1YmYwNzlkOWFkOTAzNzcwNDhlMjc0N2EwYzgyMzUxOTg5YTIxNjU4MjFmMGM5NjgzMWI0YTJhNTRiIFwKKyAgICAtLWhhc2g9c2hhMjU2OmNjMDc0M2YwMzAyYjk0ZjM5N2E0YTY1YTY2MGQ0Y2QyNDI2NzQzOWViMTY0OTNmYjNjYWFkMmU0Mzg5YmNjYmIgXAorICAgIC0taGFzaD1zaGEyNTY6ZGE0YjBjNmM2OTlhMGFkNzNjODEwNzM2MzAzZjdmYmFlNDgzYmNiMDEyZTM4ZDdlYjA2YTVlM2I0MzJjOTgxYiBcCisgICAgLS1oYXNoPXNoYTI1NjpmMjVlMjgxMWE5YzkzMmU0Mzk0M2EyNjE1ZTY1ZmM0ODdhMGI2YjQ5MjE4ODk5ZTYyZTQyNmU3ZjBhNTdlZWRhIFwKKyAgICAtLWhhc2g9c2hhMjU2OmY3MzQ5N2U4YzM4Mjk1YWFhNDc0MWJkZmE0ZmRhMWE1YWVkZGE1NDczMDc0MzY5ZWNhMTA2MjY4MzU0NDU1MTEKICAgICAjIHZpYQogICAgICMgICAtciB0aGlyZF9wYXJ0eS9weXRob25fcmVxdWlyZW1lbnRzLmluCiAgICAgIyAgIGg1cHkKLSAgICAjICAgamF4CiAgICAgIyAgIG1sLWR0eXBlcwogICAgICMgICBvcHQtZWluc3VtCi0gICAgIyAgIHNjaXB5CiAgICAgIyAgIHRlbnNvcmJvYXJkCi0gICAgIyAgIHRlbnNvcmZsb3ctY3B1CisgICAgIyAgIHRlbnNvcmZsb3cKIG9hdXRobGliPT0zLjIuMiBcCiAgICAgLS1oYXNoPXNoYTI1Njo4MTM5ZjI5YWFjMTNlMjVkNTAyNjgwZTllMTk5NjNlODNmMTY4MzhkNDhhMGQ3MWMyODdmZTQwZTcwNjdmYmNhIFwKICAgICAtLWhhc2g9c2hhMjU2Ojk4NTljNDA5Mjk2NjJiZWM1ZDY0ZjM0ZDAxYzk5ZTA5MzE0OTY4MmEzZjM4OTE1ZGMwNjU1ZDVhNjMzZGQ5MTgKQEAgLTM0NCwxMDIgKzUyMiwxMTAgQEAKIG9wdC1laW5zdW09PTMuMy4wIFwKICAgICAtLWhhc2g9c2hhMjU2OjI0NTVlNTllMzk0N2QzYzI3NTQ3N2RmN2Y1MjA1YjMwNjM1ZTI2NmZlNmRjMzAwZTNkOWY5NjQ2YmZjZWExNDcgXAogICAgIC0taGFzaD1zaGEyNTY6NTlmNjQ3NWY3N2JiYzM3ZGNmN2NkNzQ4NTE5YzBlYzYwNzIyZTkxZTYzY2ExMTRlNjg4MjFjMGM1NGE0NjU0OQotICAgICMgdmlhCi0gICAgIyAgIGpheAotICAgICMgICB0ZW5zb3JmbG93LWNwdQotcGFja2FnaW5nPT0yMy4xIFwKLSAgICAtLWhhc2g9c2hhMjU2Ojk5NDc5M2FmNDI5NTAyYzRlYTJlYmY2YmY2NjQ2MjlkMDdjMWE5ZmU5NzRhZjkyOTY2ZTRiOGQyZGY3ZWRjNjEgXAotICAgIC0taGFzaD1zaGEyNTY6YTM5Mjk4MGQyYjZjZmZhNjQ0NDMxODk4YmU1NGIwMDQ1MTUxMzE5ZDFlN2VjMzRmMGNmZWQ0ODc2N2RkMzM0ZgotICAgICMgdmlhIHRlbnNvcmZsb3ctY3B1Ci1waWxsb3c9PTkuNS4wIFwKLSAgICAtLWhhc2g9c2hhMjU2OjA3OTk5ZjU4MzRiZGM0MDRjNDQyMTQ2OTQyYTJlY2FkZDFjYjYyOTJmNTIyOWY0ZWQzYjMxZTBhMTA4NzQ2YjEgXAotICAgIC0taGFzaD1zaGEyNTY6MDg1MmRkYjc2ZDg1ZjEyN2MxMzViNmRkMWYwYmI4OGRiYjllZTk5MGQyY2Q5YWE5ZTI4NTI2YzkzZTc5NGZiYSBcCi0gICAgLS1oYXNoPXNoYTI1NjoxNzgxYTYyNGMyMjljYjM1YTJhYzMxY2M0YTc3ZTI4Y2FmYzg5MDA3MzNhODY0ODcwYzQ5YmZlZWRhY2QxMDZhIFwKLSAgICAtLWhhc2g9c2hhMjU2OjFlNzcyM2JkOTBlZjk0ZWRhNjY5YTNjMmMxOWQ1NDk4NzRkZDViYWRhZWVmYWJlZmQyNjA1MzMwNGFiZTU3OTkgXAotICAgIC0taGFzaD1zaGEyNTY6MjI5ZTJjNzljMDBlODU5ODlhMzRiNTk4MWEyYjY3YWEwNzlmZDA4YzkwM2YwYWFlYWQ1MjJhMWQ2OGQ3OWU1MSBcCi0gICAgLS1oYXNoPXNoYTI1NjoyMmJhZjBjM2NmMGM3ZjI2ZTgyZDZlMWFkZjExODAyN2FmYjMyNWU3MDM5MjJjOGRmYzFkNWQwMTU2YmIyZWViIFwKLSAgICAtLWhhc2g9c2hhMjU2OjI1MmEwM2YxYmRkZGNlMDc3ZWZmMjM1NGMzODYxYmY0MzdjODkyZmIxODMyZjc1Y2U4MTNlZTk0MzQ3YWE5YjUgXAotICAgIC0taGFzaD1zaGEyNTY6MmRmYWFmMTBiNjE3MjY5N2I5YmNlYjlhM2JkN2I5NTE4MTlkMWNhMzM5YTVlZjI5NGQxZjFhYzZkN2Y2MzI3MCBcCi0gICAgLS1oYXNoPXNoYTI1NjozMjI3MjRjMDAzMmFmNjY5MjQ1NmNkNmVkNTU0YmI4NWY4MTQ5MjE0ZDk3Mzk4YmI4MDYxM2IwNGUzMzc2OWY2IFwKLSAgICAtLWhhc2g9c2hhMjU2OjM1ZjZlNzcxMjJhMGMwNzYyMjY4MjE2MzE1YmYyMzljZjUyYjg4ODY1YmJhNTIyOTk5ZGMzOGYxYzUyYjliNDcgXAotICAgIC0taGFzaD1zaGEyNTY6Mzc1ZjZlNWVlOTYyMGEyNzFhY2I2ODIwYjNkMWU5NGZmYThlNzQxYzA2MDFkYjRjMGM0ZDNjYjBhOWMyMjRiZiBcCi0gICAgLS1oYXNoPXNoYTI1NjozZGVkNDJiOWFkNzBlNWYxNzU0ZmI3YzJlMmQ2NDY1YTljODQyZTQxZDE3OGYyNjJlMDhiOGM4NWVkOGExZDhlIFwKLSAgICAtLWhhc2g9c2hhMjU2OjQzMmI5NzVjMDA5Y2Y2NDk0MjA2MTUzODg1NjFjMGNlN2NjMzFjZTliMmUzNzRkYjY1OWVlNGY3ZDU3YTFmOGIgXAotICAgIC0taGFzaD1zaGEyNTY6NDgyODc3NTkyZTkyN2ZkMjYzMDI4YzEwNWIzNjI3MjM5OGUzZTFiZTMyNjllZmRhMDlmNmJhMjFmZDgzZWM2NiBcCi0gICAgLS1oYXNoPXNoYTI1Njo0ODlmODM4OTI2MWU1ZWQ0M2FjOGZmN2I0NTMxNjJhZjM5YzNlOGFiZDczMGFmODM2MzU4N2JhNjRiYjJlODY1IFwKLSAgICAtLWhhc2g9c2hhMjU2OjU0ZjcxMDJhZDMxYTNkZTU2NjY4Mjc1MjZlMjQ4YzM1MzBiM2EzMzUzOWRiZGEyN2M2ODQzZDE5ZDcyNjQ0ZWMgXAotICAgIC0taGFzaD1zaGEyNTY6NTYwNzM3ZTcwY2I5YzYyNTVkNmRjYmEzZGU2NTc4YTllMmVjNGI1NzM2NTk5NDNhNWU3ZTRhZjEzZjI5OGY1YyBcCi0gICAgLS1oYXNoPXNoYTI1Njo1NjcxNTgzZWFiODRhZjA0NmEzOTdkNmQwYmEyNTM0M2MwMGNkNTBiY2UwMzc4Nzk0OGUwZmZmMDFkNGZkOWIxIFwKLSAgICAtLWhhc2g9c2hhMjU2OjViYTFiODFlZTY5NTczZmU3MTI0ODgxNzYyYmI0Y2QyZTRiNmVkOWRkMjhjOWM2MGE2MzI5MDJmZThkYjhiMzggXAotICAgIC0taGFzaD1zaGEyNTY6NWQ0ZWJmOGUxZGI0NDQxYTU1YzUwOWM0YmFhN2EwNTg3YTAyMTBmN2NkMjVmY2ZlNzRkYmJjZTdhNGJkMTkwNiBcCi0gICAgLS1oYXNoPXNoYTI1Njo2MDAzN2E4ZGI4NzUwZTQ3NGFmN2ZmYzlmYWE5YjU4NTllNmM2ZDBhNTBlNTVjNDU1NzZiZjI4YmU3NDE5NzA1IFwKLSAgICAtLWhhc2g9c2hhMjU2OjYwODQ4OGJkY2JkYjRiYTc4Mzc0NjE0NDJiOTBlYTZmMzA3OTM5N2RkYzk2OGMzMTI2NWMxZTA1Njk2NGYxZWYgXAotICAgIC0taGFzaD1zaGEyNTY6NjYwOGZmM2JmNzgxZWVlMGNkMTRkMDkwMWEyYjljYzNkMzgzNDUxNjUzMmUzYmQ2NzNhMGEyMDRkYzg2MTVmYyBcCi0gICAgLS1oYXNoPXNoYTI1Njo2NjJkYTFmM2Y4OWEzMDJjYzIyZmFhOWYxNGEyNjJjMmUzOTUxZjlkYmM5NjE3NjA5YTQ3NTIxYzY5ZGQ5ZjhmIFwKLSAgICAtLWhhc2g9c2hhMjU2OjcwMDJkMDc5N2EzZTQxOTNjN2NkZWUzMTk4ZDdjMTRmOTJjMDgzNmQ2YjRhM2YzMDQ2YTY0YmQxY2U4ZGYyYmYgXAotICAgIC0taGFzaD1zaGEyNTY6NzYzNzgyYjJlMDNlNDVlMmM3N2Q3Nzc5ODc1ZjQ0MzJlMjUxMjFlZjAwMmE0MTgyOWQ4ODY4NzAwZDExOTM5MiBcCi0gICAgLS1oYXNoPXNoYTI1Njo3NzE2NWM0YTVlN2Q1YTI4NGYxMGE2ZWZhYTM5YTBhZThiYTgzOWRhMzQ0ZjIwYjExMWQ2MmNjOTMyZmE0ZTVkIFwKLSAgICAtLWhhc2g9c2hhMjU2OjdjOWFmNWEzYjQwNmE1MGUzMTM0NjdlMzU2NWZjOTk5Mjk3MTdmNzgwMTY0ZmU2ZmJiNzcwNGVkYmEwY2ViYmUgXAotICAgIC0taGFzaD1zaGEyNTY6N2VjNmY2Y2U5OWRhYjkwYjUyZGEyMWNmMGRjNTE5ZTIxMDk1ZTMzMmZmM2IzOTlhMzU3YzE4N2IxYTVlZWUzMiBcCi0gICAgLS1oYXNoPXNoYTI1Njo4MzNiODZhOThlMGVkZTM4OGZhMjkzNjMxNTljOWIxYTI5NGIwOTA1YjUxMjhiYWYwMWRiNjgzNjcyZjIzMGY1IFwKLSAgICAtLWhhc2g9c2hhMjU2Ojg0YTZmMTljZTA4NmMxYmY4OTQ2NDRiNDNjZDEyOTcwMmY3ODFiYTU3NTFjYTg1NzJmMDhhYTQwZWYwYWI3YjcgXAotICAgIC0taGFzaD1zaGEyNTY6ODUwN2VkYTNjZDA2MDhhMWY5NGY1OGM2NDgxN2U4M2VjMTJmYTkzYTk0MzY5MzhiMTkxYjgwZDllNGMwZmM0NCBcCi0gICAgLS1oYXNoPXNoYTI1Njo4NWVjNjc3MjQ2NTMzZTI3NzcwYjBkZTVjZjBmOWQ2ZTRlYzBjMjEyYTFmODlkZmM5NDFiNjRiMjEyMjYwMDlkIFwKLSAgICAtLWhhc2g9c2hhMjU2OjhhY2ExMTUyZDkzZGNjMjdkYzU1Mzk1NjA0ZGNmYzU1YmVkNWYyNWVmNGM5ODcxNmE5MjhiYWNiYTkwZDMzYTMgXAotICAgIC0taGFzaD1zaGEyNTY6OGQ5MzVmOTI0YmJhYjhmMGE5YTI4NDA0NDIyZGE4YWY0OTA0ZTM2ZDVjMzNmYzZmNjc3ZTRjNDQ4NTUxNTYyNSBcCi0gICAgLS1oYXNoPXNoYTI1Njo4ZjM2Mzk3YmYzZjdkN2M2YTNhYmRlYTgxNWVjZjZmZDE0ZTdmY2Q0NDE4YWIyNGJhZTAxMDA4ZDhkOGNhMTVlIFwKLSAgICAtLWhhc2g9c2hhMjU2OjkxZWM2ZmU0N2I1ZWI1YTk5NjhjNzlhZDllZDc4YzM0MmIxZjk3YTA5MTY3N2JhMGUwMTI3MDFhZGQ4NTc4MjkgXAotICAgIC0taGFzaD1zaGEyNTY6OTY1ZTRhMDVlZjM2NGU3Yjk3M2RkMTdmYzc2NWY0MjIzMzQxNTk3NGQ3NzNlODIxNDRjOWJiYWFhZWE1ZDA4OSBcCi0gICAgLS1oYXNoPXNoYTI1Njo5NmU4ODc0NWE1NWI4OGE3YzY0ZmE0OWJjZWZmMzYzYTFhMjdkOWE2NGUwNDAxOWMyMjgxMDQ5NDQ0YTU3MWUzIFwKLSAgICAtLWhhc2g9c2hhMjU2Ojk5ZWI2Y2FmYjZiYTkwZTQzNjY4NGUwOGRhZDhiZTE2MzdlZmI3MWM0ZjIxODBlZTZiOGY5NDA3Mzk0MDZlNzggXAotICAgIC0taGFzaD1zaGEyNTY6OWFkZjU4ZjVkNjRlNDc0YmVkMDBkNjliY2Q4NmVjNGJjYWE0MTIzYmZhNzBhNjVjZTcyZTQyNGJmYjg4ZWQ5NiBcCi0gICAgLS1oYXNoPXNoYTI1Njo5YjFhZjk1YzNhOTY3YmYxZGE5NGYyNTNlNTZiNjI4NmI1MGFmMjMzOTJhODg2NzIwZjU2M2M1NDdlNDhlOTY0IFwKLSAgICAtLWhhc2g9c2hhMjU2OmEwYWE5NDE3OTk0ZDkxMzAxMDU2ZjNkMDAzOGFmMTE5OWViN2FkYzg2ZTY0NmEzNmI5ZTA1MGIwNmY1MjY1OTcgXAotICAgIC0taGFzaD1zaGEyNTY6YTBmOWJiNmM4MGU2ZWZjZGU5M2ZmYzUxMjU2ZDVjZmIyMTU1ZmY4Zjc4MjkyZjA3NGY2MGY5ZTcwYjk0MmQ5OSBcCi0gICAgLS1oYXNoPXNoYTI1NjphMTI3YWU3NjA5Mjk3NGFiZmJmYTM4Y2EyZDEyY2JlZGRjZGVhYzBmYjcxZjk2MjdjYzExMzViZWRhZjlkNTFhIFwKLSAgICAtLWhhc2g9c2hhMjU2OmFhZjMwNWQ2ZDQwYmQ5NjMyMTk4Yzc2NmZiNjRmMGMxYTgzY2E1YjY2N2YxNmMxZTc5ZTE2NjFhYjUwNjAxNDAgXAotICAgIC0taGFzaD1zaGEyNTY6YWNhMWMxOTZmNDA3ZWM3Y2YwNGRjYmIxNWQxOWE0M2M1MDdhODFmN2ZmYzQ1YjY5MDg5OWQ2YTc2YWM5ZmRhNyBcCi0gICAgLS1oYXNoPXNoYTI1NjphY2U2Y2EyMTgzMDg0NDdiOTA3N2MxNGVhNGVmMzgxYmEwYjY3ZWU3OGQ2NDA0NmIzZjE5Y2Y0ZTExMzlhZDE2IFwKLSAgICAtLWhhc2g9c2hhMjU2OmI0MTZmMDNkMzdkMjcyOTBjYjkzNTk3MzM1YTJmODVlZDQ0NjczMTIwMDcwNWIyMmJiOTI3NDA1MzIwZGU5MDMgXAotICAgIC0taGFzaD1zaGEyNTY6YmY1NDg0NzlkMzM2NzI2ZDdhMGVjZWI2ZTc2N2UxNzlmYmRlMzc4MzNhZTQyNzk0NjAyNjMxYTA3MGQ2MzBmMSBcCi0gICAgLS1oYXNoPXNoYTI1NjpjMTE3MGQ2YjE5NTU1NTY0NGYwNjE2ZmQ2ZWQ5MjlkZmNmNjMzM2I4Njc1ZmNjYTA0NGFlNWFiMTEwZGVkMjk2IFwKLSAgICAtLWhhc2g9c2hhMjU2OmMzODBiMjdkMDQxMjA5Yjg0OWVkMjQ2YjExMWI3YzE2NmJhMzZkNzkzM2VjNmU0MTE3NWZkMTVhYjllYjE1NzIgXAotICAgIC0taGFzaD1zaGEyNTY6YzQ0NmQyMjQ1YmEyOTgyMGQ0MDUzMTUwODNkNTUyOTlhNzk2Njk1ZDc0N2VmY2ViNTcxN2E4YjQ1MDMyNDExNSBcCi0gICAgLS1oYXNoPXNoYTI1NjpjODMwYTAyY2FlYjc4OTYzMzg2M2I0NjZiOWRlMTBjMDE1YmRlZDQzNGRlYjNlYzg3Yzc2OGU1Mzc1MmFkMjJhIFwKLSAgICAtLWhhc2g9c2hhMjU2OmNiODQxNTcyODYyZjYyOWI5OTcyNWViYWVjMzI4N2ZjNmQyNzViZTliMTQ0NDNlYTc0NmMxZGQzMjUwNTNjYmQgXAotICAgIC0taGFzaD1zaGEyNTY6Y2ZhNDU2MTI3N2Y2NzdlY2Y2NTFlMmIyMmRjNDNlOGY1MzY4Yjc0YTI1YThmN2QxZDRhM2EyNDNlNTczZjJkNCBcCi0gICAgLS1oYXNoPXNoYTI1NjpjZmNjMmM1M2MwNmYyY2NiODk3NmZiNWM3MWQ0NDhiZGQwYTA3ZDI2ZDhlMDdlMzIxYzEwMzQxNjQ0NGM3YWQxIFwKLSAgICAtLWhhc2g9c2hhMjU2OmQzYzZiNTRlMzA0YzYwYzQxODFkYTFjOWRhZGY4M2U0YTU0ZmQyNjZhOTljNzBiYTY0NmE5YmFhNjI2ODE5ZWIgXAotICAgIC0taGFzaD1zaGEyNTY6ZDNkNDAzNzUzYzlkNWFkYzA0ZDQ2OTRkMzVjZjAzOTFmMGYzZDU3YzhlMDAzMGFhYzA5ZDc2NzhmYTgwMzBhYSBcCi0gICAgLS1oYXNoPXNoYTI1NjpkOWMyMDZjMjliNDZjZmQzNDNlYTdjZGZlMTIzMjQ0MzA3MmJiYjI3MGQ2YTQ2ZjU5YzI1OTQ2MGRiNzY3NzlhIFwKLSAgICAtLWhhc2g9c2hhMjU2OmU0OWViNGU5NWZmNmZkN2MwYzQwMjUwODg5NGIxZWYwZTAxYjk5YTQ0MzIwYmE3ZDhlY2JhYmVmZGRjYzU1NjkgXAotICAgIC0taGFzaD1zaGEyNTY6ZjgyODYzOTZiMzUxNzg1ODAxYTk3NmIxZTg1ZWE4OGU5Mzc3MTJlZTJjM2FjNjUzNzEwYTRhNTdhOGRhNWQ5YyBcCi0gICAgLS1oYXNoPXNoYTI1NjpmOGZjMzMwYzMzNzBhODFiYmYzZjg4NTU3MDk3ZDFlYTI2Y2Q4YjAxOWQ2NDMzYWE1OWY3MTE5NWY1ZGRlYmJmIFwKLSAgICAtLWhhc2g9c2hhMjU2OmZiZDM1OTgzMWMxNjU3ZDY5YmI4MWYwZGI5NjI5MDVlZTA1ZTVlOTQ1MTkxM2IxOGI4MzFmZWJmZTA1MTkwODIgXAotICAgIC0taGFzaD1zaGEyNTY6ZmU3ZTFjMjYyZDMzOTJhZmNmNTA3MWRmOWFmYTU3NDU0NGYyOGVhYzgyNTI4NDU5NmFjNmRiNTZlNmQxMTA2MiBcCi0gICAgLS1oYXNoPXNoYTI1NjpmZWQxZTFjZjZhNDI1Nzc5NTNhYmJlOGU2Y2YyZmUyZjU2NmRhZWJkZTdjMzQ3MjRlYzg4MDNjNGMwY2RhNTc5CisgICAgIyB2aWEgdGVuc29yZmxvdworcGFja2FnaW5nPT0yMy4yIFwKKyAgICAtLWhhc2g9c2hhMjU2OjA0OGZiMGU5NDA1MDM2NTE4ZWFhZjQ4YTU1OTUzYzc1MGMxMWUxYTFiNjhlMGRkMWE5ZDYyZWQwYzA5MmNmYzUgXAorICAgIC0taGFzaD1zaGEyNTY6OGM0OTExOTAwMzNhOWFmN2UxZDkzMWQwYjVkYWNjMmVmNDc1MDliMzRkZDBkZTY3ZWQyMDliNTIwM2ZjODhjNworICAgICMgdmlhIHRlbnNvcmZsb3cKK3BpbGxvdz09MTAuMi4wIFwKKyAgICAtLWhhc2g9c2hhMjU2OjAzMDQwMDRmODA2NzM4NmI0NzdkMjBhNTE4YjUwZjNmYTY1OGEyOGQ0NGU0MTE2OTcwYWJmY2Q5NGZhYzM0YTggXAorICAgIC0taGFzaD1zaGEyNTY6MDY4OWI1YThjNTI4OGJjMDUwNGQ5ZmNlZTQ4ZjYxYTZhNTg2YjliOTg1MTRkN2QyOWI4NDAxNDNkNjczNGYzOSBcCisgICAgLS1oYXNoPXNoYTI1NjowZWFlMjA3MzMwNWY0NTFkOGVjYWNiNTQ3NDk5N2MwODU2OWZiNGViNGFjMjMxZmZhNGFkN2QzNDJmZGMyNWFjIFwKKyAgICAtLWhhc2g9c2hhMjU2OjBmYjNlN2ZjODhhMTRlYWNkMzAzZTkwNDgxYWQ5ODNmZDViNjljNzYxZTllNmVmOTRjOTgzZjkxMDI1ZGE4NjkgXAorICAgIC0taGFzaD1zaGEyNTY6MTFmYTJlNTk4NGI5NDliMGRkNmQ3YTk0ZDk2Nzc0M2Q4N2M1NzdmZjBiODMzOTJmMTdjYjM5OTBkMGQyZmQ2ZSBcCisgICAgLS1oYXNoPXNoYTI1NjoxMjdjZWU1NzEwMzhmMjUyYTU1Mjc2MDA3NjQwN2Y5Y2ZmNzk3NjFjM2Q0MzZhMTJhZjYwMDBjZDE4MmE5ZDA0IFwKKyAgICAtLWhhc2g9c2hhMjU2OjE1NGU5MzljNWYwMDUzYTM4M2RlNGZkM2QzZGE0OGQ5NDI3YTdlOTg1ZjU4YWY4ZTk0ZDBiM2M5ZmNmY2Y0ZjkgXAorICAgIC0taGFzaD1zaGEyNTY6MTU1ODc2NDNiOWU1ZWIyNmM0OGU0OWE3YjMzNjU5NzkwZDI4ZjE5MGZjNTE0YTMyMmQ1NWRhMmZiNWMyOTUwZSBcCisgICAgLS1oYXNoPXNoYTI1NjoxNzBhZWIwMDIyNGFiM2RjNTQyMzBjNzk3Zjg0MDQ1MDcyNDBkZDg2OGNmNTIwNjZmNjZhNDFiMzMxNjliZGJlIFwKKyAgICAtLWhhc2g9c2hhMjU2OjFiNWUxYjc0ZDFiZDFiNzhiYzM0Nzc1Mjg5MTk0MTQ4NzQ3NDhkZDM2M2U2MjcyZWZkNWFiZjc2NTRlNjhiZWYgXAorICAgIC0taGFzaD1zaGEyNTY6MWRhM2IyNzAzYWZkMDQwY2Y2NWVjOTdlZmVhODFjZmJhNTljZGJlZDljMTFkOGVmYzVhYjA5ZGY5NTA5ZmM1NiBcCisgICAgLS1oYXNoPXNoYTI1NjoxZTIzNDEyYjVjNDFlNThjZWM2MDJmMTEzNWM1N2RmY2YxNTQ4MjAxM2NlNmU1ZjA5M2E4NmRiNjk2NDZhNWFhIFwKKyAgICAtLWhhc2g9c2hhMjU2OjIyNDcxNzhlZmZiMzRhNzdjMTFjMGU4YWMzNTVjN2E3NDFjZWNhMGE3MzJiMjdiZjExZTc0N2JiYzk1MDcyMmYgXAorICAgIC0taGFzaD1zaGEyNTY6MjU3ZDg3ODhkZjVjYTYyYzk4MDMxNDA1MzE5N2Y0ZDQ2ZWVmZWRmNGU2MTc1YmM5NDEyZjE0NDEyZWM0ZWEyZiBcCisgICAgLS1oYXNoPXNoYTI1NjozMDMxNzA5MDg0YjZlNzg1MmQwMDQ3OWZkMWQzMTBiMDdkMGJhODI3NjVmOTczYjU0M2M4YWY1MDYxY2Y5OTBlIFwKKyAgICAtLWhhc2g9c2hhMjU2OjMyMjIwOWM2NDJhYWJkZDYyMDc1MTdlOTczOWM3MDRkYzlmOWRiOTQzMDE1NTM1NzgzMjM5MDIyMDAyZjA1NGEgXAorICAgIC0taGFzaD1zaGEyNTY6MzIyYmRmM2M5YjU1NmU5ZmZiMThmOTM0NjJlNWY3NDlkMzQ0NGNlMDgxMjkwMzUyYzYwNzBkMDE0YzkzZmViMiBcCisgICAgLS1oYXNoPXNoYTI1NjozMzg3MGRjNDY1M2M1MDE3YmY0Yzg4NzNlNTQ4OGQ4ZjhkNWY4OTM1ZTJmMWZiOWEyMjA4YzQ3Y2RkNjZlZmQyIFwKKyAgICAtLWhhc2g9c2hhMjU2OjM1YmI1MmMzN2YyNTZmNjYyYWJkZmE0OWQyZGZhNmNlNWQ5MzI4MWQzMjNhOWFmMzc3YTEyMGU4OWE5ZWFmYjUgXAorICAgIC0taGFzaD1zaGEyNTY6M2MzMTgyMjMzOTUxNmZiM2M4MmQwM2YzMGUyMmIxZDAzOGRhODdlZjI3YjZhNzhjOTU0OTg4OGY4Y2VkYTM5YSBcCisgICAgLS1oYXNoPXNoYTI1NjozZWVkZDUyNDQyYzBhNWZmNGY4ODdmYWIwYzFjMGJiMTY0ZDg2MzViMzJjODk0YmMxZmFmNGM2MThkZDg5ZGYyIFwKKyAgICAtLWhhc2g9c2hhMjU2OjNmZjA3NGZjOTdkZDRlODA1NDNhM2U5MWY2OWQ1ODg4OWJhZjIwMDJiNmJlNjQzNDdlYThjZjU1MzMxODgyMTMgXAorICAgIC0taGFzaD1zaGEyNTY6NDdjMDk5NWZjNGU3Zjc5YjVjZmNhYjFmYzQzN2ZmMjg5MGI3NzA0NDBmNzY5NmEzYmEwNjVlZTBmZDQ5NjU2MyBcCisgICAgLS1oYXNoPXNoYTI1Njo0OWQ5YmExZWQwZWYzZTA2MTA4OGNkMWU3NTM4YTA3NTlhYWI1NTllMmUwYTgwYTM2ZjlmZDlkOGMwYzIxNTkxIFwKKyAgICAtLWhhc2g9c2hhMjU2OjUxZjFhMWJmZmM1MGUyZTk0OTJlODdkOGUwOWExN2M1ZWVhODQwOWNkYThkM2YyNzdlYjZlZGM4MjgxM2MxN2MgXAorICAgIC0taGFzaD1zaGEyNTY6NTJhNTBhYTNmYjNhY2I5Y2Y3MjEzNTczZWY1NWQzMWQ2ZWNhMzdmNTcwOWM2OWU2ODU4ZmUzYmMwNGE1YzJhMiBcCisgICAgLS1oYXNoPXNoYTI1Njo1NGYxODUyY2Q1MzFhYTk4MWJjMDk2NWI3ZDYwOWY1ZjZjYzhjZThjNDFiMTEzOWY2ZWQ2YjNjNTRhYjgyYmZiIFwKKyAgICAtLWhhc2g9c2hhMjU2OjYwOTQ0ODc0MjQ0NGQ5MjkwZmQ2ODc5NDBhYzBiNTdmYjM1ZTZmZDkyYmRiNjUzODZlMDhlOTlhZjYwYmY3NTcgXAorICAgIC0taGFzaD1zaGEyNTY6NjlmZmRkNjEyMGE0NzM3NzEwYTllZWU3M2UxZDJlMzdkYjg5YjYyMGY3MDI3NTRiOGY2ZTYyNTk0NDcxZGVlMCBcCisgICAgLS1oYXNoPXNoYTI1Njo2ZmFkNWZmMmYxM2Q2OWI3ZTc0Y2U1YjRlY2QxMmNjMGVjNTMwZmNlZTc2MzU2Y2FjNjc0Mjc4NWZmNzFjNDUyIFwKKyAgICAtLWhhc2g9c2hhMjU2OjcwNDllMzAxMzk5MjczYTAxMzZmZjM5Yjg0YzM2NzhlMzE0ZjIxNThmNTBmNTE3YmM1MDI4NWZiNWVjODQ3YWQgXAorICAgIC0taGFzaD1zaGEyNTY6NzBjNjFkNGM0NzU4MzVhMTliM2E1YWE0MjQ5MjQwOTg3OGJiY2E3NDM4NTU0YTFmODlkMjBkNThhN2M3NWMwMSBcCisgICAgLS1oYXNoPXNoYTI1Njo3MTZkMzBlZDk3N2JlOGIzN2QzZWYxODVmZWNiOWU1YTFkNjJkMTEwZGZiZGNkMWUyYTEyMmFiNDZmZGRiMDNmIFwKKyAgICAtLWhhc2g9c2hhMjU2Ojc1M2NkOGYyMDg2YjJiODAxODBkOWIzMDEwZGQ0ZWQxNDdlZmMxNjdjOTBkM2JmNTkzZmUyYWYyMTI2NWU1YTUgXAorICAgIC0taGFzaD1zaGEyNTY6NzczZWZlMDYwM2RiMzBjMjgxNTIxYTdjMDIxNGNhZDc4MzZjMDNiOGNjZmY4OTdiZWFlOWI0N2MwYjY1N2Q2MSBcCisgICAgLS1oYXNoPXNoYTI1Njo3ODIzYmRkMDQ5MDk5ZWZhMTZlNDI0NmJkZjE1ZTVhMTNkYmIxOGE1MWI2OGZhMDZkNmMxZDRkOGI5OWE3OTZlIFwKKyAgICAtLWhhc2g9c2hhMjU2OjdjOGY5N2U4ZTdhOTAwOWJjYWNiZTM3NjZhMzYxNzUwNTZjMTJmOWE0NGU2ZTZmMmQ1Y2FhZDA2ZGNmYmYwM2IgXAorICAgIC0taGFzaD1zaGEyNTY6ODIzZWY3YTI3Y2Y4NmRmNjU5N2ZhMDY3MTA2NmMxYjU5NmY2OWViYTUzZWZhM2QxZTFjYjhiMzBmMzUzMzA2OCBcCisgICAgLS1oYXNoPXNoYTI1Njo4MzczYzZjMjUxZjdlZjhiZGE2Njc1ZGQ2ZDJiM2EwZmNjMzFlZGYxMjAxMjY2YjVjZjYwOGI2MmEzNzQwN2Y5IFwKKyAgICAtLWhhc2g9c2hhMjU2OjgzYjIwMjFmMmFkZTdkMWVkNTU2YmM1MGEzOTkxMjdkN2ZiMjQ1ZTcyNWFhMDExM2ViZDA1Y2ZlODhhYWY1ODggXAorICAgIC0taGFzaD1zaGEyNTY6ODcwZWExYWRhMDg5OWZkMGI3OTY0Mzk5MDgwOTMyM2IzODlkNGQxZDQ2YzE5MmY5NzM0MmVlYjZlZTBiODQ4MyBcCisgICAgLS1oYXNoPXNoYTI1Njo4ZDEyMjUxZjAyZDY5ZDgzMTBiMDQ2ZTgyNTcyZWQ0ODY2ODVjMzhmMDIxNzZiZDA4YmFmMjE2NzQ2ZWI5NDdmIFwKKyAgICAtLWhhc2g9c2hhMjU2OjljMjNmMzA3MjAyNjYxMDcxZDk0YjVlMzg0ZTFlMWRjN2RmYjk3MmEyOGEyMzEwZTRlZTE2MTAzZTY2ZGRiNjcgXAorICAgIC0taGFzaD1zaGEyNTY6OWQxODk1NTA2MTViNDk0OGY0NTI1MmQ3ZjAwNWU1M2MyMDQwY2VhMWFmNWI2MGQ2Zjc5NDkxYTZlMTQ3ZWVmNyBcCisgICAgLS1oYXNoPXNoYTI1NjphMDg2YzJhZjQyNWM1ZjYyYTY1ZTEyZmJmMzg1ZjdjOWZjYjhmMTA3ZDA4NDlkYmE1ODM5NDYxYTEyOWNmMzExIFwKKyAgICAtLWhhc2g9c2hhMjU2OmEyYjU2YmEzNmUwNWY5NzNkNDUwNTgyZmIwMTU1OTRhYWE3ODgzNGZlZmU4ZGZiOGZjZDc5YjkzZTY0YmE0YzYgXAorICAgIC0taGFzaD1zaGEyNTY6YWViYjYwNDQ4MDZmMmUxNmVjYzA3YjJhMjYzN2VlMWVmNjdhMTE4NDBhNjY3NTI3NTE3MTRhMGQ5MjRhZGY3MiBcCisgICAgLS1oYXNoPXNoYTI1NjpiMWIzMDIwZDkwYzJkOGUxZGFlMjljZjNjZTU0ZjgwOTRmNzkzODQ2MGZiNWNlOGJjNWMwMTQ1MGIwMWZiYWY2IFwKKyAgICAtLWhhc2g9c2hhMjU2OmI0YjZiMWUyMDYwODQ5MzU0OGIxZjMyYmNlOGNjYTE4NWJmMDQ4MDk4Mzg5MDQwM2QzYjg3NTNlNDQwNzcxMjkgXAorICAgIC0taGFzaD1zaGEyNTY6YjZmNDkxY2RmODBhZTU0MDczODg1OWQ5NzY2NzgzZTNiM2M4ZTViZDM3ZjVkZmEwYjc2YWJkZWNjNTA4MWYxMyBcCisgICAgLS1oYXNoPXNoYTI1NjpiNzkyYTM0OTQwNWZiYzAxNjMxOTBmZGUwZGM3YjNmZWYzYzkyNjgyOTI1ODZjZjU2NDU1OThiNDhlNjNkYzY3IFwKKyAgICAtLWhhc2g9c2hhMjU2OmI3YzIyODZjMjNjZDM1MGI4MGQyZmM5ZDQyNGZjNzk3NTc1ZmIxNmY4NTRiODMxZDE2ZmQ0N2NlZWMwNzhmMmMgXAorICAgIC0taGFzaD1zaGEyNTY6YmFiZjVhY2ZlZGU1MTVmMTc2ODMzZWQ2MDI4NzU0Y2JjZDBkMjA2ZjdmNjE0ZWEzNDQ3ZDY3YzMzYmUxMjUxNiBcCisgICAgLS1oYXNoPXNoYTI1NjpjMzY1ZmQxNzAzMDQwZGUxZWMyODRiMTc2ZDZhZjVhYmUyMWI0MjdjYjNhNWZmNjhlMDc1OWUxZTMxM2E1ZTdlIFwKKyAgICAtLWhhc2g9c2hhMjU2OmM0MjI1ZjUyMjBmNDZiMmZkZTU2OGM3NGZjYTI3YWU5NzcxNTM2YzJlMjlkN2MwNGY0ZmI2MmM4MzI3NWFjNGUgXAorICAgIC0taGFzaD1zaGEyNTY6YzU3MGYyNGJlMWU0NjhlM2YwY2U3ZWY1NmE4OWE2MGYwZTA1YjMwYTM2NjlhNDU5ZTQxOWM2ZWFjMmMzNTM2NCBcCisgICAgLS1oYXNoPXNoYTI1NjpjNmRhZmFjOWUwZjJiM2M3OGRmOTdlNzlhZjcwN2NkYzVlZjhlODgyMDhkNjg2YTQ4NDdiYWI4MjY2ODcwMDIzIFwKKyAgICAtLWhhc2g9c2hhMjU2OmM4ZGUyNzg5MDUyZWQ1MDFkZDgyOWU5Y2FlOGQzZGNjZTdhY2I0Nzc3ZWE0YTQ3OWMxNDUyMWM5NDJkMzk1YjEgXAorICAgIC0taGFzaD1zaGEyNTY6Y2IyOGM3NTNmZDVlYjNkZDg1OWI0ZWU5NWRlNjZjYzYyYWY5MWJjZmY1ZGI1ZjI1NzFkMzJhNTIwYmFmMWYwNCBcCisgICAgLS1oYXNoPXNoYTI1NjpjYjRjMzhhYmVlZjEzYzYxZDY5MTZmMjY0ZDQ4NDVmYWI5OWQ3YjcxMWJlOTZjMzI2Yjg0ZGY5ZTNlMGZmNjJkIFwKKyAgICAtLWhhc2g9c2hhMjU2OmQxYjM1YmNkNmM1NTQzYjljYjU0N2RlZTMxNTBjOTMwMDhmOGRkMGYxZmVmNzhmYzBjZDJiMTQxYzViYWY1OGEgXAorICAgIC0taGFzaD1zaGEyNTY6ZDhlNmFlYjkyMDFlNjU1MzU0YjNhZDA0OWNiNzdkMTk4MTNhZDRlY2UwZGYxMjQ5ZDNjNzkzZGUzNzc0ZjhjNyBcCisgICAgLS1oYXNoPXNoYTI1NjpkOGVjZDA1OWZkYWY2MGMxOTYzYzU4Y2ViODk5N2IzMmU5ZGMxYjkxMWY1ZGE1MzA3YWFiNjE0ZjFjZTVjMmZiIFwKKyAgICAtLWhhc2g9c2hhMjU2OmRhMmI1MmIzN2RhZDZkOWVjNjRlNjUzNjM3YTA5NjkwNWIyNThkMmZjMmI5ODRjNDFhZTdkMDhiOTM4YTY3ZTQgXAorICAgIC0taGFzaD1zaGEyNTY6ZTg3ZjBiMmM3ODE1N2UxMmQ3Njg2YjI3ZDYzYzA3MGZkNjVkOTk0ZThkZGFlNmYzMjhlMGRjZjRhMGNkMDA3ZSBcCisgICAgLS1oYXNoPXNoYTI1NjplZGNhODBjYmZiMmI2OGQ3YjU2OTMwYjg0YTBlNDVhZTE2OTRhZWJhMDU0MWY3OThlOTA4YTQ5ZDY2YjgzN2YxIFwKKyAgICAtLWhhc2g9c2hhMjU2OmYzNzlhYmQyZjFlM2RkZGIyYjYxYmM2Nzk3N2E2YjVhMGEzZjc0ODU1MzhiY2M2ZjM5ZWM3NjE2Mzg5MWVlNDggXAorICAgIC0taGFzaD1zaGEyNTY6ZmU0YzE1ZjZjOTI4NWRjNTRjZTY1NTNhM2NlOTA4ZWQzN2M4ZjM4MjViNWE1MWExNWM5MTQ0MmJiOTU1Yjg2OAogICAgICMgdmlhIC1yIHRoaXJkX3BhcnR5L3B5dGhvbl9yZXF1aXJlbWVudHMuaW4KLXByb3RvYnVmPT00LjIzLjAgXAotICAgIC0taGFzaD1zaGEyNTY6MDNlZWUzNWI2MDMxNzExMmE3MmQxOWM1NGQwYmZmN2JjNThmZjEyZmVhNGNkN2IwMTgyMzJiZDk5NzU4ZmZkZiBcCi0gICAgLS1oYXNoPXNoYTI1NjoyYjk0YmQ2ZGY5MmQ3MWJkMTIzNGEyZmZlN2NlOTZkZGY2ZDEwY2Y2MzdhMThkNmI1NWFkMGE4OWZiYjdmYzIxIFwKLSAgICAtLWhhc2g9c2hhMjU2OjM2ZjUzNzBhOTMwY2I3N2M4YWQyZjQxMzU1OTBjNjcyZDBkMmM3MmQ0YTcwN2M3ZDAwNThkY2U0YjRiNGE1OTggXAotICAgIC0taGFzaD1zaGEyNTY6NWYxZWJhMWRhMmEyZjNmN2RmNDY5ZmNjZGRlZjNjYzA2MGI4YTE2Y2ZlM2NjNjU5NjFhZDM2YjRkYmNmNTljNSBcCi0gICAgLS1oYXNoPXNoYTI1Njo2YzE2NjU3ZDY3MTdhMGM2MmQ1ZDc0MGNiMzU0ZmJhZDFiMGQ4Y2I4MTE2NjllMDZmYzFjYWEwZmY0Nzk5ZGRkIFwKLSAgICAtLWhhc2g9c2hhMjU2OjZmZTE4MGI1NmUxMTY5ZDcyZWNjNGFjYmQzOTE4NjMzOWFlZDIwYWY1Mzg0NTMxYjhlODk3OWIwMmJiZWUxNTkgXAotICAgIC0taGFzaD1zaGEyNTY6N2NiNWI5YTA1Y2U1MmM2YTc4MmJiOTdkZTUyNjc5YmQzNDM4ZmYyYjc0NjBlZmY1ZGEzNDhkYjY1NjUwZjIyNyBcCi0gICAgLS1oYXNoPXNoYTI1Njo5NzQ0ZTkzNGVhNTg1NWQxMjE5MTA0MGVhMTk4ZWFmNzA0YWM3ODY2NWQzNjVhODlkOTU3MmUzYjYyN2MyNjg4IFwKLSAgICAtLWhhc2g9c2hhMjU2OjlmNWEwZmJmY2RjYzM2NGYzOTg2ZjllZDlmOGJiMTMyOGZiODQxMTRmZDc5MDQyM2ZmM2Q3ZmRiMGY4NWMyZDEgXAotICAgIC0taGFzaD1zaGEyNTY6YmFjYTQwZDA2N2RkZGQ2MjE0MWExMjlmMjQ0NzAzMTYwZDI3ODY0OGI1NjllOTBiYjBlMzc1MzA2NzY0NDcxMSBcCi0gICAgLS1oYXNoPXNoYTI1NjpkNWEzNWZmNTRlM2Y2MmU4ZmM3YmUwMmJiMGQyZmJjMjEyYmJhMWE1YTljYzI3NDgwOTA2OTAwOTM5OTZmMDdiIFwKLSAgICAtLWhhc2g9c2hhMjU2OmU2MmZiODY5NzYyYjRiYTE4NjY2MzcwZTJmOGExOGYxN2Y4YWI5MmRkNDQ2NzI5NWM2ZDM4YmU2ZjhmZWY2MGIgXAotICAgIC0taGFzaD1zaGEyNTY6ZWJkZTNhMDIzYjhlMTFiZmE2Yzg5MGVmMzRjZDZhOGI0N2Q1ODZmMjYxMzVlODZjMjEzNDRmZTQzM2RhZjJlMgorcGtnaW5mbz09MS45LjYgXAorICAgIC0taGFzaD1zaGEyNTY6NGI3YTU1NWE2ZDVhMjIxNjlmY2M5Y2Y3YmZkNzhkMjk2YjAzNjFhZGFkNDEyYTM0NmMxMjI2ODQ5YWY1ZTU0NiBcCisgICAgLS1oYXNoPXNoYTI1Njo4ZmQ1ODk2ZTg3MThhNDM3MmYwZWE5Y2M5ZDk2ZjY0MTdjOWI5ODZlMjNhNGQxMTZkZGEyNmI2MmNjMjlkMDQ2CisgICAgIyB2aWEgdHdpbmUKK3BsYXRmb3JtZGlycz09NC4xLjAgXAorICAgIC0taGFzaD1zaGEyNTY6MTFjOGYzN2JjY2E0MGRiOTZkODE0NDUyMmQ5MjU1ODNiZGI3YTMxZjdiMGUzN2UzZWQ0MzE4NDAwYThlMjM4MCBcCisgICAgLS1oYXNoPXNoYTI1Njo5MDZkNTQ4MjAzNDY4NDkyZDQzMmJjYjI5NGQ0YmMyZmZmNzUxYmY4NDk3MWZiYjJjMTA5MThjYzIwNmVlNDIwCisgICAgIyB2aWEgeWFwZgorcHJvdG9idWY9PTQuMjMuNCBcCisgICAgLS1oYXNoPXNoYTI1NjowYTU3NTlmNTY5Njg5NWRlOGNjOTEzZjA4NGUyN2ZkNDEyNWU4ZmIwOTE0YmI3MjlhMTc4MTZhMzM4MTlmNDc0IFwKKyAgICAtLWhhc2g9c2hhMjU2OjM1MWNjOTBmN2QxMDgzOWM0ODBhZWI5Yjg3MGEyMTFlMzIyYmYwNWY2YWIzZjU1ZmNiMmY1MTMzMWY4MGE3ZDIgXAorICAgIC0taGFzaD1zaGEyNTY6NWZlYTNjNjRkNDFlYTVlY2Y1Njk3YjgzZTQxZDA5Yjk1ODllNmYyMGI2NzdhYjNjNDhlNWYyNDJkOWI3ODk3YiBcCisgICAgLS1oYXNoPXNoYTI1Njo2ZGQ5Yjk5NDBlM2YxNzA3N2U4MjBiNzU4NTExMjY2MTVlZTM4NjQzYzJjNTMzMmFhN2EzNTk5ODg4MjBjNzIwIFwKKyAgICAtLWhhc2g9c2hhMjU2OjdiMTliNjI2NmQ5MmNhNmEyYTg3ZWZmYTg4ZWNjNGFmNzNlYmM1Y2ZkZTE5NGRjNzM3Y2Y4ZWYyM2E5YTNiMTIgXAorICAgIC0taGFzaD1zaGEyNTY6ODU0N2JmNDRmZThjZWMzYzY5ZTMwNDJmNWM0ZmIzZTM2ZWIyYTdhMDEzYmIwYTQ0YzAxOGZjMWU0MjdhYWZiZCBcCisgICAgLS1oYXNoPXNoYTI1Njo5MDUzZGY2ZGY4ZTVhNzZjODQzMzllZTRhOWY1YTI2NjFjZWVlNGEwZGFiMDE5ZTg2NjNjNTBiYTMyNDIwOGIwIFwKKyAgICAtLWhhc2g9c2hhMjU2OmMzZTA5Mzk0MzNjNDA3OTZjYTRjZmMwZmFjMDhhZjUwYjAwZWI2NmE0MGJiYmM1ZGVlNzExOTk4ZmIwYmJjMWUgXAorICAgIC0taGFzaD1zaGEyNTY6Y2NkOTQzMGMwNzE5ZGNlODA2YjkzZjg5YzkxZGU3OTc3MzA0NzI5ZTU1Mzc3Zjg3MmE5MjQ2NWQ1NDgzMjlhOSBcCisgICAgLS1oYXNoPXNoYTI1NjplMWM5MTU3NzhkOGNlZDcxZTI2ZmNmNDNjMDg2NmQ3NDk5ODkxYmNhMTRjNDM2ODQ0OGE4MmVkYzYxZmRiYzcwIFwKKyAgICAtLWhhc2g9c2hhMjU2OmU5ZDBiZTViZjM0YjI3NWI5Zjg3YmE3NDA3Nzk2NTU2YWJlZWJhNjM1NDU1ZDAzNmM3MzUxZjdjMTgzZWY4ZmYgXAorICAgIC0taGFzaD1zaGEyNTY6ZWZmZWFjNTFhYjc5MzMyZDQ0ZmJhNzQ2NjBkNDBhZTc5OTg1OTAxYWMyMWJjYTQwOGY4ZGMzMzVhODFhYTU5NyBcCisgICAgLS1oYXNoPXNoYTI1NjpmZWU4ODI2OWEwOTBhZGEwOWNhNjM1NTFiZjJmNTczZWIyNDI0MDM1YmNmMmNiMWIxMjE4OTViMDFhNDY1OTRhCiAgICAgIyB2aWEKICAgICAjICAgLXIgdGhpcmRfcGFydHkvcHl0aG9uX3JlcXVpcmVtZW50cy5pbgogICAgICMgICB0ZW5zb3Jib2FyZAotICAgICMgICB0ZW5zb3JmbG93LWNwdQotcHlhc24xPT0wLjUuMCBcCi0gICAgLS1oYXNoPXNoYTI1Njo4N2EyMTIxMDQyYTFhYzkzNThjYWJjYWYxZDA3NjgwZmY5N2VlNjQwNDMzM2JhY2NhMTVmNzZhYThhZDAxYTU3IFwKLSAgICAtLWhhc2g9c2hhMjU2Ojk3YjcyOTBjYTY4ZTYyYTgzMjU1OGVjMzk3NmYxNWNiZjkxMWJmNWQ3YzcwMzlkOGI4NjFjMmEwZWNlNjlmZGUKKyAgICAjICAgdGVuc29yZmxvdworcHlhc24xPT0wLjUuMSBcCisgICAgLS1oYXNoPXNoYTI1Njo0NDM5ODQ3YzU4ZDQwYjFkMGE1NzNkMDdlMzg1NmU5NTMzM2YxOTc2Mjk0NDk0YzMyNTc3NWFlY2E1MDZlYjU4IFwKKyAgICAtLWhhc2g9c2hhMjU2OjZkMzkxYTk2ZTU5YjIzMTMwYTVjZmE3NGQ2ZmQ3ZjM4OGRiYmUyNmNjOGYxZWRmMzlmZGRkZjA4ZDlkNjY3NmMKICAgICAjIHZpYQogICAgICMgICBweWFzbjEtbW9kdWxlcwogICAgICMgICByc2EKQEAgLTQ0NywxMjAgKzYzMywxMjQgQEAKICAgICAtLWhhc2g9c2hhMjU2OjViZDAxNDQ2YjczNmViOWQzMTUxMmEzMGQ0NmMxYWMzMzk1ZDY3NmM2ZjNjYWZhNGMwM2ViNTRiOTkyNTYzMWMgXAogICAgIC0taGFzaD1zaGEyNTY6ZDNjY2Q2ZWQ0NzBkOWZmYmM3MTZiZTA4YmQ5MGVmYmQ0NGQwNzM0YmM5MzAzODE4ZjczMzYwNzA5ODRhMTYyZAogICAgICMgdmlhIGdvb2dsZS1hdXRoCi1yZXF1ZXN0cz09Mi4zMC4wIFwKLSAgICAtLWhhc2g9c2hhMjU2OjEwZTk0Y2M0ZjMxMjFlZTZkYTUyOWQzNThjZGFlYWZmMmYxYzQwOWNkMzc3ZGJjNzJiODI1ODUyZjJmN2UyOTQgXAotICAgIC0taGFzaD1zaGEyNTY6MjM5ZDdkNDQ1OGFmY2IyOGE2OTJjZGQyOThkODc1NDIyMzVmNGNhOGQzNmQwM2ExNWJmYzEyOGE2NTU5YTJmNAorcHljcGFyc2VyPT0yLjIxIFwKKyAgICAtLWhhc2g9c2hhMjU2OjhlZTQ1NDI5NTU1NTE1ZTFmNmIxODVlNzgxMDBhZWEyMzQwNzI1NzZhYTQzYWI1M2FlZmNhZTA3ODE2MmZjYTkgXAorICAgIC0taGFzaD1zaGEyNTY6ZTY0NGZkZWMxMmY3ODcyZjg2YzU4ZmY3OTBkYTQ1NjIxOGIxMGY4NjM5NzAyNDk1MTZkNjBhNWVhY2E3NzIwNgorICAgICMgdmlhIGNmZmkKK3B5Z21lbnRzPT0yLjE3LjIgXAorICAgIC0taGFzaD1zaGEyNTY6YjI3YzI4MjZjNDdkMGYzMjE5ZjI5NTU0ODI0YzMwYzVlODk0NTE3NWQ4ODg2NDdhY2Q4MDRkZGQwNGFmODQ2YyBcCisgICAgLS1oYXNoPXNoYTI1NjpkYTQ2Y2VjOWZkMmRlNWJlM2E4YTc4NGY0MzRlNGM0YWI2NzBiNGZmNTRkNjA1YzRjMjcxN2U5ZDQ5YzRjMzY3CisgICAgIyB2aWEKKyAgICAjICAgcmVhZG1lLXJlbmRlcmVyCisgICAgIyAgIHJpY2gKK3JlYWRtZS1yZW5kZXJlcj09NDIuMCBcCisgICAgLS1oYXNoPXNoYTI1NjoxM2QwMzk1MTVjMWYyNGRlNjY4ZTJjOTNmMmU4NzdiOWRiZTZjNmMzMjMyOGI5MGE0MGE0OWQ4YjJiODVmMzZkIFwKKyAgICAtLWhhc2g9c2hhMjU2OjJkNTU0ODlmODNiZTQ5OTJmZTQ0NTQ5MzlkMWEwNTFjMzNlZGJhYjc3OGU4Mjc2MWQwNjBjOWZjNmIzMDhjZDEKKyAgICAjIHZpYSB0d2luZQorcmVxdWVzdHM9PTIuMzEuMCBcCisgICAgLS1oYXNoPXNoYTI1Njo1OGNkMjE4N2MwMWU3MGU2ZTI2NTA1YmNhNzUxNzc3YWE5ZjJlZTBiN2Y0MzAwOTg4YjcwOWY0NGUwMTMwMDNmIFwKKyAgICAtLWhhc2g9c2hhMjU2Ojk0MmM1YTc1OGY5OGQ3OTBlYWVkMWEyOWNiNmVlZmM3ZmZiMGQxY2Y3YWYwNWMzZDI3OTE2NTZkYmQ2YWQxZTEKICAgICAjIHZpYQogICAgICMgICByZXF1ZXN0cy1vYXV0aGxpYgorICAgICMgICByZXF1ZXN0cy10b29sYmVsdAogICAgICMgICB0ZW5zb3Jib2FyZAorICAgICMgICB0d2luZQogcmVxdWVzdHMtb2F1dGhsaWI9PTEuMy4xIFwKICAgICAtLWhhc2g9c2hhMjU2OjI1NzdjNTAxYTJmYjhkMDVhMzA0YzA5ZDA5MGQ2ZTQ3YzMwNmZlZjE1ODA5ZDEwMmIzMjdjZjgzNjRiZGRhYjUgXAogICAgIC0taGFzaD1zaGEyNTY6NzViZWFjNGE0Nzg4MWVlYjk0ZDVlYTVkNmFkMzFlZjg4ODU2YWZmZTIzMzJiOWFhZmI1MmM2NDUyY2NmMGQ3YQogICAgICMgdmlhIGdvb2dsZS1hdXRoLW9hdXRobGliCityZXF1ZXN0cy10b29sYmVsdD09MS4wLjAgXAorICAgIC0taGFzaD1zaGEyNTY6NzY4MWEwYTNkMDQ3MDEyYjViZGMwZWUzN2Q3ZjhmMDdlYmU3NmFiMDhjYWVjY2ZjMzkyMWNlMjNjODhkNWJjNiBcCisgICAgLS1oYXNoPXNoYTI1NjpjY2NmZGQ2NjVmMGEyNGZjZjQ3MjZlNjkwZjY1NjM5ZDI3MmJiMDYzN2I5YjkyZGZkOTFhNTU2OGNjZjZiZDA2CisgICAgIyB2aWEgdHdpbmUKK3JmYzM5ODY9PTIuMC4wIFwKKyAgICAtLWhhc2g9c2hhMjU2OjUwYjE1MDJiNjBlMjg5Y2IzNzg4M2YzZGZkMzQ1MzJiODg3M2M3ZGU5ZjQ5YmI1NDY2NDFjZTljYmQyNTZlYmQgXAorICAgIC0taGFzaD1zaGEyNTY6OTdhYWNmOWRiZDRiZmQ4MjliYWFkNmU2MzA5ZmE2NTczYWFmMWJlM2Y2ZmE3MzVjOGFiMDVlNDZjZWNiMjYxYworICAgICMgdmlhIHR3aW5lCityaWNoPT0xMy43LjAgXAorICAgIC0taGFzaD1zaGEyNTY6NWNiNTEyM2I1Y2Y5ZWU3MDU4NDI0NDI0NjgxNmU5MTE0MjI3ZTBiOThhZDkxNzZlZWRlNmFkNTRiZjU0MDNmYSBcCisgICAgLS1oYXNoPXNoYTI1Njo2ZGExNGMxMDhjNDg2NmVlOTUyMGJiZmZhNzFmNmZlMzk2MmUxOTNiN2RhNjg3MjA1ODM4NTBjZDQ1NDhlMjM1CisgICAgIyB2aWEgdHdpbmUKIHJzYT09NC45IFwKICAgICAtLWhhc2g9c2hhMjU2OjkwMjYwZDkwNThlNTE0Nzg2OTY3MzQ0ZDBlZjc1ZmE4NzI3ZWVkOGE3ZDJlNDNjZTlmNGJjZjFiNTM2MTc0ZjcgXAogICAgIC0taGFzaD1zaGEyNTY6ZTM4NDY0YTQ5YzZjODVkN2YxMzUxYjAxMjY2NjE0ODdhN2UwYTE0YTUwZjE2NzVlYzUwZWIzNGQ0ZjIwZWYyMQogICAgICMgdmlhIGdvb2dsZS1hdXRoCi1zY2lweT09MS4xMC4xIFwKLSAgICAtLWhhc2g9c2hhMjU2OjA0OWE4YmJmMGFkOTUyNzdmZmJhOWIzYjdkMjNlNTM2OWNjMzllNjY0MDZkNjA0MjJjOGNmZWY0MGNjYzg0MTUgXAotICAgIC0taGFzaD1zaGEyNTY6MDdjMzQ1N2NlMGIzYWQ1MTI0Zjk4YTg2NTMzMTA2YjY0M2RkODExZGQ2MWI1NDhlNzhjZjRjODc4NjY1MmY2ZiBcCi0gICAgLS1oYXNoPXNoYTI1NjowZjE1NjRlYTIxN2U4MmMxYmJlNzVkZGY3Mjg1YmEwNzA5ZWNkNTAzZjA0OGNiMTIzNmFlOTk5NWY2NDIxN2JkIFwKLSAgICAtLWhhc2g9c2hhMjU2OjE1NTNiNWRjZGRkNjRiYTlhMGQ5NTM1NWU2M2ZlNmMzZmMzMDNhOGZkNzdjN2JjOTFlNzdkNjEzNjNmNzQzM2YgXAotICAgIC0taGFzaD1zaGEyNTY6MTVhMzVjNDI0MmVjNWYyOTJjM2RkMzY0YTdjNzFhNjFiZTg3YTNkNGRkY2M2OTMzNzI4MTNjMGI3M2M5YWYxZCBcCi0gICAgLS1oYXNoPXNoYTI1NjoxYjQ3MzVkNmMyOGFhZDNjZGNmNTIxMTdlMGU5MWQ2YjM5YWNkNDI3MmYzZjVjZDk5MDdjMjRlZTkzMWFkNjAxIFwKLSAgICAtLWhhc2g9c2hhMjU2OjJjZjlkZmI4MGE3YjQ1ODliYTRjNDBjZTc1ODg5ODZkNmQ1Y2ViYzU0NTdjYWQyYzI4ODBmNmJjMmQ0MmYzYTUgXAotICAgIC0taGFzaD1zaGEyNTY6MzliZWNiMDM1NDFmOWU1ODI0M2Y0MTk3NTg0Mjg2ZTMzOTAyOWU4OTA4YzQ2ZjcyMjFhYmVlYTRiNzQ5ZmE4OCBcCi0gICAgLS1oYXNoPXNoYTI1Njo0M2I4ZTBiY2I4NzdmYWYwYWJmYjYxM2Q1MTAyNmNkNWNjNzg5MThlOTUzMGUzNzU3MjdiZjA2MjVjODI3ODhmIFwKLSAgICAtLWhhc2g9c2hhMjU2OjRiM2Y0MjkxODhjNjY2MDNhMWE1YzU0OWZiNDE0ZTRkM2JkYzJhMjQ3OTJlMDYxZmZiZDYwN2QzZDc1ZmQ4NGUgXAotICAgIC0taGFzaD1zaGEyNTY6NGMwZmY2NGIwNmIxMGUzNTIxNWFiY2U1MTcyNTJiMzc1ZTU4MGE2MTI1ZmQ1ZmRmNjQyMWI5OGVmYmVmYjJkMiBcCi0gICAgLS1oYXNoPXNoYTI1Njo1MWFmNDE3YTAwMGQyZGJlMWVjNmMzNzJkZmU2ODhlMDQxYTcwODRkYTRmZGQzNTBhZWIxMzliZDNmYjU1MzUzIFwKLSAgICAtLWhhc2g9c2hhMjU2OjU2NzhmODhjNjhlYTg2NmVkOWViZTNhOTg5MDkxMDg4NTUzYmExMmM2MDkwMjQ0ZmRhZTNlNDY3YjExMzljMzUgXAotICAgIC0taGFzaD1zaGEyNTY6NzljOGU1YTZjNmZmYWYzYTIyNjJlZjFiZTFlMTA4YTAzNWNmNGYwNWMxNGRmNTYwNTdiNjRhY2M1YmViZmZiNiBcCi0gICAgLS1oYXNoPXNoYTI1Njo3ZmY3ZjM3YjFiZjQ0MTdiYWNhOTU4ZDI1NGU4ZTI4NzVkMGNjMjNhYWFkYmU2NWIzZDViMzA3N2IwZWIyM2VhIFwKLSAgICAtLWhhc2g9c2hhMjU2OmFhZWEwYTZiZTU0NDYyZWMwMjdkZTU0ZmNhNTExNTQwOTgwZDFlOWVlYTY4YjJkNWMxZGJmZTA4NDc5N2JlMzUgXAotICAgIC0taGFzaD1zaGEyNTY6YmNlNTg2OWM4ZDY4Y2YzODNjZTI0MGU0NGMxZDlhZTdjMDYwNzhhOTM5NmRmNjhjZTg4YTEyMzBmOTNhMzBjMSBcCi0gICAgLS1oYXNoPXNoYTI1NjpjZDlmMTAyN2ZmMzBkOTA2MTg5MTRhNjRjYTliMWE3N2E0MzExNTlkZjBlMmExOTVkOGE5ZThhMDRjNzhhYmY5IFwKLSAgICAtLWhhc2g9c2hhMjU2OmQ5MjVmYTFjODFiNzcyODgyYWE1NWJjYzEwYmY4ODMyNGRhZGI2NmZmODVkNTQ4YzcxNTE1ZjY2ODljNmRhYzUgXAotICAgIC0taGFzaD1zaGEyNTY6ZTczNTRmZDc1MjdhNGIwMzc3Y2U1NWYyODY4MDViMzRlOGM1NGI5MWJlODY1YmFjMjczZjUyN2UxYjgzOTAxOSBcCi0gICAgLS1oYXNoPXNoYTI1NjpmYWU4YTdiODk4YzQyZGZmZTNmNzM2MWM0MGQ1OTUyYjZiZjMyZDEwYzQ1NjkwOThkMjc2YjRjNTQ3OTA1ZWUxCi0gICAgIyB2aWEgamF4CitzZWNyZXRzdG9yYWdlPT0zLjMuMyBcCisgICAgLS1oYXNoPXNoYTI1NjoyNDAzNTMzZWYzNjllY2E2ZDJiYTgxNzE4NTc2YzVlMGY1NjRkNWNjYTFiNThmNzNhOGIyM2U3ZDRlZWViZDc3IFwKKyAgICAtLWhhc2g9c2hhMjU2OmYzNTZlNjYyODIyMjU2OGUzYWYwNmYyZWJhOGRmNDk1ZWZhMTNiM2I2MzA4MWRhZmQ0ZjdkOWE3YjdiYzlmOTkKKyAgICAjIHZpYSBrZXlyaW5nCitzZXR1cHRvb2xzPT02OS4wLjMgXAorICAgIC0taGFzaD1zaGEyNTY6Mzg1ZWI0ZWRkOWM5ZDVjMTc1NDA1MTEzMDNlMzlhMTQ3Y2UyZmMwNGJjNTUyODljMzIyYjllNTkwNGZlMmMwNSBcCisgICAgLS1oYXNoPXNoYTI1NjpiZTFhZjU3ZmM0MDlmOTM2NDdmMmU4ZTQ1NzNhMTQyZWQzODcyNGI4Y2RkMzg5NzA2YTg2N2JiNGVmY2YxZTc4CisgICAgIyB2aWEKKyAgICAjICAgdGVuc29yYm9hcmQKKyAgICAjICAgdGVuc29yZmxvdwogc2l4PT0xLjE2LjAgXAogICAgIC0taGFzaD1zaGEyNTY6MWU2MWMzNzQ3N2ExNjI2NDU4ZTM2ZjdiMWQ4MmFhNWM5YjA5NGZhNDgwMjg5MjA3MmU0OWRlOWM2MGM0YzkyNiBcCiAgICAgLS1oYXNoPXNoYTI1Njo4YWJiMmYxZDg2ODkwYTJkZmI5ODlmOWE3N2NmY2ZkM2U0N2MyYTM1NGIwMTExMTc3MTMyNmY4YWEyNmUwMjU0CiAgICAgIyB2aWEKICAgICAjICAgYXN0dW5wYXJzZQotICAgICMgICBnb29nbGUtYXV0aAogICAgICMgICBnb29nbGUtcGFzdGEKLSAgICAjICAgdGVuc29yZmxvdy1jcHUKLXRlbnNvcmJvYXJkPT0yLjEyLjMgXAotICAgIC0taGFzaD1zaGEyNTY6YjRhNjkzNjY3ODRiYzM0N2UwMmZiZTdkODQ3ZTAxODk2YTY0OWNhNTJmODk0OGExMTAwNWUyMDVkY2Y3MjRmYgotICAgICMgdmlhIHRlbnNvcmZsb3ctY3B1Ci10ZW5zb3Jib2FyZC1kYXRhLXNlcnZlcj09MC43LjAgXAotICAgIC0taGFzaD1zaGEyNTY6NjRhYTFiZTdjMjNlODBiMWE0MmMxM2I2ODZlYjA4NzViYjcwZjVlNzU1ZjRkMmI4ZGU1YzFkODgwY2YyMjY3ZiBcCi0gICAgLS1oYXNoPXNoYTI1Njo3NTNkNDIxNDc5OWIzMWRhN2I2ZDkzODM3OTU5YWJlYmJjNmFmYTg2ZTY5ZWFjZjFlOWEzMTdhNDhkYWEzMWViIFwKLSAgICAtLWhhc2g9c2hhMjU2OmViN2ZhNTE4NzM3OTQ0ZGJmNGYwY2Y4M2MyZTQwYTdhYzM0NmJmOTFiZTJlNmEwMjE1ZGU5OGJlNzRlODU0NTQKKyAgICAjICAgdGVuc29yYm9hcmQKKyAgICAjICAgdGVuc29yZmxvdwordGVuc29yYm9hcmQ9PTIuMTUuMSBcCisgICAgLS1oYXNoPXNoYTI1NjpjNDZjMWQxY2YxM2E0NThjNDI5ODY4YTc4YjI1MzFkOGZmNWY2ODIwNThkNjllYzA4NDBiMGJjN2EzOGYxYzBmCisgICAgIyB2aWEgdGVuc29yZmxvdwordGVuc29yYm9hcmQtZGF0YS1zZXJ2ZXI9PTAuNy4yIFwKKyAgICAtLWhhc2g9c2hhMjU2OjdlMDYxMGQyMDU4ODk1ODg5ODM4MzZlYzA1ZGMwOThlODBmOTdiN2U3YmJmZjdlOTk0ZWJiNzhmNTc4ZDBkZGIgXAorICAgIC0taGFzaD1zaGEyNTY6OWZlNWQyNDIyMWIyOTYyNWRiYzczMjhiMDQzNmNhN2ZjMWMyM2RlNGFjZjRkMjcyZjExODA4NTZlMzJmOWY2MCBcCisgICAgLS1oYXNoPXNoYTI1NjplZjY4NzE2M2MyNDE4NWFlOTc1NGVkNTY1MGViNWJjNGQ4NGZmMjU3YWFiZGMzM2YwY2M2Zjc0ZDhiYTU0NTMwCiAgICAgIyB2aWEgdGVuc29yYm9hcmQKLXRlbnNvcmZsb3ctY3B1PT0yLjEyLjAgXAotICAgIC0taGFzaD1zaGEyNTY6MzYxYjE5YjVhNjRiZjYxMWJlY2NkMjJkZTFmYzA0ZjYxNGE4YzE1N2FjOTk4OTNkOTcwMmVkMjQ5MzIwMThkNiBcCi0gICAgLS1oYXNoPXNoYTI1NjozNzRiMTVkMWNlYzFhNjIwMDZlMzg4MDYyZTg5ZGQ0ODk5YTEyMTI3MmQ0MWVhNWQzZmNiY2M5NmUyZDg3NWM5IFwKLSAgICAtLWhhc2g9c2hhMjU2OjU1Njg1YjlhMTljOGVjYjI1ODdmYjUzOTE0YzA0NWIxODhlZDAyODlhMmM2NDk1ZTRlNTlkNWZiMDgyZGE5Y2MgXAotICAgIC0taGFzaD1zaGEyNTY6NWJlZWI5OWQyYTFjYzEzODNjYTk4MTUxM2MzNWE0YTE4MTU3ZTUyZDkxYTg5ZTY5Yzk0Y2I3YjdlNDExZjBkOCBcCi0gICAgLS1oYXNoPXNoYTI1Njo3MzRjZTg1MGUyYjM0OTMwNDFiZGMwNzFiNTk0ZjBmNzhkMzVlNGJmY2U1YTdlMGE5OGQ0NDliMjA0MjBlMDFkIFwKLSAgICAtLWhhc2g9c2hhMjU2OjhmZGI2MzY3MzZmOTUwOTQzNjhiYzdkMjZiYjNiOGVkOTNiYTgyMGNjNWQ5NWY4NDdlMDBiZjRhNzY0NTQ2M2QgXAotICAgIC0taGFzaD1zaGEyNTY6YTQwNmY3NTExODBmZTUyODI3NzZlOGJjODRmMzlhMmRjMmI3OTZjM2FlMzVmYmUyMGU0ZWRjODZlYzU4MGRkMyBcCi0gICAgLS1oYXNoPXNoYTI1NjpiNmJhOTI2ZjlhNTZjZGYwNjU3ZGVmYzZkMDQ2NzM1ZTMxZGVkMzgzMDU0ZjY3YzFhMTZlZjJiMDUxMWY2OGQ3IFwKLSAgICAtLWhhc2g9c2hhMjU2OmI5YzhmMGQwNjU4ZGE4YTViMjVhNGZlNWNhMzE1Zjg2YzQ0OWViMTFlMzBkNzljZWE0OWM3NjU4YmU3NWE4MjUgXAotICAgIC0taGFzaD1zaGEyNTY6ZDVhZDc0NmJmOGM4N2Q5YTlmY2VhNDY5ODgyOGJhMWQxMDFhN2Y3YmZkMzIzYTI1NzExMzAzNzRhMTkyNTc4YiBcCi0gICAgLS1oYXNoPXNoYTI1NjplOGM3MDQ3NTUyYTJkNzU5ZjNlNjVhYzEzZTM2ZGQyNGJiNWZlYzJlNjU3NmU4NDgyODc4MTFlYzQ0YjNkNjJmIFwKLSAgICAtLWhhc2g9c2hhMjU2OmVmNGYxNDJiNmZlNzVmY2M3MWFkYTYzMzFlZDJhMTVlZDYxYjcwMzQxODcwNDlkMGVmMWRhYzQ4MmQ1MmRiNzgKK3RlbnNvcmZsb3c9PTIuMTUuMC5wb3N0MSBcCisgICAgLS1oYXNoPXNoYTI1Njo4NzE2YWNkOGViMjk1MGRiMTI2ZDc0YTQxOWFjMWVkODcwNTU4YmEzNGVmYzdkOGU1MDYxNjVhZDU4OTZiMjYxIFwKKyAgICAtLWhhc2g9c2hhMjU2OmMyZGM5YjZhNTE5YTljYWFkODA0MzAyMjBjMTdmNjA0ZTlhZTc2ZjNiNTAwN2MwN2NjOGE1MzIxZTlmOWNhZDAgXAorICAgIC0taGFzaD1zaGEyNTY6ZDRiMzkyNmEzNzU5ZTA4YTFlODE4ZjAxMTA0YzI1ZTY5NTJkYTZmYjFkN2E3N2M3NWQ5ZjFkODQwN2Y3MjU5MwogICAgICMgdmlhIC1yIHRoaXJkX3BhcnR5L3B5dGhvbl9yZXF1aXJlbWVudHMuaW4KLXRlbnNvcmZsb3ctZXN0aW1hdG9yPT0yLjEyLjAgXAotICAgIC0taGFzaD1zaGEyNTY6NTliMTkxYmVhZDQ4ODM4MjJkZTNkNjNhYzAyYWNlMTFhODNiZmU2YzEwZDY0ZDBjNGRmZGU3NWE1MGU2MGNhMQotICAgICMgdmlhIHRlbnNvcmZsb3ctY3B1Ci10ZW5zb3JmbG93LWlvLWdjcy1maWxlc3lzdGVtPT0wLjMyLjAgXAotICAgIC0taGFzaD1zaGEyNTY6MDQ1ZDUxYmJhNTg2MzkwZDA1NDVmY2Q4YTE4NzI3ZDYyYjE3NWViMTQyZjZmNGM2ZDcxOWQzOWRlNDA3NzRjZCBcCi0gICAgLS1oYXNoPXNoYTI1NjowNWU2NWQzY2I2YzkzYTc5MjliMzg0ZDg2YzYzNjljNjNjYmJhYjhhNzcwNDQwYTNkOTVlMDk0ODc4NDAzZjlmIFwKLSAgICAtLWhhc2g9c2hhMjU2OjEyMmJlMTQ5ZTVmNmEwMzBmNWMyOTAxYmUwY2MzY2IwNzYxOTIzMmY3YjAzODg5ZTJjZGYzZGExYzBkNGY5MmYgXAotICAgIC0taGFzaD1zaGEyNTY6MWNlODBlMTU1NWQ2ZWU4OGRkYTY3ZmVkZGYzNjZjYzhiMzAyNTJiNTgzN2E3YTE3MzAzZGY3YjA2YTcxZmMyZSBcCi0gICAgLS1oYXNoPXNoYTI1NjoyMWRlN2RjYzA2ZWIxZTdkZTNjMDIyYjAwNzJkOTBiYTM1ZWY4ODY1NzgxNDk2NjM0MzdhYTdhNmZiNWJmNmIzIFwKLSAgICAtLWhhc2g9c2hhMjU2OjI4MjAyNDkyZDkwNGE2ZTI4MGNmMjc1NjA3OTFlODdhYzFjNzU2NjAwMGRiODIwNjVkNjNhNzBjMjcwMDhhZjIgXAotICAgIC0taGFzaD1zaGEyNTY6MzM2ZDliM2ZlNmI1NWFlYTE0OWM0ZjZhYTFmZDZmZmFmMjdkNGU1YzM3ZTU1YTE4MjM0MGI0N2NhYmEzODg0NiBcCi0gICAgLS1oYXNoPXNoYTI1Njo1NjM1ZGYwYmJlNDBmOTcxZGMxYjk0NmUzMzcyNzQ0YjBiZGZkYTQ1YzM4ZmZjZDI4ZWY1M2EzMmJiOGRhNGRhIFwKLSAgICAtLWhhc2g9c2hhMjU2Ojc0YTdlMjVlODNkNDExN2E3ZWJiMDlhM2YyNDc1NTNhNTQ5NzM5M2FiNDhjM2VlMGNmMGQxN2I0MDUwMjY4MTcgXAotICAgIC0taGFzaD1zaGEyNTY6NzlmZGQwMjEwM2I4YWU5ZjhiODlhZjQxZjc0NGMwMTNmYTFjYWFlYTcwOWRlMTk4MzM5MTc3OTVlMzA2Mzg1NyBcCi0gICAgLS1oYXNoPXNoYTI1Njo3ZjE1ZmQyMmU1OTI2NjFiMTBkZTMxN2JlMmY0MmEwZjg0YmU3YmZjNWU2YTU2NWZjZmNiMDRiNjBkNjI1Yjc4IFwKLSAgICAtLWhhc2g9c2hhMjU2OjgyMTRjZGY4NWJlYTY5NDE2MGY5MDM1ZmYzOTUyMjFjMWUyNWUxMTk3ODRjY2I0YzEwNDkxOWIxZjVkZWM4NGUgXAotICAgIC0taGFzaD1zaGEyNTY6ODQyZjVmMDljZDc1NmJkYjNiNGQwYjU1NzFiM2E2ZjcyZmQ1MzRkNDJkYTkzOGI5YWNmMGVmNDYyOTk1ZWFkYSBcCi0gICAgLS1oYXNoPXNoYTI1NjpkYjY4MmU5YTUxMGMyN2RkMzU3MTBiYTVhMmM2MmMzNzFlMjViNzI3NzQxYjJmZTNhOTIwMzU1ZmE1MDFlOTQ3Ci0gICAgIyB2aWEgdGVuc29yZmxvdy1jcHUKLXRlcm1jb2xvcj09Mi4zLjAgXAotICAgIC0taGFzaD1zaGEyNTY6M2FmYjA1NjA3Yjg5YWVkMGZmZTI1MjAyMzk5ZWUwODY3YWQ0ZDNjYjQxODBkOThhYWY4ZWVmYTZhNWY3ZDQ3NSBcCi0gICAgLS1oYXNoPXNoYTI1NjpiNWIwOGY2ODkzN2YxMzhmZTkyZjZjMDg5Yjk5ZjFlMmRhMGFlNTZjNTJiNzhiZjcwNzVmZDk1NDIwZmQ5YTVhCi0gICAgIyB2aWEgdGVuc29yZmxvdy1jcHUKK3RlbnNvcmZsb3ctZXN0aW1hdG9yPT0yLjE1LjAgXAorICAgIC0taGFzaD1zaGEyNTY6YWVkZjIxZWVjN2ZiMmRjOTExNTBmYzkxYTFjZTEyYmM0NGRiYjcyMjc4YTA4YjU4ZTc5ZmY4N2M5ZTI4ZjE1MworICAgICMgdmlhIHRlbnNvcmZsb3cKK3RlbnNvcmZsb3ctaW8tZ2NzLWZpbGVzeXN0ZW09PTAuMzUuMCBcCisgICAgLS1oYXNoPXNoYTI1NjowZmNlMTQ2NmJkYjkxMDk2YjZkMjJlN2RmMTczNThiYTIyOGJjYjkyZGI1Y2ZmODNmMmY5ZjFjNjhlYjI2Nzg4IFwKKyAgICAtLWhhc2g9c2hhMjU2OjE4NTZmZTMyMWZkYjc1ZjMzODZkOTIxMDljNjBkYjZlZjA5N2Y2MTBiNDUwZjljYzY5ZDc2NDQ0ZmI5OTgwZDEgXAorICAgIC0taGFzaD1zaGEyNTY6MzViNmVjYTcyMjVjODE1ZDk2MjI1NDMyNzE5NWYxOTFkODhjM2M5YzIyNzhhNWFiMjNlMGFjODM0YWNiYWRiYiBcCisgICAgLS1oYXNoPXNoYTI1Njo1NTIxNzIxYjM4MTA1NDk2ZDRiNDNhNGZmYjBhZjViMDRjYzQ4NzNkNDY0ZjI2ZmJjZWRkZjhkNjM4MTVjZTk4IFwKKyAgICAtLWhhc2g9c2hhMjU2OjZlOTk3Mzg5YmZlMDA4MjEwY2JkOTdjMGM3MzhkNjQyODJhMmYwM2FkNGQwNTM2MDEzYmIwYTllZmRlMGMyODMgXAorICAgIC0taGFzaD1zaGEyNTY6YWM4ZjFkZTYwZmRmOWM3MzRhZWE5NjdiOTg1NTVlMzY2YWM4NzQzZjc3YmNhMTVjNDllZmYwMjNmNTg3MDc2YiBcCisgICAgLS1oYXNoPXNoYTI1NjpiOGZiMzQwMmZiMTQ1NzQ4MmMzODZlYTE5MzcxYmM3NjM4MzQxMmFlOWVhNDM5NmVkYjFlOGFkYjRiYTc2ZjIxIFwKKyAgICAtLWhhc2g9c2hhMjU2OmM0Zjc4NmVlYmQ5OGQ0MDE1NjUzNzQ3MjJmMmU2N2YzODc4Njc1YjBkODc0ODljYmFhMTNjNzBlZTZhYzM3MGEgXAorICAgIC0taGFzaD1zaGEyNTY6ZGQ4ZjMwOTA4YmY4YjdiMmEwMTdkNmIxNDU3MjBkMTA1YWZmN2Y5OTg0MjI2NzFiNzE3Mjk3MDhlYzdiMmZlNCBcCisgICAgLS1oYXNoPXNoYTI1NjplYjZiZjhmNWI0MDIwN2VjYjE3ZTdmZGMzYjRmYzgyNGE4MzYxMjY3YzE0ZTk1MjhjMTY4OGUxNmRlMTM1Y2I3CisgICAgIyB2aWEgdGVuc29yZmxvdwordGVybWNvbG9yPT0yLjQuMCBcCisgICAgLS1oYXNoPXNoYTI1Njo5Mjk3YzBkZjljOTk0NDVjMjQxMmU4MzJlODgyYTc4ODQwMzhhMjU2MTdjNjBjZWEyYWQ2OTQ4OGQ0MDQwZDYzIFwKKyAgICAtLWhhc2g9c2hhMjU2OmFhYjllNTYwNDdjOGFjNDFlZDc5OGZhMzZkODkyYTM3YWNhNmIzZTkxNTlmM2UwYzI0YmM2NGE5YjNhYzdiN2EKKyAgICAjIHZpYSB0ZW5zb3JmbG93CiB0b21saT09Mi4wLjEgXAogICAgIC0taGFzaD1zaGEyNTY6OTM5ZGUzZTdhNjE2MWFmMGM4ODdlZjkxYjdkNDFhNTNlN2M1YTFjYTk3NjMyNWY0MjljYjQ2ZWE5YmMzMGVjYyBcCiAgICAgLS1oYXNoPXNoYTI1NjpkZTUyNmMxMjkxNGYwYzU1MGQxNTkyNGM2MmQ3MmFiYzQ4ZDZmZTczNjRhYTg3MzI4MzM3YTMxMDA3ZmU4YTRmCiAgICAgIyB2aWEgeWFwZgotdHlwaW5nLWV4dGVuc2lvbnM9PTQuNS4wIFwKLSAgICAtLWhhc2g9c2hhMjU2OjVjYjVmNGE3OTEzOWQ2OTk2MDdiM2VmNjIyYTFkZWRhZmE4NGUxMTVhYjAwMjRlMGQ5YzA0NGE5NDc5Y2E3Y2IgXAotICAgIC0taGFzaD1zaGEyNTY6ZmIzMzA4NWMzOWRkOTk4YWMxNmQxNDMxZWJjMjkzYThiM2VlZGQwMGZkNGEzMmRlMGZmNzkwMDJjMTk1MTFiNAotICAgICMgdmlhIHRlbnNvcmZsb3ctY3B1Ci11cmxsaWIzPT0xLjI2LjE1IFwKLSAgICAtLWhhc2g9c2hhMjU2OjhhMzg4NzE3Yjk0NzZmOTM0YTIxNDg0ZThjOGU2MTg3NWFiNjA2NDRkMjliOWIzOWUxMWU0YjlkYzFjNmIzMDUgXAotICAgIC0taGFzaD1zaGEyNTY6YWE3NTFkMTY5ZTIzYzc0NzljZTQ3YTBjYjBkYTU3OWUzZWRlNzk4Zjk5NGY1ODE2YTc0ZTRmNDUwMGRjZWE0MgordHdpbmU9PTQuMC4yIFwKKyAgICAtLWhhc2g9c2hhMjU2OjkyOWJjM2MyODAwMzMzNDdhMDBmODQ3MjM2NTY0ZDFjNTJhM2U2MWIxYWMyNTE2Yzk3YzQ4ZjNjZWFiNzU2ZDggXAorICAgIC0taGFzaD1zaGEyNTY6OWUxMDJlZjVmZGQ1YTIwNjYxZWI4OGZhZDQ2MzM4ODA2YzNiZDMyY2YxZGI3Mjk2MDNmZTM2OTdiMWJjODNjOAorICAgICMgdmlhIC1yIHRoaXJkX3BhcnR5L3B5dGhvbl9yZXF1aXJlbWVudHMuaW4KK3R5cGluZy1leHRlbnNpb25zPT00LjkuMCBcCisgICAgLS1oYXNoPXNoYTI1NjoyMzQ3OGY4OGMzN2YyN2Q3NmFjOGFlZTZjOTA1MDE3YTE0M2IwYjFiODg2YzNjOWY2NmJjMmZkOTRmOWY1NzgzIFwKKyAgICAtLWhhc2g9c2hhMjU2OmFmNzJhZWExNTVlOTFhZGZjNjFjM2FlOWUwZTM0MmRiYzBjYmE3MjZkNmNiYTRiNmM3MmMxZjM0ZTQ3MjkxY2QKKyAgICAjIHZpYSB0ZW5zb3JmbG93Cit1cmxsaWIzPT0yLjEuMCBcCisgICAgLS1oYXNoPXNoYTI1Njo1NTkwMWU5MTdhNTg5NmEzNDlmZjc3MWJlOTE5ZjhiZDk5YWZmNTBiNzlmZTU4ZmVjNTk1ZWIzN2JiYzU2YmIzIFwKKyAgICAtLWhhc2g9c2hhMjU2OmRmN2FhOGFmYjAxNDhmYTc4NDg4ZTc4OTliMmM1OWI1ZjRmZmNmYTgyZTZjNTRjY2I5ZGQzN2MxZDdiNTJkNTQKICAgICAjIHZpYQotICAgICMgICBnb29nbGUtYXV0aAogICAgICMgICByZXF1ZXN0cwotd2Vya3pldWc9PTIuMy40IFwKLSAgICAtLWhhc2g9c2hhMjU2OjFkNWE1OGUwMzc3ZDFmZTM5ZDA2MWE1ZGU0NDY5ZTQxNGU3OGNjYjFlMWU1OWMwZjVhZDZmYTFjMzZjNTJiNzYgXAotICAgIC0taGFzaD1zaGEyNTY6NDhlNWU2MTQ3MmZlZTBkZGVlMjdlYmFkMDg1NjE0ZWJlZGI3YWY0MWU4OGY2ODdhYWY4ODFhZmI3MjNhMTYyZgorICAgICMgICB0d2luZQord2Vya3pldWc9PTMuMC4xIFwKKyAgICAtLWhhc2g9c2hhMjU2OjUwN2U4MTFlY2VhNzJiMThhNDA0OTQ3YWRlZDRiMzM5MGUxZGI4ZjgyNmI0OTRkNzY1NTBlZjQ1YmIzYjFkY2MgXAorICAgIC0taGFzaD1zaGEyNTY6OTBhMjg1ZGMwZTQyYWQ1NmIzNGU2OTYzOThiODEyMmVlNGM2ODE4MzNmYjM1YjgzMzRhMDk1ZDgyYzU2ZGExMAogICAgICMgdmlhIHRlbnNvcmJvYXJkCi13aGVlbD09MC40MC4wIFwKLSAgICAtLWhhc2g9c2hhMjU2OmNkMTE5NmYzZmFlZTJiMzE5NjhkNjI2ZTE3MzFjOTRmOTljYmRiNjdjZjVhNDZlNGY1NjU2Y2JlZTc3Mzg4NzMgXAotICAgIC0taGFzaD1zaGEyNTY6ZDIzNmIyMGU3Y2I1MjJkYWYyMzkwZmE4NGM1NWVlYTgxYzVjMzAxOTBmOTBmMjlhZTJjYTFhZDgzNTViZjI0NwotICAgICMgdmlhCi0gICAgIyAgIGFzdHVucGFyc2UKLSAgICAjICAgdGVuc29yYm9hcmQKK3doZWVsPT0wLjQyLjAgXAorICAgIC0taGFzaD1zaGEyNTY6MTc3ZjljOWIwZDQ1YzQ3ODczYjYxOWY1YjY1MDM0NmQ2MzJjZGMzNWZiNWU0ZDI1MDU4ZTA5YzllNTgxNDMzZCBcCisgICAgLS1oYXNoPXNoYTI1NjpjNDViZTM5Zjc4ODJjOWQzNDI0MzIzNmYyZDYzY2JkNTgwMzllMzYwZjg1ZDA5MTM0MjVmYmQ3Y2VlYTYxN2E4CisgICAgIyB2aWEgYXN0dW5wYXJzZQogd3JhcHQ9PTEuMTQuMSBcCiAgICAgLS1oYXNoPXNoYTI1NjowMGI2ZDRlYTIwYTkwNmMwY2E1NmQ4NGY5MzA2NWIzOThhYjc0YjkyN2E3YTNkYmQ0NzBmNmZjNTAzZjk1ZGMzIFwKICAgICAtLWhhc2g9c2hhMjU2OjAxYzIwNTYxNmE4OWQwOTgyNzk4NmJjNGU4NTliY2FiZDY0ZjVhMDY2MmE3ZmU5NWUwZDM1OTQyNGUwZTA3MWIgXApAQCAtNTY4LDIzICs3NTgsMzAgQEAKICAgICAtLWhhc2g9c2hhMjU2OjA3ZjdhN2QwZjM4ODAyOGIyZGYxZDkxNmU5NGJiYjQwNjI0YzU5YjQ4ZWNjNmNiYzIzMjU0NjcwNmZhYzc0YzIgXAogICAgIC0taGFzaD1zaGEyNTY6MTE4NzE1MTQ2MDdiMTVjZmViODdjNTQ3YTQ5YmNhMTlmZGU0MDJmMzJlMmIxYzI0YTYzMjUwNmMwYTc1NjY1NiBcCiAgICAgLS1oYXNoPXNoYTI1NjoxYjM3NmIzZjQ4OTZlNzkzMGYxZjc3MmFjNGIwNjRhYzEyNTk4ZDFjMzhkMDQ5MDdlNjk2Y2M0ZDc5NGI0M2QzIFwKKyAgICAtLWhhc2g9c2hhMjU2OjIwMjBmMzkxMDA4ZWY4NzRjNmQ5ZTIwOGIyNGYyOGUzMWJjYjg1Y2NmZjRmMzM1ZjE1YTMyNTFkMjIyYjkyZDkgXAogICAgIC0taGFzaD1zaGEyNTY6MjFhYzAxNTZjNGIwODliMzMwYjc2NjZkYjQwZmVlZTMwYTVkNTI2MzRjYzQ1NjBlMTkwNWQ2NTI5YTM4OTdmZiBcCisgICAgLS1oYXNoPXNoYTI1NjoyNDBiMTY4NmYzOGFlNjY1ZDFiMTU0NzU5NjZmZTA0NzJmNzhlNzFiMWI0OTAzYzE0M2E4NDI2NTljOGU0Y2I5IFwKICAgICAtLWhhc2g9c2hhMjU2OjI1N2ZkNzhjNTEzZTBmYjVjZGJlMDU4YzI3YTA2MjRjOTg4NGU3MzViYmQxMzE5MzVmZDQ5ZTlmZTcxOWQzMTAgXAorICAgIC0taGFzaD1zaGEyNTY6MjYwNDZjZDAzOTM2YWU3NDVhNTAyYWJmNDRkYWM3MDJhNWU2ODgwYjJiMDFjMjlhZWE4ZGRmMzM1M2I2ODIyNCBcCiAgICAgLS1oYXNoPXNoYTI1NjoyYjM5ZDM4MDM5YTFmZGFkOThjODcyNzliNDhiYzVkY2UyYzBjYTBkNzM0ODNiMTJjYjcyYWE5NjA5Mjc4ZThhIFwKICAgICAtLWhhc2g9c2hhMjU2OjJjZjcxMjMzYTBlZDA1Y2NkYWJlMjA5YzYwNmZlMGJhYzczNzlmZGNmNjg3ZjM5Yjk0NDQyMGQyYTA5ZmRiNTcgXAogICAgIC0taGFzaD1zaGEyNTY6MmZlODAzZGVhY2QwOWEyMzNlNDc2MmExYWRjZWE1ZGI1ZDMxZTZiZTU3N2E0MzM1MjkzNjE3OWQxNGQ5MDA2OSBcCisgICAgLS1oYXNoPXNoYTI1NjoyZmVlY2Y4NmUxZjdhODY1MTdjYWIzNGFlNmMyZjA4MWZkMmQwZGFjODYwY2IwYzBkZWQ5NmQ3OTlkMjBiMzM1IFwKICAgICAtLWhhc2g9c2hhMjU2OjMyMzI4MjJjN2Q5OGQyMzg5NWNjYzQ0M2JiZGY1N2M3NDEyYzVhNjU5OTZjMzA0NDJlYmU2ZWQzZGYzMzUzODMgXAogICAgIC0taGFzaD1zaGEyNTY6MzRhYTUxYzQ1ZjI4YmE3ZjEyYWNjZDYyNDIyNWUyYjFlNWEzYTQ1MjA2YWExOTFmNmY5YWFjOTMxZDlkNTZmZSBcCisgICAgLS1oYXNoPXNoYTI1NjozNThmZTg3Y2M4OTljNmJiMGRkYzE4NWJmM2RiZmE0YmE2NDZmMDViMWIwYjliNWEyN2MyY2I5MmMyY2VhMjA0IFwKICAgICAtLWhhc2g9c2hhMjU2OjM2ZjU4MmQwYzZiYzk5ZDVmMzljZDNhYzJhOTA2MmU1N2YzY2Y2MDZhZGUyOWEwYTBkNmIzMjM0NjJmNGRkODcgXAogICAgIC0taGFzaD1zaGEyNTY6MzgwYTg1Y2Y4OWUwZTY5YjdjZmJlMmVhOWY3NjVmMDA0ZmY0MTlmMzQxOTQwMThhNjgyN2FjMGUzZWRmZWQ0ZCBcCiAgICAgLS1oYXNoPXNoYTI1Njo0MGU3YmM4MWM5ZTJiMjczNGVhNGJjMWFjZWI4YThmMGNlYWFjN2M1Mjk5YmM1ZDY5ZTM3YzQ0ZDkwODFkNDNiIFwKICAgICAtLWhhc2g9c2hhMjU2OjQzY2EzYmJiZTk3YWYwMGY0OWVmYjA2ZTM1MmVhZTQwNDM0Y2E5ZDkxNTkwNmY3N2RlZjIxOWI4OGU4NWQ5MDcgXAorICAgIC0taGFzaD1zaGEyNTY6NDllZjU4MmI3YTExNTJhZTI3NjY1NTdmMDU1MGE5ZmNiZjdiYmQ3NmY0M2ZiZGM5NGRkM2JmMDdjYzcxNjhiZSBcCiAgICAgLS1oYXNoPXNoYTI1Njo0ZmNjNDY0OWRjNzYyY2RkYWNkMTkzZTZiNTViYzAyZWRjYTY3NDA2N2Y1Zjk4MTY2ZDc3MTNiMTkzOTMyYjdmIFwKICAgICAtLWhhc2g9c2hhMjU2OjVhMGY1NGNlMmMwOTJhYWY0Mzk4MTM3MzU1ODRiOTUzN2NhZDQ3OTU3NWEwOTg5MmI4MzUyZmVhNWU5ODhkYzAgXAogICAgIC0taGFzaD1zaGEyNTY6NWE5YTBkMTU1ZGVhZmQ5NDQ4YmFmZjI4YzA4ZTE1MGQ5YjI0ZmYwMTBlODk5MzExZGRkNjNjNDVjMjQ0NWUyOCBcCiAgICAgLS1oYXNoPXNoYTI1Njo1YjAyZDY1YjljY2YwZWY2YzM0Y2JhNmNmNWJmMmFhYjFiYjJmNDljNjA5MGJhZmVlY2M5Y2Q4MWFkNGVhMWMxIFwKICAgICAtLWhhc2g9c2hhMjU2OjYwZGIyM2ZhNDIzNTc1ZWViNjVlYTQzMGNlZTc0MWFjYjdjMjZhMTM2NWQxMDNmN2IwZjZlYzQxMmI4OTM4NTMgXAogICAgIC0taGFzaD1zaGEyNTY6NjQyYzJlN2E4MDRmY2YxOGMyMjJlMTA2MGRmMjVmYzIxMGI5YzU4ZGI3YzkxNDE2ZmIwNTU4OTdmYzI3ZThjYyBcCisgICAgLS1oYXNoPXNoYTI1Njo2NDQ3ZTlmM2JhNzJmOGUyYjk4NWExZGE3NTg3Njc2OThlZmE3MjcyM2Q1YjU5YWNjZWZkNzE2ZTllODI3MmJmIFwKICAgICAtLWhhc2g9c2hhMjU2OjZhOWEyNTc1MWFjYjM3OWI0NjZmZjZiZTc4YTMxNWUyYjQzOWQ0Yzk0YzFlOTljYjcyNjZkNDBhNTM3OTk1ZDMgXAogICAgIC0taGFzaD1zaGEyNTY6NmIxYTU2NGU2Y2I2OTkyMmM3ZmUzYTY3OGI5ZjlhM2M1NGU3MmI0Njk4NzVhYTgwMThmMThiNGQxZGQxYWRmMyBcCiAgICAgLS1oYXNoPXNoYTI1Njo2ZDMyM2UxNTU0YjNkMjJjZmMwM2NkMzI0M2I1YmI4MTVhNTFmNTI0OWZkY2JiODZmZGE0YmY2MmJhYjllMTY0IFwKQEAgLTYwNyw4ICs4MDQsMTAgQEAKICAgICAtLWhhc2g9c2hhMjU2OjllMGZkMzJlMDE0OGRkNWRlYTZhZjVmZWU0MmJlYjk0OTA5ODU2NGNjMjMyMTFhODhkNzk5ZTQzNDI1NWExZjQgXAogICAgIC0taGFzaD1zaGEyNTY6OWYzZTZmOWUwNTE0OGZmOTAwMDJiODg0ZmJjMmE4NmJkMzAzYWU4NDdlNDcyZjQ0ZWNjMDZjMmNkMmZjZGIyZCBcCiAgICAgLS1oYXNoPXNoYTI1NjphODVkMmI0NmJlNjZhNzFiZWRkZTgzNmQ5ZTQxODU5ODc5Y2M1NGEyYTA0ZmFkMTE5MWViNTBjMjA2NmY2ZTlkIFwKKyAgICAtLWhhc2g9c2hhMjU2OmE5MDA4ZGFkMDdkNzFmNjg0ODdjOTFlOTY1NzljODU2N2M5OGNhNGMzODgxYjliMTEzYmM3YjMzZTlmZDc4YjggXAogICAgIC0taGFzaD1zaGEyNTY6YTlhNTIxNzJiZTBiNWFhZTkzMmJlZjgyYTc5ZWMwYTBjZTg3Mjg4YzdkMTMyOTQ2ZDY0NWViYTAzZjBhZDhhOCBcCiAgICAgLS1oYXNoPXNoYTI1NjphYTMxZmRjYzMzZmVmOWViMjU1MmNiY2JmZWU3NzczZDVhNjc5MmMxMzdiMzU5ZTgyODc5YzEwMWU5ODU4NGM1IFwKKyAgICAtLWhhc2g9c2hhMjU2OmFjYWUzMmUxM2E0MTUzODA5ZGIzNzQwNWY1ZWJhNWJhYzVmYmUyZTJiYTYxYWIyMjc5MjZhMjI5MDEwNTFjMGEgXAogICAgIC0taGFzaD1zaGEyNTY6YjAxNGMyMzY0NmE0Njc1NThiZTdkYTNkNmI5ZmE0MDliMmM1NjdkMjExMDU5OWI3Y2Y5YTBjNTk5MmIzYjQ3MSBcCiAgICAgLS1oYXNoPXNoYTI1NjpiMjFiYjRjMDlmZmFiZmEwZTg1ZTNhNmI2MjNlMTliODBlN2FjZDcwOWI5ZjkxNDUyYjgyOTdhY2UyYThhYjAwIFwKICAgICAtLWhhc2g9c2hhMjU2OmI1OTAxYTMxMmY0ZDE0YzU5OTE4YzIyMTMyMzA2OGZhZDA1NDBlMzQzMjQ5MjVjODQ3NTI2Mzg0MWRiZGZlNjggXApAQCAtNjIzLDE5ICs4MjIsMTYgQEAKICAgICAtLWhhc2g9c2hhMjU2OmRlZTYwZTFkZTE4OThiZGUzYjIzOGYxODM0MGVlYzYxNDg5ODZkYTA0NTVkOGJhNzg0OGQ1MDQ3MGE3YTMyZmIgXAogICAgIC0taGFzaD1zaGEyNTY6ZTJmODNlMThmZTJmNGM5ZTdkYjU5N2U5ODhmNzI3MTJjMGMzNjc2ZDMzN2Q4YjEwMWY2NzU4MTA3YzQyNDI1YiBcCiAgICAgLS1oYXNoPXNoYTI1NjplM2ZiMTY3N2M3MjA0MDlkNWY2NzFlMzliYWM2YzllMGU0MjI1ODRlNWY1MThiZmQ1MGFhNGNiYmVhMDI0MzNmIFwKKyAgICAtLWhhc2g9c2hhMjU2OmVjZWU0MTMyYzZjZDJjZTUzMDhlMjE2NzIwMTVkZGZlZDFmZjk3NWFkMGFjOGQyNzE2OGVhODJlNzE0MTNmNTUgXAogICAgIC0taGFzaD1zaGEyNTY6ZWUyYjFiMTc2OWY2NzA3YThhNDQ1MTYyZWExNmRkZGY3NDI4NWMzOTY0ZjYwNTg3N2EyMGUzODU0NWMzYzQ2MiBcCiAgICAgLS1oYXNoPXNoYTI1NjplZTZhY2FlNzRhMmI5MTg2NTkxMGVlZjVlN2RlMzdkYzY4OTVhZDk2ZmEyMzYwM2QxZDI3ZWE2OWRmNTQ1MDE1IFwKICAgICAtLWhhc2g9c2hhMjU2OmVmM2Y3MmM5NjY2YmJhMmJhYjcwZDJhOGI3OWYyYzZkMmMxYTQyYTdmN2UyYjBlYzgzYmIyZjllMzgzOTUwYWYKLSAgICAjIHZpYSB0ZW5zb3JmbG93LWNwdQoteWFwZj09MC4zMy4wIFwKLSAgICAtLWhhc2g9c2hhMjU2OjRjMmI1OWJkNWZmZTQ2ZjNhN2RhNDhkZjg3NTk2ODc3MTg5MTQ4MjI2Y2UyNjdjMTZlOGI0NDI0MGU1MTU3OGQgXAotICAgIC0taGFzaD1zaGEyNTY6ZGE2MmJkZmVhM2RmMzY3MzU1MzM1MWU2MjQ2YWJlZDI2ZDlmZTY3ODBlNTQ4YTVhZjllNzBmNmQyYjRmNWI5YQorICAgICMgdmlhIHRlbnNvcmZsb3cKK3lhcGY9PTAuNDAuMiBcCisgICAgLS1oYXNoPXNoYTI1Njo0ZGFiOGE1ZWQ3MTM0ZTI2ZDU3YzE2NDdjNzQ4M2FmYjNmMTM2ODc4YjU3OTA2MmI3ODZjOWJhMTZiOTQ2MzdiIFwKKyAgICAtLWhhc2g9c2hhMjU2OmFkYzhiNWRkMDJjMDE0MzEwODg3OGM0OTkyODQyMDVhZGIyNThhYWQ2ZGI2NjM0ZTViODY5ZTdlZTJiZDU0OGIKICAgICAjIHZpYSAtciB0aGlyZF9wYXJ0eS9weXRob25fcmVxdWlyZW1lbnRzLmluCi0KLSMgVGhlIGZvbGxvd2luZyBwYWNrYWdlcyBhcmUgY29uc2lkZXJlZCB0byBiZSB1bnNhZmUgaW4gYSByZXF1aXJlbWVudHMgZmlsZToKLXNldHVwdG9vbHM9PTY3LjcuMiBcCi0gICAgLS1oYXNoPXNoYTI1NjoyM2FhZjg2Yjg1Y2E1MmNlYjgwMWQzMjcwM2YxMmQ3NzUxN2IyNTU2YWY4Mzk2MjFjNjQxZmNhMTEyODc5NTJiIFwKLSAgICAtLWhhc2g9c2hhMjU2OmYxMDRmYTAzNjkyYTI2MDJmYTBmZWM2YzZhOWU2M2I2YzhhOTY4ZGUxM2UxN2MwMjY5NTdkZDFmNTNkODA5OTAKLSAgICAjIHZpYQotICAgICMgICB0ZW5zb3Jib2FyZAotICAgICMgICB0ZW5zb3JmbG93LWNwdQoremlwcD09My4xNy4wIFwKKyAgICAtLWhhc2g9c2hhMjU2OjBlOTIzZTcyNjE3NDkyMmRjZTA5YzUzYzU5YWQ0ODNmZjdiYmI4ZTU3MmUwMGM3ZjdjNDZiODg1NTY0MDlmMzEgXAorICAgIC0taGFzaD1zaGEyNTY6ODRlNjRhMWMyOGNmN2U5MWVkMjA3OGJiOGNjOGMyNTljYjE5Yjc2OTQyMDk2YzhkN2I4NDk0NzY5MGNhYmFmMAorICAgICMgdmlhIGltcG9ydGxpYi1tZXRhZGF0YQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkvcnV5L0JVSUxEIGIvdGhpcmRfcGFydHkvcnV5L0JVSUxECmluZGV4IDhkYjkwNmEuLjhmYWJlNDkgMTAwNjQ0Ci0tLSBhL3RoaXJkX3BhcnR5L3J1eS9CVUlMRAorKysgYi90aGlyZF9wYXJ0eS9ydXkvQlVJTEQKQEAgLTUsNCArNSw0IEBACiAgICAgbGljZW5zZXMgPSBbIm5vdGljZSJdLAogKQogCi1leHBvcnRzX2ZpbGVzKGdsb2IoWyIqLnBhdGNoIl0pICsgWyJMSUNFTlNFIl0pCitleHBvcnRzX2ZpbGVzKGdsb2IoWyIqLnBhdGNoIl0pKQpkaWZmIC0tZ2l0IGEvdGhpcmRfcGFydHkveHRlbnNhL25ubGliX2hpZmk0L0JVSUxEIGIvdGhpcmRfcGFydHkveHRlbnNhL25ubGliX2hpZmk0L0JVSUxECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZGNkOWYKLS0tIC9kZXYvbnVsbAorKysgYi90aGlyZF9wYXJ0eS94dGVuc2Evbm5saWJfaGlmaTQvQlVJTEQKQEAgLTAsMCArMSw3IEBACithbGlhcygKKyAgICBuYW1lID0gIm5ubGliX2hpZmk0X2xpYiIsCisgICAgYWN0dWFsID0gIkBubmxpYl9oaWZpNC8vOmxpYiIsCisgICAgdmlzaWJpbGl0eSA9IFsKKyAgICAgICAgIi8vdmlzaWJpbGl0eTpwdWJsaWMiLAorICAgIF0sCispCmRpZmYgLS1naXQgYS90aGlyZF9wYXJ0eS94dGVuc2Evbm5saWJfaGlmaTQvbm5saWJfaGlmaTQuQlVJTEQgYi90aGlyZF9wYXJ0eS94dGVuc2Evbm5saWJfaGlmaTQvbm5saWJfaGlmaTQuQlVJTEQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRmNDc3NwotLS0gL2Rldi9udWxsCisrKyBiL3RoaXJkX3BhcnR5L3h0ZW5zYS9ubmxpYl9oaWZpNC9ubmxpYl9oaWZpNC5CVUlMRApAQCAtMCwwICsxLDQzIEBACitjb25zdHJhaW50X3NldHRpbmcoCisgICAgbmFtZSA9ICJjb21wYXRpYmxlX2NvbnN0cmFpbnQiLAorKQorCisjIFNldCB0aGlzIGNvbnN0cmFpbnRfdmFsdWUgb24geW91ciBwbGF0Zm9ybSB0byBpbmRpY2F0ZSBjb21wYXRpYmxpdHkgd2l0aCB0aGlzCisjIGxpYnJhcnkuCitjb25zdHJhaW50X3ZhbHVlKAorICAgIG5hbWUgPSAiY29tcGF0aWJsZSIsCisgICAgY29uc3RyYWludF9zZXR0aW5nID0gIjpjb21wYXRpYmxlX2NvbnN0cmFpbnQiLAorICAgIHZpc2liaWxpdHkgPSBbCisgICAgICAgICIvL3Zpc2liaWxpdHk6cHVibGljIiwKKyAgICBdLAorKQorCitjY19saWJyYXJ5KAorICAgIG5hbWUgPSAibGliIiwKKyAgICBzcmNzID0gZ2xvYihbInhhX25ubGliL2FsZ28vKiovKi5jIl0pLAorICAgIGhkcnMgPSBnbG9iKFsKKyAgICAgICAgInhhX25ubGliL2FsZ28vKiovKi5oIiwKKyAgICAgICAgInhhX25ubGliL2luY2x1ZGUvKiovKi5oIiwKKyAgICBdKSwKKyAgICBjb3B0cyA9IFsiLVduby11bnVzZWQtcGFyYW1ldGVyIl0sCisgICAgZGVmaW5lcyA9IFsKKyAgICAgICAgIk5OTElCX1YyPTEiLAorICAgICAgICAiTU9ERUxfSU5UMTY9MSIsCisgICAgICAgICJFSUdFTl9OT19NQUxMT0M9MSIsCisgICAgICAgICJoaWZpND0xIiwKKyAgICBdLAorICAgIGluY2x1ZGVzID0gWworICAgICAgICAieGFfbm5saWIiLAorICAgICAgICAieGFfbm5saWIvYWxnby9jb21tb24vaW5jbHVkZSIsCisgICAgICAgICJ4YV9ubmxpYi9hbGdvL2tlcm5lbHMiLAorICAgICAgICAieGFfbm5saWIvYWxnby9uZHNwL2hpZmk0L2luY2x1ZGUiLAorICAgICAgICAieGFfbm5saWIvaW5jbHVkZSIsCisgICAgICAgICJ4YV9ubmxpYi9pbmNsdWRlL25ubGliIiwKKyAgICBdLAorICAgIHRhcmdldF9jb21wYXRpYmxlX3dpdGggPSBbCisgICAgICAgICI6Y29tcGF0aWJsZSIsCisgICAgXSwKKyAgICB2aXNpYmlsaXR5ID0gWworICAgICAgICAiLy92aXNpYmlsaXR5OnB1YmxpYyIsCisgICAgXSwKKykKZGlmZiAtLWdpdCBhL3Rvb2xzL0JVSUxEIGIvdG9vbHMvQlVJTEQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg4NmRjNQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL0JVSUxECkBAIC0wLDAgKzEsMTYgQEAKK2xvYWQoIkBydWxlc19weXRob24vL3B5dGhvbjpkZWZzLmJ6bCIsICJweV9iaW5hcnkiLCAicHlfdGVzdCIpCisKK3BhY2thZ2UoCisgICAgZGVmYXVsdF92aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0sCispCisKK3B5X2JpbmFyeSgKKyAgICBuYW1lID0gImV4cGFuZF9zdGFtcF92YXJzIiwKKyAgICBzcmNzID0gWyJleHBhbmRfc3RhbXBfdmFycy5weSJdLAorKQorCitweV90ZXN0KAorICAgIG5hbWUgPSAiZXhwYW5kX3N0YW1wX3ZhcnNfdGVzdCIsCisgICAgc3JjcyA9IFsiZXhwYW5kX3N0YW1wX3ZhcnNfdGVzdC5weSJdLAorICAgIGRlcHMgPSBbIjpleHBhbmRfc3RhbXBfdmFycyJdLAorKQpkaWZmIC0tZ2l0IGEvdG9vbHMvZXhwYW5kX3N0YW1wX3ZhcnMuYnpsIGIvdG9vbHMvZXhwYW5kX3N0YW1wX3ZhcnMuYnpsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZGIyNjUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9leHBhbmRfc3RhbXBfdmFycy5iemwKQEAgLTAsMCArMSw1MiBAQAorIyBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIyAtLS0tCisKK2RlZiBleHBhbmRfc3RhbXBfdmFycyhuYW1lLCB0ZW1wbGF0ZSwgb3V0KToKKyAgICAiIiJNYWNybyBmb3IgZXhwYW5kaW5nIGEgdGVtcGxhdGUgdXNpbmcgd29ya3NwYWNlIHN0YXR1cyB2YXJpYWJsZXMuCisKKyAgICBUeXBpY2FsIHVzYWdlIGluIGEgQlVJTEQgZmlsZToKKworICAgICAgICBleHBhbmRfc3RhbXBfdmFycygKKyAgICAgICAgICAgIG5hbWUgPSAidmVyc2lvbiIsCisgICAgICAgICAgICB0ZW1wbGF0ZSA9ICJfdmVyc2lvbi5weS5pbiIsCisgICAgICAgICAgICBvdXQgPSAiX3ZlcnNpb24ucHkiLAorICAgICAgICApCisKKyAgICBXcml0ZXMgYHRlbXBsYXRlYCB0byBgb3V0YCwgZXhwYW5kaW5nIHJlZmVyZW5jZXMgb2YgdGhlIGZvcm0gJ3tLRVl9JyB0byB0aGUKKyAgICB2YWx1ZSBvZiB0aGUgY29ycmVzcG9uZGluZyBCYXplbCB3b3Jrc3BhY2Ugc3RhdHVzIHZhcmlhYmxlLgorICAgICIiIgorCisgICAgIyBUaGlzIG1hY3JvIHVzZXMgYSBnZW5ydWxlIHRvIGNhbGwgYSBoZWxwZXIgcHJvZ3JhbSBhdCBCYXplbCBleGVjdXRpb24KKyAgICAjIHRpbWUsIGJlY2F1c2Ugd29ya3NwYWNlIHZhcmlhYmxlcyBhcmUgbm90IGF2YWlsYWJsZSB1bnRpbCBleGVjdXRpb24gdGltZS4KKyAgICAjIFdvcmtzcGFjZSB2YXJpYWJsZXMgYXJlIGdlbmVyYXRlZCBieSBiYXplbCBvbiBlYWNoIGludm9jYXRpb24sIGFuZAorICAgICMgd3JpdHRlbiB0byB0aGUgaGFyZGNvZGVkIGZpbGVzIG5hbWVzIHVzZWQgYmVsb3cuIFNlZSB0aGUgQmF6ZWwKKyAgICAjIGRvY3VtZW50YXRpb24gZm9yIHRoZSBvcHRpb24gLS13b3Jrc3BhY2Vfc3RhdHVzX2NvbW1hbmQuCisKKyAgICBuYXRpdmUuZ2VucnVsZSgKKyAgICAgICAgbmFtZSA9IG5hbWUsCisgICAgICAgIHNyY3MgPSBbdGVtcGxhdGVdLAorICAgICAgICBvdXRzID0gW291dF0sCisgICAgICAgIGNtZCA9ICIkKGxvY2F0aW9uIC8vdG9vbHM6ZXhwYW5kX3N0YW1wX3ZhcnMpICIgKworICAgICAgICAgICAgICAiYmF6ZWwtb3V0L3N0YWJsZS1zdGF0dXMudHh0ICIgKworICAgICAgICAgICAgICAiYmF6ZWwtb3V0L3ZvbGF0aWxlLXN0YXR1cy50eHQgIiArCisgICAgICAgICAgICAgICI8JDwgPiRAIiwKKyAgICAgICAgdG9vbHMgPSBbCisgICAgICAgICAgICAiLy90b29sczpleHBhbmRfc3RhbXBfdmFycyIsCisgICAgICAgIF0sCisKKyAgICAgICAgIyBVbmRvY3VtZW50ZWQsIGJ1dCB2YWxpZCwgYW5kIHRoZSBvbmx5IHdheSB0byBkZWNsYXJlIHRoZSBuZWNlc3NhcnkKKyAgICAgICAgIyBkZXBlbmRlbmNpZXMgb24ge3N0YWJsZSx2b2xhdGlsZX0tc3RhdHVzLnR4dC4KKyAgICAgICAgc3RhbXAgPSAxLAorICAgICkKZGlmZiAtLWdpdCBhL3Rvb2xzL2V4cGFuZF9zdGFtcF92YXJzLnB5IGIvdG9vbHMvZXhwYW5kX3N0YW1wX3ZhcnMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBkMWEzZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2V4cGFuZF9zdGFtcF92YXJzLnB5CkBAIC0wLDAgKzEsNzYgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKKworIyBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIyAtLS0tCisiIiIKKyBBIGZpbHRlciB0aGF0IGV4cGFuZHMgQmF6ZWwgd29ya3NwYWNlIHN0YW1wIHZhcmlhYmxlcy4KKworIEZvciBleGFtcGxlLCB0aGUgaW5wdXQgc3RlYW06CisKKyAgICAgVGhpcyBidWlsZCB3YXMgY29tcGlsZWQgYXQge0JVSUxEX0RBVEV9LgorCisgaXMgZXhwYW5kZWQgaW50byB0aGUgb3V0cHV0IHN0cmVhbToKKworICAgICBUaGlzIGJ1aWxkIHdhcyBjb21waWxlZCBhdCAyMDIzLTAyLTEwVDE0OjE1LgorCisgU3RhbXAgdmFyaWFibGUga2V5LXZhbHVlIHBhaXJzIGFyZSByZWFkIGZyb20gYWxsIGZpbGVzIHBhc3NlZCBhcyBwb3NpdGlvbmFsCisgYXJndW1lbnRzLiBUaGVzZSBmaWxlcyBhcmUgdHlwaWNhbGx5IGJhemVsLW91dC9zdGFibGUtc3RhdHVzLnR4dCBhbmQKKyBiYXplbC1vdXQvdm9sYXRpbGUtc3RhdHVzLnR4dC4gU2VlIHRoZSBCYXplbCBkb2N1bWVudGF0aW9uIGZvciB0aGUgb3B0aW9uCisgLS13b3Jrc3BhY2Vfc3RhdHVzX2NvbW1hbmQuCisiIiIKKworaW1wb3J0IHN5cworCisKK2RlZiByZWFkX3N0YW1wcyhmaWxlKToKKyAgIiIiUmV0dXJuIGEgZGljdGlvbmFyeSBvZiBrZXktdmFsdWUgcGFpcnMgcmVhZCBmcm9tIGEgc3RhbXAgZmlsZS4KKworICBUaGVzZSBmaWxlcyBhcmUgdHlwaWNhbGx5IGJhemVsLW91dC9zdGFibGUtc3RhdHVzLnR4dCBhbmQKKyAgYmF6ZWwtb3V0L3ZvbGF0aWxlLXN0YXR1cy50eHQuIFNlZSB0aGUgQmF6ZWwgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIG9wdGlvbgorICAtLXdvcmtzcGFjZV9zdGF0dXNfY29tbWFuZC4iIiIKKworICBzdGFtcHMgPSB7fQorICBmb3IgbGluZSBpbiBmaWxlOgorICAgIHRyeToKKyAgICAgIGtleSwgdmFsdWUgPSBsaW5lLnNwbGl0KCIgIiwgbWF4c3BsaXQ9MSkKKyAgICAgIHN0YW1wc1trZXldID0gdmFsdWUuc3RyaXAoKQorICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgcGFzcyAgIyBTa2lwIGJsYW5rIGxpbmVzLCBldGMuCisKKyAgcmV0dXJuIHN0YW1wcworCisKK2RlZiBleHBhbmQoaXN0cmVhbSwgb3N0cmVhbSwgc3RhbXBzKToKKyAgIiIiV3JpdGUgaXN0cmVhbSB0byBvc3RyZWFtLCBleHBhbmRpbmcgcGxhY2Vob2xkZXJzIGxpa2Uge0tFWX0uIiIiCisgIGZvciBsaW5lIGluIGlzdHJlYW06CisgICAgZm9yIGtleSwgdmFsdWUgaW4gc3RhbXBzLml0ZW1zKCk6CisgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKGYie3t7a2V5fX19IiwgdmFsdWUpCisgICAgb3N0cmVhbS53cml0ZShsaW5lKQorCisKK2RlZiBfbWFpbigpOgorICAiIiJTdGFtcCB2YXJpYWJsZXMgYXJlIHJlYWQgZnJvbSBhbGwgZmlsZXMgcGFzc2VkIGFzIHBvc2l0aW9uYWwgYXJndW1lbnRzLiIiIgorICBzdGFtcHMgPSB7fQorICBmb3IgbmFtZSBpbiBzeXMuYXJndlsxOl06CisgICAgd2l0aCBvcGVuKG5hbWUpIGFzIGY6CisgICAgICBzdGFtcHMudXBkYXRlKHJlYWRfc3RhbXBzKGYpKQorCisgIGV4cGFuZChzeXMuc3RkaW4sIHN5cy5zdGRvdXQsIHN0YW1wcykKKworICBzeXMuZXhpdCgwKQorCisKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgIF9tYWluKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL2V4cGFuZF9zdGFtcF92YXJzX3Rlc3QucHkgYi90b29scy9leHBhbmRfc3RhbXBfdmFyc190ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YjA0N2EKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9leHBhbmRfc3RhbXBfdmFyc190ZXN0LnB5CkBAIC0wLDAgKzEsNDYgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKKworIyBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIyAtLS0tCisKKyMgQSB0ZXN0IGZvciB0aGUgZmlsdGVyIHRoYXQgZXhwYW5kcyBCYXplbCB3b3Jrc3BhY2Ugc3RhbXAgdmFyaWFibGVzLgorCitmcm9tIHRmbGl0ZV9taWNyby50b29scyBpbXBvcnQgZXhwYW5kX3N0YW1wX3ZhcnMKKworaW1wb3J0IGlvCitpbXBvcnQgdW5pdHRlc3QKKworCitjbGFzcyBGaWx0ZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKyAgIiIiQSBzaW1wbGUgdGVzdCBvZiB0aGUgZXhwYW5zaW9uIGZlYXR1cmUuIiIiCisKKyAgZGVmIHRlc3RfYmFzaWMoc2VsZik6CisgICAgc3RhbXBzID0gIiIiCitCVUlMRF9TVEFNUF9PTkUgdmFsdWVfb25lCitCVUlMRF9TVEFNUF9UV08gdmFsdWVfdHdvCisiIiIKKyAgICBpbnB1dCA9ICJUaGlzIGlzIHtCVUlMRF9TVEFNUF9UV099LiBUaGlzIGlzIHtCVUlMRF9TVEFNUF9PTkV9LiIKKyAgICBnb2xkZW4gPSAiVGhpcyBpcyB2YWx1ZV90d28uIFRoaXMgaXMgdmFsdWVfb25lLiIKKworICAgIGlzdHJlYW0gPSBpby5TdHJpbmdJTyhpbnB1dCkKKyAgICBvc3RyZWFtID0gaW8uU3RyaW5nSU8oKQorICAgIHN0YW1wcyA9IGV4cGFuZF9zdGFtcF92YXJzLnJlYWRfc3RhbXBzKGlvLlN0cmluZ0lPKHN0YW1wcykpCisgICAgZXhwYW5kX3N0YW1wX3ZhcnMuZXhwYW5kKGlzdHJlYW0sIG9zdHJlYW0sIHN0YW1wcykKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwob3N0cmVhbS5nZXR2YWx1ZSgpLCBnb2xkZW4pCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS90b29scy93b3Jrc3BhY2Vfc3RhdHVzLnNoIGIvdG9vbHMvd29ya3NwYWNlX3N0YXR1cy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZDE3ZDFhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvd29ya3NwYWNlX3N0YXR1cy5zaApAQCAtMCwwICsxLDQyIEBACisjIS9iaW4vc2gKKworIyBDb3B5cmlnaHQgMjAyMyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIyAtLS0KKworIyBPdXRwdXQga2V5LXZhbHVlIHBhaXJzIHdpdGggd2hpY2ggdG8gc3RhbXAgYnVpbGQgb3V0cHV0cy4gVGhpcyBzY3JpcHQgaXMKKyMgY2FsbGVkIGJ5IHRoZSBiYXplbCBvcHRpb24gLS13b3Jrc3BhY2Vfc3RhdHVzX2NvbW1hbmQsIHdoaWNoIGlzIGxpa2VseSB0byBiZQorIyBlbWJlZGRlZCBpbiAuYmF6ZWxyYy4gQmF6ZWwgZ2VuZXJhdGVzIHNvbWUga2V5cywgc3VjaCBhcyBCVUlMRF9FTUJFRF9MQUJFTCwKKyMgb24gaXRzIG93biwgb3V0c2lkZSBvZiB0aGlzIHNjcmlwdC4gU2VhcmNoIGZvciAiQmF6ZWwgd29ya3NwYWNlIHN0YXR1cyIgZm9yCisjIG1vcmUsIGluY2x1ZGluZyB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBTVEFCTEVfIGFuZCB2b2xhdGlsZSBrZXlzLgorCisKKyMgVW5hbWJpZ3VvdXMgaWRlbnRpZmljYXRpb24gb2YgdGhlIHNvdXJjZSB0cmVlCitlY2hvIFNUQUJMRV9HSVRfSEFTSCAkKGdpdCBkZXNjcmliZSAtLWFsd2F5cyAtLWxvbmcgLS1kaXJ0eSkKKworIyBIdW1hbi1yZWFkYWJsZSB0aW1lc3RhbXAgb2YgZ2l0IEhFQUQncyBjb21taXQgZGF0ZS4gVXNlIGRhdGVzIGRlcml2ZWQgZnJvbQorIyBnaXQgZm9yIHN0YWJpbGl0eSBhY3Jvc3MgbXVsdGlwbGUgaW52b2NhdGlvbnMgb2YgdGhlIGBiYXplbGAgY29tbWFuZC4gVXNlIFVUQworIyByYXRoZXIgdGhhbiBjb21taXR0ZXIgb3IgbG9jYWwgdGltZXpvbmVzIGZvciBjb25zaXN0ZW5jeSBhY3Jvc3MgYnVpbGQKKyMgZW52aXJvbm1lbnRzLiBVc2UgY29tbWl0IGRhdGUgaW5zdGVhZCBvZiBhdXRob3IgZGF0ZSwgdGhlIGRlZmF1bHQgZGF0ZSBzaG93bgorIyBieSBgZ2l0IGxvZ2AgYW5kIEdpdEh1YiwgYmVjYXVzZSBhbWVuZGluZywgcmViYXNpbmcsIG1lcmdpbmcsIGV0Yy4gY2FuIGNhdXNlCisjIHRoZSBhdXRob3IgZGF0ZSBvZiBkZXNjZW5kZW50IGNvbW1pdHMgdG8gYmUgZWFybGllciB0aGFuIHRob3NlIG9mIHRoZWlyCisjIGFuY2VzdG9ycy4KKyMKKyMgQ29tcGFyYWJsZSBjb21taXQgZGF0ZXMgY2FuIGJlIHByb2R1Y2VkIHZpYToKKyMgICAgIGBUWj1VVEMwIGdpdCBsb2cgLS1wcmV0dHk9ZnVsbGVyIC0tZGF0ZT1sb2NhbGAuCisjCitlY2hvIFNUQUJMRV9HSVRfQ09NTUlUX1RJTUUgJChUWj1VVEMwIGdpdCBzaG93IFwKKyAgICAtLW5vLXBhdGNoIFwKKyAgICAtLWZvcm1hdD1mb3JtYXQ6JWNkIFwKKyAgICAtLWRhdGU9Zm9ybWF0LWxvY2FsOiVZJW0lZCVIJU0lUykK