ZGlmZiAtLWdpdCBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9kZXNjZm10L3N0cmluZ2VyLmdvIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2Rlc2NmbXQvc3RyaW5nZXIuZ28KaW5kZXggMzYwYzYzMy4uYTQ1NjI1YyAxMDA2NDQKLS0tIGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2Rlc2NmbXQvc3RyaW5nZXIuZ28KKysrIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2Rlc2NmbXQvc3RyaW5nZXIuZ28KQEAgLTE0LDcgKzE0LDcgQEAKIAogCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9kZXRyYW5kIgogCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9wcmFnbWEiCi0JcHJlZiAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZmxlY3QiCisJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgogKQogCiB0eXBlIGxpc3QgaW50ZXJmYWNlIHsKQEAgLTMwLDE3ICszMCwxNyBAQAogCWlmIGlzUm9vdCB7CiAJCXZhciBuYW1lIHN0cmluZwogCQlzd2l0Y2ggdnMuKHR5cGUpIHsKLQkJY2FzZSBwcmVmLk5hbWVzOgorCQljYXNlIHByb3RvcmVmbGVjdC5OYW1lczoKIAkJCW5hbWUgPSAiTmFtZXMiCi0JCWNhc2UgcHJlZi5GaWVsZE51bWJlcnM6CisJCWNhc2UgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyczoKIAkJCW5hbWUgPSAiRmllbGROdW1iZXJzIgotCQljYXNlIHByZWYuRmllbGRSYW5nZXM6CisJCWNhc2UgcHJvdG9yZWZsZWN0LkZpZWxkUmFuZ2VzOgogCQkJbmFtZSA9ICJGaWVsZFJhbmdlcyIKLQkJY2FzZSBwcmVmLkVudW1SYW5nZXM6CisJCWNhc2UgcHJvdG9yZWZsZWN0LkVudW1SYW5nZXM6CiAJCQluYW1lID0gIkVudW1SYW5nZXMiCi0JCWNhc2UgcHJlZi5GaWxlSW1wb3J0czoKKwkJY2FzZSBwcm90b3JlZmxlY3QuRmlsZUltcG9ydHM6CiAJCQluYW1lID0gIkZpbGVJbXBvcnRzIgotCQljYXNlIHByZWYuRGVzY3JpcHRvcjoKKwkJY2FzZSBwcm90b3JlZmxlY3QuRGVzY3JpcHRvcjoKIAkJCW5hbWUgPSByZWZsZWN0LlZhbHVlT2YodnMpLk1ldGhvZEJ5TmFtZSgiR2V0IikuVHlwZSgpLk91dCgwKS5OYW1lKCkgKyAicyIKIAkJZGVmYXVsdDoKIAkJCW5hbWUgPSByZWZsZWN0LlZhbHVlT2YodnMpLkVsZW0oKS5UeXBlKCkuTmFtZSgpCkBAIC01MCwxNyArNTAsMTcgQEAKIAogCXZhciBzcyBbXXN0cmluZwogCXN3aXRjaCB2cyA6PSB2cy4odHlwZSkgewotCWNhc2UgcHJlZi5OYW1lczoKKwljYXNlIHByb3RvcmVmbGVjdC5OYW1lczoKIAkJZm9yIGkgOj0gMDsgaSA8IHZzLkxlbigpOyBpKysgewogCQkJc3MgPSBhcHBlbmQoc3MsIGZtdC5TcHJpbnQodnMuR2V0KGkpKSkKIAkJfQogCQlyZXR1cm4gc3RhcnQgKyBqb2luU3RyaW5ncyhzcywgZmFsc2UpICsgZW5kCi0JY2FzZSBwcmVmLkZpZWxkTnVtYmVyczoKKwljYXNlIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlcnM6CiAJCWZvciBpIDo9IDA7IGkgPCB2cy5MZW4oKTsgaSsrIHsKIAkJCXNzID0gYXBwZW5kKHNzLCBmbXQuU3ByaW50KHZzLkdldChpKSkpCiAJCX0KIAkJcmV0dXJuIHN0YXJ0ICsgam9pblN0cmluZ3Moc3MsIGZhbHNlKSArIGVuZAotCWNhc2UgcHJlZi5GaWVsZFJhbmdlczoKKwljYXNlIHByb3RvcmVmbGVjdC5GaWVsZFJhbmdlczoKIAkJZm9yIGkgOj0gMDsgaSA8IHZzLkxlbigpOyBpKysgewogCQkJciA6PSB2cy5HZXQoaSkKIAkJCWlmIHJbMF0rMSA9PSByWzFdIHsKQEAgLTcwLDcgKzcwLDcgQEAKIAkJCX0KIAkJfQogCQlyZXR1cm4gc3RhcnQgKyBqb2luU3RyaW5ncyhzcywgZmFsc2UpICsgZW5kCi0JY2FzZSBwcmVmLkVudW1SYW5nZXM6CisJY2FzZSBwcm90b3JlZmxlY3QuRW51bVJhbmdlczoKIAkJZm9yIGkgOj0gMDsgaSA8IHZzLkxlbigpOyBpKysgewogCQkJciA6PSB2cy5HZXQoaSkKIAkJCWlmIHJbMF0gPT0gclsxXSB7CkBAIC04MCw0NiArODAsNDQgQEAKIAkJCX0KIAkJfQogCQlyZXR1cm4gc3RhcnQgKyBqb2luU3RyaW5ncyhzcywgZmFsc2UpICsgZW5kCi0JY2FzZSBwcmVmLkZpbGVJbXBvcnRzOgorCWNhc2UgcHJvdG9yZWZsZWN0LkZpbGVJbXBvcnRzOgogCQlmb3IgaSA6PSAwOyBpIDwgdnMuTGVuKCk7IGkrKyB7CiAJCQl2YXIgcnMgcmVjb3JkcwotCQkJcnMuQXBwZW5kKHJlZmxlY3QuVmFsdWVPZih2cy5HZXQoaSkpLCAiUGF0aCIsICJQYWNrYWdlIiwgIklzUHVibGljIiwgIklzV2VhayIpCisJCQlydiA6PSByZWZsZWN0LlZhbHVlT2YodnMuR2V0KGkpKQorCQkJcnMuQXBwZW5kKHJ2LCBbXW1ldGhvZEFuZE5hbWV7CisJCQkJe3J2Lk1ldGhvZEJ5TmFtZSgiUGF0aCIpLCAiUGF0aCJ9LAorCQkJCXtydi5NZXRob2RCeU5hbWUoIlBhY2thZ2UiKSwgIlBhY2thZ2UifSwKKwkJCQl7cnYuTWV0aG9kQnlOYW1lKCJJc1B1YmxpYyIpLCAiSXNQdWJsaWMifSwKKwkJCQl7cnYuTWV0aG9kQnlOYW1lKCJJc1dlYWsiKSwgIklzV2VhayJ9LAorCQkJfS4uLikKIAkJCXNzID0gYXBwZW5kKHNzLCAieyIrcnMuSm9pbigpKyJ9IikKIAkJfQogCQlyZXR1cm4gc3RhcnQgKyBqb2luU3RyaW5ncyhzcywgYWxsb3dNdWx0aSkgKyBlbmQKIAlkZWZhdWx0OgotCQlfLCBpc0VudW1WYWx1ZSA6PSB2cy4ocHJlZi5FbnVtVmFsdWVEZXNjcmlwdG9ycykKKwkJXywgaXNFbnVtVmFsdWUgOj0gdnMuKHByb3RvcmVmbGVjdC5FbnVtVmFsdWVEZXNjcmlwdG9ycykKIAkJZm9yIGkgOj0gMDsgaSA8IHZzLkxlbigpOyBpKysgewogCQkJbSA6PSByZWZsZWN0LlZhbHVlT2YodnMpLk1ldGhvZEJ5TmFtZSgiR2V0IikKIAkJCXYgOj0gbS5DYWxsKFtdcmVmbGVjdC5WYWx1ZXtyZWZsZWN0LlZhbHVlT2YoaSl9KVswXS5JbnRlcmZhY2UoKQotCQkJc3MgPSBhcHBlbmQoc3MsIGZvcm1hdERlc2NPcHQodi4ocHJlZi5EZXNjcmlwdG9yKSwgZmFsc2UsIGFsbG93TXVsdGkgJiYgIWlzRW51bVZhbHVlKSkKKwkJCXNzID0gYXBwZW5kKHNzLCBmb3JtYXREZXNjT3B0KHYuKHByb3RvcmVmbGVjdC5EZXNjcmlwdG9yKSwgZmFsc2UsIGFsbG93TXVsdGkgJiYgIWlzRW51bVZhbHVlLCBuaWwpKQogCQl9CiAJCXJldHVybiBzdGFydCArIGpvaW5TdHJpbmdzKHNzLCBhbGxvd011bHRpICYmIGlzRW51bVZhbHVlKSArIGVuZAogCX0KIH0KIAotLy8gZGVzY3JpcHRvckFjY2Vzc29ycyBpcyBhIGxpc3Qgb2YgYWNjZXNzb3JzIHRvIHByaW50IGZvciBlYWNoIGRlc2NyaXB0b3IuCi0vLwotLy8gRG8gbm90IHByaW50IGFsbCBhY2Nlc3NvcnMgc2luY2Ugc29tZSBjb250YWluIHJlZHVuZGFudCBpbmZvcm1hdGlvbiwKLS8vIHdoaWxlIG90aGVycyBhcmUgcG9pbnRlcnMgdGhhdCB3ZSBkbyBub3Qgd2FudCB0byBmb2xsb3cgc2luY2UgdGhlIGRlc2NyaXB0b3IKLS8vIGlzIGFjdHVhbGx5IGEgY3ljbGljIGdyYXBoLgotLy8KLS8vIFVzaW5nIGEgbGlzdCBhbGxvd3MgdXMgdG8gcHJpbnQgdGhlIGFjY2Vzc29ycyBpbiBhIHNlbnNpYmxlIG9yZGVyLgotdmFyIGRlc2NyaXB0b3JBY2Nlc3NvcnMgPSBtYXBbcmVmbGVjdC5UeXBlXVtdc3RyaW5newotCXJlZmxlY3QuVHlwZU9mKCgqcHJlZi5GaWxlRGVzY3JpcHRvcikobmlsKSkuRWxlbSgpOiAgICAgIHsiUGF0aCIsICJQYWNrYWdlIiwgIkltcG9ydHMiLCAiTWVzc2FnZXMiLCAiRW51bXMiLCAiRXh0ZW5zaW9ucyIsICJTZXJ2aWNlcyJ9LAotCXJlZmxlY3QuVHlwZU9mKCgqcHJlZi5NZXNzYWdlRGVzY3JpcHRvcikobmlsKSkuRWxlbSgpOiAgIHsiSXNNYXBFbnRyeSIsICJGaWVsZHMiLCAiT25lb2ZzIiwgIlJlc2VydmVkTmFtZXMiLCAiUmVzZXJ2ZWRSYW5nZXMiLCAiUmVxdWlyZWROdW1iZXJzIiwgIkV4dGVuc2lvblJhbmdlcyIsICJNZXNzYWdlcyIsICJFbnVtcyIsICJFeHRlbnNpb25zIn0sCi0JcmVmbGVjdC5UeXBlT2YoKCpwcmVmLkZpZWxkRGVzY3JpcHRvcikobmlsKSkuRWxlbSgpOiAgICAgeyJOdW1iZXIiLCAiQ2FyZGluYWxpdHkiLCAiS2luZCIsICJIYXNKU09OTmFtZSIsICJKU09OTmFtZSIsICJIYXNQcmVzZW5jZSIsICJJc0V4dGVuc2lvbiIsICJJc1BhY2tlZCIsICJJc1dlYWsiLCAiSXNMaXN0IiwgIklzTWFwIiwgIk1hcEtleSIsICJNYXBWYWx1ZSIsICJIYXNEZWZhdWx0IiwgIkRlZmF1bHQiLCAiQ29udGFpbmluZ09uZW9mIiwgIkNvbnRhaW5pbmdNZXNzYWdlIiwgIk1lc3NhZ2UiLCAiRW51bSJ9LAotCXJlZmxlY3QuVHlwZU9mKCgqcHJlZi5PbmVvZkRlc2NyaXB0b3IpKG5pbCkpLkVsZW0oKTogICAgIHsiRmllbGRzIn0sIC8vIG5vdCBkaXJlY3RseSB1c2VkOyBtdXN0IGtlZXAgaW4gc3luYyB3aXRoIGZvcm1hdERlc2NPcHQKLQlyZWZsZWN0LlR5cGVPZigoKnByZWYuRW51bURlc2NyaXB0b3IpKG5pbCkpLkVsZW0oKTogICAgICB7IlZhbHVlcyIsICJSZXNlcnZlZE5hbWVzIiwgIlJlc2VydmVkUmFuZ2VzIn0sCi0JcmVmbGVjdC5UeXBlT2YoKCpwcmVmLkVudW1WYWx1ZURlc2NyaXB0b3IpKG5pbCkpLkVsZW0oKTogeyJOdW1iZXIifSwKLQlyZWZsZWN0LlR5cGVPZigoKnByZWYuU2VydmljZURlc2NyaXB0b3IpKG5pbCkpLkVsZW0oKTogICB7Ik1ldGhvZHMifSwKLQlyZWZsZWN0LlR5cGVPZigoKnByZWYuTWV0aG9kRGVzY3JpcHRvcikobmlsKSkuRWxlbSgpOiAgICB7IklucHV0IiwgIk91dHB1dCIsICJJc1N0cmVhbWluZ0NsaWVudCIsICJJc1N0cmVhbWluZ1NlcnZlciJ9LAordHlwZSBtZXRob2RBbmROYW1lIHN0cnVjdCB7CisJbWV0aG9kIHJlZmxlY3QuVmFsdWUKKwluYW1lICAgc3RyaW5nCiB9CiAKLWZ1bmMgRm9ybWF0RGVzYyhzIGZtdC5TdGF0ZSwgciBydW5lLCB0IHByZWYuRGVzY3JpcHRvcikgewotCWlvLldyaXRlU3RyaW5nKHMsIGZvcm1hdERlc2NPcHQodCwgdHJ1ZSwgciA9PSAndicgJiYgKHMuRmxhZygnKycpIHx8IHMuRmxhZygnIycpKSkpCitmdW5jIEZvcm1hdERlc2MocyBmbXQuU3RhdGUsIHIgcnVuZSwgdCBwcm90b3JlZmxlY3QuRGVzY3JpcHRvcikgeworCWlvLldyaXRlU3RyaW5nKHMsIGZvcm1hdERlc2NPcHQodCwgdHJ1ZSwgciA9PSAndicgJiYgKHMuRmxhZygnKycpIHx8IHMuRmxhZygnIycpKSwgbmlsKSkKIH0KLWZ1bmMgZm9ybWF0RGVzY09wdCh0IHByZWYuRGVzY3JpcHRvciwgaXNSb290LCBhbGxvd011bHRpIGJvb2wpIHN0cmluZyB7CisKK2Z1bmMgSW50ZXJuYWxGb3JtYXREZXNjT3B0Rm9yVGVzdGluZyh0IHByb3RvcmVmbGVjdC5EZXNjcmlwdG9yLCBpc1Jvb3QsIGFsbG93TXVsdGkgYm9vbCwgcmVjb3JkIGZ1bmMoc3RyaW5nKSkgc3RyaW5nIHsKKwlyZXR1cm4gZm9ybWF0RGVzY09wdCh0LCBpc1Jvb3QsIGFsbG93TXVsdGksIHJlY29yZCkKK30KKworZnVuYyBmb3JtYXREZXNjT3B0KHQgcHJvdG9yZWZsZWN0LkRlc2NyaXB0b3IsIGlzUm9vdCwgYWxsb3dNdWx0aSBib29sLCByZWNvcmQgZnVuYyhzdHJpbmcpKSBzdHJpbmcgewogCXJ2IDo9IHJlZmxlY3QuVmFsdWVPZih0KQogCXJ0IDo9IHJ2Lk1ldGhvZEJ5TmFtZSgiUHJvdG9UeXBlIikuVHlwZSgpLkluKDApCiAKQEAgLTEyOCwyNyArMTI2LDYxIEBACiAJCXN0YXJ0ID0gcnQuTmFtZSgpICsgInsiCiAJfQogCi0JXywgaXNGaWxlIDo9IHQuKHByZWYuRmlsZURlc2NyaXB0b3IpCi0JcnMgOj0gcmVjb3Jkc3thbGxvd011bHRpOiBhbGxvd011bHRpfQorCV8sIGlzRmlsZSA6PSB0Lihwcm90b3JlZmxlY3QuRmlsZURlc2NyaXB0b3IpCisJcnMgOj0gcmVjb3Jkc3sKKwkJYWxsb3dNdWx0aTogYWxsb3dNdWx0aSwKKwkJcmVjb3JkOiAgICAgcmVjb3JkLAorCX0KIAlpZiB0LklzUGxhY2Vob2xkZXIoKSB7CiAJCWlmIGlzRmlsZSB7Ci0JCQlycy5BcHBlbmQocnYsICJQYXRoIiwgIlBhY2thZ2UiLCAiSXNQbGFjZWhvbGRlciIpCisJCQlycy5BcHBlbmQocnYsIFtdbWV0aG9kQW5kTmFtZXsKKwkJCQl7cnYuTWV0aG9kQnlOYW1lKCJQYXRoIiksICJQYXRoIn0sCisJCQkJe3J2Lk1ldGhvZEJ5TmFtZSgiUGFja2FnZSIpLCAiUGFja2FnZSJ9LAorCQkJCXtydi5NZXRob2RCeU5hbWUoIklzUGxhY2Vob2xkZXIiKSwgIklzUGxhY2Vob2xkZXIifSwKKwkJCX0uLi4pCiAJCX0gZWxzZSB7Ci0JCQlycy5BcHBlbmQocnYsICJGdWxsTmFtZSIsICJJc1BsYWNlaG9sZGVyIikKKwkJCXJzLkFwcGVuZChydiwgW11tZXRob2RBbmROYW1leworCQkJCXtydi5NZXRob2RCeU5hbWUoIkZ1bGxOYW1lIiksICJGdWxsTmFtZSJ9LAorCQkJCXtydi5NZXRob2RCeU5hbWUoIklzUGxhY2Vob2xkZXIiKSwgIklzUGxhY2Vob2xkZXIifSwKKwkJCX0uLi4pCiAJCX0KIAl9IGVsc2UgewogCQlzd2l0Y2ggewogCQljYXNlIGlzRmlsZToKLQkJCXJzLkFwcGVuZChydiwgIlN5bnRheCIpCisJCQlycy5BcHBlbmQocnYsIG1ldGhvZEFuZE5hbWV7cnYuTWV0aG9kQnlOYW1lKCJTeW50YXgiKSwgIlN5bnRheCJ9KQogCQljYXNlIGlzUm9vdDoKLQkJCXJzLkFwcGVuZChydiwgIlN5bnRheCIsICJGdWxsTmFtZSIpCisJCQlycy5BcHBlbmQocnYsIFtdbWV0aG9kQW5kTmFtZXsKKwkJCQl7cnYuTWV0aG9kQnlOYW1lKCJTeW50YXgiKSwgIlN5bnRheCJ9LAorCQkJCXtydi5NZXRob2RCeU5hbWUoIkZ1bGxOYW1lIiksICJGdWxsTmFtZSJ9LAorCQkJfS4uLikKIAkJZGVmYXVsdDoKLQkJCXJzLkFwcGVuZChydiwgIk5hbWUiKQorCQkJcnMuQXBwZW5kKHJ2LCBtZXRob2RBbmROYW1le3J2Lk1ldGhvZEJ5TmFtZSgiTmFtZSIpLCAiTmFtZSJ9KQogCQl9CiAJCXN3aXRjaCB0IDo9IHQuKHR5cGUpIHsKLQkJY2FzZSBwcmVmLkZpZWxkRGVzY3JpcHRvcjoKLQkJCWZvciBfLCBzIDo9IHJhbmdlIGRlc2NyaXB0b3JBY2Nlc3NvcnNbcnRdIHsKLQkJCQlzd2l0Y2ggcyB7CisJCWNhc2UgcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvcjoKKwkJCWFjY2Vzc29ycyA6PSBbXW1ldGhvZEFuZE5hbWV7CisJCQkJe3J2Lk1ldGhvZEJ5TmFtZSgiTnVtYmVyIiksICJOdW1iZXIifSwKKwkJCQl7cnYuTWV0aG9kQnlOYW1lKCJDYXJkaW5hbGl0eSIpLCAiQ2FyZGluYWxpdHkifSwKKwkJCQl7cnYuTWV0aG9kQnlOYW1lKCJLaW5kIiksICJLaW5kIn0sCisJCQkJe3J2Lk1ldGhvZEJ5TmFtZSgiSGFzSlNPTk5hbWUiKSwgIkhhc0pTT05OYW1lIn0sCisJCQkJe3J2Lk1ldGhvZEJ5TmFtZSgiSlNPTk5hbWUiKSwgIkpTT05OYW1lIn0sCisJCQkJe3J2Lk1ldGhvZEJ5TmFtZSgiSGFzUHJlc2VuY2UiKSwgIkhhc1ByZXNlbmNlIn0sCisJCQkJe3J2Lk1ldGhvZEJ5TmFtZSgiSXNFeHRlbnNpb24iKSwgIklzRXh0ZW5zaW9uIn0sCisJCQkJe3J2Lk1ldGhvZEJ5TmFtZSgiSXNQYWNrZWQiKSwgIklzUGFja2VkIn0sCisJCQkJe3J2Lk1ldGhvZEJ5TmFtZSgiSXNXZWFrIiksICJJc1dlYWsifSwKKwkJCQl7cnYuTWV0aG9kQnlOYW1lKCJJc0xpc3QiKSwgIklzTGlzdCJ9LAorCQkJCXtydi5NZXRob2RCeU5hbWUoIklzTWFwIiksICJJc01hcCJ9LAorCQkJCXtydi5NZXRob2RCeU5hbWUoIk1hcEtleSIpLCAiTWFwS2V5In0sCisJCQkJe3J2Lk1ldGhvZEJ5TmFtZSgiTWFwVmFsdWUiKSwgIk1hcFZhbHVlIn0sCisJCQkJe3J2Lk1ldGhvZEJ5TmFtZSgiSGFzRGVmYXVsdCIpLCAiSGFzRGVmYXVsdCJ9LAorCQkJCXtydi5NZXRob2RCeU5hbWUoIkRlZmF1bHQiKSwgIkRlZmF1bHQifSwKKwkJCQl7cnYuTWV0aG9kQnlOYW1lKCJDb250YWluaW5nT25lb2YiKSwgIkNvbnRhaW5pbmdPbmVvZiJ9LAorCQkJCXtydi5NZXRob2RCeU5hbWUoIkNvbnRhaW5pbmdNZXNzYWdlIiksICJDb250YWluaW5nTWVzc2FnZSJ9LAorCQkJCXtydi5NZXRob2RCeU5hbWUoIk1lc3NhZ2UiKSwgIk1lc3NhZ2UifSwKKwkJCQl7cnYuTWV0aG9kQnlOYW1lKCJFbnVtIiksICJFbnVtIn0sCisJCQl9CisJCQlmb3IgXywgcyA6PSByYW5nZSBhY2Nlc3NvcnMgeworCQkJCXN3aXRjaCBzLm5hbWUgewogCQkJCWNhc2UgIk1hcEtleSI6CiAJCQkJCWlmIGsgOj0gdC5NYXBLZXkoKTsgayAhPSBuaWwgewogCQkJCQkJcnMucmVjcyA9IGFwcGVuZChycy5yZWNzLCBbMl1zdHJpbmd7Ik1hcEtleSIsIGsuS2luZCgpLlN0cmluZygpfSkKQEAgLTE1NiwyMSArMTg4LDIxIEBACiAJCQkJY2FzZSAiTWFwVmFsdWUiOgogCQkJCQlpZiB2IDo9IHQuTWFwVmFsdWUoKTsgdiAhPSBuaWwgewogCQkJCQkJc3dpdGNoIHYuS2luZCgpIHsKLQkJCQkJCWNhc2UgcHJlZi5FbnVtS2luZDoKLQkJCQkJCQlycy5yZWNzID0gYXBwZW5kKHJzLnJlY3MsIFsyXXN0cmluZ3siTWFwVmFsdWUiLCBzdHJpbmcodi5FbnVtKCkuRnVsbE5hbWUoKSl9KQotCQkJCQkJY2FzZSBwcmVmLk1lc3NhZ2VLaW5kLCBwcmVmLkdyb3VwS2luZDoKLQkJCQkJCQlycy5yZWNzID0gYXBwZW5kKHJzLnJlY3MsIFsyXXN0cmluZ3siTWFwVmFsdWUiLCBzdHJpbmcodi5NZXNzYWdlKCkuRnVsbE5hbWUoKSl9KQorCQkJCQkJY2FzZSBwcm90b3JlZmxlY3QuRW51bUtpbmQ6CisJCQkJCQkJcnMuQXBwZW5kUmVjcygiTWFwVmFsdWUiLCBbMl1zdHJpbmd7Ik1hcFZhbHVlIiwgc3RyaW5nKHYuRW51bSgpLkZ1bGxOYW1lKCkpfSkKKwkJCQkJCWNhc2UgcHJvdG9yZWZsZWN0Lk1lc3NhZ2VLaW5kLCBwcm90b3JlZmxlY3QuR3JvdXBLaW5kOgorCQkJCQkJCXJzLkFwcGVuZFJlY3MoIk1hcFZhbHVlIiwgWzJdc3RyaW5neyJNYXBWYWx1ZSIsIHN0cmluZyh2Lk1lc3NhZ2UoKS5GdWxsTmFtZSgpKX0pCiAJCQkJCQlkZWZhdWx0OgotCQkJCQkJCXJzLnJlY3MgPSBhcHBlbmQocnMucmVjcywgWzJdc3RyaW5neyJNYXBWYWx1ZSIsIHYuS2luZCgpLlN0cmluZygpfSkKKwkJCQkJCQlycy5BcHBlbmRSZWNzKCJNYXBWYWx1ZSIsIFsyXXN0cmluZ3siTWFwVmFsdWUiLCB2LktpbmQoKS5TdHJpbmcoKX0pCiAJCQkJCQl9CiAJCQkJCX0KIAkJCQljYXNlICJDb250YWluaW5nT25lb2YiOgogCQkJCQlpZiBvZCA6PSB0LkNvbnRhaW5pbmdPbmVvZigpOyBvZCAhPSBuaWwgewotCQkJCQkJcnMucmVjcyA9IGFwcGVuZChycy5yZWNzLCBbMl1zdHJpbmd7Ik9uZW9mIiwgc3RyaW5nKG9kLk5hbWUoKSl9KQorCQkJCQkJcnMuQXBwZW5kUmVjcygiQ29udGFpbmluZ09uZW9mIiwgWzJdc3RyaW5neyJPbmVvZiIsIHN0cmluZyhvZC5OYW1lKCkpfSkKIAkJCQkJfQogCQkJCWNhc2UgIkNvbnRhaW5pbmdNZXNzYWdlIjoKIAkJCQkJaWYgdC5Jc0V4dGVuc2lvbigpIHsKLQkJCQkJCXJzLnJlY3MgPSBhcHBlbmQocnMucmVjcywgWzJdc3RyaW5neyJFeHRlbmRlZSIsIHN0cmluZyh0LkNvbnRhaW5pbmdNZXNzYWdlKCkuRnVsbE5hbWUoKSl9KQorCQkJCQkJcnMuQXBwZW5kUmVjcygiQ29udGFpbmluZ01lc3NhZ2UiLCBbMl1zdHJpbmd7IkV4dGVuZGVlIiwgc3RyaW5nKHQuQ29udGFpbmluZ01lc3NhZ2UoKS5GdWxsTmFtZSgpKX0pCiAJCQkJCX0KIAkJCQljYXNlICJNZXNzYWdlIjoKIAkJCQkJaWYgIXQuSXNNYXAoKSB7CkBAIC0xODAsMjAgKzIxMiw2OCBAQAogCQkJCQlycy5BcHBlbmQocnYsIHMpCiAJCQkJfQogCQkJfQotCQljYXNlIHByZWYuT25lb2ZEZXNjcmlwdG9yOgorCQljYXNlIHByb3RvcmVmbGVjdC5PbmVvZkRlc2NyaXB0b3I6CiAJCQl2YXIgc3MgW11zdHJpbmcKIAkJCWZzIDo9IHQuRmllbGRzKCkKIAkJCWZvciBpIDo9IDA7IGkgPCBmcy5MZW4oKTsgaSsrIHsKIAkJCQlzcyA9IGFwcGVuZChzcywgc3RyaW5nKGZzLkdldChpKS5OYW1lKCkpKQogCQkJfQogCQkJaWYgbGVuKHNzKSA+IDAgewotCQkJCXJzLnJlY3MgPSBhcHBlbmQocnMucmVjcywgWzJdc3RyaW5neyJGaWVsZHMiLCAiWyIgKyBqb2luU3RyaW5ncyhzcywgZmFsc2UpICsgIl0ifSkKKwkJCQlycy5BcHBlbmRSZWNzKCJGaWVsZHMiLCBbMl1zdHJpbmd7IkZpZWxkcyIsICJbIiArIGpvaW5TdHJpbmdzKHNzLCBmYWxzZSkgKyAiXSJ9KQogCQkJfQotCQlkZWZhdWx0OgotCQkJcnMuQXBwZW5kKHJ2LCBkZXNjcmlwdG9yQWNjZXNzb3JzW3J0XS4uLikKKworCQljYXNlIHByb3RvcmVmbGVjdC5GaWxlRGVzY3JpcHRvcjoKKwkJCXJzLkFwcGVuZChydiwgW11tZXRob2RBbmROYW1leworCQkJCXtydi5NZXRob2RCeU5hbWUoIlBhdGgiKSwgIlBhdGgifSwKKwkJCQl7cnYuTWV0aG9kQnlOYW1lKCJQYWNrYWdlIiksICJQYWNrYWdlIn0sCisJCQkJe3J2Lk1ldGhvZEJ5TmFtZSgiSW1wb3J0cyIpLCAiSW1wb3J0cyJ9LAorCQkJCXtydi5NZXRob2RCeU5hbWUoIk1lc3NhZ2VzIiksICJNZXNzYWdlcyJ9LAorCQkJCXtydi5NZXRob2RCeU5hbWUoIkVudW1zIiksICJFbnVtcyJ9LAorCQkJCXtydi5NZXRob2RCeU5hbWUoIkV4dGVuc2lvbnMiKSwgIkV4dGVuc2lvbnMifSwKKwkJCQl7cnYuTWV0aG9kQnlOYW1lKCJTZXJ2aWNlcyIpLCAiU2VydmljZXMifSwKKwkJCX0uLi4pCisKKwkJY2FzZSBwcm90b3JlZmxlY3QuTWVzc2FnZURlc2NyaXB0b3I6CisJCQlycy5BcHBlbmQocnYsIFtdbWV0aG9kQW5kTmFtZXsKKwkJCQl7cnYuTWV0aG9kQnlOYW1lKCJJc01hcEVudHJ5IiksICJJc01hcEVudHJ5In0sCisJCQkJe3J2Lk1ldGhvZEJ5TmFtZSgiRmllbGRzIiksICJGaWVsZHMifSwKKwkJCQl7cnYuTWV0aG9kQnlOYW1lKCJPbmVvZnMiKSwgIk9uZW9mcyJ9LAorCQkJCXtydi5NZXRob2RCeU5hbWUoIlJlc2VydmVkTmFtZXMiKSwgIlJlc2VydmVkTmFtZXMifSwKKwkJCQl7cnYuTWV0aG9kQnlOYW1lKCJSZXNlcnZlZFJhbmdlcyIpLCAiUmVzZXJ2ZWRSYW5nZXMifSwKKwkJCQl7cnYuTWV0aG9kQnlOYW1lKCJSZXF1aXJlZE51bWJlcnMiKSwgIlJlcXVpcmVkTnVtYmVycyJ9LAorCQkJCXtydi5NZXRob2RCeU5hbWUoIkV4dGVuc2lvblJhbmdlcyIpLCAiRXh0ZW5zaW9uUmFuZ2VzIn0sCisJCQkJe3J2Lk1ldGhvZEJ5TmFtZSgiTWVzc2FnZXMiKSwgIk1lc3NhZ2VzIn0sCisJCQkJe3J2Lk1ldGhvZEJ5TmFtZSgiRW51bXMiKSwgIkVudW1zIn0sCisJCQkJe3J2Lk1ldGhvZEJ5TmFtZSgiRXh0ZW5zaW9ucyIpLCAiRXh0ZW5zaW9ucyJ9LAorCQkJfS4uLikKKworCQljYXNlIHByb3RvcmVmbGVjdC5FbnVtRGVzY3JpcHRvcjoKKwkJCXJzLkFwcGVuZChydiwgW11tZXRob2RBbmROYW1leworCQkJCXtydi5NZXRob2RCeU5hbWUoIlZhbHVlcyIpLCAiVmFsdWVzIn0sCisJCQkJe3J2Lk1ldGhvZEJ5TmFtZSgiUmVzZXJ2ZWROYW1lcyIpLCAiUmVzZXJ2ZWROYW1lcyJ9LAorCQkJCXtydi5NZXRob2RCeU5hbWUoIlJlc2VydmVkUmFuZ2VzIiksICJSZXNlcnZlZFJhbmdlcyJ9LAorCQkJfS4uLikKKworCQljYXNlIHByb3RvcmVmbGVjdC5FbnVtVmFsdWVEZXNjcmlwdG9yOgorCQkJcnMuQXBwZW5kKHJ2LCBbXW1ldGhvZEFuZE5hbWV7CisJCQkJe3J2Lk1ldGhvZEJ5TmFtZSgiTnVtYmVyIiksICJOdW1iZXIifSwKKwkJCX0uLi4pCisKKwkJY2FzZSBwcm90b3JlZmxlY3QuU2VydmljZURlc2NyaXB0b3I6CisJCQlycy5BcHBlbmQocnYsIFtdbWV0aG9kQW5kTmFtZXsKKwkJCQl7cnYuTWV0aG9kQnlOYW1lKCJNZXRob2RzIiksICJNZXRob2RzIn0sCisJCQl9Li4uKQorCisJCWNhc2UgcHJvdG9yZWZsZWN0Lk1ldGhvZERlc2NyaXB0b3I6CisJCQlycy5BcHBlbmQocnYsIFtdbWV0aG9kQW5kTmFtZXsKKwkJCQl7cnYuTWV0aG9kQnlOYW1lKCJJbnB1dCIpLCAiSW5wdXQifSwKKwkJCQl7cnYuTWV0aG9kQnlOYW1lKCJPdXRwdXQiKSwgIk91dHB1dCJ9LAorCQkJCXtydi5NZXRob2RCeU5hbWUoIklzU3RyZWFtaW5nQ2xpZW50IiksICJJc1N0cmVhbWluZ0NsaWVudCJ9LAorCQkJCXtydi5NZXRob2RCeU5hbWUoIklzU3RyZWFtaW5nU2VydmVyIiksICJJc1N0cmVhbWluZ1NlcnZlciJ9LAorCQkJfS4uLikKIAkJfQotCQlpZiBydi5NZXRob2RCeU5hbWUoIkdvVHlwZSIpLklzVmFsaWQoKSB7Ci0JCQlycy5BcHBlbmQocnYsICJHb1R5cGUiKQorCQlpZiBtIDo9IHJ2Lk1ldGhvZEJ5TmFtZSgiR29UeXBlIik7IG0uSXNWYWxpZCgpIHsKKwkJCXJzLkFwcGVuZChydiwgbWV0aG9kQW5kTmFtZXttLCAiR29UeXBlIn0pCiAJCX0KIAl9CiAJcmV0dXJuIHN0YXJ0ICsgcnMuSm9pbigpICsgZW5kCkBAIC0yMDIsMjEgKzI4MiwzNiBAQAogdHlwZSByZWNvcmRzIHN0cnVjdCB7CiAJcmVjcyAgICAgICBbXVsyXXN0cmluZwogCWFsbG93TXVsdGkgYm9vbAorCisJLy8gcmVjb3JkIGlzIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBmb3IgZXZlcnkgQXBwZW5kKCkgb3IKKwkvLyBBcHBlbmRSZWNzKCkgY2FsbCwgdG8gYmUgdXNlZCBmb3IgdGVzdGluZyB3aXRoIHRoZQorCS8vIEludGVybmFsRm9ybWF0RGVzY09wdEZvclRlc3RpbmcgZnVuY3Rpb24uCisJcmVjb3JkIGZ1bmMoc3RyaW5nKQogfQogCi1mdW5jIChycyAqcmVjb3JkcykgQXBwZW5kKHYgcmVmbGVjdC5WYWx1ZSwgYWNjZXNzb3JzIC4uLnN0cmluZykgeworZnVuYyAocnMgKnJlY29yZHMpIEFwcGVuZFJlY3MoZmllbGROYW1lIHN0cmluZywgbmV3UmVjcyBbMl1zdHJpbmcpIHsKKwlpZiBycy5yZWNvcmQgIT0gbmlsIHsKKwkJcnMucmVjb3JkKGZpZWxkTmFtZSkKKwl9CisJcnMucmVjcyA9IGFwcGVuZChycy5yZWNzLCBuZXdSZWNzKQorfQorCitmdW5jIChycyAqcmVjb3JkcykgQXBwZW5kKHYgcmVmbGVjdC5WYWx1ZSwgYWNjZXNzb3JzIC4uLm1ldGhvZEFuZE5hbWUpIHsKIAlmb3IgXywgYSA6PSByYW5nZSBhY2Nlc3NvcnMgeworCQlpZiBycy5yZWNvcmQgIT0gbmlsIHsKKwkJCXJzLnJlY29yZChhLm5hbWUpCisJCX0KIAkJdmFyIHJ2IHJlZmxlY3QuVmFsdWUKLQkJaWYgbSA6PSB2Lk1ldGhvZEJ5TmFtZShhKTsgbS5Jc1ZhbGlkKCkgewotCQkJcnYgPSBtLkNhbGwobmlsKVswXQorCQlpZiBhLm1ldGhvZC5Jc1ZhbGlkKCkgeworCQkJcnYgPSBhLm1ldGhvZC5DYWxsKG5pbClbMF0KIAkJfQogCQlpZiB2LktpbmQoKSA9PSByZWZsZWN0LlN0cnVjdCAmJiAhcnYuSXNWYWxpZCgpIHsKLQkJCXJ2ID0gdi5GaWVsZEJ5TmFtZShhKQorCQkJcnYgPSB2LkZpZWxkQnlOYW1lKGEubmFtZSkKIAkJfQogCQlpZiAhcnYuSXNWYWxpZCgpIHsKLQkJCXBhbmljKGZtdC5TcHJpbnRmKCJ1bmtub3duIGFjY2Vzc29yOiAldi4lcyIsIHYuVHlwZSgpLCBhKSkKKwkJCXBhbmljKGZtdC5TcHJpbnRmKCJ1bmtub3duIGFjY2Vzc29yOiAldi4lcyIsIHYuVHlwZSgpLCBhLm5hbWUpKQogCQl9Ci0JCWlmIF8sIG9rIDo9IHJ2LkludGVyZmFjZSgpLihwcmVmLlZhbHVlKTsgb2sgeworCQlpZiBfLCBvayA6PSBydi5JbnRlcmZhY2UoKS4ocHJvdG9yZWZsZWN0LlZhbHVlKTsgb2sgewogCQkJcnYgPSBydi5NZXRob2RCeU5hbWUoIkludGVyZmFjZSIpLkNhbGwobmlsKVswXQogCQkJaWYgIXJ2LklzTmlsKCkgewogCQkJCXJ2ID0gcnYuRWxlbSgpCkBAIC0yNTAsOSArMzQ1LDkgQEAKIAkJc3dpdGNoIHYgOj0gdi4odHlwZSkgewogCQljYXNlIGxpc3Q6CiAJCQlzID0gZm9ybWF0TGlzdE9wdCh2LCBmYWxzZSwgcnMuYWxsb3dNdWx0aSkKLQkJY2FzZSBwcmVmLkZpZWxkRGVzY3JpcHRvciwgcHJlZi5PbmVvZkRlc2NyaXB0b3IsIHByZWYuRW51bVZhbHVlRGVzY3JpcHRvciwgcHJlZi5NZXRob2REZXNjcmlwdG9yOgotCQkJcyA9IHN0cmluZyh2LihwcmVmLkRlc2NyaXB0b3IpLk5hbWUoKSkKLQkJY2FzZSBwcmVmLkRlc2NyaXB0b3I6CisJCWNhc2UgcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvciwgcHJvdG9yZWZsZWN0Lk9uZW9mRGVzY3JpcHRvciwgcHJvdG9yZWZsZWN0LkVudW1WYWx1ZURlc2NyaXB0b3IsIHByb3RvcmVmbGVjdC5NZXRob2REZXNjcmlwdG9yOgorCQkJcyA9IHN0cmluZyh2Lihwcm90b3JlZmxlY3QuRGVzY3JpcHRvcikuTmFtZSgpKQorCQljYXNlIHByb3RvcmVmbGVjdC5EZXNjcmlwdG9yOgogCQkJcyA9IHN0cmluZyh2LkZ1bGxOYW1lKCkpCiAJCWNhc2Ugc3RyaW5nOgogCQkJcyA9IHN0cmNvbnYuUXVvdGUodikKQEAgLTI2MSw3ICszNTYsNyBAQAogCQlkZWZhdWx0OgogCQkJcyA9IGZtdC5TcHJpbnQodikKIAkJfQotCQlycy5yZWNzID0gYXBwZW5kKHJzLnJlY3MsIFsyXXN0cmluZ3thLCBzfSkKKwkJcnMucmVjcyA9IGFwcGVuZChycy5yZWNzLCBbMl1zdHJpbmd7YS5uYW1lLCBzfSkKIAl9CiB9CiAKZGlmZiAtLWdpdCBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9lZGl0aW9uZGVmYXVsdHMvZGVmYXVsdHMuZ28gYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZWRpdGlvbmRlZmF1bHRzL2RlZmF1bHRzLmdvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NjU2YjYKLS0tIC9kZXYvbnVsbAorKysgYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZWRpdGlvbmRlZmF1bHRzL2RlZmF1bHRzLmdvCkBAIC0wLDAgKzEsMTIgQEAKKy8vIENvcHlyaWdodCAyMDI0IFRoZSBHbyBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUKKy8vIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworLy8gUGFja2FnZSBlZGl0aW9uZGVmYXVsdHMgY29udGFpbnMgdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZWRpdGlvbnMKKy8vIGRlZmF1bHRzLgorcGFja2FnZSBlZGl0aW9uZGVmYXVsdHMKKworaW1wb3J0IF8gImVtYmVkIgorCisvL2dvOmVtYmVkIGVkaXRpb25zX2RlZmF1bHRzLmJpbnBiCit2YXIgRGVmYXVsdHMgW11ieXRlCmRpZmYgLS1naXQgYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZWRpdGlvbmRlZmF1bHRzL2VkaXRpb25zX2RlZmF1bHRzLmJpbnBiIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2VkaXRpb25kZWZhdWx0cy9lZGl0aW9uc19kZWZhdWx0cy5iaW5wYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGYwNzU2Ci0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2VkaXRpb25kZWZhdWx0cy9lZGl0aW9uc19kZWZhdWx0cy5iaW5wYgpAQCAtMCwwICsxLDQgQEAKKworERIMCAEQAhgCIAMoATACGOYHCisREgwIAhABGAEgAigBMAEY5wcKKxESDAgBEAEYASACKAEwARjoByDmByjoBwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9lbmNvZGluZy9kZWZ2YWwvZGVmYXVsdC5nbyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9lbmNvZGluZy9kZWZ2YWwvZGVmYXVsdC5nbwppbmRleCBmZGQ5YjEzLi4zMjhkYzczIDEwMDY0NAotLS0gYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZW5jb2RpbmcvZGVmdmFsL2RlZmF1bHQuZ28KKysrIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2VuY29kaW5nL2RlZnZhbC9kZWZhdWx0LmdvCkBAIC0xNSw4ICsxNSw4IEBACiAJInN0cmNvbnYiCiAKIAlwdGV4dCAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZW5jb2RpbmcvdGV4dCIKLQllcnJvcnMgImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2Vycm9ycyIKLQlwcmVmICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9yZWZsZWN0L3Byb3RvcmVmbGVjdCIKKwkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZXJyb3JzIgorCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9yZWZsZWN0L3Byb3RvcmVmbGVjdCIKICkKIAogLy8gRm9ybWF0IGlzIHRoZSBzZXJpYWxpemF0aW9uIGZvcm1hdCB1c2VkIHRvIHJlcHJlc2VudCB0aGUgZGVmYXVsdCB2YWx1ZS4KQEAgLTM1LDU2ICszNSw1NiBAQAogCiAvLyBVbm1hcnNoYWwgZGVzZXJpYWxpemVzIHRoZSBkZWZhdWx0IHN0cmluZyBzIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4ga2luZCBrLgogLy8gV2hlbiBrIGlzIGFuIGVudW0sIGEgbGlzdCBvZiBlbnVtIHZhbHVlIGRlc2NyaXB0b3JzIG11c3QgYmUgcHJvdmlkZWQuCi1mdW5jIFVubWFyc2hhbChzIHN0cmluZywgayBwcmVmLktpbmQsIGV2cyBwcmVmLkVudW1WYWx1ZURlc2NyaXB0b3JzLCBmIEZvcm1hdCkgKHByZWYuVmFsdWUsIHByZWYuRW51bVZhbHVlRGVzY3JpcHRvciwgZXJyb3IpIHsKK2Z1bmMgVW5tYXJzaGFsKHMgc3RyaW5nLCBrIHByb3RvcmVmbGVjdC5LaW5kLCBldnMgcHJvdG9yZWZsZWN0LkVudW1WYWx1ZURlc2NyaXB0b3JzLCBmIEZvcm1hdCkgKHByb3RvcmVmbGVjdC5WYWx1ZSwgcHJvdG9yZWZsZWN0LkVudW1WYWx1ZURlc2NyaXB0b3IsIGVycm9yKSB7CiAJc3dpdGNoIGsgewotCWNhc2UgcHJlZi5Cb29sS2luZDoKKwljYXNlIHByb3RvcmVmbGVjdC5Cb29sS2luZDoKIAkJaWYgZiA9PSBHb1RhZyB7CiAJCQlzd2l0Y2ggcyB7CiAJCQljYXNlICIxIjoKLQkJCQlyZXR1cm4gcHJlZi5WYWx1ZU9mQm9vbCh0cnVlKSwgbmlsLCBuaWwKKwkJCQlyZXR1cm4gcHJvdG9yZWZsZWN0LlZhbHVlT2ZCb29sKHRydWUpLCBuaWwsIG5pbAogCQkJY2FzZSAiMCI6Ci0JCQkJcmV0dXJuIHByZWYuVmFsdWVPZkJvb2woZmFsc2UpLCBuaWwsIG5pbAorCQkJCXJldHVybiBwcm90b3JlZmxlY3QuVmFsdWVPZkJvb2woZmFsc2UpLCBuaWwsIG5pbAogCQkJfQogCQl9IGVsc2UgewogCQkJc3dpdGNoIHMgewogCQkJY2FzZSAidHJ1ZSI6Ci0JCQkJcmV0dXJuIHByZWYuVmFsdWVPZkJvb2wodHJ1ZSksIG5pbCwgbmlsCisJCQkJcmV0dXJuIHByb3RvcmVmbGVjdC5WYWx1ZU9mQm9vbCh0cnVlKSwgbmlsLCBuaWwKIAkJCWNhc2UgImZhbHNlIjoKLQkJCQlyZXR1cm4gcHJlZi5WYWx1ZU9mQm9vbChmYWxzZSksIG5pbCwgbmlsCisJCQkJcmV0dXJuIHByb3RvcmVmbGVjdC5WYWx1ZU9mQm9vbChmYWxzZSksIG5pbCwgbmlsCiAJCQl9CiAJCX0KLQljYXNlIHByZWYuRW51bUtpbmQ6CisJY2FzZSBwcm90b3JlZmxlY3QuRW51bUtpbmQ6CiAJCWlmIGYgPT0gR29UYWcgewogCQkJLy8gR28gdGFncyB1c2UgdGhlIG51bWVyaWMgZm9ybSBvZiB0aGUgZW51bSB2YWx1ZS4KIAkJCWlmIG4sIGVyciA6PSBzdHJjb252LlBhcnNlSW50KHMsIDEwLCAzMik7IGVyciA9PSBuaWwgewotCQkJCWlmIGV2IDo9IGV2cy5CeU51bWJlcihwcmVmLkVudW1OdW1iZXIobikpOyBldiAhPSBuaWwgewotCQkJCQlyZXR1cm4gcHJlZi5WYWx1ZU9mRW51bShldi5OdW1iZXIoKSksIGV2LCBuaWwKKwkJCQlpZiBldiA6PSBldnMuQnlOdW1iZXIocHJvdG9yZWZsZWN0LkVudW1OdW1iZXIobikpOyBldiAhPSBuaWwgeworCQkJCQlyZXR1cm4gcHJvdG9yZWZsZWN0LlZhbHVlT2ZFbnVtKGV2Lk51bWJlcigpKSwgZXYsIG5pbAogCQkJCX0KIAkJCX0KIAkJfSBlbHNlIHsKIAkJCS8vIERlc2NyaXB0b3IgZGVmYXVsdF92YWx1ZSB1c2UgdGhlIGVudW0gaWRlbnRpZmllci4KLQkJCWV2IDo9IGV2cy5CeU5hbWUocHJlZi5OYW1lKHMpKQorCQkJZXYgOj0gZXZzLkJ5TmFtZShwcm90b3JlZmxlY3QuTmFtZShzKSkKIAkJCWlmIGV2ICE9IG5pbCB7Ci0JCQkJcmV0dXJuIHByZWYuVmFsdWVPZkVudW0oZXYuTnVtYmVyKCkpLCBldiwgbmlsCisJCQkJcmV0dXJuIHByb3RvcmVmbGVjdC5WYWx1ZU9mRW51bShldi5OdW1iZXIoKSksIGV2LCBuaWwKIAkJCX0KIAkJfQotCWNhc2UgcHJlZi5JbnQzMktpbmQsIHByZWYuU2ludDMyS2luZCwgcHJlZi5TZml4ZWQzMktpbmQ6CisJY2FzZSBwcm90b3JlZmxlY3QuSW50MzJLaW5kLCBwcm90b3JlZmxlY3QuU2ludDMyS2luZCwgcHJvdG9yZWZsZWN0LlNmaXhlZDMyS2luZDoKIAkJaWYgdiwgZXJyIDo9IHN0cmNvbnYuUGFyc2VJbnQocywgMTAsIDMyKTsgZXJyID09IG5pbCB7Ci0JCQlyZXR1cm4gcHJlZi5WYWx1ZU9mSW50MzIoaW50MzIodikpLCBuaWwsIG5pbAorCQkJcmV0dXJuIHByb3RvcmVmbGVjdC5WYWx1ZU9mSW50MzIoaW50MzIodikpLCBuaWwsIG5pbAogCQl9Ci0JY2FzZSBwcmVmLkludDY0S2luZCwgcHJlZi5TaW50NjRLaW5kLCBwcmVmLlNmaXhlZDY0S2luZDoKKwljYXNlIHByb3RvcmVmbGVjdC5JbnQ2NEtpbmQsIHByb3RvcmVmbGVjdC5TaW50NjRLaW5kLCBwcm90b3JlZmxlY3QuU2ZpeGVkNjRLaW5kOgogCQlpZiB2LCBlcnIgOj0gc3RyY29udi5QYXJzZUludChzLCAxMCwgNjQpOyBlcnIgPT0gbmlsIHsKLQkJCXJldHVybiBwcmVmLlZhbHVlT2ZJbnQ2NChpbnQ2NCh2KSksIG5pbCwgbmlsCisJCQlyZXR1cm4gcHJvdG9yZWZsZWN0LlZhbHVlT2ZJbnQ2NChpbnQ2NCh2KSksIG5pbCwgbmlsCiAJCX0KLQljYXNlIHByZWYuVWludDMyS2luZCwgcHJlZi5GaXhlZDMyS2luZDoKKwljYXNlIHByb3RvcmVmbGVjdC5VaW50MzJLaW5kLCBwcm90b3JlZmxlY3QuRml4ZWQzMktpbmQ6CiAJCWlmIHYsIGVyciA6PSBzdHJjb252LlBhcnNlVWludChzLCAxMCwgMzIpOyBlcnIgPT0gbmlsIHsKLQkJCXJldHVybiBwcmVmLlZhbHVlT2ZVaW50MzIodWludDMyKHYpKSwgbmlsLCBuaWwKKwkJCXJldHVybiBwcm90b3JlZmxlY3QuVmFsdWVPZlVpbnQzMih1aW50MzIodikpLCBuaWwsIG5pbAogCQl9Ci0JY2FzZSBwcmVmLlVpbnQ2NEtpbmQsIHByZWYuRml4ZWQ2NEtpbmQ6CisJY2FzZSBwcm90b3JlZmxlY3QuVWludDY0S2luZCwgcHJvdG9yZWZsZWN0LkZpeGVkNjRLaW5kOgogCQlpZiB2LCBlcnIgOj0gc3RyY29udi5QYXJzZVVpbnQocywgMTAsIDY0KTsgZXJyID09IG5pbCB7Ci0JCQlyZXR1cm4gcHJlZi5WYWx1ZU9mVWludDY0KHVpbnQ2NCh2KSksIG5pbCwgbmlsCisJCQlyZXR1cm4gcHJvdG9yZWZsZWN0LlZhbHVlT2ZVaW50NjQodWludDY0KHYpKSwgbmlsLCBuaWwKIAkJfQotCWNhc2UgcHJlZi5GbG9hdEtpbmQsIHByZWYuRG91YmxlS2luZDoKKwljYXNlIHByb3RvcmVmbGVjdC5GbG9hdEtpbmQsIHByb3RvcmVmbGVjdC5Eb3VibGVLaW5kOgogCQl2YXIgdiBmbG9hdDY0CiAJCXZhciBlcnIgZXJyb3IKIAkJc3dpdGNoIHMgewpAQCAtOTgsMjkgKzk4LDI5IEBACiAJCQl2LCBlcnIgPSBzdHJjb252LlBhcnNlRmxvYXQocywgNjQpCiAJCX0KIAkJaWYgZXJyID09IG5pbCB7Ci0JCQlpZiBrID09IHByZWYuRmxvYXRLaW5kIHsKLQkJCQlyZXR1cm4gcHJlZi5WYWx1ZU9mRmxvYXQzMihmbG9hdDMyKHYpKSwgbmlsLCBuaWwKKwkJCWlmIGsgPT0gcHJvdG9yZWZsZWN0LkZsb2F0S2luZCB7CisJCQkJcmV0dXJuIHByb3RvcmVmbGVjdC5WYWx1ZU9mRmxvYXQzMihmbG9hdDMyKHYpKSwgbmlsLCBuaWwKIAkJCX0gZWxzZSB7Ci0JCQkJcmV0dXJuIHByZWYuVmFsdWVPZkZsb2F0NjQoZmxvYXQ2NCh2KSksIG5pbCwgbmlsCisJCQkJcmV0dXJuIHByb3RvcmVmbGVjdC5WYWx1ZU9mRmxvYXQ2NChmbG9hdDY0KHYpKSwgbmlsLCBuaWwKIAkJCX0KIAkJfQotCWNhc2UgcHJlZi5TdHJpbmdLaW5kOgorCWNhc2UgcHJvdG9yZWZsZWN0LlN0cmluZ0tpbmQ6CiAJCS8vIFN0cmluZyB2YWx1ZXMgYXJlIGFscmVhZHkgdW5lc2NhcGVkIGFuZCBjYW4gYmUgdXNlZCBhcyBpcy4KLQkJcmV0dXJuIHByZWYuVmFsdWVPZlN0cmluZyhzKSwgbmlsLCBuaWwKLQljYXNlIHByZWYuQnl0ZXNLaW5kOgorCQlyZXR1cm4gcHJvdG9yZWZsZWN0LlZhbHVlT2ZTdHJpbmcocyksIG5pbCwgbmlsCisJY2FzZSBwcm90b3JlZmxlY3QuQnl0ZXNLaW5kOgogCQlpZiBiLCBvayA6PSB1bm1hcnNoYWxCeXRlcyhzKTsgb2sgewotCQkJcmV0dXJuIHByZWYuVmFsdWVPZkJ5dGVzKGIpLCBuaWwsIG5pbAorCQkJcmV0dXJuIHByb3RvcmVmbGVjdC5WYWx1ZU9mQnl0ZXMoYiksIG5pbCwgbmlsCiAJCX0KIAl9Ci0JcmV0dXJuIHByZWYuVmFsdWV7fSwgbmlsLCBlcnJvcnMuTmV3KCJjb3VsZCBub3QgcGFyc2UgdmFsdWUgZm9yICV2OiAlcSIsIGssIHMpCisJcmV0dXJuIHByb3RvcmVmbGVjdC5WYWx1ZXt9LCBuaWwsIGVycm9ycy5OZXcoImNvdWxkIG5vdCBwYXJzZSB2YWx1ZSBmb3IgJXY6ICVxIiwgaywgcykKIH0KIAogLy8gTWFyc2hhbCBzZXJpYWxpemVzIHYgYXMgdGhlIGRlZmF1bHQgc3RyaW5nIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4ga2luZCBrLgogLy8gV2hlbiBzcGVjaWZ5aW5nIHRoZSBEZXNjcmlwdG9yIGZvcm1hdCBmb3IgYW4gZW51bSBraW5kLCB0aGUgYXNzb2NpYXRlZAogLy8gZW51bSB2YWx1ZSBkZXNjcmlwdG9yIG11c3QgYmUgcHJvdmlkZWQuCi1mdW5jIE1hcnNoYWwodiBwcmVmLlZhbHVlLCBldiBwcmVmLkVudW1WYWx1ZURlc2NyaXB0b3IsIGsgcHJlZi5LaW5kLCBmIEZvcm1hdCkgKHN0cmluZywgZXJyb3IpIHsKK2Z1bmMgTWFyc2hhbCh2IHByb3RvcmVmbGVjdC5WYWx1ZSwgZXYgcHJvdG9yZWZsZWN0LkVudW1WYWx1ZURlc2NyaXB0b3IsIGsgcHJvdG9yZWZsZWN0LktpbmQsIGYgRm9ybWF0KSAoc3RyaW5nLCBlcnJvcikgewogCXN3aXRjaCBrIHsKLQljYXNlIHByZWYuQm9vbEtpbmQ6CisJY2FzZSBwcm90b3JlZmxlY3QuQm9vbEtpbmQ6CiAJCWlmIGYgPT0gR29UYWcgewogCQkJaWYgdi5Cb29sKCkgewogCQkJCXJldHVybiAiMSIsIG5pbApAQCAtMTM0LDE3ICsxMzQsMTcgQEAKIAkJCQlyZXR1cm4gImZhbHNlIiwgbmlsCiAJCQl9CiAJCX0KLQljYXNlIHByZWYuRW51bUtpbmQ6CisJY2FzZSBwcm90b3JlZmxlY3QuRW51bUtpbmQ6CiAJCWlmIGYgPT0gR29UYWcgewogCQkJcmV0dXJuIHN0cmNvbnYuRm9ybWF0SW50KGludDY0KHYuRW51bSgpKSwgMTApLCBuaWwKIAkJfSBlbHNlIHsKIAkJCXJldHVybiBzdHJpbmcoZXYuTmFtZSgpKSwgbmlsCiAJCX0KLQljYXNlIHByZWYuSW50MzJLaW5kLCBwcmVmLlNpbnQzMktpbmQsIHByZWYuU2ZpeGVkMzJLaW5kLCBwcmVmLkludDY0S2luZCwgcHJlZi5TaW50NjRLaW5kLCBwcmVmLlNmaXhlZDY0S2luZDoKKwljYXNlIHByb3RvcmVmbGVjdC5JbnQzMktpbmQsIHByb3RvcmVmbGVjdC5TaW50MzJLaW5kLCBwcm90b3JlZmxlY3QuU2ZpeGVkMzJLaW5kLCBwcm90b3JlZmxlY3QuSW50NjRLaW5kLCBwcm90b3JlZmxlY3QuU2ludDY0S2luZCwgcHJvdG9yZWZsZWN0LlNmaXhlZDY0S2luZDoKIAkJcmV0dXJuIHN0cmNvbnYuRm9ybWF0SW50KHYuSW50KCksIDEwKSwgbmlsCi0JY2FzZSBwcmVmLlVpbnQzMktpbmQsIHByZWYuRml4ZWQzMktpbmQsIHByZWYuVWludDY0S2luZCwgcHJlZi5GaXhlZDY0S2luZDoKKwljYXNlIHByb3RvcmVmbGVjdC5VaW50MzJLaW5kLCBwcm90b3JlZmxlY3QuRml4ZWQzMktpbmQsIHByb3RvcmVmbGVjdC5VaW50NjRLaW5kLCBwcm90b3JlZmxlY3QuRml4ZWQ2NEtpbmQ6CiAJCXJldHVybiBzdHJjb252LkZvcm1hdFVpbnQodi5VaW50KCksIDEwKSwgbmlsCi0JY2FzZSBwcmVmLkZsb2F0S2luZCwgcHJlZi5Eb3VibGVLaW5kOgorCWNhc2UgcHJvdG9yZWZsZWN0LkZsb2F0S2luZCwgcHJvdG9yZWZsZWN0LkRvdWJsZUtpbmQ6CiAJCWYgOj0gdi5GbG9hdCgpCiAJCXN3aXRjaCB7CiAJCWNhc2UgbWF0aC5Jc0luZihmLCAtMSk6CkBAIC0xNTQsMTYgKzE1NCwxNiBAQAogCQljYXNlIG1hdGguSXNOYU4oZik6CiAJCQlyZXR1cm4gIm5hbiIsIG5pbAogCQlkZWZhdWx0OgotCQkJaWYgayA9PSBwcmVmLkZsb2F0S2luZCB7CisJCQlpZiBrID09IHByb3RvcmVmbGVjdC5GbG9hdEtpbmQgewogCQkJCXJldHVybiBzdHJjb252LkZvcm1hdEZsb2F0KGYsICdnJywgLTEsIDMyKSwgbmlsCiAJCQl9IGVsc2UgewogCQkJCXJldHVybiBzdHJjb252LkZvcm1hdEZsb2F0KGYsICdnJywgLTEsIDY0KSwgbmlsCiAJCQl9CiAJCX0KLQljYXNlIHByZWYuU3RyaW5nS2luZDoKKwljYXNlIHByb3RvcmVmbGVjdC5TdHJpbmdLaW5kOgogCQkvLyBTdHJpbmcgdmFsdWVzIGFyZSBzZXJpYWxpemVkIGFzIGlzIHdpdGhvdXQgYW55IGVzY2FwaW5nLgogCQlyZXR1cm4gdi5TdHJpbmcoKSwgbmlsCi0JY2FzZSBwcmVmLkJ5dGVzS2luZDoKKwljYXNlIHByb3RvcmVmbGVjdC5CeXRlc0tpbmQ6CiAJCWlmIHMsIG9rIDo9IG1hcnNoYWxCeXRlcyh2LkJ5dGVzKCkpOyBvayB7CiAJCQlyZXR1cm4gcywgbmlsCiAJCX0KZGlmZiAtLWdpdCBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9lbmNvZGluZy9tZXNzYWdlc2V0L21lc3NhZ2VzZXQuZ28gYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZW5jb2RpbmcvbWVzc2FnZXNldC9tZXNzYWdlc2V0LmdvCmluZGV4IGMxODY2ZjMuLmE2NjkzZjAgMTAwNjQ0Ci0tLSBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9lbmNvZGluZy9tZXNzYWdlc2V0L21lc3NhZ2VzZXQuZ28KKysrIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2VuY29kaW5nL21lc3NhZ2VzZXQvbWVzc2FnZXNldC5nbwpAQCAtMTAsNyArMTAsNyBAQAogCiAJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2VuY29kaW5nL3Byb3Rvd2lyZSIKIAkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZXJyb3JzIgotCXByZWYgImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgorCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9yZWZsZWN0L3Byb3RvcmVmbGVjdCIKICkKIAogLy8gVGhlIE1lc3NhZ2VTZXQgd2lyZSBmb3JtYXQgaXMgZXF1aXZhbGVudCB0byBhIG1lc3NhZ2UgZGVmaW5lZCBhcyBmb2xsb3dzLApAQCAtMzMsNiArMzMsNyBAQAogLy8gRXh0ZW5zaW9uTmFtZSBpcyB0aGUgZmllbGQgbmFtZSBmb3IgZXh0ZW5zaW9ucyBvZiBNZXNzYWdlU2V0LgogLy8KIC8vIEEgdmFsaWQgTWVzc2FnZVNldCBleHRlbnNpb24gbXVzdCBiZSBvZiB0aGUgZm9ybToKKy8vCiAvLwltZXNzYWdlIE15TWVzc2FnZSB7CiAvLwkJZXh0ZW5kIHByb3RvMi5icmlkZ2UuTWVzc2FnZVNldCB7CiAvLwkJCW9wdGlvbmFsIE15TWVzc2FnZSBtZXNzYWdlX3NldF9leHRlbnNpb24gPSAxMjM0OwpAQCAtNDIsMTMgKzQzLDEzIEBACiBjb25zdCBFeHRlbnNpb25OYW1lID0gIm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbiIKIAogLy8gSXNNZXNzYWdlU2V0IHJldHVybnMgd2hldGhlciB0aGUgbWVzc2FnZSB1c2VzIHRoZSBNZXNzYWdlU2V0IHdpcmUgZm9ybWF0LgotZnVuYyBJc01lc3NhZ2VTZXQobWQgcHJlZi5NZXNzYWdlRGVzY3JpcHRvcikgYm9vbCB7CitmdW5jIElzTWVzc2FnZVNldChtZCBwcm90b3JlZmxlY3QuTWVzc2FnZURlc2NyaXB0b3IpIGJvb2wgewogCXhtZCwgb2sgOj0gbWQuKGludGVyZmFjZXsgSXNNZXNzYWdlU2V0KCkgYm9vbCB9KQogCXJldHVybiBvayAmJiB4bWQuSXNNZXNzYWdlU2V0KCkKIH0KIAogLy8gSXNNZXNzYWdlU2V0RXh0ZW5zaW9uIHJlcG9ydHMgdGhpcyBmaWVsZCBwcm9wZXJseSBleHRlbmRzIGEgTWVzc2FnZVNldC4KLWZ1bmMgSXNNZXNzYWdlU2V0RXh0ZW5zaW9uKGZkIHByZWYuRmllbGREZXNjcmlwdG9yKSBib29sIHsKK2Z1bmMgSXNNZXNzYWdlU2V0RXh0ZW5zaW9uKGZkIHByb3RvcmVmbGVjdC5GaWVsZERlc2NyaXB0b3IpIGJvb2wgewogCXN3aXRjaCB7CiAJY2FzZSBmZC5OYW1lKCkgIT0gRXh0ZW5zaW9uTmFtZToKIAkJcmV0dXJuIGZhbHNlCmRpZmYgLS1naXQgYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZW5jb2RpbmcvdGFnL3RhZy5nbyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9lbmNvZGluZy90YWcvdGFnLmdvCmluZGV4IDM4ZjE5MzEuLjM3M2QyMDggMTAwNjQ0Ci0tLSBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9lbmNvZGluZy90YWcvdGFnLmdvCisrKyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9lbmNvZGluZy90YWcvdGFnLmdvCkBAIC0xMSwxMCArMTEsMTAgQEAKIAkic3RyY29udiIKIAkic3RyaW5ncyIKIAotCWRlZnZhbCAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZW5jb2RpbmcvZGVmdmFsIgotCWZkZXNjICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9maWxlZGVzYyIKKwkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZW5jb2RpbmcvZGVmdmFsIgorCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9maWxlZGVzYyIKIAkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvc3RycyIKLQlwcmVmICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9yZWZsZWN0L3Byb3RvcmVmbGVjdCIKKwkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZmxlY3QiCiApCiAKIHZhciBieXRlVHlwZSA9IHJlZmxlY3QuVHlwZU9mKGJ5dGUoMCkpCkBAIC0yOSw5ICsyOSw5IEBACiAvLyBUaGlzIGRvZXMgbm90IHBvcHVsYXRlIHRoZSBFbnVtIG9yIE1lc3NhZ2UgKGV4Y2VwdCBmb3Igd2VhayBtZXNzYWdlKS4KIC8vCiAvLyBUaGlzIGZ1bmN0aW9uIGlzIGEgYmVzdCBlZmZvcnQgYXR0ZW1wdDsgcGFyc2luZyBlcnJvcnMgYXJlIGlnbm9yZWQuCi1mdW5jIFVubWFyc2hhbCh0YWcgc3RyaW5nLCBnb1R5cGUgcmVmbGVjdC5UeXBlLCBldnMgcHJlZi5FbnVtVmFsdWVEZXNjcmlwdG9ycykgcHJlZi5GaWVsZERlc2NyaXB0b3IgewotCWYgOj0gbmV3KGZkZXNjLkZpZWxkKQotCWYuTDAuUGFyZW50RmlsZSA9IGZkZXNjLlN1cnJvZ2F0ZVByb3RvMgorZnVuYyBVbm1hcnNoYWwodGFnIHN0cmluZywgZ29UeXBlIHJlZmxlY3QuVHlwZSwgZXZzIHByb3RvcmVmbGVjdC5FbnVtVmFsdWVEZXNjcmlwdG9ycykgcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvciB7CisJZiA6PSBuZXcoZmlsZWRlc2MuRmllbGQpCisJZi5MMC5QYXJlbnRGaWxlID0gZmlsZWRlc2MuU3Vycm9nYXRlUHJvdG8yCiAJZm9yIGxlbih0YWcpID4gMCB7CiAJCWkgOj0gc3RyaW5ncy5JbmRleEJ5dGUodGFnLCAnLCcpCiAJCWlmIGkgPCAwIHsKQEAgLTM5LDY4ICszOSw2OCBAQAogCQl9CiAJCXN3aXRjaCBzIDo9IHRhZ1s6aV07IHsKIAkJY2FzZSBzdHJpbmdzLkhhc1ByZWZpeChzLCAibmFtZT0iKToKLQkJCWYuTDAuRnVsbE5hbWUgPSBwcmVmLkZ1bGxOYW1lKHNbbGVuKCJuYW1lPSIpOl0pCisJCQlmLkwwLkZ1bGxOYW1lID0gcHJvdG9yZWZsZWN0LkZ1bGxOYW1lKHNbbGVuKCJuYW1lPSIpOl0pCiAJCWNhc2Ugc3RyaW5ncy5UcmltKHMsICIwMTIzNDU2Nzg5IikgPT0gIiI6CiAJCQluLCBfIDo9IHN0cmNvbnYuUGFyc2VVaW50KHMsIDEwLCAzMikKLQkJCWYuTDEuTnVtYmVyID0gcHJlZi5GaWVsZE51bWJlcihuKQorCQkJZi5MMS5OdW1iZXIgPSBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIobikKIAkJY2FzZSBzID09ICJvcHQiOgotCQkJZi5MMS5DYXJkaW5hbGl0eSA9IHByZWYuT3B0aW9uYWwKKwkJCWYuTDEuQ2FyZGluYWxpdHkgPSBwcm90b3JlZmxlY3QuT3B0aW9uYWwKIAkJY2FzZSBzID09ICJyZXEiOgotCQkJZi5MMS5DYXJkaW5hbGl0eSA9IHByZWYuUmVxdWlyZWQKKwkJCWYuTDEuQ2FyZGluYWxpdHkgPSBwcm90b3JlZmxlY3QuUmVxdWlyZWQKIAkJY2FzZSBzID09ICJyZXAiOgotCQkJZi5MMS5DYXJkaW5hbGl0eSA9IHByZWYuUmVwZWF0ZWQKKwkJCWYuTDEuQ2FyZGluYWxpdHkgPSBwcm90b3JlZmxlY3QuUmVwZWF0ZWQKIAkJY2FzZSBzID09ICJ2YXJpbnQiOgogCQkJc3dpdGNoIGdvVHlwZS5LaW5kKCkgewogCQkJY2FzZSByZWZsZWN0LkJvb2w6Ci0JCQkJZi5MMS5LaW5kID0gcHJlZi5Cb29sS2luZAorCQkJCWYuTDEuS2luZCA9IHByb3RvcmVmbGVjdC5Cb29sS2luZAogCQkJY2FzZSByZWZsZWN0LkludDMyOgotCQkJCWYuTDEuS2luZCA9IHByZWYuSW50MzJLaW5kCisJCQkJZi5MMS5LaW5kID0gcHJvdG9yZWZsZWN0LkludDMyS2luZAogCQkJY2FzZSByZWZsZWN0LkludDY0OgotCQkJCWYuTDEuS2luZCA9IHByZWYuSW50NjRLaW5kCisJCQkJZi5MMS5LaW5kID0gcHJvdG9yZWZsZWN0LkludDY0S2luZAogCQkJY2FzZSByZWZsZWN0LlVpbnQzMjoKLQkJCQlmLkwxLktpbmQgPSBwcmVmLlVpbnQzMktpbmQKKwkJCQlmLkwxLktpbmQgPSBwcm90b3JlZmxlY3QuVWludDMyS2luZAogCQkJY2FzZSByZWZsZWN0LlVpbnQ2NDoKLQkJCQlmLkwxLktpbmQgPSBwcmVmLlVpbnQ2NEtpbmQKKwkJCQlmLkwxLktpbmQgPSBwcm90b3JlZmxlY3QuVWludDY0S2luZAogCQkJfQogCQljYXNlIHMgPT0gInppZ3phZzMyIjoKIAkJCWlmIGdvVHlwZS5LaW5kKCkgPT0gcmVmbGVjdC5JbnQzMiB7Ci0JCQkJZi5MMS5LaW5kID0gcHJlZi5TaW50MzJLaW5kCisJCQkJZi5MMS5LaW5kID0gcHJvdG9yZWZsZWN0LlNpbnQzMktpbmQKIAkJCX0KIAkJY2FzZSBzID09ICJ6aWd6YWc2NCI6CiAJCQlpZiBnb1R5cGUuS2luZCgpID09IHJlZmxlY3QuSW50NjQgewotCQkJCWYuTDEuS2luZCA9IHByZWYuU2ludDY0S2luZAorCQkJCWYuTDEuS2luZCA9IHByb3RvcmVmbGVjdC5TaW50NjRLaW5kCiAJCQl9CiAJCWNhc2UgcyA9PSAiZml4ZWQzMiI6CiAJCQlzd2l0Y2ggZ29UeXBlLktpbmQoKSB7CiAJCQljYXNlIHJlZmxlY3QuSW50MzI6Ci0JCQkJZi5MMS5LaW5kID0gcHJlZi5TZml4ZWQzMktpbmQKKwkJCQlmLkwxLktpbmQgPSBwcm90b3JlZmxlY3QuU2ZpeGVkMzJLaW5kCiAJCQljYXNlIHJlZmxlY3QuVWludDMyOgotCQkJCWYuTDEuS2luZCA9IHByZWYuRml4ZWQzMktpbmQKKwkJCQlmLkwxLktpbmQgPSBwcm90b3JlZmxlY3QuRml4ZWQzMktpbmQKIAkJCWNhc2UgcmVmbGVjdC5GbG9hdDMyOgotCQkJCWYuTDEuS2luZCA9IHByZWYuRmxvYXRLaW5kCisJCQkJZi5MMS5LaW5kID0gcHJvdG9yZWZsZWN0LkZsb2F0S2luZAogCQkJfQogCQljYXNlIHMgPT0gImZpeGVkNjQiOgogCQkJc3dpdGNoIGdvVHlwZS5LaW5kKCkgewogCQkJY2FzZSByZWZsZWN0LkludDY0OgotCQkJCWYuTDEuS2luZCA9IHByZWYuU2ZpeGVkNjRLaW5kCisJCQkJZi5MMS5LaW5kID0gcHJvdG9yZWZsZWN0LlNmaXhlZDY0S2luZAogCQkJY2FzZSByZWZsZWN0LlVpbnQ2NDoKLQkJCQlmLkwxLktpbmQgPSBwcmVmLkZpeGVkNjRLaW5kCisJCQkJZi5MMS5LaW5kID0gcHJvdG9yZWZsZWN0LkZpeGVkNjRLaW5kCiAJCQljYXNlIHJlZmxlY3QuRmxvYXQ2NDoKLQkJCQlmLkwxLktpbmQgPSBwcmVmLkRvdWJsZUtpbmQKKwkJCQlmLkwxLktpbmQgPSBwcm90b3JlZmxlY3QuRG91YmxlS2luZAogCQkJfQogCQljYXNlIHMgPT0gImJ5dGVzIjoKIAkJCXN3aXRjaCB7CiAJCQljYXNlIGdvVHlwZS5LaW5kKCkgPT0gcmVmbGVjdC5TdHJpbmc6Ci0JCQkJZi5MMS5LaW5kID0gcHJlZi5TdHJpbmdLaW5kCisJCQkJZi5MMS5LaW5kID0gcHJvdG9yZWZsZWN0LlN0cmluZ0tpbmQKIAkJCWNhc2UgZ29UeXBlLktpbmQoKSA9PSByZWZsZWN0LlNsaWNlICYmIGdvVHlwZS5FbGVtKCkgPT0gYnl0ZVR5cGU6Ci0JCQkJZi5MMS5LaW5kID0gcHJlZi5CeXRlc0tpbmQKKwkJCQlmLkwxLktpbmQgPSBwcm90b3JlZmxlY3QuQnl0ZXNLaW5kCiAJCQlkZWZhdWx0OgotCQkJCWYuTDEuS2luZCA9IHByZWYuTWVzc2FnZUtpbmQKKwkJCQlmLkwxLktpbmQgPSBwcm90b3JlZmxlY3QuTWVzc2FnZUtpbmQKIAkJCX0KIAkJY2FzZSBzID09ICJncm91cCI6Ci0JCQlmLkwxLktpbmQgPSBwcmVmLkdyb3VwS2luZAorCQkJZi5MMS5LaW5kID0gcHJvdG9yZWZsZWN0Lkdyb3VwS2luZAogCQljYXNlIHN0cmluZ3MuSGFzUHJlZml4KHMsICJlbnVtPSIpOgotCQkJZi5MMS5LaW5kID0gcHJlZi5FbnVtS2luZAorCQkJZi5MMS5LaW5kID0gcHJvdG9yZWZsZWN0LkVudW1LaW5kCiAJCWNhc2Ugc3RyaW5ncy5IYXNQcmVmaXgocywgImpzb249Iik6CiAJCQlqc29uTmFtZSA6PSBzW2xlbigianNvbj0iKTpdCiAJCQlpZiBqc29uTmFtZSAhPSBzdHJzLkpTT05DYW1lbENhc2Uoc3RyaW5nKGYuTDAuRnVsbE5hbWUuTmFtZSgpKSkgewpAQCAtMTExLDIzICsxMTEsMjMgQEAKIAkJCWYuTDEuSXNQYWNrZWQgPSB0cnVlCiAJCWNhc2Ugc3RyaW5ncy5IYXNQcmVmaXgocywgIndlYWs9Iik6CiAJCQlmLkwxLklzV2VhayA9IHRydWUKLQkJCWYuTDEuTWVzc2FnZSA9IGZkZXNjLlBsYWNlaG9sZGVyTWVzc2FnZShwcmVmLkZ1bGxOYW1lKHNbbGVuKCJ3ZWFrPSIpOl0pKQorCQkJZi5MMS5NZXNzYWdlID0gZmlsZWRlc2MuUGxhY2Vob2xkZXJNZXNzYWdlKHByb3RvcmVmbGVjdC5GdWxsTmFtZShzW2xlbigid2Vhaz0iKTpdKSkKIAkJY2FzZSBzdHJpbmdzLkhhc1ByZWZpeChzLCAiZGVmPSIpOgogCQkJLy8gVGhlIGRlZmF1bHQgdGFnIGlzIHNwZWNpYWwgaW4gdGhhdCBldmVyeXRoaW5nIGFmdGVyd2FyZHMgaXMgdGhlCiAJCQkvLyBkZWZhdWx0IHJlZ2FyZGxlc3Mgb2YgdGhlIHByZXNlbmNlIG9mIGNvbW1hcy4KIAkJCXMsIGkgPSB0YWdbbGVuKCJkZWY9Iik6XSwgbGVuKHRhZykKIAkJCXYsIGV2LCBfIDo9IGRlZnZhbC5Vbm1hcnNoYWwocywgZi5MMS5LaW5kLCBldnMsIGRlZnZhbC5Hb1RhZykKLQkJCWYuTDEuRGVmYXVsdCA9IGZkZXNjLkRlZmF1bHRWYWx1ZSh2LCBldikKKwkJCWYuTDEuRGVmYXVsdCA9IGZpbGVkZXNjLkRlZmF1bHRWYWx1ZSh2LCBldikKIAkJY2FzZSBzID09ICJwcm90bzMiOgotCQkJZi5MMC5QYXJlbnRGaWxlID0gZmRlc2MuU3Vycm9nYXRlUHJvdG8zCisJCQlmLkwwLlBhcmVudEZpbGUgPSBmaWxlZGVzYy5TdXJyb2dhdGVQcm90bzMKIAkJfQogCQl0YWcgPSBzdHJpbmdzLlRyaW1QcmVmaXgodGFnW2k6XSwgIiwiKQogCX0KIAogCS8vIFRoZSBnZW5lcmF0b3IgdXNlcyB0aGUgZ3JvdXAgbWVzc2FnZSBuYW1lIGluc3RlYWQgb2YgdGhlIGZpZWxkIG5hbWUuCiAJLy8gV2Ugb2J0YWluIHRoZSByZWFsIGZpZWxkIG5hbWUgYnkgbG93ZXJjYXNpbmcgdGhlIGdyb3VwIG5hbWUuCi0JaWYgZi5MMS5LaW5kID09IHByZWYuR3JvdXBLaW5kIHsKLQkJZi5MMC5GdWxsTmFtZSA9IHByZWYuRnVsbE5hbWUoc3RyaW5ncy5Ub0xvd2VyKHN0cmluZyhmLkwwLkZ1bGxOYW1lKSkpCisJaWYgZi5MMS5LaW5kID09IHByb3RvcmVmbGVjdC5Hcm91cEtpbmQgeworCQlmLkwwLkZ1bGxOYW1lID0gcHJvdG9yZWZsZWN0LkZ1bGxOYW1lKHN0cmluZ3MuVG9Mb3dlcihzdHJpbmcoZi5MMC5GdWxsTmFtZSkpKQogCX0KIAlyZXR1cm4gZgogfQpAQCAtMTQwLDM4ICsxNDAsMzggQEAKIC8vIERlcGVuZGluZyBvbiB0aGUgY29udGV4dCBvbiBob3cgTWFyc2hhbCBpcyBjYWxsZWQsIHRoZXJlIGFyZSBkaWZmZXJlbnQgd2F5cwogLy8gdGhyb3VnaCB3aGljaCB0aGF0IGluZm9ybWF0aW9uIGlzIGRldGVybWluZWQuIEFzIHN1Y2ggaXQgaXMgdGhlIGNhbGxlcidzCiAvLyByZXNwb25zaWJpbGl0eSB0byBwcm92aWRlIGEgZnVuY3Rpb24gdG8gb2J0YWluIHRoYXQgaW5mb3JtYXRpb24uCi1mdW5jIE1hcnNoYWwoZmQgcHJlZi5GaWVsZERlc2NyaXB0b3IsIGVudW1OYW1lIHN0cmluZykgc3RyaW5nIHsKK2Z1bmMgTWFyc2hhbChmZCBwcm90b3JlZmxlY3QuRmllbGREZXNjcmlwdG9yLCBlbnVtTmFtZSBzdHJpbmcpIHN0cmluZyB7CiAJdmFyIHRhZyBbXXN0cmluZwogCXN3aXRjaCBmZC5LaW5kKCkgewotCWNhc2UgcHJlZi5Cb29sS2luZCwgcHJlZi5FbnVtS2luZCwgcHJlZi5JbnQzMktpbmQsIHByZWYuVWludDMyS2luZCwgcHJlZi5JbnQ2NEtpbmQsIHByZWYuVWludDY0S2luZDoKKwljYXNlIHByb3RvcmVmbGVjdC5Cb29sS2luZCwgcHJvdG9yZWZsZWN0LkVudW1LaW5kLCBwcm90b3JlZmxlY3QuSW50MzJLaW5kLCBwcm90b3JlZmxlY3QuVWludDMyS2luZCwgcHJvdG9yZWZsZWN0LkludDY0S2luZCwgcHJvdG9yZWZsZWN0LlVpbnQ2NEtpbmQ6CiAJCXRhZyA9IGFwcGVuZCh0YWcsICJ2YXJpbnQiKQotCWNhc2UgcHJlZi5TaW50MzJLaW5kOgorCWNhc2UgcHJvdG9yZWZsZWN0LlNpbnQzMktpbmQ6CiAJCXRhZyA9IGFwcGVuZCh0YWcsICJ6aWd6YWczMiIpCi0JY2FzZSBwcmVmLlNpbnQ2NEtpbmQ6CisJY2FzZSBwcm90b3JlZmxlY3QuU2ludDY0S2luZDoKIAkJdGFnID0gYXBwZW5kKHRhZywgInppZ3phZzY0IikKLQljYXNlIHByZWYuU2ZpeGVkMzJLaW5kLCBwcmVmLkZpeGVkMzJLaW5kLCBwcmVmLkZsb2F0S2luZDoKKwljYXNlIHByb3RvcmVmbGVjdC5TZml4ZWQzMktpbmQsIHByb3RvcmVmbGVjdC5GaXhlZDMyS2luZCwgcHJvdG9yZWZsZWN0LkZsb2F0S2luZDoKIAkJdGFnID0gYXBwZW5kKHRhZywgImZpeGVkMzIiKQotCWNhc2UgcHJlZi5TZml4ZWQ2NEtpbmQsIHByZWYuRml4ZWQ2NEtpbmQsIHByZWYuRG91YmxlS2luZDoKKwljYXNlIHByb3RvcmVmbGVjdC5TZml4ZWQ2NEtpbmQsIHByb3RvcmVmbGVjdC5GaXhlZDY0S2luZCwgcHJvdG9yZWZsZWN0LkRvdWJsZUtpbmQ6CiAJCXRhZyA9IGFwcGVuZCh0YWcsICJmaXhlZDY0IikKLQljYXNlIHByZWYuU3RyaW5nS2luZCwgcHJlZi5CeXRlc0tpbmQsIHByZWYuTWVzc2FnZUtpbmQ6CisJY2FzZSBwcm90b3JlZmxlY3QuU3RyaW5nS2luZCwgcHJvdG9yZWZsZWN0LkJ5dGVzS2luZCwgcHJvdG9yZWZsZWN0Lk1lc3NhZ2VLaW5kOgogCQl0YWcgPSBhcHBlbmQodGFnLCAiYnl0ZXMiKQotCWNhc2UgcHJlZi5Hcm91cEtpbmQ6CisJY2FzZSBwcm90b3JlZmxlY3QuR3JvdXBLaW5kOgogCQl0YWcgPSBhcHBlbmQodGFnLCAiZ3JvdXAiKQogCX0KIAl0YWcgPSBhcHBlbmQodGFnLCBzdHJjb252Lkl0b2EoaW50KGZkLk51bWJlcigpKSkpCiAJc3dpdGNoIGZkLkNhcmRpbmFsaXR5KCkgewotCWNhc2UgcHJlZi5PcHRpb25hbDoKKwljYXNlIHByb3RvcmVmbGVjdC5PcHRpb25hbDoKIAkJdGFnID0gYXBwZW5kKHRhZywgIm9wdCIpCi0JY2FzZSBwcmVmLlJlcXVpcmVkOgorCWNhc2UgcHJvdG9yZWZsZWN0LlJlcXVpcmVkOgogCQl0YWcgPSBhcHBlbmQodGFnLCAicmVxIikKLQljYXNlIHByZWYuUmVwZWF0ZWQ6CisJY2FzZSBwcm90b3JlZmxlY3QuUmVwZWF0ZWQ6CiAJCXRhZyA9IGFwcGVuZCh0YWcsICJyZXAiKQogCX0KIAlpZiBmZC5Jc1BhY2tlZCgpIHsKIAkJdGFnID0gYXBwZW5kKHRhZywgInBhY2tlZCIpCiAJfQogCW5hbWUgOj0gc3RyaW5nKGZkLk5hbWUoKSkKLQlpZiBmZC5LaW5kKCkgPT0gcHJlZi5Hcm91cEtpbmQgeworCWlmIGZkLktpbmQoKSA9PSBwcm90b3JlZmxlY3QuR3JvdXBLaW5kIHsKIAkJLy8gVGhlIG5hbWUgb2YgdGhlIEZpZWxkRGVzY3JpcHRvciBmb3IgYSBncm91cCBmaWVsZCBpcwogCQkvLyBsb3dlcmNhc2VkLiBUbyBmaW5kIHRoZSBvcmlnaW5hbCBjYXBpdGFsaXphdGlvbiwgd2UKIAkJLy8gbG9vayBpbiB0aGUgZmllbGQncyBNZXNzYWdlVHlwZS4KQEAgLTE4OSwxMCArMTg5LDEwIEBACiAJLy8gVGhlIHByZXZpb3VzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHRhZyBleHRlbnNpb24gZmllbGRzIGFzIHByb3RvMywKIAkvLyBldmVuIHdoZW4gdGhlIGZpZWxkIGlzIGRlZmluZWQgaW4gYSBwcm90bzMgZmlsZS4gTWF0Y2ggdGhhdCBiZWhhdmlvcgogCS8vIGZvciBjb25zaXN0ZW5jeS4KLQlpZiBmZC5TeW50YXgoKSA9PSBwcmVmLlByb3RvMyAmJiAhZmQuSXNFeHRlbnNpb24oKSB7CisJaWYgZmQuU3ludGF4KCkgPT0gcHJvdG9yZWZsZWN0LlByb3RvMyAmJiAhZmQuSXNFeHRlbnNpb24oKSB7CiAJCXRhZyA9IGFwcGVuZCh0YWcsICJwcm90bzMiKQogCX0KLQlpZiBmZC5LaW5kKCkgPT0gcHJlZi5FbnVtS2luZCAmJiBlbnVtTmFtZSAhPSAiIiB7CisJaWYgZmQuS2luZCgpID09IHByb3RvcmVmbGVjdC5FbnVtS2luZCAmJiBlbnVtTmFtZSAhPSAiIiB7CiAJCXRhZyA9IGFwcGVuZCh0YWcsICJlbnVtPSIrZW51bU5hbWUpCiAJfQogCWlmIGZkLkNvbnRhaW5pbmdPbmVvZigpICE9IG5pbCB7CmRpZmYgLS1naXQgYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZW5jb2RpbmcvdGV4dC9kZWNvZGUuZ28gYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZW5jb2RpbmcvdGV4dC9kZWNvZGUuZ28KaW5kZXggZWIxMGVhMS4uODc4NTNlNyAxMDA2NDQKLS0tIGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2VuY29kaW5nL3RleHQvZGVjb2RlLmdvCisrKyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9lbmNvZGluZy90ZXh0L2RlY29kZS5nbwpAQCAtOCw3ICs4LDYgQEAKIAkiYnl0ZXMiCiAJImZtdCIKIAkiaW8iCi0JInJlZ2V4cCIKIAkic3RyY29udiIKIAkidW5pY29kZS91dGY4IgogCkBAIC0zODEsNyArMzgwLDcgQEAKIAljYXNlICdbJzoKIAkJcmV0dXJuIExpc3RPcGVuLCAnXScKIAl9Ci0JcGFuaWMoZm10LlNwcmludGYoIkRlY29kZXI6IG9wZW5TdGFjayBjb250YWlucyBpbnZhbGlkIGJ5dGUgJXMiLCBzdHJpbmcob3BlbkNoKSkpCisJcGFuaWMoZm10LlNwcmludGYoIkRlY29kZXI6IG9wZW5TdGFjayBjb250YWlucyBpbnZhbGlkIGJ5dGUgJWMiLCBvcGVuQ2gpKQogfQogCiBmdW5jIChkICpEZWNvZGVyKSBwdXNoT3BlblN0YWNrKGNoIGJ5dGUpIHsKQEAgLTQxMywxNSArNDEyLDE2IEBACiAJLy8gRmllbGQgbnVtYmVyLiBJZGVudGlmeSBpZiBpbnB1dCBpcyBhIHZhbGlkIG51bWJlciB0aGF0IGlzIG5vdCBuZWdhdGl2ZQogCS8vIGFuZCBpcyBkZWNpbWFsIGludGVnZXIgd2l0aGluIDMyLWJpdCByYW5nZS4KIAlpZiBudW0gOj0gcGFyc2VOdW1iZXIoZC5pbik7IG51bS5zaXplID4gMCB7CisJCXN0ciA6PSBudW0uc3RyaW5nKGQuaW4pCiAJCWlmICFudW0ubmVnICYmIG51bS5raW5kID09IG51bURlYyB7Ci0JCQlpZiBfLCBlcnIgOj0gc3RyY29udi5QYXJzZUludChzdHJpbmcoZC5pbls6bnVtLnNpemVdKSwgMTAsIDMyKTsgZXJyID09IG5pbCB7CisJCQlpZiBfLCBlcnIgOj0gc3RyY29udi5QYXJzZUludChzdHIsIDEwLCAzMik7IGVyciA9PSBuaWwgewogCQkJCXJldHVybiBkLmNvbnN1bWVUb2tlbihOYW1lLCBudW0uc2l6ZSwgdWludDgoRmllbGROdW1iZXIpKSwgbmlsCiAJCQl9CiAJCX0KLQkJcmV0dXJuIFRva2Vue30sIGQubmV3U3ludGF4RXJyb3IoImludmFsaWQgZmllbGQgbnVtYmVyOiAlcyIsIGQuaW5bOm51bS5zaXplXSkKKwkJcmV0dXJuIFRva2Vue30sIGQubmV3U3ludGF4RXJyb3IoImludmFsaWQgZmllbGQgbnVtYmVyOiAlcyIsIHN0cikKIAl9CiAKLQlyZXR1cm4gVG9rZW57fSwgZC5uZXdTeW50YXhFcnJvcigiaW52YWxpZCBmaWVsZCBuYW1lOiAlcyIsIGVyclJlZ2V4cC5GaW5kKGQuaW4pKQorCXJldHVybiBUb2tlbnt9LCBkLm5ld1N5bnRheEVycm9yKCJpbnZhbGlkIGZpZWxkIG5hbWU6ICVzIiwgZXJySWQoZC5pbikpCiB9CiAKIC8vIHBhcnNlVHlwZU5hbWUgcGFyc2VzIEFueSB0eXBlIFVSTCBvciBleHRlbnNpb24gZmllbGQgbmFtZS4gVGhlIG5hbWUgaXMKQEAgLTU3MSw3ICs1NzEsNyBAQAogCQlyZXR1cm4gdG9rLCBuaWwKIAl9CiAKLQlyZXR1cm4gVG9rZW57fSwgZC5uZXdTeW50YXhFcnJvcigiaW52YWxpZCBzY2FsYXIgdmFsdWU6ICVzIiwgZXJyUmVnZXhwLkZpbmQoZC5pbikpCisJcmV0dXJuIFRva2Vue30sIGQubmV3U3ludGF4RXJyb3IoImludmFsaWQgc2NhbGFyIHZhbHVlOiAlcyIsIGVycklkKGQuaW4pKQogfQogCiAvLyBwYXJzZUxpdGVyYWxWYWx1ZSBwYXJzZXMgYSBsaXRlcmFsIHZhbHVlLiBBIGxpdGVyYWwgdmFsdWUgaXMgdXNlZCBmb3IKQEAgLTY1Myw4ICs2NTMsMjkgQEAKIAlyZXR1cm4gYgogfQogCi0vLyBBbnkgc2VxdWVuY2UgdGhhdCBsb29rcyBsaWtlIGEgbm9uLWRlbGltaXRlciAoZm9yIGVycm9yIHJlcG9ydGluZykuCi12YXIgZXJyUmVnZXhwID0gcmVnZXhwLk11c3RDb21waWxlKGBeKFstKy5fYS16QS1aMC05XC9dK3wuKWApCisvLyBlcnJJZCBleHRyYWN0cyBhIGJ5dGUgc2VxdWVuY2UgdGhhdCBsb29rcyBsaWtlIGFuIGludmFsaWQgSUQKKy8vIChmb3IgdGhlIHB1cnBvc2VzIG9mIGVycm9yIHJlcG9ydGluZykuCitmdW5jIGVycklkKHNlcSBbXWJ5dGUpIFtdYnl0ZSB7CisJY29uc3QgbWF4TGVuID0gMzIKKwlmb3IgaSA6PSAwOyBpIDwgbGVuKHNlcSk7IHsKKwkJaWYgaSA+IG1heExlbiB7CisJCQlyZXR1cm4gYXBwZW5kKHNlcVs6aTppXSwgIuKApiIuLi4pCisJCX0KKwkJciwgc2l6ZSA6PSB1dGY4LkRlY29kZVJ1bmUoc2VxW2k6XSkKKwkJaWYgciA+IHV0ZjguUnVuZVNlbGYgfHwgKHIgIT0gJy8nICYmIGlzRGVsaW0oYnl0ZShyKSkpIHsKKwkJCWlmIGkgPT0gMCB7CisJCQkJLy8gRWl0aGVyIHRoZSBmaXJzdCBieXRlIGlzIGludmFsaWQgVVRGLTggb3IgYQorCQkJCS8vIGRlbGltaXRlciwgb3IgdGhlIGZpcnN0IHJ1bmUgaXMgbm9uLUFTQ0lJLgorCQkJCS8vIFJldHVybiBpdCBhcy1pcy4KKwkJCQlpID0gc2l6ZQorCQkJfQorCQkJcmV0dXJuIHNlcVs6aTppXQorCQl9CisJCWkgKz0gc2l6ZQorCX0KKwkvLyBObyBkZWxpbWl0ZXIgZm91bmQuCisJcmV0dXJuIHNlcQorfQogCiAvLyBpc0RlbGltIHJldHVybnMgdHJ1ZSBpZiBnaXZlbiBieXRlIGlzIGEgZGVsaW1pdGVyIGNoYXJhY3Rlci4KIGZ1bmMgaXNEZWxpbShjIGJ5dGUpIGJvb2wgewpkaWZmIC0tZ2l0IGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2VuY29kaW5nL3RleHQvZGVjb2RlX251bWJlci5nbyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9lbmNvZGluZy90ZXh0L2RlY29kZV9udW1iZXIuZ28KaW5kZXggZjJkOTBiNy4uNDVjODFmMCAxMDA2NDQKLS0tIGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2VuY29kaW5nL3RleHQvZGVjb2RlX251bWJlci5nbworKysgYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZW5jb2RpbmcvdGV4dC9kZWNvZGVfbnVtYmVyLmdvCkBAIC0xNSwxNyArMTUsMTIgQEAKIAlpZiBudW0ubmVnIHsKIAkJbnVtQXR0cnMgfD0gaXNOZWdhdGl2ZQogCX0KLQlzdHJTaXplIDo9IG51bS5zaXplCi0JbGFzdCA6PSBudW0uc2l6ZSAtIDEKLQlpZiBudW0ua2luZCA9PSBudW1GbG9hdCAmJiAoZC5pbltsYXN0XSA9PSAnZicgfHwgZC5pbltsYXN0XSA9PSAnRicpIHsKLQkJc3RyU2l6ZSA9IGxhc3QKLQl9CiAJdG9rIDo9IFRva2VuewogCQlraW5kOiAgICAgU2NhbGFyLAogCQlhdHRyczogICAgbnVtYmVyVmFsdWUsCiAJCXBvczogICAgICBsZW4oZC5vcmlnKSAtIGxlbihkLmluKSwKIAkJcmF3OiAgICAgIGQuaW5bOm51bS5zaXplXSwKLQkJc3RyOiAgICAgIHN0cmluZyhkLmluWzpzdHJTaXplXSksCisJCXN0cjogICAgICBudW0uc3RyaW5nKGQuaW4pLAogCQludW1BdHRyczogbnVtQXR0cnMsCiAJfQogCWQuY29uc3VtZShudW0uc2l6ZSkKQEAgLTQ2LDEyICs0MSwzNSBAQAogCWtpbmQgdWludDgKIAluZWcgIGJvb2wKIAlzaXplIGludAorCS8vIGlmIG5lZywgdGhpcyBpcyB0aGUgbGVuZ3RoIG9mIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzIGJldHdlZW4KKwkvLyB0aGUgbWludXMgc2lnbiBhbmQgdGhlIHJlc3QgZm8gdGhlIG51bWJlciBsaXRlcmFsCisJc2VwIGludAorfQorCitmdW5jIChudW0gbnVtYmVyKSBzdHJpbmcoZGF0YSBbXWJ5dGUpIHN0cmluZyB7CisJc3RyU2l6ZSA6PSBudW0uc2l6ZQorCWxhc3QgOj0gbnVtLnNpemUgLSAxCisJaWYgbnVtLmtpbmQgPT0gbnVtRmxvYXQgJiYgKGRhdGFbbGFzdF0gPT0gJ2YnIHx8IGRhdGFbbGFzdF0gPT0gJ0YnKSB7CisJCXN0clNpemUgPSBsYXN0CisJfQorCWlmIG51bS5uZWcgJiYgbnVtLnNlcCA+IDAgeworCQkvLyBzdHJpcCB3aGl0ZXNwYWNlL2NvbW1lbnRzIGJldHdlZW4gbmVnYXRpdmUgc2lnbiBhbmQgdGhlIHJlc3QKKwkJc3RyTGVuIDo9IHN0clNpemUgLSBudW0uc2VwCisJCXN0ciA6PSBtYWtlKFtdYnl0ZSwgc3RyTGVuKQorCQlzdHJbMF0gPSBkYXRhWzBdCisJCWNvcHkoc3RyWzE6XSwgZGF0YVtudW0uc2VwKzE6c3RyU2l6ZV0pCisJCXJldHVybiBzdHJpbmcoc3RyKQorCX0KKwlyZXR1cm4gc3RyaW5nKGRhdGFbOnN0clNpemVdKQorCiB9CiAKIC8vIHBhcnNlTnVtYmVyIGNvbnN0cnVjdHMgYSBudW1iZXIgb2JqZWN0IGZyb20gZ2l2ZW4gaW5wdXQuIEl0IGFsbG93cyBmb3IgdGhlCiAvLyBmb2xsb3dpbmcgcGF0dGVybnM6Ci0vLyAgIGludGVnZXI6IF4tPyhbMS05XVswLTldKnwwW3hYXVswLTlhLWZBLUZdK3wwWzAtN10qKQotLy8gICBmbG9hdDogXi0/KCgwfFsxLTldWzAtOV0qKT8oWy5dWzAtOV0qKT8oW2VFXVsrLV0/WzAtOV0rKT9bZkZdPykKKy8vCisvLwlpbnRlZ2VyOiBeLT8oWzEtOV1bMC05XSp8MFt4WF1bMC05YS1mQS1GXSt8MFswLTddKikKKy8vCWZsb2F0OiBeLT8oKDB8WzEtOV1bMC05XSopPyhbLl1bMC05XSopPyhbZUVdWystXT9bMC05XSspP1tmRl0/KQorLy8KIC8vIEl0IGFsc28gcmV0dXJucyB0aGUgbnVtYmVyIG9mIHBhcnNlZCBieXRlcyBmb3IgdGhlIGdpdmVuIG51bWJlciwgMCBpZiBpdCBpcwogLy8gbm90IGEgbnVtYmVyLgogZnVuYyBwYXJzZU51bWJlcihpbnB1dCBbXWJ5dGUpIG51bWJlciB7CkBAIC02NSwxOSArODMsMjIgQEAKIAl9CiAKIAkvLyBPcHRpb25hbCAtCisJdmFyIHNlcCBpbnQKIAlpZiBzWzBdID09ICctJyB7CiAJCW5lZyA9IHRydWUKIAkJcyA9IHNbMTpdCiAJCXNpemUrKworCQkvLyBDb25zdW1lIGFueSB3aGl0ZXNwYWNlIG9yIGNvbW1lbnRzIGJldHdlZW4gdGhlCisJCS8vIG5lZ2F0aXZlIHNpZ24gYW5kIHRoZSByZXN0IG9mIHRoZSBudW1iZXIKKwkJbGVuQmVmb3JlIDo9IGxlbihzKQorCQlzID0gY29uc3VtZShzLCAwKQorCQlzZXAgPSBsZW5CZWZvcmUgLSBsZW4ocykKKwkJc2l6ZSArPSBzZXAKIAkJaWYgbGVuKHMpID09IDAgewogCQkJcmV0dXJuIG51bWJlcnt9CiAJCX0KIAl9CiAKLQkvLyBDKysgYWxsb3dzIGZvciB3aGl0ZXNwYWNlIGFuZCBjb21tZW50cyBpbiBiZXR3ZWVuIHRoZSBuZWdhdGl2ZSBzaWduIGFuZAotCS8vIHRoZSByZXN0IG9mIHRoZSBudW1iZXIuIFRoaXMgbG9naWMgY3VycmVudGx5IGRvZXMgbm90IGJ1dCBpcyBjb25zaXN0ZW50Ci0JLy8gd2l0aCB2MS4KLQogCXN3aXRjaCB7CiAJY2FzZSBzWzBdID09ICcwJzoKIAkJaWYgbGVuKHMpID4gMSB7CkBAIC0xMTQsNyArMTM1LDcgQEAKIAkJCQlpZiBsZW4ocykgPiAwICYmICFpc0RlbGltKHNbMF0pIHsKIAkJCQkJcmV0dXJuIG51bWJlcnt9CiAJCQkJfQotCQkJCXJldHVybiBudW1iZXJ7a2luZDoga2luZCwgbmVnOiBuZWcsIHNpemU6IHNpemV9CisJCQkJcmV0dXJuIG51bWJlcntraW5kOiBraW5kLCBuZWc6IG5lZywgc2l6ZTogc2l6ZSwgc2VwOiBzZXB9CiAJCQl9CiAJCX0KIAkJcyA9IHNbMTpdCkBAIC0xODYsNSArMjA3LDUgQEAKIAkJcmV0dXJuIG51bWJlcnt9CiAJfQogCi0JcmV0dXJuIG51bWJlcntraW5kOiBraW5kLCBuZWc6IG5lZywgc2l6ZTogc2l6ZX0KKwlyZXR1cm4gbnVtYmVye2tpbmQ6IGtpbmQsIG5lZzogbmVnLCBzaXplOiBzaXplLCBzZXA6IHNlcH0KIH0KZGlmZiAtLWdpdCBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9lbmNvZGluZy90ZXh0L2RvYy5nbyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9lbmNvZGluZy90ZXh0L2RvYy5nbwppbmRleCAwY2U4ZDZmLi43YWU2YzJhIDEwMDY0NAotLS0gYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZW5jb2RpbmcvdGV4dC9kb2MuZ28KKysrIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2VuY29kaW5nL3RleHQvZG9jLmdvCkBAIC0yNCw2ICsyNCw2IEBACiAvLyB0aGUgR28gaW1wbGVtZW50YXRpb24gc2hvdWxkIGFzIHdlbGwuCiAvLwogLy8gVGhlIHRleHQgZm9ybWF0IGlzIGFsbW9zdCBhIHN1cGVyc2V0IG9mIEpTT04gZXhjZXB0OgotLy8JKiBtZXNzYWdlIGtleXMgYXJlIG5vdCBxdW90ZWQgc3RyaW5ncywgYnV0IGlkZW50aWZpZXJzCi0vLwkqIHRoZSB0b3AtbGV2ZWwgdmFsdWUgbXVzdCBiZSBhIG1lc3NhZ2Ugd2l0aG91dCB0aGUgZGVsaW1pdGVycworLy8gICAtIG1lc3NhZ2Uga2V5cyBhcmUgbm90IHF1b3RlZCBzdHJpbmdzLCBidXQgaWRlbnRpZmllcnMKKy8vICAgLSB0aGUgdG9wLWxldmVsIHZhbHVlIG11c3QgYmUgYSBtZXNzYWdlIHdpdGhvdXQgdGhlIGRlbGltaXRlcnMKIHBhY2thZ2UgdGV4dApkaWZmIC0tZ2l0IGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2VuY29kaW5nL3RleHQvZW5jb2RlLmdvIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2VuY29kaW5nL3RleHQvZW5jb2RlLmdvCmluZGV4IGRhMjg5Y2MuLmNmN2FlZDcgMTAwNjQ0Ci0tLSBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9lbmNvZGluZy90ZXh0L2VuY29kZS5nbworKysgYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZW5jb2RpbmcvdGV4dC9lbmNvZGUuZ28KQEAgLTUzLDggKzUzLDEwIEBACiAvLyBJZiBvdXRwdXRBU0NJSSBpcyB0cnVlLCBzdHJpbmdzIHdpbGwgYmUgc2VyaWFsaXplZCBpbiBzdWNoIGEgd2F5IHRoYXQKIC8vIG11bHRpLWJ5dGUgVVRGLTggc2VxdWVuY2VzIGFyZSBlc2NhcGVkLiBUaGlzIHByb3BlcnR5IGVuc3VyZXMgdGhhdCB0aGUKIC8vIG92ZXJhbGwgb3V0cHV0IGlzIEFTQ0lJIChhcyBvcHBvc2VkIHRvIFVURi04KS4KLWZ1bmMgTmV3RW5jb2RlcihpbmRlbnQgc3RyaW5nLCBkZWxpbXMgWzJdYnl0ZSwgb3V0cHV0QVNDSUkgYm9vbCkgKCpFbmNvZGVyLCBlcnJvcikgewotCWUgOj0gJkVuY29kZXJ7fQorZnVuYyBOZXdFbmNvZGVyKGJ1ZiBbXWJ5dGUsIGluZGVudCBzdHJpbmcsIGRlbGltcyBbMl1ieXRlLCBvdXRwdXRBU0NJSSBib29sKSAoKkVuY29kZXIsIGVycm9yKSB7CisJZSA6PSAmRW5jb2RlcnsKKwkJZW5jb2RlclN0YXRlOiBlbmNvZGVyU3RhdGV7b3V0OiBidWZ9LAorCX0KIAlpZiBsZW4oaW5kZW50KSA+IDAgewogCQlpZiBzdHJpbmdzLlRyaW0oaW5kZW50LCAiIFx0IikgIT0gIiIgewogCQkJcmV0dXJuIG5pbCwgZXJyb3JzLk5ldygiaW5kZW50IG1heSBvbmx5IGJlIGNvbXBvc2VkIG9mIHNwYWNlIGFuZCB0YWIgY2hhcmFjdGVycyIpCkBAIC0xOTUsMTMgKzE5NywxMyBAQAogLy8gV3JpdGVJbnQgd3JpdGVzIG91dCB0aGUgZ2l2ZW4gc2lnbmVkIGludGVnZXIgdmFsdWUuCiBmdW5jIChlICpFbmNvZGVyKSBXcml0ZUludChuIGludDY0KSB7CiAJZS5wcmVwYXJlTmV4dChzY2FsYXIpCi0JZS5vdXQgPSBhcHBlbmQoZS5vdXQsIHN0cmNvbnYuRm9ybWF0SW50KG4sIDEwKS4uLikKKwllLm91dCA9IHN0cmNvbnYuQXBwZW5kSW50KGUub3V0LCBuLCAxMCkKIH0KIAogLy8gV3JpdGVVaW50IHdyaXRlcyBvdXQgdGhlIGdpdmVuIHVuc2lnbmVkIGludGVnZXIgdmFsdWUuCiBmdW5jIChlICpFbmNvZGVyKSBXcml0ZVVpbnQobiB1aW50NjQpIHsKIAllLnByZXBhcmVOZXh0KHNjYWxhcikKLQllLm91dCA9IGFwcGVuZChlLm91dCwgc3RyY29udi5Gb3JtYXRVaW50KG4sIDEwKS4uLikKKwllLm91dCA9IHN0cmNvbnYuQXBwZW5kVWludChlLm91dCwgbiwgMTApCiB9CiAKIC8vIFdyaXRlTGl0ZXJhbCB3cml0ZXMgb3V0IHRoZSBnaXZlbiBzdHJpbmcgYXMgYSBsaXRlcmFsIHZhbHVlIHdpdGhvdXQgcXVvdGVzLgpkaWZmIC0tZ2l0IGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2Vycm9ycy9pc19nbzExMi5nbyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9lcnJvcnMvaXNfZ28xMTIuZ28KaW5kZXggZjkwZTkwOS4uZmJjZDM0OSAxMDA2NDQKLS0tIGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2Vycm9ycy9pc19nbzExMi5nbworKysgYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZXJyb3JzL2lzX2dvMTEyLmdvCkBAIC0yLDYgKzIsNyBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUKIC8vIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAorLy9nbzpidWlsZCAhZ28xLjEzCiAvLyArYnVpbGQgIWdvMS4xMwogCiBwYWNrYWdlIGVycm9ycwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2Vycm9ycy9pc19nbzExMy5nbyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9lcnJvcnMvaXNfZ28xMTMuZ28KaW5kZXggZGMwNWY0MS4uNWU3MmYxYyAxMDA2NDQKLS0tIGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2Vycm9ycy9pc19nbzExMy5nbworKysgYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZXJyb3JzL2lzX2dvMTEzLmdvCkBAIC0yLDYgKzIsNyBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUKIC8vIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAorLy9nbzpidWlsZCBnbzEuMTMKIC8vICtidWlsZCBnbzEuMTMKIAogcGFja2FnZSBlcnJvcnMKZGlmZiAtLWdpdCBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9maWxlZGVzYy9idWlsZC5nbyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9maWxlZGVzYy9idWlsZC5nbwppbmRleCBiMjkzYjY5Li43Y2FjMWMxIDEwMDY0NAotLS0gYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZmlsZWRlc2MvYnVpbGQuZ28KKysrIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ZpbGVkZXNjL2J1aWxkLmdvCkBAIC0xMiw4ICsxMiw3IEBACiAJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2VuY29kaW5nL3Byb3Rvd2lyZSIKIAkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZ2VuaWQiCiAJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgotCXByZWYgImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgotCXByZWcgImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWdpc3RyeSIKKwkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZ2lzdHJ5IgogKQogCiAvLyBCdWlsZGVyIGNvbnN0cnVjdCBhIHByb3RvcmVmbGVjdC5GaWxlRGVzY3JpcHRvciBmcm9tIHRoZSByYXcgZGVzY3JpcHRvci4KQEAgLTM4LDcgKzM3LDcgQEAKIAkvLyBUeXBlUmVzb2x2ZXIgcmVzb2x2ZXMgZXh0ZW5zaW9uIGZpZWxkIHR5cGVzIGZvciBkZXNjcmlwdG9yIG9wdGlvbnMuCiAJLy8gSWYgbmlsLCBpdCB1c2VzIHByb3RvcmVnaXN0cnkuR2xvYmFsVHlwZXMuCiAJVHlwZVJlc29sdmVyIGludGVyZmFjZSB7Ci0JCXByZWcuRXh0ZW5zaW9uVHlwZVJlc29sdmVyCisJCXByb3RvcmVnaXN0cnkuRXh0ZW5zaW9uVHlwZVJlc29sdmVyCiAJfQogCiAJLy8gRmlsZVJlZ2lzdHJ5IGlzIHVzZSB0byBsb29rdXAgZmlsZSwgZW51bSwgYW5kIG1lc3NhZ2UgZGVwZW5kZW5jaWVzLgpAQCAtNDYsOCArNDUsOCBAQAogCS8vIElmIG5pbCwgaXQgdXNlcyBwcm90b3JlZ2lzdHJ5Lkdsb2JhbEZpbGVzLgogCUZpbGVSZWdpc3RyeSBpbnRlcmZhY2UgewogCQlGaW5kRmlsZUJ5UGF0aChzdHJpbmcpIChwcm90b3JlZmxlY3QuRmlsZURlc2NyaXB0b3IsIGVycm9yKQotCQlGaW5kRGVzY3JpcHRvckJ5TmFtZShwcmVmLkZ1bGxOYW1lKSAocHJlZi5EZXNjcmlwdG9yLCBlcnJvcikKLQkJUmVnaXN0ZXJGaWxlKHByZWYuRmlsZURlc2NyaXB0b3IpIGVycm9yCisJCUZpbmREZXNjcmlwdG9yQnlOYW1lKHByb3RvcmVmbGVjdC5GdWxsTmFtZSkgKHByb3RvcmVmbGVjdC5EZXNjcmlwdG9yLCBlcnJvcikKKwkJUmVnaXN0ZXJGaWxlKHByb3RvcmVmbGVjdC5GaWxlRGVzY3JpcHRvcikgZXJyb3IKIAl9CiB9CiAKQEAgLTU1LDggKzU0LDggQEAKIC8vIElmIHNvLCBpdCBwZXJtaXRzIGxvb2tpbmcgdXAgYW4gZW51bSBvciBtZXNzYWdlIGRlcGVuZGVuY3kgYmFzZWQgb24gdGhlCiAvLyBzdWItbGlzdCBhbmQgZWxlbWVudCBpbmRleCBpbnRvIGZpbGV0eXBlLkJ1aWxkZXIuRGVwZW5kZW5jeUluZGV4ZXMuCiB0eXBlIHJlc29sdmVyQnlJbmRleCBpbnRlcmZhY2UgewotCUZpbmRFbnVtQnlJbmRleChpbnQzMiwgaW50MzIsIFtdRW51bSwgW11NZXNzYWdlKSBwcmVmLkVudW1EZXNjcmlwdG9yCi0JRmluZE1lc3NhZ2VCeUluZGV4KGludDMyLCBpbnQzMiwgW11FbnVtLCBbXU1lc3NhZ2UpIHByZWYuTWVzc2FnZURlc2NyaXB0b3IKKwlGaW5kRW51bUJ5SW5kZXgoaW50MzIsIGludDMyLCBbXUVudW0sIFtdTWVzc2FnZSkgcHJvdG9yZWZsZWN0LkVudW1EZXNjcmlwdG9yCisJRmluZE1lc3NhZ2VCeUluZGV4KGludDMyLCBpbnQzMiwgW11FbnVtLCBbXU1lc3NhZ2UpIHByb3RvcmVmbGVjdC5NZXNzYWdlRGVzY3JpcHRvcgogfQogCiAvLyBJbmRleGVzIG9mIGVhY2ggc3ViLWxpc3QgaW4gZmlsZXR5cGUuQnVpbGRlci5EZXBlbmRlbmN5SW5kZXhlcy4KQEAgLTcwLDcgKzY5LDcgQEAKIAogLy8gT3V0IGlzIHRoZSBvdXRwdXQgb2YgdGhlIEJ1aWxkZXIuCiB0eXBlIE91dCBzdHJ1Y3QgewotCUZpbGUgcHJlZi5GaWxlRGVzY3JpcHRvcgorCUZpbGUgcHJvdG9yZWZsZWN0LkZpbGVEZXNjcmlwdG9yCiAKIAkvLyBFbnVtcyBpcyBhbGwgZW51bSBkZXNjcmlwdG9ycyBpbiAiZmxhdHRlbmVkIG9yZGVyaW5nIi4KIAlFbnVtcyBbXUVudW0KQEAgLTk3LDEwICs5NiwxMCBAQAogCiAJLy8gSW5pdGlhbGl6ZSByZXNvbHZlcnMgYW5kIHJlZ2lzdHJpZXMgaWYgdW5wb3B1bGF0ZWQuCiAJaWYgZGIuVHlwZVJlc29sdmVyID09IG5pbCB7Ci0JCWRiLlR5cGVSZXNvbHZlciA9IHByZWcuR2xvYmFsVHlwZXMKKwkJZGIuVHlwZVJlc29sdmVyID0gcHJvdG9yZWdpc3RyeS5HbG9iYWxUeXBlcwogCX0KIAlpZiBkYi5GaWxlUmVnaXN0cnkgPT0gbmlsIHsKLQkJZGIuRmlsZVJlZ2lzdHJ5ID0gcHJlZy5HbG9iYWxGaWxlcworCQlkYi5GaWxlUmVnaXN0cnkgPSBwcm90b3JlZ2lzdHJ5Lkdsb2JhbEZpbGVzCiAJfQogCiAJZmQgOj0gbmV3UmF3RmlsZShkYikKZGlmZiAtLWdpdCBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9maWxlZGVzYy9kZXNjLmdvIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ZpbGVkZXNjL2Rlc2MuZ28KaW5kZXggOThhYjE0Mi4uODgyNmJjZiAxMDA2NDQKLS0tIGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ZpbGVkZXNjL2Rlc2MuZ28KKysrIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ZpbGVkZXNjL2Rlc2MuZ28KQEAgLTE3LDE1ICsxNywzMCBAQAogCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9nZW5pZCIKIAkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvcHJhZ21hIgogCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9zdHJzIgotCXByZWYgImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgorCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9yZWZsZWN0L3Byb3RvcmVmbGVjdCIKIAkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZ2lzdHJ5IgogKQogCisvLyBFZGl0aW9uIGlzIGFuIEVudW0gZm9yIHByb3RvMi5FZGl0aW9uCit0eXBlIEVkaXRpb24gaW50MzIKKworLy8gVGhlc2UgdmFsdWVzIGFsaWduIHdpdGggdGhlIHZhbHVlIG9mIEVudW0gaW4gZGVzY3JpcHRvci5wcm90byB3aGljaCBhbGxvd3MKKy8vIGRpcmVjdCBjb252ZXJzaW9uIGJldHdlZW4gdGhlIHByb3RvIGVudW0gYW5kIHRoaXMgZW51bS4KK2NvbnN0ICgKKwlFZGl0aW9uVW5rbm93biAgICAgRWRpdGlvbiA9IDAKKwlFZGl0aW9uUHJvdG8yICAgICAgRWRpdGlvbiA9IDk5OAorCUVkaXRpb25Qcm90bzMgICAgICBFZGl0aW9uID0gOTk5CisJRWRpdGlvbjIwMjMgICAgICAgIEVkaXRpb24gPSAxMDAwCisJRWRpdGlvblVuc3VwcG9ydGVkIEVkaXRpb24gPSAxMDAwMDAKKykKKwogLy8gVGhlIHR5cGVzIGluIHRoaXMgZmlsZSBtYXkgaGF2ZSBhIHN1ZmZpeDoKIC8vCeKAoiBMMDogQ29udGFpbnMgZmllbGRzIGNvbW1vbiB0byBhbGwgZGVzY3JpcHRvcnMgKGV4Y2VwdCBGaWxlKSBhbmQKIC8vCW11c3QgYmUgaW5pdGlhbGl6ZWQgdXAgZnJvbnQuCiAvLwnigKIgTDE6IENvbnRhaW5zIGZpZWxkcyBzcGVjaWZpYyB0byBhIGRlc2NyaXB0b3IgYW5kCi0vLwltdXN0IGJlIGluaXRpYWxpemVkIHVwIGZyb250LgorLy8JbXVzdCBiZSBpbml0aWFsaXplZCB1cCBmcm9udC4gSWYgdGhlIGFzc29jaWF0ZWQgcHJvdG8gdXNlcyBFZGl0aW9ucywgdGhlCisvLyAgRWRpdGlvbnMgZmVhdHVyZXMgbXVzdCBhbHdheXMgYmUgcmVzb2x2ZWQuIElmIG5vdCBleHBsaWNpdGx5IHNldCwgdGhlCisvLyAgYXBwcm9wcmlhdGUgZGVmYXVsdCBtdXN0IGJlIHJlc29sdmVkIGFuZCBzZXQuCiAvLwnigKIgTDI6IENvbnRhaW5zIGZpZWxkcyB0aGF0IGFyZSBsYXppbHkgaW5pdGlhbGl6ZWQgd2hlbiBjb25zdHJ1Y3RpbmcKIC8vCWZyb20gdGhlIHJhdyBmaWxlIGRlc2NyaXB0b3IuIFdoZW4gY29uc3RydWN0aW5nIGFzIGEgbGl0ZXJhbCwgdGhlIEwyCiAvLwlmaWVsZHMgbXVzdCBiZSBpbml0aWFsaXplZCB1cCBmcm9udC4KQEAgLTQzLDQ2ICs1OCw3NiBAQAogCQlMMiAgICpGaWxlTDIKIAl9CiAJRmlsZUwxIHN0cnVjdCB7Ci0JCVN5bnRheCAgcHJlZi5TeW50YXgKKwkJU3ludGF4ICBwcm90b3JlZmxlY3QuU3ludGF4CisJCUVkaXRpb24gRWRpdGlvbiAvLyBPbmx5IHVzZWQgaWYgU3ludGF4ID09IEVkaXRpb25zCiAJCVBhdGggICAgc3RyaW5nCi0JCVBhY2thZ2UgcHJlZi5GdWxsTmFtZQorCQlQYWNrYWdlIHByb3RvcmVmbGVjdC5GdWxsTmFtZQogCiAJCUVudW1zICAgICAgRW51bXMKIAkJTWVzc2FnZXMgICBNZXNzYWdlcwogCQlFeHRlbnNpb25zIEV4dGVuc2lvbnMKIAkJU2VydmljZXMgICBTZXJ2aWNlcworCisJCUVkaXRpb25GZWF0dXJlcyBFZGl0aW9uRmVhdHVyZXMKIAl9CiAJRmlsZUwyIHN0cnVjdCB7Ci0JCU9wdGlvbnMgICBmdW5jKCkgcHJlZi5Qcm90b01lc3NhZ2UKKwkJT3B0aW9ucyAgIGZ1bmMoKSBwcm90b3JlZmxlY3QuUHJvdG9NZXNzYWdlCiAJCUltcG9ydHMgICBGaWxlSW1wb3J0cwogCQlMb2NhdGlvbnMgU291cmNlTG9jYXRpb25zCiAJfQorCisJRWRpdGlvbkZlYXR1cmVzIHN0cnVjdCB7CisJCS8vIElzRmllbGRQcmVzZW5jZSBpcyB0cnVlIGlmIGZpZWxkX3ByZXNlbmNlIGlzIEVYUExJQ0lUCisJCS8vIGh0dHBzOi8vcHJvdG9idWYuZGV2L2VkaXRpb25zL2ZlYXR1cmVzLyNmaWVsZF9wcmVzZW5jZQorCQlJc0ZpZWxkUHJlc2VuY2UgYm9vbAorCQkvLyBJc0ZpZWxkUHJlc2VuY2UgaXMgdHJ1ZSBpZiBmaWVsZF9wcmVzZW5jZSBpcyBMRUdBQ1lfUkVRVUlSRUQKKwkJLy8gaHR0cHM6Ly9wcm90b2J1Zi5kZXYvZWRpdGlvbnMvZmVhdHVyZXMvI2ZpZWxkX3ByZXNlbmNlCisJCUlzTGVnYWN5UmVxdWlyZWQgYm9vbAorCQkvLyBJc09wZW5FbnVtIGlzIHRydWUgaWYgZW51bV90eXBlIGlzIE9QRU4KKwkJLy8gaHR0cHM6Ly9wcm90b2J1Zi5kZXYvZWRpdGlvbnMvZmVhdHVyZXMvI2VudW1fdHlwZQorCQlJc09wZW5FbnVtIGJvb2wKKwkJLy8gSXNQYWNrZWQgaXMgdHJ1ZSBpZiByZXBlYXRlZF9maWVsZF9lbmNvZGluZyBpcyBQQUNLRUQKKwkJLy8gaHR0cHM6Ly9wcm90b2J1Zi5kZXYvZWRpdGlvbnMvZmVhdHVyZXMvI3JlcGVhdGVkX2ZpZWxkX2VuY29kaW5nCisJCUlzUGFja2VkIGJvb2wKKwkJLy8gSXNVVEY4VmFsaWRhdGVkIGlzIHRydWUgaWYgdXRmX3ZhbGlkYXRpb24gaXMgVkVSSUZZCisJCS8vIGh0dHBzOi8vcHJvdG9idWYuZGV2L2VkaXRpb25zL2ZlYXR1cmVzLyN1dGY4X3ZhbGlkYXRpb24KKwkJSXNVVEY4VmFsaWRhdGVkIGJvb2wKKwkJLy8gSXNEZWxpbWl0ZWRFbmNvZGVkIGlzIHRydWUgaWYgbWVzc2FnZV9lbmNvZGluZyBpcyBERUxJTUlURUQKKwkJLy8gaHR0cHM6Ly9wcm90b2J1Zi5kZXYvZWRpdGlvbnMvZmVhdHVyZXMvI21lc3NhZ2VfZW5jb2RpbmcKKwkJSXNEZWxpbWl0ZWRFbmNvZGVkIGJvb2wKKwkJLy8gSXNKU09OQ29tcGxpYW50IGlzIHRydWUgaWYganNvbl9mb3JtYXQgaXMgQUxMT1cKKwkJLy8gaHR0cHM6Ly9wcm90b2J1Zi5kZXYvZWRpdGlvbnMvZmVhdHVyZXMvI2pzb25fZm9ybWF0CisJCUlzSlNPTkNvbXBsaWFudCBib29sCisJCS8vIEdlbmVyYXRlTGVnYWN5VW5tYXJzaGFsSlNPTiBkZXRlcm1pbmVzIGlmIHRoZSBwbHVnaW4gZ2VuZXJhdGVzIHRoZQorCQkvLyBVbm1hcnNoYWxKU09OKFtdYnl0ZSkgZXJyb3IgbWV0aG9kIGZvciBlbnVtcy4KKwkJR2VuZXJhdGVMZWdhY3lVbm1hcnNoYWxKU09OIGJvb2wKKwl9CiApCiAKLWZ1bmMgKGZkICpGaWxlKSBQYXJlbnRGaWxlKCkgcHJlZi5GaWxlRGVzY3JpcHRvciB7IHJldHVybiBmZCB9Ci1mdW5jIChmZCAqRmlsZSkgUGFyZW50KCkgcHJlZi5EZXNjcmlwdG9yICAgICAgICAgeyByZXR1cm4gbmlsIH0KLWZ1bmMgKGZkICpGaWxlKSBJbmRleCgpIGludCAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAwIH0KLWZ1bmMgKGZkICpGaWxlKSBTeW50YXgoKSBwcmVmLlN5bnRheCAgICAgICAgICAgICB7IHJldHVybiBmZC5MMS5TeW50YXggfQotZnVuYyAoZmQgKkZpbGUpIE5hbWUoKSBwcmVmLk5hbWUgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZkLkwxLlBhY2thZ2UuTmFtZSgpIH0KLWZ1bmMgKGZkICpGaWxlKSBGdWxsTmFtZSgpIHByZWYuRnVsbE5hbWUgICAgICAgICB7IHJldHVybiBmZC5MMS5QYWNrYWdlIH0KLWZ1bmMgKGZkICpGaWxlKSBJc1BsYWNlaG9sZGVyKCkgYm9vbCAgICAgICAgICAgICB7IHJldHVybiBmYWxzZSB9Ci1mdW5jIChmZCAqRmlsZSkgT3B0aW9ucygpIHByZWYuUHJvdG9NZXNzYWdlIHsKK2Z1bmMgKGZkICpGaWxlKSBQYXJlbnRGaWxlKCkgcHJvdG9yZWZsZWN0LkZpbGVEZXNjcmlwdG9yIHsgcmV0dXJuIGZkIH0KK2Z1bmMgKGZkICpGaWxlKSBQYXJlbnQoKSBwcm90b3JlZmxlY3QuRGVzY3JpcHRvciAgICAgICAgIHsgcmV0dXJuIG5pbCB9CitmdW5jIChmZCAqRmlsZSkgSW5kZXgoKSBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAwIH0KK2Z1bmMgKGZkICpGaWxlKSBTeW50YXgoKSBwcm90b3JlZmxlY3QuU3ludGF4ICAgICAgICAgICAgIHsgcmV0dXJuIGZkLkwxLlN5bnRheCB9CitmdW5jIChmZCAqRmlsZSkgTmFtZSgpIHByb3RvcmVmbGVjdC5OYW1lICAgICAgICAgICAgICAgICB7IHJldHVybiBmZC5MMS5QYWNrYWdlLk5hbWUoKSB9CitmdW5jIChmZCAqRmlsZSkgRnVsbE5hbWUoKSBwcm90b3JlZmxlY3QuRnVsbE5hbWUgICAgICAgICB7IHJldHVybiBmZC5MMS5QYWNrYWdlIH0KK2Z1bmMgKGZkICpGaWxlKSBJc1BsYWNlaG9sZGVyKCkgYm9vbCAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZhbHNlIH0KK2Z1bmMgKGZkICpGaWxlKSBPcHRpb25zKCkgcHJvdG9yZWZsZWN0LlByb3RvTWVzc2FnZSB7CiAJaWYgZiA6PSBmZC5sYXp5SW5pdCgpLk9wdGlvbnM7IGYgIT0gbmlsIHsKIAkJcmV0dXJuIGYoKQogCX0KIAlyZXR1cm4gZGVzY29wdHMuRmlsZQogfQotZnVuYyAoZmQgKkZpbGUpIFBhdGgoKSBzdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZkLkwxLlBhdGggfQotZnVuYyAoZmQgKkZpbGUpIFBhY2thZ2UoKSBwcmVmLkZ1bGxOYW1lICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZkLkwxLlBhY2thZ2UgfQotZnVuYyAoZmQgKkZpbGUpIEltcG9ydHMoKSBwcmVmLkZpbGVJbXBvcnRzICAgICAgICAgICAgIHsgcmV0dXJuICZmZC5sYXp5SW5pdCgpLkltcG9ydHMgfQotZnVuYyAoZmQgKkZpbGUpIEVudW1zKCkgcHJlZi5FbnVtRGVzY3JpcHRvcnMgICAgICAgICAgIHsgcmV0dXJuICZmZC5MMS5FbnVtcyB9Ci1mdW5jIChmZCAqRmlsZSkgTWVzc2FnZXMoKSBwcmVmLk1lc3NhZ2VEZXNjcmlwdG9ycyAgICAgeyByZXR1cm4gJmZkLkwxLk1lc3NhZ2VzIH0KLWZ1bmMgKGZkICpGaWxlKSBFeHRlbnNpb25zKCkgcHJlZi5FeHRlbnNpb25EZXNjcmlwdG9ycyB7IHJldHVybiAmZmQuTDEuRXh0ZW5zaW9ucyB9Ci1mdW5jIChmZCAqRmlsZSkgU2VydmljZXMoKSBwcmVmLlNlcnZpY2VEZXNjcmlwdG9ycyAgICAgeyByZXR1cm4gJmZkLkwxLlNlcnZpY2VzIH0KLWZ1bmMgKGZkICpGaWxlKSBTb3VyY2VMb2NhdGlvbnMoKSBwcmVmLlNvdXJjZUxvY2F0aW9ucyB7IHJldHVybiAmZmQubGF6eUluaXQoKS5Mb2NhdGlvbnMgfQotZnVuYyAoZmQgKkZpbGUpIEZvcm1hdChzIGZtdC5TdGF0ZSwgciBydW5lKSAgICAgICAgICAgIHsgZGVzY2ZtdC5Gb3JtYXREZXNjKHMsIHIsIGZkKSB9Ci1mdW5jIChmZCAqRmlsZSkgUHJvdG9UeXBlKHByZWYuRmlsZURlc2NyaXB0b3IpICAgICAgICAge30KLWZ1bmMgKGZkICpGaWxlKSBQcm90b0ludGVybmFsKHByYWdtYS5Eb05vdEltcGxlbWVudCkgICB7fQorZnVuYyAoZmQgKkZpbGUpIFBhdGgoKSBzdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gZmQuTDEuUGF0aCB9CitmdW5jIChmZCAqRmlsZSkgUGFja2FnZSgpIHByb3RvcmVmbGVjdC5GdWxsTmFtZSAgICAgICAgICAgICAgICB7IHJldHVybiBmZC5MMS5QYWNrYWdlIH0KK2Z1bmMgKGZkICpGaWxlKSBJbXBvcnRzKCkgcHJvdG9yZWZsZWN0LkZpbGVJbXBvcnRzICAgICAgICAgICAgIHsgcmV0dXJuICZmZC5sYXp5SW5pdCgpLkltcG9ydHMgfQorZnVuYyAoZmQgKkZpbGUpIEVudW1zKCkgcHJvdG9yZWZsZWN0LkVudW1EZXNjcmlwdG9ycyAgICAgICAgICAgeyByZXR1cm4gJmZkLkwxLkVudW1zIH0KK2Z1bmMgKGZkICpGaWxlKSBNZXNzYWdlcygpIHByb3RvcmVmbGVjdC5NZXNzYWdlRGVzY3JpcHRvcnMgICAgIHsgcmV0dXJuICZmZC5MMS5NZXNzYWdlcyB9CitmdW5jIChmZCAqRmlsZSkgRXh0ZW5zaW9ucygpIHByb3RvcmVmbGVjdC5FeHRlbnNpb25EZXNjcmlwdG9ycyB7IHJldHVybiAmZmQuTDEuRXh0ZW5zaW9ucyB9CitmdW5jIChmZCAqRmlsZSkgU2VydmljZXMoKSBwcm90b3JlZmxlY3QuU2VydmljZURlc2NyaXB0b3JzICAgICB7IHJldHVybiAmZmQuTDEuU2VydmljZXMgfQorZnVuYyAoZmQgKkZpbGUpIFNvdXJjZUxvY2F0aW9ucygpIHByb3RvcmVmbGVjdC5Tb3VyY2VMb2NhdGlvbnMgeyByZXR1cm4gJmZkLmxhenlJbml0KCkuTG9jYXRpb25zIH0KK2Z1bmMgKGZkICpGaWxlKSBGb3JtYXQocyBmbXQuU3RhdGUsIHIgcnVuZSkgICAgICAgICAgICAgICAgICAgIHsgZGVzY2ZtdC5Gb3JtYXREZXNjKHMsIHIsIGZkKSB9CitmdW5jIChmZCAqRmlsZSkgUHJvdG9UeXBlKHByb3RvcmVmbGVjdC5GaWxlRGVzY3JpcHRvcikgICAgICAgICB7fQorZnVuYyAoZmQgKkZpbGUpIFByb3RvSW50ZXJuYWwocHJhZ21hLkRvTm90SW1wbGVtZW50KSAgICAgICAgICAge30KIAogZnVuYyAoZmQgKkZpbGUpIGxhenlJbml0KCkgKkZpbGVMMiB7CiAJaWYgYXRvbWljLkxvYWRVaW50MzIoJmZkLm9uY2UpID09IDAgewpAQCAtMTE3LDkgKzE2MiwxMSBAQAogCX0KIAlFbnVtTDEgc3RydWN0IHsKIAkJZWFnZXJWYWx1ZXMgYm9vbCAvLyBjb250cm9scyB3aGV0aGVyIEVudW1MMi5WYWx1ZXMgaXMgYWxyZWFkeSBwb3B1bGF0ZWQKKworCQlFZGl0aW9uRmVhdHVyZXMgRWRpdGlvbkZlYXR1cmVzCiAJfQogCUVudW1MMiBzdHJ1Y3QgewotCQlPcHRpb25zICAgICAgICBmdW5jKCkgcHJlZi5Qcm90b01lc3NhZ2UKKwkJT3B0aW9ucyAgICAgICAgZnVuYygpIHByb3RvcmVmbGVjdC5Qcm90b01lc3NhZ2UKIAkJVmFsdWVzICAgICAgICAgRW51bVZhbHVlcwogCQlSZXNlcnZlZE5hbWVzICBOYW1lcwogCQlSZXNlcnZlZFJhbmdlcyBFbnVtUmFuZ2VzCkBAIC0xMzAsNDEgKzE3Nyw0MSBAQAogCQlMMSBFbnVtVmFsdWVMMQogCX0KIAlFbnVtVmFsdWVMMSBzdHJ1Y3QgewotCQlPcHRpb25zIGZ1bmMoKSBwcmVmLlByb3RvTWVzc2FnZQotCQlOdW1iZXIgIHByZWYuRW51bU51bWJlcgorCQlPcHRpb25zIGZ1bmMoKSBwcm90b3JlZmxlY3QuUHJvdG9NZXNzYWdlCisJCU51bWJlciAgcHJvdG9yZWZsZWN0LkVudW1OdW1iZXIKIAl9CiApCiAKLWZ1bmMgKGVkICpFbnVtKSBPcHRpb25zKCkgcHJlZi5Qcm90b01lc3NhZ2UgeworZnVuYyAoZWQgKkVudW0pIE9wdGlvbnMoKSBwcm90b3JlZmxlY3QuUHJvdG9NZXNzYWdlIHsKIAlpZiBmIDo9IGVkLmxhenlJbml0KCkuT3B0aW9uczsgZiAhPSBuaWwgewogCQlyZXR1cm4gZigpCiAJfQogCXJldHVybiBkZXNjb3B0cy5FbnVtCiB9Ci1mdW5jIChlZCAqRW51bSkgVmFsdWVzKCkgcHJlZi5FbnVtVmFsdWVEZXNjcmlwdG9ycyB7CitmdW5jIChlZCAqRW51bSkgVmFsdWVzKCkgcHJvdG9yZWZsZWN0LkVudW1WYWx1ZURlc2NyaXB0b3JzIHsKIAlpZiBlZC5MMS5lYWdlclZhbHVlcyB7CiAJCXJldHVybiAmZWQuTDIuVmFsdWVzCiAJfQogCXJldHVybiAmZWQubGF6eUluaXQoKS5WYWx1ZXMKIH0KLWZ1bmMgKGVkICpFbnVtKSBSZXNlcnZlZE5hbWVzKCkgcHJlZi5OYW1lcyAgICAgICB7IHJldHVybiAmZWQubGF6eUluaXQoKS5SZXNlcnZlZE5hbWVzIH0KLWZ1bmMgKGVkICpFbnVtKSBSZXNlcnZlZFJhbmdlcygpIHByZWYuRW51bVJhbmdlcyB7IHJldHVybiAmZWQubGF6eUluaXQoKS5SZXNlcnZlZFJhbmdlcyB9Ci1mdW5jIChlZCAqRW51bSkgRm9ybWF0KHMgZm10LlN0YXRlLCByIHJ1bmUpICAgICAgeyBkZXNjZm10LkZvcm1hdERlc2MocywgciwgZWQpIH0KLWZ1bmMgKGVkICpFbnVtKSBQcm90b1R5cGUocHJlZi5FbnVtRGVzY3JpcHRvcikgICB7fQorZnVuYyAoZWQgKkVudW0pIFJlc2VydmVkTmFtZXMoKSBwcm90b3JlZmxlY3QuTmFtZXMgICAgICAgeyByZXR1cm4gJmVkLmxhenlJbml0KCkuUmVzZXJ2ZWROYW1lcyB9CitmdW5jIChlZCAqRW51bSkgUmVzZXJ2ZWRSYW5nZXMoKSBwcm90b3JlZmxlY3QuRW51bVJhbmdlcyB7IHJldHVybiAmZWQubGF6eUluaXQoKS5SZXNlcnZlZFJhbmdlcyB9CitmdW5jIChlZCAqRW51bSkgRm9ybWF0KHMgZm10LlN0YXRlLCByIHJ1bmUpICAgICAgICAgICAgICB7IGRlc2NmbXQuRm9ybWF0RGVzYyhzLCByLCBlZCkgfQorZnVuYyAoZWQgKkVudW0pIFByb3RvVHlwZShwcm90b3JlZmxlY3QuRW51bURlc2NyaXB0b3IpICAge30KIGZ1bmMgKGVkICpFbnVtKSBsYXp5SW5pdCgpICpFbnVtTDIgewogCWVkLkwwLlBhcmVudEZpbGUubGF6eUluaXQoKSAvLyBpbXBsaWNpdGx5IGluaXRpYWxpemVzIEwyCiAJcmV0dXJuIGVkLkwyCiB9CiAKLWZ1bmMgKGVkICpFbnVtVmFsdWUpIE9wdGlvbnMoKSBwcmVmLlByb3RvTWVzc2FnZSB7CitmdW5jIChlZCAqRW51bVZhbHVlKSBPcHRpb25zKCkgcHJvdG9yZWZsZWN0LlByb3RvTWVzc2FnZSB7CiAJaWYgZiA6PSBlZC5MMS5PcHRpb25zOyBmICE9IG5pbCB7CiAJCXJldHVybiBmKCkKIAl9CiAJcmV0dXJuIGRlc2NvcHRzLkVudW1WYWx1ZQogfQotZnVuYyAoZWQgKkVudW1WYWx1ZSkgTnVtYmVyKCkgcHJlZi5FbnVtTnVtYmVyICAgICAgICAgICAgeyByZXR1cm4gZWQuTDEuTnVtYmVyIH0KLWZ1bmMgKGVkICpFbnVtVmFsdWUpIEZvcm1hdChzIGZtdC5TdGF0ZSwgciBydW5lKSAgICAgICAgIHsgZGVzY2ZtdC5Gb3JtYXREZXNjKHMsIHIsIGVkKSB9Ci1mdW5jIChlZCAqRW51bVZhbHVlKSBQcm90b1R5cGUocHJlZi5FbnVtVmFsdWVEZXNjcmlwdG9yKSB7fQorZnVuYyAoZWQgKkVudW1WYWx1ZSkgTnVtYmVyKCkgcHJvdG9yZWZsZWN0LkVudW1OdW1iZXIgICAgICAgICAgICB7IHJldHVybiBlZC5MMS5OdW1iZXIgfQorZnVuYyAoZWQgKkVudW1WYWx1ZSkgRm9ybWF0KHMgZm10LlN0YXRlLCByIHJ1bmUpICAgICAgICAgICAgICAgICB7IGRlc2NmbXQuRm9ybWF0RGVzYyhzLCByLCBlZCkgfQorZnVuYyAoZWQgKkVudW1WYWx1ZSkgUHJvdG9UeXBlKHByb3RvcmVmbGVjdC5FbnVtVmFsdWVEZXNjcmlwdG9yKSB7fQogCiB0eXBlICgKIAlNZXNzYWdlIHN0cnVjdCB7CkBAIC0xNzgsMTYgKzIyNSwxOCBAQAogCQlFeHRlbnNpb25zICAgRXh0ZW5zaW9ucwogCQlJc01hcEVudHJ5ICAgYm9vbCAvLyBwcm9tb3RlZCBmcm9tIGdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucwogCQlJc01lc3NhZ2VTZXQgYm9vbCAvLyBwcm9tb3RlZCBmcm9tIGdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucworCisJCUVkaXRpb25GZWF0dXJlcyBFZGl0aW9uRmVhdHVyZXMKIAl9CiAJTWVzc2FnZUwyIHN0cnVjdCB7Ci0JCU9wdGlvbnMgICAgICAgICAgICAgICBmdW5jKCkgcHJlZi5Qcm90b01lc3NhZ2UKKwkJT3B0aW9ucyAgICAgICAgICAgICAgIGZ1bmMoKSBwcm90b3JlZmxlY3QuUHJvdG9NZXNzYWdlCiAJCUZpZWxkcyAgICAgICAgICAgICAgICBGaWVsZHMKIAkJT25lb2ZzICAgICAgICAgICAgICAgIE9uZW9mcwogCQlSZXNlcnZlZE5hbWVzICAgICAgICAgTmFtZXMKIAkJUmVzZXJ2ZWRSYW5nZXMgICAgICAgIEZpZWxkUmFuZ2VzCiAJCVJlcXVpcmVkTnVtYmVycyAgICAgICBGaWVsZE51bWJlcnMgLy8gbXVzdCBiZSBjb25zaXN0ZW50IHdpdGggRmllbGRzLkNhcmRpbmFsaXR5CiAJCUV4dGVuc2lvblJhbmdlcyAgICAgICBGaWVsZFJhbmdlcwotCQlFeHRlbnNpb25SYW5nZU9wdGlvbnMgW11mdW5jKCkgcHJlZi5Qcm90b01lc3NhZ2UgLy8gbXVzdCBiZSBzYW1lIGxlbmd0aCBhcyBFeHRlbnNpb25SYW5nZXMKKwkJRXh0ZW5zaW9uUmFuZ2VPcHRpb25zIFtdZnVuYygpIHByb3RvcmVmbGVjdC5Qcm90b01lc3NhZ2UgLy8gbXVzdCBiZSBzYW1lIGxlbmd0aCBhcyBFeHRlbnNpb25SYW5nZXMKIAl9CiAKIAlGaWVsZCBzdHJ1Y3QgewpAQCAtMTk1LDEwICsyNDQsMTAgQEAKIAkJTDEgRmllbGRMMQogCX0KIAlGaWVsZEwxIHN0cnVjdCB7Ci0JCU9wdGlvbnMgICAgICAgICAgZnVuYygpIHByZWYuUHJvdG9NZXNzYWdlCi0JCU51bWJlciAgICAgICAgICAgcHJlZi5GaWVsZE51bWJlcgotCQlDYXJkaW5hbGl0eSAgICAgIHByZWYuQ2FyZGluYWxpdHkgLy8gbXVzdCBiZSBjb25zaXN0ZW50IHdpdGggTWVzc2FnZS5SZXF1aXJlZE51bWJlcnMKLQkJS2luZCAgICAgICAgICAgICBwcmVmLktpbmQKKwkJT3B0aW9ucyAgICAgICAgICBmdW5jKCkgcHJvdG9yZWZsZWN0LlByb3RvTWVzc2FnZQorCQlOdW1iZXIgICAgICAgICAgIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlcgorCQlDYXJkaW5hbGl0eSAgICAgIHByb3RvcmVmbGVjdC5DYXJkaW5hbGl0eSAvLyBtdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCBNZXNzYWdlLlJlcXVpcmVkTnVtYmVycworCQlLaW5kICAgICAgICAgICAgIHByb3RvcmVmbGVjdC5LaW5kCiAJCVN0cmluZ05hbWUgICAgICAgc3RyaW5nTmFtZQogCQlJc1Byb3RvM09wdGlvbmFsIGJvb2wgLy8gcHJvbW90ZWQgZnJvbSBnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8KIAkJSXNXZWFrICAgICAgICAgICBib29sIC8vIHByb21vdGVkIGZyb20gZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucwpAQCAtMjA3LDkgKzI1NiwxMSBAQAogCQlIYXNFbmZvcmNlVVRGOCAgIGJvb2wgLy8gcHJvbW90ZWQgZnJvbSBnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zCiAJCUVuZm9yY2VVVEY4ICAgICAgYm9vbCAvLyBwcm9tb3RlZCBmcm9tIGdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMKIAkJRGVmYXVsdCAgICAgICAgICBkZWZhdWx0VmFsdWUKLQkJQ29udGFpbmluZ09uZW9mICBwcmVmLk9uZW9mRGVzY3JpcHRvciAvLyBtdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCBNZXNzYWdlLk9uZW9mcy5GaWVsZHMKLQkJRW51bSAgICAgICAgICAgICBwcmVmLkVudW1EZXNjcmlwdG9yCi0JCU1lc3NhZ2UgICAgICAgICAgcHJlZi5NZXNzYWdlRGVzY3JpcHRvcgorCQlDb250YWluaW5nT25lb2YgIHByb3RvcmVmbGVjdC5PbmVvZkRlc2NyaXB0b3IgLy8gbXVzdCBiZSBjb25zaXN0ZW50IHdpdGggTWVzc2FnZS5PbmVvZnMuRmllbGRzCisJCUVudW0gICAgICAgICAgICAgcHJvdG9yZWZsZWN0LkVudW1EZXNjcmlwdG9yCisJCU1lc3NhZ2UgICAgICAgICAgcHJvdG9yZWZsZWN0Lk1lc3NhZ2VEZXNjcmlwdG9yCisKKwkJRWRpdGlvbkZlYXR1cmVzIEVkaXRpb25GZWF0dXJlcwogCX0KIAogCU9uZW9mIHN0cnVjdCB7CkBAIC0yMTcsMzUgKzI2OCwzNyBAQAogCQlMMSBPbmVvZkwxCiAJfQogCU9uZW9mTDEgc3RydWN0IHsKLQkJT3B0aW9ucyBmdW5jKCkgcHJlZi5Qcm90b01lc3NhZ2UKKwkJT3B0aW9ucyBmdW5jKCkgcHJvdG9yZWZsZWN0LlByb3RvTWVzc2FnZQogCQlGaWVsZHMgIE9uZW9mRmllbGRzIC8vIG11c3QgYmUgY29uc2lzdGVudCB3aXRoIE1lc3NhZ2UuRmllbGRzLkNvbnRhaW5pbmdPbmVvZgorCisJCUVkaXRpb25GZWF0dXJlcyBFZGl0aW9uRmVhdHVyZXMKIAl9CiApCiAKLWZ1bmMgKG1kICpNZXNzYWdlKSBPcHRpb25zKCkgcHJlZi5Qcm90b01lc3NhZ2UgeworZnVuYyAobWQgKk1lc3NhZ2UpIE9wdGlvbnMoKSBwcm90b3JlZmxlY3QuUHJvdG9NZXNzYWdlIHsKIAlpZiBmIDo9IG1kLmxhenlJbml0KCkuT3B0aW9uczsgZiAhPSBuaWwgewogCQlyZXR1cm4gZigpCiAJfQogCXJldHVybiBkZXNjb3B0cy5NZXNzYWdlCiB9Ci1mdW5jIChtZCAqTWVzc2FnZSkgSXNNYXBFbnRyeSgpIGJvb2wgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gbWQuTDEuSXNNYXBFbnRyeSB9Ci1mdW5jIChtZCAqTWVzc2FnZSkgRmllbGRzKCkgcHJlZi5GaWVsZERlc2NyaXB0b3JzICAgICAgeyByZXR1cm4gJm1kLmxhenlJbml0KCkuRmllbGRzIH0KLWZ1bmMgKG1kICpNZXNzYWdlKSBPbmVvZnMoKSBwcmVmLk9uZW9mRGVzY3JpcHRvcnMgICAgICB7IHJldHVybiAmbWQubGF6eUluaXQoKS5PbmVvZnMgfQotZnVuYyAobWQgKk1lc3NhZ2UpIFJlc2VydmVkTmFtZXMoKSBwcmVmLk5hbWVzICAgICAgICAgIHsgcmV0dXJuICZtZC5sYXp5SW5pdCgpLlJlc2VydmVkTmFtZXMgfQotZnVuYyAobWQgKk1lc3NhZ2UpIFJlc2VydmVkUmFuZ2VzKCkgcHJlZi5GaWVsZFJhbmdlcyAgIHsgcmV0dXJuICZtZC5sYXp5SW5pdCgpLlJlc2VydmVkUmFuZ2VzIH0KLWZ1bmMgKG1kICpNZXNzYWdlKSBSZXF1aXJlZE51bWJlcnMoKSBwcmVmLkZpZWxkTnVtYmVycyB7IHJldHVybiAmbWQubGF6eUluaXQoKS5SZXF1aXJlZE51bWJlcnMgfQotZnVuYyAobWQgKk1lc3NhZ2UpIEV4dGVuc2lvblJhbmdlcygpIHByZWYuRmllbGRSYW5nZXMgIHsgcmV0dXJuICZtZC5sYXp5SW5pdCgpLkV4dGVuc2lvblJhbmdlcyB9Ci1mdW5jIChtZCAqTWVzc2FnZSkgRXh0ZW5zaW9uUmFuZ2VPcHRpb25zKGkgaW50KSBwcmVmLlByb3RvTWVzc2FnZSB7CitmdW5jIChtZCAqTWVzc2FnZSkgSXNNYXBFbnRyeSgpIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBtZC5MMS5Jc01hcEVudHJ5IH0KK2Z1bmMgKG1kICpNZXNzYWdlKSBGaWVsZHMoKSBwcm90b3JlZmxlY3QuRmllbGREZXNjcmlwdG9ycyAgICAgIHsgcmV0dXJuICZtZC5sYXp5SW5pdCgpLkZpZWxkcyB9CitmdW5jIChtZCAqTWVzc2FnZSkgT25lb2ZzKCkgcHJvdG9yZWZsZWN0Lk9uZW9mRGVzY3JpcHRvcnMgICAgICB7IHJldHVybiAmbWQubGF6eUluaXQoKS5PbmVvZnMgfQorZnVuYyAobWQgKk1lc3NhZ2UpIFJlc2VydmVkTmFtZXMoKSBwcm90b3JlZmxlY3QuTmFtZXMgICAgICAgICAgeyByZXR1cm4gJm1kLmxhenlJbml0KCkuUmVzZXJ2ZWROYW1lcyB9CitmdW5jIChtZCAqTWVzc2FnZSkgUmVzZXJ2ZWRSYW5nZXMoKSBwcm90b3JlZmxlY3QuRmllbGRSYW5nZXMgICB7IHJldHVybiAmbWQubGF6eUluaXQoKS5SZXNlcnZlZFJhbmdlcyB9CitmdW5jIChtZCAqTWVzc2FnZSkgUmVxdWlyZWROdW1iZXJzKCkgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVycyB7IHJldHVybiAmbWQubGF6eUluaXQoKS5SZXF1aXJlZE51bWJlcnMgfQorZnVuYyAobWQgKk1lc3NhZ2UpIEV4dGVuc2lvblJhbmdlcygpIHByb3RvcmVmbGVjdC5GaWVsZFJhbmdlcyAgeyByZXR1cm4gJm1kLmxhenlJbml0KCkuRXh0ZW5zaW9uUmFuZ2VzIH0KK2Z1bmMgKG1kICpNZXNzYWdlKSBFeHRlbnNpb25SYW5nZU9wdGlvbnMoaSBpbnQpIHByb3RvcmVmbGVjdC5Qcm90b01lc3NhZ2UgewogCWlmIGYgOj0gbWQubGF6eUluaXQoKS5FeHRlbnNpb25SYW5nZU9wdGlvbnNbaV07IGYgIT0gbmlsIHsKIAkJcmV0dXJuIGYoKQogCX0KIAlyZXR1cm4gZGVzY29wdHMuRXh0ZW5zaW9uUmFuZ2UKIH0KLWZ1bmMgKG1kICpNZXNzYWdlKSBFbnVtcygpIHByZWYuRW51bURlc2NyaXB0b3JzICAgICAgICAgICB7IHJldHVybiAmbWQuTDEuRW51bXMgfQotZnVuYyAobWQgKk1lc3NhZ2UpIE1lc3NhZ2VzKCkgcHJlZi5NZXNzYWdlRGVzY3JpcHRvcnMgICAgIHsgcmV0dXJuICZtZC5MMS5NZXNzYWdlcyB9Ci1mdW5jIChtZCAqTWVzc2FnZSkgRXh0ZW5zaW9ucygpIHByZWYuRXh0ZW5zaW9uRGVzY3JpcHRvcnMgeyByZXR1cm4gJm1kLkwxLkV4dGVuc2lvbnMgfQotZnVuYyAobWQgKk1lc3NhZ2UpIFByb3RvVHlwZShwcmVmLk1lc3NhZ2VEZXNjcmlwdG9yKSAgICAgIHt9Ci1mdW5jIChtZCAqTWVzc2FnZSkgRm9ybWF0KHMgZm10LlN0YXRlLCByIHJ1bmUpICAgICAgICAgICAgeyBkZXNjZm10LkZvcm1hdERlc2MocywgciwgbWQpIH0KK2Z1bmMgKG1kICpNZXNzYWdlKSBFbnVtcygpIHByb3RvcmVmbGVjdC5FbnVtRGVzY3JpcHRvcnMgICAgICAgICAgIHsgcmV0dXJuICZtZC5MMS5FbnVtcyB9CitmdW5jIChtZCAqTWVzc2FnZSkgTWVzc2FnZXMoKSBwcm90b3JlZmxlY3QuTWVzc2FnZURlc2NyaXB0b3JzICAgICB7IHJldHVybiAmbWQuTDEuTWVzc2FnZXMgfQorZnVuYyAobWQgKk1lc3NhZ2UpIEV4dGVuc2lvbnMoKSBwcm90b3JlZmxlY3QuRXh0ZW5zaW9uRGVzY3JpcHRvcnMgeyByZXR1cm4gJm1kLkwxLkV4dGVuc2lvbnMgfQorZnVuYyAobWQgKk1lc3NhZ2UpIFByb3RvVHlwZShwcm90b3JlZmxlY3QuTWVzc2FnZURlc2NyaXB0b3IpICAgICAge30KK2Z1bmMgKG1kICpNZXNzYWdlKSBGb3JtYXQocyBmbXQuU3RhdGUsIHIgcnVuZSkgICAgICAgICAgICAgICAgICAgIHsgZGVzY2ZtdC5Gb3JtYXREZXNjKHMsIHIsIG1kKSB9CiBmdW5jIChtZCAqTWVzc2FnZSkgbGF6eUluaXQoKSAqTWVzc2FnZUwyIHsKIAltZC5MMC5QYXJlbnRGaWxlLmxhenlJbml0KCkgLy8gaW1wbGljaXRseSBpbml0aWFsaXplcyBMMgogCXJldHVybiBtZC5MMgpAQCAtMjYwLDcwICszMTMsODMgQEAKIAlyZXR1cm4gbWQuTDEuSXNNZXNzYWdlU2V0CiB9CiAKLWZ1bmMgKGZkICpGaWVsZCkgT3B0aW9ucygpIHByZWYuUHJvdG9NZXNzYWdlIHsKK2Z1bmMgKGZkICpGaWVsZCkgT3B0aW9ucygpIHByb3RvcmVmbGVjdC5Qcm90b01lc3NhZ2UgewogCWlmIGYgOj0gZmQuTDEuT3B0aW9uczsgZiAhPSBuaWwgewogCQlyZXR1cm4gZigpCiAJfQogCXJldHVybiBkZXNjb3B0cy5GaWVsZAogfQotZnVuYyAoZmQgKkZpZWxkKSBOdW1iZXIoKSBwcmVmLkZpZWxkTnVtYmVyICAgICAgeyByZXR1cm4gZmQuTDEuTnVtYmVyIH0KLWZ1bmMgKGZkICpGaWVsZCkgQ2FyZGluYWxpdHkoKSBwcmVmLkNhcmRpbmFsaXR5IHsgcmV0dXJuIGZkLkwxLkNhcmRpbmFsaXR5IH0KLWZ1bmMgKGZkICpGaWVsZCkgS2luZCgpIHByZWYuS2luZCAgICAgICAgICAgICAgIHsgcmV0dXJuIGZkLkwxLktpbmQgfQotZnVuYyAoZmQgKkZpZWxkKSBIYXNKU09OTmFtZSgpIGJvb2wgICAgICAgICAgICAgeyByZXR1cm4gZmQuTDEuU3RyaW5nTmFtZS5oYXNKU09OIH0KLWZ1bmMgKGZkICpGaWVsZCkgSlNPTk5hbWUoKSBzdHJpbmcgICAgICAgICAgICAgIHsgcmV0dXJuIGZkLkwxLlN0cmluZ05hbWUuZ2V0SlNPTihmZCkgfQotZnVuYyAoZmQgKkZpZWxkKSBUZXh0TmFtZSgpIHN0cmluZyAgICAgICAgICAgICAgeyByZXR1cm4gZmQuTDEuU3RyaW5nTmFtZS5nZXRUZXh0KGZkKSB9CitmdW5jIChmZCAqRmllbGQpIE51bWJlcigpIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciAgICAgIHsgcmV0dXJuIGZkLkwxLk51bWJlciB9CitmdW5jIChmZCAqRmllbGQpIENhcmRpbmFsaXR5KCkgcHJvdG9yZWZsZWN0LkNhcmRpbmFsaXR5IHsgcmV0dXJuIGZkLkwxLkNhcmRpbmFsaXR5IH0KK2Z1bmMgKGZkICpGaWVsZCkgS2luZCgpIHByb3RvcmVmbGVjdC5LaW5kIHsKKwlyZXR1cm4gZmQuTDEuS2luZAorfQorZnVuYyAoZmQgKkZpZWxkKSBIYXNKU09OTmFtZSgpIGJvb2wgeyByZXR1cm4gZmQuTDEuU3RyaW5nTmFtZS5oYXNKU09OIH0KK2Z1bmMgKGZkICpGaWVsZCkgSlNPTk5hbWUoKSBzdHJpbmcgIHsgcmV0dXJuIGZkLkwxLlN0cmluZ05hbWUuZ2V0SlNPTihmZCkgfQorZnVuYyAoZmQgKkZpZWxkKSBUZXh0TmFtZSgpIHN0cmluZyAgeyByZXR1cm4gZmQuTDEuU3RyaW5nTmFtZS5nZXRUZXh0KGZkKSB9CiBmdW5jIChmZCAqRmllbGQpIEhhc1ByZXNlbmNlKCkgYm9vbCB7Ci0JcmV0dXJuIGZkLkwxLkNhcmRpbmFsaXR5ICE9IHByZWYuUmVwZWF0ZWQgJiYgKGZkLkwwLlBhcmVudEZpbGUuTDEuU3ludGF4ID09IHByZWYuUHJvdG8yIHx8IGZkLkwxLk1lc3NhZ2UgIT0gbmlsIHx8IGZkLkwxLkNvbnRhaW5pbmdPbmVvZiAhPSBuaWwpCisJaWYgZmQuTDEuQ2FyZGluYWxpdHkgPT0gcHJvdG9yZWZsZWN0LlJlcGVhdGVkIHsKKwkJcmV0dXJuIGZhbHNlCisJfQorCWV4cGxpY2l0RmllbGRQcmVzZW5jZSA6PSBmZC5TeW50YXgoKSA9PSBwcm90b3JlZmxlY3QuRWRpdGlvbnMgJiYgZmQuTDEuRWRpdGlvbkZlYXR1cmVzLklzRmllbGRQcmVzZW5jZQorCXJldHVybiBmZC5TeW50YXgoKSA9PSBwcm90b3JlZmxlY3QuUHJvdG8yIHx8IGV4cGxpY2l0RmllbGRQcmVzZW5jZSB8fCBmZC5MMS5NZXNzYWdlICE9IG5pbCB8fCBmZC5MMS5Db250YWluaW5nT25lb2YgIT0gbmlsCiB9CiBmdW5jIChmZCAqRmllbGQpIEhhc09wdGlvbmFsS2V5d29yZCgpIGJvb2wgewotCXJldHVybiAoZmQuTDAuUGFyZW50RmlsZS5MMS5TeW50YXggPT0gcHJlZi5Qcm90bzIgJiYgZmQuTDEuQ2FyZGluYWxpdHkgPT0gcHJlZi5PcHRpb25hbCAmJiBmZC5MMS5Db250YWluaW5nT25lb2YgPT0gbmlsKSB8fCBmZC5MMS5Jc1Byb3RvM09wdGlvbmFsCisJcmV0dXJuIChmZC5MMC5QYXJlbnRGaWxlLkwxLlN5bnRheCA9PSBwcm90b3JlZmxlY3QuUHJvdG8yICYmIGZkLkwxLkNhcmRpbmFsaXR5ID09IHByb3RvcmVmbGVjdC5PcHRpb25hbCAmJiBmZC5MMS5Db250YWluaW5nT25lb2YgPT0gbmlsKSB8fCBmZC5MMS5Jc1Byb3RvM09wdGlvbmFsCiB9CiBmdW5jIChmZCAqRmllbGQpIElzUGFja2VkKCkgYm9vbCB7Ci0JaWYgIWZkLkwxLkhhc1BhY2tlZCAmJiBmZC5MMC5QYXJlbnRGaWxlLkwxLlN5bnRheCAhPSBwcmVmLlByb3RvMiAmJiBmZC5MMS5DYXJkaW5hbGl0eSA9PSBwcmVmLlJlcGVhdGVkIHsKLQkJc3dpdGNoIGZkLkwxLktpbmQgewotCQljYXNlIHByZWYuU3RyaW5nS2luZCwgcHJlZi5CeXRlc0tpbmQsIHByZWYuTWVzc2FnZUtpbmQsIHByZWYuR3JvdXBLaW5kOgotCQlkZWZhdWx0OgotCQkJcmV0dXJuIHRydWUKLQkJfQorCWlmIGZkLkwxLkNhcmRpbmFsaXR5ICE9IHByb3RvcmVmbGVjdC5SZXBlYXRlZCB7CisJCXJldHVybiBmYWxzZQorCX0KKwlzd2l0Y2ggZmQuTDEuS2luZCB7CisJY2FzZSBwcm90b3JlZmxlY3QuU3RyaW5nS2luZCwgcHJvdG9yZWZsZWN0LkJ5dGVzS2luZCwgcHJvdG9yZWZsZWN0Lk1lc3NhZ2VLaW5kLCBwcm90b3JlZmxlY3QuR3JvdXBLaW5kOgorCQlyZXR1cm4gZmFsc2UKKwl9CisJaWYgZmQuTDAuUGFyZW50RmlsZS5MMS5TeW50YXggPT0gcHJvdG9yZWZsZWN0LkVkaXRpb25zIHsKKwkJcmV0dXJuIGZkLkwxLkVkaXRpb25GZWF0dXJlcy5Jc1BhY2tlZAorCX0KKwlpZiBmZC5MMC5QYXJlbnRGaWxlLkwxLlN5bnRheCA9PSBwcm90b3JlZmxlY3QuUHJvdG8zIHsKKwkJLy8gcHJvdG8zIHJlcGVhdGVkIGZpZWxkcyBhcmUgcGFja2VkIGJ5IGRlZmF1bHQuCisJCXJldHVybiAhZmQuTDEuSGFzUGFja2VkIHx8IGZkLkwxLklzUGFja2VkCiAJfQogCXJldHVybiBmZC5MMS5Jc1BhY2tlZAogfQogZnVuYyAoZmQgKkZpZWxkKSBJc0V4dGVuc2lvbigpIGJvb2wgeyByZXR1cm4gZmFsc2UgfQogZnVuYyAoZmQgKkZpZWxkKSBJc1dlYWsoKSBib29sICAgICAgeyByZXR1cm4gZmQuTDEuSXNXZWFrIH0KLWZ1bmMgKGZkICpGaWVsZCkgSXNMaXN0KCkgYm9vbCAgICAgIHsgcmV0dXJuIGZkLkNhcmRpbmFsaXR5KCkgPT0gcHJlZi5SZXBlYXRlZCAmJiAhZmQuSXNNYXAoKSB9CitmdW5jIChmZCAqRmllbGQpIElzTGlzdCgpIGJvb2wgICAgICB7IHJldHVybiBmZC5DYXJkaW5hbGl0eSgpID09IHByb3RvcmVmbGVjdC5SZXBlYXRlZCAmJiAhZmQuSXNNYXAoKSB9CiBmdW5jIChmZCAqRmllbGQpIElzTWFwKCkgYm9vbCAgICAgICB7IHJldHVybiBmZC5NZXNzYWdlKCkgIT0gbmlsICYmIGZkLk1lc3NhZ2UoKS5Jc01hcEVudHJ5KCkgfQotZnVuYyAoZmQgKkZpZWxkKSBNYXBLZXkoKSBwcmVmLkZpZWxkRGVzY3JpcHRvciB7CitmdW5jIChmZCAqRmllbGQpIE1hcEtleSgpIHByb3RvcmVmbGVjdC5GaWVsZERlc2NyaXB0b3IgewogCWlmICFmZC5Jc01hcCgpIHsKIAkJcmV0dXJuIG5pbAogCX0KIAlyZXR1cm4gZmQuTWVzc2FnZSgpLkZpZWxkcygpLkJ5TnVtYmVyKGdlbmlkLk1hcEVudHJ5X0tleV9maWVsZF9udW1iZXIpCiB9Ci1mdW5jIChmZCAqRmllbGQpIE1hcFZhbHVlKCkgcHJlZi5GaWVsZERlc2NyaXB0b3IgeworZnVuYyAoZmQgKkZpZWxkKSBNYXBWYWx1ZSgpIHByb3RvcmVmbGVjdC5GaWVsZERlc2NyaXB0b3IgewogCWlmICFmZC5Jc01hcCgpIHsKIAkJcmV0dXJuIG5pbAogCX0KIAlyZXR1cm4gZmQuTWVzc2FnZSgpLkZpZWxkcygpLkJ5TnVtYmVyKGdlbmlkLk1hcEVudHJ5X1ZhbHVlX2ZpZWxkX251bWJlcikKIH0KLWZ1bmMgKGZkICpGaWVsZCkgSGFzRGVmYXVsdCgpIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBmZC5MMS5EZWZhdWx0LmhhcyB9Ci1mdW5jIChmZCAqRmllbGQpIERlZmF1bHQoKSBwcmVmLlZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gZmQuTDEuRGVmYXVsdC5nZXQoZmQpIH0KLWZ1bmMgKGZkICpGaWVsZCkgRGVmYXVsdEVudW1WYWx1ZSgpIHByZWYuRW51bVZhbHVlRGVzY3JpcHRvciB7IHJldHVybiBmZC5MMS5EZWZhdWx0LmVudW0gfQotZnVuYyAoZmQgKkZpZWxkKSBDb250YWluaW5nT25lb2YoKSBwcmVmLk9uZW9mRGVzY3JpcHRvciAgICAgIHsgcmV0dXJuIGZkLkwxLkNvbnRhaW5pbmdPbmVvZiB9Ci1mdW5jIChmZCAqRmllbGQpIENvbnRhaW5pbmdNZXNzYWdlKCkgcHJlZi5NZXNzYWdlRGVzY3JpcHRvciB7Ci0JcmV0dXJuIGZkLkwwLlBhcmVudC4ocHJlZi5NZXNzYWdlRGVzY3JpcHRvcikKK2Z1bmMgKGZkICpGaWVsZCkgSGFzRGVmYXVsdCgpIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZkLkwxLkRlZmF1bHQuaGFzIH0KK2Z1bmMgKGZkICpGaWVsZCkgRGVmYXVsdCgpIHByb3RvcmVmbGVjdC5WYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZkLkwxLkRlZmF1bHQuZ2V0KGZkKSB9CitmdW5jIChmZCAqRmllbGQpIERlZmF1bHRFbnVtVmFsdWUoKSBwcm90b3JlZmxlY3QuRW51bVZhbHVlRGVzY3JpcHRvciB7IHJldHVybiBmZC5MMS5EZWZhdWx0LmVudW0gfQorZnVuYyAoZmQgKkZpZWxkKSBDb250YWluaW5nT25lb2YoKSBwcm90b3JlZmxlY3QuT25lb2ZEZXNjcmlwdG9yICAgICAgeyByZXR1cm4gZmQuTDEuQ29udGFpbmluZ09uZW9mIH0KK2Z1bmMgKGZkICpGaWVsZCkgQ29udGFpbmluZ01lc3NhZ2UoKSBwcm90b3JlZmxlY3QuTWVzc2FnZURlc2NyaXB0b3IgeworCXJldHVybiBmZC5MMC5QYXJlbnQuKHByb3RvcmVmbGVjdC5NZXNzYWdlRGVzY3JpcHRvcikKIH0KLWZ1bmMgKGZkICpGaWVsZCkgRW51bSgpIHByZWYuRW51bURlc2NyaXB0b3IgeworZnVuYyAoZmQgKkZpZWxkKSBFbnVtKCkgcHJvdG9yZWZsZWN0LkVudW1EZXNjcmlwdG9yIHsKIAlyZXR1cm4gZmQuTDEuRW51bQogfQotZnVuYyAoZmQgKkZpZWxkKSBNZXNzYWdlKCkgcHJlZi5NZXNzYWdlRGVzY3JpcHRvciB7CitmdW5jIChmZCAqRmllbGQpIE1lc3NhZ2UoKSBwcm90b3JlZmxlY3QuTWVzc2FnZURlc2NyaXB0b3IgewogCWlmIGZkLkwxLklzV2VhayB7CiAJCWlmIGQsIF8gOj0gcHJvdG9yZWdpc3RyeS5HbG9iYWxGaWxlcy5GaW5kRGVzY3JpcHRvckJ5TmFtZShmZC5MMS5NZXNzYWdlLkZ1bGxOYW1lKCkpOyBkICE9IG5pbCB7Ci0JCQlyZXR1cm4gZC4ocHJlZi5NZXNzYWdlRGVzY3JpcHRvcikKKwkJCXJldHVybiBkLihwcm90b3JlZmxlY3QuTWVzc2FnZURlc2NyaXB0b3IpCiAJCX0KIAl9CiAJcmV0dXJuIGZkLkwxLk1lc3NhZ2UKIH0KLWZ1bmMgKGZkICpGaWVsZCkgRm9ybWF0KHMgZm10LlN0YXRlLCByIHJ1bmUpICAgICB7IGRlc2NmbXQuRm9ybWF0RGVzYyhzLCByLCBmZCkgfQotZnVuYyAoZmQgKkZpZWxkKSBQcm90b1R5cGUocHJlZi5GaWVsZERlc2NyaXB0b3IpIHt9CitmdW5jIChmZCAqRmllbGQpIEZvcm1hdChzIGZtdC5TdGF0ZSwgciBydW5lKSAgICAgICAgICAgICB7IGRlc2NmbXQuRm9ybWF0RGVzYyhzLCByLCBmZCkgfQorZnVuYyAoZmQgKkZpZWxkKSBQcm90b1R5cGUocHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvcikge30KIAogLy8gRW5mb3JjZVVURjggaXMgYSBwc2V1ZG8taW50ZXJuYWwgQVBJIHRvIGRldGVybWluZSB3aGV0aGVyIHRvIGVuZm9yY2UgVVRGLTgKIC8vIHZhbGlkYXRpb24gZm9yIHRoZSBzdHJpbmcgZmllbGQuIFRoaXMgZXhpc3RzIGZvciBHb29nbGUtaW50ZXJuYWwgdXNlIG9ubHkKQEAgLTMzMywyNCArMzk5LDI3IEBACiAvLyBXQVJOSU5HOiBUaGlzIG1ldGhvZCBpcyBleGVtcHQgZnJvbSB0aGUgY29tcGF0aWJpbGl0eSBwcm9taXNlIGFuZCBtYXkgYmUKIC8vIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZSB3aXRob3V0IHdhcm5pbmcuCiBmdW5jIChmZCAqRmllbGQpIEVuZm9yY2VVVEY4KCkgYm9vbCB7CisJaWYgZmQuTDAuUGFyZW50RmlsZS5MMS5TeW50YXggPT0gcHJvdG9yZWZsZWN0LkVkaXRpb25zIHsKKwkJcmV0dXJuIGZkLkwxLkVkaXRpb25GZWF0dXJlcy5Jc1VURjhWYWxpZGF0ZWQKKwl9CiAJaWYgZmQuTDEuSGFzRW5mb3JjZVVURjggewogCQlyZXR1cm4gZmQuTDEuRW5mb3JjZVVURjgKIAl9Ci0JcmV0dXJuIGZkLkwwLlBhcmVudEZpbGUuTDEuU3ludGF4ID09IHByZWYuUHJvdG8zCisJcmV0dXJuIGZkLkwwLlBhcmVudEZpbGUuTDEuU3ludGF4ID09IHByb3RvcmVmbGVjdC5Qcm90bzMKIH0KIAogZnVuYyAob2QgKk9uZW9mKSBJc1N5bnRoZXRpYygpIGJvb2wgewotCXJldHVybiBvZC5MMC5QYXJlbnRGaWxlLkwxLlN5bnRheCA9PSBwcmVmLlByb3RvMyAmJiBsZW4ob2QuTDEuRmllbGRzLkxpc3QpID09IDEgJiYgb2QuTDEuRmllbGRzLkxpc3RbMF0uSGFzT3B0aW9uYWxLZXl3b3JkKCkKKwlyZXR1cm4gb2QuTDAuUGFyZW50RmlsZS5MMS5TeW50YXggPT0gcHJvdG9yZWZsZWN0LlByb3RvMyAmJiBsZW4ob2QuTDEuRmllbGRzLkxpc3QpID09IDEgJiYgb2QuTDEuRmllbGRzLkxpc3RbMF0uSGFzT3B0aW9uYWxLZXl3b3JkKCkKIH0KLWZ1bmMgKG9kICpPbmVvZikgT3B0aW9ucygpIHByZWYuUHJvdG9NZXNzYWdlIHsKK2Z1bmMgKG9kICpPbmVvZikgT3B0aW9ucygpIHByb3RvcmVmbGVjdC5Qcm90b01lc3NhZ2UgewogCWlmIGYgOj0gb2QuTDEuT3B0aW9uczsgZiAhPSBuaWwgewogCQlyZXR1cm4gZigpCiAJfQogCXJldHVybiBkZXNjb3B0cy5PbmVvZgogfQotZnVuYyAob2QgKk9uZW9mKSBGaWVsZHMoKSBwcmVmLkZpZWxkRGVzY3JpcHRvcnMgIHsgcmV0dXJuICZvZC5MMS5GaWVsZHMgfQotZnVuYyAob2QgKk9uZW9mKSBGb3JtYXQocyBmbXQuU3RhdGUsIHIgcnVuZSkgICAgIHsgZGVzY2ZtdC5Gb3JtYXREZXNjKHMsIHIsIG9kKSB9Ci1mdW5jIChvZCAqT25lb2YpIFByb3RvVHlwZShwcmVmLk9uZW9mRGVzY3JpcHRvcikge30KK2Z1bmMgKG9kICpPbmVvZikgRmllbGRzKCkgcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvcnMgIHsgcmV0dXJuICZvZC5MMS5GaWVsZHMgfQorZnVuYyAob2QgKk9uZW9mKSBGb3JtYXQocyBmbXQuU3RhdGUsIHIgcnVuZSkgICAgICAgICAgICAgeyBkZXNjZm10LkZvcm1hdERlc2Mocywgciwgb2QpIH0KK2Z1bmMgKG9kICpPbmVvZikgUHJvdG9UeXBlKHByb3RvcmVmbGVjdC5PbmVvZkRlc2NyaXB0b3IpIHt9CiAKIHR5cGUgKAogCUV4dGVuc2lvbiBzdHJ1Y3QgewpAQCAtMzU5LDU1ICs0MjgsNTggQEAKIAkJTDIgKkV4dGVuc2lvbkwyIC8vIHByb3RlY3RlZCBieSBmaWxlRGVzYy5vbmNlCiAJfQogCUV4dGVuc2lvbkwxIHN0cnVjdCB7Ci0JCU51bWJlciAgICAgIHByZWYuRmllbGROdW1iZXIKLQkJRXh0ZW5kZWUgICAgcHJlZi5NZXNzYWdlRGVzY3JpcHRvcgotCQlDYXJkaW5hbGl0eSBwcmVmLkNhcmRpbmFsaXR5Ci0JCUtpbmQgICAgICAgIHByZWYuS2luZAorCQlOdW1iZXIgICAgICAgICAgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyCisJCUV4dGVuZGVlICAgICAgICBwcm90b3JlZmxlY3QuTWVzc2FnZURlc2NyaXB0b3IKKwkJQ2FyZGluYWxpdHkgICAgIHByb3RvcmVmbGVjdC5DYXJkaW5hbGl0eQorCQlLaW5kICAgICAgICAgICAgcHJvdG9yZWZsZWN0LktpbmQKKwkJRWRpdGlvbkZlYXR1cmVzIEVkaXRpb25GZWF0dXJlcwogCX0KIAlFeHRlbnNpb25MMiBzdHJ1Y3QgewotCQlPcHRpb25zICAgICAgICAgIGZ1bmMoKSBwcmVmLlByb3RvTWVzc2FnZQorCQlPcHRpb25zICAgICAgICAgIGZ1bmMoKSBwcm90b3JlZmxlY3QuUHJvdG9NZXNzYWdlCiAJCVN0cmluZ05hbWUgICAgICAgc3RyaW5nTmFtZQogCQlJc1Byb3RvM09wdGlvbmFsIGJvb2wgLy8gcHJvbW90ZWQgZnJvbSBnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8KIAkJSXNQYWNrZWQgICAgICAgICBib29sIC8vIHByb21vdGVkIGZyb20gZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucwogCQlEZWZhdWx0ICAgICAgICAgIGRlZmF1bHRWYWx1ZQotCQlFbnVtICAgICAgICAgICAgIHByZWYuRW51bURlc2NyaXB0b3IKLQkJTWVzc2FnZSAgICAgICAgICBwcmVmLk1lc3NhZ2VEZXNjcmlwdG9yCisJCUVudW0gICAgICAgICAgICAgcHJvdG9yZWZsZWN0LkVudW1EZXNjcmlwdG9yCisJCU1lc3NhZ2UgICAgICAgICAgcHJvdG9yZWZsZWN0Lk1lc3NhZ2VEZXNjcmlwdG9yCiAJfQogKQogCi1mdW5jICh4ZCAqRXh0ZW5zaW9uKSBPcHRpb25zKCkgcHJlZi5Qcm90b01lc3NhZ2UgeworZnVuYyAoeGQgKkV4dGVuc2lvbikgT3B0aW9ucygpIHByb3RvcmVmbGVjdC5Qcm90b01lc3NhZ2UgewogCWlmIGYgOj0geGQubGF6eUluaXQoKS5PcHRpb25zOyBmICE9IG5pbCB7CiAJCXJldHVybiBmKCkKIAl9CiAJcmV0dXJuIGRlc2NvcHRzLkZpZWxkCiB9Ci1mdW5jICh4ZCAqRXh0ZW5zaW9uKSBOdW1iZXIoKSBwcmVmLkZpZWxkTnVtYmVyICAgICAgeyByZXR1cm4geGQuTDEuTnVtYmVyIH0KLWZ1bmMgKHhkICpFeHRlbnNpb24pIENhcmRpbmFsaXR5KCkgcHJlZi5DYXJkaW5hbGl0eSB7IHJldHVybiB4ZC5MMS5DYXJkaW5hbGl0eSB9Ci1mdW5jICh4ZCAqRXh0ZW5zaW9uKSBLaW5kKCkgcHJlZi5LaW5kICAgICAgICAgICAgICAgeyByZXR1cm4geGQuTDEuS2luZCB9Ci1mdW5jICh4ZCAqRXh0ZW5zaW9uKSBIYXNKU09OTmFtZSgpIGJvb2wgICAgICAgICAgICAgeyByZXR1cm4geGQubGF6eUluaXQoKS5TdHJpbmdOYW1lLmhhc0pTT04gfQotZnVuYyAoeGQgKkV4dGVuc2lvbikgSlNPTk5hbWUoKSBzdHJpbmcgICAgICAgICAgICAgIHsgcmV0dXJuIHhkLmxhenlJbml0KCkuU3RyaW5nTmFtZS5nZXRKU09OKHhkKSB9Ci1mdW5jICh4ZCAqRXh0ZW5zaW9uKSBUZXh0TmFtZSgpIHN0cmluZyAgICAgICAgICAgICAgeyByZXR1cm4geGQubGF6eUluaXQoKS5TdHJpbmdOYW1lLmdldFRleHQoeGQpIH0KLWZ1bmMgKHhkICpFeHRlbnNpb24pIEhhc1ByZXNlbmNlKCkgYm9vbCAgICAgICAgICAgICB7IHJldHVybiB4ZC5MMS5DYXJkaW5hbGl0eSAhPSBwcmVmLlJlcGVhdGVkIH0KK2Z1bmMgKHhkICpFeHRlbnNpb24pIE51bWJlcigpIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciAgICAgIHsgcmV0dXJuIHhkLkwxLk51bWJlciB9CitmdW5jICh4ZCAqRXh0ZW5zaW9uKSBDYXJkaW5hbGl0eSgpIHByb3RvcmVmbGVjdC5DYXJkaW5hbGl0eSB7IHJldHVybiB4ZC5MMS5DYXJkaW5hbGl0eSB9CitmdW5jICh4ZCAqRXh0ZW5zaW9uKSBLaW5kKCkgcHJvdG9yZWZsZWN0LktpbmQgICAgICAgICAgICAgICB7IHJldHVybiB4ZC5MMS5LaW5kIH0KK2Z1bmMgKHhkICpFeHRlbnNpb24pIEhhc0pTT05OYW1lKCkgYm9vbCAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHhkLmxhenlJbml0KCkuU3RyaW5nTmFtZS5oYXNKU09OIH0KK2Z1bmMgKHhkICpFeHRlbnNpb24pIEpTT05OYW1lKCkgc3RyaW5nICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHhkLmxhenlJbml0KCkuU3RyaW5nTmFtZS5nZXRKU09OKHhkKSB9CitmdW5jICh4ZCAqRXh0ZW5zaW9uKSBUZXh0TmFtZSgpIHN0cmluZyAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiB4ZC5sYXp5SW5pdCgpLlN0cmluZ05hbWUuZ2V0VGV4dCh4ZCkgfQorZnVuYyAoeGQgKkV4dGVuc2lvbikgSGFzUHJlc2VuY2UoKSBib29sICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4geGQuTDEuQ2FyZGluYWxpdHkgIT0gcHJvdG9yZWZsZWN0LlJlcGVhdGVkIH0KIGZ1bmMgKHhkICpFeHRlbnNpb24pIEhhc09wdGlvbmFsS2V5d29yZCgpIGJvb2wgewotCXJldHVybiAoeGQuTDAuUGFyZW50RmlsZS5MMS5TeW50YXggPT0gcHJlZi5Qcm90bzIgJiYgeGQuTDEuQ2FyZGluYWxpdHkgPT0gcHJlZi5PcHRpb25hbCkgfHwgeGQubGF6eUluaXQoKS5Jc1Byb3RvM09wdGlvbmFsCisJcmV0dXJuICh4ZC5MMC5QYXJlbnRGaWxlLkwxLlN5bnRheCA9PSBwcm90b3JlZmxlY3QuUHJvdG8yICYmIHhkLkwxLkNhcmRpbmFsaXR5ID09IHByb3RvcmVmbGVjdC5PcHRpb25hbCkgfHwgeGQubGF6eUluaXQoKS5Jc1Byb3RvM09wdGlvbmFsCiB9Ci1mdW5jICh4ZCAqRXh0ZW5zaW9uKSBJc1BhY2tlZCgpIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHhkLmxhenlJbml0KCkuSXNQYWNrZWQgfQotZnVuYyAoeGQgKkV4dGVuc2lvbikgSXNFeHRlbnNpb24oKSBib29sICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiB0cnVlIH0KLWZ1bmMgKHhkICpFeHRlbnNpb24pIElzV2VhaygpIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gZmFsc2UgfQotZnVuYyAoeGQgKkV4dGVuc2lvbikgSXNMaXN0KCkgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiB4ZC5DYXJkaW5hbGl0eSgpID09IHByZWYuUmVwZWF0ZWQgfQotZnVuYyAoeGQgKkV4dGVuc2lvbikgSXNNYXAoKSBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBmYWxzZSB9Ci1mdW5jICh4ZCAqRXh0ZW5zaW9uKSBNYXBLZXkoKSBwcmVmLkZpZWxkRGVzY3JpcHRvciAgICAgICAgICAgICAgIHsgcmV0dXJuIG5pbCB9Ci1mdW5jICh4ZCAqRXh0ZW5zaW9uKSBNYXBWYWx1ZSgpIHByZWYuRmllbGREZXNjcmlwdG9yICAgICAgICAgICAgIHsgcmV0dXJuIG5pbCB9Ci1mdW5jICh4ZCAqRXh0ZW5zaW9uKSBIYXNEZWZhdWx0KCkgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHhkLmxhenlJbml0KCkuRGVmYXVsdC5oYXMgfQotZnVuYyAoeGQgKkV4dGVuc2lvbikgRGVmYXVsdCgpIHByZWYuVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiB4ZC5sYXp5SW5pdCgpLkRlZmF1bHQuZ2V0KHhkKSB9Ci1mdW5jICh4ZCAqRXh0ZW5zaW9uKSBEZWZhdWx0RW51bVZhbHVlKCkgcHJlZi5FbnVtVmFsdWVEZXNjcmlwdG9yIHsgcmV0dXJuIHhkLmxhenlJbml0KCkuRGVmYXVsdC5lbnVtIH0KLWZ1bmMgKHhkICpFeHRlbnNpb24pIENvbnRhaW5pbmdPbmVvZigpIHByZWYuT25lb2ZEZXNjcmlwdG9yICAgICAgeyByZXR1cm4gbmlsIH0KLWZ1bmMgKHhkICpFeHRlbnNpb24pIENvbnRhaW5pbmdNZXNzYWdlKCkgcHJlZi5NZXNzYWdlRGVzY3JpcHRvciAgeyByZXR1cm4geGQuTDEuRXh0ZW5kZWUgfQotZnVuYyAoeGQgKkV4dGVuc2lvbikgRW51bSgpIHByZWYuRW51bURlc2NyaXB0b3IgICAgICAgICAgICAgICAgICB7IHJldHVybiB4ZC5sYXp5SW5pdCgpLkVudW0gfQotZnVuYyAoeGQgKkV4dGVuc2lvbikgTWVzc2FnZSgpIHByZWYuTWVzc2FnZURlc2NyaXB0b3IgICAgICAgICAgICB7IHJldHVybiB4ZC5sYXp5SW5pdCgpLk1lc3NhZ2UgfQotZnVuYyAoeGQgKkV4dGVuc2lvbikgRm9ybWF0KHMgZm10LlN0YXRlLCByIHJ1bmUpICAgICAgICAgICAgICAgICB7IGRlc2NmbXQuRm9ybWF0RGVzYyhzLCByLCB4ZCkgfQotZnVuYyAoeGQgKkV4dGVuc2lvbikgUHJvdG9UeXBlKHByZWYuRmllbGREZXNjcmlwdG9yKSAgICAgICAgICAgICB7fQotZnVuYyAoeGQgKkV4dGVuc2lvbikgUHJvdG9JbnRlcm5hbChwcmFnbWEuRG9Ob3RJbXBsZW1lbnQpICAgICAgICB7fQorZnVuYyAoeGQgKkV4dGVuc2lvbikgSXNQYWNrZWQoKSBib29sICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHhkLmxhenlJbml0KCkuSXNQYWNrZWQgfQorZnVuYyAoeGQgKkV4dGVuc2lvbikgSXNFeHRlbnNpb24oKSBib29sICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRydWUgfQorZnVuYyAoeGQgKkV4dGVuc2lvbikgSXNXZWFrKCkgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZhbHNlIH0KK2Z1bmMgKHhkICpFeHRlbnNpb24pIElzTGlzdCgpIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiB4ZC5DYXJkaW5hbGl0eSgpID09IHByb3RvcmVmbGVjdC5SZXBlYXRlZCB9CitmdW5jICh4ZCAqRXh0ZW5zaW9uKSBJc01hcCgpIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gZmFsc2UgfQorZnVuYyAoeGQgKkV4dGVuc2lvbikgTWFwS2V5KCkgcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvciAgIHsgcmV0dXJuIG5pbCB9CitmdW5jICh4ZCAqRXh0ZW5zaW9uKSBNYXBWYWx1ZSgpIHByb3RvcmVmbGVjdC5GaWVsZERlc2NyaXB0b3IgeyByZXR1cm4gbmlsIH0KK2Z1bmMgKHhkICpFeHRlbnNpb24pIEhhc0RlZmF1bHQoKSBib29sICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiB4ZC5sYXp5SW5pdCgpLkRlZmF1bHQuaGFzIH0KK2Z1bmMgKHhkICpFeHRlbnNpb24pIERlZmF1bHQoKSBwcm90b3JlZmxlY3QuVmFsdWUgICAgICAgICAgICB7IHJldHVybiB4ZC5sYXp5SW5pdCgpLkRlZmF1bHQuZ2V0KHhkKSB9CitmdW5jICh4ZCAqRXh0ZW5zaW9uKSBEZWZhdWx0RW51bVZhbHVlKCkgcHJvdG9yZWZsZWN0LkVudW1WYWx1ZURlc2NyaXB0b3IgeworCXJldHVybiB4ZC5sYXp5SW5pdCgpLkRlZmF1bHQuZW51bQorfQorZnVuYyAoeGQgKkV4dGVuc2lvbikgQ29udGFpbmluZ09uZW9mKCkgcHJvdG9yZWZsZWN0Lk9uZW9mRGVzY3JpcHRvciAgICAgeyByZXR1cm4gbmlsIH0KK2Z1bmMgKHhkICpFeHRlbnNpb24pIENvbnRhaW5pbmdNZXNzYWdlKCkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2VEZXNjcmlwdG9yIHsgcmV0dXJuIHhkLkwxLkV4dGVuZGVlIH0KK2Z1bmMgKHhkICpFeHRlbnNpb24pIEVudW0oKSBwcm90b3JlZmxlY3QuRW51bURlc2NyaXB0b3IgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHhkLmxhenlJbml0KCkuRW51bSB9CitmdW5jICh4ZCAqRXh0ZW5zaW9uKSBNZXNzYWdlKCkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2VEZXNjcmlwdG9yICAgICAgICAgICB7IHJldHVybiB4ZC5sYXp5SW5pdCgpLk1lc3NhZ2UgfQorZnVuYyAoeGQgKkV4dGVuc2lvbikgRm9ybWF0KHMgZm10LlN0YXRlLCByIHJ1bmUpICAgICAgICAgICAgICAgICAgICAgICAgeyBkZXNjZm10LkZvcm1hdERlc2MocywgciwgeGQpIH0KK2Z1bmMgKHhkICpFeHRlbnNpb24pIFByb3RvVHlwZShwcm90b3JlZmxlY3QuRmllbGREZXNjcmlwdG9yKSAgICAgICAgICAgIHt9CitmdW5jICh4ZCAqRXh0ZW5zaW9uKSBQcm90b0ludGVybmFsKHByYWdtYS5Eb05vdEltcGxlbWVudCkgICAgICAgICAgICAgICB7fQogZnVuYyAoeGQgKkV4dGVuc2lvbikgbGF6eUluaXQoKSAqRXh0ZW5zaW9uTDIgewogCXhkLkwwLlBhcmVudEZpbGUubGF6eUluaXQoKSAvLyBpbXBsaWNpdGx5IGluaXRpYWxpemVzIEwyCiAJcmV0dXJuIHhkLkwyCkBAIC00MjEsNyArNDkzLDcgQEAKIAl9CiAJU2VydmljZUwxIHN0cnVjdHt9CiAJU2VydmljZUwyIHN0cnVjdCB7Ci0JCU9wdGlvbnMgZnVuYygpIHByZWYuUHJvdG9NZXNzYWdlCisJCU9wdGlvbnMgZnVuYygpIHByb3RvcmVmbGVjdC5Qcm90b01lc3NhZ2UKIAkJTWV0aG9kcyBNZXRob2RzCiAJfQogCkBAIC00MzAsNDggKzUwMiw0OCBAQAogCQlMMSBNZXRob2RMMQogCX0KIAlNZXRob2RMMSBzdHJ1Y3QgewotCQlPcHRpb25zICAgICAgICAgICBmdW5jKCkgcHJlZi5Qcm90b01lc3NhZ2UKLQkJSW5wdXQgICAgICAgICAgICAgcHJlZi5NZXNzYWdlRGVzY3JpcHRvcgotCQlPdXRwdXQgICAgICAgICAgICBwcmVmLk1lc3NhZ2VEZXNjcmlwdG9yCisJCU9wdGlvbnMgICAgICAgICAgIGZ1bmMoKSBwcm90b3JlZmxlY3QuUHJvdG9NZXNzYWdlCisJCUlucHV0ICAgICAgICAgICAgIHByb3RvcmVmbGVjdC5NZXNzYWdlRGVzY3JpcHRvcgorCQlPdXRwdXQgICAgICAgICAgICBwcm90b3JlZmxlY3QuTWVzc2FnZURlc2NyaXB0b3IKIAkJSXNTdHJlYW1pbmdDbGllbnQgYm9vbAogCQlJc1N0cmVhbWluZ1NlcnZlciBib29sCiAJfQogKQogCi1mdW5jIChzZCAqU2VydmljZSkgT3B0aW9ucygpIHByZWYuUHJvdG9NZXNzYWdlIHsKK2Z1bmMgKHNkICpTZXJ2aWNlKSBPcHRpb25zKCkgcHJvdG9yZWZsZWN0LlByb3RvTWVzc2FnZSB7CiAJaWYgZiA6PSBzZC5sYXp5SW5pdCgpLk9wdGlvbnM7IGYgIT0gbmlsIHsKIAkJcmV0dXJuIGYoKQogCX0KIAlyZXR1cm4gZGVzY29wdHMuU2VydmljZQogfQotZnVuYyAoc2QgKlNlcnZpY2UpIE1ldGhvZHMoKSBwcmVmLk1ldGhvZERlc2NyaXB0b3JzICAgICB7IHJldHVybiAmc2QubGF6eUluaXQoKS5NZXRob2RzIH0KLWZ1bmMgKHNkICpTZXJ2aWNlKSBGb3JtYXQocyBmbXQuU3RhdGUsIHIgcnVuZSkgICAgICAgICAgeyBkZXNjZm10LkZvcm1hdERlc2Mocywgciwgc2QpIH0KLWZ1bmMgKHNkICpTZXJ2aWNlKSBQcm90b1R5cGUocHJlZi5TZXJ2aWNlRGVzY3JpcHRvcikgICAge30KLWZ1bmMgKHNkICpTZXJ2aWNlKSBQcm90b0ludGVybmFsKHByYWdtYS5Eb05vdEltcGxlbWVudCkge30KK2Z1bmMgKHNkICpTZXJ2aWNlKSBNZXRob2RzKCkgcHJvdG9yZWZsZWN0Lk1ldGhvZERlc2NyaXB0b3JzICB7IHJldHVybiAmc2QubGF6eUluaXQoKS5NZXRob2RzIH0KK2Z1bmMgKHNkICpTZXJ2aWNlKSBGb3JtYXQocyBmbXQuU3RhdGUsIHIgcnVuZSkgICAgICAgICAgICAgICB7IGRlc2NmbXQuRm9ybWF0RGVzYyhzLCByLCBzZCkgfQorZnVuYyAoc2QgKlNlcnZpY2UpIFByb3RvVHlwZShwcm90b3JlZmxlY3QuU2VydmljZURlc2NyaXB0b3IpIHt9CitmdW5jIChzZCAqU2VydmljZSkgUHJvdG9JbnRlcm5hbChwcmFnbWEuRG9Ob3RJbXBsZW1lbnQpICAgICAge30KIGZ1bmMgKHNkICpTZXJ2aWNlKSBsYXp5SW5pdCgpICpTZXJ2aWNlTDIgewogCXNkLkwwLlBhcmVudEZpbGUubGF6eUluaXQoKSAvLyBpbXBsaWNpdGx5IGluaXRpYWxpemVzIEwyCiAJcmV0dXJuIHNkLkwyCiB9CiAKLWZ1bmMgKG1kICpNZXRob2QpIE9wdGlvbnMoKSBwcmVmLlByb3RvTWVzc2FnZSB7CitmdW5jIChtZCAqTWV0aG9kKSBPcHRpb25zKCkgcHJvdG9yZWZsZWN0LlByb3RvTWVzc2FnZSB7CiAJaWYgZiA6PSBtZC5MMS5PcHRpb25zOyBmICE9IG5pbCB7CiAJCXJldHVybiBmKCkKIAl9CiAJcmV0dXJuIGRlc2NvcHRzLk1ldGhvZAogfQotZnVuYyAobWQgKk1ldGhvZCkgSW5wdXQoKSBwcmVmLk1lc3NhZ2VEZXNjcmlwdG9yICAgICAgIHsgcmV0dXJuIG1kLkwxLklucHV0IH0KLWZ1bmMgKG1kICpNZXRob2QpIE91dHB1dCgpIHByZWYuTWVzc2FnZURlc2NyaXB0b3IgICAgICB7IHJldHVybiBtZC5MMS5PdXRwdXQgfQotZnVuYyAobWQgKk1ldGhvZCkgSXNTdHJlYW1pbmdDbGllbnQoKSBib29sICAgICAgICAgICAgIHsgcmV0dXJuIG1kLkwxLklzU3RyZWFtaW5nQ2xpZW50IH0KLWZ1bmMgKG1kICpNZXRob2QpIElzU3RyZWFtaW5nU2VydmVyKCkgYm9vbCAgICAgICAgICAgICB7IHJldHVybiBtZC5MMS5Jc1N0cmVhbWluZ1NlcnZlciB9Ci1mdW5jIChtZCAqTWV0aG9kKSBGb3JtYXQocyBmbXQuU3RhdGUsIHIgcnVuZSkgICAgICAgICAgeyBkZXNjZm10LkZvcm1hdERlc2MocywgciwgbWQpIH0KLWZ1bmMgKG1kICpNZXRob2QpIFByb3RvVHlwZShwcmVmLk1ldGhvZERlc2NyaXB0b3IpICAgICB7fQotZnVuYyAobWQgKk1ldGhvZCkgUHJvdG9JbnRlcm5hbChwcmFnbWEuRG9Ob3RJbXBsZW1lbnQpIHt9CitmdW5jIChtZCAqTWV0aG9kKSBJbnB1dCgpIHByb3RvcmVmbGVjdC5NZXNzYWdlRGVzY3JpcHRvciAgIHsgcmV0dXJuIG1kLkwxLklucHV0IH0KK2Z1bmMgKG1kICpNZXRob2QpIE91dHB1dCgpIHByb3RvcmVmbGVjdC5NZXNzYWdlRGVzY3JpcHRvciAgeyByZXR1cm4gbWQuTDEuT3V0cHV0IH0KK2Z1bmMgKG1kICpNZXRob2QpIElzU3RyZWFtaW5nQ2xpZW50KCkgYm9vbCAgICAgICAgICAgICAgICAgeyByZXR1cm4gbWQuTDEuSXNTdHJlYW1pbmdDbGllbnQgfQorZnVuYyAobWQgKk1ldGhvZCkgSXNTdHJlYW1pbmdTZXJ2ZXIoKSBib29sICAgICAgICAgICAgICAgICB7IHJldHVybiBtZC5MMS5Jc1N0cmVhbWluZ1NlcnZlciB9CitmdW5jIChtZCAqTWV0aG9kKSBGb3JtYXQocyBmbXQuU3RhdGUsIHIgcnVuZSkgICAgICAgICAgICAgIHsgZGVzY2ZtdC5Gb3JtYXREZXNjKHMsIHIsIG1kKSB9CitmdW5jIChtZCAqTWV0aG9kKSBQcm90b1R5cGUocHJvdG9yZWZsZWN0Lk1ldGhvZERlc2NyaXB0b3IpIHt9CitmdW5jIChtZCAqTWV0aG9kKSBQcm90b0ludGVybmFsKHByYWdtYS5Eb05vdEltcGxlbWVudCkgICAgIHt9CiAKIC8vIFN1cnJvZ2F0ZSBmaWxlcyBhcmUgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIHN0YW5kYWxvbmUgZGVzY3JpcHRvcnMKIC8vIHdoZXJlIHRoZSBzeW50YXggaXMgb25seSBpbmZvcm1hdGlvbiBkZXJpdmVkIGZyb20gdGhlIHBhcmVudCBmaWxlLgogdmFyICgKLQlTdXJyb2dhdGVQcm90bzIgPSAmRmlsZXtMMTogRmlsZUwxe1N5bnRheDogcHJlZi5Qcm90bzJ9LCBMMjogJkZpbGVMMnt9fQotCVN1cnJvZ2F0ZVByb3RvMyA9ICZGaWxle0wxOiBGaWxlTDF7U3ludGF4OiBwcmVmLlByb3RvM30sIEwyOiAmRmlsZUwye319CisJU3Vycm9nYXRlUHJvdG8yID0gJkZpbGV7TDE6IEZpbGVMMXtTeW50YXg6IHByb3RvcmVmbGVjdC5Qcm90bzJ9LCBMMjogJkZpbGVMMnt9fQorCVN1cnJvZ2F0ZVByb3RvMyA9ICZGaWxle0wxOiBGaWxlTDF7U3ludGF4OiBwcm90b3JlZmxlY3QuUHJvdG8zfSwgTDI6ICZGaWxlTDJ7fX0KICkKIAogdHlwZSAoCkBAIC00NzksMjQgKzU1MSwyNCBAQAogCQlMMCBCYXNlTDAKIAl9CiAJQmFzZUwwIHN0cnVjdCB7Ci0JCUZ1bGxOYW1lICAgcHJlZi5GdWxsTmFtZSAvLyBtdXN0IGJlIHBvcHVsYXRlZAotCQlQYXJlbnRGaWxlICpGaWxlICAgICAgICAgLy8gbXVzdCBiZSBwb3B1bGF0ZWQKLQkJUGFyZW50ICAgICBwcmVmLkRlc2NyaXB0b3IKKwkJRnVsbE5hbWUgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgLy8gbXVzdCBiZSBwb3B1bGF0ZWQKKwkJUGFyZW50RmlsZSAqRmlsZSAgICAgICAgICAgICAgICAgLy8gbXVzdCBiZSBwb3B1bGF0ZWQKKwkJUGFyZW50ICAgICBwcm90b3JlZmxlY3QuRGVzY3JpcHRvcgogCQlJbmRleCAgICAgIGludAogCX0KICkKIAotZnVuYyAoZCAqQmFzZSkgTmFtZSgpIHByZWYuTmFtZSAgICAgICAgIHsgcmV0dXJuIGQuTDAuRnVsbE5hbWUuTmFtZSgpIH0KLWZ1bmMgKGQgKkJhc2UpIEZ1bGxOYW1lKCkgcHJlZi5GdWxsTmFtZSB7IHJldHVybiBkLkwwLkZ1bGxOYW1lIH0KLWZ1bmMgKGQgKkJhc2UpIFBhcmVudEZpbGUoKSBwcmVmLkZpbGVEZXNjcmlwdG9yIHsKK2Z1bmMgKGQgKkJhc2UpIE5hbWUoKSBwcm90b3JlZmxlY3QuTmFtZSAgICAgICAgIHsgcmV0dXJuIGQuTDAuRnVsbE5hbWUuTmFtZSgpIH0KK2Z1bmMgKGQgKkJhc2UpIEZ1bGxOYW1lKCkgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lIHsgcmV0dXJuIGQuTDAuRnVsbE5hbWUgfQorZnVuYyAoZCAqQmFzZSkgUGFyZW50RmlsZSgpIHByb3RvcmVmbGVjdC5GaWxlRGVzY3JpcHRvciB7CiAJaWYgZC5MMC5QYXJlbnRGaWxlID09IFN1cnJvZ2F0ZVByb3RvMiB8fCBkLkwwLlBhcmVudEZpbGUgPT0gU3Vycm9nYXRlUHJvdG8zIHsKIAkJcmV0dXJuIG5pbCAvLyBzdXJyb2dhdGUgZmlsZXMgYXJlIG5vdCByZWFsIHBhcmVudHMKIAl9CiAJcmV0dXJuIGQuTDAuUGFyZW50RmlsZQogfQotZnVuYyAoZCAqQmFzZSkgUGFyZW50KCkgcHJlZi5EZXNjcmlwdG9yICAgICAgICAgICAgIHsgcmV0dXJuIGQuTDAuUGFyZW50IH0KK2Z1bmMgKGQgKkJhc2UpIFBhcmVudCgpIHByb3RvcmVmbGVjdC5EZXNjcmlwdG9yICAgICB7IHJldHVybiBkLkwwLlBhcmVudCB9CiBmdW5jIChkICpCYXNlKSBJbmRleCgpIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gZC5MMC5JbmRleCB9Ci1mdW5jIChkICpCYXNlKSBTeW50YXgoKSBwcmVmLlN5bnRheCAgICAgICAgICAgICAgICAgeyByZXR1cm4gZC5MMC5QYXJlbnRGaWxlLlN5bnRheCgpIH0KK2Z1bmMgKGQgKkJhc2UpIFN5bnRheCgpIHByb3RvcmVmbGVjdC5TeW50YXggICAgICAgICB7IHJldHVybiBkLkwwLlBhcmVudEZpbGUuU3ludGF4KCkgfQogZnVuYyAoZCAqQmFzZSkgSXNQbGFjZWhvbGRlcigpIGJvb2wgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZhbHNlIH0KIGZ1bmMgKGQgKkJhc2UpIFByb3RvSW50ZXJuYWwocHJhZ21hLkRvTm90SW1wbGVtZW50KSB7fQogCkBAIC01MTMsNyArNTg1LDcgQEAKIAlzLm5hbWVKU09OID0gbmFtZQogfQogCi1mdW5jIChzICpzdHJpbmdOYW1lKSBsYXp5SW5pdChmZCBwcmVmLkZpZWxkRGVzY3JpcHRvcikgKnN0cmluZ05hbWUgeworZnVuYyAocyAqc3RyaW5nTmFtZSkgbGF6eUluaXQoZmQgcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvcikgKnN0cmluZ05hbWUgewogCXMub25jZS5EbyhmdW5jKCkgewogCQlpZiBmZC5Jc0V4dGVuc2lvbigpIHsKIAkJCS8vIEZvciBleHRlbnNpb25zLCBKU09OIGFuZCB0ZXh0IGFyZSBmb3JtYXR0ZWQgdGhlIHNhbWUgd2F5LgpAQCAtNTMzLDcgKzYwNSw3IEBACiAKIAkJCS8vIEZvcm1hdCB0aGUgdGV4dCBuYW1lLgogCQkJcy5uYW1lVGV4dCA9IHN0cmluZyhmZC5OYW1lKCkpCi0JCQlpZiBmZC5LaW5kKCkgPT0gcHJlZi5Hcm91cEtpbmQgeworCQkJaWYgZmQuS2luZCgpID09IHByb3RvcmVmbGVjdC5Hcm91cEtpbmQgewogCQkJCXMubmFtZVRleHQgPSBzdHJpbmcoZmQuTWVzc2FnZSgpLk5hbWUoKSkKIAkJCX0KIAkJfQpAQCAtNTQxLDEwICs2MTMsMTAgQEAKIAlyZXR1cm4gcwogfQogCi1mdW5jIChzICpzdHJpbmdOYW1lKSBnZXRKU09OKGZkIHByZWYuRmllbGREZXNjcmlwdG9yKSBzdHJpbmcgeyByZXR1cm4gcy5sYXp5SW5pdChmZCkubmFtZUpTT04gfQotZnVuYyAocyAqc3RyaW5nTmFtZSkgZ2V0VGV4dChmZCBwcmVmLkZpZWxkRGVzY3JpcHRvcikgc3RyaW5nIHsgcmV0dXJuIHMubGF6eUluaXQoZmQpLm5hbWVUZXh0IH0KK2Z1bmMgKHMgKnN0cmluZ05hbWUpIGdldEpTT04oZmQgcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvcikgc3RyaW5nIHsgcmV0dXJuIHMubGF6eUluaXQoZmQpLm5hbWVKU09OIH0KK2Z1bmMgKHMgKnN0cmluZ05hbWUpIGdldFRleHQoZmQgcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvcikgc3RyaW5nIHsgcmV0dXJuIHMubGF6eUluaXQoZmQpLm5hbWVUZXh0IH0KIAotZnVuYyBEZWZhdWx0VmFsdWUodiBwcmVmLlZhbHVlLCBldiBwcmVmLkVudW1WYWx1ZURlc2NyaXB0b3IpIGRlZmF1bHRWYWx1ZSB7CitmdW5jIERlZmF1bHRWYWx1ZSh2IHByb3RvcmVmbGVjdC5WYWx1ZSwgZXYgcHJvdG9yZWZsZWN0LkVudW1WYWx1ZURlc2NyaXB0b3IpIGRlZmF1bHRWYWx1ZSB7CiAJZHYgOj0gZGVmYXVsdFZhbHVle2hhczogdi5Jc1ZhbGlkKCksIHZhbDogdiwgZW51bTogZXZ9CiAJaWYgYiwgb2sgOj0gdi5JbnRlcmZhY2UoKS4oW11ieXRlKTsgb2sgewogCQkvLyBTdG9yZSBhIGNvcHkgb2YgdGhlIGRlZmF1bHQgYnl0ZXMsIHNvIHRoYXQgd2UgY2FuIGRldGVjdApAQCAtNTU0LDkgKzYyNiw5IEBACiAJcmV0dXJuIGR2CiB9CiAKLWZ1bmMgdW5tYXJzaGFsRGVmYXVsdChiIFtdYnl0ZSwgayBwcmVmLktpbmQsIHBmICpGaWxlLCBlZCBwcmVmLkVudW1EZXNjcmlwdG9yKSBkZWZhdWx0VmFsdWUgewotCXZhciBldnMgcHJlZi5FbnVtVmFsdWVEZXNjcmlwdG9ycwotCWlmIGsgPT0gcHJlZi5FbnVtS2luZCB7CitmdW5jIHVubWFyc2hhbERlZmF1bHQoYiBbXWJ5dGUsIGsgcHJvdG9yZWZsZWN0LktpbmQsIHBmICpGaWxlLCBlZCBwcm90b3JlZmxlY3QuRW51bURlc2NyaXB0b3IpIGRlZmF1bHRWYWx1ZSB7CisJdmFyIGV2cyBwcm90b3JlZmxlY3QuRW51bVZhbHVlRGVzY3JpcHRvcnMKKwlpZiBrID09IHByb3RvcmVmbGVjdC5FbnVtS2luZCB7CiAJCS8vIElmIHRoZSBlbnVtIGlzIGRlY2xhcmVkIHdpdGhpbiB0aGUgc2FtZSBmaWxlLCBiZSBjYXJlZnVsIG5vdCB0bwogCQkvLyBibGluZGx5IGNhbGwgdGhlIFZhbHVlcyBtZXRob2QsIGxlc3Qgd2UgYmluZCBvdXJzZWx2ZXMgaW4gYSBkZWFkbG9jay4KIAkJaWYgZSwgb2sgOj0gZWQuKCpFbnVtKTsgb2sgJiYgZS5MMC5QYXJlbnRGaWxlID09IHBmIHsKQEAgLTU2Nyw5ICs2MzksOSBAQAogCiAJCS8vIElmIHdlIGFyZSB1bmFibGUgdG8gcmVzb2x2ZSB0aGUgZW51bSBkZXBlbmRlbmN5LCB1c2UgYSBwbGFjZWhvbGRlcgogCQkvLyBlbnVtIHZhbHVlIHNpbmNlIHdlIHdpbGwgbm90IGJlIGFibGUgdG8gcGFyc2UgdGhlIGRlZmF1bHQgdmFsdWUuCi0JCWlmIGVkLklzUGxhY2Vob2xkZXIoKSAmJiBwcmVmLk5hbWUoYikuSXNWYWxpZCgpIHsKLQkJCXYgOj0gcHJlZi5WYWx1ZU9mRW51bSgwKQotCQkJZXYgOj0gUGxhY2Vob2xkZXJFbnVtVmFsdWUoZWQuRnVsbE5hbWUoKS5QYXJlbnQoKS5BcHBlbmQocHJlZi5OYW1lKGIpKSkKKwkJaWYgZWQuSXNQbGFjZWhvbGRlcigpICYmIHByb3RvcmVmbGVjdC5OYW1lKGIpLklzVmFsaWQoKSB7CisJCQl2IDo9IHByb3RvcmVmbGVjdC5WYWx1ZU9mRW51bSgwKQorCQkJZXYgOj0gUGxhY2Vob2xkZXJFbnVtVmFsdWUoZWQuRnVsbE5hbWUoKS5QYXJlbnQoKS5BcHBlbmQocHJvdG9yZWZsZWN0Lk5hbWUoYikpKQogCQkJcmV0dXJuIERlZmF1bHRWYWx1ZSh2LCBldikKIAkJfQogCX0KQEAgLTU4Myw0MSArNjU1LDQxIEBACiAKIHR5cGUgZGVmYXVsdFZhbHVlIHN0cnVjdCB7CiAJaGFzICAgYm9vbAotCXZhbCAgIHByZWYuVmFsdWUKLQllbnVtICBwcmVmLkVudW1WYWx1ZURlc2NyaXB0b3IKKwl2YWwgICBwcm90b3JlZmxlY3QuVmFsdWUKKwllbnVtICBwcm90b3JlZmxlY3QuRW51bVZhbHVlRGVzY3JpcHRvcgogCWJ5dGVzIFtdYnl0ZQogfQogCi1mdW5jIChkdiAqZGVmYXVsdFZhbHVlKSBnZXQoZmQgcHJlZi5GaWVsZERlc2NyaXB0b3IpIHByZWYuVmFsdWUgeworZnVuYyAoZHYgKmRlZmF1bHRWYWx1ZSkgZ2V0KGZkIHByb3RvcmVmbGVjdC5GaWVsZERlc2NyaXB0b3IpIHByb3RvcmVmbGVjdC5WYWx1ZSB7CiAJLy8gUmV0dXJuIHRoZSB6ZXJvIHZhbHVlIGFzIHRoZSBkZWZhdWx0IGlmIHVucG9wdWxhdGVkLgogCWlmICFkdi5oYXMgewotCQlpZiBmZC5DYXJkaW5hbGl0eSgpID09IHByZWYuUmVwZWF0ZWQgewotCQkJcmV0dXJuIHByZWYuVmFsdWV7fQorCQlpZiBmZC5DYXJkaW5hbGl0eSgpID09IHByb3RvcmVmbGVjdC5SZXBlYXRlZCB7CisJCQlyZXR1cm4gcHJvdG9yZWZsZWN0LlZhbHVle30KIAkJfQogCQlzd2l0Y2ggZmQuS2luZCgpIHsKLQkJY2FzZSBwcmVmLkJvb2xLaW5kOgotCQkJcmV0dXJuIHByZWYuVmFsdWVPZkJvb2woZmFsc2UpCi0JCWNhc2UgcHJlZi5JbnQzMktpbmQsIHByZWYuU2ludDMyS2luZCwgcHJlZi5TZml4ZWQzMktpbmQ6Ci0JCQlyZXR1cm4gcHJlZi5WYWx1ZU9mSW50MzIoMCkKLQkJY2FzZSBwcmVmLkludDY0S2luZCwgcHJlZi5TaW50NjRLaW5kLCBwcmVmLlNmaXhlZDY0S2luZDoKLQkJCXJldHVybiBwcmVmLlZhbHVlT2ZJbnQ2NCgwKQotCQljYXNlIHByZWYuVWludDMyS2luZCwgcHJlZi5GaXhlZDMyS2luZDoKLQkJCXJldHVybiBwcmVmLlZhbHVlT2ZVaW50MzIoMCkKLQkJY2FzZSBwcmVmLlVpbnQ2NEtpbmQsIHByZWYuRml4ZWQ2NEtpbmQ6Ci0JCQlyZXR1cm4gcHJlZi5WYWx1ZU9mVWludDY0KDApCi0JCWNhc2UgcHJlZi5GbG9hdEtpbmQ6Ci0JCQlyZXR1cm4gcHJlZi5WYWx1ZU9mRmxvYXQzMigwKQotCQljYXNlIHByZWYuRG91YmxlS2luZDoKLQkJCXJldHVybiBwcmVmLlZhbHVlT2ZGbG9hdDY0KDApCi0JCWNhc2UgcHJlZi5TdHJpbmdLaW5kOgotCQkJcmV0dXJuIHByZWYuVmFsdWVPZlN0cmluZygiIikKLQkJY2FzZSBwcmVmLkJ5dGVzS2luZDoKLQkJCXJldHVybiBwcmVmLlZhbHVlT2ZCeXRlcyhuaWwpCi0JCWNhc2UgcHJlZi5FbnVtS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuQm9vbEtpbmQ6CisJCQlyZXR1cm4gcHJvdG9yZWZsZWN0LlZhbHVlT2ZCb29sKGZhbHNlKQorCQljYXNlIHByb3RvcmVmbGVjdC5JbnQzMktpbmQsIHByb3RvcmVmbGVjdC5TaW50MzJLaW5kLCBwcm90b3JlZmxlY3QuU2ZpeGVkMzJLaW5kOgorCQkJcmV0dXJuIHByb3RvcmVmbGVjdC5WYWx1ZU9mSW50MzIoMCkKKwkJY2FzZSBwcm90b3JlZmxlY3QuSW50NjRLaW5kLCBwcm90b3JlZmxlY3QuU2ludDY0S2luZCwgcHJvdG9yZWZsZWN0LlNmaXhlZDY0S2luZDoKKwkJCXJldHVybiBwcm90b3JlZmxlY3QuVmFsdWVPZkludDY0KDApCisJCWNhc2UgcHJvdG9yZWZsZWN0LlVpbnQzMktpbmQsIHByb3RvcmVmbGVjdC5GaXhlZDMyS2luZDoKKwkJCXJldHVybiBwcm90b3JlZmxlY3QuVmFsdWVPZlVpbnQzMigwKQorCQljYXNlIHByb3RvcmVmbGVjdC5VaW50NjRLaW5kLCBwcm90b3JlZmxlY3QuRml4ZWQ2NEtpbmQ6CisJCQlyZXR1cm4gcHJvdG9yZWZsZWN0LlZhbHVlT2ZVaW50NjQoMCkKKwkJY2FzZSBwcm90b3JlZmxlY3QuRmxvYXRLaW5kOgorCQkJcmV0dXJuIHByb3RvcmVmbGVjdC5WYWx1ZU9mRmxvYXQzMigwKQorCQljYXNlIHByb3RvcmVmbGVjdC5Eb3VibGVLaW5kOgorCQkJcmV0dXJuIHByb3RvcmVmbGVjdC5WYWx1ZU9mRmxvYXQ2NCgwKQorCQljYXNlIHByb3RvcmVmbGVjdC5TdHJpbmdLaW5kOgorCQkJcmV0dXJuIHByb3RvcmVmbGVjdC5WYWx1ZU9mU3RyaW5nKCIiKQorCQljYXNlIHByb3RvcmVmbGVjdC5CeXRlc0tpbmQ6CisJCQlyZXR1cm4gcHJvdG9yZWZsZWN0LlZhbHVlT2ZCeXRlcyhuaWwpCisJCWNhc2UgcHJvdG9yZWZsZWN0LkVudW1LaW5kOgogCQkJaWYgZXZzIDo9IGZkLkVudW0oKS5WYWx1ZXMoKTsgZXZzLkxlbigpID4gMCB7Ci0JCQkJcmV0dXJuIHByZWYuVmFsdWVPZkVudW0oZXZzLkdldCgwKS5OdW1iZXIoKSkKKwkJCQlyZXR1cm4gcHJvdG9yZWZsZWN0LlZhbHVlT2ZFbnVtKGV2cy5HZXQoMCkuTnVtYmVyKCkpCiAJCQl9Ci0JCQlyZXR1cm4gcHJlZi5WYWx1ZU9mRW51bSgwKQorCQkJcmV0dXJuIHByb3RvcmVmbGVjdC5WYWx1ZU9mRW51bSgwKQogCQl9CiAJfQogCmRpZmYgLS1naXQgYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZmlsZWRlc2MvZGVzY19pbml0LmdvIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ZpbGVkZXNjL2Rlc2NfaW5pdC5nbwppbmRleCA2NmUxZmVlLi4yMzdlNjRmIDEwMDY0NAotLS0gYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZmlsZWRlc2MvZGVzY19pbml0LmdvCisrKyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9maWxlZGVzYy9kZXNjX2luaXQuZ28KQEAgLTUsMTIgKzUsMTMgQEAKIHBhY2thZ2UgZmlsZWRlc2MKIAogaW1wb3J0ICgKKwkiZm10IgogCSJzeW5jIgogCiAJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2VuY29kaW5nL3Byb3Rvd2lyZSIKIAkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZ2VuaWQiCiAJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL3N0cnMiCi0JcHJlZiAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZmxlY3QiCisJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgogKQogCiAvLyBmaWxlUmF3IGlzIGEgZGF0YSBzdHJ1Y3QgdXNlZCB3aGVuIGluaXRpYWxpemluZyBhIGZpbGUgZGVzY3JpcHRvciBmcm9tCkBAIC05NSw5ICs5NiwxMCBAQAogCXNiIDo9IGdldEJ1aWxkZXIoKQogCWRlZmVyIHB1dEJ1aWxkZXIoc2IpCiAKLQl2YXIgcHJldkZpZWxkIHByZWYuRmllbGROdW1iZXIKKwl2YXIgcHJldkZpZWxkIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlcgogCXZhciBudW1FbnVtcywgbnVtTWVzc2FnZXMsIG51bUV4dGVuc2lvbnMsIG51bVNlcnZpY2VzIGludAogCXZhciBwb3NFbnVtcywgcG9zTWVzc2FnZXMsIHBvc0V4dGVuc2lvbnMsIHBvc1NlcnZpY2VzIGludAorCXZhciBvcHRpb25zIFtdYnl0ZQogCWIwIDo9IGIKIAlmb3IgbGVuKGIpID4gMCB7CiAJCW51bSwgdHlwLCBuIDo9IHByb3Rvd2lyZS5Db25zdW1lVGFnKGIpCkBAIC0xMTAsMTYgKzExMiwyMCBAQAogCQkJY2FzZSBnZW5pZC5GaWxlRGVzY3JpcHRvclByb3RvX1N5bnRheF9maWVsZF9udW1iZXI6CiAJCQkJc3dpdGNoIHN0cmluZyh2KSB7CiAJCQkJY2FzZSAicHJvdG8yIjoKLQkJCQkJZmQuTDEuU3ludGF4ID0gcHJlZi5Qcm90bzIKKwkJCQkJZmQuTDEuU3ludGF4ID0gcHJvdG9yZWZsZWN0LlByb3RvMgogCQkJCWNhc2UgInByb3RvMyI6Ci0JCQkJCWZkLkwxLlN5bnRheCA9IHByZWYuUHJvdG8zCisJCQkJCWZkLkwxLlN5bnRheCA9IHByb3RvcmVmbGVjdC5Qcm90bzMKKwkJCQljYXNlICJlZGl0aW9ucyI6CisJCQkJCWZkLkwxLlN5bnRheCA9IHByb3RvcmVmbGVjdC5FZGl0aW9ucwogCQkJCWRlZmF1bHQ6CiAJCQkJCXBhbmljKCJpbnZhbGlkIHN5bnRheCIpCiAJCQkJfQogCQkJY2FzZSBnZW5pZC5GaWxlRGVzY3JpcHRvclByb3RvX05hbWVfZmllbGRfbnVtYmVyOgogCQkJCWZkLkwxLlBhdGggPSBzYi5NYWtlU3RyaW5nKHYpCiAJCQljYXNlIGdlbmlkLkZpbGVEZXNjcmlwdG9yUHJvdG9fUGFja2FnZV9maWVsZF9udW1iZXI6Ci0JCQkJZmQuTDEuUGFja2FnZSA9IHByZWYuRnVsbE5hbWUoc2IuTWFrZVN0cmluZyh2KSkKKwkJCQlmZC5MMS5QYWNrYWdlID0gcHJvdG9yZWZsZWN0LkZ1bGxOYW1lKHNiLk1ha2VTdHJpbmcodikpCisJCQljYXNlIGdlbmlkLkZpbGVEZXNjcmlwdG9yUHJvdG9fT3B0aW9uc19maWVsZF9udW1iZXI6CisJCQkJb3B0aW9ucyA9IHYKIAkJCWNhc2UgZ2VuaWQuRmlsZURlc2NyaXB0b3JQcm90b19FbnVtVHlwZV9maWVsZF9udW1iZXI6CiAJCQkJaWYgcHJldkZpZWxkICE9IGdlbmlkLkZpbGVEZXNjcmlwdG9yUHJvdG9fRW51bVR5cGVfZmllbGRfbnVtYmVyIHsKIAkJCQkJaWYgbnVtRW51bXMgPiAwIHsKQEAgLTE1NCw2ICsxNjAsMTMgQEAKIAkJCQludW1TZXJ2aWNlcysrCiAJCQl9CiAJCQlwcmV2RmllbGQgPSBudW0KKwkJY2FzZSBwcm90b3dpcmUuVmFyaW50VHlwZToKKwkJCXYsIG0gOj0gcHJvdG93aXJlLkNvbnN1bWVWYXJpbnQoYikKKwkJCWIgPSBiW206XQorCQkJc3dpdGNoIG51bSB7CisJCQljYXNlIGdlbmlkLkZpbGVEZXNjcmlwdG9yUHJvdG9fRWRpdGlvbl9maWVsZF9udW1iZXI6CisJCQkJZmQuTDEuRWRpdGlvbiA9IEVkaXRpb24odikKKwkJCX0KIAkJZGVmYXVsdDoKIAkJCW0gOj0gcHJvdG93aXJlLkNvbnN1bWVGaWVsZFZhbHVlKG51bSwgdHlwLCBiKQogCQkJYiA9IGJbbTpdCkBAIC0xNjMsNyArMTc2LDE2IEBACiAKIAkvLyBJZiBzeW50YXggaXMgbWlzc2luZywgaXQgaXMgYXNzdW1lZCB0byBiZSBwcm90bzIuCiAJaWYgZmQuTDEuU3ludGF4ID09IDAgewotCQlmZC5MMS5TeW50YXggPSBwcmVmLlByb3RvMgorCQlmZC5MMS5TeW50YXggPSBwcm90b3JlZmxlY3QuUHJvdG8yCisJfQorCisJaWYgZmQuTDEuU3ludGF4ID09IHByb3RvcmVmbGVjdC5FZGl0aW9ucyB7CisJCWZkLkwxLkVkaXRpb25GZWF0dXJlcyA9IGdldEZlYXR1cmVzRm9yKGZkLkwxLkVkaXRpb24pCisJfQorCisJLy8gUGFyc2UgZWRpdGlvbnMgZmVhdHVyZXMgZnJvbSBvcHRpb25zIGlmIGFueQorCWlmIG9wdGlvbnMgIT0gbmlsIHsKKwkJZmQudW5tYXJzaGFsU2VlZE9wdGlvbnMob3B0aW9ucykKIAl9CiAKIAkvLyBNdXN0IGFsbG9jYXRlIGFsbCBkZWNsYXJhdGlvbnMgYmVmb3JlIHBhcnNpbmcgZWFjaCBkZXNjcmlwdG9yIHR5cGUKQEAgLTIxOSw3ICsyNDEsMjkgQEAKIAl9CiB9CiAKLWZ1bmMgKGVkICpFbnVtKSB1bm1hcnNoYWxTZWVkKGIgW11ieXRlLCBzYiAqc3Rycy5CdWlsZGVyLCBwZiAqRmlsZSwgcGQgcHJlZi5EZXNjcmlwdG9yLCBpIGludCkgeworZnVuYyAoZmQgKkZpbGUpIHVubWFyc2hhbFNlZWRPcHRpb25zKGIgW11ieXRlKSB7CisJZm9yIGIgOj0gYjsgbGVuKGIpID4gMDsgeworCQludW0sIHR5cCwgbiA6PSBwcm90b3dpcmUuQ29uc3VtZVRhZyhiKQorCQliID0gYltuOl0KKwkJc3dpdGNoIHR5cCB7CisJCWNhc2UgcHJvdG93aXJlLkJ5dGVzVHlwZToKKwkJCXYsIG0gOj0gcHJvdG93aXJlLkNvbnN1bWVCeXRlcyhiKQorCQkJYiA9IGJbbTpdCisJCQlzd2l0Y2ggbnVtIHsKKwkJCWNhc2UgZ2VuaWQuRmlsZU9wdGlvbnNfRmVhdHVyZXNfZmllbGRfbnVtYmVyOgorCQkJCWlmIGZkLlN5bnRheCgpICE9IHByb3RvcmVmbGVjdC5FZGl0aW9ucyB7CisJCQkJCXBhbmljKGZtdC5TcHJpbnRmKCJpbnZhbGlkIGRlc2NyaXB0b3I6IHVzaW5nIGVkaXRpb24gZmVhdHVyZXMgaW4gYSBwcm90byB3aXRoIHN5bnRheCAlcyIsIGZkLlN5bnRheCgpKSkKKwkJCQl9CisJCQkJZmQuTDEuRWRpdGlvbkZlYXR1cmVzID0gdW5tYXJzaGFsRmVhdHVyZVNldCh2LCBmZC5MMS5FZGl0aW9uRmVhdHVyZXMpCisJCQl9CisJCWRlZmF1bHQ6CisJCQltIDo9IHByb3Rvd2lyZS5Db25zdW1lRmllbGRWYWx1ZShudW0sIHR5cCwgYikKKwkJCWIgPSBiW206XQorCQl9CisJfQorfQorCitmdW5jIChlZCAqRW51bSkgdW5tYXJzaGFsU2VlZChiIFtdYnl0ZSwgc2IgKnN0cnMuQnVpbGRlciwgcGYgKkZpbGUsIHBkIHByb3RvcmVmbGVjdC5EZXNjcmlwdG9yLCBpIGludCkgewogCWVkLkwwLlBhcmVudEZpbGUgPSBwZgogCWVkLkwwLlBhcmVudCA9IHBkCiAJZWQuTDAuSW5kZXggPSBpCkBAIC0yNzEsMTIgKzMxNSwxMyBAQAogCX0KIH0KIAotZnVuYyAobWQgKk1lc3NhZ2UpIHVubWFyc2hhbFNlZWQoYiBbXWJ5dGUsIHNiICpzdHJzLkJ1aWxkZXIsIHBmICpGaWxlLCBwZCBwcmVmLkRlc2NyaXB0b3IsIGkgaW50KSB7CitmdW5jIChtZCAqTWVzc2FnZSkgdW5tYXJzaGFsU2VlZChiIFtdYnl0ZSwgc2IgKnN0cnMuQnVpbGRlciwgcGYgKkZpbGUsIHBkIHByb3RvcmVmbGVjdC5EZXNjcmlwdG9yLCBpIGludCkgewogCW1kLkwwLlBhcmVudEZpbGUgPSBwZgogCW1kLkwwLlBhcmVudCA9IHBkCiAJbWQuTDAuSW5kZXggPSBpCisJbWQuTDEuRWRpdGlvbkZlYXR1cmVzID0gZmVhdHVyZXNGcm9tUGFyZW50RGVzYyhtZC5QYXJlbnQoKSkKIAotCXZhciBwcmV2RmllbGQgcHJlZi5GaWVsZE51bWJlcgorCXZhciBwcmV2RmllbGQgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyCiAJdmFyIG51bUVudW1zLCBudW1NZXNzYWdlcywgbnVtRXh0ZW5zaW9ucyBpbnQKIAl2YXIgcG9zRW51bXMsIHBvc01lc3NhZ2VzLCBwb3NFeHRlbnNpb25zIGludAogCWIwIDo9IGIKQEAgLTM4MCw2ICs0MjUsMTMgQEAKIAkJCWNhc2UgZ2VuaWQuTWVzc2FnZU9wdGlvbnNfTWVzc2FnZVNldFdpcmVGb3JtYXRfZmllbGRfbnVtYmVyOgogCQkJCW1kLkwxLklzTWVzc2FnZVNldCA9IHByb3Rvd2lyZS5EZWNvZGVCb29sKHYpCiAJCQl9CisJCWNhc2UgcHJvdG93aXJlLkJ5dGVzVHlwZToKKwkJCXYsIG0gOj0gcHJvdG93aXJlLkNvbnN1bWVCeXRlcyhiKQorCQkJYiA9IGJbbTpdCisJCQlzd2l0Y2ggbnVtIHsKKwkJCWNhc2UgZ2VuaWQuTWVzc2FnZU9wdGlvbnNfRmVhdHVyZXNfZmllbGRfbnVtYmVyOgorCQkJCW1kLkwxLkVkaXRpb25GZWF0dXJlcyA9IHVubWFyc2hhbEZlYXR1cmVTZXQodiwgbWQuTDEuRWRpdGlvbkZlYXR1cmVzKQorCQkJfQogCQlkZWZhdWx0OgogCQkJbSA6PSBwcm90b3dpcmUuQ29uc3VtZUZpZWxkVmFsdWUobnVtLCB0eXAsIGIpCiAJCQliID0gYlttOl0KQEAgLTM4Nyw3ICs0MzksNyBAQAogCX0KIH0KIAotZnVuYyAoeGQgKkV4dGVuc2lvbikgdW5tYXJzaGFsU2VlZChiIFtdYnl0ZSwgc2IgKnN0cnMuQnVpbGRlciwgcGYgKkZpbGUsIHBkIHByZWYuRGVzY3JpcHRvciwgaSBpbnQpIHsKK2Z1bmMgKHhkICpFeHRlbnNpb24pIHVubWFyc2hhbFNlZWQoYiBbXWJ5dGUsIHNiICpzdHJzLkJ1aWxkZXIsIHBmICpGaWxlLCBwZCBwcm90b3JlZmxlY3QuRGVzY3JpcHRvciwgaSBpbnQpIHsKIAl4ZC5MMC5QYXJlbnRGaWxlID0gcGYKIAl4ZC5MMC5QYXJlbnQgPSBwZAogCXhkLkwwLkluZGV4ID0gaQpAQCAtNDAxLDExICs0NTMsMTEgQEAKIAkJCWIgPSBiW206XQogCQkJc3dpdGNoIG51bSB7CiAJCQljYXNlIGdlbmlkLkZpZWxkRGVzY3JpcHRvclByb3RvX051bWJlcl9maWVsZF9udW1iZXI6Ci0JCQkJeGQuTDEuTnVtYmVyID0gcHJlZi5GaWVsZE51bWJlcih2KQorCQkJCXhkLkwxLk51bWJlciA9IHByb3RvcmVmbGVjdC5GaWVsZE51bWJlcih2KQogCQkJY2FzZSBnZW5pZC5GaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9maWVsZF9udW1iZXI6Ci0JCQkJeGQuTDEuQ2FyZGluYWxpdHkgPSBwcmVmLkNhcmRpbmFsaXR5KHYpCisJCQkJeGQuTDEuQ2FyZGluYWxpdHkgPSBwcm90b3JlZmxlY3QuQ2FyZGluYWxpdHkodikKIAkJCWNhc2UgZ2VuaWQuRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9maWVsZF9udW1iZXI6Ci0JCQkJeGQuTDEuS2luZCA9IHByZWYuS2luZCh2KQorCQkJCXhkLkwxLktpbmQgPSBwcm90b3JlZmxlY3QuS2luZCh2KQogCQkJfQogCQljYXNlIHByb3Rvd2lyZS5CeXRlc1R5cGU6CiAJCQl2LCBtIDo9IHByb3Rvd2lyZS5Db25zdW1lQnl0ZXMoYikKQEAgLTQyMyw3ICs0NzUsNyBAQAogCX0KIH0KIAotZnVuYyAoc2QgKlNlcnZpY2UpIHVubWFyc2hhbFNlZWQoYiBbXWJ5dGUsIHNiICpzdHJzLkJ1aWxkZXIsIHBmICpGaWxlLCBwZCBwcmVmLkRlc2NyaXB0b3IsIGkgaW50KSB7CitmdW5jIChzZCAqU2VydmljZSkgdW5tYXJzaGFsU2VlZChiIFtdYnl0ZSwgc2IgKnN0cnMuQnVpbGRlciwgcGYgKkZpbGUsIHBkIHByb3RvcmVmbGVjdC5EZXNjcmlwdG9yLCBpIGludCkgewogCXNkLkwwLlBhcmVudEZpbGUgPSBwZgogCXNkLkwwLlBhcmVudCA9IHBkCiAJc2QuTDAuSW5kZXggPSBpCkBAIC00NTksMTMgKzUxMSwxMyBAQAogCiAvLyBtYWtlRnVsbE5hbWUgY29udmVydHMgYiB0byBhIHByb3RvcmVmbGVjdC5GdWxsTmFtZSwKIC8vIHdoZXJlIGIgbXVzdCBzdGFydCB3aXRoIGEgbGVhZGluZyBkb3QuCi1mdW5jIG1ha2VGdWxsTmFtZShzYiAqc3Rycy5CdWlsZGVyLCBiIFtdYnl0ZSkgcHJlZi5GdWxsTmFtZSB7CitmdW5jIG1ha2VGdWxsTmFtZShzYiAqc3Rycy5CdWlsZGVyLCBiIFtdYnl0ZSkgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lIHsKIAlpZiBsZW4oYikgPT0gMCB8fCBiWzBdICE9ICcuJyB7CiAJCXBhbmljKCJuYW1lIHJlZmVyZW5jZSBtdXN0IGJlIGZ1bGx5IHF1YWxpZmllZCIpCiAJfQotCXJldHVybiBwcmVmLkZ1bGxOYW1lKHNiLk1ha2VTdHJpbmcoYlsxOl0pKQorCXJldHVybiBwcm90b3JlZmxlY3QuRnVsbE5hbWUoc2IuTWFrZVN0cmluZyhiWzE6XSkpCiB9CiAKLWZ1bmMgYXBwZW5kRnVsbE5hbWUoc2IgKnN0cnMuQnVpbGRlciwgcHJlZml4IHByZWYuRnVsbE5hbWUsIHN1ZmZpeCBbXWJ5dGUpIHByZWYuRnVsbE5hbWUgewotCXJldHVybiBzYi5BcHBlbmRGdWxsTmFtZShwcmVmaXgsIHByZWYuTmFtZShzdHJzLlVuc2FmZVN0cmluZyhzdWZmaXgpKSkKK2Z1bmMgYXBwZW5kRnVsbE5hbWUoc2IgKnN0cnMuQnVpbGRlciwgcHJlZml4IHByb3RvcmVmbGVjdC5GdWxsTmFtZSwgc3VmZml4IFtdYnl0ZSkgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lIHsKKwlyZXR1cm4gc2IuQXBwZW5kRnVsbE5hbWUocHJlZml4LCBwcm90b3JlZmxlY3QuTmFtZShzdHJzLlVuc2FmZVN0cmluZyhzdWZmaXgpKSkKIH0KZGlmZiAtLWdpdCBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9maWxlZGVzYy9kZXNjX2xhenkuZ28gYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZmlsZWRlc2MvZGVzY19sYXp5LmdvCmluZGV4IDE5ODQ1MWUuLjQ4MmE2MWMgMTAwNjQ0Ci0tLSBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9maWxlZGVzYy9kZXNjX2xhenkuZ28KKysrIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ZpbGVkZXNjL2Rlc2NfbGF6eS5nbwpAQCAtMTMsNyArMTMsNyBAQAogCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9nZW5pZCIKIAkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvc3RycyIKIAkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcHJvdG8iCi0JcHJlZiAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZmxlY3QiCisJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgogKQogCiBmdW5jIChmZCAqRmlsZSkgbGF6eVJhd0luaXQoKSB7CkBAIC0zOSwxMCArMzksMTAgQEAKIAogCQkJLy8gUmVzb2x2ZSBtZXNzYWdlIGZpZWxkIGRlcGVuZGVuY3kuCiAJCQlzd2l0Y2ggZmQuTDEuS2luZCB7Ci0JCQljYXNlIHByZWYuRW51bUtpbmQ6CisJCQljYXNlIHByb3RvcmVmbGVjdC5FbnVtS2luZDoKIAkJCQlmZC5MMS5FbnVtID0gZmlsZS5yZXNvbHZlRW51bURlcGVuZGVuY3koZmQuTDEuRW51bSwgbGlzdEZpZWxkRGVwcywgZGVwSWR4KQogCQkJCWRlcElkeCsrCi0JCQljYXNlIHByZWYuTWVzc2FnZUtpbmQsIHByZWYuR3JvdXBLaW5kOgorCQkJY2FzZSBwcm90b3JlZmxlY3QuTWVzc2FnZUtpbmQsIHByb3RvcmVmbGVjdC5Hcm91cEtpbmQ6CiAJCQkJZmQuTDEuTWVzc2FnZSA9IGZpbGUucmVzb2x2ZU1lc3NhZ2VEZXBlbmRlbmN5KGZkLkwxLk1lc3NhZ2UsIGxpc3RGaWVsZERlcHMsIGRlcElkeCkKIAkJCQlkZXBJZHgrKwogCQkJfQpAQCAtNjIsMTAgKzYyLDEwIEBACiAKIAkJLy8gUmVzb2x2ZSBleHRlbnNpb24gZmllbGQgZGVwZW5kZW5jeS4KIAkJc3dpdGNoIHhkLkwxLktpbmQgewotCQljYXNlIHByZWYuRW51bUtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LkVudW1LaW5kOgogCQkJeGQuTDIuRW51bSA9IGZpbGUucmVzb2x2ZUVudW1EZXBlbmRlbmN5KHhkLkwyLkVudW0sIGxpc3RFeHREZXBzLCBkZXBJZHgpCiAJCQlkZXBJZHgrKwotCQljYXNlIHByZWYuTWVzc2FnZUtpbmQsIHByZWYuR3JvdXBLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5NZXNzYWdlS2luZCwgcHJvdG9yZWZsZWN0Lkdyb3VwS2luZDoKIAkJCXhkLkwyLk1lc3NhZ2UgPSBmaWxlLnJlc29sdmVNZXNzYWdlRGVwZW5kZW5jeSh4ZC5MMi5NZXNzYWdlLCBsaXN0RXh0RGVwcywgZGVwSWR4KQogCQkJZGVwSWR4KysKIAkJfQpAQCAtOTIsNyArOTIsNyBAQAogCX0KIH0KIAotZnVuYyAoZmlsZSAqRmlsZSkgcmVzb2x2ZUVudW1EZXBlbmRlbmN5KGVkIHByZWYuRW51bURlc2NyaXB0b3IsIGksIGogaW50MzIpIHByZWYuRW51bURlc2NyaXB0b3IgeworZnVuYyAoZmlsZSAqRmlsZSkgcmVzb2x2ZUVudW1EZXBlbmRlbmN5KGVkIHByb3RvcmVmbGVjdC5FbnVtRGVzY3JpcHRvciwgaSwgaiBpbnQzMikgcHJvdG9yZWZsZWN0LkVudW1EZXNjcmlwdG9yIHsKIAlyIDo9IGZpbGUuYnVpbGRlci5GaWxlUmVnaXN0cnkKIAlpZiByLCBvayA6PSByLihyZXNvbHZlckJ5SW5kZXgpOyBvayB7CiAJCWlmIGVkMiA6PSByLkZpbmRFbnVtQnlJbmRleChpLCBqLCBmaWxlLmFsbEVudW1zLCBmaWxlLmFsbE1lc3NhZ2VzKTsgZWQyICE9IG5pbCB7CkBAIC0xMDUsMTIgKzEwNSwxMiBAQAogCQl9CiAJfQogCWlmIGQsIF8gOj0gci5GaW5kRGVzY3JpcHRvckJ5TmFtZShlZC5GdWxsTmFtZSgpKTsgZCAhPSBuaWwgewotCQlyZXR1cm4gZC4ocHJlZi5FbnVtRGVzY3JpcHRvcikKKwkJcmV0dXJuIGQuKHByb3RvcmVmbGVjdC5FbnVtRGVzY3JpcHRvcikKIAl9CiAJcmV0dXJuIGVkCiB9CiAKLWZ1bmMgKGZpbGUgKkZpbGUpIHJlc29sdmVNZXNzYWdlRGVwZW5kZW5jeShtZCBwcmVmLk1lc3NhZ2VEZXNjcmlwdG9yLCBpLCBqIGludDMyKSBwcmVmLk1lc3NhZ2VEZXNjcmlwdG9yIHsKK2Z1bmMgKGZpbGUgKkZpbGUpIHJlc29sdmVNZXNzYWdlRGVwZW5kZW5jeShtZCBwcm90b3JlZmxlY3QuTWVzc2FnZURlc2NyaXB0b3IsIGksIGogaW50MzIpIHByb3RvcmVmbGVjdC5NZXNzYWdlRGVzY3JpcHRvciB7CiAJciA6PSBmaWxlLmJ1aWxkZXIuRmlsZVJlZ2lzdHJ5CiAJaWYgciwgb2sgOj0gci4ocmVzb2x2ZXJCeUluZGV4KTsgb2sgewogCQlpZiBtZDIgOj0gci5GaW5kTWVzc2FnZUJ5SW5kZXgoaSwgaiwgZmlsZS5hbGxFbnVtcywgZmlsZS5hbGxNZXNzYWdlcyk7IG1kMiAhPSBuaWwgewpAQCAtMTIzLDcgKzEyMyw3IEBACiAJCX0KIAl9CiAJaWYgZCwgXyA6PSByLkZpbmREZXNjcmlwdG9yQnlOYW1lKG1kLkZ1bGxOYW1lKCkpOyBkICE9IG5pbCB7Ci0JCXJldHVybiBkLihwcmVmLk1lc3NhZ2VEZXNjcmlwdG9yKQorCQlyZXR1cm4gZC4ocHJvdG9yZWZsZWN0Lk1lc3NhZ2VEZXNjcmlwdG9yKQogCX0KIAlyZXR1cm4gbWQKIH0KQEAgLTE1OCw3ICsxNTgsNyBAQAogCQkJCWlmIGltcCA9PSBuaWwgewogCQkJCQlpbXAgPSBQbGFjZWhvbGRlckZpbGUocGF0aCkKIAkJCQl9Ci0JCQkJZmQuTDIuSW1wb3J0cyA9IGFwcGVuZChmZC5MMi5JbXBvcnRzLCBwcmVmLkZpbGVJbXBvcnR7RmlsZURlc2NyaXB0b3I6IGltcH0pCisJCQkJZmQuTDIuSW1wb3J0cyA9IGFwcGVuZChmZC5MMi5JbXBvcnRzLCBwcm90b3JlZmxlY3QuRmlsZUltcG9ydHtGaWxlRGVzY3JpcHRvcjogaW1wfSkKIAkJCWNhc2UgZ2VuaWQuRmlsZURlc2NyaXB0b3JQcm90b19FbnVtVHlwZV9maWVsZF9udW1iZXI6CiAJCQkJZmQuTDEuRW51bXMuTGlzdFtlbnVtSWR4XS51bm1hcnNoYWxGdWxsKHYsIHNiKQogCQkJCWVudW1JZHgrKwpAQCAtMTk5LDcgKzE5OSw3IEBACiAJCQljYXNlIGdlbmlkLkVudW1EZXNjcmlwdG9yUHJvdG9fVmFsdWVfZmllbGRfbnVtYmVyOgogCQkJCXJhd1ZhbHVlcyA9IGFwcGVuZChyYXdWYWx1ZXMsIHYpCiAJCQljYXNlIGdlbmlkLkVudW1EZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWROYW1lX2ZpZWxkX251bWJlcjoKLQkJCQllZC5MMi5SZXNlcnZlZE5hbWVzLkxpc3QgPSBhcHBlbmQoZWQuTDIuUmVzZXJ2ZWROYW1lcy5MaXN0LCBwcmVmLk5hbWUoc2IuTWFrZVN0cmluZyh2KSkpCisJCQkJZWQuTDIuUmVzZXJ2ZWROYW1lcy5MaXN0ID0gYXBwZW5kKGVkLkwyLlJlc2VydmVkTmFtZXMuTGlzdCwgcHJvdG9yZWZsZWN0Lk5hbWUoc2IuTWFrZVN0cmluZyh2KSkpCiAJCQljYXNlIGdlbmlkLkVudW1EZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZV9maWVsZF9udW1iZXI6CiAJCQkJZWQuTDIuUmVzZXJ2ZWRSYW5nZXMuTGlzdCA9IGFwcGVuZChlZC5MMi5SZXNlcnZlZFJhbmdlcy5MaXN0LCB1bm1hcnNoYWxFbnVtUmVzZXJ2ZWRSYW5nZSh2KSkKIAkJCWNhc2UgZ2VuaWQuRW51bURlc2NyaXB0b3JQcm90b19PcHRpb25zX2ZpZWxkX251bWJlcjoKQEAgLTIxOSw3ICsyMTksNyBAQAogCWVkLkwyLk9wdGlvbnMgPSBlZC5MMC5QYXJlbnRGaWxlLmJ1aWxkZXIub3B0aW9uc1VubWFyc2hhbGVyKCZkZXNjb3B0cy5FbnVtLCByYXdPcHRpb25zKQogfQogCi1mdW5jIHVubWFyc2hhbEVudW1SZXNlcnZlZFJhbmdlKGIgW11ieXRlKSAociBbMl1wcmVmLkVudW1OdW1iZXIpIHsKK2Z1bmMgdW5tYXJzaGFsRW51bVJlc2VydmVkUmFuZ2UoYiBbXWJ5dGUpIChyIFsyXXByb3RvcmVmbGVjdC5FbnVtTnVtYmVyKSB7CiAJZm9yIGxlbihiKSA+IDAgewogCQludW0sIHR5cCwgbiA6PSBwcm90b3dpcmUuQ29uc3VtZVRhZyhiKQogCQliID0gYltuOl0KQEAgLTIyOSw5ICsyMjksOSBAQAogCQkJYiA9IGJbbTpdCiAJCQlzd2l0Y2ggbnVtIHsKIAkJCWNhc2UgZ2VuaWQuRW51bURlc2NyaXB0b3JQcm90b19FbnVtUmVzZXJ2ZWRSYW5nZV9TdGFydF9maWVsZF9udW1iZXI6Ci0JCQkJclswXSA9IHByZWYuRW51bU51bWJlcih2KQorCQkJCXJbMF0gPSBwcm90b3JlZmxlY3QuRW51bU51bWJlcih2KQogCQkJY2FzZSBnZW5pZC5FbnVtRGVzY3JpcHRvclByb3RvX0VudW1SZXNlcnZlZFJhbmdlX0VuZF9maWVsZF9udW1iZXI6Ci0JCQkJclsxXSA9IHByZWYuRW51bU51bWJlcih2KQorCQkJCXJbMV0gPSBwcm90b3JlZmxlY3QuRW51bU51bWJlcih2KQogCQkJfQogCQlkZWZhdWx0OgogCQkJbSA6PSBwcm90b3dpcmUuQ29uc3VtZUZpZWxkVmFsdWUobnVtLCB0eXAsIGIpCkBAIC0yNDEsNyArMjQxLDcgQEAKIAlyZXR1cm4gcgogfQogCi1mdW5jICh2ZCAqRW51bVZhbHVlKSB1bm1hcnNoYWxGdWxsKGIgW11ieXRlLCBzYiAqc3Rycy5CdWlsZGVyLCBwZiAqRmlsZSwgcGQgcHJlZi5EZXNjcmlwdG9yLCBpIGludCkgeworZnVuYyAodmQgKkVudW1WYWx1ZSkgdW5tYXJzaGFsRnVsbChiIFtdYnl0ZSwgc2IgKnN0cnMuQnVpbGRlciwgcGYgKkZpbGUsIHBkIHByb3RvcmVmbGVjdC5EZXNjcmlwdG9yLCBpIGludCkgewogCXZkLkwwLlBhcmVudEZpbGUgPSBwZgogCXZkLkwwLlBhcmVudCA9IHBkCiAJdmQuTDAuSW5kZXggPSBpCkBAIC0yNTYsNyArMjU2LDcgQEAKIAkJCWIgPSBiW206XQogCQkJc3dpdGNoIG51bSB7CiAJCQljYXNlIGdlbmlkLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90b19OdW1iZXJfZmllbGRfbnVtYmVyOgotCQkJCXZkLkwxLk51bWJlciA9IHByZWYuRW51bU51bWJlcih2KQorCQkJCXZkLkwxLk51bWJlciA9IHByb3RvcmVmbGVjdC5FbnVtTnVtYmVyKHYpCiAJCQl9CiAJCWNhc2UgcHJvdG93aXJlLkJ5dGVzVHlwZToKIAkJCXYsIG0gOj0gcHJvdG93aXJlLkNvbnN1bWVCeXRlcyhiKQpAQCAtMjk0LDcgKzI5NCw3IEBACiAJCQljYXNlIGdlbmlkLkRlc2NyaXB0b3JQcm90b19PbmVvZkRlY2xfZmllbGRfbnVtYmVyOgogCQkJCXJhd09uZW9mcyA9IGFwcGVuZChyYXdPbmVvZnMsIHYpCiAJCQljYXNlIGdlbmlkLkRlc2NyaXB0b3JQcm90b19SZXNlcnZlZE5hbWVfZmllbGRfbnVtYmVyOgotCQkJCW1kLkwyLlJlc2VydmVkTmFtZXMuTGlzdCA9IGFwcGVuZChtZC5MMi5SZXNlcnZlZE5hbWVzLkxpc3QsIHByZWYuTmFtZShzYi5NYWtlU3RyaW5nKHYpKSkKKwkJCQltZC5MMi5SZXNlcnZlZE5hbWVzLkxpc3QgPSBhcHBlbmQobWQuTDIuUmVzZXJ2ZWROYW1lcy5MaXN0LCBwcm90b3JlZmxlY3QuTmFtZShzYi5NYWtlU3RyaW5nKHYpKSkKIAkJCWNhc2UgZ2VuaWQuRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2VfZmllbGRfbnVtYmVyOgogCQkJCW1kLkwyLlJlc2VydmVkUmFuZ2VzLkxpc3QgPSBhcHBlbmQobWQuTDIuUmVzZXJ2ZWRSYW5nZXMuTGlzdCwgdW5tYXJzaGFsTWVzc2FnZVJlc2VydmVkUmFuZ2UodikpCiAJCQljYXNlIGdlbmlkLkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZV9maWVsZF9udW1iZXI6CkBAIC0zMjYsNyArMzI2LDcgQEAKIAkJZm9yIGksIGIgOj0gcmFuZ2UgcmF3RmllbGRzIHsKIAkJCWZkIDo9ICZtZC5MMi5GaWVsZHMuTGlzdFtpXQogCQkJZmQudW5tYXJzaGFsRnVsbChiLCBzYiwgbWQuTDAuUGFyZW50RmlsZSwgbWQsIGkpCi0JCQlpZiBmZC5MMS5DYXJkaW5hbGl0eSA9PSBwcmVmLlJlcXVpcmVkIHsKKwkJCWlmIGZkLkwxLkNhcmRpbmFsaXR5ID09IHByb3RvcmVmbGVjdC5SZXF1aXJlZCB7CiAJCQkJbWQuTDIuUmVxdWlyZWROdW1iZXJzLkxpc3QgPSBhcHBlbmQobWQuTDIuUmVxdWlyZWROdW1iZXJzLkxpc3QsIGZkLkwxLk51bWJlcikKIAkJCX0KIAkJfQpAQCAtMzU5LDcgKzM1OSw3IEBACiAJfQogfQogCi1mdW5jIHVubWFyc2hhbE1lc3NhZ2VSZXNlcnZlZFJhbmdlKGIgW11ieXRlKSAociBbMl1wcmVmLkZpZWxkTnVtYmVyKSB7CitmdW5jIHVubWFyc2hhbE1lc3NhZ2VSZXNlcnZlZFJhbmdlKGIgW11ieXRlKSAociBbMl1wcm90b3JlZmxlY3QuRmllbGROdW1iZXIpIHsKIAlmb3IgbGVuKGIpID4gMCB7CiAJCW51bSwgdHlwLCBuIDo9IHByb3Rvd2lyZS5Db25zdW1lVGFnKGIpCiAJCWIgPSBiW246XQpAQCAtMzY5LDkgKzM2OSw5IEBACiAJCQliID0gYlttOl0KIAkJCXN3aXRjaCBudW0gewogCQkJY2FzZSBnZW5pZC5EZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZV9TdGFydF9maWVsZF9udW1iZXI6Ci0JCQkJclswXSA9IHByZWYuRmllbGROdW1iZXIodikKKwkJCQlyWzBdID0gcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyKHYpCiAJCQljYXNlIGdlbmlkLkRlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlX0VuZF9maWVsZF9udW1iZXI6Ci0JCQkJclsxXSA9IHByZWYuRmllbGROdW1iZXIodikKKwkJCQlyWzFdID0gcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyKHYpCiAJCQl9CiAJCWRlZmF1bHQ6CiAJCQltIDo9IHByb3Rvd2lyZS5Db25zdW1lRmllbGRWYWx1ZShudW0sIHR5cCwgYikKQEAgLTM4MSw3ICszODEsNyBAQAogCXJldHVybiByCiB9CiAKLWZ1bmMgdW5tYXJzaGFsTWVzc2FnZUV4dGVuc2lvblJhbmdlKGIgW11ieXRlKSAociBbMl1wcmVmLkZpZWxkTnVtYmVyLCByYXdPcHRpb25zIFtdYnl0ZSkgeworZnVuYyB1bm1hcnNoYWxNZXNzYWdlRXh0ZW5zaW9uUmFuZ2UoYiBbXWJ5dGUpIChyIFsyXXByb3RvcmVmbGVjdC5GaWVsZE51bWJlciwgcmF3T3B0aW9ucyBbXWJ5dGUpIHsKIAlmb3IgbGVuKGIpID4gMCB7CiAJCW51bSwgdHlwLCBuIDo9IHByb3Rvd2lyZS5Db25zdW1lVGFnKGIpCiAJCWIgPSBiW246XQpAQCAtMzkxLDkgKzM5MSw5IEBACiAJCQliID0gYlttOl0KIAkJCXN3aXRjaCBudW0gewogCQkJY2FzZSBnZW5pZC5EZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2VfU3RhcnRfZmllbGRfbnVtYmVyOgotCQkJCXJbMF0gPSBwcmVmLkZpZWxkTnVtYmVyKHYpCisJCQkJclswXSA9IHByb3RvcmVmbGVjdC5GaWVsZE51bWJlcih2KQogCQkJY2FzZSBnZW5pZC5EZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2VfRW5kX2ZpZWxkX251bWJlcjoKLQkJCQlyWzFdID0gcHJlZi5GaWVsZE51bWJlcih2KQorCQkJCXJbMV0gPSBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIodikKIAkJCX0KIAkJY2FzZSBwcm90b3dpcmUuQnl0ZXNUeXBlOgogCQkJdiwgbSA6PSBwcm90b3dpcmUuQ29uc3VtZUJ5dGVzKGIpCkBAIC00MTAsMTAgKzQxMCwxMSBAQAogCXJldHVybiByLCByYXdPcHRpb25zCiB9CiAKLWZ1bmMgKGZkICpGaWVsZCkgdW5tYXJzaGFsRnVsbChiIFtdYnl0ZSwgc2IgKnN0cnMuQnVpbGRlciwgcGYgKkZpbGUsIHBkIHByZWYuRGVzY3JpcHRvciwgaSBpbnQpIHsKK2Z1bmMgKGZkICpGaWVsZCkgdW5tYXJzaGFsRnVsbChiIFtdYnl0ZSwgc2IgKnN0cnMuQnVpbGRlciwgcGYgKkZpbGUsIHBkIHByb3RvcmVmbGVjdC5EZXNjcmlwdG9yLCBpIGludCkgewogCWZkLkwwLlBhcmVudEZpbGUgPSBwZgogCWZkLkwwLlBhcmVudCA9IHBkCiAJZmQuTDAuSW5kZXggPSBpCisJZmQuTDEuRWRpdGlvbkZlYXR1cmVzID0gZmVhdHVyZXNGcm9tUGFyZW50RGVzYyhmZC5QYXJlbnQoKSkKIAogCXZhciByYXdUeXBlTmFtZSBbXWJ5dGUKIAl2YXIgcmF3T3B0aW9ucyBbXWJ5dGUKQEAgLTQyNiwxMSArNDI3LDExIEBACiAJCQliID0gYlttOl0KIAkJCXN3aXRjaCBudW0gewogCQkJY2FzZSBnZW5pZC5GaWVsZERlc2NyaXB0b3JQcm90b19OdW1iZXJfZmllbGRfbnVtYmVyOgotCQkJCWZkLkwxLk51bWJlciA9IHByZWYuRmllbGROdW1iZXIodikKKwkJCQlmZC5MMS5OdW1iZXIgPSBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIodikKIAkJCWNhc2UgZ2VuaWQuRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfZmllbGRfbnVtYmVyOgotCQkJCWZkLkwxLkNhcmRpbmFsaXR5ID0gcHJlZi5DYXJkaW5hbGl0eSh2KQorCQkJCWZkLkwxLkNhcmRpbmFsaXR5ID0gcHJvdG9yZWZsZWN0LkNhcmRpbmFsaXR5KHYpCiAJCQljYXNlIGdlbmlkLkZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfZmllbGRfbnVtYmVyOgotCQkJCWZkLkwxLktpbmQgPSBwcmVmLktpbmQodikKKwkJCQlmZC5MMS5LaW5kID0gcHJvdG9yZWZsZWN0LktpbmQodikKIAkJCWNhc2UgZ2VuaWQuRmllbGREZXNjcmlwdG9yUHJvdG9fT25lb2ZJbmRleF9maWVsZF9udW1iZXI6CiAJCQkJLy8gSW4gTWVzc2FnZS51bm1hcnNoYWxGdWxsLCB3ZSBhbGxvY2F0ZSBzbGljZXMgZm9yIGJvdGgKIAkJCQkvLyB0aGUgZmllbGQgYW5kIG9uZW9mIGRlc2NyaXB0b3JzIGJlZm9yZSB1bm1hcnNoYWxpbmcgZWl0aGVyCkBAIC00NTMsNyArNDU0LDcgQEAKIAkJCWNhc2UgZ2VuaWQuRmllbGREZXNjcmlwdG9yUHJvdG9fSnNvbk5hbWVfZmllbGRfbnVtYmVyOgogCQkJCWZkLkwxLlN0cmluZ05hbWUuSW5pdEpTT04oc2IuTWFrZVN0cmluZyh2KSkKIAkJCWNhc2UgZ2VuaWQuRmllbGREZXNjcmlwdG9yUHJvdG9fRGVmYXVsdFZhbHVlX2ZpZWxkX251bWJlcjoKLQkJCQlmZC5MMS5EZWZhdWx0LnZhbCA9IHByZWYuVmFsdWVPZkJ5dGVzKHYpIC8vIHRlbXBvcmFyaWx5IHN0b3JlIGFzIGJ5dGVzOyBsYXRlciByZXNvbHZlZCBpbiByZXNvbHZlTWVzc2FnZXMKKwkJCQlmZC5MMS5EZWZhdWx0LnZhbCA9IHByb3RvcmVmbGVjdC5WYWx1ZU9mQnl0ZXModikgLy8gdGVtcG9yYXJpbHkgc3RvcmUgYXMgYnl0ZXM7IGxhdGVyIHJlc29sdmVkIGluIHJlc29sdmVNZXNzYWdlcwogCQkJY2FzZSBnZW5pZC5GaWVsZERlc2NyaXB0b3JQcm90b19UeXBlTmFtZV9maWVsZF9udW1iZXI6CiAJCQkJcmF3VHlwZU5hbWUgPSB2CiAJCQljYXNlIGdlbmlkLkZpZWxkRGVzY3JpcHRvclByb3RvX09wdGlvbnNfZmllbGRfbnVtYmVyOgpAQCAtNDY1LDEyICs0NjYsMTggQEAKIAkJCWIgPSBiW206XQogCQl9CiAJfQorCWlmIGZkLlN5bnRheCgpID09IHByb3RvcmVmbGVjdC5FZGl0aW9ucyAmJiBmZC5MMS5LaW5kID09IHByb3RvcmVmbGVjdC5NZXNzYWdlS2luZCAmJiBmZC5MMS5FZGl0aW9uRmVhdHVyZXMuSXNEZWxpbWl0ZWRFbmNvZGVkIHsKKwkJZmQuTDEuS2luZCA9IHByb3RvcmVmbGVjdC5Hcm91cEtpbmQKKwl9CisJaWYgZmQuU3ludGF4KCkgPT0gcHJvdG9yZWZsZWN0LkVkaXRpb25zICYmIGZkLkwxLkVkaXRpb25GZWF0dXJlcy5Jc0xlZ2FjeVJlcXVpcmVkIHsKKwkJZmQuTDEuQ2FyZGluYWxpdHkgPSBwcm90b3JlZmxlY3QuUmVxdWlyZWQKKwl9CiAJaWYgcmF3VHlwZU5hbWUgIT0gbmlsIHsKIAkJbmFtZSA6PSBtYWtlRnVsbE5hbWUoc2IsIHJhd1R5cGVOYW1lKQogCQlzd2l0Y2ggZmQuTDEuS2luZCB7Ci0JCWNhc2UgcHJlZi5FbnVtS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuRW51bUtpbmQ6CiAJCQlmZC5MMS5FbnVtID0gUGxhY2Vob2xkZXJFbnVtKG5hbWUpCi0JCWNhc2UgcHJlZi5NZXNzYWdlS2luZCwgcHJlZi5Hcm91cEtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0Lk1lc3NhZ2VLaW5kLCBwcm90b3JlZmxlY3QuR3JvdXBLaW5kOgogCQkJZmQuTDEuTWVzc2FnZSA9IFBsYWNlaG9sZGVyTWVzc2FnZShuYW1lKQogCQl9CiAJfQpAQCAtNDk3LDYgKzUwNCwxMyBAQAogCQkJCWZkLkwxLkhhc0VuZm9yY2VVVEY4ID0gdHJ1ZQogCQkJCWZkLkwxLkVuZm9yY2VVVEY4ID0gcHJvdG93aXJlLkRlY29kZUJvb2wodikKIAkJCX0KKwkJY2FzZSBwcm90b3dpcmUuQnl0ZXNUeXBlOgorCQkJdiwgbSA6PSBwcm90b3dpcmUuQ29uc3VtZUJ5dGVzKGIpCisJCQliID0gYlttOl0KKwkJCXN3aXRjaCBudW0geworCQkJY2FzZSBnZW5pZC5GaWVsZE9wdGlvbnNfRmVhdHVyZXNfZmllbGRfbnVtYmVyOgorCQkJCWZkLkwxLkVkaXRpb25GZWF0dXJlcyA9IHVubWFyc2hhbEZlYXR1cmVTZXQodiwgZmQuTDEuRWRpdGlvbkZlYXR1cmVzKQorCQkJfQogCQlkZWZhdWx0OgogCQkJbSA6PSBwcm90b3dpcmUuQ29uc3VtZUZpZWxkVmFsdWUobnVtLCB0eXAsIGIpCiAJCQliID0gYlttOl0KQEAgLTUwNCw3ICs1MTgsNyBAQAogCX0KIH0KIAotZnVuYyAob2QgKk9uZW9mKSB1bm1hcnNoYWxGdWxsKGIgW11ieXRlLCBzYiAqc3Rycy5CdWlsZGVyLCBwZiAqRmlsZSwgcGQgcHJlZi5EZXNjcmlwdG9yLCBpIGludCkgeworZnVuYyAob2QgKk9uZW9mKSB1bm1hcnNoYWxGdWxsKGIgW11ieXRlLCBzYiAqc3Rycy5CdWlsZGVyLCBwZiAqRmlsZSwgcGQgcHJvdG9yZWZsZWN0LkRlc2NyaXB0b3IsIGkgaW50KSB7CiAJb2QuTDAuUGFyZW50RmlsZSA9IHBmCiAJb2QuTDAuUGFyZW50ID0gcGQKIAlvZC5MMC5JbmRleCA9IGkKQEAgLTUzNCw2ICs1NDgsNyBAQAogZnVuYyAoeGQgKkV4dGVuc2lvbikgdW5tYXJzaGFsRnVsbChiIFtdYnl0ZSwgc2IgKnN0cnMuQnVpbGRlcikgewogCXZhciByYXdUeXBlTmFtZSBbXWJ5dGUKIAl2YXIgcmF3T3B0aW9ucyBbXWJ5dGUKKwl4ZC5MMS5FZGl0aW9uRmVhdHVyZXMgPSBmZWF0dXJlc0Zyb21QYXJlbnREZXNjKHhkLkwxLkV4dGVuZGVlKQogCXhkLkwyID0gbmV3KEV4dGVuc2lvbkwyKQogCWZvciBsZW4oYikgPiAwIHsKIAkJbnVtLCB0eXAsIG4gOj0gcHJvdG93aXJlLkNvbnN1bWVUYWcoYikKQEAgLTU1Myw3ICs1NjgsNyBAQAogCQkJY2FzZSBnZW5pZC5GaWVsZERlc2NyaXB0b3JQcm90b19Kc29uTmFtZV9maWVsZF9udW1iZXI6CiAJCQkJeGQuTDIuU3RyaW5nTmFtZS5Jbml0SlNPTihzYi5NYWtlU3RyaW5nKHYpKQogCQkJY2FzZSBnZW5pZC5GaWVsZERlc2NyaXB0b3JQcm90b19EZWZhdWx0VmFsdWVfZmllbGRfbnVtYmVyOgotCQkJCXhkLkwyLkRlZmF1bHQudmFsID0gcHJlZi5WYWx1ZU9mQnl0ZXModikgLy8gdGVtcG9yYXJpbHkgc3RvcmUgYXMgYnl0ZXM7IGxhdGVyIHJlc29sdmVkIGluIHJlc29sdmVFeHRlbnNpb25zCisJCQkJeGQuTDIuRGVmYXVsdC52YWwgPSBwcm90b3JlZmxlY3QuVmFsdWVPZkJ5dGVzKHYpIC8vIHRlbXBvcmFyaWx5IHN0b3JlIGFzIGJ5dGVzOyBsYXRlciByZXNvbHZlZCBpbiByZXNvbHZlRXh0ZW5zaW9ucwogCQkJY2FzZSBnZW5pZC5GaWVsZERlc2NyaXB0b3JQcm90b19UeXBlTmFtZV9maWVsZF9udW1iZXI6CiAJCQkJcmF3VHlwZU5hbWUgPSB2CiAJCQljYXNlIGdlbmlkLkZpZWxkRGVzY3JpcHRvclByb3RvX09wdGlvbnNfZmllbGRfbnVtYmVyOgpAQCAtNTY1LDEyICs1ODAsMTggQEAKIAkJCWIgPSBiW206XQogCQl9CiAJfQorCWlmIHhkLlN5bnRheCgpID09IHByb3RvcmVmbGVjdC5FZGl0aW9ucyAmJiB4ZC5MMS5LaW5kID09IHByb3RvcmVmbGVjdC5NZXNzYWdlS2luZCAmJiB4ZC5MMS5FZGl0aW9uRmVhdHVyZXMuSXNEZWxpbWl0ZWRFbmNvZGVkIHsKKwkJeGQuTDEuS2luZCA9IHByb3RvcmVmbGVjdC5Hcm91cEtpbmQKKwl9CisJaWYgeGQuU3ludGF4KCkgPT0gcHJvdG9yZWZsZWN0LkVkaXRpb25zICYmIHhkLkwxLkVkaXRpb25GZWF0dXJlcy5Jc0xlZ2FjeVJlcXVpcmVkIHsKKwkJeGQuTDEuQ2FyZGluYWxpdHkgPSBwcm90b3JlZmxlY3QuUmVxdWlyZWQKKwl9CiAJaWYgcmF3VHlwZU5hbWUgIT0gbmlsIHsKIAkJbmFtZSA6PSBtYWtlRnVsbE5hbWUoc2IsIHJhd1R5cGVOYW1lKQogCQlzd2l0Y2ggeGQuTDEuS2luZCB7Ci0JCWNhc2UgcHJlZi5FbnVtS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuRW51bUtpbmQ6CiAJCQl4ZC5MMi5FbnVtID0gUGxhY2Vob2xkZXJFbnVtKG5hbWUpCi0JCWNhc2UgcHJlZi5NZXNzYWdlS2luZCwgcHJlZi5Hcm91cEtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0Lk1lc3NhZ2VLaW5kLCBwcm90b3JlZmxlY3QuR3JvdXBLaW5kOgogCQkJeGQuTDIuTWVzc2FnZSA9IFBsYWNlaG9sZGVyTWVzc2FnZShuYW1lKQogCQl9CiAJfQpAQCAtNTg5LDYgKzYxMCwxMyBAQAogCQkJY2FzZSBnZW5pZC5GaWVsZE9wdGlvbnNfUGFja2VkX2ZpZWxkX251bWJlcjoKIAkJCQl4ZC5MMi5Jc1BhY2tlZCA9IHByb3Rvd2lyZS5EZWNvZGVCb29sKHYpCiAJCQl9CisJCWNhc2UgcHJvdG93aXJlLkJ5dGVzVHlwZToKKwkJCXYsIG0gOj0gcHJvdG93aXJlLkNvbnN1bWVCeXRlcyhiKQorCQkJYiA9IGJbbTpdCisJCQlzd2l0Y2ggbnVtIHsKKwkJCWNhc2UgZ2VuaWQuRmllbGRPcHRpb25zX0ZlYXR1cmVzX2ZpZWxkX251bWJlcjoKKwkJCQl4ZC5MMS5FZGl0aW9uRmVhdHVyZXMgPSB1bm1hcnNoYWxGZWF0dXJlU2V0KHYsIHhkLkwxLkVkaXRpb25GZWF0dXJlcykKKwkJCX0KIAkJZGVmYXVsdDoKIAkJCW0gOj0gcHJvdG93aXJlLkNvbnN1bWVGaWVsZFZhbHVlKG51bSwgdHlwLCBiKQogCQkJYiA9IGJbbTpdCkBAIC02MjcsNyArNjU1LDcgQEAKIAlzZC5MMi5PcHRpb25zID0gc2QuTDAuUGFyZW50RmlsZS5idWlsZGVyLm9wdGlvbnNVbm1hcnNoYWxlcigmZGVzY29wdHMuU2VydmljZSwgcmF3T3B0aW9ucykKIH0KIAotZnVuYyAobWQgKk1ldGhvZCkgdW5tYXJzaGFsRnVsbChiIFtdYnl0ZSwgc2IgKnN0cnMuQnVpbGRlciwgcGYgKkZpbGUsIHBkIHByZWYuRGVzY3JpcHRvciwgaSBpbnQpIHsKK2Z1bmMgKG1kICpNZXRob2QpIHVubWFyc2hhbEZ1bGwoYiBbXWJ5dGUsIHNiICpzdHJzLkJ1aWxkZXIsIHBmICpGaWxlLCBwZCBwcm90b3JlZmxlY3QuRGVzY3JpcHRvciwgaSBpbnQpIHsKIAltZC5MMC5QYXJlbnRGaWxlID0gcGYKIAltZC5MMC5QYXJlbnQgPSBwZAogCW1kLkwwLkluZGV4ID0gaQpAQCAtNjgwLDE4ICs3MDgsMTggQEAKIC8vCiAvLyBUaGUgdHlwZSBvZiBtZXNzYWdlIHRvIHVubWFyc2hhbCB0byBpcyBwYXNzZWQgYXMgYSBwb2ludGVyIHNpbmNlIHRoZQogLy8gdmFycyBpbiBkZXNjb3B0cyBtYXkgbm90IHlldCBiZSBwb3B1bGF0ZWQgYXQgdGhlIHRpbWUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCi1mdW5jIChkYiAqQnVpbGRlcikgb3B0aW9uc1VubWFyc2hhbGVyKHAgKnByZWYuUHJvdG9NZXNzYWdlLCBiIFtdYnl0ZSkgZnVuYygpIHByZWYuUHJvdG9NZXNzYWdlIHsKK2Z1bmMgKGRiICpCdWlsZGVyKSBvcHRpb25zVW5tYXJzaGFsZXIocCAqcHJvdG9yZWZsZWN0LlByb3RvTWVzc2FnZSwgYiBbXWJ5dGUpIGZ1bmMoKSBwcm90b3JlZmxlY3QuUHJvdG9NZXNzYWdlIHsKIAlpZiBiID09IG5pbCB7CiAJCXJldHVybiBuaWwKIAl9Ci0JdmFyIG9wdHMgcHJlZi5Qcm90b01lc3NhZ2UKKwl2YXIgb3B0cyBwcm90b3JlZmxlY3QuUHJvdG9NZXNzYWdlCiAJdmFyIG9uY2Ugc3luYy5PbmNlCi0JcmV0dXJuIGZ1bmMoKSBwcmVmLlByb3RvTWVzc2FnZSB7CisJcmV0dXJuIGZ1bmMoKSBwcm90b3JlZmxlY3QuUHJvdG9NZXNzYWdlIHsKIAkJb25jZS5EbyhmdW5jKCkgewogCQkJaWYgKnAgPT0gbmlsIHsKIAkJCQlwYW5pYygiRGVzY3JpcHRvci5PcHRpb25zIGNhbGxlZCB3aXRob3V0IGltcG9ydGluZyB0aGUgZGVzY3JpcHRvciBwYWNrYWdlIikKIAkJCX0KLQkJCW9wdHMgPSByZWZsZWN0Lk5ldyhyZWZsZWN0LlR5cGVPZigqcCkuRWxlbSgpKS5JbnRlcmZhY2UoKS4ocHJlZi5Qcm90b01lc3NhZ2UpCisJCQlvcHRzID0gcmVmbGVjdC5OZXcocmVmbGVjdC5UeXBlT2YoKnApLkVsZW0oKSkuSW50ZXJmYWNlKCkuKHByb3RvcmVmbGVjdC5Qcm90b01lc3NhZ2UpCiAJCQlpZiBlcnIgOj0gKHByb3RvLlVubWFyc2hhbE9wdGlvbnN7CiAJCQkJQWxsb3dQYXJ0aWFsOiB0cnVlLAogCQkJCVJlc29sdmVyOiAgICAgZGIuVHlwZVJlc29sdmVyLApkaWZmIC0tZ2l0IGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ZpbGVkZXNjL2Rlc2NfbGlzdC5nbyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9maWxlZGVzYy9kZXNjX2xpc3QuZ28KaW5kZXggYWEyOTRmZi4uZTNiNjU4NyAxMDA2NDQKLS0tIGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ZpbGVkZXNjL2Rlc2NfbGlzdC5nbworKysgYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZmlsZWRlc2MvZGVzY19saXN0LmdvCkBAIC0xNywzMSArMTcsMzAgQEAKIAkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZXJyb3JzIgogCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9wcmFnbWEiCiAJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgotCXByZWYgImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgogKQogCi10eXBlIEZpbGVJbXBvcnRzIFtdcHJlZi5GaWxlSW1wb3J0Cit0eXBlIEZpbGVJbXBvcnRzIFtdcHJvdG9yZWZsZWN0LkZpbGVJbXBvcnQKIAogZnVuYyAocCAqRmlsZUltcG9ydHMpIExlbigpIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBsZW4oKnApIH0KLWZ1bmMgKHAgKkZpbGVJbXBvcnRzKSBHZXQoaSBpbnQpIHByZWYuRmlsZUltcG9ydCAgICAgICAgICAgeyByZXR1cm4gKCpwKVtpXSB9CitmdW5jIChwICpGaWxlSW1wb3J0cykgR2V0KGkgaW50KSBwcm90b3JlZmxlY3QuRmlsZUltcG9ydCAgIHsgcmV0dXJuICgqcClbaV0gfQogZnVuYyAocCAqRmlsZUltcG9ydHMpIEZvcm1hdChzIGZtdC5TdGF0ZSwgciBydW5lKSAgICAgICAgICB7IGRlc2NmbXQuRm9ybWF0TGlzdChzLCByLCBwKSB9CiBmdW5jIChwICpGaWxlSW1wb3J0cykgUHJvdG9JbnRlcm5hbChwcmFnbWEuRG9Ob3RJbXBsZW1lbnQpIHt9CiAKIHR5cGUgTmFtZXMgc3RydWN0IHsKLQlMaXN0IFtdcHJlZi5OYW1lCisJTGlzdCBbXXByb3RvcmVmbGVjdC5OYW1lCiAJb25jZSBzeW5jLk9uY2UKLQloYXMgIG1hcFtwcmVmLk5hbWVdaW50IC8vIHByb3RlY3RlZCBieSBvbmNlCisJaGFzICBtYXBbcHJvdG9yZWZsZWN0Lk5hbWVdaW50IC8vIHByb3RlY3RlZCBieSBvbmNlCiB9CiAKIGZ1bmMgKHAgKk5hbWVzKSBMZW4oKSBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gbGVuKHAuTGlzdCkgfQotZnVuYyAocCAqTmFtZXMpIEdldChpIGludCkgcHJlZi5OYW1lICAgICAgICAgICAgICAgICB7IHJldHVybiBwLkxpc3RbaV0gfQotZnVuYyAocCAqTmFtZXMpIEhhcyhzIHByZWYuTmFtZSkgYm9vbCAgICAgICAgICAgICAgICB7IHJldHVybiBwLmxhenlJbml0KCkuaGFzW3NdID4gMCB9CitmdW5jIChwICpOYW1lcykgR2V0KGkgaW50KSBwcm90b3JlZmxlY3QuTmFtZSAgICAgICAgIHsgcmV0dXJuIHAuTGlzdFtpXSB9CitmdW5jIChwICpOYW1lcykgSGFzKHMgcHJvdG9yZWZsZWN0Lk5hbWUpIGJvb2wgICAgICAgIHsgcmV0dXJuIHAubGF6eUluaXQoKS5oYXNbc10gPiAwIH0KIGZ1bmMgKHAgKk5hbWVzKSBGb3JtYXQocyBmbXQuU3RhdGUsIHIgcnVuZSkgICAgICAgICAgeyBkZXNjZm10LkZvcm1hdExpc3QocywgciwgcCkgfQogZnVuYyAocCAqTmFtZXMpIFByb3RvSW50ZXJuYWwocHJhZ21hLkRvTm90SW1wbGVtZW50KSB7fQogZnVuYyAocCAqTmFtZXMpIGxhenlJbml0KCkgKk5hbWVzIHsKIAlwLm9uY2UuRG8oZnVuYygpIHsKIAkJaWYgbGVuKHAuTGlzdCkgPiAwIHsKLQkJCXAuaGFzID0gbWFrZShtYXBbcHJlZi5OYW1lXWludCwgbGVuKHAuTGlzdCkpCisJCQlwLmhhcyA9IG1ha2UobWFwW3Byb3RvcmVmbGVjdC5OYW1lXWludCwgbGVuKHAuTGlzdCkpCiAJCQlmb3IgXywgcyA6PSByYW5nZSBwLkxpc3QgewogCQkJCXAuaGFzW3NdID0gcC5oYXNbc10gKyAxCiAJCQl9CkBAIC02NywxNCArNjYsMTQgQEAKIH0KIAogdHlwZSBFbnVtUmFuZ2VzIHN0cnVjdCB7Ci0JTGlzdCAgIFtdWzJdcHJlZi5FbnVtTnVtYmVyIC8vIHN0YXJ0IGluY2x1c2l2ZTsgZW5kIGluY2x1c2l2ZQorCUxpc3QgICBbXVsyXXByb3RvcmVmbGVjdC5FbnVtTnVtYmVyIC8vIHN0YXJ0IGluY2x1c2l2ZTsgZW5kIGluY2x1c2l2ZQogCW9uY2UgICBzeW5jLk9uY2UKLQlzb3J0ZWQgW11bMl1wcmVmLkVudW1OdW1iZXIgLy8gcHJvdGVjdGVkIGJ5IG9uY2UKKwlzb3J0ZWQgW11bMl1wcm90b3JlZmxlY3QuRW51bU51bWJlciAvLyBwcm90ZWN0ZWQgYnkgb25jZQogfQogCi1mdW5jIChwICpFbnVtUmFuZ2VzKSBMZW4oKSBpbnQgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBsZW4ocC5MaXN0KSB9Ci1mdW5jIChwICpFbnVtUmFuZ2VzKSBHZXQoaSBpbnQpIFsyXXByZWYuRW51bU51bWJlciB7IHJldHVybiBwLkxpc3RbaV0gfQotZnVuYyAocCAqRW51bVJhbmdlcykgSGFzKG4gcHJlZi5FbnVtTnVtYmVyKSBib29sIHsKK2Z1bmMgKHAgKkVudW1SYW5nZXMpIExlbigpIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gbGVuKHAuTGlzdCkgfQorZnVuYyAocCAqRW51bVJhbmdlcykgR2V0KGkgaW50KSBbMl1wcm90b3JlZmxlY3QuRW51bU51bWJlciB7IHJldHVybiBwLkxpc3RbaV0gfQorZnVuYyAocCAqRW51bVJhbmdlcykgSGFzKG4gcHJvdG9yZWZsZWN0LkVudW1OdW1iZXIpIGJvb2wgewogCWZvciBscyA6PSBwLmxhenlJbml0KCkuc29ydGVkOyBsZW4obHMpID4gMDsgewogCQlpIDo9IGxlbihscykgLyAyCiAJCXN3aXRjaCByIDo9IGVudW1SYW5nZShsc1tpXSk7IHsKQEAgLTEyOSwxNCArMTI4LDE0IEBACiB9CiAKIHR5cGUgRmllbGRSYW5nZXMgc3RydWN0IHsKLQlMaXN0ICAgW11bMl1wcmVmLkZpZWxkTnVtYmVyIC8vIHN0YXJ0IGluY2x1c2l2ZTsgZW5kIGV4Y2x1c2l2ZQorCUxpc3QgICBbXVsyXXByb3RvcmVmbGVjdC5GaWVsZE51bWJlciAvLyBzdGFydCBpbmNsdXNpdmU7IGVuZCBleGNsdXNpdmUKIAlvbmNlICAgc3luYy5PbmNlCi0Jc29ydGVkIFtdWzJdcHJlZi5GaWVsZE51bWJlciAvLyBwcm90ZWN0ZWQgYnkgb25jZQorCXNvcnRlZCBbXVsyXXByb3RvcmVmbGVjdC5GaWVsZE51bWJlciAvLyBwcm90ZWN0ZWQgYnkgb25jZQogfQogCi1mdW5jIChwICpGaWVsZFJhbmdlcykgTGVuKCkgaW50ICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGxlbihwLkxpc3QpIH0KLWZ1bmMgKHAgKkZpZWxkUmFuZ2VzKSBHZXQoaSBpbnQpIFsyXXByZWYuRmllbGROdW1iZXIgeyByZXR1cm4gcC5MaXN0W2ldIH0KLWZ1bmMgKHAgKkZpZWxkUmFuZ2VzKSBIYXMobiBwcmVmLkZpZWxkTnVtYmVyKSBib29sIHsKK2Z1bmMgKHAgKkZpZWxkUmFuZ2VzKSBMZW4oKSBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBsZW4ocC5MaXN0KSB9CitmdW5jIChwICpGaWVsZFJhbmdlcykgR2V0KGkgaW50KSBbMl1wcm90b3JlZmxlY3QuRmllbGROdW1iZXIgeyByZXR1cm4gcC5MaXN0W2ldIH0KK2Z1bmMgKHAgKkZpZWxkUmFuZ2VzKSBIYXMobiBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIpIGJvb2wgewogCWZvciBscyA6PSBwLmxhenlJbml0KCkuc29ydGVkOyBsZW4obHMpID4gMDsgewogCQlpIDo9IGxlbihscykgLyAyCiAJCXN3aXRjaCByIDo9IGZpZWxkUmFuZ2UobHNbaV0pOyB7CkBAIC0yMjEsMTcgKzIyMCwxNyBAQAogfQogCiB0eXBlIEZpZWxkTnVtYmVycyBzdHJ1Y3QgewotCUxpc3QgW11wcmVmLkZpZWxkTnVtYmVyCisJTGlzdCBbXXByb3RvcmVmbGVjdC5GaWVsZE51bWJlcgogCW9uY2Ugc3luYy5PbmNlCi0JaGFzICBtYXBbcHJlZi5GaWVsZE51bWJlcl1zdHJ1Y3R7fSAvLyBwcm90ZWN0ZWQgYnkgb25jZQorCWhhcyAgbWFwW3Byb3RvcmVmbGVjdC5GaWVsZE51bWJlcl1zdHJ1Y3R7fSAvLyBwcm90ZWN0ZWQgYnkgb25jZQogfQogCi1mdW5jIChwICpGaWVsZE51bWJlcnMpIExlbigpIGludCAgICAgICAgICAgICAgICAgICB7IHJldHVybiBsZW4ocC5MaXN0KSB9Ci1mdW5jIChwICpGaWVsZE51bWJlcnMpIEdldChpIGludCkgcHJlZi5GaWVsZE51bWJlciB7IHJldHVybiBwLkxpc3RbaV0gfQotZnVuYyAocCAqRmllbGROdW1iZXJzKSBIYXMobiBwcmVmLkZpZWxkTnVtYmVyKSBib29sIHsKK2Z1bmMgKHAgKkZpZWxkTnVtYmVycykgTGVuKCkgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gbGVuKHAuTGlzdCkgfQorZnVuYyAocCAqRmllbGROdW1iZXJzKSBHZXQoaSBpbnQpIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciB7IHJldHVybiBwLkxpc3RbaV0gfQorZnVuYyAocCAqRmllbGROdW1iZXJzKSBIYXMobiBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIpIGJvb2wgewogCXAub25jZS5EbyhmdW5jKCkgewogCQlpZiBsZW4ocC5MaXN0KSA+IDAgewotCQkJcC5oYXMgPSBtYWtlKG1hcFtwcmVmLkZpZWxkTnVtYmVyXXN0cnVjdHt9LCBsZW4ocC5MaXN0KSkKKwkJCXAuaGFzID0gbWFrZShtYXBbcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyXXN0cnVjdHt9LCBsZW4ocC5MaXN0KSkKIAkJCWZvciBfLCBuIDo9IHJhbmdlIHAuTGlzdCB7CiAJCQkJcC5oYXNbbl0gPSBzdHJ1Y3R7fXt9CiAJCQl9CkBAIC0yNDQsMzAgKzI0MywzOCBAQAogZnVuYyAocCAqRmllbGROdW1iZXJzKSBQcm90b0ludGVybmFsKHByYWdtYS5Eb05vdEltcGxlbWVudCkge30KIAogdHlwZSBPbmVvZkZpZWxkcyBzdHJ1Y3QgewotCUxpc3QgICBbXXByZWYuRmllbGREZXNjcmlwdG9yCisJTGlzdCAgIFtdcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvcgogCW9uY2UgICBzeW5jLk9uY2UKLQlieU5hbWUgbWFwW3ByZWYuTmFtZV1wcmVmLkZpZWxkRGVzY3JpcHRvciAgICAgICAgLy8gcHJvdGVjdGVkIGJ5IG9uY2UKLQlieUpTT04gbWFwW3N0cmluZ11wcmVmLkZpZWxkRGVzY3JpcHRvciAgICAgICAgICAgLy8gcHJvdGVjdGVkIGJ5IG9uY2UKLQlieVRleHQgbWFwW3N0cmluZ11wcmVmLkZpZWxkRGVzY3JpcHRvciAgICAgICAgICAgLy8gcHJvdGVjdGVkIGJ5IG9uY2UKLQlieU51bSAgbWFwW3ByZWYuRmllbGROdW1iZXJdcHJlZi5GaWVsZERlc2NyaXB0b3IgLy8gcHJvdGVjdGVkIGJ5IG9uY2UKKwlieU5hbWUgbWFwW3Byb3RvcmVmbGVjdC5OYW1lXXByb3RvcmVmbGVjdC5GaWVsZERlc2NyaXB0b3IgICAgICAgIC8vIHByb3RlY3RlZCBieSBvbmNlCisJYnlKU09OIG1hcFtzdHJpbmddcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvciAgICAgICAgICAgICAgICAgICAvLyBwcm90ZWN0ZWQgYnkgb25jZQorCWJ5VGV4dCBtYXBbc3RyaW5nXXByb3RvcmVmbGVjdC5GaWVsZERlc2NyaXB0b3IgICAgICAgICAgICAgICAgICAgLy8gcHJvdGVjdGVkIGJ5IG9uY2UKKwlieU51bSAgbWFwW3Byb3RvcmVmbGVjdC5GaWVsZE51bWJlcl1wcm90b3JlZmxlY3QuRmllbGREZXNjcmlwdG9yIC8vIHByb3RlY3RlZCBieSBvbmNlCiB9CiAKLWZ1bmMgKHAgKk9uZW9mRmllbGRzKSBMZW4oKSBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGxlbihwLkxpc3QpIH0KLWZ1bmMgKHAgKk9uZW9mRmllbGRzKSBHZXQoaSBpbnQpIHByZWYuRmllbGREZXNjcmlwdG9yICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHAuTGlzdFtpXSB9Ci1mdW5jIChwICpPbmVvZkZpZWxkcykgQnlOYW1lKHMgcHJlZi5OYW1lKSBwcmVmLkZpZWxkRGVzY3JpcHRvciAgICAgICAgICB7IHJldHVybiBwLmxhenlJbml0KCkuYnlOYW1lW3NdIH0KLWZ1bmMgKHAgKk9uZW9mRmllbGRzKSBCeUpTT05OYW1lKHMgc3RyaW5nKSBwcmVmLkZpZWxkRGVzY3JpcHRvciAgICAgICAgIHsgcmV0dXJuIHAubGF6eUluaXQoKS5ieUpTT05bc10gfQotZnVuYyAocCAqT25lb2ZGaWVsZHMpIEJ5VGV4dE5hbWUocyBzdHJpbmcpIHByZWYuRmllbGREZXNjcmlwdG9yICAgICAgICAgeyByZXR1cm4gcC5sYXp5SW5pdCgpLmJ5VGV4dFtzXSB9Ci1mdW5jIChwICpPbmVvZkZpZWxkcykgQnlOdW1iZXIobiBwcmVmLkZpZWxkTnVtYmVyKSBwcmVmLkZpZWxkRGVzY3JpcHRvciB7IHJldHVybiBwLmxhenlJbml0KCkuYnlOdW1bbl0gfQotZnVuYyAocCAqT25lb2ZGaWVsZHMpIEZvcm1hdChzIGZtdC5TdGF0ZSwgciBydW5lKSAgICAgICAgICAgICAgICAgICAgICAgeyBkZXNjZm10LkZvcm1hdExpc3QocywgciwgcCkgfQotZnVuYyAocCAqT25lb2ZGaWVsZHMpIFByb3RvSW50ZXJuYWwocHJhZ21hLkRvTm90SW1wbGVtZW50KSAgICAgICAgICAgICAge30KK2Z1bmMgKHAgKk9uZW9mRmllbGRzKSBMZW4oKSBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gbGVuKHAuTGlzdCkgfQorZnVuYyAocCAqT25lb2ZGaWVsZHMpIEdldChpIGludCkgcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvciB7IHJldHVybiBwLkxpc3RbaV0gfQorZnVuYyAocCAqT25lb2ZGaWVsZHMpIEJ5TmFtZShzIHByb3RvcmVmbGVjdC5OYW1lKSBwcm90b3JlZmxlY3QuRmllbGREZXNjcmlwdG9yIHsKKwlyZXR1cm4gcC5sYXp5SW5pdCgpLmJ5TmFtZVtzXQorfQorZnVuYyAocCAqT25lb2ZGaWVsZHMpIEJ5SlNPTk5hbWUocyBzdHJpbmcpIHByb3RvcmVmbGVjdC5GaWVsZERlc2NyaXB0b3IgeworCXJldHVybiBwLmxhenlJbml0KCkuYnlKU09OW3NdCit9CitmdW5jIChwICpPbmVvZkZpZWxkcykgQnlUZXh0TmFtZShzIHN0cmluZykgcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvciB7CisJcmV0dXJuIHAubGF6eUluaXQoKS5ieVRleHRbc10KK30KK2Z1bmMgKHAgKk9uZW9mRmllbGRzKSBCeU51bWJlcihuIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlcikgcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvciB7CisJcmV0dXJuIHAubGF6eUluaXQoKS5ieU51bVtuXQorfQorZnVuYyAocCAqT25lb2ZGaWVsZHMpIEZvcm1hdChzIGZtdC5TdGF0ZSwgciBydW5lKSAgICAgICAgICB7IGRlc2NmbXQuRm9ybWF0TGlzdChzLCByLCBwKSB9CitmdW5jIChwICpPbmVvZkZpZWxkcykgUHJvdG9JbnRlcm5hbChwcmFnbWEuRG9Ob3RJbXBsZW1lbnQpIHt9CiAKIGZ1bmMgKHAgKk9uZW9mRmllbGRzKSBsYXp5SW5pdCgpICpPbmVvZkZpZWxkcyB7CiAJcC5vbmNlLkRvKGZ1bmMoKSB7CiAJCWlmIGxlbihwLkxpc3QpID4gMCB7Ci0JCQlwLmJ5TmFtZSA9IG1ha2UobWFwW3ByZWYuTmFtZV1wcmVmLkZpZWxkRGVzY3JpcHRvciwgbGVuKHAuTGlzdCkpCi0JCQlwLmJ5SlNPTiA9IG1ha2UobWFwW3N0cmluZ11wcmVmLkZpZWxkRGVzY3JpcHRvciwgbGVuKHAuTGlzdCkpCi0JCQlwLmJ5VGV4dCA9IG1ha2UobWFwW3N0cmluZ11wcmVmLkZpZWxkRGVzY3JpcHRvciwgbGVuKHAuTGlzdCkpCi0JCQlwLmJ5TnVtID0gbWFrZShtYXBbcHJlZi5GaWVsZE51bWJlcl1wcmVmLkZpZWxkRGVzY3JpcHRvciwgbGVuKHAuTGlzdCkpCisJCQlwLmJ5TmFtZSA9IG1ha2UobWFwW3Byb3RvcmVmbGVjdC5OYW1lXXByb3RvcmVmbGVjdC5GaWVsZERlc2NyaXB0b3IsIGxlbihwLkxpc3QpKQorCQkJcC5ieUpTT04gPSBtYWtlKG1hcFtzdHJpbmddcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvciwgbGVuKHAuTGlzdCkpCisJCQlwLmJ5VGV4dCA9IG1ha2UobWFwW3N0cmluZ11wcm90b3JlZmxlY3QuRmllbGREZXNjcmlwdG9yLCBsZW4ocC5MaXN0KSkKKwkJCXAuYnlOdW0gPSBtYWtlKG1hcFtwcm90b3JlZmxlY3QuRmllbGROdW1iZXJdcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvciwgbGVuKHAuTGlzdCkpCiAJCQlmb3IgXywgZiA6PSByYW5nZSBwLkxpc3QgewogCQkJCS8vIEZpZWxkIG5hbWVzIGFuZCBudW1iZXJzIGFyZSBndWFyYW50ZWVkIHRvIGJlIHVuaXF1ZS4KIAkJCQlwLmJ5TmFtZVtmLk5hbWUoKV0gPSBmCkBAIC0yODQsMTIzICsyOTEsMTIzIEBACiAJLy8gTGlzdCBpcyBhIGxpc3Qgb2YgU291cmNlTG9jYXRpb25zLgogCS8vIFRoZSBTb3VyY2VMb2NhdGlvbi5OZXh0IGZpZWxkIGRvZXMgbm90IG5lZWQgdG8gYmUgcG9wdWxhdGVkCiAJLy8gYXMgaXQgd2lsbCBiZSBsYXppbHkgcG9wdWxhdGVkIHVwb24gZmlyc3QgbmVlZC4KLQlMaXN0IFtdcHJlZi5Tb3VyY2VMb2NhdGlvbgorCUxpc3QgW11wcm90b3JlZmxlY3QuU291cmNlTG9jYXRpb24KIAogCS8vIEZpbGUgaXMgdGhlIHBhcmVudCBmaWxlIGRlc2NyaXB0b3IgdGhhdCB0aGVzZSBsb2NhdGlvbnMgYXJlIHJlbGF0aXZlIHRvLgogCS8vIElmIG5vbi1uaWwsIEJ5RGVzY3JpcHRvciB2ZXJpZmllcyB0aGF0IHRoZSBwcm92aWRlZCBkZXNjcmlwdG9yCiAJLy8gaXMgYSBjaGlsZCBvZiB0aGlzIGZpbGUgZGVzY3JpcHRvci4KLQlGaWxlIHByZWYuRmlsZURlc2NyaXB0b3IKKwlGaWxlIHByb3RvcmVmbGVjdC5GaWxlRGVzY3JpcHRvcgogCiAJb25jZSAgIHN5bmMuT25jZQogCWJ5UGF0aCBtYXBbcGF0aEtleV1pbnQKIH0KIAotZnVuYyAocCAqU291cmNlTG9jYXRpb25zKSBMZW4oKSBpbnQgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gbGVuKHAuTGlzdCkgfQotZnVuYyAocCAqU291cmNlTG9jYXRpb25zKSBHZXQoaSBpbnQpIHByZWYuU291cmNlTG9jYXRpb24geyByZXR1cm4gcC5sYXp5SW5pdCgpLkxpc3RbaV0gfQotZnVuYyAocCAqU291cmNlTG9jYXRpb25zKSBieUtleShrIHBhdGhLZXkpIHByZWYuU291cmNlTG9jYXRpb24geworZnVuYyAocCAqU291cmNlTG9jYXRpb25zKSBMZW4oKSBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBsZW4ocC5MaXN0KSB9CitmdW5jIChwICpTb3VyY2VMb2NhdGlvbnMpIEdldChpIGludCkgcHJvdG9yZWZsZWN0LlNvdXJjZUxvY2F0aW9uIHsgcmV0dXJuIHAubGF6eUluaXQoKS5MaXN0W2ldIH0KK2Z1bmMgKHAgKlNvdXJjZUxvY2F0aW9ucykgYnlLZXkoayBwYXRoS2V5KSBwcm90b3JlZmxlY3QuU291cmNlTG9jYXRpb24gewogCWlmIGksIG9rIDo9IHAubGF6eUluaXQoKS5ieVBhdGhba107IG9rIHsKIAkJcmV0dXJuIHAuTGlzdFtpXQogCX0KLQlyZXR1cm4gcHJlZi5Tb3VyY2VMb2NhdGlvbnt9CisJcmV0dXJuIHByb3RvcmVmbGVjdC5Tb3VyY2VMb2NhdGlvbnt9CiB9Ci1mdW5jIChwICpTb3VyY2VMb2NhdGlvbnMpIEJ5UGF0aChwYXRoIHByZWYuU291cmNlUGF0aCkgcHJlZi5Tb3VyY2VMb2NhdGlvbiB7CitmdW5jIChwICpTb3VyY2VMb2NhdGlvbnMpIEJ5UGF0aChwYXRoIHByb3RvcmVmbGVjdC5Tb3VyY2VQYXRoKSBwcm90b3JlZmxlY3QuU291cmNlTG9jYXRpb24gewogCXJldHVybiBwLmJ5S2V5KG5ld1BhdGhLZXkocGF0aCkpCiB9Ci1mdW5jIChwICpTb3VyY2VMb2NhdGlvbnMpIEJ5RGVzY3JpcHRvcihkZXNjIHByZWYuRGVzY3JpcHRvcikgcHJlZi5Tb3VyY2VMb2NhdGlvbiB7CitmdW5jIChwICpTb3VyY2VMb2NhdGlvbnMpIEJ5RGVzY3JpcHRvcihkZXNjIHByb3RvcmVmbGVjdC5EZXNjcmlwdG9yKSBwcm90b3JlZmxlY3QuU291cmNlTG9jYXRpb24gewogCWlmIHAuRmlsZSAhPSBuaWwgJiYgZGVzYyAhPSBuaWwgJiYgcC5GaWxlICE9IGRlc2MuUGFyZW50RmlsZSgpIHsKLQkJcmV0dXJuIHByZWYuU291cmNlTG9jYXRpb257fSAvLyBtaXNtYXRjaGluZyBwYXJlbnQgZmlsZXMKKwkJcmV0dXJuIHByb3RvcmVmbGVjdC5Tb3VyY2VMb2NhdGlvbnt9IC8vIG1pc21hdGNoaW5nIHBhcmVudCBmaWxlcwogCX0KIAl2YXIgcGF0aEFyciBbMTZdaW50MzIKIAlwYXRoIDo9IHBhdGhBcnJbOjBdCiAJZm9yIHsKIAkJc3dpdGNoIGRlc2MuKHR5cGUpIHsKLQkJY2FzZSBwcmVmLkZpbGVEZXNjcmlwdG9yOgorCQljYXNlIHByb3RvcmVmbGVjdC5GaWxlRGVzY3JpcHRvcjoKIAkJCS8vIFJldmVyc2UgdGhlIHBhdGggc2luY2UgaXQgd2FzIGNvbnN0cnVjdGVkIGluIHJldmVyc2UuCiAJCQlmb3IgaSwgaiA6PSAwLCBsZW4ocGF0aCktMTsgaSA8IGo7IGksIGogPSBpKzEsIGotMSB7CiAJCQkJcGF0aFtpXSwgcGF0aFtqXSA9IHBhdGhbal0sIHBhdGhbaV0KIAkJCX0KIAkJCXJldHVybiBwLmJ5S2V5KG5ld1BhdGhLZXkocGF0aCkpCi0JCWNhc2UgcHJlZi5NZXNzYWdlRGVzY3JpcHRvcjoKKwkJY2FzZSBwcm90b3JlZmxlY3QuTWVzc2FnZURlc2NyaXB0b3I6CiAJCQlwYXRoID0gYXBwZW5kKHBhdGgsIGludDMyKGRlc2MuSW5kZXgoKSkpCiAJCQlkZXNjID0gZGVzYy5QYXJlbnQoKQogCQkJc3dpdGNoIGRlc2MuKHR5cGUpIHsKLQkJCWNhc2UgcHJlZi5GaWxlRGVzY3JpcHRvcjoKKwkJCWNhc2UgcHJvdG9yZWZsZWN0LkZpbGVEZXNjcmlwdG9yOgogCQkJCXBhdGggPSBhcHBlbmQocGF0aCwgaW50MzIoZ2VuaWQuRmlsZURlc2NyaXB0b3JQcm90b19NZXNzYWdlVHlwZV9maWVsZF9udW1iZXIpKQotCQkJY2FzZSBwcmVmLk1lc3NhZ2VEZXNjcmlwdG9yOgorCQkJY2FzZSBwcm90b3JlZmxlY3QuTWVzc2FnZURlc2NyaXB0b3I6CiAJCQkJcGF0aCA9IGFwcGVuZChwYXRoLCBpbnQzMihnZW5pZC5EZXNjcmlwdG9yUHJvdG9fTmVzdGVkVHlwZV9maWVsZF9udW1iZXIpKQogCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gcHJlZi5Tb3VyY2VMb2NhdGlvbnt9CisJCQkJcmV0dXJuIHByb3RvcmVmbGVjdC5Tb3VyY2VMb2NhdGlvbnt9CiAJCQl9Ci0JCWNhc2UgcHJlZi5GaWVsZERlc2NyaXB0b3I6Ci0JCQlpc0V4dGVuc2lvbiA6PSBkZXNjLihwcmVmLkZpZWxkRGVzY3JpcHRvcikuSXNFeHRlbnNpb24oKQorCQljYXNlIHByb3RvcmVmbGVjdC5GaWVsZERlc2NyaXB0b3I6CisJCQlpc0V4dGVuc2lvbiA6PSBkZXNjLihwcm90b3JlZmxlY3QuRmllbGREZXNjcmlwdG9yKS5Jc0V4dGVuc2lvbigpCiAJCQlwYXRoID0gYXBwZW5kKHBhdGgsIGludDMyKGRlc2MuSW5kZXgoKSkpCiAJCQlkZXNjID0gZGVzYy5QYXJlbnQoKQogCQkJaWYgaXNFeHRlbnNpb24gewogCQkJCXN3aXRjaCBkZXNjLih0eXBlKSB7Ci0JCQkJY2FzZSBwcmVmLkZpbGVEZXNjcmlwdG9yOgorCQkJCWNhc2UgcHJvdG9yZWZsZWN0LkZpbGVEZXNjcmlwdG9yOgogCQkJCQlwYXRoID0gYXBwZW5kKHBhdGgsIGludDMyKGdlbmlkLkZpbGVEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uX2ZpZWxkX251bWJlcikpCi0JCQkJY2FzZSBwcmVmLk1lc3NhZ2VEZXNjcmlwdG9yOgorCQkJCWNhc2UgcHJvdG9yZWZsZWN0Lk1lc3NhZ2VEZXNjcmlwdG9yOgogCQkJCQlwYXRoID0gYXBwZW5kKHBhdGgsIGludDMyKGdlbmlkLkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25fZmllbGRfbnVtYmVyKSkKIAkJCQlkZWZhdWx0OgotCQkJCQlyZXR1cm4gcHJlZi5Tb3VyY2VMb2NhdGlvbnt9CisJCQkJCXJldHVybiBwcm90b3JlZmxlY3QuU291cmNlTG9jYXRpb257fQogCQkJCX0KIAkJCX0gZWxzZSB7CiAJCQkJc3dpdGNoIGRlc2MuKHR5cGUpIHsKLQkJCQljYXNlIHByZWYuTWVzc2FnZURlc2NyaXB0b3I6CisJCQkJY2FzZSBwcm90b3JlZmxlY3QuTWVzc2FnZURlc2NyaXB0b3I6CiAJCQkJCXBhdGggPSBhcHBlbmQocGF0aCwgaW50MzIoZ2VuaWQuRGVzY3JpcHRvclByb3RvX0ZpZWxkX2ZpZWxkX251bWJlcikpCiAJCQkJZGVmYXVsdDoKLQkJCQkJcmV0dXJuIHByZWYuU291cmNlTG9jYXRpb257fQorCQkJCQlyZXR1cm4gcHJvdG9yZWZsZWN0LlNvdXJjZUxvY2F0aW9ue30KIAkJCQl9CiAJCQl9Ci0JCWNhc2UgcHJlZi5PbmVvZkRlc2NyaXB0b3I6CisJCWNhc2UgcHJvdG9yZWZsZWN0Lk9uZW9mRGVzY3JpcHRvcjoKIAkJCXBhdGggPSBhcHBlbmQocGF0aCwgaW50MzIoZGVzYy5JbmRleCgpKSkKIAkJCWRlc2MgPSBkZXNjLlBhcmVudCgpCiAJCQlzd2l0Y2ggZGVzYy4odHlwZSkgewotCQkJY2FzZSBwcmVmLk1lc3NhZ2VEZXNjcmlwdG9yOgorCQkJY2FzZSBwcm90b3JlZmxlY3QuTWVzc2FnZURlc2NyaXB0b3I6CiAJCQkJcGF0aCA9IGFwcGVuZChwYXRoLCBpbnQzMihnZW5pZC5EZXNjcmlwdG9yUHJvdG9fT25lb2ZEZWNsX2ZpZWxkX251bWJlcikpCiAJCQlkZWZhdWx0OgotCQkJCXJldHVybiBwcmVmLlNvdXJjZUxvY2F0aW9ue30KKwkJCQlyZXR1cm4gcHJvdG9yZWZsZWN0LlNvdXJjZUxvY2F0aW9ue30KIAkJCX0KLQkJY2FzZSBwcmVmLkVudW1EZXNjcmlwdG9yOgorCQljYXNlIHByb3RvcmVmbGVjdC5FbnVtRGVzY3JpcHRvcjoKIAkJCXBhdGggPSBhcHBlbmQocGF0aCwgaW50MzIoZGVzYy5JbmRleCgpKSkKIAkJCWRlc2MgPSBkZXNjLlBhcmVudCgpCiAJCQlzd2l0Y2ggZGVzYy4odHlwZSkgewotCQkJY2FzZSBwcmVmLkZpbGVEZXNjcmlwdG9yOgorCQkJY2FzZSBwcm90b3JlZmxlY3QuRmlsZURlc2NyaXB0b3I6CiAJCQkJcGF0aCA9IGFwcGVuZChwYXRoLCBpbnQzMihnZW5pZC5GaWxlRGVzY3JpcHRvclByb3RvX0VudW1UeXBlX2ZpZWxkX251bWJlcikpCi0JCQljYXNlIHByZWYuTWVzc2FnZURlc2NyaXB0b3I6CisJCQljYXNlIHByb3RvcmVmbGVjdC5NZXNzYWdlRGVzY3JpcHRvcjoKIAkJCQlwYXRoID0gYXBwZW5kKHBhdGgsIGludDMyKGdlbmlkLkRlc2NyaXB0b3JQcm90b19FbnVtVHlwZV9maWVsZF9udW1iZXIpKQogCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gcHJlZi5Tb3VyY2VMb2NhdGlvbnt9CisJCQkJcmV0dXJuIHByb3RvcmVmbGVjdC5Tb3VyY2VMb2NhdGlvbnt9CiAJCQl9Ci0JCWNhc2UgcHJlZi5FbnVtVmFsdWVEZXNjcmlwdG9yOgorCQljYXNlIHByb3RvcmVmbGVjdC5FbnVtVmFsdWVEZXNjcmlwdG9yOgogCQkJcGF0aCA9IGFwcGVuZChwYXRoLCBpbnQzMihkZXNjLkluZGV4KCkpKQogCQkJZGVzYyA9IGRlc2MuUGFyZW50KCkKIAkJCXN3aXRjaCBkZXNjLih0eXBlKSB7Ci0JCQljYXNlIHByZWYuRW51bURlc2NyaXB0b3I6CisJCQljYXNlIHByb3RvcmVmbGVjdC5FbnVtRGVzY3JpcHRvcjoKIAkJCQlwYXRoID0gYXBwZW5kKHBhdGgsIGludDMyKGdlbmlkLkVudW1EZXNjcmlwdG9yUHJvdG9fVmFsdWVfZmllbGRfbnVtYmVyKSkKIAkJCWRlZmF1bHQ6Ci0JCQkJcmV0dXJuIHByZWYuU291cmNlTG9jYXRpb257fQorCQkJCXJldHVybiBwcm90b3JlZmxlY3QuU291cmNlTG9jYXRpb257fQogCQkJfQotCQljYXNlIHByZWYuU2VydmljZURlc2NyaXB0b3I6CisJCWNhc2UgcHJvdG9yZWZsZWN0LlNlcnZpY2VEZXNjcmlwdG9yOgogCQkJcGF0aCA9IGFwcGVuZChwYXRoLCBpbnQzMihkZXNjLkluZGV4KCkpKQogCQkJZGVzYyA9IGRlc2MuUGFyZW50KCkKIAkJCXN3aXRjaCBkZXNjLih0eXBlKSB7Ci0JCQljYXNlIHByZWYuRmlsZURlc2NyaXB0b3I6CisJCQljYXNlIHByb3RvcmVmbGVjdC5GaWxlRGVzY3JpcHRvcjoKIAkJCQlwYXRoID0gYXBwZW5kKHBhdGgsIGludDMyKGdlbmlkLkZpbGVEZXNjcmlwdG9yUHJvdG9fU2VydmljZV9maWVsZF9udW1iZXIpKQogCQkJZGVmYXVsdDoKLQkJCQlyZXR1cm4gcHJlZi5Tb3VyY2VMb2NhdGlvbnt9CisJCQkJcmV0dXJuIHByb3RvcmVmbGVjdC5Tb3VyY2VMb2NhdGlvbnt9CiAJCQl9Ci0JCWNhc2UgcHJlZi5NZXRob2REZXNjcmlwdG9yOgorCQljYXNlIHByb3RvcmVmbGVjdC5NZXRob2REZXNjcmlwdG9yOgogCQkJcGF0aCA9IGFwcGVuZChwYXRoLCBpbnQzMihkZXNjLkluZGV4KCkpKQogCQkJZGVzYyA9IGRlc2MuUGFyZW50KCkKIAkJCXN3aXRjaCBkZXNjLih0eXBlKSB7Ci0JCQljYXNlIHByZWYuU2VydmljZURlc2NyaXB0b3I6CisJCQljYXNlIHByb3RvcmVmbGVjdC5TZXJ2aWNlRGVzY3JpcHRvcjoKIAkJCQlwYXRoID0gYXBwZW5kKHBhdGgsIGludDMyKGdlbmlkLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG9fTWV0aG9kX2ZpZWxkX251bWJlcikpCiAJCQlkZWZhdWx0OgotCQkJCXJldHVybiBwcmVmLlNvdXJjZUxvY2F0aW9ue30KKwkJCQlyZXR1cm4gcHJvdG9yZWZsZWN0LlNvdXJjZUxvY2F0aW9ue30KIAkJCX0KIAkJZGVmYXVsdDoKLQkJCXJldHVybiBwcmVmLlNvdXJjZUxvY2F0aW9ue30KKwkJCXJldHVybiBwcm90b3JlZmxlY3QuU291cmNlTG9jYXRpb257fQogCQl9CiAJfQogfQpAQCAtNDM1LDcgKzQ0Miw3IEBACiAJc3RyIHN0cmluZyAgICAvLyB1c2VkIGlmIHRoZSBwYXRoIGRvZXMgbm90IGZpdCBpbiBhcnIKIH0KIAotZnVuYyBuZXdQYXRoS2V5KHAgcHJlZi5Tb3VyY2VQYXRoKSAoayBwYXRoS2V5KSB7CitmdW5jIG5ld1BhdGhLZXkocCBwcm90b3JlZmxlY3QuU291cmNlUGF0aCkgKGsgcGF0aEtleSkgewogCWlmIGxlbihwKSA8IGxlbihrLmFycikgewogCQlmb3IgaSwgcHMgOj0gcmFuZ2UgcCB7CiAJCQlpZiBwcyA8IDAgfHwgbWF0aC5NYXhVaW50OCA8PSBwcyB7CmRpZmYgLS1naXQgYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZmlsZWRlc2MvZWRpdGlvbnMuZ28gYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZmlsZWRlc2MvZWRpdGlvbnMuZ28KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM3NWE0OQotLS0gL2Rldi9udWxsCisrKyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9maWxlZGVzYy9lZGl0aW9ucy5nbwpAQCAtMCwwICsxLDE0MiBAQAorLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEdvIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZQorLy8gbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCitwYWNrYWdlIGZpbGVkZXNjCisKK2ltcG9ydCAoCisJImZtdCIKKworCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9lbmNvZGluZy9wcm90b3dpcmUiCisJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2VkaXRpb25kZWZhdWx0cyIKKwkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZ2VuaWQiCisJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgorKQorCit2YXIgZGVmYXVsdHNDYWNoZSA9IG1ha2UobWFwW0VkaXRpb25dRWRpdGlvbkZlYXR1cmVzKQorCitmdW5jIGluaXQoKSB7CisJdW5tYXJzaGFsRWRpdGlvbkRlZmF1bHRzKGVkaXRpb25kZWZhdWx0cy5EZWZhdWx0cykKK30KKworZnVuYyB1bm1hcnNoYWxHb0ZlYXR1cmUoYiBbXWJ5dGUsIHBhcmVudCBFZGl0aW9uRmVhdHVyZXMpIEVkaXRpb25GZWF0dXJlcyB7CisJZm9yIGxlbihiKSA+IDAgeworCQludW0sIF8sIG4gOj0gcHJvdG93aXJlLkNvbnN1bWVUYWcoYikKKwkJYiA9IGJbbjpdCisJCXN3aXRjaCBudW0geworCQljYXNlIGdlbmlkLkdvRmVhdHVyZXNfTGVnYWN5VW5tYXJzaGFsSnNvbkVudW1fZmllbGRfbnVtYmVyOgorCQkJdiwgbSA6PSBwcm90b3dpcmUuQ29uc3VtZVZhcmludChiKQorCQkJYiA9IGJbbTpdCisJCQlwYXJlbnQuR2VuZXJhdGVMZWdhY3lVbm1hcnNoYWxKU09OID0gcHJvdG93aXJlLkRlY29kZUJvb2wodikKKwkJZGVmYXVsdDoKKwkJCXBhbmljKGZtdC5TcHJpbnRmKCJ1bmtvd24gZmllbGQgbnVtYmVyICVkIHdoaWxlIHVubWFyc2hhbGxpbmcgR29GZWF0dXJlcyIsIG51bSkpCisJCX0KKwl9CisJcmV0dXJuIHBhcmVudAorfQorCitmdW5jIHVubWFyc2hhbEZlYXR1cmVTZXQoYiBbXWJ5dGUsIHBhcmVudCBFZGl0aW9uRmVhdHVyZXMpIEVkaXRpb25GZWF0dXJlcyB7CisJZm9yIGxlbihiKSA+IDAgeworCQludW0sIHR5cCwgbiA6PSBwcm90b3dpcmUuQ29uc3VtZVRhZyhiKQorCQliID0gYltuOl0KKwkJc3dpdGNoIHR5cCB7CisJCWNhc2UgcHJvdG93aXJlLlZhcmludFR5cGU6CisJCQl2LCBtIDo9IHByb3Rvd2lyZS5Db25zdW1lVmFyaW50KGIpCisJCQliID0gYlttOl0KKwkJCXN3aXRjaCBudW0geworCQkJY2FzZSBnZW5pZC5GZWF0dXJlU2V0X0ZpZWxkUHJlc2VuY2VfZmllbGRfbnVtYmVyOgorCQkJCXBhcmVudC5Jc0ZpZWxkUHJlc2VuY2UgPSB2ID09IGdlbmlkLkZlYXR1cmVTZXRfRVhQTElDSVRfZW51bV92YWx1ZSB8fCB2ID09IGdlbmlkLkZlYXR1cmVTZXRfTEVHQUNZX1JFUVVJUkVEX2VudW1fdmFsdWUKKwkJCQlwYXJlbnQuSXNMZWdhY3lSZXF1aXJlZCA9IHYgPT0gZ2VuaWQuRmVhdHVyZVNldF9MRUdBQ1lfUkVRVUlSRURfZW51bV92YWx1ZQorCQkJY2FzZSBnZW5pZC5GZWF0dXJlU2V0X0VudW1UeXBlX2ZpZWxkX251bWJlcjoKKwkJCQlwYXJlbnQuSXNPcGVuRW51bSA9IHYgPT0gZ2VuaWQuRmVhdHVyZVNldF9PUEVOX2VudW1fdmFsdWUKKwkJCWNhc2UgZ2VuaWQuRmVhdHVyZVNldF9SZXBlYXRlZEZpZWxkRW5jb2RpbmdfZmllbGRfbnVtYmVyOgorCQkJCXBhcmVudC5Jc1BhY2tlZCA9IHYgPT0gZ2VuaWQuRmVhdHVyZVNldF9QQUNLRURfZW51bV92YWx1ZQorCQkJY2FzZSBnZW5pZC5GZWF0dXJlU2V0X1V0ZjhWYWxpZGF0aW9uX2ZpZWxkX251bWJlcjoKKwkJCQlwYXJlbnQuSXNVVEY4VmFsaWRhdGVkID0gdiA9PSBnZW5pZC5GZWF0dXJlU2V0X1ZFUklGWV9lbnVtX3ZhbHVlCisJCQljYXNlIGdlbmlkLkZlYXR1cmVTZXRfTWVzc2FnZUVuY29kaW5nX2ZpZWxkX251bWJlcjoKKwkJCQlwYXJlbnQuSXNEZWxpbWl0ZWRFbmNvZGVkID0gdiA9PSBnZW5pZC5GZWF0dXJlU2V0X0RFTElNSVRFRF9lbnVtX3ZhbHVlCisJCQljYXNlIGdlbmlkLkZlYXR1cmVTZXRfSnNvbkZvcm1hdF9maWVsZF9udW1iZXI6CisJCQkJcGFyZW50LklzSlNPTkNvbXBsaWFudCA9IHYgPT0gZ2VuaWQuRmVhdHVyZVNldF9BTExPV19lbnVtX3ZhbHVlCisJCQlkZWZhdWx0OgorCQkJCXBhbmljKGZtdC5TcHJpbnRmKCJ1bmtvd24gZmllbGQgbnVtYmVyICVkIHdoaWxlIHVubWFyc2hhbGxpbmcgRmVhdHVyZVNldCIsIG51bSkpCisJCQl9CisJCWNhc2UgcHJvdG93aXJlLkJ5dGVzVHlwZToKKwkJCXYsIG0gOj0gcHJvdG93aXJlLkNvbnN1bWVCeXRlcyhiKQorCQkJYiA9IGJbbTpdCisJCQlzd2l0Y2ggbnVtIHsKKwkJCWNhc2UgZ2VuaWQuR29GZWF0dXJlc19MZWdhY3lVbm1hcnNoYWxKc29uRW51bV9maWVsZF9udW1iZXI6CisJCQkJcGFyZW50ID0gdW5tYXJzaGFsR29GZWF0dXJlKHYsIHBhcmVudCkKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBwYXJlbnQKK30KKworZnVuYyBmZWF0dXJlc0Zyb21QYXJlbnREZXNjKHBhcmVudERlc2MgcHJvdG9yZWZsZWN0LkRlc2NyaXB0b3IpIEVkaXRpb25GZWF0dXJlcyB7CisJdmFyIHBhcmVudEZTIEVkaXRpb25GZWF0dXJlcworCXN3aXRjaCBwIDo9IHBhcmVudERlc2MuKHR5cGUpIHsKKwljYXNlICpGaWxlOgorCQlwYXJlbnRGUyA9IHAuTDEuRWRpdGlvbkZlYXR1cmVzCisJY2FzZSAqTWVzc2FnZToKKwkJcGFyZW50RlMgPSBwLkwxLkVkaXRpb25GZWF0dXJlcworCWRlZmF1bHQ6CisJCXBhbmljKGZtdC5TcHJpbnRmKCJ1bmtub3duIHBhcmVudCB0eXBlICVUIiwgcGFyZW50RGVzYykpCisJfQorCXJldHVybiBwYXJlbnRGUworfQorCitmdW5jIHVubWFyc2hhbEVkaXRpb25EZWZhdWx0KGIgW11ieXRlKSB7CisJdmFyIGVkIEVkaXRpb24KKwl2YXIgZnMgRWRpdGlvbkZlYXR1cmVzCisJZm9yIGxlbihiKSA+IDAgeworCQludW0sIHR5cCwgbiA6PSBwcm90b3dpcmUuQ29uc3VtZVRhZyhiKQorCQliID0gYltuOl0KKwkJc3dpdGNoIHR5cCB7CisJCWNhc2UgcHJvdG93aXJlLlZhcmludFR5cGU6CisJCQl2LCBtIDo9IHByb3Rvd2lyZS5Db25zdW1lVmFyaW50KGIpCisJCQliID0gYlttOl0KKwkJCXN3aXRjaCBudW0geworCQkJY2FzZSBnZW5pZC5GZWF0dXJlU2V0RGVmYXVsdHNfRmVhdHVyZVNldEVkaXRpb25EZWZhdWx0X0VkaXRpb25fZmllbGRfbnVtYmVyOgorCQkJCWVkID0gRWRpdGlvbih2KQorCQkJfQorCQljYXNlIHByb3Rvd2lyZS5CeXRlc1R5cGU6CisJCQl2LCBtIDo9IHByb3Rvd2lyZS5Db25zdW1lQnl0ZXMoYikKKwkJCWIgPSBiW206XQorCQkJc3dpdGNoIG51bSB7CisJCQljYXNlIGdlbmlkLkZlYXR1cmVTZXREZWZhdWx0c19GZWF0dXJlU2V0RWRpdGlvbkRlZmF1bHRfRmVhdHVyZXNfZmllbGRfbnVtYmVyOgorCQkJCWZzID0gdW5tYXJzaGFsRmVhdHVyZVNldCh2LCBmcykKKwkJCX0KKwkJfQorCX0KKwlkZWZhdWx0c0NhY2hlW2VkXSA9IGZzCit9CisKK2Z1bmMgdW5tYXJzaGFsRWRpdGlvbkRlZmF1bHRzKGIgW11ieXRlKSB7CisJZm9yIGxlbihiKSA+IDAgeworCQludW0sIF8sIG4gOj0gcHJvdG93aXJlLkNvbnN1bWVUYWcoYikKKwkJYiA9IGJbbjpdCisJCXN3aXRjaCBudW0geworCQljYXNlIGdlbmlkLkZlYXR1cmVTZXREZWZhdWx0c19EZWZhdWx0c19maWVsZF9udW1iZXI6CisJCQlkZWYsIG0gOj0gcHJvdG93aXJlLkNvbnN1bWVCeXRlcyhiKQorCQkJYiA9IGJbbTpdCisJCQl1bm1hcnNoYWxFZGl0aW9uRGVmYXVsdChkZWYpCisJCWNhc2UgZ2VuaWQuRmVhdHVyZVNldERlZmF1bHRzX01pbmltdW1FZGl0aW9uX2ZpZWxkX251bWJlciwKKwkJCWdlbmlkLkZlYXR1cmVTZXREZWZhdWx0c19NYXhpbXVtRWRpdGlvbl9maWVsZF9udW1iZXI6CisJCQkvLyBXZSBkb24ndCBjYXJlIGFib3V0IHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGVkaXRpb25zLiBJZiB0aGUKKwkJCS8vIGVkaXRpb24gd2UgYXJlIGxvb2tpbmcgZm9yIGxhdGVyIG9uIGlzIG5vdCBpbiB0aGUgY2FjaGUgd2Uga25vdworCQkJLy8gaXQgaXMgb3V0c2lkZSBvZiB0aGUgcmFuZ2UgYmV0d2VlbiBtaW5pbXVtIGFuZCBtYXhpbXVtIGVkaXRpb24uCisJCQlfLCBtIDo9IHByb3Rvd2lyZS5Db25zdW1lVmFyaW50KGIpCisJCQliID0gYlttOl0KKwkJZGVmYXVsdDoKKwkJCXBhbmljKGZtdC5TcHJpbnRmKCJ1bmtvd24gZmllbGQgbnVtYmVyICVkIHdoaWxlIHVubWFyc2hhbGxpbmcgRWRpdGlvbkRlZmF1bHQiLCBudW0pKQorCQl9CisJfQorfQorCitmdW5jIGdldEZlYXR1cmVzRm9yKGVkIEVkaXRpb24pIEVkaXRpb25GZWF0dXJlcyB7CisJaWYgZGVmLCBvayA6PSBkZWZhdWx0c0NhY2hlW2VkXTsgb2sgeworCQlyZXR1cm4gZGVmCisJfQorCXBhbmljKGZtdC5TcHJpbnRmKCJ1bnN1cHBvcnRlZCBlZGl0aW9uOiAldiIsIGVkKSkKK30KZGlmZiAtLWdpdCBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9maWxlZGVzYy9wbGFjZWhvbGRlci5nbyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9maWxlZGVzYy9wbGFjZWhvbGRlci5nbwppbmRleCBkYmYyYzYwLi4yODI0MGViIDEwMDY0NAotLS0gYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZmlsZWRlc2MvcGxhY2Vob2xkZXIuZ28KKysrIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ZpbGVkZXNjL3BsYWNlaG9sZGVyLmdvCkBAIC03LDcgKzcsNyBAQAogaW1wb3J0ICgKIAkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZGVzY29wdHMiCiAJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL3ByYWdtYSIKLQlwcmVmICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9yZWZsZWN0L3Byb3RvcmVmbGVjdCIKKwkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZmxlY3QiCiApCiAKIHZhciAoCkBAIC0zMCw3OCArMzAsODAgQEAKIC8vIFBsYWNlaG9sZGVyRmlsZSBpcyBhIHBsYWNlaG9sZGVyLCByZXByZXNlbnRpbmcgb25seSB0aGUgZmlsZSBwYXRoLgogdHlwZSBQbGFjZWhvbGRlckZpbGUgc3RyaW5nCiAKLWZ1bmMgKGYgUGxhY2Vob2xkZXJGaWxlKSBQYXJlbnRGaWxlKCkgcHJlZi5GaWxlRGVzY3JpcHRvciAgICAgICB7IHJldHVybiBmIH0KLWZ1bmMgKGYgUGxhY2Vob2xkZXJGaWxlKSBQYXJlbnQoKSBwcmVmLkRlc2NyaXB0b3IgICAgICAgICAgICAgICB7IHJldHVybiBuaWwgfQotZnVuYyAoZiBQbGFjZWhvbGRlckZpbGUpIEluZGV4KCkgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIDAgfQotZnVuYyAoZiBQbGFjZWhvbGRlckZpbGUpIFN5bnRheCgpIHByZWYuU3ludGF4ICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIDAgfQotZnVuYyAoZiBQbGFjZWhvbGRlckZpbGUpIE5hbWUoKSBwcmVmLk5hbWUgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuICIiIH0KLWZ1bmMgKGYgUGxhY2Vob2xkZXJGaWxlKSBGdWxsTmFtZSgpIHByZWYuRnVsbE5hbWUgICAgICAgICAgICAgICB7IHJldHVybiAiIiB9Ci1mdW5jIChmIFBsYWNlaG9sZGVyRmlsZSkgSXNQbGFjZWhvbGRlcigpIGJvb2wgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gdHJ1ZSB9Ci1mdW5jIChmIFBsYWNlaG9sZGVyRmlsZSkgT3B0aW9ucygpIHByZWYuUHJvdG9NZXNzYWdlICAgICAgICAgICAgeyByZXR1cm4gZGVzY29wdHMuRmlsZSB9Ci1mdW5jIChmIFBsYWNlaG9sZGVyRmlsZSkgUGF0aCgpIHN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gc3RyaW5nKGYpIH0KLWZ1bmMgKGYgUGxhY2Vob2xkZXJGaWxlKSBQYWNrYWdlKCkgcHJlZi5GdWxsTmFtZSAgICAgICAgICAgICAgICB7IHJldHVybiAiIiB9Ci1mdW5jIChmIFBsYWNlaG9sZGVyRmlsZSkgSW1wb3J0cygpIHByZWYuRmlsZUltcG9ydHMgICAgICAgICAgICAgeyByZXR1cm4gZW1wdHlGaWxlcyB9Ci1mdW5jIChmIFBsYWNlaG9sZGVyRmlsZSkgTWVzc2FnZXMoKSBwcmVmLk1lc3NhZ2VEZXNjcmlwdG9ycyAgICAgeyByZXR1cm4gZW1wdHlNZXNzYWdlcyB9Ci1mdW5jIChmIFBsYWNlaG9sZGVyRmlsZSkgRW51bXMoKSBwcmVmLkVudW1EZXNjcmlwdG9ycyAgICAgICAgICAgeyByZXR1cm4gZW1wdHlFbnVtcyB9Ci1mdW5jIChmIFBsYWNlaG9sZGVyRmlsZSkgRXh0ZW5zaW9ucygpIHByZWYuRXh0ZW5zaW9uRGVzY3JpcHRvcnMgeyByZXR1cm4gZW1wdHlFeHRlbnNpb25zIH0KLWZ1bmMgKGYgUGxhY2Vob2xkZXJGaWxlKSBTZXJ2aWNlcygpIHByZWYuU2VydmljZURlc2NyaXB0b3JzICAgICB7IHJldHVybiBlbXB0eVNlcnZpY2VzIH0KLWZ1bmMgKGYgUGxhY2Vob2xkZXJGaWxlKSBTb3VyY2VMb2NhdGlvbnMoKSBwcmVmLlNvdXJjZUxvY2F0aW9ucyB7IHJldHVybiBlbXB0eVNvdXJjZUxvY2F0aW9ucyB9Ci1mdW5jIChmIFBsYWNlaG9sZGVyRmlsZSkgUHJvdG9UeXBlKHByZWYuRmlsZURlc2NyaXB0b3IpICAgICAgICAgeyByZXR1cm4gfQotZnVuYyAoZiBQbGFjZWhvbGRlckZpbGUpIFByb3RvSW50ZXJuYWwocHJhZ21hLkRvTm90SW1wbGVtZW50KSAgIHsgcmV0dXJuIH0KK2Z1bmMgKGYgUGxhY2Vob2xkZXJGaWxlKSBQYXJlbnRGaWxlKCkgcHJvdG9yZWZsZWN0LkZpbGVEZXNjcmlwdG9yICAgICAgIHsgcmV0dXJuIGYgfQorZnVuYyAoZiBQbGFjZWhvbGRlckZpbGUpIFBhcmVudCgpIHByb3RvcmVmbGVjdC5EZXNjcmlwdG9yICAgICAgICAgICAgICAgeyByZXR1cm4gbmlsIH0KK2Z1bmMgKGYgUGxhY2Vob2xkZXJGaWxlKSBJbmRleCgpIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIDAgfQorZnVuYyAoZiBQbGFjZWhvbGRlckZpbGUpIFN5bnRheCgpIHByb3RvcmVmbGVjdC5TeW50YXggICAgICAgICAgICAgICAgICAgeyByZXR1cm4gMCB9CitmdW5jIChmIFBsYWNlaG9sZGVyRmlsZSkgTmFtZSgpIHByb3RvcmVmbGVjdC5OYW1lICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAiIiB9CitmdW5jIChmIFBsYWNlaG9sZGVyRmlsZSkgRnVsbE5hbWUoKSBwcm90b3JlZmxlY3QuRnVsbE5hbWUgICAgICAgICAgICAgICB7IHJldHVybiAiIiB9CitmdW5jIChmIFBsYWNlaG9sZGVyRmlsZSkgSXNQbGFjZWhvbGRlcigpIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiB0cnVlIH0KK2Z1bmMgKGYgUGxhY2Vob2xkZXJGaWxlKSBPcHRpb25zKCkgcHJvdG9yZWZsZWN0LlByb3RvTWVzc2FnZSAgICAgICAgICAgIHsgcmV0dXJuIGRlc2NvcHRzLkZpbGUgfQorZnVuYyAoZiBQbGFjZWhvbGRlckZpbGUpIFBhdGgoKSBzdHJpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gc3RyaW5nKGYpIH0KK2Z1bmMgKGYgUGxhY2Vob2xkZXJGaWxlKSBQYWNrYWdlKCkgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lICAgICAgICAgICAgICAgIHsgcmV0dXJuICIiIH0KK2Z1bmMgKGYgUGxhY2Vob2xkZXJGaWxlKSBJbXBvcnRzKCkgcHJvdG9yZWZsZWN0LkZpbGVJbXBvcnRzICAgICAgICAgICAgIHsgcmV0dXJuIGVtcHR5RmlsZXMgfQorZnVuYyAoZiBQbGFjZWhvbGRlckZpbGUpIE1lc3NhZ2VzKCkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2VEZXNjcmlwdG9ycyAgICAgeyByZXR1cm4gZW1wdHlNZXNzYWdlcyB9CitmdW5jIChmIFBsYWNlaG9sZGVyRmlsZSkgRW51bXMoKSBwcm90b3JlZmxlY3QuRW51bURlc2NyaXB0b3JzICAgICAgICAgICB7IHJldHVybiBlbXB0eUVudW1zIH0KK2Z1bmMgKGYgUGxhY2Vob2xkZXJGaWxlKSBFeHRlbnNpb25zKCkgcHJvdG9yZWZsZWN0LkV4dGVuc2lvbkRlc2NyaXB0b3JzIHsgcmV0dXJuIGVtcHR5RXh0ZW5zaW9ucyB9CitmdW5jIChmIFBsYWNlaG9sZGVyRmlsZSkgU2VydmljZXMoKSBwcm90b3JlZmxlY3QuU2VydmljZURlc2NyaXB0b3JzICAgICB7IHJldHVybiBlbXB0eVNlcnZpY2VzIH0KK2Z1bmMgKGYgUGxhY2Vob2xkZXJGaWxlKSBTb3VyY2VMb2NhdGlvbnMoKSBwcm90b3JlZmxlY3QuU291cmNlTG9jYXRpb25zIHsgcmV0dXJuIGVtcHR5U291cmNlTG9jYXRpb25zIH0KK2Z1bmMgKGYgUGxhY2Vob2xkZXJGaWxlKSBQcm90b1R5cGUocHJvdG9yZWZsZWN0LkZpbGVEZXNjcmlwdG9yKSAgICAgICAgIHsgcmV0dXJuIH0KK2Z1bmMgKGYgUGxhY2Vob2xkZXJGaWxlKSBQcm90b0ludGVybmFsKHByYWdtYS5Eb05vdEltcGxlbWVudCkgICAgICAgICAgIHsgcmV0dXJuIH0KIAogLy8gUGxhY2Vob2xkZXJFbnVtIGlzIGEgcGxhY2Vob2xkZXIsIHJlcHJlc2VudGluZyBvbmx5IHRoZSBmdWxsIG5hbWUuCi10eXBlIFBsYWNlaG9sZGVyRW51bSBwcmVmLkZ1bGxOYW1lCit0eXBlIFBsYWNlaG9sZGVyRW51bSBwcm90b3JlZmxlY3QuRnVsbE5hbWUKIAotZnVuYyAoZSBQbGFjZWhvbGRlckVudW0pIFBhcmVudEZpbGUoKSBwcmVmLkZpbGVEZXNjcmlwdG9yICAgICB7IHJldHVybiBuaWwgfQotZnVuYyAoZSBQbGFjZWhvbGRlckVudW0pIFBhcmVudCgpIHByZWYuRGVzY3JpcHRvciAgICAgICAgICAgICB7IHJldHVybiBuaWwgfQotZnVuYyAoZSBQbGFjZWhvbGRlckVudW0pIEluZGV4KCkgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAwIH0KLWZ1bmMgKGUgUGxhY2Vob2xkZXJFbnVtKSBTeW50YXgoKSBwcmVmLlN5bnRheCAgICAgICAgICAgICAgICAgeyByZXR1cm4gMCB9Ci1mdW5jIChlIFBsYWNlaG9sZGVyRW51bSkgTmFtZSgpIHByZWYuTmFtZSAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHByZWYuRnVsbE5hbWUoZSkuTmFtZSgpIH0KLWZ1bmMgKGUgUGxhY2Vob2xkZXJFbnVtKSBGdWxsTmFtZSgpIHByZWYuRnVsbE5hbWUgICAgICAgICAgICAgeyByZXR1cm4gcHJlZi5GdWxsTmFtZShlKSB9Ci1mdW5jIChlIFBsYWNlaG9sZGVyRW51bSkgSXNQbGFjZWhvbGRlcigpIGJvb2wgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRydWUgfQotZnVuYyAoZSBQbGFjZWhvbGRlckVudW0pIE9wdGlvbnMoKSBwcmVmLlByb3RvTWVzc2FnZSAgICAgICAgICB7IHJldHVybiBkZXNjb3B0cy5FbnVtIH0KLWZ1bmMgKGUgUGxhY2Vob2xkZXJFbnVtKSBWYWx1ZXMoKSBwcmVmLkVudW1WYWx1ZURlc2NyaXB0b3JzICAgeyByZXR1cm4gZW1wdHlFbnVtVmFsdWVzIH0KLWZ1bmMgKGUgUGxhY2Vob2xkZXJFbnVtKSBSZXNlcnZlZE5hbWVzKCkgcHJlZi5OYW1lcyAgICAgICAgICAgeyByZXR1cm4gZW1wdHlOYW1lcyB9Ci1mdW5jIChlIFBsYWNlaG9sZGVyRW51bSkgUmVzZXJ2ZWRSYW5nZXMoKSBwcmVmLkVudW1SYW5nZXMgICAgIHsgcmV0dXJuIGVtcHR5RW51bVJhbmdlcyB9Ci1mdW5jIChlIFBsYWNlaG9sZGVyRW51bSkgUHJvdG9UeXBlKHByZWYuRW51bURlc2NyaXB0b3IpICAgICAgIHsgcmV0dXJuIH0KLWZ1bmMgKGUgUGxhY2Vob2xkZXJFbnVtKSBQcm90b0ludGVybmFsKHByYWdtYS5Eb05vdEltcGxlbWVudCkgeyByZXR1cm4gfQorZnVuYyAoZSBQbGFjZWhvbGRlckVudW0pIFBhcmVudEZpbGUoKSBwcm90b3JlZmxlY3QuRmlsZURlc2NyaXB0b3IgICB7IHJldHVybiBuaWwgfQorZnVuYyAoZSBQbGFjZWhvbGRlckVudW0pIFBhcmVudCgpIHByb3RvcmVmbGVjdC5EZXNjcmlwdG9yICAgICAgICAgICB7IHJldHVybiBuaWwgfQorZnVuYyAoZSBQbGFjZWhvbGRlckVudW0pIEluZGV4KCkgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAwIH0KK2Z1bmMgKGUgUGxhY2Vob2xkZXJFbnVtKSBTeW50YXgoKSBwcm90b3JlZmxlY3QuU3ludGF4ICAgICAgICAgICAgICAgeyByZXR1cm4gMCB9CitmdW5jIChlIFBsYWNlaG9sZGVyRW51bSkgTmFtZSgpIHByb3RvcmVmbGVjdC5OYW1lICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHByb3RvcmVmbGVjdC5GdWxsTmFtZShlKS5OYW1lKCkgfQorZnVuYyAoZSBQbGFjZWhvbGRlckVudW0pIEZ1bGxOYW1lKCkgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lICAgICAgICAgICB7IHJldHVybiBwcm90b3JlZmxlY3QuRnVsbE5hbWUoZSkgfQorZnVuYyAoZSBQbGFjZWhvbGRlckVudW0pIElzUGxhY2Vob2xkZXIoKSBib29sICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiB0cnVlIH0KK2Z1bmMgKGUgUGxhY2Vob2xkZXJFbnVtKSBPcHRpb25zKCkgcHJvdG9yZWZsZWN0LlByb3RvTWVzc2FnZSAgICAgICAgeyByZXR1cm4gZGVzY29wdHMuRW51bSB9CitmdW5jIChlIFBsYWNlaG9sZGVyRW51bSkgVmFsdWVzKCkgcHJvdG9yZWZsZWN0LkVudW1WYWx1ZURlc2NyaXB0b3JzIHsgcmV0dXJuIGVtcHR5RW51bVZhbHVlcyB9CitmdW5jIChlIFBsYWNlaG9sZGVyRW51bSkgUmVzZXJ2ZWROYW1lcygpIHByb3RvcmVmbGVjdC5OYW1lcyAgICAgICAgIHsgcmV0dXJuIGVtcHR5TmFtZXMgfQorZnVuYyAoZSBQbGFjZWhvbGRlckVudW0pIFJlc2VydmVkUmFuZ2VzKCkgcHJvdG9yZWZsZWN0LkVudW1SYW5nZXMgICB7IHJldHVybiBlbXB0eUVudW1SYW5nZXMgfQorZnVuYyAoZSBQbGFjZWhvbGRlckVudW0pIFByb3RvVHlwZShwcm90b3JlZmxlY3QuRW51bURlc2NyaXB0b3IpICAgICB7IHJldHVybiB9CitmdW5jIChlIFBsYWNlaG9sZGVyRW51bSkgUHJvdG9JbnRlcm5hbChwcmFnbWEuRG9Ob3RJbXBsZW1lbnQpICAgICAgIHsgcmV0dXJuIH0KIAogLy8gUGxhY2Vob2xkZXJFbnVtVmFsdWUgaXMgYSBwbGFjZWhvbGRlciwgcmVwcmVzZW50aW5nIG9ubHkgdGhlIGZ1bGwgbmFtZS4KLXR5cGUgUGxhY2Vob2xkZXJFbnVtVmFsdWUgcHJlZi5GdWxsTmFtZQordHlwZSBQbGFjZWhvbGRlckVudW1WYWx1ZSBwcm90b3JlZmxlY3QuRnVsbE5hbWUKIAotZnVuYyAoZSBQbGFjZWhvbGRlckVudW1WYWx1ZSkgUGFyZW50RmlsZSgpIHByZWYuRmlsZURlc2NyaXB0b3IgICAgIHsgcmV0dXJuIG5pbCB9Ci1mdW5jIChlIFBsYWNlaG9sZGVyRW51bVZhbHVlKSBQYXJlbnQoKSBwcmVmLkRlc2NyaXB0b3IgICAgICAgICAgICAgeyByZXR1cm4gbmlsIH0KLWZ1bmMgKGUgUGxhY2Vob2xkZXJFbnVtVmFsdWUpIEluZGV4KCkgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAwIH0KLWZ1bmMgKGUgUGxhY2Vob2xkZXJFbnVtVmFsdWUpIFN5bnRheCgpIHByZWYuU3ludGF4ICAgICAgICAgICAgICAgICB7IHJldHVybiAwIH0KLWZ1bmMgKGUgUGxhY2Vob2xkZXJFbnVtVmFsdWUpIE5hbWUoKSBwcmVmLk5hbWUgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBwcmVmLkZ1bGxOYW1lKGUpLk5hbWUoKSB9Ci1mdW5jIChlIFBsYWNlaG9sZGVyRW51bVZhbHVlKSBGdWxsTmFtZSgpIHByZWYuRnVsbE5hbWUgICAgICAgICAgICAgeyByZXR1cm4gcHJlZi5GdWxsTmFtZShlKSB9Ci1mdW5jIChlIFBsYWNlaG9sZGVyRW51bVZhbHVlKSBJc1BsYWNlaG9sZGVyKCkgYm9vbCAgICAgICAgICAgICAgICAgeyByZXR1cm4gdHJ1ZSB9Ci1mdW5jIChlIFBsYWNlaG9sZGVyRW51bVZhbHVlKSBPcHRpb25zKCkgcHJlZi5Qcm90b01lc3NhZ2UgICAgICAgICAgeyByZXR1cm4gZGVzY29wdHMuRW51bVZhbHVlIH0KLWZ1bmMgKGUgUGxhY2Vob2xkZXJFbnVtVmFsdWUpIE51bWJlcigpIHByZWYuRW51bU51bWJlciAgICAgICAgICAgICB7IHJldHVybiAwIH0KLWZ1bmMgKGUgUGxhY2Vob2xkZXJFbnVtVmFsdWUpIFByb3RvVHlwZShwcmVmLkVudW1WYWx1ZURlc2NyaXB0b3IpICB7IHJldHVybiB9Ci1mdW5jIChlIFBsYWNlaG9sZGVyRW51bVZhbHVlKSBQcm90b0ludGVybmFsKHByYWdtYS5Eb05vdEltcGxlbWVudCkgeyByZXR1cm4gfQorZnVuYyAoZSBQbGFjZWhvbGRlckVudW1WYWx1ZSkgUGFyZW50RmlsZSgpIHByb3RvcmVmbGVjdC5GaWxlRGVzY3JpcHRvciAgICB7IHJldHVybiBuaWwgfQorZnVuYyAoZSBQbGFjZWhvbGRlckVudW1WYWx1ZSkgUGFyZW50KCkgcHJvdG9yZWZsZWN0LkRlc2NyaXB0b3IgICAgICAgICAgICB7IHJldHVybiBuaWwgfQorZnVuYyAoZSBQbGFjZWhvbGRlckVudW1WYWx1ZSkgSW5kZXgoKSBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAwIH0KK2Z1bmMgKGUgUGxhY2Vob2xkZXJFbnVtVmFsdWUpIFN5bnRheCgpIHByb3RvcmVmbGVjdC5TeW50YXggICAgICAgICAgICAgICAgeyByZXR1cm4gMCB9CitmdW5jIChlIFBsYWNlaG9sZGVyRW51bVZhbHVlKSBOYW1lKCkgcHJvdG9yZWZsZWN0Lk5hbWUgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHByb3RvcmVmbGVjdC5GdWxsTmFtZShlKS5OYW1lKCkgfQorZnVuYyAoZSBQbGFjZWhvbGRlckVudW1WYWx1ZSkgRnVsbE5hbWUoKSBwcm90b3JlZmxlY3QuRnVsbE5hbWUgICAgICAgICAgICB7IHJldHVybiBwcm90b3JlZmxlY3QuRnVsbE5hbWUoZSkgfQorZnVuYyAoZSBQbGFjZWhvbGRlckVudW1WYWx1ZSkgSXNQbGFjZWhvbGRlcigpIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiB0cnVlIH0KK2Z1bmMgKGUgUGxhY2Vob2xkZXJFbnVtVmFsdWUpIE9wdGlvbnMoKSBwcm90b3JlZmxlY3QuUHJvdG9NZXNzYWdlICAgICAgICAgeyByZXR1cm4gZGVzY29wdHMuRW51bVZhbHVlIH0KK2Z1bmMgKGUgUGxhY2Vob2xkZXJFbnVtVmFsdWUpIE51bWJlcigpIHByb3RvcmVmbGVjdC5FbnVtTnVtYmVyICAgICAgICAgICAgeyByZXR1cm4gMCB9CitmdW5jIChlIFBsYWNlaG9sZGVyRW51bVZhbHVlKSBQcm90b1R5cGUocHJvdG9yZWZsZWN0LkVudW1WYWx1ZURlc2NyaXB0b3IpIHsgcmV0dXJuIH0KK2Z1bmMgKGUgUGxhY2Vob2xkZXJFbnVtVmFsdWUpIFByb3RvSW50ZXJuYWwocHJhZ21hLkRvTm90SW1wbGVtZW50KSAgICAgICAgeyByZXR1cm4gfQogCiAvLyBQbGFjZWhvbGRlck1lc3NhZ2UgaXMgYSBwbGFjZWhvbGRlciwgcmVwcmVzZW50aW5nIG9ubHkgdGhlIGZ1bGwgbmFtZS4KLXR5cGUgUGxhY2Vob2xkZXJNZXNzYWdlIHByZWYuRnVsbE5hbWUKK3R5cGUgUGxhY2Vob2xkZXJNZXNzYWdlIHByb3RvcmVmbGVjdC5GdWxsTmFtZQogCi1mdW5jIChtIFBsYWNlaG9sZGVyTWVzc2FnZSkgUGFyZW50RmlsZSgpIHByZWYuRmlsZURlc2NyaXB0b3IgICAgICAgICAgICAgeyByZXR1cm4gbmlsIH0KLWZ1bmMgKG0gUGxhY2Vob2xkZXJNZXNzYWdlKSBQYXJlbnQoKSBwcmVmLkRlc2NyaXB0b3IgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBuaWwgfQotZnVuYyAobSBQbGFjZWhvbGRlck1lc3NhZ2UpIEluZGV4KCkgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIDAgfQotZnVuYyAobSBQbGFjZWhvbGRlck1lc3NhZ2UpIFN5bnRheCgpIHByZWYuU3ludGF4ICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIDAgfQotZnVuYyAobSBQbGFjZWhvbGRlck1lc3NhZ2UpIE5hbWUoKSBwcmVmLk5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHByZWYuRnVsbE5hbWUobSkuTmFtZSgpIH0KLWZ1bmMgKG0gUGxhY2Vob2xkZXJNZXNzYWdlKSBGdWxsTmFtZSgpIHByZWYuRnVsbE5hbWUgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBwcmVmLkZ1bGxOYW1lKG0pIH0KLWZ1bmMgKG0gUGxhY2Vob2xkZXJNZXNzYWdlKSBJc1BsYWNlaG9sZGVyKCkgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiB0cnVlIH0KLWZ1bmMgKG0gUGxhY2Vob2xkZXJNZXNzYWdlKSBPcHRpb25zKCkgcHJlZi5Qcm90b01lc3NhZ2UgICAgICAgICAgICAgICAgICB7IHJldHVybiBkZXNjb3B0cy5NZXNzYWdlIH0KLWZ1bmMgKG0gUGxhY2Vob2xkZXJNZXNzYWdlKSBJc01hcEVudHJ5KCkgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBmYWxzZSB9Ci1mdW5jIChtIFBsYWNlaG9sZGVyTWVzc2FnZSkgRmllbGRzKCkgcHJlZi5GaWVsZERlc2NyaXB0b3JzICAgICAgICAgICAgICAgeyByZXR1cm4gZW1wdHlGaWVsZHMgfQotZnVuYyAobSBQbGFjZWhvbGRlck1lc3NhZ2UpIE9uZW9mcygpIHByZWYuT25lb2ZEZXNjcmlwdG9ycyAgICAgICAgICAgICAgIHsgcmV0dXJuIGVtcHR5T25lb2ZzIH0KLWZ1bmMgKG0gUGxhY2Vob2xkZXJNZXNzYWdlKSBSZXNlcnZlZE5hbWVzKCkgcHJlZi5OYW1lcyAgICAgICAgICAgICAgICAgICB7IHJldHVybiBlbXB0eU5hbWVzIH0KLWZ1bmMgKG0gUGxhY2Vob2xkZXJNZXNzYWdlKSBSZXNlcnZlZFJhbmdlcygpIHByZWYuRmllbGRSYW5nZXMgICAgICAgICAgICB7IHJldHVybiBlbXB0eUZpZWxkUmFuZ2VzIH0KLWZ1bmMgKG0gUGxhY2Vob2xkZXJNZXNzYWdlKSBSZXF1aXJlZE51bWJlcnMoKSBwcmVmLkZpZWxkTnVtYmVycyAgICAgICAgICB7IHJldHVybiBlbXB0eUZpZWxkTnVtYmVycyB9Ci1mdW5jIChtIFBsYWNlaG9sZGVyTWVzc2FnZSkgRXh0ZW5zaW9uUmFuZ2VzKCkgcHJlZi5GaWVsZFJhbmdlcyAgICAgICAgICAgeyByZXR1cm4gZW1wdHlGaWVsZFJhbmdlcyB9Ci1mdW5jIChtIFBsYWNlaG9sZGVyTWVzc2FnZSkgRXh0ZW5zaW9uUmFuZ2VPcHRpb25zKGludCkgcHJlZi5Qcm90b01lc3NhZ2UgeyBwYW5pYygiaW5kZXggb3V0IG9mIHJhbmdlIikgfQotZnVuYyAobSBQbGFjZWhvbGRlck1lc3NhZ2UpIE1lc3NhZ2VzKCkgcHJlZi5NZXNzYWdlRGVzY3JpcHRvcnMgICAgICAgICAgIHsgcmV0dXJuIGVtcHR5TWVzc2FnZXMgfQotZnVuYyAobSBQbGFjZWhvbGRlck1lc3NhZ2UpIEVudW1zKCkgcHJlZi5FbnVtRGVzY3JpcHRvcnMgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGVtcHR5RW51bXMgfQotZnVuYyAobSBQbGFjZWhvbGRlck1lc3NhZ2UpIEV4dGVuc2lvbnMoKSBwcmVmLkV4dGVuc2lvbkRlc2NyaXB0b3JzICAgICAgIHsgcmV0dXJuIGVtcHR5RXh0ZW5zaW9ucyB9Ci1mdW5jIChtIFBsYWNlaG9sZGVyTWVzc2FnZSkgUHJvdG9UeXBlKHByZWYuTWVzc2FnZURlc2NyaXB0b3IpICAgICAgICAgICAgeyByZXR1cm4gfQotZnVuYyAobSBQbGFjZWhvbGRlck1lc3NhZ2UpIFByb3RvSW50ZXJuYWwocHJhZ21hLkRvTm90SW1wbGVtZW50KSAgICAgICAgIHsgcmV0dXJuIH0KK2Z1bmMgKG0gUGxhY2Vob2xkZXJNZXNzYWdlKSBQYXJlbnRGaWxlKCkgcHJvdG9yZWZsZWN0LkZpbGVEZXNjcmlwdG9yICAgIHsgcmV0dXJuIG5pbCB9CitmdW5jIChtIFBsYWNlaG9sZGVyTWVzc2FnZSkgUGFyZW50KCkgcHJvdG9yZWZsZWN0LkRlc2NyaXB0b3IgICAgICAgICAgICB7IHJldHVybiBuaWwgfQorZnVuYyAobSBQbGFjZWhvbGRlck1lc3NhZ2UpIEluZGV4KCkgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gMCB9CitmdW5jIChtIFBsYWNlaG9sZGVyTWVzc2FnZSkgU3ludGF4KCkgcHJvdG9yZWZsZWN0LlN5bnRheCAgICAgICAgICAgICAgICB7IHJldHVybiAwIH0KK2Z1bmMgKG0gUGxhY2Vob2xkZXJNZXNzYWdlKSBOYW1lKCkgcHJvdG9yZWZsZWN0Lk5hbWUgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHByb3RvcmVmbGVjdC5GdWxsTmFtZShtKS5OYW1lKCkgfQorZnVuYyAobSBQbGFjZWhvbGRlck1lc3NhZ2UpIEZ1bGxOYW1lKCkgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lICAgICAgICAgICAgeyByZXR1cm4gcHJvdG9yZWZsZWN0LkZ1bGxOYW1lKG0pIH0KK2Z1bmMgKG0gUGxhY2Vob2xkZXJNZXNzYWdlKSBJc1BsYWNlaG9sZGVyKCkgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRydWUgfQorZnVuYyAobSBQbGFjZWhvbGRlck1lc3NhZ2UpIE9wdGlvbnMoKSBwcm90b3JlZmxlY3QuUHJvdG9NZXNzYWdlICAgICAgICAgeyByZXR1cm4gZGVzY29wdHMuTWVzc2FnZSB9CitmdW5jIChtIFBsYWNlaG9sZGVyTWVzc2FnZSkgSXNNYXBFbnRyeSgpIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBmYWxzZSB9CitmdW5jIChtIFBsYWNlaG9sZGVyTWVzc2FnZSkgRmllbGRzKCkgcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvcnMgICAgICB7IHJldHVybiBlbXB0eUZpZWxkcyB9CitmdW5jIChtIFBsYWNlaG9sZGVyTWVzc2FnZSkgT25lb2ZzKCkgcHJvdG9yZWZsZWN0Lk9uZW9mRGVzY3JpcHRvcnMgICAgICB7IHJldHVybiBlbXB0eU9uZW9mcyB9CitmdW5jIChtIFBsYWNlaG9sZGVyTWVzc2FnZSkgUmVzZXJ2ZWROYW1lcygpIHByb3RvcmVmbGVjdC5OYW1lcyAgICAgICAgICB7IHJldHVybiBlbXB0eU5hbWVzIH0KK2Z1bmMgKG0gUGxhY2Vob2xkZXJNZXNzYWdlKSBSZXNlcnZlZFJhbmdlcygpIHByb3RvcmVmbGVjdC5GaWVsZFJhbmdlcyAgIHsgcmV0dXJuIGVtcHR5RmllbGRSYW5nZXMgfQorZnVuYyAobSBQbGFjZWhvbGRlck1lc3NhZ2UpIFJlcXVpcmVkTnVtYmVycygpIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlcnMgeyByZXR1cm4gZW1wdHlGaWVsZE51bWJlcnMgfQorZnVuYyAobSBQbGFjZWhvbGRlck1lc3NhZ2UpIEV4dGVuc2lvblJhbmdlcygpIHByb3RvcmVmbGVjdC5GaWVsZFJhbmdlcyAgeyByZXR1cm4gZW1wdHlGaWVsZFJhbmdlcyB9CitmdW5jIChtIFBsYWNlaG9sZGVyTWVzc2FnZSkgRXh0ZW5zaW9uUmFuZ2VPcHRpb25zKGludCkgcHJvdG9yZWZsZWN0LlByb3RvTWVzc2FnZSB7CisJcGFuaWMoImluZGV4IG91dCBvZiByYW5nZSIpCit9CitmdW5jIChtIFBsYWNlaG9sZGVyTWVzc2FnZSkgTWVzc2FnZXMoKSBwcm90b3JlZmxlY3QuTWVzc2FnZURlc2NyaXB0b3JzICAgICB7IHJldHVybiBlbXB0eU1lc3NhZ2VzIH0KK2Z1bmMgKG0gUGxhY2Vob2xkZXJNZXNzYWdlKSBFbnVtcygpIHByb3RvcmVmbGVjdC5FbnVtRGVzY3JpcHRvcnMgICAgICAgICAgIHsgcmV0dXJuIGVtcHR5RW51bXMgfQorZnVuYyAobSBQbGFjZWhvbGRlck1lc3NhZ2UpIEV4dGVuc2lvbnMoKSBwcm90b3JlZmxlY3QuRXh0ZW5zaW9uRGVzY3JpcHRvcnMgeyByZXR1cm4gZW1wdHlFeHRlbnNpb25zIH0KK2Z1bmMgKG0gUGxhY2Vob2xkZXJNZXNzYWdlKSBQcm90b1R5cGUocHJvdG9yZWZsZWN0Lk1lc3NhZ2VEZXNjcmlwdG9yKSAgICAgIHsgcmV0dXJuIH0KK2Z1bmMgKG0gUGxhY2Vob2xkZXJNZXNzYWdlKSBQcm90b0ludGVybmFsKHByYWdtYS5Eb05vdEltcGxlbWVudCkgICAgICAgICAgIHsgcmV0dXJuIH0KZGlmZiAtLWdpdCBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9maWxldHlwZS9idWlsZC5nbyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9maWxldHlwZS9idWlsZC5nbwppbmRleCAwYTBkZDM1Li5mMGUzOGM0IDEwMDY0NAotLS0gYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZmlsZXR5cGUvYnVpbGQuZ28KKysrIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ZpbGV0eXBlL2J1aWxkLmdvCkBAIC0xMCwxNyArMTAsMTYgQEAKIAkicmVmbGVjdCIKIAogCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9kZXNjb3B0cyIKLQlmZGVzYyAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZmlsZWRlc2MiCisJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ZpbGVkZXNjIgogCXBpbXBsICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsIgotCXByZWYgImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgotCXByZWcgImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWdpc3RyeSIKKwkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZmxlY3QiCisJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWdpc3RyeSIKICkKIAogLy8gQnVpbGRlciBjb25zdHJ1Y3RzIHR5cGUgZGVzY3JpcHRvcnMgZnJvbSBhIHJhdyBmaWxlIGRlc2NyaXB0b3IKIC8vIGFuZCBhc3NvY2lhdGVkIEdvIHR5cGVzIGZvciBlYWNoIGVudW0gYW5kIG1lc3NhZ2UgZGVjbGFyYXRpb24uCiAvLwotLy8KLS8vIEZsYXR0ZW5lZCBPcmRlcmluZworLy8gIyBGbGF0dGVuZWQgT3JkZXJpbmcKIC8vCiAvLyBUaGUgcHJvdG9idWYgdHlwZSBzeXN0ZW0gcmVwcmVzZW50cyBkZWNsYXJhdGlvbnMgYXMgYSB0cmVlLiBDZXJ0YWluIG5vZGVzIGluCiAvLyB0aGUgdHJlZSByZXF1aXJlIHVzIHRvIGVpdGhlciBhc3NvY2lhdGUgaXQgd2l0aCBhIGNvbmNyZXRlIEdvIHR5cGUgb3IgdG8KQEAgLTUyLDcgKzUxLDcgQEAKIC8vIHRoYXQgY2hpbGRyZW4gdGhlbXNlbHZlcyBtYXkgaGF2ZS4KIHR5cGUgQnVpbGRlciBzdHJ1Y3QgewogCS8vIEZpbGUgaXMgdGhlIHVuZGVybHlpbmcgZmlsZSBkZXNjcmlwdG9yIGJ1aWxkZXIuCi0JRmlsZSBmZGVzYy5CdWlsZGVyCisJRmlsZSBmaWxlZGVzYy5CdWlsZGVyCiAKIAkvLyBHb1R5cGVzIGlzIGEgdW5pcXVlIHNldCBvZiB0aGUgR28gdHlwZXMgZm9yIGFsbCBkZWNsYXJhdGlvbnMgYW5kCiAJLy8gZGVwZW5kZW5jaWVzLiBFYWNoIHR5cGUgaXMgcmVwcmVzZW50ZWQgYXMgYSB6ZXJvIHZhbHVlIG9mIHRoZSBHbyB0eXBlLgpAQCAtMTA4LDIyICsxMDcsMjIgQEAKIAkvLyBUeXBlUmVnaXN0cnkgaXMgdGhlIHJlZ2lzdHJ5IHRvIHJlZ2lzdGVyIGVhY2ggdHlwZSBkZXNjcmlwdG9yLgogCS8vIElmIG5pbCwgaXQgdXNlcyBwcm90b3JlZ2lzdHJ5Lkdsb2JhbFR5cGVzLgogCVR5cGVSZWdpc3RyeSBpbnRlcmZhY2UgewotCQlSZWdpc3Rlck1lc3NhZ2UocHJlZi5NZXNzYWdlVHlwZSkgZXJyb3IKLQkJUmVnaXN0ZXJFbnVtKHByZWYuRW51bVR5cGUpIGVycm9yCi0JCVJlZ2lzdGVyRXh0ZW5zaW9uKHByZWYuRXh0ZW5zaW9uVHlwZSkgZXJyb3IKKwkJUmVnaXN0ZXJNZXNzYWdlKHByb3RvcmVmbGVjdC5NZXNzYWdlVHlwZSkgZXJyb3IKKwkJUmVnaXN0ZXJFbnVtKHByb3RvcmVmbGVjdC5FbnVtVHlwZSkgZXJyb3IKKwkJUmVnaXN0ZXJFeHRlbnNpb24ocHJvdG9yZWZsZWN0LkV4dGVuc2lvblR5cGUpIGVycm9yCiAJfQogfQogCiAvLyBPdXQgaXMgdGhlIG91dHB1dCBvZiB0aGUgYnVpbGRlci4KIHR5cGUgT3V0IHN0cnVjdCB7Ci0JRmlsZSBwcmVmLkZpbGVEZXNjcmlwdG9yCisJRmlsZSBwcm90b3JlZmxlY3QuRmlsZURlc2NyaXB0b3IKIH0KIAogZnVuYyAodGIgQnVpbGRlcikgQnVpbGQoKSAob3V0IE91dCkgewogCS8vIFJlcGxhY2UgdGhlIHJlc29sdmVyIHdpdGggb25lIHRoYXQgcmVzb2x2ZXMgZGVwZW5kZW5jaWVzIGJ5IGluZGV4LAogCS8vIHdoaWNoIGlzIGZhc3RlciBhbmQgbW9yZSByZWxpYWJsZSB0aGFuIHJlbHlpbmcgb24gdGhlIGdsb2JhbCByZWdpc3RyeS4KIAlpZiB0Yi5GaWxlLkZpbGVSZWdpc3RyeSA9PSBuaWwgewotCQl0Yi5GaWxlLkZpbGVSZWdpc3RyeSA9IHByZWcuR2xvYmFsRmlsZXMKKwkJdGIuRmlsZS5GaWxlUmVnaXN0cnkgPSBwcm90b3JlZ2lzdHJ5Lkdsb2JhbEZpbGVzCiAJfQogCXRiLkZpbGUuRmlsZVJlZ2lzdHJ5ID0gJnJlc29sdmVyQnlJbmRleHsKIAkJZ29UeXBlczogICAgICB0Yi5Hb1R5cGVzLApAQCAtMTMzLDcgKzEzMiw3IEBACiAKIAkvLyBJbml0aWFsaXplIHJlZ2lzdHJ5IGlmIHVucG9wdWxhdGVkLgogCWlmIHRiLlR5cGVSZWdpc3RyeSA9PSBuaWwgewotCQl0Yi5UeXBlUmVnaXN0cnkgPSBwcmVnLkdsb2JhbFR5cGVzCisJCXRiLlR5cGVSZWdpc3RyeSA9IHByb3RvcmVnaXN0cnkuR2xvYmFsVHlwZXMKIAl9CiAKIAlmYk91dCA6PSB0Yi5GaWxlLkJ1aWxkKCkKQEAgLTE4MywyMyArMTgyLDIzIEBACiAJCQlmb3IgaSA6PSByYW5nZSBmYk91dC5NZXNzYWdlcyB7CiAJCQkJc3dpdGNoIGZiT3V0Lk1lc3NhZ2VzW2ldLk5hbWUoKSB7CiAJCQkJY2FzZSAiRmlsZU9wdGlvbnMiOgotCQkJCQlkZXNjb3B0cy5GaWxlID0gbWVzc2FnZUdvVHlwZXNbaV0uKHByZWYuUHJvdG9NZXNzYWdlKQorCQkJCQlkZXNjb3B0cy5GaWxlID0gbWVzc2FnZUdvVHlwZXNbaV0uKHByb3RvcmVmbGVjdC5Qcm90b01lc3NhZ2UpCiAJCQkJY2FzZSAiRW51bU9wdGlvbnMiOgotCQkJCQlkZXNjb3B0cy5FbnVtID0gbWVzc2FnZUdvVHlwZXNbaV0uKHByZWYuUHJvdG9NZXNzYWdlKQorCQkJCQlkZXNjb3B0cy5FbnVtID0gbWVzc2FnZUdvVHlwZXNbaV0uKHByb3RvcmVmbGVjdC5Qcm90b01lc3NhZ2UpCiAJCQkJY2FzZSAiRW51bVZhbHVlT3B0aW9ucyI6Ci0JCQkJCWRlc2NvcHRzLkVudW1WYWx1ZSA9IG1lc3NhZ2VHb1R5cGVzW2ldLihwcmVmLlByb3RvTWVzc2FnZSkKKwkJCQkJZGVzY29wdHMuRW51bVZhbHVlID0gbWVzc2FnZUdvVHlwZXNbaV0uKHByb3RvcmVmbGVjdC5Qcm90b01lc3NhZ2UpCiAJCQkJY2FzZSAiTWVzc2FnZU9wdGlvbnMiOgotCQkJCQlkZXNjb3B0cy5NZXNzYWdlID0gbWVzc2FnZUdvVHlwZXNbaV0uKHByZWYuUHJvdG9NZXNzYWdlKQorCQkJCQlkZXNjb3B0cy5NZXNzYWdlID0gbWVzc2FnZUdvVHlwZXNbaV0uKHByb3RvcmVmbGVjdC5Qcm90b01lc3NhZ2UpCiAJCQkJY2FzZSAiRmllbGRPcHRpb25zIjoKLQkJCQkJZGVzY29wdHMuRmllbGQgPSBtZXNzYWdlR29UeXBlc1tpXS4ocHJlZi5Qcm90b01lc3NhZ2UpCisJCQkJCWRlc2NvcHRzLkZpZWxkID0gbWVzc2FnZUdvVHlwZXNbaV0uKHByb3RvcmVmbGVjdC5Qcm90b01lc3NhZ2UpCiAJCQkJY2FzZSAiT25lb2ZPcHRpb25zIjoKLQkJCQkJZGVzY29wdHMuT25lb2YgPSBtZXNzYWdlR29UeXBlc1tpXS4ocHJlZi5Qcm90b01lc3NhZ2UpCisJCQkJCWRlc2NvcHRzLk9uZW9mID0gbWVzc2FnZUdvVHlwZXNbaV0uKHByb3RvcmVmbGVjdC5Qcm90b01lc3NhZ2UpCiAJCQkJY2FzZSAiRXh0ZW5zaW9uUmFuZ2VPcHRpb25zIjoKLQkJCQkJZGVzY29wdHMuRXh0ZW5zaW9uUmFuZ2UgPSBtZXNzYWdlR29UeXBlc1tpXS4ocHJlZi5Qcm90b01lc3NhZ2UpCisJCQkJCWRlc2NvcHRzLkV4dGVuc2lvblJhbmdlID0gbWVzc2FnZUdvVHlwZXNbaV0uKHByb3RvcmVmbGVjdC5Qcm90b01lc3NhZ2UpCiAJCQkJY2FzZSAiU2VydmljZU9wdGlvbnMiOgotCQkJCQlkZXNjb3B0cy5TZXJ2aWNlID0gbWVzc2FnZUdvVHlwZXNbaV0uKHByZWYuUHJvdG9NZXNzYWdlKQorCQkJCQlkZXNjb3B0cy5TZXJ2aWNlID0gbWVzc2FnZUdvVHlwZXNbaV0uKHByb3RvcmVmbGVjdC5Qcm90b01lc3NhZ2UpCiAJCQkJY2FzZSAiTWV0aG9kT3B0aW9ucyI6Ci0JCQkJCWRlc2NvcHRzLk1ldGhvZCA9IG1lc3NhZ2VHb1R5cGVzW2ldLihwcmVmLlByb3RvTWVzc2FnZSkKKwkJCQkJZGVzY29wdHMuTWV0aG9kID0gbWVzc2FnZUdvVHlwZXNbaV0uKHByb3RvcmVmbGVjdC5Qcm90b01lc3NhZ2UpCiAJCQkJfQogCQkJfQogCQl9CkBAIC0yMTYsMTEgKzIxNSwxMSBAQAogCQljb25zdCBsaXN0RXh0RGVwcyA9IDIKIAkJdmFyIGdvVHlwZSByZWZsZWN0LlR5cGUKIAkJc3dpdGNoIGZiT3V0LkV4dGVuc2lvbnNbaV0uTDEuS2luZCB7Ci0JCWNhc2UgcHJlZi5FbnVtS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuRW51bUtpbmQ6CiAJCQlqIDo9IGRlcElkeHMuR2V0KHRiLkRlcGVuZGVuY3lJbmRleGVzLCBsaXN0RXh0RGVwcywgZGVwSWR4KQogCQkJZ29UeXBlID0gcmVmbGVjdC5UeXBlT2YodGIuR29UeXBlc1tqXSkKIAkJCWRlcElkeCsrCi0JCWNhc2UgcHJlZi5NZXNzYWdlS2luZCwgcHJlZi5Hcm91cEtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0Lk1lc3NhZ2VLaW5kLCBwcm90b3JlZmxlY3QuR3JvdXBLaW5kOgogCQkJaiA6PSBkZXBJZHhzLkdldCh0Yi5EZXBlbmRlbmN5SW5kZXhlcywgbGlzdEV4dERlcHMsIGRlcElkeCkKIAkJCWdvVHlwZSA9IHJlZmxlY3QuVHlwZU9mKHRiLkdvVHlwZXNbal0pCiAJCQlkZXBJZHgrKwpAQCAtMjQyLDIyICsyNDEsMjIgQEAKIAlyZXR1cm4gb3V0CiB9CiAKLXZhciBnb1R5cGVGb3JQQktpbmQgPSBtYXBbcHJlZi5LaW5kXXJlZmxlY3QuVHlwZXsKLQlwcmVmLkJvb2xLaW5kOiAgICAgcmVmbGVjdC5UeXBlT2YoYm9vbChmYWxzZSkpLAotCXByZWYuSW50MzJLaW5kOiAgICByZWZsZWN0LlR5cGVPZihpbnQzMigwKSksCi0JcHJlZi5TaW50MzJLaW5kOiAgIHJlZmxlY3QuVHlwZU9mKGludDMyKDApKSwKLQlwcmVmLlNmaXhlZDMyS2luZDogcmVmbGVjdC5UeXBlT2YoaW50MzIoMCkpLAotCXByZWYuSW50NjRLaW5kOiAgICByZWZsZWN0LlR5cGVPZihpbnQ2NCgwKSksCi0JcHJlZi5TaW50NjRLaW5kOiAgIHJlZmxlY3QuVHlwZU9mKGludDY0KDApKSwKLQlwcmVmLlNmaXhlZDY0S2luZDogcmVmbGVjdC5UeXBlT2YoaW50NjQoMCkpLAotCXByZWYuVWludDMyS2luZDogICByZWZsZWN0LlR5cGVPZih1aW50MzIoMCkpLAotCXByZWYuRml4ZWQzMktpbmQ6ICByZWZsZWN0LlR5cGVPZih1aW50MzIoMCkpLAotCXByZWYuVWludDY0S2luZDogICByZWZsZWN0LlR5cGVPZih1aW50NjQoMCkpLAotCXByZWYuRml4ZWQ2NEtpbmQ6ICByZWZsZWN0LlR5cGVPZih1aW50NjQoMCkpLAotCXByZWYuRmxvYXRLaW5kOiAgICByZWZsZWN0LlR5cGVPZihmbG9hdDMyKDApKSwKLQlwcmVmLkRvdWJsZUtpbmQ6ICAgcmVmbGVjdC5UeXBlT2YoZmxvYXQ2NCgwKSksCi0JcHJlZi5TdHJpbmdLaW5kOiAgIHJlZmxlY3QuVHlwZU9mKHN0cmluZygiIikpLAotCXByZWYuQnl0ZXNLaW5kOiAgICByZWZsZWN0LlR5cGVPZihbXWJ5dGUobmlsKSksCit2YXIgZ29UeXBlRm9yUEJLaW5kID0gbWFwW3Byb3RvcmVmbGVjdC5LaW5kXXJlZmxlY3QuVHlwZXsKKwlwcm90b3JlZmxlY3QuQm9vbEtpbmQ6ICAgICByZWZsZWN0LlR5cGVPZihib29sKGZhbHNlKSksCisJcHJvdG9yZWZsZWN0LkludDMyS2luZDogICAgcmVmbGVjdC5UeXBlT2YoaW50MzIoMCkpLAorCXByb3RvcmVmbGVjdC5TaW50MzJLaW5kOiAgIHJlZmxlY3QuVHlwZU9mKGludDMyKDApKSwKKwlwcm90b3JlZmxlY3QuU2ZpeGVkMzJLaW5kOiByZWZsZWN0LlR5cGVPZihpbnQzMigwKSksCisJcHJvdG9yZWZsZWN0LkludDY0S2luZDogICAgcmVmbGVjdC5UeXBlT2YoaW50NjQoMCkpLAorCXByb3RvcmVmbGVjdC5TaW50NjRLaW5kOiAgIHJlZmxlY3QuVHlwZU9mKGludDY0KDApKSwKKwlwcm90b3JlZmxlY3QuU2ZpeGVkNjRLaW5kOiByZWZsZWN0LlR5cGVPZihpbnQ2NCgwKSksCisJcHJvdG9yZWZsZWN0LlVpbnQzMktpbmQ6ICAgcmVmbGVjdC5UeXBlT2YodWludDMyKDApKSwKKwlwcm90b3JlZmxlY3QuRml4ZWQzMktpbmQ6ICByZWZsZWN0LlR5cGVPZih1aW50MzIoMCkpLAorCXByb3RvcmVmbGVjdC5VaW50NjRLaW5kOiAgIHJlZmxlY3QuVHlwZU9mKHVpbnQ2NCgwKSksCisJcHJvdG9yZWZsZWN0LkZpeGVkNjRLaW5kOiAgcmVmbGVjdC5UeXBlT2YodWludDY0KDApKSwKKwlwcm90b3JlZmxlY3QuRmxvYXRLaW5kOiAgICByZWZsZWN0LlR5cGVPZihmbG9hdDMyKDApKSwKKwlwcm90b3JlZmxlY3QuRG91YmxlS2luZDogICByZWZsZWN0LlR5cGVPZihmbG9hdDY0KDApKSwKKwlwcm90b3JlZmxlY3QuU3RyaW5nS2luZDogICByZWZsZWN0LlR5cGVPZihzdHJpbmcoIiIpKSwKKwlwcm90b3JlZmxlY3QuQnl0ZXNLaW5kOiAgICByZWZsZWN0LlR5cGVPZihbXWJ5dGUobmlsKSksCiB9CiAKIHR5cGUgZGVwSWR4cyBbXWludDMyCkBAIC0yNzQsMTMgKzI3MywxMyBAQAogCQlmaWxlUmVnaXN0cnkKIAl9CiAJZmlsZVJlZ2lzdHJ5IGludGVyZmFjZSB7Ci0JCUZpbmRGaWxlQnlQYXRoKHN0cmluZykgKHByZWYuRmlsZURlc2NyaXB0b3IsIGVycm9yKQotCQlGaW5kRGVzY3JpcHRvckJ5TmFtZShwcmVmLkZ1bGxOYW1lKSAocHJlZi5EZXNjcmlwdG9yLCBlcnJvcikKLQkJUmVnaXN0ZXJGaWxlKHByZWYuRmlsZURlc2NyaXB0b3IpIGVycm9yCisJCUZpbmRGaWxlQnlQYXRoKHN0cmluZykgKHByb3RvcmVmbGVjdC5GaWxlRGVzY3JpcHRvciwgZXJyb3IpCisJCUZpbmREZXNjcmlwdG9yQnlOYW1lKHByb3RvcmVmbGVjdC5GdWxsTmFtZSkgKHByb3RvcmVmbGVjdC5EZXNjcmlwdG9yLCBlcnJvcikKKwkJUmVnaXN0ZXJGaWxlKHByb3RvcmVmbGVjdC5GaWxlRGVzY3JpcHRvcikgZXJyb3IKIAl9CiApCiAKLWZ1bmMgKHIgKnJlc29sdmVyQnlJbmRleCkgRmluZEVudW1CeUluZGV4KGksIGogaW50MzIsIGVzIFtdZmRlc2MuRW51bSwgbXMgW11mZGVzYy5NZXNzYWdlKSBwcmVmLkVudW1EZXNjcmlwdG9yIHsKK2Z1bmMgKHIgKnJlc29sdmVyQnlJbmRleCkgRmluZEVudW1CeUluZGV4KGksIGogaW50MzIsIGVzIFtdZmlsZWRlc2MuRW51bSwgbXMgW11maWxlZGVzYy5NZXNzYWdlKSBwcm90b3JlZmxlY3QuRW51bURlc2NyaXB0b3IgewogCWlmIGRlcElkeCA6PSBpbnQoci5kZXBJZHhzLkdldChpLCBqKSk7IGludChkZXBJZHgpIDwgbGVuKGVzKStsZW4obXMpIHsKIAkJcmV0dXJuICZlc1tkZXBJZHhdCiAJfSBlbHNlIHsKQEAgLTI4OCw3ICsyODcsNyBAQAogCX0KIH0KIAotZnVuYyAociAqcmVzb2x2ZXJCeUluZGV4KSBGaW5kTWVzc2FnZUJ5SW5kZXgoaSwgaiBpbnQzMiwgZXMgW11mZGVzYy5FbnVtLCBtcyBbXWZkZXNjLk1lc3NhZ2UpIHByZWYuTWVzc2FnZURlc2NyaXB0b3IgeworZnVuYyAociAqcmVzb2x2ZXJCeUluZGV4KSBGaW5kTWVzc2FnZUJ5SW5kZXgoaSwgaiBpbnQzMiwgZXMgW11maWxlZGVzYy5FbnVtLCBtcyBbXWZpbGVkZXNjLk1lc3NhZ2UpIHByb3RvcmVmbGVjdC5NZXNzYWdlRGVzY3JpcHRvciB7CiAJaWYgZGVwSWR4IDo9IGludChyLmRlcElkeHMuR2V0KGksIGopKTsgZGVwSWR4IDwgbGVuKGVzKStsZW4obXMpIHsKIAkJcmV0dXJuICZtc1tkZXBJZHgtbGVuKGVzKV0KIAl9IGVsc2UgewpkaWZmIC0tZ2l0IGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ZsYWdzL3Byb3RvX2xlZ2FjeV9kaXNhYmxlLmdvIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ZsYWdzL3Byb3RvX2xlZ2FjeV9kaXNhYmxlLmdvCmluZGV4IGE3Mjk5NWYuLmJkYThlOGMgMTAwNjQ0Ci0tLSBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9mbGFncy9wcm90b19sZWdhY3lfZGlzYWJsZS5nbworKysgYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZmxhZ3MvcHJvdG9fbGVnYWN5X2Rpc2FibGUuZ28KQEAgLTIsNiArMiw3IEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZQogLy8gbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCisvL2dvOmJ1aWxkICFwcm90b2xlZ2FjeQogLy8gK2J1aWxkICFwcm90b2xlZ2FjeQogCiBwYWNrYWdlIGZsYWdzCmRpZmYgLS1naXQgYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZmxhZ3MvcHJvdG9fbGVnYWN5X2VuYWJsZS5nbyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9mbGFncy9wcm90b19sZWdhY3lfZW5hYmxlLmdvCmluZGV4IDc3MmUyZjAuLjZkOGQ5YmQgMTAwNjQ0Ci0tLSBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9mbGFncy9wcm90b19sZWdhY3lfZW5hYmxlLmdvCisrKyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9mbGFncy9wcm90b19sZWdhY3lfZW5hYmxlLmdvCkBAIC0yLDYgKzIsNyBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUKIC8vIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAorLy9nbzpidWlsZCBwcm90b2xlZ2FjeQogLy8gK2J1aWxkIHByb3RvbGVnYWN5CiAKIHBhY2thZ2UgZmxhZ3MKZGlmZiAtLWdpdCBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9nZW5pZC9kZXNjcmlwdG9yX2dlbi5nbyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9nZW5pZC9kZXNjcmlwdG9yX2dlbi5nbwppbmRleCBlM2NkZjFjLi40MDI3MmM4IDEwMDY0NAotLS0gYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZ2VuaWQvZGVzY3JpcHRvcl9nZW4uZ28KKysrIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2dlbmlkL2Rlc2NyaXB0b3JfZ2VuLmdvCkBAIC0xMiw2ICsxMiwyNyBAQAogCiBjb25zdCBGaWxlX2dvb2dsZV9wcm90b2J1Zl9kZXNjcmlwdG9yX3Byb3RvID0gImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIgogCisvLyBGdWxsIGFuZCBzaG9ydCBuYW1lcyBmb3IgZ29vZ2xlLnByb3RvYnVmLkVkaXRpb24uCitjb25zdCAoCisJRWRpdGlvbl9lbnVtX2Z1bGxuYW1lID0gImdvb2dsZS5wcm90b2J1Zi5FZGl0aW9uIgorCUVkaXRpb25fZW51bV9uYW1lICAgICA9ICJFZGl0aW9uIgorKQorCisvLyBFbnVtIHZhbHVlcyBmb3IgZ29vZ2xlLnByb3RvYnVmLkVkaXRpb24uCitjb25zdCAoCisJRWRpdGlvbl9FRElUSU9OX1VOS05PV05fZW51bV92YWx1ZSAgICAgICAgID0gMAorCUVkaXRpb25fRURJVElPTl9QUk9UTzJfZW51bV92YWx1ZSAgICAgICAgICA9IDk5OAorCUVkaXRpb25fRURJVElPTl9QUk9UTzNfZW51bV92YWx1ZSAgICAgICAgICA9IDk5OQorCUVkaXRpb25fRURJVElPTl8yMDIzX2VudW1fdmFsdWUgICAgICAgICAgICA9IDEwMDAKKwlFZGl0aW9uX0VESVRJT05fMjAyNF9lbnVtX3ZhbHVlICAgICAgICAgICAgPSAxMDAxCisJRWRpdGlvbl9FRElUSU9OXzFfVEVTVF9PTkxZX2VudW1fdmFsdWUgICAgID0gMQorCUVkaXRpb25fRURJVElPTl8yX1RFU1RfT05MWV9lbnVtX3ZhbHVlICAgICA9IDIKKwlFZGl0aW9uX0VESVRJT05fOTk5OTdfVEVTVF9PTkxZX2VudW1fdmFsdWUgPSA5OTk5NworCUVkaXRpb25fRURJVElPTl85OTk5OF9URVNUX09OTFlfZW51bV92YWx1ZSA9IDk5OTk4CisJRWRpdGlvbl9FRElUSU9OXzk5OTk5X1RFU1RfT05MWV9lbnVtX3ZhbHVlID0gOTk5OTkKKwlFZGl0aW9uX0VESVRJT05fTUFYX2VudW1fdmFsdWUgICAgICAgICAgICAgPSAyMTQ3NDgzNjQ3CispCisKIC8vIE5hbWVzIGZvciBnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JTZXQuCiBjb25zdCAoCiAJRmlsZURlc2NyaXB0b3JTZXRfbWVzc2FnZV9uYW1lICAgICBwcm90b3JlZmxlY3QuTmFtZSAgICAgPSAiRmlsZURlc2NyaXB0b3JTZXQiCkBAIC01MCw2ICs3MSw3IEBACiAJRmlsZURlc2NyaXB0b3JQcm90b19PcHRpb25zX2ZpZWxkX25hbWUgICAgICAgICAgcHJvdG9yZWZsZWN0Lk5hbWUgPSAib3B0aW9ucyIKIAlGaWxlRGVzY3JpcHRvclByb3RvX1NvdXJjZUNvZGVJbmZvX2ZpZWxkX25hbWUgICBwcm90b3JlZmxlY3QuTmFtZSA9ICJzb3VyY2VfY29kZV9pbmZvIgogCUZpbGVEZXNjcmlwdG9yUHJvdG9fU3ludGF4X2ZpZWxkX25hbWUgICAgICAgICAgIHByb3RvcmVmbGVjdC5OYW1lID0gInN5bnRheCIKKwlGaWxlRGVzY3JpcHRvclByb3RvX0VkaXRpb25fZmllbGRfbmFtZSAgICAgICAgICBwcm90b3JlZmxlY3QuTmFtZSA9ICJlZGl0aW9uIgogCiAJRmlsZURlc2NyaXB0b3JQcm90b19OYW1lX2ZpZWxkX2Z1bGxuYW1lICAgICAgICAgICAgIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5uYW1lIgogCUZpbGVEZXNjcmlwdG9yUHJvdG9fUGFja2FnZV9maWVsZF9mdWxsbmFtZSAgICAgICAgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ucGFja2FnZSIKQEAgLTYzLDYgKzg1LDcgQEAKIAlGaWxlRGVzY3JpcHRvclByb3RvX09wdGlvbnNfZmllbGRfZnVsbG5hbWUgICAgICAgICAgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm9wdGlvbnMiCiAJRmlsZURlc2NyaXB0b3JQcm90b19Tb3VyY2VDb2RlSW5mb19maWVsZF9mdWxsbmFtZSAgIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zb3VyY2VfY29kZV9pbmZvIgogCUZpbGVEZXNjcmlwdG9yUHJvdG9fU3ludGF4X2ZpZWxkX2Z1bGxuYW1lICAgICAgICAgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uc3ludGF4IgorCUZpbGVEZXNjcmlwdG9yUHJvdG9fRWRpdGlvbl9maWVsZF9mdWxsbmFtZSAgICAgICAgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZWRpdGlvbiIKICkKIAogLy8gRmllbGQgbnVtYmVycyBmb3IgZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uCkBAIC03OSw2ICsxMDIsNyBAQAogCUZpbGVEZXNjcmlwdG9yUHJvdG9fT3B0aW9uc19maWVsZF9udW1iZXIgICAgICAgICAgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyID0gOAogCUZpbGVEZXNjcmlwdG9yUHJvdG9fU291cmNlQ29kZUluZm9fZmllbGRfbnVtYmVyICAgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyID0gOQogCUZpbGVEZXNjcmlwdG9yUHJvdG9fU3ludGF4X2ZpZWxkX251bWJlciAgICAgICAgICAgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyID0gMTIKKwlGaWxlRGVzY3JpcHRvclByb3RvX0VkaXRpb25fZmllbGRfbnVtYmVyICAgICAgICAgIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDE0CiApCiAKIC8vIE5hbWVzIGZvciBnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLgpAQCAtMTgwLDEzICsyMDQsNjQgQEAKIC8vIEZpZWxkIG5hbWVzIGZvciBnb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zLgogY29uc3QgKAogCUV4dGVuc2lvblJhbmdlT3B0aW9uc19VbmludGVycHJldGVkT3B0aW9uX2ZpZWxkX25hbWUgcHJvdG9yZWZsZWN0Lk5hbWUgPSAidW5pbnRlcnByZXRlZF9vcHRpb24iCisJRXh0ZW5zaW9uUmFuZ2VPcHRpb25zX0RlY2xhcmF0aW9uX2ZpZWxkX25hbWUgICAgICAgICBwcm90b3JlZmxlY3QuTmFtZSA9ICJkZWNsYXJhdGlvbiIKKwlFeHRlbnNpb25SYW5nZU9wdGlvbnNfRmVhdHVyZXNfZmllbGRfbmFtZSAgICAgICAgICAgIHByb3RvcmVmbGVjdC5OYW1lID0gImZlYXR1cmVzIgorCUV4dGVuc2lvblJhbmdlT3B0aW9uc19WZXJpZmljYXRpb25fZmllbGRfbmFtZSAgICAgICAgcHJvdG9yZWZsZWN0Lk5hbWUgPSAidmVyaWZpY2F0aW9uIgogCiAJRXh0ZW5zaW9uUmFuZ2VPcHRpb25zX1VuaW50ZXJwcmV0ZWRPcHRpb25fZmllbGRfZnVsbG5hbWUgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24iCisJRXh0ZW5zaW9uUmFuZ2VPcHRpb25zX0RlY2xhcmF0aW9uX2ZpZWxkX2Z1bGxuYW1lICAgICAgICAgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMuZGVjbGFyYXRpb24iCisJRXh0ZW5zaW9uUmFuZ2VPcHRpb25zX0ZlYXR1cmVzX2ZpZWxkX2Z1bGxuYW1lICAgICAgICAgICAgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMuZmVhdHVyZXMiCisJRXh0ZW5zaW9uUmFuZ2VPcHRpb25zX1ZlcmlmaWNhdGlvbl9maWVsZF9mdWxsbmFtZSAgICAgICAgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMudmVyaWZpY2F0aW9uIgogKQogCiAvLyBGaWVsZCBudW1iZXJzIGZvciBnb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zLgogY29uc3QgKAogCUV4dGVuc2lvblJhbmdlT3B0aW9uc19VbmludGVycHJldGVkT3B0aW9uX2ZpZWxkX251bWJlciBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgPSA5OTkKKwlFeHRlbnNpb25SYW5nZU9wdGlvbnNfRGVjbGFyYXRpb25fZmllbGRfbnVtYmVyICAgICAgICAgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyID0gMgorCUV4dGVuc2lvblJhbmdlT3B0aW9uc19GZWF0dXJlc19maWVsZF9udW1iZXIgICAgICAgICAgICBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgPSA1MAorCUV4dGVuc2lvblJhbmdlT3B0aW9uc19WZXJpZmljYXRpb25fZmllbGRfbnVtYmVyICAgICAgICBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgPSAzCispCisKKy8vIEZ1bGwgYW5kIHNob3J0IG5hbWVzIGZvciBnb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zLlZlcmlmaWNhdGlvblN0YXRlLgorY29uc3QgKAorCUV4dGVuc2lvblJhbmdlT3B0aW9uc19WZXJpZmljYXRpb25TdGF0ZV9lbnVtX2Z1bGxuYW1lID0gImdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMuVmVyaWZpY2F0aW9uU3RhdGUiCisJRXh0ZW5zaW9uUmFuZ2VPcHRpb25zX1ZlcmlmaWNhdGlvblN0YXRlX2VudW1fbmFtZSAgICAgPSAiVmVyaWZpY2F0aW9uU3RhdGUiCispCisKKy8vIEVudW0gdmFsdWVzIGZvciBnb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zLlZlcmlmaWNhdGlvblN0YXRlLgorY29uc3QgKAorCUV4dGVuc2lvblJhbmdlT3B0aW9uc19ERUNMQVJBVElPTl9lbnVtX3ZhbHVlID0gMAorCUV4dGVuc2lvblJhbmdlT3B0aW9uc19VTlZFUklGSUVEX2VudW1fdmFsdWUgID0gMQorKQorCisvLyBOYW1lcyBmb3IgZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucy5EZWNsYXJhdGlvbi4KK2NvbnN0ICgKKwlFeHRlbnNpb25SYW5nZU9wdGlvbnNfRGVjbGFyYXRpb25fbWVzc2FnZV9uYW1lICAgICBwcm90b3JlZmxlY3QuTmFtZSAgICAgPSAiRGVjbGFyYXRpb24iCisJRXh0ZW5zaW9uUmFuZ2VPcHRpb25zX0RlY2xhcmF0aW9uX21lc3NhZ2VfZnVsbG5hbWUgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMuRGVjbGFyYXRpb24iCispCisKKy8vIEZpZWxkIG5hbWVzIGZvciBnb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zLkRlY2xhcmF0aW9uLgorY29uc3QgKAorCUV4dGVuc2lvblJhbmdlT3B0aW9uc19EZWNsYXJhdGlvbl9OdW1iZXJfZmllbGRfbmFtZSAgIHByb3RvcmVmbGVjdC5OYW1lID0gIm51bWJlciIKKwlFeHRlbnNpb25SYW5nZU9wdGlvbnNfRGVjbGFyYXRpb25fRnVsbE5hbWVfZmllbGRfbmFtZSBwcm90b3JlZmxlY3QuTmFtZSA9ICJmdWxsX25hbWUiCisJRXh0ZW5zaW9uUmFuZ2VPcHRpb25zX0RlY2xhcmF0aW9uX1R5cGVfZmllbGRfbmFtZSAgICAgcHJvdG9yZWZsZWN0Lk5hbWUgPSAidHlwZSIKKwlFeHRlbnNpb25SYW5nZU9wdGlvbnNfRGVjbGFyYXRpb25fUmVzZXJ2ZWRfZmllbGRfbmFtZSBwcm90b3JlZmxlY3QuTmFtZSA9ICJyZXNlcnZlZCIKKwlFeHRlbnNpb25SYW5nZU9wdGlvbnNfRGVjbGFyYXRpb25fUmVwZWF0ZWRfZmllbGRfbmFtZSBwcm90b3JlZmxlY3QuTmFtZSA9ICJyZXBlYXRlZCIKKworCUV4dGVuc2lvblJhbmdlT3B0aW9uc19EZWNsYXJhdGlvbl9OdW1iZXJfZmllbGRfZnVsbG5hbWUgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJhbmdlT3B0aW9ucy5EZWNsYXJhdGlvbi5udW1iZXIiCisJRXh0ZW5zaW9uUmFuZ2VPcHRpb25zX0RlY2xhcmF0aW9uX0Z1bGxOYW1lX2ZpZWxkX2Z1bGxuYW1lIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zLkRlY2xhcmF0aW9uLmZ1bGxfbmFtZSIKKwlFeHRlbnNpb25SYW5nZU9wdGlvbnNfRGVjbGFyYXRpb25fVHlwZV9maWVsZF9mdWxsbmFtZSAgICAgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMuRGVjbGFyYXRpb24udHlwZSIKKwlFeHRlbnNpb25SYW5nZU9wdGlvbnNfRGVjbGFyYXRpb25fUmVzZXJ2ZWRfZmllbGRfZnVsbG5hbWUgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SYW5nZU9wdGlvbnMuRGVjbGFyYXRpb24ucmVzZXJ2ZWQiCisJRXh0ZW5zaW9uUmFuZ2VPcHRpb25zX0RlY2xhcmF0aW9uX1JlcGVhdGVkX2ZpZWxkX2Z1bGxuYW1lIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zLkRlY2xhcmF0aW9uLnJlcGVhdGVkIgorKQorCisvLyBGaWVsZCBudW1iZXJzIGZvciBnb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zLkRlY2xhcmF0aW9uLgorY29uc3QgKAorCUV4dGVuc2lvblJhbmdlT3B0aW9uc19EZWNsYXJhdGlvbl9OdW1iZXJfZmllbGRfbnVtYmVyICAgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyID0gMQorCUV4dGVuc2lvblJhbmdlT3B0aW9uc19EZWNsYXJhdGlvbl9GdWxsTmFtZV9maWVsZF9udW1iZXIgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyID0gMgorCUV4dGVuc2lvblJhbmdlT3B0aW9uc19EZWNsYXJhdGlvbl9UeXBlX2ZpZWxkX251bWJlciAgICAgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyID0gMworCUV4dGVuc2lvblJhbmdlT3B0aW9uc19EZWNsYXJhdGlvbl9SZXNlcnZlZF9maWVsZF9udW1iZXIgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyID0gNQorCUV4dGVuc2lvblJhbmdlT3B0aW9uc19EZWNsYXJhdGlvbl9SZXBlYXRlZF9maWVsZF9udW1iZXIgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyID0gNgogKQogCiAvLyBOYW1lcyBmb3IgZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLgpAQCAtMjQzLDEyICszMTgsNDEgQEAKIAlGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX2VudW1fbmFtZSAgICAgPSAiVHlwZSIKICkKIAorLy8gRW51bSB2YWx1ZXMgZm9yIGdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlLgorY29uc3QgKAorCUZpZWxkRGVzY3JpcHRvclByb3RvX1RZUEVfRE9VQkxFX2VudW1fdmFsdWUgICA9IDEKKwlGaWVsZERlc2NyaXB0b3JQcm90b19UWVBFX0ZMT0FUX2VudW1fdmFsdWUgICAgPSAyCisJRmllbGREZXNjcmlwdG9yUHJvdG9fVFlQRV9JTlQ2NF9lbnVtX3ZhbHVlICAgID0gMworCUZpZWxkRGVzY3JpcHRvclByb3RvX1RZUEVfVUlOVDY0X2VudW1fdmFsdWUgICA9IDQKKwlGaWVsZERlc2NyaXB0b3JQcm90b19UWVBFX0lOVDMyX2VudW1fdmFsdWUgICAgPSA1CisJRmllbGREZXNjcmlwdG9yUHJvdG9fVFlQRV9GSVhFRDY0X2VudW1fdmFsdWUgID0gNgorCUZpZWxkRGVzY3JpcHRvclByb3RvX1RZUEVfRklYRUQzMl9lbnVtX3ZhbHVlICA9IDcKKwlGaWVsZERlc2NyaXB0b3JQcm90b19UWVBFX0JPT0xfZW51bV92YWx1ZSAgICAgPSA4CisJRmllbGREZXNjcmlwdG9yUHJvdG9fVFlQRV9TVFJJTkdfZW51bV92YWx1ZSAgID0gOQorCUZpZWxkRGVzY3JpcHRvclByb3RvX1RZUEVfR1JPVVBfZW51bV92YWx1ZSAgICA9IDEwCisJRmllbGREZXNjcmlwdG9yUHJvdG9fVFlQRV9NRVNTQUdFX2VudW1fdmFsdWUgID0gMTEKKwlGaWVsZERlc2NyaXB0b3JQcm90b19UWVBFX0JZVEVTX2VudW1fdmFsdWUgICAgPSAxMgorCUZpZWxkRGVzY3JpcHRvclByb3RvX1RZUEVfVUlOVDMyX2VudW1fdmFsdWUgICA9IDEzCisJRmllbGREZXNjcmlwdG9yUHJvdG9fVFlQRV9FTlVNX2VudW1fdmFsdWUgICAgID0gMTQKKwlGaWVsZERlc2NyaXB0b3JQcm90b19UWVBFX1NGSVhFRDMyX2VudW1fdmFsdWUgPSAxNQorCUZpZWxkRGVzY3JpcHRvclByb3RvX1RZUEVfU0ZJWEVENjRfZW51bV92YWx1ZSA9IDE2CisJRmllbGREZXNjcmlwdG9yUHJvdG9fVFlQRV9TSU5UMzJfZW51bV92YWx1ZSAgID0gMTcKKwlGaWVsZERlc2NyaXB0b3JQcm90b19UWVBFX1NJTlQ2NF9lbnVtX3ZhbHVlICAgPSAxOAorKQorCiAvLyBGdWxsIGFuZCBzaG9ydCBuYW1lcyBmb3IgZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsLgogY29uc3QgKAogCUZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX2VudW1fZnVsbG5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsIgogCUZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX2VudW1fbmFtZSAgICAgPSAiTGFiZWwiCiApCiAKKy8vIEVudW0gdmFsdWVzIGZvciBnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWwuCitjb25zdCAoCisJRmllbGREZXNjcmlwdG9yUHJvdG9fTEFCRUxfT1BUSU9OQUxfZW51bV92YWx1ZSA9IDEKKwlGaWVsZERlc2NyaXB0b3JQcm90b19MQUJFTF9SRVBFQVRFRF9lbnVtX3ZhbHVlID0gMworCUZpZWxkRGVzY3JpcHRvclByb3RvX0xBQkVMX1JFUVVJUkVEX2VudW1fdmFsdWUgPSAyCispCisKIC8vIE5hbWVzIGZvciBnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8uCiBjb25zdCAoCiAJT25lb2ZEZXNjcmlwdG9yUHJvdG9fbWVzc2FnZV9uYW1lICAgICBwcm90b3JlZmxlY3QuTmFtZSAgICAgPSAiT25lb2ZEZXNjcmlwdG9yUHJvdG8iCkBAIC00MjAsNyArNTI0LDYgQEAKIAlGaWxlT3B0aW9uc19DY0dlbmVyaWNTZXJ2aWNlc19maWVsZF9uYW1lICAgICAgICAgcHJvdG9yZWZsZWN0Lk5hbWUgPSAiY2NfZ2VuZXJpY19zZXJ2aWNlcyIKIAlGaWxlT3B0aW9uc19KYXZhR2VuZXJpY1NlcnZpY2VzX2ZpZWxkX25hbWUgICAgICAgcHJvdG9yZWZsZWN0Lk5hbWUgPSAiamF2YV9nZW5lcmljX3NlcnZpY2VzIgogCUZpbGVPcHRpb25zX1B5R2VuZXJpY1NlcnZpY2VzX2ZpZWxkX25hbWUgICAgICAgICBwcm90b3JlZmxlY3QuTmFtZSA9ICJweV9nZW5lcmljX3NlcnZpY2VzIgotCUZpbGVPcHRpb25zX1BocEdlbmVyaWNTZXJ2aWNlc19maWVsZF9uYW1lICAgICAgICBwcm90b3JlZmxlY3QuTmFtZSA9ICJwaHBfZ2VuZXJpY19zZXJ2aWNlcyIKIAlGaWxlT3B0aW9uc19EZXByZWNhdGVkX2ZpZWxkX25hbWUgICAgICAgICAgICAgICAgcHJvdG9yZWZsZWN0Lk5hbWUgPSAiZGVwcmVjYXRlZCIKIAlGaWxlT3B0aW9uc19DY0VuYWJsZUFyZW5hc19maWVsZF9uYW1lICAgICAgICAgICAgcHJvdG9yZWZsZWN0Lk5hbWUgPSAiY2NfZW5hYmxlX2FyZW5hcyIKIAlGaWxlT3B0aW9uc19PYmpjQ2xhc3NQcmVmaXhfZmllbGRfbmFtZSAgICAgICAgICAgcHJvdG9yZWZsZWN0Lk5hbWUgPSAib2JqY19jbGFzc19wcmVmaXgiCkBAIC00MzAsNiArNTMzLDcgQEAKIAlGaWxlT3B0aW9uc19QaHBOYW1lc3BhY2VfZmllbGRfbmFtZSAgICAgICAgICAgICAgcHJvdG9yZWZsZWN0Lk5hbWUgPSAicGhwX25hbWVzcGFjZSIKIAlGaWxlT3B0aW9uc19QaHBNZXRhZGF0YU5hbWVzcGFjZV9maWVsZF9uYW1lICAgICAgcHJvdG9yZWZsZWN0Lk5hbWUgPSAicGhwX21ldGFkYXRhX25hbWVzcGFjZSIKIAlGaWxlT3B0aW9uc19SdWJ5UGFja2FnZV9maWVsZF9uYW1lICAgICAgICAgICAgICAgcHJvdG9yZWZsZWN0Lk5hbWUgPSAicnVieV9wYWNrYWdlIgorCUZpbGVPcHRpb25zX0ZlYXR1cmVzX2ZpZWxkX25hbWUgICAgICAgICAgICAgICAgICBwcm90b3JlZmxlY3QuTmFtZSA9ICJmZWF0dXJlcyIKIAlGaWxlT3B0aW9uc19VbmludGVycHJldGVkT3B0aW9uX2ZpZWxkX25hbWUgICAgICAgcHJvdG9yZWZsZWN0Lk5hbWUgPSAidW5pbnRlcnByZXRlZF9vcHRpb24iCiAKIAlGaWxlT3B0aW9uc19KYXZhUGFja2FnZV9maWVsZF9mdWxsbmFtZSAgICAgICAgICAgICAgIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9wYWNrYWdlIgpAQCAtNDQyLDcgKzU0Niw2IEBACiAJRmlsZU9wdGlvbnNfQ2NHZW5lcmljU2VydmljZXNfZmllbGRfZnVsbG5hbWUgICAgICAgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmNjX2dlbmVyaWNfc2VydmljZXMiCiAJRmlsZU9wdGlvbnNfSmF2YUdlbmVyaWNTZXJ2aWNlc19maWVsZF9mdWxsbmFtZSAgICAgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfZ2VuZXJpY19zZXJ2aWNlcyIKIAlGaWxlT3B0aW9uc19QeUdlbmVyaWNTZXJ2aWNlc19maWVsZF9mdWxsbmFtZSAgICAgICAgIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMucHlfZ2VuZXJpY19zZXJ2aWNlcyIKLQlGaWxlT3B0aW9uc19QaHBHZW5lcmljU2VydmljZXNfZmllbGRfZnVsbG5hbWUgICAgICAgIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMucGhwX2dlbmVyaWNfc2VydmljZXMiCiAJRmlsZU9wdGlvbnNfRGVwcmVjYXRlZF9maWVsZF9mdWxsbmFtZSAgICAgICAgICAgICAgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmRlcHJlY2F0ZWQiCiAJRmlsZU9wdGlvbnNfQ2NFbmFibGVBcmVuYXNfZmllbGRfZnVsbG5hbWUgICAgICAgICAgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmNjX2VuYWJsZV9hcmVuYXMiCiAJRmlsZU9wdGlvbnNfT2JqY0NsYXNzUHJlZml4X2ZpZWxkX2Z1bGxuYW1lICAgICAgICAgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLm9iamNfY2xhc3NfcHJlZml4IgpAQCAtNDUyLDYgKzU1NSw3IEBACiAJRmlsZU9wdGlvbnNfUGhwTmFtZXNwYWNlX2ZpZWxkX2Z1bGxuYW1lICAgICAgICAgICAgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLnBocF9uYW1lc3BhY2UiCiAJRmlsZU9wdGlvbnNfUGhwTWV0YWRhdGFOYW1lc3BhY2VfZmllbGRfZnVsbG5hbWUgICAgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLnBocF9tZXRhZGF0YV9uYW1lc3BhY2UiCiAJRmlsZU9wdGlvbnNfUnVieVBhY2thZ2VfZmllbGRfZnVsbG5hbWUgICAgICAgICAgICAgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLnJ1YnlfcGFja2FnZSIKKwlGaWxlT3B0aW9uc19GZWF0dXJlc19maWVsZF9mdWxsbmFtZSAgICAgICAgICAgICAgICAgIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuZmVhdHVyZXMiCiAJRmlsZU9wdGlvbnNfVW5pbnRlcnByZXRlZE9wdGlvbl9maWVsZF9mdWxsbmFtZSAgICAgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uIgogKQogCkBAIC00NjcsNyArNTcxLDYgQEAKIAlGaWxlT3B0aW9uc19DY0dlbmVyaWNTZXJ2aWNlc19maWVsZF9udW1iZXIgICAgICAgICBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgPSAxNgogCUZpbGVPcHRpb25zX0phdmFHZW5lcmljU2VydmljZXNfZmllbGRfbnVtYmVyICAgICAgIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDE3CiAJRmlsZU9wdGlvbnNfUHlHZW5lcmljU2VydmljZXNfZmllbGRfbnVtYmVyICAgICAgICAgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyID0gMTgKLQlGaWxlT3B0aW9uc19QaHBHZW5lcmljU2VydmljZXNfZmllbGRfbnVtYmVyICAgICAgICBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgPSA0MgogCUZpbGVPcHRpb25zX0RlcHJlY2F0ZWRfZmllbGRfbnVtYmVyICAgICAgICAgICAgICAgIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDIzCiAJRmlsZU9wdGlvbnNfQ2NFbmFibGVBcmVuYXNfZmllbGRfbnVtYmVyICAgICAgICAgICAgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyID0gMzEKIAlGaWxlT3B0aW9uc19PYmpjQ2xhc3NQcmVmaXhfZmllbGRfbnVtYmVyICAgICAgICAgICBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgPSAzNgpAQCAtNDc3LDYgKzU4MCw3IEBACiAJRmlsZU9wdGlvbnNfUGhwTmFtZXNwYWNlX2ZpZWxkX251bWJlciAgICAgICAgICAgICAgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyID0gNDEKIAlGaWxlT3B0aW9uc19QaHBNZXRhZGF0YU5hbWVzcGFjZV9maWVsZF9udW1iZXIgICAgICBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgPSA0NAogCUZpbGVPcHRpb25zX1J1YnlQYWNrYWdlX2ZpZWxkX251bWJlciAgICAgICAgICAgICAgIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDQ1CisJRmlsZU9wdGlvbnNfRmVhdHVyZXNfZmllbGRfbnVtYmVyICAgICAgICAgICAgICAgICAgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyID0gNTAKIAlGaWxlT3B0aW9uc19VbmludGVycHJldGVkT3B0aW9uX2ZpZWxkX251bWJlciAgICAgICBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgPSA5OTkKICkKIApAQCAtNDg2LDYgKzU5MCwxMyBAQAogCUZpbGVPcHRpb25zX09wdGltaXplTW9kZV9lbnVtX25hbWUgICAgID0gIk9wdGltaXplTW9kZSIKICkKIAorLy8gRW51bSB2YWx1ZXMgZm9yIGdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5PcHRpbWl6ZU1vZGUuCitjb25zdCAoCisJRmlsZU9wdGlvbnNfU1BFRURfZW51bV92YWx1ZSAgICAgICAgPSAxCisJRmlsZU9wdGlvbnNfQ09ERV9TSVpFX2VudW1fdmFsdWUgICAgPSAyCisJRmlsZU9wdGlvbnNfTElURV9SVU5USU1FX2VudW1fdmFsdWUgPSAzCispCisKIC8vIE5hbWVzIGZvciBnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMuCiBjb25zdCAoCiAJTWVzc2FnZU9wdGlvbnNfbWVzc2FnZV9uYW1lICAgICBwcm90b3JlZmxlY3QuTmFtZSAgICAgPSAiTWVzc2FnZU9wdGlvbnMiCkBAIC00OTQsMjYgKzYwNSwzMiBAQAogCiAvLyBGaWVsZCBuYW1lcyBmb3IgZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLgogY29uc3QgKAotCU1lc3NhZ2VPcHRpb25zX01lc3NhZ2VTZXRXaXJlRm9ybWF0X2ZpZWxkX25hbWUgICAgICAgICBwcm90b3JlZmxlY3QuTmFtZSA9ICJtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCIKLQlNZXNzYWdlT3B0aW9uc19Ob1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yX2ZpZWxkX25hbWUgcHJvdG9yZWZsZWN0Lk5hbWUgPSAibm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvciIKLQlNZXNzYWdlT3B0aW9uc19EZXByZWNhdGVkX2ZpZWxkX25hbWUgICAgICAgICAgICAgICAgICAgcHJvdG9yZWZsZWN0Lk5hbWUgPSAiZGVwcmVjYXRlZCIKLQlNZXNzYWdlT3B0aW9uc19NYXBFbnRyeV9maWVsZF9uYW1lICAgICAgICAgICAgICAgICAgICAgcHJvdG9yZWZsZWN0Lk5hbWUgPSAibWFwX2VudHJ5IgotCU1lc3NhZ2VPcHRpb25zX1VuaW50ZXJwcmV0ZWRPcHRpb25fZmllbGRfbmFtZSAgICAgICAgICBwcm90b3JlZmxlY3QuTmFtZSA9ICJ1bmludGVycHJldGVkX29wdGlvbiIKKwlNZXNzYWdlT3B0aW9uc19NZXNzYWdlU2V0V2lyZUZvcm1hdF9maWVsZF9uYW1lICAgICAgICAgICAgICAgcHJvdG9yZWZsZWN0Lk5hbWUgPSAibWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQiCisJTWVzc2FnZU9wdGlvbnNfTm9TdGFuZGFyZERlc2NyaXB0b3JBY2Nlc3Nvcl9maWVsZF9uYW1lICAgICAgIHByb3RvcmVmbGVjdC5OYW1lID0gIm5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IiCisJTWVzc2FnZU9wdGlvbnNfRGVwcmVjYXRlZF9maWVsZF9uYW1lICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvcmVmbGVjdC5OYW1lID0gImRlcHJlY2F0ZWQiCisJTWVzc2FnZU9wdGlvbnNfTWFwRW50cnlfZmllbGRfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvcmVmbGVjdC5OYW1lID0gIm1hcF9lbnRyeSIKKwlNZXNzYWdlT3B0aW9uc19EZXByZWNhdGVkTGVnYWN5SnNvbkZpZWxkQ29uZmxpY3RzX2ZpZWxkX25hbWUgcHJvdG9yZWZsZWN0Lk5hbWUgPSAiZGVwcmVjYXRlZF9sZWdhY3lfanNvbl9maWVsZF9jb25mbGljdHMiCisJTWVzc2FnZU9wdGlvbnNfRmVhdHVyZXNfZmllbGRfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvcmVmbGVjdC5OYW1lID0gImZlYXR1cmVzIgorCU1lc3NhZ2VPcHRpb25zX1VuaW50ZXJwcmV0ZWRPcHRpb25fZmllbGRfbmFtZSAgICAgICAgICAgICAgICBwcm90b3JlZmxlY3QuTmFtZSA9ICJ1bmludGVycHJldGVkX29wdGlvbiIKIAotCU1lc3NhZ2VPcHRpb25zX01lc3NhZ2VTZXRXaXJlRm9ybWF0X2ZpZWxkX2Z1bGxuYW1lICAgICAgICAgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCIKLQlNZXNzYWdlT3B0aW9uc19Ob1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yX2ZpZWxkX2Z1bGxuYW1lIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMubm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvciIKLQlNZXNzYWdlT3B0aW9uc19EZXByZWNhdGVkX2ZpZWxkX2Z1bGxuYW1lICAgICAgICAgICAgICAgICAgIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMuZGVwcmVjYXRlZCIKLQlNZXNzYWdlT3B0aW9uc19NYXBFbnRyeV9maWVsZF9mdWxsbmFtZSAgICAgICAgICAgICAgICAgICAgIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMubWFwX2VudHJ5IgotCU1lc3NhZ2VPcHRpb25zX1VuaW50ZXJwcmV0ZWRPcHRpb25fZmllbGRfZnVsbG5hbWUgICAgICAgICAgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbiIKKwlNZXNzYWdlT3B0aW9uc19NZXNzYWdlU2V0V2lyZUZvcm1hdF9maWVsZF9mdWxsbmFtZSAgICAgICAgICAgICAgIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQiCisJTWVzc2FnZU9wdGlvbnNfTm9TdGFuZGFyZERlc2NyaXB0b3JBY2Nlc3Nvcl9maWVsZF9mdWxsbmFtZSAgICAgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLm5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IiCisJTWVzc2FnZU9wdGlvbnNfRGVwcmVjYXRlZF9maWVsZF9mdWxsbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLmRlcHJlY2F0ZWQiCisJTWVzc2FnZU9wdGlvbnNfTWFwRW50cnlfZmllbGRfZnVsbG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLm1hcF9lbnRyeSIKKwlNZXNzYWdlT3B0aW9uc19EZXByZWNhdGVkTGVnYWN5SnNvbkZpZWxkQ29uZmxpY3RzX2ZpZWxkX2Z1bGxuYW1lIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMuZGVwcmVjYXRlZF9sZWdhY3lfanNvbl9maWVsZF9jb25mbGljdHMiCisJTWVzc2FnZU9wdGlvbnNfRmVhdHVyZXNfZmllbGRfZnVsbG5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLmZlYXR1cmVzIgorCU1lc3NhZ2VPcHRpb25zX1VuaW50ZXJwcmV0ZWRPcHRpb25fZmllbGRfZnVsbG5hbWUgICAgICAgICAgICAgICAgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbiIKICkKIAogLy8gRmllbGQgbnVtYmVycyBmb3IgZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLgogY29uc3QgKAotCU1lc3NhZ2VPcHRpb25zX01lc3NhZ2VTZXRXaXJlRm9ybWF0X2ZpZWxkX251bWJlciAgICAgICAgIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDEKLQlNZXNzYWdlT3B0aW9uc19Ob1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yX2ZpZWxkX251bWJlciBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgPSAyCi0JTWVzc2FnZU9wdGlvbnNfRGVwcmVjYXRlZF9maWVsZF9udW1iZXIgICAgICAgICAgICAgICAgICAgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyID0gMwotCU1lc3NhZ2VPcHRpb25zX01hcEVudHJ5X2ZpZWxkX251bWJlciAgICAgICAgICAgICAgICAgICAgIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDcKLQlNZXNzYWdlT3B0aW9uc19VbmludGVycHJldGVkT3B0aW9uX2ZpZWxkX251bWJlciAgICAgICAgICBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgPSA5OTkKKwlNZXNzYWdlT3B0aW9uc19NZXNzYWdlU2V0V2lyZUZvcm1hdF9maWVsZF9udW1iZXIgICAgICAgICAgICAgICBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgPSAxCisJTWVzc2FnZU9wdGlvbnNfTm9TdGFuZGFyZERlc2NyaXB0b3JBY2Nlc3Nvcl9maWVsZF9udW1iZXIgICAgICAgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyID0gMgorCU1lc3NhZ2VPcHRpb25zX0RlcHJlY2F0ZWRfZmllbGRfbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDMKKwlNZXNzYWdlT3B0aW9uc19NYXBFbnRyeV9maWVsZF9udW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgPSA3CisJTWVzc2FnZU9wdGlvbnNfRGVwcmVjYXRlZExlZ2FjeUpzb25GaWVsZENvbmZsaWN0c19maWVsZF9udW1iZXIgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyID0gMTEKKwlNZXNzYWdlT3B0aW9uc19GZWF0dXJlc19maWVsZF9udW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgPSAxMgorCU1lc3NhZ2VPcHRpb25zX1VuaW50ZXJwcmV0ZWRPcHRpb25fZmllbGRfbnVtYmVyICAgICAgICAgICAgICAgIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDk5OQogKQogCiAvLyBOYW1lcyBmb3IgZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy4KQEAgLTUyOCwxNiArNjQ1LDI4IEBACiAJRmllbGRPcHRpb25zX1BhY2tlZF9maWVsZF9uYW1lICAgICAgICAgICAgICBwcm90b3JlZmxlY3QuTmFtZSA9ICJwYWNrZWQiCiAJRmllbGRPcHRpb25zX0pzdHlwZV9maWVsZF9uYW1lICAgICAgICAgICAgICBwcm90b3JlZmxlY3QuTmFtZSA9ICJqc3R5cGUiCiAJRmllbGRPcHRpb25zX0xhenlfZmllbGRfbmFtZSAgICAgICAgICAgICAgICBwcm90b3JlZmxlY3QuTmFtZSA9ICJsYXp5IgorCUZpZWxkT3B0aW9uc19VbnZlcmlmaWVkTGF6eV9maWVsZF9uYW1lICAgICAgcHJvdG9yZWZsZWN0Lk5hbWUgPSAidW52ZXJpZmllZF9sYXp5IgogCUZpZWxkT3B0aW9uc19EZXByZWNhdGVkX2ZpZWxkX25hbWUgICAgICAgICAgcHJvdG9yZWZsZWN0Lk5hbWUgPSAiZGVwcmVjYXRlZCIKIAlGaWVsZE9wdGlvbnNfV2Vha19maWVsZF9uYW1lICAgICAgICAgICAgICAgIHByb3RvcmVmbGVjdC5OYW1lID0gIndlYWsiCisJRmllbGRPcHRpb25zX0RlYnVnUmVkYWN0X2ZpZWxkX25hbWUgICAgICAgICBwcm90b3JlZmxlY3QuTmFtZSA9ICJkZWJ1Z19yZWRhY3QiCisJRmllbGRPcHRpb25zX1JldGVudGlvbl9maWVsZF9uYW1lICAgICAgICAgICBwcm90b3JlZmxlY3QuTmFtZSA9ICJyZXRlbnRpb24iCisJRmllbGRPcHRpb25zX1RhcmdldHNfZmllbGRfbmFtZSAgICAgICAgICAgICBwcm90b3JlZmxlY3QuTmFtZSA9ICJ0YXJnZXRzIgorCUZpZWxkT3B0aW9uc19FZGl0aW9uRGVmYXVsdHNfZmllbGRfbmFtZSAgICAgcHJvdG9yZWZsZWN0Lk5hbWUgPSAiZWRpdGlvbl9kZWZhdWx0cyIKKwlGaWVsZE9wdGlvbnNfRmVhdHVyZXNfZmllbGRfbmFtZSAgICAgICAgICAgIHByb3RvcmVmbGVjdC5OYW1lID0gImZlYXR1cmVzIgogCUZpZWxkT3B0aW9uc19VbmludGVycHJldGVkT3B0aW9uX2ZpZWxkX25hbWUgcHJvdG9yZWZsZWN0Lk5hbWUgPSAidW5pbnRlcnByZXRlZF9vcHRpb24iCiAKIAlGaWVsZE9wdGlvbnNfQ3R5cGVfZmllbGRfZnVsbG5hbWUgICAgICAgICAgICAgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5jdHlwZSIKIAlGaWVsZE9wdGlvbnNfUGFja2VkX2ZpZWxkX2Z1bGxuYW1lICAgICAgICAgICAgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5wYWNrZWQiCiAJRmllbGRPcHRpb25zX0pzdHlwZV9maWVsZF9mdWxsbmFtZSAgICAgICAgICAgICAgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuanN0eXBlIgogCUZpZWxkT3B0aW9uc19MYXp5X2ZpZWxkX2Z1bGxuYW1lICAgICAgICAgICAgICAgIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLmxhenkiCisJRmllbGRPcHRpb25zX1VudmVyaWZpZWRMYXp5X2ZpZWxkX2Z1bGxuYW1lICAgICAgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMudW52ZXJpZmllZF9sYXp5IgogCUZpZWxkT3B0aW9uc19EZXByZWNhdGVkX2ZpZWxkX2Z1bGxuYW1lICAgICAgICAgIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLmRlcHJlY2F0ZWQiCiAJRmllbGRPcHRpb25zX1dlYWtfZmllbGRfZnVsbG5hbWUgICAgICAgICAgICAgICAgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMud2VhayIKKwlGaWVsZE9wdGlvbnNfRGVidWdSZWRhY3RfZmllbGRfZnVsbG5hbWUgICAgICAgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5kZWJ1Z19yZWRhY3QiCisJRmllbGRPcHRpb25zX1JldGVudGlvbl9maWVsZF9mdWxsbmFtZSAgICAgICAgICAgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMucmV0ZW50aW9uIgorCUZpZWxkT3B0aW9uc19UYXJnZXRzX2ZpZWxkX2Z1bGxuYW1lICAgICAgICAgICAgIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLnRhcmdldHMiCisJRmllbGRPcHRpb25zX0VkaXRpb25EZWZhdWx0c19maWVsZF9mdWxsbmFtZSAgICAgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuZWRpdGlvbl9kZWZhdWx0cyIKKwlGaWVsZE9wdGlvbnNfRmVhdHVyZXNfZmllbGRfZnVsbG5hbWUgICAgICAgICAgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5mZWF0dXJlcyIKIAlGaWVsZE9wdGlvbnNfVW5pbnRlcnByZXRlZE9wdGlvbl9maWVsZF9mdWxsbmFtZSBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbiIKICkKIApAQCAtNTQ3LDggKzY3NiwxNCBAQAogCUZpZWxkT3B0aW9uc19QYWNrZWRfZmllbGRfbnVtYmVyICAgICAgICAgICAgICBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgPSAyCiAJRmllbGRPcHRpb25zX0pzdHlwZV9maWVsZF9udW1iZXIgICAgICAgICAgICAgIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDYKIAlGaWVsZE9wdGlvbnNfTGF6eV9maWVsZF9udW1iZXIgICAgICAgICAgICAgICAgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyID0gNQorCUZpZWxkT3B0aW9uc19VbnZlcmlmaWVkTGF6eV9maWVsZF9udW1iZXIgICAgICBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgPSAxNQogCUZpZWxkT3B0aW9uc19EZXByZWNhdGVkX2ZpZWxkX251bWJlciAgICAgICAgICBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgPSAzCiAJRmllbGRPcHRpb25zX1dlYWtfZmllbGRfbnVtYmVyICAgICAgICAgICAgICAgIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDEwCisJRmllbGRPcHRpb25zX0RlYnVnUmVkYWN0X2ZpZWxkX251bWJlciAgICAgICAgIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDE2CisJRmllbGRPcHRpb25zX1JldGVudGlvbl9maWVsZF9udW1iZXIgICAgICAgICAgIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDE3CisJRmllbGRPcHRpb25zX1RhcmdldHNfZmllbGRfbnVtYmVyICAgICAgICAgICAgIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDE5CisJRmllbGRPcHRpb25zX0VkaXRpb25EZWZhdWx0c19maWVsZF9udW1iZXIgICAgIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDIwCisJRmllbGRPcHRpb25zX0ZlYXR1cmVzX2ZpZWxkX251bWJlciAgICAgICAgICAgIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDIxCiAJRmllbGRPcHRpb25zX1VuaW50ZXJwcmV0ZWRPcHRpb25fZmllbGRfbnVtYmVyIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDk5OQogKQogCkBAIC01NTgsMTIgKzY5Myw4MCBAQAogCUZpZWxkT3B0aW9uc19DVHlwZV9lbnVtX25hbWUgICAgID0gIkNUeXBlIgogKQogCisvLyBFbnVtIHZhbHVlcyBmb3IgZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5DVHlwZS4KK2NvbnN0ICgKKwlGaWVsZE9wdGlvbnNfU1RSSU5HX2VudW1fdmFsdWUgICAgICAgPSAwCisJRmllbGRPcHRpb25zX0NPUkRfZW51bV92YWx1ZSAgICAgICAgID0gMQorCUZpZWxkT3B0aW9uc19TVFJJTkdfUElFQ0VfZW51bV92YWx1ZSA9IDIKKykKKwogLy8gRnVsbCBhbmQgc2hvcnQgbmFtZXMgZm9yIGdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuSlNUeXBlLgogY29uc3QgKAogCUZpZWxkT3B0aW9uc19KU1R5cGVfZW51bV9mdWxsbmFtZSA9ICJnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkpTVHlwZSIKIAlGaWVsZE9wdGlvbnNfSlNUeXBlX2VudW1fbmFtZSAgICAgPSAiSlNUeXBlIgogKQogCisvLyBFbnVtIHZhbHVlcyBmb3IgZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5KU1R5cGUuCitjb25zdCAoCisJRmllbGRPcHRpb25zX0pTX05PUk1BTF9lbnVtX3ZhbHVlID0gMAorCUZpZWxkT3B0aW9uc19KU19TVFJJTkdfZW51bV92YWx1ZSA9IDEKKwlGaWVsZE9wdGlvbnNfSlNfTlVNQkVSX2VudW1fdmFsdWUgPSAyCispCisKKy8vIEZ1bGwgYW5kIHNob3J0IG5hbWVzIGZvciBnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLk9wdGlvblJldGVudGlvbi4KK2NvbnN0ICgKKwlGaWVsZE9wdGlvbnNfT3B0aW9uUmV0ZW50aW9uX2VudW1fZnVsbG5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5PcHRpb25SZXRlbnRpb24iCisJRmllbGRPcHRpb25zX09wdGlvblJldGVudGlvbl9lbnVtX25hbWUgICAgID0gIk9wdGlvblJldGVudGlvbiIKKykKKworLy8gRW51bSB2YWx1ZXMgZm9yIGdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uUmV0ZW50aW9uLgorY29uc3QgKAorCUZpZWxkT3B0aW9uc19SRVRFTlRJT05fVU5LTk9XTl9lbnVtX3ZhbHVlID0gMAorCUZpZWxkT3B0aW9uc19SRVRFTlRJT05fUlVOVElNRV9lbnVtX3ZhbHVlID0gMQorCUZpZWxkT3B0aW9uc19SRVRFTlRJT05fU09VUkNFX2VudW1fdmFsdWUgID0gMgorKQorCisvLyBGdWxsIGFuZCBzaG9ydCBuYW1lcyBmb3IgZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5PcHRpb25UYXJnZXRUeXBlLgorY29uc3QgKAorCUZpZWxkT3B0aW9uc19PcHRpb25UYXJnZXRUeXBlX2VudW1fZnVsbG5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5PcHRpb25UYXJnZXRUeXBlIgorCUZpZWxkT3B0aW9uc19PcHRpb25UYXJnZXRUeXBlX2VudW1fbmFtZSAgICAgPSAiT3B0aW9uVGFyZ2V0VHlwZSIKKykKKworLy8gRW51bSB2YWx1ZXMgZm9yIGdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuT3B0aW9uVGFyZ2V0VHlwZS4KK2NvbnN0ICgKKwlGaWVsZE9wdGlvbnNfVEFSR0VUX1RZUEVfVU5LTk9XTl9lbnVtX3ZhbHVlICAgICAgICAgPSAwCisJRmllbGRPcHRpb25zX1RBUkdFVF9UWVBFX0ZJTEVfZW51bV92YWx1ZSAgICAgICAgICAgID0gMQorCUZpZWxkT3B0aW9uc19UQVJHRVRfVFlQRV9FWFRFTlNJT05fUkFOR0VfZW51bV92YWx1ZSA9IDIKKwlGaWVsZE9wdGlvbnNfVEFSR0VUX1RZUEVfTUVTU0FHRV9lbnVtX3ZhbHVlICAgICAgICAgPSAzCisJRmllbGRPcHRpb25zX1RBUkdFVF9UWVBFX0ZJRUxEX2VudW1fdmFsdWUgICAgICAgICAgID0gNAorCUZpZWxkT3B0aW9uc19UQVJHRVRfVFlQRV9PTkVPRl9lbnVtX3ZhbHVlICAgICAgICAgICA9IDUKKwlGaWVsZE9wdGlvbnNfVEFSR0VUX1RZUEVfRU5VTV9lbnVtX3ZhbHVlICAgICAgICAgICAgPSA2CisJRmllbGRPcHRpb25zX1RBUkdFVF9UWVBFX0VOVU1fRU5UUllfZW51bV92YWx1ZSAgICAgID0gNworCUZpZWxkT3B0aW9uc19UQVJHRVRfVFlQRV9TRVJWSUNFX2VudW1fdmFsdWUgICAgICAgICA9IDgKKwlGaWVsZE9wdGlvbnNfVEFSR0VUX1RZUEVfTUVUSE9EX2VudW1fdmFsdWUgICAgICAgICAgPSA5CispCisKKy8vIE5hbWVzIGZvciBnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkVkaXRpb25EZWZhdWx0LgorY29uc3QgKAorCUZpZWxkT3B0aW9uc19FZGl0aW9uRGVmYXVsdF9tZXNzYWdlX25hbWUgICAgIHByb3RvcmVmbGVjdC5OYW1lICAgICA9ICJFZGl0aW9uRGVmYXVsdCIKKwlGaWVsZE9wdGlvbnNfRWRpdGlvbkRlZmF1bHRfbWVzc2FnZV9mdWxsbmFtZSBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5FZGl0aW9uRGVmYXVsdCIKKykKKworLy8gRmllbGQgbmFtZXMgZm9yIGdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuRWRpdGlvbkRlZmF1bHQuCitjb25zdCAoCisJRmllbGRPcHRpb25zX0VkaXRpb25EZWZhdWx0X0VkaXRpb25fZmllbGRfbmFtZSBwcm90b3JlZmxlY3QuTmFtZSA9ICJlZGl0aW9uIgorCUZpZWxkT3B0aW9uc19FZGl0aW9uRGVmYXVsdF9WYWx1ZV9maWVsZF9uYW1lICAgcHJvdG9yZWZsZWN0Lk5hbWUgPSAidmFsdWUiCisKKwlGaWVsZE9wdGlvbnNfRWRpdGlvbkRlZmF1bHRfRWRpdGlvbl9maWVsZF9mdWxsbmFtZSBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5FZGl0aW9uRGVmYXVsdC5lZGl0aW9uIgorCUZpZWxkT3B0aW9uc19FZGl0aW9uRGVmYXVsdF9WYWx1ZV9maWVsZF9mdWxsbmFtZSAgIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkVkaXRpb25EZWZhdWx0LnZhbHVlIgorKQorCisvLyBGaWVsZCBudW1iZXJzIGZvciBnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkVkaXRpb25EZWZhdWx0LgorY29uc3QgKAorCUZpZWxkT3B0aW9uc19FZGl0aW9uRGVmYXVsdF9FZGl0aW9uX2ZpZWxkX251bWJlciBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgPSAzCisJRmllbGRPcHRpb25zX0VkaXRpb25EZWZhdWx0X1ZhbHVlX2ZpZWxkX251bWJlciAgIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDIKKykKKwogLy8gTmFtZXMgZm9yIGdvb2dsZS5wcm90b2J1Zi5PbmVvZk9wdGlvbnMuCiBjb25zdCAoCiAJT25lb2ZPcHRpb25zX21lc3NhZ2VfbmFtZSAgICAgcHJvdG9yZWZsZWN0Lk5hbWUgICAgID0gIk9uZW9mT3B0aW9ucyIKQEAgLTU3MiwxMyArNzc1LDE2IEBACiAKIC8vIEZpZWxkIG5hbWVzIGZvciBnb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zLgogY29uc3QgKAorCU9uZW9mT3B0aW9uc19GZWF0dXJlc19maWVsZF9uYW1lICAgICAgICAgICAgcHJvdG9yZWZsZWN0Lk5hbWUgPSAiZmVhdHVyZXMiCiAJT25lb2ZPcHRpb25zX1VuaW50ZXJwcmV0ZWRPcHRpb25fZmllbGRfbmFtZSBwcm90b3JlZmxlY3QuTmFtZSA9ICJ1bmludGVycHJldGVkX29wdGlvbiIKIAorCU9uZW9mT3B0aW9uc19GZWF0dXJlc19maWVsZF9mdWxsbmFtZSAgICAgICAgICAgIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zLmZlYXR1cmVzIgogCU9uZW9mT3B0aW9uc19VbmludGVycHJldGVkT3B0aW9uX2ZpZWxkX2Z1bGxuYW1lIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uIgogKQogCiAvLyBGaWVsZCBudW1iZXJzIGZvciBnb29nbGUucHJvdG9idWYuT25lb2ZPcHRpb25zLgogY29uc3QgKAorCU9uZW9mT3B0aW9uc19GZWF0dXJlc19maWVsZF9udW1iZXIgICAgICAgICAgICBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgPSAxCiAJT25lb2ZPcHRpb25zX1VuaW50ZXJwcmV0ZWRPcHRpb25fZmllbGRfbnVtYmVyIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDk5OQogKQogCkBAIC01OTAsMjAgKzc5NiwyNiBAQAogCiAvLyBGaWVsZCBuYW1lcyBmb3IgZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zLgogY29uc3QgKAotCUVudW1PcHRpb25zX0FsbG93QWxpYXNfZmllbGRfbmFtZSAgICAgICAgICBwcm90b3JlZmxlY3QuTmFtZSA9ICJhbGxvd19hbGlhcyIKLQlFbnVtT3B0aW9uc19EZXByZWNhdGVkX2ZpZWxkX25hbWUgICAgICAgICAgcHJvdG9yZWZsZWN0Lk5hbWUgPSAiZGVwcmVjYXRlZCIKLQlFbnVtT3B0aW9uc19VbmludGVycHJldGVkT3B0aW9uX2ZpZWxkX25hbWUgcHJvdG9yZWZsZWN0Lk5hbWUgPSAidW5pbnRlcnByZXRlZF9vcHRpb24iCisJRW51bU9wdGlvbnNfQWxsb3dBbGlhc19maWVsZF9uYW1lICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvcmVmbGVjdC5OYW1lID0gImFsbG93X2FsaWFzIgorCUVudW1PcHRpb25zX0RlcHJlY2F0ZWRfZmllbGRfbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b3JlZmxlY3QuTmFtZSA9ICJkZXByZWNhdGVkIgorCUVudW1PcHRpb25zX0RlcHJlY2F0ZWRMZWdhY3lKc29uRmllbGRDb25mbGljdHNfZmllbGRfbmFtZSBwcm90b3JlZmxlY3QuTmFtZSA9ICJkZXByZWNhdGVkX2xlZ2FjeV9qc29uX2ZpZWxkX2NvbmZsaWN0cyIKKwlFbnVtT3B0aW9uc19GZWF0dXJlc19maWVsZF9uYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9yZWZsZWN0Lk5hbWUgPSAiZmVhdHVyZXMiCisJRW51bU9wdGlvbnNfVW5pbnRlcnByZXRlZE9wdGlvbl9maWVsZF9uYW1lICAgICAgICAgICAgICAgIHByb3RvcmVmbGVjdC5OYW1lID0gInVuaW50ZXJwcmV0ZWRfb3B0aW9uIgogCi0JRW51bU9wdGlvbnNfQWxsb3dBbGlhc19maWVsZF9mdWxsbmFtZSAgICAgICAgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zLmFsbG93X2FsaWFzIgotCUVudW1PcHRpb25zX0RlcHJlY2F0ZWRfZmllbGRfZnVsbG5hbWUgICAgICAgICAgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucy5kZXByZWNhdGVkIgotCUVudW1PcHRpb25zX1VuaW50ZXJwcmV0ZWRPcHRpb25fZmllbGRfZnVsbG5hbWUgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbiIKKwlFbnVtT3B0aW9uc19BbGxvd0FsaWFzX2ZpZWxkX2Z1bGxuYW1lICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMuYWxsb3dfYWxpYXMiCisJRW51bU9wdGlvbnNfRGVwcmVjYXRlZF9maWVsZF9mdWxsbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zLmRlcHJlY2F0ZWQiCisJRW51bU9wdGlvbnNfRGVwcmVjYXRlZExlZ2FjeUpzb25GaWVsZENvbmZsaWN0c19maWVsZF9mdWxsbmFtZSBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zLmRlcHJlY2F0ZWRfbGVnYWN5X2pzb25fZmllbGRfY29uZmxpY3RzIgorCUVudW1PcHRpb25zX0ZlYXR1cmVzX2ZpZWxkX2Z1bGxuYW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucy5mZWF0dXJlcyIKKwlFbnVtT3B0aW9uc19VbmludGVycHJldGVkT3B0aW9uX2ZpZWxkX2Z1bGxuYW1lICAgICAgICAgICAgICAgIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24iCiApCiAKIC8vIEZpZWxkIG51bWJlcnMgZm9yIGdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucy4KIGNvbnN0ICgKLQlFbnVtT3B0aW9uc19BbGxvd0FsaWFzX2ZpZWxkX251bWJlciAgICAgICAgICBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgPSAyCi0JRW51bU9wdGlvbnNfRGVwcmVjYXRlZF9maWVsZF9udW1iZXIgICAgICAgICAgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyID0gMwotCUVudW1PcHRpb25zX1VuaW50ZXJwcmV0ZWRPcHRpb25fZmllbGRfbnVtYmVyIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDk5OQorCUVudW1PcHRpb25zX0FsbG93QWxpYXNfZmllbGRfbnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDIKKwlFbnVtT3B0aW9uc19EZXByZWNhdGVkX2ZpZWxkX251bWJlciAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgPSAzCisJRW51bU9wdGlvbnNfRGVwcmVjYXRlZExlZ2FjeUpzb25GaWVsZENvbmZsaWN0c19maWVsZF9udW1iZXIgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyID0gNgorCUVudW1PcHRpb25zX0ZlYXR1cmVzX2ZpZWxkX251bWJlciAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDcKKwlFbnVtT3B0aW9uc19VbmludGVycHJldGVkT3B0aW9uX2ZpZWxkX251bWJlciAgICAgICAgICAgICAgICBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgPSA5OTkKICkKIAogLy8gTmFtZXMgZm9yIGdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zLgpAQCAtNjE1LDE1ICs4MjcsMjEgQEAKIC8vIEZpZWxkIG5hbWVzIGZvciBnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucy4KIGNvbnN0ICgKIAlFbnVtVmFsdWVPcHRpb25zX0RlcHJlY2F0ZWRfZmllbGRfbmFtZSAgICAgICAgICBwcm90b3JlZmxlY3QuTmFtZSA9ICJkZXByZWNhdGVkIgorCUVudW1WYWx1ZU9wdGlvbnNfRmVhdHVyZXNfZmllbGRfbmFtZSAgICAgICAgICAgIHByb3RvcmVmbGVjdC5OYW1lID0gImZlYXR1cmVzIgorCUVudW1WYWx1ZU9wdGlvbnNfRGVidWdSZWRhY3RfZmllbGRfbmFtZSAgICAgICAgIHByb3RvcmVmbGVjdC5OYW1lID0gImRlYnVnX3JlZGFjdCIKIAlFbnVtVmFsdWVPcHRpb25zX1VuaW50ZXJwcmV0ZWRPcHRpb25fZmllbGRfbmFtZSBwcm90b3JlZmxlY3QuTmFtZSA9ICJ1bmludGVycHJldGVkX29wdGlvbiIKIAogCUVudW1WYWx1ZU9wdGlvbnNfRGVwcmVjYXRlZF9maWVsZF9mdWxsbmFtZSAgICAgICAgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMuZGVwcmVjYXRlZCIKKwlFbnVtVmFsdWVPcHRpb25zX0ZlYXR1cmVzX2ZpZWxkX2Z1bGxuYW1lICAgICAgICAgICAgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zLmZlYXR1cmVzIgorCUVudW1WYWx1ZU9wdGlvbnNfRGVidWdSZWRhY3RfZmllbGRfZnVsbG5hbWUgICAgICAgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMuZGVidWdfcmVkYWN0IgogCUVudW1WYWx1ZU9wdGlvbnNfVW5pbnRlcnByZXRlZE9wdGlvbl9maWVsZF9mdWxsbmFtZSBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24iCiApCiAKIC8vIEZpZWxkIG51bWJlcnMgZm9yIGdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zLgogY29uc3QgKAogCUVudW1WYWx1ZU9wdGlvbnNfRGVwcmVjYXRlZF9maWVsZF9udW1iZXIgICAgICAgICAgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyID0gMQorCUVudW1WYWx1ZU9wdGlvbnNfRmVhdHVyZXNfZmllbGRfbnVtYmVyICAgICAgICAgICAgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyID0gMgorCUVudW1WYWx1ZU9wdGlvbnNfRGVidWdSZWRhY3RfZmllbGRfbnVtYmVyICAgICAgICAgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyID0gMwogCUVudW1WYWx1ZU9wdGlvbnNfVW5pbnRlcnByZXRlZE9wdGlvbl9maWVsZF9udW1iZXIgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyID0gOTk5CiApCiAKQEAgLTYzNSwxNSArODUzLDE4IEBACiAKIC8vIEZpZWxkIG5hbWVzIGZvciBnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMuCiBjb25zdCAoCisJU2VydmljZU9wdGlvbnNfRmVhdHVyZXNfZmllbGRfbmFtZSAgICAgICAgICAgIHByb3RvcmVmbGVjdC5OYW1lID0gImZlYXR1cmVzIgogCVNlcnZpY2VPcHRpb25zX0RlcHJlY2F0ZWRfZmllbGRfbmFtZSAgICAgICAgICBwcm90b3JlZmxlY3QuTmFtZSA9ICJkZXByZWNhdGVkIgogCVNlcnZpY2VPcHRpb25zX1VuaW50ZXJwcmV0ZWRPcHRpb25fZmllbGRfbmFtZSBwcm90b3JlZmxlY3QuTmFtZSA9ICJ1bmludGVycHJldGVkX29wdGlvbiIKIAorCVNlcnZpY2VPcHRpb25zX0ZlYXR1cmVzX2ZpZWxkX2Z1bGxuYW1lICAgICAgICAgICAgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucy5mZWF0dXJlcyIKIAlTZXJ2aWNlT3B0aW9uc19EZXByZWNhdGVkX2ZpZWxkX2Z1bGxuYW1lICAgICAgICAgIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMuZGVwcmVjYXRlZCIKIAlTZXJ2aWNlT3B0aW9uc19VbmludGVycHJldGVkT3B0aW9uX2ZpZWxkX2Z1bGxuYW1lIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24iCiApCiAKIC8vIEZpZWxkIG51bWJlcnMgZm9yIGdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucy4KIGNvbnN0ICgKKwlTZXJ2aWNlT3B0aW9uc19GZWF0dXJlc19maWVsZF9udW1iZXIgICAgICAgICAgICBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgPSAzNAogCVNlcnZpY2VPcHRpb25zX0RlcHJlY2F0ZWRfZmllbGRfbnVtYmVyICAgICAgICAgIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDMzCiAJU2VydmljZU9wdGlvbnNfVW5pbnRlcnByZXRlZE9wdGlvbl9maWVsZF9udW1iZXIgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyID0gOTk5CiApCkBAIC02NTgsMTAgKzg3OSwxMiBAQAogY29uc3QgKAogCU1ldGhvZE9wdGlvbnNfRGVwcmVjYXRlZF9maWVsZF9uYW1lICAgICAgICAgIHByb3RvcmVmbGVjdC5OYW1lID0gImRlcHJlY2F0ZWQiCiAJTWV0aG9kT3B0aW9uc19JZGVtcG90ZW5jeUxldmVsX2ZpZWxkX25hbWUgICAgcHJvdG9yZWZsZWN0Lk5hbWUgPSAiaWRlbXBvdGVuY3lfbGV2ZWwiCisJTWV0aG9kT3B0aW9uc19GZWF0dXJlc19maWVsZF9uYW1lICAgICAgICAgICAgcHJvdG9yZWZsZWN0Lk5hbWUgPSAiZmVhdHVyZXMiCiAJTWV0aG9kT3B0aW9uc19VbmludGVycHJldGVkT3B0aW9uX2ZpZWxkX25hbWUgcHJvdG9yZWZsZWN0Lk5hbWUgPSAidW5pbnRlcnByZXRlZF9vcHRpb24iCiAKIAlNZXRob2RPcHRpb25zX0RlcHJlY2F0ZWRfZmllbGRfZnVsbG5hbWUgICAgICAgICAgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLmRlcHJlY2F0ZWQiCiAJTWV0aG9kT3B0aW9uc19JZGVtcG90ZW5jeUxldmVsX2ZpZWxkX2Z1bGxuYW1lICAgIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucy5pZGVtcG90ZW5jeV9sZXZlbCIKKwlNZXRob2RPcHRpb25zX0ZlYXR1cmVzX2ZpZWxkX2Z1bGxuYW1lICAgICAgICAgICAgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLmZlYXR1cmVzIgogCU1ldGhvZE9wdGlvbnNfVW5pbnRlcnByZXRlZE9wdGlvbl9maWVsZF9mdWxsbmFtZSBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24iCiApCiAKQEAgLTY2OSw2ICs4OTIsNyBAQAogY29uc3QgKAogCU1ldGhvZE9wdGlvbnNfRGVwcmVjYXRlZF9maWVsZF9udW1iZXIgICAgICAgICAgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyID0gMzMKIAlNZXRob2RPcHRpb25zX0lkZW1wb3RlbmN5TGV2ZWxfZmllbGRfbnVtYmVyICAgIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDM0CisJTWV0aG9kT3B0aW9uc19GZWF0dXJlc19maWVsZF9udW1iZXIgICAgICAgICAgICBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgPSAzNQogCU1ldGhvZE9wdGlvbnNfVW5pbnRlcnByZXRlZE9wdGlvbl9maWVsZF9udW1iZXIgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyID0gOTk5CiApCiAKQEAgLTY3OCw2ICs5MDIsMTMgQEAKIAlNZXRob2RPcHRpb25zX0lkZW1wb3RlbmN5TGV2ZWxfZW51bV9uYW1lICAgICA9ICJJZGVtcG90ZW5jeUxldmVsIgogKQogCisvLyBFbnVtIHZhbHVlcyBmb3IgZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMuSWRlbXBvdGVuY3lMZXZlbC4KK2NvbnN0ICgKKwlNZXRob2RPcHRpb25zX0lERU1QT1RFTkNZX1VOS05PV05fZW51bV92YWx1ZSA9IDAKKwlNZXRob2RPcHRpb25zX05PX1NJREVfRUZGRUNUU19lbnVtX3ZhbHVlICAgICA9IDEKKwlNZXRob2RPcHRpb25zX0lERU1QT1RFTlRfZW51bV92YWx1ZSAgICAgICAgICA9IDIKKykKKwogLy8gTmFtZXMgZm9yIGdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLgogY29uc3QgKAogCVVuaW50ZXJwcmV0ZWRPcHRpb25fbWVzc2FnZV9uYW1lICAgICBwcm90b3JlZmxlY3QuTmFtZSAgICAgPSAiVW5pbnRlcnByZXRlZE9wdGlvbiIKQEAgLTczNSw2ICs5NjYsMTYzIEBACiAJVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydF9Jc0V4dGVuc2lvbl9maWVsZF9udW1iZXIgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyID0gMgogKQogCisvLyBOYW1lcyBmb3IgZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQuCitjb25zdCAoCisJRmVhdHVyZVNldF9tZXNzYWdlX25hbWUgICAgIHByb3RvcmVmbGVjdC5OYW1lICAgICA9ICJGZWF0dXJlU2V0IgorCUZlYXR1cmVTZXRfbWVzc2FnZV9mdWxsbmFtZSBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQiCispCisKKy8vIEZpZWxkIG5hbWVzIGZvciBnb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC4KK2NvbnN0ICgKKwlGZWF0dXJlU2V0X0ZpZWxkUHJlc2VuY2VfZmllbGRfbmFtZSAgICAgICAgIHByb3RvcmVmbGVjdC5OYW1lID0gImZpZWxkX3ByZXNlbmNlIgorCUZlYXR1cmVTZXRfRW51bVR5cGVfZmllbGRfbmFtZSAgICAgICAgICAgICAgcHJvdG9yZWZsZWN0Lk5hbWUgPSAiZW51bV90eXBlIgorCUZlYXR1cmVTZXRfUmVwZWF0ZWRGaWVsZEVuY29kaW5nX2ZpZWxkX25hbWUgcHJvdG9yZWZsZWN0Lk5hbWUgPSAicmVwZWF0ZWRfZmllbGRfZW5jb2RpbmciCisJRmVhdHVyZVNldF9VdGY4VmFsaWRhdGlvbl9maWVsZF9uYW1lICAgICAgICBwcm90b3JlZmxlY3QuTmFtZSA9ICJ1dGY4X3ZhbGlkYXRpb24iCisJRmVhdHVyZVNldF9NZXNzYWdlRW5jb2RpbmdfZmllbGRfbmFtZSAgICAgICBwcm90b3JlZmxlY3QuTmFtZSA9ICJtZXNzYWdlX2VuY29kaW5nIgorCUZlYXR1cmVTZXRfSnNvbkZvcm1hdF9maWVsZF9uYW1lICAgICAgICAgICAgcHJvdG9yZWZsZWN0Lk5hbWUgPSAianNvbl9mb3JtYXQiCisKKwlGZWF0dXJlU2V0X0ZpZWxkUHJlc2VuY2VfZmllbGRfZnVsbG5hbWUgICAgICAgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQuZmllbGRfcHJlc2VuY2UiCisJRmVhdHVyZVNldF9FbnVtVHlwZV9maWVsZF9mdWxsbmFtZSAgICAgICAgICAgICAgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0LmVudW1fdHlwZSIKKwlGZWF0dXJlU2V0X1JlcGVhdGVkRmllbGRFbmNvZGluZ19maWVsZF9mdWxsbmFtZSBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQucmVwZWF0ZWRfZmllbGRfZW5jb2RpbmciCisJRmVhdHVyZVNldF9VdGY4VmFsaWRhdGlvbl9maWVsZF9mdWxsbmFtZSAgICAgICAgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0LnV0ZjhfdmFsaWRhdGlvbiIKKwlGZWF0dXJlU2V0X01lc3NhZ2VFbmNvZGluZ19maWVsZF9mdWxsbmFtZSAgICAgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQubWVzc2FnZV9lbmNvZGluZyIKKwlGZWF0dXJlU2V0X0pzb25Gb3JtYXRfZmllbGRfZnVsbG5hbWUgICAgICAgICAgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQuanNvbl9mb3JtYXQiCispCisKKy8vIEZpZWxkIG51bWJlcnMgZm9yIGdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0LgorY29uc3QgKAorCUZlYXR1cmVTZXRfRmllbGRQcmVzZW5jZV9maWVsZF9udW1iZXIgICAgICAgICBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgPSAxCisJRmVhdHVyZVNldF9FbnVtVHlwZV9maWVsZF9udW1iZXIgICAgICAgICAgICAgIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDIKKwlGZWF0dXJlU2V0X1JlcGVhdGVkRmllbGRFbmNvZGluZ19maWVsZF9udW1iZXIgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyID0gMworCUZlYXR1cmVTZXRfVXRmOFZhbGlkYXRpb25fZmllbGRfbnVtYmVyICAgICAgICBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgPSA0CisJRmVhdHVyZVNldF9NZXNzYWdlRW5jb2RpbmdfZmllbGRfbnVtYmVyICAgICAgIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDUKKwlGZWF0dXJlU2V0X0pzb25Gb3JtYXRfZmllbGRfbnVtYmVyICAgICAgICAgICAgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyID0gNgorKQorCisvLyBGdWxsIGFuZCBzaG9ydCBuYW1lcyBmb3IgZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQuRmllbGRQcmVzZW5jZS4KK2NvbnN0ICgKKwlGZWF0dXJlU2V0X0ZpZWxkUHJlc2VuY2VfZW51bV9mdWxsbmFtZSA9ICJnb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5GaWVsZFByZXNlbmNlIgorCUZlYXR1cmVTZXRfRmllbGRQcmVzZW5jZV9lbnVtX25hbWUgICAgID0gIkZpZWxkUHJlc2VuY2UiCispCisKKy8vIEVudW0gdmFsdWVzIGZvciBnb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5GaWVsZFByZXNlbmNlLgorY29uc3QgKAorCUZlYXR1cmVTZXRfRklFTERfUFJFU0VOQ0VfVU5LTk9XTl9lbnVtX3ZhbHVlID0gMAorCUZlYXR1cmVTZXRfRVhQTElDSVRfZW51bV92YWx1ZSAgICAgICAgICAgICAgID0gMQorCUZlYXR1cmVTZXRfSU1QTElDSVRfZW51bV92YWx1ZSAgICAgICAgICAgICAgID0gMgorCUZlYXR1cmVTZXRfTEVHQUNZX1JFUVVJUkVEX2VudW1fdmFsdWUgICAgICAgID0gMworKQorCisvLyBGdWxsIGFuZCBzaG9ydCBuYW1lcyBmb3IgZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQuRW51bVR5cGUuCitjb25zdCAoCisJRmVhdHVyZVNldF9FbnVtVHlwZV9lbnVtX2Z1bGxuYW1lID0gImdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0LkVudW1UeXBlIgorCUZlYXR1cmVTZXRfRW51bVR5cGVfZW51bV9uYW1lICAgICA9ICJFbnVtVHlwZSIKKykKKworLy8gRW51bSB2YWx1ZXMgZm9yIGdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0LkVudW1UeXBlLgorY29uc3QgKAorCUZlYXR1cmVTZXRfRU5VTV9UWVBFX1VOS05PV05fZW51bV92YWx1ZSA9IDAKKwlGZWF0dXJlU2V0X09QRU5fZW51bV92YWx1ZSAgICAgICAgICAgICAgPSAxCisJRmVhdHVyZVNldF9DTE9TRURfZW51bV92YWx1ZSAgICAgICAgICAgID0gMgorKQorCisvLyBGdWxsIGFuZCBzaG9ydCBuYW1lcyBmb3IgZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQuUmVwZWF0ZWRGaWVsZEVuY29kaW5nLgorY29uc3QgKAorCUZlYXR1cmVTZXRfUmVwZWF0ZWRGaWVsZEVuY29kaW5nX2VudW1fZnVsbG5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQuUmVwZWF0ZWRGaWVsZEVuY29kaW5nIgorCUZlYXR1cmVTZXRfUmVwZWF0ZWRGaWVsZEVuY29kaW5nX2VudW1fbmFtZSAgICAgPSAiUmVwZWF0ZWRGaWVsZEVuY29kaW5nIgorKQorCisvLyBFbnVtIHZhbHVlcyBmb3IgZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQuUmVwZWF0ZWRGaWVsZEVuY29kaW5nLgorY29uc3QgKAorCUZlYXR1cmVTZXRfUkVQRUFURURfRklFTERfRU5DT0RJTkdfVU5LTk9XTl9lbnVtX3ZhbHVlID0gMAorCUZlYXR1cmVTZXRfUEFDS0VEX2VudW1fdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgID0gMQorCUZlYXR1cmVTZXRfRVhQQU5ERURfZW51bV92YWx1ZSAgICAgICAgICAgICAgICAgICAgICAgID0gMgorKQorCisvLyBGdWxsIGFuZCBzaG9ydCBuYW1lcyBmb3IgZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQuVXRmOFZhbGlkYXRpb24uCitjb25zdCAoCisJRmVhdHVyZVNldF9VdGY4VmFsaWRhdGlvbl9lbnVtX2Z1bGxuYW1lID0gImdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0LlV0ZjhWYWxpZGF0aW9uIgorCUZlYXR1cmVTZXRfVXRmOFZhbGlkYXRpb25fZW51bV9uYW1lICAgICA9ICJVdGY4VmFsaWRhdGlvbiIKKykKKworLy8gRW51bSB2YWx1ZXMgZm9yIGdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0LlV0ZjhWYWxpZGF0aW9uLgorY29uc3QgKAorCUZlYXR1cmVTZXRfVVRGOF9WQUxJREFUSU9OX1VOS05PV05fZW51bV92YWx1ZSA9IDAKKwlGZWF0dXJlU2V0X1ZFUklGWV9lbnVtX3ZhbHVlICAgICAgICAgICAgICAgICAgPSAyCisJRmVhdHVyZVNldF9OT05FX2VudW1fdmFsdWUgICAgICAgICAgICAgICAgICAgID0gMworKQorCisvLyBGdWxsIGFuZCBzaG9ydCBuYW1lcyBmb3IgZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQuTWVzc2FnZUVuY29kaW5nLgorY29uc3QgKAorCUZlYXR1cmVTZXRfTWVzc2FnZUVuY29kaW5nX2VudW1fZnVsbG5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQuTWVzc2FnZUVuY29kaW5nIgorCUZlYXR1cmVTZXRfTWVzc2FnZUVuY29kaW5nX2VudW1fbmFtZSAgICAgPSAiTWVzc2FnZUVuY29kaW5nIgorKQorCisvLyBFbnVtIHZhbHVlcyBmb3IgZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQuTWVzc2FnZUVuY29kaW5nLgorY29uc3QgKAorCUZlYXR1cmVTZXRfTUVTU0FHRV9FTkNPRElOR19VTktOT1dOX2VudW1fdmFsdWUgPSAwCisJRmVhdHVyZVNldF9MRU5HVEhfUFJFRklYRURfZW51bV92YWx1ZSAgICAgICAgICA9IDEKKwlGZWF0dXJlU2V0X0RFTElNSVRFRF9lbnVtX3ZhbHVlICAgICAgICAgICAgICAgID0gMgorKQorCisvLyBGdWxsIGFuZCBzaG9ydCBuYW1lcyBmb3IgZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXQuSnNvbkZvcm1hdC4KK2NvbnN0ICgKKwlGZWF0dXJlU2V0X0pzb25Gb3JtYXRfZW51bV9mdWxsbmFtZSA9ICJnb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5Kc29uRm9ybWF0IgorCUZlYXR1cmVTZXRfSnNvbkZvcm1hdF9lbnVtX25hbWUgICAgID0gIkpzb25Gb3JtYXQiCispCisKKy8vIEVudW0gdmFsdWVzIGZvciBnb29nbGUucHJvdG9idWYuRmVhdHVyZVNldC5Kc29uRm9ybWF0LgorY29uc3QgKAorCUZlYXR1cmVTZXRfSlNPTl9GT1JNQVRfVU5LTk9XTl9lbnVtX3ZhbHVlID0gMAorCUZlYXR1cmVTZXRfQUxMT1dfZW51bV92YWx1ZSAgICAgICAgICAgICAgID0gMQorCUZlYXR1cmVTZXRfTEVHQUNZX0JFU1RfRUZGT1JUX2VudW1fdmFsdWUgID0gMgorKQorCisvLyBOYW1lcyBmb3IgZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXREZWZhdWx0cy4KK2NvbnN0ICgKKwlGZWF0dXJlU2V0RGVmYXVsdHNfbWVzc2FnZV9uYW1lICAgICBwcm90b3JlZmxlY3QuTmFtZSAgICAgPSAiRmVhdHVyZVNldERlZmF1bHRzIgorCUZlYXR1cmVTZXREZWZhdWx0c19tZXNzYWdlX2Z1bGxuYW1lIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuRmVhdHVyZVNldERlZmF1bHRzIgorKQorCisvLyBGaWVsZCBuYW1lcyBmb3IgZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXREZWZhdWx0cy4KK2NvbnN0ICgKKwlGZWF0dXJlU2V0RGVmYXVsdHNfRGVmYXVsdHNfZmllbGRfbmFtZSAgICAgICBwcm90b3JlZmxlY3QuTmFtZSA9ICJkZWZhdWx0cyIKKwlGZWF0dXJlU2V0RGVmYXVsdHNfTWluaW11bUVkaXRpb25fZmllbGRfbmFtZSBwcm90b3JlZmxlY3QuTmFtZSA9ICJtaW5pbXVtX2VkaXRpb24iCisJRmVhdHVyZVNldERlZmF1bHRzX01heGltdW1FZGl0aW9uX2ZpZWxkX25hbWUgcHJvdG9yZWZsZWN0Lk5hbWUgPSAibWF4aW11bV9lZGl0aW9uIgorCisJRmVhdHVyZVNldERlZmF1bHRzX0RlZmF1bHRzX2ZpZWxkX2Z1bGxuYW1lICAgICAgIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuRmVhdHVyZVNldERlZmF1bHRzLmRlZmF1bHRzIgorCUZlYXR1cmVTZXREZWZhdWx0c19NaW5pbXVtRWRpdGlvbl9maWVsZF9mdWxsbmFtZSBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXREZWZhdWx0cy5taW5pbXVtX2VkaXRpb24iCisJRmVhdHVyZVNldERlZmF1bHRzX01heGltdW1FZGl0aW9uX2ZpZWxkX2Z1bGxuYW1lIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuRmVhdHVyZVNldERlZmF1bHRzLm1heGltdW1fZWRpdGlvbiIKKykKKworLy8gRmllbGQgbnVtYmVycyBmb3IgZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXREZWZhdWx0cy4KK2NvbnN0ICgKKwlGZWF0dXJlU2V0RGVmYXVsdHNfRGVmYXVsdHNfZmllbGRfbnVtYmVyICAgICAgIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDEKKwlGZWF0dXJlU2V0RGVmYXVsdHNfTWluaW11bUVkaXRpb25fZmllbGRfbnVtYmVyIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDQKKwlGZWF0dXJlU2V0RGVmYXVsdHNfTWF4aW11bUVkaXRpb25fZmllbGRfbnVtYmVyIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDUKKykKKworLy8gTmFtZXMgZm9yIGdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0RGVmYXVsdHMuRmVhdHVyZVNldEVkaXRpb25EZWZhdWx0LgorY29uc3QgKAorCUZlYXR1cmVTZXREZWZhdWx0c19GZWF0dXJlU2V0RWRpdGlvbkRlZmF1bHRfbWVzc2FnZV9uYW1lICAgICBwcm90b3JlZmxlY3QuTmFtZSAgICAgPSAiRmVhdHVyZVNldEVkaXRpb25EZWZhdWx0IgorCUZlYXR1cmVTZXREZWZhdWx0c19GZWF0dXJlU2V0RWRpdGlvbkRlZmF1bHRfbWVzc2FnZV9mdWxsbmFtZSBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkZlYXR1cmVTZXREZWZhdWx0cy5GZWF0dXJlU2V0RWRpdGlvbkRlZmF1bHQiCispCisKKy8vIEZpZWxkIG5hbWVzIGZvciBnb29nbGUucHJvdG9idWYuRmVhdHVyZVNldERlZmF1bHRzLkZlYXR1cmVTZXRFZGl0aW9uRGVmYXVsdC4KK2NvbnN0ICgKKwlGZWF0dXJlU2V0RGVmYXVsdHNfRmVhdHVyZVNldEVkaXRpb25EZWZhdWx0X0VkaXRpb25fZmllbGRfbmFtZSAgcHJvdG9yZWZsZWN0Lk5hbWUgPSAiZWRpdGlvbiIKKwlGZWF0dXJlU2V0RGVmYXVsdHNfRmVhdHVyZVNldEVkaXRpb25EZWZhdWx0X0ZlYXR1cmVzX2ZpZWxkX25hbWUgcHJvdG9yZWZsZWN0Lk5hbWUgPSAiZmVhdHVyZXMiCisKKwlGZWF0dXJlU2V0RGVmYXVsdHNfRmVhdHVyZVNldEVkaXRpb25EZWZhdWx0X0VkaXRpb25fZmllbGRfZnVsbG5hbWUgIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuRmVhdHVyZVNldERlZmF1bHRzLkZlYXR1cmVTZXRFZGl0aW9uRGVmYXVsdC5lZGl0aW9uIgorCUZlYXR1cmVTZXREZWZhdWx0c19GZWF0dXJlU2V0RWRpdGlvbkRlZmF1bHRfRmVhdHVyZXNfZmllbGRfZnVsbG5hbWUgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5GZWF0dXJlU2V0RGVmYXVsdHMuRmVhdHVyZVNldEVkaXRpb25EZWZhdWx0LmZlYXR1cmVzIgorKQorCisvLyBGaWVsZCBudW1iZXJzIGZvciBnb29nbGUucHJvdG9idWYuRmVhdHVyZVNldERlZmF1bHRzLkZlYXR1cmVTZXRFZGl0aW9uRGVmYXVsdC4KK2NvbnN0ICgKKwlGZWF0dXJlU2V0RGVmYXVsdHNfRmVhdHVyZVNldEVkaXRpb25EZWZhdWx0X0VkaXRpb25fZmllbGRfbnVtYmVyICBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgPSAzCisJRmVhdHVyZVNldERlZmF1bHRzX0ZlYXR1cmVTZXRFZGl0aW9uRGVmYXVsdF9GZWF0dXJlc19maWVsZF9udW1iZXIgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyID0gMgorKQorCiAvLyBOYW1lcyBmb3IgZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLgogY29uc3QgKAogCVNvdXJjZUNvZGVJbmZvX21lc3NhZ2VfbmFtZSAgICAgcHJvdG9yZWZsZWN0Lk5hbWUgICAgID0gIlNvdXJjZUNvZGVJbmZvIgpAQCAtODEzLDExICsxMjAxLDEzIEBACiAJR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbl9Tb3VyY2VGaWxlX2ZpZWxkX25hbWUgcHJvdG9yZWZsZWN0Lk5hbWUgPSAic291cmNlX2ZpbGUiCiAJR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbl9CZWdpbl9maWVsZF9uYW1lICAgICAgcHJvdG9yZWZsZWN0Lk5hbWUgPSAiYmVnaW4iCiAJR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbl9FbmRfZmllbGRfbmFtZSAgICAgICAgcHJvdG9yZWZsZWN0Lk5hbWUgPSAiZW5kIgorCUdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb25fU2VtYW50aWNfZmllbGRfbmFtZSAgIHByb3RvcmVmbGVjdC5OYW1lID0gInNlbWFudGljIgogCiAJR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbl9QYXRoX2ZpZWxkX2Z1bGxuYW1lICAgICAgIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5wYXRoIgogCUdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb25fU291cmNlRmlsZV9maWVsZF9mdWxsbmFtZSBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uc291cmNlX2ZpbGUiCiAJR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbl9CZWdpbl9maWVsZF9mdWxsbmFtZSAgICAgIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5iZWdpbiIKIAlHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uX0VuZF9maWVsZF9mdWxsbmFtZSAgICAgICAgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLmVuZCIKKwlHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uX1NlbWFudGljX2ZpZWxkX2Z1bGxuYW1lICAgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLnNlbWFudGljIgogKQogCiAvLyBGaWVsZCBudW1iZXJzIGZvciBnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi4KQEAgLTgyNiw0ICsxMjE2LDE4IEBACiAJR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbl9Tb3VyY2VGaWxlX2ZpZWxkX251bWJlciBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgPSAyCiAJR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbl9CZWdpbl9maWVsZF9udW1iZXIgICAgICBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgPSAzCiAJR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbl9FbmRfZmllbGRfbnVtYmVyICAgICAgICBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgPSA0CisJR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbl9TZW1hbnRpY19maWVsZF9udW1iZXIgICBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgPSA1CispCisKKy8vIEZ1bGwgYW5kIHNob3J0IG5hbWVzIGZvciBnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5TZW1hbnRpYy4KK2NvbnN0ICgKKwlHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uX1NlbWFudGljX2VudW1fZnVsbG5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uU2VtYW50aWMiCisJR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbl9TZW1hbnRpY19lbnVtX25hbWUgICAgID0gIlNlbWFudGljIgorKQorCisvLyBFbnVtIHZhbHVlcyBmb3IgZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uU2VtYW50aWMuCitjb25zdCAoCisJR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbl9OT05FX2VudW1fdmFsdWUgID0gMAorCUdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb25fU0VUX2VudW1fdmFsdWUgICA9IDEKKwlHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uX0FMSUFTX2VudW1fdmFsdWUgPSAyCiApCmRpZmYgLS1naXQgYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZ2VuaWQvZ29fZmVhdHVyZXNfZ2VuLmdvIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2dlbmlkL2dvX2ZlYXR1cmVzX2dlbi5nbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDkwMTVlCi0tLSAvZGV2L251bGwKKysrIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2dlbmlkL2dvX2ZlYXR1cmVzX2dlbi5nbwpAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxOSBUaGUgR28gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlCisvLyBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIENvZGUgZ2VuZXJhdGVkIGJ5IGdlbmVyYXRlLXByb3Rvcy4gRE8gTk9UIEVESVQuCisKK3BhY2thZ2UgZ2VuaWQKKworaW1wb3J0ICgKKwlwcm90b3JlZmxlY3QgImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgorKQorCitjb25zdCBGaWxlX3JlZmxlY3RfcHJvdG9kZXNjX3Byb3RvX2dvX2ZlYXR1cmVzX3Byb3RvID0gInJlZmxlY3QvcHJvdG9kZXNjL3Byb3RvL2dvX2ZlYXR1cmVzLnByb3RvIgorCisvLyBOYW1lcyBmb3IgZ29vZ2xlLnByb3RvYnVmLkdvRmVhdHVyZXMuCitjb25zdCAoCisJR29GZWF0dXJlc19tZXNzYWdlX25hbWUgICAgIHByb3RvcmVmbGVjdC5OYW1lICAgICA9ICJHb0ZlYXR1cmVzIgorCUdvRmVhdHVyZXNfbWVzc2FnZV9mdWxsbmFtZSBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkdvRmVhdHVyZXMiCispCisKKy8vIEZpZWxkIG5hbWVzIGZvciBnb29nbGUucHJvdG9idWYuR29GZWF0dXJlcy4KK2NvbnN0ICgKKwlHb0ZlYXR1cmVzX0xlZ2FjeVVubWFyc2hhbEpzb25FbnVtX2ZpZWxkX25hbWUgcHJvdG9yZWZsZWN0Lk5hbWUgPSAibGVnYWN5X3VubWFyc2hhbF9qc29uX2VudW0iCisKKwlHb0ZlYXR1cmVzX0xlZ2FjeVVubWFyc2hhbEpzb25FbnVtX2ZpZWxkX2Z1bGxuYW1lIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuR29GZWF0dXJlcy5sZWdhY3lfdW5tYXJzaGFsX2pzb25fZW51bSIKKykKKworLy8gRmllbGQgbnVtYmVycyBmb3IgZ29vZ2xlLnByb3RvYnVmLkdvRmVhdHVyZXMuCitjb25zdCAoCisJR29GZWF0dXJlc19MZWdhY3lVbm1hcnNoYWxKc29uRW51bV9maWVsZF9udW1iZXIgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyID0gMQorKQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2dlbmlkL3N0cnVjdF9nZW4uZ28gYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZ2VuaWQvc3RydWN0X2dlbi5nbwppbmRleCAxYTM4OTQ0Li5hZDZmODBjIDEwMDY0NAotLS0gYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZ2VuaWQvc3RydWN0X2dlbi5nbworKysgYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZ2VuaWQvc3RydWN0X2dlbi5nbwpAQCAtMTgsNiArMTgsMTEgQEAKIAlOdWxsVmFsdWVfZW51bV9uYW1lICAgICA9ICJOdWxsVmFsdWUiCiApCiAKKy8vIEVudW0gdmFsdWVzIGZvciBnb29nbGUucHJvdG9idWYuTnVsbFZhbHVlLgorY29uc3QgKAorCU51bGxWYWx1ZV9OVUxMX1ZBTFVFX2VudW1fdmFsdWUgPSAwCispCisKIC8vIE5hbWVzIGZvciBnb29nbGUucHJvdG9idWYuU3RydWN0LgogY29uc3QgKAogCVN0cnVjdF9tZXNzYWdlX25hbWUgICAgIHByb3RvcmVmbGVjdC5OYW1lICAgICA9ICJTdHJ1Y3QiCmRpZmYgLS1naXQgYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZ2VuaWQvdHlwZV9nZW4uZ28gYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZ2VuaWQvdHlwZV9nZW4uZ28KaW5kZXggM2JjNzEwMS4uNDliYzczZSAxMDA2NDQKLS0tIGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2dlbmlkL3R5cGVfZ2VuLmdvCisrKyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9nZW5pZC90eXBlX2dlbi5nbwpAQCAtMTgsNiArMTgsMTMgQEAKIAlTeW50YXhfZW51bV9uYW1lICAgICA9ICJTeW50YXgiCiApCiAKKy8vIEVudW0gdmFsdWVzIGZvciBnb29nbGUucHJvdG9idWYuU3ludGF4LgorY29uc3QgKAorCVN5bnRheF9TWU5UQVhfUFJPVE8yX2VudW1fdmFsdWUgICA9IDAKKwlTeW50YXhfU1lOVEFYX1BST1RPM19lbnVtX3ZhbHVlICAgPSAxCisJU3ludGF4X1NZTlRBWF9FRElUSU9OU19lbnVtX3ZhbHVlID0gMgorKQorCiAvLyBOYW1lcyBmb3IgZ29vZ2xlLnByb3RvYnVmLlR5cGUuCiBjb25zdCAoCiAJVHlwZV9tZXNzYWdlX25hbWUgICAgIHByb3RvcmVmbGVjdC5OYW1lICAgICA9ICJUeXBlIgpAQCAtMzIsNiArMzksNyBAQAogCVR5cGVfT3B0aW9uc19maWVsZF9uYW1lICAgICAgIHByb3RvcmVmbGVjdC5OYW1lID0gIm9wdGlvbnMiCiAJVHlwZV9Tb3VyY2VDb250ZXh0X2ZpZWxkX25hbWUgcHJvdG9yZWZsZWN0Lk5hbWUgPSAic291cmNlX2NvbnRleHQiCiAJVHlwZV9TeW50YXhfZmllbGRfbmFtZSAgICAgICAgcHJvdG9yZWZsZWN0Lk5hbWUgPSAic3ludGF4IgorCVR5cGVfRWRpdGlvbl9maWVsZF9uYW1lICAgICAgIHByb3RvcmVmbGVjdC5OYW1lID0gImVkaXRpb24iCiAKIAlUeXBlX05hbWVfZmllbGRfZnVsbG5hbWUgICAgICAgICAgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5UeXBlLm5hbWUiCiAJVHlwZV9GaWVsZHNfZmllbGRfZnVsbG5hbWUgICAgICAgIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuVHlwZS5maWVsZHMiCkBAIC0zOSw2ICs0Nyw3IEBACiAJVHlwZV9PcHRpb25zX2ZpZWxkX2Z1bGxuYW1lICAgICAgIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuVHlwZS5vcHRpb25zIgogCVR5cGVfU291cmNlQ29udGV4dF9maWVsZF9mdWxsbmFtZSBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLlR5cGUuc291cmNlX2NvbnRleHQiCiAJVHlwZV9TeW50YXhfZmllbGRfZnVsbG5hbWUgICAgICAgIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuVHlwZS5zeW50YXgiCisJVHlwZV9FZGl0aW9uX2ZpZWxkX2Z1bGxuYW1lICAgICAgIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuVHlwZS5lZGl0aW9uIgogKQogCiAvLyBGaWVsZCBudW1iZXJzIGZvciBnb29nbGUucHJvdG9idWYuVHlwZS4KQEAgLTQ5LDYgKzU4LDcgQEAKIAlUeXBlX09wdGlvbnNfZmllbGRfbnVtYmVyICAgICAgIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDQKIAlUeXBlX1NvdXJjZUNvbnRleHRfZmllbGRfbnVtYmVyIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDUKIAlUeXBlX1N5bnRheF9maWVsZF9udW1iZXIgICAgICAgIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDYKKwlUeXBlX0VkaXRpb25fZmllbGRfbnVtYmVyICAgICAgIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDcKICkKIAogLy8gTmFtZXMgZm9yIGdvb2dsZS5wcm90b2J1Zi5GaWVsZC4KQEAgLTEwMiwxMiArMTEyLDQzIEBACiAJRmllbGRfS2luZF9lbnVtX25hbWUgICAgID0gIktpbmQiCiApCiAKKy8vIEVudW0gdmFsdWVzIGZvciBnb29nbGUucHJvdG9idWYuRmllbGQuS2luZC4KK2NvbnN0ICgKKwlGaWVsZF9UWVBFX1VOS05PV05fZW51bV92YWx1ZSAgPSAwCisJRmllbGRfVFlQRV9ET1VCTEVfZW51bV92YWx1ZSAgID0gMQorCUZpZWxkX1RZUEVfRkxPQVRfZW51bV92YWx1ZSAgICA9IDIKKwlGaWVsZF9UWVBFX0lOVDY0X2VudW1fdmFsdWUgICAgPSAzCisJRmllbGRfVFlQRV9VSU5UNjRfZW51bV92YWx1ZSAgID0gNAorCUZpZWxkX1RZUEVfSU5UMzJfZW51bV92YWx1ZSAgICA9IDUKKwlGaWVsZF9UWVBFX0ZJWEVENjRfZW51bV92YWx1ZSAgPSA2CisJRmllbGRfVFlQRV9GSVhFRDMyX2VudW1fdmFsdWUgID0gNworCUZpZWxkX1RZUEVfQk9PTF9lbnVtX3ZhbHVlICAgICA9IDgKKwlGaWVsZF9UWVBFX1NUUklOR19lbnVtX3ZhbHVlICAgPSA5CisJRmllbGRfVFlQRV9HUk9VUF9lbnVtX3ZhbHVlICAgID0gMTAKKwlGaWVsZF9UWVBFX01FU1NBR0VfZW51bV92YWx1ZSAgPSAxMQorCUZpZWxkX1RZUEVfQllURVNfZW51bV92YWx1ZSAgICA9IDEyCisJRmllbGRfVFlQRV9VSU5UMzJfZW51bV92YWx1ZSAgID0gMTMKKwlGaWVsZF9UWVBFX0VOVU1fZW51bV92YWx1ZSAgICAgPSAxNAorCUZpZWxkX1RZUEVfU0ZJWEVEMzJfZW51bV92YWx1ZSA9IDE1CisJRmllbGRfVFlQRV9TRklYRUQ2NF9lbnVtX3ZhbHVlID0gMTYKKwlGaWVsZF9UWVBFX1NJTlQzMl9lbnVtX3ZhbHVlICAgPSAxNworCUZpZWxkX1RZUEVfU0lOVDY0X2VudW1fdmFsdWUgICA9IDE4CispCisKIC8vIEZ1bGwgYW5kIHNob3J0IG5hbWVzIGZvciBnb29nbGUucHJvdG9idWYuRmllbGQuQ2FyZGluYWxpdHkuCiBjb25zdCAoCiAJRmllbGRfQ2FyZGluYWxpdHlfZW51bV9mdWxsbmFtZSA9ICJnb29nbGUucHJvdG9idWYuRmllbGQuQ2FyZGluYWxpdHkiCiAJRmllbGRfQ2FyZGluYWxpdHlfZW51bV9uYW1lICAgICA9ICJDYXJkaW5hbGl0eSIKICkKIAorLy8gRW51bSB2YWx1ZXMgZm9yIGdvb2dsZS5wcm90b2J1Zi5GaWVsZC5DYXJkaW5hbGl0eS4KK2NvbnN0ICgKKwlGaWVsZF9DQVJESU5BTElUWV9VTktOT1dOX2VudW1fdmFsdWUgID0gMAorCUZpZWxkX0NBUkRJTkFMSVRZX09QVElPTkFMX2VudW1fdmFsdWUgPSAxCisJRmllbGRfQ0FSRElOQUxJVFlfUkVRVUlSRURfZW51bV92YWx1ZSA9IDIKKwlGaWVsZF9DQVJESU5BTElUWV9SRVBFQVRFRF9lbnVtX3ZhbHVlID0gMworKQorCiAvLyBOYW1lcyBmb3IgZ29vZ2xlLnByb3RvYnVmLkVudW0uCiBjb25zdCAoCiAJRW51bV9tZXNzYWdlX25hbWUgICAgIHByb3RvcmVmbGVjdC5OYW1lICAgICA9ICJFbnVtIgpAQCAtMTIxLDEyICsxNjIsMTQgQEAKIAlFbnVtX09wdGlvbnNfZmllbGRfbmFtZSAgICAgICBwcm90b3JlZmxlY3QuTmFtZSA9ICJvcHRpb25zIgogCUVudW1fU291cmNlQ29udGV4dF9maWVsZF9uYW1lIHByb3RvcmVmbGVjdC5OYW1lID0gInNvdXJjZV9jb250ZXh0IgogCUVudW1fU3ludGF4X2ZpZWxkX25hbWUgICAgICAgIHByb3RvcmVmbGVjdC5OYW1lID0gInN5bnRheCIKKwlFbnVtX0VkaXRpb25fZmllbGRfbmFtZSAgICAgICBwcm90b3JlZmxlY3QuTmFtZSA9ICJlZGl0aW9uIgogCiAJRW51bV9OYW1lX2ZpZWxkX2Z1bGxuYW1lICAgICAgICAgIHByb3RvcmVmbGVjdC5GdWxsTmFtZSA9ICJnb29nbGUucHJvdG9idWYuRW51bS5uYW1lIgogCUVudW1fRW51bXZhbHVlX2ZpZWxkX2Z1bGxuYW1lICAgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkVudW0uZW51bXZhbHVlIgogCUVudW1fT3B0aW9uc19maWVsZF9mdWxsbmFtZSAgICAgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkVudW0ub3B0aW9ucyIKIAlFbnVtX1NvdXJjZUNvbnRleHRfZmllbGRfZnVsbG5hbWUgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5FbnVtLnNvdXJjZV9jb250ZXh0IgogCUVudW1fU3ludGF4X2ZpZWxkX2Z1bGxuYW1lICAgICAgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkVudW0uc3ludGF4IgorCUVudW1fRWRpdGlvbl9maWVsZF9mdWxsbmFtZSAgICAgICBwcm90b3JlZmxlY3QuRnVsbE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkVudW0uZWRpdGlvbiIKICkKIAogLy8gRmllbGQgbnVtYmVycyBmb3IgZ29vZ2xlLnByb3RvYnVmLkVudW0uCkBAIC0xMzYsNiArMTc5LDcgQEAKIAlFbnVtX09wdGlvbnNfZmllbGRfbnVtYmVyICAgICAgIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDMKIAlFbnVtX1NvdXJjZUNvbnRleHRfZmllbGRfbnVtYmVyIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDQKIAlFbnVtX1N5bnRheF9maWVsZF9udW1iZXIgICAgICAgIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDUKKwlFbnVtX0VkaXRpb25fZmllbGRfbnVtYmVyICAgICAgIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciA9IDYKICkKIAogLy8gTmFtZXMgZm9yIGdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWUuCmRpZmYgLS1naXQgYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9hcGlfZXhwb3J0LmdvIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvYXBpX2V4cG9ydC5nbwppbmRleCBhYmVlNWYzLi5hMzcxZjk4IDEwMDY0NAotLS0gYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9hcGlfZXhwb3J0LmdvCisrKyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL2FwaV9leHBvcnQuZ28KQEAgLTEyLDggKzEyLDggQEAKIAkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvZW5jb2RpbmcvcHJvdG90ZXh0IgogCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9lcnJvcnMiCiAJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3Byb3RvIgotCXByZWYgImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgotCXBpZmFjZSAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcnVudGltZS9wcm90b2lmYWNlIgorCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9yZWZsZWN0L3Byb3RvcmVmbGVjdCIKKwkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcnVudGltZS9wcm90b2lmYWNlIgogKQogCiAvLyBFeHBvcnQgaXMgYSB6ZXJvLWxlbmd0aCBuYW1lZCB0eXBlIHRoYXQgZXhpc3RzIG9ubHkgdG8gZXhwb3J0IGEgc2V0IG9mCkBAIC0zMiwxMSArMzIsMTEgQEAKIAogLy8gRW51bU9mIHJldHVybnMgdGhlIHByb3RvcmVmbGVjdC5FbnVtIGludGVyZmFjZSBvdmVyIGUuCiAvLyBJdCByZXR1cm5zIG5pbCBpZiBlIGlzIG5pbC4KLWZ1bmMgKEV4cG9ydCkgRW51bU9mKGUgZW51bSkgcHJlZi5FbnVtIHsKK2Z1bmMgKEV4cG9ydCkgRW51bU9mKGUgZW51bSkgcHJvdG9yZWZsZWN0LkVudW0gewogCXN3aXRjaCBlIDo9IGUuKHR5cGUpIHsKIAljYXNlIG5pbDoKIAkJcmV0dXJuIG5pbAotCWNhc2UgcHJlZi5FbnVtOgorCWNhc2UgcHJvdG9yZWZsZWN0LkVudW06CiAJCXJldHVybiBlCiAJZGVmYXVsdDoKIAkJcmV0dXJuIGxlZ2FjeVdyYXBFbnVtKHJlZmxlY3QuVmFsdWVPZihlKSkKQEAgLTQ1LDExICs0NSwxMSBAQAogCiAvLyBFbnVtRGVzY3JpcHRvck9mIHJldHVybnMgdGhlIHByb3RvcmVmbGVjdC5FbnVtRGVzY3JpcHRvciBmb3IgZS4KIC8vIEl0IHJldHVybnMgbmlsIGlmIGUgaXMgbmlsLgotZnVuYyAoRXhwb3J0KSBFbnVtRGVzY3JpcHRvck9mKGUgZW51bSkgcHJlZi5FbnVtRGVzY3JpcHRvciB7CitmdW5jIChFeHBvcnQpIEVudW1EZXNjcmlwdG9yT2YoZSBlbnVtKSBwcm90b3JlZmxlY3QuRW51bURlc2NyaXB0b3IgewogCXN3aXRjaCBlIDo9IGUuKHR5cGUpIHsKIAljYXNlIG5pbDoKIAkJcmV0dXJuIG5pbAotCWNhc2UgcHJlZi5FbnVtOgorCWNhc2UgcHJvdG9yZWZsZWN0LkVudW06CiAJCXJldHVybiBlLkRlc2NyaXB0b3IoKQogCWRlZmF1bHQ6CiAJCXJldHVybiBMZWdhY3lMb2FkRW51bURlc2MocmVmbGVjdC5UeXBlT2YoZSkpCkBAIC01OCwxMSArNTgsMTEgQEAKIAogLy8gRW51bVR5cGVPZiByZXR1cm5zIHRoZSBwcm90b3JlZmxlY3QuRW51bVR5cGUgZm9yIGUuCiAvLyBJdCByZXR1cm5zIG5pbCBpZiBlIGlzIG5pbC4KLWZ1bmMgKEV4cG9ydCkgRW51bVR5cGVPZihlIGVudW0pIHByZWYuRW51bVR5cGUgeworZnVuYyAoRXhwb3J0KSBFbnVtVHlwZU9mKGUgZW51bSkgcHJvdG9yZWZsZWN0LkVudW1UeXBlIHsKIAlzd2l0Y2ggZSA6PSBlLih0eXBlKSB7CiAJY2FzZSBuaWw6CiAJCXJldHVybiBuaWwKLQljYXNlIHByZWYuRW51bToKKwljYXNlIHByb3RvcmVmbGVjdC5FbnVtOgogCQlyZXR1cm4gZS5UeXBlKCkKIAlkZWZhdWx0OgogCQlyZXR1cm4gbGVnYWN5TG9hZEVudW1UeXBlKHJlZmxlY3QuVHlwZU9mKGUpKQpAQCAtNzEsNyArNzEsNyBAQAogCiAvLyBFbnVtU3RyaW5nT2YgcmV0dXJucyB0aGUgZW51bSB2YWx1ZSBhcyBhIHN0cmluZywgZWl0aGVyIGFzIHRoZSBuYW1lIGlmCiAvLyB0aGUgbnVtYmVyIGlzIHJlc29sdmFibGUsIG9yIHRoZSBudW1iZXIgZm9ybWF0dGVkIGFzIGEgc3RyaW5nLgotZnVuYyAoRXhwb3J0KSBFbnVtU3RyaW5nT2YoZWQgcHJlZi5FbnVtRGVzY3JpcHRvciwgbiBwcmVmLkVudW1OdW1iZXIpIHN0cmluZyB7CitmdW5jIChFeHBvcnQpIEVudW1TdHJpbmdPZihlZCBwcm90b3JlZmxlY3QuRW51bURlc2NyaXB0b3IsIG4gcHJvdG9yZWZsZWN0LkVudW1OdW1iZXIpIHN0cmluZyB7CiAJZXYgOj0gZWQuVmFsdWVzKCkuQnlOdW1iZXIobikKIAlpZiBldiAhPSBuaWwgewogCQlyZXR1cm4gc3RyaW5nKGV2Lk5hbWUoKSkKQEAgLTg0LDcgKzg0LDcgQEAKIHR5cGUgbWVzc2FnZSA9IGludGVyZmFjZXt9CiAKIC8vIGxlZ2FjeU1lc3NhZ2VXcmFwcGVyIHdyYXBzIGEgdjIgbWVzc2FnZSBhcyBhIHYxIG1lc3NhZ2UuCi10eXBlIGxlZ2FjeU1lc3NhZ2VXcmFwcGVyIHN0cnVjdHsgbSBwcmVmLlByb3RvTWVzc2FnZSB9Cit0eXBlIGxlZ2FjeU1lc3NhZ2VXcmFwcGVyIHN0cnVjdHsgbSBwcm90b3JlZmxlY3QuUHJvdG9NZXNzYWdlIH0KIAogZnVuYyAobSBsZWdhY3lNZXNzYWdlV3JhcHBlcikgUmVzZXQoKSAgICAgICAgIHsgcHJvdG8uUmVzZXQobS5tKSB9CiBmdW5jIChtIGxlZ2FjeU1lc3NhZ2VXcmFwcGVyKSBTdHJpbmcoKSBzdHJpbmcgeyByZXR1cm4gRXhwb3J0e30uTWVzc2FnZVN0cmluZ09mKG0ubSkgfQpAQCAtOTIsMzAgKzkyLDMwIEBACiAKIC8vIFByb3RvTWVzc2FnZVYxT2YgY29udmVydHMgZWl0aGVyIGEgdjEgb3IgdjIgbWVzc2FnZSB0byBhIHYxIG1lc3NhZ2UuCiAvLyBJdCByZXR1cm5zIG5pbCBpZiBtIGlzIG5pbC4KLWZ1bmMgKEV4cG9ydCkgUHJvdG9NZXNzYWdlVjFPZihtIG1lc3NhZ2UpIHBpZmFjZS5NZXNzYWdlVjEgeworZnVuYyAoRXhwb3J0KSBQcm90b01lc3NhZ2VWMU9mKG0gbWVzc2FnZSkgcHJvdG9pZmFjZS5NZXNzYWdlVjEgewogCXN3aXRjaCBtdiA6PSBtLih0eXBlKSB7CiAJY2FzZSBuaWw6CiAJCXJldHVybiBuaWwKLQljYXNlIHBpZmFjZS5NZXNzYWdlVjE6CisJY2FzZSBwcm90b2lmYWNlLk1lc3NhZ2VWMToKIAkJcmV0dXJuIG12CiAJY2FzZSB1bndyYXBwZXI6CiAJCXJldHVybiBFeHBvcnR7fS5Qcm90b01lc3NhZ2VWMU9mKG12LnByb3RvVW53cmFwKCkpCi0JY2FzZSBwcmVmLlByb3RvTWVzc2FnZToKKwljYXNlIHByb3RvcmVmbGVjdC5Qcm90b01lc3NhZ2U6CiAJCXJldHVybiBsZWdhY3lNZXNzYWdlV3JhcHBlcnttdn0KIAlkZWZhdWx0OgogCQlwYW5pYyhmbXQuU3ByaW50ZigibWVzc2FnZSAlVCBpcyBuZWl0aGVyIGEgdjEgb3IgdjIgTWVzc2FnZSIsIG0pKQogCX0KIH0KIAotZnVuYyAoRXhwb3J0KSBwcm90b01lc3NhZ2VWMk9mKG0gbWVzc2FnZSkgcHJlZi5Qcm90b01lc3NhZ2UgeworZnVuYyAoRXhwb3J0KSBwcm90b01lc3NhZ2VWMk9mKG0gbWVzc2FnZSkgcHJvdG9yZWZsZWN0LlByb3RvTWVzc2FnZSB7CiAJc3dpdGNoIG12IDo9IG0uKHR5cGUpIHsKIAljYXNlIG5pbDoKIAkJcmV0dXJuIG5pbAotCWNhc2UgcHJlZi5Qcm90b01lc3NhZ2U6CisJY2FzZSBwcm90b3JlZmxlY3QuUHJvdG9NZXNzYWdlOgogCQlyZXR1cm4gbXYKIAljYXNlIGxlZ2FjeU1lc3NhZ2VXcmFwcGVyOgogCQlyZXR1cm4gbXYubQotCWNhc2UgcGlmYWNlLk1lc3NhZ2VWMToKKwljYXNlIHByb3RvaWZhY2UuTWVzc2FnZVYxOgogCQlyZXR1cm4gbmlsCiAJZGVmYXVsdDoKIAkJcGFuaWMoZm10LlNwcmludGYoIm1lc3NhZ2UgJVQgaXMgbmVpdGhlciBhIHYxIG9yIHYyIE1lc3NhZ2UiLCBtKSkKQEAgLTEyNCw3ICsxMjQsNyBAQAogCiAvLyBQcm90b01lc3NhZ2VWMk9mIGNvbnZlcnRzIGVpdGhlciBhIHYxIG9yIHYyIG1lc3NhZ2UgdG8gYSB2MiBtZXNzYWdlLgogLy8gSXQgcmV0dXJucyBuaWwgaWYgbSBpcyBuaWwuCi1mdW5jIChFeHBvcnQpIFByb3RvTWVzc2FnZVYyT2YobSBtZXNzYWdlKSBwcmVmLlByb3RvTWVzc2FnZSB7CitmdW5jIChFeHBvcnQpIFByb3RvTWVzc2FnZVYyT2YobSBtZXNzYWdlKSBwcm90b3JlZmxlY3QuUHJvdG9NZXNzYWdlIHsKIAlpZiBtID09IG5pbCB7CiAJCXJldHVybiBuaWwKIAl9CkBAIC0xMzYsNyArMTM2LDcgQEAKIAogLy8gTWVzc2FnZU9mIHJldHVybnMgdGhlIHByb3RvcmVmbGVjdC5NZXNzYWdlIGludGVyZmFjZSBvdmVyIG0uCiAvLyBJdCByZXR1cm5zIG5pbCBpZiBtIGlzIG5pbC4KLWZ1bmMgKEV4cG9ydCkgTWVzc2FnZU9mKG0gbWVzc2FnZSkgcHJlZi5NZXNzYWdlIHsKK2Z1bmMgKEV4cG9ydCkgTWVzc2FnZU9mKG0gbWVzc2FnZSkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2UgewogCWlmIG0gPT0gbmlsIHsKIAkJcmV0dXJuIG5pbAogCX0KQEAgLTE0OCw3ICsxNDgsNyBAQAogCiAvLyBNZXNzYWdlRGVzY3JpcHRvck9mIHJldHVybnMgdGhlIHByb3RvcmVmbGVjdC5NZXNzYWdlRGVzY3JpcHRvciBmb3IgbS4KIC8vIEl0IHJldHVybnMgbmlsIGlmIG0gaXMgbmlsLgotZnVuYyAoRXhwb3J0KSBNZXNzYWdlRGVzY3JpcHRvck9mKG0gbWVzc2FnZSkgcHJlZi5NZXNzYWdlRGVzY3JpcHRvciB7CitmdW5jIChFeHBvcnQpIE1lc3NhZ2VEZXNjcmlwdG9yT2YobSBtZXNzYWdlKSBwcm90b3JlZmxlY3QuTWVzc2FnZURlc2NyaXB0b3IgewogCWlmIG0gPT0gbmlsIHsKIAkJcmV0dXJuIG5pbAogCX0KQEAgLTE2MCw3ICsxNjAsNyBAQAogCiAvLyBNZXNzYWdlVHlwZU9mIHJldHVybnMgdGhlIHByb3RvcmVmbGVjdC5NZXNzYWdlVHlwZSBmb3IgbS4KIC8vIEl0IHJldHVybnMgbmlsIGlmIG0gaXMgbmlsLgotZnVuYyAoRXhwb3J0KSBNZXNzYWdlVHlwZU9mKG0gbWVzc2FnZSkgcHJlZi5NZXNzYWdlVHlwZSB7CitmdW5jIChFeHBvcnQpIE1lc3NhZ2VUeXBlT2YobSBtZXNzYWdlKSBwcm90b3JlZmxlY3QuTWVzc2FnZVR5cGUgewogCWlmIG0gPT0gbmlsIHsKIAkJcmV0dXJuIG5pbAogCX0KQEAgLTE3Miw2ICsxNzIsNiBAQAogCiAvLyBNZXNzYWdlU3RyaW5nT2YgcmV0dXJucyB0aGUgbWVzc2FnZSB2YWx1ZSBhcyBhIHN0cmluZywKIC8vIHdoaWNoIGlzIHRoZSBtZXNzYWdlIHNlcmlhbGl6ZWQgaW4gdGhlIHByb3RvYnVmIHRleHQgZm9ybWF0LgotZnVuYyAoRXhwb3J0KSBNZXNzYWdlU3RyaW5nT2YobSBwcmVmLlByb3RvTWVzc2FnZSkgc3RyaW5nIHsKK2Z1bmMgKEV4cG9ydCkgTWVzc2FnZVN0cmluZ09mKG0gcHJvdG9yZWZsZWN0LlByb3RvTWVzc2FnZSkgc3RyaW5nIHsKIAlyZXR1cm4gcHJvdG90ZXh0Lk1hcnNoYWxPcHRpb25ze011bHRpbGluZTogZmFsc2V9LkZvcm1hdChtKQogfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvY2hlY2tpbml0LmdvIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvY2hlY2tpbml0LmdvCmluZGV4IGI4MjM0MWUuLmJmZjA0MWUgMTAwNjQ0Ci0tLSBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL2NoZWNraW5pdC5nbworKysgYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9jaGVja2luaXQuZ28KQEAgLTgsMTggKzgsMTggQEAKIAkic3luYyIKIAogCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9lcnJvcnMiCi0JcHJlZiAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZmxlY3QiCi0JcGlmYWNlICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9ydW50aW1lL3Byb3RvaWZhY2UiCisJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgorCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9ydW50aW1lL3Byb3RvaWZhY2UiCiApCiAKLWZ1bmMgKG1pICpNZXNzYWdlSW5mbykgY2hlY2tJbml0aWFsaXplZChpbiBwaWZhY2UuQ2hlY2tJbml0aWFsaXplZElucHV0KSAocGlmYWNlLkNoZWNrSW5pdGlhbGl6ZWRPdXRwdXQsIGVycm9yKSB7CitmdW5jIChtaSAqTWVzc2FnZUluZm8pIGNoZWNrSW5pdGlhbGl6ZWQoaW4gcHJvdG9pZmFjZS5DaGVja0luaXRpYWxpemVkSW5wdXQpIChwcm90b2lmYWNlLkNoZWNrSW5pdGlhbGl6ZWRPdXRwdXQsIGVycm9yKSB7CiAJdmFyIHAgcG9pbnRlcgogCWlmIG1zLCBvayA6PSBpbi5NZXNzYWdlLigqbWVzc2FnZVN0YXRlKTsgb2sgewogCQlwID0gbXMucG9pbnRlcigpCiAJfSBlbHNlIHsKIAkJcCA9IGluLk1lc3NhZ2UuKCptZXNzYWdlUmVmbGVjdFdyYXBwZXIpLnBvaW50ZXIoKQogCX0KLQlyZXR1cm4gcGlmYWNlLkNoZWNrSW5pdGlhbGl6ZWRPdXRwdXR7fSwgbWkuY2hlY2tJbml0aWFsaXplZFBvaW50ZXIocCkKKwlyZXR1cm4gcHJvdG9pZmFjZS5DaGVja0luaXRpYWxpemVkT3V0cHV0e30sIG1pLmNoZWNrSW5pdGlhbGl6ZWRQb2ludGVyKHApCiB9CiAKIGZ1bmMgKG1pICpNZXNzYWdlSW5mbykgY2hlY2tJbml0aWFsaXplZFBvaW50ZXIocCBwb2ludGVyKSBlcnJvciB7CkBAIC05MCw3ICs5MCw3IEBACiAvLyBuZWVkc0luaXRDaGVjayByZXBvcnRzIHdoZXRoZXIgYSBtZXNzYWdlIG5lZWRzIHRvIGJlIGNoZWNrZWQgZm9yIHBhcnRpYWwgaW5pdGlhbGl6YXRpb24uCiAvLwogLy8gSXQgcmV0dXJucyB0cnVlIGlmIHRoZSBtZXNzYWdlIHRyYW5zaXRpdmVseSBpbmNsdWRlcyBhbnkgcmVxdWlyZWQgb3IgZXh0ZW5zaW9uIGZpZWxkcy4KLWZ1bmMgbmVlZHNJbml0Q2hlY2sobWQgcHJlZi5NZXNzYWdlRGVzY3JpcHRvcikgYm9vbCB7CitmdW5jIG5lZWRzSW5pdENoZWNrKG1kIHByb3RvcmVmbGVjdC5NZXNzYWdlRGVzY3JpcHRvcikgYm9vbCB7CiAJaWYgdiwgb2sgOj0gbmVlZHNJbml0Q2hlY2tNYXAuTG9hZChtZCk7IG9rIHsKIAkJaWYgaGFzLCBvayA6PSB2Lihib29sKTsgb2sgewogCQkJcmV0dXJuIGhhcwpAQCAtMTAxLDcgKzEwMSw3IEBACiAJcmV0dXJuIG5lZWRzSW5pdENoZWNrTG9ja2VkKG1kKQogfQogCi1mdW5jIG5lZWRzSW5pdENoZWNrTG9ja2VkKG1kIHByZWYuTWVzc2FnZURlc2NyaXB0b3IpIChoYXMgYm9vbCkgeworZnVuYyBuZWVkc0luaXRDaGVja0xvY2tlZChtZCBwcm90b3JlZmxlY3QuTWVzc2FnZURlc2NyaXB0b3IpIChoYXMgYm9vbCkgewogCWlmIHYsIG9rIDo9IG5lZWRzSW5pdENoZWNrTWFwLkxvYWQobWQpOyBvayB7CiAJCS8vIElmIGhhcyBpcyB0cnVlLCB3ZSd2ZSBwcmV2aW91c2x5IGRldGVybWluZWQgdGhhdCB0aGlzIG1lc3NhZ2UKIAkJLy8gbmVlZHMgaW5pdCBjaGVja3MuCmRpZmYgLS1naXQgYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9jb2RlY19leHRlbnNpb24uZ28gYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9jb2RlY19leHRlbnNpb24uZ28KaW5kZXggMDhkMzUxNy4uMmI4ZjEyMiAxMDA2NDQKLS0tIGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvY29kZWNfZXh0ZW5zaW9uLmdvCisrKyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL2NvZGVjX2V4dGVuc2lvbi5nbwpAQCAtMTAsNyArMTAsNyBAQAogCiAJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2VuY29kaW5nL3Byb3Rvd2lyZSIKIAkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZXJyb3JzIgotCXByZWYgImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgorCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9yZWZsZWN0L3Byb3RvcmVmbGVjdCIKICkKIAogdHlwZSBleHRlbnNpb25GaWVsZEluZm8gc3RydWN0IHsKQEAgLTIxLDI5ICsyMSwyMSBAQAogCXZhbGlkYXRpb24gICAgICAgICAgdmFsaWRhdGlvbkluZm8KIH0KIAotdmFyIGxlZ2FjeUV4dGVuc2lvbkZpZWxkSW5mb0NhY2hlIHN5bmMuTWFwIC8vIG1hcFtwcm90b3JlZmxlY3QuRXh0ZW5zaW9uVHlwZV0qZXh0ZW5zaW9uRmllbGRJbmZvCi0KLWZ1bmMgZ2V0RXh0ZW5zaW9uRmllbGRJbmZvKHh0IHByZWYuRXh0ZW5zaW9uVHlwZSkgKmV4dGVuc2lvbkZpZWxkSW5mbyB7CitmdW5jIGdldEV4dGVuc2lvbkZpZWxkSW5mbyh4dCBwcm90b3JlZmxlY3QuRXh0ZW5zaW9uVHlwZSkgKmV4dGVuc2lvbkZpZWxkSW5mbyB7CiAJaWYgeGksIG9rIDo9IHh0LigqRXh0ZW5zaW9uSW5mbyk7IG9rIHsKIAkJeGkubGF6eUluaXQoKQogCQlyZXR1cm4geGkuaW5mbwogCX0KLQlyZXR1cm4gbGVnYWN5TG9hZEV4dGVuc2lvbkZpZWxkSW5mbyh4dCkKKwkvLyBJZGVhbGx5IHdlJ2QgY2FjaGUgdGhlIHJlc3VsdGluZyAqZXh0ZW5zaW9uRmllbGRJbmZvIHNvIHdlIGRvbid0IGhhdmUgdG8KKwkvLyByZWNvbXB1dGUgdGhpcyBtZXRhZGF0YSByZXBlYXRlZGx5LiBCdXQgd2l0aG91dCBzdXBwb3J0IGZvciBzb21ldGhpbmcgbGlrZQorCS8vIHdlYWsgcmVmZXJlbmNlcywgc3VjaCBhIGNhY2hlIHdvdWxkIHBpbiB0ZW1wb3JhcnkgdmFsdWVzIChsaWtlIGR5bmFtaWMKKwkvLyBleHRlbnNpb24gdHlwZXMsIGNvbnN0cnVjdGVkIGZvciB0aGUgZHVyYXRpb24gb2YgYSB1c2VyIHJlcXVlc3QpIHRvIHRoZQorCS8vIGhlYXAgZm9yZXZlciwgY2F1c2luZyBtZW1vcnkgdXNhZ2Ugb2YgdGhlIGNhY2hlIHRvIGdyb3cgdW5ib3VuZGVkLgorCS8vIFNlZSBkaXNjdXNzaW9uIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9nb2xhbmcvcHJvdG9idWYvaXNzdWVzLzE1MjEuCisJcmV0dXJuIG1ha2VFeHRlbnNpb25GaWVsZEluZm8oeHQuVHlwZURlc2NyaXB0b3IoKSkKIH0KIAotLy8gbGVnYWN5TG9hZEV4dGVuc2lvbkZpZWxkSW5mbyBkeW5hbWljYWxseSBsb2FkcyBhICpFeHRlbnNpb25JbmZvIGZvciB4dC4KLWZ1bmMgbGVnYWN5TG9hZEV4dGVuc2lvbkZpZWxkSW5mbyh4dCBwcmVmLkV4dGVuc2lvblR5cGUpICpleHRlbnNpb25GaWVsZEluZm8gewotCWlmIHhpLCBvayA6PSBsZWdhY3lFeHRlbnNpb25GaWVsZEluZm9DYWNoZS5Mb2FkKHh0KTsgb2sgewotCQlyZXR1cm4geGkuKCpleHRlbnNpb25GaWVsZEluZm8pCi0JfQotCWUgOj0gbWFrZUV4dGVuc2lvbkZpZWxkSW5mbyh4dC5UeXBlRGVzY3JpcHRvcigpKQotCWlmIGUsIG9rIDo9IGxlZ2FjeU1lc3NhZ2VUeXBlQ2FjaGUuTG9hZE9yU3RvcmUoeHQsIGUpOyBvayB7Ci0JCXJldHVybiBlLigqZXh0ZW5zaW9uRmllbGRJbmZvKQotCX0KLQlyZXR1cm4gZQotfQotCi1mdW5jIG1ha2VFeHRlbnNpb25GaWVsZEluZm8oeGQgcHJlZi5FeHRlbnNpb25EZXNjcmlwdG9yKSAqZXh0ZW5zaW9uRmllbGRJbmZvIHsKK2Z1bmMgbWFrZUV4dGVuc2lvbkZpZWxkSW5mbyh4ZCBwcm90b3JlZmxlY3QuRXh0ZW5zaW9uRGVzY3JpcHRvcikgKmV4dGVuc2lvbkZpZWxkSW5mbyB7CiAJdmFyIHdpcmV0YWcgdWludDY0CiAJaWYgIXhkLklzUGFja2VkKCkgewogCQl3aXJldGFnID0gcHJvdG93aXJlLkVuY29kZVRhZyh4ZC5OdW1iZXIoKSwgd2lyZVR5cGVzW3hkLktpbmQoKV0pCkBAIC01OSwxMCArNTEsMTAgQEAKIAkvLyBUaGlzIGlzIHRydWUgZm9yIGNvbXBvc2l0ZSB0eXBlcywgd2hlcmUgd2UgcGFzcyBpbiBhIG1lc3NhZ2UsIGxpc3QsIG9yIG1hcCB0byBmaWxsIGluLAogCS8vIGFuZCBmb3IgZW51bXMsIHdoZXJlIHdlIHBhc3MgaW4gYSBwcm90b3R5cGUgdmFsdWUgdG8gc3BlY2lmeSB0aGUgY29uY3JldGUgZW51bSB0eXBlLgogCXN3aXRjaCB4ZC5LaW5kKCkgewotCWNhc2UgcHJlZi5NZXNzYWdlS2luZCwgcHJlZi5Hcm91cEtpbmQsIHByZWYuRW51bUtpbmQ6CisJY2FzZSBwcm90b3JlZmxlY3QuTWVzc2FnZUtpbmQsIHByb3RvcmVmbGVjdC5Hcm91cEtpbmQsIHByb3RvcmVmbGVjdC5FbnVtS2luZDoKIAkJZS51bm1hcnNoYWxOZWVkc1ZhbHVlID0gdHJ1ZQogCWRlZmF1bHQ6Ci0JCWlmIHhkLkNhcmRpbmFsaXR5KCkgPT0gcHJlZi5SZXBlYXRlZCB7CisJCWlmIHhkLkNhcmRpbmFsaXR5KCkgPT0gcHJvdG9yZWZsZWN0LlJlcGVhdGVkIHsKIAkJCWUudW5tYXJzaGFsTmVlZHNWYWx1ZSA9IHRydWUKIAkJfQogCX0KQEAgLTczLDIxICs2NSwyMSBAQAogCWF0b21pY09uY2UgdWludDMyIC8vIGF0b21pY2FsbHkgc2V0IGlmIHZhbHVlIGlzIHZhbGlkCiAJbXUgICAgICAgICBzeW5jLk11dGV4CiAJeGkgICAgICAgICAqZXh0ZW5zaW9uRmllbGRJbmZvCi0JdmFsdWUgICAgICBwcmVmLlZhbHVlCisJdmFsdWUgICAgICBwcm90b3JlZmxlY3QuVmFsdWUKIAliICAgICAgICAgIFtdYnl0ZQotCWZuICAgICAgICAgZnVuYygpIHByZWYuVmFsdWUKKwlmbiAgICAgICAgIGZ1bmMoKSBwcm90b3JlZmxlY3QuVmFsdWUKIH0KIAogdHlwZSBFeHRlbnNpb25GaWVsZCBzdHJ1Y3QgewotCXR5cCBwcmVmLkV4dGVuc2lvblR5cGUKKwl0eXAgcHJvdG9yZWZsZWN0LkV4dGVuc2lvblR5cGUKIAogCS8vIHZhbHVlIGlzIGVpdGhlciB0aGUgdmFsdWUgb2YgR2V0VmFsdWUsCiAJLy8gb3IgYSAqbGF6eUV4dGVuc2lvblZhbHVlIHRoYXQgdGhlbiByZXR1cm5zIHRoZSB2YWx1ZSBvZiBHZXRWYWx1ZS4KLQl2YWx1ZSBwcmVmLlZhbHVlCisJdmFsdWUgcHJvdG9yZWZsZWN0LlZhbHVlCiAJbGF6eSAgKmxhenlFeHRlbnNpb25WYWx1ZQogfQogCi1mdW5jIChmICpFeHRlbnNpb25GaWVsZCkgYXBwZW5kTGF6eUJ5dGVzKHh0IHByZWYuRXh0ZW5zaW9uVHlwZSwgeGkgKmV4dGVuc2lvbkZpZWxkSW5mbywgbnVtIHByb3Rvd2lyZS5OdW1iZXIsIHd0eXAgcHJvdG93aXJlLlR5cGUsIGIgW11ieXRlKSB7CitmdW5jIChmICpFeHRlbnNpb25GaWVsZCkgYXBwZW5kTGF6eUJ5dGVzKHh0IHByb3RvcmVmbGVjdC5FeHRlbnNpb25UeXBlLCB4aSAqZXh0ZW5zaW9uRmllbGRJbmZvLCBudW0gcHJvdG93aXJlLk51bWJlciwgd3R5cCBwcm90b3dpcmUuVHlwZSwgYiBbXWJ5dGUpIHsKIAlpZiBmLmxhenkgPT0gbmlsIHsKIAkJZi5sYXp5ID0gJmxhenlFeHRlbnNpb25WYWx1ZXt4aTogeGl9CiAJfQpAQCAtOTcsNyArODksNyBAQAogCWYubGF6eS5iID0gYXBwZW5kKGYubGF6eS5iLCBiLi4uKQogfQogCi1mdW5jIChmICpFeHRlbnNpb25GaWVsZCkgY2FuTGF6eSh4dCBwcmVmLkV4dGVuc2lvblR5cGUpIGJvb2wgeworZnVuYyAoZiAqRXh0ZW5zaW9uRmllbGQpIGNhbkxhenkoeHQgcHJvdG9yZWZsZWN0LkV4dGVuc2lvblR5cGUpIGJvb2wgewogCWlmIGYudHlwID09IG5pbCB7CiAJCXJldHVybiB0cnVlCiAJfQpAQCAtMTU0LDcgKzE0Niw3IEBACiAKIC8vIFNldCBzZXRzIHRoZSB0eXBlIGFuZCB2YWx1ZSBvZiB0aGUgZXh0ZW5zaW9uIGZpZWxkLgogLy8gVGhpcyBtdXN0IG5vdCBiZSBjYWxsZWQgY29uY3VycmVudGx5LgotZnVuYyAoZiAqRXh0ZW5zaW9uRmllbGQpIFNldCh0IHByZWYuRXh0ZW5zaW9uVHlwZSwgdiBwcmVmLlZhbHVlKSB7CitmdW5jIChmICpFeHRlbnNpb25GaWVsZCkgU2V0KHQgcHJvdG9yZWZsZWN0LkV4dGVuc2lvblR5cGUsIHYgcHJvdG9yZWZsZWN0LlZhbHVlKSB7CiAJZi50eXAgPSB0CiAJZi52YWx1ZSA9IHYKIAlmLmxhenkgPSBuaWwKQEAgLTE2MiwxNCArMTU0LDE0IEBACiAKIC8vIFNldExhenkgc2V0cyB0aGUgdHlwZSBhbmQgYSB2YWx1ZSB0aGF0IGlzIHRvIGJlIGxhemlseSBldmFsdWF0ZWQgdXBvbiBmaXJzdCB1c2UuCiAvLyBUaGlzIG11c3Qgbm90IGJlIGNhbGxlZCBjb25jdXJyZW50bHkuCi1mdW5jIChmICpFeHRlbnNpb25GaWVsZCkgU2V0TGF6eSh0IHByZWYuRXh0ZW5zaW9uVHlwZSwgZm4gZnVuYygpIHByZWYuVmFsdWUpIHsKK2Z1bmMgKGYgKkV4dGVuc2lvbkZpZWxkKSBTZXRMYXp5KHQgcHJvdG9yZWZsZWN0LkV4dGVuc2lvblR5cGUsIGZuIGZ1bmMoKSBwcm90b3JlZmxlY3QuVmFsdWUpIHsKIAlmLnR5cCA9IHQKIAlmLmxhenkgPSAmbGF6eUV4dGVuc2lvblZhbHVle2ZuOiBmbn0KIH0KIAogLy8gVmFsdWUgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGV4dGVuc2lvbiBmaWVsZC4KIC8vIFRoaXMgbWF5IGJlIGNhbGxlZCBjb25jdXJyZW50bHkuCi1mdW5jIChmICpFeHRlbnNpb25GaWVsZCkgVmFsdWUoKSBwcmVmLlZhbHVlIHsKK2Z1bmMgKGYgKkV4dGVuc2lvbkZpZWxkKSBWYWx1ZSgpIHByb3RvcmVmbGVjdC5WYWx1ZSB7CiAJaWYgZi5sYXp5ICE9IG5pbCB7CiAJCWlmIGF0b21pYy5Mb2FkVWludDMyKCZmLmxhenkuYXRvbWljT25jZSkgPT0gMCB7CiAJCQlmLmxhenlJbml0KCkKQEAgLTE4MSw3ICsxNzMsNyBAQAogCiAvLyBUeXBlIHJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGV4dGVuc2lvbiBmaWVsZC4KIC8vIFRoaXMgbWF5IGJlIGNhbGxlZCBjb25jdXJyZW50bHkuCi1mdW5jIChmIEV4dGVuc2lvbkZpZWxkKSBUeXBlKCkgcHJlZi5FeHRlbnNpb25UeXBlIHsKK2Z1bmMgKGYgRXh0ZW5zaW9uRmllbGQpIFR5cGUoKSBwcm90b3JlZmxlY3QuRXh0ZW5zaW9uVHlwZSB7CiAJcmV0dXJuIGYudHlwCiB9CiAKQEAgLTE5Myw3ICsxODUsNyBAQAogCiAvLyBJc0xhenkgcmVwb3J0cyB3aGV0aGVyIGEgZmllbGQgaXMgbGF6aWx5IGVuY29kZWQuCiAvLyBJdCBpcyBleHBvcnRlZCBmb3IgdGVzdGluZy4KLWZ1bmMgSXNMYXp5KG0gcHJlZi5NZXNzYWdlLCBmZCBwcmVmLkZpZWxkRGVzY3JpcHRvcikgYm9vbCB7CitmdW5jIElzTGF6eShtIHByb3RvcmVmbGVjdC5NZXNzYWdlLCBmZCBwcm90b3JlZmxlY3QuRmllbGREZXNjcmlwdG9yKSBib29sIHsKIAl2YXIgbWkgKk1lc3NhZ2VJbmZvCiAJdmFyIHAgcG9pbnRlcgogCXN3aXRjaCBtIDo9IG0uKHR5cGUpIHsKQEAgLTIwNiw3ICsxOTgsNyBAQAogCWRlZmF1bHQ6CiAJCXJldHVybiBmYWxzZQogCX0KLQl4ZCwgb2sgOj0gZmQuKHByZWYuRXh0ZW5zaW9uVHlwZURlc2NyaXB0b3IpCisJeGQsIG9rIDo9IGZkLihwcm90b3JlZmxlY3QuRXh0ZW5zaW9uVHlwZURlc2NyaXB0b3IpCiAJaWYgIW9rIHsKIAkJcmV0dXJuIGZhbHNlCiAJfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvY29kZWNfZmllbGQuZ28gYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9jb2RlY19maWVsZC5nbwppbmRleCBjYjRiNDgyLi4zZmFkZDI0IDEwMDY0NAotLS0gYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9jb2RlY19maWVsZC5nbworKysgYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9jb2RlY19maWVsZC5nbwpAQCAtMTIsOSArMTIsOSBAQAogCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9lbmNvZGluZy9wcm90b3dpcmUiCiAJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2Vycm9ycyIKIAkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcHJvdG8iCi0JcHJlZiAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZmxlY3QiCi0JcHJlZyAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZ2lzdHJ5IgotCXBpZmFjZSAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcnVudGltZS9wcm90b2lmYWNlIgorCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9yZWZsZWN0L3Byb3RvcmVmbGVjdCIKKwkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZ2lzdHJ5IgorCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9ydW50aW1lL3Byb3RvaWZhY2UiCiApCiAKIHR5cGUgZXJySW52YWxpZFVURjggc3RydWN0e30KQEAgLTMwLDcgKzMwLDcgQEAKIC8vIHRvIHRoZSBhcHByb3ByaWF0ZSBmaWVsZC1zcGVjaWZpYyBmdW5jdGlvbiBhcyBuZWNlc3NhcnkuCiAvLwogLy8gVGhlIHVubWFyc2hhbCBmdW5jdGlvbiBpcyBzZXQgb24gZWFjaCBmaWVsZCBpbmRpdmlkdWFsbHkgYXMgdXN1YWwuCi1mdW5jIChtaSAqTWVzc2FnZUluZm8pIGluaXRPbmVvZkZpZWxkQ29kZXJzKG9kIHByZWYuT25lb2ZEZXNjcmlwdG9yLCBzaSBzdHJ1Y3RJbmZvKSB7CitmdW5jIChtaSAqTWVzc2FnZUluZm8pIGluaXRPbmVvZkZpZWxkQ29kZXJzKG9kIHByb3RvcmVmbGVjdC5PbmVvZkRlc2NyaXB0b3IsIHNpIHN0cnVjdEluZm8pIHsKIAlmcyA6PSBzaS5vbmVvZnNCeU5hbWVbb2QuTmFtZSgpXQogCWZ0IDo9IGZzLlR5cGUKIAlvbmVvZkZpZWxkcyA6PSBtYWtlKG1hcFtyZWZsZWN0LlR5cGVdKmNvZGVyRmllbGRJbmZvKQpAQCAtMTE4LDEzICsxMTgsMTMgQEAKIAl9CiB9CiAKLWZ1bmMgbWFrZVdlYWtNZXNzYWdlRmllbGRDb2RlcihmZCBwcmVmLkZpZWxkRGVzY3JpcHRvcikgcG9pbnRlckNvZGVyRnVuY3MgeworZnVuYyBtYWtlV2Vha01lc3NhZ2VGaWVsZENvZGVyKGZkIHByb3RvcmVmbGVjdC5GaWVsZERlc2NyaXB0b3IpIHBvaW50ZXJDb2RlckZ1bmNzIHsKIAl2YXIgb25jZSBzeW5jLk9uY2UKLQl2YXIgbWVzc2FnZVR5cGUgcHJlZi5NZXNzYWdlVHlwZQorCXZhciBtZXNzYWdlVHlwZSBwcm90b3JlZmxlY3QuTWVzc2FnZVR5cGUKIAlsYXp5SW5pdCA6PSBmdW5jKCkgewogCQlvbmNlLkRvKGZ1bmMoKSB7CiAJCQltZXNzYWdlTmFtZSA6PSBmZC5NZXNzYWdlKCkuRnVsbE5hbWUoKQotCQkJbWVzc2FnZVR5cGUsIF8gPSBwcmVnLkdsb2JhbFR5cGVzLkZpbmRNZXNzYWdlQnlOYW1lKG1lc3NhZ2VOYW1lKQorCQkJbWVzc2FnZVR5cGUsIF8gPSBwcm90b3JlZ2lzdHJ5Lkdsb2JhbFR5cGVzLkZpbmRNZXNzYWdlQnlOYW1lKG1lc3NhZ2VOYW1lKQogCQl9KQogCX0KIApAQCAtMTkwLDcgKzE5MCw3IEBACiAJfQogfQogCi1mdW5jIG1ha2VNZXNzYWdlRmllbGRDb2RlcihmZCBwcmVmLkZpZWxkRGVzY3JpcHRvciwgZnQgcmVmbGVjdC5UeXBlKSBwb2ludGVyQ29kZXJGdW5jcyB7CitmdW5jIG1ha2VNZXNzYWdlRmllbGRDb2RlcihmZCBwcm90b3JlZmxlY3QuRmllbGREZXNjcmlwdG9yLCBmdCByZWZsZWN0LlR5cGUpIHBvaW50ZXJDb2RlckZ1bmNzIHsKIAlpZiBtaSA6PSBnZXRNZXNzYWdlSW5mbyhmdCk7IG1pICE9IG5pbCB7CiAJCWZ1bmNzIDo9IHBvaW50ZXJDb2RlckZ1bmNzewogCQkJc2l6ZTogICAgICBzaXplTWVzc2FnZUluZm8sCkBAIC0yODAsNyArMjgwLDcgQEAKIAlpZiBuIDwgMCB7CiAJCXJldHVybiBvdXQsIGVyckRlY29kZQogCX0KLQlvLCBlcnIgOj0gb3B0cy5PcHRpb25zKCkuVW5tYXJzaGFsU3RhdGUocGlmYWNlLlVubWFyc2hhbElucHV0eworCW8sIGVyciA6PSBvcHRzLk9wdGlvbnMoKS5Vbm1hcnNoYWxTdGF0ZShwcm90b2lmYWNlLlVubWFyc2hhbElucHV0ewogCQlCdWY6ICAgICB2LAogCQlNZXNzYWdlOiBtLlByb3RvUmVmbGVjdCgpLAogCX0pCkBAIC0yODgsMjcgKzI4OCwyNyBAQAogCQlyZXR1cm4gb3V0LCBlcnIKIAl9CiAJb3V0Lm4gPSBuCi0Jb3V0LmluaXRpYWxpemVkID0gby5GbGFncyZwaWZhY2UuVW5tYXJzaGFsSW5pdGlhbGl6ZWQgIT0gMAorCW91dC5pbml0aWFsaXplZCA9IG8uRmxhZ3MmcHJvdG9pZmFjZS5Vbm1hcnNoYWxJbml0aWFsaXplZCAhPSAwCiAJcmV0dXJuIG91dCwgbmlsCiB9CiAKLWZ1bmMgc2l6ZU1lc3NhZ2VWYWx1ZSh2IHByZWYuVmFsdWUsIHRhZ3NpemUgaW50LCBvcHRzIG1hcnNoYWxPcHRpb25zKSBpbnQgeworZnVuYyBzaXplTWVzc2FnZVZhbHVlKHYgcHJvdG9yZWZsZWN0LlZhbHVlLCB0YWdzaXplIGludCwgb3B0cyBtYXJzaGFsT3B0aW9ucykgaW50IHsKIAltIDo9IHYuTWVzc2FnZSgpLkludGVyZmFjZSgpCiAJcmV0dXJuIHNpemVNZXNzYWdlKG0sIHRhZ3NpemUsIG9wdHMpCiB9CiAKLWZ1bmMgYXBwZW5kTWVzc2FnZVZhbHVlKGIgW11ieXRlLCB2IHByZWYuVmFsdWUsIHdpcmV0YWcgdWludDY0LCBvcHRzIG1hcnNoYWxPcHRpb25zKSAoW11ieXRlLCBlcnJvcikgeworZnVuYyBhcHBlbmRNZXNzYWdlVmFsdWUoYiBbXWJ5dGUsIHYgcHJvdG9yZWZsZWN0LlZhbHVlLCB3aXJldGFnIHVpbnQ2NCwgb3B0cyBtYXJzaGFsT3B0aW9ucykgKFtdYnl0ZSwgZXJyb3IpIHsKIAltIDo9IHYuTWVzc2FnZSgpLkludGVyZmFjZSgpCiAJcmV0dXJuIGFwcGVuZE1lc3NhZ2UoYiwgbSwgd2lyZXRhZywgb3B0cykKIH0KIAotZnVuYyBjb25zdW1lTWVzc2FnZVZhbHVlKGIgW11ieXRlLCB2IHByZWYuVmFsdWUsIF8gcHJvdG93aXJlLk51bWJlciwgd3R5cCBwcm90b3dpcmUuVHlwZSwgb3B0cyB1bm1hcnNoYWxPcHRpb25zKSAocHJlZi5WYWx1ZSwgdW5tYXJzaGFsT3V0cHV0LCBlcnJvcikgeworZnVuYyBjb25zdW1lTWVzc2FnZVZhbHVlKGIgW11ieXRlLCB2IHByb3RvcmVmbGVjdC5WYWx1ZSwgXyBwcm90b3dpcmUuTnVtYmVyLCB3dHlwIHByb3Rvd2lyZS5UeXBlLCBvcHRzIHVubWFyc2hhbE9wdGlvbnMpIChwcm90b3JlZmxlY3QuVmFsdWUsIHVubWFyc2hhbE91dHB1dCwgZXJyb3IpIHsKIAltIDo9IHYuTWVzc2FnZSgpLkludGVyZmFjZSgpCiAJb3V0LCBlcnIgOj0gY29uc3VtZU1lc3NhZ2UoYiwgbSwgd3R5cCwgb3B0cykKIAlyZXR1cm4gdiwgb3V0LCBlcnIKIH0KIAotZnVuYyBpc0luaXRNZXNzYWdlVmFsdWUodiBwcmVmLlZhbHVlKSBlcnJvciB7CitmdW5jIGlzSW5pdE1lc3NhZ2VWYWx1ZSh2IHByb3RvcmVmbGVjdC5WYWx1ZSkgZXJyb3IgewogCW0gOj0gdi5NZXNzYWdlKCkuSW50ZXJmYWNlKCkKIAlyZXR1cm4gcHJvdG8uQ2hlY2tJbml0aWFsaXplZChtKQogfQpAQCAtMzIxLDE3ICszMjEsMTcgQEAKIAltZXJnZTogICAgIG1lcmdlTWVzc2FnZVZhbHVlLAogfQogCi1mdW5jIHNpemVHcm91cFZhbHVlKHYgcHJlZi5WYWx1ZSwgdGFnc2l6ZSBpbnQsIG9wdHMgbWFyc2hhbE9wdGlvbnMpIGludCB7CitmdW5jIHNpemVHcm91cFZhbHVlKHYgcHJvdG9yZWZsZWN0LlZhbHVlLCB0YWdzaXplIGludCwgb3B0cyBtYXJzaGFsT3B0aW9ucykgaW50IHsKIAltIDo9IHYuTWVzc2FnZSgpLkludGVyZmFjZSgpCiAJcmV0dXJuIHNpemVHcm91cChtLCB0YWdzaXplLCBvcHRzKQogfQogCi1mdW5jIGFwcGVuZEdyb3VwVmFsdWUoYiBbXWJ5dGUsIHYgcHJlZi5WYWx1ZSwgd2lyZXRhZyB1aW50NjQsIG9wdHMgbWFyc2hhbE9wdGlvbnMpIChbXWJ5dGUsIGVycm9yKSB7CitmdW5jIGFwcGVuZEdyb3VwVmFsdWUoYiBbXWJ5dGUsIHYgcHJvdG9yZWZsZWN0LlZhbHVlLCB3aXJldGFnIHVpbnQ2NCwgb3B0cyBtYXJzaGFsT3B0aW9ucykgKFtdYnl0ZSwgZXJyb3IpIHsKIAltIDo9IHYuTWVzc2FnZSgpLkludGVyZmFjZSgpCiAJcmV0dXJuIGFwcGVuZEdyb3VwKGIsIG0sIHdpcmV0YWcsIG9wdHMpCiB9CiAKLWZ1bmMgY29uc3VtZUdyb3VwVmFsdWUoYiBbXWJ5dGUsIHYgcHJlZi5WYWx1ZSwgbnVtIHByb3Rvd2lyZS5OdW1iZXIsIHd0eXAgcHJvdG93aXJlLlR5cGUsIG9wdHMgdW5tYXJzaGFsT3B0aW9ucykgKHByZWYuVmFsdWUsIHVubWFyc2hhbE91dHB1dCwgZXJyb3IpIHsKK2Z1bmMgY29uc3VtZUdyb3VwVmFsdWUoYiBbXWJ5dGUsIHYgcHJvdG9yZWZsZWN0LlZhbHVlLCBudW0gcHJvdG93aXJlLk51bWJlciwgd3R5cCBwcm90b3dpcmUuVHlwZSwgb3B0cyB1bm1hcnNoYWxPcHRpb25zKSAocHJvdG9yZWZsZWN0LlZhbHVlLCB1bm1hcnNoYWxPdXRwdXQsIGVycm9yKSB7CiAJbSA6PSB2Lk1lc3NhZ2UoKS5JbnRlcmZhY2UoKQogCW91dCwgZXJyIDo9IGNvbnN1bWVHcm91cChiLCBtLCBudW0sIHd0eXAsIG9wdHMpCiAJcmV0dXJuIHYsIG91dCwgZXJyCkBAIC0zNDUsNyArMzQ1LDcgQEAKIAltZXJnZTogICAgIG1lcmdlTWVzc2FnZVZhbHVlLAogfQogCi1mdW5jIG1ha2VHcm91cEZpZWxkQ29kZXIoZmQgcHJlZi5GaWVsZERlc2NyaXB0b3IsIGZ0IHJlZmxlY3QuVHlwZSkgcG9pbnRlckNvZGVyRnVuY3MgeworZnVuYyBtYWtlR3JvdXBGaWVsZENvZGVyKGZkIHByb3RvcmVmbGVjdC5GaWVsZERlc2NyaXB0b3IsIGZ0IHJlZmxlY3QuVHlwZSkgcG9pbnRlckNvZGVyRnVuY3MgewogCW51bSA6PSBmZC5OdW1iZXIoKQogCWlmIG1pIDo9IGdldE1lc3NhZ2VJbmZvKGZ0KTsgbWkgIT0gbmlsIHsKIAkJZnVuY3MgOj0gcG9pbnRlckNvZGVyRnVuY3N7CkBAIC00MjQsNyArNDI0LDcgQEAKIAlpZiBuIDwgMCB7CiAJCXJldHVybiBvdXQsIGVyckRlY29kZQogCX0KLQlvLCBlcnIgOj0gb3B0cy5PcHRpb25zKCkuVW5tYXJzaGFsU3RhdGUocGlmYWNlLlVubWFyc2hhbElucHV0eworCW8sIGVyciA6PSBvcHRzLk9wdGlvbnMoKS5Vbm1hcnNoYWxTdGF0ZShwcm90b2lmYWNlLlVubWFyc2hhbElucHV0ewogCQlCdWY6ICAgICBiLAogCQlNZXNzYWdlOiBtLlByb3RvUmVmbGVjdCgpLAogCX0pCkBAIC00MzIsMTEgKzQzMiwxMSBAQAogCQlyZXR1cm4gb3V0LCBlcnIKIAl9CiAJb3V0Lm4gPSBuCi0Jb3V0LmluaXRpYWxpemVkID0gby5GbGFncyZwaWZhY2UuVW5tYXJzaGFsSW5pdGlhbGl6ZWQgIT0gMAorCW91dC5pbml0aWFsaXplZCA9IG8uRmxhZ3MmcHJvdG9pZmFjZS5Vbm1hcnNoYWxJbml0aWFsaXplZCAhPSAwCiAJcmV0dXJuIG91dCwgbmlsCiB9CiAKLWZ1bmMgbWFrZU1lc3NhZ2VTbGljZUZpZWxkQ29kZXIoZmQgcHJlZi5GaWVsZERlc2NyaXB0b3IsIGZ0IHJlZmxlY3QuVHlwZSkgcG9pbnRlckNvZGVyRnVuY3MgeworZnVuYyBtYWtlTWVzc2FnZVNsaWNlRmllbGRDb2RlcihmZCBwcm90b3JlZmxlY3QuRmllbGREZXNjcmlwdG9yLCBmdCByZWZsZWN0LlR5cGUpIHBvaW50ZXJDb2RlckZ1bmNzIHsKIAlpZiBtaSA6PSBnZXRNZXNzYWdlSW5mbyhmdCk7IG1pICE9IG5pbCB7CiAJCWZ1bmNzIDo9IHBvaW50ZXJDb2RlckZ1bmNzewogCQkJc2l6ZTogICAgICBzaXplTWVzc2FnZVNsaWNlSW5mbywKQEAgLTU1NSw3ICs1NTUsNyBAQAogCQlyZXR1cm4gb3V0LCBlcnJEZWNvZGUKIAl9CiAJbXAgOj0gcmVmbGVjdC5OZXcoZ29UeXBlLkVsZW0oKSkKLQlvLCBlcnIgOj0gb3B0cy5PcHRpb25zKCkuVW5tYXJzaGFsU3RhdGUocGlmYWNlLlVubWFyc2hhbElucHV0eworCW8sIGVyciA6PSBvcHRzLk9wdGlvbnMoKS5Vbm1hcnNoYWxTdGF0ZShwcm90b2lmYWNlLlVubWFyc2hhbElucHV0ewogCQlCdWY6ICAgICB2LAogCQlNZXNzYWdlOiBhc01lc3NhZ2UobXApLlByb3RvUmVmbGVjdCgpLAogCX0pCkBAIC01NjQsNyArNTY0LDcgQEAKIAl9CiAJcC5BcHBlbmRQb2ludGVyU2xpY2UocG9pbnRlck9mVmFsdWUobXApKQogCW91dC5uID0gbgotCW91dC5pbml0aWFsaXplZCA9IG8uRmxhZ3MmcGlmYWNlLlVubWFyc2hhbEluaXRpYWxpemVkICE9IDAKKwlvdXQuaW5pdGlhbGl6ZWQgPSBvLkZsYWdzJnByb3RvaWZhY2UuVW5tYXJzaGFsSW5pdGlhbGl6ZWQgIT0gMAogCXJldHVybiBvdXQsIG5pbAogfQogCkBAIC01ODEsNyArNTgxLDcgQEAKIAogLy8gU2xpY2VzIG9mIG1lc3NhZ2VzCiAKLWZ1bmMgc2l6ZU1lc3NhZ2VTbGljZVZhbHVlKGxpc3R2IHByZWYuVmFsdWUsIHRhZ3NpemUgaW50LCBvcHRzIG1hcnNoYWxPcHRpb25zKSBpbnQgeworZnVuYyBzaXplTWVzc2FnZVNsaWNlVmFsdWUobGlzdHYgcHJvdG9yZWZsZWN0LlZhbHVlLCB0YWdzaXplIGludCwgb3B0cyBtYXJzaGFsT3B0aW9ucykgaW50IHsKIAlsaXN0IDo9IGxpc3R2Lkxpc3QoKQogCW4gOj0gMAogCWZvciBpLCBsbGVuIDo9IDAsIGxpc3QuTGVuKCk7IGkgPCBsbGVuOyBpKysgewpAQCAtNTkxLDcgKzU5MSw3IEBACiAJcmV0dXJuIG4KIH0KIAotZnVuYyBhcHBlbmRNZXNzYWdlU2xpY2VWYWx1ZShiIFtdYnl0ZSwgbGlzdHYgcHJlZi5WYWx1ZSwgd2lyZXRhZyB1aW50NjQsIG9wdHMgbWFyc2hhbE9wdGlvbnMpIChbXWJ5dGUsIGVycm9yKSB7CitmdW5jIGFwcGVuZE1lc3NhZ2VTbGljZVZhbHVlKGIgW11ieXRlLCBsaXN0diBwcm90b3JlZmxlY3QuVmFsdWUsIHdpcmV0YWcgdWludDY0LCBvcHRzIG1hcnNoYWxPcHRpb25zKSAoW11ieXRlLCBlcnJvcikgewogCWxpc3QgOj0gbGlzdHYuTGlzdCgpCiAJbW9wdHMgOj0gb3B0cy5PcHRpb25zKCkKIAlmb3IgaSwgbGxlbiA6PSAwLCBsaXN0LkxlbigpOyBpIDwgbGxlbjsgaSsrIHsKQEAgLTYwOCwzMCArNjA4LDMwIEBACiAJcmV0dXJuIGIsIG5pbAogfQogCi1mdW5jIGNvbnN1bWVNZXNzYWdlU2xpY2VWYWx1ZShiIFtdYnl0ZSwgbGlzdHYgcHJlZi5WYWx1ZSwgXyBwcm90b3dpcmUuTnVtYmVyLCB3dHlwIHByb3Rvd2lyZS5UeXBlLCBvcHRzIHVubWFyc2hhbE9wdGlvbnMpIChfIHByZWYuVmFsdWUsIG91dCB1bm1hcnNoYWxPdXRwdXQsIGVyciBlcnJvcikgeworZnVuYyBjb25zdW1lTWVzc2FnZVNsaWNlVmFsdWUoYiBbXWJ5dGUsIGxpc3R2IHByb3RvcmVmbGVjdC5WYWx1ZSwgXyBwcm90b3dpcmUuTnVtYmVyLCB3dHlwIHByb3Rvd2lyZS5UeXBlLCBvcHRzIHVubWFyc2hhbE9wdGlvbnMpIChfIHByb3RvcmVmbGVjdC5WYWx1ZSwgb3V0IHVubWFyc2hhbE91dHB1dCwgZXJyIGVycm9yKSB7CiAJbGlzdCA6PSBsaXN0di5MaXN0KCkKIAlpZiB3dHlwICE9IHByb3Rvd2lyZS5CeXRlc1R5cGUgewotCQlyZXR1cm4gcHJlZi5WYWx1ZXt9LCBvdXQsIGVyclVua25vd24KKwkJcmV0dXJuIHByb3RvcmVmbGVjdC5WYWx1ZXt9LCBvdXQsIGVyclVua25vd24KIAl9CiAJdiwgbiA6PSBwcm90b3dpcmUuQ29uc3VtZUJ5dGVzKGIpCiAJaWYgbiA8IDAgewotCQlyZXR1cm4gcHJlZi5WYWx1ZXt9LCBvdXQsIGVyckRlY29kZQorCQlyZXR1cm4gcHJvdG9yZWZsZWN0LlZhbHVle30sIG91dCwgZXJyRGVjb2RlCiAJfQogCW0gOj0gbGlzdC5OZXdFbGVtZW50KCkKLQlvLCBlcnIgOj0gb3B0cy5PcHRpb25zKCkuVW5tYXJzaGFsU3RhdGUocGlmYWNlLlVubWFyc2hhbElucHV0eworCW8sIGVyciA6PSBvcHRzLk9wdGlvbnMoKS5Vbm1hcnNoYWxTdGF0ZShwcm90b2lmYWNlLlVubWFyc2hhbElucHV0ewogCQlCdWY6ICAgICB2LAogCQlNZXNzYWdlOiBtLk1lc3NhZ2UoKSwKIAl9KQogCWlmIGVyciAhPSBuaWwgewotCQlyZXR1cm4gcHJlZi5WYWx1ZXt9LCBvdXQsIGVycgorCQlyZXR1cm4gcHJvdG9yZWZsZWN0LlZhbHVle30sIG91dCwgZXJyCiAJfQogCWxpc3QuQXBwZW5kKG0pCiAJb3V0Lm4gPSBuCi0Jb3V0LmluaXRpYWxpemVkID0gby5GbGFncyZwaWZhY2UuVW5tYXJzaGFsSW5pdGlhbGl6ZWQgIT0gMAorCW91dC5pbml0aWFsaXplZCA9IG8uRmxhZ3MmcHJvdG9pZmFjZS5Vbm1hcnNoYWxJbml0aWFsaXplZCAhPSAwCiAJcmV0dXJuIGxpc3R2LCBvdXQsIG5pbAogfQogCi1mdW5jIGlzSW5pdE1lc3NhZ2VTbGljZVZhbHVlKGxpc3R2IHByZWYuVmFsdWUpIGVycm9yIHsKK2Z1bmMgaXNJbml0TWVzc2FnZVNsaWNlVmFsdWUobGlzdHYgcHJvdG9yZWZsZWN0LlZhbHVlKSBlcnJvciB7CiAJbGlzdCA6PSBsaXN0di5MaXN0KCkKIAlmb3IgaSwgbGxlbiA6PSAwLCBsaXN0LkxlbigpOyBpIDwgbGxlbjsgaSsrIHsKIAkJbSA6PSBsaXN0LkdldChpKS5NZXNzYWdlKCkuSW50ZXJmYWNlKCkKQEAgLTY1MCw3ICs2NTAsNyBAQAogCW1lcmdlOiAgICAgbWVyZ2VNZXNzYWdlTGlzdFZhbHVlLAogfQogCi1mdW5jIHNpemVHcm91cFNsaWNlVmFsdWUobGlzdHYgcHJlZi5WYWx1ZSwgdGFnc2l6ZSBpbnQsIG9wdHMgbWFyc2hhbE9wdGlvbnMpIGludCB7CitmdW5jIHNpemVHcm91cFNsaWNlVmFsdWUobGlzdHYgcHJvdG9yZWZsZWN0LlZhbHVlLCB0YWdzaXplIGludCwgb3B0cyBtYXJzaGFsT3B0aW9ucykgaW50IHsKIAlsaXN0IDo9IGxpc3R2Lkxpc3QoKQogCW4gOj0gMAogCWZvciBpLCBsbGVuIDo9IDAsIGxpc3QuTGVuKCk7IGkgPCBsbGVuOyBpKysgewpAQCAtNjYwLDcgKzY2MCw3IEBACiAJcmV0dXJuIG4KIH0KIAotZnVuYyBhcHBlbmRHcm91cFNsaWNlVmFsdWUoYiBbXWJ5dGUsIGxpc3R2IHByZWYuVmFsdWUsIHdpcmV0YWcgdWludDY0LCBvcHRzIG1hcnNoYWxPcHRpb25zKSAoW11ieXRlLCBlcnJvcikgeworZnVuYyBhcHBlbmRHcm91cFNsaWNlVmFsdWUoYiBbXWJ5dGUsIGxpc3R2IHByb3RvcmVmbGVjdC5WYWx1ZSwgd2lyZXRhZyB1aW50NjQsIG9wdHMgbWFyc2hhbE9wdGlvbnMpIChbXWJ5dGUsIGVycm9yKSB7CiAJbGlzdCA6PSBsaXN0di5MaXN0KCkKIAltb3B0cyA6PSBvcHRzLk9wdGlvbnMoKQogCWZvciBpLCBsbGVuIDo9IDAsIGxpc3QuTGVuKCk7IGkgPCBsbGVuOyBpKysgewpAQCAtNjc2LDI2ICs2NzYsMjYgQEAKIAlyZXR1cm4gYiwgbmlsCiB9CiAKLWZ1bmMgY29uc3VtZUdyb3VwU2xpY2VWYWx1ZShiIFtdYnl0ZSwgbGlzdHYgcHJlZi5WYWx1ZSwgbnVtIHByb3Rvd2lyZS5OdW1iZXIsIHd0eXAgcHJvdG93aXJlLlR5cGUsIG9wdHMgdW5tYXJzaGFsT3B0aW9ucykgKF8gcHJlZi5WYWx1ZSwgb3V0IHVubWFyc2hhbE91dHB1dCwgZXJyIGVycm9yKSB7CitmdW5jIGNvbnN1bWVHcm91cFNsaWNlVmFsdWUoYiBbXWJ5dGUsIGxpc3R2IHByb3RvcmVmbGVjdC5WYWx1ZSwgbnVtIHByb3Rvd2lyZS5OdW1iZXIsIHd0eXAgcHJvdG93aXJlLlR5cGUsIG9wdHMgdW5tYXJzaGFsT3B0aW9ucykgKF8gcHJvdG9yZWZsZWN0LlZhbHVlLCBvdXQgdW5tYXJzaGFsT3V0cHV0LCBlcnIgZXJyb3IpIHsKIAlsaXN0IDo9IGxpc3R2Lkxpc3QoKQogCWlmIHd0eXAgIT0gcHJvdG93aXJlLlN0YXJ0R3JvdXBUeXBlIHsKLQkJcmV0dXJuIHByZWYuVmFsdWV7fSwgb3V0LCBlcnJVbmtub3duCisJCXJldHVybiBwcm90b3JlZmxlY3QuVmFsdWV7fSwgb3V0LCBlcnJVbmtub3duCiAJfQogCWIsIG4gOj0gcHJvdG93aXJlLkNvbnN1bWVHcm91cChudW0sIGIpCiAJaWYgbiA8IDAgewotCQlyZXR1cm4gcHJlZi5WYWx1ZXt9LCBvdXQsIGVyckRlY29kZQorCQlyZXR1cm4gcHJvdG9yZWZsZWN0LlZhbHVle30sIG91dCwgZXJyRGVjb2RlCiAJfQogCW0gOj0gbGlzdC5OZXdFbGVtZW50KCkKLQlvLCBlcnIgOj0gb3B0cy5PcHRpb25zKCkuVW5tYXJzaGFsU3RhdGUocGlmYWNlLlVubWFyc2hhbElucHV0eworCW8sIGVyciA6PSBvcHRzLk9wdGlvbnMoKS5Vbm1hcnNoYWxTdGF0ZShwcm90b2lmYWNlLlVubWFyc2hhbElucHV0ewogCQlCdWY6ICAgICBiLAogCQlNZXNzYWdlOiBtLk1lc3NhZ2UoKSwKIAl9KQogCWlmIGVyciAhPSBuaWwgewotCQlyZXR1cm4gcHJlZi5WYWx1ZXt9LCBvdXQsIGVycgorCQlyZXR1cm4gcHJvdG9yZWZsZWN0LlZhbHVle30sIG91dCwgZXJyCiAJfQogCWxpc3QuQXBwZW5kKG0pCiAJb3V0Lm4gPSBuCi0Jb3V0LmluaXRpYWxpemVkID0gby5GbGFncyZwaWZhY2UuVW5tYXJzaGFsSW5pdGlhbGl6ZWQgIT0gMAorCW91dC5pbml0aWFsaXplZCA9IG8uRmxhZ3MmcHJvdG9pZmFjZS5Vbm1hcnNoYWxJbml0aWFsaXplZCAhPSAwCiAJcmV0dXJuIGxpc3R2LCBvdXQsIG5pbAogfQogCkBAIC03MDcsNyArNzA3LDcgQEAKIAltZXJnZTogICAgIG1lcmdlTWVzc2FnZUxpc3RWYWx1ZSwKIH0KIAotZnVuYyBtYWtlR3JvdXBTbGljZUZpZWxkQ29kZXIoZmQgcHJlZi5GaWVsZERlc2NyaXB0b3IsIGZ0IHJlZmxlY3QuVHlwZSkgcG9pbnRlckNvZGVyRnVuY3MgeworZnVuYyBtYWtlR3JvdXBTbGljZUZpZWxkQ29kZXIoZmQgcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvciwgZnQgcmVmbGVjdC5UeXBlKSBwb2ludGVyQ29kZXJGdW5jcyB7CiAJbnVtIDo9IGZkLk51bWJlcigpCiAJaWYgbWkgOj0gZ2V0TWVzc2FnZUluZm8oZnQpOyBtaSAhPSBuaWwgewogCQlmdW5jcyA6PSBwb2ludGVyQ29kZXJGdW5jc3sKQEAgLTc3Miw3ICs3NzIsNyBAQAogCQlyZXR1cm4gb3V0LCBlcnJEZWNvZGUKIAl9CiAJbXAgOj0gcmVmbGVjdC5OZXcoZ29UeXBlLkVsZW0oKSkKLQlvLCBlcnIgOj0gb3B0cy5PcHRpb25zKCkuVW5tYXJzaGFsU3RhdGUocGlmYWNlLlVubWFyc2hhbElucHV0eworCW8sIGVyciA6PSBvcHRzLk9wdGlvbnMoKS5Vbm1hcnNoYWxTdGF0ZShwcm90b2lmYWNlLlVubWFyc2hhbElucHV0ewogCQlCdWY6ICAgICBiLAogCQlNZXNzYWdlOiBhc01lc3NhZ2UobXApLlByb3RvUmVmbGVjdCgpLAogCX0pCkBAIC03ODEsNyArNzgxLDcgQEAKIAl9CiAJcC5BcHBlbmRQb2ludGVyU2xpY2UocG9pbnRlck9mVmFsdWUobXApKQogCW91dC5uID0gbgotCW91dC5pbml0aWFsaXplZCA9IG8uRmxhZ3MmcGlmYWNlLlVubWFyc2hhbEluaXRpYWxpemVkICE9IDAKKwlvdXQuaW5pdGlhbGl6ZWQgPSBvLkZsYWdzJnByb3RvaWZhY2UuVW5tYXJzaGFsSW5pdGlhbGl6ZWQgIT0gMAogCXJldHVybiBvdXQsIG5pbAogfQogCkBAIC04MjIsOCArODIyLDggQEAKIAlyZXR1cm4gb3V0LCBuaWwKIH0KIAotZnVuYyBhc01lc3NhZ2UodiByZWZsZWN0LlZhbHVlKSBwcmVmLlByb3RvTWVzc2FnZSB7Ci0JaWYgbSwgb2sgOj0gdi5JbnRlcmZhY2UoKS4ocHJlZi5Qcm90b01lc3NhZ2UpOyBvayB7CitmdW5jIGFzTWVzc2FnZSh2IHJlZmxlY3QuVmFsdWUpIHByb3RvcmVmbGVjdC5Qcm90b01lc3NhZ2UgeworCWlmIG0sIG9rIDo9IHYuSW50ZXJmYWNlKCkuKHByb3RvcmVmbGVjdC5Qcm90b01lc3NhZ2UpOyBvayB7CiAJCXJldHVybiBtCiAJfQogCXJldHVybiBsZWdhY3lXcmFwTWVzc2FnZSh2KS5JbnRlcmZhY2UoKQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvY29kZWNfZ2VuLmdvIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvY29kZWNfZ2VuLmdvCmluZGV4IDFhNTA5YjYuLmY1NWRjMDEgMTAwNjQ0Ci0tLSBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL2NvZGVjX2dlbi5nbworKysgYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9jb2RlY19nZW4uZ28KQEAgLTE2MiwxMSArMTYyLDIwIEBACiBmdW5jIGNvbnN1bWVCb29sU2xpY2UoYiBbXWJ5dGUsIHAgcG9pbnRlciwgd3R5cCBwcm90b3dpcmUuVHlwZSwgZiAqY29kZXJGaWVsZEluZm8sIG9wdHMgdW5tYXJzaGFsT3B0aW9ucykgKG91dCB1bm1hcnNoYWxPdXRwdXQsIGVyciBlcnJvcikgewogCXNwIDo9IHAuQm9vbFNsaWNlKCkKIAlpZiB3dHlwID09IHByb3Rvd2lyZS5CeXRlc1R5cGUgewotCQlzIDo9ICpzcAogCQliLCBuIDo9IHByb3Rvd2lyZS5Db25zdW1lQnl0ZXMoYikKIAkJaWYgbiA8IDAgewogCQkJcmV0dXJuIG91dCwgZXJyRGVjb2RlCiAJCX0KKwkJY291bnQgOj0gMAorCQlmb3IgXywgdiA6PSByYW5nZSBiIHsKKwkJCWlmIHYgPCAweDgwIHsKKwkJCQljb3VudCsrCisJCQl9CisJCX0KKwkJaWYgY291bnQgPiAwIHsKKwkJCXAuZ3Jvd0Jvb2xTbGljZShjb3VudCkKKwkJfQorCQlzIDo9ICpzcAogCQlmb3IgbGVuKGIpID4gMCB7CiAJCQl2YXIgdiB1aW50NjQKIAkJCXZhciBuIGludApAQCAtNzMyLDExICs3NDEsMjAgQEAKIGZ1bmMgY29uc3VtZUludDMyU2xpY2UoYiBbXWJ5dGUsIHAgcG9pbnRlciwgd3R5cCBwcm90b3dpcmUuVHlwZSwgZiAqY29kZXJGaWVsZEluZm8sIG9wdHMgdW5tYXJzaGFsT3B0aW9ucykgKG91dCB1bm1hcnNoYWxPdXRwdXQsIGVyciBlcnJvcikgewogCXNwIDo9IHAuSW50MzJTbGljZSgpCiAJaWYgd3R5cCA9PSBwcm90b3dpcmUuQnl0ZXNUeXBlIHsKLQkJcyA6PSAqc3AKIAkJYiwgbiA6PSBwcm90b3dpcmUuQ29uc3VtZUJ5dGVzKGIpCiAJCWlmIG4gPCAwIHsKIAkJCXJldHVybiBvdXQsIGVyckRlY29kZQogCQl9CisJCWNvdW50IDo9IDAKKwkJZm9yIF8sIHYgOj0gcmFuZ2UgYiB7CisJCQlpZiB2IDwgMHg4MCB7CisJCQkJY291bnQrKworCQkJfQorCQl9CisJCWlmIGNvdW50ID4gMCB7CisJCQlwLmdyb3dJbnQzMlNsaWNlKGNvdW50KQorCQl9CisJCXMgOj0gKnNwCiAJCWZvciBsZW4oYikgPiAwIHsKIAkJCXZhciB2IHVpbnQ2NAogCQkJdmFyIG4gaW50CkBAIC0xMTM4LDExICsxMTU2LDIwIEBACiBmdW5jIGNvbnN1bWVTaW50MzJTbGljZShiIFtdYnl0ZSwgcCBwb2ludGVyLCB3dHlwIHByb3Rvd2lyZS5UeXBlLCBmICpjb2RlckZpZWxkSW5mbywgb3B0cyB1bm1hcnNoYWxPcHRpb25zKSAob3V0IHVubWFyc2hhbE91dHB1dCwgZXJyIGVycm9yKSB7CiAJc3AgOj0gcC5JbnQzMlNsaWNlKCkKIAlpZiB3dHlwID09IHByb3Rvd2lyZS5CeXRlc1R5cGUgewotCQlzIDo9ICpzcAogCQliLCBuIDo9IHByb3Rvd2lyZS5Db25zdW1lQnl0ZXMoYikKIAkJaWYgbiA8IDAgewogCQkJcmV0dXJuIG91dCwgZXJyRGVjb2RlCiAJCX0KKwkJY291bnQgOj0gMAorCQlmb3IgXywgdiA6PSByYW5nZSBiIHsKKwkJCWlmIHYgPCAweDgwIHsKKwkJCQljb3VudCsrCisJCQl9CisJCX0KKwkJaWYgY291bnQgPiAwIHsKKwkJCXAuZ3Jvd0ludDMyU2xpY2UoY291bnQpCisJCX0KKwkJcyA6PSAqc3AKIAkJZm9yIGxlbihiKSA+IDAgewogCQkJdmFyIHYgdWludDY0CiAJCQl2YXIgbiBpbnQKQEAgLTE1NDQsMTEgKzE1NzEsMjAgQEAKIGZ1bmMgY29uc3VtZVVpbnQzMlNsaWNlKGIgW11ieXRlLCBwIHBvaW50ZXIsIHd0eXAgcHJvdG93aXJlLlR5cGUsIGYgKmNvZGVyRmllbGRJbmZvLCBvcHRzIHVubWFyc2hhbE9wdGlvbnMpIChvdXQgdW5tYXJzaGFsT3V0cHV0LCBlcnIgZXJyb3IpIHsKIAlzcCA6PSBwLlVpbnQzMlNsaWNlKCkKIAlpZiB3dHlwID09IHByb3Rvd2lyZS5CeXRlc1R5cGUgewotCQlzIDo9ICpzcAogCQliLCBuIDo9IHByb3Rvd2lyZS5Db25zdW1lQnl0ZXMoYikKIAkJaWYgbiA8IDAgewogCQkJcmV0dXJuIG91dCwgZXJyRGVjb2RlCiAJCX0KKwkJY291bnQgOj0gMAorCQlmb3IgXywgdiA6PSByYW5nZSBiIHsKKwkJCWlmIHYgPCAweDgwIHsKKwkJCQljb3VudCsrCisJCQl9CisJCX0KKwkJaWYgY291bnQgPiAwIHsKKwkJCXAuZ3Jvd1VpbnQzMlNsaWNlKGNvdW50KQorCQl9CisJCXMgOj0gKnNwCiAJCWZvciBsZW4oYikgPiAwIHsKIAkJCXZhciB2IHVpbnQ2NAogCQkJdmFyIG4gaW50CkBAIC0xOTUwLDExICsxOTg2LDIwIEBACiBmdW5jIGNvbnN1bWVJbnQ2NFNsaWNlKGIgW11ieXRlLCBwIHBvaW50ZXIsIHd0eXAgcHJvdG93aXJlLlR5cGUsIGYgKmNvZGVyRmllbGRJbmZvLCBvcHRzIHVubWFyc2hhbE9wdGlvbnMpIChvdXQgdW5tYXJzaGFsT3V0cHV0LCBlcnIgZXJyb3IpIHsKIAlzcCA6PSBwLkludDY0U2xpY2UoKQogCWlmIHd0eXAgPT0gcHJvdG93aXJlLkJ5dGVzVHlwZSB7Ci0JCXMgOj0gKnNwCiAJCWIsIG4gOj0gcHJvdG93aXJlLkNvbnN1bWVCeXRlcyhiKQogCQlpZiBuIDwgMCB7CiAJCQlyZXR1cm4gb3V0LCBlcnJEZWNvZGUKIAkJfQorCQljb3VudCA6PSAwCisJCWZvciBfLCB2IDo9IHJhbmdlIGIgeworCQkJaWYgdiA8IDB4ODAgeworCQkJCWNvdW50KysKKwkJCX0KKwkJfQorCQlpZiBjb3VudCA+IDAgeworCQkJcC5ncm93SW50NjRTbGljZShjb3VudCkKKwkJfQorCQlzIDo9ICpzcAogCQlmb3IgbGVuKGIpID4gMCB7CiAJCQl2YXIgdiB1aW50NjQKIAkJCXZhciBuIGludApAQCAtMjM1NiwxMSArMjQwMSwyMCBAQAogZnVuYyBjb25zdW1lU2ludDY0U2xpY2UoYiBbXWJ5dGUsIHAgcG9pbnRlciwgd3R5cCBwcm90b3dpcmUuVHlwZSwgZiAqY29kZXJGaWVsZEluZm8sIG9wdHMgdW5tYXJzaGFsT3B0aW9ucykgKG91dCB1bm1hcnNoYWxPdXRwdXQsIGVyciBlcnJvcikgewogCXNwIDo9IHAuSW50NjRTbGljZSgpCiAJaWYgd3R5cCA9PSBwcm90b3dpcmUuQnl0ZXNUeXBlIHsKLQkJcyA6PSAqc3AKIAkJYiwgbiA6PSBwcm90b3dpcmUuQ29uc3VtZUJ5dGVzKGIpCiAJCWlmIG4gPCAwIHsKIAkJCXJldHVybiBvdXQsIGVyckRlY29kZQogCQl9CisJCWNvdW50IDo9IDAKKwkJZm9yIF8sIHYgOj0gcmFuZ2UgYiB7CisJCQlpZiB2IDwgMHg4MCB7CisJCQkJY291bnQrKworCQkJfQorCQl9CisJCWlmIGNvdW50ID4gMCB7CisJCQlwLmdyb3dJbnQ2NFNsaWNlKGNvdW50KQorCQl9CisJCXMgOj0gKnNwCiAJCWZvciBsZW4oYikgPiAwIHsKIAkJCXZhciB2IHVpbnQ2NAogCQkJdmFyIG4gaW50CkBAIC0yNzYyLDExICsyODE2LDIwIEBACiBmdW5jIGNvbnN1bWVVaW50NjRTbGljZShiIFtdYnl0ZSwgcCBwb2ludGVyLCB3dHlwIHByb3Rvd2lyZS5UeXBlLCBmICpjb2RlckZpZWxkSW5mbywgb3B0cyB1bm1hcnNoYWxPcHRpb25zKSAob3V0IHVubWFyc2hhbE91dHB1dCwgZXJyIGVycm9yKSB7CiAJc3AgOj0gcC5VaW50NjRTbGljZSgpCiAJaWYgd3R5cCA9PSBwcm90b3dpcmUuQnl0ZXNUeXBlIHsKLQkJcyA6PSAqc3AKIAkJYiwgbiA6PSBwcm90b3dpcmUuQ29uc3VtZUJ5dGVzKGIpCiAJCWlmIG4gPCAwIHsKIAkJCXJldHVybiBvdXQsIGVyckRlY29kZQogCQl9CisJCWNvdW50IDo9IDAKKwkJZm9yIF8sIHYgOj0gcmFuZ2UgYiB7CisJCQlpZiB2IDwgMHg4MCB7CisJCQkJY291bnQrKworCQkJfQorCQl9CisJCWlmIGNvdW50ID4gMCB7CisJCQlwLmdyb3dVaW50NjRTbGljZShjb3VudCkKKwkJfQorCQlzIDo9ICpzcAogCQlmb3IgbGVuKGIpID4gMCB7CiAJCQl2YXIgdiB1aW50NjQKIAkJCXZhciBuIGludApAQCAtMzE0NSwxMSArMzIwOCwxNSBAQAogZnVuYyBjb25zdW1lU2ZpeGVkMzJTbGljZShiIFtdYnl0ZSwgcCBwb2ludGVyLCB3dHlwIHByb3Rvd2lyZS5UeXBlLCBmICpjb2RlckZpZWxkSW5mbywgb3B0cyB1bm1hcnNoYWxPcHRpb25zKSAob3V0IHVubWFyc2hhbE91dHB1dCwgZXJyIGVycm9yKSB7CiAJc3AgOj0gcC5JbnQzMlNsaWNlKCkKIAlpZiB3dHlwID09IHByb3Rvd2lyZS5CeXRlc1R5cGUgewotCQlzIDo9ICpzcAogCQliLCBuIDo9IHByb3Rvd2lyZS5Db25zdW1lQnl0ZXMoYikKIAkJaWYgbiA8IDAgewogCQkJcmV0dXJuIG91dCwgZXJyRGVjb2RlCiAJCX0KKwkJY291bnQgOj0gbGVuKGIpIC8gcHJvdG93aXJlLlNpemVGaXhlZDMyKCkKKwkJaWYgY291bnQgPiAwIHsKKwkJCXAuZ3Jvd0ludDMyU2xpY2UoY291bnQpCisJCX0KKwkJcyA6PSAqc3AKIAkJZm9yIGxlbihiKSA+IDAgewogCQkJdiwgbiA6PSBwcm90b3dpcmUuQ29uc3VtZUZpeGVkMzIoYikKIAkJCWlmIG4gPCAwIHsKQEAgLTM0NjEsMTEgKzM1MjgsMTUgQEAKIGZ1bmMgY29uc3VtZUZpeGVkMzJTbGljZShiIFtdYnl0ZSwgcCBwb2ludGVyLCB3dHlwIHByb3Rvd2lyZS5UeXBlLCBmICpjb2RlckZpZWxkSW5mbywgb3B0cyB1bm1hcnNoYWxPcHRpb25zKSAob3V0IHVubWFyc2hhbE91dHB1dCwgZXJyIGVycm9yKSB7CiAJc3AgOj0gcC5VaW50MzJTbGljZSgpCiAJaWYgd3R5cCA9PSBwcm90b3dpcmUuQnl0ZXNUeXBlIHsKLQkJcyA6PSAqc3AKIAkJYiwgbiA6PSBwcm90b3dpcmUuQ29uc3VtZUJ5dGVzKGIpCiAJCWlmIG4gPCAwIHsKIAkJCXJldHVybiBvdXQsIGVyckRlY29kZQogCQl9CisJCWNvdW50IDo9IGxlbihiKSAvIHByb3Rvd2lyZS5TaXplRml4ZWQzMigpCisJCWlmIGNvdW50ID4gMCB7CisJCQlwLmdyb3dVaW50MzJTbGljZShjb3VudCkKKwkJfQorCQlzIDo9ICpzcAogCQlmb3IgbGVuKGIpID4gMCB7CiAJCQl2LCBuIDo9IHByb3Rvd2lyZS5Db25zdW1lRml4ZWQzMihiKQogCQkJaWYgbiA8IDAgewpAQCAtMzc3NywxMSArMzg0OCwxNSBAQAogZnVuYyBjb25zdW1lRmxvYXRTbGljZShiIFtdYnl0ZSwgcCBwb2ludGVyLCB3dHlwIHByb3Rvd2lyZS5UeXBlLCBmICpjb2RlckZpZWxkSW5mbywgb3B0cyB1bm1hcnNoYWxPcHRpb25zKSAob3V0IHVubWFyc2hhbE91dHB1dCwgZXJyIGVycm9yKSB7CiAJc3AgOj0gcC5GbG9hdDMyU2xpY2UoKQogCWlmIHd0eXAgPT0gcHJvdG93aXJlLkJ5dGVzVHlwZSB7Ci0JCXMgOj0gKnNwCiAJCWIsIG4gOj0gcHJvdG93aXJlLkNvbnN1bWVCeXRlcyhiKQogCQlpZiBuIDwgMCB7CiAJCQlyZXR1cm4gb3V0LCBlcnJEZWNvZGUKIAkJfQorCQljb3VudCA6PSBsZW4oYikgLyBwcm90b3dpcmUuU2l6ZUZpeGVkMzIoKQorCQlpZiBjb3VudCA+IDAgeworCQkJcC5ncm93RmxvYXQzMlNsaWNlKGNvdW50KQorCQl9CisJCXMgOj0gKnNwCiAJCWZvciBsZW4oYikgPiAwIHsKIAkJCXYsIG4gOj0gcHJvdG93aXJlLkNvbnN1bWVGaXhlZDMyKGIpCiAJCQlpZiBuIDwgMCB7CkBAIC00MDkzLDExICs0MTY4LDE1IEBACiBmdW5jIGNvbnN1bWVTZml4ZWQ2NFNsaWNlKGIgW11ieXRlLCBwIHBvaW50ZXIsIHd0eXAgcHJvdG93aXJlLlR5cGUsIGYgKmNvZGVyRmllbGRJbmZvLCBvcHRzIHVubWFyc2hhbE9wdGlvbnMpIChvdXQgdW5tYXJzaGFsT3V0cHV0LCBlcnIgZXJyb3IpIHsKIAlzcCA6PSBwLkludDY0U2xpY2UoKQogCWlmIHd0eXAgPT0gcHJvdG93aXJlLkJ5dGVzVHlwZSB7Ci0JCXMgOj0gKnNwCiAJCWIsIG4gOj0gcHJvdG93aXJlLkNvbnN1bWVCeXRlcyhiKQogCQlpZiBuIDwgMCB7CiAJCQlyZXR1cm4gb3V0LCBlcnJEZWNvZGUKIAkJfQorCQljb3VudCA6PSBsZW4oYikgLyBwcm90b3dpcmUuU2l6ZUZpeGVkNjQoKQorCQlpZiBjb3VudCA+IDAgeworCQkJcC5ncm93SW50NjRTbGljZShjb3VudCkKKwkJfQorCQlzIDo9ICpzcAogCQlmb3IgbGVuKGIpID4gMCB7CiAJCQl2LCBuIDo9IHByb3Rvd2lyZS5Db25zdW1lRml4ZWQ2NChiKQogCQkJaWYgbiA8IDAgewpAQCAtNDQwOSwxMSArNDQ4OCwxNSBAQAogZnVuYyBjb25zdW1lRml4ZWQ2NFNsaWNlKGIgW11ieXRlLCBwIHBvaW50ZXIsIHd0eXAgcHJvdG93aXJlLlR5cGUsIGYgKmNvZGVyRmllbGRJbmZvLCBvcHRzIHVubWFyc2hhbE9wdGlvbnMpIChvdXQgdW5tYXJzaGFsT3V0cHV0LCBlcnIgZXJyb3IpIHsKIAlzcCA6PSBwLlVpbnQ2NFNsaWNlKCkKIAlpZiB3dHlwID09IHByb3Rvd2lyZS5CeXRlc1R5cGUgewotCQlzIDo9ICpzcAogCQliLCBuIDo9IHByb3Rvd2lyZS5Db25zdW1lQnl0ZXMoYikKIAkJaWYgbiA8IDAgewogCQkJcmV0dXJuIG91dCwgZXJyRGVjb2RlCiAJCX0KKwkJY291bnQgOj0gbGVuKGIpIC8gcHJvdG93aXJlLlNpemVGaXhlZDY0KCkKKwkJaWYgY291bnQgPiAwIHsKKwkJCXAuZ3Jvd1VpbnQ2NFNsaWNlKGNvdW50KQorCQl9CisJCXMgOj0gKnNwCiAJCWZvciBsZW4oYikgPiAwIHsKIAkJCXYsIG4gOj0gcHJvdG93aXJlLkNvbnN1bWVGaXhlZDY0KGIpCiAJCQlpZiBuIDwgMCB7CkBAIC00NzI1LDExICs0ODA4LDE1IEBACiBmdW5jIGNvbnN1bWVEb3VibGVTbGljZShiIFtdYnl0ZSwgcCBwb2ludGVyLCB3dHlwIHByb3Rvd2lyZS5UeXBlLCBmICpjb2RlckZpZWxkSW5mbywgb3B0cyB1bm1hcnNoYWxPcHRpb25zKSAob3V0IHVubWFyc2hhbE91dHB1dCwgZXJyIGVycm9yKSB7CiAJc3AgOj0gcC5GbG9hdDY0U2xpY2UoKQogCWlmIHd0eXAgPT0gcHJvdG93aXJlLkJ5dGVzVHlwZSB7Ci0JCXMgOj0gKnNwCiAJCWIsIG4gOj0gcHJvdG93aXJlLkNvbnN1bWVCeXRlcyhiKQogCQlpZiBuIDwgMCB7CiAJCQlyZXR1cm4gb3V0LCBlcnJEZWNvZGUKIAkJfQorCQljb3VudCA6PSBsZW4oYikgLyBwcm90b3dpcmUuU2l6ZUZpeGVkNjQoKQorCQlpZiBjb3VudCA+IDAgeworCQkJcC5ncm93RmxvYXQ2NFNsaWNlKGNvdW50KQorCQl9CisJCXMgOj0gKnNwCiAJCWZvciBsZW4oYikgPiAwIHsKIAkJCXYsIG4gOj0gcHJvdG93aXJlLkNvbnN1bWVGaXhlZDY0KGIpCiAJCQlpZiBuIDwgMCB7CmRpZmYgLS1naXQgYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9jb2RlY19tYXAuZ28gYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9jb2RlY19tYXAuZ28KaW5kZXggYzEyNDVmZS4uMTExYjlkMSAxMDA2NDQKLS0tIGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvY29kZWNfbWFwLmdvCisrKyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL2NvZGVjX21hcC5nbwpAQCAtMTAsNyArMTAsNyBAQAogCiAJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2VuY29kaW5nL3Byb3Rvd2lyZSIKIAkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZ2VuaWQiCi0JcHJlZiAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZmxlY3QiCisJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgogKQogCiB0eXBlIG1hcEluZm8gc3RydWN0IHsKQEAgLTE5LDEyICsxOSwxMiBAQAogCXZhbFdpcmV0YWcgdWludDY0CiAJa2V5RnVuY3MgICB2YWx1ZUNvZGVyRnVuY3MKIAl2YWxGdW5jcyAgIHZhbHVlQ29kZXJGdW5jcwotCWtleVplcm8gICAgcHJlZi5WYWx1ZQotCWtleUtpbmQgICAgcHJlZi5LaW5kCisJa2V5WmVybyAgICBwcm90b3JlZmxlY3QuVmFsdWUKKwlrZXlLaW5kICAgIHByb3RvcmVmbGVjdC5LaW5kCiAJY29udiAgICAgICAqbWFwQ29udmVydGVyCiB9CiAKLWZ1bmMgZW5jb2RlckZ1bmNzRm9yTWFwKGZkIHByZWYuRmllbGREZXNjcmlwdG9yLCBmdCByZWZsZWN0LlR5cGUpICh2YWx1ZU1lc3NhZ2UgKk1lc3NhZ2VJbmZvLCBmdW5jcyBwb2ludGVyQ29kZXJGdW5jcykgeworZnVuYyBlbmNvZGVyRnVuY3NGb3JNYXAoZmQgcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvciwgZnQgcmVmbGVjdC5UeXBlKSAodmFsdWVNZXNzYWdlICpNZXNzYWdlSW5mbywgZnVuY3MgcG9pbnRlckNvZGVyRnVuY3MpIHsKIAkvLyBUT0RPOiBDb25zaWRlciBnZW5lcmF0aW5nIHNwZWNpYWxpemVkIG1hcCBjb2RlcnMuCiAJa2V5RmllbGQgOj0gZmQuTWFwS2V5KCkKIAl2YWxGaWVsZCA6PSBmZC5NYXBWYWx1ZSgpCkBAIC00NCw3ICs0NCw3IEBACiAJCWtleUtpbmQ6ICAgIGtleUZpZWxkLktpbmQoKSwKIAkJY29udjogICAgICAgY29udiwKIAl9Ci0JaWYgdmFsRmllbGQuS2luZCgpID09IHByZWYuTWVzc2FnZUtpbmQgeworCWlmIHZhbEZpZWxkLktpbmQoKSA9PSBwcm90b3JlZmxlY3QuTWVzc2FnZUtpbmQgewogCQl2YWx1ZU1lc3NhZ2UgPSBnZXRNZXNzYWdlSW5mbyhmdC5FbGVtKCkpCiAJfQogCkBAIC02OCw5ICs2OCw5IEBACiAJCX0sCiAJfQogCXN3aXRjaCB2YWxGaWVsZC5LaW5kKCkgewotCWNhc2UgcHJlZi5NZXNzYWdlS2luZDoKKwljYXNlIHByb3RvcmVmbGVjdC5NZXNzYWdlS2luZDoKIAkJZnVuY3MubWVyZ2UgPSBtZXJnZU1hcE9mTWVzc2FnZQotCWNhc2UgcHJlZi5CeXRlc0tpbmQ6CisJY2FzZSBwcm90b3JlZmxlY3QuQnl0ZXNLaW5kOgogCQlmdW5jcy5tZXJnZSA9IG1lcmdlTWFwT2ZCeXRlcwogCWRlZmF1bHQ6CiAJCWZ1bmNzLm1lcmdlID0gbWVyZ2VNYXAKQEAgLTEzNSw3ICsxMzUsNyBAQAogCQllcnIgOj0gZXJyVW5rbm93bgogCQlzd2l0Y2ggbnVtIHsKIAkJY2FzZSBnZW5pZC5NYXBFbnRyeV9LZXlfZmllbGRfbnVtYmVyOgotCQkJdmFyIHYgcHJlZi5WYWx1ZQorCQkJdmFyIHYgcHJvdG9yZWZsZWN0LlZhbHVlCiAJCQl2YXIgbyB1bm1hcnNoYWxPdXRwdXQKIAkJCXYsIG8sIGVyciA9IG1hcGkua2V5RnVuY3MudW5tYXJzaGFsKGIsIGtleSwgbnVtLCB3dHlwLCBvcHRzKQogCQkJaWYgZXJyICE9IG5pbCB7CkBAIC0xNDQsNyArMTQ0LDcgQEAKIAkJCWtleSA9IHYKIAkJCW4gPSBvLm4KIAkJY2FzZSBnZW5pZC5NYXBFbnRyeV9WYWx1ZV9maWVsZF9udW1iZXI6Ci0JCQl2YXIgdiBwcmVmLlZhbHVlCisJCQl2YXIgdiBwcm90b3JlZmxlY3QuVmFsdWUKIAkJCXZhciBvIHVubWFyc2hhbE91dHB1dAogCQkJdiwgbywgZXJyID0gbWFwaS52YWxGdW5jcy51bm1hcnNoYWwoYiwgdmFsLCBudW0sIHd0eXAsIG9wdHMpCiAJCQlpZiBlcnIgIT0gbmlsIHsKQEAgLTE5Miw3ICsxOTIsNyBAQAogCQllcnIgOj0gZXJyVW5rbm93bgogCQlzd2l0Y2ggbnVtIHsKIAkJY2FzZSAxOgotCQkJdmFyIHYgcHJlZi5WYWx1ZQorCQkJdmFyIHYgcHJvdG9yZWZsZWN0LlZhbHVlCiAJCQl2YXIgbyB1bm1hcnNoYWxPdXRwdXQKIAkJCXYsIG8sIGVyciA9IG1hcGkua2V5RnVuY3MudW5tYXJzaGFsKGIsIGtleSwgbnVtLCB3dHlwLCBvcHRzKQogCQkJaWYgZXJyICE9IG5pbCB7CmRpZmYgLS1naXQgYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9jb2RlY19tYXBfZ28xMTEuZ28gYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9jb2RlY19tYXBfZ28xMTEuZ28KaW5kZXggMjcwNmJiNi4uNGIxNTQ5MyAxMDA2NDQKLS0tIGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvY29kZWNfbWFwX2dvMTExLmdvCisrKyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL2NvZGVjX21hcF9nbzExMS5nbwpAQCAtMiw2ICsyLDcgQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlCiAvLyBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKKy8vZ286YnVpbGQgIWdvMS4xMgogLy8gK2J1aWxkICFnbzEuMTIKIAogcGFja2FnZSBpbXBsCmRpZmYgLS1naXQgYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9jb2RlY19tYXBfZ28xMTIuZ28gYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9jb2RlY19tYXBfZ28xMTIuZ28KaW5kZXggMTUzM2VmNi4uMGIzMWI2NiAxMDA2NDQKLS0tIGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvY29kZWNfbWFwX2dvMTEyLmdvCisrKyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL2NvZGVjX21hcF9nbzExMi5nbwpAQCAtMiw2ICsyLDcgQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlCiAvLyBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKKy8vZ286YnVpbGQgZ28xLjEyCiAvLyArYnVpbGQgZ28xLjEyCiAKIHBhY2thZ2UgaW1wbApkaWZmIC0tZ2l0IGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvY29kZWNfbWVzc2FnZS5nbyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL2NvZGVjX21lc3NhZ2UuZ28KaW5kZXggY2Q0MDUyNy4uNmIyZmRiYiAxMDA2NDQKLS0tIGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvY29kZWNfbWVzc2FnZS5nbworKysgYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9jb2RlY19tZXNzYWdlLmdvCkBAIC0xMiwxNSArMTIsMTUgQEAKIAkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvZW5jb2RpbmcvcHJvdG93aXJlIgogCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9lbmNvZGluZy9tZXNzYWdlc2V0IgogCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9vcmRlciIKLQlwcmVmICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9yZWZsZWN0L3Byb3RvcmVmbGVjdCIKLQlwaWZhY2UgImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3J1bnRpbWUvcHJvdG9pZmFjZSIKKwkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZmxlY3QiCisJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3J1bnRpbWUvcHJvdG9pZmFjZSIKICkKIAogLy8gY29kZXJNZXNzYWdlSW5mbyBjb250YWlucyBwZXItbWVzc2FnZSBpbmZvcm1hdGlvbiB1c2VkIGJ5IHRoZSBmYXN0LXBhdGggZnVuY3Rpb25zLgogLy8gVGhpcyBpcyBhIGRpZmZlcmVudCB0eXBlIGZyb20gTWVzc2FnZUluZm8gdG8ga2VlcCBNZXNzYWdlSW5mbyBhcyBnZW5lcmFsLXB1cnBvc2UgYXMKIC8vIHBvc3NpYmxlLgogdHlwZSBjb2Rlck1lc3NhZ2VJbmZvIHN0cnVjdCB7Ci0JbWV0aG9kcyBwaWZhY2UuTWV0aG9kcworCW1ldGhvZHMgcHJvdG9pZmFjZS5NZXRob2RzCiAKIAlvcmRlcmVkQ29kZXJGaWVsZHMgW10qY29kZXJGaWVsZEluZm8KIAlkZW5zZUNvZGVyRmllbGRzICAgW10qY29kZXJGaWVsZEluZm8KQEAgLTM4LDEzICszOCwxMyBAQAogCWZ1bmNzICAgICAgcG9pbnRlckNvZGVyRnVuY3MgLy8gZmFzdC1wYXRoIHBlci1maWVsZCBmdW5jdGlvbnMKIAltaSAgICAgICAgICpNZXNzYWdlSW5mbyAgICAgIC8vIGZpZWxkJ3MgbWVzc2FnZQogCWZ0ICAgICAgICAgcmVmbGVjdC5UeXBlCi0JdmFsaWRhdGlvbiB2YWxpZGF0aW9uSW5mbyAgIC8vIGluZm9ybWF0aW9uIHVzZWQgYnkgbWVzc2FnZSB2YWxpZGF0aW9uCi0JbnVtICAgICAgICBwcmVmLkZpZWxkTnVtYmVyIC8vIGZpZWxkIG51bWJlcgotCW9mZnNldCAgICAgb2Zmc2V0ICAgICAgICAgICAvLyBzdHJ1Y3QgZmllbGQgb2Zmc2V0Ci0Jd2lyZXRhZyAgICB1aW50NjQgICAgICAgICAgIC8vIGZpZWxkIHRhZyAobnVtYmVyICsgd2lyZSB0eXBlKQotCXRhZ3NpemUgICAgaW50ICAgICAgICAgICAgICAvLyBzaXplIG9mIHRoZSB2YXJpbnQtZW5jb2RlZCB0YWcKLQlpc1BvaW50ZXIgIGJvb2wgICAgICAgICAgICAgLy8gdHJ1ZSBpZiBJc05pbCBtYXkgYmUgY2FsbGVkIG9uIHRoZSBzdHJ1Y3QgZmllbGQKLQlpc1JlcXVpcmVkIGJvb2wgICAgICAgICAgICAgLy8gdHJ1ZSBpZiBmaWVsZCBpcyByZXF1aXJlZAorCXZhbGlkYXRpb24gdmFsaWRhdGlvbkluZm8gICAgICAgICAgIC8vIGluZm9ybWF0aW9uIHVzZWQgYnkgbWVzc2FnZSB2YWxpZGF0aW9uCisJbnVtICAgICAgICBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgLy8gZmllbGQgbnVtYmVyCisJb2Zmc2V0ICAgICBvZmZzZXQgICAgICAgICAgICAgICAgICAgLy8gc3RydWN0IGZpZWxkIG9mZnNldAorCXdpcmV0YWcgICAgdWludDY0ICAgICAgICAgICAgICAgICAgIC8vIGZpZWxkIHRhZyAobnVtYmVyICsgd2lyZSB0eXBlKQorCXRhZ3NpemUgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIC8vIHNpemUgb2YgdGhlIHZhcmludC1lbmNvZGVkIHRhZworCWlzUG9pbnRlciAgYm9vbCAgICAgICAgICAgICAgICAgICAgIC8vIHRydWUgaWYgSXNOaWwgbWF5IGJlIGNhbGxlZCBvbiB0aGUgc3RydWN0IGZpZWxkCisJaXNSZXF1aXJlZCBib29sICAgICAgICAgICAgICAgICAgICAgLy8gdHJ1ZSBpZiBmaWVsZCBpcyByZXF1aXJlZAogfQogCiBmdW5jIChtaSAqTWVzc2FnZUluZm8pIG1ha2VDb2Rlck1ldGhvZHModCByZWZsZWN0LlR5cGUsIHNpIHN0cnVjdEluZm8pIHsKQEAgLTEyNSw4ICsxMjUsOCBAQAogCQkJZnVuY3M6ICAgICAgZnVuY3MsCiAJCQltaTogICAgICAgICBjaGlsZE1lc3NhZ2UsCiAJCQl2YWxpZGF0aW9uOiBuZXdGaWVsZFZhbGlkYXRpb25JbmZvKG1pLCBzaSwgZmQsIGZ0KSwKLQkJCWlzUG9pbnRlcjogIGZkLkNhcmRpbmFsaXR5KCkgPT0gcHJlZi5SZXBlYXRlZCB8fCBmZC5IYXNQcmVzZW5jZSgpLAotCQkJaXNSZXF1aXJlZDogZmQuQ2FyZGluYWxpdHkoKSA9PSBwcmVmLlJlcXVpcmVkLAorCQkJaXNQb2ludGVyOiAgZmQuQ2FyZGluYWxpdHkoKSA9PSBwcm90b3JlZmxlY3QuUmVwZWF0ZWQgfHwgZmQuSGFzUHJlc2VuY2UoKSwKKwkJCWlzUmVxdWlyZWQ6IGZkLkNhcmRpbmFsaXR5KCkgPT0gcHJvdG9yZWZsZWN0LlJlcXVpcmVkLAogCQl9CiAJCW1pLm9yZGVyZWRDb2RlckZpZWxkcyA9IGFwcGVuZChtaS5vcmRlcmVkQ29kZXJGaWVsZHMsIGNmKQogCQltaS5jb2RlckZpZWxkc1tjZi5udW1dID0gY2YKQEAgLTE0OSw3ICsxNDksNyBAQAogCQlyZXR1cm4gbWkub3JkZXJlZENvZGVyRmllbGRzW2ldLm51bSA8IG1pLm9yZGVyZWRDb2RlckZpZWxkc1tqXS5udW0KIAl9KQogCi0JdmFyIG1heERlbnNlIHByZWYuRmllbGROdW1iZXIKKwl2YXIgbWF4RGVuc2UgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyCiAJZm9yIF8sIGNmIDo9IHJhbmdlIG1pLm9yZGVyZWRDb2RlckZpZWxkcyB7CiAJCWlmIGNmLm51bSA+PSAxNiAmJiBjZi5udW0gPj0gMiptYXhEZW5zZSB7CiAJCQlicmVhawpAQCAtMTc1LDEyICsxNzUsMTIgQEAKIAogCW1pLm5lZWRzSW5pdENoZWNrID0gbmVlZHNJbml0Q2hlY2sobWkuRGVzYykKIAlpZiBtaS5tZXRob2RzLk1hcnNoYWwgPT0gbmlsICYmIG1pLm1ldGhvZHMuU2l6ZSA9PSBuaWwgewotCQltaS5tZXRob2RzLkZsYWdzIHw9IHBpZmFjZS5TdXBwb3J0TWFyc2hhbERldGVybWluaXN0aWMKKwkJbWkubWV0aG9kcy5GbGFncyB8PSBwcm90b2lmYWNlLlN1cHBvcnRNYXJzaGFsRGV0ZXJtaW5pc3RpYwogCQltaS5tZXRob2RzLk1hcnNoYWwgPSBtaS5tYXJzaGFsCiAJCW1pLm1ldGhvZHMuU2l6ZSA9IG1pLnNpemUKIAl9CiAJaWYgbWkubWV0aG9kcy5Vbm1hcnNoYWwgPT0gbmlsIHsKLQkJbWkubWV0aG9kcy5GbGFncyB8PSBwaWZhY2UuU3VwcG9ydFVubWFyc2hhbERpc2NhcmRVbmtub3duCisJCW1pLm1ldGhvZHMuRmxhZ3MgfD0gcHJvdG9pZmFjZS5TdXBwb3J0VW5tYXJzaGFsRGlzY2FyZFVua25vd24KIAkJbWkubWV0aG9kcy5Vbm1hcnNoYWwgPSBtaS51bm1hcnNoYWwKIAl9CiAJaWYgbWkubWV0aG9kcy5DaGVja0luaXRpYWxpemVkID09IG5pbCB7CmRpZmYgLS1naXQgYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9jb2RlY19yZWZsZWN0LmdvIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvY29kZWNfcmVmbGVjdC5nbwppbmRleCA5MDcwNWUzLi4xNDVjNTc3IDEwMDY0NAotLS0gYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9jb2RlY19yZWZsZWN0LmdvCisrKyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL2NvZGVjX3JlZmxlY3QuZ28KQEAgLTIsNiArMiw3IEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZQogLy8gbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCisvL2dvOmJ1aWxkIHB1cmVnbyB8fCBhcHBlbmdpbmUKIC8vICtidWlsZCBwdXJlZ28gYXBwZW5naW5lCiAKIHBhY2thZ2UgaW1wbApkaWZmIC0tZ2l0IGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvY29kZWNfdGFibGVzLmdvIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvY29kZWNfdGFibGVzLmdvCmluZGV4IGU4OTk3MTIuLjEzMDc3NzUgMTAwNjQ0Ci0tLSBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL2NvZGVjX3RhYmxlcy5nbworKysgYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9jb2RlY190YWJsZXMuZ28KQEAgLTEwLDcgKzEwLDcgQEAKIAogCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9lbmNvZGluZy9wcm90b3dpcmUiCiAJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL3N0cnMiCi0JcHJlZiAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZmxlY3QiCisJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgogKQogCiAvLyBwb2ludGVyQ29kZXJGdW5jcyBpcyBhIHNldCBvZiBwb2ludGVyIGVuY29kaW5nIGZ1bmN0aW9ucy4KQEAgLTI1LDgzICsyNSw4MyBAQAogCiAvLyB2YWx1ZUNvZGVyRnVuY3MgaXMgYSBzZXQgb2YgcHJvdG9yZWZsZWN0LlZhbHVlIGVuY29kaW5nIGZ1bmN0aW9ucy4KIHR5cGUgdmFsdWVDb2RlckZ1bmNzIHN0cnVjdCB7Ci0Jc2l6ZSAgICAgIGZ1bmModiBwcmVmLlZhbHVlLCB0YWdzaXplIGludCwgb3B0cyBtYXJzaGFsT3B0aW9ucykgaW50Ci0JbWFyc2hhbCAgIGZ1bmMoYiBbXWJ5dGUsIHYgcHJlZi5WYWx1ZSwgd2lyZXRhZyB1aW50NjQsIG9wdHMgbWFyc2hhbE9wdGlvbnMpIChbXWJ5dGUsIGVycm9yKQotCXVubWFyc2hhbCBmdW5jKGIgW11ieXRlLCB2IHByZWYuVmFsdWUsIG51bSBwcm90b3dpcmUuTnVtYmVyLCB3dHlwIHByb3Rvd2lyZS5UeXBlLCBvcHRzIHVubWFyc2hhbE9wdGlvbnMpIChwcmVmLlZhbHVlLCB1bm1hcnNoYWxPdXRwdXQsIGVycm9yKQotCWlzSW5pdCAgICBmdW5jKHYgcHJlZi5WYWx1ZSkgZXJyb3IKLQltZXJnZSAgICAgZnVuYyhkc3QsIHNyYyBwcmVmLlZhbHVlLCBvcHRzIG1lcmdlT3B0aW9ucykgcHJlZi5WYWx1ZQorCXNpemUgICAgICBmdW5jKHYgcHJvdG9yZWZsZWN0LlZhbHVlLCB0YWdzaXplIGludCwgb3B0cyBtYXJzaGFsT3B0aW9ucykgaW50CisJbWFyc2hhbCAgIGZ1bmMoYiBbXWJ5dGUsIHYgcHJvdG9yZWZsZWN0LlZhbHVlLCB3aXJldGFnIHVpbnQ2NCwgb3B0cyBtYXJzaGFsT3B0aW9ucykgKFtdYnl0ZSwgZXJyb3IpCisJdW5tYXJzaGFsIGZ1bmMoYiBbXWJ5dGUsIHYgcHJvdG9yZWZsZWN0LlZhbHVlLCBudW0gcHJvdG93aXJlLk51bWJlciwgd3R5cCBwcm90b3dpcmUuVHlwZSwgb3B0cyB1bm1hcnNoYWxPcHRpb25zKSAocHJvdG9yZWZsZWN0LlZhbHVlLCB1bm1hcnNoYWxPdXRwdXQsIGVycm9yKQorCWlzSW5pdCAgICBmdW5jKHYgcHJvdG9yZWZsZWN0LlZhbHVlKSBlcnJvcgorCW1lcmdlICAgICBmdW5jKGRzdCwgc3JjIHByb3RvcmVmbGVjdC5WYWx1ZSwgb3B0cyBtZXJnZU9wdGlvbnMpIHByb3RvcmVmbGVjdC5WYWx1ZQogfQogCiAvLyBmaWVsZENvZGVyIHJldHVybnMgcG9pbnRlciBmdW5jdGlvbnMgZm9yIGEgZmllbGQsIHVzZWQgZm9yIG9wZXJhdGluZyBvbgogLy8gc3RydWN0IGZpZWxkcy4KLWZ1bmMgZmllbGRDb2RlcihmZCBwcmVmLkZpZWxkRGVzY3JpcHRvciwgZnQgcmVmbGVjdC5UeXBlKSAoKk1lc3NhZ2VJbmZvLCBwb2ludGVyQ29kZXJGdW5jcykgeworZnVuYyBmaWVsZENvZGVyKGZkIHByb3RvcmVmbGVjdC5GaWVsZERlc2NyaXB0b3IsIGZ0IHJlZmxlY3QuVHlwZSkgKCpNZXNzYWdlSW5mbywgcG9pbnRlckNvZGVyRnVuY3MpIHsKIAlzd2l0Y2ggewogCWNhc2UgZmQuSXNNYXAoKToKIAkJcmV0dXJuIGVuY29kZXJGdW5jc0Zvck1hcChmZCwgZnQpCi0JY2FzZSBmZC5DYXJkaW5hbGl0eSgpID09IHByZWYuUmVwZWF0ZWQgJiYgIWZkLklzUGFja2VkKCk6CisJY2FzZSBmZC5DYXJkaW5hbGl0eSgpID09IHByb3RvcmVmbGVjdC5SZXBlYXRlZCAmJiAhZmQuSXNQYWNrZWQoKToKIAkJLy8gUmVwZWF0ZWQgZmllbGRzIChub3QgcGFja2VkKS4KIAkJaWYgZnQuS2luZCgpICE9IHJlZmxlY3QuU2xpY2UgewogCQkJYnJlYWsKIAkJfQogCQlmdCA6PSBmdC5FbGVtKCkKIAkJc3dpdGNoIGZkLktpbmQoKSB7Ci0JCWNhc2UgcHJlZi5Cb29sS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuQm9vbEtpbmQ6CiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5Cb29sIHsKIAkJCQlyZXR1cm4gbmlsLCBjb2RlckJvb2xTbGljZQogCQkJfQotCQljYXNlIHByZWYuRW51bUtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LkVudW1LaW5kOgogCQkJaWYgZnQuS2luZCgpID09IHJlZmxlY3QuSW50MzIgewogCQkJCXJldHVybiBuaWwsIGNvZGVyRW51bVNsaWNlCiAJCQl9Ci0JCWNhc2UgcHJlZi5JbnQzMktpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LkludDMyS2luZDoKIAkJCWlmIGZ0LktpbmQoKSA9PSByZWZsZWN0LkludDMyIHsKIAkJCQlyZXR1cm4gbmlsLCBjb2RlckludDMyU2xpY2UKIAkJCX0KLQkJY2FzZSBwcmVmLlNpbnQzMktpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LlNpbnQzMktpbmQ6CiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5JbnQzMiB7CiAJCQkJcmV0dXJuIG5pbCwgY29kZXJTaW50MzJTbGljZQogCQkJfQotCQljYXNlIHByZWYuVWludDMyS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuVWludDMyS2luZDoKIAkJCWlmIGZ0LktpbmQoKSA9PSByZWZsZWN0LlVpbnQzMiB7CiAJCQkJcmV0dXJuIG5pbCwgY29kZXJVaW50MzJTbGljZQogCQkJfQotCQljYXNlIHByZWYuSW50NjRLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5JbnQ2NEtpbmQ6CiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5JbnQ2NCB7CiAJCQkJcmV0dXJuIG5pbCwgY29kZXJJbnQ2NFNsaWNlCiAJCQl9Ci0JCWNhc2UgcHJlZi5TaW50NjRLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5TaW50NjRLaW5kOgogCQkJaWYgZnQuS2luZCgpID09IHJlZmxlY3QuSW50NjQgewogCQkJCXJldHVybiBuaWwsIGNvZGVyU2ludDY0U2xpY2UKIAkJCX0KLQkJY2FzZSBwcmVmLlVpbnQ2NEtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LlVpbnQ2NEtpbmQ6CiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5VaW50NjQgewogCQkJCXJldHVybiBuaWwsIGNvZGVyVWludDY0U2xpY2UKIAkJCX0KLQkJY2FzZSBwcmVmLlNmaXhlZDMyS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuU2ZpeGVkMzJLaW5kOgogCQkJaWYgZnQuS2luZCgpID09IHJlZmxlY3QuSW50MzIgewogCQkJCXJldHVybiBuaWwsIGNvZGVyU2ZpeGVkMzJTbGljZQogCQkJfQotCQljYXNlIHByZWYuRml4ZWQzMktpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LkZpeGVkMzJLaW5kOgogCQkJaWYgZnQuS2luZCgpID09IHJlZmxlY3QuVWludDMyIHsKIAkJCQlyZXR1cm4gbmlsLCBjb2RlckZpeGVkMzJTbGljZQogCQkJfQotCQljYXNlIHByZWYuRmxvYXRLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5GbG9hdEtpbmQ6CiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5GbG9hdDMyIHsKIAkJCQlyZXR1cm4gbmlsLCBjb2RlckZsb2F0U2xpY2UKIAkJCX0KLQkJY2FzZSBwcmVmLlNmaXhlZDY0S2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuU2ZpeGVkNjRLaW5kOgogCQkJaWYgZnQuS2luZCgpID09IHJlZmxlY3QuSW50NjQgewogCQkJCXJldHVybiBuaWwsIGNvZGVyU2ZpeGVkNjRTbGljZQogCQkJfQotCQljYXNlIHByZWYuRml4ZWQ2NEtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LkZpeGVkNjRLaW5kOgogCQkJaWYgZnQuS2luZCgpID09IHJlZmxlY3QuVWludDY0IHsKIAkJCQlyZXR1cm4gbmlsLCBjb2RlckZpeGVkNjRTbGljZQogCQkJfQotCQljYXNlIHByZWYuRG91YmxlS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuRG91YmxlS2luZDoKIAkJCWlmIGZ0LktpbmQoKSA9PSByZWZsZWN0LkZsb2F0NjQgewogCQkJCXJldHVybiBuaWwsIGNvZGVyRG91YmxlU2xpY2UKIAkJCX0KLQkJY2FzZSBwcmVmLlN0cmluZ0tpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LlN0cmluZ0tpbmQ6CiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5TdHJpbmcgJiYgc3Rycy5FbmZvcmNlVVRGOChmZCkgewogCQkJCXJldHVybiBuaWwsIGNvZGVyU3RyaW5nU2xpY2VWYWxpZGF0ZVVURjgKIAkJCX0KQEAgLTExNCwxOSArMTE0LDE5IEBACiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5TbGljZSAmJiBmdC5FbGVtKCkuS2luZCgpID09IHJlZmxlY3QuVWludDggewogCQkJCXJldHVybiBuaWwsIGNvZGVyQnl0ZXNTbGljZQogCQkJfQotCQljYXNlIHByZWYuQnl0ZXNLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5CeXRlc0tpbmQ6CiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5TdHJpbmcgewogCQkJCXJldHVybiBuaWwsIGNvZGVyU3RyaW5nU2xpY2UKIAkJCX0KIAkJCWlmIGZ0LktpbmQoKSA9PSByZWZsZWN0LlNsaWNlICYmIGZ0LkVsZW0oKS5LaW5kKCkgPT0gcmVmbGVjdC5VaW50OCB7CiAJCQkJcmV0dXJuIG5pbCwgY29kZXJCeXRlc1NsaWNlCiAJCQl9Ci0JCWNhc2UgcHJlZi5NZXNzYWdlS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuTWVzc2FnZUtpbmQ6CiAJCQlyZXR1cm4gZ2V0TWVzc2FnZUluZm8oZnQpLCBtYWtlTWVzc2FnZVNsaWNlRmllbGRDb2RlcihmZCwgZnQpCi0JCWNhc2UgcHJlZi5Hcm91cEtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0Lkdyb3VwS2luZDoKIAkJCXJldHVybiBnZXRNZXNzYWdlSW5mbyhmdCksIG1ha2VHcm91cFNsaWNlRmllbGRDb2RlcihmZCwgZnQpCiAJCX0KLQljYXNlIGZkLkNhcmRpbmFsaXR5KCkgPT0gcHJlZi5SZXBlYXRlZCAmJiBmZC5Jc1BhY2tlZCgpOgorCWNhc2UgZmQuQ2FyZGluYWxpdHkoKSA9PSBwcm90b3JlZmxlY3QuUmVwZWF0ZWQgJiYgZmQuSXNQYWNrZWQoKToKIAkJLy8gUGFja2VkIHJlcGVhdGVkIGZpZWxkcy4KIAkJLy8KIAkJLy8gT25seSByZXBlYXRlZCBmaWVsZHMgb2YgcHJpbWl0aXZlIG51bWVyaWMgdHlwZXMKQEAgLTEzNiwxMjggKzEzNiwxMjggQEAKIAkJfQogCQlmdCA6PSBmdC5FbGVtKCkKIAkJc3dpdGNoIGZkLktpbmQoKSB7Ci0JCWNhc2UgcHJlZi5Cb29sS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuQm9vbEtpbmQ6CiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5Cb29sIHsKIAkJCQlyZXR1cm4gbmlsLCBjb2RlckJvb2xQYWNrZWRTbGljZQogCQkJfQotCQljYXNlIHByZWYuRW51bUtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LkVudW1LaW5kOgogCQkJaWYgZnQuS2luZCgpID09IHJlZmxlY3QuSW50MzIgewogCQkJCXJldHVybiBuaWwsIGNvZGVyRW51bVBhY2tlZFNsaWNlCiAJCQl9Ci0JCWNhc2UgcHJlZi5JbnQzMktpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LkludDMyS2luZDoKIAkJCWlmIGZ0LktpbmQoKSA9PSByZWZsZWN0LkludDMyIHsKIAkJCQlyZXR1cm4gbmlsLCBjb2RlckludDMyUGFja2VkU2xpY2UKIAkJCX0KLQkJY2FzZSBwcmVmLlNpbnQzMktpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LlNpbnQzMktpbmQ6CiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5JbnQzMiB7CiAJCQkJcmV0dXJuIG5pbCwgY29kZXJTaW50MzJQYWNrZWRTbGljZQogCQkJfQotCQljYXNlIHByZWYuVWludDMyS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuVWludDMyS2luZDoKIAkJCWlmIGZ0LktpbmQoKSA9PSByZWZsZWN0LlVpbnQzMiB7CiAJCQkJcmV0dXJuIG5pbCwgY29kZXJVaW50MzJQYWNrZWRTbGljZQogCQkJfQotCQljYXNlIHByZWYuSW50NjRLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5JbnQ2NEtpbmQ6CiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5JbnQ2NCB7CiAJCQkJcmV0dXJuIG5pbCwgY29kZXJJbnQ2NFBhY2tlZFNsaWNlCiAJCQl9Ci0JCWNhc2UgcHJlZi5TaW50NjRLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5TaW50NjRLaW5kOgogCQkJaWYgZnQuS2luZCgpID09IHJlZmxlY3QuSW50NjQgewogCQkJCXJldHVybiBuaWwsIGNvZGVyU2ludDY0UGFja2VkU2xpY2UKIAkJCX0KLQkJY2FzZSBwcmVmLlVpbnQ2NEtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LlVpbnQ2NEtpbmQ6CiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5VaW50NjQgewogCQkJCXJldHVybiBuaWwsIGNvZGVyVWludDY0UGFja2VkU2xpY2UKIAkJCX0KLQkJY2FzZSBwcmVmLlNmaXhlZDMyS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuU2ZpeGVkMzJLaW5kOgogCQkJaWYgZnQuS2luZCgpID09IHJlZmxlY3QuSW50MzIgewogCQkJCXJldHVybiBuaWwsIGNvZGVyU2ZpeGVkMzJQYWNrZWRTbGljZQogCQkJfQotCQljYXNlIHByZWYuRml4ZWQzMktpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LkZpeGVkMzJLaW5kOgogCQkJaWYgZnQuS2luZCgpID09IHJlZmxlY3QuVWludDMyIHsKIAkJCQlyZXR1cm4gbmlsLCBjb2RlckZpeGVkMzJQYWNrZWRTbGljZQogCQkJfQotCQljYXNlIHByZWYuRmxvYXRLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5GbG9hdEtpbmQ6CiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5GbG9hdDMyIHsKIAkJCQlyZXR1cm4gbmlsLCBjb2RlckZsb2F0UGFja2VkU2xpY2UKIAkJCX0KLQkJY2FzZSBwcmVmLlNmaXhlZDY0S2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuU2ZpeGVkNjRLaW5kOgogCQkJaWYgZnQuS2luZCgpID09IHJlZmxlY3QuSW50NjQgewogCQkJCXJldHVybiBuaWwsIGNvZGVyU2ZpeGVkNjRQYWNrZWRTbGljZQogCQkJfQotCQljYXNlIHByZWYuRml4ZWQ2NEtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LkZpeGVkNjRLaW5kOgogCQkJaWYgZnQuS2luZCgpID09IHJlZmxlY3QuVWludDY0IHsKIAkJCQlyZXR1cm4gbmlsLCBjb2RlckZpeGVkNjRQYWNrZWRTbGljZQogCQkJfQotCQljYXNlIHByZWYuRG91YmxlS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuRG91YmxlS2luZDoKIAkJCWlmIGZ0LktpbmQoKSA9PSByZWZsZWN0LkZsb2F0NjQgewogCQkJCXJldHVybiBuaWwsIGNvZGVyRG91YmxlUGFja2VkU2xpY2UKIAkJCX0KIAkJfQotCWNhc2UgZmQuS2luZCgpID09IHByZWYuTWVzc2FnZUtpbmQ6CisJY2FzZSBmZC5LaW5kKCkgPT0gcHJvdG9yZWZsZWN0Lk1lc3NhZ2VLaW5kOgogCQlyZXR1cm4gZ2V0TWVzc2FnZUluZm8oZnQpLCBtYWtlTWVzc2FnZUZpZWxkQ29kZXIoZmQsIGZ0KQotCWNhc2UgZmQuS2luZCgpID09IHByZWYuR3JvdXBLaW5kOgorCWNhc2UgZmQuS2luZCgpID09IHByb3RvcmVmbGVjdC5Hcm91cEtpbmQ6CiAJCXJldHVybiBnZXRNZXNzYWdlSW5mbyhmdCksIG1ha2VHcm91cEZpZWxkQ29kZXIoZmQsIGZ0KQotCWNhc2UgZmQuU3ludGF4KCkgPT0gcHJlZi5Qcm90bzMgJiYgZmQuQ29udGFpbmluZ09uZW9mKCkgPT0gbmlsOgorCWNhc2UgIWZkLkhhc1ByZXNlbmNlKCkgJiYgZmQuQ29udGFpbmluZ09uZW9mKCkgPT0gbmlsOgogCQkvLyBQb3B1bGF0ZWQgb25lb2YgZmllbGRzIGFsd2F5cyBlbmNvZGUgZXZlbiBpZiBzZXQgdG8gdGhlIHplcm8gdmFsdWUsCiAJCS8vIHdoaWNoIG5vcm1hbGx5IGFyZSBub3QgZW5jb2RlZCBpbiBwcm90bzMuCiAJCXN3aXRjaCBmZC5LaW5kKCkgewotCQljYXNlIHByZWYuQm9vbEtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LkJvb2xLaW5kOgogCQkJaWYgZnQuS2luZCgpID09IHJlZmxlY3QuQm9vbCB7CiAJCQkJcmV0dXJuIG5pbCwgY29kZXJCb29sTm9aZXJvCiAJCQl9Ci0JCWNhc2UgcHJlZi5FbnVtS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuRW51bUtpbmQ6CiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5JbnQzMiB7CiAJCQkJcmV0dXJuIG5pbCwgY29kZXJFbnVtTm9aZXJvCiAJCQl9Ci0JCWNhc2UgcHJlZi5JbnQzMktpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LkludDMyS2luZDoKIAkJCWlmIGZ0LktpbmQoKSA9PSByZWZsZWN0LkludDMyIHsKIAkJCQlyZXR1cm4gbmlsLCBjb2RlckludDMyTm9aZXJvCiAJCQl9Ci0JCWNhc2UgcHJlZi5TaW50MzJLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5TaW50MzJLaW5kOgogCQkJaWYgZnQuS2luZCgpID09IHJlZmxlY3QuSW50MzIgewogCQkJCXJldHVybiBuaWwsIGNvZGVyU2ludDMyTm9aZXJvCiAJCQl9Ci0JCWNhc2UgcHJlZi5VaW50MzJLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5VaW50MzJLaW5kOgogCQkJaWYgZnQuS2luZCgpID09IHJlZmxlY3QuVWludDMyIHsKIAkJCQlyZXR1cm4gbmlsLCBjb2RlclVpbnQzMk5vWmVybwogCQkJfQotCQljYXNlIHByZWYuSW50NjRLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5JbnQ2NEtpbmQ6CiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5JbnQ2NCB7CiAJCQkJcmV0dXJuIG5pbCwgY29kZXJJbnQ2NE5vWmVybwogCQkJfQotCQljYXNlIHByZWYuU2ludDY0S2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuU2ludDY0S2luZDoKIAkJCWlmIGZ0LktpbmQoKSA9PSByZWZsZWN0LkludDY0IHsKIAkJCQlyZXR1cm4gbmlsLCBjb2RlclNpbnQ2NE5vWmVybwogCQkJfQotCQljYXNlIHByZWYuVWludDY0S2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuVWludDY0S2luZDoKIAkJCWlmIGZ0LktpbmQoKSA9PSByZWZsZWN0LlVpbnQ2NCB7CiAJCQkJcmV0dXJuIG5pbCwgY29kZXJVaW50NjROb1plcm8KIAkJCX0KLQkJY2FzZSBwcmVmLlNmaXhlZDMyS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuU2ZpeGVkMzJLaW5kOgogCQkJaWYgZnQuS2luZCgpID09IHJlZmxlY3QuSW50MzIgewogCQkJCXJldHVybiBuaWwsIGNvZGVyU2ZpeGVkMzJOb1plcm8KIAkJCX0KLQkJY2FzZSBwcmVmLkZpeGVkMzJLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5GaXhlZDMyS2luZDoKIAkJCWlmIGZ0LktpbmQoKSA9PSByZWZsZWN0LlVpbnQzMiB7CiAJCQkJcmV0dXJuIG5pbCwgY29kZXJGaXhlZDMyTm9aZXJvCiAJCQl9Ci0JCWNhc2UgcHJlZi5GbG9hdEtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LkZsb2F0S2luZDoKIAkJCWlmIGZ0LktpbmQoKSA9PSByZWZsZWN0LkZsb2F0MzIgewogCQkJCXJldHVybiBuaWwsIGNvZGVyRmxvYXROb1plcm8KIAkJCX0KLQkJY2FzZSBwcmVmLlNmaXhlZDY0S2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuU2ZpeGVkNjRLaW5kOgogCQkJaWYgZnQuS2luZCgpID09IHJlZmxlY3QuSW50NjQgewogCQkJCXJldHVybiBuaWwsIGNvZGVyU2ZpeGVkNjROb1plcm8KIAkJCX0KLQkJY2FzZSBwcmVmLkZpeGVkNjRLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5GaXhlZDY0S2luZDoKIAkJCWlmIGZ0LktpbmQoKSA9PSByZWZsZWN0LlVpbnQ2NCB7CiAJCQkJcmV0dXJuIG5pbCwgY29kZXJGaXhlZDY0Tm9aZXJvCiAJCQl9Ci0JCWNhc2UgcHJlZi5Eb3VibGVLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5Eb3VibGVLaW5kOgogCQkJaWYgZnQuS2luZCgpID09IHJlZmxlY3QuRmxvYXQ2NCB7CiAJCQkJcmV0dXJuIG5pbCwgY29kZXJEb3VibGVOb1plcm8KIAkJCX0KLQkJY2FzZSBwcmVmLlN0cmluZ0tpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LlN0cmluZ0tpbmQ6CiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5TdHJpbmcgJiYgc3Rycy5FbmZvcmNlVVRGOChmZCkgewogCQkJCXJldHVybiBuaWwsIGNvZGVyU3RyaW5nTm9aZXJvVmFsaWRhdGVVVEY4CiAJCQl9CkBAIC0yNzAsNyArMjcwLDcgQEAKIAkJCWlmIGZ0LktpbmQoKSA9PSByZWZsZWN0LlNsaWNlICYmIGZ0LkVsZW0oKS5LaW5kKCkgPT0gcmVmbGVjdC5VaW50OCB7CiAJCQkJcmV0dXJuIG5pbCwgY29kZXJCeXRlc05vWmVybwogCQkJfQotCQljYXNlIHByZWYuQnl0ZXNLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5CeXRlc0tpbmQ6CiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5TdHJpbmcgewogCQkJCXJldHVybiBuaWwsIGNvZGVyU3RyaW5nTm9aZXJvCiAJCQl9CkBAIC0yODEsMTMzICsyODEsMTMzIEBACiAJY2FzZSBmdC5LaW5kKCkgPT0gcmVmbGVjdC5QdHI6CiAJCWZ0IDo9IGZ0LkVsZW0oKQogCQlzd2l0Y2ggZmQuS2luZCgpIHsKLQkJY2FzZSBwcmVmLkJvb2xLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5Cb29sS2luZDoKIAkJCWlmIGZ0LktpbmQoKSA9PSByZWZsZWN0LkJvb2wgewogCQkJCXJldHVybiBuaWwsIGNvZGVyQm9vbFB0cgogCQkJfQotCQljYXNlIHByZWYuRW51bUtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LkVudW1LaW5kOgogCQkJaWYgZnQuS2luZCgpID09IHJlZmxlY3QuSW50MzIgewogCQkJCXJldHVybiBuaWwsIGNvZGVyRW51bVB0cgogCQkJfQotCQljYXNlIHByZWYuSW50MzJLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5JbnQzMktpbmQ6CiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5JbnQzMiB7CiAJCQkJcmV0dXJuIG5pbCwgY29kZXJJbnQzMlB0cgogCQkJfQotCQljYXNlIHByZWYuU2ludDMyS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuU2ludDMyS2luZDoKIAkJCWlmIGZ0LktpbmQoKSA9PSByZWZsZWN0LkludDMyIHsKIAkJCQlyZXR1cm4gbmlsLCBjb2RlclNpbnQzMlB0cgogCQkJfQotCQljYXNlIHByZWYuVWludDMyS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuVWludDMyS2luZDoKIAkJCWlmIGZ0LktpbmQoKSA9PSByZWZsZWN0LlVpbnQzMiB7CiAJCQkJcmV0dXJuIG5pbCwgY29kZXJVaW50MzJQdHIKIAkJCX0KLQkJY2FzZSBwcmVmLkludDY0S2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuSW50NjRLaW5kOgogCQkJaWYgZnQuS2luZCgpID09IHJlZmxlY3QuSW50NjQgewogCQkJCXJldHVybiBuaWwsIGNvZGVySW50NjRQdHIKIAkJCX0KLQkJY2FzZSBwcmVmLlNpbnQ2NEtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LlNpbnQ2NEtpbmQ6CiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5JbnQ2NCB7CiAJCQkJcmV0dXJuIG5pbCwgY29kZXJTaW50NjRQdHIKIAkJCX0KLQkJY2FzZSBwcmVmLlVpbnQ2NEtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LlVpbnQ2NEtpbmQ6CiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5VaW50NjQgewogCQkJCXJldHVybiBuaWwsIGNvZGVyVWludDY0UHRyCiAJCQl9Ci0JCWNhc2UgcHJlZi5TZml4ZWQzMktpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LlNmaXhlZDMyS2luZDoKIAkJCWlmIGZ0LktpbmQoKSA9PSByZWZsZWN0LkludDMyIHsKIAkJCQlyZXR1cm4gbmlsLCBjb2RlclNmaXhlZDMyUHRyCiAJCQl9Ci0JCWNhc2UgcHJlZi5GaXhlZDMyS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuRml4ZWQzMktpbmQ6CiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5VaW50MzIgewogCQkJCXJldHVybiBuaWwsIGNvZGVyRml4ZWQzMlB0cgogCQkJfQotCQljYXNlIHByZWYuRmxvYXRLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5GbG9hdEtpbmQ6CiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5GbG9hdDMyIHsKIAkJCQlyZXR1cm4gbmlsLCBjb2RlckZsb2F0UHRyCiAJCQl9Ci0JCWNhc2UgcHJlZi5TZml4ZWQ2NEtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LlNmaXhlZDY0S2luZDoKIAkJCWlmIGZ0LktpbmQoKSA9PSByZWZsZWN0LkludDY0IHsKIAkJCQlyZXR1cm4gbmlsLCBjb2RlclNmaXhlZDY0UHRyCiAJCQl9Ci0JCWNhc2UgcHJlZi5GaXhlZDY0S2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuRml4ZWQ2NEtpbmQ6CiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5VaW50NjQgewogCQkJCXJldHVybiBuaWwsIGNvZGVyRml4ZWQ2NFB0cgogCQkJfQotCQljYXNlIHByZWYuRG91YmxlS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuRG91YmxlS2luZDoKIAkJCWlmIGZ0LktpbmQoKSA9PSByZWZsZWN0LkZsb2F0NjQgewogCQkJCXJldHVybiBuaWwsIGNvZGVyRG91YmxlUHRyCiAJCQl9Ci0JCWNhc2UgcHJlZi5TdHJpbmdLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5TdHJpbmdLaW5kOgogCQkJaWYgZnQuS2luZCgpID09IHJlZmxlY3QuU3RyaW5nICYmIHN0cnMuRW5mb3JjZVVURjgoZmQpIHsKIAkJCQlyZXR1cm4gbmlsLCBjb2RlclN0cmluZ1B0clZhbGlkYXRlVVRGOAogCQkJfQogCQkJaWYgZnQuS2luZCgpID09IHJlZmxlY3QuU3RyaW5nIHsKIAkJCQlyZXR1cm4gbmlsLCBjb2RlclN0cmluZ1B0cgogCQkJfQotCQljYXNlIHByZWYuQnl0ZXNLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5CeXRlc0tpbmQ6CiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5TdHJpbmcgewogCQkJCXJldHVybiBuaWwsIGNvZGVyU3RyaW5nUHRyCiAJCQl9CiAJCX0KIAlkZWZhdWx0OgogCQlzd2l0Y2ggZmQuS2luZCgpIHsKLQkJY2FzZSBwcmVmLkJvb2xLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5Cb29sS2luZDoKIAkJCWlmIGZ0LktpbmQoKSA9PSByZWZsZWN0LkJvb2wgewogCQkJCXJldHVybiBuaWwsIGNvZGVyQm9vbAogCQkJfQotCQljYXNlIHByZWYuRW51bUtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LkVudW1LaW5kOgogCQkJaWYgZnQuS2luZCgpID09IHJlZmxlY3QuSW50MzIgewogCQkJCXJldHVybiBuaWwsIGNvZGVyRW51bQogCQkJfQotCQljYXNlIHByZWYuSW50MzJLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5JbnQzMktpbmQ6CiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5JbnQzMiB7CiAJCQkJcmV0dXJuIG5pbCwgY29kZXJJbnQzMgogCQkJfQotCQljYXNlIHByZWYuU2ludDMyS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuU2ludDMyS2luZDoKIAkJCWlmIGZ0LktpbmQoKSA9PSByZWZsZWN0LkludDMyIHsKIAkJCQlyZXR1cm4gbmlsLCBjb2RlclNpbnQzMgogCQkJfQotCQljYXNlIHByZWYuVWludDMyS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuVWludDMyS2luZDoKIAkJCWlmIGZ0LktpbmQoKSA9PSByZWZsZWN0LlVpbnQzMiB7CiAJCQkJcmV0dXJuIG5pbCwgY29kZXJVaW50MzIKIAkJCX0KLQkJY2FzZSBwcmVmLkludDY0S2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuSW50NjRLaW5kOgogCQkJaWYgZnQuS2luZCgpID09IHJlZmxlY3QuSW50NjQgewogCQkJCXJldHVybiBuaWwsIGNvZGVySW50NjQKIAkJCX0KLQkJY2FzZSBwcmVmLlNpbnQ2NEtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LlNpbnQ2NEtpbmQ6CiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5JbnQ2NCB7CiAJCQkJcmV0dXJuIG5pbCwgY29kZXJTaW50NjQKIAkJCX0KLQkJY2FzZSBwcmVmLlVpbnQ2NEtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LlVpbnQ2NEtpbmQ6CiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5VaW50NjQgewogCQkJCXJldHVybiBuaWwsIGNvZGVyVWludDY0CiAJCQl9Ci0JCWNhc2UgcHJlZi5TZml4ZWQzMktpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LlNmaXhlZDMyS2luZDoKIAkJCWlmIGZ0LktpbmQoKSA9PSByZWZsZWN0LkludDMyIHsKIAkJCQlyZXR1cm4gbmlsLCBjb2RlclNmaXhlZDMyCiAJCQl9Ci0JCWNhc2UgcHJlZi5GaXhlZDMyS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuRml4ZWQzMktpbmQ6CiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5VaW50MzIgewogCQkJCXJldHVybiBuaWwsIGNvZGVyRml4ZWQzMgogCQkJfQotCQljYXNlIHByZWYuRmxvYXRLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5GbG9hdEtpbmQ6CiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5GbG9hdDMyIHsKIAkJCQlyZXR1cm4gbmlsLCBjb2RlckZsb2F0CiAJCQl9Ci0JCWNhc2UgcHJlZi5TZml4ZWQ2NEtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LlNmaXhlZDY0S2luZDoKIAkJCWlmIGZ0LktpbmQoKSA9PSByZWZsZWN0LkludDY0IHsKIAkJCQlyZXR1cm4gbmlsLCBjb2RlclNmaXhlZDY0CiAJCQl9Ci0JCWNhc2UgcHJlZi5GaXhlZDY0S2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuRml4ZWQ2NEtpbmQ6CiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5VaW50NjQgewogCQkJCXJldHVybiBuaWwsIGNvZGVyRml4ZWQ2NAogCQkJfQotCQljYXNlIHByZWYuRG91YmxlS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuRG91YmxlS2luZDoKIAkJCWlmIGZ0LktpbmQoKSA9PSByZWZsZWN0LkZsb2F0NjQgewogCQkJCXJldHVybiBuaWwsIGNvZGVyRG91YmxlCiAJCQl9Ci0JCWNhc2UgcHJlZi5TdHJpbmdLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5TdHJpbmdLaW5kOgogCQkJaWYgZnQuS2luZCgpID09IHJlZmxlY3QuU3RyaW5nICYmIHN0cnMuRW5mb3JjZVVURjgoZmQpIHsKIAkJCQlyZXR1cm4gbmlsLCBjb2RlclN0cmluZ1ZhbGlkYXRlVVRGOAogCQkJfQpAQCAtNDIwLDcgKzQyMCw3IEBACiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5TbGljZSAmJiBmdC5FbGVtKCkuS2luZCgpID09IHJlZmxlY3QuVWludDggewogCQkJCXJldHVybiBuaWwsIGNvZGVyQnl0ZXMKIAkJCX0KLQkJY2FzZSBwcmVmLkJ5dGVzS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuQnl0ZXNLaW5kOgogCQkJaWYgZnQuS2luZCgpID09IHJlZmxlY3QuU3RyaW5nIHsKIAkJCQlyZXR1cm4gbmlsLCBjb2RlclN0cmluZwogCQkJfQpAQCAtNDM0LDEyMiArNDM0LDEyMiBAQAogCiAvLyBlbmNvZGVyRnVuY3NGb3JWYWx1ZSByZXR1cm5zIHZhbHVlIGZ1bmN0aW9ucyBmb3IgYSBmaWVsZCwgdXNlZCBmb3IKIC8vIGV4dGVuc2lvbiB2YWx1ZXMgYW5kIG1hcCBlbmNvZGluZy4KLWZ1bmMgZW5jb2RlckZ1bmNzRm9yVmFsdWUoZmQgcHJlZi5GaWVsZERlc2NyaXB0b3IpIHZhbHVlQ29kZXJGdW5jcyB7CitmdW5jIGVuY29kZXJGdW5jc0ZvclZhbHVlKGZkIHByb3RvcmVmbGVjdC5GaWVsZERlc2NyaXB0b3IpIHZhbHVlQ29kZXJGdW5jcyB7CiAJc3dpdGNoIHsKLQljYXNlIGZkLkNhcmRpbmFsaXR5KCkgPT0gcHJlZi5SZXBlYXRlZCAmJiAhZmQuSXNQYWNrZWQoKToKKwljYXNlIGZkLkNhcmRpbmFsaXR5KCkgPT0gcHJvdG9yZWZsZWN0LlJlcGVhdGVkICYmICFmZC5Jc1BhY2tlZCgpOgogCQlzd2l0Y2ggZmQuS2luZCgpIHsKLQkJY2FzZSBwcmVmLkJvb2xLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5Cb29sS2luZDoKIAkJCXJldHVybiBjb2RlckJvb2xTbGljZVZhbHVlCi0JCWNhc2UgcHJlZi5FbnVtS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuRW51bUtpbmQ6CiAJCQlyZXR1cm4gY29kZXJFbnVtU2xpY2VWYWx1ZQotCQljYXNlIHByZWYuSW50MzJLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5JbnQzMktpbmQ6CiAJCQlyZXR1cm4gY29kZXJJbnQzMlNsaWNlVmFsdWUKLQkJY2FzZSBwcmVmLlNpbnQzMktpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LlNpbnQzMktpbmQ6CiAJCQlyZXR1cm4gY29kZXJTaW50MzJTbGljZVZhbHVlCi0JCWNhc2UgcHJlZi5VaW50MzJLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5VaW50MzJLaW5kOgogCQkJcmV0dXJuIGNvZGVyVWludDMyU2xpY2VWYWx1ZQotCQljYXNlIHByZWYuSW50NjRLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5JbnQ2NEtpbmQ6CiAJCQlyZXR1cm4gY29kZXJJbnQ2NFNsaWNlVmFsdWUKLQkJY2FzZSBwcmVmLlNpbnQ2NEtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LlNpbnQ2NEtpbmQ6CiAJCQlyZXR1cm4gY29kZXJTaW50NjRTbGljZVZhbHVlCi0JCWNhc2UgcHJlZi5VaW50NjRLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5VaW50NjRLaW5kOgogCQkJcmV0dXJuIGNvZGVyVWludDY0U2xpY2VWYWx1ZQotCQljYXNlIHByZWYuU2ZpeGVkMzJLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5TZml4ZWQzMktpbmQ6CiAJCQlyZXR1cm4gY29kZXJTZml4ZWQzMlNsaWNlVmFsdWUKLQkJY2FzZSBwcmVmLkZpeGVkMzJLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5GaXhlZDMyS2luZDoKIAkJCXJldHVybiBjb2RlckZpeGVkMzJTbGljZVZhbHVlCi0JCWNhc2UgcHJlZi5GbG9hdEtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LkZsb2F0S2luZDoKIAkJCXJldHVybiBjb2RlckZsb2F0U2xpY2VWYWx1ZQotCQljYXNlIHByZWYuU2ZpeGVkNjRLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5TZml4ZWQ2NEtpbmQ6CiAJCQlyZXR1cm4gY29kZXJTZml4ZWQ2NFNsaWNlVmFsdWUKLQkJY2FzZSBwcmVmLkZpeGVkNjRLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5GaXhlZDY0S2luZDoKIAkJCXJldHVybiBjb2RlckZpeGVkNjRTbGljZVZhbHVlCi0JCWNhc2UgcHJlZi5Eb3VibGVLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5Eb3VibGVLaW5kOgogCQkJcmV0dXJuIGNvZGVyRG91YmxlU2xpY2VWYWx1ZQotCQljYXNlIHByZWYuU3RyaW5nS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuU3RyaW5nS2luZDoKIAkJCS8vIFdlIGRvbid0IGhhdmUgYSBVVEYtOCB2YWxpZGF0aW5nIGNvZGVyIGZvciByZXBlYXRlZCBzdHJpbmcgZmllbGRzLgogCQkJLy8gVmFsdWUgY29kZXJzIGFyZSB1c2VkIGZvciBleHRlbnNpb25zIGFuZCBtYXBzLgogCQkJLy8gRXh0ZW5zaW9ucyBhcmUgbmV2ZXIgcHJvdG8zLCBhbmQgbWFwcyBuZXZlciBjb250YWluIGxpc3RzLgogCQkJcmV0dXJuIGNvZGVyU3RyaW5nU2xpY2VWYWx1ZQotCQljYXNlIHByZWYuQnl0ZXNLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5CeXRlc0tpbmQ6CiAJCQlyZXR1cm4gY29kZXJCeXRlc1NsaWNlVmFsdWUKLQkJY2FzZSBwcmVmLk1lc3NhZ2VLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5NZXNzYWdlS2luZDoKIAkJCXJldHVybiBjb2Rlck1lc3NhZ2VTbGljZVZhbHVlCi0JCWNhc2UgcHJlZi5Hcm91cEtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0Lkdyb3VwS2luZDoKIAkJCXJldHVybiBjb2Rlckdyb3VwU2xpY2VWYWx1ZQogCQl9Ci0JY2FzZSBmZC5DYXJkaW5hbGl0eSgpID09IHByZWYuUmVwZWF0ZWQgJiYgZmQuSXNQYWNrZWQoKToKKwljYXNlIGZkLkNhcmRpbmFsaXR5KCkgPT0gcHJvdG9yZWZsZWN0LlJlcGVhdGVkICYmIGZkLklzUGFja2VkKCk6CiAJCXN3aXRjaCBmZC5LaW5kKCkgewotCQljYXNlIHByZWYuQm9vbEtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LkJvb2xLaW5kOgogCQkJcmV0dXJuIGNvZGVyQm9vbFBhY2tlZFNsaWNlVmFsdWUKLQkJY2FzZSBwcmVmLkVudW1LaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5FbnVtS2luZDoKIAkJCXJldHVybiBjb2RlckVudW1QYWNrZWRTbGljZVZhbHVlCi0JCWNhc2UgcHJlZi5JbnQzMktpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LkludDMyS2luZDoKIAkJCXJldHVybiBjb2RlckludDMyUGFja2VkU2xpY2VWYWx1ZQotCQljYXNlIHByZWYuU2ludDMyS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuU2ludDMyS2luZDoKIAkJCXJldHVybiBjb2RlclNpbnQzMlBhY2tlZFNsaWNlVmFsdWUKLQkJY2FzZSBwcmVmLlVpbnQzMktpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LlVpbnQzMktpbmQ6CiAJCQlyZXR1cm4gY29kZXJVaW50MzJQYWNrZWRTbGljZVZhbHVlCi0JCWNhc2UgcHJlZi5JbnQ2NEtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LkludDY0S2luZDoKIAkJCXJldHVybiBjb2RlckludDY0UGFja2VkU2xpY2VWYWx1ZQotCQljYXNlIHByZWYuU2ludDY0S2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuU2ludDY0S2luZDoKIAkJCXJldHVybiBjb2RlclNpbnQ2NFBhY2tlZFNsaWNlVmFsdWUKLQkJY2FzZSBwcmVmLlVpbnQ2NEtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LlVpbnQ2NEtpbmQ6CiAJCQlyZXR1cm4gY29kZXJVaW50NjRQYWNrZWRTbGljZVZhbHVlCi0JCWNhc2UgcHJlZi5TZml4ZWQzMktpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LlNmaXhlZDMyS2luZDoKIAkJCXJldHVybiBjb2RlclNmaXhlZDMyUGFja2VkU2xpY2VWYWx1ZQotCQljYXNlIHByZWYuRml4ZWQzMktpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LkZpeGVkMzJLaW5kOgogCQkJcmV0dXJuIGNvZGVyRml4ZWQzMlBhY2tlZFNsaWNlVmFsdWUKLQkJY2FzZSBwcmVmLkZsb2F0S2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuRmxvYXRLaW5kOgogCQkJcmV0dXJuIGNvZGVyRmxvYXRQYWNrZWRTbGljZVZhbHVlCi0JCWNhc2UgcHJlZi5TZml4ZWQ2NEtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LlNmaXhlZDY0S2luZDoKIAkJCXJldHVybiBjb2RlclNmaXhlZDY0UGFja2VkU2xpY2VWYWx1ZQotCQljYXNlIHByZWYuRml4ZWQ2NEtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LkZpeGVkNjRLaW5kOgogCQkJcmV0dXJuIGNvZGVyRml4ZWQ2NFBhY2tlZFNsaWNlVmFsdWUKLQkJY2FzZSBwcmVmLkRvdWJsZUtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LkRvdWJsZUtpbmQ6CiAJCQlyZXR1cm4gY29kZXJEb3VibGVQYWNrZWRTbGljZVZhbHVlCiAJCX0KIAlkZWZhdWx0OgogCQlzd2l0Y2ggZmQuS2luZCgpIHsKIAkJZGVmYXVsdDoKLQkJY2FzZSBwcmVmLkJvb2xLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5Cb29sS2luZDoKIAkJCXJldHVybiBjb2RlckJvb2xWYWx1ZQotCQljYXNlIHByZWYuRW51bUtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LkVudW1LaW5kOgogCQkJcmV0dXJuIGNvZGVyRW51bVZhbHVlCi0JCWNhc2UgcHJlZi5JbnQzMktpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LkludDMyS2luZDoKIAkJCXJldHVybiBjb2RlckludDMyVmFsdWUKLQkJY2FzZSBwcmVmLlNpbnQzMktpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LlNpbnQzMktpbmQ6CiAJCQlyZXR1cm4gY29kZXJTaW50MzJWYWx1ZQotCQljYXNlIHByZWYuVWludDMyS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuVWludDMyS2luZDoKIAkJCXJldHVybiBjb2RlclVpbnQzMlZhbHVlCi0JCWNhc2UgcHJlZi5JbnQ2NEtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LkludDY0S2luZDoKIAkJCXJldHVybiBjb2RlckludDY0VmFsdWUKLQkJY2FzZSBwcmVmLlNpbnQ2NEtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LlNpbnQ2NEtpbmQ6CiAJCQlyZXR1cm4gY29kZXJTaW50NjRWYWx1ZQotCQljYXNlIHByZWYuVWludDY0S2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuVWludDY0S2luZDoKIAkJCXJldHVybiBjb2RlclVpbnQ2NFZhbHVlCi0JCWNhc2UgcHJlZi5TZml4ZWQzMktpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LlNmaXhlZDMyS2luZDoKIAkJCXJldHVybiBjb2RlclNmaXhlZDMyVmFsdWUKLQkJY2FzZSBwcmVmLkZpeGVkMzJLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5GaXhlZDMyS2luZDoKIAkJCXJldHVybiBjb2RlckZpeGVkMzJWYWx1ZQotCQljYXNlIHByZWYuRmxvYXRLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5GbG9hdEtpbmQ6CiAJCQlyZXR1cm4gY29kZXJGbG9hdFZhbHVlCi0JCWNhc2UgcHJlZi5TZml4ZWQ2NEtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0LlNmaXhlZDY0S2luZDoKIAkJCXJldHVybiBjb2RlclNmaXhlZDY0VmFsdWUKLQkJY2FzZSBwcmVmLkZpeGVkNjRLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5GaXhlZDY0S2luZDoKIAkJCXJldHVybiBjb2RlckZpeGVkNjRWYWx1ZQotCQljYXNlIHByZWYuRG91YmxlS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuRG91YmxlS2luZDoKIAkJCXJldHVybiBjb2RlckRvdWJsZVZhbHVlCi0JCWNhc2UgcHJlZi5TdHJpbmdLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5TdHJpbmdLaW5kOgogCQkJaWYgc3Rycy5FbmZvcmNlVVRGOChmZCkgewogCQkJCXJldHVybiBjb2RlclN0cmluZ1ZhbHVlVmFsaWRhdGVVVEY4CiAJCQl9CiAJCQlyZXR1cm4gY29kZXJTdHJpbmdWYWx1ZQotCQljYXNlIHByZWYuQnl0ZXNLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5CeXRlc0tpbmQ6CiAJCQlyZXR1cm4gY29kZXJCeXRlc1ZhbHVlCi0JCWNhc2UgcHJlZi5NZXNzYWdlS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuTWVzc2FnZUtpbmQ6CiAJCQlyZXR1cm4gY29kZXJNZXNzYWdlVmFsdWUKLQkJY2FzZSBwcmVmLkdyb3VwS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuR3JvdXBLaW5kOgogCQkJcmV0dXJuIGNvZGVyR3JvdXBWYWx1ZQogCQl9CiAJfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvY29kZWNfdW5zYWZlLmdvIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvY29kZWNfdW5zYWZlLmdvCmluZGV4IGUxMThhZjEuLjc1NzY0MmUgMTAwNjQ0Ci0tLSBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL2NvZGVjX3Vuc2FmZS5nbworKysgYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9jb2RlY191bnNhZmUuZ28KQEAgLTIsNiArMiw3IEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZQogLy8gbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCisvL2dvOmJ1aWxkICFwdXJlZ28gJiYgIWFwcGVuZ2luZQogLy8gK2J1aWxkICFwdXJlZ28sIWFwcGVuZ2luZQogCiBwYWNrYWdlIGltcGwKZGlmZiAtLWdpdCBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL2NvbnZlcnQuZ28gYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9jb252ZXJ0LmdvCmluZGV4IGFjZDYxYmIuLjE4NWVmMmUgMTAwNjQ0Ci0tLSBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL2NvbnZlcnQuZ28KKysrIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvY29udmVydC5nbwpAQCAtOCw3ICs4LDcgQEAKIAkiZm10IgogCSJyZWZsZWN0IgogCi0JcHJlZiAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZmxlY3QiCisJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgogKQogCiAvLyB1bndyYXBwZXIgdW53cmFwcyB0aGUgdmFsdWUgdG8gdGhlIHVuZGVybHlpbmcgdmFsdWUuCkBAIC0yMCwxMyArMjAsMTMgQEAKIC8vIEEgQ29udmVydGVyIGNvdmVydHMgdG8vZnJvbSBHbyByZWZsZWN0LlZhbHVlIHR5cGVzIGFuZCBwcm90b2J1ZiBwcm90b3JlZmxlY3QuVmFsdWUgdHlwZXMuCiB0eXBlIENvbnZlcnRlciBpbnRlcmZhY2UgewogCS8vIFBCVmFsdWVPZiBjb252ZXJ0cyBhIHJlZmxlY3QuVmFsdWUgdG8gYSBwcm90b3JlZmxlY3QuVmFsdWUuCi0JUEJWYWx1ZU9mKHJlZmxlY3QuVmFsdWUpIHByZWYuVmFsdWUKKwlQQlZhbHVlT2YocmVmbGVjdC5WYWx1ZSkgcHJvdG9yZWZsZWN0LlZhbHVlCiAKIAkvLyBHb1ZhbHVlT2YgY29udmVydHMgYSBwcm90b3JlZmxlY3QuVmFsdWUgdG8gYSByZWZsZWN0LlZhbHVlLgotCUdvVmFsdWVPZihwcmVmLlZhbHVlKSByZWZsZWN0LlZhbHVlCisJR29WYWx1ZU9mKHByb3RvcmVmbGVjdC5WYWx1ZSkgcmVmbGVjdC5WYWx1ZQogCiAJLy8gSXNWYWxpZFBCIHJldHVybnMgd2hldGhlciBhIHByb3RvcmVmbGVjdC5WYWx1ZSBpcyBjb21wYXRpYmxlIHdpdGggdGhpcyB0eXBlLgotCUlzVmFsaWRQQihwcmVmLlZhbHVlKSBib29sCisJSXNWYWxpZFBCKHByb3RvcmVmbGVjdC5WYWx1ZSkgYm9vbAogCiAJLy8gSXNWYWxpZEdvIHJldHVybnMgd2hldGhlciBhIHJlZmxlY3QuVmFsdWUgaXMgY29tcGF0aWJsZSB3aXRoIHRoaXMgdHlwZS4KIAlJc1ZhbGlkR28ocmVmbGVjdC5WYWx1ZSkgYm9vbApAQCAtMzQsMTIgKzM0LDEyIEBACiAJLy8gTmV3IHJldHVybnMgYSBuZXcgZmllbGQgdmFsdWUuCiAJLy8gRm9yIHNjYWxhcnMsIGl0IHJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGZpZWxkLgogCS8vIEZvciBjb21wb3NpdGUgdHlwZXMsIGl0IHJldHVybnMgYSBuZXcgbXV0YWJsZSB2YWx1ZS4KLQlOZXcoKSBwcmVmLlZhbHVlCisJTmV3KCkgcHJvdG9yZWZsZWN0LlZhbHVlCiAKIAkvLyBaZXJvIHJldHVybnMgYSBuZXcgZmllbGQgdmFsdWUuCiAJLy8gRm9yIHNjYWxhcnMsIGl0IHJldHVybnMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGZpZWxkLgogCS8vIEZvciBjb21wb3NpdGUgdHlwZXMsIGl0IHJldHVybnMgYW4gaW1tdXRhYmxlLCBlbXB0eSB2YWx1ZS4KLQlaZXJvKCkgcHJlZi5WYWx1ZQorCVplcm8oKSBwcm90b3JlZmxlY3QuVmFsdWUKIH0KIAogLy8gTmV3Q29udmVydGVyIG1hdGNoZXMgYSBHbyB0eXBlIHdpdGggYSBwcm90b2J1ZiBmaWVsZCBhbmQgcmV0dXJucyBhIENvbnZlcnRlcgpAQCAtNTAsNyArNTAsNyBAQAogLy8gVGhpcyBtYXRjaGVyIGRlbGliZXJhdGVseSBzdXBwb3J0cyBhIHdpZGVyIHJhbmdlIG9mIEdvIHR5cGVzIHRoYW4gd2hhdAogLy8gcHJvdG9jLWdlbi1nbyBoaXN0b3JpY2FsbHkgZ2VuZXJhdGVkIHRvIGJlIGFibGUgdG8gYXV0b21hdGljYWxseSB3cmFwIHNvbWUKIC8vIHYxIG1lc3NhZ2VzIGdlbmVyYXRlZCBieSBvdGhlciBmb3JrcyBvZiBwcm90b2MtZ2VuLWdvLgotZnVuYyBOZXdDb252ZXJ0ZXIodCByZWZsZWN0LlR5cGUsIGZkIHByZWYuRmllbGREZXNjcmlwdG9yKSBDb252ZXJ0ZXIgeworZnVuYyBOZXdDb252ZXJ0ZXIodCByZWZsZWN0LlR5cGUsIGZkIHByb3RvcmVmbGVjdC5GaWVsZERlc2NyaXB0b3IpIENvbnZlcnRlciB7CiAJc3dpdGNoIHsKIAljYXNlIGZkLklzTGlzdCgpOgogCQlyZXR1cm4gbmV3TGlzdENvbnZlcnRlcih0LCBmZCkKQEAgLTU5LDcgKzU5LDYgQEAKIAlkZWZhdWx0OgogCQlyZXR1cm4gbmV3U2luZ3VsYXJDb252ZXJ0ZXIodCwgZmQpCiAJfQotCXBhbmljKGZtdC5TcHJpbnRmKCJpbnZhbGlkIEdvIHR5cGUgJXYgZm9yIGZpZWxkICV2IiwgdCwgZmQuRnVsbE5hbWUoKSkpCiB9CiAKIHZhciAoCkBAIC03Niw2OCArNzUsNjggQEAKICkKIAogdmFyICgKLQlib29sWmVybyAgICA9IHByZWYuVmFsdWVPZkJvb2woZmFsc2UpCi0JaW50MzJaZXJvICAgPSBwcmVmLlZhbHVlT2ZJbnQzMigwKQotCWludDY0WmVybyAgID0gcHJlZi5WYWx1ZU9mSW50NjQoMCkKLQl1aW50MzJaZXJvICA9IHByZWYuVmFsdWVPZlVpbnQzMigwKQotCXVpbnQ2NFplcm8gID0gcHJlZi5WYWx1ZU9mVWludDY0KDApCi0JZmxvYXQzMlplcm8gPSBwcmVmLlZhbHVlT2ZGbG9hdDMyKDApCi0JZmxvYXQ2NFplcm8gPSBwcmVmLlZhbHVlT2ZGbG9hdDY0KDApCi0Jc3RyaW5nWmVybyAgPSBwcmVmLlZhbHVlT2ZTdHJpbmcoIiIpCi0JYnl0ZXNaZXJvICAgPSBwcmVmLlZhbHVlT2ZCeXRlcyhuaWwpCisJYm9vbFplcm8gICAgPSBwcm90b3JlZmxlY3QuVmFsdWVPZkJvb2woZmFsc2UpCisJaW50MzJaZXJvICAgPSBwcm90b3JlZmxlY3QuVmFsdWVPZkludDMyKDApCisJaW50NjRaZXJvICAgPSBwcm90b3JlZmxlY3QuVmFsdWVPZkludDY0KDApCisJdWludDMyWmVybyAgPSBwcm90b3JlZmxlY3QuVmFsdWVPZlVpbnQzMigwKQorCXVpbnQ2NFplcm8gID0gcHJvdG9yZWZsZWN0LlZhbHVlT2ZVaW50NjQoMCkKKwlmbG9hdDMyWmVybyA9IHByb3RvcmVmbGVjdC5WYWx1ZU9mRmxvYXQzMigwKQorCWZsb2F0NjRaZXJvID0gcHJvdG9yZWZsZWN0LlZhbHVlT2ZGbG9hdDY0KDApCisJc3RyaW5nWmVybyAgPSBwcm90b3JlZmxlY3QuVmFsdWVPZlN0cmluZygiIikKKwlieXRlc1plcm8gICA9IHByb3RvcmVmbGVjdC5WYWx1ZU9mQnl0ZXMobmlsKQogKQogCi1mdW5jIG5ld1Npbmd1bGFyQ29udmVydGVyKHQgcmVmbGVjdC5UeXBlLCBmZCBwcmVmLkZpZWxkRGVzY3JpcHRvcikgQ29udmVydGVyIHsKLQlkZWZWYWwgOj0gZnVuYyhmZCBwcmVmLkZpZWxkRGVzY3JpcHRvciwgemVybyBwcmVmLlZhbHVlKSBwcmVmLlZhbHVlIHsKLQkJaWYgZmQuQ2FyZGluYWxpdHkoKSA9PSBwcmVmLlJlcGVhdGVkIHsKK2Z1bmMgbmV3U2luZ3VsYXJDb252ZXJ0ZXIodCByZWZsZWN0LlR5cGUsIGZkIHByb3RvcmVmbGVjdC5GaWVsZERlc2NyaXB0b3IpIENvbnZlcnRlciB7CisJZGVmVmFsIDo9IGZ1bmMoZmQgcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvciwgemVybyBwcm90b3JlZmxlY3QuVmFsdWUpIHByb3RvcmVmbGVjdC5WYWx1ZSB7CisJCWlmIGZkLkNhcmRpbmFsaXR5KCkgPT0gcHJvdG9yZWZsZWN0LlJlcGVhdGVkIHsKIAkJCS8vIERlZmF1bHQgaXNuJ3QgZGVmaW5lZCBmb3IgcmVwZWF0ZWQgZmllbGRzLgogCQkJcmV0dXJuIHplcm8KIAkJfQogCQlyZXR1cm4gZmQuRGVmYXVsdCgpCiAJfQogCXN3aXRjaCBmZC5LaW5kKCkgewotCWNhc2UgcHJlZi5Cb29sS2luZDoKKwljYXNlIHByb3RvcmVmbGVjdC5Cb29sS2luZDoKIAkJaWYgdC5LaW5kKCkgPT0gcmVmbGVjdC5Cb29sIHsKIAkJCXJldHVybiAmYm9vbENvbnZlcnRlcnt0LCBkZWZWYWwoZmQsIGJvb2xaZXJvKX0KIAkJfQotCWNhc2UgcHJlZi5JbnQzMktpbmQsIHByZWYuU2ludDMyS2luZCwgcHJlZi5TZml4ZWQzMktpbmQ6CisJY2FzZSBwcm90b3JlZmxlY3QuSW50MzJLaW5kLCBwcm90b3JlZmxlY3QuU2ludDMyS2luZCwgcHJvdG9yZWZsZWN0LlNmaXhlZDMyS2luZDoKIAkJaWYgdC5LaW5kKCkgPT0gcmVmbGVjdC5JbnQzMiB7CiAJCQlyZXR1cm4gJmludDMyQ29udmVydGVye3QsIGRlZlZhbChmZCwgaW50MzJaZXJvKX0KIAkJfQotCWNhc2UgcHJlZi5JbnQ2NEtpbmQsIHByZWYuU2ludDY0S2luZCwgcHJlZi5TZml4ZWQ2NEtpbmQ6CisJY2FzZSBwcm90b3JlZmxlY3QuSW50NjRLaW5kLCBwcm90b3JlZmxlY3QuU2ludDY0S2luZCwgcHJvdG9yZWZsZWN0LlNmaXhlZDY0S2luZDoKIAkJaWYgdC5LaW5kKCkgPT0gcmVmbGVjdC5JbnQ2NCB7CiAJCQlyZXR1cm4gJmludDY0Q29udmVydGVye3QsIGRlZlZhbChmZCwgaW50NjRaZXJvKX0KIAkJfQotCWNhc2UgcHJlZi5VaW50MzJLaW5kLCBwcmVmLkZpeGVkMzJLaW5kOgorCWNhc2UgcHJvdG9yZWZsZWN0LlVpbnQzMktpbmQsIHByb3RvcmVmbGVjdC5GaXhlZDMyS2luZDoKIAkJaWYgdC5LaW5kKCkgPT0gcmVmbGVjdC5VaW50MzIgewogCQkJcmV0dXJuICZ1aW50MzJDb252ZXJ0ZXJ7dCwgZGVmVmFsKGZkLCB1aW50MzJaZXJvKX0KIAkJfQotCWNhc2UgcHJlZi5VaW50NjRLaW5kLCBwcmVmLkZpeGVkNjRLaW5kOgorCWNhc2UgcHJvdG9yZWZsZWN0LlVpbnQ2NEtpbmQsIHByb3RvcmVmbGVjdC5GaXhlZDY0S2luZDoKIAkJaWYgdC5LaW5kKCkgPT0gcmVmbGVjdC5VaW50NjQgewogCQkJcmV0dXJuICZ1aW50NjRDb252ZXJ0ZXJ7dCwgZGVmVmFsKGZkLCB1aW50NjRaZXJvKX0KIAkJfQotCWNhc2UgcHJlZi5GbG9hdEtpbmQ6CisJY2FzZSBwcm90b3JlZmxlY3QuRmxvYXRLaW5kOgogCQlpZiB0LktpbmQoKSA9PSByZWZsZWN0LkZsb2F0MzIgewogCQkJcmV0dXJuICZmbG9hdDMyQ29udmVydGVye3QsIGRlZlZhbChmZCwgZmxvYXQzMlplcm8pfQogCQl9Ci0JY2FzZSBwcmVmLkRvdWJsZUtpbmQ6CisJY2FzZSBwcm90b3JlZmxlY3QuRG91YmxlS2luZDoKIAkJaWYgdC5LaW5kKCkgPT0gcmVmbGVjdC5GbG9hdDY0IHsKIAkJCXJldHVybiAmZmxvYXQ2NENvbnZlcnRlcnt0LCBkZWZWYWwoZmQsIGZsb2F0NjRaZXJvKX0KIAkJfQotCWNhc2UgcHJlZi5TdHJpbmdLaW5kOgorCWNhc2UgcHJvdG9yZWZsZWN0LlN0cmluZ0tpbmQ6CiAJCWlmIHQuS2luZCgpID09IHJlZmxlY3QuU3RyaW5nIHx8ICh0LktpbmQoKSA9PSByZWZsZWN0LlNsaWNlICYmIHQuRWxlbSgpID09IGJ5dGVUeXBlKSB7CiAJCQlyZXR1cm4gJnN0cmluZ0NvbnZlcnRlcnt0LCBkZWZWYWwoZmQsIHN0cmluZ1plcm8pfQogCQl9Ci0JY2FzZSBwcmVmLkJ5dGVzS2luZDoKKwljYXNlIHByb3RvcmVmbGVjdC5CeXRlc0tpbmQ6CiAJCWlmIHQuS2luZCgpID09IHJlZmxlY3QuU3RyaW5nIHx8ICh0LktpbmQoKSA9PSByZWZsZWN0LlNsaWNlICYmIHQuRWxlbSgpID09IGJ5dGVUeXBlKSB7CiAJCQlyZXR1cm4gJmJ5dGVzQ29udmVydGVye3QsIGRlZlZhbChmZCwgYnl0ZXNaZXJvKX0KIAkJfQotCWNhc2UgcHJlZi5FbnVtS2luZDoKKwljYXNlIHByb3RvcmVmbGVjdC5FbnVtS2luZDoKIAkJLy8gSGFuZGxlIGVudW1zLCB3aGljaCBtdXN0IGJlIGEgbmFtZWQgaW50MzIgdHlwZS4KIAkJaWYgdC5LaW5kKCkgPT0gcmVmbGVjdC5JbnQzMiB7CiAJCQlyZXR1cm4gbmV3RW51bUNvbnZlcnRlcih0LCBmZCkKIAkJfQotCWNhc2UgcHJlZi5NZXNzYWdlS2luZCwgcHJlZi5Hcm91cEtpbmQ6CisJY2FzZSBwcm90b3JlZmxlY3QuTWVzc2FnZUtpbmQsIHByb3RvcmVmbGVjdC5Hcm91cEtpbmQ6CiAJCXJldHVybiBuZXdNZXNzYWdlQ29udmVydGVyKHQpCiAJfQogCXBhbmljKGZtdC5TcHJpbnRmKCJpbnZhbGlkIEdvIHR5cGUgJXYgZm9yIGZpZWxkICV2IiwgdCwgZmQuRnVsbE5hbWUoKSkpCkBAIC0xNDUsMTg0ICsxNDQsMTg0IEBACiAKIHR5cGUgYm9vbENvbnZlcnRlciBzdHJ1Y3QgewogCWdvVHlwZSByZWZsZWN0LlR5cGUKLQlkZWYgICAgcHJlZi5WYWx1ZQorCWRlZiAgICBwcm90b3JlZmxlY3QuVmFsdWUKIH0KIAotZnVuYyAoYyAqYm9vbENvbnZlcnRlcikgUEJWYWx1ZU9mKHYgcmVmbGVjdC5WYWx1ZSkgcHJlZi5WYWx1ZSB7CitmdW5jIChjICpib29sQ29udmVydGVyKSBQQlZhbHVlT2YodiByZWZsZWN0LlZhbHVlKSBwcm90b3JlZmxlY3QuVmFsdWUgewogCWlmIHYuVHlwZSgpICE9IGMuZ29UeXBlIHsKIAkJcGFuaWMoZm10LlNwcmludGYoImludmFsaWQgdHlwZTogZ290ICV2LCB3YW50ICV2Iiwgdi5UeXBlKCksIGMuZ29UeXBlKSkKIAl9Ci0JcmV0dXJuIHByZWYuVmFsdWVPZkJvb2wodi5Cb29sKCkpCisJcmV0dXJuIHByb3RvcmVmbGVjdC5WYWx1ZU9mQm9vbCh2LkJvb2woKSkKIH0KLWZ1bmMgKGMgKmJvb2xDb252ZXJ0ZXIpIEdvVmFsdWVPZih2IHByZWYuVmFsdWUpIHJlZmxlY3QuVmFsdWUgeworZnVuYyAoYyAqYm9vbENvbnZlcnRlcikgR29WYWx1ZU9mKHYgcHJvdG9yZWZsZWN0LlZhbHVlKSByZWZsZWN0LlZhbHVlIHsKIAlyZXR1cm4gcmVmbGVjdC5WYWx1ZU9mKHYuQm9vbCgpKS5Db252ZXJ0KGMuZ29UeXBlKQogfQotZnVuYyAoYyAqYm9vbENvbnZlcnRlcikgSXNWYWxpZFBCKHYgcHJlZi5WYWx1ZSkgYm9vbCB7CitmdW5jIChjICpib29sQ29udmVydGVyKSBJc1ZhbGlkUEIodiBwcm90b3JlZmxlY3QuVmFsdWUpIGJvb2wgewogCV8sIG9rIDo9IHYuSW50ZXJmYWNlKCkuKGJvb2wpCiAJcmV0dXJuIG9rCiB9CiBmdW5jIChjICpib29sQ29udmVydGVyKSBJc1ZhbGlkR28odiByZWZsZWN0LlZhbHVlKSBib29sIHsKIAlyZXR1cm4gdi5Jc1ZhbGlkKCkgJiYgdi5UeXBlKCkgPT0gYy5nb1R5cGUKIH0KLWZ1bmMgKGMgKmJvb2xDb252ZXJ0ZXIpIE5ldygpIHByZWYuVmFsdWUgIHsgcmV0dXJuIGMuZGVmIH0KLWZ1bmMgKGMgKmJvb2xDb252ZXJ0ZXIpIFplcm8oKSBwcmVmLlZhbHVlIHsgcmV0dXJuIGMuZGVmIH0KK2Z1bmMgKGMgKmJvb2xDb252ZXJ0ZXIpIE5ldygpIHByb3RvcmVmbGVjdC5WYWx1ZSAgeyByZXR1cm4gYy5kZWYgfQorZnVuYyAoYyAqYm9vbENvbnZlcnRlcikgWmVybygpIHByb3RvcmVmbGVjdC5WYWx1ZSB7IHJldHVybiBjLmRlZiB9CiAKIHR5cGUgaW50MzJDb252ZXJ0ZXIgc3RydWN0IHsKIAlnb1R5cGUgcmVmbGVjdC5UeXBlCi0JZGVmICAgIHByZWYuVmFsdWUKKwlkZWYgICAgcHJvdG9yZWZsZWN0LlZhbHVlCiB9CiAKLWZ1bmMgKGMgKmludDMyQ29udmVydGVyKSBQQlZhbHVlT2YodiByZWZsZWN0LlZhbHVlKSBwcmVmLlZhbHVlIHsKK2Z1bmMgKGMgKmludDMyQ29udmVydGVyKSBQQlZhbHVlT2YodiByZWZsZWN0LlZhbHVlKSBwcm90b3JlZmxlY3QuVmFsdWUgewogCWlmIHYuVHlwZSgpICE9IGMuZ29UeXBlIHsKIAkJcGFuaWMoZm10LlNwcmludGYoImludmFsaWQgdHlwZTogZ290ICV2LCB3YW50ICV2Iiwgdi5UeXBlKCksIGMuZ29UeXBlKSkKIAl9Ci0JcmV0dXJuIHByZWYuVmFsdWVPZkludDMyKGludDMyKHYuSW50KCkpKQorCXJldHVybiBwcm90b3JlZmxlY3QuVmFsdWVPZkludDMyKGludDMyKHYuSW50KCkpKQogfQotZnVuYyAoYyAqaW50MzJDb252ZXJ0ZXIpIEdvVmFsdWVPZih2IHByZWYuVmFsdWUpIHJlZmxlY3QuVmFsdWUgeworZnVuYyAoYyAqaW50MzJDb252ZXJ0ZXIpIEdvVmFsdWVPZih2IHByb3RvcmVmbGVjdC5WYWx1ZSkgcmVmbGVjdC5WYWx1ZSB7CiAJcmV0dXJuIHJlZmxlY3QuVmFsdWVPZihpbnQzMih2LkludCgpKSkuQ29udmVydChjLmdvVHlwZSkKIH0KLWZ1bmMgKGMgKmludDMyQ29udmVydGVyKSBJc1ZhbGlkUEIodiBwcmVmLlZhbHVlKSBib29sIHsKK2Z1bmMgKGMgKmludDMyQ29udmVydGVyKSBJc1ZhbGlkUEIodiBwcm90b3JlZmxlY3QuVmFsdWUpIGJvb2wgewogCV8sIG9rIDo9IHYuSW50ZXJmYWNlKCkuKGludDMyKQogCXJldHVybiBvawogfQogZnVuYyAoYyAqaW50MzJDb252ZXJ0ZXIpIElzVmFsaWRHbyh2IHJlZmxlY3QuVmFsdWUpIGJvb2wgewogCXJldHVybiB2LklzVmFsaWQoKSAmJiB2LlR5cGUoKSA9PSBjLmdvVHlwZQogfQotZnVuYyAoYyAqaW50MzJDb252ZXJ0ZXIpIE5ldygpIHByZWYuVmFsdWUgIHsgcmV0dXJuIGMuZGVmIH0KLWZ1bmMgKGMgKmludDMyQ29udmVydGVyKSBaZXJvKCkgcHJlZi5WYWx1ZSB7IHJldHVybiBjLmRlZiB9CitmdW5jIChjICppbnQzMkNvbnZlcnRlcikgTmV3KCkgcHJvdG9yZWZsZWN0LlZhbHVlICB7IHJldHVybiBjLmRlZiB9CitmdW5jIChjICppbnQzMkNvbnZlcnRlcikgWmVybygpIHByb3RvcmVmbGVjdC5WYWx1ZSB7IHJldHVybiBjLmRlZiB9CiAKIHR5cGUgaW50NjRDb252ZXJ0ZXIgc3RydWN0IHsKIAlnb1R5cGUgcmVmbGVjdC5UeXBlCi0JZGVmICAgIHByZWYuVmFsdWUKKwlkZWYgICAgcHJvdG9yZWZsZWN0LlZhbHVlCiB9CiAKLWZ1bmMgKGMgKmludDY0Q29udmVydGVyKSBQQlZhbHVlT2YodiByZWZsZWN0LlZhbHVlKSBwcmVmLlZhbHVlIHsKK2Z1bmMgKGMgKmludDY0Q29udmVydGVyKSBQQlZhbHVlT2YodiByZWZsZWN0LlZhbHVlKSBwcm90b3JlZmxlY3QuVmFsdWUgewogCWlmIHYuVHlwZSgpICE9IGMuZ29UeXBlIHsKIAkJcGFuaWMoZm10LlNwcmludGYoImludmFsaWQgdHlwZTogZ290ICV2LCB3YW50ICV2Iiwgdi5UeXBlKCksIGMuZ29UeXBlKSkKIAl9Ci0JcmV0dXJuIHByZWYuVmFsdWVPZkludDY0KGludDY0KHYuSW50KCkpKQorCXJldHVybiBwcm90b3JlZmxlY3QuVmFsdWVPZkludDY0KGludDY0KHYuSW50KCkpKQogfQotZnVuYyAoYyAqaW50NjRDb252ZXJ0ZXIpIEdvVmFsdWVPZih2IHByZWYuVmFsdWUpIHJlZmxlY3QuVmFsdWUgeworZnVuYyAoYyAqaW50NjRDb252ZXJ0ZXIpIEdvVmFsdWVPZih2IHByb3RvcmVmbGVjdC5WYWx1ZSkgcmVmbGVjdC5WYWx1ZSB7CiAJcmV0dXJuIHJlZmxlY3QuVmFsdWVPZihpbnQ2NCh2LkludCgpKSkuQ29udmVydChjLmdvVHlwZSkKIH0KLWZ1bmMgKGMgKmludDY0Q29udmVydGVyKSBJc1ZhbGlkUEIodiBwcmVmLlZhbHVlKSBib29sIHsKK2Z1bmMgKGMgKmludDY0Q29udmVydGVyKSBJc1ZhbGlkUEIodiBwcm90b3JlZmxlY3QuVmFsdWUpIGJvb2wgewogCV8sIG9rIDo9IHYuSW50ZXJmYWNlKCkuKGludDY0KQogCXJldHVybiBvawogfQogZnVuYyAoYyAqaW50NjRDb252ZXJ0ZXIpIElzVmFsaWRHbyh2IHJlZmxlY3QuVmFsdWUpIGJvb2wgewogCXJldHVybiB2LklzVmFsaWQoKSAmJiB2LlR5cGUoKSA9PSBjLmdvVHlwZQogfQotZnVuYyAoYyAqaW50NjRDb252ZXJ0ZXIpIE5ldygpIHByZWYuVmFsdWUgIHsgcmV0dXJuIGMuZGVmIH0KLWZ1bmMgKGMgKmludDY0Q29udmVydGVyKSBaZXJvKCkgcHJlZi5WYWx1ZSB7IHJldHVybiBjLmRlZiB9CitmdW5jIChjICppbnQ2NENvbnZlcnRlcikgTmV3KCkgcHJvdG9yZWZsZWN0LlZhbHVlICB7IHJldHVybiBjLmRlZiB9CitmdW5jIChjICppbnQ2NENvbnZlcnRlcikgWmVybygpIHByb3RvcmVmbGVjdC5WYWx1ZSB7IHJldHVybiBjLmRlZiB9CiAKIHR5cGUgdWludDMyQ29udmVydGVyIHN0cnVjdCB7CiAJZ29UeXBlIHJlZmxlY3QuVHlwZQotCWRlZiAgICBwcmVmLlZhbHVlCisJZGVmICAgIHByb3RvcmVmbGVjdC5WYWx1ZQogfQogCi1mdW5jIChjICp1aW50MzJDb252ZXJ0ZXIpIFBCVmFsdWVPZih2IHJlZmxlY3QuVmFsdWUpIHByZWYuVmFsdWUgeworZnVuYyAoYyAqdWludDMyQ29udmVydGVyKSBQQlZhbHVlT2YodiByZWZsZWN0LlZhbHVlKSBwcm90b3JlZmxlY3QuVmFsdWUgewogCWlmIHYuVHlwZSgpICE9IGMuZ29UeXBlIHsKIAkJcGFuaWMoZm10LlNwcmludGYoImludmFsaWQgdHlwZTogZ290ICV2LCB3YW50ICV2Iiwgdi5UeXBlKCksIGMuZ29UeXBlKSkKIAl9Ci0JcmV0dXJuIHByZWYuVmFsdWVPZlVpbnQzMih1aW50MzIodi5VaW50KCkpKQorCXJldHVybiBwcm90b3JlZmxlY3QuVmFsdWVPZlVpbnQzMih1aW50MzIodi5VaW50KCkpKQogfQotZnVuYyAoYyAqdWludDMyQ29udmVydGVyKSBHb1ZhbHVlT2YodiBwcmVmLlZhbHVlKSByZWZsZWN0LlZhbHVlIHsKK2Z1bmMgKGMgKnVpbnQzMkNvbnZlcnRlcikgR29WYWx1ZU9mKHYgcHJvdG9yZWZsZWN0LlZhbHVlKSByZWZsZWN0LlZhbHVlIHsKIAlyZXR1cm4gcmVmbGVjdC5WYWx1ZU9mKHVpbnQzMih2LlVpbnQoKSkpLkNvbnZlcnQoYy5nb1R5cGUpCiB9Ci1mdW5jIChjICp1aW50MzJDb252ZXJ0ZXIpIElzVmFsaWRQQih2IHByZWYuVmFsdWUpIGJvb2wgeworZnVuYyAoYyAqdWludDMyQ29udmVydGVyKSBJc1ZhbGlkUEIodiBwcm90b3JlZmxlY3QuVmFsdWUpIGJvb2wgewogCV8sIG9rIDo9IHYuSW50ZXJmYWNlKCkuKHVpbnQzMikKIAlyZXR1cm4gb2sKIH0KIGZ1bmMgKGMgKnVpbnQzMkNvbnZlcnRlcikgSXNWYWxpZEdvKHYgcmVmbGVjdC5WYWx1ZSkgYm9vbCB7CiAJcmV0dXJuIHYuSXNWYWxpZCgpICYmIHYuVHlwZSgpID09IGMuZ29UeXBlCiB9Ci1mdW5jIChjICp1aW50MzJDb252ZXJ0ZXIpIE5ldygpIHByZWYuVmFsdWUgIHsgcmV0dXJuIGMuZGVmIH0KLWZ1bmMgKGMgKnVpbnQzMkNvbnZlcnRlcikgWmVybygpIHByZWYuVmFsdWUgeyByZXR1cm4gYy5kZWYgfQorZnVuYyAoYyAqdWludDMyQ29udmVydGVyKSBOZXcoKSBwcm90b3JlZmxlY3QuVmFsdWUgIHsgcmV0dXJuIGMuZGVmIH0KK2Z1bmMgKGMgKnVpbnQzMkNvbnZlcnRlcikgWmVybygpIHByb3RvcmVmbGVjdC5WYWx1ZSB7IHJldHVybiBjLmRlZiB9CiAKIHR5cGUgdWludDY0Q29udmVydGVyIHN0cnVjdCB7CiAJZ29UeXBlIHJlZmxlY3QuVHlwZQotCWRlZiAgICBwcmVmLlZhbHVlCisJZGVmICAgIHByb3RvcmVmbGVjdC5WYWx1ZQogfQogCi1mdW5jIChjICp1aW50NjRDb252ZXJ0ZXIpIFBCVmFsdWVPZih2IHJlZmxlY3QuVmFsdWUpIHByZWYuVmFsdWUgeworZnVuYyAoYyAqdWludDY0Q29udmVydGVyKSBQQlZhbHVlT2YodiByZWZsZWN0LlZhbHVlKSBwcm90b3JlZmxlY3QuVmFsdWUgewogCWlmIHYuVHlwZSgpICE9IGMuZ29UeXBlIHsKIAkJcGFuaWMoZm10LlNwcmludGYoImludmFsaWQgdHlwZTogZ290ICV2LCB3YW50ICV2Iiwgdi5UeXBlKCksIGMuZ29UeXBlKSkKIAl9Ci0JcmV0dXJuIHByZWYuVmFsdWVPZlVpbnQ2NCh1aW50NjQodi5VaW50KCkpKQorCXJldHVybiBwcm90b3JlZmxlY3QuVmFsdWVPZlVpbnQ2NCh1aW50NjQodi5VaW50KCkpKQogfQotZnVuYyAoYyAqdWludDY0Q29udmVydGVyKSBHb1ZhbHVlT2YodiBwcmVmLlZhbHVlKSByZWZsZWN0LlZhbHVlIHsKK2Z1bmMgKGMgKnVpbnQ2NENvbnZlcnRlcikgR29WYWx1ZU9mKHYgcHJvdG9yZWZsZWN0LlZhbHVlKSByZWZsZWN0LlZhbHVlIHsKIAlyZXR1cm4gcmVmbGVjdC5WYWx1ZU9mKHVpbnQ2NCh2LlVpbnQoKSkpLkNvbnZlcnQoYy5nb1R5cGUpCiB9Ci1mdW5jIChjICp1aW50NjRDb252ZXJ0ZXIpIElzVmFsaWRQQih2IHByZWYuVmFsdWUpIGJvb2wgeworZnVuYyAoYyAqdWludDY0Q29udmVydGVyKSBJc1ZhbGlkUEIodiBwcm90b3JlZmxlY3QuVmFsdWUpIGJvb2wgewogCV8sIG9rIDo9IHYuSW50ZXJmYWNlKCkuKHVpbnQ2NCkKIAlyZXR1cm4gb2sKIH0KIGZ1bmMgKGMgKnVpbnQ2NENvbnZlcnRlcikgSXNWYWxpZEdvKHYgcmVmbGVjdC5WYWx1ZSkgYm9vbCB7CiAJcmV0dXJuIHYuSXNWYWxpZCgpICYmIHYuVHlwZSgpID09IGMuZ29UeXBlCiB9Ci1mdW5jIChjICp1aW50NjRDb252ZXJ0ZXIpIE5ldygpIHByZWYuVmFsdWUgIHsgcmV0dXJuIGMuZGVmIH0KLWZ1bmMgKGMgKnVpbnQ2NENvbnZlcnRlcikgWmVybygpIHByZWYuVmFsdWUgeyByZXR1cm4gYy5kZWYgfQorZnVuYyAoYyAqdWludDY0Q29udmVydGVyKSBOZXcoKSBwcm90b3JlZmxlY3QuVmFsdWUgIHsgcmV0dXJuIGMuZGVmIH0KK2Z1bmMgKGMgKnVpbnQ2NENvbnZlcnRlcikgWmVybygpIHByb3RvcmVmbGVjdC5WYWx1ZSB7IHJldHVybiBjLmRlZiB9CiAKIHR5cGUgZmxvYXQzMkNvbnZlcnRlciBzdHJ1Y3QgewogCWdvVHlwZSByZWZsZWN0LlR5cGUKLQlkZWYgICAgcHJlZi5WYWx1ZQorCWRlZiAgICBwcm90b3JlZmxlY3QuVmFsdWUKIH0KIAotZnVuYyAoYyAqZmxvYXQzMkNvbnZlcnRlcikgUEJWYWx1ZU9mKHYgcmVmbGVjdC5WYWx1ZSkgcHJlZi5WYWx1ZSB7CitmdW5jIChjICpmbG9hdDMyQ29udmVydGVyKSBQQlZhbHVlT2YodiByZWZsZWN0LlZhbHVlKSBwcm90b3JlZmxlY3QuVmFsdWUgewogCWlmIHYuVHlwZSgpICE9IGMuZ29UeXBlIHsKIAkJcGFuaWMoZm10LlNwcmludGYoImludmFsaWQgdHlwZTogZ290ICV2LCB3YW50ICV2Iiwgdi5UeXBlKCksIGMuZ29UeXBlKSkKIAl9Ci0JcmV0dXJuIHByZWYuVmFsdWVPZkZsb2F0MzIoZmxvYXQzMih2LkZsb2F0KCkpKQorCXJldHVybiBwcm90b3JlZmxlY3QuVmFsdWVPZkZsb2F0MzIoZmxvYXQzMih2LkZsb2F0KCkpKQogfQotZnVuYyAoYyAqZmxvYXQzMkNvbnZlcnRlcikgR29WYWx1ZU9mKHYgcHJlZi5WYWx1ZSkgcmVmbGVjdC5WYWx1ZSB7CitmdW5jIChjICpmbG9hdDMyQ29udmVydGVyKSBHb1ZhbHVlT2YodiBwcm90b3JlZmxlY3QuVmFsdWUpIHJlZmxlY3QuVmFsdWUgewogCXJldHVybiByZWZsZWN0LlZhbHVlT2YoZmxvYXQzMih2LkZsb2F0KCkpKS5Db252ZXJ0KGMuZ29UeXBlKQogfQotZnVuYyAoYyAqZmxvYXQzMkNvbnZlcnRlcikgSXNWYWxpZFBCKHYgcHJlZi5WYWx1ZSkgYm9vbCB7CitmdW5jIChjICpmbG9hdDMyQ29udmVydGVyKSBJc1ZhbGlkUEIodiBwcm90b3JlZmxlY3QuVmFsdWUpIGJvb2wgewogCV8sIG9rIDo9IHYuSW50ZXJmYWNlKCkuKGZsb2F0MzIpCiAJcmV0dXJuIG9rCiB9CiBmdW5jIChjICpmbG9hdDMyQ29udmVydGVyKSBJc1ZhbGlkR28odiByZWZsZWN0LlZhbHVlKSBib29sIHsKIAlyZXR1cm4gdi5Jc1ZhbGlkKCkgJiYgdi5UeXBlKCkgPT0gYy5nb1R5cGUKIH0KLWZ1bmMgKGMgKmZsb2F0MzJDb252ZXJ0ZXIpIE5ldygpIHByZWYuVmFsdWUgIHsgcmV0dXJuIGMuZGVmIH0KLWZ1bmMgKGMgKmZsb2F0MzJDb252ZXJ0ZXIpIFplcm8oKSBwcmVmLlZhbHVlIHsgcmV0dXJuIGMuZGVmIH0KK2Z1bmMgKGMgKmZsb2F0MzJDb252ZXJ0ZXIpIE5ldygpIHByb3RvcmVmbGVjdC5WYWx1ZSAgeyByZXR1cm4gYy5kZWYgfQorZnVuYyAoYyAqZmxvYXQzMkNvbnZlcnRlcikgWmVybygpIHByb3RvcmVmbGVjdC5WYWx1ZSB7IHJldHVybiBjLmRlZiB9CiAKIHR5cGUgZmxvYXQ2NENvbnZlcnRlciBzdHJ1Y3QgewogCWdvVHlwZSByZWZsZWN0LlR5cGUKLQlkZWYgICAgcHJlZi5WYWx1ZQorCWRlZiAgICBwcm90b3JlZmxlY3QuVmFsdWUKIH0KIAotZnVuYyAoYyAqZmxvYXQ2NENvbnZlcnRlcikgUEJWYWx1ZU9mKHYgcmVmbGVjdC5WYWx1ZSkgcHJlZi5WYWx1ZSB7CitmdW5jIChjICpmbG9hdDY0Q29udmVydGVyKSBQQlZhbHVlT2YodiByZWZsZWN0LlZhbHVlKSBwcm90b3JlZmxlY3QuVmFsdWUgewogCWlmIHYuVHlwZSgpICE9IGMuZ29UeXBlIHsKIAkJcGFuaWMoZm10LlNwcmludGYoImludmFsaWQgdHlwZTogZ290ICV2LCB3YW50ICV2Iiwgdi5UeXBlKCksIGMuZ29UeXBlKSkKIAl9Ci0JcmV0dXJuIHByZWYuVmFsdWVPZkZsb2F0NjQoZmxvYXQ2NCh2LkZsb2F0KCkpKQorCXJldHVybiBwcm90b3JlZmxlY3QuVmFsdWVPZkZsb2F0NjQoZmxvYXQ2NCh2LkZsb2F0KCkpKQogfQotZnVuYyAoYyAqZmxvYXQ2NENvbnZlcnRlcikgR29WYWx1ZU9mKHYgcHJlZi5WYWx1ZSkgcmVmbGVjdC5WYWx1ZSB7CitmdW5jIChjICpmbG9hdDY0Q29udmVydGVyKSBHb1ZhbHVlT2YodiBwcm90b3JlZmxlY3QuVmFsdWUpIHJlZmxlY3QuVmFsdWUgewogCXJldHVybiByZWZsZWN0LlZhbHVlT2YoZmxvYXQ2NCh2LkZsb2F0KCkpKS5Db252ZXJ0KGMuZ29UeXBlKQogfQotZnVuYyAoYyAqZmxvYXQ2NENvbnZlcnRlcikgSXNWYWxpZFBCKHYgcHJlZi5WYWx1ZSkgYm9vbCB7CitmdW5jIChjICpmbG9hdDY0Q29udmVydGVyKSBJc1ZhbGlkUEIodiBwcm90b3JlZmxlY3QuVmFsdWUpIGJvb2wgewogCV8sIG9rIDo9IHYuSW50ZXJmYWNlKCkuKGZsb2F0NjQpCiAJcmV0dXJuIG9rCiB9CiBmdW5jIChjICpmbG9hdDY0Q29udmVydGVyKSBJc1ZhbGlkR28odiByZWZsZWN0LlZhbHVlKSBib29sIHsKIAlyZXR1cm4gdi5Jc1ZhbGlkKCkgJiYgdi5UeXBlKCkgPT0gYy5nb1R5cGUKIH0KLWZ1bmMgKGMgKmZsb2F0NjRDb252ZXJ0ZXIpIE5ldygpIHByZWYuVmFsdWUgIHsgcmV0dXJuIGMuZGVmIH0KLWZ1bmMgKGMgKmZsb2F0NjRDb252ZXJ0ZXIpIFplcm8oKSBwcmVmLlZhbHVlIHsgcmV0dXJuIGMuZGVmIH0KK2Z1bmMgKGMgKmZsb2F0NjRDb252ZXJ0ZXIpIE5ldygpIHByb3RvcmVmbGVjdC5WYWx1ZSAgeyByZXR1cm4gYy5kZWYgfQorZnVuYyAoYyAqZmxvYXQ2NENvbnZlcnRlcikgWmVybygpIHByb3RvcmVmbGVjdC5WYWx1ZSB7IHJldHVybiBjLmRlZiB9CiAKIHR5cGUgc3RyaW5nQ29udmVydGVyIHN0cnVjdCB7CiAJZ29UeXBlIHJlZmxlY3QuVHlwZQotCWRlZiAgICBwcmVmLlZhbHVlCisJZGVmICAgIHByb3RvcmVmbGVjdC5WYWx1ZQogfQogCi1mdW5jIChjICpzdHJpbmdDb252ZXJ0ZXIpIFBCVmFsdWVPZih2IHJlZmxlY3QuVmFsdWUpIHByZWYuVmFsdWUgeworZnVuYyAoYyAqc3RyaW5nQ29udmVydGVyKSBQQlZhbHVlT2YodiByZWZsZWN0LlZhbHVlKSBwcm90b3JlZmxlY3QuVmFsdWUgewogCWlmIHYuVHlwZSgpICE9IGMuZ29UeXBlIHsKIAkJcGFuaWMoZm10LlNwcmludGYoImludmFsaWQgdHlwZTogZ290ICV2LCB3YW50ICV2Iiwgdi5UeXBlKCksIGMuZ29UeXBlKSkKIAl9Ci0JcmV0dXJuIHByZWYuVmFsdWVPZlN0cmluZyh2LkNvbnZlcnQoc3RyaW5nVHlwZSkuU3RyaW5nKCkpCisJcmV0dXJuIHByb3RvcmVmbGVjdC5WYWx1ZU9mU3RyaW5nKHYuQ29udmVydChzdHJpbmdUeXBlKS5TdHJpbmcoKSkKIH0KLWZ1bmMgKGMgKnN0cmluZ0NvbnZlcnRlcikgR29WYWx1ZU9mKHYgcHJlZi5WYWx1ZSkgcmVmbGVjdC5WYWx1ZSB7CitmdW5jIChjICpzdHJpbmdDb252ZXJ0ZXIpIEdvVmFsdWVPZih2IHByb3RvcmVmbGVjdC5WYWx1ZSkgcmVmbGVjdC5WYWx1ZSB7CiAJLy8gcHJlZi5WYWx1ZS5TdHJpbmcgbmV2ZXIgcGFuaWNzLCBzbyB3ZSBnbyB0aHJvdWdoIGFuIGludGVyZmFjZQogCS8vIGNvbnZlcnNpb24gaGVyZSB0byBjaGVjayB0aGUgdHlwZS4KIAlzIDo9IHYuSW50ZXJmYWNlKCkuKHN0cmluZykKQEAgLTMzMSw3MSArMzMwLDcxIEBACiAJfQogCXJldHVybiByZWZsZWN0LlZhbHVlT2YocykuQ29udmVydChjLmdvVHlwZSkKIH0KLWZ1bmMgKGMgKnN0cmluZ0NvbnZlcnRlcikgSXNWYWxpZFBCKHYgcHJlZi5WYWx1ZSkgYm9vbCB7CitmdW5jIChjICpzdHJpbmdDb252ZXJ0ZXIpIElzVmFsaWRQQih2IHByb3RvcmVmbGVjdC5WYWx1ZSkgYm9vbCB7CiAJXywgb2sgOj0gdi5JbnRlcmZhY2UoKS4oc3RyaW5nKQogCXJldHVybiBvawogfQogZnVuYyAoYyAqc3RyaW5nQ29udmVydGVyKSBJc1ZhbGlkR28odiByZWZsZWN0LlZhbHVlKSBib29sIHsKIAlyZXR1cm4gdi5Jc1ZhbGlkKCkgJiYgdi5UeXBlKCkgPT0gYy5nb1R5cGUKIH0KLWZ1bmMgKGMgKnN0cmluZ0NvbnZlcnRlcikgTmV3KCkgcHJlZi5WYWx1ZSAgeyByZXR1cm4gYy5kZWYgfQotZnVuYyAoYyAqc3RyaW5nQ29udmVydGVyKSBaZXJvKCkgcHJlZi5WYWx1ZSB7IHJldHVybiBjLmRlZiB9CitmdW5jIChjICpzdHJpbmdDb252ZXJ0ZXIpIE5ldygpIHByb3RvcmVmbGVjdC5WYWx1ZSAgeyByZXR1cm4gYy5kZWYgfQorZnVuYyAoYyAqc3RyaW5nQ29udmVydGVyKSBaZXJvKCkgcHJvdG9yZWZsZWN0LlZhbHVlIHsgcmV0dXJuIGMuZGVmIH0KIAogdHlwZSBieXRlc0NvbnZlcnRlciBzdHJ1Y3QgewogCWdvVHlwZSByZWZsZWN0LlR5cGUKLQlkZWYgICAgcHJlZi5WYWx1ZQorCWRlZiAgICBwcm90b3JlZmxlY3QuVmFsdWUKIH0KIAotZnVuYyAoYyAqYnl0ZXNDb252ZXJ0ZXIpIFBCVmFsdWVPZih2IHJlZmxlY3QuVmFsdWUpIHByZWYuVmFsdWUgeworZnVuYyAoYyAqYnl0ZXNDb252ZXJ0ZXIpIFBCVmFsdWVPZih2IHJlZmxlY3QuVmFsdWUpIHByb3RvcmVmbGVjdC5WYWx1ZSB7CiAJaWYgdi5UeXBlKCkgIT0gYy5nb1R5cGUgewogCQlwYW5pYyhmbXQuU3ByaW50ZigiaW52YWxpZCB0eXBlOiBnb3QgJXYsIHdhbnQgJXYiLCB2LlR5cGUoKSwgYy5nb1R5cGUpKQogCX0KIAlpZiBjLmdvVHlwZS5LaW5kKCkgPT0gcmVmbGVjdC5TdHJpbmcgJiYgdi5MZW4oKSA9PSAwIHsKLQkJcmV0dXJuIHByZWYuVmFsdWVPZkJ5dGVzKG5pbCkgLy8gZW5zdXJlIGVtcHR5IHN0cmluZyBpcyBbXWJ5dGUobmlsKQorCQlyZXR1cm4gcHJvdG9yZWZsZWN0LlZhbHVlT2ZCeXRlcyhuaWwpIC8vIGVuc3VyZSBlbXB0eSBzdHJpbmcgaXMgW11ieXRlKG5pbCkKIAl9Ci0JcmV0dXJuIHByZWYuVmFsdWVPZkJ5dGVzKHYuQ29udmVydChieXRlc1R5cGUpLkJ5dGVzKCkpCisJcmV0dXJuIHByb3RvcmVmbGVjdC5WYWx1ZU9mQnl0ZXModi5Db252ZXJ0KGJ5dGVzVHlwZSkuQnl0ZXMoKSkKIH0KLWZ1bmMgKGMgKmJ5dGVzQ29udmVydGVyKSBHb1ZhbHVlT2YodiBwcmVmLlZhbHVlKSByZWZsZWN0LlZhbHVlIHsKK2Z1bmMgKGMgKmJ5dGVzQ29udmVydGVyKSBHb1ZhbHVlT2YodiBwcm90b3JlZmxlY3QuVmFsdWUpIHJlZmxlY3QuVmFsdWUgewogCXJldHVybiByZWZsZWN0LlZhbHVlT2Yodi5CeXRlcygpKS5Db252ZXJ0KGMuZ29UeXBlKQogfQotZnVuYyAoYyAqYnl0ZXNDb252ZXJ0ZXIpIElzVmFsaWRQQih2IHByZWYuVmFsdWUpIGJvb2wgeworZnVuYyAoYyAqYnl0ZXNDb252ZXJ0ZXIpIElzVmFsaWRQQih2IHByb3RvcmVmbGVjdC5WYWx1ZSkgYm9vbCB7CiAJXywgb2sgOj0gdi5JbnRlcmZhY2UoKS4oW11ieXRlKQogCXJldHVybiBvawogfQogZnVuYyAoYyAqYnl0ZXNDb252ZXJ0ZXIpIElzVmFsaWRHbyh2IHJlZmxlY3QuVmFsdWUpIGJvb2wgewogCXJldHVybiB2LklzVmFsaWQoKSAmJiB2LlR5cGUoKSA9PSBjLmdvVHlwZQogfQotZnVuYyAoYyAqYnl0ZXNDb252ZXJ0ZXIpIE5ldygpIHByZWYuVmFsdWUgIHsgcmV0dXJuIGMuZGVmIH0KLWZ1bmMgKGMgKmJ5dGVzQ29udmVydGVyKSBaZXJvKCkgcHJlZi5WYWx1ZSB7IHJldHVybiBjLmRlZiB9CitmdW5jIChjICpieXRlc0NvbnZlcnRlcikgTmV3KCkgcHJvdG9yZWZsZWN0LlZhbHVlICB7IHJldHVybiBjLmRlZiB9CitmdW5jIChjICpieXRlc0NvbnZlcnRlcikgWmVybygpIHByb3RvcmVmbGVjdC5WYWx1ZSB7IHJldHVybiBjLmRlZiB9CiAKIHR5cGUgZW51bUNvbnZlcnRlciBzdHJ1Y3QgewogCWdvVHlwZSByZWZsZWN0LlR5cGUKLQlkZWYgICAgcHJlZi5WYWx1ZQorCWRlZiAgICBwcm90b3JlZmxlY3QuVmFsdWUKIH0KIAotZnVuYyBuZXdFbnVtQ29udmVydGVyKGdvVHlwZSByZWZsZWN0LlR5cGUsIGZkIHByZWYuRmllbGREZXNjcmlwdG9yKSBDb252ZXJ0ZXIgewotCXZhciBkZWYgcHJlZi5WYWx1ZQotCWlmIGZkLkNhcmRpbmFsaXR5KCkgPT0gcHJlZi5SZXBlYXRlZCB7Ci0JCWRlZiA9IHByZWYuVmFsdWVPZkVudW0oZmQuRW51bSgpLlZhbHVlcygpLkdldCgwKS5OdW1iZXIoKSkKK2Z1bmMgbmV3RW51bUNvbnZlcnRlcihnb1R5cGUgcmVmbGVjdC5UeXBlLCBmZCBwcm90b3JlZmxlY3QuRmllbGREZXNjcmlwdG9yKSBDb252ZXJ0ZXIgeworCXZhciBkZWYgcHJvdG9yZWZsZWN0LlZhbHVlCisJaWYgZmQuQ2FyZGluYWxpdHkoKSA9PSBwcm90b3JlZmxlY3QuUmVwZWF0ZWQgeworCQlkZWYgPSBwcm90b3JlZmxlY3QuVmFsdWVPZkVudW0oZmQuRW51bSgpLlZhbHVlcygpLkdldCgwKS5OdW1iZXIoKSkKIAl9IGVsc2UgewogCQlkZWYgPSBmZC5EZWZhdWx0KCkKIAl9CiAJcmV0dXJuICZlbnVtQ29udmVydGVye2dvVHlwZSwgZGVmfQogfQogCi1mdW5jIChjICplbnVtQ29udmVydGVyKSBQQlZhbHVlT2YodiByZWZsZWN0LlZhbHVlKSBwcmVmLlZhbHVlIHsKK2Z1bmMgKGMgKmVudW1Db252ZXJ0ZXIpIFBCVmFsdWVPZih2IHJlZmxlY3QuVmFsdWUpIHByb3RvcmVmbGVjdC5WYWx1ZSB7CiAJaWYgdi5UeXBlKCkgIT0gYy5nb1R5cGUgewogCQlwYW5pYyhmbXQuU3ByaW50ZigiaW52YWxpZCB0eXBlOiBnb3QgJXYsIHdhbnQgJXYiLCB2LlR5cGUoKSwgYy5nb1R5cGUpKQogCX0KLQlyZXR1cm4gcHJlZi5WYWx1ZU9mRW51bShwcmVmLkVudW1OdW1iZXIodi5JbnQoKSkpCisJcmV0dXJuIHByb3RvcmVmbGVjdC5WYWx1ZU9mRW51bShwcm90b3JlZmxlY3QuRW51bU51bWJlcih2LkludCgpKSkKIH0KIAotZnVuYyAoYyAqZW51bUNvbnZlcnRlcikgR29WYWx1ZU9mKHYgcHJlZi5WYWx1ZSkgcmVmbGVjdC5WYWx1ZSB7CitmdW5jIChjICplbnVtQ29udmVydGVyKSBHb1ZhbHVlT2YodiBwcm90b3JlZmxlY3QuVmFsdWUpIHJlZmxlY3QuVmFsdWUgewogCXJldHVybiByZWZsZWN0LlZhbHVlT2Yodi5FbnVtKCkpLkNvbnZlcnQoYy5nb1R5cGUpCiB9CiAKLWZ1bmMgKGMgKmVudW1Db252ZXJ0ZXIpIElzVmFsaWRQQih2IHByZWYuVmFsdWUpIGJvb2wgewotCV8sIG9rIDo9IHYuSW50ZXJmYWNlKCkuKHByZWYuRW51bU51bWJlcikKK2Z1bmMgKGMgKmVudW1Db252ZXJ0ZXIpIElzVmFsaWRQQih2IHByb3RvcmVmbGVjdC5WYWx1ZSkgYm9vbCB7CisJXywgb2sgOj0gdi5JbnRlcmZhY2UoKS4ocHJvdG9yZWZsZWN0LkVudW1OdW1iZXIpCiAJcmV0dXJuIG9rCiB9CiAKQEAgLTQwMywxMSArNDAyLDExIEBACiAJcmV0dXJuIHYuSXNWYWxpZCgpICYmIHYuVHlwZSgpID09IGMuZ29UeXBlCiB9CiAKLWZ1bmMgKGMgKmVudW1Db252ZXJ0ZXIpIE5ldygpIHByZWYuVmFsdWUgeworZnVuYyAoYyAqZW51bUNvbnZlcnRlcikgTmV3KCkgcHJvdG9yZWZsZWN0LlZhbHVlIHsKIAlyZXR1cm4gYy5kZWYKIH0KIAotZnVuYyAoYyAqZW51bUNvbnZlcnRlcikgWmVybygpIHByZWYuVmFsdWUgeworZnVuYyAoYyAqZW51bUNvbnZlcnRlcikgWmVybygpIHByb3RvcmVmbGVjdC5WYWx1ZSB7CiAJcmV0dXJuIGMuZGVmCiB9CiAKQEAgLTQxOSw3ICs0MTgsNyBAQAogCXJldHVybiAmbWVzc2FnZUNvbnZlcnRlcntnb1R5cGV9CiB9CiAKLWZ1bmMgKGMgKm1lc3NhZ2VDb252ZXJ0ZXIpIFBCVmFsdWVPZih2IHJlZmxlY3QuVmFsdWUpIHByZWYuVmFsdWUgeworZnVuYyAoYyAqbWVzc2FnZUNvbnZlcnRlcikgUEJWYWx1ZU9mKHYgcmVmbGVjdC5WYWx1ZSkgcHJvdG9yZWZsZWN0LlZhbHVlIHsKIAlpZiB2LlR5cGUoKSAhPSBjLmdvVHlwZSB7CiAJCXBhbmljKGZtdC5TcHJpbnRmKCJpbnZhbGlkIHR5cGU6IGdvdCAldiwgd2FudCAldiIsIHYuVHlwZSgpLCBjLmdvVHlwZSkpCiAJfQpAQCAtNDMwLDEzICs0MjksMTMgQEAKIAkJCXYgPSByZWZsZWN0Llplcm8ocmVmbGVjdC5QdHJUbyh2LlR5cGUoKSkpCiAJCX0KIAl9Ci0JaWYgbSwgb2sgOj0gdi5JbnRlcmZhY2UoKS4ocHJlZi5Qcm90b01lc3NhZ2UpOyBvayB7Ci0JCXJldHVybiBwcmVmLlZhbHVlT2ZNZXNzYWdlKG0uUHJvdG9SZWZsZWN0KCkpCisJaWYgbSwgb2sgOj0gdi5JbnRlcmZhY2UoKS4ocHJvdG9yZWZsZWN0LlByb3RvTWVzc2FnZSk7IG9rIHsKKwkJcmV0dXJuIHByb3RvcmVmbGVjdC5WYWx1ZU9mTWVzc2FnZShtLlByb3RvUmVmbGVjdCgpKQogCX0KLQlyZXR1cm4gcHJlZi5WYWx1ZU9mTWVzc2FnZShsZWdhY3lXcmFwTWVzc2FnZSh2KSkKKwlyZXR1cm4gcHJvdG9yZWZsZWN0LlZhbHVlT2ZNZXNzYWdlKGxlZ2FjeVdyYXBNZXNzYWdlKHYpKQogfQogCi1mdW5jIChjICptZXNzYWdlQ29udmVydGVyKSBHb1ZhbHVlT2YodiBwcmVmLlZhbHVlKSByZWZsZWN0LlZhbHVlIHsKK2Z1bmMgKGMgKm1lc3NhZ2VDb252ZXJ0ZXIpIEdvVmFsdWVPZih2IHByb3RvcmVmbGVjdC5WYWx1ZSkgcmVmbGVjdC5WYWx1ZSB7CiAJbSA6PSB2Lk1lc3NhZ2UoKQogCXZhciBydiByZWZsZWN0LlZhbHVlCiAJaWYgdSwgb2sgOj0gbS4odW53cmFwcGVyKTsgb2sgewpAQCAtNDYwLDcgKzQ1OSw3IEBACiAJcmV0dXJuIHJ2CiB9CiAKLWZ1bmMgKGMgKm1lc3NhZ2VDb252ZXJ0ZXIpIElzVmFsaWRQQih2IHByZWYuVmFsdWUpIGJvb2wgeworZnVuYyAoYyAqbWVzc2FnZUNvbnZlcnRlcikgSXNWYWxpZFBCKHYgcHJvdG9yZWZsZWN0LlZhbHVlKSBib29sIHsKIAltIDo9IHYuTWVzc2FnZSgpCiAJdmFyIHJ2IHJlZmxlY3QuVmFsdWUKIAlpZiB1LCBvayA6PSBtLih1bndyYXBwZXIpOyBvayB7CkBAIC00NzgsMTQgKzQ3NywxNCBAQAogCXJldHVybiB2LklzVmFsaWQoKSAmJiB2LlR5cGUoKSA9PSBjLmdvVHlwZQogfQogCi1mdW5jIChjICptZXNzYWdlQ29udmVydGVyKSBOZXcoKSBwcmVmLlZhbHVlIHsKK2Z1bmMgKGMgKm1lc3NhZ2VDb252ZXJ0ZXIpIE5ldygpIHByb3RvcmVmbGVjdC5WYWx1ZSB7CiAJaWYgYy5pc05vblBvaW50ZXIoKSB7CiAJCXJldHVybiBjLlBCVmFsdWVPZihyZWZsZWN0Lk5ldyhjLmdvVHlwZSkuRWxlbSgpKQogCX0KIAlyZXR1cm4gYy5QQlZhbHVlT2YocmVmbGVjdC5OZXcoYy5nb1R5cGUuRWxlbSgpKSkKIH0KIAotZnVuYyAoYyAqbWVzc2FnZUNvbnZlcnRlcikgWmVybygpIHByZWYuVmFsdWUgeworZnVuYyAoYyAqbWVzc2FnZUNvbnZlcnRlcikgWmVybygpIHByb3RvcmVmbGVjdC5WYWx1ZSB7CiAJcmV0dXJuIGMuUEJWYWx1ZU9mKHJlZmxlY3QuWmVybyhjLmdvVHlwZSkpCiB9CiAKZGlmZiAtLWdpdCBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL2NvbnZlcnRfbGlzdC5nbyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL2NvbnZlcnRfbGlzdC5nbwppbmRleCA2ZmNjYWI1Li5mODkxMzY1IDEwMDY0NAotLS0gYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9jb252ZXJ0X2xpc3QuZ28KKysrIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvY29udmVydF9saXN0LmdvCkBAIC04LDEwICs4LDEwIEBACiAJImZtdCIKIAkicmVmbGVjdCIKIAotCXByZWYgImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgorCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9yZWZsZWN0L3Byb3RvcmVmbGVjdCIKICkKIAotZnVuYyBuZXdMaXN0Q29udmVydGVyKHQgcmVmbGVjdC5UeXBlLCBmZCBwcmVmLkZpZWxkRGVzY3JpcHRvcikgQ29udmVydGVyIHsKK2Z1bmMgbmV3TGlzdENvbnZlcnRlcih0IHJlZmxlY3QuVHlwZSwgZmQgcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvcikgQ29udmVydGVyIHsKIAlzd2l0Y2ggewogCWNhc2UgdC5LaW5kKCkgPT0gcmVmbGVjdC5QdHIgJiYgdC5FbGVtKCkuS2luZCgpID09IHJlZmxlY3QuU2xpY2U6CiAJCXJldHVybiAmbGlzdFB0ckNvbnZlcnRlcnt0LCBuZXdTaW5ndWxhckNvbnZlcnRlcih0LkVsZW0oKS5FbGVtKCksIGZkKX0KQEAgLTI2LDE2ICsyNiwxNiBAQAogCWMgICAgICBDb252ZXJ0ZXIKIH0KIAotZnVuYyAoYyAqbGlzdENvbnZlcnRlcikgUEJWYWx1ZU9mKHYgcmVmbGVjdC5WYWx1ZSkgcHJlZi5WYWx1ZSB7CitmdW5jIChjICpsaXN0Q29udmVydGVyKSBQQlZhbHVlT2YodiByZWZsZWN0LlZhbHVlKSBwcm90b3JlZmxlY3QuVmFsdWUgewogCWlmIHYuVHlwZSgpICE9IGMuZ29UeXBlIHsKIAkJcGFuaWMoZm10LlNwcmludGYoImludmFsaWQgdHlwZTogZ290ICV2LCB3YW50ICV2Iiwgdi5UeXBlKCksIGMuZ29UeXBlKSkKIAl9CiAJcHYgOj0gcmVmbGVjdC5OZXcoYy5nb1R5cGUpCiAJcHYuRWxlbSgpLlNldCh2KQotCXJldHVybiBwcmVmLlZhbHVlT2ZMaXN0KCZsaXN0UmVmbGVjdHtwdiwgYy5jfSkKKwlyZXR1cm4gcHJvdG9yZWZsZWN0LlZhbHVlT2ZMaXN0KCZsaXN0UmVmbGVjdHtwdiwgYy5jfSkKIH0KIAotZnVuYyAoYyAqbGlzdENvbnZlcnRlcikgR29WYWx1ZU9mKHYgcHJlZi5WYWx1ZSkgcmVmbGVjdC5WYWx1ZSB7CitmdW5jIChjICpsaXN0Q29udmVydGVyKSBHb1ZhbHVlT2YodiBwcm90b3JlZmxlY3QuVmFsdWUpIHJlZmxlY3QuVmFsdWUgewogCXJ2IDo9IHYuTGlzdCgpLigqbGlzdFJlZmxlY3QpLnYKIAlpZiBydi5Jc05pbCgpIHsKIAkJcmV0dXJuIHJlZmxlY3QuWmVybyhjLmdvVHlwZSkKQEAgLTQzLDcgKzQzLDcgQEAKIAlyZXR1cm4gcnYuRWxlbSgpCiB9CiAKLWZ1bmMgKGMgKmxpc3RDb252ZXJ0ZXIpIElzVmFsaWRQQih2IHByZWYuVmFsdWUpIGJvb2wgeworZnVuYyAoYyAqbGlzdENvbnZlcnRlcikgSXNWYWxpZFBCKHYgcHJvdG9yZWZsZWN0LlZhbHVlKSBib29sIHsKIAlsaXN0LCBvayA6PSB2LkludGVyZmFjZSgpLigqbGlzdFJlZmxlY3QpCiAJaWYgIW9rIHsKIAkJcmV0dXJuIGZhbHNlCkBAIC01NSwxMiArNTUsMTIgQEAKIAlyZXR1cm4gdi5Jc1ZhbGlkKCkgJiYgdi5UeXBlKCkgPT0gYy5nb1R5cGUKIH0KIAotZnVuYyAoYyAqbGlzdENvbnZlcnRlcikgTmV3KCkgcHJlZi5WYWx1ZSB7Ci0JcmV0dXJuIHByZWYuVmFsdWVPZkxpc3QoJmxpc3RSZWZsZWN0e3JlZmxlY3QuTmV3KGMuZ29UeXBlKSwgYy5jfSkKK2Z1bmMgKGMgKmxpc3RDb252ZXJ0ZXIpIE5ldygpIHByb3RvcmVmbGVjdC5WYWx1ZSB7CisJcmV0dXJuIHByb3RvcmVmbGVjdC5WYWx1ZU9mTGlzdCgmbGlzdFJlZmxlY3R7cmVmbGVjdC5OZXcoYy5nb1R5cGUpLCBjLmN9KQogfQogCi1mdW5jIChjICpsaXN0Q29udmVydGVyKSBaZXJvKCkgcHJlZi5WYWx1ZSB7Ci0JcmV0dXJuIHByZWYuVmFsdWVPZkxpc3QoJmxpc3RSZWZsZWN0e3JlZmxlY3QuWmVybyhyZWZsZWN0LlB0clRvKGMuZ29UeXBlKSksIGMuY30pCitmdW5jIChjICpsaXN0Q29udmVydGVyKSBaZXJvKCkgcHJvdG9yZWZsZWN0LlZhbHVlIHsKKwlyZXR1cm4gcHJvdG9yZWZsZWN0LlZhbHVlT2ZMaXN0KCZsaXN0UmVmbGVjdHtyZWZsZWN0Llplcm8ocmVmbGVjdC5QdHJUbyhjLmdvVHlwZSkpLCBjLmN9KQogfQogCiB0eXBlIGxpc3RQdHJDb252ZXJ0ZXIgc3RydWN0IHsKQEAgLTY4LDE4ICs2OCwxOCBAQAogCWMgICAgICBDb252ZXJ0ZXIKIH0KIAotZnVuYyAoYyAqbGlzdFB0ckNvbnZlcnRlcikgUEJWYWx1ZU9mKHYgcmVmbGVjdC5WYWx1ZSkgcHJlZi5WYWx1ZSB7CitmdW5jIChjICpsaXN0UHRyQ29udmVydGVyKSBQQlZhbHVlT2YodiByZWZsZWN0LlZhbHVlKSBwcm90b3JlZmxlY3QuVmFsdWUgewogCWlmIHYuVHlwZSgpICE9IGMuZ29UeXBlIHsKIAkJcGFuaWMoZm10LlNwcmludGYoImludmFsaWQgdHlwZTogZ290ICV2LCB3YW50ICV2Iiwgdi5UeXBlKCksIGMuZ29UeXBlKSkKIAl9Ci0JcmV0dXJuIHByZWYuVmFsdWVPZkxpc3QoJmxpc3RSZWZsZWN0e3YsIGMuY30pCisJcmV0dXJuIHByb3RvcmVmbGVjdC5WYWx1ZU9mTGlzdCgmbGlzdFJlZmxlY3R7diwgYy5jfSkKIH0KIAotZnVuYyAoYyAqbGlzdFB0ckNvbnZlcnRlcikgR29WYWx1ZU9mKHYgcHJlZi5WYWx1ZSkgcmVmbGVjdC5WYWx1ZSB7CitmdW5jIChjICpsaXN0UHRyQ29udmVydGVyKSBHb1ZhbHVlT2YodiBwcm90b3JlZmxlY3QuVmFsdWUpIHJlZmxlY3QuVmFsdWUgewogCXJldHVybiB2Lkxpc3QoKS4oKmxpc3RSZWZsZWN0KS52CiB9CiAKLWZ1bmMgKGMgKmxpc3RQdHJDb252ZXJ0ZXIpIElzVmFsaWRQQih2IHByZWYuVmFsdWUpIGJvb2wgeworZnVuYyAoYyAqbGlzdFB0ckNvbnZlcnRlcikgSXNWYWxpZFBCKHYgcHJvdG9yZWZsZWN0LlZhbHVlKSBib29sIHsKIAlsaXN0LCBvayA6PSB2LkludGVyZmFjZSgpLigqbGlzdFJlZmxlY3QpCiAJaWYgIW9rIHsKIAkJcmV0dXJuIGZhbHNlCkBAIC05MSwxMSArOTEsMTEgQEAKIAlyZXR1cm4gdi5Jc1ZhbGlkKCkgJiYgdi5UeXBlKCkgPT0gYy5nb1R5cGUKIH0KIAotZnVuYyAoYyAqbGlzdFB0ckNvbnZlcnRlcikgTmV3KCkgcHJlZi5WYWx1ZSB7CitmdW5jIChjICpsaXN0UHRyQ29udmVydGVyKSBOZXcoKSBwcm90b3JlZmxlY3QuVmFsdWUgewogCXJldHVybiBjLlBCVmFsdWVPZihyZWZsZWN0Lk5ldyhjLmdvVHlwZS5FbGVtKCkpKQogfQogCi1mdW5jIChjICpsaXN0UHRyQ29udmVydGVyKSBaZXJvKCkgcHJlZi5WYWx1ZSB7CitmdW5jIChjICpsaXN0UHRyQ29udmVydGVyKSBaZXJvKCkgcHJvdG9yZWZsZWN0LlZhbHVlIHsKIAlyZXR1cm4gYy5QQlZhbHVlT2YocmVmbGVjdC5aZXJvKGMuZ29UeXBlKSkKIH0KIApAQCAtMTEwLDE2ICsxMTAsMTYgQEAKIAl9CiAJcmV0dXJuIGxzLnYuRWxlbSgpLkxlbigpCiB9Ci1mdW5jIChscyAqbGlzdFJlZmxlY3QpIEdldChpIGludCkgcHJlZi5WYWx1ZSB7CitmdW5jIChscyAqbGlzdFJlZmxlY3QpIEdldChpIGludCkgcHJvdG9yZWZsZWN0LlZhbHVlIHsKIAlyZXR1cm4gbHMuY29udi5QQlZhbHVlT2YobHMudi5FbGVtKCkuSW5kZXgoaSkpCiB9Ci1mdW5jIChscyAqbGlzdFJlZmxlY3QpIFNldChpIGludCwgdiBwcmVmLlZhbHVlKSB7CitmdW5jIChscyAqbGlzdFJlZmxlY3QpIFNldChpIGludCwgdiBwcm90b3JlZmxlY3QuVmFsdWUpIHsKIAlscy52LkVsZW0oKS5JbmRleChpKS5TZXQobHMuY29udi5Hb1ZhbHVlT2YodikpCiB9Ci1mdW5jIChscyAqbGlzdFJlZmxlY3QpIEFwcGVuZCh2IHByZWYuVmFsdWUpIHsKK2Z1bmMgKGxzICpsaXN0UmVmbGVjdCkgQXBwZW5kKHYgcHJvdG9yZWZsZWN0LlZhbHVlKSB7CiAJbHMudi5FbGVtKCkuU2V0KHJlZmxlY3QuQXBwZW5kKGxzLnYuRWxlbSgpLCBscy5jb252LkdvVmFsdWVPZih2KSkpCiB9Ci1mdW5jIChscyAqbGlzdFJlZmxlY3QpIEFwcGVuZE11dGFibGUoKSBwcmVmLlZhbHVlIHsKK2Z1bmMgKGxzICpsaXN0UmVmbGVjdCkgQXBwZW5kTXV0YWJsZSgpIHByb3RvcmVmbGVjdC5WYWx1ZSB7CiAJaWYgXywgb2sgOj0gbHMuY29udi4oKm1lc3NhZ2VDb252ZXJ0ZXIpOyAhb2sgewogCQlwYW5pYygiaW52YWxpZCBBcHBlbmRNdXRhYmxlIG9uIGxpc3Qgd2l0aCBub24tbWVzc2FnZSB0eXBlIikKIAl9CkBAIC0xMzAsNyArMTMwLDcgQEAKIGZ1bmMgKGxzICpsaXN0UmVmbGVjdCkgVHJ1bmNhdGUoaSBpbnQpIHsKIAlscy52LkVsZW0oKS5TZXQobHMudi5FbGVtKCkuU2xpY2UoMCwgaSkpCiB9Ci1mdW5jIChscyAqbGlzdFJlZmxlY3QpIE5ld0VsZW1lbnQoKSBwcmVmLlZhbHVlIHsKK2Z1bmMgKGxzICpsaXN0UmVmbGVjdCkgTmV3RWxlbWVudCgpIHByb3RvcmVmbGVjdC5WYWx1ZSB7CiAJcmV0dXJuIGxzLmNvbnYuTmV3KCkKIH0KIGZ1bmMgKGxzICpsaXN0UmVmbGVjdCkgSXNWYWxpZCgpIGJvb2wgewpkaWZmIC0tZ2l0IGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvY29udmVydF9tYXAuZ28gYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9jb252ZXJ0X21hcC5nbwppbmRleCBkZTA2YjI1Li5mMzBiMGEwIDEwMDY0NAotLS0gYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9jb252ZXJ0X21hcC5nbworKysgYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9jb252ZXJ0X21hcC5nbwpAQCAtOCw3ICs4LDcgQEAKIAkiZm10IgogCSJyZWZsZWN0IgogCi0JcHJlZiAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZmxlY3QiCisJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgogKQogCiB0eXBlIG1hcENvbnZlcnRlciBzdHJ1Y3QgewpAQCAtMTYsNyArMTYsNyBAQAogCWtleUNvbnYsIHZhbENvbnYgQ29udmVydGVyCiB9CiAKLWZ1bmMgbmV3TWFwQ29udmVydGVyKHQgcmVmbGVjdC5UeXBlLCBmZCBwcmVmLkZpZWxkRGVzY3JpcHRvcikgKm1hcENvbnZlcnRlciB7CitmdW5jIG5ld01hcENvbnZlcnRlcih0IHJlZmxlY3QuVHlwZSwgZmQgcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvcikgKm1hcENvbnZlcnRlciB7CiAJaWYgdC5LaW5kKCkgIT0gcmVmbGVjdC5NYXAgewogCQlwYW5pYyhmbXQuU3ByaW50ZigiaW52YWxpZCBHbyB0eXBlICV2IGZvciBmaWVsZCAldiIsIHQsIGZkLkZ1bGxOYW1lKCkpKQogCX0KQEAgLTI3LDE4ICsyNywxOCBAQAogCX0KIH0KIAotZnVuYyAoYyAqbWFwQ29udmVydGVyKSBQQlZhbHVlT2YodiByZWZsZWN0LlZhbHVlKSBwcmVmLlZhbHVlIHsKK2Z1bmMgKGMgKm1hcENvbnZlcnRlcikgUEJWYWx1ZU9mKHYgcmVmbGVjdC5WYWx1ZSkgcHJvdG9yZWZsZWN0LlZhbHVlIHsKIAlpZiB2LlR5cGUoKSAhPSBjLmdvVHlwZSB7CiAJCXBhbmljKGZtdC5TcHJpbnRmKCJpbnZhbGlkIHR5cGU6IGdvdCAldiwgd2FudCAldiIsIHYuVHlwZSgpLCBjLmdvVHlwZSkpCiAJfQotCXJldHVybiBwcmVmLlZhbHVlT2ZNYXAoJm1hcFJlZmxlY3R7diwgYy5rZXlDb252LCBjLnZhbENvbnZ9KQorCXJldHVybiBwcm90b3JlZmxlY3QuVmFsdWVPZk1hcCgmbWFwUmVmbGVjdHt2LCBjLmtleUNvbnYsIGMudmFsQ29udn0pCiB9CiAKLWZ1bmMgKGMgKm1hcENvbnZlcnRlcikgR29WYWx1ZU9mKHYgcHJlZi5WYWx1ZSkgcmVmbGVjdC5WYWx1ZSB7CitmdW5jIChjICptYXBDb252ZXJ0ZXIpIEdvVmFsdWVPZih2IHByb3RvcmVmbGVjdC5WYWx1ZSkgcmVmbGVjdC5WYWx1ZSB7CiAJcmV0dXJuIHYuTWFwKCkuKCptYXBSZWZsZWN0KS52CiB9CiAKLWZ1bmMgKGMgKm1hcENvbnZlcnRlcikgSXNWYWxpZFBCKHYgcHJlZi5WYWx1ZSkgYm9vbCB7CitmdW5jIChjICptYXBDb252ZXJ0ZXIpIElzVmFsaWRQQih2IHByb3RvcmVmbGVjdC5WYWx1ZSkgYm9vbCB7CiAJbWFwdiwgb2sgOj0gdi5JbnRlcmZhY2UoKS4oKm1hcFJlZmxlY3QpCiAJaWYgIW9rIHsKIAkJcmV0dXJuIGZhbHNlCkBAIC01MCwxMSArNTAsMTEgQEAKIAlyZXR1cm4gdi5Jc1ZhbGlkKCkgJiYgdi5UeXBlKCkgPT0gYy5nb1R5cGUKIH0KIAotZnVuYyAoYyAqbWFwQ29udmVydGVyKSBOZXcoKSBwcmVmLlZhbHVlIHsKK2Z1bmMgKGMgKm1hcENvbnZlcnRlcikgTmV3KCkgcHJvdG9yZWZsZWN0LlZhbHVlIHsKIAlyZXR1cm4gYy5QQlZhbHVlT2YocmVmbGVjdC5NYWtlTWFwKGMuZ29UeXBlKSkKIH0KIAotZnVuYyAoYyAqbWFwQ29udmVydGVyKSBaZXJvKCkgcHJlZi5WYWx1ZSB7CitmdW5jIChjICptYXBDb252ZXJ0ZXIpIFplcm8oKSBwcm90b3JlZmxlY3QuVmFsdWUgewogCXJldHVybiBjLlBCVmFsdWVPZihyZWZsZWN0Llplcm8oYy5nb1R5cGUpKQogfQogCkBAIC02NywyOSArNjcsMjkgQEAKIGZ1bmMgKG1zICptYXBSZWZsZWN0KSBMZW4oKSBpbnQgewogCXJldHVybiBtcy52LkxlbigpCiB9Ci1mdW5jIChtcyAqbWFwUmVmbGVjdCkgSGFzKGsgcHJlZi5NYXBLZXkpIGJvb2wgeworZnVuYyAobXMgKm1hcFJlZmxlY3QpIEhhcyhrIHByb3RvcmVmbGVjdC5NYXBLZXkpIGJvb2wgewogCXJrIDo9IG1zLmtleUNvbnYuR29WYWx1ZU9mKGsuVmFsdWUoKSkKIAlydiA6PSBtcy52Lk1hcEluZGV4KHJrKQogCXJldHVybiBydi5Jc1ZhbGlkKCkKIH0KLWZ1bmMgKG1zICptYXBSZWZsZWN0KSBHZXQoayBwcmVmLk1hcEtleSkgcHJlZi5WYWx1ZSB7CitmdW5jIChtcyAqbWFwUmVmbGVjdCkgR2V0KGsgcHJvdG9yZWZsZWN0Lk1hcEtleSkgcHJvdG9yZWZsZWN0LlZhbHVlIHsKIAlyayA6PSBtcy5rZXlDb252LkdvVmFsdWVPZihrLlZhbHVlKCkpCiAJcnYgOj0gbXMudi5NYXBJbmRleChyaykKIAlpZiAhcnYuSXNWYWxpZCgpIHsKLQkJcmV0dXJuIHByZWYuVmFsdWV7fQorCQlyZXR1cm4gcHJvdG9yZWZsZWN0LlZhbHVle30KIAl9CiAJcmV0dXJuIG1zLnZhbENvbnYuUEJWYWx1ZU9mKHJ2KQogfQotZnVuYyAobXMgKm1hcFJlZmxlY3QpIFNldChrIHByZWYuTWFwS2V5LCB2IHByZWYuVmFsdWUpIHsKK2Z1bmMgKG1zICptYXBSZWZsZWN0KSBTZXQoayBwcm90b3JlZmxlY3QuTWFwS2V5LCB2IHByb3RvcmVmbGVjdC5WYWx1ZSkgewogCXJrIDo9IG1zLmtleUNvbnYuR29WYWx1ZU9mKGsuVmFsdWUoKSkKIAlydiA6PSBtcy52YWxDb252LkdvVmFsdWVPZih2KQogCW1zLnYuU2V0TWFwSW5kZXgocmssIHJ2KQogfQotZnVuYyAobXMgKm1hcFJlZmxlY3QpIENsZWFyKGsgcHJlZi5NYXBLZXkpIHsKK2Z1bmMgKG1zICptYXBSZWZsZWN0KSBDbGVhcihrIHByb3RvcmVmbGVjdC5NYXBLZXkpIHsKIAlyayA6PSBtcy5rZXlDb252LkdvVmFsdWVPZihrLlZhbHVlKCkpCiAJbXMudi5TZXRNYXBJbmRleChyaywgcmVmbGVjdC5WYWx1ZXt9KQogfQotZnVuYyAobXMgKm1hcFJlZmxlY3QpIE11dGFibGUoayBwcmVmLk1hcEtleSkgcHJlZi5WYWx1ZSB7CitmdW5jIChtcyAqbWFwUmVmbGVjdCkgTXV0YWJsZShrIHByb3RvcmVmbGVjdC5NYXBLZXkpIHByb3RvcmVmbGVjdC5WYWx1ZSB7CiAJaWYgXywgb2sgOj0gbXMudmFsQ29udi4oKm1lc3NhZ2VDb252ZXJ0ZXIpOyAhb2sgewogCQlwYW5pYygiaW52YWxpZCBNdXRhYmxlIG9uIG1hcCB3aXRoIG5vbi1tZXNzYWdlIHZhbHVlIHR5cGUiKQogCX0KQEAgLTEwMCw3ICsxMDAsNyBAQAogCX0KIAlyZXR1cm4gdgogfQotZnVuYyAobXMgKm1hcFJlZmxlY3QpIFJhbmdlKGYgZnVuYyhwcmVmLk1hcEtleSwgcHJlZi5WYWx1ZSkgYm9vbCkgeworZnVuYyAobXMgKm1hcFJlZmxlY3QpIFJhbmdlKGYgZnVuYyhwcm90b3JlZmxlY3QuTWFwS2V5LCBwcm90b3JlZmxlY3QuVmFsdWUpIGJvb2wpIHsKIAlpdGVyIDo9IG1hcFJhbmdlKG1zLnYpCiAJZm9yIGl0ZXIuTmV4dCgpIHsKIAkJayA6PSBtcy5rZXlDb252LlBCVmFsdWVPZihpdGVyLktleSgpKS5NYXBLZXkoKQpAQCAtMTEwLDcgKzExMCw3IEBACiAJCX0KIAl9CiB9Ci1mdW5jIChtcyAqbWFwUmVmbGVjdCkgTmV3VmFsdWUoKSBwcmVmLlZhbHVlIHsKK2Z1bmMgKG1zICptYXBSZWZsZWN0KSBOZXdWYWx1ZSgpIHByb3RvcmVmbGVjdC5WYWx1ZSB7CiAJcmV0dXJuIG1zLnZhbENvbnYuTmV3KCkKIH0KIGZ1bmMgKG1zICptYXBSZWZsZWN0KSBJc1ZhbGlkKCkgYm9vbCB7CmRpZmYgLS1naXQgYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9kZWNvZGUuZ28gYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9kZWNvZGUuZ28KaW5kZXggOTQ5ZGM0OS4uY2RhMDUyMCAxMDA2NDQKLS0tIGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvZGVjb2RlLmdvCisrKyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL2RlY29kZS5nbwpAQCAtMTIsMTIgKzEyLDEyIEBACiAJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ZsYWdzIgogCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9wcm90byIKIAkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZmxlY3QiCi0JcHJlZyAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZ2lzdHJ5IgorCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9yZWZsZWN0L3Byb3RvcmVnaXN0cnkiCiAJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3J1bnRpbWUvcHJvdG9pZmFjZSIKLQlwaWZhY2UgImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3J1bnRpbWUvcHJvdG9pZmFjZSIKICkKIAogdmFyIGVyckRlY29kZSA9IGVycm9ycy5OZXcoImNhbm5vdCBwYXJzZSBpbnZhbGlkIHdpcmUtZm9ybWF0IGRhdGEiKQordmFyIGVyclJlY3Vyc2lvbkRlcHRoID0gZXJyb3JzLk5ldygiZXhjZWVkZWQgbWF4aW11bSByZWN1cnNpb24gZGVwdGgiKQogCiB0eXBlIHVubWFyc2hhbE9wdGlvbnMgc3RydWN0IHsKIAlmbGFncyAgICBwcm90b2lmYWNlLlVubWFyc2hhbElucHV0RmxhZ3MKQEAgLTI1LDYgKzI1LDcgQEAKIAkJRmluZEV4dGVuc2lvbkJ5TmFtZShmaWVsZCBwcm90b3JlZmxlY3QuRnVsbE5hbWUpIChwcm90b3JlZmxlY3QuRXh0ZW5zaW9uVHlwZSwgZXJyb3IpCiAJCUZpbmRFeHRlbnNpb25CeU51bWJlcihtZXNzYWdlIHByb3RvcmVmbGVjdC5GdWxsTmFtZSwgZmllbGQgcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyKSAocHJvdG9yZWZsZWN0LkV4dGVuc2lvblR5cGUsIGVycm9yKQogCX0KKwlkZXB0aCBpbnQKIH0KIAogZnVuYyAobyB1bm1hcnNoYWxPcHRpb25zKSBPcHRpb25zKCkgcHJvdG8uVW5tYXJzaGFsT3B0aW9ucyB7CkBAIC0zNiwxNCArMzcsMTcgQEAKIAl9CiB9CiAKLWZ1bmMgKG8gdW5tYXJzaGFsT3B0aW9ucykgRGlzY2FyZFVua25vd24oKSBib29sIHsgcmV0dXJuIG8uZmxhZ3MmcGlmYWNlLlVubWFyc2hhbERpc2NhcmRVbmtub3duICE9IDAgfQorZnVuYyAobyB1bm1hcnNoYWxPcHRpb25zKSBEaXNjYXJkVW5rbm93bigpIGJvb2wgeworCXJldHVybiBvLmZsYWdzJnByb3RvaWZhY2UuVW5tYXJzaGFsRGlzY2FyZFVua25vd24gIT0gMAorfQogCiBmdW5jIChvIHVubWFyc2hhbE9wdGlvbnMpIElzRGVmYXVsdCgpIGJvb2wgewotCXJldHVybiBvLmZsYWdzID09IDAgJiYgby5yZXNvbHZlciA9PSBwcmVnLkdsb2JhbFR5cGVzCisJcmV0dXJuIG8uZmxhZ3MgPT0gMCAmJiBvLnJlc29sdmVyID09IHByb3RvcmVnaXN0cnkuR2xvYmFsVHlwZXMKIH0KIAogdmFyIGxhenlVbm1hcnNoYWxPcHRpb25zID0gdW5tYXJzaGFsT3B0aW9uc3sKLQlyZXNvbHZlcjogcHJlZy5HbG9iYWxUeXBlcywKKwlyZXNvbHZlcjogcHJvdG9yZWdpc3RyeS5HbG9iYWxUeXBlcywKKwlkZXB0aDogICAgcHJvdG93aXJlLkRlZmF1bHRSZWN1cnNpb25MaW1pdCwKIH0KIAogdHlwZSB1bm1hcnNoYWxPdXRwdXQgc3RydWN0IHsKQEAgLTUyLDcgKzU2LDcgQEAKIH0KIAogLy8gdW5tYXJzaGFsIGlzIHByb3RvcmVmbGVjdC5NZXRob2RzLlVubWFyc2hhbC4KLWZ1bmMgKG1pICpNZXNzYWdlSW5mbykgdW5tYXJzaGFsKGluIHBpZmFjZS5Vbm1hcnNoYWxJbnB1dCkgKHBpZmFjZS5Vbm1hcnNoYWxPdXRwdXQsIGVycm9yKSB7CitmdW5jIChtaSAqTWVzc2FnZUluZm8pIHVubWFyc2hhbChpbiBwcm90b2lmYWNlLlVubWFyc2hhbElucHV0KSAocHJvdG9pZmFjZS5Vbm1hcnNoYWxPdXRwdXQsIGVycm9yKSB7CiAJdmFyIHAgcG9pbnRlcgogCWlmIG1zLCBvayA6PSBpbi5NZXNzYWdlLigqbWVzc2FnZVN0YXRlKTsgb2sgewogCQlwID0gbXMucG9pbnRlcigpCkBAIC02MiwxMiArNjYsMTMgQEAKIAlvdXQsIGVyciA6PSBtaS51bm1hcnNoYWxQb2ludGVyKGluLkJ1ZiwgcCwgMCwgdW5tYXJzaGFsT3B0aW9uc3sKIAkJZmxhZ3M6ICAgIGluLkZsYWdzLAogCQlyZXNvbHZlcjogaW4uUmVzb2x2ZXIsCisJCWRlcHRoOiAgICBpbi5EZXB0aCwKIAl9KQotCXZhciBmbGFncyBwaWZhY2UuVW5tYXJzaGFsT3V0cHV0RmxhZ3MKKwl2YXIgZmxhZ3MgcHJvdG9pZmFjZS5Vbm1hcnNoYWxPdXRwdXRGbGFncwogCWlmIG91dC5pbml0aWFsaXplZCB7Ci0JCWZsYWdzIHw9IHBpZmFjZS5Vbm1hcnNoYWxJbml0aWFsaXplZAorCQlmbGFncyB8PSBwcm90b2lmYWNlLlVubWFyc2hhbEluaXRpYWxpemVkCiAJfQotCXJldHVybiBwaWZhY2UuVW5tYXJzaGFsT3V0cHV0eworCXJldHVybiBwcm90b2lmYWNlLlVubWFyc2hhbE91dHB1dHsKIAkJRmxhZ3M6IGZsYWdzLAogCX0sIGVycgogfQpAQCAtODIsNiArODcsMTAgQEAKIAogZnVuYyAobWkgKk1lc3NhZ2VJbmZvKSB1bm1hcnNoYWxQb2ludGVyKGIgW11ieXRlLCBwIHBvaW50ZXIsIGdyb3VwVGFnIHByb3Rvd2lyZS5OdW1iZXIsIG9wdHMgdW5tYXJzaGFsT3B0aW9ucykgKG91dCB1bm1hcnNoYWxPdXRwdXQsIGVyciBlcnJvcikgewogCW1pLmluaXQoKQorCW9wdHMuZGVwdGgtLQorCWlmIG9wdHMuZGVwdGggPCAwIHsKKwkJcmV0dXJuIG91dCwgZXJyUmVjdXJzaW9uRGVwdGgKKwl9CiAJaWYgZmxhZ3MuUHJvdG9MZWdhY3kgJiYgbWkuaXNNZXNzYWdlU2V0IHsKIAkJcmV0dXJuIHVubWFyc2hhbE1lc3NhZ2VTZXQobWksIGIsIHAsIG9wdHMpCiAJfQpAQCAtMjAyLDcgKzIxMSw3IEBACiAJCXZhciBlcnIgZXJyb3IKIAkJeHQsIGVyciA9IG9wdHMucmVzb2x2ZXIuRmluZEV4dGVuc2lvbkJ5TnVtYmVyKG1pLkRlc2MuRnVsbE5hbWUoKSwgbnVtKQogCQlpZiBlcnIgIT0gbmlsIHsKLQkJCWlmIGVyciA9PSBwcmVnLk5vdEZvdW5kIHsKKwkJCWlmIGVyciA9PSBwcm90b3JlZ2lzdHJ5Lk5vdEZvdW5kIHsKIAkJCQlyZXR1cm4gb3V0LCBlcnJVbmtub3duCiAJCQl9CiAJCQlyZXR1cm4gb3V0LCBlcnJvcnMuTmV3KCIldjogdW5hYmxlIHRvIHJlc29sdmUgZXh0ZW5zaW9uICV2OiAldiIsIG1pLkRlc2MuRnVsbE5hbWUoKSwgbnVtLCBlcnIpCmRpZmYgLS1naXQgYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9lbnVtLmdvIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvZW51bS5nbwppbmRleCA4YzFlYWI0Li41ZjNlZjVhIDEwMDY0NAotLS0gYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9lbnVtLmdvCisrKyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL2VudW0uZ28KQEAgLTcsMTUgKzcsMTUgQEAKIGltcG9ydCAoCiAJInJlZmxlY3QiCiAKLQlwcmVmICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9yZWZsZWN0L3Byb3RvcmVmbGVjdCIKKwkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZmxlY3QiCiApCiAKIHR5cGUgRW51bUluZm8gc3RydWN0IHsKIAlHb1JlZmxlY3RUeXBlIHJlZmxlY3QuVHlwZSAvLyBpbnQzMiBraW5kCi0JRGVzYyAgICAgICAgICBwcmVmLkVudW1EZXNjcmlwdG9yCisJRGVzYyAgICAgICAgICBwcm90b3JlZmxlY3QuRW51bURlc2NyaXB0b3IKIH0KIAotZnVuYyAodCAqRW51bUluZm8pIE5ldyhuIHByZWYuRW51bU51bWJlcikgcHJlZi5FbnVtIHsKLQlyZXR1cm4gcmVmbGVjdC5WYWx1ZU9mKG4pLkNvbnZlcnQodC5Hb1JlZmxlY3RUeXBlKS5JbnRlcmZhY2UoKS4ocHJlZi5FbnVtKQorZnVuYyAodCAqRW51bUluZm8pIE5ldyhuIHByb3RvcmVmbGVjdC5FbnVtTnVtYmVyKSBwcm90b3JlZmxlY3QuRW51bSB7CisJcmV0dXJuIHJlZmxlY3QuVmFsdWVPZihuKS5Db252ZXJ0KHQuR29SZWZsZWN0VHlwZSkuSW50ZXJmYWNlKCkuKHByb3RvcmVmbGVjdC5FbnVtKQogfQotZnVuYyAodCAqRW51bUluZm8pIERlc2NyaXB0b3IoKSBwcmVmLkVudW1EZXNjcmlwdG9yIHsgcmV0dXJuIHQuRGVzYyB9CitmdW5jICh0ICpFbnVtSW5mbykgRGVzY3JpcHRvcigpIHByb3RvcmVmbGVjdC5FbnVtRGVzY3JpcHRvciB7IHJldHVybiB0LkRlc2MgfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvZXh0ZW5zaW9uLmdvIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvZXh0ZW5zaW9uLmdvCmluZGV4IGU5MDRmZDkuLmNiMjViMGIgMTAwNjQ0Ci0tLSBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL2V4dGVuc2lvbi5nbworKysgYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9leHRlbnNpb24uZ28KQEAgLTksOCArOSw4IEBACiAJInN5bmMiCiAJInN5bmMvYXRvbWljIgogCi0JcHJlZiAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZmxlY3QiCi0JcGlmYWNlICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9ydW50aW1lL3Byb3RvaWZhY2UiCisJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgorCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9ydW50aW1lL3Byb3RvaWZhY2UiCiApCiAKIC8vIEV4dGVuc2lvbkluZm8gaW1wbGVtZW50cyBFeHRlbnNpb25UeXBlLgpAQCAtNDUsNyArNDUsNyBAQAogCS8vIHNpbmNlIHRoZSBtZXNzYWdlIG1heSBubyBsb25nZXIgaW1wbGVtZW50IHRoZSBNZXNzYWdlVjEgaW50ZXJmYWNlLgogCS8vCiAJLy8gRGVwcmVjYXRlZDogVXNlIHRoZSBFeHRlbmRlZFR5cGUgbWV0aG9kIGluc3RlYWQuCi0JRXh0ZW5kZWRUeXBlIHBpZmFjZS5NZXNzYWdlVjEKKwlFeHRlbmRlZFR5cGUgcHJvdG9pZmFjZS5NZXNzYWdlVjEKIAogCS8vIEV4dGVuc2lvblR5cGUgaXMgdGhlIHplcm8gdmFsdWUgb2YgdGhlIGV4dGVuc2lvbiB0eXBlLgogCS8vCkBAIC04MywzMSArODMsMzEgQEAKIAlleHRlbnNpb25JbmZvRnVsbEluaXQgICAgICA9IDIKICkKIAotZnVuYyBJbml0RXh0ZW5zaW9uSW5mbyh4aSAqRXh0ZW5zaW9uSW5mbywgeGQgcHJlZi5FeHRlbnNpb25EZXNjcmlwdG9yLCBnb1R5cGUgcmVmbGVjdC5UeXBlKSB7CitmdW5jIEluaXRFeHRlbnNpb25JbmZvKHhpICpFeHRlbnNpb25JbmZvLCB4ZCBwcm90b3JlZmxlY3QuRXh0ZW5zaW9uRGVzY3JpcHRvciwgZ29UeXBlIHJlZmxlY3QuVHlwZSkgewogCXhpLmdvVHlwZSA9IGdvVHlwZQogCXhpLmRlc2MgPSBleHRlbnNpb25UeXBlRGVzY3JpcHRvcnt4ZCwgeGl9CiAJeGkuaW5pdCA9IGV4dGVuc2lvbkluZm9EZXNjSW5pdAogfQogCi1mdW5jICh4aSAqRXh0ZW5zaW9uSW5mbykgTmV3KCkgcHJlZi5WYWx1ZSB7CitmdW5jICh4aSAqRXh0ZW5zaW9uSW5mbykgTmV3KCkgcHJvdG9yZWZsZWN0LlZhbHVlIHsKIAlyZXR1cm4geGkubGF6eUluaXQoKS5OZXcoKQogfQotZnVuYyAoeGkgKkV4dGVuc2lvbkluZm8pIFplcm8oKSBwcmVmLlZhbHVlIHsKK2Z1bmMgKHhpICpFeHRlbnNpb25JbmZvKSBaZXJvKCkgcHJvdG9yZWZsZWN0LlZhbHVlIHsKIAlyZXR1cm4geGkubGF6eUluaXQoKS5aZXJvKCkKIH0KLWZ1bmMgKHhpICpFeHRlbnNpb25JbmZvKSBWYWx1ZU9mKHYgaW50ZXJmYWNle30pIHByZWYuVmFsdWUgeworZnVuYyAoeGkgKkV4dGVuc2lvbkluZm8pIFZhbHVlT2YodiBpbnRlcmZhY2V7fSkgcHJvdG9yZWZsZWN0LlZhbHVlIHsKIAlyZXR1cm4geGkubGF6eUluaXQoKS5QQlZhbHVlT2YocmVmbGVjdC5WYWx1ZU9mKHYpKQogfQotZnVuYyAoeGkgKkV4dGVuc2lvbkluZm8pIEludGVyZmFjZU9mKHYgcHJlZi5WYWx1ZSkgaW50ZXJmYWNle30geworZnVuYyAoeGkgKkV4dGVuc2lvbkluZm8pIEludGVyZmFjZU9mKHYgcHJvdG9yZWZsZWN0LlZhbHVlKSBpbnRlcmZhY2V7fSB7CiAJcmV0dXJuIHhpLmxhenlJbml0KCkuR29WYWx1ZU9mKHYpLkludGVyZmFjZSgpCiB9Ci1mdW5jICh4aSAqRXh0ZW5zaW9uSW5mbykgSXNWYWxpZFZhbHVlKHYgcHJlZi5WYWx1ZSkgYm9vbCB7CitmdW5jICh4aSAqRXh0ZW5zaW9uSW5mbykgSXNWYWxpZFZhbHVlKHYgcHJvdG9yZWZsZWN0LlZhbHVlKSBib29sIHsKIAlyZXR1cm4geGkubGF6eUluaXQoKS5Jc1ZhbGlkUEIodikKIH0KIGZ1bmMgKHhpICpFeHRlbnNpb25JbmZvKSBJc1ZhbGlkSW50ZXJmYWNlKHYgaW50ZXJmYWNle30pIGJvb2wgewogCXJldHVybiB4aS5sYXp5SW5pdCgpLklzVmFsaWRHbyhyZWZsZWN0LlZhbHVlT2YodikpCiB9Ci1mdW5jICh4aSAqRXh0ZW5zaW9uSW5mbykgVHlwZURlc2NyaXB0b3IoKSBwcmVmLkV4dGVuc2lvblR5cGVEZXNjcmlwdG9yIHsKK2Z1bmMgKHhpICpFeHRlbnNpb25JbmZvKSBUeXBlRGVzY3JpcHRvcigpIHByb3RvcmVmbGVjdC5FeHRlbnNpb25UeXBlRGVzY3JpcHRvciB7CiAJaWYgYXRvbWljLkxvYWRVaW50MzIoJnhpLmluaXQpIDwgZXh0ZW5zaW9uSW5mb0Rlc2NJbml0IHsKIAkJeGkubGF6eUluaXRTbG93KCkKIAl9CkBAIC0xNDQsMTMgKzE0NCwxMyBAQAogfQogCiB0eXBlIGV4dGVuc2lvblR5cGVEZXNjcmlwdG9yIHN0cnVjdCB7Ci0JcHJlZi5FeHRlbnNpb25EZXNjcmlwdG9yCisJcHJvdG9yZWZsZWN0LkV4dGVuc2lvbkRlc2NyaXB0b3IKIAl4aSAqRXh0ZW5zaW9uSW5mbwogfQogCi1mdW5jICh4dGQgKmV4dGVuc2lvblR5cGVEZXNjcmlwdG9yKSBUeXBlKCkgcHJlZi5FeHRlbnNpb25UeXBlIHsKK2Z1bmMgKHh0ZCAqZXh0ZW5zaW9uVHlwZURlc2NyaXB0b3IpIFR5cGUoKSBwcm90b3JlZmxlY3QuRXh0ZW5zaW9uVHlwZSB7CiAJcmV0dXJuIHh0ZC54aQogfQotZnVuYyAoeHRkICpleHRlbnNpb25UeXBlRGVzY3JpcHRvcikgRGVzY3JpcHRvcigpIHByZWYuRXh0ZW5zaW9uRGVzY3JpcHRvciB7CitmdW5jICh4dGQgKmV4dGVuc2lvblR5cGVEZXNjcmlwdG9yKSBEZXNjcmlwdG9yKCkgcHJvdG9yZWZsZWN0LkV4dGVuc2lvbkRlc2NyaXB0b3IgewogCXJldHVybiB4dGQuRXh0ZW5zaW9uRGVzY3JpcHRvcgogfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvbGVnYWN5X2VudW0uZ28gYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9sZWdhY3lfZW51bS5nbwppbmRleCBmN2Q3ZmZiLi5jMmE4MDNiIDEwMDY0NAotLS0gYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9sZWdhY3lfZW51bS5nbworKysgYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9sZWdhY3lfZW51bS5nbwpAQCAtMTMsMTMgKzEzLDEyIEBACiAJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ZpbGVkZXNjIgogCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9zdHJzIgogCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9yZWZsZWN0L3Byb3RvcmVmbGVjdCIKLQlwcmVmICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9yZWZsZWN0L3Byb3RvcmVmbGVjdCIKICkKIAogLy8gbGVnYWN5RW51bU5hbWUgcmV0dXJucyB0aGUgbmFtZSBvZiBlbnVtcyB1c2VkIGluIGxlZ2FjeSBjb2RlLgogLy8gSXQgaXMgbmVpdGhlciB0aGUgcHJvdG9idWYgZnVsbCBuYW1lIG5vciB0aGUgcXVhbGlmaWVkIEdvIG5hbWUsCiAvLyBidXQgcmF0aGVyIGFuIG9kZCBoeWJyaWQgb2YgYm90aC4KLWZ1bmMgbGVnYWN5RW51bU5hbWUoZWQgcHJlZi5FbnVtRGVzY3JpcHRvcikgc3RyaW5nIHsKK2Z1bmMgbGVnYWN5RW51bU5hbWUoZWQgcHJvdG9yZWZsZWN0LkVudW1EZXNjcmlwdG9yKSBzdHJpbmcgewogCXZhciBwcm90b1BrZyBzdHJpbmcKIAllbnVtTmFtZSA6PSBzdHJpbmcoZWQuRnVsbE5hbWUoKSkKIAlpZiBmZCA6PSBlZC5QYXJlbnRGaWxlKCk7IGZkICE9IG5pbCB7CkBAIC0zNCw2OCArMzMsNjggQEAKIAogLy8gbGVnYWN5V3JhcEVudW0gd3JhcHMgdiBhcyBhIHByb3RvcmVmbGVjdC5FbnVtLAogLy8gd2hlcmUgdiBtdXN0IGJlIGEgaW50MzIga2luZCBhbmQgbm90IGltcGxlbWVudCB0aGUgdjIgQVBJIGFscmVhZHkuCi1mdW5jIGxlZ2FjeVdyYXBFbnVtKHYgcmVmbGVjdC5WYWx1ZSkgcHJlZi5FbnVtIHsKK2Z1bmMgbGVnYWN5V3JhcEVudW0odiByZWZsZWN0LlZhbHVlKSBwcm90b3JlZmxlY3QuRW51bSB7CiAJZXQgOj0gbGVnYWN5TG9hZEVudW1UeXBlKHYuVHlwZSgpKQotCXJldHVybiBldC5OZXcocHJlZi5FbnVtTnVtYmVyKHYuSW50KCkpKQorCXJldHVybiBldC5OZXcocHJvdG9yZWZsZWN0LkVudW1OdW1iZXIodi5JbnQoKSkpCiB9CiAKIHZhciBsZWdhY3lFbnVtVHlwZUNhY2hlIHN5bmMuTWFwIC8vIG1hcFtyZWZsZWN0LlR5cGVdcHJvdG9yZWZsZWN0LkVudW1UeXBlCiAKIC8vIGxlZ2FjeUxvYWRFbnVtVHlwZSBkeW5hbWljYWxseSBsb2FkcyBhIHByb3RvcmVmbGVjdC5FbnVtVHlwZSBmb3IgdCwKIC8vIHdoZXJlIHQgbXVzdCBiZSBhbiBpbnQzMiBraW5kIGFuZCBub3QgaW1wbGVtZW50IHRoZSB2MiBBUEkgYWxyZWFkeS4KLWZ1bmMgbGVnYWN5TG9hZEVudW1UeXBlKHQgcmVmbGVjdC5UeXBlKSBwcmVmLkVudW1UeXBlIHsKK2Z1bmMgbGVnYWN5TG9hZEVudW1UeXBlKHQgcmVmbGVjdC5UeXBlKSBwcm90b3JlZmxlY3QuRW51bVR5cGUgewogCS8vIEZhc3QtcGF0aDogY2hlY2sgaWYgYSBFbnVtVHlwZSBpcyBjYWNoZWQgZm9yIHRoaXMgY29uY3JldGUgdHlwZS4KIAlpZiBldCwgb2sgOj0gbGVnYWN5RW51bVR5cGVDYWNoZS5Mb2FkKHQpOyBvayB7Ci0JCXJldHVybiBldC4ocHJlZi5FbnVtVHlwZSkKKwkJcmV0dXJuIGV0Lihwcm90b3JlZmxlY3QuRW51bVR5cGUpCiAJfQogCiAJLy8gU2xvdy1wYXRoOiBkZXJpdmUgZW51bSBkZXNjcmlwdG9yIGFuZCBpbml0aWFsaXplIEVudW1UeXBlLgotCXZhciBldCBwcmVmLkVudW1UeXBlCisJdmFyIGV0IHByb3RvcmVmbGVjdC5FbnVtVHlwZQogCWVkIDo9IExlZ2FjeUxvYWRFbnVtRGVzYyh0KQogCWV0ID0gJmxlZ2FjeUVudW1UeXBlewogCQlkZXNjOiAgIGVkLAogCQlnb1R5cGU6IHQsCiAJfQogCWlmIGV0LCBvayA6PSBsZWdhY3lFbnVtVHlwZUNhY2hlLkxvYWRPclN0b3JlKHQsIGV0KTsgb2sgewotCQlyZXR1cm4gZXQuKHByZWYuRW51bVR5cGUpCisJCXJldHVybiBldC4ocHJvdG9yZWZsZWN0LkVudW1UeXBlKQogCX0KIAlyZXR1cm4gZXQKIH0KIAogdHlwZSBsZWdhY3lFbnVtVHlwZSBzdHJ1Y3QgewotCWRlc2MgICBwcmVmLkVudW1EZXNjcmlwdG9yCisJZGVzYyAgIHByb3RvcmVmbGVjdC5FbnVtRGVzY3JpcHRvcgogCWdvVHlwZSByZWZsZWN0LlR5cGUKIAltICAgICAgc3luYy5NYXAgLy8gbWFwW3Byb3RvcmVmbGVjdC5FbnVtTnVtYmVyXXByb3RvLkVudW0KIH0KIAotZnVuYyAodCAqbGVnYWN5RW51bVR5cGUpIE5ldyhuIHByZWYuRW51bU51bWJlcikgcHJlZi5FbnVtIHsKK2Z1bmMgKHQgKmxlZ2FjeUVudW1UeXBlKSBOZXcobiBwcm90b3JlZmxlY3QuRW51bU51bWJlcikgcHJvdG9yZWZsZWN0LkVudW0gewogCWlmIGUsIG9rIDo9IHQubS5Mb2FkKG4pOyBvayB7Ci0JCXJldHVybiBlLihwcmVmLkVudW0pCisJCXJldHVybiBlLihwcm90b3JlZmxlY3QuRW51bSkKIAl9CiAJZSA6PSAmbGVnYWN5RW51bVdyYXBwZXJ7bnVtOiBuLCBwYlR5cDogdCwgZ29UeXA6IHQuZ29UeXBlfQogCXQubS5TdG9yZShuLCBlKQogCXJldHVybiBlCiB9Ci1mdW5jICh0ICpsZWdhY3lFbnVtVHlwZSkgRGVzY3JpcHRvcigpIHByZWYuRW51bURlc2NyaXB0b3IgeworZnVuYyAodCAqbGVnYWN5RW51bVR5cGUpIERlc2NyaXB0b3IoKSBwcm90b3JlZmxlY3QuRW51bURlc2NyaXB0b3IgewogCXJldHVybiB0LmRlc2MKIH0KIAogdHlwZSBsZWdhY3lFbnVtV3JhcHBlciBzdHJ1Y3QgewotCW51bSAgIHByZWYuRW51bU51bWJlcgotCXBiVHlwIHByZWYuRW51bVR5cGUKKwludW0gICBwcm90b3JlZmxlY3QuRW51bU51bWJlcgorCXBiVHlwIHByb3RvcmVmbGVjdC5FbnVtVHlwZQogCWdvVHlwIHJlZmxlY3QuVHlwZQogfQogCi1mdW5jIChlICpsZWdhY3lFbnVtV3JhcHBlcikgRGVzY3JpcHRvcigpIHByZWYuRW51bURlc2NyaXB0b3IgeworZnVuYyAoZSAqbGVnYWN5RW51bVdyYXBwZXIpIERlc2NyaXB0b3IoKSBwcm90b3JlZmxlY3QuRW51bURlc2NyaXB0b3IgewogCXJldHVybiBlLnBiVHlwLkRlc2NyaXB0b3IoKQogfQotZnVuYyAoZSAqbGVnYWN5RW51bVdyYXBwZXIpIFR5cGUoKSBwcmVmLkVudW1UeXBlIHsKK2Z1bmMgKGUgKmxlZ2FjeUVudW1XcmFwcGVyKSBUeXBlKCkgcHJvdG9yZWZsZWN0LkVudW1UeXBlIHsKIAlyZXR1cm4gZS5wYlR5cAogfQotZnVuYyAoZSAqbGVnYWN5RW51bVdyYXBwZXIpIE51bWJlcigpIHByZWYuRW51bU51bWJlciB7CitmdW5jIChlICpsZWdhY3lFbnVtV3JhcHBlcikgTnVtYmVyKCkgcHJvdG9yZWZsZWN0LkVudW1OdW1iZXIgewogCXJldHVybiBlLm51bQogfQotZnVuYyAoZSAqbGVnYWN5RW51bVdyYXBwZXIpIFByb3RvUmVmbGVjdCgpIHByZWYuRW51bSB7CitmdW5jIChlICpsZWdhY3lFbnVtV3JhcHBlcikgUHJvdG9SZWZsZWN0KCkgcHJvdG9yZWZsZWN0LkVudW0gewogCXJldHVybiBlCiB9CiBmdW5jIChlICpsZWdhY3lFbnVtV3JhcHBlcikgcHJvdG9VbndyYXAoKSBpbnRlcmZhY2V7fSB7CkBAIC0xMDUsOCArMTA0LDggQEAKIH0KIAogdmFyICgKLQlfIHByZWYuRW51bSA9ICgqbGVnYWN5RW51bVdyYXBwZXIpKG5pbCkKLQlfIHVud3JhcHBlciA9ICgqbGVnYWN5RW51bVdyYXBwZXIpKG5pbCkKKwlfIHByb3RvcmVmbGVjdC5FbnVtID0gKCpsZWdhY3lFbnVtV3JhcHBlcikobmlsKQorCV8gdW53cmFwcGVyICAgICAgICAgPSAoKmxlZ2FjeUVudW1XcmFwcGVyKShuaWwpCiApCiAKIHZhciBsZWdhY3lFbnVtRGVzY0NhY2hlIHN5bmMuTWFwIC8vIG1hcFtyZWZsZWN0LlR5cGVdcHJvdG9yZWZsZWN0LkVudW1EZXNjcmlwdG9yCkBAIC0xMTUsMTUgKzExNCwxNSBAQAogLy8gd2hpY2ggbXVzdCBiZSBhbiBpbnQzMiBraW5kIGFuZCBub3QgaW1wbGVtZW50IHRoZSB2MiBBUEkgYWxyZWFkeS4KIC8vCiAvLyBUaGlzIGlzIGV4cG9ydGVkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgotZnVuYyBMZWdhY3lMb2FkRW51bURlc2ModCByZWZsZWN0LlR5cGUpIHByZWYuRW51bURlc2NyaXB0b3IgeworZnVuYyBMZWdhY3lMb2FkRW51bURlc2ModCByZWZsZWN0LlR5cGUpIHByb3RvcmVmbGVjdC5FbnVtRGVzY3JpcHRvciB7CiAJLy8gRmFzdC1wYXRoOiBjaGVjayBpZiBhbiBFbnVtRGVzY3JpcHRvciBpcyBjYWNoZWQgZm9yIHRoaXMgY29uY3JldGUgdHlwZS4KIAlpZiBlZCwgb2sgOj0gbGVnYWN5RW51bURlc2NDYWNoZS5Mb2FkKHQpOyBvayB7Ci0JCXJldHVybiBlZC4ocHJlZi5FbnVtRGVzY3JpcHRvcikKKwkJcmV0dXJuIGVkLihwcm90b3JlZmxlY3QuRW51bURlc2NyaXB0b3IpCiAJfQogCiAJLy8gU2xvdy1wYXRoOiBpbml0aWFsaXplIEVudW1EZXNjcmlwdG9yIGZyb20gdGhlIHJhdyBkZXNjcmlwdG9yLgogCWV2IDo9IHJlZmxlY3QuWmVybyh0KS5JbnRlcmZhY2UoKQotCWlmIF8sIG9rIDo9IGV2LihwcmVmLkVudW0pOyBvayB7CisJaWYgXywgb2sgOj0gZXYuKHByb3RvcmVmbGVjdC5FbnVtKTsgb2sgewogCQlwYW5pYyhmbXQuU3ByaW50ZigiJXYgYWxyZWFkeSBpbXBsZW1lbnRzIHByb3RvLkVudW0iLCB0KSkKIAl9CiAJZWRWMSwgb2sgOj0gZXYuKGVudW1WMSkKQEAgLTEzMiw3ICsxMzEsNyBAQAogCX0KIAliLCBpZHhzIDo9IGVkVjEuRW51bURlc2NyaXB0b3IoKQogCi0JdmFyIGVkIHByZWYuRW51bURlc2NyaXB0b3IKKwl2YXIgZWQgcHJvdG9yZWZsZWN0LkVudW1EZXNjcmlwdG9yCiAJaWYgbGVuKGlkeHMpID09IDEgewogCQllZCA9IGxlZ2FjeUxvYWRGaWxlRGVzYyhiKS5FbnVtcygpLkdldChpZHhzWzBdKQogCX0gZWxzZSB7CkBAIC0xNTgsMTAgKzE1NywxMCBAQAogLy8gV2UgYXJlIHVuYWJsZSB0byB1c2UgdGhlIGdsb2JhbCBlbnVtIHJlZ2lzdHJ5IHNpbmNlIGl0IGlzCiAvLyB1bmZvcnR1bmF0ZWx5IGtleWVkIGJ5IHRoZSBwcm90b2J1ZiBmdWxsIG5hbWUsIHdoaWNoIHdlIGFsc28gZG8gbm90IGtub3cuCiAvLyBUaHVzLCB0aGlzIHByb2R1Y2VzIHNvbWUgYm9ndXMgZW51bSBkZXNjcmlwdG9yIGJhc2VkIG9uIHRoZSBHbyB0eXBlIG5hbWUuCi1mdW5jIGFiZXJyYW50TG9hZEVudW1EZXNjKHQgcmVmbGVjdC5UeXBlKSBwcmVmLkVudW1EZXNjcmlwdG9yIHsKK2Z1bmMgYWJlcnJhbnRMb2FkRW51bURlc2ModCByZWZsZWN0LlR5cGUpIHByb3RvcmVmbGVjdC5FbnVtRGVzY3JpcHRvciB7CiAJLy8gRmFzdC1wYXRoOiBjaGVjayBpZiBhbiBFbnVtRGVzY3JpcHRvciBpcyBjYWNoZWQgZm9yIHRoaXMgY29uY3JldGUgdHlwZS4KIAlpZiBlZCwgb2sgOj0gYWJlcnJhbnRFbnVtRGVzY0NhY2hlLkxvYWQodCk7IG9rIHsKLQkJcmV0dXJuIGVkLihwcmVmLkVudW1EZXNjcmlwdG9yKQorCQlyZXR1cm4gZWQuKHByb3RvcmVmbGVjdC5FbnVtRGVzY3JpcHRvcikKIAl9CiAKIAkvLyBTbG93LXBhdGg6IGNvbnN0cnVjdCBhIGJvZ3VzLCBidXQgdW5pcXVlIEVudW1EZXNjcmlwdG9yLgpAQCAtMTgyLDcgKzE4MSw3IEBACiAJLy8gQW4gZXhoYXVzdGl2ZSBxdWVyeSBpcyBjbGVhcmx5IGltcHJhY3RpY2FsLCBidXQgY2FuIGJlIGJlc3QtZWZmb3J0LgogCiAJaWYgZWQsIG9rIDo9IGFiZXJyYW50RW51bURlc2NDYWNoZS5Mb2FkT3JTdG9yZSh0LCBlZCk7IG9rIHsKLQkJcmV0dXJuIGVkLihwcmVmLkVudW1EZXNjcmlwdG9yKQorCQlyZXR1cm4gZWQuKHByb3RvcmVmbGVjdC5FbnVtRGVzY3JpcHRvcikKIAl9CiAJcmV0dXJuIGVkCiB9CkBAIC0xOTIsNyArMTkxLDcgQEAKIC8vIEl0IHNob3VsZCBiZSBzdWZmaWNpZW50bHkgdW5pcXVlIHdpdGhpbiBhIHByb2dyYW0uCiAvLwogLy8gVGhpcyBpcyBleHBvcnRlZCBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KLWZ1bmMgQWJlcnJhbnREZXJpdmVGdWxsTmFtZSh0IHJlZmxlY3QuVHlwZSkgcHJlZi5GdWxsTmFtZSB7CitmdW5jIEFiZXJyYW50RGVyaXZlRnVsbE5hbWUodCByZWZsZWN0LlR5cGUpIHByb3RvcmVmbGVjdC5GdWxsTmFtZSB7CiAJc2FuaXRpemUgOj0gZnVuYyhyIHJ1bmUpIHJ1bmUgewogCQlzd2l0Y2ggewogCQljYXNlIHIgPT0gJy8nOgpAQCAtMjE1LDUgKzIxNCw1IEBACiAJCQlzc1tpXSA9ICJ4IiArIHMKIAkJfQogCX0KLQlyZXR1cm4gcHJlZi5GdWxsTmFtZShzdHJpbmdzLkpvaW4oc3MsICIuIikpCisJcmV0dXJuIHByb3RvcmVmbGVjdC5GdWxsTmFtZShzdHJpbmdzLkpvaW4oc3MsICIuIikpCiB9CmRpZmYgLS1naXQgYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9sZWdhY3lfZXhwb3J0LmdvIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvbGVnYWN5X2V4cG9ydC5nbwppbmRleCBlM2ZiMGI1Li45YjY0YWQ1IDEwMDY0NAotLS0gYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9sZWdhY3lfZXhwb3J0LmdvCisrKyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL2xlZ2FjeV9leHBvcnQuZ28KQEAgLTEyLDIxICsxMiwyMSBAQAogCSJyZWZsZWN0IgogCiAJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2Vycm9ycyIKLQlwcmVmICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9yZWZsZWN0L3Byb3RvcmVmbGVjdCIKLQlwaWZhY2UgImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3J1bnRpbWUvcHJvdG9pZmFjZSIKKwkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZmxlY3QiCisJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3J1bnRpbWUvcHJvdG9pZmFjZSIKICkKIAogLy8gVGhlc2UgZnVuY3Rpb25zIGV4aXN0IHRvIHN1cHBvcnQgZXhwb3J0ZWQgQVBJcyBpbiBnZW5lcmF0ZWQgcHJvdG9idWZzLgogLy8gV2hpbGUgdGhlc2UgYXJlIGRlcHJlY2F0ZWQsIHRoZXkgY2Fubm90IGJlIHJlbW92ZWQgZm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucy4KIAogLy8gTGVnYWN5RW51bU5hbWUgcmV0dXJucyB0aGUgbmFtZSBvZiBlbnVtcyB1c2VkIGluIGxlZ2FjeSBjb2RlLgotZnVuYyAoRXhwb3J0KSBMZWdhY3lFbnVtTmFtZShlZCBwcmVmLkVudW1EZXNjcmlwdG9yKSBzdHJpbmcgeworZnVuYyAoRXhwb3J0KSBMZWdhY3lFbnVtTmFtZShlZCBwcm90b3JlZmxlY3QuRW51bURlc2NyaXB0b3IpIHN0cmluZyB7CiAJcmV0dXJuIGxlZ2FjeUVudW1OYW1lKGVkKQogfQogCiAvLyBMZWdhY3lNZXNzYWdlVHlwZU9mIHJldHVybnMgdGhlIHByb3RvcmVmbGVjdC5NZXNzYWdlVHlwZSBmb3IgbSwKIC8vIHdpdGggbmFtZSB1c2VkIGFzIHRoZSBtZXNzYWdlIG5hbWUgaWYgbmVjZXNzYXJ5LgotZnVuYyAoRXhwb3J0KSBMZWdhY3lNZXNzYWdlVHlwZU9mKG0gcGlmYWNlLk1lc3NhZ2VWMSwgbmFtZSBwcmVmLkZ1bGxOYW1lKSBwcmVmLk1lc3NhZ2VUeXBlIHsKK2Z1bmMgKEV4cG9ydCkgTGVnYWN5TWVzc2FnZVR5cGVPZihtIHByb3RvaWZhY2UuTWVzc2FnZVYxLCBuYW1lIHByb3RvcmVmbGVjdC5GdWxsTmFtZSkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2VUeXBlIHsKIAlpZiBtdiA6PSAoRXhwb3J0e30pLnByb3RvTWVzc2FnZVYyT2YobSk7IG12ICE9IG5pbCB7CiAJCXJldHVybiBtdi5Qcm90b1JlZmxlY3QoKS5UeXBlKCkKIAl9CkBAIC0zNiw5ICszNiw5IEBACiAvLyBVbm1hcnNoYWxKU09ORW51bSB1bm1hcnNoYWxzIGFuIGVudW0gZnJvbSBhIEpTT04tZW5jb2RlZCBpbnB1dC4KIC8vIFRoZSBpbnB1dCBjYW4gZWl0aGVyIGJlIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZW51bSB2YWx1ZSBieSBuYW1lLAogLy8gb3IgYSBudW1iZXIgcmVwcmVzZW50aW5nIHRoZSBlbnVtIG51bWJlciBpdHNlbGYuCi1mdW5jIChFeHBvcnQpIFVubWFyc2hhbEpTT05FbnVtKGVkIHByZWYuRW51bURlc2NyaXB0b3IsIGIgW11ieXRlKSAocHJlZi5FbnVtTnVtYmVyLCBlcnJvcikgeworZnVuYyAoRXhwb3J0KSBVbm1hcnNoYWxKU09ORW51bShlZCBwcm90b3JlZmxlY3QuRW51bURlc2NyaXB0b3IsIGIgW11ieXRlKSAocHJvdG9yZWZsZWN0LkVudW1OdW1iZXIsIGVycm9yKSB7CiAJaWYgYlswXSA9PSAnIicgewotCQl2YXIgbmFtZSBwcmVmLk5hbWUKKwkJdmFyIG5hbWUgcHJvdG9yZWZsZWN0Lk5hbWUKIAkJaWYgZXJyIDo9IGpzb24uVW5tYXJzaGFsKGIsICZuYW1lKTsgZXJyICE9IG5pbCB7CiAJCQlyZXR1cm4gMCwgZXJyb3JzLk5ldygiaW52YWxpZCBpbnB1dCBmb3IgZW51bSAldjogJXMiLCBlZC5GdWxsTmFtZSgpLCBiKQogCQl9CkBAIC00OCw3ICs0OCw3IEBACiAJCX0KIAkJcmV0dXJuIGV2Lk51bWJlcigpLCBuaWwKIAl9IGVsc2UgewotCQl2YXIgbnVtIHByZWYuRW51bU51bWJlcgorCQl2YXIgbnVtIHByb3RvcmVmbGVjdC5FbnVtTnVtYmVyCiAJCWlmIGVyciA6PSBqc29uLlVubWFyc2hhbChiLCAmbnVtKTsgZXJyICE9IG5pbCB7CiAJCQlyZXR1cm4gMCwgZXJyb3JzLk5ldygiaW52YWxpZCBpbnB1dCBmb3IgZW51bSAldjogJXMiLCBlZC5GdWxsTmFtZSgpLCBiKQogCQl9CkBAIC04MSw4ICs4MSw4IEBACiAJCQlibG9ja0hlYWRlclswXSA9IDB4MDEgLy8gZmluYWwgYml0IHBlciBSRkMgMTk1MSwgc2VjdGlvbiAzLjIuMy4KIAkJCWJsb2NrU2l6ZSA9IGxlbihpbikKIAkJfQotCQliaW5hcnkuTGl0dGxlRW5kaWFuLlB1dFVpbnQxNihibG9ja0hlYWRlclsxOjNdLCB1aW50MTYoYmxvY2tTaXplKV4weDAwMDApCi0JCWJpbmFyeS5MaXR0bGVFbmRpYW4uUHV0VWludDE2KGJsb2NrSGVhZGVyWzM6NV0sIHVpbnQxNihibG9ja1NpemUpXjB4ZmZmZikKKwkJYmluYXJ5LkxpdHRsZUVuZGlhbi5QdXRVaW50MTYoYmxvY2tIZWFkZXJbMTozXSwgdWludDE2KGJsb2NrU2l6ZSkpCisJCWJpbmFyeS5MaXR0bGVFbmRpYW4uUHV0VWludDE2KGJsb2NrSGVhZGVyWzM6NV0sIF51aW50MTYoYmxvY2tTaXplKSkKIAkJb3V0ID0gYXBwZW5kKG91dCwgYmxvY2tIZWFkZXJbOl0uLi4pCiAJCW91dCA9IGFwcGVuZChvdXQsIGluWzpibG9ja1NpemVdLi4uKQogCQlpbiA9IGluW2Jsb2NrU2l6ZTpdCmRpZmYgLS1naXQgYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9sZWdhY3lfZXh0ZW5zaW9uLmdvIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvbGVnYWN5X2V4dGVuc2lvbi5nbwppbmRleCA0OWU3MjMxLi44N2IzMGQwIDEwMDY0NAotLS0gYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9sZWdhY3lfZXh0ZW5zaW9uLmdvCisrKyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL2xlZ2FjeV9leHRlbnNpb24uZ28KQEAgLTEyLDE2ICsxMiwxNiBAQAogCXB0YWcgImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2VuY29kaW5nL3RhZyIKIAkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZmlsZWRlc2MiCiAJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL3ByYWdtYSIKLQlwcmVmICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9yZWZsZWN0L3Byb3RvcmVmbGVjdCIKLQlwcmVnICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9yZWZsZWN0L3Byb3RvcmVnaXN0cnkiCi0JcGlmYWNlICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9ydW50aW1lL3Byb3RvaWZhY2UiCisJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgorCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9yZWZsZWN0L3Byb3RvcmVnaXN0cnkiCisJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3J1bnRpbWUvcHJvdG9pZmFjZSIKICkKIAogZnVuYyAoeGkgKkV4dGVuc2lvbkluZm8pIGluaXRUb0xlZ2FjeSgpIHsKIAl4ZCA6PSB4aS5kZXNjCi0JdmFyIHBhcmVudCBwaWZhY2UuTWVzc2FnZVYxCisJdmFyIHBhcmVudCBwcm90b2lmYWNlLk1lc3NhZ2VWMQogCW1lc3NhZ2VOYW1lIDo9IHhkLkNvbnRhaW5pbmdNZXNzYWdlKCkuRnVsbE5hbWUoKQotCWlmIG10LCBfIDo9IHByZWcuR2xvYmFsVHlwZXMuRmluZE1lc3NhZ2VCeU5hbWUobWVzc2FnZU5hbWUpOyBtdCAhPSBuaWwgeworCWlmIG10LCBfIDo9IHByb3RvcmVnaXN0cnkuR2xvYmFsVHlwZXMuRmluZE1lc3NhZ2VCeU5hbWUobWVzc2FnZU5hbWUpOyBtdCAhPSBuaWwgewogCQkvLyBDcmVhdGUgYSBuZXcgcGFyZW50IG1lc3NhZ2UgYW5kIHVud3JhcCBpdCBpZiBwb3NzaWJsZS4KIAkJbXYgOj0gbXQuTmV3KCkuSW50ZXJmYWNlKCkKIAkJdCA6PSByZWZsZWN0LlR5cGVPZihtdikKQEAgLTMxLDcgKzMxLDcgQEAKIAogCQkvLyBDaGVjayB3aGV0aGVyIHRoZSBtZXNzYWdlIGltcGxlbWVudHMgdGhlIGxlZ2FjeSB2MSBNZXNzYWdlIGludGVyZmFjZS4KIAkJbXogOj0gcmVmbGVjdC5aZXJvKHQpLkludGVyZmFjZSgpCi0JCWlmIG16LCBvayA6PSBtei4ocGlmYWNlLk1lc3NhZ2VWMSk7IG9rIHsKKwkJaWYgbXosIG9rIDo9IG16Lihwcm90b2lmYWNlLk1lc3NhZ2VWMSk7IG9rIHsKIAkJCXBhcmVudCA9IG16CiAJCX0KIAl9CkBAIC00Niw3ICs0Niw3IEBACiAKIAkvLyBSZWNvbnN0cnVjdCB0aGUgbGVnYWN5IGVudW0gZnVsbCBuYW1lLgogCXZhciBlbnVtTmFtZSBzdHJpbmcKLQlpZiB4ZC5LaW5kKCkgPT0gcHJlZi5FbnVtS2luZCB7CisJaWYgeGQuS2luZCgpID09IHByb3RvcmVmbGVjdC5FbnVtS2luZCB7CiAJCWVudW1OYW1lID0gbGVnYWN5RW51bU5hbWUoeGQuRW51bSgpKQogCX0KIApAQCAtNzcsMTYgKzc3LDE2IEBACiAJLy8gZmllbGQgbnVtYmVyIGlzIHNwZWNpZmllZC4gSW4gc3VjaCBhIGNhc2UsIHVzZSBhIHBsYWNlaG9sZGVyLgogCWlmIHhpLkV4dGVuZGVkVHlwZSA9PSBuaWwgfHwgeGkuRXh0ZW5zaW9uVHlwZSA9PSBuaWwgewogCQl4ZCA6PSBwbGFjZWhvbGRlckV4dGVuc2lvbnsKLQkJCW5hbWU6ICAgcHJlZi5GdWxsTmFtZSh4aS5OYW1lKSwKLQkJCW51bWJlcjogcHJlZi5GaWVsZE51bWJlcih4aS5GaWVsZCksCisJCQluYW1lOiAgIHByb3RvcmVmbGVjdC5GdWxsTmFtZSh4aS5OYW1lKSwKKwkJCW51bWJlcjogcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyKHhpLkZpZWxkKSwKIAkJfQogCQl4aS5kZXNjID0gZXh0ZW5zaW9uVHlwZURlc2NyaXB0b3J7eGQsIHhpfQogCQlyZXR1cm4KIAl9CiAKIAkvLyBSZXNvbHZlIGVudW0gb3IgbWVzc2FnZSBkZXBlbmRlbmNpZXMuCi0JdmFyIGVkIHByZWYuRW51bURlc2NyaXB0b3IKLQl2YXIgbWQgcHJlZi5NZXNzYWdlRGVzY3JpcHRvcgorCXZhciBlZCBwcm90b3JlZmxlY3QuRW51bURlc2NyaXB0b3IKKwl2YXIgbWQgcHJvdG9yZWZsZWN0Lk1lc3NhZ2VEZXNjcmlwdG9yCiAJdCA6PSByZWZsZWN0LlR5cGVPZih4aS5FeHRlbnNpb25UeXBlKQogCWlzT3B0aW9uYWwgOj0gdC5LaW5kKCkgPT0gcmVmbGVjdC5QdHIgJiYgdC5FbGVtKCkuS2luZCgpICE9IHJlZmxlY3QuU3RydWN0CiAJaXNSZXBlYXRlZCA6PSB0LktpbmQoKSA9PSByZWZsZWN0LlNsaWNlICYmIHQuRWxlbSgpLktpbmQoKSAhPSByZWZsZWN0LlVpbnQ4CkBAIC05NCwxOCArOTQsMTggQEAKIAkJdCA9IHQuRWxlbSgpCiAJfQogCXN3aXRjaCB2IDo9IHJlZmxlY3QuWmVybyh0KS5JbnRlcmZhY2UoKS4odHlwZSkgewotCWNhc2UgcHJlZi5FbnVtOgorCWNhc2UgcHJvdG9yZWZsZWN0LkVudW06CiAJCWVkID0gdi5EZXNjcmlwdG9yKCkKIAljYXNlIGVudW1WMToKIAkJZWQgPSBMZWdhY3lMb2FkRW51bURlc2ModCkKLQljYXNlIHByZWYuUHJvdG9NZXNzYWdlOgorCWNhc2UgcHJvdG9yZWZsZWN0LlByb3RvTWVzc2FnZToKIAkJbWQgPSB2LlByb3RvUmVmbGVjdCgpLkRlc2NyaXB0b3IoKQogCWNhc2UgbWVzc2FnZVYxOgogCQltZCA9IExlZ2FjeUxvYWRNZXNzYWdlRGVzYyh0KQogCX0KIAogCS8vIERlcml2ZSBiYXNpYyBmaWVsZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBzdHJ1Y3QgdGFnLgotCXZhciBldnMgcHJlZi5FbnVtVmFsdWVEZXNjcmlwdG9ycworCXZhciBldnMgcHJvdG9yZWZsZWN0LkVudW1WYWx1ZURlc2NyaXB0b3JzCiAJaWYgZWQgIT0gbmlsIHsKIAkJZXZzID0gZWQuVmFsdWVzKCkKIAl9CkBAIC0xMTQsOCArMTE0LDggQEAKIAkvLyBDb25zdHJ1Y3QgYSB2MiBFeHRlbnNpb25UeXBlLgogCXhkIDo9ICZmaWxlZGVzYy5FeHRlbnNpb257TDI6IG5ldyhmaWxlZGVzYy5FeHRlbnNpb25MMil9CiAJeGQuTDAuUGFyZW50RmlsZSA9IGZpbGVkZXNjLlN1cnJvZ2F0ZVByb3RvMgotCXhkLkwwLkZ1bGxOYW1lID0gcHJlZi5GdWxsTmFtZSh4aS5OYW1lKQotCXhkLkwxLk51bWJlciA9IHByZWYuRmllbGROdW1iZXIoeGkuRmllbGQpCisJeGQuTDAuRnVsbE5hbWUgPSBwcm90b3JlZmxlY3QuRnVsbE5hbWUoeGkuTmFtZSkKKwl4ZC5MMS5OdW1iZXIgPSBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIoeGkuRmllbGQpCiAJeGQuTDEuQ2FyZGluYWxpdHkgPSBmZC5MMS5DYXJkaW5hbGl0eQogCXhkLkwxLktpbmQgPSBmZC5MMS5LaW5kCiAJeGQuTDIuSXNQYWNrZWQgPSBmZC5MMS5Jc1BhY2tlZApAQCAtMTM4LDM5ICsxMzgsMzkgQEAKIH0KIAogdHlwZSBwbGFjZWhvbGRlckV4dGVuc2lvbiBzdHJ1Y3QgewotCW5hbWUgICBwcmVmLkZ1bGxOYW1lCi0JbnVtYmVyIHByZWYuRmllbGROdW1iZXIKKwluYW1lICAgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lCisJbnVtYmVyIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlcgogfQogCi1mdW5jICh4IHBsYWNlaG9sZGVyRXh0ZW5zaW9uKSBQYXJlbnRGaWxlKCkgcHJlZi5GaWxlRGVzY3JpcHRvciAgICAgICAgICAgIHsgcmV0dXJuIG5pbCB9Ci1mdW5jICh4IHBsYWNlaG9sZGVyRXh0ZW5zaW9uKSBQYXJlbnQoKSBwcmVmLkRlc2NyaXB0b3IgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIG5pbCB9Ci1mdW5jICh4IHBsYWNlaG9sZGVyRXh0ZW5zaW9uKSBJbmRleCgpIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIDAgfQotZnVuYyAoeCBwbGFjZWhvbGRlckV4dGVuc2lvbikgU3ludGF4KCkgcHJlZi5TeW50YXggICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAwIH0KLWZ1bmMgKHggcGxhY2Vob2xkZXJFeHRlbnNpb24pIE5hbWUoKSBwcmVmLk5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4geC5uYW1lLk5hbWUoKSB9Ci1mdW5jICh4IHBsYWNlaG9sZGVyRXh0ZW5zaW9uKSBGdWxsTmFtZSgpIHByZWYuRnVsbE5hbWUgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHgubmFtZSB9Ci1mdW5jICh4IHBsYWNlaG9sZGVyRXh0ZW5zaW9uKSBJc1BsYWNlaG9sZGVyKCkgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRydWUgfQotZnVuYyAoeCBwbGFjZWhvbGRlckV4dGVuc2lvbikgT3B0aW9ucygpIHByZWYuUHJvdG9NZXNzYWdlICAgICAgICAgICAgICAgICB7IHJldHVybiBkZXNjb3B0cy5GaWVsZCB9Ci1mdW5jICh4IHBsYWNlaG9sZGVyRXh0ZW5zaW9uKSBOdW1iZXIoKSBwcmVmLkZpZWxkTnVtYmVyICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHgubnVtYmVyIH0KLWZ1bmMgKHggcGxhY2Vob2xkZXJFeHRlbnNpb24pIENhcmRpbmFsaXR5KCkgcHJlZi5DYXJkaW5hbGl0eSAgICAgICAgICAgICAgeyByZXR1cm4gMCB9Ci1mdW5jICh4IHBsYWNlaG9sZGVyRXh0ZW5zaW9uKSBLaW5kKCkgcHJlZi5LaW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIDAgfQotZnVuYyAoeCBwbGFjZWhvbGRlckV4dGVuc2lvbikgSGFzSlNPTk5hbWUoKSBib29sICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBmYWxzZSB9Ci1mdW5jICh4IHBsYWNlaG9sZGVyRXh0ZW5zaW9uKSBKU09OTmFtZSgpIHN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuICJbIiArIHN0cmluZyh4Lm5hbWUpICsgIl0iIH0KLWZ1bmMgKHggcGxhY2Vob2xkZXJFeHRlbnNpb24pIFRleHROYW1lKCkgc3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gIlsiICsgc3RyaW5nKHgubmFtZSkgKyAiXSIgfQotZnVuYyAoeCBwbGFjZWhvbGRlckV4dGVuc2lvbikgSGFzUHJlc2VuY2UoKSBib29sICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBmYWxzZSB9Ci1mdW5jICh4IHBsYWNlaG9sZGVyRXh0ZW5zaW9uKSBIYXNPcHRpb25hbEtleXdvcmQoKSBib29sICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZhbHNlIH0KLWZ1bmMgKHggcGxhY2Vob2xkZXJFeHRlbnNpb24pIElzRXh0ZW5zaW9uKCkgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gdHJ1ZSB9Ci1mdW5jICh4IHBsYWNlaG9sZGVyRXh0ZW5zaW9uKSBJc1dlYWsoKSBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZhbHNlIH0KLWZ1bmMgKHggcGxhY2Vob2xkZXJFeHRlbnNpb24pIElzUGFja2VkKCkgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gZmFsc2UgfQotZnVuYyAoeCBwbGFjZWhvbGRlckV4dGVuc2lvbikgSXNMaXN0KCkgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBmYWxzZSB9Ci1mdW5jICh4IHBsYWNlaG9sZGVyRXh0ZW5zaW9uKSBJc01hcCgpIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZhbHNlIH0KLWZ1bmMgKHggcGxhY2Vob2xkZXJFeHRlbnNpb24pIE1hcEtleSgpIHByZWYuRmllbGREZXNjcmlwdG9yICAgICAgICAgICAgICAgeyByZXR1cm4gbmlsIH0KLWZ1bmMgKHggcGxhY2Vob2xkZXJFeHRlbnNpb24pIE1hcFZhbHVlKCkgcHJlZi5GaWVsZERlc2NyaXB0b3IgICAgICAgICAgICAgeyByZXR1cm4gbmlsIH0KLWZ1bmMgKHggcGxhY2Vob2xkZXJFeHRlbnNpb24pIEhhc0RlZmF1bHQoKSBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gZmFsc2UgfQotZnVuYyAoeCBwbGFjZWhvbGRlckV4dGVuc2lvbikgRGVmYXVsdCgpIHByZWYuVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBwcmVmLlZhbHVle30gfQotZnVuYyAoeCBwbGFjZWhvbGRlckV4dGVuc2lvbikgRGVmYXVsdEVudW1WYWx1ZSgpIHByZWYuRW51bVZhbHVlRGVzY3JpcHRvciB7IHJldHVybiBuaWwgfQotZnVuYyAoeCBwbGFjZWhvbGRlckV4dGVuc2lvbikgQ29udGFpbmluZ09uZW9mKCkgcHJlZi5PbmVvZkRlc2NyaXB0b3IgICAgICB7IHJldHVybiBuaWwgfQotZnVuYyAoeCBwbGFjZWhvbGRlckV4dGVuc2lvbikgQ29udGFpbmluZ01lc3NhZ2UoKSBwcmVmLk1lc3NhZ2VEZXNjcmlwdG9yICB7IHJldHVybiBuaWwgfQotZnVuYyAoeCBwbGFjZWhvbGRlckV4dGVuc2lvbikgRW51bSgpIHByZWYuRW51bURlc2NyaXB0b3IgICAgICAgICAgICAgICAgICB7IHJldHVybiBuaWwgfQotZnVuYyAoeCBwbGFjZWhvbGRlckV4dGVuc2lvbikgTWVzc2FnZSgpIHByZWYuTWVzc2FnZURlc2NyaXB0b3IgICAgICAgICAgICB7IHJldHVybiBuaWwgfQotZnVuYyAoeCBwbGFjZWhvbGRlckV4dGVuc2lvbikgUHJvdG9UeXBlKHByZWYuRmllbGREZXNjcmlwdG9yKSAgICAgICAgICAgICB7IHJldHVybiB9Ci1mdW5jICh4IHBsYWNlaG9sZGVyRXh0ZW5zaW9uKSBQcm90b0ludGVybmFsKHByYWdtYS5Eb05vdEltcGxlbWVudCkgICAgICAgIHsgcmV0dXJuIH0KK2Z1bmMgKHggcGxhY2Vob2xkZXJFeHRlbnNpb24pIFBhcmVudEZpbGUoKSBwcm90b3JlZmxlY3QuRmlsZURlc2NyaXB0b3IgICAgICAgICAgICB7IHJldHVybiBuaWwgfQorZnVuYyAoeCBwbGFjZWhvbGRlckV4dGVuc2lvbikgUGFyZW50KCkgcHJvdG9yZWZsZWN0LkRlc2NyaXB0b3IgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIG5pbCB9CitmdW5jICh4IHBsYWNlaG9sZGVyRXh0ZW5zaW9uKSBJbmRleCgpIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gMCB9CitmdW5jICh4IHBsYWNlaG9sZGVyRXh0ZW5zaW9uKSBTeW50YXgoKSBwcm90b3JlZmxlY3QuU3ludGF4ICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gMCB9CitmdW5jICh4IHBsYWNlaG9sZGVyRXh0ZW5zaW9uKSBOYW1lKCkgcHJvdG9yZWZsZWN0Lk5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4geC5uYW1lLk5hbWUoKSB9CitmdW5jICh4IHBsYWNlaG9sZGVyRXh0ZW5zaW9uKSBGdWxsTmFtZSgpIHByb3RvcmVmbGVjdC5GdWxsTmFtZSAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4geC5uYW1lIH0KK2Z1bmMgKHggcGxhY2Vob2xkZXJFeHRlbnNpb24pIElzUGxhY2Vob2xkZXIoKSBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiB0cnVlIH0KK2Z1bmMgKHggcGxhY2Vob2xkZXJFeHRlbnNpb24pIE9wdGlvbnMoKSBwcm90b3JlZmxlY3QuUHJvdG9NZXNzYWdlICAgICAgICAgICAgICAgICB7IHJldHVybiBkZXNjb3B0cy5GaWVsZCB9CitmdW5jICh4IHBsYWNlaG9sZGVyRXh0ZW5zaW9uKSBOdW1iZXIoKSBwcm90b3JlZmxlY3QuRmllbGROdW1iZXIgICAgICAgICAgICAgICAgICAgeyByZXR1cm4geC5udW1iZXIgfQorZnVuYyAoeCBwbGFjZWhvbGRlckV4dGVuc2lvbikgQ2FyZGluYWxpdHkoKSBwcm90b3JlZmxlY3QuQ2FyZGluYWxpdHkgICAgICAgICAgICAgIHsgcmV0dXJuIDAgfQorZnVuYyAoeCBwbGFjZWhvbGRlckV4dGVuc2lvbikgS2luZCgpIHByb3RvcmVmbGVjdC5LaW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIDAgfQorZnVuYyAoeCBwbGFjZWhvbGRlckV4dGVuc2lvbikgSGFzSlNPTk5hbWUoKSBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZhbHNlIH0KK2Z1bmMgKHggcGxhY2Vob2xkZXJFeHRlbnNpb24pIEpTT05OYW1lKCkgc3RyaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAiWyIgKyBzdHJpbmcoeC5uYW1lKSArICJdIiB9CitmdW5jICh4IHBsYWNlaG9sZGVyRXh0ZW5zaW9uKSBUZXh0TmFtZSgpIHN0cmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gIlsiICsgc3RyaW5nKHgubmFtZSkgKyAiXSIgfQorZnVuYyAoeCBwbGFjZWhvbGRlckV4dGVuc2lvbikgSGFzUHJlc2VuY2UoKSBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZhbHNlIH0KK2Z1bmMgKHggcGxhY2Vob2xkZXJFeHRlbnNpb24pIEhhc09wdGlvbmFsS2V5d29yZCgpIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBmYWxzZSB9CitmdW5jICh4IHBsYWNlaG9sZGVyRXh0ZW5zaW9uKSBJc0V4dGVuc2lvbigpIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gdHJ1ZSB9CitmdW5jICh4IHBsYWNlaG9sZGVyRXh0ZW5zaW9uKSBJc1dlYWsoKSBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gZmFsc2UgfQorZnVuYyAoeCBwbGFjZWhvbGRlckV4dGVuc2lvbikgSXNQYWNrZWQoKSBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIGZhbHNlIH0KK2Z1bmMgKHggcGxhY2Vob2xkZXJFeHRlbnNpb24pIElzTGlzdCgpIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBmYWxzZSB9CitmdW5jICh4IHBsYWNlaG9sZGVyRXh0ZW5zaW9uKSBJc01hcCgpIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gZmFsc2UgfQorZnVuYyAoeCBwbGFjZWhvbGRlckV4dGVuc2lvbikgTWFwS2V5KCkgcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvciAgICAgICAgICAgICAgIHsgcmV0dXJuIG5pbCB9CitmdW5jICh4IHBsYWNlaG9sZGVyRXh0ZW5zaW9uKSBNYXBWYWx1ZSgpIHByb3RvcmVmbGVjdC5GaWVsZERlc2NyaXB0b3IgICAgICAgICAgICAgeyByZXR1cm4gbmlsIH0KK2Z1bmMgKHggcGxhY2Vob2xkZXJFeHRlbnNpb24pIEhhc0RlZmF1bHQoKSBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBmYWxzZSB9CitmdW5jICh4IHBsYWNlaG9sZGVyRXh0ZW5zaW9uKSBEZWZhdWx0KCkgcHJvdG9yZWZsZWN0LlZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gcHJvdG9yZWZsZWN0LlZhbHVle30gfQorZnVuYyAoeCBwbGFjZWhvbGRlckV4dGVuc2lvbikgRGVmYXVsdEVudW1WYWx1ZSgpIHByb3RvcmVmbGVjdC5FbnVtVmFsdWVEZXNjcmlwdG9yIHsgcmV0dXJuIG5pbCB9CitmdW5jICh4IHBsYWNlaG9sZGVyRXh0ZW5zaW9uKSBDb250YWluaW5nT25lb2YoKSBwcm90b3JlZmxlY3QuT25lb2ZEZXNjcmlwdG9yICAgICAgeyByZXR1cm4gbmlsIH0KK2Z1bmMgKHggcGxhY2Vob2xkZXJFeHRlbnNpb24pIENvbnRhaW5pbmdNZXNzYWdlKCkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2VEZXNjcmlwdG9yICB7IHJldHVybiBuaWwgfQorZnVuYyAoeCBwbGFjZWhvbGRlckV4dGVuc2lvbikgRW51bSgpIHByb3RvcmVmbGVjdC5FbnVtRGVzY3JpcHRvciAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIG5pbCB9CitmdW5jICh4IHBsYWNlaG9sZGVyRXh0ZW5zaW9uKSBNZXNzYWdlKCkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2VEZXNjcmlwdG9yICAgICAgICAgICAgeyByZXR1cm4gbmlsIH0KK2Z1bmMgKHggcGxhY2Vob2xkZXJFeHRlbnNpb24pIFByb3RvVHlwZShwcm90b3JlZmxlY3QuRmllbGREZXNjcmlwdG9yKSAgICAgICAgICAgICB7IHJldHVybiB9CitmdW5jICh4IHBsYWNlaG9sZGVyRXh0ZW5zaW9uKSBQcm90b0ludGVybmFsKHByYWdtYS5Eb05vdEltcGxlbWVudCkgICAgICAgICAgICAgICAgeyByZXR1cm4gfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvbGVnYWN5X21lc3NhZ2UuZ28gYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9sZWdhY3lfbWVzc2FnZS5nbwppbmRleCAwMjlmZWVlLi4yYWIyYzYyIDEwMDY0NAotLS0gYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9sZWdhY3lfbWVzc2FnZS5nbworKysgYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9sZWdhY3lfbWVzc2FnZS5nbwpAQCAtMTYsMTQgKzE2LDEyIEBACiAJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ZpbGVkZXNjIgogCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9zdHJzIgogCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9yZWZsZWN0L3Byb3RvcmVmbGVjdCIKLQlwcmVmICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9yZWZsZWN0L3Byb3RvcmVmbGVjdCIKIAkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcnVudGltZS9wcm90b2lmYWNlIgotCXBpZmFjZSAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcnVudGltZS9wcm90b2lmYWNlIgogKQogCiAvLyBsZWdhY3lXcmFwTWVzc2FnZSB3cmFwcyB2IGFzIGEgcHJvdG9yZWZsZWN0Lk1lc3NhZ2UsCiAvLyB3aGVyZSB2IG11c3QgYmUgYSAqc3RydWN0IGtpbmQgYW5kIG5vdCBpbXBsZW1lbnQgdGhlIHYyIEFQSSBhbHJlYWR5LgotZnVuYyBsZWdhY3lXcmFwTWVzc2FnZSh2IHJlZmxlY3QuVmFsdWUpIHByZWYuTWVzc2FnZSB7CitmdW5jIGxlZ2FjeVdyYXBNZXNzYWdlKHYgcmVmbGVjdC5WYWx1ZSkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2UgewogCXQgOj0gdi5UeXBlKCkKIAlpZiB0LktpbmQoKSAhPSByZWZsZWN0LlB0ciB8fCB0LkVsZW0oKS5LaW5kKCkgIT0gcmVmbGVjdC5TdHJ1Y3QgewogCQlyZXR1cm4gYWJlcnJhbnRNZXNzYWdle3Y6IHZ9CkBAIC0zNSw3ICszMyw3IEBACiAvLyBsZWdhY3lMb2FkTWVzc2FnZVR5cGUgZHluYW1pY2FsbHkgbG9hZHMgYSBwcm90b3JlZmxlY3QuVHlwZSBmb3IgdCwKIC8vIHdoZXJlIHQgbXVzdCBiZSBub3QgaW1wbGVtZW50IHRoZSB2MiBBUEkgYWxyZWFkeS4KIC8vIFRoZSBwcm92aWRlZCBuYW1lIGlzIHVzZWQgaWYgaXQgY2Fubm90IGJlIGRldGVybWluZWQgZnJvbSB0aGUgbWVzc2FnZS4KLWZ1bmMgbGVnYWN5TG9hZE1lc3NhZ2VUeXBlKHQgcmVmbGVjdC5UeXBlLCBuYW1lIHByZWYuRnVsbE5hbWUpIHByb3RvcmVmbGVjdC5NZXNzYWdlVHlwZSB7CitmdW5jIGxlZ2FjeUxvYWRNZXNzYWdlVHlwZSh0IHJlZmxlY3QuVHlwZSwgbmFtZSBwcm90b3JlZmxlY3QuRnVsbE5hbWUpIHByb3RvcmVmbGVjdC5NZXNzYWdlVHlwZSB7CiAJaWYgdC5LaW5kKCkgIT0gcmVmbGVjdC5QdHIgfHwgdC5FbGVtKCkuS2luZCgpICE9IHJlZmxlY3QuU3RydWN0IHsKIAkJcmV0dXJuIGFiZXJyYW50TWVzc2FnZVR5cGV7dH0KIAl9CkBAIC00Nyw3ICs0NSw3IEBACiAvLyBsZWdhY3lMb2FkTWVzc2FnZUluZm8gZHluYW1pY2FsbHkgbG9hZHMgYSAqTWVzc2FnZUluZm8gZm9yIHQsCiAvLyB3aGVyZSB0IG11c3QgYmUgYSAqc3RydWN0IGtpbmQgYW5kIG5vdCBpbXBsZW1lbnQgdGhlIHYyIEFQSSBhbHJlYWR5LgogLy8gVGhlIHByb3ZpZGVkIG5hbWUgaXMgdXNlZCBpZiBpdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBtZXNzYWdlLgotZnVuYyBsZWdhY3lMb2FkTWVzc2FnZUluZm8odCByZWZsZWN0LlR5cGUsIG5hbWUgcHJlZi5GdWxsTmFtZSkgKk1lc3NhZ2VJbmZvIHsKK2Z1bmMgbGVnYWN5TG9hZE1lc3NhZ2VJbmZvKHQgcmVmbGVjdC5UeXBlLCBuYW1lIHByb3RvcmVmbGVjdC5GdWxsTmFtZSkgKk1lc3NhZ2VJbmZvIHsKIAkvLyBGYXN0LXBhdGg6IGNoZWNrIGlmIGEgTWVzc2FnZUluZm8gaXMgY2FjaGVkIGZvciB0aGlzIGNvbmNyZXRlIHR5cGUuCiAJaWYgbXQsIG9rIDo9IGxlZ2FjeU1lc3NhZ2VUeXBlQ2FjaGUuTG9hZCh0KTsgb2sgewogCQlyZXR1cm4gbXQuKCpNZXNzYWdlSW5mbykKQEAgLTY4LDcgKzY2LDcgQEAKIAkJLy8gc3VwcG9ydHMgZGV0ZXJtaW5pc3RpYyBzZXJpYWxpemF0aW9uIG9yIG5vdCwgYnV0IHRoaXMKIAkJLy8gcHJlc2VydmVzIHRoZSB2MSBpbXBsZW1lbnRhdGlvbidzIGJlaGF2aW9yIG9mIGFsd2F5cwogCQkvLyBjYWxsaW5nIE1hcnNoYWwgbWV0aG9kcyB3aGVuIHByZXNlbnQuCi0JCW1pLm1ldGhvZHMuRmxhZ3MgfD0gcGlmYWNlLlN1cHBvcnRNYXJzaGFsRGV0ZXJtaW5pc3RpYworCQltaS5tZXRob2RzLkZsYWdzIHw9IHByb3RvaWZhY2UuU3VwcG9ydE1hcnNoYWxEZXRlcm1pbmlzdGljCiAJfQogCWlmIF8sIGhhc1VubWFyc2hhbCA9IHYuKGxlZ2FjeVVubWFyc2hhbGVyKTsgaGFzVW5tYXJzaGFsIHsKIAkJbWkubWV0aG9kcy5Vbm1hcnNoYWwgPSBsZWdhY3lVbm1hcnNoYWwKQEAgLTg5LDE4ICs4NywxOCBAQAogLy8gd2hpY2ggc2hvdWxkIGJlIGEgKnN0cnVjdCBraW5kIGFuZCBtdXN0IG5vdCBpbXBsZW1lbnQgdGhlIHYyIEFQSSBhbHJlYWR5LgogLy8KIC8vIFRoaXMgaXMgZXhwb3J0ZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMuCi1mdW5jIExlZ2FjeUxvYWRNZXNzYWdlRGVzYyh0IHJlZmxlY3QuVHlwZSkgcHJlZi5NZXNzYWdlRGVzY3JpcHRvciB7CitmdW5jIExlZ2FjeUxvYWRNZXNzYWdlRGVzYyh0IHJlZmxlY3QuVHlwZSkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2VEZXNjcmlwdG9yIHsKIAlyZXR1cm4gbGVnYWN5TG9hZE1lc3NhZ2VEZXNjKHQsICIiKQogfQotZnVuYyBsZWdhY3lMb2FkTWVzc2FnZURlc2ModCByZWZsZWN0LlR5cGUsIG5hbWUgcHJlZi5GdWxsTmFtZSkgcHJlZi5NZXNzYWdlRGVzY3JpcHRvciB7CitmdW5jIGxlZ2FjeUxvYWRNZXNzYWdlRGVzYyh0IHJlZmxlY3QuVHlwZSwgbmFtZSBwcm90b3JlZmxlY3QuRnVsbE5hbWUpIHByb3RvcmVmbGVjdC5NZXNzYWdlRGVzY3JpcHRvciB7CiAJLy8gRmFzdC1wYXRoOiBjaGVjayBpZiBhIE1lc3NhZ2VEZXNjcmlwdG9yIGlzIGNhY2hlZCBmb3IgdGhpcyBjb25jcmV0ZSB0eXBlLgogCWlmIG1pLCBvayA6PSBsZWdhY3lNZXNzYWdlRGVzY0NhY2hlLkxvYWQodCk7IG9rIHsKLQkJcmV0dXJuIG1pLihwcmVmLk1lc3NhZ2VEZXNjcmlwdG9yKQorCQlyZXR1cm4gbWkuKHByb3RvcmVmbGVjdC5NZXNzYWdlRGVzY3JpcHRvcikKIAl9CiAKIAkvLyBTbG93LXBhdGg6IGluaXRpYWxpemUgTWVzc2FnZURlc2NyaXB0b3IgZnJvbSB0aGUgcmF3IGRlc2NyaXB0b3IuCiAJbXYgOj0gcmVmbGVjdC5aZXJvKHQpLkludGVyZmFjZSgpCi0JaWYgXywgb2sgOj0gbXYuKHByZWYuUHJvdG9NZXNzYWdlKTsgb2sgeworCWlmIF8sIG9rIDo9IG12Lihwcm90b3JlZmxlY3QuUHJvdG9NZXNzYWdlKTsgb2sgewogCQlwYW5pYyhmbXQuU3ByaW50ZigiJXYgYWxyZWFkeSBpbXBsZW1lbnRzIHByb3RvLk1lc3NhZ2UiLCB0KSkKIAl9CiAJbWRWMSwgb2sgOj0gbXYuKG1lc3NhZ2VWMSkKQEAgLTE2NCw3ICsxNjIsNyBAQAogLy8KIC8vIFRoaXMgaXMgYSBiZXN0LWVmZm9ydCBkZXJpdmF0aW9uIG9mIHRoZSBtZXNzYWdlIGRlc2NyaXB0b3IgdXNpbmcgdGhlIHByb3RvYnVmCiAvLyB0YWdzIG9uIHRoZSBzdHJ1Y3QgZmllbGRzLgotZnVuYyBhYmVycmFudExvYWRNZXNzYWdlRGVzYyh0IHJlZmxlY3QuVHlwZSwgbmFtZSBwcmVmLkZ1bGxOYW1lKSBwcmVmLk1lc3NhZ2VEZXNjcmlwdG9yIHsKK2Z1bmMgYWJlcnJhbnRMb2FkTWVzc2FnZURlc2ModCByZWZsZWN0LlR5cGUsIG5hbWUgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lKSBwcm90b3JlZmxlY3QuTWVzc2FnZURlc2NyaXB0b3IgewogCWFiZXJyYW50TWVzc2FnZURlc2NMb2NrLkxvY2soKQogCWRlZmVyIGFiZXJyYW50TWVzc2FnZURlc2NMb2NrLlVubG9jaygpCiAJaWYgYWJlcnJhbnRNZXNzYWdlRGVzY0NhY2hlID09IG5pbCB7CkBAIC0xNzIsNyArMTcwLDcgQEAKIAl9CiAJcmV0dXJuIGFiZXJyYW50TG9hZE1lc3NhZ2VEZXNjUmVlbnRyYW50KHQsIG5hbWUpCiB9Ci1mdW5jIGFiZXJyYW50TG9hZE1lc3NhZ2VEZXNjUmVlbnRyYW50KHQgcmVmbGVjdC5UeXBlLCBuYW1lIHByZWYuRnVsbE5hbWUpIHByZWYuTWVzc2FnZURlc2NyaXB0b3IgeworZnVuYyBhYmVycmFudExvYWRNZXNzYWdlRGVzY1JlZW50cmFudCh0IHJlZmxlY3QuVHlwZSwgbmFtZSBwcm90b3JlZmxlY3QuRnVsbE5hbWUpIHByb3RvcmVmbGVjdC5NZXNzYWdlRGVzY3JpcHRvciB7CiAJLy8gRmFzdC1wYXRoOiBjaGVjayBpZiBhbiBNZXNzYWdlRGVzY3JpcHRvciBpcyBjYWNoZWQgZm9yIHRoaXMgY29uY3JldGUgdHlwZS4KIAlpZiBtZCwgb2sgOj0gYWJlcnJhbnRNZXNzYWdlRGVzY0NhY2hlW3RdOyBvayB7CiAJCXJldHVybiBtZApAQCAtMjA4LDEzICsyMDYsMTggQEAKIAogCS8vIE9idGFpbiBhIGxpc3Qgb2Ygb25lb2Ygd3JhcHBlciB0eXBlcy4KIAl2YXIgb25lb2ZXcmFwcGVycyBbXXJlZmxlY3QuVHlwZQotCWZvciBfLCBtZXRob2QgOj0gcmFuZ2UgW11zdHJpbmd7IlhYWF9PbmVvZkZ1bmNzIiwgIlhYWF9PbmVvZldyYXBwZXJzIn0gewotCQlpZiBmbiwgb2sgOj0gdC5NZXRob2RCeU5hbWUobWV0aG9kKTsgb2sgewotCQkJZm9yIF8sIHYgOj0gcmFuZ2UgZm4uRnVuYy5DYWxsKFtdcmVmbGVjdC5WYWx1ZXtyZWZsZWN0Llplcm8oZm4uVHlwZS5JbigwKSl9KSB7Ci0JCQkJaWYgdnMsIG9rIDo9IHYuSW50ZXJmYWNlKCkuKFtdaW50ZXJmYWNle30pOyBvayB7Ci0JCQkJCWZvciBfLCB2IDo9IHJhbmdlIHZzIHsKLQkJCQkJCW9uZW9mV3JhcHBlcnMgPSBhcHBlbmQob25lb2ZXcmFwcGVycywgcmVmbGVjdC5UeXBlT2YodikpCi0JCQkJCX0KKwltZXRob2RzIDo9IG1ha2UoW11yZWZsZWN0Lk1ldGhvZCwgMCwgMikKKwlpZiBtLCBvayA6PSB0Lk1ldGhvZEJ5TmFtZSgiWFhYX09uZW9mRnVuY3MiKTsgb2sgeworCQltZXRob2RzID0gYXBwZW5kKG1ldGhvZHMsIG0pCisJfQorCWlmIG0sIG9rIDo9IHQuTWV0aG9kQnlOYW1lKCJYWFhfT25lb2ZXcmFwcGVycyIpOyBvayB7CisJCW1ldGhvZHMgPSBhcHBlbmQobWV0aG9kcywgbSkKKwl9CisJZm9yIF8sIGZuIDo9IHJhbmdlIG1ldGhvZHMgeworCQlmb3IgXywgdiA6PSByYW5nZSBmbi5GdW5jLkNhbGwoW11yZWZsZWN0LlZhbHVle3JlZmxlY3QuWmVybyhmbi5UeXBlLkluKDApKX0pIHsKKwkJCWlmIHZzLCBvayA6PSB2LkludGVyZmFjZSgpLihbXWludGVyZmFjZXt9KTsgb2sgeworCQkJCWZvciBfLCB2IDo9IHJhbmdlIHZzIHsKKwkJCQkJb25lb2ZXcmFwcGVycyA9IGFwcGVuZChvbmVvZldyYXBwZXJzLCByZWZsZWN0LlR5cGVPZih2KSkKIAkJCQl9CiAJCQl9CiAJCX0KQEAgLTIyNSw5ICsyMjgsOSBAQAogCQl2cyA6PSBmbi5GdW5jLkNhbGwoW11yZWZsZWN0LlZhbHVle3JlZmxlY3QuWmVybyhmbi5UeXBlLkluKDApKX0pWzBdCiAJCWZvciBpIDo9IDA7IGkgPCB2cy5MZW4oKTsgaSsrIHsKIAkJCXYgOj0gdnMuSW5kZXgoaSkKLQkJCW1kLkwyLkV4dGVuc2lvblJhbmdlcy5MaXN0ID0gYXBwZW5kKG1kLkwyLkV4dGVuc2lvblJhbmdlcy5MaXN0LCBbMl1wcmVmLkZpZWxkTnVtYmVyewotCQkJCXByZWYuRmllbGROdW1iZXIodi5GaWVsZEJ5TmFtZSgiU3RhcnQiKS5JbnQoKSksCi0JCQkJcHJlZi5GaWVsZE51bWJlcih2LkZpZWxkQnlOYW1lKCJFbmQiKS5JbnQoKSArIDEpLAorCQkJbWQuTDIuRXh0ZW5zaW9uUmFuZ2VzLkxpc3QgPSBhcHBlbmQobWQuTDIuRXh0ZW5zaW9uUmFuZ2VzLkxpc3QsIFsyXXByb3RvcmVmbGVjdC5GaWVsZE51bWJlcnsKKwkJCQlwcm90b3JlZmxlY3QuRmllbGROdW1iZXIodi5GaWVsZEJ5TmFtZSgiU3RhcnQiKS5JbnQoKSksCisJCQkJcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyKHYuRmllbGRCeU5hbWUoIkVuZCIpLkludCgpICsgMSksCiAJCQl9KQogCQkJbWQuTDIuRXh0ZW5zaW9uUmFuZ2VPcHRpb25zID0gYXBwZW5kKG1kLkwyLkV4dGVuc2lvblJhbmdlT3B0aW9ucywgbmlsKQogCQl9CkBAIC0yNDUsNyArMjQ4LDcgQEAKIAkJCW4gOj0gbGVuKG1kLkwyLk9uZW9mcy5MaXN0KQogCQkJbWQuTDIuT25lb2ZzLkxpc3QgPSBhcHBlbmQobWQuTDIuT25lb2ZzLkxpc3QsIGZpbGVkZXNjLk9uZW9me30pCiAJCQlvZCA6PSAmbWQuTDIuT25lb2ZzLkxpc3Rbbl0KLQkJCW9kLkwwLkZ1bGxOYW1lID0gbWQuRnVsbE5hbWUoKS5BcHBlbmQocHJlZi5OYW1lKHRhZykpCisJCQlvZC5MMC5GdWxsTmFtZSA9IG1kLkZ1bGxOYW1lKCkuQXBwZW5kKHByb3RvcmVmbGVjdC5OYW1lKHRhZykpCiAJCQlvZC5MMC5QYXJlbnRGaWxlID0gbWQuTDAuUGFyZW50RmlsZQogCQkJb2QuTDAuUGFyZW50ID0gbWQKIAkJCW9kLkwwLkluZGV4ID0gbgpAQCAtMjY3LDE0ICsyNzAsMTQgQEAKIAlyZXR1cm4gbWQKIH0KIAotZnVuYyBhYmVycmFudERlcml2ZU1lc3NhZ2VOYW1lKHQgcmVmbGVjdC5UeXBlLCBuYW1lIHByZWYuRnVsbE5hbWUpIHByZWYuRnVsbE5hbWUgeworZnVuYyBhYmVycmFudERlcml2ZU1lc3NhZ2VOYW1lKHQgcmVmbGVjdC5UeXBlLCBuYW1lIHByb3RvcmVmbGVjdC5GdWxsTmFtZSkgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lIHsKIAlpZiBuYW1lLklzVmFsaWQoKSB7CiAJCXJldHVybiBuYW1lCiAJfQogCWZ1bmMoKSB7CiAJCWRlZmVyIGZ1bmMoKSB7IHJlY292ZXIoKSB9KCkgLy8gc3dhbGxvdyBwb3NzaWJsZSBuaWwgcGFuaWNzCiAJCWlmIG0sIG9rIDo9IHJlZmxlY3QuWmVybyh0KS5JbnRlcmZhY2UoKS4oaW50ZXJmYWNleyBYWFhfTWVzc2FnZU5hbWUoKSBzdHJpbmcgfSk7IG9rIHsKLQkJCW5hbWUgPSBwcmVmLkZ1bGxOYW1lKG0uWFhYX01lc3NhZ2VOYW1lKCkpCisJCQluYW1lID0gcHJvdG9yZWZsZWN0LkZ1bGxOYW1lKG0uWFhYX01lc3NhZ2VOYW1lKCkpCiAJCX0KIAl9KCkKIAlpZiBuYW1lLklzVmFsaWQoKSB7CkBAIC0zMDUsNyArMzA4LDcgQEAKIAlmZC5MMC5JbmRleCA9IG4KIAogCWlmIGZkLkwxLklzV2VhayB8fCBmZC5MMS5IYXNQYWNrZWQgewotCQlmZC5MMS5PcHRpb25zID0gZnVuYygpIHByZWYuUHJvdG9NZXNzYWdlIHsKKwkJZmQuTDEuT3B0aW9ucyA9IGZ1bmMoKSBwcm90b3JlZmxlY3QuUHJvdG9NZXNzYWdlIHsKIAkJCW9wdHMgOj0gZGVzY29wdHMuRmllbGQuUHJvdG9SZWZsZWN0KCkuTmV3KCkKIAkJCWlmIGZkLkwxLklzV2VhayB7CiAJCQkJb3B0cy5TZXQob3B0cy5EZXNjcmlwdG9yKCkuRmllbGRzKCkuQnlOYW1lKCJ3ZWFrIiksIHByb3RvcmVmbGVjdC5WYWx1ZU9mQm9vbCh0cnVlKSkKQEAgLTMxOCwxNyArMzIxLDE3IEBACiAJfQogCiAJLy8gUG9wdWxhdGUgRW51bSBhbmQgTWVzc2FnZS4KLQlpZiBmZC5FbnVtKCkgPT0gbmlsICYmIGZkLktpbmQoKSA9PSBwcmVmLkVudW1LaW5kIHsKKwlpZiBmZC5FbnVtKCkgPT0gbmlsICYmIGZkLktpbmQoKSA9PSBwcm90b3JlZmxlY3QuRW51bUtpbmQgewogCQlzd2l0Y2ggdiA6PSByZWZsZWN0Llplcm8odCkuSW50ZXJmYWNlKCkuKHR5cGUpIHsKLQkJY2FzZSBwcmVmLkVudW06CisJCWNhc2UgcHJvdG9yZWZsZWN0LkVudW06CiAJCQlmZC5MMS5FbnVtID0gdi5EZXNjcmlwdG9yKCkKIAkJZGVmYXVsdDoKIAkJCWZkLkwxLkVudW0gPSBMZWdhY3lMb2FkRW51bURlc2ModCkKIAkJfQogCX0KLQlpZiBmZC5NZXNzYWdlKCkgPT0gbmlsICYmIChmZC5LaW5kKCkgPT0gcHJlZi5NZXNzYWdlS2luZCB8fCBmZC5LaW5kKCkgPT0gcHJlZi5Hcm91cEtpbmQpIHsKKwlpZiBmZC5NZXNzYWdlKCkgPT0gbmlsICYmIChmZC5LaW5kKCkgPT0gcHJvdG9yZWZsZWN0Lk1lc3NhZ2VLaW5kIHx8IGZkLktpbmQoKSA9PSBwcm90b3JlZmxlY3QuR3JvdXBLaW5kKSB7CiAJCXN3aXRjaCB2IDo9IHJlZmxlY3QuWmVybyh0KS5JbnRlcmZhY2UoKS4odHlwZSkgewotCQljYXNlIHByZWYuUHJvdG9NZXNzYWdlOgorCQljYXNlIHByb3RvcmVmbGVjdC5Qcm90b01lc3NhZ2U6CiAJCQlmZC5MMS5NZXNzYWdlID0gdi5Qcm90b1JlZmxlY3QoKS5EZXNjcmlwdG9yKCkKIAkJY2FzZSBtZXNzYWdlVjE6CiAJCQlmZC5MMS5NZXNzYWdlID0gTGVnYWN5TG9hZE1lc3NhZ2VEZXNjKHQpCkBAIC0zMzcsMTMgKzM0MCwxMyBAQAogCQkJCW4gOj0gbGVuKG1kLkwxLk1lc3NhZ2VzLkxpc3QpCiAJCQkJbWQuTDEuTWVzc2FnZXMuTGlzdCA9IGFwcGVuZChtZC5MMS5NZXNzYWdlcy5MaXN0LCBmaWxlZGVzYy5NZXNzYWdle0wyOiBuZXcoZmlsZWRlc2MuTWVzc2FnZUwyKX0pCiAJCQkJbWQyIDo9ICZtZC5MMS5NZXNzYWdlcy5MaXN0W25dCi0JCQkJbWQyLkwwLkZ1bGxOYW1lID0gbWQuRnVsbE5hbWUoKS5BcHBlbmQocHJlZi5OYW1lKHN0cnMuTWFwRW50cnlOYW1lKHN0cmluZyhmZC5OYW1lKCkpKSkpCisJCQkJbWQyLkwwLkZ1bGxOYW1lID0gbWQuRnVsbE5hbWUoKS5BcHBlbmQocHJvdG9yZWZsZWN0Lk5hbWUoc3Rycy5NYXBFbnRyeU5hbWUoc3RyaW5nKGZkLk5hbWUoKSkpKSkKIAkJCQltZDIuTDAuUGFyZW50RmlsZSA9IG1kLkwwLlBhcmVudEZpbGUKIAkJCQltZDIuTDAuUGFyZW50ID0gbWQKIAkJCQltZDIuTDAuSW5kZXggPSBuCiAKIAkJCQltZDIuTDEuSXNNYXBFbnRyeSA9IHRydWUKLQkJCQltZDIuTDIuT3B0aW9ucyA9IGZ1bmMoKSBwcmVmLlByb3RvTWVzc2FnZSB7CisJCQkJbWQyLkwyLk9wdGlvbnMgPSBmdW5jKCkgcHJvdG9yZWZsZWN0LlByb3RvTWVzc2FnZSB7CiAJCQkJCW9wdHMgOj0gZGVzY29wdHMuTWVzc2FnZS5Qcm90b1JlZmxlY3QoKS5OZXcoKQogCQkJCQlvcHRzLlNldChvcHRzLkRlc2NyaXB0b3IoKS5GaWVsZHMoKS5CeU5hbWUoIm1hcF9lbnRyeSIpLCBwcm90b3JlZmxlY3QuVmFsdWVPZkJvb2wodHJ1ZSkpCiAJCQkJCXJldHVybiBvcHRzLkludGVyZmFjZSgpCkBAIC0zNjQsOCArMzY3LDggQEAKIAlwcm90b3JlZmxlY3QuRW51bVZhbHVlRGVzY3JpcHRvcnMKIH0KIAotZnVuYyAocGxhY2Vob2xkZXJFbnVtVmFsdWVzKSBCeU51bWJlcihuIHByZWYuRW51bU51bWJlcikgcHJlZi5FbnVtVmFsdWVEZXNjcmlwdG9yIHsKLQlyZXR1cm4gZmlsZWRlc2MuUGxhY2Vob2xkZXJFbnVtVmFsdWUocHJlZi5GdWxsTmFtZShmbXQuU3ByaW50ZigiVU5LTk9XTl8lZCIsIG4pKSkKK2Z1bmMgKHBsYWNlaG9sZGVyRW51bVZhbHVlcykgQnlOdW1iZXIobiBwcm90b3JlZmxlY3QuRW51bU51bWJlcikgcHJvdG9yZWZsZWN0LkVudW1WYWx1ZURlc2NyaXB0b3IgeworCXJldHVybiBmaWxlZGVzYy5QbGFjZWhvbGRlckVudW1WYWx1ZShwcm90b3JlZmxlY3QuRnVsbE5hbWUoZm10LlNwcmludGYoIlVOS05PV05fJWQiLCBuKSkpCiB9CiAKIC8vIGxlZ2FjeU1hcnNoYWxlciBpcyB0aGUgcHJvdG8uTWFyc2hhbGVyIGludGVyZmFjZSBzdXBlcnNlZGVkIGJ5IHByb3RvaWZhY2UuTWV0aG9kZXIuCkBAIC0zODMsNyArMzg2LDcgQEAKIAlNZXJnZShwcm90b2lmYWNlLk1lc3NhZ2VWMSkKIH0KIAotdmFyIGFiZXJyYW50UHJvdG9NZXRob2RzID0gJnBpZmFjZS5NZXRob2RzewordmFyIGFiZXJyYW50UHJvdG9NZXRob2RzID0gJnByb3RvaWZhY2UuTWV0aG9kc3sKIAlNYXJzaGFsOiAgIGxlZ2FjeU1hcnNoYWwsCiAJVW5tYXJzaGFsOiBsZWdhY3lVbm1hcnNoYWwsCiAJTWVyZ2U6ICAgICBsZWdhY3lNZXJnZSwKQEAgLTM5Miw0MCArMzk1LDQwIEBACiAJLy8gc3VwcG9ydHMgZGV0ZXJtaW5pc3RpYyBzZXJpYWxpemF0aW9uIG9yIG5vdCwgYnV0IHRoaXMKIAkvLyBwcmVzZXJ2ZXMgdGhlIHYxIGltcGxlbWVudGF0aW9uJ3MgYmVoYXZpb3Igb2YgYWx3YXlzCiAJLy8gY2FsbGluZyBNYXJzaGFsIG1ldGhvZHMgd2hlbiBwcmVzZW50LgotCUZsYWdzOiBwaWZhY2UuU3VwcG9ydE1hcnNoYWxEZXRlcm1pbmlzdGljLAorCUZsYWdzOiBwcm90b2lmYWNlLlN1cHBvcnRNYXJzaGFsRGV0ZXJtaW5pc3RpYywKIH0KIAotZnVuYyBsZWdhY3lNYXJzaGFsKGluIHBpZmFjZS5NYXJzaGFsSW5wdXQpIChwaWZhY2UuTWFyc2hhbE91dHB1dCwgZXJyb3IpIHsKK2Z1bmMgbGVnYWN5TWFyc2hhbChpbiBwcm90b2lmYWNlLk1hcnNoYWxJbnB1dCkgKHByb3RvaWZhY2UuTWFyc2hhbE91dHB1dCwgZXJyb3IpIHsKIAl2IDo9IGluLk1lc3NhZ2UuKHVud3JhcHBlcikucHJvdG9VbndyYXAoKQogCW1hcnNoYWxlciwgb2sgOj0gdi4obGVnYWN5TWFyc2hhbGVyKQogCWlmICFvayB7Ci0JCXJldHVybiBwaWZhY2UuTWFyc2hhbE91dHB1dHt9LCBlcnJvcnMuTmV3KCIlVCBkb2VzIG5vdCBpbXBsZW1lbnQgTWFyc2hhbCIsIHYpCisJCXJldHVybiBwcm90b2lmYWNlLk1hcnNoYWxPdXRwdXR7fSwgZXJyb3JzLk5ldygiJVQgZG9lcyBub3QgaW1wbGVtZW50IE1hcnNoYWwiLCB2KQogCX0KIAlvdXQsIGVyciA6PSBtYXJzaGFsZXIuTWFyc2hhbCgpCiAJaWYgaW4uQnVmICE9IG5pbCB7CiAJCW91dCA9IGFwcGVuZChpbi5CdWYsIG91dC4uLikKIAl9Ci0JcmV0dXJuIHBpZmFjZS5NYXJzaGFsT3V0cHV0eworCXJldHVybiBwcm90b2lmYWNlLk1hcnNoYWxPdXRwdXR7CiAJCUJ1Zjogb3V0LAogCX0sIGVycgogfQogCi1mdW5jIGxlZ2FjeVVubWFyc2hhbChpbiBwaWZhY2UuVW5tYXJzaGFsSW5wdXQpIChwaWZhY2UuVW5tYXJzaGFsT3V0cHV0LCBlcnJvcikgeworZnVuYyBsZWdhY3lVbm1hcnNoYWwoaW4gcHJvdG9pZmFjZS5Vbm1hcnNoYWxJbnB1dCkgKHByb3RvaWZhY2UuVW5tYXJzaGFsT3V0cHV0LCBlcnJvcikgewogCXYgOj0gaW4uTWVzc2FnZS4odW53cmFwcGVyKS5wcm90b1Vud3JhcCgpCiAJdW5tYXJzaGFsZXIsIG9rIDo9IHYuKGxlZ2FjeVVubWFyc2hhbGVyKQogCWlmICFvayB7Ci0JCXJldHVybiBwaWZhY2UuVW5tYXJzaGFsT3V0cHV0e30sIGVycm9ycy5OZXcoIiVUIGRvZXMgbm90IGltcGxlbWVudCBVbm1hcnNoYWwiLCB2KQorCQlyZXR1cm4gcHJvdG9pZmFjZS5Vbm1hcnNoYWxPdXRwdXR7fSwgZXJyb3JzLk5ldygiJVQgZG9lcyBub3QgaW1wbGVtZW50IFVubWFyc2hhbCIsIHYpCiAJfQotCXJldHVybiBwaWZhY2UuVW5tYXJzaGFsT3V0cHV0e30sIHVubWFyc2hhbGVyLlVubWFyc2hhbChpbi5CdWYpCisJcmV0dXJuIHByb3RvaWZhY2UuVW5tYXJzaGFsT3V0cHV0e30sIHVubWFyc2hhbGVyLlVubWFyc2hhbChpbi5CdWYpCiB9CiAKLWZ1bmMgbGVnYWN5TWVyZ2UoaW4gcGlmYWNlLk1lcmdlSW5wdXQpIHBpZmFjZS5NZXJnZU91dHB1dCB7CitmdW5jIGxlZ2FjeU1lcmdlKGluIHByb3RvaWZhY2UuTWVyZ2VJbnB1dCkgcHJvdG9pZmFjZS5NZXJnZU91dHB1dCB7CiAJLy8gQ2hlY2sgd2hldGhlciB0aGlzIHN1cHBvcnRzIHRoZSBsZWdhY3kgbWVyZ2VyLgogCWRzdHYgOj0gaW4uRGVzdGluYXRpb24uKHVud3JhcHBlcikucHJvdG9VbndyYXAoKQogCW1lcmdlciwgb2sgOj0gZHN0di4obGVnYWN5TWVyZ2VyKQogCWlmIG9rIHsKIAkJbWVyZ2VyLk1lcmdlKEV4cG9ydHt9LlByb3RvTWVzc2FnZVYxT2YoaW4uU291cmNlKSkKLQkJcmV0dXJuIHBpZmFjZS5NZXJnZU91dHB1dHtGbGFnczogcGlmYWNlLk1lcmdlQ29tcGxldGV9CisJCXJldHVybiBwcm90b2lmYWNlLk1lcmdlT3V0cHV0e0ZsYWdzOiBwcm90b2lmYWNlLk1lcmdlQ29tcGxldGV9CiAJfQogCiAJLy8gSWYgbGVnYWN5IG1lcmdlciBpcyB1bmF2YWlsYWJsZSwgaW1wbGVtZW50IG1lcmdlIGluIHRlcm1zIG9mCkBAIC00MzMsMjkgKzQzNiwyOSBAQAogCXNyY3YgOj0gaW4uU291cmNlLih1bndyYXBwZXIpLnByb3RvVW53cmFwKCkKIAltYXJzaGFsZXIsIG9rIDo9IHNyY3YuKGxlZ2FjeU1hcnNoYWxlcikKIAlpZiAhb2sgewotCQlyZXR1cm4gcGlmYWNlLk1lcmdlT3V0cHV0e30KKwkJcmV0dXJuIHByb3RvaWZhY2UuTWVyZ2VPdXRwdXR7fQogCX0KIAlkc3R2ID0gaW4uRGVzdGluYXRpb24uKHVud3JhcHBlcikucHJvdG9VbndyYXAoKQogCXVubWFyc2hhbGVyLCBvayA6PSBkc3R2LihsZWdhY3lVbm1hcnNoYWxlcikKIAlpZiAhb2sgewotCQlyZXR1cm4gcGlmYWNlLk1lcmdlT3V0cHV0e30KKwkJcmV0dXJuIHByb3RvaWZhY2UuTWVyZ2VPdXRwdXR7fQogCX0KIAlpZiAhaW4uU291cmNlLklzVmFsaWQoKSB7CiAJCS8vIExlZ2FjeSBNYXJzaGFsIG1ldGhvZHMgbWF5IG5vdCBmdW5jdGlvbiBvbiBuaWwgbWVzc2FnZXMuCiAJCS8vIENoZWNrIGZvciBhIHR5cGVkIG5pbCBzb3VyY2Ugb25seSBhZnRlciB3ZSBjb25maXJtIHRoYXQKIAkJLy8gbGVnYWN5IE1hcnNoYWwvVW5tYXJzaGFsIG1ldGhvZHMgYXJlIHByZXNlbnQsIGZvcgogCQkvLyBjb25zaXN0ZW5jeS4KLQkJcmV0dXJuIHBpZmFjZS5NZXJnZU91dHB1dHtGbGFnczogcGlmYWNlLk1lcmdlQ29tcGxldGV9CisJCXJldHVybiBwcm90b2lmYWNlLk1lcmdlT3V0cHV0e0ZsYWdzOiBwcm90b2lmYWNlLk1lcmdlQ29tcGxldGV9CiAJfQogCWIsIGVyciA6PSBtYXJzaGFsZXIuTWFyc2hhbCgpCiAJaWYgZXJyICE9IG5pbCB7Ci0JCXJldHVybiBwaWZhY2UuTWVyZ2VPdXRwdXR7fQorCQlyZXR1cm4gcHJvdG9pZmFjZS5NZXJnZU91dHB1dHt9CiAJfQogCWVyciA9IHVubWFyc2hhbGVyLlVubWFyc2hhbChiKQogCWlmIGVyciAhPSBuaWwgewotCQlyZXR1cm4gcGlmYWNlLk1lcmdlT3V0cHV0e30KKwkJcmV0dXJuIHByb3RvaWZhY2UuTWVyZ2VPdXRwdXR7fQogCX0KLQlyZXR1cm4gcGlmYWNlLk1lcmdlT3V0cHV0e0ZsYWdzOiBwaWZhY2UuTWVyZ2VDb21wbGV0ZX0KKwlyZXR1cm4gcHJvdG9pZmFjZS5NZXJnZU91dHB1dHtGbGFnczogcHJvdG9pZmFjZS5NZXJnZUNvbXBsZXRlfQogfQogCiAvLyBhYmVycmFudE1lc3NhZ2VUeXBlIGltcGxlbWVudHMgTWVzc2FnZVR5cGUgZm9yIGFsbCB0eXBlcyBvdGhlciB0aGFuIHBvaW50ZXItdG8tc3RydWN0LgpAQCAtNDYzLDE5ICs0NjYsMTkgQEAKIAl0IHJlZmxlY3QuVHlwZQogfQogCi1mdW5jIChtdCBhYmVycmFudE1lc3NhZ2VUeXBlKSBOZXcoKSBwcmVmLk1lc3NhZ2UgeworZnVuYyAobXQgYWJlcnJhbnRNZXNzYWdlVHlwZSkgTmV3KCkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2UgewogCWlmIG10LnQuS2luZCgpID09IHJlZmxlY3QuUHRyIHsKIAkJcmV0dXJuIGFiZXJyYW50TWVzc2FnZXtyZWZsZWN0Lk5ldyhtdC50LkVsZW0oKSl9CiAJfQogCXJldHVybiBhYmVycmFudE1lc3NhZ2V7cmVmbGVjdC5aZXJvKG10LnQpfQogfQotZnVuYyAobXQgYWJlcnJhbnRNZXNzYWdlVHlwZSkgWmVybygpIHByZWYuTWVzc2FnZSB7CitmdW5jIChtdCBhYmVycmFudE1lc3NhZ2VUeXBlKSBaZXJvKCkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2UgewogCXJldHVybiBhYmVycmFudE1lc3NhZ2V7cmVmbGVjdC5aZXJvKG10LnQpfQogfQogZnVuYyAobXQgYWJlcnJhbnRNZXNzYWdlVHlwZSkgR29UeXBlKCkgcmVmbGVjdC5UeXBlIHsKIAlyZXR1cm4gbXQudAogfQotZnVuYyAobXQgYWJlcnJhbnRNZXNzYWdlVHlwZSkgRGVzY3JpcHRvcigpIHByZWYuTWVzc2FnZURlc2NyaXB0b3IgeworZnVuYyAobXQgYWJlcnJhbnRNZXNzYWdlVHlwZSkgRGVzY3JpcHRvcigpIHByb3RvcmVmbGVjdC5NZXNzYWdlRGVzY3JpcHRvciB7CiAJcmV0dXJuIExlZ2FjeUxvYWRNZXNzYWdlRGVzYyhtdC50KQogfQogCkBAIC00OTksNTYgKzUwMiw1NiBAQAogCX0KIH0KIAotZnVuYyAobSBhYmVycmFudE1lc3NhZ2UpIFByb3RvUmVmbGVjdCgpIHByZWYuTWVzc2FnZSB7CitmdW5jIChtIGFiZXJyYW50TWVzc2FnZSkgUHJvdG9SZWZsZWN0KCkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2UgewogCXJldHVybiBtCiB9CiAKLWZ1bmMgKG0gYWJlcnJhbnRNZXNzYWdlKSBEZXNjcmlwdG9yKCkgcHJlZi5NZXNzYWdlRGVzY3JpcHRvciB7CitmdW5jIChtIGFiZXJyYW50TWVzc2FnZSkgRGVzY3JpcHRvcigpIHByb3RvcmVmbGVjdC5NZXNzYWdlRGVzY3JpcHRvciB7CiAJcmV0dXJuIExlZ2FjeUxvYWRNZXNzYWdlRGVzYyhtLnYuVHlwZSgpKQogfQotZnVuYyAobSBhYmVycmFudE1lc3NhZ2UpIFR5cGUoKSBwcmVmLk1lc3NhZ2VUeXBlIHsKK2Z1bmMgKG0gYWJlcnJhbnRNZXNzYWdlKSBUeXBlKCkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2VUeXBlIHsKIAlyZXR1cm4gYWJlcnJhbnRNZXNzYWdlVHlwZXttLnYuVHlwZSgpfQogfQotZnVuYyAobSBhYmVycmFudE1lc3NhZ2UpIE5ldygpIHByZWYuTWVzc2FnZSB7CitmdW5jIChtIGFiZXJyYW50TWVzc2FnZSkgTmV3KCkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2UgewogCWlmIG0udi5UeXBlKCkuS2luZCgpID09IHJlZmxlY3QuUHRyIHsKIAkJcmV0dXJuIGFiZXJyYW50TWVzc2FnZXtyZWZsZWN0Lk5ldyhtLnYuVHlwZSgpLkVsZW0oKSl9CiAJfQogCXJldHVybiBhYmVycmFudE1lc3NhZ2V7cmVmbGVjdC5aZXJvKG0udi5UeXBlKCkpfQogfQotZnVuYyAobSBhYmVycmFudE1lc3NhZ2UpIEludGVyZmFjZSgpIHByZWYuUHJvdG9NZXNzYWdlIHsKK2Z1bmMgKG0gYWJlcnJhbnRNZXNzYWdlKSBJbnRlcmZhY2UoKSBwcm90b3JlZmxlY3QuUHJvdG9NZXNzYWdlIHsKIAlyZXR1cm4gbQogfQotZnVuYyAobSBhYmVycmFudE1lc3NhZ2UpIFJhbmdlKGYgZnVuYyhwcmVmLkZpZWxkRGVzY3JpcHRvciwgcHJlZi5WYWx1ZSkgYm9vbCkgeworZnVuYyAobSBhYmVycmFudE1lc3NhZ2UpIFJhbmdlKGYgZnVuYyhwcm90b3JlZmxlY3QuRmllbGREZXNjcmlwdG9yLCBwcm90b3JlZmxlY3QuVmFsdWUpIGJvb2wpIHsKIAlyZXR1cm4KIH0KLWZ1bmMgKG0gYWJlcnJhbnRNZXNzYWdlKSBIYXMocHJlZi5GaWVsZERlc2NyaXB0b3IpIGJvb2wgeworZnVuYyAobSBhYmVycmFudE1lc3NhZ2UpIEhhcyhwcm90b3JlZmxlY3QuRmllbGREZXNjcmlwdG9yKSBib29sIHsKIAlyZXR1cm4gZmFsc2UKIH0KLWZ1bmMgKG0gYWJlcnJhbnRNZXNzYWdlKSBDbGVhcihwcmVmLkZpZWxkRGVzY3JpcHRvcikgeworZnVuYyAobSBhYmVycmFudE1lc3NhZ2UpIENsZWFyKHByb3RvcmVmbGVjdC5GaWVsZERlc2NyaXB0b3IpIHsKIAlwYW5pYygiaW52YWxpZCBNZXNzYWdlLkNsZWFyIG9uICIgKyBzdHJpbmcobS5EZXNjcmlwdG9yKCkuRnVsbE5hbWUoKSkpCiB9Ci1mdW5jIChtIGFiZXJyYW50TWVzc2FnZSkgR2V0KGZkIHByZWYuRmllbGREZXNjcmlwdG9yKSBwcmVmLlZhbHVlIHsKK2Z1bmMgKG0gYWJlcnJhbnRNZXNzYWdlKSBHZXQoZmQgcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvcikgcHJvdG9yZWZsZWN0LlZhbHVlIHsKIAlpZiBmZC5EZWZhdWx0KCkuSXNWYWxpZCgpIHsKIAkJcmV0dXJuIGZkLkRlZmF1bHQoKQogCX0KIAlwYW5pYygiaW52YWxpZCBNZXNzYWdlLkdldCBvbiAiICsgc3RyaW5nKG0uRGVzY3JpcHRvcigpLkZ1bGxOYW1lKCkpKQogfQotZnVuYyAobSBhYmVycmFudE1lc3NhZ2UpIFNldChwcmVmLkZpZWxkRGVzY3JpcHRvciwgcHJlZi5WYWx1ZSkgeworZnVuYyAobSBhYmVycmFudE1lc3NhZ2UpIFNldChwcm90b3JlZmxlY3QuRmllbGREZXNjcmlwdG9yLCBwcm90b3JlZmxlY3QuVmFsdWUpIHsKIAlwYW5pYygiaW52YWxpZCBNZXNzYWdlLlNldCBvbiAiICsgc3RyaW5nKG0uRGVzY3JpcHRvcigpLkZ1bGxOYW1lKCkpKQogfQotZnVuYyAobSBhYmVycmFudE1lc3NhZ2UpIE11dGFibGUocHJlZi5GaWVsZERlc2NyaXB0b3IpIHByZWYuVmFsdWUgeworZnVuYyAobSBhYmVycmFudE1lc3NhZ2UpIE11dGFibGUocHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvcikgcHJvdG9yZWZsZWN0LlZhbHVlIHsKIAlwYW5pYygiaW52YWxpZCBNZXNzYWdlLk11dGFibGUgb24gIiArIHN0cmluZyhtLkRlc2NyaXB0b3IoKS5GdWxsTmFtZSgpKSkKIH0KLWZ1bmMgKG0gYWJlcnJhbnRNZXNzYWdlKSBOZXdGaWVsZChwcmVmLkZpZWxkRGVzY3JpcHRvcikgcHJlZi5WYWx1ZSB7CitmdW5jIChtIGFiZXJyYW50TWVzc2FnZSkgTmV3RmllbGQocHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvcikgcHJvdG9yZWZsZWN0LlZhbHVlIHsKIAlwYW5pYygiaW52YWxpZCBNZXNzYWdlLk5ld0ZpZWxkIG9uICIgKyBzdHJpbmcobS5EZXNjcmlwdG9yKCkuRnVsbE5hbWUoKSkpCiB9Ci1mdW5jIChtIGFiZXJyYW50TWVzc2FnZSkgV2hpY2hPbmVvZihwcmVmLk9uZW9mRGVzY3JpcHRvcikgcHJlZi5GaWVsZERlc2NyaXB0b3IgeworZnVuYyAobSBhYmVycmFudE1lc3NhZ2UpIFdoaWNoT25lb2YocHJvdG9yZWZsZWN0Lk9uZW9mRGVzY3JpcHRvcikgcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvciB7CiAJcGFuaWMoImludmFsaWQgTWVzc2FnZS5XaGljaE9uZW9mIGRlc2NyaXB0b3Igb24gIiArIHN0cmluZyhtLkRlc2NyaXB0b3IoKS5GdWxsTmFtZSgpKSkKIH0KLWZ1bmMgKG0gYWJlcnJhbnRNZXNzYWdlKSBHZXRVbmtub3duKCkgcHJlZi5SYXdGaWVsZHMgeworZnVuYyAobSBhYmVycmFudE1lc3NhZ2UpIEdldFVua25vd24oKSBwcm90b3JlZmxlY3QuUmF3RmllbGRzIHsKIAlyZXR1cm4gbmlsCiB9Ci1mdW5jIChtIGFiZXJyYW50TWVzc2FnZSkgU2V0VW5rbm93bihwcmVmLlJhd0ZpZWxkcykgeworZnVuYyAobSBhYmVycmFudE1lc3NhZ2UpIFNldFVua25vd24ocHJvdG9yZWZsZWN0LlJhd0ZpZWxkcykgewogCS8vIFNldFVua25vd24gZGlzY2FyZHMgaXRzIGlucHV0IG9uIG1lc3NhZ2VzIHdoaWNoIGRvbid0IHN1cHBvcnQgdW5rbm93biBmaWVsZCBzdG9yYWdlLgogfQogZnVuYyAobSBhYmVycmFudE1lc3NhZ2UpIElzVmFsaWQoKSBib29sIHsKQEAgLTU1Nyw3ICs1NjAsNyBAQAogCX0KIAlyZXR1cm4gZmFsc2UKIH0KLWZ1bmMgKG0gYWJlcnJhbnRNZXNzYWdlKSBQcm90b01ldGhvZHMoKSAqcGlmYWNlLk1ldGhvZHMgeworZnVuYyAobSBhYmVycmFudE1lc3NhZ2UpIFByb3RvTWV0aG9kcygpICpwcm90b2lmYWNlLk1ldGhvZHMgewogCXJldHVybiBhYmVycmFudFByb3RvTWV0aG9kcwogfQogZnVuYyAobSBhYmVycmFudE1lc3NhZ2UpIHByb3RvVW53cmFwKCkgaW50ZXJmYWNle30gewpkaWZmIC0tZ2l0IGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvbWVyZ2UuZ28gYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9tZXJnZS5nbwppbmRleCBjNjViYmMwLi43ZTY1ZjY0IDEwMDY0NAotLS0gYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9tZXJnZS5nbworKysgYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9tZXJnZS5nbwpAQCAtOSw4ICs5LDggQEAKIAkicmVmbGVjdCIKIAogCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9wcm90byIKLQlwcmVmICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9yZWZsZWN0L3Byb3RvcmVmbGVjdCIKLQlwaWZhY2UgImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3J1bnRpbWUvcHJvdG9pZmFjZSIKKwkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZmxlY3QiCisJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3J1bnRpbWUvcHJvdG9pZmFjZSIKICkKIAogdHlwZSBtZXJnZU9wdGlvbnMgc3RydWN0e30KQEAgLTIwLDE3ICsyMCwxNyBAQAogfQogCiAvLyBtZXJnZSBpcyBwcm90b3JlZmxlY3QuTWV0aG9kcy5NZXJnZS4KLWZ1bmMgKG1pICpNZXNzYWdlSW5mbykgbWVyZ2UoaW4gcGlmYWNlLk1lcmdlSW5wdXQpIHBpZmFjZS5NZXJnZU91dHB1dCB7CitmdW5jIChtaSAqTWVzc2FnZUluZm8pIG1lcmdlKGluIHByb3RvaWZhY2UuTWVyZ2VJbnB1dCkgcHJvdG9pZmFjZS5NZXJnZU91dHB1dCB7CiAJZHAsIG9rIDo9IG1pLmdldFBvaW50ZXIoaW4uRGVzdGluYXRpb24pCiAJaWYgIW9rIHsKLQkJcmV0dXJuIHBpZmFjZS5NZXJnZU91dHB1dHt9CisJCXJldHVybiBwcm90b2lmYWNlLk1lcmdlT3V0cHV0e30KIAl9CiAJc3AsIG9rIDo9IG1pLmdldFBvaW50ZXIoaW4uU291cmNlKQogCWlmICFvayB7Ci0JCXJldHVybiBwaWZhY2UuTWVyZ2VPdXRwdXR7fQorCQlyZXR1cm4gcHJvdG9pZmFjZS5NZXJnZU91dHB1dHt9CiAJfQogCW1pLm1lcmdlUG9pbnRlcihkcCwgc3AsIG1lcmdlT3B0aW9uc3t9KQotCXJldHVybiBwaWZhY2UuTWVyZ2VPdXRwdXR7RmxhZ3M6IHBpZmFjZS5NZXJnZUNvbXBsZXRlfQorCXJldHVybiBwcm90b2lmYWNlLk1lcmdlT3V0cHV0e0ZsYWdzOiBwcm90b2lmYWNlLk1lcmdlQ29tcGxldGV9CiB9CiAKIGZ1bmMgKG1pICpNZXNzYWdlSW5mbykgbWVyZ2VQb2ludGVyKGRzdCwgc3JjIHBvaW50ZXIsIG9wdHMgbWVyZ2VPcHRpb25zKSB7CkBAIC02NCw3ICs2NCw3IEBACiAJCQkJY29udGludWUKIAkJCX0KIAkJCWR4IDo9ICgqZGV4dClbbnVtXQotCQkJdmFyIGR2IHByZWYuVmFsdWUKKwkJCXZhciBkdiBwcm90b3JlZmxlY3QuVmFsdWUKIAkJCWlmIGR4LlR5cGUoKSA9PSBzeC5UeXBlKCkgewogCQkJCWR2ID0gZHguVmFsdWUoKQogCQkJfQpAQCAtODUsMTUgKzg1LDE1IEBACiAJfQogfQogCi1mdW5jIG1lcmdlU2NhbGFyVmFsdWUoZHN0LCBzcmMgcHJlZi5WYWx1ZSwgb3B0cyBtZXJnZU9wdGlvbnMpIHByZWYuVmFsdWUgeworZnVuYyBtZXJnZVNjYWxhclZhbHVlKGRzdCwgc3JjIHByb3RvcmVmbGVjdC5WYWx1ZSwgb3B0cyBtZXJnZU9wdGlvbnMpIHByb3RvcmVmbGVjdC5WYWx1ZSB7CiAJcmV0dXJuIHNyYwogfQogCi1mdW5jIG1lcmdlQnl0ZXNWYWx1ZShkc3QsIHNyYyBwcmVmLlZhbHVlLCBvcHRzIG1lcmdlT3B0aW9ucykgcHJlZi5WYWx1ZSB7Ci0JcmV0dXJuIHByZWYuVmFsdWVPZkJ5dGVzKGFwcGVuZChlbXB0eUJ1Zls6XSwgc3JjLkJ5dGVzKCkuLi4pKQorZnVuYyBtZXJnZUJ5dGVzVmFsdWUoZHN0LCBzcmMgcHJvdG9yZWZsZWN0LlZhbHVlLCBvcHRzIG1lcmdlT3B0aW9ucykgcHJvdG9yZWZsZWN0LlZhbHVlIHsKKwlyZXR1cm4gcHJvdG9yZWZsZWN0LlZhbHVlT2ZCeXRlcyhhcHBlbmQoZW1wdHlCdWZbOl0sIHNyYy5CeXRlcygpLi4uKSkKIH0KIAotZnVuYyBtZXJnZUxpc3RWYWx1ZShkc3QsIHNyYyBwcmVmLlZhbHVlLCBvcHRzIG1lcmdlT3B0aW9ucykgcHJlZi5WYWx1ZSB7CitmdW5jIG1lcmdlTGlzdFZhbHVlKGRzdCwgc3JjIHByb3RvcmVmbGVjdC5WYWx1ZSwgb3B0cyBtZXJnZU9wdGlvbnMpIHByb3RvcmVmbGVjdC5WYWx1ZSB7CiAJZHN0bCA6PSBkc3QuTGlzdCgpCiAJc3JjbCA6PSBzcmMuTGlzdCgpCiAJZm9yIGksIGxsZW4gOj0gMCwgc3JjbC5MZW4oKTsgaSA8IGxsZW47IGkrKyB7CkBAIC0xMDIsMjkgKzEwMiwyOSBAQAogCXJldHVybiBkc3QKIH0KIAotZnVuYyBtZXJnZUJ5dGVzTGlzdFZhbHVlKGRzdCwgc3JjIHByZWYuVmFsdWUsIG9wdHMgbWVyZ2VPcHRpb25zKSBwcmVmLlZhbHVlIHsKK2Z1bmMgbWVyZ2VCeXRlc0xpc3RWYWx1ZShkc3QsIHNyYyBwcm90b3JlZmxlY3QuVmFsdWUsIG9wdHMgbWVyZ2VPcHRpb25zKSBwcm90b3JlZmxlY3QuVmFsdWUgewogCWRzdGwgOj0gZHN0Lkxpc3QoKQogCXNyY2wgOj0gc3JjLkxpc3QoKQogCWZvciBpLCBsbGVuIDo9IDAsIHNyY2wuTGVuKCk7IGkgPCBsbGVuOyBpKysgewogCQlzYiA6PSBzcmNsLkdldChpKS5CeXRlcygpCiAJCWRiIDo9IGFwcGVuZChlbXB0eUJ1Zls6XSwgc2IuLi4pCi0JCWRzdGwuQXBwZW5kKHByZWYuVmFsdWVPZkJ5dGVzKGRiKSkKKwkJZHN0bC5BcHBlbmQocHJvdG9yZWZsZWN0LlZhbHVlT2ZCeXRlcyhkYikpCiAJfQogCXJldHVybiBkc3QKIH0KIAotZnVuYyBtZXJnZU1lc3NhZ2VMaXN0VmFsdWUoZHN0LCBzcmMgcHJlZi5WYWx1ZSwgb3B0cyBtZXJnZU9wdGlvbnMpIHByZWYuVmFsdWUgeworZnVuYyBtZXJnZU1lc3NhZ2VMaXN0VmFsdWUoZHN0LCBzcmMgcHJvdG9yZWZsZWN0LlZhbHVlLCBvcHRzIG1lcmdlT3B0aW9ucykgcHJvdG9yZWZsZWN0LlZhbHVlIHsKIAlkc3RsIDo9IGRzdC5MaXN0KCkKIAlzcmNsIDo9IHNyYy5MaXN0KCkKIAlmb3IgaSwgbGxlbiA6PSAwLCBzcmNsLkxlbigpOyBpIDwgbGxlbjsgaSsrIHsKIAkJc20gOj0gc3JjbC5HZXQoaSkuTWVzc2FnZSgpCiAJCWRtIDo9IHByb3RvLkNsb25lKHNtLkludGVyZmFjZSgpKS5Qcm90b1JlZmxlY3QoKQotCQlkc3RsLkFwcGVuZChwcmVmLlZhbHVlT2ZNZXNzYWdlKGRtKSkKKwkJZHN0bC5BcHBlbmQocHJvdG9yZWZsZWN0LlZhbHVlT2ZNZXNzYWdlKGRtKSkKIAl9CiAJcmV0dXJuIGRzdAogfQogCi1mdW5jIG1lcmdlTWVzc2FnZVZhbHVlKGRzdCwgc3JjIHByZWYuVmFsdWUsIG9wdHMgbWVyZ2VPcHRpb25zKSBwcmVmLlZhbHVlIHsKK2Z1bmMgbWVyZ2VNZXNzYWdlVmFsdWUoZHN0LCBzcmMgcHJvdG9yZWZsZWN0LlZhbHVlLCBvcHRzIG1lcmdlT3B0aW9ucykgcHJvdG9yZWZsZWN0LlZhbHVlIHsKIAlvcHRzLk1lcmdlKGRzdC5NZXNzYWdlKCkuSW50ZXJmYWNlKCksIHNyYy5NZXNzYWdlKCkuSW50ZXJmYWNlKCkpCiAJcmV0dXJuIGRzdAogfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvbWVzc2FnZS5nbyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL21lc3NhZ2UuZ28KaW5kZXggYTEwNGUyOC4uNjI5YmFjZCAxMDA2NDQKLS0tIGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvbWVzc2FnZS5nbworKysgYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9tZXNzYWdlLmdvCkBAIC0xNCw4ICsxNCw3IEBACiAKIAkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZ2VuaWQiCiAJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgotCXByZWYgImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgotCXByZWcgImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWdpc3RyeSIKKwkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZ2lzdHJ5IgogKQogCiAvLyBNZXNzYWdlSW5mbyBwcm92aWRlcyBwcm90b2J1ZiByZWxhdGVkIGZ1bmN0aW9uYWxpdHkgZm9yIGEgZ2l2ZW4gR28gdHlwZQpAQCAtMjksNyArMjgsNyBAQAogCUdvUmVmbGVjdFR5cGUgcmVmbGVjdC5UeXBlIC8vIHBvaW50ZXIgdG8gc3RydWN0CiAKIAkvLyBEZXNjIGlzIHRoZSB1bmRlcmx5aW5nIG1lc3NhZ2UgZGVzY3JpcHRvciB0eXBlIGFuZCBtdXN0IGJlIHBvcHVsYXRlZC4KLQlEZXNjIHByZWYuTWVzc2FnZURlc2NyaXB0b3IKKwlEZXNjIHByb3RvcmVmbGVjdC5NZXNzYWdlRGVzY3JpcHRvcgogCiAJLy8gRXhwb3J0ZXIgbXVzdCBiZSBwcm92aWRlZCBpbiBhIHB1cmVnbyBlbnZpcm9ubWVudCBpbiBvcmRlciB0byBwcm92aWRlCiAJLy8gYWNjZXNzIHRvIHVuZXhwb3J0ZWQgZmllbGRzLgpAQCAtNTQsNyArNTMsNyBAQAogLy8gaXMgZ2VuZXJhdGVkIGJ5IG91ciBpbXBsZW1lbnRhdGlvbiBvZiBwcm90b2MtZ2VuLWdvIChmb3IgdjIgYW5kIG9uKS4KIC8vIElmIGl0IGlzIHVuYWJsZSB0byBvYnRhaW4gYSBNZXNzYWdlSW5mbywgaXQgcmV0dXJucyBuaWwuCiBmdW5jIGdldE1lc3NhZ2VJbmZvKG10IHJlZmxlY3QuVHlwZSkgKk1lc3NhZ2VJbmZvIHsKLQltLCBvayA6PSByZWZsZWN0Llplcm8obXQpLkludGVyZmFjZSgpLihwcmVmLlByb3RvTWVzc2FnZSkKKwltLCBvayA6PSByZWZsZWN0Llplcm8obXQpLkludGVyZmFjZSgpLihwcm90b3JlZmxlY3QuUHJvdG9NZXNzYWdlKQogCWlmICFvayB7CiAJCXJldHVybiBuaWwKIAl9CkBAIC05Nyw3ICs5Niw3IEBACiAvLyBnZXRQb2ludGVyIHJldHVybnMgdGhlIHBvaW50ZXIgZm9yIGEgbWVzc2FnZSwgd2hpY2ggc2hvdWxkIGJlIG9mCiAvLyB0aGUgdHlwZSBvZiB0aGUgTWVzc2FnZUluZm8uIElmIHRoZSBtZXNzYWdlIGlzIG9mIGEgZGlmZmVyZW50IHR5cGUsCiAvLyBpdCByZXR1cm5zIG9rPT1mYWxzZS4KLWZ1bmMgKG1pICpNZXNzYWdlSW5mbykgZ2V0UG9pbnRlcihtIHByZWYuTWVzc2FnZSkgKHAgcG9pbnRlciwgb2sgYm9vbCkgeworZnVuYyAobWkgKk1lc3NhZ2VJbmZvKSBnZXRQb2ludGVyKG0gcHJvdG9yZWZsZWN0Lk1lc3NhZ2UpIChwIHBvaW50ZXIsIG9rIGJvb2wpIHsKIAlzd2l0Y2ggbSA6PSBtLih0eXBlKSB7CiAJY2FzZSAqbWVzc2FnZVN0YXRlOgogCQlyZXR1cm4gbS5wb2ludGVyKCksIG0ubWVzc2FnZUluZm8oKSA9PSBtaQpAQCAtMTM0LDEwICsxMzMsMTAgQEAKIAlleHRlbnNpb25PZmZzZXQgb2Zmc2V0CiAJZXh0ZW5zaW9uVHlwZSAgIHJlZmxlY3QuVHlwZQogCi0JZmllbGRzQnlOdW1iZXIgICAgICAgIG1hcFtwcmVmLkZpZWxkTnVtYmVyXXJlZmxlY3QuU3RydWN0RmllbGQKLQlvbmVvZnNCeU5hbWUgICAgICAgICAgbWFwW3ByZWYuTmFtZV1yZWZsZWN0LlN0cnVjdEZpZWxkCi0Jb25lb2ZXcmFwcGVyc0J5VHlwZSAgIG1hcFtyZWZsZWN0LlR5cGVdcHJlZi5GaWVsZE51bWJlcgotCW9uZW9mV3JhcHBlcnNCeU51bWJlciBtYXBbcHJlZi5GaWVsZE51bWJlcl1yZWZsZWN0LlR5cGUKKwlmaWVsZHNCeU51bWJlciAgICAgICAgbWFwW3Byb3RvcmVmbGVjdC5GaWVsZE51bWJlcl1yZWZsZWN0LlN0cnVjdEZpZWxkCisJb25lb2ZzQnlOYW1lICAgICAgICAgIG1hcFtwcm90b3JlZmxlY3QuTmFtZV1yZWZsZWN0LlN0cnVjdEZpZWxkCisJb25lb2ZXcmFwcGVyc0J5VHlwZSAgIG1hcFtyZWZsZWN0LlR5cGVdcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyCisJb25lb2ZXcmFwcGVyc0J5TnVtYmVyIG1hcFtwcm90b3JlZmxlY3QuRmllbGROdW1iZXJdcmVmbGVjdC5UeXBlCiB9CiAKIGZ1bmMgKG1pICpNZXNzYWdlSW5mbykgbWFrZVN0cnVjdEluZm8odCByZWZsZWN0LlR5cGUpIHN0cnVjdEluZm8gewpAQCAtMTQ3LDEwICsxNDYsMTAgQEAKIAkJdW5rbm93bk9mZnNldDogICBpbnZhbGlkT2Zmc2V0LAogCQlleHRlbnNpb25PZmZzZXQ6IGludmFsaWRPZmZzZXQsCiAKLQkJZmllbGRzQnlOdW1iZXI6ICAgICAgICBtYXBbcHJlZi5GaWVsZE51bWJlcl1yZWZsZWN0LlN0cnVjdEZpZWxke30sCi0JCW9uZW9mc0J5TmFtZTogICAgICAgICAgbWFwW3ByZWYuTmFtZV1yZWZsZWN0LlN0cnVjdEZpZWxke30sCi0JCW9uZW9mV3JhcHBlcnNCeVR5cGU6ICAgbWFwW3JlZmxlY3QuVHlwZV1wcmVmLkZpZWxkTnVtYmVye30sCi0JCW9uZW9mV3JhcHBlcnNCeU51bWJlcjogbWFwW3ByZWYuRmllbGROdW1iZXJdcmVmbGVjdC5UeXBle30sCisJCWZpZWxkc0J5TnVtYmVyOiAgICAgICAgbWFwW3Byb3RvcmVmbGVjdC5GaWVsZE51bWJlcl1yZWZsZWN0LlN0cnVjdEZpZWxke30sCisJCW9uZW9mc0J5TmFtZTogICAgICAgICAgbWFwW3Byb3RvcmVmbGVjdC5OYW1lXXJlZmxlY3QuU3RydWN0RmllbGR7fSwKKwkJb25lb2ZXcmFwcGVyc0J5VHlwZTogICBtYXBbcmVmbGVjdC5UeXBlXXByb3RvcmVmbGVjdC5GaWVsZE51bWJlcnt9LAorCQlvbmVvZldyYXBwZXJzQnlOdW1iZXI6IG1hcFtwcm90b3JlZmxlY3QuRmllbGROdW1iZXJdcmVmbGVjdC5UeXBle30sCiAJfQogCiBmaWVsZExvb3A6CkBAIC0xODAsMTIgKzE3OSwxMiBAQAogCQkJZm9yIF8sIHMgOj0gcmFuZ2Ugc3RyaW5ncy5TcGxpdChmLlRhZy5HZXQoInByb3RvYnVmIiksICIsIikgewogCQkJCWlmIGxlbihzKSA+IDAgJiYgc3RyaW5ncy5UcmltKHMsICIwMTIzNDU2Nzg5IikgPT0gIiIgewogCQkJCQluLCBfIDo9IHN0cmNvbnYuUGFyc2VVaW50KHMsIDEwLCA2NCkKLQkJCQkJc2kuZmllbGRzQnlOdW1iZXJbcHJlZi5GaWVsZE51bWJlcihuKV0gPSBmCisJCQkJCXNpLmZpZWxkc0J5TnVtYmVyW3Byb3RvcmVmbGVjdC5GaWVsZE51bWJlcihuKV0gPSBmCiAJCQkJCWNvbnRpbnVlIGZpZWxkTG9vcAogCQkJCX0KIAkJCX0KIAkJCWlmIHMgOj0gZi5UYWcuR2V0KCJwcm90b2J1Zl9vbmVvZiIpOyBsZW4ocykgPiAwIHsKLQkJCQlzaS5vbmVvZnNCeU5hbWVbcHJlZi5OYW1lKHMpXSA9IGYKKwkJCQlzaS5vbmVvZnNCeU5hbWVbcHJvdG9yZWZsZWN0Lk5hbWUocyldID0gZgogCQkJCWNvbnRpbnVlIGZpZWxkTG9vcAogCQkJfQogCQl9CkBAIC0xOTMsMTIgKzE5MiwxNyBAQAogCiAJLy8gRGVyaXZlIGEgbWFwcGluZyBvZiBvbmVvZiB3cmFwcGVycyB0byBmaWVsZHMuCiAJb25lb2ZXcmFwcGVycyA6PSBtaS5PbmVvZldyYXBwZXJzCi0JZm9yIF8sIG1ldGhvZCA6PSByYW5nZSBbXXN0cmluZ3siWFhYX09uZW9mRnVuY3MiLCAiWFhYX09uZW9mV3JhcHBlcnMifSB7Ci0JCWlmIGZuLCBvayA6PSByZWZsZWN0LlB0clRvKHQpLk1ldGhvZEJ5TmFtZShtZXRob2QpOyBvayB7Ci0JCQlmb3IgXywgdiA6PSByYW5nZSBmbi5GdW5jLkNhbGwoW11yZWZsZWN0LlZhbHVle3JlZmxlY3QuWmVybyhmbi5UeXBlLkluKDApKX0pIHsKLQkJCQlpZiB2cywgb2sgOj0gdi5JbnRlcmZhY2UoKS4oW11pbnRlcmZhY2V7fSk7IG9rIHsKLQkJCQkJb25lb2ZXcmFwcGVycyA9IHZzCi0JCQkJfQorCW1ldGhvZHMgOj0gbWFrZShbXXJlZmxlY3QuTWV0aG9kLCAwLCAyKQorCWlmIG0sIG9rIDo9IHJlZmxlY3QuUHRyVG8odCkuTWV0aG9kQnlOYW1lKCJYWFhfT25lb2ZGdW5jcyIpOyBvayB7CisJCW1ldGhvZHMgPSBhcHBlbmQobWV0aG9kcywgbSkKKwl9CisJaWYgbSwgb2sgOj0gcmVmbGVjdC5QdHJUbyh0KS5NZXRob2RCeU5hbWUoIlhYWF9PbmVvZldyYXBwZXJzIik7IG9rIHsKKwkJbWV0aG9kcyA9IGFwcGVuZChtZXRob2RzLCBtKQorCX0KKwlmb3IgXywgZm4gOj0gcmFuZ2UgbWV0aG9kcyB7CisJCWZvciBfLCB2IDo9IHJhbmdlIGZuLkZ1bmMuQ2FsbChbXXJlZmxlY3QuVmFsdWV7cmVmbGVjdC5aZXJvKGZuLlR5cGUuSW4oMCkpfSkgeworCQkJaWYgdnMsIG9rIDo9IHYuSW50ZXJmYWNlKCkuKFtdaW50ZXJmYWNle30pOyBvayB7CisJCQkJb25lb2ZXcmFwcGVycyA9IHZzCiAJCQl9CiAJCX0KIAl9CkBAIC0yMDgsOCArMjEyLDggQEAKIAkJZm9yIF8sIHMgOj0gcmFuZ2Ugc3RyaW5ncy5TcGxpdChmLlRhZy5HZXQoInByb3RvYnVmIiksICIsIikgewogCQkJaWYgbGVuKHMpID4gMCAmJiBzdHJpbmdzLlRyaW0ocywgIjAxMjM0NTY3ODkiKSA9PSAiIiB7CiAJCQkJbiwgXyA6PSBzdHJjb252LlBhcnNlVWludChzLCAxMCwgNjQpCi0JCQkJc2kub25lb2ZXcmFwcGVyc0J5VHlwZVt0Zl0gPSBwcmVmLkZpZWxkTnVtYmVyKG4pCi0JCQkJc2kub25lb2ZXcmFwcGVyc0J5TnVtYmVyW3ByZWYuRmllbGROdW1iZXIobildID0gdGYKKwkJCQlzaS5vbmVvZldyYXBwZXJzQnlUeXBlW3RmXSA9IHByb3RvcmVmbGVjdC5GaWVsZE51bWJlcihuKQorCQkJCXNpLm9uZW9mV3JhcHBlcnNCeU51bWJlcltwcm90b3JlZmxlY3QuRmllbGROdW1iZXIobildID0gdGYKIAkJCQlicmVhawogCQkJfQogCQl9CkBAIC0yMTksNyArMjIzLDExIEBACiB9CiAKIGZ1bmMgKG1pICpNZXNzYWdlSW5mbykgTmV3KCkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2UgewotCXJldHVybiBtaS5NZXNzYWdlT2YocmVmbGVjdC5OZXcobWkuR29SZWZsZWN0VHlwZS5FbGVtKCkpLkludGVyZmFjZSgpKQorCW0gOj0gcmVmbGVjdC5OZXcobWkuR29SZWZsZWN0VHlwZS5FbGVtKCkpLkludGVyZmFjZSgpCisJaWYgciwgb2sgOj0gbS4ocHJvdG9yZWZsZWN0LlByb3RvTWVzc2FnZSk7IG9rIHsKKwkJcmV0dXJuIHIuUHJvdG9SZWZsZWN0KCkKKwl9CisJcmV0dXJuIG1pLk1lc3NhZ2VPZihtKQogfQogZnVuYyAobWkgKk1lc3NhZ2VJbmZvKSBaZXJvKCkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2UgewogCXJldHVybiBtaS5NZXNzYWdlT2YocmVmbGVjdC5aZXJvKG1pLkdvUmVmbGVjdFR5cGUpLkludGVyZmFjZSgpKQpAQCAtMjM3LDcgKzI0NSw3IEBACiAJZmQgOj0gbWkuRGVzYy5GaWVsZHMoKS5HZXQoaSkKIAlzd2l0Y2ggewogCWNhc2UgZmQuSXNXZWFrKCk6Ci0JCW10LCBfIDo9IHByZWcuR2xvYmFsVHlwZXMuRmluZE1lc3NhZ2VCeU5hbWUoZmQuTWVzc2FnZSgpLkZ1bGxOYW1lKCkpCisJCW10LCBfIDo9IHByb3RvcmVnaXN0cnkuR2xvYmFsVHlwZXMuRmluZE1lc3NhZ2VCeU5hbWUoZmQuTWVzc2FnZSgpLkZ1bGxOYW1lKCkpCiAJCXJldHVybiBtdAogCWNhc2UgZmQuSXNNYXAoKToKIAkJcmV0dXJuIG1hcEVudHJ5VHlwZXtmZC5NZXNzYWdlKCksIG1pLmZpZWxkVHlwZXNbZmQuTnVtYmVyKCldfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvbWVzc2FnZV9yZWZsZWN0LmdvIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvbWVzc2FnZV9yZWZsZWN0LmdvCmluZGV4IDk0ODhiNzIuLmQ5ZWEwMTAgMTAwNjQ0Ci0tLSBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL21lc3NhZ2VfcmVmbGVjdC5nbworKysgYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9tZXNzYWdlX3JlZmxlY3QuZ28KQEAgLTEwLDE3ICsxMCwxNyBAQAogCiAJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2RldHJhbmQiCiAJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL3ByYWdtYSIKLQlwcmVmICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9yZWZsZWN0L3Byb3RvcmVmbGVjdCIKKwkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZmxlY3QiCiApCiAKIHR5cGUgcmVmbGVjdE1lc3NhZ2VJbmZvIHN0cnVjdCB7Ci0JZmllbGRzIG1hcFtwcmVmLkZpZWxkTnVtYmVyXSpmaWVsZEluZm8KLQlvbmVvZnMgbWFwW3ByZWYuTmFtZV0qb25lb2ZJbmZvCisJZmllbGRzIG1hcFtwcm90b3JlZmxlY3QuRmllbGROdW1iZXJdKmZpZWxkSW5mbworCW9uZW9mcyBtYXBbcHJvdG9yZWZsZWN0Lk5hbWVdKm9uZW9mSW5mbwogCiAJLy8gZmllbGRUeXBlcyBjb250YWlucyB0aGUgemVybyB2YWx1ZSBvZiBhbiBlbnVtIG9yIG1lc3NhZ2UgZmllbGQuCiAJLy8gRm9yIGxpc3RzLCBpdCBjb250YWlucyB0aGUgZWxlbWVudCB0eXBlLgogCS8vIEZvciBtYXBzLCBpdCBjb250YWlucyB0aGUgZW50cnkgdmFsdWUgdHlwZS4KLQlmaWVsZFR5cGVzIG1hcFtwcmVmLkZpZWxkTnVtYmVyXWludGVyZmFjZXt9CisJZmllbGRUeXBlcyBtYXBbcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyXWludGVyZmFjZXt9CiAKIAkvLyBkZW5zZUZpZWxkcyBpcyBhIHN1YnNldCBvZiBmaWVsZHMgd2hlcmU6CiAJLy8JMCA8IGZpZWxkRGVzYy5OdW1iZXIoKSA8IGxlbihkZW5zZUZpZWxkcykKQEAgLTMwLDggKzMwLDggQEAKIAkvLyByYW5nZUluZm9zIGlzIGEgbGlzdCBvZiBhbGwgZmllbGRzIChub3QgYmVsb25naW5nIHRvIGEgb25lb2YpIGFuZCBvbmVvZnMuCiAJcmFuZ2VJbmZvcyBbXWludGVyZmFjZXt9IC8vIGVpdGhlciAqZmllbGRJbmZvIG9yICpvbmVvZkluZm8KIAotCWdldFVua25vd24gICBmdW5jKHBvaW50ZXIpIHByZWYuUmF3RmllbGRzCi0Jc2V0VW5rbm93biAgIGZ1bmMocG9pbnRlciwgcHJlZi5SYXdGaWVsZHMpCisJZ2V0VW5rbm93biAgIGZ1bmMocG9pbnRlcikgcHJvdG9yZWZsZWN0LlJhd0ZpZWxkcworCXNldFVua25vd24gICBmdW5jKHBvaW50ZXIsIHByb3RvcmVmbGVjdC5SYXdGaWVsZHMpCiAJZXh0ZW5zaW9uTWFwIGZ1bmMocG9pbnRlcikgKmV4dGVuc2lvbk1hcAogCiAJbmlsTWVzc2FnZSBhdG9taWNOaWxNZXNzYWdlCkBAIC01Miw3ICs1Miw3IEBACiAvLyBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IHRoZSBzdHJ1Y3QgaXMgd2VsbC1mb3JtZWQgYW5kIHBhbmljcyBpZiB0aGVyZSBhcmUKIC8vIGFueSBkaXNjcmVwYW5jaWVzLgogZnVuYyAobWkgKk1lc3NhZ2VJbmZvKSBtYWtlS25vd25GaWVsZHNGdW5jKHNpIHN0cnVjdEluZm8pIHsKLQltaS5maWVsZHMgPSBtYXBbcHJlZi5GaWVsZE51bWJlcl0qZmllbGRJbmZve30KKwltaS5maWVsZHMgPSBtYXBbcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyXSpmaWVsZEluZm97fQogCW1kIDo9IG1pLkRlc2MKIAlmZHMgOj0gbWQuRmllbGRzKCkKIAlmb3IgaSA6PSAwOyBpIDwgZmRzLkxlbigpOyBpKysgewpAQCAtODIsNyArODIsNyBAQAogCQltaS5maWVsZHNbZmQuTnVtYmVyKCldID0gJmZpCiAJfQogCi0JbWkub25lb2ZzID0gbWFwW3ByZWYuTmFtZV0qb25lb2ZJbmZve30KKwltaS5vbmVvZnMgPSBtYXBbcHJvdG9yZWZsZWN0Lk5hbWVdKm9uZW9mSW5mb3t9CiAJZm9yIGkgOj0gMDsgaSA8IG1kLk9uZW9mcygpLkxlbigpOyBpKysgewogCQlvZCA6PSBtZC5PbmVvZnMoKS5HZXQoaSkKIAkJbWkub25lb2ZzW29kLk5hbWUoKV0gPSBtYWtlT25lb2ZJbmZvKG9kLCBzaSwgbWkuRXhwb3J0ZXIpCkBAIC0xMTcsMTMgKzExNywxMyBAQAogCXN3aXRjaCB7CiAJY2FzZSBzaS51bmtub3duT2Zmc2V0LklzVmFsaWQoKSAmJiBzaS51bmtub3duVHlwZSA9PSB1bmtub3duRmllbGRzQVR5cGU6CiAJCS8vIEhhbmRsZSBhcyBbXWJ5dGUuCi0JCW1pLmdldFVua25vd24gPSBmdW5jKHAgcG9pbnRlcikgcHJlZi5SYXdGaWVsZHMgeworCQltaS5nZXRVbmtub3duID0gZnVuYyhwIHBvaW50ZXIpIHByb3RvcmVmbGVjdC5SYXdGaWVsZHMgewogCQkJaWYgcC5Jc05pbCgpIHsKIAkJCQlyZXR1cm4gbmlsCiAJCQl9CiAJCQlyZXR1cm4gKnAuQXBwbHkobWkudW5rbm93bk9mZnNldCkuQnl0ZXMoKQogCQl9Ci0JCW1pLnNldFVua25vd24gPSBmdW5jKHAgcG9pbnRlciwgYiBwcmVmLlJhd0ZpZWxkcykgeworCQltaS5zZXRVbmtub3duID0gZnVuYyhwIHBvaW50ZXIsIGIgcHJvdG9yZWZsZWN0LlJhd0ZpZWxkcykgewogCQkJaWYgcC5Jc05pbCgpIHsKIAkJCQlwYW5pYygiaW52YWxpZCBTZXRVbmtub3duIG9uIG5pbCBNZXNzYWdlIikKIAkJCX0KQEAgLTEzMSw3ICsxMzEsNyBAQAogCQl9CiAJY2FzZSBzaS51bmtub3duT2Zmc2V0LklzVmFsaWQoKSAmJiBzaS51bmtub3duVHlwZSA9PSB1bmtub3duRmllbGRzQlR5cGU6CiAJCS8vIEhhbmRsZSBhcyAqW11ieXRlLgotCQltaS5nZXRVbmtub3duID0gZnVuYyhwIHBvaW50ZXIpIHByZWYuUmF3RmllbGRzIHsKKwkJbWkuZ2V0VW5rbm93biA9IGZ1bmMocCBwb2ludGVyKSBwcm90b3JlZmxlY3QuUmF3RmllbGRzIHsKIAkJCWlmIHAuSXNOaWwoKSB7CiAJCQkJcmV0dXJuIG5pbAogCQkJfQpAQCAtMTQxLDcgKzE0MSw3IEBACiAJCQl9CiAJCQlyZXR1cm4gKipicAogCQl9Ci0JCW1pLnNldFVua25vd24gPSBmdW5jKHAgcG9pbnRlciwgYiBwcmVmLlJhd0ZpZWxkcykgeworCQltaS5zZXRVbmtub3duID0gZnVuYyhwIHBvaW50ZXIsIGIgcHJvdG9yZWZsZWN0LlJhd0ZpZWxkcykgewogCQkJaWYgcC5Jc05pbCgpIHsKIAkJCQlwYW5pYygiaW52YWxpZCBTZXRVbmtub3duIG9uIG5pbCBNZXNzYWdlIikKIAkJCX0KQEAgLTE1MiwxMCArMTUyLDEwIEBACiAJCQkqKmJwID0gYgogCQl9CiAJZGVmYXVsdDoKLQkJbWkuZ2V0VW5rbm93biA9IGZ1bmMocG9pbnRlcikgcHJlZi5SYXdGaWVsZHMgeworCQltaS5nZXRVbmtub3duID0gZnVuYyhwb2ludGVyKSBwcm90b3JlZmxlY3QuUmF3RmllbGRzIHsKIAkJCXJldHVybiBuaWwKIAkJfQotCQltaS5zZXRVbmtub3duID0gZnVuYyhwIHBvaW50ZXIsIF8gcHJlZi5SYXdGaWVsZHMpIHsKKwkJbWkuc2V0VW5rbm93biA9IGZ1bmMocCBwb2ludGVyLCBfIHByb3RvcmVmbGVjdC5SYXdGaWVsZHMpIHsKIAkJCWlmIHAuSXNOaWwoKSB7CiAJCQkJcGFuaWMoImludmFsaWQgU2V0VW5rbm93biBvbiBuaWwgTWVzc2FnZSIpCiAJCQl9CkBAIC0yMjQsNyArMjI0LDcgQEAKIAkJfQogCQlpZiBmdCAhPSBuaWwgewogCQkJaWYgbWkuZmllbGRUeXBlcyA9PSBuaWwgewotCQkJCW1pLmZpZWxkVHlwZXMgPSBtYWtlKG1hcFtwcmVmLkZpZWxkTnVtYmVyXWludGVyZmFjZXt9KQorCQkJCW1pLmZpZWxkVHlwZXMgPSBtYWtlKG1hcFtwcm90b3JlZmxlY3QuRmllbGROdW1iZXJdaW50ZXJmYWNle30pCiAJCQl9CiAJCQltaS5maWVsZFR5cGVzW2ZkLk51bWJlcigpXSA9IHJlZmxlY3QuWmVybyhmdCkuSW50ZXJmYWNlKCkKIAkJfQpAQCAtMjMzLDcgKzIzMyw3IEBACiAKIHR5cGUgZXh0ZW5zaW9uTWFwIG1hcFtpbnQzMl1FeHRlbnNpb25GaWVsZAogCi1mdW5jIChtICpleHRlbnNpb25NYXApIFJhbmdlKGYgZnVuYyhwcmVmLkZpZWxkRGVzY3JpcHRvciwgcHJlZi5WYWx1ZSkgYm9vbCkgeworZnVuYyAobSAqZXh0ZW5zaW9uTWFwKSBSYW5nZShmIGZ1bmMocHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvciwgcHJvdG9yZWZsZWN0LlZhbHVlKSBib29sKSB7CiAJaWYgbSAhPSBuaWwgewogCQlmb3IgXywgeCA6PSByYW5nZSAqbSB7CiAJCQl4ZCA6PSB4LlR5cGUoKS5UeXBlRGVzY3JpcHRvcigpCkBAIC0yNDcsNyArMjQ3LDcgQEAKIAkJfQogCX0KIH0KLWZ1bmMgKG0gKmV4dGVuc2lvbk1hcCkgSGFzKHh0IHByZWYuRXh0ZW5zaW9uVHlwZSkgKG9rIGJvb2wpIHsKK2Z1bmMgKG0gKmV4dGVuc2lvbk1hcCkgSGFzKHh0IHByb3RvcmVmbGVjdC5FeHRlbnNpb25UeXBlKSAob2sgYm9vbCkgewogCWlmIG0gPT0gbmlsIHsKIAkJcmV0dXJuIGZhbHNlCiAJfQpAQCAtMjY2LDEwICsyNjYsMTAgQEAKIAl9CiAJcmV0dXJuIHRydWUKIH0KLWZ1bmMgKG0gKmV4dGVuc2lvbk1hcCkgQ2xlYXIoeHQgcHJlZi5FeHRlbnNpb25UeXBlKSB7CitmdW5jIChtICpleHRlbnNpb25NYXApIENsZWFyKHh0IHByb3RvcmVmbGVjdC5FeHRlbnNpb25UeXBlKSB7CiAJZGVsZXRlKCptLCBpbnQzMih4dC5UeXBlRGVzY3JpcHRvcigpLk51bWJlcigpKSkKIH0KLWZ1bmMgKG0gKmV4dGVuc2lvbk1hcCkgR2V0KHh0IHByZWYuRXh0ZW5zaW9uVHlwZSkgcHJlZi5WYWx1ZSB7CitmdW5jIChtICpleHRlbnNpb25NYXApIEdldCh4dCBwcm90b3JlZmxlY3QuRXh0ZW5zaW9uVHlwZSkgcHJvdG9yZWZsZWN0LlZhbHVlIHsKIAl4ZCA6PSB4dC5UeXBlRGVzY3JpcHRvcigpCiAJaWYgbSAhPSBuaWwgewogCQlpZiB4LCBvayA6PSAoKm0pW2ludDMyKHhkLk51bWJlcigpKV07IG9rIHsKQEAgLTI3OCw3ICsyNzgsNyBAQAogCX0KIAlyZXR1cm4geHQuWmVybygpCiB9Ci1mdW5jIChtICpleHRlbnNpb25NYXApIFNldCh4dCBwcmVmLkV4dGVuc2lvblR5cGUsIHYgcHJlZi5WYWx1ZSkgeworZnVuYyAobSAqZXh0ZW5zaW9uTWFwKSBTZXQoeHQgcHJvdG9yZWZsZWN0LkV4dGVuc2lvblR5cGUsIHYgcHJvdG9yZWZsZWN0LlZhbHVlKSB7CiAJeGQgOj0geHQuVHlwZURlc2NyaXB0b3IoKQogCWlzVmFsaWQgOj0gdHJ1ZQogCXN3aXRjaCB7CkBAIC0zMDIsOSArMzAyLDkgQEAKIAl4LlNldCh4dCwgdikKIAkoKm0pW2ludDMyKHhkLk51bWJlcigpKV0gPSB4CiB9Ci1mdW5jIChtICpleHRlbnNpb25NYXApIE11dGFibGUoeHQgcHJlZi5FeHRlbnNpb25UeXBlKSBwcmVmLlZhbHVlIHsKK2Z1bmMgKG0gKmV4dGVuc2lvbk1hcCkgTXV0YWJsZSh4dCBwcm90b3JlZmxlY3QuRXh0ZW5zaW9uVHlwZSkgcHJvdG9yZWZsZWN0LlZhbHVlIHsKIAl4ZCA6PSB4dC5UeXBlRGVzY3JpcHRvcigpCi0JaWYgeGQuS2luZCgpICE9IHByZWYuTWVzc2FnZUtpbmQgJiYgeGQuS2luZCgpICE9IHByZWYuR3JvdXBLaW5kICYmICF4ZC5Jc0xpc3QoKSAmJiAheGQuSXNNYXAoKSB7CisJaWYgeGQuS2luZCgpICE9IHByb3RvcmVmbGVjdC5NZXNzYWdlS2luZCAmJiB4ZC5LaW5kKCkgIT0gcHJvdG9yZWZsZWN0Lkdyb3VwS2luZCAmJiAheGQuSXNMaXN0KCkgJiYgIXhkLklzTWFwKCkgewogCQlwYW5pYygiaW52YWxpZCBNdXRhYmxlIG9uIGZpZWxkIHdpdGggbm9uLWNvbXBvc2l0ZSB0eXBlIikKIAl9CiAJaWYgeCwgb2sgOj0gKCptKVtpbnQzMih4ZC5OdW1iZXIoKSldOyBvayB7CkBAIC0zMjAsNyArMzIwLDYgQEAKIC8vIGluIGFuIGFsbG9jYXRpb24tZnJlZSB3YXkgd2l0aG91dCBuZWVkaW5nIHRvIGhhdmUgYSBzaGFkb3cgR28gdHlwZSBnZW5lcmF0ZWQKIC8vIGZvciBldmVyeSBtZXNzYWdlIHR5cGUuIFRoaXMgdGVjaG5pcXVlIG9ubHkgd29ya3MgdXNpbmcgdW5zYWZlLgogLy8KLS8vCiAvLyBFeGFtcGxlIGdlbmVyYXRlZCBjb2RlOgogLy8KIC8vCXR5cGUgTSBzdHJ1Y3QgewpAQCAtMzUxLDEyICszNTAsMTEgQEAKIC8vIEl0IGhhcyBhY2Nlc3MgdG8gdGhlIG1lc3NhZ2UgaW5mbyBhcyBpdHMgZmlyc3QgZmllbGQsIGFuZCBhIHBvaW50ZXIgdG8gdGhlCiAvLyBNZXNzYWdlU3RhdGUgaXMgaWRlbnRpY2FsIHRvIGEgcG9pbnRlciB0byB0aGUgY29uY3JldGUgbWVzc2FnZSB2YWx1ZS4KIC8vCi0vLwogLy8gUmVxdWlyZW1lbnRzOgotLy8J4oCiIFRoZSB0eXBlIE0gbXVzdCBpbXBsZW1lbnQgcHJvdG9yZWZsZWN0LlByb3RvTWVzc2FnZS4KLS8vCeKAoiBUaGUgYWRkcmVzcyBvZiBtIG11c3Qgbm90IGJlIG5pbC4KLS8vCeKAoiBUaGUgYWRkcmVzcyBvZiBtIGFuZCB0aGUgYWRkcmVzcyBvZiBtLnN0YXRlIG11c3QgYmUgZXF1YWwsCi0vLwlldmVuIHRob3VnaCB0aGV5IGFyZSBkaWZmZXJlbnQgR28gdHlwZXMuCisvLyAgIC0gVGhlIHR5cGUgTSBtdXN0IGltcGxlbWVudCBwcm90b3JlZmxlY3QuUHJvdG9NZXNzYWdlLgorLy8gICAtIFRoZSBhZGRyZXNzIG9mIG0gbXVzdCBub3QgYmUgbmlsLgorLy8gICAtIFRoZSBhZGRyZXNzIG9mIG0gYW5kIHRoZSBhZGRyZXNzIG9mIG0uc3RhdGUgbXVzdCBiZSBlcXVhbCwKKy8vICAgICBldmVuIHRob3VnaCB0aGV5IGFyZSBkaWZmZXJlbnQgR28gdHlwZXMuCiB0eXBlIE1lc3NhZ2VTdGF0ZSBzdHJ1Y3QgewogCXByYWdtYS5Ob1Vua2V5ZWRMaXRlcmFscwogCXByYWdtYS5Eb05vdENvbXBhcmUKQEAgLTM2OCw4ICszNjYsOCBAQAogdHlwZSBtZXNzYWdlU3RhdGUgTWVzc2FnZVN0YXRlCiAKIHZhciAoCi0JXyBwcmVmLk1lc3NhZ2UgPSAoKm1lc3NhZ2VTdGF0ZSkobmlsKQotCV8gdW53cmFwcGVyICAgID0gKCptZXNzYWdlU3RhdGUpKG5pbCkKKwlfIHByb3RvcmVmbGVjdC5NZXNzYWdlID0gKCptZXNzYWdlU3RhdGUpKG5pbCkKKwlfIHVud3JhcHBlciAgICAgICAgICAgID0gKCptZXNzYWdlU3RhdGUpKG5pbCkKICkKIAogLy8gbWVzc2FnZURhdGFUeXBlIGlzIGEgdHVwbGUgb2YgYSBwb2ludGVyIHRvIHRoZSBtZXNzYWdlIGRhdGEgYW5kCkBAIC0zODcsMTYgKzM4NSwxNiBAQAogKQogCiB2YXIgKAotCV8gcHJlZi5NZXNzYWdlICAgICAgPSAoKm1lc3NhZ2VSZWZsZWN0V3JhcHBlcikobmlsKQotCV8gdW53cmFwcGVyICAgICAgICAgPSAoKm1lc3NhZ2VSZWZsZWN0V3JhcHBlcikobmlsKQotCV8gcHJlZi5Qcm90b01lc3NhZ2UgPSAoKm1lc3NhZ2VJZmFjZVdyYXBwZXIpKG5pbCkKLQlfIHVud3JhcHBlciAgICAgICAgID0gKCptZXNzYWdlSWZhY2VXcmFwcGVyKShuaWwpCisJXyBwcm90b3JlZmxlY3QuTWVzc2FnZSAgICAgID0gKCptZXNzYWdlUmVmbGVjdFdyYXBwZXIpKG5pbCkKKwlfIHVud3JhcHBlciAgICAgICAgICAgICAgICAgPSAoKm1lc3NhZ2VSZWZsZWN0V3JhcHBlcikobmlsKQorCV8gcHJvdG9yZWZsZWN0LlByb3RvTWVzc2FnZSA9ICgqbWVzc2FnZUlmYWNlV3JhcHBlcikobmlsKQorCV8gdW53cmFwcGVyICAgICAgICAgICAgICAgICA9ICgqbWVzc2FnZUlmYWNlV3JhcHBlcikobmlsKQogKQogCiAvLyBNZXNzYWdlT2YgcmV0dXJucyBhIHJlZmxlY3RpdmUgdmlldyBvdmVyIGEgbWVzc2FnZS4gVGhlIGlucHV0IG11c3QgYmUgYQogLy8gcG9pbnRlciB0byBhIG5hbWVkIEdvIHN0cnVjdC4gSWYgdGhlIHByb3ZpZGVkIHR5cGUgaGFzIGEgUHJvdG9SZWZsZWN0IG1ldGhvZCwKIC8vIGl0IG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgY2FsbGluZyB0aGlzIG1ldGhvZC4KLWZ1bmMgKG1pICpNZXNzYWdlSW5mbykgTWVzc2FnZU9mKG0gaW50ZXJmYWNle30pIHByZWYuTWVzc2FnZSB7CitmdW5jIChtaSAqTWVzc2FnZUluZm8pIE1lc3NhZ2VPZihtIGludGVyZmFjZXt9KSBwcm90b3JlZmxlY3QuTWVzc2FnZSB7CiAJaWYgcmVmbGVjdC5UeXBlT2YobSkgIT0gbWkuR29SZWZsZWN0VHlwZSB7CiAJCXBhbmljKGZtdC5TcHJpbnRmKCJ0eXBlIG1pc21hdGNoOiBnb3QgJVQsIHdhbnQgJXYiLCBtLCBtaS5Hb1JlZmxlY3RUeXBlKSkKIAl9CkBAIC00MjEsNyArNDE5LDcgQEAKIAkJcnYuRWxlbSgpLlNldChyZWZsZWN0Llplcm8ocnYuVHlwZSgpLkVsZW0oKSkpCiAJfQogfQotZnVuYyAobSAqbWVzc2FnZUlmYWNlV3JhcHBlcikgUHJvdG9SZWZsZWN0KCkgcHJlZi5NZXNzYWdlIHsKK2Z1bmMgKG0gKm1lc3NhZ2VJZmFjZVdyYXBwZXIpIFByb3RvUmVmbGVjdCgpIHByb3RvcmVmbGVjdC5NZXNzYWdlIHsKIAlyZXR1cm4gKCptZXNzYWdlUmVmbGVjdFdyYXBwZXIpKG0pCiB9CiBmdW5jIChtICptZXNzYWdlSWZhY2VXcmFwcGVyKSBwcm90b1Vud3JhcCgpIGludGVyZmFjZXt9IHsKQEAgLTQzMCw3ICs0MjgsNyBAQAogCiAvLyBjaGVja0ZpZWxkIHZlcmlmaWVzIHRoYXQgdGhlIHByb3ZpZGVkIGZpZWxkIGRlc2NyaXB0b3IgaXMgdmFsaWQuCiAvLyBFeGFjdGx5IG9uZSBvZiB0aGUgcmV0dXJuZWQgdmFsdWVzIGlzIHBvcHVsYXRlZC4KLWZ1bmMgKG1pICpNZXNzYWdlSW5mbykgY2hlY2tGaWVsZChmZCBwcmVmLkZpZWxkRGVzY3JpcHRvcikgKCpmaWVsZEluZm8sIHByZWYuRXh0ZW5zaW9uVHlwZSkgeworZnVuYyAobWkgKk1lc3NhZ2VJbmZvKSBjaGVja0ZpZWxkKGZkIHByb3RvcmVmbGVjdC5GaWVsZERlc2NyaXB0b3IpICgqZmllbGRJbmZvLCBwcm90b3JlZmxlY3QuRXh0ZW5zaW9uVHlwZSkgewogCXZhciBmaSAqZmllbGRJbmZvCiAJaWYgbiA6PSBmZC5OdW1iZXIoKTsgMCA8IG4gJiYgaW50KG4pIDwgbGVuKG1pLmRlbnNlRmllbGRzKSB7CiAJCWZpID0gbWkuZGVuc2VGaWVsZHNbbl0KQEAgLTQ1NSw3ICs0NTMsNyBAQAogCQlpZiAhbWkuRGVzYy5FeHRlbnNpb25SYW5nZXMoKS5IYXMoZmQuTnVtYmVyKCkpIHsKIAkJCXBhbmljKGZtdC5TcHJpbnRmKCJleHRlbnNpb24gJXYgZXh0ZW5kcyAldiBvdXRzaWRlIHRoZSBleHRlbnNpb24gcmFuZ2UiLCBmZC5GdWxsTmFtZSgpLCBtaS5EZXNjLkZ1bGxOYW1lKCkpKQogCQl9Ci0JCXh0ZCwgb2sgOj0gZmQuKHByZWYuRXh0ZW5zaW9uVHlwZURlc2NyaXB0b3IpCisJCXh0ZCwgb2sgOj0gZmQuKHByb3RvcmVmbGVjdC5FeHRlbnNpb25UeXBlRGVzY3JpcHRvcikKIAkJaWYgIW9rIHsKIAkJCXBhbmljKGZtdC5TcHJpbnRmKCJleHRlbnNpb24gJXYgZG9lcyBub3QgaW1wbGVtZW50IHByb3RvcmVmbGVjdC5FeHRlbnNpb25UeXBlRGVzY3JpcHRvciIsIGZkLkZ1bGxOYW1lKCkpKQogCQl9CmRpZmYgLS1naXQgYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9tZXNzYWdlX3JlZmxlY3RfZmllbGQuZ28gYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9tZXNzYWdlX3JlZmxlY3RfZmllbGQuZ28KaW5kZXggMzQzY2Y4Ny4uOTg2MzIyYiAxMDA2NDQKLS0tIGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvbWVzc2FnZV9yZWZsZWN0X2ZpZWxkLmdvCisrKyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL21lc3NhZ2VfcmVmbGVjdF9maWVsZC5nbwpAQCAtMTEsMjQgKzExLDI0IEBACiAJInN5bmMiCiAKIAkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvZmxhZ3MiCi0JcHJlZiAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZmxlY3QiCi0JcHJlZyAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZ2lzdHJ5IgorCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9yZWZsZWN0L3Byb3RvcmVmbGVjdCIKKwkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZ2lzdHJ5IgogKQogCiB0eXBlIGZpZWxkSW5mbyBzdHJ1Y3QgewotCWZpZWxkRGVzYyBwcmVmLkZpZWxkRGVzY3JpcHRvcgorCWZpZWxkRGVzYyBwcm90b3JlZmxlY3QuRmllbGREZXNjcmlwdG9yCiAKIAkvLyBUaGVzZSBmaWVsZHMgYXJlIHVzZWQgZm9yIHByb3RvYnVmIHJlZmxlY3Rpb24gc3VwcG9ydC4KIAloYXMgICAgICAgIGZ1bmMocG9pbnRlcikgYm9vbAogCWNsZWFyICAgICAgZnVuYyhwb2ludGVyKQotCWdldCAgICAgICAgZnVuYyhwb2ludGVyKSBwcmVmLlZhbHVlCi0Jc2V0ICAgICAgICBmdW5jKHBvaW50ZXIsIHByZWYuVmFsdWUpCi0JbXV0YWJsZSAgICBmdW5jKHBvaW50ZXIpIHByZWYuVmFsdWUKLQluZXdNZXNzYWdlIGZ1bmMoKSBwcmVmLk1lc3NhZ2UKLQluZXdGaWVsZCAgIGZ1bmMoKSBwcmVmLlZhbHVlCisJZ2V0ICAgICAgICBmdW5jKHBvaW50ZXIpIHByb3RvcmVmbGVjdC5WYWx1ZQorCXNldCAgICAgICAgZnVuYyhwb2ludGVyLCBwcm90b3JlZmxlY3QuVmFsdWUpCisJbXV0YWJsZSAgICBmdW5jKHBvaW50ZXIpIHByb3RvcmVmbGVjdC5WYWx1ZQorCW5ld01lc3NhZ2UgZnVuYygpIHByb3RvcmVmbGVjdC5NZXNzYWdlCisJbmV3RmllbGQgICBmdW5jKCkgcHJvdG9yZWZsZWN0LlZhbHVlCiB9CiAKLWZ1bmMgZmllbGRJbmZvRm9yTWlzc2luZyhmZCBwcmVmLkZpZWxkRGVzY3JpcHRvcikgZmllbGRJbmZvIHsKK2Z1bmMgZmllbGRJbmZvRm9yTWlzc2luZyhmZCBwcm90b3JlZmxlY3QuRmllbGREZXNjcmlwdG9yKSBmaWVsZEluZm8gewogCS8vIFRoaXMgbmV2ZXIgb2NjdXJzIGZvciBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlcy4KIAkvLyBJdCBpbXBsaWVzIHRoYXQgYSBoYW5kLWNyYWZ0ZWQgdHlwZSBoYXMgbWlzc2luZyBHbyBmaWVsZHMKIAkvLyBmb3Igc3BlY2lmaWMgcHJvdG9idWYgbWVzc2FnZSBmaWVsZHMuCkBAIC00MCwxOSArNDAsMTkgQEAKIAkJY2xlYXI6IGZ1bmMocCBwb2ludGVyKSB7CiAJCQlwYW5pYygibWlzc2luZyBHbyBzdHJ1Y3QgZmllbGQgZm9yICIgKyBzdHJpbmcoZmQuRnVsbE5hbWUoKSkpCiAJCX0sCi0JCWdldDogZnVuYyhwIHBvaW50ZXIpIHByZWYuVmFsdWUgeworCQlnZXQ6IGZ1bmMocCBwb2ludGVyKSBwcm90b3JlZmxlY3QuVmFsdWUgewogCQkJcmV0dXJuIGZkLkRlZmF1bHQoKQogCQl9LAotCQlzZXQ6IGZ1bmMocCBwb2ludGVyLCB2IHByZWYuVmFsdWUpIHsKKwkJc2V0OiBmdW5jKHAgcG9pbnRlciwgdiBwcm90b3JlZmxlY3QuVmFsdWUpIHsKIAkJCXBhbmljKCJtaXNzaW5nIEdvIHN0cnVjdCBmaWVsZCBmb3IgIiArIHN0cmluZyhmZC5GdWxsTmFtZSgpKSkKIAkJfSwKLQkJbXV0YWJsZTogZnVuYyhwIHBvaW50ZXIpIHByZWYuVmFsdWUgeworCQltdXRhYmxlOiBmdW5jKHAgcG9pbnRlcikgcHJvdG9yZWZsZWN0LlZhbHVlIHsKIAkJCXBhbmljKCJtaXNzaW5nIEdvIHN0cnVjdCBmaWVsZCBmb3IgIiArIHN0cmluZyhmZC5GdWxsTmFtZSgpKSkKIAkJfSwKLQkJbmV3TWVzc2FnZTogZnVuYygpIHByZWYuTWVzc2FnZSB7CisJCW5ld01lc3NhZ2U6IGZ1bmMoKSBwcm90b3JlZmxlY3QuTWVzc2FnZSB7CiAJCQlwYW5pYygibWlzc2luZyBHbyBzdHJ1Y3QgZmllbGQgZm9yICIgKyBzdHJpbmcoZmQuRnVsbE5hbWUoKSkpCiAJCX0sCi0JCW5ld0ZpZWxkOiBmdW5jKCkgcHJlZi5WYWx1ZSB7CisJCW5ld0ZpZWxkOiBmdW5jKCkgcHJvdG9yZWZsZWN0LlZhbHVlIHsKIAkJCWlmIHYgOj0gZmQuRGVmYXVsdCgpOyB2LklzVmFsaWQoKSB7CiAJCQkJcmV0dXJuIHYKIAkJCX0KQEAgLTYxLDcgKzYxLDcgQEAKIAl9CiB9CiAKLWZ1bmMgZmllbGRJbmZvRm9yT25lb2YoZmQgcHJlZi5GaWVsZERlc2NyaXB0b3IsIGZzIHJlZmxlY3QuU3RydWN0RmllbGQsIHggZXhwb3J0ZXIsIG90IHJlZmxlY3QuVHlwZSkgZmllbGRJbmZvIHsKK2Z1bmMgZmllbGRJbmZvRm9yT25lb2YoZmQgcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvciwgZnMgcmVmbGVjdC5TdHJ1Y3RGaWVsZCwgeCBleHBvcnRlciwgb3QgcmVmbGVjdC5UeXBlKSBmaWVsZEluZm8gewogCWZ0IDo9IGZzLlR5cGUKIAlpZiBmdC5LaW5kKCkgIT0gcmVmbGVjdC5JbnRlcmZhY2UgewogCQlwYW5pYyhmbXQuU3ByaW50ZigiZmllbGQgJXYgaGFzIGludmFsaWQgdHlwZTogZ290ICV2LCB3YW50IGludGVyZmFjZSBraW5kIiwgZmQuRnVsbE5hbWUoKSwgZnQpKQpAQCAtMTAyLDcgKzEwMiw3IEBACiAJCQl9CiAJCQlydi5TZXQocmVmbGVjdC5aZXJvKHJ2LlR5cGUoKSkpCiAJCX0sCi0JCWdldDogZnVuYyhwIHBvaW50ZXIpIHByZWYuVmFsdWUgeworCQlnZXQ6IGZ1bmMocCBwb2ludGVyKSBwcm90b3JlZmxlY3QuVmFsdWUgewogCQkJaWYgcC5Jc05pbCgpIHsKIAkJCQlyZXR1cm4gY29udi5aZXJvKCkKIAkJCX0KQEAgLTExMyw3ICsxMTMsNyBAQAogCQkJcnYgPSBydi5FbGVtKCkuRWxlbSgpLkZpZWxkKDApCiAJCQlyZXR1cm4gY29udi5QQlZhbHVlT2YocnYpCiAJCX0sCi0JCXNldDogZnVuYyhwIHBvaW50ZXIsIHYgcHJlZi5WYWx1ZSkgeworCQlzZXQ6IGZ1bmMocCBwb2ludGVyLCB2IHByb3RvcmVmbGVjdC5WYWx1ZSkgewogCQkJcnYgOj0gcC5BcHBseShmaWVsZE9mZnNldCkuQXNWYWx1ZU9mKGZzLlR5cGUpLkVsZW0oKQogCQkJaWYgcnYuSXNOaWwoKSB8fCBydi5FbGVtKCkuVHlwZSgpLkVsZW0oKSAhPSBvdCB8fCBydi5FbGVtKCkuSXNOaWwoKSB7CiAJCQkJcnYuU2V0KHJlZmxlY3QuTmV3KG90KSkKQEAgLTEyMSw3ICsxMjEsNyBAQAogCQkJcnYgPSBydi5FbGVtKCkuRWxlbSgpLkZpZWxkKDApCiAJCQlydi5TZXQoY29udi5Hb1ZhbHVlT2YodikpCiAJCX0sCi0JCW11dGFibGU6IGZ1bmMocCBwb2ludGVyKSBwcmVmLlZhbHVlIHsKKwkJbXV0YWJsZTogZnVuYyhwIHBvaW50ZXIpIHByb3RvcmVmbGVjdC5WYWx1ZSB7CiAJCQlpZiAhaXNNZXNzYWdlIHsKIAkJCQlwYW5pYyhmbXQuU3ByaW50ZigiZmllbGQgJXYgd2l0aCBpbnZhbGlkIE11dGFibGUgY2FsbCBvbiBmaWVsZCB3aXRoIG5vbi1jb21wb3NpdGUgdHlwZSIsIGZkLkZ1bGxOYW1lKCkpKQogCQkJfQpAQCAtMTMxLDIwICsxMzEsMjAgQEAKIAkJCX0KIAkJCXJ2ID0gcnYuRWxlbSgpLkVsZW0oKS5GaWVsZCgwKQogCQkJaWYgcnYuS2luZCgpID09IHJlZmxlY3QuUHRyICYmIHJ2LklzTmlsKCkgewotCQkJCXJ2LlNldChjb252LkdvVmFsdWVPZihwcmVmLlZhbHVlT2ZNZXNzYWdlKGNvbnYuTmV3KCkuTWVzc2FnZSgpKSkpCisJCQkJcnYuU2V0KGNvbnYuR29WYWx1ZU9mKHByb3RvcmVmbGVjdC5WYWx1ZU9mTWVzc2FnZShjb252Lk5ldygpLk1lc3NhZ2UoKSkpKQogCQkJfQogCQkJcmV0dXJuIGNvbnYuUEJWYWx1ZU9mKHJ2KQogCQl9LAotCQluZXdNZXNzYWdlOiBmdW5jKCkgcHJlZi5NZXNzYWdlIHsKKwkJbmV3TWVzc2FnZTogZnVuYygpIHByb3RvcmVmbGVjdC5NZXNzYWdlIHsKIAkJCXJldHVybiBjb252Lk5ldygpLk1lc3NhZ2UoKQogCQl9LAotCQluZXdGaWVsZDogZnVuYygpIHByZWYuVmFsdWUgeworCQluZXdGaWVsZDogZnVuYygpIHByb3RvcmVmbGVjdC5WYWx1ZSB7CiAJCQlyZXR1cm4gY29udi5OZXcoKQogCQl9LAogCX0KIH0KIAotZnVuYyBmaWVsZEluZm9Gb3JNYXAoZmQgcHJlZi5GaWVsZERlc2NyaXB0b3IsIGZzIHJlZmxlY3QuU3RydWN0RmllbGQsIHggZXhwb3J0ZXIpIGZpZWxkSW5mbyB7CitmdW5jIGZpZWxkSW5mb0Zvck1hcChmZCBwcm90b3JlZmxlY3QuRmllbGREZXNjcmlwdG9yLCBmcyByZWZsZWN0LlN0cnVjdEZpZWxkLCB4IGV4cG9ydGVyKSBmaWVsZEluZm8gewogCWZ0IDo9IGZzLlR5cGUKIAlpZiBmdC5LaW5kKCkgIT0gcmVmbGVjdC5NYXAgewogCQlwYW5pYyhmbXQuU3ByaW50ZigiZmllbGQgJXYgaGFzIGludmFsaWQgdHlwZTogZ290ICV2LCB3YW50IG1hcCBraW5kIiwgZmQuRnVsbE5hbWUoKSwgZnQpKQpAQCAtMTY2LDcgKzE2Niw3IEBACiAJCQlydiA6PSBwLkFwcGx5KGZpZWxkT2Zmc2V0KS5Bc1ZhbHVlT2YoZnMuVHlwZSkuRWxlbSgpCiAJCQlydi5TZXQocmVmbGVjdC5aZXJvKHJ2LlR5cGUoKSkpCiAJCX0sCi0JCWdldDogZnVuYyhwIHBvaW50ZXIpIHByZWYuVmFsdWUgeworCQlnZXQ6IGZ1bmMocCBwb2ludGVyKSBwcm90b3JlZmxlY3QuVmFsdWUgewogCQkJaWYgcC5Jc05pbCgpIHsKIAkJCQlyZXR1cm4gY29udi5aZXJvKCkKIAkJCX0KQEAgLTE3Niw3ICsxNzYsNyBAQAogCQkJfQogCQkJcmV0dXJuIGNvbnYuUEJWYWx1ZU9mKHJ2KQogCQl9LAotCQlzZXQ6IGZ1bmMocCBwb2ludGVyLCB2IHByZWYuVmFsdWUpIHsKKwkJc2V0OiBmdW5jKHAgcG9pbnRlciwgdiBwcm90b3JlZmxlY3QuVmFsdWUpIHsKIAkJCXJ2IDo9IHAuQXBwbHkoZmllbGRPZmZzZXQpLkFzVmFsdWVPZihmcy5UeXBlKS5FbGVtKCkKIAkJCXB2IDo9IGNvbnYuR29WYWx1ZU9mKHYpCiAJCQlpZiBwdi5Jc05pbCgpIHsKQEAgLTE4NCwyMCArMTg0LDIwIEBACiAJCQl9CiAJCQlydi5TZXQocHYpCiAJCX0sCi0JCW11dGFibGU6IGZ1bmMocCBwb2ludGVyKSBwcmVmLlZhbHVlIHsKKwkJbXV0YWJsZTogZnVuYyhwIHBvaW50ZXIpIHByb3RvcmVmbGVjdC5WYWx1ZSB7CiAJCQl2IDo9IHAuQXBwbHkoZmllbGRPZmZzZXQpLkFzVmFsdWVPZihmcy5UeXBlKS5FbGVtKCkKIAkJCWlmIHYuSXNOaWwoKSB7CiAJCQkJdi5TZXQocmVmbGVjdC5NYWtlTWFwKGZzLlR5cGUpKQogCQkJfQogCQkJcmV0dXJuIGNvbnYuUEJWYWx1ZU9mKHYpCiAJCX0sCi0JCW5ld0ZpZWxkOiBmdW5jKCkgcHJlZi5WYWx1ZSB7CisJCW5ld0ZpZWxkOiBmdW5jKCkgcHJvdG9yZWZsZWN0LlZhbHVlIHsKIAkJCXJldHVybiBjb252Lk5ldygpCiAJCX0sCiAJfQogfQogCi1mdW5jIGZpZWxkSW5mb0Zvckxpc3QoZmQgcHJlZi5GaWVsZERlc2NyaXB0b3IsIGZzIHJlZmxlY3QuU3RydWN0RmllbGQsIHggZXhwb3J0ZXIpIGZpZWxkSW5mbyB7CitmdW5jIGZpZWxkSW5mb0Zvckxpc3QoZmQgcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvciwgZnMgcmVmbGVjdC5TdHJ1Y3RGaWVsZCwgeCBleHBvcnRlcikgZmllbGRJbmZvIHsKIAlmdCA6PSBmcy5UeXBlCiAJaWYgZnQuS2luZCgpICE9IHJlZmxlY3QuU2xpY2UgewogCQlwYW5pYyhmbXQuU3ByaW50ZigiZmllbGQgJXYgaGFzIGludmFsaWQgdHlwZTogZ290ICV2LCB3YW50IHNsaWNlIGtpbmQiLCBmZC5GdWxsTmFtZSgpLCBmdCkpCkBAIC0yMTksNyArMjE5LDcgQEAKIAkJCXJ2IDo9IHAuQXBwbHkoZmllbGRPZmZzZXQpLkFzVmFsdWVPZihmcy5UeXBlKS5FbGVtKCkKIAkJCXJ2LlNldChyZWZsZWN0Llplcm8ocnYuVHlwZSgpKSkKIAkJfSwKLQkJZ2V0OiBmdW5jKHAgcG9pbnRlcikgcHJlZi5WYWx1ZSB7CisJCWdldDogZnVuYyhwIHBvaW50ZXIpIHByb3RvcmVmbGVjdC5WYWx1ZSB7CiAJCQlpZiBwLklzTmlsKCkgewogCQkJCXJldHVybiBjb252Llplcm8oKQogCQkJfQpAQCAtMjI5LDcgKzIyOSw3IEBACiAJCQl9CiAJCQlyZXR1cm4gY29udi5QQlZhbHVlT2YocnYpCiAJCX0sCi0JCXNldDogZnVuYyhwIHBvaW50ZXIsIHYgcHJlZi5WYWx1ZSkgeworCQlzZXQ6IGZ1bmMocCBwb2ludGVyLCB2IHByb3RvcmVmbGVjdC5WYWx1ZSkgewogCQkJcnYgOj0gcC5BcHBseShmaWVsZE9mZnNldCkuQXNWYWx1ZU9mKGZzLlR5cGUpLkVsZW0oKQogCQkJcHYgOj0gY29udi5Hb1ZhbHVlT2YodikKIAkJCWlmIHB2LklzTmlsKCkgewpAQCAtMjM3LDExICsyMzcsMTEgQEAKIAkJCX0KIAkJCXJ2LlNldChwdi5FbGVtKCkpCiAJCX0sCi0JCW11dGFibGU6IGZ1bmMocCBwb2ludGVyKSBwcmVmLlZhbHVlIHsKKwkJbXV0YWJsZTogZnVuYyhwIHBvaW50ZXIpIHByb3RvcmVmbGVjdC5WYWx1ZSB7CiAJCQl2IDo9IHAuQXBwbHkoZmllbGRPZmZzZXQpLkFzVmFsdWVPZihmcy5UeXBlKQogCQkJcmV0dXJuIGNvbnYuUEJWYWx1ZU9mKHYpCiAJCX0sCi0JCW5ld0ZpZWxkOiBmdW5jKCkgcHJlZi5WYWx1ZSB7CisJCW5ld0ZpZWxkOiBmdW5jKCkgcHJvdG9yZWZsZWN0LlZhbHVlIHsKIAkJCXJldHVybiBjb252Lk5ldygpCiAJCX0sCiAJfQpAQCAtMjUyLDcgKzI1Miw3IEBACiAJZW1wdHlCeXRlcyA9IHJlZmxlY3QuVmFsdWVPZihbXWJ5dGV7fSkKICkKIAotZnVuYyBmaWVsZEluZm9Gb3JTY2FsYXIoZmQgcHJlZi5GaWVsZERlc2NyaXB0b3IsIGZzIHJlZmxlY3QuU3RydWN0RmllbGQsIHggZXhwb3J0ZXIpIGZpZWxkSW5mbyB7CitmdW5jIGZpZWxkSW5mb0ZvclNjYWxhcihmZCBwcm90b3JlZmxlY3QuRmllbGREZXNjcmlwdG9yLCBmcyByZWZsZWN0LlN0cnVjdEZpZWxkLCB4IGV4cG9ydGVyKSBmaWVsZEluZm8gewogCWZ0IDo9IGZzLlR5cGUKIAludWxsYWJsZSA6PSBmZC5IYXNQcmVzZW5jZSgpCiAJaXNCeXRlcyA6PSBmdC5LaW5kKCkgPT0gcmVmbGVjdC5TbGljZSAmJiBmdC5FbGVtKCkuS2luZCgpID09IHJlZmxlY3QuVWludDgKQEAgLTMwMCw3ICszMDAsNyBAQAogCQkJcnYgOj0gcC5BcHBseShmaWVsZE9mZnNldCkuQXNWYWx1ZU9mKGZzLlR5cGUpLkVsZW0oKQogCQkJcnYuU2V0KHJlZmxlY3QuWmVybyhydi5UeXBlKCkpKQogCQl9LAotCQlnZXQ6IGZ1bmMocCBwb2ludGVyKSBwcmVmLlZhbHVlIHsKKwkJZ2V0OiBmdW5jKHAgcG9pbnRlcikgcHJvdG9yZWZsZWN0LlZhbHVlIHsKIAkJCWlmIHAuSXNOaWwoKSB7CiAJCQkJcmV0dXJuIGNvbnYuWmVybygpCiAJCQl9CkBAIC0zMTUsNyArMzE1LDcgQEAKIAkJCX0KIAkJCXJldHVybiBjb252LlBCVmFsdWVPZihydikKIAkJfSwKLQkJc2V0OiBmdW5jKHAgcG9pbnRlciwgdiBwcmVmLlZhbHVlKSB7CisJCXNldDogZnVuYyhwIHBvaW50ZXIsIHYgcHJvdG9yZWZsZWN0LlZhbHVlKSB7CiAJCQlydiA6PSBwLkFwcGx5KGZpZWxkT2Zmc2V0KS5Bc1ZhbHVlT2YoZnMuVHlwZSkuRWxlbSgpCiAJCQlpZiBudWxsYWJsZSAmJiBydi5LaW5kKCkgPT0gcmVmbGVjdC5QdHIgewogCQkJCWlmIHJ2LklzTmlsKCkgewpAQCAtMzMyLDIzICszMzIsMjMgQEAKIAkJCQl9CiAJCQl9CiAJCX0sCi0JCW5ld0ZpZWxkOiBmdW5jKCkgcHJlZi5WYWx1ZSB7CisJCW5ld0ZpZWxkOiBmdW5jKCkgcHJvdG9yZWZsZWN0LlZhbHVlIHsKIAkJCXJldHVybiBjb252Lk5ldygpCiAJCX0sCiAJfQogfQogCi1mdW5jIGZpZWxkSW5mb0ZvcldlYWtNZXNzYWdlKGZkIHByZWYuRmllbGREZXNjcmlwdG9yLCB3ZWFrT2Zmc2V0IG9mZnNldCkgZmllbGRJbmZvIHsKK2Z1bmMgZmllbGRJbmZvRm9yV2Vha01lc3NhZ2UoZmQgcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvciwgd2Vha09mZnNldCBvZmZzZXQpIGZpZWxkSW5mbyB7CiAJaWYgIWZsYWdzLlByb3RvTGVnYWN5IHsKIAkJcGFuaWMoIm5vIHN1cHBvcnQgZm9yIHByb3RvMSB3ZWFrIGZpZWxkcyIpCiAJfQogCiAJdmFyIG9uY2Ugc3luYy5PbmNlCi0JdmFyIG1lc3NhZ2VUeXBlIHByZWYuTWVzc2FnZVR5cGUKKwl2YXIgbWVzc2FnZVR5cGUgcHJvdG9yZWZsZWN0Lk1lc3NhZ2VUeXBlCiAJbGF6eUluaXQgOj0gZnVuYygpIHsKIAkJb25jZS5EbyhmdW5jKCkgewogCQkJbWVzc2FnZU5hbWUgOj0gZmQuTWVzc2FnZSgpLkZ1bGxOYW1lKCkKLQkJCW1lc3NhZ2VUeXBlLCBfID0gcHJlZy5HbG9iYWxUeXBlcy5GaW5kTWVzc2FnZUJ5TmFtZShtZXNzYWdlTmFtZSkKKwkJCW1lc3NhZ2VUeXBlLCBfID0gcHJvdG9yZWdpc3RyeS5HbG9iYWxUeXBlcy5GaW5kTWVzc2FnZUJ5TmFtZShtZXNzYWdlTmFtZSkKIAkJCWlmIG1lc3NhZ2VUeXBlID09IG5pbCB7CiAJCQkJcGFuaWMoZm10LlNwcmludGYoIndlYWsgbWVzc2FnZSAldiBmb3IgZmllbGQgJXYgaXMgbm90IGxpbmtlZCBpbiIsIG1lc3NhZ2VOYW1lLCBmZC5GdWxsTmFtZSgpKSkKIAkJCX0KQEAgLTM2OCwxOCArMzY4LDE4IEBACiAJCWNsZWFyOiBmdW5jKHAgcG9pbnRlcikgewogCQkJcC5BcHBseSh3ZWFrT2Zmc2V0KS5XZWFrRmllbGRzKCkuY2xlYXIobnVtKQogCQl9LAotCQlnZXQ6IGZ1bmMocCBwb2ludGVyKSBwcmVmLlZhbHVlIHsKKwkJZ2V0OiBmdW5jKHAgcG9pbnRlcikgcHJvdG9yZWZsZWN0LlZhbHVlIHsKIAkJCWxhenlJbml0KCkKIAkJCWlmIHAuSXNOaWwoKSB7Ci0JCQkJcmV0dXJuIHByZWYuVmFsdWVPZk1lc3NhZ2UobWVzc2FnZVR5cGUuWmVybygpKQorCQkJCXJldHVybiBwcm90b3JlZmxlY3QuVmFsdWVPZk1lc3NhZ2UobWVzc2FnZVR5cGUuWmVybygpKQogCQkJfQogCQkJbSwgb2sgOj0gcC5BcHBseSh3ZWFrT2Zmc2V0KS5XZWFrRmllbGRzKCkuZ2V0KG51bSkKIAkJCWlmICFvayB7Ci0JCQkJcmV0dXJuIHByZWYuVmFsdWVPZk1lc3NhZ2UobWVzc2FnZVR5cGUuWmVybygpKQorCQkJCXJldHVybiBwcm90b3JlZmxlY3QuVmFsdWVPZk1lc3NhZ2UobWVzc2FnZVR5cGUuWmVybygpKQogCQkJfQotCQkJcmV0dXJuIHByZWYuVmFsdWVPZk1lc3NhZ2UobS5Qcm90b1JlZmxlY3QoKSkKKwkJCXJldHVybiBwcm90b3JlZmxlY3QuVmFsdWVPZk1lc3NhZ2UobS5Qcm90b1JlZmxlY3QoKSkKIAkJfSwKLQkJc2V0OiBmdW5jKHAgcG9pbnRlciwgdiBwcmVmLlZhbHVlKSB7CisJCXNldDogZnVuYyhwIHBvaW50ZXIsIHYgcHJvdG9yZWZsZWN0LlZhbHVlKSB7CiAJCQlsYXp5SW5pdCgpCiAJCQltIDo9IHYuTWVzc2FnZSgpCiAJCQlpZiBtLkRlc2NyaXB0b3IoKSAhPSBtZXNzYWdlVHlwZS5EZXNjcmlwdG9yKCkgewpAQCAtMzkwLDcgKzM5MCw3IEBACiAJCQl9CiAJCQlwLkFwcGx5KHdlYWtPZmZzZXQpLldlYWtGaWVsZHMoKS5zZXQobnVtLCBtLkludGVyZmFjZSgpKQogCQl9LAotCQltdXRhYmxlOiBmdW5jKHAgcG9pbnRlcikgcHJlZi5WYWx1ZSB7CisJCW11dGFibGU6IGZ1bmMocCBwb2ludGVyKSBwcm90b3JlZmxlY3QuVmFsdWUgewogCQkJbGF6eUluaXQoKQogCQkJZnMgOj0gcC5BcHBseSh3ZWFrT2Zmc2V0KS5XZWFrRmllbGRzKCkKIAkJCW0sIG9rIDo9IGZzLmdldChudW0pCkBAIC0zOTgsMjAgKzM5OCwyMCBAQAogCQkJCW0gPSBtZXNzYWdlVHlwZS5OZXcoKS5JbnRlcmZhY2UoKQogCQkJCWZzLnNldChudW0sIG0pCiAJCQl9Ci0JCQlyZXR1cm4gcHJlZi5WYWx1ZU9mTWVzc2FnZShtLlByb3RvUmVmbGVjdCgpKQorCQkJcmV0dXJuIHByb3RvcmVmbGVjdC5WYWx1ZU9mTWVzc2FnZShtLlByb3RvUmVmbGVjdCgpKQogCQl9LAotCQluZXdNZXNzYWdlOiBmdW5jKCkgcHJlZi5NZXNzYWdlIHsKKwkJbmV3TWVzc2FnZTogZnVuYygpIHByb3RvcmVmbGVjdC5NZXNzYWdlIHsKIAkJCWxhenlJbml0KCkKIAkJCXJldHVybiBtZXNzYWdlVHlwZS5OZXcoKQogCQl9LAotCQluZXdGaWVsZDogZnVuYygpIHByZWYuVmFsdWUgeworCQluZXdGaWVsZDogZnVuYygpIHByb3RvcmVmbGVjdC5WYWx1ZSB7CiAJCQlsYXp5SW5pdCgpCi0JCQlyZXR1cm4gcHJlZi5WYWx1ZU9mTWVzc2FnZShtZXNzYWdlVHlwZS5OZXcoKSkKKwkJCXJldHVybiBwcm90b3JlZmxlY3QuVmFsdWVPZk1lc3NhZ2UobWVzc2FnZVR5cGUuTmV3KCkpCiAJCX0sCiAJfQogfQogCi1mdW5jIGZpZWxkSW5mb0Zvck1lc3NhZ2UoZmQgcHJlZi5GaWVsZERlc2NyaXB0b3IsIGZzIHJlZmxlY3QuU3RydWN0RmllbGQsIHggZXhwb3J0ZXIpIGZpZWxkSW5mbyB7CitmdW5jIGZpZWxkSW5mb0Zvck1lc3NhZ2UoZmQgcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvciwgZnMgcmVmbGVjdC5TdHJ1Y3RGaWVsZCwgeCBleHBvcnRlcikgZmllbGRJbmZvIHsKIAlmdCA6PSBmcy5UeXBlCiAJY29udiA6PSBOZXdDb252ZXJ0ZXIoZnQsIGZkKQogCkBAIC00MzMsNDcgKzQzMyw0NyBAQAogCQkJcnYgOj0gcC5BcHBseShmaWVsZE9mZnNldCkuQXNWYWx1ZU9mKGZzLlR5cGUpLkVsZW0oKQogCQkJcnYuU2V0KHJlZmxlY3QuWmVybyhydi5UeXBlKCkpKQogCQl9LAotCQlnZXQ6IGZ1bmMocCBwb2ludGVyKSBwcmVmLlZhbHVlIHsKKwkJZ2V0OiBmdW5jKHAgcG9pbnRlcikgcHJvdG9yZWZsZWN0LlZhbHVlIHsKIAkJCWlmIHAuSXNOaWwoKSB7CiAJCQkJcmV0dXJuIGNvbnYuWmVybygpCiAJCQl9CiAJCQlydiA6PSBwLkFwcGx5KGZpZWxkT2Zmc2V0KS5Bc1ZhbHVlT2YoZnMuVHlwZSkuRWxlbSgpCiAJCQlyZXR1cm4gY29udi5QQlZhbHVlT2YocnYpCiAJCX0sCi0JCXNldDogZnVuYyhwIHBvaW50ZXIsIHYgcHJlZi5WYWx1ZSkgeworCQlzZXQ6IGZ1bmMocCBwb2ludGVyLCB2IHByb3RvcmVmbGVjdC5WYWx1ZSkgewogCQkJcnYgOj0gcC5BcHBseShmaWVsZE9mZnNldCkuQXNWYWx1ZU9mKGZzLlR5cGUpLkVsZW0oKQogCQkJcnYuU2V0KGNvbnYuR29WYWx1ZU9mKHYpKQogCQkJaWYgZnMuVHlwZS5LaW5kKCkgPT0gcmVmbGVjdC5QdHIgJiYgcnYuSXNOaWwoKSB7CiAJCQkJcGFuaWMoZm10LlNwcmludGYoImZpZWxkICV2IGhhcyBpbnZhbGlkIG5pbCBwb2ludGVyIiwgZmQuRnVsbE5hbWUoKSkpCiAJCQl9CiAJCX0sCi0JCW11dGFibGU6IGZ1bmMocCBwb2ludGVyKSBwcmVmLlZhbHVlIHsKKwkJbXV0YWJsZTogZnVuYyhwIHBvaW50ZXIpIHByb3RvcmVmbGVjdC5WYWx1ZSB7CiAJCQlydiA6PSBwLkFwcGx5KGZpZWxkT2Zmc2V0KS5Bc1ZhbHVlT2YoZnMuVHlwZSkuRWxlbSgpCiAJCQlpZiBmcy5UeXBlLktpbmQoKSA9PSByZWZsZWN0LlB0ciAmJiBydi5Jc05pbCgpIHsKIAkJCQlydi5TZXQoY29udi5Hb1ZhbHVlT2YoY29udi5OZXcoKSkpCiAJCQl9CiAJCQlyZXR1cm4gY29udi5QQlZhbHVlT2YocnYpCiAJCX0sCi0JCW5ld01lc3NhZ2U6IGZ1bmMoKSBwcmVmLk1lc3NhZ2UgeworCQluZXdNZXNzYWdlOiBmdW5jKCkgcHJvdG9yZWZsZWN0Lk1lc3NhZ2UgewogCQkJcmV0dXJuIGNvbnYuTmV3KCkuTWVzc2FnZSgpCiAJCX0sCi0JCW5ld0ZpZWxkOiBmdW5jKCkgcHJlZi5WYWx1ZSB7CisJCW5ld0ZpZWxkOiBmdW5jKCkgcHJvdG9yZWZsZWN0LlZhbHVlIHsKIAkJCXJldHVybiBjb252Lk5ldygpCiAJCX0sCiAJfQogfQogCiB0eXBlIG9uZW9mSW5mbyBzdHJ1Y3QgewotCW9uZW9mRGVzYyBwcmVmLk9uZW9mRGVzY3JpcHRvcgotCXdoaWNoICAgICBmdW5jKHBvaW50ZXIpIHByZWYuRmllbGROdW1iZXIKKwlvbmVvZkRlc2MgcHJvdG9yZWZsZWN0Lk9uZW9mRGVzY3JpcHRvcgorCXdoaWNoICAgICBmdW5jKHBvaW50ZXIpIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlcgogfQogCi1mdW5jIG1ha2VPbmVvZkluZm8ob2QgcHJlZi5PbmVvZkRlc2NyaXB0b3IsIHNpIHN0cnVjdEluZm8sIHggZXhwb3J0ZXIpICpvbmVvZkluZm8geworZnVuYyBtYWtlT25lb2ZJbmZvKG9kIHByb3RvcmVmbGVjdC5PbmVvZkRlc2NyaXB0b3IsIHNpIHN0cnVjdEluZm8sIHggZXhwb3J0ZXIpICpvbmVvZkluZm8gewogCW9pIDo9ICZvbmVvZkluZm97b25lb2ZEZXNjOiBvZH0KIAlpZiBvZC5Jc1N5bnRoZXRpYygpIHsKIAkJZnMgOj0gc2kuZmllbGRzQnlOdW1iZXJbb2QuRmllbGRzKCkuR2V0KDApLk51bWJlcigpXQogCQlmaWVsZE9mZnNldCA6PSBvZmZzZXRPZihmcywgeCkKLQkJb2kud2hpY2ggPSBmdW5jKHAgcG9pbnRlcikgcHJlZi5GaWVsZE51bWJlciB7CisJCW9pLndoaWNoID0gZnVuYyhwIHBvaW50ZXIpIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciB7CiAJCQlpZiBwLklzTmlsKCkgewogCQkJCXJldHVybiAwCiAJCQl9CkBAIC00ODYsNyArNDg2LDcgQEAKIAl9IGVsc2UgewogCQlmcyA6PSBzaS5vbmVvZnNCeU5hbWVbb2QuTmFtZSgpXQogCQlmaWVsZE9mZnNldCA6PSBvZmZzZXRPZihmcywgeCkKLQkJb2kud2hpY2ggPSBmdW5jKHAgcG9pbnRlcikgcHJlZi5GaWVsZE51bWJlciB7CisJCW9pLndoaWNoID0gZnVuYyhwIHBvaW50ZXIpIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciB7CiAJCQlpZiBwLklzTmlsKCkgewogCQkJCXJldHVybiAwCiAJCQl9CkBAIC01MzgsNiArNTM4LDYgQEAKIAkJfQogCQlyZXR1cm4gdHJ1ZQogCWRlZmF1bHQ6Ci0JCXBhbmljKCZyZWZsZWN0LlZhbHVlRXJyb3J7InJlZmxlY3QuVmFsdWUuSXNaZXJvIiwgdi5LaW5kKCl9KQorCQlwYW5pYygmcmVmbGVjdC5WYWx1ZUVycm9ye01ldGhvZDogInJlZmxlY3QuVmFsdWUuSXNaZXJvIiwgS2luZDogdi5LaW5kKCl9KQogCX0KIH0KZGlmZiAtLWdpdCBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL3BvaW50ZXJfcmVmbGVjdC5nbyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL3BvaW50ZXJfcmVmbGVjdC5nbwppbmRleCA5ZTNlZDgyLi41MTdlOTQ0IDEwMDY0NAotLS0gYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9wb2ludGVyX3JlZmxlY3QuZ28KKysrIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvcG9pbnRlcl9yZWZsZWN0LmdvCkBAIC0yLDYgKzIsNyBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUKIC8vIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAorLy9nbzpidWlsZCBwdXJlZ28gfHwgYXBwZW5naW5lCiAvLyArYnVpbGQgcHVyZWdvIGFwcGVuZ2luZQogCiBwYWNrYWdlIGltcGwKQEAgLTE1OCw2ICsxNTksNDIgQEAKIAlwLnYuRWxlbSgpLlNldCh2LnYpCiB9CiAKK2Z1bmMgZ3Jvd1NsaWNlKHAgcG9pbnRlciwgYWRkQ2FwIGludCkgeworCS8vIFRPRE86IE9uY2Ugd2Ugb25seSBzdXBwb3J0IEdvIDEuMjAgYW5kIG5ld2VyLCB1c2UgcmVmbGVjdC5Hcm93LgorCWluIDo9IHAudi5FbGVtKCkKKwlvdXQgOj0gcmVmbGVjdC5NYWtlU2xpY2UoaW4uVHlwZSgpLCBpbi5MZW4oKSwgaW4uTGVuKCkrYWRkQ2FwKQorCXJlZmxlY3QuQ29weShvdXQsIGluKQorCXAudi5FbGVtKCkuU2V0KG91dCkKK30KKworZnVuYyAocCBwb2ludGVyKSBncm93Qm9vbFNsaWNlKGFkZENhcCBpbnQpIHsKKwlncm93U2xpY2UocCwgYWRkQ2FwKQorfQorCitmdW5jIChwIHBvaW50ZXIpIGdyb3dJbnQzMlNsaWNlKGFkZENhcCBpbnQpIHsKKwlncm93U2xpY2UocCwgYWRkQ2FwKQorfQorCitmdW5jIChwIHBvaW50ZXIpIGdyb3dVaW50MzJTbGljZShhZGRDYXAgaW50KSB7CisJZ3Jvd1NsaWNlKHAsIGFkZENhcCkKK30KKworZnVuYyAocCBwb2ludGVyKSBncm93SW50NjRTbGljZShhZGRDYXAgaW50KSB7CisJZ3Jvd1NsaWNlKHAsIGFkZENhcCkKK30KKworZnVuYyAocCBwb2ludGVyKSBncm93VWludDY0U2xpY2UoYWRkQ2FwIGludCkgeworCWdyb3dTbGljZShwLCBhZGRDYXApCit9CisKK2Z1bmMgKHAgcG9pbnRlcikgZ3Jvd0Zsb2F0NjRTbGljZShhZGRDYXAgaW50KSB7CisJZ3Jvd1NsaWNlKHAsIGFkZENhcCkKK30KKworZnVuYyAocCBwb2ludGVyKSBncm93RmxvYXQzMlNsaWNlKGFkZENhcCBpbnQpIHsKKwlncm93U2xpY2UocCwgYWRkQ2FwKQorfQorCiBmdW5jIChFeHBvcnQpIE1lc3NhZ2VTdGF0ZU9mKHAgUG9pbnRlcikgKm1lc3NhZ2VTdGF0ZSAgICAgeyBwYW5pYygibm90IHN1cHBvcnRlZCIpIH0KIGZ1bmMgKG1zICptZXNzYWdlU3RhdGUpIHBvaW50ZXIoKSBwb2ludGVyICAgICAgICAgICAgICAgICB7IHBhbmljKCJub3Qgc3VwcG9ydGVkIikgfQogZnVuYyAobXMgKm1lc3NhZ2VTdGF0ZSkgbWVzc2FnZUluZm8oKSAqTWVzc2FnZUluZm8gICAgICAgIHsgcGFuaWMoIm5vdCBzdXBwb3J0ZWQiKSB9CmRpZmYgLS1naXQgYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC9wb2ludGVyX3Vuc2FmZS5nbyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL3BvaW50ZXJfdW5zYWZlLmdvCmluZGV4IDllY2YyM2EuLjRiMDIwZTMgMTAwNjQ0Ci0tLSBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL3BvaW50ZXJfdW5zYWZlLmdvCisrKyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL3BvaW50ZXJfdW5zYWZlLmdvCkBAIC0yLDYgKzIsNyBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUKIC8vIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAorLy9nbzpidWlsZCAhcHVyZWdvICYmICFhcHBlbmdpbmUKIC8vICtidWlsZCAhcHVyZWdvLCFhcHBlbmdpbmUKIAogcGFja2FnZSBpbXBsCkBAIC0xMzcsNiArMTM4LDQ2IEBACiAJKigqdW5zYWZlLlBvaW50ZXIpKHAucCkgPSAodW5zYWZlLlBvaW50ZXIpKHYucCkKIH0KIAorZnVuYyAocCBwb2ludGVyKSBncm93Qm9vbFNsaWNlKGFkZENhcCBpbnQpIHsKKwlzcCA6PSBwLkJvb2xTbGljZSgpCisJcyA6PSBtYWtlKFtdYm9vbCwgMCwgYWRkQ2FwK2xlbigqc3ApKQorCXMgPSBzWzpsZW4oKnNwKV0KKwljb3B5KHMsICpzcCkKKwkqc3AgPSBzCit9CisKK2Z1bmMgKHAgcG9pbnRlcikgZ3Jvd0ludDMyU2xpY2UoYWRkQ2FwIGludCkgeworCXNwIDo9IHAuSW50MzJTbGljZSgpCisJcyA6PSBtYWtlKFtdaW50MzIsIDAsIGFkZENhcCtsZW4oKnNwKSkKKwlzID0gc1s6bGVuKCpzcCldCisJY29weShzLCAqc3ApCisJKnNwID0gcworfQorCitmdW5jIChwIHBvaW50ZXIpIGdyb3dVaW50MzJTbGljZShhZGRDYXAgaW50KSB7CisJcC5ncm93SW50MzJTbGljZShhZGRDYXApCit9CisKK2Z1bmMgKHAgcG9pbnRlcikgZ3Jvd0Zsb2F0MzJTbGljZShhZGRDYXAgaW50KSB7CisJcC5ncm93SW50MzJTbGljZShhZGRDYXApCit9CisKK2Z1bmMgKHAgcG9pbnRlcikgZ3Jvd0ludDY0U2xpY2UoYWRkQ2FwIGludCkgeworCXNwIDo9IHAuSW50NjRTbGljZSgpCisJcyA6PSBtYWtlKFtdaW50NjQsIDAsIGFkZENhcCtsZW4oKnNwKSkKKwlzID0gc1s6bGVuKCpzcCldCisJY29weShzLCAqc3ApCisJKnNwID0gcworfQorCitmdW5jIChwIHBvaW50ZXIpIGdyb3dVaW50NjRTbGljZShhZGRDYXAgaW50KSB7CisJcC5ncm93SW50NjRTbGljZShhZGRDYXApCit9CisKK2Z1bmMgKHAgcG9pbnRlcikgZ3Jvd0Zsb2F0NjRTbGljZShhZGRDYXAgaW50KSB7CisJcC5ncm93SW50NjRTbGljZShhZGRDYXApCit9CisKIC8vIFN0YXRpYyBjaGVjayB0aGF0IE1lc3NhZ2VTdGF0ZSBkb2VzIG5vdCBleGNlZWQgdGhlIHNpemUgb2YgYSBwb2ludGVyLgogY29uc3QgXyA9IHVpbnQodW5zYWZlLlNpemVvZih1bnNhZmUuUG9pbnRlcihuaWwpKSAtIHVuc2FmZS5TaXplb2YoTWVzc2FnZVN0YXRle30pKQogCmRpZmYgLS1naXQgYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC92YWxpZGF0ZS5nbyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL3ZhbGlkYXRlLmdvCmluZGV4IDA4Y2ZiNjAuLmEyNGU2YmIgMTAwNjQ0Ci0tLSBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL3ZhbGlkYXRlLmdvCisrKyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL3ZhbGlkYXRlLmdvCkBAIC0xNiw5ICsxNiw5IEBACiAJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ZsYWdzIgogCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9nZW5pZCIKIAkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvc3RycyIKLQlwcmVmICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9yZWZsZWN0L3Byb3RvcmVmbGVjdCIKLQlwcmVnICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9yZWZsZWN0L3Byb3RvcmVnaXN0cnkiCi0JcGlmYWNlICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9ydW50aW1lL3Byb3RvaWZhY2UiCisJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgorCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9yZWZsZWN0L3Byb3RvcmVnaXN0cnkiCisJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3J1bnRpbWUvcHJvdG9pZmFjZSIKICkKIAogLy8gVmFsaWRhdGlvblN0YXR1cyBpcyB0aGUgcmVzdWx0IG9mIHZhbGlkYXRpbmcgdGhlIHdpcmUtZm9ybWF0IGVuY29kaW5nIG9mIGEgbWVzc2FnZS4KQEAgLTU2LDIwICs1NiwyMCBAQAogLy8gb2YgdGhlIG1lc3NhZ2UgdHlwZS4KIC8vCiAvLyBUaGlzIGZ1bmN0aW9uIGlzIGV4cG9zZWQgZm9yIHRlc3RpbmcuCi1mdW5jIFZhbGlkYXRlKG10IHByZWYuTWVzc2FnZVR5cGUsIGluIHBpZmFjZS5Vbm1hcnNoYWxJbnB1dCkgKG91dCBwaWZhY2UuVW5tYXJzaGFsT3V0cHV0LCBfIFZhbGlkYXRpb25TdGF0dXMpIHsKK2Z1bmMgVmFsaWRhdGUobXQgcHJvdG9yZWZsZWN0Lk1lc3NhZ2VUeXBlLCBpbiBwcm90b2lmYWNlLlVubWFyc2hhbElucHV0KSAob3V0IHByb3RvaWZhY2UuVW5tYXJzaGFsT3V0cHV0LCBfIFZhbGlkYXRpb25TdGF0dXMpIHsKIAltaSwgb2sgOj0gbXQuKCpNZXNzYWdlSW5mbykKIAlpZiAhb2sgewogCQlyZXR1cm4gb3V0LCBWYWxpZGF0aW9uVW5rbm93bgogCX0KIAlpZiBpbi5SZXNvbHZlciA9PSBuaWwgewotCQlpbi5SZXNvbHZlciA9IHByZWcuR2xvYmFsVHlwZXMKKwkJaW4uUmVzb2x2ZXIgPSBwcm90b3JlZ2lzdHJ5Lkdsb2JhbFR5cGVzCiAJfQogCW8sIHN0IDo9IG1pLnZhbGlkYXRlKGluLkJ1ZiwgMCwgdW5tYXJzaGFsT3B0aW9uc3sKIAkJZmxhZ3M6ICAgIGluLkZsYWdzLAogCQlyZXNvbHZlcjogaW4uUmVzb2x2ZXIsCiAJfSkKIAlpZiBvLmluaXRpYWxpemVkIHsKLQkJb3V0LkZsYWdzIHw9IHBpZmFjZS5Vbm1hcnNoYWxJbml0aWFsaXplZAorCQlvdXQuRmxhZ3MgfD0gcHJvdG9pZmFjZS5Vbm1hcnNoYWxJbml0aWFsaXplZAogCX0KIAlyZXR1cm4gb3V0LCBzdAogfQpAQCAtMTA2LDIyICsxMDYsMjIgQEAKIAl2YWxpZGF0aW9uVHlwZU1lc3NhZ2VTZXRJdGVtCiApCiAKLWZ1bmMgbmV3RmllbGRWYWxpZGF0aW9uSW5mbyhtaSAqTWVzc2FnZUluZm8sIHNpIHN0cnVjdEluZm8sIGZkIHByZWYuRmllbGREZXNjcmlwdG9yLCBmdCByZWZsZWN0LlR5cGUpIHZhbGlkYXRpb25JbmZvIHsKK2Z1bmMgbmV3RmllbGRWYWxpZGF0aW9uSW5mbyhtaSAqTWVzc2FnZUluZm8sIHNpIHN0cnVjdEluZm8sIGZkIHByb3RvcmVmbGVjdC5GaWVsZERlc2NyaXB0b3IsIGZ0IHJlZmxlY3QuVHlwZSkgdmFsaWRhdGlvbkluZm8gewogCXZhciB2aSB2YWxpZGF0aW9uSW5mbwogCXN3aXRjaCB7CiAJY2FzZSBmZC5Db250YWluaW5nT25lb2YoKSAhPSBuaWwgJiYgIWZkLkNvbnRhaW5pbmdPbmVvZigpLklzU3ludGhldGljKCk6CiAJCXN3aXRjaCBmZC5LaW5kKCkgewotCQljYXNlIHByZWYuTWVzc2FnZUtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0Lk1lc3NhZ2VLaW5kOgogCQkJdmkudHlwID0gdmFsaWRhdGlvblR5cGVNZXNzYWdlCiAJCQlpZiBvdCwgb2sgOj0gc2kub25lb2ZXcmFwcGVyc0J5TnVtYmVyW2ZkLk51bWJlcigpXTsgb2sgewogCQkJCXZpLm1pID0gZ2V0TWVzc2FnZUluZm8ob3QuRmllbGQoMCkuVHlwZSkKIAkJCX0KLQkJY2FzZSBwcmVmLkdyb3VwS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuR3JvdXBLaW5kOgogCQkJdmkudHlwID0gdmFsaWRhdGlvblR5cGVHcm91cAogCQkJaWYgb3QsIG9rIDo9IHNpLm9uZW9mV3JhcHBlcnNCeU51bWJlcltmZC5OdW1iZXIoKV07IG9rIHsKIAkJCQl2aS5taSA9IGdldE1lc3NhZ2VJbmZvKG90LkZpZWxkKDApLlR5cGUpCiAJCQl9Ci0JCWNhc2UgcHJlZi5TdHJpbmdLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5TdHJpbmdLaW5kOgogCQkJaWYgc3Rycy5FbmZvcmNlVVRGOChmZCkgewogCQkJCXZpLnR5cCA9IHZhbGlkYXRpb25UeXBlVVRGOFN0cmluZwogCQkJfQpAQCAtMTI5LDcgKzEyOSw3IEBACiAJZGVmYXVsdDoKIAkJdmkgPSBuZXdWYWxpZGF0aW9uSW5mbyhmZCwgZnQpCiAJfQotCWlmIGZkLkNhcmRpbmFsaXR5KCkgPT0gcHJlZi5SZXF1aXJlZCB7CisJaWYgZmQuQ2FyZGluYWxpdHkoKSA9PSBwcm90b3JlZmxlY3QuUmVxdWlyZWQgewogCQkvLyBBdm9pZCBvdmVyZmxvdy4gVGhlIHJlcXVpcmVkIGZpZWxkIGNoZWNrIGlzIGRvbmUgd2l0aCBhIDY0LWJpdCBtYXNrLCB3aXRoCiAJCS8vIGFueSBtZXNzYWdlIGNvbnRhaW5pbmcgbW9yZSB0aGFuIDY0IHJlcXVpcmVkIGZpZWxkcyBhbHdheXMgcmVwb3J0ZWQgYXMKIAkJLy8gcG90ZW50aWFsbHkgdW5pbml0aWFsaXplZCwgc28gaXQgaXMgbm90IGltcG9ydGFudCB0byBnZXQgYSBwcmVjaXNlIGNvdW50CkBAIC0xNDIsMjIgKzE0MiwyMiBAQAogCXJldHVybiB2aQogfQogCi1mdW5jIG5ld1ZhbGlkYXRpb25JbmZvKGZkIHByZWYuRmllbGREZXNjcmlwdG9yLCBmdCByZWZsZWN0LlR5cGUpIHZhbGlkYXRpb25JbmZvIHsKK2Z1bmMgbmV3VmFsaWRhdGlvbkluZm8oZmQgcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvciwgZnQgcmVmbGVjdC5UeXBlKSB2YWxpZGF0aW9uSW5mbyB7CiAJdmFyIHZpIHZhbGlkYXRpb25JbmZvCiAJc3dpdGNoIHsKIAljYXNlIGZkLklzTGlzdCgpOgogCQlzd2l0Y2ggZmQuS2luZCgpIHsKLQkJY2FzZSBwcmVmLk1lc3NhZ2VLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5NZXNzYWdlS2luZDoKIAkJCXZpLnR5cCA9IHZhbGlkYXRpb25UeXBlTWVzc2FnZQogCQkJaWYgZnQuS2luZCgpID09IHJlZmxlY3QuU2xpY2UgewogCQkJCXZpLm1pID0gZ2V0TWVzc2FnZUluZm8oZnQuRWxlbSgpKQogCQkJfQotCQljYXNlIHByZWYuR3JvdXBLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5Hcm91cEtpbmQ6CiAJCQl2aS50eXAgPSB2YWxpZGF0aW9uVHlwZUdyb3VwCiAJCQlpZiBmdC5LaW5kKCkgPT0gcmVmbGVjdC5TbGljZSB7CiAJCQkJdmkubWkgPSBnZXRNZXNzYWdlSW5mbyhmdC5FbGVtKCkpCiAJCQl9Ci0JCWNhc2UgcHJlZi5TdHJpbmdLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5TdHJpbmdLaW5kOgogCQkJdmkudHlwID0gdmFsaWRhdGlvblR5cGVCeXRlcwogCQkJaWYgc3Rycy5FbmZvcmNlVVRGOChmZCkgewogCQkJCXZpLnR5cCA9IHZhbGlkYXRpb25UeXBlVVRGOFN0cmluZwpAQCAtMTc1LDMzICsxNzUsMzMgQEAKIAljYXNlIGZkLklzTWFwKCk6CiAJCXZpLnR5cCA9IHZhbGlkYXRpb25UeXBlTWFwCiAJCXN3aXRjaCBmZC5NYXBLZXkoKS5LaW5kKCkgewotCQljYXNlIHByZWYuU3RyaW5nS2luZDoKKwkJY2FzZSBwcm90b3JlZmxlY3QuU3RyaW5nS2luZDoKIAkJCWlmIHN0cnMuRW5mb3JjZVVURjgoZmQpIHsKIAkJCQl2aS5rZXlUeXBlID0gdmFsaWRhdGlvblR5cGVVVEY4U3RyaW5nCiAJCQl9CiAJCX0KIAkJc3dpdGNoIGZkLk1hcFZhbHVlKCkuS2luZCgpIHsKLQkJY2FzZSBwcmVmLk1lc3NhZ2VLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5NZXNzYWdlS2luZDoKIAkJCXZpLnZhbFR5cGUgPSB2YWxpZGF0aW9uVHlwZU1lc3NhZ2UKIAkJCWlmIGZ0LktpbmQoKSA9PSByZWZsZWN0Lk1hcCB7CiAJCQkJdmkubWkgPSBnZXRNZXNzYWdlSW5mbyhmdC5FbGVtKCkpCiAJCQl9Ci0JCWNhc2UgcHJlZi5TdHJpbmdLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5TdHJpbmdLaW5kOgogCQkJaWYgc3Rycy5FbmZvcmNlVVRGOChmZCkgewogCQkJCXZpLnZhbFR5cGUgPSB2YWxpZGF0aW9uVHlwZVVURjhTdHJpbmcKIAkJCX0KIAkJfQogCWRlZmF1bHQ6CiAJCXN3aXRjaCBmZC5LaW5kKCkgewotCQljYXNlIHByZWYuTWVzc2FnZUtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0Lk1lc3NhZ2VLaW5kOgogCQkJdmkudHlwID0gdmFsaWRhdGlvblR5cGVNZXNzYWdlCiAJCQlpZiAhZmQuSXNXZWFrKCkgewogCQkJCXZpLm1pID0gZ2V0TWVzc2FnZUluZm8oZnQpCiAJCQl9Ci0JCWNhc2UgcHJlZi5Hcm91cEtpbmQ6CisJCWNhc2UgcHJvdG9yZWZsZWN0Lkdyb3VwS2luZDoKIAkJCXZpLnR5cCA9IHZhbGlkYXRpb25UeXBlR3JvdXAKIAkJCXZpLm1pID0gZ2V0TWVzc2FnZUluZm8oZnQpCi0JCWNhc2UgcHJlZi5TdHJpbmdLaW5kOgorCQljYXNlIHByb3RvcmVmbGVjdC5TdHJpbmdLaW5kOgogCQkJdmkudHlwID0gdmFsaWRhdGlvblR5cGVCeXRlcwogCQkJaWYgc3Rycy5FbmZvcmNlVVRGOChmZCkgewogCQkJCXZpLnR5cCA9IHZhbGlkYXRpb25UeXBlVVRGOFN0cmluZwpAQCAtMzE0LDExICszMTQsMTEgQEAKIAkJCQkJCQlicmVhawogCQkJCQkJfQogCQkJCQkJbWVzc2FnZU5hbWUgOj0gZmQuTWVzc2FnZSgpLkZ1bGxOYW1lKCkKLQkJCQkJCW1lc3NhZ2VUeXBlLCBlcnIgOj0gcHJlZy5HbG9iYWxUeXBlcy5GaW5kTWVzc2FnZUJ5TmFtZShtZXNzYWdlTmFtZSkKKwkJCQkJCW1lc3NhZ2VUeXBlLCBlcnIgOj0gcHJvdG9yZWdpc3RyeS5HbG9iYWxUeXBlcy5GaW5kTWVzc2FnZUJ5TmFtZShtZXNzYWdlTmFtZSkKIAkJCQkJCXN3aXRjaCBlcnIgewogCQkJCQkJY2FzZSBuaWw6CiAJCQkJCQkJdmkubWksIF8gPSBtZXNzYWdlVHlwZS4oKk1lc3NhZ2VJbmZvKQotCQkJCQkJY2FzZSBwcmVnLk5vdEZvdW5kOgorCQkJCQkJY2FzZSBwcm90b3JlZ2lzdHJ5Lk5vdEZvdW5kOgogCQkJCQkJCXZpLnR5cCA9IHZhbGlkYXRpb25UeXBlQnl0ZXMKIAkJCQkJCWRlZmF1bHQ6CiAJCQkJCQkJcmV0dXJuIG91dCwgVmFsaWRhdGlvblVua25vd24KQEAgLTMzNSw3ICszMzUsNyBAQAogCQkJCS8vIHVubWFyc2hhbGluZyB0byBiZWdpbiBmYWlsaW5nLiBTdXBwb3J0aW5nIHRoaXMgcmVxdWlyZXMgc29tZSB3YXkgdG8KIAkJCQkvLyBkZXRlcm1pbmUgaWYgdGhlIHJlc29sdmVyIGlzIGZyb3plbi4KIAkJCQl4dCwgZXJyIDo9IG9wdHMucmVzb2x2ZXIuRmluZEV4dGVuc2lvbkJ5TnVtYmVyKHN0Lm1pLkRlc2MuRnVsbE5hbWUoKSwgbnVtKQotCQkJCWlmIGVyciAhPSBuaWwgJiYgZXJyICE9IHByZWcuTm90Rm91bmQgeworCQkJCWlmIGVyciAhPSBuaWwgJiYgZXJyICE9IHByb3RvcmVnaXN0cnkuTm90Rm91bmQgewogCQkJCQlyZXR1cm4gb3V0LCBWYWxpZGF0aW9uVW5rbm93bgogCQkJCX0KIAkJCQlpZiBlcnIgPT0gbmlsIHsKQEAgLTUxMyw3ICs1MTMsNyBAQAogCQkJCQl9CiAJCQkJCXh0LCBlcnIgOj0gb3B0cy5yZXNvbHZlci5GaW5kRXh0ZW5zaW9uQnlOdW1iZXIoc3QubWkuRGVzYy5GdWxsTmFtZSgpLCB0eXBlaWQpCiAJCQkJCXN3aXRjaCB7Ci0JCQkJCWNhc2UgZXJyID09IHByZWcuTm90Rm91bmQ6CisJCQkJCWNhc2UgZXJyID09IHByb3RvcmVnaXN0cnkuTm90Rm91bmQ6CiAJCQkJCQliID0gYltuOl0KIAkJCQkJY2FzZSBlcnIgIT0gbmlsOgogCQkJCQkJcmV0dXJuIG91dCwgVmFsaWRhdGlvblVua25vd24KZGlmZiAtLWdpdCBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL3dlYWsuZ28gYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvaW1wbC93ZWFrLmdvCmluZGV4IDAwOWNiZWYuLmViNzlhN2IgMTAwNjQ0Ci0tLSBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9pbXBsL3dlYWsuZ28KKysrIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL2ltcGwvd2Vhay5nbwpAQCAtNyw3ICs3LDcgQEAKIGltcG9ydCAoCiAJImZtdCIKIAotCXByZWYgImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgorCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9yZWZsZWN0L3Byb3RvcmVmbGVjdCIKIAkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZ2lzdHJ5IgogKQogCkBAIC0xNywzMiArMTcsMzIgQEAKIC8vIGRlZmluZWQgZGlyZWN0bHkgb24gaXQuCiB0eXBlIHdlYWtGaWVsZHMgV2Vha0ZpZWxkcwogCi1mdW5jICh3IHdlYWtGaWVsZHMpIGdldChudW0gcHJlZi5GaWVsZE51bWJlcikgKHByZWYuUHJvdG9NZXNzYWdlLCBib29sKSB7CitmdW5jICh3IHdlYWtGaWVsZHMpIGdldChudW0gcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyKSAocHJvdG9yZWZsZWN0LlByb3RvTWVzc2FnZSwgYm9vbCkgewogCW0sIG9rIDo9IHdbaW50MzIobnVtKV0KIAlyZXR1cm4gbSwgb2sKIH0KIAotZnVuYyAodyAqd2Vha0ZpZWxkcykgc2V0KG51bSBwcmVmLkZpZWxkTnVtYmVyLCBtIHByZWYuUHJvdG9NZXNzYWdlKSB7CitmdW5jICh3ICp3ZWFrRmllbGRzKSBzZXQobnVtIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciwgbSBwcm90b3JlZmxlY3QuUHJvdG9NZXNzYWdlKSB7CiAJaWYgKncgPT0gbmlsIHsKIAkJKncgPSBtYWtlKHdlYWtGaWVsZHMpCiAJfQogCSgqdylbaW50MzIobnVtKV0gPSBtCiB9CiAKLWZ1bmMgKHcgKndlYWtGaWVsZHMpIGNsZWFyKG51bSBwcmVmLkZpZWxkTnVtYmVyKSB7CitmdW5jICh3ICp3ZWFrRmllbGRzKSBjbGVhcihudW0gcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyKSB7CiAJZGVsZXRlKCp3LCBpbnQzMihudW0pKQogfQogCi1mdW5jIChFeHBvcnQpIEhhc1dlYWsodyBXZWFrRmllbGRzLCBudW0gcHJlZi5GaWVsZE51bWJlcikgYm9vbCB7CitmdW5jIChFeHBvcnQpIEhhc1dlYWsodyBXZWFrRmllbGRzLCBudW0gcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyKSBib29sIHsKIAlfLCBvayA6PSB3W2ludDMyKG51bSldCiAJcmV0dXJuIG9rCiB9CiAKLWZ1bmMgKEV4cG9ydCkgQ2xlYXJXZWFrKHcgKldlYWtGaWVsZHMsIG51bSBwcmVmLkZpZWxkTnVtYmVyKSB7CitmdW5jIChFeHBvcnQpIENsZWFyV2Vhayh3ICpXZWFrRmllbGRzLCBudW0gcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyKSB7CiAJZGVsZXRlKCp3LCBpbnQzMihudW0pKQogfQogCi1mdW5jIChFeHBvcnQpIEdldFdlYWsodyBXZWFrRmllbGRzLCBudW0gcHJlZi5GaWVsZE51bWJlciwgbmFtZSBwcmVmLkZ1bGxOYW1lKSBwcmVmLlByb3RvTWVzc2FnZSB7CitmdW5jIChFeHBvcnQpIEdldFdlYWsodyBXZWFrRmllbGRzLCBudW0gcHJvdG9yZWZsZWN0LkZpZWxkTnVtYmVyLCBuYW1lIHByb3RvcmVmbGVjdC5GdWxsTmFtZSkgcHJvdG9yZWZsZWN0LlByb3RvTWVzc2FnZSB7CiAJaWYgbSwgb2sgOj0gd1tpbnQzMihudW0pXTsgb2sgewogCQlyZXR1cm4gbQogCX0KQEAgLTUzLDcgKzUzLDcgQEAKIAlyZXR1cm4gbXQuWmVybygpLkludGVyZmFjZSgpCiB9CiAKLWZ1bmMgKEV4cG9ydCkgU2V0V2Vhayh3ICpXZWFrRmllbGRzLCBudW0gcHJlZi5GaWVsZE51bWJlciwgbmFtZSBwcmVmLkZ1bGxOYW1lLCBtIHByZWYuUHJvdG9NZXNzYWdlKSB7CitmdW5jIChFeHBvcnQpIFNldFdlYWsodyAqV2Vha0ZpZWxkcywgbnVtIHByb3RvcmVmbGVjdC5GaWVsZE51bWJlciwgbmFtZSBwcm90b3JlZmxlY3QuRnVsbE5hbWUsIG0gcHJvdG9yZWZsZWN0LlByb3RvTWVzc2FnZSkgewogCWlmIG0gIT0gbmlsIHsKIAkJbXQsIF8gOj0gcHJvdG9yZWdpc3RyeS5HbG9iYWxUeXBlcy5GaW5kTWVzc2FnZUJ5TmFtZShuYW1lKQogCQlpZiBtdCA9PSBuaWwgewpkaWZmIC0tZ2l0IGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL29yZGVyL29yZGVyLmdvIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL29yZGVyL29yZGVyLmdvCmluZGV4IDJhMjQ5NTMuLmRlYTUyMmUgMTAwNjQ0Ci0tLSBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9vcmRlci9vcmRlci5nbworKysgYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvb3JkZXIvb3JkZXIuZ28KQEAgLTUsMTIgKzUsMTIgQEAKIHBhY2thZ2Ugb3JkZXIKIAogaW1wb3J0ICgKLQlwcmVmICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9yZWZsZWN0L3Byb3RvcmVmbGVjdCIKKwkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZmxlY3QiCiApCiAKIC8vIEZpZWxkT3JkZXIgc3BlY2lmaWVzIHRoZSBvcmRlcmluZyB0byB2aXNpdCBtZXNzYWdlIGZpZWxkcy4KIC8vIEl0IGlzIGEgZnVuY3Rpb24gdGhhdCByZXBvcnRzIHdoZXRoZXIgeCBpcyBvcmRlcmVkIGJlZm9yZSB5LgotdHlwZSBGaWVsZE9yZGVyIGZ1bmMoeCwgeSBwcmVmLkZpZWxkRGVzY3JpcHRvcikgYm9vbAordHlwZSBGaWVsZE9yZGVyIGZ1bmMoeCwgeSBwcm90b3JlZmxlY3QuRmllbGREZXNjcmlwdG9yKSBib29sCiAKIHZhciAoCiAJLy8gQW55RmllbGRPcmRlciBzcGVjaWZpZXMgbm8gc3BlY2lmaWMgZmllbGQgb3JkZXJpbmcuCkBAIC0xOCw5ICsxOCw5IEBACiAKIAkvLyBMZWdhY3lGaWVsZE9yZGVyIHNvcnRzIGZpZWxkcyBpbiB0aGUgc2FtZSBvcmRlcmluZyBhcyBlbWl0dGVkIGJ5CiAJLy8gd2lyZSBzZXJpYWxpemF0aW9uIGluIHRoZSBnaXRodWIuY29tL2dvbGFuZy9wcm90b2J1ZiBpbXBsZW1lbnRhdGlvbi4KLQlMZWdhY3lGaWVsZE9yZGVyIEZpZWxkT3JkZXIgPSBmdW5jKHgsIHkgcHJlZi5GaWVsZERlc2NyaXB0b3IpIGJvb2wgeworCUxlZ2FjeUZpZWxkT3JkZXIgRmllbGRPcmRlciA9IGZ1bmMoeCwgeSBwcm90b3JlZmxlY3QuRmllbGREZXNjcmlwdG9yKSBib29sIHsKIAkJb3gsIG95IDo9IHguQ29udGFpbmluZ09uZW9mKCksIHkuQ29udGFpbmluZ09uZW9mKCkKLQkJaW5PbmVvZiA6PSBmdW5jKG9kIHByZWYuT25lb2ZEZXNjcmlwdG9yKSBib29sIHsKKwkJaW5PbmVvZiA6PSBmdW5jKG9kIHByb3RvcmVmbGVjdC5PbmVvZkRlc2NyaXB0b3IpIGJvb2wgewogCQkJcmV0dXJuIG9kICE9IG5pbCAmJiAhb2QuSXNTeW50aGV0aWMoKQogCQl9CiAKQEAgLTMzLDcgKzMzLDcgQEAKIAkJCXJldHVybiAhaW5PbmVvZihveCkgJiYgaW5PbmVvZihveSkKIAkJfQogCQkvLyBGaWVsZHMgaW4gZGlzam9pbnQgb25lb2Ygc2V0cyBhcmUgc29ydGVkIGJ5IGRlY2xhcmF0aW9uIGluZGV4LgotCQlpZiBveCAhPSBuaWwgJiYgb3kgIT0gbmlsICYmIG94ICE9IG95IHsKKwkJaWYgaW5PbmVvZihveCkgJiYgaW5PbmVvZihveSkgJiYgb3ggIT0gb3kgewogCQkJcmV0dXJuIG94LkluZGV4KCkgPCBveS5JbmRleCgpCiAJCX0KIAkJLy8gRmllbGRzIHNvcnRlZCBieSBmaWVsZCBudW1iZXIuCkBAIC00MSwxNCArNDEsMTQgQEAKIAl9CiAKIAkvLyBOdW1iZXJGaWVsZE9yZGVyIHNvcnRzIGZpZWxkcyBieSB0aGVpciBmaWVsZCBudW1iZXIuCi0JTnVtYmVyRmllbGRPcmRlciBGaWVsZE9yZGVyID0gZnVuYyh4LCB5IHByZWYuRmllbGREZXNjcmlwdG9yKSBib29sIHsKKwlOdW1iZXJGaWVsZE9yZGVyIEZpZWxkT3JkZXIgPSBmdW5jKHgsIHkgcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvcikgYm9vbCB7CiAJCXJldHVybiB4Lk51bWJlcigpIDwgeS5OdW1iZXIoKQogCX0KIAogCS8vIEluZGV4TmFtZUZpZWxkT3JkZXIgc29ydHMgbm9uLWV4dGVuc2lvbiBmaWVsZHMgYmVmb3JlIGV4dGVuc2lvbiBmaWVsZHMuCiAJLy8gTm9uLWV4dGVuc2lvbnMgYXJlIHNvcnRlZCBhY2NvcmRpbmcgdG8gdGhlaXIgZGVjbGFyYXRpb24gaW5kZXguCiAJLy8gRXh0ZW5zaW9ucyBhcmUgc29ydGVkIGFjY29yZGluZyB0byB0aGVpciBmdWxsIG5hbWUuCi0JSW5kZXhOYW1lRmllbGRPcmRlciBGaWVsZE9yZGVyID0gZnVuYyh4LCB5IHByZWYuRmllbGREZXNjcmlwdG9yKSBib29sIHsKKwlJbmRleE5hbWVGaWVsZE9yZGVyIEZpZWxkT3JkZXIgPSBmdW5jKHgsIHkgcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvcikgYm9vbCB7CiAJCS8vIE5vbi1leHRlbnNpb24gZmllbGRzIHNvcnQgYmVmb3JlIGV4dGVuc2lvbiBmaWVsZHMuCiAJCWlmIHguSXNFeHRlbnNpb24oKSAhPSB5LklzRXh0ZW5zaW9uKCkgewogCQkJcmV0dXJuICF4LklzRXh0ZW5zaW9uKCkgJiYgeS5Jc0V4dGVuc2lvbigpCkBAIC02NCw3ICs2NCw3IEBACiAKIC8vIEtleU9yZGVyIHNwZWNpZmllcyB0aGUgb3JkZXJpbmcgdG8gdmlzaXQgbWFwIGVudHJpZXMuCiAvLyBJdCBpcyBhIGZ1bmN0aW9uIHRoYXQgcmVwb3J0cyB3aGV0aGVyIHggaXMgb3JkZXJlZCBiZWZvcmUgeS4KLXR5cGUgS2V5T3JkZXIgZnVuYyh4LCB5IHByZWYuTWFwS2V5KSBib29sCit0eXBlIEtleU9yZGVyIGZ1bmMoeCwgeSBwcm90b3JlZmxlY3QuTWFwS2V5KSBib29sCiAKIHZhciAoCiAJLy8gQW55S2V5T3JkZXIgc3BlY2lmaWVzIG5vIHNwZWNpZmljIGtleSBvcmRlcmluZy4KQEAgLTcyLDcgKzcyLDcgQEAKIAogCS8vIEdlbmVyaWNLZXlPcmRlciBzb3J0cyBmYWxzZSBiZWZvcmUgdHJ1ZSwgbnVtZXJpYyBrZXlzIGluIGFzY2VuZGluZyBvcmRlciwKIAkvLyBhbmQgc3RyaW5ncyBpbiBsZXhpY29ncmFwaGljYWwgb3JkZXJpbmcgYWNjb3JkaW5nIHRvIFVURi04IGNvZGVwb2ludHMuCi0JR2VuZXJpY0tleU9yZGVyIEtleU9yZGVyID0gZnVuYyh4LCB5IHByZWYuTWFwS2V5KSBib29sIHsKKwlHZW5lcmljS2V5T3JkZXIgS2V5T3JkZXIgPSBmdW5jKHgsIHkgcHJvdG9yZWZsZWN0Lk1hcEtleSkgYm9vbCB7CiAJCXN3aXRjaCB4LkludGVyZmFjZSgpLih0eXBlKSB7CiAJCWNhc2UgYm9vbDoKIAkJCXJldHVybiAheC5Cb29sKCkgJiYgeS5Cb29sKCkKZGlmZiAtLWdpdCBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9vcmRlci9yYW5nZS5nbyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9vcmRlci9yYW5nZS5nbwppbmRleCBjODA5MGUwLi4xNjY1YTY4IDEwMDY0NAotLS0gYS92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvb3JkZXIvcmFuZ2UuZ28KKysrIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL29yZGVyL3JhbmdlLmdvCkBAIC05LDEyICs5LDEyIEBACiAJInNvcnQiCiAJInN5bmMiCiAKLQlwcmVmICJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9yZWZsZWN0L3Byb3RvcmVmbGVjdCIKKwkiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZmxlY3QiCiApCiAKIHR5cGUgbWVzc2FnZUZpZWxkIHN0cnVjdCB7Ci0JZmQgcHJlZi5GaWVsZERlc2NyaXB0b3IKLQl2ICBwcmVmLlZhbHVlCisJZmQgcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvcgorCXYgIHByb3RvcmVmbGVjdC5WYWx1ZQogfQogCiB2YXIgbWVzc2FnZUZpZWxkUG9vbCA9IHN5bmMuUG9vbHsKQEAgLTI1LDggKzI1LDggQEAKIAkvLyBGaWVsZFJuZ2VyIGlzIGFuIGludGVyZmFjZSBmb3IgdmlzaXRpbmcgYWxsIGZpZWxkcyBpbiBhIG1lc3NhZ2UuCiAJLy8gVGhlIHByb3RvcmVmbGVjdC5NZXNzYWdlIHR5cGUgaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZS4KIAlGaWVsZFJhbmdlciBpbnRlcmZhY2V7IFJhbmdlKFZpc2l0RmllbGQpIH0KLQkvLyBWaXNpdEZpZWxkIGlzIGNhbGxlZCBldmVyeXRpbWUgYSBtZXNzYWdlIGZpZWxkIGlzIHZpc2l0ZWQuCi0JVmlzaXRGaWVsZCA9IGZ1bmMocHJlZi5GaWVsZERlc2NyaXB0b3IsIHByZWYuVmFsdWUpIGJvb2wKKwkvLyBWaXNpdEZpZWxkIGlzIGNhbGxlZCBldmVyeSB0aW1lIGEgbWVzc2FnZSBmaWVsZCBpcyB2aXNpdGVkLgorCVZpc2l0RmllbGQgPSBmdW5jKHByb3RvcmVmbGVjdC5GaWVsZERlc2NyaXB0b3IsIHByb3RvcmVmbGVjdC5WYWx1ZSkgYm9vbAogKQogCiAvLyBSYW5nZUZpZWxkcyBpdGVyYXRlcyBvdmVyIHRoZSBmaWVsZHMgb2YgZnMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgb3JkZXIuCkBAIC00Nyw3ICs0Nyw3IEBACiAJfSgpCiAKIAkvLyBDb2xsZWN0IGFsbCBmaWVsZHMgaW4gdGhlIG1lc3NhZ2UgYW5kIHNvcnQgdGhlbS4KLQlmcy5SYW5nZShmdW5jKGZkIHByZWYuRmllbGREZXNjcmlwdG9yLCB2IHByZWYuVmFsdWUpIGJvb2wgeworCWZzLlJhbmdlKGZ1bmMoZmQgcHJvdG9yZWZsZWN0LkZpZWxkRGVzY3JpcHRvciwgdiBwcm90b3JlZmxlY3QuVmFsdWUpIGJvb2wgewogCQlmaWVsZHMgPSBhcHBlbmQoZmllbGRzLCBtZXNzYWdlRmllbGR7ZmQsIHZ9KQogCQlyZXR1cm4gdHJ1ZQogCX0pCkBAIC02NCw4ICs2NCw4IEBACiB9CiAKIHR5cGUgbWFwRW50cnkgc3RydWN0IHsKLQlrIHByZWYuTWFwS2V5Ci0JdiBwcmVmLlZhbHVlCisJayBwcm90b3JlZmxlY3QuTWFwS2V5CisJdiBwcm90b3JlZmxlY3QuVmFsdWUKIH0KIAogdmFyIG1hcEVudHJ5UG9vbCA9IHN5bmMuUG9vbHsKQEAgLTc2LDggKzc2LDggQEAKIAkvLyBFbnRyeVJhbmdlciBpcyBhbiBpbnRlcmZhY2UgZm9yIHZpc2l0aW5nIGFsbCBmaWVsZHMgaW4gYSBtZXNzYWdlLgogCS8vIFRoZSBwcm90b3JlZmxlY3QuTWFwIHR5cGUgaW1wbGVtZW50cyB0aGlzIGludGVyZmFjZS4KIAlFbnRyeVJhbmdlciBpbnRlcmZhY2V7IFJhbmdlKFZpc2l0RW50cnkpIH0KLQkvLyBWaXNpdEVudHJ5IGlzIGNhbGxlZCBldmVyeXRpbWUgYSBtYXAgZW50cnkgaXMgdmlzaXRlZC4KLQlWaXNpdEVudHJ5ID0gZnVuYyhwcmVmLk1hcEtleSwgcHJlZi5WYWx1ZSkgYm9vbAorCS8vIFZpc2l0RW50cnkgaXMgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBtYXAgZW50cnkgaXMgdmlzaXRlZC4KKwlWaXNpdEVudHJ5ID0gZnVuYyhwcm90b3JlZmxlY3QuTWFwS2V5LCBwcm90b3JlZmxlY3QuVmFsdWUpIGJvb2wKICkKIAogLy8gUmFuZ2VFbnRyaWVzIGl0ZXJhdGVzIG92ZXIgdGhlIGVudHJpZXMgb2YgZXMgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgb3JkZXIuCkBAIC05OCw3ICs5OCw3IEBACiAJfSgpCiAKIAkvLyBDb2xsZWN0IGFsbCBlbnRyaWVzIGluIHRoZSBtYXAgYW5kIHNvcnQgdGhlbS4KLQllcy5SYW5nZShmdW5jKGsgcHJlZi5NYXBLZXksIHYgcHJlZi5WYWx1ZSkgYm9vbCB7CisJZXMuUmFuZ2UoZnVuYyhrIHByb3RvcmVmbGVjdC5NYXBLZXksIHYgcHJvdG9yZWZsZWN0LlZhbHVlKSBib29sIHsKIAkJZW50cmllcyA9IGFwcGVuZChlbnRyaWVzLCBtYXBFbnRyeXtrLCB2fSkKIAkJcmV0dXJuIHRydWUKIAl9KQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL3N0cnMvc3RyaW5ncy5nbyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9zdHJzL3N0cmluZ3MuZ28KaW5kZXggMGI3NGU3Ni4uYTZlN2RmMiAxMDA2NDQKLS0tIGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL3N0cnMvc3RyaW5ncy5nbworKysgYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvc3Rycy9zdHJpbmdzLmdvCkBAIC0xNyw3ICsxNyw3IEBACiAKIC8vIEVuZm9yY2VVVEY4IHJlcG9ydHMgd2hldGhlciB0byBlbmZvcmNlIHN0cmljdCBVVEYtOCB2YWxpZGF0aW9uLgogZnVuYyBFbmZvcmNlVVRGOChmZCBwcm90b3JlZmxlY3QuRmllbGREZXNjcmlwdG9yKSBib29sIHsKLQlpZiBmbGFncy5Qcm90b0xlZ2FjeSB7CisJaWYgZmxhZ3MuUHJvdG9MZWdhY3kgfHwgZmQuU3ludGF4KCkgPT0gcHJvdG9yZWZsZWN0LkVkaXRpb25zIHsKIAkJaWYgZmQsIG9rIDo9IGZkLihpbnRlcmZhY2V7IEVuZm9yY2VVVEY4KCkgYm9vbCB9KTsgb2sgewogCQkJcmV0dXJuIGZkLkVuZm9yY2VVVEY4KCkKIAkJfQpkaWZmIC0tZ2l0IGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL3N0cnMvc3RyaW5nc19wdXJlLmdvIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL3N0cnMvc3RyaW5nc19wdXJlLmdvCmluZGV4IDg1ZTA3NGMuLmExZjZmMzMgMTAwNjQ0Ci0tLSBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9zdHJzL3N0cmluZ3NfcHVyZS5nbworKysgYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvc3Rycy9zdHJpbmdzX3B1cmUuZ28KQEAgLTIsNiArMiw3IEBACiAvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZQogLy8gbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgogCisvL2dvOmJ1aWxkIHB1cmVnbyB8fCBhcHBlbmdpbmUKIC8vICtidWlsZCBwdXJlZ28gYXBwZW5naW5lCiAKIHBhY2thZ2Ugc3RycwpkaWZmIC0tZ2l0IGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL3N0cnMvc3RyaW5nc191bnNhZmUuZ28gYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvc3Rycy9zdHJpbmdzX3Vuc2FmZV9nbzEyMC5nbwpzaW1pbGFyaXR5IGluZGV4IDg2JQpyZW5hbWUgZnJvbSB2ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvc3Rycy9zdHJpbmdzX3Vuc2FmZS5nbwpyZW5hbWUgdG8gdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL3N0cnMvc3RyaW5nc191bnNhZmVfZ28xMjAuZ28KaW5kZXggMjE2MGM3MC4uYTAwOGFjZCAxMDA2NDQKLS0tIGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL3N0cnMvc3RyaW5nc191bnNhZmUuZ28KKysrIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL3N0cnMvc3RyaW5nc191bnNhZmVfZ28xMjAuZ28KQEAgLTIsMTQgKzIsMTUgQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlCiAvLyBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLS8vICtidWlsZCAhcHVyZWdvLCFhcHBlbmdpbmUKKy8vZ286YnVpbGQgIXB1cmVnbyAmJiAhYXBwZW5naW5lICYmICFnbzEuMjEKKy8vICtidWlsZCAhcHVyZWdvLCFhcHBlbmdpbmUsIWdvMS4yMQogCiBwYWNrYWdlIHN0cnMKIAogaW1wb3J0ICgKIAkidW5zYWZlIgogCi0JcHJlZiAiZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvcmVmbGVjdC9wcm90b3JlZmxlY3QiCisJImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgogKQogCiB0eXBlICgKQEAgLTU4LDcgKzU5LDcgQEAKIAogLy8gQXBwZW5kRnVsbE5hbWUgaXMgZXF1aXZhbGVudCB0byBwcm90b3JlZmxlY3QuRnVsbE5hbWUuQXBwZW5kLAogLy8gYnV0IG9wdGltaXplZCBmb3IgbGFyZ2UgYmF0Y2hlcyB3aGVyZSBlYWNoIG5hbWUgaGFzIGEgc2hhcmVkIGxpZmV0aW1lLgotZnVuYyAoc2IgKkJ1aWxkZXIpIEFwcGVuZEZ1bGxOYW1lKHByZWZpeCBwcmVmLkZ1bGxOYW1lLCBuYW1lIHByZWYuTmFtZSkgcHJlZi5GdWxsTmFtZSB7CitmdW5jIChzYiAqQnVpbGRlcikgQXBwZW5kRnVsbE5hbWUocHJlZml4IHByb3RvcmVmbGVjdC5GdWxsTmFtZSwgbmFtZSBwcm90b3JlZmxlY3QuTmFtZSkgcHJvdG9yZWZsZWN0LkZ1bGxOYW1lIHsKIAluIDo9IGxlbihwcmVmaXgpICsgbGVuKCIuIikgKyBsZW4obmFtZSkKIAlpZiBsZW4ocHJlZml4KSA9PSAwIHsKIAkJbiAtPSBsZW4oIi4iKQpAQCAtNjcsNyArNjgsNyBAQAogCXNiLmJ1ZiA9IGFwcGVuZChzYi5idWYsIHByZWZpeC4uLikKIAlzYi5idWYgPSBhcHBlbmQoc2IuYnVmLCAnLicpCiAJc2IuYnVmID0gYXBwZW5kKHNiLmJ1ZiwgbmFtZS4uLikKLQlyZXR1cm4gcHJlZi5GdWxsTmFtZShzYi5sYXN0KG4pKQorCXJldHVybiBwcm90b3JlZmxlY3QuRnVsbE5hbWUoc2IubGFzdChuKSkKIH0KIAogLy8gTWFrZVN0cmluZyBpcyBlcXVpdmFsZW50IHRvIHN0cmluZyhiKSwgYnV0IG9wdGltaXplZCBmb3IgbGFyZ2UgYmF0Y2hlcwpAQCAtODYsNyArODcsNyBAQAogCS8vIFVubGlrZSBzdHJpbmdzLkJ1aWxkZXIsIHdlIGRvIG5vdCBuZWVkIHRvIGNvcHkgb3ZlciB0aGUgY29udGVudHMKIAkvLyBvZiB0aGUgb2xkIGJ1ZmZlciBzaW5jZSBvdXIgYnVpbGRlciBwcm92aWRlcyBubyBBUEkgZm9yCiAJLy8gcmV0cmlldmluZyBwcmV2aW91c2x5IGNyZWF0ZWQgc3RyaW5ncy4KLQlzYi5idWYgPSBtYWtlKFtdYnl0ZSwgMiooY2FwKHNiLmJ1ZikrbikpCisJc2IuYnVmID0gbWFrZShbXWJ5dGUsIDAsIDIqKGNhcChzYi5idWYpK24pKQogfQogCiBmdW5jIChzYiAqQnVpbGRlcikgbGFzdChuIGludCkgc3RyaW5nIHsKZGlmZiAtLWdpdCBhL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9zdHJzL3N0cmluZ3NfdW5zYWZlLmdvIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL3N0cnMvc3RyaW5nc191bnNhZmVfZ28xMjEuZ28Kc2ltaWxhcml0eSBpbmRleCA2OSUKY29weSBmcm9tIHZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC9zdHJzL3N0cmluZ3NfdW5zYWZlLmdvCmNvcHkgdG8gdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL3N0cnMvc3RyaW5nc191bnNhZmVfZ28xMjEuZ28KaW5kZXggMjE2MGM3MC4uNjAxNjZmMiAxMDA2NDQKLS0tIGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL3N0cnMvc3RyaW5nc191bnNhZmUuZ28KKysrIGIvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL3N0cnMvc3RyaW5nc191bnNhZmVfZ28xMjEuZ28KQEAgLTIsMjYgKzIsMTUgQEAKIC8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlCiAvLyBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCiAKLS8vICtidWlsZCAhcHVyZWdvLCFhcHBlbmdpbmUKKy8vZ286YnVpbGQgIXB1cmVnbyAmJiAhYXBwZW5naW5lICYmIGdvMS4yMQorLy8gK2J1aWxkICFwdXJlZ28sIWFwcGVuZ2luZSxnbzEuMjEKIAogcGFja2FnZSBzdHJzCiAKIGltcG9ydCAoCiAJInVuc2FmZSIKIAotCXByZWYgImdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL3JlZmxlY3QvcHJvdG9yZWZsZWN0IgotKQotCi10eXBlICgKLQlzdHJpbmdIZWFkZXIgc3RydWN0IHsKLQkJRGF0YSB1bnNhZmUuUG9pbnRlcgotCQlMZW4gIGludAotCX0KLQlzbGljZUhlYWRlciBzdHJ1Y3QgewotCQlEYXRhIHVuc2FmZS5Qb2ludGVyCi0JCUxlbiAgaW50Ci0JCUNhcCAgaW50Ci0JfQorCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9yZWZsZWN0L3Byb3RvcmVmbGVjdCIKICkKIAogLy8gVW5zYWZlU3RyaW5nIHJldHVybnMgYW4gdW5zYWZlIHN0cmluZyByZWZlcmVuY2Ugb2YgYi4KQEAgLTI5LDI1ICsxOCwxNiBAQAogLy8KIC8vIFdBUk5JTkc6IFVzZSBjYXJlZnVsbHkuIFRoZSByZXR1cm5lZCByZXN1bHQgbXVzdCBub3QgbGVhayB0byB0aGUgZW5kIHVzZXIKIC8vIHVubGVzcyB0aGUgaW5wdXQgc2xpY2UgaXMgcHJvdmFibHkgaW1tdXRhYmxlLgotZnVuYyBVbnNhZmVTdHJpbmcoYiBbXWJ5dGUpIChzIHN0cmluZykgewotCXNyYyA6PSAoKnNsaWNlSGVhZGVyKSh1bnNhZmUuUG9pbnRlcigmYikpCi0JZHN0IDo9ICgqc3RyaW5nSGVhZGVyKSh1bnNhZmUuUG9pbnRlcigmcykpCi0JZHN0LkRhdGEgPSBzcmMuRGF0YQotCWRzdC5MZW4gPSBzcmMuTGVuCi0JcmV0dXJuIHMKK2Z1bmMgVW5zYWZlU3RyaW5nKGIgW11ieXRlKSBzdHJpbmcgeworCXJldHVybiB1bnNhZmUuU3RyaW5nKHVuc2FmZS5TbGljZURhdGEoYiksIGxlbihiKSkKIH0KIAogLy8gVW5zYWZlQnl0ZXMgcmV0dXJucyBhbiB1bnNhZmUgYnl0ZXMgc2xpY2UgcmVmZXJlbmNlIG9mIHMuCiAvLyBUaGUgY2FsbGVyIG11c3QgdHJlYXQgcmV0dXJuZWQgc2xpY2UgYXMgaW1tdXRhYmxlLgogLy8KIC8vIFdBUk5JTkc6IFVzZSBjYXJlZnVsbHkuIFRoZSByZXR1cm5lZCByZXN1bHQgbXVzdCBub3QgbGVhayB0byB0aGUgZW5kIHVzZXIuCi1mdW5jIFVuc2FmZUJ5dGVzKHMgc3RyaW5nKSAoYiBbXWJ5dGUpIHsKLQlzcmMgOj0gKCpzdHJpbmdIZWFkZXIpKHVuc2FmZS5Qb2ludGVyKCZzKSkKLQlkc3QgOj0gKCpzbGljZUhlYWRlcikodW5zYWZlLlBvaW50ZXIoJmIpKQotCWRzdC5EYXRhID0gc3JjLkRhdGEKLQlkc3QuTGVuID0gc3JjLkxlbgotCWRzdC5DYXAgPSBzcmMuTGVuCi0JcmV0dXJuIGIKK2Z1bmMgVW5zYWZlQnl0ZXMocyBzdHJpbmcpIFtdYnl0ZSB7CisJcmV0dXJuIHVuc2FmZS5TbGljZSh1bnNhZmUuU3RyaW5nRGF0YShzKSwgbGVuKHMpKQogfQogCiAvLyBCdWlsZGVyIGJ1aWxkcyBhIHNldCBvZiBzdHJpbmdzIHdpdGggc2hhcmVkIGxpZmV0aW1lLgpAQCAtNTgsNyArMzgsNyBAQAogCiAvLyBBcHBlbmRGdWxsTmFtZSBpcyBlcXVpdmFsZW50IHRvIHByb3RvcmVmbGVjdC5GdWxsTmFtZS5BcHBlbmQsCiAvLyBidXQgb3B0aW1pemVkIGZvciBsYXJnZSBiYXRjaGVzIHdoZXJlIGVhY2ggbmFtZSBoYXMgYSBzaGFyZWQgbGlmZXRpbWUuCi1mdW5jIChzYiAqQnVpbGRlcikgQXBwZW5kRnVsbE5hbWUocHJlZml4IHByZWYuRnVsbE5hbWUsIG5hbWUgcHJlZi5OYW1lKSBwcmVmLkZ1bGxOYW1lIHsKK2Z1bmMgKHNiICpCdWlsZGVyKSBBcHBlbmRGdWxsTmFtZShwcmVmaXggcHJvdG9yZWZsZWN0LkZ1bGxOYW1lLCBuYW1lIHByb3RvcmVmbGVjdC5OYW1lKSBwcm90b3JlZmxlY3QuRnVsbE5hbWUgewogCW4gOj0gbGVuKHByZWZpeCkgKyBsZW4oIi4iKSArIGxlbihuYW1lKQogCWlmIGxlbihwcmVmaXgpID09IDAgewogCQluIC09IGxlbigiLiIpCkBAIC02Nyw3ICs0Nyw3IEBACiAJc2IuYnVmID0gYXBwZW5kKHNiLmJ1ZiwgcHJlZml4Li4uKQogCXNiLmJ1ZiA9IGFwcGVuZChzYi5idWYsICcuJykKIAlzYi5idWYgPSBhcHBlbmQoc2IuYnVmLCBuYW1lLi4uKQotCXJldHVybiBwcmVmLkZ1bGxOYW1lKHNiLmxhc3QobikpCisJcmV0dXJuIHByb3RvcmVmbGVjdC5GdWxsTmFtZShzYi5sYXN0KG4pKQogfQogCiAvLyBNYWtlU3RyaW5nIGlzIGVxdWl2YWxlbnQgdG8gc3RyaW5nKGIpLCBidXQgb3B0aW1pemVkIGZvciBsYXJnZSBiYXRjaGVzCkBAIC04Niw3ICs2Niw3IEBACiAJLy8gVW5saWtlIHN0cmluZ3MuQnVpbGRlciwgd2UgZG8gbm90IG5lZWQgdG8gY29weSBvdmVyIHRoZSBjb250ZW50cwogCS8vIG9mIHRoZSBvbGQgYnVmZmVyIHNpbmNlIG91ciBidWlsZGVyIHByb3ZpZGVzIG5vIEFQSSBmb3IKIAkvLyByZXRyaWV2aW5nIHByZXZpb3VzbHkgY3JlYXRlZCBzdHJpbmdzLgotCXNiLmJ1ZiA9IG1ha2UoW11ieXRlLCAyKihjYXAoc2IuYnVmKStuKSkKKwlzYi5idWYgPSBtYWtlKFtdYnl0ZSwgMCwgMiooY2FwKHNiLmJ1ZikrbikpCiB9CiAKIGZ1bmMgKHNiICpCdWlsZGVyKSBsYXN0KG4gaW50KSBzdHJpbmcgewpkaWZmIC0tZ2l0IGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL3ZlcnNpb24vdmVyc2lvbi5nbyBiL3ZlbmRvci9nb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9pbnRlcm5hbC92ZXJzaW9uL3ZlcnNpb24uZ28KaW5kZXggMTRlNzc0Zi4uYTUwZmNmYiAxMDA2NDQKLS0tIGEvdmVuZG9yL2dvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmL2ludGVybmFsL3ZlcnNpb24vdmVyc2lvbi5nbworKysgYi92ZW5kb3IvZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYvaW50ZXJuYWwvdmVyc2lvbi92ZXJzaW9uLmdvCkBAIC0xMiw1NCArMTIsNTQgQEAKIAogLy8gVGhlc2UgY29uc3RhbnRzIGRldGVybWluZSB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoaXMgbW9kdWxlLgogLy8KLS8vCiAvLyBGb3Igb3VyIHJlbGVhc2UgcHJvY2Vzcywgd2UgZW5mb3JjZSB0aGUgZm9sbG93aW5nIHJ1bGVzOgotLy8JKiBUYWdnZWQgcmVsZWFzZXMgdXNlIGEgdGFnIHRoYXQgaXMgaWRlbnRpY2FsIHRvIFN0cmluZy4KLS8vCSogVGFnZ2VkIHJlbGVhc2VzIG5ldmVyIHJlZmVyZW5jZSBhIGNvbW1pdCB3aGVyZSB0aGUgU3RyaW5nCi0vLwljb250YWlucyAiZGV2ZWwiLgotLy8JKiBUaGUgc2V0IG9mIGFsbCBjb21taXRzIGluIHRoaXMgcmVwb3NpdG9yeSB3aGVyZSBTdHJpbmcKLS8vCWRvZXMgbm90IGNvbnRhaW4gImRldmVsIiBtdXN0IGhhdmUgYSB1bmlxdWUgU3RyaW5nLgotLy8KKy8vICAgLSBUYWdnZWQgcmVsZWFzZXMgdXNlIGEgdGFnIHRoYXQgaXMgaWRlbnRpY2FsIHRvIFN0cmluZy4KKy8vICAgLSBUYWdnZWQgcmVsZWFzZXMgbmV2ZXIgcmVmZXJlbmNlIGEgY29tbWl0IHdoZXJlIHRoZSBTdHJpbmcKKy8vICAgICBjb250YWlucyAiZGV2ZWwiLgorLy8gICAtIFRoZSBzZXQgb2YgYWxsIGNvbW1pdHMgaW4gdGhpcyByZXBvc2l0b3J5IHdoZXJlIFN0cmluZworLy8gICAgIGRvZXMgbm90IGNvbnRhaW4gImRldmVsIiBtdXN0IGhhdmUgYSB1bmlxdWUgU3RyaW5nLgogLy8KIC8vIFN0ZXBzIGZvciB0YWdnaW5nIGEgbmV3IHJlbGVhc2U6Ci0vLwkxLiBDcmVhdGUgYSBuZXcgQ0wuCiAvLwotLy8JMi4gVXBkYXRlIE1pbm9yLCBQYXRjaCwgYW5kL29yIFByZVJlbGVhc2UgYXMgbmVjZXNzYXJ5LgotLy8JUHJlUmVsZWFzZSBtdXN0IG5vdCBjb250YWluIHRoZSBzdHJpbmcgImRldmVsIi4KKy8vICAxLiBDcmVhdGUgYSBuZXcgQ0wuCiAvLwotLy8JMy4gU2luY2UgdGhlIGxhc3QgcmVsZWFzZWQgbWlub3IgdmVyc2lvbiwgaGF2ZSB0aGVyZSBiZWVuIGFueSBjaGFuZ2VzIHRvCi0vLwlnZW5lcmF0b3IgdGhhdCByZWxpZXMgb24gbmV3IGZ1bmN0aW9uYWxpdHkgaW4gdGhlIHJ1bnRpbWU/Ci0vLwlJZiB5ZXMsIHRoZW4gaW5jcmVtZW50IFJlcXVpcmVkR2VuZXJhdGVkLgorLy8gIDIuIFVwZGF0ZSBNaW5vciwgUGF0Y2gsIGFuZC9vciBQcmVSZWxlYXNlIGFzIG5lY2Vzc2FyeS4KKy8vICAgICBQcmVSZWxlYXNlIG11c3Qgbm90IGNvbnRhaW4gdGhlIHN0cmluZyAiZGV2ZWwiLgogLy8KLS8vCTQuIFNpbmNlIHRoZSBsYXN0IHJlbGVhc2VkIG1pbm9yIHZlcnNpb24sIGhhdmUgdGhlcmUgYmVlbiBhbnkgY2hhbmdlcyB0bwotLy8JdGhlIHJ1bnRpbWUgdGhhdCByZW1vdmVzIHN1cHBvcnQgZm9yIG9sZCAucGIuZ28gc291cmNlIGNvZGU/Ci0vLwlJZiB5ZXMsIHRoZW4gaW5jcmVtZW50IFN1cHBvcnRNaW5pbXVtLgorLy8gIDMuIFNpbmNlIHRoZSBsYXN0IHJlbGVhc2VkIG1pbm9yIHZlcnNpb24sIGhhdmUgdGhlcmUgYmVlbiBhbnkgY2hhbmdlcyB0bworLy8gICAgIGdlbmVyYXRvciB0aGF0IHJlbGllcyBvbiBuZXcgZnVuY3Rpb25hbGl0eSBpbiB0aGUgcnVudGltZT8KKy8vICAgICBJZiB5ZXMsIHRoZW4gaW5jcmVtZW50IFJlcXVpcmVkR2VuZXJhdGVkLgogLy8KLS8vCTUuIFNlbmQgb3V0IHRoZSBDTCBmb3IgcmV2aWV3IGFuZCBzdWJtaXQgaXQuCi0vLwlOb3RlIHRoYXQgdGhlIG5leHQgQ0wgaW4gc3RlcCA4IG11c3QgYmUgc3VibWl0dGVkIGFmdGVyIHRoaXMgQ0wKLS8vCXdpdGhvdXQgYW55IG90aGVyIENMcyBpbi1iZXR3ZWVuLgorLy8gIDQuIFNpbmNlIHRoZSBsYXN0IHJlbGVhc2VkIG1pbm9yIHZlcnNpb24sIGhhdmUgdGhlcmUgYmVlbiBhbnkgY2hhbmdlcyB0bworLy8gICAgIHRoZSBydW50aW1lIHRoYXQgcmVtb3ZlcyBzdXBwb3J0IGZvciBvbGQgLnBiLmdvIHNvdXJjZSBjb2RlPworLy8gICAgIElmIHllcywgdGhlbiBpbmNyZW1lbnQgU3VwcG9ydE1pbmltdW0uCiAvLwotLy8JNi4gVGFnIGEgbmV3IHZlcnNpb24sIHdoZXJlIHRoZSB0YWcgaXMgaXMgdGhlIGN1cnJlbnQgU3RyaW5nLgorLy8gIDUuIFNlbmQgb3V0IHRoZSBDTCBmb3IgcmV2aWV3IGFuZCBzdWJtaXQgaXQuCisvLyAgICAgTm90ZSB0aGF0IHRoZSBuZXh0IENMIGluIHN0ZXAgOCBtdXN0IGJlIHN1Ym1pdHRlZCBhZnRlciB0aGlzIENMCisvLyAgICAgd2l0aG91dCBhbnkgb3RoZXIgQ0xzIGluLWJldHdlZW4uCiAvLwotLy8JNy4gV3JpdGUgcmVsZWFzZSBub3RlcyBmb3IgYWxsIG5vdGFibGUgY2hhbmdlcwotLy8JYmV0d2VlbiB0aGlzIHJlbGVhc2UgYW5kIHRoZSBsYXN0IHJlbGVhc2UuCisvLyAgNi4gVGFnIGEgbmV3IHZlcnNpb24sIHdoZXJlIHRoZSB0YWcgaXMgaXMgdGhlIGN1cnJlbnQgU3RyaW5nLgogLy8KLS8vCTguIENyZWF0ZSBhIG5ldyBDTC4KKy8vICA3LiBXcml0ZSByZWxlYXNlIG5vdGVzIGZvciBhbGwgbm90YWJsZSBjaGFuZ2VzCisvLyAgICAgYmV0d2VlbiB0aGlzIHJlbGVhc2UgYW5kIHRoZSBsYXN0IHJlbGVhc2UuCiAvLwotLy8JOS4gVXBkYXRlIFByZVJlbGVhc2UgdG8gaW5jbHVkZSB0aGUgc3RyaW5nICJkZXZlbCIuCi0vLwlGb3IgZXhhbXBsZTogIiIgLT4gImRldmVsIiBvciAicmMuMSIgLT4gInJjLjEuZGV2ZWwiCisvLyAgOC4gQ3JlYXRlIGEgbmV3IENMLgogLy8KLS8vCTEwLiBTZW5kIG91dCB0aGUgQ0wgZm9yIHJldmlldyBhbmQgc3VibWl0IGl0LgorLy8gIDkuIFVwZGF0ZSBQcmVSZWxlYXNlIHRvIGluY2x1ZGUgdGhlIHN0cmluZyAiZGV2ZWwiLgorLy8gICAgIEZvciBleGFtcGxlOiAiIiAtPiAiZGV2ZWwiIG9yICJyYy4xIiAtPiAicmMuMS5kZXZlbCIKKy8vCisvLyAgMTAuIFNlbmQgb3V0IHRoZSBDTCBmb3IgcmV2aWV3IGFuZCBzdWJtaXQgaXQuCiBjb25zdCAoCiAJTWFqb3IgICAgICA9IDEKLQlNaW5vciAgICAgID0gMjcKLQlQYXRjaCAgICAgID0gMQorCU1pbm9yICAgICAgPSAzMworCVBhdGNoICAgICAgPSAwCiAJUHJlUmVsZWFzZSA9ICIiCiApCiAKIC8vIFN0cmluZyBmb3JtYXRzIHRoZSB2ZXJzaW9uIHN0cmluZyBmb3IgdGhpcyBtb2R1bGUgaW4gc2VtdmVyIGZvcm1hdC4KIC8vCiAvLyBFeGFtcGxlczoKKy8vCiAvLwl2MS4yMC4xCiAvLwl2MS4yMS4wLXJjLjEKIGZ1bmMgU3RyaW5nKCkgc3RyaW5nIHsK